From f601bc3016daa91f40708a47715a55475a116f70 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 17 Oct 2026 19:38:28 +0900 Subject: [PATCH] =?UTF-8?q?feat(393-3):=20B05=20=EC=9A=B0=EC=B8=A1=20?= =?UTF-8?q?=E3=80=8C=ED=9A=A1=EB=8B=A8=E3=80=8D=20=C2=B7=20=E3=80=8C?= =?UTF-8?q?=EC=9D=B4=EC=A0=84=20=ED=9A=A1=EB=8B=A8=E3=80=8D=20=EC=B9=B8=20?= =?UTF-8?q?=3D=20=EA=B7=B8=EB=9E=98=ED=94=84=EB=A7=8C=20=E2=80=94=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=A8=B8=EB=A6=AC=20=C2=B7=20=EC=A4=8C=20?= =?UTF-8?q?=EB=8B=A8=EC=B6=94=20=C2=B7=20=EB=B0=9C=20=EC=A4=84(=EC=95=94?= =?UTF-8?q?=20=EA=B2=BD=EA=B3=84=20=C2=B7=20=EC=9A=94=EC=95=BD)=20=C2=B7?= =?UTF-8?q?=20=ED=8C=90=20=EC=95=84=EB=9E=98=20=EC=9A=94=EC=95=BD=20?= =?UTF-8?q?=EC=A4=84=20=C2=B7=20=EC=83=81=EC=9E=90=20=ED=85=8C=EB=91=90?= =?UTF-8?q?=EB=A6=AC=20=EA=B1=B7=EC=9D=8C=20=C2=B7=20=EA=B7=B8=EB=9E=98?= =?UTF-8?q?=ED=94=84=EA=B0=80=20=EC=B9=B8=20=ED=8F=AD=20=C2=B7=20=EB=86=92?= =?UTF-8?q?=EC=9D=B4=EB=A5=BC=20=EB=8B=A4=20=EC=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01XWh5wNNycMkbwMpACz1rte --- B05_Profile/B05_Profile_UI_RouteEdit_Cross.ts | 4 ++-- .../B05_Profile_UI_RouteEdit_Cross_Card.ts | 16 +++++++--------- .../B05_Profile_UI_Style_RouteEdit.css | 10 +++++++--- .../tester/test_b05_routeedit_cross_width.py | 19 +++++++++++++++++++ 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/B05_Profile/B05_Profile_UI_RouteEdit_Cross.ts b/B05_Profile/B05_Profile_UI_RouteEdit_Cross.ts index d3593c60b..14276f371 100644 --- a/B05_Profile/B05_Profile_UI_RouteEdit_Cross.ts +++ b/B05_Profile/B05_Profile_UI_RouteEdit_Cross.ts @@ -133,7 +133,7 @@ function createPane(title: string, empty: string): CrossPane { let drawn: CrossPreviewResponse | null = null; let size = { width: 0, height: 0 }; let zoom: ZoomPanState | undefined; - /** B06 카드 재료(393-2) · 카드 머리 · 발 높이(그림 높이 = 판 − 이것) · 측점 간격. */ + /** B06 카드 재료(393-2) · 카드가 그림 밖에 더 쓰는 높이(그림 높이 = 판 − 이것) · 측점 간격. */ let source: RouteCrossSource | null = null; let chrome = 0; let interval = 20; @@ -206,7 +206,7 @@ function createPane(title: string, empty: string): CrossPane { // 목록이 쓰는 그 규칙이다. 서버가 주는 `STA.0+100.000` 을 그대로 쓰면 표기가 갈린다. station.textContent = formatStation(preview.chainage_m, intervalM); draw(preview); - foot.textContent = summarizeCross(preview); + foot.textContent = source ? "" : summarizeCross(preview); // 카드 = 그래프만(393-3) }, wait(text) { box.replaceChildren(); diff --git a/B05_Profile/B05_Profile_UI_RouteEdit_Cross_Card.ts b/B05_Profile/B05_Profile_UI_RouteEdit_Cross_Card.ts index 9b1255c38..29b7ab62f 100644 --- a/B05_Profile/B05_Profile_UI_RouteEdit_Cross_Card.ts +++ b/B05_Profile/B05_Profile_UI_RouteEdit_Cross_Card.ts @@ -6,7 +6,8 @@ * · 자료 = 새 노선 상세(계산 묶음) · 없으면 받아 둔 저장 상세 · 노선 초안 중 새 상세가 아직 없으면 없음 * (판은 옛 선 그림 `_Cross_Draw` 로 · 종단 임시 횡단 창도 그것 그대로) * · 단면 사본(station_id 앞머리 · design 사본) — B06 고름 · 줌 기억 · 면적 원본을 안 건드림 - * · 구조물 자리 · 암 경계 = 정본만 읽는 제어기(`Structure_Layouts` · 세월교 · 박스 조정값) · 누름 막음(줌 단추만) + * · 구조물 자리 · 암 경계 = 정본만 읽는 제어기(`Structure_Layouts` · 세월교 · 박스 조정값) · 누름 막음 + * · 그래프만(393-3) — 카드 머리 · 줌 단추 · 발 줄 걷음 · 그래프가 판 칸을 다 씀 * ========================================================================== */ import "../B06_Section/B06_Section_UI_Style_Cross_Controls.css"; @@ -129,13 +130,10 @@ export function routeCrossCard( ford, box, ); - // 읽기 전용 — 벽 · 선 · 면적 고름을 막음(줌 단추만 통과) - card.addEventListener( - "click", - (event) => { - if (!(event.target as Element).closest("button")) event.stopPropagation(); - }, - true, - ); + // 그래프만(393-3) — 카드 머리 · 줌 단추 · 발(암 경계 · 요약) 걷음 · 벽 · 선 · 면적 고름 막음 + card + .querySelectorAll(":scope > header, :scope > footer, .b06-cross-card__zoom") + .forEach((el) => el.remove()); + card.addEventListener("click", (event) => event.stopPropagation(), true); return card; } diff --git a/B05_Profile/B05_Profile_UI_Style_RouteEdit.css b/B05_Profile/B05_Profile_UI_Style_RouteEdit.css index e77dcbe77..9bf9c4b2a 100644 --- a/B05_Profile/B05_Profile_UI_Style_RouteEdit.css +++ b/B05_Profile/B05_Profile_UI_Style_RouteEdit.css @@ -254,7 +254,12 @@ background: var(--color-surface); } -/* B06 횡단 카드 읽기 전용(393-2) — 판 상자가 테두리 · 고름 강조 · 손가락 없음. */ +/* B06 횡단 카드 읽기 전용(393-2) · 그래프만(393-3) — 테두리 · 고름 강조 · 손가락 없음 · 칸을 다 씀. */ +.b05-routeedit__cross-box:has(> .b06-cross-card) { + border: 0; + border-radius: 0; +} + .b05-routeedit__cross-box > .b06-cross-card { border: 0; border-radius: 0; @@ -262,8 +267,7 @@ cursor: default; } -/* 발 줄 조정 단추(암 경계 등) = 읽기 전용이라 숨김 */ -.b05-routeedit__cross-box > .b06-cross-card > footer button { +.b05-routeedit__cross-foot:empty { display: none; } diff --git a/resources/tester/test_b05_routeedit_cross_width.py b/resources/tester/test_b05_routeedit_cross_width.py index 4f95bc83f..c29a984ea 100644 --- a/resources/tester/test_b05_routeedit_cross_width.py +++ b/resources/tester/test_b05_routeedit_cross_width.py @@ -104,3 +104,22 @@ def test_393_판_그림은_B06_카드_사본_노선_고치면_전후(results): def test_393_1_눈금이_연_판은_기억_안_함(results): assert results["planClick"]["panel"] == "cross" assert results["planClick"]["remember"] is False + + +def test_393_3_판_칸은_그래프만(): + b05 = os.path.join(os.path.dirname(os.path.dirname(HERE)), "B05_Profile") + + def read(name): + with open(os.path.join(b05, name), encoding="utf-8") as file: + return file.read() + + card = read("B05_Profile_UI_RouteEdit_Cross_Card.ts") + # 카드 머리(측점 · 알약) · 발(암 경계 · 요약) · 줌 단추 걷음 · 누름 전부 막음 + assert ':scope > header, :scope > footer, .b06-cross-card__zoom"' in card + assert '"click", (event) => event.stopPropagation(), true' in card + cross = read("B05_Profile_UI_RouteEdit_Cross.ts") + assert 'foot.textContent = source ? "" : summarizeCross(preview);' in cross + css = read("B05_Profile_UI_Style_RouteEdit.css") + assert ".b05-routeedit__cross-box:has(> .b06-cross-card) {" in css + assert ".b05-routeedit__cross-foot:empty {\n display: none;" in css + assert "footer button" not in css