From e2b3a87828ff33276e47cbc3ea34f70da946c94f Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 26 Oct 2026 23:08:13 +0900 Subject: [PATCH] =?UTF-8?q?refactor(B06):=20=EC=A4=8C=20=C2=B7=20=EC=A1=B0?= =?UTF-8?q?=EC=A0=95=EC=B0=BD=20=EB=8B=A8=EC=B6=94=20=C2=B7=20=EB=A8=B8?= =?UTF-8?q?=EB=A6=AC=20=EC=95=8C=EC=95=BD=20=C2=B7=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EC=B9=A9=20=C2=B7=20=EC=A0=91=EC=9D=B4=20=EB=84=B7=20=C2=B7=20?= =?UTF-8?q?=EB=9D=A0=20=EC=95=8C=EB=A6=BC=20=C2=B7=20=EB=B9=88=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EB=A5=BC=20=EB=B6=80=ED=92=88=EC=9C=BC=EB=A1=9C=20(PL?= =?UTF-8?q?AN=20553-2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 줌 [+ − ⤢] = 아이콘 단추 22 · 상세 [칸에 넣기] = 단추 22 · [여럿] = 켜기 칩 22 · 사이 금 지움 - 구조물 조정창 십자 · 9키 · 단 수 [-][+] = 아이콘 단추(선) 22 · ✕ = 고스트 · 옵션 연동 · 경사 = 켜기 칩 24(유입 · 유출 칸 꼴은 그대로) - 카드 머리 단면유형 = 배지(정보) 20 · 구조물 = 배지(강조) 20 - 알림 칩 = 단추(고스트) 20(색만 경고 / 정보) · 측점 목록 날 단추 = 단추(고스트) 20 - 날 details 넷(변수 위치 안내 · 상세값 · 다른 프로젝트 불러오기 · 횡단 조정) = 접이 구역(ui-collapsible) · 가이드 장면 선택자 `details.` 뗌 - 측점 없는 구조물 줄 · 표준 미반영 알림 = 띠 알림(경고) — 날 색 #fff8e6 · #e0b872 · #7a5a12 · #8a6a22 · 폴백 #d98324 지움 - 빈 그림 자리 = 빈 상태 · 선 치수 글 옛 보라 이름 → --color-accent - 흉내 DOM 시험 · 서버 Node 묶음이 끄는 파일이라 부품 함수 대신 클래스 · data-size 계약 + 부품 CSS 직접 실음(묶음 셋 빌드 정상) - 시험 넷 기대 고침 — 108(닫기 클래스) · 179-1(줌 사이 금 규칙 없음) · 196-1(칩 클래스) · 207-1(칩 반경 = 부품) - 그대로 둔 것 — 수량 산출표(b06-detail__qtable · B07 산출서 병합 칸 · 세로선 = 부품 표에 없는 꼴) · 조정창 고르기 · 암 절토 칸(작은 단 없음) · 조정창 · ⋯ · 측점 목록 떠 있는 판 Co-Authored-By: Claude Opus 5.5 --- A05_EduDetail/guide/B06/_scenes.json | 10 +-- B06_Section/B06_Section_UI_Adjust_Dock.ts | 10 +-- .../B06_Section_UI_Cross_Card_Chrome.ts | 10 ++- .../B06_Section_UI_Cross_Detail_Select.ts | 7 +- .../B06_Section_UI_Cross_Notice_Chips.ts | 6 +- .../B06_Section_UI_Cross_Panel_Base.ts | 6 +- .../B06_Section_UI_Cross_Structure_Panel.ts | 5 +- B06_Section/B06_Section_UI_Cross_View_Zoom.ts | 4 +- .../B06_Section_UI_Missing_Stations.ts | 7 +- B06_Section/B06_Section_UI_Section_Common.ts | 9 ++- .../B06_Section_UI_Standard_Diagram.ts | 10 +-- B06_Section/B06_Section_UI_Standard_Panel.ts | 22 +++--- B06_Section/B06_Section_UI_Style.css | 35 ++-------- B06_Section/B06_Section_UI_Style_Cross.css | 35 ++-------- .../B06_Section_UI_Style_Cross_Areas.css | 15 ++-- .../B06_Section_UI_Style_Cross_Controls.css | 70 ++----------------- .../B06_Section_UI_Style_Cross_Detail.css | 3 - resources/tester/test_108_drag_box_hit.py | 3 +- resources/tester/test_179_1_line_dims_left.py | 3 +- .../tester/test_196_1_b06_notice_chips.py | 13 +++- .../tester/test_207_1_b06_notice_overlay.py | 6 +- 21 files changed, 107 insertions(+), 182 deletions(-) diff --git a/A05_EduDetail/guide/B06/_scenes.json b/A05_EduDetail/guide/B06/_scenes.json index 75d566e26..360866d81 100644 --- a/A05_EduDetail/guide/B06/_scenes.json +++ b/A05_EduDetail/guide/B06/_scenes.json @@ -518,15 +518,15 @@ "callouts": [ { "n": 1, - "sel": "details.b06-std__diagram" + "sel": ".b06-std__diagram" }, { "n": 2, - "sel": "details.b06-std__group" + "sel": ".b06-std__group" }, { "n": 3, - "sel": "details.b06-std__loader" + "sel": ".b06-std__loader" }, { "n": 4, @@ -556,7 +556,7 @@ "click": "section.ui-collapsible:has(> .ui-collapsible__title:text-is('표준 횡단면 설정')) > .ui-collapsible__title" } ], - "clip": "details.b06-std__diagram", + "clip": ".b06-std__diagram", "callouts": [], "viewport": [ 1600, @@ -581,7 +581,7 @@ "click": "section.ui-collapsible:has(> .ui-collapsible__title:text-is('표준 횡단면 설정')) > .ui-collapsible__title" } ], - "clip": "details.b06-std__group", + "clip": ".b06-std__group", "callouts": [], "viewport": [ 1600, diff --git a/B06_Section/B06_Section_UI_Adjust_Dock.ts b/B06_Section/B06_Section_UI_Adjust_Dock.ts index 8200b71a0..f30b6b2cc 100644 --- a/B06_Section/B06_Section_UI_Adjust_Dock.ts +++ b/B06_Section/B06_Section_UI_Adjust_Dock.ts @@ -14,7 +14,7 @@ * 그래서 [횡단 조정] 상자 자체는 화면에 서지 않는다(사본을 담아 두는 자리로만 남음). * ========================================================================== */ -let dockRoot: HTMLDetailsElement | null = null; +let dockRoot: HTMLElement | null = null; let slot: HTMLElement | null = null; let placeholder: HTMLElement | null = null; /** 유입구·유출구·추가 기슭막이 그룹의 이식 자리(2026-08-29 지시 4, 2026-08-30 지시 4). @@ -246,12 +246,12 @@ function relocateSideRows(panelRoot: HTMLElement, scroll = true): void { function ensureDock(): void { if (dockRoot) return; - dockRoot = document.createElement("details"); - dockRoot.className = "b06-adjust-dock"; - dockRoot.open = true; + dockRoot = document.createElement("section"); // 부품 접이 구역(553-2) + dockRoot.className = "ui-collapsible b06-adjust-dock"; // 줄은 모두 폼 칸으로 옮겨 가므로 상자는 서지 않는다(24-4a). dockRoot.hidden = true; - const summary = document.createElement("summary"); + const summary = document.createElement("h4"); + summary.className = "ui-collapsible__title"; summary.textContent = "횡단 조정"; placeholder = document.createElement("p"); placeholder.className = "b06-adjust-dock__empty"; diff --git a/B06_Section/B06_Section_UI_Cross_Card_Chrome.ts b/B06_Section/B06_Section_UI_Cross_Card_Chrome.ts index 9c3e0e531..3a5679da4 100644 --- a/B06_Section/B06_Section_UI_Cross_Card_Chrome.ts +++ b/B06_Section/B06_Section_UI_Cross_Card_Chrome.ts @@ -16,6 +16,7 @@ import { stationLabel, structureDisplayName, } from "./B06_Section_UI_Section_Common"; +import "@ui/ui_template_badge.css"; // 알약 = 부품 배지 클래스(553-2) /** * 성토사면 경사길이 표기 칸 — 성토측이 없으면 null. @@ -96,7 +97,10 @@ export function appendCardHeader( // 단면유형 pill(자동 판정, 읽기 전용) — 구조물 pill과 동일 표기, 좌측 배치(E-3). const modePill = document.createElement("span"); - modePill.className = "b06-cross-card__mode"; + // 부품 배지(알약 · 정보) 20(553-2) — 클래스 · data-size 계약(흉내 DOM 시험이 @ui 를 안 풂) + modePill.className = + "ui-badge ui-badge--pill ui-badge--info ui-tag ui-tag--info b06-cross-card__mode"; + modePill.setAttribute("data-size", "20"); modePill.textContent = sectionModeLabel(section.design?.section_mode); modePill.title = L("B06_Design_Mode_Legend"); @@ -121,7 +125,9 @@ export function appendCardHeader( const structureName = section.structure; if (structureName) { const structure = document.createElement("span"); - structure.className = "b06-cross-card__structure"; + structure.className = + "ui-badge ui-badge--pill ui-badge--accent ui-tag ui-tag--accent b06-cross-card__structure"; // 배지 20 + structure.setAttribute("data-size", "20"); // 배수관은 관종·관경(`파형강관 D1200`)이 아니라 표시 이름 하나로 적는다 // (2026-09-03 사용자 지시). 관종·관경은 툴팁에 남긴다. structure.textContent = structureDisplayName(structureName); diff --git a/B06_Section/B06_Section_UI_Cross_Detail_Select.ts b/B06_Section/B06_Section_UI_Cross_Detail_Select.ts index 913d279a5..0ef39ff9f 100644 --- a/B06_Section/B06_Section_UI_Cross_Detail_Select.ts +++ b/B06_Section/B06_Section_UI_Cross_Detail_Select.ts @@ -343,7 +343,8 @@ export function attachDetailSelect(input: { label.className = "b06-cross-card__line-dims b06-detail__measure"; const put = document.createElement("button"); put.type = "button"; - put.className = "b06-cross-card__zoom-btn b06-detail__commit"; + put.className = "ui-btn ui-btn--ghost b06-cross-card__zoom-btn b06-detail__commit"; // 부품 단추 22 + put.setAttribute("data-size", "22"); put.textContent = "칸에 넣기"; put.title = "고른 선을 칸에 넣음(Enter)"; put.addEventListener("click", (event) => { @@ -355,7 +356,8 @@ export function attachDetailSelect(input: { let multi = false; const multiBtn = document.createElement("button"); multiBtn.type = "button"; - multiBtn.className = "b06-cross-card__zoom-btn ui-touch-only"; + multiBtn.className = "ui-toggle ui-toggle--chip b06-cross-card__zoom-btn ui-touch-only"; // 켜기 칩 22 + multiBtn.setAttribute("data-size", "22"); multiBtn.textContent = "여럿"; multiBtn.title = "선 여럿 고르기 (Shift 누르고 누르기와 같음)"; multiBtn.setAttribute("aria-pressed", "false"); @@ -363,7 +365,6 @@ export function attachDetailSelect(input: { event.stopPropagation(); multi = !multi; multiBtn.setAttribute("aria-pressed", String(multi)); - multiBtn.classList.toggle("is-on", multi); }); const show = (): void => { diff --git a/B06_Section/B06_Section_UI_Cross_Notice_Chips.ts b/B06_Section/B06_Section_UI_Cross_Notice_Chips.ts index 54760e806..89f804650 100644 --- a/B06_Section/B06_Section_UI_Cross_Notice_Chips.ts +++ b/B06_Section/B06_Section_UI_Cross_Notice_Chips.ts @@ -53,7 +53,9 @@ export function createNoticeChips( ...items.map((item) => { const chip = document.createElement("button"); chip.type = "button"; - chip.className = `b06-section__notice-chip b06-section__notice-chip--${item.tone}`; + // 부품 단추(고스트) 20(553-2) — 클래스 · data-size 계약 · 경고 / 정보 색은 페이지 + chip.className = `ui-btn ui-btn--ghost b06-section__notice-chip b06-section__notice-chip--${item.tone}`; + chip.setAttribute("data-size", "20"); chip.dataset.noticeKey = item.key; chip.setAttribute("aria-expanded", String(item === open)); chip.textContent = `${item.label} ${item.rows.length}`; @@ -67,6 +69,8 @@ export function createNoticeChips( ...(open?.rows ?? []).map((row) => { const button = document.createElement("button"); button.type = "button"; + button.className = "ui-btn ui-btn--ghost"; // 부품 단추(고스트) 20 + button.setAttribute("data-size", "20"); button.textContent = row.text; button.dataset.stationId = row.stationId; button.classList.toggle("is-selected", row.stationId === picked); diff --git a/B06_Section/B06_Section_UI_Cross_Panel_Base.ts b/B06_Section/B06_Section_UI_Cross_Panel_Base.ts index cca9d05c2..e18189498 100644 --- a/B06_Section/B06_Section_UI_Cross_Panel_Base.ts +++ b/B06_Section/B06_Section_UI_Cross_Panel_Base.ts @@ -12,11 +12,13 @@ import { FILL_SLOPE_RATIO_MIN } from "./logic/B06_Section_UI_Cross_Culvert_Const"; -/** 조작 버튼 하나 — 클릭이 카드 선택·팬으로 번지지 않게 막는다. */ +/** 조작 버튼 하나 — 클릭이 카드 선택·팬으로 번지지 않게 막는다. + * 부품 아이콘 단추(선) 22(553-2) — 클래스 · data-size 계약(흉내 DOM 시험이 @ui 를 안 풂). */ export function makeButton(label: string, title: string, onClick: () => void): HTMLButtonElement { const button = document.createElement("button"); button.type = "button"; - button.className = "b06-structure-panel__btn"; + button.className = "ui-icon-btn ui-icon-btn--outline b06-structure-panel__btn"; + button.setAttribute("data-size", "22"); button.textContent = label; button.title = title; button.addEventListener("click", (event) => { diff --git a/B06_Section/B06_Section_UI_Cross_Structure_Panel.ts b/B06_Section/B06_Section_UI_Cross_Structure_Panel.ts index ab5f585dd..47fff72de 100644 --- a/B06_Section/B06_Section_UI_Cross_Structure_Panel.ts +++ b/B06_Section/B06_Section_UI_Cross_Structure_Panel.ts @@ -393,7 +393,10 @@ export function buildStructurePanel( const makeToggle = (label: string, title: string, onToggle: (on: boolean) => void) => { const button = document.createElement("button"); button.type = "button"; - button.className = "b06-structure-panel__btn b06-structure-panel__toggle"; + // 부품 켜기 칩 24(553-2) — 꼴은 유입 · 유출 그룹 칸(b05-structure__adjust-slot)이 덮음 + button.className = + "ui-toggle ui-toggle--chip b06-structure-panel__btn b06-structure-panel__toggle"; + button.setAttribute("data-size", "24"); button.textContent = label; button.title = title; let on = true; diff --git a/B06_Section/B06_Section_UI_Cross_View_Zoom.ts b/B06_Section/B06_Section_UI_Cross_View_Zoom.ts index bd5f24044..fcc2c9fc6 100644 --- a/B06_Section/B06_Section_UI_Cross_View_Zoom.ts +++ b/B06_Section/B06_Section_UI_Cross_View_Zoom.ts @@ -76,7 +76,9 @@ export function buildZoomControls(handle: ZoomPanHandle, width?: CrossWidthActio const add = (label: string, title: string, action: () => void): void => { const button = document.createElement("button"); button.type = "button"; - button.className = "b06-cross-card__zoom-btn"; + // 부품 아이콘 단추 22(553-2) — 클래스 · data-size 계약(흉내 DOM 시험이 @ui 를 안 풂) + button.className = "ui-icon-btn ui-icon-btn--ghost b06-cross-card__zoom-btn"; + button.setAttribute("data-size", "22"); button.textContent = label; button.title = title; button.addEventListener("click", (event) => { diff --git a/B06_Section/B06_Section_UI_Missing_Stations.ts b/B06_Section/B06_Section_UI_Missing_Stations.ts index 1aaacac25..e3817e8b0 100644 --- a/B06_Section/B06_Section_UI_Missing_Stations.ts +++ b/B06_Section/B06_Section_UI_Missing_Stations.ts @@ -21,6 +21,7 @@ import { useDesignStore } from "../A00_Common/design/design_store"; import { savingDesign } from "../A00_Common/design/design_save"; import { pageRouteId } from "../A00_Common/design/design_page_route"; import { invalidateSectionDetail, loadSectionDetail } from "./B06_Section_Section_Store"; +import "@ui/ui_template_banner.css"; // 줄 = 부품 띠 알림 클래스(553-2) interface MissingStation { chainage_m: number; @@ -67,9 +68,11 @@ export async function mountMissingStationNotice( if (!missing.length) return; const box = document.createElement("div"); - box.className = "b06-missing-stations"; + // 부품 띠 알림(경고 · 553-2) — 클래스 계약(흉내 DOM 시험이 띠 부품 파일을 안 풂) + box.className = "ui-banner ui-banner--warning b06-missing-stations"; + box.role = "status"; const text = document.createElement("p"); - text.className = "b06-missing-stations__text"; + text.className = "ui-banner__text b06-missing-stations__text"; const where = missing .slice(0, 6) .map((item) => `${item.chainage_m.toFixed(2)}m ${item.label}`) diff --git a/B06_Section/B06_Section_UI_Section_Common.ts b/B06_Section/B06_Section_UI_Section_Common.ts index d476c03cf..6a2ad0aec 100644 --- a/B06_Section/B06_Section_UI_Section_Common.ts +++ b/B06_Section/B06_Section_UI_Section_Common.ts @@ -25,6 +25,7 @@ export { inferStationInterval, stationLabel, } from "@util/common_util_svg"; +import "@ui/ui_template_empty.css"; // emptyView = 부품 빈 상태 클래스(553-2) export const LONG_WIDTH = 1200; export const LONG_HEIGHT = 220; @@ -317,10 +318,14 @@ export function windowElevationRange( return min <= max ? { min, max } : undefined; } +/** 빈 상태 = 부품 빈 상태(553-2) — 클래스 계약(서버 Node 묶음이 끄는 파일이라 부품 파일을 안 부름). */ export function emptyView(message: string): HTMLElement { const empty = document.createElement("div"); - empty.className = "b06-section__empty"; - empty.textContent = message; + empty.className = "ui-empty b06-section__empty"; + const text = document.createElement("p"); + text.className = "ui-empty__text"; + text.textContent = message; + empty.append(text); return empty; } diff --git a/B06_Section/B06_Section_UI_Standard_Diagram.ts b/B06_Section/B06_Section_UI_Standard_Diagram.ts index 4c409b174..d633a9446 100644 --- a/B06_Section/B06_Section_UI_Standard_Diagram.ts +++ b/B06_Section/B06_Section_UI_Standard_Diagram.ts @@ -33,11 +33,11 @@ function text(x: number, y: number, value: string, cls: string, anchor = "middle * 좌표 규약(+offset=좌)에 맞춰 절토측(측구 방향)을 왼쪽에 둔다. */ export function buildStandardDiagram(): HTMLElement { - const wrap = document.createElement("details"); - wrap.className = "b06-std__diagram"; - wrap.open = true; - const summary = document.createElement("summary"); - summary.className = "b06-std__diagram-summary"; + // 부품 접이 구역(553-2) — 제목 줄 누름은 패널 attachCollapsible 위임이 받음 + const wrap = document.createElement("section"); + wrap.className = "ui-collapsible b06-std__diagram"; + const summary = document.createElement("h4"); + summary.className = "ui-collapsible__title b06-std__diagram-summary"; summary.textContent = L("B06_Std_Diagram_Title"); summary.title = L("B06_Std_Diagram_Toggle"); wrap.append(summary); diff --git a/B06_Section/B06_Section_UI_Standard_Panel.ts b/B06_Section/B06_Section_UI_Standard_Panel.ts index d0c71d585..4ec88ddb9 100644 --- a/B06_Section/B06_Section_UI_Standard_Panel.ts +++ b/B06_Section/B06_Section_UI_Standard_Panel.ts @@ -36,6 +36,7 @@ import { type StandardCrossKey, type StandardCrossSection, } from "./B06_Section_Api_Fetch"; +import "@ui/ui_template_banner.css"; // 미반영 알림 = 부품 띠 알림 클래스(553-2) function L(key: keyof typeof ui_locales): string { return ui_locales[key][currentLanguageIndex]; @@ -328,7 +329,7 @@ export function createStandardPanel( // ⓘ 실측 예 — 측점 20.0m 절토 계 3.33㎡(저장분) ↔ 3.90㎡(패널 초안: 암 측구 상폭 0.69→0.9). let applied = baseline(); const pending = document.createElement("p"); - pending.className = "b06-std__pending"; + pending.className = "ui-banner ui-banner--warning b06-std__pending"; // 부품 띠 알림(경고 · 553-2) pending.textContent = "고친 값이 측점에 아직 안 실렸습니다 — [전체 측점 반영]을 누르면 바로 따라오고, " + "[저장]·[>](확정) 때도 전 측점이 이 값으로 다시 섭니다. 그전에 카드를 만지면 그 측점만 먼저 바뀝니다."; @@ -417,11 +418,11 @@ export function createStandardPanel( /** 「표준횡단면 상세값」 한 컨테이너 — 공통 → 암 → 포장 순, 구분선으로 나눈다. */ const buildDetails = (): HTMLElement => { - const fieldset = document.createElement("details"); - fieldset.className = "b06-std__group"; - fieldset.open = true; - const legend = document.createElement("summary"); - legend.className = "b06-std__legend"; + // 부품 접이 구역(553-2) — 제목 줄 누름은 패널 attachCollapsible 위임이 받음 + const fieldset = document.createElement("section"); + fieldset.className = "ui-collapsible b06-std__group"; + const legend = document.createElement("h4"); + legend.className = "ui-collapsible__title b06-std__legend"; legend.textContent = L("B06_Std_Detail_Title"); fieldset.append( legend, @@ -513,10 +514,11 @@ function buildProjectLoader( projectId: string, onApply: (source: StandardCrossSection) => void, ): HTMLElement { - const wrap = document.createElement("details"); - wrap.className = "b06-std__loader"; - const summary = document.createElement("summary"); - summary.className = "b06-std__loader-summary"; + // 부품 접이 구역(553-2) — 처음 접힘 + const wrap = document.createElement("section"); + wrap.className = "ui-collapsible is-collapsed b06-std__loader"; + const summary = document.createElement("h4"); + summary.className = "ui-collapsible__title b06-std__loader-summary"; summary.textContent = L("B06_Std_Load_Title"); wrap.append(summary); diff --git a/B06_Section/B06_Section_UI_Style.css b/B06_Section/B06_Section_UI_Style.css index 2d8c2b3d7..709499d9d 100644 --- a/B06_Section/B06_Section_UI_Style.css +++ b/B06_Section/B06_Section_UI_Style.css @@ -153,12 +153,14 @@ padding: var(--spacing-8); } -.b06-std__diagram-summary { - cursor: pointer; +/* 접이 구역 제목 = 부품 접이 제목 줄(553-2) — 글 꼴만 */ +.b06-std__diagram-summary, +.b06-std__loader-summary, +.b06-std__legend { + margin: 0; font-size: var(--text-caption); font-weight: var(--font-weight-medium); color: var(--color-text-secondary); - user-select: none; } .b06-std__diagram-svg { @@ -178,14 +180,6 @@ 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); @@ -266,18 +260,6 @@ 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)); @@ -324,14 +306,9 @@ gap: var(--spacing-8); } -/* 고친 값이 아직 측점에 안 실렸다는 알림 — [전체 측점 반영] 바로 위. */ +/* 고친 값이 아직 측점에 안 실렸다는 알림 — [전체 측점 반영] 바로 위 · 꼴 = 부품 띠 알림(경고 · 553-2). */ .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; } /* --- 우측 결과 --- */ diff --git a/B06_Section/B06_Section_UI_Style_Cross.css b/B06_Section/B06_Section_UI_Style_Cross.css index 45f1b3d25..b359f7ec0 100644 --- a/B06_Section/B06_Section_UI_Style_Cross.css +++ b/B06_Section/B06_Section_UI_Style_Cross.css @@ -179,16 +179,11 @@ html.is-bm-route .b06-section__notice-bar { gap: var(--spacing-4); } +/* 칩 = 부품 단추(고스트) 20 — 둥근 사각(207-1 · 알약 아님) · 색만 경고 / 정보(553-2) */ .b06-section__notice-chip { - padding: 2px var(--spacing-8); - border: 1px solid currentColor; - /* 둥근 사각(207-1) — 공용 단추 반경 · 알약 아님 */ - border-radius: var(--radius-buttons); - background: transparent; + border-color: currentColor; color: var(--color-warning); - font-size: var(--text-caption); white-space: nowrap; - cursor: pointer; } /* 소단 검토 — 정보(경고 색 아님 · 2026-09-15 브레인 ③). */ @@ -228,7 +223,6 @@ html.is-bm-route .b06-section__notice-bar { } .b06-section__notice-list > button { - font-size: var(--text-caption); white-space: nowrap; } @@ -311,15 +305,9 @@ html.is-bm-route .b06-section__notice-bar { border-left: 1px solid var(--color-border); } -/* 단면유형 pill(E-3) — 구조물 pill과 동일 표기. */ +/* 단면유형 pill(E-3) = 부품 배지(정보) 20 · 구조물 pill = 배지(강조) 20(553-2). */ .b06-cross-card__mode { flex: 0 0 auto; - padding: 1px 6px; - border-radius: var(--radius-pills); - background: color-mix(in srgb, var(--color-info, rgb(37 99 235)) 14%, transparent); - color: var(--color-info, rgb(37 99 235)); - font-size: var(--text-caption); - white-space: nowrap; } /* 단면유형 pill을 지반유형 우측·우측 맞춤으로 밀어 붙인다(1번). meta는 그 뒤에 따라온다. */ @@ -338,16 +326,6 @@ html.is-bm-route .b06-section__notice-bar { font-size: var(--text-body); } -/* 비정규 측점의 구조물 라벨 — kind(일반측점/BP/EP) 좌측에 자수정색 pill로 표기. */ -.b06-cross-card__structure { - padding: 1px 6px; - border-radius: var(--radius-pills); - background: color-mix(in srgb, var(--color-royal-amethyst, rgb(109 40 217)) 16%, transparent); - color: var(--color-royal-amethyst, rgb(109 40 217)); - font-size: var(--text-caption); - white-space: nowrap; -} - .b06-cross-card > footer { border-top: 1px solid var(--color-border); } @@ -357,13 +335,8 @@ html.is-bm-route .b06-section__notice-bar { content: "\200b"; } +/* 꼴 = 부품 빈 상태(553-2) — 페이지는 높이 · 가운데만 */ .b06-section__empty { - display: flex; min-height: 180px; - align-items: center; justify-content: center; - padding: var(--spacing-24); - border: 1px dashed var(--color-text-muted); - color: var(--color-text-muted); - background: var(--color-surface); } diff --git a/B06_Section/B06_Section_UI_Style_Cross_Areas.css b/B06_Section/B06_Section_UI_Style_Cross_Areas.css index 286c4cdb3..220b0fc2f 100644 --- a/B06_Section/B06_Section_UI_Style_Cross_Areas.css +++ b/B06_Section/B06_Section_UI_Style_Cross_Areas.css @@ -463,27 +463,22 @@ } /* 「측점 없는 관 N개」 알림 — 조용히 빠지던 것을 드러내는 줄(계획서 3-14 ㉯). */ +/* 꼴 = 부품 띠 알림(경고 · 553-2) — 페이지는 배치만 */ .b06-missing-stations { align-items: center; - background: #fff8e6; - border: 1px solid #e0b872; - border-radius: 6px; - display: flex; flex-wrap: wrap; - gap: 8px 12px; - margin: 0 0 12px; - padding: 10px 12px; + gap: var(--spacing-8) var(--spacing-12); + margin: 0 0 var(--spacing-12); } .b06-missing-stations__text { - color: #7a5a12; flex: 1 1 320px; margin: 0; } .b06-missing-stations__reason { - color: #8a6a22; flex: 1 1 100%; - font-size: 12px; + color: var(--color-text-secondary); + font-size: var(--text-caption); margin: 0; } diff --git a/B06_Section/B06_Section_UI_Style_Cross_Controls.css b/B06_Section/B06_Section_UI_Style_Cross_Controls.css index 25eb1c938..bd25f8ad6 100644 --- a/B06_Section/B06_Section_UI_Style_Cross_Controls.css +++ b/B06_Section/B06_Section_UI_Style_Cross_Controls.css @@ -27,19 +27,6 @@ gap: 2px; } -.b06-structure-panel__toggle { - width: auto; - padding: 0 var(--spacing-8); -} - -/* 켜짐 색은 **주 액션 색**이다(2026-08-30 사용자: 붉은 채움이 경고처럼 보인다). - * 경고·삭제 자리를 비워 두고, 옵션이 켜졌다는 사실만 조용히 알린다. */ -.b06-structure-panel__toggle.is-on { - border-color: var(--color-primary); - background: var(--color-primary); - color: var(--color-primary-text); -} - .b06-structure-panel.is-hidden, .b06-structure-panel__value span.is-hidden, .b06-structure-panel__btn.is-hidden, @@ -105,15 +92,6 @@ grid-area: equal; } -.b06-structure-panel__controls .b06-structure-panel__btn { - box-sizing: border-box; - width: 26px; - height: 22px; - padding: 0; - text-align: center; - line-height: 1; -} - .b06-structure-panel__hval { box-sizing: border-box; width: 3.5em; @@ -187,24 +165,8 @@ font-size: var(--text-caption); } -.b06-structure-panel__btn { - padding: 0 var(--spacing-8); - border: 1px solid var(--color-border); - border-radius: var(--radius-inputs); - background: var(--color-surface); - color: var(--color-text-secondary); - cursor: pointer; - font-size: var(--text-caption); - line-height: 1.6; -} - -.b06-structure-panel__btn:hover { - border-color: var(--color-danger); - color: var(--color-danger); -} - +/* 단추 = 부품 아이콘 단추(선) 22 · 닫기 ✕ 만 고스트(553-2) */ .b06-structure-panel__close { - padding: 0 4px; border-color: transparent; background: transparent; } @@ -225,7 +187,7 @@ .b06-cross-card__line-dims { align-self: center; padding: 1px var(--spacing-4); - color: var(--color-royal-amethyst); + color: var(--color-accent); font-size: 0.75rem; line-height: 1.25; text-align: right; @@ -236,27 +198,9 @@ display: none; } -.b06-cross-card__zoom-btn { - width: 22px; - height: 22px; - padding: 0; - border: none; - border-left: 1px solid var(--color-border); - background: none; - color: var(--color-text-secondary); - font-size: 0.8rem; - line-height: 1; - cursor: pointer; -} - -.b06-cross-card__zoom-btn:first-child, -.b06-cross-card__line-dims[hidden] + .b06-cross-card__zoom-btn { - border-left: none; -} - -.b06-cross-card__zoom-btn:hover { - color: var(--color-text); - background: var(--color-surface); +/* 줌 단추 = 부품 아이콘 단추 22 · [칸에 넣기] = 단추 22 · [여럿] = 켜기 칩 22(553-2) — 부품 display 가 hidden 을 덮음 */ +.b06-cross-card__zoom-btn[hidden] { + display: none; } /* ── 좌측 [횡단 조정] 사본(2026-08-29 B05/B06 일원화) ───────────────────── @@ -288,11 +232,11 @@ border-top: 1px solid var(--color-border); } -.b06-adjust-dock > summary { +.b06-adjust-dock > .ui-collapsible__title { + margin: 0; color: var(--color-text-body); font-size: var(--text-caption); font-weight: var(--font-weight-medium); - cursor: pointer; } .b06-adjust-dock__empty { diff --git a/B06_Section/B06_Section_UI_Style_Cross_Detail.css b/B06_Section/B06_Section_UI_Style_Cross_Detail.css index 2466d491e..39fa31528 100644 --- a/B06_Section/B06_Section_UI_Style_Cross_Detail.css +++ b/B06_Section/B06_Section_UI_Style_Cross_Detail.css @@ -232,9 +232,6 @@ /* 고른 것 값(카드 179-1 꼴) · [칸에 넣기] — [+ − ⤢] 왼쪽 */ .b06-detail__commit { - width: auto; - padding: 0 var(--spacing-4); - color: var(--color-accent); white-space: nowrap; } diff --git a/resources/tester/test_108_drag_box_hit.py b/resources/tester/test_108_drag_box_hit.py index a5033b204..45533e4a1 100644 --- a/resources/tester/test_108_drag_box_hit.py +++ b/resources/tester/test_108_drag_box_hit.py @@ -115,7 +115,8 @@ def test_조정창은_제목과_단추만(out) -> None: """머리줄 = 제목 · 닫기(집수정 ↺ 없음) · BOX 오버레이 읽기 줄 = 끄는 중 미리 보기 하나.""" assert out["wall"]["diag1"]["overlayHead"] == [ "b06-structure-panel__title", - "b06-structure-panel__btn b06-structure-panel__close", + # 553-2 — 닫기 = 부품 아이콘 단추(선) 22 + 고스트 덮음 + "ui-icon-btn ui-icon-btn--outline b06-structure-panel__btn b06-structure-panel__close", ] assert out["box"]["left"]["value"] == ["b06-structure-panel__drag"] assert out["ford"]["diag"]["value"] == ["b06-structure-panel__drag"] diff --git a/resources/tester/test_179_1_line_dims_left.py b/resources/tester/test_179_1_line_dims_left.py index e1de5b0cd..c7934f7c2 100644 --- a/resources/tester/test_179_1_line_dims_left.py +++ b/resources/tester/test_179_1_line_dims_left.py @@ -17,11 +17,10 @@ def _src(rel: str) -> str: def test_좁은_카드_내림_규칙_없음(): css = _src("B06_Section/B06_Section_UI_Style_Cross_Controls.css") assert "@container" not in css - # 치수 칸 규칙은 기본 꼴 · 숨김(+ 옆 단추) 뿐 — 절대 자리 · 왼선 지움 규칙 없음 + # 치수 칸 규칙은 기본 꼴 · 숨김 뿐 — 절대 자리 · 왼선 지움 규칙 없음(553-2 줌 단추 = 부품 · 사이 금 없음) assert re.findall(r"\.b06-cross-card__line-dims[^{,;]*\{", css) == [ ".b06-cross-card__line-dims {", ".b06-cross-card__line-dims[hidden] {", - ".b06-cross-card__line-dims[hidden] + .b06-cross-card__zoom-btn {", ] diff --git a/resources/tester/test_196_1_b06_notice_chips.py b/resources/tester/test_196_1_b06_notice_chips.py index 82ea5dbb6..6eb9b5083 100644 --- a/resources/tester/test_196_1_b06_notice_chips.py +++ b/resources/tester/test_196_1_b06_notice_chips.py @@ -90,8 +90,17 @@ out.tags = chipsRow.children.map((c) => [c.tag, c.type]); """ ) assert got["v"]["chips"] == [ - ["성토 5m↑ 3", "false", "b06-section__notice-chip b06-section__notice-chip--warn"], - ["소단 검토 5", "false", "b06-section__notice-chip b06-section__notice-chip--info"], + # 553-2 — 칩 = 부품 단추(고스트) 20 + [ + "성토 5m↑ 3", + "false", + "ui-btn ui-btn--ghost b06-section__notice-chip b06-section__notice-chip--warn", + ], + [ + "소단 검토 5", + "false", + "ui-btn ui-btn--ghost b06-section__notice-chip b06-section__notice-chip--info", + ], ] assert got["tags"] == [["button", "button"], ["button", "button"]] assert got["v"]["panelHidden"] is True and got["v"]["rows"] == [] diff --git a/resources/tester/test_207_1_b06_notice_overlay.py b/resources/tester/test_207_1_b06_notice_overlay.py index 08b45a0f9..8255e6d89 100644 --- a/resources/tester/test_207_1_b06_notice_overlay.py +++ b/resources/tester/test_207_1_b06_notice_overlay.py @@ -39,9 +39,11 @@ const marks = () => panel2.children.map((b) => [b.dataset.stationId, b.classList def test_칩은_둥근_사각_공용_단추_반경_알약_아님(): + # 553-2 — 칩 = 부품 단추(고스트 · 둥근 사각) · 페이지는 색만 chip = _rule(".b06-section__notice-chip") - assert "border-radius: var(--radius-buttons)" in chip - assert "radius-pills" not in chip and "radius-sm" not in chip + assert "border-radius" not in chip and "radius-pills" not in chip + chips = (B06 / "B06_Section_UI_Cross_Notice_Chips.ts").read_text(encoding="utf-8") + assert "`ui-btn ui-btn--ghost b06-section__notice-chip" in chips def test_내용_칸은_흐름_밖_카드_위에_겹침():