@xom11/whiteboard 0.9.1 → 0.10.1

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.
Files changed (40) hide show
  1. package/dist/{chunk-ZVN356JZ.mjs → chunk-D257NCQW.mjs} +3 -3
  2. package/dist/{chunk-ZVN356JZ.mjs.map → chunk-D257NCQW.mjs.map} +1 -1
  3. package/dist/{chunk-KEYZ5EZT.mjs → chunk-G7FR3AIV.mjs} +44 -5
  4. package/dist/chunk-G7FR3AIV.mjs.map +1 -0
  5. package/dist/chunk-PWIMZIB6.mjs +62 -0
  6. package/dist/chunk-PWIMZIB6.mjs.map +1 -0
  7. package/dist/chunk-WQOABS6N.mjs +197 -0
  8. package/dist/chunk-WQOABS6N.mjs.map +1 -0
  9. package/dist/{chunk-DU3RHKT5.mjs → chunk-YVJP7NRG.mjs} +4 -4
  10. package/dist/{chunk-DU3RHKT5.mjs.map → chunk-YVJP7NRG.mjs.map} +1 -1
  11. package/dist/geometry-2d.js +102 -18
  12. package/dist/geometry-2d.js.map +1 -1
  13. package/dist/geometry-2d.mjs +2 -2
  14. package/dist/geometry-3d.js +152 -93
  15. package/dist/geometry-3d.js.map +1 -1
  16. package/dist/geometry-3d.mjs +2 -2
  17. package/dist/graph-2d.js +88 -20
  18. package/dist/graph-2d.js.map +1 -1
  19. package/dist/graph-2d.mjs +1 -1
  20. package/dist/{host-PIIDSMVE.mjs → host-N6ACNJKI.mjs} +51 -12
  21. package/dist/host-N6ACNJKI.mjs.map +1 -0
  22. package/dist/{host-LZH2FZ2N.mjs → host-NKGV6RF2.mjs} +91 -23
  23. package/dist/host-NKGV6RF2.mjs.map +1 -0
  24. package/dist/{host-VDNAJMLC.mjs → host-XVK7UCRE.mjs} +62 -18
  25. package/dist/host-XVK7UCRE.mjs.map +1 -0
  26. package/dist/index.d.mts +127 -1
  27. package/dist/index.d.ts +127 -1
  28. package/dist/index.js +1336 -177
  29. package/dist/index.js.map +1 -1
  30. package/dist/index.mjs +993 -52
  31. package/dist/index.mjs.map +1 -1
  32. package/package.json +4 -1
  33. package/dist/chunk-DU2NFHRR.mjs +0 -103
  34. package/dist/chunk-DU2NFHRR.mjs.map +0 -1
  35. package/dist/chunk-IUVV52HO.mjs +0 -144
  36. package/dist/chunk-IUVV52HO.mjs.map +0 -1
  37. package/dist/chunk-KEYZ5EZT.mjs.map +0 -1
  38. package/dist/host-LZH2FZ2N.mjs.map +0 -1
  39. package/dist/host-PIIDSMVE.mjs.map +0 -1
  40. package/dist/host-VDNAJMLC.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stamps/geometry-2d/renderInline.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-2d/serialize.ts","../src/stamps/shared/safeJsx.ts","../src/stamps/geometry-2d/render.ts","../src/stamps/geometry-2d/types.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/handlers.ts","../src/stamps/geometry-2d/editor/MiniBoard.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/geometry-2d/editor/LeftPanel.tsx","../src/stamps/shared/excalidrawPalette.ts","../src/stamps/shared/useIsMobile.ts","../src/stamps/geometry-2d/editor/PropertiesPopover.tsx","../src/stamps/geometry-2d/editor/TransformParamPopover.tsx","../src/stamps/geometry-2d/editor/EditorPanel.tsx","../src/stamps/shared/useChordShortcut.ts","../src/stamps/shared/svgToImage.ts","../src/stamps/shared/insertImage.ts","../src/stamps/geometry-2d/host.tsx","../src/stamps/geometry-2d/index.tsx"],"names":["jsx","jsxs","hits","name","pick","sc","useRef","useId","useState","useCallback","useEffect","obj","Fragment","useMemo","createPortal","useLayoutEffect","rect","w","left","top","forwardRef","GeometryEditorPanel","useImperativeHandle","A_CODE","GeometryStampHost","lazy"],"mappings":"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","file":"geometry-2d.js","sourcesContent":["export function renderGeometryToSvg(boardContainer: HTMLElement): string {\n const svgEl = boardContainer.querySelector('svg');\n if (!svgEl) throw new Error('renderGeometryToSvg: no SVG found in board container');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n return new XMLSerializer().serializeToString(clone);\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Creation log của JSXGraphMiniBoard lưu attrs dưới dạng \"sentinel\" string\n// (`@stroke`, `@axis`, `@grid`, `@label`) thay vì màu cụ thể. Khi:\n// 1. Editor render real-time → resolve theo `isDark` của editor.\n// 2. Offscreen re-render (sau reload / sau khi switch theme) → resolve theo\n// `isDark` của canvas Excalidraw hiện tại.\n//\n// Nhờ vậy stamp tự đổi màu khi user switch dark/light, giống các nét vẽ\n// native của Excalidraw.\n\nexport const themeStroke = (dark: boolean) => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean) => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean) => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean) => (dark ? '#e2e8f0' : '#000000');\n\nexport interface GeomPalette {\n stroke: string;\n axis: string;\n grid: string;\n label: string;\n}\n\nexport function paletteFor(isDark: boolean): GeomPalette {\n return {\n stroke: themeStroke(isDark),\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n };\n}\n\nconst SENTINEL_MAP: Record<string, keyof GeomPalette> = {\n '@stroke': 'stroke',\n '@axis': 'axis',\n '@grid': 'grid',\n '@label': 'label',\n};\n\n/**\n * Walk attrs object/array/string và thay sentinel bằng màu thực từ palette.\n * Đệ quy để hỗ trợ nested attrs (ví dụ polygon's `borders.strokeColor`).\n * Trả về object mới — input giữ nguyên (immutable, an toàn cho log).\n */\nexport function resolveAttrColors<T>(attrs: T, palette: GeomPalette): T {\n if (typeof attrs === 'string') {\n const key = SENTINEL_MAP[attrs];\n return (key ? palette[key] : attrs) as T;\n }\n if (Array.isArray(attrs)) {\n return attrs.map((a) => resolveAttrColors(a, palette)) as unknown as T;\n }\n if (attrs && typeof attrs === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(attrs as Record<string, unknown>)) {\n out[k] = resolveAttrColors(v, palette);\n }\n return out as T;\n }\n return attrs;\n}\n","// JSXGraph không có built-in getJSON. Component giữ MỘT LOG riêng của các create() call\n// do user trigger, pass log đó vào serializeBoard. Replay = gọi board.create() theo thứ tự log.\n//\n// type === 'transform': args là [refs đến điểm/đường/scalar], attrs là { type: 'translate'|'rotate'|'reflect'|'scale', ... }.\n// Object trả về (kết quả board.create('transform', ...)) được đăng ký vào idMap như mọi element khác\n// để point/line phụ thuộc reference được bằng id ('j5' → JSXGraph transform object).\n//\n// Log lưu màu dưới dạng sentinel ('@stroke', '@axis', '@grid', '@label') để\n// theme-neutral. Khi replay, palette resolve thành màu thực theo `isDark` hiện\n// tại (truyền qua options.palette).\n\nimport { paletteFor, resolveAttrColors, type GeomPalette } from './editor/theme';\n\nexport interface SerializedElement {\n type: string;\n args: unknown[];\n attrs: Record<string, unknown>;\n id: string;\n}\n\nexport interface SerializedBoard {\n bbox: [number, number, number, number];\n elements: SerializedElement[];\n showAxis?: boolean;\n showGrid?: boolean;\n}\n\ninterface BoardLike {\n getBoundingBox(): [number, number, number, number];\n create(type: string, args: unknown[], attrs: Record<string, unknown>): unknown;\n}\n\nexport function serializeBoard(\n board: BoardLike,\n log: SerializedElement[],\n options: { showAxis?: boolean; showGrid?: boolean } = {},\n): SerializedBoard {\n return {\n bbox: board.getBoundingBox(),\n elements: log.map(e => ({ type: e.type, args: e.args, attrs: e.attrs, id: e.id })),\n showAxis: !!options.showAxis,\n showGrid: !!options.showGrid,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction createValueLabel(board: any, target: any): unknown {\n if (!board || !target) return null;\n const e = (target.elType ?? target.type ?? '').toString().toLowerCase();\n if (e === 'segment' || e === 'line' || e === 'arrow') {\n const p1 = target.point1, p2 = target.point2;\n if (!p1 || !p2) return null;\n return board.create('text', [\n () => (p1.X() + p2.X()) / 2 + 0.15,\n () => (p1.Y() + p2.Y()) / 2 + 0.25,\n () => {\n const len = Math.hypot(p2.X() - p1.X(), p2.Y() - p1.Y());\n const name = typeof target.name === 'string' && target.name ? target.name : 'd';\n return `${name} = ${len.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n if (e === 'circle' || e === 'circumcircle') {\n const center = target.center ?? target.midpoint ?? target.point1;\n if (!center) return null;\n return board.create('text', [\n () => center.X() + 0.3,\n () => center.Y() + 0.3,\n () => {\n const r = typeof target.Radius === 'function' ? target.Radius() : 0;\n const name = typeof target.name === 'string' && target.name ? target.name : 'r';\n return `${name} = ${r.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n return null;\n}\n\nexport interface DeserializeOptions {\n /** Theme-aware palette để resolve sentinel attrs. Mặc định = light. */\n palette?: GeomPalette;\n}\n\nexport function deserializeIntoBoard(\n board: BoardLike,\n serialized: SerializedBoard,\n options: DeserializeOptions = {},\n): void {\n // Replay: args may contain references to earlier elements by our serialized id (\"j0\", \"j1\"…).\n // We resolve those to actual JSXGraph objects via a local id→object map. Nested\n // arrays are also resolved recursively — needed for dilate, which logs the\n // transform parent of a transformed point as [\"j2\",\"j3\",\"j4\"] (a chain of 3\n // transforms passed to `board.create('point', [src, [t1,t2,t3]])`).\n const palette = options.palette ?? paletteFor(false);\n const idMap = new Map<string, unknown>();\n const resolve = (a: unknown): unknown => {\n if (typeof a === 'string' && idMap.has(a)) return idMap.get(a);\n if (Array.isArray(a)) return a.map(resolve);\n return a;\n };\n for (const el of serialized.elements) {\n const resolvedArgs = el.args.map(resolve);\n if (el.type === 'valueLabel') {\n const target = resolvedArgs[0];\n const txt = createValueLabel(board, target);\n if (txt) idMap.set(el.id, txt);\n continue;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, palette);\n const created = board.create(el.type, resolvedArgs, themedAttrs);\n idMap.set(el.id, created);\n }\n}\n","const isDev = (() => {\n try {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n } catch {\n return false;\n }\n})();\n\n/**\n * Wrap JSXGraph operations that can throw on stale/missing state.\n * In dev mode: log to console. In prod: silent swallow + return fallback.\n *\n * @param label Short tag for grep-ability (vd \"removeObject\", \"board.update\").\n * @param fn Operation to execute.\n * @param fallback Value to return if fn throws (default: undefined).\n */\nexport function safeJsx<T>(label: string, fn: () => T): T | undefined;\nexport function safeJsx<T>(label: string, fn: () => T, fallback: T): T;\nexport function safeJsx<T>(label: string, fn: () => T, fallback?: T): T | undefined {\n try {\n return fn();\n } catch (err) {\n if (isDev) {\n // eslint-disable-next-line no-console\n console.warn('[whiteboard:jsxgraph]', label, err);\n }\n return fallback;\n }\n}\n","import { renderGeometryToSvg } from './renderInline';\nimport { deserializeIntoBoard, type SerializedBoard } from './serialize';\nimport { paletteFor } from './editor/theme';\nimport { safeJsx } from '../shared/safeJsx';\n\n/**\n * Re-render geometry SVG từ jsonState đã serialize. Dùng cho:\n * 1. Restore math-stamp file sau khi reload page (Excalidraw mất binary files).\n * 2. Generate SVG lúc INSERT (thay vì clone DOM với màu theo theme editor).\n *\n * LƯU Ý quan trọng — luôn dùng LIGHT palette (nét đậm). Excalidraw apply CSS\n * `filter: invert(93%) hue-rotate(180deg)` lên canvas trong dark mode → nét\n * đậm tự đảo thành sáng. Nếu ta bake nét sáng vào SVG cho dark mode, filter\n * sẽ đảo thành đậm → chìm vào nền tối. Giải pháp: luôn dùng nét đậm + để\n * Excalidraw tự lo invert.\n *\n * Implementation: tạo 1 div ẩn (off-screen, real dimensions để JSXGraph render\n * chuẩn), initBoard, replay creation log từ jsonState, dump SVG, dọn dẹp.\n *\n * 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 safeJsx('render.applyOptions', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.text.strokeColor = palette.label;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n opts.label.strokeColor = palette.label;\n opts.axis = opts.axis || {};\n opts.axis.strokeColor = palette.axis;\n opts.grid = opts.grid || {};\n opts.grid.strokeColor = palette.grid;\n }\n });\n const 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 safeJsx('render.freeBoard', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (board) (JXG as any).JSXGraph.freeBoard(board);\n });\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface GeometryCustomData extends BaseStampCustomData {\n kind: 'geometry';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGeometryCustomData(data: unknown): data is GeometryCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<GeometryCustomData>;\n return d.kind === 'geometry' && d.version === 1 && typeof d.jsonState === 'string';\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type JxgObj = any;\n\nexport type DefKind = 'point' | 'segment' | 'line' | 'ray' | 'arrow' | 'circleCenter' | 'circle3';\n\nexport interface DefiningPointsResult {\n kind: DefKind;\n points: JxgObj[];\n attrs: Record<string, unknown>;\n}\n\nconst LINE_LIKE = new Set(['line', 'segment', 'arrow']);\n\nfunction copyVisAttrs(obj: JxgObj): Record<string, unknown> {\n const v = obj?.visProp ?? {};\n const pick = (k: string) => v?.[k];\n const out: Record<string, unknown> = {};\n const mapping: Array<[string, string]> = [\n ['strokecolor', 'strokeColor'],\n ['strokewidth', 'strokeWidth'],\n ['strokeopacity', 'strokeOpacity'],\n ['dash', 'dash'],\n ['fillcolor', 'fillColor'],\n ['fillopacity', 'fillOpacity'],\n ];\n for (const [from, to] of mapping) {\n const val = pick(from);\n if (val !== undefined) out[to] = val;\n }\n return out;\n}\n\nexport function getDefiningPoints(obj: JxgObj): DefiningPointsResult | null {\n if (!obj) return null;\n const e = (obj.elType ?? obj.type ?? '').toString().toLowerCase();\n if (e === 'point' || e === 'glider' || e === 'midpoint') {\n return { kind: 'point', points: [obj], attrs: copyVisAttrs(obj) };\n }\n if (LINE_LIKE.has(e) && obj.point1 && obj.point2) {\n const kind: DefKind = e === 'segment' ? 'segment' : e === 'arrow' ? 'arrow' : 'line';\n return { kind, points: [obj.point1, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circle' && obj.center && obj.point2) {\n return { kind: 'circleCenter', points: [obj.center, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circumcircle' && obj.point1 && obj.point2 && obj.point3) {\n return {\n kind: 'circle3',\n points: [obj.point1, obj.point2, obj.point3],\n attrs: copyVisAttrs(obj),\n };\n }\n return null;\n}\n\nexport type TransformInput =\n | { kind: 'translate'; vectorPoints: [JxgObj, JxgObj] }\n | { kind: 'rotate'; center: JxgObj; angleDeg: number }\n | { kind: 'reflectLine'; line: JxgObj }\n | { kind: 'reflectPoint'; center: JxgObj }\n | { kind: 'dilate'; center: JxgObj; k: number };\n\nexport interface TransformSpec {\n params: unknown[];\n attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' };\n /**\n * Khi `chain` được set, finalizeTransformCreate dựng từng transform trong chain\n * (theo thứ tự) rồi pass mảng vào `board.create('point', [src, [t1, t2, t3]])`.\n * Dùng cho `dilate` (scale-quanh-điểm) vì JSXGraph 'scale' không nhận center.\n */\n chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }>;\n}\n\nexport function buildTransformSpec(input: TransformInput): TransformSpec {\n switch (input.kind) {\n case 'translate': {\n // Literal dx/dy (không phải callback) để serialize qua JSON.stringify được.\n // Trade-off: transformed object không cập nhật khi user kéo điểm vector — chấp nhận.\n const [a, b] = input.vectorPoints;\n const dx = b.X() - a.X();\n const dy = b.Y() - a.Y();\n return { params: [dx, dy], attrs: { type: 'translate' } };\n }\n case 'rotate':\n return {\n params: [(input.angleDeg * Math.PI) / 180, input.center],\n attrs: { type: 'rotate' },\n };\n case 'reflectLine':\n return { params: [input.line], attrs: { type: 'reflect' } };\n case 'reflectPoint':\n // JSXGraph 'scale' chỉ nhận 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 bị lờ → trước đây sai. Đối xứng qua điểm = quay 180°\n // quanh điểm đó. Dùng 'rotate' (params [angle, center]) để chuẩn.\n return { params: [Math.PI, input.center], attrs: { type: 'rotate' } };\n case 'dilate':\n // JSXGraph 'scale' chỉ nhận đúng 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 làm constructor throw. Dilate quanh điểm c bằng tỷ số k\n // = compose 3 phép: T(-c) → S(k,k) → T(+c). Sinh ra chain (mảng spec) thay vì\n // 1 spec đơn; consumer (finalizeTransformCreate) tự nhận biết.\n return {\n params: [],\n attrs: { type: 'scale' },\n chain: [\n { params: [-input.center.X(), -input.center.Y()], attrs: { type: 'translate' as const } },\n { params: [input.k, input.k], attrs: { type: 'scale' as const } },\n { params: [input.center.X(), input.center.Y()], attrs: { type: 'translate' as const } },\n ],\n };\n }\n}\n","import React from 'react';\n\n/**\n * Static catalog của tất cả GeomTool — không phụ thuộc board state, chỉ là\n * metadata (key, label, hint, icon SVG, group, số click cần, accept types).\n *\n * Tách khỏi JSXGraphMiniBoard.tsx để (1) giảm size file component và (2) dễ\n * mở rộng tool mới mà không cần đụng vào board logic.\n */\n\n// Tool keys — match GeoGebra-style toolset\nexport type GeomTool =\n | 'move'\n | 'select'\n | 'point'\n | 'midpoint'\n | 'segment'\n | 'line'\n | 'ray'\n | 'vector'\n | 'perpendicular'\n | 'parallel'\n | 'perpBisector'\n | 'angleBisector'\n | 'polygon'\n | 'regularPolygon'\n | 'circleCenter'\n | 'circle3'\n | 'tangent'\n | 'angle'\n | 'distance'\n | 'area'\n | 'toggleLabel'\n | 'toggleVisible'\n | 'delete'\n | 'translate'\n | 'rotate'\n | 'reflectLine'\n | 'reflectPoint'\n | 'dilate';\n\nexport interface ToolDef {\n key: GeomTool;\n label: string;\n hint: string;\n icon: React.ReactNode;\n group:\n | 'move'\n | 'point'\n | 'line'\n | 'construct'\n | 'polygon'\n | 'circle'\n | 'measure'\n | 'edit'\n | 'transform';\n /** Số click cần trước khi action fire. -1 = mở (polygon đóng bằng click lại điểm đầu). */\n needs: number;\n /** Loại object accept ở mỗi slot. 'any' = point hoặc non-point. */\n accepts?: Array<'point' | 'line' | 'circle' | 'any'>;\n}\n\n// ============== Tool icons — inline SVG ==============\nconst Icon = {\n cursor: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\"/></svg>\n ),\n select: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\" fill=\"none\"/><rect x=\"2.5\" y=\"2.5\" width=\"19\" height=\"19\" strokeDasharray=\"3 2\" fill=\"none\"/></svg>\n ),\n point: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\"/></svg>\n ),\n midpoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"20\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/></svg>\n ),\n segment: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\"/><circle cx=\"5\" cy=\"18\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"6\" r=\"1.7\" fill=\"currentColor\"/></svg>\n ),\n line: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"4\"/><circle cx=\"8\" cy=\"16\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"16\" cy=\"8\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n ray: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"19\" x2=\"22\" y2=\"2\"/><circle cx=\"5\" cy=\"19\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n vector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><polyline points=\"14,4 20,4 20,10\"/></svg>\n ),\n perpendicular: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"4\"/><rect x=\"12\" y=\"14\" width=\"4\" height=\"4\" fill=\"none\"/></svg>\n ),\n parallel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"5\"/><line x1=\"3\" y1=\"19\" x2=\"21\" y2=\"15\"/></svg>\n ),\n perpBisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><circle cx=\"6\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"18\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n bisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"12\" strokeDasharray=\"3 2\"/></svg>\n ),\n polygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"6,6 18,6 22,14 12,22 4,14\"/></svg>\n ),\n regularPolygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"12,3 20,8 20,17 12,22 4,17 4,8\"/></svg>\n ),\n circleCenter: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n circle3: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"4\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"20\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"16\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n tangent: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"11\" cy=\"13\" r=\"6\"/><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"2\"/></svg>\n ),\n angle: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"6\"/><path d=\"M14 20 A 10 10 0 0 0 11 13\" /></svg>\n ),\n distance: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"8\" x2=\"4\" y2=\"16\"/><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"16\"/></svg>\n ),\n area: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><polygon points=\"5,6 19,6 21,14 13,21 3,15\" fill=\"currentColor\" fillOpacity=\"0.2\"/></svg>\n ),\n toggleLabel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><text x=\"3\" y=\"18\" fontSize=\"16\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text><text x=\"13\" y=\"14\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text></svg>\n ),\n toggleVisible: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3.5\" fill=\"currentColor\" fillOpacity=\"0.4\"/><circle cx=\"12\" cy=\"12\" r=\"3.5\"/><circle cx=\"20\" cy=\"6\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\"/><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/></svg>\n ),\n translate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 4 L20 20\"/><polygon points=\"14,4 20,4 20,10\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n rotate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 12 A8 8 0 1 1 12 20\"/><polyline points=\"4,9 4,13 8,13\"/></svg>\n ),\n reflectLine: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><polygon points=\"4,6 9,12 4,18\" fill=\"currentColor\"/><polygon points=\"20,6 15,12 20,18\" fill=\"currentColor\"/></svg>\n ),\n reflectPoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"19\" r=\"1.6\" fill=\"currentColor\"/><line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" strokeDasharray=\"2 2\"/></svg>\n ),\n dilate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><polygon points=\"6,18 18,18 12,6\" fillOpacity=\"0.1\" fill=\"currentColor\"/><polygon points=\"9,15 15,15 12,11\" fill=\"currentColor\"/></svg>\n ),\n};\n\n// ============== Tool catalog ==============\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Kéo điểm hoặc xoay nền', icon: Icon.cursor, group: 'move', needs: 0 },\n { key: 'select', label: 'Chọn', hint: 'Click để chọn 1 / Shift+click để bỏ thêm / Kéo nền để khoanh vùng / DEL để xoá', icon: Icon.select, group: 'move', needs: 0 },\n { key: 'point', label: 'Điểm mới', hint: 'Click để thêm điểm', icon: Icon.point, group: 'point', needs: 1 },\n { key: 'midpoint', label: 'Trung điểm', hint: 'Click 2 điểm có sẵn', icon: Icon.midpoint, group: 'point', needs: 2, accepts: ['point', 'point'] },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Click 2 điểm', icon: Icon.segment, group: 'line', needs: 2 },\n { key: 'line', label: 'Đường thẳng qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.line, group: 'line', needs: 2 },\n { key: 'ray', label: 'Tia qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.ray, group: 'line', needs: 2 },\n { key: 'vector', label: 'Vector', hint: 'Click 2 điểm', icon: Icon.vector, group: 'line', needs: 2 },\n { key: 'perpendicular', label: 'Đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpendicular, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'parallel', label: 'Đường song song', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.parallel, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'perpBisector', label: 'Đường trung trực', hint: 'Click 2 điểm có sẵn', icon: Icon.perpBisector, group: 'construct', needs: 2, accepts: ['point', 'point'] },\n { key: 'angleBisector', label: 'Đường phân giác', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.bisector, group: 'construct', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'polygon', label: 'Đa giác', hint: 'Click các điểm, click lại điểm đầu để đóng', icon: Icon.polygon, group: 'polygon', needs: -1 },\n { key: 'regularPolygon', label: 'Đa giác đều', hint: 'Click 2 điểm rồi nhập số cạnh', icon: Icon.regularPolygon, group: 'polygon', needs: 2, accepts: ['point', 'point'] },\n { key: 'circleCenter', label: 'Đường tròn (tâm + điểm)', hint: 'Click tâm rồi 1 điểm trên đường tròn', icon: Icon.circleCenter, group: 'circle', needs: 2 },\n { key: 'circle3', label: 'Đường tròn qua 3 điểm', hint: 'Click 3 điểm', icon: Icon.circle3, group: 'circle', needs: 3 },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Click 1 điểm + 1 đường tròn có sẵn', icon: Icon.tangent, group: 'circle', needs: 2, accepts: ['point', 'circle'] },\n { key: 'angle', label: 'Góc', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.angle, group: 'measure', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'distance', label: 'Khoảng cách', hint: 'Click 2 điểm có sẵn', icon: Icon.distance, group: 'measure', needs: 2, accepts: ['point', 'point'] },\n { key: 'area', label: 'Diện tích', hint: 'Click các đỉnh, click lại điểm đầu để đóng', icon: Icon.area, group: 'measure', needs: -1 },\n { key: 'toggleLabel', label: 'Hiện/ẩn tên', hint: 'Click vào đối tượng', icon: Icon.toggleLabel, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'toggleVisible', label: 'Hiện/ẩn đối tượng', hint: 'Click vào đối tượng', icon: Icon.toggleVisible, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'delete', label: 'Xoá', hint: 'Click vào đối tượng', icon: Icon.trash, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'translate', label: 'Phép tịnh tiến', hint: 'Click object → 2 điểm tạo vector', icon: Icon.translate, group: 'transform', needs: 3, accepts: ['any', 'point', 'point'] },\n { key: 'rotate', label: 'Quay đối tượng', hint: 'Click object → tâm quay → nhập góc', icon: Icon.rotate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'reflectLine', label: 'Đối xứng qua đường thẳng', hint: 'Click object → đường thẳng', icon: Icon.reflectLine, group: 'transform', needs: 2, accepts: ['any', 'line'] },\n { key: 'reflectPoint', label: 'Đối xứng qua điểm', hint: 'Click object → tâm đối xứng', icon: Icon.reflectPoint, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'dilate', label: 'Phép vị tự', hint: 'Click object → tâm → nhập tỷ số k', icon: Icon.dilate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n];\n\nexport const GROUP_LABELS: Record<ToolDef['group'], string> = {\n move: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường',\n construct: 'Dựng hình',\n polygon: 'Đa giác',\n circle: 'Đường tròn',\n measure: 'Đo lường',\n edit: 'Chỉnh sửa',\n transform: 'Phép biến hình',\n};\n\nexport type GeomGroup = ToolDef['group'];\n\n// Positional A..I — letter shortcut cho chord 2-phím.\n// Khớp đúng thứ tự hiển thị trong LeftPanel (derive từ TOOLS phía trên).\nexport const GROUP_ORDER: GeomGroup[] = [\n 'move',\n 'point',\n 'line',\n 'construct',\n 'polygon',\n 'circle',\n 'measure',\n 'edit',\n 'transform',\n];\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: GeomGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n\nexport function groupForLetter(ch: string): GeomGroup | null {\n if (ch.length !== 1) return null;\n const upper = ch.toUpperCase();\n const idx = upper.charCodeAt(0) - A_CODE;\n if (idx < 0 || idx >= GROUP_ORDER.length) return null;\n return GROUP_ORDER[idx];\n}\n\n// ============== Object-type matching ==============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\n/** Phân loại JSXGraph element type vào nhóm dùng cho accept-matching. */\nexport function objKind(obj: JxgObj): 'point' | 'line' | 'circle' | 'other' {\n if (!obj) return 'other';\n const e = (obj.elType || obj.type || '').toString().toLowerCase();\n if (e === 'point' || e === 'glider' || e === 'midpoint') return 'point';\n if (\n e === 'line' || e === 'segment' || e === 'arrow' || e === 'axis' ||\n e === 'normal' || e === 'parallel' || e === 'perpendicular' ||\n e === 'tangent' || e === 'bisector' || e === 'perpendicularsegment'\n ) return 'line';\n if (e === 'circle' || e === 'circumcircle') return 'circle';\n return 'other';\n}\n\nexport function acceptMatches(\n tool: ToolDef,\n slot: number,\n kind: 'point' | 'line' | 'circle' | 'other',\n): boolean {\n if (!tool.accepts) return kind === 'point' || tool.key === 'point';\n const a = tool.accepts[slot];\n if (!a) return false;\n if (a === 'any') return kind !== 'other';\n return a === kind;\n}\n","/**\n * handlers.ts — Pure pointer/tool handler functions extracted from MiniBoard.tsx.\n *\n * Each function receives a HandlerCtx object containing the refs and callbacks\n * it needs, and a raw JSXGraph event object. No React, no DOM manipulation\n * beyond what JSXGraph provides through its API.\n *\n * The ctx pattern lets MiniBoard.tsx pass a stable object reference captured\n * at useEffect time, while the individual properties stay up-to-date because\n * they are refs (whose .current is read at call time) or stable callbacks\n * (whose identities don't change across renders).\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nimport { TOOLS, objKind, type GeomTool, type ToolDef } from './tools';\nimport { buildTransformSpec } from './transforms';\nimport { safeJsx } from '../../shared/safeJsx';\n\n// ─── Context shape ────────────────────────────────────────────────────────────\n\nexport interface HandlerCtx {\n // Refs (read .current at call time)\n boardRef: { current: JxgObj };\n toolRef: { current: GeomTool };\n pendingRef: { current: JxgObj[] };\n previewSegRef: { current: JxgObj[] };\n axisObjsRef: { current: { x?: JxgObj; y?: JxgObj } };\n selectedSetRef: { current: Set<JxgObj> };\n marqueeRef: { current: { startSx: number; startSy: number; rect?: JxgObj } | null };\n moveDownRef: { current: { sx: number; sy: number } | null };\n lastMoveClickRef: { current: { obj: JxgObj | null; time: number } };\n pendingTransformRef: { current: { tool: 'rotate' | 'dilate' | 'regularPolygon'; source: JxgObj; center: JxgObj; anchorScreen: { x: number; y: number } } | null };\n phantomRef: { current: JxgObj };\n previewShapeRef: { current: JxgObj };\n previewRafRef: { current: number | null };\n jxgRef: { current: JxgObj };\n\n // Stable callbacks (identity doesn't change)\n screenCoordsOf: (evt: JxgObj) => [number, number] | null;\n objectsAt: (evt: JxgObj) => JxgObj[];\n promoteLabel: (o: JxgObj) => JxgObj;\n findNearestPoint: (evt: JxgObj, tolPx?: number) => JxgObj | null;\n toggleSelect: (obj: JxgObj, additive: boolean) => void;\n clearSelection: () => void;\n applySelectionStyle: (obj: JxgObj) => void;\n localIdOf: (obj: JxgObj) => string | null;\n nextLabel: () => string;\n create: (type: string, args: unknown[], attrs?: Record<string, unknown>) => JxgObj;\n finalize: (toolDef: ToolDef, picks: JxgObj[]) => void;\n finalizeTransformCreate: (spec: Parameters<typeof buildTransformSpec>[0] extends never ? never : ReturnType<typeof buildTransformSpec>, source: JxgObj) => void;\n clearPending: () => void;\n clearPreviewSegs: () => void;\n refreshPreview: () => void;\n flashWarn: (msg: string) => void;\n emitTransform: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void;\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n emitSelect: (snap: any) => void;\n setPendingCount: (n: number) => void;\n setSelectionTick: (fn: (t: number) => number) => void;\n}\n\n// ─── board.on('down') ─────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleDown(ctx: HandlerCtx, e: any): void {\n if (!ctx.boardRef.current) return;\n const t = ctx.toolRef.current;\n if (t === 'move') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n ctx.moveDownRef.current = { sx, sy };\n return;\n }\n if (t === 'select') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n 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 safeJsx('handlers.removeObject(intersect.tmp0)', () => ctx.boardRef.current.removeObject(tmp0));\n safeJsx('handlers.removeObject(intersect.tmp1)', () => ctx.boardRef.current.removeObject(tmp1));\n const idx = d0 <= d1 ? 0 : 1;\n ctx.create('intersection', [aId, bId, idx], attrs);\n }\n return;\n } catch {\n // fallback: tạo điểm tự do\n }\n }\n }\n const name = ctx.nextLabel();\n ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n return;\n }\n\n // Edit / single-target tools (toggleLabel, toggleVisible, delete)\n if (toolDef.needs === 1 && toolDef.accepts) {\n // Fall back to generous point snap if hasPoint missed a small point.\n const hit = bestHit ?? ctx.findNearestPoint(e, 12);\n if (hit) ctx.finalize(toolDef, [hit]);\n else ctx.flashWarn('Click vào một đối tượng để áp dụng');\n return;\n }\n\n // Polygon / area: variable-length, close on click near starting point\n if (toolDef.needs === -1) {\n const snappedPoint = snapPointForPointSlot();\n // Close ring first: if user clicks back on the first pending point\n // (with at least 3 points already), finalize. Done before push so the\n // first point isn't duplicated into pending.\n if (ctx.pendingRef.current.length >= 3 && snappedPoint && snappedPoint === ctx.pendingRef.current[0]) {\n ctx.clearPreviewSegs();\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n return;\n }\n // Reject re-picking an interior pending vertex (would create a degenerate edge).\n if (snappedPoint && ctx.pendingRef.current.includes(snappedPoint)) {\n ctx.flashWarn('Đỉnh này đã có — click điểm khác hoặc click lại điểm đầu để đóng');\n return;\n }\n // Otherwise pick (snap-to-existing or create) a new vertex\n const pick: JxgObj = snappedPoint ?? (() => {\n const name = ctx.nextLabel();\n return ctx.create('point', [x, y], { name, color: '@stroke', size: 3 });\n })();\n // Live preview: draw an edge from the previous pending vertex to\n // this new one so the user sees the polygon being built.\n if (ctx.pendingRef.current.length > 0 && ctx.boardRef.current) {\n const prev = ctx.pendingRef.current[ctx.pendingRef.current.length - 1];\n safeJsx('handlers.createPreviewSegment', () => {\n const seg = ctx.boardRef.current.create('segment', [prev, pick], {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.75,\n fixed: true,\n highlight: false,\n withLabel: false,\n });\n ctx.previewSegRef.current.push(seg);\n });\n }\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n return;\n }\n\n // Multi-click branch. Two sub-modes:\n // A) Strict + order-flexible: tool declared `accepts`. We bind each\n // click to whatever required kind is still unfilled, regardless\n // of click order. E.g. perpendicular accepts ['point', 'line']\n // and the user can click line-then-point or point-then-line.\n // B) Lenient + order-fixed: tool has no `accepts` (segment, line,\n // ray, vector, circle*, ...). All slots want points; missing\n // snaps create a fresh point.\n let pick: JxgObj | null = null;\n\n if (toolDef.accepts) {\n // --- Mode A: strict, order-flexible ---\n const usedKinds = ctx.pendingRef.current.map((p) => objKind(p));\n const remaining: Array<'point' | 'line' | 'circle' | 'any'> = [...toolDef.accepts];\n for (const u of usedKinds) {\n if (u === 'other') continue;\n const i = remaining.indexOf(u);\n if (i >= 0) remaining.splice(i, 1);\n }\n const strictPoint = hits.find((o) => objKind(o) === 'point') ?? null;\n const lineHit = hits.find((o) => objKind(o) === 'line') ?? null;\n const circleHit = hits.find((o) => objKind(o) === 'circle') ?? null;\n // Priority: an exact point hit binds to 'point' first (so a click\n // landing right on a vertex isn't stolen by a line/circle passing\n // through it). Typed line/circle bind next. 'any' slot accepts any\n // remaining hit (point/line/circle). Generous point-snap is the\n // last resort when only a 'point' slot is open.\n //\n // Previously 'any' was checked AFTER the snap fallback for point,\n // which meant tools like dilate (accepts ['any', 'point']) couldn't\n // pick a segment for the 'any' slot — the snap branch absorbed the\n // click and 'any' was never evaluated.\n if (remaining.includes('point') && strictPoint) pick = strictPoint;\n else if (remaining.includes('line') && lineHit) pick = lineHit;\n else if (remaining.includes('circle') && circleHit) pick = circleHit;\n else if (remaining.includes('any') && (strictPoint || lineHit || circleHit)) {\n pick = strictPoint ?? lineHit ?? circleHit;\n } else if (remaining.includes('point')) {\n const near = ctx.findNearestPoint(e, 12);\n if (near) pick = near;\n }\n if (!pick) {\n const needs = remaining.map((k) =>\n k === 'point' ? 'một điểm' : k === 'line' ? 'một đường/đoạn' : k === 'circle' ? 'một đường tròn' : 'một đối tượng',\n );\n ctx.flashWarn(`Còn cần click vào ${needs.join(' + ')} có sẵn`);\n return;\n }\n // Reject duplicate picks (e.g. click the same point twice for midpoint\n // would produce a degenerate object pointing at itself).\n if (ctx.pendingRef.current.includes(pick)) {\n ctx.flashWarn('Đã chọn đối tượng này — chọn đối tượng khác');\n return;\n }\n } else {\n // --- Mode B: lenient, all slots want a point ---\n const snapped = snapPointForPointSlot();\n if (snapped && ctx.pendingRef.current.includes(snapped)) {\n // Same point clicked twice → would produce a zero-length segment / etc.\n ctx.flashWarn('Đã chọn điểm này — chọn điểm khác hoặc click chỗ trống');\n return;\n }\n if (snapped) pick = snapped;\n else {\n const name = ctx.nextLabel();\n pick = ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n }\n }\n\n if (!pick) return;\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n\n if (ctx.pendingRef.current.length >= toolDef.needs) {\n const tk = toolDef.key;\n if (tk === 'rotate' || tk === 'dilate') {\n const source = ctx.pendingRef.current[0];\n const center = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source, center, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n // Don't clearPending here — wait for confirm/cancel\n return;\n }\n if (tk === 'regularPolygon') {\n const p1 = ctx.pendingRef.current[0];\n const p2 = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source: p1, center: p2, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n return;\n }\n if (tk === 'translate') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'translate', vectorPoints: [ctx.pendingRef.current[1], ctx.pendingRef.current[2]] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectLine') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectLine', line: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectPoint') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectPoint', center: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n } else {\n ctx.refreshPreview();\n }\n}\n\n// ─── board.on('up') ───────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleUp(ctx: HandlerCtx, e: any): void {\n const t = ctx.toolRef.current;\n if (t === 'select') {\n // Finalize marquee: any object hit-tested inside the rectangle gets\n // added to the selection. Single click on object was already handled\n // in `down`; here we only care about drag end.\n const mq = ctx.marqueeRef.current;\n ctx.marqueeRef.current = null;\n ctx.moveDownRef.current = null;\n if (!mq) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [ex, ey] = sc;\n if (mq.rect) { safeJsx('handlers.removeObject(marquee.rect)', () => ctx.boardRef.current?.removeObject(mq.rect)); }\n if (Math.hypot(ex - mq.startSx, ey - mq.startSy) < 4) return; // not a real drag\n const x1 = Math.min(mq.startSx, ex), x2 = Math.max(mq.startSx, ex);\n const y1 = Math.min(mq.startSy, ey), y2 = Math.max(mq.startSy, ey);\n const board = ctx.boardRef.current;\n if (!board) return;\n const list = (board.objectsList || []) as JxgObj[];\n for (const o of list) {\n if (o === ctx.axisObjsRef.current.x || o === ctx.axisObjsRef.current.y) continue;\n // Points: include if their screen coord falls inside the rect.\n const kind = objKind(o);\n if (kind === 'point') {\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n if (pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2) {\n if (!ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n // Lines/segments/circles: simple test — include if either defining\n // point falls inside (good enough for marquee UX without doing\n // expensive line-rectangle intersections).\n else if (kind === 'line' || kind === 'circle') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const defs: any[] = [o.point1, o.point2, o.center, o.midpoint, o.point3].filter(Boolean);\n const anyInside = defs.some((p) => {\n const pc = p?.coords?.scrCoords;\n return pc && pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2;\n });\n if (anyInside && !ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n ctx.setSelectionTick((tt) => tt + 1);\n safeJsx('handlers.board.update(marquee)', () => board.update());\n return;\n }\n if (t !== 'move') return;\n const start = ctx.moveDownRef.current;\n ctx.moveDownRef.current = null;\n if (!start) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const moved = Math.hypot(sx - start.sx, sy - start.sy);\n if (moved > 4) return; // drag, không phải click\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // 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 safeJsx('handlers.removeObject(marquee.prevRect)', () => ctx.boardRef.current.removeObject(rect));\n }\n safeJsx('handlers.createMarqueePolygon', () => {\n ctx.marqueeRef.current!.rect = ctx.boardRef.current.create('polygon', [\n [x1u, y1u], [x2u, y1u], [x2u, y2u], [x1u, y2u],\n ], {\n fillColor: '#06b6d4', fillOpacity: 0.08,\n borders: { strokeColor: '#06b6d4', strokeWidth: 1, dash: 2 },\n vertices: { visible: false },\n fixed: true, highlight: false, withLabel: false,\n });\n });\n }\n return;\n }\n const ph = ctx.phantomRef.current;\n if (!ph || !ctx.boardRef.current) return;\n if (ctx.previewRafRef.current != null) return;\n ctx.previewRafRef.current = requestAnimationFrame(() => {\n ctx.previewRafRef.current = null;\n if (!ctx.boardRef.current || !ctx.phantomRef.current) return;\n safeJsx('handlers.phantomMove', () => {\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const JXG: any = ctx.jxgRef.current;\n if (!JXG) return;\n ctx.phantomRef.current.setPositionDirectly(JXG.COORDS_BY_USER, [coords[0], coords[1]]);\n ctx.boardRef.current.update();\n });\n });\n}\n","'use client';\nimport React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { deserializeIntoBoard, type SerializedBoard, type SerializedElement } from '../serialize';\nimport { getDefiningPoints, buildTransformSpec } from './transforms';\nimport {\n TOOLS,\n GROUP_LABELS,\n acceptMatches,\n objKind,\n type GeomTool,\n type ToolDef,\n} from './tools';\nimport { paletteFor, resolveAttrColors, themeAxis, themeGrid, themeLabel } from './theme';\nimport { handleDown, handleUp, handleMove, type HandlerCtx } from './handlers';\nimport { safeJsx } from '../../shared/safeJsx';\n\n// Re-export để backward-compat với consumer cũ.\nexport { TOOLS, GROUP_LABELS };\nexport type { GeomTool, ToolDef };\n\nexport interface MiniBoardHandle {\n getContainer: () => HTMLDivElement | null;\n getCreationLog: () => SerializedElement[];\n getBbox: () => [number, number, number, number];\n getShowAxis: () => boolean;\n getShowGrid: () => boolean;\n /** Đổi tool active từ bên ngoài (panel trái). */\n setTool: (t: GeomTool) => void;\n getTool: () => GeomTool;\n /** Toggle layout từ bên ngoài. */\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n /** Undo bước cuối. */\n undo: () => void;\n /** Có gì để undo? */\n canUndo: () => boolean;\n /** Redo bước vừa undo. */\n redo: () => void;\n /** Có gì để redo? */\n canRedo: () => boolean;\n /** Subscribe khi state thay đổi (tool / showAxis / showGrid / undo). */\n subscribe: (cb: () => void) => () => void;\n /** Đọc snapshot thuộc tính object (cho popover). */\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => ObjectSnapshot | null;\n /** Mutate thuộc tính + sync log. */\n mutateObject: (obj: unknown, patch: { attrs?: Record<string, unknown>; remove?: boolean }) => void;\n /** Liệt kê tên của tất cả point hiện tại (để popover disambiguate khi rename). */\n getAllPointNames: () => string[];\n /** Subscribe selection-from-move-tool. Trả về unsubscribe. */\n onSelect: (cb: (snap: ObjectSnapshot) => void) => () => void;\n onTransformParam: (cb: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void) => () => void;\n confirmTransformParam: (value: number) => void;\n cancelTransformParam: () => void;\n /** Số đối tượng đang chọn (qua tool 'select'). */\n getSelectionSize: () => number;\n /** Bỏ chọn tất cả. */\n clearSelection: () => void;\n /** Xoá tất cả đối tượng đang chọn (cascade-aware). */\n deleteSelection: () => void;\n}\n\nexport interface ObjectSnapshot {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any;\n kind: 'point' | 'line' | 'circle';\n name: string;\n color: string;\n dash: number;\n width: number;\n face: 'o' | 'circle' | 'cross' | 'plus';\n /** Đang hiển thị tên (label) hay không. */\n showLabel: boolean;\n /** Đang có value-label (text gắn động) hay không. */\n showValue: boolean;\n screenCoords: { x: number; y: number };\n}\n\ninterface Props {\n onReady: (handle: MiniBoardHandle) => void;\n initialState: SerializedBoard | null;\n /** Khi true → board nền tối, điểm/đường/label dùng tone sáng để contrast. */\n isDark?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport const JSXGraphMiniBoard: React.FC<Props> = ({ onReady, initialState, isDark }) => {\n const isDarkRef = useRef(!!isDark);\n isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_jxgmini';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const axisObjsRef = useRef<{ x?: JxgObj; y?: JxgObj }>({});\n const creationLogRef = useRef<SerializedElement[]>([]);\n const redoStackRef = useRef<SerializedElement[]>([]);\n\n const [tool, setTool] = useState<GeomTool>('move');\n const toolRef = useRef<GeomTool>('move');\n toolRef.current = tool;\n\n const [showAxis, setShowAxis] = useState<boolean>(initialState?.showAxis ?? false);\n const [showGrid, setShowGrid] = useState<boolean>(initialState?.showGrid ?? false);\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n // Track JSXGraph point objects created during the session, indexed by our serialized id.\n // We also track the LAST object created (for non-point types like segment) so accept-matching works.\n const objMapRef = useRef<Map<string, JxgObj>>(new Map());\n\n // Map target line/circle → dynamic value-label text element (hiển thị độ dài\n // / bán kính). Khi user toggle \"Show Value\", ta tạo/xoá text này. Serialize:\n // entry type='valueLabel' trong creationLog với args=[targetLocalId].\n const valueLabelsRef = useRef<Map<JxgObj, JxgObj>>(new Map());\n\n // Pending picks for multi-click tools: array of JSXGraph object refs\n const pendingRef = useRef<JxgObj[]>([]);\n const [, setPendingCount] = useState(0);\n\n // Selection state — tool 'select' adds clicked objects here. Selected objects\n // get a cyan highlight stroke (original style preserved in selOriginalRef so\n // we can restore on deselect).\n const selectedSetRef = useRef<Set<JxgObj>>(new Set());\n const selOriginalRef = useRef<Map<JxgObj, { strokeColor?: unknown; strokeWidth?: unknown }>>(new Map());\n const [, setSelectionTick] = useState(0);\n // Marquee state during select-tool drag.\n const marqueeRef = useRef<{ startSx: number; startSy: number; rect?: JxgObj } | null>(null);\n\n // Live preview segments while building a polygon/area: drawn between\n // consecutive pending points so the user sees the shape forming.\n const previewSegRef = useRef<JxgObj[]>([]);\n // Phantom point that tracks mouse position for 2-3 click tool live preview.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const phantomRef = useRef<any>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const previewShapeRef = useRef<any>(null);\n const previewRafRef = useRef<number | null>(null);\n // Tick state forces re-render so the undo button enable state stays in sync\n // with creationLogRef (which is mutated outside React).\n const [historyTick, setHistoryTick] = useState(0);\n // Transient warning shown when a strict construction tool gets a click that\n // didn't land on the required existing object (so the user knows why nothing\n // happened). Auto-clears.\n const [, setWarn] = useState<string | null>(null);\n const warnTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flashWarn = useCallback((msg: string) => {\n if (warnTimerRef.current) clearTimeout(warnTimerRef.current);\n setWarn(msg);\n warnTimerRef.current = setTimeout(() => setWarn(null), 1800);\n }, []);\n useEffect(() => () => { if (warnTimerRef.current) clearTimeout(warnTimerRef.current); }, []);\n\n const labelIdxRef = useRef(0);\n const nextLabel = useCallback(() => {\n const idx = labelIdxRef.current;\n const suffix = idx >= 26 ? String(Math.floor(idx / 26)) : '';\n const code = 'A'.charCodeAt(0) + (idx % 26);\n labelIdxRef.current = idx + 1;\n return String.fromCharCode(code) + suffix;\n }, []);\n\n const nextLocalId = useCallback(() => 'j' + creationLogRef.current.length, []);\n\n // Build a fresh JSXGraph object id resolver for serialization.\n // We log args using local string IDs (\"j0\"); resolve to JSXGraph objects in-memory via objMapRef.\n 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 // Push entry mới vào creationLog + clear redoStack (chuẩn UX undo/redo).\n const pushCreationLog = useCallback((entry: SerializedElement) => {\n creationLogRef.current.push(entry);\n redoStackRef.current = [];\n }, []);\n\n const pushLog = useCallback(\n (id: string, type: string, args: unknown[], attrs: Record<string, unknown>, obj: JxgObj) => {\n pushCreationLog({ id, type, args, attrs });\n objMapRef.current.set(id, obj);\n setHistoryTick((t) => t + 1);\n },\n [pushCreationLog],\n );\n\n const create = useCallback(\n (type: string, args: unknown[], attrs: Record<string, unknown> = {}): JxgObj => {\n if (!boardRef.current) return null;\n const id = nextLocalId();\n const resolved = resolveArgs(args);\n // attrs có thể chứa sentinel `@stroke/@axis/@grid/@label` — log lưu nguyên\n // bản (theme-neutral), JSXGraph nhận màu thực resolve theo theme hiện tại.\n const resolvedAttrs = resolveAttrColors(attrs, paletteFor(isDarkRef.current));\n const obj = boardRef.current.create(type, resolved, resolvedAttrs);\n pushLog(id, type, args, attrs, obj);\n return obj;\n },\n [nextLocalId, resolveArgs, pushLog],\n );\n\n // Get local serialized id for a JSXGraph object (reverse lookup).\n 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 safeJsx('MiniBoard.removeObject(valueLabel)', () => boardRef.current.removeObject(vl));\n valueLabelsRef.current.delete(o);\n }\n safeJsx('MiniBoard.removeObject(target)', () => boardRef.current.removeObject(o));\n // Cascade: walk log and drop entries whose JSXGraph object was also removed\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, obj] of objMapRef.current.entries()) {\n // JSXGraph keeps objects in board.objects keyed by JSXGraph internal id\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (obj as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n // Drop dead entries from log + map\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n return;\n }\n if (typeof patch.valueLabel === 'boolean') {\n const has = valueLabelsRef.current.has(o);\n if (patch.valueLabel && !has) {\n const txt = createValueLabelFor(o);\n if (txt) {\n valueLabelsRef.current.set(o, txt);\n // Log entry tổng hợp để reload regenerate được. args=[targetLocalId].\n const targetId = localIdOf(o);\n if (targetId) {\n const id = nextLocalId();\n pushCreationLog({ id, type: 'valueLabel', args: [targetId], attrs: {} });\n objMapRef.current.set(id, txt);\n setHistoryTick((t) => t + 1);\n }\n }\n } else if (!patch.valueLabel && has) {\n const txt = valueLabelsRef.current.get(o);\n valueLabelsRef.current.delete(o);\n if (txt) {\n safeJsx('MiniBoard.removeObject(valueLabel.text)', () => boardRef.current.removeObject(txt));\n // Xoá log entry value-label tương ứng\n const txtId = localIdOf(txt);\n if (txtId) {\n creationLogRef.current = creationLogRef.current.filter((e) => e.id !== txtId);\n objMapRef.current.delete(txtId);\n setHistoryTick((t) => t + 1);\n }\n }\n }\n }\n if (patch.attrs) {\n safeJsx('MiniBoard.setAttribute', () => o.setAttribute(patch.attrs));\n const id = localIdOf(o);\n if (id) {\n const entry = creationLogRef.current.find((e) => e.id === id);\n if (entry) entry.attrs = { ...entry.attrs, ...patch.attrs };\n setHistoryTick((t) => t + 1);\n }\n }\n safeJsx('MiniBoard.board.update(mutate)', () => boardRef.current.update());\n }, [createValueLabelFor, localIdOf, nextLocalId]);\n\n const clearPreviewSegs = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n for (const s of previewSegRef.current) {\n safeJsx('MiniBoard.removeObject(previewSeg)', () => b.removeObject(s));\n }\n previewSegRef.current = [];\n }, []);\n\n const removePhantom = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n if (previewShapeRef.current) {\n safeJsx('MiniBoard.removeObject(previewShape)', () => b.removeObject(previewShapeRef.current));\n previewShapeRef.current = null;\n }\n if (phantomRef.current) {\n safeJsx('MiniBoard.removeObject(phantom)', () => b.removeObject(phantomRef.current));\n phantomRef.current = null;\n }\n }, []);\n\n const clearPending = useCallback(() => {\n removePhantom();\n clearPreviewSegs();\n pendingRef.current = [];\n setPendingCount(0);\n }, [clearPreviewSegs, removePhantom]);\n\n // === Selection helpers (used by the `select` tool) ===\n const applySelectionStyle = useCallback((obj: JxgObj) => {\n if (!obj || selOriginalRef.current.has(obj)) return;\n safeJsx('MiniBoard.applySelectionStyle', () => {\n const visProp = obj.visProp ?? {};\n selOriginalRef.current.set(obj, {\n strokeColor: visProp.strokecolor,\n strokeWidth: visProp.strokewidth,\n });\n const kind = objKind(obj);\n if (kind === 'point') {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n } else {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n }\n });\n }, []);\n\n const restoreSelectionStyle = useCallback((obj: JxgObj) => {\n const orig = selOriginalRef.current.get(obj);\n if (!orig) return;\n safeJsx('MiniBoard.restoreSelectionStyle', () => {\n const attrs: Record<string, unknown> = {};\n if (orig.strokeColor !== undefined) attrs.strokeColor = orig.strokeColor;\n if (orig.strokeWidth !== undefined) attrs.strokeWidth = orig.strokeWidth;\n obj.setAttribute(attrs);\n });\n selOriginalRef.current.delete(obj);\n }, []);\n\n const clearSelection = useCallback(() => {\n for (const o of selectedSetRef.current) {\n restoreSelectionStyle(o);\n }\n selectedSetRef.current.clear();\n setSelectionTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(clearSelection)', () => boardRef.current?.update());\n }, [restoreSelectionStyle]);\n\n const toggleSelect = useCallback((obj: JxgObj, additive: boolean) => {\n if (!obj) return;\n if (!additive) {\n // Single-click replace: clear others first.\n for (const o of selectedSetRef.current) {\n if (o !== obj) restoreSelectionStyle(o);\n }\n selectedSetRef.current = new Set([obj]);\n applySelectionStyle(obj);\n } else {\n if (selectedSetRef.current.has(obj)) {\n restoreSelectionStyle(obj);\n selectedSetRef.current.delete(obj);\n } else {\n selectedSetRef.current.add(obj);\n applySelectionStyle(obj);\n }\n }\n setSelectionTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(toggleSelect)', () => boardRef.current?.update());\n }, [applySelectionStyle, restoreSelectionStyle]);\n\n const deleteSelected = useCallback(() => {\n const board = boardRef.current;\n if (!board) return;\n if (selectedSetRef.current.size === 0) return;\n // Drop highlight first so removal doesn't try to setAttribute on dead obj.\n for (const o of selectedSetRef.current) selOriginalRef.current.delete(o);\n for (const o of selectedSetRef.current) {\n safeJsx('MiniBoard.removeObject(selected)', () => board.removeObject(o));\n }\n selectedSetRef.current.clear();\n // Cascade-prune log (same approach as delete tool)\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board.objects && board.objects[jxgId]) aliveIds.add(id);\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setSelectionTick((t) => t + 1);\n setHistoryTick((t) => t + 1);\n }, []);\n\n // Build a transient preview shape (not logged) from pending picks + phantom point.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const buildPreview = useCallback((toolDef: ToolDef, picks: any[], phantom: any) => {\n const b = boardRef.current;\n if (!b) return null;\n const style = { strokeColor: '#3b82f6', strokeWidth: 1.5, strokeOpacity: 0.65, dash: 2, fixed: true, highlight: false, withLabel: false } as Record<string, unknown>;\n const circStyle = { ...style, fillColor: 'none', fillOpacity: 0 };\n try {\n switch (toolDef.key) {\n case 'segment':\n case 'midpoint':\n case 'distance':\n return b.create('segment', [picks[0], phantom], style);\n case 'line':\n return b.create('line', [picks[0], phantom], style);\n case 'ray':\n return b.create('line', [picks[0], phantom], { ...style, straightFirst: false, straightLast: true });\n case 'vector':\n return b.create('arrow', [picks[0], phantom], style);\n case 'circleCenter':\n return b.create('circle', [picks[0], phantom], circStyle);\n case 'circle3':\n if (picks.length === 1) return b.create('circle', [picks[0], phantom], circStyle);\n if (picks.length === 2) return b.create('circumcircle', [picks[0], picks[1], phantom], circStyle);\n return null;\n case 'angle':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('angle', [picks[0], picks[1], phantom], { ...style, radius: 1, fillColor: '#22c55e', fillOpacity: 0.15 });\n return null;\n case 'perpBisector':\n return b.create('segment', [picks[0], phantom], style);\n case 'angleBisector':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('bisector', [picks[0], picks[1], phantom], style);\n return null;\n case 'perpendicular':\n case 'parallel':\n case 'tangent':\n if (picks.length === 1) {\n const k = objKind(picks[0]);\n if (k === 'line' && toolDef.key !== 'tangent') {\n return b.create(toolDef.key, [picks[0], phantom], style);\n }\n if (k === 'circle' && toolDef.key === 'tangent') {\n const glider = b.create('glider', [phantom.X(), phantom.Y(), picks[0]], { visible: false, withLabel: false });\n return b.create('tangent', [glider], style);\n }\n }\n return null;\n default:\n return null;\n }\n } catch {\n return null;\n }\n }, []);\n\n // Tear down old preview shape and build a new one from current picks + phantom.\n const refreshPreview = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n // Tear down current preview shape (not the phantom)\n if (previewShapeRef.current) {\n safeJsx('MiniBoard.removeObject(refreshPreview)', () => b.removeObject(previewShapeRef.current));\n previewShapeRef.current = null;\n }\n const t = toolRef.current;\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n const picks = pendingRef.current;\n if (picks.length === 0 || toolDef.needs <= 0) return;\n if (picks.length >= toolDef.needs) return;\n // Create phantom if missing\n if (!phantomRef.current) {\n try {\n phantomRef.current = b.create('point', [0, 0], { visible: false, fixed: true, withLabel: false, name: '' });\n } catch { return; }\n }\n previewShapeRef.current = buildPreview(toolDef, picks, phantomRef.current);\n }, [buildPreview]);\n\n // Apply tool action with a sequence of picked refs\n const finalize = useCallback((toolDef: ToolDef, picks: JxgObj[]) => {\n if (!boardRef.current) return;\n const labels = picks.map(localIdOf).filter(Boolean) as string[];\n // For open shapes (segment, line, ray, vector). `color` shorthand also fills\n // closed shapes, so we use explicit strokeColor + transparent fillOpacity for\n // anything closed (circle, polygon, angle).\n const stroke = { strokeColor: '@stroke', strokeWidth: 2 };\n const strokeOnly = { ...stroke, fillColor: 'none', fillOpacity: 0 };\n const lblName = nextLabel();\n switch (toolDef.key) {\n case 'midpoint':\n create('midpoint', labels, { name: lblName, color: '@stroke', size: 3 });\n break;\n case 'segment':\n create('segment', labels, stroke);\n break;\n case 'line':\n create('line', labels, stroke);\n break;\n case 'ray': {\n // JSXGraph: 'line' with straightFirst:false, straightLast:true\n create('line', labels, { ...stroke, straightFirst: false, straightLast: true });\n break;\n }\n case 'vector':\n create('arrow', labels, stroke);\n break;\n case 'perpendicular': {\n // [point, line] in that order; JSXGraph perpendicular expects (line, point)\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('perpendicular', [l, p], stroke);\n break;\n }\n case 'parallel': {\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('parallel', [l, p], stroke);\n break;\n }\n case 'perpBisector': {\n // JSXGraph 1.12.x doesn't register a `perpendicularbisector` element\n // (only `perpendicular`, `perpendicularpoint`, `perpendicularsegment`).\n // Build it from primitives: midpoint M of P1P2, then a perpendicular\n // line to the segment P1P2 through M. Helpers are invisible but logged\n // so deserialize-on-reload reconstructs the dependency chain.\n const mid = create('midpoint', labels, { visible: false, withLabel: false, name: '' });\n const seg = create('segment', labels, { visible: false, withLabel: false });\n const midId = localIdOf(mid);\n const segId = localIdOf(seg);\n if (midId && segId) create('perpendicular', [segId, midId], stroke);\n break;\n }\n case 'angleBisector':\n create('bisector', labels, stroke);\n break;\n case 'circleCenter':\n create('circle', labels, strokeOnly);\n break;\n case 'circle3':\n create('circumcircle', labels, strokeOnly);\n break;\n case 'tangent': {\n // Need to find the actual point pick (not just by slot index) since\n // the user can click circle-then-point OR point-then-circle.\n const firstIsPoint = picks[0] && objKind(picks[0]) === 'point';\n const pointPick = firstIsPoint ? picks[0] : picks[1];\n const circleLabel = firstIsPoint ? labels[1] : labels[0];\n if (!pointPick || !circleLabel) break;\n const px = typeof pointPick.X === 'function' ? pointPick.X() : 0;\n const py = typeof pointPick.Y === 'function' ? pointPick.Y() : 0;\n const glider = create('glider', [px, py, circleLabel], { name: '', size: 2, strokeColor: '#666', visible: false });\n const gid = localIdOf(glider);\n if (gid) create('tangent', [gid], stroke);\n break;\n }\n case 'angle': {\n // JSXGraph vẽ cung từ BA → BC theo chiều dương (ngược chiều kim đồng hồ).\n // Nếu cross(BA, BC) < 0 thì cung CCW từ BA → BC > 180° → đổi vai trò A,C\n // để luôn hiển thị góc nhọn/tù thay vì góc phản (reflex).\n const [pa, pb, pc] = picks;\n let order: string[] = labels;\n try {\n const ax = pa.X() - pb.X(), ay = pa.Y() - pb.Y();\n const cx = pc.X() - pb.X(), cy = pc.Y() - pb.Y();\n const cross = ax * cy - ay * cx;\n if (cross < 0) order = [labels[2], labels[1], labels[0]];\n } catch { /* fallback giữ thứ tự */ }\n create('angle', order, {\n radius: 1,\n fillColor: '#22c55e',\n fillOpacity: 0.25,\n strokeColor: '#16a34a',\n strokeWidth: 1.5,\n name: '',\n withLabel: false,\n });\n break;\n }\n case 'distance': {\n const pA = picks[0], pB = picks[1];\n const dist = Math.hypot((pA.X() - pB.X()), (pA.Y() - pB.Y()));\n const midX = (pA.X() + pB.X()) / 2;\n const midY = (pA.Y() + pB.Y()) / 2;\n create('text', [midX, midY, `d = ${dist.toFixed(2)}`], { fontSize: 14, color: '#dc2626' });\n break;\n }\n case 'polygon': {\n create('polygon', labels, { fillColor: '#1e3a8a', fillOpacity: 0.10, borders: { strokeColor: '@stroke', strokeWidth: 2 } });\n break;\n }\n case 'area': {\n create('polygon', labels, { fillColor: '#3b82f6', fillOpacity: 0.18, borders: { strokeColor: '#1d4ed8', strokeWidth: 2 } });\n break;\n }\n case 'toggleLabel': {\n const obj = picks[0];\n safeJsx('MiniBoard.toggleLabel', () => {\n if (obj.label) {\n const visible = obj.label.visProp.visible !== false;\n obj.label.setAttribute({ visible: !visible });\n } else if (obj.setAttribute) {\n // For elements without explicit label, toggle 'withLabel'\n const cur = obj.visProp.withlabel !== false;\n obj.setAttribute({ withLabel: !cur });\n }\n boardRef.current.update();\n });\n break;\n }\n case 'toggleVisible': {\n const obj = picks[0];\n safeJsx('MiniBoard.toggleVisible', () => {\n const visible = obj.visProp.visible !== false;\n obj.setAttribute({ visible: !visible });\n boardRef.current.update();\n });\n break;\n }\n case 'delete': {\n const obj = picks[0];\n safeJsx('MiniBoard.deleteOne', () => {\n boardRef.current.removeObject(obj);\n // JSXGraph cascade-removes dependents (e.g. xoá point → segment dùng\n // point đó cũng biến mất). Đồng bộ log: walk objMap, giữ lại id nào\n // vẫn còn trong board.objects; còn lại drop khỏi log + map. Trước\n // patch, chỉ entry chính bị xoá → log dangling reference, replay sẽ\n // throw vì id phụ thuộc không resolve được.\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n });\n break;\n }\n }\n }, [create, localIdOf, nextLabel]);\n\n const finalizeTransformCreate = useCallback((\n spec: { params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' }; chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }> },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any,\n ) => {\n if (!boardRef.current) return;\n const def = getDefiningPoints(source);\n if (!def) { flashWarn('Không thể biến đổi đối tượng này'); return; }\n\n // 1. Create + log transform entry/entries. Chain mode (dilate): create N\n // transforms in order, log each, and apply them as an array.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformObjs: any[] = [];\n const transformIds: string[] = [];\n const steps = spec.chain ?? [{ params: spec.params, attrs: spec.attrs }];\n for (const step of steps) {\n const stepLogArgs: unknown[] = [];\n for (const p of step.params) {\n if (typeof p === 'function') {\n flashWarn('Tham số transform không serialize được — bỏ qua');\n return;\n }\n if (p && typeof p === 'object') {\n const id = localIdOf(p);\n if (!id) {\n flashWarn('Đối tượng tham chiếu không nằm trong board — không thể biến đổi');\n return;\n }\n stepLogArgs.push(id);\n } else {\n stepLogArgs.push(p);\n }\n }\n const stepId = nextLocalId();\n const stepObj = boardRef.current.create('transform', step.params, step.attrs);\n pushCreationLog({ id: stepId, type: 'transform', args: stepLogArgs, attrs: step.attrs as Record<string, unknown> });\n objMapRef.current.set(stepId, stepObj);\n transformObjs.push(stepObj);\n transformIds.push(stepId);\n }\n const transformParent = transformObjs.length === 1 ? transformObjs[0] : transformObjs;\n const transformLogRef = transformObjs.length === 1 ? transformIds[0] : transformIds;\n\n // 2. Transform each defining point — log each.\n // JSXGraph signature: create('point', [parentElement, transformation|transformationArray])\n // — SOURCE element first, transformation second. Reversing the order made\n // JSXGraph reject the call (\"Can't create point with parent types 'object'\n // and 'object'\"), crashing the rotate tool prior to this fix.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformedPoints: any[] = def.points.map((src) => {\n const srcId = localIdOf(src);\n const id = nextLocalId();\n const srcName = typeof src.name === 'string' ? src.name : '';\n const newName = srcName ? `${srcName}'` : nextLabel();\n const attrs = { name: newName, size: 3, color: '#0ea5e9', strokeColor: '#0ea5e9', fillColor: '#0ea5e9' };\n const obj = boardRef.current!.create('point', [src, transformParent], attrs);\n pushCreationLog({ id, type: 'point', args: [srcId ?? src, transformLogRef], attrs });\n objMapRef.current.set(id, obj);\n return obj;\n });\n\n // 3. Recreate same-kind object from transformed points\n const baseStyle = { ...def.attrs, strokeColor: '#0ea5e9' };\n const strokeOnly = { ...baseStyle, fillColor: 'none', fillOpacity: 0 };\n const ids = transformedPoints.map((p) => localIdOf(p)).filter((s): s is string => !!s);\n switch (def.kind) {\n case 'point': /* nothing — already created */ break;\n case 'segment': create('segment', ids, baseStyle); break;\n case 'line': create('line', ids, baseStyle); break;\n case 'ray': create('line', ids, { ...baseStyle, straightFirst: false, straightLast: true }); break;\n case 'arrow': create('arrow', ids, baseStyle); break;\n case 'circleCenter': create('circle', ids, strokeOnly); break;\n case 'circle3': create('circumcircle', ids, strokeOnly); break;\n }\n setHistoryTick((t) => t + 1);\n }, [create, flashWarn, localIdOf, nextLabel, nextLocalId]);\n\n // Tái dựng 1 object từ entry log đã serialize. Dùng chung cho cả\n // initial-state replay và redo. Trả về true nếu tạo thành công.\n const recreateFromLogEntry = useCallback((el: SerializedElement): boolean => {\n const board = boardRef.current;\n if (!board) return false;\n const idMap = objMapRef.current;\n const resolved = el.args.map(a => (typeof a === 'string' && idMap.has(a)) ? idMap.get(a) : a);\n try {\n if (el.type === 'valueLabel') {\n const target = resolved[0];\n if (!target) return false;\n const txt = createValueLabelFor(target);\n if (!txt) return false;\n idMap.set(el.id, txt);\n valueLabelsRef.current.set(target, txt);\n return true;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, paletteFor(isDarkRef.current));\n const obj = board.create(el.type, resolved, themedAttrs);\n idMap.set(el.id, obj);\n return true;\n } catch (err) {\n console.warn('Recreate failed for', el.type, err);\n return false;\n }\n }, [createValueLabelFor]);\n\n // Undo: remove the most recently logged creation. Also clears any in-progress\n // polygon construction (pending picks + preview segments) so state is sane.\n const undoLast = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n while (creationLogRef.current.length > 0) {\n const last = creationLogRef.current.pop();\n if (!last) break;\n const obj = objMapRef.current.get(last.id);\n objMapRef.current.delete(last.id);\n if (obj) {\n safeJsx('MiniBoard.removeObject(undo)', () => b.removeObject(obj));\n clearPending();\n // Push entry này vào redoStack (chỉ entry có object thật).\n redoStackRef.current.push(last);\n setHistoryTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(undo)', () => b.update());\n return;\n }\n // Skip stale log entry (object đã biến mất từ trước) — không push vào redoStack\n }\n setHistoryTick((t) => t + 1);\n }, [clearPending]);\n\n // Redo: pop entry cuối khỏi redoStack và tái tạo object.\n const redoNext = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n const entry = redoStackRef.current.pop();\n if (!entry) {\n setHistoryTick((t) => t + 1);\n return;\n }\n const ok = recreateFromLogEntry(entry);\n if (ok) {\n creationLogRef.current.push(entry);\n }\n setHistoryTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(redo)', () => b.update());\n }, [recreateFromLogEntry]);\n\n // Global Ctrl/Cmd+Z + Esc while the panel is mounted. Skipped when focus is\n // in a text input so we don't hijack other undo flows. Capture phase + stop\n // propagation so Excalidraw's underlying undo doesn't also fire when the\n // panel is open on top of the whiteboard. Esc cancels in-progress picks.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z' && !e.shiftKey) {\n if (inField) return;\n e.preventDefault();\n e.stopPropagation();\n undoLastRef.current();\n return;\n }\n // Ctrl/Cmd+Shift+Z hoặc Ctrl+Y → redo\n if (\n (e.metaKey || e.ctrlKey) &&\n (\n (e.key.toLowerCase() === 'z' && e.shiftKey) ||\n (e.key.toLowerCase() === 'y' && !e.shiftKey)\n )\n ) {\n if (inField) return;\n e.preventDefault();\n e.stopPropagation();\n redoNextRef.current();\n return;\n }\n if (e.key === 'Escape' && !inField) {\n if (pendingRef.current.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearPendingRef.current();\n }\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearSelectionRef.current();\n }\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && !inField) {\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n deleteSelectedRef.current();\n }\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, []);\n\n // Translate a pointer event into JSXGraph SVG-pixel coords (the coord system\n // `hasPoint` uses). Falls back to manual rect math if `getMousePosition` is\n // unavailable (e.g. in tests with a mocked board).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const screenCoordsOf = useCallback((evt: any): [number, number] | null => {\n const b = boardRef.current;\n if (!b) return null;\n try {\n const mp = b.getMousePosition ? b.getMousePosition(evt) : null;\n if (mp && mp.length >= 2) return [mp[0], mp[1]];\n } catch { /* fall through */ }\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const cx = evt.clientX ?? evt.touches?.[0]?.clientX ?? 0;\n const cy = evt.clientY ?? evt.touches?.[0]?.clientY ?? 0;\n return [cx - rect.left, cy - rect.top];\n }\n return null;\n }, []);\n\n // Find which JSXGraph object (if any) is at a given pointer event.\n // JSXGraph's `hasPoint` expects coords in the board's SVG pixel space, not\n // viewport-relative clientX/Y. Without this, hits are offset by the\n // container's page position and existing points never snap.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const objectsAt = useCallback((evt: any): JxgObj[] => {\n const b = boardRef.current;\n if (!b) return [];\n const sc = screenCoordsOf(evt);\n if (!sc) return [];\n const [sx, sy] = sc;\n const list: JxgObj[] = [];\n safeJsx('MiniBoard.objectsAt.loop', () => {\n const objs = b.objectsList || [];\n for (const o of objs) {\n safeJsx('MiniBoard.objectsAt.hasPoint', () => {\n if (o.hasPoint && o.hasPoint(sx, sy)) list.push(o);\n });\n }\n });\n return list;\n }, [screenCoordsOf]);\n\n // Generous point-snap: JSXGraph's `hasPoint` for a point uses the visual\n // radius (~3px) which is too strict for click targeting. When a tool needs\n // a point pick, fall back to \"nearest point within tolPx pixels\".\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const findNearestPoint = useCallback((evt: any, tolPx: number = 12): JxgObj | null => {\n const b = boardRef.current;\n if (!b) return null;\n const sc = screenCoordsOf(evt);\n if (!sc) return null;\n const [sx, sy] = sc;\n const tol2 = tolPx * tolPx;\n type Best = { obj: JxgObj; d2: number };\n const bestRef: { current: Best | null } = { current: null };\n safeJsx('MiniBoard.findNearestPoint.loop', () => {\n const objs = b.objectsList || [];\n for (const o of objs) {\n safeJsx('MiniBoard.findNearestPoint.iter', () => {\n if (objKind(o) !== 'point') return;\n const pc = o.coords?.scrCoords;\n if (!pc) return;\n const dx = pc[1] - sx;\n const dy = pc[2] - sy;\n const d2 = dx * dx + dy * dy;\n const cur = bestRef.current;\n if (d2 <= tol2 && (!cur || d2 < cur.d2)) bestRef.current = { obj: o, d2 };\n });\n }\n });\n return bestRef.current ? bestRef.current.obj : null;\n }, [screenCoordsOf]);\n\n // Label-aware snap: if the click landed on a JSXGraph text label (drawn near\n // each named element with `display:'internal'`), follow it back to the owning\n // element. Without this, clicking the \"A\" label of a point with the segment\n // tool falls through to `findNearestPoint` and — when the label center is\n // beyond the 12 px tolerance — creates a duplicate point right next to A.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const promoteLabel = useCallback((o: JxgObj): JxgObj => {\n if (!o) return o;\n const t = (o.elType || o.type || '').toString().toLowerCase();\n if (t !== 'text') return o;\n const b = boardRef.current;\n if (!b) return o;\n const promoted = safeJsx<JxgObj | null>('MiniBoard.promoteLabel', () => {\n for (const c of (b.objectsList || [])) {\n if (c.label === o) return c;\n }\n return null;\n }, null);\n return promoted ?? o;\n }, []);\n\n // Pending transform state for rotate/dilate/regularPolygon (needs param popover)\n interface PendingTransform {\n tool: 'rotate' | 'dilate' | 'regularPolygon';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n center: any;\n anchorScreen: { x: number; y: number };\n }\n const pendingTransformRef = useRef<PendingTransform | null>(null);\n type TransformPopoverInfo = { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null;\n const transformSubsRef = useRef<Set<(info: TransformPopoverInfo) => void>>(new Set());\n const emitTransform = useCallback((info: TransformPopoverInfo) => {\n transformSubsRef.current.forEach((cb) => { safeJsx('MiniBoard.emitTransform.cb', () => cb(info)); });\n }, []);\n\n // Selection subscribers — emitted when Move tool single-clicks an object\n const selectSubsRef = useRef<Set<(snap: ObjectSnapshot) => void>>(new Set());\n const emitSelect = useCallback((snap: ObjectSnapshot) => {\n selectSubsRef.current.forEach((cb) => { safeJsx('MiniBoard.emitSelect.cb', () => cb(snap)); });\n }, []);\n\n // Track pointer-down position for click vs drag detection in Move tool\n const moveDownRef = useRef<{ sx: number; sy: number } | null>(null);\n // Track previous Move-tool click for double-click detection (open popover only\n // on 2nd click within 400ms on the same object).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const lastMoveClickRef = useRef<{ obj: any | null; time: number }>({ obj: null, time: 0 });\n\n // Initialize board\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n (async () => {\n const JXG = (await import('jsxgraph')).default;\n if (cancelled || !containerRef.current) return;\n jxgRef.current = JXG;\n // Render text/labels as SVG <text> (default 'html' uses absolute-positioned\n // <div> overlays, which are NOT captured when we clone the SVG to export\n // the stamp → labels disappear in inserted image).\n safeJsx('MiniBoard.applyJxgOptions', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n // Label tone theo theme — JSXGraph mặc định stroke black cho text label.\n opts.label.strokeColor = themeLabel(isDarkRef.current);\n opts.text.strokeColor = themeLabel(isDarkRef.current);\n }\n });\n const board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: initialState?.bbox ?? [-10, 10, 10, -10],\n axis: false, // We manage axis manually via toggle for clean default\n grid: false,\n showCopyright: false,\n showNavigation: true,\n // Keep 1:1 user→pixel ratio so circles stay circular regardless of the\n // container aspect ratio (Excalidraw panel is taller than wide and\n // without this circles became ellipses after reload).\n keepAspectRatio: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: true },\n // Looser hit-test radius so clicking on a thin segment/line/circle\n // actually registers without pixel-perfect aim. `precision` is a real\n // JSXGraph option (Options.precision) but isn't in the d.ts file.\n ...({ precision: { hasPoint: 8, mouse: 4, touch: 16 } } as Record<string, unknown>),\n });\n boardRef.current = board;\n\n // Replay initial state if any\n if (initialState && initialState.elements.length > 0) {\n for (const el of initialState.elements) {\n recreateFromLogEntry(el);\n }\n creationLogRef.current = [...initialState.elements];\n labelIdxRef.current = initialState.elements.filter(e => e.type === 'point').length;\n }\n\n // Initial axis/grid\n if (showAxisRef.current) {\n safeJsx('MiniBoard.initAxes', () => {\n axisObjsRef.current.x = board.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = board.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n });\n }\n if (showGridRef.current) {\n safeJsx('MiniBoard.initGrid', () => board.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 }));\n }\n\n // Pointer down: handle click-driven tool actions.\n // Full dispatch logic lives in handlers.ts (handleDown). A stable ctx\n // object is built here so the closure captured at mount stays thin.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('down', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleDown(ctx, e);\n });\n\n // Pointer up: DOUBLE-click on Move tool emits selection. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('up', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleUp(ctx, e);\n });\n\n // Mouse move: update phantom + marquee. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('move', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleMove(ctx, e);\n });\n\n onReady({\n getContainer: () => containerRef.current,\n // Sync toạ độ live của free point về log trước khi trả ra. JSXGraph\n // cho phép drag free point (args=[x,y] không có ref), việc drag chỉ\n // cập nhật obj.X()/Y() trên board chứ không đụng log → re-edit + Chèn\n // sẽ serialize toạ độ cũ → SVG không đổi → fileId trùng → user thấy\n // \"k thay đổi\". Line/segment/circle/polygon tham chiếu point qua id\n // nên auto-update theo.\n getCreationLog: () => creationLogRef.current.map((e) => {\n if (e.type !== 'point') return { ...e };\n const args = e.args;\n if (!Array.isArray(args) || args.length !== 2) return { ...e };\n if (typeof args[0] !== 'number' || typeof args[1] !== 'number') return { ...e };\n const obj = objMapRef.current.get(e.id) as\n | { X?: () => number; Y?: () => number }\n | undefined;\n if (!obj || typeof obj.X !== 'function' || typeof obj.Y !== 'function') return { ...e };\n const x = obj.X();\n const y = obj.Y();\n if (!Number.isFinite(x) || !Number.isFinite(y)) return { ...e };\n return { ...e, args: [x, y] };\n }),\n getBbox: () => boardRef.current ? boardRef.current.getBoundingBox() : [-10, 10, 10, -10],\n getShowAxis: () => showAxisRef.current,\n getShowGrid: () => showGridRef.current,\n setTool: (t: GeomTool) => handleToolChangeRef.current(t),\n getTool: () => toolRef.current,\n setShowAxis: (b: boolean) => setShowAxisRef.current(b),\n setShowGrid: (b: boolean) => setShowGridRef.current(b),\n undo: () => undoLastRef.current(),\n canUndo: () => creationLogRef.current.length > 0,\n redo: () => redoNextRef.current(),\n canRedo: () => redoStackRef.current.length > 0,\n subscribe: (cb: () => void) => {\n subscribersRef.current.add(cb);\n return () => { subscribersRef.current.delete(cb); };\n },\n snapshotObject,\n mutateObject,\n getAllPointNames: () => {\n const b = boardRef.current;\n if (!b) return [];\n const out: string[] = [];\n safeJsx('MiniBoard.getAllPointNames', () => {\n const objs = b.objectsList || [];\n for (const o of objs) {\n if (objKind(o) === 'point' && typeof o.name === 'string' && o.name) {\n out.push(o.name);\n }\n }\n });\n return out;\n },\n onSelect: (cb: (snap: ObjectSnapshot) => void) => {\n selectSubsRef.current.add(cb);\n return () => { selectSubsRef.current.delete(cb); };\n },\n onTransformParam: (cb: (info: TransformPopoverInfo) => void) => {\n transformSubsRef.current.add(cb);\n return () => { transformSubsRef.current.delete(cb); };\n },\n confirmTransformParam: (value: number) => {\n const p = pendingTransformRef.current;\n if (!p) return;\n if (p.tool === 'regularPolygon') {\n const n = Math.max(3, Math.round(value));\n const p1Id = localIdOf(p.source);\n const p2Id = localIdOf(p.center);\n if (p1Id && p2Id && boardRef.current) {\n try {\n create('regularpolygon', [p1Id, p2Id, n], {\n fillColor: '#1e3a8a',\n fillOpacity: 0.10,\n borders: { strokeColor: '@stroke', strokeWidth: 2 },\n });\n } catch (err) {\n console.warn('regularpolygon failed', err);\n }\n }\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n return;\n }\n const spec = p.tool === 'rotate'\n ? buildTransformSpec({ kind: 'rotate', center: p.center, angleDeg: value })\n : buildTransformSpec({ kind: 'dilate', center: p.center, k: value });\n finalizeTransformCreateRef.current(spec, p.source);\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n cancelTransformParam: () => {\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n getSelectionSize: () => selectedSetRef.current.size,\n clearSelection: () => clearSelectionRef.current(),\n deleteSelection: () => deleteSelectedRef.current(),\n });\n })();\n return () => {\n cancelled = true;\n if (previewRafRef.current != null) {\n cancelAnimationFrame(previewRafRef.current);\n previewRafRef.current = null;\n }\n if (boardRef.current && jxgRef.current) {\n safeJsx('MiniBoard.freeBoard', () => jxgRef.current!.JSXGraph.freeBoard(boardRef.current));\n boardRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n // React to axis/grid toggle changes after init\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('MiniBoard.toggleAxis', () => {\n // Remove existing axes if present\n if (axisObjsRef.current.x) { safeJsx('MiniBoard.removeObject(axisX)', () => b.removeObject(axisObjsRef.current.x)); axisObjsRef.current.x = undefined; }\n if (axisObjsRef.current.y) { safeJsx('MiniBoard.removeObject(axisY)', () => b.removeObject(axisObjsRef.current.y)); axisObjsRef.current.y = undefined; }\n if (showAxis) {\n axisObjsRef.current.x = b.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = b.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n }\n b.update();\n });\n }, [showAxis]);\n\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('MiniBoard.toggleGrid', () => {\n // Find existing grid objects and remove\n const objs = Object.values(b.objects || {}) as JxgObj[];\n for (const o of objs) {\n if (o && (o.elType === 'grid' || o.type === 'grid' || (o.visProp && o.visProp.type === 'grid'))) {\n safeJsx('MiniBoard.removeObject(grid)', () => b.removeObject(o));\n }\n }\n if (showGrid) {\n b.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 });\n }\n b.update();\n });\n }, [showGrid]);\n\n const handleToolChange = useCallback((t: GeomTool) => {\n clearPending();\n // Update the ref synchronously so subsequent pointer-down events (e.g. a\n // fast user click immediately after picking a tool) see the new tool\n // without waiting for React's commit phase.\n toolRef.current = t;\n setTool(t);\n // Disable JSXGraph pan while the user is in the select tool so that\n // drag-empty starts a marquee selection instead of panning the board.\n // Re-enable for every other tool (board pan is the default).\n const b = boardRef.current;\n if (b) {\n safeJsx('MiniBoard.setPanForTool', () => {\n if (b.attr?.pan) b.attr.pan.enabled = (t !== 'select');\n });\n }\n }, [clearPending]);\n\n // Stable ref so onReady closure (captured at mount) can call latest handler.\n const handleToolChangeRef = useRef(handleToolChange);\n handleToolChangeRef.current = handleToolChange;\n\n // Subscribers thông báo bên ngoài khi state thay đổi (tool / axis / grid / undo)\n const subscribersRef = useRef<Set<() => void>>(new Set());\n const notifySubscribers = useCallback(() => {\n subscribersRef.current.forEach((cb) => {\n safeJsx('MiniBoard.notifySubscriber.cb', () => cb());\n });\n }, []);\n\n // Phát tín hiệu khi state thay đổi\n useEffect(() => { notifySubscribers(); }, [tool, showAxis, showGrid, historyTick, notifySubscribers]);\n\n const undoLastRef = useRef(undoLast);\n undoLastRef.current = undoLast;\n const redoNextRef = useRef(redoNext);\n redoNextRef.current = redoNext;\n const clearPendingRef = useRef(clearPending);\n clearPendingRef.current = clearPending;\n const finalizeTransformCreateRef = useRef(finalizeTransformCreate);\n finalizeTransformCreateRef.current = finalizeTransformCreate;\n const clearSelectionRef = useRef(clearSelection);\n clearSelectionRef.current = clearSelection;\n const deleteSelectedRef = useRef(deleteSelected);\n deleteSelectedRef.current = deleteSelected;\n const emitTransformRef = useRef(emitTransform);\n emitTransformRef.current = emitTransform;\n const setShowAxisRef = useRef(setShowAxis);\n setShowAxisRef.current = setShowAxis;\n const setShowGridRef = useRef(setShowGrid);\n setShowGridRef.current = setShowGrid;\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"jxgmini-container\"\n className=\"h-full min-h-0 bg-white\"\n style={{ touchAction: 'none' }}\n />\n );\n};\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-6 w-6 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS, GROUP_LABELS, type GeomTool, type ToolDef } from './MiniBoard';\nimport { GROUP_ORDER, letterForGroup, type GeomGroup } from './tools';\nimport { MobileToolDrawer, type MobileToolGroup } from '../../shared/MobileToolDrawer';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shared shell (desktop) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isDark?: boolean;\n closeLabel?: string;\n}\n\nfunction Shell({ title, icon, onClose, children, isDark, closeLabel = 'Đóng' }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label={closeLabel}\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Icons ----------\n\nconst GeometryIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function UndoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n );\n}\n\nexport function RedoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"21 7 21 13 15 13\" />\n <path d=\"M20.49 13a9 9 0 1 1-2.13-9.36L21 7\" />\n </svg>\n );\n}\n\nfunction AxisIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nfunction GridIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n\n// ---------- Props ----------\n\ninterface GeometryLeftPanelProps {\n activeTool: GeomTool;\n onToolChange: (t: GeomTool) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n onClose: () => void;\n isDark?: boolean;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n /** Chord shortcut: group đang được focus (sau khi bấm letter). null = không active. */\n chordGroup?: GeomGroup | null;\n}\n\n// ---------- Tooltip portal (desktop hover) ----------\n\nfunction useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: ToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n\n// ---------- Desktop left panel ----------\n\nfunction DesktopGeometryPanel(props: GeometryLeftPanelProps) {\n const { activeTool, onToolChange, showAxis, showGrid, onShowAxisChange, onShowGridChange, onUndo, canUndo, onRedo, canRedo, onClose, isDark, chordGroup } = props;\n\n const grouped = useMemo(() => {\n return TOOLS.reduce<Record<string, ToolDef[]>>((acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n }, {});\n }, []);\n const groupKeys = useMemo(\n () => GROUP_ORDER.filter((g) => grouped[g]),\n [grouped],\n );\n\n const activeGroupTools: ToolDef[] | null = chordGroup\n ? (grouped[chordGroup] ?? null)\n : null;\n\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n return (\n <>\n <Shell title=\"Hình học\" icon={GeometryIconHeader} onClose={onClose} isDark={isDark}>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxis}\n onChange={(e) => onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n Trục toạ độ\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showGrid}\n onChange={(e) => onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n </Section>\n\n {groupKeys.map((group) => {\n const isChordActive = chordGroup === group;\n const dimmed = chordGroup !== null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive\n ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1'\n : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{GROUP_LABELS[group]}</span>\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {letterForGroup(group)}\n </span>\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group].map((t, i) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'relative flex h-8 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n <span\n data-testid={`chord-num-${t.key}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n active\n ? 'text-white/70'\n : isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {i + 1}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n );\n })}\n\n {chordGroup && activeGroupTools && (\n <div\n data-testid=\"chord-hint\"\n className=\"mt-1 rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {letterForGroup(chordGroup)}\n </span>\n <span className=\"mx-1 text-slate-400\">→</span>\n {activeGroupTools.map((t, i) => (\n <span key={t.key} className=\"mr-2 inline-block\">\n <span className=\"font-mono font-semibold text-emerald-700\">\n {i + 1}\n </span>\n <span className=\"ml-1\">{t.label}</span>\n </span>\n ))}\n <span className=\"text-slate-400\">Esc huỷ</span>\n </div>\n )}\n </Shell>\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\n// ---------- Mobile geometry panel (redesigned) ----------\n\nfunction MobileGeometryPanel(props: GeometryLeftPanelProps) {\n const {\n activeTool,\n onToolChange,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onRedo,\n canRedo,\n isDark,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = useMemo<MobileToolGroup<GeomTool, ToolDef['group']>[]>(() => {\n const acc = new Map<ToolDef['group'], ToolDef[]>();\n for (const t of TOOLS) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n return Array.from(acc.entries()).map(([group, tools]) => ({\n group,\n groupLabel: GROUP_LABELS[group],\n tools: tools.map((t) => ({ key: t.key, label: t.label, icon: t.icon })),\n }));\n }, []);\n\n return (\n <MobileToolDrawer\n title=\"Hình học\"\n headerIcon={GeometryIconHeader}\n testId=\"stamp-left-panel\"\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={[\n {\n label: 'Trục',\n icon: <AxisIcon />,\n pressed: showAxis,\n onToggle: onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: 'Lưới',\n icon: <GridIcon />,\n pressed: showGrid,\n onToggle: onShowGridChange,\n testId: 'toggle-grid',\n },\n ]}\n actions={[\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: onUndo,\n disabled: !canUndo,\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: onRedo,\n disabled: !canRedo,\n },\n ]}\n groups={groups}\n activeTool={activeTool}\n onToolSelect={onToolChange}\n />\n );\n}\n\n// ---------- Public entry point ----------\n\nexport function LeftPanel(props: GeometryLeftPanelProps) {\n if (props.isMobile) {\n return <MobileGeometryPanel {...props} />;\n }\n return <DesktopGeometryPanel {...props} />;\n}\n\n// Alias for back-compat\nexport { LeftPanel as GeometryLeftPanel };\n","// 8 màu chính lấy từ Excalidraw DEFAULT_ELEMENT_STROKE_COLOR_PALETTE.\n// Nguồn: @excalidraw/excalidraw — packages/excalidraw/colors.ts (top row chuẩn).\n// Cần đồng bộ tay nếu Excalidraw đổi palette ở major bump.\nexport const STROKE_PALETTE = [\n '#1e1e1e', // black\n '#e03131', // red\n '#e8590c', // orange\n '#f08c00', // yellow\n '#2f9e44', // green\n '#1971c2', // blue\n '#9c36b5', // grape\n '#868e96', // gray\n] as const;\n\nexport type StrokeColor = (typeof STROKE_PALETTE)[number];\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 768px)';\nconst NO_HOVER_QUERY = '(hover: none)';\n\nexport interface MobileState {\n /** Viewport ≤ 768px — dùng để chuyển full-screen modal + drawer. */\n isMobile: boolean;\n /** Device không có hover (touch-only) — dùng để ẩn hover tooltips. */\n isTouchOnly: boolean;\n}\n\nfunction readMatch(query: string): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n try {\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\n/**\n * SSR-safe mobile detection qua matchMedia. Trả về `{ isMobile, isTouchOnly }`.\n * Re-render khi viewport resize hoặc input modality đổi (e.g., gắn Bluetooth mouse).\n */\nexport function useIsMobile(): MobileState {\n const [state, setState] = useState<MobileState>(() => ({\n isMobile: readMatch(MOBILE_QUERY),\n isTouchOnly: readMatch(NO_HOVER_QUERY),\n }));\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const tql = window.matchMedia(NO_HOVER_QUERY);\n const update = () => {\n setState({ isMobile: mql.matches, isTouchOnly: tql.matches });\n };\n update();\n mql.addEventListener('change', update);\n tql.addEventListener('change', update);\n return () => {\n mql.removeEventListener('change', update);\n tql.removeEventListener('change', update);\n };\n }, []);\n\n return state;\n}\n","'use client';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\nexport type ObjKind = 'point' | 'line' | 'circle';\nexport type PointFace = 'o' | 'circle' | 'cross' | 'plus';\n\nexport interface PropertyPatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n /** Bật/tắt value-label động (độ dài segment / bán kính circle). */\n valueLabel?: boolean;\n}\n\ninterface CommonProps {\n anchor: { x: number; y: number };\n onClose: () => void;\n onMutate: (patch: PropertyPatch) => void;\n isDark?: boolean;\n /** Trả về danh sách tên point hiện có (để rename auto-disambiguate). */\n getAllNames?: () => string[];\n}\n\ninterface PointProps extends CommonProps {\n kind: 'point';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n currentFace: PointFace;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n}\n\ninterface LineOrCircleProps extends CommonProps {\n kind: 'line' | 'circle';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n /** Có đang hiện value-label động không. */\n currentShowValue?: boolean;\n}\n\ntype Props = PointProps | LineOrCircleProps;\n\nconst DASH_OPTIONS: Array<{ value: number; label: string }> = [\n { value: 0, label: 'Nét liền' },\n { value: 2, label: 'Nét đứt' },\n { value: 1, label: 'Nét chấm' },\n];\n\nconst WIDTH_OPTIONS = [1, 2, 3];\n\nconst FACE_OPTIONS: Array<{ value: PointFace; symbol: string }> = [\n { value: 'o', symbol: '●' },\n { value: 'circle', symbol: '◯' },\n { value: 'cross', symbol: '✕' },\n { value: 'plus', symbol: '✚' },\n];\n\n// Unicode subscript digits — dùng để tự đặt tên duy nhất khi user nhập trùng.\n// Lưu dưới dạng ký tự subscript thì JSXGraph SVG <text> render đúng \"B₂\"\n// như label một glyph, không cần MathJax/KaTeX.\nconst SUB_DIGITS = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉'];\nconst SUB_SET = new Set(SUB_DIGITS);\n\nfunction toSubscript(n: number): string {\n return String(n).split('').map((d) => SUB_DIGITS[+d] ?? d).join('');\n}\n\nfunction stripTrailingSubscript(s: string): string {\n let i = s.length;\n while (i > 0 && SUB_SET.has(s[i - 1])) i--;\n return s.slice(0, i);\n}\n\nfunction disambiguateName(name: string, existing: Set<string>): string {\n if (!name) return name;\n if (!existing.has(name)) return name;\n const base = stripTrailingSubscript(name) || name;\n for (let n = 2; n < 1000; n++) {\n const candidate = base + toSubscript(n);\n if (!existing.has(candidate)) return candidate;\n }\n return name;\n}\n\ntype Section = 'color' | 'style' | 'size' | 'name' | null;\n\n// Inline icons (small, monochrome) — match the visual weight of Excalidraw's\n// floating action bar in the screenshot. All 16px viewBox 24x24.\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n style: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" /></svg>\n ),\n size: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\"><line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\" strokeWidth=\"1\" /><line x1=\"4\" y1=\"13\" x2=\"20\" y2=\"13\" strokeWidth=\"2\" /><line x1=\"4\" y1=\"17\" x2=\"20\" y2=\"17\" strokeWidth=\"3.2\" /></svg>\n ),\n name: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><text x=\"2\" y=\"17\" fontSize=\"14\" fontFamily=\"serif\" fontWeight=\"700\">A</text><text x=\"12\" y=\"17\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\">a</text></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\" /><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" /><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" /><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" /></svg>\n ),\n};\n\nexport const PropertiesPopover: React.FC<Props> = (props) => {\n const { anchor, onClose, onMutate, isDark, getAllNames } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n // Clamp anchor vào viewport sau khi render (measure actual rect).\n // Trên mobile, force bottom-center thay vì follow anchor (anchor có thể nằm\n // sát mép màn hình hoặc dưới ngón tay user → khó tap).\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n // Bottom-center, 12px above bottom safe area.\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n const initialName =\n props.kind === 'point' ? props.currentName : (props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const [name, setName] = useState<string>(initialName);\n // Khi popover mở lại trên đối tượng khác, đồng bộ name input.\n useEffect(() => {\n setName(initialName);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialName]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n // PointerDown covers mouse + touch + pen — replaces legacy mousedown listener\n // which excluded touch/pen and broke click-outside trên mobile.\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const pickColor = (c: string) => {\n onMutate({ attrs: { strokeColor: c, fillColor: props.kind === 'circle' ? 'none' : c, color: c } });\n };\n const pickDash = (d: number) => onMutate({ attrs: { dash: d } });\n const pickWidth = (w: number) => onMutate({ attrs: { strokeWidth: w } });\n const pickFace = (f: PointFace) => onMutate({ attrs: { face: f } });\n\n const currentName = (props.kind === 'point' || props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const commitName = () => {\n const trimmed = name.trim();\n if (trimmed === currentName) return;\n // Cho phép xoá tên (empty); chỉ disambiguate khi user nhập 1 cái gì đó.\n let final = trimmed;\n if (trimmed) {\n const others = new Set((getAllNames?.() ?? []).filter((n) => n !== currentName));\n final = disambiguateName(trimmed, others);\n }\n if (final !== name) setName(final);\n onMutate({ attrs: { name: final } });\n };\n\n const toggleShowLabel = (next: boolean) => onMutate({ attrs: { withLabel: next } });\n const toggleShowValue = (next: boolean) => onMutate({ valueLabel: next });\n\n const doDelete = () => { onMutate({ remove: true }); onClose(); };\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n\n const currentColor = props.currentColor;\n const currentDash = props.currentDash;\n const currentWidth = props.currentWidth;\n\n if (typeof document === 'undefined') return null;\n\n // Pill toolbar: row of icon buttons, separator before trash. Click một icon\n // để bung panel chi tiết bên dưới. Trash xoá ngay (không có panel).\n const PillBtn = ({ id, label, icon, active, onClick, indicatorColor }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean;\n onClick: () => void; indicatorColor?: string;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n {indicatorColor && (\n <span\n aria-hidden\n className=\"absolute bottom-0.5 left-1/2 -translate-x-1/2 h-1 w-4 rounded-full\"\n style={{ background: indicatorColor }}\n />\n )}\n </button>\n );\n\n const colorIndicatorTint = useMemo(() => currentColor, [currentColor]);\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label=\"Thuộc tính đối tượng\"\n >\n {/* Pill toolbar */}\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <PillBtn id=\"color\" label=\"Màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} indicatorColor={colorIndicatorTint} />\n <PillBtn id=\"style\" label=\"Kiểu\" icon={Icons.style} active={section === 'style'} onClick={() => toggleSection('style')} />\n <PillBtn id=\"size\" label=\"Độ dày\" icon={Icons.size} active={section === 'size'} onClick={() => toggleSection('size')} />\n <PillBtn id=\"name\" label=\"Tên\" icon={Icons.name} active={section === 'name'} onClick={() => toggleSection('name')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {/* Sub-panel — chỉ hiện khi user chọn 1 icon */}\n {section && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n {section === 'color' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => pickColor(c)}\n className={`h-6 w-6 rounded border ${currentColor === c ? 'border-emerald-500 ring-2 ring-emerald-300' : 'border-slate-200'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Kiểu</span>\n {props.kind === 'point' ? (\n <div className=\"flex gap-1\">\n {FACE_OPTIONS.map((f) => (\n <button\n key={f.value}\n aria-label={`Hình ${f.value}`}\n onClick={() => pickFace(f.value)}\n className={`h-7 w-7 rounded border text-sm ${(props as PointProps).currentFace === f.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {f.symbol}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex gap-1\">\n {DASH_OPTIONS.map((d) => (\n <button\n key={d.value}\n aria-label={`Kiểu ${d.label.toLowerCase()}`}\n onClick={() => pickDash(d.value)}\n className={`flex-1 rounded border px-1 py-1 text-[11px] ${currentDash === d.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {d.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {section === 'size' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Độ dày</span>\n <div className=\"flex gap-1\">\n {WIDTH_OPTIONS.map((w) => (\n <button\n key={w}\n aria-label={`Độ dày ${w}`}\n onClick={() => pickWidth(w)}\n className={`flex-1 rounded border py-1 ${currentWidth === w ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n <span className=\"inline-block rounded bg-slate-800\" style={{ width: 30, height: w }} />\n </button>\n ))}\n </div>\n </div>\n )}\n\n {section === 'name' && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Tên</span>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitName}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitName(); } }}\n autoFocus\n placeholder={props.kind === 'point' ? 'A, B, …' : props.kind === 'line' ? 'a, b, f, …' : 'O, c, …'}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <span className=\"text-[10px] text-slate-400\">Trùng tên sẽ tự thêm chỉ số (B → B₂)</span>\n </div>\n\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị tên</span>\n <input\n type=\"checkbox\"\n checked={props.currentShowLabel !== false}\n onChange={(e) => toggleShowLabel(e.target.checked)}\n aria-label=\"Hiển thị tên\"\n />\n </label>\n\n {(props.kind === 'line' || props.kind === 'circle') && (\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị giá trị</span>\n <input\n type=\"checkbox\"\n checked={!!(props as LineOrCircleProps).currentShowValue}\n onChange={(e) => toggleShowValue(e.target.checked)}\n aria-label=\"Hiển thị giá trị\"\n />\n </label>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ParamKind = 'rotate' | 'dilate' | 'regularPolygon';\n\ninterface Props {\n kind: ParamKind;\n anchor: { x: number; y: number };\n defaultValue: number;\n onConfirm: (value: number) => void;\n onCancel: () => void;\n isDark?: boolean;\n}\n\nconst LABELS: Record<ParamKind, { aria: string; label: string; step: number; min?: number }> = {\n rotate: { aria: 'Góc quay', label: 'Góc (°)', step: 15 },\n dilate: { aria: 'Tỷ số k', label: 'Tỷ số k', step: 0.5 },\n regularPolygon: { aria: 'Số cạnh đa giác đều', label: 'Số cạnh (n ≥ 3)', step: 1, min: 3 },\n};\n\nexport const TransformParamPopover: React.FC<Props> = ({ kind, anchor, defaultValue, onConfirm, onCancel, isDark }) => {\n const [value, setValue] = useState<number>(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const meta = LABELS[kind];\n\n useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n\n const submit = () => {\n let v = Number.isFinite(value) ? value : defaultValue;\n if (kind === 'regularPolygon') {\n v = Math.max(3, Math.round(v));\n }\n onConfirm(v);\n };\n\n if (typeof document === 'undefined') return null;\n\n const node = (\n <div\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-2 rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5`}\n style={{ left: anchor.x, top: anchor.y, minWidth: 180 }}\n role=\"dialog\"\n aria-label={meta.aria}\n >\n <label className=\"text-xs font-medium text-slate-700\">{meta.label}</label>\n <input\n ref={inputRef}\n type=\"number\"\n value={value}\n step={meta.step}\n min={meta.min}\n onChange={(e) => setValue(parseFloat(e.target.value))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n else if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={onCancel}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-xs text-slate-700 hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={submit}\n className=\"rounded bg-emerald-600 px-2 py-1 text-xs font-medium text-white hover:bg-emerald-700\"\n >\n Áp dụng\n </button>\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { JSXGraphMiniBoard, type MiniBoardHandle, type GeomTool, type ObjectSnapshot } from './MiniBoard';\nimport { serializeBoard, type SerializedBoard } from '../serialize';\nimport { renderGeometrySvgFromState } from '../render';\nimport { PropertiesPopover } from './PropertiesPopover';\nimport { TransformParamPopover } from './TransformParamPopover';\nimport { UndoIcon, RedoIcon } from './LeftPanel';\n\ninterface Props {\n initialState: SerializedBoard | null;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Khi true, panel position offset left để chừa chỗ cho StampLeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Callback khi handle/state thay đổi — parent sync LeftPanel state. */\n onStateChange?: (state: GeomBoardState) => void;\n isDark?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n /** Mobile header: undo/redo. Bypass LeftPanel để user truy cập nhanh. */\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n}\n\nexport interface GeomBoardState {\n tool: GeomTool;\n showAxis: boolean;\n showGrid: boolean;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport interface GeometryEditorPanelHandle {\n setTool: (t: GeomTool) => void;\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n undo: () => void;\n redo: () => void;\n /** Trigger Chèn programmatically (cho auto-insert khi click outside). */\n insert: () => boolean;\n /** Có nội dung để chèn không? */\n hasContent: () => boolean;\n}\n\nexport const GeometryEditorPanel = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanel({ initialState, onInsert, onClose, withLeftPanel = false, onStateChange, isDark, isMobile = false, onOpenDrawer, onUndo, onRedo, canUndo, canRedo }, ref) {\n const handleRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [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 canRedo: h.canRedo(),\n });\n }, []);\n\n const handleReady = useCallback((h: MiniBoardHandle) => {\n handleRef.current = h;\n setReady(true);\n emitState();\n // Subscribe để parent biết khi nào tool/axis/grid/undo thay đổi\n h.subscribe(emitState);\n h.onSelect((snap: ObjectSnapshot) => setPropsPopover(snap));\n h.onTransformParam((info) => setTransformPopover(info));\n }, [emitState]);\n\n // Build serialized state (sentinels intact) — async vì SVG render offscreen\n // với light palette để Excalidraw filter tự đảo khi dark mode.\n const performInsert = useCallback((): boolean => {\n if (!handleRef.current) return false;\n const log = handleRef.current.getCreationLog();\n if (log.length === 0) return false;\n const bbox = handleRef.current.getBbox();\n const showAxis = handleRef.current.getShowAxis();\n const showGrid = handleRef.current.getShowGrid();\n const serialized = serializeBoard(\n { getBoundingBox: () => bbox, create: () => undefined },\n log,\n { showAxis, showGrid },\n );\n const jsonState = JSON.stringify(serialized);\n // Fire-and-forget. Caller (`tryInsert`) chỉ cần biết có nội dung không.\n void (async () => {\n try {\n const svgString = await renderGeometrySvgFromState(jsonState);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n })();\n return true;\n }, [onInsert]);\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n useImperativeHandle(ref, () => ({\n setTool: (t) => handleRef.current?.setTool(t),\n setShowAxis: (b) => handleRef.current?.setShowAxis(b),\n setShowGrid: (b) => handleRef.current?.setShowGrid(b),\n undo: () => handleRef.current?.undo(),\n redo: () => handleRef.current?.redo(),\n insert: performInsert,\n hasContent: () => (handleRef.current?.getCreationLog().length ?? 0) > 0,\n }), [performInsert]);\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học\"\n data-testid=\"geometry-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : 'h-[540px] max-h-[85vh] w-[640px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"3,18 12,3 21,18\" />\n <circle cx=\"12\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"21\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n Dựng hình học\n </h3>\n {isMobile && (\n <>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n aria-label=\"Hoàn tác\"\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n data-testid=\"undo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n aria-label=\"Làm lại\"\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n data-testid=\"redo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <RedoIcon />\n </button>\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geometry-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n </>\n )}\n <button onClick={onClose} aria-label=\"Đóng\" className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1\" style={isMobile ? undefined : { height: '420px' }}>\n <JSXGraphMiniBoard\n onReady={handleReady}\n initialState={initialState}\n isDark={isDark}\n />\n </div>\n {propsPopover && (\n propsPopover.kind === 'point' ? (\n <PropertiesPopover\n kind=\"point\"\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentFace={propsPopover.face}\n currentShowLabel={propsPopover.showLabel}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n // Refresh snapshot để UI checkbox phản ánh state mới\n if (typeof patch.valueLabel === 'boolean' || patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n }}\n />\n ) : (\n <PropertiesPopover\n kind={propsPopover.kind}\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentShowLabel={propsPopover.showLabel}\n currentShowValue={propsPopover.showValue}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n if (typeof patch.valueLabel === 'boolean') {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n if (patch.attrs && 'withLabel' in patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showLabel: !!patch.attrs?.withLabel } : cur);\n }\n }}\n />\n )\n )}\n\n {transformPopover && (\n <TransformParamPopover\n kind={transformPopover.tool}\n anchor={transformPopover.anchor}\n defaultValue={\n transformPopover.tool === 'rotate' ? 90\n : transformPopover.tool === 'dilate' ? 2\n : 6\n }\n isDark={isDark}\n onConfirm={(v) => { handleRef.current?.confirmTransformParam(v); setTransformPopover(null); }}\n onCancel={() => { handleRef.current?.cancelTransformParam(); setTransformPopover(null); }}\n />\n )}\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geometry-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n );\n },\n);\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseChordShortcutArgs<G extends string> {\n groupOrder: readonly G[];\n tools: ReadonlyArray<{ key: string; group: G }>;\n onSelect: (toolKey: string) => void;\n enabled: boolean;\n}\n\ninterface UseChordShortcutResult<G extends string> {\n chordGroup: G | null;\n cancel: () => void;\n}\n\nconst A_CODE = 'a'.charCodeAt(0);\n\nfunction isFieldFocused(): boolean {\n const ae = (typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null);\n return !!(\n ae &&\n (ae.tagName === 'INPUT' ||\n ae.tagName === 'TEXTAREA' ||\n ae.isContentEditable)\n );\n}\n\nexport function useChordShortcut<G extends string>(\n args: UseChordShortcutArgs<G>,\n): UseChordShortcutResult<G> {\n const { groupOrder, tools, onSelect, enabled } = args;\n\n const [chordGroup, setChordGroup] = useState<G | null>(null);\n\n const groupOrderRef = useRef(groupOrder);\n const toolsRef = useRef(tools);\n const onSelectRef = useRef(onSelect);\n const chordGroupRef = useRef<G | null>(null);\n\n groupOrderRef.current = groupOrder;\n toolsRef.current = tools;\n onSelectRef.current = onSelect;\n // chordGroupRef được sync ngay trong handler (xem `setChord` dưới đây)\n // thay vì ghi từ render body — nếu ghi ở body sẽ bị React batch hoá khi\n // hai event xảy ra trong cùng một act() (event sau đọc giá trị cũ).\n\n const cancel = useCallback(() => {\n chordGroupRef.current = null;\n setChordGroup(null);\n }, []);\n\n useEffect(() => {\n if (!enabled) return;\n\n const setChord = (next: G | null) => {\n chordGroupRef.current = next;\n setChordGroup(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isFieldFocused()) return;\n\n const key = e.key;\n const lower = key.length === 1 ? key.toLowerCase() : key;\n\n if (key === 'Escape') {\n if (chordGroupRef.current !== null) {\n e.preventDefault();\n e.stopPropagation();\n setChord(null);\n }\n return;\n }\n\n if (lower.length === 1 && lower >= 'a' && lower <= 'z') {\n const idx = lower.charCodeAt(0) - A_CODE;\n if (idx < groupOrderRef.current.length) {\n e.preventDefault();\n e.stopPropagation();\n setChord(groupOrderRef.current[idx]);\n }\n return;\n }\n\n if (key >= '1' && key <= '9') {\n const active = chordGroupRef.current;\n if (active === null) return;\n const n = key.charCodeAt(0) - '1'.charCodeAt(0); // 0-indexed\n const toolsInGroup = toolsRef.current.filter(\n (t) => t.group === active,\n );\n e.preventDefault();\n e.stopPropagation();\n if (n < toolsInGroup.length) {\n onSelectRef.current(toolsInGroup[n].key);\n }\n setChord(null);\n return;\n }\n };\n\n window.addEventListener('keydown', onKey, { capture: true });\n return () => {\n window.removeEventListener('keydown', onKey, { capture: true });\n };\n }, [enabled]);\n\n return { chordGroup, cancel };\n}\n","export interface SvgImageResult {\n dataURL: string;\n fileId: string;\n width: number;\n height: number;\n mimeType: 'image/svg+xml';\n}\n\nasync function hashString(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest)).slice(0, 16).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (h1 >>> 0).toString(16).padStart(8, '0') + (h2 >>> 0).toString(16).padStart(8, '0');\n}\n\nfunction parseSize(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n // Fallback: try viewBox\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n return attr === 'width' ? 200 : 100;\n}\n\n// SVG → image element data. Skips canvas rasterization entirely (canvas with\n// foreignObject + external resources gets tainted by browser security model,\n// blocking toDataURL). Excalidraw renders SVG natively via mimeType 'image/svg+xml'.\nexport async function svgToImageElement(svg: string): Promise<SvgImageResult> {\n const width = parseSize(svg, 'width');\n const height = parseSize(svg, 'height');\n // Use UTF-8 safe base64 encoding (btoa fails on non-Latin1 chars)\n const utf8 = unescape(encodeURIComponent(svg));\n const dataURL = 'data:image/svg+xml;base64,' + btoa(utf8);\n const fileId = await hashString(dataURL);\n return { dataURL, fileId, width, height, mimeType: 'image/svg+xml' };\n}\n","import { svgToImageElement } from './svgToImage';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData từ kích thước SVG vừa đo được. Đặt làm factory để\n * các stamp loại khác nhau (geometry cần svgWidth/svgHeight, latex không cần)\n * đều có thể chèn data tuỳ ý.\n */\n makeCustomData: (width: number, height: number) => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. svgToImageElement(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await svgToImageElement(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData(width, height);\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width, height, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { GeometryLeftPanel } from './editor/LeftPanel';\nimport {\n GeometryEditorPanel,\n type GeometryEditorPanelHandle,\n type GeomBoardState,\n} from './editor/EditorPanel';\nimport type { GeomTool } from './editor/MiniBoard';\nimport { GROUP_ORDER, TOOLS } from './editor/tools';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport type { SerializedBoard } from './serialize';\nimport { isGeometryCustomData, type GeometryCustomData } from './types';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\n\nconst INITIAL_GEOM_STATE: GeomBoardState = {\n tool: 'move',\n showAxis: false,\n showGrid: false,\n canUndo: false,\n canRedo: false,\n};\n\nexport const GeometryStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function GeometryStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GeometryEditorPanelHandle | null>(null);\n const [geomState, setGeomState] = useState<GeomBoardState>(INITIAL_GEOM_STATE);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS,\n onSelect: (key) => panelRef.current?.setTool(key as GeomTool),\n enabled: !isMobile,\n });\n\n const initialState = useMemo<SerializedBoard | null>(() => {\n if (!editingElement) return null;\n if (!isGeometryCustomData(editingElement.customData)) return null;\n try {\n return JSON.parse(editingElement.customData.jsonState) as SerializedBoard;\n } catch {\n console.warn('GeometryStampHost: customData jsonState corrupted');\n return null;\n }\n }, [editingElement]);\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (width, height): GeometryCustomData => ({\n kind: 'geometry',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <GeometryLeftPanel\n activeTool={geomState.tool}\n onToolChange={(t: GeomTool) => panelRef.current?.setTool(t)}\n showAxis={geomState.showAxis}\n showGrid={geomState.showGrid}\n onShowAxisChange={(b) => panelRef.current?.setShowAxis(b)}\n onShowGridChange={(b) => panelRef.current?.setShowGrid(b)}\n onUndo={() => panelRef.current?.undo()}\n canUndo={geomState.canUndo}\n onRedo={() => panelRef.current?.redo()}\n canRedo={geomState.canRedo}\n onClose={onClose}\n isDark={isDark}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n chordGroup={chordGroup}\n />\n <GeometryEditorPanel\n ref={panelRef}\n initialState={initialState}\n onInsert={handleInsert}\n onClose={onClose}\n onStateChange={setGeomState}\n withLeftPanel={!isMobile}\n isDark={isDark}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n onUndo={() => panelRef.current?.undo()}\n onRedo={() => panelRef.current?.redo()}\n canUndo={geomState.canUndo}\n canRedo={geomState.canRedo}\n />\n </>\n );\n },\n);\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport { renderGeometrySvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport {\n isGeometryCustomData,\n type GeometryCustomData,\n} from './types';\n\nexport { isGeometryCustomData };\nexport type { GeometryCustomData };\n\nconst GeometryStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.GeometryStampHost })),\n);\n\nconst GeometryIcon: ReactNode = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport const geometryStamp: StampType = {\n kind: 'geometry',\n shortcutKey: 'g',\n toolbarLabel: 'G',\n toolbarTitle: 'Chèn hình học (G)',\n toolbarIcon: GeometryIcon,\n toolbarTestId: 'stamp-toolbar-geometry',\n matchesCustomData: isGeometryCustomData,\n async renderSvgFromCustomData(data) {\n if (!isGeometryCustomData(data)) {\n throw new Error('geometryStamp.renderSvgFromCustomData: customData không phải geometry');\n }\n return renderGeometrySvgFromState(data.jsonState);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as GeometryCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGeometryCustomData(data)) return null;\n const svgString = await renderGeometrySvgFromState(data.jsonState);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL = 'data:image/svg+xml;base64,' + (\n typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64')\n );\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: GeometryStampHost,\n};\n"]}
1
+ {"version":3,"sources":["../src/stamps/geometry-2d/renderInline.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-2d/serialize.ts","../src/stamps/shared/safeJsx.ts","../src/stamps/geometry-2d/render.ts","../src/stamps/geometry-2d/types.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/handlers.ts","../src/stamps/geometry-2d/editor/MiniBoard.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/geometry-2d/editor/LeftPanel.tsx","../src/stamps/shared/excalidrawPalette.ts","../src/stamps/shared/useIsMobile.ts","../src/stamps/geometry-2d/editor/PropertiesPopover.tsx","../src/stamps/geometry-2d/editor/TransformParamPopover.tsx","../src/stamps/geometry-2d/editor/EditorPanel.tsx","../src/stamps/shared/useChordShortcut.ts","../src/stamps/shared/svgToImage.ts","../src/stamps/shared/insertImage.ts","../src/stamps/geometry-2d/host.tsx","../src/stamps/geometry-2d/index.tsx"],"names":["jsx","jsxs","hits","name","pick","sc","useRef","useId","useState","useCallback","useEffect","obj","Fragment","useMemo","createPortal","useLayoutEffect","rect","w","left","top","forwardRef","GeometryEditorPanel","useImperativeHandle","A_CODE","GeometryStampHost","lazy"],"mappings":"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","file":"geometry-2d.js","sourcesContent":["export function renderGeometryToSvg(boardContainer: HTMLElement): string {\n const svgEl = boardContainer.querySelector('svg');\n if (!svgEl) throw new Error('renderGeometryToSvg: no SVG found in board container');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n return new XMLSerializer().serializeToString(clone);\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Creation log của JSXGraphMiniBoard lưu attrs dưới dạng \"sentinel\" string\n// (`@stroke`, `@axis`, `@grid`, `@label`) thay vì màu cụ thể. Khi:\n// 1. Editor render real-time → resolve theo `isDark` của editor.\n// 2. Offscreen re-render (sau reload / sau khi switch theme) → resolve theo\n// `isDark` của canvas Excalidraw hiện tại.\n//\n// Nhờ vậy stamp tự đổi màu khi user switch dark/light, giống các nét vẽ\n// native của Excalidraw.\n\nexport const themeStroke = (dark: boolean) => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean) => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean) => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean) => (dark ? '#e2e8f0' : '#000000');\n\nexport interface GeomPalette {\n stroke: string;\n axis: string;\n grid: string;\n label: string;\n}\n\nexport function paletteFor(isDark: boolean): GeomPalette {\n return {\n stroke: themeStroke(isDark),\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n };\n}\n\nconst SENTINEL_MAP: Record<string, keyof GeomPalette> = {\n '@stroke': 'stroke',\n '@axis': 'axis',\n '@grid': 'grid',\n '@label': 'label',\n};\n\n/**\n * Walk attrs object/array/string và thay sentinel bằng màu thực từ palette.\n * Đệ quy để hỗ trợ nested attrs (ví dụ polygon's `borders.strokeColor`).\n * Trả về object mới — input giữ nguyên (immutable, an toàn cho log).\n */\nexport function resolveAttrColors<T>(attrs: T, palette: GeomPalette): T {\n if (typeof attrs === 'string') {\n const key = SENTINEL_MAP[attrs];\n return (key ? palette[key] : attrs) as T;\n }\n if (Array.isArray(attrs)) {\n return attrs.map((a) => resolveAttrColors(a, palette)) as unknown as T;\n }\n if (attrs && typeof attrs === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(attrs as Record<string, unknown>)) {\n out[k] = resolveAttrColors(v, palette);\n }\n return out as T;\n }\n return attrs;\n}\n","// JSXGraph không có built-in getJSON. Component giữ MỘT LOG riêng của các create() call\n// do user trigger, pass log đó vào serializeBoard. Replay = gọi board.create() theo thứ tự log.\n//\n// type === 'transform': args là [refs đến điểm/đường/scalar], attrs là { type: 'translate'|'rotate'|'reflect'|'scale', ... }.\n// Object trả về (kết quả board.create('transform', ...)) được đăng ký vào idMap như mọi element khác\n// để point/line phụ thuộc reference được bằng id ('j5' → JSXGraph transform object).\n//\n// Log lưu màu dưới dạng sentinel ('@stroke', '@axis', '@grid', '@label') để\n// theme-neutral. Khi replay, palette resolve thành màu thực theo `isDark` hiện\n// tại (truyền qua options.palette).\n\nimport { paletteFor, resolveAttrColors, type GeomPalette } from './editor/theme';\n\nexport interface SerializedElement {\n type: string;\n args: unknown[];\n attrs: Record<string, unknown>;\n id: string;\n}\n\nexport interface SerializedBoard {\n bbox: [number, number, number, number];\n elements: SerializedElement[];\n showAxis?: boolean;\n showGrid?: boolean;\n}\n\ninterface BoardLike {\n getBoundingBox(): [number, number, number, number];\n create(type: string, args: unknown[], attrs: Record<string, unknown>): unknown;\n}\n\nexport function serializeBoard(\n board: BoardLike,\n log: SerializedElement[],\n options: { showAxis?: boolean; showGrid?: boolean } = {},\n): SerializedBoard {\n return {\n bbox: board.getBoundingBox(),\n elements: log.map(e => ({ type: e.type, args: e.args, attrs: e.attrs, id: e.id })),\n showAxis: !!options.showAxis,\n showGrid: !!options.showGrid,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction createValueLabel(board: any, target: any): unknown {\n if (!board || !target) return null;\n const e = (target.elType ?? target.type ?? '').toString().toLowerCase();\n if (e === 'segment' || e === 'line' || e === 'arrow') {\n const p1 = target.point1, p2 = target.point2;\n if (!p1 || !p2) return null;\n return board.create('text', [\n () => (p1.X() + p2.X()) / 2 + 0.15,\n () => (p1.Y() + p2.Y()) / 2 + 0.25,\n () => {\n const len = Math.hypot(p2.X() - p1.X(), p2.Y() - p1.Y());\n const name = typeof target.name === 'string' && target.name ? target.name : 'd';\n return `${name} = ${len.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n if (e === 'circle' || e === 'circumcircle') {\n const center = target.center ?? target.midpoint ?? target.point1;\n if (!center) return null;\n return board.create('text', [\n () => center.X() + 0.3,\n () => center.Y() + 0.3,\n () => {\n const r = typeof target.Radius === 'function' ? target.Radius() : 0;\n const name = typeof target.name === 'string' && target.name ? target.name : 'r';\n return `${name} = ${r.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n return null;\n}\n\nexport interface DeserializeOptions {\n /** Theme-aware palette để resolve sentinel attrs. Mặc định = light. */\n palette?: GeomPalette;\n}\n\nexport function deserializeIntoBoard(\n board: BoardLike,\n serialized: SerializedBoard,\n options: DeserializeOptions = {},\n): void {\n // Replay: args may contain references to earlier elements by our serialized id (\"j0\", \"j1\"…).\n // We resolve those to actual JSXGraph objects via a local id→object map. Nested\n // arrays are also resolved recursively — needed for dilate, which logs the\n // transform parent of a transformed point as [\"j2\",\"j3\",\"j4\"] (a chain of 3\n // transforms passed to `board.create('point', [src, [t1,t2,t3]])`).\n const palette = options.palette ?? paletteFor(false);\n const idMap = new Map<string, unknown>();\n // \"<polyId>:border:<i>\" → polygon.borders[i]. Polygon borders are auto-created\n // sub-segments of a (regular)polygon that user-driven tools can reference as\n // line slots (vd. perpendicular từ điểm tới cạnh đa giác).\n const resolve = (a: unknown): unknown => {\n if (typeof a === 'string') {\n if (idMap.has(a)) return idMap.get(a);\n const m = /^(.+):border:(\\d+)$/.exec(a);\n if (m) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const poly = idMap.get(m[1]) as any;\n const idx = parseInt(m[2], 10);\n if (poly && Array.isArray(poly.borders) && poly.borders[idx]) {\n return poly.borders[idx];\n }\n }\n }\n if (Array.isArray(a)) return a.map(resolve);\n return a;\n };\n for (const el of serialized.elements) {\n const resolvedArgs = el.args.map(resolve);\n if (el.type === 'valueLabel') {\n const target = resolvedArgs[0];\n const txt = createValueLabel(board, target);\n if (txt) idMap.set(el.id, txt);\n continue;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, palette);\n const created = board.create(el.type, resolvedArgs, themedAttrs);\n idMap.set(el.id, created);\n }\n}\n","const isDev = (() => {\n try {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n } catch {\n return false;\n }\n})();\n\n/**\n * Wrap JSXGraph operations that can throw on stale/missing state.\n * In dev mode: log to console. In prod: silent swallow + return fallback.\n *\n * @param label Short tag for grep-ability (vd \"removeObject\", \"board.update\").\n * @param fn Operation to execute.\n * @param fallback Value to return if fn throws (default: undefined).\n */\nexport function safeJsx<T>(label: string, fn: () => T): T | undefined;\nexport function safeJsx<T>(label: string, fn: () => T, fallback: T): T;\nexport function safeJsx<T>(label: string, fn: () => T, fallback?: T): T | undefined {\n try {\n return fn();\n } catch (err) {\n if (isDev) {\n // eslint-disable-next-line no-console\n console.warn('[whiteboard:jsxgraph]', label, err);\n }\n return fallback;\n }\n}\n","import { renderGeometryToSvg } from './renderInline';\nimport { deserializeIntoBoard, type SerializedBoard } from './serialize';\nimport { paletteFor } from './editor/theme';\nimport { safeJsx } from '../shared/safeJsx';\n\n/**\n * Re-render geometry SVG từ jsonState đã serialize. Dùng cho:\n * 1. Restore math-stamp file sau khi reload page (Excalidraw mất binary files).\n * 2. Generate SVG lúc INSERT (thay vì clone DOM với màu theo theme editor).\n *\n * LƯU Ý quan trọng — luôn dùng LIGHT palette (nét đậm). Excalidraw apply CSS\n * `filter: invert(93%) hue-rotate(180deg)` lên canvas trong dark mode → nét\n * đậm tự đảo thành sáng. Nếu ta bake nét sáng vào SVG cho dark mode, filter\n * sẽ đảo thành đậm → chìm vào nền tối. Giải pháp: luôn dùng nét đậm + để\n * Excalidraw tự lo invert.\n *\n * Implementation: tạo 1 div ẩn (off-screen, real dimensions để JSXGraph render\n * chuẩn), initBoard, replay creation log từ jsonState, dump SVG, dọn dẹp.\n *\n * Container dimensions phải MATCH aspect ratio của bbox (đã được editor lưu\n * sau khi JSXGraph adjust với keepAspectRatio:true). Trước đây hardcode\n * 400×300 + keepAspectRatio:false làm shape bị kéo dãn (circle thành ellipse,\n * góc vuông lệch) khi bbox không 4:3 → ảnh hiển thị khác với editor lúc\n * double-click. Fix: tính container W/H từ bbox + keepAspectRatio:true để\n * SVG output khớp với view trong editor.\n *\n * Lý do JXG.Options.text.display = 'internal': JSXGraph mặc định render\n * label bằng HTML <div> overlay → clone SVG export sẽ thiếu label.\n */\n\nconst PIXELS_PER_UNIT = 20;\nconst MIN_DIM = 100;\nconst MAX_DIM = 1200;\nconst FALLBACK_W = 400;\nconst FALLBACK_H = 300;\n\nexport function containerDimsForBbox(bbox: [number, number, number, number]): { width: number; height: number } {\n const [xmin, ymax, xmax, ymin] = bbox;\n const w = Math.abs(xmax - xmin);\n const h = Math.abs(ymax - ymin);\n if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) {\n return { width: FALLBACK_W, height: FALLBACK_H };\n }\n let width = w * PIXELS_PER_UNIT;\n let height = h * PIXELS_PER_UNIT;\n const maxAxis = Math.max(width, height);\n if (maxAxis > MAX_DIM) {\n const ratio = MAX_DIM / maxAxis;\n width *= ratio;\n height *= ratio;\n }\n const minAxis = Math.min(width, height);\n if (minAxis < MIN_DIM) {\n const ratio = MIN_DIM / minAxis;\n width *= ratio;\n height *= ratio;\n }\n return { width: Math.round(width), height: Math.round(height) };\n}\n\nexport async function renderGeometrySvgFromState(jsonState: string): Promise<string> {\n const parsed = JSON.parse(jsonState) as SerializedBoard;\n // Stamps inserted vào Excalidraw canvas → luôn dùng light palette.\n // Excalidraw's THEME_FILTER tự đảo nét trong dark mode.\n const palette = paletteFor(false);\n const JXG = (await import('jsxgraph')).default;\n safeJsx('render.applyOptions', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.text.strokeColor = palette.label;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n opts.label.strokeColor = palette.label;\n opts.axis = opts.axis || {};\n opts.axis.strokeColor = palette.axis;\n opts.grid = opts.grid || {};\n opts.grid.strokeColor = palette.grid;\n }\n });\n const { width, height } = containerDimsForBbox(parsed.bbox);\n const container = document.createElement('div');\n const containerId = 'jxg_offscreen_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\n container.id = containerId;\n container.style.cssText = `position:absolute;top:-99999px;left:-99999px;width:${width}px;height:${height}px;visibility:hidden;pointer-events:none;`;\n document.body.appendChild(container);\n let board: unknown = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board = (JXG as any).JSXGraph.initBoard(containerId, {\n boundingbox: parsed.bbox,\n axis: !!parsed.showAxis,\n grid: !!parsed.showGrid,\n showCopyright: false,\n showNavigation: false,\n keepAspectRatio: true,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n deserializeIntoBoard(board as any, parsed, { palette });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (board as any).update();\n return renderGeometryToSvg(container);\n } finally {\n safeJsx('render.freeBoard', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (board) (JXG as any).JSXGraph.freeBoard(board);\n });\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface GeometryCustomData extends BaseStampCustomData {\n kind: 'geometry';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGeometryCustomData(data: unknown): data is GeometryCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<GeometryCustomData>;\n return d.kind === 'geometry' && d.version === 1 && typeof d.jsonState === 'string';\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type JxgObj = any;\n\nexport type DefKind = 'point' | 'segment' | 'line' | 'ray' | 'arrow' | 'circleCenter' | 'circle3';\n\nexport interface DefiningPointsResult {\n kind: DefKind;\n points: JxgObj[];\n attrs: Record<string, unknown>;\n}\n\nconst LINE_LIKE = new Set(['line', 'segment', 'arrow']);\n\nfunction copyVisAttrs(obj: JxgObj): Record<string, unknown> {\n const v = obj?.visProp ?? {};\n const pick = (k: string) => v?.[k];\n const out: Record<string, unknown> = {};\n const mapping: Array<[string, string]> = [\n ['strokecolor', 'strokeColor'],\n ['strokewidth', 'strokeWidth'],\n ['strokeopacity', 'strokeOpacity'],\n ['dash', 'dash'],\n ['fillcolor', 'fillColor'],\n ['fillopacity', 'fillOpacity'],\n ];\n for (const [from, to] of mapping) {\n const val = pick(from);\n if (val !== undefined) out[to] = val;\n }\n return out;\n}\n\nexport function getDefiningPoints(obj: JxgObj): DefiningPointsResult | null {\n if (!obj) return null;\n const e = (obj.elType ?? obj.type ?? '').toString().toLowerCase();\n if (e === 'point' || e === 'glider' || e === 'midpoint') {\n return { kind: 'point', points: [obj], attrs: copyVisAttrs(obj) };\n }\n if (LINE_LIKE.has(e) && obj.point1 && obj.point2) {\n const kind: DefKind = e === 'segment' ? 'segment' : e === 'arrow' ? 'arrow' : 'line';\n return { kind, points: [obj.point1, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circle' && obj.center && obj.point2) {\n return { kind: 'circleCenter', points: [obj.center, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circumcircle' && obj.point1 && obj.point2 && obj.point3) {\n return {\n kind: 'circle3',\n points: [obj.point1, obj.point2, obj.point3],\n attrs: copyVisAttrs(obj),\n };\n }\n return null;\n}\n\nexport type TransformInput =\n | { kind: 'translate'; vectorPoints: [JxgObj, JxgObj] }\n | { kind: 'rotate'; center: JxgObj; angleDeg: number }\n | { kind: 'reflectLine'; line: JxgObj }\n | { kind: 'reflectPoint'; center: JxgObj }\n | { kind: 'dilate'; center: JxgObj; k: number };\n\nexport interface TransformSpec {\n params: unknown[];\n attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' };\n /**\n * Khi `chain` được set, finalizeTransformCreate dựng từng transform trong chain\n * (theo thứ tự) rồi pass mảng vào `board.create('point', [src, [t1, t2, t3]])`.\n * Dùng cho `dilate` (scale-quanh-điểm) vì JSXGraph 'scale' không nhận center.\n */\n chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }>;\n}\n\nexport function buildTransformSpec(input: TransformInput): TransformSpec {\n switch (input.kind) {\n case 'translate': {\n // Literal dx/dy (không phải callback) để serialize qua JSON.stringify được.\n // Trade-off: transformed object không cập nhật khi user kéo điểm vector — chấp nhận.\n const [a, b] = input.vectorPoints;\n const dx = b.X() - a.X();\n const dy = b.Y() - a.Y();\n return { params: [dx, dy], attrs: { type: 'translate' } };\n }\n case 'rotate':\n return {\n params: [(input.angleDeg * Math.PI) / 180, input.center],\n attrs: { type: 'rotate' },\n };\n case 'reflectLine':\n return { params: [input.line], attrs: { type: 'reflect' } };\n case 'reflectPoint':\n // JSXGraph 'scale' chỉ nhận 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 bị lờ → trước đây sai. Đối xứng qua điểm = quay 180°\n // quanh điểm đó. Dùng 'rotate' (params [angle, center]) để chuẩn.\n return { params: [Math.PI, input.center], attrs: { type: 'rotate' } };\n case 'dilate':\n // JSXGraph 'scale' chỉ nhận đúng 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 làm constructor throw. Dilate quanh điểm c bằng tỷ số k\n // = compose 3 phép: T(-c) → S(k,k) → T(+c). Sinh ra chain (mảng spec) thay vì\n // 1 spec đơn; consumer (finalizeTransformCreate) tự nhận biết.\n return {\n params: [],\n attrs: { type: 'scale' },\n chain: [\n { params: [-input.center.X(), -input.center.Y()], attrs: { type: 'translate' as const } },\n { params: [input.k, input.k], attrs: { type: 'scale' as const } },\n { params: [input.center.X(), input.center.Y()], attrs: { type: 'translate' as const } },\n ],\n };\n }\n}\n","import React from 'react';\n\n/**\n * Static catalog của tất cả GeomTool — không phụ thuộc board state, chỉ là\n * metadata (key, label, hint, icon SVG, group, số click cần, accept types).\n *\n * Tách khỏi JSXGraphMiniBoard.tsx để (1) giảm size file component và (2) dễ\n * mở rộng tool mới mà không cần đụng vào board logic.\n */\n\n// Tool keys — match GeoGebra-style toolset\nexport type GeomTool =\n | 'move'\n | 'select'\n | 'point'\n | 'midpoint'\n | 'segment'\n | 'line'\n | 'ray'\n | 'vector'\n | 'perpendicular'\n | 'parallel'\n | 'perpBisector'\n | 'angleBisector'\n | 'polygon'\n | 'regularPolygon'\n | 'circleCenter'\n | 'circle3'\n | 'tangent'\n | 'angle'\n | 'distance'\n | 'area'\n | 'toggleLabel'\n | 'toggleVisible'\n | 'delete'\n | 'translate'\n | 'rotate'\n | 'reflectLine'\n | 'reflectPoint'\n | 'dilate';\n\nexport interface ToolDef {\n key: GeomTool;\n label: string;\n hint: string;\n icon: React.ReactNode;\n group:\n | 'move'\n | 'point'\n | 'line'\n | 'construct'\n | 'polygon'\n | 'circle'\n | 'measure'\n | 'edit'\n | 'transform';\n /** Số click cần trước khi action fire. -1 = mở (polygon đóng bằng click lại điểm đầu). */\n needs: number;\n /** Loại object accept ở mỗi slot. 'any' = point hoặc non-point. */\n accepts?: Array<'point' | 'line' | 'circle' | 'any'>;\n}\n\n// ============== Tool icons — inline SVG ==============\nconst Icon = {\n cursor: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\"/></svg>\n ),\n select: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\" fill=\"none\"/><rect x=\"2.5\" y=\"2.5\" width=\"19\" height=\"19\" strokeDasharray=\"3 2\" fill=\"none\"/></svg>\n ),\n point: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\"/></svg>\n ),\n midpoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"20\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/></svg>\n ),\n segment: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\"/><circle cx=\"5\" cy=\"18\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"6\" r=\"1.7\" fill=\"currentColor\"/></svg>\n ),\n line: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"4\"/><circle cx=\"8\" cy=\"16\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"16\" cy=\"8\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n ray: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"19\" x2=\"22\" y2=\"2\"/><circle cx=\"5\" cy=\"19\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n vector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><polyline points=\"14,4 20,4 20,10\"/></svg>\n ),\n perpendicular: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"4\"/><rect x=\"12\" y=\"14\" width=\"4\" height=\"4\" fill=\"none\"/></svg>\n ),\n parallel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"5\"/><line x1=\"3\" y1=\"19\" x2=\"21\" y2=\"15\"/></svg>\n ),\n perpBisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><circle cx=\"6\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"18\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n bisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"12\" strokeDasharray=\"3 2\"/></svg>\n ),\n polygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"6,6 18,6 22,14 12,22 4,14\"/></svg>\n ),\n regularPolygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"12,3 20,8 20,17 12,22 4,17 4,8\"/></svg>\n ),\n circleCenter: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n circle3: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"4\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"20\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"16\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n tangent: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"11\" cy=\"13\" r=\"6\"/><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"2\"/></svg>\n ),\n angle: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"6\"/><path d=\"M14 20 A 10 10 0 0 0 11 13\" /></svg>\n ),\n distance: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"8\" x2=\"4\" y2=\"16\"/><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"16\"/></svg>\n ),\n area: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><polygon points=\"5,6 19,6 21,14 13,21 3,15\" fill=\"currentColor\" fillOpacity=\"0.2\"/></svg>\n ),\n toggleLabel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><text x=\"3\" y=\"18\" fontSize=\"16\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text><text x=\"13\" y=\"14\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text></svg>\n ),\n toggleVisible: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3.5\" fill=\"currentColor\" fillOpacity=\"0.4\"/><circle cx=\"12\" cy=\"12\" r=\"3.5\"/><circle cx=\"20\" cy=\"6\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\"/><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/></svg>\n ),\n translate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 4 L20 20\"/><polygon points=\"14,4 20,4 20,10\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n rotate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 12 A8 8 0 1 1 12 20\"/><polyline points=\"4,9 4,13 8,13\"/></svg>\n ),\n reflectLine: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><polygon points=\"4,6 9,12 4,18\" fill=\"currentColor\"/><polygon points=\"20,6 15,12 20,18\" fill=\"currentColor\"/></svg>\n ),\n reflectPoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"19\" r=\"1.6\" fill=\"currentColor\"/><line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" strokeDasharray=\"2 2\"/></svg>\n ),\n dilate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><polygon points=\"6,18 18,18 12,6\" fillOpacity=\"0.1\" fill=\"currentColor\"/><polygon points=\"9,15 15,15 12,11\" fill=\"currentColor\"/></svg>\n ),\n};\n\n// ============== Tool catalog ==============\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Kéo điểm hoặc xoay nền', icon: Icon.cursor, group: 'move', needs: 0 },\n { key: 'select', label: 'Chọn', hint: 'Click để chọn 1 / Shift+click để bỏ thêm / Kéo nền để khoanh vùng / DEL để xoá', icon: Icon.select, group: 'move', needs: 0 },\n { key: 'point', label: 'Điểm mới', hint: 'Click để thêm điểm', icon: Icon.point, group: 'point', needs: 1 },\n { key: 'midpoint', label: 'Trung điểm', hint: 'Click 2 điểm có sẵn', icon: Icon.midpoint, group: 'point', needs: 2, accepts: ['point', 'point'] },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Click 2 điểm', icon: Icon.segment, group: 'line', needs: 2 },\n { key: 'line', label: 'Đường thẳng qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.line, group: 'line', needs: 2 },\n { key: 'ray', label: 'Tia qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.ray, group: 'line', needs: 2 },\n { key: 'vector', label: 'Vector', hint: 'Click 2 điểm', icon: Icon.vector, group: 'line', needs: 2 },\n { key: 'perpendicular', label: 'Đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpendicular, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'parallel', label: 'Đường song song', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.parallel, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'perpBisector', label: 'Đường trung trực', hint: 'Click 2 điểm có sẵn', icon: Icon.perpBisector, group: 'construct', needs: 2, accepts: ['point', 'point'] },\n { key: 'angleBisector', label: 'Đường phân giác', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.bisector, group: 'construct', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'polygon', label: 'Đa giác', hint: 'Click các điểm, click lại điểm đầu để đóng', icon: Icon.polygon, group: 'polygon', needs: -1 },\n { key: 'regularPolygon', label: 'Đa giác đều', hint: 'Click 2 điểm rồi nhập số cạnh', icon: Icon.regularPolygon, group: 'polygon', needs: 2, accepts: ['point', 'point'] },\n { key: 'circleCenter', label: 'Đường tròn (tâm + điểm)', hint: 'Click tâm rồi 1 điểm trên đường tròn', icon: Icon.circleCenter, group: 'circle', needs: 2 },\n { key: 'circle3', label: 'Đường tròn qua 3 điểm', hint: 'Click 3 điểm', icon: Icon.circle3, group: 'circle', needs: 3 },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Click 1 điểm + 1 đường tròn có sẵn', icon: Icon.tangent, group: 'circle', needs: 2, accepts: ['point', 'circle'] },\n { key: 'angle', label: 'Góc', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.angle, group: 'measure', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'distance', label: 'Khoảng cách', hint: 'Click 2 điểm có sẵn', icon: Icon.distance, group: 'measure', needs: 2, accepts: ['point', 'point'] },\n { key: 'area', label: 'Diện tích', hint: 'Click các đỉnh, click lại điểm đầu để đóng', icon: Icon.area, group: 'measure', needs: -1 },\n { key: 'toggleLabel', label: 'Hiện/ẩn tên', hint: 'Click vào đối tượng', icon: Icon.toggleLabel, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'toggleVisible', label: 'Hiện/ẩn đối tượng', hint: 'Click vào đối tượng', icon: Icon.toggleVisible, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'delete', label: 'Xoá', hint: 'Click vào đối tượng', icon: Icon.trash, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'translate', label: 'Phép tịnh tiến', hint: 'Click object → 2 điểm tạo vector', icon: Icon.translate, group: 'transform', needs: 3, accepts: ['any', 'point', 'point'] },\n { key: 'rotate', label: 'Quay đối tượng', hint: 'Click object → tâm quay → nhập góc', icon: Icon.rotate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'reflectLine', label: 'Đối xứng qua đường thẳng', hint: 'Click object → đường thẳng', icon: Icon.reflectLine, group: 'transform', needs: 2, accepts: ['any', 'line'] },\n { key: 'reflectPoint', label: 'Đối xứng qua điểm', hint: 'Click object → tâm đối xứng', icon: Icon.reflectPoint, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'dilate', label: 'Phép vị tự', hint: 'Click object → tâm → nhập tỷ số k', icon: Icon.dilate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n];\n\nexport const GROUP_LABELS: Record<ToolDef['group'], string> = {\n move: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường',\n construct: 'Dựng hình',\n polygon: 'Đa giác',\n circle: 'Đường tròn',\n measure: 'Đo lường',\n edit: 'Chỉnh sửa',\n transform: 'Phép biến hình',\n};\n\nexport type GeomGroup = ToolDef['group'];\n\n// Positional A..I — letter shortcut cho chord 2-phím.\n// Khớp đúng thứ tự hiển thị trong LeftPanel (derive từ TOOLS phía trên).\nexport const GROUP_ORDER: GeomGroup[] = [\n 'move',\n 'point',\n 'line',\n 'construct',\n 'polygon',\n 'circle',\n 'measure',\n 'edit',\n 'transform',\n];\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: GeomGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n\nexport function groupForLetter(ch: string): GeomGroup | null {\n if (ch.length !== 1) return null;\n const upper = ch.toUpperCase();\n const idx = upper.charCodeAt(0) - A_CODE;\n if (idx < 0 || idx >= GROUP_ORDER.length) return null;\n return GROUP_ORDER[idx];\n}\n\n// ============== Object-type matching ==============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\n/** Phân loại JSXGraph element type vào nhóm dùng cho accept-matching.\n *\n * Ưu tiên `elementClass` (numeric constant do JSXGraph set đúng cho mọi derived\n * element — intersection, reflection, glider, parallelpoint, mirrorpoint, ...\n * đều trả về OBJECT_CLASS_POINT). Nếu không có (test mocks), fallback sang\n * `elType` string với danh sách mở rộng các kiểu thường gặp.\n *\n * Constants từ JSXGraph: OBJECT_CLASS_POINT=1, OBJECT_CLASS_LINE=2, OBJECT_CLASS_CIRCLE=3.\n */\nexport function objKind(obj: JxgObj): 'point' | 'line' | 'circle' | 'other' {\n if (!obj) return 'other';\n const ec = typeof obj.elementClass === 'number' ? obj.elementClass : null;\n if (ec === 1) return 'point';\n if (ec === 2) return 'line';\n if (ec === 3) return 'circle';\n const e = (obj.elType || obj.type || '').toString().toLowerCase();\n if (\n e === 'point' || e === 'glider' || e === 'midpoint' ||\n e === 'intersection' || e === 'otherintersection' ||\n e === 'reflection' || e === 'mirrorpoint' || e === 'mirrorelement' ||\n e === 'orthogonalprojection' || e === 'parallelpoint'\n ) return 'point';\n if (\n e === 'line' || e === 'segment' || e === 'arrow' || e === 'axis' ||\n e === 'normal' || e === 'parallel' || e === 'perpendicular' ||\n e === 'tangent' || e === 'bisector' || e === 'perpendicularsegment'\n ) return 'line';\n if (e === 'circle' || e === 'circumcircle') return 'circle';\n return 'other';\n}\n\nexport function acceptMatches(\n tool: ToolDef,\n slot: number,\n kind: 'point' | 'line' | 'circle' | 'other',\n): boolean {\n if (!tool.accepts) return kind === 'point' || tool.key === 'point';\n const a = tool.accepts[slot];\n if (!a) return false;\n if (a === 'any') return kind !== 'other';\n return a === kind;\n}\n","/**\n * handlers.ts — Pure pointer/tool handler functions extracted from MiniBoard.tsx.\n *\n * Each function receives a HandlerCtx object containing the refs and callbacks\n * it needs, and a raw JSXGraph event object. No React, no DOM manipulation\n * beyond what JSXGraph provides through its API.\n *\n * The ctx pattern lets MiniBoard.tsx pass a stable object reference captured\n * at useEffect time, while the individual properties stay up-to-date because\n * they are refs (whose .current is read at call time) or stable callbacks\n * (whose identities don't change across renders).\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nimport { TOOLS, objKind, type GeomTool, type ToolDef } from './tools';\nimport { buildTransformSpec } from './transforms';\nimport { safeJsx } from '../../shared/safeJsx';\n\n// ─── Context shape ────────────────────────────────────────────────────────────\n\nexport interface HandlerCtx {\n // Refs (read .current at call time)\n boardRef: { current: JxgObj };\n toolRef: { current: GeomTool };\n pendingRef: { current: JxgObj[] };\n previewSegRef: { current: JxgObj[] };\n axisObjsRef: { current: { x?: JxgObj; y?: JxgObj } };\n selectedSetRef: { current: Set<JxgObj> };\n marqueeRef: { current: { startSx: number; startSy: number; rect?: JxgObj } | null };\n moveDownRef: { current: { sx: number; sy: number } | null };\n lastMoveClickRef: { current: { obj: JxgObj | null; time: number } };\n pendingTransformRef: { current: { tool: 'rotate' | 'dilate' | 'regularPolygon'; source: JxgObj; center: JxgObj; anchorScreen: { x: number; y: number } } | null };\n phantomRef: { current: JxgObj };\n previewShapeRef: { current: JxgObj };\n previewRafRef: { current: number | null };\n jxgRef: { current: JxgObj };\n\n // Stable callbacks (identity doesn't change)\n screenCoordsOf: (evt: JxgObj) => [number, number] | null;\n objectsAt: (evt: JxgObj) => JxgObj[];\n promoteLabel: (o: JxgObj) => JxgObj;\n findNearestPoint: (evt: JxgObj, tolPx?: number) => JxgObj | null;\n toggleSelect: (obj: JxgObj, additive: boolean) => void;\n clearSelection: () => void;\n applySelectionStyle: (obj: JxgObj) => void;\n localIdOf: (obj: JxgObj) => string | null;\n nextLabel: () => string;\n create: (type: string, args: unknown[], attrs?: Record<string, unknown>) => JxgObj;\n finalize: (toolDef: ToolDef, picks: JxgObj[]) => void;\n finalizeTransformCreate: (spec: Parameters<typeof buildTransformSpec>[0] extends never ? never : ReturnType<typeof buildTransformSpec>, source: JxgObj) => void;\n clearPending: () => void;\n clearPreviewSegs: () => void;\n refreshPreview: () => void;\n flashWarn: (msg: string) => void;\n emitTransform: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void;\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n emitSelect: (snap: any) => void;\n setPendingCount: (n: number) => void;\n setSelectionTick: (fn: (t: number) => number) => void;\n}\n\n// ─── board.on('down') ─────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleDown(ctx: HandlerCtx, e: any): void {\n if (!ctx.boardRef.current) return;\n const t = ctx.toolRef.current;\n if (t === 'move') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n ctx.moveDownRef.current = { sx, sy };\n return;\n }\n if (t === 'select') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // Ưu tiên điểm: exact hit → nearest-within-12px → mới đến hit khác (line/circle).\n // Tránh case click hơi lệch điểm mà line đi qua đó cướp mất pick.\n const obj = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPoint(e, 12) ?? hits[0];\n if (obj) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(obj, shift);\n // Stash so 'up' handler doesn't treat this as a marquee end.\n ctx.moveDownRef.current = { sx, sy };\n ctx.marqueeRef.current = null;\n return;\n }\n // Empty space: start marquee. We disable board pan while marqueeing\n // by not setting moveDownRef (board's internal pan listener relies on\n // it being null elsewhere; here we record marquee start separately).\n ctx.marqueeRef.current = { startSx: sx, startSy: sy };\n // Clear current selection unless shift is held (additive marquee).\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n return;\n }\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n const x = coords[0], y = coords[1];\n\n // Detect if click hits any existing object (snap target). Text labels\n // are promoted to their owning element so a click on the \"A\" label\n // counts as a click on the point A.\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // Prefer points over other elements when present\n const bestHit: JxgObj | null = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? null;\n // Generous fallback used when a slot expects a point: JSXGraph's `hasPoint`\n // for a small point is ~3px which is too tight for clicking, so we look up\n // the nearest existing point within 12px. Only applied where the active\n // tool slot needs a point — otherwise we'd shadow valid line/circle hits.\n const snapPointForPointSlot = (): JxgObj | null =>\n bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPoint(e, 12);\n\n // Tool: point — nếu click trúng ≥2 đường/đường tròn → tạo giao điểm\n // ràng buộc (khi kéo các đường, điểm này luôn là giao). Trường hợp 1\n // đường + click thường vẫn tạo điểm tự do (không glide để tránh ràng\n // buộc ngoài ý muốn).\n if (t === 'point') {\n const curves = hits.filter((o) => objKind(o) === 'line' || objKind(o) === 'circle');\n if (curves.length >= 2) {\n const a = curves[0];\n const b = curves[1];\n const aId = ctx.localIdOf(a);\n const bId = ctx.localIdOf(b);\n if (aId && bId) {\n const name = ctx.nextLabel();\n const attrs = { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' };\n try {\n // intersection trả về element [obj1, obj2] với giao gần (x, y).\n // JSXGraph cần index i (0 hoặc 1) cho trường hợp 2 giao (line-circle, circle-circle).\n // Chọn index dựa vào điểm gần click hơn.\n const isLineLine = objKind(a) === 'line' && objKind(b) === 'line';\n if (isLineLine) {\n ctx.create('intersection', [aId, bId, 0], attrs);\n } else {\n // Thử cả 2 index, chọn cái gần click hơn\n const tmp0 = ctx.boardRef.current.create('intersection', [a, b, 0], { visible: false, withLabel: false });\n const tmp1 = ctx.boardRef.current.create('intersection', [a, b, 1], { visible: false, withLabel: false });\n const d0 = Math.hypot((tmp0.X?.() ?? 0) - x, (tmp0.Y?.() ?? 0) - y);\n const d1 = Math.hypot((tmp1.X?.() ?? 0) - x, (tmp1.Y?.() ?? 0) - y);\n safeJsx('handlers.removeObject(intersect.tmp0)', () => ctx.boardRef.current.removeObject(tmp0));\n safeJsx('handlers.removeObject(intersect.tmp1)', () => ctx.boardRef.current.removeObject(tmp1));\n const idx = d0 <= d1 ? 0 : 1;\n ctx.create('intersection', [aId, bId, idx], attrs);\n }\n return;\n } catch {\n // fallback: tạo điểm tự do\n }\n }\n }\n const name = ctx.nextLabel();\n ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n return;\n }\n\n // Edit / single-target tools (toggleLabel, toggleVisible, delete)\n if (toolDef.needs === 1 && toolDef.accepts) {\n // Fall back to generous point snap if hasPoint missed a small point.\n const hit = bestHit ?? ctx.findNearestPoint(e, 12);\n if (hit) ctx.finalize(toolDef, [hit]);\n else ctx.flashWarn('Click vào một đối tượng để áp dụng');\n return;\n }\n\n // Polygon / area: variable-length, close on click near starting point\n if (toolDef.needs === -1) {\n const snappedPoint = snapPointForPointSlot();\n // Close ring first: if user clicks back on the first pending point\n // (with at least 3 points already), finalize. Done before push so the\n // first point isn't duplicated into pending.\n if (ctx.pendingRef.current.length >= 3 && snappedPoint && snappedPoint === ctx.pendingRef.current[0]) {\n ctx.clearPreviewSegs();\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n return;\n }\n // Reject re-picking an interior pending vertex (would create a degenerate edge).\n if (snappedPoint && ctx.pendingRef.current.includes(snappedPoint)) {\n ctx.flashWarn('Đỉnh này đã có — click điểm khác hoặc click lại điểm đầu để đóng');\n return;\n }\n // Otherwise pick (snap-to-existing or create) a new vertex\n const pick: JxgObj = snappedPoint ?? (() => {\n const name = ctx.nextLabel();\n return ctx.create('point', [x, y], { name, color: '@stroke', size: 3 });\n })();\n // Live preview: draw an edge from the previous pending vertex to\n // this new one so the user sees the polygon being built.\n if (ctx.pendingRef.current.length > 0 && ctx.boardRef.current) {\n const prev = ctx.pendingRef.current[ctx.pendingRef.current.length - 1];\n safeJsx('handlers.createPreviewSegment', () => {\n const seg = ctx.boardRef.current.create('segment', [prev, pick], {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.75,\n fixed: true,\n highlight: false,\n withLabel: false,\n });\n ctx.previewSegRef.current.push(seg);\n });\n }\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n return;\n }\n\n // Multi-click branch. Two sub-modes:\n // A) Strict + order-flexible: tool declared `accepts`. We bind each\n // click to whatever required kind is still unfilled, regardless\n // of click order. E.g. perpendicular accepts ['point', 'line']\n // and the user can click line-then-point or point-then-line.\n // B) Lenient + order-fixed: tool has no `accepts` (segment, line,\n // ray, vector, circle*, ...). All slots want points; missing\n // snaps create a fresh point.\n let pick: JxgObj | null = null;\n\n if (toolDef.accepts) {\n // --- Mode A: strict, order-flexible ---\n const usedKinds = ctx.pendingRef.current.map((p) => objKind(p));\n const remaining: Array<'point' | 'line' | 'circle' | 'any'> = [...toolDef.accepts];\n for (const u of usedKinds) {\n if (u === 'other') continue;\n const i = remaining.indexOf(u);\n if (i >= 0) remaining.splice(i, 1);\n }\n const strictPoint = hits.find((o) => objKind(o) === 'point') ?? null;\n const lineHit = hits.find((o) => objKind(o) === 'line') ?? null;\n const circleHit = hits.find((o) => objKind(o) === 'circle') ?? null;\n // Priority: an exact point hit binds to 'point' first (so a click\n // landing right on a vertex isn't stolen by a line/circle passing\n // through it). Typed line/circle bind next. 'any' slot accepts any\n // remaining hit (point/line/circle). Generous point-snap is the\n // last resort when only a 'point' slot is open.\n //\n // Previously 'any' was checked AFTER the snap fallback for point,\n // which meant tools like dilate (accepts ['any', 'point']) couldn't\n // pick a segment for the 'any' slot — the snap branch absorbed the\n // click and 'any' was never evaluated.\n if (remaining.includes('point') && strictPoint) pick = strictPoint;\n else if (remaining.includes('line') && lineHit) pick = lineHit;\n else if (remaining.includes('circle') && circleHit) pick = circleHit;\n else if (remaining.includes('any') && (strictPoint || lineHit || circleHit)) {\n pick = strictPoint ?? lineHit ?? circleHit;\n } else if (remaining.includes('point')) {\n const near = ctx.findNearestPoint(e, 12);\n if (near) pick = near;\n }\n if (!pick) {\n const needs = remaining.map((k) =>\n k === 'point' ? 'một điểm' : k === 'line' ? 'một đường/đoạn' : k === 'circle' ? 'một đường tròn' : 'một đối tượng',\n );\n ctx.flashWarn(`Còn cần click vào ${needs.join(' + ')} có sẵn`);\n return;\n }\n // Reject duplicate picks (e.g. click the same point twice for midpoint\n // would produce a degenerate object pointing at itself).\n if (ctx.pendingRef.current.includes(pick)) {\n ctx.flashWarn('Đã chọn đối tượng này — chọn đối tượng khác');\n return;\n }\n } else {\n // --- Mode B: lenient, all slots want a point ---\n const snapped = snapPointForPointSlot();\n if (snapped && ctx.pendingRef.current.includes(snapped)) {\n // Same point clicked twice → would produce a zero-length segment / etc.\n ctx.flashWarn('Đã chọn điểm này — chọn điểm khác hoặc click chỗ trống');\n return;\n }\n if (snapped) pick = snapped;\n else {\n const name = ctx.nextLabel();\n pick = ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n }\n }\n\n if (!pick) return;\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n\n if (ctx.pendingRef.current.length >= toolDef.needs) {\n const tk = toolDef.key;\n if (tk === 'rotate' || tk === 'dilate') {\n const source = ctx.pendingRef.current[0];\n const center = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source, center, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n // Don't clearPending here — wait for confirm/cancel\n return;\n }\n if (tk === 'regularPolygon') {\n const p1 = ctx.pendingRef.current[0];\n const p2 = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source: p1, center: p2, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n return;\n }\n if (tk === 'translate') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'translate', vectorPoints: [ctx.pendingRef.current[1], ctx.pendingRef.current[2]] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectLine') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectLine', line: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectPoint') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectPoint', center: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n } else {\n ctx.refreshPreview();\n }\n}\n\n// ─── board.on('up') ───────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleUp(ctx: HandlerCtx, e: any): void {\n const t = ctx.toolRef.current;\n if (t === 'select') {\n // Finalize marquee: any object hit-tested inside the rectangle gets\n // added to the selection. Single click on object was already handled\n // in `down`; here we only care about drag end.\n const mq = ctx.marqueeRef.current;\n ctx.marqueeRef.current = null;\n ctx.moveDownRef.current = null;\n if (!mq) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [ex, ey] = sc;\n if (mq.rect) { safeJsx('handlers.removeObject(marquee.rect)', () => ctx.boardRef.current?.removeObject(mq.rect)); }\n if (Math.hypot(ex - mq.startSx, ey - mq.startSy) < 4) return; // not a real drag\n const x1 = Math.min(mq.startSx, ex), x2 = Math.max(mq.startSx, ex);\n const y1 = Math.min(mq.startSy, ey), y2 = Math.max(mq.startSy, ey);\n const board = ctx.boardRef.current;\n if (!board) return;\n const list = (board.objectsList || []) as JxgObj[];\n for (const o of list) {\n if (o === ctx.axisObjsRef.current.x || o === ctx.axisObjsRef.current.y) continue;\n // Points: include if their screen coord falls inside the rect.\n const kind = objKind(o);\n if (kind === 'point') {\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n if (pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2) {\n if (!ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n // Lines/segments/circles: simple test — include if either defining\n // point falls inside (good enough for marquee UX without doing\n // expensive line-rectangle intersections).\n else if (kind === 'line' || kind === 'circle') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const defs: any[] = [o.point1, o.point2, o.center, o.midpoint, o.point3].filter(Boolean);\n const anyInside = defs.some((p) => {\n const pc = p?.coords?.scrCoords;\n return pc && pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2;\n });\n if (anyInside && !ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n ctx.setSelectionTick((tt) => tt + 1);\n safeJsx('handlers.board.update(marquee)', () => board.update());\n return;\n }\n if (t !== 'move') return;\n const start = ctx.moveDownRef.current;\n ctx.moveDownRef.current = null;\n if (!start) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const moved = Math.hypot(sx - start.sx, sy - start.sy);\n if (moved > 4) return; // drag, không phải click\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // Ưu tiên điểm (exact → nearest-within-12px) trước, rồi mới fallback object\n // khác (line/circle). Đảm bảo double-click gần một điểm sẽ mở properties cho\n // điểm đó kể cả khi có line đi sát qua.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const best: any = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPoint(e, 12) ?? hits[0];\n if (!best) {\n ctx.lastMoveClickRef.current = { obj: null, time: 0 };\n return;\n }\n const now = Date.now();\n const isDouble = ctx.lastMoveClickRef.current.obj === best && (now - ctx.lastMoveClickRef.current.time) < 400;\n ctx.lastMoveClickRef.current = { obj: best, time: now };\n if (!isDouble) return;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n const snap = ctx.snapshotObject(best, { x: cx + 8, y: cy + 8 });\n if (snap) ctx.emitSelect(snap);\n}\n\n// ─── board.on('move') ────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleMove(ctx: HandlerCtx, e: any): void {\n // Marquee rectangle redraw while user drags with the select tool on empty space.\n if (ctx.toolRef.current === 'select' && ctx.marqueeRef.current) {\n const sc = ctx.screenCoordsOf(e);\n if (sc && ctx.boardRef.current) {\n const [sx, sy] = sc;\n const { startSx, startSy } = ctx.marqueeRef.current;\n // Convert screen px to user coords for JSXGraph polygon overlay.\n const b = ctx.boardRef.current;\n const ux1 = b.screenCoords2userCoords?.([Math.min(startSx, sx), Math.min(startSy, sy)]) ?? null;\n const ux2 = b.screenCoords2userCoords?.([Math.max(startSx, sx), Math.max(startSy, sy)]) ?? null;\n // JSXGraph internal: getUsrCoordsByScreenCoords may not exist; fall\n // back to using a known board API.\n const toUsr = (px: number, py: number): [number, number] => {\n // Coords.getMouseCoordinates equivalent — use board.origin + unitX/Y.\n const ox = b.origin?.scrCoords?.[1] ?? 0;\n const oy = b.origin?.scrCoords?.[2] ?? 0;\n const ux = (px - ox) / b.unitX;\n const uy = (oy - py) / b.unitY;\n return [ux, uy];\n };\n const [x1u, y1u] = ux1 && ux1.length >= 2 ? [ux1[0], ux1[1]] : toUsr(Math.min(startSx, sx), Math.min(startSy, sy));\n const [x2u, y2u] = ux2 && ux2.length >= 2 ? [ux2[0], ux2[1]] : toUsr(Math.max(startSx, sx), Math.max(startSy, sy));\n const rect = ctx.marqueeRef.current.rect;\n if (rect) {\n safeJsx('handlers.removeObject(marquee.prevRect)', () => ctx.boardRef.current.removeObject(rect));\n }\n safeJsx('handlers.createMarqueePolygon', () => {\n ctx.marqueeRef.current!.rect = ctx.boardRef.current.create('polygon', [\n [x1u, y1u], [x2u, y1u], [x2u, y2u], [x1u, y2u],\n ], {\n fillColor: '#06b6d4', fillOpacity: 0.08,\n borders: { strokeColor: '#06b6d4', strokeWidth: 1, dash: 2 },\n vertices: { visible: false },\n fixed: true, highlight: false, withLabel: false,\n });\n });\n }\n return;\n }\n const ph = ctx.phantomRef.current;\n if (!ph || !ctx.boardRef.current) return;\n if (ctx.previewRafRef.current != null) return;\n ctx.previewRafRef.current = requestAnimationFrame(() => {\n ctx.previewRafRef.current = null;\n if (!ctx.boardRef.current || !ctx.phantomRef.current) return;\n safeJsx('handlers.phantomMove', () => {\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const JXG: any = ctx.jxgRef.current;\n if (!JXG) return;\n ctx.phantomRef.current.setPositionDirectly(JXG.COORDS_BY_USER, [coords[0], coords[1]]);\n ctx.boardRef.current.update();\n });\n });\n}\n","'use client';\nimport React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { deserializeIntoBoard, type SerializedBoard, type SerializedElement } from '../serialize';\nimport { getDefiningPoints, buildTransformSpec } from './transforms';\nimport {\n TOOLS,\n GROUP_LABELS,\n acceptMatches,\n objKind,\n type GeomTool,\n type ToolDef,\n} from './tools';\nimport { paletteFor, resolveAttrColors, themeAxis, themeGrid, themeLabel } from './theme';\nimport { handleDown, handleUp, handleMove, type HandlerCtx } from './handlers';\nimport { safeJsx } from '../../shared/safeJsx';\n\n// Re-export để backward-compat với consumer cũ.\nexport { TOOLS, GROUP_LABELS };\nexport type { GeomTool, ToolDef };\n\nexport interface MiniBoardHandle {\n getContainer: () => HTMLDivElement | null;\n getCreationLog: () => SerializedElement[];\n getBbox: () => [number, number, number, number];\n getShowAxis: () => boolean;\n getShowGrid: () => boolean;\n /** Đổi tool active từ bên ngoài (panel trái). */\n setTool: (t: GeomTool) => void;\n getTool: () => GeomTool;\n /** Toggle layout từ bên ngoài. */\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n /** Undo bước cuối. */\n undo: () => void;\n /** Có gì để undo? */\n canUndo: () => boolean;\n /** Redo bước vừa undo. */\n redo: () => void;\n /** Có gì để redo? */\n canRedo: () => boolean;\n /** Subscribe khi state thay đổi (tool / showAxis / showGrid / undo). */\n subscribe: (cb: () => void) => () => void;\n /** Đọc snapshot thuộc tính object (cho popover). */\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => ObjectSnapshot | null;\n /** Mutate thuộc tính + sync log. */\n mutateObject: (obj: unknown, patch: { attrs?: Record<string, unknown>; remove?: boolean }) => void;\n /** Liệt kê tên của tất cả point hiện tại (để popover disambiguate khi rename). */\n getAllPointNames: () => string[];\n /** Subscribe selection-from-move-tool. Trả về unsubscribe. */\n onSelect: (cb: (snap: ObjectSnapshot) => void) => () => void;\n onTransformParam: (cb: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void) => () => void;\n confirmTransformParam: (value: number) => void;\n cancelTransformParam: () => void;\n /** Số đối tượng đang chọn (qua tool 'select'). */\n getSelectionSize: () => number;\n /** Bỏ chọn tất cả. */\n clearSelection: () => void;\n /** Xoá tất cả đối tượng đang chọn (cascade-aware). */\n deleteSelection: () => void;\n}\n\nexport interface ObjectSnapshot {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any;\n kind: 'point' | 'line' | 'circle';\n name: string;\n color: string;\n dash: number;\n width: number;\n face: 'o' | 'circle' | 'cross' | 'plus';\n /** Đang hiển thị tên (label) hay không. */\n showLabel: boolean;\n /** Đang có value-label (text gắn động) hay không. */\n showValue: boolean;\n screenCoords: { x: number; y: number };\n}\n\ninterface Props {\n onReady: (handle: MiniBoardHandle) => void;\n initialState: SerializedBoard | null;\n /** Khi true → board nền tối, điểm/đường/label dùng tone sáng để contrast. */\n isDark?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport const JSXGraphMiniBoard: React.FC<Props> = ({ onReady, initialState, isDark }) => {\n const isDarkRef = useRef(!!isDark);\n isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_jxgmini';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const axisObjsRef = useRef<{ x?: JxgObj; y?: JxgObj }>({});\n const creationLogRef = useRef<SerializedElement[]>([]);\n const redoStackRef = useRef<SerializedElement[]>([]);\n\n const [tool, setTool] = useState<GeomTool>('move');\n const toolRef = useRef<GeomTool>('move');\n toolRef.current = tool;\n\n const [showAxis, setShowAxis] = useState<boolean>(initialState?.showAxis ?? false);\n const [showGrid, setShowGrid] = useState<boolean>(initialState?.showGrid ?? false);\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n // Track JSXGraph point objects created during the session, indexed by our serialized id.\n // We also track the LAST object created (for non-point types like segment) so accept-matching works.\n const objMapRef = useRef<Map<string, JxgObj>>(new Map());\n\n // Map target line/circle → dynamic value-label text element (hiển thị độ dài\n // / bán kính). Khi user toggle \"Show Value\", ta tạo/xoá text này. Serialize:\n // entry type='valueLabel' trong creationLog với args=[targetLocalId].\n const valueLabelsRef = useRef<Map<JxgObj, JxgObj>>(new Map());\n\n // Pending picks for multi-click tools: array of JSXGraph object refs\n const pendingRef = useRef<JxgObj[]>([]);\n const [, setPendingCount] = useState(0);\n\n // Selection state — tool 'select' adds clicked objects here. Selected objects\n // get a cyan highlight stroke (original style preserved in selOriginalRef so\n // we can restore on deselect).\n const selectedSetRef = useRef<Set<JxgObj>>(new Set());\n const selOriginalRef = useRef<Map<JxgObj, { strokeColor?: unknown; strokeWidth?: unknown }>>(new Map());\n const [, setSelectionTick] = useState(0);\n // Marquee state during select-tool drag.\n const marqueeRef = useRef<{ startSx: number; startSy: number; rect?: JxgObj } | null>(null);\n\n // Live preview segments while building a polygon/area: drawn between\n // consecutive pending points so the user sees the shape forming.\n const previewSegRef = useRef<JxgObj[]>([]);\n // Phantom point that tracks mouse position for 2-3 click tool live preview.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const phantomRef = useRef<any>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const previewShapeRef = useRef<any>(null);\n const previewRafRef = useRef<number | null>(null);\n // Tick state forces re-render so the undo button enable state stays in sync\n // with creationLogRef (which is mutated outside React).\n const [historyTick, setHistoryTick] = useState(0);\n // Transient warning shown when a strict construction tool gets a click that\n // didn't land on the required existing object (so the user knows why nothing\n // happened). Auto-clears.\n const [, setWarn] = useState<string | null>(null);\n const warnTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flashWarn = useCallback((msg: string) => {\n if (warnTimerRef.current) clearTimeout(warnTimerRef.current);\n setWarn(msg);\n warnTimerRef.current = setTimeout(() => setWarn(null), 1800);\n }, []);\n useEffect(() => () => { if (warnTimerRef.current) clearTimeout(warnTimerRef.current); }, []);\n\n const labelIdxRef = useRef(0);\n const nextLabel = useCallback(() => {\n const idx = labelIdxRef.current;\n const suffix = idx >= 26 ? String(Math.floor(idx / 26)) : '';\n const code = 'A'.charCodeAt(0) + (idx % 26);\n labelIdxRef.current = idx + 1;\n return String.fromCharCode(code) + suffix;\n }, []);\n\n const nextLocalId = useCallback(() => 'j' + creationLogRef.current.length, []);\n\n // Build a fresh JSXGraph object id resolver for serialization.\n // We log args using local string IDs (\"j0\"); resolve to JSXGraph objects in-memory via objMapRef.\n // Polygon edges (sub-segments) are referenced via \"<polyId>:border:<i>\" since\n // they're auto-created by JSXGraph as part of the polygon and don't carry a\n // separate top-level id of their own.\n const resolveArgs = useCallback((args: unknown[]): unknown[] => {\n return args.map((a) => {\n if (typeof a === 'string') {\n if (objMapRef.current.has(a)) return objMapRef.current.get(a);\n const m = /^(.+):border:(\\d+)$/.exec(a);\n if (m) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const poly = objMapRef.current.get(m[1]) as any;\n const idx = parseInt(m[2], 10);\n if (poly && Array.isArray(poly.borders) && poly.borders[idx]) {\n return poly.borders[idx];\n }\n }\n }\n return a;\n });\n }, []);\n\n // Push entry mới vào creationLog + clear redoStack (chuẩn UX undo/redo).\n const pushCreationLog = useCallback((entry: SerializedElement) => {\n creationLogRef.current.push(entry);\n redoStackRef.current = [];\n }, []);\n\n const pushLog = useCallback(\n (id: string, type: string, args: unknown[], attrs: Record<string, unknown>, obj: JxgObj) => {\n pushCreationLog({ id, type, args, attrs });\n objMapRef.current.set(id, obj);\n setHistoryTick((t) => t + 1);\n },\n [pushCreationLog],\n );\n\n const create = useCallback(\n (type: string, args: unknown[], attrs: Record<string, unknown> = {}): JxgObj => {\n if (!boardRef.current) return null;\n const id = nextLocalId();\n const resolved = resolveArgs(args);\n // attrs có thể chứa sentinel `@stroke/@axis/@grid/@label` — log lưu nguyên\n // bản (theme-neutral), JSXGraph nhận màu thực resolve theo theme hiện tại.\n const resolvedAttrs = resolveAttrColors(attrs, paletteFor(isDarkRef.current));\n const obj = boardRef.current.create(type, resolved, resolvedAttrs);\n pushLog(id, type, args, attrs, obj);\n return obj;\n },\n [nextLocalId, resolveArgs, pushLog],\n );\n\n // Get local serialized id for a JSXGraph object (reverse lookup).\n // Falls back to \"<polyId>:border:<i>\" when obj is a polygon edge — lets\n // construct tools (perpendicular, parallel, ...) reference polygon cạnh as\n // a line input even though edges aren't tracked as top-level entries.\n const localIdOf = useCallback((obj: JxgObj): string | null => {\n if (!obj) return null;\n for (const [id, o] of objMapRef.current.entries()) {\n if (o === obj) return id;\n }\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const borders = (o as any)?.borders;\n if (Array.isArray(borders)) {\n const idx = borders.indexOf(obj);\n if (idx >= 0) return `${id}:border:${idx}`;\n }\n }\n return null;\n }, []);\n\n const snapshotObject = useCallback((obj: unknown, anchorScreen: { x: number; y: number }): ObjectSnapshot | null => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o: any = obj;\n const k = objKind(o);\n if (k !== 'point' && k !== 'line' && k !== 'circle') return null;\n // Polygon borders are sub-elements of a polygon — user's mental model treats\n // the polygon as one atomic object, so editing a single edge's color/dash\n // (without affecting siblings) is confusing. Reject the popover here; the\n // edge is still usable as a `line` input for construction tools.\n for (const owner of objMapRef.current.values()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const borders = (owner as any)?.borders;\n if (Array.isArray(borders) && borders.indexOf(o) >= 0) return null;\n }\n const v = o.visProp ?? {};\n const showLabel = v.withlabel !== false;\n const showValue = valueLabelsRef.current.has(o);\n return {\n obj: o,\n kind: k,\n name: typeof o.name === 'string' ? o.name : '',\n color: (v.strokecolor as string) ?? '#1e1e1e',\n dash: typeof v.dash === 'number' ? v.dash : 0,\n width: typeof v.strokewidth === 'number' ? v.strokewidth : 2,\n face: (v.face as ObjectSnapshot['face']) ?? 'o',\n showLabel,\n showValue,\n screenCoords: anchorScreen,\n };\n }, []);\n\n // Tạo text element động hiển thị giá trị (độ dài segment / bán kính circle).\n // Trả về JSXGraph text obj (chưa log). Cần obj có cùng \"kind\" được hỗ trợ.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const createValueLabelFor = useCallback((target: any): any => {\n const b = boardRef.current;\n if (!b || !target) return null;\n const k = objKind(target);\n if (k === 'line') {\n // segment / line / arrow đều dùng point1 + point2\n const p1 = target.point1;\n const p2 = target.point2;\n if (!p1 || !p2) return null;\n const txt = b.create('text', [\n () => (p1.X() + p2.X()) / 2 + 0.15,\n () => (p1.Y() + p2.Y()) / 2 + 0.25,\n () => {\n const dx = p2.X() - p1.X();\n const dy = p2.Y() - p1.Y();\n const len = Math.hypot(dx, dy);\n const name = typeof target.name === 'string' && target.name ? target.name : 'd';\n return `${name} = ${len.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n return txt;\n }\n if (k === 'circle') {\n const center = target.center ?? target.midpoint;\n if (!center) return null;\n const txt = b.create('text', [\n () => center.X() + 0.3,\n () => center.Y() + 0.3,\n () => {\n const r = typeof target.Radius === 'function' ? target.Radius() : 0;\n const name = typeof target.name === 'string' && target.name ? target.name : 'r';\n return `${name} = ${r.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n return txt;\n }\n return null;\n }, []);\n\n const mutateObject = useCallback((obj: unknown, patch: { attrs?: Record<string, unknown>; remove?: boolean; valueLabel?: boolean }) => {\n if (!boardRef.current) return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o: any = obj;\n if (patch.remove) {\n // Nếu obj có value-label đính kèm → xoá luôn text đó để cascade không\n // bỏ sót.\n const vl = valueLabelsRef.current.get(o);\n if (vl) {\n safeJsx('MiniBoard.removeObject(valueLabel)', () => boardRef.current.removeObject(vl));\n valueLabelsRef.current.delete(o);\n }\n safeJsx('MiniBoard.removeObject(target)', () => boardRef.current.removeObject(o));\n // Cascade: walk log and drop entries whose JSXGraph object was also removed\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, obj] of objMapRef.current.entries()) {\n // JSXGraph keeps objects in board.objects keyed by JSXGraph internal id\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (obj as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n // Drop dead entries from log + map\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n return;\n }\n if (typeof patch.valueLabel === 'boolean') {\n const has = valueLabelsRef.current.has(o);\n if (patch.valueLabel && !has) {\n const txt = createValueLabelFor(o);\n if (txt) {\n valueLabelsRef.current.set(o, txt);\n // Log entry tổng hợp để reload regenerate được. args=[targetLocalId].\n const targetId = localIdOf(o);\n if (targetId) {\n const id = nextLocalId();\n pushCreationLog({ id, type: 'valueLabel', args: [targetId], attrs: {} });\n objMapRef.current.set(id, txt);\n setHistoryTick((t) => t + 1);\n }\n }\n } else if (!patch.valueLabel && has) {\n const txt = valueLabelsRef.current.get(o);\n valueLabelsRef.current.delete(o);\n if (txt) {\n safeJsx('MiniBoard.removeObject(valueLabel.text)', () => boardRef.current.removeObject(txt));\n // Xoá log entry value-label tương ứng\n const txtId = localIdOf(txt);\n if (txtId) {\n creationLogRef.current = creationLogRef.current.filter((e) => e.id !== txtId);\n objMapRef.current.delete(txtId);\n setHistoryTick((t) => t + 1);\n }\n }\n }\n }\n if (patch.attrs) {\n safeJsx('MiniBoard.setAttribute', () => o.setAttribute(patch.attrs));\n const id = localIdOf(o);\n if (id) {\n const entry = creationLogRef.current.find((e) => e.id === id);\n if (entry) entry.attrs = { ...entry.attrs, ...patch.attrs };\n setHistoryTick((t) => t + 1);\n }\n }\n safeJsx('MiniBoard.board.update(mutate)', () => boardRef.current.update());\n }, [createValueLabelFor, localIdOf, nextLocalId]);\n\n const clearPreviewSegs = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n for (const s of previewSegRef.current) {\n safeJsx('MiniBoard.removeObject(previewSeg)', () => b.removeObject(s));\n }\n previewSegRef.current = [];\n }, []);\n\n const removePhantom = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n if (previewShapeRef.current) {\n safeJsx('MiniBoard.removeObject(previewShape)', () => b.removeObject(previewShapeRef.current));\n previewShapeRef.current = null;\n }\n if (phantomRef.current) {\n safeJsx('MiniBoard.removeObject(phantom)', () => b.removeObject(phantomRef.current));\n phantomRef.current = null;\n }\n }, []);\n\n const clearPending = useCallback(() => {\n removePhantom();\n clearPreviewSegs();\n pendingRef.current = [];\n setPendingCount(0);\n }, [clearPreviewSegs, removePhantom]);\n\n // === Selection helpers (used by the `select` tool) ===\n const applySelectionStyle = useCallback((obj: JxgObj) => {\n if (!obj || selOriginalRef.current.has(obj)) return;\n safeJsx('MiniBoard.applySelectionStyle', () => {\n const visProp = obj.visProp ?? {};\n selOriginalRef.current.set(obj, {\n strokeColor: visProp.strokecolor,\n strokeWidth: visProp.strokewidth,\n });\n const kind = objKind(obj);\n if (kind === 'point') {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n } else {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n }\n });\n }, []);\n\n const restoreSelectionStyle = useCallback((obj: JxgObj) => {\n const orig = selOriginalRef.current.get(obj);\n if (!orig) return;\n safeJsx('MiniBoard.restoreSelectionStyle', () => {\n const attrs: Record<string, unknown> = {};\n if (orig.strokeColor !== undefined) attrs.strokeColor = orig.strokeColor;\n if (orig.strokeWidth !== undefined) attrs.strokeWidth = orig.strokeWidth;\n obj.setAttribute(attrs);\n });\n selOriginalRef.current.delete(obj);\n }, []);\n\n const clearSelection = useCallback(() => {\n for (const o of selectedSetRef.current) {\n restoreSelectionStyle(o);\n }\n selectedSetRef.current.clear();\n setSelectionTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(clearSelection)', () => boardRef.current?.update());\n }, [restoreSelectionStyle]);\n\n const toggleSelect = useCallback((obj: JxgObj, additive: boolean) => {\n if (!obj) return;\n if (!additive) {\n // Single-click replace: clear others first.\n for (const o of selectedSetRef.current) {\n if (o !== obj) restoreSelectionStyle(o);\n }\n selectedSetRef.current = new Set([obj]);\n applySelectionStyle(obj);\n } else {\n if (selectedSetRef.current.has(obj)) {\n restoreSelectionStyle(obj);\n selectedSetRef.current.delete(obj);\n } else {\n selectedSetRef.current.add(obj);\n applySelectionStyle(obj);\n }\n }\n setSelectionTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(toggleSelect)', () => boardRef.current?.update());\n }, [applySelectionStyle, restoreSelectionStyle]);\n\n const deleteSelected = useCallback(() => {\n const board = boardRef.current;\n if (!board) return;\n if (selectedSetRef.current.size === 0) return;\n // Drop highlight first so removal doesn't try to setAttribute on dead obj.\n for (const o of selectedSetRef.current) selOriginalRef.current.delete(o);\n for (const o of selectedSetRef.current) {\n safeJsx('MiniBoard.removeObject(selected)', () => board.removeObject(o));\n }\n selectedSetRef.current.clear();\n // Cascade-prune log (same approach as delete tool)\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board.objects && board.objects[jxgId]) aliveIds.add(id);\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setSelectionTick((t) => t + 1);\n setHistoryTick((t) => t + 1);\n }, []);\n\n // Build a transient preview shape (not logged) from pending picks + phantom point.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const buildPreview = useCallback((toolDef: ToolDef, picks: any[], phantom: any) => {\n const b = boardRef.current;\n if (!b) return null;\n const style = { strokeColor: '#3b82f6', strokeWidth: 1.5, strokeOpacity: 0.65, dash: 2, fixed: true, highlight: false, withLabel: false } as Record<string, unknown>;\n const circStyle = { ...style, fillColor: 'none', fillOpacity: 0 };\n try {\n switch (toolDef.key) {\n case 'segment':\n case 'midpoint':\n case 'distance':\n return b.create('segment', [picks[0], phantom], style);\n case 'line':\n return b.create('line', [picks[0], phantom], style);\n case 'ray':\n return b.create('line', [picks[0], phantom], { ...style, straightFirst: false, straightLast: true });\n case 'vector':\n return b.create('arrow', [picks[0], phantom], style);\n case 'circleCenter':\n return b.create('circle', [picks[0], phantom], circStyle);\n case 'circle3':\n if (picks.length === 1) return b.create('circle', [picks[0], phantom], circStyle);\n if (picks.length === 2) return b.create('circumcircle', [picks[0], picks[1], phantom], circStyle);\n return null;\n case 'angle':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('angle', [picks[0], picks[1], phantom], { ...style, radius: 1, fillColor: '#22c55e', fillOpacity: 0.15 });\n return null;\n case 'perpBisector':\n return b.create('segment', [picks[0], phantom], style);\n case 'angleBisector':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('bisector', [picks[0], picks[1], phantom], style);\n return null;\n case 'perpendicular':\n case 'parallel':\n case 'tangent':\n if (picks.length === 1) {\n const k = objKind(picks[0]);\n if (k === 'line' && toolDef.key !== 'tangent') {\n return b.create(toolDef.key, [picks[0], phantom], style);\n }\n if (k === 'circle' && toolDef.key === 'tangent') {\n const glider = b.create('glider', [phantom.X(), phantom.Y(), picks[0]], { visible: false, withLabel: false });\n return b.create('tangent', [glider], style);\n }\n }\n return null;\n default:\n return null;\n }\n } catch {\n return null;\n }\n }, []);\n\n // Tear down old preview shape and build a new one from current picks + phantom.\n const refreshPreview = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n // Tear down current preview shape (not the phantom)\n if (previewShapeRef.current) {\n safeJsx('MiniBoard.removeObject(refreshPreview)', () => b.removeObject(previewShapeRef.current));\n previewShapeRef.current = null;\n }\n const t = toolRef.current;\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n const picks = pendingRef.current;\n if (picks.length === 0 || toolDef.needs <= 0) return;\n if (picks.length >= toolDef.needs) return;\n // Create phantom if missing\n if (!phantomRef.current) {\n try {\n phantomRef.current = b.create('point', [0, 0], { visible: false, fixed: true, withLabel: false, name: '' });\n } catch { return; }\n }\n previewShapeRef.current = buildPreview(toolDef, picks, phantomRef.current);\n }, [buildPreview]);\n\n // Apply tool action with a sequence of picked refs\n const finalize = useCallback((toolDef: ToolDef, picks: JxgObj[]) => {\n if (!boardRef.current) return;\n const labels = picks.map(localIdOf).filter(Boolean) as string[];\n // For open shapes (segment, line, ray, vector). `color` shorthand also fills\n // closed shapes, so we use explicit strokeColor + transparent fillOpacity for\n // anything closed (circle, polygon, angle).\n const stroke = { strokeColor: '@stroke', strokeWidth: 2 };\n const strokeOnly = { ...stroke, fillColor: 'none', fillOpacity: 0 };\n const lblName = nextLabel();\n switch (toolDef.key) {\n case 'midpoint':\n create('midpoint', labels, { name: lblName, color: '@stroke', size: 3 });\n break;\n case 'segment':\n create('segment', labels, stroke);\n break;\n case 'line':\n create('line', labels, stroke);\n break;\n case 'ray': {\n // JSXGraph: 'line' with straightFirst:false, straightLast:true\n create('line', labels, { ...stroke, straightFirst: false, straightLast: true });\n break;\n }\n case 'vector':\n create('arrow', labels, stroke);\n break;\n case 'perpendicular': {\n // [point, line] in that order; JSXGraph perpendicular expects (line, point)\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('perpendicular', [l, p], stroke);\n break;\n }\n case 'parallel': {\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('parallel', [l, p], stroke);\n break;\n }\n case 'perpBisector': {\n // JSXGraph 1.12.x doesn't register a `perpendicularbisector` element\n // (only `perpendicular`, `perpendicularpoint`, `perpendicularsegment`).\n // Build it from primitives: midpoint M of P1P2, then a perpendicular\n // line to the segment P1P2 through M. Helpers are invisible but logged\n // so deserialize-on-reload reconstructs the dependency chain.\n const mid = create('midpoint', labels, { visible: false, withLabel: false, name: '' });\n const seg = create('segment', labels, { visible: false, withLabel: false });\n const midId = localIdOf(mid);\n const segId = localIdOf(seg);\n if (midId && segId) create('perpendicular', [segId, midId], stroke);\n break;\n }\n case 'angleBisector':\n create('bisector', labels, stroke);\n break;\n case 'circleCenter':\n create('circle', labels, strokeOnly);\n break;\n case 'circle3':\n create('circumcircle', labels, strokeOnly);\n break;\n case 'tangent': {\n // Need to find the actual point pick (not just by slot index) since\n // the user can click circle-then-point OR point-then-circle.\n const firstIsPoint = picks[0] && objKind(picks[0]) === 'point';\n const pointPick = firstIsPoint ? picks[0] : picks[1];\n const circleLabel = firstIsPoint ? labels[1] : labels[0];\n if (!pointPick || !circleLabel) break;\n const px = typeof pointPick.X === 'function' ? pointPick.X() : 0;\n const py = typeof pointPick.Y === 'function' ? pointPick.Y() : 0;\n const glider = create('glider', [px, py, circleLabel], { name: '', size: 2, strokeColor: '#666', visible: false });\n const gid = localIdOf(glider);\n if (gid) create('tangent', [gid], stroke);\n break;\n }\n case 'angle': {\n // JSXGraph vẽ cung từ BA → BC theo chiều dương (ngược chiều kim đồng hồ).\n // Nếu cross(BA, BC) < 0 thì cung CCW từ BA → BC > 180° → đổi vai trò A,C\n // để luôn hiển thị góc nhọn/tù thay vì góc phản (reflex).\n const [pa, pb, pc] = picks;\n let order: string[] = labels;\n try {\n const ax = pa.X() - pb.X(), ay = pa.Y() - pb.Y();\n const cx = pc.X() - pb.X(), cy = pc.Y() - pb.Y();\n const cross = ax * cy - ay * cx;\n if (cross < 0) order = [labels[2], labels[1], labels[0]];\n } catch { /* fallback giữ thứ tự */ }\n create('angle', order, {\n radius: 1,\n fillColor: '#22c55e',\n fillOpacity: 0.25,\n strokeColor: '#16a34a',\n strokeWidth: 1.5,\n name: '',\n withLabel: false,\n });\n break;\n }\n case 'distance': {\n const pA = picks[0], pB = picks[1];\n const dist = Math.hypot((pA.X() - pB.X()), (pA.Y() - pB.Y()));\n const midX = (pA.X() + pB.X()) / 2;\n const midY = (pA.Y() + pB.Y()) / 2;\n create('text', [midX, midY, `d = ${dist.toFixed(2)}`], { fontSize: 14, color: '#dc2626' });\n break;\n }\n case 'polygon': {\n create('polygon', labels, { fillColor: '#1e3a8a', fillOpacity: 0.10, borders: { strokeColor: '@stroke', strokeWidth: 2 } });\n break;\n }\n case 'area': {\n create('polygon', labels, { fillColor: '#3b82f6', fillOpacity: 0.18, borders: { strokeColor: '#1d4ed8', strokeWidth: 2 } });\n break;\n }\n case 'toggleLabel': {\n const obj = picks[0];\n safeJsx('MiniBoard.toggleLabel', () => {\n if (obj.label) {\n const visible = obj.label.visProp.visible !== false;\n obj.label.setAttribute({ visible: !visible });\n } else if (obj.setAttribute) {\n // For elements without explicit label, toggle 'withLabel'\n const cur = obj.visProp.withlabel !== false;\n obj.setAttribute({ withLabel: !cur });\n }\n boardRef.current.update();\n });\n break;\n }\n case 'toggleVisible': {\n const obj = picks[0];\n safeJsx('MiniBoard.toggleVisible', () => {\n const visible = obj.visProp.visible !== false;\n obj.setAttribute({ visible: !visible });\n boardRef.current.update();\n });\n break;\n }\n case 'delete': {\n const obj = picks[0];\n safeJsx('MiniBoard.deleteOne', () => {\n boardRef.current.removeObject(obj);\n // JSXGraph cascade-removes dependents (e.g. xoá point → segment dùng\n // point đó cũng biến mất). Đồng bộ log: walk objMap, giữ lại id nào\n // vẫn còn trong board.objects; còn lại drop khỏi log + map. Trước\n // patch, chỉ entry chính bị xoá → log dangling reference, replay sẽ\n // throw vì id phụ thuộc không resolve được.\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n });\n break;\n }\n }\n }, [create, localIdOf, nextLabel]);\n\n const finalizeTransformCreate = useCallback((\n spec: { params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' }; chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }> },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any,\n ) => {\n if (!boardRef.current) return;\n const def = getDefiningPoints(source);\n if (!def) { flashWarn('Không thể biến đổi đối tượng này'); return; }\n\n // 1. Create + log transform entry/entries. Chain mode (dilate): create N\n // transforms in order, log each, and apply them as an array.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformObjs: any[] = [];\n const transformIds: string[] = [];\n const steps = spec.chain ?? [{ params: spec.params, attrs: spec.attrs }];\n for (const step of steps) {\n const stepLogArgs: unknown[] = [];\n for (const p of step.params) {\n if (typeof p === 'function') {\n flashWarn('Tham số transform không serialize được — bỏ qua');\n return;\n }\n if (p && typeof p === 'object') {\n const id = localIdOf(p);\n if (!id) {\n flashWarn('Đối tượng tham chiếu không nằm trong board — không thể biến đổi');\n return;\n }\n stepLogArgs.push(id);\n } else {\n stepLogArgs.push(p);\n }\n }\n const stepId = nextLocalId();\n const stepObj = boardRef.current.create('transform', step.params, step.attrs);\n pushCreationLog({ id: stepId, type: 'transform', args: stepLogArgs, attrs: step.attrs as Record<string, unknown> });\n objMapRef.current.set(stepId, stepObj);\n transformObjs.push(stepObj);\n transformIds.push(stepId);\n }\n const transformParent = transformObjs.length === 1 ? transformObjs[0] : transformObjs;\n const transformLogRef = transformObjs.length === 1 ? transformIds[0] : transformIds;\n\n // 2. Transform each defining point — log each.\n // JSXGraph signature: create('point', [parentElement, transformation|transformationArray])\n // — SOURCE element first, transformation second. Reversing the order made\n // JSXGraph reject the call (\"Can't create point with parent types 'object'\n // and 'object'\"), crashing the rotate tool prior to this fix.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformedPoints: any[] = def.points.map((src) => {\n const srcId = localIdOf(src);\n const id = nextLocalId();\n const srcName = typeof src.name === 'string' ? src.name : '';\n const newName = srcName ? `${srcName}'` : nextLabel();\n const attrs = { name: newName, size: 3, color: '#0ea5e9', strokeColor: '#0ea5e9', fillColor: '#0ea5e9' };\n const obj = boardRef.current!.create('point', [src, transformParent], attrs);\n pushCreationLog({ id, type: 'point', args: [srcId ?? src, transformLogRef], attrs });\n objMapRef.current.set(id, obj);\n return obj;\n });\n\n // 3. Recreate same-kind object from transformed points\n const baseStyle = { ...def.attrs, strokeColor: '#0ea5e9' };\n const strokeOnly = { ...baseStyle, fillColor: 'none', fillOpacity: 0 };\n const ids = transformedPoints.map((p) => localIdOf(p)).filter((s): s is string => !!s);\n switch (def.kind) {\n case 'point': /* nothing — already created */ break;\n case 'segment': create('segment', ids, baseStyle); break;\n case 'line': create('line', ids, baseStyle); break;\n case 'ray': create('line', ids, { ...baseStyle, straightFirst: false, straightLast: true }); break;\n case 'arrow': create('arrow', ids, baseStyle); break;\n case 'circleCenter': create('circle', ids, strokeOnly); break;\n case 'circle3': create('circumcircle', ids, strokeOnly); break;\n }\n setHistoryTick((t) => t + 1);\n }, [create, flashWarn, localIdOf, nextLabel, nextLocalId]);\n\n // Tái dựng 1 object từ entry log đã serialize. Dùng chung cho cả\n // initial-state replay và redo. Trả về true nếu tạo thành công.\n const recreateFromLogEntry = useCallback((el: SerializedElement): boolean => {\n const board = boardRef.current;\n if (!board) return false;\n const idMap = objMapRef.current;\n // Phải khớp logic với deserializeIntoBoard (serialize.ts): hỗ trợ cả nested\n // array (dilate chain) lẫn \"polyId:border:N\" (perpendicular xuống cạnh\n // polygon — vd đường cao). Trước đây chỉ flat-lookup → entry tham chiếu\n // border bị skip → đường cao mất khi mở re-edit.\n const resolve = (a: unknown): unknown => {\n if (typeof a === 'string') {\n if (idMap.has(a)) return idMap.get(a);\n const m = /^(.+):border:(\\d+)$/.exec(a);\n if (m) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const poly = idMap.get(m[1]) as any;\n const idx = parseInt(m[2], 10);\n if (poly && Array.isArray(poly.borders) && poly.borders[idx]) {\n return poly.borders[idx];\n }\n }\n }\n if (Array.isArray(a)) return a.map(resolve);\n return a;\n };\n const resolved = el.args.map(resolve);\n try {\n if (el.type === 'valueLabel') {\n const target = resolved[0];\n if (!target) return false;\n const txt = createValueLabelFor(target);\n if (!txt) return false;\n idMap.set(el.id, txt);\n valueLabelsRef.current.set(target, txt);\n return true;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, paletteFor(isDarkRef.current));\n const obj = board.create(el.type, resolved, themedAttrs);\n idMap.set(el.id, obj);\n return true;\n } catch (err) {\n console.warn('Recreate failed for', el.type, err);\n return false;\n }\n }, [createValueLabelFor]);\n\n // Undo: remove the most recently logged creation. Also clears any in-progress\n // polygon construction (pending picks + preview segments) so state is sane.\n const undoLast = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n while (creationLogRef.current.length > 0) {\n const last = creationLogRef.current.pop();\n if (!last) break;\n const obj = objMapRef.current.get(last.id);\n objMapRef.current.delete(last.id);\n if (obj) {\n safeJsx('MiniBoard.removeObject(undo)', () => b.removeObject(obj));\n clearPending();\n // Push entry này vào redoStack (chỉ entry có object thật).\n redoStackRef.current.push(last);\n setHistoryTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(undo)', () => b.update());\n return;\n }\n // Skip stale log entry (object đã biến mất từ trước) — không push vào redoStack\n }\n setHistoryTick((t) => t + 1);\n }, [clearPending]);\n\n // Redo: pop entry cuối khỏi redoStack và tái tạo object.\n const redoNext = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n const entry = redoStackRef.current.pop();\n if (!entry) {\n setHistoryTick((t) => t + 1);\n return;\n }\n const ok = recreateFromLogEntry(entry);\n if (ok) {\n creationLogRef.current.push(entry);\n }\n setHistoryTick((t) => t + 1);\n safeJsx('MiniBoard.board.update(redo)', () => b.update());\n }, [recreateFromLogEntry]);\n\n // Global Ctrl/Cmd+Z + Esc while the panel is mounted. Skipped when focus is\n // in a text input so we don't hijack other undo flows. Capture phase + stop\n // propagation so Excalidraw's underlying undo doesn't also fire when the\n // panel is open on top of the whiteboard. Esc cancels in-progress picks.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z' && !e.shiftKey) {\n if (inField) return;\n e.preventDefault();\n e.stopPropagation();\n undoLastRef.current();\n return;\n }\n // Ctrl/Cmd+Shift+Z hoặc Ctrl+Y → redo\n if (\n (e.metaKey || e.ctrlKey) &&\n (\n (e.key.toLowerCase() === 'z' && e.shiftKey) ||\n (e.key.toLowerCase() === 'y' && !e.shiftKey)\n )\n ) {\n if (inField) return;\n e.preventDefault();\n e.stopPropagation();\n redoNextRef.current();\n return;\n }\n if (e.key === 'Escape' && !inField) {\n if (pendingRef.current.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearPendingRef.current();\n }\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearSelectionRef.current();\n }\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && !inField) {\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n deleteSelectedRef.current();\n }\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, []);\n\n // Translate a pointer event into JSXGraph SVG-pixel coords (the coord system\n // `hasPoint` uses). Falls back to manual rect math if `getMousePosition` is\n // unavailable (e.g. in tests with a mocked board).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const screenCoordsOf = useCallback((evt: any): [number, number] | null => {\n const b = boardRef.current;\n if (!b) return null;\n try {\n const mp = b.getMousePosition ? b.getMousePosition(evt) : null;\n if (mp && mp.length >= 2) return [mp[0], mp[1]];\n } catch { /* fall through */ }\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const cx = evt.clientX ?? evt.touches?.[0]?.clientX ?? 0;\n const cy = evt.clientY ?? evt.touches?.[0]?.clientY ?? 0;\n return [cx - rect.left, cy - rect.top];\n }\n return null;\n }, []);\n\n // Find which JSXGraph object (if any) is at a given pointer event.\n // JSXGraph's `hasPoint` expects coords in the board's SVG pixel space, not\n // viewport-relative clientX/Y. Without this, hits are offset by the\n // container's page position and existing points never snap.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const objectsAt = useCallback((evt: any): JxgObj[] => {\n const b = boardRef.current;\n if (!b) return [];\n const sc = screenCoordsOf(evt);\n if (!sc) return [];\n const [sx, sy] = sc;\n const list: JxgObj[] = [];\n safeJsx('MiniBoard.objectsAt.loop', () => {\n const objs = b.objectsList || [];\n for (const o of objs) {\n safeJsx('MiniBoard.objectsAt.hasPoint', () => {\n if (o.hasPoint && o.hasPoint(sx, sy)) list.push(o);\n });\n }\n });\n return list;\n }, [screenCoordsOf]);\n\n // Generous point-snap: JSXGraph's `hasPoint` for a point uses the visual\n // radius (~3px) which is too strict for click targeting. When a tool needs\n // a point pick, fall back to \"nearest point within tolPx pixels\".\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const findNearestPoint = useCallback((evt: any, tolPx: number = 12): JxgObj | null => {\n const b = boardRef.current;\n if (!b) return null;\n const sc = screenCoordsOf(evt);\n if (!sc) return null;\n const [sx, sy] = sc;\n const tol2 = tolPx * tolPx;\n type Best = { obj: JxgObj; d2: number };\n const bestRef: { current: Best | null } = { current: null };\n safeJsx('MiniBoard.findNearestPoint.loop', () => {\n const objs = b.objectsList || [];\n for (const o of objs) {\n safeJsx('MiniBoard.findNearestPoint.iter', () => {\n if (objKind(o) !== 'point') return;\n const pc = o.coords?.scrCoords;\n if (!pc) return;\n const dx = pc[1] - sx;\n const dy = pc[2] - sy;\n const d2 = dx * dx + dy * dy;\n const cur = bestRef.current;\n if (d2 <= tol2 && (!cur || d2 < cur.d2)) bestRef.current = { obj: o, d2 };\n });\n }\n });\n return bestRef.current ? bestRef.current.obj : null;\n }, [screenCoordsOf]);\n\n // Label-aware snap: if the click landed on a JSXGraph text label (drawn near\n // each named element with `display:'internal'`), follow it back to the owning\n // element. Without this, clicking the \"A\" label of a point with the segment\n // tool falls through to `findNearestPoint` and — when the label center is\n // beyond the 12 px tolerance — creates a duplicate point right next to A.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const promoteLabel = useCallback((o: JxgObj): JxgObj => {\n if (!o) return o;\n const t = (o.elType || o.type || '').toString().toLowerCase();\n if (t !== 'text') return o;\n const b = boardRef.current;\n if (!b) return o;\n const promoted = safeJsx<JxgObj | null>('MiniBoard.promoteLabel', () => {\n for (const c of (b.objectsList || [])) {\n if (c.label === o) return c;\n }\n return null;\n }, null);\n return promoted ?? o;\n }, []);\n\n // Pending transform state for rotate/dilate/regularPolygon (needs param popover)\n interface PendingTransform {\n tool: 'rotate' | 'dilate' | 'regularPolygon';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n center: any;\n anchorScreen: { x: number; y: number };\n }\n const pendingTransformRef = useRef<PendingTransform | null>(null);\n type TransformPopoverInfo = { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null;\n const transformSubsRef = useRef<Set<(info: TransformPopoverInfo) => void>>(new Set());\n const emitTransform = useCallback((info: TransformPopoverInfo) => {\n transformSubsRef.current.forEach((cb) => { safeJsx('MiniBoard.emitTransform.cb', () => cb(info)); });\n }, []);\n\n // Selection subscribers — emitted when Move tool single-clicks an object\n const selectSubsRef = useRef<Set<(snap: ObjectSnapshot) => void>>(new Set());\n const emitSelect = useCallback((snap: ObjectSnapshot) => {\n selectSubsRef.current.forEach((cb) => { safeJsx('MiniBoard.emitSelect.cb', () => cb(snap)); });\n }, []);\n\n // Track pointer-down position for click vs drag detection in Move tool\n const moveDownRef = useRef<{ sx: number; sy: number } | null>(null);\n // Track previous Move-tool click for double-click detection (open popover only\n // on 2nd click within 400ms on the same object).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const lastMoveClickRef = useRef<{ obj: any | null; time: number }>({ obj: null, time: 0 });\n\n // Initialize board\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n (async () => {\n const JXG = (await import('jsxgraph')).default;\n if (cancelled || !containerRef.current) return;\n jxgRef.current = JXG;\n // Render text/labels as SVG <text> (default 'html' uses absolute-positioned\n // <div> overlays, which are NOT captured when we clone the SVG to export\n // the stamp → labels disappear in inserted image).\n safeJsx('MiniBoard.applyJxgOptions', () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n // Label tone theo theme — JSXGraph mặc định stroke black cho text label.\n opts.label.strokeColor = themeLabel(isDarkRef.current);\n opts.text.strokeColor = themeLabel(isDarkRef.current);\n }\n });\n const board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: initialState?.bbox ?? [-10, 10, 10, -10],\n axis: false, // We manage axis manually via toggle for clean default\n grid: false,\n showCopyright: false,\n showNavigation: true,\n // Keep 1:1 user→pixel ratio so circles stay circular regardless of the\n // container aspect ratio (Excalidraw panel is taller than wide and\n // without this circles became ellipses after reload).\n keepAspectRatio: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: true },\n // Looser hit-test radius so clicking on a thin segment/line/circle\n // actually registers without pixel-perfect aim. `precision` is a real\n // JSXGraph option (Options.precision) but isn't in the d.ts file.\n ...({ precision: { hasPoint: 8, mouse: 4, touch: 16 } } as Record<string, unknown>),\n });\n boardRef.current = board;\n\n // Replay initial state if any\n if (initialState && initialState.elements.length > 0) {\n for (const el of initialState.elements) {\n recreateFromLogEntry(el);\n }\n creationLogRef.current = [...initialState.elements];\n labelIdxRef.current = initialState.elements.filter(e => e.type === 'point').length;\n }\n\n // Initial axis/grid\n if (showAxisRef.current) {\n safeJsx('MiniBoard.initAxes', () => {\n axisObjsRef.current.x = board.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = board.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n });\n }\n if (showGridRef.current) {\n safeJsx('MiniBoard.initGrid', () => board.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 }));\n }\n\n // Pointer down: handle click-driven tool actions.\n // Full dispatch logic lives in handlers.ts (handleDown). A stable ctx\n // object is built here so the closure captured at mount stays thin.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('down', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleDown(ctx, e);\n });\n\n // Pointer up: DOUBLE-click on Move tool emits selection. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('up', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleUp(ctx, e);\n });\n\n // Mouse move: update phantom + marquee. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('move', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleMove(ctx, e);\n });\n\n onReady({\n getContainer: () => containerRef.current,\n // Sync toạ độ live của free point về log trước khi trả ra. JSXGraph\n // cho phép drag free point (args=[x,y] không có ref), việc drag chỉ\n // cập nhật obj.X()/Y() trên board chứ không đụng log → re-edit + Chèn\n // sẽ serialize toạ độ cũ → SVG không đổi → fileId trùng → user thấy\n // \"k thay đổi\". Line/segment/circle/polygon tham chiếu point qua id\n // nên auto-update theo.\n getCreationLog: () => creationLogRef.current.map((e) => {\n if (e.type !== 'point') return { ...e };\n const args = e.args;\n if (!Array.isArray(args) || args.length !== 2) return { ...e };\n if (typeof args[0] !== 'number' || typeof args[1] !== 'number') return { ...e };\n const obj = objMapRef.current.get(e.id) as\n | { X?: () => number; Y?: () => number }\n | undefined;\n if (!obj || typeof obj.X !== 'function' || typeof obj.Y !== 'function') return { ...e };\n const x = obj.X();\n const y = obj.Y();\n if (!Number.isFinite(x) || !Number.isFinite(y)) return { ...e };\n return { ...e, args: [x, y] };\n }),\n getBbox: () => boardRef.current ? boardRef.current.getBoundingBox() : [-10, 10, 10, -10],\n getShowAxis: () => showAxisRef.current,\n getShowGrid: () => showGridRef.current,\n setTool: (t: GeomTool) => handleToolChangeRef.current(t),\n getTool: () => toolRef.current,\n setShowAxis: (b: boolean) => setShowAxisRef.current(b),\n setShowGrid: (b: boolean) => setShowGridRef.current(b),\n undo: () => undoLastRef.current(),\n canUndo: () => creationLogRef.current.length > 0,\n redo: () => redoNextRef.current(),\n canRedo: () => redoStackRef.current.length > 0,\n subscribe: (cb: () => void) => {\n subscribersRef.current.add(cb);\n return () => { subscribersRef.current.delete(cb); };\n },\n snapshotObject,\n mutateObject,\n getAllPointNames: () => {\n const b = boardRef.current;\n if (!b) return [];\n const out: string[] = [];\n safeJsx('MiniBoard.getAllPointNames', () => {\n const objs = b.objectsList || [];\n for (const o of objs) {\n if (objKind(o) === 'point' && typeof o.name === 'string' && o.name) {\n out.push(o.name);\n }\n }\n });\n return out;\n },\n onSelect: (cb: (snap: ObjectSnapshot) => void) => {\n selectSubsRef.current.add(cb);\n return () => { selectSubsRef.current.delete(cb); };\n },\n onTransformParam: (cb: (info: TransformPopoverInfo) => void) => {\n transformSubsRef.current.add(cb);\n return () => { transformSubsRef.current.delete(cb); };\n },\n confirmTransformParam: (value: number) => {\n const p = pendingTransformRef.current;\n if (!p) return;\n if (p.tool === 'regularPolygon') {\n const n = Math.max(3, Math.round(value));\n const p1Id = localIdOf(p.source);\n const p2Id = localIdOf(p.center);\n if (p1Id && p2Id && boardRef.current) {\n try {\n create('regularpolygon', [p1Id, p2Id, n], {\n fillColor: '#1e3a8a',\n fillOpacity: 0.10,\n borders: { strokeColor: '@stroke', strokeWidth: 2 },\n });\n } catch (err) {\n console.warn('regularpolygon failed', err);\n }\n }\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n return;\n }\n const spec = p.tool === 'rotate'\n ? buildTransformSpec({ kind: 'rotate', center: p.center, angleDeg: value })\n : buildTransformSpec({ kind: 'dilate', center: p.center, k: value });\n finalizeTransformCreateRef.current(spec, p.source);\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n cancelTransformParam: () => {\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n getSelectionSize: () => selectedSetRef.current.size,\n clearSelection: () => clearSelectionRef.current(),\n deleteSelection: () => deleteSelectedRef.current(),\n });\n })();\n return () => {\n cancelled = true;\n if (previewRafRef.current != null) {\n cancelAnimationFrame(previewRafRef.current);\n previewRafRef.current = null;\n }\n if (boardRef.current && jxgRef.current) {\n safeJsx('MiniBoard.freeBoard', () => jxgRef.current!.JSXGraph.freeBoard(boardRef.current));\n boardRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n // React to axis/grid toggle changes after init\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('MiniBoard.toggleAxis', () => {\n // Remove existing axes if present\n if (axisObjsRef.current.x) { safeJsx('MiniBoard.removeObject(axisX)', () => b.removeObject(axisObjsRef.current.x)); axisObjsRef.current.x = undefined; }\n if (axisObjsRef.current.y) { safeJsx('MiniBoard.removeObject(axisY)', () => b.removeObject(axisObjsRef.current.y)); axisObjsRef.current.y = undefined; }\n if (showAxis) {\n axisObjsRef.current.x = b.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = b.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n }\n b.update();\n });\n }, [showAxis]);\n\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('MiniBoard.toggleGrid', () => {\n // Find existing grid objects and remove\n const objs = Object.values(b.objects || {}) as JxgObj[];\n for (const o of objs) {\n if (o && (o.elType === 'grid' || o.type === 'grid' || (o.visProp && o.visProp.type === 'grid'))) {\n safeJsx('MiniBoard.removeObject(grid)', () => b.removeObject(o));\n }\n }\n if (showGrid) {\n b.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 });\n }\n b.update();\n });\n }, [showGrid]);\n\n const handleToolChange = useCallback((t: GeomTool) => {\n clearPending();\n // Update the ref synchronously so subsequent pointer-down events (e.g. a\n // fast user click immediately after picking a tool) see the new tool\n // without waiting for React's commit phase.\n toolRef.current = t;\n setTool(t);\n // Disable JSXGraph pan while the user is in the select tool so that\n // drag-empty starts a marquee selection instead of panning the board.\n // Re-enable for every other tool (board pan is the default).\n const b = boardRef.current;\n if (b) {\n safeJsx('MiniBoard.setPanForTool', () => {\n if (b.attr?.pan) b.attr.pan.enabled = (t !== 'select');\n });\n }\n }, [clearPending]);\n\n // Stable ref so onReady closure (captured at mount) can call latest handler.\n const handleToolChangeRef = useRef(handleToolChange);\n handleToolChangeRef.current = handleToolChange;\n\n // Subscribers thông báo bên ngoài khi state thay đổi (tool / axis / grid / undo)\n const subscribersRef = useRef<Set<() => void>>(new Set());\n const notifySubscribers = useCallback(() => {\n subscribersRef.current.forEach((cb) => {\n safeJsx('MiniBoard.notifySubscriber.cb', () => cb());\n });\n }, []);\n\n // Phát tín hiệu khi state thay đổi\n useEffect(() => { notifySubscribers(); }, [tool, showAxis, showGrid, historyTick, notifySubscribers]);\n\n const undoLastRef = useRef(undoLast);\n undoLastRef.current = undoLast;\n const redoNextRef = useRef(redoNext);\n redoNextRef.current = redoNext;\n const clearPendingRef = useRef(clearPending);\n clearPendingRef.current = clearPending;\n const finalizeTransformCreateRef = useRef(finalizeTransformCreate);\n finalizeTransformCreateRef.current = finalizeTransformCreate;\n const clearSelectionRef = useRef(clearSelection);\n clearSelectionRef.current = clearSelection;\n const deleteSelectedRef = useRef(deleteSelected);\n deleteSelectedRef.current = deleteSelected;\n const emitTransformRef = useRef(emitTransform);\n emitTransformRef.current = emitTransform;\n const setShowAxisRef = useRef(setShowAxis);\n setShowAxisRef.current = setShowAxis;\n const setShowGridRef = useRef(setShowGrid);\n setShowGridRef.current = setShowGrid;\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"jxgmini-container\"\n className=\"h-full min-h-0 bg-white\"\n style={{ touchAction: 'none' }}\n />\n );\n};\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-6 w-6 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS, GROUP_LABELS, type GeomTool, type ToolDef } from './MiniBoard';\nimport { GROUP_ORDER, letterForGroup, type GeomGroup } from './tools';\nimport { MobileToolDrawer, type MobileToolGroup } from '../../shared/MobileToolDrawer';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shared shell (desktop) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isDark?: boolean;\n closeLabel?: string;\n}\n\nfunction Shell({ title, icon, onClose, children, isDark, closeLabel = 'Đóng' }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label={closeLabel}\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Icons ----------\n\nconst GeometryIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function UndoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nexport function RedoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nfunction AxisIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nfunction GridIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n\n// ---------- Props ----------\n\ninterface GeometryLeftPanelProps {\n activeTool: GeomTool;\n onToolChange: (t: GeomTool) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n onClose: () => void;\n isDark?: boolean;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n /** Chord shortcut: group đang được focus (sau khi bấm letter). null = không active. */\n chordGroup?: GeomGroup | null;\n}\n\n// ---------- Tooltip portal (desktop hover) ----------\n\nfunction useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: ToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n\n// ---------- Desktop left panel ----------\n\nfunction DesktopGeometryPanel(props: GeometryLeftPanelProps) {\n const { activeTool, onToolChange, showAxis, showGrid, onShowAxisChange, onShowGridChange, onUndo, canUndo, onRedo, canRedo, onClose, isDark, chordGroup } = props;\n\n const grouped = useMemo(() => {\n return TOOLS.reduce<Record<string, ToolDef[]>>((acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n }, {});\n }, []);\n const groupKeys = useMemo(\n () => GROUP_ORDER.filter((g) => grouped[g]),\n [grouped],\n );\n\n const activeGroupTools: ToolDef[] | null = chordGroup\n ? (grouped[chordGroup] ?? null)\n : null;\n\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n return (\n <>\n <Shell title=\"Hình học\" icon={GeometryIconHeader} onClose={onClose} isDark={isDark}>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxis}\n onChange={(e) => onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n Trục toạ độ\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showGrid}\n onChange={(e) => onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n </Section>\n\n {groupKeys.map((group) => {\n const isChordActive = chordGroup === group;\n const dimmed = chordGroup !== null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive\n ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1'\n : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{GROUP_LABELS[group]}</span>\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {letterForGroup(group)}\n </span>\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group].map((t, i) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'relative flex h-8 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n <span\n data-testid={`chord-num-${t.key}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n active\n ? 'text-white/70'\n : isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {i + 1}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n );\n })}\n\n {chordGroup && activeGroupTools && (\n <div\n data-testid=\"chord-hint\"\n className=\"mt-1 rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {letterForGroup(chordGroup)}\n </span>\n <span className=\"mx-1 text-slate-400\">→</span>\n {activeGroupTools.map((t, i) => (\n <span key={t.key} className=\"mr-2 inline-block\">\n <span className=\"font-mono font-semibold text-emerald-700\">\n {i + 1}\n </span>\n <span className=\"ml-1\">{t.label}</span>\n </span>\n ))}\n <span className=\"text-slate-400\">Esc huỷ</span>\n </div>\n )}\n </Shell>\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\n// ---------- Mobile geometry panel (redesigned) ----------\n\nfunction MobileGeometryPanel(props: GeometryLeftPanelProps) {\n const {\n activeTool,\n onToolChange,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onRedo,\n canRedo,\n isDark,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = useMemo<MobileToolGroup<GeomTool, ToolDef['group']>[]>(() => {\n const acc = new Map<ToolDef['group'], ToolDef[]>();\n for (const t of TOOLS) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n return Array.from(acc.entries()).map(([group, tools]) => ({\n group,\n groupLabel: GROUP_LABELS[group],\n tools: tools.map((t) => ({ key: t.key, label: t.label, icon: t.icon })),\n }));\n }, []);\n\n return (\n <MobileToolDrawer\n title=\"Hình học\"\n headerIcon={GeometryIconHeader}\n testId=\"stamp-left-panel\"\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={[\n {\n label: 'Trục',\n icon: <AxisIcon />,\n pressed: showAxis,\n onToggle: onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: 'Lưới',\n icon: <GridIcon />,\n pressed: showGrid,\n onToggle: onShowGridChange,\n testId: 'toggle-grid',\n },\n ]}\n actions={[\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: onUndo,\n disabled: !canUndo,\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: onRedo,\n disabled: !canRedo,\n },\n ]}\n groups={groups}\n activeTool={activeTool}\n onToolSelect={onToolChange}\n />\n );\n}\n\n// ---------- Public entry point ----------\n\nexport function LeftPanel(props: GeometryLeftPanelProps) {\n if (props.isMobile) {\n return <MobileGeometryPanel {...props} />;\n }\n return <DesktopGeometryPanel {...props} />;\n}\n\n// Alias for back-compat\nexport { LeftPanel as GeometryLeftPanel };\n","// 8 màu chính lấy từ Excalidraw DEFAULT_ELEMENT_STROKE_COLOR_PALETTE.\n// Nguồn: @excalidraw/excalidraw — packages/excalidraw/colors.ts (top row chuẩn).\n// Cần đồng bộ tay nếu Excalidraw đổi palette ở major bump.\nexport const STROKE_PALETTE = [\n '#1e1e1e', // black\n '#e03131', // red\n '#e8590c', // orange\n '#f08c00', // yellow\n '#2f9e44', // green\n '#1971c2', // blue\n '#9c36b5', // grape\n '#868e96', // gray\n] as const;\n\nexport type StrokeColor = (typeof STROKE_PALETTE)[number];\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 768px)';\nconst NO_HOVER_QUERY = '(hover: none)';\n\nexport interface MobileState {\n /** Viewport ≤ 768px — dùng để chuyển full-screen modal + drawer. */\n isMobile: boolean;\n /** Device không có hover (touch-only) — dùng để ẩn hover tooltips. */\n isTouchOnly: boolean;\n}\n\nfunction readMatch(query: string): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n try {\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\n/**\n * SSR-safe mobile detection qua matchMedia. Trả về `{ isMobile, isTouchOnly }`.\n * Re-render khi viewport resize hoặc input modality đổi (e.g., gắn Bluetooth mouse).\n */\nexport function useIsMobile(): MobileState {\n const [state, setState] = useState<MobileState>(() => ({\n isMobile: readMatch(MOBILE_QUERY),\n isTouchOnly: readMatch(NO_HOVER_QUERY),\n }));\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const tql = window.matchMedia(NO_HOVER_QUERY);\n const update = () => {\n setState({ isMobile: mql.matches, isTouchOnly: tql.matches });\n };\n update();\n mql.addEventListener('change', update);\n tql.addEventListener('change', update);\n return () => {\n mql.removeEventListener('change', update);\n tql.removeEventListener('change', update);\n };\n }, []);\n\n return state;\n}\n","'use client';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\nexport type ObjKind = 'point' | 'line' | 'circle';\nexport type PointFace = 'o' | 'circle' | 'cross' | 'plus';\n\nexport interface PropertyPatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n /** Bật/tắt value-label động (độ dài segment / bán kính circle). */\n valueLabel?: boolean;\n}\n\ninterface CommonProps {\n anchor: { x: number; y: number };\n onClose: () => void;\n onMutate: (patch: PropertyPatch) => void;\n isDark?: boolean;\n /** Trả về danh sách tên point hiện có (để rename auto-disambiguate). */\n getAllNames?: () => string[];\n}\n\ninterface PointProps extends CommonProps {\n kind: 'point';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n currentFace: PointFace;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n}\n\ninterface LineOrCircleProps extends CommonProps {\n kind: 'line' | 'circle';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n /** Có đang hiện value-label động không. */\n currentShowValue?: boolean;\n}\n\ntype Props = PointProps | LineOrCircleProps;\n\nconst DASH_OPTIONS: Array<{ value: number; label: string }> = [\n { value: 0, label: 'Nét liền' },\n { value: 2, label: 'Nét đứt' },\n { value: 1, label: 'Nét chấm' },\n];\n\nconst WIDTH_OPTIONS = [1, 2, 3];\n\nconst FACE_OPTIONS: Array<{ value: PointFace; symbol: string }> = [\n { value: 'o', symbol: '●' },\n { value: 'circle', symbol: '◯' },\n { value: 'cross', symbol: '✕' },\n { value: 'plus', symbol: '✚' },\n];\n\n// Unicode subscript digits — dùng để tự đặt tên duy nhất khi user nhập trùng.\n// Lưu dưới dạng ký tự subscript thì JSXGraph SVG <text> render đúng \"B₂\"\n// như label một glyph, không cần MathJax/KaTeX.\nconst SUB_DIGITS = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉'];\nconst SUB_SET = new Set(SUB_DIGITS);\n\nfunction toSubscript(n: number): string {\n return String(n).split('').map((d) => SUB_DIGITS[+d] ?? d).join('');\n}\n\nfunction stripTrailingSubscript(s: string): string {\n let i = s.length;\n while (i > 0 && SUB_SET.has(s[i - 1])) i--;\n return s.slice(0, i);\n}\n\nfunction disambiguateName(name: string, existing: Set<string>): string {\n if (!name) return name;\n if (!existing.has(name)) return name;\n const base = stripTrailingSubscript(name) || name;\n for (let n = 2; n < 1000; n++) {\n const candidate = base + toSubscript(n);\n if (!existing.has(candidate)) return candidate;\n }\n return name;\n}\n\ntype Section = 'color' | 'style' | 'size' | 'name' | null;\n\n// Inline icons (small, monochrome) — match the visual weight of Excalidraw's\n// floating action bar in the screenshot. All 16px viewBox 24x24.\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n style: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" /></svg>\n ),\n size: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\"><line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\" strokeWidth=\"1\" /><line x1=\"4\" y1=\"13\" x2=\"20\" y2=\"13\" strokeWidth=\"2\" /><line x1=\"4\" y1=\"17\" x2=\"20\" y2=\"17\" strokeWidth=\"3.2\" /></svg>\n ),\n name: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><text x=\"2\" y=\"17\" fontSize=\"14\" fontFamily=\"serif\" fontWeight=\"700\">A</text><text x=\"12\" y=\"17\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\">a</text></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\" /><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" /><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" /><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" /></svg>\n ),\n};\n\nexport const PropertiesPopover: React.FC<Props> = (props) => {\n const { anchor, onClose, onMutate, isDark, getAllNames } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n // Clamp anchor vào viewport sau khi render (measure actual rect).\n // Trên mobile, force bottom-center thay vì follow anchor (anchor có thể nằm\n // sát mép màn hình hoặc dưới ngón tay user → khó tap).\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n // Bottom-center, 12px above bottom safe area.\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n const initialName =\n props.kind === 'point' ? props.currentName : (props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const [name, setName] = useState<string>(initialName);\n // Khi popover mở lại trên đối tượng khác, đồng bộ name input.\n useEffect(() => {\n setName(initialName);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialName]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n // PointerDown covers mouse + touch + pen — replaces legacy mousedown listener\n // which excluded touch/pen and broke click-outside trên mobile.\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const pickColor = (c: string) => {\n onMutate({ attrs: { strokeColor: c, fillColor: props.kind === 'circle' ? 'none' : c, color: c } });\n };\n const pickDash = (d: number) => onMutate({ attrs: { dash: d } });\n const pickWidth = (w: number) => onMutate({ attrs: { strokeWidth: w } });\n const pickFace = (f: PointFace) => onMutate({ attrs: { face: f } });\n\n const currentName = (props.kind === 'point' || props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const commitName = () => {\n const trimmed = name.trim();\n if (trimmed === currentName) return;\n // Cho phép xoá tên (empty); chỉ disambiguate khi user nhập 1 cái gì đó.\n let final = trimmed;\n if (trimmed) {\n const others = new Set((getAllNames?.() ?? []).filter((n) => n !== currentName));\n final = disambiguateName(trimmed, others);\n }\n if (final !== name) setName(final);\n onMutate({ attrs: { name: final } });\n };\n\n const toggleShowLabel = (next: boolean) => onMutate({ attrs: { withLabel: next } });\n const toggleShowValue = (next: boolean) => onMutate({ valueLabel: next });\n\n const doDelete = () => { onMutate({ remove: true }); onClose(); };\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n\n const currentColor = props.currentColor;\n const currentDash = props.currentDash;\n const currentWidth = props.currentWidth;\n\n if (typeof document === 'undefined') return null;\n\n // Pill toolbar: row of icon buttons, separator before trash. Click một icon\n // để bung panel chi tiết bên dưới. Trash xoá ngay (không có panel).\n const PillBtn = ({ id, label, icon, active, onClick, indicatorColor }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean;\n onClick: () => void; indicatorColor?: string;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n {indicatorColor && (\n <span\n aria-hidden\n className=\"absolute bottom-0.5 left-1/2 -translate-x-1/2 h-1 w-4 rounded-full\"\n style={{ background: indicatorColor }}\n />\n )}\n </button>\n );\n\n const colorIndicatorTint = useMemo(() => currentColor, [currentColor]);\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label=\"Thuộc tính đối tượng\"\n >\n {/* Pill toolbar */}\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <PillBtn id=\"color\" label=\"Màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} indicatorColor={colorIndicatorTint} />\n <PillBtn id=\"style\" label=\"Kiểu\" icon={Icons.style} active={section === 'style'} onClick={() => toggleSection('style')} />\n <PillBtn id=\"size\" label=\"Độ dày\" icon={Icons.size} active={section === 'size'} onClick={() => toggleSection('size')} />\n <PillBtn id=\"name\" label=\"Tên\" icon={Icons.name} active={section === 'name'} onClick={() => toggleSection('name')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {/* Sub-panel — chỉ hiện khi user chọn 1 icon */}\n {section && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n {section === 'color' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => pickColor(c)}\n className={`h-6 w-6 rounded border ${currentColor === c ? 'border-emerald-500 ring-2 ring-emerald-300' : 'border-slate-200'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Kiểu</span>\n {props.kind === 'point' ? (\n <div className=\"flex gap-1\">\n {FACE_OPTIONS.map((f) => (\n <button\n key={f.value}\n aria-label={`Hình ${f.value}`}\n onClick={() => pickFace(f.value)}\n className={`h-7 w-7 rounded border text-sm ${(props as PointProps).currentFace === f.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {f.symbol}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex gap-1\">\n {DASH_OPTIONS.map((d) => (\n <button\n key={d.value}\n aria-label={`Kiểu ${d.label.toLowerCase()}`}\n onClick={() => pickDash(d.value)}\n className={`flex-1 rounded border px-1 py-1 text-[11px] ${currentDash === d.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {d.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {section === 'size' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Độ dày</span>\n <div className=\"flex gap-1\">\n {WIDTH_OPTIONS.map((w) => (\n <button\n key={w}\n aria-label={`Độ dày ${w}`}\n onClick={() => pickWidth(w)}\n className={`flex-1 rounded border py-1 ${currentWidth === w ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n <span className=\"inline-block rounded bg-slate-800\" style={{ width: 30, height: w }} />\n </button>\n ))}\n </div>\n </div>\n )}\n\n {section === 'name' && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Tên</span>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitName}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitName(); } }}\n autoFocus\n placeholder={props.kind === 'point' ? 'A, B, …' : props.kind === 'line' ? 'a, b, f, …' : 'O, c, …'}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <span className=\"text-[10px] text-slate-400\">Trùng tên sẽ tự thêm chỉ số (B → B₂)</span>\n </div>\n\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị tên</span>\n <input\n type=\"checkbox\"\n checked={props.currentShowLabel !== false}\n onChange={(e) => toggleShowLabel(e.target.checked)}\n aria-label=\"Hiển thị tên\"\n />\n </label>\n\n {(props.kind === 'line' || props.kind === 'circle') && (\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị giá trị</span>\n <input\n type=\"checkbox\"\n checked={!!(props as LineOrCircleProps).currentShowValue}\n onChange={(e) => toggleShowValue(e.target.checked)}\n aria-label=\"Hiển thị giá trị\"\n />\n </label>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ParamKind = 'rotate' | 'dilate' | 'regularPolygon';\n\ninterface Props {\n kind: ParamKind;\n anchor: { x: number; y: number };\n defaultValue: number;\n onConfirm: (value: number) => void;\n onCancel: () => void;\n isDark?: boolean;\n}\n\nconst LABELS: Record<ParamKind, { aria: string; label: string; step: number; min?: number }> = {\n rotate: { aria: 'Góc quay', label: 'Góc (°)', step: 15 },\n dilate: { aria: 'Tỷ số k', label: 'Tỷ số k', step: 0.5 },\n regularPolygon: { aria: 'Số cạnh đa giác đều', label: 'Số cạnh (n ≥ 3)', step: 1, min: 3 },\n};\n\nexport const TransformParamPopover: React.FC<Props> = ({ kind, anchor, defaultValue, onConfirm, onCancel, isDark }) => {\n const [value, setValue] = useState<number>(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const meta = LABELS[kind];\n\n useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n\n const submit = () => {\n let v = Number.isFinite(value) ? value : defaultValue;\n if (kind === 'regularPolygon') {\n v = Math.max(3, Math.round(v));\n }\n onConfirm(v);\n };\n\n if (typeof document === 'undefined') return null;\n\n const node = (\n <div\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-2 rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5`}\n style={{ left: anchor.x, top: anchor.y, minWidth: 180 }}\n role=\"dialog\"\n aria-label={meta.aria}\n >\n <label className=\"text-xs font-medium text-slate-700\">{meta.label}</label>\n <input\n ref={inputRef}\n type=\"number\"\n value={value}\n step={meta.step}\n min={meta.min}\n onChange={(e) => setValue(parseFloat(e.target.value))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n else if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={onCancel}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-xs text-slate-700 hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={submit}\n className=\"rounded bg-emerald-600 px-2 py-1 text-xs font-medium text-white hover:bg-emerald-700\"\n >\n Áp dụng\n </button>\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { JSXGraphMiniBoard, type MiniBoardHandle, type GeomTool, type ObjectSnapshot } from './MiniBoard';\nimport { serializeBoard, type SerializedBoard } from '../serialize';\nimport { renderGeometrySvgFromState } from '../render';\nimport { PropertiesPopover } from './PropertiesPopover';\nimport { TransformParamPopover } from './TransformParamPopover';\nimport { UndoIcon, RedoIcon } from './LeftPanel';\n\ninterface Props {\n initialState: SerializedBoard | null;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Khi true, panel position offset left để chừa chỗ cho StampLeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Callback khi handle/state thay đổi — parent sync LeftPanel state. */\n onStateChange?: (state: GeomBoardState) => void;\n isDark?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n /** Mobile header: undo/redo. Bypass LeftPanel để user truy cập nhanh. */\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n}\n\nexport interface GeomBoardState {\n tool: GeomTool;\n showAxis: boolean;\n showGrid: boolean;\n canUndo: boolean;\n canRedo: boolean;\n}\n\nexport interface GeometryEditorPanelHandle {\n setTool: (t: GeomTool) => void;\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n undo: () => void;\n redo: () => void;\n /** Trigger Chèn programmatically (cho auto-insert khi click outside). */\n insert: () => boolean;\n /** Có nội dung để chèn không? */\n hasContent: () => boolean;\n}\n\nexport const GeometryEditorPanel = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanel({ initialState, onInsert, onClose, withLeftPanel = false, onStateChange, isDark, isMobile = false, onOpenDrawer, onUndo, onRedo, canUndo, canRedo }, ref) {\n const handleRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [hasContent, setHasContent] = useState(false);\n const [propsPopover, setPropsPopover] = useState<ObjectSnapshot | null>(null);\n const [transformPopover, setTransformPopover] = useState<{ tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null>(null);\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => { onStateChangeRef.current = onStateChange; }, [onStateChange]);\n\n const emitState = useCallback(() => {\n const h = handleRef.current;\n if (!h) return;\n setHasContent(h.getCreationLog().length > 0);\n const cb = onStateChangeRef.current;\n if (!cb) return;\n cb({\n tool: h.getTool(),\n showAxis: h.getShowAxis(),\n showGrid: h.getShowGrid(),\n canUndo: h.canUndo(),\n canRedo: h.canRedo(),\n });\n }, []);\n\n const handleReady = useCallback((h: MiniBoardHandle) => {\n handleRef.current = h;\n setReady(true);\n emitState();\n // Subscribe để parent biết khi nào tool/axis/grid/undo thay đổi\n h.subscribe(emitState);\n h.onSelect((snap: ObjectSnapshot) => setPropsPopover(snap));\n h.onTransformParam((info) => setTransformPopover(info));\n }, [emitState]);\n\n // Build serialized state (sentinels intact) — async vì SVG render offscreen\n // với light palette để Excalidraw filter tự đảo khi dark mode.\n const performInsert = useCallback((): boolean => {\n if (!handleRef.current) return false;\n const log = handleRef.current.getCreationLog();\n if (log.length === 0) return false;\n const bbox = handleRef.current.getBbox();\n const showAxis = handleRef.current.getShowAxis();\n const showGrid = handleRef.current.getShowGrid();\n const serialized = serializeBoard(\n { getBoundingBox: () => bbox, create: () => undefined },\n log,\n { showAxis, showGrid },\n );\n const jsonState = JSON.stringify(serialized);\n // Fire-and-forget. Caller (`tryInsert`) chỉ cần biết có nội dung không.\n void (async () => {\n try {\n const svgString = await renderGeometrySvgFromState(jsonState);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n })();\n return true;\n }, [onInsert]);\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n useImperativeHandle(ref, () => ({\n setTool: (t) => handleRef.current?.setTool(t),\n setShowAxis: (b) => handleRef.current?.setShowAxis(b),\n setShowGrid: (b) => handleRef.current?.setShowGrid(b),\n undo: () => handleRef.current?.undo(),\n redo: () => handleRef.current?.redo(),\n insert: performInsert,\n hasContent: () => (handleRef.current?.getCreationLog().length ?? 0) > 0,\n }), [performInsert]);\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học\"\n data-testid=\"geometry-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : 'h-[540px] max-h-[85vh] w-[640px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"3,18 12,3 21,18\" />\n <circle cx=\"12\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"21\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n Dựng hình học\n </h3>\n {isMobile && (\n <>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n aria-label=\"Hoàn tác\"\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n data-testid=\"undo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n aria-label=\"Làm lại\"\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n data-testid=\"redo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <RedoIcon />\n </button>\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geometry-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n </>\n )}\n <button onClick={onClose} aria-label=\"Đóng\" className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1\" style={isMobile ? undefined : { height: '420px' }}>\n <JSXGraphMiniBoard\n onReady={handleReady}\n initialState={initialState}\n isDark={isDark}\n />\n </div>\n {propsPopover && (\n propsPopover.kind === 'point' ? (\n <PropertiesPopover\n kind=\"point\"\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentFace={propsPopover.face}\n currentShowLabel={propsPopover.showLabel}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n // Refresh snapshot để UI checkbox phản ánh state mới\n if (typeof patch.valueLabel === 'boolean' || patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n }}\n />\n ) : (\n <PropertiesPopover\n kind={propsPopover.kind}\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentShowLabel={propsPopover.showLabel}\n currentShowValue={propsPopover.showValue}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n if (typeof patch.valueLabel === 'boolean') {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n if (patch.attrs && 'withLabel' in patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showLabel: !!patch.attrs?.withLabel } : cur);\n }\n }}\n />\n )\n )}\n\n {transformPopover && (\n <TransformParamPopover\n kind={transformPopover.tool}\n anchor={transformPopover.anchor}\n defaultValue={\n transformPopover.tool === 'rotate' ? 90\n : transformPopover.tool === 'dilate' ? 2\n : 6\n }\n isDark={isDark}\n onConfirm={(v) => { handleRef.current?.confirmTransformParam(v); setTransformPopover(null); }}\n onCancel={() => { handleRef.current?.cancelTransformParam(); setTransformPopover(null); }}\n />\n )}\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geometry-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n );\n },\n);\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseChordShortcutArgs<G extends string> {\n groupOrder: readonly G[];\n tools: ReadonlyArray<{ key: string; group: G }>;\n onSelect: (toolKey: string) => void;\n enabled: boolean;\n}\n\ninterface UseChordShortcutResult<G extends string> {\n chordGroup: G | null;\n cancel: () => void;\n}\n\nconst A_CODE = 'a'.charCodeAt(0);\n\nfunction isFieldFocused(): boolean {\n const ae = (typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null);\n return !!(\n ae &&\n (ae.tagName === 'INPUT' ||\n ae.tagName === 'TEXTAREA' ||\n ae.isContentEditable)\n );\n}\n\nexport function useChordShortcut<G extends string>(\n args: UseChordShortcutArgs<G>,\n): UseChordShortcutResult<G> {\n const { groupOrder, tools, onSelect, enabled } = args;\n\n const [chordGroup, setChordGroup] = useState<G | null>(null);\n\n const groupOrderRef = useRef(groupOrder);\n const toolsRef = useRef(tools);\n const onSelectRef = useRef(onSelect);\n const chordGroupRef = useRef<G | null>(null);\n\n groupOrderRef.current = groupOrder;\n toolsRef.current = tools;\n onSelectRef.current = onSelect;\n // chordGroupRef được sync ngay trong handler (xem `setChord` dưới đây)\n // thay vì ghi từ render body — nếu ghi ở body sẽ bị React batch hoá khi\n // hai event xảy ra trong cùng một act() (event sau đọc giá trị cũ).\n\n const cancel = useCallback(() => {\n chordGroupRef.current = null;\n setChordGroup(null);\n }, []);\n\n useEffect(() => {\n if (!enabled) return;\n\n const setChord = (next: G | null) => {\n chordGroupRef.current = next;\n setChordGroup(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isFieldFocused()) return;\n\n const key = e.key;\n const lower = key.length === 1 ? key.toLowerCase() : key;\n\n if (key === 'Escape') {\n if (chordGroupRef.current !== null) {\n e.preventDefault();\n e.stopPropagation();\n setChord(null);\n }\n return;\n }\n\n if (lower.length === 1 && lower >= 'a' && lower <= 'z') {\n const idx = lower.charCodeAt(0) - A_CODE;\n if (idx < groupOrderRef.current.length) {\n e.preventDefault();\n e.stopPropagation();\n setChord(groupOrderRef.current[idx]);\n }\n return;\n }\n\n if (key >= '1' && key <= '9') {\n const active = chordGroupRef.current;\n if (active === null) return;\n const n = key.charCodeAt(0) - '1'.charCodeAt(0); // 0-indexed\n const toolsInGroup = toolsRef.current.filter(\n (t) => t.group === active,\n );\n e.preventDefault();\n e.stopPropagation();\n if (n < toolsInGroup.length) {\n onSelectRef.current(toolsInGroup[n].key);\n }\n setChord(null);\n return;\n }\n };\n\n window.addEventListener('keydown', onKey, { capture: true });\n return () => {\n window.removeEventListener('keydown', onKey, { capture: true });\n };\n }, [enabled]);\n\n return { chordGroup, cancel };\n}\n","export interface SvgImageResult {\n dataURL: string;\n fileId: string;\n width: number;\n height: number;\n mimeType: 'image/svg+xml';\n}\n\nasync function hashString(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest)).slice(0, 16).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (h1 >>> 0).toString(16).padStart(8, '0') + (h2 >>> 0).toString(16).padStart(8, '0');\n}\n\nfunction parseSize(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n // Fallback: try viewBox\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n return attr === 'width' ? 200 : 100;\n}\n\n// SVG → image element data. Skips canvas rasterization entirely (canvas with\n// foreignObject + external resources gets tainted by browser security model,\n// blocking toDataURL). Excalidraw renders SVG natively via mimeType 'image/svg+xml'.\nexport async function svgToImageElement(svg: string): Promise<SvgImageResult> {\n const width = parseSize(svg, 'width');\n const height = parseSize(svg, 'height');\n // Use UTF-8 safe base64 encoding (btoa fails on non-Latin1 chars)\n const utf8 = unescape(encodeURIComponent(svg));\n const dataURL = 'data:image/svg+xml;base64,' + btoa(utf8);\n const fileId = await hashString(dataURL);\n return { dataURL, fileId, width, height, mimeType: 'image/svg+xml' };\n}\n","import { svgToImageElement } from './svgToImage';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData từ kích thước SVG vừa đo được. Đặt làm factory để\n * các stamp loại khác nhau (geometry cần svgWidth/svgHeight, latex không cần)\n * đều có thể chèn data tuỳ ý.\n */\n makeCustomData: (width: number, height: number) => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. svgToImageElement(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await svgToImageElement(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData(width, height);\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width, height, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { GeometryLeftPanel } from './editor/LeftPanel';\nimport {\n GeometryEditorPanel,\n type GeometryEditorPanelHandle,\n type GeomBoardState,\n} from './editor/EditorPanel';\nimport type { GeomTool } from './editor/MiniBoard';\nimport { GROUP_ORDER, TOOLS } from './editor/tools';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport type { SerializedBoard } from './serialize';\nimport { isGeometryCustomData, type GeometryCustomData } from './types';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\n\nconst INITIAL_GEOM_STATE: GeomBoardState = {\n tool: 'move',\n showAxis: false,\n showGrid: false,\n canUndo: false,\n canRedo: false,\n};\n\nexport const GeometryStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function GeometryStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GeometryEditorPanelHandle | null>(null);\n const [geomState, setGeomState] = useState<GeomBoardState>(INITIAL_GEOM_STATE);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS,\n onSelect: (key) => panelRef.current?.setTool(key as GeomTool),\n enabled: !isMobile,\n });\n\n const initialState = useMemo<SerializedBoard | null>(() => {\n if (!editingElement) return null;\n if (!isGeometryCustomData(editingElement.customData)) return null;\n try {\n return JSON.parse(editingElement.customData.jsonState) as SerializedBoard;\n } catch {\n console.warn('GeometryStampHost: customData jsonState corrupted');\n return null;\n }\n }, [editingElement]);\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (width, height): GeometryCustomData => ({\n kind: 'geometry',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <GeometryLeftPanel\n activeTool={geomState.tool}\n onToolChange={(t: GeomTool) => panelRef.current?.setTool(t)}\n showAxis={geomState.showAxis}\n showGrid={geomState.showGrid}\n onShowAxisChange={(b) => panelRef.current?.setShowAxis(b)}\n onShowGridChange={(b) => panelRef.current?.setShowGrid(b)}\n onUndo={() => panelRef.current?.undo()}\n canUndo={geomState.canUndo}\n onRedo={() => panelRef.current?.redo()}\n canRedo={geomState.canRedo}\n onClose={onClose}\n isDark={isDark}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n chordGroup={chordGroup}\n />\n <GeometryEditorPanel\n ref={panelRef}\n initialState={initialState}\n onInsert={handleInsert}\n onClose={onClose}\n onStateChange={setGeomState}\n withLeftPanel={!isMobile}\n isDark={isDark}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n onUndo={() => panelRef.current?.undo()}\n onRedo={() => panelRef.current?.redo()}\n canUndo={geomState.canUndo}\n canRedo={geomState.canRedo}\n />\n </>\n );\n },\n);\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport { renderGeometrySvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport {\n isGeometryCustomData,\n type GeometryCustomData,\n} from './types';\n\nexport { isGeometryCustomData };\nexport type { GeometryCustomData };\n\nconst GeometryStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.GeometryStampHost })),\n);\n\nconst GeometryIcon: ReactNode = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport const geometryStamp: StampType = {\n kind: 'geometry',\n shortcutKey: 'g',\n toolbarLabel: 'G',\n toolbarTitle: 'Chèn hình học (G)',\n toolbarIcon: GeometryIcon,\n toolbarTestId: 'stamp-toolbar-geometry',\n matchesCustomData: isGeometryCustomData,\n async renderSvgFromCustomData(data) {\n if (!isGeometryCustomData(data)) {\n throw new Error('geometryStamp.renderSvgFromCustomData: customData không phải geometry');\n }\n return renderGeometrySvgFromState(data.jsonState);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as GeometryCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGeometryCustomData(data)) return null;\n const svgString = await renderGeometrySvgFromState(data.jsonState);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL = 'data:image/svg+xml;base64,' + (\n typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64')\n );\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: GeometryStampHost,\n};\n"]}