@xom11/whiteboard 0.9.1 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/{chunk-ZVN356JZ.mjs → chunk-D257NCQW.mjs} +3 -3
  2. package/dist/{chunk-ZVN356JZ.mjs.map → chunk-D257NCQW.mjs.map} +1 -1
  3. package/dist/{chunk-KEYZ5EZT.mjs → chunk-G7FR3AIV.mjs} +44 -5
  4. package/dist/chunk-G7FR3AIV.mjs.map +1 -0
  5. package/dist/chunk-PWIMZIB6.mjs +62 -0
  6. package/dist/chunk-PWIMZIB6.mjs.map +1 -0
  7. package/dist/chunk-WQOABS6N.mjs +197 -0
  8. package/dist/chunk-WQOABS6N.mjs.map +1 -0
  9. package/dist/{chunk-DU3RHKT5.mjs → chunk-YVJP7NRG.mjs} +4 -4
  10. package/dist/{chunk-DU3RHKT5.mjs.map → chunk-YVJP7NRG.mjs.map} +1 -1
  11. package/dist/geometry-2d.js +102 -18
  12. package/dist/geometry-2d.js.map +1 -1
  13. package/dist/geometry-2d.mjs +2 -2
  14. package/dist/geometry-3d.js +152 -93
  15. package/dist/geometry-3d.js.map +1 -1
  16. package/dist/geometry-3d.mjs +2 -2
  17. package/dist/graph-2d.js +88 -20
  18. package/dist/graph-2d.js.map +1 -1
  19. package/dist/graph-2d.mjs +1 -1
  20. package/dist/{host-PIIDSMVE.mjs → host-N6ACNJKI.mjs} +51 -12
  21. package/dist/host-N6ACNJKI.mjs.map +1 -0
  22. package/dist/{host-LZH2FZ2N.mjs → host-NKGV6RF2.mjs} +91 -23
  23. package/dist/host-NKGV6RF2.mjs.map +1 -0
  24. package/dist/{host-VDNAJMLC.mjs → host-XVK7UCRE.mjs} +62 -18
  25. package/dist/host-XVK7UCRE.mjs.map +1 -0
  26. package/dist/index.d.mts +127 -1
  27. package/dist/index.d.ts +127 -1
  28. package/dist/index.js +1336 -177
  29. package/dist/index.js.map +1 -1
  30. package/dist/index.mjs +993 -52
  31. package/dist/index.mjs.map +1 -1
  32. package/package.json +4 -1
  33. package/dist/chunk-DU2NFHRR.mjs +0 -103
  34. package/dist/chunk-DU2NFHRR.mjs.map +0 -1
  35. package/dist/chunk-IUVV52HO.mjs +0 -144
  36. package/dist/chunk-IUVV52HO.mjs.map +0 -1
  37. package/dist/chunk-KEYZ5EZT.mjs.map +0 -1
  38. package/dist/host-LZH2FZ2N.mjs.map +0 -1
  39. package/dist/host-PIIDSMVE.mjs.map +0 -1
  40. package/dist/host-VDNAJMLC.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/stamps/geometry-3d/serialize.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-3d/editor/theme.ts","../src/stamps/geometry-3d/editor/tools/handlers/_ensurePoint.ts","../src/stamps/geometry-3d/editor/tools/handlers/point.ts","../src/stamps/geometry-3d/editor/tools/handlers/segment.ts","../src/stamps/geometry-3d/editor/tools/handlers/polygon.ts","../src/stamps/geometry-3d/editor/scene/constraintMath.ts","../src/stamps/geometry-3d/editor/scene/geometryChecks.ts","../src/stamps/geometry-3d/editor/tools/handlers/plane.ts","../src/stamps/geometry-3d/editor/tools/handlers/pyramid.ts","../src/stamps/geometry-3d/editor/tools/handlers/prism.ts","../src/stamps/geometry-3d/editor/tools/handlers/tetrahedron.ts","../src/stamps/geometry-3d/editor/tools/handlers/cube.ts","../src/stamps/geometry-3d/editor/tools/handlers/sphere.ts","../src/stamps/geometry-3d/editor/tools/handlers/cylinder.ts","../src/stamps/geometry-3d/editor/tools/handlers/cone.ts","../src/stamps/geometry-3d/editor/tools/spec.ts","../src/stamps/geometry-3d/editor/tools/controller.ts","../src/stamps/geometry-3d/editor/renderer/faceted.ts","../src/stamps/geometry-3d/editor/renderer/JxgRenderer.ts","../src/stamps/geometry-3d/editor/hitTest/rayCast.ts","../src/stamps/geometry-3d/editor/hitTest/intersect.ts","../src/stamps/geometry-3d/editor/hitTest/snapping.ts","../src/stamps/geometry-3d/editor/hitTest/hitTest.ts","../src/stamps/geometry-3d/editor/MiniBoard3D.tsx","../src/stamps/geometry-3d/editor/StatusHint.tsx","../src/stamps/geometry-3d/editor/scene/labels.ts","../src/stamps/geometry-3d/editor/scene/Scene3D.ts","../src/stamps/geometry-3d/editor/scene/persistence.ts","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/stamps/geometry-3d/editor/toolPanel/ToolButton.tsx","../src/stamps/geometry-3d/editor/toolPanel/icons.tsx","../src/stamps/geometry-3d/editor/toolPanel/groups.ts","../src/stamps/geometry-3d/editor/toolPanel/ToolPalette.tsx","../src/stamps/geometry-3d/editor/algebraPanel/symbolic.ts","../src/stamps/geometry-3d/editor/algebraPanel/RowMenu.tsx","../src/stamps/geometry-3d/editor/algebraPanel/AlgebraRow.tsx","../src/stamps/geometry-3d/editor/algebraPanel/AlgebraList.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","norm","dot","sub","add","scale","EPS","React","MiniBoard3D","p","jsx","jsxs","color","visible","React2","EditorPanel","Fragment","React3","React4","React5","createPortal","useState","useRef","useCallback","useEffect","A_CODE","forwardRef","Geometry3DStampHost","useMemo","useImperativeHandle","lazy"],"mappings":"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","file":"geometry-3d.js","sourcesContent":["import type { BaseStampCustomData } from '../shared/types';\nimport type { Constraint } from './editor/scene/types';\n\nexport interface Geometry3DCustomData extends BaseStampCustomData {\n kind: 'geometry3d';\n version: 1 | 2;\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 (\n d.kind === 'geometry3d' &&\n (d.version === 1 || d.version === 2) &&\n typeof d.jsonState === 'string'\n );\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 /** v2 only — present on point3d elements to encode the surface constraint. */\n constraint?: Constraint;\n}\n\nexport interface SerializedBoard3D {\n version: 1 | 2;\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 && p.version !== 2) {\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 const axisLabel = (color: string) => ({\n strokeColor: color,\n fontSize: 14,\n offset: [10, 0] as [number, number],\n });\n return {\n az: { slider: { visible: false }, point2: { visible: false } },\n el: { slider: { visible: false } },\n projection: 'central' as const,\n // GeoGebra-style: axes pass through origin (0,0,0) instead of bbox border.\n axesPosition: 'center' as const,\n xAxis: {\n strokeColor: p.axisX,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'x',\n withLabel: true,\n label: axisLabel(p.axisX),\n },\n yAxis: {\n strokeColor: p.axisY,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'y',\n withLabel: true,\n label: axisLabel(p.axisY),\n },\n zAxis: {\n strokeColor: p.axisZ,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'z',\n withLabel: true,\n label: axisLabel(p.axisZ),\n },\n // GeoGebra-style: hide ALL bbox wall planes; the XY ground plane is drawn\n // explicitly at z=0 via the helper below (so it coincides with Ox/Oy).\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: false, mesh3d: { visible: false } },\n };\n};\n\nexport const GROUND_PLANE_ATTRS = (isDark: boolean) => ({\n fillColor: isDark ? '#2a2a2a' : '#e6e6e6',\n fillOpacity: isDark ? 0.5 : 0.55,\n strokeColor: isDark ? '#3a3a3a' : '#cfcfcf',\n strokeOpacity: 0.7,\n strokeWidth: 1,\n fixed: true,\n highlight: false,\n withLabel: false,\n layer: 0,\n});\n\n/** XY ground plane extent (square around origin in user units). */\nexport const GROUND_PLANE_RANGE: [number, number] = [-3, 3];\n","import type { Constraint } from '../../scene/types';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport type { SceneHit } from '../../hitTest/hitTest';\n\nexport function hitToConstraint(hit: SceneHit): Constraint | null {\n switch (hit.kind) {\n case 'onGround': return { kind: 'onGround', x: hit.world[0], y: hit.world[1] };\n case 'onAxis': return { kind: 'onAxis', axis: hit.axis, t: hit.t };\n case 'onPlane': return { kind: 'onPlane', planeId: hit.planeId, u: hit.u, v: hit.v };\n case 'onLine': return { kind: 'onLine', lineId: hit.lineId, t: hit.t };\n case 'onPolygon': return { kind: 'onPolygon', polygonId: hit.polygonId, u: hit.u, v: hit.v };\n case 'onSphere': return { kind: 'onSphere', sphereId: hit.sphereId, theta: hit.theta, phi: hit.phi };\n default: return null;\n }\n}\n\n/**\n * Given a SceneHit, return the id of an existing point (if hit is existingPoint),\n * or create a new constrained point on the hit surface and return its id.\n * Returns null for `empty` hits.\n */\nexport function ensurePoint(hit: SceneHit, scene: Scene3D): string | null {\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return scene.addPoint(c);\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { hitToConstraint } from './_ensurePoint';\n\nexport function buildPoint(args: CollectedArg[], scene: Scene3D): string | null {\n const hit = args[0]?.hit;\n if (!hit) return null;\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return scene.addPoint(c);\n}\n\nexport const buildPointOnObject = buildPoint; // identical semantics; step.allowNewOn is the only difference\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildSegment(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, scene);\n const p2 = ensurePoint(args[1].hit, scene);\n if (!p1 || !p2 || p1 === p2) return null;\n return scene.addObject('segment', { p1, p2 });\n}\n\nexport function buildLine(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, scene);\n const p2 = ensurePoint(args[1].hit, scene);\n if (!p1 || !p2 || p1 === p2) return null;\n return scene.addObject('line', { p1, p2 });\n}\n\nexport function buildRay(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const origin = ensurePoint(args[0].hit, scene);\n const through = ensurePoint(args[1].hit, scene);\n if (!origin || !through || origin === through) return null;\n return scene.addObject('ray', { origin, through });\n}\n\nexport function buildVector(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const from = ensurePoint(args[0].hit, scene);\n const to = ensurePoint(args[1].hit, scene);\n if (!from || !to || from === to) return null;\n return scene.addObject('vector', { from, to });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildPolygon(args: CollectedArg[], scene: Scene3D): string | null {\n // Drop the final closingPoint arg, keep all 'point'-step hits as vertices.\n const vertexArgs = args.filter((a) => a.step.type === 'point');\n const vertexIds = vertexArgs.map((a) => (a.hit ? ensurePoint(a.hit, scene) : null)).filter((x): x is string => !!x);\n if (vertexIds.length < 3) return null;\n return scene.addObject('polygon', { vertices: vertexIds });\n}\n","import type { Constraint, Vec3, Scene3DObject } from './types';\nimport type { Scene3D } from './Scene3D';\n\nfunction sub(a: Vec3, b: Vec3): Vec3 { return [a[0]-b[0], a[1]-b[1], a[2]-b[2]]; }\nfunction add(a: Vec3, b: Vec3): Vec3 { return [a[0]+b[0], a[1]+b[1], a[2]+b[2]]; }\nfunction scale(a: Vec3, k: number): Vec3 { return [a[0]*k, a[1]*k, a[2]*k]; }\nfunction dot(a: Vec3, b: Vec3): number { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; }\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]];\n}\nfunction norm(a: Vec3): number { return Math.sqrt(dot(a, a)); }\nfunction normalize(a: Vec3): Vec3 { const n = norm(a); return n === 0 ? a : scale(a, 1/n); }\n\nfunction getPointWorld(id: string, scene: Scene3D): Vec3 {\n const obj = scene.get(id);\n if (!obj || obj.kind !== 'point') {\n throw new Error(`constraintMath: point ${id} not found`);\n }\n return constraintToWorld(obj.constraint, scene);\n}\n\nfunction getPlaneBasis(planeObj: Extract<Scene3DObject, { kind: 'plane' }>, scene: Scene3D): {\n origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3;\n} {\n const p1 = getPointWorld(planeObj.p1, scene);\n const p2 = getPointWorld(planeObj.p2, scene);\n const p3 = getPointWorld(planeObj.p3, scene);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n return { origin: p1, basis1, basis2, normal };\n}\n\nexport function constraintToWorld(c: Constraint, scene: Scene3D): Vec3 {\n switch (c.kind) {\n case 'free': return [c.x, c.y, c.z];\n case 'onGround': return [c.x, c.y, 0];\n case 'onAxis': {\n if (c.axis === 'x') return [c.t, 0, 0];\n if (c.axis === 'y') return [0, c.t, 0];\n return [0, 0, c.t];\n }\n case 'onPlane': {\n const plane = scene.get(c.planeId);\n if (!plane || plane.kind !== 'plane') throw new Error('onPlane: plane missing');\n const { origin, basis1, basis2 } = getPlaneBasis(plane, scene);\n return add(add(origin, scale(basis1, c.u)), scale(basis2, c.v));\n }\n case 'onLine': {\n const line = scene.get(c.lineId);\n if (!line || (line.kind !== 'line' && line.kind !== 'segment' && line.kind !== 'ray')) {\n throw new Error('onLine: parent missing');\n }\n const p1Id = line.kind === 'ray' ? line.origin : line.p1;\n const p2Id = line.kind === 'ray' ? line.through : line.p2;\n const p1 = getPointWorld(p1Id, scene);\n const p2 = getPointWorld(p2Id, scene);\n const dir = sub(p2, p1);\n return add(p1, scale(dir, c.t));\n }\n case 'onPolygon': {\n const pg = scene.get(c.polygonId);\n if (!pg || pg.kind !== 'polygon') throw new Error('onPolygon: parent missing');\n const v = pg.vertices;\n if (v.length < 3) throw new Error('onPolygon: < 3 vertices');\n const p1 = getPointWorld(v[0], scene);\n const p2 = getPointWorld(v[1], scene);\n const p3 = getPointWorld(v[2], scene);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n return add(add(p1, scale(basis1, c.u)), scale(basis2, c.v));\n }\n case 'onSphere': {\n const sph = scene.get(c.sphereId);\n if (!sph || sph.kind !== 'sphere') throw new Error('onSphere: parent missing');\n const center = getPointWorld(sph.center, scene);\n const surface = getPointWorld(sph.surfacePoint, scene);\n const radius = norm(sub(surface, center));\n const x = center[0] + radius * Math.sin(c.phi) * Math.cos(c.theta);\n const y = center[1] + radius * Math.sin(c.phi) * Math.sin(c.theta);\n const z = center[2] + radius * Math.cos(c.phi);\n return [x, y, z];\n }\n }\n}\n\nexport function worldToConstraint(current: Constraint, world: Vec3, scene: Scene3D): Constraint {\n switch (current.kind) {\n case 'free': return { kind: 'free', x: world[0], y: world[1], z: world[2] };\n case 'onGround': return { kind: 'onGround', x: world[0], y: world[1] };\n case 'onAxis': {\n const t = current.axis === 'x' ? world[0] : current.axis === 'y' ? world[1] : world[2];\n return { kind: 'onAxis', axis: current.axis, t };\n }\n case 'onPlane': {\n const plane = scene.get(current.planeId);\n if (!plane || plane.kind !== 'plane') return current;\n const { origin, basis1, basis2 } = getPlaneBasis(plane, scene);\n const rel = sub(world, origin);\n const b1n = dot(basis1, basis1);\n const b2n = dot(basis2, basis2);\n const u = b1n === 0 ? 0 : dot(rel, basis1) / b1n;\n const v = b2n === 0 ? 0 : dot(rel, basis2) / b2n;\n return { kind: 'onPlane', planeId: current.planeId, u, v };\n }\n case 'onLine': {\n const line = scene.get(current.lineId);\n if (!line) return current;\n const p1Id = line.kind === 'ray' ? line.origin : (line as { p1: string }).p1;\n const p2Id = line.kind === 'ray' ? line.through : (line as { p2: string }).p2;\n const p1 = getPointWorld(p1Id, scene);\n const p2 = getPointWorld(p2Id, scene);\n const dir = sub(p2, p1);\n const len2 = dot(dir, dir);\n const t = len2 === 0 ? 0 : dot(sub(world, p1), dir) / len2;\n return { kind: 'onLine', lineId: current.lineId, t };\n }\n case 'onPolygon': {\n const pg = scene.get(current.polygonId);\n if (!pg || pg.kind !== 'polygon' || pg.vertices.length < 3) return current;\n const p1 = getPointWorld(pg.vertices[0], scene);\n const p2 = getPointWorld(pg.vertices[1], scene);\n const p3 = getPointWorld(pg.vertices[2], scene);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n const rel = sub(world, p1);\n const b1n = dot(basis1, basis1);\n const b2n = dot(basis2, basis2);\n const u = b1n === 0 ? 0 : dot(rel, basis1) / b1n;\n const v = b2n === 0 ? 0 : dot(rel, basis2) / b2n;\n return { kind: 'onPolygon', polygonId: current.polygonId, u, v };\n }\n case 'onSphere': {\n const sph = scene.get(current.sphereId);\n if (!sph || sph.kind !== 'sphere') return current;\n const center = getPointWorld(sph.center, scene);\n const rel = sub(world, center);\n const r = norm(rel);\n if (r === 0) return current;\n const phi = Math.acos(rel[2] / r);\n const theta = Math.atan2(rel[1], rel[0]);\n return { kind: 'onSphere', sphereId: current.sphereId, theta, phi };\n }\n }\n}\n","import type { Vec3 } from './types';\nimport type { Scene3D } from './Scene3D';\nimport { constraintToWorld } from './constraintMath';\n\nconst EPS = 1e-6;\n\nfunction getWorld(id: string, scene: Scene3D): Vec3 | null {\n const obj = scene.get(id);\n if (!obj || obj.kind !== 'point') return null;\n return constraintToWorld(obj.constraint, scene);\n}\n\nexport function areCollinear3(p1Id: string, p2Id: string, p3Id: string, scene: Scene3D): boolean {\n const p1 = getWorld(p1Id, scene);\n const p2 = getWorld(p2Id, scene);\n const p3 = getWorld(p3Id, scene);\n if (!p1 || !p2 || !p3) return true;\n const a: Vec3 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];\n const b: Vec3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];\n const c: Vec3 = [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]];\n return Math.hypot(c[0], c[1], c[2]) < EPS;\n}\n\nexport function apexCoplanarWithBase(baseIds: string[], apexId: string, scene: Scene3D): boolean {\n if (baseIds.length < 3) return false;\n const p1 = getWorld(baseIds[0], scene);\n const p2 = getWorld(baseIds[1], scene);\n const p3 = getWorld(baseIds[2], scene);\n const apex = getWorld(apexId, scene);\n if (!p1 || !p2 || !p3 || !apex) return false;\n const a: Vec3 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];\n const b: Vec3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];\n const n: Vec3 = [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]];\n const d: Vec3 = [apex[0]-p1[0], apex[1]-p1[1], apex[2]-p1[2]];\n const dotND = n[0]*d[0] + n[1]*d[1] + n[2]*d[2];\n return Math.abs(dotND) < EPS;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { areCollinear3 } from '../../scene/geometryChecks';\n\nexport function buildPlane(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 3 || !args[0].hit || !args[1].hit || !args[2].hit) return null;\n const p1 = ensurePoint(args[0].hit, scene);\n const p2 = ensurePoint(args[1].hit, scene);\n const p3 = ensurePoint(args[2].hit, scene);\n if (!p1 || !p2 || !p3) return null;\n if (p1 === p2 || p2 === p3 || p1 === p3) return null;\n if (areCollinear3(p1, p2, p3, scene)) return null;\n return scene.addObject('plane', { p1, p2, p3 });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { apexCoplanarWithBase } from '../../scene/geometryChecks';\n\nexport function buildPyramid(args: CollectedArg[], scene: Scene3D): string | null {\n const pointArgs = args.filter((a) => a.step.type === 'point');\n const baseArgs = pointArgs.slice(0, -1); // last 'point' arg is the apex\n const apexArg = pointArgs.slice(-1)[0];\n if (baseArgs.length < 3 || !apexArg?.hit) return null;\n const baseIds = baseArgs.map((a) => (a.hit ? ensurePoint(a.hit, scene) : null)).filter((x): x is string => !!x);\n const apexId = ensurePoint(apexArg.hit, scene);\n if (!apexId || baseIds.length < 3) return null;\n if (apexCoplanarWithBase(baseIds, apexId, scene)) return null;\n const vertices = [...baseIds, apexId];\n const apexIdx = vertices.length - 1;\n const faces: number[][] = [baseIds.map((_, i) => i)];\n for (let i = 0; i < baseIds.length; i++) {\n faces.push([i, (i + 1) % baseIds.length, apexIdx]);\n }\n return scene.addObject('polyhedron', { flavor: 'pyramid', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\n\nexport function buildPrism(args: CollectedArg[], scene: Scene3D): string | null {\n const baseArgs = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (baseArgs.length < 3 || !numberArg || typeof numberArg.value !== 'number') return null;\n const height = numberArg.value;\n if (height <= 0) return null;\n const baseIds = baseArgs.map((a) => (a.hit ? ensurePoint(a.hit, scene) : null)).filter((x): x is string => !!x);\n if (baseIds.length < 3) return null;\n const topIds: string[] = [];\n for (const id of baseIds) {\n const p = scene.get(id);\n if (!p || p.kind !== 'point') return null;\n const w = constraintToWorld(p.constraint, scene);\n topIds.push(scene.addPoint({ kind: 'free', x: w[0], y: w[1], z: w[2] + height }));\n }\n const n = baseIds.length;\n const vertices = [...baseIds, ...topIds];\n const faces: number[][] = [\n baseIds.map((_, i) => i),\n topIds.map((_, i) => n + i),\n ];\n for (let i = 0; i < n; i++) {\n faces.push([i, (i + 1) % n, n + ((i + 1) % n), n + i]);\n }\n return scene.addObject('polyhedron', { flavor: 'prism', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\n\nexport function buildTetrahedron(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, scene);\n const p2Id = ensurePoint(args[1].hit, scene);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const p1Obj = scene.get(p1Id);\n const p2Obj = scene.get(p2Id);\n if (!p1Obj || p1Obj.kind !== 'point' || !p2Obj || p2Obj.kind !== 'point') return null;\n const p1 = constraintToWorld(p1Obj.constraint, scene);\n const p2 = constraintToWorld(p2Obj.constraint, scene);\n // Force base plane to z = min(p1.z, p2.z); project both points there.\n const z0 = Math.min(p1[2], p2[2]);\n const baseA: [number, number, number] = [p1[0], p1[1], z0];\n const baseB: [number, number, number] = [p2[0], p2[1], z0];\n const dx = baseB[0] - baseA[0];\n const dy = baseB[1] - baseA[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Third base vertex: rotate (baseB - baseA) by 60° in xy and add to baseA midpoint\n const mid: [number, number, number] = [(baseA[0]+baseB[0])/2, (baseA[1]+baseB[1])/2, z0];\n const perpX = -dy;\n const perpY = dx;\n const perpLen = Math.hypot(perpX, perpY);\n const height = edge * Math.sqrt(3) / 2;\n const baseC: [number, number, number] = [mid[0] + (perpX/perpLen)*height, mid[1] + (perpY/perpLen)*height, z0];\n // Apex: centroid + edge*sqrt(2/3)\n const centroid: [number, number, number] = [\n (baseA[0]+baseB[0]+baseC[0])/3,\n (baseA[1]+baseB[1]+baseC[1])/3,\n z0,\n ];\n const apexHeight = edge * Math.sqrt(2/3);\n const apex: [number, number, number] = [centroid[0], centroid[1], z0 + apexHeight];\n\n const cId = scene.addPoint({ kind: 'free', x: baseC[0], y: baseC[1], z: baseC[2] });\n const apexId = scene.addPoint({ kind: 'free', x: apex[0], y: apex[1], z: apex[2] });\n\n const vertices = [p1Id, p2Id, cId, apexId];\n const faces: number[][] = [\n [0, 1, 2], // base\n [0, 1, 3], // face p1-p2-apex\n [1, 2, 3], // face p2-c-apex\n [2, 0, 3], // face c-p1-apex\n ];\n return scene.addObject('polyhedron', { flavor: 'tetrahedron', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\n\nexport function buildCube(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, scene);\n const p2Id = ensurePoint(args[1].hit, scene);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const p1Obj = scene.get(p1Id);\n const p2Obj = scene.get(p2Id);\n if (!p1Obj || p1Obj.kind !== 'point' || !p2Obj || p2Obj.kind !== 'point') return null;\n const p1 = constraintToWorld(p1Obj.constraint, scene);\n const p2 = constraintToWorld(p2Obj.constraint, scene);\n // Require both on the ground (z = 0); reject otherwise\n if (Math.abs(p1[2]) > 1e-6 || Math.abs(p2[2]) > 1e-6) return null;\n const dx = p2[0] - p1[0];\n const dy = p2[1] - p1[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Bottom face: p1, p2, p3 = p2 + perp, p4 = p1 + perp where perp = rotate (p2-p1) by +90°\n const perpX = -dy;\n const perpY = dx;\n const p3: [number, number, number] = [p2[0] + perpX, p2[1] + perpY, 0];\n const p4: [number, number, number] = [p1[0] + perpX, p1[1] + perpY, 0];\n // Top face: same x, y; z = edge\n const t1: [number, number, number] = [p1[0], p1[1], edge];\n const t2: [number, number, number] = [p2[0], p2[1], edge];\n const t3: [number, number, number] = [p3[0], p3[1], edge];\n const t4: [number, number, number] = [p4[0], p4[1], edge];\n\n const p3Id = scene.addPoint({ kind: 'onGround', x: p3[0], y: p3[1] });\n const p4Id = scene.addPoint({ kind: 'onGround', x: p4[0], y: p4[1] });\n const t1Id = scene.addPoint({ kind: 'free', x: t1[0], y: t1[1], z: t1[2] });\n const t2Id = scene.addPoint({ kind: 'free', x: t2[0], y: t2[1], z: t2[2] });\n const t3Id = scene.addPoint({ kind: 'free', x: t3[0], y: t3[1], z: t3[2] });\n const t4Id = scene.addPoint({ kind: 'free', x: t4[0], y: t4[1], z: t4[2] });\n\n const vertices = [p1Id, p2Id, p3Id, p4Id, t1Id, t2Id, t3Id, t4Id];\n // Faces by index in vertices:\n const faces: number[][] = [\n [0, 1, 2, 3], // bottom\n [4, 5, 6, 7], // top\n [0, 1, 5, 4], // front\n [1, 2, 6, 5], // right\n [2, 3, 7, 6], // back\n [3, 0, 4, 7], // left\n ];\n return scene.addObject('polyhedron', { flavor: 'cube', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildSphere(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const center = ensurePoint(args[0].hit, scene);\n const surface = ensurePoint(args[1].hit, scene);\n if (!center || !surface || center === surface) return null;\n return scene.addObject('sphere', { center, surfacePoint: surface });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCylinder(args: CollectedArg[], scene: Scene3D): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, scene);\n const topCenter = ensurePoint(points[1].hit, scene);\n if (!baseCenter || !topCenter || baseCenter === topCenter) return null;\n return scene.addObject('cylinder', { baseCenter, topCenter, radius });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCone(args: CollectedArg[], scene: Scene3D): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, scene);\n const apex = ensurePoint(points[1].hit, scene);\n if (!baseCenter || !apex || baseCenter === apex) return null;\n return scene.addObject('cone', { baseCenter, apex, radius });\n}\n","import type { Scene3D } from '../scene/Scene3D';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport { buildPoint, buildPointOnObject } from './handlers/point';\nimport { buildSegment, buildLine, buildRay, buildVector } from './handlers/segment';\nimport { buildPolygon } from './handlers/polygon';\nimport { buildPlane } from './handlers/plane';\nimport { buildPyramid } from './handlers/pyramid';\nimport { buildPrism } from './handlers/prism';\nimport { buildTetrahedron } from './handlers/tetrahedron';\nimport { buildCube } from './handlers/cube';\nimport { buildSphere } from './handlers/sphere';\nimport { buildCylinder } from './handlers/cylinder';\nimport { buildCone } from './handlers/cone';\n\nexport type ToolKey =\n | 'move' | 'point' | 'pointOnObject'\n | 'segment' | 'line' | 'ray' | 'vector' | 'polygon'\n | 'plane' | 'pyramid' | 'prism' | 'tetrahedron' | 'cube'\n | 'sphere' | 'cylinder' | 'cone';\n\nexport type ToolStep =\n | {\n type: 'point';\n allowExisting: boolean;\n allowNewOn: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'>;\n hint: string;\n }\n | { type: 'closingPoint'; hint: string }\n | { type: 'object'; kinds: Array<'plane' | 'polygon' | 'line' | 'sphere' | 'polyhedron'>; hint: string }\n | { type: 'number'; prompt: string; min?: number; max?: number };\n\nexport interface CollectedArg {\n step: ToolStep;\n hit?: SceneHit;\n value?: number;\n}\n\nexport interface ToolSpec {\n key: ToolKey;\n label: string;\n hintIdle: string;\n steps: ToolStep[];\n build(args: CollectedArg[], scene: Scene3D): string | null;\n /**\n * If true, after build completes the controller re-enters step 0 of this\n * tool (clearing collected args) instead of switching to 'move'. Used by\n * the Point tool so the user can place several points in a row.\n */\n repeatAfterBuild?: boolean;\n}\n\nconst stubBuild = (): string | null => null;\n\nconst ALL_SURFACES: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane', 'line', 'polygon', 'sphere'];\n\nconst OBJECT_ONLY: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['plane', 'line', 'polygon', 'sphere'];\n\nconst NO_SURFACE: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane'];\n\nexport const TOOLS: ToolSpec[] = [\n {\n key: 'move',\n label: 'Di chuyển',\n hintIdle: 'Kéo điểm hoặc xoay khung',\n steps: [],\n build: stubBuild,\n },\n {\n key: 'point',\n label: 'Điểm',\n hintIdle: 'Click trên mặt phẳng Oxy hoặc trên trục để đặt điểm',\n steps: [\n {\n type: 'point',\n allowExisting: false,\n // GeoGebra-style: a new point must lie on the XY ground plane or on\n // one of the coordinate axes (Oz lets you place points off the plane).\n allowNewOn: ['ground', 'axis'],\n hint: 'Click trên mặt phẳng Oxy hoặc trục Ox/Oy/Oz',\n },\n ],\n build: buildPoint,\n repeatAfterBuild: true,\n },\n {\n key: 'pointOnObject',\n label: 'Điểm trên đối tượng',\n hintIdle: 'Chọn một đối tượng để đặt điểm',\n steps: [{ type: 'point', allowExisting: false, allowNewOn: OBJECT_ONLY, hint: 'Click lên mặt / đường để đặt điểm' }],\n build: buildPointOnObject,\n },\n {\n key: 'segment',\n label: 'Đoạn thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đoạn thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildSegment,\n },\n {\n key: 'line',\n label: 'Đường thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đường thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildLine,\n },\n {\n key: 'ray',\n label: 'Tia',\n hintIdle: 'Chọn điểm gốc rồi điểm trên tia',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm gốc' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên tia' },\n ],\n build: buildRay,\n },\n {\n key: 'vector',\n label: 'Vector',\n hintIdle: 'Chọn 2 điểm để vẽ vector',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm đầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm cuối' },\n ],\n build: buildVector,\n },\n {\n key: 'polygon',\n label: 'Đa giác',\n hintIdle: 'Chọn các đỉnh; click điểm đầu để đóng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 1' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 3' },\n { type: 'closingPoint', hint: 'Click điểm đầu để đóng (hoặc chọn thêm đỉnh)' },\n ],\n build: buildPolygon,\n },\n {\n key: 'plane',\n label: 'Mặt phẳng (3 điểm)',\n hintIdle: 'Chọn 3 điểm để xác định mặt phẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 1 của mặt phẳng' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 3' },\n ],\n build: buildPlane,\n },\n {\n key: 'pyramid',\n label: 'Hình chóp',\n hintIdle: 'Chọn đáy đa giác rồi chọn đỉnh chóp',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đáy đầu tiên để đóng (hoặc chọn thêm đỉnh)' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh chóp' },\n ],\n build: buildPyramid,\n },\n {\n key: 'prism',\n label: 'Lăng trụ',\n hintIdle: 'Chọn đáy đa giác rồi nhập chiều cao',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đầu để đóng đáy' },\n { type: 'number', prompt: 'Chiều cao (theo trục z)', min: 0.0001 },\n ],\n build: buildPrism,\n },\n {\n key: 'tetrahedron',\n label: 'Tứ diện đều',\n hintIdle: 'Chọn 2 điểm xác định cạnh của tứ diện',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 2' },\n ],\n build: buildTetrahedron,\n },\n {\n key: 'cube',\n label: 'Lập phương',\n hintIdle: 'Chọn 2 điểm trên nền xác định cạnh',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 1 (trên nền)' },\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 2 (trên nền)' },\n ],\n build: buildCube,\n },\n {\n key: 'sphere',\n label: 'Mặt cầu',\n hintIdle: 'Chọn tâm rồi điểm trên mặt cầu',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm mặt cầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên mặt cầu' },\n ],\n build: buildSphere,\n },\n {\n key: 'cylinder',\n label: 'Hình trụ',\n hintIdle: 'Chọn tâm đáy, tâm trên, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm trên' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCylinder,\n },\n {\n key: 'cone',\n label: 'Hình nón',\n hintIdle: 'Chọn tâm đáy, đỉnh, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCone,\n },\n];\n\nexport const TOOL_GROUPS: Record<string, ToolKey[]> = {\n 'Cơ bản': ['move', 'point', 'segment', 'line', 'plane'],\n 'Điểm': ['point', 'pointOnObject'],\n 'Đường thẳng': ['segment', 'line', 'ray', 'vector', 'polygon'],\n 'Mặt phẳng': ['plane'],\n 'Khối đa diện': ['pyramid', 'prism', 'tetrahedron', 'cube'],\n 'Khối cong': ['sphere', 'cylinder', 'cone'],\n};\n","import type { Scene3D } from '../scene/Scene3D';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport type { ToolKey, ToolStep, ToolSpec, CollectedArg } from './spec';\nimport { TOOLS } from './spec';\n\ninterface ControllerState {\n tool: ToolSpec | null;\n stepIndex: number;\n collected: CollectedArg[];\n hint: string;\n}\n\ntype Listener = (state: ControllerState) => void;\n\nfunction stepHint(step: ToolStep): string {\n return step.type === 'number' ? step.prompt : step.hint;\n}\n\nexport class ToolController {\n private state: ControllerState = { tool: null, stepIndex: 0, collected: [], hint: '' };\n private listeners = new Set<Listener>();\n\n constructor(private scene: Scene3D) {\n this.selectTool('move');\n }\n\n getState(): ControllerState { return this.state; }\n\n on(cb: Listener): () => void {\n this.listeners.add(cb);\n return () => {\n this.listeners.delete(cb);\n };\n }\n\n selectTool(key: ToolKey): void {\n const tool = TOOLS.find((t) => t.key === key) ?? TOOLS.find((t) => t.key === 'move')!;\n const firstStep = tool.steps[0];\n this.state = {\n tool,\n stepIndex: 0,\n collected: [],\n hint: firstStep ? stepHint(firstStep) : tool.hintIdle,\n };\n this.notify();\n }\n\n cancel(): void { this.selectTool('move'); }\n\n consumeHit(hit: SceneHit): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step) return false;\n\n // Polygon-like variable-vertex flow: when current step is closingPoint, an\n // existing-point hit matching the first collected vertex finalizes the\n // sub-sequence; any other surface hit appends another vertex (and the\n // controller stays at this stepIndex).\n if (step.type === 'closingPoint') {\n if (hit.kind === 'empty') return false;\n if (hit.kind === 'existingPoint') {\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n // Otherwise append another vertex using the previous 'point' step's allowNewOn\n const prevStep = tool.steps[this.state.stepIndex - 1];\n if (!prevStep || prevStep.type !== 'point') return false;\n if (!this.hitMatchesStep(hit, prevStep)) return false;\n this.state.collected.push({ step: prevStep, hit });\n // stepIndex stays at the closingPoint step\n this.notify();\n return true;\n }\n\n if (!this.hitMatchesStep(hit, step)) return false;\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n consumeNumber(value: number): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step || step.type !== 'number') return false;\n if (step.min != null && value < step.min) return false;\n if (step.max != null && value > step.max) return false;\n this.state.collected.push({ step, value });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n private hitMatchesStep(hit: SceneHit, step: ToolStep): boolean {\n if (step.type !== 'point' && step.type !== 'closingPoint') return false;\n if (hit.kind === 'empty') return false;\n if (step.type === 'closingPoint') return hit.kind === 'existingPoint';\n if (hit.kind === 'existingPoint') return step.allowExisting;\n const surfaceMap: Record<string, 'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> = {\n onGround: 'ground', onAxis: 'axis', onPlane: 'plane',\n onLine: 'line', onPolygon: 'polygon', onSphere: 'sphere',\n };\n const k = surfaceMap[hit.kind];\n return k != null && step.type === 'point' && step.allowNewOn.includes(k);\n }\n\n private advance(): void {\n const tool = this.state.tool!;\n if (this.state.stepIndex >= tool.steps.length) {\n tool.build(this.state.collected, this.scene);\n if (tool.repeatAfterBuild) {\n // Stay in this tool so the user can place several items in a row.\n this.state.stepIndex = 0;\n this.state.collected = [];\n this.state.hint = stepHint(tool.steps[0]);\n this.notify();\n } else {\n this.selectTool('move');\n }\n return;\n }\n this.state.hint = stepHint(tool.steps[this.state.stepIndex]);\n this.notify();\n }\n\n private notify(): void {\n for (const cb of this.listeners) cb(this.state);\n }\n}\n","import type { Vec3 } from '../scene/types';\n\nexport const CURVED_SEGMENTS = 16;\n\nexport function cylinderFaces(\n center: Vec3,\n top: Vec3,\n radius: number,\n): { vertices: Vec3[]; faces: number[][] } {\n const baseRing: Vec3[] = [];\n const topRing: Vec3[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n const dx = radius * Math.cos(theta);\n const dy = radius * Math.sin(theta);\n baseRing.push([center[0] + dx, center[1] + dy, center[2]]);\n topRing.push([top[0] + dx, top[1] + dy, top[2]]);\n }\n const vertices = [...baseRing, ...topRing];\n const faces: number[][] = [];\n faces.push(baseRing.map((_, i) => i));\n faces.push(topRing.map((_, i) => CURVED_SEGMENTS + i));\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const next = (i + 1) % CURVED_SEGMENTS;\n faces.push([i, next, CURVED_SEGMENTS + next, CURVED_SEGMENTS + i]);\n }\n return { vertices, faces };\n}\n\nexport function coneFaces(\n baseCenter: Vec3,\n apex: Vec3,\n radius: number,\n): { vertices: Vec3[]; faces: number[][] } {\n const baseRing: Vec3[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n baseRing.push([\n baseCenter[0] + radius * Math.cos(theta),\n baseCenter[1] + radius * Math.sin(theta),\n baseCenter[2],\n ]);\n }\n const apexIdx = baseRing.length;\n const vertices = [...baseRing, apex];\n const faces: number[][] = [baseRing.map((_, i) => i)];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n faces.push([i, (i + 1) % CURVED_SEGMENTS, apexIdx]);\n }\n return { vertices, faces };\n}\n","import type { Scene3D } from '../scene/Scene3D';\nimport type { Scene3DObject, Vec3 } from '../scene/types';\nimport { constraintToWorld } from '../scene/constraintMath';\nimport { cylinderFaces, coneFaces } from './faceted';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport interface View3DLike {\n create(type: string, parents: unknown[], attrs: Record<string, unknown>): JxgObj;\n}\n\nexport class JxgRenderer {\n private map = new Map<string, JxgObj>();\n private unsubAdd: () => void;\n private unsubChange: () => void;\n private unsubDelete: () => void;\n private unsubReset: () => void;\n\n constructor(private scene: Scene3D, private view: View3DLike) {\n this.unsubAdd = scene.on('add', (o) => this.handleAdd(o));\n this.unsubChange = scene.on('change', (o) => this.handleChange(o));\n this.unsubDelete = scene.on('delete', (id) => this.handleDelete(id));\n this.unsubReset = scene.on('reset', () => this.handleReset());\n for (const obj of scene.list()) this.handleAdd(obj);\n }\n\n dispose(): void {\n this.unsubAdd();\n this.unsubChange();\n this.unsubDelete();\n this.unsubReset();\n for (const [id, j] of this.map) {\n try { j.remove?.(); } catch { /* swallow */ }\n this.map.delete(id);\n }\n }\n\n private handleAdd(obj: Scene3DObject): void {\n if (this.map.has(obj.id)) return;\n\n if (obj.kind === 'point') {\n const world = constraintToWorld(obj.constraint, this.scene);\n // fixed: true disables JSXGraph's native drag. Drag of existing points\n // is handled exclusively by MiniBoard3D.shouldStartPointDrag +\n // EditorPanel.onPointerDrag so the constraint math (Z-only in Point\n // mode, XY raycast in Move mode) is the single source of truth.\n const attrs = { id: obj.id, name: obj.label, size: 4, visible: obj.visible, fixed: true };\n const jxg = this.view.create('point3d', world, attrs);\n this.map.set(obj.id, jxg);\n return;\n }\n\n if (obj.kind === 'segment') {\n const a = this.map.get(obj.p1);\n const b = this.map.get(obj.p2);\n const attrs = {\n id: obj.id,\n straightFirst: false,\n straightLast: false,\n visible: obj.visible,\n strokeColor: obj.color ?? '#0066cc',\n strokeWidth: 2,\n };\n this.map.set(obj.id, this.view.create('line3d', [a, b], attrs));\n return;\n }\n\n if (obj.kind === 'line') {\n const attrs = {\n id: obj.id,\n visible: obj.visible,\n strokeColor: obj.color ?? '#0066cc',\n strokeWidth: 2,\n };\n this.map.set(\n obj.id,\n this.view.create('line3d', [this.map.get(obj.p1), this.map.get(obj.p2)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'ray') {\n const attrs = { id: obj.id, straightFirst: false, visible: obj.visible };\n this.map.set(\n obj.id,\n this.view.create('line3d', [this.map.get(obj.origin), this.map.get(obj.through)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'vector') {\n const attrs = {\n id: obj.id,\n lastArrow: true,\n straightFirst: false,\n straightLast: false,\n visible: obj.visible,\n };\n this.map.set(\n obj.id,\n this.view.create('line3d', [this.map.get(obj.from), this.map.get(obj.to)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'plane') {\n const attrs = { id: obj.id, fillOpacity: 0.2, visible: obj.visible };\n this.map.set(\n obj.id,\n this.view.create(\n 'plane3d',\n [this.map.get(obj.p1), this.map.get(obj.p2), this.map.get(obj.p3)],\n attrs,\n ),\n );\n return;\n }\n\n if (obj.kind === 'polygon') {\n const refs = obj.vertices.map((v) => this.map.get(v));\n const attrs = { id: obj.id, fillOpacity: 0.3, visible: obj.visible };\n this.map.set(obj.id, this.view.create('polygon3d', [refs], attrs));\n return;\n }\n\n if (obj.kind === 'sphere') {\n const attrs = { id: obj.id, fillOpacity: 0.25, visible: obj.visible };\n this.map.set(\n obj.id,\n this.view.create('sphere3d', [this.map.get(obj.center), this.map.get(obj.surfacePoint)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'polyhedron') {\n const verts = obj.vertices.map((id) => this.map.get(id));\n const faceJxgs = obj.faces.map((face) =>\n this.view.create('polygon3d', [face.map((idx) => verts[idx])], {\n id: `${obj.id}.face${face.join('-')}`,\n fillOpacity: 0.25,\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n }),\n );\n // Composite: store an object with _faces array + a remove() that disposes each face.\n this.map.set(obj.id, {\n _faces: faceJxgs,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n remove: () => faceJxgs.forEach((f: any) => f.remove?.()),\n });\n return;\n }\n\n if (obj.kind === 'cylinder' || obj.kind === 'cone') {\n const baseCenterPt = this.scene.get(obj.baseCenter);\n if (!baseCenterPt || baseCenterPt.kind !== 'point') return;\n const base = constraintToWorld(baseCenterPt.constraint, this.scene);\n let secondPt: Vec3;\n if (obj.kind === 'cylinder') {\n const topCenterPt = this.scene.get(obj.topCenter);\n if (!topCenterPt || topCenterPt.kind !== 'point') return;\n secondPt = constraintToWorld(topCenterPt.constraint, this.scene);\n } else {\n const apexPt = this.scene.get(obj.apex);\n if (!apexPt || apexPt.kind !== 'point') return;\n secondPt = constraintToWorld(apexPt.constraint, this.scene);\n }\n const geom =\n obj.kind === 'cylinder'\n ? cylinderFaces(base, secondPt, obj.radius)\n : coneFaces(base, secondPt, obj.radius);\n // Create vertex point3d's (hidden), then polygon3d per face.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const vertJxgs: any[] = geom.vertices.map((v, i) =>\n this.view.create('point3d', v, {\n id: `${obj.id}.v${i}`,\n visible: false,\n fixed: true,\n withLabel: false,\n }),\n );\n const faceJxgs = geom.faces.map((face) =>\n this.view.create('polygon3d', [face.map((idx) => vertJxgs[idx])], {\n id: `${obj.id}.face${face.join('-')}`,\n fillOpacity: 0.25,\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n }),\n );\n this.map.set(obj.id, {\n _verts: vertJxgs,\n _faces: faceJxgs,\n remove: () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n faceJxgs.forEach((f: any) => f.remove?.());\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vertJxgs.forEach((v: any) => v.remove?.());\n },\n });\n return;\n }\n }\n\n private handleChange(obj: Scene3DObject): void {\n const j = this.map.get(obj.id);\n if (!j) return;\n if (obj.kind === 'point' && typeof j.moveTo === 'function') {\n const w = constraintToWorld(obj.constraint, this.scene);\n // time=0 → instant teleport. Without it some JSXGraph builds tween the\n // move, which under fast successive drag updates manifests as flicker.\n try { j.moveTo([w[0], w[1], w[2]], 0); } catch { /* swallow */ }\n }\n }\n\n private handleDelete(id: string): void {\n const j = this.map.get(id);\n if (!j) return;\n try { j.remove?.(); } catch { /* swallow */ }\n this.map.delete(id);\n }\n\n private handleReset(): void {\n for (const [, j] of this.map) {\n try { j.remove?.(); } catch { /* swallow */ }\n }\n this.map.clear();\n }\n}\n","import type { Vec3 } from '../scene/types';\n\nexport interface View3DLike {\n unprojectScreen?(sx: number, sy: number, depth: number): [number, number, number];\n project3DTo2D?(x: number, y: number, z: number): [number, number, number, number];\n}\n\nexport interface Ray3D {\n origin: Vec3;\n dir: Vec3;\n}\n\nexport function screenToRay(screen: { x: number; y: number }, view: View3DLike): Ray3D {\n // Strategy: unproject the screen point at two depths to get a ray through the scene.\n // Prefer view.unprojectScreen if available (mock); fallback to bisection via project3DTo2D.\n const near = unproject(screen, view, +20);\n const far = unproject(screen, view, -20);\n const dir: Vec3 = [far[0] - near[0], far[1] - near[1], far[2] - near[2]];\n const n = Math.sqrt(dir[0] ** 2 + dir[1] ** 2 + dir[2] ** 2);\n const norm: Vec3 = n === 0 ? [0, 0, -1] : [dir[0] / n, dir[1] / n, dir[2] / n];\n return { origin: near, dir: norm };\n}\n\nfunction unproject(screen: { x: number; y: number }, view: View3DLike, depth: number): Vec3 {\n if (typeof view.unprojectScreen === 'function') {\n const v = view.unprojectScreen(screen.x, screen.y, depth);\n return [v[0], v[1], v[2]];\n }\n // Fallback for real JSXGraph view3d (orthographic-affine projection).\n // Extract the world→screen affine coefficients by sampling project3DTo2D at origin\n // and the three unit-axis points, then solve the 2×2 in (x, y) at the given depth.\n if (typeof view.project3DTo2D === 'function') {\n const p0 = view.project3DTo2D(0, 0, 0);\n const px = view.project3DTo2D(1, 0, 0);\n const py = view.project3DTo2D(0, 1, 0);\n const pz = view.project3DTo2D(0, 0, 1);\n const ox = p0[1], oy = p0[2];\n const a = px[1] - ox, b = py[1] - ox, c = pz[1] - ox;\n const d = px[2] - oy, e = py[2] - oy, f = pz[2] - oy;\n const rhsX = screen.x - ox - c * depth;\n const rhsY = screen.y - oy - f * depth;\n const det = a * e - b * d;\n if (Math.abs(det) < 1e-9) return [0, 0, depth];\n const x = (e * rhsX - b * rhsY) / det;\n const y = (-d * rhsX + a * rhsY) / det;\n return [x, y, depth];\n }\n throw new Error('rayCast: view has neither unprojectScreen nor project3DTo2D');\n}\n","import type { Vec3 } from '../scene/types';\nimport type { Ray3D } from './rayCast';\n\nconst EPS = 1e-9;\n\nexport interface PlaneHit { point: Vec3; t: number }\nexport interface SphereHit { point: Vec3; t: number }\nexport interface SegmentHit { point: Vec3; t: number; tOnSegment: number }\n\nfunction dot(a: Vec3, b: Vec3): number { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; }\nfunction sub(a: Vec3, b: Vec3): Vec3 { return [a[0]-b[0], a[1]-b[1], a[2]-b[2]]; }\nfunction add(a: Vec3, b: Vec3): Vec3 { return [a[0]+b[0], a[1]+b[1], a[2]+b[2]]; }\nfunction scale(a: Vec3, k: number): Vec3 { return [a[0]*k, a[1]*k, a[2]*k]; }\nfunction norm2(a: Vec3): number { return dot(a, a); }\n\nexport function rayPlane(\n ray: Ray3D,\n plane: { point: Vec3; normal: Vec3 },\n): PlaneHit | null {\n const denom = dot(ray.dir, plane.normal);\n if (Math.abs(denom) < EPS) return null;\n const t = dot(sub(plane.point, ray.origin), plane.normal) / denom;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\nexport function rayGround(ray: Ray3D): PlaneHit | null {\n return rayPlane(ray, { point: [0, 0, 0], normal: [0, 0, 1] });\n}\n\nexport function raySphere(\n ray: Ray3D,\n sphere: { center: Vec3; radius: number },\n): SphereHit | null {\n const oc = sub(ray.origin, sphere.center);\n const b = dot(oc, ray.dir);\n const c = dot(oc, oc) - sphere.radius * sphere.radius;\n const disc = b * b - c;\n if (disc < 0) return null;\n const sqrtD = Math.sqrt(disc);\n const t1 = -b - sqrtD;\n const t2 = -b + sqrtD;\n const t = t1 >= 0 ? t1 : t2;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\n/**\n * Closest approach between ray and line segment. Accepts a distance threshold\n * (in world units; caller scales for pixel ratio).\n */\nexport function rayLineSegment(\n ray: Ray3D,\n seg: { a: Vec3; b: Vec3 },\n maxDistance: number,\n): SegmentHit | null {\n const u = ray.dir;\n const v = sub(seg.b, seg.a);\n const w0 = sub(ray.origin, seg.a);\n const a = dot(u, u);\n const bb = dot(u, v);\n const cc = dot(v, v);\n const d = dot(u, w0);\n const e = dot(v, w0);\n const denom = a * cc - bb * bb;\n if (Math.abs(denom) < EPS) return null;\n const sc = (bb * e - cc * d) / denom;\n const tc = (a * e - bb * d) / denom;\n if (sc < 0 || tc < 0 || tc > 1) return null;\n const pRay = add(ray.origin, scale(u, sc));\n const pSeg = add(seg.a, scale(v, tc));\n const dist2 = norm2(sub(pRay, pSeg));\n if (dist2 > maxDistance * maxDistance) return null;\n return { point: pSeg, t: sc, tOnSegment: tc };\n}\n","import { constraintToWorld } from '../scene/constraintMath';\nimport type { Scene3D } from '../scene/Scene3D';\nimport type { View3DLike } from './rayCast';\n\nexport function findSnapPoint(\n screen: { x: number; y: number },\n view: View3DLike,\n scene: Scene3D,\n pixelRadius = 8,\n): string | null {\n // `screen` arrives in JSXGraph user-space (pixelToUser-converted in MiniBoard3D),\n // and project3DTo2D also returns user-space. Convert the desired pixel radius\n // to user units via the board's px-per-unit scale so the snap stays small\n // (a few real pixels) regardless of zoom or board size.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing — keeps unit tests, whose\n // mock view emits pixel-space coords directly, working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const uy = typeof board?.unitY === 'number' && board.unitY > 0 ? board.unitY : ux;\n const rxUser = pixelRadius / ux;\n const ryUser = pixelRadius / uy;\n let best: { id: string; d2: number } | null = null;\n for (const obj of scene.list()) {\n if (obj.kind !== 'point') continue;\n if (!obj.visible) continue;\n const world = constraintToWorld(obj.constraint, scene);\n const proj = view.project3DTo2D?.(world[0], world[1], world[2]);\n if (!proj) continue;\n const dxN = (proj[1] - screen.x) / rxUser;\n const dyN = (proj[2] - screen.y) / ryUser;\n const d2 = dxN * dxN + dyN * dyN;\n if (d2 <= 1 && (best === null || d2 < best.d2)) {\n best = { id: obj.id, d2 };\n }\n }\n return best?.id ?? null;\n}\n","import { screenToRay, type View3DLike } from './rayCast';\nimport { rayGround, rayLineSegment, rayPlane, raySphere } from './intersect';\nimport { findSnapPoint } from './snapping';\nimport { constraintToWorld } from '../scene/constraintMath';\nimport type { Scene3D } from '../scene/Scene3D';\nimport type { Vec3 } from '../scene/types';\n\n// NOTE (v0.8.0): onPolygon and onLine SceneHit variants are typed but not yet\n// produced by hitTest. They will be added once tools require placing points\n// on user-defined lines/polygons (deferred from Task 2.4).\n\nexport type SceneHit =\n | { kind: 'existingPoint'; pointId: string }\n | { kind: 'onGround'; world: Vec3 }\n | { kind: 'onAxis'; axis: 'x' | 'y' | 'z'; t: number; world: Vec3 }\n | { kind: 'onPlane'; planeId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onLine'; lineId: string; t: number; world: Vec3 }\n | { kind: 'onPolygon'; polygonId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onSphere'; sphereId: string; theta: number; phi: number; world: Vec3 }\n | { kind: 'empty' };\n\nconst AXIS_PIXEL_THRESHOLD = 12;\n\nexport function hitTest(\n screen: { x: number; y: number },\n view: View3DLike,\n scene: Scene3D,\n): SceneHit {\n // `screen` arrives in user-space; thresholds below are in pixels and need to\n // be converted to user units via the board's px-per-unit scale.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing so the hitTest unit tests,\n // whose mock view emits pixel-space coords directly, keep working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const axisThresholdUser = AXIS_PIXEL_THRESHOLD / ux;\n\n // 1. Existing point snap\n const snap = findSnapPoint(screen, view, scene);\n if (snap) return { kind: 'existingPoint', pointId: snap };\n\n const ray = screenToRay(screen, view);\n\n // 2. Spheres\n let bestSphere: { id: string; t: number; world: Vec3 } | null = null;\n for (const obj of scene.list()) {\n if (obj.kind !== 'sphere' || !obj.visible) continue;\n const centerPoint = scene.get(obj.center);\n const surfacePoint = scene.get(obj.surfacePoint);\n if (!centerPoint || centerPoint.kind !== 'point') continue;\n if (!surfacePoint || surfacePoint.kind !== 'point') continue;\n const center = constraintToWorld(centerPoint.constraint, scene);\n const surface = constraintToWorld(surfacePoint.constraint, scene);\n const radius = Math.hypot(\n surface[0] - center[0],\n surface[1] - center[1],\n surface[2] - center[2],\n );\n const sh = raySphere(ray, { center, radius });\n if (sh && (bestSphere === null || sh.t < bestSphere.t)) {\n bestSphere = { id: obj.id, t: sh.t, world: sh.point };\n }\n }\n\n // 3. Axis snap — project click onto each axis line in screen space, check pixel distance\n if (view.project3DTo2D) {\n const axes: { axis: 'x' | 'y' | 'z'; a: Vec3; b: Vec3 }[] = [\n { axis: 'x', a: [-10, 0, 0], b: [10, 0, 0] },\n { axis: 'y', a: [0, -10, 0], b: [0, 10, 0] },\n { axis: 'z', a: [0, 0, -10], b: [0, 0, 10] },\n ];\n for (const ax of axes) {\n const pa = view.project3DTo2D(ax.a[0], ax.a[1], ax.a[2]);\n const pb = view.project3DTo2D(ax.b[0], ax.b[1], ax.b[2]);\n const d = distScreenPointToSegment(screen, [pa[1], pa[2]], [pb[1], pb[2]]);\n if (d <= axisThresholdUser) {\n const hit = rayLineSegment(ray, { a: ax.a, b: ax.b }, 1e3);\n if (hit) {\n const t = ax.axis === 'x' ? hit.point[0] : ax.axis === 'y' ? hit.point[1] : hit.point[2];\n return { kind: 'onAxis', axis: ax.axis, t, world: hit.point };\n }\n }\n }\n }\n\n // 4. User-defined planes\n let bestPlane: { id: string; t: number; world: Vec3; basis: NonNullable<ReturnType<typeof planeBasis>> } | null = null;\n for (const obj of scene.list()) {\n if (obj.kind !== 'plane' || !obj.visible) continue;\n const basis = planeBasis(obj, scene);\n if (!basis) continue;\n const ph = rayPlane(ray, { point: basis.origin, normal: basis.normal });\n if (ph && (bestPlane === null || ph.t < bestPlane.t)) {\n bestPlane = { id: obj.id, t: ph.t, world: ph.point, basis };\n }\n }\n // Compare best plane to best sphere — return whichever is closer\n if (bestPlane && (!bestSphere || bestPlane.t < bestSphere.t)) {\n const rel: Vec3 = [\n bestPlane.world[0] - bestPlane.basis.origin[0],\n bestPlane.world[1] - bestPlane.basis.origin[1],\n bestPlane.world[2] - bestPlane.basis.origin[2],\n ];\n const b1n = dot3(bestPlane.basis.basis1, bestPlane.basis.basis1);\n const b2n = dot3(bestPlane.basis.basis2, bestPlane.basis.basis2);\n const u = b1n === 0 ? 0 : dot3(rel, bestPlane.basis.basis1) / b1n;\n const v = b2n === 0 ? 0 : dot3(rel, bestPlane.basis.basis2) / b2n;\n return { kind: 'onPlane', planeId: bestPlane.id, u, v, world: bestPlane.world };\n }\n\n // 5. Sphere result (if found)\n if (bestSphere) {\n const sph = scene.get(bestSphere.id);\n if (sph && sph.kind === 'sphere') {\n const centerPt = scene.get(sph.center);\n if (centerPt && centerPt.kind === 'point') {\n const center = constraintToWorld(centerPt.constraint, scene);\n const relX = bestSphere.world[0] - center[0];\n const relY = bestSphere.world[1] - center[1];\n const relZ = bestSphere.world[2] - center[2];\n const r = Math.hypot(relX, relY, relZ);\n const phi = r === 0 ? 0 : Math.acos(relZ / r);\n const theta = Math.atan2(relY, relX);\n return { kind: 'onSphere', sphereId: bestSphere.id, theta, phi, world: bestSphere.world };\n }\n }\n }\n\n // 6. Ground\n const g = rayGround(ray);\n if (g) return { kind: 'onGround', world: g.point };\n\n return { kind: 'empty' };\n}\n\nfunction distScreenPointToSegment(\n p: { x: number; y: number },\n a: [number, number],\n b: [number, number],\n): number {\n const vx = b[0] - a[0];\n const vy = b[1] - a[1];\n const wx = p.x - a[0];\n const wy = p.y - a[1];\n const c1 = vx * wx + vy * wy;\n if (c1 <= 0) return Math.hypot(wx, wy);\n const c2 = vx * vx + vy * vy;\n if (c2 <= c1) return Math.hypot(p.x - b[0], p.y - b[1]);\n const t = c1 / c2;\n const px = a[0] + t * vx;\n const py = a[1] + t * vy;\n return Math.hypot(p.x - px, p.y - py);\n}\n\nfunction planeBasis(\n planeObj: { p1: string; p2: string; p3: string },\n scene: Scene3D,\n): { origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3 } | null {\n const p1Obj = scene.get(planeObj.p1);\n const p2Obj = scene.get(planeObj.p2);\n const p3Obj = scene.get(planeObj.p3);\n if (!p1Obj || p1Obj.kind !== 'point') return null;\n if (!p2Obj || p2Obj.kind !== 'point') return null;\n if (!p3Obj || p3Obj.kind !== 'point') return null;\n const p1 = constraintToWorld(p1Obj.constraint, scene);\n const p2 = constraintToWorld(p2Obj.constraint, scene);\n const p3 = constraintToWorld(p3Obj.constraint, scene);\n const basis1: Vec3 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];\n const tmp: Vec3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];\n const cx = basis1[1]*tmp[2] - basis1[2]*tmp[1];\n const cy = basis1[2]*tmp[0] - basis1[0]*tmp[2];\n const cz = basis1[0]*tmp[1] - basis1[1]*tmp[0];\n const cLen = Math.hypot(cx, cy, cz);\n if (cLen === 0) return null;\n const normal: Vec3 = [cx / cLen, cy / cLen, cz / cLen];\n const basis2: Vec3 = [\n normal[1]*basis1[2] - normal[2]*basis1[1],\n normal[2]*basis1[0] - normal[0]*basis1[2],\n normal[0]*basis1[1] - normal[1]*basis1[0],\n ];\n return { origin: p1, basis1, basis2, normal };\n}\n\nfunction dot3(a: Vec3, b: Vec3): number {\n return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n}\n","'use client';\nimport * as React from 'react';\nimport {\n DEFAULT_VIEW3D,\n GROUND_PLANE_ATTRS,\n GROUND_PLANE_RANGE,\n VIEW3D_ATTRS,\n paletteFor,\n} from './theme';\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 JxgView3D = any;\n\nexport interface MiniBoard3DProps {\n isDark: boolean;\n onView3DReady?: (view: JxgView3D, board: JxgBoard) => void;\n onPointerClick?: (screen: { x: number; y: number }) => void;\n onPointerMove?: (screen: { x: number; y: number }) => void;\n onPointerLeave?: () => void;\n /**\n * Called on pointerdown. Return true to switch the upcoming drag from the\n * default view-rotate mode into a delegated point-drag (passed to\n * onPointerDrag / onPointerDragEnd). The screen coord is in user-space.\n */\n shouldStartPointDrag?: (screen: { x: number; y: number }) => boolean;\n onPointerDrag?: (screen: { x: number; y: number }) => void;\n /**\n * Called at the end of a point-drag gesture (also invoked defensively on\n * pointerleave during an in-flight drag). The screen coord is in user-space.\n * Consumers that only need a \"drag ended\" notification may ignore the arg.\n */\n onPointerDragEnd?: (screen: { x: number; y: number }) => void;\n}\n\nexport interface MiniBoard3DHandle {\n getBoard: () => JxgBoard | null;\n getView3D: () => JxgView3D | null;\n /** Returns the current SVG element of the board for export. */\n getSvgElement: () => SVGSVGElement | null;\n}\n\nexport const MiniBoard3D = React.forwardRef<MiniBoard3DHandle, MiniBoard3DProps>(\n function MiniBoard3D(props, ref) {\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const boardRef = React.useRef<JxgBoard | null>(null);\n const viewRef = React.useRef<JxgView3D | null>(null);\n const {\n isDark,\n onView3DReady,\n onPointerClick,\n onPointerMove,\n onPointerLeave,\n shouldStartPointDrag,\n onPointerDrag,\n onPointerDragEnd,\n } = props;\n\n // Keep latest callback refs stable across re-renders so the init effect\n // doesn't have to re-run when handlers change.\n const onView3DReadyRef = React.useRef(onView3DReady);\n const onPointerClickRef = React.useRef(onPointerClick);\n const onPointerMoveRef = React.useRef(onPointerMove);\n const onPointerLeaveRef = React.useRef(onPointerLeave);\n const shouldStartPointDragRef = React.useRef(shouldStartPointDrag);\n const onPointerDragRef = React.useRef(onPointerDrag);\n const onPointerDragEndRef = React.useRef(onPointerDragEnd);\n onView3DReadyRef.current = onView3DReady;\n onPointerClickRef.current = onPointerClick;\n onPointerMoveRef.current = onPointerMove;\n onPointerLeaveRef.current = onPointerLeave;\n shouldStartPointDragRef.current = shouldStartPointDrag;\n onPointerDragRef.current = onPointerDrag;\n onPointerDragEndRef.current = onPointerDragEnd;\n\n React.useImperativeHandle(\n ref,\n () => ({\n getBoard: () => boardRef.current,\n getView3D: () => viewRef.current,\n getSvgElement: () => containerRef.current?.querySelector('svg') ?? null,\n }),\n [],\n );\n\n React.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 let svgEl: SVGSVGElement | null = null;\n let handlePointerDown: ((e: PointerEvent) => void) | null = null;\n let handlePointerMove: ((e: PointerEvent) => void) | null = null;\n let handlePointerUp: ((e: PointerEvent) => void) | null = null;\n let handlePointerLeave: (() => void) | null = null;\n\n void (async () => {\n try {\n JXG = (await import('jsxgraph')).default;\n } catch {\n return;\n }\n if (cancelled || !containerRef.current) return;\n try {\n JXG.Options.text.display = 'internal';\n } catch {\n /* ignore option set error in some mocks */\n }\n\n try {\n board = JXG.JSXGraph.initBoard(div, {\n boundingbox: [-6, 6, 6, -6],\n keepaspectratio: true,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n });\n } catch {\n return;\n }\n if (cancelled || !board) return;\n boardRef.current = board;\n\n let view: JxgView3D | null = null;\n try {\n const baseAttrs = VIEW3D_ATTRS(isDark);\n view = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [DEFAULT_VIEW3D.bbox3D[0], DEFAULT_VIEW3D.bbox3D[3]],\n [DEFAULT_VIEW3D.bbox3D[1], DEFAULT_VIEW3D.bbox3D[4]],\n [DEFAULT_VIEW3D.bbox3D[2], DEFAULT_VIEW3D.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n az: { ...baseAttrs.az, value: DEFAULT_VIEW3D.azimuth },\n el: { ...baseAttrs.el, value: DEFAULT_VIEW3D.elevation },\n },\n );\n } catch {\n /* ignore — mock or jsdom limitation */\n }\n viewRef.current = view;\n if (view) {\n // GeoGebra-style XY ground plane through origin (z=0), drawn behind\n // any user-created geometry. View3D's built-in zPlaneRear sits at the\n // bbox floor (z=zMin), not at the axes — so we draw an explicit one.\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => unknown }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(isDark),\n );\n } catch {\n /* swallow — older JSXGraph or mock may not support 5-arg plane3d */\n }\n onView3DReadyRef.current?.(view, board);\n }\n\n svgEl = (containerRef.current?.querySelector('svg') ?? null) as SVGSVGElement | null;\n if (svgEl) {\n const p = paletteFor(isDark);\n svgEl.style.background = p.view3dBg;\n\n // Convert browser pixel coords to JSXGraph user-space coords so that\n // hitTest math (which compares against view.project3DTo2D output, also\n // in user-space) is in the same coordinate system.\n const pixelToUser = (e: PointerEvent): { x: number; y: number } => {\n const rect = svgEl!.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const b = board as any;\n if (!b || !b.origin || !b.origin.scrCoords) {\n return { x: px, y: py };\n }\n const ox = b.origin.scrCoords[1];\n const oy = b.origin.scrCoords[2];\n const ux = b.unitX || 1;\n const uy = b.unitY || 1;\n return { x: (px - ox) / ux, y: (oy - py) / uy };\n };\n // Drag-to-rotate: track pointerdown start; if pointer travels past\n // DRAG_THRESHOLD before pointerup → rotate az/el and suppress click.\n const DRAG_THRESHOLD = 4;\n const AZ_PER_PX = 0.01;\n const EL_PER_PX = 0.01;\n const EL_LIMIT = Math.PI / 2 - 0.05;\n let dragStart: { x: number; y: number } | null = null;\n let dragging = false;\n let pointDragMode = false;\n let startAz = 0;\n let startEl = 0;\n const readAng = (s: { Value?: () => number; value?: number } | undefined): number => {\n if (!s) return 0;\n if (typeof s.Value === 'function') {\n try { return s.Value(); } catch { /* fallthrough */ }\n }\n return typeof s.value === 'number' ? s.value : 0;\n };\n const setAng = (\n s: { setValue?: (v: number) => void; value?: number } | undefined,\n v: number,\n ): void => {\n if (!s) return;\n if (typeof s.setValue === 'function') {\n try { s.setValue(v); return; } catch { /* fallthrough */ }\n }\n s.value = v;\n };\n\n handlePointerDown = (e: PointerEvent) => {\n if (!svgEl) return;\n dragStart = { x: e.clientX, y: e.clientY };\n dragging = false;\n pointDragMode = false;\n // If the consumer claims this drag (e.g. cursor is over an existing\n // point), enter point-drag mode and skip view-rotation.\n const screen = pixelToUser(e);\n try {\n pointDragMode = shouldStartPointDragRef.current?.(screen) ?? false;\n } catch { pointDragMode = false; }\n if (!pointDragMode) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = viewRef.current as any;\n startAz = readAng(v?.az_slide ?? v?.az);\n startEl = readAng(v?.el_slide ?? v?.el);\n }\n try { svgEl.setPointerCapture?.(e.pointerId); } catch { /* ignore */ }\n };\n handlePointerMove = (e: PointerEvent) => {\n if (!svgEl) return;\n if (dragStart) {\n const dx = e.clientX - dragStart.x;\n const dy = e.clientY - dragStart.y;\n if (!dragging && Math.hypot(dx, dy) > DRAG_THRESHOLD) dragging = true;\n if (dragging) {\n if (pointDragMode) {\n onPointerDragRef.current?.(pixelToUser(e));\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = viewRef.current as any;\n const newAz = startAz + dx * AZ_PER_PX;\n let newEl = startEl - dy * EL_PER_PX;\n if (newEl > EL_LIMIT) newEl = EL_LIMIT;\n if (newEl < -EL_LIMIT) newEl = -EL_LIMIT;\n setAng(v?.az_slide ?? v?.az, newAz);\n setAng(v?.el_slide ?? v?.el, newEl);\n try { v?.board?.update?.(); } catch { /* ignore */ }\n return;\n }\n }\n onPointerMoveRef.current?.(pixelToUser(e));\n };\n handlePointerUp = (e: PointerEvent) => {\n if (!svgEl) return;\n const wasDrag = dragging;\n const hadDown = dragStart !== null;\n const wasPointDrag = pointDragMode;\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n try { svgEl.releasePointerCapture?.(e.pointerId); } catch { /* ignore */ }\n // When the consumer claimed the gesture (pointDragMode), it owns\n // both placement and finalisation. Always run onPointerDragEnd so\n // any consumer-side refs are cleared (and an undo checkpoint can\n // be pushed), and SKIP onPointerClick to avoid double-handling\n // (e.g. Point-tool place-and-lift creates the point in\n // shouldStartPointDrag; we mustn't also fire the\n // click→consumeHit→buildPoint path).\n if (hadDown && wasPointDrag) {\n onPointerDragEndRef.current?.(pixelToUser(e));\n return;\n }\n if (hadDown && !wasDrag) {\n onPointerClickRef.current?.(pixelToUser(e));\n }\n };\n handlePointerLeave = () => {\n if (pointDragMode) {\n // Best-effort cleanup so a stray pointerleave during a drag\n // doesn't leak the consumer's draggedPointRef.\n try { onPointerDragEndRef.current?.({ x: 0, y: 0 }); } catch { /* ignore */ }\n }\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n onPointerLeaveRef.current?.();\n };\n svgEl.addEventListener('pointerdown', handlePointerDown);\n svgEl.addEventListener('pointermove', handlePointerMove);\n svgEl.addEventListener('pointerup', handlePointerUp);\n svgEl.addEventListener('pointercancel', handlePointerUp);\n svgEl.addEventListener('pointerleave', handlePointerLeave);\n }\n })();\n\n return () => {\n cancelled = true;\n if (svgEl) {\n if (handlePointerDown) svgEl.removeEventListener('pointerdown', handlePointerDown);\n if (handlePointerMove) svgEl.removeEventListener('pointermove', handlePointerMove);\n if (handlePointerUp) {\n svgEl.removeEventListener('pointerup', handlePointerUp);\n svgEl.removeEventListener('pointercancel', handlePointerUp);\n }\n if (handlePointerLeave) svgEl.removeEventListener('pointerleave', handlePointerLeave);\n }\n try {\n if (board && JXG) JXG.JSXGraph.freeBoard(board);\n } catch {\n /* swallow teardown errors in tests */\n }\n boardRef.current = null;\n viewRef.current = null;\n };\n }, [isDark]);\n\n const p = paletteFor(isDark);\n\n return (\n <div\n data-testid=\"mini-board-3d\"\n ref={containerRef}\n style={{\n width: '100%',\n height: '100%',\n minHeight: 400,\n background: p.view3dBg,\n position: 'relative',\n // Clip JSXGraph mesh3d paths projecting outside the container.\n overflow: 'hidden',\n }}\n />\n );\n },\n);\n","'use client';\nimport * as React from 'react';\n\nexport interface StatusHintProps {\n hint: string;\n hoverLabel?: string | null;\n}\n\nexport function StatusHint(props: StatusHintProps): React.ReactElement {\n const { hint, hoverLabel } = props;\n return (\n <div\n data-testid=\"status-hint\"\n className=\"border-t border-zinc-200 bg-zinc-50 px-3 py-1.5 text-xs text-zinc-700 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\"\n >\n <span>📐 {hint || 'Chọn công cụ trong bảng bên trái'}</span>\n {hoverLabel ? (\n <span className=\"ml-3 text-zinc-500\">— đang trên: {hoverLabel}</span>\n ) : null}\n </div>\n );\n}\n","import type { ObjectKind } from './types';\n\nconst A = 'A'.charCodeAt(0);\n\nexport function nextPointLabel(existing: string[]): string {\n const used = new Set(existing);\n for (let suffix = 0; suffix < 1000; suffix++) {\n for (let i = 0; i < 26; i++) {\n const letter = String.fromCharCode(A + i);\n const candidate = suffix === 0 ? letter : `${letter}_${suffix}`;\n if (!used.has(candidate)) return candidate;\n }\n }\n return `P_${used.size}`;\n}\n\nconst LOWERCASE_KINDS: ObjectKind[] = ['segment', 'line', 'ray', 'vector'];\nconst PREFIX: Partial<Record<ObjectKind, string>> = {\n sphere: 's',\n polyhedron: 'h',\n cylinder: 'c',\n cone: 'k',\n polygon: 'g',\n plane: 'π',\n};\n\nexport function nextDerivedLabel(kind: ObjectKind, existing: string[]): string {\n const used = new Set(existing);\n if (LOWERCASE_KINDS.includes(kind)) {\n for (let i = 0; i < 26; i++) {\n const c = String.fromCharCode('a'.charCodeAt(0) + i);\n if (!used.has(c)) return c;\n }\n for (let n = 1; n < 1000; n++) {\n const c = `a_${n}`;\n if (!used.has(c)) return c;\n }\n }\n const prefix = PREFIX[kind] ?? kind[0];\n for (let n = 1; n < 1000; n++) {\n const candidate = `${prefix}_${n}`;\n if (!used.has(candidate)) return candidate;\n }\n return `${prefix}_x`;\n}\n","import { nextPointLabel, nextDerivedLabel } from './labels';\nimport type { Constraint, Scene3DObject, ObjectKind } from './types';\n\ntype Listener<E> = (event: E) => void;\n\nexport type SceneSnapshot = {\n objects: ReadonlyMap<string, Scene3DObject>;\n order: readonly string[];\n counter: number;\n};\n\nexport class Scene3D {\n private objects = new Map<string, Scene3DObject>();\n private order: string[] = [];\n private counter = 0;\n private listeners = {\n add: new Set<Listener<Scene3DObject>>(),\n change: new Set<Listener<Scene3DObject>>(),\n delete: new Set<Listener<string>>(),\n reset: new Set<Listener<void>>(),\n };\n\n private historyPast: SceneSnapshot[] = [];\n private historyFuture: SceneSnapshot[] = [];\n private historySuspended = false;\n private historyListeners = new Set<() => void>();\n\n on(event: 'add', cb: Listener<Scene3DObject>): () => void;\n on(event: 'change', cb: Listener<Scene3DObject>): () => void;\n on(event: 'delete', cb: Listener<string>): () => void;\n on(event: 'reset', cb: Listener<void>): () => void;\n on(event: keyof Scene3D['listeners'], cb: Listener<never>): () => void {\n const set = this.listeners[event] as Set<Listener<never>>;\n set.add(cb);\n return () => {\n set.delete(cb);\n };\n }\n\n private nextId(prefix: string): string {\n this.counter += 1;\n return `${prefix}${this.counter}`;\n }\n\n addPoint(constraint: Constraint, label?: string, color?: string): string {\n this.capture();\n const id = this.nextId('p');\n const existingLabels = this.list().filter((o) => o.kind === 'point').map((o) => o.label);\n const autoLabel = label ?? nextPointLabel(existingLabels);\n const obj: Scene3DObject = {\n kind: 'point',\n id,\n label: autoLabel,\n visible: true,\n color,\n constraint,\n };\n this.objects.set(id, obj);\n this.order.push(id);\n this.listeners.add.forEach((cb) => cb(obj));\n return id;\n }\n\n addObject<K extends Exclude<ObjectKind, 'point'>>(\n kind: K,\n spec: Omit<Extract<Scene3DObject, { kind: K }>, 'id' | 'label' | 'visible' | 'kind'>,\n label?: string,\n ): string {\n this.capture();\n const id = this.nextId(kind[0]);\n const existingLabels = this.list().filter((o) => o.kind === kind).map((o) => o.label);\n const autoLabel = label ?? nextDerivedLabel(kind, existingLabels);\n const obj = { id, label: autoLabel, visible: true, kind, ...spec } as unknown as Scene3DObject;\n this.objects.set(id, obj);\n this.order.push(id);\n this.listeners.add.forEach((cb) => cb(obj));\n return id;\n }\n\n insert(obj: Scene3DObject): void {\n this.capture();\n if (this.objects.has(obj.id)) {\n throw new Error(`Scene3D.insert: id ${obj.id} already exists`);\n }\n this.objects.set(obj.id, obj);\n this.order.push(obj.id);\n this.listeners.add.forEach((cb) => cb(obj));\n }\n\n get(id: string): Scene3DObject | undefined {\n return this.objects.get(id);\n }\n\n list(): Scene3DObject[] {\n return this.order\n .map((id) => this.objects.get(id))\n .filter((obj): obj is Scene3DObject => obj !== undefined);\n }\n\n private referencedIds(obj: Scene3DObject): string[] {\n switch (obj.kind) {\n case 'point': {\n const c = obj.constraint;\n if (c.kind === 'onPlane') return [c.planeId];\n if (c.kind === 'onLine') return [c.lineId];\n if (c.kind === 'onPolygon') return [c.polygonId];\n if (c.kind === 'onSphere') return [c.sphereId];\n return [];\n }\n case 'segment':\n case 'line': return [obj.p1, obj.p2];\n case 'ray': return [obj.origin, obj.through];\n case 'vector': return [obj.from, obj.to];\n case 'polygon': return obj.vertices;\n case 'plane': return [obj.p1, obj.p2, obj.p3];\n case 'sphere': return [obj.center, obj.surfacePoint];\n case 'polyhedron': return obj.vertices;\n case 'cylinder': return [obj.baseCenter, obj.topCenter];\n case 'cone': return [obj.baseCenter, obj.apex];\n }\n }\n\n private collectDependents(targetId: string): Set<string> {\n const dependents = new Set<string>([targetId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of this.objects.values()) {\n if (dependents.has(obj.id)) continue;\n const refs = this.referencedIds(obj);\n if (refs.some((r) => dependents.has(r))) {\n dependents.add(obj.id);\n grew = true;\n }\n }\n }\n return dependents;\n }\n\n delete(id: string): void {\n if (!this.objects.has(id)) return;\n this.capture();\n const toDelete = this.collectDependents(id);\n for (const dependentId of toDelete) {\n this.objects.delete(dependentId);\n this.order = this.order.filter((x) => x !== dependentId);\n this.listeners.delete.forEach((cb) => cb(dependentId));\n }\n }\n\n reset(): void {\n this.capture();\n this.objects.clear();\n this.order = [];\n this.counter = 0;\n this.listeners.reset.forEach((cb) => cb());\n }\n\n reserveId(prefix: string): string {\n return this.nextId(prefix);\n }\n\n emitChange(id: string): void {\n const obj = this.objects.get(id);\n if (!obj) return;\n this.listeners.change.forEach((cb) => cb(obj));\n }\n\n snapshot(): SceneSnapshot {\n const cloned = new Map<string, Scene3DObject>();\n for (const [id, obj] of this.objects) {\n cloned.set(id, { ...obj } as Scene3DObject);\n }\n return {\n objects: cloned,\n order: [...this.order],\n counter: this.counter,\n };\n }\n\n private restore(snap: SceneSnapshot): void {\n this.objects = new Map();\n for (const [id, obj] of snap.objects) {\n this.objects.set(id, { ...obj } as Scene3DObject);\n }\n this.order = [...snap.order];\n this.counter = snap.counter;\n this.listeners.reset.forEach((cb) => cb());\n for (const id of this.order) {\n const obj = this.objects.get(id);\n if (obj) this.listeners.add.forEach((cb) => cb(obj));\n }\n }\n\n private capture(): void {\n if (this.historySuspended) return;\n this.historyPast.push(this.snapshot());\n this.historyFuture = [];\n this.notifyHistoryChange();\n }\n\n canUndo(): boolean {\n return this.historyPast.length > 0;\n }\n\n canRedo(): boolean {\n return this.historyFuture.length > 0;\n }\n\n undo(): void {\n const prev = this.historyPast.pop();\n if (!prev) return;\n this.historyFuture.push(this.snapshot());\n this.restore(prev);\n this.notifyHistoryChange();\n }\n\n redo(): void {\n const next = this.historyFuture.pop();\n if (!next) return;\n this.historyPast.push(this.snapshot());\n this.restore(next);\n this.notifyHistoryChange();\n }\n\n withoutHistory(fn: () => void): void {\n const prev = this.historySuspended;\n this.historySuspended = true;\n try {\n fn();\n } finally {\n this.historySuspended = prev;\n }\n }\n\n pushUndoCheckpoint(prev: SceneSnapshot): void {\n if (this.historySuspended) return;\n this.historyPast.push(prev);\n this.historyFuture = [];\n this.notifyHistoryChange();\n }\n\n onHistoryChange(cb: () => void): () => void {\n this.historyListeners.add(cb);\n return () => {\n this.historyListeners.delete(cb);\n };\n }\n\n private notifyHistoryChange(): void {\n this.historyListeners.forEach((cb) => cb());\n }\n}\n","import { Scene3D } from './Scene3D';\nimport type { Constraint, Scene3DObject } from './types';\nimport type { SerializedBoard3D, SerializedElement3D } from '../../serialize';\nimport { constraintToWorld } from './constraintMath';\n\n/**\n * Translate a live Scene3D into a v2 SerializedBoard3D.\n *\n * Strategy: each Scene3DObject becomes one or more SerializedElement3D entries.\n * Points carry an explicit `constraint` field. Derived objects (segment/line/\n * polygon/...) reference the point ids via `attributes.sceneSpec` so\n * round-trip is unambiguous, and `parents` is left empty (the loader\n * reconstructs from `sceneSpec` rather than `parents` at load time).\n */\nexport function sceneToBoard(\n scene: Scene3D,\n view: { azimuth: number; elevation: number; bbox3D: [number, number, number, number, number, number] },\n bbox: [number, number, number, number],\n): SerializedBoard3D {\n const elements: SerializedElement3D[] = [];\n for (const obj of scene.list()) {\n const els = sceneObjectToElements(obj, scene);\n elements.push(...els);\n }\n return { version: 2, bbox, view, showAxes: true, showMesh: true, elements };\n}\n\nfunction sceneObjectToElements(obj: Scene3DObject, scene: Scene3D): SerializedElement3D[] {\n const baseAttrs = { label: obj.label, visible: obj.visible, color: obj.color };\n switch (obj.kind) {\n case 'point': {\n let w: [number, number, number];\n try {\n w = constraintToWorld(obj.constraint, scene);\n } catch {\n // If dependent objects are missing, fall back to origin so the entry\n // still serializes; loader uses `constraint` (not parents) for v2.\n w = [0, 0, 0];\n }\n return [{\n type: 'point3d',\n parents: [w[0], w[1], w[2]],\n attributes: { id: obj.id, ...baseAttrs },\n id: obj.id,\n label: obj.label,\n constraint: obj.constraint,\n }];\n }\n case 'segment':\n case 'line':\n case 'ray':\n case 'vector':\n case 'plane':\n case 'sphere':\n case 'polygon':\n case 'polyhedron':\n case 'cylinder':\n case 'cone': {\n return [{\n type: pickJxgType(obj.kind),\n parents: [],\n attributes: { id: obj.id, ...baseAttrs, sceneKind: obj.kind, sceneSpec: encodeSpec(obj) },\n id: obj.id,\n label: obj.label,\n }];\n }\n }\n}\n\nfunction pickJxgType(kind: Scene3DObject['kind']): SerializedElement3D['type'] {\n switch (kind) {\n case 'point': return 'point3d';\n case 'segment':\n case 'line':\n case 'ray':\n case 'vector': return 'line3d';\n case 'plane': return 'plane3d';\n case 'sphere': return 'sphere3d';\n case 'polygon':\n case 'polyhedron':\n case 'cylinder':\n case 'cone': return 'polygon3d';\n }\n}\n\nfunction encodeSpec(obj: Scene3DObject): Record<string, unknown> {\n // Strip the base/identity fields; the rest is the kind-specific spec that\n // boardToScene needs to reconstruct the object. `kind` is preserved in the\n // sibling `sceneKind` attribute so it isn't duplicated here.\n const rest: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (k === 'id' || k === 'label' || k === 'visible' || k === 'color' || k === 'kind') continue;\n rest[k] = v;\n }\n return rest;\n}\n\n/**\n * Reconstruct a Scene3D from a SerializedBoard3D. Accepts both v1 (legacy,\n * no constraints) and v2 (new format).\n *\n * For v1: every point3d becomes `kind: 'free'`, and derived objects with our\n * `sceneSpec` attribute are skipped (legacy stamps don't carry sceneSpec, so\n * the loop won't see them; this is correct).\n *\n * For v2: each element carries `constraint` (points) or `sceneSpec` (derived)\n * and we reconstruct the full Scene3DObject.\n */\nexport function boardToScene(board: SerializedBoard3D): Scene3D {\n const scene = new Scene3D();\n for (const el of board.elements) {\n if (el.type === 'point3d') {\n const constraint: Constraint = el.constraint ?? {\n kind: 'free',\n x: Number(el.parents[0] ?? 0),\n y: Number(el.parents[1] ?? 0),\n z: Number(el.parents[2] ?? 0),\n };\n const color = (el.attributes['color'] as string | undefined);\n const visible = el.attributes['visible'] !== false;\n try {\n scene.insert({\n kind: 'point',\n id: el.id,\n label: el.label ?? el.id,\n visible,\n color,\n constraint,\n });\n } catch {\n // Skip duplicates / malformed.\n }\n continue;\n }\n // Derived object — only v2 carries `sceneSpec`\n const sceneKind = el.attributes['sceneKind'] as string | undefined;\n const sceneSpec = el.attributes['sceneSpec'] as Record<string, unknown> | undefined;\n if (!sceneKind || !sceneSpec) continue;\n const color = el.attributes['color'] as string | undefined;\n const visible = el.attributes['visible'] !== false;\n const obj = {\n id: el.id,\n label: el.label ?? el.id,\n visible,\n color,\n kind: sceneKind,\n ...sceneSpec,\n } as unknown as Scene3DObject;\n try {\n scene.insert(obj);\n } catch {\n // Skip malformed entries / duplicates.\n }\n }\n return scene;\n}\n","'use client';\nimport * as React from 'react';\nimport { Scene3D, type SceneSnapshot } from './scene/Scene3D';\nimport { ToolController } from './tools/controller';\nimport { JxgRenderer } from './renderer/JxgRenderer';\nimport { hitTest } from './hitTest/hitTest';\nimport { screenToRay } from './hitTest/rayCast';\nimport { rayPlane } from './hitTest/intersect';\nimport { constraintToWorld } from './scene/constraintMath';\nimport { hitToConstraint } from './tools/handlers/_ensurePoint';\nimport type { Constraint, Vec3 } from './scene/types';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport { StatusHint } from './StatusHint';\nimport type { ToolKey } from './tools/spec';\nimport type { SerializedBoard3D } from '../serialize';\nimport { sceneToBoard, boardToScene } from './scene/persistence';\n\nexport interface EditorPanelProps {\n isDark?: boolean;\n initialState?: SerializedBoard3D | null;\n onInsert?: (board: SerializedBoard3D, svgWidth: number, svgHeight: number, svgString: string) => void;\n /** Scene created by host (so LeftPanel sibling can share it). */\n scene: Scene3D;\n /** Currently selected tool — controlled by host. */\n selectedTool: ToolKey;\n /** Host gets notified when the controller switches the active tool. */\n onSelectedToolChange: (k: ToolKey) => void;\n showAxis: boolean;\n showGrid: boolean;\n onReadyChange?: (ready: boolean) => void;\n /** Notifies the host when undo/redo availability changes (for wiring buttons). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n}\n\nexport interface EditorPanelHandle {\n hasContent: () => boolean;\n /** Returns the current scene as a SerializedBoard3D. */\n serialize: () => SerializedBoard3D;\n /** Select a tool by key (for chord shortcut / host control). */\n setTool: (k: ToolKey) => void;\n /** Trigger an undo on the scene's history stack. */\n undo: () => void;\n /** Trigger a redo on the scene's history stack. */\n redo: () => void;\n}\n\nexport const EditorPanel = React.forwardRef<EditorPanelHandle, EditorPanelProps>(\n function EditorPanel(props, ref) {\n const {\n isDark: isDarkProp,\n initialState,\n scene,\n selectedTool,\n onSelectedToolChange,\n showAxis,\n showGrid,\n onReadyChange,\n onHistoryChange,\n } = props;\n const isDark = isDarkProp ?? false;\n const controllerRef = React.useRef<ToolController | null>(null);\n if (!controllerRef.current) controllerRef.current = new ToolController(scene);\n\n const [hint, setHint] = React.useState<string>('Chọn công cụ trong bảng bên trái');\n const [hoverLabel, setHoverLabel] = React.useState<string | null>(null);\n\n const boardRef = React.useRef<MiniBoard3DHandle | null>(null);\n const rendererRef = React.useRef<JxgRenderer | null>(null);\n\n const onSelectedToolChangeRef = React.useRef(onSelectedToolChange);\n onSelectedToolChangeRef.current = onSelectedToolChange;\n\n const onHistoryChangeRef = React.useRef(onHistoryChange);\n onHistoryChangeRef.current = onHistoryChange;\n\n // Latest selectedTool — read inside drag callbacks to avoid stale closures.\n const selectedToolRef = React.useRef(selectedTool);\n selectedToolRef.current = selectedTool;\n\n // Point-drag state: which point is being dragged, starting screen + world,\n // plus a scene snapshot captured before any mutation (used for undo\n // checkpoints on drag-end).\n const draggedPointRef = React.useRef<string | null>(null);\n const dragStartRef = React.useRef<{ screen: { x: number; y: number }; world: Vec3 } | null>(null);\n const dragSnapshotRef = React.useRef<SceneSnapshot | null>(null);\n\n // Initial state load — wrap in withoutHistory so loading doesn't pollute\n // the undo stack with phantom \"insert\" entries.\n React.useEffect(() => {\n if (initialState) {\n const loaded = boardToScene(initialState);\n scene.withoutHistory(() => {\n scene.reset();\n for (const obj of loaded.list()) {\n scene.insert(obj);\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Subscribe to controller state changes for hint + selected-tool updates.\n React.useEffect(() => {\n const ctrl = controllerRef.current!;\n const unsub = ctrl.on((state) => {\n setHint(state.hint);\n onSelectedToolChangeRef.current(state.tool?.key ?? 'move');\n });\n return unsub;\n }, []);\n\n // Subscribe to history changes — propagate canUndo/canRedo upward.\n React.useEffect(() => {\n // Emit initial state once for the host's UI.\n onHistoryChangeRef.current?.(scene.canUndo(), scene.canRedo());\n const unsub = scene.onHistoryChange(() => {\n onHistoryChangeRef.current?.(scene.canUndo(), scene.canRedo());\n });\n return unsub;\n }, [scene]);\n\n // Sync controller when host changes selectedTool from outside (e.g. chord shortcut).\n React.useEffect(() => {\n controllerRef.current?.selectTool(selectedTool);\n }, [selectedTool]);\n\n // Global keyboard shortcuts: Ctrl/Cmd+Z, Ctrl/Cmd+Shift+Z, Ctrl+Y.\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n if (inField) return;\n if (!(e.metaKey || e.ctrlKey)) return;\n const key = e.key.toLowerCase();\n if (key === 'z' && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n scene.undo();\n } else if ((key === 'z' && e.shiftKey) || (key === 'y' && !e.shiftKey)) {\n e.preventDefault();\n e.stopPropagation();\n scene.redo();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [scene]);\n\n // Dispose renderer on unmount.\n React.useEffect(() => {\n return () => {\n rendererRef.current?.dispose();\n rendererRef.current = null;\n };\n }, []);\n\n // Apply showAxis / showGrid to the JSXGraph view3d when it (or the state) changes.\n React.useEffect(() => {\n const view = boardRef.current?.getView3D();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n if (!v || typeof v.setAttribute !== 'function') return;\n try {\n v.setAttribute({\n xAxis: { visible: showAxis },\n yAxis: { visible: showAxis },\n zAxis: { visible: showAxis },\n // GeoGebra-style: only the XY ground plane is shown; side walls stay hidden.\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: showGrid, mesh3d: { visible: false } },\n });\n v.board?.update?.();\n } catch {\n /* swallow — older JSXGraph / mocks may not support runtime attr changes */\n }\n }, [showAxis, showGrid]);\n\n const handleView3DReady = React.useCallback((view: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rendererRef.current = new JxgRenderer(scene, view as any);\n onReadyChange?.(true);\n }, [onReadyChange, scene]);\n\n const handleClick = React.useCallback((screen: { x: number; y: number }) => {\n const board = boardRef.current;\n if (!board) return;\n const view = board.getView3D();\n if (!view) return;\n try {\n const hit = hitTest(screen, view, scene);\n controllerRef.current!.consumeHit(hit);\n } catch {\n /* swallow — view may not yet expose project3DTo2D in some mock paths */\n }\n }, [scene]);\n\n const handleMove = React.useCallback((screen: { x: number; y: number }) => {\n const board = boardRef.current;\n if (!board) return;\n const view = board.getView3D();\n if (!view) return;\n // Suppress hover label updates while a drag is in progress.\n if (draggedPointRef.current) return;\n let hit;\n try {\n hit = hitTest(screen, view, scene);\n } catch {\n setHoverLabel(null);\n return;\n }\n if (hit.kind === 'empty') setHoverLabel(null);\n else if (hit.kind === 'existingPoint') {\n const obj = scene.get(hit.pointId);\n setHoverLabel(obj?.label ?? null);\n } else if (hit.kind === 'onGround') setHoverLabel('mặt nền');\n else if (hit.kind === 'onAxis') setHoverLabel(`trục ${hit.axis.toUpperCase()}`);\n else if (hit.kind === 'onPlane') setHoverLabel(`mặt phẳng ${hit.planeId}`);\n else if (hit.kind === 'onSphere') setHoverLabel(`mặt cầu ${hit.sphereId}`);\n else setHoverLabel(null);\n }, [scene]);\n\n // ─── Point-drag handlers (delegated from MiniBoard3D) ────────────────────\n // Decides whether the pointerdown gesture is \"ours\" (drag/place a point)\n // or should fall through to MiniBoard3D's default view-rotate behaviour.\n // Returning true also suppresses view rotation for the rest of the gesture.\n // Captures a scene snapshot before any mutation so onPointerDragEnd can\n // push a single undo checkpoint for the whole gesture.\n const shouldStartPointDrag = React.useCallback((screen: { x: number; y: number }): boolean => {\n const view = boardRef.current?.getView3D();\n if (!view) return false;\n const tool = selectedToolRef.current;\n if (tool !== 'point' && tool !== 'move') return false;\n let hit;\n try { hit = hitTest(screen, view, scene); } catch { return false; }\n\n // Existing point: drag it (Z-only in Point mode, XY-raycast in Move mode).\n // Snapshot before any mutation, drag-end will push a checkpoint.\n if (hit.kind === 'existingPoint') {\n const pt = scene.get(hit.pointId);\n if (!pt || pt.kind !== 'point') return false;\n dragSnapshotRef.current = scene.snapshot();\n draggedPointRef.current = hit.pointId;\n dragStartRef.current = {\n screen,\n world: constraintToWorld(pt.constraint, scene),\n };\n return true;\n }\n\n // Point tool: place-and-lift gesture. Capture snapshot first, then\n // create the point inside withoutHistory so only the drag-end checkpoint\n // ends up on the undo stack (otherwise addPoint would push an extra one).\n // Bypasses the controller (Point tool has repeatAfterBuild so there's no\n // collected-state to unwind); the click→consumeHit→buildPoint path is\n // short-circuited in MiniBoard3D.handlePointerUp when pointDragMode is set.\n if (tool === 'point' && (hit.kind === 'onGround' || hit.kind === 'onAxis')) {\n dragSnapshotRef.current = scene.snapshot();\n const constraint = hitToConstraint(hit);\n if (!constraint) {\n dragSnapshotRef.current = null;\n return false;\n }\n let id: string | null = null;\n scene.withoutHistory(() => {\n id = scene.addPoint(constraint);\n });\n if (!id) {\n dragSnapshotRef.current = null;\n return false;\n }\n draggedPointRef.current = id;\n dragStartRef.current = {\n screen,\n world: [hit.world[0], hit.world[1], hit.world[2]],\n };\n return true;\n }\n\n // Point tool but non-placeable surface (sphere/plane/empty): suppress\n // view rotation so the camera never rotates accidentally while the user\n // is placing points, but don't enter a drag. Clear snapshot defensively.\n if (tool === 'point') {\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n return true;\n }\n\n return false;\n }, [scene]);\n\n const onPointerDrag = React.useCallback((screen: { x: number; y: number }) => {\n const pointId = draggedPointRef.current;\n const start = dragStartRef.current;\n if (!pointId || !start) return;\n const view = boardRef.current?.getView3D();\n if (!view) return;\n const tool = selectedToolRef.current;\n let nextWorld: Vec3;\n if (tool === 'point') {\n // Vertical lift only: keep starting X,Y; map screen-Y delta to world Z\n // 1:1 in user-space (pixelToUser already inverts Y).\n const dz = screen.y - start.screen.y;\n nextWorld = [start.world[0], start.world[1], start.world[2] + dz];\n } else if (tool === 'move') {\n // Free move on the horizontal plane at the point's starting Z.\n try {\n const ray = screenToRay(screen, view);\n const hit = rayPlane(ray, { point: [0, 0, start.world[2]], normal: [0, 0, 1] });\n if (!hit) return;\n nextWorld = [hit.point[0], hit.point[1], start.world[2]];\n } catch { return; }\n } else {\n return;\n }\n const obj = scene.get(pointId);\n if (!obj || obj.kind !== 'point') return;\n const free: Constraint = { kind: 'free', x: nextWorld[0], y: nextWorld[1], z: nextWorld[2] };\n (obj as { constraint: Constraint }).constraint = free;\n scene.emitChange(pointId);\n }, [scene]);\n\n const onPointerDragEnd = React.useCallback(() => {\n const snap = dragSnapshotRef.current;\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n if (snap) {\n scene.pushUndoCheckpoint(snap);\n }\n }, [scene]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n hasContent: () => scene.list().length > 0,\n serialize: () => {\n const view = boardRef.current?.getView3D();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n const azSlider = v?.az_slide ?? v?.az;\n const elSlider = v?.el_slide ?? v?.el;\n const azimuth = typeof azSlider?.Value === 'function' ? azSlider.Value() : 0;\n const elevation = typeof elSlider?.Value === 'function' ? elSlider.Value() : 0;\n return sceneToBoard(\n scene,\n { azimuth, elevation, bbox3D: [-5, -5, -5, 5, 5, 5] },\n [-6, -6, 6, 6],\n );\n },\n setTool: (k) => controllerRef.current!.selectTool(k),\n undo: () => scene.undo(),\n redo: () => scene.redo(),\n }),\n [scene],\n );\n\n return (\n <div\n data-testid=\"editor-panel-3d\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex h-full w-full min-w-0 flex-col overflow-hidden bg-white',\n ].join('')}\n >\n <div className=\"min-h-0 flex-1\">\n <MiniBoard3D\n ref={boardRef}\n isDark={isDark}\n onView3DReady={handleView3DReady}\n onPointerClick={handleClick}\n onPointerMove={handleMove}\n onPointerLeave={() => setHoverLabel(null)}\n shouldStartPointDrag={shouldStartPointDrag}\n onPointerDrag={onPointerDrag}\n onPointerDragEnd={onPointerDragEnd}\n />\n </div>\n <StatusHint hint={hint} hoverLabel={hoverLabel} />\n </div>\n );\n },\n);\n","'use client';\nimport * as React from 'react';\nimport type { ToolKey } from '../tools/spec';\n\nexport interface ToolButtonProps {\n toolKey: ToolKey;\n label: string;\n selected: boolean;\n onClick: (key: ToolKey) => void;\n icon?: React.ReactNode;\n /** Chord-mode positional digit (1..9) overlaid bottom-right. */\n chordNum?: number | null;\n /** Highlight ring when its parent group is the active chord group. */\n chordActiveGroup?: boolean;\n onMouseEnter?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n onMouseLeave?: () => void;\n}\n\nexport function ToolButton(props: ToolButtonProps): React.ReactElement {\n const {\n toolKey,\n label,\n selected,\n onClick,\n icon,\n chordNum,\n chordActiveGroup,\n onMouseEnter,\n onMouseLeave,\n } = props;\n return (\n <button\n type=\"button\"\n data-tool-key={toolKey}\n data-testid={`tool-${toolKey}`}\n aria-label={label}\n aria-pressed={selected}\n onClick={() => onClick(toolKey)}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n className={[\n 'relative flex aspect-square items-center justify-center rounded-md transition',\n selected\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n <span aria-hidden className=\"inline-flex\">\n {icon ?? null}\n </span>\n {chordNum != null && (\n <span\n data-testid={`chord-num-${toolKey}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n selected\n ? 'text-white/70'\n : chordActiveGroup\n ? 'text-emerald-700'\n : 'text-slate-300',\n ].join(' ')}\n >\n {chordNum}\n </span>\n )}\n </button>\n );\n}\n","import * as React from 'react';\nimport type { ToolKey } from '../tools/spec';\n\nconst wrap = (children: React.ReactNode): React.ReactElement => (\n <svg\n width=\"18\"\n height=\"18\"\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 {children}\n </svg>\n);\n\nconst dot = (cx: number, cy: number, r = 1.4): React.ReactElement => (\n <circle cx={cx} cy={cy} r={r} fill=\"currentColor\" stroke=\"none\" />\n);\n\nexport const ToolIcons: Record<ToolKey, React.ReactElement> = {\n move: wrap(\n <>\n <path d=\"M5 4 L5 14 L8 11 L10 16 L13 15 L11 10 L15 10 Z\" />\n </>,\n ),\n point: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n pointOnObject: wrap(\n <>\n <path d=\"M3 16 L21 12\" />\n <circle cx=\"12\" cy=\"13.5\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n segment: wrap(\n <>\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"6\" />\n {dot(4, 18, 1.6)}\n {dot(20, 6, 1.6)}\n </>,\n ),\n line: wrap(\n <>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"6\" />\n {dot(8, 14.5, 1.4)}\n {dot(16, 9.5, 1.4)}\n </>,\n ),\n ray: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"7\" />\n <path d=\"M19 7 L15 6 M19 7 L18 11\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n vector: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"18\" y2=\"7\" />\n <path d=\"M18 7 L13 7 M18 7 L18 12\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n polygon: wrap(\n <>\n <polygon points=\"12,4 20,10 17,19 7,19 4,10\" />\n </>,\n ),\n plane: wrap(\n <>\n <polygon points=\"3,9 14,5 21,11 10,15\" />\n </>,\n ),\n pyramid: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 4 Z\" />\n <path d=\"M4 19 L12 16 L20 19\" />\n <path d=\"M12 4 L12 16\" strokeDasharray=\"2 2\" />\n </>,\n ),\n prism: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n <path d=\"M4 8 L14 8\" />\n </>,\n ),\n tetrahedron: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 5 Z\" />\n <path d=\"M4 19 L15 12 L20 19\" />\n <path d=\"M15 12 L12 5\" />\n </>,\n ),\n cube: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n </>,\n ),\n sphere: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"3\" />\n {dot(12, 12, 1.2)}\n </>,\n ),\n cylinder: wrap(\n <>\n <ellipse cx=\"12\" cy=\"6\" rx=\"6\" ry=\"2\" />\n <path d=\"M6 6 L6 18\" />\n <path d=\"M18 6 L18 18\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"6\" ry=\"2\" />\n </>,\n ),\n cone: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <line x1=\"19\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"7\" ry=\"2\" />\n </>,\n ),\n};\n","import { TOOLS, type ToolKey, type ToolSpec } from '../tools/spec';\n\nexport type Geom3DGroup =\n | 'basic'\n | 'point'\n | 'line'\n | 'plane'\n | 'polyhedron'\n | 'curve';\n\nexport const GROUP_ORDER: Geom3DGroup[] = [\n 'basic',\n 'point',\n 'line',\n 'plane',\n 'polyhedron',\n 'curve',\n];\n\nexport const GROUP_LABELS: Record<Geom3DGroup, string> = {\n basic: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường thẳng',\n plane: 'Mặt phẳng',\n polyhedron: 'Khối đa diện',\n curve: 'Khối cong',\n};\n\nexport const TOOLS_BY_GROUP: Record<Geom3DGroup, ToolKey[]> = {\n basic: ['move'],\n point: ['point', 'pointOnObject'],\n line: ['segment', 'line', 'ray', 'vector', 'polygon'],\n plane: ['plane'],\n polyhedron: ['pyramid', 'prism', 'tetrahedron', 'cube'],\n curve: ['sphere', 'cylinder', 'cone'],\n};\n\nexport interface Geom3DToolEntry {\n key: ToolKey;\n label: string;\n hint: string;\n group: Geom3DGroup;\n}\n\nconst SPEC_BY_KEY: Record<ToolKey, ToolSpec> = TOOLS.reduce(\n (acc, t) => {\n acc[t.key] = t;\n return acc;\n },\n {} as Record<ToolKey, ToolSpec>,\n);\n\nexport const TOOLS_FLAT: Geom3DToolEntry[] = GROUP_ORDER.flatMap((group) =>\n TOOLS_BY_GROUP[group].map((key) => {\n const spec = SPEC_BY_KEY[key];\n return {\n key,\n label: spec?.label ?? key,\n hint: spec?.hintIdle ?? '',\n group,\n };\n }),\n);\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: Geom3DGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n","'use client';\nimport * as React from 'react';\nimport { ToolButton } from './ToolButton';\nimport { ToolIcons } from './icons';\nimport {\n GROUP_LABELS,\n GROUP_ORDER,\n TOOLS_BY_GROUP,\n letterForGroup,\n type Geom3DGroup,\n} from './groups';\nimport { TOOLS, type ToolKey } from '../tools/spec';\n\nexport interface ToolPaletteProps {\n selected: ToolKey;\n onSelect: (key: ToolKey) => void;\n chordGroup?: Geom3DGroup | null;\n onHoverTool?: (info: { label: string; hint?: string; x: number; y: number } | null) => void;\n}\n\nexport function ToolPalette(props: ToolPaletteProps): React.ReactElement {\n const { selected, onSelect, chordGroup = null, onHoverTool } = props;\n return (\n <div data-testid=\"tool-palette\" className=\"flex flex-col gap-3\">\n {GROUP_ORDER.map((group) => {\n const keys = TOOLS_BY_GROUP[group];\n const isChordActive = chordGroup === group;\n const dimmed = chordGroup !== null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive\n ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1'\n : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{GROUP_LABELS[group]}</span>\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {letterForGroup(group)}\n </span>\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {keys.map((k, i) => {\n const tool = TOOLS.find((t) => t.key === k)!;\n return (\n <ToolButton\n key={k}\n toolKey={k}\n label={tool.label}\n selected={selected === k}\n onClick={onSelect}\n icon={ToolIcons[k]}\n chordNum={i + 1}\n chordActiveGroup={isChordActive}\n onMouseEnter={(e) =>\n onHoverTool?.({\n label: tool.label,\n hint: tool.hintIdle,\n x: e.clientX,\n y: e.clientY,\n })\n }\n onMouseLeave={() => onHoverTool?.(null)}\n />\n );\n })}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import type { Scene3DObject } from '../scene/types';\nimport type { Scene3D } from '../scene/Scene3D';\nimport { constraintToWorld } from '../scene/constraintMath';\n\nexport function symbolicFor(obj: Scene3DObject, scene: Scene3D): string {\n const n = (id: string): string => scene.get(id)?.label ?? id;\n switch (obj.kind) {\n case 'point': {\n const c = obj.constraint;\n switch (c.kind) {\n case 'free': return 'Point';\n case 'onGround': return 'Point(xyPlane)';\n case 'onAxis': return `Point(${c.axis}Axis)`;\n case 'onPlane': return `Point(${n(c.planeId)})`;\n case 'onLine': return `Point(${n(c.lineId)})`;\n case 'onPolygon': return `Point(${n(c.polygonId)})`;\n case 'onSphere': return `Point(${n(c.sphereId)})`;\n }\n return 'Point';\n }\n case 'segment': return `Segment(${n(obj.p1)}, ${n(obj.p2)})`;\n case 'line': return `Line(${n(obj.p1)}, ${n(obj.p2)})`;\n case 'ray': return `Ray(${n(obj.origin)}, ${n(obj.through)})`;\n case 'vector': return `Vector(${n(obj.from)}, ${n(obj.to)})`;\n case 'polygon': return `Polygon(${obj.vertices.map(n).join(', ')})`;\n case 'plane': return `Plane(${n(obj.p1)}, ${n(obj.p2)}, ${n(obj.p3)})`;\n case 'sphere': return `Sphere(${n(obj.center)}, ${n(obj.surfacePoint)})`;\n case 'polyhedron': {\n const flavorVn: Record<typeof obj.flavor, string> = {\n pyramid: 'Chóp', prism: 'Lăng trụ', tetrahedron: 'Tứ diện', cube: 'Lập phương',\n };\n return `${flavorVn[obj.flavor]}(${obj.vertices.length} đỉnh)`;\n }\n case 'cylinder': return `Cylinder(${n(obj.baseCenter)}, ${n(obj.topCenter)}, r=${obj.radius})`;\n case 'cone': return `Cone(${n(obj.baseCenter)}, ${n(obj.apex)}, r=${obj.radius})`;\n }\n}\n\n/**\n * Compact numeric value display for an object. Free / surface-projected points\n * show their world position; non-points show a summary.\n */\nexport function numericFor(obj: Scene3DObject, scene: Scene3D): string {\n if (obj.kind === 'point') {\n const w = constraintToWorld(obj.constraint, scene);\n return `(${round(w[0])}, ${round(w[1])}, ${round(w[2])})`;\n }\n return '';\n}\n\nfunction round(x: number): string {\n return Math.abs(x) < 1e-9 ? '0' : (Math.round(x * 100) / 100).toString();\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface RowMenuProps {\n onRename: () => void;\n onChangeColor: () => void;\n onToggleVisibility: () => void;\n onDelete: () => void;\n visible: boolean;\n}\n\nexport function RowMenu(props: RowMenuProps): React.ReactElement {\n const [open, setOpen] = React.useState(false);\n return (\n <div className=\"relative inline-block\">\n <button\n type=\"button\"\n aria-label=\"Row menu\"\n onClick={() => setOpen((v) => !v)}\n className=\"rounded px-1.5 text-zinc-500 hover:bg-zinc-100 dark:hover:bg-zinc-800\"\n >\n ⋮\n </button>\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-10 mt-1 w-40 rounded-md border border-zinc-200 bg-white py-1 text-xs shadow-lg dark:border-zinc-700 dark:bg-zinc-900\"\n >\n <MenuItem onClick={() => { setOpen(false); props.onRename(); }}>Đổi tên</MenuItem>\n <MenuItem onClick={() => { setOpen(false); props.onChangeColor(); }}>Đổi màu</MenuItem>\n <MenuItem onClick={() => { setOpen(false); props.onToggleVisibility(); }}>\n {props.visible ? 'Ẩn' : 'Hiện'}\n </MenuItem>\n <MenuItem onClick={() => { setOpen(false); props.onDelete(); }} className=\"text-red-600\">\n Xoá\n </MenuItem>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MenuItem({ children, onClick, className }: React.PropsWithChildren<{ onClick: () => void; className?: string }>) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={onClick}\n className={`block w-full px-3 py-1 text-left hover:bg-zinc-100 dark:hover:bg-zinc-800 ${className ?? ''}`}\n >\n {children}\n </button>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Scene3DObject } from '../scene/types';\nimport type { Scene3D } from '../scene/Scene3D';\nimport { symbolicFor, numericFor } from './symbolic';\nimport { RowMenu } from './RowMenu';\n\nexport interface AlgebraRowProps {\n obj: Scene3DObject;\n scene: Scene3D;\n onDelete: (id: string) => void;\n}\n\nexport function AlgebraRow(props: AlgebraRowProps): React.ReactElement {\n const { obj, scene, onDelete } = props;\n const symbolic = symbolicFor(obj, scene);\n const numeric = numericFor(obj, scene);\n return (\n <li\n data-testid={`algebra-row-${obj.id}`}\n className=\"flex items-center gap-2 border-b border-zinc-100 px-3 py-1.5 text-xs dark:border-zinc-800\"\n >\n <span\n aria-hidden\n className=\"inline-block size-3 rounded-full border\"\n style={{ backgroundColor: obj.color ?? '#0066cc' }}\n />\n <span className=\"min-w-[3ch] font-semibold\">{obj.label}</span>\n <span className=\"text-zinc-500\">=</span>\n <span className=\"flex-1 truncate font-mono\">{symbolic}</span>\n {numeric ? <span className=\"truncate text-zinc-500\">{numeric}</span> : null}\n <RowMenu\n visible={obj.visible}\n onRename={() => { /* no-op for now; wired in EditorPanel later */ }}\n onChangeColor={() => { /* no-op */ }}\n onToggleVisibility={() => { /* no-op */ }}\n onDelete={() => onDelete(obj.id)}\n />\n </li>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Scene3D } from '../scene/Scene3D';\nimport type { Scene3DObject } from '../scene/types';\nimport { AlgebraRow } from './AlgebraRow';\n\nexport interface AlgebraListProps {\n scene: Scene3D;\n}\n\nexport function AlgebraList(props: AlgebraListProps): React.ReactElement {\n const { scene } = props;\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\n\n React.useEffect(() => {\n const unsubAdd = scene.on('add', () => forceUpdate());\n const unsubChange = scene.on('change', () => forceUpdate());\n const unsubDelete = scene.on('delete', () => forceUpdate());\n const unsubReset = scene.on('reset', () => forceUpdate());\n return () => { unsubAdd(); unsubChange(); unsubDelete(); unsubReset(); };\n }, [scene]);\n\n const objects: Scene3DObject[] = scene.list();\n\n return (\n <ul\n data-testid=\"algebra-list\"\n className=\"flex max-h-[calc(100vh-200px)] flex-col overflow-y-auto\"\n >\n {objects.length === 0 ? (\n <li className=\"px-3 py-4 text-center text-xs text-zinc-500\">Chưa có đối tượng nào</li>\n ) : (\n objects.map((o) => (\n <AlgebraRow key={o.id} obj={o} scene={scene} onDelete={(id) => scene.delete(id)} />\n ))\n )}\n </ul>\n );\n}\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-6 w-6 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ToolPalette } from './toolPanel/ToolPalette';\nimport { AlgebraList } from './algebraPanel/AlgebraList';\nimport { ToolIcons } from './toolPanel/icons';\nimport {\n GROUP_LABELS,\n GROUP_ORDER,\n TOOLS_BY_GROUP,\n letterForGroup,\n type Geom3DGroup,\n} from './toolPanel/groups';\nimport type { Scene3D } from './scene/Scene3D';\nimport { TOOLS, type ToolKey } from './tools/spec';\nimport {\n MobileToolDrawer,\n type MobileToolGroup,\n} from '../../shared/MobileToolDrawer';\n\nconst TOOLTIP_DELAY_MS = 400;\n\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\nexport interface LeftPanelProps {\n scene: Scene3D;\n selectedTool: ToolKey;\n onSelectTool: (k: ToolKey) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n onClose: () => void;\n isDark?: boolean;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n chordGroup?: Geom3DGroup | null;\n}\n\nconst Geom3DIconHeader = (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nfunction AxisIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <line x1=\"4\" y1=\"20\" x2=\"16\" y2=\"8\" />\n </svg>\n );\n}\n\nfunction GridIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 8 L20 4\" />\n <path d=\"M4 14 L20 10\" />\n <path d=\"M4 20 L20 16\" />\n <path d=\"M4 8 L4 20\" />\n <path d=\"M12 6 L12 18\" />\n <path d=\"M20 4 L20 16\" />\n </svg>\n );\n}\n\nexport function UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nexport function RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\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\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=\"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-3\">{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\nfunction useToolHoverTooltip() {\n const [hover, setHover] = React.useState<HoverState>(null);\n const [portalReady, setPortalReady] = React.useState(false);\n const hoverTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n React.useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = React.useCallback((next: NonNullable<HoverState>) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => setHover(next), TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = React.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\ntype Tab = 'tools' | 'algebra';\n\nfunction DesktopPanel(props: LeftPanelProps) {\n const {\n scene,\n selectedTool,\n onSelectTool,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onRedo,\n canRedo,\n onClose,\n isDark,\n chordGroup,\n } = props;\n const [tab, setTab] = React.useState<Tab>('tools');\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n return (\n <>\n <Shell title=\"Hình học 3D\" icon={Geom3DIconHeader} onClose={onClose} isDark={isDark}>\n <div className=\"flex gap-1 rounded-md bg-slate-100 p-0.5\">\n <TabPill active={tab === 'tools'} onClick={() => setTab('tools')} testId=\"tab-tools\">\n 🧰 Công cụ\n </TabPill>\n <TabPill active={tab === 'algebra'} onClick={() => setTab('algebra')} testId=\"tab-algebra\">\n 📐 Đối tượng\n </TabPill>\n </div>\n\n {tab === 'tools' ? (\n <>\n <Section label=\"Góc nhìn\">\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\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 <div className=\"ml-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n </div>\n </Section>\n\n <ToolPalette\n selected={selectedTool}\n onSelect={onSelectTool}\n chordGroup={chordGroup ?? null}\n onHoverTool={(info) => (info ? showHover(info) : hideHover())}\n />\n\n {chordGroup && (\n <div\n data-testid=\"chord-hint\"\n className=\"rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {letterForGroup(chordGroup)}\n </span>\n <span className=\"ml-1.5\">\n → {GROUP_LABELS[chordGroup]}. Bấm số 1-9 để chọn công cụ, Esc huỷ.\n </span>\n </div>\n )}\n </>\n ) : (\n <section data-testid=\"algebra-panel\">\n <AlgebraList scene={scene} />\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\nfunction TabPill({\n active,\n onClick,\n testId,\n children,\n}: React.PropsWithChildren<{ active: boolean; onClick: () => void; testId?: string }>) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n data-testid={testId}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n active\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nfunction MobilePanel(props: LeftPanelProps) {\n const {\n selectedTool,\n onSelectTool,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onRedo,\n canRedo,\n isDark,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = React.useMemo<MobileToolGroup<ToolKey, Geom3DGroup>[]>(\n () =>\n GROUP_ORDER.map((group) => {\n const keys = TOOLS_BY_GROUP[group];\n return {\n group,\n groupLabel: GROUP_LABELS[group],\n tools: keys.map((k) => {\n const tool = TOOLS.find((t) => t.key === k)!;\n return { key: k, label: tool.label, icon: ToolIcons[k] };\n }),\n };\n }),\n [],\n );\n\n return (\n <MobileToolDrawer\n title=\"Hình học 3D\"\n headerIcon={Geom3DIconHeader}\n testId=\"left-panel\"\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={[\n {\n label: 'Trục',\n icon: <AxisIcon />,\n pressed: showAxis,\n onToggle: onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: 'Lưới',\n icon: <GridIcon />,\n pressed: showGrid,\n onToggle: onShowGridChange,\n testId: 'toggle-grid',\n },\n ]}\n actions={[\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: onUndo,\n disabled: !canUndo,\n testId: 'undo-btn',\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: onRedo,\n disabled: !canRedo,\n testId: 'redo-btn',\n },\n ]}\n groups={groups}\n activeTool={selectedTool}\n onToolSelect={onSelectTool}\n />\n );\n}\n\nexport function LeftPanel(props: LeftPanelProps): React.ReactElement {\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 type React from 'react';\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 } from './editor/LeftPanel';\nimport { Scene3D } from './editor/scene/Scene3D';\nimport { GROUP_ORDER, TOOLS_FLAT } from './editor/toolPanel/groups';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport {\n isGeometry3DCustomData,\n parseSerializedBoard3D,\n serializeBoard3D,\n type Geometry3DCustomData,\n type SerializedBoard3D,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport type { ToolKey } from './editor/tools/spec';\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 sceneRef = useRef<Scene3D | null>(null);\n if (!sceneRef.current) sceneRef.current = new Scene3D();\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [ready, setReady] = useState(false);\n\n const [selectedTool, setSelectedTool] = useState<ToolKey>('move');\n const [showAxis, setShowAxis] = useState<boolean>(true);\n const [showGrid, setShowGrid] = useState<boolean>(true);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n const handleUndo = useCallback(() => {\n editorRef.current?.undo();\n }, []);\n\n const handleRedo = useCallback(() => {\n editorRef.current?.redo();\n }, []);\n\n const initial = useMemo(\n () => parseInitial(editingElement),\n [editingElement],\n );\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS_FLAT,\n onSelect: (key) => {\n setSelectedTool(key as ToolKey);\n editorRef.current?.setTool(key as ToolKey);\n },\n enabled: !isMobile,\n });\n\n const handleSelectTool = useCallback((k: ToolKey) => {\n setSelectedTool(k);\n editorRef.current?.setTool(k);\n }, []);\n\n const performInsert = useCallback(\n async (board: SerializedBoard3D, width: number, height: number, svgString: string) => {\n if (!api) return;\n const jsonState = serializeBoard3D(board);\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 const tryInsert = useCallback((): boolean => {\n if (!editorRef.current) return false;\n if (!editorRef.current.hasContent()) return false;\n const board = editorRef.current.serialize();\n if (board.elements.length === 0) return false;\n void performInsert(board, 0, 0, '');\n return true;\n }, [performInsert]);\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [tryInsert],\n );\n\n const handleEditorInsert = useCallback(\n (board: SerializedBoard3D, width: number, height: number, svgString: string) => {\n void performInsert(board, width, height, svgString);\n },\n [performInsert],\n );\n\n const dialogStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: 'calc(50% + 120px)',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <>\n {!isMobile && (\n <LeftPanel\n scene={sceneRef.current}\n selectedTool={selectedTool}\n onSelectTool={handleSelectTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onShowAxisChange={setShowAxis}\n onShowGridChange={setShowGrid}\n onUndo={handleUndo}\n canUndo={canUndo}\n onRedo={handleRedo}\n canRedo={canRedo}\n onClose={onClose}\n isDark={isDark}\n chordGroup={chordGroup}\n />\n )}\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học 3D\"\n data-testid=\"geom3d-host\"\n data-stamp-area=\"true\"\n style={dialogStyle}\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-[800px] max-w-[calc(100vw-320px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={() => setDrawerOpen(true)}\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 9 L4 20 L14 20 L14 9 Z M4 9 L10 4 L20 4 L14 9 Z M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n Dựng hình học không gian\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={tryInsert}\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 <div className=\"min-h-0 flex-1\">\n <EditorPanel\n ref={editorRef}\n isDark={isDark}\n initialState={initial}\n onInsert={handleEditorInsert}\n scene={sceneRef.current}\n selectedTool={selectedTool}\n onSelectedToolChange={setSelectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onReadyChange={setReady}\n onHistoryChange={handleHistoryChange}\n />\n </div>\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={tryInsert}\n disabled={!ready}\n data-testid=\"geom3d-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n {isMobile && (\n <LeftPanel\n scene={sceneRef.current}\n selectedTool={selectedTool}\n onSelectTool={handleSelectTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onShowAxisChange={setShowAxis}\n onShowGridChange={setShowGrid}\n onUndo={handleUndo}\n canUndo={canUndo}\n onRedo={handleRedo}\n canRedo={canRedo}\n onClose={onClose}\n isDark={isDark}\n isMobile\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n chordGroup={chordGroup}\n />\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';\nimport { GROUND_PLANE_ATTRS, GROUND_PLANE_RANGE, VIEW3D_ATTRS } from './editor/theme';\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 baseAttrs = VIEW3D_ATTRS(false);\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 ...baseAttrs,\n az: { ...baseAttrs.az, value: state.view.azimuth },\n el: { ...baseAttrs.el, value: state.view.elevation },\n },\n );\n\n if (!state.showAxes) {\n (view as { defaultAxes?: unknown[] }).defaultAxes = [];\n }\n\n // XY ground plane through origin (matches editor's MiniBoard3D).\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => JxgObj }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(false),\n );\n } catch {\n /* swallow */\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"]}
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/render.ts","../src/stamps/geometry-3d/editor/tools/handlers/_ensurePoint.ts","../src/stamps/geometry-3d/editor/tools/handlers/point.ts","../src/stamps/geometry-3d/editor/tools/handlers/segment.ts","../src/stamps/geometry-3d/editor/tools/handlers/polygon.ts","../src/stamps/geometry-3d/editor/scene/constraintMath.ts","../src/stamps/geometry-3d/editor/scene/geometryChecks.ts","../src/stamps/geometry-3d/editor/tools/handlers/plane.ts","../src/stamps/geometry-3d/editor/tools/handlers/pyramid.ts","../src/stamps/geometry-3d/editor/tools/handlers/prism.ts","../src/stamps/geometry-3d/editor/tools/handlers/tetrahedron.ts","../src/stamps/geometry-3d/editor/tools/handlers/cube.ts","../src/stamps/geometry-3d/editor/tools/handlers/sphere.ts","../src/stamps/geometry-3d/editor/tools/handlers/cylinder.ts","../src/stamps/geometry-3d/editor/tools/handlers/cone.ts","../src/stamps/geometry-3d/editor/tools/spec.ts","../src/stamps/geometry-3d/editor/tools/controller.ts","../src/stamps/geometry-3d/editor/renderer/faceted.ts","../src/stamps/geometry-3d/editor/renderer/JxgRenderer.ts","../src/stamps/geometry-3d/editor/hitTest/rayCast.ts","../src/stamps/geometry-3d/editor/hitTest/intersect.ts","../src/stamps/geometry-3d/editor/hitTest/snapping.ts","../src/stamps/geometry-3d/editor/hitTest/hitTest.ts","../src/stamps/geometry-3d/editor/MiniBoard3D.tsx","../src/stamps/geometry-3d/editor/StatusHint.tsx","../src/stamps/geometry-3d/editor/scene/labels.ts","../src/stamps/geometry-3d/editor/scene/Scene3D.ts","../src/stamps/geometry-3d/editor/scene/persistence.ts","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/stamps/geometry-3d/editor/toolPanel/ToolButton.tsx","../src/stamps/geometry-3d/editor/toolPanel/icons.tsx","../src/stamps/geometry-3d/editor/toolPanel/groups.ts","../src/stamps/geometry-3d/editor/toolPanel/ToolPalette.tsx","../src/stamps/geometry-3d/editor/algebraPanel/symbolic.ts","../src/stamps/geometry-3d/editor/algebraPanel/RowMenu.tsx","../src/stamps/geometry-3d/editor/algebraPanel/AlgebraRow.tsx","../src/stamps/geometry-3d/editor/algebraPanel/AlgebraList.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"],"names":["paletteFor","init_theme","norm","dot","sub","add","scale","EPS","React","MiniBoard3D","p","jsx","jsxs","color","visible","React2","EditorPanel","Fragment","React3","React4","React5","createPortal","useState","useRef","useCallback","useEffect","A_CODE","forwardRef","Geometry3DStampHost","useMemo","useImperativeHandle","lazy"],"mappings":"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","file":"geometry-3d.js","sourcesContent":["import type { BaseStampCustomData } from '../shared/types';\nimport type { Constraint } from './editor/scene/types';\n\nexport interface Geometry3DCustomData extends BaseStampCustomData {\n kind: 'geometry3d';\n version: 1 | 2;\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 (\n d.kind === 'geometry3d' &&\n (d.version === 1 || d.version === 2) &&\n typeof d.jsonState === 'string'\n );\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 /** v2 only — present on point3d elements to encode the surface constraint. */\n constraint?: Constraint;\n}\n\nexport interface SerializedBoard3D {\n version: 1 | 2;\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 && p.version !== 2) {\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 const axisLabel = (color: string) => ({\n strokeColor: color,\n fontSize: 14,\n offset: [10, 0] as [number, number],\n });\n return {\n az: { slider: { visible: false }, point2: { visible: false } },\n el: { slider: { visible: false } },\n projection: 'central' as const,\n // GeoGebra-style: axes pass through origin (0,0,0) instead of bbox border.\n axesPosition: 'center' as const,\n xAxis: {\n strokeColor: p.axisX,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'x',\n withLabel: true,\n label: axisLabel(p.axisX),\n },\n yAxis: {\n strokeColor: p.axisY,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'y',\n withLabel: true,\n label: axisLabel(p.axisY),\n },\n zAxis: {\n strokeColor: p.axisZ,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'z',\n withLabel: true,\n label: axisLabel(p.axisZ),\n },\n // GeoGebra-style: hide ALL bbox wall planes; the XY ground plane is drawn\n // explicitly at z=0 via the helper below (so it coincides with Ox/Oy).\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: false, mesh3d: { visible: false } },\n };\n};\n\nexport const GROUND_PLANE_ATTRS = (isDark: boolean) => ({\n fillColor: isDark ? '#2a2a2a' : '#e6e6e6',\n fillOpacity: isDark ? 0.5 : 0.55,\n strokeColor: isDark ? '#3a3a3a' : '#cfcfcf',\n strokeOpacity: 0.7,\n strokeWidth: 1,\n fixed: true,\n highlight: false,\n withLabel: false,\n layer: 0,\n});\n\n/** XY ground plane extent (square around origin in user units). */\nexport const GROUND_PLANE_RANGE: [number, number] = [-3, 3];\n","\"use client\";\n\nimport { parseSerializedBoard3D } from './serialize';\nimport { GROUND_PLANE_ATTRS, GROUND_PLANE_RANGE, VIEW3D_ATTRS } from './editor/theme';\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 keepaspectratio: true,\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 baseAttrs = VIEW3D_ATTRS(false);\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 ...baseAttrs,\n // JSXGraph view3d đọc azimuth/elevation từ az.slider.start (không phải\n // az.value). Nếu pass `value` → JSXGraph bỏ qua → render rơi về default\n // (1.0 rad / 0.3 rad), không khớp góc user xoay trong editor.\n az: { ...baseAttrs.az, slider: { ...baseAttrs.az.slider, start: state.view.azimuth } },\n el: { ...baseAttrs.el, slider: { ...baseAttrs.el.slider, start: state.view.elevation } },\n },\n );\n\n // Defensive: setValue post-creation để chắc chắn slider khớp với serialized\n // angle, kể cả khi JSXGraph version khác xử lý `start` khác.\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n v?.az_slide?.setValue?.(state.view.azimuth);\n v?.el_slide?.setValue?.(state.view.elevation);\n v?.board?.update?.();\n } catch {\n /* swallow — older JSXGraph may not expose az_slide on view3d */\n }\n\n if (!state.showAxes) {\n (view as { defaultAxes?: unknown[] }).defaultAxes = [];\n }\n\n // XY ground plane through origin (matches editor's MiniBoard3D).\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => JxgObj }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(false),\n );\n } catch {\n /* swallow */\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","import type { Constraint } from '../../scene/types';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport type { SceneHit } from '../../hitTest/hitTest';\n\nexport function hitToConstraint(hit: SceneHit): Constraint | null {\n switch (hit.kind) {\n case 'onGround': return { kind: 'onGround', x: hit.world[0], y: hit.world[1] };\n case 'onAxis': return { kind: 'onAxis', axis: hit.axis, t: hit.t };\n case 'onPlane': return { kind: 'onPlane', planeId: hit.planeId, u: hit.u, v: hit.v };\n case 'onLine': return { kind: 'onLine', lineId: hit.lineId, t: hit.t };\n case 'onPolygon': return { kind: 'onPolygon', polygonId: hit.polygonId, u: hit.u, v: hit.v };\n case 'onSphere': return { kind: 'onSphere', sphereId: hit.sphereId, theta: hit.theta, phi: hit.phi };\n default: return null;\n }\n}\n\n/**\n * Given a SceneHit, return the id of an existing point (if hit is existingPoint),\n * or create a new constrained point on the hit surface and return its id.\n * Returns null for `empty` hits.\n */\nexport function ensurePoint(hit: SceneHit, scene: Scene3D): string | null {\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return scene.addPoint(c);\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { hitToConstraint } from './_ensurePoint';\n\nexport function buildPoint(args: CollectedArg[], scene: Scene3D): string | null {\n const hit = args[0]?.hit;\n if (!hit) return null;\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return scene.addPoint(c);\n}\n\nexport const buildPointOnObject = buildPoint; // identical semantics; step.allowNewOn is the only difference\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildSegment(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, scene);\n const p2 = ensurePoint(args[1].hit, scene);\n if (!p1 || !p2 || p1 === p2) return null;\n return scene.addObject('segment', { p1, p2 });\n}\n\nexport function buildLine(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, scene);\n const p2 = ensurePoint(args[1].hit, scene);\n if (!p1 || !p2 || p1 === p2) return null;\n return scene.addObject('line', { p1, p2 });\n}\n\nexport function buildRay(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const origin = ensurePoint(args[0].hit, scene);\n const through = ensurePoint(args[1].hit, scene);\n if (!origin || !through || origin === through) return null;\n return scene.addObject('ray', { origin, through });\n}\n\nexport function buildVector(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const from = ensurePoint(args[0].hit, scene);\n const to = ensurePoint(args[1].hit, scene);\n if (!from || !to || from === to) return null;\n return scene.addObject('vector', { from, to });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildPolygon(args: CollectedArg[], scene: Scene3D): string | null {\n // Drop the final closingPoint arg, keep all 'point'-step hits as vertices.\n const vertexArgs = args.filter((a) => a.step.type === 'point');\n const vertexIds = vertexArgs.map((a) => (a.hit ? ensurePoint(a.hit, scene) : null)).filter((x): x is string => !!x);\n if (vertexIds.length < 3) return null;\n return scene.addObject('polygon', { vertices: vertexIds });\n}\n","import type { Constraint, Vec3, Scene3DObject } from './types';\nimport type { Scene3D } from './Scene3D';\n\nfunction sub(a: Vec3, b: Vec3): Vec3 { return [a[0]-b[0], a[1]-b[1], a[2]-b[2]]; }\nfunction add(a: Vec3, b: Vec3): Vec3 { return [a[0]+b[0], a[1]+b[1], a[2]+b[2]]; }\nfunction scale(a: Vec3, k: number): Vec3 { return [a[0]*k, a[1]*k, a[2]*k]; }\nfunction dot(a: Vec3, b: Vec3): number { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; }\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]];\n}\nfunction norm(a: Vec3): number { return Math.sqrt(dot(a, a)); }\nfunction normalize(a: Vec3): Vec3 { const n = norm(a); return n === 0 ? a : scale(a, 1/n); }\n\nfunction getPointWorld(id: string, scene: Scene3D): Vec3 {\n const obj = scene.get(id);\n if (!obj || obj.kind !== 'point') {\n throw new Error(`constraintMath: point ${id} not found`);\n }\n return constraintToWorld(obj.constraint, scene);\n}\n\nfunction getPlaneBasis(planeObj: Extract<Scene3DObject, { kind: 'plane' }>, scene: Scene3D): {\n origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3;\n} {\n const p1 = getPointWorld(planeObj.p1, scene);\n const p2 = getPointWorld(planeObj.p2, scene);\n const p3 = getPointWorld(planeObj.p3, scene);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n return { origin: p1, basis1, basis2, normal };\n}\n\nexport function constraintToWorld(c: Constraint, scene: Scene3D): Vec3 {\n switch (c.kind) {\n case 'free': return [c.x, c.y, c.z];\n case 'onGround': return [c.x, c.y, 0];\n case 'onAxis': {\n if (c.axis === 'x') return [c.t, 0, 0];\n if (c.axis === 'y') return [0, c.t, 0];\n return [0, 0, c.t];\n }\n case 'onPlane': {\n const plane = scene.get(c.planeId);\n if (!plane || plane.kind !== 'plane') throw new Error('onPlane: plane missing');\n const { origin, basis1, basis2 } = getPlaneBasis(plane, scene);\n return add(add(origin, scale(basis1, c.u)), scale(basis2, c.v));\n }\n case 'onLine': {\n const line = scene.get(c.lineId);\n if (!line || (line.kind !== 'line' && line.kind !== 'segment' && line.kind !== 'ray')) {\n throw new Error('onLine: parent missing');\n }\n const p1Id = line.kind === 'ray' ? line.origin : line.p1;\n const p2Id = line.kind === 'ray' ? line.through : line.p2;\n const p1 = getPointWorld(p1Id, scene);\n const p2 = getPointWorld(p2Id, scene);\n const dir = sub(p2, p1);\n return add(p1, scale(dir, c.t));\n }\n case 'onPolygon': {\n const pg = scene.get(c.polygonId);\n if (!pg || pg.kind !== 'polygon') throw new Error('onPolygon: parent missing');\n const v = pg.vertices;\n if (v.length < 3) throw new Error('onPolygon: < 3 vertices');\n const p1 = getPointWorld(v[0], scene);\n const p2 = getPointWorld(v[1], scene);\n const p3 = getPointWorld(v[2], scene);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n return add(add(p1, scale(basis1, c.u)), scale(basis2, c.v));\n }\n case 'onSphere': {\n const sph = scene.get(c.sphereId);\n if (!sph || sph.kind !== 'sphere') throw new Error('onSphere: parent missing');\n const center = getPointWorld(sph.center, scene);\n const surface = getPointWorld(sph.surfacePoint, scene);\n const radius = norm(sub(surface, center));\n const x = center[0] + radius * Math.sin(c.phi) * Math.cos(c.theta);\n const y = center[1] + radius * Math.sin(c.phi) * Math.sin(c.theta);\n const z = center[2] + radius * Math.cos(c.phi);\n return [x, y, z];\n }\n }\n}\n\nexport function worldToConstraint(current: Constraint, world: Vec3, scene: Scene3D): Constraint {\n switch (current.kind) {\n case 'free': return { kind: 'free', x: world[0], y: world[1], z: world[2] };\n case 'onGround': return { kind: 'onGround', x: world[0], y: world[1] };\n case 'onAxis': {\n const t = current.axis === 'x' ? world[0] : current.axis === 'y' ? world[1] : world[2];\n return { kind: 'onAxis', axis: current.axis, t };\n }\n case 'onPlane': {\n const plane = scene.get(current.planeId);\n if (!plane || plane.kind !== 'plane') return current;\n const { origin, basis1, basis2 } = getPlaneBasis(plane, scene);\n const rel = sub(world, origin);\n const b1n = dot(basis1, basis1);\n const b2n = dot(basis2, basis2);\n const u = b1n === 0 ? 0 : dot(rel, basis1) / b1n;\n const v = b2n === 0 ? 0 : dot(rel, basis2) / b2n;\n return { kind: 'onPlane', planeId: current.planeId, u, v };\n }\n case 'onLine': {\n const line = scene.get(current.lineId);\n if (!line) return current;\n const p1Id = line.kind === 'ray' ? line.origin : (line as { p1: string }).p1;\n const p2Id = line.kind === 'ray' ? line.through : (line as { p2: string }).p2;\n const p1 = getPointWorld(p1Id, scene);\n const p2 = getPointWorld(p2Id, scene);\n const dir = sub(p2, p1);\n const len2 = dot(dir, dir);\n const t = len2 === 0 ? 0 : dot(sub(world, p1), dir) / len2;\n return { kind: 'onLine', lineId: current.lineId, t };\n }\n case 'onPolygon': {\n const pg = scene.get(current.polygonId);\n if (!pg || pg.kind !== 'polygon' || pg.vertices.length < 3) return current;\n const p1 = getPointWorld(pg.vertices[0], scene);\n const p2 = getPointWorld(pg.vertices[1], scene);\n const p3 = getPointWorld(pg.vertices[2], scene);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n const rel = sub(world, p1);\n const b1n = dot(basis1, basis1);\n const b2n = dot(basis2, basis2);\n const u = b1n === 0 ? 0 : dot(rel, basis1) / b1n;\n const v = b2n === 0 ? 0 : dot(rel, basis2) / b2n;\n return { kind: 'onPolygon', polygonId: current.polygonId, u, v };\n }\n case 'onSphere': {\n const sph = scene.get(current.sphereId);\n if (!sph || sph.kind !== 'sphere') return current;\n const center = getPointWorld(sph.center, scene);\n const rel = sub(world, center);\n const r = norm(rel);\n if (r === 0) return current;\n const phi = Math.acos(rel[2] / r);\n const theta = Math.atan2(rel[1], rel[0]);\n return { kind: 'onSphere', sphereId: current.sphereId, theta, phi };\n }\n }\n}\n","import type { Vec3 } from './types';\nimport type { Scene3D } from './Scene3D';\nimport { constraintToWorld } from './constraintMath';\n\nconst EPS = 1e-6;\n\nfunction getWorld(id: string, scene: Scene3D): Vec3 | null {\n const obj = scene.get(id);\n if (!obj || obj.kind !== 'point') return null;\n return constraintToWorld(obj.constraint, scene);\n}\n\nexport function areCollinear3(p1Id: string, p2Id: string, p3Id: string, scene: Scene3D): boolean {\n const p1 = getWorld(p1Id, scene);\n const p2 = getWorld(p2Id, scene);\n const p3 = getWorld(p3Id, scene);\n if (!p1 || !p2 || !p3) return true;\n const a: Vec3 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];\n const b: Vec3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];\n const c: Vec3 = [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]];\n return Math.hypot(c[0], c[1], c[2]) < EPS;\n}\n\nexport function apexCoplanarWithBase(baseIds: string[], apexId: string, scene: Scene3D): boolean {\n if (baseIds.length < 3) return false;\n const p1 = getWorld(baseIds[0], scene);\n const p2 = getWorld(baseIds[1], scene);\n const p3 = getWorld(baseIds[2], scene);\n const apex = getWorld(apexId, scene);\n if (!p1 || !p2 || !p3 || !apex) return false;\n const a: Vec3 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];\n const b: Vec3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];\n const n: Vec3 = [a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]];\n const d: Vec3 = [apex[0]-p1[0], apex[1]-p1[1], apex[2]-p1[2]];\n const dotND = n[0]*d[0] + n[1]*d[1] + n[2]*d[2];\n return Math.abs(dotND) < EPS;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { areCollinear3 } from '../../scene/geometryChecks';\n\nexport function buildPlane(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 3 || !args[0].hit || !args[1].hit || !args[2].hit) return null;\n const p1 = ensurePoint(args[0].hit, scene);\n const p2 = ensurePoint(args[1].hit, scene);\n const p3 = ensurePoint(args[2].hit, scene);\n if (!p1 || !p2 || !p3) return null;\n if (p1 === p2 || p2 === p3 || p1 === p3) return null;\n if (areCollinear3(p1, p2, p3, scene)) return null;\n return scene.addObject('plane', { p1, p2, p3 });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { apexCoplanarWithBase } from '../../scene/geometryChecks';\n\nexport function buildPyramid(args: CollectedArg[], scene: Scene3D): string | null {\n const pointArgs = args.filter((a) => a.step.type === 'point');\n const baseArgs = pointArgs.slice(0, -1); // last 'point' arg is the apex\n const apexArg = pointArgs.slice(-1)[0];\n if (baseArgs.length < 3 || !apexArg?.hit) return null;\n const baseIds = baseArgs.map((a) => (a.hit ? ensurePoint(a.hit, scene) : null)).filter((x): x is string => !!x);\n const apexId = ensurePoint(apexArg.hit, scene);\n if (!apexId || baseIds.length < 3) return null;\n if (apexCoplanarWithBase(baseIds, apexId, scene)) return null;\n const vertices = [...baseIds, apexId];\n const apexIdx = vertices.length - 1;\n const faces: number[][] = [baseIds.map((_, i) => i)];\n for (let i = 0; i < baseIds.length; i++) {\n faces.push([i, (i + 1) % baseIds.length, apexIdx]);\n }\n return scene.addObject('polyhedron', { flavor: 'pyramid', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\n\nexport function buildPrism(args: CollectedArg[], scene: Scene3D): string | null {\n const baseArgs = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (baseArgs.length < 3 || !numberArg || typeof numberArg.value !== 'number') return null;\n const height = numberArg.value;\n if (height <= 0) return null;\n const baseIds = baseArgs.map((a) => (a.hit ? ensurePoint(a.hit, scene) : null)).filter((x): x is string => !!x);\n if (baseIds.length < 3) return null;\n const topIds: string[] = [];\n for (const id of baseIds) {\n const p = scene.get(id);\n if (!p || p.kind !== 'point') return null;\n const w = constraintToWorld(p.constraint, scene);\n topIds.push(scene.addPoint({ kind: 'free', x: w[0], y: w[1], z: w[2] + height }));\n }\n const n = baseIds.length;\n const vertices = [...baseIds, ...topIds];\n const faces: number[][] = [\n baseIds.map((_, i) => i),\n topIds.map((_, i) => n + i),\n ];\n for (let i = 0; i < n; i++) {\n faces.push([i, (i + 1) % n, n + ((i + 1) % n), n + i]);\n }\n return scene.addObject('polyhedron', { flavor: 'prism', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\n\nexport function buildTetrahedron(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, scene);\n const p2Id = ensurePoint(args[1].hit, scene);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const p1Obj = scene.get(p1Id);\n const p2Obj = scene.get(p2Id);\n if (!p1Obj || p1Obj.kind !== 'point' || !p2Obj || p2Obj.kind !== 'point') return null;\n const p1 = constraintToWorld(p1Obj.constraint, scene);\n const p2 = constraintToWorld(p2Obj.constraint, scene);\n // Force base plane to z = min(p1.z, p2.z); project both points there.\n const z0 = Math.min(p1[2], p2[2]);\n const baseA: [number, number, number] = [p1[0], p1[1], z0];\n const baseB: [number, number, number] = [p2[0], p2[1], z0];\n const dx = baseB[0] - baseA[0];\n const dy = baseB[1] - baseA[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Third base vertex: rotate (baseB - baseA) by 60° in xy and add to baseA midpoint\n const mid: [number, number, number] = [(baseA[0]+baseB[0])/2, (baseA[1]+baseB[1])/2, z0];\n const perpX = -dy;\n const perpY = dx;\n const perpLen = Math.hypot(perpX, perpY);\n const height = edge * Math.sqrt(3) / 2;\n const baseC: [number, number, number] = [mid[0] + (perpX/perpLen)*height, mid[1] + (perpY/perpLen)*height, z0];\n // Apex: centroid + edge*sqrt(2/3)\n const centroid: [number, number, number] = [\n (baseA[0]+baseB[0]+baseC[0])/3,\n (baseA[1]+baseB[1]+baseC[1])/3,\n z0,\n ];\n const apexHeight = edge * Math.sqrt(2/3);\n const apex: [number, number, number] = [centroid[0], centroid[1], z0 + apexHeight];\n\n const cId = scene.addPoint({ kind: 'free', x: baseC[0], y: baseC[1], z: baseC[2] });\n const apexId = scene.addPoint({ kind: 'free', x: apex[0], y: apex[1], z: apex[2] });\n\n const vertices = [p1Id, p2Id, cId, apexId];\n const faces: number[][] = [\n [0, 1, 2], // base\n [0, 1, 3], // face p1-p2-apex\n [1, 2, 3], // face p2-c-apex\n [2, 0, 3], // face c-p1-apex\n ];\n return scene.addObject('polyhedron', { flavor: 'tetrahedron', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\n\nexport function buildCube(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, scene);\n const p2Id = ensurePoint(args[1].hit, scene);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const p1Obj = scene.get(p1Id);\n const p2Obj = scene.get(p2Id);\n if (!p1Obj || p1Obj.kind !== 'point' || !p2Obj || p2Obj.kind !== 'point') return null;\n const p1 = constraintToWorld(p1Obj.constraint, scene);\n const p2 = constraintToWorld(p2Obj.constraint, scene);\n // Require both on the ground (z = 0); reject otherwise\n if (Math.abs(p1[2]) > 1e-6 || Math.abs(p2[2]) > 1e-6) return null;\n const dx = p2[0] - p1[0];\n const dy = p2[1] - p1[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Bottom face: p1, p2, p3 = p2 + perp, p4 = p1 + perp where perp = rotate (p2-p1) by +90°\n const perpX = -dy;\n const perpY = dx;\n const p3: [number, number, number] = [p2[0] + perpX, p2[1] + perpY, 0];\n const p4: [number, number, number] = [p1[0] + perpX, p1[1] + perpY, 0];\n // Top face: same x, y; z = edge\n const t1: [number, number, number] = [p1[0], p1[1], edge];\n const t2: [number, number, number] = [p2[0], p2[1], edge];\n const t3: [number, number, number] = [p3[0], p3[1], edge];\n const t4: [number, number, number] = [p4[0], p4[1], edge];\n\n const p3Id = scene.addPoint({ kind: 'onGround', x: p3[0], y: p3[1] });\n const p4Id = scene.addPoint({ kind: 'onGround', x: p4[0], y: p4[1] });\n const t1Id = scene.addPoint({ kind: 'free', x: t1[0], y: t1[1], z: t1[2] });\n const t2Id = scene.addPoint({ kind: 'free', x: t2[0], y: t2[1], z: t2[2] });\n const t3Id = scene.addPoint({ kind: 'free', x: t3[0], y: t3[1], z: t3[2] });\n const t4Id = scene.addPoint({ kind: 'free', x: t4[0], y: t4[1], z: t4[2] });\n\n const vertices = [p1Id, p2Id, p3Id, p4Id, t1Id, t2Id, t3Id, t4Id];\n // Faces by index in vertices:\n const faces: number[][] = [\n [0, 1, 2, 3], // bottom\n [4, 5, 6, 7], // top\n [0, 1, 5, 4], // front\n [1, 2, 6, 5], // right\n [2, 3, 7, 6], // back\n [3, 0, 4, 7], // left\n ];\n return scene.addObject('polyhedron', { flavor: 'cube', vertices, faces });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildSphere(args: CollectedArg[], scene: Scene3D): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const center = ensurePoint(args[0].hit, scene);\n const surface = ensurePoint(args[1].hit, scene);\n if (!center || !surface || center === surface) return null;\n return scene.addObject('sphere', { center, surfacePoint: surface });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCylinder(args: CollectedArg[], scene: Scene3D): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, scene);\n const topCenter = ensurePoint(points[1].hit, scene);\n if (!baseCenter || !topCenter || baseCenter === topCenter) return null;\n return scene.addObject('cylinder', { baseCenter, topCenter, radius });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Scene3D } from '../../scene/Scene3D';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCone(args: CollectedArg[], scene: Scene3D): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, scene);\n const apex = ensurePoint(points[1].hit, scene);\n if (!baseCenter || !apex || baseCenter === apex) return null;\n return scene.addObject('cone', { baseCenter, apex, radius });\n}\n","import type { Scene3D } from '../scene/Scene3D';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport { buildPoint, buildPointOnObject } from './handlers/point';\nimport { buildSegment, buildLine, buildRay, buildVector } from './handlers/segment';\nimport { buildPolygon } from './handlers/polygon';\nimport { buildPlane } from './handlers/plane';\nimport { buildPyramid } from './handlers/pyramid';\nimport { buildPrism } from './handlers/prism';\nimport { buildTetrahedron } from './handlers/tetrahedron';\nimport { buildCube } from './handlers/cube';\nimport { buildSphere } from './handlers/sphere';\nimport { buildCylinder } from './handlers/cylinder';\nimport { buildCone } from './handlers/cone';\n\nexport type ToolKey =\n | 'move' | 'point' | 'pointOnObject'\n | 'segment' | 'line' | 'ray' | 'vector' | 'polygon'\n | 'plane' | 'pyramid' | 'prism' | 'tetrahedron' | 'cube'\n | 'sphere' | 'cylinder' | 'cone';\n\nexport type ToolStep =\n | {\n type: 'point';\n allowExisting: boolean;\n allowNewOn: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'>;\n hint: string;\n }\n | { type: 'closingPoint'; hint: string }\n | { type: 'object'; kinds: Array<'plane' | 'polygon' | 'line' | 'sphere' | 'polyhedron'>; hint: string }\n | { type: 'number'; prompt: string; min?: number; max?: number };\n\nexport interface CollectedArg {\n step: ToolStep;\n hit?: SceneHit;\n value?: number;\n}\n\nexport interface ToolSpec {\n key: ToolKey;\n label: string;\n hintIdle: string;\n steps: ToolStep[];\n build(args: CollectedArg[], scene: Scene3D): string | null;\n /**\n * If true, after build completes the controller re-enters step 0 of this\n * tool (clearing collected args) instead of switching to 'move'. Used by\n * the Point tool so the user can place several points in a row.\n */\n repeatAfterBuild?: boolean;\n}\n\nconst stubBuild = (): string | null => null;\n\nconst ALL_SURFACES: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane', 'line', 'polygon', 'sphere'];\n\nconst OBJECT_ONLY: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['plane', 'line', 'polygon', 'sphere'];\n\nconst NO_SURFACE: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane'];\n\nexport const TOOLS: ToolSpec[] = [\n {\n key: 'move',\n label: 'Di chuyển',\n hintIdle: 'Kéo điểm hoặc xoay khung',\n steps: [],\n build: stubBuild,\n },\n {\n key: 'point',\n label: 'Điểm',\n hintIdle: 'Click trên mặt phẳng Oxy hoặc trên trục để đặt điểm',\n steps: [\n {\n type: 'point',\n allowExisting: false,\n // GeoGebra-style: a new point must lie on the XY ground plane or on\n // one of the coordinate axes (Oz lets you place points off the plane).\n allowNewOn: ['ground', 'axis'],\n hint: 'Click trên mặt phẳng Oxy hoặc trục Ox/Oy/Oz',\n },\n ],\n build: buildPoint,\n repeatAfterBuild: true,\n },\n {\n key: 'pointOnObject',\n label: 'Điểm trên đối tượng',\n hintIdle: 'Chọn một đối tượng để đặt điểm',\n steps: [{ type: 'point', allowExisting: false, allowNewOn: OBJECT_ONLY, hint: 'Click lên mặt / đường để đặt điểm' }],\n build: buildPointOnObject,\n },\n {\n key: 'segment',\n label: 'Đoạn thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đoạn thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildSegment,\n },\n {\n key: 'line',\n label: 'Đường thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đường thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildLine,\n },\n {\n key: 'ray',\n label: 'Tia',\n hintIdle: 'Chọn điểm gốc rồi điểm trên tia',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm gốc' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên tia' },\n ],\n build: buildRay,\n },\n {\n key: 'vector',\n label: 'Vector',\n hintIdle: 'Chọn 2 điểm để vẽ vector',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm đầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm cuối' },\n ],\n build: buildVector,\n },\n {\n key: 'polygon',\n label: 'Đa giác',\n hintIdle: 'Chọn các đỉnh; click điểm đầu để đóng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 1' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 3' },\n { type: 'closingPoint', hint: 'Click điểm đầu để đóng (hoặc chọn thêm đỉnh)' },\n ],\n build: buildPolygon,\n },\n {\n key: 'plane',\n label: 'Mặt phẳng (3 điểm)',\n hintIdle: 'Chọn 3 điểm để xác định mặt phẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 1 của mặt phẳng' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 3' },\n ],\n build: buildPlane,\n },\n {\n key: 'pyramid',\n label: 'Hình chóp',\n hintIdle: 'Chọn đáy đa giác rồi chọn đỉnh chóp',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đáy đầu tiên để đóng (hoặc chọn thêm đỉnh)' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh chóp' },\n ],\n build: buildPyramid,\n },\n {\n key: 'prism',\n label: 'Lăng trụ',\n hintIdle: 'Chọn đáy đa giác rồi nhập chiều cao',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đầu để đóng đáy' },\n { type: 'number', prompt: 'Chiều cao (theo trục z)', min: 0.0001 },\n ],\n build: buildPrism,\n },\n {\n key: 'tetrahedron',\n label: 'Tứ diện đều',\n hintIdle: 'Chọn 2 điểm xác định cạnh của tứ diện',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 2' },\n ],\n build: buildTetrahedron,\n },\n {\n key: 'cube',\n label: 'Lập phương',\n hintIdle: 'Chọn 2 điểm trên nền xác định cạnh',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 1 (trên nền)' },\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 2 (trên nền)' },\n ],\n build: buildCube,\n },\n {\n key: 'sphere',\n label: 'Mặt cầu',\n hintIdle: 'Chọn tâm rồi điểm trên mặt cầu',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm mặt cầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên mặt cầu' },\n ],\n build: buildSphere,\n },\n {\n key: 'cylinder',\n label: 'Hình trụ',\n hintIdle: 'Chọn tâm đáy, tâm trên, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm trên' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCylinder,\n },\n {\n key: 'cone',\n label: 'Hình nón',\n hintIdle: 'Chọn tâm đáy, đỉnh, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCone,\n },\n];\n\nexport const TOOL_GROUPS: Record<string, ToolKey[]> = {\n 'Cơ bản': ['move', 'point', 'segment', 'line', 'plane'],\n 'Điểm': ['point', 'pointOnObject'],\n 'Đường thẳng': ['segment', 'line', 'ray', 'vector', 'polygon'],\n 'Mặt phẳng': ['plane'],\n 'Khối đa diện': ['pyramid', 'prism', 'tetrahedron', 'cube'],\n 'Khối cong': ['sphere', 'cylinder', 'cone'],\n};\n","import type { Scene3D } from '../scene/Scene3D';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport type { ToolKey, ToolStep, ToolSpec, CollectedArg } from './spec';\nimport { TOOLS } from './spec';\n\ninterface ControllerState {\n tool: ToolSpec | null;\n stepIndex: number;\n collected: CollectedArg[];\n hint: string;\n}\n\ntype Listener = (state: ControllerState) => void;\n\nfunction stepHint(step: ToolStep): string {\n return step.type === 'number' ? step.prompt : step.hint;\n}\n\nexport class ToolController {\n private state: ControllerState = { tool: null, stepIndex: 0, collected: [], hint: '' };\n private listeners = new Set<Listener>();\n\n constructor(private scene: Scene3D) {\n this.selectTool('move');\n }\n\n getState(): ControllerState { return this.state; }\n\n on(cb: Listener): () => void {\n this.listeners.add(cb);\n return () => {\n this.listeners.delete(cb);\n };\n }\n\n selectTool(key: ToolKey): void {\n const tool = TOOLS.find((t) => t.key === key) ?? TOOLS.find((t) => t.key === 'move')!;\n const firstStep = tool.steps[0];\n this.state = {\n tool,\n stepIndex: 0,\n collected: [],\n hint: firstStep ? stepHint(firstStep) : tool.hintIdle,\n };\n this.notify();\n }\n\n cancel(): void { this.selectTool('move'); }\n\n consumeHit(hit: SceneHit): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step) return false;\n\n // Polygon-like variable-vertex flow: when current step is closingPoint, an\n // existing-point hit matching the first collected vertex finalizes the\n // sub-sequence; any other surface hit appends another vertex (and the\n // controller stays at this stepIndex).\n if (step.type === 'closingPoint') {\n if (hit.kind === 'empty') return false;\n if (hit.kind === 'existingPoint') {\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n // Otherwise append another vertex using the previous 'point' step's allowNewOn\n const prevStep = tool.steps[this.state.stepIndex - 1];\n if (!prevStep || prevStep.type !== 'point') return false;\n if (!this.hitMatchesStep(hit, prevStep)) return false;\n this.state.collected.push({ step: prevStep, hit });\n // stepIndex stays at the closingPoint step\n this.notify();\n return true;\n }\n\n if (!this.hitMatchesStep(hit, step)) return false;\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n consumeNumber(value: number): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step || step.type !== 'number') return false;\n if (step.min != null && value < step.min) return false;\n if (step.max != null && value > step.max) return false;\n this.state.collected.push({ step, value });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n private hitMatchesStep(hit: SceneHit, step: ToolStep): boolean {\n if (step.type !== 'point' && step.type !== 'closingPoint') return false;\n if (hit.kind === 'empty') return false;\n if (step.type === 'closingPoint') return hit.kind === 'existingPoint';\n if (hit.kind === 'existingPoint') return step.allowExisting;\n const surfaceMap: Record<string, 'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> = {\n onGround: 'ground', onAxis: 'axis', onPlane: 'plane',\n onLine: 'line', onPolygon: 'polygon', onSphere: 'sphere',\n };\n const k = surfaceMap[hit.kind];\n return k != null && step.type === 'point' && step.allowNewOn.includes(k);\n }\n\n private advance(): void {\n const tool = this.state.tool!;\n if (this.state.stepIndex >= tool.steps.length) {\n tool.build(this.state.collected, this.scene);\n if (tool.repeatAfterBuild) {\n // Stay in this tool so the user can place several items in a row.\n this.state.stepIndex = 0;\n this.state.collected = [];\n this.state.hint = stepHint(tool.steps[0]);\n this.notify();\n } else {\n this.selectTool('move');\n }\n return;\n }\n this.state.hint = stepHint(tool.steps[this.state.stepIndex]);\n this.notify();\n }\n\n private notify(): void {\n for (const cb of this.listeners) cb(this.state);\n }\n}\n","import type { Vec3 } from '../scene/types';\n\nexport const CURVED_SEGMENTS = 16;\n\nexport function cylinderFaces(\n center: Vec3,\n top: Vec3,\n radius: number,\n): { vertices: Vec3[]; faces: number[][] } {\n const baseRing: Vec3[] = [];\n const topRing: Vec3[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n const dx = radius * Math.cos(theta);\n const dy = radius * Math.sin(theta);\n baseRing.push([center[0] + dx, center[1] + dy, center[2]]);\n topRing.push([top[0] + dx, top[1] + dy, top[2]]);\n }\n const vertices = [...baseRing, ...topRing];\n const faces: number[][] = [];\n faces.push(baseRing.map((_, i) => i));\n faces.push(topRing.map((_, i) => CURVED_SEGMENTS + i));\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const next = (i + 1) % CURVED_SEGMENTS;\n faces.push([i, next, CURVED_SEGMENTS + next, CURVED_SEGMENTS + i]);\n }\n return { vertices, faces };\n}\n\nexport function coneFaces(\n baseCenter: Vec3,\n apex: Vec3,\n radius: number,\n): { vertices: Vec3[]; faces: number[][] } {\n const baseRing: Vec3[] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n baseRing.push([\n baseCenter[0] + radius * Math.cos(theta),\n baseCenter[1] + radius * Math.sin(theta),\n baseCenter[2],\n ]);\n }\n const apexIdx = baseRing.length;\n const vertices = [...baseRing, apex];\n const faces: number[][] = [baseRing.map((_, i) => i)];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n faces.push([i, (i + 1) % CURVED_SEGMENTS, apexIdx]);\n }\n return { vertices, faces };\n}\n","import type { Scene3D } from '../scene/Scene3D';\nimport type { Scene3DObject, Vec3 } from '../scene/types';\nimport { constraintToWorld } from '../scene/constraintMath';\nimport { cylinderFaces, coneFaces } from './faceted';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport interface View3DLike {\n create(type: string, parents: unknown[], attrs: Record<string, unknown>): JxgObj;\n}\n\nexport class JxgRenderer {\n private map = new Map<string, JxgObj>();\n private unsubAdd: () => void;\n private unsubChange: () => void;\n private unsubDelete: () => void;\n private unsubReset: () => void;\n\n constructor(private scene: Scene3D, private view: View3DLike) {\n this.unsubAdd = scene.on('add', (o) => this.handleAdd(o));\n this.unsubChange = scene.on('change', (o) => this.handleChange(o));\n this.unsubDelete = scene.on('delete', (id) => this.handleDelete(id));\n this.unsubReset = scene.on('reset', () => this.handleReset());\n for (const obj of scene.list()) this.handleAdd(obj);\n }\n\n dispose(): void {\n this.unsubAdd();\n this.unsubChange();\n this.unsubDelete();\n this.unsubReset();\n for (const [id, j] of this.map) {\n try { j.remove?.(); } catch { /* swallow */ }\n this.map.delete(id);\n }\n }\n\n private handleAdd(obj: Scene3DObject): void {\n if (this.map.has(obj.id)) return;\n\n if (obj.kind === 'point') {\n const world = constraintToWorld(obj.constraint, this.scene);\n // fixed: true disables JSXGraph's native drag. Drag of existing points\n // is handled exclusively by MiniBoard3D.shouldStartPointDrag +\n // EditorPanel.onPointerDrag so the constraint math (Z-only in Point\n // mode, XY raycast in Move mode) is the single source of truth.\n const attrs = { id: obj.id, name: obj.label, size: 4, visible: obj.visible, fixed: true };\n const jxg = this.view.create('point3d', world, attrs);\n this.map.set(obj.id, jxg);\n return;\n }\n\n if (obj.kind === 'segment') {\n const a = this.map.get(obj.p1);\n const b = this.map.get(obj.p2);\n const attrs = {\n id: obj.id,\n straightFirst: false,\n straightLast: false,\n visible: obj.visible,\n strokeColor: obj.color ?? '#0066cc',\n strokeWidth: 2,\n };\n this.map.set(obj.id, this.view.create('line3d', [a, b], attrs));\n return;\n }\n\n if (obj.kind === 'line') {\n const attrs = {\n id: obj.id,\n visible: obj.visible,\n strokeColor: obj.color ?? '#0066cc',\n strokeWidth: 2,\n };\n this.map.set(\n obj.id,\n this.view.create('line3d', [this.map.get(obj.p1), this.map.get(obj.p2)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'ray') {\n const attrs = { id: obj.id, straightFirst: false, visible: obj.visible };\n this.map.set(\n obj.id,\n this.view.create('line3d', [this.map.get(obj.origin), this.map.get(obj.through)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'vector') {\n const attrs = {\n id: obj.id,\n lastArrow: true,\n straightFirst: false,\n straightLast: false,\n visible: obj.visible,\n };\n this.map.set(\n obj.id,\n this.view.create('line3d', [this.map.get(obj.from), this.map.get(obj.to)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'plane') {\n const attrs = { id: obj.id, fillOpacity: 0.2, visible: obj.visible };\n this.map.set(\n obj.id,\n this.view.create(\n 'plane3d',\n [this.map.get(obj.p1), this.map.get(obj.p2), this.map.get(obj.p3)],\n attrs,\n ),\n );\n return;\n }\n\n if (obj.kind === 'polygon') {\n const refs = obj.vertices.map((v) => this.map.get(v));\n const attrs = { id: obj.id, fillOpacity: 0.3, visible: obj.visible };\n this.map.set(obj.id, this.view.create('polygon3d', [refs], attrs));\n return;\n }\n\n if (obj.kind === 'sphere') {\n const attrs = { id: obj.id, fillOpacity: 0.25, visible: obj.visible };\n this.map.set(\n obj.id,\n this.view.create('sphere3d', [this.map.get(obj.center), this.map.get(obj.surfacePoint)], attrs),\n );\n return;\n }\n\n if (obj.kind === 'polyhedron') {\n const verts = obj.vertices.map((id) => this.map.get(id));\n const faceJxgs = obj.faces.map((face) =>\n this.view.create('polygon3d', [face.map((idx) => verts[idx])], {\n id: `${obj.id}.face${face.join('-')}`,\n fillOpacity: 0.25,\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n }),\n );\n // Composite: store an object with _faces array + a remove() that disposes each face.\n this.map.set(obj.id, {\n _faces: faceJxgs,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n remove: () => faceJxgs.forEach((f: any) => f.remove?.()),\n });\n return;\n }\n\n if (obj.kind === 'cylinder' || obj.kind === 'cone') {\n const baseCenterPt = this.scene.get(obj.baseCenter);\n if (!baseCenterPt || baseCenterPt.kind !== 'point') return;\n const base = constraintToWorld(baseCenterPt.constraint, this.scene);\n let secondPt: Vec3;\n if (obj.kind === 'cylinder') {\n const topCenterPt = this.scene.get(obj.topCenter);\n if (!topCenterPt || topCenterPt.kind !== 'point') return;\n secondPt = constraintToWorld(topCenterPt.constraint, this.scene);\n } else {\n const apexPt = this.scene.get(obj.apex);\n if (!apexPt || apexPt.kind !== 'point') return;\n secondPt = constraintToWorld(apexPt.constraint, this.scene);\n }\n const geom =\n obj.kind === 'cylinder'\n ? cylinderFaces(base, secondPt, obj.radius)\n : coneFaces(base, secondPt, obj.radius);\n // Create vertex point3d's (hidden), then polygon3d per face.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const vertJxgs: any[] = geom.vertices.map((v, i) =>\n this.view.create('point3d', v, {\n id: `${obj.id}.v${i}`,\n visible: false,\n fixed: true,\n withLabel: false,\n }),\n );\n const faceJxgs = geom.faces.map((face) =>\n this.view.create('polygon3d', [face.map((idx) => vertJxgs[idx])], {\n id: `${obj.id}.face${face.join('-')}`,\n fillOpacity: 0.25,\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n }),\n );\n this.map.set(obj.id, {\n _verts: vertJxgs,\n _faces: faceJxgs,\n remove: () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n faceJxgs.forEach((f: any) => f.remove?.());\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n vertJxgs.forEach((v: any) => v.remove?.());\n },\n });\n return;\n }\n }\n\n private handleChange(obj: Scene3DObject): void {\n const j = this.map.get(obj.id);\n if (!j) return;\n if (obj.kind === 'point' && typeof j.moveTo === 'function') {\n const w = constraintToWorld(obj.constraint, this.scene);\n // time=0 → instant teleport. Without it some JSXGraph builds tween the\n // move, which under fast successive drag updates manifests as flicker.\n try { j.moveTo([w[0], w[1], w[2]], 0); } catch { /* swallow */ }\n }\n }\n\n private handleDelete(id: string): void {\n const j = this.map.get(id);\n if (!j) return;\n try { j.remove?.(); } catch { /* swallow */ }\n this.map.delete(id);\n }\n\n private handleReset(): void {\n for (const [, j] of this.map) {\n try { j.remove?.(); } catch { /* swallow */ }\n }\n this.map.clear();\n }\n}\n","import type { Vec3 } from '../scene/types';\n\nexport interface View3DLike {\n unprojectScreen?(sx: number, sy: number, depth: number): [number, number, number];\n project3DTo2D?(x: number, y: number, z: number): [number, number, number, number];\n}\n\nexport interface Ray3D {\n origin: Vec3;\n dir: Vec3;\n}\n\nexport function screenToRay(screen: { x: number; y: number }, view: View3DLike): Ray3D {\n // Strategy: unproject the screen point at two depths to get a ray through the scene.\n // Prefer view.unprojectScreen if available (mock); fallback to bisection via project3DTo2D.\n const near = unproject(screen, view, +20);\n const far = unproject(screen, view, -20);\n const dir: Vec3 = [far[0] - near[0], far[1] - near[1], far[2] - near[2]];\n const n = Math.sqrt(dir[0] ** 2 + dir[1] ** 2 + dir[2] ** 2);\n const norm: Vec3 = n === 0 ? [0, 0, -1] : [dir[0] / n, dir[1] / n, dir[2] / n];\n return { origin: near, dir: norm };\n}\n\nfunction unproject(screen: { x: number; y: number }, view: View3DLike, depth: number): Vec3 {\n if (typeof view.unprojectScreen === 'function') {\n const v = view.unprojectScreen(screen.x, screen.y, depth);\n return [v[0], v[1], v[2]];\n }\n // Fallback for real JSXGraph view3d (orthographic-affine projection).\n // Extract the world→screen affine coefficients by sampling project3DTo2D at origin\n // and the three unit-axis points, then solve the 2×2 in (x, y) at the given depth.\n if (typeof view.project3DTo2D === 'function') {\n const p0 = view.project3DTo2D(0, 0, 0);\n const px = view.project3DTo2D(1, 0, 0);\n const py = view.project3DTo2D(0, 1, 0);\n const pz = view.project3DTo2D(0, 0, 1);\n const ox = p0[1], oy = p0[2];\n const a = px[1] - ox, b = py[1] - ox, c = pz[1] - ox;\n const d = px[2] - oy, e = py[2] - oy, f = pz[2] - oy;\n const rhsX = screen.x - ox - c * depth;\n const rhsY = screen.y - oy - f * depth;\n const det = a * e - b * d;\n if (Math.abs(det) < 1e-9) return [0, 0, depth];\n const x = (e * rhsX - b * rhsY) / det;\n const y = (-d * rhsX + a * rhsY) / det;\n return [x, y, depth];\n }\n throw new Error('rayCast: view has neither unprojectScreen nor project3DTo2D');\n}\n","import type { Vec3 } from '../scene/types';\nimport type { Ray3D } from './rayCast';\n\nconst EPS = 1e-9;\n\nexport interface PlaneHit { point: Vec3; t: number }\nexport interface SphereHit { point: Vec3; t: number }\nexport interface SegmentHit { point: Vec3; t: number; tOnSegment: number }\n\nfunction dot(a: Vec3, b: Vec3): number { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; }\nfunction sub(a: Vec3, b: Vec3): Vec3 { return [a[0]-b[0], a[1]-b[1], a[2]-b[2]]; }\nfunction add(a: Vec3, b: Vec3): Vec3 { return [a[0]+b[0], a[1]+b[1], a[2]+b[2]]; }\nfunction scale(a: Vec3, k: number): Vec3 { return [a[0]*k, a[1]*k, a[2]*k]; }\nfunction norm2(a: Vec3): number { return dot(a, a); }\n\nexport function rayPlane(\n ray: Ray3D,\n plane: { point: Vec3; normal: Vec3 },\n): PlaneHit | null {\n const denom = dot(ray.dir, plane.normal);\n if (Math.abs(denom) < EPS) return null;\n const t = dot(sub(plane.point, ray.origin), plane.normal) / denom;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\nexport function rayGround(ray: Ray3D): PlaneHit | null {\n return rayPlane(ray, { point: [0, 0, 0], normal: [0, 0, 1] });\n}\n\nexport function raySphere(\n ray: Ray3D,\n sphere: { center: Vec3; radius: number },\n): SphereHit | null {\n const oc = sub(ray.origin, sphere.center);\n const b = dot(oc, ray.dir);\n const c = dot(oc, oc) - sphere.radius * sphere.radius;\n const disc = b * b - c;\n if (disc < 0) return null;\n const sqrtD = Math.sqrt(disc);\n const t1 = -b - sqrtD;\n const t2 = -b + sqrtD;\n const t = t1 >= 0 ? t1 : t2;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\n/**\n * Closest approach between ray and line segment. Accepts a distance threshold\n * (in world units; caller scales for pixel ratio).\n */\nexport function rayLineSegment(\n ray: Ray3D,\n seg: { a: Vec3; b: Vec3 },\n maxDistance: number,\n): SegmentHit | null {\n const u = ray.dir;\n const v = sub(seg.b, seg.a);\n const w0 = sub(ray.origin, seg.a);\n const a = dot(u, u);\n const bb = dot(u, v);\n const cc = dot(v, v);\n const d = dot(u, w0);\n const e = dot(v, w0);\n const denom = a * cc - bb * bb;\n if (Math.abs(denom) < EPS) return null;\n const sc = (bb * e - cc * d) / denom;\n const tc = (a * e - bb * d) / denom;\n if (sc < 0 || tc < 0 || tc > 1) return null;\n const pRay = add(ray.origin, scale(u, sc));\n const pSeg = add(seg.a, scale(v, tc));\n const dist2 = norm2(sub(pRay, pSeg));\n if (dist2 > maxDistance * maxDistance) return null;\n return { point: pSeg, t: sc, tOnSegment: tc };\n}\n","import { constraintToWorld } from '../scene/constraintMath';\nimport type { Scene3D } from '../scene/Scene3D';\nimport type { View3DLike } from './rayCast';\n\nexport function findSnapPoint(\n screen: { x: number; y: number },\n view: View3DLike,\n scene: Scene3D,\n pixelRadius = 8,\n): string | null {\n // `screen` arrives in JSXGraph user-space (pixelToUser-converted in MiniBoard3D),\n // and project3DTo2D also returns user-space. Convert the desired pixel radius\n // to user units via the board's px-per-unit scale so the snap stays small\n // (a few real pixels) regardless of zoom or board size.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing — keeps unit tests, whose\n // mock view emits pixel-space coords directly, working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const uy = typeof board?.unitY === 'number' && board.unitY > 0 ? board.unitY : ux;\n const rxUser = pixelRadius / ux;\n const ryUser = pixelRadius / uy;\n let best: { id: string; d2: number } | null = null;\n for (const obj of scene.list()) {\n if (obj.kind !== 'point') continue;\n if (!obj.visible) continue;\n const world = constraintToWorld(obj.constraint, scene);\n const proj = view.project3DTo2D?.(world[0], world[1], world[2]);\n if (!proj) continue;\n const dxN = (proj[1] - screen.x) / rxUser;\n const dyN = (proj[2] - screen.y) / ryUser;\n const d2 = dxN * dxN + dyN * dyN;\n if (d2 <= 1 && (best === null || d2 < best.d2)) {\n best = { id: obj.id, d2 };\n }\n }\n return best?.id ?? null;\n}\n","import { screenToRay, type View3DLike } from './rayCast';\nimport { rayGround, rayLineSegment, rayPlane, raySphere } from './intersect';\nimport { findSnapPoint } from './snapping';\nimport { constraintToWorld } from '../scene/constraintMath';\nimport type { Scene3D } from '../scene/Scene3D';\nimport type { Vec3 } from '../scene/types';\n\n// NOTE (v0.8.0): onPolygon and onLine SceneHit variants are typed but not yet\n// produced by hitTest. They will be added once tools require placing points\n// on user-defined lines/polygons (deferred from Task 2.4).\n\nexport type SceneHit =\n | { kind: 'existingPoint'; pointId: string }\n | { kind: 'onGround'; world: Vec3 }\n | { kind: 'onAxis'; axis: 'x' | 'y' | 'z'; t: number; world: Vec3 }\n | { kind: 'onPlane'; planeId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onLine'; lineId: string; t: number; world: Vec3 }\n | { kind: 'onPolygon'; polygonId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onSphere'; sphereId: string; theta: number; phi: number; world: Vec3 }\n | { kind: 'empty' };\n\nconst AXIS_PIXEL_THRESHOLD = 12;\n\nexport function hitTest(\n screen: { x: number; y: number },\n view: View3DLike,\n scene: Scene3D,\n): SceneHit {\n // `screen` arrives in user-space; thresholds below are in pixels and need to\n // be converted to user units via the board's px-per-unit scale.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing so the hitTest unit tests,\n // whose mock view emits pixel-space coords directly, keep working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const axisThresholdUser = AXIS_PIXEL_THRESHOLD / ux;\n\n // 1. Existing point snap\n const snap = findSnapPoint(screen, view, scene);\n if (snap) return { kind: 'existingPoint', pointId: snap };\n\n const ray = screenToRay(screen, view);\n\n // 2. Spheres\n let bestSphere: { id: string; t: number; world: Vec3 } | null = null;\n for (const obj of scene.list()) {\n if (obj.kind !== 'sphere' || !obj.visible) continue;\n const centerPoint = scene.get(obj.center);\n const surfacePoint = scene.get(obj.surfacePoint);\n if (!centerPoint || centerPoint.kind !== 'point') continue;\n if (!surfacePoint || surfacePoint.kind !== 'point') continue;\n const center = constraintToWorld(centerPoint.constraint, scene);\n const surface = constraintToWorld(surfacePoint.constraint, scene);\n const radius = Math.hypot(\n surface[0] - center[0],\n surface[1] - center[1],\n surface[2] - center[2],\n );\n const sh = raySphere(ray, { center, radius });\n if (sh && (bestSphere === null || sh.t < bestSphere.t)) {\n bestSphere = { id: obj.id, t: sh.t, world: sh.point };\n }\n }\n\n // 3. Axis snap — project click onto each axis line in screen space, check pixel distance\n if (view.project3DTo2D) {\n const axes: { axis: 'x' | 'y' | 'z'; a: Vec3; b: Vec3 }[] = [\n { axis: 'x', a: [-10, 0, 0], b: [10, 0, 0] },\n { axis: 'y', a: [0, -10, 0], b: [0, 10, 0] },\n { axis: 'z', a: [0, 0, -10], b: [0, 0, 10] },\n ];\n for (const ax of axes) {\n const pa = view.project3DTo2D(ax.a[0], ax.a[1], ax.a[2]);\n const pb = view.project3DTo2D(ax.b[0], ax.b[1], ax.b[2]);\n const d = distScreenPointToSegment(screen, [pa[1], pa[2]], [pb[1], pb[2]]);\n if (d <= axisThresholdUser) {\n const hit = rayLineSegment(ray, { a: ax.a, b: ax.b }, 1e3);\n if (hit) {\n const t = ax.axis === 'x' ? hit.point[0] : ax.axis === 'y' ? hit.point[1] : hit.point[2];\n return { kind: 'onAxis', axis: ax.axis, t, world: hit.point };\n }\n }\n }\n }\n\n // 4. User-defined planes\n let bestPlane: { id: string; t: number; world: Vec3; basis: NonNullable<ReturnType<typeof planeBasis>> } | null = null;\n for (const obj of scene.list()) {\n if (obj.kind !== 'plane' || !obj.visible) continue;\n const basis = planeBasis(obj, scene);\n if (!basis) continue;\n const ph = rayPlane(ray, { point: basis.origin, normal: basis.normal });\n if (ph && (bestPlane === null || ph.t < bestPlane.t)) {\n bestPlane = { id: obj.id, t: ph.t, world: ph.point, basis };\n }\n }\n // Compare best plane to best sphere — return whichever is closer\n if (bestPlane && (!bestSphere || bestPlane.t < bestSphere.t)) {\n const rel: Vec3 = [\n bestPlane.world[0] - bestPlane.basis.origin[0],\n bestPlane.world[1] - bestPlane.basis.origin[1],\n bestPlane.world[2] - bestPlane.basis.origin[2],\n ];\n const b1n = dot3(bestPlane.basis.basis1, bestPlane.basis.basis1);\n const b2n = dot3(bestPlane.basis.basis2, bestPlane.basis.basis2);\n const u = b1n === 0 ? 0 : dot3(rel, bestPlane.basis.basis1) / b1n;\n const v = b2n === 0 ? 0 : dot3(rel, bestPlane.basis.basis2) / b2n;\n return { kind: 'onPlane', planeId: bestPlane.id, u, v, world: bestPlane.world };\n }\n\n // 5. Sphere result (if found)\n if (bestSphere) {\n const sph = scene.get(bestSphere.id);\n if (sph && sph.kind === 'sphere') {\n const centerPt = scene.get(sph.center);\n if (centerPt && centerPt.kind === 'point') {\n const center = constraintToWorld(centerPt.constraint, scene);\n const relX = bestSphere.world[0] - center[0];\n const relY = bestSphere.world[1] - center[1];\n const relZ = bestSphere.world[2] - center[2];\n const r = Math.hypot(relX, relY, relZ);\n const phi = r === 0 ? 0 : Math.acos(relZ / r);\n const theta = Math.atan2(relY, relX);\n return { kind: 'onSphere', sphereId: bestSphere.id, theta, phi, world: bestSphere.world };\n }\n }\n }\n\n // 6. Ground\n const g = rayGround(ray);\n if (g) return { kind: 'onGround', world: g.point };\n\n return { kind: 'empty' };\n}\n\nfunction distScreenPointToSegment(\n p: { x: number; y: number },\n a: [number, number],\n b: [number, number],\n): number {\n const vx = b[0] - a[0];\n const vy = b[1] - a[1];\n const wx = p.x - a[0];\n const wy = p.y - a[1];\n const c1 = vx * wx + vy * wy;\n if (c1 <= 0) return Math.hypot(wx, wy);\n const c2 = vx * vx + vy * vy;\n if (c2 <= c1) return Math.hypot(p.x - b[0], p.y - b[1]);\n const t = c1 / c2;\n const px = a[0] + t * vx;\n const py = a[1] + t * vy;\n return Math.hypot(p.x - px, p.y - py);\n}\n\nfunction planeBasis(\n planeObj: { p1: string; p2: string; p3: string },\n scene: Scene3D,\n): { origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3 } | null {\n const p1Obj = scene.get(planeObj.p1);\n const p2Obj = scene.get(planeObj.p2);\n const p3Obj = scene.get(planeObj.p3);\n if (!p1Obj || p1Obj.kind !== 'point') return null;\n if (!p2Obj || p2Obj.kind !== 'point') return null;\n if (!p3Obj || p3Obj.kind !== 'point') return null;\n const p1 = constraintToWorld(p1Obj.constraint, scene);\n const p2 = constraintToWorld(p2Obj.constraint, scene);\n const p3 = constraintToWorld(p3Obj.constraint, scene);\n const basis1: Vec3 = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];\n const tmp: Vec3 = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];\n const cx = basis1[1]*tmp[2] - basis1[2]*tmp[1];\n const cy = basis1[2]*tmp[0] - basis1[0]*tmp[2];\n const cz = basis1[0]*tmp[1] - basis1[1]*tmp[0];\n const cLen = Math.hypot(cx, cy, cz);\n if (cLen === 0) return null;\n const normal: Vec3 = [cx / cLen, cy / cLen, cz / cLen];\n const basis2: Vec3 = [\n normal[1]*basis1[2] - normal[2]*basis1[1],\n normal[2]*basis1[0] - normal[0]*basis1[2],\n normal[0]*basis1[1] - normal[1]*basis1[0],\n ];\n return { origin: p1, basis1, basis2, normal };\n}\n\nfunction dot3(a: Vec3, b: Vec3): number {\n return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\n}\n","'use client';\nimport * as React from 'react';\nimport {\n DEFAULT_VIEW3D,\n GROUND_PLANE_ATTRS,\n GROUND_PLANE_RANGE,\n VIEW3D_ATTRS,\n paletteFor,\n} from './theme';\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 JxgView3D = any;\n\nexport interface MiniBoard3DProps {\n isDark: boolean;\n onView3DReady?: (view: JxgView3D, board: JxgBoard) => void;\n onPointerClick?: (screen: { x: number; y: number }) => void;\n onPointerMove?: (screen: { x: number; y: number }) => void;\n onPointerLeave?: () => void;\n /**\n * Called on pointerdown. Return true to switch the upcoming drag from the\n * default view-rotate mode into a delegated point-drag (passed to\n * onPointerDrag / onPointerDragEnd). The screen coord is in user-space.\n */\n shouldStartPointDrag?: (screen: { x: number; y: number }) => boolean;\n onPointerDrag?: (screen: { x: number; y: number }) => void;\n /**\n * Called at the end of a point-drag gesture (also invoked defensively on\n * pointerleave during an in-flight drag). The screen coord is in user-space.\n * Consumers that only need a \"drag ended\" notification may ignore the arg.\n */\n onPointerDragEnd?: (screen: { x: number; y: number }) => void;\n}\n\nexport interface MiniBoard3DHandle {\n getBoard: () => JxgBoard | null;\n getView3D: () => JxgView3D | null;\n /** Returns the current SVG element of the board for export. */\n getSvgElement: () => SVGSVGElement | null;\n}\n\nexport const MiniBoard3D = React.forwardRef<MiniBoard3DHandle, MiniBoard3DProps>(\n function MiniBoard3D(props, ref) {\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const boardRef = React.useRef<JxgBoard | null>(null);\n const viewRef = React.useRef<JxgView3D | null>(null);\n const {\n isDark,\n onView3DReady,\n onPointerClick,\n onPointerMove,\n onPointerLeave,\n shouldStartPointDrag,\n onPointerDrag,\n onPointerDragEnd,\n } = props;\n\n // Keep latest callback refs stable across re-renders so the init effect\n // doesn't have to re-run when handlers change.\n const onView3DReadyRef = React.useRef(onView3DReady);\n const onPointerClickRef = React.useRef(onPointerClick);\n const onPointerMoveRef = React.useRef(onPointerMove);\n const onPointerLeaveRef = React.useRef(onPointerLeave);\n const shouldStartPointDragRef = React.useRef(shouldStartPointDrag);\n const onPointerDragRef = React.useRef(onPointerDrag);\n const onPointerDragEndRef = React.useRef(onPointerDragEnd);\n onView3DReadyRef.current = onView3DReady;\n onPointerClickRef.current = onPointerClick;\n onPointerMoveRef.current = onPointerMove;\n onPointerLeaveRef.current = onPointerLeave;\n shouldStartPointDragRef.current = shouldStartPointDrag;\n onPointerDragRef.current = onPointerDrag;\n onPointerDragEndRef.current = onPointerDragEnd;\n\n React.useImperativeHandle(\n ref,\n () => ({\n getBoard: () => boardRef.current,\n getView3D: () => viewRef.current,\n getSvgElement: () => containerRef.current?.querySelector('svg') ?? null,\n }),\n [],\n );\n\n React.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 let svgEl: SVGSVGElement | null = null;\n let handlePointerDown: ((e: PointerEvent) => void) | null = null;\n let handlePointerMove: ((e: PointerEvent) => void) | null = null;\n let handlePointerUp: ((e: PointerEvent) => void) | null = null;\n let handlePointerLeave: (() => void) | null = null;\n\n void (async () => {\n try {\n JXG = (await import('jsxgraph')).default;\n } catch {\n return;\n }\n if (cancelled || !containerRef.current) return;\n try {\n JXG.Options.text.display = 'internal';\n } catch {\n /* ignore option set error in some mocks */\n }\n\n try {\n board = JXG.JSXGraph.initBoard(div, {\n boundingbox: [-6, 6, 6, -6],\n keepaspectratio: true,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n });\n } catch {\n return;\n }\n if (cancelled || !board) return;\n boardRef.current = board;\n\n let view: JxgView3D | null = null;\n try {\n const baseAttrs = VIEW3D_ATTRS(isDark);\n view = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [DEFAULT_VIEW3D.bbox3D[0], DEFAULT_VIEW3D.bbox3D[3]],\n [DEFAULT_VIEW3D.bbox3D[1], DEFAULT_VIEW3D.bbox3D[4]],\n [DEFAULT_VIEW3D.bbox3D[2], DEFAULT_VIEW3D.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n // JSXGraph view3d đọc giá trị khởi tạo từ az.slider.start (không\n // phải az.value). Pass nhầm `value` → JSXGraph dùng default\n // 1.0/0.3, khiến DEFAULT_VIEW3D bị bỏ qua.\n az: { ...baseAttrs.az, slider: { ...baseAttrs.az.slider, start: DEFAULT_VIEW3D.azimuth } },\n el: { ...baseAttrs.el, slider: { ...baseAttrs.el.slider, start: DEFAULT_VIEW3D.elevation } },\n },\n );\n } catch {\n /* ignore — mock or jsdom limitation */\n }\n viewRef.current = view;\n if (view) {\n // GeoGebra-style XY ground plane through origin (z=0), drawn behind\n // any user-created geometry. View3D's built-in zPlaneRear sits at the\n // bbox floor (z=zMin), not at the axes — so we draw an explicit one.\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => unknown }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(isDark),\n );\n } catch {\n /* swallow — older JSXGraph or mock may not support 5-arg plane3d */\n }\n onView3DReadyRef.current?.(view, board);\n }\n\n svgEl = (containerRef.current?.querySelector('svg') ?? null) as SVGSVGElement | null;\n if (svgEl) {\n const p = paletteFor(isDark);\n svgEl.style.background = p.view3dBg;\n\n // Convert browser pixel coords to JSXGraph user-space coords so that\n // hitTest math (which compares against view.project3DTo2D output, also\n // in user-space) is in the same coordinate system.\n const pixelToUser = (e: PointerEvent): { x: number; y: number } => {\n const rect = svgEl!.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const b = board as any;\n if (!b || !b.origin || !b.origin.scrCoords) {\n return { x: px, y: py };\n }\n const ox = b.origin.scrCoords[1];\n const oy = b.origin.scrCoords[2];\n const ux = b.unitX || 1;\n const uy = b.unitY || 1;\n return { x: (px - ox) / ux, y: (oy - py) / uy };\n };\n // Drag-to-rotate: track pointerdown start; if pointer travels past\n // DRAG_THRESHOLD before pointerup → rotate az/el and suppress click.\n const DRAG_THRESHOLD = 4;\n const AZ_PER_PX = 0.01;\n const EL_PER_PX = 0.01;\n const EL_LIMIT = Math.PI / 2 - 0.05;\n let dragStart: { x: number; y: number } | null = null;\n let dragging = false;\n let pointDragMode = false;\n let startAz = 0;\n let startEl = 0;\n const readAng = (s: { Value?: () => number; value?: number } | undefined): number => {\n if (!s) return 0;\n if (typeof s.Value === 'function') {\n try { return s.Value(); } catch { /* fallthrough */ }\n }\n return typeof s.value === 'number' ? s.value : 0;\n };\n const setAng = (\n s: { setValue?: (v: number) => void; value?: number } | undefined,\n v: number,\n ): void => {\n if (!s) return;\n if (typeof s.setValue === 'function') {\n try { s.setValue(v); return; } catch { /* fallthrough */ }\n }\n s.value = v;\n };\n\n handlePointerDown = (e: PointerEvent) => {\n if (!svgEl) return;\n dragStart = { x: e.clientX, y: e.clientY };\n dragging = false;\n pointDragMode = false;\n // If the consumer claims this drag (e.g. cursor is over an existing\n // point), enter point-drag mode and skip view-rotation.\n const screen = pixelToUser(e);\n try {\n pointDragMode = shouldStartPointDragRef.current?.(screen) ?? false;\n } catch { pointDragMode = false; }\n if (!pointDragMode) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = viewRef.current as any;\n startAz = readAng(v?.az_slide ?? v?.az);\n startEl = readAng(v?.el_slide ?? v?.el);\n }\n try { svgEl.setPointerCapture?.(e.pointerId); } catch { /* ignore */ }\n };\n handlePointerMove = (e: PointerEvent) => {\n if (!svgEl) return;\n if (dragStart) {\n const dx = e.clientX - dragStart.x;\n const dy = e.clientY - dragStart.y;\n if (!dragging && Math.hypot(dx, dy) > DRAG_THRESHOLD) dragging = true;\n if (dragging) {\n if (pointDragMode) {\n onPointerDragRef.current?.(pixelToUser(e));\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = viewRef.current as any;\n const newAz = startAz + dx * AZ_PER_PX;\n let newEl = startEl - dy * EL_PER_PX;\n if (newEl > EL_LIMIT) newEl = EL_LIMIT;\n if (newEl < -EL_LIMIT) newEl = -EL_LIMIT;\n setAng(v?.az_slide ?? v?.az, newAz);\n setAng(v?.el_slide ?? v?.el, newEl);\n try { v?.board?.update?.(); } catch { /* ignore */ }\n return;\n }\n }\n onPointerMoveRef.current?.(pixelToUser(e));\n };\n handlePointerUp = (e: PointerEvent) => {\n if (!svgEl) return;\n const wasDrag = dragging;\n const hadDown = dragStart !== null;\n const wasPointDrag = pointDragMode;\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n try { svgEl.releasePointerCapture?.(e.pointerId); } catch { /* ignore */ }\n // When the consumer claimed the gesture (pointDragMode), it owns\n // both placement and finalisation. Always run onPointerDragEnd so\n // any consumer-side refs are cleared (and an undo checkpoint can\n // be pushed), and SKIP onPointerClick to avoid double-handling\n // (e.g. Point-tool place-and-lift creates the point in\n // shouldStartPointDrag; we mustn't also fire the\n // click→consumeHit→buildPoint path).\n if (hadDown && wasPointDrag) {\n onPointerDragEndRef.current?.(pixelToUser(e));\n return;\n }\n if (hadDown && !wasDrag) {\n onPointerClickRef.current?.(pixelToUser(e));\n }\n };\n handlePointerLeave = () => {\n if (pointDragMode) {\n // Best-effort cleanup so a stray pointerleave during a drag\n // doesn't leak the consumer's draggedPointRef.\n try { onPointerDragEndRef.current?.({ x: 0, y: 0 }); } catch { /* ignore */ }\n }\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n onPointerLeaveRef.current?.();\n };\n svgEl.addEventListener('pointerdown', handlePointerDown);\n svgEl.addEventListener('pointermove', handlePointerMove);\n svgEl.addEventListener('pointerup', handlePointerUp);\n svgEl.addEventListener('pointercancel', handlePointerUp);\n svgEl.addEventListener('pointerleave', handlePointerLeave);\n }\n })();\n\n return () => {\n cancelled = true;\n if (svgEl) {\n if (handlePointerDown) svgEl.removeEventListener('pointerdown', handlePointerDown);\n if (handlePointerMove) svgEl.removeEventListener('pointermove', handlePointerMove);\n if (handlePointerUp) {\n svgEl.removeEventListener('pointerup', handlePointerUp);\n svgEl.removeEventListener('pointercancel', handlePointerUp);\n }\n if (handlePointerLeave) svgEl.removeEventListener('pointerleave', handlePointerLeave);\n }\n try {\n if (board && JXG) JXG.JSXGraph.freeBoard(board);\n } catch {\n /* swallow teardown errors in tests */\n }\n boardRef.current = null;\n viewRef.current = null;\n };\n }, [isDark]);\n\n const p = paletteFor(isDark);\n\n return (\n <div\n data-testid=\"mini-board-3d\"\n ref={containerRef}\n style={{\n width: '100%',\n height: '100%',\n minHeight: 400,\n background: p.view3dBg,\n position: 'relative',\n // Clip JSXGraph mesh3d paths projecting outside the container.\n overflow: 'hidden',\n }}\n />\n );\n },\n);\n","'use client';\nimport * as React from 'react';\n\nexport interface StatusHintProps {\n hint: string;\n hoverLabel?: string | null;\n}\n\nexport function StatusHint(props: StatusHintProps): React.ReactElement {\n const { hint, hoverLabel } = props;\n return (\n <div\n data-testid=\"status-hint\"\n className=\"border-t border-zinc-200 bg-zinc-50 px-3 py-1.5 text-xs text-zinc-700 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\"\n >\n <span>📐 {hint || 'Chọn công cụ trong bảng bên trái'}</span>\n {hoverLabel ? (\n <span className=\"ml-3 text-zinc-500\">— đang trên: {hoverLabel}</span>\n ) : null}\n </div>\n );\n}\n","import type { ObjectKind } from './types';\n\nconst A = 'A'.charCodeAt(0);\n\nexport function nextPointLabel(existing: string[]): string {\n const used = new Set(existing);\n for (let suffix = 0; suffix < 1000; suffix++) {\n for (let i = 0; i < 26; i++) {\n const letter = String.fromCharCode(A + i);\n const candidate = suffix === 0 ? letter : `${letter}_${suffix}`;\n if (!used.has(candidate)) return candidate;\n }\n }\n return `P_${used.size}`;\n}\n\nconst LOWERCASE_KINDS: ObjectKind[] = ['segment', 'line', 'ray', 'vector'];\nconst PREFIX: Partial<Record<ObjectKind, string>> = {\n sphere: 's',\n polyhedron: 'h',\n cylinder: 'c',\n cone: 'k',\n polygon: 'g',\n plane: 'π',\n};\n\nexport function nextDerivedLabel(kind: ObjectKind, existing: string[]): string {\n const used = new Set(existing);\n if (LOWERCASE_KINDS.includes(kind)) {\n for (let i = 0; i < 26; i++) {\n const c = String.fromCharCode('a'.charCodeAt(0) + i);\n if (!used.has(c)) return c;\n }\n for (let n = 1; n < 1000; n++) {\n const c = `a_${n}`;\n if (!used.has(c)) return c;\n }\n }\n const prefix = PREFIX[kind] ?? kind[0];\n for (let n = 1; n < 1000; n++) {\n const candidate = `${prefix}_${n}`;\n if (!used.has(candidate)) return candidate;\n }\n return `${prefix}_x`;\n}\n","import { nextPointLabel, nextDerivedLabel } from './labels';\nimport type { Constraint, Scene3DObject, ObjectKind } from './types';\n\ntype Listener<E> = (event: E) => void;\n\nexport type SceneSnapshot = {\n objects: ReadonlyMap<string, Scene3DObject>;\n order: readonly string[];\n counter: number;\n};\n\nexport class Scene3D {\n private objects = new Map<string, Scene3DObject>();\n private order: string[] = [];\n private counter = 0;\n private listeners = {\n add: new Set<Listener<Scene3DObject>>(),\n change: new Set<Listener<Scene3DObject>>(),\n delete: new Set<Listener<string>>(),\n reset: new Set<Listener<void>>(),\n };\n\n private historyPast: SceneSnapshot[] = [];\n private historyFuture: SceneSnapshot[] = [];\n private historySuspended = false;\n private historyListeners = new Set<() => void>();\n\n on(event: 'add', cb: Listener<Scene3DObject>): () => void;\n on(event: 'change', cb: Listener<Scene3DObject>): () => void;\n on(event: 'delete', cb: Listener<string>): () => void;\n on(event: 'reset', cb: Listener<void>): () => void;\n on(event: keyof Scene3D['listeners'], cb: Listener<never>): () => void {\n const set = this.listeners[event] as Set<Listener<never>>;\n set.add(cb);\n return () => {\n set.delete(cb);\n };\n }\n\n private nextId(prefix: string): string {\n this.counter += 1;\n return `${prefix}${this.counter}`;\n }\n\n addPoint(constraint: Constraint, label?: string, color?: string): string {\n this.capture();\n const id = this.nextId('p');\n const existingLabels = this.list().filter((o) => o.kind === 'point').map((o) => o.label);\n const autoLabel = label ?? nextPointLabel(existingLabels);\n const obj: Scene3DObject = {\n kind: 'point',\n id,\n label: autoLabel,\n visible: true,\n color,\n constraint,\n };\n this.objects.set(id, obj);\n this.order.push(id);\n this.listeners.add.forEach((cb) => cb(obj));\n return id;\n }\n\n addObject<K extends Exclude<ObjectKind, 'point'>>(\n kind: K,\n spec: Omit<Extract<Scene3DObject, { kind: K }>, 'id' | 'label' | 'visible' | 'kind'>,\n label?: string,\n ): string {\n this.capture();\n const id = this.nextId(kind[0]);\n const existingLabels = this.list().filter((o) => o.kind === kind).map((o) => o.label);\n const autoLabel = label ?? nextDerivedLabel(kind, existingLabels);\n const obj = { id, label: autoLabel, visible: true, kind, ...spec } as unknown as Scene3DObject;\n this.objects.set(id, obj);\n this.order.push(id);\n this.listeners.add.forEach((cb) => cb(obj));\n return id;\n }\n\n insert(obj: Scene3DObject): void {\n this.capture();\n if (this.objects.has(obj.id)) {\n throw new Error(`Scene3D.insert: id ${obj.id} already exists`);\n }\n this.objects.set(obj.id, obj);\n this.order.push(obj.id);\n this.listeners.add.forEach((cb) => cb(obj));\n }\n\n get(id: string): Scene3DObject | undefined {\n return this.objects.get(id);\n }\n\n list(): Scene3DObject[] {\n return this.order\n .map((id) => this.objects.get(id))\n .filter((obj): obj is Scene3DObject => obj !== undefined);\n }\n\n private referencedIds(obj: Scene3DObject): string[] {\n switch (obj.kind) {\n case 'point': {\n const c = obj.constraint;\n if (c.kind === 'onPlane') return [c.planeId];\n if (c.kind === 'onLine') return [c.lineId];\n if (c.kind === 'onPolygon') return [c.polygonId];\n if (c.kind === 'onSphere') return [c.sphereId];\n return [];\n }\n case 'segment':\n case 'line': return [obj.p1, obj.p2];\n case 'ray': return [obj.origin, obj.through];\n case 'vector': return [obj.from, obj.to];\n case 'polygon': return obj.vertices;\n case 'plane': return [obj.p1, obj.p2, obj.p3];\n case 'sphere': return [obj.center, obj.surfacePoint];\n case 'polyhedron': return obj.vertices;\n case 'cylinder': return [obj.baseCenter, obj.topCenter];\n case 'cone': return [obj.baseCenter, obj.apex];\n }\n }\n\n private collectDependents(targetId: string): Set<string> {\n const dependents = new Set<string>([targetId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of this.objects.values()) {\n if (dependents.has(obj.id)) continue;\n const refs = this.referencedIds(obj);\n if (refs.some((r) => dependents.has(r))) {\n dependents.add(obj.id);\n grew = true;\n }\n }\n }\n return dependents;\n }\n\n delete(id: string): void {\n if (!this.objects.has(id)) return;\n this.capture();\n const toDelete = this.collectDependents(id);\n for (const dependentId of toDelete) {\n this.objects.delete(dependentId);\n this.order = this.order.filter((x) => x !== dependentId);\n this.listeners.delete.forEach((cb) => cb(dependentId));\n }\n }\n\n reset(): void {\n this.capture();\n this.objects.clear();\n this.order = [];\n this.counter = 0;\n this.listeners.reset.forEach((cb) => cb());\n }\n\n reserveId(prefix: string): string {\n return this.nextId(prefix);\n }\n\n emitChange(id: string): void {\n const obj = this.objects.get(id);\n if (!obj) return;\n this.listeners.change.forEach((cb) => cb(obj));\n }\n\n snapshot(): SceneSnapshot {\n const cloned = new Map<string, Scene3DObject>();\n for (const [id, obj] of this.objects) {\n cloned.set(id, { ...obj } as Scene3DObject);\n }\n return {\n objects: cloned,\n order: [...this.order],\n counter: this.counter,\n };\n }\n\n private restore(snap: SceneSnapshot): void {\n this.objects = new Map();\n for (const [id, obj] of snap.objects) {\n this.objects.set(id, { ...obj } as Scene3DObject);\n }\n this.order = [...snap.order];\n this.counter = snap.counter;\n this.listeners.reset.forEach((cb) => cb());\n for (const id of this.order) {\n const obj = this.objects.get(id);\n if (obj) this.listeners.add.forEach((cb) => cb(obj));\n }\n }\n\n private capture(): void {\n if (this.historySuspended) return;\n this.historyPast.push(this.snapshot());\n this.historyFuture = [];\n this.notifyHistoryChange();\n }\n\n canUndo(): boolean {\n return this.historyPast.length > 0;\n }\n\n canRedo(): boolean {\n return this.historyFuture.length > 0;\n }\n\n undo(): void {\n const prev = this.historyPast.pop();\n if (!prev) return;\n this.historyFuture.push(this.snapshot());\n this.restore(prev);\n this.notifyHistoryChange();\n }\n\n redo(): void {\n const next = this.historyFuture.pop();\n if (!next) return;\n this.historyPast.push(this.snapshot());\n this.restore(next);\n this.notifyHistoryChange();\n }\n\n withoutHistory(fn: () => void): void {\n const prev = this.historySuspended;\n this.historySuspended = true;\n try {\n fn();\n } finally {\n this.historySuspended = prev;\n }\n }\n\n pushUndoCheckpoint(prev: SceneSnapshot): void {\n if (this.historySuspended) return;\n this.historyPast.push(prev);\n this.historyFuture = [];\n this.notifyHistoryChange();\n }\n\n onHistoryChange(cb: () => void): () => void {\n this.historyListeners.add(cb);\n return () => {\n this.historyListeners.delete(cb);\n };\n }\n\n private notifyHistoryChange(): void {\n this.historyListeners.forEach((cb) => cb());\n }\n}\n","import { Scene3D } from './Scene3D';\nimport type { Constraint, Scene3DObject } from './types';\nimport type { SerializedBoard3D, SerializedElement3D } from '../../serialize';\nimport { constraintToWorld } from './constraintMath';\n\n/**\n * Translate a live Scene3D into a v2 SerializedBoard3D.\n *\n * Strategy: each Scene3DObject becomes one or more SerializedElement3D entries.\n * Points carry an explicit `constraint` field. Derived objects (segment/line/\n * polygon/...) reference the point ids via `attributes.sceneSpec` so\n * round-trip is unambiguous, and `parents` is left empty (the loader\n * reconstructs from `sceneSpec` rather than `parents` at load time).\n */\nexport function sceneToBoard(\n scene: Scene3D,\n view: { azimuth: number; elevation: number; bbox3D: [number, number, number, number, number, number] },\n bbox: [number, number, number, number],\n): SerializedBoard3D {\n const elements: SerializedElement3D[] = [];\n for (const obj of scene.list()) {\n const els = sceneObjectToElements(obj, scene);\n elements.push(...els);\n }\n return { version: 2, bbox, view, showAxes: true, showMesh: true, elements };\n}\n\nfunction sceneObjectToElements(obj: Scene3DObject, scene: Scene3D): SerializedElement3D[] {\n const baseAttrs = { label: obj.label, visible: obj.visible, color: obj.color };\n switch (obj.kind) {\n case 'point': {\n let w: [number, number, number];\n try {\n w = constraintToWorld(obj.constraint, scene);\n } catch {\n // If dependent objects are missing, fall back to origin so the entry\n // still serializes; loader uses `constraint` (not parents) for v2.\n w = [0, 0, 0];\n }\n return [{\n type: 'point3d',\n parents: [w[0], w[1], w[2]],\n attributes: { id: obj.id, ...baseAttrs },\n id: obj.id,\n label: obj.label,\n constraint: obj.constraint,\n }];\n }\n case 'segment':\n case 'line':\n case 'ray':\n case 'vector':\n case 'plane':\n case 'sphere':\n case 'polygon':\n case 'polyhedron':\n case 'cylinder':\n case 'cone': {\n return [{\n type: pickJxgType(obj.kind),\n parents: [],\n attributes: { id: obj.id, ...baseAttrs, sceneKind: obj.kind, sceneSpec: encodeSpec(obj) },\n id: obj.id,\n label: obj.label,\n }];\n }\n }\n}\n\nfunction pickJxgType(kind: Scene3DObject['kind']): SerializedElement3D['type'] {\n switch (kind) {\n case 'point': return 'point3d';\n case 'segment':\n case 'line':\n case 'ray':\n case 'vector': return 'line3d';\n case 'plane': return 'plane3d';\n case 'sphere': return 'sphere3d';\n case 'polygon':\n case 'polyhedron':\n case 'cylinder':\n case 'cone': return 'polygon3d';\n }\n}\n\nfunction encodeSpec(obj: Scene3DObject): Record<string, unknown> {\n // Strip the base/identity fields; the rest is the kind-specific spec that\n // boardToScene needs to reconstruct the object. `kind` is preserved in the\n // sibling `sceneKind` attribute so it isn't duplicated here.\n const rest: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (k === 'id' || k === 'label' || k === 'visible' || k === 'color' || k === 'kind') continue;\n rest[k] = v;\n }\n return rest;\n}\n\n/**\n * Reconstruct a Scene3D from a SerializedBoard3D. Accepts both v1 (legacy,\n * no constraints) and v2 (new format).\n *\n * For v1: every point3d becomes `kind: 'free'`, and derived objects with our\n * `sceneSpec` attribute are skipped (legacy stamps don't carry sceneSpec, so\n * the loop won't see them; this is correct).\n *\n * For v2: each element carries `constraint` (points) or `sceneSpec` (derived)\n * and we reconstruct the full Scene3DObject.\n */\nexport function boardToScene(board: SerializedBoard3D): Scene3D {\n const scene = new Scene3D();\n for (const el of board.elements) {\n if (el.type === 'point3d') {\n const constraint: Constraint = el.constraint ?? {\n kind: 'free',\n x: Number(el.parents[0] ?? 0),\n y: Number(el.parents[1] ?? 0),\n z: Number(el.parents[2] ?? 0),\n };\n const color = (el.attributes['color'] as string | undefined);\n const visible = el.attributes['visible'] !== false;\n try {\n scene.insert({\n kind: 'point',\n id: el.id,\n label: el.label ?? el.id,\n visible,\n color,\n constraint,\n });\n } catch {\n // Skip duplicates / malformed.\n }\n continue;\n }\n // Derived object — only v2 carries `sceneSpec`\n const sceneKind = el.attributes['sceneKind'] as string | undefined;\n const sceneSpec = el.attributes['sceneSpec'] as Record<string, unknown> | undefined;\n if (!sceneKind || !sceneSpec) continue;\n const color = el.attributes['color'] as string | undefined;\n const visible = el.attributes['visible'] !== false;\n const obj = {\n id: el.id,\n label: el.label ?? el.id,\n visible,\n color,\n kind: sceneKind,\n ...sceneSpec,\n } as unknown as Scene3DObject;\n try {\n scene.insert(obj);\n } catch {\n // Skip malformed entries / duplicates.\n }\n }\n return scene;\n}\n","'use client';\nimport * as React from 'react';\nimport { Scene3D, type SceneSnapshot } from './scene/Scene3D';\nimport { ToolController } from './tools/controller';\nimport { JxgRenderer } from './renderer/JxgRenderer';\nimport { hitTest } from './hitTest/hitTest';\nimport { screenToRay } from './hitTest/rayCast';\nimport { rayPlane } from './hitTest/intersect';\nimport { constraintToWorld } from './scene/constraintMath';\nimport { hitToConstraint } from './tools/handlers/_ensurePoint';\nimport type { Constraint, Vec3 } from './scene/types';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport { StatusHint } from './StatusHint';\nimport { DEFAULT_VIEW3D } from './theme';\nimport type { ToolKey } from './tools/spec';\nimport type { SerializedBoard3D } from '../serialize';\nimport { sceneToBoard, boardToScene } from './scene/persistence';\n\nexport interface EditorPanelProps {\n isDark?: boolean;\n initialState?: SerializedBoard3D | null;\n onInsert?: (board: SerializedBoard3D, svgWidth: number, svgHeight: number, svgString: string) => void;\n /** Scene created by host (so LeftPanel sibling can share it). */\n scene: Scene3D;\n /** Currently selected tool — controlled by host. */\n selectedTool: ToolKey;\n /** Host gets notified when the controller switches the active tool. */\n onSelectedToolChange: (k: ToolKey) => void;\n showAxis: boolean;\n showGrid: boolean;\n onReadyChange?: (ready: boolean) => void;\n /** Notifies the host when undo/redo availability changes (for wiring buttons). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n}\n\nexport interface EditorPanelHandle {\n hasContent: () => boolean;\n /** Returns the current scene as a SerializedBoard3D. */\n serialize: () => SerializedBoard3D;\n /** Select a tool by key (for chord shortcut / host control). */\n setTool: (k: ToolKey) => void;\n /** Trigger an undo on the scene's history stack. */\n undo: () => void;\n /** Trigger a redo on the scene's history stack. */\n redo: () => void;\n}\n\nexport const EditorPanel = React.forwardRef<EditorPanelHandle, EditorPanelProps>(\n function EditorPanel(props, ref) {\n const {\n isDark: isDarkProp,\n initialState,\n scene,\n selectedTool,\n onSelectedToolChange,\n showAxis,\n showGrid,\n onReadyChange,\n onHistoryChange,\n } = props;\n const isDark = isDarkProp ?? false;\n const controllerRef = React.useRef<ToolController | null>(null);\n if (!controllerRef.current) controllerRef.current = new ToolController(scene);\n\n const [hint, setHint] = React.useState<string>('Chọn công cụ trong bảng bên trái');\n const [hoverLabel, setHoverLabel] = React.useState<string | null>(null);\n\n const boardRef = React.useRef<MiniBoard3DHandle | null>(null);\n const rendererRef = React.useRef<JxgRenderer | null>(null);\n\n const onSelectedToolChangeRef = React.useRef(onSelectedToolChange);\n onSelectedToolChangeRef.current = onSelectedToolChange;\n\n const onHistoryChangeRef = React.useRef(onHistoryChange);\n onHistoryChangeRef.current = onHistoryChange;\n\n // Latest selectedTool — read inside drag callbacks to avoid stale closures.\n const selectedToolRef = React.useRef(selectedTool);\n selectedToolRef.current = selectedTool;\n\n // Point-drag state: which point is being dragged, starting screen + world,\n // plus a scene snapshot captured before any mutation (used for undo\n // checkpoints on drag-end).\n const draggedPointRef = React.useRef<string | null>(null);\n const dragStartRef = React.useRef<{ screen: { x: number; y: number }; world: Vec3 } | null>(null);\n const dragSnapshotRef = React.useRef<SceneSnapshot | null>(null);\n\n // Initial state load — wrap in withoutHistory so loading doesn't pollute\n // the undo stack with phantom \"insert\" entries.\n React.useEffect(() => {\n if (initialState) {\n const loaded = boardToScene(initialState);\n scene.withoutHistory(() => {\n scene.reset();\n for (const obj of loaded.list()) {\n scene.insert(obj);\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Subscribe to controller state changes for hint + selected-tool updates.\n React.useEffect(() => {\n const ctrl = controllerRef.current!;\n const unsub = ctrl.on((state) => {\n setHint(state.hint);\n onSelectedToolChangeRef.current(state.tool?.key ?? 'move');\n });\n return unsub;\n }, []);\n\n // Subscribe to history changes — propagate canUndo/canRedo upward.\n React.useEffect(() => {\n // Emit initial state once for the host's UI.\n onHistoryChangeRef.current?.(scene.canUndo(), scene.canRedo());\n const unsub = scene.onHistoryChange(() => {\n onHistoryChangeRef.current?.(scene.canUndo(), scene.canRedo());\n });\n return unsub;\n }, [scene]);\n\n // Sync controller when host changes selectedTool from outside (e.g. chord shortcut).\n React.useEffect(() => {\n controllerRef.current?.selectTool(selectedTool);\n }, [selectedTool]);\n\n // Global keyboard shortcuts: Ctrl/Cmd+Z, Ctrl/Cmd+Shift+Z, Ctrl+Y.\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n if (inField) return;\n if (!(e.metaKey || e.ctrlKey)) return;\n const key = e.key.toLowerCase();\n if (key === 'z' && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n scene.undo();\n } else if ((key === 'z' && e.shiftKey) || (key === 'y' && !e.shiftKey)) {\n e.preventDefault();\n e.stopPropagation();\n scene.redo();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [scene]);\n\n // Dispose renderer on unmount.\n React.useEffect(() => {\n return () => {\n rendererRef.current?.dispose();\n rendererRef.current = null;\n };\n }, []);\n\n // Apply showAxis / showGrid to the JSXGraph view3d when it (or the state) changes.\n React.useEffect(() => {\n const view = boardRef.current?.getView3D();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n if (!v || typeof v.setAttribute !== 'function') return;\n try {\n v.setAttribute({\n xAxis: { visible: showAxis },\n yAxis: { visible: showAxis },\n zAxis: { visible: showAxis },\n // GeoGebra-style: only the XY ground plane is shown; side walls stay hidden.\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: showGrid, mesh3d: { visible: false } },\n });\n v.board?.update?.();\n } catch {\n /* swallow — older JSXGraph / mocks may not support runtime attr changes */\n }\n }, [showAxis, showGrid]);\n\n const handleView3DReady = React.useCallback((view: unknown) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rendererRef.current = new JxgRenderer(scene, view as any);\n // Restore saved azimuth/elevation khi mở lại stamp cũ để re-edit, để\n // editor view khớp với ảnh đã chèn.\n if (initialState) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n v?.az_slide?.setValue?.(initialState.view.azimuth);\n v?.el_slide?.setValue?.(initialState.view.elevation);\n v?.board?.update?.();\n } catch {\n /* swallow — older JSXGraph may not expose az_slide */\n }\n }\n onReadyChange?.(true);\n }, [onReadyChange, scene, initialState]);\n\n const handleClick = React.useCallback((screen: { x: number; y: number }) => {\n const board = boardRef.current;\n if (!board) return;\n const view = board.getView3D();\n if (!view) return;\n try {\n const hit = hitTest(screen, view, scene);\n controllerRef.current!.consumeHit(hit);\n } catch {\n /* swallow — view may not yet expose project3DTo2D in some mock paths */\n }\n }, [scene]);\n\n const handleMove = React.useCallback((screen: { x: number; y: number }) => {\n const board = boardRef.current;\n if (!board) return;\n const view = board.getView3D();\n if (!view) return;\n // Suppress hover label updates while a drag is in progress.\n if (draggedPointRef.current) return;\n let hit;\n try {\n hit = hitTest(screen, view, scene);\n } catch {\n setHoverLabel(null);\n return;\n }\n if (hit.kind === 'empty') setHoverLabel(null);\n else if (hit.kind === 'existingPoint') {\n const obj = scene.get(hit.pointId);\n setHoverLabel(obj?.label ?? null);\n } else if (hit.kind === 'onGround') setHoverLabel('mặt nền');\n else if (hit.kind === 'onAxis') setHoverLabel(`trục ${hit.axis.toUpperCase()}`);\n else if (hit.kind === 'onPlane') setHoverLabel(`mặt phẳng ${hit.planeId}`);\n else if (hit.kind === 'onSphere') setHoverLabel(`mặt cầu ${hit.sphereId}`);\n else setHoverLabel(null);\n }, [scene]);\n\n // ─── Point-drag handlers (delegated from MiniBoard3D) ────────────────────\n // Decides whether the pointerdown gesture is \"ours\" (drag/place a point)\n // or should fall through to MiniBoard3D's default view-rotate behaviour.\n // Returning true also suppresses view rotation for the rest of the gesture.\n // Captures a scene snapshot before any mutation so onPointerDragEnd can\n // push a single undo checkpoint for the whole gesture.\n const shouldStartPointDrag = React.useCallback((screen: { x: number; y: number }): boolean => {\n const view = boardRef.current?.getView3D();\n if (!view) return false;\n const tool = selectedToolRef.current;\n if (tool !== 'point' && tool !== 'move') return false;\n let hit;\n try { hit = hitTest(screen, view, scene); } catch { return false; }\n\n // Existing point: drag it (Z-only in Point mode, XY-raycast in Move mode).\n // Snapshot before any mutation, drag-end will push a checkpoint.\n if (hit.kind === 'existingPoint') {\n const pt = scene.get(hit.pointId);\n if (!pt || pt.kind !== 'point') return false;\n dragSnapshotRef.current = scene.snapshot();\n draggedPointRef.current = hit.pointId;\n dragStartRef.current = {\n screen,\n world: constraintToWorld(pt.constraint, scene),\n };\n return true;\n }\n\n // Point tool: place-and-lift gesture. Capture snapshot first, then\n // create the point inside withoutHistory so only the drag-end checkpoint\n // ends up on the undo stack (otherwise addPoint would push an extra one).\n // Bypasses the controller (Point tool has repeatAfterBuild so there's no\n // collected-state to unwind); the click→consumeHit→buildPoint path is\n // short-circuited in MiniBoard3D.handlePointerUp when pointDragMode is set.\n if (tool === 'point' && (hit.kind === 'onGround' || hit.kind === 'onAxis')) {\n dragSnapshotRef.current = scene.snapshot();\n const constraint = hitToConstraint(hit);\n if (!constraint) {\n dragSnapshotRef.current = null;\n return false;\n }\n let id: string | null = null;\n scene.withoutHistory(() => {\n id = scene.addPoint(constraint);\n });\n if (!id) {\n dragSnapshotRef.current = null;\n return false;\n }\n draggedPointRef.current = id;\n dragStartRef.current = {\n screen,\n world: [hit.world[0], hit.world[1], hit.world[2]],\n };\n return true;\n }\n\n // Point tool but non-placeable surface (sphere/plane/empty): suppress\n // view rotation so the camera never rotates accidentally while the user\n // is placing points, but don't enter a drag. Clear snapshot defensively.\n if (tool === 'point') {\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n return true;\n }\n\n return false;\n }, [scene]);\n\n const onPointerDrag = React.useCallback((screen: { x: number; y: number }) => {\n const pointId = draggedPointRef.current;\n const start = dragStartRef.current;\n if (!pointId || !start) return;\n const view = boardRef.current?.getView3D();\n if (!view) return;\n const tool = selectedToolRef.current;\n let nextWorld: Vec3;\n if (tool === 'point') {\n // Vertical lift only: keep starting X,Y; map screen-Y delta to world Z\n // 1:1 in user-space (pixelToUser already inverts Y).\n const dz = screen.y - start.screen.y;\n nextWorld = [start.world[0], start.world[1], start.world[2] + dz];\n } else if (tool === 'move') {\n // Free move on the horizontal plane at the point's starting Z.\n try {\n const ray = screenToRay(screen, view);\n const hit = rayPlane(ray, { point: [0, 0, start.world[2]], normal: [0, 0, 1] });\n if (!hit) return;\n nextWorld = [hit.point[0], hit.point[1], start.world[2]];\n } catch { return; }\n } else {\n return;\n }\n const obj = scene.get(pointId);\n if (!obj || obj.kind !== 'point') return;\n const free: Constraint = { kind: 'free', x: nextWorld[0], y: nextWorld[1], z: nextWorld[2] };\n (obj as { constraint: Constraint }).constraint = free;\n scene.emitChange(pointId);\n }, [scene]);\n\n const onPointerDragEnd = React.useCallback(() => {\n const snap = dragSnapshotRef.current;\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n if (snap) {\n scene.pushUndoCheckpoint(snap);\n }\n }, [scene]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n hasContent: () => scene.list().length > 0,\n serialize: () => {\n const view = boardRef.current?.getView3D();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = view as any;\n const azSlider = v?.az_slide ?? v?.az;\n const elSlider = v?.el_slide ?? v?.el;\n const azimuth = typeof azSlider?.Value === 'function' ? azSlider.Value() : 0;\n const elevation = typeof elSlider?.Value === 'function' ? elSlider.Value() : 0;\n return sceneToBoard(\n scene,\n { azimuth, elevation, bbox3D: [...DEFAULT_VIEW3D.bbox3D] as [number, number, number, number, number, number] },\n // JSXGraph boundingbox order: [xmin, ymax, xmax, ymin]. Must match\n // MiniBoard3D.initBoard so render reproduces the editor's view.\n [-6, 6, 6, -6],\n );\n },\n setTool: (k) => controllerRef.current!.selectTool(k),\n undo: () => scene.undo(),\n redo: () => scene.redo(),\n }),\n [scene],\n );\n\n return (\n <div\n data-testid=\"editor-panel-3d\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'flex h-full w-full min-w-0 flex-col overflow-hidden bg-white',\n ].join('')}\n >\n <div className=\"min-h-0 flex-1\">\n <MiniBoard3D\n ref={boardRef}\n isDark={isDark}\n onView3DReady={handleView3DReady}\n onPointerClick={handleClick}\n onPointerMove={handleMove}\n onPointerLeave={() => setHoverLabel(null)}\n shouldStartPointDrag={shouldStartPointDrag}\n onPointerDrag={onPointerDrag}\n onPointerDragEnd={onPointerDragEnd}\n />\n </div>\n <StatusHint hint={hint} hoverLabel={hoverLabel} />\n </div>\n );\n },\n);\n","'use client';\nimport * as React from 'react';\nimport type { ToolKey } from '../tools/spec';\n\nexport interface ToolButtonProps {\n toolKey: ToolKey;\n label: string;\n selected: boolean;\n onClick: (key: ToolKey) => void;\n icon?: React.ReactNode;\n /** Chord-mode positional digit (1..9) overlaid bottom-right. */\n chordNum?: number | null;\n /** Highlight ring when its parent group is the active chord group. */\n chordActiveGroup?: boolean;\n onMouseEnter?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n onMouseLeave?: () => void;\n}\n\nexport function ToolButton(props: ToolButtonProps): React.ReactElement {\n const {\n toolKey,\n label,\n selected,\n onClick,\n icon,\n chordNum,\n chordActiveGroup,\n onMouseEnter,\n onMouseLeave,\n } = props;\n return (\n <button\n type=\"button\"\n data-tool-key={toolKey}\n data-testid={`tool-${toolKey}`}\n aria-label={label}\n aria-pressed={selected}\n onClick={() => onClick(toolKey)}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n className={[\n 'relative flex aspect-square items-center justify-center rounded-md transition',\n selected\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n <span aria-hidden className=\"inline-flex\">\n {icon ?? null}\n </span>\n {chordNum != null && (\n <span\n data-testid={`chord-num-${toolKey}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n selected\n ? 'text-white/70'\n : chordActiveGroup\n ? 'text-emerald-700'\n : 'text-slate-300',\n ].join(' ')}\n >\n {chordNum}\n </span>\n )}\n </button>\n );\n}\n","import * as React from 'react';\nimport type { ToolKey } from '../tools/spec';\n\nconst wrap = (children: React.ReactNode): React.ReactElement => (\n <svg\n width=\"18\"\n height=\"18\"\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 {children}\n </svg>\n);\n\nconst dot = (cx: number, cy: number, r = 1.4): React.ReactElement => (\n <circle cx={cx} cy={cy} r={r} fill=\"currentColor\" stroke=\"none\" />\n);\n\nexport const ToolIcons: Record<ToolKey, React.ReactElement> = {\n move: wrap(\n <>\n <path d=\"M5 4 L5 14 L8 11 L10 16 L13 15 L11 10 L15 10 Z\" />\n </>,\n ),\n point: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n pointOnObject: wrap(\n <>\n <path d=\"M3 16 L21 12\" />\n <circle cx=\"12\" cy=\"13.5\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n segment: wrap(\n <>\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"6\" />\n {dot(4, 18, 1.6)}\n {dot(20, 6, 1.6)}\n </>,\n ),\n line: wrap(\n <>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"6\" />\n {dot(8, 14.5, 1.4)}\n {dot(16, 9.5, 1.4)}\n </>,\n ),\n ray: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"7\" />\n <path d=\"M19 7 L15 6 M19 7 L18 11\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n vector: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"18\" y2=\"7\" />\n <path d=\"M18 7 L13 7 M18 7 L18 12\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n polygon: wrap(\n <>\n <polygon points=\"12,4 20,10 17,19 7,19 4,10\" />\n </>,\n ),\n plane: wrap(\n <>\n <polygon points=\"3,9 14,5 21,11 10,15\" />\n </>,\n ),\n pyramid: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 4 Z\" />\n <path d=\"M4 19 L12 16 L20 19\" />\n <path d=\"M12 4 L12 16\" strokeDasharray=\"2 2\" />\n </>,\n ),\n prism: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n <path d=\"M4 8 L14 8\" />\n </>,\n ),\n tetrahedron: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 5 Z\" />\n <path d=\"M4 19 L15 12 L20 19\" />\n <path d=\"M15 12 L12 5\" />\n </>,\n ),\n cube: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n </>,\n ),\n sphere: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"3\" />\n {dot(12, 12, 1.2)}\n </>,\n ),\n cylinder: wrap(\n <>\n <ellipse cx=\"12\" cy=\"6\" rx=\"6\" ry=\"2\" />\n <path d=\"M6 6 L6 18\" />\n <path d=\"M18 6 L18 18\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"6\" ry=\"2\" />\n </>,\n ),\n cone: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <line x1=\"19\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"7\" ry=\"2\" />\n </>,\n ),\n};\n","import { TOOLS, type ToolKey, type ToolSpec } from '../tools/spec';\n\nexport type Geom3DGroup =\n | 'basic'\n | 'point'\n | 'line'\n | 'plane'\n | 'polyhedron'\n | 'curve';\n\nexport const GROUP_ORDER: Geom3DGroup[] = [\n 'basic',\n 'point',\n 'line',\n 'plane',\n 'polyhedron',\n 'curve',\n];\n\nexport const GROUP_LABELS: Record<Geom3DGroup, string> = {\n basic: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường thẳng',\n plane: 'Mặt phẳng',\n polyhedron: 'Khối đa diện',\n curve: 'Khối cong',\n};\n\nexport const TOOLS_BY_GROUP: Record<Geom3DGroup, ToolKey[]> = {\n basic: ['move'],\n point: ['point', 'pointOnObject'],\n line: ['segment', 'line', 'ray', 'vector', 'polygon'],\n plane: ['plane'],\n polyhedron: ['pyramid', 'prism', 'tetrahedron', 'cube'],\n curve: ['sphere', 'cylinder', 'cone'],\n};\n\nexport interface Geom3DToolEntry {\n key: ToolKey;\n label: string;\n hint: string;\n group: Geom3DGroup;\n}\n\nconst SPEC_BY_KEY: Record<ToolKey, ToolSpec> = TOOLS.reduce(\n (acc, t) => {\n acc[t.key] = t;\n return acc;\n },\n {} as Record<ToolKey, ToolSpec>,\n);\n\nexport const TOOLS_FLAT: Geom3DToolEntry[] = GROUP_ORDER.flatMap((group) =>\n TOOLS_BY_GROUP[group].map((key) => {\n const spec = SPEC_BY_KEY[key];\n return {\n key,\n label: spec?.label ?? key,\n hint: spec?.hintIdle ?? '',\n group,\n };\n }),\n);\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: Geom3DGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n","'use client';\nimport * as React from 'react';\nimport { ToolButton } from './ToolButton';\nimport { ToolIcons } from './icons';\nimport {\n GROUP_LABELS,\n GROUP_ORDER,\n TOOLS_BY_GROUP,\n letterForGroup,\n type Geom3DGroup,\n} from './groups';\nimport { TOOLS, type ToolKey } from '../tools/spec';\n\nexport interface ToolPaletteProps {\n selected: ToolKey;\n onSelect: (key: ToolKey) => void;\n chordGroup?: Geom3DGroup | null;\n onHoverTool?: (info: { label: string; hint?: string; x: number; y: number } | null) => void;\n}\n\nexport function ToolPalette(props: ToolPaletteProps): React.ReactElement {\n const { selected, onSelect, chordGroup = null, onHoverTool } = props;\n return (\n <div data-testid=\"tool-palette\" className=\"flex flex-col gap-3\">\n {GROUP_ORDER.map((group) => {\n const keys = TOOLS_BY_GROUP[group];\n const isChordActive = chordGroup === group;\n const dimmed = chordGroup !== null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive\n ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1'\n : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{GROUP_LABELS[group]}</span>\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {letterForGroup(group)}\n </span>\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {keys.map((k, i) => {\n const tool = TOOLS.find((t) => t.key === k)!;\n return (\n <ToolButton\n key={k}\n toolKey={k}\n label={tool.label}\n selected={selected === k}\n onClick={onSelect}\n icon={ToolIcons[k]}\n chordNum={i + 1}\n chordActiveGroup={isChordActive}\n onMouseEnter={(e) =>\n onHoverTool?.({\n label: tool.label,\n hint: tool.hintIdle,\n x: e.clientX,\n y: e.clientY,\n })\n }\n onMouseLeave={() => onHoverTool?.(null)}\n />\n );\n })}\n </div>\n </section>\n );\n })}\n </div>\n );\n}\n","import type { Scene3DObject } from '../scene/types';\nimport type { Scene3D } from '../scene/Scene3D';\nimport { constraintToWorld } from '../scene/constraintMath';\n\nexport function symbolicFor(obj: Scene3DObject, scene: Scene3D): string {\n const n = (id: string): string => scene.get(id)?.label ?? id;\n switch (obj.kind) {\n case 'point': {\n const c = obj.constraint;\n switch (c.kind) {\n case 'free': return 'Point';\n case 'onGround': return 'Point(xyPlane)';\n case 'onAxis': return `Point(${c.axis}Axis)`;\n case 'onPlane': return `Point(${n(c.planeId)})`;\n case 'onLine': return `Point(${n(c.lineId)})`;\n case 'onPolygon': return `Point(${n(c.polygonId)})`;\n case 'onSphere': return `Point(${n(c.sphereId)})`;\n }\n return 'Point';\n }\n case 'segment': return `Segment(${n(obj.p1)}, ${n(obj.p2)})`;\n case 'line': return `Line(${n(obj.p1)}, ${n(obj.p2)})`;\n case 'ray': return `Ray(${n(obj.origin)}, ${n(obj.through)})`;\n case 'vector': return `Vector(${n(obj.from)}, ${n(obj.to)})`;\n case 'polygon': return `Polygon(${obj.vertices.map(n).join(', ')})`;\n case 'plane': return `Plane(${n(obj.p1)}, ${n(obj.p2)}, ${n(obj.p3)})`;\n case 'sphere': return `Sphere(${n(obj.center)}, ${n(obj.surfacePoint)})`;\n case 'polyhedron': {\n const flavorVn: Record<typeof obj.flavor, string> = {\n pyramid: 'Chóp', prism: 'Lăng trụ', tetrahedron: 'Tứ diện', cube: 'Lập phương',\n };\n return `${flavorVn[obj.flavor]}(${obj.vertices.length} đỉnh)`;\n }\n case 'cylinder': return `Cylinder(${n(obj.baseCenter)}, ${n(obj.topCenter)}, r=${obj.radius})`;\n case 'cone': return `Cone(${n(obj.baseCenter)}, ${n(obj.apex)}, r=${obj.radius})`;\n }\n}\n\n/**\n * Compact numeric value display for an object. Free / surface-projected points\n * show their world position; non-points show a summary.\n */\nexport function numericFor(obj: Scene3DObject, scene: Scene3D): string {\n if (obj.kind === 'point') {\n const w = constraintToWorld(obj.constraint, scene);\n return `(${round(w[0])}, ${round(w[1])}, ${round(w[2])})`;\n }\n return '';\n}\n\nfunction round(x: number): string {\n return Math.abs(x) < 1e-9 ? '0' : (Math.round(x * 100) / 100).toString();\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface RowMenuProps {\n onRename: () => void;\n onChangeColor: () => void;\n onToggleVisibility: () => void;\n onDelete: () => void;\n visible: boolean;\n}\n\nexport function RowMenu(props: RowMenuProps): React.ReactElement {\n const [open, setOpen] = React.useState(false);\n return (\n <div className=\"relative inline-block\">\n <button\n type=\"button\"\n aria-label=\"Row menu\"\n onClick={() => setOpen((v) => !v)}\n className=\"rounded px-1.5 text-zinc-500 hover:bg-zinc-100 dark:hover:bg-zinc-800\"\n >\n ⋮\n </button>\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-10 mt-1 w-40 rounded-md border border-zinc-200 bg-white py-1 text-xs shadow-lg dark:border-zinc-700 dark:bg-zinc-900\"\n >\n <MenuItem onClick={() => { setOpen(false); props.onRename(); }}>Đổi tên</MenuItem>\n <MenuItem onClick={() => { setOpen(false); props.onChangeColor(); }}>Đổi màu</MenuItem>\n <MenuItem onClick={() => { setOpen(false); props.onToggleVisibility(); }}>\n {props.visible ? 'Ẩn' : 'Hiện'}\n </MenuItem>\n <MenuItem onClick={() => { setOpen(false); props.onDelete(); }} className=\"text-red-600\">\n Xoá\n </MenuItem>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MenuItem({ children, onClick, className }: React.PropsWithChildren<{ onClick: () => void; className?: string }>) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={onClick}\n className={`block w-full px-3 py-1 text-left hover:bg-zinc-100 dark:hover:bg-zinc-800 ${className ?? ''}`}\n >\n {children}\n </button>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Scene3DObject } from '../scene/types';\nimport type { Scene3D } from '../scene/Scene3D';\nimport { symbolicFor, numericFor } from './symbolic';\nimport { RowMenu } from './RowMenu';\n\nexport interface AlgebraRowProps {\n obj: Scene3DObject;\n scene: Scene3D;\n onDelete: (id: string) => void;\n}\n\nexport function AlgebraRow(props: AlgebraRowProps): React.ReactElement {\n const { obj, scene, onDelete } = props;\n const symbolic = symbolicFor(obj, scene);\n const numeric = numericFor(obj, scene);\n return (\n <li\n data-testid={`algebra-row-${obj.id}`}\n className=\"flex items-center gap-2 border-b border-zinc-100 px-3 py-1.5 text-xs dark:border-zinc-800\"\n >\n <span\n aria-hidden\n className=\"inline-block size-3 rounded-full border\"\n style={{ backgroundColor: obj.color ?? '#0066cc' }}\n />\n <span className=\"min-w-[3ch] font-semibold\">{obj.label}</span>\n <span className=\"text-zinc-500\">=</span>\n <span className=\"flex-1 truncate font-mono\">{symbolic}</span>\n {numeric ? <span className=\"truncate text-zinc-500\">{numeric}</span> : null}\n <RowMenu\n visible={obj.visible}\n onRename={() => { /* no-op for now; wired in EditorPanel later */ }}\n onChangeColor={() => { /* no-op */ }}\n onToggleVisibility={() => { /* no-op */ }}\n onDelete={() => onDelete(obj.id)}\n />\n </li>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Scene3D } from '../scene/Scene3D';\nimport type { Scene3DObject } from '../scene/types';\nimport { AlgebraRow } from './AlgebraRow';\n\nexport interface AlgebraListProps {\n scene: Scene3D;\n}\n\nexport function AlgebraList(props: AlgebraListProps): React.ReactElement {\n const { scene } = props;\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\n\n React.useEffect(() => {\n const unsubAdd = scene.on('add', () => forceUpdate());\n const unsubChange = scene.on('change', () => forceUpdate());\n const unsubDelete = scene.on('delete', () => forceUpdate());\n const unsubReset = scene.on('reset', () => forceUpdate());\n return () => { unsubAdd(); unsubChange(); unsubDelete(); unsubReset(); };\n }, [scene]);\n\n const objects: Scene3DObject[] = scene.list();\n\n return (\n <ul\n data-testid=\"algebra-list\"\n className=\"flex max-h-[calc(100vh-200px)] flex-col overflow-y-auto\"\n >\n {objects.length === 0 ? (\n <li className=\"px-3 py-4 text-center text-xs text-zinc-500\">Chưa có đối tượng nào</li>\n ) : (\n objects.map((o) => (\n <AlgebraRow key={o.id} obj={o} scene={scene} onDelete={(id) => scene.delete(id)} />\n ))\n )}\n </ul>\n );\n}\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-6 w-6 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { ToolPalette } from './toolPanel/ToolPalette';\nimport { AlgebraList } from './algebraPanel/AlgebraList';\nimport { ToolIcons } from './toolPanel/icons';\nimport {\n GROUP_LABELS,\n GROUP_ORDER,\n TOOLS_BY_GROUP,\n letterForGroup,\n type Geom3DGroup,\n} from './toolPanel/groups';\nimport type { Scene3D } from './scene/Scene3D';\nimport { TOOLS, type ToolKey } from './tools/spec';\nimport {\n MobileToolDrawer,\n type MobileToolGroup,\n} from '../../shared/MobileToolDrawer';\n\nconst TOOLTIP_DELAY_MS = 400;\n\ntype HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\nexport interface LeftPanelProps {\n scene: Scene3D;\n selectedTool: ToolKey;\n onSelectTool: (k: ToolKey) => void;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n onClose: () => void;\n isDark?: boolean;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n chordGroup?: Geom3DGroup | null;\n}\n\nconst Geom3DIconHeader = (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nfunction AxisIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <line x1=\"4\" y1=\"20\" x2=\"16\" y2=\"8\" />\n </svg>\n );\n}\n\nfunction GridIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 8 L20 4\" />\n <path d=\"M4 14 L20 10\" />\n <path d=\"M4 20 L20 16\" />\n <path d=\"M4 8 L4 20\" />\n <path d=\"M12 6 L12 18\" />\n <path d=\"M20 4 L20 16\" />\n </svg>\n );\n}\n\nexport function UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nexport function RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\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\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=\"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-3\">{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\nfunction useToolHoverTooltip() {\n const [hover, setHover] = React.useState<HoverState>(null);\n const [portalReady, setPortalReady] = React.useState(false);\n const hoverTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n React.useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = React.useCallback((next: NonNullable<HoverState>) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => setHover(next), TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = React.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\ntype Tab = 'tools' | 'algebra';\n\nfunction DesktopPanel(props: LeftPanelProps) {\n const {\n scene,\n selectedTool,\n onSelectTool,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onRedo,\n canRedo,\n onClose,\n isDark,\n chordGroup,\n } = props;\n const [tab, setTab] = React.useState<Tab>('tools');\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n return (\n <>\n <Shell title=\"Hình học 3D\" icon={Geom3DIconHeader} onClose={onClose} isDark={isDark}>\n <div className=\"flex gap-1 rounded-md bg-slate-100 p-0.5\">\n <TabPill active={tab === 'tools'} onClick={() => setTab('tools')} testId=\"tab-tools\">\n 🧰 Công cụ\n </TabPill>\n <TabPill active={tab === 'algebra'} onClick={() => setTab('algebra')} testId=\"tab-algebra\">\n 📐 Đối tượng\n </TabPill>\n </div>\n\n {tab === 'tools' ? (\n <>\n <Section label=\"Góc nhìn\">\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\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 <div className=\"ml-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n </div>\n </Section>\n\n <ToolPalette\n selected={selectedTool}\n onSelect={onSelectTool}\n chordGroup={chordGroup ?? null}\n onHoverTool={(info) => (info ? showHover(info) : hideHover())}\n />\n\n {chordGroup && (\n <div\n data-testid=\"chord-hint\"\n className=\"rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {letterForGroup(chordGroup)}\n </span>\n <span className=\"ml-1.5\">\n → {GROUP_LABELS[chordGroup]}. Bấm số 1-9 để chọn công cụ, Esc huỷ.\n </span>\n </div>\n )}\n </>\n ) : (\n <section data-testid=\"algebra-panel\">\n <AlgebraList scene={scene} />\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\nfunction TabPill({\n active,\n onClick,\n testId,\n children,\n}: React.PropsWithChildren<{ active: boolean; onClick: () => void; testId?: string }>) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-pressed={active}\n data-testid={testId}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n active\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nfunction MobilePanel(props: LeftPanelProps) {\n const {\n selectedTool,\n onSelectTool,\n showAxis,\n showGrid,\n onShowAxisChange,\n onShowGridChange,\n onUndo,\n canUndo,\n onRedo,\n canRedo,\n isDark,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = React.useMemo<MobileToolGroup<ToolKey, Geom3DGroup>[]>(\n () =>\n GROUP_ORDER.map((group) => {\n const keys = TOOLS_BY_GROUP[group];\n return {\n group,\n groupLabel: GROUP_LABELS[group],\n tools: keys.map((k) => {\n const tool = TOOLS.find((t) => t.key === k)!;\n return { key: k, label: tool.label, icon: ToolIcons[k] };\n }),\n };\n }),\n [],\n );\n\n return (\n <MobileToolDrawer\n title=\"Hình học 3D\"\n headerIcon={Geom3DIconHeader}\n testId=\"left-panel\"\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={[\n {\n label: 'Trục',\n icon: <AxisIcon />,\n pressed: showAxis,\n onToggle: onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: 'Lưới',\n icon: <GridIcon />,\n pressed: showGrid,\n onToggle: onShowGridChange,\n testId: 'toggle-grid',\n },\n ]}\n actions={[\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: onUndo,\n disabled: !canUndo,\n testId: 'undo-btn',\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: onRedo,\n disabled: !canRedo,\n testId: 'redo-btn',\n },\n ]}\n groups={groups}\n activeTool={selectedTool}\n onToolSelect={onSelectTool}\n />\n );\n}\n\nexport function LeftPanel(props: LeftPanelProps): React.ReactElement {\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 type React from 'react';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { EditorPanel, type EditorPanelHandle } from './editor/EditorPanel';\nimport { LeftPanel } from './editor/LeftPanel';\nimport { Scene3D } from './editor/scene/Scene3D';\nimport { GROUP_ORDER, TOOLS_FLAT } from './editor/toolPanel/groups';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { renderGeometry3DSvgFromState } from './render';\nimport {\n isGeometry3DCustomData,\n parseSerializedBoard3D,\n serializeBoard3D,\n type Geometry3DCustomData,\n type SerializedBoard3D,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport type { ToolKey } from './editor/tools/spec';\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 sceneRef = useRef<Scene3D | null>(null);\n if (!sceneRef.current) sceneRef.current = new Scene3D();\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [ready, setReady] = useState(false);\n\n const [selectedTool, setSelectedTool] = useState<ToolKey>('move');\n const [showAxis, setShowAxis] = useState<boolean>(true);\n const [showGrid, setShowGrid] = useState<boolean>(true);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n const [hasContent, setHasContent] = useState<boolean>(false);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n useEffect(() => {\n const scene = sceneRef.current;\n if (!scene) return;\n const sync = () => setHasContent(scene.list().length > 0);\n sync();\n const unsubs = [\n scene.on('add', sync),\n scene.on('delete', sync),\n scene.on('reset', sync),\n ];\n return () => {\n for (const u of unsubs) u();\n };\n }, []);\n\n const handleUndo = useCallback(() => {\n editorRef.current?.undo();\n }, []);\n\n const handleRedo = useCallback(() => {\n editorRef.current?.redo();\n }, []);\n\n const initial = useMemo(\n () => parseInitial(editingElement),\n [editingElement],\n );\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS_FLAT,\n onSelect: (key) => {\n setSelectedTool(key as ToolKey);\n editorRef.current?.setTool(key as ToolKey);\n },\n enabled: !isMobile,\n });\n\n const handleSelectTool = useCallback((k: ToolKey) => {\n setSelectedTool(k);\n editorRef.current?.setTool(k);\n }, []);\n\n const performInsert = useCallback(\n async (board: SerializedBoard3D, width: number, height: number, svgString: string) => {\n if (!api) return;\n const jsonState = serializeBoard3D(board);\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 const tryInsert = useCallback((): boolean => {\n if (!editorRef.current) return false;\n if (!editorRef.current.hasContent()) return false;\n const board = editorRef.current.serialize();\n if (board.elements.length === 0) return false;\n void (async () => {\n try {\n const jsonState = serializeBoard3D(board);\n const { svgString, width, height } = await renderGeometry3DSvgFromState(jsonState);\n await performInsert(board, width, height, svgString);\n } catch (err) {\n console.error('Geometry3D insert failed:', err);\n }\n })();\n return true;\n }, [performInsert]);\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [tryInsert],\n );\n\n const handleEditorInsert = useCallback(\n (board: SerializedBoard3D, width: number, height: number, svgString: string) => {\n void performInsert(board, width, height, svgString);\n },\n [performInsert],\n );\n\n const dialogStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: 'calc(50% + 120px)',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <>\n {!isMobile && (\n <LeftPanel\n scene={sceneRef.current}\n selectedTool={selectedTool}\n onSelectTool={handleSelectTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onShowAxisChange={setShowAxis}\n onShowGridChange={setShowGrid}\n onUndo={handleUndo}\n canUndo={canUndo}\n onRedo={handleRedo}\n canRedo={canRedo}\n onClose={onClose}\n isDark={isDark}\n chordGroup={chordGroup}\n />\n )}\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học 3D\"\n data-testid=\"geom3d-host\"\n data-stamp-area=\"true\"\n style={dialogStyle}\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-[800px] max-w-[calc(100vw-320px)] rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5',\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={() => setDrawerOpen(true)}\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 9 L4 20 L14 20 L14 9 Z M4 9 L10 4 L20 4 L14 9 Z M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n Dựng hình học không gian\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={tryInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"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 <div className=\"min-h-0 flex-1\">\n <EditorPanel\n ref={editorRef}\n isDark={isDark}\n initialState={initial}\n onInsert={handleEditorInsert}\n scene={sceneRef.current}\n selectedTool={selectedTool}\n onSelectedToolChange={setSelectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onReadyChange={setReady}\n onHistoryChange={handleHistoryChange}\n />\n </div>\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={tryInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geom3d-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n </div>\n {isMobile && (\n <LeftPanel\n scene={sceneRef.current}\n selectedTool={selectedTool}\n onSelectTool={handleSelectTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onShowAxisChange={setShowAxis}\n onShowGridChange={setShowGrid}\n onUndo={handleUndo}\n canUndo={canUndo}\n onRedo={handleRedo}\n canRedo={canRedo}\n onClose={onClose}\n isDark={isDark}\n isMobile\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n chordGroup={chordGroup}\n />\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"]}