@xom11/whiteboard 0.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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":["jsx","jsxs","useState","useEffect","pick","useRef","useCallback","Fragment","createPortal","LatexEditorPopover","forwardRef","GeometryEditorPanel","useImperativeHandle"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { AppState } from '@excalidraw/excalidraw/types';\nimport type { SyncableAppState } from './types';\n\nexport function pickSyncableAppState(s: AppState): SyncableAppState {\n return {\n viewBackgroundColor: s.viewBackgroundColor,\n zoom: s.zoom,\n scrollX: s.scrollX,\n scrollY: s.scrollY,\n gridSize: s.gridSize ?? null,\n theme: s.theme,\n };\n}\n","'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"]}