Files
Aislo/B06_Section/B06_Section_UI_Style.css
eomsangdonandClaude Opus 5 2eb2c97293 fix(B06): 저장이 옛 면적을 싣던 자리 — 저장 직전 전 측점 재계산 + 「안 실림」 알림
⚠ 잡은 자리(2026-09-09 실측) — 표준단면 「측구 상폭」을 0.69 → 0.9 로 고쳐 저장했더니
정본 한 줄에 **새 측구 기하(상폭 0.9 · 측구 0.18㎡)** 와 **옛 절토 면적(3.33㎡)** 이 섞여
남았음. 브라우저는 만진 측점만 다시 계산하는데 저장은 전 측점 면적을 실어 보내므로,
안 만진 측점이 옛 값 그대로 정본이 됨. 수량이 갈리는 자리임.

- [저장]·[확정]이 면적을 모으기 **전에** 전 측점을 다시 계산함(`reconcileDesigns`).
- 표준단면 패널에 「고친 값이 측점에 아직 안 실렸음」 알림 — 언제 따라오는지 함께 적음.

 거울(파이썬·TS) 문제가 아님을 먼저 가름 — 같은 입력을 주면 두 쪽이 같은 값을 냄
(측점 20.0m: 0.69 기준 절토 3.328 · 0.9 기준 3.899, 저장분은 3.328 + 측구 0.180 으로 섞여 있었음).

시험 둘 추가(저장·확정이 재계산을 먼저 부르는지), 전체 1205 통과·실패 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 21:58:07 +09:00

378 lines
9.5 KiB
CSS

/* =============================================================================
* B06_Section_UI_Style.css
* 3차 워크플로우(종·횡단 생성) 페이지 전용 스타일.
*
* 원칙(frontend.md §1): 하드코딩 색상 금지. theme.css 변수(var(--...))만 참조.
* 공통 컴포넌트 스타일은 ui_template_elements.ts가 주입하므로 여기서는
* B06 고유 레이아웃(옵션 그룹/결과 메트릭)만 정의한다.
* ========================================================================== */
/* --- 좌측 입력 폼 --- */
.b06-profile-layout {
height: calc(100vh - var(--spacing-64));
height: calc(100dvh - var(--spacing-64));
min-height: 0;
overflow: hidden;
}
.b06-profile-layout .ui-workflow-layout__body,
.b06-profile-layout .ui-workflow-layout__main {
height: 100%;
min-height: 0;
}
.b06-profile-layout .ui-workflow-layout__main {
overflow: auto;
}
.b06-profile__form {
display: flex;
flex-direction: column;
gap: var(--spacing-16);
}
/* 스크롤 영역 상단 여유 — 첫 컨테이너(구조물 배치)가 패널 상단 경계에 붙지 않게
B05(.b05-route__panel .ui-sidebar-scroll)와 같은 값을 쓴다(2026-08-29 일원화). */
.b06-profile__form .ui-sidebar-scroll {
padding-top: var(--spacing-8);
}
/* 사이드 컨테이너 양식은 B05 경로 패널(.b05-route__panel-section)과 같게 맞춘다
— 두 화면의 좌측 패널이 같은 폼으로 보여야 한다(2026-08-23 사용자 지시).
여백·글자 크기·색을 B05 값으로 옮겼고, 표준단면 「변수 위치 안내」 모식도만
기존 스타일(.b06-std__diagram*)을 그대로 둔다. */
.b06-profile__group {
display: flex;
flex-direction: column;
gap: var(--spacing-8);
margin: 0;
padding: calc(var(--spacing-8) + var(--spacing-4));
/* 테두리는 공통 ui-sidebar-section이 전담 — 로컬 border 선언이 공통 색을 덮던
문제 제거(2026-08-06 사용자 보고). */
border-radius: var(--radius-cards);
background-color: var(--color-surface-raised);
color: var(--color-text-body);
font-size: var(--text-caption);
}
.b06-profile__group-legend {
margin: 0;
padding: 0;
font-size: var(--text-body-sm);
color: var(--color-text);
}
/* 라벨·입력·버튼을 **한 줄**로 세운다(횡단 보기 설정, 2026-08-23 사용자 지시).
ui-field는 기본이 세로(라벨 위·입력 아래·그 아래 오류 슬롯)라 그대로 두면 버튼이
오류 슬롯 높이만큼 밀려 수평이 안 맞는다 — 이 줄에서만 가로로 눕히고 오류 슬롯을 접는다. */
.b06-profile__field-row {
display: flex;
align-items: center;
gap: var(--spacing-8);
}
.b06-profile__field-row > .ui-field {
display: flex;
flex: 1 1 auto;
flex-direction: row;
align-items: center;
gap: var(--spacing-8);
min-width: 0;
}
.b06-profile__field-row .ui-field__label {
flex: 0 0 auto;
margin: 0;
white-space: nowrap;
}
.b06-profile__field-row .ui-input {
flex: 1 1 auto;
min-width: 0;
}
.b06-profile__field-row .ui-field__error {
display: none;
}
/* 창이 좁아 좌측 패널이 237px 까지 물러난 자리 — 라벨이 안 줄어 2px 이 새어 나왔다.
그 폭에서만 라벨을 윗줄로 접는다. 넓은 폭 배치는 손대지 않는다(2026-09-08 실측).
⚠ 폭 제한 없이 `flex-wrap` 을 주면 넓은 폭에서도 라벨이 윗줄로 올라간다 — 재 보고 되돌렸다. */
@media (max-width: 560px) {
.b06-profile__field-row > .ui-field {
flex-wrap: wrap;
}
}
.b06-profile__field-row > .ui-btn {
flex: 0 0 auto;
}
/* --- 읽기 전용 경로 컨텍스트 --- */
.b06-profile__info-line {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--spacing-8);
font-size: var(--text-body-sm);
color: var(--color-text-body);
}
.b06-profile__info-line span {
color: var(--color-text-secondary);
}
.b06-profile__info-line strong {
font-family: var(--font-mono);
text-align: right;
}
/* --- 액션 버튼 행 --- */
.b06-profile__actions {
display: flex;
gap: var(--spacing-8);
}
.b06-profile__actions > * {
flex: 1 1 0;
min-width: 0;
}
/* --- 표준 횡단면 설정 패널 --- */
.b06-std {
display: flex;
flex-direction: column;
gap: var(--spacing-16);
}
.b06-std__body {
display: flex;
flex-direction: column;
gap: var(--spacing-16);
}
/* ─── 변수 위치 안내 모식도 (작업 C-5) ───────────────────────────── */
.b06-std__diagram {
border: 1px solid var(--color-border);
border-radius: var(--radius-inputs);
background-color: var(--color-surface);
padding: var(--spacing-8);
}
.b06-std__diagram-summary {
cursor: pointer;
font-size: var(--text-caption);
font-weight: var(--font-weight-medium);
color: var(--color-text-secondary);
user-select: none;
}
.b06-std__diagram-svg {
width: 100%;
height: auto;
margin-top: var(--spacing-8);
}
.b06-std__diagram-caption {
margin: var(--spacing-8) 0 0;
font-size: var(--text-caption);
color: var(--color-text-muted);
}
/* ─── 다른 프로젝트에서 불러오기 (작업 C-6) ───────────────────────── */
.b06-std__loader {
display: flex;
flex-direction: column;
gap: var(--spacing-8);
border: 1px solid var(--color-border);
border-radius: var(--radius-inputs);
background-color: var(--color-surface);
padding: var(--spacing-8);
}
.b06-std__loader-summary {
cursor: pointer;
font-size: var(--text-caption);
font-weight: var(--font-weight-medium);
color: var(--color-text-secondary);
user-select: none;
}
.b06-std__loader-status {
margin: 0;
font-size: var(--text-caption);
color: var(--color-text-muted);
}
.b06-std__loader-preview {
margin: 0;
padding: var(--spacing-8);
border-radius: var(--radius-inputs);
background-color: var(--color-surface-raised);
color: var(--color-text-body);
font-size: var(--text-caption);
white-space: pre-wrap;
overflow-x: auto;
}
.b06-diag__ground {
fill: none;
stroke: var(--color-text-muted);
stroke-width: 1;
stroke-dasharray: 3 2;
}
.b06-diag__road {
fill: none;
stroke: var(--color-text-body);
stroke-width: 2;
}
.b06-diag__center {
stroke: var(--color-royal-amethyst, rgb(109 40 217));
stroke-width: 1;
stroke-dasharray: 4 3;
}
.b06-diag__tick {
stroke: var(--color-text-secondary);
stroke-width: 1;
}
.b06-diag__ditch {
fill: color-mix(in srgb, rgb(37 99 235) 20%, transparent);
stroke: rgb(37 99 235);
stroke-width: 1;
}
.b06-diag__cut {
stroke: rgb(220 38 38);
stroke-width: 1.5;
}
.b06-diag__fill {
stroke: rgb(37 99 235);
stroke-width: 1.5;
}
.b06-diag__label {
fill: var(--color-text-body);
font-size: 14px;
}
.b06-diag__label-sm {
fill: var(--color-text-secondary);
font-size: 12px;
}
/* 구간 그룹(details/summary) — 상단 "변수 위치 안내" 모식도와 동일한 균일 8px 패딩으로
맞춰 접힘 시 좌측·하단 여백을 줄인다(N-4 후속). */
.b06-std__group {
display: flex;
flex-direction: column;
gap: var(--spacing-8);
margin: 0;
padding: var(--spacing-8);
border: 1px solid var(--color-border);
border-radius: var(--radius-inputs);
background-color: var(--color-surface);
}
.b06-std__legend {
font-size: var(--text-caption);
font-weight: var(--font-weight-medium);
color: var(--color-text-secondary);
}
/* 구간 그룹 접기(N-4-1) — details/summary. 기본 ▶ 마커로 접힘/펼침 표시. */
.b06-std__group > summary.b06-std__legend {
cursor: pointer;
user-select: none;
}
.b06-std__grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--spacing-8);
}
/* 구간 구분선 — 「표준횡단면 상세값」 한 컨테이너 안에서 공통 / 암 / 포장을 가른다
(2026-09-04 사용자 지시: 공통 항목은 지우고 구분선을 쓸 것). */
.b06-std__divider {
margin: var(--spacing-4) 0 0;
padding-top: var(--spacing-8);
border-top: 1px solid var(--color-border);
font-size: var(--text-caption);
font-weight: var(--font-weight-medium);
color: var(--color-text-secondary);
}
.b06-std__note {
margin: 0;
font-size: var(--text-caption);
color: var(--color-text-muted);
}
.b06-std__actions {
display: flex;
gap: var(--spacing-8);
}
/* 고친 값이 아직 측점에 안 실렸다는 알림 — [전체 측점 반영] 바로 위. */
.b06-std__pending {
margin: var(--spacing-8) 0 0;
padding: var(--spacing-8);
border-left: 3px solid var(--color-warning, #d98324);
background: var(--color-surface-muted, rgb(217 131 36 / 8%));
font-size: 0.85em;
line-height: 1.45;
}
/* --- 우측 결과 --- */
.b06-profile__result {
display: flex;
flex-direction: column;
gap: var(--spacing-16);
padding: var(--spacing-24);
}
.b06-profile__result-title {
font-size: var(--text-subheading);
color: var(--color-text);
}
.b06-profile__empty {
color: var(--color-text-muted);
font-size: var(--text-body-sm);
}
.b06-profile__result-body {
display: flex;
flex-direction: column;
gap: var(--spacing-8);
max-width: 480px;
}
.b06-profile__metric {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--spacing-16);
padding: var(--spacing-8) var(--spacing-16);
border-radius: var(--radius-inputs);
background-color: var(--color-surface);
}
.b06-profile__metric-key {
font-size: var(--text-caption);
color: var(--color-text-secondary);
}
.b06-profile__metric-val {
font-family: var(--font-mono);
font-size: var(--text-body-sm);
color: var(--color-text-body);
word-break: break-all;
text-align: right;
}