From 74a524202ec837a95f84d754e2aed3c6c10fbe01 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 4 Oct 2026 22:26:00 +0900 Subject: [PATCH] =?UTF-8?q?feat(M02):=20=EA=B5=AC=EC=A1=B0=EB=AC=BC=20?= =?UTF-8?q?=EC=A1=B0=ED=95=A9=20=EC=B9=B4=EB=93=9C=20=EC=85=8B=203?= =?UTF-8?q?=EC=97=B4=20=C2=B7=20=EB=8B=A8=EC=B6=94=20=E3=80=8C=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EA=B8=B0=E3=80=8D=20=C2=B7=20=E3=80=8C?= =?UTF-8?q?=EC=88=98=EC=A0=95=E3=80=8D=20=C2=B7=20=E3=80=8C=EC=83=88=20?= =?UTF-8?q?=ED=95=AD=EB=AA=A9=E3=80=8D=20=EA=B3=B5=EC=9A=A9=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=ED=81=AC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 40-2 ①~③ — 상세 칸 960px 아래 1열(상세 칸 폭 container query) · 카드 [수정] 툴팁에 무엇을 고치는지 · 「새 항목」 = 저장과 같은 크기. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016PSXsvyDxjNmufteN5bqmt --- .../M02_MasterTemplete_ItemCards.ts | 13 +++++++------ .../M02_MasterTemplete_Structure.css | 16 +++++++++++----- M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts | 2 +- resources/tester/test_m02_card_shell.py | 2 +- resources/tester/test_m02_tree_paste.py | 2 +- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts b/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts index deb7368db..04f748bf9 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_ItemCards.ts @@ -56,10 +56,10 @@ export const PART_WORD: Record = { const TEXT = { drawingInfo: "도면 정보", - edit: "도면 수정", + edit: "수정", // 카드 셋 같은 글(40-2) — 무엇을 고치는지는 툴팁 noNumber: "도번 없음", noDrawing: "도면 없음", - editSheet: "{value} 수정", + editTip: "{value} 수정 — 전체 편집 화면", noSheetDoc: "{value} 없음", noFieldNumber: "{value} 없음", noSheet: "스프레드시트를 못 띄움 — {value}", @@ -68,7 +68,7 @@ const TEXT = { sheetHelp: "단축키 — 칸을 고르고 바로 침", pills: "알약", pillsTip: "아래 알약 줄 보임 · 숨김", - take: "복사해 가져오기", + take: "가져오기", takeTip: "다른 항목의 {value} 을(를) 골라 이 칸에 덮어씀 — 번호 · 열은 그대로", blank: "비어 있음 — 새로 만들거나 다른 항목에서 복사해 옴", makeNew: "새로 만들기", @@ -209,10 +209,11 @@ export function createItemCards(opts: ItemCardsOptions): ItemCardsHandle { kind === "structure" ? DRAWING_KEYS : SHEET_KEYS, ); const edit = createButton({ - label: kind === "structure" ? TEXT.edit : fill(TEXT.editSheet, PART_WORD[kind]), + label: TEXT.edit, variant: "ghost", size: "sm", }); + edit.title = fill(TEXT.editTip, PART_WORD[kind]); edit.addEventListener("click", () => (kind === "labor" ? opts.labor?.() : opts.onEdit(kind))); const take = createButton({ label: TEXT.take, variant: "ghost", size: "sm" }); take.title = fill(TEXT.takeTip, PART_WORD[kind]); @@ -325,8 +326,8 @@ export function createItemCards(opts: ItemCardsOptions): ItemCardsHandle { const cards: Card[] = [info, ...(laborCard ? [laborCard] : []), ...sheets]; const defaults: Record = { structure: TEXT.edit, - area: fill(TEXT.editSheet, PART_WORD.area), - labor: fill(TEXT.editSheet, PART_WORD.labor), + area: TEXT.edit, + labor: TEXT.edit, }; const root = el("div", { diff --git a/M02_MasterTemplete/M02_MasterTemplete_Structure.css b/M02_MasterTemplete/M02_MasterTemplete_Structure.css index fb4c86d4a..133551038 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_Structure.css +++ b/M02_MasterTemplete/M02_MasterTemplete_Structure.css @@ -1,4 +1,4 @@ -/* M02 구조물집계표 아래 설계 컨테이너 — 카드 셋(도면 정보 · 면적산출 · 재료산출) · +/* M02 구조물집계표 아래 설계 컨테이너 — 카드 셋(도면 정보 · 일위대가 · 면적산출) · 카드 모양은 좌측 패널과 같은 공용 ui-sidebar-*(ui_template_overlay.css). */ /* 표 밖 형제 자리 — 비어 있을 때 메인 간격이 벌어지지 않게 칸을 지움. */ @@ -6,8 +6,8 @@ display: contents; } -/* 카드 넷(도면 정보 · 면적산출 · 재료산출 · 선택 입력) = 2행 2열 · 카드 높이 = 화면 높이에 맞춰 크게(PLAN 31-6) · - 칸이 좁으면(720px 아래) 1열 */ +/* 카드 셋(도면 정보 · 일위대가 · 면적산출) = 1행 3열(40-2) · 카드 높이 = 화면 높이에 맞춰 크게(PLAN 31-6) · + 상세 칸이 좁으면 1열 */ .m02-struct { /* 카드 본문은 카드 높이를 채움 — 넘치면 카드 안에서 스크롤 */ --m02-struct-body-min: 0; @@ -17,13 +17,19 @@ display: grid; flex: none; grid-auto-rows: var(--m02-struct-card-h); - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: repeat(3, minmax(0, 1fr)); /* 도면 · 일위대가 · 면적산출(40-2) */ padding-top: var(--spacing-12); border-top: 1px solid var(--color-border); min-width: 0; } -@media (max-width: 720px) { +/* 상세 칸이 좁으면(카드 하나 300px 아래) 1열 — 좌측 패널을 접어도 맞게 상세 칸 폭으로 잼 + (카드 자리 `m02-main__extra` 는 상자 없음 — 상세 칸이 잣대) */ +.m02-main:has(> .m02-main__extra > .m02-struct) { + container-type: inline-size; +} + +@container (max-width: 960px) { .m02-struct { grid-template-columns: minmax(0, 1fr); } diff --git a/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts b/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts index d70207bdb..64343243f 100644 --- a/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts +++ b/M02_MasterTemplete/M02_MasterTemplete_UI_Main.ts @@ -113,7 +113,7 @@ export interface MainExtras { /** 상세 제목 줄 오른쪽 끝 「새 …」 단추 — 공용 모양 `m02-main__new`(일위대가 「새 조합」과 같게 · 30-5) */ export function newItemButton(run: () => void, label = L("M02_TreeNewItem")): HTMLElement { - const button = createButton({ label, variant: "filled", size: "sm" }); + const button = createButton({ label, variant: "filled" }); // 공용 버튼 크기(40-2 · 저장과 같음) button.classList.add("m02-main__new"); button.addEventListener("click", run); return button; diff --git a/resources/tester/test_m02_card_shell.py b/resources/tester/test_m02_card_shell.py index 086b74207..ae89a8b8e 100644 --- a/resources/tester/test_m02_card_shell.py +++ b/resources/tester/test_m02_card_shell.py @@ -40,7 +40,7 @@ def test_저장_단추_알림_한_벌(): def test_네_카드가_틀을_씀_수정_단추_한_모양(): cards = _text("M02_MasterTemplete_ItemCards.ts") assert "const shell = cardShell({ title, body, sub: [no, name] });" in cards - assert "shell.tools.append(help, saver.button, take, edit);" in cards # 복사해 가져오기(39-5) + assert "shell.tools.append(help, saver.button, take, edit);" in cards # 가져오기(39-5 · 40-2) assert 'variant: "filled"' not in cards # [수정] 은 모두 빈 단추(ghost) assert "c.saver.button.hidden = c.help.hidden = !can;" in cards # [저장] · ? 늘 보임 assert "DRAWING_KEYS" in cards and "SHEET_KEYS" in cards diff --git a/resources/tester/test_m02_tree_paste.py b/resources/tester/test_m02_tree_paste.py index 67b2786eb..9b40d26dd 100644 --- a/resources/tester/test_m02_tree_paste.py +++ b/resources/tester/test_m02_tree_paste.py @@ -138,7 +138,7 @@ def test_항목_추가_창_카드_격자_표_접기(): assert "일위대가:" not in panel and "pickCombo" not in panel + dlg # 39-1d — 고르기 줄 없음 assert "askNewItem({" in panel and "M02_TreeUnit" not in panel css = (m02 / "M02_MasterTemplete_Structure.css").read_text("utf-8") - assert "grid-template-columns: repeat(2, minmax(0, 1fr));" in css + assert "grid-template-columns: repeat(3, minmax(0, 1fr));" in css # 카드 셋 3열(40-2) assert "grid-auto-rows: var(--m02-struct-card-h);" in css assert "--m02-struct-card-h: min(640px, 70vh);" in css # 31-6 화면 높이에 맞춤 assert "flex: 1 0 var(--m02-struct-grid-min);" in css # 엑셀 격자가 카드 높이를 채움