@xom11/whiteboard 0.6.1 → 0.6.4
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/dist/{ExcalidrawWithMenus-KBLDWPM2.mjs → ExcalidrawWithMenus-EAVPOPJZ.mjs} +3 -2
- package/dist/ExcalidrawWithMenus-EAVPOPJZ.mjs.map +1 -0
- package/dist/chunk-BJTO5JO5.mjs +11 -0
- package/dist/chunk-BJTO5JO5.mjs.map +1 -0
- package/dist/index.css +249 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +12 -2
- package/dist/index.d.ts +12 -2
- package/dist/index.js +3042 -549
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3035 -550
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -2
- package/dist/ExcalidrawWithMenus-KBLDWPM2.mjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/serialize.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-2d/editor/handlers.ts","../src/stamps/geometry-2d/editor/MiniBoard.tsx","../src/stamps/geometry-2d/editor/LeftPanel.tsx","../src/stamps/geometry-2d/serialize.ts","../src/stamps/geometry-2d/renderInline.ts","../src/stamps/geometry-2d/render.ts","../src/stamps/shared/excalidrawPalette.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/svgToImage.ts","../src/stamps/shared/insertImage.ts","../src/stamps/geometry-2d/index.tsx","../src/stamps/latex/editor/LeftPanel.tsx","../src/stamps/latex/render.ts","../src/stamps/latex/editor/EditorPopover.tsx","../src/stamps/latex/index.tsx","../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/tools.ts","../src/stamps/geometry-3d/editor/toolButtons.tsx","../src/stamps/geometry-3d/editor/LeftPanel.tsx","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/stamps/geometry-3d/serialize.ts","../src/stamps/geometry-3d/render.ts","../src/stamps/geometry-3d/index.tsx","../src/stamps/shared/registry.ts","../src/stamps/shared/ToolbarInjector.tsx","../src/stamps/shared/useShortcuts.ts","../src/stamps/shared/restoreStampFiles.ts","../src/core/persistence/sceneStore.ts","../src/core/persistence/fileStore.ts","../src/Whiteboard.tsx"],"names":["hits","name","pick","sc","JXG","obj","stroke","jsx","jsxs","useState","useRef","useEffect","useCallback","createPortal","GeometryEditorPanel","forwardRef","GeometryStampHost","useMemo","useImperativeHandle","Fragment","Shell","Section","LeftPanel","EditorPopover","LatexStampHost","paletteFor","radius","center","MiniBoard3D","useId","p","TOOLTIP_DELAY_MS","EditorPanel","Geometry3DStampHost"],"mappings":"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","file":"index.mjs","sourcesContent":["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","// 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\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","// 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","/**\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 getCreationLog: () => [...creationLogRef.current],\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, { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS, GROUP_LABELS, type GeomTool, type ToolDef } from './MiniBoard';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shared shell ----------\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=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}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 <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 <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\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// ---------- Geometry left panel ----------\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}\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\nexport function LeftPanel({\n activeTool,\n onToolChange,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onClose,\n isDark,\n}: GeometryLeftPanelProps) {\n // Group TOOLS by category\n const grouped = TOOLS.reduce<Record<string, ToolDef[]>>((acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n }, {});\n const groupKeys = Object.keys(grouped) as Array<ToolDef['group']>;\n\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 (\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 <svg width=\"14\" height=\"14\" 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 </button>\n </div>\n </Section>\n\n {groupKeys.map((group) => (\n <Section key={group} label={GROUP_LABELS[group]}>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group].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={() => 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 '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 </button>\n );\n })}\n </div>\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\n// Alias for back-compat\nexport { LeftPanel as GeometryLeftPanel };\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","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","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","// 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';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\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\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 const onMouseDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('mousedown', onMouseDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('mousedown', onMouseDown, { 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 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 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: anchor.x, top: anchor.y }}\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}\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 }, 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 = {\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 style={wrapperStyle}\n className={`${isDark ? 'theme--dark ' : ''}flex h-[540px] max-h-[85vh] w-[640px] max-w-[calc(100vw-280px)] flex-col overflow-hidden rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5`}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n <h3 className=\"flex 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 <button onClick={onClose} aria-label=\"Đóng\" className=\"rounded p-1 transition hover:bg-white/15\">\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=\"min-h-0 flex-1\" style={{ 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 <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 </div>\n );\n },\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 { insertStampImage } from '../shared/insertImage';\nimport { renderGeometrySvgFromState } from './render';\nimport type { SerializedBoard } from './serialize';\nimport type {\n BaseStampCustomData,\n RestoredStampFile,\n StampHostProps,\n StampHostHandle,\n StampType,\n} from '../shared/types';\n\n// ============== Custom data type + guard ==============\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\n// ============== Host component ==============\n\nconst INITIAL_GEOM_STATE: GeomBoardState = {\n tool: 'move',\n showAxis: false,\n showGrid: false,\n canUndo: false,\n};\n\nconst 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\n // Initial state cho editor: parse từ customData nếu đang re-edit, null nếu tạo mới.\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 />\n <GeometryEditorPanel\n ref={panelRef}\n initialState={initialState}\n onInsert={handleInsert}\n onClose={onClose}\n onStateChange={setGeomState}\n withLeftPanel\n isDark={isDark}\n />\n </>\n );\n },\n);\n\n// ============== Stamp definition ==============\n\nconst GeometryIcon = (\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 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}\n\nfunction Shell({ title, icon, onClose, children }: 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=\"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 <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 <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\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}\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}: LatexLeftPanelProps) {\n return (\n <Shell title=\"Công thức LaTeX\" icon=\"∑\" onClose={onClose}>\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 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","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","'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}\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 },\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 = 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 className=\"w-[420px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5\"\n role=\"dialog\"\n aria-label=\"Nhập công thức LaTeX\"\n >\n <header className=\"flex items-center justify-between rounded-t-lg border-b border-slate-200 bg-gradient-to-r from-indigo-600 to-purple-600 px-3 py-2 text-white\">\n <h3 className=\"flex 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 <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 transition hover:bg-white/15\"\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=\"space-y-2 p-3\">\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 text-sm outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-200\"\n autoFocus\n />\n <div\n className={[\n 'flex min-h-[64px] items-center justify-center rounded border p-3 text-center',\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 <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 </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 { EditorPopover as LatexEditorPopover, type EditorPopoverHandle as LatexEditorHandle } from './editor/EditorPopover';\nimport { insertStampImage } from '../shared/insertImage';\nimport { renderLatexToSvg } from './render';\nimport type {\n BaseStampCustomData,\n RestoredStampFile,\n StampHostProps,\n StampHostHandle,\n StampType,\n} from '../shared/types';\n\n// ============== Custom data type + guard ==============\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\n// ============== Host component ==============\n\nconst LatexStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function LatexStampHost({ api, editingElement, onClose }, ref) {\n const editorRef = useRef<LatexEditorHandle | null>(null);\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 />\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\n />\n </>\n );\n },\n);\n\n// ============== Stamp definition ==============\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","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 JXG from 'jsxgraph';\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 JXG.Options.text.display = 'internal';\n\n const board: JxgBoard = 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 return () => {\n if (pointerHandlerRef.current) {\n pointerHandlerRef.current.el.removeEventListener(\n 'pointerdown',\n pointerHandlerRef.current.fn,\n );\n pointerHandlerRef.current = null;\n }\n try {\n 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 getCreationLog: () => [...logRef.current],\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","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\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}\n\nexport function ToolButton({ toolKey, label, hint, active, onClick, icon }: 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 '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 </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, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS_3D, GROUP_LABELS_3D, type GeomTool3D, type ToolDef3D, type ToolGroup3D } from './tools';\nimport { ToolButton, ICONS_3D } from './toolButtons';\nimport type { MiniBoard3DHandle } from './MiniBoard3D';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shell ----------\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={`${isDark ? 'theme--dark ' : ''}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 <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 <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\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// ---------- 3D Icon header ----------\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\n// ---------- Props ----------\n\ninterface Props {\n handle: MiniBoard3DHandle | null;\n onResetView: () => void;\n onClose: () => void;\n isDark?: boolean;\n}\n\nexport function LeftPanel({ handle, onResetView, onClose, isDark }: Props) {\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 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 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 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 const grouped = 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 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 <svg width=\"14\" height=\"14\" 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 </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 <svg width=\"14\" height=\"14\" 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 </button>\n </div>\n </Section>\n\n {(Object.entries(grouped) as [ToolGroup3D, ToolDef3D[]][]).map(([group, tools]) => (\n <Section key={group} label={GROUP_LABELS_3D[group]}>\n <div className=\"grid grid-cols-4 gap-1\">\n {tools.map((t) => (\n <ToolButton\n key={t.key}\n toolKey={t.key}\n label={t.label}\n hint={t.hint}\n active={tool === t.key}\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 />\n ))}\n </div>\n </Section>\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","'use client';\nimport { forwardRef, useCallback, useImperativeHandle, useRef, useState } from 'react';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport { LeftPanel } from './LeftPanel';\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}\n\nexport const EditorPanel = forwardRef<EditorPanelHandle, Props>(function EditorPanel(\n { isDark, initial, onInsert, onClose },\n ref,\n) {\n // Stable ref to the latest mounted handle so callbacks (tryInsert) read fresh state\n // without triggering re-renders when the handle updates internally.\n const boardRef = useRef<MiniBoard3DHandle | null>(null);\n // Re-render trigger for LeftPanel ONLY when the handle identity changes\n // (mount → handle, unmount → null). Functional-equality guard breaks the\n // ref-callback re-render loop seen with React 19 strict mode.\n const [boardHandle, setBoardHandle] = useState<MiniBoard3DHandle | null>(null);\n\n const setBoard = useCallback((h: MiniBoard3DHandle | null) => {\n boardRef.current = h;\n setBoardHandle((prev) => (prev === h ? prev : h));\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => {\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 },\n hasContent: () => (boardRef.current?.getCreationLog().length ?? 0) > 0,\n }),\n [onInsert],\n );\n\n const handleResetView = useCallback(() => {\n boardRef.current?.resetView();\n }, []);\n\n return (\n <div\n data-testid=\"geom3d-editor-panel\"\n data-stamp-area=\"true\"\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n width: 900,\n height: 700,\n background: '#fff',\n boxShadow: '0 6px 32px rgba(0,0,0,0.2)',\n borderRadius: 8,\n zIndex: 10,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n display: 'flex',\n padding: '8px 12px',\n borderBottom: '1px solid #eee',\n alignItems: 'center',\n }}\n >\n <span style={{ fontWeight: 600 }}>Hình học không gian (3D)</span>\n <span style={{ flex: 1 }} />\n <button type=\"button\" onClick={onClose}>\n Đóng\n </button>\n </div>\n <div style={{ position: 'relative', flex: 1, minHeight: 0 }}>\n <LeftPanel\n handle={boardHandle}\n onResetView={handleResetView}\n onClose={onClose}\n isDark={isDark}\n />\n <div\n style={{\n position: 'absolute',\n left: 120,\n top: 0,\n right: 0,\n bottom: 0,\n overflow: 'hidden',\n }}\n >\n <MiniBoard3D ref={setBoard} isDark={isDark} initialState={initial} />\n </div>\n </div>\n </div>\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","\"use client\";\n\nimport JXG from 'jsxgraph';\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\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';\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n type ReactNode,\n} from 'react';\nimport { EditorPanel, type EditorPanelHandle } from './editor/EditorPanel';\nimport { insertStampImage } from '../shared/insertImage';\nimport type {\n StampHostProps,\n StampHostHandle,\n StampType,\n RestoredStampFile,\n} from '../shared/types';\nimport {\n isGeometry3DCustomData,\n parseSerializedBoard3D,\n type Geometry3DCustomData,\n type SerializedBoard3D,\n} from './serialize';\nimport { renderGeometry3DSvgFromState } from './render';\n\nexport { isGeometry3DCustomData };\nexport type { Geometry3DCustomData };\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 initial = useMemo(\n () => parseInitial(editingElement),\n [editingElement],\n );\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 <EditorPanel\n ref={editorRef}\n isDark={isDark}\n initial={initial}\n onInsert={handleInsert}\n onClose={onClose}\n />\n );\n },\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 <path d=\"M12 3 L20 8 L20 16 L12 21 L4 16 L4 8 Z\" />\n <path d=\"M12 3 L12 21 M4 8 L12 12 L20 8 M4 16 L12 12 L20 16\" />\n </svg>\n);\n\nexport const geometry3dStamp: StampType = {\n kind: 'geometry3d',\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","import { geometryStamp } from '../geometry-2d';\nimport { latexStamp } from '../latex';\nimport { geometry3dStamp } from '../geometry-3d';\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 type { StampType, BaseStampCustomData } from './types';\n\n/**\n * Set stamp mặc định dùng trong Whiteboard. Consumer có thể\n * truyền custom array để bật/tắt từng stamp hoặc đăng ký stamp mới.\n *\n * Để thêm 1 stamp mới (vd chart):\n * 1. Tạo `src/stamp/registry/chart.tsx` với StampType object.\n * 2. Add vào DEFAULT_STAMPS ở dưới, HOẶC consumer truyền\n * `<Whiteboard stamps={[...DEFAULT_STAMPS, chartStamp]} />`.\n */\nexport const DEFAULT_STAMPS: ReadonlyArray<StampType> = Object.freeze([\n geometryStamp,\n latexStamp,\n geometry3dStamp,\n]);\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 — replace logic hardcode trong types.ts. */\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, 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 WRAPPER_ID = 'stamp-toolbar-portal-wrapper';\n\n/**\n * Inject N nút stamp vào thanh tool chính của Excalidraw\n * (`.App-toolbar .Stack_horizontal`) — số nút = registry.length. Mỗi nút kế\n * thừa CSS native (cùng kích thước, hover, selected state, keybinding label).\n *\n * Pattern: ReactDOM portal vào 1 DOM node được append vào toolbar. Dùng\n * `MutationObserver` để re-mount nếu Excalidraw xoá wrapper hoặc re-render\n * toolbar (đổi orientation, mobile/desktop switch...).\n */\nexport function ToolbarInjector({\n enabled,\n activeStampKind,\n onToggle,\n stamps = DEFAULT_STAMPS,\n}: Props) {\n const [mountNode, setMountNode] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!enabled) {\n setMountNode(null);\n return;\n }\n\n let cancelled = false;\n let attempts = 0;\n let observer: MutationObserver | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const tryMount = () => {\n if (cancelled) return;\n // Container thật chứa tất cả tool icons trong Excalidraw 0.18+ là\n // `.App-toolbar .Stack.Stack_horizontal`. Class `.Shape` là class trên\n // <label> của mỗi tool radio, không phải parent.\n const container =\n document.querySelector('.excalidraw .App-toolbar .Stack_horizontal') ??\n document.querySelector('.App-toolbar .Stack_horizontal');\n if (!container) {\n if (attempts++ < 20) {\n timer = setTimeout(tryMount, 100);\n }\n return;\n }\n // Nếu wrapper cũ tồn tại (HMR / re-mount) thì tái sử dụng\n let wrapper = container.querySelector<HTMLDivElement>('#' + WRAPPER_ID);\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.id = WRAPPER_ID;\n wrapper.className = 'Stamp-toolbar-injector';\n wrapper.setAttribute('data-stamp-area', 'true');\n wrapper.style.display = 'inline-flex';\n wrapper.style.alignItems = 'center';\n wrapper.style.gap = '4px';\n wrapper.style.marginInlineStart = '6px';\n wrapper.style.paddingInlineStart = '6px';\n wrapper.style.borderInlineStart = '1px solid var(--default-border-color, rgba(0,0,0,0.1))';\n // Insert before the \"More tools\" dropdown button (last child) nếu có,\n // còn không thì append cuối.\n const moreTools = container.querySelector('.App-toolbar__extra-tools-dropdown')\n ?? container.querySelector('button[aria-label*=\"More tools\" i]');\n if (moreTools && moreTools.parentElement === container) {\n container.insertBefore(wrapper, moreTools);\n } else {\n container.appendChild(wrapper);\n }\n }\n setMountNode(wrapper);\n };\n\n tryMount();\n\n const root = document.querySelector('.excalidraw') ?? document.body;\n observer = new MutationObserver(() => {\n if (cancelled) return;\n const stillThere = document.getElementById(WRAPPER_ID);\n if (!stillThere) {\n attempts = 0;\n tryMount();\n }\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n observer?.disconnect();\n document.getElementById(WRAPPER_ID)?.remove();\n };\n }, [enabled]);\n\n if (!enabled || !mountNode) return null;\n\n return createPortal(\n <>\n {stamps.map((stamp) => (\n <StampToolButton\n key={stamp.kind}\n icon={stamp.toolbarIcon}\n keybind={stamp.toolbarLabel}\n label={stamp.toolbarTitle}\n active={activeStampKind === stamp.kind}\n onClick={() => onToggle(stamp.kind)}\n dataTestId={stamp.toolbarTestId}\n />\n ))}\n </>,\n mountNode,\n );\n}\n\ninterface StampToolButtonProps {\n icon: React.ReactNode;\n keybind: string;\n label: string;\n active: boolean;\n onClick: () => void;\n dataTestId?: string;\n}\n\n/**\n * Render mỗi nút như 1 `<button>` đơn lẻ với class `.ToolIcon.Shape` —\n * cùng pattern Excalidraw apply cho các tool radio: outer `<label class=\"ToolIcon Shape\">`\n * sizing 36×36, inner `.ToolIcon__icon`. Vì Excalidraw set `.ToolIcon` flex layout\n * và size lên label, ta render button trực tiếp ở vị trí ngang hàng (không lồng\n * trong label) và áp dụng CSS sizing thủ công cho khớp 36×36.\n */\nfunction StampToolButton({ icon, keybind, label, active, onClick, dataTestId }: StampToolButtonProps) {\n return (\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n aria-pressed={active}\n onClick={onClick}\n data-testid={dataTestId}\n className=\"ToolIcon Shape\"\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 'var(--lg-button-size, 2.25rem)',\n height: 'var(--lg-button-size, 2.25rem)',\n padding: 0,\n margin: 0,\n background: active ? 'var(--color-primary-light, #e0e7ff)' : 'transparent',\n border: 0,\n borderRadius: 'var(--space-factor, 0.25rem)',\n color: active ? 'var(--color-primary, #6965db)' : 'var(--icon-fill-color, #1b1b1f)',\n cursor: 'pointer',\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--button-hover-bg, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n <div\n aria-hidden=\"true\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n {icon}\n </div>\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n right: '3px',\n bottom: '2px',\n fontSize: '0.5625rem',\n color: 'var(--keybinding-color, #6b7280)',\n fontFamily: 'var(--ui-font, system-ui)',\n fontWeight: 400,\n pointerEvents: 'none',\n }}\n >\n {keybind}\n </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","// 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 dynamic from 'next/dynamic';\nimport { 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 { 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 = dynamic(\n async () => (await import('./ExcalidrawWithMenus')).ExcalidrawWithMenus,\n {\n ssr: false,\n loading: () => (\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);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nconst SYNC_THROTTLE_MS = 200;\nconst DOUBLE_CLICK_MS = 400;\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 [isDarkTheme, setIsDarkTheme] = useState(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 lastClickRef = useRef<{ time: number; elementId: string | null }>({\n time: 0,\n elementId: 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 const nextDark = appState?.theme === 'dark';\n setIsDarkTheme((prev) => (prev === nextDark ? prev : nextDark));\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 api.updateScene({\n appState: { ...appState, croppingElementId: null, selectedElementIds: {} },\n });\n openStamp(stamp.kind, {\n id: el.id,\n customData: (el as { customData?: unknown }).customData,\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 = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_activeTool: any, pointerDownState: any) => {\n if (readOnly) 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 openStamp(stamp.kind, {\n id: hitElement.id,\n customData: hitElement.customData,\n });\n },\n [readOnly, stamps, 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 // Capture-phase keydown: chặn mọi phím (trừ editable input + modifier + Esc +\n // phím tắt của stamp đã đăng ký) để các shortcut 1-9, V, R, D... của\n // Excalidraw không trigger tool change sau editor.\n const stampShortcutKeys = useMemo(\n () => new Set(stamps.map((s) => s.shortcutKey.toLowerCase())),\n [stamps],\n );\n\n useEffect(() => {\n if (!activeStamp) return;\n const ALLOWED_KEYS = new Set([\n 'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Shift', 'Control', 'Alt', 'Meta', 'CapsLock',\n 'Home', 'End', 'PageUp', 'PageDown',\n ]);\n\n const 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\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 (stampShortcutKeys.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, stampShortcutKeys]);\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 // ---- Click ra ngoài → auto-insert (nếu có nội dung) rồi đóng ----\n useEffect(() => {\n if (!activeStamp) return;\n let lastFireTime = 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 - lastFireTime < 50) return;\n lastFireTime = now;\n // Trigger insert qua Host imperative API. Host quyết định có chèn được\n // không (geometry: log.length > 0; latex: input không rỗng + preview ok).\n hostRef.current?.tryInsert();\n closeStamp();\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, closeStamp]);\n\n return (\n <div className={`relative h-full w-full${isDarkTheme ? ' theme--dark' : ''}`}>\n <Excalidraw\n excalidrawAPI={(a: ExApi) => { setApi(a); onApi?.(a); }}\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\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/serialize.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/theme.ts","../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/geometry-2d/serialize.ts","../src/stamps/geometry-2d/renderInline.ts","../src/stamps/geometry-2d/render.ts","../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/index.tsx","../src/stamps/latex/editor/LeftPanel.tsx","../src/stamps/latex/render.ts","../src/stamps/latex/editor/EditorPopover.tsx","../src/stamps/latex/index.tsx","../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/serialize.ts","../src/stamps/geometry-3d/render.ts","../src/stamps/geometry-3d/index.tsx","../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/parser.ts","../src/stamps/graph-2d/editor/handlers.ts","../src/stamps/graph-2d/editor/MiniBoard.tsx","../src/stamps/graph-2d/serialize.ts","../src/stamps/graph-2d/renderObjects.ts","../src/stamps/graph-2d/render.ts","../src/stamps/graph-2d/editor/EditorPanel.tsx","../src/stamps/graph-2d/index.tsx","../src/stamps/shared/registry.ts","../src/stamps/shared/ToolbarInjector.tsx","../src/stamps/shared/useShortcuts.ts","../src/stamps/shared/restoreStampFiles.ts","../src/core/persistence/sceneStore.ts","../src/core/persistence/fileStore.ts","../src/Whiteboard.tsx"],"names":["hits","name","pick","sc","obj","stroke","jsx","jsxs","useState","useRef","useEffect","useCallback","Fragment","rect","w","left","top","useMemo","createPortal","GeometryEditorPanel","A_CODE","forwardRef","GeometryStampHost","useImperativeHandle","Shell","Section","LeftPanel","EditorPopover","LatexStampHost","paletteFor","radius","center","MiniBoard3D","useId","p","EditorPanel","TOOLTIP_DELAY_MS","CloseIcon","UndoIcon","useToolHoverTooltip","Geometry3DStampHost","ResetViewIcon","scanRoots","GraphEditorPanel","Graph2DStampHost"],"mappings":"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","file":"index.mjs","sourcesContent":["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","// 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","// 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","/**\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","// 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","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","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","// 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 { renderGeometrySvgFromState } from './render';\nimport type { SerializedBoard } from './serialize';\nimport type {\n BaseStampCustomData,\n RestoredStampFile,\n StampHostProps,\n StampHostHandle,\n StampType,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\n\n// ============== Custom data type + guard ==============\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\n// ============== Host component ==============\n\nconst INITIAL_GEOM_STATE: GeomBoardState = {\n tool: 'move',\n showAxis: false,\n showGrid: false,\n canUndo: false,\n};\n\nconst 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 // Initial state cho editor: parse từ customData nếu đang re-edit, null nếu tạo mới.\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\n// ============== Stamp definition ==============\n\nconst GeometryIcon = (\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 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","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","'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 { EditorPopover as LatexEditorPopover, type EditorPopoverHandle as LatexEditorHandle } from './editor/EditorPopover';\nimport { insertStampImage } from '../shared/insertImage';\nimport { renderLatexToSvg } from './render';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport type {\n BaseStampCustomData,\n RestoredStampFile,\n StampHostProps,\n StampHostHandle,\n StampType,\n} from '../shared/types';\n\n// ============== Custom data type + guard ==============\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\n// ============== Host component ==============\n\nconst 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\n// ============== Stamp definition ==============\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","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","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","\"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';\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode,\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 type {\n StampHostProps,\n StampHostHandle,\n StampType,\n RestoredStampFile,\n} from '../shared/types';\nimport {\n isGeometry3DCustomData,\n parseSerializedBoard3D,\n type Geometry3DCustomData,\n type SerializedBoard3D,\n} from './serialize';\nimport { renderGeometry3DSvgFromState } from './render';\nimport { useIsMobile } from '../shared/useIsMobile';\n\nexport { isGeometry3DCustomData };\nexport type { Geometry3DCustomData };\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\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 <path d=\"M12 3 L20 8 L20 16 L12 21 L4 16 L4 8 Z\" />\n <path d=\"M12 3 L12 21 M4 8 L12 12 L20 8 M4 16 L12 12 L20 16\" />\n </svg>\n);\n\nexport const geometry3dStamp: StampType = {\n kind: 'geometry3d',\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","// 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","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","'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","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","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","'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 { renderGraph2dSvgFromState } from './render';\nimport {\n parseSerializedGraph,\n EMPTY_GRAPH,\n type SerializedGraph,\n} from './serialize';\nimport type {\n BaseStampCustomData,\n RestoredStampFile,\n StampHostProps,\n StampHostHandle,\n StampType,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\n\n// ============== Custom data type + guard ==============\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\n// ============== Host component ==============\n\nconst INITIAL_GRAPH_STATE: GraphState = {\n tool: 'move',\n showAxis: true,\n showGrid: true,\n canUndo: false,\n};\n\nconst 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\n// ============== Stamp definition ==============\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 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/**\n * Set stamp mặc định dùng trong Whiteboard. Consumer có thể\n * truyền custom array để bật/tắt từng stamp hoặc đăng ký stamp mới.\n *\n * Để thêm 1 stamp mới (vd chart):\n * 1. Tạo `src/stamp/registry/chart.tsx` với StampType object.\n * 2. Add vào DEFAULT_STAMPS ở dưới, HOẶC consumer truyền\n * `<Whiteboard stamps={[...DEFAULT_STAMPS, chartStamp]} />`.\n */\nexport const DEFAULT_STAMPS: ReadonlyArray<StampType> = Object.freeze([\n geometryStamp,\n latexStamp,\n geometry3dStamp,\n graph2dStamp,\n]);\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 — replace logic hardcode trong types.ts. */\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 TOOLBAR_WRAPPER_ID = 'stamp-toolbar-portal-wrapper';\nconst MENU_WRAPPER_ID = 'stamp-menu-portal-wrapper';\n\n/**\n * Inject stamp buttons vào Excalidraw.\n *\n * - **Desktop** (`.excalidraw` không có class `--mobile`): chèn nút vào thanh\n * tool chính (`.App-toolbar .Stack_horizontal`), trước nút \"More tools\".\n * - **Mobile** (`.excalidraw.excalidraw--mobile`): main toolbar chật, không\n * cuộn được → bỏ inject vào toolbar. Thay vào đó, khi user mở popover \"More\n * tools\", chèn các stamp dưới dạng `.dropdown-menu-item` ở đầu menu.\n *\n * Phát hiện mobile bằng `MutationObserver` theo class của `.excalidraw` root —\n * Excalidraw tự switch class khi đổi orientation hoặc resize.\n */\nexport function ToolbarInjector({\n enabled,\n activeStampKind,\n onToggle,\n stamps = DEFAULT_STAMPS,\n}: Props) {\n const [isMobile, setIsMobile] = useState(false);\n const [toolbarMount, setToolbarMount] = useState<HTMLElement | null>(null);\n const [menuMount, setMenuMount] = useState<HTMLElement | null>(null);\n\n // Refs giữ giá trị mới nhất → so sánh trong observer để bail-out no-op\n // setState. Tránh trigger setState liên tục trong khi Excalidraw đang commit\n // (React 19 sẽ warn \"scheduled from inside an update function\").\n const isMobileRef = useRef(false);\n const toolbarMountRef = useRef<HTMLElement | null>(null);\n const menuMountRef = useRef<HTMLElement | null>(null);\n\n // --- Detect mobile via .excalidraw--mobile class on root ---\n useEffect(() => {\n if (!enabled) {\n if (isMobileRef.current !== false) {\n isMobileRef.current = false;\n setIsMobile(false);\n }\n return;\n }\n let cancelled = false;\n let observer: MutationObserver | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempts = 0;\n\n const apply = (next: boolean) => {\n if (cancelled || isMobileRef.current === next) return;\n isMobileRef.current = next;\n queueMicrotask(() => {\n if (!cancelled) setIsMobile(next);\n });\n };\n\n const attach = () => {\n if (cancelled) return;\n const root = document.querySelector<HTMLElement>('.excalidraw');\n if (!root) {\n if (attempts++ < 20) timer = setTimeout(attach, 100);\n return;\n }\n apply(root.classList.contains('excalidraw--mobile'));\n observer = new MutationObserver(() => {\n apply(root.classList.contains('excalidraw--mobile'));\n });\n observer.observe(root, { attributes: true, attributeFilter: ['class'] });\n };\n attach();\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n observer?.disconnect();\n };\n }, [enabled]);\n\n // --- Desktop: inject into main toolbar (.App-toolbar .Stack_horizontal) ---\n useEffect(() => {\n if (!enabled || isMobile) {\n if (toolbarMountRef.current !== null) {\n toolbarMountRef.current = null;\n setToolbarMount(null);\n }\n document.getElementById(TOOLBAR_WRAPPER_ID)?.remove();\n return;\n }\n\n let cancelled = false;\n let attempts = 0;\n let observer: MutationObserver | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const apply = (next: HTMLElement | null) => {\n if (cancelled || toolbarMountRef.current === next) return;\n toolbarMountRef.current = next;\n queueMicrotask(() => {\n if (!cancelled) setToolbarMount(next);\n });\n };\n\n const tryMount = () => {\n if (cancelled) return;\n const container =\n document.querySelector('.excalidraw .App-toolbar .Stack_horizontal') ??\n document.querySelector('.App-toolbar .Stack_horizontal');\n if (!container) {\n if (attempts++ < 20) timer = setTimeout(tryMount, 100);\n return;\n }\n let wrapper = container.querySelector<HTMLDivElement>('#' + TOOLBAR_WRAPPER_ID);\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.id = TOOLBAR_WRAPPER_ID;\n wrapper.className = 'Stamp-toolbar-injector';\n wrapper.setAttribute('data-stamp-area', 'true');\n wrapper.style.display = 'inline-flex';\n wrapper.style.alignItems = 'center';\n wrapper.style.gap = '4px';\n wrapper.style.marginInlineStart = '6px';\n wrapper.style.paddingInlineStart = '6px';\n wrapper.style.borderInlineStart =\n '1px solid var(--default-border-color, rgba(0,0,0,0.1))';\n const moreTools =\n container.querySelector('.App-toolbar__extra-tools-dropdown') ??\n container.querySelector('button[aria-label*=\"More tools\" i]');\n if (moreTools && moreTools.parentElement === container) {\n container.insertBefore(wrapper, moreTools);\n } else {\n container.appendChild(wrapper);\n }\n }\n apply(wrapper);\n };\n\n tryMount();\n\n const root = document.querySelector('.excalidraw') ?? document.body;\n observer = new MutationObserver(() => {\n if (cancelled) return;\n const stillThere = document.getElementById(TOOLBAR_WRAPPER_ID);\n if (!stillThere) {\n attempts = 0;\n tryMount();\n }\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n observer?.disconnect();\n document.getElementById(TOOLBAR_WRAPPER_ID)?.remove();\n };\n }, [enabled, isMobile]);\n\n // --- Mobile: inject into dropdown-menu when popover opens ---\n useEffect(() => {\n if (!enabled || !isMobile) {\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>(\n '.dropdown-menu--mobile .dropdown-menu-container',\n );\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.style.display = 'contents';\n container.insertBefore(wrapper, container.firstChild);\n }\n apply(wrapper);\n };\n\n // Coalesce burst of DOM mutations into one rAF pass\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, isMobile]);\n\n if (!enabled) return null;\n\n const closeMobileMenu = () => {\n // Click the trigger to collapse the popover\n const trigger = document.querySelector<HTMLButtonElement>(\n '.App-toolbar__extra-tools-trigger',\n );\n trigger?.click();\n };\n\n const desktopButtons = !isMobile && toolbarMount\n ? createPortal(\n <>\n {stamps.map((stamp) => (\n <StampToolButton\n key={stamp.kind}\n icon={stamp.toolbarIcon}\n keybind={stamp.toolbarLabel}\n label={stamp.toolbarTitle}\n active={activeStampKind === stamp.kind}\n onClick={() => onToggle(stamp.kind)}\n dataTestId={stamp.toolbarTestId}\n />\n ))}\n </>,\n toolbarMount,\n )\n : null;\n\n const mobileMenuItems = isMobile && menuMount\n ? 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 closeMobileMenu();\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 : null;\n\n return (\n <>\n {desktopButtons}\n {mobileMenuItems}\n </>\n );\n}\n\ninterface StampToolButtonProps {\n icon: React.ReactNode;\n keybind: string;\n label: string;\n active: boolean;\n onClick: () => void;\n dataTestId?: string;\n}\n\n/**\n * Render mỗi nút như 1 `<button>` đơn lẻ với class `.ToolIcon.Shape` —\n * cùng pattern Excalidraw apply cho các tool radio: outer `<label class=\"ToolIcon Shape\">`\n * sizing 36×36, inner `.ToolIcon__icon`. Vì Excalidraw set `.ToolIcon` flex layout\n * và size lên label, ta render button trực tiếp ở vị trí ngang hàng (không lồng\n * trong label) và áp dụng CSS sizing thủ công cho khớp 36×36.\n */\nfunction StampToolButton({ icon, keybind, label, active, onClick, dataTestId }: StampToolButtonProps) {\n return (\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n aria-pressed={active}\n onClick={onClick}\n data-testid={dataTestId}\n className=\"ToolIcon Shape\"\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 'var(--lg-button-size, 2.25rem)',\n height: 'var(--lg-button-size, 2.25rem)',\n padding: 0,\n margin: 0,\n background: active ? 'var(--color-primary-light, #e0e7ff)' : 'transparent',\n border: 0,\n borderRadius: 'var(--space-factor, 0.25rem)',\n color: active ? 'var(--color-primary, #6965db)' : 'var(--icon-fill-color, #1b1b1f)',\n cursor: 'pointer',\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--button-hover-bg, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n <div\n aria-hidden=\"true\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n {icon}\n </div>\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n right: '3px',\n bottom: '2px',\n fontSize: '0.5625rem',\n color: 'var(--keybinding-color, #6b7280)',\n fontFamily: 'var(--ui-font, system-ui)',\n fontWeight: 400,\n pointerEvents: 'none',\n }}\n >\n {keybind}\n </span>\n </button>\n );\n}\n\ninterface StampMenuItemProps {\n icon: React.ReactNode;\n label: string;\n active: boolean;\n onClick: () => void;\n dataTestId?: string;\n}\n\n/**\n * Render menu item kế thừa style native `.dropdown-menu-item` của Excalidraw\n * mobile popover: flex row, icon trái + label phải, height 2.25rem, hover bg.\n * Active state dùng class `.dropdown-menu-item--selected`.\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","// 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 dynamic from 'next/dynamic';\nimport { 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 { 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 = dynamic(\n async () => (await import('./ExcalidrawWithMenus')).ExcalidrawWithMenus,\n {\n ssr: false,\n loading: () => (\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);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nconst SYNC_THROTTLE_MS = 200;\nconst DOUBLE_CLICK_MS = 400;\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 lastClickRef = useRef<{ time: number; elementId: string | null }>({\n time: 0,\n elementId: 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 = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_activeTool: any, pointerDownState: any) => {\n if (readOnly) 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 openStamp(stamp.kind, {\n id: hitElement.id,\n customData: hitElement.customData,\n });\n },\n [readOnly, stamps, 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 // Capture-phase keydown: chặn mọi phím (trừ editable input + modifier + Esc +\n // phím tắt của stamp đã đăng ký) để các shortcut 1-9, V, R, D... của\n // Excalidraw không trigger tool change sau editor.\n const stampShortcutKeys = useMemo(\n () => new Set(stamps.map((s) => s.shortcutKey.toLowerCase())),\n [stamps],\n );\n\n useEffect(() => {\n if (!activeStamp) return;\n const ALLOWED_KEYS = new Set([\n 'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Shift', 'Control', 'Alt', 'Meta', 'CapsLock',\n 'Home', 'End', 'PageUp', 'PageDown',\n ]);\n\n const 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\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 (stampShortcutKeys.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, stampShortcutKeys]);\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 // ---- Click ra ngoài → auto-insert (nếu có nội dung) rồi đóng ----\n useEffect(() => {\n if (!activeStamp) return;\n let lastFireTime = 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 - lastFireTime < 50) return;\n lastFireTime = now;\n // Trigger insert qua Host imperative API. Host quyết định có chèn được\n // không (geometry: log.length > 0; latex: input không rỗng + preview ok).\n hostRef.current?.tryInsert();\n closeStamp();\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, closeStamp]);\n\n return (\n <div className={`relative h-full w-full${isDarkTheme ? ' theme--dark' : ''}`}>\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\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"]}
|