@xom11/whiteboard 0.2.1 → 0.6.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ExcalidrawWithMenus.tsx","../src/serialize.ts","../src/stamp/ToolbarStampInjector.tsx","../src/stamp/JSXGraphMiniBoard.tsx","../src/stamp/StampLeftPanel.tsx","../src/stamp/renderLatexToSvg.ts","../src/stamp/LatexEditorPopover.tsx","../src/stamp/serializeBoard.ts","../src/stamp/renderGeometryToSvg.ts","../src/stamp/GeometryEditorPanel.tsx","../src/stamp/useStampShortcuts.ts","../src/stamp/types.ts","../src/stamp/svgToImageElement.ts","../src/stamp/restoreMathStampFiles.ts","../src/ExcalidrawWhiteboardView.tsx"],"names":["jsxs","Excalidraw","MainMenu","jsx","Footer","WelcomeScreen","useState","useEffect","createPortal","Fragment","useId","useRef","useCallback","pick","forwardRef","LatexEditorPopover","useImperativeHandle","GeometryEditorPanel","dynamic"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\n// Client-only wrapper around Excalidraw that lets us reach for static helpers\n// like `MainMenu.DefaultItems.*`. ExcalidrawWhiteboardView dynamic-imports this\n// file so SSR never evaluates @excalidraw/excalidraw, while inside this file we\n// can use plain static imports (the entire module loads on the client).\n\nimport React from 'react';\nimport {\n Excalidraw,\n MainMenu,\n Footer,\n WelcomeScreen,\n} from '@excalidraw/excalidraw';\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExcalidrawProps = any;\n\nexport function ExcalidrawWithMenus(props: ExcalidrawProps) {\n const { children, ...rest } = props;\n return (\n <Excalidraw {...rest}>\n {/* Replace default menu with curated items — no socials/help/branding */}\n <MainMenu>\n <MainMenu.DefaultItems.LoadScene />\n <MainMenu.DefaultItems.SaveAsImage />\n <MainMenu.DefaultItems.ClearCanvas />\n <MainMenu.DefaultItems.ToggleTheme />\n </MainMenu>\n {/* Footer slot with no content suppresses default \"Made with Excalidraw\" link */}\n <Footer>\n <span />\n </Footer>\n {/* WelcomeScreen slot (empty) prevents the default Excalidraw welcome panel\n * (which includes the Excalidraw logo and social links) from appearing. */}\n <WelcomeScreen>\n <span />\n </WelcomeScreen>\n {children}\n </Excalidraw>\n );\n}\n","import type { AppState } from '@excalidraw/excalidraw/types';\nimport type { SyncableAppState } from './types';\n\nexport function pickSyncableAppState(s: AppState): SyncableAppState {\n return {\n viewBackgroundColor: s.viewBackgroundColor,\n zoom: s.zoom,\n scrollX: s.scrollX,\n scrollY: s.scrollY,\n gridSize: s.gridSize ?? null,\n theme: s.theme,\n };\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface Props {\n /** Bật/tắt theo role. Khi disabled → không mount portal. */\n enabled: boolean;\n /** Stamp đang active: 'geometry' | 'latex' | null */\n activeStamp: 'geometry' | 'latex' | null;\n onToggleGeometry: () => void;\n onToggleLatex: () => void;\n}\n\nconst WRAPPER_ID = 'stamp-toolbar-portal-wrapper';\n\n/**\n * Inject 2 nút G / L vào thanh tool chính của Excalidraw (`.App-toolbar .Shape`)\n * sao cho chúng xuất hiện ngay sau nút eraser (tool 9) và kế thừa CSS native\n * của Excalidraw (cùng kích thước, hover, selected state, keybinding label).\n *\n * Pattern: ReactDOM portal vào 1 DOM node được append vào `.Shape`. Dùng\n * `MutationObserver` để re-mount nếu Excalidraw xoá wrapper hoặc re-render\n * toolbar (đổi orientation, mobile/desktop switch...).\n */\nexport function ToolbarStampInjector({\n enabled,\n activeStamp,\n onToggleGeometry,\n onToggleLatex,\n}: Props) {\n const [mountNode, setMountNode] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!enabled) {\n setMountNode(null);\n return;\n }\n\n let cancelled = false;\n let attempts = 0;\n let observer: MutationObserver | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const tryMount = () => {\n if (cancelled) return;\n // Container thật chứa tất cả tool icons trong Excalidraw 0.18+ là\n // `.App-toolbar .Stack.Stack_horizontal`. Class `.Shape` là class trên\n // <label> của mỗi tool radio, không phải parent.\n const container =\n document.querySelector('.excalidraw .App-toolbar .Stack_horizontal') ??\n document.querySelector('.App-toolbar .Stack_horizontal');\n if (!container) {\n if (attempts++ < 20) {\n timer = setTimeout(tryMount, 100);\n }\n return;\n }\n // Nếu wrapper cũ tồn tại (HMR / re-mount) thì tái sử dụng\n let wrapper = container.querySelector<HTMLDivElement>('#' + WRAPPER_ID);\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.id = WRAPPER_ID;\n wrapper.className = 'Stamp-toolbar-injector';\n wrapper.setAttribute('data-stamp-area', 'true');\n wrapper.style.display = 'inline-flex';\n wrapper.style.alignItems = 'center';\n wrapper.style.gap = '4px';\n wrapper.style.marginInlineStart = '6px';\n wrapper.style.paddingInlineStart = '6px';\n wrapper.style.borderInlineStart = '1px solid var(--default-border-color, rgba(0,0,0,0.1))';\n // Insert before the \"More tools\" dropdown button (last child) nếu có,\n // còn không thì append cuối.\n const moreTools = container.querySelector('.App-toolbar__extra-tools-dropdown')\n ?? container.querySelector('button[aria-label*=\"More tools\" i]');\n if (moreTools && moreTools.parentElement === container) {\n container.insertBefore(wrapper, moreTools);\n } else {\n container.appendChild(wrapper);\n }\n }\n setMountNode(wrapper);\n };\n\n tryMount();\n\n // Observe toolbar parent: nếu Excalidraw re-render và xoá wrapper, ta re-mount.\n const root = document.querySelector('.excalidraw') ?? document.body;\n observer = new MutationObserver(() => {\n if (cancelled) return;\n const stillThere = document.getElementById(WRAPPER_ID);\n if (!stillThere) {\n attempts = 0;\n tryMount();\n }\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n observer?.disconnect();\n // Cleanup wrapper khi component unmount (để tránh leak nếu Excalidraw vẫn render)\n document.getElementById(WRAPPER_ID)?.remove();\n };\n }, [enabled]);\n\n if (!enabled || !mountNode) return null;\n\n return createPortal(\n <>\n <StampToolButton\n icon={GeometryIcon}\n keybind=\"G\"\n label=\"Chèn hình học (G)\"\n active={activeStamp === 'geometry'}\n onClick={onToggleGeometry}\n dataTestId=\"stamp-toolbar-geometry\"\n />\n <StampToolButton\n icon={LatexIcon}\n keybind=\"L\"\n label=\"Chèn công thức LaTeX (L)\"\n active={activeStamp === 'latex'}\n onClick={onToggleLatex}\n dataTestId=\"stamp-toolbar-latex\"\n />\n </>,\n mountNode,\n );\n}\n\n// Inline SVG icons để khớp template tool 1-9 của Excalidraw (line/stroke style).\nconst GeometryIcon = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nconst LatexIcon = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M17 5 H7 L13 12 L7 19 H17\" />\n </svg>\n);\n\ninterface StampToolButtonProps {\n icon: React.ReactNode;\n keybind: string;\n label: string;\n active: boolean;\n onClick: () => void;\n dataTestId?: string;\n}\n\n/**\n * Render mỗi nút như 1 `<button>` đơn lẻ với class `.ToolIcon.Shape` —\n * cùng pattern Excalidraw apply cho các tool radio: outer `<label class=\"ToolIcon Shape\">`\n * sizing 36×36, inner `.ToolIcon__icon`. Vì Excalidraw set `.ToolIcon` flex layout\n * và size lên label, ta render button trực tiếp ở vị trí ngang hàng (không lồng\n * trong label) và áp dụng CSS sizing thủ công cho khớp 36×36.\n */\nfunction StampToolButton({ icon, keybind, label, active, onClick, dataTestId }: StampToolButtonProps) {\n return (\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n aria-pressed={active}\n onClick={onClick}\n data-testid={dataTestId}\n className=\"ToolIcon Shape\"\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 'var(--lg-button-size, 2.25rem)',\n height: 'var(--lg-button-size, 2.25rem)',\n padding: 0,\n margin: 0,\n background: active ? 'var(--color-primary-light, #e0e7ff)' : 'transparent',\n border: 0,\n borderRadius: 'var(--space-factor, 0.25rem)',\n color: active ? 'var(--color-primary, #6965db)' : 'var(--icon-fill-color, #1b1b1f)',\n cursor: 'pointer',\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--button-hover-bg, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n <div\n aria-hidden=\"true\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n {icon}\n </div>\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n right: '3px',\n bottom: '2px',\n fontSize: '0.5625rem',\n color: 'var(--keybinding-color, #6b7280)',\n fontFamily: 'var(--ui-font, system-ui)',\n fontWeight: 400,\n pointerEvents: 'none',\n }}\n >\n {keybind}\n </span>\n </button>\n );\n}\n","'use client';\nimport React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { deserializeIntoBoard, type SerializedBoard, type SerializedElement } from './serializeBoard';\n\n// Tool keys — match GeoGebra-style toolset\nexport type GeomTool =\n | 'move'\n | 'point'\n | 'midpoint'\n | 'segment'\n | 'line'\n | 'ray'\n | 'vector'\n | 'perpendicular'\n | 'parallel'\n | 'perpBisector'\n | 'angleBisector'\n | 'polygon'\n | 'circleCenter'\n | 'circle3'\n | 'tangent'\n | 'angle'\n | 'distance'\n | 'area'\n | 'toggleLabel'\n | 'toggleVisible'\n | 'delete';\n\nexport interface MiniBoardHandle {\n getContainer: () => HTMLDivElement | null;\n getCreationLog: () => SerializedElement[];\n getBbox: () => [number, number, number, number];\n getShowAxis: () => boolean;\n getShowGrid: () => boolean;\n /** Đổi tool active từ bên ngoài (panel trái). */\n setTool: (t: GeomTool) => void;\n getTool: () => GeomTool;\n /** Toggle layout từ bên ngoài. */\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n /** Undo bước cuối. */\n undo: () => void;\n /** Có gì để undo? */\n canUndo: () => boolean;\n /** Subscribe khi state thay đổi (tool / showAxis / showGrid / undo). */\n subscribe: (cb: () => void) => () => void;\n}\n\ninterface Props {\n onReady: (handle: MiniBoardHandle) => void;\n initialState: SerializedBoard | null;\n}\n\nexport interface ToolDef {\n key: GeomTool;\n label: string;\n hint: string;\n icon: React.ReactNode;\n group: 'move' | 'point' | 'line' | 'construct' | 'polygon' | 'circle' | 'measure' | 'edit';\n needs: number; // number of clicks / points required before action fires\n // accepts: 'any' (point or non-point), 'point', 'line', 'circle'\n accepts?: Array<'point' | 'line' | 'circle' | 'any'>;\n}\n\n// Tool icons — simple inline SVG for crispness\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 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 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};\n\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: '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: '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];\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};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\n// Categorize a JSXGraph element type for accept-matching\nfunction 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 (e === 'line' || e === 'segment' || e === 'arrow' || e === 'axis' || e === 'normal' || e === 'parallel' || e === 'perpendicular' || e === 'tangent' || e === 'bisector' || e === 'perpendicularsegment') return 'line';\n if (e === 'circle' || e === 'circumcircle') return 'circle';\n return 'other';\n}\n\nfunction acceptMatches(tool: ToolDef, slot: number, kind: 'point' | 'line' | 'circle' | 'other'): 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\nexport const JSXGraphMiniBoard: React.FC<Props> = ({ onReady, initialState }) => {\n const containerId = useId().replace(/:/g, '_') + '_jxgmini';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const axisObjsRef = useRef<{ x?: JxgObj; y?: JxgObj }>({});\n const creationLogRef = useRef<SerializedElement[]>([]);\n\n const [tool, setTool] = useState<GeomTool>('move');\n const toolRef = useRef<GeomTool>('move');\n toolRef.current = tool;\n\n const [showAxis, setShowAxis] = useState<boolean>(initialState?.showAxis ?? false);\n const [showGrid, setShowGrid] = useState<boolean>(initialState?.showGrid ?? false);\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n // Track JSXGraph point objects created during the session, indexed by our serialized id.\n // We also track the LAST object created (for non-point types like segment) so accept-matching works.\n const objMapRef = useRef<Map<string, JxgObj>>(new Map());\n\n // Pending picks for multi-click tools: array of JSXGraph object refs\n const pendingRef = useRef<JxgObj[]>([]);\n const [, setPendingCount] = useState(0);\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 // Tick state forces re-render so the undo button enable state stays in sync\n // with creationLogRef (which is mutated outside React).\n const [historyTick, setHistoryTick] = useState(0);\n // Transient warning shown when a strict construction tool gets a click that\n // didn't land on the required existing object (so the user knows why nothing\n // happened). Auto-clears.\n const [, setWarn] = useState<string | null>(null);\n const warnTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flashWarn = useCallback((msg: string) => {\n if (warnTimerRef.current) clearTimeout(warnTimerRef.current);\n setWarn(msg);\n warnTimerRef.current = setTimeout(() => setWarn(null), 1800);\n }, []);\n useEffect(() => () => { if (warnTimerRef.current) clearTimeout(warnTimerRef.current); }, []);\n\n const labelIdxRef = useRef(0);\n const nextLabel = useCallback(() => {\n const idx = labelIdxRef.current;\n const suffix = idx >= 26 ? String(Math.floor(idx / 26)) : '';\n const code = 'A'.charCodeAt(0) + (idx % 26);\n labelIdxRef.current = idx + 1;\n return String.fromCharCode(code) + suffix;\n }, []);\n\n const nextLocalId = useCallback(() => 'j' + creationLogRef.current.length, []);\n\n // Build a fresh JSXGraph object id resolver for serialization.\n // We log args using local string IDs (\"j0\"); resolve to JSXGraph objects in-memory via objMapRef.\n const resolveArgs = useCallback((args: unknown[]): unknown[] => {\n return args.map((a) => {\n if (typeof a === 'string' && objMapRef.current.has(a)) {\n return objMapRef.current.get(a);\n }\n return a;\n });\n }, []);\n\n const pushLog = useCallback(\n (id: string, type: string, args: unknown[], attrs: Record<string, unknown>, obj: JxgObj) => {\n creationLogRef.current.push({ id, type, args, attrs });\n objMapRef.current.set(id, obj);\n setHistoryTick((t) => t + 1);\n },\n [],\n );\n\n const create = useCallback(\n (type: string, args: unknown[], attrs: Record<string, unknown> = {}): JxgObj => {\n if (!boardRef.current) return null;\n const id = nextLocalId();\n const resolved = resolveArgs(args);\n const obj = boardRef.current.create(type, resolved, { ...attrs });\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 clearPreviewSegs = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n for (const s of previewSegRef.current) {\n try { b.removeObject(s); } catch { /* ignore */ }\n }\n previewSegRef.current = [];\n }, []);\n\n const clearPending = useCallback(() => {\n clearPreviewSegs();\n pendingRef.current = [];\n setPendingCount(0);\n }, [clearPreviewSegs]);\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: '#0f172a', 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: '#000', 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 create('angle', labels, { radius: 1, fillColor: '#22c55e', fillOpacity: 0.25, strokeColor: '#16a34a', strokeWidth: 1.5, name: lblName });\n break;\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: '#0f172a', strokeWidth: 2 } });\n break;\n }\n case 'area': {\n create('polygon', labels, { fillColor: '#3b82f6', fillOpacity: 0.18, borders: { strokeColor: '#1d4ed8', strokeWidth: 2 } });\n break;\n }\n case 'toggleLabel': {\n const obj = picks[0];\n try {\n if (obj.label) {\n const visible = obj.label.visProp.visible !== false;\n obj.label.setAttribute({ visible: !visible });\n } else if (obj.setAttribute) {\n // For elements without explicit label, toggle 'withLabel'\n const cur = obj.visProp.withlabel !== false;\n obj.setAttribute({ withLabel: !cur });\n }\n boardRef.current.update();\n } catch { /* ignore */ }\n break;\n }\n case 'toggleVisible': {\n const obj = picks[0];\n try {\n const visible = obj.visProp.visible !== false;\n obj.setAttribute({ visible: !visible });\n boardRef.current.update();\n } catch { /* ignore */ }\n break;\n }\n case 'delete': {\n const obj = picks[0];\n try {\n boardRef.current.removeObject(obj);\n // Also remove from log (best effort)\n const id = localIdOf(obj);\n if (id) {\n creationLogRef.current = creationLogRef.current.filter(e => e.id !== id);\n objMapRef.current.delete(id);\n setHistoryTick((t) => t + 1);\n }\n } catch { /* ignore */ }\n break;\n }\n }\n }, [create, localIdOf, nextLabel]);\n\n // Undo: remove the most recently logged creation. Also clears any in-progress\n // polygon construction (pending picks + preview segments) so state is sane.\n const undoLast = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n while (creationLogRef.current.length > 0) {\n const last = creationLogRef.current.pop();\n if (!last) break;\n const obj = objMapRef.current.get(last.id);\n objMapRef.current.delete(last.id);\n if (obj) {\n try { b.removeObject(obj); } catch { /* ignore */ }\n clearPending();\n setHistoryTick((t) => t + 1);\n try { b.update(); } catch { /* ignore */ }\n return;\n }\n // Skip stale log entry (object already gone) and continue popping\n }\n setHistoryTick((t) => t + 1);\n }, [clearPending]);\n\n // Global Ctrl/Cmd+Z while the panel is mounted. Skipped when focus is in a\n // 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.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (!((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z' && !e.shiftKey)) return;\n const ae = document.activeElement as HTMLElement | null;\n if (ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable)) return;\n e.preventDefault();\n e.stopPropagation();\n undoLast();\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [undoLast]);\n\n // Translate a pointer event into JSXGraph SVG-pixel coords (the coord system\n // `hasPoint` uses). Falls back to manual rect math if `getMousePosition` is\n // unavailable (e.g. in tests with a mocked board).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const screenCoordsOf = useCallback((evt: any): [number, number] | null => {\n const b = boardRef.current;\n if (!b) return null;\n try {\n const mp = b.getMousePosition ? b.getMousePosition(evt) : null;\n if (mp && mp.length >= 2) return [mp[0], mp[1]];\n } catch { /* fall through */ }\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const cx = evt.clientX ?? evt.touches?.[0]?.clientX ?? 0;\n const cy = evt.clientY ?? evt.touches?.[0]?.clientY ?? 0;\n return [cx - rect.left, cy - rect.top];\n }\n return null;\n }, []);\n\n // Find which JSXGraph object (if any) is at a given pointer event.\n // JSXGraph's `hasPoint` expects coords in the board's SVG pixel space, not\n // viewport-relative clientX/Y. Without this, hits are offset by the\n // container's page position and existing points never snap.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const objectsAt = useCallback((evt: any): JxgObj[] => {\n const b = boardRef.current;\n if (!b) return [];\n const sc = screenCoordsOf(evt);\n if (!sc) return [];\n const [sx, sy] = sc;\n const list: JxgObj[] = [];\n try {\n const objs = b.objectsList || [];\n for (const o of objs) {\n try {\n if (o.hasPoint && o.hasPoint(sx, sy)) list.push(o);\n } catch { /* ignore */ }\n }\n } catch { /* ignore */ }\n return list;\n }, [screenCoordsOf]);\n\n // Generous point-snap: JSXGraph's `hasPoint` for a point uses the visual\n // radius (~3px) which is too strict for click targeting. When a tool needs\n // a point pick, fall back to \"nearest point within tolPx pixels\".\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const findNearestPoint = useCallback((evt: any, tolPx: number = 12): JxgObj | null => {\n const b = boardRef.current;\n if (!b) return null;\n const sc = screenCoordsOf(evt);\n if (!sc) return null;\n const [sx, sy] = sc;\n const tol2 = tolPx * tolPx;\n let best: { obj: JxgObj; d2: number } | null = null;\n try {\n const objs = b.objectsList || [];\n for (const o of objs) {\n try {\n if (objKind(o) !== 'point') continue;\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n const dx = pc[1] - sx;\n const dy = pc[2] - sy;\n const d2 = dx * dx + dy * dy;\n if (d2 <= tol2 && (!best || d2 < best.d2)) best = { obj: o, d2 };\n } catch { /* ignore */ }\n }\n } catch { /* ignore */ }\n return best ? best.obj : null;\n }, [screenCoordsOf]);\n\n // Initialize board\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n (async () => {\n const JXG = (await import('jsxgraph')).default;\n if (cancelled || !containerRef.current) return;\n jxgRef.current = JXG;\n // Render text/labels as SVG <text> (default 'html' uses absolute-positioned\n // <div> overlays, which are NOT captured when we clone the SVG to export\n // the stamp → labels disappear in inserted image).\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n }\n } catch { /* ignore */ }\n const board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: initialState?.bbox ?? [-10, 10, 10, -10],\n axis: false, // We manage axis manually via toggle for clean default\n grid: false,\n showCopyright: false,\n showNavigation: true,\n // Keep 1:1 user→pixel ratio so circles stay circular regardless of the\n // container aspect ratio (Excalidraw panel is taller than wide and\n // without this circles became ellipses after reload).\n keepAspectRatio: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: true },\n // Looser hit-test radius so clicking on a thin segment/line/circle\n // actually registers without pixel-perfect aim. `precision` is a real\n // JSXGraph option (Options.precision) but isn't in the d.ts file.\n ...({ precision: { hasPoint: 8, mouse: 4, touch: 16 } } as Record<string, unknown>),\n });\n boardRef.current = board;\n\n // Replay initial state if any\n if (initialState && initialState.elements.length > 0) {\n const idMap = objMapRef.current;\n for (const el of initialState.elements) {\n const resolved = el.args.map(a => (typeof a === 'string' && idMap.has(a)) ? idMap.get(a) : a);\n try {\n const obj = board.create(el.type, resolved, { ...el.attrs });\n idMap.set(el.id, obj);\n } catch (err) {\n console.warn('Replay failed for', el.type, err);\n }\n }\n creationLogRef.current = [...initialState.elements];\n labelIdxRef.current = initialState.elements.filter(e => e.type === 'point').length;\n }\n\n // Initial axis/grid\n if (showAxisRef.current) {\n try {\n axisObjsRef.current.x = board.create('axis', [[0, 0], [1, 0]], { strokeColor: '#94a3b8', name: '', withLabel: false });\n axisObjsRef.current.y = board.create('axis', [[0, 0], [0, 1]], { strokeColor: '#94a3b8', name: '', withLabel: false });\n } catch { /* ignore */ }\n }\n if (showGridRef.current) {\n try { board.create('grid', [], { strokeColor: '#e2e8f0', strokeOpacity: 1 }); } catch { /* ignore */ }\n }\n\n // Pointer down: handle click-driven tool actions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('down', (e: any) => {\n if (!boardRef.current) return;\n const t = toolRef.current;\n if (t === 'move') return;\n const toolDef = TOOLS.find(td => td.key === t);\n if (!toolDef) return;\n\n const coords = boardRef.current.getUsrCoordsOfMouse(e);\n const x = coords[0], y = coords[1];\n\n // Detect if click hits any existing object (snap target)\n const hits = objectsAt(e).filter(o => o !== axisObjsRef.current.x && o !== 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 : findNearestPoint(e, 12);\n\n // Tool: point — always create a new free point at click\n if (t === 'point') {\n const name = nextLabel();\n create('point', [x, y], { name, color: '#0f172a', size: 3, fillColor: '#0f172a', strokeColor: '#0f172a' });\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 ?? findNearestPoint(e, 12);\n if (hit) finalize(toolDef, [hit]);\n else 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 (pendingRef.current.length >= 3 && snappedPoint && snappedPoint === pendingRef.current[0]) {\n clearPreviewSegs();\n finalize(toolDef, pendingRef.current);\n clearPending();\n return;\n }\n // Otherwise pick (snap-to-existing or create) a new vertex\n const pick: JxgObj = snappedPoint ?? (() => {\n const name = nextLabel();\n return create('point', [x, y], { name, color: '#0f172a', 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 (pendingRef.current.length > 0 && boardRef.current) {\n const prev = pendingRef.current[pendingRef.current.length - 1];\n try {\n const seg = 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 previewSegRef.current.push(seg);\n } catch { /* ignore */ }\n }\n pendingRef.current.push(pick);\n setPendingCount(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 = 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). Otherwise bind by what's clicked.\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('point')) {\n // generous snap fallback for small points\n const near = findNearestPoint(e, 12);\n if (near) pick = near;\n } else if (remaining.includes('any')) {\n pick = strictPoint ?? lineHit ?? circleHit ?? null;\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 flashWarn(`Còn cần click vào ${needs.join(' + ')} có sẵn`);\n return;\n }\n } else {\n // --- Mode B: lenient, all slots want a point ---\n const snapped = snapPointForPointSlot();\n if (snapped) pick = snapped;\n else {\n const name = nextLabel();\n pick = create('point', [x, y], { name, color: '#0f172a', size: 3, fillColor: '#0f172a', strokeColor: '#0f172a' });\n }\n }\n\n if (!pick) return;\n pendingRef.current.push(pick);\n setPendingCount(pendingRef.current.length);\n\n if (pendingRef.current.length >= toolDef.needs) {\n finalize(toolDef, pendingRef.current);\n clearPending();\n }\n });\n\n onReady({\n getContainer: () => containerRef.current,\n getCreationLog: () => [...creationLogRef.current],\n getBbox: () => boardRef.current ? boardRef.current.getBoundingBox() : [-10, 10, 10, -10],\n getShowAxis: () => showAxisRef.current,\n getShowGrid: () => showGridRef.current,\n setTool: (t: GeomTool) => handleToolChangeRef.current(t),\n getTool: () => toolRef.current,\n setShowAxis: (b: boolean) => setShowAxisRef.current(b),\n setShowGrid: (b: boolean) => setShowGridRef.current(b),\n undo: () => undoLastRef.current(),\n canUndo: () => creationLogRef.current.length > 0,\n subscribe: (cb: () => void) => {\n subscribersRef.current.add(cb);\n return () => { subscribersRef.current.delete(cb); };\n },\n });\n })();\n return () => {\n cancelled = true;\n if (boardRef.current && jxgRef.current) {\n try { jxgRef.current.JSXGraph.freeBoard(boardRef.current); } catch { /* ignore */ }\n boardRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n // React to axis/grid toggle changes after init\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n try {\n // Remove existing axes if present\n if (axisObjsRef.current.x) { try { b.removeObject(axisObjsRef.current.x); } catch { /* ignore */ } axisObjsRef.current.x = undefined; }\n if (axisObjsRef.current.y) { try { b.removeObject(axisObjsRef.current.y); } catch { /* ignore */ } axisObjsRef.current.y = undefined; }\n if (showAxis) {\n axisObjsRef.current.x = b.create('axis', [[0, 0], [1, 0]], { strokeColor: '#94a3b8', name: '', withLabel: false });\n axisObjsRef.current.y = b.create('axis', [[0, 0], [0, 1]], { strokeColor: '#94a3b8', name: '', withLabel: false });\n }\n b.update();\n } catch { /* ignore */ }\n }, [showAxis]);\n\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n try {\n // Find existing grid objects and remove\n const objs = Object.values(b.objects || {}) as JxgObj[];\n for (const o of objs) {\n if (o && (o.elType === 'grid' || o.type === 'grid' || (o.visProp && o.visProp.type === 'grid'))) {\n try { b.removeObject(o); } catch { /* ignore */ }\n }\n }\n if (showGrid) {\n b.create('grid', [], { strokeColor: '#e2e8f0', strokeOpacity: 1 });\n }\n b.update();\n } catch { /* ignore */ }\n }, [showGrid]);\n\n const handleToolChange = useCallback((t: GeomTool) => {\n clearPending();\n // Update the ref synchronously so subsequent pointer-down events (e.g. a\n // fast user click immediately after picking a tool) see the new tool\n // without waiting for React's commit phase.\n toolRef.current = t;\n setTool(t);\n }, [clearPending]);\n\n // Stable ref so onReady closure (captured at mount) can call latest handler.\n const handleToolChangeRef = useRef(handleToolChange);\n handleToolChangeRef.current = handleToolChange;\n\n // Subscribers thông báo bên ngoài khi state thay đổi (tool / axis / grid / undo)\n const subscribersRef = useRef<Set<() => void>>(new Set());\n const notifySubscribers = useCallback(() => {\n subscribersRef.current.forEach((cb) => {\n try { cb(); } catch { /* ignore */ }\n });\n }, []);\n\n // Phát tín hiệu khi state thay đổi\n useEffect(() => { notifySubscribers(); }, [tool, showAxis, showGrid, historyTick, notifySubscribers]);\n\n const undoLastRef = useRef(undoLast);\n undoLastRef.current = undoLast;\n const setShowAxisRef = useRef(setShowAxis);\n setShowAxisRef.current = setShowAxis;\n const setShowGridRef = useRef(setShowGrid);\n setShowGridRef.current = setShowGrid;\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"jxgmini-container\"\n className=\"h-full min-h-0 bg-white\"\n style={{ touchAction: 'none' }}\n />\n );\n};\n","'use client';\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS, GROUP_LABELS, type GeomTool, type ToolDef } from './JSXGraphMiniBoard';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shared shell ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n}\n\nfunction Shell({ title, icon, onClose, children }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n className=\"absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200\"\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Geometry left panel ----------\n\ninterface GeometryLeftPanelProps {\n activeTool: GeomTool;\n onToolChange: (t: GeomTool) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onUndo: () => void;\n canUndo: boolean;\n onClose: () => void;\n}\n\nconst GeometryIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport function GeometryLeftPanel({\n activeTool,\n onToolChange,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onClose,\n}: GeometryLeftPanelProps) {\n // Group TOOLS by category\n const grouped = TOOLS.reduce<Record<string, ToolDef[]>>((acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n }, {});\n const groupKeys = Object.keys(grouped) as Array<ToolDef['group']>;\n\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: ToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return (\n <>\n <Shell title=\"Hình học\" icon={GeometryIconHeader} onClose={onClose}>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxis}\n onChange={(e) => onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n Trục toạ độ\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showGrid}\n onChange={(e) => onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n </button>\n </div>\n </Section>\n\n {groupKeys.map((group) => (\n <Section key={group} label={GROUP_LABELS[group]}>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group].map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'flex h-8 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n </button>\n );\n })}\n </div>\n </Section>\n ))}\n </Shell>\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\n// ---------- LaTeX left panel ----------\n\ninterface LatexLeftPanelProps {\n displayMode: boolean;\n onDisplayModeChange: (b: boolean) => void;\n onInsertSnippet: (snippet: string) => void;\n onClose: () => void;\n}\n\ninterface SnippetDef {\n label: string;\n preview: string;\n snippet: string;\n}\n\nconst SNIPPETS: { group: string; items: SnippetDef[] }[] = [\n {\n group: 'Phân số & luỹ thừa',\n items: [\n { label: 'Phân số', preview: 'a⁄b', snippet: '\\\\frac{a}{b}' },\n { label: 'Luỹ thừa', preview: 'x²', snippet: '^{2}' },\n { label: 'Chỉ số', preview: 'x₁', snippet: '_{1}' },\n { label: 'Căn', preview: '√x', snippet: '\\\\sqrt{x}' },\n { label: 'Căn n', preview: 'ⁿ√x', snippet: '\\\\sqrt[n]{x}' },\n ],\n },\n {\n group: 'Tổng & tích phân',\n items: [\n { label: 'Tổng', preview: 'Σ', snippet: '\\\\sum_{i=1}^{n}' },\n { label: 'Tích', preview: 'Π', snippet: '\\\\prod_{i=1}^{n}' },\n { label: 'Tích phân', preview: '∫', snippet: '\\\\int_{a}^{b}' },\n { label: 'Giới hạn', preview: 'lim', snippet: '\\\\lim_{x \\\\to 0}' },\n ],\n },\n {\n group: 'Ký hiệu',\n items: [\n { label: 'α', preview: 'α', snippet: '\\\\alpha' },\n { label: 'β', preview: 'β', snippet: '\\\\beta' },\n { label: 'π', preview: 'π', snippet: '\\\\pi' },\n { label: 'θ', preview: 'θ', snippet: '\\\\theta' },\n { label: '≠', preview: '≠', snippet: '\\\\neq' },\n { label: '≤', preview: '≤', snippet: '\\\\leq' },\n { label: '≥', preview: '≥', snippet: '\\\\geq' },\n { label: '∞', preview: '∞', snippet: '\\\\infty' },\n { label: '→', preview: '→', snippet: '\\\\to' },\n ],\n },\n];\n\nexport function LatexLeftPanel({\n displayMode,\n onDisplayModeChange,\n onInsertSnippet,\n onClose,\n}: LatexLeftPanelProps) {\n return (\n <Shell title=\"Công thức LaTeX\" icon=\"∑\" onClose={onClose}>\n <Section label=\"Chế độ hiển thị\">\n <div className=\"grid grid-cols-2 gap-1.5\">\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(false)}\n aria-pressed={!displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n !displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Inline</span>\n <span className=\"block text-[10px] text-slate-500\">$ ... $</span>\n </button>\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(true)}\n aria-pressed={displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Block</span>\n <span className=\"block text-[10px] text-slate-500\">$$ ... $$</span>\n </button>\n </div>\n </Section>\n\n {SNIPPETS.map((group) => (\n <Section key={group.group} label={group.group}>\n <div className=\"flex flex-wrap gap-1\">\n {group.items.map((s) => (\n <button\n key={s.snippet}\n type=\"button\"\n onClick={() => onInsertSnippet(s.snippet)}\n title={s.snippet}\n className=\"rounded border border-slate-200 bg-white px-2 py-1 text-xs text-slate-700 transition hover:border-emerald-300 hover:bg-emerald-50 hover:text-emerald-700\"\n >\n {s.preview}\n </button>\n ))}\n </div>\n </Section>\n ))}\n\n <Section label=\"Phím tắt\">\n <div className=\"flex flex-wrap gap-2 text-[11px] text-slate-600\">\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Enter</kbd>\n chèn\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Esc</kbd>\n đóng\n </span>\n </div>\n </Section>\n </Shell>\n );\n}\n","let cachedCss: string | null = null;\n\n// Absolute origin để inlined CSS có thể load fonts khi SVG render trong\n// Excalidraw / image context (relative paths fail trong nested URL contexts).\nfunction absoluteOrigin(): string {\n if (typeof window !== 'undefined' && window.location) return window.location.origin;\n return '';\n}\n\nasync function loadKatexCss(): Promise<string> {\n if (cachedCss !== null) return cachedCss;\n try {\n if (typeof fetch === 'function') {\n const res = await fetch('/katex.min.css');\n if (res.ok) {\n let css = await res.text();\n // Rewrite relative font URLs → absolute origin URLs.\n // KaTeX CSS uses url(fonts/...) — relative to /katex.min.css → /fonts/...\n // Trong SVG <foreignObject> được render thành image, relative resolves\n // tới page URL (/room/...) thay vì root, gây 404.\n const origin = absoluteOrigin();\n if (origin) {\n css = css.replace(/url\\((['\"]?)(fonts\\/)/g, `url($1${origin}/$2`);\n }\n cachedCss = css;\n return css;\n }\n }\n } catch {\n /* ignore */\n }\n cachedCss = '';\n return '';\n}\n\nexport async function renderLatexToSvg(src: string, displayMode: boolean): Promise<string> {\n const katex = await import('katex');\n const html = katex.default.renderToString(src, { displayMode, throwOnError: true, output: 'html' });\n\n const measureDiv = document.createElement('div');\n measureDiv.style.cssText = 'position:absolute;top:-9999px;left:-9999px;visibility:hidden;display:inline-block;';\n measureDiv.innerHTML = html;\n document.body.appendChild(measureDiv);\n const rect = measureDiv.getBoundingClientRect();\n const width = Math.ceil(rect.width) || 50;\n const height = Math.ceil(rect.height) || 20;\n document.body.removeChild(measureDiv);\n\n const cssText = await loadKatexCss();\n\n return '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + width + '\" height=\"' + height + '\" viewBox=\"0 0 ' + width + ' ' + height + '\">' +\n '<foreignObject width=\"100%\" height=\"100%\">' +\n '<div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"font-size:16px;line-height:1.2;\">' +\n '<style>' + cssText + '</style>' +\n html +\n '</div>' +\n '</foreignObject>' +\n '</svg>';\n}\n","'use client';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { renderLatexToSvg } from './renderLatexToSvg';\n\ninterface Props {\n /**\n * Legacy: vị trí absolute x/y nếu cần (test). Khi cả 2 = 0 và `centered` !== false,\n * popover sẽ tự center floating ở giữa khu vực bảng. Khi `withLeftPanel` = true,\n * vị trí center được offset 120px để chừa chỗ panel trái.\n */\n x: number;\n y: number;\n initialValue: string;\n onInsert: (svgString: string, src: string, displayMode: boolean) => void;\n onClose: () => void;\n /** Khi controlled từ parent (StampLeftPanel), parent set giá trị này. */\n displayMode?: boolean;\n onDisplayModeChange?: (b: boolean) => void;\n /** Khi true, position center offset cho panel trái. */\n withLeftPanel?: boolean;\n}\n\nexport interface LatexEditorHandle {\n /** Chèn snippet vào vị trí con trỏ trong textbox. */\n insertAtCursor: (snippet: string) => void;\n /** Có content hợp lệ để chèn không (input không rỗng + preview ok). */\n hasContent: () => boolean;\n /** Trigger insert programmatically — return true nếu chèn thành công. */\n tryInsert: () => boolean;\n}\n\nconst DEBOUNCE_MS = 100;\n\nexport const LatexEditorPopover = forwardRef<LatexEditorHandle, Props>(function LatexEditorPopover(\n {\n x,\n y,\n initialValue,\n onInsert,\n onClose,\n displayMode: controlledDisplayMode,\n onDisplayModeChange,\n withLeftPanel = false,\n },\n ref,\n) {\n const [value, setValue] = useState(initialValue);\n const [internalDisplayMode] = useState(false);\n const displayMode = controlledDisplayMode ?? internalDisplayMode;\n // onDisplayModeChange chỉ dùng khi controlled từ parent — không cần local setter\n void onDisplayModeChange;\n\n const [previewSvg, setPreviewSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(async () => {\n try {\n const svg = await renderLatexToSvg(value, displayMode);\n setPreviewSvg(svg);\n setError(null);\n } catch (err) {\n setPreviewSvg(null);\n setError((err as Error).message);\n }\n }, DEBOUNCE_MS);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [value, displayMode]);\n\n const handleInsert = useCallback(() => {\n if (!previewSvg) return;\n onInsert(previewSvg, value, displayMode);\n }, [previewSvg, value, displayMode, onInsert]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleInsert();\n }\n },\n [onClose, handleInsert],\n );\n\n // Imperative API: snippet button trong panel trái gọi vào, click-outside auto-insert.\n useImperativeHandle(\n ref,\n () => ({\n insertAtCursor: (snippet: string) => {\n const el = inputRef.current;\n if (!el) {\n setValue((v) => v + snippet);\n return;\n }\n const start = el.selectionStart ?? value.length;\n const end = el.selectionEnd ?? value.length;\n const next = value.slice(0, start) + snippet + value.slice(end);\n setValue(next);\n requestAnimationFrame(() => {\n el.focus();\n const pos = start + snippet.length;\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n /* ignore */\n }\n });\n },\n hasContent: () => value.trim().length > 0 && !!previewSvg && !error,\n tryInsert: () => {\n if (!previewSvg || error || !value.trim()) return false;\n onInsert(previewSvg, value, displayMode);\n return true;\n },\n }),\n [value, previewSvg, error, displayMode, onInsert],\n );\n\n // Position: nếu x/y > 0 → dùng legacy absolute (cho tests cũ). Còn không thì center floating.\n const isLegacyPosition = x > 0 || y > 0;\n const wrapperStyle: React.CSSProperties = isLegacyPosition\n ? { position: 'absolute', top: y, left: x, zIndex: 50 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 50,\n };\n\n return (\n <div\n style={wrapperStyle}\n data-stamp-area=\"true\"\n className=\"w-[420px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5\"\n role=\"dialog\"\n aria-label=\"Nhập công thức LaTeX\"\n >\n <header className=\"flex items-center justify-between rounded-t-lg border-b border-slate-200 bg-gradient-to-r from-indigo-600 to-purple-600 px-3 py-2 text-white\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <span className=\"text-base leading-none\">∑</span>\n Công thức LaTeX\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 transition hover:bg-white/15\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"space-y-2 p-3\">\n <input\n ref={inputRef}\n type=\"text\"\n role=\"textbox\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Vd: \\frac{a^2+b^2}{c}\"\n className=\"w-full rounded border border-slate-300 px-2 py-1.5 font-mono text-sm outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-200\"\n autoFocus\n />\n <div\n className={[\n 'flex min-h-[64px] items-center justify-center rounded border p-3 text-center',\n error ? 'border-rose-300 bg-rose-50 text-rose-700' : 'border-slate-200 bg-slate-50',\n ].join(' ')}\n >\n {error ? (\n <span className=\"text-xs\">Lỗi: {error.slice(0, 80)}</span>\n ) : previewSvg ? (\n <span dangerouslySetInnerHTML={{ __html: previewSvg }} />\n ) : (\n <span className=\"text-xs text-slate-400\">(xem trước)</span>\n )}\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Enter để chèn\n </span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!previewSvg || !!error}\n className=\"rounded bg-indigo-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-indigo-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n});\n","// 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\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\nexport function deserializeIntoBoard(board: BoardLike, serialized: SerializedBoard): 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.\n const idMap = new Map<string, unknown>();\n for (const el of serialized.elements) {\n const resolvedArgs = el.args.map((a) => {\n if (typeof a === 'string' && idMap.has(a)) return idMap.get(a);\n return a;\n });\n const created = board.create(el.type, resolvedArgs, { ...el.attrs });\n idMap.set(el.id, created);\n }\n}\n","export function renderGeometryToSvg(boardContainer: HTMLElement): string {\n const svgEl = boardContainer.querySelector('svg');\n if (!svgEl) throw new Error('renderGeometryToSvg: no SVG found in board container');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n return new XMLSerializer().serializeToString(clone);\n}\n","'use client';\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { JSXGraphMiniBoard, type MiniBoardHandle, type GeomTool } from './JSXGraphMiniBoard';\nimport { serializeBoard, type SerializedBoard } from './serializeBoard';\nimport { renderGeometryToSvg } from './renderGeometryToSvg';\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}\n\nexport interface GeomBoardState {\n tool: GeomTool;\n showAxis: boolean;\n showGrid: boolean;\n canUndo: boolean;\n}\n\nexport interface GeometryEditorPanelHandle {\n setTool: (t: GeomTool) => void;\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n undo: () => void;\n /** Trigger Chèn programmatically (cho auto-insert khi click outside). */\n insert: () => boolean;\n /** Có nội dung để chèn không? */\n hasContent: () => boolean;\n}\n\nexport const GeometryEditorPanel = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanel({ initialState, onInsert, onClose, withLeftPanel = false, onStateChange }, ref) {\n const handleRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => { onStateChangeRef.current = onStateChange; }, [onStateChange]);\n\n const emitState = useCallback(() => {\n const h = handleRef.current;\n const cb = onStateChangeRef.current;\n if (!h || !cb) return;\n cb({\n tool: h.getTool(),\n showAxis: h.getShowAxis(),\n showGrid: h.getShowGrid(),\n canUndo: h.canUndo(),\n });\n }, []);\n\n const handleReady = useCallback((h: MiniBoardHandle) => {\n handleRef.current = h;\n setReady(true);\n emitState();\n // Subscribe để parent biết khi nào tool/axis/grid/undo thay đổi\n h.subscribe(emitState);\n }, [emitState]);\n\n const performInsert = useCallback((): boolean => {\n if (!handleRef.current) return false;\n const container = handleRef.current.getContainer();\n if (!container) return false;\n const log = handleRef.current.getCreationLog();\n if (log.length === 0) return false;\n try {\n const svgString = renderGeometryToSvg(container);\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 onInsert(JSON.stringify(serialized), svgString);\n return true;\n } catch (err) {\n console.error('Geometry insert failed:', err);\n return false;\n }\n }, [onInsert]);\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n useImperativeHandle(ref, () => ({\n setTool: (t) => handleRef.current?.setTool(t),\n setShowAxis: (b) => handleRef.current?.setShowAxis(b),\n setShowGrid: (b) => handleRef.current?.setShowGrid(b),\n undo: () => handleRef.current?.undo(),\n insert: performInsert,\n hasContent: () => (handleRef.current?.getCreationLog().length ?? 0) > 0,\n }), [performInsert]);\n\n const wrapperStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học\"\n data-testid=\"geometry-editor-panel\"\n data-stamp-area=\"true\"\n style={wrapperStyle}\n className=\"flex h-[540px] max-h-[85vh] w-[640px] max-w-[calc(100vw-280px)] flex-col overflow-hidden rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5\"\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"3,18 12,3 21,18\" />\n <circle cx=\"12\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"21\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n Dựng hình học\n </h3>\n <button onClick={onClose} aria-label=\"Đóng\" className=\"rounded p-1 transition hover:bg-white/15\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1\" style={{ height: '420px' }}>\n <JSXGraphMiniBoard\n onReady={handleReady}\n initialState={initialState}\n />\n </div>\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geometry-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n </div>\n );\n },\n);\n","import { useEffect } from 'react';\n\ninterface Options {\n onGeometry: () => void;\n onLatex: () => void;\n enabled: boolean;\n}\n\nfunction isEditableTarget(t: EventTarget | null): boolean {\n if (!t || !(t instanceof HTMLElement)) return false;\n if (t.isContentEditable) return true;\n const tag = t.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n}\n\nexport function useStampShortcuts({ onGeometry, onLatex, enabled }: Options): void {\n useEffect(() => {\n if (!enabled) return;\n const handler = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isEditableTarget(e.target)) return;\n const key = e.key.toLowerCase();\n if (key !== 'g' && key !== 'l') return;\n // Capture phase + stopPropagation: Excalidraw's L shortcut (Line tool) và\n // các phím tắt khác đăng ký ở bubble phase. Phải chặn trước khi event tới\n // được handler của Excalidraw, không thì user bấm L lại bị Excalidraw chuyển\n // sang Line tool thay vì toggle LaTeX panel.\n e.preventDefault();\n e.stopPropagation();\n if (key === 'g') onGeometry();\n else onLatex();\n };\n window.addEventListener('keydown', handler, { capture: true });\n return () => window.removeEventListener('keydown', handler, { capture: true });\n }, [enabled, onGeometry, onLatex]);\n}\n","export type MathStampCustomData =\n | {\n kind: 'geometry';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n }\n | {\n kind: 'latex';\n version: 1;\n src: string;\n displayMode: boolean;\n };\n\nexport function isMathStamp<T extends { customData?: unknown }>(\n element: T,\n): element is T & { customData: MathStampCustomData } {\n const c = element.customData as { kind?: unknown; version?: unknown } | undefined;\n if (!c) return false;\n if (c.version !== 1) return false;\n return c.kind === 'geometry' || c.kind === 'latex';\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","// Regenerate Excalidraw BinaryFiles for math-stamp elements after page reload.\n//\n// Why this exists: VideoRoom only persists the Excalidraw scene (elements +\n// appState) to sessionStorage; binary files (the SVG dataURLs for our LaTeX /\n// geometry stamps) are NOT persisted. After reload, elements still reference a\n// fileId via customData, but the file payload is missing — Excalidraw renders\n// the image area as an empty placeholder.\n//\n// We deterministically reproduce each stamp's SVG from its customData\n// (LaTeX source / geometry creation log), then call api.addFiles using the\n// element's existing fileId. The dataURL contents may differ slightly from\n// the original (e.g. element ordering), but that's fine — Excalidraw keys on\n// the fileId we provide, not on dataURL hash.\n\nimport { renderLatexToSvg } from './renderLatexToSvg';\nimport { renderGeometryToSvg } from './renderGeometryToSvg';\nimport { deserializeIntoBoard, type SerializedBoard } from './serializeBoard';\nimport { isMathStamp, type MathStampCustomData } from './types';\n\ninterface ElementLike {\n id: string;\n type: string;\n fileId?: string | null;\n customData?: unknown;\n}\n\ninterface AddFileRecord {\n id: string;\n dataURL: string;\n mimeType: 'image/svg+xml';\n created: number;\n}\n\nfunction svgToDataURL(svg: string): string {\n const utf8 = unescape(encodeURIComponent(svg));\n return 'data:image/svg+xml;base64,' + btoa(utf8);\n}\n\nasync function renderGeometrySvgFromState(jsonState: string): Promise<string> {\n const parsed = JSON.parse(jsonState) as SerializedBoard;\n const JXG = (await import('jsxgraph')).default;\n // Labels render as SVG <text> để được capture trong clone SVG (xem note ở\n // JSXGraphMiniBoard cho lý do)\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n }\n } catch { /* ignore */ }\n const container = document.createElement('div');\n const containerId = 'jxg_offscreen_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\n container.id = containerId;\n // Place off-screen but with real dimensions so JSXGraph renders correctly.\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);\n // Allow render flush\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (board as any).update();\n return renderGeometryToSvg(container);\n } finally {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (board) (JXG as any).JSXGraph.freeBoard(board);\n } catch { /* ignore */ }\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n\nasync function buildFileForStamp(\n fileId: string,\n customData: MathStampCustomData,\n): Promise<AddFileRecord | null> {\n try {\n let svg: string;\n if (customData.kind === 'latex') {\n svg = await renderLatexToSvg(customData.src, customData.displayMode);\n } else if (customData.kind === 'geometry') {\n svg = await renderGeometrySvgFromState(customData.jsonState);\n } else {\n return null;\n }\n return { id: fileId, dataURL: svgToDataURL(svg), mimeType: 'image/svg+xml', created: Date.now() };\n } catch (err) {\n console.warn('Math-stamp restore failed for', fileId, err);\n return null;\n }\n}\n\n/**\n * Find math-stamp elements whose binary file is missing from Excalidraw, then\n * regenerate and add it. Idempotent: safe to call on every scene update.\n */\nexport async function restoreMissingMathStampFiles(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api: any,\n elements: readonly ElementLike[],\n): Promise<void> {\n if (!api) return;\n const existing = (typeof api.getFiles === 'function') ? api.getFiles() : {};\n const targets: Array<{ fileId: string; customData: MathStampCustomData }> = [];\n const seen = new Set<string>();\n for (const el of elements) {\n if (el.type !== 'image') continue;\n if (!el.fileId) continue;\n if (existing && existing[el.fileId]) continue;\n if (seen.has(el.fileId)) continue;\n if (!isMathStamp(el as { customData?: unknown })) continue;\n seen.add(el.fileId);\n targets.push({ fileId: el.fileId, customData: (el as { customData: MathStampCustomData }).customData });\n }\n if (targets.length === 0) return;\n const built = await Promise.all(targets.map(t => buildFileForStamp(t.fileId, t.customData)));\n const files = built.filter((f): f is AddFileRecord => !!f);\n if (files.length > 0) {\n try { api.addFiles(files); } catch (err) { console.warn('addFiles failed:', err); }\n }\n}\n","'use client';\n\nimport dynamic from 'next/dynamic';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type {\n ExcalidrawElement,\n BinaryFiles,\n ExcalidrawSceneSnapshot,\n SyncableAppState,\n} from './types';\nimport { pickSyncableAppState } from './serialize';\nimport {\n ToolbarStampInjector,\n GeometryLeftPanel,\n LatexLeftPanel,\n LatexEditorPopover,\n GeometryEditorPanel,\n useStampShortcuts,\n isMathStamp,\n svgToImageElement,\n restoreMissingMathStampFiles,\n type SerializedBoard,\n type LatexEditorHandle,\n type GeometryEditorPanelHandle,\n type GeomBoardState,\n} from './stamp';\nimport type { GeomTool } from './stamp/JSXGraphMiniBoard';\nimport '@excalidraw/excalidraw/index.css';\nimport './stamp/stamp.css';\n\nconst Excalidraw = dynamic(\n async () => (await import('./ExcalidrawWithMenus')).ExcalidrawWithMenus,\n {\n ssr: false,\n loading: () => (\n <div className=\"flex h-full items-center justify-center text-sm text-gray-500\">\n Đang tải bảng…\n </div>\n ),\n },\n);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nconst SYNC_THROTTLE_MS = 200;\nconst DOUBLE_CLICK_MS = 400;\n\nexport interface ExcalidrawWhiteboardViewProps {\n role: 'teacher' | 'student';\n roomId: string;\n initialScene: ExcalidrawSceneSnapshot | null;\n remoteScene: ExcalidrawSceneSnapshot | null;\n remoteFiles?: BinaryFiles | null;\n onSceneChange: (snapshot: ExcalidrawSceneSnapshot) => void;\n onFilesChange: (files: BinaryFiles, newFileIds: string[]) => void;\n /** Excalidraw UI language. Defaults to 'vi-VN'. See @excalidraw/excalidraw locales. */\n langCode?: string;\n}\n\nconst INITIAL_GEOM_STATE: GeomBoardState = {\n tool: 'move',\n showAxis: false,\n showGrid: false,\n canUndo: false,\n};\n\nexport function ExcalidrawWhiteboardView({\n role,\n initialScene,\n remoteScene,\n remoteFiles,\n onSceneChange,\n onFilesChange,\n langCode = 'vi-VN',\n}: ExcalidrawWhiteboardViewProps) {\n const [api, setApi] = useState<ExApi | null>(null);\n const [isDarkTheme, setIsDarkTheme] = useState(false);\n const knownFileIdsRef = useRef<Set<string>>(new Set());\n const lastElementsHashRef = useRef<string>('');\n const throttleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [activeStamp, setActiveStamp] = useState<'geometry' | 'latex' | null>(null);\n const activeStampRef = useRef(activeStamp);\n activeStampRef.current = activeStamp;\n\n // Geometry-specific state\n const [geometryEditing, setGeometryEditing] = useState<{\n editingElementId: string | null;\n initialState: SerializedBoard | null;\n }>({ editingElementId: null, initialState: null });\n const [geomState, setGeomState] = useState<GeomBoardState>(INITIAL_GEOM_STATE);\n const geomPanelRef = useRef<GeometryEditorPanelHandle | null>(null);\n\n // LaTeX-specific state\n const [latexEditing, setLatexEditing] = useState<{\n editingElementId: string | null;\n initialValue: string;\n x: number;\n y: number;\n }>({ editingElementId: null, initialValue: '', x: 0, y: 0 });\n const [latexDisplayMode, setLatexDisplayMode] = useState(false);\n const latexEditorRef = useRef<LatexEditorHandle | null>(null);\n const latexInsertableRef = useRef<{ insert: () => boolean; hasContent: () => boolean }>({\n insert: () => false,\n hasContent: () => false,\n });\n\n const lastClickRef = useRef<{ time: number; elementId: string | null }>({\n time: 0,\n elementId: null,\n });\n\n // Mỗi lần intercept crop xong, lưu id để skip không lặp lại\n const handledCropIdRef = useRef<string | null>(null);\n\n // Lưu lại tool Excalidraw đang active TRƯỚC khi mở G/L để restore sau khi đóng.\n const prevExcalidrawToolRef = useRef<string>('selection');\n\n const isTeacher = role === 'teacher';\n\n // ---- Open / close helpers ----\n const openGeometry = useCallback(() => {\n if (!isTeacher) return;\n setGeometryEditing({ editingElementId: null, initialState: null });\n setGeomState(INITIAL_GEOM_STATE);\n setActiveStamp('geometry');\n }, [isTeacher]);\n\n const openLatex = useCallback(() => {\n if (!isTeacher) return;\n setLatexEditing({ editingElementId: null, initialValue: '', x: 0, y: 0 });\n setActiveStamp('latex');\n }, [isTeacher]);\n\n const closeStamp = useCallback(() => {\n setActiveStamp(null);\n setGeometryEditing({ editingElementId: null, initialState: null });\n setLatexEditing({ editingElementId: null, initialValue: '', x: 0, y: 0 });\n }, []);\n\n const toggleGeometry = useCallback(() => {\n if (activeStamp === 'geometry') closeStamp();\n else openGeometry();\n }, [activeStamp, closeStamp, openGeometry]);\n\n const toggleLatex = useCallback(() => {\n if (activeStamp === 'latex') closeStamp();\n else openLatex();\n }, [activeStamp, closeStamp, openLatex]);\n\n // ---- Teacher path: capture local changes ----\n const handleChange = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (elements: readonly ExcalidrawElement[], appState: any, files: BinaryFiles) => {\n // Sync theme từ Excalidraw appState → React state (cho cả teacher/student).\n const nextDark = appState?.theme === 'dark';\n setIsDarkTheme((prev) => (prev === nextDark ? prev : nextDark));\n\n if (!isTeacher) return;\n\n // Intercept Excalidraw crop-image flow cho math stamps: khi user double-click\n // 1 stamp, Excalidraw set appState.croppingElementId. Ta dismiss crop mode +\n // mở editor của chính ta. handlePointerDown cũng phát hiện double-click sớm\n // hơn — đây là fallback (đặc biệt khi click rơi vào selection handle khiến\n // pointerDownState.hit.element = null).\n const cropId = appState?.croppingElementId as string | null | undefined;\n if (cropId && cropId !== handledCropIdRef.current && api) {\n const el = elements.find((e: ExcalidrawElement) => e.id === cropId);\n if (el && isMathStamp(el)) {\n handledCropIdRef.current = cropId;\n api.updateScene({\n appState: { ...appState, croppingElementId: null, selectedElementIds: {} },\n });\n if (el.customData.kind === 'geometry') {\n try {\n const parsed = JSON.parse(el.customData.jsonState) as SerializedBoard;\n setGeometryEditing({ editingElementId: el.id, initialState: parsed });\n setActiveStamp('geometry');\n } catch {\n console.warn('customData jsonState corrupted; skipping reopen');\n }\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const elAny = el as any;\n setLatexEditing({\n editingElementId: el.id,\n initialValue: el.customData.src,\n x: elAny.x ?? 0,\n y: elAny.y ?? 0,\n });\n setLatexDisplayMode(!!el.customData.displayMode);\n setActiveStamp('latex');\n }\n return;\n }\n }\n if (!cropId) {\n handledCropIdRef.current = null;\n }\n\n const fileIds = Object.keys(files);\n const newIds = fileIds.filter((id) => !knownFileIdsRef.current.has(id));\n if (newIds.length > 0) {\n newIds.forEach((id) => knownFileIdsRef.current.add(id));\n onFilesChange(files, newIds);\n }\n\n if (throttleTimerRef.current) return;\n throttleTimerRef.current = setTimeout(async () => {\n throttleTimerRef.current = null;\n const mod = await import('@excalidraw/excalidraw');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hash = (mod as any).hashElementsVersion(elements);\n if (hash === lastElementsHashRef.current) return;\n lastElementsHashRef.current = hash;\n onSceneChange({\n elements: elements.filter((e) => !e.isDeleted) as readonly ExcalidrawElement[],\n appState: pickSyncableAppState(appState),\n });\n }, SYNC_THROTTLE_MS);\n },\n [isTeacher, api, onSceneChange, onFilesChange],\n );\n\n // ---- Student path: apply remote scene ----\n useEffect(() => {\n if (isTeacher || !api || !remoteScene) return;\n api.updateScene({\n elements: remoteScene.elements,\n appState: remoteScene.appState as Partial<SyncableAppState>,\n });\n }, [isTeacher, api, remoteScene]);\n\n useEffect(() => {\n if (isTeacher || !api || !remoteFiles) return;\n const entries = Object.entries(remoteFiles);\n if (entries.length === 0) return;\n api.addFiles(\n entries.map(([id, f]) => ({\n id,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dataURL: (f as any).dataURL,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mimeType: (f as any).mimeType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n created: (f as any).created ?? Date.now(),\n })),\n );\n }, [isTeacher, api, remoteFiles]);\n\n useEffect(() => {\n if (!api) return;\n let cancelled = false;\n const run = async () => {\n try {\n const elements = api.getSceneElements();\n if (!elements || elements.length === 0) return;\n if (cancelled) return;\n await restoreMissingMathStampFiles(api, elements);\n } catch (err) {\n console.warn('Math stamp restore pass failed:', err);\n }\n };\n run();\n const t = setTimeout(run, 400);\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [api, initialScene, remoteScene]);\n\n useEffect(\n () => () => {\n if (throttleTimerRef.current) clearTimeout(throttleTimerRef.current);\n },\n [],\n );\n\n // ---- Helpers ----\n const buildStampImageElement = useCallback(\n (fileId: string, width: number, height: number, customData: unknown, x?: number, y?: number) => {\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 [api],\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\n const clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n });\n\n // ---- Stamp insert handlers ----\n const handleGeometryInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n const { dataURL, fileId, width, height, mimeType } = await svgToImageElement(svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n\n const customData = {\n kind: 'geometry' as const,\n version: 1 as const,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n };\n\n const elements = api.getSceneElements();\n const editingId = geometryEditing.editingElementId;\n if (editingId) {\n const updated = elements.map((e: ExcalidrawElement) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n } else {\n const newElement = buildStampImageElement(fileId, width, height, customData);\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n }\n } catch (err) {\n console.error('Geometry stamp insert failed:', err);\n }\n closeStamp();\n },\n [api, geometryEditing.editingElementId, buildStampImageElement, closeStamp],\n );\n\n const handleLatexInsert = useCallback(\n async (svgString: string, src: string, displayMode: boolean) => {\n if (!api) return;\n try {\n const { dataURL, fileId, width, height, mimeType } = await svgToImageElement(svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n\n const customData = {\n kind: 'latex' as const,\n version: 1 as const,\n src,\n displayMode,\n };\n\n const elements = api.getSceneElements();\n const editingId = latexEditing.editingElementId;\n if (editingId) {\n const updated = elements.map((e: ExcalidrawElement) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n } else {\n const newElement = buildStampImageElement(\n fileId,\n width,\n height,\n customData,\n latexEditing.x || undefined,\n latexEditing.y || undefined,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n }\n } catch (err) {\n console.error('LaTeX stamp insert failed:', err);\n }\n closeStamp();\n },\n [api, latexEditing.editingElementId, latexEditing.x, latexEditing.y, buildStampImageElement, closeStamp],\n );\n\n // ---- Double-click detection for re-edit ----\n const handlePointerDown = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_activeTool: any, pointerDownState: any) => {\n if (!isTeacher) return;\n const hitElement = pointerDownState?.hit?.element;\n if (!hitElement || hitElement.type !== 'image') return;\n if (!isMathStamp(hitElement)) return;\n const now = Date.now();\n const isDouble =\n lastClickRef.current.elementId === hitElement.id &&\n now - lastClickRef.current.time < DOUBLE_CLICK_MS;\n lastClickRef.current = { time: now, elementId: hitElement.id };\n if (!isDouble) return;\n if (hitElement.customData.kind === 'geometry') {\n try {\n const parsed = JSON.parse(hitElement.customData.jsonState) as SerializedBoard;\n setGeometryEditing({ editingElementId: hitElement.id, initialState: parsed });\n setActiveStamp('geometry');\n } catch {\n console.warn('customData jsonState corrupted; skipping reopen');\n }\n } else {\n setLatexEditing({\n editingElementId: hitElement.id,\n initialValue: hitElement.customData.src,\n x: hitElement.x ?? 0,\n y: hitElement.y ?? 0,\n });\n setLatexDisplayMode(!!hitElement.customData.displayMode);\n setActiveStamp('latex');\n }\n },\n [isTeacher],\n );\n\n // ---- Keyboard shortcuts: G / L để toggle ----\n useStampShortcuts({\n enabled: isTeacher,\n onGeometry: toggleGeometry,\n onLatex: toggleLatex,\n });\n\n // ---- Sync Excalidraw activeTool với activeStamp ----\n // Khi G/L mở, deselect tool Excalidraw (1-9) bằng cách set sang 'hand' (không\n // vẽ). Khi đóng, restore tool trước đó để user không bị mất context.\n useEffect(() => {\n if (!api) return;\n if (activeStamp) {\n try {\n const cur = api.getAppState?.()?.activeTool?.type ?? 'selection';\n if (cur && cur !== 'hand') prevExcalidrawToolRef.current = cur;\n api.setActiveTool?.({ type: 'hand' });\n } catch { /* ignore */ }\n } else {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api.setActiveTool?.({ type: prevExcalidrawToolRef.current as any });\n } catch { /* ignore */ }\n }\n }, [activeStamp, api]);\n\n // ---- Block tất cả Excalidraw shortcuts khi G/L active ----\n // Capture-phase keydown: chặn mọi phím (trừ trong editable input) để các\n // shortcut 1-9, V, R, D, O, A, L, P, T, E, H... của Excalidraw không trigger\n // tool change đằng sau editor.\n useEffect(() => {\n if (!activeStamp) return;\n const ALLOWED_KEYS = new Set([\n 'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Shift', 'Control', 'Alt', 'Meta', 'CapsLock',\n 'Home', 'End', 'PageUp', 'PageDown',\n ]);\n\n const isEditable = (el: EventTarget | null): boolean => {\n if (!(el instanceof HTMLElement)) return false;\n if (el.isContentEditable) return true;\n const tag = el.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n };\n\n const blocker = (e: KeyboardEvent) => {\n if (isEditable(e.target)) return;\n // Cho phép Ctrl/Cmd + chữ cái (undo, copy/paste...)\n if (e.ctrlKey || e.metaKey) return;\n if (ALLOWED_KEYS.has(e.key)) return;\n // Esc xử lý ở handler riêng — không block để handler bên dưới chạy\n if (e.key === 'Escape') return;\n // G / L: useStampShortcuts đã có handler riêng để toggle — vẫn cho qua\n // (useStampShortcuts đăng ký ở capture phase qua window listener)\n const k = e.key.toLowerCase();\n if (k === 'g' || k === 'l') return;\n e.preventDefault();\n e.stopPropagation();\n };\n window.addEventListener('keydown', blocker, { capture: true });\n return () => window.removeEventListener('keydown', blocker, { capture: true });\n }, [activeStamp]);\n\n // ---- Esc đóng panel (capture phase để chạy TRƯỚC Excalidraw) ----\n useEffect(() => {\n if (!activeStamp) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n const ae = document.activeElement as HTMLElement | null;\n // Trong input → để input handle Esc nhưng vẫn close stamp\n // (Excalidraw có Esc handler riêng có thể swallow → bắt ở capture)\n if (\n ae &&\n (ae.tagName === 'TEXTAREA' || ae.isContentEditable)\n ) {\n return;\n }\n // INPUT trong LaTeX editor: vẫn cho phép close\n e.preventDefault();\n e.stopPropagation();\n closeStamp();\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [activeStamp, closeStamp]);\n\n // ---- Click ra ngoài (auto-insert hoặc đóng) ----\n // Khi user click ngoài editor / panel trái / nút G-L trên toolbar:\n // - Geometry: nếu có ít nhất 1 phép dựng → tự chèn; không có → chỉ đóng.\n // - LaTeX: nếu input không rỗng và preview hợp lệ → tự chèn; không có → chỉ đóng.\n useEffect(() => {\n if (!activeStamp) return;\n let lastFireTime = 0;\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n if (target.closest('[data-stamp-area=\"true\"]')) return;\n // Dedup: pointerdown + mousedown bắn cùng 1 lúc → chỉ xử lý lần đầu.\n const now = Date.now();\n if (now - lastFireTime < 50) return;\n lastFireTime = now;\n const stampType = activeStampRef.current;\n if (stampType === 'geometry') {\n geomPanelRef.current?.insert();\n } else if (stampType === 'latex') {\n latexInsertableRef.current.insert();\n }\n closeStamp();\n };\n // Listen ở window capture phase — sớm hơn cả document, đảm bảo chạy trước\n // Excalidraw's internal handlers. Cũng listen pointerdown thay vì mousedown\n // vì Excalidraw có thể call stopPropagation trên mousedown trên canvas.\n window.addEventListener('pointerdown', handler, { capture: true });\n window.addEventListener('mousedown', handler, { capture: true });\n return () => {\n window.removeEventListener('pointerdown', handler, { capture: true });\n window.removeEventListener('mousedown', handler, { capture: true });\n };\n }, [activeStamp, closeStamp]);\n\n return (\n <div className={`relative h-full w-full${isDarkTheme ? ' theme--dark' : ''}`}>\n <Excalidraw\n excalidrawAPI={(a: ExApi) => setApi(a)}\n langCode={langCode}\n viewModeEnabled={!isTeacher}\n initialData={\n initialScene\n ? {\n elements: initialScene.elements,\n appState: {\n ...initialScene.appState,\n gridSize: initialScene.appState.gridSize ?? undefined,\n },\n }\n : { appState: { viewBackgroundColor: '#ffffff' } }\n }\n onChange={handleChange}\n onPointerDown={handlePointerDown}\n />\n\n <ToolbarStampInjector\n enabled={isTeacher}\n activeStamp={activeStamp}\n onToggleGeometry={toggleGeometry}\n onToggleLatex={toggleLatex}\n />\n\n {activeStamp === 'geometry' && (\n <>\n <GeometryLeftPanel\n activeTool={geomState.tool}\n onToolChange={(t: GeomTool) => geomPanelRef.current?.setTool(t)}\n showAxis={geomState.showAxis}\n showGrid={geomState.showGrid}\n onShowAxisChange={(b) => geomPanelRef.current?.setShowAxis(b)}\n onShowGridChange={(b) => geomPanelRef.current?.setShowGrid(b)}\n onUndo={() => geomPanelRef.current?.undo()}\n canUndo={geomState.canUndo}\n onClose={closeStamp}\n />\n <GeometryEditorPanel\n ref={geomPanelRef}\n initialState={geometryEditing.initialState}\n onInsert={handleGeometryInsert}\n onClose={closeStamp}\n onStateChange={setGeomState}\n withLeftPanel\n />\n </>\n )}\n\n {activeStamp === 'latex' && (\n <>\n <LatexLeftPanel\n displayMode={latexDisplayMode}\n onDisplayModeChange={setLatexDisplayMode}\n onInsertSnippet={(s) => latexEditorRef.current?.insertAtCursor(s)}\n onClose={closeStamp}\n />\n <LatexEditorPopover\n ref={(node) => {\n latexEditorRef.current = node;\n // Cập nhật insertable interface để click-outside có thể trigger insert\n if (node) {\n latexInsertableRef.current = {\n insert: () => node.tryInsert(),\n hasContent: () => node.hasContent(),\n };\n }\n }}\n x={0}\n y={0}\n initialValue={latexEditing.initialValue}\n displayMode={latexDisplayMode}\n onDisplayModeChange={setLatexDisplayMode}\n onInsert={handleLatexInsert}\n onClose={closeStamp}\n withLeftPanel\n />\n </>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/ExcalidrawWithMenus.tsx","../src/serialize.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-2d/editor/handlers.ts","../src/stamps/geometry-2d/editor/MiniBoard.tsx","../src/stamps/geometry-2d/editor/LeftPanel.tsx","../src/stamps/geometry-2d/serialize.ts","../src/stamps/geometry-2d/renderInline.ts","../src/stamps/geometry-2d/render.ts","../src/stamps/shared/excalidrawPalette.ts","../src/stamps/geometry-2d/editor/PropertiesPopover.tsx","../src/stamps/geometry-2d/editor/TransformParamPopover.tsx","../src/stamps/geometry-2d/editor/EditorPanel.tsx","../src/stamps/shared/svgToImage.ts","../src/stamps/shared/insertImage.ts","../src/stamps/geometry-2d/index.tsx","../src/stamps/latex/editor/LeftPanel.tsx","../src/stamps/latex/render.ts","../src/stamps/latex/editor/EditorPopover.tsx","../src/stamps/latex/index.tsx","../src/stamps/geometry-3d/editor/theme.ts","../src/stamps/geometry-3d/editor/handlers.ts","../src/stamps/geometry-3d/editor/MiniBoard3D.tsx","../src/stamps/geometry-3d/editor/tools.ts","../src/stamps/geometry-3d/editor/toolButtons.tsx","../src/stamps/geometry-3d/editor/LeftPanel.tsx","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/stamps/geometry-3d/serialize.ts","../src/stamps/geometry-3d/render.ts","../src/stamps/geometry-3d/index.tsx","../src/stamps/shared/registry.ts","../src/stamps/shared/ToolbarInjector.tsx","../src/stamps/shared/useShortcuts.ts","../src/stamps/shared/restoreStampFiles.ts","../src/core/persistence/sceneStore.ts","../src/core/persistence/fileStore.ts","../src/Whiteboard.tsx"],"names":["jsxs","Excalidraw","MainMenu","jsx","Footer","WelcomeScreen","hits","name","pick","sc","JXG","useRef","useId","useState","useCallback","useEffect","obj","stroke","Fragment","createPortal","useMemo","forwardRef","GeometryEditorPanel","useImperativeHandle","GeometryStampHost","Shell","Section","LeftPanel","EditorPopover","LatexStampHost","paletteFor","radius","center","MiniBoard3D","p","TOOLTIP_DELAY_MS","EditorPanel","Geometry3DStampHost","dynamic"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\n// Client-only wrapper around Excalidraw that lets us reach for static helpers\n// like `MainMenu.DefaultItems.*`. Whiteboard dynamic-imports this\n// file so SSR never evaluates @excalidraw/excalidraw, while inside this file we\n// can use plain static imports (the entire module loads on the client).\n\nimport React from 'react';\nimport {\n Excalidraw,\n MainMenu,\n Footer,\n WelcomeScreen,\n} from '@excalidraw/excalidraw';\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExcalidrawProps = any;\n\nexport function ExcalidrawWithMenus(props: ExcalidrawProps) {\n const { children, ...rest } = props;\n return (\n <Excalidraw {...rest}>\n {/* Replace default menu with curated items — no socials/help/branding */}\n <MainMenu>\n <MainMenu.DefaultItems.LoadScene />\n <MainMenu.DefaultItems.SaveAsImage />\n <MainMenu.DefaultItems.ClearCanvas />\n <MainMenu.DefaultItems.ToggleTheme />\n </MainMenu>\n {/* Footer slot with no content suppresses default \"Made with Excalidraw\" link */}\n <Footer>\n <span />\n </Footer>\n {/* WelcomeScreen slot (empty) prevents the default Excalidraw welcome panel\n * (which includes the Excalidraw logo and social links) from appearing. */}\n <WelcomeScreen>\n <span />\n </WelcomeScreen>\n {children}\n </Excalidraw>\n );\n}\n","import type { AppState } from '@excalidraw/excalidraw/types';\nimport type { SyncableAppState } from './types';\n\nexport function pickSyncableAppState(s: AppState): SyncableAppState {\n return {\n viewBackgroundColor: s.viewBackgroundColor,\n zoom: s.zoom,\n scrollX: s.scrollX,\n scrollY: s.scrollY,\n gridSize: s.gridSize ?? null,\n theme: s.theme,\n };\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type JxgObj = any;\n\nexport type DefKind = 'point' | 'segment' | 'line' | 'ray' | 'arrow' | 'circleCenter' | 'circle3';\n\nexport interface DefiningPointsResult {\n kind: DefKind;\n points: JxgObj[];\n attrs: Record<string, unknown>;\n}\n\nconst LINE_LIKE = new Set(['line', 'segment', 'arrow']);\n\nfunction copyVisAttrs(obj: JxgObj): Record<string, unknown> {\n const v = obj?.visProp ?? {};\n const pick = (k: string) => v?.[k];\n const out: Record<string, unknown> = {};\n const mapping: Array<[string, string]> = [\n ['strokecolor', 'strokeColor'],\n ['strokewidth', 'strokeWidth'],\n ['strokeopacity', 'strokeOpacity'],\n ['dash', 'dash'],\n ['fillcolor', 'fillColor'],\n ['fillopacity', 'fillOpacity'],\n ];\n for (const [from, to] of mapping) {\n const val = pick(from);\n if (val !== undefined) out[to] = val;\n }\n return out;\n}\n\nexport function getDefiningPoints(obj: JxgObj): DefiningPointsResult | null {\n if (!obj) return null;\n const e = (obj.elType ?? obj.type ?? '').toString().toLowerCase();\n if (e === 'point' || e === 'glider' || e === 'midpoint') {\n return { kind: 'point', points: [obj], attrs: copyVisAttrs(obj) };\n }\n if (LINE_LIKE.has(e) && obj.point1 && obj.point2) {\n const kind: DefKind = e === 'segment' ? 'segment' : e === 'arrow' ? 'arrow' : 'line';\n return { kind, points: [obj.point1, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circle' && obj.center && obj.point2) {\n return { kind: 'circleCenter', points: [obj.center, obj.point2], attrs: copyVisAttrs(obj) };\n }\n if (e === 'circumcircle' && obj.point1 && obj.point2 && obj.point3) {\n return {\n kind: 'circle3',\n points: [obj.point1, obj.point2, obj.point3],\n attrs: copyVisAttrs(obj),\n };\n }\n return null;\n}\n\nexport type TransformInput =\n | { kind: 'translate'; vectorPoints: [JxgObj, JxgObj] }\n | { kind: 'rotate'; center: JxgObj; angleDeg: number }\n | { kind: 'reflectLine'; line: JxgObj }\n | { kind: 'reflectPoint'; center: JxgObj }\n | { kind: 'dilate'; center: JxgObj; k: number };\n\nexport interface TransformSpec {\n params: unknown[];\n attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' };\n /**\n * Khi `chain` được set, finalizeTransformCreate dựng từng transform trong chain\n * (theo thứ tự) rồi pass mảng vào `board.create('point', [src, [t1, t2, t3]])`.\n * Dùng cho `dilate` (scale-quanh-điểm) vì JSXGraph 'scale' không nhận center.\n */\n chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }>;\n}\n\nexport function buildTransformSpec(input: TransformInput): TransformSpec {\n switch (input.kind) {\n case 'translate': {\n // Literal dx/dy (không phải callback) để serialize qua JSON.stringify được.\n // Trade-off: transformed object không cập nhật khi user kéo điểm vector — chấp nhận.\n const [a, b] = input.vectorPoints;\n const dx = b.X() - a.X();\n const dy = b.Y() - a.Y();\n return { params: [dx, dy], attrs: { type: 'translate' } };\n }\n case 'rotate':\n return {\n params: [(input.angleDeg * Math.PI) / 180, input.center],\n attrs: { type: 'rotate' },\n };\n case 'reflectLine':\n return { params: [input.line], attrs: { type: 'reflect' } };\n case 'reflectPoint':\n // JSXGraph 'scale' chỉ nhận 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 bị lờ → trước đây sai. Đối xứng qua điểm = quay 180°\n // quanh điểm đó. Dùng 'rotate' (params [angle, center]) để chuẩn.\n return { params: [Math.PI, input.center], attrs: { type: 'rotate' } };\n case 'dilate':\n // JSXGraph 'scale' chỉ nhận đúng 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 làm constructor throw. Dilate quanh điểm c bằng tỷ số k\n // = compose 3 phép: T(-c) → S(k,k) → T(+c). Sinh ra chain (mảng spec) thay vì\n // 1 spec đơn; consumer (finalizeTransformCreate) tự nhận biết.\n return {\n params: [],\n attrs: { type: 'scale' },\n chain: [\n { params: [-input.center.X(), -input.center.Y()], attrs: { type: 'translate' as const } },\n { params: [input.k, input.k], attrs: { type: 'scale' as const } },\n { params: [input.center.X(), input.center.Y()], attrs: { type: 'translate' as const } },\n ],\n };\n }\n}\n","import React from 'react';\n\n/**\n * Static catalog của tất cả GeomTool — không phụ thuộc board state, chỉ là\n * metadata (key, label, hint, icon SVG, group, số click cần, accept types).\n *\n * Tách khỏi JSXGraphMiniBoard.tsx để (1) giảm size file component và (2) dễ\n * mở rộng tool mới mà không cần đụng vào board logic.\n */\n\n// Tool keys — match GeoGebra-style toolset\nexport type GeomTool =\n | 'move'\n | 'select'\n | 'point'\n | 'midpoint'\n | 'segment'\n | 'line'\n | 'ray'\n | 'vector'\n | 'perpendicular'\n | 'parallel'\n | 'perpBisector'\n | 'angleBisector'\n | 'polygon'\n | 'regularPolygon'\n | 'circleCenter'\n | 'circle3'\n | 'tangent'\n | 'angle'\n | 'distance'\n | 'area'\n | 'toggleLabel'\n | 'toggleVisible'\n | 'delete'\n | 'translate'\n | 'rotate'\n | 'reflectLine'\n | 'reflectPoint'\n | 'dilate';\n\nexport interface ToolDef {\n key: GeomTool;\n label: string;\n hint: string;\n icon: React.ReactNode;\n group:\n | 'move'\n | 'point'\n | 'line'\n | 'construct'\n | 'polygon'\n | 'circle'\n | 'measure'\n | 'edit'\n | 'transform';\n /** Số click cần trước khi action fire. -1 = mở (polygon đóng bằng click lại điểm đầu). */\n needs: number;\n /** Loại object accept ở mỗi slot. 'any' = point hoặc non-point. */\n accepts?: Array<'point' | 'line' | 'circle' | 'any'>;\n}\n\n// ============== Tool icons — inline SVG ==============\nconst Icon = {\n cursor: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\"/></svg>\n ),\n select: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 4 L20 12 L13 13 L11 20 Z\" fill=\"none\"/><rect x=\"2.5\" y=\"2.5\" width=\"19\" height=\"19\" strokeDasharray=\"3 2\" fill=\"none\"/></svg>\n ),\n point: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\"/></svg>\n ),\n midpoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"4\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"20\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\"/></svg>\n ),\n segment: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\"/><circle cx=\"5\" cy=\"18\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"6\" r=\"1.7\" fill=\"currentColor\"/></svg>\n ),\n line: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"4\"/><circle cx=\"8\" cy=\"16\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"16\" cy=\"8\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n ray: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"5\" y1=\"19\" x2=\"22\" y2=\"2\"/><circle cx=\"5\" cy=\"19\" r=\"1.7\" fill=\"currentColor\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n vector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><polyline points=\"14,4 20,4 20,10\"/></svg>\n ),\n perpendicular: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"4\"/><rect x=\"12\" y=\"14\" width=\"4\" height=\"4\" fill=\"none\"/></svg>\n ),\n parallel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"5\"/><line x1=\"3\" y1=\"19\" x2=\"21\" y2=\"15\"/></svg>\n ),\n perpBisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><circle cx=\"6\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"18\" cy=\"18\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n bisector: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"12\" strokeDasharray=\"3 2\"/></svg>\n ),\n polygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"6,6 18,6 22,14 12,22 4,14\"/></svg>\n ),\n regularPolygon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinejoin=\"round\"><polygon points=\"12,3 20,8 20,17 12,22 4,17 4,8\"/></svg>\n ),\n circleCenter: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\"/></svg>\n ),\n circle3: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"8\"/><circle cx=\"12\" cy=\"4\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"20\" cy=\"14\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"16\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n tangent: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"11\" cy=\"13\" r=\"6\"/><line x1=\"2\" y1=\"20\" x2=\"22\" y2=\"2\"/></svg>\n ),\n angle: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"6\"/><path d=\"M14 20 A 10 10 0 0 0 11 13\" /></svg>\n ),\n distance: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"8\" x2=\"4\" y2=\"16\"/><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"16\"/></svg>\n ),\n area: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><polygon points=\"5,6 19,6 21,14 13,21 3,15\" fill=\"currentColor\" fillOpacity=\"0.2\"/></svg>\n ),\n toggleLabel: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><text x=\"3\" y=\"18\" fontSize=\"16\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text><text x=\"13\" y=\"14\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" stroke=\"none\">A</text></svg>\n ),\n toggleVisible: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3.5\" fill=\"currentColor\" fillOpacity=\"0.4\"/><circle cx=\"12\" cy=\"12\" r=\"3.5\"/><circle cx=\"20\" cy=\"6\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\"/><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\"/><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"/></svg>\n ),\n translate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 4 L20 20\"/><polygon points=\"14,4 20,4 20,10\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.5\" fill=\"currentColor\"/></svg>\n ),\n rotate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M4 12 A8 8 0 1 1 12 20\"/><polyline points=\"4,9 4,13 8,13\"/></svg>\n ),\n reflectLine: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" strokeDasharray=\"3 2\"/><polygon points=\"4,6 9,12 4,18\" fill=\"currentColor\"/><polygon points=\"20,6 15,12 20,18\" fill=\"currentColor\"/></svg>\n ),\n reflectPoint: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"5\" cy=\"5\" r=\"1.6\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"19\" r=\"1.6\" fill=\"currentColor\"/><line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" strokeDasharray=\"2 2\"/></svg>\n ),\n dilate: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><polygon points=\"6,18 18,18 12,6\" fillOpacity=\"0.1\" fill=\"currentColor\"/><polygon points=\"9,15 15,15 12,11\" fill=\"currentColor\"/></svg>\n ),\n};\n\n// ============== Tool catalog ==============\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Kéo điểm hoặc xoay nền', icon: Icon.cursor, group: 'move', needs: 0 },\n { key: 'select', label: 'Chọn', hint: 'Click để chọn 1 / Shift+click để bỏ thêm / Kéo nền để khoanh vùng / DEL để xoá', icon: Icon.select, group: 'move', needs: 0 },\n { key: 'point', label: 'Điểm mới', hint: 'Click để thêm điểm', icon: Icon.point, group: 'point', needs: 1 },\n { key: 'midpoint', label: 'Trung điểm', hint: 'Click 2 điểm có sẵn', icon: Icon.midpoint, group: 'point', needs: 2, accepts: ['point', 'point'] },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Click 2 điểm', icon: Icon.segment, group: 'line', needs: 2 },\n { key: 'line', label: 'Đường thẳng qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.line, group: 'line', needs: 2 },\n { key: 'ray', label: 'Tia qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.ray, group: 'line', needs: 2 },\n { key: 'vector', label: 'Vector', hint: 'Click 2 điểm', icon: Icon.vector, group: 'line', needs: 2 },\n { key: 'perpendicular', label: 'Đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpendicular, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'parallel', label: 'Đường song song', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.parallel, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'perpBisector', label: 'Đường trung trực', hint: 'Click 2 điểm có sẵn', icon: Icon.perpBisector, group: 'construct', needs: 2, accepts: ['point', 'point'] },\n { key: 'angleBisector', label: 'Đường phân giác', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.bisector, group: 'construct', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'polygon', label: 'Đa giác', hint: 'Click các điểm, click lại điểm đầu để đóng', icon: Icon.polygon, group: 'polygon', needs: -1 },\n { key: 'regularPolygon', label: 'Đa giác đều', hint: 'Click 2 điểm rồi nhập số cạnh', icon: Icon.regularPolygon, group: 'polygon', needs: 2, accepts: ['point', 'point'] },\n { key: 'circleCenter', label: 'Đường tròn (tâm + điểm)', hint: 'Click tâm rồi 1 điểm trên đường tròn', icon: Icon.circleCenter, group: 'circle', needs: 2 },\n { key: 'circle3', label: 'Đường tròn qua 3 điểm', hint: 'Click 3 điểm', icon: Icon.circle3, group: 'circle', needs: 3 },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Click 1 điểm + 1 đường tròn có sẵn', icon: Icon.tangent, group: 'circle', needs: 2, accepts: ['point', 'circle'] },\n { key: 'angle', label: 'Góc', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.angle, group: 'measure', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'distance', label: 'Khoảng cách', hint: 'Click 2 điểm có sẵn', icon: Icon.distance, group: 'measure', needs: 2, accepts: ['point', 'point'] },\n { key: 'area', label: 'Diện tích', hint: 'Click các đỉnh, click lại điểm đầu để đóng', icon: Icon.area, group: 'measure', needs: -1 },\n { key: 'toggleLabel', label: 'Hiện/ẩn tên', hint: 'Click vào đối tượng', icon: Icon.toggleLabel, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'toggleVisible', label: 'Hiện/ẩn đối tượng', hint: 'Click vào đối tượng', icon: Icon.toggleVisible, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'delete', label: 'Xoá', hint: 'Click vào đối tượng', icon: Icon.trash, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'translate', label: 'Phép tịnh tiến', hint: 'Click object → 2 điểm tạo vector', icon: Icon.translate, group: 'transform', needs: 3, accepts: ['any', 'point', 'point'] },\n { key: 'rotate', label: 'Quay đối tượng', hint: 'Click object → tâm quay → nhập góc', icon: Icon.rotate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'reflectLine', label: 'Đối xứng qua đường thẳng', hint: 'Click object → đường thẳng', icon: Icon.reflectLine, group: 'transform', needs: 2, accepts: ['any', 'line'] },\n { key: 'reflectPoint', label: 'Đối xứng qua điểm', hint: 'Click object → tâm đối xứng', icon: Icon.reflectPoint, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'dilate', label: 'Phép vị tự', hint: 'Click object → tâm → nhập tỷ số k', icon: Icon.dilate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n];\n\nexport const GROUP_LABELS: Record<ToolDef['group'], string> = {\n move: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường',\n construct: 'Dựng hình',\n polygon: 'Đa giác',\n circle: 'Đường tròn',\n measure: 'Đo lường',\n edit: 'Chỉnh sửa',\n transform: 'Phép biến hình',\n};\n\n// ============== Object-type matching ==============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\n/** Phân loại JSXGraph element type vào nhóm dùng cho accept-matching. */\nexport function objKind(obj: JxgObj): 'point' | 'line' | 'circle' | 'other' {\n if (!obj) return 'other';\n const e = (obj.elType || obj.type || '').toString().toLowerCase();\n if (e === 'point' || e === 'glider' || e === 'midpoint') return 'point';\n if (\n e === 'line' || e === 'segment' || e === 'arrow' || e === 'axis' ||\n e === 'normal' || e === 'parallel' || e === 'perpendicular' ||\n e === 'tangent' || e === 'bisector' || e === 'perpendicularsegment'\n ) return 'line';\n if (e === 'circle' || e === 'circumcircle') return 'circle';\n return 'other';\n}\n\nexport function acceptMatches(\n tool: ToolDef,\n slot: number,\n kind: 'point' | 'line' | 'circle' | 'other',\n): boolean {\n if (!tool.accepts) return kind === 'point' || tool.key === 'point';\n const a = tool.accepts[slot];\n if (!a) return false;\n if (a === 'any') return kind !== 'other';\n return a === kind;\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Creation log của JSXGraphMiniBoard lưu attrs dưới dạng \"sentinel\" string\n// (`@stroke`, `@axis`, `@grid`, `@label`) thay vì màu cụ thể. Khi:\n// 1. Editor render real-time → resolve theo `isDark` của editor.\n// 2. Offscreen re-render (sau reload / sau khi switch theme) → resolve theo\n// `isDark` của canvas Excalidraw hiện tại.\n//\n// Nhờ vậy stamp tự đổi màu khi user switch dark/light, giống các nét vẽ\n// native của Excalidraw.\n\nexport const themeStroke = (dark: boolean) => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean) => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean) => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean) => (dark ? '#e2e8f0' : '#000000');\n\nexport interface GeomPalette {\n stroke: string;\n axis: string;\n grid: string;\n label: string;\n}\n\nexport function paletteFor(isDark: boolean): GeomPalette {\n return {\n stroke: themeStroke(isDark),\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n };\n}\n\nconst SENTINEL_MAP: Record<string, keyof GeomPalette> = {\n '@stroke': 'stroke',\n '@axis': 'axis',\n '@grid': 'grid',\n '@label': 'label',\n};\n\n/**\n * Walk attrs object/array/string và thay sentinel bằng màu thực từ palette.\n * Đệ quy để hỗ trợ nested attrs (ví dụ polygon's `borders.strokeColor`).\n * Trả về object mới — input giữ nguyên (immutable, an toàn cho log).\n */\nexport function resolveAttrColors<T>(attrs: T, palette: GeomPalette): T {\n if (typeof attrs === 'string') {\n const key = SENTINEL_MAP[attrs];\n return (key ? palette[key] : attrs) as T;\n }\n if (Array.isArray(attrs)) {\n return attrs.map((a) => resolveAttrColors(a, palette)) as unknown as T;\n }\n if (attrs && typeof attrs === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(attrs as Record<string, unknown>)) {\n out[k] = resolveAttrColors(v, palette);\n }\n return out as T;\n }\n return attrs;\n}\n","/**\n * handlers.ts — Pure pointer/tool handler functions extracted from MiniBoard.tsx.\n *\n * Each function receives a HandlerCtx object containing the refs and callbacks\n * it needs, and a raw JSXGraph event object. No React, no DOM manipulation\n * beyond what JSXGraph provides through its API.\n *\n * The ctx pattern lets MiniBoard.tsx pass a stable object reference captured\n * at useEffect time, while the individual properties stay up-to-date because\n * they are refs (whose .current is read at call time) or stable callbacks\n * (whose identities don't change across renders).\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nimport { TOOLS, objKind, type GeomTool, type ToolDef } from './tools';\nimport { buildTransformSpec } from './transforms';\n\n// ─── Context shape ────────────────────────────────────────────────────────────\n\nexport interface HandlerCtx {\n // Refs (read .current at call time)\n boardRef: { current: JxgObj };\n toolRef: { current: GeomTool };\n pendingRef: { current: JxgObj[] };\n previewSegRef: { current: JxgObj[] };\n axisObjsRef: { current: { x?: JxgObj; y?: JxgObj } };\n selectedSetRef: { current: Set<JxgObj> };\n marqueeRef: { current: { startSx: number; startSy: number; rect?: JxgObj } | null };\n moveDownRef: { current: { sx: number; sy: number } | null };\n lastMoveClickRef: { current: { obj: JxgObj | null; time: number } };\n pendingTransformRef: { current: { tool: 'rotate' | 'dilate' | 'regularPolygon'; source: JxgObj; center: JxgObj; anchorScreen: { x: number; y: number } } | null };\n phantomRef: { current: JxgObj };\n previewShapeRef: { current: JxgObj };\n previewRafRef: { current: number | null };\n jxgRef: { current: JxgObj };\n\n // Stable callbacks (identity doesn't change)\n screenCoordsOf: (evt: JxgObj) => [number, number] | null;\n objectsAt: (evt: JxgObj) => JxgObj[];\n promoteLabel: (o: JxgObj) => JxgObj;\n findNearestPoint: (evt: JxgObj, tolPx?: number) => JxgObj | null;\n toggleSelect: (obj: JxgObj, additive: boolean) => void;\n clearSelection: () => void;\n applySelectionStyle: (obj: JxgObj) => void;\n localIdOf: (obj: JxgObj) => string | null;\n nextLabel: () => string;\n create: (type: string, args: unknown[], attrs?: Record<string, unknown>) => JxgObj;\n finalize: (toolDef: ToolDef, picks: JxgObj[]) => void;\n finalizeTransformCreate: (spec: Parameters<typeof buildTransformSpec>[0] extends never ? never : ReturnType<typeof buildTransformSpec>, source: JxgObj) => void;\n clearPending: () => void;\n clearPreviewSegs: () => void;\n refreshPreview: () => void;\n flashWarn: (msg: string) => void;\n emitTransform: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void;\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n emitSelect: (snap: any) => void;\n setPendingCount: (n: number) => void;\n setSelectionTick: (fn: (t: number) => number) => void;\n}\n\n// ─── board.on('down') ─────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleDown(ctx: HandlerCtx, e: any): void {\n if (!ctx.boardRef.current) return;\n const t = ctx.toolRef.current;\n if (t === 'move') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n ctx.moveDownRef.current = { sx, sy };\n return;\n }\n if (t === 'select') {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n const obj = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? ctx.findNearestPoint(e, 12);\n if (obj) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(obj, shift);\n // Stash so 'up' handler doesn't treat this as a marquee end.\n ctx.moveDownRef.current = { sx, sy };\n ctx.marqueeRef.current = null;\n return;\n }\n // Empty space: start marquee. We disable board pan while marqueeing\n // by not setting moveDownRef (board's internal pan listener relies on\n // it being null elsewhere; here we record marquee start separately).\n ctx.marqueeRef.current = { startSx: sx, startSy: sy };\n // Clear current selection unless shift is held (additive marquee).\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n return;\n }\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n const x = coords[0], y = coords[1];\n\n // Detect if click hits any existing object (snap target). Text labels\n // are promoted to their owning element so a click on the \"A\" label\n // counts as a click on the point A.\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // Prefer points over other elements when present\n const bestHit: JxgObj | null = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? null;\n // Generous fallback used when a slot expects a point: JSXGraph's `hasPoint`\n // for a small point is ~3px which is too tight for clicking, so we look up\n // the nearest existing point within 12px. Only applied where the active\n // tool slot needs a point — otherwise we'd shadow valid line/circle hits.\n const snapPointForPointSlot = (): JxgObj | null =>\n bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPoint(e, 12);\n\n // Tool: point — nếu click trúng ≥2 đường/đường tròn → tạo giao điểm\n // ràng buộc (khi kéo các đường, điểm này luôn là giao). Trường hợp 1\n // đường + click thường vẫn tạo điểm tự do (không glide để tránh ràng\n // buộc ngoài ý muốn).\n if (t === 'point') {\n const curves = hits.filter((o) => objKind(o) === 'line' || objKind(o) === 'circle');\n if (curves.length >= 2) {\n const a = curves[0];\n const b = curves[1];\n const aId = ctx.localIdOf(a);\n const bId = ctx.localIdOf(b);\n if (aId && bId) {\n const name = ctx.nextLabel();\n const attrs = { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' };\n try {\n // intersection trả về element [obj1, obj2] với giao gần (x, y).\n // JSXGraph cần index i (0 hoặc 1) cho trường hợp 2 giao (line-circle, circle-circle).\n // Chọn index dựa vào điểm gần click hơn.\n const isLineLine = objKind(a) === 'line' && objKind(b) === 'line';\n if (isLineLine) {\n ctx.create('intersection', [aId, bId, 0], attrs);\n } else {\n // Thử cả 2 index, chọn cái gần click hơn\n const tmp0 = ctx.boardRef.current.create('intersection', [a, b, 0], { visible: false, withLabel: false });\n const tmp1 = ctx.boardRef.current.create('intersection', [a, b, 1], { visible: false, withLabel: false });\n const d0 = Math.hypot((tmp0.X?.() ?? 0) - x, (tmp0.Y?.() ?? 0) - y);\n const d1 = Math.hypot((tmp1.X?.() ?? 0) - x, (tmp1.Y?.() ?? 0) - y);\n try { ctx.boardRef.current.removeObject(tmp0); } catch { /* ignore */ }\n try { ctx.boardRef.current.removeObject(tmp1); } catch { /* ignore */ }\n const idx = d0 <= d1 ? 0 : 1;\n ctx.create('intersection', [aId, bId, idx], attrs);\n }\n return;\n } catch {\n // fallback: tạo điểm tự do\n }\n }\n }\n const name = ctx.nextLabel();\n ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n return;\n }\n\n // Edit / single-target tools (toggleLabel, toggleVisible, delete)\n if (toolDef.needs === 1 && toolDef.accepts) {\n // Fall back to generous point snap if hasPoint missed a small point.\n const hit = bestHit ?? ctx.findNearestPoint(e, 12);\n if (hit) ctx.finalize(toolDef, [hit]);\n else ctx.flashWarn('Click vào một đối tượng để áp dụng');\n return;\n }\n\n // Polygon / area: variable-length, close on click near starting point\n if (toolDef.needs === -1) {\n const snappedPoint = snapPointForPointSlot();\n // Close ring first: if user clicks back on the first pending point\n // (with at least 3 points already), finalize. Done before push so the\n // first point isn't duplicated into pending.\n if (ctx.pendingRef.current.length >= 3 && snappedPoint && snappedPoint === ctx.pendingRef.current[0]) {\n ctx.clearPreviewSegs();\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n return;\n }\n // Reject re-picking an interior pending vertex (would create a degenerate edge).\n if (snappedPoint && ctx.pendingRef.current.includes(snappedPoint)) {\n ctx.flashWarn('Đỉnh này đã có — click điểm khác hoặc click lại điểm đầu để đóng');\n return;\n }\n // Otherwise pick (snap-to-existing or create) a new vertex\n const pick: JxgObj = snappedPoint ?? (() => {\n const name = ctx.nextLabel();\n return ctx.create('point', [x, y], { name, color: '@stroke', size: 3 });\n })();\n // Live preview: draw an edge from the previous pending vertex to\n // this new one so the user sees the polygon being built.\n if (ctx.pendingRef.current.length > 0 && ctx.boardRef.current) {\n const prev = ctx.pendingRef.current[ctx.pendingRef.current.length - 1];\n try {\n const seg = ctx.boardRef.current.create('segment', [prev, pick], {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.75,\n fixed: true,\n highlight: false,\n withLabel: false,\n });\n ctx.previewSegRef.current.push(seg);\n } catch { /* ignore */ }\n }\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n return;\n }\n\n // Multi-click branch. Two sub-modes:\n // A) Strict + order-flexible: tool declared `accepts`. We bind each\n // click to whatever required kind is still unfilled, regardless\n // of click order. E.g. perpendicular accepts ['point', 'line']\n // and the user can click line-then-point or point-then-line.\n // B) Lenient + order-fixed: tool has no `accepts` (segment, line,\n // ray, vector, circle*, ...). All slots want points; missing\n // snaps create a fresh point.\n let pick: JxgObj | null = null;\n\n if (toolDef.accepts) {\n // --- Mode A: strict, order-flexible ---\n const usedKinds = ctx.pendingRef.current.map((p) => objKind(p));\n const remaining: Array<'point' | 'line' | 'circle' | 'any'> = [...toolDef.accepts];\n for (const u of usedKinds) {\n if (u === 'other') continue;\n const i = remaining.indexOf(u);\n if (i >= 0) remaining.splice(i, 1);\n }\n const strictPoint = hits.find((o) => objKind(o) === 'point') ?? null;\n const lineHit = hits.find((o) => objKind(o) === 'line') ?? null;\n const circleHit = hits.find((o) => objKind(o) === 'circle') ?? null;\n // Priority: an exact point hit binds to 'point' first (so a click\n // landing right on a vertex isn't stolen by a line/circle passing\n // through it). Typed line/circle bind next. 'any' slot accepts any\n // remaining hit (point/line/circle). Generous point-snap is the\n // last resort when only a 'point' slot is open.\n //\n // Previously 'any' was checked AFTER the snap fallback for point,\n // which meant tools like dilate (accepts ['any', 'point']) couldn't\n // pick a segment for the 'any' slot — the snap branch absorbed the\n // click and 'any' was never evaluated.\n if (remaining.includes('point') && strictPoint) pick = strictPoint;\n else if (remaining.includes('line') && lineHit) pick = lineHit;\n else if (remaining.includes('circle') && circleHit) pick = circleHit;\n else if (remaining.includes('any') && (strictPoint || lineHit || circleHit)) {\n pick = strictPoint ?? lineHit ?? circleHit;\n } else if (remaining.includes('point')) {\n const near = ctx.findNearestPoint(e, 12);\n if (near) pick = near;\n }\n if (!pick) {\n const needs = remaining.map((k) =>\n k === 'point' ? 'một điểm' : k === 'line' ? 'một đường/đoạn' : k === 'circle' ? 'một đường tròn' : 'một đối tượng',\n );\n ctx.flashWarn(`Còn cần click vào ${needs.join(' + ')} có sẵn`);\n return;\n }\n // Reject duplicate picks (e.g. click the same point twice for midpoint\n // would produce a degenerate object pointing at itself).\n if (ctx.pendingRef.current.includes(pick)) {\n ctx.flashWarn('Đã chọn đối tượng này — chọn đối tượng khác');\n return;\n }\n } else {\n // --- Mode B: lenient, all slots want a point ---\n const snapped = snapPointForPointSlot();\n if (snapped && ctx.pendingRef.current.includes(snapped)) {\n // Same point clicked twice → would produce a zero-length segment / etc.\n ctx.flashWarn('Đã chọn điểm này — chọn điểm khác hoặc click chỗ trống');\n return;\n }\n if (snapped) pick = snapped;\n else {\n const name = ctx.nextLabel();\n pick = ctx.create('point', [x, y], { name, color: '@stroke', size: 3, fillColor: '@stroke', strokeColor: '@stroke' });\n }\n }\n\n if (!pick) return;\n ctx.pendingRef.current.push(pick);\n ctx.setPendingCount(ctx.pendingRef.current.length);\n\n if (ctx.pendingRef.current.length >= toolDef.needs) {\n const tk = toolDef.key;\n if (tk === 'rotate' || tk === 'dilate') {\n const source = ctx.pendingRef.current[0];\n const center = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source, center, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n // Don't clearPending here — wait for confirm/cancel\n return;\n }\n if (tk === 'regularPolygon') {\n const p1 = ctx.pendingRef.current[0];\n const p2 = ctx.pendingRef.current[1];\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = { tool: tk, source: p1, center: p2, anchorScreen: { x: cx, y: cy } };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n return;\n }\n if (tk === 'translate') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'translate', vectorPoints: [ctx.pendingRef.current[1], ctx.pendingRef.current[2]] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectLine') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectLine', line: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n if (tk === 'reflectPoint') {\n const source = ctx.pendingRef.current[0];\n const spec = buildTransformSpec({ kind: 'reflectPoint', center: ctx.pendingRef.current[1] });\n ctx.finalizeTransformCreate(spec, source);\n ctx.clearPending();\n return;\n }\n ctx.finalize(toolDef, ctx.pendingRef.current);\n ctx.clearPending();\n } else {\n ctx.refreshPreview();\n }\n}\n\n// ─── board.on('up') ───────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleUp(ctx: HandlerCtx, e: any): void {\n const t = ctx.toolRef.current;\n if (t === 'select') {\n // Finalize marquee: any object hit-tested inside the rectangle gets\n // added to the selection. Single click on object was already handled\n // in `down`; here we only care about drag end.\n const mq = ctx.marqueeRef.current;\n ctx.marqueeRef.current = null;\n ctx.moveDownRef.current = null;\n if (!mq) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [ex, ey] = sc;\n if (mq.rect) { try { ctx.boardRef.current?.removeObject(mq.rect); } catch { /* ignore */ } }\n if (Math.hypot(ex - mq.startSx, ey - mq.startSy) < 4) return; // not a real drag\n const x1 = Math.min(mq.startSx, ex), x2 = Math.max(mq.startSx, ex);\n const y1 = Math.min(mq.startSy, ey), y2 = Math.max(mq.startSy, ey);\n const board = ctx.boardRef.current;\n if (!board) return;\n const list = (board.objectsList || []) as JxgObj[];\n for (const o of list) {\n if (o === ctx.axisObjsRef.current.x || o === ctx.axisObjsRef.current.y) continue;\n // Points: include if their screen coord falls inside the rect.\n const kind = objKind(o);\n if (kind === 'point') {\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n if (pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2) {\n if (!ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n // Lines/segments/circles: simple test — include if either defining\n // point falls inside (good enough for marquee UX without doing\n // expensive line-rectangle intersections).\n else if (kind === 'line' || kind === 'circle') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const defs: any[] = [o.point1, o.point2, o.center, o.midpoint, o.point3].filter(Boolean);\n const anyInside = defs.some((p) => {\n const pc = p?.coords?.scrCoords;\n return pc && pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2;\n });\n if (anyInside && !ctx.selectedSetRef.current.has(o)) {\n ctx.selectedSetRef.current.add(o);\n ctx.applySelectionStyle(o);\n }\n }\n }\n ctx.setSelectionTick((tt) => tt + 1);\n try { board.update(); } catch { /* ignore */ }\n return;\n }\n if (t !== 'move') return;\n const start = ctx.moveDownRef.current;\n ctx.moveDownRef.current = null;\n if (!start) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const moved = Math.hypot(sx - start.sx, sy - start.sy);\n if (moved > 4) return; // drag, không phải click\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const best: any = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? ctx.findNearestPoint(e, 12);\n if (!best) {\n ctx.lastMoveClickRef.current = { obj: null, time: 0 };\n return;\n }\n const now = Date.now();\n const isDouble = ctx.lastMoveClickRef.current.obj === best && (now - ctx.lastMoveClickRef.current.time) < 400;\n ctx.lastMoveClickRef.current = { obj: best, time: now };\n if (!isDouble) return;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n const snap = ctx.snapshotObject(best, { x: cx + 8, y: cy + 8 });\n if (snap) ctx.emitSelect(snap);\n}\n\n// ─── board.on('move') ────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleMove(ctx: HandlerCtx, e: any): void {\n // Marquee rectangle redraw while user drags with the select tool on empty space.\n if (ctx.toolRef.current === 'select' && ctx.marqueeRef.current) {\n const sc = ctx.screenCoordsOf(e);\n if (sc && ctx.boardRef.current) {\n const [sx, sy] = sc;\n const { startSx, startSy } = ctx.marqueeRef.current;\n // Convert screen px to user coords for JSXGraph polygon overlay.\n const b = ctx.boardRef.current;\n const ux1 = b.screenCoords2userCoords?.([Math.min(startSx, sx), Math.min(startSy, sy)]) ?? null;\n const ux2 = b.screenCoords2userCoords?.([Math.max(startSx, sx), Math.max(startSy, sy)]) ?? null;\n // JSXGraph internal: getUsrCoordsByScreenCoords may not exist; fall\n // back to using a known board API.\n const toUsr = (px: number, py: number): [number, number] => {\n // Coords.getMouseCoordinates equivalent — use board.origin + unitX/Y.\n const ox = b.origin?.scrCoords?.[1] ?? 0;\n const oy = b.origin?.scrCoords?.[2] ?? 0;\n const ux = (px - ox) / b.unitX;\n const uy = (oy - py) / b.unitY;\n return [ux, uy];\n };\n const [x1u, y1u] = ux1 && ux1.length >= 2 ? [ux1[0], ux1[1]] : toUsr(Math.min(startSx, sx), Math.min(startSy, sy));\n const [x2u, y2u] = ux2 && ux2.length >= 2 ? [ux2[0], ux2[1]] : toUsr(Math.max(startSx, sx), Math.max(startSy, sy));\n const rect = ctx.marqueeRef.current.rect;\n if (rect) {\n try { ctx.boardRef.current.removeObject(rect); } catch { /* ignore */ }\n }\n try {\n ctx.marqueeRef.current.rect = ctx.boardRef.current.create('polygon', [\n [x1u, y1u], [x2u, y1u], [x2u, y2u], [x1u, y2u],\n ], {\n fillColor: '#06b6d4', fillOpacity: 0.08,\n borders: { strokeColor: '#06b6d4', strokeWidth: 1, dash: 2 },\n vertices: { visible: false },\n fixed: true, highlight: false, withLabel: false,\n });\n } catch { /* ignore */ }\n }\n return;\n }\n const ph = ctx.phantomRef.current;\n if (!ph || !ctx.boardRef.current) return;\n if (ctx.previewRafRef.current != null) return;\n ctx.previewRafRef.current = requestAnimationFrame(() => {\n ctx.previewRafRef.current = null;\n if (!ctx.boardRef.current || !ctx.phantomRef.current) return;\n try {\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const JXG: any = ctx.jxgRef.current;\n if (!JXG) return;\n ctx.phantomRef.current.setPositionDirectly(JXG.COORDS_BY_USER, [coords[0], coords[1]]);\n ctx.boardRef.current.update();\n } catch { /* ignore */ }\n });\n}\n","'use client';\nimport React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { deserializeIntoBoard, type SerializedBoard, type SerializedElement } from '../serialize';\nimport { getDefiningPoints, buildTransformSpec } from './transforms';\nimport {\n TOOLS,\n GROUP_LABELS,\n acceptMatches,\n objKind,\n type GeomTool,\n type ToolDef,\n} from './tools';\nimport { paletteFor, resolveAttrColors, themeAxis, themeGrid, themeLabel } from './theme';\nimport { handleDown, handleUp, handleMove, type HandlerCtx } from './handlers';\n\n// Re-export để backward-compat với consumer cũ.\nexport { TOOLS, GROUP_LABELS };\nexport type { GeomTool, ToolDef };\n\nexport interface MiniBoardHandle {\n getContainer: () => HTMLDivElement | null;\n getCreationLog: () => SerializedElement[];\n getBbox: () => [number, number, number, number];\n getShowAxis: () => boolean;\n getShowGrid: () => boolean;\n /** Đổi tool active từ bên ngoài (panel trái). */\n setTool: (t: GeomTool) => void;\n getTool: () => GeomTool;\n /** Toggle layout từ bên ngoài. */\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n /** Undo bước cuối. */\n undo: () => void;\n /** Có gì để undo? */\n canUndo: () => boolean;\n /** Subscribe khi state thay đổi (tool / showAxis / showGrid / undo). */\n subscribe: (cb: () => void) => () => void;\n /** Đọc snapshot thuộc tính object (cho popover). */\n snapshotObject: (obj: unknown, anchorScreen: { x: number; y: number }) => ObjectSnapshot | null;\n /** Mutate thuộc tính + sync log. */\n mutateObject: (obj: unknown, patch: { attrs?: Record<string, unknown>; remove?: boolean }) => void;\n /** Liệt kê tên của tất cả point hiện tại (để popover disambiguate khi rename). */\n getAllPointNames: () => string[];\n /** Subscribe selection-from-move-tool. Trả về unsubscribe. */\n onSelect: (cb: (snap: ObjectSnapshot) => void) => () => void;\n onTransformParam: (cb: (info: { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null) => void) => () => void;\n confirmTransformParam: (value: number) => void;\n cancelTransformParam: () => void;\n /** Số đối tượng đang chọn (qua tool 'select'). */\n getSelectionSize: () => number;\n /** Bỏ chọn tất cả. */\n clearSelection: () => void;\n /** Xoá tất cả đối tượng đang chọn (cascade-aware). */\n deleteSelection: () => void;\n}\n\nexport interface ObjectSnapshot {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj: any;\n kind: 'point' | 'line' | 'circle';\n name: string;\n color: string;\n dash: number;\n width: number;\n face: 'o' | 'circle' | 'cross' | 'plus';\n /** Đang hiển thị tên (label) hay không. */\n showLabel: boolean;\n /** Đang có value-label (text gắn động) hay không. */\n showValue: boolean;\n screenCoords: { x: number; y: number };\n}\n\ninterface Props {\n onReady: (handle: MiniBoardHandle) => void;\n initialState: SerializedBoard | null;\n /** Khi true → board nền tối, điểm/đường/label dùng tone sáng để contrast. */\n isDark?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport const JSXGraphMiniBoard: React.FC<Props> = ({ onReady, initialState, isDark }) => {\n const isDarkRef = useRef(!!isDark);\n isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_jxgmini';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const axisObjsRef = useRef<{ x?: JxgObj; y?: JxgObj }>({});\n const creationLogRef = useRef<SerializedElement[]>([]);\n\n const [tool, setTool] = useState<GeomTool>('move');\n const toolRef = useRef<GeomTool>('move');\n toolRef.current = tool;\n\n const [showAxis, setShowAxis] = useState<boolean>(initialState?.showAxis ?? false);\n const [showGrid, setShowGrid] = useState<boolean>(initialState?.showGrid ?? false);\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n // Track JSXGraph point objects created during the session, indexed by our serialized id.\n // We also track the LAST object created (for non-point types like segment) so accept-matching works.\n const objMapRef = useRef<Map<string, JxgObj>>(new Map());\n\n // Map target line/circle → dynamic value-label text element (hiển thị độ dài\n // / bán kính). Khi user toggle \"Show Value\", ta tạo/xoá text này. Serialize:\n // entry type='valueLabel' trong creationLog với args=[targetLocalId].\n const valueLabelsRef = useRef<Map<JxgObj, JxgObj>>(new Map());\n\n // Pending picks for multi-click tools: array of JSXGraph object refs\n const pendingRef = useRef<JxgObj[]>([]);\n const [, setPendingCount] = useState(0);\n\n // Selection state — tool 'select' adds clicked objects here. Selected objects\n // get a cyan highlight stroke (original style preserved in selOriginalRef so\n // we can restore on deselect).\n const selectedSetRef = useRef<Set<JxgObj>>(new Set());\n const selOriginalRef = useRef<Map<JxgObj, { strokeColor?: unknown; strokeWidth?: unknown }>>(new Map());\n const [, setSelectionTick] = useState(0);\n // Marquee state during select-tool drag.\n const marqueeRef = useRef<{ startSx: number; startSy: number; rect?: JxgObj } | null>(null);\n\n // Live preview segments while building a polygon/area: drawn between\n // consecutive pending points so the user sees the shape forming.\n const previewSegRef = useRef<JxgObj[]>([]);\n // Phantom point that tracks mouse position for 2-3 click tool live preview.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const phantomRef = useRef<any>(null);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const previewShapeRef = useRef<any>(null);\n const previewRafRef = useRef<number | null>(null);\n // Tick state forces re-render so the undo button enable state stays in sync\n // with creationLogRef (which is mutated outside React).\n const [historyTick, setHistoryTick] = useState(0);\n // Transient warning shown when a strict construction tool gets a click that\n // didn't land on the required existing object (so the user knows why nothing\n // happened). Auto-clears.\n const [, setWarn] = useState<string | null>(null);\n const warnTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flashWarn = useCallback((msg: string) => {\n if (warnTimerRef.current) clearTimeout(warnTimerRef.current);\n setWarn(msg);\n warnTimerRef.current = setTimeout(() => setWarn(null), 1800);\n }, []);\n useEffect(() => () => { if (warnTimerRef.current) clearTimeout(warnTimerRef.current); }, []);\n\n const labelIdxRef = useRef(0);\n const nextLabel = useCallback(() => {\n const idx = labelIdxRef.current;\n const suffix = idx >= 26 ? String(Math.floor(idx / 26)) : '';\n const code = 'A'.charCodeAt(0) + (idx % 26);\n labelIdxRef.current = idx + 1;\n return String.fromCharCode(code) + suffix;\n }, []);\n\n const nextLocalId = useCallback(() => 'j' + creationLogRef.current.length, []);\n\n // Build a fresh JSXGraph object id resolver for serialization.\n // We log args using local string IDs (\"j0\"); resolve to JSXGraph objects in-memory via objMapRef.\n const resolveArgs = useCallback((args: unknown[]): unknown[] => {\n return args.map((a) => {\n if (typeof a === 'string' && objMapRef.current.has(a)) {\n return objMapRef.current.get(a);\n }\n return a;\n });\n }, []);\n\n const pushLog = useCallback(\n (id: string, type: string, args: unknown[], attrs: Record<string, unknown>, obj: JxgObj) => {\n creationLogRef.current.push({ id, type, args, attrs });\n objMapRef.current.set(id, obj);\n setHistoryTick((t) => t + 1);\n },\n [],\n );\n\n const create = useCallback(\n (type: string, args: unknown[], attrs: Record<string, unknown> = {}): JxgObj => {\n if (!boardRef.current) return null;\n const id = nextLocalId();\n const resolved = resolveArgs(args);\n // attrs có thể chứa sentinel `@stroke/@axis/@grid/@label` — log lưu nguyên\n // bản (theme-neutral), JSXGraph nhận màu thực resolve theo theme hiện tại.\n const resolvedAttrs = resolveAttrColors(attrs, paletteFor(isDarkRef.current));\n const obj = boardRef.current.create(type, resolved, resolvedAttrs);\n pushLog(id, type, args, attrs, obj);\n return obj;\n },\n [nextLocalId, resolveArgs, pushLog],\n );\n\n // Get local serialized id for a JSXGraph object (reverse lookup).\n const localIdOf = useCallback((obj: JxgObj): string | null => {\n for (const [id, o] of objMapRef.current.entries()) {\n if (o === obj) return id;\n }\n return null;\n }, []);\n\n const snapshotObject = useCallback((obj: unknown, anchorScreen: { x: number; y: number }): ObjectSnapshot | null => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o: any = obj;\n const k = objKind(o);\n if (k !== 'point' && k !== 'line' && k !== 'circle') return null;\n const v = o.visProp ?? {};\n const showLabel = v.withlabel !== false;\n const showValue = valueLabelsRef.current.has(o);\n return {\n obj: o,\n kind: k,\n name: typeof o.name === 'string' ? o.name : '',\n color: (v.strokecolor as string) ?? '#1e1e1e',\n dash: typeof v.dash === 'number' ? v.dash : 0,\n width: typeof v.strokewidth === 'number' ? v.strokewidth : 2,\n face: (v.face as ObjectSnapshot['face']) ?? 'o',\n showLabel,\n showValue,\n screenCoords: anchorScreen,\n };\n }, []);\n\n // Tạo text element động hiển thị giá trị (độ dài segment / bán kính circle).\n // Trả về JSXGraph text obj (chưa log). Cần obj có cùng \"kind\" được hỗ trợ.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const createValueLabelFor = useCallback((target: any): any => {\n const b = boardRef.current;\n if (!b || !target) return null;\n const k = objKind(target);\n if (k === 'line') {\n // segment / line / arrow đều dùng point1 + point2\n const p1 = target.point1;\n const p2 = target.point2;\n if (!p1 || !p2) return null;\n const txt = b.create('text', [\n () => (p1.X() + p2.X()) / 2 + 0.15,\n () => (p1.Y() + p2.Y()) / 2 + 0.25,\n () => {\n const dx = p2.X() - p1.X();\n const dy = p2.Y() - p1.Y();\n const len = Math.hypot(dx, dy);\n const name = typeof target.name === 'string' && target.name ? target.name : 'd';\n return `${name} = ${len.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n return txt;\n }\n if (k === 'circle') {\n const center = target.center ?? target.midpoint;\n if (!center) return null;\n const txt = b.create('text', [\n () => center.X() + 0.3,\n () => center.Y() + 0.3,\n () => {\n const r = typeof target.Radius === 'function' ? target.Radius() : 0;\n const name = typeof target.name === 'string' && target.name ? target.name : 'r';\n return `${name} = ${r.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n return txt;\n }\n return null;\n }, []);\n\n const mutateObject = useCallback((obj: unknown, patch: { attrs?: Record<string, unknown>; remove?: boolean; valueLabel?: boolean }) => {\n if (!boardRef.current) return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const o: any = obj;\n if (patch.remove) {\n // Nếu obj có value-label đính kèm → xoá luôn text đó để cascade không\n // bỏ sót.\n const vl = valueLabelsRef.current.get(o);\n if (vl) {\n try { boardRef.current.removeObject(vl); } catch { /* ignore */ }\n valueLabelsRef.current.delete(o);\n }\n try { boardRef.current.removeObject(o); } catch { /* ignore */ }\n // Cascade: walk log and drop entries whose JSXGraph object was also removed\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, obj] of objMapRef.current.entries()) {\n // JSXGraph keeps objects in board.objects keyed by JSXGraph internal id\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (obj as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n // Drop dead entries from log + map\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n return;\n }\n if (typeof patch.valueLabel === 'boolean') {\n const has = valueLabelsRef.current.has(o);\n if (patch.valueLabel && !has) {\n const txt = createValueLabelFor(o);\n if (txt) {\n valueLabelsRef.current.set(o, txt);\n // Log entry tổng hợp để reload regenerate được. args=[targetLocalId].\n const targetId = localIdOf(o);\n if (targetId) {\n const id = nextLocalId();\n creationLogRef.current.push({ id, type: 'valueLabel', args: [targetId], attrs: {} });\n objMapRef.current.set(id, txt);\n setHistoryTick((t) => t + 1);\n }\n }\n } else if (!patch.valueLabel && has) {\n const txt = valueLabelsRef.current.get(o);\n valueLabelsRef.current.delete(o);\n if (txt) {\n try { boardRef.current.removeObject(txt); } catch { /* ignore */ }\n // Xoá log entry value-label tương ứng\n const txtId = localIdOf(txt);\n if (txtId) {\n creationLogRef.current = creationLogRef.current.filter((e) => e.id !== txtId);\n objMapRef.current.delete(txtId);\n setHistoryTick((t) => t + 1);\n }\n }\n }\n }\n if (patch.attrs) {\n try { o.setAttribute(patch.attrs); } catch { /* ignore */ }\n const id = localIdOf(o);\n if (id) {\n const entry = creationLogRef.current.find((e) => e.id === id);\n if (entry) entry.attrs = { ...entry.attrs, ...patch.attrs };\n setHistoryTick((t) => t + 1);\n }\n }\n try { boardRef.current.update(); } catch { /* ignore */ }\n }, [createValueLabelFor, localIdOf, nextLocalId]);\n\n const clearPreviewSegs = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n for (const s of previewSegRef.current) {\n try { b.removeObject(s); } catch { /* ignore */ }\n }\n previewSegRef.current = [];\n }, []);\n\n const removePhantom = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n if (previewShapeRef.current) {\n try { b.removeObject(previewShapeRef.current); } catch { /* ignore */ }\n previewShapeRef.current = null;\n }\n if (phantomRef.current) {\n try { b.removeObject(phantomRef.current); } catch { /* ignore */ }\n phantomRef.current = null;\n }\n }, []);\n\n const clearPending = useCallback(() => {\n removePhantom();\n clearPreviewSegs();\n pendingRef.current = [];\n setPendingCount(0);\n }, [clearPreviewSegs, removePhantom]);\n\n // === Selection helpers (used by the `select` tool) ===\n const applySelectionStyle = useCallback((obj: JxgObj) => {\n if (!obj || selOriginalRef.current.has(obj)) return;\n try {\n const visProp = obj.visProp ?? {};\n selOriginalRef.current.set(obj, {\n strokeColor: visProp.strokecolor,\n strokeWidth: visProp.strokewidth,\n });\n const kind = objKind(obj);\n if (kind === 'point') {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n } else {\n obj.setAttribute({ strokeColor: '#06b6d4', strokeWidth: 3 });\n }\n } catch { /* ignore */ }\n }, []);\n\n const restoreSelectionStyle = useCallback((obj: JxgObj) => {\n const orig = selOriginalRef.current.get(obj);\n if (!orig) return;\n try {\n const attrs: Record<string, unknown> = {};\n if (orig.strokeColor !== undefined) attrs.strokeColor = orig.strokeColor;\n if (orig.strokeWidth !== undefined) attrs.strokeWidth = orig.strokeWidth;\n obj.setAttribute(attrs);\n } catch { /* ignore */ }\n selOriginalRef.current.delete(obj);\n }, []);\n\n const clearSelection = useCallback(() => {\n for (const o of selectedSetRef.current) {\n restoreSelectionStyle(o);\n }\n selectedSetRef.current.clear();\n setSelectionTick((t) => t + 1);\n try { boardRef.current?.update(); } catch { /* ignore */ }\n }, [restoreSelectionStyle]);\n\n const toggleSelect = useCallback((obj: JxgObj, additive: boolean) => {\n if (!obj) return;\n if (!additive) {\n // Single-click replace: clear others first.\n for (const o of selectedSetRef.current) {\n if (o !== obj) restoreSelectionStyle(o);\n }\n selectedSetRef.current = new Set([obj]);\n applySelectionStyle(obj);\n } else {\n if (selectedSetRef.current.has(obj)) {\n restoreSelectionStyle(obj);\n selectedSetRef.current.delete(obj);\n } else {\n selectedSetRef.current.add(obj);\n applySelectionStyle(obj);\n }\n }\n setSelectionTick((t) => t + 1);\n try { boardRef.current?.update(); } catch { /* ignore */ }\n }, [applySelectionStyle, restoreSelectionStyle]);\n\n const deleteSelected = useCallback(() => {\n const board = boardRef.current;\n if (!board) return;\n if (selectedSetRef.current.size === 0) return;\n // Drop highlight first so removal doesn't try to setAttribute on dead obj.\n for (const o of selectedSetRef.current) selOriginalRef.current.delete(o);\n for (const o of selectedSetRef.current) {\n try { board.removeObject(o); } catch { /* ignore */ }\n }\n selectedSetRef.current.clear();\n // Cascade-prune log (same approach as delete tool)\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board.objects && board.objects[jxgId]) aliveIds.add(id);\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setSelectionTick((t) => t + 1);\n setHistoryTick((t) => t + 1);\n }, []);\n\n // Build a transient preview shape (not logged) from pending picks + phantom point.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const buildPreview = useCallback((toolDef: ToolDef, picks: any[], phantom: any) => {\n const b = boardRef.current;\n if (!b) return null;\n const style = { strokeColor: '#3b82f6', strokeWidth: 1.5, strokeOpacity: 0.65, dash: 2, fixed: true, highlight: false, withLabel: false } as Record<string, unknown>;\n const circStyle = { ...style, fillColor: 'none', fillOpacity: 0 };\n try {\n switch (toolDef.key) {\n case 'segment':\n case 'midpoint':\n case 'distance':\n return b.create('segment', [picks[0], phantom], style);\n case 'line':\n return b.create('line', [picks[0], phantom], style);\n case 'ray':\n return b.create('line', [picks[0], phantom], { ...style, straightFirst: false, straightLast: true });\n case 'vector':\n return b.create('arrow', [picks[0], phantom], style);\n case 'circleCenter':\n return b.create('circle', [picks[0], phantom], circStyle);\n case 'circle3':\n if (picks.length === 1) return b.create('circle', [picks[0], phantom], circStyle);\n if (picks.length === 2) return b.create('circumcircle', [picks[0], picks[1], phantom], circStyle);\n return null;\n case 'angle':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('angle', [picks[0], picks[1], phantom], { ...style, radius: 1, fillColor: '#22c55e', fillOpacity: 0.15 });\n return null;\n case 'perpBisector':\n return b.create('segment', [picks[0], phantom], style);\n case 'angleBisector':\n if (picks.length === 1) return b.create('segment', [picks[0], phantom], style);\n if (picks.length === 2) return b.create('bisector', [picks[0], picks[1], phantom], style);\n return null;\n case 'perpendicular':\n case 'parallel':\n case 'tangent':\n if (picks.length === 1) {\n const k = objKind(picks[0]);\n if (k === 'line' && toolDef.key !== 'tangent') {\n return b.create(toolDef.key, [picks[0], phantom], style);\n }\n if (k === 'circle' && toolDef.key === 'tangent') {\n const glider = b.create('glider', [phantom.X(), phantom.Y(), picks[0]], { visible: false, withLabel: false });\n return b.create('tangent', [glider], style);\n }\n }\n return null;\n default:\n return null;\n }\n } catch {\n return null;\n }\n }, []);\n\n // Tear down old preview shape and build a new one from current picks + phantom.\n const refreshPreview = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n // Tear down current preview shape (not the phantom)\n if (previewShapeRef.current) {\n try { b.removeObject(previewShapeRef.current); } catch { /* ignore */ }\n previewShapeRef.current = null;\n }\n const t = toolRef.current;\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n const picks = pendingRef.current;\n if (picks.length === 0 || toolDef.needs <= 0) return;\n if (picks.length >= toolDef.needs) return;\n // Create phantom if missing\n if (!phantomRef.current) {\n try {\n phantomRef.current = b.create('point', [0, 0], { visible: false, fixed: true, withLabel: false, name: '' });\n } catch { return; }\n }\n previewShapeRef.current = buildPreview(toolDef, picks, phantomRef.current);\n }, [buildPreview]);\n\n // Apply tool action with a sequence of picked refs\n const finalize = useCallback((toolDef: ToolDef, picks: JxgObj[]) => {\n if (!boardRef.current) return;\n const labels = picks.map(localIdOf).filter(Boolean) as string[];\n // For open shapes (segment, line, ray, vector). `color` shorthand also fills\n // closed shapes, so we use explicit strokeColor + transparent fillOpacity for\n // anything closed (circle, polygon, angle).\n const stroke = { strokeColor: '@stroke', strokeWidth: 2 };\n const strokeOnly = { ...stroke, fillColor: 'none', fillOpacity: 0 };\n const lblName = nextLabel();\n switch (toolDef.key) {\n case 'midpoint':\n create('midpoint', labels, { name: lblName, color: '@stroke', size: 3 });\n break;\n case 'segment':\n create('segment', labels, stroke);\n break;\n case 'line':\n create('line', labels, stroke);\n break;\n case 'ray': {\n // JSXGraph: 'line' with straightFirst:false, straightLast:true\n create('line', labels, { ...stroke, straightFirst: false, straightLast: true });\n break;\n }\n case 'vector':\n create('arrow', labels, stroke);\n break;\n case 'perpendicular': {\n // [point, line] in that order; JSXGraph perpendicular expects (line, point)\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('perpendicular', [l, p], stroke);\n break;\n }\n case 'parallel': {\n const [p, l] = picks[0] && objKind(picks[0]) === 'point' ? [labels[0], labels[1]] : [labels[1], labels[0]];\n create('parallel', [l, p], stroke);\n break;\n }\n case 'perpBisector': {\n // JSXGraph 1.12.x doesn't register a `perpendicularbisector` element\n // (only `perpendicular`, `perpendicularpoint`, `perpendicularsegment`).\n // Build it from primitives: midpoint M of P1P2, then a perpendicular\n // line to the segment P1P2 through M. Helpers are invisible but logged\n // so deserialize-on-reload reconstructs the dependency chain.\n const mid = create('midpoint', labels, { visible: false, withLabel: false, name: '' });\n const seg = create('segment', labels, { visible: false, withLabel: false });\n const midId = localIdOf(mid);\n const segId = localIdOf(seg);\n if (midId && segId) create('perpendicular', [segId, midId], stroke);\n break;\n }\n case 'angleBisector':\n create('bisector', labels, stroke);\n break;\n case 'circleCenter':\n create('circle', labels, strokeOnly);\n break;\n case 'circle3':\n create('circumcircle', labels, strokeOnly);\n break;\n case 'tangent': {\n // Need to find the actual point pick (not just by slot index) since\n // the user can click circle-then-point OR point-then-circle.\n const firstIsPoint = picks[0] && objKind(picks[0]) === 'point';\n const pointPick = firstIsPoint ? picks[0] : picks[1];\n const circleLabel = firstIsPoint ? labels[1] : labels[0];\n if (!pointPick || !circleLabel) break;\n const px = typeof pointPick.X === 'function' ? pointPick.X() : 0;\n const py = typeof pointPick.Y === 'function' ? pointPick.Y() : 0;\n const glider = create('glider', [px, py, circleLabel], { name: '', size: 2, strokeColor: '#666', visible: false });\n const gid = localIdOf(glider);\n if (gid) create('tangent', [gid], stroke);\n break;\n }\n case 'angle': {\n // JSXGraph vẽ cung từ BA → BC theo chiều dương (ngược chiều kim đồng hồ).\n // Nếu cross(BA, BC) < 0 thì cung CCW từ BA → BC > 180° → đổi vai trò A,C\n // để luôn hiển thị góc nhọn/tù thay vì góc phản (reflex).\n const [pa, pb, pc] = picks;\n let order: string[] = labels;\n try {\n const ax = pa.X() - pb.X(), ay = pa.Y() - pb.Y();\n const cx = pc.X() - pb.X(), cy = pc.Y() - pb.Y();\n const cross = ax * cy - ay * cx;\n if (cross < 0) order = [labels[2], labels[1], labels[0]];\n } catch { /* fallback giữ thứ tự */ }\n create('angle', order, {\n radius: 1,\n fillColor: '#22c55e',\n fillOpacity: 0.25,\n strokeColor: '#16a34a',\n strokeWidth: 1.5,\n name: '',\n withLabel: false,\n });\n break;\n }\n case 'distance': {\n const pA = picks[0], pB = picks[1];\n const dist = Math.hypot((pA.X() - pB.X()), (pA.Y() - pB.Y()));\n const midX = (pA.X() + pB.X()) / 2;\n const midY = (pA.Y() + pB.Y()) / 2;\n create('text', [midX, midY, `d = ${dist.toFixed(2)}`], { fontSize: 14, color: '#dc2626' });\n break;\n }\n case 'polygon': {\n create('polygon', labels, { fillColor: '#1e3a8a', fillOpacity: 0.10, borders: { strokeColor: '@stroke', strokeWidth: 2 } });\n break;\n }\n case 'area': {\n create('polygon', labels, { fillColor: '#3b82f6', fillOpacity: 0.18, borders: { strokeColor: '#1d4ed8', strokeWidth: 2 } });\n break;\n }\n case 'toggleLabel': {\n const obj = picks[0];\n try {\n if (obj.label) {\n const visible = obj.label.visProp.visible !== false;\n obj.label.setAttribute({ visible: !visible });\n } else if (obj.setAttribute) {\n // For elements without explicit label, toggle 'withLabel'\n const cur = obj.visProp.withlabel !== false;\n obj.setAttribute({ withLabel: !cur });\n }\n boardRef.current.update();\n } catch { /* ignore */ }\n break;\n }\n case 'toggleVisible': {\n const obj = picks[0];\n try {\n const visible = obj.visProp.visible !== false;\n obj.setAttribute({ visible: !visible });\n boardRef.current.update();\n } catch { /* ignore */ }\n break;\n }\n case 'delete': {\n const obj = picks[0];\n try {\n boardRef.current.removeObject(obj);\n // JSXGraph cascade-removes dependents (e.g. xoá point → segment dùng\n // point đó cũng biến mất). Đồng bộ log: walk objMap, giữ lại id nào\n // vẫn còn trong board.objects; còn lại drop khỏi log + map. Trước\n // patch, chỉ entry chính bị xoá → log dangling reference, replay sẽ\n // throw vì id phụ thuộc không resolve được.\n const board = boardRef.current;\n const aliveIds = new Set<string>();\n for (const [id, o] of objMapRef.current.entries()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jxgId = (o as any)?.id;\n if (jxgId && board && board.objects && board.objects[jxgId]) {\n aliveIds.add(id);\n }\n }\n creationLogRef.current = creationLogRef.current.filter((e) => aliveIds.has(e.id));\n for (const id of Array.from(objMapRef.current.keys())) {\n if (!aliveIds.has(id)) objMapRef.current.delete(id);\n }\n setHistoryTick((t) => t + 1);\n } catch { /* ignore */ }\n break;\n }\n }\n }, [create, localIdOf, nextLabel]);\n\n const finalizeTransformCreate = useCallback((\n spec: { params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' }; chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }> },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any,\n ) => {\n if (!boardRef.current) return;\n const def = getDefiningPoints(source);\n if (!def) { flashWarn('Không thể biến đổi đối tượng này'); return; }\n\n // 1. Create + log transform entry/entries. Chain mode (dilate): create N\n // transforms in order, log each, and apply them as an array.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformObjs: any[] = [];\n const transformIds: string[] = [];\n const steps = spec.chain ?? [{ params: spec.params, attrs: spec.attrs }];\n for (const step of steps) {\n const stepLogArgs: unknown[] = [];\n for (const p of step.params) {\n if (typeof p === 'function') {\n flashWarn('Tham số transform không serialize được — bỏ qua');\n return;\n }\n if (p && typeof p === 'object') {\n const id = localIdOf(p);\n if (!id) {\n flashWarn('Đối tượng tham chiếu không nằm trong board — không thể biến đổi');\n return;\n }\n stepLogArgs.push(id);\n } else {\n stepLogArgs.push(p);\n }\n }\n const stepId = nextLocalId();\n const stepObj = boardRef.current.create('transform', step.params, step.attrs);\n creationLogRef.current.push({ id: stepId, type: 'transform', args: stepLogArgs, attrs: step.attrs as Record<string, unknown> });\n objMapRef.current.set(stepId, stepObj);\n transformObjs.push(stepObj);\n transformIds.push(stepId);\n }\n const transformParent = transformObjs.length === 1 ? transformObjs[0] : transformObjs;\n const transformLogRef = transformObjs.length === 1 ? transformIds[0] : transformIds;\n\n // 2. Transform each defining point — log each.\n // JSXGraph signature: create('point', [parentElement, transformation|transformationArray])\n // — SOURCE element first, transformation second. Reversing the order made\n // JSXGraph reject the call (\"Can't create point with parent types 'object'\n // and 'object'\"), crashing the rotate tool prior to this fix.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transformedPoints: any[] = def.points.map((src) => {\n const srcId = localIdOf(src);\n const id = nextLocalId();\n const srcName = typeof src.name === 'string' ? src.name : '';\n const newName = srcName ? `${srcName}'` : nextLabel();\n const attrs = { name: newName, size: 3, color: '#0ea5e9', strokeColor: '#0ea5e9', fillColor: '#0ea5e9' };\n const obj = boardRef.current!.create('point', [src, transformParent], attrs);\n creationLogRef.current.push({ id, type: 'point', args: [srcId ?? src, transformLogRef], attrs });\n objMapRef.current.set(id, obj);\n return obj;\n });\n\n // 3. Recreate same-kind object from transformed points\n const baseStyle = { ...def.attrs, strokeColor: '#0ea5e9' };\n const strokeOnly = { ...baseStyle, fillColor: 'none', fillOpacity: 0 };\n const ids = transformedPoints.map((p) => localIdOf(p)).filter((s): s is string => !!s);\n switch (def.kind) {\n case 'point': /* nothing — already created */ break;\n case 'segment': create('segment', ids, baseStyle); break;\n case 'line': create('line', ids, baseStyle); break;\n case 'ray': create('line', ids, { ...baseStyle, straightFirst: false, straightLast: true }); break;\n case 'arrow': create('arrow', ids, baseStyle); break;\n case 'circleCenter': create('circle', ids, strokeOnly); break;\n case 'circle3': create('circumcircle', ids, strokeOnly); break;\n }\n setHistoryTick((t) => t + 1);\n }, [create, flashWarn, localIdOf, nextLabel, nextLocalId]);\n\n // Undo: remove the most recently logged creation. Also clears any in-progress\n // polygon construction (pending picks + preview segments) so state is sane.\n const undoLast = useCallback(() => {\n const b = boardRef.current;\n if (!b) return;\n while (creationLogRef.current.length > 0) {\n const last = creationLogRef.current.pop();\n if (!last) break;\n const obj = objMapRef.current.get(last.id);\n objMapRef.current.delete(last.id);\n if (obj) {\n try { b.removeObject(obj); } catch { /* ignore */ }\n clearPending();\n setHistoryTick((t) => t + 1);\n try { b.update(); } catch { /* ignore */ }\n return;\n }\n // Skip stale log entry (object already gone) and continue popping\n }\n setHistoryTick((t) => t + 1);\n }, [clearPending]);\n\n // Global Ctrl/Cmd+Z + Esc while the panel is mounted. Skipped when focus is\n // in a text input so we don't hijack other undo flows. Capture phase + stop\n // propagation so Excalidraw's underlying undo doesn't also fire when the\n // panel is open on top of the whiteboard. Esc cancels in-progress picks.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z' && !e.shiftKey) {\n if (inField) return;\n e.preventDefault();\n e.stopPropagation();\n undoLastRef.current();\n return;\n }\n if (e.key === 'Escape' && !inField) {\n if (pendingRef.current.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearPendingRef.current();\n }\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n clearSelectionRef.current();\n }\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && !inField) {\n if (selectedSetRef.current.size > 0) {\n e.preventDefault();\n e.stopPropagation();\n deleteSelectedRef.current();\n }\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, []);\n\n // Translate a pointer event into JSXGraph SVG-pixel coords (the coord system\n // `hasPoint` uses). Falls back to manual rect math if `getMousePosition` is\n // unavailable (e.g. in tests with a mocked board).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const screenCoordsOf = useCallback((evt: any): [number, number] | null => {\n const b = boardRef.current;\n if (!b) return null;\n try {\n const mp = b.getMousePosition ? b.getMousePosition(evt) : null;\n if (mp && mp.length >= 2) return [mp[0], mp[1]];\n } catch { /* fall through */ }\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const cx = evt.clientX ?? evt.touches?.[0]?.clientX ?? 0;\n const cy = evt.clientY ?? evt.touches?.[0]?.clientY ?? 0;\n return [cx - rect.left, cy - rect.top];\n }\n return null;\n }, []);\n\n // Find which JSXGraph object (if any) is at a given pointer event.\n // JSXGraph's `hasPoint` expects coords in the board's SVG pixel space, not\n // viewport-relative clientX/Y. Without this, hits are offset by the\n // container's page position and existing points never snap.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const objectsAt = useCallback((evt: any): JxgObj[] => {\n const b = boardRef.current;\n if (!b) return [];\n const sc = screenCoordsOf(evt);\n if (!sc) return [];\n const [sx, sy] = sc;\n const list: JxgObj[] = [];\n try {\n const objs = b.objectsList || [];\n for (const o of objs) {\n try {\n if (o.hasPoint && o.hasPoint(sx, sy)) list.push(o);\n } catch { /* ignore */ }\n }\n } catch { /* ignore */ }\n return list;\n }, [screenCoordsOf]);\n\n // Generous point-snap: JSXGraph's `hasPoint` for a point uses the visual\n // radius (~3px) which is too strict for click targeting. When a tool needs\n // a point pick, fall back to \"nearest point within tolPx pixels\".\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const findNearestPoint = useCallback((evt: any, tolPx: number = 12): JxgObj | null => {\n const b = boardRef.current;\n if (!b) return null;\n const sc = screenCoordsOf(evt);\n if (!sc) return null;\n const [sx, sy] = sc;\n const tol2 = tolPx * tolPx;\n let best: { obj: JxgObj; d2: number } | null = null;\n try {\n const objs = b.objectsList || [];\n for (const o of objs) {\n try {\n if (objKind(o) !== 'point') continue;\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n const dx = pc[1] - sx;\n const dy = pc[2] - sy;\n const d2 = dx * dx + dy * dy;\n if (d2 <= tol2 && (!best || d2 < best.d2)) best = { obj: o, d2 };\n } catch { /* ignore */ }\n }\n } catch { /* ignore */ }\n return best ? best.obj : null;\n }, [screenCoordsOf]);\n\n // Label-aware snap: if the click landed on a JSXGraph text label (drawn near\n // each named element with `display:'internal'`), follow it back to the owning\n // element. Without this, clicking the \"A\" label of a point with the segment\n // tool falls through to `findNearestPoint` and — when the label center is\n // beyond the 12 px tolerance — creates a duplicate point right next to A.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const promoteLabel = useCallback((o: JxgObj): JxgObj => {\n if (!o) return o;\n const t = (o.elType || o.type || '').toString().toLowerCase();\n if (t !== 'text') return o;\n const b = boardRef.current;\n if (!b) return o;\n try {\n for (const c of (b.objectsList || [])) {\n if (c.label === o) return c;\n }\n } catch { /* ignore */ }\n return o;\n }, []);\n\n // Pending transform state for rotate/dilate/regularPolygon (needs param popover)\n interface PendingTransform {\n tool: 'rotate' | 'dilate' | 'regularPolygon';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n center: any;\n anchorScreen: { x: number; y: number };\n }\n const pendingTransformRef = useRef<PendingTransform | null>(null);\n type TransformPopoverInfo = { tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null;\n const transformSubsRef = useRef<Set<(info: TransformPopoverInfo) => void>>(new Set());\n const emitTransform = useCallback((info: TransformPopoverInfo) => {\n transformSubsRef.current.forEach((cb) => { try { cb(info); } catch { /* ignore */ } });\n }, []);\n\n // Selection subscribers — emitted when Move tool single-clicks an object\n const selectSubsRef = useRef<Set<(snap: ObjectSnapshot) => void>>(new Set());\n const emitSelect = useCallback((snap: ObjectSnapshot) => {\n selectSubsRef.current.forEach((cb) => { try { cb(snap); } catch { /* ignore */ } });\n }, []);\n\n // Track pointer-down position for click vs drag detection in Move tool\n const moveDownRef = useRef<{ sx: number; sy: number } | null>(null);\n // Track previous Move-tool click for double-click detection (open popover only\n // on 2nd click within 400ms on the same object).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const lastMoveClickRef = useRef<{ obj: any | null; time: number }>({ obj: null, time: 0 });\n\n // Initialize board\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n (async () => {\n const JXG = (await import('jsxgraph')).default;\n if (cancelled || !containerRef.current) return;\n jxgRef.current = JXG;\n // Render text/labels as SVG <text> (default 'html' uses absolute-positioned\n // <div> overlays, which are NOT captured when we clone the SVG to export\n // the stamp → labels disappear in inserted image).\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n // Label tone theo theme — JSXGraph mặc định stroke black cho text label.\n opts.label.strokeColor = themeLabel(isDarkRef.current);\n opts.text.strokeColor = themeLabel(isDarkRef.current);\n }\n } catch { /* ignore */ }\n const board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: initialState?.bbox ?? [-10, 10, 10, -10],\n axis: false, // We manage axis manually via toggle for clean default\n grid: false,\n showCopyright: false,\n showNavigation: true,\n // Keep 1:1 user→pixel ratio so circles stay circular regardless of the\n // container aspect ratio (Excalidraw panel is taller than wide and\n // without this circles became ellipses after reload).\n keepAspectRatio: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: true },\n // Looser hit-test radius so clicking on a thin segment/line/circle\n // actually registers without pixel-perfect aim. `precision` is a real\n // JSXGraph option (Options.precision) but isn't in the d.ts file.\n ...({ precision: { hasPoint: 8, mouse: 4, touch: 16 } } as Record<string, unknown>),\n });\n boardRef.current = board;\n\n // Replay initial state if any\n if (initialState && initialState.elements.length > 0) {\n const idMap = objMapRef.current;\n for (const el of initialState.elements) {\n const resolved = el.args.map(a => (typeof a === 'string' && idMap.has(a)) ? idMap.get(a) : a);\n try {\n if (el.type === 'valueLabel') {\n // Synthetic: regenerate dynamic text gắn với target.\n const target = resolved[0];\n if (target) {\n const txt = createValueLabelFor(target);\n if (txt) {\n idMap.set(el.id, txt);\n valueLabelsRef.current.set(target, txt);\n }\n }\n continue;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, paletteFor(isDarkRef.current));\n const obj = board.create(el.type, resolved, themedAttrs);\n idMap.set(el.id, obj);\n } catch (err) {\n console.warn('Replay failed for', el.type, err);\n }\n }\n creationLogRef.current = [...initialState.elements];\n labelIdxRef.current = initialState.elements.filter(e => e.type === 'point').length;\n }\n\n // Initial axis/grid\n if (showAxisRef.current) {\n try {\n axisObjsRef.current.x = board.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = board.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n } catch { /* ignore */ }\n }\n if (showGridRef.current) {\n try { board.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 }); } catch { /* ignore */ }\n }\n\n // Pointer down: handle click-driven tool actions.\n // Full dispatch logic lives in handlers.ts (handleDown). A stable ctx\n // object is built here so the closure captured at mount stays thin.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('down', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleDown(ctx, e);\n });\n\n // Pointer up: DOUBLE-click on Move tool emits selection. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('up', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleUp(ctx, e);\n });\n\n // Mouse move: update phantom + marquee. Full logic in handlers.ts.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board.on('move', (e: any) => {\n const ctx: HandlerCtx = {\n boardRef, toolRef, pendingRef, previewSegRef, axisObjsRef, selectedSetRef,\n marqueeRef, moveDownRef, lastMoveClickRef, pendingTransformRef,\n phantomRef, previewShapeRef, previewRafRef, jxgRef,\n screenCoordsOf, objectsAt, promoteLabel, findNearestPoint,\n toggleSelect, clearSelection, applySelectionStyle,\n localIdOf, nextLabel, create, finalize, finalizeTransformCreate,\n clearPending, clearPreviewSegs, refreshPreview, flashWarn,\n emitTransform, snapshotObject, emitSelect,\n setPendingCount, setSelectionTick,\n };\n handleMove(ctx, e);\n });\n\n onReady({\n getContainer: () => containerRef.current,\n getCreationLog: () => [...creationLogRef.current],\n getBbox: () => boardRef.current ? boardRef.current.getBoundingBox() : [-10, 10, 10, -10],\n getShowAxis: () => showAxisRef.current,\n getShowGrid: () => showGridRef.current,\n setTool: (t: GeomTool) => handleToolChangeRef.current(t),\n getTool: () => toolRef.current,\n setShowAxis: (b: boolean) => setShowAxisRef.current(b),\n setShowGrid: (b: boolean) => setShowGridRef.current(b),\n undo: () => undoLastRef.current(),\n canUndo: () => creationLogRef.current.length > 0,\n subscribe: (cb: () => void) => {\n subscribersRef.current.add(cb);\n return () => { subscribersRef.current.delete(cb); };\n },\n snapshotObject,\n mutateObject,\n getAllPointNames: () => {\n const b = boardRef.current;\n if (!b) return [];\n const out: string[] = [];\n try {\n const objs = b.objectsList || [];\n for (const o of objs) {\n if (objKind(o) === 'point' && typeof o.name === 'string' && o.name) {\n out.push(o.name);\n }\n }\n } catch { /* ignore */ }\n return out;\n },\n onSelect: (cb: (snap: ObjectSnapshot) => void) => {\n selectSubsRef.current.add(cb);\n return () => { selectSubsRef.current.delete(cb); };\n },\n onTransformParam: (cb: (info: TransformPopoverInfo) => void) => {\n transformSubsRef.current.add(cb);\n return () => { transformSubsRef.current.delete(cb); };\n },\n confirmTransformParam: (value: number) => {\n const p = pendingTransformRef.current;\n if (!p) return;\n if (p.tool === 'regularPolygon') {\n const n = Math.max(3, Math.round(value));\n const p1Id = localIdOf(p.source);\n const p2Id = localIdOf(p.center);\n if (p1Id && p2Id && boardRef.current) {\n try {\n create('regularpolygon', [p1Id, p2Id, n], {\n fillColor: '#1e3a8a',\n fillOpacity: 0.10,\n borders: { strokeColor: '@stroke', strokeWidth: 2 },\n });\n } catch (err) {\n console.warn('regularpolygon failed', err);\n }\n }\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n return;\n }\n const spec = p.tool === 'rotate'\n ? buildTransformSpec({ kind: 'rotate', center: p.center, angleDeg: value })\n : buildTransformSpec({ kind: 'dilate', center: p.center, k: value });\n finalizeTransformCreateRef.current(spec, p.source);\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n cancelTransformParam: () => {\n pendingTransformRef.current = null;\n emitTransformRef.current(null);\n clearPendingRef.current();\n },\n getSelectionSize: () => selectedSetRef.current.size,\n clearSelection: () => clearSelectionRef.current(),\n deleteSelection: () => deleteSelectedRef.current(),\n });\n })();\n return () => {\n cancelled = true;\n if (previewRafRef.current != null) {\n cancelAnimationFrame(previewRafRef.current);\n previewRafRef.current = null;\n }\n if (boardRef.current && jxgRef.current) {\n try { jxgRef.current.JSXGraph.freeBoard(boardRef.current); } catch { /* ignore */ }\n boardRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n // React to axis/grid toggle changes after init\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n try {\n // Remove existing axes if present\n if (axisObjsRef.current.x) { try { b.removeObject(axisObjsRef.current.x); } catch { /* ignore */ } axisObjsRef.current.x = undefined; }\n if (axisObjsRef.current.y) { try { b.removeObject(axisObjsRef.current.y); } catch { /* ignore */ } axisObjsRef.current.y = undefined; }\n if (showAxis) {\n axisObjsRef.current.x = b.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = b.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n }\n b.update();\n } catch { /* ignore */ }\n }, [showAxis]);\n\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n try {\n // Find existing grid objects and remove\n const objs = Object.values(b.objects || {}) as JxgObj[];\n for (const o of objs) {\n if (o && (o.elType === 'grid' || o.type === 'grid' || (o.visProp && o.visProp.type === 'grid'))) {\n try { b.removeObject(o); } catch { /* ignore */ }\n }\n }\n if (showGrid) {\n b.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 });\n }\n b.update();\n } catch { /* ignore */ }\n }, [showGrid]);\n\n const handleToolChange = useCallback((t: GeomTool) => {\n clearPending();\n // Update the ref synchronously so subsequent pointer-down events (e.g. a\n // fast user click immediately after picking a tool) see the new tool\n // without waiting for React's commit phase.\n toolRef.current = t;\n setTool(t);\n // Disable JSXGraph pan while the user is in the select tool so that\n // drag-empty starts a marquee selection instead of panning the board.\n // Re-enable for every other tool (board pan is the default).\n const b = boardRef.current;\n if (b) {\n try {\n if (b.attr?.pan) b.attr.pan.enabled = (t !== 'select');\n } catch { /* ignore */ }\n }\n }, [clearPending]);\n\n // Stable ref so onReady closure (captured at mount) can call latest handler.\n const handleToolChangeRef = useRef(handleToolChange);\n handleToolChangeRef.current = handleToolChange;\n\n // Subscribers thông báo bên ngoài khi state thay đổi (tool / axis / grid / undo)\n const subscribersRef = useRef<Set<() => void>>(new Set());\n const notifySubscribers = useCallback(() => {\n subscribersRef.current.forEach((cb) => {\n try { cb(); } catch { /* ignore */ }\n });\n }, []);\n\n // Phát tín hiệu khi state thay đổi\n useEffect(() => { notifySubscribers(); }, [tool, showAxis, showGrid, historyTick, notifySubscribers]);\n\n const undoLastRef = useRef(undoLast);\n undoLastRef.current = undoLast;\n const clearPendingRef = useRef(clearPending);\n clearPendingRef.current = clearPending;\n const finalizeTransformCreateRef = useRef(finalizeTransformCreate);\n finalizeTransformCreateRef.current = finalizeTransformCreate;\n const clearSelectionRef = useRef(clearSelection);\n clearSelectionRef.current = clearSelection;\n const deleteSelectedRef = useRef(deleteSelected);\n deleteSelectedRef.current = deleteSelected;\n const emitTransformRef = useRef(emitTransform);\n emitTransformRef.current = emitTransform;\n const setShowAxisRef = useRef(setShowAxis);\n setShowAxisRef.current = setShowAxis;\n const setShowGridRef = useRef(setShowGrid);\n setShowGridRef.current = setShowGrid;\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"jxgmini-container\"\n className=\"h-full min-h-0 bg-white\"\n style={{ touchAction: 'none' }}\n />\n );\n};\n","'use client';\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS, GROUP_LABELS, type GeomTool, type ToolDef } from './MiniBoard';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shared shell ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isDark?: boolean;\n}\n\nfunction Shell({ title, icon, onClose, children, isDark }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200`}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Geometry left panel ----------\n\ninterface GeometryLeftPanelProps {\n activeTool: GeomTool;\n onToolChange: (t: GeomTool) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onUndo: () => void;\n canUndo: boolean;\n onClose: () => void;\n isDark?: boolean;\n}\n\nconst GeometryIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport function LeftPanel({\n activeTool,\n onToolChange,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onClose,\n isDark,\n}: GeometryLeftPanelProps) {\n // Group TOOLS by category\n const grouped = TOOLS.reduce<Record<string, ToolDef[]>>((acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n }, {});\n const groupKeys = Object.keys(grouped) as Array<ToolDef['group']>;\n\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: ToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return (\n <>\n <Shell title=\"Hình học\" icon={GeometryIconHeader} onClose={onClose} isDark={isDark}>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxis}\n onChange={(e) => onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n Trục toạ độ\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showGrid}\n onChange={(e) => onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n </button>\n </div>\n </Section>\n\n {groupKeys.map((group) => (\n <Section key={group} label={GROUP_LABELS[group]}>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group].map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'flex h-8 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n </button>\n );\n })}\n </div>\n </Section>\n ))}\n </Shell>\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\n// Alias for back-compat\nexport { LeftPanel as GeometryLeftPanel };\n","// JSXGraph không có built-in getJSON. Component giữ MỘT LOG riêng của các create() call\n// do user trigger, pass log đó vào serializeBoard. Replay = gọi board.create() theo thứ tự log.\n//\n// type === 'transform': args là [refs đến điểm/đường/scalar], attrs là { type: 'translate'|'rotate'|'reflect'|'scale', ... }.\n// Object trả về (kết quả board.create('transform', ...)) được đăng ký vào idMap như mọi element khác\n// để point/line phụ thuộc reference được bằng id ('j5' → JSXGraph transform object).\n//\n// Log lưu màu dưới dạng sentinel ('@stroke', '@axis', '@grid', '@label') để\n// theme-neutral. Khi replay, palette resolve thành màu thực theo `isDark` hiện\n// tại (truyền qua options.palette).\n\nimport { paletteFor, resolveAttrColors, type GeomPalette } from './editor/theme';\n\nexport interface SerializedElement {\n type: string;\n args: unknown[];\n attrs: Record<string, unknown>;\n id: string;\n}\n\nexport interface SerializedBoard {\n bbox: [number, number, number, number];\n elements: SerializedElement[];\n showAxis?: boolean;\n showGrid?: boolean;\n}\n\ninterface BoardLike {\n getBoundingBox(): [number, number, number, number];\n create(type: string, args: unknown[], attrs: Record<string, unknown>): unknown;\n}\n\nexport function serializeBoard(\n board: BoardLike,\n log: SerializedElement[],\n options: { showAxis?: boolean; showGrid?: boolean } = {},\n): SerializedBoard {\n return {\n bbox: board.getBoundingBox(),\n elements: log.map(e => ({ type: e.type, args: e.args, attrs: e.attrs, id: e.id })),\n showAxis: !!options.showAxis,\n showGrid: !!options.showGrid,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction createValueLabel(board: any, target: any): unknown {\n if (!board || !target) return null;\n const e = (target.elType ?? target.type ?? '').toString().toLowerCase();\n if (e === 'segment' || e === 'line' || e === 'arrow') {\n const p1 = target.point1, p2 = target.point2;\n if (!p1 || !p2) return null;\n return board.create('text', [\n () => (p1.X() + p2.X()) / 2 + 0.15,\n () => (p1.Y() + p2.Y()) / 2 + 0.25,\n () => {\n const len = Math.hypot(p2.X() - p1.X(), p2.Y() - p1.Y());\n const name = typeof target.name === 'string' && target.name ? target.name : 'd';\n return `${name} = ${len.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n if (e === 'circle' || e === 'circumcircle') {\n const center = target.center ?? target.midpoint ?? target.point1;\n if (!center) return null;\n return board.create('text', [\n () => center.X() + 0.3,\n () => center.Y() + 0.3,\n () => {\n const r = typeof target.Radius === 'function' ? target.Radius() : 0;\n const name = typeof target.name === 'string' && target.name ? target.name : 'r';\n return `${name} = ${r.toFixed(2)}`;\n },\n ], { fontSize: 12, color: '#dc2626', fixed: true, highlight: false });\n }\n return null;\n}\n\nexport interface DeserializeOptions {\n /** Theme-aware palette để resolve sentinel attrs. Mặc định = light. */\n palette?: GeomPalette;\n}\n\nexport function deserializeIntoBoard(\n board: BoardLike,\n serialized: SerializedBoard,\n options: DeserializeOptions = {},\n): void {\n // Replay: args may contain references to earlier elements by our serialized id (\"j0\", \"j1\"…).\n // We resolve those to actual JSXGraph objects via a local id→object map. Nested\n // arrays are also resolved recursively — needed for dilate, which logs the\n // transform parent of a transformed point as [\"j2\",\"j3\",\"j4\"] (a chain of 3\n // transforms passed to `board.create('point', [src, [t1,t2,t3]])`).\n const palette = options.palette ?? paletteFor(false);\n const idMap = new Map<string, unknown>();\n const resolve = (a: unknown): unknown => {\n if (typeof a === 'string' && idMap.has(a)) return idMap.get(a);\n if (Array.isArray(a)) return a.map(resolve);\n return a;\n };\n for (const el of serialized.elements) {\n const resolvedArgs = el.args.map(resolve);\n if (el.type === 'valueLabel') {\n const target = resolvedArgs[0];\n const txt = createValueLabel(board, target);\n if (txt) idMap.set(el.id, txt);\n continue;\n }\n const themedAttrs = resolveAttrColors({ ...el.attrs }, palette);\n const created = board.create(el.type, resolvedArgs, themedAttrs);\n idMap.set(el.id, created);\n }\n}\n","export function renderGeometryToSvg(boardContainer: HTMLElement): string {\n const svgEl = boardContainer.querySelector('svg');\n if (!svgEl) throw new Error('renderGeometryToSvg: no SVG found in board container');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n return new XMLSerializer().serializeToString(clone);\n}\n","import { renderGeometryToSvg } from './renderInline';\nimport { deserializeIntoBoard, type SerializedBoard } from './serialize';\nimport { paletteFor } from './editor/theme';\n\n/**\n * Re-render geometry SVG từ jsonState đã serialize. Dùng cho:\n * 1. Restore math-stamp file sau khi reload page (Excalidraw mất binary files).\n * 2. Generate SVG lúc INSERT (thay vì clone DOM với màu theo theme editor).\n *\n * LƯU Ý quan trọng — luôn dùng LIGHT palette (nét đậm). Excalidraw apply CSS\n * `filter: invert(93%) hue-rotate(180deg)` lên canvas trong dark mode → nét\n * đậm tự đảo thành sáng. Nếu ta bake nét sáng vào SVG cho dark mode, filter\n * sẽ đảo thành đậm → chìm vào nền tối. Giải pháp: luôn dùng nét đậm + để\n * Excalidraw tự lo invert.\n *\n * Implementation: tạo 1 div ẩn (off-screen, real dimensions để JSXGraph render\n * chuẩn), initBoard, replay creation log từ jsonState, dump SVG, dọn dẹp.\n *\n * Lý do JXG.Options.text.display = 'internal': JSXGraph mặc định render\n * label bằng HTML <div> overlay → clone SVG export sẽ thiếu label.\n */\nexport async function renderGeometrySvgFromState(jsonState: string): Promise<string> {\n const parsed = JSON.parse(jsonState) as SerializedBoard;\n // Stamps inserted vào Excalidraw canvas → luôn dùng light palette.\n // Excalidraw's THEME_FILTER tự đảo nét trong dark mode.\n const palette = paletteFor(false);\n const JXG = (await import('jsxgraph')).default;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (opts) {\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.text.strokeColor = palette.label;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n opts.label.strokeColor = palette.label;\n opts.axis = opts.axis || {};\n opts.axis.strokeColor = palette.axis;\n opts.grid = opts.grid || {};\n opts.grid.strokeColor = palette.grid;\n }\n } catch { /* ignore */ }\n const container = document.createElement('div');\n const containerId = 'jxg_offscreen_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\n container.id = containerId;\n container.style.cssText = 'position:absolute;top:-99999px;left:-99999px;width:400px;height:300px;visibility:hidden;pointer-events:none;';\n document.body.appendChild(container);\n let board: unknown = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board = (JXG as any).JSXGraph.initBoard(containerId, {\n boundingbox: parsed.bbox,\n axis: !!parsed.showAxis,\n grid: !!parsed.showGrid,\n showCopyright: false,\n showNavigation: false,\n keepAspectRatio: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n deserializeIntoBoard(board as any, parsed, { palette });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (board as any).update();\n return renderGeometryToSvg(container);\n } finally {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (board) (JXG as any).JSXGraph.freeBoard(board);\n } catch { /* ignore */ }\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","// 8 màu chính lấy từ Excalidraw DEFAULT_ELEMENT_STROKE_COLOR_PALETTE.\n// Nguồn: @excalidraw/excalidraw — packages/excalidraw/colors.ts (top row chuẩn).\n// Cần đồng bộ tay nếu Excalidraw đổi palette ở major bump.\nexport const STROKE_PALETTE = [\n '#1e1e1e', // black\n '#e03131', // red\n '#e8590c', // orange\n '#f08c00', // yellow\n '#2f9e44', // green\n '#1971c2', // blue\n '#9c36b5', // grape\n '#868e96', // gray\n] as const;\n\nexport type StrokeColor = (typeof STROKE_PALETTE)[number];\n","'use client';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\n\nexport type ObjKind = 'point' | 'line' | 'circle';\nexport type PointFace = 'o' | 'circle' | 'cross' | 'plus';\n\nexport interface PropertyPatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n /** Bật/tắt value-label động (độ dài segment / bán kính circle). */\n valueLabel?: boolean;\n}\n\ninterface CommonProps {\n anchor: { x: number; y: number };\n onClose: () => void;\n onMutate: (patch: PropertyPatch) => void;\n isDark?: boolean;\n /** Trả về danh sách tên point hiện có (để rename auto-disambiguate). */\n getAllNames?: () => string[];\n}\n\ninterface PointProps extends CommonProps {\n kind: 'point';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n currentFace: PointFace;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n}\n\ninterface LineOrCircleProps extends CommonProps {\n kind: 'line' | 'circle';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n /** Có đang hiện value-label động không. */\n currentShowValue?: boolean;\n}\n\ntype Props = PointProps | LineOrCircleProps;\n\nconst DASH_OPTIONS: Array<{ value: number; label: string }> = [\n { value: 0, label: 'Nét liền' },\n { value: 2, label: 'Nét đứt' },\n { value: 1, label: 'Nét chấm' },\n];\n\nconst WIDTH_OPTIONS = [1, 2, 3];\n\nconst FACE_OPTIONS: Array<{ value: PointFace; symbol: string }> = [\n { value: 'o', symbol: '●' },\n { value: 'circle', symbol: '◯' },\n { value: 'cross', symbol: '✕' },\n { value: 'plus', symbol: '✚' },\n];\n\n// Unicode subscript digits — dùng để tự đặt tên duy nhất khi user nhập trùng.\n// Lưu dưới dạng ký tự subscript thì JSXGraph SVG <text> render đúng \"B₂\"\n// như label một glyph, không cần MathJax/KaTeX.\nconst SUB_DIGITS = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉'];\nconst SUB_SET = new Set(SUB_DIGITS);\n\nfunction toSubscript(n: number): string {\n return String(n).split('').map((d) => SUB_DIGITS[+d] ?? d).join('');\n}\n\nfunction stripTrailingSubscript(s: string): string {\n let i = s.length;\n while (i > 0 && SUB_SET.has(s[i - 1])) i--;\n return s.slice(0, i);\n}\n\nfunction disambiguateName(name: string, existing: Set<string>): string {\n if (!name) return name;\n if (!existing.has(name)) return name;\n const base = stripTrailingSubscript(name) || name;\n for (let n = 2; n < 1000; n++) {\n const candidate = base + toSubscript(n);\n if (!existing.has(candidate)) return candidate;\n }\n return name;\n}\n\ntype Section = 'color' | 'style' | 'size' | 'name' | null;\n\n// Inline icons (small, monochrome) — match the visual weight of Excalidraw's\n// floating action bar in the screenshot. All 16px viewBox 24x24.\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n style: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" /></svg>\n ),\n size: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\"><line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\" strokeWidth=\"1\" /><line x1=\"4\" y1=\"13\" x2=\"20\" y2=\"13\" strokeWidth=\"2\" /><line x1=\"4\" y1=\"17\" x2=\"20\" y2=\"17\" strokeWidth=\"3.2\" /></svg>\n ),\n name: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><text x=\"2\" y=\"17\" fontSize=\"14\" fontFamily=\"serif\" fontWeight=\"700\">A</text><text x=\"12\" y=\"17\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\">a</text></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\" /><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" /><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" /><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" /></svg>\n ),\n};\n\nexport const PropertiesPopover: React.FC<Props> = (props) => {\n const { anchor, onClose, onMutate, isDark, getAllNames } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n\n const initialName =\n props.kind === 'point' ? props.currentName : (props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const [name, setName] = useState<string>(initialName);\n // Khi popover mở lại trên đối tượng khác, đồng bộ name input.\n useEffect(() => {\n setName(initialName);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialName]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n const onMouseDown = (e: MouseEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('mousedown', onMouseDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('mousedown', onMouseDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const pickColor = (c: string) => {\n onMutate({ attrs: { strokeColor: c, fillColor: props.kind === 'circle' ? 'none' : c, color: c } });\n };\n const pickDash = (d: number) => onMutate({ attrs: { dash: d } });\n const pickWidth = (w: number) => onMutate({ attrs: { strokeWidth: w } });\n const pickFace = (f: PointFace) => onMutate({ attrs: { face: f } });\n\n const currentName = (props.kind === 'point' || props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const commitName = () => {\n const trimmed = name.trim();\n if (trimmed === currentName) return;\n // Cho phép xoá tên (empty); chỉ disambiguate khi user nhập 1 cái gì đó.\n let final = trimmed;\n if (trimmed) {\n const others = new Set((getAllNames?.() ?? []).filter((n) => n !== currentName));\n final = disambiguateName(trimmed, others);\n }\n if (final !== name) setName(final);\n onMutate({ attrs: { name: final } });\n };\n\n const toggleShowLabel = (next: boolean) => onMutate({ attrs: { withLabel: next } });\n const toggleShowValue = (next: boolean) => onMutate({ valueLabel: next });\n\n const doDelete = () => { onMutate({ remove: true }); onClose(); };\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n\n const currentColor = props.currentColor;\n const currentDash = props.currentDash;\n const currentWidth = props.currentWidth;\n\n if (typeof document === 'undefined') return null;\n\n // Pill toolbar: row of icon buttons, separator before trash. Click một icon\n // để bung panel chi tiết bên dưới. Trash xoá ngay (không có panel).\n const PillBtn = ({ id, label, icon, active, onClick, indicatorColor }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean;\n onClick: () => void; indicatorColor?: string;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n {indicatorColor && (\n <span\n aria-hidden\n className=\"absolute bottom-0.5 left-1/2 -translate-x-1/2 h-1 w-4 rounded-full\"\n style={{ background: indicatorColor }}\n />\n )}\n </button>\n );\n\n const colorIndicatorTint = useMemo(() => currentColor, [currentColor]);\n\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: anchor.x, top: anchor.y }}\n role=\"dialog\"\n aria-label=\"Thuộc tính đối tượng\"\n >\n {/* Pill toolbar */}\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <PillBtn id=\"color\" label=\"Màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} indicatorColor={colorIndicatorTint} />\n <PillBtn id=\"style\" label=\"Kiểu\" icon={Icons.style} active={section === 'style'} onClick={() => toggleSection('style')} />\n <PillBtn id=\"size\" label=\"Độ dày\" icon={Icons.size} active={section === 'size'} onClick={() => toggleSection('size')} />\n <PillBtn id=\"name\" label=\"Tên\" icon={Icons.name} active={section === 'name'} onClick={() => toggleSection('name')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {/* Sub-panel — chỉ hiện khi user chọn 1 icon */}\n {section && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n {section === 'color' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => pickColor(c)}\n className={`h-6 w-6 rounded border ${currentColor === c ? 'border-emerald-500 ring-2 ring-emerald-300' : 'border-slate-200'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Kiểu</span>\n {props.kind === 'point' ? (\n <div className=\"flex gap-1\">\n {FACE_OPTIONS.map((f) => (\n <button\n key={f.value}\n aria-label={`Hình ${f.value}`}\n onClick={() => pickFace(f.value)}\n className={`h-7 w-7 rounded border text-sm ${(props as PointProps).currentFace === f.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {f.symbol}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex gap-1\">\n {DASH_OPTIONS.map((d) => (\n <button\n key={d.value}\n aria-label={`Kiểu ${d.label.toLowerCase()}`}\n onClick={() => pickDash(d.value)}\n className={`flex-1 rounded border px-1 py-1 text-[11px] ${currentDash === d.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {d.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {section === 'size' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Độ dày</span>\n <div className=\"flex gap-1\">\n {WIDTH_OPTIONS.map((w) => (\n <button\n key={w}\n aria-label={`Độ dày ${w}`}\n onClick={() => pickWidth(w)}\n className={`flex-1 rounded border py-1 ${currentWidth === w ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n <span className=\"inline-block rounded bg-slate-800\" style={{ width: 30, height: w }} />\n </button>\n ))}\n </div>\n </div>\n )}\n\n {section === 'name' && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Tên</span>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitName}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitName(); } }}\n autoFocus\n placeholder={props.kind === 'point' ? 'A, B, …' : props.kind === 'line' ? 'a, b, f, …' : 'O, c, …'}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <span className=\"text-[10px] text-slate-400\">Trùng tên sẽ tự thêm chỉ số (B → B₂)</span>\n </div>\n\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị tên</span>\n <input\n type=\"checkbox\"\n checked={props.currentShowLabel !== false}\n onChange={(e) => toggleShowLabel(e.target.checked)}\n aria-label=\"Hiển thị tên\"\n />\n </label>\n\n {(props.kind === 'line' || props.kind === 'circle') && (\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị giá trị</span>\n <input\n type=\"checkbox\"\n checked={!!(props as LineOrCircleProps).currentShowValue}\n onChange={(e) => toggleShowValue(e.target.checked)}\n aria-label=\"Hiển thị giá trị\"\n />\n </label>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ParamKind = 'rotate' | 'dilate' | 'regularPolygon';\n\ninterface Props {\n kind: ParamKind;\n anchor: { x: number; y: number };\n defaultValue: number;\n onConfirm: (value: number) => void;\n onCancel: () => void;\n isDark?: boolean;\n}\n\nconst LABELS: Record<ParamKind, { aria: string; label: string; step: number; min?: number }> = {\n rotate: { aria: 'Góc quay', label: 'Góc (°)', step: 15 },\n dilate: { aria: 'Tỷ số k', label: 'Tỷ số k', step: 0.5 },\n regularPolygon: { aria: 'Số cạnh đa giác đều', label: 'Số cạnh (n ≥ 3)', step: 1, min: 3 },\n};\n\nexport const TransformParamPopover: React.FC<Props> = ({ kind, anchor, defaultValue, onConfirm, onCancel, isDark }) => {\n const [value, setValue] = useState<number>(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const meta = LABELS[kind];\n\n useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n\n const submit = () => {\n let v = Number.isFinite(value) ? value : defaultValue;\n if (kind === 'regularPolygon') {\n v = Math.max(3, Math.round(v));\n }\n onConfirm(v);\n };\n\n if (typeof document === 'undefined') return null;\n\n const node = (\n <div\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-2 rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5`}\n style={{ left: anchor.x, top: anchor.y, minWidth: 180 }}\n role=\"dialog\"\n aria-label={meta.aria}\n >\n <label className=\"text-xs font-medium text-slate-700\">{meta.label}</label>\n <input\n ref={inputRef}\n type=\"number\"\n value={value}\n step={meta.step}\n min={meta.min}\n onChange={(e) => setValue(parseFloat(e.target.value))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n else if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={onCancel}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-xs text-slate-700 hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={submit}\n className=\"rounded bg-emerald-600 px-2 py-1 text-xs font-medium text-white hover:bg-emerald-700\"\n >\n Áp dụng\n </button>\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { JSXGraphMiniBoard, type MiniBoardHandle, type GeomTool, type ObjectSnapshot } from './MiniBoard';\nimport { serializeBoard, type SerializedBoard } from '../serialize';\nimport { renderGeometrySvgFromState } from '../render';\nimport { PropertiesPopover } from './PropertiesPopover';\nimport { TransformParamPopover } from './TransformParamPopover';\n\ninterface Props {\n initialState: SerializedBoard | null;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Khi true, panel position offset left để chừa chỗ cho StampLeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Callback khi handle/state thay đổi — parent sync LeftPanel state. */\n onStateChange?: (state: GeomBoardState) => void;\n isDark?: boolean;\n}\n\nexport interface GeomBoardState {\n tool: GeomTool;\n showAxis: boolean;\n showGrid: boolean;\n canUndo: boolean;\n}\n\nexport interface GeometryEditorPanelHandle {\n setTool: (t: GeomTool) => void;\n setShowAxis: (b: boolean) => void;\n setShowGrid: (b: boolean) => void;\n undo: () => void;\n /** Trigger Chèn programmatically (cho auto-insert khi click outside). */\n insert: () => boolean;\n /** Có nội dung để chèn không? */\n hasContent: () => boolean;\n}\n\nexport const GeometryEditorPanel = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanel({ initialState, onInsert, onClose, withLeftPanel = false, onStateChange, isDark }, ref) {\n const handleRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [propsPopover, setPropsPopover] = useState<ObjectSnapshot | null>(null);\n const [transformPopover, setTransformPopover] = useState<{ tool: 'rotate' | 'dilate' | 'regularPolygon'; anchor: { x: number; y: number } } | null>(null);\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => { onStateChangeRef.current = onStateChange; }, [onStateChange]);\n\n const emitState = useCallback(() => {\n const h = handleRef.current;\n const cb = onStateChangeRef.current;\n if (!h || !cb) return;\n cb({\n tool: h.getTool(),\n showAxis: h.getShowAxis(),\n showGrid: h.getShowGrid(),\n canUndo: h.canUndo(),\n });\n }, []);\n\n const handleReady = useCallback((h: MiniBoardHandle) => {\n handleRef.current = h;\n setReady(true);\n emitState();\n // Subscribe để parent biết khi nào tool/axis/grid/undo thay đổi\n h.subscribe(emitState);\n h.onSelect((snap: ObjectSnapshot) => setPropsPopover(snap));\n h.onTransformParam((info) => setTransformPopover(info));\n }, [emitState]);\n\n // Build serialized state (sentinels intact) — async vì SVG render offscreen\n // với light palette để Excalidraw filter tự đảo khi dark mode.\n const performInsert = useCallback((): boolean => {\n if (!handleRef.current) return false;\n const log = handleRef.current.getCreationLog();\n if (log.length === 0) return false;\n const bbox = handleRef.current.getBbox();\n const showAxis = handleRef.current.getShowAxis();\n const showGrid = handleRef.current.getShowGrid();\n const serialized = serializeBoard(\n { getBoundingBox: () => bbox, create: () => undefined },\n log,\n { showAxis, showGrid },\n );\n const jsonState = JSON.stringify(serialized);\n // Fire-and-forget. Caller (`tryInsert`) chỉ cần biết có nội dung không.\n void (async () => {\n try {\n const svgString = await renderGeometrySvgFromState(jsonState);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n })();\n return true;\n }, [onInsert]);\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n useImperativeHandle(ref, () => ({\n setTool: (t) => handleRef.current?.setTool(t),\n setShowAxis: (b) => handleRef.current?.setShowAxis(b),\n setShowGrid: (b) => handleRef.current?.setShowGrid(b),\n undo: () => handleRef.current?.undo(),\n insert: performInsert,\n hasContent: () => (handleRef.current?.getCreationLog().length ?? 0) > 0,\n }), [performInsert]);\n\n const wrapperStyle: React.CSSProperties = {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học\"\n data-testid=\"geometry-editor-panel\"\n data-stamp-area=\"true\"\n style={wrapperStyle}\n className={`${isDark ? 'theme--dark ' : ''}flex h-[540px] max-h-[85vh] w-[640px] max-w-[calc(100vw-280px)] flex-col overflow-hidden rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5`}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"3,18 12,3 21,18\" />\n <circle cx=\"12\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"21\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n Dựng hình học\n </h3>\n <button onClick={onClose} aria-label=\"Đóng\" className=\"rounded p-1 transition hover:bg-white/15\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1\" style={{ height: '420px' }}>\n <JSXGraphMiniBoard\n onReady={handleReady}\n initialState={initialState}\n isDark={isDark}\n />\n </div>\n {propsPopover && (\n propsPopover.kind === 'point' ? (\n <PropertiesPopover\n kind=\"point\"\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentFace={propsPopover.face}\n currentShowLabel={propsPopover.showLabel}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n // Refresh snapshot để UI checkbox phản ánh state mới\n if (typeof patch.valueLabel === 'boolean' || patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n }}\n />\n ) : (\n <PropertiesPopover\n kind={propsPopover.kind}\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentShowLabel={propsPopover.showLabel}\n currentShowValue={propsPopover.showValue}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={() => setPropsPopover(null)}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.obj, patch);\n if (patch.remove) setPropsPopover(null);\n if (typeof patch.valueLabel === 'boolean') {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n if (patch.attrs && 'withLabel' in patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showLabel: !!patch.attrs?.withLabel } : cur);\n }\n }}\n />\n )\n )}\n\n {transformPopover && (\n <TransformParamPopover\n kind={transformPopover.tool}\n anchor={transformPopover.anchor}\n defaultValue={\n transformPopover.tool === 'rotate' ? 90\n : transformPopover.tool === 'dilate' ? 2\n : 6\n }\n isDark={isDark}\n onConfirm={(v) => { handleRef.current?.confirmTransformParam(v); setTransformPopover(null); }}\n onCancel={() => { handleRef.current?.cancelTransformParam(); setTransformPopover(null); }}\n />\n )}\n\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geometry-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n </div>\n );\n },\n);\n","export interface SvgImageResult {\n dataURL: string;\n fileId: string;\n width: number;\n height: number;\n mimeType: 'image/svg+xml';\n}\n\nasync function hashString(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest)).slice(0, 16).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (h1 >>> 0).toString(16).padStart(8, '0') + (h2 >>> 0).toString(16).padStart(8, '0');\n}\n\nfunction parseSize(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n // Fallback: try viewBox\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n return attr === 'width' ? 200 : 100;\n}\n\n// SVG → image element data. Skips canvas rasterization entirely (canvas with\n// foreignObject + external resources gets tainted by browser security model,\n// blocking toDataURL). Excalidraw renders SVG natively via mimeType 'image/svg+xml'.\nexport async function svgToImageElement(svg: string): Promise<SvgImageResult> {\n const width = parseSize(svg, 'width');\n const height = parseSize(svg, 'height');\n // Use UTF-8 safe base64 encoding (btoa fails on non-Latin1 chars)\n const utf8 = unescape(encodeURIComponent(svg));\n const dataURL = 'data:image/svg+xml;base64,' + btoa(utf8);\n const fileId = await hashString(dataURL);\n return { dataURL, fileId, width, height, mimeType: 'image/svg+xml' };\n}\n","import { svgToImageElement } from './svgToImage';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData từ kích thước SVG vừa đo được. Đặt làm factory để\n * các stamp loại khác nhau (geometry cần svgWidth/svgHeight, latex không cần)\n * đều có thể chèn data tuỳ ý.\n */\n makeCustomData: (width: number, height: number) => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. svgToImageElement(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await svgToImageElement(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData(width, height);\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width, height, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { GeometryLeftPanel } from './editor/LeftPanel';\nimport {\n GeometryEditorPanel,\n type GeometryEditorPanelHandle,\n type GeomBoardState,\n} from './editor/EditorPanel';\nimport type { GeomTool } from './editor/MiniBoard';\nimport { insertStampImage } from '../shared/insertImage';\nimport { renderGeometrySvgFromState } from './render';\nimport type { SerializedBoard } from './serialize';\nimport type {\n BaseStampCustomData,\n RestoredStampFile,\n StampHostProps,\n StampHostHandle,\n StampType,\n} from '../shared/types';\n\n// ============== Custom data type + guard ==============\n\nexport interface GeometryCustomData extends BaseStampCustomData {\n kind: 'geometry';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGeometryCustomData(data: unknown): data is GeometryCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<GeometryCustomData>;\n return d.kind === 'geometry' && d.version === 1 && typeof d.jsonState === 'string';\n}\n\n// ============== Host component ==============\n\nconst INITIAL_GEOM_STATE: GeomBoardState = {\n tool: 'move',\n showAxis: false,\n showGrid: false,\n canUndo: false,\n};\n\nconst GeometryStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function GeometryStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GeometryEditorPanelHandle | null>(null);\n const [geomState, setGeomState] = useState<GeomBoardState>(INITIAL_GEOM_STATE);\n\n // Initial state cho editor: parse từ customData nếu đang re-edit, null nếu tạo mới.\n const initialState = useMemo<SerializedBoard | null>(() => {\n if (!editingElement) return null;\n if (!isGeometryCustomData(editingElement.customData)) return null;\n try {\n return JSON.parse(editingElement.customData.jsonState) as SerializedBoard;\n } catch {\n console.warn('GeometryStampHost: customData jsonState corrupted');\n return null;\n }\n }, [editingElement]);\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (width, height): GeometryCustomData => ({\n kind: 'geometry',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <GeometryLeftPanel\n activeTool={geomState.tool}\n onToolChange={(t: GeomTool) => panelRef.current?.setTool(t)}\n showAxis={geomState.showAxis}\n showGrid={geomState.showGrid}\n onShowAxisChange={(b) => panelRef.current?.setShowAxis(b)}\n onShowGridChange={(b) => panelRef.current?.setShowGrid(b)}\n onUndo={() => panelRef.current?.undo()}\n canUndo={geomState.canUndo}\n onClose={onClose}\n isDark={isDark}\n />\n <GeometryEditorPanel\n ref={panelRef}\n initialState={initialState}\n onInsert={handleInsert}\n onClose={onClose}\n onStateChange={setGeomState}\n withLeftPanel\n isDark={isDark}\n />\n </>\n );\n },\n);\n\n// ============== Stamp definition ==============\n\nconst GeometryIcon = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport const geometryStamp: StampType = {\n kind: 'geometry',\n shortcutKey: 'g',\n toolbarLabel: 'G',\n toolbarTitle: 'Chèn hình học (G)',\n toolbarIcon: GeometryIcon,\n toolbarTestId: 'stamp-toolbar-geometry',\n matchesCustomData: isGeometryCustomData,\n async renderSvgFromCustomData(data) {\n if (!isGeometryCustomData(data)) {\n throw new Error('geometryStamp.renderSvgFromCustomData: customData không phải geometry');\n }\n return renderGeometrySvgFromState(data.jsonState);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as GeometryCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGeometryCustomData(data)) return null;\n const svgString = await renderGeometrySvgFromState(data.jsonState);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL = 'data:image/svg+xml;base64,' + (\n typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64')\n );\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: GeometryStampHost,\n};\n","'use client';\n\nimport React from 'react';\n\n// ---------- Shared shell (latex copy — geometry copy stays in src/stamp/StampLeftPanel.tsx) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n}\n\nfunction Shell({ title, icon, onClose, children }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n className=\"absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200\"\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- LaTeX left panel ----------\n\ninterface LatexLeftPanelProps {\n displayMode: boolean;\n onDisplayModeChange: (b: boolean) => void;\n onInsertSnippet: (snippet: string) => void;\n onClose: () => void;\n}\n\ninterface SnippetDef {\n label: string;\n preview: string;\n snippet: string;\n}\n\nconst SNIPPETS: { group: string; items: SnippetDef[] }[] = [\n {\n group: 'Phân số & luỹ thừa',\n items: [\n { label: 'Phân số', preview: 'a⁄b', snippet: '\\\\frac{a}{b}' },\n { label: 'Luỹ thừa', preview: 'x²', snippet: '^{2}' },\n { label: 'Chỉ số', preview: 'x₁', snippet: '_{1}' },\n { label: 'Căn', preview: '√x', snippet: '\\\\sqrt{x}' },\n { label: 'Căn n', preview: 'ⁿ√x', snippet: '\\\\sqrt[n]{x}' },\n ],\n },\n {\n group: 'Tổng & tích phân',\n items: [\n { label: 'Tổng', preview: 'Σ', snippet: '\\\\sum_{i=1}^{n}' },\n { label: 'Tích', preview: 'Π', snippet: '\\\\prod_{i=1}^{n}' },\n { label: 'Tích phân', preview: '∫', snippet: '\\\\int_{a}^{b}' },\n { label: 'Giới hạn', preview: 'lim', snippet: '\\\\lim_{x \\\\to 0}' },\n ],\n },\n {\n group: 'Ký hiệu',\n items: [\n { label: 'α', preview: 'α', snippet: '\\\\alpha' },\n { label: 'β', preview: 'β', snippet: '\\\\beta' },\n { label: 'π', preview: 'π', snippet: '\\\\pi' },\n { label: 'θ', preview: 'θ', snippet: '\\\\theta' },\n { label: '≠', preview: '≠', snippet: '\\\\neq' },\n { label: '≤', preview: '≤', snippet: '\\\\leq' },\n { label: '≥', preview: '≥', snippet: '\\\\geq' },\n { label: '∞', preview: '∞', snippet: '\\\\infty' },\n { label: '→', preview: '→', snippet: '\\\\to' },\n ],\n },\n];\n\nexport function LeftPanel({\n displayMode,\n onDisplayModeChange,\n onInsertSnippet,\n onClose,\n}: LatexLeftPanelProps) {\n return (\n <Shell title=\"Công thức LaTeX\" icon=\"∑\" onClose={onClose}>\n <Section label=\"Chế độ hiển thị\">\n <div className=\"grid grid-cols-2 gap-1.5\">\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(false)}\n aria-pressed={!displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n !displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Inline</span>\n <span className=\"block text-[10px] text-slate-500\">$ ... $</span>\n </button>\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(true)}\n aria-pressed={displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Block</span>\n <span className=\"block text-[10px] text-slate-500\">$$ ... $$</span>\n </button>\n </div>\n </Section>\n\n {SNIPPETS.map((group) => (\n <Section key={group.group} label={group.group}>\n <div className=\"flex flex-wrap gap-1\">\n {group.items.map((s) => (\n <button\n key={s.snippet}\n type=\"button\"\n onClick={() => onInsertSnippet(s.snippet)}\n title={s.snippet}\n className=\"rounded border border-slate-200 bg-white px-2 py-1 text-xs text-slate-700 transition hover:border-emerald-300 hover:bg-emerald-50 hover:text-emerald-700\"\n >\n {s.preview}\n </button>\n ))}\n </div>\n </Section>\n ))}\n\n <Section label=\"Phím tắt\">\n <div className=\"flex flex-wrap gap-2 text-[11px] text-slate-600\">\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Enter</kbd>\n chèn\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Esc</kbd>\n đóng\n </span>\n </div>\n </Section>\n </Shell>\n );\n}\n\n// Back-compat alias\nexport { LeftPanel as LatexLeftPanel };\n","let cachedCss: string | null = null;\n\n// Absolute origin để inlined CSS có thể load fonts khi SVG render trong\n// Excalidraw / image context (relative paths fail trong nested URL contexts).\nfunction absoluteOrigin(): string {\n if (typeof window !== 'undefined' && window.location) return window.location.origin;\n return '';\n}\n\nasync function loadKatexCss(): Promise<string> {\n if (cachedCss !== null) return cachedCss;\n try {\n if (typeof fetch === 'function') {\n const res = await fetch('/katex.min.css');\n if (res.ok) {\n let css = await res.text();\n // Rewrite relative font URLs → absolute origin URLs.\n // KaTeX CSS uses url(fonts/...) — relative to /katex.min.css → /fonts/...\n // Trong SVG <foreignObject> được render thành image, relative resolves\n // tới page URL (/room/...) thay vì root, gây 404.\n const origin = absoluteOrigin();\n if (origin) {\n css = css.replace(/url\\((['\"]?)(fonts\\/)/g, `url($1${origin}/$2`);\n }\n cachedCss = css;\n return css;\n }\n }\n } catch {\n /* ignore */\n }\n cachedCss = '';\n return '';\n}\n\nexport async function renderLatexToSvg(src: string, displayMode: boolean): Promise<string> {\n const katex = await import('katex');\n const html = katex.default.renderToString(src, { displayMode, throwOnError: true, output: 'html' });\n\n const measureDiv = document.createElement('div');\n measureDiv.style.cssText = 'position:absolute;top:-9999px;left:-9999px;visibility:hidden;display:inline-block;';\n measureDiv.innerHTML = html;\n document.body.appendChild(measureDiv);\n const rect = measureDiv.getBoundingClientRect();\n const width = Math.ceil(rect.width) || 50;\n const height = Math.ceil(rect.height) || 20;\n document.body.removeChild(measureDiv);\n\n const cssText = await loadKatexCss();\n\n // KaTeX render với text màu đen mặc định. Excalidraw apply CSS filter\n // invert+hue-rotate trên canvas khi dark mode → text tự thành sáng. Đừng\n // override color ở đây vì sẽ đánh nhau với filter.\n return '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' + width + '\" height=\"' + height + '\" viewBox=\"0 0 ' + width + ' ' + height + '\">' +\n '<foreignObject width=\"100%\" height=\"100%\">' +\n '<div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"font-size:16px;line-height:1.2;\">' +\n '<style>' + cssText + '</style>' +\n html +\n '</div>' +\n '</foreignObject>' +\n '</svg>';\n}\n","'use client';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { renderLatexToSvg } from '../render';\n\ninterface Props {\n /**\n * Legacy: vị trí absolute x/y nếu cần (test). Khi cả 2 = 0 và `centered` !== false,\n * popover sẽ tự center floating ở giữa khu vực bảng. Khi `withLeftPanel` = true,\n * vị trí center được offset 120px để chừa chỗ panel trái.\n */\n x: number;\n y: number;\n initialValue: string;\n onInsert: (svgString: string, src: string, displayMode: boolean) => void;\n onClose: () => void;\n /** Khi controlled từ parent (StampLeftPanel), parent set giá trị này. */\n displayMode?: boolean;\n onDisplayModeChange?: (b: boolean) => void;\n /** Khi true, position center offset cho panel trái. */\n withLeftPanel?: boolean;\n}\n\nexport interface EditorPopoverHandle {\n /** Chèn snippet vào vị trí con trỏ trong textbox. */\n insertAtCursor: (snippet: string) => void;\n /** Có content hợp lệ để chèn không (input không rỗng + preview ok). */\n hasContent: () => boolean;\n /** Trigger insert programmatically — return true nếu chèn thành công. */\n tryInsert: () => boolean;\n}\n\nconst DEBOUNCE_MS = 100;\n\nexport const EditorPopover = forwardRef<EditorPopoverHandle, Props>(function EditorPopover(\n {\n x,\n y,\n initialValue,\n onInsert,\n onClose,\n displayMode: controlledDisplayMode,\n onDisplayModeChange,\n withLeftPanel = false,\n },\n ref,\n) {\n const [value, setValue] = useState(initialValue);\n const [internalDisplayMode] = useState(false);\n const displayMode = controlledDisplayMode ?? internalDisplayMode;\n // onDisplayModeChange chỉ dùng khi controlled từ parent — không cần local setter\n void onDisplayModeChange;\n\n const [previewSvg, setPreviewSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(async () => {\n try {\n const svg = await renderLatexToSvg(value, displayMode);\n setPreviewSvg(svg);\n setError(null);\n } catch (err) {\n setPreviewSvg(null);\n setError((err as Error).message);\n }\n }, DEBOUNCE_MS);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [value, displayMode]);\n\n const handleInsert = useCallback(() => {\n if (!previewSvg) return;\n onInsert(previewSvg, value, displayMode);\n }, [previewSvg, value, displayMode, onInsert]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleInsert();\n }\n },\n [onClose, handleInsert],\n );\n\n // Imperative API: snippet button trong panel trái gọi vào, click-outside auto-insert.\n useImperativeHandle(\n ref,\n () => ({\n insertAtCursor: (snippet: string) => {\n const el = inputRef.current;\n if (!el) {\n setValue((v) => v + snippet);\n return;\n }\n const start = el.selectionStart ?? value.length;\n const end = el.selectionEnd ?? value.length;\n const next = value.slice(0, start) + snippet + value.slice(end);\n setValue(next);\n requestAnimationFrame(() => {\n el.focus();\n const pos = start + snippet.length;\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n /* ignore */\n }\n });\n },\n hasContent: () => value.trim().length > 0 && !!previewSvg && !error,\n tryInsert: () => {\n if (!previewSvg || error || !value.trim()) return false;\n onInsert(previewSvg, value, displayMode);\n return true;\n },\n }),\n [value, previewSvg, error, displayMode, onInsert],\n );\n\n // Position: nếu x/y > 0 → dùng legacy absolute (cho tests cũ). Còn không thì center floating.\n const isLegacyPosition = x > 0 || y > 0;\n const wrapperStyle: React.CSSProperties = isLegacyPosition\n ? { position: 'absolute', top: y, left: x, zIndex: 50 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 50,\n };\n\n return (\n <div\n style={wrapperStyle}\n data-stamp-area=\"true\"\n className=\"w-[420px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5\"\n role=\"dialog\"\n aria-label=\"Nhập công thức LaTeX\"\n >\n <header className=\"flex items-center justify-between rounded-t-lg border-b border-slate-200 bg-gradient-to-r from-indigo-600 to-purple-600 px-3 py-2 text-white\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <span className=\"text-base leading-none\">∑</span>\n Công thức LaTeX\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 transition hover:bg-white/15\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"space-y-2 p-3\">\n <input\n ref={inputRef}\n type=\"text\"\n role=\"textbox\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Vd: \\frac{a^2+b^2}{c}\"\n className=\"w-full rounded border border-slate-300 px-2 py-1.5 font-mono text-sm outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-200\"\n autoFocus\n />\n <div\n className={[\n 'flex min-h-[64px] items-center justify-center rounded border p-3 text-center',\n error ? 'border-rose-300 bg-rose-50 text-rose-700' : 'border-slate-200 bg-slate-50',\n ].join(' ')}\n >\n {error ? (\n <span className=\"text-xs\">Lỗi: {error.slice(0, 80)}</span>\n ) : previewSvg ? (\n <span dangerouslySetInnerHTML={{ __html: previewSvg }} />\n ) : (\n <span className=\"text-xs text-slate-400\">(xem trước)</span>\n )}\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Enter để chèn\n </span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!previewSvg || !!error}\n className=\"rounded bg-indigo-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-indigo-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n});\n\n// Back-compat aliases\nexport { EditorPopover as LatexEditorPopover };\nexport type { EditorPopoverHandle as LatexEditorHandle };\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { LeftPanel as LatexLeftPanel } from './editor/LeftPanel';\nimport { EditorPopover as LatexEditorPopover, type EditorPopoverHandle as LatexEditorHandle } from './editor/EditorPopover';\nimport { insertStampImage } from '../shared/insertImage';\nimport { renderLatexToSvg } from './render';\nimport type {\n BaseStampCustomData,\n RestoredStampFile,\n StampHostProps,\n StampHostHandle,\n StampType,\n} from '../shared/types';\n\n// ============== Custom data type + guard ==============\n\nexport interface LatexCustomData extends BaseStampCustomData {\n kind: 'latex';\n version: 1;\n src: string;\n displayMode: boolean;\n}\n\nexport function isLatexCustomData(data: unknown): data is LatexCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<LatexCustomData>;\n return d.kind === 'latex' && d.version === 1 && typeof d.src === 'string';\n}\n\n// ============== Host component ==============\n\nconst LatexStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function LatexStampHost({ api, editingElement, onClose }, ref) {\n const editorRef = useRef<LatexEditorHandle | null>(null);\n\n const initial = useMemo(() => {\n if (editingElement && isLatexCustomData(editingElement.customData)) {\n return {\n initialValue: editingElement.customData.src,\n displayMode: !!editingElement.customData.displayMode,\n };\n }\n return { initialValue: '', displayMode: false };\n }, [editingElement]);\n\n const [displayMode, setDisplayMode] = useState(initial.displayMode);\n\n const handleInsert = useCallback(\n async (svgString: string, src: string, dm: boolean) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): LatexCustomData => ({\n kind: 'latex',\n version: 1,\n src,\n displayMode: dm,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Latex insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <LatexLeftPanel\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsertSnippet={(s) => editorRef.current?.insertAtCursor(s)}\n onClose={onClose}\n />\n <LatexEditorPopover\n ref={editorRef}\n x={0}\n y={0}\n initialValue={initial.initialValue}\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsert={handleInsert}\n onClose={onClose}\n withLeftPanel\n />\n </>\n );\n },\n);\n\n// ============== Stamp definition ==============\n\nconst LatexIcon = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M17 5 H7 L13 12 L7 19 H17\" />\n </svg>\n);\n\nexport const latexStamp: StampType = {\n kind: 'latex',\n shortcutKey: 'l',\n toolbarLabel: 'L',\n toolbarTitle: 'Chèn công thức LaTeX (L)',\n toolbarIcon: LatexIcon,\n toolbarTestId: 'stamp-toolbar-latex',\n matchesCustomData: isLatexCustomData,\n async renderSvgFromCustomData(data) {\n if (!isLatexCustomData(data)) {\n throw new Error('latexStamp.renderSvgFromCustomData: customData không phải latex');\n }\n return renderLatexToSvg(data.src, data.displayMode);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as LatexCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isLatexCustomData(data)) return null;\n const svgString = await renderLatexToSvg(data.src, data.displayMode);\n const utf8 = unescape(encodeURIComponent(svgString));\n const dataURL = 'data:image/svg+xml;base64,' + (\n typeof btoa !== 'undefined' ? btoa(utf8) : Buffer.from(utf8).toString('base64')\n );\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n },\n Host: LatexStampHost,\n};\n","import {\n paletteFor as palette2D,\n type GeomPalette,\n} from '../../geometry-2d/editor/theme';\n\nexport type Geom3DPalette = GeomPalette & {\n view3dBg: string;\n axisX: string;\n axisY: string;\n axisZ: string;\n};\n\nexport function paletteFor(isDark: boolean): Geom3DPalette {\n const base = palette2D(isDark);\n return {\n ...base,\n view3dBg: isDark ? '#1a1a1a' : '#ffffff',\n axisX: '#d63b3b',\n axisY: '#2d8a2d',\n axisZ: '#2d6dd6',\n };\n}\n\nexport const DEFAULT_VIEW3D: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n} = {\n azimuth: 0.7,\n elevation: 0.4,\n bbox3D: [-3, -3, -3, 3, 3, 3],\n};\n\nexport const VIEW3D_ATTRS = (isDark: boolean) => {\n const p = paletteFor(isDark);\n return {\n az: { slider: { visible: false }, point2: { visible: false } },\n el: { slider: { visible: false } },\n projection: 'central' as const,\n axesPosition: 'border' as const,\n xAxis: { strokeColor: p.axisX, lastArrow: { type: 2 } },\n yAxis: { strokeColor: p.axisY, lastArrow: { type: 2 } },\n zAxis: { strokeColor: p.axisZ, lastArrow: { type: 2 } },\n };\n};\n","import type { GeomTool3D } from './tools';\nimport type { SerializedElement3D, Element3DType } from '../serialize';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport interface HandlerContextDeps {\n view: { create: (kind: string, parents: unknown[], attrs: unknown) => JxgObj };\n pushLog: (e: SerializedElement3D) => void;\n objMap: Map<string, JxgObj>;\n nextId: () => string;\n isDark: boolean;\n promptCoords: (label: string) => { x: number; y: number; z: number } | null;\n promptNumber: (label: string) => number | null;\n promptText: (label: string) => string | null;\n notify: () => void;\n}\n\nexport interface PendingPoint {\n id: string;\n ref: JxgObj;\n coords: [number, number, number];\n}\n\nexport interface HandlerContext extends HandlerContextDeps {\n pendingPoints: PendingPoint[];\n /** Internal state flag for multi-stage tools (pyramid base done, etc.) */\n pendingFlags: Record<string, unknown>;\n /** World coords keyed by point id — used by label tool to anchor text3d. */\n pushedPointCoords: Map<string, [number, number, number]>;\n}\n\nexport interface ClickHit {\n x3: number;\n y3: number;\n z3: number;\n /** Existing point id if the click landed on an existing point. */\n existingPointId?: string;\n}\n\nexport function createHandlerContext(deps: HandlerContextDeps): HandlerContext {\n return {\n ...deps,\n pendingPoints: [],\n pendingFlags: {},\n pushedPointCoords: new Map(),\n };\n}\n\nfunction refByPlaceholder(id: string): string {\n return `@id:${id}`;\n}\n\nfunction createPoint3D(\n ctx: HandlerContext,\n x: number,\n y: number,\n z: number,\n label?: string,\n): PendingPoint {\n const id = ctx.nextId();\n const attrs: Record<string, unknown> = { id, size: 3 };\n if (label) attrs.name = label;\n const ref = ctx.view.create('point3d', [x, y, z], attrs);\n ctx.objMap.set(id, ref);\n ctx.pushedPointCoords.set(id, [x, y, z]);\n ctx.pushLog({\n type: 'point3d',\n parents: [x, y, z],\n attributes: attrs,\n id,\n label,\n });\n return { id, ref, coords: [x, y, z] };\n}\n\nfunction resolvePoint(ctx: HandlerContext, hit: ClickHit): PendingPoint {\n if (hit.existingPointId && ctx.objMap.has(hit.existingPointId)) {\n // Prefer the stored world coords (the click hit is screen-projected and\n // may differ); fall back to hit coords if the point predates this session.\n const stored = ctx.pushedPointCoords.get(hit.existingPointId);\n return {\n id: hit.existingPointId,\n ref: ctx.objMap.get(hit.existingPointId),\n coords: stored ?? [hit.x3, hit.y3, hit.z3],\n };\n }\n return createPoint3D(ctx, hit.x3, hit.y3, hit.z3);\n}\n\nfunction finishPolygon(\n ctx: HandlerContext,\n points: PendingPoint[],\n extraAttrs: Record<string, unknown> = {},\n): void {\n const id = ctx.nextId();\n const refs = points.map((p) => p.ref);\n const attrs = { id, ...extraAttrs };\n const ref = ctx.view.create('polygon3d', [refs], attrs);\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: 'polygon3d',\n parents: [points.map((p) => refByPlaceholder(p.id))],\n attributes: attrs,\n id,\n });\n}\n\nfunction finishLineLike(\n ctx: HandlerContext,\n elType: Element3DType,\n points: PendingPoint[],\n extraAttrs: Record<string, unknown> = {},\n): void {\n const id = ctx.nextId();\n const refs = points.map((p) => p.ref);\n const attrs = { id, ...extraAttrs };\n const ref = ctx.view.create(elType, refs, attrs);\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: elType,\n parents: points.map((p) => refByPlaceholder(p.id)),\n attributes: attrs,\n id,\n });\n}\n\nexport function handleToolStep(\n ctx: HandlerContext,\n tool: GeomTool3D,\n hit: ClickHit,\n): void {\n switch (tool) {\n case 'move':\n return;\n\n case 'point': {\n const coords = ctx.promptCoords('Toạ độ điểm (x, y, z)');\n if (!coords) return;\n createPoint3D(ctx, coords.x, coords.y, coords.z);\n ctx.notify();\n return;\n }\n\n case 'segment':\n case 'line': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 2) {\n // JSXGraph 3D has no `segment3d`; bound a `line3d` with straight* off for segment.\n // Explicit stroke + fixed to force visible render (default render is invisible\n // in view3d unless attrs are set — see Bug #9).\n const lineColor = ctx.isDark ? '#9ecbff' : '#0066cc';\n const baseAttrs: Record<string, unknown> = {\n strokeColor: lineColor,\n strokeWidth: 2,\n visible: true,\n fixed: true,\n };\n if (tool === 'segment') {\n baseAttrs.straightFirst = false;\n baseAttrs.straightLast = false;\n }\n finishLineLike(ctx, 'line3d', ctx.pendingPoints, baseAttrs);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'plane': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 3) {\n // plane3d in JSXGraph expects [point, direction1, direction2] but accepts\n // 3-point form for \"plane through A, B, C\".\n finishLineLike(ctx, 'plane3d', ctx.pendingPoints);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'triangle': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 3) {\n finishPolygon(ctx, ctx.pendingPoints);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'polygon': {\n if (\n ctx.pendingPoints.length >= 3 &&\n hit.existingPointId === ctx.pendingPoints[0].id\n ) {\n finishPolygon(ctx, ctx.pendingPoints);\n ctx.pendingPoints = [];\n ctx.notify();\n return;\n }\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n ctx.notify();\n return;\n }\n\n case 'label': {\n if (!hit.existingPointId) return;\n const text = ctx.promptText('Nội dung nhãn');\n if (!text) return;\n const id = ctx.nextId();\n // JSXGraph 1.12 `text3d` requires `[[x,y,z], text]` or `[x,y,z,text]`; the\n // `[pointRef, text]` form silently renders empty. Anchor coords come from\n // the host point (we already have its world coords from createPoint3D log).\n // Points are immutable in this editor (no drag-edit) so static coords are\n // safe.\n const pointLog = ctx.pushedPointCoords.get(hit.existingPointId);\n if (!pointLog) return;\n const [x, y, z] = pointLog;\n const attrs: Record<string, unknown> = {\n id,\n fontSize: 14,\n strokeColor: ctx.isDark ? '#f5f5f5' : '#111111',\n };\n const ref = ctx.view.create('text3d', [x, y, z, text], attrs);\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: 'text3d',\n parents: [x, y, z, text],\n attributes: attrs,\n id,\n label: text,\n });\n ctx.notify();\n return;\n }\n\n // Solids + curved handled in B8, B9\n default:\n handleSolidStep(ctx, tool, hit);\n return;\n }\n}\n\nexport function handleSolidStep(\n ctx: HandlerContext,\n tool: GeomTool3D,\n hit: ClickHit,\n): void {\n switch (tool) {\n case 'tetrahedron': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 4) {\n const [a, b, c, d] = ctx.pendingPoints;\n finishPolyhedron(ctx, [\n [a, b, c],\n [a, b, d],\n [a, c, d],\n [b, c, d],\n ]);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'parallelepiped': {\n const origin = resolvePoint(ctx, hit);\n const v1 = ctx.promptCoords('Vector cạnh 1 (dx, dy, dz)');\n const v2 = ctx.promptCoords('Vector cạnh 2 (dx, dy, dz)');\n const v3 = ctx.promptCoords('Vector cạnh 3 (dx, dy, dz)');\n if (!v1 || !v2 || !v3) return;\n const [ox, oy, oz] = origin.coords;\n // 7 derived points (origin is reused as corner 0)\n const c1 = createPoint3D(ctx, ox + v1.x, oy + v1.y, oz + v1.z);\n const c2 = createPoint3D(ctx, ox + v2.x, oy + v2.y, oz + v2.z);\n const c3 = createPoint3D(ctx, ox + v3.x, oy + v3.y, oz + v3.z);\n const c12 = createPoint3D(\n ctx,\n ox + v1.x + v2.x,\n oy + v1.y + v2.y,\n oz + v1.z + v2.z,\n );\n const c13 = createPoint3D(\n ctx,\n ox + v1.x + v3.x,\n oy + v1.y + v3.y,\n oz + v1.z + v3.z,\n );\n const c23 = createPoint3D(\n ctx,\n ox + v2.x + v3.x,\n oy + v2.y + v3.y,\n oz + v2.z + v3.z,\n );\n const c123 = createPoint3D(\n ctx,\n ox + v1.x + v2.x + v3.x,\n oy + v1.y + v2.y + v3.y,\n oz + v1.z + v2.z + v3.z,\n );\n finishPolyhedron(ctx, [\n [origin, c1, c12, c2],\n [origin, c1, c13, c3],\n [origin, c2, c23, c3],\n [c123, c12, c1, c13],\n [c123, c12, c2, c23],\n [c123, c13, c3, c23],\n ]);\n ctx.pendingPoints = [];\n ctx.notify();\n return;\n }\n\n case 'prism': {\n if (\n ctx.pendingPoints.length >= 3 &&\n hit.existingPointId === ctx.pendingPoints[0].id\n ) {\n const base = ctx.pendingPoints;\n const height = ctx.promptNumber('Chiều cao (theo trục z)');\n if (!height) return;\n const top = base.map((bp) =>\n createPoint3D(ctx, bp.coords[0], bp.coords[1], bp.coords[2] + height),\n );\n const faces: PendingPoint[][] = [base, top];\n for (let i = 0; i < base.length; i++) {\n const next = (i + 1) % base.length;\n faces.push([base[i], base[next], top[next], top[i]]);\n }\n finishPolyhedron(ctx, faces);\n ctx.pendingPoints = [];\n ctx.notify();\n return;\n }\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n ctx.notify();\n return;\n }\n\n case 'pyramid': {\n const baseDone = ctx.pendingFlags.pyramidBaseDone === true;\n if (\n !baseDone &&\n ctx.pendingPoints.length >= 3 &&\n hit.existingPointId === ctx.pendingPoints[0].id\n ) {\n ctx.pendingFlags.pyramidBaseDone = true;\n ctx.notify();\n return;\n }\n if (baseDone) {\n const base = ctx.pendingPoints;\n const apex = createPoint3D(ctx, hit.x3, hit.y3, hit.z3);\n const faces: PendingPoint[][] = [base];\n for (let i = 0; i < base.length; i++) {\n const next = (i + 1) % base.length;\n faces.push([base[i], base[next], apex]);\n }\n finishPolyhedron(ctx, faces);\n ctx.pendingPoints = [];\n ctx.pendingFlags.pyramidBaseDone = false;\n ctx.notify();\n return;\n }\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n ctx.notify();\n return;\n }\n\n // Curved → B9\n default:\n handleCurvedStep(ctx, tool, hit);\n return;\n }\n}\n\nfunction finishPolyhedron(ctx: HandlerContext, faces: PendingPoint[][]): void {\n // JSXGraph 1.12 `polyhedron3d` API requires `[vertices[], faceIndices[]]` (coords\n // + index arrays) — the previous `[facesAsPointRefs]` form throws `Cannot read\n // 'length' of undefined` at runtime. Emit one `polygon3d` per face instead;\n // polygon3d is proven to render (triangle test) and round-trips cleanly through\n // the existing render.ts path. See Bug #7.\n const faceColor = ctx.isDark ? 'rgba(150, 180, 220, 0.35)' : 'rgba(60, 120, 200, 0.25)';\n const edgeColor = ctx.isDark ? '#9ecbff' : '#0066cc';\n for (const face of faces) {\n finishPolygon(ctx, face, {\n fillColor: faceColor,\n fillOpacity: 1,\n strokeColor: edgeColor,\n strokeWidth: 1.5,\n visible: true,\n });\n }\n}\n\nconst CURVED_SEGMENTS = 16;\n\nexport function handleCurvedStep(\n ctx: HandlerContext,\n tool: GeomTool3D,\n hit: ClickHit,\n): void {\n switch (tool) {\n case 'sphere': {\n const radius = ctx.promptNumber('Bán kính mặt cầu');\n if (radius == null) return;\n const center = resolvePoint(ctx, hit);\n const id = ctx.nextId();\n const ref = ctx.view.create('sphere3d', [center.ref, radius], { id });\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: 'sphere3d',\n parents: [refByPlaceholder(center.id), radius],\n attributes: { id },\n id,\n });\n ctx.notify();\n return;\n }\n\n case 'cone': {\n const baseDone = ctx.pendingFlags.coneBaseDone === true;\n if (!baseDone) {\n const radius = ctx.promptNumber('Bán kính đáy');\n if (radius == null) return;\n const center = resolvePoint(ctx, hit);\n ctx.pendingFlags.coneCenter = center;\n ctx.pendingFlags.coneRadius = radius;\n ctx.pendingFlags.coneBaseDone = true;\n ctx.notify();\n return;\n }\n // Second click = apex\n const center = ctx.pendingFlags.coneCenter as PendingPoint;\n const radius = ctx.pendingFlags.coneRadius as number;\n const apex = createPoint3D(ctx, hit.x3, hit.y3, hit.z3);\n const [cx, cy, cz] = center.coords;\n const basePoints: PendingPoint[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n basePoints.push(\n createPoint3D(\n ctx,\n cx + radius * Math.cos(theta),\n cy + radius * Math.sin(theta),\n cz,\n ),\n );\n }\n const faces: PendingPoint[][] = [basePoints];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n faces.push([basePoints[i], basePoints[(i + 1) % CURVED_SEGMENTS], apex]);\n }\n finishPolyhedron(ctx, faces);\n ctx.pendingFlags.coneBaseDone = false;\n ctx.pendingFlags.coneCenter = undefined;\n ctx.pendingFlags.coneRadius = undefined;\n ctx.notify();\n return;\n }\n\n case 'cylinder': {\n const radius = ctx.promptNumber('Bán kính đáy');\n if (radius == null) return;\n const height = ctx.promptNumber('Chiều cao (theo trục z)');\n if (height == null) return;\n const center = resolvePoint(ctx, hit);\n const [cx, cy, cz] = center.coords;\n const basePoints: PendingPoint[] = [];\n const topPoints: PendingPoint[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n basePoints.push(\n createPoint3D(\n ctx,\n cx + radius * Math.cos(theta),\n cy + radius * Math.sin(theta),\n cz,\n ),\n );\n topPoints.push(\n createPoint3D(\n ctx,\n cx + radius * Math.cos(theta),\n cy + radius * Math.sin(theta),\n cz + height,\n ),\n );\n }\n const faces: PendingPoint[][] = [basePoints, topPoints];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const next = (i + 1) % CURVED_SEGMENTS;\n faces.push([basePoints[i], basePoints[next], topPoints[next], topPoints[i]]);\n }\n finishPolyhedron(ctx, faces);\n ctx.notify();\n return;\n }\n\n // 'solidofrevolution' removed in 0.6.1 — `solidofrevolution3d` is not a valid\n // JSXGraph 1.12.2 element. See Bug #8.\n default:\n return;\n }\n}\n\n// Helpers exported for B8/B9 to reuse\nexport {\n createPoint3D,\n resolvePoint,\n refByPlaceholder,\n finishPolygon,\n finishLineLike,\n};\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport JXG from 'jsxgraph';\nimport { DEFAULT_VIEW3D, VIEW3D_ATTRS, paletteFor } from './theme';\nimport type { GeomTool3D } from './tools';\nimport type { SerializedBoard3D, SerializedElement3D } from '../serialize';\nimport {\n createHandlerContext,\n handleToolStep,\n type ClickHit,\n type HandlerContext,\n} from './handlers';\n\nexport interface MiniBoard3DHandle {\n getContainer: () => HTMLDivElement | null;\n getTool: () => GeomTool3D;\n setTool: (t: GeomTool3D) => void;\n getCreationLog: () => SerializedElement3D[];\n pushLog: (e: SerializedElement3D) => void;\n getViewState: () => {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n };\n getBbox: () => [number, number, number, number];\n getShowAxes: () => boolean;\n getShowMesh: () => boolean;\n setShowAxes: (b: boolean) => void;\n setShowMesh: (b: boolean) => void;\n resetView: () => void;\n undo: () => void;\n canUndo: () => boolean;\n snapshotSVG: () => { svgString: string; width: number; height: number };\n subscribe: (cb: () => void) => () => void;\n}\n\ninterface Props {\n isDark: boolean;\n initialState?: SerializedBoard3D | null;\n}\n\n// JSXGraph board / view types are not published — use minimal local shapes.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgBoard = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgView = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport const MiniBoard3D = forwardRef<MiniBoard3DHandle, Props>(function MiniBoard3D(\n { isDark, initialState },\n ref,\n) {\n const reactId = useId();\n const containerId = `geom3d_${reactId.replace(/[^a-zA-Z0-9_]/g, '_')}`;\n const containerRef = useRef<HTMLDivElement | null>(null);\n const boardRef = useRef<JxgBoard>(null);\n const viewRef = useRef<JxgView>(null);\n const toolRef = useRef<GeomTool3D>('move');\n const logRef = useRef<SerializedElement3D[]>([]);\n const objMapRef = useRef<Map<string, JxgObj>>(new Map());\n const subsRef = useRef<Set<() => void>>(new Set());\n const initialBbox3D = useRef<[number, number, number, number, number, number]>(\n initialState?.view.bbox3D ?? DEFAULT_VIEW3D.bbox3D,\n );\n const ctxRef = useRef<HandlerContext | null>(null);\n const pointerHandlerRef = useRef<{ el: HTMLElement | SVGElement; fn: EventListener } | null>(null);\n const [showAxes, setShowAxes] = useState(initialState?.showAxes ?? true);\n const [showMesh, setShowMesh] = useState(initialState?.showMesh ?? false);\n\n const notify = useCallback(() => {\n for (const cb of subsRef.current) cb();\n }, []);\n\n useEffect(() => {\n const div = containerRef.current;\n if (!div) return;\n JXG.Options.text.display = 'internal';\n\n const board: JxgBoard = JXG.JSXGraph.initBoard(div, {\n boundingbox: [-6, 6, 6, -6],\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n });\n boardRef.current = board;\n\n const initView = initialState?.view ?? DEFAULT_VIEW3D;\n const baseAttrs = VIEW3D_ATTRS(isDark);\n const view: JxgView = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [initView.bbox3D[0], initView.bbox3D[3]],\n [initView.bbox3D[1], initView.bbox3D[4]],\n [initView.bbox3D[2], initView.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n az: { ...baseAttrs.az, value: initView.azimuth },\n el: { ...baseAttrs.el, value: initView.elevation },\n },\n );\n viewRef.current = view;\n\n // Wire pointer events to handlers\n let idCounter = 1;\n const ctx: HandlerContext = createHandlerContext({\n view,\n pushLog: (e) => {\n logRef.current.push(e);\n notify();\n },\n objMap: objMapRef.current,\n nextId: () => `obj_${Date.now().toString(36)}_${(idCounter++).toString(36)}`,\n isDark,\n promptCoords: (label) => {\n const raw = window.prompt(`${label}\\n(định dạng \"x,y,z\")`, '0,0,0');\n if (!raw) return null;\n const parts = raw.split(',').map((s) => Number(s.trim()));\n if (parts.length !== 3 || parts.some((n) => !isFinite(n))) return null;\n return { x: parts[0], y: parts[1], z: parts[2] };\n },\n promptNumber: (label) => {\n const raw = window.prompt(label, '1');\n if (raw == null) return null;\n const n = Number(raw);\n return isFinite(n) ? n : null;\n },\n promptText: (label) => {\n const raw = window.prompt(label, '');\n return raw == null ? null : raw;\n },\n notify,\n });\n ctxRef.current = ctx;\n\n // Helper: find existing point3d under pointer (returns its id) so polygon\n // close + segment chaining work.\n //\n // Bug #10 root cause: JSXGraph 3D `point3d` objects don't expose `coords`\n // directly — the rendered position lives on the auto-generated 2D shadow\n // `element2D.coords.scrCoords`. The earlier code read `obj.coords` which\n // was always undefined, so every iteration `continue`'d and the hit-test\n // never matched. View3d's screen↔world projection isn't lossless, so the\n // user's click position can differ from the rendered point by 100+ px;\n // using the shadow's actual screen coords fixes both that drift and the\n // synthetic-test miss.\n function findExistingPointAt(clientX: number, clientY: number): string | undefined {\n const containerRect = (div as HTMLDivElement).getBoundingClientRect();\n const localX = clientX - containerRect.left;\n const localY = clientY - containerRect.top;\n const PICK = 18;\n const svg = (div as HTMLDivElement).querySelector('svg');\n if (!svg) return undefined;\n for (const [id, obj] of objMapRef.current) {\n const entry = obj as {\n elType?: string;\n element2D?: { coords?: { scrCoords?: number[] } };\n };\n if (entry?.elType !== 'point3d') continue;\n const sc = entry.element2D?.coords?.scrCoords;\n if (!sc || sc.length < 3) continue;\n const dx = sc[1] - localX;\n const dy = sc[2] - localY;\n if (dx * dx + dy * dy <= PICK * PICK) return id;\n }\n return undefined;\n }\n\n const handlePointerDown = (e: PointerEvent) => {\n const tool = toolRef.current;\n if (tool === 'move') return;\n // Suppress default JSXGraph drag/select for tool clicks\n const existingPointId = findExistingPointAt(e.clientX, e.clientY);\n let x3 = 0;\n let y3 = 0;\n const z3 = 0;\n try {\n // 2D world coords from screen, project onto z=0 plane.\n const board2d = boardRef.current as\n | { getCoordsTopLeftCorner?: unknown; getUsrCoordsOfMouse?: (ev: Event) => [number, number] }\n | null;\n if (board2d?.getUsrCoordsOfMouse) {\n const uc = board2d.getUsrCoordsOfMouse(e);\n if (Array.isArray(uc) && uc.length >= 2) {\n x3 = uc[0];\n y3 = uc[1];\n }\n }\n } catch {\n /* fall back to 0,0,0 */\n }\n const hit: ClickHit = { x3, y3, z3, existingPointId };\n handleToolStep(ctx, tool, hit);\n };\n\n const svgEl = (div as HTMLDivElement).querySelector('svg');\n const targetEl = (svgEl ?? (div as HTMLDivElement)) as HTMLElement | SVGElement;\n const handlePointerDownEv: EventListener = (e) => handlePointerDown(e as PointerEvent);\n targetEl.addEventListener('pointerdown', handlePointerDownEv);\n pointerHandlerRef.current = { el: targetEl, fn: handlePointerDownEv };\n\n if (initialState?.elements?.length) {\n const map = objMapRef.current;\n for (const el of initialState.elements) {\n const parents = el.parents.map((p) =>\n typeof p === 'string' && p.startsWith('@id:') ? map.get(p.slice(4)) : p,\n );\n const obj = view.create(el.type, parents, {\n ...el.attributes,\n id: el.id,\n name: el.label,\n });\n map.set(el.id, obj);\n logRef.current.push(el);\n }\n }\n\n return () => {\n if (pointerHandlerRef.current) {\n pointerHandlerRef.current.el.removeEventListener(\n 'pointerdown',\n pointerHandlerRef.current.fn,\n );\n pointerHandlerRef.current = null;\n }\n try {\n JXG.JSXGraph.freeBoard(board);\n } catch {\n /* ignore teardown errors in tests */\n }\n boardRef.current = null;\n viewRef.current = null;\n ctxRef.current = null;\n objMapRef.current.clear();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleRef = useRef<MiniBoard3DHandle | null>(null);\n handleRef.current = {\n getContainer: () => containerRef.current,\n getTool: () => toolRef.current,\n setTool: (t) => {\n toolRef.current = t;\n notify();\n },\n getCreationLog: () => [...logRef.current],\n pushLog: (e) => {\n logRef.current.push(e);\n notify();\n },\n getViewState: () => {\n const v = viewRef.current as { az?: { Value?: () => number }; el?: { Value?: () => number } } | null;\n return {\n azimuth: v?.az?.Value?.() ?? DEFAULT_VIEW3D.azimuth,\n elevation: v?.el?.Value?.() ?? DEFAULT_VIEW3D.elevation,\n bbox3D: initialBbox3D.current,\n };\n },\n getBbox: () => [-6, 6, 6, -6],\n getShowAxes: () => showAxes,\n getShowMesh: () => showMesh,\n setShowAxes: (b) => {\n setShowAxes(b);\n notify();\n },\n setShowMesh: (b) => {\n setShowMesh(b);\n notify();\n },\n resetView: () => {\n notify();\n },\n undo: () => {\n logRef.current.pop();\n notify();\n },\n canUndo: () => logRef.current.length > 0,\n snapshotSVG: () => {\n const div = containerRef.current;\n if (!div) return { svgString: '', width: 0, height: 0 };\n const svg = div.querySelector('svg');\n if (!svg) return { svgString: '', width: 0, height: 0 };\n const clone = svg.cloneNode(true) as SVGElement;\n const rect = svg.getBoundingClientRect();\n const width = rect.width || 600;\n const height = rect.height || 600;\n clone.setAttribute('width', String(width));\n clone.setAttribute('height', String(height));\n return {\n svgString: new XMLSerializer().serializeToString(clone),\n width,\n height,\n };\n },\n subscribe: (cb) => {\n subsRef.current.add(cb);\n return () => {\n subsRef.current.delete(cb);\n };\n },\n };\n\n useImperativeHandle(ref, () => handleRef.current!, []);\n\n const p = paletteFor(isDark);\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n style={{\n width: '100%',\n height: '100%',\n background: p.view3dBg,\n position: 'relative',\n // Clip JSXGraph mesh3d/bounding-box paths that project outside the\n // board container (Bug #4) — without this they overlap LeftPanel and\n // block pointer events.\n overflow: 'hidden',\n }}\n />\n );\n});\n","export type GeomTool3D =\n | 'move'\n | 'point'\n | 'segment'\n | 'line'\n | 'plane'\n | 'triangle'\n | 'polygon'\n | 'tetrahedron'\n | 'parallelepiped'\n | 'prism'\n | 'pyramid'\n | 'sphere'\n | 'cone'\n | 'cylinder'\n | 'label';\n\nexport type ToolGroup3D = 'view' | 'primitive' | 'solid' | 'curved' | 'meta';\n\nexport interface ToolDef3D {\n key: GeomTool3D;\n label: string;\n group: ToolGroup3D;\n stepsRequired: number;\n hint?: string;\n}\n\nexport const GROUP_LABELS_3D: Record<ToolGroup3D, string> = {\n view: 'Xem',\n primitive: 'Cơ bản',\n solid: 'Khối đa diện',\n curved: 'Khối cong',\n meta: 'Khác',\n};\n\nexport const TOOLS_3D: ReadonlyArray<ToolDef3D> = [\n { key: 'move', label: 'Di chuyển', group: 'view', stepsRequired: 0 },\n { key: 'point', label: 'Điểm', group: 'primitive', stepsRequired: 1, hint: 'Nhập (x, y, z)' },\n { key: 'segment', label: 'Đoạn thẳng', group: 'primitive', stepsRequired: 2 },\n { key: 'line', label: 'Đường thẳng', group: 'primitive', stepsRequired: 2 },\n { key: 'plane', label: 'Mặt phẳng', group: 'primitive', stepsRequired: 3 },\n { key: 'triangle', label: 'Tam giác', group: 'primitive', stepsRequired: 3 },\n {\n key: 'polygon',\n label: 'Đa giác',\n group: 'primitive',\n stepsRequired: 3,\n hint: 'Click trở lại điểm đầu để đóng',\n },\n { key: 'tetrahedron', label: 'Tứ diện', group: 'solid', stepsRequired: 4 },\n {\n key: 'parallelepiped',\n label: 'Hình hộp',\n group: 'solid',\n stepsRequired: 1,\n hint: '1 đỉnh + 3 vector',\n },\n {\n key: 'prism',\n label: 'Lăng trụ',\n group: 'solid',\n stepsRequired: 3,\n hint: 'Đa giác đáy + chiều cao',\n },\n {\n key: 'pyramid',\n label: 'Chóp',\n group: 'solid',\n stepsRequired: 4,\n hint: 'Đa giác đáy + đỉnh',\n },\n { key: 'sphere', label: 'Mặt cầu', group: 'curved', stepsRequired: 1, hint: 'Tâm + bán kính' },\n {\n key: 'cone',\n label: 'Hình nón',\n group: 'curved',\n stepsRequired: 2,\n hint: 'Tâm đáy + bán kính + đỉnh',\n },\n {\n key: 'cylinder',\n label: 'Hình trụ',\n group: 'curved',\n stepsRequired: 1,\n hint: 'Tâm đáy + bán kính + chiều cao',\n },\n { key: 'label', label: 'Nhãn', group: 'meta', stepsRequired: 1, hint: 'Gắn vào điểm' },\n];\n","'use client';\nimport type { ReactNode } from 'react';\nimport type { GeomTool3D } from './tools';\n\ninterface ToolButtonProps {\n toolKey: GeomTool3D;\n label: string;\n hint?: string;\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n}\n\nexport function ToolButton({ toolKey, label, hint, active, onClick, icon }: ToolButtonProps) {\n return (\n <button\n type=\"button\"\n title={hint ? `${label} — ${hint}` : label}\n aria-label={label}\n aria-pressed={active}\n onClick={onClick}\n data-active={active || undefined}\n data-tool={toolKey}\n className={[\n 'flex h-8 items-center justify-center rounded-md transition',\n active\n ? 'bg-blue-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {icon}\n </button>\n );\n}\n\nconst stroke = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\nexport const ICONS_3D: Record<GeomTool3D, ReactNode> = {\n move: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M5 9l-3 3 3 3M19 9l3 3-3 3M9 5l3-3 3 3M9 19l3 3 3-3\" />\n </svg>\n ),\n point: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"currentColor\" />\n </svg>\n ),\n segment: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"4\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n line: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <line x1=\"2\" y1=\"22\" x2=\"22\" y2=\"2\" />\n </svg>\n ),\n plane: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M3 18 L8 8 L21 6 L16 18 Z\" />\n </svg>\n ),\n triangle: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 4 L21 20 L3 20 Z\" />\n </svg>\n ),\n polygon: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L20 9 L17 19 L7 19 L4 9 Z\" />\n </svg>\n ),\n tetrahedron: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L20 20 L4 20 Z M12 3 L12 20\" />\n </svg>\n ),\n parallelepiped: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M4 7 L14 4 L20 7 L14 10 Z M4 7 L4 17 L14 20 L14 10 M14 20 L20 17 L20 7\" />\n </svg>\n ),\n prism: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 4 L18 8 L18 20 L12 16 Z M12 4 L6 8 L6 20 L12 16 M6 8 L12 12 L18 8 M6 20 L18 20\" />\n </svg>\n ),\n pyramid: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L4 20 L20 20 Z M12 3 L12 20\" />\n </svg>\n ),\n sphere: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"3\" />\n </svg>\n ),\n cone: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L4 20 L20 20 Z\" />\n <ellipse cx=\"12\" cy=\"20\" rx=\"8\" ry=\"2\" />\n </svg>\n ),\n cylinder: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"6\" ry=\"2\" />\n <ellipse cx=\"12\" cy=\"19\" rx=\"6\" ry=\"2\" />\n <line x1=\"6\" y1=\"5\" x2=\"6\" y2=\"19\" />\n <line x1=\"18\" y1=\"5\" x2=\"18\" y2=\"19\" />\n </svg>\n ),\n label: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M4 4 H 16 L 20 8 L 16 12 H 4 Z\" />\n </svg>\n ),\n};\n","'use client';\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS_3D, GROUP_LABELS_3D, type GeomTool3D, type ToolDef3D, type ToolGroup3D } from './tools';\nimport { ToolButton, ICONS_3D } from './toolButtons';\nimport type { MiniBoard3DHandle } from './MiniBoard3D';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shell ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isDark?: boolean;\n}\n\nfunction Shell({ title, icon, onClose, children, isDark }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"geom3d-left-panel\"\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200`}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- 3D Icon header ----------\n\nconst Geom3DIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 7 L14 4 L20 7 L14 10 Z M4 7 L4 17 L14 20 L14 10 M14 20 L20 17 L20 7\" />\n </svg>\n);\n\n// ---------- Props ----------\n\ninterface Props {\n handle: MiniBoard3DHandle | null;\n onResetView: () => void;\n onClose: () => void;\n isDark?: boolean;\n}\n\nexport function LeftPanel({ handle, onResetView, onClose, isDark }: Props) {\n const [tool, setTool] = useState<GeomTool3D>('move');\n const [showAxes, setShowAxes] = useState(true);\n const [showMesh, setShowMesh] = useState(false);\n const [canUndo, setCanUndo] = useState(false);\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!handle) return;\n const sync = () => {\n setTool(handle.getTool());\n setShowAxes(handle.getShowAxes());\n setShowMesh(handle.getShowMesh());\n setCanUndo(handle.canUndo());\n };\n sync();\n return handle.subscribe(sync);\n }, [handle]);\n\n const showHover = useCallback((el: HTMLElement, t: ToolDef3D) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n const grouped = TOOLS_3D.reduce<Record<ToolGroup3D, ToolDef3D[]>>(\n (acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n },\n {} as Record<ToolGroup3D, ToolDef3D[]>,\n );\n\n return (\n <>\n <Shell title=\"Hình học 3D\" icon={Geom3DIconHeader} onClose={onClose} isDark={isDark}>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-2 flex-wrap text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxes}\n onChange={(e) => handle?.setShowAxes(e.target.checked)}\n data-testid=\"toggle-axes\"\n />\n Trục\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showMesh}\n onChange={(e) => handle?.setShowMesh(e.target.checked)}\n data-testid=\"toggle-mesh\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={onResetView}\n title=\"Reset góc nhìn\"\n aria-label=\"Reset view\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handle?.undo()}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n </button>\n </div>\n </Section>\n\n {(Object.entries(grouped) as [ToolGroup3D, ToolDef3D[]][]).map(([group, tools]) => (\n <Section key={group} label={GROUP_LABELS_3D[group]}>\n <div className=\"grid grid-cols-4 gap-1\">\n {tools.map((t) => (\n <ToolButton\n key={t.key}\n toolKey={t.key}\n label={t.label}\n hint={t.hint}\n active={tool === t.key}\n onClick={() => handle?.setTool(t.key)}\n icon={\n <span\n onMouseEnter={(e) => showHover(e.currentTarget.closest('button') as HTMLElement, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget.closest('button') as HTMLElement, t)}\n onBlur={hideHover}\n >\n {ICONS_3D[t.key]}\n </span>\n }\n />\n ))}\n </div>\n </Section>\n ))}\n </Shell>\n\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n","'use client';\nimport { forwardRef, useCallback, useImperativeHandle, useRef, useState } from 'react';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport { LeftPanel } from './LeftPanel';\nimport type { SerializedBoard3D } from '../serialize';\n\nexport interface EditorPanelHandle {\n tryInsert: () => boolean;\n hasContent: () => boolean;\n}\n\ninterface Props {\n isDark: boolean;\n initial: SerializedBoard3D | null;\n onInsert: (jsonState: string, svgString: string, width: number, height: number) => void;\n onClose: () => void;\n}\n\nexport const EditorPanel = forwardRef<EditorPanelHandle, Props>(function EditorPanel(\n { isDark, initial, onInsert, onClose },\n ref,\n) {\n // Stable ref to the latest mounted handle so callbacks (tryInsert) read fresh state\n // without triggering re-renders when the handle updates internally.\n const boardRef = useRef<MiniBoard3DHandle | null>(null);\n // Re-render trigger for LeftPanel ONLY when the handle identity changes\n // (mount → handle, unmount → null). Functional-equality guard breaks the\n // ref-callback re-render loop seen with React 19 strict mode.\n const [boardHandle, setBoardHandle] = useState<MiniBoard3DHandle | null>(null);\n\n const setBoard = useCallback((h: MiniBoard3DHandle | null) => {\n boardRef.current = h;\n setBoardHandle((prev) => (prev === h ? prev : h));\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => {\n const board = boardRef.current;\n if (!board) return false;\n const log = board.getCreationLog();\n if (log.length === 0) return false;\n const view = board.getViewState();\n const state: SerializedBoard3D = {\n version: 1,\n bbox: board.getBbox(),\n view,\n showAxes: board.getShowAxes(),\n showMesh: board.getShowMesh(),\n elements: log,\n };\n const snap = board.snapshotSVG();\n onInsert(JSON.stringify(state), snap.svgString, snap.width, snap.height);\n return true;\n },\n hasContent: () => (boardRef.current?.getCreationLog().length ?? 0) > 0,\n }),\n [onInsert],\n );\n\n const handleResetView = useCallback(() => {\n boardRef.current?.resetView();\n }, []);\n\n return (\n <div\n data-testid=\"geom3d-editor-panel\"\n data-stamp-area=\"true\"\n style={{\n position: 'absolute',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n width: 900,\n height: 700,\n background: '#fff',\n boxShadow: '0 6px 32px rgba(0,0,0,0.2)',\n borderRadius: 8,\n zIndex: 10,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n display: 'flex',\n padding: '8px 12px',\n borderBottom: '1px solid #eee',\n alignItems: 'center',\n }}\n >\n <span style={{ fontWeight: 600 }}>Hình học không gian (3D)</span>\n <span style={{ flex: 1 }} />\n <button type=\"button\" onClick={onClose}>\n Đóng\n </button>\n </div>\n <div style={{ position: 'relative', flex: 1, minHeight: 0 }}>\n <LeftPanel\n handle={boardHandle}\n onResetView={handleResetView}\n onClose={onClose}\n isDark={isDark}\n />\n <div\n style={{\n position: 'absolute',\n left: 120,\n top: 0,\n right: 0,\n bottom: 0,\n overflow: 'hidden',\n }}\n >\n <MiniBoard3D ref={setBoard} isDark={isDark} initialState={initial} />\n </div>\n </div>\n </div>\n );\n});\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface Geometry3DCustomData extends BaseStampCustomData {\n kind: 'geometry3d';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGeometry3DCustomData(data: unknown): data is Geometry3DCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<Geometry3DCustomData>;\n return d.kind === 'geometry3d' && d.version === 1 && typeof d.jsonState === 'string';\n}\n\nexport type Element3DType =\n | 'point3d'\n | 'line3d'\n | 'plane3d'\n | 'polygon3d'\n | 'sphere3d'\n | 'text3d';\n\nexport interface SerializedElement3D {\n type: Element3DType;\n /**\n * Parents passed to JSXGraph view.create. Either literal values (numbers,\n * strings) or `\"@id:<id>\"` placeholder strings referencing earlier created\n * objects in the log (resolved at deserialize time).\n */\n parents: unknown[];\n attributes: Record<string, unknown>;\n id: string;\n label?: string;\n}\n\nexport interface SerializedBoard3D {\n version: 1;\n bbox: [number, number, number, number];\n view: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n };\n showAxes: boolean;\n showMesh: boolean;\n elements: SerializedElement3D[];\n}\n\nexport function serializeBoard3D(state: SerializedBoard3D): string {\n return JSON.stringify(state);\n}\n\nexport function parseSerializedBoard3D(json: string): SerializedBoard3D {\n const parsed = JSON.parse(json) as unknown;\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('parseSerializedBoard3D: not an object');\n }\n const p = parsed as Partial<SerializedBoard3D>;\n if (p.version !== 1) {\n throw new Error(`parseSerializedBoard3D: unsupported version ${String(p.version)}`);\n }\n if (!Array.isArray(p.elements)) {\n throw new Error('parseSerializedBoard3D: elements missing');\n }\n return parsed as SerializedBoard3D;\n}\n","\"use client\";\n\nimport JXG from 'jsxgraph';\nimport { parseSerializedBoard3D } from './serialize';\n\nexport interface RenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nconst OUTPUT_WIDTH = 1024;\nconst OUTPUT_HEIGHT = 768;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport async function renderGeometry3DSvgFromState(\n jsonState: string,\n): Promise<RenderResult> {\n const state = parseSerializedBoard3D(jsonState);\n\n const div = document.createElement('div');\n div.style.cssText = `position:absolute;left:-9999px;top:-9999px;width:${OUTPUT_WIDTH}px;height:${OUTPUT_HEIGHT}px;`;\n document.body.appendChild(div);\n\n try {\n JXG.Options.text.display = 'internal';\n\n const board = JXG.JSXGraph.initBoard(div, {\n boundingbox: state.bbox,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n }) as { create: (k: string, p: unknown[], a: unknown) => JxgObj };\n\n const view: JxgObj = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [state.view.bbox3D[0], state.view.bbox3D[3]],\n [state.view.bbox3D[1], state.view.bbox3D[4]],\n [state.view.bbox3D[2], state.view.bbox3D[5]],\n ],\n ],\n {\n az: { slider: { visible: false }, value: state.view.azimuth },\n el: { slider: { visible: false }, value: state.view.elevation },\n projection: 'central',\n },\n );\n\n if (!state.showAxes) {\n (view as { defaultAxes?: unknown[] }).defaultAxes = [];\n }\n\n const idMap = new Map<string, JxgObj>();\n for (const el of state.elements) {\n const parents = el.parents.map((p) =>\n typeof p === 'string' && p.startsWith('@id:')\n ? idMap.get(p.slice(4))\n : p,\n );\n const obj = (\n view as { create: (k: string, p: unknown[], a: unknown) => JxgObj }\n ).create(el.type, parents, {\n ...el.attributes,\n id: el.id,\n name: el.label,\n });\n idMap.set(el.id, obj);\n }\n\n const svg = div.querySelector('svg');\n if (!svg) {\n throw new Error('renderGeometry3DSvgFromState: SVG not produced');\n }\n const clone = svg.cloneNode(true) as SVGElement;\n clone.setAttribute('width', String(OUTPUT_WIDTH));\n clone.setAttribute('height', String(OUTPUT_HEIGHT));\n const svgString = new XMLSerializer().serializeToString(clone);\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n JXG.JSXGraph.freeBoard(board as any);\n } catch {\n /* ignore teardown */\n }\n\n return { svgString, width: OUTPUT_WIDTH, height: OUTPUT_HEIGHT };\n } finally {\n document.body.removeChild(div);\n }\n}\n","'use client';\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n type ReactNode,\n} from 'react';\nimport { EditorPanel, type EditorPanelHandle } from './editor/EditorPanel';\nimport { insertStampImage } from '../shared/insertImage';\nimport type {\n StampHostProps,\n StampHostHandle,\n StampType,\n RestoredStampFile,\n} from '../shared/types';\nimport {\n isGeometry3DCustomData,\n parseSerializedBoard3D,\n type Geometry3DCustomData,\n type SerializedBoard3D,\n} from './serialize';\nimport { renderGeometry3DSvgFromState } from './render';\n\nexport { isGeometry3DCustomData };\nexport type { Geometry3DCustomData };\n\nfunction parseInitial(\n editingElement: StampHostProps['editingElement'],\n): SerializedBoard3D | null {\n if (!editingElement) return null;\n if (!isGeometry3DCustomData(editingElement.customData)) return null;\n try {\n return parseSerializedBoard3D(editingElement.customData.jsonState);\n } catch {\n return null;\n }\n}\n\nexport const Geometry3DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Geometry3DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const editorRef = useRef<EditorPanelHandle | null>(null);\n const initial = useMemo(\n () => parseInitial(editingElement),\n [editingElement],\n );\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string, width: number, height: number) => {\n if (!api) return;\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Geometry3DCustomData => ({\n kind: 'geometry3d',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n onClose();\n },\n [api, editingElement, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <EditorPanel\n ref={editorRef}\n isDark={isDark}\n initial={initial}\n onInsert={handleInsert}\n onClose={onClose}\n />\n );\n },\n);\n\nconst Geometry3DIcon: ReactNode = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 3 L20 8 L20 16 L12 21 L4 16 L4 8 Z\" />\n <path d=\"M12 3 L12 21 M4 8 L12 12 L20 8 M4 16 L12 12 L20 16\" />\n </svg>\n);\n\nexport const geometry3dStamp: StampType = {\n kind: 'geometry3d',\n shortcutKey: 'd',\n toolbarLabel: 'D',\n toolbarTitle: 'Hình 3D (D)',\n toolbarIcon: Geometry3DIcon,\n toolbarTestId: 'stamp-toolbar-geometry3d',\n matchesCustomData: isGeometry3DCustomData,\n async renderSvgFromCustomData(data: unknown): Promise<string> {\n if (!isGeometry3DCustomData(data)) {\n throw new Error('geometry3dStamp.renderSvgFromCustomData: customData không phải geometry3d');\n }\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgString;\n },\n restoreFileFromCustomData: async (element): Promise<RestoredStampFile | null> => {\n const data = element.customData as Geometry3DCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGeometry3DCustomData(data)) return null;\n try {\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n const dataURL = `data:image/svg+xml;base64,${\n typeof btoa !== 'undefined'\n ? btoa(unescape(encodeURIComponent(svgString)))\n : Buffer.from(svgString).toString('base64')\n }`;\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n } catch {\n return null;\n }\n },\n Host: Geometry3DStampHost,\n};\n","import { geometryStamp } from '../geometry-2d';\nimport { latexStamp } from '../latex';\nimport { geometry3dStamp } from '../geometry-3d';\nimport type { StampType } from './types';\n\nexport { geometryStamp, type GeometryCustomData, isGeometryCustomData } from '../geometry-2d';\nexport { latexStamp, type LatexCustomData, isLatexCustomData } from '../latex';\nexport {\n geometry3dStamp,\n type Geometry3DCustomData,\n isGeometry3DCustomData,\n} from '../geometry-3d';\nexport type { StampType, BaseStampCustomData } from './types';\n\n/**\n * Set stamp mặc định dùng trong Whiteboard. Consumer có thể\n * truyền custom array để bật/tắt từng stamp hoặc đăng ký stamp mới.\n *\n * Để thêm 1 stamp mới (vd chart):\n * 1. Tạo `src/stamp/registry/chart.tsx` với StampType object.\n * 2. Add vào DEFAULT_STAMPS ở dưới, HOẶC consumer truyền\n * `<Whiteboard stamps={[...DEFAULT_STAMPS, chartStamp]} />`.\n */\nexport const DEFAULT_STAMPS: ReadonlyArray<StampType> = Object.freeze([\n geometryStamp,\n latexStamp,\n geometry3dStamp,\n]);\n\n/** Tìm stamp tương ứng với customData của element. null nếu không match. */\nexport function findStampForCustomData(\n data: unknown,\n stamps: ReadonlyArray<StampType> = DEFAULT_STAMPS,\n): StampType | null {\n for (const s of stamps) {\n if (s.matchesCustomData(data)) return s;\n }\n return null;\n}\n\n/** isMathStamp version dựa trên registry — replace logic hardcode trong types.ts. */\nexport function isStampElement<T extends { customData?: unknown }>(\n element: T,\n stamps: ReadonlyArray<StampType> = DEFAULT_STAMPS,\n): boolean {\n return findStampForCustomData(element.customData, stamps) !== null;\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DEFAULT_STAMPS } from './registry';\nimport type { StampType } from './types';\n\ninterface Props {\n /** Bật/tắt theo role. Khi disabled → không mount portal. */\n enabled: boolean;\n /** Kind stamp đang active, hoặc null nếu không có stamp nào mở. */\n activeStampKind: string | null;\n /** Toggle stamp theo kind. */\n onToggle: (kind: string) => void;\n /** Danh sách stamp đăng ký. Mặc định DEFAULT_STAMPS. */\n stamps?: ReadonlyArray<StampType>;\n}\n\nconst WRAPPER_ID = 'stamp-toolbar-portal-wrapper';\n\n/**\n * Inject N nút stamp vào thanh tool chính của Excalidraw\n * (`.App-toolbar .Stack_horizontal`) — số nút = registry.length. Mỗi nút kế\n * thừa CSS native (cùng kích thước, hover, selected state, keybinding label).\n *\n * Pattern: ReactDOM portal vào 1 DOM node được append vào toolbar. Dùng\n * `MutationObserver` để re-mount nếu Excalidraw xoá wrapper hoặc re-render\n * toolbar (đổi orientation, mobile/desktop switch...).\n */\nexport function ToolbarInjector({\n enabled,\n activeStampKind,\n onToggle,\n stamps = DEFAULT_STAMPS,\n}: Props) {\n const [mountNode, setMountNode] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!enabled) {\n setMountNode(null);\n return;\n }\n\n let cancelled = false;\n let attempts = 0;\n let observer: MutationObserver | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const tryMount = () => {\n if (cancelled) return;\n // Container thật chứa tất cả tool icons trong Excalidraw 0.18+ là\n // `.App-toolbar .Stack.Stack_horizontal`. Class `.Shape` là class trên\n // <label> của mỗi tool radio, không phải parent.\n const container =\n document.querySelector('.excalidraw .App-toolbar .Stack_horizontal') ??\n document.querySelector('.App-toolbar .Stack_horizontal');\n if (!container) {\n if (attempts++ < 20) {\n timer = setTimeout(tryMount, 100);\n }\n return;\n }\n // Nếu wrapper cũ tồn tại (HMR / re-mount) thì tái sử dụng\n let wrapper = container.querySelector<HTMLDivElement>('#' + WRAPPER_ID);\n if (!wrapper) {\n wrapper = document.createElement('div');\n wrapper.id = WRAPPER_ID;\n wrapper.className = 'Stamp-toolbar-injector';\n wrapper.setAttribute('data-stamp-area', 'true');\n wrapper.style.display = 'inline-flex';\n wrapper.style.alignItems = 'center';\n wrapper.style.gap = '4px';\n wrapper.style.marginInlineStart = '6px';\n wrapper.style.paddingInlineStart = '6px';\n wrapper.style.borderInlineStart = '1px solid var(--default-border-color, rgba(0,0,0,0.1))';\n // Insert before the \"More tools\" dropdown button (last child) nếu có,\n // còn không thì append cuối.\n const moreTools = container.querySelector('.App-toolbar__extra-tools-dropdown')\n ?? container.querySelector('button[aria-label*=\"More tools\" i]');\n if (moreTools && moreTools.parentElement === container) {\n container.insertBefore(wrapper, moreTools);\n } else {\n container.appendChild(wrapper);\n }\n }\n setMountNode(wrapper);\n };\n\n tryMount();\n\n const root = document.querySelector('.excalidraw') ?? document.body;\n observer = new MutationObserver(() => {\n if (cancelled) return;\n const stillThere = document.getElementById(WRAPPER_ID);\n if (!stillThere) {\n attempts = 0;\n tryMount();\n }\n });\n observer.observe(root, { childList: true, subtree: true });\n\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n observer?.disconnect();\n document.getElementById(WRAPPER_ID)?.remove();\n };\n }, [enabled]);\n\n if (!enabled || !mountNode) return null;\n\n return createPortal(\n <>\n {stamps.map((stamp) => (\n <StampToolButton\n key={stamp.kind}\n icon={stamp.toolbarIcon}\n keybind={stamp.toolbarLabel}\n label={stamp.toolbarTitle}\n active={activeStampKind === stamp.kind}\n onClick={() => onToggle(stamp.kind)}\n dataTestId={stamp.toolbarTestId}\n />\n ))}\n </>,\n mountNode,\n );\n}\n\ninterface StampToolButtonProps {\n icon: React.ReactNode;\n keybind: string;\n label: string;\n active: boolean;\n onClick: () => void;\n dataTestId?: string;\n}\n\n/**\n * Render mỗi nút như 1 `<button>` đơn lẻ với class `.ToolIcon.Shape` —\n * cùng pattern Excalidraw apply cho các tool radio: outer `<label class=\"ToolIcon Shape\">`\n * sizing 36×36, inner `.ToolIcon__icon`. Vì Excalidraw set `.ToolIcon` flex layout\n * và size lên label, ta render button trực tiếp ở vị trí ngang hàng (không lồng\n * trong label) và áp dụng CSS sizing thủ công cho khớp 36×36.\n */\nfunction StampToolButton({ icon, keybind, label, active, onClick, dataTestId }: StampToolButtonProps) {\n return (\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n aria-pressed={active}\n onClick={onClick}\n data-testid={dataTestId}\n className=\"ToolIcon Shape\"\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 'var(--lg-button-size, 2.25rem)',\n height: 'var(--lg-button-size, 2.25rem)',\n padding: 0,\n margin: 0,\n background: active ? 'var(--color-primary-light, #e0e7ff)' : 'transparent',\n border: 0,\n borderRadius: 'var(--space-factor, 0.25rem)',\n color: active ? 'var(--color-primary, #6965db)' : 'var(--icon-fill-color, #1b1b1f)',\n cursor: 'pointer',\n transition: 'background 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!active) e.currentTarget.style.background = 'var(--button-hover-bg, rgba(0,0,0,0.06))';\n }}\n onMouseLeave={(e) => {\n if (!active) e.currentTarget.style.background = 'transparent';\n }}\n >\n <div\n aria-hidden=\"true\"\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n {icon}\n </div>\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n right: '3px',\n bottom: '2px',\n fontSize: '0.5625rem',\n color: 'var(--keybinding-color, #6b7280)',\n fontFamily: 'var(--ui-font, system-ui)',\n fontWeight: 400,\n pointerEvents: 'none',\n }}\n >\n {keybind}\n </span>\n </button>\n );\n}\n","import { useEffect } from 'react';\nimport { DEFAULT_STAMPS } from './registry';\nimport type { StampType } from './types';\n\ninterface Options {\n enabled: boolean;\n /** Toggle stamp theo kind khi user bấm shortcut tương ứng. */\n onToggle: (kind: string) => void;\n /** Registry. Mặc định DEFAULT_STAMPS. */\n stamps?: ReadonlyArray<StampType>;\n}\n\nfunction isEditableTarget(t: EventTarget | null): boolean {\n if (!t || !(t instanceof HTMLElement)) return false;\n if (t.isContentEditable) return true;\n const tag = t.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n}\n\n/**\n * Bind keyboard shortcut cho mỗi stamp trong registry. Capture phase +\n * stopPropagation để chặn trước Excalidraw's bubble-phase handlers (Excalidraw\n * dùng `L` cho Line tool, nếu không chặn → bấm L lại chuyển tool thay vì\n * toggle LaTeX panel).\n */\nexport function useShortcuts({\n enabled,\n onToggle,\n stamps = DEFAULT_STAMPS,\n}: Options): void {\n useEffect(() => {\n if (!enabled) return;\n const keyToKind = new Map<string, string>();\n for (const s of stamps) keyToKind.set(s.shortcutKey, s.kind);\n\n const handler = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isEditableTarget(e.target)) return;\n const key = e.key.toLowerCase();\n const kind = keyToKind.get(key);\n if (!kind) return;\n e.preventDefault();\n e.stopPropagation();\n onToggle(kind);\n };\n window.addEventListener('keydown', handler, { capture: true });\n return () => window.removeEventListener('keydown', handler, { capture: true });\n }, [enabled, onToggle, stamps]);\n}\n","// Regenerate Excalidraw BinaryFiles for stamp elements after page reload.\n//\n// Why this exists: VideoRoom only persists the Excalidraw scene (elements +\n// appState) to sessionStorage; binary files (the SVG dataURLs for stamp\n// images) are NOT persisted. After reload, elements still reference a fileId\n// via customData, but the file payload is missing — Excalidraw renders the\n// image area as an empty placeholder.\n//\n// Strategy: tra registry để tìm StampType khớp customData.kind. Nếu stamp có\n// `restoreFileFromCustomData`, gọi trực tiếp với full element (stamp tự lấy\n// fileId + render). Ngược lại, fallback sang `renderSvgFromCustomData` (path\n// cũ: filter type=image + fileId + kiểm tra existing files).\n//\n// Excalidraw key trên fileId chứ không phải hash dataURL nên nếu kết quả\n// render có sai khác nhỏ (vd thứ tự element) cũng không ảnh hưởng.\n//\n// Theme: stamps được render với LIGHT palette (nét đậm). Excalidraw áp dụng\n// `filter: invert(...)` lên canvas trong dark mode → nét tự đảo sáng. KHÔNG\n// cần force regenerate khi user toggle theme.\n\nimport { DEFAULT_STAMPS, findStampForCustomData } from './registry';\nimport type { StampType } from './types';\n\ninterface ElementLike {\n id: string;\n type?: string;\n fileId?: string | null;\n customData?: unknown;\n}\n\ninterface AddFileRecord {\n id: string;\n dataURL: string;\n mimeType: string;\n created: number;\n}\n\nfunction svgToDataURL(svg: string): string {\n const utf8 = unescape(encodeURIComponent(svg));\n return 'data:image/svg+xml;base64,' + btoa(utf8);\n}\n\nasync function buildFileForStamp(\n fileId: string,\n customData: unknown,\n stamp: StampType,\n): Promise<AddFileRecord | null> {\n try {\n const svg = await stamp.renderSvgFromCustomData(customData);\n return { id: fileId, dataURL: svgToDataURL(svg), mimeType: 'image/svg+xml', created: Date.now() };\n } catch (err) {\n console.warn('Stamp restore failed for', fileId, '(' + stamp.kind + ')', err);\n return null;\n }\n}\n\n/**\n * Find stamp elements whose binary file is missing from Excalidraw, then\n * regenerate via registry dispatch. Idempotent: safe to call on every scene\n * update.\n *\n * Stamps that implement `restoreFileFromCustomData` are handled via the new\n * registry-driven path (stamp receives the full element and returns the file\n * record). Stamps that only implement `renderSvgFromCustomData` use the legacy\n * path (filter type=image + fileId, skip already-present files).\n *\n * @param api Excalidraw imperative API.\n * @param elements Tất cả elements trong scene.\n * @param stamps Registry. Default = DEFAULT_STAMPS.\n */\nexport async function restoreMissingStampFiles(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api: any,\n elements: readonly ElementLike[],\n stamps: ReadonlyArray<StampType> = DEFAULT_STAMPS,\n): Promise<void> {\n if (!api) return;\n\n const filesToAdd: AddFileRecord[] = [];\n\n // --- New registry-driven path: stamp.restoreFileFromCustomData ---\n const newPathHandled = new Set<string>();\n for (const el of elements) {\n const stamp = findStampForCustomData(el.customData, stamps);\n if (!stamp?.restoreFileFromCustomData) continue;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const restored = await stamp.restoreFileFromCustomData(el as any);\n if (!restored) continue;\n newPathHandled.add(el.id);\n filesToAdd.push({\n id: restored.fileId,\n dataURL: restored.dataURL,\n mimeType: restored.mimeType,\n created: Date.now(),\n });\n }\n\n // --- Legacy path: stamp.renderSvgFromCustomData (type=image + fileId filter) ---\n const existing = (typeof api.getFiles === 'function') ? api.getFiles() : {};\n const seen = new Set<string>();\n for (const el of elements) {\n if (newPathHandled.has(el.id)) continue;\n if (el.type !== 'image') continue;\n if (!el.fileId) continue;\n if (existing && existing[el.fileId]) continue;\n if (seen.has(el.fileId)) continue;\n const stamp = findStampForCustomData(el.customData, stamps);\n if (!stamp) continue;\n seen.add(el.fileId);\n const built = await buildFileForStamp(el.fileId, el.customData, stamp);\n if (built) filesToAdd.push(built);\n }\n\n if (filesToAdd.length > 0) {\n try { api.addFiles(filesToAdd); } catch (err) { console.warn('addFiles failed:', err); }\n }\n}\n","import type { ExcalidrawElement, SyncableAppState } from '../../types';\n\nconst PREFIX = 'whiteboard:scene:';\nconst SCHEMA_VERSION = 1 as const;\n\nexport interface StoredScene {\n version: typeof SCHEMA_VERSION;\n elements: readonly ExcalidrawElement[];\n appState: Partial<SyncableAppState>;\n savedAt: number;\n}\n\nfunction fullKey(key: string): string {\n return PREFIX + key;\n}\n\nexport function readScene(key: string): StoredScene | null {\n if (typeof window === 'undefined') return null;\n const raw = window.localStorage.getItem(fullKey(key));\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<StoredScene>;\n if (!parsed || typeof parsed !== 'object') return null;\n if (parsed.version !== SCHEMA_VERSION) {\n // Cố ý KHÔNG xoá entry — version mismatch có thể là dữ liệu của client\n // mới hơn (user vừa downgrade). Giữ lại để client tương ứng đọc được sau.\n console.warn(\n `[whiteboard] scene version ${parsed.version} không khớp ${SCHEMA_VERSION}, bỏ qua.`,\n );\n return null;\n }\n if (!Array.isArray(parsed.elements)) return null;\n return {\n version: SCHEMA_VERSION,\n elements: parsed.elements,\n appState: (parsed.appState ?? {}) as Partial<SyncableAppState>,\n savedAt: typeof parsed.savedAt === 'number' ? parsed.savedAt : Date.now(),\n };\n } catch (err) {\n console.warn('[whiteboard] scene parse error, clear:', err);\n try {\n window.localStorage.removeItem(fullKey(key));\n } catch { /* ignore */ }\n return null;\n }\n}\n\nexport function writeScene(\n key: string,\n payload: { elements: readonly ExcalidrawElement[]; appState: Partial<SyncableAppState> },\n): void {\n if (typeof window === 'undefined') return;\n const record: StoredScene = {\n version: SCHEMA_VERSION,\n elements: payload.elements,\n appState: payload.appState,\n savedAt: Date.now(),\n };\n try {\n window.localStorage.setItem(fullKey(key), JSON.stringify(record));\n } catch (err) {\n console.warn('[whiteboard] scene write failed:', err);\n }\n}\n\nexport function clearScene(key: string): void {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.removeItem(fullKey(key));\n } catch { /* ignore */ }\n}\n","import type { BinaryFiles } from '../../types';\n\nconst DB_NAME = 'whiteboard-files';\nconst DB_VERSION = 1;\nconst STORE = 'files';\n\ninterface FileRecord {\n id: string;\n storageKey: string;\n dataURL: string;\n mimeType: string;\n created: number;\n savedAt: number;\n}\n\nlet dbPromise: Promise<IDBDatabase> | null = null;\nlet idbDisabled = false;\n\nfunction openDb(): Promise<IDBDatabase> {\n if (idbDisabled) return Promise.reject(new Error('IndexedDB disabled'));\n if (dbPromise) return dbPromise;\n dbPromise = new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') {\n idbDisabled = true;\n reject(new Error('indexedDB undefined'));\n return;\n }\n const req = indexedDB.open(DB_NAME, DB_VERSION);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE)) {\n const store = db.createObjectStore(STORE, { keyPath: 'id' });\n store.createIndex('storageKey', 'storageKey', { unique: false });\n }\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => {\n idbDisabled = true;\n reject(req.error ?? new Error('IDB open failed'));\n };\n });\n return dbPromise;\n}\n\nasync function withStore<T>(\n mode: IDBTransactionMode,\n fn: (\n store: IDBObjectStore,\n setResult: (value: T) => void,\n fail: (error: unknown) => void,\n ) => void,\n fallback: T,\n): Promise<T> {\n let db: IDBDatabase;\n try {\n db = await openDb();\n } catch {\n return fallback;\n }\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(STORE, mode);\n const store = tx.objectStore(STORE);\n let result = fallback;\n try {\n fn(\n store,\n (value) => {\n result = value;\n },\n reject,\n );\n } catch (err) {\n reject(err);\n return;\n }\n tx.oncomplete = () => resolve(result);\n tx.onerror = () => {\n console.warn('[whiteboard] IDB tx error:', tx.error);\n reject(tx.error ?? new Error('IDB tx error'));\n };\n tx.onabort = () => reject(tx.error ?? new Error('IDB tx aborted'));\n });\n}\n\nexport async function readFiles(storageKey: string): Promise<BinaryFiles> {\n try {\n return await withStore(\n 'readonly',\n (store, setResult, fail) => {\n const out: BinaryFiles = {};\n const req = store.index('storageKey').openCursor(IDBKeyRange.only(storageKey));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) {\n setResult(out);\n return;\n }\n const record = cursor.value as FileRecord;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (out as any)[record.id] = {\n dataURL: record.dataURL,\n mimeType: record.mimeType,\n created: record.created,\n };\n cursor.continue();\n };\n req.onerror = () => fail(req.error);\n },\n {},\n );\n } catch (err) {\n console.warn('[whiteboard] readFiles failed:', err);\n return {};\n }\n}\n\nexport async function writeFiles(storageKey: string, files: BinaryFiles): Promise<void> {\n const entries = Object.entries(files);\n if (entries.length === 0) return;\n try {\n await withStore<void>(\n 'readwrite',\n (store, setResult, fail) => {\n let pending = entries.length;\n const finishOne = () => {\n pending -= 1;\n if (pending === 0) setResult(undefined);\n };\n\n const now = Date.now();\n for (const [id, f] of entries) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ff = f as any;\n const getReq = store.get(id);\n getReq.onsuccess = () => {\n if (getReq.result) {\n finishOne();\n return;\n }\n const rec: FileRecord = {\n id,\n storageKey,\n dataURL: ff.dataURL,\n mimeType: ff.mimeType,\n created: ff.created ?? now,\n savedAt: now,\n };\n const putReq = store.put(rec);\n putReq.onsuccess = finishOne;\n putReq.onerror = () => fail(putReq.error);\n };\n getReq.onerror = () => fail(getReq.error);\n };\n },\n undefined,\n );\n } catch (err) {\n console.warn('[whiteboard] writeFiles failed:', err);\n }\n}\n\nexport async function pruneFiles(\n storageKey: string,\n keepIds: ReadonlySet<string>,\n): Promise<void> {\n try {\n await withStore<void>(\n 'readwrite',\n (store, setResult, fail) => {\n const req = store.index('storageKey').openCursor(IDBKeyRange.only(storageKey));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) {\n setResult(undefined);\n return;\n }\n const record = cursor.value as FileRecord;\n if (keepIds.has(record.id)) {\n cursor.continue();\n return;\n }\n const deleteReq = cursor.delete();\n deleteReq.onsuccess = () => cursor.continue();\n deleteReq.onerror = () => fail(deleteReq.error);\n };\n req.onerror = () => fail(req.error);\n },\n undefined,\n );\n } catch (err) {\n console.warn('[whiteboard] pruneFiles failed:', err);\n }\n}\n\nexport async function clearAll(storageKey: string): Promise<void> {\n try {\n await withStore<void>(\n 'readwrite',\n (store, setResult, fail) => {\n const req = store.index('storageKey').openCursor(IDBKeyRange.only(storageKey));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) {\n setResult(undefined);\n return;\n }\n const deleteReq = cursor.delete();\n deleteReq.onsuccess = () => cursor.continue();\n deleteReq.onerror = () => fail(deleteReq.error);\n };\n req.onerror = () => fail(req.error);\n },\n undefined,\n );\n } catch (err) {\n console.warn('[whiteboard] clearAll failed:', err);\n }\n}\n","'use client';\n\nimport dynamic from 'next/dynamic';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n ExcalidrawElement,\n BinaryFiles,\n ExcalidrawSceneSnapshot,\n SyncableAppState,\n} from './types';\nimport { pickSyncableAppState } from './serialize';\nimport {\n isStampElement,\n DEFAULT_STAMPS,\n findStampForCustomData,\n type StampType,\n} from './stamps/shared/registry';\nimport { ToolbarInjector } from './stamps/shared/ToolbarInjector';\nimport { useShortcuts } from './stamps/shared/useShortcuts';\nimport { restoreMissingStampFiles } from './stamps/shared/restoreStampFiles';\nimport type { StampHostHandle } from './stamps/shared/types';\nimport { readScene, writeScene } from './core/persistence/sceneStore';\nimport { readFiles, writeFiles, pruneFiles } from './core/persistence/fileStore';\nimport '@excalidraw/excalidraw/index.css';\nimport './stamps/shared/stamp.css';\n\nconst Excalidraw = dynamic(\n async () => (await import('./ExcalidrawWithMenus')).ExcalidrawWithMenus,\n {\n ssr: false,\n loading: () => (\n <div className=\"flex h-full items-center justify-center text-sm text-gray-500\">\n Đang tải bảng…\n </div>\n ),\n },\n);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nconst SYNC_THROTTLE_MS = 200;\nconst DOUBLE_CLICK_MS = 400;\n\n/** Element đang re-edit (double-click) — đủ tối thiểu để Host parse customData. */\ninterface EditingElement {\n id: string;\n customData: unknown;\n}\n\nexport interface WhiteboardProps {\n /**\n * Storage key cho persist client-side.\n * - Scene -> localStorage['whiteboard:scene:'+storageKey]\n * - Files raster -> IndexedDB 'whiteboard-files' index theo storageKey\n * - Default: 'default'\n * - Truyen `null` de tat persist (consumer drive state qua onApi).\n */\n storageKey?: string | null;\n\n /** View-only (Excalidraw viewModeEnabled). Default false. */\n readOnly?: boolean;\n\n /** Local edits -> consumer broadcast. Optional. */\n onSceneChange?: (snapshot: ExcalidrawSceneSnapshot) => void;\n onFilesChange?: (files: BinaryFiles, newFileIds: string[]) => void;\n\n /** Excalidraw imperative API. Consumer dung inject remote scene khi can. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onApi?: (api: any) => void;\n\n /** Excalidraw UI language. Defaults to 'vi-VN'. See @excalidraw/excalidraw locales. */\n langCode?: string;\n\n /**\n * Danh sách stamp đăng ký. Mỗi stamp khai báo phím tắt + toolbar button +\n * Host component (UI editing). Mặc định DEFAULT_STAMPS (geometry + latex).\n * Truyền `[...DEFAULT_STAMPS, customStamp]` để thêm stamp mới.\n */\n stamps?: ReadonlyArray<StampType>;\n}\n\nexport function Whiteboard({\n storageKey = 'default',\n readOnly = false,\n onSceneChange,\n onFilesChange,\n onApi,\n langCode = 'vi-VN',\n stamps = DEFAULT_STAMPS,\n}: WhiteboardProps) {\n const [api, setApi] = useState<ExApi | null>(null);\n const [isDarkTheme, setIsDarkTheme] = useState(false);\n const knownFileIdsRef = useRef<Set<string>>(new Set());\n const lastSceneHashRef = useRef<string>('');\n const sceneThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const fileThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pruneThrottleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestSceneRef = useRef<{\n elements: readonly ExcalidrawElement[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n appState: any;\n } | null>(null);\n const pendingFilesRef = useRef<BinaryFiles>({});\n const persistEnabled = typeof storageKey === 'string' && storageKey.length > 0;\n const persistKeyRef = useRef(storageKey);\n persistKeyRef.current = storageKey;\n\n const persistedInitial = useMemo(\n () => (persistEnabled ? readScene(storageKey as string) : null),\n [persistEnabled, storageKey],\n );\n const effectiveInitialScene: ExcalidrawSceneSnapshot | null = persistedInitial\n ? {\n elements: persistedInitial.elements,\n appState: persistedInitial.appState as SyncableAppState,\n }\n : null;\n\n // ---- Stamp state (registry-driven) ----\n const [activeStamp, setActiveStamp] = useState<string | null>(null);\n const activeStampRef = useRef(activeStamp);\n activeStampRef.current = activeStamp;\n const [editingElement, setEditingElement] = useState<EditingElement | null>(null);\n const hostRef = useRef<StampHostHandle | null>(null);\n\n const lastClickRef = useRef<{ time: number; elementId: string | null }>({\n time: 0,\n elementId: null,\n });\n const handledCropIdRef = useRef<string | null>(null);\n const prevExcalidrawToolRef = useRef<string>('selection');\n\n const stampByKind = useMemo(() => {\n const m = new Map<string, StampType>();\n for (const s of stamps) m.set(s.kind, s);\n return m;\n }, [stamps]);\n\n const activeStampDef = activeStamp ? stampByKind.get(activeStamp) ?? null : null;\n const HostComponent = activeStampDef?.Host ?? null;\n\n // ---- Open / close helpers ----\n const openStamp = useCallback(\n (kind: string, element: EditingElement | null = null) => {\n if (readOnly) return;\n if (!stampByKind.has(kind)) return;\n setEditingElement(element);\n setActiveStamp(kind);\n },\n [readOnly, stampByKind],\n );\n\n const closeStamp = useCallback(() => {\n setActiveStamp(null);\n setEditingElement(null);\n }, []);\n\n const toggleStampByKind = useCallback(\n (kind: string) => {\n if (activeStamp === kind) closeStamp();\n else openStamp(kind);\n },\n [activeStamp, openStamp, closeStamp],\n );\n\n // ---- Capture local changes ----\n const handleChange = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (elements: readonly ExcalidrawElement[], appState: any, files: BinaryFiles) => {\n // Sync theme từ Excalidraw appState -> React state.\n const nextDark = appState?.theme === 'dark';\n setIsDarkTheme((prev) => (prev === nextDark ? prev : nextDark));\n\n if (readOnly) return;\n latestSceneRef.current = { elements, appState };\n\n // Intercept Excalidraw crop-image flow cho math stamps: khi user double-click\n // 1 stamp, Excalidraw set appState.croppingElementId. Ta dismiss crop mode +\n // mở Host editor tương ứng. handlePointerDown phát hiện double-click sớm\n // hơn — đây là fallback (đặc biệt khi click rơi vào selection handle).\n const cropId = appState?.croppingElementId as string | null | undefined;\n if (cropId && cropId !== handledCropIdRef.current && api) {\n const el = elements.find((e: ExcalidrawElement) => e.id === cropId);\n if (el) {\n const stamp = findStampForCustomData((el as { customData?: unknown }).customData, stamps);\n if (stamp) {\n handledCropIdRef.current = cropId;\n api.updateScene({\n appState: { ...appState, croppingElementId: null, selectedElementIds: {} },\n });\n openStamp(stamp.kind, {\n id: el.id,\n customData: (el as { customData?: unknown }).customData,\n });\n return;\n }\n }\n }\n if (!cropId) {\n handledCropIdRef.current = null;\n }\n\n const fileIds = Object.keys(files);\n const newIds = fileIds.filter((id) => !knownFileIdsRef.current.has(id));\n if (newIds.length > 0) {\n newIds.forEach((id) => knownFileIdsRef.current.add(id));\n onFilesChange?.(files, newIds);\n }\n\n if (!sceneThrottleRef.current) {\n sceneThrottleRef.current = setTimeout(async () => {\n sceneThrottleRef.current = null;\n const mod = await import('@excalidraw/excalidraw');\n const latestScene = latestSceneRef.current ?? { elements, appState };\n const liveElements = latestScene.elements.filter((e) => !e.isDeleted) as readonly ExcalidrawElement[];\n const liveAppState = pickSyncableAppState(latestScene.appState);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const elementHash = (mod as any).hashElementsVersion(liveElements);\n const sceneHash = `${elementHash}:${JSON.stringify(liveAppState)}`;\n if (sceneHash === lastSceneHashRef.current) return;\n lastSceneHashRef.current = sceneHash;\n onSceneChange?.({ elements: liveElements, appState: liveAppState });\n\n if (persistEnabled) {\n writeScene(storageKey as string, {\n elements: liveElements,\n appState: liveAppState,\n });\n }\n }, SYNC_THROTTLE_MS);\n }\n\n // File throttle (1s): lưu raster vào IDB, bỏ math-stamp files.\n if (persistEnabled && newIds.length > 0) {\n for (const id of newIds) {\n if (files[id]) pendingFilesRef.current[id] = files[id];\n }\n if (!fileThrottleRef.current) {\n fileThrottleRef.current = setTimeout(() => {\n fileThrottleRef.current = null;\n const pending = pendingFilesRef.current;\n pendingFilesRef.current = {};\n const currentElements = (api?.getSceneElements?.() ?? elements) as readonly ExcalidrawElement[];\n const stampIds = new Set<string>();\n for (const el of currentElements) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fid = (el as any).fileId as string | undefined;\n if (fid && isStampElement(el)) stampIds.add(fid);\n }\n const raster: BinaryFiles = {};\n for (const [id, f] of Object.entries(pending)) {\n if (!stampIds.has(id)) raster[id] = f;\n }\n if (Object.keys(raster).length > 0) {\n void writeFiles(persistKeyRef.current as string, raster);\n }\n }, 1000);\n }\n }\n\n // Prune throttle (2s): dọn orphan raster sau khi xoá element.\n if (persistEnabled && !pruneThrottleRef.current) {\n pruneThrottleRef.current = setTimeout(() => {\n pruneThrottleRef.current = null;\n const currentElements = (api?.getSceneElements?.() ?? elements) as readonly ExcalidrawElement[];\n const keep = new Set<string>();\n for (const el of currentElements) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fid = (el as any).fileId as string | undefined;\n if (fid && !isStampElement(el)) keep.add(fid);\n }\n void pruneFiles(persistKeyRef.current as string, keep);\n }, 2000);\n }\n },\n [readOnly, api, onSceneChange, onFilesChange, persistEnabled, storageKey, stamps, openStamp],\n );\n\n // ---- Mount: load persisted raster files từ IDB -> addFiles ----\n useEffect(() => {\n if (!api || !persistEnabled) return;\n let cancelled = false;\n void readFiles(storageKey as string).then((files) => {\n if (cancelled) return;\n const entries = Object.entries(files);\n if (entries.length === 0) return;\n try {\n api.addFiles(\n entries.map(([id, f]) => ({\n id,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dataURL: (f as any).dataURL,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mimeType: (f as any).mimeType,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n created: (f as any).created ?? Date.now(),\n })),\n );\n entries.forEach(([id]) => knownFileIdsRef.current.add(id));\n } catch (err) {\n console.warn('[whiteboard] addFiles từ IDB thất bại:', err);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [api, persistEnabled, storageKey]);\n\n useEffect(() => {\n if (!api) return;\n let cancelled = false;\n const run = async () => {\n try {\n const elements = api.getSceneElements();\n if (!elements || elements.length === 0) return;\n if (cancelled) return;\n await restoreMissingStampFiles(api, elements, stamps);\n } catch (err) {\n console.warn('Math stamp restore pass failed:', err);\n }\n };\n run();\n const t = setTimeout(run, 400);\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [api, persistedInitial, stamps]);\n\n useEffect(\n () => () => {\n if (sceneThrottleRef.current) clearTimeout(sceneThrottleRef.current);\n if (fileThrottleRef.current) clearTimeout(fileThrottleRef.current);\n if (pruneThrottleRef.current) clearTimeout(pruneThrottleRef.current);\n },\n [],\n );\n\n // ---- Double-click detection for re-edit ----\n const handlePointerDown = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_activeTool: any, pointerDownState: any) => {\n if (readOnly) return;\n const hitElement = pointerDownState?.hit?.element;\n if (!hitElement || hitElement.type !== 'image') return;\n const stamp = findStampForCustomData(hitElement.customData, stamps);\n if (!stamp) return;\n const now = Date.now();\n const isDouble =\n lastClickRef.current.elementId === hitElement.id &&\n now - lastClickRef.current.time < DOUBLE_CLICK_MS;\n lastClickRef.current = { time: now, elementId: hitElement.id };\n if (!isDouble) return;\n openStamp(stamp.kind, {\n id: hitElement.id,\n customData: hitElement.customData,\n });\n },\n [readOnly, stamps, openStamp],\n );\n\n // ---- Keyboard shortcuts: đọc registry, mỗi stamp tự khai báo phím tắt ----\n useShortcuts({\n enabled: !readOnly,\n onToggle: toggleStampByKind,\n stamps,\n });\n\n // ---- Sync Excalidraw activeTool với activeStamp ----\n useEffect(() => {\n if (!api) return;\n if (activeStamp) {\n try {\n const cur = api.getAppState?.()?.activeTool?.type ?? 'selection';\n if (cur && cur !== 'hand') prevExcalidrawToolRef.current = cur;\n api.setActiveTool?.({ type: 'hand' });\n } catch { /* ignore */ }\n } else {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api.setActiveTool?.({ type: prevExcalidrawToolRef.current as any });\n } catch { /* ignore */ }\n }\n }, [activeStamp, api]);\n\n // ---- Block Excalidraw shortcuts khi stamp panel đang mở ----\n // Capture-phase keydown: chặn mọi phím (trừ editable input + modifier + Esc +\n // phím tắt của stamp đã đăng ký) để các shortcut 1-9, V, R, D... của\n // Excalidraw không trigger tool change sau editor.\n const stampShortcutKeys = useMemo(\n () => new Set(stamps.map((s) => s.shortcutKey.toLowerCase())),\n [stamps],\n );\n\n useEffect(() => {\n if (!activeStamp) return;\n const ALLOWED_KEYS = new Set([\n 'Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',\n 'Shift', 'Control', 'Alt', 'Meta', 'CapsLock',\n 'Home', 'End', 'PageUp', 'PageDown',\n ]);\n\n const isEditable = (el: EventTarget | null): boolean => {\n if (!(el instanceof HTMLElement)) return false;\n if (el.isContentEditable) return true;\n const tag = el.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n };\n\n const blocker = (e: KeyboardEvent) => {\n if (isEditable(e.target)) return;\n if (e.ctrlKey || e.metaKey) return;\n if (ALLOWED_KEYS.has(e.key)) return;\n if (e.key === 'Escape') return;\n if (stampShortcutKeys.has(e.key.toLowerCase())) return;\n e.preventDefault();\n e.stopPropagation();\n };\n window.addEventListener('keydown', blocker, { capture: true });\n return () => window.removeEventListener('keydown', blocker, { capture: true });\n }, [activeStamp, stampShortcutKeys]);\n\n // ---- Esc đóng panel (capture phase để chạy TRƯỚC Excalidraw) ----\n useEffect(() => {\n if (!activeStamp) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n const ae = document.activeElement as HTMLElement | null;\n if (ae && (ae.tagName === 'TEXTAREA' || ae.isContentEditable)) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n closeStamp();\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [activeStamp, closeStamp]);\n\n // ---- Click ra ngoài → auto-insert (nếu có nội dung) rồi đóng ----\n useEffect(() => {\n if (!activeStamp) return;\n let lastFireTime = 0;\n const handler = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n if (target.closest('[data-stamp-area=\"true\"]')) return;\n const now = Date.now();\n if (now - lastFireTime < 50) return;\n lastFireTime = now;\n // Trigger insert qua Host imperative API. Host quyết định có chèn được\n // không (geometry: log.length > 0; latex: input không rỗng + preview ok).\n hostRef.current?.tryInsert();\n closeStamp();\n };\n window.addEventListener('pointerdown', handler, { capture: true });\n window.addEventListener('mousedown', handler, { capture: true });\n return () => {\n window.removeEventListener('pointerdown', handler, { capture: true });\n window.removeEventListener('mousedown', handler, { capture: true });\n };\n }, [activeStamp, closeStamp]);\n\n return (\n <div className={`relative h-full w-full${isDarkTheme ? ' theme--dark' : ''}`}>\n <Excalidraw\n excalidrawAPI={(a: ExApi) => { setApi(a); onApi?.(a); }}\n langCode={langCode}\n viewModeEnabled={readOnly}\n initialData={\n effectiveInitialScene\n ? {\n elements: effectiveInitialScene.elements,\n appState: {\n ...effectiveInitialScene.appState,\n gridSize: effectiveInitialScene.appState.gridSize ?? undefined,\n },\n }\n : { appState: { viewBackgroundColor: '#ffffff' } }\n }\n onChange={handleChange}\n onPointerDown={handlePointerDown}\n />\n\n <ToolbarInjector\n enabled={!readOnly}\n activeStampKind={activeStamp}\n onToggle={toggleStampByKind}\n stamps={stamps}\n />\n\n {HostComponent && (\n <HostComponent\n ref={hostRef}\n api={api}\n editingElement={editingElement}\n onClose={closeStamp}\n isDark={isDarkTheme}\n />\n )}\n </div>\n );\n}\n"]}