@xom11/whiteboard 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +36 -0
  2. package/dist/chunk-3SSQKRRO.mjs +58 -0
  3. package/dist/chunk-3SSQKRRO.mjs.map +1 -0
  4. package/dist/chunk-7P7SQFOW.mjs +39 -0
  5. package/dist/chunk-7P7SQFOW.mjs.map +1 -0
  6. package/dist/chunk-BJX4YNA5.mjs +137 -0
  7. package/dist/chunk-BJX4YNA5.mjs.map +1 -0
  8. package/dist/chunk-C6SCVOMC.mjs +111 -0
  9. package/dist/chunk-C6SCVOMC.mjs.map +1 -0
  10. package/dist/chunk-DJTBZEAR.mjs +25 -0
  11. package/dist/chunk-DJTBZEAR.mjs.map +1 -0
  12. package/dist/chunk-HM7RIXJE.mjs +331 -0
  13. package/dist/chunk-HM7RIXJE.mjs.map +1 -0
  14. package/dist/chunk-HTBLO5JO.mjs +41 -0
  15. package/dist/chunk-HTBLO5JO.mjs.map +1 -0
  16. package/dist/chunk-HYXFHEDJ.mjs +129 -0
  17. package/dist/chunk-HYXFHEDJ.mjs.map +1 -0
  18. package/dist/chunk-LPM4MM45.mjs +211 -0
  19. package/dist/chunk-LPM4MM45.mjs.map +1 -0
  20. package/dist/chunk-P2AOIF7S.mjs +40 -0
  21. package/dist/chunk-P2AOIF7S.mjs.map +1 -0
  22. package/dist/chunk-SHFOGORM.mjs +44 -0
  23. package/dist/chunk-SHFOGORM.mjs.map +1 -0
  24. package/dist/chunk-X5R72SSJ.mjs +52 -0
  25. package/dist/chunk-X5R72SSJ.mjs.map +1 -0
  26. package/dist/geometry-2d.d.mts +16 -0
  27. package/dist/geometry-2d.d.ts +16 -0
  28. package/dist/geometry-2d.js +3549 -0
  29. package/dist/geometry-2d.js.map +1 -0
  30. package/dist/geometry-2d.mjs +7 -0
  31. package/dist/geometry-2d.mjs.map +1 -0
  32. package/dist/geometry-3d.d.mts +16 -0
  33. package/dist/geometry-3d.d.ts +16 -0
  34. package/dist/geometry-3d.js +2030 -0
  35. package/dist/geometry-3d.js.map +1 -0
  36. package/dist/geometry-3d.mjs +6 -0
  37. package/dist/geometry-3d.mjs.map +1 -0
  38. package/dist/graph-2d.d.mts +16 -0
  39. package/dist/graph-2d.d.ts +16 -0
  40. package/dist/graph-2d.js +1725 -0
  41. package/dist/graph-2d.js.map +1 -0
  42. package/dist/graph-2d.mjs +6 -0
  43. package/dist/graph-2d.mjs.map +1 -0
  44. package/dist/host-2QGKMGCT.mjs +1066 -0
  45. package/dist/host-2QGKMGCT.mjs.map +1 -0
  46. package/dist/host-T2W6R6SO.mjs +2859 -0
  47. package/dist/host-T2W6R6SO.mjs.map +1 -0
  48. package/dist/host-XUFON6CQ.mjs +1422 -0
  49. package/dist/host-XUFON6CQ.mjs.map +1 -0
  50. package/dist/host-Z3TEJKZA.mjs +466 -0
  51. package/dist/host-Z3TEJKZA.mjs.map +1 -0
  52. package/dist/index.d.mts +27 -146
  53. package/dist/index.d.ts +27 -146
  54. package/dist/index.js +4694 -4482
  55. package/dist/index.js.map +1 -1
  56. package/dist/index.mjs +136 -7179
  57. package/dist/index.mjs.map +1 -1
  58. package/dist/latex.d.mts +15 -0
  59. package/dist/latex.d.ts +15 -0
  60. package/dist/latex.js +750 -0
  61. package/dist/latex.js.map +1 -0
  62. package/dist/latex.mjs +6 -0
  63. package/dist/latex.mjs.map +1 -0
  64. package/dist/types-CinstD7T.d.mts +110 -0
  65. package/dist/types-CinstD7T.d.ts +110 -0
  66. package/package.json +21 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stamps/geometry-3d/serialize.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-3d/editor/theme.ts","../src/stamps/geometry-3d/editor/handlers.ts","../src/stamps/geometry-3d/editor/MiniBoard3D.tsx","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/stamps/geometry-3d/editor/tools.ts","../src/stamps/geometry-3d/editor/toolButtons.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/geometry-3d/editor/LeftPanel.tsx","../src/stamps/shared/useChordShortcut.ts","../src/stamps/shared/svgToImage.ts","../src/stamps/shared/insertImage.ts","../src/stamps/shared/useIsMobile.ts","../src/stamps/geometry-3d/host.tsx","../src/stamps/geometry-3d/index.tsx","../src/stamps/geometry-3d/render.ts"],"names":["paletteFor","init_theme","radius","center","forwardRef","MiniBoard3D","useId","useRef","useState","useCallback","useEffect","p","useImperativeHandle","jsx","EditorPanel","jsxs","Fragment","useMemo","createPortal","Geometry3DStampHost","lazy"],"mappings":"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","file":"geometry-3d.js","sourcesContent":["import type { BaseStampCustomData } from '../shared/types';\n\nexport interface Geometry3DCustomData extends BaseStampCustomData {\n kind: 'geometry3d';\n version: 1;\n jsonState: string;\n svgWidth: number;\n svgHeight: number;\n}\n\nexport function isGeometry3DCustomData(data: unknown): data is Geometry3DCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<Geometry3DCustomData>;\n return d.kind === 'geometry3d' && d.version === 1 && typeof d.jsonState === 'string';\n}\n\nexport type Element3DType =\n | 'point3d'\n | 'line3d'\n | 'plane3d'\n | 'polygon3d'\n | 'sphere3d'\n | 'text3d';\n\nexport interface SerializedElement3D {\n type: Element3DType;\n /**\n * Parents passed to JSXGraph view.create. Either literal values (numbers,\n * strings) or `\"@id:<id>\"` placeholder strings referencing earlier created\n * objects in the log (resolved at deserialize time).\n */\n parents: unknown[];\n attributes: Record<string, unknown>;\n id: string;\n label?: string;\n}\n\nexport interface SerializedBoard3D {\n version: 1;\n bbox: [number, number, number, number];\n view: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n };\n showAxes: boolean;\n showMesh: boolean;\n elements: SerializedElement3D[];\n}\n\nexport function serializeBoard3D(state: SerializedBoard3D): string {\n return JSON.stringify(state);\n}\n\nexport function parseSerializedBoard3D(json: string): SerializedBoard3D {\n const parsed = JSON.parse(json) as unknown;\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('parseSerializedBoard3D: not an object');\n }\n const p = parsed as Partial<SerializedBoard3D>;\n if (p.version !== 1) {\n throw new Error(`parseSerializedBoard3D: unsupported version ${String(p.version)}`);\n }\n if (!Array.isArray(p.elements)) {\n throw new Error('parseSerializedBoard3D: elements missing');\n }\n return parsed as SerializedBoard3D;\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Creation log của JSXGraphMiniBoard lưu attrs dưới dạng \"sentinel\" string\n// (`@stroke`, `@axis`, `@grid`, `@label`) thay vì màu cụ thể. Khi:\n// 1. Editor render real-time → resolve theo `isDark` của editor.\n// 2. Offscreen re-render (sau reload / sau khi switch theme) → resolve theo\n// `isDark` của canvas Excalidraw hiện tại.\n//\n// Nhờ vậy stamp tự đổi màu khi user switch dark/light, giống các nét vẽ\n// native của Excalidraw.\n\nexport const themeStroke = (dark: boolean) => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean) => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean) => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean) => (dark ? '#e2e8f0' : '#000000');\n\nexport interface GeomPalette {\n stroke: string;\n axis: string;\n grid: string;\n label: string;\n}\n\nexport function paletteFor(isDark: boolean): GeomPalette {\n return {\n stroke: themeStroke(isDark),\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n };\n}\n\nconst SENTINEL_MAP: Record<string, keyof GeomPalette> = {\n '@stroke': 'stroke',\n '@axis': 'axis',\n '@grid': 'grid',\n '@label': 'label',\n};\n\n/**\n * Walk attrs object/array/string và thay sentinel bằng màu thực từ palette.\n * Đệ quy để hỗ trợ nested attrs (ví dụ polygon's `borders.strokeColor`).\n * Trả về object mới — input giữ nguyên (immutable, an toàn cho log).\n */\nexport function resolveAttrColors<T>(attrs: T, palette: GeomPalette): T {\n if (typeof attrs === 'string') {\n const key = SENTINEL_MAP[attrs];\n return (key ? palette[key] : attrs) as T;\n }\n if (Array.isArray(attrs)) {\n return attrs.map((a) => resolveAttrColors(a, palette)) as unknown as T;\n }\n if (attrs && typeof attrs === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(attrs as Record<string, unknown>)) {\n out[k] = resolveAttrColors(v, palette);\n }\n return out as T;\n }\n return attrs;\n}\n","import {\n paletteFor as palette2D,\n type GeomPalette,\n} from '../../geometry-2d/editor/theme';\n\nexport type Geom3DPalette = GeomPalette & {\n view3dBg: string;\n axisX: string;\n axisY: string;\n axisZ: string;\n};\n\nexport function paletteFor(isDark: boolean): Geom3DPalette {\n const base = palette2D(isDark);\n return {\n ...base,\n view3dBg: isDark ? '#1a1a1a' : '#ffffff',\n axisX: '#d63b3b',\n axisY: '#2d8a2d',\n axisZ: '#2d6dd6',\n };\n}\n\nexport const DEFAULT_VIEW3D: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n} = {\n azimuth: 0.7,\n elevation: 0.4,\n bbox3D: [-3, -3, -3, 3, 3, 3],\n};\n\nexport const VIEW3D_ATTRS = (isDark: boolean) => {\n const p = paletteFor(isDark);\n return {\n az: { slider: { visible: false }, point2: { visible: false } },\n el: { slider: { visible: false } },\n projection: 'central' as const,\n axesPosition: 'border' as const,\n xAxis: { strokeColor: p.axisX, lastArrow: { type: 2 } },\n yAxis: { strokeColor: p.axisY, lastArrow: { type: 2 } },\n zAxis: { strokeColor: p.axisZ, lastArrow: { type: 2 } },\n };\n};\n","import type { GeomTool3D } from './tools';\nimport type { SerializedElement3D, Element3DType } from '../serialize';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport interface HandlerContextDeps {\n view: { create: (kind: string, parents: unknown[], attrs: unknown) => JxgObj };\n pushLog: (e: SerializedElement3D) => void;\n objMap: Map<string, JxgObj>;\n nextId: () => string;\n isDark: boolean;\n promptCoords: (label: string) => { x: number; y: number; z: number } | null;\n promptNumber: (label: string) => number | null;\n promptText: (label: string) => string | null;\n notify: () => void;\n}\n\nexport interface PendingPoint {\n id: string;\n ref: JxgObj;\n coords: [number, number, number];\n}\n\nexport interface HandlerContext extends HandlerContextDeps {\n pendingPoints: PendingPoint[];\n /** Internal state flag for multi-stage tools (pyramid base done, etc.) */\n pendingFlags: Record<string, unknown>;\n /** World coords keyed by point id — used by label tool to anchor text3d. */\n pushedPointCoords: Map<string, [number, number, number]>;\n}\n\nexport interface ClickHit {\n x3: number;\n y3: number;\n z3: number;\n /** Existing point id if the click landed on an existing point. */\n existingPointId?: string;\n}\n\nexport function createHandlerContext(deps: HandlerContextDeps): HandlerContext {\n return {\n ...deps,\n pendingPoints: [],\n pendingFlags: {},\n pushedPointCoords: new Map(),\n };\n}\n\nfunction refByPlaceholder(id: string): string {\n return `@id:${id}`;\n}\n\nfunction createPoint3D(\n ctx: HandlerContext,\n x: number,\n y: number,\n z: number,\n label?: string,\n): PendingPoint {\n const id = ctx.nextId();\n const attrs: Record<string, unknown> = { id, size: 3 };\n if (label) attrs.name = label;\n const ref = ctx.view.create('point3d', [x, y, z], attrs);\n ctx.objMap.set(id, ref);\n ctx.pushedPointCoords.set(id, [x, y, z]);\n ctx.pushLog({\n type: 'point3d',\n parents: [x, y, z],\n attributes: attrs,\n id,\n label,\n });\n return { id, ref, coords: [x, y, z] };\n}\n\nfunction resolvePoint(ctx: HandlerContext, hit: ClickHit): PendingPoint {\n if (hit.existingPointId && ctx.objMap.has(hit.existingPointId)) {\n // Prefer the stored world coords (the click hit is screen-projected and\n // may differ); fall back to hit coords if the point predates this session.\n const stored = ctx.pushedPointCoords.get(hit.existingPointId);\n return {\n id: hit.existingPointId,\n ref: ctx.objMap.get(hit.existingPointId),\n coords: stored ?? [hit.x3, hit.y3, hit.z3],\n };\n }\n return createPoint3D(ctx, hit.x3, hit.y3, hit.z3);\n}\n\nfunction finishPolygon(\n ctx: HandlerContext,\n points: PendingPoint[],\n extraAttrs: Record<string, unknown> = {},\n): void {\n const id = ctx.nextId();\n const refs = points.map((p) => p.ref);\n const attrs = { id, ...extraAttrs };\n const ref = ctx.view.create('polygon3d', [refs], attrs);\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: 'polygon3d',\n parents: [points.map((p) => refByPlaceholder(p.id))],\n attributes: attrs,\n id,\n });\n}\n\nfunction finishLineLike(\n ctx: HandlerContext,\n elType: Element3DType,\n points: PendingPoint[],\n extraAttrs: Record<string, unknown> = {},\n): void {\n const id = ctx.nextId();\n const refs = points.map((p) => p.ref);\n const attrs = { id, ...extraAttrs };\n const ref = ctx.view.create(elType, refs, attrs);\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: elType,\n parents: points.map((p) => refByPlaceholder(p.id)),\n attributes: attrs,\n id,\n });\n}\n\nexport function handleToolStep(\n ctx: HandlerContext,\n tool: GeomTool3D,\n hit: ClickHit,\n): void {\n switch (tool) {\n case 'move':\n return;\n\n case 'point': {\n const coords = ctx.promptCoords('Toạ độ điểm (x, y, z)');\n if (!coords) return;\n createPoint3D(ctx, coords.x, coords.y, coords.z);\n ctx.notify();\n return;\n }\n\n case 'segment':\n case 'line': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 2) {\n // JSXGraph 3D has no `segment3d`; bound a `line3d` with straight* off for segment.\n // Explicit stroke + fixed to force visible render (default render is invisible\n // in view3d unless attrs are set — see Bug #9).\n const lineColor = ctx.isDark ? '#9ecbff' : '#0066cc';\n const baseAttrs: Record<string, unknown> = {\n strokeColor: lineColor,\n strokeWidth: 2,\n visible: true,\n fixed: true,\n };\n if (tool === 'segment') {\n baseAttrs.straightFirst = false;\n baseAttrs.straightLast = false;\n }\n finishLineLike(ctx, 'line3d', ctx.pendingPoints, baseAttrs);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'plane': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 3) {\n // plane3d in JSXGraph expects [point, direction1, direction2] but accepts\n // 3-point form for \"plane through A, B, C\".\n finishLineLike(ctx, 'plane3d', ctx.pendingPoints);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'triangle': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 3) {\n finishPolygon(ctx, ctx.pendingPoints);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'polygon': {\n if (\n ctx.pendingPoints.length >= 3 &&\n hit.existingPointId === ctx.pendingPoints[0].id\n ) {\n finishPolygon(ctx, ctx.pendingPoints);\n ctx.pendingPoints = [];\n ctx.notify();\n return;\n }\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n ctx.notify();\n return;\n }\n\n case 'label': {\n if (!hit.existingPointId) return;\n const text = ctx.promptText('Nội dung nhãn');\n if (!text) return;\n const id = ctx.nextId();\n // JSXGraph 1.12 `text3d` requires `[[x,y,z], text]` or `[x,y,z,text]`; the\n // `[pointRef, text]` form silently renders empty. Anchor coords come from\n // the host point (we already have its world coords from createPoint3D log).\n // Points are immutable in this editor (no drag-edit) so static coords are\n // safe.\n const pointLog = ctx.pushedPointCoords.get(hit.existingPointId);\n if (!pointLog) return;\n const [x, y, z] = pointLog;\n const attrs: Record<string, unknown> = {\n id,\n fontSize: 14,\n strokeColor: ctx.isDark ? '#f5f5f5' : '#111111',\n };\n const ref = ctx.view.create('text3d', [x, y, z, text], attrs);\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: 'text3d',\n parents: [x, y, z, text],\n attributes: attrs,\n id,\n label: text,\n });\n ctx.notify();\n return;\n }\n\n // Solids + curved handled in B8, B9\n default:\n handleSolidStep(ctx, tool, hit);\n return;\n }\n}\n\nexport function handleSolidStep(\n ctx: HandlerContext,\n tool: GeomTool3D,\n hit: ClickHit,\n): void {\n switch (tool) {\n case 'tetrahedron': {\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n if (ctx.pendingPoints.length === 4) {\n const [a, b, c, d] = ctx.pendingPoints;\n finishPolyhedron(ctx, [\n [a, b, c],\n [a, b, d],\n [a, c, d],\n [b, c, d],\n ]);\n ctx.pendingPoints = [];\n }\n ctx.notify();\n return;\n }\n\n case 'parallelepiped': {\n const origin = resolvePoint(ctx, hit);\n const v1 = ctx.promptCoords('Vector cạnh 1 (dx, dy, dz)');\n const v2 = ctx.promptCoords('Vector cạnh 2 (dx, dy, dz)');\n const v3 = ctx.promptCoords('Vector cạnh 3 (dx, dy, dz)');\n if (!v1 || !v2 || !v3) return;\n const [ox, oy, oz] = origin.coords;\n // 7 derived points (origin is reused as corner 0)\n const c1 = createPoint3D(ctx, ox + v1.x, oy + v1.y, oz + v1.z);\n const c2 = createPoint3D(ctx, ox + v2.x, oy + v2.y, oz + v2.z);\n const c3 = createPoint3D(ctx, ox + v3.x, oy + v3.y, oz + v3.z);\n const c12 = createPoint3D(\n ctx,\n ox + v1.x + v2.x,\n oy + v1.y + v2.y,\n oz + v1.z + v2.z,\n );\n const c13 = createPoint3D(\n ctx,\n ox + v1.x + v3.x,\n oy + v1.y + v3.y,\n oz + v1.z + v3.z,\n );\n const c23 = createPoint3D(\n ctx,\n ox + v2.x + v3.x,\n oy + v2.y + v3.y,\n oz + v2.z + v3.z,\n );\n const c123 = createPoint3D(\n ctx,\n ox + v1.x + v2.x + v3.x,\n oy + v1.y + v2.y + v3.y,\n oz + v1.z + v2.z + v3.z,\n );\n finishPolyhedron(ctx, [\n [origin, c1, c12, c2],\n [origin, c1, c13, c3],\n [origin, c2, c23, c3],\n [c123, c12, c1, c13],\n [c123, c12, c2, c23],\n [c123, c13, c3, c23],\n ]);\n ctx.pendingPoints = [];\n ctx.notify();\n return;\n }\n\n case 'prism': {\n if (\n ctx.pendingPoints.length >= 3 &&\n hit.existingPointId === ctx.pendingPoints[0].id\n ) {\n const base = ctx.pendingPoints;\n const height = ctx.promptNumber('Chiều cao (theo trục z)');\n if (!height) return;\n const top = base.map((bp) =>\n createPoint3D(ctx, bp.coords[0], bp.coords[1], bp.coords[2] + height),\n );\n const faces: PendingPoint[][] = [base, top];\n for (let i = 0; i < base.length; i++) {\n const next = (i + 1) % base.length;\n faces.push([base[i], base[next], top[next], top[i]]);\n }\n finishPolyhedron(ctx, faces);\n ctx.pendingPoints = [];\n ctx.notify();\n return;\n }\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n ctx.notify();\n return;\n }\n\n case 'pyramid': {\n const baseDone = ctx.pendingFlags.pyramidBaseDone === true;\n if (\n !baseDone &&\n ctx.pendingPoints.length >= 3 &&\n hit.existingPointId === ctx.pendingPoints[0].id\n ) {\n ctx.pendingFlags.pyramidBaseDone = true;\n ctx.notify();\n return;\n }\n if (baseDone) {\n const base = ctx.pendingPoints;\n const apex = createPoint3D(ctx, hit.x3, hit.y3, hit.z3);\n const faces: PendingPoint[][] = [base];\n for (let i = 0; i < base.length; i++) {\n const next = (i + 1) % base.length;\n faces.push([base[i], base[next], apex]);\n }\n finishPolyhedron(ctx, faces);\n ctx.pendingPoints = [];\n ctx.pendingFlags.pyramidBaseDone = false;\n ctx.notify();\n return;\n }\n const p = resolvePoint(ctx, hit);\n ctx.pendingPoints.push(p);\n ctx.notify();\n return;\n }\n\n // Curved → B9\n default:\n handleCurvedStep(ctx, tool, hit);\n return;\n }\n}\n\nfunction finishPolyhedron(ctx: HandlerContext, faces: PendingPoint[][]): void {\n // JSXGraph 1.12 `polyhedron3d` API requires `[vertices[], faceIndices[]]` (coords\n // + index arrays) — the previous `[facesAsPointRefs]` form throws `Cannot read\n // 'length' of undefined` at runtime. Emit one `polygon3d` per face instead;\n // polygon3d is proven to render (triangle test) and round-trips cleanly through\n // the existing render.ts path. See Bug #7.\n const faceColor = ctx.isDark ? 'rgba(150, 180, 220, 0.35)' : 'rgba(60, 120, 200, 0.25)';\n const edgeColor = ctx.isDark ? '#9ecbff' : '#0066cc';\n for (const face of faces) {\n finishPolygon(ctx, face, {\n fillColor: faceColor,\n fillOpacity: 1,\n strokeColor: edgeColor,\n strokeWidth: 1.5,\n visible: true,\n });\n }\n}\n\nconst CURVED_SEGMENTS = 16;\n\nexport function handleCurvedStep(\n ctx: HandlerContext,\n tool: GeomTool3D,\n hit: ClickHit,\n): void {\n switch (tool) {\n case 'sphere': {\n const radius = ctx.promptNumber('Bán kính mặt cầu');\n if (radius == null) return;\n const center = resolvePoint(ctx, hit);\n const id = ctx.nextId();\n const ref = ctx.view.create('sphere3d', [center.ref, radius], { id });\n ctx.objMap.set(id, ref);\n ctx.pushLog({\n type: 'sphere3d',\n parents: [refByPlaceholder(center.id), radius],\n attributes: { id },\n id,\n });\n ctx.notify();\n return;\n }\n\n case 'cone': {\n const baseDone = ctx.pendingFlags.coneBaseDone === true;\n if (!baseDone) {\n const radius = ctx.promptNumber('Bán kính đáy');\n if (radius == null) return;\n const center = resolvePoint(ctx, hit);\n ctx.pendingFlags.coneCenter = center;\n ctx.pendingFlags.coneRadius = radius;\n ctx.pendingFlags.coneBaseDone = true;\n ctx.notify();\n return;\n }\n // Second click = apex\n const center = ctx.pendingFlags.coneCenter as PendingPoint;\n const radius = ctx.pendingFlags.coneRadius as number;\n const apex = createPoint3D(ctx, hit.x3, hit.y3, hit.z3);\n const [cx, cy, cz] = center.coords;\n const basePoints: PendingPoint[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n basePoints.push(\n createPoint3D(\n ctx,\n cx + radius * Math.cos(theta),\n cy + radius * Math.sin(theta),\n cz,\n ),\n );\n }\n const faces: PendingPoint[][] = [basePoints];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n faces.push([basePoints[i], basePoints[(i + 1) % CURVED_SEGMENTS], apex]);\n }\n finishPolyhedron(ctx, faces);\n ctx.pendingFlags.coneBaseDone = false;\n ctx.pendingFlags.coneCenter = undefined;\n ctx.pendingFlags.coneRadius = undefined;\n ctx.notify();\n return;\n }\n\n case 'cylinder': {\n const radius = ctx.promptNumber('Bán kính đáy');\n if (radius == null) return;\n const height = ctx.promptNumber('Chiều cao (theo trục z)');\n if (height == null) return;\n const center = resolvePoint(ctx, hit);\n const [cx, cy, cz] = center.coords;\n const basePoints: PendingPoint[] = [];\n const topPoints: PendingPoint[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n basePoints.push(\n createPoint3D(\n ctx,\n cx + radius * Math.cos(theta),\n cy + radius * Math.sin(theta),\n cz,\n ),\n );\n topPoints.push(\n createPoint3D(\n ctx,\n cx + radius * Math.cos(theta),\n cy + radius * Math.sin(theta),\n cz + height,\n ),\n );\n }\n const faces: PendingPoint[][] = [basePoints, topPoints];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const next = (i + 1) % CURVED_SEGMENTS;\n faces.push([basePoints[i], basePoints[next], topPoints[next], topPoints[i]]);\n }\n finishPolyhedron(ctx, faces);\n ctx.notify();\n return;\n }\n\n // 'solidofrevolution' removed in 0.6.1 — `solidofrevolution3d` is not a valid\n // JSXGraph 1.12.2 element. See Bug #8.\n default:\n return;\n }\n}\n\n// Helpers exported for B8/B9 to reuse\nexport {\n createPoint3D,\n resolvePoint,\n refByPlaceholder,\n finishPolygon,\n finishLineLike,\n};\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { DEFAULT_VIEW3D, VIEW3D_ATTRS, paletteFor } from './theme';\nimport type { GeomTool3D } from './tools';\nimport type { SerializedBoard3D, SerializedElement3D } from '../serialize';\nimport {\n createHandlerContext,\n handleToolStep,\n type ClickHit,\n type HandlerContext,\n} from './handlers';\n\nexport interface MiniBoard3DHandle {\n getContainer: () => HTMLDivElement | null;\n getTool: () => GeomTool3D;\n setTool: (t: GeomTool3D) => void;\n getCreationLog: () => SerializedElement3D[];\n pushLog: (e: SerializedElement3D) => void;\n getViewState: () => {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n };\n getBbox: () => [number, number, number, number];\n getShowAxes: () => boolean;\n getShowMesh: () => boolean;\n setShowAxes: (b: boolean) => void;\n setShowMesh: (b: boolean) => void;\n resetView: () => void;\n undo: () => void;\n canUndo: () => boolean;\n snapshotSVG: () => { svgString: string; width: number; height: number };\n subscribe: (cb: () => void) => () => void;\n}\n\ninterface Props {\n isDark: boolean;\n initialState?: SerializedBoard3D | null;\n}\n\n// JSXGraph board / view types are not published — use minimal local shapes.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgBoard = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgView = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport const MiniBoard3D = forwardRef<MiniBoard3DHandle, Props>(function MiniBoard3D(\n { isDark, initialState },\n ref,\n) {\n const reactId = useId();\n const containerId = `geom3d_${reactId.replace(/[^a-zA-Z0-9_]/g, '_')}`;\n const containerRef = useRef<HTMLDivElement | null>(null);\n const boardRef = useRef<JxgBoard>(null);\n const viewRef = useRef<JxgView>(null);\n const toolRef = useRef<GeomTool3D>('move');\n const logRef = useRef<SerializedElement3D[]>([]);\n const objMapRef = useRef<Map<string, JxgObj>>(new Map());\n const subsRef = useRef<Set<() => void>>(new Set());\n const initialBbox3D = useRef<[number, number, number, number, number, number]>(\n initialState?.view.bbox3D ?? DEFAULT_VIEW3D.bbox3D,\n );\n const ctxRef = useRef<HandlerContext | null>(null);\n const pointerHandlerRef = useRef<{ el: HTMLElement | SVGElement; fn: EventListener } | null>(null);\n const [showAxes, setShowAxes] = useState(initialState?.showAxes ?? true);\n const [showMesh, setShowMesh] = useState(initialState?.showMesh ?? false);\n\n const notify = useCallback(() => {\n for (const cb of subsRef.current) cb();\n }, []);\n\n useEffect(() => {\n const div = containerRef.current;\n if (!div) return;\n let cancelled = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let JXG: any = null;\n let board: JxgBoard | null = null;\n\n void (async () => {\n JXG = (await import('jsxgraph')).default;\n if (cancelled || !containerRef.current) return;\n JXG.Options.text.display = 'internal';\n\n board = JXG.JSXGraph.initBoard(div, {\n boundingbox: [-6, 6, 6, -6],\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n });\n boardRef.current = board;\n\n const initView = initialState?.view ?? DEFAULT_VIEW3D;\n const baseAttrs = VIEW3D_ATTRS(isDark);\n const view: JxgView = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [initView.bbox3D[0], initView.bbox3D[3]],\n [initView.bbox3D[1], initView.bbox3D[4]],\n [initView.bbox3D[2], initView.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n az: { ...baseAttrs.az, value: initView.azimuth },\n el: { ...baseAttrs.el, value: initView.elevation },\n },\n );\n viewRef.current = view;\n\n // Wire pointer events to handlers\n let idCounter = 1;\n const ctx: HandlerContext = createHandlerContext({\n view,\n pushLog: (e) => {\n logRef.current.push(e);\n notify();\n },\n objMap: objMapRef.current,\n nextId: () => `obj_${Date.now().toString(36)}_${(idCounter++).toString(36)}`,\n isDark,\n promptCoords: (label) => {\n const raw = window.prompt(`${label}\\n(định dạng \"x,y,z\")`, '0,0,0');\n if (!raw) return null;\n const parts = raw.split(',').map((s) => Number(s.trim()));\n if (parts.length !== 3 || parts.some((n) => !isFinite(n))) return null;\n return { x: parts[0], y: parts[1], z: parts[2] };\n },\n promptNumber: (label) => {\n const raw = window.prompt(label, '1');\n if (raw == null) return null;\n const n = Number(raw);\n return isFinite(n) ? n : null;\n },\n promptText: (label) => {\n const raw = window.prompt(label, '');\n return raw == null ? null : raw;\n },\n notify,\n });\n ctxRef.current = ctx;\n\n // Helper: find existing point3d under pointer (returns its id) so polygon\n // close + segment chaining work.\n //\n // Bug #10 root cause: JSXGraph 3D `point3d` objects don't expose `coords`\n // directly — the rendered position lives on the auto-generated 2D shadow\n // `element2D.coords.scrCoords`. The earlier code read `obj.coords` which\n // was always undefined, so every iteration `continue`'d and the hit-test\n // never matched. View3d's screen↔world projection isn't lossless, so the\n // user's click position can differ from the rendered point by 100+ px;\n // using the shadow's actual screen coords fixes both that drift and the\n // synthetic-test miss.\n function findExistingPointAt(clientX: number, clientY: number): string | undefined {\n const containerRect = (div as HTMLDivElement).getBoundingClientRect();\n const localX = clientX - containerRect.left;\n const localY = clientY - containerRect.top;\n const PICK = 18;\n const svg = (div as HTMLDivElement).querySelector('svg');\n if (!svg) return undefined;\n for (const [id, obj] of objMapRef.current) {\n const entry = obj as {\n elType?: string;\n element2D?: { coords?: { scrCoords?: number[] } };\n };\n if (entry?.elType !== 'point3d') continue;\n const sc = entry.element2D?.coords?.scrCoords;\n if (!sc || sc.length < 3) continue;\n const dx = sc[1] - localX;\n const dy = sc[2] - localY;\n if (dx * dx + dy * dy <= PICK * PICK) return id;\n }\n return undefined;\n }\n\n const handlePointerDown = (e: PointerEvent) => {\n const tool = toolRef.current;\n if (tool === 'move') return;\n // Suppress default JSXGraph drag/select for tool clicks\n const existingPointId = findExistingPointAt(e.clientX, e.clientY);\n let x3 = 0;\n let y3 = 0;\n const z3 = 0;\n try {\n // 2D world coords from screen, project onto z=0 plane.\n const board2d = boardRef.current as\n | { getCoordsTopLeftCorner?: unknown; getUsrCoordsOfMouse?: (ev: Event) => [number, number] }\n | null;\n if (board2d?.getUsrCoordsOfMouse) {\n const uc = board2d.getUsrCoordsOfMouse(e);\n if (Array.isArray(uc) && uc.length >= 2) {\n x3 = uc[0];\n y3 = uc[1];\n }\n }\n } catch {\n /* fall back to 0,0,0 */\n }\n const hit: ClickHit = { x3, y3, z3, existingPointId };\n handleToolStep(ctx, tool, hit);\n };\n\n const svgEl = (div as HTMLDivElement).querySelector('svg');\n const targetEl = (svgEl ?? (div as HTMLDivElement)) as HTMLElement | SVGElement;\n const handlePointerDownEv: EventListener = (e) => handlePointerDown(e as PointerEvent);\n targetEl.addEventListener('pointerdown', handlePointerDownEv);\n pointerHandlerRef.current = { el: targetEl, fn: handlePointerDownEv };\n\n if (initialState?.elements?.length) {\n const map = objMapRef.current;\n for (const el of initialState.elements) {\n const parents = el.parents.map((p) =>\n typeof p === 'string' && p.startsWith('@id:') ? map.get(p.slice(4)) : p,\n );\n const obj = view.create(el.type, parents, {\n ...el.attributes,\n id: el.id,\n name: el.label,\n });\n map.set(el.id, obj);\n logRef.current.push(el);\n }\n }\n })();\n\n return () => {\n cancelled = true;\n if (pointerHandlerRef.current) {\n pointerHandlerRef.current.el.removeEventListener(\n 'pointerdown',\n pointerHandlerRef.current.fn,\n );\n pointerHandlerRef.current = null;\n }\n try {\n if (board && JXG) JXG.JSXGraph.freeBoard(board);\n } catch {\n /* ignore teardown errors in tests */\n }\n boardRef.current = null;\n viewRef.current = null;\n ctxRef.current = null;\n objMapRef.current.clear();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleRef = useRef<MiniBoard3DHandle | null>(null);\n handleRef.current = {\n getContainer: () => containerRef.current,\n getTool: () => toolRef.current,\n setTool: (t) => {\n toolRef.current = t;\n notify();\n },\n // Sync toạ độ live của free point3d về log trước khi trả ra. JSXGraph\n // cho phép drag point3d (parents=[x,y,z] không có ref), việc drag chỉ\n // cập nhật obj.X()/Y()/Z() chứ không đụng log → re-edit + Chèn sẽ\n // serialize toạ độ cũ → SVG không đổi → fileId trùng → user thấy\n // \"k thay đổi\". Line/plane/polygon/sphere tham chiếu point qua @id nên\n // auto-update theo.\n getCreationLog: () => logRef.current.map((e) => {\n if (e.type !== 'point3d') return { ...e };\n const parents = e.parents;\n if (!Array.isArray(parents) || parents.length !== 3) return { ...e };\n if (\n typeof parents[0] !== 'number' ||\n typeof parents[1] !== 'number' ||\n typeof parents[2] !== 'number'\n ) return { ...e };\n const obj = objMapRef.current.get(e.id) as\n | { X?: () => number; Y?: () => number; Z?: () => number }\n | undefined;\n if (\n !obj ||\n typeof obj.X !== 'function' ||\n typeof obj.Y !== 'function' ||\n typeof obj.Z !== 'function'\n ) return { ...e };\n const x = obj.X();\n const y = obj.Y();\n const z = obj.Z();\n if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) return { ...e };\n return { ...e, parents: [x, y, z] };\n }),\n pushLog: (e) => {\n logRef.current.push(e);\n notify();\n },\n getViewState: () => {\n const v = viewRef.current as { az?: { Value?: () => number }; el?: { Value?: () => number } } | null;\n return {\n azimuth: v?.az?.Value?.() ?? DEFAULT_VIEW3D.azimuth,\n elevation: v?.el?.Value?.() ?? DEFAULT_VIEW3D.elevation,\n bbox3D: initialBbox3D.current,\n };\n },\n getBbox: () => [-6, 6, 6, -6],\n getShowAxes: () => showAxes,\n getShowMesh: () => showMesh,\n setShowAxes: (b) => {\n setShowAxes(b);\n notify();\n },\n setShowMesh: (b) => {\n setShowMesh(b);\n notify();\n },\n resetView: () => {\n notify();\n },\n undo: () => {\n logRef.current.pop();\n notify();\n },\n canUndo: () => logRef.current.length > 0,\n snapshotSVG: () => {\n const div = containerRef.current;\n if (!div) return { svgString: '', width: 0, height: 0 };\n const svg = div.querySelector('svg');\n if (!svg) return { svgString: '', width: 0, height: 0 };\n const clone = svg.cloneNode(true) as SVGElement;\n const rect = svg.getBoundingClientRect();\n const width = rect.width || 600;\n const height = rect.height || 600;\n clone.setAttribute('width', String(width));\n clone.setAttribute('height', String(height));\n return {\n svgString: new XMLSerializer().serializeToString(clone),\n width,\n height,\n };\n },\n subscribe: (cb) => {\n subsRef.current.add(cb);\n return () => {\n subsRef.current.delete(cb);\n };\n },\n };\n\n useImperativeHandle(ref, () => handleRef.current!, []);\n\n const p = paletteFor(isDark);\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n style={{\n width: '100%',\n height: '100%',\n background: p.view3dBg,\n position: 'relative',\n // Clip JSXGraph mesh3d/bounding-box paths that project outside the\n // board container (Bug #4) — without this they overlap LeftPanel and\n // block pointer events.\n overflow: 'hidden',\n }}\n />\n );\n});\n","'use client';\nimport React, { forwardRef, useCallback, useImperativeHandle, useRef, useState } from 'react';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport type { SerializedBoard3D } from '../serialize';\n\nexport interface EditorPanelHandle {\n tryInsert: () => boolean;\n hasContent: () => boolean;\n}\n\ninterface Props {\n isDark: boolean;\n initial: SerializedBoard3D | null;\n onInsert: (jsonState: string, svgString: string, width: number, height: number) => void;\n onClose: () => void;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Khi true, panel position offset left để chừa chỗ cho LeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Callback expose board handle ra Host để LeftPanel sibling dùng được. */\n onBoardReady?: (handle: MiniBoard3DHandle | null) => void;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n}\n\nexport const EditorPanel = forwardRef<EditorPanelHandle, Props>(function EditorPanel(\n { isDark, initial, onInsert, onClose, isMobile = false, withLeftPanel = false, onBoardReady, onOpenDrawer },\n ref,\n) {\n const boardRef = useRef<MiniBoard3DHandle | null>(null);\n const [ready, setReady] = useState(false);\n const onBoardReadyRef = useRef(onBoardReady);\n onBoardReadyRef.current = onBoardReady;\n\n const setBoard = useCallback((h: MiniBoard3DHandle | null) => {\n boardRef.current = h;\n setReady(!!h);\n onBoardReadyRef.current?.(h);\n }, []);\n\n const performInsert = useCallback((): boolean => {\n const board = boardRef.current;\n if (!board) return false;\n const log = board.getCreationLog();\n if (log.length === 0) return false;\n const view = board.getViewState();\n const state: SerializedBoard3D = {\n version: 1,\n bbox: board.getBbox(),\n view,\n showAxes: board.getShowAxes(),\n showMesh: board.getShowMesh(),\n elements: log,\n };\n const snap = board.snapshotSVG();\n onInsert(JSON.stringify(state), snap.svgString, snap.width, snap.height);\n return true;\n }, [onInsert]);\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: performInsert,\n hasContent: () => (boardRef.current?.getCreationLog().length ?? 0) > 0,\n }),\n [performInsert],\n );\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học 3D\"\n data-testid=\"geom3d-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : 'h-[600px] max-h-[85vh] w-[760px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-blue-600 to-cyan-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 7 L14 4 L20 7 L14 10 Z M4 7 L4 17 L14 20 L14 10 M14 20 L20 17 L20 7\" />\n </svg>\n Hình học không gian (3D)\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geom3d-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n <div className=\"min-h-0 flex-1\">\n <MiniBoard3D ref={setBoard} isDark={isDark} initialState={initial} />\n </div>\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready}\n data-testid=\"geom3d-insert-btn\"\n className=\"rounded bg-blue-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-blue-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n );\n});\n","export type GeomTool3D =\n | 'move'\n | 'point'\n | 'segment'\n | 'line'\n | 'plane'\n | 'triangle'\n | 'polygon'\n | 'tetrahedron'\n | 'parallelepiped'\n | 'prism'\n | 'pyramid'\n | 'sphere'\n | 'cone'\n | 'cylinder'\n | 'label';\n\nexport type ToolGroup3D = 'view' | 'primitive' | 'solid' | 'curved' | 'meta';\n\nexport interface ToolDef3D {\n key: GeomTool3D;\n label: string;\n group: ToolGroup3D;\n stepsRequired: number;\n hint?: string;\n}\n\nexport const GROUP_LABELS_3D: Record<ToolGroup3D, string> = {\n view: 'Xem',\n primitive: 'Cơ bản',\n solid: 'Khối đa diện',\n curved: 'Khối cong',\n meta: 'Khác',\n};\n\n// Positional A..E — letter shortcut cho chord 2-phím.\nexport const GROUP_ORDER_3D: ToolGroup3D[] = [\n 'view',\n 'primitive',\n 'solid',\n 'curved',\n 'meta',\n];\n\nconst A_CODE_3D = 'A'.charCodeAt(0);\n\nexport function letterForGroup3D(g: ToolGroup3D): string {\n const idx = GROUP_ORDER_3D.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE_3D + idx) : '';\n}\n\nexport function groupForLetter3D(ch: string): ToolGroup3D | null {\n if (ch.length !== 1) return null;\n const upper = ch.toUpperCase();\n const idx = upper.charCodeAt(0) - A_CODE_3D;\n if (idx < 0 || idx >= GROUP_ORDER_3D.length) return null;\n return GROUP_ORDER_3D[idx];\n}\n\nexport const TOOLS_3D: ReadonlyArray<ToolDef3D> = [\n { key: 'move', label: 'Di chuyển', group: 'view', stepsRequired: 0 },\n { key: 'point', label: 'Điểm', group: 'primitive', stepsRequired: 1, hint: 'Nhập (x, y, z)' },\n { key: 'segment', label: 'Đoạn thẳng', group: 'primitive', stepsRequired: 2 },\n { key: 'line', label: 'Đường thẳng', group: 'primitive', stepsRequired: 2 },\n { key: 'plane', label: 'Mặt phẳng', group: 'primitive', stepsRequired: 3 },\n { key: 'triangle', label: 'Tam giác', group: 'primitive', stepsRequired: 3 },\n {\n key: 'polygon',\n label: 'Đa giác',\n group: 'primitive',\n stepsRequired: 3,\n hint: 'Click trở lại điểm đầu để đóng',\n },\n { key: 'tetrahedron', label: 'Tứ diện', group: 'solid', stepsRequired: 4 },\n {\n key: 'parallelepiped',\n label: 'Hình hộp',\n group: 'solid',\n stepsRequired: 1,\n hint: '1 đỉnh + 3 vector',\n },\n {\n key: 'prism',\n label: 'Lăng trụ',\n group: 'solid',\n stepsRequired: 3,\n hint: 'Đa giác đáy + chiều cao',\n },\n {\n key: 'pyramid',\n label: 'Chóp',\n group: 'solid',\n stepsRequired: 4,\n hint: 'Đa giác đáy + đỉnh',\n },\n { key: 'sphere', label: 'Mặt cầu', group: 'curved', stepsRequired: 1, hint: 'Tâm + bán kính' },\n {\n key: 'cone',\n label: 'Hình nón',\n group: 'curved',\n stepsRequired: 2,\n hint: 'Tâm đáy + bán kính + đỉnh',\n },\n {\n key: 'cylinder',\n label: 'Hình trụ',\n group: 'curved',\n stepsRequired: 1,\n hint: 'Tâm đáy + bán kính + chiều cao',\n },\n { key: 'label', label: 'Nhãn', group: 'meta', stepsRequired: 1, hint: 'Gắn vào điểm' },\n];\n","'use client';\nimport type { ReactNode } from 'react';\nimport type { GeomTool3D } from './tools';\n\ninterface ToolButtonProps {\n toolKey: GeomTool3D;\n label: string;\n hint?: string;\n active: boolean;\n onClick: () => void;\n icon: ReactNode;\n badge?: ReactNode;\n}\n\nexport function ToolButton({ toolKey, label, hint, active, onClick, icon, badge }: ToolButtonProps) {\n return (\n <button\n type=\"button\"\n title={hint ? `${label} — ${hint}` : label}\n aria-label={label}\n aria-pressed={active}\n onClick={onClick}\n data-active={active || undefined}\n data-tool={toolKey}\n className={[\n 'relative flex h-8 items-center justify-center rounded-md transition',\n active\n ? 'bg-blue-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {icon}\n {badge}\n </button>\n );\n}\n\nconst stroke = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n};\n\nexport const ICONS_3D: Record<GeomTool3D, ReactNode> = {\n move: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M5 9l-3 3 3 3M19 9l3 3-3 3M9 5l3-3 3 3M9 19l3 3 3-3\" />\n </svg>\n ),\n point: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" fill=\"currentColor\" />\n </svg>\n ),\n segment: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"4\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n line: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <line x1=\"2\" y1=\"22\" x2=\"22\" y2=\"2\" />\n </svg>\n ),\n plane: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M3 18 L8 8 L21 6 L16 18 Z\" />\n </svg>\n ),\n triangle: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 4 L21 20 L3 20 Z\" />\n </svg>\n ),\n polygon: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L20 9 L17 19 L7 19 L4 9 Z\" />\n </svg>\n ),\n tetrahedron: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L20 20 L4 20 Z M12 3 L12 20\" />\n </svg>\n ),\n parallelepiped: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M4 7 L14 4 L20 7 L14 10 Z M4 7 L4 17 L14 20 L14 10 M14 20 L20 17 L20 7\" />\n </svg>\n ),\n prism: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 4 L18 8 L18 20 L12 16 Z M12 4 L6 8 L6 20 L12 16 M6 8 L12 12 L18 8 M6 20 L18 20\" />\n </svg>\n ),\n pyramid: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L4 20 L20 20 Z M12 3 L12 20\" />\n </svg>\n ),\n sphere: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"3\" />\n </svg>\n ),\n cone: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M12 3 L4 20 L20 20 Z\" />\n <ellipse cx=\"12\" cy=\"20\" rx=\"8\" ry=\"2\" />\n </svg>\n ),\n cylinder: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"6\" ry=\"2\" />\n <ellipse cx=\"12\" cy=\"19\" rx=\"6\" ry=\"2\" />\n <line x1=\"6\" y1=\"5\" x2=\"6\" y2=\"19\" />\n <line x1=\"18\" y1=\"5\" x2=\"18\" y2=\"19\" />\n </svg>\n ),\n label: (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" {...stroke}>\n <path d=\"M4 4 H 16 L 20 8 L 16 12 H 4 Z\" />\n </svg>\n ),\n};\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-6 w-6 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { TOOLS_3D, GROUP_LABELS_3D, GROUP_ORDER_3D, letterForGroup3D, type GeomTool3D, type ToolDef3D, type ToolGroup3D } from './tools';\nimport { ToolButton, ICONS_3D } from './toolButtons';\nimport type { MiniBoard3DHandle } from './MiniBoard3D';\nimport { MobileToolDrawer, type MobileToolGroup } from '../../shared/MobileToolDrawer';\n\nconst TOOLTIP_DELAY_MS = 400;\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n// ---------- Shell (desktop) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isDark?: boolean;\n}\n\nfunction Shell({ title, icon, onClose, children, isDark }: ShellProps) {\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid=\"geom3d-left-panel\"\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- Icons ----------\n\nconst Geom3DIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 7 L14 4 L20 7 L14 10 Z M4 7 L4 17 L14 20 L14 10 M14 20 L20 17 L20 7\" />\n </svg>\n);\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction UndoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n );\n}\n\nfunction ResetViewIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n );\n}\n\nfunction AxisIcon3D() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"4\" />\n <line x1=\"12\" y1=\"12\" x2=\"22\" y2=\"6\" />\n <line x1=\"12\" y1=\"12\" x2=\"2\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction MeshIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 8 L12 4 L20 8 L12 12 Z\" />\n <path d=\"M4 8 L4 16 L12 20 L12 12\" />\n <path d=\"M12 20 L20 16 L20 8\" />\n </svg>\n );\n}\n\n// ---------- Props ----------\n\ninterface Props {\n handle: MiniBoard3DHandle | null;\n onResetView: () => void;\n onClose: () => void;\n isDark?: boolean;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n /** Chord shortcut: group đang được focus (sau khi bấm letter). null = không active. */\n chordGroup?: ToolGroup3D | null;\n}\n\n// ---------- Desktop tooltip helper ----------\n\nfunction useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: ToolDef3D) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n\n// ---------- Hook: sync state với handle ----------\n\nfunction useHandleState(handle: MiniBoard3DHandle | null) {\n const [tool, setTool] = useState<GeomTool3D>('move');\n const [showAxes, setShowAxes] = useState(true);\n const [showMesh, setShowMesh] = useState(false);\n const [canUndo, setCanUndo] = useState(false);\n\n useEffect(() => {\n if (!handle) return;\n const sync = () => {\n setTool(handle.getTool());\n setShowAxes(handle.getShowAxes());\n setShowMesh(handle.getShowMesh());\n setCanUndo(handle.canUndo());\n };\n sync();\n return handle.subscribe(sync);\n }, [handle]);\n\n return { tool, showAxes, showMesh, canUndo };\n}\n\n// ---------- Desktop panel ----------\n\nfunction DesktopPanel(props: Props) {\n const { handle, onResetView, onClose, isDark, chordGroup } = props;\n const { tool, showAxes, showMesh, canUndo } = useHandleState(handle);\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n const grouped = useMemo(() => {\n return TOOLS_3D.reduce<Record<ToolGroup3D, ToolDef3D[]>>(\n (acc, t) => {\n (acc[t.group] ??= []).push(t);\n return acc;\n },\n {} as Record<ToolGroup3D, ToolDef3D[]>,\n );\n }, []);\n\n const orderedGroups = useMemo(\n () => GROUP_ORDER_3D.filter((g) => grouped[g]),\n [grouped],\n );\n\n const activeGroupTools: ToolDef3D[] | null = chordGroup\n ? (grouped[chordGroup] ?? null)\n : null;\n\n return (\n <>\n <Shell title=\"Hình học 3D\" icon={Geom3DIconHeader} onClose={onClose} isDark={isDark}>\n <Section label=\"Bố cục\">\n <div className=\"flex items-center gap-2 flex-wrap text-[11px] text-slate-700\">\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showAxes}\n onChange={(e) => handle?.setShowAxes(e.target.checked)}\n data-testid=\"toggle-axes\"\n />\n Trục\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={showMesh}\n onChange={(e) => handle?.setShowMesh(e.target.checked)}\n data-testid=\"toggle-mesh\"\n />\n Lưới\n </label>\n <button\n type=\"button\"\n onClick={onResetView}\n title=\"Reset góc nhìn\"\n aria-label=\"Reset view\"\n className=\"ml-auto inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900\"\n >\n <ResetViewIcon />\n </button>\n <button\n type=\"button\"\n onClick={() => handle?.undo()}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n </div>\n </Section>\n\n {orderedGroups.map((group) => {\n const tools = grouped[group];\n const isChordActive = chordGroup === group;\n const dimmed = chordGroup !== null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive\n ? 'bg-blue-50 ring-1 ring-blue-400 p-1'\n : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{GROUP_LABELS_3D[group]}</span>\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive\n ? 'text-blue-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {letterForGroup3D(group)}\n </span>\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {tools.map((t, i) => {\n const isActive = tool === t.key;\n return (\n <ToolButton\n key={t.key}\n toolKey={t.key}\n label={t.label}\n hint={t.hint}\n active={isActive}\n onClick={() => handle?.setTool(t.key)}\n icon={\n <span\n onMouseEnter={(e) => showHover(e.currentTarget.closest('button') as HTMLElement, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget.closest('button') as HTMLElement, t)}\n onBlur={hideHover}\n >\n {ICONS_3D[t.key]}\n </span>\n }\n badge={\n <span\n data-testid={`chord-num-${t.key}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n isActive\n ? 'text-white/70'\n : isChordActive\n ? 'text-blue-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {i + 1}\n </span>\n }\n />\n );\n })}\n </div>\n </section>\n );\n })}\n\n {chordGroup && activeGroupTools && (\n <div\n data-testid=\"chord-hint\"\n className=\"mt-1 rounded border border-blue-200 bg-blue-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-blue-700\">\n {letterForGroup3D(chordGroup)}\n </span>\n <span className=\"mx-1 text-slate-400\">→</span>\n {activeGroupTools.map((t, i) => (\n <span key={t.key} className=\"mr-2 inline-block\">\n <span className=\"font-mono font-semibold text-blue-700\">\n {i + 1}\n </span>\n <span className=\"ml-1\">{t.label}</span>\n </span>\n ))}\n <span className=\"text-slate-400\">Esc huỷ</span>\n </div>\n )}\n </Shell>\n\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\n// ---------- Mobile panel (redesigned) ----------\n\nfunction MobilePanel(props: Props) {\n const { handle, onResetView, isDark, drawerOpen, onDrawerClose } = props;\n const { tool, showAxes, showMesh, canUndo } = useHandleState(handle);\n\n const groups = useMemo<MobileToolGroup<GeomTool3D, ToolGroup3D>[]>(() => {\n const acc = new Map<ToolGroup3D, ToolDef3D[]>();\n for (const t of TOOLS_3D) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n return Array.from(acc.entries()).map(([group, tools]) => ({\n group,\n groupLabel: GROUP_LABELS_3D[group],\n tools: tools.map((t) => ({ key: t.key, label: t.label, icon: ICONS_3D[t.key] })),\n }));\n }, []);\n\n return (\n <MobileToolDrawer\n title=\"Hình học 3D\"\n headerIcon={Geom3DIconHeader}\n testId=\"geom3d-left-panel\"\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={[\n {\n label: 'Trục',\n icon: <AxisIcon3D />,\n pressed: showAxes,\n onToggle: (b) => handle?.setShowAxes(b),\n testId: 'toggle-axes',\n },\n {\n label: 'Lưới',\n icon: <MeshIcon />,\n pressed: showMesh,\n onToggle: (b) => handle?.setShowMesh(b),\n testId: 'toggle-mesh',\n },\n ]}\n actions={[\n {\n label: 'Reset view',\n title: 'Reset góc nhìn',\n icon: <ResetViewIcon />,\n onClick: onResetView,\n },\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: () => handle?.undo(),\n disabled: !canUndo,\n },\n ]}\n groups={groups}\n activeTool={tool}\n onToolSelect={(k) => handle?.setTool(k)}\n />\n );\n}\n\n// ---------- Public entry ----------\n\nexport function LeftPanel(props: Props) {\n if (props.isMobile) return <MobilePanel {...props} />;\n return <DesktopPanel {...props} />;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseChordShortcutArgs<G extends string> {\n groupOrder: readonly G[];\n tools: ReadonlyArray<{ key: string; group: G }>;\n onSelect: (toolKey: string) => void;\n enabled: boolean;\n}\n\ninterface UseChordShortcutResult<G extends string> {\n chordGroup: G | null;\n cancel: () => void;\n}\n\nconst A_CODE = 'a'.charCodeAt(0);\n\nfunction isFieldFocused(): boolean {\n const ae = (typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null);\n return !!(\n ae &&\n (ae.tagName === 'INPUT' ||\n ae.tagName === 'TEXTAREA' ||\n ae.isContentEditable)\n );\n}\n\nexport function useChordShortcut<G extends string>(\n args: UseChordShortcutArgs<G>,\n): UseChordShortcutResult<G> {\n const { groupOrder, tools, onSelect, enabled } = args;\n\n const [chordGroup, setChordGroup] = useState<G | null>(null);\n\n const groupOrderRef = useRef(groupOrder);\n const toolsRef = useRef(tools);\n const onSelectRef = useRef(onSelect);\n const chordGroupRef = useRef<G | null>(null);\n\n groupOrderRef.current = groupOrder;\n toolsRef.current = tools;\n onSelectRef.current = onSelect;\n // chordGroupRef được sync ngay trong handler (xem `setChord` dưới đây)\n // thay vì ghi từ render body — nếu ghi ở body sẽ bị React batch hoá khi\n // hai event xảy ra trong cùng một act() (event sau đọc giá trị cũ).\n\n const cancel = useCallback(() => {\n chordGroupRef.current = null;\n setChordGroup(null);\n }, []);\n\n useEffect(() => {\n if (!enabled) return;\n\n const setChord = (next: G | null) => {\n chordGroupRef.current = next;\n setChordGroup(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isFieldFocused()) return;\n\n const key = e.key;\n const lower = key.length === 1 ? key.toLowerCase() : key;\n\n if (key === 'Escape') {\n if (chordGroupRef.current !== null) {\n e.preventDefault();\n e.stopPropagation();\n setChord(null);\n }\n return;\n }\n\n if (lower.length === 1 && lower >= 'a' && lower <= 'z') {\n const idx = lower.charCodeAt(0) - A_CODE;\n if (idx < groupOrderRef.current.length) {\n e.preventDefault();\n e.stopPropagation();\n setChord(groupOrderRef.current[idx]);\n }\n return;\n }\n\n if (key >= '1' && key <= '9') {\n const active = chordGroupRef.current;\n if (active === null) return;\n const n = key.charCodeAt(0) - '1'.charCodeAt(0); // 0-indexed\n const toolsInGroup = toolsRef.current.filter(\n (t) => t.group === active,\n );\n e.preventDefault();\n e.stopPropagation();\n if (n < toolsInGroup.length) {\n onSelectRef.current(toolsInGroup[n].key);\n }\n setChord(null);\n return;\n }\n };\n\n window.addEventListener('keydown', onKey, { capture: true });\n return () => {\n window.removeEventListener('keydown', onKey, { capture: true });\n };\n }, [enabled]);\n\n return { chordGroup, cancel };\n}\n","export interface SvgImageResult {\n dataURL: string;\n fileId: string;\n width: number;\n height: number;\n mimeType: 'image/svg+xml';\n}\n\nasync function hashString(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest)).slice(0, 16).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (h1 >>> 0).toString(16).padStart(8, '0') + (h2 >>> 0).toString(16).padStart(8, '0');\n}\n\nfunction parseSize(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n // Fallback: try viewBox\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n return attr === 'width' ? 200 : 100;\n}\n\n// SVG → image element data. Skips canvas rasterization entirely (canvas with\n// foreignObject + external resources gets tainted by browser security model,\n// blocking toDataURL). Excalidraw renders SVG natively via mimeType 'image/svg+xml'.\nexport async function svgToImageElement(svg: string): Promise<SvgImageResult> {\n const width = parseSize(svg, 'width');\n const height = parseSize(svg, 'height');\n // Use UTF-8 safe base64 encoding (btoa fails on non-Latin1 chars)\n const utf8 = unescape(encodeURIComponent(svg));\n const dataURL = 'data:image/svg+xml;base64,' + btoa(utf8);\n const fileId = await hashString(dataURL);\n return { dataURL, fileId, width, height, mimeType: 'image/svg+xml' };\n}\n","import { svgToImageElement } from './svgToImage';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData từ kích thước SVG vừa đo được. Đặt làm factory để\n * các stamp loại khác nhau (geometry cần svgWidth/svgHeight, latex không cần)\n * đều có thể chèn data tuỳ ý.\n */\n makeCustomData: (width: number, height: number) => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. svgToImageElement(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await svgToImageElement(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData(width, height);\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width, height, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 768px)';\nconst NO_HOVER_QUERY = '(hover: none)';\n\nexport interface MobileState {\n /** Viewport ≤ 768px — dùng để chuyển full-screen modal + drawer. */\n isMobile: boolean;\n /** Device không có hover (touch-only) — dùng để ẩn hover tooltips. */\n isTouchOnly: boolean;\n}\n\nfunction readMatch(query: string): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n try {\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\n/**\n * SSR-safe mobile detection qua matchMedia. Trả về `{ isMobile, isTouchOnly }`.\n * Re-render khi viewport resize hoặc input modality đổi (e.g., gắn Bluetooth mouse).\n */\nexport function useIsMobile(): MobileState {\n const [state, setState] = useState<MobileState>(() => ({\n isMobile: readMatch(MOBILE_QUERY),\n isTouchOnly: readMatch(NO_HOVER_QUERY),\n }));\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const tql = window.matchMedia(NO_HOVER_QUERY);\n const update = () => {\n setState({ isMobile: mql.matches, isTouchOnly: tql.matches });\n };\n update();\n mql.addEventListener('change', update);\n tql.addEventListener('change', update);\n return () => {\n mql.removeEventListener('change', update);\n tql.removeEventListener('change', update);\n };\n }, []);\n\n return state;\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { EditorPanel, type EditorPanelHandle } from './editor/EditorPanel';\nimport { LeftPanel as Geometry3DLeftPanel } from './editor/LeftPanel';\nimport type { MiniBoard3DHandle } from './editor/MiniBoard3D';\nimport { GROUP_ORDER_3D, TOOLS_3D, type GeomTool3D } from './editor/tools';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport {\n isGeometry3DCustomData,\n parseSerializedBoard3D,\n type Geometry3DCustomData,\n type SerializedBoard3D,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\n\nfunction parseInitial(\n editingElement: StampHostProps['editingElement'],\n): SerializedBoard3D | null {\n if (!editingElement) return null;\n if (!isGeometry3DCustomData(editingElement.customData)) return null;\n try {\n return parseSerializedBoard3D(editingElement.customData.jsonState);\n } catch {\n return null;\n }\n}\n\nexport const Geometry3DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Geometry3DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const editorRef = useRef<EditorPanelHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [boardHandle, setBoardHandle] = useState<MiniBoard3DHandle | null>(null);\n\n const initial = useMemo(\n () => parseInitial(editingElement),\n [editingElement],\n );\n\n const handleBoardReady = useCallback((h: MiniBoard3DHandle | null) => {\n setBoardHandle((prev) => (prev === h ? prev : h));\n }, []);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER_3D,\n tools: TOOLS_3D as unknown as Array<{ key: string; group: typeof GROUP_ORDER_3D[number] }>,\n onSelect: (key) => boardHandle?.setTool(key as GeomTool3D),\n enabled: !isMobile,\n });\n\n const handleResetView = useCallback(() => {\n boardHandle?.resetView();\n }, [boardHandle]);\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string, width: number, height: number) => {\n if (!api) return;\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Geometry3DCustomData => ({\n kind: 'geometry3d',\n version: 1,\n jsonState,\n svgWidth: width,\n svgHeight: height,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n onClose();\n },\n [api, editingElement, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <Geometry3DLeftPanel\n handle={boardHandle}\n onResetView={handleResetView}\n onClose={onClose}\n isDark={isDark}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n chordGroup={chordGroup}\n />\n <EditorPanel\n ref={editorRef}\n isDark={isDark}\n initial={initial}\n onInsert={handleInsert}\n onClose={onClose}\n isMobile={isMobile}\n withLeftPanel={!isMobile}\n onBoardReady={handleBoardReady}\n onOpenDrawer={() => setDrawerOpen(true)}\n />\n </>\n );\n },\n);\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport {\n isGeometry3DCustomData,\n type Geometry3DCustomData,\n} from './serialize';\nimport { renderGeometry3DSvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\n\nexport { isGeometry3DCustomData };\nexport type { Geometry3DCustomData };\n\nconst Geometry3DStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.Geometry3DStampHost })),\n);\n\nconst Geometry3DIcon: ReactNode = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {/* Mặt trước */}\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n {/* Mặt trên */}\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n {/* Mặt phải */}\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nexport const geometry3dStamp: StampType = {\n kind: 'geometry3d',\n experimental: true,\n shortcutKey: 'd',\n toolbarLabel: 'D',\n toolbarTitle: 'Hình 3D (D)',\n toolbarIcon: Geometry3DIcon,\n toolbarTestId: 'stamp-toolbar-geometry3d',\n matchesCustomData: isGeometry3DCustomData,\n async renderSvgFromCustomData(data: unknown): Promise<string> {\n if (!isGeometry3DCustomData(data)) {\n throw new Error('geometry3dStamp.renderSvgFromCustomData: customData không phải geometry3d');\n }\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgString;\n },\n restoreFileFromCustomData: async (element): Promise<RestoredStampFile | null> => {\n const data = element.customData as Geometry3DCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId) return null;\n if (!isGeometry3DCustomData(data)) return null;\n try {\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n const dataURL = `data:image/svg+xml;base64,${\n typeof btoa !== 'undefined'\n ? btoa(unescape(encodeURIComponent(svgString)))\n : Buffer.from(svgString).toString('base64')\n }`;\n return { fileId, dataURL, mimeType: 'image/svg+xml' };\n } catch {\n return null;\n }\n },\n Host: Geometry3DStampHost,\n};\n","\"use client\";\n\nimport { parseSerializedBoard3D } from './serialize';\n\nexport interface RenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nconst OUTPUT_WIDTH = 1024;\nconst OUTPUT_HEIGHT = 768;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport async function renderGeometry3DSvgFromState(\n jsonState: string,\n): Promise<RenderResult> {\n const state = parseSerializedBoard3D(jsonState);\n const JXG = (await import('jsxgraph')).default;\n\n const div = document.createElement('div');\n div.style.cssText = `position:absolute;left:-9999px;top:-9999px;width:${OUTPUT_WIDTH}px;height:${OUTPUT_HEIGHT}px;`;\n document.body.appendChild(div);\n\n try {\n JXG.Options.text.display = 'internal';\n\n const board = JXG.JSXGraph.initBoard(div, {\n boundingbox: state.bbox,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n }) as { create: (k: string, p: unknown[], a: unknown) => JxgObj };\n\n const view: JxgObj = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [state.view.bbox3D[0], state.view.bbox3D[3]],\n [state.view.bbox3D[1], state.view.bbox3D[4]],\n [state.view.bbox3D[2], state.view.bbox3D[5]],\n ],\n ],\n {\n az: { slider: { visible: false }, value: state.view.azimuth },\n el: { slider: { visible: false }, value: state.view.elevation },\n projection: 'central',\n },\n );\n\n if (!state.showAxes) {\n (view as { defaultAxes?: unknown[] }).defaultAxes = [];\n }\n\n const idMap = new Map<string, JxgObj>();\n for (const el of state.elements) {\n const parents = el.parents.map((p) =>\n typeof p === 'string' && p.startsWith('@id:')\n ? idMap.get(p.slice(4))\n : p,\n );\n const obj = (\n view as { create: (k: string, p: unknown[], a: unknown) => JxgObj }\n ).create(el.type, parents, {\n ...el.attributes,\n id: el.id,\n name: el.label,\n });\n idMap.set(el.id, obj);\n }\n\n const svg = div.querySelector('svg');\n if (!svg) {\n throw new Error('renderGeometry3DSvgFromState: SVG not produced');\n }\n const clone = svg.cloneNode(true) as SVGElement;\n clone.setAttribute('width', String(OUTPUT_WIDTH));\n clone.setAttribute('height', String(OUTPUT_HEIGHT));\n const svgString = new XMLSerializer().serializeToString(clone);\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n JXG.JSXGraph.freeBoard(board as any);\n } catch {\n /* ignore teardown */\n }\n\n return { svgString, width: OUTPUT_WIDTH, height: OUTPUT_HEIGHT };\n } finally {\n document.body.removeChild(div);\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ export { geometry3dStamp } from './chunk-HYXFHEDJ.mjs';
3
+ export { isGeometry3DCustomData } from './chunk-DJTBZEAR.mjs';
4
+ import './chunk-BJTO5JO5.mjs';
5
+ //# sourceMappingURL=geometry-3d.mjs.map
6
+ //# sourceMappingURL=geometry-3d.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"geometry-3d.mjs"}
@@ -0,0 +1,16 @@
1
+ import { B as BaseStampCustomData, S as StampType } from './types-CinstD7T.mjs';
2
+ import 'react';
3
+ import '@excalidraw/excalidraw/element/types';
4
+
5
+ interface Graph2DCustomData extends BaseStampCustomData {
6
+ kind: 'graph2d';
7
+ version: 1;
8
+ jsonState: string;
9
+ svgWidth: number;
10
+ svgHeight: number;
11
+ }
12
+ declare function isGraph2DCustomData(data: unknown): data is Graph2DCustomData;
13
+
14
+ declare const graph2dStamp: StampType;
15
+
16
+ export { type Graph2DCustomData, graph2dStamp, isGraph2DCustomData };
@@ -0,0 +1,16 @@
1
+ import { B as BaseStampCustomData, S as StampType } from './types-CinstD7T.js';
2
+ import 'react';
3
+ import '@excalidraw/excalidraw/element/types';
4
+
5
+ interface Graph2DCustomData extends BaseStampCustomData {
6
+ kind: 'graph2d';
7
+ version: 1;
8
+ jsonState: string;
9
+ svgWidth: number;
10
+ svgHeight: number;
11
+ }
12
+ declare function isGraph2DCustomData(data: unknown): data is Graph2DCustomData;
13
+
14
+ declare const graph2dStamp: StampType;
15
+
16
+ export { type Graph2DCustomData, graph2dStamp, isGraph2DCustomData };