/* ============================================================================= * B08_Quantity_UI_EarthworkGrid_Style.ts * 토적표 그리드 스타일. 한 번만 주입한다. * * 실무 산출서와 눈으로 대조되는 것이 이 표의 목적이라, 장식보다 **줄·칸이 또렷한 것**을 * 우선한다. 숫자는 등폭으로 두어 자릿수가 세로로 맞는다. * ========================================================================== */ const STYLE_ID = "b08-earthwork-grid-style"; /* 색은 전부 프로젝트 테마 변수를 쓴다 — 어두운 테마에서 머리글이 묻히지 않아야 한다. 글자색을 배경과 함께 지정하는 까닭이 그것이다(배경만 주면 상속색이 배경에 잠긴다). */ const CSS = ` .b08-grid { display: flex; flex-direction: column; gap: 8px; min-width: 0; height: 100%; } /* 표 안에서 고르는 칸 — 관급/사급처럼 **줄마다 갈리는 값**을 여기서 정한다. */ .b08-grid__select { width: 100%; min-width: 5.5rem; padding: 0.15rem 0.25rem; font: inherit; color: var(--color-text); background: var(--color-surface-raised); border: 1px solid var(--color-border, rgba(128, 128, 128, 0.4)); border-radius: 3px; } .b08-grid__select:disabled { opacity: 0.45; /* 사급 줄의 설치 주체 — 뜻이 없으므로 흐리게 둔다 */ } /* 만진 줄은 표시가 남는다 — 무엇을 바꿨는지 보여야 한다. */ .b08-grid__table td.is-changed { box-shadow: inset 2px 0 0 var(--color-accent, #6c8ebf); } /* 잠정값 안내 — 금액에 걸리는 값이 조용히 기본으로 돌지 않게. */ .b08-quantity__notice { margin: 0.35rem 0 0; padding: 0.4rem 0.5rem; font-size: 0.85em; line-height: 1.4; color: var(--color-text); background: var(--color-surface-raised); border-left: 3px solid var(--color-warning, #c08a3e); border-radius: 3px; } .b08-grid__caption { margin: 0; font-size: 12px; color: var(--color-text-secondary); } /* 열이 많아 화면을 넘친다 — 표만 가로로 구르고 페이지 몸통은 안 구른다. */ .b08-grid__scroll { overflow: auto; flex: 1 1 auto; min-height: 0; } .b08-grid__table { border-collapse: collapse; font-size: 12px; font-variant-numeric: tabular-nums; white-space: nowrap; color: var(--color-text-body); } .b08-grid__table th, .b08-grid__table td { border: 1px solid var(--color-border); padding: 2px 8px; text-align: right; } .b08-grid__table thead th { position: sticky; top: 0; background: var(--color-surface-raised); color: var(--color-text); font-weight: var(--font-weight-medium, 600); text-align: center; z-index: 1; } /* 측점 열은 왼쪽에 붙어 있어야 가로로 굴러도 어느 줄인지 보인다. */ .b08-grid__station { position: sticky; left: 0; background: var(--color-surface); color: var(--color-text); text-align: left; font-weight: var(--font-weight-medium, 500); } .b08-grid__table tfoot td { background: var(--color-surface-raised); color: var(--color-text); font-weight: var(--font-weight-medium, 600); } /* 잘린 측점 안내 — 발생률이 21~26 % 로 늘 뜨는 것이라 붉은 오류가 아니라 **주의**로 둔다. 요란하면 곧 무시당한다. 목록은 접어 두고 필요할 때만 편다. */ .b08-grid__warning { padding: 6px 10px; font-size: 12px; color: var(--color-text-body); background: var(--color-surface-raised); border-left: 3px solid var(--color-text-muted); } .b08-grid__warning-summary { cursor: pointer; } .b08-grid__warning-list { display: flex; flex-wrap: wrap; gap: 4px 6px; padding-top: 6px; } .b08-grid__warning-station { font-size: 11px; padding: 0 6px; border: 1px solid var(--color-border); background: var(--color-surface); color: var(--color-text); cursor: pointer; font-variant-numeric: tabular-nums; } /* 잘린 줄은 표에서도 알아보게 왼쪽에 표시를 남긴다 — 눈에 띄되 요란하지 않게. */ .b08-grid__table tbody tr.is-unclosed .b08-grid__station { border-left: 3px solid var(--color-text-muted); } .b08-grid__table tbody tr.is-highlighted td { background: var(--color-royal-amethyst, #d8ccff); color: #1b2220; } .b08-quantity__tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--color-border); } .b08-quantity__tab { padding: 4px 12px; font-size: 13px; border: 1px solid var(--color-border); border-bottom: none; background: var(--color-surface-raised); color: var(--color-text-secondary); cursor: pointer; } .b08-quantity__tab.is-active { background: var(--color-surface); color: var(--color-text); font-weight: var(--font-weight-medium, 600); } .b08-quantity__body { display: flex; flex-direction: column; gap: 8px; padding: 8px; min-height: 0; flex: 1 1 auto; } .b08-quantity__pane { display: flex; flex-direction: column; min-height: 0; flex: 1 1 auto; } /* 집계·운반표는 열이 적어 왼쪽 정렬이 읽기 좋다 — 숫자 칸만 오른쪽으로 둔다. */ .b08-grid__table--summary th, .b08-grid__table--summary td { text-align: left; } .b08-grid__table--summary td:nth-child(5), .b08-grid__table--summary td:nth-child(4) { text-align: right; } .b08-grid__unit { text-align: center; } .b08-grid__note { white-space: normal; max-width: 26rem; } /* 「내역 제외」 같은 표시 — 규칙이 코드에만 있으면 잊힌다. 화면에 남긴다. */ .b08-grid__tag { display: inline-block; margin-right: 4px; padding: 0 6px; font-size: 11px; border: 1px solid var(--color-border); color: var(--color-text-secondary); } .b08-quantity__input { width: 5rem; font-size: 12px; text-align: right; font-variant-numeric: tabular-nums; background: var(--color-surface); color: var(--color-text); border: 1px solid var(--color-border); } .b08-quantity__message { margin: 0; padding: 16px; font-size: 13px; color: var(--color-text-secondary); } .b08-quantity__field { display: flex; justify-content: space-between; gap: 8px; font-size: 12px; padding: 2px 0; } .b08-quantity__field-value { color: var(--color-text-secondary); font-variant-numeric: tabular-nums; } /* 칸 밑 근거 한 줄 — 왜 그 값인지 화면에서 보이게 한다(2026-09-09 사용자 지시). */ .b08-quantity__hint { margin: 0 0 6px; font-size: 11px; line-height: 1.4; color: var(--color-text-secondary); } `; /** 스타일을 한 번만 넣는다 — 페이지를 다시 그려도 중복되지 않는다. */ export function injectEarthworkGridStyles(): void { if (document.getElementById(STYLE_ID)) return; const style = document.createElement("style"); style.id = STYLE_ID; style.textContent = CSS; document.head.append(style); }