Files
Aislo/ui_template/ui_template_data_table.css
T
eomsangdonandClaude Opus 5.5 271c460641 fix(부품·테마): 위험 채움 대비 4.72 · 남은 옛 꼴 → 부품(계산 줄 · 칸 램프 · 넓은 중간 창 · 규칙 꼴 · 구역 머리 · 입력 칸 2열) (PLAN 557-2)
- 위험 채움 토큰 밝음 #e5484d → #d6363c(흰 글 3.91 → 4.72) · 어두움 5.6 · 위험 글 #c0392b 그대로
- 새 부품 계산 줄(ui_template_calc_row) — B08 수리집수면적표 b08-hydro__row · 식 칸 배치를 대신함
- 표 부품 칸 램프(ui-data-table__lamp · --only · ✓) — B08 집계표 · 거리이정표 · B09 설계내역 램프 CSS 세 벌을 걷음(표지 class 는 풍선 · 가이드용으로 남김)
- 모달 넓은 중간 창(wide + width 1100px · 1100 × 680) — B09 운반 창 손 인라인 크기를 걷음
- 값 목록 규칙 꼴(rule) — ☰ 설정 규칙 줄 ul/li 를 걷음
- 접이 구역 머리(createCollapsibleHead = 패널 머리 + 접는 제목) — B08 구조물도 「조합 연결」 제목(옛 b08-sheets__title)을 대신함
- 일반 화면 틀 좁은 폭 · 입력 칸 2열 · 끝 단추 줄 — D01 · E01 이 B02 CSS 를 빌리던 것을 끊음(가이드 장면 선택자 맞춤)
- 부품 모음 견본 · 지킴 시험 test_557_2 · 낡은 시험(198_1 · 247_1 · 251_1 · 257_1 · 276_1 · 551_1)은 부품 CSS · 새 class 로 맞춤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 10:53:34 +09:00

328 lines
9.2 KiB
CSS

/* =============================================================================
* ui_template_data_table.css — 많은 자료용 읽기 표(`ui_template_data_table.ts`)
* 색은 테마 토큰만 · 칸 배경은 불투명(고정 칸 아래로 비치지 않게)
* ========================================================================== */
.ui-data-table {
--dt-row-h: 28px;
--dt-zebra: var(--color-surface);
--dt-hover: color-mix(in srgb, var(--color-accent) 14%, var(--color-canvas));
--dt-head: color-mix(in srgb, var(--color-accent) 6%, var(--color-surface));
--dt-line: var(--color-border);
--dt-edge: color-mix(in srgb, var(--color-text-secondary) 45%, var(--color-border));
/* 들여쓰기 한 단(레벨 글자 크기와 무관 · 끌기 한 단과 같음 · 121 넓힘) */
--dt-indent: 22px;
/* 레벨 글자 크기(PLAN 228-1) — 줄 높이 28px 안 · Lv3 = 표 기본(14px) */
--dt-lv1-size: var(--text-body);
--dt-lv2-size: 15px;
--dt-lv4-size: 13px;
--dt-lv5-size: var(--text-caption);
width: fit-content; /* 표가 좁으면 틀도 표만큼 */
max-width: 100%;
max-height: calc(100dvh - 260px);
overflow: auto;
border: 1px solid var(--dt-line);
border-radius: var(--radius-lg);
background: var(--color-canvas);
outline: none;
overflow-anchor: none; /* 줄을 갈아 그릴 때 브라우저가 스크롤을 옮기지 않게 */
}
.ui-data-table:focus-visible {
box-shadow: 0 0 0 2px var(--color-focus-ring);
}
.ui-data-table__table {
/* 258-1 — 표 폭 = 열 합(--dt-w · 인라인) · 페이지 css 가 width 로 덮음 */
width: var(--dt-w);
table-layout: fixed;
border-collapse: separate;
border-spacing: 0;
color: var(--color-text-body);
font-size: var(--text-body-sm);
line-height: 1.3;
}
.ui-data-table__table caption {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip-path: inset(50%);
}
.ui-data-table__table th,
.ui-data-table__table td {
height: var(--dt-row-h);
padding: 0 var(--spacing-8);
overflow: hidden;
border-right: 1px solid var(--dt-line);
border-bottom: 1px solid var(--dt-line);
background: var(--color-canvas);
text-overflow: ellipsis;
white-space: nowrap;
white-space-collapse: preserve-spaces; /* 앞 빈칸(들여쓰기) · 겹 빈칸을 접지 않음 · 줄바꿈은 안 함 */
}
/* 칸 램프(557-2) — 칸 글 앞 점 8 · 노랑 = 없음 · 연결 = 초록 ✓(색만으로 안 가름) · --only = 글 숨김 · 점만 가운데 */
.ui-data-table__table td.ui-data-table__lamp::before {
content: "";
display: inline-block;
width: 8px;
height: 8px;
margin-right: 6px;
border-radius: 50%;
background: var(--color-warning);
vertical-align: middle;
}
.ui-data-table__table td.ui-data-table__lamp.is-linked::before {
content: "✓";
background: none;
color: var(--color-success);
font-size: 9px;
font-weight: var(--font-weight-bold);
line-height: 8px;
text-align: center;
}
.ui-data-table__table td.ui-data-table__lamp--only {
font-size: 0;
text-align: center;
}
.ui-data-table__table td.ui-data-table__lamp--only::before {
margin-right: 0;
}
/* 숫자 — 오른쪽 맞춤 · 자리 폭 같게 */
.ui-data-table__table [data-num] {
text-align: right;
font-variant-numeric: tabular-nums;
}
.ui-data-table__table td.is-empty {
color: var(--color-text-secondary); /* muted 는 작은 글에 대비 3:1 — 모자람 */
text-align: center;
}
/* 머리 — 스크롤해도 위에 붙음 */
.ui-data-table__table thead {
position: sticky;
top: 0;
z-index: 2;
}
.ui-data-table__table thead th {
background: var(--dt-head);
color: var(--color-text);
font-weight: var(--font-weight-medium);
text-align: center;
}
/* 머리 칸 상태 — 원본에 없는 항목 */
.ui-data-table__table thead th.is-missing {
color: var(--color-danger);
}
.ui-data-table__table thead tr:last-child th,
.ui-data-table__table thead th[rowspan] {
border-bottom-color: var(--dt-edge);
}
/* 줄 번갈아 색 · 올린 줄 강조 */
.ui-data-table__table tbody tr.is-alt td {
background: var(--dt-zebra);
}
.ui-data-table__table tbody tr:hover td {
background: var(--dt-hover);
}
/* 안 그린 줄 자리 */
.ui-data-table__table tbody tr.ui-data-table__pad td {
height: auto;
padding: 0;
border: 0;
background: none;
}
/* 앞 고정 열 — left 는 칸마다 글에 들어 있음 */
.ui-data-table__table .is-frozen {
position: sticky;
z-index: 1;
}
.ui-data-table__table thead .is-frozen {
z-index: 3;
}
.ui-data-table__table .is-edge {
border-right-color: var(--dt-edge);
}
/* 합계 줄 — 맨 아래 붙음 · 굵게 */
.ui-data-table__table tfoot {
position: sticky;
bottom: 0;
z-index: 2;
}
.ui-data-table__table tfoot td {
border-top: 1px solid var(--dt-edge);
background: var(--dt-head);
color: var(--color-text);
font-weight: var(--font-weight-bold);
}
/* 제목 줄(PLAN 155-2 · rowClass) — 굵게 */
.ui-data-table__table tbody tr.is-title td {
color: var(--color-text);
font-weight: var(--font-weight-bold);
}
.ui-data-table__table tbody tr.is-clickable {
cursor: pointer;
}
/* 이동해 온 줄(PLAN 144 · focusRow) */
.ui-data-table__table tbody tr.is-focus td {
background: var(--dt-hover);
box-shadow: inset 0 -2px 0 var(--color-accent);
}
/* 고칠 칸(PLAN 121) — 칸 가득 글 상자 · 숫자 오른쪽 맞춤 */
.ui-data-table__table td.is-edit {
padding: 0;
}
.ui-data-table__input {
width: 100%;
height: var(--dt-row-h);
padding: 0 var(--spacing-8);
border: 0;
background: color-mix(in srgb, var(--color-accent) 5%, var(--color-canvas));
color: inherit;
font: inherit;
font-variant-numeric: tabular-nums;
text-align: right;
}
/* 고칠 수 있는 칸(PLAN 258-2 · editOnDouble) — 글일 때도 옅은 입력 칸 테두리(outline 안쪽 · 줄 고름 box-shadow 와 안 겹침) */
.ui-data-table__table td.is-can-edit {
outline: 1px solid color-mix(in srgb, var(--color-accent) 28%, var(--color-canvas));
outline-offset: -1px;
}
.ui-data-table__input:focus {
outline: 2px solid var(--color-focus-ring);
outline-offset: -2px;
}
/* 레벨(PLAN 201-1 · level 옵션 · 보기 전용) — 레벨 열 왼쪽 맞춤 · 레벨마다 1em(표 기본) 들여쓰기(글 상자도) */
.ui-data-table__table td.ui-data-table__lv {
padding-left: calc(var(--spacing-8) + var(--dt-lv, 0) * var(--dt-indent));
text-align: left;
}
.ui-data-table__table td.ui-data-table__lv.is-edit {
padding-left: 0;
}
.ui-data-table__table td.ui-data-table__lv .ui-data-table__input {
padding-left: calc(var(--spacing-8) + var(--dt-lv, 0) * var(--dt-indent));
text-align: left;
}
/* 나무(PLAN 235-1 · level.tree) — 접히지 않는 나무 안내선 · 폴더 · 파일 아이콘(공용 나무 ui_template_tree 꼴)
* 안내선 칸 한 단 = 들여쓰기 한 칸 · 선 = 칸 가운데(윗대 아이콘 가운데) · 고정 열 칸은 sticky 가 자리 기준 */
.ui-data-table__table td.has-tree:not(.is-frozen) {
position: relative;
}
.ui-data-table__guide {
position: absolute;
z-index: 1;
top: 0;
bottom: 0;
left: calc(var(--spacing-8) + var(--g, 0) * var(--dt-indent));
width: var(--dt-indent);
pointer-events: none;
}
.ui-data-table__guide::before,
.ui-data-table__guide::after {
content: "";
position: absolute;
left: 50%;
}
/* │ 윗대 형제가 아래에 더 있음 · ├ 형제가 아래에 더 있음 · └ 끝 형제 */
.ui-data-table__guide::before {
top: 0;
bottom: 0;
border-left: 1px solid var(--color-border);
}
.ui-data-table__guide.is-end::before {
bottom: 50%;
}
.ui-data-table__guide.is-tee::after,
.ui-data-table__guide.is-end::after {
top: 50%;
width: 50%;
border-top: 1px solid var(--color-border);
}
.ui-data-table__icon {
display: inline-flex;
margin-right: var(--spacing-4);
color: var(--color-text-secondary);
vertical-align: -2px;
}
.ui-data-table__table td.has-tree .ui-data-table__input {
padding-left: calc(
var(--spacing-8) + var(--dt-lv, 0) * var(--dt-indent) + 14px + var(--spacing-4)
);
}
/* 레벨 글꼴(PLAN 228-1) — 묶음 줄(is-node) 굵게 · 크기는 레벨 · 항목 줄은 14px 보다 크지 않게(Lv1 · 2 항목 = 기본) */
.ui-data-table__table td.ui-data-table__lv.is-node {
font-weight: var(--font-weight-bold);
}
.ui-data-table__table td.ui-data-table__lv.is-lv1.is-node {
font-size: var(--dt-lv1-size);
}
.ui-data-table__table td.ui-data-table__lv.is-lv2.is-node {
font-size: var(--dt-lv2-size);
}
.ui-data-table__table td.ui-data-table__lv.is-lv4 {
font-size: var(--dt-lv4-size);
}
.ui-data-table__table td.ui-data-table__lv.is-lv5 {
font-size: var(--dt-lv5-size);
}
/* 같은 값 세로 병합(PLAN 201-1 · mergeSame) — 한 칸 글은 위에 */
.ui-data-table__table td.is-merged {
vertical-align: top;
padding-top: calc((var(--dt-row-h) - 1.3em) / 2);
}
/* 245-1 병합 칸 = 줄 강조 밖 — 올린 줄 · 이동해 온 줄 · 줄무늬가 병합 칸을 칠하지 않음 · 그 줄 나머지 칸만 */
.ui-data-table__table tbody tr td.is-merged {
background: var(--color-canvas);
box-shadow: none;
}
/* 숨김 — display 가 [hidden] 을 덮지 않게(공용 기본 꼴이 안 실린 곳 · 페이지 꾸밈 위에서도) */
:is(.ui-data-table__icon, .ui-data-table__lamp)[hidden] {
display: none !important;
}