From 5e92e37b77552bded1d0d59ae3f7b19050b176ad Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 29 Sep 2026 08:45:24 +0900 Subject: [PATCH] =?UTF-8?q?feat(spreadsheet):=20=EC=95=8C=EC=95=BD=20?= =?UTF-8?q?=EB=A7=89=EB=8C=80=EB=A5=BC=20=EC=8B=9C=ED=8A=B8=20=EC=95=84?= =?UTF-8?q?=EB=9E=98=20=C2=B7=20=EC=83=81=ED=83=9C=EC=A4=84=20=EC=9C=84?= =?UTF-8?q?=EB=A1=9C=20=EC=98=AE=EA=B9=80=20=E2=80=94=20=EC=9E=90=EC=9E=AC?= =?UTF-8?q?=20=EA=B3=A0=EB=A5=B4=EA=B8=B0=20=EC=B0=BD=EC=9D=80=20=EB=A7=89?= =?UTF-8?q?=EB=8C=80=20=EC=9C=84=EB=A1=9C=20=EC=97=B6?= 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_01L6KXAabDTenEU7hrDQmCKY --- A00_Common/spreadsheet/spreadsheet.ts | 2 +- A00_Common/spreadsheet/spreadsheet_links.css | 4 ++-- A00_Common/spreadsheet/spreadsheet_links.ts | 7 ++++--- .../tester/spreadsheet/test_spreadsheet_d_input.py | 10 ++++++++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/A00_Common/spreadsheet/spreadsheet.ts b/A00_Common/spreadsheet/spreadsheet.ts index 6a60d745..f36b5c5c 100644 --- a/A00_Common/spreadsheet/spreadsheet.ts +++ b/A00_Common/spreadsheet/spreadsheet.ts @@ -57,7 +57,7 @@ export interface SpreadsheetOptions { onSelect?: (selection: { 시트: string; 칸: string; 범위: string }) => void; /** 아래 시트 탭 줄 — false 면 안 그림(산출근거 = 시트 하나) · 시트 오가기 · 새 시트 단축키 · 시트 메뉴도 끔 */ tabs?: boolean; - /** 위 알약 막대 — 입력값 · 자재를 칸에 연결(`spreadsheet_links.ts` · 이때만 불러옴) */ + /** 아래 알약 막대(상태줄 위) — 입력값 · 자재를 칸에 연결(`spreadsheet_links.ts` · 이때만 불러옴) */ links?: LinkOptions; } diff --git a/A00_Common/spreadsheet/spreadsheet_links.css b/A00_Common/spreadsheet/spreadsheet_links.css index 695b3b97..b61fdf11 100644 --- a/A00_Common/spreadsheet/spreadsheet_links.css +++ b/A00_Common/spreadsheet/spreadsheet_links.css @@ -1,4 +1,4 @@ -/* spreadsheet_links.css (주인 D) — 위 알약 막대 · 연결 칸 세모 · 자재 고르기 창 */ +/* spreadsheet_links.css (주인 D) — 아래 알약 막대 · 연결 칸 세모 · 자재 고르기 창 */ .ss-links { display: flex; @@ -6,7 +6,7 @@ flex-wrap: wrap; gap: var(--spacing-4); padding: var(--spacing-4) var(--spacing-8); - border-bottom: 1px solid var(--color-border); + border-top: 1px solid var(--color-border); background: var(--color-surface); } diff --git a/A00_Common/spreadsheet/spreadsheet_links.ts b/A00_Common/spreadsheet/spreadsheet_links.ts index 348ee8e2..edf2e5cc 100644 --- a/A00_Common/spreadsheet/spreadsheet_links.ts +++ b/A00_Common/spreadsheet/spreadsheet_links.ts @@ -1,6 +1,6 @@ /* ============================================================================= * spreadsheet_links.ts (주인 D) - * 위 알약 막대 — 면적산출(입력값) · 재료산출(자재) 알약을 칸에 연결(PLAN 13장). + * 아래 알약 막대(시트 아래 · 상태줄 위) — 면적산출(입력값) · 재료산출(자재) 알약을 칸에 연결(PLAN 13장). * 칸을 고른 채 밝은 알약을 누르면 그 칸에 연결(알약 흐려짐 + 칸 주소 · 칸 왼아래 작은 세모) · * 흐린 알약을 누르면 연결 칸으로 · 우클릭 [연결 풀기] · 자재 모드는 [자재 더하기] → 고르기 창 → 새 알약. * 자재 모드 알약 목록 = 호스트(M02)가 `항목` 으로 줌(자재 정보 포함 · 저장은 마스터 자재 조합) — [자재 더하기] · @@ -127,7 +127,8 @@ export function mountLinks( slot: typeof slotOf, ): Links { const bar = el("div", { className: "ss-links", attrs: { title: TEXT.bar } }); - if (opts) ctx.root.prepend(bar); + // 시트 아래 · 상태줄 위(시트는 flex 라 막대 높이만큼 줄어듦) + if (opts) ctx.root.insertBefore(bar, ctx.root.querySelector(":scope > .ss-statusbar")); const menu = createMapContextMenu("ss"); ctx.root.append(menu.element); /** 알약 목록 — 호스트가 준 항목 + 더한 자재(자재 모드 · 바뀌면 호스트에 알림) */ @@ -323,7 +324,7 @@ export function mountLinks( const a = anchor.getBoundingClientRect(); const o = ctx.root.getBoundingClientRect(); pick.style.left = `${a.left - o.left}px`; - pick.style.top = `${a.bottom - o.top + 4}px`; + pick.style.bottom = `${o.bottom - bar.getBoundingClientRect().top + 4}px`; // 막대 위로 엶 ctx.root.append(pick); document.addEventListener("mousedown", onOutside, true); diff --git a/resources/tester/spreadsheet/test_spreadsheet_d_input.py b/resources/tester/spreadsheet/test_spreadsheet_d_input.py index 71a8495e..bb765680 100644 --- a/resources/tester/spreadsheet/test_spreadsheet_d_input.py +++ b/resources/tester/spreadsheet/test_spreadsheet_d_input.py @@ -113,6 +113,16 @@ def test_links_follow_rows_cols(r): assert r["links"] == ["L:B7,W:D5", "L:B7", "L:B7,W:D5", "L:B5,W:D3", "D1"] +def test_links_bar_sits_under_sheet(): + # 알약 막대 = 시트 아래 · 상태줄 위 · 자재 고르기 창은 막대 위로 엶 + with open( + os.path.join(HERE, "../../../A00_Common/spreadsheet/spreadsheet_links.ts"), encoding="utf-8" + ) as f: + src = f.read() + assert 'insertBefore(bar, ctx.root.querySelector(":scope > .ss-statusbar"))' in src + assert "pick.style.bottom = `${o.bottom - bar.getBoundingClientRect().top + 4}px`" in src + + def test_typed_format(r): assert r["typedFormat"] == ["0%", "0.0%", "#,##0.0", "#,##0", None, None, None]