@xom11/whiteboard 0.30.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai.d.mts +226 -32
- package/dist/ai.d.ts +226 -32
- package/dist/ai.js +5126 -351
- package/dist/ai.js.map +1 -1
- package/dist/ai.mjs +4970 -352
- package/dist/ai.mjs.map +1 -1
- package/dist/catalog.json +5 -5
- package/dist/{chunk-V3YJ6JFL.mjs → chunk-44JY2AKC.mjs} +3 -3
- package/dist/{chunk-V3YJ6JFL.mjs.map → chunk-44JY2AKC.mjs.map} +1 -1
- package/dist/{chunk-XVVLT6B3.mjs → chunk-BMYC2ILT.mjs} +4 -4
- package/dist/{chunk-XVVLT6B3.mjs.map → chunk-BMYC2ILT.mjs.map} +1 -1
- package/dist/{chunk-PPKHCRRE.mjs → chunk-C76SOFXF.mjs} +3 -3
- package/dist/{chunk-PPKHCRRE.mjs.map → chunk-C76SOFXF.mjs.map} +1 -1
- package/dist/{chunk-IHUFOV7L.mjs → chunk-CH6SFONH.mjs} +15 -3
- package/dist/chunk-CH6SFONH.mjs.map +1 -0
- package/dist/{chunk-SF3U7ZF4.mjs → chunk-DWIEVCGK.mjs} +180 -15
- package/dist/chunk-DWIEVCGK.mjs.map +1 -0
- package/dist/{chunk-SZDAS7LK.mjs → chunk-IE2GGHNF.mjs} +131 -81
- package/dist/chunk-IE2GGHNF.mjs.map +1 -0
- package/dist/{chunk-ZTQBUKLJ.mjs → chunk-JJ4FPCBE.mjs} +142 -22
- package/dist/chunk-JJ4FPCBE.mjs.map +1 -0
- package/dist/{chunk-QRUAEXLR.mjs → chunk-K5BS2H56.mjs} +5 -5
- package/dist/{chunk-QRUAEXLR.mjs.map → chunk-K5BS2H56.mjs.map} +1 -1
- package/dist/{chunk-BNBOIDO5.mjs → chunk-K7VJU7LQ.mjs} +3 -3
- package/dist/{chunk-BNBOIDO5.mjs.map → chunk-K7VJU7LQ.mjs.map} +1 -1
- package/dist/{chunk-H22OZYTW.mjs → chunk-KOXOC2FI.mjs} +48 -39
- package/dist/chunk-KOXOC2FI.mjs.map +1 -0
- package/dist/{chunk-CXHNVYMD.mjs → chunk-KWDBVLST.mjs} +5 -5
- package/dist/{chunk-CXHNVYMD.mjs.map → chunk-KWDBVLST.mjs.map} +1 -1
- package/dist/{chunk-OQIQNKPQ.mjs → chunk-LTLLQUMN.mjs} +4 -4
- package/dist/{chunk-OQIQNKPQ.mjs.map → chunk-LTLLQUMN.mjs.map} +1 -1
- package/dist/{chunk-QGNU34T7.mjs → chunk-QLQ4MJNO.mjs} +10 -4
- package/dist/chunk-QLQ4MJNO.mjs.map +1 -0
- package/dist/{chunk-BU5KLO3P.mjs → chunk-T3N4BSJV.mjs} +4 -4
- package/dist/{chunk-BU5KLO3P.mjs.map → chunk-T3N4BSJV.mjs.map} +1 -1
- package/dist/{chunk-5JM35CXV.mjs → chunk-TMRFSOM7.mjs} +4 -4
- package/dist/{chunk-5JM35CXV.mjs.map → chunk-TMRFSOM7.mjs.map} +1 -1
- package/dist/geometry-2d.d.mts +1 -1
- package/dist/geometry-2d.d.ts +1 -1
- package/dist/geometry-2d.js +449 -172
- package/dist/geometry-2d.js.map +1 -1
- package/dist/geometry-2d.mjs +5 -5
- package/dist/geometry-3d.d.mts +1 -1
- package/dist/geometry-3d.d.ts +1 -1
- package/dist/geometry-3d.js +172 -22
- package/dist/geometry-3d.js.map +1 -1
- package/dist/geometry-3d.mjs +4 -4
- package/dist/graph-2d.d.mts +1 -1
- package/dist/graph-2d.d.ts +1 -1
- package/dist/graph-2d.js +307 -100
- package/dist/graph-2d.js.map +1 -1
- package/dist/graph-2d.mjs +7 -7
- package/dist/{host-HOSJHQ5H.mjs → host-4FIUNIDQ.mjs} +13 -12
- package/dist/host-4FIUNIDQ.mjs.map +1 -0
- package/dist/{host-2ISGVO7O.mjs → host-4ZB4XD4S.mjs} +9 -8
- package/dist/host-4ZB4XD4S.mjs.map +1 -0
- package/dist/{host-ZQCDAT6O.mjs → host-H2IGOKJU.mjs} +3 -3
- package/dist/{host-ZQCDAT6O.mjs.map → host-H2IGOKJU.mjs.map} +1 -1
- package/dist/{host-3UFGFMJ2.mjs → host-KMWP7KBT.mjs} +90 -43
- package/dist/host-KMWP7KBT.mjs.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +453 -174
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -21
- package/dist/latex.d.mts +1 -1
- package/dist/latex.d.ts +1 -1
- package/dist/latex.js +8 -2
- package/dist/latex.js.map +1 -1
- package/dist/latex.mjs +1 -1
- package/dist/render-NMS7OAV6.mjs +10 -0
- package/dist/{render-ZX2O2IK7.mjs.map → render-NMS7OAV6.mjs.map} +1 -1
- package/dist/serialize-PGHQZEPV.mjs +9 -0
- package/dist/{serialize-N4G6RFBB.mjs.map → serialize-PGHQZEPV.mjs.map} +1 -1
- package/dist/{types-C3FjpoUi.d.ts → types-tePd94vW.d.mts} +8 -0
- package/dist/{types-C3FjpoUi.d.mts → types-tePd94vW.d.ts} +8 -0
- package/package.json +1 -1
- package/dist/chunk-H22OZYTW.mjs.map +0 -1
- package/dist/chunk-IHUFOV7L.mjs.map +0 -1
- package/dist/chunk-QGNU34T7.mjs.map +0 -1
- package/dist/chunk-SF3U7ZF4.mjs.map +0 -1
- package/dist/chunk-SZDAS7LK.mjs.map +0 -1
- package/dist/chunk-ZTQBUKLJ.mjs.map +0 -1
- package/dist/host-2ISGVO7O.mjs.map +0 -1
- package/dist/host-3UFGFMJ2.mjs.map +0 -1
- package/dist/host-HOSJHQ5H.mjs.map +0 -1
- package/dist/render-ZX2O2IK7.mjs +0 -10
- package/dist/serialize-N4G6RFBB.mjs +0 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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/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/preview3d.ts","../src/stamps/geometry-3d/editor/StatusHint.tsx","../src/stamps/geometry-3d/editor/usePointDrag.ts","../src/stamps/geometry-3d/editor/editorHelpers.ts","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/stamps/geometry-3d/editor/toolPanel/icons.tsx","../src/stamps/geometry-3d/editor/toolPanel/groups.ts","../src/stamps/geometry-3d/host.tsx"],"names":["id","norm","EPS","dot","sub","add","scale","React","MiniBoard3D","p","React2","jsxs","jsx","EditorPanel","forwardRef","Geometry3DStampHost","useRef","useState","useCallback","useImperativeHandle","Fragment"],"mappings":"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","file":"host-4ZB4XD4S.mjs","sourcesContent":["import type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport type { Constraint3D } from '../../../../../core/scene/kinds/3d-constraint';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\nimport type { SceneHit } from '../../hitTest/hitTest';\n\nexport function hitToConstraint(hit: SceneHit): Constraint3D | 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 * Sinh id `p{counter + offset}` cho point mới — đồng nhất tiền tố cũ của Scene3D\n * và không đụng id đã tồn tại trong state hiện tại.\n */\nexport function makePointId(store: Store, offset = 1): string {\n return `p${store.getState().counter + offset}`;\n}\n\n/**\n * Build SceneObject cho point3d (chưa dispatch). Caller sẽ dispatch ADD hoặc\n * gom trong transaction.\n */\nexport function buildPointObject(\n store: Store,\n constraint: Constraint3D,\n options: { idOffset?: number; label?: string; color?: string } = {},\n): SceneObject<Point3DAttrs> {\n const id = makePointId(store, options.idOffset ?? 1);\n const state = store.getState();\n const label = options.label ?? nextLabel(state, 'point3d');\n return {\n id,\n kind: 'point3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { constraint, ...(options.color ? { color: options.color } : {}) },\n };\n}\n\n/**\n * Tương đương `scene.addPoint(constraint)` cũ: dispatch ADD point ngay và trả\n * về id của point vừa tạo.\n */\nexport function addPoint(store: Store, constraint: Constraint3D, color?: string): string {\n const obj = buildPointObject(store, constraint, color ? { color } : {});\n store.dispatch({ type: 'ADD', payload: { obj } });\n return obj.id;\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, store: Store): string | null {\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return addPoint(store, c);\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store } from '../../../../../core/scene';\nimport { hitToConstraint, addPoint } from './_ensurePoint';\n\nexport function buildPoint(args: CollectedArg[], store: Store): 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 addPoint(store, c);\n}\n\nexport const buildPointOnObject = buildPoint; // identical semantics; step.allowNewOn is the only difference\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nfunction makeDerivedId(store: Store, prefix: string): string {\n return `${prefix}${store.getState().counter + 1}`;\n}\n\nfunction addDerived(\n store: Store,\n kind: string,\n prefix: string,\n attrs: Record<string, unknown>,\n): string {\n const id = makeDerivedId(store, prefix);\n const label = nextLabel(store.getState(), kind);\n const obj: SceneObject = {\n id,\n kind,\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs,\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n\nexport function buildSegment(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, store);\n const p2 = ensurePoint(args[1].hit, store);\n if (!p1 || !p2 || p1 === p2) return null;\n return addDerived(store, 'segment3d', 's', { p1, p2 });\n}\n\nexport function buildLine(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, store);\n const p2 = ensurePoint(args[1].hit, store);\n if (!p1 || !p2 || p1 === p2) return null;\n return addDerived(store, 'line3d', 'l', { p1, p2 });\n}\n\nexport function buildRay(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const origin = ensurePoint(args[0].hit, store);\n const through = ensurePoint(args[1].hit, store);\n if (!origin || !through || origin === through) return null;\n return addDerived(store, 'ray3d', 'r', { origin, through });\n}\n\nexport function buildVector(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const from = ensurePoint(args[0].hit, store);\n const to = ensurePoint(args[1].hit, store);\n if (!from || !to || from === to) return null;\n return addDerived(store, 'vector3d', 'v', { from, to });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildPolygon(args: CollectedArg[], store: Store): 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\n .map((a) => (a.hit ? ensurePoint(a.hit, store) : null))\n .filter((x): x is string => !!x);\n if (vertexIds.length < 3) return null;\n\n const id = `pg${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polygon3d');\n const obj: SceneObject = {\n id,\n kind: 'polygon3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { vertices: vertexIds },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","// Pure constraint math — không phụ thuộc Scene3D nữa, nhận State của core/scene.\nimport type { State, SceneObject } from '../../../../core/scene';\nimport type { Constraint3D } from '../../../../core/scene/kinds/3d-constraint';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport type { Segment3DAttrs } from '../../../../core/scene/kinds/segment3d';\nimport type { Line3DAttrs } from '../../../../core/scene/kinds/line3d';\nimport type { Ray3DAttrs } from '../../../../core/scene/kinds/ray3d';\nimport type { Vector3DAttrs } from '../../../../core/scene/kinds/vector3d';\nimport type { Plane3DAttrs } from '../../../../core/scene/kinds/plane3d';\nimport type { Polygon3DAttrs } from '../../../../core/scene/kinds/polygon3d';\nimport type { Sphere3DAttrs } from '../../../../core/scene/kinds/sphere3d';\n\nexport type Vec3 = [number, number, number];\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, state: State): Vec3 {\n const obj = state.objects[id];\n if (!obj || obj.kind !== 'point3d') {\n throw new Error(`constraintMath: point ${id} not found`);\n }\n const attrs = obj.attrs as Point3DAttrs;\n return constraintToWorld(attrs.constraint, state);\n}\n\nfunction getPlaneBasis(\n planeObj: SceneObject<Plane3DAttrs>,\n state: State,\n): { origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3 } {\n const p1 = getPointWorld(planeObj.attrs.p1, state);\n const p2 = getPointWorld(planeObj.attrs.p2, state);\n const p3 = getPointWorld(planeObj.attrs.p3, state);\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: Constraint3D, state: State): 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 = state.objects[c.planeId];\n if (!plane || plane.kind !== 'plane3d') throw new Error('onPlane: plane missing');\n const { origin, basis1, basis2 } = getPlaneBasis(plane as SceneObject<Plane3DAttrs>, state);\n return add(add(origin, scale(basis1, c.u)), scale(basis2, c.v));\n }\n case 'onLine': {\n const line = state.objects[c.lineId];\n if (!line) throw new Error('onLine: parent missing');\n let p1Id: string;\n let p2Id: string;\n if (line.kind === 'line3d' || line.kind === 'segment3d') {\n const a = line.attrs as Segment3DAttrs | Line3DAttrs;\n p1Id = a.p1; p2Id = a.p2;\n } else if (line.kind === 'ray3d') {\n const a = line.attrs as Ray3DAttrs;\n p1Id = a.origin; p2Id = a.through;\n } else if (line.kind === 'vector3d') {\n const a = line.attrs as Vector3DAttrs;\n p1Id = a.from; p2Id = a.to;\n } else {\n throw new Error('onLine: parent kind not supported');\n }\n const p1 = getPointWorld(p1Id, state);\n const p2 = getPointWorld(p2Id, state);\n const dir = sub(p2, p1);\n return add(p1, scale(dir, c.t));\n }\n case 'onPolygon': {\n const pg = state.objects[c.polygonId];\n if (!pg || pg.kind !== 'polygon3d') throw new Error('onPolygon: parent missing');\n const v = (pg.attrs as Polygon3DAttrs).vertices;\n if (v.length < 3) throw new Error('onPolygon: < 3 vertices');\n const p1 = getPointWorld(v[0], state);\n const p2 = getPointWorld(v[1], state);\n const p3 = getPointWorld(v[2], state);\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 = state.objects[c.sphereId];\n if (!sph || sph.kind !== 'sphere3d') throw new Error('onSphere: parent missing');\n const a = sph.attrs as Sphere3DAttrs;\n const center = getPointWorld(a.center, state);\n const surface = getPointWorld(a.surfacePoint, state);\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: Constraint3D, world: Vec3, state: State): Constraint3D {\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 = state.objects[current.planeId];\n if (!plane || plane.kind !== 'plane3d') return current;\n const { origin, basis1, basis2 } = getPlaneBasis(plane as SceneObject<Plane3DAttrs>, state);\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 = state.objects[current.lineId];\n if (!line) return current;\n let p1Id: string;\n let p2Id: string;\n if (line.kind === 'line3d' || line.kind === 'segment3d') {\n const a = line.attrs as Segment3DAttrs | Line3DAttrs;\n p1Id = a.p1; p2Id = a.p2;\n } else if (line.kind === 'ray3d') {\n const a = line.attrs as Ray3DAttrs;\n p1Id = a.origin; p2Id = a.through;\n } else if (line.kind === 'vector3d') {\n const a = line.attrs as Vector3DAttrs;\n p1Id = a.from; p2Id = a.to;\n } else {\n return current;\n }\n const p1 = getPointWorld(p1Id, state);\n const p2 = getPointWorld(p2Id, state);\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 = state.objects[current.polygonId];\n if (!pg || pg.kind !== 'polygon3d') return current;\n const vertices = (pg.attrs as Polygon3DAttrs).vertices;\n if (vertices.length < 3) return current;\n const p1 = getPointWorld(vertices[0], state);\n const p2 = getPointWorld(vertices[1], state);\n const p3 = getPointWorld(vertices[2], state);\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 = state.objects[current.sphereId];\n if (!sph || sph.kind !== 'sphere3d') return current;\n const center = getPointWorld((sph.attrs as Sphere3DAttrs).center, state);\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 { State } from '../../../../core/scene';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport { constraintToWorld, type Vec3 } from './constraintMath';\n\nconst EPS = 1e-6;\n\nfunction getWorld(id: string, state: State): Vec3 | null {\n const obj = state.objects[id];\n if (!obj || obj.kind !== 'point3d') return null;\n const attrs = obj.attrs as Point3DAttrs;\n return constraintToWorld(attrs.constraint, state);\n}\n\nexport function areCollinear3(p1Id: string, p2Id: string, p3Id: string, state: State): boolean {\n const p1 = getWorld(p1Id, state);\n const p2 = getWorld(p2Id, state);\n const p3 = getWorld(p3Id, state);\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, state: State): boolean {\n if (baseIds.length < 3) return false;\n const p1 = getWorld(baseIds[0], state);\n const p2 = getWorld(baseIds[1], state);\n const p3 = getWorld(baseIds[2], state);\n const apex = getWorld(apexId, state);\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 { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\nimport { areCollinear3 } from '../../scene/geometryChecks';\n\nexport function buildPlane(args: CollectedArg[], store: Store): 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, store);\n const p2 = ensurePoint(args[1].hit, store);\n const p3 = ensurePoint(args[2].hit, store);\n if (!p1 || !p2 || !p3) return null;\n if (p1 === p2 || p2 === p3 || p1 === p3) return null;\n if (areCollinear3(p1, p2, p3, store.getState())) return null;\n const id = `pl${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'plane3d');\n const obj: SceneObject = {\n id,\n kind: 'plane3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { p1, p2, p3 },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\nimport { apexCoplanarWithBase } from '../../scene/geometryChecks';\n\nexport function buildPyramid(args: CollectedArg[], store: Store): 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\n .map((a) => (a.hit ? ensurePoint(a.hit, store) : null))\n .filter((x): x is string => !!x);\n const apexId = ensurePoint(apexArg.hit, store);\n if (!apexId || baseIds.length < 3) return null;\n if (apexCoplanarWithBase(baseIds, apexId, store.getState())) 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 const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'pyramid', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint, addPoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\n\nexport function buildPrism(args: CollectedArg[], store: Store): 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\n .map((a) => (a.hit ? ensurePoint(a.hit, store) : null))\n .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 state = store.getState();\n const p = state.objects[id];\n if (!p || p.kind !== 'point3d') return null;\n const attrs = p.attrs as Point3DAttrs;\n const w = constraintToWorld(attrs.constraint, state);\n topIds.push(addPoint(store, { 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 const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'prism', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint, addPoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\n\nexport function buildTetrahedron(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, store);\n const p2Id = ensurePoint(args[1].hit, store);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const state0 = store.getState();\n const p1Obj = state0.objects[p1Id];\n const p2Obj = state0.objects[p2Id];\n if (!p1Obj || p1Obj.kind !== 'point3d' || !p2Obj || p2Obj.kind !== 'point3d') return null;\n const p1 = constraintToWorld((p1Obj.attrs as Point3DAttrs).constraint, state0);\n const p2 = constraintToWorld((p2Obj.attrs as Point3DAttrs).constraint, state0);\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 = addPoint(store, { kind: 'free', x: baseC[0], y: baseC[1], z: baseC[2] });\n const apexId = addPoint(store, { 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 const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'tetrahedron', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint, addPoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\n\nexport function buildCube(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, store);\n const p2Id = ensurePoint(args[1].hit, store);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const state0 = store.getState();\n const p1Obj = state0.objects[p1Id];\n const p2Obj = state0.objects[p2Id];\n if (!p1Obj || p1Obj.kind !== 'point3d' || !p2Obj || p2Obj.kind !== 'point3d') return null;\n const p1 = constraintToWorld((p1Obj.attrs as Point3DAttrs).constraint, state0);\n const p2 = constraintToWorld((p2Obj.attrs as Point3DAttrs).constraint, state0);\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 = addPoint(store, { kind: 'onGround', x: p3[0], y: p3[1] });\n const p4Id = addPoint(store, { kind: 'onGround', x: p4[0], y: p4[1] });\n const t1Id = addPoint(store, { kind: 'free', x: t1[0], y: t1[1], z: t1[2] });\n const t2Id = addPoint(store, { kind: 'free', x: t2[0], y: t2[1], z: t2[2] });\n const t3Id = addPoint(store, { kind: 'free', x: t3[0], y: t3[1], z: t3[2] });\n const t4Id = addPoint(store, { 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 const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'cube', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildSphere(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const center = ensurePoint(args[0].hit, store);\n const surface = ensurePoint(args[1].hit, store);\n if (!center || !surface || center === surface) return null;\n const id = `sp${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'sphere3d');\n const obj: SceneObject = {\n id,\n kind: 'sphere3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { center, surfacePoint: surface },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCylinder(args: CollectedArg[], store: Store): 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, store);\n const topCenter = ensurePoint(points[1].hit, store);\n if (!baseCenter || !topCenter || baseCenter === topCenter) return null;\n const id = `cy${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'cylinder3d');\n const obj: SceneObject = {\n id,\n kind: 'cylinder3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { baseCenter, topCenter, radius },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCone(args: CollectedArg[], store: Store): 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, store);\n const apex = ensurePoint(points[1].hit, store);\n if (!baseCenter || !apex || baseCenter === apex) return null;\n const id = `co${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'cone3d');\n const obj: SceneObject = {\n id,\n kind: 'cone3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { baseCenter, apex, radius },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { Store } from '../../../../core/scene';\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[], store: Store): 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 { Store } from '../../../../core/scene';\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 store: Store) {\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.store);\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/constraintMath';\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/constraintMath';\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 { State } from '../../../../core/scene';\nimport { listObjects } from '../../../../core/scene';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport type { View3DLike } from './rayCast';\n\nexport function findSnapPoint(\n screen: { x: number; y: number },\n view: View3DLike,\n state: State,\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 \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 listObjects(state)) {\n if (obj.kind !== 'point3d') continue;\n if (!obj.visible) continue;\n const attrs = obj.attrs as Point3DAttrs;\n const world = constraintToWorld(attrs.constraint, state);\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, type Vec3 } from '../scene/constraintMath';\nimport type { State } from '../../../../core/scene';\nimport { listObjects } from '../../../../core/scene';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport type { Plane3DAttrs } from '../../../../core/scene/kinds/plane3d';\nimport type { Sphere3DAttrs } from '../../../../core/scene/kinds/sphere3d';\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 state: State,\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 \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, state);\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 listObjects(state)) {\n if (obj.kind !== 'sphere3d' || !obj.visible) continue;\n const attrs = obj.attrs as Sphere3DAttrs;\n const centerPoint = state.objects[attrs.center];\n const surfacePoint = state.objects[attrs.surfacePoint];\n if (!centerPoint || centerPoint.kind !== 'point3d') continue;\n if (!surfacePoint || surfacePoint.kind !== 'point3d') continue;\n const center = constraintToWorld((centerPoint.attrs as Point3DAttrs).constraint, state);\n const surface = constraintToWorld((surfacePoint.attrs as Point3DAttrs).constraint, state);\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 listObjects(state)) {\n if (obj.kind !== 'plane3d' || !obj.visible) continue;\n const basis = planeBasis(obj.attrs as Plane3DAttrs, state);\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 = state.objects[bestSphere.id];\n if (sph && sph.kind === 'sphere3d') {\n const centerPt = state.objects[(sph.attrs as Sphere3DAttrs).center];\n if (centerPt && centerPt.kind === 'point3d') {\n const center = constraintToWorld((centerPt.attrs as Point3DAttrs).constraint, state);\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 plane: Plane3DAttrs,\n state: State,\n): { origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3 } | null {\n const p1Obj = state.objects[plane.p1];\n const p2Obj = state.objects[plane.p2];\n const p3Obj = state.objects[plane.p3];\n if (!p1Obj || p1Obj.kind !== 'point3d') return null;\n if (!p2Obj || p2Obj.kind !== 'point3d') return null;\n if (!p3Obj || p3Obj.kind !== 'point3d') return null;\n const p1 = constraintToWorld((p1Obj.attrs as Point3DAttrs).constraint, state);\n const p2 = constraintToWorld((p2Obj.attrs as Point3DAttrs).constraint, state);\n const p3 = constraintToWorld((p3Obj.attrs as Point3DAttrs).constraint, state);\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';\nimport { attachJxgWheelZoom } from '../../shared/attachJxgWheelZoom';\nimport { initJxgBoard } from '../../shared/initJxgBoard';\n\n// JSXGraph board / view types are not published — use minimal local shapes.\n \ntype JxgBoard = any;\n \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 * Called on pointermove (khi không đang drag) để biết có hover object không.\n * Return true → cursor đổi 'pointer'; false → cursor reset về ''. Apply mọi\n * tool — báo hiệu \"object click/drag được\".\n */\n isHoveringObject?: (screen: { x: number; y: number }) => boolean;\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 isHoveringObject,\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 const isHoveringObjectRef = React.useRef(isHoveringObject);\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 isHoveringObjectRef.current = isHoveringObject;\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 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 let wheelCleanup: (() => void) | null = null;\n let freeBoard: (() => void) | null = null;\n\n void (async () => {\n let initResult;\n try {\n initResult = await initJxgBoard(div, {\n label: 'MiniBoard.3d',\n defaults: { disableElementHighlight: true },\n boardOptions: {\n boundingbox: [-6, 6, 6, -6],\n keepaspectratio: true,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n // Wheel zoom được tự xử lý bằng Ctrl/Cmd + wheel ở dưới (Excalidraw-style).\n zoom: { wheel: false },\n },\n });\n } catch {\n return;\n }\n if (cancelled || !containerRef.current) { initResult.cleanup(); return; }\n board = initResult.board;\n freeBoard = initResult.cleanup;\n if (cancelled || !board) return;\n boardRef.current = board;\n\n // Ctrl/Cmd + wheel zoom: cuộn lên phóng to, cuộn xuống thu nhỏ. Không\n // có modifier thì để page scroll bình thường.\n wheelCleanup = attachJxgWheelZoom(div, board, 'MiniBoard.3d');\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 \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 \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 \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 const screen = pixelToUser(e);\n onPointerMoveRef.current?.(screen);\n // Hover cursor: pointer khi hover object (point/edge/...). Apply\n // mọi tool — báo hiệu draggable/clickable. Khi đang drag thì skip\n // (dragging branch ở trên đã return sớm).\n const hovering = isHoveringObjectRef.current?.(screen) ?? false;\n svgEl.style.cursor = hovering ? 'pointer' : '';\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 (wheelCleanup) {\n wheelCleanup();\n wheelCleanup = null;\n }\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 if (freeBoard) { freeBoard(); freeBoard = null; }\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","/**\n * preview3d.ts — Transient \"ghost\" shape that tracks the cursor between clicks\n * for multi-point tools (segment / line / ray / vector / polygon / plane /\n * sphere / pyramid / prism / tetrahedron / cube / cylinder / cone).\n *\n * Lifecycle:\n * - Constructed once per editor session when view3D is ready.\n * - `update(tool, collected, hoverHit)` rebuilds the preview from scratch on\n * every pointer move. Cheap because we only create a handful of JSXGraph\n * primitives.\n * - `clear()` removes everything (called on tool change / cancel / build).\n * - `dispose()` final teardown.\n *\n * Coordinates are derived from the same hit-test path used by the controller,\n * so the phantom point lands exactly where the next real point would land if\n * the user clicked now.\n */\n\nimport type { Store } from '../../../core/scene';\nimport type { Point3DAttrs } from '../../../core/scene/kinds/point3d';\nimport { constraintToWorld, type Vec3 } from './scene/constraintMath';\nimport type { SceneHit } from './hitTest/hitTest';\nimport type { CollectedArg, ToolKey } from './tools/spec';\n\n \ntype JxgView3D = any;\n \ntype JxgEl = any;\n\nconst PREVIEW_STYLE = {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.7,\n dash: 2,\n fixed: true,\n highlight: false,\n withLabel: false,\n} as const;\n\nexport class Preview3DManager {\n private view: JxgView3D;\n private store: Store;\n private phantom: JxgEl | null = null;\n private pickPts: JxgEl[] = [];\n private shapes: JxgEl[] = [];\n private disposed = false;\n\n constructor(view: JxgView3D, store: Store) {\n this.view = view;\n this.store = store;\n }\n\n clear(): void {\n const v = this.view as { removeObject?: (e: unknown) => void };\n for (const s of this.shapes) {\n try { v.removeObject?.(s); } catch { /* ignore */ }\n }\n this.shapes = [];\n for (const p of this.pickPts) {\n try { v.removeObject?.(p); } catch { /* ignore */ }\n }\n this.pickPts = [];\n if (this.phantom) {\n try { v.removeObject?.(this.phantom); } catch { /* ignore */ }\n this.phantom = null;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.clear();\n this.disposed = true;\n }\n\n /**\n * Rebuild the preview from scratch using the controller's current `tool` +\n * `collected` args + the live `hoverHit` from the most recent pointer move.\n *\n * Returns early (and clears) when there's nothing to preview:\n * - no tool selected\n * - no points collected yet\n * - hover is empty / off-surface\n * - any collected arg lacks a hit (number steps)\n */\n update(tool: ToolKey | null, collected: CollectedArg[], hoverHit: SceneHit): void {\n if (this.disposed) return;\n this.clear();\n if (!tool || tool === 'move') return;\n if (collected.length === 0) return;\n if (hoverHit.kind === 'empty') return;\n\n const phantomCoords = this.hitToCoords(hoverHit);\n if (!phantomCoords) return;\n\n const pickCoords: Vec3[] = [];\n for (const c of collected) {\n if (!c.hit) return;\n const coords = this.hitToCoords(c.hit);\n if (!coords) return;\n pickCoords.push(coords);\n }\n\n try {\n this.phantom = this.view.create('point3d', phantomCoords, {\n visible: false, fixed: true, withLabel: false, name: '',\n });\n } catch { return; }\n\n for (const coords of pickCoords) {\n try {\n const p = this.view.create('point3d', coords, {\n visible: false, fixed: true, withLabel: false, name: '',\n });\n this.pickPts.push(p);\n } catch { return; }\n }\n\n this.buildShape(tool);\n }\n\n private buildShape(tool: ToolKey): void {\n const phantom = this.phantom;\n const picks = this.pickPts;\n if (!phantom || picks.length === 0) return;\n const last = picks[picks.length - 1];\n\n try {\n switch (tool) {\n case 'segment':\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n return;\n case 'line':\n this.shapes.push(this.makeLine3d(picks[0], phantom, true, true));\n return;\n case 'ray':\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, true));\n return;\n case 'vector':\n this.shapes.push(this.view.create('line3d', [picks[0], phantom], {\n ...PREVIEW_STYLE,\n straightFirst: false,\n straightLast: false,\n lastArrow: { type: 1 },\n }));\n return;\n case 'polygon':\n case 'pyramid':\n case 'prism': {\n for (let i = 0; i < picks.length - 1; i += 1) {\n this.shapes.push(this.makeLine3d(picks[i], picks[i + 1], false, false));\n }\n this.shapes.push(this.makeLine3d(last, phantom, false, false));\n if (picks.length >= 2) {\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n }\n return;\n }\n case 'plane': {\n if (picks.length === 1) {\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n } else if (picks.length === 2) {\n this.shapes.push(this.makeLine3d(picks[0], picks[1], false, false));\n this.shapes.push(this.makeLine3d(picks[1], phantom, false, false));\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n }\n return;\n }\n case 'sphere': {\n this.shapes.push(this.view.create('sphere3d', [picks[0], phantom], {\n ...PREVIEW_STYLE,\n fillColor: 'none',\n fillOpacity: 0,\n }));\n return;\n }\n case 'tetrahedron':\n case 'cube':\n case 'cylinder':\n case 'cone':\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n return;\n default:\n return;\n }\n } catch { /* ignore */ }\n }\n\n private makeLine3d(a: JxgEl, b: JxgEl, straightFirst: boolean, straightLast: boolean): JxgEl {\n return this.view.create('line3d', [a, b], {\n ...PREVIEW_STYLE,\n straightFirst,\n straightLast,\n });\n }\n\n private hitToCoords(hit: SceneHit): Vec3 | null {\n if (hit.kind === 'existingPoint') {\n const obj = this.store.getState().objects[hit.pointId];\n if (!obj || obj.kind !== 'point3d') return null;\n return constraintToWorld((obj.attrs as Point3DAttrs).constraint, this.store.getState());\n }\n if ('world' in hit) return hit.world;\n return null;\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","// src/stamps/geometry-3d/editor/usePointDrag.ts\nimport * as React from 'react';\nimport { nextLabel, type State, type Store } from '../../../core/scene';\nimport type { Constraint3D } from '../../../core/scene/kinds/3d-constraint';\nimport type { Point3DAttrs } from '../../../core/scene/kinds/point3d';\nimport { hitTest } from './hitTest/hitTest';\nimport { rayPlane } from './hitTest/intersect';\nimport { screenToRay } from './hitTest/rayCast';\nimport { constraintToWorld, type Vec3 } from './scene/constraintMath';\nimport { hitToConstraint } from './tools/handlers/_ensurePoint';\nimport type { MiniBoard3DHandle } from './MiniBoard3D';\nimport type { ToolKey } from './tools/spec';\n\nexport interface UsePointDragOptions {\n store: Store;\n boardRef: React.RefObject<MiniBoard3DHandle | null>;\n /** Ref tới tool đang chọn — đọc tươi tránh stale closure trong drag. */\n selectedToolRef: React.RefObject<ToolKey>;\n}\n\nexport interface UsePointDragHandlers {\n /**\n * Trả về true nếu gesture là drag/place point của ta. True cũng suppress\n * view rotation của MiniBoard3D suốt phần còn lại của gesture.\n */\n shouldStartPointDrag: (screen: { x: number; y: number }) => boolean;\n onPointerDrag: (screen: { x: number; y: number }) => void;\n onPointerDragEnd: () => void;\n /** True khi đang trong gesture drag — handleMove dùng để pause hover label. */\n isDragging: () => boolean;\n}\n\n// Point-drag handlers cho 3D editor: drag existing point (Z-only ở tool Point,\n// XY raycast ở tool Move) + place-and-lift (tool Point trên ground/axis). Capture\n// snapshot trước mọi mutation để onPointerDragEnd push một undo checkpoint duy\n// nhất cho cả gesture.\nexport function usePointDrag(opts: UsePointDragOptions): UsePointDragHandlers {\n const { store, boardRef, selectedToolRef } = opts;\n\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<State | null>(null);\n // Track liệu có mutation trong drag không — onPointerDragEnd dùng để quyết\n // định có cần push manual checkpoint qua LOAD-then-LOAD.\n const dragMutatedRef = React.useRef<boolean>(false);\n\n const shouldStartPointDrag = React.useCallback(\n (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 {\n hit = hitTest(screen, view, store.getState());\n } catch {\n return false;\n }\n\n if (hit.kind === 'existingPoint') {\n const pt = store.getState().objects[hit.pointId];\n if (!pt || pt.kind !== 'point3d') return false;\n dragSnapshotRef.current = store.getState();\n dragMutatedRef.current = false;\n draggedPointRef.current = hit.pointId;\n dragStartRef.current = {\n screen,\n world: constraintToWorld((pt.attrs as Point3DAttrs).constraint, store.getState()),\n };\n return true;\n }\n\n // Point tool: place-and-lift. Capture snapshot trước, tạo point bên trong\n // withoutHistory để chỉ drag-end checkpoint nằm trên undo stack. Bypass\n // controller (Point tool repeatAfterBuild — không có collected để unwind);\n // path click→consumeHit→buildPoint bị short-circuit trong handlePointerUp\n // khi pointDragMode được set.\n if (tool === 'point' && (hit.kind === 'onGround' || hit.kind === 'onAxis')) {\n dragSnapshotRef.current = store.getState();\n dragMutatedRef.current = false;\n const constraint = hitToConstraint(hit);\n if (!constraint) {\n dragSnapshotRef.current = null;\n return false;\n }\n let id: string | null = null;\n store.withoutHistory(() => {\n const stateBefore = store.getState();\n const newId = `p${stateBefore.counter + 1}`;\n const label = nextLabel(stateBefore, 'point3d');\n store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id: newId,\n kind: 'point3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { constraint },\n },\n },\n });\n id = newId;\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 nhưng non-placeable surface (sphere/plane/empty): suppress\n // view rotation để camera không xoay khi user đang place point, nhưng\n // không enter drag. Clear snapshot phòng hờ.\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 },\n [store, boardRef, selectedToolRef],\n );\n\n const onPointerDrag = React.useCallback(\n (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 — giữ X,Y; map screen-Y delta sang world Z (pixelToUser\n // đã invert Y rồi).\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 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 {\n return;\n }\n } else {\n return;\n }\n const obj = store.getState().objects[pointId];\n if (!obj || obj.kind !== 'point3d') return;\n const free: Constraint3D = { kind: 'free', x: nextWorld[0], y: nextWorld[1], z: nextWorld[2] };\n // UPDATE_ATTRS → fire subscribers, JxgRenderer3D diff + update JSXGraph.\n // Wrap withoutHistory: drag-end sẽ push 1 checkpoint duy nhất.\n store.withoutHistory(() => {\n store.dispatch({ type: 'UPDATE_ATTRS', payload: { id: pointId, patch: { constraint: free } } });\n });\n dragMutatedRef.current = true;\n },\n [store, boardRef, selectedToolRef],\n );\n\n const onPointerDragEnd = React.useCallback(() => {\n const snap = dragSnapshotRef.current;\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n dragMutatedRef.current = false;\n // Push undo checkpoint cho cả 2 flow: click-only (ADD point inside\n // withoutHistory → cần checkpoint manual) và drag-and-lift (ADD +\n // UPDATE_ATTRS đều bị withoutHistory wrap → cùng cần). Net: 1 entry duy\n // nhất trong past stack = snap → current. Nếu snap === current (degenerate),\n // 2 LOAD đều no-op, không push gì.\n if (snap) {\n const current = store.getState();\n store.withoutHistory(() => {\n store.dispatch({ type: 'LOAD', payload: { state: snap } });\n });\n store.dispatch({ type: 'LOAD', payload: { state: current } });\n }\n }, [store]);\n\n const isDragging = React.useCallback(() => draggedPointRef.current !== null, []);\n\n return { shouldStartPointDrag, onPointerDrag, onPointerDragEnd, isDragging };\n}\n","// src/stamps/geometry-3d/editor/editorHelpers.ts\nimport type { State, View3D } from '../../../core/scene';\nimport type { SceneHit } from './hitTest/hitTest';\nimport { DEFAULT_VIEW3D } from './theme';\n\nexport function hitToHoverLabel(hit: SceneHit, state: State): string | null {\n if (hit.kind === 'empty') return null;\n if (hit.kind === 'existingPoint') return state.objects[hit.pointId]?.label ?? null;\n if (hit.kind === 'onGround') return 'mặt nền';\n if (hit.kind === 'onAxis') return `trục ${hit.axis.toUpperCase()}`;\n if (hit.kind === 'onPlane') return `mặt phẳng ${hit.planeId}`;\n if (hit.kind === 'onSphere') return `mặt cầu ${hit.sphereId}`;\n return null;\n}\n\nexport function getView3DInfo(view: unknown): View3D {\n \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 {\n azimuth,\n elevation,\n bbox3D: [...DEFAULT_VIEW3D.bbox3D] as [number, number, number, number, number, number],\n };\n}\n","'use client';\nimport * as React from 'react';\nimport {\n useEditorState,\n type Store,\n type View3D,\n} from '../../../core/scene';\nimport { JxgRenderer3D } from '../../../core/scene/render/JxgRenderer3D';\nimport { ToolController } from './tools/controller';\nimport { hitTest } from './hitTest/hitTest';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport { Preview3DManager } from './preview3d';\nimport { StatusHint } from './StatusHint';\nimport type { ToolKey } from './tools/spec';\nimport { usePointDrag } from './usePointDrag';\nimport { getView3DInfo, hitToHoverLabel } from './editorHelpers';\nimport { serializeBoard3D } from '../serialize';\nimport { renderGeometry3DSvgFromState } from '../render';\nimport { STAMP_PANEL_DESKTOP } from '../../shared/StampLeftPanel/constants';\nimport { ToastProvider, ToastHost } from '../../shared/Toast';\n\nexport interface EditorPanelProps {\n isDark?: boolean;\n /** Triggered after serialize + svg render — host wires Excalidraw insertion. */\n onInsert?: (jsonState: string, svgString: string) => void;\n /** Close dialog. Host has the lifecycle hook for \"close + remove host\". */\n onClose: () => void;\n /** Store created by host (so LeftPanel sibling can share it). */\n store: Store;\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 /** Notifies host của ready/canUndo/canRedo để host wire LeftPanel buttons. */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Mở mobile LeftPanel drawer (host owns drawer visibility). */\n onOpenDrawer?: () => void;\n /** Khi true, panel offset left để chừa chỗ cho LeftPanel (desktop). */\n withLeftPanel?: boolean;\n}\n\nexport interface EditorPanelHandle {\n hasContent: () => boolean;\n /** Try to serialize + render + onInsert. Returns false nếu rỗng. */\n tryInsert: () => boolean;\n setTool: (k: ToolKey) => void;\n undo: () => void;\n redo: () => void;\n highlight: (id: string | null) => void;\n}\n\nconst EditorPanelInner = React.forwardRef<EditorPanelHandle, EditorPanelProps>(\n function EditorPanel(props, ref) {\n const {\n isDark: isDarkProp,\n onInsert,\n onClose,\n store,\n selectedTool,\n onSelectedToolChange,\n showAxis,\n showGrid,\n onHistoryChange,\n isMobile = false,\n onOpenDrawer,\n withLeftPanel = false,\n } = props;\n const isDark = isDarkProp ?? false;\n\n const controllerRef = React.useRef<ToolController | null>(null);\n if (!controllerRef.current) controllerRef.current = new ToolController(store);\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 const [ready, setReady] = React.useState(false);\n const [hasContent, setHasContent] = React.useState(false);\n\n const boardRef = React.useRef<MiniBoard3DHandle | null>(null);\n const rendererRef = React.useRef<JxgRenderer3D | null>(null);\n const previewRef = React.useRef<Preview3DManager | null>(null);\n const lastHoverHitRef = React.useRef<import('./hitTest/hitTest').SceneHit>({ kind: 'empty' });\n\n const onSelectedToolChangeRef = React.useRef(onSelectedToolChange);\n onSelectedToolChangeRef.current = onSelectedToolChange;\n\n const selectedToolRef = React.useRef(selectedTool);\n selectedToolRef.current = selectedTool;\n\n const onInsertRef = React.useRef(onInsert);\n onInsertRef.current = onInsert;\n\n // Hook đã pre-load state vào store qua parseInitialState3D — useEditorState\n // không cần initialState LOAD nữa. Vẫn dùng cho canUndo/canRedo propagate\n // + keyboard shortcuts.\n useEditorState({ store, onHistoryChange });\n\n const { shouldStartPointDrag, onPointerDrag, onPointerDragEnd, isDragging } = usePointDrag({\n store,\n boardRef,\n selectedToolRef,\n });\n\n React.useEffect(() => {\n const ctrl = controllerRef.current!;\n return ctrl.on((state) => {\n setHint(state.hint);\n onSelectedToolChangeRef.current(state.tool?.key ?? 'move');\n });\n }, []);\n\n React.useEffect(() => {\n controllerRef.current?.selectTool(selectedTool);\n }, [selectedTool]);\n\n React.useEffect(() => {\n return () => {\n rendererRef.current?.dispose();\n rendererRef.current = null;\n previewRef.current?.dispose();\n previewRef.current = null;\n };\n }, []);\n\n // hasContent: track store size để gate Insert button.\n React.useEffect(() => {\n const sync = (): void => setHasContent(Object.keys(store.getState().objects).length > 0);\n sync();\n return store.subscribe(sync);\n }, [store]);\n\n // Clear preview khi controller reset (tool switch, build complete, cancel).\n React.useEffect(() => {\n const controller = controllerRef.current;\n if (!controller) return;\n return controller.on((state) => {\n if (!previewRef.current) return;\n if (state.collected.length === 0) previewRef.current.clear();\n else previewRef.current.update(state.tool?.key ?? null, state.collected, lastHoverHitRef.current);\n });\n }, []);\n\n React.useEffect(() => {\n const view = boardRef.current?.getView3D();\n \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 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 — JSXGraph cũ / mocks không support runtime attr changes */\n }\n }, [showAxis, showGrid]);\n\n const handleView3DReady = React.useCallback((view: unknown) => {\n rendererRef.current = new JxgRenderer3D(store, view);\n previewRef.current = new Preview3DManager(view, store);\n const meta = store.getState().meta;\n const savedView: View3D | null = meta.domain === '3d' ? meta.view : null;\n if (savedView) {\n try {\n \n const v = view as any;\n v?.az_slide?.setValue?.(savedView.azimuth);\n v?.el_slide?.setValue?.(savedView.elevation);\n v?.board?.update?.();\n } catch {\n /* swallow — JSXGraph cũ không expose az_slide */\n }\n }\n setReady(true);\n }, [store]);\n\n const handleClick = React.useCallback((screen: { x: number; y: number }) => {\n const view = boardRef.current?.getView3D();\n if (!view) return;\n try {\n const hit = hitTest(screen, view, store.getState());\n controllerRef.current!.consumeHit(hit);\n } catch {\n /* swallow — view có thể chưa expose project3DTo2D trong mock path */\n }\n }, [store]);\n\n const handleMove = React.useCallback((screen: { x: number; y: number }) => {\n const view = boardRef.current?.getView3D();\n if (!view) return;\n if (isDragging()) return;\n let hit;\n try {\n hit = hitTest(screen, view, store.getState());\n } catch {\n setHoverLabel(null);\n return;\n }\n lastHoverHitRef.current = hit;\n const ctrl = controllerRef.current;\n if (previewRef.current && ctrl) {\n const cs = ctrl.getState();\n previewRef.current.update(cs.tool?.key ?? null, cs.collected, hit);\n }\n setHoverLabel(hitToHoverLabel(hit, store.getState()));\n }, [store, isDragging]);\n\n // Cursor hover hit-test — reuse `hitTest()` đã có. SceneHit.kind === 'empty'\n // → không hover; else → hover (point/line/polygon/...). Try/catch để\n // tolerate mock environment khi view chưa expose project3DTo2D.\n const isHoveringObject = React.useCallback((screen: { x: number; y: number }): boolean => {\n const view = boardRef.current?.getView3D();\n if (!view) return false;\n try {\n return hitTest(screen, view, store.getState()).kind !== 'empty';\n } catch {\n return false;\n }\n }, [store]);\n\n const tryInsert = React.useCallback((): boolean => {\n const state = store.getState();\n if (Object.keys(state.objects).length === 0) return false;\n const view = getView3DInfo(boardRef.current?.getView3D());\n const jsonState = serializeBoard3D(state, view);\n void (async () => {\n try {\n const { svgString } = await renderGeometry3DSvgFromState(jsonState);\n onInsertRef.current?.(jsonState, svgString);\n } catch (err) {\n console.error('Geometry3D insert failed:', err);\n }\n })();\n return true;\n }, [store]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n hasContent: () => Object.keys(store.getState().objects).length > 0,\n tryInsert,\n setTool: (k) => controllerRef.current!.selectTool(k),\n undo: () => store.undo(),\n redo: () => store.redo(),\n highlight: (id) => rendererRef.current?.highlight(id),\n }),\n [store, tryInsert],\n );\n\n const dialogStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học 3D\"\n data-testid=\"geom3d-host\"\n data-stamp-area=\"true\"\n style={dialogStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'relative flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : `${STAMP_PANEL_DESKTOP} rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5`,\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <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 <MiniBoard3D\n ref={boardRef}\n isDark={isDark}\n onView3DReady={handleView3DReady}\n onPointerClick={handleClick}\n onPointerMove={handleMove}\n onPointerLeave={() => {\n setHoverLabel(null);\n lastHoverHitRef.current = { kind: 'empty' };\n previewRef.current?.clear();\n }}\n shouldStartPointDrag={shouldStartPointDrag}\n onPointerDrag={onPointerDrag}\n onPointerDragEnd={onPointerDragEnd}\n isHoveringObject={isHoveringObject}\n />\n </div>\n <StatusHint hint={hint} hoverLabel={hoverLabel} />\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 <ToastHost />\n </div>\n );\n },\n);\n\nexport const EditorPanel = React.forwardRef<EditorPanelHandle, EditorPanelProps>(\n function EditorPanel(props, ref) {\n return (\n <ToastProvider>\n <EditorPanelInner {...props} ref={ref} />\n </ToastProvider>\n );\n },\n);\n\n// createStore / createEmptyState exported từ core/scene barrel.\n","import * as React from 'react';\nimport type { ToolKey } from '../tools/spec';\n\nconst wrap = (children: React.ReactNode): React.ReactElement => (\n <svg\n width=\"22\"\n height=\"22\"\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 type { ReactNode } from 'react';\nimport { TOOLS, type ToolKey, type ToolSpec } from '../tools/spec';\nimport { ToolIcons } from './icons';\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 icon: ReactNode;\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 icon: ToolIcons[key],\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';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { EditorPanel, type EditorPanelHandle } from './editor/EditorPanel';\nimport { StampLeftPanel } from '../shared/StampLeftPanel';\nimport type { State } from '../../core/scene';\nimport {\n GROUP_ORDER,\n GROUP_LABELS,\n TOOLS_FLAT,\n letterForGroup,\n type Geom3DGroup,\n} from './editor/toolPanel/groups';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { useStampStore } from '../shared/useStampStore';\nimport {\n deserializeBoard3D,\n isGeometry3DCustomData,\n type Geometry3DCustomData,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport type { ToolKey } from './editor/tools/spec';\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 parseInitialState(data: unknown): State | null {\n if (!isGeometry3DCustomData(data)) return null;\n return deserializeBoard3D(data.jsonState);\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 sceneStore = useStampStore('3d', editingElement, parseInitialState);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = 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 [selectedObjectId, setSelectedObjectId] = useState<string | undefined>(undefined);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n const handleObjectSelect = useCallback((id: string | null) => {\n setSelectedObjectId(id ?? undefined);\n editorRef.current?.highlight(id);\n }, []);\n\n const handleUndo = useCallback(() => editorRef.current?.undo(), []);\n const handleRedo = useCallback(() => editorRef.current?.redo(), []);\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 handleEditorInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Geometry3DCustomData => ({\n kind: 'geometry3d',\n version: 2,\n jsonState,\n }),\n editingElementId: editingElement?.id ?? null,\n preserveExistingSize: true,\n });\n onClose();\n },\n [api, editingElement, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <StampLeftPanel<ToolKey, Geom3DGroup>\n title=\"Hình học 3D\"\n icon={Geom3DIconHeader}\n onClose={onClose}\n isDark={isDark}\n testId=\"stamp-left-panel\"\n tools={TOOLS_FLAT}\n groupOrder={GROUP_ORDER}\n groupLabels={GROUP_LABELS}\n activeTool={selectedTool}\n onToolChange={handleSelectTool}\n view={{\n sectionLabel: 'Góc nhìn',\n showAxis,\n showGrid,\n onShowAxisChange: setShowAxis,\n onShowGridChange: setShowGrid,\n }}\n history={{\n onUndo: handleUndo,\n canUndo,\n onRedo: handleRedo,\n canRedo,\n }}\n chord={{ activeGroup: chordGroup, letterForGroup }}\n objects={{\n store: sceneStore,\n selectedObjectId,\n onObjectSelect: handleObjectSelect,\n }}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <EditorPanel\n ref={editorRef}\n isDark={isDark}\n onInsert={handleEditorInsert}\n onClose={onClose}\n store={sceneStore}\n selectedTool={selectedTool}\n onSelectedToolChange={setSelectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onHistoryChange={handleHistoryChange}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n withLeftPanel={!isMobile}\n />\n </>\n );\n },\n);\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { renderLatexToSvg, isLatexCustomData } from './chunk-X5R72SSJ.mjs';
|
|
3
3
|
import { useIsMobile } from './chunk-P2AOIF7S.mjs';
|
|
4
|
-
import { insertStampImage } from './chunk-
|
|
4
|
+
import { insertStampImage } from './chunk-QLQ4MJNO.mjs';
|
|
5
5
|
import './chunk-5UTGXHLJ.mjs';
|
|
6
6
|
import './chunk-J5LGTIGS.mjs';
|
|
7
7
|
import { forwardRef, useState, useRef, useEffect, useCallback, useImperativeHandle, useMemo } from 'react';
|
|
@@ -463,5 +463,5 @@ var LatexStampHost = forwardRef(
|
|
|
463
463
|
);
|
|
464
464
|
|
|
465
465
|
export { LatexStampHost };
|
|
466
|
-
//# sourceMappingURL=host-
|
|
467
|
-
//# sourceMappingURL=host-
|
|
466
|
+
//# sourceMappingURL=host-H2IGOKJU.mjs.map
|
|
467
|
+
//# sourceMappingURL=host-H2IGOKJU.mjs.map
|