feat(spreadsheet): C 격자 — 확대 이음(zoom() · aislo-grid-zoom 이벤트)

계약 더함 — GridHandle.zoom(): number(1 = 100%). 확대가 바뀔 때마다 격자 root 에서
CustomEvent("aislo-grid-zoom", { detail: { zoom }, bubbles: true }) 를 쏨(sub4 상태줄이 들음).
ORCA 시험 — WheelEvent(ctrlKey · deltaY -300) 로 확대 흉내 → zoom() 1→1.568 · 이벤트
detail.zoom 도 같은 값으로 확인.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VVM3xZ1aUPcUTuW2WZSnwg
This commit is contained in:
2026-09-27 22:35:54 +09:00
co-authored by Claude Sonnet 5
parent 5bea31ee5c
commit 7b294adca2
2 changed files with 8 additions and 0 deletions
@@ -399,6 +399,7 @@ export function createGrid(ctx: SpreadsheetContext): GridHandle {
paneBR.scrollLeft *= zoom / before;
paneBR.scrollTop *= zoom / before;
layoutPanes();
root.dispatchEvent(new CustomEvent("aislo-grid-zoom", { detail: { zoom }, bubbles: true }));
}
root.addEventListener("wheel", onWheel, { passive: false });
@@ -935,6 +936,10 @@ export function createGrid(ctx: SpreadsheetContext): GridHandle {
return { layer: paneLayerOf(r, c), box: screenBoxOf(r, c) };
}
function getZoom(): number {
return zoom;
}
function destroy(): void {
resize.disconnect();
paneBR.removeEventListener("scroll", onScroll);
@@ -954,6 +959,7 @@ export function createGrid(ctx: SpreadsheetContext): GridHandle {
reveal,
visibleRange,
editorSlot,
zoom: getZoom,
destroy,
};
}
@@ -69,6 +69,8 @@ export interface GridHandle {
visibleRange(): CellRange;
/** 편집기를 얹을 층과 칸 자리(화면 좌표 · 병합이면 전체) — D 편집기가 씀 */
editorSlot(r: number, c: number): { layer: HTMLElement; box: CellBox };
/** 지금 확대(1 = 100%) — 바뀌면 `root` 에서 CustomEvent("aislo-grid-zoom", { detail: { zoom } }) 를 쏨(E 상태줄이 들음) */
zoom(): number;
destroy(): void;
}