- 단위 규칙 한 벌(common_util_line_stack_unit) — 왼쪽 값 칸 · 식 줄 · 옵션 · 오른쪽 산출근거 · 기계 제어 구역 · 기계 보기가 같이 씀 · 메타 단위(구분 따름 · 수(…) · 원문 단위 없음) 안 그림 · %(설명) = % · 10^-7 = 10⁻⁷ · 기계 칸 연결 = 기계 표 칸 단위 · 코드 값 쉼표 없음 - 비목 · 금액 줄 = 「단가 원/단위 × (수량 식) 단위 = 금액 원」 · 소계 · 합계 · 계 = 원 · 단가 · 수량 한 덩이(줄 바뀜에 단위 안 떨어짐) - 기계경비식 겹분수 → 중간 줄(상여 · 휴지 · 손료계수 · common_util_line_stack_frac) · 한 줄 분수 한 층 - 기계 제어 구역 단위 = 칸 밖 바로 뒤 · 기계 보기 오른쪽 = 박기 전 기계 칸 단위 - 휴대폰 폭(560 px 밑) 산출근거 금액 칸 넷 걷음(가로 넘침 0) · 분수 줄 위아래 여유 - 전수 1,520 표시 탓 43,218 → 0 · 기계 겹분수 2 층 넘는 줄 1,040 → 0 · 금액 · 식 · 문서 자료 불변(그리기만) - 시험 test_845_2_unit_show(차린 줄 글 전수 지킴) · shownUnit 걷음(규칙 한 벌로) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
533 lines
11 KiB
CSS
533 lines
11 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: var(--spacing-4);
|
|
padding-inline-start: calc(var(--lstk-depth, 0) * var(--spacing-16));
|
|
white-space: normal;
|
|
}
|
|
|
|
/* 845-2 휴대폰 폭 — 금액 칸 넷은 줄 글(「= 843.1 원」) · 아래 합계 상자와 같아 걷고 산출근거 칸을 다 씀(가로 넘침 없음) */
|
|
@container (max-width: 560px) {
|
|
.lstk-out th:nth-child(n + 2),
|
|
.lstk-out td:nth-child(n + 2) {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
/* 845-2 분수 줄 — 한글 분자 · 분모가 KaTeX 높이 셈보다 커서 위아래 줄에 닿음 → 위아래 여유 */
|
|
.lstk-out .lstk-h:has(.mfrac) {
|
|
padding-block: var(--spacing-8);
|
|
}
|
|
|
|
/* 값 칸 묶음 줄 — 칸 사이 간격(줄이 바뀌어도 줄 앞 빈칸 없음) */
|
|
.lstk-out tr.packs .lstk-h {
|
|
column-gap: var(--spacing-24);
|
|
}
|
|
|
|
.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-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;
|
|
}
|
|
|
|
/* 827-1 기계 창 — 왼쪽 찾기 | 오른쪽 기계 양식 */
|
|
.lstk-mwin {
|
|
display: grid;
|
|
grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
|
|
gap: var(--spacing-12);
|
|
align-items: start;
|
|
min-height: 0;
|
|
}
|
|
.lstk-mwin__list,
|
|
.lstk-mwin__form {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-8);
|
|
min-width: 0;
|
|
}
|
|
@media (max-width: 900px) {
|
|
.lstk-mwin {
|
|
grid-template-columns: minmax(0, 1fr);
|
|
}
|
|
}
|
|
|
|
/* 836-1 기계 제어 구역 — 기계 줄 아래 접는 구역(값 칸 · 조종원 인력 줄 · 잡품 재료 줄) · 줄 꼴 = 단가산출 줄과 닮음 */
|
|
.lstk-mctl {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-4);
|
|
margin-block-start: var(--spacing-4);
|
|
padding: var(--spacing-8);
|
|
border-radius: var(--radius-sm);
|
|
background: var(--color-surface-sunken);
|
|
}
|
|
|
|
.lstk-mctl > .lstk-frow {
|
|
display: grid;
|
|
grid-template-columns: minmax(3em, 6em) auto minmax(0, 15em) auto auto;
|
|
justify-content: start;
|
|
}
|
|
|
|
/* 845-2 값 칸 + 단위(칸 밖 바로 뒤) — 좁으면 칸이 줄어듦 */
|
|
.lstk-mctl > .lstk-frow > .lstk-qty {
|
|
min-width: 0;
|
|
}
|
|
|
|
.lstk-mctl .lstk-unit {
|
|
flex: none;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.lstk-mctl > .lstk-frow > .lstk-sym {
|
|
max-width: none;
|
|
}
|
|
|
|
.lstk-mctl .lstk-f-s {
|
|
width: auto;
|
|
}
|
|
|
|
.lstk-mctl .lstk-line.k-ctl > .lstk-f-s {
|
|
flex: 0 1 9em;
|
|
min-width: 6em;
|
|
}
|
|
|
|
.lstk-mctl .lstk-line.k-ctl > :last-child {
|
|
margin-inline-start: auto;
|
|
}
|