feat(종단보기): 345-5 평면 = 가운데 전체 영역 · 아래 종단 판 = 다시 뜬 판 — 종단 보기 판 흐름 규칙을 횡단 보기만으로 되돌림(345-3 앞 꼴) · 끌어 높이 · 접기 · 새 창 떼기 그대로 · 가려진 아래쪽은 팬으로

- 시험: test_345_5_plan_full_overlay 3(전체 영역 · 뜬 판 · 띠 없음 · 종단 그래프 있음) · test_345_3 판 시험 고쳐 씀 · 관련 162 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Se7ytqbohmBQnfYpwYFnYf
This commit is contained in:
2026-10-16 11:59:27 +09:00
co-authored by Claude Opus 5.5
parent cfeca9c647
commit cebed851b5
4 changed files with 81 additions and 8 deletions
+3 -3
View File
@@ -10,8 +10,8 @@
display: none;
}
/* 가운데 = 위 칸(보기마다 다름) + 아래 종단도 한 벌. 종단도는 두 보기 모두 위 칸 아래 흐름에
선다(345-3 — 종단 보기 위 칸 = 평면 노선 편집 · 3D 는 모달) · 높이 끌기는 그대로. */
/* 가운데 = 위 칸(보기마다 다름) + 아래 종단도 한 벌. 종단 보기에서 종단도는 평면(노선 편집) 위에
떠 있는 판(absolute · 평면은 전체 영역 · 345-5)이고, 횡단 보기에서는 카드 칸 아래 흐름에 선다. */
.design-page__main {
position: relative;
display: flex;
@@ -35,7 +35,7 @@
min-height: 0;
}
.design-page__main > .design-page__profile > .b05-route-profile {
.design-page__main[data-view="cross"] > .design-page__profile > .b05-route-profile {
position: relative;
flex: none;
}
+2 -2
View File
@@ -36,8 +36,8 @@
}
/* 하단 종단 패널: 그래프 + 12행 도면 테이블을 담기 위해 화면 높이의 60%를 차지한다.
페이지 안에서는 위 칸(평면 · 횡단 카드) 아래 **흐름**에 선다(`design_page.css` · 345-3) —
여기 absolute 는 페이지 밖 쓰임 꼴. 접기 핸들로 내리면 위 칸이 전체 영역을 갖는다. */
평면(노선 편집)을 밀어내지 않고 그 위를 덮는 오버레이로 띄운다(345-5) — 판을 여닫아도 평면
크기가 안 바뀜 · 가려진 아래쪽은 팬으로 봄. 횡단 보기에서는 카드 칸 아래 흐름(`design_page.css`). */
.b05-route-profile {
position: absolute;
z-index: 3;
+6 -3
View File
@@ -78,11 +78,14 @@ def test_편집기는_본문_페이지_수명():
assert len(view.splitlines()) <= 700
def test_종단도_판은_두_보기_모두_흐름():
def test_종단도_판은_횡단_보기만_흐름():
"""345-5 — 종단 보기는 다시 뜬 판(평면 위 오버레이) · 횡단 보기만 흐름."""
css = _read("A00_Common/design/design_page.css")
rule = _block(css, ".design-page__main > .design-page__profile > .b05-route-profile")
rule = _block(
css, '.design-page__main[data-view="cross"] > .design-page__profile > .b05-route-profile'
)
assert "position: relative;" in rule and "flex: none;" in rule
assert '[data-view="cross"] > .design-page__profile > .b05-route-profile' not in css
assert "\n.design-page__main > .design-page__profile > .b05-route-profile" not in css
def test_계획노선_칸_편집_단추_지움():
@@ -0,0 +1,70 @@
"""345-5 사용자 의견(요구 233) — 종단 보기 평면 = 가운데 전체 영역 · 아래 종단 판 = 뜬 판 ·
노선 편집 안 「원지반선 · 계획 종단선」 띠 없음 · 아래 종단 판 종단 그래프는 그대로.
꼴은 글로 봄(화면 확인은 브레인).
./venv/Scripts/python.exe -m pytest resources/tester/test_345_5_plan_full_overlay.py -q
"""
from __future__ import annotations
import re
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
def _read(rel: str) -> str:
return (ROOT / rel).read_text(encoding="utf-8")
def _block(css: str, selector: str) -> str:
found = re.search(rf"^{re.escape(selector)} \{{([^}}]*)\}}", css, re.M)
assert found, selector
return found.group(1)
def test_평면은_가운데_전체_영역():
page = _read("A00_Common/design/design_page.css")
main = _block(page, ".design-page__main")
assert "position: relative;" in main and "height: 100%;" in main
assert "flex: 1 1 auto;" in _block(page, ".design-page__center")
# 종단 보기에서 판을 흐름에 세우는 규칙 없음 — 가운데가 위아래 끝까지
flow = re.findall(r"^(\.design-page__main[^{\n]*\.b05-route-profile) \{", page, re.M)
assert flow == [
'.design-page__main[data-view="cross"] > .design-page__profile > .b05-route-profile'
]
route = _read("B05_Profile/B05_Profile_UI_Style_RouteEdit.css")
assert "flex: 1 1 auto;" in _block(route, ".b05-routeedit")
assert "flex: 1 1 auto;" in _block(route, ".b05-routeedit__canvas-wrap")
# 캔버스 크기 = 칸 크기(ResizeObserver) · 평면은 가운데 칸에 붙음
editor = _read("B05_Profile/B05_Profile_UI_RouteEdit.ts")
assert "new ResizeObserver(() => resize())" in editor
assert (
'sizeWatch.observe(overlay.querySelector<HTMLElement>(".b05-routeedit__canvas-wrap")!)'
in editor
)
view = _read("A00_Common/design/design_view_profile.ts")
assert "center.append(mainContent);" in view
assert "mountRouteEditor(mainContent, host, activeProjectId, rebuildAfterReplan," in view
def test_종단_판은_평면_위_뜬_판():
style = _read("B05_Profile/B05_Profile_UI_Style.css")
panel = _block(style, ".b05-route-profile")
for line in ("position: absolute;", "z-index: 3;", "bottom: 0;", "left: 0;", "right: 0;"):
assert line in panel
# 끌어 높이 · 접기 · 새 창 떼기 그대로
assert "height: var(--b05-profile-height, 60dvh);" in panel
assert ".b05-route-profile.is-collapsed > .ui-resizer" in style
page = _read("A00_Common/design/design_page.css")
assert "position: relative;" in _block(page, ".b05-route-profile.is-popout")
def test_띠_없음_종단_그래프_있음():
chrome = _read("B05_Profile/B05_Profile_UI_RouteEdit_Chrome.ts")
assert "data-strip" not in chrome
assert not (ROOT / "B05_Profile/B05_Profile_UI_RouteEdit_ProfileStrip.ts").exists()
# 아래 종단 판(종단 그래프 · 표 · 유토곡선)은 그대로 세움
view = _read("A00_Common/design/design_view_profile.ts")
assert "const profilePanel = createRouteProfilePanel(" in view
assert (ROOT / "B05_Profile/B05_Profile_UI_Profile_Panel.ts").exists()