Files
Aislo/A00_Common/line_stack.css
T
eomsangdonandClaude Opus 5.5 d11075c7c2 feat(810-3): 원파일 가져온 식 화면 — 옵션 칸 · 추정 칸 · 소계 빈칸 · 카드 확정률 · 화면 셈 거울
- 올림 칸 accept .estx · .stc · 올림 안내 「원파일 · EST/STmate — 호표 N · 같은 공사 엑셀 HP 에 붙음」
- 줄 쌓기 위 옵션 가로 — 가져온 식 값으로 드러난 수 하나 변수(q · K · E · Cm · Q …) = 값 칸 + 꼬리표 「원파일」 · 「엑셀」(`sourceOf` · 공식 묶음 밖) · 규격 칸(원파일) · 품셈 조건 글 = 「추정」 칸(읽기만 · 기초에 안 묶음)
- 합 밖 · 비목 없는 소계 줄 = 종류 「소계」 · 비목 칸 빈칸(편집 · 산출근거 표 칸 모두)
- 원문 카드 — 「원파일 · EST 산근 D… · 행 …」 한 줄 + 원파일 확정(확정 · 표지 · 추정 · 확정률)
- 서버 — 원파일 원본에 원코드 · 규격(EST) · 문서 머리 가져온에 원코드 · 규격 · 확정 · 추정 글줄(금액 · 길 그대로)
- 화면 계산기 큰나머지 끝전 — 나머지 비교 소수 흔들림 반올림(파이썬 Decimal 과 같은 갈래 · 동부청영월 블록 1810 재료비 1 원 어긋남 고침)
- 시험 test_810_3_native_screen(EST 1,849 · STC 371 블록 화면 셈 = 서버 셈 · 옵션 칸 · 추정 칸 수 = 확정 추정 · 소계 · 카드) · 헬퍼 helper_810_3_screen.cjs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 20:55:48 +09:00

479 lines
9.4 KiB
CSS

/* 줄 쌓기 탭(804-2) — 위 옵션 · 가운데 왼쪽 편집 | 오른쪽 산출근거 · 맨 아래 합계 상자 · 색은 공통 값만
* 글꼴 = 화면이 정함(M01 · M02 · 일위대가 모달 같음 · 요구 701-2 · 부모 상속 안 받음) */
.lstk {
font-size: var(--text-body-sm);
display: flex;
flex-direction: column;
gap: var(--spacing-12);
min-width: 0;
container-type: inline-size;
}
.lstk__head {
display: flex;
flex-direction: column;
gap: var(--spacing-8);
}
.lstk__bar,
.lstk__badges,
.lstk__tools {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: var(--spacing-8);
}
.lstk__areas {
display: grid;
grid-template-columns: minmax(0, 5fr) minmax(0, 6fr);
gap: var(--spacing-12);
align-items: start;
}
.lstk:not([data-edit="1"]) .lstk__areas {
grid-template-columns: minmax(0, 1fr);
}
.lstk:not([data-edit="1"]) .lstk__left {
display: none;
}
/* 합계 상자(요구 687-3) — 스크롤해도 화면 아래 고정 */
.lstk__foot {
position: sticky;
inset-block-end: 0;
z-index: 2;
padding-block: var(--spacing-8);
background: var(--color-surface);
border-block-start: 1px solid var(--color-border);
}
.lstk__foot:empty {
display: none;
}
/* 산출근거(요구 683) — 왼쪽을 내려도 화면에 고정 · 길면 자기 스크롤(높이 = 스크롤 영역 − 합계 상자 · fit()) */
.lstk[data-edit="1"] .lstk__right {
position: sticky;
inset-block-start: 0;
max-height: var(--lstk-view, 100vh);
overflow: auto;
}
/* 탭 폭이 좁으면(1366 화면 등) 편집 위 · 산출근거 아래(고정 없음) */
@container (max-width: 1040px) {
.lstk__areas {
grid-template-columns: minmax(0, 1fr);
}
.lstk[data-edit="1"] .lstk__right {
position: static;
max-height: none;
overflow: visible;
}
}
/* ── 왼쪽 편집 ── */
.lstk-edit {
display: flex;
flex-direction: column;
gap: var(--spacing-16);
}
/* 항목(804-5) — 머리 띠(바탕 · 왼쪽 굵은 띠 · 번호) · 줄 = 들여쓰기 + 왼쪽 세로 선 · 가나다 = 한 단 더 들여씀 */
.lstk-item {
display: flex;
flex-direction: column;
gap: var(--spacing-8);
}
.lstk-item.is-sub {
margin-inline-start: var(--spacing-24);
}
.lstk-item + .lstk-item.is-sub {
margin-block-start: calc(-1 * var(--spacing-8));
}
/* 그룹 머리 한 줄(요구 687-6 · 688) — 이름 칸이 늘고 줄어 [+] · X 는 늘 오른쪽 끝(접어도 그대로) */
.lstk-ihead {
flex-wrap: nowrap;
align-items: center;
padding: var(--spacing-4) var(--spacing-8);
border-inline-start: 4px solid var(--color-accent);
border-radius: var(--radius-sm);
background: var(--color-surface-sunken);
}
.lstk-item.is-sub > .lstk-ihead {
border-inline-start-color: var(--color-border-strong);
}
.lstk-ihead > .lstk-f-l {
flex: 1 1 auto;
min-width: 4em;
}
.lstk-count {
flex: none;
white-space: nowrap;
}
.lstk-no {
flex: none;
min-width: 1.5em;
font-weight: var(--font-weight-bold);
color: var(--color-text);
}
.lstk-lines {
display: flex;
flex-direction: column;
gap: var(--spacing-4);
margin-inline-start: var(--spacing-12);
padding-inline-start: var(--spacing-12);
border-inline-start: 2px solid var(--color-border-strong);
}
.lstk-ihead,
.lstk-fhead,
.lstk-frow,
.lstk-find {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--spacing-4) var(--spacing-8);
min-width: 0;
}
.lstk-frow {
align-items: center;
}
/* 줄 카드 — 금액 · 글 = 한 줄(요구 687-7 · [손잡이][종류][이름][수량][단위][비목][X] · 좁으면 접힘) · 공식 = 머리 줄 + 식 줄 */
.lstk-line {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--spacing-4) var(--spacing-8);
padding: var(--spacing-4) var(--spacing-8);
border: 1px solid var(--color-border);
border-radius: var(--radius-sm);
background: var(--color-surface-raised);
}
/* 공식 묶음 = 폭만큼 여러 열(요구 692-3 · 자동 채움) · 머리 · 식 글 줄 · 고치는 줄 = 열 합침 · 긴 이름 = 줄임표 */
.lstk-line.k-공식 {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(100%, 19rem), 1fr));
align-items: center;
column-gap: var(--spacing-16);
position: relative;
padding-inline-start: var(--spacing-24);
}
.lstk-line.k-공식 > .lstk-fhead,
.lstk-line.k-공식 > .lstk-frow:is(.is-open, :has(> .lstk-expr)) {
grid-column: 1 / -1;
}
.lstk-line.k-공식 > .lstk-frow:not(.is-open, :has(> .lstk-expr)) {
flex-wrap: nowrap;
}
.lstk-line.k-공식 > .lstk-frow:not(.is-open) > .lstk-f-m {
width: 6em;
}
.lstk-frow > .lstk-sym {
flex: none;
max-width: 50%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.lstk-frow > .lstk-f-m,
.lstk-frow > .lstk-unit,
.lstk-rtools {
flex: none;
}
.lstk-rtools {
display: inline-flex;
gap: var(--spacing-4);
}
.lstk-frow > .lstk-tag {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.lstk-line > .lstk-x,
.lstk-fhead > .lstk-x {
margin-inline-start: auto;
}
.lstk-line > .lstk-f-l,
.lstk-line > .lstk-qty {
flex: 1 1 8em;
min-width: 6em;
}
.lstk-line > .lstk-f-m {
flex: 1 1 7em;
min-width: 6em;
width: auto;
}
.lstk-line .lstk-kind {
flex: none;
min-width: 2.5em;
}
.lstk-wide {
flex-basis: 100%;
}
/* 수량 = 식 글 칸 + 출처 꼬리표(요구 701-1) — 꼬리표는 줄어 줄임표 */
.lstk-qty {
display: flex;
align-items: center;
gap: var(--spacing-4);
}
.lstk-qty > :first-child {
flex: 1 1 6em;
min-width: 4em;
}
.lstk-qty > .lstk-tag,
.lstk-qty > .ui-btn {
flex: 0 1 auto;
min-width: 0;
max-width: 60%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.lstk-upick {
flex: none;
}
/* 보이는 글을 눌러 고침(요구 687-14) */
.lstk-tap {
cursor: text;
border-radius: var(--radius-sm);
}
.lstk-tap:hover,
.lstk-tap:focus-visible {
background: var(--color-surface-sunken);
text-decoration: underline dotted;
}
/* 끌기(804-5) — 손잡이 · 끄는 것 반투명 · 놓을 자리 = 위 · 아래 선 · 빈 항목 = 점선 */
.lstk-grip {
touch-action: none;
}
.lstk-line > .lstk-grip {
flex: none;
}
.lstk-line.k-공식 > .lstk-grip {
position: absolute;
inset-block-start: var(--spacing-8);
inset-inline-start: var(--spacing-4);
}
.lstk-edit[data-dragging] {
cursor: grabbing;
user-select: none;
}
.is-dragging {
opacity: 0.45;
}
.lstk-line[data-drop="before"],
.lstk-item[data-drop="before"] {
box-shadow: 0 -3px 0 0 var(--color-accent);
}
.lstk-line[data-drop="after"],
.lstk-item[data-drop="after"] {
box-shadow: 0 3px 0 0 var(--color-accent);
}
.lstk-item[data-drop="in"] .lstk-empty {
outline: 2px dashed var(--color-accent);
outline-offset: 2px;
}
.lstk-res {
flex: 0 1 auto;
min-width: 0;
max-width: 100%;
}
.lstk-kind {
font-size: var(--text-caption);
font-weight: var(--font-weight-medium);
color: var(--color-text-secondary);
}
.lstk-fhead[data-tpl="changed"] .lstk-kind {
color: var(--color-accent);
}
.lstk-f-s {
width: 6em;
}
.lstk-f-m {
width: 9em;
}
.lstk-f-l {
flex: 1 1 12em;
min-width: 10em;
}
.lstk-sym {
font-weight: var(--font-weight-medium);
}
.lstk-val,
.lstk-unit,
.lstk-tag,
.lstk-hint {
font-size: var(--text-body-sm);
color: var(--color-text-secondary);
}
.lstk-tag {
padding: 0 var(--spacing-4);
border: 1px solid var(--color-border);
border-radius: var(--radius-sm);
}
.lstk-empty {
font-size: var(--text-body-sm);
color: var(--color-text-muted);
}
.lstk-miss,
.lstk-tex .lstk-miss {
color: var(--color-danger);
}
/* ── 오른쪽 산출근거 ── */
.lstk-out .lstk-h {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0 var(--spacing-4);
padding-inline-start: calc(var(--lstk-depth, 0) * var(--spacing-16));
white-space: normal;
}
.lstk-out tr.head,
.lstk-out tr.item,
.lstk-out tr.total {
font-weight: var(--font-weight-medium);
}
.lstk-out tr.subsum,
.lstk-out tr.total {
background: var(--color-surface-sunken);
}
.lstk-out tr.is-sub .lstk-h {
color: var(--color-text-secondary);
}
/* 펼친 문서 제목 = 보통 글(링크 꼴 없음 · 요구 687-11) */
.lstk-out tr.subhead .lstk-h {
font-weight: var(--font-weight-medium);
color: var(--color-text);
}
.lstk-ftitle {
cursor: pointer;
}
.lstk-gap {
display: inline-block;
width: var(--spacing-24);
}
.lstk-pack {
display: inline-flex;
align-items: center;
gap: var(--spacing-4);
}
.lstk-tex .katex {
font-size: 1.05em;
}
/* 짝 강조(679 · 684) — 왼쪽 카드 · 그룹 머리 · 오른쪽 줄 = 같은 바탕 채우기 */
.lstk-line.is-pair,
.lstk-item.is-pair > .lstk-ihead,
.lstk-out tr.is-pair > td {
background: var(--color-accent-soft);
}
.lstk-out tr[data-loc] {
cursor: pointer;
}
.lstk-tpick {
display: flex;
flex-direction: column;
gap: var(--spacing-8);
}
/* 옵션 가로(옛 수식 문서 CSS 에서 옮김 · 804-6) */
.fdoc__options {
display: flex;
flex-wrap: wrap;
gap: var(--spacing-8) var(--spacing-12);
align-items: flex-end;
}
.fdoc__options > * {
width: auto;
min-width: 8em;
}
/* 가져온 식 값 · 추정 칸(810-3) — 칸 + 꼬리표 */
.lstk-src {
display: flex;
align-items: flex-end;
gap: var(--spacing-4);
}
.lstk-src > .ui-field {
width: 7em;
}
.lstk-src > [data-guess] {
width: auto;
min-width: 18em;
}
.lstk-src > [data-guess] input {
min-width: 18em;
}
.lstk-src > .ui-badge {
margin-bottom: var(--spacing-4);
}