@xom11/whiteboard 0.7.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -1
- package/dist/chunk-74VEEZBV.mjs +619 -0
- package/dist/chunk-74VEEZBV.mjs.map +1 -0
- package/dist/{chunk-BJX4YNA5.mjs → chunk-G7FR3AIV.mjs} +68 -12
- package/dist/chunk-G7FR3AIV.mjs.map +1 -0
- package/dist/{chunk-SHFOGORM.mjs → chunk-PDKKDZ4H.mjs} +4 -4
- package/dist/{chunk-SHFOGORM.mjs.map → chunk-PDKKDZ4H.mjs.map} +1 -1
- package/dist/chunk-PWIMZIB6.mjs +62 -0
- package/dist/chunk-PWIMZIB6.mjs.map +1 -0
- package/dist/{chunk-LPM4MM45.mjs → chunk-SBDMF4NQ.mjs} +3 -2
- package/dist/chunk-SBDMF4NQ.mjs.map +1 -0
- package/dist/chunk-WQOABS6N.mjs +197 -0
- package/dist/chunk-WQOABS6N.mjs.map +1 -0
- package/dist/{chunk-3SSQKRRO.mjs → chunk-ZVN356JZ.mjs} +4 -4
- package/dist/{chunk-3SSQKRRO.mjs.map → chunk-ZVN356JZ.mjs.map} +1 -1
- package/dist/geometry-2d.js +344 -228
- package/dist/geometry-2d.js.map +1 -1
- package/dist/geometry-2d.mjs +2 -2
- package/dist/geometry-3d.d.mts +1 -1
- package/dist/geometry-3d.d.ts +1 -1
- package/dist/geometry-3d.js +3411 -1277
- package/dist/geometry-3d.js.map +1 -1
- package/dist/geometry-3d.mjs +3 -2
- package/dist/graph-2d.js +360 -66
- package/dist/graph-2d.js.map +1 -1
- package/dist/graph-2d.mjs +2 -2
- package/dist/{host-T2W6R6SO.mjs → host-DJETSFCG.mjs} +272 -223
- package/dist/host-DJETSFCG.mjs.map +1 -0
- package/dist/{host-2QGKMGCT.mjs → host-LZH2FZ2N.mjs} +3 -3
- package/dist/{host-2QGKMGCT.mjs.map → host-LZH2FZ2N.mjs.map} +1 -1
- package/dist/host-N6ACNJKI.mjs +3226 -0
- package/dist/host-N6ACNJKI.mjs.map +1 -0
- package/dist/index.d.mts +133 -6
- package/dist/index.d.ts +133 -6
- package/dist/index.js +5634 -1999
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1231 -146
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -6
- package/dist/chunk-BJX4YNA5.mjs.map +0 -1
- package/dist/chunk-DJTBZEAR.mjs +0 -25
- package/dist/chunk-DJTBZEAR.mjs.map +0 -1
- package/dist/chunk-HM7RIXJE.mjs +0 -331
- package/dist/chunk-HM7RIXJE.mjs.map +0 -1
- package/dist/chunk-HYXFHEDJ.mjs +0 -129
- package/dist/chunk-HYXFHEDJ.mjs.map +0 -1
- package/dist/chunk-LPM4MM45.mjs.map +0 -1
- package/dist/host-T2W6R6SO.mjs.map +0 -1
- package/dist/host-XUFON6CQ.mjs +0 -1422
- package/dist/host-XUFON6CQ.mjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stamps/geometry-2d/renderInline.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-2d/serialize.ts","../src/stamps/geometry-2d/render.ts","../src/stamps/geometry-2d/types.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/handlers.ts","../src/stamps/geometry-2d/editor/MiniBoard.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/geometry-2d/editor/LeftPanel.tsx","../src/stamps/shared/excalidrawPalette.ts","../src/stamps/shared/useIsMobile.ts","../src/stamps/geometry-2d/editor/PropertiesPopover.tsx","../src/stamps/geometry-2d/editor/TransformParamPopover.tsx","../src/stamps/geometry-2d/editor/EditorPanel.tsx","../src/stamps/shared/useChordShortcut.ts","../src/stamps/shared/svgToImage.ts","../src/stamps/shared/insertImage.ts","../src/stamps/geometry-2d/host.tsx","../src/stamps/latex/render.ts","../src/stamps/latex/types.ts","../src/stamps/latex/editor/LeftPanel.tsx","../src/stamps/latex/editor/EditorPopover.tsx","../src/stamps/latex/host.tsx","../src/stamps/geometry-3d/serialize.ts","../src/stamps/geometry-3d/editor/theme.ts","../src/stamps/geometry-3d/editor/handlers.ts","../src/stamps/geometry-3d/editor/MiniBoard3D.tsx","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/stamps/geometry-3d/editor/tools.ts","../src/stamps/geometry-3d/editor/toolButtons.tsx","../src/stamps/geometry-3d/editor/LeftPanel.tsx","../src/stamps/geometry-3d/host.tsx","../src/stamps/graph-2d/serialize.ts","../src/stamps/graph-2d/parser.ts","../src/stamps/graph-2d/editor/handlers.ts","../src/stamps/graph-2d/renderObjects.ts","../src/stamps/graph-2d/render.ts","../src/stamps/graph-2d/types.ts","../src/stamps/graph-2d/editor/tools.ts","../src/stamps/graph-2d/editor/FunctionRow.tsx","../src/stamps/graph-2d/editor/SliderRow.tsx","../src/stamps/graph-2d/colors.ts","../src/stamps/graph-2d/editor/AlgebraView.tsx","../src/stamps/graph-2d/editor/LeftPanel.tsx","../src/stamps/graph-2d/editor/theme.ts","../src/stamps/graph-2d/editor/MiniBoard.tsx","../src/stamps/graph-2d/editor/EditorPanel.tsx","../src/stamps/graph-2d/host.tsx","../src/ExcalidrawWithMenus.tsx","../src/serialize.ts","../src/stamps/geometry-2d/index.tsx","../src/stamps/latex/index.tsx","../src/stamps/geometry-3d/index.tsx","../src/stamps/geometry-3d/render.ts","../src/stamps/graph-2d/index.tsx","../src/stamps/shared/registry.ts","../src/stamps/shared/ToolbarInjector.tsx","../src/stamps/shared/useShortcuts.ts","../src/stamps/shared/useStampDoubleClick.ts","../src/stamps/shared/useStampShortcutBlocker.ts","../src/stamps/shared/useStampClickOutside.ts","../src/stamps/shared/restoreStampFiles.ts","../src/core/persistence/sceneStore.ts","../src/core/persistence/fileStore.ts","../src/Whiteboard.tsx"],"names":["jsx","jsxs","hits","name","pick","sc","useRef","useId","useState","useCallback","useEffect","obj","stroke","Fragment","useMemo","createPortal","useLayoutEffect","rect","w","left","top","forwardRef","GeometryEditorPanel","useImperativeHandle","A_CODE","GeometryStampHost","init_render","init_types","Shell","Section","LeftPanel","init_LeftPanel","EditorPopover","host_exports","init_host","LatexStampHost","init_serialize","paletteFor","init_theme","radius","center","init_handlers","MiniBoard3D","p","init_EditorPanel","EditorPanel","init_tools","CloseIcon","UndoIcon","useToolHoverTooltip","TOOLTIP_DELAY_MS","Geometry3DStampHost","ResetViewIcon","scanRoots","init_MiniBoard","GraphEditorPanel","Graph2DStampHost","Excalidraw","MainMenu","Footer","WelcomeScreen","lazy","Suspense"],"mappings":"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","file":"index.js","sourcesContent":["export function renderGeometryToSvg(boardContainer: HTMLElement): string {\n const svgEl = boardContainer.querySelector('svg');\n if (!svgEl) throw new Error('renderGeometryToSvg: no SVG found in board container');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n return new XMLSerializer().serializeToString(clone);\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Creation log của JSXGraphMiniBoard lưu attrs dưới dạng \"sentinel\" string\n// (`@stroke`, `@axis`, `@grid`, `@label`) thay vì màu cụ thể. Khi:\n// 1. Editor render real-time → resolve theo `isDark` của editor.\n// 2. Offscreen re-render (sau reload / sau khi switch theme) → resolve theo\n// `isDark` của canvas Excalidraw hiện tại.\n//\n// Nhờ vậy stamp tự đổi màu khi user switch dark/light, giống các nét vẽ\n// native của Excalidraw.\n\nexport const themeStroke = (dark: boolean) => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean) => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean) => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean) => (dark ? '#e2e8f0' : '#000000');\n\nexport interface GeomPalette {\n stroke: string;\n axis: string;\n grid: string;\n label: string;\n}\n\nexport function paletteFor(isDark: boolean): GeomPalette {\n return {\n stroke: themeStroke(isDark),\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n };\n}\n\nconst SENTINEL_MAP: Record<string, keyof GeomPalette> = {\n '@stroke': 'stroke',\n '@axis': 'axis',\n '@grid': 'grid',\n '@label': 'label',\n};\n\n/**\n * Walk attrs object/array/string và thay sentinel bằng màu thực từ palette.\n * Đệ quy để hỗ trợ nested attrs (ví dụ polygon's `borders.strokeColor`).\n * Trả về object mới — input giữ nguyên (immutable, an toàn cho log).\n */\nexport function resolveAttrColors<T>(attrs: T, palette: GeomPalette): T {\n if (typeof attrs === 'string') {\n const key = SENTINEL_MAP[attrs];\n return (key ? palette[key] : attrs) as T;\n }\n if (Array.isArray(attrs)) {\n return attrs.map((a) => resolveAttrColors(a, palette)) as unknown as T;\n }\n if (attrs && typeof attrs === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(attrs as Record<string, unknown>)) {\n out[k] = resolveAttrColors(v, palette);\n }\n return out as T;\n }\n return attrs;\n}\n","// JSXGraph không có built-in getJSON. Component giữ MỘT LOG riêng của các create() call\n// do user trigger, pass log đó vào serializeBoard. Replay = gọi board.create() theo thứ tự log.\n//\n// type === 'transform': args là [refs đến điểm/đường/scalar], attrs là { type: 'translate'|'rotate'|'reflect'|'scale', ... }.\n// Object trả về (kết quả board.create('transform', ...)) được đăng ký vào idMap như mọi element khác\n// để point/line phụ thuộc reference được bằng id ('j5' → JSXGraph transform object).\n//\n// Log lưu màu dưới dạng sentinel ('@stroke', '@axis', '@grid', '@label') để\n// theme-neutral. Khi replay, palette resolve thành màu thực theo `isDark` hiện\n// tại (truyền qua options.palette).\n\nimport { paletteFor, resolveAttrColors, type GeomPalette } from './editor/theme';\n\nexport interface SerializedElement {\n type: string;\n args: unknown[];\n attrs: Record<string, unknown>;\n id: string;\n}\n\nexport interface SerializedBoard {\n bbox: [number, number, number, number];\n elements: SerializedElement[];\n showAxis?: boolean;\n showGrid?: boolean;\n}\n\ninterface BoardLike {\n getBoundingBox(): [number, number, number, number];\n create(type: string, args: unknown[], attrs: Record<string, unknown>): unknown;\n}\n\nexport function serializeBoard(\n board: BoardLike,\n log: SerializedElement[],\n options: { showAxis?: boolean; showGrid?: boolean } = {},\n): SerializedBoard {\n return {\n bbox: board.getBoundingBox(),\n elements: log.map(e => ({ type: e.type, args: e.args, attrs: e.attrs, id: e.id })),\n showAxis: !!options.showAxis,\n showGrid: !!options.showGrid,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction createValueLabel(board: any, target: any): unknown {\n if (!board || !target) return null;\n const e = (target.elType ?? target.type ?? '').toString().toLowerCase();\n if (e === 'segment' || e === 'line' || e === 'arrow') {\n const p1 = target.point1, p2 = target.point2;\n if (!p1 || !p2) return null;\n return board.create('text', [\n () => (p1.X() + p2.X()) / 2 + 0.15,\n () => (p1.Y() + p2.Y()) / 2 + 0.25,\n () => {\n const len = Math.hypot(p2.X() - p1.X(), p2.Y() - p1.Y());\n const name = typeof target.name === 'string' && target.name ? target.name : 'd';\n return `${name} = ${len.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n if (e === 'circle' || e === 'circumcircle') {\n const center = target.center ?? target.midpoint ?? target.point1;\n if (!center) return null;\n return board.create('text', [\n () => center.X() + 0.3,\n () => center.Y() + 0.3,\n () => {\n const r = typeof target.Radius === 'function' ? target.Radius() : 0;\n const name = typeof target.name === 'string' && target.name ? target.name : 'r';\n return `${name} = ${r.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n return null;\n}\n\nexport interface DeserializeOptions {\n /** Theme-aware palette để resolve sentinel attrs. Mặc định = light. */\n palette?: GeomPalette;\n}\n\nexport function deserializeIntoBoard(\n board: BoardLike,\n serialized: SerializedBoard,\n options: DeserializeOptions = {},\n): void {\n // Replay: args may contain references to earlier elements by our serialized id (\"j0\", \"j1\"…).\n // We resolve those to actual JSXGraph objects via a local id→object map. Nested\n // arrays are also resolved recursively — needed for dilate, which logs the\n // transform parent of a transformed point as [\"j2\",\"j3\",\"j4\"] (a chain of 3\n // transforms passed to `board.create('point', [src, [t1,t2,t3]])`).\n const palette = options.palette ?? paletteFor(false);\n const idMap = new Map<string, unknown>();\n const resolve = (a: unknown): unknown => {\n if (typeof a === 'string' && idMap.has(a)) return idMap.get(a);\n if (Array.isArray(a)) return a.map(resolve);\n return a;\n };\n for (const el of serialized.elements) {\n const resolvedArgs = el.args.map(resolve);\n if (el.type === 'valueLabel') {\n const target = resolvedArgs[0];\n const txt = createValueLabel(board, target);\n if (txt) idMap.set(el.id, txt);\n continue;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, palette);\n const created = board.create(el.type, resolvedArgs, themedAttrs);\n idMap.set(el.id, created);\n }\n}\n","import { renderGeometryToSvg } from './renderInline';\nimport { deserializeIntoBoard, type SerializedBoard } from './serialize';\nimport { paletteFor } from './editor/theme';\n\n/**\n * Re-render geometry SVG từ jsonState đã serialize. Dùng cho:\n * 1. Restore math-stamp file sau khi reload page (Excalidraw mất binary files).\n * 2. Generate SVG lúc INSERT (thay vì clone DOM với màu theo theme editor).\n *\n * LƯU Ý quan trọng — luôn dùng LIGHT palette (nét đậm). Excalidraw apply CSS\n * `filter: invert(93%) hue-rotate(180deg)` lên canvas trong dark mode → nét\n * đậm tự đảo thành sáng. Nếu ta bake nét sáng vào SVG cho dark mode, filter\n * sẽ đảo thành đậm → chìm vào nền tối. Giải pháp: luôn dùng nét đậm + để\n * Excalidraw tự lo invert.\n *\n * Implementation: tạo 1 div ẩn (off-screen, real dimensions để JSXGraph render\n * chuẩn), initBoard, replay creation log từ jsonState, dump SVG, dọn dẹp.\n *\n * Lý do JXG.Options.text.display = 'internal': JSXGraph mặc định render\n * label bằng HTML <div> overlay → clone SVG export sẽ thiếu label.\n */\nexport async function renderGeometrySvgFromState(jsonState: string): Promise<string> {\n const parsed = JSON.parse(jsonState) as SerializedBoard;\n // Stamps inserted vào Excalidraw canvas → luôn dùng light palette.\n // Excalidraw's THEME_FILTER tự đảo nét trong dark mode.\n const palette = paletteFor(false);\n const JXG = (await import('jsxgraph')).default;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.text.strokeColor = palette.label;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n opts.label.strokeColor = palette.label;\n opts.axis = opts.axis || {};\n opts.axis.strokeColor = palette.axis;\n opts.grid = opts.grid || {};\n opts.grid.strokeColor = palette.grid;\n }\n } catch { /* ignore */ }\n const container = document.createElement('div');\n const containerId = 'jxg_offscreen_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\n container.id = containerId;\n container.style.cssText = 'position:absolute;top:-99999px;left:-99999px;width:400px;height:300px;visibility:hidden;pointer-events:none;';\n document.body.appendChild(container);\n let board: unknown = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board = (JXG as any).JSXGraph.initBoard(containerId, {\n boundingbox: parsed.bbox,\n axis: !!parsed.showAxis,\n grid: !!parsed.showGrid,\n showCopyright: false,\n showNavigation: false,\n keepAspectRatio: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n deserializeIntoBoard(board as any, parsed, { palette });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (board as any).update();\n return renderGeometryToSvg(container);\n } finally {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (board) (JXG as any).JSXGraph.freeBoard(board);\n } catch { /* ignore */ }\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface GeometryCustomData extends BaseStampCustomData {\n kind: 'geometry';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGeometryCustomData(data: unknown): data is GeometryCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<GeometryCustomData>;\n return d.kind === 'geometry' && d.version === 1 && typeof d.jsonState === 'string';\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type JxgObj = any;\n\nexport type DefKind = 'point' | 'segment' | 'line' | 'ray' | 'arrow' | 'circleCenter' | 'circle3';\n\nexport interface DefiningPointsResult {\n kind: DefKind;\n points: JxgObj[];\n attrs: Record<string, unknown>;\n}\n\nconst LINE_LIKE = new Set(['line', 'segment', 'arrow']);\n\nfunction copyVisAttrs(obj: JxgObj): Record<string, unknown> {\n const v = obj?.visProp ?? {};\n const pick = (k: string) => v?.[k];\n const out: Record<string, unknown> = {};\n const mapping: Array<[string, string]> = [\n ['strokecolor', 'strokeColor'],\n ['strokewidth', 'strokeWidth'],\n ['strokeopacity', 'strokeOpacity'],\n ['dash', 'dash'],\n ['fillcolor', 'fillColor'],\n ['fillopacity', 'fillOpacity'],\n ];\n for (const [from, to] of mapping) {\n const val = pick(from);\n if (val !== undefined) out[to] = val;\n }\n return out;\n}\n\nexport function getDefiningPoints(obj: JxgObj): DefiningPointsResult | null {\n if (!obj) return null;\n const e = (obj.elType ?? obj.type ?? '').toString().toLowerCase();\n if (e === 'point' || e === 'glider' || e === 'midpoint') {\n return { kind: 'point', points: [obj], attrs: copyVisAttrs(obj) };\n }\n if (LINE_LIKE.has(e) && obj.point1 && obj.point2) {\n const kind: DefKind = e === 'segment' ? 'segment' : e === 'arrow' ? 'arrow' : 'line';\n return { kind, points: [obj.point1, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circle' && obj.center && obj.point2) {\n return { kind: 'circleCenter', points: [obj.center, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circumcircle' && obj.point1 && obj.point2 && obj.point3) {\n return {\n kind: 'circle3',\n points: [obj.point1, obj.point2, obj.point3],\n attrs: copyVisAttrs(obj),\n };\n }\n return null;\n}\n\nexport type TransformInput =\n | { kind: 'translate'; vectorPoints: [JxgObj, JxgObj] }\n | { kind: 'rotate'; center: JxgObj; angleDeg: number }\n | { kind: 'reflectLine'; line: JxgObj }\n | { kind: 'reflectPoint'; center: JxgObj }\n | { kind: 'dilate'; center: JxgObj; k: number };\n\nexport interface TransformSpec {\n params: unknown[];\n attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' };\n /**\n * Khi `chain` được set, finalizeTransformCreate dựng từng transform trong chain\n * (theo thứ tự) rồi pass mảng vào `board.create('point', [src, [t1, t2, t3]])`.\n * Dùng cho `dilate` (scale-quanh-điểm) vì JSXGraph 'scale' không nhận center.\n */\n chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }>;\n}\n\nexport function buildTransformSpec(input: TransformInput): TransformSpec {\n switch (input.kind) {\n case 'translate': {\n // Literal dx/dy (không phải callback) để serialize qua JSON.stringify được.\n // Trade-off: transformed object không cập nhật khi user kéo điểm vector — chấp nhận.\n const [a, b] = input.vectorPoints;\n const dx = b.X() - a.X();\n const dy = b.Y() - a.Y();\n return { params: [dx, dy], attrs: { type: 'translate' } };\n }\n case 'rotate':\n return {\n params: [(input.angleDeg * Math.PI) / 180, input.center],\n attrs: { type: 'rotate' },\n };\n case 'reflectLine':\n return { params: [input.line], attrs: { type: 'reflect' } };\n case 'reflectPoint':\n // JSXGraph 'scale' chỉ nhận 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 bị lờ → trước đây sai. Đối xứng qua điểm = quay 180°\n // quanh điểm đó. Dùng 'rotate' (params [angle, center]) để chuẩn.\n return { params: [Math.PI, input.center], attrs: { type: 'rotate' } };\n case 'dilate':\n // JSXGraph 'scale' chỉ nhận đúng 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 làm constructor throw. Dilate quanh điểm c bằng tỷ số k\n // = compose 3 phép: T(-c) → S(k,k) → T(+c). Sinh ra chain (mảng spec) thay vì\n // 1 spec đơn; consumer (finalizeTransformCreate) tự nhận biết.\n return {\n params: [],\n attrs: { type: 'scale' },\n chain: [\n { params: [-input.center.X(), -input.center.Y()], attrs: { type: 'translate' as const } },\n { params: [input.k, input.k], attrs: { type: 'scale' as const } },\n { params: [input.center.X(), input.center.Y()], attrs: { type: 'translate' as const } },\n ],\n };\n }\n}\n","import React from 'react';\n\n/**\n * Static catalog của tất cả GeomTool — không phụ thuộc board state, chỉ là\n * metadata (key, label, hint, icon SVG, group, số click cần, accept types).\n *\n * Tách khỏi JSXGraphMiniBoard.tsx để (1) giảm size file component và (2) dễ\n * mở rộng tool mới mà không cần đụng vào board logic.\n */\n\n// Tool keys — match GeoGebra-style toolset\nexport type GeomTool =\n | 'move'\n | 'select'\n | 'point'\n | 'midpoint'\n | 'segment'\n | 'line'\n | 'ray'\n | 'vector'\n | 'perpendicular'\n | 'parallel'\n | 'perpBisector'\n | 'angleBisector'\n | 'polygon'\n | 'regularPolygon'\n | 'circleCenter'\n | 'circle3'\n | 'tangent'\n | 'angle'\n | 'distance'\n | 'area'\n | 'toggleLabel'\n | 'toggleVisible'\n | 'delete'\n | 'translate'\n | 'rotate'\n | 'reflectLine'\n | 'reflectPoint'\n | 'dilate';\n\nexport interface ToolDef {\n key: GeomTool;\n label: string;\n hint: string;\n icon: React.ReactNode;\n group:\n | 'move'\n | 'point'\n | 'line'\n | 'construct'\n | 'polygon'\n | 'circle'\n | 'measure'\n | 'edit'\n | 'transform';\n /** Số click cần trước khi action fire. -1 = mở (polygon đóng bằng click lại điểm đầu). */\n needs: number;\n /** Loại object accept ở mỗi slot. 'any' = point hoặc non-point. */\n accepts?: Array<'point' | 'line' | 'circle' | 'any'>;\n}\n\n// ============== Tool icons — inline SVG ==============\nconst Icon = {\n cursor: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\"/></svg>\n ),\n select: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\" fill=\"none\"/><rect x=\"2.5\" y=\"2.5\" width=\"19\" height=\"19\" strokeDasharray=\"3 2\" fill=\"none\"/></svg>\n ),\n point: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\"/></svg>\n ),\n midpoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"20\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/></svg>\n ),\n segment: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\"/><circle cx=\"5\" cy=\"18\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"6\" r=\"1.7\" fill=\"currentColor\"/></svg>\n ),\n line: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"4\"/><circle cx=\"8\" cy=\"16\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"16\" cy=\"8\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n ray: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"19\" x2=\"22\" y2=\"2\"/><circle cx=\"5\" cy=\"19\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n vector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><polyline points=\"14,4 20,4 20,10\"/></svg>\n ),\n perpendicular: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"4\"/><rect x=\"12\" y=\"14\" width=\"4\" height=\"4\" fill=\"none\"/></svg>\n ),\n parallel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"5\"/><line x1=\"3\" y1=\"19\" x2=\"21\" y2=\"15\"/></svg>\n ),\n perpBisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><circle cx=\"6\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"18\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n bisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"12\" strokeDasharray=\"3 2\"/></svg>\n ),\n polygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"6,6 18,6 22,14 12,22 4,14\"/></svg>\n ),\n regularPolygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"12,3 20,8 20,17 12,22 4,17 4,8\"/></svg>\n ),\n circleCenter: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n circle3: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"4\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"20\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"16\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n tangent: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"11\" cy=\"13\" r=\"6\"/><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"2\"/></svg>\n ),\n angle: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"6\"/><path d=\"M14 20 A 10 10 0 0 0 11 13\" /></svg>\n ),\n distance: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"8\" x2=\"4\" y2=\"16\"/><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"16\"/></svg>\n ),\n area: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><polygon points=\"5,6 19,6 21,14 13,21 3,15\" fill=\"currentColor\" fillOpacity=\"0.2\"/></svg>\n ),\n toggleLabel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><text x=\"3\" y=\"18\" fontSize=\"16\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text><text x=\"13\" y=\"14\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text></svg>\n ),\n toggleVisible: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3.5\" fill=\"currentColor\" fillOpacity=\"0.4\"/><circle cx=\"12\" cy=\"12\" r=\"3.5\"/><circle cx=\"20\" cy=\"6\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\"/><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/></svg>\n ),\n translate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 4 L20 20\"/><polygon points=\"14,4 20,4 20,10\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n rotate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 12 A8 8 0 1 1 12 20\"/><polyline points=\"4,9 4,13 8,13\"/></svg>\n ),\n reflectLine: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><polygon points=\"4,6 9,12 4,18\" fill=\"currentColor\"/><polygon points=\"20,6 15,12 20,18\" fill=\"currentColor\"/></svg>\n ),\n reflectPoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"19\" r=\"1.6\" fill=\"currentColor\"/><line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" strokeDasharray=\"2 2\"/></svg>\n ),\n dilate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><polygon points=\"6,18 18,18 12,6\" fillOpacity=\"0.1\" fill=\"currentColor\"/><polygon points=\"9,15 15,15 12,11\" fill=\"currentColor\"/></svg>\n ),\n};\n\n// ============== Tool catalog ==============\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Kéo điểm hoặc xoay nền', icon: Icon.cursor, group: 'move', needs: 0 },\n { key: 'select', label: 'Chọn', hint: 'Click để chọn 1 / Shift+click để bỏ thêm / Kéo nền để khoanh vùng / DEL để xoá', icon: Icon.select, group: 'move', needs: 0 },\n { key: 'point', label: 'Điểm mới', hint: 'Click để thêm điểm', icon: Icon.point, group: 'point', needs: 1 },\n { key: 'midpoint', label: 'Trung điểm', hint: 'Click 2 điểm có sẵn', icon: Icon.midpoint, group: 'point', needs: 2, accepts: ['point', 'point'] },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Click 2 điểm', icon: Icon.segment, group: 'line', needs: 2 },\n { key: 'line', label: 'Đường thẳng qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.line, group: 'line', needs: 2 },\n { key: 'ray', label: 'Tia qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.ray, group: 'line', needs: 2 },\n { key: 'vector', label: 'Vector', hint: 'Click 2 điểm', icon: Icon.vector, group: 'line', needs: 2 },\n { key: 'perpendicular', label: 'Đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpendicular, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'parallel', label: 'Đường song song', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.parallel, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'perpBisector', label: 'Đường trung trực', hint: 'Click 2 điểm có sẵn', icon: Icon.perpBisector, group: 'construct', needs: 2, accepts: ['point', 'point'] },\n { key: 'angleBisector', label: 'Đường phân giác', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.bisector, group: 'construct', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'polygon', label: 'Đa giác', hint: 'Click các điểm, click lại điểm đầu để đóng', icon: Icon.polygon, group: 'polygon', needs: -1 },\n { key: 'regularPolygon', label: 'Đa giác đều', hint: 'Click 2 điểm rồi nhập số cạnh', icon: Icon.regularPolygon, group: 'polygon', needs: 2, accepts: ['point', 'point'] },\n { key: 'circleCenter', label: 'Đường tròn (tâm + điểm)', hint: 'Click tâm rồi 1 điểm trên đường tròn', icon: Icon.circleCenter, group: 'circle', needs: 2 },\n { key: 'circle3', label: 'Đường tròn qua 3 điểm', hint: 'Click 3 điểm', icon: Icon.circle3, group: 'circle', needs: 3 },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Click 1 điểm + 1 đường tròn có sẵn', icon: Icon.tangent, group: 'circle', needs: 2, accepts: ['point', 'circle'] },\n { key: 'angle', label: 'Góc', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.angle, group: 'measure', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'distance', label: 'Khoảng cách', hint: 'Click 2 điểm có sẵn', icon: Icon.distance, group: 'measure', needs: 2, accepts: ['point', 'point'] },\n { key: 'area', label: 'Diện tích', hint: 'Click các đỉnh, click lại điểm đầu để đóng', icon: Icon.area, group: 'measure', needs: -1 },\n { key: 'toggleLabel', label: 'Hiện/ẩn tên', hint: 'Click vào đối tượng', icon: Icon.toggleLabel, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'toggleVisible', label: 'Hiện/ẩn đối tượng', hint: 'Click vào đối tượng', icon: Icon.toggleVisible, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'delete', label: 'Xoá', hint: 'Click vào đối tượng', icon: Icon.trash, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'translate', label: 'Phép tịnh tiến', hint: 'Click object → 2 điểm tạo vector', icon: Icon.translate, group: 'transform', needs: 3, accepts: ['any', 'point', 'point'] },\n { key: 'rotate', label: 'Quay đối tượng', hint: 'Click object → tâm quay → nhập góc', icon: Icon.rotate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'reflectLine', label: 'Đối xứng qua đường thẳng', hint: 'Click object → đường thẳng', icon: Icon.reflectLine, group: 'transform', needs: 2, accepts: ['any', 'line'] },\n { key: 'reflectPoint', label: 'Đối xứng qua điểm', hint: 'Click object → tâm đối xứng', icon: Icon.reflectPoint, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'dilate', label: 'Phép vị tự', hint: 'Click object → tâm → nhập tỷ số k', icon: Icon.dilate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n];\n\nexport const GROUP_LABELS: Record<ToolDef['group'], string> = {\n move: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường',\n construct: 'Dựng hình',\n polygon: 'Đa giác',\n circle: 'Đường tròn',\n measure: 'Đo lường',\n edit: 'Chỉnh sửa',\n transform: 'Phép biến hình',\n};\n\nexport type GeomGroup = ToolDef['group'];\n\n// Positional A..I — letter shortcut cho chord 2-phím.\n// Khớp đúng thứ tự hiển thị trong LeftPanel (derive từ TOOLS phía trên).\nexport const GROUP_ORDER: GeomGroup[] = [\n 'move',\n 'point',\n 'line',\n 'construct',\n 'polygon',\n 'circle',\n 'measure',\n 'edit',\n 'transform',\n];\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: GeomGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n\nexport function groupForLetter(ch: string): GeomGroup | null {\n if (ch.length !== 1) return null;\n const upper = ch.toUpperCase();\n const idx = upper.charCodeAt(0) - A_CODE;\n if (idx < 0 || idx >= GROUP_ORDER.length) return null;\n return GROUP_ORDER[idx];\n}\n\n// ============== Object-type matching ==============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\n/** Phân loại JSXGraph element type vào nhóm dùng cho accept-matching. */\nexport function objKind(obj: JxgObj): 'point' | 'line' | 'circle' | 'other' {\n if (!obj) return 'other';\n const e = (obj.elType || obj.type || '').toString().toLowerCase();\n if (e === 'point' || e === 'glider' || e === 'midpoint') return 'point';\n if (\n e === 'line' || e === 'segment' || e === 'arrow' || e === 'axis' ||\n e === 'normal' || e === 'parallel' || e === 'perpendicular' ||\n e === 'tangent' || e === 'bisector' || e === 'perpendicularsegment'\n ) return 'line';\n if (e === 'circle' || e === 'circumcircle') return 'circle';\n return 'other';\n}\n\nexport function acceptMatches(\n tool: ToolDef,\n slot: number,\n kind: 'point' | 'line' | 'circle' | 'other',\n): boolean {\n if (!tool.accepts) return kind === 'point' || tool.key === 'point';\n const a = tool.accepts[slot];\n if (!a) return false;\n if (a === 'any') return kind !== 'other';\n return a === kind;\n}\n","/**\n * handlers.ts — Pure pointer/tool handler functions extracted from MiniBoard.tsx.\n *\n * Each function receives a HandlerCtx object containing the refs and callbacks\n * it needs, and a raw JSXGraph event object. No React, no DOM manipulation\n * beyond what JSXGraph provides through its API.\n *\n * The ctx pattern lets MiniBoard.tsx pass a stable object reference captured\n * at useEffect time, while the individual properties stay up-to-date because\n * they are refs (whose .current is read at call time) or stable callbacks\n * (whose identities don't change across renders).\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nimport { TOOLS, objKind, type GeomTool, type ToolDef } from './tools';\nimport { buildTransformSpec } from './transforms';\n\n// ─── Context shape ────────────────────────────────────────────────────────────\n\nexport interface HandlerCtx {\n // Refs (read .current at call time)\n boardRef: { current: JxgObj };\n toolRef: { current: GeomTool };\n pendingRef: { current: JxgObj[] };\n previewSegRef: { current: JxgObj[] };\n axisObjsRef: { current: { x?: JxgObj; y?: JxgObj } };\n selectedSetRef: { current: Set<JxgObj> };\n marqueeRef: { current: { startSx: number; startSy: number; rect?: JxgObj } | null };\n moveDownRef: { current: { sx: number; sy: number } | null };\n lastMoveClickRef: { current: { obj: JxgObj | null; time: number } };\n pendingTransformRef: { current: { tool: 'rotate' | 'dilate' | 'regularPolygon'; source: JxgObj; center: JxgObj; anchorScreen: { x: number; y: number } } | null };\n phantomRef: { current: JxgObj };\n previewShapeRef: { current: JxgObj };\n previewRafRef: { current: number | null };\n jxgRef: { current: JxgObj };\n\n // Stable callbacks (identity doesn't change)\n screenCoordsOf: (evt: JxgObj) => [number, number] | null;\n objectsAt: (evt: JxgObj) => JxgObj[];\n promoteLabel: (o: JxgObj) => JxgObj;\n findNearestPoint: (evt: JxgObj, tolPx?: number) => JxgObj | null;\n toggleSelect: (obj: JxgObj, additive: boolean) => void;\n clearSelection: () => void;\n applySelectionStyle: (obj: JxgObj) => void;\n localIdOf: (obj: JxgObj) => string | null;\n nextLabel: () => string;\n create: (type: string, args: unknown[], attrs?: Record<string, unknown>) => JxgObj;\n finalize: (toolDef: ToolDef, picks: JxgObj[]) => void;\n finalizeTransformCreate: (spec: Parameters<typeof buildTransformSpec>[0] extends never ? never : ReturnType<typeof buildTransformSpec>, source: JxgObj) => void;\n clearPending: () => void;\n clearPreviewSegs: () => void;\n refreshPreview: () => void;\n flashWarn: (msg: string) => void;\n emitTransform: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void;\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n emitSelect: (snap: any) => void;\n setPendingCount: (n: number) => void;\n setSelectionTick: (fn: (t: number) => number) => void;\n}\n\n// ─── board.on('down') ─────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleDown(ctx: HandlerCtx, e: any): void {\n if (!ctx.boardRef.current) return;\n const t = ctx.toolRef.current;\n if (t === 'move') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n ctx.moveDownRef.current = { sx, sy };\n return;\n }\n if (t === 'select') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n const obj = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? ctx.findNearestPoint(e, 12);\n if (obj) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(obj, shift);\n // Stash so 'up' handler doesn't treat this as a marquee end.\n ctx.moveDownRef.current = { sx, sy };\n ctx.marqueeRef.current = null;\n return;\n }\n // Empty space: start marquee. We disable board pan while marqueeing\n // by not setting moveDownRef (board's internal pan listener relies on\n // it being null elsewhere; here we record marquee start separately).\n ctx.marqueeRef.current = { startSx: sx, startSy: sy };\n // Clear current selection unless shift is held (additive marquee).\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n return;\n }\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n const x = coords[0], y = coords[1];\n\n // Detect if click hits any existing object (snap target). Text labels\n // are promoted to their owning element so a click on the \"A\" label\n // counts as a click on the point A.\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // Prefer points over other elements when present\n const bestHit: JxgObj | null = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? null;\n // Generous fallback used when a slot expects a point: JSXGraph's `hasPoint`\n // for a small point is ~3px which is too tight for clicking, so we look up\n // the nearest existing point within 12px. Only applied where the active\n // tool slot needs a point — otherwise we'd shadow valid line/circle hits.\n const snapPointForPointSlot = (): JxgObj | null =>\n bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPoint(e, 12);\n\n // Tool: point — nếu click trúng ≥2 đường/đường tròn → tạo giao điểm\n // ràng buộc (khi kéo các đường, điểm này luôn là giao). Trường hợp 1\n // đường + click thường vẫn tạo điểm tự do (không glide để tránh ràng\n // buộc ngoài ý muốn).\n if (t === 'point') {\n const curves = hits.filter((o) => objKind(o) === 'line' || objKind(o) === 'circle');\n if (curves.length >= 2) {\n const a = curves[0];\n const b = curves[1];\n const aId = ctx.localIdOf(a);\n const bId = ctx.localIdOf(b);\n if (aId && bId) {\n const name = ctx.nextLabel();\n const attrs = { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' };\n try {\n // intersection trả về element [obj1, obj2] với giao gần (x, y).\n // JSXGraph cần index i (0 hoặc 1) cho trường hợp 2 giao (line-circle, circle-circle).\n // Chọn index dựa vào điểm gần click hơn.\n const isLineLine = objKind(a) === 'line' && objKind(b) === 'line';\n if (isLineLine) {\n ctx.create('intersection', [aId, bId, 0], attrs);\n } else {\n // Thử cả 2 index, chọn cái gần click hơn\n const tmp0 = ctx.boardRef.current.create('intersection', [a, b, 0], { visible: false, withLabel: false });\n const tmp1 = ctx.boardRef.current.create('intersection', [a, b, 1], { visible: false, withLabel: false });\n const d0 = Math.hypot((tmp0.X?.() ?? 0) - x, (tmp0.Y?.() ?? 0) - y);\n const d1 = Math.hypot((tmp1.X?.() ?? 0) - x, (tmp1.Y?.() ?? 0) - y);\n try { ctx.boardRef.current.removeObject(tmp0); } catch { /* ignore */ }\n try { ctx.boardRef.current.removeObject(tmp1); } catch { /* ignore */ }\n const idx = d0 <= d1 ? 0 : 1;\n ctx.create('intersection', [aId, bId, idx], attrs);\n }\n return;\n } catch {\n // fallback: tạo điểm tự do\n }\n }\n }\n const name = ctx.nextLabel();\n ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n return;\n }\n\n // Edit / single-target tools (toggleLabel, toggleVisible, delete)\n if (toolDef.needs === 1 && toolDef.accepts) {\n // Fall back to generous point snap if hasPoint missed a small point.\n const hit = bestHit ?? ctx.findNearestPoint(e, 12);\n if (hit) ctx.finalize(toolDef, [hit]);\n else ctx.flashWarn('Click vào một đối tượng để áp dụng');\n return;\n }\n\n // Polygon / area: variable-length, close on click near starting point\n if (toolDef.needs === -1) {\n const snappedPoint = snapPointForPointSlot();\n // Close ring first: if user clicks back on the first pending point\n // (with at least 3 points already), finalize. Done before push so the\n // first point isn't duplicated into pending.\n if (ctx.pendingRef.current.length >= 3 && snappedPoint && snappedPoint === ctx.pendingRef.current[0]) {\n ctx.clearPreviewSegs();\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n return;\n }\n // Reject re-picking an interior pending vertex (would create a degenerate edge).\n if (snappedPoint && ctx.pendingRef.current.includes(snappedPoint)) {\n ctx.flashWarn('Đỉnh này đã có — click điểm khác hoặc click lại điểm đầu để đóng');\n return;\n }\n // Otherwise pick (snap-to-existing or create) a new vertex\n const pick: JxgObj = snappedPoint ?? (() => {\n const name = ctx.nextLabel();\n return ctx.create('point', [x, y], { name, color: '@stroke', size: 3 });\n })();\n // Live preview: draw an edge from the previous pending vertex to\n // this new one so the user sees the polygon being built.\n if (ctx.pendingRef.current.length > 0 && ctx.boardRef.current) {\n const prev = ctx.pendingRef.current[ctx.pendingRef.current.length - 1];\n try {\n const seg = ctx.boardRef.current.create('segment', [prev, pick], {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.75,\n fixed: true,\n highlight: false,\n withLabel: false,\n });\n ctx.previewSegRef.current.push(seg);\n } catch { /* ignore */ }\n }\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n return;\n }\n\n // Multi-click branch. Two sub-modes:\n // A) Strict + order-flexible: tool declared `accepts`. We bind each\n // click to whatever required kind is still unfilled, regardless\n // of click order. E.g. perpendicular accepts ['point', 'line']\n // and the user can click line-then-point or point-then-line.\n // B) Lenient + order-fixed: tool has no `accepts` (segment, line,\n // ray, vector, circle*, ...). All slots want points; missing\n // snaps create a fresh point.\n let pick: JxgObj | null = null;\n\n if (toolDef.accepts) {\n // --- Mode A: strict, order-flexible ---\n const usedKinds = ctx.pendingRef.current.map((p) => objKind(p));\n const remaining: Array<'point' | 'line' | 'circle' | 'any'> = [...toolDef.accepts];\n for (const u of usedKinds) {\n if (u === 'other') continue;\n const i = remaining.indexOf(u);\n if (i >= 0) remaining.splice(i, 1);\n }\n const strictPoint = hits.find((o) => objKind(o) === 'point') ?? null;\n const lineHit = hits.find((o) => objKind(o) === 'line') ?? null;\n const circleHit = hits.find((o) => objKind(o) === 'circle') ?? null;\n // Priority: an exact point hit binds to 'point' first (so a click\n // landing right on a vertex isn't stolen by a line/circle passing\n // through it). Typed line/circle bind next. 'any' slot accepts any\n // remaining hit (point/line/circle). Generous point-snap is the\n // last resort when only a 'point' slot is open.\n //\n // Previously 'any' was checked AFTER the snap fallback for point,\n // which meant tools like dilate (accepts ['any', 'point']) couldn't\n // pick a segment for the 'any' slot — the snap branch absorbed the\n // click and 'any' was never evaluated.\n if (remaining.includes('point') && strictPoint) pick = strictPoint;\n else if (remaining.includes('line') && lineHit) pick = lineHit;\n else if (remaining.includes('circle') && circleHit) pick = circleHit;\n else if (remaining.includes('any') && (strictPoint || lineHit || circleHit)) {\n pick = strictPoint ?? lineHit ?? circleHit;\n } else if (remaining.includes('point')) {\n const near = ctx.findNearestPoint(e, 12);\n if (near) pick = near;\n }\n if (!pick) {\n const needs = remaining.map((k) =>\n k === 'point' ? 'một điểm' : k === 'line' ? 'một đường/đoạn' : k === 'circle' ? 'một đường tròn' : 'một đối tượng',\n );\n ctx.flashWarn(`Còn cần click vào ${needs.join(' + ')} có sẵn`);\n return;\n }\n // Reject duplicate picks (e.g. click the same point twice for midpoint\n // would produce a degenerate object pointing at itself).\n if (ctx.pendingRef.current.includes(pick)) {\n ctx.flashWarn('Đã chọn đối tượng này — chọn đối tượng khác');\n return;\n }\n } else {\n // --- Mode B: lenient, all slots want a point ---\n const snapped = snapPointForPointSlot();\n if (snapped && ctx.pendingRef.current.includes(snapped)) {\n // Same point clicked twice → would produce a zero-length segment / etc.\n ctx.flashWarn('Đã chọn điểm này — chọn điểm khác hoặc click chỗ trống');\n return;\n }\n if (snapped) pick = snapped;\n else {\n const name = ctx.nextLabel();\n pick = ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n }\n }\n\n if (!pick) return;\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n\n if (ctx.pendingRef.current.length >= toolDef.needs) {\n const tk = toolDef.key;\n if (tk === 'rotate' || tk === 'dilate') {\n const source = ctx.pendingRef.current[0];\n const center = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source, center, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n // Don't clearPending here — wait for confirm/cancel\n return;\n }\n if (tk === 'regularPolygon') {\n const p1 = ctx.pendingRef.current[0];\n const p2 = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source: p1, center: p2, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n return;\n }\n if (tk === 'translate') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'translate', vectorPoints: [ctx.pendingRef.current[1], ctx.pendingRef.current[2]] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectLine') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectLine', line: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectPoint') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectPoint', center: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n } else {\n ctx.refreshPreview();\n }\n}\n\n// ─── board.on('up') ───────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleUp(ctx: HandlerCtx, e: any): void {\n const t = ctx.toolRef.current;\n if (t === 'select') {\n // Finalize marquee: any object hit-tested inside the rectangle gets\n // added to the selection. Single click on object was already handled\n // in `down`; here we only care about drag end.\n const mq = ctx.marqueeRef.current;\n ctx.marqueeRef.current = null;\n ctx.moveDownRef.current = null;\n if (!mq) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [ex, ey] = sc;\n if (mq.rect) { try { ctx.boardRef.current?.removeObject(mq.rect); } catch { /* ignore */ } }\n if (Math.hypot(ex - mq.startSx, ey - mq.startSy) < 4) return; // not a real drag\n const x1 = Math.min(mq.startSx, ex), x2 = Math.max(mq.startSx, ex);\n const y1 = Math.min(mq.startSy, ey), y2 = Math.max(mq.startSy, ey);\n const board = ctx.boardRef.current;\n if (!board) return;\n const list = (board.objectsList || []) as JxgObj[];\n for (const o of list) {\n if (o === ctx.axisObjsRef.current.x || o === ctx.axisObjsRef.current.y) continue;\n // Points: include if their screen coord falls inside the rect.\n const kind = objKind(o);\n if (kind === 'point') {\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n if (pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2) {\n if (!ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n // Lines/segments/circles: simple test — include if either defining\n // point falls inside (good enough for marquee UX without doing\n // expensive line-rectangle intersections).\n else if (kind === 'line' || kind === 'circle') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const defs: any[] = [o.point1, o.point2, o.center, o.midpoint, o.point3].filter(Boolean);\n const anyInside = defs.some((p) => {\n const pc = p?.coords?.scrCoords;\n return pc && pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2;\n });\n if (anyInside && !ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n ctx.setSelectionTick((tt) => tt + 1);\n try { board.update(); } catch { /* ignore */ }\n return;\n }\n if (t !== 'move') return;\n const start = ctx.moveDownRef.current;\n ctx.moveDownRef.current = null;\n if (!start) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const moved = Math.hypot(sx - start.sx, sy - start.sy);\n if (moved > 4) return; // drag, không phải click\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const best: any = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? ctx.findNearestPoint(e, 12);\n if (!best) {\n ctx.lastMoveClickRef.current = { obj: null, time: 0 };\n return;\n }\n const now = Date.now();\n const isDouble = ctx.lastMoveClickRef.current.obj === best && (now - ctx.lastMoveClickRef.current.time) < 400;\n ctx.lastMoveClickRef.current = { obj: best, time: now };\n if (!isDouble) return;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n const snap = ctx.snapshotObject(best, { x: cx + 8, y: cy + 8 });\n if (snap) ctx.emitSelect(snap);\n}\n\n// ─── board.on('move') ────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleMove(ctx: HandlerCtx, e: any): void {\n // Marquee rectangle redraw while user drags with the select tool on empty space.\n if (ctx.toolRef.current === 'select' && ctx.marqueeRef.current) {\n const sc = ctx.screenCoordsOf(e);\n if (sc && ctx.boardRef.current) {\n const [sx, sy] = sc;\n const { startSx, startSy } = ctx.marqueeRef.current;\n // Convert screen px to user coords for JSXGraph polygon overlay.\n const b = ctx.boardRef.current;\n const ux1 = b.screenCoords2userCoords?.([Math.min(startSx, sx), Math.min(startSy, sy)]) ?? null;\n const ux2 = b.screenCoords2userCoords?.([Math.max(startSx, sx), Math.max(startSy, sy)]) ?? null;\n // JSXGraph internal: getUsrCoordsByScreenCoords may not exist; fall\n // back to using a known board API.\n const toUsr = (px: number, py: number): [number, number] => {\n // Coords.getMouseCoordinates equivalent — use board.origin + unitX/Y.\n const ox = b.origin?.scrCoords?.[1] ?? 0;\n const oy = b.origin?.scrCoords?.[2] ?? 0;\n const ux = (px - ox) / b.unitX;\n const uy = (oy - py) / b.unitY;\n return [ux, uy];\n };\n const [x1u, y1u] = ux1 && ux1.length >= 2 ? [ux1[0], ux1[1]] : toUsr(Math.min(startSx, sx), Math.min(startSy, sy));\n const [x2u, y2u] = ux2 && ux2.length >= 2 ? [ux2[0], ux2[1]] : toUsr(Math.max(startSx, sx), Math.max(startSy, sy));\n const rect = ctx.marqueeRef.current.rect;\n if (rect) {\n try { ctx.boardRef.current.removeObject(rect); } catch { /* ignore */ }\n }\n try {\n ctx.marqueeRef.current.rect = ctx.boardRef.current.create('polygon', [\n [x1u, y1u], [x2u, y1u], [x2u, y2u], [x1u, y2u],\n ], {\n fillColor: '#06b6d4', fillOpacity: 0.08,\n borders: { strokeColor: '#06b6d4', strokeWidth: 1, dash: 2 },\n vertices: { visible: false },\n fixed: true, highlight: false, withLabel: false,\n });\n } catch { /* ignore */ }\n }\n return;\n }\n const ph = ctx.phantomRef.current;\n if (!ph || !ctx.boardRef.current) return;\n if (ctx.previewRafRef.current != null) return;\n ctx.previewRafRef.current = requestAnimationFrame(() => {\n ctx.previewRafRef.current = null;\n if (!ctx.boardRef.current || !ctx.phantomRef.current) return;\n try {\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const JXG: any = ctx.jxgRef.current;\n if (!JXG) return;\n ctx.phantomRef.current.setPositionDirectly(JXG.COORDS_BY_USER, [coords[0], coords[1]]);\n ctx.boardRef.current.update();\n } catch { /* ignore */ }\n });\n}\n","'use client';\nimport React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { deserializeIntoBoard, type SerializedBoard, type SerializedElement } from '../serialize';\nimport { getDefiningPoints, buildTransformSpec } from './transforms';\nimport {\n TOOLS,\n GROUP_LABELS,\n acceptMatches,\n objKind,\n type GeomTool,\n type ToolDef,\n} from './tools';\nimport { paletteFor, resolveAttrColors, themeAxis, themeGrid, themeLabel } from './theme';\nimport { handleDown, handleUp, handleMove, type HandlerCtx } from './handlers';\n\n// Re-export để backward-compat với consumer cũ.\nexport { TOOLS, GROUP_LABELS };\nexport type { GeomTool, ToolDef };\n\nexport interface MiniBoardHandle {\n getContainer: () => HTMLDivElement | null;\n getCreationLog: () => SerializedElement[];\n getBbox: () => [number, number, number, number];\n getShowAxis: () => boolean;\n getShowGrid: () => boolean;\n /** Đổi tool active từ bên ngoài (panel trái). */\n setTool: (t: GeomTool) => void;\n getTool: () => GeomTool;\n /** Toggle layout từ bên ngoài. */\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n /** Undo bước cuối. */\n undo: () => void;\n /** Có gì để undo? */\n canUndo: () => boolean;\n /** Subscribe khi state thay đổi (tool / showAxis / showGrid / undo). */\n subscribe: (cb: () => void) => () => void;\n /** Đọc snapshot thuộc tính object (cho popover). */\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => ObjectSnapshot | null;\n /** Mutate thuộc tính + sync log. */\n mutateObject: (obj: unknown, patch: { attrs?: Record<string, unknown>; remove?: boolean }) => void;\n /** Liệt kê tên của tất cả point hiện tại (để popover disambiguate khi rename). */\n getAllPointNames: () => string[];\n /** Subscribe selection-from-move-tool. Trả về unsubscribe. */\n onSelect: (cb: (snap: ObjectSnapshot) => void) => () => void;\n onTransformParam: (cb: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void) => () => void;\n confirmTransformParam: (value: number) => void;\n cancelTransformParam: () => void;\n /** Số đối tượng đang chọn (qua tool 'select'). */\n getSelectionSize: () => number;\n /** Bỏ chọn tất cả. */\n clearSelection: () => void;\n /** Xoá tất cả đối tượng đang chọn (cascade-aware). */\n deleteSelection: () => void;\n}\n\nexport interface ObjectSnapshot {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any;\n kind: 'point' | 'line' | 'circle';\n name: string;\n color: string;\n dash: number;\n width: number;\n face: 'o' | 'circle' | 'cross' | 'plus';\n /** Đang hiển thị tên (label) hay không. */\n showLabel: boolean;\n /** Đang có value-label (text gắn động) hay không. */\n showValue: boolean;\n screenCoords: { x: number; y: number };\n}\n\ninterface Props {\n onReady: (handle: MiniBoardHandle) => void;\n initialState: SerializedBoard | null;\n /** Khi true → board nền tối, điểm/đường/label dùng tone sáng để contrast. */\n isDark?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport const JSXGraphMiniBoard: React.FC<Props> = ({ onReady, initialState, isDark }) => {\n const isDarkRef = useRef(!!isDark);\n isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_jxgmini';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const axisObjsRef = useRef<{ x?: JxgObj; y?: JxgObj }>({});\n const creationLogRef = useRef<SerializedElement[]>([]);\n\n const [tool, setTool] = useState<GeomTool>('move');\n const toolRef = useRef<GeomTool>('move');\n toolRef.current = tool;\n\n const [showAxis, setShowAxis] = useState<boolean>(initialState?.showAxis ?? false);\n const [showGrid, setShowGrid] = useState<boolean>(initialState?.showGrid ?? false);\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n // Track JSXGraph point objects created during the session, indexed by our serialized id.\n // We also track the LAST object created (for non-point types like segment) so accept-matching works.\n const objMapRef = useRef<Map<string, JxgObj>>(new Map());\n\n // Map target line/circle → dynamic value-label text element (hiển thị độ dài\n // / bán kính). Khi user toggle \"Show Value\", ta tạo/xoá text này. Serialize:\n // entry type='valueLabel' trong creationLog với args=[targetLocalId].\n const valueLabelsRef = useRef<Map<JxgObj, JxgObj>>(new Map());\n\n // Pending picks for multi-click tools: array of JSXGraph object refs\n const pendingRef = useRef<JxgObj[]>([]);\n const [, setPendingCount] = useState(0);\n\n // Selection state — tool 'select' adds clicked objects here. Selected objects\n // get a cyan highlight stroke (original style preserved in selOriginalRef so\n // we can restore on deselect).\n const selectedSetRef = useRef<Set<JxgObj>>(new Set());\n const selOriginalRef = useRef<Map<JxgObj, { strokeColor?: unknown; strokeWidth?: unknown }>>(new Map());\n const [, setSelectionTick] = useState(0);\n // Marquee state during select-tool drag.\n const marqueeRef = useRef<{ startSx: number; startSy: number; rect?: JxgObj } | null>(null);\n\n // Live preview segments while building a polygon/area: drawn between\n // consecutive pending points so the user sees the shape forming.\n const previewSegRef = useRef<JxgObj[]>([]);\n // Phantom point that tracks mouse position for 2-3 click tool live preview.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const phantomRef = useRef<any>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const previewShapeRef = useRef<any>(null);\n const previewRafRef = useRef<number | null>(null);\n // Tick state forces re-render so the undo button enable state stays in sync\n // with creationLogRef (which is mutated outside React).\n const [historyTick, setHistoryTick] = useState(0);\n // Transient warning shown when a strict construction tool gets a click that\n // didn't land on the required existing object (so the user knows why nothing\n // happened). Auto-clears.\n const [, setWarn] = useState<string | null>(null);\n const warnTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flashWarn = useCallback((msg: string) => {\n if (warnTimerRef.current) clearTimeout(warnTimerRef.current);\n setWarn(msg);\n warnTimerRef.current = setTimeout(() => setWarn(null), 1800);\n }, []);\n useEffect(() => () => { if (warnTimerRef.current) clearTimeout(warnTimerRef.current); }, []);\n\n const labelIdxRef = useRef(0);\n const nextLabel = useCallback(() => {\n const idx = labelIdxRef.current;\n const suffix = idx >= 26 ? String(Math.floor(idx / 26)) : '';\n const code = 'A'.charCodeAt(0) + (idx % 26);\n labelIdxRef.current = idx + 1;\n return String.fromCharCode(code) + suffix;\n }, []);\n\n const nextLocalId = useCallback(() => 'j' + creationLogRef.current.length, []);\n\n // Build a fresh JSXGraph object id resolver for serialization.\n // We log args using local string IDs (\"j0\"); resolve to JSXGraph objects in-memory via objMapRef.\n const resolveArgs = useCallback((args: unknown[]): unknown[] => {\n return args.map((a) => {\n if (typeof a === 'string' && objMapRef.current.has(a)) {\n return objMapRef.current.get(a);\n }\n return a;\n });\n }, []);\n\n const pushLog = useCallback(\n (id: string, type: string, args: unknown[], attrs: Record<string, unknown>, obj: JxgObj) => {\n creationLogRef.current.push({ id, type, args, attrs });\n objMapRef.current.set(id, obj);\n setHistoryTick((t) => t + 1);\n },\n [],\n );\n\n const create = useCallback(\n (type: string, args: unknown[], attrs: Record<string, unknown> = {}): JxgObj => {\n if (!boardRef.current) return null;\n const id = nextLocalId();\n const resolved = resolveArgs(args);\n // attrs có thể chứa sentinel `@stroke/@axis/@grid/@label` — log lưu nguyên\n // bản (theme-neutral), JSXGraph nhận màu thực resolve theo theme hiện tại.\n const resolvedAttrs = resolveAttrColors(attrs, paletteFor(isDarkRef.current));\n const obj = boardRef.current.create(type, resolved, resolvedAttrs);\n pushLog(id, type, args, attrs, obj);\n return obj;\n },\n [nextLocalId, resolveArgs, pushLog],\n );\n\n // Get local serialized id for a JSXGraph object (reverse lookup).\n const localIdOf = useCallback((obj: JxgObj): string | null => {\n for (const [id, o] of objMapRef.current.entries()) {\n if (o === obj) return id;\n }\n return null;\n }, []);\n\n const snapshotObject = useCallback((obj: unknown, anchorScreen: { x: number; y: number }): ObjectSnapshot | null => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o: any = obj;\n const k = objKind(o);\n if (k !== 'point' && k !== 'line' && k !== 'circle') return null;\n const v = o.visProp ?? {};\n const showLabel = v.withlabel !== false;\n const showValue = valueLabelsRef.current.has(o);\n return {\n obj: o,\n kind: k,\n name: typeof o.name === 'string' ? o.name : '',\n color: (v.strokecolor as string) ?? '#1e1e1e',\n dash: typeof v.dash === 'number' ? v.dash : 0,\n width: typeof v.strokewidth === 'number' ? v.strokewidth : 2,\n face: (v.face as ObjectSnapshot['face']) ?? 'o',\n showLabel,\n showValue,\n screenCoords: anchorScreen,\n };\n }, []);\n\n // Tạo text element động hiển thị giá trị (độ dài segment / bán kính circle).\n // Trả về JSXGraph text obj (chưa log). Cần obj có cùng \"kind\" được hỗ trợ.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const createValueLabelFor = useCallback((target: any): any => {\n const b = boardRef.current;\n if (!b || !target) return null;\n const k = objKind(target);\n if (k === 'line') {\n // segment / line / arrow đều dùng point1 + point2\n const p1 = target.point1;\n const p2 = target.point2;\n if (!p1 || !p2) return null;\n const txt = b.create('text', [\n () => (p1.X() + p2.X()) / 2 + 0.15,\n () => (p1.Y() + p2.Y()) / 2 + 0.25,\n () => {\n const dx = p2.X() - p1.X();\n const dy = p2.Y() - p1.Y();\n const len = Math.hypot(dx, dy);\n const name = typeof target.name === 'string' && target.name ? target.name : 'd';\n return `${name} = ${len.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n return txt;\n }\n if (k === 'circle') {\n const center = target.center ?? target.midpoint;\n if (!center) return null;\n const txt = b.create('text', [\n () => center.X() + 0.3,\n () => center.Y() + 0.3,\n () => {\n const r = typeof target.Radius === 'function' ? target.Radius() : 0;\n const name = typeof target.name === 'string' && target.name ? target.name : 'r';\n return `${name} = ${r.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n return txt;\n }\n return null;\n }, []);\n\n const mutateObject = useCallback((obj: unknown, patch: { attrs?: Record<string, unknown>; remove?: boolean; valueLabel?: boolean }) => {\n if (!boardRef.current) return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o: any = obj;\n if (patch.remove) {\n // Nếu obj có value-label đính kèm → xoá luôn text đó để cascade không\n // bỏ sót.\n const vl = valueLabelsRef.current.get(o);\n if (vl) {\n try { boardRef.current.removeObject(vl); } catch { /* ignore */ }\n valueLabelsRef.current.delete(o);\n }\n try { boardRef.current.removeObject(o); } catch { /* ignore */ }\n // Cascade: walk log and drop entries whose JSXGraph object was also removed\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, obj] of objMapRef.current.entries()) {\n // JSXGraph keeps objects in board.objects keyed by JSXGraph internal id\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (obj as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n // Drop dead entries from log + map\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n return;\n }\n if (typeof patch.valueLabel === 'boolean') {\n const has = valueLabelsRef.current.has(o);\n if (patch.valueLabel && !has) {\n const txt = createValueLabelFor(o);\n if (txt) {\n valueLabelsRef.current.set(o, txt);\n // Log entry tổng hợp để reload regenerate được. args=[targetLocalId].\n const targetId = localIdOf(o);\n if (targetId) {\n const id = nextLocalId();\n creationLogRef.current.push({ id, type: 'valueLabel', args: [targetId], attrs: {} });\n objMapRef.current.set(id, txt);\n setHistoryTick((t) => t + 1);\n }\n }\n } else if (!patch.valueLabel && has) {\n const txt = valueLabelsRef.current.get(o);\n valueLabelsRef.current.delete(o);\n if (txt) {\n try { boardRef.current.removeObject(txt); } catch { /* ignore */ }\n // Xoá log entry value-label tương ứng\n const txtId = localIdOf(txt);\n if (txtId) {\n creationLogRef.current = creationLogRef.current.filter((e) => e.id !== txtId);\n objMapRef.current.delete(txtId);\n setHistoryTick((t) => t + 1);\n }\n }\n }\n }\n if (patch.attrs) {\n try { o.setAttribute(patch.attrs); } catch { /* ignore */ }\n const id = localIdOf(o);\n if (id) {\n const entry = creationLogRef.current.find((e) => e.id === id);\n if (entry) entry.attrs = { ...entry.attrs, ...patch.attrs };\n setHistoryTick((t) => t + 1);\n }\n }\n try { boardRef.current.update(); } catch { /* ignore */ }\n }, [createValueLabelFor, localIdOf, nextLocalId]);\n\n const clearPreviewSegs = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n for (const s of previewSegRef.current) {\n try { b.removeObject(s); } catch { /* ignore */ }\n }\n previewSegRef.current = [];\n }, []);\n\n const removePhantom = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n if (previewShapeRef.current) {\n try { b.removeObject(previewShapeRef.current); } catch { /* ignore */ }\n previewShapeRef.current = null;\n }\n if (phantomRef.current) {\n try { b.removeObject(phantomRef.current); } catch { /* ignore */ }\n phantomRef.current = null;\n }\n }, []);\n\n const clearPending = useCallback(() => {\n removePhantom();\n clearPreviewSegs();\n pendingRef.current = [];\n setPendingCount(0);\n }, [clearPreviewSegs, removePhantom]);\n\n // === Selection helpers (used by the `select` tool) ===\n const applySelectionStyle = useCallback((obj: JxgObj) => {\n if (!obj || selOriginalRef.current.has(obj)) return;\n try {\n const visProp = obj.visProp ?? {};\n selOriginalRef.current.set(obj, {\n strokeColor: visProp.strokecolor,\n strokeWidth: visProp.strokewidth,\n });\n const kind = objKind(obj);\n if (kind === 'point') {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n } else {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n }\n } catch { /* ignore */ }\n }, []);\n\n const restoreSelectionStyle = useCallback((obj: JxgObj) => {\n const orig = selOriginalRef.current.get(obj);\n if (!orig) return;\n try {\n const attrs: Record<string, unknown> = {};\n if (orig.strokeColor !== undefined) attrs.strokeColor = orig.strokeColor;\n if (orig.strokeWidth !== undefined) attrs.strokeWidth = orig.strokeWidth;\n obj.setAttribute(attrs);\n } catch { /* ignore */ }\n selOriginalRef.current.delete(obj);\n }, []);\n\n const clearSelection = useCallback(() => {\n for (const o of selectedSetRef.current) {\n restoreSelectionStyle(o);\n }\n selectedSetRef.current.clear();\n setSelectionTick((t) => t + 1);\n try { boardRef.current?.update(); } catch { /* ignore */ }\n }, [restoreSelectionStyle]);\n\n const toggleSelect = useCallback((obj: JxgObj, additive: boolean) => {\n if (!obj) return;\n if (!additive) {\n // Single-click replace: clear others first.\n for (const o of selectedSetRef.current) {\n if (o !== obj) restoreSelectionStyle(o);\n }\n selectedSetRef.current = new Set([obj]);\n applySelectionStyle(obj);\n } else {\n if (selectedSetRef.current.has(obj)) {\n restoreSelectionStyle(obj);\n selectedSetRef.current.delete(obj);\n } else {\n selectedSetRef.current.add(obj);\n applySelectionStyle(obj);\n }\n }\n setSelectionTick((t) => t + 1);\n try { boardRef.current?.update(); } catch { /* ignore */ }\n }, [applySelectionStyle, restoreSelectionStyle]);\n\n const deleteSelected = useCallback(() => {\n const board = boardRef.current;\n if (!board) return;\n if (selectedSetRef.current.size === 0) return;\n // Drop highlight first so removal doesn't try to setAttribute on dead obj.\n for (const o of selectedSetRef.current) selOriginalRef.current.delete(o);\n for (const o of selectedSetRef.current) {\n try { board.removeObject(o); } catch { /* ignore */ }\n }\n selectedSetRef.current.clear();\n // Cascade-prune log (same approach as delete tool)\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board.objects && board.objects[jxgId]) aliveIds.add(id);\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setSelectionTick((t) => t + 1);\n setHistoryTick((t) => t + 1);\n }, []);\n\n // Build a transient preview shape (not logged) from pending picks + phantom point.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const buildPreview = useCallback((toolDef: ToolDef, picks: any[], phantom: any) => {\n const b = boardRef.current;\n if (!b) return null;\n const style = { strokeColor: '#3b82f6', strokeWidth: 1.5, strokeOpacity: 0.65, dash: 2, fixed: true, highlight: false, withLabel: false } as Record<string, unknown>;\n const circStyle = { ...style, fillColor: 'none', fillOpacity: 0 };\n try {\n switch (toolDef.key) {\n case 'segment':\n case 'midpoint':\n case 'distance':\n return b.create('segment', [picks[0], phantom], style);\n case 'line':\n return b.create('line', [picks[0], phantom], style);\n case 'ray':\n return b.create('line', [picks[0], phantom], { ...style, straightFirst: false, straightLast: true });\n case 'vector':\n return b.create('arrow', [picks[0], phantom], style);\n case 'circleCenter':\n return b.create('circle', [picks[0], phantom], circStyle);\n case 'circle3':\n if (picks.length === 1) return b.create('circle', [picks[0], phantom], circStyle);\n if (picks.length === 2) return b.create('circumcircle', [picks[0], picks[1], phantom], circStyle);\n return null;\n case 'angle':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('angle', [picks[0], picks[1], phantom], { ...style, radius: 1, fillColor: '#22c55e', fillOpacity: 0.15 });\n return null;\n case 'perpBisector':\n return b.create('segment', [picks[0], phantom], style);\n case 'angleBisector':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('bisector', [picks[0], picks[1], phantom], style);\n return null;\n case 'perpendicular':\n case 'parallel':\n case 'tangent':\n if (picks.length === 1) {\n const k = objKind(picks[0]);\n if (k === 'line' && toolDef.key !== 'tangent') {\n return b.create(toolDef.key, [picks[0], phantom], style);\n }\n if (k === 'circle' && toolDef.key === 'tangent') {\n const glider = b.create('glider', [phantom.X(), phantom.Y(), picks[0]], { visible: false, withLabel: false });\n return b.create('tangent', [glider], style);\n }\n }\n return null;\n default:\n return null;\n }\n } catch {\n return null;\n }\n }, []);\n\n // Tear down old preview shape and build a new one from current picks + phantom.\n const refreshPreview = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n // Tear down current preview shape (not the phantom)\n if (previewShapeRef.current) {\n try { b.removeObject(previewShapeRef.current); } catch { /* ignore */ }\n previewShapeRef.current = null;\n }\n const t = toolRef.current;\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n const picks = pendingRef.current;\n if (picks.length === 0 || toolDef.needs <= 0) return;\n if (picks.length >= toolDef.needs) return;\n // Create phantom if missing\n if (!phantomRef.current) {\n try {\n phantomRef.current = b.create('point', [0, 0], { visible: false, fixed: true, withLabel: false, name: '' });\n } catch { return; }\n }\n previewShapeRef.current = buildPreview(toolDef, picks, phantomRef.current);\n }, [buildPreview]);\n\n // Apply tool action with a sequence of picked refs\n const finalize = useCallback((toolDef: ToolDef, picks: JxgObj[]) => {\n if (!boardRef.current) return;\n const labels = picks.map(localIdOf).filter(Boolean) as string[];\n // For open shapes (segment, line, ray, vector). `color` shorthand also fills\n // closed shapes, so we use explicit strokeColor + transparent fillOpacity for\n // anything closed (circle, polygon, angle).\n const stroke = { strokeColor: '@stroke', strokeWidth: 2 };\n const strokeOnly = { ...stroke, fillColor: 'none', fillOpacity: 0 };\n const lblName = nextLabel();\n switch (toolDef.key) {\n case 'midpoint':\n create('midpoint', labels, { name: lblName, color: '@stroke', size: 3 });\n break;\n case 'segment':\n create('segment', labels, stroke);\n break;\n case 'line':\n create('line', labels, stroke);\n break;\n case 'ray': {\n // JSXGraph: 'line' with straightFirst:false, straightLast:true\n create('line', labels, { ...stroke, straightFirst: false, straightLast: true });\n break;\n }\n case 'vector':\n create('arrow', labels, stroke);\n break;\n case 'perpendicular': {\n // [point, line] in that order; JSXGraph perpendicular expects (line, point)\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('perpendicular', [l, p], stroke);\n break;\n }\n case 'parallel': {\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('parallel', [l, p], stroke);\n break;\n }\n case 'perpBisector': {\n // JSXGraph 1.12.x doesn't register a `perpendicularbisector` element\n // (only `perpendicular`, `perpendicularpoint`, `perpendicularsegment`).\n // Build it from primitives: midpoint M of P1P2, then a perpendicular\n // line to the segment P1P2 through M. Helpers are invisible but logged\n // so deserialize-on-reload reconstructs the dependency chain.\n const mid = create('midpoint', labels, { visible: false, withLabel: false, name: '' });\n const seg = create('segment', labels, { visible: false, withLabel: false });\n const midId = localIdOf(mid);\n const segId = localIdOf(seg);\n if (midId && segId) create('perpendicular', [segId, midId], stroke);\n break;\n }\n case 'angleBisector':\n create('bisector', labels, stroke);\n break;\n case 'circleCenter':\n create('circle', labels, strokeOnly);\n break;\n case 'circle3':\n create('circumcircle', labels, strokeOnly);\n break;\n case 'tangent': {\n // Need to find the actual point pick (not just by slot index) since\n // the user can click circle-then-point OR point-then-circle.\n const firstIsPoint = picks[0] && objKind(picks[0]) === 'point';\n const pointPick = firstIsPoint ? picks[0] : picks[1];\n const circleLabel = firstIsPoint ? labels[1] : labels[0];\n if (!pointPick || !circleLabel) break;\n const px = typeof pointPick.X === 'function' ? pointPick.X() : 0;\n const py = typeof pointPick.Y === 'function' ? pointPick.Y() : 0;\n const glider = create('glider', [px, py, circleLabel], { name: '', size: 2, strokeColor: '#666', visible: false });\n const gid = localIdOf(glider);\n if (gid) create('tangent', [gid], stroke);\n break;\n }\n case 'angle': {\n // JSXGraph vẽ cung từ BA → BC theo chiều dương (ngược chiều kim đồng hồ).\n // Nếu cross(BA, BC) < 0 thì cung CCW từ BA → BC > 180° → đổi vai trò A,C\n // để luôn hiển thị góc nhọn/tù thay vì góc phản (reflex).\n const [pa, pb, pc] = picks;\n let order: string[] = labels;\n try {\n const ax = pa.X() - pb.X(), ay = pa.Y() - pb.Y();\n const cx = pc.X() - pb.X(), cy = pc.Y() - pb.Y();\n const cross = ax * cy - ay * cx;\n if (cross < 0) order = [labels[2], labels[1], labels[0]];\n } catch { /* fallback giữ thứ tự */ }\n create('angle', order, {\n radius: 1,\n fillColor: '#22c55e',\n fillOpacity: 0.25,\n strokeColor: '#16a34a',\n strokeWidth: 1.5,\n name: '',\n withLabel: false,\n });\n break;\n }\n case 'distance': {\n const pA = picks[0], pB = picks[1];\n const dist = Math.hypot((pA.X() - pB.X()), (pA.Y() - pB.Y()));\n const midX = (pA.X() + pB.X()) / 2;\n const midY = (pA.Y() + pB.Y()) / 2;\n create('text', [midX, midY, `d = ${dist.toFixed(2)}`], { fontSize: 14, color: '#dc2626' });\n break;\n }\n case 'polygon': {\n create('polygon', labels, { fillColor: '#1e3a8a', fillOpacity: 0.10, borders: { strokeColor: '@stroke', strokeWidth: 2 } });\n break;\n }\n case 'area': {\n create('polygon', labels, { fillColor: '#3b82f6', fillOpacity: 0.18, borders: { strokeColor: '#1d4ed8', strokeWidth: 2 } });\n break;\n }\n case 'toggleLabel': {\n const obj = picks[0];\n try {\n if (obj.label) {\n const visible = obj.label.visProp.visible !== false;\n obj.label.setAttribute({ visible: !visible });\n } else if (obj.setAttribute) {\n // For elements without explicit label, toggle 'withLabel'\n const cur = obj.visProp.withlabel !== false;\n obj.setAttribute({ withLabel: !cur });\n }\n boardRef.current.update();\n } catch { /* ignore */ }\n break;\n }\n case 'toggleVisible': {\n const obj = picks[0];\n try {\n const visible = obj.visProp.visible !== false;\n obj.setAttribute({ visible: !visible });\n boardRef.current.update();\n } catch { /* ignore */ }\n break;\n }\n case 'delete': {\n const obj = picks[0];\n try {\n boardRef.current.removeObject(obj);\n // JSXGraph cascade-removes dependents (e.g. xoá point → segment dùng\n // point đó cũng biến mất). Đồng bộ log: walk objMap, giữ lại id nào\n // vẫn còn trong board.objects; còn lại drop khỏi log + map. Trước\n // patch, chỉ entry chính bị xoá → log dangling reference, replay sẽ\n // throw vì id phụ thuộc không resolve được.\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n } catch { /* ignore */ }\n break;\n }\n }\n }, [create, localIdOf, nextLabel]);\n\n const finalizeTransformCreate = useCallback((\n spec: { params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' }; chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }> },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any,\n ) => {\n if (!boardRef.current) return;\n const def = getDefiningPoints(source);\n if (!def) { flashWarn('Không thể biến đổi đối tượng này'); return; }\n\n // 1. Create + log transform entry/entries. Chain mode (dilate): create N\n // transforms in order, log each, and apply them as an array.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformObjs: any[] = [];\n const transformIds: string[] = [];\n const steps = spec.chain ?? [{ params: spec.params, attrs: spec.attrs }];\n for (const step of steps) {\n const stepLogArgs: unknown[] = [];\n for (const p of step.params) {\n if (typeof p === 'function') {\n flashWarn('Tham số transform không serialize được — bỏ qua');\n return;\n }\n if (p && typeof p === 'object') {\n const id = localIdOf(p);\n if (!id) {\n flashWarn('Đối tượng tham chiếu không nằm trong board — không thể biến đổi');\n return;\n }\n stepLogArgs.push(id);\n } else {\n stepLogArgs.push(p);\n }\n }\n const stepId = nextLocalId();\n const stepObj = boardRef.current.create('transform', step.params, step.attrs);\n creationLogRef.current.push({ id: stepId, type: 'transform', args: stepLogArgs, attrs: step.attrs as Record<string, unknown> });\n objMapRef.current.set(stepId, stepObj);\n transformObjs.push(stepObj);\n transformIds.push(stepId);\n }\n const transformParent = transformObjs.length === 1 ? transformObjs[0] : transformObjs;\n const transformLogRef = transformObjs.length === 1 ? transformIds[0] : transformIds;\n\n // 2. Transform each defining point — log each.\n // JSXGraph signature: create('point', [parentElement, transformation|transformationArray])\n // — SOURCE element first, transformation second. Reversing the order made\n // JSXGraph reject the call (\"Can't create point with parent types 'object'\n // and 'object'\"), crashing the rotate tool prior to this fix.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformedPoints: any[] = def.points.map((src) => {\n const srcId = localIdOf(src);\n const id = nextLocalId();\n const srcName = typeof src.name === 'string' ? src.name : '';\n const newName = srcName ? `${srcName}'` : nextLabel();\n const attrs = { name: newName, size: 3, color: '#0ea5e9', strokeColor: '#0ea5e9', fillColor: '#0ea5e9' };\n const obj = boardRef.current!.create('point', [src, transformParent], attrs);\n creationLogRef.current.push({ id, type: 'point', args: [srcId ?? src, transformLogRef], attrs });\n objMapRef.current.set(id, obj);\n return obj;\n });\n\n // 3. Recreate same-kind object from transformed points\n const baseStyle = { ...def.attrs, strokeColor: '#0ea5e9' };\n const strokeOnly = { ...baseStyle, fillColor: 'none', fillOpacity: 0 };\n const ids = transformedPoints.map((p) => localIdOf(p)).filter((s): s is string => !!s);\n switch (def.kind) {\n case 'point': /* nothing — already created */ break;\n case 'segment': create('segment', ids, baseStyle); break;\n case 'line': create('line', ids, baseStyle); break;\n case 'ray': create('line', ids, { ...baseStyle, straightFirst: false, straightLast: true }); break;\n case 'arrow': create('arrow', ids, baseStyle); break;\n case 'circleCenter': create('circle', ids, strokeOnly); break;\n case 'circle3': create('circumcircle', ids, strokeOnly); break;\n }\n setHistoryTick((t) => t + 1);\n }, [create, flashWarn, localIdOf, nextLabel, nextLocalId]);\n\n // Undo: remove the most recently logged creation. Also clears any in-progress\n // polygon construction (pending picks + preview segments) so state is sane.\n const undoLast = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n while (creationLogRef.current.length > 0) {\n const last = creationLogRef.current.pop();\n if (!last) break;\n const obj = objMapRef.current.get(last.id);\n objMapRef.current.delete(last.id);\n if (obj) {\n try { b.removeObject(obj); } catch { /* ignore */ }\n clearPending();\n setHistoryTick((t) => t + 1);\n try { b.update(); } catch { /* ignore */ }\n return;\n }\n // Skip stale log entry (object already gone) and continue popping\n }\n setHistoryTick((t) => t + 1);\n }, [clearPending]);\n\n // Global Ctrl/Cmd+Z + Esc while the panel is mounted. Skipped when focus is\n // in a text input so we don't hijack other undo flows. Capture phase + stop\n // propagation so Excalidraw's underlying undo doesn't also fire when the\n // panel is open on top of the whiteboard. Esc cancels in-progress picks.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z' && !e.shiftKey) {\n if (inField) return;\n e.preventDefault();\n e.stopPropagation();\n undoLastRef.current();\n return;\n }\n if (e.key === 'Escape' && !inField) {\n if (pendingRef.current.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearPendingRef.current();\n }\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearSelectionRef.current();\n }\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && !inField) {\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n deleteSelectedRef.current();\n }\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, []);\n\n // Translate a pointer event into JSXGraph SVG-pixel coords (the coord system\n // `hasPoint` uses). Falls back to manual rect math if `getMousePosition` is\n // unavailable (e.g. in tests with a mocked board).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const screenCoordsOf = useCallback((evt: any): [number, number] | null => {\n const b = boardRef.current;\n if (!b) return null;\n try {\n const mp = b.getMousePosition ? b.getMousePosition(evt) : null;\n if (mp && mp.length >= 2) return [mp[0], mp[1]];\n } catch { /* fall through */ }\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const cx = evt.clientX ?? evt.touches?.[0]?.clientX ?? 0;\n const cy = evt.clientY ?? evt.touches?.[0]?.clientY ?? 0;\n return [cx - rect.left, cy - rect.top];\n }\n return null;\n }, []);\n\n // Find which JSXGraph object (if any) is at a given pointer event.\n // JSXGraph's `hasPoint` expects coords in the board's SVG pixel space, not\n // viewport-relative clientX/Y. Without this, hits are offset by the\n // container's page position and existing points never snap.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const objectsAt = useCallback((evt: any): JxgObj[] => {\n const b = boardRef.current;\n if (!b) return [];\n const sc = screenCoordsOf(evt);\n if (!sc) return [];\n const [sx, sy] = sc;\n const list: JxgObj[] = [];\n try {\n const objs = b.objectsList || [];\n for (const o of objs) {\n try {\n if (o.hasPoint && o.hasPoint(sx, sy)) list.push(o);\n } catch { /* ignore */ }\n }\n } catch { /* ignore */ }\n return list;\n }, [screenCoordsOf]);\n\n // Generous point-snap: JSXGraph's `hasPoint` for a point uses the visual\n // radius (~3px) which is too strict for click targeting. When a tool needs\n // a point pick, fall back to \"nearest point within tolPx pixels\".\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const findNearestPoint = useCallback((evt: any, tolPx: number = 12): JxgObj | null => {\n const b = boardRef.current;\n if (!b) return null;\n const sc = screenCoordsOf(evt);\n if (!sc) return null;\n const [sx, sy] = sc;\n const tol2 = tolPx * tolPx;\n let best: { obj: JxgObj; d2: number } | null = null;\n try {\n const objs = b.objectsList || [];\n for (const o of objs) {\n try {\n if (objKind(o) !== 'point') continue;\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n const dx = pc[1] - sx;\n const dy = pc[2] - sy;\n const d2 = dx * dx + dy * dy;\n if (d2 <= tol2 && (!best || d2 < best.d2)) best = { obj: o, d2 };\n } catch { /* ignore */ }\n }\n } catch { /* ignore */ }\n return best ? best.obj : null;\n }, [screenCoordsOf]);\n\n // Label-aware snap: if the click landed on a JSXGraph text label (drawn near\n // each named element with `display:'internal'`), follow it back to the owning\n // element. Without this, clicking the \"A\" label of a point with the segment\n // tool falls through to `findNearestPoint` and — when the label center is\n // beyond the 12 px tolerance — creates a duplicate point right next to A.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const promoteLabel = useCallback((o: JxgObj): JxgObj => {\n if (!o) return o;\n const t = (o.elType || o.type || '').toString().toLowerCase();\n if (t !== 'text') return o;\n const b = boardRef.current;\n if (!b) return o;\n try {\n for (const c of (b.objectsList || [])) {\n if (c.label === o) return c;\n }\n } catch { /* ignore */ }\n return o;\n }, []);\n\n // Pending transform state for rotate/dilate/regularPolygon (needs param popover)\n interface PendingTransform {\n tool: 'rotate' | 'dilate' | 'regularPolygon';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n center: any;\n anchorScreen: { x: number; y: number };\n }\n const pendingTransformRef = useRef<PendingTransform | null>(null);\n type TransformPopoverInfo = { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null;\n const transformSubsRef = useRef<Set<(info: TransformPopoverInfo) => void>>(new Set());\n const emitTransform = useCallback((info: TransformPopoverInfo) => {\n transformSubsRef.current.forEach((cb) => { try { cb(info); } catch { /* ignore */ } });\n }, []);\n\n // Selection subscribers — emitted when Move tool single-clicks an object\n const selectSubsRef = useRef<Set<(snap: ObjectSnapshot) => void>>(new Set());\n const emitSelect = useCallback((snap: ObjectSnapshot) => {\n selectSubsRef.current.forEach((cb) => { try { cb(snap); } catch { /* ignore */ } });\n }, []);\n\n // Track pointer-down position for click vs drag detection in Move tool\n const moveDownRef = useRef<{ sx: number; sy: number } | null>(null);\n // Track previous Move-tool click for double-click detection (open popover only\n // on 2nd click within 400ms on the same object).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const lastMoveClickRef = useRef<{ obj: any | null; time: number }>({ obj: null, time: 0 });\n\n // Initialize board\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n (async () => {\n const JXG = (await import('jsxgraph')).default;\n if (cancelled || !containerRef.current) return;\n jxgRef.current = JXG;\n // Render text/labels as SVG <text> (default 'html' uses absolute-positioned\n // <div> overlays, which are NOT captured when we clone the SVG to export\n // the stamp → labels disappear in inserted image).\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n // Label tone theo theme — JSXGraph mặc định stroke black cho text label.\n opts.label.strokeColor = themeLabel(isDarkRef.current);\n opts.text.strokeColor = themeLabel(isDarkRef.current);\n }\n } catch { /* ignore */ }\n const board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: initialState?.bbox ?? [-10, 10, 10, -10],\n axis: false, // We manage axis manually via toggle for clean default\n grid: false,\n showCopyright: false,\n showNavigation: true,\n // Keep 1:1 user→pixel ratio so circles stay circular regardless of the\n // container aspect ratio (Excalidraw panel is taller than wide and\n // without this circles became ellipses after reload).\n keepAspectRatio: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: true },\n // Looser hit-test radius so clicking on a thin segment/line/circle\n // actually registers without pixel-perfect aim. `precision` is a real\n // JSXGraph option (Options.precision) but isn't in the d.ts file.\n ...({ precision: { hasPoint: 8, mouse: 4, touch: 16 } } as Record<string, unknown>),\n });\n boardRef.current = board;\n\n // Replay initial state if any\n if (initialState && initialState.elements.length > 0) {\n const idMap = objMapRef.current;\n for (const el of initialState.elements) {\n const resolved = el.args.map(a => (typeof a === 'string' && idMap.has(a)) ? idMap.get(a) : a);\n try {\n if (el.type === 'valueLabel') {\n // Synthetic: regenerate dynamic text gắn với target.\n const target = resolved[0];\n if (target) {\n const txt = createValueLabelFor(target);\n if (txt) {\n idMap.set(el.id, txt);\n valueLabelsRef.current.set(target, txt);\n }\n }\n continue;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, paletteFor(isDarkRef.current));\n const obj = board.create(el.type, resolved, themedAttrs);\n idMap.set(el.id, obj);\n } catch (err) {\n console.warn('Replay failed for', el.type, err);\n }\n }\n creationLogRef.current = [...initialState.elements];\n labelIdxRef.current = initialState.elements.filter(e => e.type === 'point').length;\n }\n\n // Initial axis/grid\n if (showAxisRef.current) {\n try {\n axisObjsRef.current.x = board.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = board.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n } catch { /* ignore */ }\n }\n if (showGridRef.current) {\n try { board.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 }); } catch { /* ignore */ }\n }\n\n // Pointer down: handle click-driven tool actions.\n // Full dispatch logic lives in handlers.ts (handleDown). A stable ctx\n // object is built here so the closure captured at mount stays thin.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('down', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleDown(ctx, e);\n });\n\n // Pointer up: DOUBLE-click on Move tool emits selection. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('up', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleUp(ctx, e);\n });\n\n // Mouse move: update phantom + marquee. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('move', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleMove(ctx, e);\n });\n\n onReady({\n getContainer: () => containerRef.current,\n // Sync toạ độ live của free point về log trước khi trả ra. JSXGraph\n // cho phép drag free point (args=[x,y] không có ref), việc drag chỉ\n // cập nhật obj.X()/Y() trên board chứ không đụng log → re-edit + Chèn\n // sẽ serialize toạ độ cũ → SVG không đổi → fileId trùng → user thấy\n // \"k thay đổi\". Line/segment/circle/polygon tham chiếu point qua id\n // nên auto-update theo.\n getCreationLog: () => creationLogRef.current.map((e) => {\n if (e.type !== 'point') return { ...e };\n const args = e.args;\n if (!Array.isArray(args) || args.length !== 2) return { ...e };\n if (typeof args[0] !== 'number' || typeof args[1] !== 'number') return { ...e };\n const obj = objMapRef.current.get(e.id) as\n | { X?: () => number; Y?: () => number }\n | undefined;\n if (!obj || typeof obj.X !== 'function' || typeof obj.Y !== 'function') return { ...e };\n const x = obj.X();\n const y = obj.Y();\n if (!Number.isFinite(x) || !Number.isFinite(y)) return { ...e };\n return { ...e, args: [x, y] };\n }),\n getBbox: () => boardRef.current ? boardRef.current.getBoundingBox() : [-10, 10, 10, -10],\n getShowAxis: () => showAxisRef.current,\n getShowGrid: () => showGridRef.current,\n setTool: (t: GeomTool) => handleToolChangeRef.current(t),\n getTool: () => toolRef.current,\n setShowAxis: (b: boolean) => setShowAxisRef.current(b),\n setShowGrid: (b: boolean) => setShowGridRef.current(b),\n undo: () => undoLastRef.current(),\n canUndo: () => creationLogRef.current.length > 0,\n subscribe: (cb: () => void) => {\n subscribersRef.current.add(cb);\n return () => { subscribersRef.current.delete(cb); };\n },\n snapshotObject,\n mutateObject,\n getAllPointNames: () => {\n const b = boardRef.current;\n if (!b) return [];\n const out: string[] = [];\n try {\n const objs = b.objectsList || [];\n for (const o of objs) {\n if (objKind(o) === 'point' && typeof o.name === 'string' && o.name) {\n out.push(o.name);\n }\n }\n } catch { /* ignore */ }\n return out;\n },\n onSelect: (cb: (snap: ObjectSnapshot) => void) => {\n selectSubsRef.current.add(cb);\n return () => { selectSubsRef.current.delete(cb); };\n },\n onTransformParam: (cb: (info: TransformPopoverInfo) => void) => {\n transformSubsRef.current.add(cb);\n return () => { transformSubsRef.current.delete(cb); };\n },\n confirmTransformParam: (value: number) => {\n const p = pendingTransformRef.current;\n if (!p) return;\n if (p.tool === 'regularPolygon') {\n const n = Math.max(3, Math.round(value));\n const p1Id = localIdOf(p.source);\n const p2Id = localIdOf(p.center);\n if (p1Id && p2Id && boardRef.current) {\n try {\n create('regularpolygon', [p1Id, p2Id, n], {\n fillColor: '#1e3a8a',\n fillOpacity: 0.10,\n borders: { strokeColor: '@stroke', strokeWidth: 2 },\n });\n } catch (err) {\n console.warn('regularpolygon failed', err);\n }\n }\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n return;\n }\n const spec = p.tool === 'rotate'\n ? buildTransformSpec({ kind: 'rotate', center: p.center, angleDeg: value })\n : buildTransformSpec({ kind: 'dilate', center: p.center, k: value });\n finalizeTransformCreateRef.current(spec, p.source);\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n cancelTransformParam: () => {\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n getSelectionSize: () => selectedSetRef.current.size,\n clearSelection: () => clearSelectionRef.current(),\n deleteSelection: () => deleteSelectedRef.current(),\n });\n })();\n return () => {\n cancelled = true;\n if (previewRafRef.current != null) {\n cancelAnimationFrame(previewRafRef.current);\n previewRafRef.current = null;\n }\n if (boardRef.current && jxgRef.current) {\n try { jxgRef.current.JSXGraph.freeBoard(boardRef.current); } catch { /* ignore */ }\n boardRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n // React to axis/grid toggle changes after init\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n try {\n // Remove existing axes if present\n if (axisObjsRef.current.x) { try { b.removeObject(axisObjsRef.current.x); } catch { /* ignore */ } axisObjsRef.current.x = undefined; }\n if (axisObjsRef.current.y) { try { b.removeObject(axisObjsRef.current.y); } catch { /* ignore */ } axisObjsRef.current.y = undefined; }\n if (showAxis) {\n axisObjsRef.current.x = b.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = b.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n }\n b.update();\n } catch { /* ignore */ }\n }, [showAxis]);\n\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n try {\n // Find existing grid objects and remove\n const objs = Object.values(b.objects || {}) as JxgObj[];\n for (const o of objs) {\n if (o && (o.elType === 'grid' || o.type === 'grid' || (o.visProp && o.visProp.type === 'grid'))) {\n try { b.removeObject(o); } catch { /* ignore */ }\n }\n }\n if (showGrid) {\n b.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 });\n }\n b.update();\n } catch { /* ignore */ }\n }, [showGrid]);\n\n const handleToolChange = useCallback((t: GeomTool) => {\n clearPending();\n // Update the ref synchronously so subsequent pointer-down events (e.g. a\n // fast user click immediately after picking a tool) see the new tool\n // without waiting for React's commit phase.\n toolRef.current = t;\n setTool(t);\n // Disable JSXGraph pan while the user is in the select tool so that\n // drag-empty starts a marquee selection instead of panning the board.\n // Re-enable for every other tool (board pan is the default).\n const b = boardRef.current;\n if (b) {\n try {\n if (b.attr?.pan) b.attr.pan.enabled = (t !== 'select');\n } catch { /* ignore */ }\n }\n }, [clearPending]);\n\n // Stable ref so onReady closure (captured at mount) can call latest handler.\n const handleToolChangeRef = useRef(handleToolChange);\n handleToolChangeRef.current = handleToolChange;\n\n // Subscribers thông báo bên ngoài khi state thay đổi (tool / axis / grid / undo)\n const subscribersRef = useRef<Set<() => void>>(new Set());\n const notifySubscribers = useCallback(() => {\n subscribersRef.current.forEach((cb) => {\n try { cb(); } catch { /* ignore */ }\n });\n }, []);\n\n // Phát tín hiệu khi state thay đổi\n useEffect(() => { notifySubscribers(); }, [tool, showAxis, showGrid, historyTick, notifySubscribers]);\n\n const undoLastRef = useRef(undoLast);\n undoLastRef.current = undoLast;\n const clearPendingRef = useRef(clearPending);\n clearPendingRef.current = clearPending;\n const finalizeTransformCreateRef = useRef(finalizeTransformCreate);\n finalizeTransformCreateRef.current = finalizeTransformCreate;\n const clearSelectionRef = useRef(clearSelection);\n clearSelectionRef.current = clearSelection;\n const deleteSelectedRef = useRef(deleteSelected);\n deleteSelectedRef.current = deleteSelected;\n const emitTransformRef = useRef(emitTransform);\n emitTransformRef.current = emitTransform;\n const setShowAxisRef = useRef(setShowAxis);\n setShowAxisRef.current = setShowAxis;\n const setShowGridRef = useRef(setShowGrid);\n setShowGridRef.current = setShowGrid;\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"jxgmini-container\"\n className=\"h-full min-h-0 bg-white\"\n style={{ touchAction: 'none' }}\n />\n );\n};\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-6 w-6 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS, GROUP_LABELS, type GeomTool, type ToolDef } from './MiniBoard';\nimport { GROUP_ORDER, letterForGroup, type GeomGroup } from './tools';\nimport { MobileToolDrawer, type MobileToolGroup } from '../../shared/MobileToolDrawer';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shared shell (desktop) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isDark?: boolean;\n closeLabel?: string;\n}\n\nfunction Shell({ title, icon, onClose, children, isDark, closeLabel = 'Đóng' }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label={closeLabel}\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Icons ----------\n\nconst GeometryIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n );\n}\n\nfunction AxisIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nfunction GridIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n\n// ---------- Props ----------\n\ninterface GeometryLeftPanelProps {\n activeTool: GeomTool;\n onToolChange: (t: GeomTool) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onUndo: () => void;\n canUndo: boolean;\n onClose: () => void;\n isDark?: boolean;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n /** Chord shortcut: group đang được focus (sau khi bấm letter). null = không active. */\n chordGroup?: GeomGroup | null;\n}\n\n// ---------- Tooltip portal (desktop hover) ----------\n\nfunction useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: ToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n\n// ---------- Desktop left panel ----------\n\nfunction DesktopGeometryPanel(props: GeometryLeftPanelProps) {\n const { activeTool, onToolChange, showAxis, showGrid, onShowAxisChange, onShowGridChange, onUndo, canUndo, onClose, isDark, chordGroup } = props;\n\n const grouped = useMemo(() => {\n return TOOLS.reduce<Record<string, ToolDef[]>>((acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n }, {});\n }, []);\n const groupKeys = useMemo(\n () => GROUP_ORDER.filter((g) => grouped[g]),\n [grouped],\n );\n\n const activeGroupTools: ToolDef[] | null = chordGroup\n ? (grouped[chordGroup] ?? null)\n : null;\n\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n return (\n <>\n <Shell title=\"Hình học\" icon={GeometryIconHeader} onClose={onClose} isDark={isDark}>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxis}\n onChange={(e) => onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n Trục toạ độ\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showGrid}\n onChange={(e) => onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n </div>\n </Section>\n\n {groupKeys.map((group) => {\n const isChordActive = chordGroup === group;\n const dimmed = chordGroup !== null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive\n ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1'\n : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{GROUP_LABELS[group]}</span>\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {letterForGroup(group)}\n </span>\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group].map((t, i) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'relative flex h-8 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n <span\n data-testid={`chord-num-${t.key}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n active\n ? 'text-white/70'\n : isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {i + 1}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n );\n })}\n\n {chordGroup && activeGroupTools && (\n <div\n data-testid=\"chord-hint\"\n className=\"mt-1 rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {letterForGroup(chordGroup)}\n </span>\n <span className=\"mx-1 text-slate-400\">→</span>\n {activeGroupTools.map((t, i) => (\n <span key={t.key} className=\"mr-2 inline-block\">\n <span className=\"font-mono font-semibold text-emerald-700\">\n {i + 1}\n </span>\n <span className=\"ml-1\">{t.label}</span>\n </span>\n ))}\n <span className=\"text-slate-400\">Esc huỷ</span>\n </div>\n )}\n </Shell>\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\n// ---------- Mobile geometry panel (redesigned) ----------\n\nfunction MobileGeometryPanel(props: GeometryLeftPanelProps) {\n const {\n activeTool,\n onToolChange,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n isDark,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = useMemo<MobileToolGroup<GeomTool, ToolDef['group']>[]>(() => {\n const acc = new Map<ToolDef['group'], ToolDef[]>();\n for (const t of TOOLS) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n return Array.from(acc.entries()).map(([group, tools]) => ({\n group,\n groupLabel: GROUP_LABELS[group],\n tools: tools.map((t) => ({ key: t.key, label: t.label, icon: t.icon })),\n }));\n }, []);\n\n return (\n <MobileToolDrawer\n title=\"Hình học\"\n headerIcon={GeometryIconHeader}\n testId=\"stamp-left-panel\"\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={[\n {\n label: 'Trục',\n icon: <AxisIcon />,\n pressed: showAxis,\n onToggle: onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: 'Lưới',\n icon: <GridIcon />,\n pressed: showGrid,\n onToggle: onShowGridChange,\n testId: 'toggle-grid',\n },\n ]}\n actions={[\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: onUndo,\n disabled: !canUndo,\n },\n ]}\n groups={groups}\n activeTool={activeTool}\n onToolSelect={onToolChange}\n />\n );\n}\n\n// ---------- Public entry point ----------\n\nexport function LeftPanel(props: GeometryLeftPanelProps) {\n if (props.isMobile) {\n return <MobileGeometryPanel {...props} />;\n }\n return <DesktopGeometryPanel {...props} />;\n}\n\n// Alias for back-compat\nexport { LeftPanel as GeometryLeftPanel };\n","// 8 màu chính lấy từ Excalidraw DEFAULT_ELEMENT_STROKE_COLOR_PALETTE.\n// Nguồn: @excalidraw/excalidraw — packages/excalidraw/colors.ts (top row chuẩn).\n// Cần đồng bộ tay nếu Excalidraw đổi palette ở major bump.\nexport const STROKE_PALETTE = [\n '#1e1e1e', // black\n '#e03131', // red\n '#e8590c', // orange\n '#f08c00', // yellow\n '#2f9e44', // green\n '#1971c2', // blue\n '#9c36b5', // grape\n '#868e96', // gray\n] as const;\n\nexport type StrokeColor = (typeof STROKE_PALETTE)[number];\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 768px)';\nconst NO_HOVER_QUERY = '(hover: none)';\n\nexport interface MobileState {\n /** Viewport ≤ 768px — dùng để chuyển full-screen modal + drawer. */\n isMobile: boolean;\n /** Device không có hover (touch-only) — dùng để ẩn hover tooltips. */\n isTouchOnly: boolean;\n}\n\nfunction readMatch(query: string): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n try {\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\n/**\n * SSR-safe mobile detection qua matchMedia. Trả về `{ isMobile, isTouchOnly }`.\n * Re-render khi viewport resize hoặc input modality đổi (e.g., gắn Bluetooth mouse).\n */\nexport function useIsMobile(): MobileState {\n const [state, setState] = useState<MobileState>(() => ({\n isMobile: readMatch(MOBILE_QUERY),\n isTouchOnly: readMatch(NO_HOVER_QUERY),\n }));\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const tql = window.matchMedia(NO_HOVER_QUERY);\n const update = () => {\n setState({ isMobile: mql.matches, isTouchOnly: tql.matches });\n };\n update();\n mql.addEventListener('change', update);\n tql.addEventListener('change', update);\n return () => {\n mql.removeEventListener('change', update);\n tql.removeEventListener('change', update);\n };\n }, []);\n\n return state;\n}\n","'use client';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\nexport type ObjKind = 'point' | 'line' | 'circle';\nexport type PointFace = 'o' | 'circle' | 'cross' | 'plus';\n\nexport interface PropertyPatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n /** Bật/tắt value-label động (độ dài segment / bán kính circle). */\n valueLabel?: boolean;\n}\n\ninterface CommonProps {\n anchor: { x: number; y: number };\n onClose: () => void;\n onMutate: (patch: PropertyPatch) => void;\n isDark?: boolean;\n /** Trả về danh sách tên point hiện có (để rename auto-disambiguate). */\n getAllNames?: () => string[];\n}\n\ninterface PointProps extends CommonProps {\n kind: 'point';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n currentFace: PointFace;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n}\n\ninterface LineOrCircleProps extends CommonProps {\n kind: 'line' | 'circle';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n /** Có đang hiện value-label động không. */\n currentShowValue?: boolean;\n}\n\ntype Props = PointProps | LineOrCircleProps;\n\nconst DASH_OPTIONS: Array<{ value: number; label: string }> = [\n { value: 0, label: 'Nét liền' },\n { value: 2, label: 'Nét đứt' },\n { value: 1, label: 'Nét chấm' },\n];\n\nconst WIDTH_OPTIONS = [1, 2, 3];\n\nconst FACE_OPTIONS: Array<{ value: PointFace; symbol: string }> = [\n { value: 'o', symbol: '●' },\n { value: 'circle', symbol: '◯' },\n { value: 'cross', symbol: '✕' },\n { value: 'plus', symbol: '✚' },\n];\n\n// Unicode subscript digits — dùng để tự đặt tên duy nhất khi user nhập trùng.\n// Lưu dưới dạng ký tự subscript thì JSXGraph SVG <text> render đúng \"B₂\"\n// như label một glyph, không cần MathJax/KaTeX.\nconst SUB_DIGITS = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉'];\nconst SUB_SET = new Set(SUB_DIGITS);\n\nfunction toSubscript(n: number): string {\n return String(n).split('').map((d) => SUB_DIGITS[+d] ?? d).join('');\n}\n\nfunction stripTrailingSubscript(s: string): string {\n let i = s.length;\n while (i > 0 && SUB_SET.has(s[i - 1])) i--;\n return s.slice(0, i);\n}\n\nfunction disambiguateName(name: string, existing: Set<string>): string {\n if (!name) return name;\n if (!existing.has(name)) return name;\n const base = stripTrailingSubscript(name) || name;\n for (let n = 2; n < 1000; n++) {\n const candidate = base + toSubscript(n);\n if (!existing.has(candidate)) return candidate;\n }\n return name;\n}\n\ntype Section = 'color' | 'style' | 'size' | 'name' | null;\n\n// Inline icons (small, monochrome) — match the visual weight of Excalidraw's\n// floating action bar in the screenshot. All 16px viewBox 24x24.\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n style: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" /></svg>\n ),\n size: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\"><line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\" strokeWidth=\"1\" /><line x1=\"4\" y1=\"13\" x2=\"20\" y2=\"13\" strokeWidth=\"2\" /><line x1=\"4\" y1=\"17\" x2=\"20\" y2=\"17\" strokeWidth=\"3.2\" /></svg>\n ),\n name: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><text x=\"2\" y=\"17\" fontSize=\"14\" fontFamily=\"serif\" fontWeight=\"700\">A</text><text x=\"12\" y=\"17\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\">a</text></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\" /><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" /><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" /><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" /></svg>\n ),\n};\n\nexport const PropertiesPopover: React.FC<Props> = (props) => {\n const { anchor, onClose, onMutate, isDark, getAllNames } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n // Clamp anchor vào viewport sau khi render (measure actual rect).\n // Trên mobile, force bottom-center thay vì follow anchor (anchor có thể nằm\n // sát mép màn hình hoặc dưới ngón tay user → khó tap).\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n // Bottom-center, 12px above bottom safe area.\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n const initialName =\n props.kind === 'point' ? props.currentName : (props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const [name, setName] = useState<string>(initialName);\n // Khi popover mở lại trên đối tượng khác, đồng bộ name input.\n useEffect(() => {\n setName(initialName);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialName]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n // PointerDown covers mouse + touch + pen — replaces legacy mousedown listener\n // which excluded touch/pen and broke click-outside trên mobile.\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const pickColor = (c: string) => {\n onMutate({ attrs: { strokeColor: c, fillColor: props.kind === 'circle' ? 'none' : c, color: c } });\n };\n const pickDash = (d: number) => onMutate({ attrs: { dash: d } });\n const pickWidth = (w: number) => onMutate({ attrs: { strokeWidth: w } });\n const pickFace = (f: PointFace) => onMutate({ attrs: { face: f } });\n\n const currentName = (props.kind === 'point' || props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const commitName = () => {\n const trimmed = name.trim();\n if (trimmed === currentName) return;\n // Cho phép xoá tên (empty); chỉ disambiguate khi user nhập 1 cái gì đó.\n let final = trimmed;\n if (trimmed) {\n const others = new Set((getAllNames?.() ?? []).filter((n) => n !== currentName));\n final = disambiguateName(trimmed, others);\n }\n if (final !== name) setName(final);\n onMutate({ attrs: { name: final } });\n };\n\n const toggleShowLabel = (next: boolean) => onMutate({ attrs: { withLabel: next } });\n const toggleShowValue = (next: boolean) => onMutate({ valueLabel: next });\n\n const doDelete = () => { onMutate({ remove: true }); onClose(); };\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n\n const currentColor = props.currentColor;\n const currentDash = props.currentDash;\n const currentWidth = props.currentWidth;\n\n if (typeof document === 'undefined') return null;\n\n // Pill toolbar: row of icon buttons, separator before trash. Click một icon\n // để bung panel chi tiết bên dưới. Trash xoá ngay (không có panel).\n const PillBtn = ({ id, label, icon, active, onClick, indicatorColor }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean;\n onClick: () => void; indicatorColor?: string;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n {indicatorColor && (\n <span\n aria-hidden\n className=\"absolute bottom-0.5 left-1/2 -translate-x-1/2 h-1 w-4 rounded-full\"\n style={{ background: indicatorColor }}\n />\n )}\n </button>\n );\n\n const colorIndicatorTint = useMemo(() => currentColor, [currentColor]);\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label=\"Thuộc tính đối tượng\"\n >\n {/* Pill toolbar */}\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <PillBtn id=\"color\" label=\"Màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} indicatorColor={colorIndicatorTint} />\n <PillBtn id=\"style\" label=\"Kiểu\" icon={Icons.style} active={section === 'style'} onClick={() => toggleSection('style')} />\n <PillBtn id=\"size\" label=\"Độ dày\" icon={Icons.size} active={section === 'size'} onClick={() => toggleSection('size')} />\n <PillBtn id=\"name\" label=\"Tên\" icon={Icons.name} active={section === 'name'} onClick={() => toggleSection('name')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {/* Sub-panel — chỉ hiện khi user chọn 1 icon */}\n {section && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n {section === 'color' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => pickColor(c)}\n className={`h-6 w-6 rounded border ${currentColor === c ? 'border-emerald-500 ring-2 ring-emerald-300' : 'border-slate-200'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Kiểu</span>\n {props.kind === 'point' ? (\n <div className=\"flex gap-1\">\n {FACE_OPTIONS.map((f) => (\n <button\n key={f.value}\n aria-label={`Hình ${f.value}`}\n onClick={() => pickFace(f.value)}\n className={`h-7 w-7 rounded border text-sm ${(props as PointProps).currentFace === f.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {f.symbol}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex gap-1\">\n {DASH_OPTIONS.map((d) => (\n <button\n key={d.value}\n aria-label={`Kiểu ${d.label.toLowerCase()}`}\n onClick={() => pickDash(d.value)}\n className={`flex-1 rounded border px-1 py-1 text-[11px] ${currentDash === d.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {d.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {section === 'size' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Độ dày</span>\n <div className=\"flex gap-1\">\n {WIDTH_OPTIONS.map((w) => (\n <button\n key={w}\n aria-label={`Độ dày ${w}`}\n onClick={() => pickWidth(w)}\n className={`flex-1 rounded border py-1 ${currentWidth === w ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n <span className=\"inline-block rounded bg-slate-800\" style={{ width: 30, height: w }} />\n </button>\n ))}\n </div>\n </div>\n )}\n\n {section === 'name' && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Tên</span>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitName}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitName(); } }}\n autoFocus\n placeholder={props.kind === 'point' ? 'A, B, …' : props.kind === 'line' ? 'a, b, f, …' : 'O, c, …'}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <span className=\"text-[10px] text-slate-400\">Trùng tên sẽ tự thêm chỉ số (B → B₂)</span>\n </div>\n\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị tên</span>\n <input\n type=\"checkbox\"\n checked={props.currentShowLabel !== false}\n onChange={(e) => toggleShowLabel(e.target.checked)}\n aria-label=\"Hiển thị tên\"\n />\n </label>\n\n {(props.kind === 'line' || props.kind === 'circle') && (\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị giá trị</span>\n <input\n type=\"checkbox\"\n checked={!!(props as LineOrCircleProps).currentShowValue}\n onChange={(e) => toggleShowValue(e.target.checked)}\n aria-label=\"Hiển thị giá trị\"\n />\n </label>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ParamKind = 'rotate' | 'dilate' | 'regularPolygon';\n\ninterface Props {\n kind: ParamKind;\n anchor: { x: number; y: number };\n defaultValue: number;\n onConfirm: (value: number) => void;\n onCancel: () => void;\n isDark?: boolean;\n}\n\nconst LABELS: Record<ParamKind, { aria: string; label: string; step: number; min?: number }> = {\n rotate: { aria: 'Góc quay', label: 'Góc (°)', step: 15 },\n dilate: { aria: 'Tỷ số k', label: 'Tỷ số k', step: 0.5 },\n regularPolygon: { aria: 'Số cạnh đa giác đều', label: 'Số cạnh (n ≥ 3)', step: 1, min: 3 },\n};\n\nexport const TransformParamPopover: React.FC<Props> = ({ kind, anchor, defaultValue, onConfirm, onCancel, isDark }) => {\n const [value, setValue] = useState<number>(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const meta = LABELS[kind];\n\n useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n\n const submit = () => {\n let v = Number.isFinite(value) ? value : defaultValue;\n if (kind === 'regularPolygon') {\n v = Math.max(3, Math.round(v));\n }\n onConfirm(v);\n };\n\n if (typeof document === 'undefined') return null;\n\n const node = (\n <div\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-2 rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5`}\n style={{ left: anchor.x, top: anchor.y, minWidth: 180 }}\n role=\"dialog\"\n aria-label={meta.aria}\n >\n <label className=\"text-xs font-medium text-slate-700\">{meta.label}</label>\n <input\n ref={inputRef}\n type=\"number\"\n value={value}\n step={meta.step}\n min={meta.min}\n onChange={(e) => setValue(parseFloat(e.target.value))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n else if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={onCancel}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-xs text-slate-700 hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={submit}\n className=\"rounded bg-emerald-600 px-2 py-1 text-xs font-medium text-white hover:bg-emerald-700\"\n >\n Áp dụng\n </button>\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { JSXGraphMiniBoard, type MiniBoardHandle, type GeomTool, type ObjectSnapshot } from './MiniBoard';\nimport { serializeBoard, type SerializedBoard } from '../serialize';\nimport { renderGeometrySvgFromState } from '../render';\nimport { PropertiesPopover } from './PropertiesPopover';\nimport { TransformParamPopover } from './TransformParamPopover';\n\ninterface Props {\n initialState: SerializedBoard | null;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Khi true, panel position offset left để chừa chỗ cho StampLeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Callback khi handle/state thay đổi — parent sync LeftPanel state. */\n onStateChange?: (state: GeomBoardState) => void;\n isDark?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n}\n\nexport interface GeomBoardState {\n tool: GeomTool;\n showAxis: boolean;\n showGrid: boolean;\n canUndo: boolean;\n}\n\nexport interface GeometryEditorPanelHandle {\n setTool: (t: GeomTool) => void;\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n undo: () => void;\n /** Trigger Chèn programmatically (cho auto-insert khi click outside). */\n insert: () => boolean;\n /** Có nội dung để chèn không? */\n hasContent: () => boolean;\n}\n\nexport const GeometryEditorPanel = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanel({ initialState, onInsert, onClose, withLeftPanel = false, onStateChange, isDark, isMobile = false, onOpenDrawer }, ref) {\n const handleRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [propsPopover, setPropsPopover] = useState<ObjectSnapshot | null>(null);\n const [transformPopover, setTransformPopover] = useState<{ tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null>(null);\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => { onStateChangeRef.current = onStateChange; }, [onStateChange]);\n\n const emitState = useCallback(() => {\n const h = handleRef.current;\n const cb = onStateChangeRef.current;\n if (!h || !cb) return;\n cb({\n tool: h.getTool(),\n showAxis: h.getShowAxis(),\n showGrid: h.getShowGrid(),\n canUndo: h.canUndo(),\n });\n }, []);\n\n const handleReady = useCallback((h: MiniBoardHandle) => {\n handleRef.current = h;\n setReady(true);\n emitState();\n // Subscribe để parent biết khi nào tool/axis/grid/undo thay đổi\n h.subscribe(emitState);\n h.onSelect((snap: ObjectSnapshot) => setPropsPopover(snap));\n h.onTransformParam((info) => setTransformPopover(info));\n }, [emitState]);\n\n // Build serialized state (sentinels intact) — async vì SVG render offscreen\n // với light palette để Excalidraw filter tự đảo khi dark mode.\n const performInsert = useCallback((): boolean => {\n if (!handleRef.current) return false;\n const log = handleRef.current.getCreationLog();\n if (log.length === 0) return false;\n const bbox = handleRef.current.getBbox();\n const showAxis = handleRef.current.getShowAxis();\n const showGrid = handleRef.current.getShowGrid();\n const serialized = serializeBoard(\n { getBoundingBox: () => bbox, create: () => undefined },\n log,\n { showAxis, showGrid },\n );\n const jsonState = JSON.stringify(serialized);\n // Fire-and-forget. Caller (`tryInsert`) chỉ cần biết có nội dung không.\n void (async () => {\n try {\n const svgString = await renderGeometrySvgFromState(jsonState);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n })();\n return true;\n }, [onInsert]);\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n useImperativeHandle(ref, () => ({\n setTool: (t) => handleRef.current?.setTool(t),\n setShowAxis: (b) => handleRef.current?.setShowAxis(b),\n setShowGrid: (b) => handleRef.current?.setShowGrid(b),\n undo: () => handleRef.current?.undo(),\n insert: performInsert,\n hasContent: () => (handleRef.current?.getCreationLog().length ?? 0) > 0,\n }), [performInsert]);\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học\"\n data-testid=\"geometry-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : 'h-[540px] max-h-[85vh] w-[640px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"3,18 12,3 21,18\" />\n <circle cx=\"12\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"21\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n Dựng hình học\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geometry-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button onClick={onClose} aria-label=\"Đóng\" className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1\" style={isMobile ? undefined : { height: '420px' }}>\n <JSXGraphMiniBoard\n onReady={handleReady}\n initialState={initialState}\n isDark={isDark}\n />\n </div>\n {propsPopover && (\n propsPopover.kind === 'point' ? (\n <PropertiesPopover\n kind=\"point\"\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentFace={propsPopover.face}\n currentShowLabel={propsPopover.showLabel}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n // Refresh snapshot để UI checkbox phản ánh state mới\n if (typeof patch.valueLabel === 'boolean' || patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n }}\n />\n ) : (\n <PropertiesPopover\n kind={propsPopover.kind}\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentShowLabel={propsPopover.showLabel}\n currentShowValue={propsPopover.showValue}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n if (typeof patch.valueLabel === 'boolean') {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n if (patch.attrs && 'withLabel' in patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showLabel: !!patch.attrs?.withLabel } : cur);\n }\n }}\n />\n )\n )}\n\n {transformPopover && (\n <TransformParamPopover\n kind={transformPopover.tool}\n anchor={transformPopover.anchor}\n defaultValue={\n transformPopover.tool === 'rotate' ? 90\n : transformPopover.tool === 'dilate' ? 2\n : 6\n }\n isDark={isDark}\n onConfirm={(v) => { handleRef.current?.confirmTransformParam(v); setTransformPopover(null); }}\n onCancel={() => { handleRef.current?.cancelTransformParam(); setTransformPopover(null); }}\n />\n )}\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geometry-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n );\n },\n);\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseChordShortcutArgs<G extends string> {\n groupOrder: readonly G[];\n tools: ReadonlyArray<{ key: string; group: G }>;\n onSelect: (toolKey: string) => void;\n enabled: boolean;\n}\n\ninterface UseChordShortcutResult<G extends string> {\n chordGroup: G | null;\n cancel: () => void;\n}\n\nconst A_CODE = 'a'.charCodeAt(0);\n\nfunction isFieldFocused(): boolean {\n const ae = (typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null);\n return !!(\n ae &&\n (ae.tagName === 'INPUT' ||\n ae.tagName === 'TEXTAREA' ||\n ae.isContentEditable)\n );\n}\n\nexport function useChordShortcut<G extends string>(\n args: UseChordShortcutArgs<G>,\n): UseChordShortcutResult<G> {\n const { groupOrder, tools, onSelect, enabled } = args;\n\n const [chordGroup, setChordGroup] = useState<G | null>(null);\n\n const groupOrderRef = useRef(groupOrder);\n const toolsRef = useRef(tools);\n const onSelectRef = useRef(onSelect);\n const chordGroupRef = useRef<G | null>(null);\n\n groupOrderRef.current = groupOrder;\n toolsRef.current = tools;\n onSelectRef.current = onSelect;\n // chordGroupRef được sync ngay trong handler (xem `setChord` dưới đây)\n // thay vì ghi từ render body — nếu ghi ở body sẽ bị React batch hoá khi\n // hai event xảy ra trong cùng một act() (event sau đọc giá trị cũ).\n\n const cancel = useCallback(() => {\n chordGroupRef.current = null;\n setChordGroup(null);\n }, []);\n\n useEffect(() => {\n if (!enabled) return;\n\n const setChord = (next: G | null) => {\n chordGroupRef.current = next;\n setChordGroup(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isFieldFocused()) return;\n\n const key = e.key;\n const lower = key.length === 1 ? key.toLowerCase() : key;\n\n if (key === 'Escape') {\n if (chordGroupRef.current !== null) {\n e.preventDefault();\n e.stopPropagation();\n setChord(null);\n }\n return;\n }\n\n if (lower.length === 1 && lower >= 'a' && lower <= 'z') {\n const idx = lower.charCodeAt(0) - A_CODE;\n if (idx < groupOrderRef.current.length) {\n e.preventDefault();\n e.stopPropagation();\n setChord(groupOrderRef.current[idx]);\n }\n return;\n }\n\n if (key >= '1' && key <= '9') {\n const active = chordGroupRef.current;\n if (active === null) return;\n const n = key.charCodeAt(0) - '1'.charCodeAt(0); // 0-indexed\n const toolsInGroup = toolsRef.current.filter(\n (t) => t.group === active,\n );\n e.preventDefault();\n e.stopPropagation();\n if (n < toolsInGroup.length) {\n onSelectRef.current(toolsInGroup[n].key);\n }\n setChord(null);\n return;\n }\n };\n\n window.addEventListener('keydown', onKey, { capture: true });\n return () => {\n window.removeEventListener('keydown', onKey, { capture: true });\n };\n }, [enabled]);\n\n return { chordGroup, cancel };\n}\n","export interface SvgImageResult {\n dataURL: string;\n fileId: string;\n width: number;\n height: number;\n mimeType: 'image/svg+xml';\n}\n\nasync function hashString(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest)).slice(0, 16).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (h1 >>> 0).toString(16).padStart(8, '0') + (h2 >>> 0).toString(16).padStart(8, '0');\n}\n\nfunction parseSize(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n // Fallback: try viewBox\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n return attr === 'width' ? 200 : 100;\n}\n\n// SVG → image element data. Skips canvas rasterization entirely (canvas with\n// foreignObject + external resources gets tainted by browser security model,\n// blocking toDataURL). Excalidraw renders SVG natively via mimeType 'image/svg+xml'.\nexport async function svgToImageElement(svg: string): Promise<SvgImageResult> {\n const width = parseSize(svg, 'width');\n const height = parseSize(svg, 'height');\n // Use UTF-8 safe base64 encoding (btoa fails on non-Latin1 chars)\n const utf8 = unescape(encodeURIComponent(svg));\n const dataURL = 'data:image/svg+xml;base64,' + btoa(utf8);\n const fileId = await hashString(dataURL);\n return { dataURL, fileId, width, height, mimeType: 'image/svg+xml' };\n}\n","import { svgToImageElement } from './svgToImage';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData từ kích thước SVG vừa đo được. Đặt làm factory để\n * các stamp loại khác nhau (geometry cần svgWidth/svgHeight, latex không cần)\n * đều có thể chèn data tuỳ ý.\n */\n makeCustomData: (width: number, height: number) => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. svgToImageElement(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await svgToImageElement(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData(width, height);\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width, height, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { GeometryLeftPanel } from './editor/LeftPanel';\nimport {\n GeometryEditorPanel,\n type GeometryEditorPanelHandle,\n type GeomBoardState,\n} from './editor/EditorPanel';\nimport type { GeomTool } from './editor/MiniBoard';\nimport { GROUP_ORDER, TOOLS } from './editor/tools';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport type { SerializedBoard } from './serialize';\nimport { isGeometryCustomData, type GeometryCustomData } from './types';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\n\nconst INITIAL_GEOM_STATE: GeomBoardState = {\n tool: 'move',\n showAxis: false,\n showGrid: false,\n canUndo: false,\n};\n\nexport const GeometryStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function GeometryStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GeometryEditorPanelHandle | null>(null);\n const [geomState, setGeomState] = useState<GeomBoardState>(INITIAL_GEOM_STATE);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS,\n onSelect: (key) => panelRef.current?.setTool(key as GeomTool),\n enabled: !isMobile,\n });\n\n const initialState = useMemo<SerializedBoard | null>(() => {\n if (!editingElement) return null;\n if (!isGeometryCustomData(editingElement.customData)) return null;\n try {\n return JSON.parse(editingElement.customData.jsonState) as SerializedBoard;\n } catch {\n console.warn('GeometryStampHost: customData jsonState corrupted');\n return null;\n }\n }, [editingElement]);\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (width, height): GeometryCustomData => ({\n kind: 'geometry',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <GeometryLeftPanel\n activeTool={geomState.tool}\n onToolChange={(t: GeomTool) => panelRef.current?.setTool(t)}\n showAxis={geomState.showAxis}\n showGrid={geomState.showGrid}\n onShowAxisChange={(b) => panelRef.current?.setShowAxis(b)}\n onShowGridChange={(b) => panelRef.current?.setShowGrid(b)}\n onUndo={() => panelRef.current?.undo()}\n canUndo={geomState.canUndo}\n onClose={onClose}\n isDark={isDark}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n chordGroup={chordGroup}\n />\n <GeometryEditorPanel\n ref={panelRef}\n initialState={initialState}\n onInsert={handleInsert}\n onClose={onClose}\n onStateChange={setGeomState}\n withLeftPanel={!isMobile}\n isDark={isDark}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n />\n </>\n );\n },\n);\n","let cachedCss: string | null = null;\n\n// Absolute origin để inlined CSS có thể load fonts khi SVG render trong\n// Excalidraw / image context (relative paths fail trong nested URL contexts).\nfunction absoluteOrigin(): string {\n if (typeof window !== 'undefined' && window.location) return window.location.origin;\n return '';\n}\n\nasync function loadKatexCss(): Promise<string> {\n if (cachedCss !== null) return cachedCss;\n try {\n if (typeof fetch === 'function') {\n const res = await fetch('/katex.min.css');\n if (res.ok) {\n let css = await res.text();\n // Rewrite relative font URLs → absolute origin URLs.\n // KaTeX CSS uses url(fonts/...) — relative to /katex.min.css → /fonts/...\n // Trong SVG <foreignObject> được render thành image, relative resolves\n // tới page URL (/room/...) thay vì root, gây 404.\n const origin = absoluteOrigin();\n if (origin) {\n css = css.replace(/url\\((['\"]?)(fonts\\/)/g, `url($1${origin}/$2`);\n }\n cachedCss = css;\n return css;\n }\n }\n } catch {\n /* ignore */\n }\n cachedCss = '';\n return '';\n}\n\nexport async function renderLatexToSvg(src: string, displayMode: boolean): Promise<string> {\n const katex = await import('katex');\n const html = katex.default.renderToString(src, { displayMode, throwOnError: true, output: 'html' });\n\n const measureDiv = document.createElement('div');\n measureDiv.style.cssText = 'position:absolute;top:-9999px;left:-9999px;visibility:hidden;display:inline-block;';\n measureDiv.innerHTML = html;\n document.body.appendChild(measureDiv);\n const rect = measureDiv.getBoundingClientRect();\n const width = Math.ceil(rect.width) || 50;\n const height = Math.ceil(rect.height) || 20;\n document.body.removeChild(measureDiv);\n\n const cssText = await loadKatexCss();\n\n // KaTeX render với text màu đen mặc định. Excalidraw apply CSS filter\n // invert+hue-rotate trên canvas khi dark mode → text tự thành sáng. Đừng\n // override color ở đây vì sẽ đánh nhau với filter.\n return '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + width + '\" height=\"' + height + '\" viewBox=\"0 0 ' + width + ' ' + height + '\">' +\n '<foreignObject width=\"100%\" height=\"100%\">' +\n '<div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"font-size:16px;line-height:1.2;\">' +\n '<style>' + cssText + '</style>' +\n html +\n '</div>' +\n '</foreignObject>' +\n '</svg>';\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface LatexCustomData extends BaseStampCustomData {\n kind: 'latex';\n version: 1;\n src: string;\n displayMode: boolean;\n}\n\nexport function isLatexCustomData(data: unknown): data is LatexCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<LatexCustomData>;\n return d.kind === 'latex' && d.version === 1 && typeof d.src === 'string';\n}\n","'use client';\n\nimport React from 'react';\n\n// ---------- Shared shell (latex copy — geometry copy stays in src/stamp/StampLeftPanel.tsx) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n\nfunction Shell({ title, icon, onClose, children, isMobile, drawerOpen, onDrawerClose }: ShellProps) {\n const mobileAttrs = isMobile\n ? {\n 'data-mobile-drawer': 'true',\n 'data-drawer-state': drawerOpen ? 'open' : 'closed',\n }\n : {};\n const handleHeaderClose = () => {\n if (isMobile) onDrawerClose?.();\n else onClose();\n };\n return (\n <>\n {isMobile && drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={isMobile && !drawerOpen ? 'true' : undefined}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n {...mobileAttrs}\n className={\n isMobile\n ? 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md'\n : 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200'\n }\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={handleHeaderClose}\n aria-label={isMobile ? 'Đóng ngăn công cụ' : 'Đóng'}\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n </>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- LaTeX left panel ----------\n\ninterface LatexLeftPanelProps {\n displayMode: boolean;\n onDisplayModeChange: (b: boolean) => void;\n onInsertSnippet: (snippet: string) => void;\n onClose: () => void;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n\ninterface SnippetDef {\n label: string;\n preview: string;\n snippet: string;\n}\n\nconst SNIPPETS: { group: string; items: SnippetDef[] }[] = [\n {\n group: 'Phân số & luỹ thừa',\n items: [\n { label: 'Phân số', preview: 'a⁄b', snippet: '\\\\frac{a}{b}' },\n { label: 'Luỹ thừa', preview: 'x²', snippet: '^{2}' },\n { label: 'Chỉ số', preview: 'x₁', snippet: '_{1}' },\n { label: 'Căn', preview: '√x', snippet: '\\\\sqrt{x}' },\n { label: 'Căn n', preview: 'ⁿ√x', snippet: '\\\\sqrt[n]{x}' },\n ],\n },\n {\n group: 'Tổng & tích phân',\n items: [\n { label: 'Tổng', preview: 'Σ', snippet: '\\\\sum_{i=1}^{n}' },\n { label: 'Tích', preview: 'Π', snippet: '\\\\prod_{i=1}^{n}' },\n { label: 'Tích phân', preview: '∫', snippet: '\\\\int_{a}^{b}' },\n { label: 'Giới hạn', preview: 'lim', snippet: '\\\\lim_{x \\\\to 0}' },\n ],\n },\n {\n group: 'Ký hiệu',\n items: [\n { label: 'α', preview: 'α', snippet: '\\\\alpha' },\n { label: 'β', preview: 'β', snippet: '\\\\beta' },\n { label: 'π', preview: 'π', snippet: '\\\\pi' },\n { label: 'θ', preview: 'θ', snippet: '\\\\theta' },\n { label: '≠', preview: '≠', snippet: '\\\\neq' },\n { label: '≤', preview: '≤', snippet: '\\\\leq' },\n { label: '≥', preview: '≥', snippet: '\\\\geq' },\n { label: '∞', preview: '∞', snippet: '\\\\infty' },\n { label: '→', preview: '→', snippet: '\\\\to' },\n ],\n },\n];\n\nexport function LeftPanel({\n displayMode,\n onDisplayModeChange,\n onInsertSnippet,\n onClose,\n isMobile,\n drawerOpen,\n onDrawerClose,\n}: LatexLeftPanelProps) {\n return (\n <Shell\n title=\"Công thức LaTeX\"\n icon=\"∑\"\n onClose={onClose}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={onDrawerClose}\n >\n <Section label=\"Chế độ hiển thị\">\n <div className=\"grid grid-cols-2 gap-1.5\">\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(false)}\n aria-pressed={!displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n !displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Inline</span>\n <span className=\"block text-[10px] text-slate-500\">$ ... $</span>\n </button>\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(true)}\n aria-pressed={displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Block</span>\n <span className=\"block text-[10px] text-slate-500\">$$ ... $$</span>\n </button>\n </div>\n </Section>\n\n {SNIPPETS.map((group) => (\n <Section key={group.group} label={group.group}>\n <div className=\"flex flex-wrap gap-1\">\n {group.items.map((s) => (\n <button\n key={s.snippet}\n type=\"button\"\n data-snippet={s.snippet}\n onClick={() => onInsertSnippet(s.snippet)}\n title={s.snippet}\n className=\"rounded border border-slate-200 bg-white px-2 py-1 text-xs text-slate-700 transition hover:border-emerald-300 hover:bg-emerald-50 hover:text-emerald-700\"\n >\n {s.preview}\n </button>\n ))}\n </div>\n </Section>\n ))}\n\n <Section label=\"Phím tắt\">\n <div className=\"flex flex-wrap gap-2 text-[11px] text-slate-600\">\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Enter</kbd>\n chèn\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Esc</kbd>\n đóng\n </span>\n </div>\n </Section>\n </Shell>\n );\n}\n\n// Back-compat alias\nexport { LeftPanel as LatexLeftPanel };\n","'use client';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { renderLatexToSvg } from '../render';\n\ninterface Props {\n /**\n * Legacy: vị trí absolute x/y nếu cần (test). Khi cả 2 = 0 và `centered` !== false,\n * popover sẽ tự center floating ở giữa khu vực bảng. Khi `withLeftPanel` = true,\n * vị trí center được offset 120px để chừa chỗ panel trái.\n */\n x: number;\n y: number;\n initialValue: string;\n onInsert: (svgString: string, src: string, displayMode: boolean) => void;\n onClose: () => void;\n /** Khi controlled từ parent (StampLeftPanel), parent set giá trị này. */\n displayMode?: boolean;\n onDisplayModeChange?: (b: boolean) => void;\n /** Khi true, position center offset cho panel trái. */\n withLeftPanel?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Trigger mở snippet drawer trên mobile. */\n onOpenDrawer?: () => void;\n}\n\nexport interface EditorPopoverHandle {\n /** Chèn snippet vào vị trí con trỏ trong textbox. */\n insertAtCursor: (snippet: string) => void;\n /** Có content hợp lệ để chèn không (input không rỗng + preview ok). */\n hasContent: () => boolean;\n /** Trigger insert programmatically — return true nếu chèn thành công. */\n tryInsert: () => boolean;\n}\n\nconst DEBOUNCE_MS = 100;\n\nexport const EditorPopover = forwardRef<EditorPopoverHandle, Props>(function EditorPopover(\n {\n x,\n y,\n initialValue,\n onInsert,\n onClose,\n displayMode: controlledDisplayMode,\n onDisplayModeChange,\n withLeftPanel = false,\n isMobile = false,\n onOpenDrawer,\n },\n ref,\n) {\n const [value, setValue] = useState(initialValue);\n const [internalDisplayMode] = useState(false);\n const displayMode = controlledDisplayMode ?? internalDisplayMode;\n // onDisplayModeChange chỉ dùng khi controlled từ parent — không cần local setter\n void onDisplayModeChange;\n\n const [previewSvg, setPreviewSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(async () => {\n try {\n const svg = await renderLatexToSvg(value, displayMode);\n setPreviewSvg(svg);\n setError(null);\n } catch (err) {\n setPreviewSvg(null);\n setError((err as Error).message);\n }\n }, DEBOUNCE_MS);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [value, displayMode]);\n\n const handleInsert = useCallback(() => {\n if (!previewSvg) return;\n onInsert(previewSvg, value, displayMode);\n }, [previewSvg, value, displayMode, onInsert]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleInsert();\n }\n },\n [onClose, handleInsert],\n );\n\n // Imperative API: snippet button trong panel trái gọi vào, click-outside auto-insert.\n useImperativeHandle(\n ref,\n () => ({\n insertAtCursor: (snippet: string) => {\n const el = inputRef.current;\n if (!el) {\n setValue((v) => v + snippet);\n return;\n }\n const start = el.selectionStart ?? value.length;\n const end = el.selectionEnd ?? value.length;\n const next = value.slice(0, start) + snippet + value.slice(end);\n setValue(next);\n requestAnimationFrame(() => {\n el.focus();\n const pos = start + snippet.length;\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n /* ignore */\n }\n });\n },\n hasContent: () => value.trim().length > 0 && !!previewSvg && !error,\n tryInsert: () => {\n if (!previewSvg || error || !value.trim()) return false;\n onInsert(previewSvg, value, displayMode);\n return true;\n },\n }),\n [value, previewSvg, error, displayMode, onInsert],\n );\n\n // Position: nếu x/y > 0 → dùng legacy absolute (cho tests cũ). Còn không thì center floating.\n const isLegacyPosition = x > 0 || y > 0;\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 50 }\n : isLegacyPosition\n ? { position: 'absolute', top: y, left: x, zIndex: 50 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 50,\n };\n\n return (\n <div\n style={wrapperStyle}\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n className={\n isMobile\n ? 'flex h-full w-full flex-col bg-white'\n : 'w-[420px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5'\n }\n role=\"dialog\"\n aria-label=\"Nhập công thức LaTeX\"\n >\n <header className={`flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-indigo-600 to-purple-600 px-3 py-2 text-white${isMobile ? '' : ' rounded-t-lg'}`}>\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn snippet\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <span className=\"text-base leading-none\">∑</span>\n Công thức LaTeX\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!previewSvg || !!error}\n data-testid=\"latex-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className={`space-y-2 p-3${isMobile ? ' flex min-h-0 flex-1 flex-col' : ''}`}>\n <input\n ref={inputRef}\n type=\"text\"\n role=\"textbox\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Vd: \\frac{a^2+b^2}{c}\"\n className={`w-full rounded border border-slate-300 px-2 py-1.5 font-mono outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-200${\n isMobile ? ' min-h-[44px] text-base' : ' text-sm'\n }`}\n autoFocus\n />\n <div\n className={[\n 'flex items-center justify-center rounded border p-3 text-center',\n isMobile ? 'min-h-0 flex-1 overflow-auto' : 'min-h-[64px]',\n error ? 'border-rose-300 bg-rose-50 text-rose-700' : 'border-slate-200 bg-slate-50',\n ].join(' ')}\n >\n {error ? (\n <span className=\"text-xs\">Lỗi: {error.slice(0, 80)}</span>\n ) : previewSvg ? (\n <span dangerouslySetInnerHTML={{ __html: previewSvg }} />\n ) : (\n <span className=\"text-xs text-slate-400\">(xem trước)</span>\n )}\n </div>\n {!isMobile && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Enter để chèn\n </span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!previewSvg || !!error}\n className=\"rounded bg-indigo-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-indigo-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </div>\n )}\n {isMobile && (\n <div className=\"text-center text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Bấm Chèn ở thanh trên\n </div>\n )}\n </div>\n </div>\n );\n});\n\n// Back-compat aliases\nexport { EditorPopover as LatexEditorPopover };\nexport type { EditorPopoverHandle as LatexEditorHandle };\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { LeftPanel as LatexLeftPanel } from './editor/LeftPanel';\nimport {\n EditorPopover as LatexEditorPopover,\n type EditorPopoverHandle as LatexEditorHandle,\n} from './editor/EditorPopover';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { isLatexCustomData, type LatexCustomData } from './types';\nimport type { StampHostProps, StampHostHandle } from '../shared/types';\n\nexport const LatexStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function LatexStampHost({ api, editingElement, onClose }, ref) {\n const editorRef = useRef<LatexEditorHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const initial = useMemo(() => {\n if (editingElement && isLatexCustomData(editingElement.customData)) {\n return {\n initialValue: editingElement.customData.src,\n displayMode: !!editingElement.customData.displayMode,\n };\n }\n return { initialValue: '', displayMode: false };\n }, [editingElement]);\n\n const [displayMode, setDisplayMode] = useState(initial.displayMode);\n\n const handleInsert = useCallback(\n async (svgString: string, src: string, dm: boolean) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): LatexCustomData => ({\n kind: 'latex',\n version: 1,\n src,\n displayMode: dm,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Latex insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <LatexLeftPanel\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsertSnippet={(s) => editorRef.current?.insertAtCursor(s)}\n onClose={onClose}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <LatexEditorPopover\n ref={editorRef}\n x={0}\n y={0}\n initialValue={initial.initialValue}\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsert={handleInsert}\n onClose={onClose}\n withLeftPanel={!isMobile}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n />\n </>\n );\n },\n);\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface Geometry3DCustomData extends BaseStampCustomData {\n kind: 'geometry3d';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGeometry3DCustomData(data: unknown): data is Geometry3DCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<Geometry3DCustomData>;\n return d.kind === 'geometry3d' && d.version === 1 && typeof d.jsonState === 'string';\n}\n\nexport type Element3DType =\n | 'point3d'\n | 'line3d'\n | 'plane3d'\n | 'polygon3d'\n | 'sphere3d'\n | 'text3d';\n\nexport interface SerializedElement3D {\n type: Element3DType;\n /**\n * Parents passed to JSXGraph view.create. Either literal values (numbers,\n * strings) or `\"@id:<id>\"` placeholder strings referencing earlier created\n * objects in the log (resolved at deserialize time).\n */\n parents: unknown[];\n attributes: Record<string, unknown>;\n id: string;\n label?: string;\n}\n\nexport interface SerializedBoard3D {\n version: 1;\n bbox: [number, number, number, number];\n view: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n };\n showAxes: boolean;\n showMesh: boolean;\n elements: SerializedElement3D[];\n}\n\nexport function serializeBoard3D(state: SerializedBoard3D): string {\n return JSON.stringify(state);\n}\n\nexport function parseSerializedBoard3D(json: string): SerializedBoard3D {\n const parsed = JSON.parse(json) as unknown;\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('parseSerializedBoard3D: not an object');\n }\n const p = parsed as Partial<SerializedBoard3D>;\n if (p.version !== 1) {\n throw new Error(`parseSerializedBoard3D: unsupported version ${String(p.version)}`);\n }\n if (!Array.isArray(p.elements)) {\n throw new Error('parseSerializedBoard3D: elements missing');\n }\n return parsed as SerializedBoard3D;\n}\n","import {\n paletteFor as palette2D,\n type GeomPalette,\n} from '../../geometry-2d/editor/theme';\n\nexport type Geom3DPalette = GeomPalette & {\n view3dBg: string;\n axisX: string;\n axisY: string;\n axisZ: string;\n};\n\nexport function paletteFor(isDark: boolean): Geom3DPalette {\n const base = palette2D(isDark);\n return {\n ...base,\n view3dBg: isDark ? '#1a1a1a' : '#ffffff',\n axisX: '#d63b3b',\n axisY: '#2d8a2d',\n axisZ: '#2d6dd6',\n };\n}\n\nexport const DEFAULT_VIEW3D: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n} = {\n azimuth: 0.7,\n elevation: 0.4,\n bbox3D: [-3, -3, -3, 3, 3, 3],\n};\n\nexport const VIEW3D_ATTRS = (isDark: boolean) => {\n const p = paletteFor(isDark);\n return {\n az: { slider: { visible: false }, point2: { visible: false } },\n el: { slider: { visible: false } },\n projection: 'central' as const,\n axesPosition: 'border' as const,\n xAxis: { strokeColor: p.axisX, lastArrow: { type: 2 } },\n yAxis: { strokeColor: p.axisY, lastArrow: { type: 2 } },\n zAxis: { strokeColor: p.axisZ, lastArrow: { type: 2 } },\n };\n};\n","import type { GeomTool3D } from './tools';\nimport type { SerializedElement3D, Element3DType } from '../serialize';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport interface HandlerContextDeps {\n view: { create: (kind: string, parents: unknown[], attrs: unknown) => JxgObj };\n pushLog: (e: SerializedElement3D) => void;\n objMap: Map<string, JxgObj>;\n nextId: () => string;\n isDark: boolean;\n promptCoords: (label: string) => { x: number; y: number; z: number } | null;\n promptNumber: (label: string) => number | null;\n promptText: (label: string) => string | null;\n notify: () => void;\n}\n\nexport interface PendingPoint {\n id: string;\n ref: JxgObj;\n coords: [number, number, number];\n}\n\nexport interface HandlerContext extends HandlerContextDeps {\n pendingPoints: PendingPoint[];\n /** Internal state flag for multi-stage tools (pyramid base done, etc.) */\n pendingFlags: Record<string, unknown>;\n /** World coords keyed by point id — used by label tool to anchor text3d. */\n pushedPointCoords: Map<string, [number, number, number]>;\n}\n\nexport interface ClickHit {\n x3: number;\n y3: number;\n z3: number;\n /** Existing point id if the click landed on an existing point. */\n existingPointId?: string;\n}\n\nexport function createHandlerContext(deps: HandlerContextDeps): HandlerContext {\n return {\n ...deps,\n pendingPoints: [],\n pendingFlags: {},\n pushedPointCoords: new Map(),\n };\n}\n\nfunction refByPlaceholder(id: string): string {\n return `@id:${id}`;\n}\n\nfunction createPoint3D(\n ctx: HandlerContext,\n x: number,\n y: number,\n z: number,\n label?: string,\n): PendingPoint {\n const id = ctx.nextId();\n const attrs: Record<string, unknown> = { id, size: 3 };\n if (label) attrs.name = label;\n const ref = ctx.view.create('point3d', [x, y, z], attrs);\n ctx.objMap.set(id, ref);\n ctx.pushedPointCoords.set(id, [x, y, z]);\n ctx.pushLog({\n type: 'point3d',\n parents: [x, y, z],\n attributes: attrs,\n id,\n label,\n });\n return { id, ref, coords: [x, y, z] };\n}\n\nfunction resolvePoint(ctx: HandlerContext, hit: ClickHit): PendingPoint {\n if (hit.existingPointId && ctx.objMap.has(hit.existingPointId)) {\n // Prefer the stored world coords (the click hit is screen-projected and\n // may differ); fall back to hit coords if the point predates this session.\n const stored = ctx.pushedPointCoords.get(hit.existingPointId);\n return {\n id: hit.existingPointId,\n ref: ctx.objMap.get(hit.existingPointId),\n coords: stored ?? [hit.x3, hit.y3, hit.z3],\n };\n }\n return createPoint3D(ctx, hit.x3, hit.y3, hit.z3);\n}\n\nfunction finishPolygon(\n ctx: HandlerContext,\n points: PendingPoint[],\n extraAttrs: Record<string, unknown> = {},\n): void {\n const id = ctx.nextId();\n const refs = points.map((p) => p.ref);\n const attrs = { id, ...extraAttrs };\n const ref = ctx.view.create('polygon3d', [refs], attrs);\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: 'polygon3d',\n parents: [points.map((p) => refByPlaceholder(p.id))],\n attributes: attrs,\n id,\n });\n}\n\nfunction finishLineLike(\n ctx: HandlerContext,\n elType: Element3DType,\n points: PendingPoint[],\n extraAttrs: Record<string, unknown> = {},\n): void {\n const id = ctx.nextId();\n const refs = points.map((p) => p.ref);\n const attrs = { id, ...extraAttrs };\n const ref = ctx.view.create(elType, refs, attrs);\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: elType,\n parents: points.map((p) => refByPlaceholder(p.id)),\n attributes: attrs,\n id,\n });\n}\n\nexport function handleToolStep(\n ctx: HandlerContext,\n tool: GeomTool3D,\n hit: ClickHit,\n): void {\n switch (tool) {\n case 'move':\n return;\n\n case 'point': {\n const coords = ctx.promptCoords('Toạ độ điểm (x, y, z)');\n if (!coords) return;\n createPoint3D(ctx, coords.x, coords.y, coords.z);\n ctx.notify();\n return;\n }\n\n case 'segment':\n case 'line': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 2) {\n // JSXGraph 3D has no `segment3d`; bound a `line3d` with straight* off for segment.\n // Explicit stroke + fixed to force visible render (default render is invisible\n // in view3d unless attrs are set — see Bug #9).\n const lineColor = ctx.isDark ? '#9ecbff' : '#0066cc';\n const baseAttrs: Record<string, unknown> = {\n strokeColor: lineColor,\n strokeWidth: 2,\n visible: true,\n fixed: true,\n };\n if (tool === 'segment') {\n baseAttrs.straightFirst = false;\n baseAttrs.straightLast = false;\n }\n finishLineLike(ctx, 'line3d', ctx.pendingPoints, baseAttrs);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'plane': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 3) {\n // plane3d in JSXGraph expects [point, direction1, direction2] but accepts\n // 3-point form for \"plane through A, B, C\".\n finishLineLike(ctx, 'plane3d', ctx.pendingPoints);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'triangle': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 3) {\n finishPolygon(ctx, ctx.pendingPoints);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'polygon': {\n if (\n ctx.pendingPoints.length >= 3 &&\n hit.existingPointId === ctx.pendingPoints[0].id\n ) {\n finishPolygon(ctx, ctx.pendingPoints);\n ctx.pendingPoints = [];\n ctx.notify();\n return;\n }\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n ctx.notify();\n return;\n }\n\n case 'label': {\n if (!hit.existingPointId) return;\n const text = ctx.promptText('Nội dung nhãn');\n if (!text) return;\n const id = ctx.nextId();\n // JSXGraph 1.12 `text3d` requires `[[x,y,z], text]` or `[x,y,z,text]`; the\n // `[pointRef, text]` form silently renders empty. Anchor coords come from\n // the host point (we already have its world coords from createPoint3D log).\n // Points are immutable in this editor (no drag-edit) so static coords are\n // safe.\n const pointLog = ctx.pushedPointCoords.get(hit.existingPointId);\n if (!pointLog) return;\n const [x, y, z] = pointLog;\n const attrs: Record<string, unknown> = {\n id,\n fontSize: 14,\n strokeColor: ctx.isDark ? '#f5f5f5' : '#111111',\n };\n const ref = ctx.view.create('text3d', [x, y, z, text], attrs);\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: 'text3d',\n parents: [x, y, z, text],\n attributes: attrs,\n id,\n label: text,\n });\n ctx.notify();\n return;\n }\n\n // Solids + curved handled in B8, B9\n default:\n handleSolidStep(ctx, tool, hit);\n return;\n }\n}\n\nexport function handleSolidStep(\n ctx: HandlerContext,\n tool: GeomTool3D,\n hit: ClickHit,\n): void {\n switch (tool) {\n case 'tetrahedron': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 4) {\n const [a, b, c, d] = ctx.pendingPoints;\n finishPolyhedron(ctx, [\n [a, b, c],\n [a, b, d],\n [a, c, d],\n [b, c, d],\n ]);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'parallelepiped': {\n const origin = resolvePoint(ctx, hit);\n const v1 = ctx.promptCoords('Vector cạnh 1 (dx, dy, dz)');\n const v2 = ctx.promptCoords('Vector cạnh 2 (dx, dy, dz)');\n const v3 = ctx.promptCoords('Vector cạnh 3 (dx, dy, dz)');\n if (!v1 || !v2 || !v3) return;\n const [ox, oy, oz] = origin.coords;\n // 7 derived points (origin is reused as corner 0)\n const c1 = createPoint3D(ctx, ox + v1.x, oy + v1.y, oz + v1.z);\n const c2 = createPoint3D(ctx, ox + v2.x, oy + v2.y, oz + v2.z);\n const c3 = createPoint3D(ctx, ox + v3.x, oy + v3.y, oz + v3.z);\n const c12 = createPoint3D(\n ctx,\n ox + v1.x + v2.x,\n oy + v1.y + v2.y,\n oz + v1.z + v2.z,\n );\n const c13 = createPoint3D(\n ctx,\n ox + v1.x + v3.x,\n oy + v1.y + v3.y,\n oz + v1.z + v3.z,\n );\n const c23 = createPoint3D(\n ctx,\n ox + v2.x + v3.x,\n oy + v2.y + v3.y,\n oz + v2.z + v3.z,\n );\n const c123 = createPoint3D(\n ctx,\n ox + v1.x + v2.x + v3.x,\n oy + v1.y + v2.y + v3.y,\n oz + v1.z + v2.z + v3.z,\n );\n finishPolyhedron(ctx, [\n [origin, c1, c12, c2],\n [origin, c1, c13, c3],\n [origin, c2, c23, c3],\n [c123, c12, c1, c13],\n [c123, c12, c2, c23],\n [c123, c13, c3, c23],\n ]);\n ctx.pendingPoints = [];\n ctx.notify();\n return;\n }\n\n case 'prism': {\n if (\n ctx.pendingPoints.length >= 3 &&\n hit.existingPointId === ctx.pendingPoints[0].id\n ) {\n const base = ctx.pendingPoints;\n const height = ctx.promptNumber('Chiều cao (theo trục z)');\n if (!height) return;\n const top = base.map((bp) =>\n createPoint3D(ctx, bp.coords[0], bp.coords[1], bp.coords[2] + height),\n );\n const faces: PendingPoint[][] = [base, top];\n for (let i = 0; i < base.length; i++) {\n const next = (i + 1) % base.length;\n faces.push([base[i], base[next], top[next], top[i]]);\n }\n finishPolyhedron(ctx, faces);\n ctx.pendingPoints = [];\n ctx.notify();\n return;\n }\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n ctx.notify();\n return;\n }\n\n case 'pyramid': {\n const baseDone = ctx.pendingFlags.pyramidBaseDone === true;\n if (\n !baseDone &&\n ctx.pendingPoints.length >= 3 &&\n hit.existingPointId === ctx.pendingPoints[0].id\n ) {\n ctx.pendingFlags.pyramidBaseDone = true;\n ctx.notify();\n return;\n }\n if (baseDone) {\n const base = ctx.pendingPoints;\n const apex = createPoint3D(ctx, hit.x3, hit.y3, hit.z3);\n const faces: PendingPoint[][] = [base];\n for (let i = 0; i < base.length; i++) {\n const next = (i + 1) % base.length;\n faces.push([base[i], base[next], apex]);\n }\n finishPolyhedron(ctx, faces);\n ctx.pendingPoints = [];\n ctx.pendingFlags.pyramidBaseDone = false;\n ctx.notify();\n return;\n }\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n ctx.notify();\n return;\n }\n\n // Curved → B9\n default:\n handleCurvedStep(ctx, tool, hit);\n return;\n }\n}\n\nfunction finishPolyhedron(ctx: HandlerContext, faces: PendingPoint[][]): void {\n // JSXGraph 1.12 `polyhedron3d` API requires `[vertices[], faceIndices[]]` (coords\n // + index arrays) — the previous `[facesAsPointRefs]` form throws `Cannot read\n // 'length' of undefined` at runtime. Emit one `polygon3d` per face instead;\n // polygon3d is proven to render (triangle test) and round-trips cleanly through\n // the existing render.ts path. See Bug #7.\n const faceColor = ctx.isDark ? 'rgba(150, 180, 220, 0.35)' : 'rgba(60, 120, 200, 0.25)';\n const edgeColor = ctx.isDark ? '#9ecbff' : '#0066cc';\n for (const face of faces) {\n finishPolygon(ctx, face, {\n fillColor: faceColor,\n fillOpacity: 1,\n strokeColor: edgeColor,\n strokeWidth: 1.5,\n visible: true,\n });\n }\n}\n\nconst CURVED_SEGMENTS = 16;\n\nexport function handleCurvedStep(\n ctx: HandlerContext,\n tool: GeomTool3D,\n hit: ClickHit,\n): void {\n switch (tool) {\n case 'sphere': {\n const radius = ctx.promptNumber('Bán kính mặt cầu');\n if (radius == null) return;\n const center = resolvePoint(ctx, hit);\n const id = ctx.nextId();\n const ref = ctx.view.create('sphere3d', [center.ref, radius], { id });\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: 'sphere3d',\n parents: [refByPlaceholder(center.id), radius],\n attributes: { id },\n id,\n });\n ctx.notify();\n return;\n }\n\n case 'cone': {\n const baseDone = ctx.pendingFlags.coneBaseDone === true;\n if (!baseDone) {\n const radius = ctx.promptNumber('Bán kính đáy');\n if (radius == null) return;\n const center = resolvePoint(ctx, hit);\n ctx.pendingFlags.coneCenter = center;\n ctx.pendingFlags.coneRadius = radius;\n ctx.pendingFlags.coneBaseDone = true;\n ctx.notify();\n return;\n }\n // Second click = apex\n const center = ctx.pendingFlags.coneCenter as PendingPoint;\n const radius = ctx.pendingFlags.coneRadius as number;\n const apex = createPoint3D(ctx, hit.x3, hit.y3, hit.z3);\n const [cx, cy, cz] = center.coords;\n const basePoints: PendingPoint[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n basePoints.push(\n createPoint3D(\n ctx,\n cx + radius * Math.cos(theta),\n cy + radius * Math.sin(theta),\n cz,\n ),\n );\n }\n const faces: PendingPoint[][] = [basePoints];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n faces.push([basePoints[i], basePoints[(i + 1) % CURVED_SEGMENTS], apex]);\n }\n finishPolyhedron(ctx, faces);\n ctx.pendingFlags.coneBaseDone = false;\n ctx.pendingFlags.coneCenter = undefined;\n ctx.pendingFlags.coneRadius = undefined;\n ctx.notify();\n return;\n }\n\n case 'cylinder': {\n const radius = ctx.promptNumber('Bán kính đáy');\n if (radius == null) return;\n const height = ctx.promptNumber('Chiều cao (theo trục z)');\n if (height == null) return;\n const center = resolvePoint(ctx, hit);\n const [cx, cy, cz] = center.coords;\n const basePoints: PendingPoint[] = [];\n const topPoints: PendingPoint[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n basePoints.push(\n createPoint3D(\n ctx,\n cx + radius * Math.cos(theta),\n cy + radius * Math.sin(theta),\n cz,\n ),\n );\n topPoints.push(\n createPoint3D(\n ctx,\n cx + radius * Math.cos(theta),\n cy + radius * Math.sin(theta),\n cz + height,\n ),\n );\n }\n const faces: PendingPoint[][] = [basePoints, topPoints];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const next = (i + 1) % CURVED_SEGMENTS;\n faces.push([basePoints[i], basePoints[next], topPoints[next], topPoints[i]]);\n }\n finishPolyhedron(ctx, faces);\n ctx.notify();\n return;\n }\n\n // 'solidofrevolution' removed in 0.6.1 — `solidofrevolution3d` is not a valid\n // JSXGraph 1.12.2 element. See Bug #8.\n default:\n return;\n }\n}\n\n// Helpers exported for B8/B9 to reuse\nexport {\n createPoint3D,\n resolvePoint,\n refByPlaceholder,\n finishPolygon,\n finishLineLike,\n};\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { DEFAULT_VIEW3D, VIEW3D_ATTRS, paletteFor } from './theme';\nimport type { GeomTool3D } from './tools';\nimport type { SerializedBoard3D, SerializedElement3D } from '../serialize';\nimport {\n createHandlerContext,\n handleToolStep,\n type ClickHit,\n type HandlerContext,\n} from './handlers';\n\nexport interface MiniBoard3DHandle {\n getContainer: () => HTMLDivElement | null;\n getTool: () => GeomTool3D;\n setTool: (t: GeomTool3D) => void;\n getCreationLog: () => SerializedElement3D[];\n pushLog: (e: SerializedElement3D) => void;\n getViewState: () => {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n };\n getBbox: () => [number, number, number, number];\n getShowAxes: () => boolean;\n getShowMesh: () => boolean;\n setShowAxes: (b: boolean) => void;\n setShowMesh: (b: boolean) => void;\n resetView: () => void;\n undo: () => void;\n canUndo: () => boolean;\n snapshotSVG: () => { svgString: string; width: number; height: number };\n subscribe: (cb: () => void) => () => void;\n}\n\ninterface Props {\n isDark: boolean;\n initialState?: SerializedBoard3D | null;\n}\n\n// JSXGraph board / view types are not published — use minimal local shapes.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgBoard = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgView = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport const MiniBoard3D = forwardRef<MiniBoard3DHandle, Props>(function MiniBoard3D(\n { isDark, initialState },\n ref,\n) {\n const reactId = useId();\n const containerId = `geom3d_${reactId.replace(/[^a-zA-Z0-9_]/g, '_')}`;\n const containerRef = useRef<HTMLDivElement | null>(null);\n const boardRef = useRef<JxgBoard>(null);\n const viewRef = useRef<JxgView>(null);\n const toolRef = useRef<GeomTool3D>('move');\n const logRef = useRef<SerializedElement3D[]>([]);\n const objMapRef = useRef<Map<string, JxgObj>>(new Map());\n const subsRef = useRef<Set<() => void>>(new Set());\n const initialBbox3D = useRef<[number, number, number, number, number, number]>(\n initialState?.view.bbox3D ?? DEFAULT_VIEW3D.bbox3D,\n );\n const ctxRef = useRef<HandlerContext | null>(null);\n const pointerHandlerRef = useRef<{ el: HTMLElement | SVGElement; fn: EventListener } | null>(null);\n const [showAxes, setShowAxes] = useState(initialState?.showAxes ?? true);\n const [showMesh, setShowMesh] = useState(initialState?.showMesh ?? false);\n\n const notify = useCallback(() => {\n for (const cb of subsRef.current) cb();\n }, []);\n\n useEffect(() => {\n const div = containerRef.current;\n if (!div) return;\n let cancelled = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let JXG: any = null;\n let board: JxgBoard | null = null;\n\n void (async () => {\n JXG = (await import('jsxgraph')).default;\n if (cancelled || !containerRef.current) return;\n JXG.Options.text.display = 'internal';\n\n board = JXG.JSXGraph.initBoard(div, {\n boundingbox: [-6, 6, 6, -6],\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n });\n boardRef.current = board;\n\n const initView = initialState?.view ?? DEFAULT_VIEW3D;\n const baseAttrs = VIEW3D_ATTRS(isDark);\n const view: JxgView = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [initView.bbox3D[0], initView.bbox3D[3]],\n [initView.bbox3D[1], initView.bbox3D[4]],\n [initView.bbox3D[2], initView.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n az: { ...baseAttrs.az, value: initView.azimuth },\n el: { ...baseAttrs.el, value: initView.elevation },\n },\n );\n viewRef.current = view;\n\n // Wire pointer events to handlers\n let idCounter = 1;\n const ctx: HandlerContext = createHandlerContext({\n view,\n pushLog: (e) => {\n logRef.current.push(e);\n notify();\n },\n objMap: objMapRef.current,\n nextId: () => `obj_${Date.now().toString(36)}_${(idCounter++).toString(36)}`,\n isDark,\n promptCoords: (label) => {\n const raw = window.prompt(`${label}\\n(định dạng \"x,y,z\")`, '0,0,0');\n if (!raw) return null;\n const parts = raw.split(',').map((s) => Number(s.trim()));\n if (parts.length !== 3 || parts.some((n) => !isFinite(n))) return null;\n return { x: parts[0], y: parts[1], z: parts[2] };\n },\n promptNumber: (label) => {\n const raw = window.prompt(label, '1');\n if (raw == null) return null;\n const n = Number(raw);\n return isFinite(n) ? n : null;\n },\n promptText: (label) => {\n const raw = window.prompt(label, '');\n return raw == null ? null : raw;\n },\n notify,\n });\n ctxRef.current = ctx;\n\n // Helper: find existing point3d under pointer (returns its id) so polygon\n // close + segment chaining work.\n //\n // Bug #10 root cause: JSXGraph 3D `point3d` objects don't expose `coords`\n // directly — the rendered position lives on the auto-generated 2D shadow\n // `element2D.coords.scrCoords`. The earlier code read `obj.coords` which\n // was always undefined, so every iteration `continue`'d and the hit-test\n // never matched. View3d's screen↔world projection isn't lossless, so the\n // user's click position can differ from the rendered point by 100+ px;\n // using the shadow's actual screen coords fixes both that drift and the\n // synthetic-test miss.\n function findExistingPointAt(clientX: number, clientY: number): string | undefined {\n const containerRect = (div as HTMLDivElement).getBoundingClientRect();\n const localX = clientX - containerRect.left;\n const localY = clientY - containerRect.top;\n const PICK = 18;\n const svg = (div as HTMLDivElement).querySelector('svg');\n if (!svg) return undefined;\n for (const [id, obj] of objMapRef.current) {\n const entry = obj as {\n elType?: string;\n element2D?: { coords?: { scrCoords?: number[] } };\n };\n if (entry?.elType !== 'point3d') continue;\n const sc = entry.element2D?.coords?.scrCoords;\n if (!sc || sc.length < 3) continue;\n const dx = sc[1] - localX;\n const dy = sc[2] - localY;\n if (dx * dx + dy * dy <= PICK * PICK) return id;\n }\n return undefined;\n }\n\n const handlePointerDown = (e: PointerEvent) => {\n const tool = toolRef.current;\n if (tool === 'move') return;\n // Suppress default JSXGraph drag/select for tool clicks\n const existingPointId = findExistingPointAt(e.clientX, e.clientY);\n let x3 = 0;\n let y3 = 0;\n const z3 = 0;\n try {\n // 2D world coords from screen, project onto z=0 plane.\n const board2d = boardRef.current as\n | { getCoordsTopLeftCorner?: unknown; getUsrCoordsOfMouse?: (ev: Event) => [number, number] }\n | null;\n if (board2d?.getUsrCoordsOfMouse) {\n const uc = board2d.getUsrCoordsOfMouse(e);\n if (Array.isArray(uc) && uc.length >= 2) {\n x3 = uc[0];\n y3 = uc[1];\n }\n }\n } catch {\n /* fall back to 0,0,0 */\n }\n const hit: ClickHit = { x3, y3, z3, existingPointId };\n handleToolStep(ctx, tool, hit);\n };\n\n const svgEl = (div as HTMLDivElement).querySelector('svg');\n const targetEl = (svgEl ?? (div as HTMLDivElement)) as HTMLElement | SVGElement;\n const handlePointerDownEv: EventListener = (e) => handlePointerDown(e as PointerEvent);\n targetEl.addEventListener('pointerdown', handlePointerDownEv);\n pointerHandlerRef.current = { el: targetEl, fn: handlePointerDownEv };\n\n if (initialState?.elements?.length) {\n const map = objMapRef.current;\n for (const el of initialState.elements) {\n const parents = el.parents.map((p) =>\n typeof p === 'string' && p.startsWith('@id:') ? map.get(p.slice(4)) : p,\n );\n const obj = view.create(el.type, parents, {\n ...el.attributes,\n id: el.id,\n name: el.label,\n });\n map.set(el.id, obj);\n logRef.current.push(el);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n if (pointerHandlerRef.current) {\n pointerHandlerRef.current.el.removeEventListener(\n 'pointerdown',\n pointerHandlerRef.current.fn,\n );\n pointerHandlerRef.current = null;\n }\n try {\n if (board && JXG) JXG.JSXGraph.freeBoard(board);\n } catch {\n /* ignore teardown errors in tests */\n }\n boardRef.current = null;\n viewRef.current = null;\n ctxRef.current = null;\n objMapRef.current.clear();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleRef = useRef<MiniBoard3DHandle | null>(null);\n handleRef.current = {\n getContainer: () => containerRef.current,\n getTool: () => toolRef.current,\n setTool: (t) => {\n toolRef.current = t;\n notify();\n },\n // Sync toạ độ live của free point3d về log trước khi trả ra. JSXGraph\n // cho phép drag point3d (parents=[x,y,z] không có ref), việc drag chỉ\n // cập nhật obj.X()/Y()/Z() chứ không đụng log → re-edit + Chèn sẽ\n // serialize toạ độ cũ → SVG không đổi → fileId trùng → user thấy\n // \"k thay đổi\". Line/plane/polygon/sphere tham chiếu point qua @id nên\n // auto-update theo.\n getCreationLog: () => logRef.current.map((e) => {\n if (e.type !== 'point3d') return { ...e };\n const parents = e.parents;\n if (!Array.isArray(parents) || parents.length !== 3) return { ...e };\n if (\n typeof parents[0] !== 'number' ||\n typeof parents[1] !== 'number' ||\n typeof parents[2] !== 'number'\n ) return { ...e };\n const obj = objMapRef.current.get(e.id) as\n | { X?: () => number; Y?: () => number; Z?: () => number }\n | undefined;\n if (\n !obj ||\n typeof obj.X !== 'function' ||\n typeof obj.Y !== 'function' ||\n typeof obj.Z !== 'function'\n ) return { ...e };\n const x = obj.X();\n const y = obj.Y();\n const z = obj.Z();\n if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) return { ...e };\n return { ...e, parents: [x, y, z] };\n }),\n pushLog: (e) => {\n logRef.current.push(e);\n notify();\n },\n getViewState: () => {\n const v = viewRef.current as { az?: { Value?: () => number }; el?: { Value?: () => number } } | null;\n return {\n azimuth: v?.az?.Value?.() ?? DEFAULT_VIEW3D.azimuth,\n elevation: v?.el?.Value?.() ?? DEFAULT_VIEW3D.elevation,\n bbox3D: initialBbox3D.current,\n };\n },\n getBbox: () => [-6, 6, 6, -6],\n getShowAxes: () => showAxes,\n getShowMesh: () => showMesh,\n setShowAxes: (b) => {\n setShowAxes(b);\n notify();\n },\n setShowMesh: (b) => {\n setShowMesh(b);\n notify();\n },\n resetView: () => {\n notify();\n },\n undo: () => {\n logRef.current.pop();\n notify();\n },\n canUndo: () => logRef.current.length > 0,\n snapshotSVG: () => {\n const div = containerRef.current;\n if (!div) return { svgString: '', width: 0, height: 0 };\n const svg = div.querySelector('svg');\n if (!svg) return { svgString: '', width: 0, height: 0 };\n const clone = svg.cloneNode(true) as SVGElement;\n const rect = svg.getBoundingClientRect();\n const width = rect.width || 600;\n const height = rect.height || 600;\n clone.setAttribute('width', String(width));\n clone.setAttribute('height', String(height));\n return {\n svgString: new XMLSerializer().serializeToString(clone),\n width,\n height,\n };\n },\n subscribe: (cb) => {\n subsRef.current.add(cb);\n return () => {\n subsRef.current.delete(cb);\n };\n },\n };\n\n useImperativeHandle(ref, () => handleRef.current!, []);\n\n const p = paletteFor(isDark);\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n style={{\n width: '100%',\n height: '100%',\n background: p.view3dBg,\n position: 'relative',\n // Clip JSXGraph mesh3d/bounding-box paths that project outside the\n // board container (Bug #4) — without this they overlap LeftPanel and\n // block pointer events.\n overflow: 'hidden',\n }}\n />\n );\n});\n","'use client';\nimport React, { forwardRef, useCallback, useImperativeHandle, useRef, useState } from 'react';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport type { SerializedBoard3D } from '../serialize';\n\nexport interface EditorPanelHandle {\n tryInsert: () => boolean;\n hasContent: () => boolean;\n}\n\ninterface Props {\n isDark: boolean;\n initial: SerializedBoard3D | null;\n onInsert: (jsonState: string, svgString: string, width: number, height: number) => void;\n onClose: () => void;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Khi true, panel position offset left để chừa chỗ cho LeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Callback expose board handle ra Host để LeftPanel sibling dùng được. */\n onBoardReady?: (handle: MiniBoard3DHandle | null) => void;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n}\n\nexport const EditorPanel = forwardRef<EditorPanelHandle, Props>(function EditorPanel(\n { isDark, initial, onInsert, onClose, isMobile = false, withLeftPanel = false, onBoardReady, onOpenDrawer },\n ref,\n) {\n const boardRef = useRef<MiniBoard3DHandle | null>(null);\n const [ready, setReady] = useState(false);\n const onBoardReadyRef = useRef(onBoardReady);\n onBoardReadyRef.current = onBoardReady;\n\n const setBoard = useCallback((h: MiniBoard3DHandle | null) => {\n boardRef.current = h;\n setReady(!!h);\n onBoardReadyRef.current?.(h);\n }, []);\n\n const performInsert = useCallback((): boolean => {\n const board = boardRef.current;\n if (!board) return false;\n const log = board.getCreationLog();\n if (log.length === 0) return false;\n const view = board.getViewState();\n const state: SerializedBoard3D = {\n version: 1,\n bbox: board.getBbox(),\n view,\n showAxes: board.getShowAxes(),\n showMesh: board.getShowMesh(),\n elements: log,\n };\n const snap = board.snapshotSVG();\n onInsert(JSON.stringify(state), snap.svgString, snap.width, snap.height);\n return true;\n }, [onInsert]);\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: performInsert,\n hasContent: () => (boardRef.current?.getCreationLog().length ?? 0) > 0,\n }),\n [performInsert],\n );\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học 3D\"\n data-testid=\"geom3d-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : 'h-[600px] max-h-[85vh] w-[760px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-blue-600 to-cyan-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 7 L14 4 L20 7 L14 10 Z M4 7 L4 17 L14 20 L14 10 M14 20 L20 17 L20 7\" />\n </svg>\n Hình học không gian (3D)\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geom3d-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n <div className=\"min-h-0 flex-1\">\n <MiniBoard3D ref={setBoard} isDark={isDark} initialState={initial} />\n </div>\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geom3d-insert-btn\"\n className=\"rounded bg-blue-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-blue-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n );\n});\n","export type GeomTool3D =\n | 'move'\n | 'point'\n | 'segment'\n | 'line'\n | 'plane'\n | 'triangle'\n | 'polygon'\n | 'tetrahedron'\n | 'parallelepiped'\n | 'prism'\n | 'pyramid'\n | 'sphere'\n | 'cone'\n | 'cylinder'\n | 'label';\n\nexport type ToolGroup3D = 'view' | 'primitive' | 'solid' | 'curved' | 'meta';\n\nexport interface ToolDef3D {\n key: GeomTool3D;\n label: string;\n group: ToolGroup3D;\n stepsRequired: number;\n hint?: string;\n}\n\nexport const GROUP_LABELS_3D: Record<ToolGroup3D, string> = {\n view: 'Xem',\n primitive: 'Cơ bản',\n solid: 'Khối đa diện',\n curved: 'Khối cong',\n meta: 'Khác',\n};\n\n// Positional A..E — letter shortcut cho chord 2-phím.\nexport const GROUP_ORDER_3D: ToolGroup3D[] = [\n 'view',\n 'primitive',\n 'solid',\n 'curved',\n 'meta',\n];\n\nconst A_CODE_3D = 'A'.charCodeAt(0);\n\nexport function letterForGroup3D(g: ToolGroup3D): string {\n const idx = GROUP_ORDER_3D.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE_3D + idx) : '';\n}\n\nexport function groupForLetter3D(ch: string): ToolGroup3D | null {\n if (ch.length !== 1) return null;\n const upper = ch.toUpperCase();\n const idx = upper.charCodeAt(0) - A_CODE_3D;\n if (idx < 0 || idx >= GROUP_ORDER_3D.length) return null;\n return GROUP_ORDER_3D[idx];\n}\n\nexport const TOOLS_3D: ReadonlyArray<ToolDef3D> = [\n { key: 'move', label: 'Di chuyển', group: 'view', stepsRequired: 0 },\n { key: 'point', label: 'Điểm', group: 'primitive', stepsRequired: 1, hint: 'Nhập (x, y, z)' },\n { key: 'segment', label: 'Đoạn thẳng', group: 'primitive', stepsRequired: 2 },\n { key: 'line', label: 'Đường thẳng', group: 'primitive', stepsRequired: 2 },\n { key: 'plane', label: 'Mặt phẳng', group: 'primitive', stepsRequired: 3 },\n { key: 'triangle', label: 'Tam giác', group: 'primitive', stepsRequired: 3 },\n {\n key: 'polygon',\n label: 'Đa giác',\n group: 'primitive',\n stepsRequired: 3,\n hint: 'Click trở lại điểm đầu để đóng',\n },\n { key: 'tetrahedron', label: 'Tứ diện', group: 'solid', stepsRequired: 4 },\n {\n key: 'parallelepiped',\n label: 'Hình hộp',\n group: 'solid',\n stepsRequired: 1,\n hint: '1 đỉnh + 3 vector',\n },\n {\n key: 'prism',\n label: 'Lăng trụ',\n group: 'solid',\n stepsRequired: 3,\n hint: 'Đa giác đáy + chiều cao',\n },\n {\n key: 'pyramid',\n label: 'Chóp',\n group: 'solid',\n stepsRequired: 4,\n hint: 'Đa giác đáy + đỉnh',\n },\n { key: 'sphere', label: 'Mặt cầu', group: 'curved', stepsRequired: 1, hint: 'Tâm + bán kính' },\n {\n key: 'cone',\n label: 'Hình nón',\n group: 'curved',\n stepsRequired: 2,\n hint: 'Tâm đáy + bán kính + đỉnh',\n },\n {\n key: 'cylinder',\n label: 'Hình trụ',\n group: 'curved',\n stepsRequired: 1,\n hint: 'Tâm đáy + bán kính + chiều cao',\n },\n { key: 'label', label: 'Nhãn', group: 'meta', stepsRequired: 1, hint: 'Gắn vào điểm' },\n];\n","'use client';\nimport type { ReactNode } from 'react';\nimport type { GeomTool3D } from './tools';\n\ninterface ToolButtonProps {\n toolKey: GeomTool3D;\n label: string;\n hint?: string;\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n badge?: ReactNode;\n}\n\nexport function ToolButton({ toolKey, label, hint, active, onClick, icon, badge }: ToolButtonProps) {\n return (\n <button\n type=\"button\"\n title={hint ? `${label} — ${hint}` : label}\n aria-label={label}\n aria-pressed={active}\n onClick={onClick}\n data-active={active || undefined}\n data-tool={toolKey}\n className={[\n 'relative flex h-8 items-center justify-center rounded-md transition',\n active\n ? 'bg-blue-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {icon}\n {badge}\n </button>\n );\n}\n\nconst stroke = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\nexport const ICONS_3D: Record<GeomTool3D, ReactNode> = {\n move: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M5 9l-3 3 3 3M19 9l3 3-3 3M9 5l3-3 3 3M9 19l3 3 3-3\" />\n </svg>\n ),\n point: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"currentColor\" />\n </svg>\n ),\n segment: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"4\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n line: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <line x1=\"2\" y1=\"22\" x2=\"22\" y2=\"2\" />\n </svg>\n ),\n plane: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M3 18 L8 8 L21 6 L16 18 Z\" />\n </svg>\n ),\n triangle: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 4 L21 20 L3 20 Z\" />\n </svg>\n ),\n polygon: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L20 9 L17 19 L7 19 L4 9 Z\" />\n </svg>\n ),\n tetrahedron: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L20 20 L4 20 Z M12 3 L12 20\" />\n </svg>\n ),\n parallelepiped: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M4 7 L14 4 L20 7 L14 10 Z M4 7 L4 17 L14 20 L14 10 M14 20 L20 17 L20 7\" />\n </svg>\n ),\n prism: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 4 L18 8 L18 20 L12 16 Z M12 4 L6 8 L6 20 L12 16 M6 8 L12 12 L18 8 M6 20 L18 20\" />\n </svg>\n ),\n pyramid: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L4 20 L20 20 Z M12 3 L12 20\" />\n </svg>\n ),\n sphere: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"3\" />\n </svg>\n ),\n cone: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L4 20 L20 20 Z\" />\n <ellipse cx=\"12\" cy=\"20\" rx=\"8\" ry=\"2\" />\n </svg>\n ),\n cylinder: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"6\" ry=\"2\" />\n <ellipse cx=\"12\" cy=\"19\" rx=\"6\" ry=\"2\" />\n <line x1=\"6\" y1=\"5\" x2=\"6\" y2=\"19\" />\n <line x1=\"18\" y1=\"5\" x2=\"18\" y2=\"19\" />\n </svg>\n ),\n label: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M4 4 H 16 L 20 8 L 16 12 H 4 Z\" />\n </svg>\n ),\n};\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS_3D, GROUP_LABELS_3D, GROUP_ORDER_3D, letterForGroup3D, type GeomTool3D, type ToolDef3D, type ToolGroup3D } from './tools';\nimport { ToolButton, ICONS_3D } from './toolButtons';\nimport type { MiniBoard3DHandle } from './MiniBoard3D';\nimport { MobileToolDrawer, type MobileToolGroup } from '../../shared/MobileToolDrawer';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shell (desktop) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isDark?: boolean;\n}\n\nfunction Shell({ title, icon, onClose, children, isDark }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"geom3d-left-panel\"\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Icons ----------\n\nconst Geom3DIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 7 L14 4 L20 7 L14 10 Z M4 7 L4 17 L14 20 L14 10 M14 20 L20 17 L20 7\" />\n </svg>\n);\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n );\n}\n\nfunction ResetViewIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n );\n}\n\nfunction AxisIcon3D() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"4\" />\n <line x1=\"12\" y1=\"12\" x2=\"22\" y2=\"6\" />\n <line x1=\"12\" y1=\"12\" x2=\"2\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction MeshIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 8 L12 4 L20 8 L12 12 Z\" />\n <path d=\"M4 8 L4 16 L12 20 L12 12\" />\n <path d=\"M12 20 L20 16 L20 8\" />\n </svg>\n );\n}\n\n// ---------- Props ----------\n\ninterface Props {\n handle: MiniBoard3DHandle | null;\n onResetView: () => void;\n onClose: () => void;\n isDark?: boolean;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n /** Chord shortcut: group đang được focus (sau khi bấm letter). null = không active. */\n chordGroup?: ToolGroup3D | null;\n}\n\n// ---------- Desktop tooltip helper ----------\n\nfunction useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: ToolDef3D) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n\n// ---------- Hook: sync state với handle ----------\n\nfunction useHandleState(handle: MiniBoard3DHandle | null) {\n const [tool, setTool] = useState<GeomTool3D>('move');\n const [showAxes, setShowAxes] = useState(true);\n const [showMesh, setShowMesh] = useState(false);\n const [canUndo, setCanUndo] = useState(false);\n\n useEffect(() => {\n if (!handle) return;\n const sync = () => {\n setTool(handle.getTool());\n setShowAxes(handle.getShowAxes());\n setShowMesh(handle.getShowMesh());\n setCanUndo(handle.canUndo());\n };\n sync();\n return handle.subscribe(sync);\n }, [handle]);\n\n return { tool, showAxes, showMesh, canUndo };\n}\n\n// ---------- Desktop panel ----------\n\nfunction DesktopPanel(props: Props) {\n const { handle, onResetView, onClose, isDark, chordGroup } = props;\n const { tool, showAxes, showMesh, canUndo } = useHandleState(handle);\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n const grouped = useMemo(() => {\n return TOOLS_3D.reduce<Record<ToolGroup3D, ToolDef3D[]>>(\n (acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n },\n {} as Record<ToolGroup3D, ToolDef3D[]>,\n );\n }, []);\n\n const orderedGroups = useMemo(\n () => GROUP_ORDER_3D.filter((g) => grouped[g]),\n [grouped],\n );\n\n const activeGroupTools: ToolDef3D[] | null = chordGroup\n ? (grouped[chordGroup] ?? null)\n : null;\n\n return (\n <>\n <Shell title=\"Hình học 3D\" icon={Geom3DIconHeader} onClose={onClose} isDark={isDark}>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-2 flex-wrap text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxes}\n onChange={(e) => handle?.setShowAxes(e.target.checked)}\n data-testid=\"toggle-axes\"\n />\n Trục\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showMesh}\n onChange={(e) => handle?.setShowMesh(e.target.checked)}\n data-testid=\"toggle-mesh\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={onResetView}\n title=\"Reset góc nhìn\"\n aria-label=\"Reset view\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900\"\n >\n <ResetViewIcon />\n </button>\n <button\n type=\"button\"\n onClick={() => handle?.undo()}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n </div>\n </Section>\n\n {orderedGroups.map((group) => {\n const tools = grouped[group];\n const isChordActive = chordGroup === group;\n const dimmed = chordGroup !== null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive\n ? 'bg-blue-50 ring-1 ring-blue-400 p-1'\n : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{GROUP_LABELS_3D[group]}</span>\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive\n ? 'text-blue-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {letterForGroup3D(group)}\n </span>\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {tools.map((t, i) => {\n const isActive = tool === t.key;\n return (\n <ToolButton\n key={t.key}\n toolKey={t.key}\n label={t.label}\n hint={t.hint}\n active={isActive}\n onClick={() => handle?.setTool(t.key)}\n icon={\n <span\n onMouseEnter={(e) => showHover(e.currentTarget.closest('button') as HTMLElement, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget.closest('button') as HTMLElement, t)}\n onBlur={hideHover}\n >\n {ICONS_3D[t.key]}\n </span>\n }\n badge={\n <span\n data-testid={`chord-num-${t.key}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n isActive\n ? 'text-white/70'\n : isChordActive\n ? 'text-blue-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {i + 1}\n </span>\n }\n />\n );\n })}\n </div>\n </section>\n );\n })}\n\n {chordGroup && activeGroupTools && (\n <div\n data-testid=\"chord-hint\"\n className=\"mt-1 rounded border border-blue-200 bg-blue-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-blue-700\">\n {letterForGroup3D(chordGroup)}\n </span>\n <span className=\"mx-1 text-slate-400\">→</span>\n {activeGroupTools.map((t, i) => (\n <span key={t.key} className=\"mr-2 inline-block\">\n <span className=\"font-mono font-semibold text-blue-700\">\n {i + 1}\n </span>\n <span className=\"ml-1\">{t.label}</span>\n </span>\n ))}\n <span className=\"text-slate-400\">Esc huỷ</span>\n </div>\n )}\n </Shell>\n\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\n// ---------- Mobile panel (redesigned) ----------\n\nfunction MobilePanel(props: Props) {\n const { handle, onResetView, isDark, drawerOpen, onDrawerClose } = props;\n const { tool, showAxes, showMesh, canUndo } = useHandleState(handle);\n\n const groups = useMemo<MobileToolGroup<GeomTool3D, ToolGroup3D>[]>(() => {\n const acc = new Map<ToolGroup3D, ToolDef3D[]>();\n for (const t of TOOLS_3D) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n return Array.from(acc.entries()).map(([group, tools]) => ({\n group,\n groupLabel: GROUP_LABELS_3D[group],\n tools: tools.map((t) => ({ key: t.key, label: t.label, icon: ICONS_3D[t.key] })),\n }));\n }, []);\n\n return (\n <MobileToolDrawer\n title=\"Hình học 3D\"\n headerIcon={Geom3DIconHeader}\n testId=\"geom3d-left-panel\"\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={[\n {\n label: 'Trục',\n icon: <AxisIcon3D />,\n pressed: showAxes,\n onToggle: (b) => handle?.setShowAxes(b),\n testId: 'toggle-axes',\n },\n {\n label: 'Lưới',\n icon: <MeshIcon />,\n pressed: showMesh,\n onToggle: (b) => handle?.setShowMesh(b),\n testId: 'toggle-mesh',\n },\n ]}\n actions={[\n {\n label: 'Reset view',\n title: 'Reset góc nhìn',\n icon: <ResetViewIcon />,\n onClick: onResetView,\n },\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: () => handle?.undo(),\n disabled: !canUndo,\n },\n ]}\n groups={groups}\n activeTool={tool}\n onToolSelect={(k) => handle?.setTool(k)}\n />\n );\n}\n\n// ---------- Public entry ----------\n\nexport function LeftPanel(props: Props) {\n if (props.isMobile) return <MobilePanel {...props} />;\n return <DesktopPanel {...props} />;\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { EditorPanel, type EditorPanelHandle } from './editor/EditorPanel';\nimport { LeftPanel as Geometry3DLeftPanel } from './editor/LeftPanel';\nimport type { MiniBoard3DHandle } from './editor/MiniBoard3D';\nimport { GROUP_ORDER_3D, TOOLS_3D, type GeomTool3D } from './editor/tools';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport {\n isGeometry3DCustomData,\n parseSerializedBoard3D,\n type Geometry3DCustomData,\n type SerializedBoard3D,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\n\nfunction parseInitial(\n editingElement: StampHostProps['editingElement'],\n): SerializedBoard3D | null {\n if (!editingElement) return null;\n if (!isGeometry3DCustomData(editingElement.customData)) return null;\n try {\n return parseSerializedBoard3D(editingElement.customData.jsonState);\n } catch {\n return null;\n }\n}\n\nexport const Geometry3DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Geometry3DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const editorRef = useRef<EditorPanelHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [boardHandle, setBoardHandle] = useState<MiniBoard3DHandle | null>(null);\n\n const initial = useMemo(\n () => parseInitial(editingElement),\n [editingElement],\n );\n\n const handleBoardReady = useCallback((h: MiniBoard3DHandle | null) => {\n setBoardHandle((prev) => (prev === h ? prev : h));\n }, []);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER_3D,\n tools: TOOLS_3D as unknown as Array<{ key: string; group: typeof GROUP_ORDER_3D[number] }>,\n onSelect: (key) => boardHandle?.setTool(key as GeomTool3D),\n enabled: !isMobile,\n });\n\n const handleResetView = useCallback(() => {\n boardHandle?.resetView();\n }, [boardHandle]);\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string, width: number, height: number) => {\n if (!api) return;\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Geometry3DCustomData => ({\n kind: 'geometry3d',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n onClose();\n },\n [api, editingElement, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <Geometry3DLeftPanel\n handle={boardHandle}\n onResetView={handleResetView}\n onClose={onClose}\n isDark={isDark}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n chordGroup={chordGroup}\n />\n <EditorPanel\n ref={editorRef}\n isDark={isDark}\n initial={initial}\n onInsert={handleInsert}\n onClose={onClose}\n isMobile={isMobile}\n withLeftPanel={!isMobile}\n onBoardReady={handleBoardReady}\n onOpenDrawer={() => setDrawerOpen(true)}\n />\n </>\n );\n },\n);\n","export interface SerializedGraph {\n version: 1;\n view: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n showAxis: boolean;\n showGrid: boolean;\n };\n functions: SerializedFunction[];\n parameters: SerializedParameter[];\n points: SerializedPoint[];\n intersections: SerializedIntersection[];\n tangents: SerializedTangent[];\n}\n\nexport interface SerializedFunction {\n id: string;\n name: string;\n expression: string;\n color: string;\n visible: boolean;\n domain?: { min: number; max: number };\n}\n\nexport interface SerializedParameter {\n name: string;\n value: number;\n min: number;\n max: number;\n step: number;\n}\n\nexport interface SerializedPoint {\n id: string;\n functionId: string;\n x: number;\n label?: string;\n}\n\nexport interface SerializedIntersection {\n id: string;\n functionIdA: string;\n functionIdB: string;\n}\n\nexport interface SerializedTangent {\n id: string;\n pointId: string;\n}\n\nexport const EMPTY_GRAPH: SerializedGraph = {\n version: 1,\n view: { xMin: -10, xMax: 10, yMin: -10, yMax: 10, showAxis: true, showGrid: true },\n functions: [],\n parameters: [],\n points: [],\n intersections: [],\n tangents: [],\n};\n\nexport function stringifySerializedGraph(graph: SerializedGraph): string {\n return JSON.stringify(graph);\n}\n\nexport function parseSerializedGraph(jsonState: string): SerializedGraph | null {\n let raw: unknown;\n try {\n raw = JSON.parse(jsonState);\n } catch {\n return null;\n }\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n const r = raw as Record<string, unknown>;\n if (r.version !== 1) return null;\n if (!r.view || typeof r.view !== 'object') return null;\n const v = r.view as Record<string, unknown>;\n if (\n typeof v.xMin !== 'number' ||\n typeof v.xMax !== 'number' ||\n typeof v.yMin !== 'number' ||\n typeof v.yMax !== 'number' ||\n typeof v.showAxis !== 'boolean' ||\n typeof v.showGrid !== 'boolean'\n ) {\n return null;\n }\n for (const key of ['functions', 'parameters', 'points', 'intersections', 'tangents']) {\n if (!Array.isArray(r[key])) return null;\n }\n return raw as SerializedGraph;\n}\n","const ALLOWED_FUNCTIONS = new Set([\n 'sin', 'cos', 'tan', 'asin', 'acos', 'atan',\n 'log', 'ln', 'exp', 'sqrt', 'abs',\n 'floor', 'ceil', 'round',\n]);\n\nconst ALLOWED_CHARS = /^[a-zA-Z0-9_.+\\-*/^()\\s,]+$/;\nconst IDENTIFIER_RE = /[a-zA-Z][a-zA-Z0-9_]*/g;\n\nconst SUGGESTIONS: Record<string, string> = {\n tg: 'tan',\n arcsin: 'asin',\n arccos: 'acos',\n arctan: 'atan',\n};\n\nexport interface ParseResult {\n ok: boolean;\n error?: string;\n freeVars: Set<string>;\n}\n\nfunction errResult(message: string): ParseResult {\n return { ok: false, error: message, freeVars: new Set() };\n}\n\nexport function validate(expr: string): ParseResult {\n const trimmed = expr.trim();\n if (!trimmed) return errResult('Biểu thức rỗng');\n if (!ALLOWED_CHARS.test(trimmed)) return errResult('Ký tự không hợp lệ');\n\n const ids = trimmed.match(IDENTIFIER_RE) ?? [];\n const freeVars = new Set<string>();\n for (const id of ids) {\n if (id === 'x' || id === 'pi' || id === 'e') continue;\n if (ALLOWED_FUNCTIONS.has(id)) continue;\n if (id.length === 1) {\n freeVars.add(id);\n continue;\n }\n const hint = SUGGESTIONS[id];\n return errResult(\n hint\n ? `Tên hàm không hợp lệ: \"${id}\". Bạn có ý là \"${hint}\" không?`\n : `Tên không hợp lệ: \"${id}\"`,\n );\n }\n\n try {\n const paramSubs = Object.fromEntries([...freeVars].map((v) => [v, 1]));\n const rewritten = rewriteToJs(trimmed, paramSubs);\n new Function('x', `return (${rewritten})`);\n } catch {\n return errResult('Lỗi cú pháp');\n }\n\n return { ok: true, freeVars };\n}\n\nconst FUNCTION_REPLACEMENTS: Array<[string, string]> = [\n // longest first để tránh substring conflict (asin trước sin)\n ['asin', 'Math.asin'],\n ['acos', 'Math.acos'],\n ['atan', 'Math.atan'],\n ['sqrt', 'Math.sqrt'],\n ['floor', 'Math.floor'],\n ['round', 'Math.round'],\n ['ceil', 'Math.ceil'],\n ['sin', 'Math.sin'],\n ['cos', 'Math.cos'],\n ['tan', 'Math.tan'],\n ['abs', 'Math.abs'],\n ['exp', 'Math.exp'],\n ['log', 'Math.log10'],\n ['ln', 'Math.log'],\n];\n\nexport function rewriteToJs(\n expr: string,\n params: Record<string, number>,\n): string {\n let s = expr.replace(/\\^/g, '**');\n s = s.replace(/\\bpi\\b/g, 'Math.PI');\n s = s.replace(/\\be\\b/g, 'Math.E');\n for (const [from, to] of FUNCTION_REPLACEMENTS) {\n s = s.replace(new RegExp(`\\\\b${from}\\\\b`, 'g'), to);\n }\n for (const [name, value] of Object.entries(params)) {\n if (name.length !== 1) continue;\n s = s.replace(new RegExp(`\\\\b${name}\\\\b`, 'g'), `(${value})`);\n }\n return s;\n}\n\nexport function compile(\n expr: string,\n paramValues: Record<string, number>,\n): ((x: number) => number) | { error: string } {\n const v = validate(expr);\n if (!v.ok) return { error: v.error ?? 'Invalid' };\n try {\n const rewritten = rewriteToJs(expr, paramValues);\n const raw = new Function('x', `return (${rewritten})`) as (x: number) => number;\n return (x: number) => {\n try {\n const y = raw(x);\n return typeof y === 'number' ? y : NaN;\n } catch {\n return NaN;\n }\n };\n } catch (err) {\n return { error: err instanceof Error ? err.message : String(err) };\n }\n}\n","import type {\n SerializedGraph,\n SerializedPoint,\n SerializedIntersection,\n SerializedTangent,\n} from '../serialize';\nimport { compile } from '../parser';\n\nexport interface ClickContext {\n x: number;\n y: number;\n functionId?: string;\n}\n\nexport function addPointOnCurve(\n graph: SerializedGraph,\n ctx: ClickContext,\n idFactory: () => string,\n): SerializedGraph {\n if (!ctx.functionId) return graph;\n const point: SerializedPoint = {\n id: idFactory(),\n functionId: ctx.functionId,\n x: ctx.x,\n };\n return { ...graph, points: [...graph.points, point] };\n}\n\nexport function addIntersection(\n graph: SerializedGraph,\n functionIdA: string,\n functionIdB: string,\n idFactory: () => string,\n): SerializedGraph {\n if (functionIdA === functionIdB) return graph;\n const exists = graph.intersections.some(\n (i) =>\n (i.functionIdA === functionIdA && i.functionIdB === functionIdB) ||\n (i.functionIdA === functionIdB && i.functionIdB === functionIdA),\n );\n if (exists) return graph;\n const intersection: SerializedIntersection = {\n id: idFactory(),\n functionIdA,\n functionIdB,\n };\n return { ...graph, intersections: [...graph.intersections, intersection] };\n}\n\nexport function addTangent(\n graph: SerializedGraph,\n pointId: string,\n idFactory: () => string,\n): SerializedGraph {\n const exists = graph.tangents.some((t) => t.pointId === pointId);\n if (exists) return graph;\n const tangent: SerializedTangent = { id: idFactory(), pointId };\n return { ...graph, tangents: [...graph.tangents, tangent] };\n}\n\n/**\n * Numerical derivative via centered difference. Dùng cho tangent tool.\n */\nexport function numericalDerivative(\n expression: string,\n paramValues: Record<string, number>,\n x: number,\n h = 1e-4,\n): number {\n const fn = compile(expression, paramValues);\n if (typeof fn !== 'function') return NaN;\n const y1 = fn(x - h);\n const y2 = fn(x + h);\n return (y2 - y1) / (2 * h);\n}\n","import type { SerializedGraph } from './serialize';\nimport { compile } from './parser';\nimport { numericalDerivative } from './editor/handlers';\n\n/**\n * Render tất cả objects (functions, points, intersections, tangents) lên board JSXGraph.\n *\n * Pure function — không giữ state, dùng cho one-shot render (render.ts).\n * MiniBoard giữ syncObjects riêng để diff/track curves theo id.\n */\nexport function renderGraphObjects(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board: any,\n graph: SerializedGraph,\n): void {\n const paramMap: Record<string, number> = {};\n for (const p of graph.parameters) paramMap[p.name] = p.value;\n\n // Functions\n for (const f of graph.functions) {\n if (!f.visible) continue;\n const compiled = compile(f.expression, paramMap);\n if (typeof compiled !== 'function') continue;\n const domain = f.domain ?? { min: graph.view.xMin, max: graph.view.xMax };\n board.create('functiongraph', [compiled, domain.min, domain.max], {\n strokeColor: f.color,\n strokeWidth: 2,\n name: f.name,\n withLabel: false,\n highlight: false,\n });\n }\n\n // Points\n for (const point of graph.points) {\n const fn = graph.functions.find((f) => f.id === point.functionId);\n if (!fn || !fn.visible) continue;\n const compiled = compile(fn.expression, paramMap);\n if (typeof compiled !== 'function') continue;\n const y = compiled(point.x);\n board.create('point', [point.x, y], {\n name: point.label ?? '',\n size: 3,\n fillColor: fn.color,\n strokeColor: fn.color,\n withLabel: !!point.label,\n });\n }\n\n // Intersections\n for (const inter of graph.intersections) {\n const fa = graph.functions.find((f) => f.id === inter.functionIdA);\n const fb = graph.functions.find((f) => f.id === inter.functionIdB);\n if (!fa || !fb || !fa.visible || !fb.visible) continue;\n const cfa = compile(fa.expression, paramMap);\n const cfb = compile(fb.expression, paramMap);\n if (typeof cfa !== 'function' || typeof cfb !== 'function') continue;\n const roots = scanRoots((x: number) => cfa(x) - cfb(x), graph.view.xMin, graph.view.xMax);\n for (const x of roots) {\n board.create('point', [x, cfa(x)], {\n size: 3,\n fillColor: '#000',\n strokeColor: '#000',\n });\n }\n }\n\n // Tangents\n for (const tan of graph.tangents) {\n const pt = graph.points.find((p) => p.id === tan.pointId);\n if (!pt) continue;\n const fn = graph.functions.find((f) => f.id === pt.functionId);\n if (!fn || !fn.visible) continue;\n const slope = numericalDerivative(fn.expression, paramMap, pt.x);\n const cfn = compile(fn.expression, paramMap);\n if (typeof cfn !== 'function' || !Number.isFinite(slope)) continue;\n const y0 = cfn(pt.x);\n const x1 = graph.view.xMin;\n const x2 = graph.view.xMax;\n board.create(\n 'line',\n [\n [x1, slope * (x1 - pt.x) + y0],\n [x2, slope * (x2 - pt.x) + y0],\n ],\n {\n strokeColor: fn.color,\n strokeWidth: 1,\n dash: 2,\n straightFirst: false,\n straightLast: false,\n },\n );\n }\n}\n\nfunction scanRoots(\n fn: (x: number) => number,\n xMin: number,\n xMax: number,\n samples = 200,\n): number[] {\n const roots: number[] = [];\n const step = (xMax - xMin) / samples;\n let prevX = xMin;\n let prevY = fn(prevX);\n for (let i = 1; i <= samples; i++) {\n const x = xMin + i * step;\n const y = fn(x);\n if (Number.isFinite(prevY) && Number.isFinite(y) && prevY * y < 0) {\n let a = prevX;\n let b = x;\n let ya = prevY;\n for (let j = 0; j < 30; j++) {\n const m = (a + b) / 2;\n const ym = fn(m);\n if (Math.abs(ym) < 1e-6) {\n a = b = m;\n break;\n }\n if (ya * ym < 0) {\n b = m;\n } else {\n a = m;\n ya = ym;\n }\n }\n roots.push((a + b) / 2);\n }\n prevX = x;\n prevY = y;\n }\n return roots;\n}\n","import { parseSerializedGraph } from './serialize';\nimport { renderGraphObjects } from './renderObjects';\n\n/**\n * Re-render SVG cho graph-2d stamp từ jsonState đã serialize.\n *\n * Dùng cho:\n * 1. Insert vào whiteboard (lúc user nhấn Chèn).\n * 2. Restore stamp file sau khi reload (Excalidraw không persist binary).\n *\n * Pattern mirror `geometry-2d/render.ts`:\n * - LUÔN dùng light palette. Excalidraw apply CSS invert filter trong dark mode.\n * - Đặt JXG.Options.text.display='internal' để label render dưới dạng SVG, không HTML overlay.\n * - Offscreen div 600×400 cố định; cleanup sau khi clone SVG outerHTML.\n */\nexport async function renderGraph2dSvgFromState(jsonState: string): Promise<string> {\n const parsed = parseSerializedGraph(jsonState);\n if (!parsed) throw new Error('renderGraph2dSvgFromState: jsonState corrupt');\n\n const JXG = (await import('jsxgraph')).default;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n }\n\n const container = document.createElement('div');\n container.id = `jxg_graph2d_off_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n container.style.cssText =\n 'position:absolute;top:-99999px;left:-99999px;width:600px;height:400px;visibility:hidden;pointer-events:none;';\n document.body.appendChild(container);\n\n let board: unknown = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board = (JXG as any).JSXGraph.initBoard(container.id, {\n boundingbox: [parsed.view.xMin, parsed.view.yMax, parsed.view.xMax, parsed.view.yMin],\n axis: parsed.view.showAxis,\n grid: parsed.view.showGrid,\n showCopyright: false,\n showNavigation: false,\n keepAspectRatio: false,\n });\n renderGraphObjects(board, parsed);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (board as any).update();\n const svgEl = container.querySelector('svg');\n if (!svgEl) throw new Error('renderGraph2dSvgFromState: no svg generated');\n return svgEl.outerHTML;\n } finally {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (board) (JXG as any).JSXGraph.freeBoard(board);\n } catch {\n /* ignore */\n }\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface Graph2DCustomData extends BaseStampCustomData {\n kind: 'graph2d';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGraph2DCustomData(data: unknown): data is Graph2DCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<Graph2DCustomData>;\n return d.kind === 'graph2d' && d.version === 1 && typeof d.jsonState === 'string';\n}\n","// src/stamps/graph-2d/editor/tools.ts\nexport type GraphTool = 'move' | 'point-on-curve' | 'intersect' | 'tangent';\n\nexport interface GraphToolMeta {\n id: GraphTool;\n label: string;\n title: string;\n shortcutKey?: string;\n}\n\nexport const GRAPH_TOOLS: GraphToolMeta[] = [\n { id: 'move', label: 'Di chuyển', title: 'Di chuyển / chọn' },\n { id: 'point-on-curve', label: 'Điểm trên curve', title: 'Tạo điểm cố định trên đồ thị' },\n { id: 'intersect', label: 'Giao điểm', title: 'Đánh dấu giao điểm 2 đồ thị' },\n { id: 'tangent', label: 'Tiếp tuyến', title: 'Vẽ tiếp tuyến tại điểm trên đồ thị' },\n];\n","'use client';\n\nimport { useEffect, useState, type KeyboardEvent, type FocusEvent } from 'react';\n\nexport interface FunctionRowProps {\n id: string;\n name: string;\n expression: string;\n color: string;\n visible: boolean;\n error: string | null;\n onExpressionCommit: (expr: string) => void;\n onToggleVisible: () => void;\n onRemove: () => void;\n}\n\nexport function FunctionRow(props: FunctionRowProps) {\n const { id, name, expression, color, visible, error } = props;\n const [draft, setDraft] = useState(expression);\n\n useEffect(() => {\n setDraft(expression);\n }, [expression]);\n\n const commit = () => {\n if (draft !== expression) props.onExpressionCommit(draft);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n (e.target as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n setDraft(expression);\n (e.target as HTMLInputElement).blur();\n }\n };\n\n const handleBlur = (_: FocusEvent<HTMLInputElement>) => commit();\n\n return (\n <div className={`graph-function-row${error ? ' is-error' : ''}`} data-testid={`graph-function-row-${id}`}>\n <span\n className=\"graph-function-color\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n <span className=\"graph-function-name\" data-testid={`graph-function-name-${id}`}>\n {name}(x) =\n </span>\n <input\n aria-label=\"Biểu thức\"\n className=\"graph-function-input\"\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n spellCheck={false}\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n />\n <button\n type=\"button\"\n aria-label=\"Ẩn/hiện đồ thị\"\n className={`graph-function-eye${visible ? '' : ' is-hidden'}`}\n onClick={props.onToggleVisible}\n >\n {visible ? '👁' : '⊘'}\n </button>\n <button\n type=\"button\"\n aria-label=\"Xoá đồ thị\"\n className=\"graph-function-remove\"\n onClick={props.onRemove}\n >\n ✕\n </button>\n {error ? <div className=\"graph-function-error\">{error}</div> : null}\n </div>\n );\n}\n","'use client';\n\nexport interface SliderRowProps {\n name: string;\n value: number;\n min: number;\n max: number;\n step: number;\n onChange: (value: number) => void;\n onRemove: () => void;\n onRangeChange: (min: number, max: number, step: number) => void;\n}\n\nexport function SliderRow(props: SliderRowProps) {\n const { name, value, min, max, step } = props;\n return (\n <div className=\"graph-slider-row\" data-testid={`graph-slider-row-${name}`}>\n <div className=\"graph-slider-header\">\n <span className=\"graph-slider-name\">{name}</span>\n <span className=\"graph-slider-value\">= {value.toFixed(2)}</span>\n <button\n type=\"button\"\n aria-label={`Xoá tham số ${name}`}\n className=\"graph-slider-remove\"\n onClick={props.onRemove}\n >\n ✕\n </button>\n </div>\n <input\n type=\"range\"\n aria-label={`Slider ${name}`}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => props.onChange(parseFloat(e.target.value))}\n className=\"graph-slider-input\"\n />\n <div className=\"graph-slider-range\">\n <span>{min}</span>\n <span>{max}</span>\n </div>\n </div>\n );\n}\n","export const GRAPH_PALETTE = [\n '#2563eb', // blue\n '#dc2626', // red\n '#16a34a', // green\n '#9333ea', // purple\n '#ea580c', // orange\n '#0891b2', // cyan\n '#db2777', // pink\n '#65a30d', // lime\n] as const;\n\nexport const FUNCTION_NAMES = ['f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'] as const;\n\nexport const MAX_FUNCTIONS = 8;\nexport const MAX_PARAMETERS = 8;\n\nexport function nextColor(usedColors: readonly string[]): string {\n for (const c of GRAPH_PALETTE) {\n if (!usedColors.includes(c)) return c;\n }\n return GRAPH_PALETTE[usedColors.length % GRAPH_PALETTE.length];\n}\n\nexport function nextFunctionName(usedNames: readonly string[]): string {\n for (const n of FUNCTION_NAMES) {\n if (!usedNames.includes(n)) return n;\n }\n return FUNCTION_NAMES[usedNames.length % FUNCTION_NAMES.length];\n}\n","'use client';\n\nimport { FunctionRow } from './FunctionRow';\nimport { SliderRow } from './SliderRow';\nimport type { SerializedGraph } from '../serialize';\nimport { MAX_FUNCTIONS } from '../colors';\n\nexport interface AlgebraViewProps {\n graph: SerializedGraph;\n errors: Record<string, string | null>;\n onAddFunctionDraft: () => void;\n onCommitFunctionExpr: (id: string, expr: string) => void;\n onToggleFunctionVisible: (id: string) => void;\n onRemoveFunction: (id: string) => void;\n onParameterChange: (name: string, value: number) => void;\n onParameterRangeChange: (name: string, min: number, max: number, step: number) => void;\n onRemoveParameter: (name: string) => void;\n}\n\nexport function AlgebraView(props: AlgebraViewProps) {\n const { graph, errors } = props;\n const atMax = graph.functions.length >= MAX_FUNCTIONS;\n\n return (\n <div className=\"graph-algebra-view\">\n <div className=\"graph-algebra-section\">\n {graph.functions.map((f) => (\n <FunctionRow\n key={f.id}\n id={f.id}\n name={f.name}\n expression={f.expression}\n color={f.color}\n visible={f.visible}\n error={errors[f.id] ?? null}\n onExpressionCommit={(expr) => props.onCommitFunctionExpr(f.id, expr)}\n onToggleVisible={() => props.onToggleFunctionVisible(f.id)}\n onRemove={() => props.onRemoveFunction(f.id)}\n />\n ))}\n <button\n type=\"button\"\n aria-label=\"Thêm hàm số\"\n className=\"graph-algebra-add\"\n onClick={props.onAddFunctionDraft}\n disabled={atMax}\n >\n + Thêm hàm\n </button>\n </div>\n\n {graph.parameters.length > 0 ? (\n <div className=\"graph-algebra-section graph-algebra-parameters\">\n {graph.parameters.map((p) => (\n <SliderRow\n key={p.name}\n name={p.name}\n value={p.value}\n min={p.min}\n max={p.max}\n step={p.step}\n onChange={(v) => props.onParameterChange(p.name, v)}\n onRangeChange={(min, max, step) =>\n props.onParameterRangeChange(p.name, min, max, step)\n }\n onRemove={() => props.onRemoveParameter(p.name)}\n />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { GRAPH_TOOLS, type GraphTool } from './tools';\nimport { AlgebraView, type AlgebraViewProps } from './AlgebraView';\n\n// ---------- Icons ----------\n\nconst GraphIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 21 V3\" />\n <path d=\"M3 21 H21\" />\n <path d=\"M5 19 C8 5, 14 5, 19 17\" />\n </svg>\n);\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n );\n}\n\nfunction ResetViewIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" />\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n </svg>\n );\n}\n\n// Tool icons\nfunction MoveIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 4 L9 4 L9 9 L4 9 Z\" />\n </svg>\n );\n}\nfunction PointOnCurveIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 17 C7 8, 14 8, 21 14\" />\n <circle cx=\"12\" cy=\"11\" r=\"2.2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\nfunction IntersectIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 17 C8 5, 14 5, 21 17\" />\n <path d=\"M3 5 C8 17, 14 17, 21 5\" />\n <circle cx=\"12\" cy=\"11\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\nfunction TangentIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 17 C8 7, 14 7, 21 16\" />\n <line x1=\"4\" y1=\"14\" x2=\"20\" y2=\"6\" />\n <circle cx=\"12\" cy=\"10\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nconst TOOL_ICONS: Record<GraphTool, React.ReactNode> = {\n move: <MoveIcon />,\n 'point-on-curve': <PointOnCurveIcon />,\n intersect: <IntersectIcon />,\n tangent: <TangentIcon />,\n};\n\n// ---------- Props ----------\n\nexport interface GraphLeftPanelProps extends AlgebraViewProps {\n activeTool: GraphTool;\n onToolChange: (t: GraphTool) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onResetView: () => void;\n onUndo: () => void;\n canUndo: boolean;\n onClose: () => void;\n isDark: boolean;\n isMobile: boolean;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n}\n\n// ---------- Section ----------\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Body ----------\n\nfunction PanelBody(props: GraphLeftPanelProps) {\n return (\n <>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-2 flex-wrap text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={props.showAxis}\n onChange={(e) => props.onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n Trục\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={props.showGrid}\n onChange={(e) => props.onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={props.onResetView}\n title=\"Đặt lại tầm nhìn\"\n aria-label=\"Đặt lại tầm nhìn\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900\"\n >\n <ResetViewIcon />\n </button>\n <button\n type=\"button\"\n onClick={props.onUndo}\n disabled={!props.canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n </div>\n </Section>\n\n <Section label=\"Công cụ\">\n <div className=\"grid grid-cols-4 gap-1\">\n {GRAPH_TOOLS.map((t) => {\n const isActive = props.activeTool === t.id;\n return (\n <button\n key={t.id}\n type=\"button\"\n aria-label={t.title}\n title={t.title}\n aria-pressed={isActive}\n onClick={() => props.onToolChange(t.id)}\n data-testid={`graph-tool-${t.id}`}\n className={[\n 'flex h-8 items-center justify-center rounded-md transition',\n isActive\n ? 'bg-orange-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {TOOL_ICONS[t.id]}\n </button>\n );\n })}\n </div>\n </Section>\n\n <Section label=\"Hàm số\">\n <AlgebraView\n graph={props.graph}\n errors={props.errors}\n onAddFunctionDraft={props.onAddFunctionDraft}\n onCommitFunctionExpr={props.onCommitFunctionExpr}\n onToggleFunctionVisible={props.onToggleFunctionVisible}\n onRemoveFunction={props.onRemoveFunction}\n onParameterChange={props.onParameterChange}\n onParameterRangeChange={props.onParameterRangeChange}\n onRemoveParameter={props.onRemoveParameter}\n />\n </Section>\n </>\n );\n}\n\n// ---------- Public ----------\n\nexport function GraphLeftPanel(props: GraphLeftPanelProps) {\n const { isMobile, drawerOpen, isDark, onClose, onDrawerClose } = props;\n if (isMobile && !drawerOpen) return null;\n const handleClose = isMobile ? onDrawerClose : onClose;\n return (\n <aside\n role=\"complementary\"\n aria-label=\"Đồ thị 2D\"\n data-testid=\"graph-left-panel\"\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n isMobile\n ? 'fixed inset-y-0 left-0 z-50 flex w-72 max-w-[85vw] flex-col bg-white shadow-2xl animate-in slide-in-from-left duration-200'\n : 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join(' ')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{GraphIconHeader}</span>\n Đồ thị 2D\n </h3>\n <button\n onClick={handleClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">\n <PanelBody {...props} />\n </div>\n </aside>\n );\n}\n","// src/stamps/graph-2d/editor/theme.ts\nexport interface GraphPalette {\n axis: string;\n grid: string;\n label: string;\n background: string;\n}\n\nexport function graphPaletteFor(isDark: boolean): GraphPalette {\n return {\n axis: isDark ? '#cbd5e1' : '#94a3b8',\n grid: isDark ? '#475569' : '#e2e8f0',\n label: isDark ? '#e2e8f0' : '#0f172a',\n background: isDark ? '#0f172a' : '#ffffff',\n };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport type { SerializedGraph } from '../serialize';\nimport { compile } from '../parser';\nimport { graphPaletteFor } from './theme';\nimport type { GraphTool } from './tools';\nimport { numericalDerivative } from './handlers';\n\nexport interface BoardEvent {\n type: 'click-curve' | 'click-empty' | 'view-change';\n functionId?: string;\n x?: number;\n y?: number;\n view?: SerializedGraph['view'];\n}\n\nexport interface MiniBoardProps {\n graph: SerializedGraph;\n activeTool: GraphTool;\n isDark: boolean;\n onBoardEvent: (e: BoardEvent) => void;\n}\n\ninterface CurveRef {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any;\n expression: string;\n color: string;\n visible: boolean;\n paramSignature: string;\n}\n\nexport function MiniBoard({ graph, activeTool, isDark, onBoardEvent }: MiniBoardProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const boardRef = useRef<any>(null);\n const curvesRef = useRef<Map<string, CurveRef>>(new Map());\n const palette = graphPaletteFor(isDark);\n\n // Init board on mount\n useEffect(() => {\n let cancelled = false;\n let createdBoard: unknown = null;\n const containerEl = containerRef.current;\n if (!containerEl) return;\n const containerId = `jxg_graph2d_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n containerEl.id = containerId;\n\n (async () => {\n const JXG = (await import('jsxgraph')).default;\n if (cancelled) return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const board = (JXG as any).JSXGraph.initBoard(containerId, {\n boundingbox: [graph.view.xMin, graph.view.yMax, graph.view.xMax, graph.view.yMin],\n axis: graph.view.showAxis,\n grid: graph.view.showGrid,\n showCopyright: false,\n showNavigation: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: true, needShift: false },\n keepAspectRatio: false,\n });\n boardRef.current = board;\n createdBoard = board;\n syncObjects(board, graph, curvesRef.current);\n board.on('boundingbox', () => {\n const bb = board.getBoundingBox();\n onBoardEvent({\n type: 'view-change',\n view: {\n xMin: bb[0],\n xMax: bb[2],\n yMax: bb[1],\n yMin: bb[3],\n showAxis: graph.view.showAxis,\n showGrid: graph.view.showGrid,\n },\n });\n });\n board.on('down', (ev: { clientX?: number; clientY?: number }) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const usrCoords = (board as any).getUsrCoordsOfMouse?.(ev as unknown as MouseEvent);\n const x = usrCoords?.[0] ?? 0;\n const y = usrCoords?.[1] ?? 0;\n // Tìm curve dưới chuột (best-effort)\n let functionId: string | undefined;\n for (const [id, ref] of curvesRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const obj = ref.obj as any;\n if (obj?.hasPoint && obj.hasPoint(ev.clientX ?? 0, ev.clientY ?? 0)) {\n functionId = id;\n break;\n }\n }\n if (functionId) onBoardEvent({ type: 'click-curve', functionId, x, y });\n else onBoardEvent({ type: 'click-empty', x, y });\n });\n })().catch((err) => console.error('MiniBoard init failed:', err));\n\n return () => {\n cancelled = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (createdBoard) (require('jsxgraph') as any).default.JSXGraph.freeBoard(createdBoard);\n } catch { /* ignore */ }\n boardRef.current = null;\n curvesRef.current.clear();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Sync objects khi graph thay đổi\n useEffect(() => {\n if (!boardRef.current) return;\n syncObjects(boardRef.current, graph, curvesRef.current);\n }, [graph]);\n\n // Suppress unused palette warning - consumed by syncObjects via isDark\n void palette;\n\n // Cursor visual feedback theo activeTool\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n el.style.cursor = activeTool === 'move' ? '' : 'crosshair';\n }, [activeTool]);\n\n return (\n <div\n ref={containerRef}\n className=\"graph-miniboard\"\n style={{ width: '100%', height: '100%', minHeight: '300px' }}\n data-testid=\"graph-miniboard\"\n />\n );\n}\n\nfunction paramSig(graph: SerializedGraph): string {\n return graph.parameters.map((p) => `${p.name}=${p.value}`).join(',');\n}\n\nfunction syncObjects(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board: any,\n graph: SerializedGraph,\n curves: Map<string, CurveRef>,\n): void {\n const sig = paramSig(graph);\n const paramMap: Record<string, number> = {};\n for (const p of graph.parameters) paramMap[p.name] = p.value;\n\n const wantedIds = new Set(graph.functions.map((f) => f.id));\n // Remove stale curves\n for (const [id, ref] of curves) {\n if (!wantedIds.has(id)) {\n try { board.removeObject(ref.obj); } catch { /* ignore */ }\n curves.delete(id);\n }\n }\n for (const f of graph.functions) {\n const existing = curves.get(f.id);\n const needsRecreate =\n !existing ||\n existing.expression !== f.expression ||\n existing.color !== f.color ||\n existing.visible !== f.visible ||\n existing.paramSignature !== sig;\n if (!needsRecreate) continue;\n if (existing) {\n try { board.removeObject(existing.obj); } catch { /* ignore */ }\n }\n if (!f.visible) {\n curves.delete(f.id);\n continue;\n }\n const compiled = compile(f.expression, paramMap);\n if (typeof compiled !== 'function') continue;\n const domain = f.domain ?? { min: graph.view.xMin, max: graph.view.xMax };\n const obj = board.create('functiongraph', [compiled, domain.min, domain.max], {\n strokeColor: f.color,\n strokeWidth: 2,\n name: f.name,\n withLabel: false,\n highlight: false,\n });\n curves.set(f.id, {\n obj,\n expression: f.expression,\n color: f.color,\n visible: f.visible,\n paramSignature: sig,\n });\n }\n\n // Render points\n for (const point of graph.points) {\n const fn = graph.functions.find((f) => f.id === point.functionId);\n if (!fn || !fn.visible) continue;\n const compiled = compile(fn.expression, paramMap);\n if (typeof compiled !== 'function') continue;\n const y = compiled(point.x);\n board.create('point', [point.x, y], {\n name: point.label ?? '',\n size: 3,\n fillColor: fn.color,\n strokeColor: fn.color,\n withLabel: !!point.label,\n });\n }\n\n // Render intersections\n for (const inter of graph.intersections) {\n const fa = graph.functions.find((f) => f.id === inter.functionIdA);\n const fb = graph.functions.find((f) => f.id === inter.functionIdB);\n if (!fa || !fb || !fa.visible || !fb.visible) continue;\n const cfa = compile(fa.expression, paramMap);\n const cfb = compile(fb.expression, paramMap);\n if (typeof cfa !== 'function' || typeof cfb !== 'function') continue;\n const roots = scanRoots((x: number) => cfa(x) - cfb(x), graph.view.xMin, graph.view.xMax);\n for (const x of roots) {\n board.create('point', [x, cfa(x)], {\n size: 3,\n fillColor: '#000',\n strokeColor: '#000',\n });\n }\n }\n\n // Render tangents\n for (const tan of graph.tangents) {\n const pt = graph.points.find((p) => p.id === tan.pointId);\n if (!pt) continue;\n const fn = graph.functions.find((f) => f.id === pt.functionId);\n if (!fn || !fn.visible) continue;\n const slope = numericalDerivative(fn.expression, paramMap, pt.x);\n const cfn = compile(fn.expression, paramMap);\n if (typeof cfn !== 'function' || !Number.isFinite(slope)) continue;\n const y0 = cfn(pt.x);\n const x1 = graph.view.xMin;\n const x2 = graph.view.xMax;\n board.create(\n 'line',\n [\n [x1, slope * (x1 - pt.x) + y0],\n [x2, slope * (x2 - pt.x) + y0],\n ],\n {\n strokeColor: fn.color,\n strokeWidth: 1,\n dash: 2,\n straightFirst: false,\n straightLast: false,\n },\n );\n }\n\n board.update();\n}\n\nfunction scanRoots(\n fn: (x: number) => number,\n xMin: number,\n xMax: number,\n samples = 200,\n): number[] {\n const roots: number[] = [];\n const step = (xMax - xMin) / samples;\n let prevX = xMin;\n let prevY = fn(prevX);\n for (let i = 1; i <= samples; i++) {\n const x = xMin + i * step;\n const y = fn(x);\n if (Number.isFinite(prevY) && Number.isFinite(y) && prevY * y < 0) {\n // bisection\n let a = prevX;\n let b = x;\n let ya = prevY;\n for (let j = 0; j < 30; j++) {\n const m = (a + b) / 2;\n const ym = fn(m);\n if (Math.abs(ym) < 1e-6) {\n a = b = m;\n break;\n }\n if (ya * ym < 0) {\n b = m;\n } else {\n a = m;\n ya = ym;\n }\n }\n roots.push((a + b) / 2);\n }\n prevX = x;\n prevY = y;\n }\n return roots;\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type CSSProperties,\n type Ref,\n} from 'react';\nimport { MiniBoard } from './MiniBoard';\nimport type { BoardEvent } from './MiniBoard';\nimport {\n EMPTY_GRAPH,\n stringifySerializedGraph,\n type SerializedFunction,\n type SerializedGraph,\n type SerializedParameter,\n} from '../serialize';\nimport { validate } from '../parser';\nimport { renderGraph2dSvgFromState } from '../render';\nimport { nextColor, nextFunctionName, MAX_FUNCTIONS, MAX_PARAMETERS } from '../colors';\nimport type { GraphTool } from './tools';\nimport { addPointOnCurve, addIntersection } from './handlers';\n\nexport interface GraphState {\n tool: GraphTool;\n showAxis: boolean;\n showGrid: boolean;\n canUndo: boolean;\n}\n\nexport interface GraphEditorPanelHandle {\n insert(): boolean;\n hasContent(): boolean;\n setTool(t: GraphTool): void;\n setShowAxis(b: boolean): void;\n setShowGrid(b: boolean): void;\n resetView(): void;\n undo(): void;\n\n addFunction(expr: string): { ok: true; id: string } | { ok: false; error: string };\n commitFunctionExpression(id: string, expr: string): void;\n toggleFunctionVisible(id: string): void;\n removeFunction(id: string): void;\n\n setParameter(name: string, value: number): void;\n setParameterRange(name: string, min: number, max: number, step: number): void;\n removeParameter(name: string): void;\n\n getGraph(): SerializedGraph;\n getErrors(): Record<string, string | null>;\n}\n\nexport interface GraphEditorPanelProps {\n initialState: SerializedGraph | null;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n onStateChange: (state: GraphState) => void;\n withLeftPanel: boolean;\n isDark: boolean;\n isMobile: boolean;\n onOpenDrawer: () => void;\n // Lift state up so Host can render AlgebraView with current graph + errors\n onGraphChange?: (g: SerializedGraph) => void;\n onErrorsChange?: (errors: Record<string, string | null>) => void;\n}\n\nexport const GraphEditorPanel = forwardRef(function GraphEditorPanel(\n props: GraphEditorPanelProps,\n ref: Ref<GraphEditorPanelHandle>,\n) {\n // graphRef is the single source of truth for imperative reads (hasContent, getGraph, etc.)\n // setGraph triggers re-render to sync JSXGraph MiniBoard\n const initialGraph = props.initialState ?? EMPTY_GRAPH;\n const graphRef = useRef<SerializedGraph>(initialGraph);\n const [, forceUpdate] = useState(0);\n\n const [errors, setErrors] = useState<Record<string, string | null>>({});\n const [tool, setToolState] = useState<GraphTool>('move');\n const undoStackRef = useRef<SerializedGraph[]>([]);\n const idCounterRef = useRef(1);\n\n const toolRef = useRef<GraphTool>(tool);\n toolRef.current = tool;\n\n const intersectFirstRef = useRef<string | null>(null);\n\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // Notify initial graph state to Host on mount\n const initialGraphNotifiedRef = useRef(false);\n\n const pushUndo = useCallback((g: SerializedGraph) => {\n undoStackRef.current.push(g);\n if (undoStackRef.current.length > 30) undoStackRef.current.shift();\n }, []);\n\n const setErrorsWithNotify = useCallback(\n (updater: (prev: Record<string, string | null>) => Record<string, string | null>) => {\n setErrors((prev) => {\n const next = updater(prev);\n propsRef.current.onErrorsChange?.(next);\n return next;\n });\n },\n [],\n );\n\n const notifyStateChange = useCallback((g: SerializedGraph, t: GraphTool) => {\n propsRef.current.onStateChange({\n tool: t,\n showAxis: g.view.showAxis,\n showGrid: g.view.showGrid,\n canUndo: undoStackRef.current.length > 0,\n });\n }, []);\n\n const updateGraph = useCallback(\n (mutator: (prev: SerializedGraph) => SerializedGraph) => {\n const prev = graphRef.current;\n pushUndo(prev);\n const next = mutator(prev);\n graphRef.current = next;\n notifyStateChange(next, toolRef.current);\n forceUpdate((n) => n + 1);\n propsRef.current.onGraphChange?.(next);\n },\n [pushUndo, notifyStateChange],\n );\n\n const onBoardEvent = useCallback((ev: BoardEvent) => {\n const currentTool = toolRef.current;\n if (currentTool === 'point-on-curve' && ev.type === 'click-curve' && ev.functionId && ev.x !== undefined) {\n updateGraph((g) =>\n addPointOnCurve(\n g,\n { x: ev.x!, y: ev.y ?? 0, functionId: ev.functionId },\n () => `p${idCounterRef.current++}`,\n ),\n );\n setToolState('move');\n } else if (currentTool === 'intersect' && ev.type === 'click-curve' && ev.functionId) {\n if (!intersectFirstRef.current) {\n intersectFirstRef.current = ev.functionId;\n } else {\n const a = intersectFirstRef.current;\n const b = ev.functionId;\n intersectFirstRef.current = null;\n updateGraph((g) =>\n addIntersection(g, a, b, () => `i${idCounterRef.current++}`),\n );\n setToolState('move');\n }\n } else if (currentTool === 'tangent' && ev.type === 'click-curve' && ev.functionId && ev.x !== undefined) {\n const pointId = `p${idCounterRef.current++}`;\n const tangentId = `t${idCounterRef.current++}`;\n updateGraph((g) => ({\n ...g,\n points: [...g.points, { id: pointId, functionId: ev.functionId!, x: ev.x! }],\n tangents: [...g.tangents, { id: tangentId, pointId }],\n }));\n setToolState('move');\n }\n }, [updateGraph]);\n\n useImperativeHandle(\n ref,\n () => ({\n insert: () => {\n const g = graphRef.current;\n if (g.functions.length === 0) return false;\n const jsonState = stringifySerializedGraph(g);\n renderGraph2dSvgFromState(jsonState)\n .then((svg) => propsRef.current.onInsert(jsonState, svg))\n .catch((err) => console.error('Graph2D insert render failed:', err));\n return true;\n },\n\n hasContent: () => graphRef.current.functions.length > 0,\n\n setTool: (t: GraphTool) => {\n setToolState(t);\n const g = graphRef.current;\n propsRef.current.onStateChange({\n tool: t,\n showAxis: g.view.showAxis,\n showGrid: g.view.showGrid,\n canUndo: undoStackRef.current.length > 0,\n });\n },\n\n setShowAxis: (b: boolean) =>\n updateGraph((g) => ({ ...g, view: { ...g.view, showAxis: b } })),\n\n setShowGrid: (b: boolean) =>\n updateGraph((g) => ({ ...g, view: { ...g.view, showGrid: b } })),\n\n resetView: () =>\n updateGraph((g) => ({\n ...g,\n view: { ...g.view, xMin: -10, xMax: 10, yMin: -10, yMax: 10 },\n })),\n\n undo: () => {\n const prev = undoStackRef.current.pop();\n if (!prev) return;\n graphRef.current = prev;\n forceUpdate((n) => n + 1);\n propsRef.current.onStateChange({\n tool: toolRef.current,\n showAxis: prev.view.showAxis,\n showGrid: prev.view.showGrid,\n canUndo: undoStackRef.current.length > 0,\n });\n propsRef.current.onGraphChange?.(prev);\n },\n\n addFunction: (expr: string) => {\n const g = graphRef.current;\n if (g.functions.length >= MAX_FUNCTIONS) {\n return { ok: false as const, error: `Tối đa ${MAX_FUNCTIONS} hàm` };\n }\n const v = validate(expr);\n if (!v.ok) return { ok: false as const, error: v.error ?? 'Invalid' };\n\n const id = `f${idCounterRef.current++}`;\n const usedNames = g.functions.map((f) => f.name);\n const usedColors = g.functions.map((f) => f.color);\n const newFn: SerializedFunction = {\n id,\n name: nextFunctionName(usedNames),\n expression: expr,\n color: nextColor(usedColors),\n visible: true,\n };\n\n const usedParamNames = new Set(g.parameters.map((p) => p.name));\n const newParams: SerializedParameter[] = [];\n for (const varName of v.freeVars) {\n if (usedParamNames.has(varName)) continue;\n if (g.parameters.length + newParams.length >= MAX_PARAMETERS) break;\n newParams.push({ name: varName, value: 1, min: -5, max: 5, step: 0.1 });\n }\n\n updateGraph((prev) => ({\n ...prev,\n functions: [...prev.functions, newFn],\n parameters: [...prev.parameters, ...newParams],\n }));\n setErrorsWithNotify((e) => ({ ...e, [id]: null }));\n return { ok: true as const, id };\n },\n\n commitFunctionExpression: (id: string, expr: string) => {\n const g = graphRef.current;\n const v = validate(expr);\n if (!v.ok) {\n setErrorsWithNotify((e) => ({ ...e, [id]: v.error ?? 'Invalid' }));\n return;\n }\n const usedParamNames = new Set(g.parameters.map((p) => p.name));\n const newParams: SerializedParameter[] = [];\n for (const varName of v.freeVars) {\n if (usedParamNames.has(varName)) continue;\n if (g.parameters.length + newParams.length >= MAX_PARAMETERS) break;\n newParams.push({ name: varName, value: 1, min: -5, max: 5, step: 0.1 });\n }\n updateGraph((prev) => ({\n ...prev,\n functions: prev.functions.map((f) =>\n f.id === id ? { ...f, expression: expr } : f,\n ),\n parameters: [...prev.parameters, ...newParams],\n }));\n setErrorsWithNotify((e) => ({ ...e, [id]: null }));\n },\n\n toggleFunctionVisible: (id: string) =>\n updateGraph((g) => ({\n ...g,\n functions: g.functions.map((f) =>\n f.id === id ? { ...f, visible: !f.visible } : f,\n ),\n })),\n\n removeFunction: (id: string) =>\n updateGraph((g) => ({\n ...g,\n functions: g.functions.filter((f) => f.id !== id),\n })),\n\n // setParameter does NOT push undo — would flood the stack (slider drag)\n setParameter: (name: string, value: number) => {\n const next = {\n ...graphRef.current,\n parameters: graphRef.current.parameters.map((p) =>\n p.name === name ? { ...p, value } : p,\n ),\n };\n graphRef.current = next;\n forceUpdate((n) => n + 1);\n propsRef.current.onGraphChange?.(next);\n },\n\n setParameterRange: (name: string, min: number, max: number, step: number) =>\n updateGraph((g) => ({\n ...g,\n parameters: g.parameters.map((p) =>\n p.name === name\n ? { ...p, min, max, step, value: Math.min(max, Math.max(min, p.value)) }\n : p,\n ),\n })),\n\n removeParameter: (name: string) =>\n updateGraph((g) => ({\n ...g,\n parameters: g.parameters.filter((p) => p.name !== name),\n })),\n\n getGraph: () => graphRef.current,\n getErrors: () => errors,\n }),\n // deps: updateGraph stable; errors changes when function errors change; setErrorsWithNotify stable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [updateGraph, errors, setErrorsWithNotify],\n );\n\n // Notify Host of initial graph on mount (so AlgebraView renders correctly for re-edit)\n useEffect(() => {\n if (!initialGraphNotifiedRef.current) {\n initialGraphNotifiedRef.current = true;\n propsRef.current.onGraphChange?.(graphRef.current);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const graph = graphRef.current;\n const hasContent = graph.functions.length > 0;\n\n const handleInsert = () => {\n const g = graphRef.current;\n if (g.functions.length === 0) return;\n const jsonState = stringifySerializedGraph(g);\n renderGraph2dSvgFromState(jsonState)\n .then((svg) => propsRef.current.onInsert(jsonState, svg))\n .catch((err) => console.error('Graph2D insert render failed:', err));\n };\n\n const { isMobile, isDark, withLeftPanel } = props;\n const wrapperStyle: CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Đồ thị 2D\"\n data-testid=\"graph-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : 'h-[540px] max-h-[85vh] w-[640px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-orange-500 to-amber-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={props.onOpenDrawer}\n aria-label=\"Mở bảng đại số\"\n data-testid=\"graph-drawer-toggle\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 21 V3\" />\n <path d=\"M3 21 H21\" />\n <path d=\"M5 19 C8 5, 14 5, 19 17\" />\n </svg>\n Đồ thị 2D\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!hasContent}\n data-testid=\"graph-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button\n onClick={props.onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n <div className=\"min-h-0 flex-1\">\n <MiniBoard\n graph={graph}\n activeTool={tool}\n isDark={isDark}\n onBoardEvent={onBoardEvent}\n />\n </div>\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Nhập biểu thức trong bảng đại số bên trái.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={props.onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!hasContent}\n data-testid=\"graph-insert-btn\"\n className=\"rounded bg-orange-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-orange-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n );\n});\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { GraphLeftPanel } from './editor/LeftPanel';\nimport {\n GraphEditorPanel,\n type GraphEditorPanelHandle,\n type GraphState,\n} from './editor/EditorPanel';\nimport { insertStampImage } from '../shared/insertImage';\nimport {\n parseSerializedGraph,\n EMPTY_GRAPH,\n type SerializedGraph,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { isGraph2DCustomData, type Graph2DCustomData } from './types';\n\n// ============== Host component ==============\n\nconst INITIAL_GRAPH_STATE: GraphState = {\n tool: 'move',\n showAxis: true,\n showGrid: true,\n canUndo: false,\n};\n\nexport const Graph2DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Graph2DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GraphEditorPanelHandle | null>(null);\n const [graphUIState, setGraphUIState] = useState<GraphState>(INITIAL_GRAPH_STATE);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const initialState = useMemo<SerializedGraph | null>(() => {\n if (!editingElement) return null;\n if (!isGraph2DCustomData(editingElement.customData)) return null;\n return parseSerializedGraph(editingElement.customData.jsonState);\n }, [editingElement]);\n\n // State lifted from EditorPanel so LeftPanel/AlgebraView renders current graph + errors\n const [graphSnapshot, setGraphSnapshot] = useState<SerializedGraph>(\n initialState ?? EMPTY_GRAPH,\n );\n const [errorsSnapshot, setErrorsSnapshot] = useState<Record<string, string | null>>({});\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (width, height): Graph2DCustomData => ({\n kind: 'graph2d',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Graph2D insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <GraphLeftPanel\n activeTool={graphUIState.tool}\n onToolChange={(t) => panelRef.current?.setTool(t)}\n showAxis={graphUIState.showAxis}\n showGrid={graphUIState.showGrid}\n onShowAxisChange={(b) => panelRef.current?.setShowAxis(b)}\n onShowGridChange={(b) => panelRef.current?.setShowGrid(b)}\n onResetView={() => panelRef.current?.resetView()}\n onUndo={() => panelRef.current?.undo()}\n canUndo={graphUIState.canUndo}\n onClose={onClose}\n isDark={isDark}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n graph={graphSnapshot}\n errors={errorsSnapshot}\n onAddFunctionDraft={() => {\n const result = panelRef.current?.addFunction('x');\n if (result && !result.ok) console.warn('addFunction failed:', result.error);\n }}\n onCommitFunctionExpr={(id, expr) =>\n panelRef.current?.commitFunctionExpression(id, expr)\n }\n onToggleFunctionVisible={(id) => panelRef.current?.toggleFunctionVisible(id)}\n onRemoveFunction={(id) => panelRef.current?.removeFunction(id)}\n onParameterChange={(name, v) => panelRef.current?.setParameter(name, v)}\n onParameterRangeChange={(name, min, max, step) =>\n panelRef.current?.setParameterRange(name, min, max, step)\n }\n onRemoveParameter={(name) => panelRef.current?.removeParameter(name)}\n />\n <GraphEditorPanel\n ref={panelRef}\n initialState={initialState}\n onInsert={handleInsert}\n onClose={onClose}\n onStateChange={setGraphUIState}\n onGraphChange={setGraphSnapshot}\n onErrorsChange={setErrorsSnapshot}\n withLeftPanel={!isMobile}\n isDark={isDark}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n />\n </>\n );\n },\n);\n","'use client';\n\n// Client-only wrapper around Excalidraw that lets us reach for static helpers\n// like `MainMenu.DefaultItems.*`. Whiteboard dynamic-imports this\n// file so SSR never evaluates @excalidraw/excalidraw, while inside this file we\n// can use plain static imports (the entire module loads on the client).\n\nimport React from 'react';\nimport {\n Excalidraw,\n MainMenu,\n Footer,\n WelcomeScreen,\n} from '@excalidraw/excalidraw';\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExcalidrawProps = any;\n\nexport function ExcalidrawWithMenus(props: ExcalidrawProps) {\n const { children, ...rest } = props;\n return (\n <Excalidraw {...rest}>\n {/* Replace default menu with curated items — no socials/help/branding */}\n <MainMenu>\n <MainMenu.DefaultItems.LoadScene />\n <MainMenu.DefaultItems.SaveAsImage />\n <MainMenu.DefaultItems.ClearCanvas />\n <MainMenu.DefaultItems.ToggleTheme />\n </MainMenu>\n {/* Footer slot with no content suppresses default \"Made with Excalidraw\" link */}\n <Footer>\n <span />\n </Footer>\n {/* WelcomeScreen slot (empty) prevents the default Excalidraw welcome panel\n * (which includes the Excalidraw logo and social links) from appearing. */}\n <WelcomeScreen>\n <span />\n </WelcomeScreen>\n {children}\n </Excalidraw>\n );\n}\n","import type { AppState } from '@excalidraw/excalidraw/types';\nimport type { SyncableAppState } from './types';\n\nexport function pickSyncableAppState(s: AppState): SyncableAppState {\n return {\n viewBackgroundColor: s.viewBackgroundColor,\n zoom: s.zoom,\n scrollX: s.scrollX,\n scrollY: s.scrollY,\n gridSize: s.gridSize ?? null,\n theme: s.theme,\n };\n}\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport { renderGeometrySvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport {\n isGeometryCustomData,\n type GeometryCustomData,\n} from './types';\n\nexport { isGeometryCustomData };\nexport type { GeometryCustomData };\n\nconst GeometryStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.GeometryStampHost })),\n);\n\nconst GeometryIcon: ReactNode = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport const geometryStamp: StampType = {\n kind: 'geometry',\n shortcutKey: 'g',\n toolbarLabel: 'G',\n toolbarTitle: 'Chèn hình học (G)',\n toolbarIcon: GeometryIcon,\n toolbarTestId: 'stamp-toolbar-geometry',\n matchesCustomData: isGeometryCustomData,\n async renderSvgFromCustomData(data) {\n if (!isGeometryCustomData(data)) {\n throw new Error('geometryStamp.renderSvgFromCustomData: customData không phải geometry');\n }\n return renderGeometrySvgFromState(data.jsonState);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as GeometryCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGeometryCustomData(data)) return null;\n const svgString = await renderGeometrySvgFromState(data.jsonState);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL = 'data:image/svg+xml;base64,' + (\n typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64')\n );\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: GeometryStampHost,\n};\n","'use client';\n\nimport { lazy } from 'react';\nimport { renderLatexToSvg } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport { isLatexCustomData, type LatexCustomData } from './types';\n\nexport { isLatexCustomData };\nexport type { LatexCustomData };\n\nconst LatexStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.LatexStampHost })),\n);\n\nconst LatexIcon = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M17 5 H7 L13 12 L7 19 H17\" />\n </svg>\n);\n\nexport const latexStamp: StampType = {\n kind: 'latex',\n shortcutKey: 'l',\n toolbarLabel: 'L',\n toolbarTitle: 'Chèn công thức LaTeX (L)',\n toolbarIcon: LatexIcon,\n toolbarTestId: 'stamp-toolbar-latex',\n matchesCustomData: isLatexCustomData,\n async renderSvgFromCustomData(data) {\n if (!isLatexCustomData(data)) {\n throw new Error('latexStamp.renderSvgFromCustomData: customData không phải latex');\n }\n return renderLatexToSvg(data.src, data.displayMode);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as LatexCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isLatexCustomData(data)) return null;\n const svgString = await renderLatexToSvg(data.src, data.displayMode);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL = 'data:image/svg+xml;base64,' + (\n typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64')\n );\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: LatexStampHost,\n};\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport {\n isGeometry3DCustomData,\n type Geometry3DCustomData,\n} from './serialize';\nimport { renderGeometry3DSvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\n\nexport { isGeometry3DCustomData };\nexport type { Geometry3DCustomData };\n\nconst Geometry3DStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.Geometry3DStampHost })),\n);\n\nconst Geometry3DIcon: ReactNode = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {/* Mặt trước */}\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n {/* Mặt trên */}\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n {/* Mặt phải */}\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nexport const geometry3dStamp: StampType = {\n kind: 'geometry3d',\n experimental: true,\n shortcutKey: 'd',\n toolbarLabel: 'D',\n toolbarTitle: 'Hình 3D (D)',\n toolbarIcon: Geometry3DIcon,\n toolbarTestId: 'stamp-toolbar-geometry3d',\n matchesCustomData: isGeometry3DCustomData,\n async renderSvgFromCustomData(data: unknown): Promise<string> {\n if (!isGeometry3DCustomData(data)) {\n throw new Error('geometry3dStamp.renderSvgFromCustomData: customData không phải geometry3d');\n }\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgString;\n },\n restoreFileFromCustomData: async (element): Promise<RestoredStampFile | null> => {\n const data = element.customData as Geometry3DCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGeometry3DCustomData(data)) return null;\n try {\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n const dataURL = `data:image/svg+xml;base64,${\n typeof btoa !== 'undefined'\n ? btoa(unescape(encodeURIComponent(svgString)))\n : Buffer.from(svgString).toString('base64')\n }`;\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n } catch {\n return null;\n }\n },\n Host: Geometry3DStampHost,\n};\n","\"use client\";\n\nimport { parseSerializedBoard3D } from './serialize';\n\nexport interface RenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nconst OUTPUT_WIDTH = 1024;\nconst OUTPUT_HEIGHT = 768;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport async function renderGeometry3DSvgFromState(\n jsonState: string,\n): Promise<RenderResult> {\n const state = parseSerializedBoard3D(jsonState);\n const JXG = (await import('jsxgraph')).default;\n\n const div = document.createElement('div');\n div.style.cssText = `position:absolute;left:-9999px;top:-9999px;width:${OUTPUT_WIDTH}px;height:${OUTPUT_HEIGHT}px;`;\n document.body.appendChild(div);\n\n try {\n JXG.Options.text.display = 'internal';\n\n const board = JXG.JSXGraph.initBoard(div, {\n boundingbox: state.bbox,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n }) as { create: (k: string, p: unknown[], a: unknown) => JxgObj };\n\n const view: JxgObj = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [state.view.bbox3D[0], state.view.bbox3D[3]],\n [state.view.bbox3D[1], state.view.bbox3D[4]],\n [state.view.bbox3D[2], state.view.bbox3D[5]],\n ],\n ],\n {\n az: { slider: { visible: false }, value: state.view.azimuth },\n el: { slider: { visible: false }, value: state.view.elevation },\n projection: 'central',\n },\n );\n\n if (!state.showAxes) {\n (view as { defaultAxes?: unknown[] }).defaultAxes = [];\n }\n\n const idMap = new Map<string, JxgObj>();\n for (const el of state.elements) {\n const parents = el.parents.map((p) =>\n typeof p === 'string' && p.startsWith('@id:')\n ? idMap.get(p.slice(4))\n : p,\n );\n const obj = (\n view as { create: (k: string, p: unknown[], a: unknown) => JxgObj }\n ).create(el.type, parents, {\n ...el.attributes,\n id: el.id,\n name: el.label,\n });\n idMap.set(el.id, obj);\n }\n\n const svg = div.querySelector('svg');\n if (!svg) {\n throw new Error('renderGeometry3DSvgFromState: SVG not produced');\n }\n const clone = svg.cloneNode(true) as SVGElement;\n clone.setAttribute('width', String(OUTPUT_WIDTH));\n clone.setAttribute('height', String(OUTPUT_HEIGHT));\n const svgString = new XMLSerializer().serializeToString(clone);\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n JXG.JSXGraph.freeBoard(board as any);\n } catch {\n /* ignore teardown */\n }\n\n return { svgString, width: OUTPUT_WIDTH, height: OUTPUT_HEIGHT };\n } finally {\n document.body.removeChild(div);\n }\n}\n","'use client';\n\nimport { lazy } from 'react';\nimport { renderGraph2dSvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport { isGraph2DCustomData, type Graph2DCustomData } from './types';\n\nexport { isGraph2DCustomData };\nexport type { Graph2DCustomData };\n\nconst Graph2DStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.Graph2DStampHost })),\n);\n\nconst Graph2DIcon = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M3 21 V3\" />\n <path d=\"M3 21 H21\" />\n <path d=\"M5 19 C8 5, 14 5, 19 17\" />\n </svg>\n);\n\nexport const graph2dStamp: StampType = {\n kind: 'graph2d',\n experimental: true,\n shortcutKey: 'h',\n toolbarLabel: 'H',\n toolbarTitle: 'Chèn đồ thị 2D (H)',\n toolbarIcon: Graph2DIcon,\n toolbarTestId: 'stamp-toolbar-graph2d',\n matchesCustomData: isGraph2DCustomData,\n async renderSvgFromCustomData(data) {\n if (!isGraph2DCustomData(data)) {\n throw new Error('graph2dStamp.renderSvgFromCustomData: customData không phải graph2d');\n }\n return renderGraph2dSvgFromState(data.jsonState);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as Graph2DCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGraph2DCustomData(data)) return null;\n const svgString = await renderGraph2dSvgFromState(data.jsonState);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL =\n 'data:image/svg+xml;base64,' +\n (typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64'));\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: Graph2DStampHost,\n};\n","import { geometryStamp } from '../geometry-2d';\nimport { latexStamp } from '../latex';\nimport { geometry3dStamp } from '../geometry-3d';\nimport { graph2dStamp } from '../graph-2d';\nimport type { StampType } from './types';\n\nexport { geometryStamp, type GeometryCustomData, isGeometryCustomData } from '../geometry-2d';\nexport { latexStamp, type LatexCustomData, isLatexCustomData } from '../latex';\nexport {\n geometry3dStamp,\n type Geometry3DCustomData,\n isGeometry3DCustomData,\n} from '../geometry-3d';\nexport { graph2dStamp, type Graph2DCustomData, isGraph2DCustomData } from '../graph-2d';\nexport type { StampType, BaseStampCustomData } from './types';\n\n/** Stamp ổn định, sẵn sàng production. */\nexport const STABLE_STAMPS: ReadonlyArray<StampType> = Object.freeze([\n geometryStamp,\n latexStamp,\n]);\n\n/** Stamp experimental — chưa ổn định cho production. Consumer phải opt-in. */\nexport const EXPERIMENTAL_STAMPS: ReadonlyArray<StampType> = Object.freeze([\n geometry3dStamp,\n graph2dStamp,\n]);\n\n/** Tất cả stamp (stable + experimental). Dùng khi consumer muốn full feature. */\nexport const ALL_STAMPS: ReadonlyArray<StampType> = Object.freeze([\n ...STABLE_STAMPS,\n ...EXPERIMENTAL_STAMPS,\n]);\n\n/**\n * Set stamp mặc định cho Whiteboard. v0.7.0 trở đi = STABLE_STAMPS.\n * Consumer muốn experimental: `<Whiteboard stamps={ALL_STAMPS} />` hoặc\n * `[...DEFAULT_STAMPS, geometry3dStamp]`.\n *\n * Để thêm 1 stamp mới (vd chart):\n * 1. Tạo `src/stamps/chart/index.tsx` export `chartStamp: StampType`.\n * 2. Import + add vào STABLE_STAMPS (production-ready) hoặc\n * EXPERIMENTAL_STAMPS (chưa ổn định) ở file này.\n * 3. Re-export `chartStamp` từ `src/stamps/index.ts` + `src/index.ts`.\n */\nexport const DEFAULT_STAMPS: ReadonlyArray<StampType> = STABLE_STAMPS;\n\n/** Tìm stamp tương ứng với customData của element. null nếu không match. */\nexport function findStampForCustomData(\n data: unknown,\n stamps: ReadonlyArray<StampType> = DEFAULT_STAMPS,\n): StampType | null {\n for (const s of stamps) {\n if (s.matchesCustomData(data)) return s;\n }\n return null;\n}\n\n/** isMathStamp version dựa trên registry. */\nexport function isStampElement<T extends { customData?: unknown }>(\n element: T,\n stamps: ReadonlyArray<StampType> = DEFAULT_STAMPS,\n): boolean {\n return findStampForCustomData(element.customData, stamps) !== null;\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DEFAULT_STAMPS } from './registry';\nimport type { StampType } from './types';\n\ninterface Props {\n /** Bật/tắt theo role. Khi disabled → không mount portal. */\n enabled: boolean;\n /** Kind stamp đang active, hoặc null nếu không có stamp nào mở. */\n activeStampKind: string | null;\n /** Toggle stamp theo kind. */\n onToggle: (kind: string) => void;\n /** Danh sách stamp đăng ký. Mặc định DEFAULT_STAMPS. */\n stamps?: ReadonlyArray<StampType>;\n}\n\nconst MENU_WRAPPER_ID = 'stamp-menu-portal-wrapper';\n/**\n * Excalidraw 0.18 áp dụng class `App-toolbar__extra-tools-dropdown` lên\n * popover wrapper của More tools cho cả desktop lẫn mobile. Mobile có\n * thêm modifier `dropdown-menu--mobile`. Selector này cover cả hai mode.\n */\nconst POPOVER_SELECTOR =\n '.App-toolbar__extra-tools-dropdown .dropdown-menu-container';\n\n/**\n * Inject stamp buttons vào popover \"More tools\" của Excalidraw.\n *\n * v0.7.0: thay vì inject inline vào main toolbar (desktop) hoặc dropdown\n * riêng cho mobile, ta chỉ inject vào dropdown-menu-container bên trong\n * popover của Excalidraw. Selector cover cả desktop lẫn mobile vì hai\n * mode dùng cùng cấu trúc DOM (DropdownMenu.Content).\n *\n * Popover mount/unmount theo trigger click → MutationObserver dò DOM,\n * mount lại wrapper khi cần.\n */\nexport function ToolbarInjector({\n enabled,\n activeStampKind,\n onToggle,\n stamps = DEFAULT_STAMPS,\n}: Props) {\n const [menuMount, setMenuMount] = useState<HTMLElement | null>(null);\n const menuMountRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!enabled) {\n if (menuMountRef.current !== null) {\n menuMountRef.current = null;\n setMenuMount(null);\n }\n document.getElementById(MENU_WRAPPER_ID)?.remove();\n return;\n }\n\n let cancelled = false;\n let observer: MutationObserver | null = null;\n let rafId: number | null = null;\n\n const apply = (next: HTMLElement | null) => {\n if (cancelled || menuMountRef.current === next) return;\n menuMountRef.current = next;\n queueMicrotask(() => {\n if (!cancelled) setMenuMount(next);\n });\n };\n\n const findMenu = () => {\n if (cancelled) return;\n const container = document.querySelector<HTMLElement>(POPOVER_SELECTOR);\n if (!container) {\n apply(null);\n return;\n }\n let wrapper = container.querySelector<HTMLDivElement>('#' + MENU_WRAPPER_ID);\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.id = MENU_WRAPPER_ID;\n wrapper.setAttribute('data-stamp-menu', 'true');\n wrapper.setAttribute('data-stamp-area', 'true');\n wrapper.style.display = 'contents';\n container.insertBefore(wrapper, container.firstChild);\n }\n apply(wrapper);\n };\n\n const schedule = () => {\n if (rafId != null) return;\n rafId = requestAnimationFrame(() => {\n rafId = null;\n findMenu();\n });\n };\n\n findMenu();\n\n const root = document.querySelector('.excalidraw') ?? document.body;\n observer = new MutationObserver(schedule);\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n cancelled = true;\n if (rafId != null) cancelAnimationFrame(rafId);\n observer?.disconnect();\n document.getElementById(MENU_WRAPPER_ID)?.remove();\n };\n }, [enabled]);\n\n if (!enabled || !menuMount) return null;\n\n const closePopover = () => {\n const trigger = document.querySelector<HTMLButtonElement>(\n '.App-toolbar__extra-tools-trigger',\n );\n trigger?.click();\n };\n\n return createPortal(\n <>\n {stamps.map((stamp) => (\n <StampMenuItem\n key={stamp.kind}\n icon={stamp.toolbarIcon}\n label={stamp.toolbarTitle}\n active={activeStampKind === stamp.kind}\n onClick={() => {\n onToggle(stamp.kind);\n closePopover();\n }}\n dataTestId={stamp.toolbarTestId}\n />\n ))}\n <div\n aria-hidden=\"true\"\n style={{\n height: 1,\n background: 'var(--default-border-color, rgba(0,0,0,0.08))',\n margin: '6px 4px',\n }}\n />\n </>,\n menuMount,\n );\n}\n\ninterface StampMenuItemProps {\n icon: React.ReactNode;\n label: string;\n active: boolean;\n onClick: () => void;\n dataTestId?: string;\n}\n\nfunction StampMenuItem({ icon, label, active, onClick, dataTestId }: StampMenuItemProps) {\n const className = [\n 'dropdown-menu-item',\n 'dropdown-menu-item-base',\n active ? 'dropdown-menu-item--selected' : '',\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n aria-pressed={active}\n data-testid={dataTestId}\n className={className}\n style={{\n display: 'flex',\n alignItems: 'center',\n columnGap: '0.625rem',\n width: '100%',\n boxSizing: 'border-box',\n background: 'transparent',\n border: '1px solid transparent',\n cursor: 'pointer',\n fontFamily: 'inherit',\n fontSize: '0.875rem',\n color: 'var(--color-on-surface)',\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '1rem',\n height: '1rem',\n }}\n >\n {icon}\n </span>\n <span>{label}</span>\n </button>\n );\n}\n","import { useEffect } from 'react';\nimport { DEFAULT_STAMPS } from './registry';\nimport type { StampType } from './types';\n\ninterface Options {\n enabled: boolean;\n /** Toggle stamp theo kind khi user bấm shortcut tương ứng. */\n onToggle: (kind: string) => void;\n /** Registry. Mặc định DEFAULT_STAMPS. */\n stamps?: ReadonlyArray<StampType>;\n}\n\nfunction isEditableTarget(t: EventTarget | null): boolean {\n if (!t || !(t instanceof HTMLElement)) return false;\n if (t.isContentEditable) return true;\n const tag = t.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n}\n\n/**\n * Bind keyboard shortcut cho mỗi stamp trong registry. Capture phase +\n * stopPropagation để chặn trước Excalidraw's bubble-phase handlers (Excalidraw\n * dùng `L` cho Line tool, nếu không chặn → bấm L lại chuyển tool thay vì\n * toggle LaTeX panel).\n */\nexport function useShortcuts({\n enabled,\n onToggle,\n stamps = DEFAULT_STAMPS,\n}: Options): void {\n useEffect(() => {\n if (!enabled) return;\n const keyToKind = new Map<string, string>();\n for (const s of stamps) keyToKind.set(s.shortcutKey, s.kind);\n\n const handler = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isEditableTarget(e.target)) return;\n const key = e.key.toLowerCase();\n const kind = keyToKind.get(key);\n if (!kind) return;\n e.preventDefault();\n e.stopPropagation();\n onToggle(kind);\n };\n window.addEventListener('keydown', handler, { capture: true });\n return () => window.removeEventListener('keydown', handler, { capture: true });\n }, [enabled, onToggle, stamps]);\n}\n","import { useCallback, useRef } from 'react';\nimport { findStampForCustomData } from './registry';\nimport type { StampType } from './types';\n\nconst DOUBLE_CLICK_MS = 400;\n\ninterface Opts {\n enabled: boolean;\n stamps: ReadonlyArray<StampType>;\n onOpen: (\n kind: string,\n editingElement: { id: string; customData: unknown },\n ) => void;\n}\n\n/**\n * Trả về handler cho Excalidraw `onPointerDown`. Phát hiện double-click vào\n * image element thuộc một stamp đã đăng ký → gọi `onOpen(kind, element)`.\n */\nexport function useStampDoubleClick({ enabled, stamps, onOpen }: Opts) {\n const lastClickRef = useRef<{ time: number; elementId: string | null }>({\n time: 0,\n elementId: null,\n });\n\n return useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_activeTool: any, pointerDownState: any) => {\n if (!enabled) return;\n const hitElement = pointerDownState?.hit?.element;\n if (!hitElement || hitElement.type !== 'image') return;\n const stamp = findStampForCustomData(hitElement.customData, stamps);\n if (!stamp) return;\n const now = Date.now();\n const isDouble =\n lastClickRef.current.elementId === hitElement.id &&\n now - lastClickRef.current.time < DOUBLE_CLICK_MS;\n lastClickRef.current = { time: now, elementId: hitElement.id };\n if (!isDouble) return;\n onOpen(stamp.kind, {\n id: hitElement.id,\n customData: hitElement.customData,\n });\n },\n [enabled, stamps, onOpen],\n );\n}\n","import { useEffect, useMemo } from 'react';\nimport type { StampType } from './types';\n\nconst ALLOWED_KEYS = new Set([\n 'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Shift', 'Control', 'Alt', 'Meta', 'CapsLock',\n 'Home', 'End', 'PageUp', 'PageDown',\n]);\n\nfunction isEditable(el: EventTarget | null): boolean {\n if (!(el instanceof HTMLElement)) return false;\n if (el.isContentEditable) return true;\n const tag = el.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n}\n\ninterface Opts {\n /** Active stamp kind. Null = no blocker. */\n activeStamp: string | null;\n /** Stamps đăng ký để allow shortcut keys của chúng đi qua. */\n stamps: ReadonlyArray<StampType>;\n}\n\n/**\n * Khi 1 stamp panel đang mở, block hoàn toàn các phím tắt Excalidraw\n * (1-9, V, R, D...) bằng cách prevent + stop tại capture phase. Cho phép qua:\n * Tab/Arrow/Modifier, Escape, và phím tắt đã đăng ký bởi stamps (V/G/L/D...).\n */\nexport function useStampShortcutBlocker({ activeStamp, stamps }: Opts) {\n const shortcutKeys = useMemo(\n () => new Set(stamps.map((s) => s.shortcutKey.toLowerCase())),\n [stamps],\n );\n\n useEffect(() => {\n if (!activeStamp) return;\n\n const blocker = (e: KeyboardEvent) => {\n if (isEditable(e.target)) return;\n if (e.ctrlKey || e.metaKey) return;\n if (ALLOWED_KEYS.has(e.key)) return;\n if (e.key === 'Escape') return;\n if (shortcutKeys.has(e.key.toLowerCase())) return;\n e.preventDefault();\n e.stopPropagation();\n };\n window.addEventListener('keydown', blocker, { capture: true });\n return () => window.removeEventListener('keydown', blocker, { capture: true });\n }, [activeStamp, shortcutKeys]);\n}\n","import { useEffect, type RefObject } from 'react';\nimport type { StampHostHandle } from './types';\n\ninterface Opts {\n /** Active stamp. Null = no listener. */\n activeStamp: string | null;\n /** Ref tới Host imperative API (tryInsert / hasContent). */\n hostRef: RefObject<StampHostHandle | null>;\n /** Callback đóng panel. */\n onClose: () => void;\n}\n\n/**\n * Khi 1 stamp panel mở, lắng nghe pointer/mouse-down toàn document. Nếu\n * điểm click không nằm trong vùng `[data-stamp-area=\"true\"]`, gọi\n * `hostRef.tryInsert()` để auto-commit (nếu có nội dung) rồi `onClose()`.\n */\nexport function useStampClickOutside({ activeStamp, hostRef, onClose }: Opts) {\n useEffect(() => {\n if (!activeStamp) return;\n let lastFire = 0;\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n if (target.closest('[data-stamp-area=\"true\"]')) return;\n const now = Date.now();\n if (now - lastFire < 50) return;\n lastFire = now;\n hostRef.current?.tryInsert();\n onClose();\n };\n window.addEventListener('pointerdown', handler, { capture: true });\n window.addEventListener('mousedown', handler, { capture: true });\n return () => {\n window.removeEventListener('pointerdown', handler, { capture: true });\n window.removeEventListener('mousedown', handler, { capture: true });\n };\n }, [activeStamp, hostRef, onClose]);\n}\n","// Regenerate Excalidraw BinaryFiles for stamp elements after page reload.\n//\n// Why this exists: VideoRoom only persists the Excalidraw scene (elements +\n// appState) to sessionStorage; binary files (the SVG dataURLs for stamp\n// images) are NOT persisted. After reload, elements still reference a fileId\n// via customData, but the file payload is missing — Excalidraw renders the\n// image area as an empty placeholder.\n//\n// Strategy: tra registry để tìm StampType khớp customData.kind. Nếu stamp có\n// `restoreFileFromCustomData`, gọi trực tiếp với full element (stamp tự lấy\n// fileId + render). Ngược lại, fallback sang `renderSvgFromCustomData` (path\n// cũ: filter type=image + fileId + kiểm tra existing files).\n//\n// Excalidraw key trên fileId chứ không phải hash dataURL nên nếu kết quả\n// render có sai khác nhỏ (vd thứ tự element) cũng không ảnh hưởng.\n//\n// Theme: stamps được render với LIGHT palette (nét đậm). Excalidraw áp dụng\n// `filter: invert(...)` lên canvas trong dark mode → nét tự đảo sáng. KHÔNG\n// cần force regenerate khi user toggle theme.\n\nimport { DEFAULT_STAMPS, findStampForCustomData } from './registry';\nimport type { StampType } from './types';\n\ninterface ElementLike {\n id: string;\n type?: string;\n fileId?: string | null;\n customData?: unknown;\n}\n\ninterface AddFileRecord {\n id: string;\n dataURL: string;\n mimeType: string;\n created: number;\n}\n\nfunction svgToDataURL(svg: string): string {\n const utf8 = unescape(encodeURIComponent(svg));\n return 'data:image/svg+xml;base64,' + btoa(utf8);\n}\n\nasync function buildFileForStamp(\n fileId: string,\n customData: unknown,\n stamp: StampType,\n): Promise<AddFileRecord | null> {\n try {\n const svg = await stamp.renderSvgFromCustomData(customData);\n return { id: fileId, dataURL: svgToDataURL(svg), mimeType: 'image/svg+xml', created: Date.now() };\n } catch (err) {\n console.warn('Stamp restore failed for', fileId, '(' + stamp.kind + ')', err);\n return null;\n }\n}\n\n/**\n * Find stamp elements whose binary file is missing from Excalidraw, then\n * regenerate via registry dispatch. Idempotent: safe to call on every scene\n * update.\n *\n * Stamps that implement `restoreFileFromCustomData` are handled via the new\n * registry-driven path (stamp receives the full element and returns the file\n * record). Stamps that only implement `renderSvgFromCustomData` use the legacy\n * path (filter type=image + fileId, skip already-present files).\n *\n * @param api Excalidraw imperative API.\n * @param elements Tất cả elements trong scene.\n * @param stamps Registry. Default = DEFAULT_STAMPS.\n */\nexport async function restoreMissingStampFiles(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api: any,\n elements: readonly ElementLike[],\n stamps: ReadonlyArray<StampType> = DEFAULT_STAMPS,\n): Promise<void> {\n if (!api) return;\n\n const filesToAdd: AddFileRecord[] = [];\n\n // --- New registry-driven path: stamp.restoreFileFromCustomData ---\n const newPathHandled = new Set<string>();\n for (const el of elements) {\n const stamp = findStampForCustomData(el.customData, stamps);\n if (!stamp?.restoreFileFromCustomData) continue;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const restored = await stamp.restoreFileFromCustomData(el as any);\n if (!restored) continue;\n newPathHandled.add(el.id);\n filesToAdd.push({\n id: restored.fileId,\n dataURL: restored.dataURL,\n mimeType: restored.mimeType,\n created: Date.now(),\n });\n }\n\n // --- Legacy path: stamp.renderSvgFromCustomData (type=image + fileId filter) ---\n const existing = (typeof api.getFiles === 'function') ? api.getFiles() : {};\n const seen = new Set<string>();\n for (const el of elements) {\n if (newPathHandled.has(el.id)) continue;\n if (el.type !== 'image') continue;\n if (!el.fileId) continue;\n if (existing && existing[el.fileId]) continue;\n if (seen.has(el.fileId)) continue;\n const stamp = findStampForCustomData(el.customData, stamps);\n if (!stamp) continue;\n seen.add(el.fileId);\n const built = await buildFileForStamp(el.fileId, el.customData, stamp);\n if (built) filesToAdd.push(built);\n }\n\n if (filesToAdd.length > 0) {\n try { api.addFiles(filesToAdd); } catch (err) { console.warn('addFiles failed:', err); }\n }\n}\n","import type { ExcalidrawElement, SyncableAppState } from '../../types';\n\nconst PREFIX = 'whiteboard:scene:';\nconst SCHEMA_VERSION = 1 as const;\n\nexport interface StoredScene {\n version: typeof SCHEMA_VERSION;\n elements: readonly ExcalidrawElement[];\n appState: Partial<SyncableAppState>;\n savedAt: number;\n}\n\nfunction fullKey(key: string): string {\n return PREFIX + key;\n}\n\nexport function readScene(key: string): StoredScene | null {\n if (typeof window === 'undefined') return null;\n const raw = window.localStorage.getItem(fullKey(key));\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<StoredScene>;\n if (!parsed || typeof parsed !== 'object') return null;\n if (parsed.version !== SCHEMA_VERSION) {\n // Cố ý KHÔNG xoá entry — version mismatch có thể là dữ liệu của client\n // mới hơn (user vừa downgrade). Giữ lại để client tương ứng đọc được sau.\n console.warn(\n `[whiteboard] scene version ${parsed.version} không khớp ${SCHEMA_VERSION}, bỏ qua.`,\n );\n return null;\n }\n if (!Array.isArray(parsed.elements)) return null;\n return {\n version: SCHEMA_VERSION,\n elements: parsed.elements,\n appState: (parsed.appState ?? {}) as Partial<SyncableAppState>,\n savedAt: typeof parsed.savedAt === 'number' ? parsed.savedAt : Date.now(),\n };\n } catch (err) {\n console.warn('[whiteboard] scene parse error, clear:', err);\n try {\n window.localStorage.removeItem(fullKey(key));\n } catch { /* ignore */ }\n return null;\n }\n}\n\nexport function writeScene(\n key: string,\n payload: { elements: readonly ExcalidrawElement[]; appState: Partial<SyncableAppState> },\n): void {\n if (typeof window === 'undefined') return;\n const record: StoredScene = {\n version: SCHEMA_VERSION,\n elements: payload.elements,\n appState: payload.appState,\n savedAt: Date.now(),\n };\n try {\n window.localStorage.setItem(fullKey(key), JSON.stringify(record));\n } catch (err) {\n console.warn('[whiteboard] scene write failed:', err);\n }\n}\n\nexport function clearScene(key: string): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.removeItem(fullKey(key));\n } catch { /* ignore */ }\n}\n","import type { BinaryFiles } from '../../types';\n\nconst DB_NAME = 'whiteboard-files';\nconst DB_VERSION = 1;\nconst STORE = 'files';\n\ninterface FileRecord {\n id: string;\n storageKey: string;\n dataURL: string;\n mimeType: string;\n created: number;\n savedAt: number;\n}\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\nlet idbDisabled = false;\n\nfunction openDb(): Promise<IDBDatabase> {\n if (idbDisabled) return Promise.reject(new Error('IndexedDB disabled'));\n if (dbPromise) return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n idbDisabled = true;\n reject(new Error('indexedDB undefined'));\n return;\n }\n const req = indexedDB.open(DB_NAME, DB_VERSION);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE)) {\n const store = db.createObjectStore(STORE, { keyPath: 'id' });\n store.createIndex('storageKey', 'storageKey', { unique: false });\n }\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => {\n idbDisabled = true;\n reject(req.error ?? new Error('IDB open failed'));\n };\n });\n return dbPromise;\n}\n\nasync function withStore<T>(\n mode: IDBTransactionMode,\n fn: (\n store: IDBObjectStore,\n setResult: (value: T) => void,\n fail: (error: unknown) => void,\n ) => void,\n fallback: T,\n): Promise<T> {\n let db: IDBDatabase;\n try {\n db = await openDb();\n } catch {\n return fallback;\n }\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(STORE, mode);\n const store = tx.objectStore(STORE);\n let result = fallback;\n try {\n fn(\n store,\n (value) => {\n result = value;\n },\n reject,\n );\n } catch (err) {\n reject(err);\n return;\n }\n tx.oncomplete = () => resolve(result);\n tx.onerror = () => {\n console.warn('[whiteboard] IDB tx error:', tx.error);\n reject(tx.error ?? new Error('IDB tx error'));\n };\n tx.onabort = () => reject(tx.error ?? new Error('IDB tx aborted'));\n });\n}\n\nexport async function readFiles(storageKey: string): Promise<BinaryFiles> {\n try {\n return await withStore(\n 'readonly',\n (store, setResult, fail) => {\n const out: BinaryFiles = {};\n const req = store.index('storageKey').openCursor(IDBKeyRange.only(storageKey));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) {\n setResult(out);\n return;\n }\n const record = cursor.value as FileRecord;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (out as any)[record.id] = {\n dataURL: record.dataURL,\n mimeType: record.mimeType,\n created: record.created,\n };\n cursor.continue();\n };\n req.onerror = () => fail(req.error);\n },\n {},\n );\n } catch (err) {\n console.warn('[whiteboard] readFiles failed:', err);\n return {};\n }\n}\n\nexport async function writeFiles(storageKey: string, files: BinaryFiles): Promise<void> {\n const entries = Object.entries(files);\n if (entries.length === 0) return;\n try {\n await withStore<void>(\n 'readwrite',\n (store, setResult, fail) => {\n let pending = entries.length;\n const finishOne = () => {\n pending -= 1;\n if (pending === 0) setResult(undefined);\n };\n\n const now = Date.now();\n for (const [id, f] of entries) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ff = f as any;\n const getReq = store.get(id);\n getReq.onsuccess = () => {\n if (getReq.result) {\n finishOne();\n return;\n }\n const rec: FileRecord = {\n id,\n storageKey,\n dataURL: ff.dataURL,\n mimeType: ff.mimeType,\n created: ff.created ?? now,\n savedAt: now,\n };\n const putReq = store.put(rec);\n putReq.onsuccess = finishOne;\n putReq.onerror = () => fail(putReq.error);\n };\n getReq.onerror = () => fail(getReq.error);\n };\n },\n undefined,\n );\n } catch (err) {\n console.warn('[whiteboard] writeFiles failed:', err);\n }\n}\n\nexport async function pruneFiles(\n storageKey: string,\n keepIds: ReadonlySet<string>,\n): Promise<void> {\n try {\n await withStore<void>(\n 'readwrite',\n (store, setResult, fail) => {\n const req = store.index('storageKey').openCursor(IDBKeyRange.only(storageKey));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) {\n setResult(undefined);\n return;\n }\n const record = cursor.value as FileRecord;\n if (keepIds.has(record.id)) {\n cursor.continue();\n return;\n }\n const deleteReq = cursor.delete();\n deleteReq.onsuccess = () => cursor.continue();\n deleteReq.onerror = () => fail(deleteReq.error);\n };\n req.onerror = () => fail(req.error);\n },\n undefined,\n );\n } catch (err) {\n console.warn('[whiteboard] pruneFiles failed:', err);\n }\n}\n\nexport async function clearAll(storageKey: string): Promise<void> {\n try {\n await withStore<void>(\n 'readwrite',\n (store, setResult, fail) => {\n const req = store.index('storageKey').openCursor(IDBKeyRange.only(storageKey));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) {\n setResult(undefined);\n return;\n }\n const deleteReq = cursor.delete();\n deleteReq.onsuccess = () => cursor.continue();\n deleteReq.onerror = () => fail(deleteReq.error);\n };\n req.onerror = () => fail(req.error);\n },\n undefined,\n );\n } catch (err) {\n console.warn('[whiteboard] clearAll failed:', err);\n }\n}\n","'use client';\n\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n ExcalidrawElement,\n BinaryFiles,\n ExcalidrawSceneSnapshot,\n SyncableAppState,\n} from './types';\nimport { pickSyncableAppState } from './serialize';\nimport {\n isStampElement,\n DEFAULT_STAMPS,\n findStampForCustomData,\n type StampType,\n} from './stamps/shared/registry';\nimport { ToolbarInjector } from './stamps/shared/ToolbarInjector';\nimport { useShortcuts } from './stamps/shared/useShortcuts';\nimport { useStampDoubleClick } from './stamps/shared/useStampDoubleClick';\nimport { useStampShortcutBlocker } from './stamps/shared/useStampShortcutBlocker';\nimport { useStampClickOutside } from './stamps/shared/useStampClickOutside';\nimport { restoreMissingStampFiles } from './stamps/shared/restoreStampFiles';\nimport type { StampHostHandle } from './stamps/shared/types';\nimport { readScene, writeScene } from './core/persistence/sceneStore';\nimport { readFiles, writeFiles, pruneFiles } from './core/persistence/fileStore';\nimport '@excalidraw/excalidraw/index.css';\nimport './stamps/shared/stamp.css';\n\nconst Excalidraw = lazy(() =>\n import('./ExcalidrawWithMenus').then((m) => ({ default: m.ExcalidrawWithMenus })),\n);\n\nconst ExcalidrawLoadingFallback = () => (\n <div className=\"flex h-full items-center justify-center text-sm text-gray-500\">\n Đang tải bảng…\n </div>\n);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nconst SYNC_THROTTLE_MS = 200;\n\n/** Element đang re-edit (double-click) — đủ tối thiểu để Host parse customData. */\ninterface EditingElement {\n id: string;\n customData: unknown;\n}\n\nexport interface WhiteboardProps {\n /**\n * Storage key cho persist client-side.\n * - Scene -> localStorage['whiteboard:scene:'+storageKey]\n * - Files raster -> IndexedDB 'whiteboard-files' index theo storageKey\n * - Default: 'default'\n * - Truyen `null` de tat persist (consumer drive state qua onApi).\n */\n storageKey?: string | null;\n\n /** View-only (Excalidraw viewModeEnabled). Default false. */\n readOnly?: boolean;\n\n /** Local edits -> consumer broadcast. Optional. */\n onSceneChange?: (snapshot: ExcalidrawSceneSnapshot) => void;\n onFilesChange?: (files: BinaryFiles, newFileIds: string[]) => void;\n\n /** Excalidraw imperative API. Consumer dung inject remote scene khi can. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onApi?: (api: any) => void;\n\n /** Excalidraw UI language. Defaults to 'vi-VN'. See @excalidraw/excalidraw locales. */\n langCode?: string;\n\n /**\n * Danh sách stamp đăng ký. Mỗi stamp khai báo phím tắt + toolbar button +\n * Host component (UI editing). Mặc định DEFAULT_STAMPS (geometry + latex).\n * Truyền `[...DEFAULT_STAMPS, customStamp]` để thêm stamp mới.\n */\n stamps?: ReadonlyArray<StampType>;\n}\n\nexport function Whiteboard({\n storageKey = 'default',\n readOnly = false,\n onSceneChange,\n onFilesChange,\n onApi,\n langCode = 'vi-VN',\n stamps = DEFAULT_STAMPS,\n}: WhiteboardProps) {\n const [api, setApi] = useState<ExApi | null>(null);\n const apiRef = useRef<ExApi | null>(null);\n const [isDarkTheme, setIsDarkTheme] = useState(false);\n const isDarkThemeRef = useRef(false);\n const knownFileIdsRef = useRef<Set<string>>(new Set());\n const lastSceneHashRef = useRef<string>('');\n const sceneThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const fileThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pruneThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestSceneRef = useRef<{\n elements: readonly ExcalidrawElement[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n appState: any;\n } | null>(null);\n const pendingFilesRef = useRef<BinaryFiles>({});\n const persistEnabled = typeof storageKey === 'string' && storageKey.length > 0;\n const persistKeyRef = useRef(storageKey);\n persistKeyRef.current = storageKey;\n\n const persistedInitial = useMemo(\n () => (persistEnabled ? readScene(storageKey as string) : null),\n [persistEnabled, storageKey],\n );\n const effectiveInitialScene: ExcalidrawSceneSnapshot | null = persistedInitial\n ? {\n elements: persistedInitial.elements,\n appState: persistedInitial.appState as SyncableAppState,\n }\n : null;\n\n // ---- Stamp state (registry-driven) ----\n const [activeStamp, setActiveStamp] = useState<string | null>(null);\n const activeStampRef = useRef(activeStamp);\n activeStampRef.current = activeStamp;\n const [editingElement, setEditingElement] = useState<EditingElement | null>(null);\n const hostRef = useRef<StampHostHandle | null>(null);\n\n const handledCropIdRef = useRef<string | null>(null);\n const prevExcalidrawToolRef = useRef<string>('selection');\n\n const stampByKind = useMemo(() => {\n const m = new Map<string, StampType>();\n for (const s of stamps) m.set(s.kind, s);\n return m;\n }, [stamps]);\n\n const activeStampDef = activeStamp ? stampByKind.get(activeStamp) ?? null : null;\n const HostComponent = activeStampDef?.Host ?? null;\n\n // ---- Open / close helpers ----\n const openStamp = useCallback(\n (kind: string, element: EditingElement | null = null) => {\n if (readOnly) return;\n if (!stampByKind.has(kind)) return;\n setEditingElement(element);\n setActiveStamp(kind);\n },\n [readOnly, stampByKind],\n );\n\n const closeStamp = useCallback(() => {\n setActiveStamp(null);\n setEditingElement(null);\n }, []);\n\n const toggleStampByKind = useCallback(\n (kind: string) => {\n if (activeStamp === kind) closeStamp();\n else openStamp(kind);\n },\n [activeStamp, openStamp, closeStamp],\n );\n\n // ---- Capture local changes ----\n const handleChange = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (elements: readonly ExcalidrawElement[], appState: any, files: BinaryFiles) => {\n // Sync theme từ Excalidraw appState -> React state.\n // Excalidraw 0.18 gọi onChange đồng bộ trong state-updater của họ\n // (React 19 / Next.js 16 sẽ warn: \"scheduled from inside an update\n // function\"). Bail-out qua ref + defer setState bằng queueMicrotask để\n // setState chạy SAU commit của Excalidraw, không nằm trong updater.\n const nextDark = appState?.theme === 'dark';\n if (isDarkThemeRef.current !== nextDark) {\n isDarkThemeRef.current = nextDark;\n queueMicrotask(() => setIsDarkTheme(nextDark));\n }\n\n if (readOnly) return;\n latestSceneRef.current = { elements, appState };\n\n // Intercept Excalidraw crop-image flow cho math stamps: khi user double-click\n // 1 stamp, Excalidraw set appState.croppingElementId. Ta dismiss crop mode +\n // mở Host editor tương ứng. handlePointerDown phát hiện double-click sớm\n // hơn — đây là fallback (đặc biệt khi click rơi vào selection handle).\n const cropId = appState?.croppingElementId as string | null | undefined;\n if (cropId && cropId !== handledCropIdRef.current && api) {\n const el = elements.find((e: ExcalidrawElement) => e.id === cropId);\n if (el) {\n const stamp = findStampForCustomData((el as { customData?: unknown }).customData, stamps);\n if (stamp) {\n handledCropIdRef.current = cropId;\n // Defer cả updateScene + openStamp ra khỏi commit-phase của\n // Excalidraw — nếu chạy đồng bộ, React 19 warn \"update scheduled\n // from inside an update function\" (handleChange chạy trong updater\n // của Excalidraw).\n const elId = el.id;\n const elCustom = (el as { customData?: unknown }).customData;\n const stampKind = stamp.kind;\n queueMicrotask(() => {\n try {\n api.updateScene({\n appState: { croppingElementId: null, selectedElementIds: {} },\n });\n } catch { /* ignore */ }\n openStamp(stampKind, { id: elId, customData: elCustom });\n });\n return;\n }\n }\n }\n if (!cropId) {\n handledCropIdRef.current = null;\n }\n\n const fileIds = Object.keys(files);\n const newIds = fileIds.filter((id) => !knownFileIdsRef.current.has(id));\n if (newIds.length > 0) {\n newIds.forEach((id) => knownFileIdsRef.current.add(id));\n onFilesChange?.(files, newIds);\n }\n\n if (!sceneThrottleRef.current) {\n sceneThrottleRef.current = setTimeout(async () => {\n sceneThrottleRef.current = null;\n const mod = await import('@excalidraw/excalidraw');\n const latestScene = latestSceneRef.current ?? { elements, appState };\n const liveElements = latestScene.elements.filter((e) => !e.isDeleted) as readonly ExcalidrawElement[];\n const liveAppState = pickSyncableAppState(latestScene.appState);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const elementHash = (mod as any).hashElementsVersion(liveElements);\n const sceneHash = `${elementHash}:${JSON.stringify(liveAppState)}`;\n if (sceneHash === lastSceneHashRef.current) return;\n lastSceneHashRef.current = sceneHash;\n onSceneChange?.({ elements: liveElements, appState: liveAppState });\n\n if (persistEnabled) {\n writeScene(storageKey as string, {\n elements: liveElements,\n appState: liveAppState,\n });\n }\n }, SYNC_THROTTLE_MS);\n }\n\n // File throttle (1s): lưu raster vào IDB, bỏ math-stamp files.\n if (persistEnabled && newIds.length > 0) {\n for (const id of newIds) {\n if (files[id]) pendingFilesRef.current[id] = files[id];\n }\n if (!fileThrottleRef.current) {\n fileThrottleRef.current = setTimeout(() => {\n fileThrottleRef.current = null;\n const pending = pendingFilesRef.current;\n pendingFilesRef.current = {};\n const currentElements = (api?.getSceneElements?.() ?? elements) as readonly ExcalidrawElement[];\n const stampIds = new Set<string>();\n for (const el of currentElements) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fid = (el as any).fileId as string | undefined;\n if (fid && isStampElement(el)) stampIds.add(fid);\n }\n const raster: BinaryFiles = {};\n for (const [id, f] of Object.entries(pending)) {\n if (!stampIds.has(id)) raster[id] = f;\n }\n if (Object.keys(raster).length > 0) {\n void writeFiles(persistKeyRef.current as string, raster);\n }\n }, 1000);\n }\n }\n\n // Prune throttle (2s): dọn orphan raster sau khi xoá element.\n if (persistEnabled && !pruneThrottleRef.current) {\n pruneThrottleRef.current = setTimeout(() => {\n pruneThrottleRef.current = null;\n const currentElements = (api?.getSceneElements?.() ?? elements) as readonly ExcalidrawElement[];\n const keep = new Set<string>();\n for (const el of currentElements) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fid = (el as any).fileId as string | undefined;\n if (fid && !isStampElement(el)) keep.add(fid);\n }\n void pruneFiles(persistKeyRef.current as string, keep);\n }, 2000);\n }\n },\n [readOnly, api, onSceneChange, onFilesChange, persistEnabled, storageKey, stamps, openStamp],\n );\n\n // ---- Mount: load persisted raster files từ IDB -> addFiles ----\n useEffect(() => {\n if (!api || !persistEnabled) return;\n let cancelled = false;\n void readFiles(storageKey as string).then((files) => {\n if (cancelled) return;\n const entries = Object.entries(files);\n if (entries.length === 0) return;\n try {\n api.addFiles(\n entries.map(([id, f]) => ({\n id,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dataURL: (f as any).dataURL,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mimeType: (f as any).mimeType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n created: (f as any).created ?? Date.now(),\n })),\n );\n entries.forEach(([id]) => knownFileIdsRef.current.add(id));\n } catch (err) {\n console.warn('[whiteboard] addFiles từ IDB thất bại:', err);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [api, persistEnabled, storageKey]);\n\n useEffect(() => {\n if (!api) return;\n let cancelled = false;\n const run = async () => {\n try {\n const elements = api.getSceneElements();\n if (!elements || elements.length === 0) return;\n if (cancelled) return;\n await restoreMissingStampFiles(api, elements, stamps);\n } catch (err) {\n console.warn('Math stamp restore pass failed:', err);\n }\n };\n run();\n const t = setTimeout(run, 400);\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [api, persistedInitial, stamps]);\n\n useEffect(\n () => () => {\n if (sceneThrottleRef.current) clearTimeout(sceneThrottleRef.current);\n if (fileThrottleRef.current) clearTimeout(fileThrottleRef.current);\n if (pruneThrottleRef.current) clearTimeout(pruneThrottleRef.current);\n },\n [],\n );\n\n // ---- Double-click detection for re-edit ----\n const handlePointerDown = useStampDoubleClick({\n enabled: !readOnly,\n stamps,\n onOpen: openStamp,\n });\n\n // ---- Keyboard shortcuts: đọc registry, mỗi stamp tự khai báo phím tắt ----\n useShortcuts({\n enabled: !readOnly,\n onToggle: toggleStampByKind,\n stamps,\n });\n\n // ---- Sync Excalidraw activeTool với activeStamp ----\n useEffect(() => {\n if (!api) return;\n if (activeStamp) {\n try {\n const cur = api.getAppState?.()?.activeTool?.type ?? 'selection';\n if (cur && cur !== 'hand') prevExcalidrawToolRef.current = cur;\n api.setActiveTool?.({ type: 'hand' });\n } catch { /* ignore */ }\n } else {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api.setActiveTool?.({ type: prevExcalidrawToolRef.current as any });\n } catch { /* ignore */ }\n }\n }, [activeStamp, api]);\n\n // ---- Block Excalidraw shortcuts khi stamp panel đang mở ----\n useStampShortcutBlocker({ activeStamp, stamps });\n\n // ---- Esc đóng panel (capture phase để chạy TRƯỚC Excalidraw) ----\n useEffect(() => {\n if (!activeStamp) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n const ae = document.activeElement as HTMLElement | null;\n if (ae && (ae.tagName === 'TEXTAREA' || ae.isContentEditable)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n closeStamp();\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [activeStamp, closeStamp]);\n\n useStampClickOutside({ activeStamp, hostRef, onClose: closeStamp });\n\n return (\n <div className={`relative h-full w-full${isDarkTheme ? ' theme--dark' : ''}`}>\n <Suspense fallback={<ExcalidrawLoadingFallback />}>\n <Excalidraw\n excalidrawAPI={(a: ExApi) => {\n // Excalidraw có thể gọi callback này đồng bộ trong commit-phase của\n // họ. Bail-out qua ref + defer setApi để tránh \"update scheduled\n // from inside an update function\" trên React 19 / Next.js 16.\n if (apiRef.current === a) return;\n apiRef.current = a;\n queueMicrotask(() => {\n setApi(a);\n onApi?.(a);\n });\n }}\n langCode={langCode}\n viewModeEnabled={readOnly}\n initialData={\n effectiveInitialScene\n ? {\n elements: effectiveInitialScene.elements,\n appState: {\n ...effectiveInitialScene.appState,\n gridSize: effectiveInitialScene.appState.gridSize ?? undefined,\n },\n }\n : { appState: { viewBackgroundColor: '#ffffff' } }\n }\n onChange={handleChange}\n onPointerDown={handlePointerDown}\n />\n </Suspense>\n\n <ToolbarInjector\n enabled={!readOnly}\n activeStampKind={activeStamp}\n onToggle={toggleStampByKind}\n stamps={stamps}\n />\n\n {HostComponent && (\n <HostComponent\n ref={hostRef}\n api={api}\n editingElement={editingElement}\n onClose={closeStamp}\n isDark={isDarkTheme}\n />\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/stamps/geometry-2d/renderInline.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-2d/serialize.ts","../src/stamps/shared/safeJsx.ts","../src/stamps/geometry-2d/render.ts","../src/stamps/geometry-2d/types.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/handlers.ts","../src/stamps/geometry-2d/editor/MiniBoard.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/geometry-2d/editor/LeftPanel.tsx","../src/stamps/shared/excalidrawPalette.ts","../src/stamps/shared/useIsMobile.ts","../src/stamps/geometry-2d/editor/PropertiesPopover.tsx","../src/stamps/geometry-2d/editor/TransformParamPopover.tsx","../src/stamps/geometry-2d/editor/EditorPanel.tsx","../src/stamps/shared/useChordShortcut.ts","../src/stamps/shared/svgToImage.ts","../src/stamps/shared/insertImage.ts","../src/stamps/geometry-2d/host.tsx","../src/stamps/latex/render.ts","../src/stamps/latex/types.ts","../src/stamps/latex/editor/LeftPanel.tsx","../src/stamps/latex/editor/EditorPopover.tsx","../src/stamps/latex/host.tsx","../src/stamps/geometry-3d/serialize.ts","../src/stamps/geometry-3d/editor/theme.ts","../src/stamps/geometry-3d/render.ts","../src/stamps/geometry-3d/editor/tools/handlers/_ensurePoint.ts","../src/stamps/geometry-3d/editor/tools/handlers/point.ts","../src/stamps/geometry-3d/editor/tools/handlers/segment.ts","../src/stamps/geometry-3d/editor/tools/handlers/polygon.ts","../src/stamps/geometry-3d/editor/scene/constraintMath.ts","../src/stamps/geometry-3d/editor/scene/geometryChecks.ts","../src/stamps/geometry-3d/editor/tools/handlers/plane.ts","../src/stamps/geometry-3d/editor/tools/handlers/pyramid.ts","../src/stamps/geometry-3d/editor/tools/handlers/prism.ts","../src/stamps/geometry-3d/editor/tools/handlers/tetrahedron.ts","../src/stamps/geometry-3d/editor/tools/handlers/cube.ts","../src/stamps/geometry-3d/editor/tools/handlers/sphere.ts","../src/stamps/geometry-3d/editor/tools/handlers/cylinder.ts","../src/stamps/geometry-3d/editor/tools/handlers/cone.ts","../src/stamps/geometry-3d/editor/tools/spec.ts","../src/stamps/geometry-3d/editor/tools/controller.ts","../src/stamps/geometry-3d/editor/renderer/faceted.ts","../src/stamps/geometry-3d/editor/renderer/JxgRenderer.ts","../src/stamps/geometry-3d/editor/hitTest/rayCast.ts","../src/stamps/geometry-3d/editor/hitTest/intersect.ts","../src/stamps/geometry-3d/editor/hitTest/snapping.ts","../src/stamps/geometry-3d/editor/hitTest/hitTest.ts","../src/stamps/geometry-3d/editor/MiniBoard3D.tsx","../src/stamps/geometry-3d/editor/StatusHint.tsx","../src/stamps/geometry-3d/editor/scene/labels.ts","../src/stamps/geometry-3d/editor/scene/Scene3D.ts","../src/stamps/geometry-3d/editor/scene/persistence.ts","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/stamps/geometry-3d/editor/toolPanel/ToolButton.tsx","../src/stamps/geometry-3d/editor/toolPanel/icons.tsx","../src/stamps/geometry-3d/editor/toolPanel/groups.ts","../src/stamps/geometry-3d/editor/toolPanel/ToolPalette.tsx","../src/stamps/geometry-3d/editor/algebraPanel/symbolic.ts","../src/stamps/geometry-3d/editor/algebraPanel/RowMenu.tsx","../src/stamps/geometry-3d/editor/algebraPanel/AlgebraRow.tsx","../src/stamps/geometry-3d/editor/algebraPanel/AlgebraList.tsx","../src/stamps/geometry-3d/editor/LeftPanel.tsx","../src/stamps/geometry-3d/host.tsx","../src/stamps/graph-2d/serialize.ts","../src/stamps/graph-2d/evaluator.ts","../src/stamps/graph-2d/parser.ts","../src/stamps/graph-2d/editor/handlers.ts","../src/stamps/graph-2d/renderObjects.ts","../src/stamps/graph-2d/render.ts","../src/stamps/graph-2d/types.ts","../src/stamps/graph-2d/editor/tools.ts","../src/stamps/graph-2d/editor/FunctionRow.tsx","../src/stamps/graph-2d/editor/SliderRow.tsx","../src/stamps/graph-2d/colors.ts","../src/stamps/graph-2d/editor/AlgebraView.tsx","../src/stamps/graph-2d/editor/LeftPanel.tsx","../src/stamps/graph-2d/editor/theme.ts","../src/stamps/graph-2d/editor/MiniBoard.tsx","../src/stamps/graph-2d/editor/EditorPanel.tsx","../src/stamps/graph-2d/host.tsx","../src/ExcalidrawWithMenus.tsx","../src/serialize.ts","../src/stamps/geometry-2d/index.tsx","../src/stamps/latex/index.tsx","../src/stamps/geometry-3d/index.tsx","../src/stamps/graph-2d/index.tsx","../src/stamps/shared/registry.ts","../src/stamps/shared/ToolbarInjector.tsx","../src/stamps/shared/useShortcuts.ts","../src/pdf/PdfImporterButton.tsx","../src/pdf/parseRange.ts","../src/pdf/rasterize.ts","../src/pdf/PageRangeDialog.tsx","../src/pdf/insertPdfPages.ts","../src/stamps/shared/useStampDoubleClick.ts","../src/stamps/shared/useStampShortcutBlocker.ts","../src/stamps/shared/useStampClickOutside.ts","../src/stamps/shared/restoreStampFiles.ts","../src/core/persistence/validation.ts","../src/core/persistence/sceneStore.ts","../src/core/persistence/fileStore.ts","../src/Whiteboard.tsx"],"names":["jsx","jsxs","hits","name","pick","sc","useRef","useId","useState","useCallback","useEffect","obj","cross","Fragment","useMemo","createPortal","useLayoutEffect","rect","w","left","top","forwardRef","GeometryEditorPanel","useImperativeHandle","A_CODE","GeometryStampHost","init_render","init_types","Shell","Section","LeftPanel","init_LeftPanel","EditorPopover","host_exports","init_host","LatexStampHost","init_serialize","paletteFor","init_theme","TOOLS","norm","dot","sub","add","scale","EPS","React7","MiniBoard3D","p","color","visible","init_EditorPanel","React8","EditorPanel","handleMove","letterForGroup","GROUP_ORDER","GROUP_LABELS","React9","React10","AxisIcon","GridIcon","UndoIcon","RedoIcon","CloseIcon","useToolHoverTooltip","React11","TOOLTIP_DELAY_MS","Geometry3DStampHost","ALLOWED_FUNCTIONS","init_handlers","init_tools","scanRoots","init_MiniBoard","GraphEditorPanel","Graph2DStampHost","Excalidraw","MainMenu","Footer","WelcomeScreen","lazy","POPOVER_SELECTOR","PREFIX","Suspense"],"mappings":"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","file":"index.js","sourcesContent":["export function renderGeometryToSvg(boardContainer: HTMLElement): string {\n const svgEl = boardContainer.querySelector('svg');\n if (!svgEl) throw new Error('renderGeometryToSvg: no SVG found in board container');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n return new XMLSerializer().serializeToString(clone);\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Creation log của JSXGraphMiniBoard lưu attrs dưới dạng \"sentinel\" string\n// (`@stroke`, `@axis`, `@grid`, `@label`) thay vì màu cụ thể. Khi:\n// 1. Editor render real-time → resolve theo `isDark` của editor.\n// 2. Offscreen re-render (sau reload / sau khi switch theme) → resolve theo\n// `isDark` của canvas Excalidraw hiện tại.\n//\n// Nhờ vậy stamp tự đổi màu khi user switch dark/light, giống các nét vẽ\n// native của Excalidraw.\n\nexport const themeStroke = (dark: boolean) => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean) => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean) => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean) => (dark ? '#e2e8f0' : '#000000');\n\nexport interface GeomPalette {\n stroke: string;\n axis: string;\n grid: string;\n label: string;\n}\n\nexport function paletteFor(isDark: boolean): GeomPalette {\n return {\n stroke: themeStroke(isDark),\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n };\n}\n\nconst SENTINEL_MAP: Record<string, keyof GeomPalette> = {\n '@stroke': 'stroke',\n '@axis': 'axis',\n '@grid': 'grid',\n '@label': 'label',\n};\n\n/**\n * Walk attrs object/array/string và thay sentinel bằng màu thực từ palette.\n * Đệ quy để hỗ trợ nested attrs (ví dụ polygon's `borders.strokeColor`).\n * Trả về object mới — input giữ nguyên (immutable, an toàn cho log).\n */\nexport function resolveAttrColors<T>(attrs: T, palette: GeomPalette): T {\n if (typeof attrs === 'string') {\n const key = SENTINEL_MAP[attrs];\n return (key ? palette[key] : attrs) as T;\n }\n if (Array.isArray(attrs)) {\n return attrs.map((a) => resolveAttrColors(a, palette)) as unknown as T;\n }\n if (attrs && typeof attrs === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(attrs as Record<string, unknown>)) {\n out[k] = resolveAttrColors(v, palette);\n }\n return out as T;\n }\n return attrs;\n}\n","// JSXGraph không có built-in getJSON. Component giữ MỘT LOG riêng của các create() call\n// do user trigger, pass log đó vào serializeBoard. Replay = gọi board.create() theo thứ tự log.\n//\n// type === 'transform': args là [refs đến điểm/đường/scalar], attrs là { type: 'translate'|'rotate'|'reflect'|'scale', ... }.\n// Object trả về (kết quả board.create('transform', ...)) được đăng ký vào idMap như mọi element khác\n// để point/line phụ thuộc reference được bằng id ('j5' → JSXGraph transform object).\n//\n// Log lưu màu dưới dạng sentinel ('@stroke', '@axis', '@grid', '@label') để\n// theme-neutral. Khi replay, palette resolve thành màu thực theo `isDark` hiện\n// tại (truyền qua options.palette).\n\nimport { paletteFor, resolveAttrColors, type GeomPalette } from './editor/theme';\n\nexport interface SerializedElement {\n type: string;\n args: unknown[];\n attrs: Record<string, unknown>;\n id: string;\n}\n\nexport interface SerializedBoard {\n bbox: [number, number, number, number];\n elements: SerializedElement[];\n showAxis?: boolean;\n showGrid?: boolean;\n}\n\ninterface BoardLike {\n getBoundingBox(): [number, number, number, number];\n create(type: string, args: unknown[], attrs: Record<string, unknown>): unknown;\n}\n\nexport function serializeBoard(\n board: BoardLike,\n log: SerializedElement[],\n options: { showAxis?: boolean; showGrid?: boolean } = {},\n): SerializedBoard {\n return {\n bbox: board.getBoundingBox(),\n elements: log.map(e => ({ type: e.type, args: e.args, attrs: e.attrs, id: e.id })),\n showAxis: !!options.showAxis,\n showGrid: !!options.showGrid,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction createValueLabel(board: any, target: any): unknown {\n if (!board || !target) return null;\n const e = (target.elType ?? target.type ?? '').toString().toLowerCase();\n if (e === 'segment' || e === 'line' || e === 'arrow') {\n const p1 = target.point1, p2 = target.point2;\n if (!p1 || !p2) return null;\n return board.create('text', [\n () => (p1.X() + p2.X()) / 2 + 0.15,\n () => (p1.Y() + p2.Y()) / 2 + 0.25,\n () => {\n const len = Math.hypot(p2.X() - p1.X(), p2.Y() - p1.Y());\n const name = typeof target.name === 'string' && target.name ? target.name : 'd';\n return `${name} = ${len.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n if (e === 'circle' || e === 'circumcircle') {\n const center = target.center ?? target.midpoint ?? target.point1;\n if (!center) return null;\n return board.create('text', [\n () => center.X() + 0.3,\n () => center.Y() + 0.3,\n () => {\n const r = typeof target.Radius === 'function' ? target.Radius() : 0;\n const name = typeof target.name === 'string' && target.name ? target.name : 'r';\n return `${name} = ${r.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n return null;\n}\n\nexport interface DeserializeOptions {\n /** Theme-aware palette để resolve sentinel attrs. Mặc định = light. */\n palette?: GeomPalette;\n}\n\nexport function deserializeIntoBoard(\n board: BoardLike,\n serialized: SerializedBoard,\n options: DeserializeOptions = {},\n): void {\n // Replay: args may contain references to earlier elements by our serialized id (\"j0\", \"j1\"…).\n // We resolve those to actual JSXGraph objects via a local id→object map. Nested\n // arrays are also resolved recursively — needed for dilate, which logs the\n // transform parent of a transformed point as [\"j2\",\"j3\",\"j4\"] (a chain of 3\n // transforms passed to `board.create('point', [src, [t1,t2,t3]])`).\n const palette = options.palette ?? paletteFor(false);\n const idMap = new Map<string, unknown>();\n // \"<polyId>:border:<i>\" → polygon.borders[i]. Polygon borders are auto-created\n // sub-segments of a (regular)polygon that user-driven tools can reference as\n // line slots (vd. perpendicular từ điểm tới cạnh đa giác).\n const resolve = (a: unknown): unknown => {\n if (typeof a === 'string') {\n if (idMap.has(a)) return idMap.get(a);\n const m = /^(.+):border:(\\d+)$/.exec(a);\n if (m) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const poly = idMap.get(m[1]) as any;\n const idx = parseInt(m[2], 10);\n if (poly && Array.isArray(poly.borders) && poly.borders[idx]) {\n return poly.borders[idx];\n }\n }\n }\n if (Array.isArray(a)) return a.map(resolve);\n return a;\n };\n for (const el of serialized.elements) {\n const resolvedArgs = el.args.map(resolve);\n if (el.type === 'valueLabel') {\n const target = resolvedArgs[0];\n const txt = createValueLabel(board, target);\n if (txt) idMap.set(el.id, txt);\n continue;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, palette);\n const created = board.create(el.type, resolvedArgs, themedAttrs);\n idMap.set(el.id, created);\n }\n}\n","const isDev = (() => {\n try {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n } catch {\n return false;\n }\n})();\n\n/**\n * Wrap JSXGraph operations that can throw on stale/missing state.\n * In dev mode: log to console. In prod: silent swallow + return fallback.\n *\n * @param label Short tag for grep-ability (vd \"removeObject\", \"board.update\").\n * @param fn Operation to execute.\n * @param fallback Value to return if fn throws (default: undefined).\n */\nexport function safeJsx<T>(label: string, fn: () => T): T | undefined;\nexport function safeJsx<T>(label: string, fn: () => T, fallback: T): T;\nexport function safeJsx<T>(label: string, fn: () => T, fallback?: T): T | undefined {\n try {\n return fn();\n } catch (err) {\n if (isDev) {\n // eslint-disable-next-line no-console\n console.warn('[whiteboard:jsxgraph]', label, err);\n }\n return fallback;\n }\n}\n","import { renderGeometryToSvg } from './renderInline';\nimport { deserializeIntoBoard, type SerializedBoard } from './serialize';\nimport { paletteFor } from './editor/theme';\nimport { safeJsx } from '../shared/safeJsx';\n\n/**\n * Re-render geometry SVG từ jsonState đã serialize. Dùng cho:\n * 1. Restore math-stamp file sau khi reload page (Excalidraw mất binary files).\n * 2. Generate SVG lúc INSERT (thay vì clone DOM với màu theo theme editor).\n *\n * LƯU Ý quan trọng — luôn dùng LIGHT palette (nét đậm). Excalidraw apply CSS\n * `filter: invert(93%) hue-rotate(180deg)` lên canvas trong dark mode → nét\n * đậm tự đảo thành sáng. Nếu ta bake nét sáng vào SVG cho dark mode, filter\n * sẽ đảo thành đậm → chìm vào nền tối. Giải pháp: luôn dùng nét đậm + để\n * Excalidraw tự lo invert.\n *\n * Implementation: tạo 1 div ẩn (off-screen, real dimensions để JSXGraph render\n * chuẩn), initBoard, replay creation log từ jsonState, dump SVG, dọn dẹp.\n *\n * Container dimensions phải MATCH aspect ratio của bbox (đã được editor lưu\n * sau khi JSXGraph adjust với keepAspectRatio:true). Trước đây hardcode\n * 400×300 + keepAspectRatio:false làm shape bị kéo dãn (circle thành ellipse,\n * góc vuông lệch) khi bbox không 4:3 → ảnh hiển thị khác với editor lúc\n * double-click. Fix: tính container W/H từ bbox + keepAspectRatio:true để\n * SVG output khớp với view trong editor.\n *\n * Lý do JXG.Options.text.display = 'internal': JSXGraph mặc định render\n * label bằng HTML <div> overlay → clone SVG export sẽ thiếu label.\n */\n\nconst PIXELS_PER_UNIT = 20;\nconst MIN_DIM = 100;\nconst MAX_DIM = 1200;\nconst FALLBACK_W = 400;\nconst FALLBACK_H = 300;\n\nexport function containerDimsForBbox(bbox: [number, number, number, number]): { width: number; height: number } {\n const [xmin, ymax, xmax, ymin] = bbox;\n const w = Math.abs(xmax - xmin);\n const h = Math.abs(ymax - ymin);\n if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) {\n return { width: FALLBACK_W, height: FALLBACK_H };\n }\n let width = w * PIXELS_PER_UNIT;\n let height = h * PIXELS_PER_UNIT;\n const maxAxis = Math.max(width, height);\n if (maxAxis > MAX_DIM) {\n const ratio = MAX_DIM / maxAxis;\n width *= ratio;\n height *= ratio;\n }\n const minAxis = Math.min(width, height);\n if (minAxis < MIN_DIM) {\n const ratio = MIN_DIM / minAxis;\n width *= ratio;\n height *= ratio;\n }\n return { width: Math.round(width), height: Math.round(height) };\n}\n\nexport async function renderGeometrySvgFromState(jsonState: string): Promise<string> {\n const parsed = JSON.parse(jsonState) as SerializedBoard;\n // Stamps inserted vào Excalidraw canvas → luôn dùng light palette.\n // Excalidraw's THEME_FILTER tự đảo nét trong dark mode.\n const palette = paletteFor(false);\n const JXG = (await import('jsxgraph')).default;\n safeJsx('render.applyOptions', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.text.strokeColor = palette.label;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n opts.label.strokeColor = palette.label;\n opts.axis = opts.axis || {};\n opts.axis.strokeColor = palette.axis;\n opts.grid = opts.grid || {};\n opts.grid.strokeColor = palette.grid;\n }\n });\n const { width, height } = containerDimsForBbox(parsed.bbox);\n const container = document.createElement('div');\n const containerId = 'jxg_offscreen_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\n container.id = containerId;\n container.style.cssText = `position:absolute;top:-99999px;left:-99999px;width:${width}px;height:${height}px;visibility:hidden;pointer-events:none;`;\n document.body.appendChild(container);\n let board: unknown = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board = (JXG as any).JSXGraph.initBoard(containerId, {\n boundingbox: parsed.bbox,\n axis: !!parsed.showAxis,\n grid: !!parsed.showGrid,\n showCopyright: false,\n showNavigation: false,\n keepAspectRatio: true,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n deserializeIntoBoard(board as any, parsed, { palette });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (board as any).update();\n return renderGeometryToSvg(container);\n } finally {\n safeJsx('render.freeBoard', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (board) (JXG as any).JSXGraph.freeBoard(board);\n });\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface GeometryCustomData extends BaseStampCustomData {\n kind: 'geometry';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGeometryCustomData(data: unknown): data is GeometryCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<GeometryCustomData>;\n return d.kind === 'geometry' && d.version === 1 && typeof d.jsonState === 'string';\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type JxgObj = any;\n\nexport type DefKind = 'point' | 'segment' | 'line' | 'ray' | 'arrow' | 'circleCenter' | 'circle3';\n\nexport interface DefiningPointsResult {\n kind: DefKind;\n points: JxgObj[];\n attrs: Record<string, unknown>;\n}\n\nconst LINE_LIKE = new Set(['line', 'segment', 'arrow']);\n\nfunction copyVisAttrs(obj: JxgObj): Record<string, unknown> {\n const v = obj?.visProp ?? {};\n const pick = (k: string) => v?.[k];\n const out: Record<string, unknown> = {};\n const mapping: Array<[string, string]> = [\n ['strokecolor', 'strokeColor'],\n ['strokewidth', 'strokeWidth'],\n ['strokeopacity', 'strokeOpacity'],\n ['dash', 'dash'],\n ['fillcolor', 'fillColor'],\n ['fillopacity', 'fillOpacity'],\n ];\n for (const [from, to] of mapping) {\n const val = pick(from);\n if (val !== undefined) out[to] = val;\n }\n return out;\n}\n\nexport function getDefiningPoints(obj: JxgObj): DefiningPointsResult | null {\n if (!obj) return null;\n const e = (obj.elType ?? obj.type ?? '').toString().toLowerCase();\n if (e === 'point' || e === 'glider' || e === 'midpoint') {\n return { kind: 'point', points: [obj], attrs: copyVisAttrs(obj) };\n }\n if (LINE_LIKE.has(e) && obj.point1 && obj.point2) {\n const kind: DefKind = e === 'segment' ? 'segment' : e === 'arrow' ? 'arrow' : 'line';\n return { kind, points: [obj.point1, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circle' && obj.center && obj.point2) {\n return { kind: 'circleCenter', points: [obj.center, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circumcircle' && obj.point1 && obj.point2 && obj.point3) {\n return {\n kind: 'circle3',\n points: [obj.point1, obj.point2, obj.point3],\n attrs: copyVisAttrs(obj),\n };\n }\n return null;\n}\n\nexport type TransformInput =\n | { kind: 'translate'; vectorPoints: [JxgObj, JxgObj] }\n | { kind: 'rotate'; center: JxgObj; angleDeg: number }\n | { kind: 'reflectLine'; line: JxgObj }\n | { kind: 'reflectPoint'; center: JxgObj }\n | { kind: 'dilate'; center: JxgObj; k: number };\n\nexport interface TransformSpec {\n params: unknown[];\n attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' };\n /**\n * Khi `chain` được set, finalizeTransformCreate dựng từng transform trong chain\n * (theo thứ tự) rồi pass mảng vào `board.create('point', [src, [t1, t2, t3]])`.\n * Dùng cho `dilate` (scale-quanh-điểm) vì JSXGraph 'scale' không nhận center.\n */\n chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }>;\n}\n\nexport function buildTransformSpec(input: TransformInput): TransformSpec {\n switch (input.kind) {\n case 'translate': {\n // Literal dx/dy (không phải callback) để serialize qua JSON.stringify được.\n // Trade-off: transformed object không cập nhật khi user kéo điểm vector — chấp nhận.\n const [a, b] = input.vectorPoints;\n const dx = b.X() - a.X();\n const dy = b.Y() - a.Y();\n return { params: [dx, dy], attrs: { type: 'translate' } };\n }\n case 'rotate':\n return {\n params: [(input.angleDeg * Math.PI) / 180, input.center],\n attrs: { type: 'rotate' },\n };\n case 'reflectLine':\n return { params: [input.line], attrs: { type: 'reflect' } };\n case 'reflectPoint':\n // JSXGraph 'scale' chỉ nhận 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 bị lờ → trước đây sai. Đối xứng qua điểm = quay 180°\n // quanh điểm đó. Dùng 'rotate' (params [angle, center]) để chuẩn.\n return { params: [Math.PI, input.center], attrs: { type: 'rotate' } };\n case 'dilate':\n // JSXGraph 'scale' chỉ nhận đúng 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 làm constructor throw. Dilate quanh điểm c bằng tỷ số k\n // = compose 3 phép: T(-c) → S(k,k) → T(+c). Sinh ra chain (mảng spec) thay vì\n // 1 spec đơn; consumer (finalizeTransformCreate) tự nhận biết.\n return {\n params: [],\n attrs: { type: 'scale' },\n chain: [\n { params: [-input.center.X(), -input.center.Y()], attrs: { type: 'translate' as const } },\n { params: [input.k, input.k], attrs: { type: 'scale' as const } },\n { params: [input.center.X(), input.center.Y()], attrs: { type: 'translate' as const } },\n ],\n };\n }\n}\n","import React from 'react';\n\n/**\n * Static catalog của tất cả GeomTool — không phụ thuộc board state, chỉ là\n * metadata (key, label, hint, icon SVG, group, số click cần, accept types).\n *\n * Tách khỏi JSXGraphMiniBoard.tsx để (1) giảm size file component và (2) dễ\n * mở rộng tool mới mà không cần đụng vào board logic.\n */\n\n// Tool keys — match GeoGebra-style toolset\nexport type GeomTool =\n | 'move'\n | 'select'\n | 'point'\n | 'midpoint'\n | 'segment'\n | 'line'\n | 'ray'\n | 'vector'\n | 'perpendicular'\n | 'parallel'\n | 'perpBisector'\n | 'angleBisector'\n | 'polygon'\n | 'regularPolygon'\n | 'circleCenter'\n | 'circle3'\n | 'tangent'\n | 'angle'\n | 'distance'\n | 'area'\n | 'toggleLabel'\n | 'toggleVisible'\n | 'delete'\n | 'translate'\n | 'rotate'\n | 'reflectLine'\n | 'reflectPoint'\n | 'dilate';\n\nexport interface ToolDef {\n key: GeomTool;\n label: string;\n hint: string;\n icon: React.ReactNode;\n group:\n | 'move'\n | 'point'\n | 'line'\n | 'construct'\n | 'polygon'\n | 'circle'\n | 'measure'\n | 'edit'\n | 'transform';\n /** Số click cần trước khi action fire. -1 = mở (polygon đóng bằng click lại điểm đầu). */\n needs: number;\n /** Loại object accept ở mỗi slot. 'any' = point hoặc non-point. */\n accepts?: Array<'point' | 'line' | 'circle' | 'any'>;\n}\n\n// ============== Tool icons — inline SVG ==============\nconst Icon = {\n cursor: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\"/></svg>\n ),\n select: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\" fill=\"none\"/><rect x=\"2.5\" y=\"2.5\" width=\"19\" height=\"19\" strokeDasharray=\"3 2\" fill=\"none\"/></svg>\n ),\n point: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\"/></svg>\n ),\n midpoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"20\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/></svg>\n ),\n segment: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\"/><circle cx=\"5\" cy=\"18\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"6\" r=\"1.7\" fill=\"currentColor\"/></svg>\n ),\n line: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"4\"/><circle cx=\"8\" cy=\"16\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"16\" cy=\"8\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n ray: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"19\" x2=\"22\" y2=\"2\"/><circle cx=\"5\" cy=\"19\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n vector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><polyline points=\"14,4 20,4 20,10\"/></svg>\n ),\n perpendicular: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"4\"/><rect x=\"12\" y=\"14\" width=\"4\" height=\"4\" fill=\"none\"/></svg>\n ),\n parallel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"5\"/><line x1=\"3\" y1=\"19\" x2=\"21\" y2=\"15\"/></svg>\n ),\n perpBisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><circle cx=\"6\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"18\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n bisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"12\" strokeDasharray=\"3 2\"/></svg>\n ),\n polygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"6,6 18,6 22,14 12,22 4,14\"/></svg>\n ),\n regularPolygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"12,3 20,8 20,17 12,22 4,17 4,8\"/></svg>\n ),\n circleCenter: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n circle3: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"4\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"20\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"16\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n tangent: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"11\" cy=\"13\" r=\"6\"/><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"2\"/></svg>\n ),\n angle: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"6\"/><path d=\"M14 20 A 10 10 0 0 0 11 13\" /></svg>\n ),\n distance: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"8\" x2=\"4\" y2=\"16\"/><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"16\"/></svg>\n ),\n area: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><polygon points=\"5,6 19,6 21,14 13,21 3,15\" fill=\"currentColor\" fillOpacity=\"0.2\"/></svg>\n ),\n toggleLabel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><text x=\"3\" y=\"18\" fontSize=\"16\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text><text x=\"13\" y=\"14\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text></svg>\n ),\n toggleVisible: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3.5\" fill=\"currentColor\" fillOpacity=\"0.4\"/><circle cx=\"12\" cy=\"12\" r=\"3.5\"/><circle cx=\"20\" cy=\"6\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\"/><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/></svg>\n ),\n translate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 4 L20 20\"/><polygon points=\"14,4 20,4 20,10\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n rotate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 12 A8 8 0 1 1 12 20\"/><polyline points=\"4,9 4,13 8,13\"/></svg>\n ),\n reflectLine: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><polygon points=\"4,6 9,12 4,18\" fill=\"currentColor\"/><polygon points=\"20,6 15,12 20,18\" fill=\"currentColor\"/></svg>\n ),\n reflectPoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"19\" r=\"1.6\" fill=\"currentColor\"/><line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" strokeDasharray=\"2 2\"/></svg>\n ),\n dilate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><polygon points=\"6,18 18,18 12,6\" fillOpacity=\"0.1\" fill=\"currentColor\"/><polygon points=\"9,15 15,15 12,11\" fill=\"currentColor\"/></svg>\n ),\n};\n\n// ============== Tool catalog ==============\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Kéo điểm hoặc xoay nền', icon: Icon.cursor, group: 'move', needs: 0 },\n { key: 'select', label: 'Chọn', hint: 'Click để chọn 1 / Shift+click để bỏ thêm / Kéo nền để khoanh vùng / DEL để xoá', icon: Icon.select, group: 'move', needs: 0 },\n { key: 'point', label: 'Điểm mới', hint: 'Click để thêm điểm', icon: Icon.point, group: 'point', needs: 1 },\n { key: 'midpoint', label: 'Trung điểm', hint: 'Click 2 điểm có sẵn', icon: Icon.midpoint, group: 'point', needs: 2, accepts: ['point', 'point'] },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Click 2 điểm', icon: Icon.segment, group: 'line', needs: 2 },\n { key: 'line', label: 'Đường thẳng qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.line, group: 'line', needs: 2 },\n { key: 'ray', label: 'Tia qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.ray, group: 'line', needs: 2 },\n { key: 'vector', label: 'Vector', hint: 'Click 2 điểm', icon: Icon.vector, group: 'line', needs: 2 },\n { key: 'perpendicular', label: 'Đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpendicular, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'parallel', label: 'Đường song song', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.parallel, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'perpBisector', label: 'Đường trung trực', hint: 'Click 2 điểm có sẵn', icon: Icon.perpBisector, group: 'construct', needs: 2, accepts: ['point', 'point'] },\n { key: 'angleBisector', label: 'Đường phân giác', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.bisector, group: 'construct', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'polygon', label: 'Đa giác', hint: 'Click các điểm, click lại điểm đầu để đóng', icon: Icon.polygon, group: 'polygon', needs: -1 },\n { key: 'regularPolygon', label: 'Đa giác đều', hint: 'Click 2 điểm rồi nhập số cạnh', icon: Icon.regularPolygon, group: 'polygon', needs: 2, accepts: ['point', 'point'] },\n { key: 'circleCenter', label: 'Đường tròn (tâm + điểm)', hint: 'Click tâm rồi 1 điểm trên đường tròn', icon: Icon.circleCenter, group: 'circle', needs: 2 },\n { key: 'circle3', label: 'Đường tròn qua 3 điểm', hint: 'Click 3 điểm', icon: Icon.circle3, group: 'circle', needs: 3 },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Click 1 điểm + 1 đường tròn có sẵn', icon: Icon.tangent, group: 'circle', needs: 2, accepts: ['point', 'circle'] },\n { key: 'angle', label: 'Góc', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.angle, group: 'measure', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'distance', label: 'Khoảng cách', hint: 'Click 2 điểm có sẵn', icon: Icon.distance, group: 'measure', needs: 2, accepts: ['point', 'point'] },\n { key: 'area', label: 'Diện tích', hint: 'Click các đỉnh, click lại điểm đầu để đóng', icon: Icon.area, group: 'measure', needs: -1 },\n { key: 'toggleLabel', label: 'Hiện/ẩn tên', hint: 'Click vào đối tượng', icon: Icon.toggleLabel, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'toggleVisible', label: 'Hiện/ẩn đối tượng', hint: 'Click vào đối tượng', icon: Icon.toggleVisible, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'delete', label: 'Xoá', hint: 'Click vào đối tượng', icon: Icon.trash, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'translate', label: 'Phép tịnh tiến', hint: 'Click object → 2 điểm tạo vector', icon: Icon.translate, group: 'transform', needs: 3, accepts: ['any', 'point', 'point'] },\n { key: 'rotate', label: 'Quay đối tượng', hint: 'Click object → tâm quay → nhập góc', icon: Icon.rotate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'reflectLine', label: 'Đối xứng qua đường thẳng', hint: 'Click object → đường thẳng', icon: Icon.reflectLine, group: 'transform', needs: 2, accepts: ['any', 'line'] },\n { key: 'reflectPoint', label: 'Đối xứng qua điểm', hint: 'Click object → tâm đối xứng', icon: Icon.reflectPoint, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'dilate', label: 'Phép vị tự', hint: 'Click object → tâm → nhập tỷ số k', icon: Icon.dilate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n];\n\nexport const GROUP_LABELS: Record<ToolDef['group'], string> = {\n move: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường',\n construct: 'Dựng hình',\n polygon: 'Đa giác',\n circle: 'Đường tròn',\n measure: 'Đo lường',\n edit: 'Chỉnh sửa',\n transform: 'Phép biến hình',\n};\n\nexport type GeomGroup = ToolDef['group'];\n\n// Positional A..I — letter shortcut cho chord 2-phím.\n// Khớp đúng thứ tự hiển thị trong LeftPanel (derive từ TOOLS phía trên).\nexport const GROUP_ORDER: GeomGroup[] = [\n 'move',\n 'point',\n 'line',\n 'construct',\n 'polygon',\n 'circle',\n 'measure',\n 'edit',\n 'transform',\n];\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: GeomGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n\nexport function groupForLetter(ch: string): GeomGroup | null {\n if (ch.length !== 1) return null;\n const upper = ch.toUpperCase();\n const idx = upper.charCodeAt(0) - A_CODE;\n if (idx < 0 || idx >= GROUP_ORDER.length) return null;\n return GROUP_ORDER[idx];\n}\n\n// ============== Object-type matching ==============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\n/** Phân loại JSXGraph element type vào nhóm dùng cho accept-matching.\n *\n * Ưu tiên `elementClass` (numeric constant do JSXGraph set đúng cho mọi derived\n * element — intersection, reflection, glider, parallelpoint, mirrorpoint, ...\n * đều trả về OBJECT_CLASS_POINT). Nếu không có (test mocks), fallback sang\n * `elType` string với danh sách mở rộng các kiểu thường gặp.\n *\n * Constants từ JSXGraph: OBJECT_CLASS_POINT=1, OBJECT_CLASS_LINE=2, OBJECT_CLASS_CIRCLE=3.\n */\nexport function objKind(obj: JxgObj): 'point' | 'line' | 'circle' | 'other' {\n if (!obj) return 'other';\n const ec = typeof obj.elementClass === 'number' ? obj.elementClass : null;\n if (ec === 1) return 'point';\n if (ec === 2) return 'line';\n if (ec === 3) return 'circle';\n const e = (obj.elType || obj.type || '').toString().toLowerCase();\n if (\n e === 'point' || e === 'glider' || e === 'midpoint' ||\n e === 'intersection' || e === 'otherintersection' ||\n e === 'reflection' || e === 'mirrorpoint' || e === 'mirrorelement' ||\n e === 'orthogonalprojection' || e === 'parallelpoint'\n ) return 'point';\n if (\n e === 'line' || e === 'segment' || e === 'arrow' || e === 'axis' ||\n e === 'normal' || e === 'parallel' || e === 'perpendicular' ||\n e === 'tangent' || e === 'bisector' || e === 'perpendicularsegment'\n ) return 'line';\n if (e === 'circle' || e === 'circumcircle') return 'circle';\n return 'other';\n}\n\nexport function acceptMatches(\n tool: ToolDef,\n slot: number,\n kind: 'point' | 'line' | 'circle' | 'other',\n): boolean {\n if (!tool.accepts) return kind === 'point' || tool.key === 'point';\n const a = tool.accepts[slot];\n if (!a) return false;\n if (a === 'any') return kind !== 'other';\n return a === kind;\n}\n","/**\n * handlers.ts — Pure pointer/tool handler functions extracted from MiniBoard.tsx.\n *\n * Each function receives a HandlerCtx object containing the refs and callbacks\n * it needs, and a raw JSXGraph event object. No React, no DOM manipulation\n * beyond what JSXGraph provides through its API.\n *\n * The ctx pattern lets MiniBoard.tsx pass a stable object reference captured\n * at useEffect time, while the individual properties stay up-to-date because\n * they are refs (whose .current is read at call time) or stable callbacks\n * (whose identities don't change across renders).\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nimport { TOOLS, objKind, type GeomTool, type ToolDef } from './tools';\nimport { buildTransformSpec } from './transforms';\nimport { safeJsx } from '../../shared/safeJsx';\n\n// ─── Context shape ────────────────────────────────────────────────────────────\n\nexport interface HandlerCtx {\n // Refs (read .current at call time)\n boardRef: { current: JxgObj };\n toolRef: { current: GeomTool };\n pendingRef: { current: JxgObj[] };\n previewSegRef: { current: JxgObj[] };\n axisObjsRef: { current: { x?: JxgObj; y?: JxgObj } };\n selectedSetRef: { current: Set<JxgObj> };\n marqueeRef: { current: { startSx: number; startSy: number; rect?: JxgObj } | null };\n moveDownRef: { current: { sx: number; sy: number } | null };\n lastMoveClickRef: { current: { obj: JxgObj | null; time: number } };\n pendingTransformRef: { current: { tool: 'rotate' | 'dilate' | 'regularPolygon'; source: JxgObj; center: JxgObj; anchorScreen: { x: number; y: number } } | null };\n phantomRef: { current: JxgObj };\n previewShapeRef: { current: JxgObj };\n previewRafRef: { current: number | null };\n jxgRef: { current: JxgObj };\n\n // Stable callbacks (identity doesn't change)\n screenCoordsOf: (evt: JxgObj) => [number, number] | null;\n objectsAt: (evt: JxgObj) => JxgObj[];\n promoteLabel: (o: JxgObj) => JxgObj;\n findNearestPoint: (evt: JxgObj, tolPx?: number) => JxgObj | null;\n toggleSelect: (obj: JxgObj, additive: boolean) => void;\n clearSelection: () => void;\n applySelectionStyle: (obj: JxgObj) => void;\n localIdOf: (obj: JxgObj) => string | null;\n nextLabel: () => string;\n create: (type: string, args: unknown[], attrs?: Record<string, unknown>) => JxgObj;\n finalize: (toolDef: ToolDef, picks: JxgObj[]) => void;\n finalizeTransformCreate: (spec: Parameters<typeof buildTransformSpec>[0] extends never ? never : ReturnType<typeof buildTransformSpec>, source: JxgObj) => void;\n clearPending: () => void;\n clearPreviewSegs: () => void;\n refreshPreview: () => void;\n flashWarn: (msg: string) => void;\n emitTransform: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void;\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n emitSelect: (snap: any) => void;\n setPendingCount: (n: number) => void;\n setSelectionTick: (fn: (t: number) => number) => void;\n}\n\n// ─── board.on('down') ─────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleDown(ctx: HandlerCtx, e: any): void {\n if (!ctx.boardRef.current) return;\n const t = ctx.toolRef.current;\n if (t === 'move') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n ctx.moveDownRef.current = { sx, sy };\n return;\n }\n if (t === 'select') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // Ưu tiên điểm: exact hit → nearest-within-12px → mới đến hit khác (line/circle).\n // Tránh case click hơi lệch điểm mà line đi qua đó cướp mất pick.\n const obj = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPoint(e, 12) ?? hits[0];\n if (obj) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(obj, shift);\n // Stash so 'up' handler doesn't treat this as a marquee end.\n ctx.moveDownRef.current = { sx, sy };\n ctx.marqueeRef.current = null;\n return;\n }\n // Empty space: start marquee. We disable board pan while marqueeing\n // by not setting moveDownRef (board's internal pan listener relies on\n // it being null elsewhere; here we record marquee start separately).\n ctx.marqueeRef.current = { startSx: sx, startSy: sy };\n // Clear current selection unless shift is held (additive marquee).\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n return;\n }\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n const x = coords[0], y = coords[1];\n\n // Detect if click hits any existing object (snap target). Text labels\n // are promoted to their owning element so a click on the \"A\" label\n // counts as a click on the point A.\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // Prefer points over other elements when present\n const bestHit: JxgObj | null = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? null;\n // Generous fallback used when a slot expects a point: JSXGraph's `hasPoint`\n // for a small point is ~3px which is too tight for clicking, so we look up\n // the nearest existing point within 12px. Only applied where the active\n // tool slot needs a point — otherwise we'd shadow valid line/circle hits.\n const snapPointForPointSlot = (): JxgObj | null =>\n bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPoint(e, 12);\n\n // Tool: point — nếu click trúng ≥2 đường/đường tròn → tạo giao điểm\n // ràng buộc (khi kéo các đường, điểm này luôn là giao). Trường hợp 1\n // đường + click thường vẫn tạo điểm tự do (không glide để tránh ràng\n // buộc ngoài ý muốn).\n if (t === 'point') {\n const curves = hits.filter((o) => objKind(o) === 'line' || objKind(o) === 'circle');\n if (curves.length >= 2) {\n const a = curves[0];\n const b = curves[1];\n const aId = ctx.localIdOf(a);\n const bId = ctx.localIdOf(b);\n if (aId && bId) {\n const name = ctx.nextLabel();\n const attrs = { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' };\n try {\n // intersection trả về element [obj1, obj2] với giao gần (x, y).\n // JSXGraph cần index i (0 hoặc 1) cho trường hợp 2 giao (line-circle, circle-circle).\n // Chọn index dựa vào điểm gần click hơn.\n const isLineLine = objKind(a) === 'line' && objKind(b) === 'line';\n if (isLineLine) {\n ctx.create('intersection', [aId, bId, 0], attrs);\n } else {\n // Thử cả 2 index, chọn cái gần click hơn\n const tmp0 = ctx.boardRef.current.create('intersection', [a, b, 0], { visible: false, withLabel: false });\n const tmp1 = ctx.boardRef.current.create('intersection', [a, b, 1], { visible: false, withLabel: false });\n const d0 = Math.hypot((tmp0.X?.() ?? 0) - x, (tmp0.Y?.() ?? 0) - y);\n const d1 = Math.hypot((tmp1.X?.() ?? 0) - x, (tmp1.Y?.() ?? 0) - y);\n safeJsx('handlers.removeObject(intersect.tmp0)', () => ctx.boardRef.current.removeObject(tmp0));\n safeJsx('handlers.removeObject(intersect.tmp1)', () => ctx.boardRef.current.removeObject(tmp1));\n const idx = d0 <= d1 ? 0 : 1;\n ctx.create('intersection', [aId, bId, idx], attrs);\n }\n return;\n } catch {\n // fallback: tạo điểm tự do\n }\n }\n }\n const name = ctx.nextLabel();\n ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n return;\n }\n\n // Edit / single-target tools (toggleLabel, toggleVisible, delete)\n if (toolDef.needs === 1 && toolDef.accepts) {\n // Fall back to generous point snap if hasPoint missed a small point.\n const hit = bestHit ?? ctx.findNearestPoint(e, 12);\n if (hit) ctx.finalize(toolDef, [hit]);\n else ctx.flashWarn('Click vào một đối tượng để áp dụng');\n return;\n }\n\n // Polygon / area: variable-length, close on click near starting point\n if (toolDef.needs === -1) {\n const snappedPoint = snapPointForPointSlot();\n // Close ring first: if user clicks back on the first pending point\n // (with at least 3 points already), finalize. Done before push so the\n // first point isn't duplicated into pending.\n if (ctx.pendingRef.current.length >= 3 && snappedPoint && snappedPoint === ctx.pendingRef.current[0]) {\n ctx.clearPreviewSegs();\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n return;\n }\n // Reject re-picking an interior pending vertex (would create a degenerate edge).\n if (snappedPoint && ctx.pendingRef.current.includes(snappedPoint)) {\n ctx.flashWarn('Đỉnh này đã có — click điểm khác hoặc click lại điểm đầu để đóng');\n return;\n }\n // Otherwise pick (snap-to-existing or create) a new vertex\n const pick: JxgObj = snappedPoint ?? (() => {\n const name = ctx.nextLabel();\n return ctx.create('point', [x, y], { name, color: '@stroke', size: 3 });\n })();\n // Live preview: draw an edge from the previous pending vertex to\n // this new one so the user sees the polygon being built.\n if (ctx.pendingRef.current.length > 0 && ctx.boardRef.current) {\n const prev = ctx.pendingRef.current[ctx.pendingRef.current.length - 1];\n safeJsx('handlers.createPreviewSegment', () => {\n const seg = ctx.boardRef.current.create('segment', [prev, pick], {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.75,\n fixed: true,\n highlight: false,\n withLabel: false,\n });\n ctx.previewSegRef.current.push(seg);\n });\n }\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n return;\n }\n\n // Multi-click branch. Two sub-modes:\n // A) Strict + order-flexible: tool declared `accepts`. We bind each\n // click to whatever required kind is still unfilled, regardless\n // of click order. E.g. perpendicular accepts ['point', 'line']\n // and the user can click line-then-point or point-then-line.\n // B) Lenient + order-fixed: tool has no `accepts` (segment, line,\n // ray, vector, circle*, ...). All slots want points; missing\n // snaps create a fresh point.\n let pick: JxgObj | null = null;\n\n if (toolDef.accepts) {\n // --- Mode A: strict, order-flexible ---\n const usedKinds = ctx.pendingRef.current.map((p) => objKind(p));\n const remaining: Array<'point' | 'line' | 'circle' | 'any'> = [...toolDef.accepts];\n for (const u of usedKinds) {\n if (u === 'other') continue;\n const i = remaining.indexOf(u);\n if (i >= 0) remaining.splice(i, 1);\n }\n const strictPoint = hits.find((o) => objKind(o) === 'point') ?? null;\n const lineHit = hits.find((o) => objKind(o) === 'line') ?? null;\n const circleHit = hits.find((o) => objKind(o) === 'circle') ?? null;\n // Priority: an exact point hit binds to 'point' first (so a click\n // landing right on a vertex isn't stolen by a line/circle passing\n // through it). Typed line/circle bind next. 'any' slot accepts any\n // remaining hit (point/line/circle). Generous point-snap is the\n // last resort when only a 'point' slot is open.\n //\n // Previously 'any' was checked AFTER the snap fallback for point,\n // which meant tools like dilate (accepts ['any', 'point']) couldn't\n // pick a segment for the 'any' slot — the snap branch absorbed the\n // click and 'any' was never evaluated.\n if (remaining.includes('point') && strictPoint) pick = strictPoint;\n else if (remaining.includes('line') && lineHit) pick = lineHit;\n else if (remaining.includes('circle') && circleHit) pick = circleHit;\n else if (remaining.includes('any') && (strictPoint || lineHit || circleHit)) {\n pick = strictPoint ?? lineHit ?? circleHit;\n } else if (remaining.includes('point')) {\n const near = ctx.findNearestPoint(e, 12);\n if (near) pick = near;\n }\n if (!pick) {\n const needs = remaining.map((k) =>\n k === 'point' ? 'một điểm' : k === 'line' ? 'một đường/đoạn' : k === 'circle' ? 'một đường tròn' : 'một đối tượng',\n );\n ctx.flashWarn(`Còn cần click vào ${needs.join(' + ')} có sẵn`);\n return;\n }\n // Reject duplicate picks (e.g. click the same point twice for midpoint\n // would produce a degenerate object pointing at itself).\n if (ctx.pendingRef.current.includes(pick)) {\n ctx.flashWarn('Đã chọn đối tượng này — chọn đối tượng khác');\n return;\n }\n } else {\n // --- Mode B: lenient, all slots want a point ---\n const snapped = snapPointForPointSlot();\n if (snapped && ctx.pendingRef.current.includes(snapped)) {\n // Same point clicked twice → would produce a zero-length segment / etc.\n ctx.flashWarn('Đã chọn điểm này — chọn điểm khác hoặc click chỗ trống');\n return;\n }\n if (snapped) pick = snapped;\n else {\n const name = ctx.nextLabel();\n pick = ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n }\n }\n\n if (!pick) return;\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n\n if (ctx.pendingRef.current.length >= toolDef.needs) {\n const tk = toolDef.key;\n if (tk === 'rotate' || tk === 'dilate') {\n const source = ctx.pendingRef.current[0];\n const center = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source, center, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n // Don't clearPending here — wait for confirm/cancel\n return;\n }\n if (tk === 'regularPolygon') {\n const p1 = ctx.pendingRef.current[0];\n const p2 = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source: p1, center: p2, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n return;\n }\n if (tk === 'translate') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'translate', vectorPoints: [ctx.pendingRef.current[1], ctx.pendingRef.current[2]] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectLine') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectLine', line: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectPoint') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectPoint', center: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n } else {\n ctx.refreshPreview();\n }\n}\n\n// ─── board.on('up') ───────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleUp(ctx: HandlerCtx, e: any): void {\n const t = ctx.toolRef.current;\n if (t === 'select') {\n // Finalize marquee: any object hit-tested inside the rectangle gets\n // added to the selection. Single click on object was already handled\n // in `down`; here we only care about drag end.\n const mq = ctx.marqueeRef.current;\n ctx.marqueeRef.current = null;\n ctx.moveDownRef.current = null;\n if (!mq) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [ex, ey] = sc;\n if (mq.rect) { safeJsx('handlers.removeObject(marquee.rect)', () => ctx.boardRef.current?.removeObject(mq.rect)); }\n if (Math.hypot(ex - mq.startSx, ey - mq.startSy) < 4) return; // not a real drag\n const x1 = Math.min(mq.startSx, ex), x2 = Math.max(mq.startSx, ex);\n const y1 = Math.min(mq.startSy, ey), y2 = Math.max(mq.startSy, ey);\n const board = ctx.boardRef.current;\n if (!board) return;\n const list = (board.objectsList || []) as JxgObj[];\n for (const o of list) {\n if (o === ctx.axisObjsRef.current.x || o === ctx.axisObjsRef.current.y) continue;\n // Points: include if their screen coord falls inside the rect.\n const kind = objKind(o);\n if (kind === 'point') {\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n if (pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2) {\n if (!ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n // Lines/segments/circles: simple test — include if either defining\n // point falls inside (good enough for marquee UX without doing\n // expensive line-rectangle intersections).\n else if (kind === 'line' || kind === 'circle') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const defs: any[] = [o.point1, o.point2, o.center, o.midpoint, o.point3].filter(Boolean);\n const anyInside = defs.some((p) => {\n const pc = p?.coords?.scrCoords;\n return pc && pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2;\n });\n if (anyInside && !ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n ctx.setSelectionTick((tt) => tt + 1);\n safeJsx('handlers.board.update(marquee)', () => board.update());\n return;\n }\n if (t !== 'move') return;\n const start = ctx.moveDownRef.current;\n ctx.moveDownRef.current = null;\n if (!start) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const moved = Math.hypot(sx - start.sx, sy - start.sy);\n if (moved > 4) return; // drag, không phải click\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // Ưu tiên điểm (exact → nearest-within-12px) trước, rồi mới fallback object\n // khác (line/circle). Đảm bảo double-click gần một điểm sẽ mở properties cho\n // điểm đó kể cả khi có line đi sát qua.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const best: any = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPoint(e, 12) ?? hits[0];\n if (!best) {\n ctx.lastMoveClickRef.current = { obj: null, time: 0 };\n return;\n }\n const now = Date.now();\n const isDouble = ctx.lastMoveClickRef.current.obj === best && (now - ctx.lastMoveClickRef.current.time) < 400;\n ctx.lastMoveClickRef.current = { obj: best, time: now };\n if (!isDouble) return;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n const snap = ctx.snapshotObject(best, { x: cx + 8, y: cy + 8 });\n if (snap) ctx.emitSelect(snap);\n}\n\n// ─── board.on('move') ────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleMove(ctx: HandlerCtx, e: any): void {\n // Marquee rectangle redraw while user drags with the select tool on empty space.\n if (ctx.toolRef.current === 'select' && ctx.marqueeRef.current) {\n const sc = ctx.screenCoordsOf(e);\n if (sc && ctx.boardRef.current) {\n const [sx, sy] = sc;\n const { startSx, startSy } = ctx.marqueeRef.current;\n // Convert screen px to user coords for JSXGraph polygon overlay.\n const b = ctx.boardRef.current;\n const ux1 = b.screenCoords2userCoords?.([Math.min(startSx, sx), Math.min(startSy, sy)]) ?? null;\n const ux2 = b.screenCoords2userCoords?.([Math.max(startSx, sx), Math.max(startSy, sy)]) ?? null;\n // JSXGraph internal: getUsrCoordsByScreenCoords may not exist; fall\n // back to using a known board API.\n const toUsr = (px: number, py: number): [number, number] => {\n // Coords.getMouseCoordinates equivalent — use board.origin + unitX/Y.\n const ox = b.origin?.scrCoords?.[1] ?? 0;\n const oy = b.origin?.scrCoords?.[2] ?? 0;\n const ux = (px - ox) / b.unitX;\n const uy = (oy - py) / b.unitY;\n return [ux, uy];\n };\n const [x1u, y1u] = ux1 && ux1.length >= 2 ? [ux1[0], ux1[1]] : toUsr(Math.min(startSx, sx), Math.min(startSy, sy));\n const [x2u, y2u] = ux2 && ux2.length >= 2 ? [ux2[0], ux2[1]] : toUsr(Math.max(startSx, sx), Math.max(startSy, sy));\n const rect = ctx.marqueeRef.current.rect;\n if (rect) {\n safeJsx('handlers.removeObject(marquee.prevRect)', () => ctx.boardRef.current.removeObject(rect));\n }\n safeJsx('handlers.createMarqueePolygon', () => {\n ctx.marqueeRef.current!.rect = ctx.boardRef.current.create('polygon', [\n [x1u, y1u], [x2u, y1u], [x2u, y2u], [x1u, y2u],\n ], {\n fillColor: '#06b6d4', fillOpacity: 0.08,\n borders: { strokeColor: '#06b6d4', strokeWidth: 1, dash: 2 },\n vertices: { visible: false },\n fixed: true, highlight: false, withLabel: false,\n });\n });\n }\n return;\n }\n const ph = ctx.phantomRef.current;\n if (!ph || !ctx.boardRef.current) return;\n if (ctx.previewRafRef.current != null) return;\n ctx.previewRafRef.current = requestAnimationFrame(() => {\n ctx.previewRafRef.current = null;\n if (!ctx.boardRef.current || !ctx.phantomRef.current) return;\n safeJsx('handlers.phantomMove', () => {\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const JXG: any = ctx.jxgRef.current;\n if (!JXG) return;\n ctx.phantomRef.current.setPositionDirectly(JXG.COORDS_BY_USER, [coords[0], coords[1]]);\n ctx.boardRef.current.update();\n });\n });\n}\n","'use client';\nimport React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { deserializeIntoBoard, type SerializedBoard, type SerializedElement } from '../serialize';\nimport { getDefiningPoints, buildTransformSpec } from './transforms';\nimport {\n TOOLS,\n GROUP_LABELS,\n acceptMatches,\n objKind,\n type GeomTool,\n type ToolDef,\n} from './tools';\nimport { paletteFor, resolveAttrColors, themeAxis, themeGrid, themeLabel } from './theme';\nimport { handleDown, handleUp, handleMove, type HandlerCtx } from './handlers';\nimport { safeJsx } from '../../shared/safeJsx';\n\n// Re-export để backward-compat với consumer cũ.\nexport { TOOLS, GROUP_LABELS };\nexport type { GeomTool, ToolDef };\n\nexport interface MiniBoardHandle {\n getContainer: () => HTMLDivElement | null;\n getCreationLog: () => SerializedElement[];\n getBbox: () => [number, number, number, number];\n getShowAxis: () => boolean;\n getShowGrid: () => boolean;\n /** Đổi tool active từ bên ngoài (panel trái). */\n setTool: (t: GeomTool) => void;\n getTool: () => GeomTool;\n /** Toggle layout từ bên ngoài. */\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n /** Undo bước cuối. */\n undo: () => void;\n /** Có gì để undo? */\n canUndo: () => boolean;\n /** Redo bước vừa undo. */\n redo: () => void;\n /** Có gì để redo? */\n canRedo: () => boolean;\n /** Subscribe khi state thay đổi (tool / showAxis / showGrid / undo). */\n subscribe: (cb: () => void) => () => void;\n /** Đọc snapshot thuộc tính object (cho popover). */\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => ObjectSnapshot | null;\n /** Mutate thuộc tính + sync log. */\n mutateObject: (obj: unknown, patch: { attrs?: Record<string, unknown>; remove?: boolean }) => void;\n /** Liệt kê tên của tất cả point hiện tại (để popover disambiguate khi rename). */\n getAllPointNames: () => string[];\n /** Subscribe selection-from-move-tool. Trả về unsubscribe. */\n onSelect: (cb: (snap: ObjectSnapshot) => void) => () => void;\n onTransformParam: (cb: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void) => () => void;\n confirmTransformParam: (value: number) => void;\n cancelTransformParam: () => void;\n /** Số đối tượng đang chọn (qua tool 'select'). */\n getSelectionSize: () => number;\n /** Bỏ chọn tất cả. */\n clearSelection: () => void;\n /** Xoá tất cả đối tượng đang chọn (cascade-aware). */\n deleteSelection: () => void;\n}\n\nexport interface ObjectSnapshot {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any;\n kind: 'point' | 'line' | 'circle';\n name: string;\n color: string;\n dash: number;\n width: number;\n face: 'o' | 'circle' | 'cross' | 'plus';\n /** Đang hiển thị tên (label) hay không. */\n showLabel: boolean;\n /** Đang có value-label (text gắn động) hay không. */\n showValue: boolean;\n screenCoords: { x: number; y: number };\n}\n\ninterface Props {\n onReady: (handle: MiniBoardHandle) => void;\n initialState: SerializedBoard | null;\n /** Khi true → board nền tối, điểm/đường/label dùng tone sáng để contrast. */\n isDark?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport const JSXGraphMiniBoard: React.FC<Props> = ({ onReady, initialState, isDark }) => {\n const isDarkRef = useRef(!!isDark);\n isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_jxgmini';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const axisObjsRef = useRef<{ x?: JxgObj; y?: JxgObj }>({});\n const creationLogRef = useRef<SerializedElement[]>([]);\n const redoStackRef = useRef<SerializedElement[]>([]);\n\n const [tool, setTool] = useState<GeomTool>('move');\n const toolRef = useRef<GeomTool>('move');\n toolRef.current = tool;\n\n const [showAxis, setShowAxis] = useState<boolean>(initialState?.showAxis ?? false);\n const [showGrid, setShowGrid] = useState<boolean>(initialState?.showGrid ?? false);\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n // Track JSXGraph point objects created during the session, indexed by our serialized id.\n // We also track the LAST object created (for non-point types like segment) so accept-matching works.\n const objMapRef = useRef<Map<string, JxgObj>>(new Map());\n\n // Map target line/circle → dynamic value-label text element (hiển thị độ dài\n // / bán kính). Khi user toggle \"Show Value\", ta tạo/xoá text này. Serialize:\n // entry type='valueLabel' trong creationLog với args=[targetLocalId].\n const valueLabelsRef = useRef<Map<JxgObj, JxgObj>>(new Map());\n\n // Pending picks for multi-click tools: array of JSXGraph object refs\n const pendingRef = useRef<JxgObj[]>([]);\n const [, setPendingCount] = useState(0);\n\n // Selection state — tool 'select' adds clicked objects here. Selected objects\n // get a cyan highlight stroke (original style preserved in selOriginalRef so\n // we can restore on deselect).\n const selectedSetRef = useRef<Set<JxgObj>>(new Set());\n const selOriginalRef = useRef<Map<JxgObj, { strokeColor?: unknown; strokeWidth?: unknown }>>(new Map());\n const [, setSelectionTick] = useState(0);\n // Marquee state during select-tool drag.\n const marqueeRef = useRef<{ startSx: number; startSy: number; rect?: JxgObj } | null>(null);\n\n // Live preview segments while building a polygon/area: drawn between\n // consecutive pending points so the user sees the shape forming.\n const previewSegRef = useRef<JxgObj[]>([]);\n // Phantom point that tracks mouse position for 2-3 click tool live preview.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const phantomRef = useRef<any>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const previewShapeRef = useRef<any>(null);\n const previewRafRef = useRef<number | null>(null);\n // Tick state forces re-render so the undo button enable state stays in sync\n // with creationLogRef (which is mutated outside React).\n const [historyTick, setHistoryTick] = useState(0);\n // Transient warning shown when a strict construction tool gets a click that\n // didn't land on the required existing object (so the user knows why nothing\n // happened). Auto-clears.\n const [, setWarn] = useState<string | null>(null);\n const warnTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flashWarn = useCallback((msg: string) => {\n if (warnTimerRef.current) clearTimeout(warnTimerRef.current);\n setWarn(msg);\n warnTimerRef.current = setTimeout(() => setWarn(null), 1800);\n }, []);\n useEffect(() => () => { if (warnTimerRef.current) clearTimeout(warnTimerRef.current); }, []);\n\n const labelIdxRef = useRef(0);\n const nextLabel = useCallback(() => {\n const idx = labelIdxRef.current;\n const suffix = idx >= 26 ? String(Math.floor(idx / 26)) : '';\n const code = 'A'.charCodeAt(0) + (idx % 26);\n labelIdxRef.current = idx + 1;\n return String.fromCharCode(code) + suffix;\n }, []);\n\n const nextLocalId = useCallback(() => 'j' + creationLogRef.current.length, []);\n\n // Build a fresh JSXGraph object id resolver for serialization.\n // We log args using local string IDs (\"j0\"); resolve to JSXGraph objects in-memory via objMapRef.\n // Polygon edges (sub-segments) are referenced via \"<polyId>:border:<i>\" since\n // they're auto-created by JSXGraph as part of the polygon and don't carry a\n // separate top-level id of their own.\n const resolveArgs = useCallback((args: unknown[]): unknown[] => {\n return args.map((a) => {\n if (typeof a === 'string') {\n if (objMapRef.current.has(a)) return objMapRef.current.get(a);\n const m = /^(.+):border:(\\d+)$/.exec(a);\n if (m) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const poly = objMapRef.current.get(m[1]) as any;\n const idx = parseInt(m[2], 10);\n if (poly && Array.isArray(poly.borders) && poly.borders[idx]) {\n return poly.borders[idx];\n }\n }\n }\n return a;\n });\n }, []);\n\n // Push entry mới vào creationLog + clear redoStack (chuẩn UX undo/redo).\n const pushCreationLog = useCallback((entry: SerializedElement) => {\n creationLogRef.current.push(entry);\n redoStackRef.current = [];\n }, []);\n\n const pushLog = useCallback(\n (id: string, type: string, args: unknown[], attrs: Record<string, unknown>, obj: JxgObj) => {\n pushCreationLog({ id, type, args, attrs });\n objMapRef.current.set(id, obj);\n setHistoryTick((t) => t + 1);\n },\n [pushCreationLog],\n );\n\n const create = useCallback(\n (type: string, args: unknown[], attrs: Record<string, unknown> = {}): JxgObj => {\n if (!boardRef.current) return null;\n const id = nextLocalId();\n const resolved = resolveArgs(args);\n // attrs có thể chứa sentinel `@stroke/@axis/@grid/@label` — log lưu nguyên\n // bản (theme-neutral), JSXGraph nhận màu thực resolve theo theme hiện tại.\n const resolvedAttrs = resolveAttrColors(attrs, paletteFor(isDarkRef.current));\n const obj = boardRef.current.create(type, resolved, resolvedAttrs);\n pushLog(id, type, args, attrs, obj);\n return obj;\n },\n [nextLocalId, resolveArgs, pushLog],\n );\n\n // Get local serialized id for a JSXGraph object (reverse lookup).\n // Falls back to \"<polyId>:border:<i>\" when obj is a polygon edge — lets\n // construct tools (perpendicular, parallel, ...) reference polygon cạnh as\n // a line input even though edges aren't tracked as top-level entries.\n const localIdOf = useCallback((obj: JxgObj): string | null => {\n if (!obj) return null;\n for (const [id, o] of objMapRef.current.entries()) {\n if (o === obj) return id;\n }\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const borders = (o as any)?.borders;\n if (Array.isArray(borders)) {\n const idx = borders.indexOf(obj);\n if (idx >= 0) return `${id}:border:${idx}`;\n }\n }\n return null;\n }, []);\n\n const snapshotObject = useCallback((obj: unknown, anchorScreen: { x: number; y: number }): ObjectSnapshot | null => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o: any = obj;\n const k = objKind(o);\n if (k !== 'point' && k !== 'line' && k !== 'circle') return null;\n // Polygon borders are sub-elements of a polygon — user's mental model treats\n // the polygon as one atomic object, so editing a single edge's color/dash\n // (without affecting siblings) is confusing. Reject the popover here; the\n // edge is still usable as a `line` input for construction tools.\n for (const owner of objMapRef.current.values()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const borders = (owner as any)?.borders;\n if (Array.isArray(borders) && borders.indexOf(o) >= 0) return null;\n }\n const v = o.visProp ?? {};\n const showLabel = v.withlabel !== false;\n const showValue = valueLabelsRef.current.has(o);\n return {\n obj: o,\n kind: k,\n name: typeof o.name === 'string' ? o.name : '',\n color: (v.strokecolor as string) ?? '#1e1e1e',\n dash: typeof v.dash === 'number' ? v.dash : 0,\n width: typeof v.strokewidth === 'number' ? v.strokewidth : 2,\n face: (v.face as ObjectSnapshot['face']) ?? 'o',\n showLabel,\n showValue,\n screenCoords: anchorScreen,\n };\n }, []);\n\n // Tạo text element động hiển thị giá trị (độ dài segment / bán kính circle).\n // Trả về JSXGraph text obj (chưa log). Cần obj có cùng \"kind\" được hỗ trợ.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const createValueLabelFor = useCallback((target: any): any => {\n const b = boardRef.current;\n if (!b || !target) return null;\n const k = objKind(target);\n if (k === 'line') {\n // segment / line / arrow đều dùng point1 + point2\n const p1 = target.point1;\n const p2 = target.point2;\n if (!p1 || !p2) return null;\n const txt = b.create('text', [\n () => (p1.X() + p2.X()) / 2 + 0.15,\n () => (p1.Y() + p2.Y()) / 2 + 0.25,\n () => {\n const dx = p2.X() - p1.X();\n const dy = p2.Y() - p1.Y();\n const len = Math.hypot(dx, dy);\n const name = typeof target.name === 'string' && target.name ? target.name : 'd';\n return `${name} = ${len.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n return txt;\n }\n if (k === 'circle') {\n const center = target.center ?? target.midpoint;\n if (!center) return null;\n const txt = b.create('text', [\n () => center.X() + 0.3,\n () => center.Y() + 0.3,\n () => {\n const r = typeof target.Radius === 'function' ? target.Radius() : 0;\n const name = typeof target.name === 'string' && target.name ? target.name : 'r';\n return `${name} = ${r.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n return txt;\n }\n return null;\n }, []);\n\n const mutateObject = useCallback((obj: unknown, patch: { attrs?: Record<string, unknown>; remove?: boolean; valueLabel?: boolean }) => {\n if (!boardRef.current) return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o: any = obj;\n if (patch.remove) {\n // Nếu obj có value-label đính kèm → xoá luôn text đó để cascade không\n // bỏ sót.\n const vl = valueLabelsRef.current.get(o);\n if (vl) {\n safeJsx('MiniBoard.removeObject(valueLabel)', () => boardRef.current.removeObject(vl));\n valueLabelsRef.current.delete(o);\n }\n safeJsx('MiniBoard.removeObject(target)', () => boardRef.current.removeObject(o));\n // Cascade: walk log and drop entries whose JSXGraph object was also removed\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, obj] of objMapRef.current.entries()) {\n // JSXGraph keeps objects in board.objects keyed by JSXGraph internal id\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (obj as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n // Drop dead entries from log + map\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n return;\n }\n if (typeof patch.valueLabel === 'boolean') {\n const has = valueLabelsRef.current.has(o);\n if (patch.valueLabel && !has) {\n const txt = createValueLabelFor(o);\n if (txt) {\n valueLabelsRef.current.set(o, txt);\n // Log entry tổng hợp để reload regenerate được. args=[targetLocalId].\n const targetId = localIdOf(o);\n if (targetId) {\n const id = nextLocalId();\n pushCreationLog({ id, type: 'valueLabel', args: [targetId], attrs: {} });\n objMapRef.current.set(id, txt);\n setHistoryTick((t) => t + 1);\n }\n }\n } else if (!patch.valueLabel && has) {\n const txt = valueLabelsRef.current.get(o);\n valueLabelsRef.current.delete(o);\n if (txt) {\n safeJsx('MiniBoard.removeObject(valueLabel.text)', () => boardRef.current.removeObject(txt));\n // Xoá log entry value-label tương ứng\n const txtId = localIdOf(txt);\n if (txtId) {\n creationLogRef.current = creationLogRef.current.filter((e) => e.id !== txtId);\n objMapRef.current.delete(txtId);\n setHistoryTick((t) => t + 1);\n }\n }\n }\n }\n if (patch.attrs) {\n safeJsx('MiniBoard.setAttribute', () => o.setAttribute(patch.attrs));\n const id = localIdOf(o);\n if (id) {\n const entry = creationLogRef.current.find((e) => e.id === id);\n if (entry) entry.attrs = { ...entry.attrs, ...patch.attrs };\n setHistoryTick((t) => t + 1);\n }\n }\n safeJsx('MiniBoard.board.update(mutate)', () => boardRef.current.update());\n }, [createValueLabelFor, localIdOf, nextLocalId]);\n\n const clearPreviewSegs = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n for (const s of previewSegRef.current) {\n safeJsx('MiniBoard.removeObject(previewSeg)', () => b.removeObject(s));\n }\n previewSegRef.current = [];\n }, []);\n\n const removePhantom = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n if (previewShapeRef.current) {\n safeJsx('MiniBoard.removeObject(previewShape)', () => b.removeObject(previewShapeRef.current));\n previewShapeRef.current = null;\n }\n if (phantomRef.current) {\n safeJsx('MiniBoard.removeObject(phantom)', () => b.removeObject(phantomRef.current));\n phantomRef.current = null;\n }\n }, []);\n\n const clearPending = useCallback(() => {\n removePhantom();\n clearPreviewSegs();\n pendingRef.current = [];\n setPendingCount(0);\n }, [clearPreviewSegs, removePhantom]);\n\n // === Selection helpers (used by the `select` tool) ===\n const applySelectionStyle = useCallback((obj: JxgObj) => {\n if (!obj || selOriginalRef.current.has(obj)) return;\n safeJsx('MiniBoard.applySelectionStyle', () => {\n const visProp = obj.visProp ?? {};\n selOriginalRef.current.set(obj, {\n strokeColor: visProp.strokecolor,\n strokeWidth: visProp.strokewidth,\n });\n const kind = objKind(obj);\n if (kind === 'point') {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n } else {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n }\n });\n }, []);\n\n const restoreSelectionStyle = useCallback((obj: JxgObj) => {\n const orig = selOriginalRef.current.get(obj);\n if (!orig) return;\n safeJsx('MiniBoard.restoreSelectionStyle', () => {\n const attrs: Record<string, unknown> = {};\n if (orig.strokeColor !== undefined) attrs.strokeColor = orig.strokeColor;\n if (orig.strokeWidth !== undefined) attrs.strokeWidth = orig.strokeWidth;\n obj.setAttribute(attrs);\n });\n selOriginalRef.current.delete(obj);\n }, []);\n\n const clearSelection = useCallback(() => {\n for (const o of selectedSetRef.current) {\n restoreSelectionStyle(o);\n }\n selectedSetRef.current.clear();\n setSelectionTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(clearSelection)', () => boardRef.current?.update());\n }, [restoreSelectionStyle]);\n\n const toggleSelect = useCallback((obj: JxgObj, additive: boolean) => {\n if (!obj) return;\n if (!additive) {\n // Single-click replace: clear others first.\n for (const o of selectedSetRef.current) {\n if (o !== obj) restoreSelectionStyle(o);\n }\n selectedSetRef.current = new Set([obj]);\n applySelectionStyle(obj);\n } else {\n if (selectedSetRef.current.has(obj)) {\n restoreSelectionStyle(obj);\n selectedSetRef.current.delete(obj);\n } else {\n selectedSetRef.current.add(obj);\n applySelectionStyle(obj);\n }\n }\n setSelectionTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(toggleSelect)', () => boardRef.current?.update());\n }, [applySelectionStyle, restoreSelectionStyle]);\n\n const deleteSelected = useCallback(() => {\n const board = boardRef.current;\n if (!board) return;\n if (selectedSetRef.current.size === 0) return;\n // Drop highlight first so removal doesn't try to setAttribute on dead obj.\n for (const o of selectedSetRef.current) selOriginalRef.current.delete(o);\n for (const o of selectedSetRef.current) {\n safeJsx('MiniBoard.removeObject(selected)', () => board.removeObject(o));\n }\n selectedSetRef.current.clear();\n // Cascade-prune log (same approach as delete tool)\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board.objects && board.objects[jxgId]) aliveIds.add(id);\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setSelectionTick((t) => t + 1);\n setHistoryTick((t) => t + 1);\n }, []);\n\n // Build a transient preview shape (not logged) from pending picks + phantom point.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const buildPreview = useCallback((toolDef: ToolDef, picks: any[], phantom: any) => {\n const b = boardRef.current;\n if (!b) return null;\n const style = { strokeColor: '#3b82f6', strokeWidth: 1.5, strokeOpacity: 0.65, dash: 2, fixed: true, highlight: false, withLabel: false } as Record<string, unknown>;\n const circStyle = { ...style, fillColor: 'none', fillOpacity: 0 };\n try {\n switch (toolDef.key) {\n case 'segment':\n case 'midpoint':\n case 'distance':\n return b.create('segment', [picks[0], phantom], style);\n case 'line':\n return b.create('line', [picks[0], phantom], style);\n case 'ray':\n return b.create('line', [picks[0], phantom], { ...style, straightFirst: false, straightLast: true });\n case 'vector':\n return b.create('arrow', [picks[0], phantom], style);\n case 'circleCenter':\n return b.create('circle', [picks[0], phantom], circStyle);\n case 'circle3':\n if (picks.length === 1) return b.create('circle', [picks[0], phantom], circStyle);\n if (picks.length === 2) return b.create('circumcircle', [picks[0], picks[1], phantom], circStyle);\n return null;\n case 'angle':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('angle', [picks[0], picks[1], phantom], { ...style, radius: 1, fillColor: '#22c55e', fillOpacity: 0.15 });\n return null;\n case 'perpBisector':\n return b.create('segment', [picks[0], phantom], style);\n case 'angleBisector':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('bisector', [picks[0], picks[1], phantom], style);\n return null;\n case 'perpendicular':\n case 'parallel':\n case 'tangent':\n if (picks.length === 1) {\n const k = objKind(picks[0]);\n if (k === 'line' && toolDef.key !== 'tangent') {\n return b.create(toolDef.key, [picks[0], phantom], style);\n }\n if (k === 'circle' && toolDef.key === 'tangent') {\n const glider = b.create('glider', [phantom.X(), phantom.Y(), picks[0]], { visible: false, withLabel: false });\n return b.create('tangent', [glider], style);\n }\n }\n return null;\n default:\n return null;\n }\n } catch {\n return null;\n }\n }, []);\n\n // Tear down old preview shape and build a new one from current picks + phantom.\n const refreshPreview = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n // Tear down current preview shape (not the phantom)\n if (previewShapeRef.current) {\n safeJsx('MiniBoard.removeObject(refreshPreview)', () => b.removeObject(previewShapeRef.current));\n previewShapeRef.current = null;\n }\n const t = toolRef.current;\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n const picks = pendingRef.current;\n if (picks.length === 0 || toolDef.needs <= 0) return;\n if (picks.length >= toolDef.needs) return;\n // Create phantom if missing\n if (!phantomRef.current) {\n try {\n phantomRef.current = b.create('point', [0, 0], { visible: false, fixed: true, withLabel: false, name: '' });\n } catch { return; }\n }\n previewShapeRef.current = buildPreview(toolDef, picks, phantomRef.current);\n }, [buildPreview]);\n\n // Apply tool action with a sequence of picked refs\n const finalize = useCallback((toolDef: ToolDef, picks: JxgObj[]) => {\n if (!boardRef.current) return;\n const labels = picks.map(localIdOf).filter(Boolean) as string[];\n // For open shapes (segment, line, ray, vector). `color` shorthand also fills\n // closed shapes, so we use explicit strokeColor + transparent fillOpacity for\n // anything closed (circle, polygon, angle).\n const stroke = { strokeColor: '@stroke', strokeWidth: 2 };\n const strokeOnly = { ...stroke, fillColor: 'none', fillOpacity: 0 };\n const lblName = nextLabel();\n switch (toolDef.key) {\n case 'midpoint':\n create('midpoint', labels, { name: lblName, color: '@stroke', size: 3 });\n break;\n case 'segment':\n create('segment', labels, stroke);\n break;\n case 'line':\n create('line', labels, stroke);\n break;\n case 'ray': {\n // JSXGraph: 'line' with straightFirst:false, straightLast:true\n create('line', labels, { ...stroke, straightFirst: false, straightLast: true });\n break;\n }\n case 'vector':\n create('arrow', labels, stroke);\n break;\n case 'perpendicular': {\n // [point, line] in that order; JSXGraph perpendicular expects (line, point)\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('perpendicular', [l, p], stroke);\n break;\n }\n case 'parallel': {\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('parallel', [l, p], stroke);\n break;\n }\n case 'perpBisector': {\n // JSXGraph 1.12.x doesn't register a `perpendicularbisector` element\n // (only `perpendicular`, `perpendicularpoint`, `perpendicularsegment`).\n // Build it from primitives: midpoint M of P1P2, then a perpendicular\n // line to the segment P1P2 through M. Helpers are invisible but logged\n // so deserialize-on-reload reconstructs the dependency chain.\n const mid = create('midpoint', labels, { visible: false, withLabel: false, name: '' });\n const seg = create('segment', labels, { visible: false, withLabel: false });\n const midId = localIdOf(mid);\n const segId = localIdOf(seg);\n if (midId && segId) create('perpendicular', [segId, midId], stroke);\n break;\n }\n case 'angleBisector':\n create('bisector', labels, stroke);\n break;\n case 'circleCenter':\n create('circle', labels, strokeOnly);\n break;\n case 'circle3':\n create('circumcircle', labels, strokeOnly);\n break;\n case 'tangent': {\n // Need to find the actual point pick (not just by slot index) since\n // the user can click circle-then-point OR point-then-circle.\n const firstIsPoint = picks[0] && objKind(picks[0]) === 'point';\n const pointPick = firstIsPoint ? picks[0] : picks[1];\n const circleLabel = firstIsPoint ? labels[1] : labels[0];\n if (!pointPick || !circleLabel) break;\n const px = typeof pointPick.X === 'function' ? pointPick.X() : 0;\n const py = typeof pointPick.Y === 'function' ? pointPick.Y() : 0;\n const glider = create('glider', [px, py, circleLabel], { name: '', size: 2, strokeColor: '#666', visible: false });\n const gid = localIdOf(glider);\n if (gid) create('tangent', [gid], stroke);\n break;\n }\n case 'angle': {\n // JSXGraph vẽ cung từ BA → BC theo chiều dương (ngược chiều kim đồng hồ).\n // Nếu cross(BA, BC) < 0 thì cung CCW từ BA → BC > 180° → đổi vai trò A,C\n // để luôn hiển thị góc nhọn/tù thay vì góc phản (reflex).\n const [pa, pb, pc] = picks;\n let order: string[] = labels;\n try {\n const ax = pa.X() - pb.X(), ay = pa.Y() - pb.Y();\n const cx = pc.X() - pb.X(), cy = pc.Y() - pb.Y();\n const cross = ax * cy - ay * cx;\n if (cross < 0) order = [labels[2], labels[1], labels[0]];\n } catch { /* fallback giữ thứ tự */ }\n create('angle', order, {\n radius: 1,\n fillColor: '#22c55e',\n fillOpacity: 0.25,\n strokeColor: '#16a34a',\n strokeWidth: 1.5,\n name: '',\n withLabel: false,\n });\n break;\n }\n case 'distance': {\n const pA = picks[0], pB = picks[1];\n const dist = Math.hypot((pA.X() - pB.X()), (pA.Y() - pB.Y()));\n const midX = (pA.X() + pB.X()) / 2;\n const midY = (pA.Y() + pB.Y()) / 2;\n create('text', [midX, midY, `d = ${dist.toFixed(2)}`], { fontSize: 14, color: '#dc2626' });\n break;\n }\n case 'polygon': {\n create('polygon', labels, { fillColor: '#1e3a8a', fillOpacity: 0.10, borders: { strokeColor: '@stroke', strokeWidth: 2 } });\n break;\n }\n case 'area': {\n create('polygon', labels, { fillColor: '#3b82f6', fillOpacity: 0.18, borders: { strokeColor: '#1d4ed8', strokeWidth: 2 } });\n break;\n }\n case 'toggleLabel': {\n const obj = picks[0];\n safeJsx('MiniBoard.toggleLabel', () => {\n if (obj.label) {\n const visible = obj.label.visProp.visible !== false;\n obj.label.setAttribute({ visible: !visible });\n } else if (obj.setAttribute) {\n // For elements without explicit label, toggle 'withLabel'\n const cur = obj.visProp.withlabel !== false;\n obj.setAttribute({ withLabel: !cur });\n }\n boardRef.current.update();\n });\n break;\n }\n case 'toggleVisible': {\n const obj = picks[0];\n safeJsx('MiniBoard.toggleVisible', () => {\n const visible = obj.visProp.visible !== false;\n obj.setAttribute({ visible: !visible });\n boardRef.current.update();\n });\n break;\n }\n case 'delete': {\n const obj = picks[0];\n safeJsx('MiniBoard.deleteOne', () => {\n boardRef.current.removeObject(obj);\n // JSXGraph cascade-removes dependents (e.g. xoá point → segment dùng\n // point đó cũng biến mất). Đồng bộ log: walk objMap, giữ lại id nào\n // vẫn còn trong board.objects; còn lại drop khỏi log + map. Trước\n // patch, chỉ entry chính bị xoá → log dangling reference, replay sẽ\n // throw vì id phụ thuộc không resolve được.\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n });\n break;\n }\n }\n }, [create, localIdOf, nextLabel]);\n\n const finalizeTransformCreate = useCallback((\n spec: { params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' }; chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }> },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any,\n ) => {\n if (!boardRef.current) return;\n const def = getDefiningPoints(source);\n if (!def) { flashWarn('Không thể biến đổi đối tượng này'); return; }\n\n // 1. Create + log transform entry/entries. Chain mode (dilate): create N\n // transforms in order, log each, and apply them as an array.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformObjs: any[] = [];\n const transformIds: string[] = [];\n const steps = spec.chain ?? [{ params: spec.params, attrs: spec.attrs }];\n for (const step of steps) {\n const stepLogArgs: unknown[] = [];\n for (const p of step.params) {\n if (typeof p === 'function') {\n flashWarn('Tham số transform không serialize được — bỏ qua');\n return;\n }\n if (p && typeof p === 'object') {\n const id = localIdOf(p);\n if (!id) {\n flashWarn('Đối tượng tham chiếu không nằm trong board — không thể biến đổi');\n return;\n }\n stepLogArgs.push(id);\n } else {\n stepLogArgs.push(p);\n }\n }\n const stepId = nextLocalId();\n const stepObj = boardRef.current.create('transform', step.params, step.attrs);\n pushCreationLog({ id: stepId, type: 'transform', args: stepLogArgs, attrs: step.attrs as Record<string, unknown> });\n objMapRef.current.set(stepId, stepObj);\n transformObjs.push(stepObj);\n transformIds.push(stepId);\n }\n const transformParent = transformObjs.length === 1 ? transformObjs[0] : transformObjs;\n const transformLogRef = transformObjs.length === 1 ? transformIds[0] : transformIds;\n\n // 2. Transform each defining point — log each.\n // JSXGraph signature: create('point', [parentElement, transformation|transformationArray])\n // — SOURCE element first, transformation second. Reversing the order made\n // JSXGraph reject the call (\"Can't create point with parent types 'object'\n // and 'object'\"), crashing the rotate tool prior to this fix.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformedPoints: any[] = def.points.map((src) => {\n const srcId = localIdOf(src);\n const id = nextLocalId();\n const srcName = typeof src.name === 'string' ? src.name : '';\n const newName = srcName ? `${srcName}'` : nextLabel();\n const attrs = { name: newName, size: 3, color: '#0ea5e9', strokeColor: '#0ea5e9', fillColor: '#0ea5e9' };\n const obj = boardRef.current!.create('point', [src, transformParent], attrs);\n pushCreationLog({ id, type: 'point', args: [srcId ?? src, transformLogRef], attrs });\n objMapRef.current.set(id, obj);\n return obj;\n });\n\n // 3. Recreate same-kind object from transformed points\n const baseStyle = { ...def.attrs, strokeColor: '#0ea5e9' };\n const strokeOnly = { ...baseStyle, fillColor: 'none', fillOpacity: 0 };\n const ids = transformedPoints.map((p) => localIdOf(p)).filter((s): s is string => !!s);\n switch (def.kind) {\n case 'point': /* nothing — already created */ break;\n case 'segment': create('segment', ids, baseStyle); break;\n case 'line': create('line', ids, baseStyle); break;\n case 'ray': create('line', ids, { ...baseStyle, straightFirst: false, straightLast: true }); break;\n case 'arrow': create('arrow', ids, baseStyle); break;\n case 'circleCenter': create('circle', ids, strokeOnly); break;\n case 'circle3': create('circumcircle', ids, strokeOnly); break;\n }\n setHistoryTick((t) => t + 1);\n }, [create, flashWarn, localIdOf, nextLabel, nextLocalId]);\n\n // Tái dựng 1 object từ entry log đã serialize. Dùng chung cho cả\n // initial-state replay và redo. Trả về true nếu tạo thành công.\n const recreateFromLogEntry = useCallback((el: SerializedElement): boolean => {\n const board = boardRef.current;\n if (!board) return false;\n const idMap = objMapRef.current;\n // Phải khớp logic với deserializeIntoBoard (serialize.ts): hỗ trợ cả nested\n // array (dilate chain) lẫn \"polyId:border:N\" (perpendicular xuống cạnh\n // polygon — vd đường cao). Trước đây chỉ flat-lookup → entry tham chiếu\n // border bị skip → đường cao mất khi mở re-edit.\n const resolve = (a: unknown): unknown => {\n if (typeof a === 'string') {\n if (idMap.has(a)) return idMap.get(a);\n const m = /^(.+):border:(\\d+)$/.exec(a);\n if (m) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const poly = idMap.get(m[1]) as any;\n const idx = parseInt(m[2], 10);\n if (poly && Array.isArray(poly.borders) && poly.borders[idx]) {\n return poly.borders[idx];\n }\n }\n }\n if (Array.isArray(a)) return a.map(resolve);\n return a;\n };\n const resolved = el.args.map(resolve);\n try {\n if (el.type === 'valueLabel') {\n const target = resolved[0];\n if (!target) return false;\n const txt = createValueLabelFor(target);\n if (!txt) return false;\n idMap.set(el.id, txt);\n valueLabelsRef.current.set(target, txt);\n return true;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, paletteFor(isDarkRef.current));\n const obj = board.create(el.type, resolved, themedAttrs);\n idMap.set(el.id, obj);\n return true;\n } catch (err) {\n console.warn('Recreate failed for', el.type, err);\n return false;\n }\n }, [createValueLabelFor]);\n\n // Undo: remove the most recently logged creation. Also clears any in-progress\n // polygon construction (pending picks + preview segments) so state is sane.\n const undoLast = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n while (creationLogRef.current.length > 0) {\n const last = creationLogRef.current.pop();\n if (!last) break;\n const obj = objMapRef.current.get(last.id);\n objMapRef.current.delete(last.id);\n if (obj) {\n safeJsx('MiniBoard.removeObject(undo)', () => b.removeObject(obj));\n clearPending();\n // Push entry này vào redoStack (chỉ entry có object thật).\n redoStackRef.current.push(last);\n setHistoryTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(undo)', () => b.update());\n return;\n }\n // Skip stale log entry (object đã biến mất từ trước) — không push vào redoStack\n }\n setHistoryTick((t) => t + 1);\n }, [clearPending]);\n\n // Redo: pop entry cuối khỏi redoStack và tái tạo object.\n const redoNext = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n const entry = redoStackRef.current.pop();\n if (!entry) {\n setHistoryTick((t) => t + 1);\n return;\n }\n const ok = recreateFromLogEntry(entry);\n if (ok) {\n creationLogRef.current.push(entry);\n }\n setHistoryTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(redo)', () => b.update());\n }, [recreateFromLogEntry]);\n\n // Global Ctrl/Cmd+Z + Esc while the panel is mounted. Skipped when focus is\n // in a text input so we don't hijack other undo flows. Capture phase + stop\n // propagation so Excalidraw's underlying undo doesn't also fire when the\n // panel is open on top of the whiteboard. Esc cancels in-progress picks.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z' && !e.shiftKey) {\n if (inField) return;\n e.preventDefault();\n e.stopPropagation();\n undoLastRef.current();\n return;\n }\n // Ctrl/Cmd+Shift+Z hoặc Ctrl+Y → redo\n if (\n (e.metaKey || e.ctrlKey) &&\n (\n (e.key.toLowerCase() === 'z' && e.shiftKey) ||\n (e.key.toLowerCase() === 'y' && !e.shiftKey)\n )\n ) {\n if (inField) return;\n e.preventDefault();\n e.stopPropagation();\n redoNextRef.current();\n return;\n }\n if (e.key === 'Escape' && !inField) {\n if (pendingRef.current.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearPendingRef.current();\n }\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearSelectionRef.current();\n }\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && !inField) {\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n deleteSelectedRef.current();\n }\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, []);\n\n // Translate a pointer event into JSXGraph SVG-pixel coords (the coord system\n // `hasPoint` uses). Falls back to manual rect math if `getMousePosition` is\n // unavailable (e.g. in tests with a mocked board).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const screenCoordsOf = useCallback((evt: any): [number, number] | null => {\n const b = boardRef.current;\n if (!b) return null;\n try {\n const mp = b.getMousePosition ? b.getMousePosition(evt) : null;\n if (mp && mp.length >= 2) return [mp[0], mp[1]];\n } catch { /* fall through */ }\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const cx = evt.clientX ?? evt.touches?.[0]?.clientX ?? 0;\n const cy = evt.clientY ?? evt.touches?.[0]?.clientY ?? 0;\n return [cx - rect.left, cy - rect.top];\n }\n return null;\n }, []);\n\n // Find which JSXGraph object (if any) is at a given pointer event.\n // JSXGraph's `hasPoint` expects coords in the board's SVG pixel space, not\n // viewport-relative clientX/Y. Without this, hits are offset by the\n // container's page position and existing points never snap.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const objectsAt = useCallback((evt: any): JxgObj[] => {\n const b = boardRef.current;\n if (!b) return [];\n const sc = screenCoordsOf(evt);\n if (!sc) return [];\n const [sx, sy] = sc;\n const list: JxgObj[] = [];\n safeJsx('MiniBoard.objectsAt.loop', () => {\n const objs = b.objectsList || [];\n for (const o of objs) {\n safeJsx('MiniBoard.objectsAt.hasPoint', () => {\n if (o.hasPoint && o.hasPoint(sx, sy)) list.push(o);\n });\n }\n });\n return list;\n }, [screenCoordsOf]);\n\n // Generous point-snap: JSXGraph's `hasPoint` for a point uses the visual\n // radius (~3px) which is too strict for click targeting. When a tool needs\n // a point pick, fall back to \"nearest point within tolPx pixels\".\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const findNearestPoint = useCallback((evt: any, tolPx: number = 12): JxgObj | null => {\n const b = boardRef.current;\n if (!b) return null;\n const sc = screenCoordsOf(evt);\n if (!sc) return null;\n const [sx, sy] = sc;\n const tol2 = tolPx * tolPx;\n type Best = { obj: JxgObj; d2: number };\n const bestRef: { current: Best | null } = { current: null };\n safeJsx('MiniBoard.findNearestPoint.loop', () => {\n const objs = b.objectsList || [];\n for (const o of objs) {\n safeJsx('MiniBoard.findNearestPoint.iter', () => {\n if (objKind(o) !== 'point') return;\n const pc = o.coords?.scrCoords;\n if (!pc) return;\n const dx = pc[1] - sx;\n const dy = pc[2] - sy;\n const d2 = dx * dx + dy * dy;\n const cur = bestRef.current;\n if (d2 <= tol2 && (!cur || d2 < cur.d2)) bestRef.current = { obj: o, d2 };\n });\n }\n });\n return bestRef.current ? bestRef.current.obj : null;\n }, [screenCoordsOf]);\n\n // Label-aware snap: if the click landed on a JSXGraph text label (drawn near\n // each named element with `display:'internal'`), follow it back to the owning\n // element. Without this, clicking the \"A\" label of a point with the segment\n // tool falls through to `findNearestPoint` and — when the label center is\n // beyond the 12 px tolerance — creates a duplicate point right next to A.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const promoteLabel = useCallback((o: JxgObj): JxgObj => {\n if (!o) return o;\n const t = (o.elType || o.type || '').toString().toLowerCase();\n if (t !== 'text') return o;\n const b = boardRef.current;\n if (!b) return o;\n const promoted = safeJsx<JxgObj | null>('MiniBoard.promoteLabel', () => {\n for (const c of (b.objectsList || [])) {\n if (c.label === o) return c;\n }\n return null;\n }, null);\n return promoted ?? o;\n }, []);\n\n // Pending transform state for rotate/dilate/regularPolygon (needs param popover)\n interface PendingTransform {\n tool: 'rotate' | 'dilate' | 'regularPolygon';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n center: any;\n anchorScreen: { x: number; y: number };\n }\n const pendingTransformRef = useRef<PendingTransform | null>(null);\n type TransformPopoverInfo = { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null;\n const transformSubsRef = useRef<Set<(info: TransformPopoverInfo) => void>>(new Set());\n const emitTransform = useCallback((info: TransformPopoverInfo) => {\n transformSubsRef.current.forEach((cb) => { safeJsx('MiniBoard.emitTransform.cb', () => cb(info)); });\n }, []);\n\n // Selection subscribers — emitted when Move tool single-clicks an object\n const selectSubsRef = useRef<Set<(snap: ObjectSnapshot) => void>>(new Set());\n const emitSelect = useCallback((snap: ObjectSnapshot) => {\n selectSubsRef.current.forEach((cb) => { safeJsx('MiniBoard.emitSelect.cb', () => cb(snap)); });\n }, []);\n\n // Track pointer-down position for click vs drag detection in Move tool\n const moveDownRef = useRef<{ sx: number; sy: number } | null>(null);\n // Track previous Move-tool click for double-click detection (open popover only\n // on 2nd click within 400ms on the same object).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const lastMoveClickRef = useRef<{ obj: any | null; time: number }>({ obj: null, time: 0 });\n\n // Initialize board\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n (async () => {\n const JXG = (await import('jsxgraph')).default;\n if (cancelled || !containerRef.current) return;\n jxgRef.current = JXG;\n // Render text/labels as SVG <text> (default 'html' uses absolute-positioned\n // <div> overlays, which are NOT captured when we clone the SVG to export\n // the stamp → labels disappear in inserted image).\n safeJsx('MiniBoard.applyJxgOptions', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n // Label tone theo theme — JSXGraph mặc định stroke black cho text label.\n opts.label.strokeColor = themeLabel(isDarkRef.current);\n opts.text.strokeColor = themeLabel(isDarkRef.current);\n }\n });\n const board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: initialState?.bbox ?? [-10, 10, 10, -10],\n axis: false, // We manage axis manually via toggle for clean default\n grid: false,\n showCopyright: false,\n showNavigation: true,\n // Keep 1:1 user→pixel ratio so circles stay circular regardless of the\n // container aspect ratio (Excalidraw panel is taller than wide and\n // without this circles became ellipses after reload).\n keepAspectRatio: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: true },\n // Looser hit-test radius so clicking on a thin segment/line/circle\n // actually registers without pixel-perfect aim. `precision` is a real\n // JSXGraph option (Options.precision) but isn't in the d.ts file.\n ...({ precision: { hasPoint: 8, mouse: 4, touch: 16 } } as Record<string, unknown>),\n });\n boardRef.current = board;\n\n // Replay initial state if any\n if (initialState && initialState.elements.length > 0) {\n for (const el of initialState.elements) {\n recreateFromLogEntry(el);\n }\n creationLogRef.current = [...initialState.elements];\n labelIdxRef.current = initialState.elements.filter(e => e.type === 'point').length;\n }\n\n // Initial axis/grid\n if (showAxisRef.current) {\n safeJsx('MiniBoard.initAxes', () => {\n axisObjsRef.current.x = board.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = board.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n });\n }\n if (showGridRef.current) {\n safeJsx('MiniBoard.initGrid', () => board.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 }));\n }\n\n // Pointer down: handle click-driven tool actions.\n // Full dispatch logic lives in handlers.ts (handleDown). A stable ctx\n // object is built here so the closure captured at mount stays thin.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('down', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleDown(ctx, e);\n });\n\n // Pointer up: DOUBLE-click on Move tool emits selection. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('up', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleUp(ctx, e);\n });\n\n // Mouse move: update phantom + marquee. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('move', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleMove(ctx, e);\n });\n\n onReady({\n getContainer: () => containerRef.current,\n // Sync toạ độ live của free point về log trước khi trả ra. JSXGraph\n // cho phép drag free point (args=[x,y] không có ref), việc drag chỉ\n // cập nhật obj.X()/Y() trên board chứ không đụng log → re-edit + Chèn\n // sẽ serialize toạ độ cũ → SVG không đổi → fileId trùng → user thấy\n // \"k thay đổi\". Line/segment/circle/polygon tham chiếu point qua id\n // nên auto-update theo.\n getCreationLog: () => creationLogRef.current.map((e) => {\n if (e.type !== 'point') return { ...e };\n const args = e.args;\n if (!Array.isArray(args) || args.length !== 2) return { ...e };\n if (typeof args[0] !== 'number' || typeof args[1] !== 'number') return { ...e };\n const obj = objMapRef.current.get(e.id) as\n | { X?: () => number; Y?: () => number }\n | undefined;\n if (!obj || typeof obj.X !== 'function' || typeof obj.Y !== 'function') return { ...e };\n const x = obj.X();\n const y = obj.Y();\n if (!Number.isFinite(x) || !Number.isFinite(y)) return { ...e };\n return { ...e, args: [x, y] };\n }),\n getBbox: () => boardRef.current ? boardRef.current.getBoundingBox() : [-10, 10, 10, -10],\n getShowAxis: () => showAxisRef.current,\n getShowGrid: () => showGridRef.current,\n setTool: (t: GeomTool) => handleToolChangeRef.current(t),\n getTool: () => toolRef.current,\n setShowAxis: (b: boolean) => setShowAxisRef.current(b),\n setShowGrid: (b: boolean) => setShowGridRef.current(b),\n undo: () => undoLastRef.current(),\n canUndo: () => creationLogRef.current.length > 0,\n redo: () => redoNextRef.current(),\n canRedo: () => redoStackRef.current.length > 0,\n subscribe: (cb: () => void) => {\n subscribersRef.current.add(cb);\n return () => { subscribersRef.current.delete(cb); };\n },\n snapshotObject,\n mutateObject,\n getAllPointNames: () => {\n const b = boardRef.current;\n if (!b) return [];\n const out: string[] = [];\n safeJsx('MiniBoard.getAllPointNames', () => {\n const objs = b.objectsList || [];\n for (const o of objs) {\n if (objKind(o) === 'point' && typeof o.name === 'string' && o.name) {\n out.push(o.name);\n }\n }\n });\n return out;\n },\n onSelect: (cb: (snap: ObjectSnapshot) => void) => {\n selectSubsRef.current.add(cb);\n return () => { selectSubsRef.current.delete(cb); };\n },\n onTransformParam: (cb: (info: TransformPopoverInfo) => void) => {\n transformSubsRef.current.add(cb);\n return () => { transformSubsRef.current.delete(cb); };\n },\n confirmTransformParam: (value: number) => {\n const p = pendingTransformRef.current;\n if (!p) return;\n if (p.tool === 'regularPolygon') {\n const n = Math.max(3, Math.round(value));\n const p1Id = localIdOf(p.source);\n const p2Id = localIdOf(p.center);\n if (p1Id && p2Id && boardRef.current) {\n try {\n create('regularpolygon', [p1Id, p2Id, n], {\n fillColor: '#1e3a8a',\n fillOpacity: 0.10,\n borders: { strokeColor: '@stroke', strokeWidth: 2 },\n });\n } catch (err) {\n console.warn('regularpolygon failed', err);\n }\n }\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n return;\n }\n const spec = p.tool === 'rotate'\n ? buildTransformSpec({ kind: 'rotate', center: p.center, angleDeg: value })\n : buildTransformSpec({ kind: 'dilate', center: p.center, k: value });\n finalizeTransformCreateRef.current(spec, p.source);\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n cancelTransformParam: () => {\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n getSelectionSize: () => selectedSetRef.current.size,\n clearSelection: () => clearSelectionRef.current(),\n deleteSelection: () => deleteSelectedRef.current(),\n });\n })();\n return () => {\n cancelled = true;\n if (previewRafRef.current != null) {\n cancelAnimationFrame(previewRafRef.current);\n previewRafRef.current = null;\n }\n if (boardRef.current && jxgRef.current) {\n safeJsx('MiniBoard.freeBoard', () => jxgRef.current!.JSXGraph.freeBoard(boardRef.current));\n boardRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n // React to axis/grid toggle changes after init\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('MiniBoard.toggleAxis', () => {\n // Remove existing axes if present\n if (axisObjsRef.current.x) { safeJsx('MiniBoard.removeObject(axisX)', () => b.removeObject(axisObjsRef.current.x)); axisObjsRef.current.x = undefined; }\n if (axisObjsRef.current.y) { safeJsx('MiniBoard.removeObject(axisY)', () => b.removeObject(axisObjsRef.current.y)); axisObjsRef.current.y = undefined; }\n if (showAxis) {\n axisObjsRef.current.x = b.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = b.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n }\n b.update();\n });\n }, [showAxis]);\n\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('MiniBoard.toggleGrid', () => {\n // Find existing grid objects and remove\n const objs = Object.values(b.objects || {}) as JxgObj[];\n for (const o of objs) {\n if (o && (o.elType === 'grid' || o.type === 'grid' || (o.visProp && o.visProp.type === 'grid'))) {\n safeJsx('MiniBoard.removeObject(grid)', () => b.removeObject(o));\n }\n }\n if (showGrid) {\n b.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 });\n }\n b.update();\n });\n }, [showGrid]);\n\n const handleToolChange = useCallback((t: GeomTool) => {\n clearPending();\n // Update the ref synchronously so subsequent pointer-down events (e.g. a\n // fast user click immediately after picking a tool) see the new tool\n // without waiting for React's commit phase.\n toolRef.current = t;\n setTool(t);\n // Disable JSXGraph pan while the user is in the select tool so that\n // drag-empty starts a marquee selection instead of panning the board.\n // Re-enable for every other tool (board pan is the default).\n const b = boardRef.current;\n if (b) {\n safeJsx('MiniBoard.setPanForTool', () => {\n if (b.attr?.pan) b.attr.pan.enabled = (t !== 'select');\n });\n }\n }, [clearPending]);\n\n // Stable ref so onReady closure (captured at mount) can call latest handler.\n const handleToolChangeRef = useRef(handleToolChange);\n handleToolChangeRef.current = handleToolChange;\n\n // Subscribers thông báo bên ngoài khi state thay đổi (tool / axis / grid / undo)\n const subscribersRef = useRef<Set<() => void>>(new Set());\n const notifySubscribers = useCallback(() => {\n subscribersRef.current.forEach((cb) => {\n safeJsx('MiniBoard.notifySubscriber.cb', () => cb());\n });\n }, []);\n\n // Phát tín hiệu khi state thay đổi\n useEffect(() => { notifySubscribers(); }, [tool, showAxis, showGrid, historyTick, notifySubscribers]);\n\n const undoLastRef = useRef(undoLast);\n undoLastRef.current = undoLast;\n const redoNextRef = useRef(redoNext);\n redoNextRef.current = redoNext;\n const clearPendingRef = useRef(clearPending);\n clearPendingRef.current = clearPending;\n const finalizeTransformCreateRef = useRef(finalizeTransformCreate);\n finalizeTransformCreateRef.current = finalizeTransformCreate;\n const clearSelectionRef = useRef(clearSelection);\n clearSelectionRef.current = clearSelection;\n const deleteSelectedRef = useRef(deleteSelected);\n deleteSelectedRef.current = deleteSelected;\n const emitTransformRef = useRef(emitTransform);\n emitTransformRef.current = emitTransform;\n const setShowAxisRef = useRef(setShowAxis);\n setShowAxisRef.current = setShowAxis;\n const setShowGridRef = useRef(setShowGrid);\n setShowGridRef.current = setShowGrid;\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"jxgmini-container\"\n className=\"h-full min-h-0 bg-white\"\n style={{ touchAction: 'none' }}\n />\n );\n};\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-6 w-6 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS, GROUP_LABELS, type GeomTool, type ToolDef } from './MiniBoard';\nimport { GROUP_ORDER, letterForGroup, type GeomGroup } from './tools';\nimport { MobileToolDrawer, type MobileToolGroup } from '../../shared/MobileToolDrawer';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shared shell (desktop) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isDark?: boolean;\n closeLabel?: string;\n}\n\nfunction Shell({ title, icon, onClose, children, isDark, closeLabel = 'Đóng' }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label={closeLabel}\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Icons ----------\n\nconst GeometryIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function UndoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n );\n}\n\nexport function RedoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"21 7 21 13 15 13\" />\n <path d=\"M20.49 13a9 9 0 1 1-2.13-9.36L21 7\" />\n </svg>\n );\n}\n\nfunction AxisIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nfunction GridIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n\n// ---------- Props ----------\n\ninterface GeometryLeftPanelProps {\n activeTool: GeomTool;\n onToolChange: (t: GeomTool) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n onClose: () => void;\n isDark?: boolean;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n /** Chord shortcut: group đang được focus (sau khi bấm letter). null = không active. */\n chordGroup?: GeomGroup | null;\n}\n\n// ---------- Tooltip portal (desktop hover) ----------\n\nfunction useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: ToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n\n// ---------- Desktop left panel ----------\n\nfunction DesktopGeometryPanel(props: GeometryLeftPanelProps) {\n const { activeTool, onToolChange, showAxis, showGrid, onShowAxisChange, onShowGridChange, onUndo, canUndo, onRedo, canRedo, onClose, isDark, chordGroup } = props;\n\n const grouped = useMemo(() => {\n return TOOLS.reduce<Record<string, ToolDef[]>>((acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n }, {});\n }, []);\n const groupKeys = useMemo(\n () => GROUP_ORDER.filter((g) => grouped[g]),\n [grouped],\n );\n\n const activeGroupTools: ToolDef[] | null = chordGroup\n ? (grouped[chordGroup] ?? null)\n : null;\n\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n return (\n <>\n <Shell title=\"Hình học\" icon={GeometryIconHeader} onClose={onClose} isDark={isDark}>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxis}\n onChange={(e) => onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n Trục toạ độ\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showGrid}\n onChange={(e) => onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n </Section>\n\n {groupKeys.map((group) => {\n const isChordActive = chordGroup === group;\n const dimmed = chordGroup !== null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive\n ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1'\n : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{GROUP_LABELS[group]}</span>\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {letterForGroup(group)}\n </span>\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group].map((t, i) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'relative flex h-8 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n <span\n data-testid={`chord-num-${t.key}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n active\n ? 'text-white/70'\n : isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {i + 1}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n );\n })}\n\n {chordGroup && activeGroupTools && (\n <div\n data-testid=\"chord-hint\"\n className=\"mt-1 rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {letterForGroup(chordGroup)}\n </span>\n <span className=\"mx-1 text-slate-400\">→</span>\n {activeGroupTools.map((t, i) => (\n <span key={t.key} className=\"mr-2 inline-block\">\n <span className=\"font-mono font-semibold text-emerald-700\">\n {i + 1}\n </span>\n <span className=\"ml-1\">{t.label}</span>\n </span>\n ))}\n <span className=\"text-slate-400\">Esc huỷ</span>\n </div>\n )}\n </Shell>\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\n// ---------- Mobile geometry panel (redesigned) ----------\n\nfunction MobileGeometryPanel(props: GeometryLeftPanelProps) {\n const {\n activeTool,\n onToolChange,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onRedo,\n canRedo,\n isDark,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = useMemo<MobileToolGroup<GeomTool, ToolDef['group']>[]>(() => {\n const acc = new Map<ToolDef['group'], ToolDef[]>();\n for (const t of TOOLS) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n return Array.from(acc.entries()).map(([group, tools]) => ({\n group,\n groupLabel: GROUP_LABELS[group],\n tools: tools.map((t) => ({ key: t.key, label: t.label, icon: t.icon })),\n }));\n }, []);\n\n return (\n <MobileToolDrawer\n title=\"Hình học\"\n headerIcon={GeometryIconHeader}\n testId=\"stamp-left-panel\"\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={[\n {\n label: 'Trục',\n icon: <AxisIcon />,\n pressed: showAxis,\n onToggle: onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: 'Lưới',\n icon: <GridIcon />,\n pressed: showGrid,\n onToggle: onShowGridChange,\n testId: 'toggle-grid',\n },\n ]}\n actions={[\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: onUndo,\n disabled: !canUndo,\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: onRedo,\n disabled: !canRedo,\n },\n ]}\n groups={groups}\n activeTool={activeTool}\n onToolSelect={onToolChange}\n />\n );\n}\n\n// ---------- Public entry point ----------\n\nexport function LeftPanel(props: GeometryLeftPanelProps) {\n if (props.isMobile) {\n return <MobileGeometryPanel {...props} />;\n }\n return <DesktopGeometryPanel {...props} />;\n}\n\n// Alias for back-compat\nexport { LeftPanel as GeometryLeftPanel };\n","// 8 màu chính lấy từ Excalidraw DEFAULT_ELEMENT_STROKE_COLOR_PALETTE.\n// Nguồn: @excalidraw/excalidraw — packages/excalidraw/colors.ts (top row chuẩn).\n// Cần đồng bộ tay nếu Excalidraw đổi palette ở major bump.\nexport const STROKE_PALETTE = [\n '#1e1e1e', // black\n '#e03131', // red\n '#e8590c', // orange\n '#f08c00', // yellow\n '#2f9e44', // green\n '#1971c2', // blue\n '#9c36b5', // grape\n '#868e96', // gray\n] as const;\n\nexport type StrokeColor = (typeof STROKE_PALETTE)[number];\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 768px)';\nconst NO_HOVER_QUERY = '(hover: none)';\n\nexport interface MobileState {\n /** Viewport ≤ 768px — dùng để chuyển full-screen modal + drawer. */\n isMobile: boolean;\n /** Device không có hover (touch-only) — dùng để ẩn hover tooltips. */\n isTouchOnly: boolean;\n}\n\nfunction readMatch(query: string): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n try {\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\n/**\n * SSR-safe mobile detection qua matchMedia. Trả về `{ isMobile, isTouchOnly }`.\n * Re-render khi viewport resize hoặc input modality đổi (e.g., gắn Bluetooth mouse).\n */\nexport function useIsMobile(): MobileState {\n const [state, setState] = useState<MobileState>(() => ({\n isMobile: readMatch(MOBILE_QUERY),\n isTouchOnly: readMatch(NO_HOVER_QUERY),\n }));\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const tql = window.matchMedia(NO_HOVER_QUERY);\n const update = () => {\n setState({ isMobile: mql.matches, isTouchOnly: tql.matches });\n };\n update();\n mql.addEventListener('change', update);\n tql.addEventListener('change', update);\n return () => {\n mql.removeEventListener('change', update);\n tql.removeEventListener('change', update);\n };\n }, []);\n\n return state;\n}\n","'use client';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\nexport type ObjKind = 'point' | 'line' | 'circle';\nexport type PointFace = 'o' | 'circle' | 'cross' | 'plus';\n\nexport interface PropertyPatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n /** Bật/tắt value-label động (độ dài segment / bán kính circle). */\n valueLabel?: boolean;\n}\n\ninterface CommonProps {\n anchor: { x: number; y: number };\n onClose: () => void;\n onMutate: (patch: PropertyPatch) => void;\n isDark?: boolean;\n /** Trả về danh sách tên point hiện có (để rename auto-disambiguate). */\n getAllNames?: () => string[];\n}\n\ninterface PointProps extends CommonProps {\n kind: 'point';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n currentFace: PointFace;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n}\n\ninterface LineOrCircleProps extends CommonProps {\n kind: 'line' | 'circle';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n /** Có đang hiện value-label động không. */\n currentShowValue?: boolean;\n}\n\ntype Props = PointProps | LineOrCircleProps;\n\nconst DASH_OPTIONS: Array<{ value: number; label: string }> = [\n { value: 0, label: 'Nét liền' },\n { value: 2, label: 'Nét đứt' },\n { value: 1, label: 'Nét chấm' },\n];\n\nconst WIDTH_OPTIONS = [1, 2, 3];\n\nconst FACE_OPTIONS: Array<{ value: PointFace; symbol: string }> = [\n { value: 'o', symbol: '●' },\n { value: 'circle', symbol: '◯' },\n { value: 'cross', symbol: '✕' },\n { value: 'plus', symbol: '✚' },\n];\n\n// Unicode subscript digits — dùng để tự đặt tên duy nhất khi user nhập trùng.\n// Lưu dưới dạng ký tự subscript thì JSXGraph SVG <text> render đúng \"B₂\"\n// như label một glyph, không cần MathJax/KaTeX.\nconst SUB_DIGITS = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉'];\nconst SUB_SET = new Set(SUB_DIGITS);\n\nfunction toSubscript(n: number): string {\n return String(n).split('').map((d) => SUB_DIGITS[+d] ?? d).join('');\n}\n\nfunction stripTrailingSubscript(s: string): string {\n let i = s.length;\n while (i > 0 && SUB_SET.has(s[i - 1])) i--;\n return s.slice(0, i);\n}\n\nfunction disambiguateName(name: string, existing: Set<string>): string {\n if (!name) return name;\n if (!existing.has(name)) return name;\n const base = stripTrailingSubscript(name) || name;\n for (let n = 2; n < 1000; n++) {\n const candidate = base + toSubscript(n);\n if (!existing.has(candidate)) return candidate;\n }\n return name;\n}\n\ntype Section = 'color' | 'style' | 'size' | 'name' | null;\n\n// Inline icons (small, monochrome) — match the visual weight of Excalidraw's\n// floating action bar in the screenshot. All 16px viewBox 24x24.\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n style: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" /></svg>\n ),\n size: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\"><line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\" strokeWidth=\"1\" /><line x1=\"4\" y1=\"13\" x2=\"20\" y2=\"13\" strokeWidth=\"2\" /><line x1=\"4\" y1=\"17\" x2=\"20\" y2=\"17\" strokeWidth=\"3.2\" /></svg>\n ),\n name: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><text x=\"2\" y=\"17\" fontSize=\"14\" fontFamily=\"serif\" fontWeight=\"700\">A</text><text x=\"12\" y=\"17\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\">a</text></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\" /><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" /><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" /><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" /></svg>\n ),\n};\n\nexport const PropertiesPopover: React.FC<Props> = (props) => {\n const { anchor, onClose, onMutate, isDark, getAllNames } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n // Clamp anchor vào viewport sau khi render (measure actual rect).\n // Trên mobile, force bottom-center thay vì follow anchor (anchor có thể nằm\n // sát mép màn hình hoặc dưới ngón tay user → khó tap).\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n // Bottom-center, 12px above bottom safe area.\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n const initialName =\n props.kind === 'point' ? props.currentName : (props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const [name, setName] = useState<string>(initialName);\n // Khi popover mở lại trên đối tượng khác, đồng bộ name input.\n useEffect(() => {\n setName(initialName);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialName]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n // PointerDown covers mouse + touch + pen — replaces legacy mousedown listener\n // which excluded touch/pen and broke click-outside trên mobile.\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const pickColor = (c: string) => {\n onMutate({ attrs: { strokeColor: c, fillColor: props.kind === 'circle' ? 'none' : c, color: c } });\n };\n const pickDash = (d: number) => onMutate({ attrs: { dash: d } });\n const pickWidth = (w: number) => onMutate({ attrs: { strokeWidth: w } });\n const pickFace = (f: PointFace) => onMutate({ attrs: { face: f } });\n\n const currentName = (props.kind === 'point' || props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const commitName = () => {\n const trimmed = name.trim();\n if (trimmed === currentName) return;\n // Cho phép xoá tên (empty); chỉ disambiguate khi user nhập 1 cái gì đó.\n let final = trimmed;\n if (trimmed) {\n const others = new Set((getAllNames?.() ?? []).filter((n) => n !== currentName));\n final = disambiguateName(trimmed, others);\n }\n if (final !== name) setName(final);\n onMutate({ attrs: { name: final } });\n };\n\n const toggleShowLabel = (next: boolean) => onMutate({ attrs: { withLabel: next } });\n const toggleShowValue = (next: boolean) => onMutate({ valueLabel: next });\n\n const doDelete = () => { onMutate({ remove: true }); onClose(); };\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n\n const currentColor = props.currentColor;\n const currentDash = props.currentDash;\n const currentWidth = props.currentWidth;\n\n if (typeof document === 'undefined') return null;\n\n // Pill toolbar: row of icon buttons, separator before trash. Click một icon\n // để bung panel chi tiết bên dưới. Trash xoá ngay (không có panel).\n const PillBtn = ({ id, label, icon, active, onClick, indicatorColor }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean;\n onClick: () => void; indicatorColor?: string;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n {indicatorColor && (\n <span\n aria-hidden\n className=\"absolute bottom-0.5 left-1/2 -translate-x-1/2 h-1 w-4 rounded-full\"\n style={{ background: indicatorColor }}\n />\n )}\n </button>\n );\n\n const colorIndicatorTint = useMemo(() => currentColor, [currentColor]);\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label=\"Thuộc tính đối tượng\"\n >\n {/* Pill toolbar */}\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <PillBtn id=\"color\" label=\"Màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} indicatorColor={colorIndicatorTint} />\n <PillBtn id=\"style\" label=\"Kiểu\" icon={Icons.style} active={section === 'style'} onClick={() => toggleSection('style')} />\n <PillBtn id=\"size\" label=\"Độ dày\" icon={Icons.size} active={section === 'size'} onClick={() => toggleSection('size')} />\n <PillBtn id=\"name\" label=\"Tên\" icon={Icons.name} active={section === 'name'} onClick={() => toggleSection('name')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {/* Sub-panel — chỉ hiện khi user chọn 1 icon */}\n {section && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n {section === 'color' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => pickColor(c)}\n className={`h-6 w-6 rounded border ${currentColor === c ? 'border-emerald-500 ring-2 ring-emerald-300' : 'border-slate-200'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Kiểu</span>\n {props.kind === 'point' ? (\n <div className=\"flex gap-1\">\n {FACE_OPTIONS.map((f) => (\n <button\n key={f.value}\n aria-label={`Hình ${f.value}`}\n onClick={() => pickFace(f.value)}\n className={`h-7 w-7 rounded border text-sm ${(props as PointProps).currentFace === f.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {f.symbol}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex gap-1\">\n {DASH_OPTIONS.map((d) => (\n <button\n key={d.value}\n aria-label={`Kiểu ${d.label.toLowerCase()}`}\n onClick={() => pickDash(d.value)}\n className={`flex-1 rounded border px-1 py-1 text-[11px] ${currentDash === d.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {d.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {section === 'size' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Độ dày</span>\n <div className=\"flex gap-1\">\n {WIDTH_OPTIONS.map((w) => (\n <button\n key={w}\n aria-label={`Độ dày ${w}`}\n onClick={() => pickWidth(w)}\n className={`flex-1 rounded border py-1 ${currentWidth === w ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n <span className=\"inline-block rounded bg-slate-800\" style={{ width: 30, height: w }} />\n </button>\n ))}\n </div>\n </div>\n )}\n\n {section === 'name' && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Tên</span>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitName}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitName(); } }}\n autoFocus\n placeholder={props.kind === 'point' ? 'A, B, …' : props.kind === 'line' ? 'a, b, f, …' : 'O, c, …'}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <span className=\"text-[10px] text-slate-400\">Trùng tên sẽ tự thêm chỉ số (B → B₂)</span>\n </div>\n\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị tên</span>\n <input\n type=\"checkbox\"\n checked={props.currentShowLabel !== false}\n onChange={(e) => toggleShowLabel(e.target.checked)}\n aria-label=\"Hiển thị tên\"\n />\n </label>\n\n {(props.kind === 'line' || props.kind === 'circle') && (\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị giá trị</span>\n <input\n type=\"checkbox\"\n checked={!!(props as LineOrCircleProps).currentShowValue}\n onChange={(e) => toggleShowValue(e.target.checked)}\n aria-label=\"Hiển thị giá trị\"\n />\n </label>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ParamKind = 'rotate' | 'dilate' | 'regularPolygon';\n\ninterface Props {\n kind: ParamKind;\n anchor: { x: number; y: number };\n defaultValue: number;\n onConfirm: (value: number) => void;\n onCancel: () => void;\n isDark?: boolean;\n}\n\nconst LABELS: Record<ParamKind, { aria: string; label: string; step: number; min?: number }> = {\n rotate: { aria: 'Góc quay', label: 'Góc (°)', step: 15 },\n dilate: { aria: 'Tỷ số k', label: 'Tỷ số k', step: 0.5 },\n regularPolygon: { aria: 'Số cạnh đa giác đều', label: 'Số cạnh (n ≥ 3)', step: 1, min: 3 },\n};\n\nexport const TransformParamPopover: React.FC<Props> = ({ kind, anchor, defaultValue, onConfirm, onCancel, isDark }) => {\n const [value, setValue] = useState<number>(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const meta = LABELS[kind];\n\n useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n\n const submit = () => {\n let v = Number.isFinite(value) ? value : defaultValue;\n if (kind === 'regularPolygon') {\n v = Math.max(3, Math.round(v));\n }\n onConfirm(v);\n };\n\n if (typeof document === 'undefined') return null;\n\n const node = (\n <div\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-2 rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5`}\n style={{ left: anchor.x, top: anchor.y, minWidth: 180 }}\n role=\"dialog\"\n aria-label={meta.aria}\n >\n <label className=\"text-xs font-medium text-slate-700\">{meta.label}</label>\n <input\n ref={inputRef}\n type=\"number\"\n value={value}\n step={meta.step}\n min={meta.min}\n onChange={(e) => setValue(parseFloat(e.target.value))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n else if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={onCancel}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-xs text-slate-700 hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={submit}\n className=\"rounded bg-emerald-600 px-2 py-1 text-xs font-medium text-white hover:bg-emerald-700\"\n >\n Áp dụng\n </button>\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { JSXGraphMiniBoard, type MiniBoardHandle, type GeomTool, type ObjectSnapshot } from './MiniBoard';\nimport { serializeBoard, type SerializedBoard } from '../serialize';\nimport { renderGeometrySvgFromState } from '../render';\nimport { PropertiesPopover } from './PropertiesPopover';\nimport { TransformParamPopover } from './TransformParamPopover';\nimport { UndoIcon, RedoIcon } from './LeftPanel';\n\ninterface Props {\n initialState: SerializedBoard | null;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Khi true, panel position offset left để chừa chỗ cho StampLeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Callback khi handle/state thay đổi — parent sync LeftPanel state. */\n onStateChange?: (state: GeomBoardState) => void;\n isDark?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n /** Mobile header: undo/redo. Bypass LeftPanel để user truy cập nhanh. */\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n}\n\nexport interface GeomBoardState {\n tool: GeomTool;\n showAxis: boolean;\n showGrid: boolean;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport interface GeometryEditorPanelHandle {\n setTool: (t: GeomTool) => void;\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n undo: () => void;\n redo: () => void;\n /** Trigger Chèn programmatically (cho auto-insert khi click outside). */\n insert: () => boolean;\n /** Có nội dung để chèn không? */\n hasContent: () => boolean;\n}\n\nexport const GeometryEditorPanel = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanel({ initialState, onInsert, onClose, withLeftPanel = false, onStateChange, isDark, isMobile = false, onOpenDrawer, onUndo, onRedo, canUndo, canRedo }, ref) {\n const handleRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [hasContent, setHasContent] = useState(false);\n const [propsPopover, setPropsPopover] = useState<ObjectSnapshot | null>(null);\n const [transformPopover, setTransformPopover] = useState<{ tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null>(null);\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => { onStateChangeRef.current = onStateChange; }, [onStateChange]);\n\n const emitState = useCallback(() => {\n const h = handleRef.current;\n if (!h) return;\n setHasContent(h.getCreationLog().length > 0);\n const cb = onStateChangeRef.current;\n if (!cb) return;\n cb({\n tool: h.getTool(),\n showAxis: h.getShowAxis(),\n showGrid: h.getShowGrid(),\n canUndo: h.canUndo(),\n canRedo: h.canRedo(),\n });\n }, []);\n\n const handleReady = useCallback((h: MiniBoardHandle) => {\n handleRef.current = h;\n setReady(true);\n emitState();\n // Subscribe để parent biết khi nào tool/axis/grid/undo thay đổi\n h.subscribe(emitState);\n h.onSelect((snap: ObjectSnapshot) => setPropsPopover(snap));\n h.onTransformParam((info) => setTransformPopover(info));\n }, [emitState]);\n\n // Build serialized state (sentinels intact) — async vì SVG render offscreen\n // với light palette để Excalidraw filter tự đảo khi dark mode.\n const performInsert = useCallback((): boolean => {\n if (!handleRef.current) return false;\n const log = handleRef.current.getCreationLog();\n if (log.length === 0) return false;\n const bbox = handleRef.current.getBbox();\n const showAxis = handleRef.current.getShowAxis();\n const showGrid = handleRef.current.getShowGrid();\n const serialized = serializeBoard(\n { getBoundingBox: () => bbox, create: () => undefined },\n log,\n { showAxis, showGrid },\n );\n const jsonState = JSON.stringify(serialized);\n // Fire-and-forget. Caller (`tryInsert`) chỉ cần biết có nội dung không.\n void (async () => {\n try {\n const svgString = await renderGeometrySvgFromState(jsonState);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n })();\n return true;\n }, [onInsert]);\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n useImperativeHandle(ref, () => ({\n setTool: (t) => handleRef.current?.setTool(t),\n setShowAxis: (b) => handleRef.current?.setShowAxis(b),\n setShowGrid: (b) => handleRef.current?.setShowGrid(b),\n undo: () => handleRef.current?.undo(),\n redo: () => handleRef.current?.redo(),\n insert: performInsert,\n hasContent: () => (handleRef.current?.getCreationLog().length ?? 0) > 0,\n }), [performInsert]);\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học\"\n data-testid=\"geometry-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : 'h-[540px] max-h-[85vh] w-[640px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"3,18 12,3 21,18\" />\n <circle cx=\"12\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"21\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n Dựng hình học\n </h3>\n {isMobile && (\n <>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n aria-label=\"Hoàn tác\"\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n data-testid=\"undo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n aria-label=\"Làm lại\"\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n data-testid=\"redo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <RedoIcon />\n </button>\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geometry-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n </>\n )}\n <button onClick={onClose} aria-label=\"Đóng\" className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1\" style={isMobile ? undefined : { height: '420px' }}>\n <JSXGraphMiniBoard\n onReady={handleReady}\n initialState={initialState}\n isDark={isDark}\n />\n </div>\n {propsPopover && (\n propsPopover.kind === 'point' ? (\n <PropertiesPopover\n kind=\"point\"\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentFace={propsPopover.face}\n currentShowLabel={propsPopover.showLabel}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n // Refresh snapshot để UI checkbox phản ánh state mới\n if (typeof patch.valueLabel === 'boolean' || patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n }}\n />\n ) : (\n <PropertiesPopover\n kind={propsPopover.kind}\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentShowLabel={propsPopover.showLabel}\n currentShowValue={propsPopover.showValue}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n if (typeof patch.valueLabel === 'boolean') {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n if (patch.attrs && 'withLabel' in patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showLabel: !!patch.attrs?.withLabel } : cur);\n }\n }}\n />\n )\n )}\n\n {transformPopover && (\n <TransformParamPopover\n kind={transformPopover.tool}\n anchor={transformPopover.anchor}\n defaultValue={\n transformPopover.tool === 'rotate' ? 90\n : transformPopover.tool === 'dilate' ? 2\n : 6\n }\n isDark={isDark}\n onConfirm={(v) => { handleRef.current?.confirmTransformParam(v); setTransformPopover(null); }}\n onCancel={() => { handleRef.current?.cancelTransformParam(); setTransformPopover(null); }}\n />\n )}\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geometry-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n );\n },\n);\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseChordShortcutArgs<G extends string> {\n groupOrder: readonly G[];\n tools: ReadonlyArray<{ key: string; group: G }>;\n onSelect: (toolKey: string) => void;\n enabled: boolean;\n}\n\ninterface UseChordShortcutResult<G extends string> {\n chordGroup: G | null;\n cancel: () => void;\n}\n\nconst A_CODE = 'a'.charCodeAt(0);\n\nfunction isFieldFocused(): boolean {\n const ae = (typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null);\n return !!(\n ae &&\n (ae.tagName === 'INPUT' ||\n ae.tagName === 'TEXTAREA' ||\n ae.isContentEditable)\n );\n}\n\nexport function useChordShortcut<G extends string>(\n args: UseChordShortcutArgs<G>,\n): UseChordShortcutResult<G> {\n const { groupOrder, tools, onSelect, enabled } = args;\n\n const [chordGroup, setChordGroup] = useState<G | null>(null);\n\n const groupOrderRef = useRef(groupOrder);\n const toolsRef = useRef(tools);\n const onSelectRef = useRef(onSelect);\n const chordGroupRef = useRef<G | null>(null);\n\n groupOrderRef.current = groupOrder;\n toolsRef.current = tools;\n onSelectRef.current = onSelect;\n // chordGroupRef được sync ngay trong handler (xem `setChord` dưới đây)\n // thay vì ghi từ render body — nếu ghi ở body sẽ bị React batch hoá khi\n // hai event xảy ra trong cùng một act() (event sau đọc giá trị cũ).\n\n const cancel = useCallback(() => {\n chordGroupRef.current = null;\n setChordGroup(null);\n }, []);\n\n useEffect(() => {\n if (!enabled) return;\n\n const setChord = (next: G | null) => {\n chordGroupRef.current = next;\n setChordGroup(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isFieldFocused()) return;\n\n const key = e.key;\n const lower = key.length === 1 ? key.toLowerCase() : key;\n\n if (key === 'Escape') {\n if (chordGroupRef.current !== null) {\n e.preventDefault();\n e.stopPropagation();\n setChord(null);\n }\n return;\n }\n\n if (lower.length === 1 && lower >= 'a' && lower <= 'z') {\n const idx = lower.charCodeAt(0) - A_CODE;\n if (idx < groupOrderRef.current.length) {\n e.preventDefault();\n e.stopPropagation();\n setChord(groupOrderRef.current[idx]);\n }\n return;\n }\n\n if (key >= '1' && key <= '9') {\n const active = chordGroupRef.current;\n if (active === null) return;\n const n = key.charCodeAt(0) - '1'.charCodeAt(0); // 0-indexed\n const toolsInGroup = toolsRef.current.filter(\n (t) => t.group === active,\n );\n e.preventDefault();\n e.stopPropagation();\n if (n < toolsInGroup.length) {\n onSelectRef.current(toolsInGroup[n].key);\n }\n setChord(null);\n return;\n }\n };\n\n window.addEventListener('keydown', onKey, { capture: true });\n return () => {\n window.removeEventListener('keydown', onKey, { capture: true });\n };\n }, [enabled]);\n\n return { chordGroup, cancel };\n}\n","export interface SvgImageResult {\n dataURL: string;\n fileId: string;\n width: number;\n height: number;\n mimeType: 'image/svg+xml';\n}\n\nasync function hashString(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest)).slice(0, 16).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (h1 >>> 0).toString(16).padStart(8, '0') + (h2 >>> 0).toString(16).padStart(8, '0');\n}\n\nfunction parseSize(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n // Fallback: try viewBox\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n return attr === 'width' ? 200 : 100;\n}\n\n// SVG → image element data. Skips canvas rasterization entirely (canvas with\n// foreignObject + external resources gets tainted by browser security model,\n// blocking toDataURL). Excalidraw renders SVG natively via mimeType 'image/svg+xml'.\nexport async function svgToImageElement(svg: string): Promise<SvgImageResult> {\n const width = parseSize(svg, 'width');\n const height = parseSize(svg, 'height');\n // Use UTF-8 safe base64 encoding (btoa fails on non-Latin1 chars)\n const utf8 = unescape(encodeURIComponent(svg));\n const dataURL = 'data:image/svg+xml;base64,' + btoa(utf8);\n const fileId = await hashString(dataURL);\n return { dataURL, fileId, width, height, mimeType: 'image/svg+xml' };\n}\n","import { svgToImageElement } from './svgToImage';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData từ kích thước SVG vừa đo được. Đặt làm factory để\n * các stamp loại khác nhau (geometry cần svgWidth/svgHeight, latex không cần)\n * đều có thể chèn data tuỳ ý.\n */\n makeCustomData: (width: number, height: number) => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. svgToImageElement(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await svgToImageElement(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData(width, height);\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width, height, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { GeometryLeftPanel } from './editor/LeftPanel';\nimport {\n GeometryEditorPanel,\n type GeometryEditorPanelHandle,\n type GeomBoardState,\n} from './editor/EditorPanel';\nimport type { GeomTool } from './editor/MiniBoard';\nimport { GROUP_ORDER, TOOLS } from './editor/tools';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport type { SerializedBoard } from './serialize';\nimport { isGeometryCustomData, type GeometryCustomData } from './types';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\n\nconst INITIAL_GEOM_STATE: GeomBoardState = {\n tool: 'move',\n showAxis: false,\n showGrid: false,\n canUndo: false,\n canRedo: false,\n};\n\nexport const GeometryStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function GeometryStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GeometryEditorPanelHandle | null>(null);\n const [geomState, setGeomState] = useState<GeomBoardState>(INITIAL_GEOM_STATE);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS,\n onSelect: (key) => panelRef.current?.setTool(key as GeomTool),\n enabled: !isMobile,\n });\n\n const initialState = useMemo<SerializedBoard | null>(() => {\n if (!editingElement) return null;\n if (!isGeometryCustomData(editingElement.customData)) return null;\n try {\n return JSON.parse(editingElement.customData.jsonState) as SerializedBoard;\n } catch {\n console.warn('GeometryStampHost: customData jsonState corrupted');\n return null;\n }\n }, [editingElement]);\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (width, height): GeometryCustomData => ({\n kind: 'geometry',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <GeometryLeftPanel\n activeTool={geomState.tool}\n onToolChange={(t: GeomTool) => panelRef.current?.setTool(t)}\n showAxis={geomState.showAxis}\n showGrid={geomState.showGrid}\n onShowAxisChange={(b) => panelRef.current?.setShowAxis(b)}\n onShowGridChange={(b) => panelRef.current?.setShowGrid(b)}\n onUndo={() => panelRef.current?.undo()}\n canUndo={geomState.canUndo}\n onRedo={() => panelRef.current?.redo()}\n canRedo={geomState.canRedo}\n onClose={onClose}\n isDark={isDark}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n chordGroup={chordGroup}\n />\n <GeometryEditorPanel\n ref={panelRef}\n initialState={initialState}\n onInsert={handleInsert}\n onClose={onClose}\n onStateChange={setGeomState}\n withLeftPanel={!isMobile}\n isDark={isDark}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n onUndo={() => panelRef.current?.undo()}\n onRedo={() => panelRef.current?.redo()}\n canUndo={geomState.canUndo}\n canRedo={geomState.canRedo}\n />\n </>\n );\n },\n);\n","let cachedCss: string | null = null;\n\n// Absolute origin để inlined CSS có thể load fonts khi SVG render trong\n// Excalidraw / image context (relative paths fail trong nested URL contexts).\nfunction absoluteOrigin(): string {\n if (typeof window !== 'undefined' && window.location) return window.location.origin;\n return '';\n}\n\nasync function loadKatexCss(): Promise<string> {\n if (cachedCss !== null) return cachedCss;\n try {\n if (typeof fetch === 'function') {\n const res = await fetch('/katex.min.css');\n if (res.ok) {\n let css = await res.text();\n // Rewrite relative font URLs → absolute origin URLs.\n // KaTeX CSS uses url(fonts/...) — relative to /katex.min.css → /fonts/...\n // Trong SVG <foreignObject> được render thành image, relative resolves\n // tới page URL (/room/...) thay vì root, gây 404.\n const origin = absoluteOrigin();\n if (origin) {\n css = css.replace(/url\\((['\"]?)(fonts\\/)/g, `url($1${origin}/$2`);\n }\n cachedCss = css;\n return css;\n }\n }\n } catch {\n /* ignore */\n }\n cachedCss = '';\n return '';\n}\n\nexport async function renderLatexToSvg(src: string, displayMode: boolean): Promise<string> {\n const katex = await import('katex');\n const html = katex.default.renderToString(src, { displayMode, throwOnError: true, output: 'html' });\n\n const measureDiv = document.createElement('div');\n measureDiv.style.cssText = 'position:absolute;top:-9999px;left:-9999px;visibility:hidden;display:inline-block;';\n measureDiv.innerHTML = html;\n document.body.appendChild(measureDiv);\n const rect = measureDiv.getBoundingClientRect();\n const width = Math.ceil(rect.width) || 50;\n const height = Math.ceil(rect.height) || 20;\n document.body.removeChild(measureDiv);\n\n const cssText = await loadKatexCss();\n\n // KaTeX render với text màu đen mặc định. Excalidraw apply CSS filter\n // invert+hue-rotate trên canvas khi dark mode → text tự thành sáng. Đừng\n // override color ở đây vì sẽ đánh nhau với filter.\n return '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + width + '\" height=\"' + height + '\" viewBox=\"0 0 ' + width + ' ' + height + '\">' +\n '<foreignObject width=\"100%\" height=\"100%\">' +\n '<div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"font-size:16px;line-height:1.2;\">' +\n '<style>' + cssText + '</style>' +\n html +\n '</div>' +\n '</foreignObject>' +\n '</svg>';\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface LatexCustomData extends BaseStampCustomData {\n kind: 'latex';\n version: 1;\n src: string;\n displayMode: boolean;\n}\n\nexport function isLatexCustomData(data: unknown): data is LatexCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<LatexCustomData>;\n return d.kind === 'latex' && d.version === 1 && typeof d.src === 'string';\n}\n","'use client';\n\nimport React from 'react';\n\n// ---------- Shared shell (latex copy — geometry copy stays in src/stamp/StampLeftPanel.tsx) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n\nfunction Shell({ title, icon, onClose, children, isMobile, drawerOpen, onDrawerClose }: ShellProps) {\n const mobileAttrs = isMobile\n ? {\n 'data-mobile-drawer': 'true',\n 'data-drawer-state': drawerOpen ? 'open' : 'closed',\n }\n : {};\n const handleHeaderClose = () => {\n if (isMobile) onDrawerClose?.();\n else onClose();\n };\n return (\n <>\n {isMobile && drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={isMobile && !drawerOpen ? 'true' : undefined}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n {...mobileAttrs}\n className={\n isMobile\n ? 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md'\n : 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200'\n }\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={handleHeaderClose}\n aria-label={isMobile ? 'Đóng ngăn công cụ' : 'Đóng'}\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n </>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- LaTeX left panel ----------\n\ninterface LatexLeftPanelProps {\n displayMode: boolean;\n onDisplayModeChange: (b: boolean) => void;\n onInsertSnippet: (snippet: string) => void;\n onClose: () => void;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n\ninterface SnippetDef {\n label: string;\n preview: string;\n snippet: string;\n}\n\nconst SNIPPETS: { group: string; items: SnippetDef[] }[] = [\n {\n group: 'Phân số & luỹ thừa',\n items: [\n { label: 'Phân số', preview: 'a⁄b', snippet: '\\\\frac{a}{b}' },\n { label: 'Luỹ thừa', preview: 'x²', snippet: '^{2}' },\n { label: 'Chỉ số', preview: 'x₁', snippet: '_{1}' },\n { label: 'Căn', preview: '√x', snippet: '\\\\sqrt{x}' },\n { label: 'Căn n', preview: 'ⁿ√x', snippet: '\\\\sqrt[n]{x}' },\n ],\n },\n {\n group: 'Tổng & tích phân',\n items: [\n { label: 'Tổng', preview: 'Σ', snippet: '\\\\sum_{i=1}^{n}' },\n { label: 'Tích', preview: 'Π', snippet: '\\\\prod_{i=1}^{n}' },\n { label: 'Tích phân', preview: '∫', snippet: '\\\\int_{a}^{b}' },\n { label: 'Giới hạn', preview: 'lim', snippet: '\\\\lim_{x \\\\to 0}' },\n ],\n },\n {\n group: 'Ký hiệu',\n items: [\n { label: 'α', preview: 'α', snippet: '\\\\alpha' },\n { label: 'β', preview: 'β', snippet: '\\\\beta' },\n { label: 'π', preview: 'π', snippet: '\\\\pi' },\n { label: 'θ', preview: 'θ', snippet: '\\\\theta' },\n { label: '≠', preview: '≠', snippet: '\\\\neq' },\n { label: '≤', preview: '≤', snippet: '\\\\leq' },\n { label: '≥', preview: '≥', snippet: '\\\\geq' },\n { label: '∞', preview: '∞', snippet: '\\\\infty' },\n { label: '→', preview: '→', snippet: '\\\\to' },\n ],\n },\n];\n\nexport function LeftPanel({\n displayMode,\n onDisplayModeChange,\n onInsertSnippet,\n onClose,\n isMobile,\n drawerOpen,\n onDrawerClose,\n}: LatexLeftPanelProps) {\n return (\n <Shell\n title=\"Công thức LaTeX\"\n icon=\"∑\"\n onClose={onClose}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={onDrawerClose}\n >\n <Section label=\"Chế độ hiển thị\">\n <div className=\"grid grid-cols-2 gap-1.5\">\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(false)}\n aria-pressed={!displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n !displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Inline</span>\n <span className=\"block text-[10px] text-slate-500\">$ ... $</span>\n </button>\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(true)}\n aria-pressed={displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Block</span>\n <span className=\"block text-[10px] text-slate-500\">$$ ... $$</span>\n </button>\n </div>\n </Section>\n\n {SNIPPETS.map((group) => (\n <Section key={group.group} label={group.group}>\n <div className=\"flex flex-wrap gap-1\">\n {group.items.map((s) => (\n <button\n key={s.snippet}\n type=\"button\"\n data-snippet={s.snippet}\n onClick={() => onInsertSnippet(s.snippet)}\n title={s.snippet}\n className=\"rounded border border-slate-200 bg-white px-2 py-1 text-xs text-slate-700 transition hover:border-emerald-300 hover:bg-emerald-50 hover:text-emerald-700\"\n >\n {s.preview}\n </button>\n ))}\n </div>\n </Section>\n ))}\n\n <Section label=\"Phím tắt\">\n <div className=\"flex flex-wrap gap-2 text-[11px] text-slate-600\">\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Enter</kbd>\n chèn\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Esc</kbd>\n đóng\n </span>\n </div>\n </Section>\n </Shell>\n );\n}\n\n// Back-compat alias\nexport { LeftPanel as LatexLeftPanel };\n","'use client';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { renderLatexToSvg } from '../render';\n\ninterface Props {\n /**\n * Legacy: vị trí absolute x/y nếu cần (test). Khi cả 2 = 0 và `centered` !== false,\n * popover sẽ tự center floating ở giữa khu vực bảng. Khi `withLeftPanel` = true,\n * vị trí center được offset 120px để chừa chỗ panel trái.\n */\n x: number;\n y: number;\n initialValue: string;\n onInsert: (svgString: string, src: string, displayMode: boolean) => void;\n onClose: () => void;\n /** Khi controlled từ parent (StampLeftPanel), parent set giá trị này. */\n displayMode?: boolean;\n onDisplayModeChange?: (b: boolean) => void;\n /** Khi true, position center offset cho panel trái. */\n withLeftPanel?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Trigger mở snippet drawer trên mobile. */\n onOpenDrawer?: () => void;\n}\n\nexport interface EditorPopoverHandle {\n /** Chèn snippet vào vị trí con trỏ trong textbox. */\n insertAtCursor: (snippet: string) => void;\n /** Có content hợp lệ để chèn không (input không rỗng + preview ok). */\n hasContent: () => boolean;\n /** Trigger insert programmatically — return true nếu chèn thành công. */\n tryInsert: () => boolean;\n}\n\nconst DEBOUNCE_MS = 100;\n\nexport const EditorPopover = forwardRef<EditorPopoverHandle, Props>(function EditorPopover(\n {\n x,\n y,\n initialValue,\n onInsert,\n onClose,\n displayMode: controlledDisplayMode,\n onDisplayModeChange,\n withLeftPanel = false,\n isMobile = false,\n onOpenDrawer,\n },\n ref,\n) {\n const [value, setValue] = useState(initialValue);\n const [internalDisplayMode] = useState(false);\n const displayMode = controlledDisplayMode ?? internalDisplayMode;\n // onDisplayModeChange chỉ dùng khi controlled từ parent — không cần local setter\n void onDisplayModeChange;\n\n const [previewSvg, setPreviewSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(async () => {\n try {\n const svg = await renderLatexToSvg(value, displayMode);\n setPreviewSvg(svg);\n setError(null);\n } catch (err) {\n setPreviewSvg(null);\n setError((err as Error).message);\n }\n }, DEBOUNCE_MS);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [value, displayMode]);\n\n const handleInsert = useCallback(() => {\n if (!previewSvg) return;\n onInsert(previewSvg, value, displayMode);\n }, [previewSvg, value, displayMode, onInsert]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleInsert();\n }\n },\n [onClose, handleInsert],\n );\n\n // Imperative API: snippet button trong panel trái gọi vào, click-outside auto-insert.\n useImperativeHandle(\n ref,\n () => ({\n insertAtCursor: (snippet: string) => {\n const el = inputRef.current;\n if (!el) {\n setValue((v) => v + snippet);\n return;\n }\n const start = el.selectionStart ?? value.length;\n const end = el.selectionEnd ?? value.length;\n const next = value.slice(0, start) + snippet + value.slice(end);\n setValue(next);\n requestAnimationFrame(() => {\n el.focus();\n const pos = start + snippet.length;\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n /* ignore */\n }\n });\n },\n hasContent: () => value.trim().length > 0 && !!previewSvg && !error,\n tryInsert: () => {\n if (!previewSvg || error || !value.trim()) return false;\n onInsert(previewSvg, value, displayMode);\n return true;\n },\n }),\n [value, previewSvg, error, displayMode, onInsert],\n );\n\n // Position: nếu x/y > 0 → dùng legacy absolute (cho tests cũ). Còn không thì center floating.\n const isLegacyPosition = x > 0 || y > 0;\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 50 }\n : isLegacyPosition\n ? { position: 'absolute', top: y, left: x, zIndex: 50 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 50,\n };\n\n return (\n <div\n style={wrapperStyle}\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n className={\n isMobile\n ? 'flex h-full w-full flex-col bg-white'\n : 'w-[420px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5'\n }\n role=\"dialog\"\n aria-label=\"Nhập công thức LaTeX\"\n >\n <header className={`flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-indigo-600 to-purple-600 px-3 py-2 text-white${isMobile ? '' : ' rounded-t-lg'}`}>\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn snippet\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <span className=\"text-base leading-none\">∑</span>\n Công thức LaTeX\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!previewSvg || !!error}\n data-testid=\"latex-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className={`space-y-2 p-3${isMobile ? ' flex min-h-0 flex-1 flex-col' : ''}`}>\n <input\n ref={inputRef}\n type=\"text\"\n role=\"textbox\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Vd: \\frac{a^2+b^2}{c}\"\n className={`w-full rounded border border-slate-300 px-2 py-1.5 font-mono outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-200${\n isMobile ? ' min-h-[44px] text-base' : ' text-sm'\n }`}\n autoFocus\n />\n <div\n className={[\n 'flex items-center justify-center rounded border p-3 text-center',\n isMobile ? 'min-h-0 flex-1 overflow-auto' : 'min-h-[64px]',\n error ? 'border-rose-300 bg-rose-50 text-rose-700' : 'border-slate-200 bg-slate-50',\n ].join(' ')}\n >\n {error ? (\n <span className=\"text-xs\">Lỗi: {error.slice(0, 80)}</span>\n ) : previewSvg ? (\n <span dangerouslySetInnerHTML={{ __html: previewSvg }} />\n ) : (\n <span className=\"text-xs text-slate-400\">(xem trước)</span>\n )}\n </div>\n {!isMobile && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Enter để chèn\n </span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!previewSvg || !!error}\n className=\"rounded bg-indigo-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-indigo-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </div>\n )}\n {isMobile && (\n <div className=\"text-center text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Bấm Chèn ở thanh trên\n </div>\n )}\n </div>\n </div>\n );\n});\n\n// Back-compat aliases\nexport { EditorPopover as LatexEditorPopover };\nexport type { EditorPopoverHandle as LatexEditorHandle };\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { LeftPanel as LatexLeftPanel } from './editor/LeftPanel';\nimport {\n EditorPopover as LatexEditorPopover,\n type EditorPopoverHandle as LatexEditorHandle,\n} from './editor/EditorPopover';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { isLatexCustomData, type LatexCustomData } from './types';\nimport type { StampHostProps, StampHostHandle } from '../shared/types';\n\nexport const LatexStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function LatexStampHost({ api, editingElement, onClose }, ref) {\n const editorRef = useRef<LatexEditorHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const initial = useMemo(() => {\n if (editingElement && isLatexCustomData(editingElement.customData)) {\n return {\n initialValue: editingElement.customData.src,\n displayMode: !!editingElement.customData.displayMode,\n };\n }\n return { initialValue: '', displayMode: false };\n }, [editingElement]);\n\n const [displayMode, setDisplayMode] = useState(initial.displayMode);\n\n const handleInsert = useCallback(\n async (svgString: string, src: string, dm: boolean) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): LatexCustomData => ({\n kind: 'latex',\n version: 1,\n src,\n displayMode: dm,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Latex insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <LatexLeftPanel\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsertSnippet={(s) => editorRef.current?.insertAtCursor(s)}\n onClose={onClose}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <LatexEditorPopover\n ref={editorRef}\n x={0}\n y={0}\n initialValue={initial.initialValue}\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsert={handleInsert}\n onClose={onClose}\n withLeftPanel={!isMobile}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n />\n </>\n );\n },\n);\n","import type { BaseStampCustomData } from '../shared/types';\nimport type { Constraint } from './editor/scene/types';\n\nexport interface Geometry3DCustomData extends BaseStampCustomData {\n kind: 'geometry3d';\n version: 1 | 2;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGeometry3DCustomData(data: unknown): data is Geometry3DCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<Geometry3DCustomData>;\n return (\n d.kind === 'geometry3d' &&\n (d.version === 1 || d.version === 2) &&\n typeof d.jsonState === 'string'\n );\n}\n\nexport type Element3DType =\n | 'point3d'\n | 'line3d'\n | 'plane3d'\n | 'polygon3d'\n | 'sphere3d'\n | 'text3d';\n\nexport interface SerializedElement3D {\n type: Element3DType;\n /**\n * Parents passed to JSXGraph view.create. Either literal values (numbers,\n * strings) or `\"@id:<id>\"` placeholder strings referencing earlier created\n * objects in the log (resolved at deserialize time).\n */\n parents: unknown[];\n attributes: Record<string, unknown>;\n id: string;\n label?: string;\n /** v2 only — present on point3d elements to encode the surface constraint. */\n constraint?: Constraint;\n}\n\nexport interface SerializedBoard3D {\n version: 1 | 2;\n bbox: [number, number, number, number];\n view: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n };\n showAxes: boolean;\n showMesh: boolean;\n elements: SerializedElement3D[];\n}\n\nexport function serializeBoard3D(state: SerializedBoard3D): string {\n return JSON.stringify(state);\n}\n\nexport function parseSerializedBoard3D(json: string): SerializedBoard3D {\n const parsed = JSON.parse(json) as unknown;\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('parseSerializedBoard3D: not an object');\n }\n const p = parsed as Partial<SerializedBoard3D>;\n if (p.version !== 1 && p.version !== 2) {\n throw new Error(`parseSerializedBoard3D: unsupported version ${String(p.version)}`);\n }\n if (!Array.isArray(p.elements)) {\n throw new Error('parseSerializedBoard3D: elements missing');\n }\n return parsed as SerializedBoard3D;\n}\n","import {\n paletteFor as palette2D,\n type GeomPalette,\n} from '../../geometry-2d/editor/theme';\n\nexport type Geom3DPalette = GeomPalette & {\n view3dBg: string;\n axisX: string;\n axisY: string;\n axisZ: string;\n};\n\nexport function paletteFor(isDark: boolean): Geom3DPalette {\n const base = palette2D(isDark);\n return {\n ...base,\n view3dBg: isDark ? '#1a1a1a' : '#ffffff',\n axisX: '#d63b3b',\n axisY: '#2d8a2d',\n axisZ: '#2d6dd6',\n };\n}\n\nexport const DEFAULT_VIEW3D: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n} = {\n azimuth: 0.7,\n elevation: 0.4,\n bbox3D: [-3, -3, -3, 3, 3, 3],\n};\n\nexport const VIEW3D_ATTRS = (isDark: boolean) => {\n const p = paletteFor(isDark);\n const axisLabel = (color: string) => ({\n strokeColor: color,\n fontSize: 14,\n offset: [10, 0] as [number, number],\n });\n return {\n az: { slider: { visible: false }, point2: { visible: false } },\n el: { slider: { visible: false } },\n projection: 'central' as const,\n // GeoGebra-style: axes pass through origin (0,0,0) instead of bbox border.\n axesPosition: 'center' as const,\n xAxis: {\n strokeColor: p.axisX,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'x',\n withLabel: true,\n label: axisLabel(p.axisX),\n },\n yAxis: {\n strokeColor: p.axisY,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'y',\n withLabel: true,\n label: axisLabel(p.axisY),\n },\n zAxis: {\n strokeColor: p.axisZ,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'z',\n withLabel: true,\n label: axisLabel(p.axisZ),\n },\n // GeoGebra-style: hide ALL bbox wall planes; the XY ground plane is drawn\n // explicitly at z=0 via the helper below (so it coincides with Ox/Oy).\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: false, mesh3d: { visible: false } },\n };\n};\n\nexport const GROUND_PLANE_ATTRS = (isDark: boolean) => ({\n fillColor: isDark ? '#2a2a2a' : '#e6e6e6',\n fillOpacity: isDark ? 0.5 : 0.55,\n strokeColor: isDark ? '#3a3a3a' : '#cfcfcf',\n strokeOpacity: 0.7,\n strokeWidth: 1,\n fixed: true,\n highlight: false,\n withLabel: false,\n layer: 0,\n});\n\n/** XY ground plane extent (square around origin in user units). */\nexport const GROUND_PLANE_RANGE: [number, number] = [-3, 3];\n","\"use client\";\n\nimport { parseSerializedBoard3D } from './serialize';\nimport { GROUND_PLANE_ATTRS, GROUND_PLANE_RANGE, VIEW3D_ATTRS } from './editor/theme';\n\nexport interface RenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nconst OUTPUT_WIDTH = 1024;\nconst OUTPUT_HEIGHT = 768;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport async function renderGeometry3DSvgFromState(\n jsonState: string,\n): Promise<RenderResult> {\n const state = parseSerializedBoard3D(jsonState);\n const JXG = (await import('jsxgraph')).default;\n\n const div = document.createElement('div');\n div.style.cssText = `position:absolute;left:-9999px;top:-9999px;width:${OUTPUT_WIDTH}px;height:${OUTPUT_HEIGHT}px;`;\n document.body.appendChild(div);\n\n try {\n JXG.Options.text.display = 'internal';\n\n const board = JXG.JSXGraph.initBoard(div, {\n boundingbox: state.bbox,\n keepaspectratio: true,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n }) as { create: (k: string, p: unknown[], a: unknown) => JxgObj };\n\n const baseAttrs = VIEW3D_ATTRS(false);\n const view: JxgObj = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [state.view.bbox3D[0], state.view.bbox3D[3]],\n [state.view.bbox3D[1], state.view.bbox3D[4]],\n [state.view.bbox3D[2], state.view.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n // JSXGraph view3d đọc azimuth/elevation từ az.slider.start (không phải\n // az.value). Nếu pass `value` → JSXGraph bỏ qua → render rơi về default\n // (1.0 rad / 0.3 rad), không khớp góc user xoay trong editor.\n az: { ...baseAttrs.az, slider: { ...baseAttrs.az.slider, start: state.view.azimuth } },\n el: { ...baseAttrs.el, slider: { ...baseAttrs.el.slider, start: state.view.elevation } },\n },\n );\n\n // Defensive: setValue post-creation để chắc chắn slider khớp với serialized\n // angle, kể cả khi JSXGraph version khác xử lý `start` khác.\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n v?.az_slide?.setValue?.(state.view.azimuth);\n v?.el_slide?.setValue?.(state.view.elevation);\n v?.board?.update?.();\n } catch {\n /* swallow — older JSXGraph may not expose az_slide on view3d */\n }\n\n if (!state.showAxes) {\n (view as { defaultAxes?: unknown[] }).defaultAxes = [];\n }\n\n // XY ground plane through origin (matches editor's MiniBoard3D).\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => JxgObj }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(false),\n );\n } catch {\n /* swallow */\n }\n\n const idMap = new Map<string, JxgObj>();\n for (const el of state.elements) {\n const parents = el.parents.map((p) =>\n typeof p === 'string' && p.startsWith('@id:')\n ? idMap.get(p.slice(4))\n : p,\n );\n const obj = (\n view as { create: (k: string, p: unknown[], a: unknown) => JxgObj }\n ).create(el.type, parents, {\n ...el.attributes,\n id: el.id,\n name: el.label,\n });\n idMap.set(el.id, obj);\n }\n\n const svg = div.querySelector('svg');\n if (!svg) {\n throw new Error('renderGeometry3DSvgFromState: SVG not produced');\n }\n const clone = svg.cloneNode(true) as SVGElement;\n clone.setAttribute('width', String(OUTPUT_WIDTH));\n clone.setAttribute('height', String(OUTPUT_HEIGHT));\n const svgString = new XMLSerializer().serializeToString(clone);\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n JXG.JSXGraph.freeBoard(board as any);\n } catch {\n /* ignore teardown */\n }\n\n return { svgString, width: OUTPUT_WIDTH, height: OUTPUT_HEIGHT };\n } finally {\n document.body.removeChild(div);\n }\n}\n","import type { Constraint } from '../../scene/types';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport type { SceneHit } from '../../hitTest/hitTest';\n\nexport function hitToConstraint(hit: SceneHit): Constraint | null {\n switch (hit.kind) {\n case 'onGround': return { kind: 'onGround', x: hit.world[0], y: hit.world[1] };\n case 'onAxis': return { kind: 'onAxis', axis: hit.axis, t: hit.t };\n case 'onPlane': return { kind: 'onPlane', planeId: hit.planeId, u: hit.u, v: hit.v };\n case 'onLine': return { kind: 'onLine', lineId: hit.lineId, t: hit.t };\n case 'onPolygon': return { kind: 'onPolygon', polygonId: hit.polygonId, u: hit.u, v: hit.v };\n case 'onSphere': return { kind: 'onSphere', sphereId: hit.sphereId, theta: hit.theta, phi: hit.phi };\n default: return null;\n }\n}\n\n/**\n * Given a SceneHit, return the id of an existing point (if hit is existingPoint),\n * or create a new constrained point on the hit surface and return its id.\n * Returns null for `empty` hits.\n */\nexport function ensurePoint(hit: SceneHit, scene: Scene3D): string | null {\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return scene.addPoint(c);\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { hitToConstraint } from './_ensurePoint';\n\nexport function buildPoint(args: CollectedArg[], scene: Scene3D): string | null {\n const hit = args[0]?.hit;\n if (!hit) return null;\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return scene.addPoint(c);\n}\n\nexport const buildPointOnObject = buildPoint; // identical semantics; step.allowNewOn is the only difference\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildSegment(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, scene);\n const p2 = ensurePoint(args[1].hit, scene);\n if (!p1 || !p2 || p1 === p2) return null;\n return scene.addObject('segment', { p1, p2 });\n}\n\nexport function buildLine(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, scene);\n const p2 = ensurePoint(args[1].hit, scene);\n if (!p1 || !p2 || p1 === p2) return null;\n return scene.addObject('line', { p1, p2 });\n}\n\nexport function buildRay(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const origin = ensurePoint(args[0].hit, scene);\n const through = ensurePoint(args[1].hit, scene);\n if (!origin || !through || origin === through) return null;\n return scene.addObject('ray', { origin, through });\n}\n\nexport function buildVector(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const from = ensurePoint(args[0].hit, scene);\n const to = ensurePoint(args[1].hit, scene);\n if (!from || !to || from === to) return null;\n return scene.addObject('vector', { from, to });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildPolygon(args: CollectedArg[], scene: Scene3D): string | null {\n // Drop the final closingPoint arg, keep all 'point'-step hits as vertices.\n const vertexArgs = args.filter((a) => a.step.type === 'point');\n const vertexIds = vertexArgs.map((a) => (a.hit ? ensurePoint(a.hit, scene) : null)).filter((x): x is string => !!x);\n if (vertexIds.length < 3) return null;\n return scene.addObject('polygon', { vertices: vertexIds });\n}\n","import type { Constraint, Vec3, Scene3DObject } from './types';\nimport type { Scene3D } from './Scene3D';\n\nfunction sub(a: Vec3, b: Vec3): Vec3 { return [a[0]-b[0], a[1]-b[1], a[2]-b[2]]; }\nfunction add(a: Vec3, b: Vec3): Vec3 { return [a[0]+b[0], a[1]+b[1], a[2]+b[2]]; }\nfunction scale(a: Vec3, k: number): Vec3 { return [a[0]*k, a[1]*k, a[2]*k]; }\nfunction dot(a: Vec3, b: Vec3): number { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; }\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]];\n}\nfunction norm(a: Vec3): number { return Math.sqrt(dot(a, a)); }\nfunction normalize(a: Vec3): Vec3 { const n = norm(a); return n === 0 ? a : scale(a, 1/n); }\n\nfunction getPointWorld(id: string, scene: Scene3D): Vec3 {\n const obj = scene.get(id);\n if (!obj || obj.kind !== 'point') {\n throw new Error(`constraintMath: point ${id} not found`);\n }\n return constraintToWorld(obj.constraint, scene);\n}\n\nfunction getPlaneBasis(planeObj: Extract<Scene3DObject, { kind: 'plane' }>, scene: Scene3D): {\n origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3;\n} {\n const p1 = getPointWorld(planeObj.p1, scene);\n const p2 = getPointWorld(planeObj.p2, scene);\n const p3 = getPointWorld(planeObj.p3, scene);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n return { origin: p1, basis1, basis2, normal };\n}\n\nexport function constraintToWorld(c: Constraint, scene: Scene3D): Vec3 {\n switch (c.kind) {\n case 'free': return [c.x, c.y, c.z];\n case 'onGround': return [c.x, c.y, 0];\n case 'onAxis': {\n if (c.axis === 'x') return [c.t, 0, 0];\n if (c.axis === 'y') return [0, c.t, 0];\n return [0, 0, c.t];\n }\n case 'onPlane': {\n const plane = scene.get(c.planeId);\n if (!plane || plane.kind !== 'plane') throw new Error('onPlane: plane missing');\n const { origin, basis1, basis2 } = getPlaneBasis(plane, scene);\n return add(add(origin, scale(basis1, c.u)), scale(basis2, c.v));\n }\n case 'onLine': {\n const line = scene.get(c.lineId);\n if (!line || (line.kind !== 'line' && line.kind !== 'segment' && line.kind !== 'ray')) {\n throw new Error('onLine: parent missing');\n }\n const p1Id = line.kind === 'ray' ? line.origin : line.p1;\n const p2Id = line.kind === 'ray' ? line.through : line.p2;\n const p1 = getPointWorld(p1Id, scene);\n const p2 = getPointWorld(p2Id, scene);\n const dir = sub(p2, p1);\n return add(p1, scale(dir, c.t));\n }\n case 'onPolygon': {\n const pg = scene.get(c.polygonId);\n if (!pg || pg.kind !== 'polygon') throw new Error('onPolygon: parent missing');\n const v = pg.vertices;\n if (v.length < 3) throw new Error('onPolygon: < 3 vertices');\n const p1 = getPointWorld(v[0], scene);\n const p2 = getPointWorld(v[1], scene);\n const p3 = getPointWorld(v[2], scene);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n return add(add(p1, scale(basis1, c.u)), scale(basis2, c.v));\n }\n case 'onSphere': {\n const sph = scene.get(c.sphereId);\n if (!sph || sph.kind !== 'sphere') throw new Error('onSphere: parent missing');\n const center = getPointWorld(sph.center, scene);\n const surface = getPointWorld(sph.surfacePoint, scene);\n const radius = norm(sub(surface, center));\n const x = center[0] + radius * Math.sin(c.phi) * Math.cos(c.theta);\n const y = center[1] + radius * Math.sin(c.phi) * Math.sin(c.theta);\n const z = center[2] + radius * Math.cos(c.phi);\n return [x, y, z];\n }\n }\n}\n\nexport function worldToConstraint(current: Constraint, world: Vec3, scene: Scene3D): Constraint {\n switch (current.kind) {\n case 'free': return { kind: 'free', x: world[0], y: world[1], z: world[2] };\n case 'onGround': return { kind: 'onGround', x: world[0], y: world[1] };\n case 'onAxis': {\n const t = current.axis === 'x' ? world[0] : current.axis === 'y' ? world[1] : world[2];\n return { kind: 'onAxis', axis: current.axis, t };\n }\n case 'onPlane': {\n const plane = scene.get(current.planeId);\n if (!plane || plane.kind !== 'plane') return current;\n const { origin, basis1, basis2 } = getPlaneBasis(plane, scene);\n const rel = sub(world, origin);\n const b1n = dot(basis1, basis1);\n const b2n = dot(basis2, basis2);\n const u = b1n === 0 ? 0 : dot(rel, basis1) / b1n;\n const v = b2n === 0 ? 0 : dot(rel, basis2) / b2n;\n return { kind: 'onPlane', planeId: current.planeId, u, v };\n }\n case 'onLine': {\n const line = scene.get(current.lineId);\n if (!line) return current;\n const p1Id = line.kind === 'ray' ? line.origin : (line as { p1: string }).p1;\n const p2Id = line.kind === 'ray' ? line.through : (line as { p2: string }).p2;\n const p1 = getPointWorld(p1Id, scene);\n const p2 = getPointWorld(p2Id, scene);\n const dir = sub(p2, p1);\n const len2 = dot(dir, dir);\n const t = len2 === 0 ? 0 : dot(sub(world, p1), dir) / len2;\n return { kind: 'onLine', lineId: current.lineId, t };\n }\n case 'onPolygon': {\n const pg = scene.get(current.polygonId);\n if (!pg || pg.kind !== 'polygon' || pg.vertices.length < 3) return current;\n const p1 = getPointWorld(pg.vertices[0], scene);\n const p2 = getPointWorld(pg.vertices[1], scene);\n const p3 = getPointWorld(pg.vertices[2], scene);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n const rel = sub(world, p1);\n const b1n = dot(basis1, basis1);\n const b2n = dot(basis2, basis2);\n const u = b1n === 0 ? 0 : dot(rel, basis1) / b1n;\n const v = b2n === 0 ? 0 : dot(rel, basis2) / b2n;\n return { kind: 'onPolygon', polygonId: current.polygonId, u, v };\n }\n case 'onSphere': {\n const sph = scene.get(current.sphereId);\n if (!sph || sph.kind !== 'sphere') return current;\n const center = getPointWorld(sph.center, scene);\n const rel = sub(world, center);\n const r = norm(rel);\n if (r === 0) return current;\n const phi = Math.acos(rel[2] / r);\n const theta = Math.atan2(rel[1], rel[0]);\n return { kind: 'onSphere', sphereId: current.sphereId, theta, phi };\n }\n }\n}\n","import type { Vec3 } from './types';\nimport type { Scene3D } from './Scene3D';\nimport { constraintToWorld } from './constraintMath';\n\nconst EPS = 1e-6;\n\nfunction getWorld(id: string, scene: Scene3D): Vec3 | null {\n const obj = scene.get(id);\n if (!obj || obj.kind !== 'point') return null;\n return constraintToWorld(obj.constraint, scene);\n}\n\nexport function areCollinear3(p1Id: string, p2Id: string, p3Id: string, scene: Scene3D): boolean {\n const p1 = getWorld(p1Id, scene);\n const p2 = getWorld(p2Id, scene);\n const p3 = getWorld(p3Id, scene);\n if (!p1 || !p2 || !p3) return true;\n const a: Vec3 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];\n const b: Vec3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];\n const c: Vec3 = [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]];\n return Math.hypot(c[0], c[1], c[2]) < EPS;\n}\n\nexport function apexCoplanarWithBase(baseIds: string[], apexId: string, scene: Scene3D): boolean {\n if (baseIds.length < 3) return false;\n const p1 = getWorld(baseIds[0], scene);\n const p2 = getWorld(baseIds[1], scene);\n const p3 = getWorld(baseIds[2], scene);\n const apex = getWorld(apexId, scene);\n if (!p1 || !p2 || !p3 || !apex) return false;\n const a: Vec3 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];\n const b: Vec3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];\n const n: Vec3 = [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]];\n const d: Vec3 = [apex[0]-p1[0], apex[1]-p1[1], apex[2]-p1[2]];\n const dotND = n[0]*d[0] + n[1]*d[1] + n[2]*d[2];\n return Math.abs(dotND) < EPS;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { areCollinear3 } from '../../scene/geometryChecks';\n\nexport function buildPlane(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 3 || !args[0].hit || !args[1].hit || !args[2].hit) return null;\n const p1 = ensurePoint(args[0].hit, scene);\n const p2 = ensurePoint(args[1].hit, scene);\n const p3 = ensurePoint(args[2].hit, scene);\n if (!p1 || !p2 || !p3) return null;\n if (p1 === p2 || p2 === p3 || p1 === p3) return null;\n if (areCollinear3(p1, p2, p3, scene)) return null;\n return scene.addObject('plane', { p1, p2, p3 });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { apexCoplanarWithBase } from '../../scene/geometryChecks';\n\nexport function buildPyramid(args: CollectedArg[], scene: Scene3D): string | null {\n const pointArgs = args.filter((a) => a.step.type === 'point');\n const baseArgs = pointArgs.slice(0, -1); // last 'point' arg is the apex\n const apexArg = pointArgs.slice(-1)[0];\n if (baseArgs.length < 3 || !apexArg?.hit) return null;\n const baseIds = baseArgs.map((a) => (a.hit ? ensurePoint(a.hit, scene) : null)).filter((x): x is string => !!x);\n const apexId = ensurePoint(apexArg.hit, scene);\n if (!apexId || baseIds.length < 3) return null;\n if (apexCoplanarWithBase(baseIds, apexId, scene)) return null;\n const vertices = [...baseIds, apexId];\n const apexIdx = vertices.length - 1;\n const faces: number[][] = [baseIds.map((_, i) => i)];\n for (let i = 0; i < baseIds.length; i++) {\n faces.push([i, (i + 1) % baseIds.length, apexIdx]);\n }\n return scene.addObject('polyhedron', { flavor: 'pyramid', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\n\nexport function buildPrism(args: CollectedArg[], scene: Scene3D): string | null {\n const baseArgs = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (baseArgs.length < 3 || !numberArg || typeof numberArg.value !== 'number') return null;\n const height = numberArg.value;\n if (height <= 0) return null;\n const baseIds = baseArgs.map((a) => (a.hit ? ensurePoint(a.hit, scene) : null)).filter((x): x is string => !!x);\n if (baseIds.length < 3) return null;\n const topIds: string[] = [];\n for (const id of baseIds) {\n const p = scene.get(id);\n if (!p || p.kind !== 'point') return null;\n const w = constraintToWorld(p.constraint, scene);\n topIds.push(scene.addPoint({ kind: 'free', x: w[0], y: w[1], z: w[2] + height }));\n }\n const n = baseIds.length;\n const vertices = [...baseIds, ...topIds];\n const faces: number[][] = [\n baseIds.map((_, i) => i),\n topIds.map((_, i) => n + i),\n ];\n for (let i = 0; i < n; i++) {\n faces.push([i, (i + 1) % n, n + ((i + 1) % n), n + i]);\n }\n return scene.addObject('polyhedron', { flavor: 'prism', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\n\nexport function buildTetrahedron(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, scene);\n const p2Id = ensurePoint(args[1].hit, scene);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const p1Obj = scene.get(p1Id);\n const p2Obj = scene.get(p2Id);\n if (!p1Obj || p1Obj.kind !== 'point' || !p2Obj || p2Obj.kind !== 'point') return null;\n const p1 = constraintToWorld(p1Obj.constraint, scene);\n const p2 = constraintToWorld(p2Obj.constraint, scene);\n // Force base plane to z = min(p1.z, p2.z); project both points there.\n const z0 = Math.min(p1[2], p2[2]);\n const baseA: [number, number, number] = [p1[0], p1[1], z0];\n const baseB: [number, number, number] = [p2[0], p2[1], z0];\n const dx = baseB[0] - baseA[0];\n const dy = baseB[1] - baseA[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Third base vertex: rotate (baseB - baseA) by 60° in xy and add to baseA midpoint\n const mid: [number, number, number] = [(baseA[0]+baseB[0])/2, (baseA[1]+baseB[1])/2, z0];\n const perpX = -dy;\n const perpY = dx;\n const perpLen = Math.hypot(perpX, perpY);\n const height = edge * Math.sqrt(3) / 2;\n const baseC: [number, number, number] = [mid[0] + (perpX/perpLen)*height, mid[1] + (perpY/perpLen)*height, z0];\n // Apex: centroid + edge*sqrt(2/3)\n const centroid: [number, number, number] = [\n (baseA[0]+baseB[0]+baseC[0])/3,\n (baseA[1]+baseB[1]+baseC[1])/3,\n z0,\n ];\n const apexHeight = edge * Math.sqrt(2/3);\n const apex: [number, number, number] = [centroid[0], centroid[1], z0 + apexHeight];\n\n const cId = scene.addPoint({ kind: 'free', x: baseC[0], y: baseC[1], z: baseC[2] });\n const apexId = scene.addPoint({ kind: 'free', x: apex[0], y: apex[1], z: apex[2] });\n\n const vertices = [p1Id, p2Id, cId, apexId];\n const faces: number[][] = [\n [0, 1, 2], // base\n [0, 1, 3], // face p1-p2-apex\n [1, 2, 3], // face p2-c-apex\n [2, 0, 3], // face c-p1-apex\n ];\n return scene.addObject('polyhedron', { flavor: 'tetrahedron', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\n\nexport function buildCube(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, scene);\n const p2Id = ensurePoint(args[1].hit, scene);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const p1Obj = scene.get(p1Id);\n const p2Obj = scene.get(p2Id);\n if (!p1Obj || p1Obj.kind !== 'point' || !p2Obj || p2Obj.kind !== 'point') return null;\n const p1 = constraintToWorld(p1Obj.constraint, scene);\n const p2 = constraintToWorld(p2Obj.constraint, scene);\n // Require both on the ground (z = 0); reject otherwise\n if (Math.abs(p1[2]) > 1e-6 || Math.abs(p2[2]) > 1e-6) return null;\n const dx = p2[0] - p1[0];\n const dy = p2[1] - p1[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Bottom face: p1, p2, p3 = p2 + perp, p4 = p1 + perp where perp = rotate (p2-p1) by +90°\n const perpX = -dy;\n const perpY = dx;\n const p3: [number, number, number] = [p2[0] + perpX, p2[1] + perpY, 0];\n const p4: [number, number, number] = [p1[0] + perpX, p1[1] + perpY, 0];\n // Top face: same x, y; z = edge\n const t1: [number, number, number] = [p1[0], p1[1], edge];\n const t2: [number, number, number] = [p2[0], p2[1], edge];\n const t3: [number, number, number] = [p3[0], p3[1], edge];\n const t4: [number, number, number] = [p4[0], p4[1], edge];\n\n const p3Id = scene.addPoint({ kind: 'onGround', x: p3[0], y: p3[1] });\n const p4Id = scene.addPoint({ kind: 'onGround', x: p4[0], y: p4[1] });\n const t1Id = scene.addPoint({ kind: 'free', x: t1[0], y: t1[1], z: t1[2] });\n const t2Id = scene.addPoint({ kind: 'free', x: t2[0], y: t2[1], z: t2[2] });\n const t3Id = scene.addPoint({ kind: 'free', x: t3[0], y: t3[1], z: t3[2] });\n const t4Id = scene.addPoint({ kind: 'free', x: t4[0], y: t4[1], z: t4[2] });\n\n const vertices = [p1Id, p2Id, p3Id, p4Id, t1Id, t2Id, t3Id, t4Id];\n // Faces by index in vertices:\n const faces: number[][] = [\n [0, 1, 2, 3], // bottom\n [4, 5, 6, 7], // top\n [0, 1, 5, 4], // front\n [1, 2, 6, 5], // right\n [2, 3, 7, 6], // back\n [3, 0, 4, 7], // left\n ];\n return scene.addObject('polyhedron', { flavor: 'cube', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildSphere(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const center = ensurePoint(args[0].hit, scene);\n const surface = ensurePoint(args[1].hit, scene);\n if (!center || !surface || center === surface) return null;\n return scene.addObject('sphere', { center, surfacePoint: surface });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCylinder(args: CollectedArg[], scene: Scene3D): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, scene);\n const topCenter = ensurePoint(points[1].hit, scene);\n if (!baseCenter || !topCenter || baseCenter === topCenter) return null;\n return scene.addObject('cylinder', { baseCenter, topCenter, radius });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCone(args: CollectedArg[], scene: Scene3D): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, scene);\n const apex = ensurePoint(points[1].hit, scene);\n if (!baseCenter || !apex || baseCenter === apex) return null;\n return scene.addObject('cone', { baseCenter, apex, radius });\n}\n","import type { Scene3D } from '../scene/Scene3D';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport { buildPoint, buildPointOnObject } from './handlers/point';\nimport { buildSegment, buildLine, buildRay, buildVector } from './handlers/segment';\nimport { buildPolygon } from './handlers/polygon';\nimport { buildPlane } from './handlers/plane';\nimport { buildPyramid } from './handlers/pyramid';\nimport { buildPrism } from './handlers/prism';\nimport { buildTetrahedron } from './handlers/tetrahedron';\nimport { buildCube } from './handlers/cube';\nimport { buildSphere } from './handlers/sphere';\nimport { buildCylinder } from './handlers/cylinder';\nimport { buildCone } from './handlers/cone';\n\nexport type ToolKey =\n | 'move' | 'point' | 'pointOnObject'\n | 'segment' | 'line' | 'ray' | 'vector' | 'polygon'\n | 'plane' | 'pyramid' | 'prism' | 'tetrahedron' | 'cube'\n | 'sphere' | 'cylinder' | 'cone';\n\nexport type ToolStep =\n | {\n type: 'point';\n allowExisting: boolean;\n allowNewOn: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'>;\n hint: string;\n }\n | { type: 'closingPoint'; hint: string }\n | { type: 'object'; kinds: Array<'plane' | 'polygon' | 'line' | 'sphere' | 'polyhedron'>; hint: string }\n | { type: 'number'; prompt: string; min?: number; max?: number };\n\nexport interface CollectedArg {\n step: ToolStep;\n hit?: SceneHit;\n value?: number;\n}\n\nexport interface ToolSpec {\n key: ToolKey;\n label: string;\n hintIdle: string;\n steps: ToolStep[];\n build(args: CollectedArg[], scene: Scene3D): string | null;\n /**\n * If true, after build completes the controller re-enters step 0 of this\n * tool (clearing collected args) instead of switching to 'move'. Used by\n * the Point tool so the user can place several points in a row.\n */\n repeatAfterBuild?: boolean;\n}\n\nconst stubBuild = (): string | null => null;\n\nconst ALL_SURFACES: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane', 'line', 'polygon', 'sphere'];\n\nconst OBJECT_ONLY: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['plane', 'line', 'polygon', 'sphere'];\n\nconst NO_SURFACE: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane'];\n\nexport const TOOLS: ToolSpec[] = [\n {\n key: 'move',\n label: 'Di chuyển',\n hintIdle: 'Kéo điểm hoặc xoay khung',\n steps: [],\n build: stubBuild,\n },\n {\n key: 'point',\n label: 'Điểm',\n hintIdle: 'Click trên mặt phẳng Oxy hoặc trên trục để đặt điểm',\n steps: [\n {\n type: 'point',\n allowExisting: false,\n // GeoGebra-style: a new point must lie on the XY ground plane or on\n // one of the coordinate axes (Oz lets you place points off the plane).\n allowNewOn: ['ground', 'axis'],\n hint: 'Click trên mặt phẳng Oxy hoặc trục Ox/Oy/Oz',\n },\n ],\n build: buildPoint,\n repeatAfterBuild: true,\n },\n {\n key: 'pointOnObject',\n label: 'Điểm trên đối tượng',\n hintIdle: 'Chọn một đối tượng để đặt điểm',\n steps: [{ type: 'point', allowExisting: false, allowNewOn: OBJECT_ONLY, hint: 'Click lên mặt / đường để đặt điểm' }],\n build: buildPointOnObject,\n },\n {\n key: 'segment',\n label: 'Đoạn thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đoạn thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildSegment,\n },\n {\n key: 'line',\n label: 'Đường thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đường thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildLine,\n },\n {\n key: 'ray',\n label: 'Tia',\n hintIdle: 'Chọn điểm gốc rồi điểm trên tia',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm gốc' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên tia' },\n ],\n build: buildRay,\n },\n {\n key: 'vector',\n label: 'Vector',\n hintIdle: 'Chọn 2 điểm để vẽ vector',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm đầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm cuối' },\n ],\n build: buildVector,\n },\n {\n key: 'polygon',\n label: 'Đa giác',\n hintIdle: 'Chọn các đỉnh; click điểm đầu để đóng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 1' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 3' },\n { type: 'closingPoint', hint: 'Click điểm đầu để đóng (hoặc chọn thêm đỉnh)' },\n ],\n build: buildPolygon,\n },\n {\n key: 'plane',\n label: 'Mặt phẳng (3 điểm)',\n hintIdle: 'Chọn 3 điểm để xác định mặt phẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 1 của mặt phẳng' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 3' },\n ],\n build: buildPlane,\n },\n {\n key: 'pyramid',\n label: 'Hình chóp',\n hintIdle: 'Chọn đáy đa giác rồi chọn đỉnh chóp',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đáy đầu tiên để đóng (hoặc chọn thêm đỉnh)' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh chóp' },\n ],\n build: buildPyramid,\n },\n {\n key: 'prism',\n label: 'Lăng trụ',\n hintIdle: 'Chọn đáy đa giác rồi nhập chiều cao',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đầu để đóng đáy' },\n { type: 'number', prompt: 'Chiều cao (theo trục z)', min: 0.0001 },\n ],\n build: buildPrism,\n },\n {\n key: 'tetrahedron',\n label: 'Tứ diện đều',\n hintIdle: 'Chọn 2 điểm xác định cạnh của tứ diện',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 2' },\n ],\n build: buildTetrahedron,\n },\n {\n key: 'cube',\n label: 'Lập phương',\n hintIdle: 'Chọn 2 điểm trên nền xác định cạnh',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 1 (trên nền)' },\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 2 (trên nền)' },\n ],\n build: buildCube,\n },\n {\n key: 'sphere',\n label: 'Mặt cầu',\n hintIdle: 'Chọn tâm rồi điểm trên mặt cầu',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm mặt cầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên mặt cầu' },\n ],\n build: buildSphere,\n },\n {\n key: 'cylinder',\n label: 'Hình trụ',\n hintIdle: 'Chọn tâm đáy, tâm trên, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm trên' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCylinder,\n },\n {\n key: 'cone',\n label: 'Hình nón',\n hintIdle: 'Chọn tâm đáy, đỉnh, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCone,\n },\n];\n\nexport const TOOL_GROUPS: Record<string, ToolKey[]> = {\n 'Cơ bản': ['move', 'point', 'segment', 'line', 'plane'],\n 'Điểm': ['point', 'pointOnObject'],\n 'Đường thẳng': ['segment', 'line', 'ray', 'vector', 'polygon'],\n 'Mặt phẳng': ['plane'],\n 'Khối đa diện': ['pyramid', 'prism', 'tetrahedron', 'cube'],\n 'Khối cong': ['sphere', 'cylinder', 'cone'],\n};\n","import type { Scene3D } from '../scene/Scene3D';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport type { ToolKey, ToolStep, ToolSpec, CollectedArg } from './spec';\nimport { TOOLS } from './spec';\n\ninterface ControllerState {\n tool: ToolSpec | null;\n stepIndex: number;\n collected: CollectedArg[];\n hint: string;\n}\n\ntype Listener = (state: ControllerState) => void;\n\nfunction stepHint(step: ToolStep): string {\n return step.type === 'number' ? step.prompt : step.hint;\n}\n\nexport class ToolController {\n private state: ControllerState = { tool: null, stepIndex: 0, collected: [], hint: '' };\n private listeners = new Set<Listener>();\n\n constructor(private scene: Scene3D) {\n this.selectTool('move');\n }\n\n getState(): ControllerState { return this.state; }\n\n on(cb: Listener): () => void {\n this.listeners.add(cb);\n return () => {\n this.listeners.delete(cb);\n };\n }\n\n selectTool(key: ToolKey): void {\n const tool = TOOLS.find((t) => t.key === key) ?? TOOLS.find((t) => t.key === 'move')!;\n const firstStep = tool.steps[0];\n this.state = {\n tool,\n stepIndex: 0,\n collected: [],\n hint: firstStep ? stepHint(firstStep) : tool.hintIdle,\n };\n this.notify();\n }\n\n cancel(): void { this.selectTool('move'); }\n\n consumeHit(hit: SceneHit): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step) return false;\n\n // Polygon-like variable-vertex flow: when current step is closingPoint, an\n // existing-point hit matching the first collected vertex finalizes the\n // sub-sequence; any other surface hit appends another vertex (and the\n // controller stays at this stepIndex).\n if (step.type === 'closingPoint') {\n if (hit.kind === 'empty') return false;\n if (hit.kind === 'existingPoint') {\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n // Otherwise append another vertex using the previous 'point' step's allowNewOn\n const prevStep = tool.steps[this.state.stepIndex - 1];\n if (!prevStep || prevStep.type !== 'point') return false;\n if (!this.hitMatchesStep(hit, prevStep)) return false;\n this.state.collected.push({ step: prevStep, hit });\n // stepIndex stays at the closingPoint step\n this.notify();\n return true;\n }\n\n if (!this.hitMatchesStep(hit, step)) return false;\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n consumeNumber(value: number): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step || step.type !== 'number') return false;\n if (step.min != null && value < step.min) return false;\n if (step.max != null && value > step.max) return false;\n this.state.collected.push({ step, value });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n private hitMatchesStep(hit: SceneHit, step: ToolStep): boolean {\n if (step.type !== 'point' && step.type !== 'closingPoint') return false;\n if (hit.kind === 'empty') return false;\n if (step.type === 'closingPoint') return hit.kind === 'existingPoint';\n if (hit.kind === 'existingPoint') return step.allowExisting;\n const surfaceMap: Record<string, 'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> = {\n onGround: 'ground', onAxis: 'axis', onPlane: 'plane',\n onLine: 'line', onPolygon: 'polygon', onSphere: 'sphere',\n };\n const k = surfaceMap[hit.kind];\n return k != null && step.type === 'point' && step.allowNewOn.includes(k);\n }\n\n private advance(): void {\n const tool = this.state.tool!;\n if (this.state.stepIndex >= tool.steps.length) {\n tool.build(this.state.collected, this.scene);\n if (tool.repeatAfterBuild) {\n // Stay in this tool so the user can place several items in a row.\n this.state.stepIndex = 0;\n this.state.collected = [];\n this.state.hint = stepHint(tool.steps[0]);\n this.notify();\n } else {\n this.selectTool('move');\n }\n return;\n }\n this.state.hint = stepHint(tool.steps[this.state.stepIndex]);\n this.notify();\n }\n\n private notify(): void {\n for (const cb of this.listeners) cb(this.state);\n }\n}\n","import type { Vec3 } from '../scene/types';\n\nexport const CURVED_SEGMENTS = 16;\n\nexport function cylinderFaces(\n center: Vec3,\n top: Vec3,\n radius: number,\n): { vertices: Vec3[]; faces: number[][] } {\n const baseRing: Vec3[] = [];\n const topRing: Vec3[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n const dx = radius * Math.cos(theta);\n const dy = radius * Math.sin(theta);\n baseRing.push([center[0] + dx, center[1] + dy, center[2]]);\n topRing.push([top[0] + dx, top[1] + dy, top[2]]);\n }\n const vertices = [...baseRing, ...topRing];\n const faces: number[][] = [];\n faces.push(baseRing.map((_, i) => i));\n faces.push(topRing.map((_, i) => CURVED_SEGMENTS + i));\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const next = (i + 1) % CURVED_SEGMENTS;\n faces.push([i, next, CURVED_SEGMENTS + next, CURVED_SEGMENTS + i]);\n }\n return { vertices, faces };\n}\n\nexport function coneFaces(\n baseCenter: Vec3,\n apex: Vec3,\n radius: number,\n): { vertices: Vec3[]; faces: number[][] } {\n const baseRing: Vec3[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n baseRing.push([\n baseCenter[0] + radius * Math.cos(theta),\n baseCenter[1] + radius * Math.sin(theta),\n baseCenter[2],\n ]);\n }\n const apexIdx = baseRing.length;\n const vertices = [...baseRing, apex];\n const faces: number[][] = [baseRing.map((_, i) => i)];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n faces.push([i, (i + 1) % CURVED_SEGMENTS, apexIdx]);\n }\n return { vertices, faces };\n}\n","import type { Scene3D } from '../scene/Scene3D';\nimport type { Scene3DObject, Vec3 } from '../scene/types';\nimport { constraintToWorld } from '../scene/constraintMath';\nimport { cylinderFaces, coneFaces } from './faceted';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport interface View3DLike {\n create(type: string, parents: unknown[], attrs: Record<string, unknown>): JxgObj;\n}\n\nexport class JxgRenderer {\n private map = new Map<string, JxgObj>();\n private unsubAdd: () => void;\n private unsubChange: () => void;\n private unsubDelete: () => void;\n private unsubReset: () => void;\n\n constructor(private scene: Scene3D, private view: View3DLike) {\n this.unsubAdd = scene.on('add', (o) => this.handleAdd(o));\n this.unsubChange = scene.on('change', (o) => this.handleChange(o));\n this.unsubDelete = scene.on('delete', (id) => this.handleDelete(id));\n this.unsubReset = scene.on('reset', () => this.handleReset());\n for (const obj of scene.list()) this.handleAdd(obj);\n }\n\n dispose(): void {\n this.unsubAdd();\n this.unsubChange();\n this.unsubDelete();\n this.unsubReset();\n for (const [id, j] of this.map) {\n try { j.remove?.(); } catch { /* swallow */ }\n this.map.delete(id);\n }\n }\n\n private handleAdd(obj: Scene3DObject): void {\n if (this.map.has(obj.id)) return;\n\n if (obj.kind === 'point') {\n const world = constraintToWorld(obj.constraint, this.scene);\n // fixed: true disables JSXGraph's native drag. Drag of existing points\n // is handled exclusively by MiniBoard3D.shouldStartPointDrag +\n // EditorPanel.onPointerDrag so the constraint math (Z-only in Point\n // mode, XY raycast in Move mode) is the single source of truth.\n const attrs = { id: obj.id, name: obj.label, size: 4, visible: obj.visible, fixed: true };\n const jxg = this.view.create('point3d', world, attrs);\n this.map.set(obj.id, jxg);\n return;\n }\n\n if (obj.kind === 'segment') {\n const a = this.map.get(obj.p1);\n const b = this.map.get(obj.p2);\n const attrs = {\n id: obj.id,\n straightFirst: false,\n straightLast: false,\n visible: obj.visible,\n strokeColor: obj.color ?? '#0066cc',\n strokeWidth: 2,\n };\n this.map.set(obj.id, this.view.create('line3d', [a, b], attrs));\n return;\n }\n\n if (obj.kind === 'line') {\n const attrs = {\n id: obj.id,\n visible: obj.visible,\n strokeColor: obj.color ?? '#0066cc',\n strokeWidth: 2,\n };\n this.map.set(\n obj.id,\n this.view.create('line3d', [this.map.get(obj.p1), this.map.get(obj.p2)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'ray') {\n const attrs = { id: obj.id, straightFirst: false, visible: obj.visible };\n this.map.set(\n obj.id,\n this.view.create('line3d', [this.map.get(obj.origin), this.map.get(obj.through)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'vector') {\n const attrs = {\n id: obj.id,\n lastArrow: true,\n straightFirst: false,\n straightLast: false,\n visible: obj.visible,\n };\n this.map.set(\n obj.id,\n this.view.create('line3d', [this.map.get(obj.from), this.map.get(obj.to)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'plane') {\n const attrs = { id: obj.id, fillOpacity: 0.2, visible: obj.visible };\n this.map.set(\n obj.id,\n this.view.create(\n 'plane3d',\n [this.map.get(obj.p1), this.map.get(obj.p2), this.map.get(obj.p3)],\n attrs,\n ),\n );\n return;\n }\n\n if (obj.kind === 'polygon') {\n const refs = obj.vertices.map((v) => this.map.get(v));\n const attrs = { id: obj.id, fillOpacity: 0.3, visible: obj.visible };\n this.map.set(obj.id, this.view.create('polygon3d', [refs], attrs));\n return;\n }\n\n if (obj.kind === 'sphere') {\n const attrs = { id: obj.id, fillOpacity: 0.25, visible: obj.visible };\n this.map.set(\n obj.id,\n this.view.create('sphere3d', [this.map.get(obj.center), this.map.get(obj.surfacePoint)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'polyhedron') {\n const verts = obj.vertices.map((id) => this.map.get(id));\n const faceJxgs = obj.faces.map((face) =>\n this.view.create('polygon3d', [face.map((idx) => verts[idx])], {\n id: `${obj.id}.face${face.join('-')}`,\n fillOpacity: 0.25,\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n }),\n );\n // Composite: store an object with _faces array + a remove() that disposes each face.\n this.map.set(obj.id, {\n _faces: faceJxgs,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n remove: () => faceJxgs.forEach((f: any) => f.remove?.()),\n });\n return;\n }\n\n if (obj.kind === 'cylinder' || obj.kind === 'cone') {\n const baseCenterPt = this.scene.get(obj.baseCenter);\n if (!baseCenterPt || baseCenterPt.kind !== 'point') return;\n const base = constraintToWorld(baseCenterPt.constraint, this.scene);\n let secondPt: Vec3;\n if (obj.kind === 'cylinder') {\n const topCenterPt = this.scene.get(obj.topCenter);\n if (!topCenterPt || topCenterPt.kind !== 'point') return;\n secondPt = constraintToWorld(topCenterPt.constraint, this.scene);\n } else {\n const apexPt = this.scene.get(obj.apex);\n if (!apexPt || apexPt.kind !== 'point') return;\n secondPt = constraintToWorld(apexPt.constraint, this.scene);\n }\n const geom =\n obj.kind === 'cylinder'\n ? cylinderFaces(base, secondPt, obj.radius)\n : coneFaces(base, secondPt, obj.radius);\n // Create vertex point3d's (hidden), then polygon3d per face.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const vertJxgs: any[] = geom.vertices.map((v, i) =>\n this.view.create('point3d', v, {\n id: `${obj.id}.v${i}`,\n visible: false,\n fixed: true,\n withLabel: false,\n }),\n );\n const faceJxgs = geom.faces.map((face) =>\n this.view.create('polygon3d', [face.map((idx) => vertJxgs[idx])], {\n id: `${obj.id}.face${face.join('-')}`,\n fillOpacity: 0.25,\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n }),\n );\n this.map.set(obj.id, {\n _verts: vertJxgs,\n _faces: faceJxgs,\n remove: () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n faceJxgs.forEach((f: any) => f.remove?.());\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vertJxgs.forEach((v: any) => v.remove?.());\n },\n });\n return;\n }\n }\n\n private handleChange(obj: Scene3DObject): void {\n const j = this.map.get(obj.id);\n if (!j) return;\n if (obj.kind === 'point' && typeof j.moveTo === 'function') {\n const w = constraintToWorld(obj.constraint, this.scene);\n // time=0 → instant teleport. Without it some JSXGraph builds tween the\n // move, which under fast successive drag updates manifests as flicker.\n try { j.moveTo([w[0], w[1], w[2]], 0); } catch { /* swallow */ }\n }\n }\n\n private handleDelete(id: string): void {\n const j = this.map.get(id);\n if (!j) return;\n try { j.remove?.(); } catch { /* swallow */ }\n this.map.delete(id);\n }\n\n private handleReset(): void {\n for (const [, j] of this.map) {\n try { j.remove?.(); } catch { /* swallow */ }\n }\n this.map.clear();\n }\n}\n","import type { Vec3 } from '../scene/types';\n\nexport interface View3DLike {\n unprojectScreen?(sx: number, sy: number, depth: number): [number, number, number];\n project3DTo2D?(x: number, y: number, z: number): [number, number, number, number];\n}\n\nexport interface Ray3D {\n origin: Vec3;\n dir: Vec3;\n}\n\nexport function screenToRay(screen: { x: number; y: number }, view: View3DLike): Ray3D {\n // Strategy: unproject the screen point at two depths to get a ray through the scene.\n // Prefer view.unprojectScreen if available (mock); fallback to bisection via project3DTo2D.\n const near = unproject(screen, view, +20);\n const far = unproject(screen, view, -20);\n const dir: Vec3 = [far[0] - near[0], far[1] - near[1], far[2] - near[2]];\n const n = Math.sqrt(dir[0] ** 2 + dir[1] ** 2 + dir[2] ** 2);\n const norm: Vec3 = n === 0 ? [0, 0, -1] : [dir[0] / n, dir[1] / n, dir[2] / n];\n return { origin: near, dir: norm };\n}\n\nfunction unproject(screen: { x: number; y: number }, view: View3DLike, depth: number): Vec3 {\n if (typeof view.unprojectScreen === 'function') {\n const v = view.unprojectScreen(screen.x, screen.y, depth);\n return [v[0], v[1], v[2]];\n }\n // Fallback for real JSXGraph view3d (orthographic-affine projection).\n // Extract the world→screen affine coefficients by sampling project3DTo2D at origin\n // and the three unit-axis points, then solve the 2×2 in (x, y) at the given depth.\n if (typeof view.project3DTo2D === 'function') {\n const p0 = view.project3DTo2D(0, 0, 0);\n const px = view.project3DTo2D(1, 0, 0);\n const py = view.project3DTo2D(0, 1, 0);\n const pz = view.project3DTo2D(0, 0, 1);\n const ox = p0[1], oy = p0[2];\n const a = px[1] - ox, b = py[1] - ox, c = pz[1] - ox;\n const d = px[2] - oy, e = py[2] - oy, f = pz[2] - oy;\n const rhsX = screen.x - ox - c * depth;\n const rhsY = screen.y - oy - f * depth;\n const det = a * e - b * d;\n if (Math.abs(det) < 1e-9) return [0, 0, depth];\n const x = (e * rhsX - b * rhsY) / det;\n const y = (-d * rhsX + a * rhsY) / det;\n return [x, y, depth];\n }\n throw new Error('rayCast: view has neither unprojectScreen nor project3DTo2D');\n}\n","import type { Vec3 } from '../scene/types';\nimport type { Ray3D } from './rayCast';\n\nconst EPS = 1e-9;\n\nexport interface PlaneHit { point: Vec3; t: number }\nexport interface SphereHit { point: Vec3; t: number }\nexport interface SegmentHit { point: Vec3; t: number; tOnSegment: number }\n\nfunction dot(a: Vec3, b: Vec3): number { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; }\nfunction sub(a: Vec3, b: Vec3): Vec3 { return [a[0]-b[0], a[1]-b[1], a[2]-b[2]]; }\nfunction add(a: Vec3, b: Vec3): Vec3 { return [a[0]+b[0], a[1]+b[1], a[2]+b[2]]; }\nfunction scale(a: Vec3, k: number): Vec3 { return [a[0]*k, a[1]*k, a[2]*k]; }\nfunction norm2(a: Vec3): number { return dot(a, a); }\n\nexport function rayPlane(\n ray: Ray3D,\n plane: { point: Vec3; normal: Vec3 },\n): PlaneHit | null {\n const denom = dot(ray.dir, plane.normal);\n if (Math.abs(denom) < EPS) return null;\n const t = dot(sub(plane.point, ray.origin), plane.normal) / denom;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\nexport function rayGround(ray: Ray3D): PlaneHit | null {\n return rayPlane(ray, { point: [0, 0, 0], normal: [0, 0, 1] });\n}\n\nexport function raySphere(\n ray: Ray3D,\n sphere: { center: Vec3; radius: number },\n): SphereHit | null {\n const oc = sub(ray.origin, sphere.center);\n const b = dot(oc, ray.dir);\n const c = dot(oc, oc) - sphere.radius * sphere.radius;\n const disc = b * b - c;\n if (disc < 0) return null;\n const sqrtD = Math.sqrt(disc);\n const t1 = -b - sqrtD;\n const t2 = -b + sqrtD;\n const t = t1 >= 0 ? t1 : t2;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\n/**\n * Closest approach between ray and line segment. Accepts a distance threshold\n * (in world units; caller scales for pixel ratio).\n */\nexport function rayLineSegment(\n ray: Ray3D,\n seg: { a: Vec3; b: Vec3 },\n maxDistance: number,\n): SegmentHit | null {\n const u = ray.dir;\n const v = sub(seg.b, seg.a);\n const w0 = sub(ray.origin, seg.a);\n const a = dot(u, u);\n const bb = dot(u, v);\n const cc = dot(v, v);\n const d = dot(u, w0);\n const e = dot(v, w0);\n const denom = a * cc - bb * bb;\n if (Math.abs(denom) < EPS) return null;\n const sc = (bb * e - cc * d) / denom;\n const tc = (a * e - bb * d) / denom;\n if (sc < 0 || tc < 0 || tc > 1) return null;\n const pRay = add(ray.origin, scale(u, sc));\n const pSeg = add(seg.a, scale(v, tc));\n const dist2 = norm2(sub(pRay, pSeg));\n if (dist2 > maxDistance * maxDistance) return null;\n return { point: pSeg, t: sc, tOnSegment: tc };\n}\n","import { constraintToWorld } from '../scene/constraintMath';\nimport type { Scene3D } from '../scene/Scene3D';\nimport type { View3DLike } from './rayCast';\n\nexport function findSnapPoint(\n screen: { x: number; y: number },\n view: View3DLike,\n scene: Scene3D,\n pixelRadius = 8,\n): string | null {\n // `screen` arrives in JSXGraph user-space (pixelToUser-converted in MiniBoard3D),\n // and project3DTo2D also returns user-space. Convert the desired pixel radius\n // to user units via the board's px-per-unit scale so the snap stays small\n // (a few real pixels) regardless of zoom or board size.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing — keeps unit tests, whose\n // mock view emits pixel-space coords directly, working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const uy = typeof board?.unitY === 'number' && board.unitY > 0 ? board.unitY : ux;\n const rxUser = pixelRadius / ux;\n const ryUser = pixelRadius / uy;\n let best: { id: string; d2: number } | null = null;\n for (const obj of scene.list()) {\n if (obj.kind !== 'point') continue;\n if (!obj.visible) continue;\n const world = constraintToWorld(obj.constraint, scene);\n const proj = view.project3DTo2D?.(world[0], world[1], world[2]);\n if (!proj) continue;\n const dxN = (proj[1] - screen.x) / rxUser;\n const dyN = (proj[2] - screen.y) / ryUser;\n const d2 = dxN * dxN + dyN * dyN;\n if (d2 <= 1 && (best === null || d2 < best.d2)) {\n best = { id: obj.id, d2 };\n }\n }\n return best?.id ?? null;\n}\n","import { screenToRay, type View3DLike } from './rayCast';\nimport { rayGround, rayLineSegment, rayPlane, raySphere } from './intersect';\nimport { findSnapPoint } from './snapping';\nimport { constraintToWorld } from '../scene/constraintMath';\nimport type { Scene3D } from '../scene/Scene3D';\nimport type { Vec3 } from '../scene/types';\n\n// NOTE (v0.8.0): onPolygon and onLine SceneHit variants are typed but not yet\n// produced by hitTest. They will be added once tools require placing points\n// on user-defined lines/polygons (deferred from Task 2.4).\n\nexport type SceneHit =\n | { kind: 'existingPoint'; pointId: string }\n | { kind: 'onGround'; world: Vec3 }\n | { kind: 'onAxis'; axis: 'x' | 'y' | 'z'; t: number; world: Vec3 }\n | { kind: 'onPlane'; planeId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onLine'; lineId: string; t: number; world: Vec3 }\n | { kind: 'onPolygon'; polygonId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onSphere'; sphereId: string; theta: number; phi: number; world: Vec3 }\n | { kind: 'empty' };\n\nconst AXIS_PIXEL_THRESHOLD = 12;\n\nexport function hitTest(\n screen: { x: number; y: number },\n view: View3DLike,\n scene: Scene3D,\n): SceneHit {\n // `screen` arrives in user-space; thresholds below are in pixels and need to\n // be converted to user units via the board's px-per-unit scale.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing so the hitTest unit tests,\n // whose mock view emits pixel-space coords directly, keep working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const axisThresholdUser = AXIS_PIXEL_THRESHOLD / ux;\n\n // 1. Existing point snap\n const snap = findSnapPoint(screen, view, scene);\n if (snap) return { kind: 'existingPoint', pointId: snap };\n\n const ray = screenToRay(screen, view);\n\n // 2. Spheres\n let bestSphere: { id: string; t: number; world: Vec3 } | null = null;\n for (const obj of scene.list()) {\n if (obj.kind !== 'sphere' || !obj.visible) continue;\n const centerPoint = scene.get(obj.center);\n const surfacePoint = scene.get(obj.surfacePoint);\n if (!centerPoint || centerPoint.kind !== 'point') continue;\n if (!surfacePoint || surfacePoint.kind !== 'point') continue;\n const center = constraintToWorld(centerPoint.constraint, scene);\n const surface = constraintToWorld(surfacePoint.constraint, scene);\n const radius = Math.hypot(\n surface[0] - center[0],\n surface[1] - center[1],\n surface[2] - center[2],\n );\n const sh = raySphere(ray, { center, radius });\n if (sh && (bestSphere === null || sh.t < bestSphere.t)) {\n bestSphere = { id: obj.id, t: sh.t, world: sh.point };\n }\n }\n\n // 3. Axis snap — project click onto each axis line in screen space, check pixel distance\n if (view.project3DTo2D) {\n const axes: { axis: 'x' | 'y' | 'z'; a: Vec3; b: Vec3 }[] = [\n { axis: 'x', a: [-10, 0, 0], b: [10, 0, 0] },\n { axis: 'y', a: [0, -10, 0], b: [0, 10, 0] },\n { axis: 'z', a: [0, 0, -10], b: [0, 0, 10] },\n ];\n for (const ax of axes) {\n const pa = view.project3DTo2D(ax.a[0], ax.a[1], ax.a[2]);\n const pb = view.project3DTo2D(ax.b[0], ax.b[1], ax.b[2]);\n const d = distScreenPointToSegment(screen, [pa[1], pa[2]], [pb[1], pb[2]]);\n if (d <= axisThresholdUser) {\n const hit = rayLineSegment(ray, { a: ax.a, b: ax.b }, 1e3);\n if (hit) {\n const t = ax.axis === 'x' ? hit.point[0] : ax.axis === 'y' ? hit.point[1] : hit.point[2];\n return { kind: 'onAxis', axis: ax.axis, t, world: hit.point };\n }\n }\n }\n }\n\n // 4. User-defined planes\n let bestPlane: { id: string; t: number; world: Vec3; basis: NonNullable<ReturnType<typeof planeBasis>> } | null = null;\n for (const obj of scene.list()) {\n if (obj.kind !== 'plane' || !obj.visible) continue;\n const basis = planeBasis(obj, scene);\n if (!basis) continue;\n const ph = rayPlane(ray, { point: basis.origin, normal: basis.normal });\n if (ph && (bestPlane === null || ph.t < bestPlane.t)) {\n bestPlane = { id: obj.id, t: ph.t, world: ph.point, basis };\n }\n }\n // Compare best plane to best sphere — return whichever is closer\n if (bestPlane && (!bestSphere || bestPlane.t < bestSphere.t)) {\n const rel: Vec3 = [\n bestPlane.world[0] - bestPlane.basis.origin[0],\n bestPlane.world[1] - bestPlane.basis.origin[1],\n bestPlane.world[2] - bestPlane.basis.origin[2],\n ];\n const b1n = dot3(bestPlane.basis.basis1, bestPlane.basis.basis1);\n const b2n = dot3(bestPlane.basis.basis2, bestPlane.basis.basis2);\n const u = b1n === 0 ? 0 : dot3(rel, bestPlane.basis.basis1) / b1n;\n const v = b2n === 0 ? 0 : dot3(rel, bestPlane.basis.basis2) / b2n;\n return { kind: 'onPlane', planeId: bestPlane.id, u, v, world: bestPlane.world };\n }\n\n // 5. Sphere result (if found)\n if (bestSphere) {\n const sph = scene.get(bestSphere.id);\n if (sph && sph.kind === 'sphere') {\n const centerPt = scene.get(sph.center);\n if (centerPt && centerPt.kind === 'point') {\n const center = constraintToWorld(centerPt.constraint, scene);\n const relX = bestSphere.world[0] - center[0];\n const relY = bestSphere.world[1] - center[1];\n const relZ = bestSphere.world[2] - center[2];\n const r = Math.hypot(relX, relY, relZ);\n const phi = r === 0 ? 0 : Math.acos(relZ / r);\n const theta = Math.atan2(relY, relX);\n return { kind: 'onSphere', sphereId: bestSphere.id, theta, phi, world: bestSphere.world };\n }\n }\n }\n\n // 6. Ground\n const g = rayGround(ray);\n if (g) return { kind: 'onGround', world: g.point };\n\n return { kind: 'empty' };\n}\n\nfunction distScreenPointToSegment(\n p: { x: number; y: number },\n a: [number, number],\n b: [number, number],\n): number {\n const vx = b[0] - a[0];\n const vy = b[1] - a[1];\n const wx = p.x - a[0];\n const wy = p.y - a[1];\n const c1 = vx * wx + vy * wy;\n if (c1 <= 0) return Math.hypot(wx, wy);\n const c2 = vx * vx + vy * vy;\n if (c2 <= c1) return Math.hypot(p.x - b[0], p.y - b[1]);\n const t = c1 / c2;\n const px = a[0] + t * vx;\n const py = a[1] + t * vy;\n return Math.hypot(p.x - px, p.y - py);\n}\n\nfunction planeBasis(\n planeObj: { p1: string; p2: string; p3: string },\n scene: Scene3D,\n): { origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3 } | null {\n const p1Obj = scene.get(planeObj.p1);\n const p2Obj = scene.get(planeObj.p2);\n const p3Obj = scene.get(planeObj.p3);\n if (!p1Obj || p1Obj.kind !== 'point') return null;\n if (!p2Obj || p2Obj.kind !== 'point') return null;\n if (!p3Obj || p3Obj.kind !== 'point') return null;\n const p1 = constraintToWorld(p1Obj.constraint, scene);\n const p2 = constraintToWorld(p2Obj.constraint, scene);\n const p3 = constraintToWorld(p3Obj.constraint, scene);\n const basis1: Vec3 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];\n const tmp: Vec3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];\n const cx = basis1[1]*tmp[2] - basis1[2]*tmp[1];\n const cy = basis1[2]*tmp[0] - basis1[0]*tmp[2];\n const cz = basis1[0]*tmp[1] - basis1[1]*tmp[0];\n const cLen = Math.hypot(cx, cy, cz);\n if (cLen === 0) return null;\n const normal: Vec3 = [cx / cLen, cy / cLen, cz / cLen];\n const basis2: Vec3 = [\n normal[1]*basis1[2] - normal[2]*basis1[1],\n normal[2]*basis1[0] - normal[0]*basis1[2],\n normal[0]*basis1[1] - normal[1]*basis1[0],\n ];\n return { origin: p1, basis1, basis2, normal };\n}\n\nfunction dot3(a: Vec3, b: Vec3): number {\n return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n}\n","'use client';\nimport * as React from 'react';\nimport {\n DEFAULT_VIEW3D,\n GROUND_PLANE_ATTRS,\n GROUND_PLANE_RANGE,\n VIEW3D_ATTRS,\n paletteFor,\n} from './theme';\n\n// JSXGraph board / view types are not published — use minimal local shapes.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgBoard = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgView3D = any;\n\nexport interface MiniBoard3DProps {\n isDark: boolean;\n onView3DReady?: (view: JxgView3D, board: JxgBoard) => void;\n onPointerClick?: (screen: { x: number; y: number }) => void;\n onPointerMove?: (screen: { x: number; y: number }) => void;\n onPointerLeave?: () => void;\n /**\n * Called on pointerdown. Return true to switch the upcoming drag from the\n * default view-rotate mode into a delegated point-drag (passed to\n * onPointerDrag / onPointerDragEnd). The screen coord is in user-space.\n */\n shouldStartPointDrag?: (screen: { x: number; y: number }) => boolean;\n onPointerDrag?: (screen: { x: number; y: number }) => void;\n /**\n * Called at the end of a point-drag gesture (also invoked defensively on\n * pointerleave during an in-flight drag). The screen coord is in user-space.\n * Consumers that only need a \"drag ended\" notification may ignore the arg.\n */\n onPointerDragEnd?: (screen: { x: number; y: number }) => void;\n}\n\nexport interface MiniBoard3DHandle {\n getBoard: () => JxgBoard | null;\n getView3D: () => JxgView3D | null;\n /** Returns the current SVG element of the board for export. */\n getSvgElement: () => SVGSVGElement | null;\n}\n\nexport const MiniBoard3D = React.forwardRef<MiniBoard3DHandle, MiniBoard3DProps>(\n function MiniBoard3D(props, ref) {\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const boardRef = React.useRef<JxgBoard | null>(null);\n const viewRef = React.useRef<JxgView3D | null>(null);\n const {\n isDark,\n onView3DReady,\n onPointerClick,\n onPointerMove,\n onPointerLeave,\n shouldStartPointDrag,\n onPointerDrag,\n onPointerDragEnd,\n } = props;\n\n // Keep latest callback refs stable across re-renders so the init effect\n // doesn't have to re-run when handlers change.\n const onView3DReadyRef = React.useRef(onView3DReady);\n const onPointerClickRef = React.useRef(onPointerClick);\n const onPointerMoveRef = React.useRef(onPointerMove);\n const onPointerLeaveRef = React.useRef(onPointerLeave);\n const shouldStartPointDragRef = React.useRef(shouldStartPointDrag);\n const onPointerDragRef = React.useRef(onPointerDrag);\n const onPointerDragEndRef = React.useRef(onPointerDragEnd);\n onView3DReadyRef.current = onView3DReady;\n onPointerClickRef.current = onPointerClick;\n onPointerMoveRef.current = onPointerMove;\n onPointerLeaveRef.current = onPointerLeave;\n shouldStartPointDragRef.current = shouldStartPointDrag;\n onPointerDragRef.current = onPointerDrag;\n onPointerDragEndRef.current = onPointerDragEnd;\n\n React.useImperativeHandle(\n ref,\n () => ({\n getBoard: () => boardRef.current,\n getView3D: () => viewRef.current,\n getSvgElement: () => containerRef.current?.querySelector('svg') ?? null,\n }),\n [],\n );\n\n React.useEffect(() => {\n const div = containerRef.current;\n if (!div) return;\n let cancelled = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let JXG: any = null;\n let board: JxgBoard | null = null;\n let svgEl: SVGSVGElement | null = null;\n let handlePointerDown: ((e: PointerEvent) => void) | null = null;\n let handlePointerMove: ((e: PointerEvent) => void) | null = null;\n let handlePointerUp: ((e: PointerEvent) => void) | null = null;\n let handlePointerLeave: (() => void) | null = null;\n\n void (async () => {\n try {\n JXG = (await import('jsxgraph')).default;\n } catch {\n return;\n }\n if (cancelled || !containerRef.current) return;\n try {\n JXG.Options.text.display = 'internal';\n } catch {\n /* ignore option set error in some mocks */\n }\n\n try {\n board = JXG.JSXGraph.initBoard(div, {\n boundingbox: [-6, 6, 6, -6],\n keepaspectratio: true,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n });\n } catch {\n return;\n }\n if (cancelled || !board) return;\n boardRef.current = board;\n\n let view: JxgView3D | null = null;\n try {\n const baseAttrs = VIEW3D_ATTRS(isDark);\n view = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [DEFAULT_VIEW3D.bbox3D[0], DEFAULT_VIEW3D.bbox3D[3]],\n [DEFAULT_VIEW3D.bbox3D[1], DEFAULT_VIEW3D.bbox3D[4]],\n [DEFAULT_VIEW3D.bbox3D[2], DEFAULT_VIEW3D.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n // JSXGraph view3d đọc giá trị khởi tạo từ az.slider.start (không\n // phải az.value). Pass nhầm `value` → JSXGraph dùng default\n // 1.0/0.3, khiến DEFAULT_VIEW3D bị bỏ qua.\n az: { ...baseAttrs.az, slider: { ...baseAttrs.az.slider, start: DEFAULT_VIEW3D.azimuth } },\n el: { ...baseAttrs.el, slider: { ...baseAttrs.el.slider, start: DEFAULT_VIEW3D.elevation } },\n },\n );\n } catch {\n /* ignore — mock or jsdom limitation */\n }\n viewRef.current = view;\n if (view) {\n // GeoGebra-style XY ground plane through origin (z=0), drawn behind\n // any user-created geometry. View3D's built-in zPlaneRear sits at the\n // bbox floor (z=zMin), not at the axes — so we draw an explicit one.\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => unknown }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(isDark),\n );\n } catch {\n /* swallow — older JSXGraph or mock may not support 5-arg plane3d */\n }\n onView3DReadyRef.current?.(view, board);\n }\n\n svgEl = (containerRef.current?.querySelector('svg') ?? null) as SVGSVGElement | null;\n if (svgEl) {\n const p = paletteFor(isDark);\n svgEl.style.background = p.view3dBg;\n\n // Convert browser pixel coords to JSXGraph user-space coords so that\n // hitTest math (which compares against view.project3DTo2D output, also\n // in user-space) is in the same coordinate system.\n const pixelToUser = (e: PointerEvent): { x: number; y: number } => {\n const rect = svgEl!.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const b = board as any;\n if (!b || !b.origin || !b.origin.scrCoords) {\n return { x: px, y: py };\n }\n const ox = b.origin.scrCoords[1];\n const oy = b.origin.scrCoords[2];\n const ux = b.unitX || 1;\n const uy = b.unitY || 1;\n return { x: (px - ox) / ux, y: (oy - py) / uy };\n };\n // Drag-to-rotate: track pointerdown start; if pointer travels past\n // DRAG_THRESHOLD before pointerup → rotate az/el and suppress click.\n const DRAG_THRESHOLD = 4;\n const AZ_PER_PX = 0.01;\n const EL_PER_PX = 0.01;\n const EL_LIMIT = Math.PI / 2 - 0.05;\n let dragStart: { x: number; y: number } | null = null;\n let dragging = false;\n let pointDragMode = false;\n let startAz = 0;\n let startEl = 0;\n const readAng = (s: { Value?: () => number; value?: number } | undefined): number => {\n if (!s) return 0;\n if (typeof s.Value === 'function') {\n try { return s.Value(); } catch { /* fallthrough */ }\n }\n return typeof s.value === 'number' ? s.value : 0;\n };\n const setAng = (\n s: { setValue?: (v: number) => void; value?: number } | undefined,\n v: number,\n ): void => {\n if (!s) return;\n if (typeof s.setValue === 'function') {\n try { s.setValue(v); return; } catch { /* fallthrough */ }\n }\n s.value = v;\n };\n\n handlePointerDown = (e: PointerEvent) => {\n if (!svgEl) return;\n dragStart = { x: e.clientX, y: e.clientY };\n dragging = false;\n pointDragMode = false;\n // If the consumer claims this drag (e.g. cursor is over an existing\n // point), enter point-drag mode and skip view-rotation.\n const screen = pixelToUser(e);\n try {\n pointDragMode = shouldStartPointDragRef.current?.(screen) ?? false;\n } catch { pointDragMode = false; }\n if (!pointDragMode) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = viewRef.current as any;\n startAz = readAng(v?.az_slide ?? v?.az);\n startEl = readAng(v?.el_slide ?? v?.el);\n }\n try { svgEl.setPointerCapture?.(e.pointerId); } catch { /* ignore */ }\n };\n handlePointerMove = (e: PointerEvent) => {\n if (!svgEl) return;\n if (dragStart) {\n const dx = e.clientX - dragStart.x;\n const dy = e.clientY - dragStart.y;\n if (!dragging && Math.hypot(dx, dy) > DRAG_THRESHOLD) dragging = true;\n if (dragging) {\n if (pointDragMode) {\n onPointerDragRef.current?.(pixelToUser(e));\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = viewRef.current as any;\n const newAz = startAz + dx * AZ_PER_PX;\n let newEl = startEl - dy * EL_PER_PX;\n if (newEl > EL_LIMIT) newEl = EL_LIMIT;\n if (newEl < -EL_LIMIT) newEl = -EL_LIMIT;\n setAng(v?.az_slide ?? v?.az, newAz);\n setAng(v?.el_slide ?? v?.el, newEl);\n try { v?.board?.update?.(); } catch { /* ignore */ }\n return;\n }\n }\n onPointerMoveRef.current?.(pixelToUser(e));\n };\n handlePointerUp = (e: PointerEvent) => {\n if (!svgEl) return;\n const wasDrag = dragging;\n const hadDown = dragStart !== null;\n const wasPointDrag = pointDragMode;\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n try { svgEl.releasePointerCapture?.(e.pointerId); } catch { /* ignore */ }\n // When the consumer claimed the gesture (pointDragMode), it owns\n // both placement and finalisation. Always run onPointerDragEnd so\n // any consumer-side refs are cleared (and an undo checkpoint can\n // be pushed), and SKIP onPointerClick to avoid double-handling\n // (e.g. Point-tool place-and-lift creates the point in\n // shouldStartPointDrag; we mustn't also fire the\n // click→consumeHit→buildPoint path).\n if (hadDown && wasPointDrag) {\n onPointerDragEndRef.current?.(pixelToUser(e));\n return;\n }\n if (hadDown && !wasDrag) {\n onPointerClickRef.current?.(pixelToUser(e));\n }\n };\n handlePointerLeave = () => {\n if (pointDragMode) {\n // Best-effort cleanup so a stray pointerleave during a drag\n // doesn't leak the consumer's draggedPointRef.\n try { onPointerDragEndRef.current?.({ x: 0, y: 0 }); } catch { /* ignore */ }\n }\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n onPointerLeaveRef.current?.();\n };\n svgEl.addEventListener('pointerdown', handlePointerDown);\n svgEl.addEventListener('pointermove', handlePointerMove);\n svgEl.addEventListener('pointerup', handlePointerUp);\n svgEl.addEventListener('pointercancel', handlePointerUp);\n svgEl.addEventListener('pointerleave', handlePointerLeave);\n }\n })();\n\n return () => {\n cancelled = true;\n if (svgEl) {\n if (handlePointerDown) svgEl.removeEventListener('pointerdown', handlePointerDown);\n if (handlePointerMove) svgEl.removeEventListener('pointermove', handlePointerMove);\n if (handlePointerUp) {\n svgEl.removeEventListener('pointerup', handlePointerUp);\n svgEl.removeEventListener('pointercancel', handlePointerUp);\n }\n if (handlePointerLeave) svgEl.removeEventListener('pointerleave', handlePointerLeave);\n }\n try {\n if (board && JXG) JXG.JSXGraph.freeBoard(board);\n } catch {\n /* swallow teardown errors in tests */\n }\n boardRef.current = null;\n viewRef.current = null;\n };\n }, [isDark]);\n\n const p = paletteFor(isDark);\n\n return (\n <div\n data-testid=\"mini-board-3d\"\n ref={containerRef}\n style={{\n width: '100%',\n height: '100%',\n minHeight: 400,\n background: p.view3dBg,\n position: 'relative',\n // Clip JSXGraph mesh3d paths projecting outside the container.\n overflow: 'hidden',\n }}\n />\n );\n },\n);\n","'use client';\nimport * as React from 'react';\n\nexport interface StatusHintProps {\n hint: string;\n hoverLabel?: string | null;\n}\n\nexport function StatusHint(props: StatusHintProps): React.ReactElement {\n const { hint, hoverLabel } = props;\n return (\n <div\n data-testid=\"status-hint\"\n className=\"border-t border-zinc-200 bg-zinc-50 px-3 py-1.5 text-xs text-zinc-700 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\"\n >\n <span>📐 {hint || 'Chọn công cụ trong bảng bên trái'}</span>\n {hoverLabel ? (\n <span className=\"ml-3 text-zinc-500\">— đang trên: {hoverLabel}</span>\n ) : null}\n </div>\n );\n}\n","import type { ObjectKind } from './types';\n\nconst A = 'A'.charCodeAt(0);\n\nexport function nextPointLabel(existing: string[]): string {\n const used = new Set(existing);\n for (let suffix = 0; suffix < 1000; suffix++) {\n for (let i = 0; i < 26; i++) {\n const letter = String.fromCharCode(A + i);\n const candidate = suffix === 0 ? letter : `${letter}_${suffix}`;\n if (!used.has(candidate)) return candidate;\n }\n }\n return `P_${used.size}`;\n}\n\nconst LOWERCASE_KINDS: ObjectKind[] = ['segment', 'line', 'ray', 'vector'];\nconst PREFIX: Partial<Record<ObjectKind, string>> = {\n sphere: 's',\n polyhedron: 'h',\n cylinder: 'c',\n cone: 'k',\n polygon: 'g',\n plane: 'π',\n};\n\nexport function nextDerivedLabel(kind: ObjectKind, existing: string[]): string {\n const used = new Set(existing);\n if (LOWERCASE_KINDS.includes(kind)) {\n for (let i = 0; i < 26; i++) {\n const c = String.fromCharCode('a'.charCodeAt(0) + i);\n if (!used.has(c)) return c;\n }\n for (let n = 1; n < 1000; n++) {\n const c = `a_${n}`;\n if (!used.has(c)) return c;\n }\n }\n const prefix = PREFIX[kind] ?? kind[0];\n for (let n = 1; n < 1000; n++) {\n const candidate = `${prefix}_${n}`;\n if (!used.has(candidate)) return candidate;\n }\n return `${prefix}_x`;\n}\n","import { nextPointLabel, nextDerivedLabel } from './labels';\nimport type { Constraint, Scene3DObject, ObjectKind } from './types';\n\ntype Listener<E> = (event: E) => void;\n\nexport type SceneSnapshot = {\n objects: ReadonlyMap<string, Scene3DObject>;\n order: readonly string[];\n counter: number;\n};\n\nexport class Scene3D {\n private objects = new Map<string, Scene3DObject>();\n private order: string[] = [];\n private counter = 0;\n private listeners = {\n add: new Set<Listener<Scene3DObject>>(),\n change: new Set<Listener<Scene3DObject>>(),\n delete: new Set<Listener<string>>(),\n reset: new Set<Listener<void>>(),\n };\n\n private historyPast: SceneSnapshot[] = [];\n private historyFuture: SceneSnapshot[] = [];\n private historySuspended = false;\n private historyListeners = new Set<() => void>();\n\n on(event: 'add', cb: Listener<Scene3DObject>): () => void;\n on(event: 'change', cb: Listener<Scene3DObject>): () => void;\n on(event: 'delete', cb: Listener<string>): () => void;\n on(event: 'reset', cb: Listener<void>): () => void;\n on(event: keyof Scene3D['listeners'], cb: Listener<never>): () => void {\n const set = this.listeners[event] as Set<Listener<never>>;\n set.add(cb);\n return () => {\n set.delete(cb);\n };\n }\n\n private nextId(prefix: string): string {\n this.counter += 1;\n return `${prefix}${this.counter}`;\n }\n\n addPoint(constraint: Constraint, label?: string, color?: string): string {\n this.capture();\n const id = this.nextId('p');\n const existingLabels = this.list().filter((o) => o.kind === 'point').map((o) => o.label);\n const autoLabel = label ?? nextPointLabel(existingLabels);\n const obj: Scene3DObject = {\n kind: 'point',\n id,\n label: autoLabel,\n visible: true,\n color,\n constraint,\n };\n this.objects.set(id, obj);\n this.order.push(id);\n this.listeners.add.forEach((cb) => cb(obj));\n return id;\n }\n\n addObject<K extends Exclude<ObjectKind, 'point'>>(\n kind: K,\n spec: Omit<Extract<Scene3DObject, { kind: K }>, 'id' | 'label' | 'visible' | 'kind'>,\n label?: string,\n ): string {\n this.capture();\n const id = this.nextId(kind[0]);\n const existingLabels = this.list().filter((o) => o.kind === kind).map((o) => o.label);\n const autoLabel = label ?? nextDerivedLabel(kind, existingLabels);\n const obj = { id, label: autoLabel, visible: true, kind, ...spec } as unknown as Scene3DObject;\n this.objects.set(id, obj);\n this.order.push(id);\n this.listeners.add.forEach((cb) => cb(obj));\n return id;\n }\n\n insert(obj: Scene3DObject): void {\n this.capture();\n if (this.objects.has(obj.id)) {\n throw new Error(`Scene3D.insert: id ${obj.id} already exists`);\n }\n this.objects.set(obj.id, obj);\n this.order.push(obj.id);\n this.listeners.add.forEach((cb) => cb(obj));\n }\n\n get(id: string): Scene3DObject | undefined {\n return this.objects.get(id);\n }\n\n list(): Scene3DObject[] {\n return this.order\n .map((id) => this.objects.get(id))\n .filter((obj): obj is Scene3DObject => obj !== undefined);\n }\n\n private referencedIds(obj: Scene3DObject): string[] {\n switch (obj.kind) {\n case 'point': {\n const c = obj.constraint;\n if (c.kind === 'onPlane') return [c.planeId];\n if (c.kind === 'onLine') return [c.lineId];\n if (c.kind === 'onPolygon') return [c.polygonId];\n if (c.kind === 'onSphere') return [c.sphereId];\n return [];\n }\n case 'segment':\n case 'line': return [obj.p1, obj.p2];\n case 'ray': return [obj.origin, obj.through];\n case 'vector': return [obj.from, obj.to];\n case 'polygon': return obj.vertices;\n case 'plane': return [obj.p1, obj.p2, obj.p3];\n case 'sphere': return [obj.center, obj.surfacePoint];\n case 'polyhedron': return obj.vertices;\n case 'cylinder': return [obj.baseCenter, obj.topCenter];\n case 'cone': return [obj.baseCenter, obj.apex];\n }\n }\n\n private collectDependents(targetId: string): Set<string> {\n const dependents = new Set<string>([targetId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of this.objects.values()) {\n if (dependents.has(obj.id)) continue;\n const refs = this.referencedIds(obj);\n if (refs.some((r) => dependents.has(r))) {\n dependents.add(obj.id);\n grew = true;\n }\n }\n }\n return dependents;\n }\n\n delete(id: string): void {\n if (!this.objects.has(id)) return;\n this.capture();\n const toDelete = this.collectDependents(id);\n for (const dependentId of toDelete) {\n this.objects.delete(dependentId);\n this.order = this.order.filter((x) => x !== dependentId);\n this.listeners.delete.forEach((cb) => cb(dependentId));\n }\n }\n\n reset(): void {\n this.capture();\n this.objects.clear();\n this.order = [];\n this.counter = 0;\n this.listeners.reset.forEach((cb) => cb());\n }\n\n reserveId(prefix: string): string {\n return this.nextId(prefix);\n }\n\n emitChange(id: string): void {\n const obj = this.objects.get(id);\n if (!obj) return;\n this.listeners.change.forEach((cb) => cb(obj));\n }\n\n snapshot(): SceneSnapshot {\n const cloned = new Map<string, Scene3DObject>();\n for (const [id, obj] of this.objects) {\n cloned.set(id, { ...obj } as Scene3DObject);\n }\n return {\n objects: cloned,\n order: [...this.order],\n counter: this.counter,\n };\n }\n\n private restore(snap: SceneSnapshot): void {\n this.objects = new Map();\n for (const [id, obj] of snap.objects) {\n this.objects.set(id, { ...obj } as Scene3DObject);\n }\n this.order = [...snap.order];\n this.counter = snap.counter;\n this.listeners.reset.forEach((cb) => cb());\n for (const id of this.order) {\n const obj = this.objects.get(id);\n if (obj) this.listeners.add.forEach((cb) => cb(obj));\n }\n }\n\n private capture(): void {\n if (this.historySuspended) return;\n this.historyPast.push(this.snapshot());\n this.historyFuture = [];\n this.notifyHistoryChange();\n }\n\n canUndo(): boolean {\n return this.historyPast.length > 0;\n }\n\n canRedo(): boolean {\n return this.historyFuture.length > 0;\n }\n\n undo(): void {\n const prev = this.historyPast.pop();\n if (!prev) return;\n this.historyFuture.push(this.snapshot());\n this.restore(prev);\n this.notifyHistoryChange();\n }\n\n redo(): void {\n const next = this.historyFuture.pop();\n if (!next) return;\n this.historyPast.push(this.snapshot());\n this.restore(next);\n this.notifyHistoryChange();\n }\n\n withoutHistory(fn: () => void): void {\n const prev = this.historySuspended;\n this.historySuspended = true;\n try {\n fn();\n } finally {\n this.historySuspended = prev;\n }\n }\n\n pushUndoCheckpoint(prev: SceneSnapshot): void {\n if (this.historySuspended) return;\n this.historyPast.push(prev);\n this.historyFuture = [];\n this.notifyHistoryChange();\n }\n\n onHistoryChange(cb: () => void): () => void {\n this.historyListeners.add(cb);\n return () => {\n this.historyListeners.delete(cb);\n };\n }\n\n private notifyHistoryChange(): void {\n this.historyListeners.forEach((cb) => cb());\n }\n}\n","import { Scene3D } from './Scene3D';\nimport type { Constraint, Scene3DObject } from './types';\nimport type { SerializedBoard3D, SerializedElement3D } from '../../serialize';\nimport { constraintToWorld } from './constraintMath';\n\n/**\n * Translate a live Scene3D into a v2 SerializedBoard3D.\n *\n * Strategy: each Scene3DObject becomes one or more SerializedElement3D entries.\n * Points carry an explicit `constraint` field. Derived objects (segment/line/\n * polygon/...) reference the point ids via `attributes.sceneSpec` so\n * round-trip is unambiguous, and `parents` is left empty (the loader\n * reconstructs from `sceneSpec` rather than `parents` at load time).\n */\nexport function sceneToBoard(\n scene: Scene3D,\n view: { azimuth: number; elevation: number; bbox3D: [number, number, number, number, number, number] },\n bbox: [number, number, number, number],\n): SerializedBoard3D {\n const elements: SerializedElement3D[] = [];\n for (const obj of scene.list()) {\n const els = sceneObjectToElements(obj, scene);\n elements.push(...els);\n }\n return { version: 2, bbox, view, showAxes: true, showMesh: true, elements };\n}\n\nfunction sceneObjectToElements(obj: Scene3DObject, scene: Scene3D): SerializedElement3D[] {\n const baseAttrs = { label: obj.label, visible: obj.visible, color: obj.color };\n switch (obj.kind) {\n case 'point': {\n let w: [number, number, number];\n try {\n w = constraintToWorld(obj.constraint, scene);\n } catch {\n // If dependent objects are missing, fall back to origin so the entry\n // still serializes; loader uses `constraint` (not parents) for v2.\n w = [0, 0, 0];\n }\n return [{\n type: 'point3d',\n parents: [w[0], w[1], w[2]],\n attributes: { id: obj.id, ...baseAttrs },\n id: obj.id,\n label: obj.label,\n constraint: obj.constraint,\n }];\n }\n case 'segment':\n case 'line':\n case 'ray':\n case 'vector':\n case 'plane':\n case 'sphere':\n case 'polygon':\n case 'polyhedron':\n case 'cylinder':\n case 'cone': {\n return [{\n type: pickJxgType(obj.kind),\n parents: [],\n attributes: { id: obj.id, ...baseAttrs, sceneKind: obj.kind, sceneSpec: encodeSpec(obj) },\n id: obj.id,\n label: obj.label,\n }];\n }\n }\n}\n\nfunction pickJxgType(kind: Scene3DObject['kind']): SerializedElement3D['type'] {\n switch (kind) {\n case 'point': return 'point3d';\n case 'segment':\n case 'line':\n case 'ray':\n case 'vector': return 'line3d';\n case 'plane': return 'plane3d';\n case 'sphere': return 'sphere3d';\n case 'polygon':\n case 'polyhedron':\n case 'cylinder':\n case 'cone': return 'polygon3d';\n }\n}\n\nfunction encodeSpec(obj: Scene3DObject): Record<string, unknown> {\n // Strip the base/identity fields; the rest is the kind-specific spec that\n // boardToScene needs to reconstruct the object. `kind` is preserved in the\n // sibling `sceneKind` attribute so it isn't duplicated here.\n const rest: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (k === 'id' || k === 'label' || k === 'visible' || k === 'color' || k === 'kind') continue;\n rest[k] = v;\n }\n return rest;\n}\n\n/**\n * Reconstruct a Scene3D from a SerializedBoard3D. Accepts both v1 (legacy,\n * no constraints) and v2 (new format).\n *\n * For v1: every point3d becomes `kind: 'free'`, and derived objects with our\n * `sceneSpec` attribute are skipped (legacy stamps don't carry sceneSpec, so\n * the loop won't see them; this is correct).\n *\n * For v2: each element carries `constraint` (points) or `sceneSpec` (derived)\n * and we reconstruct the full Scene3DObject.\n */\nexport function boardToScene(board: SerializedBoard3D): Scene3D {\n const scene = new Scene3D();\n for (const el of board.elements) {\n if (el.type === 'point3d') {\n const constraint: Constraint = el.constraint ?? {\n kind: 'free',\n x: Number(el.parents[0] ?? 0),\n y: Number(el.parents[1] ?? 0),\n z: Number(el.parents[2] ?? 0),\n };\n const color = (el.attributes['color'] as string | undefined);\n const visible = el.attributes['visible'] !== false;\n try {\n scene.insert({\n kind: 'point',\n id: el.id,\n label: el.label ?? el.id,\n visible,\n color,\n constraint,\n });\n } catch {\n // Skip duplicates / malformed.\n }\n continue;\n }\n // Derived object — only v2 carries `sceneSpec`\n const sceneKind = el.attributes['sceneKind'] as string | undefined;\n const sceneSpec = el.attributes['sceneSpec'] as Record<string, unknown> | undefined;\n if (!sceneKind || !sceneSpec) continue;\n const color = el.attributes['color'] as string | undefined;\n const visible = el.attributes['visible'] !== false;\n const obj = {\n id: el.id,\n label: el.label ?? el.id,\n visible,\n color,\n kind: sceneKind,\n ...sceneSpec,\n } as unknown as Scene3DObject;\n try {\n scene.insert(obj);\n } catch {\n // Skip malformed entries / duplicates.\n }\n }\n return scene;\n}\n","'use client';\nimport * as React from 'react';\nimport { Scene3D, type SceneSnapshot } from './scene/Scene3D';\nimport { ToolController } from './tools/controller';\nimport { JxgRenderer } from './renderer/JxgRenderer';\nimport { hitTest } from './hitTest/hitTest';\nimport { screenToRay } from './hitTest/rayCast';\nimport { rayPlane } from './hitTest/intersect';\nimport { constraintToWorld } from './scene/constraintMath';\nimport { hitToConstraint } from './tools/handlers/_ensurePoint';\nimport type { Constraint, Vec3 } from './scene/types';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport { StatusHint } from './StatusHint';\nimport { DEFAULT_VIEW3D } from './theme';\nimport type { ToolKey } from './tools/spec';\nimport type { SerializedBoard3D } from '../serialize';\nimport { sceneToBoard, boardToScene } from './scene/persistence';\n\nexport interface EditorPanelProps {\n isDark?: boolean;\n initialState?: SerializedBoard3D | null;\n onInsert?: (board: SerializedBoard3D, svgWidth: number, svgHeight: number, svgString: string) => void;\n /** Scene created by host (so LeftPanel sibling can share it). */\n scene: Scene3D;\n /** Currently selected tool — controlled by host. */\n selectedTool: ToolKey;\n /** Host gets notified when the controller switches the active tool. */\n onSelectedToolChange: (k: ToolKey) => void;\n showAxis: boolean;\n showGrid: boolean;\n onReadyChange?: (ready: boolean) => void;\n /** Notifies the host when undo/redo availability changes (for wiring buttons). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n}\n\nexport interface EditorPanelHandle {\n hasContent: () => boolean;\n /** Returns the current scene as a SerializedBoard3D. */\n serialize: () => SerializedBoard3D;\n /** Select a tool by key (for chord shortcut / host control). */\n setTool: (k: ToolKey) => void;\n /** Trigger an undo on the scene's history stack. */\n undo: () => void;\n /** Trigger a redo on the scene's history stack. */\n redo: () => void;\n}\n\nexport const EditorPanel = React.forwardRef<EditorPanelHandle, EditorPanelProps>(\n function EditorPanel(props, ref) {\n const {\n isDark: isDarkProp,\n initialState,\n scene,\n selectedTool,\n onSelectedToolChange,\n showAxis,\n showGrid,\n onReadyChange,\n onHistoryChange,\n } = props;\n const isDark = isDarkProp ?? false;\n const controllerRef = React.useRef<ToolController | null>(null);\n if (!controllerRef.current) controllerRef.current = new ToolController(scene);\n\n const [hint, setHint] = React.useState<string>('Chọn công cụ trong bảng bên trái');\n const [hoverLabel, setHoverLabel] = React.useState<string | null>(null);\n\n const boardRef = React.useRef<MiniBoard3DHandle | null>(null);\n const rendererRef = React.useRef<JxgRenderer | null>(null);\n\n const onSelectedToolChangeRef = React.useRef(onSelectedToolChange);\n onSelectedToolChangeRef.current = onSelectedToolChange;\n\n const onHistoryChangeRef = React.useRef(onHistoryChange);\n onHistoryChangeRef.current = onHistoryChange;\n\n // Latest selectedTool — read inside drag callbacks to avoid stale closures.\n const selectedToolRef = React.useRef(selectedTool);\n selectedToolRef.current = selectedTool;\n\n // Point-drag state: which point is being dragged, starting screen + world,\n // plus a scene snapshot captured before any mutation (used for undo\n // checkpoints on drag-end).\n const draggedPointRef = React.useRef<string | null>(null);\n const dragStartRef = React.useRef<{ screen: { x: number; y: number }; world: Vec3 } | null>(null);\n const dragSnapshotRef = React.useRef<SceneSnapshot | null>(null);\n\n // Initial state load — wrap in withoutHistory so loading doesn't pollute\n // the undo stack with phantom \"insert\" entries.\n React.useEffect(() => {\n if (initialState) {\n const loaded = boardToScene(initialState);\n scene.withoutHistory(() => {\n scene.reset();\n for (const obj of loaded.list()) {\n scene.insert(obj);\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Subscribe to controller state changes for hint + selected-tool updates.\n React.useEffect(() => {\n const ctrl = controllerRef.current!;\n const unsub = ctrl.on((state) => {\n setHint(state.hint);\n onSelectedToolChangeRef.current(state.tool?.key ?? 'move');\n });\n return unsub;\n }, []);\n\n // Subscribe to history changes — propagate canUndo/canRedo upward.\n React.useEffect(() => {\n // Emit initial state once for the host's UI.\n onHistoryChangeRef.current?.(scene.canUndo(), scene.canRedo());\n const unsub = scene.onHistoryChange(() => {\n onHistoryChangeRef.current?.(scene.canUndo(), scene.canRedo());\n });\n return unsub;\n }, [scene]);\n\n // Sync controller when host changes selectedTool from outside (e.g. chord shortcut).\n React.useEffect(() => {\n controllerRef.current?.selectTool(selectedTool);\n }, [selectedTool]);\n\n // Global keyboard shortcuts: Ctrl/Cmd+Z, Ctrl/Cmd+Shift+Z, Ctrl+Y.\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n if (inField) return;\n if (!(e.metaKey || e.ctrlKey)) return;\n const key = e.key.toLowerCase();\n if (key === 'z' && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n scene.undo();\n } else if ((key === 'z' && e.shiftKey) || (key === 'y' && !e.shiftKey)) {\n e.preventDefault();\n e.stopPropagation();\n scene.redo();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [scene]);\n\n // Dispose renderer on unmount.\n React.useEffect(() => {\n return () => {\n rendererRef.current?.dispose();\n rendererRef.current = null;\n };\n }, []);\n\n // Apply showAxis / showGrid to the JSXGraph view3d when it (or the state) changes.\n React.useEffect(() => {\n const view = boardRef.current?.getView3D();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n if (!v || typeof v.setAttribute !== 'function') return;\n try {\n v.setAttribute({\n xAxis: { visible: showAxis },\n yAxis: { visible: showAxis },\n zAxis: { visible: showAxis },\n // GeoGebra-style: only the XY ground plane is shown; side walls stay hidden.\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: showGrid, mesh3d: { visible: false } },\n });\n v.board?.update?.();\n } catch {\n /* swallow — older JSXGraph / mocks may not support runtime attr changes */\n }\n }, [showAxis, showGrid]);\n\n const handleView3DReady = React.useCallback((view: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rendererRef.current = new JxgRenderer(scene, view as any);\n // Restore saved azimuth/elevation khi mở lại stamp cũ để re-edit, để\n // editor view khớp với ảnh đã chèn.\n if (initialState) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n v?.az_slide?.setValue?.(initialState.view.azimuth);\n v?.el_slide?.setValue?.(initialState.view.elevation);\n v?.board?.update?.();\n } catch {\n /* swallow — older JSXGraph may not expose az_slide */\n }\n }\n onReadyChange?.(true);\n }, [onReadyChange, scene, initialState]);\n\n const handleClick = React.useCallback((screen: { x: number; y: number }) => {\n const board = boardRef.current;\n if (!board) return;\n const view = board.getView3D();\n if (!view) return;\n try {\n const hit = hitTest(screen, view, scene);\n controllerRef.current!.consumeHit(hit);\n } catch {\n /* swallow — view may not yet expose project3DTo2D in some mock paths */\n }\n }, [scene]);\n\n const handleMove = React.useCallback((screen: { x: number; y: number }) => {\n const board = boardRef.current;\n if (!board) return;\n const view = board.getView3D();\n if (!view) return;\n // Suppress hover label updates while a drag is in progress.\n if (draggedPointRef.current) return;\n let hit;\n try {\n hit = hitTest(screen, view, scene);\n } catch {\n setHoverLabel(null);\n return;\n }\n if (hit.kind === 'empty') setHoverLabel(null);\n else if (hit.kind === 'existingPoint') {\n const obj = scene.get(hit.pointId);\n setHoverLabel(obj?.label ?? null);\n } else if (hit.kind === 'onGround') setHoverLabel('mặt nền');\n else if (hit.kind === 'onAxis') setHoverLabel(`trục ${hit.axis.toUpperCase()}`);\n else if (hit.kind === 'onPlane') setHoverLabel(`mặt phẳng ${hit.planeId}`);\n else if (hit.kind === 'onSphere') setHoverLabel(`mặt cầu ${hit.sphereId}`);\n else setHoverLabel(null);\n }, [scene]);\n\n // ─── Point-drag handlers (delegated from MiniBoard3D) ────────────────────\n // Decides whether the pointerdown gesture is \"ours\" (drag/place a point)\n // or should fall through to MiniBoard3D's default view-rotate behaviour.\n // Returning true also suppresses view rotation for the rest of the gesture.\n // Captures a scene snapshot before any mutation so onPointerDragEnd can\n // push a single undo checkpoint for the whole gesture.\n const shouldStartPointDrag = React.useCallback((screen: { x: number; y: number }): boolean => {\n const view = boardRef.current?.getView3D();\n if (!view) return false;\n const tool = selectedToolRef.current;\n if (tool !== 'point' && tool !== 'move') return false;\n let hit;\n try { hit = hitTest(screen, view, scene); } catch { return false; }\n\n // Existing point: drag it (Z-only in Point mode, XY-raycast in Move mode).\n // Snapshot before any mutation, drag-end will push a checkpoint.\n if (hit.kind === 'existingPoint') {\n const pt = scene.get(hit.pointId);\n if (!pt || pt.kind !== 'point') return false;\n dragSnapshotRef.current = scene.snapshot();\n draggedPointRef.current = hit.pointId;\n dragStartRef.current = {\n screen,\n world: constraintToWorld(pt.constraint, scene),\n };\n return true;\n }\n\n // Point tool: place-and-lift gesture. Capture snapshot first, then\n // create the point inside withoutHistory so only the drag-end checkpoint\n // ends up on the undo stack (otherwise addPoint would push an extra one).\n // Bypasses the controller (Point tool has repeatAfterBuild so there's no\n // collected-state to unwind); the click→consumeHit→buildPoint path is\n // short-circuited in MiniBoard3D.handlePointerUp when pointDragMode is set.\n if (tool === 'point' && (hit.kind === 'onGround' || hit.kind === 'onAxis')) {\n dragSnapshotRef.current = scene.snapshot();\n const constraint = hitToConstraint(hit);\n if (!constraint) {\n dragSnapshotRef.current = null;\n return false;\n }\n let id: string | null = null;\n scene.withoutHistory(() => {\n id = scene.addPoint(constraint);\n });\n if (!id) {\n dragSnapshotRef.current = null;\n return false;\n }\n draggedPointRef.current = id;\n dragStartRef.current = {\n screen,\n world: [hit.world[0], hit.world[1], hit.world[2]],\n };\n return true;\n }\n\n // Point tool but non-placeable surface (sphere/plane/empty): suppress\n // view rotation so the camera never rotates accidentally while the user\n // is placing points, but don't enter a drag. Clear snapshot defensively.\n if (tool === 'point') {\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n return true;\n }\n\n return false;\n }, [scene]);\n\n const onPointerDrag = React.useCallback((screen: { x: number; y: number }) => {\n const pointId = draggedPointRef.current;\n const start = dragStartRef.current;\n if (!pointId || !start) return;\n const view = boardRef.current?.getView3D();\n if (!view) return;\n const tool = selectedToolRef.current;\n let nextWorld: Vec3;\n if (tool === 'point') {\n // Vertical lift only: keep starting X,Y; map screen-Y delta to world Z\n // 1:1 in user-space (pixelToUser already inverts Y).\n const dz = screen.y - start.screen.y;\n nextWorld = [start.world[0], start.world[1], start.world[2] + dz];\n } else if (tool === 'move') {\n // Free move on the horizontal plane at the point's starting Z.\n try {\n const ray = screenToRay(screen, view);\n const hit = rayPlane(ray, { point: [0, 0, start.world[2]], normal: [0, 0, 1] });\n if (!hit) return;\n nextWorld = [hit.point[0], hit.point[1], start.world[2]];\n } catch { return; }\n } else {\n return;\n }\n const obj = scene.get(pointId);\n if (!obj || obj.kind !== 'point') return;\n const free: Constraint = { kind: 'free', x: nextWorld[0], y: nextWorld[1], z: nextWorld[2] };\n (obj as { constraint: Constraint }).constraint = free;\n scene.emitChange(pointId);\n }, [scene]);\n\n const onPointerDragEnd = React.useCallback(() => {\n const snap = dragSnapshotRef.current;\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n if (snap) {\n scene.pushUndoCheckpoint(snap);\n }\n }, [scene]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n hasContent: () => scene.list().length > 0,\n serialize: () => {\n const view = boardRef.current?.getView3D();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n const azSlider = v?.az_slide ?? v?.az;\n const elSlider = v?.el_slide ?? v?.el;\n const azimuth = typeof azSlider?.Value === 'function' ? azSlider.Value() : 0;\n const elevation = typeof elSlider?.Value === 'function' ? elSlider.Value() : 0;\n return sceneToBoard(\n scene,\n { azimuth, elevation, bbox3D: [...DEFAULT_VIEW3D.bbox3D] as [number, number, number, number, number, number] },\n // JSXGraph boundingbox order: [xmin, ymax, xmax, ymin]. Must match\n // MiniBoard3D.initBoard so render reproduces the editor's view.\n [-6, 6, 6, -6],\n );\n },\n setTool: (k) => controllerRef.current!.selectTool(k),\n undo: () => scene.undo(),\n redo: () => scene.redo(),\n }),\n [scene],\n );\n\n return (\n <div\n data-testid=\"editor-panel-3d\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex h-full w-full min-w-0 flex-col overflow-hidden bg-white',\n ].join('')}\n >\n <div className=\"min-h-0 flex-1\">\n <MiniBoard3D\n ref={boardRef}\n isDark={isDark}\n onView3DReady={handleView3DReady}\n onPointerClick={handleClick}\n onPointerMove={handleMove}\n onPointerLeave={() => setHoverLabel(null)}\n shouldStartPointDrag={shouldStartPointDrag}\n onPointerDrag={onPointerDrag}\n onPointerDragEnd={onPointerDragEnd}\n />\n </div>\n <StatusHint hint={hint} hoverLabel={hoverLabel} />\n </div>\n );\n },\n);\n","'use client';\nimport * as React from 'react';\nimport type { ToolKey } from '../tools/spec';\n\nexport interface ToolButtonProps {\n toolKey: ToolKey;\n label: string;\n selected: boolean;\n onClick: (key: ToolKey) => void;\n icon?: React.ReactNode;\n /** Chord-mode positional digit (1..9) overlaid bottom-right. */\n chordNum?: number | null;\n /** Highlight ring when its parent group is the active chord group. */\n chordActiveGroup?: boolean;\n onMouseEnter?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n onMouseLeave?: () => void;\n}\n\nexport function ToolButton(props: ToolButtonProps): React.ReactElement {\n const {\n toolKey,\n label,\n selected,\n onClick,\n icon,\n chordNum,\n chordActiveGroup,\n onMouseEnter,\n onMouseLeave,\n } = props;\n return (\n <button\n type=\"button\"\n data-tool-key={toolKey}\n data-testid={`tool-${toolKey}`}\n aria-label={label}\n aria-pressed={selected}\n onClick={() => onClick(toolKey)}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n className={[\n 'relative flex aspect-square items-center justify-center rounded-md transition',\n selected\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n <span aria-hidden className=\"inline-flex\">\n {icon ?? null}\n </span>\n {chordNum != null && (\n <span\n data-testid={`chord-num-${toolKey}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n selected\n ? 'text-white/70'\n : chordActiveGroup\n ? 'text-emerald-700'\n : 'text-slate-300',\n ].join(' ')}\n >\n {chordNum}\n </span>\n )}\n </button>\n );\n}\n","import * as React from 'react';\nimport type { ToolKey } from '../tools/spec';\n\nconst wrap = (children: React.ReactNode): React.ReactElement => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n);\n\nconst dot = (cx: number, cy: number, r = 1.4): React.ReactElement => (\n <circle cx={cx} cy={cy} r={r} fill=\"currentColor\" stroke=\"none\" />\n);\n\nexport const ToolIcons: Record<ToolKey, React.ReactElement> = {\n move: wrap(\n <>\n <path d=\"M5 4 L5 14 L8 11 L10 16 L13 15 L11 10 L15 10 Z\" />\n </>,\n ),\n point: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n pointOnObject: wrap(\n <>\n <path d=\"M3 16 L21 12\" />\n <circle cx=\"12\" cy=\"13.5\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n segment: wrap(\n <>\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"6\" />\n {dot(4, 18, 1.6)}\n {dot(20, 6, 1.6)}\n </>,\n ),\n line: wrap(\n <>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"6\" />\n {dot(8, 14.5, 1.4)}\n {dot(16, 9.5, 1.4)}\n </>,\n ),\n ray: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"7\" />\n <path d=\"M19 7 L15 6 M19 7 L18 11\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n vector: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"18\" y2=\"7\" />\n <path d=\"M18 7 L13 7 M18 7 L18 12\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n polygon: wrap(\n <>\n <polygon points=\"12,4 20,10 17,19 7,19 4,10\" />\n </>,\n ),\n plane: wrap(\n <>\n <polygon points=\"3,9 14,5 21,11 10,15\" />\n </>,\n ),\n pyramid: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 4 Z\" />\n <path d=\"M4 19 L12 16 L20 19\" />\n <path d=\"M12 4 L12 16\" strokeDasharray=\"2 2\" />\n </>,\n ),\n prism: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n <path d=\"M4 8 L14 8\" />\n </>,\n ),\n tetrahedron: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 5 Z\" />\n <path d=\"M4 19 L15 12 L20 19\" />\n <path d=\"M15 12 L12 5\" />\n </>,\n ),\n cube: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n </>,\n ),\n sphere: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"3\" />\n {dot(12, 12, 1.2)}\n </>,\n ),\n cylinder: wrap(\n <>\n <ellipse cx=\"12\" cy=\"6\" rx=\"6\" ry=\"2\" />\n <path d=\"M6 6 L6 18\" />\n <path d=\"M18 6 L18 18\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"6\" ry=\"2\" />\n </>,\n ),\n cone: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <line x1=\"19\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"7\" ry=\"2\" />\n </>,\n ),\n};\n","import { TOOLS, type ToolKey, type ToolSpec } from '../tools/spec';\n\nexport type Geom3DGroup =\n | 'basic'\n | 'point'\n | 'line'\n | 'plane'\n | 'polyhedron'\n | 'curve';\n\nexport const GROUP_ORDER: Geom3DGroup[] = [\n 'basic',\n 'point',\n 'line',\n 'plane',\n 'polyhedron',\n 'curve',\n];\n\nexport const GROUP_LABELS: Record<Geom3DGroup, string> = {\n basic: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường thẳng',\n plane: 'Mặt phẳng',\n polyhedron: 'Khối đa diện',\n curve: 'Khối cong',\n};\n\nexport const TOOLS_BY_GROUP: Record<Geom3DGroup, ToolKey[]> = {\n basic: ['move'],\n point: ['point', 'pointOnObject'],\n line: ['segment', 'line', 'ray', 'vector', 'polygon'],\n plane: ['plane'],\n polyhedron: ['pyramid', 'prism', 'tetrahedron', 'cube'],\n curve: ['sphere', 'cylinder', 'cone'],\n};\n\nexport interface Geom3DToolEntry {\n key: ToolKey;\n label: string;\n hint: string;\n group: Geom3DGroup;\n}\n\nconst SPEC_BY_KEY: Record<ToolKey, ToolSpec> = TOOLS.reduce(\n (acc, t) => {\n acc[t.key] = t;\n return acc;\n },\n {} as Record<ToolKey, ToolSpec>,\n);\n\nexport const TOOLS_FLAT: Geom3DToolEntry[] = GROUP_ORDER.flatMap((group) =>\n TOOLS_BY_GROUP[group].map((key) => {\n const spec = SPEC_BY_KEY[key];\n return {\n key,\n label: spec?.label ?? key,\n hint: spec?.hintIdle ?? '',\n group,\n };\n }),\n);\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: Geom3DGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n","'use client';\nimport * as React from 'react';\nimport { ToolButton } from './ToolButton';\nimport { ToolIcons } from './icons';\nimport {\n GROUP_LABELS,\n GROUP_ORDER,\n TOOLS_BY_GROUP,\n letterForGroup,\n type Geom3DGroup,\n} from './groups';\nimport { TOOLS, type ToolKey } from '../tools/spec';\n\nexport interface ToolPaletteProps {\n selected: ToolKey;\n onSelect: (key: ToolKey) => void;\n chordGroup?: Geom3DGroup | null;\n onHoverTool?: (info: { label: string; hint?: string; x: number; y: number } | null) => void;\n}\n\nexport function ToolPalette(props: ToolPaletteProps): React.ReactElement {\n const { selected, onSelect, chordGroup = null, onHoverTool } = props;\n return (\n <div data-testid=\"tool-palette\" className=\"flex flex-col gap-3\">\n {GROUP_ORDER.map((group) => {\n const keys = TOOLS_BY_GROUP[group];\n const isChordActive = chordGroup === group;\n const dimmed = chordGroup !== null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive\n ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1'\n : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{GROUP_LABELS[group]}</span>\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {letterForGroup(group)}\n </span>\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {keys.map((k, i) => {\n const tool = TOOLS.find((t) => t.key === k)!;\n return (\n <ToolButton\n key={k}\n toolKey={k}\n label={tool.label}\n selected={selected === k}\n onClick={onSelect}\n icon={ToolIcons[k]}\n chordNum={i + 1}\n chordActiveGroup={isChordActive}\n onMouseEnter={(e) =>\n onHoverTool?.({\n label: tool.label,\n hint: tool.hintIdle,\n x: e.clientX,\n y: e.clientY,\n })\n }\n onMouseLeave={() => onHoverTool?.(null)}\n />\n );\n })}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import type { Scene3DObject } from '../scene/types';\nimport type { Scene3D } from '../scene/Scene3D';\nimport { constraintToWorld } from '../scene/constraintMath';\n\nexport function symbolicFor(obj: Scene3DObject, scene: Scene3D): string {\n const n = (id: string): string => scene.get(id)?.label ?? id;\n switch (obj.kind) {\n case 'point': {\n const c = obj.constraint;\n switch (c.kind) {\n case 'free': return 'Point';\n case 'onGround': return 'Point(xyPlane)';\n case 'onAxis': return `Point(${c.axis}Axis)`;\n case 'onPlane': return `Point(${n(c.planeId)})`;\n case 'onLine': return `Point(${n(c.lineId)})`;\n case 'onPolygon': return `Point(${n(c.polygonId)})`;\n case 'onSphere': return `Point(${n(c.sphereId)})`;\n }\n return 'Point';\n }\n case 'segment': return `Segment(${n(obj.p1)}, ${n(obj.p2)})`;\n case 'line': return `Line(${n(obj.p1)}, ${n(obj.p2)})`;\n case 'ray': return `Ray(${n(obj.origin)}, ${n(obj.through)})`;\n case 'vector': return `Vector(${n(obj.from)}, ${n(obj.to)})`;\n case 'polygon': return `Polygon(${obj.vertices.map(n).join(', ')})`;\n case 'plane': return `Plane(${n(obj.p1)}, ${n(obj.p2)}, ${n(obj.p3)})`;\n case 'sphere': return `Sphere(${n(obj.center)}, ${n(obj.surfacePoint)})`;\n case 'polyhedron': {\n const flavorVn: Record<typeof obj.flavor, string> = {\n pyramid: 'Chóp', prism: 'Lăng trụ', tetrahedron: 'Tứ diện', cube: 'Lập phương',\n };\n return `${flavorVn[obj.flavor]}(${obj.vertices.length} đỉnh)`;\n }\n case 'cylinder': return `Cylinder(${n(obj.baseCenter)}, ${n(obj.topCenter)}, r=${obj.radius})`;\n case 'cone': return `Cone(${n(obj.baseCenter)}, ${n(obj.apex)}, r=${obj.radius})`;\n }\n}\n\n/**\n * Compact numeric value display for an object. Free / surface-projected points\n * show their world position; non-points show a summary.\n */\nexport function numericFor(obj: Scene3DObject, scene: Scene3D): string {\n if (obj.kind === 'point') {\n const w = constraintToWorld(obj.constraint, scene);\n return `(${round(w[0])}, ${round(w[1])}, ${round(w[2])})`;\n }\n return '';\n}\n\nfunction round(x: number): string {\n return Math.abs(x) < 1e-9 ? '0' : (Math.round(x * 100) / 100).toString();\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface RowMenuProps {\n onRename: () => void;\n onChangeColor: () => void;\n onToggleVisibility: () => void;\n onDelete: () => void;\n visible: boolean;\n}\n\nexport function RowMenu(props: RowMenuProps): React.ReactElement {\n const [open, setOpen] = React.useState(false);\n return (\n <div className=\"relative inline-block\">\n <button\n type=\"button\"\n aria-label=\"Row menu\"\n onClick={() => setOpen((v) => !v)}\n className=\"rounded px-1.5 text-zinc-500 hover:bg-zinc-100 dark:hover:bg-zinc-800\"\n >\n ⋮\n </button>\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-10 mt-1 w-40 rounded-md border border-zinc-200 bg-white py-1 text-xs shadow-lg dark:border-zinc-700 dark:bg-zinc-900\"\n >\n <MenuItem onClick={() => { setOpen(false); props.onRename(); }}>Đổi tên</MenuItem>\n <MenuItem onClick={() => { setOpen(false); props.onChangeColor(); }}>Đổi màu</MenuItem>\n <MenuItem onClick={() => { setOpen(false); props.onToggleVisibility(); }}>\n {props.visible ? 'Ẩn' : 'Hiện'}\n </MenuItem>\n <MenuItem onClick={() => { setOpen(false); props.onDelete(); }} className=\"text-red-600\">\n Xoá\n </MenuItem>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MenuItem({ children, onClick, className }: React.PropsWithChildren<{ onClick: () => void; className?: string }>) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={onClick}\n className={`block w-full px-3 py-1 text-left hover:bg-zinc-100 dark:hover:bg-zinc-800 ${className ?? ''}`}\n >\n {children}\n </button>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Scene3DObject } from '../scene/types';\nimport type { Scene3D } from '../scene/Scene3D';\nimport { symbolicFor, numericFor } from './symbolic';\nimport { RowMenu } from './RowMenu';\n\nexport interface AlgebraRowProps {\n obj: Scene3DObject;\n scene: Scene3D;\n onDelete: (id: string) => void;\n}\n\nexport function AlgebraRow(props: AlgebraRowProps): React.ReactElement {\n const { obj, scene, onDelete } = props;\n const symbolic = symbolicFor(obj, scene);\n const numeric = numericFor(obj, scene);\n return (\n <li\n data-testid={`algebra-row-${obj.id}`}\n className=\"flex items-center gap-2 border-b border-zinc-100 px-3 py-1.5 text-xs dark:border-zinc-800\"\n >\n <span\n aria-hidden\n className=\"inline-block size-3 rounded-full border\"\n style={{ backgroundColor: obj.color ?? '#0066cc' }}\n />\n <span className=\"min-w-[3ch] font-semibold\">{obj.label}</span>\n <span className=\"text-zinc-500\">=</span>\n <span className=\"flex-1 truncate font-mono\">{symbolic}</span>\n {numeric ? <span className=\"truncate text-zinc-500\">{numeric}</span> : null}\n <RowMenu\n visible={obj.visible}\n onRename={() => { /* no-op for now; wired in EditorPanel later */ }}\n onChangeColor={() => { /* no-op */ }}\n onToggleVisibility={() => { /* no-op */ }}\n onDelete={() => onDelete(obj.id)}\n />\n </li>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Scene3D } from '../scene/Scene3D';\nimport type { Scene3DObject } from '../scene/types';\nimport { AlgebraRow } from './AlgebraRow';\n\nexport interface AlgebraListProps {\n scene: Scene3D;\n}\n\nexport function AlgebraList(props: AlgebraListProps): React.ReactElement {\n const { scene } = props;\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\n\n React.useEffect(() => {\n const unsubAdd = scene.on('add', () => forceUpdate());\n const unsubChange = scene.on('change', () => forceUpdate());\n const unsubDelete = scene.on('delete', () => forceUpdate());\n const unsubReset = scene.on('reset', () => forceUpdate());\n return () => { unsubAdd(); unsubChange(); unsubDelete(); unsubReset(); };\n }, [scene]);\n\n const objects: Scene3DObject[] = scene.list();\n\n return (\n <ul\n data-testid=\"algebra-list\"\n className=\"flex max-h-[calc(100vh-200px)] flex-col overflow-y-auto\"\n >\n {objects.length === 0 ? (\n <li className=\"px-3 py-4 text-center text-xs text-zinc-500\">Chưa có đối tượng nào</li>\n ) : (\n objects.map((o) => (\n <AlgebraRow key={o.id} obj={o} scene={scene} onDelete={(id) => scene.delete(id)} />\n ))\n )}\n </ul>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ToolPalette } from './toolPanel/ToolPalette';\nimport { AlgebraList } from './algebraPanel/AlgebraList';\nimport { ToolIcons } from './toolPanel/icons';\nimport {\n GROUP_LABELS,\n GROUP_ORDER,\n TOOLS_BY_GROUP,\n letterForGroup,\n type Geom3DGroup,\n} from './toolPanel/groups';\nimport type { Scene3D } from './scene/Scene3D';\nimport { TOOLS, type ToolKey } from './tools/spec';\nimport {\n MobileToolDrawer,\n type MobileToolGroup,\n} from '../../shared/MobileToolDrawer';\n\nconst TOOLTIP_DELAY_MS = 400;\n\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\nexport interface LeftPanelProps {\n scene: Scene3D;\n selectedTool: ToolKey;\n onSelectTool: (k: ToolKey) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n onClose: () => void;\n isDark?: boolean;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n chordGroup?: Geom3DGroup | null;\n}\n\nconst Geom3DIconHeader = (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nfunction AxisIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <line x1=\"4\" y1=\"20\" x2=\"16\" y2=\"8\" />\n </svg>\n );\n}\n\nfunction GridIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 8 L20 4\" />\n <path d=\"M4 14 L20 10\" />\n <path d=\"M4 20 L20 16\" />\n <path d=\"M4 8 L4 20\" />\n <path d=\"M12 6 L12 18\" />\n <path d=\"M20 4 L20 16\" />\n </svg>\n );\n}\n\nexport function UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nexport function RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isDark?: boolean;\n}\n\nfunction Shell({ title, icon, onClose, children, isDark }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"left-panel\"\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-3\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\nfunction useToolHoverTooltip() {\n const [hover, setHover] = React.useState<HoverState>(null);\n const [portalReady, setPortalReady] = React.useState(false);\n const hoverTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n React.useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = React.useCallback((next: NonNullable<HoverState>) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => setHover(next), TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = React.useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n\ntype Tab = 'tools' | 'algebra';\n\nfunction DesktopPanel(props: LeftPanelProps) {\n const {\n scene,\n selectedTool,\n onSelectTool,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onRedo,\n canRedo,\n onClose,\n isDark,\n chordGroup,\n } = props;\n const [tab, setTab] = React.useState<Tab>('tools');\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n return (\n <>\n <Shell title=\"Hình học 3D\" icon={Geom3DIconHeader} onClose={onClose} isDark={isDark}>\n <div className=\"flex gap-1 rounded-md bg-slate-100 p-0.5\">\n <TabPill active={tab === 'tools'} onClick={() => setTab('tools')} testId=\"tab-tools\">\n 🧰 Công cụ\n </TabPill>\n <TabPill active={tab === 'algebra'} onClick={() => setTab('algebra')} testId=\"tab-algebra\">\n 📐 Đối tượng\n </TabPill>\n </div>\n\n {tab === 'tools' ? (\n <>\n <Section label=\"Góc nhìn\">\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxis}\n onChange={(e) => onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n Trục\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showGrid}\n onChange={(e) => onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n Lưới\n </label>\n <div className=\"ml-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n </div>\n </Section>\n\n <ToolPalette\n selected={selectedTool}\n onSelect={onSelectTool}\n chordGroup={chordGroup ?? null}\n onHoverTool={(info) => (info ? showHover(info) : hideHover())}\n />\n\n {chordGroup && (\n <div\n data-testid=\"chord-hint\"\n className=\"rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {letterForGroup(chordGroup)}\n </span>\n <span className=\"ml-1.5\">\n → {GROUP_LABELS[chordGroup]}. Bấm số 1-9 để chọn công cụ, Esc huỷ.\n </span>\n </div>\n )}\n </>\n ) : (\n <section data-testid=\"algebra-panel\">\n <AlgebraList scene={scene} />\n </section>\n )}\n </Shell>\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\nfunction TabPill({\n active,\n onClick,\n testId,\n children,\n}: React.PropsWithChildren<{ active: boolean; onClick: () => void; testId?: string }>) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n data-testid={testId}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n active\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nfunction MobilePanel(props: LeftPanelProps) {\n const {\n selectedTool,\n onSelectTool,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onRedo,\n canRedo,\n isDark,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = React.useMemo<MobileToolGroup<ToolKey, Geom3DGroup>[]>(\n () =>\n GROUP_ORDER.map((group) => {\n const keys = TOOLS_BY_GROUP[group];\n return {\n group,\n groupLabel: GROUP_LABELS[group],\n tools: keys.map((k) => {\n const tool = TOOLS.find((t) => t.key === k)!;\n return { key: k, label: tool.label, icon: ToolIcons[k] };\n }),\n };\n }),\n [],\n );\n\n return (\n <MobileToolDrawer\n title=\"Hình học 3D\"\n headerIcon={Geom3DIconHeader}\n testId=\"left-panel\"\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={[\n {\n label: 'Trục',\n icon: <AxisIcon />,\n pressed: showAxis,\n onToggle: onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: 'Lưới',\n icon: <GridIcon />,\n pressed: showGrid,\n onToggle: onShowGridChange,\n testId: 'toggle-grid',\n },\n ]}\n actions={[\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: onUndo,\n disabled: !canUndo,\n testId: 'undo-btn',\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: onRedo,\n disabled: !canRedo,\n testId: 'redo-btn',\n },\n ]}\n groups={groups}\n activeTool={selectedTool}\n onToolSelect={onSelectTool}\n />\n );\n}\n\nexport function LeftPanel(props: LeftPanelProps): React.ReactElement {\n if (props.isMobile) return <MobilePanel {...props} />;\n return <DesktopPanel {...props} />;\n}\n","'use client';\n\nimport type React from 'react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { EditorPanel, type EditorPanelHandle } from './editor/EditorPanel';\nimport { LeftPanel } from './editor/LeftPanel';\nimport { Scene3D } from './editor/scene/Scene3D';\nimport { GROUP_ORDER, TOOLS_FLAT } from './editor/toolPanel/groups';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { renderGeometry3DSvgFromState } from './render';\nimport {\n isGeometry3DCustomData,\n parseSerializedBoard3D,\n serializeBoard3D,\n type Geometry3DCustomData,\n type SerializedBoard3D,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport type { ToolKey } from './editor/tools/spec';\n\nfunction parseInitial(\n editingElement: StampHostProps['editingElement'],\n): SerializedBoard3D | null {\n if (!editingElement) return null;\n if (!isGeometry3DCustomData(editingElement.customData)) return null;\n try {\n return parseSerializedBoard3D(editingElement.customData.jsonState);\n } catch {\n return null;\n }\n}\n\nexport const Geometry3DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Geometry3DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const editorRef = useRef<EditorPanelHandle | null>(null);\n const sceneRef = useRef<Scene3D | null>(null);\n if (!sceneRef.current) sceneRef.current = new Scene3D();\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [ready, setReady] = useState(false);\n\n const [selectedTool, setSelectedTool] = useState<ToolKey>('move');\n const [showAxis, setShowAxis] = useState<boolean>(true);\n const [showGrid, setShowGrid] = useState<boolean>(true);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n const [hasContent, setHasContent] = useState<boolean>(false);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n useEffect(() => {\n const scene = sceneRef.current;\n if (!scene) return;\n const sync = () => setHasContent(scene.list().length > 0);\n sync();\n const unsubs = [\n scene.on('add', sync),\n scene.on('delete', sync),\n scene.on('reset', sync),\n ];\n return () => {\n for (const u of unsubs) u();\n };\n }, []);\n\n const handleUndo = useCallback(() => {\n editorRef.current?.undo();\n }, []);\n\n const handleRedo = useCallback(() => {\n editorRef.current?.redo();\n }, []);\n\n const initial = useMemo(\n () => parseInitial(editingElement),\n [editingElement],\n );\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS_FLAT,\n onSelect: (key) => {\n setSelectedTool(key as ToolKey);\n editorRef.current?.setTool(key as ToolKey);\n },\n enabled: !isMobile,\n });\n\n const handleSelectTool = useCallback((k: ToolKey) => {\n setSelectedTool(k);\n editorRef.current?.setTool(k);\n }, []);\n\n const performInsert = useCallback(\n async (board: SerializedBoard3D, width: number, height: number, svgString: string) => {\n if (!api) return;\n const jsonState = serializeBoard3D(board);\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Geometry3DCustomData => ({\n kind: 'geometry3d',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n onClose();\n },\n [api, editingElement, onClose],\n );\n\n const tryInsert = useCallback((): boolean => {\n if (!editorRef.current) return false;\n if (!editorRef.current.hasContent()) return false;\n const board = editorRef.current.serialize();\n if (board.elements.length === 0) return false;\n void (async () => {\n try {\n const jsonState = serializeBoard3D(board);\n const { svgString, width, height } = await renderGeometry3DSvgFromState(jsonState);\n await performInsert(board, width, height, svgString);\n } catch (err) {\n console.error('Geometry3D insert failed:', err);\n }\n })();\n return true;\n }, [performInsert]);\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [tryInsert],\n );\n\n const handleEditorInsert = useCallback(\n (board: SerializedBoard3D, width: number, height: number, svgString: string) => {\n void performInsert(board, width, height, svgString);\n },\n [performInsert],\n );\n\n const dialogStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: 'calc(50% + 120px)',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <>\n {!isMobile && (\n <LeftPanel\n scene={sceneRef.current}\n selectedTool={selectedTool}\n onSelectTool={handleSelectTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onShowAxisChange={setShowAxis}\n onShowGridChange={setShowGrid}\n onUndo={handleUndo}\n canUndo={canUndo}\n onRedo={handleRedo}\n canRedo={canRedo}\n onClose={onClose}\n isDark={isDark}\n chordGroup={chordGroup}\n />\n )}\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học 3D\"\n data-testid=\"geom3d-host\"\n data-stamp-area=\"true\"\n style={dialogStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : 'h-[600px] max-h-[85vh] w-[800px] max-w-[calc(100vw-320px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={() => setDrawerOpen(true)}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z M4 9 L10 4 L20 4 L14 9 Z M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n Dựng hình học không gian\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={tryInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geom3d-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1\">\n <EditorPanel\n ref={editorRef}\n isDark={isDark}\n initialState={initial}\n onInsert={handleEditorInsert}\n scene={sceneRef.current}\n selectedTool={selectedTool}\n onSelectedToolChange={setSelectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onReadyChange={setReady}\n onHistoryChange={handleHistoryChange}\n />\n </div>\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={tryInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geom3d-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n {isMobile && (\n <LeftPanel\n scene={sceneRef.current}\n selectedTool={selectedTool}\n onSelectTool={handleSelectTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onShowAxisChange={setShowAxis}\n onShowGridChange={setShowGrid}\n onUndo={handleUndo}\n canUndo={canUndo}\n onRedo={handleRedo}\n canRedo={canRedo}\n onClose={onClose}\n isDark={isDark}\n isMobile\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n chordGroup={chordGroup}\n />\n )}\n </>\n );\n },\n);\n","export interface SerializedGraph {\n version: 1;\n view: {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n showAxis: boolean;\n showGrid: boolean;\n };\n functions: SerializedFunction[];\n parameters: SerializedParameter[];\n points: SerializedPoint[];\n intersections: SerializedIntersection[];\n tangents: SerializedTangent[];\n}\n\nexport interface SerializedFunction {\n id: string;\n name: string;\n expression: string;\n color: string;\n visible: boolean;\n domain?: { min: number; max: number };\n}\n\nexport interface SerializedParameter {\n name: string;\n value: number;\n min: number;\n max: number;\n step: number;\n}\n\nexport interface SerializedPoint {\n id: string;\n functionId: string;\n x: number;\n label?: string;\n}\n\nexport interface SerializedIntersection {\n id: string;\n functionIdA: string;\n functionIdB: string;\n}\n\nexport interface SerializedTangent {\n id: string;\n pointId: string;\n}\n\nexport const EMPTY_GRAPH: SerializedGraph = {\n version: 1,\n view: { xMin: -10, xMax: 10, yMin: -10, yMax: 10, showAxis: true, showGrid: true },\n functions: [],\n parameters: [],\n points: [],\n intersections: [],\n tangents: [],\n};\n\nexport function stringifySerializedGraph(graph: SerializedGraph): string {\n return JSON.stringify(graph);\n}\n\nexport function parseSerializedGraph(jsonState: string): SerializedGraph | null {\n let raw: unknown;\n try {\n raw = JSON.parse(jsonState);\n } catch {\n return null;\n }\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n const r = raw as Record<string, unknown>;\n if (r.version !== 1) return null;\n if (!r.view || typeof r.view !== 'object') return null;\n const v = r.view as Record<string, unknown>;\n if (\n typeof v.xMin !== 'number' ||\n typeof v.xMax !== 'number' ||\n typeof v.yMin !== 'number' ||\n typeof v.yMax !== 'number' ||\n typeof v.showAxis !== 'boolean' ||\n typeof v.showGrid !== 'boolean'\n ) {\n return null;\n }\n for (const key of ['functions', 'parameters', 'points', 'intersections', 'tangents']) {\n if (!Array.isArray(r[key])) return null;\n }\n return raw as SerializedGraph;\n}\n","/**\n * AST-based math expression evaluator — an toàn hơn `new Function`.\n *\n * Hỗ trợ:\n * - Toán tử: + - * / ^ và unary minus, dấu ngoặc ( )\n * - Số: integer, float, scientific notation (1e3, 1.2e-4)\n * - Hằng: pi → Math.PI, e → Math.E\n * - Biến: x (mặc định) + tham số đơn ký tự (a..z trừ x, e)\n * - Hàm: sin cos tan asin acos atan log ln exp sqrt abs floor ceil round\n *\n * KHÔNG dùng `new Function`, `eval`, `Function()`, hay bất kỳ dynamic code-gen nào.\n */\n\nconst ALLOWED_FUNCTIONS = {\n sin: Math.sin,\n cos: Math.cos,\n tan: Math.tan,\n asin: Math.asin,\n acos: Math.acos,\n atan: Math.atan,\n log: Math.log10, // log = log10 (khớp với rewriteToJs)\n ln: Math.log, // ln = log tự nhiên\n exp: Math.exp,\n sqrt: Math.sqrt,\n abs: Math.abs,\n floor: Math.floor,\n ceil: Math.ceil,\n round: Math.round,\n} as const;\n\nconst ALLOWED_CONSTANTS: Record<string, number> = {\n pi: Math.PI,\n e: Math.E,\n};\n\n// ----- Tokenizer ----------------------------------------------------------\n\ntype TokenType = 'NUMBER' | 'IDENT' | 'OP' | 'LPAREN' | 'RPAREN' | 'COMMA';\n\ninterface Token {\n type: TokenType;\n value: string;\n pos: number;\n}\n\nconst OPERATORS = new Set(['+', '-', '*', '/', '^']);\n\nexport function tokenize(src: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < src.length) {\n const ch = src[i];\n\n // whitespace\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n i++;\n continue;\n }\n\n // number (int, float, scientific)\n if ((ch >= '0' && ch <= '9') || ch === '.') {\n let j = i;\n let hasDot = false;\n let hasExp = false;\n while (j < src.length) {\n const c = src[j];\n if (c >= '0' && c <= '9') {\n j++;\n } else if (c === '.' && !hasDot && !hasExp) {\n hasDot = true;\n j++;\n } else if ((c === 'e' || c === 'E') && !hasExp) {\n hasExp = true;\n j++;\n if (src[j] === '+' || src[j] === '-') j++;\n } else {\n break;\n }\n }\n const raw = src.slice(i, j);\n // raw must contain ít nhất 1 digit\n if (!/[0-9]/.test(raw)) {\n throw new Error(`Số không hợp lệ tại vị trí ${i}: \"${raw}\"`);\n }\n tokens.push({ type: 'NUMBER', value: raw, pos: i });\n i = j;\n continue;\n }\n\n // identifier (a-zA-Z, sau đó a-zA-Z0-9_)\n if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {\n let j = i;\n while (j < src.length) {\n const c = src[j];\n if (\n (c >= 'a' && c <= 'z') ||\n (c >= 'A' && c <= 'Z') ||\n (c >= '0' && c <= '9') ||\n c === '_'\n ) {\n j++;\n } else {\n break;\n }\n }\n tokens.push({ type: 'IDENT', value: src.slice(i, j), pos: i });\n i = j;\n continue;\n }\n\n if (OPERATORS.has(ch)) {\n tokens.push({ type: 'OP', value: ch, pos: i });\n i++;\n continue;\n }\n if (ch === '(') {\n tokens.push({ type: 'LPAREN', value: ch, pos: i });\n i++;\n continue;\n }\n if (ch === ')') {\n tokens.push({ type: 'RPAREN', value: ch, pos: i });\n i++;\n continue;\n }\n if (ch === ',') {\n tokens.push({ type: 'COMMA', value: ch, pos: i });\n i++;\n continue;\n }\n\n throw new Error(`Ký tự không hợp lệ tại vị trí ${i}: \"${ch}\"`);\n }\n return tokens;\n}\n\n// ----- AST ----------------------------------------------------------------\n\nexport type AstNode =\n | { kind: 'num'; value: number }\n | { kind: 'ident'; name: string }\n | { kind: 'unary'; op: '-' | '+'; arg: AstNode }\n | { kind: 'binary'; op: '+' | '-' | '*' | '/' | '^'; lhs: AstNode; rhs: AstNode }\n | { kind: 'call'; name: string; args: AstNode[] };\n\n// ----- Parser (Pratt-style precedence climbing) ---------------------------\n\nclass Parser {\n private pos = 0;\n constructor(private tokens: Token[]) {}\n\n private peek(): Token | undefined {\n return this.tokens[this.pos];\n }\n\n private consume(): Token {\n const t = this.tokens[this.pos++];\n if (!t) throw new Error('Cú pháp: hết token sớm');\n return t;\n }\n\n parseExpression(): AstNode {\n const node = this.parseAddSub();\n if (this.pos < this.tokens.length) {\n const t = this.tokens[this.pos];\n throw new Error(`Cú pháp: token thừa \"${t.value}\" tại vị trí ${t.pos}`);\n }\n return node;\n }\n\n // + - (left assoc)\n private parseAddSub(): AstNode {\n let lhs = this.parseMulDiv();\n while (true) {\n const t = this.peek();\n if (t && t.type === 'OP' && (t.value === '+' || t.value === '-')) {\n this.consume();\n const rhs = this.parseMulDiv();\n lhs = { kind: 'binary', op: t.value as '+' | '-', lhs, rhs };\n } else {\n break;\n }\n }\n return lhs;\n }\n\n // * / (left assoc)\n private parseMulDiv(): AstNode {\n let lhs = this.parseUnary();\n while (true) {\n const t = this.peek();\n if (t && t.type === 'OP' && (t.value === '*' || t.value === '/')) {\n this.consume();\n const rhs = this.parseUnary();\n lhs = { kind: 'binary', op: t.value as '*' | '/', lhs, rhs };\n } else {\n break;\n }\n }\n return lhs;\n }\n\n // unary + - (right assoc) sau đó parsePow\n private parseUnary(): AstNode {\n const t = this.peek();\n if (t && t.type === 'OP' && (t.value === '+' || t.value === '-')) {\n this.consume();\n const arg = this.parseUnary();\n return { kind: 'unary', op: t.value as '+' | '-', arg };\n }\n return this.parsePow();\n }\n\n // ^ (right assoc)\n private parsePow(): AstNode {\n const lhs = this.parsePrimary();\n const t = this.peek();\n if (t && t.type === 'OP' && t.value === '^') {\n this.consume();\n // right-assoc: parseUnary để chấp nhận `2^-x`\n const rhs = this.parseUnary();\n return { kind: 'binary', op: '^', lhs, rhs };\n }\n return lhs;\n }\n\n private parsePrimary(): AstNode {\n const t = this.peek();\n if (!t) throw new Error('Cú pháp: thiếu biểu thức');\n\n if (t.type === 'NUMBER') {\n this.consume();\n const v = Number(t.value);\n if (!Number.isFinite(v) && !Number.isNaN(v)) {\n // Vẫn cho phép Infinity literal hiếm khi xảy ra; nhưng safe-guard NaN\n }\n return { kind: 'num', value: v };\n }\n\n if (t.type === 'IDENT') {\n this.consume();\n const next = this.peek();\n if (next && next.type === 'LPAREN') {\n // Function call\n this.consume(); // (\n const args: AstNode[] = [];\n const lookahead = this.peek();\n if (!lookahead || lookahead.type !== 'RPAREN') {\n args.push(this.parseAddSub());\n while (true) {\n const nx = this.peek();\n if (nx && nx.type === 'COMMA') {\n this.consume();\n args.push(this.parseAddSub());\n } else {\n break;\n }\n }\n }\n const close = this.peek();\n if (!close || close.type !== 'RPAREN') {\n throw new Error(`Cú pháp: thiếu \")\" sau hàm \"${t.value}\"`);\n }\n this.consume(); // )\n return { kind: 'call', name: t.value, args };\n }\n return { kind: 'ident', name: t.value };\n }\n\n if (t.type === 'LPAREN') {\n this.consume();\n const inner = this.parseAddSub();\n const close = this.peek();\n if (!close || close.type !== 'RPAREN') {\n throw new Error('Cú pháp: thiếu \")\"');\n }\n this.consume();\n return inner;\n }\n\n throw new Error(`Cú pháp: token bất ngờ \"${t.value}\" tại vị trí ${t.pos}`);\n }\n}\n\nexport function parseAst(src: string): AstNode {\n const tokens = tokenize(src);\n if (tokens.length === 0) throw new Error('Biểu thức rỗng');\n const p = new Parser(tokens);\n return p.parseExpression();\n}\n\n// ----- Evaluator ----------------------------------------------------------\n\nexport interface EvalEnv {\n /** Giá trị của biến `x`. */\n x: number;\n /** Tham số đơn ký tự (a, b, c, ...) từ caller. */\n params: Record<string, number>;\n}\n\nexport function evaluate(node: AstNode, env: EvalEnv): number {\n switch (node.kind) {\n case 'num':\n return node.value;\n case 'ident': {\n const name = node.name;\n if (name === 'x') return env.x;\n if (Object.prototype.hasOwnProperty.call(ALLOWED_CONSTANTS, name)) {\n return ALLOWED_CONSTANTS[name];\n }\n // tham số 1 ký tự\n if (name.length === 1 && Object.prototype.hasOwnProperty.call(env.params, name)) {\n return env.params[name];\n }\n throw new Error(`Identifier không hợp lệ: \"${name}\"`);\n }\n case 'unary': {\n const v = evaluate(node.arg, env);\n return node.op === '-' ? -v : +v;\n }\n case 'binary': {\n const a = evaluate(node.lhs, env);\n const b = evaluate(node.rhs, env);\n switch (node.op) {\n case '+':\n return a + b;\n case '-':\n return a - b;\n case '*':\n return a * b;\n case '/':\n return a / b; // có thể trả Infinity/NaN — đúng theo IEEE 754\n case '^':\n return Math.pow(a, b);\n }\n // exhaustive — TS không bắt được vì op đã typed\n throw new Error(`Toán tử không hỗ trợ: \"${(node as { op: string }).op}\"`);\n }\n case 'call': {\n const fn = (ALLOWED_FUNCTIONS as Record<string, (...args: number[]) => number>)[node.name];\n if (typeof fn !== 'function') {\n throw new Error(`Hàm không hợp lệ: \"${node.name}\"`);\n }\n const args = node.args.map((a) => evaluate(a, env));\n return fn(...args);\n }\n }\n}\n\n/**\n * Lấy danh sách identifier đơn ký tự (ngoài `x`, `pi`, `e`) — đây là các tham số tự do.\n * Không tính identifier xuất hiện dưới dạng tên hàm (vd `sin` trong `sin(x)`).\n */\nexport function collectFreeVars(node: AstNode, out: Set<string> = new Set()): Set<string> {\n switch (node.kind) {\n case 'num':\n return out;\n case 'ident': {\n const name = node.name;\n if (name === 'x') return out;\n if (Object.prototype.hasOwnProperty.call(ALLOWED_CONSTANTS, name)) return out;\n if (name.length === 1) out.add(name);\n // identifier dài > 1 không phải hằng → caller validate sẽ catch\n return out;\n }\n case 'unary':\n return collectFreeVars(node.arg, out);\n case 'binary':\n collectFreeVars(node.lhs, out);\n collectFreeVars(node.rhs, out);\n return out;\n case 'call':\n for (const a of node.args) collectFreeVars(a, out);\n return out;\n }\n}\n\n/**\n * Kiểm tra mọi identifier xuất hiện đều thuộc whitelist (functions/constants/x/single-char-param).\n * Trả về null nếu OK, hoặc message lỗi.\n */\nexport function checkIdentifiers(node: AstNode): string | null {\n switch (node.kind) {\n case 'num':\n return null;\n case 'ident': {\n const name = node.name;\n if (name === 'x') return null;\n if (Object.prototype.hasOwnProperty.call(ALLOWED_CONSTANTS, name)) return null;\n if (name.length === 1) return null;\n return `Tên không hợp lệ: \"${name}\"`;\n }\n case 'unary':\n return checkIdentifiers(node.arg);\n case 'binary':\n return checkIdentifiers(node.lhs) ?? checkIdentifiers(node.rhs);\n case 'call': {\n if (!Object.prototype.hasOwnProperty.call(ALLOWED_FUNCTIONS, node.name)) {\n return `Tên hàm không hợp lệ: \"${node.name}\"`;\n }\n for (const a of node.args) {\n const e = checkIdentifiers(a);\n if (e) return e;\n }\n return null;\n }\n }\n}\n\nexport const ALLOWED_FUNCTION_NAMES: ReadonlySet<string> = new Set(Object.keys(ALLOWED_FUNCTIONS));\nexport const ALLOWED_CONSTANT_NAMES: ReadonlySet<string> = new Set(Object.keys(ALLOWED_CONSTANTS));\n","import {\n ALLOWED_FUNCTION_NAMES,\n checkIdentifiers,\n collectFreeVars,\n evaluate,\n parseAst,\n tokenize,\n type AstNode,\n} from './evaluator';\n\nconst ALLOWED_FUNCTIONS = ALLOWED_FUNCTION_NAMES;\n\n// Giữ whitelist ký tự để fail-closed sớm — không cho ; = [ ] ' \" ` { } \\ v.v.\nconst ALLOWED_CHARS = /^[a-zA-Z0-9_.+\\-*/^()\\s,]+$/;\n\nconst SUGGESTIONS: Record<string, string> = {\n tg: 'tan',\n arcsin: 'asin',\n arccos: 'acos',\n arctan: 'atan',\n};\n\nexport interface ParseResult {\n ok: boolean;\n error?: string;\n freeVars: Set<string>;\n}\n\nfunction errResult(message: string): ParseResult {\n return { ok: false, error: message, freeVars: new Set() };\n}\n\nexport function validate(expr: string): ParseResult {\n const trimmed = expr.trim();\n if (!trimmed) return errResult('Biểu thức rỗng');\n if (!ALLOWED_CHARS.test(trimmed)) return errResult('Ký tự không hợp lệ');\n\n // Tokenize trước để lấy danh sách IDENT thật sự (loại bỏ exponent `e` của số như `1e3`).\n // Pre-check identifier để cho ra error message thân thiện (suggestion tg→tan, ...).\n let tokens;\n try {\n tokens = tokenize(trimmed);\n } catch {\n return errResult('Lỗi cú pháp');\n }\n const earlyFree = new Set<string>();\n for (const tok of tokens) {\n if (tok.type !== 'IDENT') continue;\n const id = tok.value;\n if (id === 'x' || id === 'pi' || id === 'e') continue;\n if (ALLOWED_FUNCTIONS.has(id)) continue;\n if (id.length === 1) {\n earlyFree.add(id);\n continue;\n }\n const hint = SUGGESTIONS[id];\n return errResult(\n hint\n ? `Tên hàm không hợp lệ: \"${id}\". Bạn có ý là \"${hint}\" không?`\n : `Tên không hợp lệ: \"${id}\"`,\n );\n }\n\n let ast: AstNode;\n try {\n ast = parseAst(trimmed);\n } catch {\n return errResult('Lỗi cú pháp');\n }\n\n const idErr = checkIdentifiers(ast);\n if (idErr) return errResult(idErr);\n\n const freeVars = collectFreeVars(ast);\n // Hợp nhất với earlyFree (regex pass) — thường giống nhau, nhưng đảm bảo invariant.\n for (const v of earlyFree) freeVars.add(v);\n return { ok: true, freeVars };\n}\n\n// FUNCTION_REPLACEMENTS giữ longest-first để rewriteToJs không nhầm asin→a-sin.\nconst FUNCTION_REPLACEMENTS: Array<[string, string]> = [\n ['asin', 'Math.asin'],\n ['acos', 'Math.acos'],\n ['atan', 'Math.atan'],\n ['sqrt', 'Math.sqrt'],\n ['floor', 'Math.floor'],\n ['round', 'Math.round'],\n ['ceil', 'Math.ceil'],\n ['sin', 'Math.sin'],\n ['cos', 'Math.cos'],\n ['tan', 'Math.tan'],\n ['abs', 'Math.abs'],\n ['exp', 'Math.exp'],\n ['log', 'Math.log10'],\n ['ln', 'Math.log'],\n];\n\n/**\n * Chuyển expression user-input sang JS string tương đương.\n *\n * Function này chỉ dùng cho debug / hiển thị / tương thích ngược.\n * Runtime KHÔNG còn `eval` chuỗi này — `compile()` dùng AST evaluator.\n */\nexport function rewriteToJs(\n expr: string,\n params: Record<string, number>,\n): string {\n let s = expr.replace(/\\^/g, '**');\n s = s.replace(/\\bpi\\b/g, 'Math.PI');\n s = s.replace(/\\be\\b/g, 'Math.E');\n for (const [from, to] of FUNCTION_REPLACEMENTS) {\n s = s.replace(new RegExp(`\\\\b${from}\\\\b`, 'g'), to);\n }\n for (const [name, value] of Object.entries(params)) {\n if (name.length !== 1) continue;\n s = s.replace(new RegExp(`\\\\b${name}\\\\b`, 'g'), `(${value})`);\n }\n return s;\n}\n\nexport function compile(\n expr: string,\n paramValues: Record<string, number>,\n): ((x: number) => number) | { error: string } {\n const v = validate(expr);\n if (!v.ok) return { error: v.error ?? 'Invalid' };\n let ast: AstNode;\n try {\n ast = parseAst(expr.trim());\n } catch (err) {\n return { error: err instanceof Error ? err.message : String(err) };\n }\n return (x: number) => {\n try {\n const y = evaluate(ast, { x, params: paramValues });\n return typeof y === 'number' ? y : NaN;\n } catch {\n return NaN;\n }\n };\n}\n","import type {\n SerializedGraph,\n SerializedPoint,\n SerializedIntersection,\n SerializedTangent,\n} from '../serialize';\nimport { compile } from '../parser';\n\nexport interface ClickContext {\n x: number;\n y: number;\n functionId?: string;\n}\n\nexport function addPointOnCurve(\n graph: SerializedGraph,\n ctx: ClickContext,\n idFactory: () => string,\n): SerializedGraph {\n if (!ctx.functionId) return graph;\n const point: SerializedPoint = {\n id: idFactory(),\n functionId: ctx.functionId,\n x: ctx.x,\n };\n return { ...graph, points: [...graph.points, point] };\n}\n\nexport function addIntersection(\n graph: SerializedGraph,\n functionIdA: string,\n functionIdB: string,\n idFactory: () => string,\n): SerializedGraph {\n if (functionIdA === functionIdB) return graph;\n const exists = graph.intersections.some(\n (i) =>\n (i.functionIdA === functionIdA && i.functionIdB === functionIdB) ||\n (i.functionIdA === functionIdB && i.functionIdB === functionIdA),\n );\n if (exists) return graph;\n const intersection: SerializedIntersection = {\n id: idFactory(),\n functionIdA,\n functionIdB,\n };\n return { ...graph, intersections: [...graph.intersections, intersection] };\n}\n\nexport function addTangent(\n graph: SerializedGraph,\n pointId: string,\n idFactory: () => string,\n): SerializedGraph {\n const exists = graph.tangents.some((t) => t.pointId === pointId);\n if (exists) return graph;\n const tangent: SerializedTangent = { id: idFactory(), pointId };\n return { ...graph, tangents: [...graph.tangents, tangent] };\n}\n\n/**\n * Numerical derivative via centered difference. Dùng cho tangent tool.\n */\nexport function numericalDerivative(\n expression: string,\n paramValues: Record<string, number>,\n x: number,\n h = 1e-4,\n): number {\n const fn = compile(expression, paramValues);\n if (typeof fn !== 'function') return NaN;\n const y1 = fn(x - h);\n const y2 = fn(x + h);\n return (y2 - y1) / (2 * h);\n}\n","import type { SerializedGraph } from './serialize';\nimport { compile } from './parser';\nimport { numericalDerivative } from './editor/handlers';\n\n/**\n * Render tất cả objects (functions, points, intersections, tangents) lên board JSXGraph.\n *\n * Pure function — không giữ state, dùng cho one-shot render (render.ts).\n * MiniBoard giữ syncObjects riêng để diff/track curves theo id.\n */\nexport function renderGraphObjects(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board: any,\n graph: SerializedGraph,\n): void {\n const paramMap: Record<string, number> = {};\n for (const p of graph.parameters) paramMap[p.name] = p.value;\n\n // Functions\n for (const f of graph.functions) {\n if (!f.visible) continue;\n const compiled = compile(f.expression, paramMap);\n if (typeof compiled !== 'function') continue;\n const domain = f.domain ?? { min: graph.view.xMin, max: graph.view.xMax };\n board.create('functiongraph', [compiled, domain.min, domain.max], {\n strokeColor: f.color,\n strokeWidth: 2,\n name: f.name,\n withLabel: false,\n highlight: false,\n });\n }\n\n // Points\n for (const point of graph.points) {\n const fn = graph.functions.find((f) => f.id === point.functionId);\n if (!fn || !fn.visible) continue;\n const compiled = compile(fn.expression, paramMap);\n if (typeof compiled !== 'function') continue;\n const y = compiled(point.x);\n board.create('point', [point.x, y], {\n name: point.label ?? '',\n size: 3,\n fillColor: fn.color,\n strokeColor: fn.color,\n withLabel: !!point.label,\n });\n }\n\n // Intersections\n for (const inter of graph.intersections) {\n const fa = graph.functions.find((f) => f.id === inter.functionIdA);\n const fb = graph.functions.find((f) => f.id === inter.functionIdB);\n if (!fa || !fb || !fa.visible || !fb.visible) continue;\n const cfa = compile(fa.expression, paramMap);\n const cfb = compile(fb.expression, paramMap);\n if (typeof cfa !== 'function' || typeof cfb !== 'function') continue;\n const roots = scanRoots((x: number) => cfa(x) - cfb(x), graph.view.xMin, graph.view.xMax);\n for (const x of roots) {\n board.create('point', [x, cfa(x)], {\n size: 3,\n fillColor: '#000',\n strokeColor: '#000',\n });\n }\n }\n\n // Tangents\n for (const tan of graph.tangents) {\n const pt = graph.points.find((p) => p.id === tan.pointId);\n if (!pt) continue;\n const fn = graph.functions.find((f) => f.id === pt.functionId);\n if (!fn || !fn.visible) continue;\n const slope = numericalDerivative(fn.expression, paramMap, pt.x);\n const cfn = compile(fn.expression, paramMap);\n if (typeof cfn !== 'function' || !Number.isFinite(slope)) continue;\n const y0 = cfn(pt.x);\n const x1 = graph.view.xMin;\n const x2 = graph.view.xMax;\n board.create(\n 'line',\n [\n [x1, slope * (x1 - pt.x) + y0],\n [x2, slope * (x2 - pt.x) + y0],\n ],\n {\n strokeColor: fn.color,\n strokeWidth: 1,\n dash: 2,\n straightFirst: false,\n straightLast: false,\n },\n );\n }\n}\n\nfunction scanRoots(\n fn: (x: number) => number,\n xMin: number,\n xMax: number,\n samples = 200,\n): number[] {\n const roots: number[] = [];\n const step = (xMax - xMin) / samples;\n let prevX = xMin;\n let prevY = fn(prevX);\n for (let i = 1; i <= samples; i++) {\n const x = xMin + i * step;\n const y = fn(x);\n if (Number.isFinite(prevY) && Number.isFinite(y) && prevY * y < 0) {\n let a = prevX;\n let b = x;\n let ya = prevY;\n for (let j = 0; j < 30; j++) {\n const m = (a + b) / 2;\n const ym = fn(m);\n if (Math.abs(ym) < 1e-6) {\n a = b = m;\n break;\n }\n if (ya * ym < 0) {\n b = m;\n } else {\n a = m;\n ya = ym;\n }\n }\n roots.push((a + b) / 2);\n }\n prevX = x;\n prevY = y;\n }\n return roots;\n}\n","import { parseSerializedGraph } from './serialize';\nimport { renderGraphObjects } from './renderObjects';\n\n/**\n * Re-render SVG cho graph-2d stamp từ jsonState đã serialize.\n *\n * Dùng cho:\n * 1. Insert vào whiteboard (lúc user nhấn Chèn).\n * 2. Restore stamp file sau khi reload (Excalidraw không persist binary).\n *\n * Pattern mirror `geometry-2d/render.ts`:\n * - LUÔN dùng light palette. Excalidraw apply CSS invert filter trong dark mode.\n * - Đặt JXG.Options.text.display='internal' để label render dưới dạng SVG, không HTML overlay.\n * - Offscreen div 600×400 cố định; cleanup sau khi clone SVG outerHTML.\n */\nexport async function renderGraph2dSvgFromState(jsonState: string): Promise<string> {\n const parsed = parseSerializedGraph(jsonState);\n if (!parsed) throw new Error('renderGraph2dSvgFromState: jsonState corrupt');\n\n const JXG = (await import('jsxgraph')).default;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n }\n\n const container = document.createElement('div');\n container.id = `jxg_graph2d_off_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n container.style.cssText =\n 'position:absolute;top:-99999px;left:-99999px;width:600px;height:400px;visibility:hidden;pointer-events:none;';\n document.body.appendChild(container);\n\n let board: unknown = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board = (JXG as any).JSXGraph.initBoard(container.id, {\n boundingbox: [parsed.view.xMin, parsed.view.yMax, parsed.view.xMax, parsed.view.yMin],\n axis: parsed.view.showAxis,\n grid: parsed.view.showGrid,\n showCopyright: false,\n showNavigation: false,\n keepAspectRatio: false,\n });\n renderGraphObjects(board, parsed);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (board as any).update();\n const svgEl = container.querySelector('svg');\n if (!svgEl) throw new Error('renderGraph2dSvgFromState: no svg generated');\n return svgEl.outerHTML;\n } finally {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (board) (JXG as any).JSXGraph.freeBoard(board);\n } catch {\n /* ignore */\n }\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface Graph2DCustomData extends BaseStampCustomData {\n kind: 'graph2d';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGraph2DCustomData(data: unknown): data is Graph2DCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<Graph2DCustomData>;\n return d.kind === 'graph2d' && d.version === 1 && typeof d.jsonState === 'string';\n}\n","// src/stamps/graph-2d/editor/tools.ts\nexport type GraphTool = 'move' | 'point-on-curve' | 'intersect' | 'tangent';\n\nexport interface GraphToolMeta {\n id: GraphTool;\n label: string;\n title: string;\n shortcutKey?: string;\n}\n\nexport const GRAPH_TOOLS: GraphToolMeta[] = [\n { id: 'move', label: 'Di chuyển', title: 'Di chuyển / chọn' },\n { id: 'point-on-curve', label: 'Điểm trên curve', title: 'Tạo điểm cố định trên đồ thị' },\n { id: 'intersect', label: 'Giao điểm', title: 'Đánh dấu giao điểm 2 đồ thị' },\n { id: 'tangent', label: 'Tiếp tuyến', title: 'Vẽ tiếp tuyến tại điểm trên đồ thị' },\n];\n","'use client';\n\nimport { useEffect, useState, type KeyboardEvent, type FocusEvent } from 'react';\n\nexport interface FunctionRowProps {\n id: string;\n name: string;\n expression: string;\n color: string;\n visible: boolean;\n error: string | null;\n onExpressionCommit: (expr: string) => void;\n onToggleVisible: () => void;\n onRemove: () => void;\n}\n\nexport function FunctionRow(props: FunctionRowProps) {\n const { id, name, expression, color, visible, error } = props;\n const [draft, setDraft] = useState(expression);\n\n useEffect(() => {\n setDraft(expression);\n }, [expression]);\n\n const commit = () => {\n if (draft !== expression) props.onExpressionCommit(draft);\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit();\n (e.target as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n setDraft(expression);\n (e.target as HTMLInputElement).blur();\n }\n };\n\n const handleBlur = (_: FocusEvent<HTMLInputElement>) => commit();\n\n return (\n <div className={`graph-function-row${error ? ' is-error' : ''}`} data-testid={`graph-function-row-${id}`}>\n <span\n className=\"graph-function-color\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n />\n <span className=\"graph-function-name\" data-testid={`graph-function-name-${id}`}>\n {name}(x) =\n </span>\n <input\n aria-label=\"Biểu thức\"\n className=\"graph-function-input\"\n type=\"text\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n spellCheck={false}\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n />\n <button\n type=\"button\"\n aria-label=\"Ẩn/hiện đồ thị\"\n className={`graph-function-eye${visible ? '' : ' is-hidden'}`}\n onClick={props.onToggleVisible}\n >\n {visible ? '👁' : '⊘'}\n </button>\n <button\n type=\"button\"\n aria-label=\"Xoá đồ thị\"\n className=\"graph-function-remove\"\n onClick={props.onRemove}\n >\n ✕\n </button>\n {error ? <div className=\"graph-function-error\">{error}</div> : null}\n </div>\n );\n}\n","'use client';\n\nexport interface SliderRowProps {\n name: string;\n value: number;\n min: number;\n max: number;\n step: number;\n onChange: (value: number) => void;\n onRemove: () => void;\n onRangeChange: (min: number, max: number, step: number) => void;\n}\n\nexport function SliderRow(props: SliderRowProps) {\n const { name, value, min, max, step } = props;\n return (\n <div className=\"graph-slider-row\" data-testid={`graph-slider-row-${name}`}>\n <div className=\"graph-slider-header\">\n <span className=\"graph-slider-name\">{name}</span>\n <span className=\"graph-slider-value\">= {value.toFixed(2)}</span>\n <button\n type=\"button\"\n aria-label={`Xoá tham số ${name}`}\n className=\"graph-slider-remove\"\n onClick={props.onRemove}\n >\n ✕\n </button>\n </div>\n <input\n type=\"range\"\n aria-label={`Slider ${name}`}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => props.onChange(parseFloat(e.target.value))}\n className=\"graph-slider-input\"\n />\n <div className=\"graph-slider-range\">\n <span>{min}</span>\n <span>{max}</span>\n </div>\n </div>\n );\n}\n","export const GRAPH_PALETTE = [\n '#2563eb', // blue\n '#dc2626', // red\n '#16a34a', // green\n '#9333ea', // purple\n '#ea580c', // orange\n '#0891b2', // cyan\n '#db2777', // pink\n '#65a30d', // lime\n] as const;\n\nexport const FUNCTION_NAMES = ['f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'] as const;\n\nexport const MAX_FUNCTIONS = 8;\nexport const MAX_PARAMETERS = 8;\n\nexport function nextColor(usedColors: readonly string[]): string {\n for (const c of GRAPH_PALETTE) {\n if (!usedColors.includes(c)) return c;\n }\n return GRAPH_PALETTE[usedColors.length % GRAPH_PALETTE.length];\n}\n\nexport function nextFunctionName(usedNames: readonly string[]): string {\n for (const n of FUNCTION_NAMES) {\n if (!usedNames.includes(n)) return n;\n }\n return FUNCTION_NAMES[usedNames.length % FUNCTION_NAMES.length];\n}\n","'use client';\n\nimport { FunctionRow } from './FunctionRow';\nimport { SliderRow } from './SliderRow';\nimport type { SerializedGraph } from '../serialize';\nimport { MAX_FUNCTIONS } from '../colors';\n\nexport interface AlgebraViewProps {\n graph: SerializedGraph;\n errors: Record<string, string | null>;\n onAddFunctionDraft: () => void;\n onCommitFunctionExpr: (id: string, expr: string) => void;\n onToggleFunctionVisible: (id: string) => void;\n onRemoveFunction: (id: string) => void;\n onParameterChange: (name: string, value: number) => void;\n onParameterRangeChange: (name: string, min: number, max: number, step: number) => void;\n onRemoveParameter: (name: string) => void;\n}\n\nexport function AlgebraView(props: AlgebraViewProps) {\n const { graph, errors } = props;\n const atMax = graph.functions.length >= MAX_FUNCTIONS;\n\n return (\n <div className=\"graph-algebra-view\">\n <div className=\"graph-algebra-section\">\n {graph.functions.map((f) => (\n <FunctionRow\n key={f.id}\n id={f.id}\n name={f.name}\n expression={f.expression}\n color={f.color}\n visible={f.visible}\n error={errors[f.id] ?? null}\n onExpressionCommit={(expr) => props.onCommitFunctionExpr(f.id, expr)}\n onToggleVisible={() => props.onToggleFunctionVisible(f.id)}\n onRemove={() => props.onRemoveFunction(f.id)}\n />\n ))}\n <button\n type=\"button\"\n aria-label=\"Thêm hàm số\"\n className=\"graph-algebra-add\"\n onClick={props.onAddFunctionDraft}\n disabled={atMax}\n >\n + Thêm hàm\n </button>\n </div>\n\n {graph.parameters.length > 0 ? (\n <div className=\"graph-algebra-section graph-algebra-parameters\">\n {graph.parameters.map((p) => (\n <SliderRow\n key={p.name}\n name={p.name}\n value={p.value}\n min={p.min}\n max={p.max}\n step={p.step}\n onChange={(v) => props.onParameterChange(p.name, v)}\n onRangeChange={(min, max, step) =>\n props.onParameterRangeChange(p.name, min, max, step)\n }\n onRemove={() => props.onRemoveParameter(p.name)}\n />\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { GRAPH_TOOLS, type GraphTool } from './tools';\nimport { AlgebraView, type AlgebraViewProps } from './AlgebraView';\n\n// ---------- Icons ----------\n\nconst GraphIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 21 V3\" />\n <path d=\"M3 21 H21\" />\n <path d=\"M5 19 C8 5, 14 5, 19 17\" />\n </svg>\n);\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n );\n}\n\nfunction ResetViewIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" />\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n </svg>\n );\n}\n\n// Tool icons\nfunction MoveIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 4 L9 4 L9 9 L4 9 Z\" />\n </svg>\n );\n}\nfunction PointOnCurveIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 17 C7 8, 14 8, 21 14\" />\n <circle cx=\"12\" cy=\"11\" r=\"2.2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\nfunction IntersectIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 17 C8 5, 14 5, 21 17\" />\n <path d=\"M3 5 C8 17, 14 17, 21 5\" />\n <circle cx=\"12\" cy=\"11\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\nfunction TangentIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 17 C8 7, 14 7, 21 16\" />\n <line x1=\"4\" y1=\"14\" x2=\"20\" y2=\"6\" />\n <circle cx=\"12\" cy=\"10\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nconst TOOL_ICONS: Record<GraphTool, React.ReactNode> = {\n move: <MoveIcon />,\n 'point-on-curve': <PointOnCurveIcon />,\n intersect: <IntersectIcon />,\n tangent: <TangentIcon />,\n};\n\n// ---------- Props ----------\n\nexport interface GraphLeftPanelProps extends AlgebraViewProps {\n activeTool: GraphTool;\n onToolChange: (t: GraphTool) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onResetView: () => void;\n onUndo: () => void;\n canUndo: boolean;\n onClose: () => void;\n isDark: boolean;\n isMobile: boolean;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n}\n\n// ---------- Section ----------\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Body ----------\n\nfunction PanelBody(props: GraphLeftPanelProps) {\n return (\n <>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-2 flex-wrap text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={props.showAxis}\n onChange={(e) => props.onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n Trục\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={props.showGrid}\n onChange={(e) => props.onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={props.onResetView}\n title=\"Đặt lại tầm nhìn\"\n aria-label=\"Đặt lại tầm nhìn\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900\"\n >\n <ResetViewIcon />\n </button>\n <button\n type=\"button\"\n onClick={props.onUndo}\n disabled={!props.canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n </div>\n </Section>\n\n <Section label=\"Công cụ\">\n <div className=\"grid grid-cols-4 gap-1\">\n {GRAPH_TOOLS.map((t) => {\n const isActive = props.activeTool === t.id;\n return (\n <button\n key={t.id}\n type=\"button\"\n aria-label={t.title}\n title={t.title}\n aria-pressed={isActive}\n onClick={() => props.onToolChange(t.id)}\n data-testid={`graph-tool-${t.id}`}\n className={[\n 'flex h-8 items-center justify-center rounded-md transition',\n isActive\n ? 'bg-orange-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {TOOL_ICONS[t.id]}\n </button>\n );\n })}\n </div>\n </Section>\n\n <Section label=\"Hàm số\">\n <AlgebraView\n graph={props.graph}\n errors={props.errors}\n onAddFunctionDraft={props.onAddFunctionDraft}\n onCommitFunctionExpr={props.onCommitFunctionExpr}\n onToggleFunctionVisible={props.onToggleFunctionVisible}\n onRemoveFunction={props.onRemoveFunction}\n onParameterChange={props.onParameterChange}\n onParameterRangeChange={props.onParameterRangeChange}\n onRemoveParameter={props.onRemoveParameter}\n />\n </Section>\n </>\n );\n}\n\n// ---------- Public ----------\n\nexport function GraphLeftPanel(props: GraphLeftPanelProps) {\n const { isMobile, drawerOpen, isDark, onClose, onDrawerClose } = props;\n if (isMobile && !drawerOpen) return null;\n const handleClose = isMobile ? onDrawerClose : onClose;\n return (\n <aside\n role=\"complementary\"\n aria-label=\"Đồ thị 2D\"\n data-testid=\"graph-left-panel\"\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n isMobile\n ? 'fixed inset-y-0 left-0 z-50 flex w-72 max-w-[85vw] flex-col bg-white shadow-2xl animate-in slide-in-from-left duration-200'\n : 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join(' ')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{GraphIconHeader}</span>\n Đồ thị 2D\n </h3>\n <button\n onClick={handleClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">\n <PanelBody {...props} />\n </div>\n </aside>\n );\n}\n","// src/stamps/graph-2d/editor/theme.ts\nexport interface GraphPalette {\n axis: string;\n grid: string;\n label: string;\n background: string;\n}\n\nexport function graphPaletteFor(isDark: boolean): GraphPalette {\n return {\n axis: isDark ? '#cbd5e1' : '#94a3b8',\n grid: isDark ? '#475569' : '#e2e8f0',\n label: isDark ? '#e2e8f0' : '#0f172a',\n background: isDark ? '#0f172a' : '#ffffff',\n };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport type { SerializedGraph } from '../serialize';\nimport { compile } from '../parser';\nimport { graphPaletteFor } from './theme';\nimport type { GraphTool } from './tools';\nimport { numericalDerivative } from './handlers';\n\nexport interface BoardEvent {\n type: 'click-curve' | 'click-empty' | 'view-change';\n functionId?: string;\n x?: number;\n y?: number;\n view?: SerializedGraph['view'];\n}\n\nexport interface MiniBoardProps {\n graph: SerializedGraph;\n activeTool: GraphTool;\n isDark: boolean;\n onBoardEvent: (e: BoardEvent) => void;\n}\n\ninterface CurveRef {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any;\n expression: string;\n color: string;\n visible: boolean;\n paramSignature: string;\n}\n\nexport function MiniBoard({ graph, activeTool, isDark, onBoardEvent }: MiniBoardProps) {\n const containerRef = useRef<HTMLDivElement | null>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const boardRef = useRef<any>(null);\n const curvesRef = useRef<Map<string, CurveRef>>(new Map());\n const palette = graphPaletteFor(isDark);\n\n // Init board on mount\n useEffect(() => {\n let cancelled = false;\n let createdBoard: unknown = null;\n const containerEl = containerRef.current;\n if (!containerEl) return;\n const containerId = `jxg_graph2d_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n containerEl.id = containerId;\n\n (async () => {\n const JXG = (await import('jsxgraph')).default;\n if (cancelled) return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const board = (JXG as any).JSXGraph.initBoard(containerId, {\n boundingbox: [graph.view.xMin, graph.view.yMax, graph.view.xMax, graph.view.yMin],\n axis: graph.view.showAxis,\n grid: graph.view.showGrid,\n showCopyright: false,\n showNavigation: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: true, needShift: false },\n keepAspectRatio: false,\n });\n boardRef.current = board;\n createdBoard = board;\n syncObjects(board, graph, curvesRef.current);\n board.on('boundingbox', () => {\n const bb = board.getBoundingBox();\n onBoardEvent({\n type: 'view-change',\n view: {\n xMin: bb[0],\n xMax: bb[2],\n yMax: bb[1],\n yMin: bb[3],\n showAxis: graph.view.showAxis,\n showGrid: graph.view.showGrid,\n },\n });\n });\n board.on('down', (ev: { clientX?: number; clientY?: number }) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const usrCoords = (board as any).getUsrCoordsOfMouse?.(ev as unknown as MouseEvent);\n const x = usrCoords?.[0] ?? 0;\n const y = usrCoords?.[1] ?? 0;\n // Tìm curve dưới chuột (best-effort)\n let functionId: string | undefined;\n for (const [id, ref] of curvesRef.current) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const obj = ref.obj as any;\n if (obj?.hasPoint && obj.hasPoint(ev.clientX ?? 0, ev.clientY ?? 0)) {\n functionId = id;\n break;\n }\n }\n if (functionId) onBoardEvent({ type: 'click-curve', functionId, x, y });\n else onBoardEvent({ type: 'click-empty', x, y });\n });\n })().catch((err) => console.error('MiniBoard init failed:', err));\n\n return () => {\n cancelled = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (createdBoard) (require('jsxgraph') as any).default.JSXGraph.freeBoard(createdBoard);\n } catch { /* ignore */ }\n boardRef.current = null;\n curvesRef.current.clear();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Sync objects khi graph thay đổi\n useEffect(() => {\n if (!boardRef.current) return;\n syncObjects(boardRef.current, graph, curvesRef.current);\n }, [graph]);\n\n // Suppress unused palette warning - consumed by syncObjects via isDark\n void palette;\n\n // Cursor visual feedback theo activeTool\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n el.style.cursor = activeTool === 'move' ? '' : 'crosshair';\n }, [activeTool]);\n\n return (\n <div\n ref={containerRef}\n className=\"graph-miniboard\"\n style={{ width: '100%', height: '100%', minHeight: '300px' }}\n data-testid=\"graph-miniboard\"\n />\n );\n}\n\nfunction paramSig(graph: SerializedGraph): string {\n return graph.parameters.map((p) => `${p.name}=${p.value}`).join(',');\n}\n\nfunction syncObjects(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board: any,\n graph: SerializedGraph,\n curves: Map<string, CurveRef>,\n): void {\n const sig = paramSig(graph);\n const paramMap: Record<string, number> = {};\n for (const p of graph.parameters) paramMap[p.name] = p.value;\n\n const wantedIds = new Set(graph.functions.map((f) => f.id));\n // Remove stale curves\n for (const [id, ref] of curves) {\n if (!wantedIds.has(id)) {\n try { board.removeObject(ref.obj); } catch { /* ignore */ }\n curves.delete(id);\n }\n }\n for (const f of graph.functions) {\n const existing = curves.get(f.id);\n const needsRecreate =\n !existing ||\n existing.expression !== f.expression ||\n existing.color !== f.color ||\n existing.visible !== f.visible ||\n existing.paramSignature !== sig;\n if (!needsRecreate) continue;\n if (existing) {\n try { board.removeObject(existing.obj); } catch { /* ignore */ }\n }\n if (!f.visible) {\n curves.delete(f.id);\n continue;\n }\n const compiled = compile(f.expression, paramMap);\n if (typeof compiled !== 'function') continue;\n const domain = f.domain ?? { min: graph.view.xMin, max: graph.view.xMax };\n const obj = board.create('functiongraph', [compiled, domain.min, domain.max], {\n strokeColor: f.color,\n strokeWidth: 2,\n name: f.name,\n withLabel: false,\n highlight: false,\n });\n curves.set(f.id, {\n obj,\n expression: f.expression,\n color: f.color,\n visible: f.visible,\n paramSignature: sig,\n });\n }\n\n // Render points\n for (const point of graph.points) {\n const fn = graph.functions.find((f) => f.id === point.functionId);\n if (!fn || !fn.visible) continue;\n const compiled = compile(fn.expression, paramMap);\n if (typeof compiled !== 'function') continue;\n const y = compiled(point.x);\n board.create('point', [point.x, y], {\n name: point.label ?? '',\n size: 3,\n fillColor: fn.color,\n strokeColor: fn.color,\n withLabel: !!point.label,\n });\n }\n\n // Render intersections\n for (const inter of graph.intersections) {\n const fa = graph.functions.find((f) => f.id === inter.functionIdA);\n const fb = graph.functions.find((f) => f.id === inter.functionIdB);\n if (!fa || !fb || !fa.visible || !fb.visible) continue;\n const cfa = compile(fa.expression, paramMap);\n const cfb = compile(fb.expression, paramMap);\n if (typeof cfa !== 'function' || typeof cfb !== 'function') continue;\n const roots = scanRoots((x: number) => cfa(x) - cfb(x), graph.view.xMin, graph.view.xMax);\n for (const x of roots) {\n board.create('point', [x, cfa(x)], {\n size: 3,\n fillColor: '#000',\n strokeColor: '#000',\n });\n }\n }\n\n // Render tangents\n for (const tan of graph.tangents) {\n const pt = graph.points.find((p) => p.id === tan.pointId);\n if (!pt) continue;\n const fn = graph.functions.find((f) => f.id === pt.functionId);\n if (!fn || !fn.visible) continue;\n const slope = numericalDerivative(fn.expression, paramMap, pt.x);\n const cfn = compile(fn.expression, paramMap);\n if (typeof cfn !== 'function' || !Number.isFinite(slope)) continue;\n const y0 = cfn(pt.x);\n const x1 = graph.view.xMin;\n const x2 = graph.view.xMax;\n board.create(\n 'line',\n [\n [x1, slope * (x1 - pt.x) + y0],\n [x2, slope * (x2 - pt.x) + y0],\n ],\n {\n strokeColor: fn.color,\n strokeWidth: 1,\n dash: 2,\n straightFirst: false,\n straightLast: false,\n },\n );\n }\n\n board.update();\n}\n\nfunction scanRoots(\n fn: (x: number) => number,\n xMin: number,\n xMax: number,\n samples = 200,\n): number[] {\n const roots: number[] = [];\n const step = (xMax - xMin) / samples;\n let prevX = xMin;\n let prevY = fn(prevX);\n for (let i = 1; i <= samples; i++) {\n const x = xMin + i * step;\n const y = fn(x);\n if (Number.isFinite(prevY) && Number.isFinite(y) && prevY * y < 0) {\n // bisection\n let a = prevX;\n let b = x;\n let ya = prevY;\n for (let j = 0; j < 30; j++) {\n const m = (a + b) / 2;\n const ym = fn(m);\n if (Math.abs(ym) < 1e-6) {\n a = b = m;\n break;\n }\n if (ya * ym < 0) {\n b = m;\n } else {\n a = m;\n ya = ym;\n }\n }\n roots.push((a + b) / 2);\n }\n prevX = x;\n prevY = y;\n }\n return roots;\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type CSSProperties,\n type Ref,\n} from 'react';\nimport { MiniBoard } from './MiniBoard';\nimport type { BoardEvent } from './MiniBoard';\nimport {\n EMPTY_GRAPH,\n stringifySerializedGraph,\n type SerializedFunction,\n type SerializedGraph,\n type SerializedParameter,\n} from '../serialize';\nimport { validate } from '../parser';\nimport { renderGraph2dSvgFromState } from '../render';\nimport { nextColor, nextFunctionName, MAX_FUNCTIONS, MAX_PARAMETERS } from '../colors';\nimport type { GraphTool } from './tools';\nimport { addPointOnCurve, addIntersection } from './handlers';\n\nexport interface GraphState {\n tool: GraphTool;\n showAxis: boolean;\n showGrid: boolean;\n canUndo: boolean;\n}\n\nexport interface GraphEditorPanelHandle {\n insert(): boolean;\n hasContent(): boolean;\n setTool(t: GraphTool): void;\n setShowAxis(b: boolean): void;\n setShowGrid(b: boolean): void;\n resetView(): void;\n undo(): void;\n\n addFunction(expr: string): { ok: true; id: string } | { ok: false; error: string };\n commitFunctionExpression(id: string, expr: string): void;\n toggleFunctionVisible(id: string): void;\n removeFunction(id: string): void;\n\n setParameter(name: string, value: number): void;\n setParameterRange(name: string, min: number, max: number, step: number): void;\n removeParameter(name: string): void;\n\n getGraph(): SerializedGraph;\n getErrors(): Record<string, string | null>;\n}\n\nexport interface GraphEditorPanelProps {\n initialState: SerializedGraph | null;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n onStateChange: (state: GraphState) => void;\n withLeftPanel: boolean;\n isDark: boolean;\n isMobile: boolean;\n onOpenDrawer: () => void;\n // Lift state up so Host can render AlgebraView with current graph + errors\n onGraphChange?: (g: SerializedGraph) => void;\n onErrorsChange?: (errors: Record<string, string | null>) => void;\n}\n\nexport const GraphEditorPanel = forwardRef(function GraphEditorPanel(\n props: GraphEditorPanelProps,\n ref: Ref<GraphEditorPanelHandle>,\n) {\n // graphRef is the single source of truth for imperative reads (hasContent, getGraph, etc.)\n // setGraph triggers re-render to sync JSXGraph MiniBoard\n const initialGraph = props.initialState ?? EMPTY_GRAPH;\n const graphRef = useRef<SerializedGraph>(initialGraph);\n const [, forceUpdate] = useState(0);\n\n const [errors, setErrors] = useState<Record<string, string | null>>({});\n const [tool, setToolState] = useState<GraphTool>('move');\n const undoStackRef = useRef<SerializedGraph[]>([]);\n const idCounterRef = useRef(1);\n\n const toolRef = useRef<GraphTool>(tool);\n toolRef.current = tool;\n\n const intersectFirstRef = useRef<string | null>(null);\n\n const propsRef = useRef(props);\n propsRef.current = props;\n\n // Notify initial graph state to Host on mount\n const initialGraphNotifiedRef = useRef(false);\n\n const pushUndo = useCallback((g: SerializedGraph) => {\n undoStackRef.current.push(g);\n if (undoStackRef.current.length > 30) undoStackRef.current.shift();\n }, []);\n\n const setErrorsWithNotify = useCallback(\n (updater: (prev: Record<string, string | null>) => Record<string, string | null>) => {\n setErrors((prev) => {\n const next = updater(prev);\n propsRef.current.onErrorsChange?.(next);\n return next;\n });\n },\n [],\n );\n\n const notifyStateChange = useCallback((g: SerializedGraph, t: GraphTool) => {\n propsRef.current.onStateChange({\n tool: t,\n showAxis: g.view.showAxis,\n showGrid: g.view.showGrid,\n canUndo: undoStackRef.current.length > 0,\n });\n }, []);\n\n const updateGraph = useCallback(\n (mutator: (prev: SerializedGraph) => SerializedGraph) => {\n const prev = graphRef.current;\n pushUndo(prev);\n const next = mutator(prev);\n graphRef.current = next;\n notifyStateChange(next, toolRef.current);\n forceUpdate((n) => n + 1);\n propsRef.current.onGraphChange?.(next);\n },\n [pushUndo, notifyStateChange],\n );\n\n const onBoardEvent = useCallback((ev: BoardEvent) => {\n const currentTool = toolRef.current;\n if (currentTool === 'point-on-curve' && ev.type === 'click-curve' && ev.functionId && ev.x !== undefined) {\n updateGraph((g) =>\n addPointOnCurve(\n g,\n { x: ev.x!, y: ev.y ?? 0, functionId: ev.functionId },\n () => `p${idCounterRef.current++}`,\n ),\n );\n setToolState('move');\n } else if (currentTool === 'intersect' && ev.type === 'click-curve' && ev.functionId) {\n if (!intersectFirstRef.current) {\n intersectFirstRef.current = ev.functionId;\n } else {\n const a = intersectFirstRef.current;\n const b = ev.functionId;\n intersectFirstRef.current = null;\n updateGraph((g) =>\n addIntersection(g, a, b, () => `i${idCounterRef.current++}`),\n );\n setToolState('move');\n }\n } else if (currentTool === 'tangent' && ev.type === 'click-curve' && ev.functionId && ev.x !== undefined) {\n const pointId = `p${idCounterRef.current++}`;\n const tangentId = `t${idCounterRef.current++}`;\n updateGraph((g) => ({\n ...g,\n points: [...g.points, { id: pointId, functionId: ev.functionId!, x: ev.x! }],\n tangents: [...g.tangents, { id: tangentId, pointId }],\n }));\n setToolState('move');\n }\n }, [updateGraph]);\n\n useImperativeHandle(\n ref,\n () => ({\n insert: () => {\n const g = graphRef.current;\n if (g.functions.length === 0) return false;\n const jsonState = stringifySerializedGraph(g);\n renderGraph2dSvgFromState(jsonState)\n .then((svg) => propsRef.current.onInsert(jsonState, svg))\n .catch((err) => console.error('Graph2D insert render failed:', err));\n return true;\n },\n\n hasContent: () => graphRef.current.functions.length > 0,\n\n setTool: (t: GraphTool) => {\n setToolState(t);\n const g = graphRef.current;\n propsRef.current.onStateChange({\n tool: t,\n showAxis: g.view.showAxis,\n showGrid: g.view.showGrid,\n canUndo: undoStackRef.current.length > 0,\n });\n },\n\n setShowAxis: (b: boolean) =>\n updateGraph((g) => ({ ...g, view: { ...g.view, showAxis: b } })),\n\n setShowGrid: (b: boolean) =>\n updateGraph((g) => ({ ...g, view: { ...g.view, showGrid: b } })),\n\n resetView: () =>\n updateGraph((g) => ({\n ...g,\n view: { ...g.view, xMin: -10, xMax: 10, yMin: -10, yMax: 10 },\n })),\n\n undo: () => {\n const prev = undoStackRef.current.pop();\n if (!prev) return;\n graphRef.current = prev;\n forceUpdate((n) => n + 1);\n propsRef.current.onStateChange({\n tool: toolRef.current,\n showAxis: prev.view.showAxis,\n showGrid: prev.view.showGrid,\n canUndo: undoStackRef.current.length > 0,\n });\n propsRef.current.onGraphChange?.(prev);\n },\n\n addFunction: (expr: string) => {\n const g = graphRef.current;\n if (g.functions.length >= MAX_FUNCTIONS) {\n return { ok: false as const, error: `Tối đa ${MAX_FUNCTIONS} hàm` };\n }\n const v = validate(expr);\n if (!v.ok) return { ok: false as const, error: v.error ?? 'Invalid' };\n\n const id = `f${idCounterRef.current++}`;\n const usedNames = g.functions.map((f) => f.name);\n const usedColors = g.functions.map((f) => f.color);\n const newFn: SerializedFunction = {\n id,\n name: nextFunctionName(usedNames),\n expression: expr,\n color: nextColor(usedColors),\n visible: true,\n };\n\n const usedParamNames = new Set(g.parameters.map((p) => p.name));\n const newParams: SerializedParameter[] = [];\n for (const varName of v.freeVars) {\n if (usedParamNames.has(varName)) continue;\n if (g.parameters.length + newParams.length >= MAX_PARAMETERS) break;\n newParams.push({ name: varName, value: 1, min: -5, max: 5, step: 0.1 });\n }\n\n updateGraph((prev) => ({\n ...prev,\n functions: [...prev.functions, newFn],\n parameters: [...prev.parameters, ...newParams],\n }));\n setErrorsWithNotify((e) => ({ ...e, [id]: null }));\n return { ok: true as const, id };\n },\n\n commitFunctionExpression: (id: string, expr: string) => {\n const g = graphRef.current;\n const v = validate(expr);\n if (!v.ok) {\n setErrorsWithNotify((e) => ({ ...e, [id]: v.error ?? 'Invalid' }));\n return;\n }\n const usedParamNames = new Set(g.parameters.map((p) => p.name));\n const newParams: SerializedParameter[] = [];\n for (const varName of v.freeVars) {\n if (usedParamNames.has(varName)) continue;\n if (g.parameters.length + newParams.length >= MAX_PARAMETERS) break;\n newParams.push({ name: varName, value: 1, min: -5, max: 5, step: 0.1 });\n }\n updateGraph((prev) => ({\n ...prev,\n functions: prev.functions.map((f) =>\n f.id === id ? { ...f, expression: expr } : f,\n ),\n parameters: [...prev.parameters, ...newParams],\n }));\n setErrorsWithNotify((e) => ({ ...e, [id]: null }));\n },\n\n toggleFunctionVisible: (id: string) =>\n updateGraph((g) => ({\n ...g,\n functions: g.functions.map((f) =>\n f.id === id ? { ...f, visible: !f.visible } : f,\n ),\n })),\n\n removeFunction: (id: string) =>\n updateGraph((g) => ({\n ...g,\n functions: g.functions.filter((f) => f.id !== id),\n })),\n\n // setParameter does NOT push undo — would flood the stack (slider drag)\n setParameter: (name: string, value: number) => {\n const next = {\n ...graphRef.current,\n parameters: graphRef.current.parameters.map((p) =>\n p.name === name ? { ...p, value } : p,\n ),\n };\n graphRef.current = next;\n forceUpdate((n) => n + 1);\n propsRef.current.onGraphChange?.(next);\n },\n\n setParameterRange: (name: string, min: number, max: number, step: number) =>\n updateGraph((g) => ({\n ...g,\n parameters: g.parameters.map((p) =>\n p.name === name\n ? { ...p, min, max, step, value: Math.min(max, Math.max(min, p.value)) }\n : p,\n ),\n })),\n\n removeParameter: (name: string) =>\n updateGraph((g) => ({\n ...g,\n parameters: g.parameters.filter((p) => p.name !== name),\n })),\n\n getGraph: () => graphRef.current,\n getErrors: () => errors,\n }),\n // deps: updateGraph stable; errors changes when function errors change; setErrorsWithNotify stable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [updateGraph, errors, setErrorsWithNotify],\n );\n\n // Notify Host of initial graph on mount (so AlgebraView renders correctly for re-edit)\n useEffect(() => {\n if (!initialGraphNotifiedRef.current) {\n initialGraphNotifiedRef.current = true;\n propsRef.current.onGraphChange?.(graphRef.current);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const graph = graphRef.current;\n const hasContent = graph.functions.length > 0;\n\n const handleInsert = () => {\n const g = graphRef.current;\n if (g.functions.length === 0) return;\n const jsonState = stringifySerializedGraph(g);\n renderGraph2dSvgFromState(jsonState)\n .then((svg) => propsRef.current.onInsert(jsonState, svg))\n .catch((err) => console.error('Graph2D insert render failed:', err));\n };\n\n const { isMobile, isDark, withLeftPanel } = props;\n const wrapperStyle: CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Đồ thị 2D\"\n data-testid=\"graph-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : 'h-[540px] max-h-[85vh] w-[640px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-orange-500 to-amber-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={props.onOpenDrawer}\n aria-label=\"Mở bảng đại số\"\n data-testid=\"graph-drawer-toggle\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 21 V3\" />\n <path d=\"M3 21 H21\" />\n <path d=\"M5 19 C8 5, 14 5, 19 17\" />\n </svg>\n Đồ thị 2D\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!hasContent}\n data-testid=\"graph-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button\n onClick={props.onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n <div className=\"min-h-0 flex-1\">\n <MiniBoard\n graph={graph}\n activeTool={tool}\n isDark={isDark}\n onBoardEvent={onBoardEvent}\n />\n </div>\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Nhập biểu thức trong bảng đại số bên trái.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={props.onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!hasContent}\n data-testid=\"graph-insert-btn\"\n className=\"rounded bg-orange-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-orange-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n );\n});\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { GraphLeftPanel } from './editor/LeftPanel';\nimport {\n GraphEditorPanel,\n type GraphEditorPanelHandle,\n type GraphState,\n} from './editor/EditorPanel';\nimport { insertStampImage } from '../shared/insertImage';\nimport {\n parseSerializedGraph,\n EMPTY_GRAPH,\n type SerializedGraph,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { isGraph2DCustomData, type Graph2DCustomData } from './types';\n\n// ============== Host component ==============\n\nconst INITIAL_GRAPH_STATE: GraphState = {\n tool: 'move',\n showAxis: true,\n showGrid: true,\n canUndo: false,\n};\n\nexport const Graph2DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Graph2DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GraphEditorPanelHandle | null>(null);\n const [graphUIState, setGraphUIState] = useState<GraphState>(INITIAL_GRAPH_STATE);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const initialState = useMemo<SerializedGraph | null>(() => {\n if (!editingElement) return null;\n if (!isGraph2DCustomData(editingElement.customData)) return null;\n return parseSerializedGraph(editingElement.customData.jsonState);\n }, [editingElement]);\n\n // State lifted from EditorPanel so LeftPanel/AlgebraView renders current graph + errors\n const [graphSnapshot, setGraphSnapshot] = useState<SerializedGraph>(\n initialState ?? EMPTY_GRAPH,\n );\n const [errorsSnapshot, setErrorsSnapshot] = useState<Record<string, string | null>>({});\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (width, height): Graph2DCustomData => ({\n kind: 'graph2d',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Graph2D insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <GraphLeftPanel\n activeTool={graphUIState.tool}\n onToolChange={(t) => panelRef.current?.setTool(t)}\n showAxis={graphUIState.showAxis}\n showGrid={graphUIState.showGrid}\n onShowAxisChange={(b) => panelRef.current?.setShowAxis(b)}\n onShowGridChange={(b) => panelRef.current?.setShowGrid(b)}\n onResetView={() => panelRef.current?.resetView()}\n onUndo={() => panelRef.current?.undo()}\n canUndo={graphUIState.canUndo}\n onClose={onClose}\n isDark={isDark}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n graph={graphSnapshot}\n errors={errorsSnapshot}\n onAddFunctionDraft={() => {\n const result = panelRef.current?.addFunction('x');\n if (result && !result.ok) console.warn('addFunction failed:', result.error);\n }}\n onCommitFunctionExpr={(id, expr) =>\n panelRef.current?.commitFunctionExpression(id, expr)\n }\n onToggleFunctionVisible={(id) => panelRef.current?.toggleFunctionVisible(id)}\n onRemoveFunction={(id) => panelRef.current?.removeFunction(id)}\n onParameterChange={(name, v) => panelRef.current?.setParameter(name, v)}\n onParameterRangeChange={(name, min, max, step) =>\n panelRef.current?.setParameterRange(name, min, max, step)\n }\n onRemoveParameter={(name) => panelRef.current?.removeParameter(name)}\n />\n <GraphEditorPanel\n ref={panelRef}\n initialState={initialState}\n onInsert={handleInsert}\n onClose={onClose}\n onStateChange={setGraphUIState}\n onGraphChange={setGraphSnapshot}\n onErrorsChange={setErrorsSnapshot}\n withLeftPanel={!isMobile}\n isDark={isDark}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n />\n </>\n );\n },\n);\n","'use client';\n\n// Client-only wrapper around Excalidraw that lets us reach for static helpers\n// like `MainMenu.DefaultItems.*`. Whiteboard dynamic-imports this\n// file so SSR never evaluates @excalidraw/excalidraw, while inside this file we\n// can use plain static imports (the entire module loads on the client).\n\nimport React from 'react';\nimport {\n Excalidraw,\n MainMenu,\n Footer,\n WelcomeScreen,\n} from '@excalidraw/excalidraw';\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExcalidrawProps = any;\n\nexport function ExcalidrawWithMenus(props: ExcalidrawProps) {\n const { children, ...rest } = props;\n return (\n <Excalidraw {...rest}>\n {/* Replace default menu with curated items — no socials/help/branding */}\n <MainMenu>\n <MainMenu.DefaultItems.LoadScene />\n <MainMenu.DefaultItems.SaveAsImage />\n <MainMenu.DefaultItems.ClearCanvas />\n <MainMenu.DefaultItems.ToggleTheme />\n </MainMenu>\n {/* Footer slot with no content suppresses default \"Made with Excalidraw\" link */}\n <Footer>\n <span />\n </Footer>\n {/* WelcomeScreen slot (empty) prevents the default Excalidraw welcome panel\n * (which includes the Excalidraw logo and social links) from appearing. */}\n <WelcomeScreen>\n <span />\n </WelcomeScreen>\n {children}\n </Excalidraw>\n );\n}\n","import type { AppState } from '@excalidraw/excalidraw/types';\nimport type { SyncableAppState } from './types';\n\nexport function pickSyncableAppState(s: AppState): SyncableAppState {\n return {\n viewBackgroundColor: s.viewBackgroundColor,\n zoom: s.zoom,\n scrollX: s.scrollX,\n scrollY: s.scrollY,\n gridSize: s.gridSize ?? null,\n theme: s.theme,\n };\n}\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport { renderGeometrySvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport {\n isGeometryCustomData,\n type GeometryCustomData,\n} from './types';\n\nexport { isGeometryCustomData };\nexport type { GeometryCustomData };\n\nconst GeometryStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.GeometryStampHost })),\n);\n\nconst GeometryIcon: ReactNode = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport const geometryStamp: StampType = {\n kind: 'geometry',\n shortcutKey: 'g',\n toolbarLabel: 'G',\n toolbarTitle: 'Chèn hình học (G)',\n toolbarIcon: GeometryIcon,\n toolbarTestId: 'stamp-toolbar-geometry',\n matchesCustomData: isGeometryCustomData,\n async renderSvgFromCustomData(data) {\n if (!isGeometryCustomData(data)) {\n throw new Error('geometryStamp.renderSvgFromCustomData: customData không phải geometry');\n }\n return renderGeometrySvgFromState(data.jsonState);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as GeometryCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGeometryCustomData(data)) return null;\n const svgString = await renderGeometrySvgFromState(data.jsonState);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL = 'data:image/svg+xml;base64,' + (\n typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64')\n );\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: GeometryStampHost,\n};\n","'use client';\n\nimport { lazy } from 'react';\nimport { renderLatexToSvg } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport { isLatexCustomData, type LatexCustomData } from './types';\n\nexport { isLatexCustomData };\nexport type { LatexCustomData };\n\nconst LatexStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.LatexStampHost })),\n);\n\nconst LatexIcon = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M17 5 H7 L13 12 L7 19 H17\" />\n </svg>\n);\n\nexport const latexStamp: StampType = {\n kind: 'latex',\n shortcutKey: 'l',\n toolbarLabel: 'L',\n toolbarTitle: 'Chèn công thức LaTeX (L)',\n toolbarIcon: LatexIcon,\n toolbarTestId: 'stamp-toolbar-latex',\n matchesCustomData: isLatexCustomData,\n async renderSvgFromCustomData(data) {\n if (!isLatexCustomData(data)) {\n throw new Error('latexStamp.renderSvgFromCustomData: customData không phải latex');\n }\n return renderLatexToSvg(data.src, data.displayMode);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as LatexCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isLatexCustomData(data)) return null;\n const svgString = await renderLatexToSvg(data.src, data.displayMode);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL = 'data:image/svg+xml;base64,' + (\n typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64')\n );\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: LatexStampHost,\n};\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport {\n isGeometry3DCustomData,\n type Geometry3DCustomData,\n} from './serialize';\nimport { renderGeometry3DSvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\n\nexport { isGeometry3DCustomData };\nexport type { Geometry3DCustomData };\n\nconst Geometry3DStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.Geometry3DStampHost })),\n);\n\nconst Geometry3DIcon: ReactNode = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {/* Mặt trước */}\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n {/* Mặt trên */}\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n {/* Mặt phải */}\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nexport const geometry3dStamp: StampType = {\n kind: 'geometry3d',\n experimental: true,\n shortcutKey: 'd',\n toolbarLabel: 'D',\n toolbarTitle: 'Hình 3D (D)',\n toolbarIcon: Geometry3DIcon,\n toolbarTestId: 'stamp-toolbar-geometry3d',\n matchesCustomData: isGeometry3DCustomData,\n async renderSvgFromCustomData(data: unknown): Promise<string> {\n if (!isGeometry3DCustomData(data)) {\n throw new Error('geometry3dStamp.renderSvgFromCustomData: customData không phải geometry3d');\n }\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgString;\n },\n restoreFileFromCustomData: async (element): Promise<RestoredStampFile | null> => {\n const data = element.customData as Geometry3DCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGeometry3DCustomData(data)) return null;\n try {\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n const dataURL = `data:image/svg+xml;base64,${\n typeof btoa !== 'undefined'\n ? btoa(unescape(encodeURIComponent(svgString)))\n : Buffer.from(svgString).toString('base64')\n }`;\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n } catch {\n return null;\n }\n },\n Host: Geometry3DStampHost,\n};\n","'use client';\n\nimport { lazy } from 'react';\nimport { renderGraph2dSvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport { isGraph2DCustomData, type Graph2DCustomData } from './types';\n\nexport { isGraph2DCustomData };\nexport type { Graph2DCustomData };\n\nconst Graph2DStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.Graph2DStampHost })),\n);\n\nconst Graph2DIcon = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M3 21 V3\" />\n <path d=\"M3 21 H21\" />\n <path d=\"M5 19 C8 5, 14 5, 19 17\" />\n </svg>\n);\n\nexport const graph2dStamp: StampType = {\n kind: 'graph2d',\n experimental: true,\n shortcutKey: 'h',\n toolbarLabel: 'H',\n toolbarTitle: 'Chèn đồ thị 2D (H)',\n toolbarIcon: Graph2DIcon,\n toolbarTestId: 'stamp-toolbar-graph2d',\n matchesCustomData: isGraph2DCustomData,\n async renderSvgFromCustomData(data) {\n if (!isGraph2DCustomData(data)) {\n throw new Error('graph2dStamp.renderSvgFromCustomData: customData không phải graph2d');\n }\n return renderGraph2dSvgFromState(data.jsonState);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as Graph2DCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGraph2DCustomData(data)) return null;\n const svgString = await renderGraph2dSvgFromState(data.jsonState);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL =\n 'data:image/svg+xml;base64,' +\n (typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64'));\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: Graph2DStampHost,\n};\n","import { geometryStamp } from '../geometry-2d';\nimport { latexStamp } from '../latex';\nimport { geometry3dStamp } from '../geometry-3d';\nimport { graph2dStamp } from '../graph-2d';\nimport type { StampType } from './types';\n\nexport { geometryStamp, type GeometryCustomData, isGeometryCustomData } from '../geometry-2d';\nexport { latexStamp, type LatexCustomData, isLatexCustomData } from '../latex';\nexport {\n geometry3dStamp,\n type Geometry3DCustomData,\n isGeometry3DCustomData,\n} from '../geometry-3d';\nexport { graph2dStamp, type Graph2DCustomData, isGraph2DCustomData } from '../graph-2d';\nexport type { StampType, BaseStampCustomData } from './types';\n\n/** Stamp ổn định, sẵn sàng production. */\nexport const STABLE_STAMPS: ReadonlyArray<StampType> = Object.freeze([\n geometryStamp,\n latexStamp,\n]);\n\n/** Stamp experimental — chưa ổn định cho production. Consumer phải opt-in. */\nexport const EXPERIMENTAL_STAMPS: ReadonlyArray<StampType> = Object.freeze([\n geometry3dStamp,\n graph2dStamp,\n]);\n\n/** Tất cả stamp (stable + experimental). Dùng khi consumer muốn full feature. */\nexport const ALL_STAMPS: ReadonlyArray<StampType> = Object.freeze([\n ...STABLE_STAMPS,\n ...EXPERIMENTAL_STAMPS,\n]);\n\n/**\n * Set stamp mặc định cho Whiteboard = ALL_STAMPS (bật tất cả tool).\n * Consumer muốn ẩn experimental: `<Whiteboard stamps={STABLE_STAMPS} />`.\n *\n * Để thêm 1 stamp mới (vd chart):\n * 1. Tạo `src/stamps/chart/index.tsx` export `chartStamp: StampType`.\n * 2. Import + add vào STABLE_STAMPS (production-ready) hoặc\n * EXPERIMENTAL_STAMPS (chưa ổn định) ở file này.\n * 3. Re-export `chartStamp` từ `src/stamps/index.ts` + `src/index.ts`.\n */\nexport const DEFAULT_STAMPS: ReadonlyArray<StampType> = ALL_STAMPS;\n\n/** Tìm stamp tương ứng với customData của element. null nếu không match. */\nexport function findStampForCustomData(\n data: unknown,\n stamps: ReadonlyArray<StampType> = DEFAULT_STAMPS,\n): StampType | null {\n for (const s of stamps) {\n if (s.matchesCustomData(data)) return s;\n }\n return null;\n}\n\n/** isMathStamp version dựa trên registry. */\nexport function isStampElement<T extends { customData?: unknown }>(\n element: T,\n stamps: ReadonlyArray<StampType> = DEFAULT_STAMPS,\n): boolean {\n return findStampForCustomData(element.customData, stamps) !== null;\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DEFAULT_STAMPS } from './registry';\nimport type { StampType } from './types';\n\ninterface Props {\n /** Bật/tắt theo role. Khi disabled → không mount portal. */\n enabled: boolean;\n /** Kind stamp đang active, hoặc null nếu không có stamp nào mở. */\n activeStampKind: string | null;\n /** Toggle stamp theo kind. */\n onToggle: (kind: string) => void;\n /** Danh sách stamp đăng ký. Mặc định DEFAULT_STAMPS. */\n stamps?: ReadonlyArray<StampType>;\n}\n\nconst MENU_WRAPPER_ID = 'stamp-menu-portal-wrapper';\n/**\n * Excalidraw 0.18 áp dụng class `App-toolbar__extra-tools-dropdown` lên\n * popover wrapper của More tools cho cả desktop lẫn mobile. Mobile có\n * thêm modifier `dropdown-menu--mobile`. Selector này cover cả hai mode.\n */\nconst POPOVER_SELECTOR =\n '.App-toolbar__extra-tools-dropdown .dropdown-menu-container';\n\n/**\n * Inject stamp buttons vào popover \"More tools\" của Excalidraw.\n *\n * v0.7.0: thay vì inject inline vào main toolbar (desktop) hoặc dropdown\n * riêng cho mobile, ta chỉ inject vào dropdown-menu-container bên trong\n * popover của Excalidraw. Selector cover cả desktop lẫn mobile vì hai\n * mode dùng cùng cấu trúc DOM (DropdownMenu.Content).\n *\n * Popover mount/unmount theo trigger click → MutationObserver dò DOM,\n * mount lại wrapper khi cần.\n */\nexport function ToolbarInjector({\n enabled,\n activeStampKind,\n onToggle,\n stamps = DEFAULT_STAMPS,\n}: Props) {\n const [menuMount, setMenuMount] = useState<HTMLElement | null>(null);\n const menuMountRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!enabled) {\n if (menuMountRef.current !== null) {\n menuMountRef.current = null;\n setMenuMount(null);\n }\n document.getElementById(MENU_WRAPPER_ID)?.remove();\n return;\n }\n\n let cancelled = false;\n let observer: MutationObserver | null = null;\n let rafId: number | null = null;\n let observedRoot: Element | null = null;\n\n const apply = (next: HTMLElement | null) => {\n if (cancelled || menuMountRef.current === next) return;\n menuMountRef.current = next;\n queueMicrotask(() => {\n if (!cancelled) setMenuMount(next);\n });\n };\n\n const findMenu = () => {\n if (cancelled) return;\n const container = document.querySelector<HTMLElement>(POPOVER_SELECTOR);\n if (!container) {\n apply(null);\n return;\n }\n let wrapper = container.querySelector<HTMLDivElement>('#' + MENU_WRAPPER_ID);\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.id = MENU_WRAPPER_ID;\n wrapper.setAttribute('data-stamp-menu', 'true');\n wrapper.setAttribute('data-stamp-area', 'true');\n wrapper.style.display = 'contents';\n container.insertBefore(wrapper, container.firstChild);\n }\n apply(wrapper);\n };\n\n /**\n * Scope observer xuống `.excalidraw` để giảm tần suất callback trigger\n * (mutation ở các node ngoài Excalidraw không liên quan tới popover).\n * Nếu `.excalidraw` chưa mount → tạm observe `document.body` để bắt\n * lúc nó xuất hiện, rồi switch sang root nhỏ hơn.\n */\n const attachObserver = () => {\n if (cancelled) return;\n const excalidraw = document.querySelector<HTMLElement>('.excalidraw');\n const nextRoot: Element = excalidraw ?? document.body;\n if (observedRoot === nextRoot) return;\n observer?.disconnect();\n observedRoot = nextRoot;\n observer = new MutationObserver(onMutation);\n observer.observe(nextRoot, { childList: true, subtree: true });\n };\n\n /**\n * rAF debounce: gộp nhiều mutation cùng tick thành 1 lần xử lý.\n * Excalidraw có thể trigger hàng chục mutation khi mở/đóng popover —\n * mỗi pass chỉ tốn 1 lần querySelector + DOM insert.\n */\n const onMutation = () => {\n if (rafId != null) return;\n rafId = requestAnimationFrame(() => {\n rafId = null;\n if (cancelled) return;\n // Nếu đang observe body mà giờ `.excalidraw` đã mount → switch sang nó.\n if (observedRoot !== document.querySelector('.excalidraw')) {\n attachObserver();\n }\n findMenu();\n });\n };\n\n findMenu();\n attachObserver();\n\n return () => {\n cancelled = true;\n if (rafId != null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n observer?.disconnect();\n observer = null;\n observedRoot = null;\n document.getElementById(MENU_WRAPPER_ID)?.remove();\n };\n }, [enabled]);\n\n if (!enabled || !menuMount) return null;\n\n const closePopover = () => {\n const trigger = document.querySelector<HTMLButtonElement>(\n '.App-toolbar__extra-tools-trigger',\n );\n trigger?.click();\n };\n\n return createPortal(\n <>\n {stamps.map((stamp) => {\n const { displayLabel, shortcut } = splitTitleAndShortcut(\n stamp.toolbarTitle,\n stamp.toolbarLabel,\n );\n return (\n <StampMenuItem\n key={stamp.kind}\n icon={stamp.toolbarIcon}\n label={displayLabel}\n ariaLabel={stamp.toolbarTitle}\n shortcut={shortcut}\n active={activeStampKind === stamp.kind}\n onClick={() => {\n onToggle(stamp.kind);\n closePopover();\n }}\n dataTestId={stamp.toolbarTestId}\n />\n );\n })}\n <div\n aria-hidden=\"true\"\n style={{\n height: 1,\n background: 'var(--default-border-color, rgba(0,0,0,0.08))',\n margin: '6px 4px',\n }}\n />\n </>,\n menuMount,\n );\n}\n\n/**\n * Tách \"(X)\" cuối toolbarTitle thành shortcut hiển thị riêng ở góc phải\n * (giống các tool gốc Excalidraw: Frame F, Laser K, ...). Nếu title không\n * có pattern \"(...)\", fallback dùng toolbarLabel.\n */\nfunction splitTitleAndShortcut(\n title: string,\n fallbackShortcut: string,\n): { displayLabel: string; shortcut: string } {\n const match = title.match(/^(.*?)\\s*\\(([^()]+)\\)\\s*$/);\n if (match) {\n return { displayLabel: match[1].trim(), shortcut: match[2].trim() };\n }\n return { displayLabel: title, shortcut: fallbackShortcut };\n}\n\ninterface StampMenuItemProps {\n icon: React.ReactNode;\n label: string;\n ariaLabel: string;\n shortcut: string;\n active: boolean;\n onClick: () => void;\n dataTestId?: string;\n}\n\nfunction StampMenuItem({\n icon,\n label,\n ariaLabel,\n shortcut,\n active,\n onClick,\n dataTestId,\n}: StampMenuItemProps) {\n const className = [\n 'dropdown-menu-item',\n 'dropdown-menu-item-base',\n active ? 'dropdown-menu-item--selected' : '',\n ]\n .filter(Boolean)\n .join(' ');\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={ariaLabel}\n aria-label={ariaLabel}\n aria-pressed={active}\n data-testid={dataTestId}\n className={className}\n >\n <div className=\"dropdown-menu-item__icon\" aria-hidden=\"true\">\n {icon}\n </div>\n <div className=\"dropdown-menu-item__text\">{label}</div>\n {shortcut ? (\n <div className=\"dropdown-menu-item__shortcut\">{shortcut}</div>\n ) : null}\n </button>\n );\n}\n","import { useEffect } from 'react';\nimport { DEFAULT_STAMPS } from './registry';\nimport type { StampType } from './types';\n\ninterface Options {\n enabled: boolean;\n /** Toggle stamp theo kind khi user bấm shortcut tương ứng. */\n onToggle: (kind: string) => void;\n /** Registry. Mặc định DEFAULT_STAMPS. */\n stamps?: ReadonlyArray<StampType>;\n}\n\nfunction isEditableTarget(t: EventTarget | null): boolean {\n if (!t || !(t instanceof HTMLElement)) return false;\n if (t.isContentEditable) return true;\n const tag = t.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n}\n\n/**\n * Bind keyboard shortcut cho mỗi stamp trong registry. Capture phase +\n * stopPropagation để chặn trước Excalidraw's bubble-phase handlers (Excalidraw\n * dùng `L` cho Line tool, nếu không chặn → bấm L lại chuyển tool thay vì\n * toggle LaTeX panel).\n */\nexport function useShortcuts({\n enabled,\n onToggle,\n stamps = DEFAULT_STAMPS,\n}: Options): void {\n useEffect(() => {\n if (!enabled) return;\n const keyToKind = new Map<string, string>();\n for (const s of stamps) keyToKind.set(s.shortcutKey, s.kind);\n\n const handler = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isEditableTarget(e.target)) return;\n const key = e.key.toLowerCase();\n const kind = keyToKind.get(key);\n if (!kind) return;\n e.preventDefault();\n e.stopPropagation();\n onToggle(kind);\n };\n window.addEventListener('keydown', handler, { capture: true });\n return () => window.removeEventListener('keydown', handler, { capture: true });\n }, [enabled, onToggle, stamps]);\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface Props {\n enabled: boolean;\n onPick: (file: File) => void;\n}\n\nconst WRAPPER_ID = 'pdf-import-portal-wrapper';\nconst POPOVER_SELECTOR =\n '.App-toolbar__extra-tools-dropdown .dropdown-menu-container';\n\n/**\n * Button \"Chèn PDF\" portal vào More tools dropdown của Excalidraw, ngay\n * dưới các stamp buttons. Click → mở native file picker (hidden input).\n *\n * Tách riêng khỏi ToolbarInjector vì PDF không phải stamp (không có Host,\n * không re-edit). Cùng pattern observer như ToolbarInjector để bắt\n * popover mount/unmount.\n */\nexport function PdfImporterButton({ enabled, onPick }: Props) {\n const [mount, setMount] = useState<HTMLElement | null>(null);\n const mountRef = useRef<HTMLElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n if (!enabled) {\n mountRef.current = null;\n setMount(null);\n document.getElementById(WRAPPER_ID)?.remove();\n return;\n }\n\n let cancelled = false;\n let observer: MutationObserver | null = null;\n let rafId: number | null = null;\n let observedRoot: Element | null = null;\n\n const apply = (next: HTMLElement | null) => {\n if (cancelled || mountRef.current === next) return;\n mountRef.current = next;\n queueMicrotask(() => {\n if (!cancelled) setMount(next);\n });\n };\n\n const findMenu = () => {\n if (cancelled) return;\n const container = document.querySelector<HTMLElement>(POPOVER_SELECTOR);\n if (!container) {\n apply(null);\n return;\n }\n let wrapper = container.querySelector<HTMLDivElement>('#' + WRAPPER_ID);\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.id = WRAPPER_ID;\n wrapper.setAttribute('data-pdf-import', 'true');\n wrapper.style.display = 'contents';\n // Append cuối để PDF button nằm sau stamps + divider.\n container.appendChild(wrapper);\n }\n apply(wrapper);\n };\n\n const attachObserver = () => {\n if (cancelled) return;\n const excalidraw = document.querySelector<HTMLElement>('.excalidraw');\n const nextRoot: Element = excalidraw ?? document.body;\n if (observedRoot === nextRoot) return;\n observer?.disconnect();\n observedRoot = nextRoot;\n observer = new MutationObserver(onMutation);\n observer.observe(nextRoot, { childList: true, subtree: true });\n };\n\n const onMutation = () => {\n if (rafId != null) return;\n rafId = requestAnimationFrame(() => {\n rafId = null;\n if (cancelled) return;\n if (observedRoot !== document.querySelector('.excalidraw')) {\n attachObserver();\n }\n findMenu();\n });\n };\n\n findMenu();\n attachObserver();\n\n return () => {\n cancelled = true;\n if (rafId != null) cancelAnimationFrame(rafId);\n observer?.disconnect();\n document.getElementById(WRAPPER_ID)?.remove();\n };\n }, [enabled]);\n\n const closePopover = () => {\n const trigger = document.querySelector<HTMLButtonElement>(\n '.App-toolbar__extra-tools-trigger',\n );\n trigger?.click();\n };\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) onPick(file);\n // Reset để chọn lại cùng file lần sau vẫn fire onChange.\n e.target.value = '';\n closePopover();\n };\n\n if (!enabled || !mount) {\n // Vẫn render hidden input để parent có thể gọi qua ref nếu muốn — nhưng\n // không cần. Giữ null khi chưa mount để tránh DOM thừa.\n return (\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"application/pdf,.pdf\"\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n );\n }\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"application/pdf,.pdf\"\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n {createPortal(\n <button\n type=\"button\"\n onClick={handleClick}\n title=\"Chèn PDF (P)\"\n aria-label=\"Chèn PDF\"\n data-testid=\"pdf-import-button\"\n className=\"dropdown-menu-item dropdown-menu-item-base\"\n >\n <div className=\"dropdown-menu-item__icon\" aria-hidden=\"true\">\n <PdfIcon />\n </div>\n <div className=\"dropdown-menu-item__text\">Chèn PDF</div>\n <div className=\"dropdown-menu-item__shortcut\">P</div>\n </button>,\n mount,\n )}\n </>\n );\n}\n\nfunction PdfIcon() {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z\" />\n <path d=\"M14 3v5h5\" />\n <text x=\"7.5\" y=\"17\" fontSize=\"6\" fontFamily=\"sans-serif\" fontWeight=\"700\" stroke=\"none\" fill=\"currentColor\">\n PDF\n </text>\n </svg>\n );\n}\n","/**\n * Parse chuỗi range trang dạng \"1,3,5-10\" → array số 1-based đã sort + dedupe.\n *\n * - Tokens cách nhau bằng dấu phẩy hoặc khoảng trắng.\n * - Token có gạch \"-\" → range inclusive (5-10 = [5,6,7,8,9,10]).\n * - Khoảng trắng quanh số bị bỏ qua.\n * - Empty / chỉ space → [].\n *\n * Throws `Error` với message tiếng Việt khi:\n * - Token không phải số / không phải range hợp lệ.\n * - Số <= 0 hoặc > totalPages.\n * - Range đảo ngược (vd \"10-5\") — coi là lỗi user thay vì auto-reverse để\n * tránh nuốt typo.\n */\nexport function parsePageRange(input: string, totalPages: number): number[] {\n if (!Number.isInteger(totalPages) || totalPages <= 0) {\n throw new Error('Số trang phải là số nguyên dương.');\n }\n const trimmed = input.trim();\n if (trimmed === '') return [];\n\n const tokens = trimmed\n .split(/[,\\s]+/)\n .map((t) => t.trim())\n .filter((t) => t.length > 0);\n\n const set = new Set<number>();\n\n for (const token of tokens) {\n if (token.includes('-')) {\n const parts = token.split('-');\n if (parts.length !== 2) {\n throw new Error(`Khoảng trang không hợp lệ: \"${token}\".`);\n }\n const start = parseStrictInt(parts[0]);\n const end = parseStrictInt(parts[1]);\n if (start === null || end === null) {\n throw new Error(`Khoảng trang không hợp lệ: \"${token}\".`);\n }\n if (start > end) {\n throw new Error(`Khoảng trang ngược: \"${token}\" (đầu > cuối).`);\n }\n if (start < 1 || end > totalPages) {\n throw new Error(\n `Khoảng trang vượt giới hạn: \"${token}\". PDF có ${totalPages} trang.`,\n );\n }\n for (let i = start; i <= end; i++) set.add(i);\n } else {\n const n = parseStrictInt(token);\n if (n === null) {\n throw new Error(`Số trang không hợp lệ: \"${token}\".`);\n }\n if (n < 1 || n > totalPages) {\n throw new Error(\n `Số trang vượt giới hạn: ${n}. PDF có ${totalPages} trang.`,\n );\n }\n set.add(n);\n }\n }\n\n return Array.from(set).sort((a, b) => a - b);\n}\n\nfunction parseStrictInt(s: string): number | null {\n if (!/^-?\\d+$/.test(s)) return null;\n const n = Number(s);\n return Number.isInteger(n) ? n : null;\n}\n","/**\n * Rasterize PDF → PNG dataURLs cho từng trang.\n *\n * Worker config:\n * - pdfjs-dist 5.x cần `GlobalWorkerOptions.workerSrc` (URL tới worker .mjs).\n * - Mặc định trỏ CDN (jsdelivr). Consumer có thể override qua\n * `configurePdfWorker(src)` trước khi gọi rasterize lần đầu.\n * - Lý do CDN thay vì bundled worker: tsup không có cách clean để emit\n * worker chunk ra cùng dist/ với URL ổn định, và consumer (Next.js)\n * có thể self-host nếu cần offline.\n *\n * Lazy import pdfjs-dist để không phình bundle khi user không dùng PDF.\n */\nimport type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist';\n\nlet workerSrcOverride: string | null = null;\nlet pdfjsCache: typeof import('pdfjs-dist') | null = null;\n\n/**\n * Override workerSrc trước khi rasterize. Gọi từ consumer khi cần self-host\n * worker file (vd offline mode, CSP cấm CDN).\n *\n * Mặc định nếu không gọi: dùng CDN jsdelivr theo version pdfjs-dist đã cài.\n */\nexport function configurePdfWorker(workerSrc: string): void {\n workerSrcOverride = workerSrc;\n if (pdfjsCache) {\n pdfjsCache.GlobalWorkerOptions.workerSrc = workerSrc;\n }\n}\n\nasync function loadPdfjs(): Promise<typeof import('pdfjs-dist')> {\n if (pdfjsCache) return pdfjsCache;\n const mod = await import('pdfjs-dist');\n const workerSrc =\n workerSrcOverride ??\n `https://cdn.jsdelivr.net/npm/pdfjs-dist@${mod.version}/build/pdf.worker.min.mjs`;\n mod.GlobalWorkerOptions.workerSrc = workerSrc;\n pdfjsCache = mod;\n return mod;\n}\n\nexport interface RasterizedPage {\n pageNumber: number;\n dataURL: string;\n width: number;\n height: number;\n mimeType: 'image/png';\n}\n\nexport interface RasterizeOptions {\n /** Scale render. Mặc định 2 (HiDPI sharp). */\n scale?: number;\n /** Danh sách trang 1-based. Mặc định: tất cả. */\n pages?: number[];\n /** Callback progress sau mỗi page. */\n onProgress?: (done: number, total: number) => void;\n /** AbortSignal để cancel giữa chừng. */\n signal?: AbortSignal;\n}\n\n/**\n * Load PDF chỉ để lấy `numPages` (vd hiển thị tổng số trang trên dialog).\n * Caller phải tự đóng document bằng `closePdfDocument(doc)` khi xong.\n */\nexport async function loadPdfDocument(source: File | Blob | ArrayBuffer): Promise<PDFDocumentProxy> {\n const pdfjs = await loadPdfjs();\n const data = source instanceof ArrayBuffer ? source : await source.arrayBuffer();\n const task = pdfjs.getDocument({ data: new Uint8Array(data) });\n return task.promise;\n}\n\nexport async function closePdfDocument(doc: PDFDocumentProxy): Promise<void> {\n try {\n await doc.cleanup();\n await doc.destroy();\n } catch {\n /* ignore — best-effort cleanup */\n }\n}\n\n/**\n * Render danh sách trang ra PNG dataURL.\n *\n * Lưu ý:\n * - Sử dụng `OffscreenCanvas` nếu có (browser hiện đại) để không touch DOM,\n * fallback `<canvas>` document.createElement.\n * - Mỗi page render xong sẽ release canvas (cho GC sớm với PDF nhiều trang).\n */\nexport async function rasterizePdf(\n doc: PDFDocumentProxy,\n options: RasterizeOptions = {},\n): Promise<RasterizedPage[]> {\n const scale = options.scale ?? 2;\n const total = doc.numPages;\n const pages = options.pages ?? Array.from({ length: total }, (_, i) => i + 1);\n const signal = options.signal;\n\n const result: RasterizedPage[] = [];\n for (let i = 0; i < pages.length; i++) {\n if (signal?.aborted) {\n throw new DOMException('Rasterize PDF bị huỷ.', 'AbortError');\n }\n const pageNum = pages[i];\n const page = await doc.getPage(pageNum);\n try {\n const rendered = await renderPageToPng(page, scale);\n result.push({ pageNumber: pageNum, mimeType: 'image/png', ...rendered });\n } finally {\n page.cleanup();\n }\n options.onProgress?.(i + 1, pages.length);\n }\n return result;\n}\n\nasync function renderPageToPng(\n page: PDFPageProxy,\n scale: number,\n): Promise<{ dataURL: string; width: number; height: number }> {\n const viewport = page.getViewport({ scale });\n const width = Math.ceil(viewport.width);\n const height = Math.ceil(viewport.height);\n\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Không lấy được 2D context của canvas.');\n await page.render({ canvasContext: ctx, viewport, canvas }).promise;\n const dataURL = canvas.toDataURL('image/png');\n return { dataURL, width, height };\n}\n\n/**\n * Render thumbnail nhẹ cho 1 trang — JPEG 0.7 quality + scale nhỏ (mặc định\n * 0.3). Tối ưu cho preview grid: ~10KB/thumb thay vì ~500KB PNG full scale.\n */\nexport async function renderPageThumbnail(\n page: PDFPageProxy,\n scale = 0.3,\n quality = 0.7,\n): Promise<{ dataURL: string; width: number; height: number }> {\n const viewport = page.getViewport({ scale });\n const width = Math.ceil(viewport.width);\n const height = Math.ceil(viewport.height);\n\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Không lấy được 2D context của canvas.');\n // Nền trắng vì JPEG không support alpha.\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, width, height);\n await page.render({ canvasContext: ctx, viewport, canvas }).promise;\n const dataURL = canvas.toDataURL('image/jpeg', quality);\n return { dataURL, width, height };\n}\n\n/**\n * Render thumbnails cho tất cả trang với concurrency. Callback `onEach` được\n * gọi sau mỗi trang xong (theo thứ tự completion, không phải pageNumber) để\n * UI có thể progressive update. Tôn trọng `signal` để cancel sớm.\n */\nexport async function renderAllThumbnails(\n doc: PDFDocumentProxy,\n onEach: (pageNumber: number, dataURL: string, width: number, height: number) => void,\n options: { scale?: number; quality?: number; concurrency?: number; signal?: AbortSignal } = {},\n): Promise<void> {\n const total = doc.numPages;\n const scale = options.scale ?? 0.3;\n const quality = options.quality ?? 0.7;\n const concurrency = Math.max(1, options.concurrency ?? 3);\n const signal = options.signal;\n let next = 1;\n\n async function worker() {\n while (true) {\n if (signal?.aborted) return;\n const pageNum = next++;\n if (pageNum > total) return;\n const page = await doc.getPage(pageNum);\n try {\n if (signal?.aborted) return;\n const { dataURL, width, height } = await renderPageThumbnail(page, scale, quality);\n if (signal?.aborted) return;\n onEach(pageNum, dataURL, width, height);\n } finally {\n page.cleanup();\n }\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(concurrency, total) }, () => worker()),\n );\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport { parsePageRange } from './parseRange';\nimport { renderAllThumbnails } from './rasterize';\n\ninterface Props {\n doc: PDFDocumentProxy;\n fileName: string;\n onConfirm: (pages: number[]) => void;\n onCancel: () => void;\n}\n\ninterface ThumbInfo {\n dataURL: string;\n width: number;\n height: number;\n}\n\n/**\n * Set<number> → chuỗi range compact dạng \"1-3,5,7-9\".\n * Dùng cho hiển thị + sync ngược về text input khi user click thumbnails.\n */\nfunction serializeSelection(pages: number[]): string {\n if (pages.length === 0) return '';\n const sorted = [...pages].sort((a, b) => a - b);\n const groups: string[] = [];\n let start = sorted[0];\n let prev = start;\n for (let i = 1; i < sorted.length; i++) {\n const n = sorted[i];\n if (n === prev + 1) {\n prev = n;\n } else {\n groups.push(start === prev ? `${start}` : `${start}-${prev}`);\n start = n;\n prev = n;\n }\n }\n groups.push(start === prev ? `${start}` : `${start}-${prev}`);\n return groups.join(',');\n}\n\n/**\n * Modal chọn trang PDF với thumbnail grid.\n *\n * Hai chiều sync:\n * - Gõ text input → parse → update selectedSet → highlight thumbnails.\n * - Click thumbnail → toggle pageNum trong selectedSet → re-serialize text.\n *\n * Source of truth: `selectedSet`. Text input là derived view (user-editable).\n * Khi user đang gõ (focus) → giữ raw `inputValue`, không overwrite. Chỉ\n * re-derive text khi click thumbnail HOẶC input mất focus với value valid.\n */\nexport function PageRangeDialog({ doc, fileName, onConfirm, onCancel }: Props) {\n const totalPages = doc.numPages;\n const defaultPages = useMemo(\n () => Array.from({ length: totalPages }, (_, i) => i + 1),\n [totalPages],\n );\n\n const [selectedSet, setSelectedSet] = useState<Set<number>>(\n () => new Set(defaultPages),\n );\n const [inputValue, setInputValue] = useState(serializeSelection(defaultPages));\n const [inputError, setInputError] = useState<string | null>(null);\n const [thumbs, setThumbs] = useState<Record<number, ThumbInfo>>({});\n const [thumbProgress, setThumbProgress] = useState(0);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // ---- Render thumbnails khi mount ----\n useEffect(() => {\n const ctrl = new AbortController();\n void renderAllThumbnails(\n doc,\n (pageNum, dataURL, width, height) => {\n setThumbs((prev) => ({ ...prev, [pageNum]: { dataURL, width, height } }));\n setThumbProgress((prev) => prev + 1);\n },\n { scale: 0.3, quality: 0.7, concurrency: 3, signal: ctrl.signal },\n ).catch((err) => {\n if (ctrl.signal.aborted) return;\n console.warn('[PageRangeDialog] render thumbnails lỗi:', err);\n });\n return () => ctrl.abort();\n }, [doc]);\n\n // ---- Esc đóng dialog ----\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n onCancel();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [onCancel]);\n\n // ---- Text input handlers ----\n const handleInputChange = (next: string) => {\n setInputValue(next);\n try {\n const pages = parsePageRange(next, totalPages);\n setInputError(null);\n setSelectedSet(new Set(pages));\n } catch (e) {\n setInputError((e as Error).message);\n }\n };\n\n // ---- Thumbnail click handler ----\n const toggleThumb = (pageNum: number) => {\n setSelectedSet((prev) => {\n const next = new Set(prev);\n if (next.has(pageNum)) next.delete(pageNum);\n else next.add(pageNum);\n const serialized = serializeSelection([...next]);\n setInputValue(serialized);\n setInputError(null);\n return next;\n });\n };\n\n // ---- Quick select helpers ----\n const selectAll = () => {\n setSelectedSet(new Set(defaultPages));\n setInputValue(serializeSelection(defaultPages));\n setInputError(null);\n };\n\n const clearAll = () => {\n setSelectedSet(new Set());\n setInputValue('');\n setInputError(null);\n };\n\n const canSubmit = inputError === null && selectedSet.size > 0;\n const sortedSelected = useMemo(\n () => [...selectedSet].sort((a, b) => a - b),\n [selectedSet],\n );\n\n const handleSubmit = () => {\n if (!canSubmit) return;\n onConfirm(sortedSelected);\n };\n\n return createPortal(\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"pdf-range-title\"\n style={{\n position: 'fixed',\n inset: 0,\n background: 'rgba(0,0,0,0.55)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10000,\n }}\n onClick={(e) => {\n if (e.target === e.currentTarget) onCancel();\n }}\n >\n <div\n style={{\n background: 'var(--popup-bg-color, #fff)',\n color: 'var(--text-primary-color, #1b1b1f)',\n borderRadius: 12,\n padding: '20px 22px',\n width: 'min(880px, 92vw)',\n maxHeight: '88vh',\n boxShadow: '0 12px 40px rgba(0,0,0,0.3)',\n fontFamily: 'inherit',\n display: 'flex',\n flexDirection: 'column',\n gap: 12,\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div>\n <h2\n id=\"pdf-range-title\"\n style={{ margin: 0, fontSize: 16, fontWeight: 600, lineHeight: 1.3 }}\n >\n Chèn PDF\n </h2>\n <p style={{ margin: '4px 0 0', fontSize: 12, opacity: 0.7 }}>\n {fileName} — {totalPages} trang\n {thumbProgress < totalPages && (\n <> · đang tải preview {thumbProgress}/{totalPages}…</>\n )}\n </p>\n </div>\n\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 10 }}>\n <div style={{ flex: 1 }}>\n <label\n style={{ display: 'block', fontSize: 12, marginBottom: 4, opacity: 0.75 }}\n >\n Trang cần chèn (vd: 1,3,5-10) — hoặc click thumbnail bên dưới\n </label>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => handleInputChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSubmit();\n }\n }}\n style={{\n width: '100%',\n boxSizing: 'border-box',\n padding: '8px 10px',\n fontSize: 14,\n borderRadius: 6,\n border: `1px solid ${inputError ? '#dc2626' : 'rgba(0,0,0,0.2)'}`,\n outline: 'none',\n background: 'var(--input-bg-color, #fff)',\n color: 'inherit',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n }}\n />\n </div>\n <div style={{ display: 'flex', gap: 6, paddingTop: 18 }}>\n <button\n type=\"button\"\n onClick={selectAll}\n style={quickBtnStyle}\n title=\"Chọn tất cả trang\"\n >\n Tất cả\n </button>\n <button\n type=\"button\"\n onClick={clearAll}\n style={quickBtnStyle}\n title=\"Bỏ chọn tất cả\"\n >\n Bỏ hết\n </button>\n </div>\n </div>\n\n <div style={{ minHeight: 18, fontSize: 12 }} data-testid=\"pdf-range-status\">\n {inputError ? (\n <span style={{ color: '#dc2626' }}>{inputError}</span>\n ) : (\n <span style={{ opacity: 0.75 }}>\n Đã chọn <strong>{selectedSet.size}</strong> / {totalPages} trang\n </span>\n )}\n </div>\n\n <div\n style={{\n flex: 1,\n minHeight: 240,\n maxHeight: '60vh',\n overflow: 'auto',\n padding: 8,\n background: 'rgba(0,0,0,0.04)',\n borderRadius: 8,\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(120px, 1fr))',\n gap: 10,\n alignContent: 'start',\n }}\n >\n {Array.from({ length: totalPages }, (_, i) => i + 1).map((pageNum) => {\n const thumb = thumbs[pageNum];\n const selected = selectedSet.has(pageNum);\n return (\n <ThumbnailItem\n key={pageNum}\n pageNum={pageNum}\n thumb={thumb}\n selected={selected}\n onToggle={() => toggleThumb(pageNum)}\n />\n );\n })}\n </div>\n\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 8,\n paddingTop: 4,\n }}\n >\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n padding: '8px 14px',\n fontSize: 13,\n borderRadius: 6,\n border: '1px solid rgba(0,0,0,0.15)',\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n }}\n >\n Huỷ\n </button>\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!canSubmit}\n style={{\n padding: '8px 16px',\n fontSize: 13,\n borderRadius: 6,\n border: 'none',\n background: canSubmit ? '#4f46e5' : 'rgba(0,0,0,0.15)',\n color: '#fff',\n cursor: canSubmit ? 'pointer' : 'not-allowed',\n fontWeight: 500,\n }}\n >\n Chèn {selectedSet.size > 0 ? `${selectedSet.size} trang` : ''}\n </button>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nconst quickBtnStyle: React.CSSProperties = {\n padding: '7px 10px',\n fontSize: 12,\n borderRadius: 6,\n border: '1px solid rgba(0,0,0,0.15)',\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n};\n\ninterface ThumbProps {\n pageNum: number;\n thumb: ThumbInfo | undefined;\n selected: boolean;\n onToggle: () => void;\n}\n\nfunction ThumbnailItem({ pageNum, thumb, selected, onToggle }: ThumbProps) {\n const aspect = thumb ? thumb.width / thumb.height : 0.77; // A4 portrait default\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n aria-pressed={selected}\n aria-label={`Trang ${pageNum}${selected ? ' (đã chọn)' : ''}`}\n title={`Trang ${pageNum}`}\n style={{\n position: 'relative',\n padding: 0,\n background: '#fff',\n border: `2px solid ${selected ? '#4f46e5' : 'rgba(0,0,0,0.12)'}`,\n borderRadius: 6,\n overflow: 'hidden',\n cursor: 'pointer',\n boxShadow: selected ? '0 0 0 3px rgba(79,70,229,0.18)' : 'none',\n transition: 'border-color 80ms ease, box-shadow 80ms ease',\n }}\n >\n <div\n style={{\n width: '100%',\n aspectRatio: aspect.toString(),\n background: '#f5f5f5',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {thumb ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={thumb.dataURL}\n alt=\"\"\n style={{ width: '100%', height: '100%', display: 'block', objectFit: 'contain' }}\n draggable={false}\n />\n ) : (\n <div style={{ fontSize: 11, opacity: 0.5 }}>…</div>\n )}\n </div>\n <div\n style={{\n position: 'absolute',\n bottom: 4,\n left: 4,\n fontSize: 10,\n fontWeight: 600,\n padding: '2px 6px',\n borderRadius: 4,\n background: selected ? '#4f46e5' : 'rgba(0,0,0,0.6)',\n color: '#fff',\n }}\n >\n {pageNum}\n </div>\n {selected && (\n <div\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n top: 4,\n right: 4,\n width: 18,\n height: 18,\n borderRadius: '50%',\n background: '#4f46e5',\n color: '#fff',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n boxShadow: '0 1px 3px rgba(0,0,0,0.3)',\n }}\n >\n ✓\n </div>\n )}\n </button>\n );\n}\n","import type { ExcalidrawElement } from '../types';\nimport { closePdfDocument, loadPdfDocument, rasterizePdf, type RasterizedPage } from './rasterize';\n\n// Excalidraw imperative API — không có public type chính xác.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\n/** Khoảng cách dọc giữa các trang PDF khi xếp dọc, ở scene units. */\nconst PAGE_GAP = 24;\n\n/** Scale render mặc định (HiDPI sharp). */\nconst DEFAULT_SCALE = 2;\n\nexport interface InsertRasterizedPagesOptions {\n /** Scale dùng khi rasterize (để chia pixel → scene units). */\n scale: number;\n /** Toạ độ scene gốc cho page đầu tiên. Bỏ qua → giữa viewport. */\n origin?: { x: number; y: number };\n}\n\nexport interface InsertRasterizedPagesResult {\n insertedElementIds: string[];\n fileIds: string[];\n}\n\n/**\n * Chèn array `RasterizedPage` đã có sẵn vào scene. Tách ra để Whiteboard\n * có thể: load doc → hỏi user range → rasterize → insert mà không phải gọi\n * insertPdfPages (load lại từ ArrayBuffer 2 lần).\n */\nexport function insertRasterizedPagesIntoScene(\n api: ExApi,\n rendered: RasterizedPage[],\n options: InsertRasterizedPagesOptions,\n): InsertRasterizedPagesResult {\n if (!api) throw new Error('Excalidraw API chưa sẵn sàng.');\n if (rendered.length === 0) return { insertedElementIds: [], fileIds: [] };\n\n const { scale } = options;\n const filesPayload = rendered.map((p) => ({\n id: generateFileId(),\n dataURL: p.dataURL,\n mimeType: p.mimeType,\n created: Date.now(),\n }));\n api.addFiles(filesPayload);\n\n const origin = options.origin ?? getViewportCenter(api);\n const sceneSizes = rendered.map((p) => pixelsToSceneSize(p.width, p.height, scale));\n const maxSceneWidth = Math.max(...sceneSizes.map((s) => s.width));\n const baseX = origin.x - maxSceneWidth / 2;\n let cursorY = origin.y - sceneSizes[0].height / 2;\n\n const newElements = rendered.map((_, i) => {\n const { width, height } = sceneSizes[i];\n const x = baseX + (maxSceneWidth - width) / 2;\n const y = cursorY;\n cursorY = y + height + PAGE_GAP;\n return buildPdfImageElement(filesPayload[i].id, x, y, width, height);\n });\n\n const existing = api.getSceneElements() as readonly ExcalidrawElement[];\n api.updateScene({\n elements: [...existing, ...newElements],\n appState: { selectedElementIds: {}, croppingElementId: null },\n });\n\n return {\n insertedElementIds: newElements.map((e) => e.id),\n fileIds: filesPayload.map((f) => f.id),\n };\n}\n\n/**\n * Excalidraw lưu width/height theo \"scene units\". File PDF rasterize ở scale 2\n * → pixel = 2 × scene unit. Chia lại để stamp hiển thị đúng kích thước\n * gốc của trang PDF (giấy A4 ≈ 595×842 scene units ở 72 DPI).\n */\nfunction pixelsToSceneSize(pxWidth: number, pxHeight: number, scale: number) {\n return { width: pxWidth / scale, height: pxHeight / scale };\n}\n\nexport interface InsertPdfPagesOptions {\n /** Trang cần chèn (1-based). Bỏ qua → chèn tất cả. */\n pages?: number[];\n /** Scale rasterize. Mặc định 2. */\n scale?: number;\n /** Toạ độ scene gốc cho page đầu tiên. Bỏ qua → giữa viewport. */\n origin?: { x: number; y: number };\n /** Progress callback. */\n onProgress?: (done: number, total: number) => void;\n /** AbortSignal. */\n signal?: AbortSignal;\n}\n\nexport interface InsertPdfPagesResult {\n insertedElementIds: string[];\n pages: RasterizedPage[];\n}\n\n/**\n * Tạo image element cho 1 trang đã rasterize. Trả về object đủ field cho\n * Excalidraw `updateScene`. Lấy `fileId` từ caller để có thể batch addFiles\n * trước khi update elements.\n */\nfunction buildPdfImageElement(\n fileId: string,\n x: number,\n y: number,\n width: number,\n height: number,\n) {\n return {\n type: 'image' as const,\n id: 'pdf_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x,\n y,\n width,\n height,\n fileId,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\nfunction generateFileId(): string {\n return 'pdf_' + Date.now() + '_' + Math.random().toString(36).slice(2, 10);\n}\n\nfunction getViewportCenter(api: ExApi): { x: number; y: number } {\n const appState = api?.getAppState?.() ?? {\n scrollX: 0,\n scrollY: 0,\n width: 800,\n height: 600,\n zoom: { value: 1 },\n };\n const zoom = appState.zoom?.value ?? 1;\n return {\n x: appState.scrollX + (appState.width ?? 800) / 2 / zoom,\n y: appState.scrollY + (appState.height ?? 600) / 2 / zoom,\n };\n}\n\n/**\n * High-level: rasterize PDF + insert thành nhiều image element xếp dọc.\n *\n * Flow:\n * 1. loadPdfDocument(source) → PDFDocumentProxy\n * 2. rasterizePdf(doc, {pages, scale}) → RasterizedPage[]\n * 3. Tạo fileId cho từng page, gọi api.addFiles batch.\n * 4. Tính position: page 1 trung tâm viewport (hoặc origin), các page sau\n * xếp dưới, cách PAGE_GAP.\n * 5. api.updateScene({ elements: [...cũ, ...mới] })\n *\n * Không serialize PDF bytes — sau insert, các page là image element thuần,\n * không thể re-edit qua double-click (theo design quyết định).\n */\nexport async function insertPdfPages(\n api: ExApi,\n source: File | Blob | ArrayBuffer,\n options: InsertPdfPagesOptions = {},\n): Promise<InsertPdfPagesResult> {\n if (!api) throw new Error('Excalidraw API chưa sẵn sàng.');\n\n const scale = options.scale ?? DEFAULT_SCALE;\n const doc = await loadPdfDocument(source);\n let rendered: RasterizedPage[];\n try {\n rendered = await rasterizePdf(doc, {\n pages: options.pages,\n scale,\n onProgress: options.onProgress,\n signal: options.signal,\n });\n } finally {\n void closePdfDocument(doc);\n }\n\n const { insertedElementIds } = insertRasterizedPagesIntoScene(api, rendered, {\n scale,\n origin: options.origin,\n });\n return { insertedElementIds, pages: rendered };\n}\n","import { useCallback, useRef } from 'react';\nimport { findStampForCustomData } from './registry';\nimport type { StampType } from './types';\n\nconst DOUBLE_CLICK_MS = 400;\n\ninterface Opts {\n enabled: boolean;\n stamps: ReadonlyArray<StampType>;\n onOpen: (\n kind: string,\n editingElement: { id: string; customData: unknown },\n ) => void;\n}\n\n/**\n * Trả về handler cho Excalidraw `onPointerDown`. Phát hiện double-click vào\n * image element thuộc một stamp đã đăng ký → gọi `onOpen(kind, element)`.\n */\nexport function useStampDoubleClick({ enabled, stamps, onOpen }: Opts) {\n const lastClickRef = useRef<{ time: number; elementId: string | null }>({\n time: 0,\n elementId: null,\n });\n\n return useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_activeTool: any, pointerDownState: any) => {\n if (!enabled) return;\n const hitElement = pointerDownState?.hit?.element;\n if (!hitElement || hitElement.type !== 'image') return;\n const stamp = findStampForCustomData(hitElement.customData, stamps);\n if (!stamp) return;\n const now = Date.now();\n const isDouble =\n lastClickRef.current.elementId === hitElement.id &&\n now - lastClickRef.current.time < DOUBLE_CLICK_MS;\n lastClickRef.current = { time: now, elementId: hitElement.id };\n if (!isDouble) return;\n onOpen(stamp.kind, {\n id: hitElement.id,\n customData: hitElement.customData,\n });\n },\n [enabled, stamps, onOpen],\n );\n}\n","import { useEffect, useMemo } from 'react';\nimport type { StampType } from './types';\n\nconst ALLOWED_KEYS = new Set([\n 'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Shift', 'Control', 'Alt', 'Meta', 'CapsLock',\n 'Home', 'End', 'PageUp', 'PageDown',\n]);\n\nfunction isEditable(el: EventTarget | null): boolean {\n if (!(el instanceof HTMLElement)) return false;\n if (el.isContentEditable) return true;\n const tag = el.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n}\n\ninterface Opts {\n /** Active stamp kind. Null = no blocker. */\n activeStamp: string | null;\n /** Stamps đăng ký để allow shortcut keys của chúng đi qua. */\n stamps: ReadonlyArray<StampType>;\n}\n\n/**\n * Khi 1 stamp panel đang mở, block hoàn toàn các phím tắt Excalidraw\n * (1-9, V, R, D...) bằng cách prevent + stop tại capture phase. Cho phép qua:\n * Tab/Arrow/Modifier, Escape, và phím tắt đã đăng ký bởi stamps (V/G/L/D...).\n */\nexport function useStampShortcutBlocker({ activeStamp, stamps }: Opts) {\n const shortcutKeys = useMemo(\n () => new Set(stamps.map((s) => s.shortcutKey.toLowerCase())),\n [stamps],\n );\n\n useEffect(() => {\n if (!activeStamp) return;\n\n const blocker = (e: KeyboardEvent) => {\n if (isEditable(e.target)) return;\n if (e.ctrlKey || e.metaKey) return;\n if (ALLOWED_KEYS.has(e.key)) return;\n if (e.key === 'Escape') return;\n if (shortcutKeys.has(e.key.toLowerCase())) return;\n e.preventDefault();\n e.stopPropagation();\n };\n window.addEventListener('keydown', blocker, { capture: true });\n return () => window.removeEventListener('keydown', blocker, { capture: true });\n }, [activeStamp, shortcutKeys]);\n}\n","import { useEffect, type RefObject } from 'react';\nimport type { StampHostHandle } from './types';\n\ninterface Opts {\n /** Active stamp. Null = no listener. */\n activeStamp: string | null;\n /** Ref tới Host imperative API (tryInsert / hasContent). */\n hostRef: RefObject<StampHostHandle | null>;\n /** Callback đóng panel. */\n onClose: () => void;\n}\n\n/**\n * Khi 1 stamp panel mở, lắng nghe pointer/mouse-down toàn document. Nếu\n * điểm click không nằm trong vùng `[data-stamp-area=\"true\"]`, gọi\n * `hostRef.tryInsert()` để auto-commit (nếu có nội dung) rồi `onClose()`.\n */\nexport function useStampClickOutside({ activeStamp, hostRef, onClose }: Opts) {\n useEffect(() => {\n if (!activeStamp) return;\n let lastFire = 0;\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n if (target.closest('[data-stamp-area=\"true\"]')) return;\n const now = Date.now();\n if (now - lastFire < 50) return;\n lastFire = now;\n hostRef.current?.tryInsert();\n onClose();\n };\n window.addEventListener('pointerdown', handler, { capture: true });\n window.addEventListener('mousedown', handler, { capture: true });\n return () => {\n window.removeEventListener('pointerdown', handler, { capture: true });\n window.removeEventListener('mousedown', handler, { capture: true });\n };\n }, [activeStamp, hostRef, onClose]);\n}\n","// Regenerate Excalidraw BinaryFiles for stamp elements after page reload.\n//\n// Why this exists: VideoRoom only persists the Excalidraw scene (elements +\n// appState) to sessionStorage; binary files (the SVG dataURLs for stamp\n// images) are NOT persisted. After reload, elements still reference a fileId\n// via customData, but the file payload is missing — Excalidraw renders the\n// image area as an empty placeholder.\n//\n// Strategy: tra registry để tìm StampType khớp customData.kind. Nếu stamp có\n// `restoreFileFromCustomData`, gọi trực tiếp với full element (stamp tự lấy\n// fileId + render). Ngược lại, fallback sang `renderSvgFromCustomData` (path\n// cũ: filter type=image + fileId + kiểm tra existing files).\n//\n// Excalidraw key trên fileId chứ không phải hash dataURL nên nếu kết quả\n// render có sai khác nhỏ (vd thứ tự element) cũng không ảnh hưởng.\n//\n// Theme: stamps được render với LIGHT palette (nét đậm). Excalidraw áp dụng\n// `filter: invert(...)` lên canvas trong dark mode → nét tự đảo sáng. KHÔNG\n// cần force regenerate khi user toggle theme.\n\nimport { DEFAULT_STAMPS, findStampForCustomData } from './registry';\nimport type { StampType } from './types';\n\ninterface ElementLike {\n id: string;\n type?: string;\n fileId?: string | null;\n customData?: unknown;\n}\n\ninterface AddFileRecord {\n id: string;\n dataURL: string;\n mimeType: string;\n created: number;\n}\n\nfunction svgToDataURL(svg: string): string {\n const utf8 = unescape(encodeURIComponent(svg));\n return 'data:image/svg+xml;base64,' + btoa(utf8);\n}\n\nasync function buildFileForStamp(\n fileId: string,\n customData: unknown,\n stamp: StampType,\n): Promise<AddFileRecord | null> {\n try {\n const svg = await stamp.renderSvgFromCustomData(customData);\n return { id: fileId, dataURL: svgToDataURL(svg), mimeType: 'image/svg+xml', created: Date.now() };\n } catch (err) {\n console.warn('Stamp restore failed for', fileId, '(' + stamp.kind + ')', err);\n return null;\n }\n}\n\n/**\n * Find stamp elements whose binary file is missing from Excalidraw, then\n * regenerate via registry dispatch. Idempotent: safe to call on every scene\n * update.\n *\n * Stamps that implement `restoreFileFromCustomData` are handled via the new\n * registry-driven path (stamp receives the full element and returns the file\n * record). Stamps that only implement `renderSvgFromCustomData` use the legacy\n * path (filter type=image + fileId, skip already-present files).\n *\n * @param api Excalidraw imperative API.\n * @param elements Tất cả elements trong scene.\n * @param stamps Registry. Default = DEFAULT_STAMPS.\n */\nexport async function restoreMissingStampFiles(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api: any,\n elements: readonly ElementLike[],\n stamps: ReadonlyArray<StampType> = DEFAULT_STAMPS,\n): Promise<void> {\n if (!api) return;\n\n const filesToAdd: AddFileRecord[] = [];\n\n // --- New registry-driven path: stamp.restoreFileFromCustomData ---\n const newPathHandled = new Set<string>();\n for (const el of elements) {\n const stamp = findStampForCustomData(el.customData, stamps);\n if (!stamp?.restoreFileFromCustomData) continue;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const restored = await stamp.restoreFileFromCustomData(el as any);\n if (!restored) continue;\n newPathHandled.add(el.id);\n filesToAdd.push({\n id: restored.fileId,\n dataURL: restored.dataURL,\n mimeType: restored.mimeType,\n created: Date.now(),\n });\n }\n\n // --- Legacy path: stamp.renderSvgFromCustomData (type=image + fileId filter) ---\n const existing = (typeof api.getFiles === 'function') ? api.getFiles() : {};\n const seen = new Set<string>();\n for (const el of elements) {\n if (newPathHandled.has(el.id)) continue;\n if (el.type !== 'image') continue;\n if (!el.fileId) continue;\n if (existing && existing[el.fileId]) continue;\n if (seen.has(el.fileId)) continue;\n const stamp = findStampForCustomData(el.customData, stamps);\n if (!stamp) continue;\n seen.add(el.fileId);\n const built = await buildFileForStamp(el.fileId, el.customData, stamp);\n if (built) filesToAdd.push(built);\n }\n\n if (filesToAdd.length > 0) {\n try { api.addFiles(filesToAdd); } catch (err) { console.warn('addFiles failed:', err); }\n }\n}\n","/**\n * Hardening helpers cho persistence layer:\n *\n * - validateStorageKey: chặn ký tự lạ trong storageKey (consumer-supplied) trước khi\n * ghép vào key prefix (`whiteboard:scene:<key>`) hoặc dùng làm index trong IndexedDB.\n * - safeParseScene: parse JSON với reviver loại bỏ `__proto__/constructor/prototype`\n * để chặn prototype pollution, check max nesting depth, whitelist top-level keys.\n *\n * Các helper này không phụ thuộc DOM nên test được trong jsdom hoặc node thuần.\n */\n\nconst STORAGE_KEY_RE = /^[a-zA-Z0-9_-]{1,128}$/;\n\n/**\n * Validate storageKey từ consumer.\n *\n * Format cho phép: chữ + số + underscore + dash, 1..128 ký tự.\n * Throw nếu không hợp lệ — caller bị buộc handle hoặc crash sớm.\n */\nexport function validateStorageKey(key: unknown): string {\n if (typeof key !== 'string' || !STORAGE_KEY_RE.test(key)) {\n const sample = key === undefined ? 'undefined' : String(key).slice(0, 32);\n throw new Error(\n `[whiteboard] Invalid storageKey: must match ${STORAGE_KEY_RE} (got: ${sample})`,\n );\n }\n return key;\n}\n\nconst DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Reviver dùng cho `JSON.parse`: drop bất kỳ key nào trong DANGEROUS_KEYS,\n * tránh prototype pollution khi parse dữ liệu không tin cậy từ localStorage.\n */\nfunction sanitizingReviver(_key: string, value: unknown): unknown {\n if (DANGEROUS_KEYS.has(_key)) return undefined;\n return value;\n}\n\n/** Max nesting depth cho scene tree (object/array). */\nexport const MAX_NESTED_DEPTH = 64;\n\nfunction depthExceeds(v: unknown, max: number, depth = 0): boolean {\n if (depth > max) return true;\n if (v === null || typeof v !== 'object') return false;\n const children = Array.isArray(v)\n ? v\n : Object.values(v as Record<string, unknown>);\n for (const child of children) {\n if (depthExceeds(child, max, depth + 1)) return true;\n }\n return false;\n}\n\nconst ALLOWED_TOP_LEVEL_KEYS = new Set(['version', 'elements', 'appState', 'savedAt']);\n\n/** Shape của scene đã được validate (chưa check version + element shape — caller lo). */\nexport interface ParsedScene {\n version?: unknown;\n elements: unknown[];\n appState: Record<string, unknown>;\n savedAt?: unknown;\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/**\n * Parse + sanitize raw JSON string từ localStorage.\n *\n * 1. JSON.parse với reviver strip dangerous keys.\n * 2. Reject nếu nested depth vượt MAX_NESTED_DEPTH.\n * 3. Whitelist top-level keys (drop extras).\n * 4. `elements` phải là array, mỗi item là object có `id: string` + `type: string`.\n *\n * Trả về `null` nếu bất kỳ check nào fail (caller handle như \"no data\").\n */\nexport function safeParseScene(raw: string): ParsedScene | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw, sanitizingReviver);\n } catch {\n return null;\n }\n if (!isPlainObject(parsed)) return null;\n if (depthExceeds(parsed, MAX_NESTED_DEPTH)) return null;\n\n // Whitelist top-level keys.\n const safe: Record<string, unknown> = {};\n for (const k of Object.keys(parsed)) {\n if (ALLOWED_TOP_LEVEL_KEYS.has(k)) safe[k] = parsed[k];\n }\n\n if (!Array.isArray(safe.elements)) return null;\n for (const el of safe.elements as unknown[]) {\n if (!isPlainObject(el)) return null;\n if (typeof el.id !== 'string' || typeof el.type !== 'string') return null;\n }\n\n const appState = isPlainObject(safe.appState) ? safe.appState : {};\n\n return {\n version: safe.version,\n elements: safe.elements as unknown[],\n appState,\n savedAt: safe.savedAt,\n };\n}\n","import type { ExcalidrawElement, SyncableAppState } from '../../types';\nimport { safeParseScene, validateStorageKey } from './validation';\n\nconst PREFIX = 'whiteboard:scene:';\nconst SCHEMA_VERSION = 1 as const;\n\nexport interface StoredScene {\n version: typeof SCHEMA_VERSION;\n elements: readonly ExcalidrawElement[];\n appState: Partial<SyncableAppState>;\n savedAt: number;\n}\n\nfunction fullKey(key: string): string {\n return PREFIX + key;\n}\n\nexport function readScene(key: string): StoredScene | null {\n const validKey = validateStorageKey(key);\n if (typeof window === 'undefined') return null;\n const raw = window.localStorage.getItem(fullKey(validKey));\n if (!raw) return null;\n const parsed = safeParseScene(raw);\n if (!parsed) {\n console.warn('[whiteboard] scene parse/validation failed, clear:', validKey);\n try {\n window.localStorage.removeItem(fullKey(validKey));\n } catch { /* ignore */ }\n return null;\n }\n if (parsed.version !== SCHEMA_VERSION) {\n // Cố ý KHÔNG xoá entry — version mismatch có thể là dữ liệu của client\n // mới hơn (user vừa downgrade). Giữ lại để client tương ứng đọc được sau.\n console.warn(\n `[whiteboard] scene version ${parsed.version} không khớp ${SCHEMA_VERSION}, bỏ qua.`,\n );\n return null;\n }\n return {\n version: SCHEMA_VERSION,\n elements: parsed.elements as readonly ExcalidrawElement[],\n appState: parsed.appState as Partial<SyncableAppState>,\n savedAt: typeof parsed.savedAt === 'number' ? parsed.savedAt : Date.now(),\n };\n}\n\nexport function writeScene(\n key: string,\n payload: { elements: readonly ExcalidrawElement[]; appState: Partial<SyncableAppState> },\n): void {\n const validKey = validateStorageKey(key);\n if (typeof window === 'undefined') return;\n const record: StoredScene = {\n version: SCHEMA_VERSION,\n elements: payload.elements,\n appState: payload.appState,\n savedAt: Date.now(),\n };\n try {\n window.localStorage.setItem(fullKey(validKey), JSON.stringify(record));\n } catch (err) {\n console.warn('[whiteboard] scene write failed:', err);\n }\n}\n\nexport function clearScene(key: string): void {\n const validKey = validateStorageKey(key);\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.removeItem(fullKey(validKey));\n } catch { /* ignore */ }\n}\n","import type { BinaryFiles } from '../../types';\nimport { validateStorageKey } from './validation';\n\nconst DB_NAME = 'whiteboard-files';\nconst DB_VERSION = 1;\nconst STORE = 'files';\n\ninterface FileRecord {\n id: string;\n storageKey: string;\n dataURL: string;\n mimeType: string;\n created: number;\n savedAt: number;\n}\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\nlet idbDisabled = false;\n\nfunction openDb(): Promise<IDBDatabase> {\n if (idbDisabled) return Promise.reject(new Error('IndexedDB disabled'));\n if (dbPromise) return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n idbDisabled = true;\n reject(new Error('indexedDB undefined'));\n return;\n }\n const req = indexedDB.open(DB_NAME, DB_VERSION);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE)) {\n const store = db.createObjectStore(STORE, { keyPath: 'id' });\n store.createIndex('storageKey', 'storageKey', { unique: false });\n }\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => {\n idbDisabled = true;\n reject(req.error ?? new Error('IDB open failed'));\n };\n });\n return dbPromise;\n}\n\nasync function withStore<T>(\n mode: IDBTransactionMode,\n fn: (\n store: IDBObjectStore,\n setResult: (value: T) => void,\n fail: (error: unknown) => void,\n ) => void,\n fallback: T,\n): Promise<T> {\n let db: IDBDatabase;\n try {\n db = await openDb();\n } catch {\n return fallback;\n }\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(STORE, mode);\n const store = tx.objectStore(STORE);\n let result = fallback;\n try {\n fn(\n store,\n (value) => {\n result = value;\n },\n reject,\n );\n } catch (err) {\n reject(err);\n return;\n }\n tx.oncomplete = () => resolve(result);\n tx.onerror = () => {\n console.warn('[whiteboard] IDB tx error:', tx.error);\n reject(tx.error ?? new Error('IDB tx error'));\n };\n tx.onabort = () => reject(tx.error ?? new Error('IDB tx aborted'));\n });\n}\n\nexport async function readFiles(storageKey: string): Promise<BinaryFiles> {\n const validKey = validateStorageKey(storageKey);\n try {\n return await withStore(\n 'readonly',\n (store, setResult, fail) => {\n const out: BinaryFiles = {};\n const req = store.index('storageKey').openCursor(IDBKeyRange.only(validKey));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) {\n setResult(out);\n return;\n }\n const record = cursor.value as FileRecord;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (out as any)[record.id] = {\n dataURL: record.dataURL,\n mimeType: record.mimeType,\n created: record.created,\n };\n cursor.continue();\n };\n req.onerror = () => fail(req.error);\n },\n {},\n );\n } catch (err) {\n console.warn('[whiteboard] readFiles failed:', err);\n return {};\n }\n}\n\nexport async function writeFiles(storageKey: string, files: BinaryFiles): Promise<void> {\n const validKey = validateStorageKey(storageKey);\n const entries = Object.entries(files);\n if (entries.length === 0) return;\n try {\n await withStore<void>(\n 'readwrite',\n (store, setResult, fail) => {\n let pending = entries.length;\n const finishOne = () => {\n pending -= 1;\n if (pending === 0) setResult(undefined);\n };\n\n const now = Date.now();\n for (const [id, f] of entries) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ff = f as any;\n const getReq = store.get(id);\n getReq.onsuccess = () => {\n if (getReq.result) {\n finishOne();\n return;\n }\n const rec: FileRecord = {\n id,\n storageKey: validKey,\n dataURL: ff.dataURL,\n mimeType: ff.mimeType,\n created: ff.created ?? now,\n savedAt: now,\n };\n const putReq = store.put(rec);\n putReq.onsuccess = finishOne;\n putReq.onerror = () => fail(putReq.error);\n };\n getReq.onerror = () => fail(getReq.error);\n };\n },\n undefined,\n );\n } catch (err) {\n console.warn('[whiteboard] writeFiles failed:', err);\n }\n}\n\nexport async function pruneFiles(\n storageKey: string,\n keepIds: ReadonlySet<string>,\n): Promise<void> {\n const validKey = validateStorageKey(storageKey);\n try {\n await withStore<void>(\n 'readwrite',\n (store, setResult, fail) => {\n const req = store.index('storageKey').openCursor(IDBKeyRange.only(validKey));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) {\n setResult(undefined);\n return;\n }\n const record = cursor.value as FileRecord;\n if (keepIds.has(record.id)) {\n cursor.continue();\n return;\n }\n const deleteReq = cursor.delete();\n deleteReq.onsuccess = () => cursor.continue();\n deleteReq.onerror = () => fail(deleteReq.error);\n };\n req.onerror = () => fail(req.error);\n },\n undefined,\n );\n } catch (err) {\n console.warn('[whiteboard] pruneFiles failed:', err);\n }\n}\n\nexport async function clearAll(storageKey: string): Promise<void> {\n const validKey = validateStorageKey(storageKey);\n try {\n await withStore<void>(\n 'readwrite',\n (store, setResult, fail) => {\n const req = store.index('storageKey').openCursor(IDBKeyRange.only(validKey));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) {\n setResult(undefined);\n return;\n }\n const deleteReq = cursor.delete();\n deleteReq.onsuccess = () => cursor.continue();\n deleteReq.onerror = () => fail(deleteReq.error);\n };\n req.onerror = () => fail(req.error);\n },\n undefined,\n );\n } catch (err) {\n console.warn('[whiteboard] clearAll failed:', err);\n }\n}\n","'use client';\n\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n ExcalidrawElement,\n BinaryFiles,\n ExcalidrawSceneSnapshot,\n SyncableAppState,\n} from './types';\nimport { pickSyncableAppState } from './serialize';\nimport {\n isStampElement,\n DEFAULT_STAMPS,\n findStampForCustomData,\n type StampType,\n} from './stamps/shared/registry';\nimport { ToolbarInjector } from './stamps/shared/ToolbarInjector';\nimport { useShortcuts } from './stamps/shared/useShortcuts';\nimport { PdfImporterButton } from './pdf/PdfImporterButton';\nimport { PageRangeDialog } from './pdf/PageRangeDialog';\nimport {\n loadPdfDocument,\n closePdfDocument,\n rasterizePdf,\n} from './pdf/rasterize';\nimport { insertRasterizedPagesIntoScene } from './pdf/insertPdfPages';\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport { useStampDoubleClick } from './stamps/shared/useStampDoubleClick';\nimport { useStampShortcutBlocker } from './stamps/shared/useStampShortcutBlocker';\nimport { useStampClickOutside } from './stamps/shared/useStampClickOutside';\nimport { restoreMissingStampFiles } from './stamps/shared/restoreStampFiles';\nimport type { StampHostHandle } from './stamps/shared/types';\nimport { readScene, writeScene } from './core/persistence/sceneStore';\nimport { readFiles, writeFiles, pruneFiles } from './core/persistence/fileStore';\nimport '@excalidraw/excalidraw/index.css';\nimport './stamps/shared/stamp.css';\n\nconst Excalidraw = lazy(() =>\n import('./ExcalidrawWithMenus').then((m) => ({ default: m.ExcalidrawWithMenus })),\n);\n\nconst ExcalidrawLoadingFallback = () => (\n <div className=\"flex h-full items-center justify-center text-sm text-gray-500\">\n Đang tải bảng…\n </div>\n);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nconst SYNC_THROTTLE_MS = 200;\n\n/** Element đang re-edit (double-click) — đủ tối thiểu để Host parse customData. */\ninterface EditingElement {\n id: string;\n customData: unknown;\n}\n\nexport interface WhiteboardProps {\n /**\n * Storage key cho persist client-side.\n * - Scene -> localStorage['whiteboard:scene:'+storageKey]\n * - Files raster -> IndexedDB 'whiteboard-files' index theo storageKey\n * - Default: 'default'\n * - Truyen `null` de tat persist (consumer drive state qua onApi).\n */\n storageKey?: string | null;\n\n /** View-only (Excalidraw viewModeEnabled). Default false. */\n readOnly?: boolean;\n\n /** Local edits -> consumer broadcast. Optional. */\n onSceneChange?: (snapshot: ExcalidrawSceneSnapshot) => void;\n onFilesChange?: (files: BinaryFiles, newFileIds: string[]) => void;\n\n /** Excalidraw imperative API. Consumer dung inject remote scene khi can. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onApi?: (api: any) => void;\n\n /** Excalidraw UI language. Defaults to 'vi-VN'. See @excalidraw/excalidraw locales. */\n langCode?: string;\n\n /**\n * Danh sách stamp đăng ký. Mỗi stamp khai báo phím tắt + toolbar button +\n * Host component (UI editing). Mặc định DEFAULT_STAMPS (= ALL_STAMPS,\n * gồm geometry + latex + geometry3d + graph2d).\n * Truyền `[...DEFAULT_STAMPS, customStamp]` để thêm stamp mới hoặc\n * `STABLE_STAMPS` để chỉ bật stamp ổn định.\n */\n stamps?: ReadonlyArray<StampType>;\n}\n\nexport function Whiteboard({\n storageKey = 'default',\n readOnly = false,\n onSceneChange,\n onFilesChange,\n onApi,\n langCode = 'vi-VN',\n stamps = DEFAULT_STAMPS,\n}: WhiteboardProps) {\n const [api, setApi] = useState<ExApi | null>(null);\n const apiRef = useRef<ExApi | null>(null);\n const [isDarkTheme, setIsDarkTheme] = useState(false);\n const isDarkThemeRef = useRef(false);\n const knownFileIdsRef = useRef<Set<string>>(new Set());\n const lastSceneHashRef = useRef<string>('');\n const sceneThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const fileThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pruneThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestSceneRef = useRef<{\n elements: readonly ExcalidrawElement[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n appState: any;\n } | null>(null);\n const pendingFilesRef = useRef<BinaryFiles>({});\n // Cached hashElementsVersion để flushScene chạy sync trong unmount cleanup\n // (cleanup không thể await dynamic import).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hashElementsVersionRef = useRef<((elements: readonly ExcalidrawElement[]) => any) | null>(null);\n // Stamps prop có thể thay đổi — capture vào ref để callback trong setTimeout\n // không bị stale closure.\n const stampsRef = useRef(stamps);\n stampsRef.current = stamps;\n const persistEnabled = typeof storageKey === 'string' && storageKey.length > 0;\n const persistKeyRef = useRef(storageKey);\n persistKeyRef.current = storageKey;\n // Lưu callback refs để cleanup unmount truy cập được mà không bị stale closure\n // (props onSceneChange/onFilesChange có thể thay đổi).\n const onSceneChangeRef = useRef(onSceneChange);\n onSceneChangeRef.current = onSceneChange;\n const onFilesChangeRef = useRef(onFilesChange);\n onFilesChangeRef.current = onFilesChange;\n const persistEnabledRef = useRef(persistEnabled);\n persistEnabledRef.current = persistEnabled;\n\n const persistedInitial = useMemo(\n () => (persistEnabled ? readScene(storageKey as string) : null),\n [persistEnabled, storageKey],\n );\n const effectiveInitialScene: ExcalidrawSceneSnapshot | null = persistedInitial\n ? {\n elements: persistedInitial.elements,\n appState: persistedInitial.appState as SyncableAppState,\n }\n : null;\n\n // ---- Stamp state (registry-driven) ----\n const [activeStamp, setActiveStamp] = useState<string | null>(null);\n const activeStampRef = useRef(activeStamp);\n activeStampRef.current = activeStamp;\n const [editingElement, setEditingElement] = useState<EditingElement | null>(null);\n const hostRef = useRef<StampHostHandle | null>(null);\n\n // ---- PDF import state ----\n // Sau khi user pick file, load doc lấy numPages → mở dialog hỏi range.\n // Giữ doc instance để rasterize ngay (tránh load lại từ ArrayBuffer).\n const [pdfPending, setPdfPending] = useState<{\n doc: PDFDocumentProxy;\n fileName: string;\n totalPages: number;\n } | null>(null);\n const [pdfBusy, setPdfBusy] = useState(false);\n\n const handledCropIdRef = useRef<string | null>(null);\n const prevExcalidrawToolRef = useRef<string>('selection');\n\n const stampByKind = useMemo(() => {\n const m = new Map<string, StampType>();\n for (const s of stamps) m.set(s.kind, s);\n return m;\n }, [stamps]);\n\n const activeStampDef = activeStamp ? stampByKind.get(activeStamp) ?? null : null;\n const HostComponent = activeStampDef?.Host ?? null;\n\n // ---- Open / close helpers ----\n const openStamp = useCallback(\n (kind: string, element: EditingElement | null = null) => {\n if (readOnly) return;\n if (!stampByKind.has(kind)) return;\n setEditingElement(element);\n setActiveStamp(kind);\n },\n [readOnly, stampByKind],\n );\n\n const closeStamp = useCallback(() => {\n setActiveStamp(null);\n setEditingElement(null);\n }, []);\n\n const toggleStampByKind = useCallback(\n (kind: string) => {\n if (activeStamp === kind) closeStamp();\n else openStamp(kind);\n },\n [activeStamp, openStamp, closeStamp],\n );\n\n // ---- Capture local changes ----\n const handleChange = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (elements: readonly ExcalidrawElement[], appState: any, files: BinaryFiles) => {\n // Sync theme từ Excalidraw appState -> React state.\n // Excalidraw 0.18 gọi onChange đồng bộ trong state-updater của họ\n // (React 19 / Next.js 16 sẽ warn: \"scheduled from inside an update\n // function\"). Bail-out qua ref + defer setState bằng queueMicrotask để\n // setState chạy SAU commit của Excalidraw, không nằm trong updater.\n const nextDark = appState?.theme === 'dark';\n if (isDarkThemeRef.current !== nextDark) {\n isDarkThemeRef.current = nextDark;\n queueMicrotask(() => setIsDarkTheme(nextDark));\n }\n\n if (readOnly) return;\n latestSceneRef.current = { elements, appState };\n\n // Intercept Excalidraw crop-image flow cho math stamps: khi user double-click\n // 1 stamp, Excalidraw set appState.croppingElementId. Ta dismiss crop mode +\n // mở Host editor tương ứng. handlePointerDown phát hiện double-click sớm\n // hơn — đây là fallback (đặc biệt khi click rơi vào selection handle).\n const cropId = appState?.croppingElementId as string | null | undefined;\n if (cropId && cropId !== handledCropIdRef.current && api) {\n const el = elements.find((e: ExcalidrawElement) => e.id === cropId);\n if (el) {\n const stamp = findStampForCustomData((el as { customData?: unknown }).customData, stamps);\n if (stamp) {\n handledCropIdRef.current = cropId;\n // Defer cả updateScene + openStamp ra khỏi commit-phase của\n // Excalidraw — nếu chạy đồng bộ, React 19 warn \"update scheduled\n // from inside an update function\" (handleChange chạy trong updater\n // của Excalidraw).\n const elId = el.id;\n const elCustom = (el as { customData?: unknown }).customData;\n const stampKind = stamp.kind;\n queueMicrotask(() => {\n try {\n api.updateScene({\n appState: { croppingElementId: null, selectedElementIds: {} },\n });\n } catch { /* ignore */ }\n openStamp(stampKind, { id: elId, customData: elCustom });\n });\n return;\n }\n }\n }\n if (!cropId) {\n handledCropIdRef.current = null;\n }\n\n const fileIds = Object.keys(files);\n const newIds = fileIds.filter((id) => !knownFileIdsRef.current.has(id));\n if (newIds.length > 0) {\n newIds.forEach((id) => knownFileIdsRef.current.add(id));\n onFilesChange?.(files, newIds);\n }\n\n if (!sceneThrottleRef.current) {\n sceneThrottleRef.current = setTimeout(async () => {\n sceneThrottleRef.current = null;\n try {\n const mod = await import('@excalidraw/excalidraw');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n hashElementsVersionRef.current = (mod as any).hashElementsVersion;\n } catch (err) {\n console.warn('[whiteboard] import excalidraw để flush scene thất bại:', err);\n return;\n }\n flushSceneRef.current();\n }, SYNC_THROTTLE_MS);\n }\n\n // File throttle (1s): lưu raster vào IDB, bỏ math-stamp files.\n if (persistEnabled && newIds.length > 0) {\n for (const id of newIds) {\n if (files[id]) pendingFilesRef.current[id] = files[id];\n }\n if (!fileThrottleRef.current) {\n fileThrottleRef.current = setTimeout(() => {\n fileThrottleRef.current = null;\n flushFilesRef.current();\n }, 1000);\n }\n }\n\n // Prune throttle (2s): dọn orphan raster sau khi xoá element.\n if (persistEnabled && !pruneThrottleRef.current) {\n pruneThrottleRef.current = setTimeout(() => {\n pruneThrottleRef.current = null;\n flushPruneRef.current();\n }, 2000);\n }\n },\n [readOnly, api, onSceneChange, onFilesChange, persistEnabled, storageKey, stamps, openStamp],\n );\n\n // ---- Flush helpers (gọi từ setTimeout VÀ unmount cleanup) ----\n // Lưu vào ref để cleanup luôn dùng version mới nhất (closure-stable).\n const flushSceneRef = useRef<() => void>(() => undefined);\n flushSceneRef.current = () => {\n try {\n const latestScene = latestSceneRef.current;\n if (!latestScene) return;\n const liveElements = latestScene.elements.filter((e) => !e.isDeleted) as readonly ExcalidrawElement[];\n const liveAppState = pickSyncableAppState(latestScene.appState);\n const hashFn = hashElementsVersionRef.current;\n // Nếu chưa load module → bỏ qua hash dedupe, cứ ghi (correctness > perf trong unmount path).\n const elementHash = hashFn ? hashFn(liveElements) : liveElements.map((e) => e.id).join('|');\n const sceneHash = `${elementHash}:${JSON.stringify(liveAppState)}`;\n if (sceneHash === lastSceneHashRef.current) return;\n lastSceneHashRef.current = sceneHash;\n onSceneChangeRef.current?.({ elements: liveElements, appState: liveAppState });\n if (persistEnabledRef.current) {\n writeScene(persistKeyRef.current as string, {\n elements: liveElements,\n appState: liveAppState,\n });\n }\n } catch (err) {\n console.warn('[whiteboard] flushScene thất bại:', err);\n }\n };\n\n const flushFilesRef = useRef<() => void>(() => undefined);\n flushFilesRef.current = () => {\n try {\n const pending = pendingFilesRef.current;\n pendingFilesRef.current = {};\n if (Object.keys(pending).length === 0) return;\n const currentElements = (apiRef.current?.getSceneElements?.()\n ?? latestSceneRef.current?.elements\n ?? []) as readonly ExcalidrawElement[];\n const stampIds = new Set<string>();\n for (const el of currentElements) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fid = (el as any).fileId as string | undefined;\n if (fid && isStampElement(el)) stampIds.add(fid);\n }\n const raster: BinaryFiles = {};\n for (const [id, f] of Object.entries(pending)) {\n if (!stampIds.has(id)) raster[id] = f;\n }\n if (Object.keys(raster).length > 0) {\n void writeFiles(persistKeyRef.current as string, raster);\n }\n } catch (err) {\n console.warn('[whiteboard] flushFiles thất bại:', err);\n }\n };\n\n const flushPruneRef = useRef<() => void>(() => undefined);\n flushPruneRef.current = () => {\n try {\n const currentElements = (apiRef.current?.getSceneElements?.()\n ?? latestSceneRef.current?.elements\n ?? []) as readonly ExcalidrawElement[];\n const keep = new Set<string>();\n for (const el of currentElements) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fid = (el as any).fileId as string | undefined;\n if (fid && !isStampElement(el)) keep.add(fid);\n }\n void pruneFiles(persistKeyRef.current as string, keep);\n } catch (err) {\n console.warn('[whiteboard] flushPrune thất bại:', err);\n }\n };\n\n // ---- Mount: load persisted raster files từ IDB -> addFiles ----\n useEffect(() => {\n if (!api || !persistEnabled) return;\n let cancelled = false;\n void readFiles(storageKey as string).then(\n (files) => {\n // Recheck cancelled NGAY khi promise resolve — IDB onsuccess có thể\n // fire sau component unmount (tx microtask).\n if (cancelled) return;\n const entries = Object.entries(files);\n if (entries.length === 0) return;\n // Recheck một lần nữa trước khi gọi api.addFiles để chắc chắn\n // không invoke API trên instance đã teardown.\n if (cancelled) return;\n try {\n api.addFiles(\n entries.map(([id, f]) => ({\n id,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dataURL: (f as any).dataURL,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mimeType: (f as any).mimeType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n created: (f as any).created ?? Date.now(),\n })),\n );\n if (cancelled) return;\n entries.forEach(([id]) => knownFileIdsRef.current.add(id));\n } catch (err) {\n if (cancelled) return;\n console.warn('[whiteboard] addFiles từ IDB thất bại:', err);\n }\n },\n (err) => {\n if (cancelled) return;\n console.warn('[whiteboard] readFiles thất bại:', err);\n },\n );\n return () => {\n cancelled = true;\n };\n }, [api, persistEnabled, storageKey]);\n\n useEffect(() => {\n if (!api) return;\n let cancelled = false;\n const run = async () => {\n if (cancelled) return;\n try {\n const elements = api.getSceneElements();\n if (!elements || elements.length === 0) return;\n if (cancelled) return;\n // Đọc stamps từ ref — props có thể đã thay đổi sau setTimeout 400ms,\n // closure-captured `stamps` sẽ stale.\n await restoreMissingStampFiles(api, elements, stampsRef.current);\n } catch (err) {\n if (cancelled) return;\n console.warn('Math stamp restore pass failed:', err);\n }\n };\n void run();\n const t = setTimeout(() => {\n void run();\n }, 400);\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [api, persistedInitial]);\n\n // Unmount cleanup: flush pending writes TRƯỚC khi clearTimeout để không\n // mất scene/file write cuối khi user navigate giữa throttle window.\n useEffect(\n () => () => {\n if (sceneThrottleRef.current) {\n clearTimeout(sceneThrottleRef.current);\n sceneThrottleRef.current = null;\n flushSceneRef.current();\n }\n if (fileThrottleRef.current) {\n clearTimeout(fileThrottleRef.current);\n fileThrottleRef.current = null;\n flushFilesRef.current();\n }\n if (pruneThrottleRef.current) {\n clearTimeout(pruneThrottleRef.current);\n pruneThrottleRef.current = null;\n flushPruneRef.current();\n }\n },\n [],\n );\n\n // ---- Double-click detection for re-edit ----\n const handlePointerDown = useStampDoubleClick({\n enabled: !readOnly,\n stamps,\n onOpen: openStamp,\n });\n\n // ---- Keyboard shortcuts: đọc registry, mỗi stamp tự khai báo phím tắt ----\n useShortcuts({\n enabled: !readOnly,\n onToggle: toggleStampByKind,\n stamps,\n });\n\n // ---- Sync Excalidraw activeTool với activeStamp ----\n useEffect(() => {\n if (!api) return;\n if (activeStamp) {\n try {\n const cur = api.getAppState?.()?.activeTool?.type ?? 'selection';\n if (cur && cur !== 'hand') prevExcalidrawToolRef.current = cur;\n api.setActiveTool?.({ type: 'hand' });\n } catch { /* ignore */ }\n } else {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api.setActiveTool?.({ type: prevExcalidrawToolRef.current as any });\n } catch { /* ignore */ }\n }\n }, [activeStamp, api]);\n\n // ---- Block Excalidraw shortcuts khi stamp panel đang mở ----\n useStampShortcutBlocker({ activeStamp, stamps });\n\n // ---- Esc đóng panel (capture phase để chạy TRƯỚC Excalidraw) ----\n useEffect(() => {\n if (!activeStamp) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n const ae = document.activeElement as HTMLElement | null;\n if (ae && (ae.tagName === 'TEXTAREA' || ae.isContentEditable)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n closeStamp();\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [activeStamp, closeStamp]);\n\n useStampClickOutside({ activeStamp, hostRef, onClose: closeStamp });\n\n // ---- PDF import handlers ----\n const handlePdfPick = useCallback(\n async (file: File) => {\n if (readOnly || pdfBusy) return;\n setPdfBusy(true);\n try {\n const doc = await loadPdfDocument(file);\n setPdfPending({ doc, fileName: file.name, totalPages: doc.numPages });\n } catch (err) {\n console.warn('[whiteboard] Đọc PDF thất bại:', err);\n window.alert('Không đọc được PDF. File có thể đã hỏng hoặc bị mật khẩu bảo vệ.');\n } finally {\n setPdfBusy(false);\n }\n },\n [readOnly, pdfBusy],\n );\n\n const handlePdfConfirm = useCallback(\n async (pages: number[]) => {\n if (!pdfPending || !api) return;\n const { doc } = pdfPending;\n setPdfPending(null);\n setPdfBusy(true);\n const scale = 2;\n try {\n const rendered = await rasterizePdf(doc, { pages, scale });\n await closePdfDocument(doc);\n insertRasterizedPagesIntoScene(api, rendered, { scale });\n } catch (err) {\n console.warn('[whiteboard] Chèn PDF thất bại:', err);\n window.alert('Chèn PDF thất bại. Xem console để biết chi tiết.');\n } finally {\n setPdfBusy(false);\n }\n },\n [pdfPending, api],\n );\n\n const handlePdfCancel = useCallback(() => {\n if (pdfPending) {\n void closePdfDocument(pdfPending.doc);\n }\n setPdfPending(null);\n }, [pdfPending]);\n\n // ---- Drop handler: bắt PDF file kéo vào canvas TRƯỚC Excalidraw ----\n // Excalidraw không hiểu application/pdf → mặc định sẽ reject (toast lỗi).\n // Capture phase + preventDefault để ngắt sớm rồi tự xử lý.\n useEffect(() => {\n if (readOnly) return;\n const root = document.querySelector<HTMLElement>('.excalidraw');\n if (!root) return;\n\n const onDragOver = (e: DragEvent) => {\n const items = e.dataTransfer?.items;\n if (!items) return;\n for (let i = 0; i < items.length; i++) {\n if (items[i].kind === 'file' && items[i].type === 'application/pdf') {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';\n return;\n }\n }\n };\n\n const onDrop = (e: DragEvent) => {\n const files = e.dataTransfer?.files;\n if (!files || files.length === 0) return;\n const pdf = Array.from(files).find((f) => f.type === 'application/pdf');\n if (!pdf) return;\n e.preventDefault();\n e.stopPropagation();\n void handlePdfPick(pdf);\n };\n\n root.addEventListener('dragover', onDragOver, { capture: true });\n root.addEventListener('drop', onDrop, { capture: true });\n return () => {\n root.removeEventListener('dragover', onDragOver, { capture: true });\n root.removeEventListener('drop', onDrop, { capture: true });\n };\n }, [readOnly, handlePdfPick, api]);\n\n return (\n <div className={`relative h-full w-full${isDarkTheme ? ' theme--dark' : ''}`}>\n <Suspense fallback={<ExcalidrawLoadingFallback />}>\n <Excalidraw\n excalidrawAPI={(a: ExApi) => {\n // Excalidraw có thể gọi callback này đồng bộ trong commit-phase của\n // họ. Bail-out qua ref + defer setApi để tránh \"update scheduled\n // from inside an update function\" trên React 19 / Next.js 16.\n if (apiRef.current === a) return;\n apiRef.current = a;\n queueMicrotask(() => {\n setApi(a);\n onApi?.(a);\n });\n }}\n langCode={langCode}\n viewModeEnabled={readOnly}\n initialData={\n effectiveInitialScene\n ? {\n elements: effectiveInitialScene.elements,\n appState: {\n ...effectiveInitialScene.appState,\n gridSize: effectiveInitialScene.appState.gridSize ?? undefined,\n },\n }\n : { appState: { viewBackgroundColor: '#ffffff' } }\n }\n onChange={handleChange}\n onPointerDown={handlePointerDown}\n />\n </Suspense>\n\n <ToolbarInjector\n enabled={!readOnly}\n activeStampKind={activeStamp}\n onToggle={toggleStampByKind}\n stamps={stamps}\n />\n\n <PdfImporterButton enabled={!readOnly} onPick={handlePdfPick} />\n\n {pdfPending && (\n <PageRangeDialog\n doc={pdfPending.doc}\n fileName={pdfPending.fileName}\n onConfirm={handlePdfConfirm}\n onCancel={handlePdfCancel}\n />\n )}\n\n {pdfBusy && !pdfPending && (\n <div\n aria-live=\"polite\"\n role=\"status\"\n style={{\n position: 'fixed',\n bottom: 16,\n right: 16,\n padding: '8px 14px',\n background: 'rgba(0,0,0,0.75)',\n color: '#fff',\n borderRadius: 6,\n fontSize: 12,\n zIndex: 10000,\n }}\n >\n Đang xử lý PDF…\n </div>\n )}\n\n {HostComponent && (\n <HostComponent\n ref={hostRef}\n api={api}\n editingElement={editingElement}\n onClose={closeStamp}\n isDark={isDarkTheme}\n />\n )}\n </div>\n );\n}\n"]}
|