목록에만 있고 화면에 없으면 사용자는 그것이 잠정인 줄도 모름. 셋 다 「지금 어떤 값으로 돌고 있는지 + 왜 잠정인지」를 함께 보임. - 콘크리트 타설 방식을 좌측 패널 칸으로 냄. ⚠ 금액에 바로 걸리는 값이라 기본값으로 돌고 있으면 「기본값 「레디믹스트」로 계산 중 — 아직 안 정한 값」 안내를 띄움. 설정 기본을 None 으로 바꿔 「안 정함」과 「일부러 레디믹스트를 고른 것」을 가름 — 값을 미리 넣으면 그 구별이 사라짐. 되돌리기도 됨. - 물구멍 근거에 잠정값을 적음 — 「관 Ø 미정(법 3~6㎝ / 실무 Ø50) · 간격 2.0㎡당 1개소(법 2~3㎡당 1개소 이상)」. 「미확정」만으로는 무엇을 정해야 하는지 모름. - 준비공의 벌목 줄에 공종 미확정 사유와 후보를 함께 적음(수확베기·단목베기· 위험목 베기 중 어느 것인지 원본이 말하지 않음). 검증 — 전체 580 passed, tsc 오류 0. 화면에서 셋 다 뜨는 것과 타설 방식 저장·되돌리기까지 확인 후 검증으로 바꾼 값은 원래대로 복원. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
197 lines
6.3 KiB
TypeScript
197 lines
6.3 KiB
TypeScript
/* =============================================================================
|
|
* 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; }
|
|
`;
|
|
|
|
/** 스타일을 한 번만 넣는다 — 페이지를 다시 그려도 중복되지 않는다. */
|
|
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);
|
|
}
|