feat(393-1): B05 우측 횡단 판 기본 접힘 — 옛 열림 기억 한 번 버림(-v2) · 측점 눈금 자동 열림은 기억 안 함 · 손잡이로 연 것만 기억

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XWh5wNNycMkbwMpACz1rte
This commit is contained in:
2026-10-17 17:23:07 +09:00
co-authored by Claude Opus 5.5
parent 0fef925456
commit dec208f11a
4 changed files with 26 additions and 10 deletions
@@ -149,7 +149,7 @@ export function createRouteEditChrome(
overlay.querySelector('[data-slot="tools"]')!.replaceWith(...tools);
// 횡단 미리보기 = 패널 양식(382-1 · 손잡이 · 머리 · 폭 끌기 · 열림 · 폭 기억) · 자리는 지도 위 덮개 그대로 ·
// 기억이 없으면 좁은 화면은 접힌 채 시작(지도가 먼저다) · 잰 값 창이 판을 비킴(--b05-side-open).
// 기본 접힘(393-1 · 키 -v2 = 옛 열림 기억 한 번 버림) · 손잡이로 연 것만 기억 · 잰 값 창이 판을 비킴(--b05-side-open).
const side = document.createElement("div");
side.className = "b05-routeedit__side";
const setSideOpen = (): void =>
@@ -158,9 +158,9 @@ export function createRouteEditChrome(
`${(panels.current() ? panels.width() : 0) + SIDE_HANDLE_PX}px`,
);
const panels = createSidePanels({
prefKey: "b05-routeedit-cross",
prefKey: "b05-routeedit-cross-v2",
panels: [{ id: "cross", title: "횡단", body: side }],
defaultOpen: window.innerWidth >= 1500 ? "cross" : null,
defaultOpen: null,
defaultWidth: 460,
follow: false,
onChange: setSideOpen,
@@ -287,7 +287,7 @@ export function createCrossPreview(params: CrossPreviewParams): CrossPreviewWind
shown = null;
redraw();
const panels = sidePanelsOf.get(params.side);
if (panels && panels.current() === null) panels.open("cross");
if (panels && panels.current() === null) panels.open("cross", false); // 열되 기억 안 함(393-1)
}
/** 다른 보기(종단 · 3D · 목록 · 횡단 카드) 고름 → 일반측점이면 그 측점 횡단 · 구조물이면 마름모. */
@@ -49,10 +49,22 @@ def test_겉틀은_본문_칸():
# 시험 · 배선이 집는 자리는 남김
assert "b05-routeedit__measure-close" in chrome
# 382-1 — 오른쪽 횡단 판 = 패널 양식(손잡이 · 머리 · 폭 끌기 · 열림 · 폭 기억) · 칸 높이를 채움
assert "createSidePanels({" in chrome and 'prefKey: "b05-routeedit-cross"' in chrome
assert "createSidePanels({" in chrome and 'prefKey: "b05-routeedit-cross-v2"' in chrome
assert "follow: false" in chrome and 'data-act="side-toggle"' not in chrome
def test_393_1_횡단_판_기본_접힘_자동_열림은_기억_안_함():
chrome = _read("B05_Profile_UI_RouteEdit_Chrome.ts")
assert "defaultOpen: null," in chrome and "innerWidth >= 1500" not in chrome
# 측점 눈금 → 열되 기억 안 함 · 손잡이(누름)만 기억
cross = _read("B05_Profile_UI_RouteEdit_Cross.ts")
assert 'panels.open("cross", false)' in cross
side = (ROOT / "ui_template" / "ui_template_side_panels.ts").read_text(encoding="utf-8")
assert "function open(id: string | null, remember = true): void {" in side
assert "JSON.stringify({ open: kept, width })" in side
assert "if (remember) {\n kept = next;\n save();" in side
def test_CSS_덮개_걷음_대기막은_전체():
css = _read("B05_Profile_UI_Style_RouteEdit.css")
root = _block(css, ".b05-routeedit")
+9 -5
View File
@@ -49,8 +49,8 @@ export interface SidePanelsOpts {
export interface SidePanels {
root: HTMLElement;
/** 열 패널(null = 모두 접음) — 기억함 */
open(id: string | null): void;
/** 열 패널(null = 모두 접음) — 기억함 · remember 거짓 = 이번 화면만(자동 열림) */
open(id: string | null, remember?: boolean): void;
current(): string | null;
width(): number;
}
@@ -82,7 +82,8 @@ export function createSidePanels(opts: SidePanelsOpts): SidePanels {
? (ids[0] ?? null)
: opts.defaultOpen;
let width = clampSideWidth(pref.width ?? opts.defaultWidth ?? 420, min, window.innerWidth);
const save = (): void => writeByKey(key, JSON.stringify({ open: now, width }));
let kept = now; // 기억할 열림 — 자동 열림은 안 셈
const save = (): void => writeByKey(key, JSON.stringify({ open: kept, width }));
const root = el("div", { className: "ui-side-panels" });
root.style.setProperty("--ui-side-panels-width", `${width}px`);
@@ -159,12 +160,15 @@ export function createSidePanels(opts: SidePanelsOpts): SidePanels {
root.classList.toggle("is-collapsed", now === null);
};
function open(id: string | null): void {
function open(id: string | null, remember = true): void {
const next = id !== null && ids.includes(id) ? id : null;
const was = now;
now = next;
draw();
save();
if (remember) {
kept = next;
save();
}
if (next !== was) opts.onChange?.(next);
}