@xom11/whiteboard 0.31.0 → 0.32.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 +148 -27
- package/dist/ai.d.ts +148 -27
- package/dist/ai.js +2652 -430
- package/dist/ai.js.map +1 -1
- package/dist/ai.mjs +2482 -426
- package/dist/ai.mjs.map +1 -1
- package/dist/catalog.json +4 -4
- package/dist/{chunk-JJ4FPCBE.mjs → chunk-4EXRNZRX.mjs} +641 -75
- package/dist/chunk-4EXRNZRX.mjs.map +1 -0
- package/dist/{chunk-BMYC2ILT.mjs → chunk-DBG6DZ2V.mjs} +4 -4
- package/dist/{chunk-BMYC2ILT.mjs.map → chunk-DBG6DZ2V.mjs.map} +1 -1
- package/dist/{chunk-T3N4BSJV.mjs → chunk-DCFZTKFE.mjs} +13 -5
- package/dist/chunk-DCFZTKFE.mjs.map +1 -0
- package/dist/{chunk-DWIEVCGK.mjs → chunk-DJM5EWTT.mjs} +53 -3
- package/dist/chunk-DJM5EWTT.mjs.map +1 -0
- package/dist/{chunk-44JY2AKC.mjs → chunk-F42MZ745.mjs} +3 -3
- package/dist/{chunk-44JY2AKC.mjs.map → chunk-F42MZ745.mjs.map} +1 -1
- package/dist/{chunk-TMRFSOM7.mjs → chunk-FI2MGX5H.mjs} +4 -4
- package/dist/{chunk-TMRFSOM7.mjs.map → chunk-FI2MGX5H.mjs.map} +1 -1
- package/dist/{chunk-KOXOC2FI.mjs → chunk-KLGPAMJS.mjs} +10 -7
- package/dist/chunk-KLGPAMJS.mjs.map +1 -0
- package/dist/{chunk-73Q7ADVL.mjs → chunk-MNHOFOM5.mjs} +2 -2
- package/dist/{chunk-73Q7ADVL.mjs.map → chunk-MNHOFOM5.mjs.map} +1 -1
- package/dist/{chunk-K5BS2H56.mjs → chunk-MOAXHVKI.mjs} +4 -4
- package/dist/{chunk-K5BS2H56.mjs.map → chunk-MOAXHVKI.mjs.map} +1 -1
- package/dist/chunk-SUXIMLYN.mjs +238 -0
- package/dist/chunk-SUXIMLYN.mjs.map +1 -0
- package/dist/{chunk-LTLLQUMN.mjs → chunk-XSTGTEGP.mjs} +4 -4
- package/dist/{chunk-LTLLQUMN.mjs.map → chunk-XSTGTEGP.mjs.map} +1 -1
- package/dist/geometry-2d.js +883 -119
- package/dist/geometry-2d.js.map +1 -1
- package/dist/geometry-2d.mjs +4 -4
- package/dist/geometry-3d.js +3995 -471
- package/dist/geometry-3d.js.map +1 -1
- package/dist/geometry-3d.mjs +4 -4
- package/dist/graph-2d.js +706 -111
- package/dist/graph-2d.js.map +1 -1
- package/dist/graph-2d.mjs +4 -4
- package/dist/{handleExtractProblem-BrDY9ifM.d.ts → handleExtractProblem-mtJyhEw3.d.mts} +2 -0
- package/dist/{handleExtractProblem-BrDY9ifM.d.mts → handleExtractProblem-mtJyhEw3.d.ts} +2 -0
- package/dist/{host-KMWP7KBT.mjs → host-JNLJ5BVR.mjs} +8 -8
- package/dist/{host-KMWP7KBT.mjs.map → host-JNLJ5BVR.mjs.map} +1 -1
- package/dist/{host-4FIUNIDQ.mjs → host-VRWLQSMH.mjs} +7 -7
- package/dist/{host-4FIUNIDQ.mjs.map → host-VRWLQSMH.mjs.map} +1 -1
- package/dist/host-W4U6YCSX.mjs +4973 -0
- package/dist/host-W4U6YCSX.mjs.map +1 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4090 -392
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +27 -21
- package/dist/index.mjs.map +1 -1
- package/dist/serialize-7UZWQQ4I.mjs +9 -0
- package/dist/{serialize-PGHQZEPV.mjs.map → serialize-7UZWQQ4I.mjs.map} +1 -1
- package/package.json +4 -1
- package/dist/chunk-DWIEVCGK.mjs.map +0 -1
- package/dist/chunk-JJ4FPCBE.mjs.map +0 -1
- package/dist/chunk-KOXOC2FI.mjs.map +0 -1
- package/dist/chunk-QK6OVDLC.mjs +0 -103
- package/dist/chunk-QK6OVDLC.mjs.map +0 -1
- package/dist/chunk-T3N4BSJV.mjs.map +0 -1
- package/dist/host-4ZB4XD4S.mjs +0 -2378
- package/dist/host-4ZB4XD4S.mjs.map +0 -1
- package/dist/serialize-PGHQZEPV.mjs +0 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/scene/selectors.ts","../src/core/scene/hooks/useEditorState.ts","../src/core/scene/kinds/3d-constraint.ts","../src/core/scene/kinds/constraint3d-math.ts","../src/core/scene/kinds/point3d.ts","../src/core/scene/kinds/labelOf.ts","../src/core/scene/kinds/segment3d.ts","../src/core/scene/kinds/line3d.ts","../src/core/scene/kinds/ray3d.ts","../src/core/scene/kinds/vector3d.ts","../src/core/scene/kinds/plane3d.ts","../src/core/scene/kinds/polygon3d.ts","../src/core/scene/kinds/sphere3d.ts","../src/core/scene/kinds/polyhedron3d.ts","../src/core/scene/kinds/_ringBasis.ts","../src/core/scene/kinds/cylinder3d.ts","../src/core/scene/kinds/cone3d.ts","../src/core/scene/kinds/2d-constraint.ts","../src/core/scene/kinds/point-constraints/_types.ts","../src/core/scene/kinds/point-constraints/free.ts","../src/core/scene/kinds/point-constraints/onAxis.ts","../src/core/scene/kinds/point-constraints/midpoint.ts","../src/core/scene/kinds/point-constraints/perpFoot.ts","../src/core/scene/kinds/point-constraints/circumcenter.ts","../src/core/scene/kinds/point-constraints/incenter.ts","../src/core/scene/kinds/point-constraints/onLine.ts","../src/core/scene/kinds/point-constraints/onSegment.ts","../src/core/scene/kinds/point-constraints/onCircle.ts","../src/core/scene/kinds/point-constraints/onPolygon.ts","../src/core/scene/kinds/point-constraints/centroid.ts","../src/core/scene/kinds/pointConstructions.ts","../src/core/scene/kinds/point-constraints/arcMidpoint.ts","../src/core/scene/kinds/point-constraints/excenter.ts","../src/core/scene/kinds/point-constraints/mixtilinearPoint.ts","../src/core/scene/kinds/point-constraints/shared.ts","../src/core/scene/kinds/point-constraints/pointAtDistance.ts","../src/stamps/geometry-2d/geometry/commonTangent.ts","../src/core/scene/kinds/point-constraints/commonTangentPoint.ts","../src/core/scene/kinds/point-constraints/circleIntersection.ts","../src/core/scene/kinds/point-constraints/circleSecondIntersection.ts","../src/core/scene/kinds/point-constraints/secondIntersection.ts","../src/core/scene/kinds/point-constraints/tangencyPoint.ts","../src/core/scene/kinds/point-constraints/transformed.ts","../src/core/scene/kinds/point-constraints/orthocenter.ts","../src/core/scene/kinds/point-constraints/onPerpendicular.ts","../src/core/scene/kinds/point-constraints/onPerpBisector.ts","../src/core/scene/kinds/point-constraints/onCircleAroundPoint.ts","../src/core/scene/kinds/point-constraints/tangentPointExt.ts","../src/core/scene/kinds/point-constraints/registry.ts","../src/core/scene/kinds/point.ts","../src/core/scene/kinds/segment.ts","../src/core/scene/kinds/line.ts","../src/core/scene/kinds/ray.ts","../src/core/scene/kinds/vector.ts","../src/core/scene/kinds/circle.ts","../src/core/scene/kinds/arc.ts","../src/core/scene/kinds/sector.ts","../src/core/scene/kinds/polygon.ts","../src/core/scene/kinds/intersection.ts","../src/core/scene/kinds/angle.ts","../src/core/scene/kinds/distance.ts","../src/core/scene/kinds/function2d.ts","../src/core/scene/kinds/parameter.ts","../src/core/scene/kinds/pointOnCurve.ts","../src/core/scene/kinds/tangent2d.ts","../src/core/scene/expressions/evaluator.ts","../src/core/scene/kinds/extremum2d.ts","../src/core/scene/kinds/root2d.ts","../src/core/scene/kinds/slope2d.ts","../src/stamps/shared/serializeScene.ts"],"names":["dist","def","v","CURVED_SEGMENTS","scale","tangent","constructionRefs","center","A","B","labels","poly"],"mappings":"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","file":"chunk-4EXRNZRX.mjs","sourcesContent":["// src/core/scene/selectors.ts\nimport type { State, SceneObject } from './types';\nimport { getKind } from './registry';\n\nexport function listObjects(state: State): SceneObject[] {\n return state.order\n .map(id => state.objects[id])\n .filter((o): o is SceneObject => o !== undefined);\n}\n\nexport function byKind(state: State, kind: string): SceneObject[] {\n return listObjects(state).filter(o => o.kind === kind);\n}\n\nexport function dependentsOf(state: State, rootId: string): Set<string> {\n const result = new Set<string>([rootId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of Object.values(state.objects)) {\n if (result.has(obj.id)) continue;\n let def;\n try { def = getKind(obj.kind); } catch { continue; }\n const refs = def.dependsOn(obj.attrs as never);\n if (refs.some(r => result.has(r))) {\n result.add(obj.id);\n grew = true;\n }\n }\n }\n return result;\n}\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\n/**\n * Nhóm các kind chia chung namespace label. User nhìn point free, intersection,\n * midpoint đều là \"điểm\" có tên 1 chữ cái — không được trùng tên dù khác kind\n * trong scene store. Ví dụ tam giác ABC + giao điểm 2 đường: giao điểm phải là\n * D (không phải A trùng đỉnh tam giác).\n */\nconst LABEL_GROUPS: Record<string, readonly string[]> = {\n point: ['point', 'intersection'],\n intersection: ['point', 'intersection'],\n};\n\nexport function nextLabel(state: State, kind: string): string {\n const kinds = LABEL_GROUPS[kind] ?? [kind];\n const used = new Set(\n listObjects(state).filter(o => kinds.includes(o.kind)).map(o => o.label),\n );\n for (const c of ALPHABET) if (!used.has(c)) return c;\n let idx = 1;\n while (true) {\n for (const c of ALPHABET) {\n const candidate = `${c}${idx}`;\n if (!used.has(candidate)) return candidate;\n }\n idx += 1;\n }\n}\n","// src/core/scene/hooks/useEditorState.ts\nimport * as React from 'react';\nimport type { Store } from '../store';\nimport type { State } from '../types';\n\nexport interface UseEditorStateOptions {\n /** Store sẵn có (host owns). */\n store: Store;\n /** Serialized scene để LOAD lúc mount. Null/undefined = bỏ qua. */\n initialState?: { state: State } | null;\n /** Notify host mỗi khi store fire (canUndo/canRedo có thể đổi). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n /** Bind Ctrl/Cmd+Z, Cmd+Shift+Z, Ctrl+Y. Default true. */\n bindKeyboardShortcuts?: boolean;\n}\n\n// Side effects chung cho stamp editor panel mà host owns store:\n// - LOAD initial state một lần (trong withoutHistory để không bẩn undo stack).\n// - Propagate canUndo/canRedo lên host qua callback.\n// - Bind global keyboard shortcuts cho undo/redo.\nexport function useEditorState(opts: UseEditorStateOptions): void {\n const { store, initialState, onHistoryChange, bindKeyboardShortcuts = true } = opts;\n\n const onHistoryChangeRef = React.useRef(onHistoryChange);\n onHistoryChangeRef.current = onHistoryChange;\n\n React.useEffect(() => {\n if (initialState?.state) {\n const loaded = initialState.state;\n store.withoutHistory(() => {\n store.dispatch({ type: 'LOAD', payload: { state: loaded } });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n onHistoryChangeRef.current?.(store.canUndo(), store.canRedo());\n const unsub = store.subscribe(() => {\n onHistoryChangeRef.current?.(store.canUndo(), store.canRedo());\n });\n return unsub;\n }, [store]);\n\n React.useEffect(() => {\n if (!bindKeyboardShortcuts) return;\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(\n ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable)\n );\n if (inField) return;\n if (!(e.metaKey || e.ctrlKey)) return;\n const key = e.key.toLowerCase();\n if (key === 'z' && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n store.undo();\n } else if ((key === 'z' && e.shiftKey) || (key === 'y' && !e.shiftKey)) {\n e.preventDefault();\n e.stopPropagation();\n store.redo();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [store, bindKeyboardShortcuts]);\n}\n","// src/core/scene/kinds/3d-constraint.ts\nexport type Vec3 = [number, number, number];\n\nexport type Constraint3D =\n | { kind: 'free'; x: number; y: number; z: number }\n | { kind: 'onGround'; x: number; y: number }\n | { kind: 'onAxis'; axis: 'x' | 'y' | 'z'; t: number }\n | { kind: 'onPlane'; planeId: string; u: number; v: number }\n | { kind: 'onLine'; lineId: string; t: number }\n | { kind: 'onPolygon'; polygonId: string; u: number; v: number }\n | { kind: 'onSphere'; sphereId: string; theta: number; phi: number }\n // ───── Điểm PHÁI SINH (v1) — KHÔNG kéo được; toạ độ tính ở constraint3d-math.ts ─────\n // Trung điểm đoạn/cạnh p1p2.\n | { kind: 'midpoint'; p1: string; p2: string }\n // Trọng tâm N đỉnh (tam giác 3 / tứ diện 4 …): trung bình các đỉnh.\n | { kind: 'centroid'; vertices: string[] }\n // Giao 2 đường, MỖI đường xác định bởi 2 ĐIỂM (đồng phẳng cắt → giao điểm; chéo\n // nhau → trung điểm đoạn ⊥ chung). Dùng điểm thay line-object để tool không cần\n // chọn đường (hitTest chưa sinh onLine; line-object-ref để dành v1.5).\n | { kind: 'intersectionLines'; a1: string; b1: string; a2: string; b2: string }\n // Giao điểm đường (qua a,b) ∩ mặt phẳng (object — chọn qua onPlane hit).\n | { kind: 'intersectionLinePlane'; a: string; b: string; plane: string }\n // Chân ⊥ từ điểm `from` xuống đường (qua a,b).\n | { kind: 'perpFootLine'; from: string; a: string; b: string }\n // Chân ⊥ từ điểm `from` xuống mặt phẳng (object).\n | { kind: 'perpFootPlane'; from: string; plane: string }\n // Tâm mặt cầu ngoại tiếp N đỉnh (điểm cách đều mọi đỉnh — least-squares).\n | { kind: 'circumsphereCenter'; vertices: string[] }\n // Tâm mặt cầu nội tiếp chóp (cách đều đáy + mọi mặt bên — trên trục chóp đều).\n | { kind: 'pyramidInsphereCenter'; apex: string; vertices: string[] }\n // Tâm đường tròn ngoại tiếp mặt (tam giác — 3 đỉnh đầu): trong mặt + cách đều đỉnh.\n | { kind: 'faceCircumcenter'; vertices: string[] }\n // Tâm đáy-TRÊN của trụ đứng ⊥ MẶT (tứ diện): tâm mặt `base` offset dọc pháp tuyến mặt\n // (3 đỉnh đầu `vertices`) một đoạn = chiều cao ⊥ từ `apex` (đỉnh đối) tới mặt-phẳng.\n | { kind: 'pointAboveFace'; base: string; apex: string; vertices: string[] };\n\nexport function constraintRefs(c: Constraint3D): string[] {\n switch (c.kind) {\n case 'onPlane': return [c.planeId];\n case 'onLine': return [c.lineId];\n case 'onPolygon': return [c.polygonId];\n case 'onSphere': return [c.sphereId];\n case 'midpoint': return [c.p1, c.p2];\n case 'centroid': return [...c.vertices];\n case 'intersectionLines': return [c.a1, c.b1, c.a2, c.b2];\n case 'intersectionLinePlane': return [c.a, c.b, c.plane];\n case 'perpFootLine': return [c.from, c.a, c.b];\n case 'perpFootPlane': return [c.from, c.plane];\n case 'circumsphereCenter': return [...c.vertices];\n case 'pyramidInsphereCenter': return [c.apex, ...c.vertices];\n case 'faceCircumcenter': return [...c.vertices];\n case 'pointAboveFace': return [c.base, c.apex, ...c.vertices];\n // Kind KHÔNG có ref scene-object (toạ độ literal): liệt kê TƯỜNG MINH để\n // exhaustive never-guard bên dưới buộc khai báo khi thêm constraint kind mới\n // (mô phỏng constraintRefs2D — quên case = cascade-delete/deps sai âm thầm).\n case 'free':\n case 'onGround':\n case 'onAxis':\n return [];\n default: {\n const _exhaustive: never = c;\n void _exhaustive;\n return [];\n }\n }\n}\n","// src/core/scene/kinds/constraint3d-math.ts\n// Toán constraint THUẦN cho 3D — chuyển từ stamps/geometry-3d/editor/scene/constraintMath.ts\n// về core (chỉ phụ thuộc type core: Constraint3D + State + *3DAttrs) để point3d.render\n// (core) có thể dùng mà KHÔNG vi phạm layering core→stamps. stamps/.../constraintMath.ts\n// re-export file này (giữ mọi import cũ). Import *3DAttrs là type-only → không vòng runtime.\nimport type { State, SceneObject } from '../types';\nimport type { Constraint3D } from './3d-constraint';\nimport type { Point3DAttrs } from './point3d';\nimport type { Segment3DAttrs } from './segment3d';\nimport type { Line3DAttrs, Line3DConstruction } from './line3d';\nimport type { Ray3DAttrs } from './ray3d';\nimport type { Vector3DAttrs } from './vector3d';\nimport type { Plane3DAttrs, Plane3DConstruction } from './plane3d';\nimport type { Polygon3DAttrs } from './polygon3d';\nimport type { Sphere3DAttrs } from './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\n// Chống tràn stack khi State có CHU TRÌNH tham chiếu (điểm/mặt construction trỏ\n// vòng — không tạo được bằng thao tác UI tuần tự, nhưng LOAD JSON hỏng/sửa-tay/\n// AI-gen có thể). Đếm độ sâu đệ quy CHUNG cho constraintToWorld + planeConstruction\n// World; vượt ngưỡng → throw lỗi MÔ TẢ ĐƯỢC (create() bắt + log) thay vì RangeError\n// sập board mỗi frame. (Chu trình thật nên chặn acyclic ở reducer — follow-up.)\nconst MAX_REC_DEPTH = 512;\nlet _recDepth = 0;\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 a = planeObj.attrs;\n let p1: Vec3, p2: Vec3, p3: Vec3;\n if (a.construction) {\n // Mặt construction (qua điểm ∥/⊥) → 3 điểm tính từ planeConstructionWorld.\n const r = planeConstructionWorld(a.construction, state);\n p1 = r.p1; p2 = r.p2; p3 = r.p3;\n } else {\n p1 = getPointWorld(a.p1!, state);\n p2 = getPointWorld(a.p2!, state);\n p3 = getPointWorld(a.p3!, state);\n }\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\n// 2 vector đơn vị vuông góc với pháp tuyến n (dựng cặp chỉ phương cho mặt ⊥ đường).\nfunction orthoBasisFromNormal(n: Vec3): { basis1: Vec3; basis2: Vec3 } {\n const seed: Vec3 = Math.abs(n[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0];\n const basis1 = normalize(cross(n, seed));\n const basis2 = cross(n, basis1);\n return { basis1, basis2 };\n}\n\n// 3 điểm (p1,p2,p3) xác định MẶT phái sinh. Hàm THUẦN — renderer gọi mỗi eval.\nexport function planeConstructionWorld(c: Plane3DConstruction, state: State): { p1: Vec3; p2: Vec3; p3: Vec3 } {\n if (_recDepth >= MAX_REC_DEPTH) throw new Error('planeConstructionWorld: đệ quy quá sâu — chu trình tham chiếu mặt?');\n _recDepth++;\n try {\n return planeConstructionWorldInner(c, state);\n } finally {\n _recDepth--;\n }\n}\n\nfunction planeConstructionWorldInner(c: Plane3DConstruction, state: State): { p1: Vec3; p2: Vec3; p3: Vec3 } {\n switch (c.kind) {\n case 'planeParallelThrough': {\n const P = getPointWorld(c.point, state);\n const ref = state.objects[c.refPlane];\n if (!ref || ref.kind !== 'plane3d') throw new Error('planeParallelThrough: mặt tham chiếu thiếu');\n const { basis1, basis2 } = getPlaneBasis(ref as SceneObject<Plane3DAttrs>, state);\n // refPlane suy biến (3 điểm thẳng hàng) → basis2≈0 → mặt phái sinh suy biến.\n // Fallback cặp chỉ phương chuẩn để mặt vẫn xác định (hữu hạn).\n if (norm(basis1) < 1e-12 || norm(basis2) < 1e-12) {\n return { p1: P, p2: add(P, [1, 0, 0]), p3: add(P, [0, 1, 0]) };\n }\n return { p1: P, p2: add(P, basis1), p3: add(P, basis2) };\n }\n case 'planePerpToLine': {\n const P = getPointWorld(c.point, state);\n const dir = sub(getPointWorld(c.lineB, state), getPointWorld(c.lineA, state));\n const dn = norm(dir);\n if (dn < 1e-12) return { p1: P, p2: add(P, [1, 0, 0]), p3: add(P, [0, 1, 0]) }; // hướng suy biến → fallback\n const { basis1, basis2 } = orthoBasisFromNormal(scale(dir, 1 / dn));\n return { p1: P, p2: add(P, basis1), p3: add(P, basis2) };\n }\n default: {\n const _exhaustive: never = c;\n void _exhaustive;\n throw new Error('planeConstructionWorld: kind không hỗ trợ');\n }\n }\n}\n\n// 2 id điểm xác định một đường: line3d/segment3d (p1,p2), ray3d (origin,through),\n// vector3d (from,to). null nếu object không phải đường.\nfunction lineDefiningPointIds(line: SceneObject): [string, string] | null {\n if (line.kind === 'line3d' || line.kind === 'segment3d') {\n const a = line.attrs as Segment3DAttrs | Line3DAttrs;\n // line3d construction-variant không có p1/p2 → không cấp 2 điểm gốc theo cách này.\n return a.p1 && a.p2 ? [a.p1, a.p2] : null;\n }\n if (line.kind === 'ray3d') {\n const a = line.attrs as Ray3DAttrs;\n return [a.origin, a.through];\n }\n if (line.kind === 'vector3d') {\n const a = line.attrs as Vector3DAttrs;\n return [a.from, a.to];\n }\n return null;\n}\n\n// Toạ độ world của 2 điểm xác định đường `lineId`.\nfunction lineEndpointsWorld(lineId: string, state: State, ctx: string): { a: Vec3; b: Vec3 } {\n const line = state.objects[lineId];\n if (!line) throw new Error(`${ctx}: đường ${lineId} không tồn tại`);\n const ids = lineDefiningPointIds(line);\n if (!ids) throw new Error(`${ctx}: kind ${line.kind} không phải đường`);\n return { a: getPointWorld(ids[0], state), b: getPointWorld(ids[1], state) };\n}\n\n// Trung điểm đoạn vuông góc chung của 2 đường (A,B) & (C,D): đồng phẳng cắt nhau →\n// chính giao điểm; chéo nhau → trung điểm đoạn nối 2 điểm gần nhất. Song song/trùng\n// (denom≈0) → vô định, trả trung điểm A,C (hiếm; UI nên chặn chọn 2 đường song song).\nfunction lineLineClosestMidpoint(A: Vec3, B: Vec3, C: Vec3, D: Vec3): Vec3 {\n const u = sub(B, A), v = sub(D, C), w0 = sub(A, C);\n const a = dot(u, u), b = dot(u, v), cc = dot(v, v), d = dot(u, w0), e = dot(v, w0);\n const denom = a * cc - b * b;\n if (Math.abs(denom) < 1e-12) return scale(add(A, C), 0.5);\n const sc = (b * e - cc * d) / denom;\n const tc = (a * e - b * d) / denom;\n return scale(add(add(A, scale(u, sc)), add(C, scale(v, tc))), 0.5);\n}\n\n// ───── Math cho ĐƯỜNG/MẶT phái sinh (construction-variant, v1.5) ─────\n\n// origin + unit-normal của mặt phẳng theo id (bọc getPlaneBasis).\nfunction planeOriginNormal(planeId: string, state: State, ctx: string): { origin: Vec3; normal: Vec3 } {\n const plane = state.objects[planeId];\n if (!plane || plane.kind !== 'plane3d') throw new Error(`${ctx}: mặt phẳng ${planeId} thiếu`);\n const { origin, normal } = getPlaneBasis(plane as SceneObject<Plane3DAttrs>, state);\n return { origin, normal };\n}\n\n// 2 điểm (a,b) xác định đường phái sinh. Hàm THUẦN — renderer gọi mỗi eval để\n// live-update. Cấu hình suy biến (song song…) → fallback hữu hạn (không NaN).\nexport function lineConstructionWorld(c: Line3DConstruction, state: State): { a: Vec3; b: Vec3 } {\n switch (c.kind) {\n case 'planePlaneIntersection': {\n const P1 = planeOriginNormal(c.plane1, state, 'planePlaneIntersection');\n const P2 = planeOriginNormal(c.plane2, state, 'planePlaneIntersection');\n const d = cross(P1.normal, P2.normal); // hướng giao tuyến = n1 × n2\n const dd = dot(d, d);\n if (dd < 1e-12) {\n // 2 mặt song song/trùng → không có giao tuyến xác định: fallback hữu hạn.\n return { a: P1.origin, b: add(P1.origin, P2.normal) };\n }\n // Điểm trên giao tuyến: p0 = (c1·(n2×d) + c2·(d×n1)) / |d|², ci = ni·oi.\n const c1 = dot(P1.normal, P1.origin);\n const c2 = dot(P2.normal, P2.origin);\n const p0 = scale(add(scale(cross(P2.normal, d), c1), scale(cross(d, P1.normal), c2)), 1 / dd);\n return { a: p0, b: add(p0, d) };\n }\n case 'lineParallelThrough': {\n const P = getPointWorld(c.point, state);\n const dir = sub(getPointWorld(c.dirB, state), getPointWorld(c.dirA, state));\n if (norm(dir) < 1e-12) return { a: P, b: add(P, [1, 0, 0]) }; // hướng suy biến → fallback hữu hạn (đồng bộ siblings)\n return { a: P, b: add(P, dir) };\n }\n case 'linePerpToPlane': {\n const P = getPointWorld(c.point, state);\n const { normal } = planeOriginNormal(c.plane, state, 'linePerpToPlane');\n return { a: P, b: add(P, normal) }; // hướng = pháp tuyến (đã chuẩn hoá)\n }\n default: {\n const _exhaustive: never = c;\n void _exhaustive;\n throw new Error('lineConstructionWorld: kind không hỗ trợ');\n }\n }\n}\n\n// Giải hệ 3×3 M·x = b bằng Cramer. |det|<1e-9 → null (suy biến).\nfunction solve3(M: number[][], b: Vec3): Vec3 | null {\n const det3 = (m: number[][]): number =>\n m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) -\n m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) +\n m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);\n const det = det3(M);\n if (Math.abs(det) < 1e-9) return null;\n const colDet = (j: number): number => {\n const A = M.map((r) => r.slice());\n for (let i = 0; i < 3; i++) A[i][j] = b[i];\n return det3(A);\n };\n return [colDet(0) / det, colDet(1) / det, colDet(2) / det];\n}\n\nexport function constraintToWorld(c: Constraint3D, state: State): Vec3 {\n // Check TRƯỚC khi tăng (cân bằng: throw không tăng → finally không decrement\n // lệch; counter luôn về 0 sau unwind).\n if (_recDepth >= MAX_REC_DEPTH) throw new Error('constraintToWorld: đệ quy quá sâu — chu trình tham chiếu?');\n _recDepth++;\n try {\n return constraintToWorldInner(c, state);\n } finally {\n _recDepth--;\n }\n}\n\nfunction constraintToWorldInner(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 { a, b } = lineEndpointsWorld(c.lineId, state, 'onLine');\n return add(a, scale(sub(b, a), 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 // ───── Điểm phái sinh (v1) ─────\n case 'midpoint': {\n const p1 = getPointWorld(c.p1, state);\n const p2 = getPointWorld(c.p2, state);\n return scale(add(p1, p2), 0.5);\n }\n case 'centroid': {\n const n = c.vertices.length;\n if (n === 0) return [0, 0, 0];\n let acc: Vec3 = [0, 0, 0];\n for (const id of c.vertices) acc = add(acc, getPointWorld(id, state));\n return scale(acc, 1 / n);\n }\n case 'circumsphereCenter': {\n // Tâm cách đều mọi đỉnh: trừ |O−P₀|²=R² cho |O−Pᵢ|²=R² ⟹ 2(Pᵢ−P₀)·O = |Pᵢ|²−|P₀|².\n // Giải bình phương tối thiểu qua normal equations AᵀA·O = Aᵀb (3×3).\n const P = c.vertices.map((id) => getPointWorld(id, state));\n if (P.length < 4) return P.length ? P[0] : [0, 0, 0];\n const p0 = P[0];\n const M = [[0, 0, 0], [0, 0, 0], [0, 0, 0]];\n const rhs: Vec3 = [0, 0, 0];\n for (let i = 1; i < P.length; i++) {\n const r: Vec3 = [2 * (P[i][0] - p0[0]), 2 * (P[i][1] - p0[1]), 2 * (P[i][2] - p0[2])];\n const bi = dot(P[i], P[i]) - dot(p0, p0);\n for (let a = 0; a < 3; a++) {\n for (let bcol = 0; bcol < 3; bcol++) M[a][bcol] += r[a] * r[bcol];\n rhs[a] += r[a] * bi;\n }\n }\n const sol = solve3(M, rhs);\n if (sol) return sol;\n // Suy biến (đỉnh đồng phẳng/cộng tuyến) → trung bình đỉnh (hữu hạn, không NaN).\n let acc: Vec3 = [0, 0, 0];\n for (const p of P) acc = add(acc, p);\n return scale(acc, 1 / P.length);\n }\n case 'pyramidInsphereCenter': {\n // Tâm cầu nội tiếp chóp đều: trên trục G→S (G=centroid đáy), cách đều đáy + mặt bên.\n // s = m·(G−A₀) / (1 − m·n) với n=pháp tuyến đáy↑apex, m=pháp tuyến 1 mặt bên↑trong.\n const S = getPointWorld(c.apex, state);\n const base = c.vertices.map((id) => getPointWorld(id, state));\n const n = base.length;\n if (n < 3) return S;\n let G: Vec3 = [0, 0, 0];\n for (const p of base) G = add(G, p);\n G = scale(G, 1 / n);\n let nb = normalize(cross(sub(base[1], base[0]), sub(base[2], base[0])));\n if (dot(nb, sub(S, G)) < 0) nb = scale(nb, -1);\n let m = normalize(cross(sub(base[0], S), sub(base[1], S)));\n if (dot(m, sub(G, base[0])) < 0) m = scale(m, -1);\n const denom = 1 - dot(m, nb);\n const s = Math.abs(denom) < 1e-9 ? NaN : dot(m, sub(G, base[0])) / denom;\n if (!Number.isFinite(s) || s <= 0) {\n // fallback hữu hạn: centroid (apex + base)\n return scale(add(S, scale(G, n)), 1 / (n + 1));\n }\n return add(G, scale(nb, s));\n }\n case 'faceCircumcenter': {\n // Tâm ngoại tiếp tam giác (3 đỉnh đầu) trong 3D: giải 3×3 [2(P1−P0); 2(P2−P0); n]·O = rhs.\n const P = c.vertices.map((id) => getPointWorld(id, state));\n if (P.length < 3) return P.length ? P[0] : [0, 0, 0];\n const [p0, p1, p2] = P;\n const e1 = sub(p1, p0), e2 = sub(p2, p0);\n const nrm = cross(e1, e2);\n const M = [\n [2 * e1[0], 2 * e1[1], 2 * e1[2]],\n [2 * e2[0], 2 * e2[1], 2 * e2[2]],\n [nrm[0], nrm[1], nrm[2]],\n ];\n const rhs: Vec3 = [dot(p1, p1) - dot(p0, p0), dot(p2, p2) - dot(p0, p0), dot(nrm, p0)];\n const sol = solve3(M, rhs);\n if (sol) return sol;\n return scale(add(add(p0, p1), p2), 1 / 3); // suy biến (collinear) → centroid hữu hạn\n }\n case 'pointAboveFace': {\n // Tâm đáy-TRÊN của trụ đứng ⊥ MẶT (tứ diện): tâm mặt + (chiều cao ⊥ đỉnh-đối→mặt)·pháp\n // tuyến ⟹ trục topCenter−base ⊥ mặt dù layout tứ diện không-đều (trục đúng, vành nằm trên mặt).\n const G = getPointWorld(c.base, state);\n const P = c.vertices.map((id) => getPointWorld(id, state));\n if (P.length < 3) return G;\n let n = normalize(cross(sub(P[1], P[0]), sub(P[2], P[0])));\n const S = getPointWorld(c.apex, state);\n if (dot(n, sub(S, P[0])) < 0) n = scale(n, -1); // hướng về đỉnh đối\n const h = dot(sub(S, P[0]), n); // chiều cao ⊥ đỉnh→mặt-phẳng\n if (!Number.isFinite(h) || h <= 1e-9) return G; // suy biến → trùng base (hữu hạn)\n return add(G, scale(n, h));\n }\n case 'intersectionLines': {\n const A = getPointWorld(c.a1, state), B = getPointWorld(c.b1, state);\n const C = getPointWorld(c.a2, state), D = getPointWorld(c.b2, state);\n return lineLineClosestMidpoint(A, B, C, D);\n }\n case 'intersectionLinePlane': {\n const A = getPointWorld(c.a, state), B = getPointWorld(c.b, state);\n const plane = state.objects[c.plane];\n if (!plane || plane.kind !== 'plane3d') throw new Error('intersectionLinePlane: mặt phẳng thiếu');\n const { origin, normal } = getPlaneBasis(plane as SceneObject<Plane3DAttrs>, state);\n const dir = sub(B, A);\n const dn = dot(dir, normal);\n if (Math.abs(dn) < 1e-12) return A; // đường song song mặt phẳng → vô định\n const t = dot(sub(origin, A), normal) / dn;\n return add(A, scale(dir, t));\n }\n case 'perpFootLine': {\n // Hình chiếu vuông góc của `from` lên đường (a,b).\n const P = getPointWorld(c.from, state);\n const A = getPointWorld(c.a, state), B = getPointWorld(c.b, state);\n const u = sub(B, A);\n const uu = dot(u, u);\n const t = uu === 0 ? 0 : dot(sub(P, A), u) / uu;\n return add(A, scale(u, t));\n }\n case 'perpFootPlane': {\n // Chân ⊥ xuống mặt: P − ((P−origin)·n) n.\n const P = getPointWorld(c.from, state);\n const plane = state.objects[c.plane];\n if (!plane || plane.kind !== 'plane3d') throw new Error('perpFootPlane: mặt phẳng thiếu');\n const { origin, normal } = getPlaneBasis(plane as SceneObject<Plane3DAttrs>, state);\n const dist = dot(sub(P, origin), normal);\n return sub(P, scale(normal, dist));\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 if (!a.p1 || !a.p2) return current; // line3d construction-variant: không kéo được trên nó\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 // Điểm PHÁI SINH (midpoint/centroid/intersection*/perpFoot…) KHÔNG kéo được\n // → trả constraint hiện tại không đổi (giống điểm derived 2D worldToConstraint).\n // Liệt kê TƯỜNG MINH + never-guard (mô phỏng constraintRefs): thêm constraint\n // kind KÉO ĐƯỢC mới mà quên arm ở đây sẽ bị compiler chặn, không âm thầm hoá\n // non-draggable.\n case 'midpoint':\n case 'centroid':\n case 'intersectionLines':\n case 'intersectionLinePlane':\n case 'perpFootLine':\n case 'perpFootPlane':\n case 'circumsphereCenter':\n case 'pyramidInsphereCenter':\n case 'faceCircumcenter':\n case 'pointAboveFace':\n return current;\n default: {\n const _exhaustive: never = current;\n void _exhaustive;\n return current;\n }\n }\n}\n","// src/core/scene/kinds/point3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef, RenderCtx, SceneObject } from '../types';\nimport { type Constraint3D, constraintRefs } from './3d-constraint';\nimport { constraintToWorld } from './constraint3d-math';\n\nexport type Point3DAttrs = {\n constraint: Constraint3D;\n color?: string;\n};\n\nconst def: KindDef<Point3DAttrs> = {\n type: 'point3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || !a.constraint || !a.constraint.kind) {\n throw new Error('point3d: constraint required');\n }\n },\n dependsOn: (a) => constraintRefs(a.constraint),\n measure: (obj) => {\n const c = obj.attrs.constraint;\n if (c.kind === 'free') {\n return [\n { label: 'x', value: c.x },\n { label: 'y', value: c.y },\n { label: 'z', value: c.z },\n ];\n }\n if (c.kind === 'onGround') {\n return [\n { label: 'x', value: c.x },\n { label: 'y', value: c.y },\n { label: 'z', value: 0 },\n ];\n }\n return null;\n },\n describe: (obj) => {\n const c = obj.attrs.constraint;\n if (c.kind === 'free') return `${obj.label} = (${c.x.toFixed(2)}, ${c.y.toFixed(2)}, ${c.z.toFixed(2)})`;\n if (c.kind === 'onGround') return `${obj.label} = (${c.x.toFixed(2)}, ${c.y.toFixed(2)}, 0)`;\n if (c.kind === 'onAxis') return `${obj.label} trên trục ${c.axis} (t=${c.t.toFixed(2)})`;\n if (c.kind === 'onPlane') return `${obj.label} trên mặt ${c.planeId}`;\n if (c.kind === 'onLine') return `${obj.label} trên đường ${c.lineId}`;\n if (c.kind === 'onPolygon') return `${obj.label} trên đa giác ${c.polygonId}`;\n if (c.kind === 'onSphere') return `${obj.label} trên mặt cầu ${c.sphereId}`;\n // Điểm phái sinh — mô tả construct để row title / tooltip không chỉ là nhãn trơ.\n if (c.kind === 'midpoint') return `${obj.label} = trung điểm ${c.p1}${c.p2}`;\n if (c.kind === 'centroid') return `${obj.label} = trọng tâm ${c.vertices.join('')}`;\n if (c.kind === 'intersectionLines') return `${obj.label} = giao 2 đường (${c.a1}${c.b1}, ${c.a2}${c.b2})`;\n if (c.kind === 'intersectionLinePlane') return `${obj.label} = giao ${c.a}${c.b} ∩ ${c.plane}`;\n if (c.kind === 'perpFootLine') return `${obj.label} = chân ⊥ từ ${c.from} xuống ${c.a}${c.b}`;\n if (c.kind === 'perpFootPlane') return `${obj.label} = chân ⊥ từ ${c.from} xuống ${c.plane}`;\n if (c.kind === 'pyramidInsphereCenter') return `${obj.label} = tâm cầu nội tiếp chóp ${c.apex}.${c.vertices.join('')}`;\n if (c.kind === 'faceCircumcenter') return `${obj.label} = tâm ngoại tiếp ${c.vertices.join('')}`;\n if (c.kind === 'pointAboveFace') return `${obj.label} = đỉnh trục trụ ⊥ mặt ${c.vertices.join('')}`;\n return obj.label;\n },\n render: (obj, ctx: RenderCtx) => {\n const view = ctx.jxg as any;\n const c = obj.attrs.constraint;\n const opts = {\n name: obj.label,\n visible: obj.visible,\n fixed: obj.locked,\n strokeColor: obj.attrs.color ?? '#1e40af',\n fillColor: obj.attrs.color ?? '#1e40af',\n size: 4,\n };\n if (c.kind === 'free') {\n return view.create('point3d', [c.x, c.y, c.z], opts);\n } else if (c.kind === 'onGround') {\n return view.create('point3d', [c.x, c.y, 0], opts);\n } else if (c.kind === 'onAxis') {\n const coords =\n c.axis === 'x' ? [c.t, 0, 0] :\n c.axis === 'y' ? [0, c.t, 0] :\n [0, 0, c.t];\n return view.create('point3d', coords, opts);\n } else if (c.kind === 'onPlane') {\n const plane = ctx.resolveRef(c.planeId) as any;\n return view.create('point3d', [\n () => plane.F(c.u, c.v)[0],\n () => plane.F(c.u, c.v)[1],\n () => plane.F(c.u, c.v)[2],\n ], opts);\n } else if (c.kind === 'onLine') {\n const line = ctx.resolveRef(c.lineId) as any;\n return view.create('point3d', [\n () => line.F(c.t)[0],\n () => line.F(c.t)[1],\n () => line.F(c.t)[2],\n ], opts);\n } else if (c.kind === 'onPolygon') {\n const poly = ctx.resolveRef(c.polygonId) as any;\n return view.create('point3d', [\n () => poly.F(c.u, c.v)[0],\n () => poly.F(c.u, c.v)[1],\n () => poly.F(c.u, c.v)[2],\n ], opts);\n } else if (c.kind === 'onSphere') {\n const sph = ctx.resolveRef(c.sphereId) as any;\n return view.create('point3d', [\n () => sph.F(c.theta, c.phi)[0],\n () => sph.F(c.theta, c.phi)[1],\n () => sph.F(c.theta, c.phi)[2],\n ], opts);\n }\n // Điểm PHÁI SINH (midpoint/centroid/intersection*/perpFoot…): toạ độ tính từ\n // constraintToWorld đọc State SỐNG (ctx.getState) → function-based point3d.\n // needsRegularUpdate để JSXGraph re-eval mỗi board.update() (khi điểm gốc bị\n // recreate lúc kéo). KHÔNG capture element gốc (sẽ chết sau recreate) — đọc\n // state tươi mỗi lần eval. Xem docs/.../2026-06-21-3d-foundation-v1-design.md.\n const getState = ctx.getState;\n if (getState) {\n const cw = () => constraintToWorld(c, getState());\n return view.create('point3d', [\n () => cw()[0],\n () => cw()[1],\n () => cw()[2],\n ], { ...opts, needsRegularUpdate: true });\n }\n return view.create('point3d', [0, 0, 0], opts);\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/labelOf.ts\nimport type { State } from '../types';\n\n/**\n * Resolve một object id sang label hiển thị. Dùng trong describe() để show\n * tên đẹp (\"AB\") thay vì internal id (\"p_1p_2\"). Fallback về id nếu không\n * tìm thấy (vd state chưa truyền vào, hoặc ref chỉ tới object đã bị xoá).\n */\nexport function labelOf(id: string, state: State | undefined): string {\n return state?.objects[id]?.label ?? id;\n}\n","// src/core/scene/kinds/segment3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Segment3DAttrs = { p1: string; p2: string; color?: string };\n\nconst def: KindDef<Segment3DAttrs> = {\n type: 'segment3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.p1 || !a?.p2) throw new Error('segment3d: p1 và p2 bắt buộc');\n },\n dependsOn: (a) => [a.p1, a.p2],\n measure: (obj, state) => {\n const p1 = state.objects[obj.attrs.p1];\n const p2 = state.objects[obj.attrs.p2];\n if (!p1 || !p2) return null;\n const c1 = (p1.attrs as { constraint?: { kind: string; x?: number; y?: number; z?: number } }).constraint;\n const c2 = (p2.attrs as { constraint?: { kind: string; x?: number; y?: number; z?: number } }).constraint;\n if (c1?.kind !== 'free' || c2?.kind !== 'free') return null;\n const dx = (c2.x ?? 0) - (c1.x ?? 0);\n const dy = (c2.y ?? 0) - (c1.y ?? 0);\n const dz = (c2.z ?? 0) - (c1.z ?? 0);\n return [{ label: 'length', value: Math.hypot(dx, dy, dz) }];\n },\n describe: (obj, state) => `Đoạn thẳng ${labelOf(obj.attrs.p1, state)}${labelOf(obj.attrs.p2, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const pA = ctx.resolveRef(obj.attrs.p1);\n const pB = ctx.resolveRef(obj.attrs.p2);\n return view.create('line3d', [pA, pB], {\n straightFirst: false,\n straightLast: false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: 2,\n visible: obj.visible,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/line3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\nimport { lineConstructionWorld } from './constraint3d-math';\n\n/**\n * Cách dựng ĐƯỜNG phái sinh (mô phỏng 2D LineConstruction). Khi `construction`\n * có mặt, `p1`/`p2` bị bỏ qua — renderer dựng đường từ toạ độ TÍNH (function-\n * based, đọc State sống) để live-update đúng dù điểm gốc bị recreate mỗi frame\n * kéo (gotcha recreate-mỗi-frame, xem constraint3d-math.ts / design doc v1).\n */\nexport type Line3DConstruction =\n // Giao tuyến 2 mặt phẳng (object). a,b = 2 điểm trên giao tuyến.\n | { kind: 'planePlaneIntersection'; plane1: string; plane2: string }\n // Đường qua `point` song song hướng dirA→dirB (2 điểm — hitTest chưa pick được\n // đường nên dùng 2 điểm xác định hướng, mô phỏng v1 intersectionLines).\n | { kind: 'lineParallelThrough'; point: string; dirA: string; dirB: string }\n // Đường qua `point` vuông góc với mặt `plane` (hướng = pháp tuyến mặt).\n | { kind: 'linePerpToPlane'; point: string; plane: string };\n\nexport type Line3DAttrs = {\n /** Hai-điểm fallback — bắt buộc khi KHÔNG có `construction`. */\n p1?: string;\n p2?: string;\n construction?: Line3DConstruction;\n color?: string;\n};\n\nexport function line3dConstructionRefs(c: Line3DConstruction): string[] {\n switch (c.kind) {\n case 'planePlaneIntersection': return [c.plane1, c.plane2];\n case 'lineParallelThrough': return [c.point, c.dirA, c.dirB];\n case 'linePerpToPlane': return [c.point, c.plane];\n default: {\n const _exhaustive: never = c;\n void _exhaustive;\n return [];\n }\n }\n}\n\nconst def: KindDef<Line3DAttrs> = {\n type: 'line3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (a?.construction) return;\n if (!a?.p1 || !a?.p2) throw new Error('line3d: p1/p2 required (hoặc construction)');\n },\n dependsOn: (a) => (a.construction ? line3dConstructionRefs(a.construction) : [a.p1!, a.p2!]),\n describe: (obj, state) => {\n const c = obj.attrs.construction;\n if (!c) return `Đường ${obj.label} qua ${labelOf(obj.attrs.p1!, state)}, ${labelOf(obj.attrs.p2!, state)}`;\n switch (c.kind) {\n case 'planePlaneIntersection':\n return `Giao tuyến ${obj.label} = ${labelOf(c.plane1, state)} ∩ ${labelOf(c.plane2, state)}`;\n case 'lineParallelThrough':\n return `${obj.label} ∥ ${labelOf(c.dirA, state)}${labelOf(c.dirB, state)} qua ${labelOf(c.point, state)}`;\n case 'linePerpToPlane':\n return `${obj.label} ⊥ ${labelOf(c.plane, state)} qua ${labelOf(c.point, state)}`;\n default: return obj.label;\n }\n },\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const baseOpts = {\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: 2,\n visible: obj.visible,\n };\n const c = obj.attrs.construction;\n if (c) {\n // Đường phái sinh: toạ độ TÍNH tươi mỗi eval (KHÔNG capture element gốc —\n // gotcha recreate-mỗi-frame). Hàm-điểm + needsRegularUpdate (giống point3d).\n const getState = ctx.getState;\n if (!getState) throw new Error('line3d construction: cần ctx.getState');\n const lc = () => lineConstructionWorld(c, getState());\n return view.create('line3d', [() => lc().a, () => lc().b], {\n ...baseOpts,\n straightFirst: true,\n straightLast: true,\n needsRegularUpdate: true,\n });\n }\n const pA = ctx.resolveRef(obj.attrs.p1!);\n const pB = ctx.resolveRef(obj.attrs.p2!);\n return view.create('line3d', [pA, pB], {\n ...baseOpts,\n straightFirst: true,\n straightLast: true,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/ray3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Ray3DAttrs = { origin: string; through: string; color?: string };\n\nregisterKind<Ray3DAttrs>({\n type: 'ray3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.origin || !a?.through) throw new Error('ray3d: origin/through required'); },\n dependsOn: (a) => [a.origin, a.through],\n describe: (obj, state) => `Tia ${obj.label} từ ${labelOf(obj.attrs.origin, state)} qua ${labelOf(obj.attrs.through, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const pOrigin = ctx.resolveRef(obj.attrs.origin);\n const pThrough = ctx.resolveRef(obj.attrs.through);\n return view.create('line3d', [pOrigin, pThrough], {\n straightFirst: false,\n straightLast: true,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: 2,\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/vector3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Vector3DAttrs = { from: string; to: string; color?: string };\n\nregisterKind<Vector3DAttrs>({\n type: 'vector3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.from || !a?.to) throw new Error('vector3d: from/to required'); },\n dependsOn: (a) => [a.from, a.to],\n describe: (obj, state) => `Véc-tơ ${obj.label}: ${labelOf(obj.attrs.from, state)} → ${labelOf(obj.attrs.to, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const pFrom = ctx.resolveRef(obj.attrs.from);\n const pTo = ctx.resolveRef(obj.attrs.to);\n return view.create('line3d', [pFrom, pTo], {\n straightFirst: false,\n straightLast: false,\n lastArrow: { type: 1 },\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: 2,\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/plane3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\nimport { planeConstructionWorld } from './constraint3d-math';\n\n/**\n * Cách dựng MẶT phái sinh (mô phỏng 2D construction). Khi `construction` có mặt,\n * p1/p2/p3 bị bỏ qua — renderer dựng mặt từ 3 điểm TÍNH (function-based, đọc\n * State sống) để live-update đúng dù điểm gốc recreate mỗi frame.\n */\nexport type Plane3DConstruction =\n // Mặt qua `point` song song mặt `refPlane` (cùng cặp vector chỉ phương).\n | { kind: 'planeParallelThrough'; point: string; refPlane: string }\n // Mặt qua `point` vuông góc hướng lineA→lineB (2 điểm — pháp tuyến = hướng).\n | { kind: 'planePerpToLine'; point: string; lineA: string; lineB: string };\n\nexport type Plane3DAttrs = {\n /** 3-điểm fallback — bắt buộc khi KHÔNG có `construction`. */\n p1?: string;\n p2?: string;\n p3?: string;\n construction?: Plane3DConstruction;\n color?: string;\n};\n\nexport function plane3dConstructionRefs(c: Plane3DConstruction): string[] {\n switch (c.kind) {\n case 'planeParallelThrough': return [c.point, c.refPlane];\n case 'planePerpToLine': return [c.point, c.lineA, c.lineB];\n default: {\n const _exhaustive: never = c;\n void _exhaustive;\n return [];\n }\n }\n}\n\nconst def: KindDef<Plane3DAttrs> = {\n type: 'plane3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (a?.construction) return;\n if (!a?.p1 || !a?.p2 || !a?.p3) throw new Error('plane3d: cần 3 điểm (hoặc construction)');\n },\n dependsOn: (a) => (a.construction ? plane3dConstructionRefs(a.construction) : [a.p1!, a.p2!, a.p3!]),\n describe: (obj, state) => {\n const c = obj.attrs.construction;\n if (!c) {\n return `Mặt ${obj.label} qua ${labelOf(obj.attrs.p1!, state)}, ${labelOf(obj.attrs.p2!, state)}, ${labelOf(obj.attrs.p3!, state)}`;\n }\n switch (c.kind) {\n case 'planeParallelThrough':\n return `${obj.label} ∥ ${labelOf(c.refPlane, state)} qua ${labelOf(c.point, state)}`;\n case 'planePerpToLine':\n return `${obj.label} ⊥ ${labelOf(c.lineA, state)}${labelOf(c.lineB, state)} qua ${labelOf(c.point, state)}`;\n default: return obj.label;\n }\n },\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const opts = {\n fillOpacity: 0.15,\n fillColor: obj.attrs.color ?? '#60a5fa',\n strokeColor: obj.attrs.color ?? '#60a5fa',\n visible: obj.visible,\n };\n const c = obj.attrs.construction;\n if (c) {\n // Mặt phái sinh: 3 điểm TÍNH tươi mỗi eval (function-coord) — KHÔNG capture\n // element gốc (gotcha recreate-mỗi-frame). needsRegularUpdate re-eval.\n const getState = ctx.getState;\n if (!getState) throw new Error('plane3d construction: cần ctx.getState');\n const pc = () => planeConstructionWorld(c, getState());\n // GOTCHA (verify Playwright): JSXGraph plane3d nhận [point, direction1,\n // direction2] với direction là toạ độ THÔ (vector từ gốc) — KHÔNG phải 3\n // điểm. Truyền 3 điểm thô → p2,p3 bị hiểu là vector-từ-gốc → mặt lệch khi\n // không qua gốc. Đúng: point + (p2−p1) + (p3−p1).\n const diff = (which: 'p2' | 'p3'): number[] => {\n const r = pc();\n const q = r[which];\n return [q[0] - r.p1[0], q[1] - r.p1[1], q[2] - r.p1[2]];\n };\n return view.create('plane3d', [() => pc().p1, () => diff('p2'), () => diff('p3')], {\n ...opts,\n needsRegularUpdate: true,\n });\n }\n return view.create('plane3d', [\n ctx.resolveRef(obj.attrs.p1!),\n ctx.resolveRef(obj.attrs.p2!),\n ctx.resolveRef(obj.attrs.p3!),\n ], opts);\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/polygon3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport type Polygon3DAttrs = { vertices: string[]; color?: string };\n\nregisterKind<Polygon3DAttrs>({\n type: 'polygon3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.vertices || a.vertices.length < 3) throw new Error('polygon3d: cần ≥3 vertices');\n },\n dependsOn: (a) => [...a.vertices],\n describe: (obj) => `Đa giác ${obj.label} (${obj.attrs.vertices.length} đỉnh)`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const refs = obj.attrs.vertices.map(id => ctx.resolveRef(id));\n return view.create('polygon3d', [refs], {\n fillOpacity: 0.3,\n fillColor: obj.attrs.color ?? '#60a5fa',\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/sphere3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Sphere3DAttrs = { center: string; surfacePoint: string; color?: string };\n\nregisterKind<Sphere3DAttrs>({\n type: 'sphere3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.center || !a?.surfacePoint) throw new Error('sphere3d: center/surfacePoint required'); },\n dependsOn: (a) => [a.center, a.surfacePoint],\n describe: (obj, state) => `Mặt cầu ${obj.label} tâm ${labelOf(obj.attrs.center, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n return view.create('sphere3d', [\n ctx.resolveRef(obj.attrs.center),\n ctx.resolveRef(obj.attrs.surfacePoint),\n ], {\n fillOpacity: 0.25,\n fillColor: obj.attrs.color ?? '#60a5fa',\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/polyhedron3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport type PolyhedronFlavor = 'pyramid' | 'prism' | 'tetrahedron' | 'cube';\n\nexport type Polyhedron3DAttrs = {\n flavor: PolyhedronFlavor;\n vertices: string[];\n faces: number[][];\n color?: string;\n};\n\nconst FLAVOR_LABEL: Record<PolyhedronFlavor, string> = {\n pyramid: 'chóp',\n prism: 'lăng trụ',\n tetrahedron: 'tứ diện',\n cube: 'lập phương',\n};\n\nregisterKind<Polyhedron3DAttrs>({\n type: 'polyhedron3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.vertices || a.vertices.length < 4) throw new Error('polyhedron3d: cần ≥4 vertices');\n if (!a?.faces || a.faces.length < 4) throw new Error('polyhedron3d: cần ≥4 faces');\n },\n dependsOn: (a) => [...a.vertices],\n describe: (obj) => `Khối ${FLAVOR_LABEL[obj.attrs.flavor]} ${obj.label}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const verts = obj.attrs.vertices.map(id => ctx.resolveRef(id));\n const faces = obj.attrs.faces.map((faceIndices, fi) =>\n view.create('polygon3d', [faceIndices.map(i => verts[i])], {\n id: `${obj.id}.face${faceIndices.join('-')}.${fi}`,\n fillOpacity: 0.25,\n fillColor: obj.attrs.color ?? '#fbbf24',\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n })\n );\n return { faces };\n },\n});\n","// src/core/scene/kinds/_ringBasis.ts\n// Cặp vector đơn vị ⊥ trục, để cone3d/cylinder3d dựng vành đáy NẰM TRÊN mặt ⊥ trục\n// (thay vì luôn ngang XY). Trục ĐỨNG → vành ngang (backward-compat render cũ); trục\n// NGHIÊNG (nón/trụ nội tiếp mặt nghiêng) → vành đúng trên mặt đáy.\nexport type V3 = [number, number, number];\n\nexport function perpBasis(axis: V3): [V3, V3] {\n const n = Math.hypot(axis[0], axis[1], axis[2]);\n if (n < 1e-12) return [[1, 0, 0], [0, 1, 0]]; // trục suy biến → XY (giữ hành vi cũ)\n const a: V3 = [axis[0] / n, axis[1] / n, axis[2] / n];\n // seed không song song trục (z-up trừ khi trục gần đứng → dùng x).\n const seed: V3 = Math.abs(a[2]) < 0.9 ? [0, 0, 1] : [1, 0, 0];\n // u = normalize(seed × a) ⊥ a\n let u: V3 = [\n seed[1] * a[2] - seed[2] * a[1],\n seed[2] * a[0] - seed[0] * a[2],\n seed[0] * a[1] - seed[1] * a[0],\n ];\n const un = Math.hypot(u[0], u[1], u[2]) || 1;\n u = [u[0] / un, u[1] / un, u[2] / un];\n // v = a × u (đơn vị, ⊥ cả a và u)\n const v: V3 = [\n a[1] * u[2] - a[2] * u[1],\n a[2] * u[0] - a[0] * u[2],\n a[0] * u[1] - a[1] * u[0],\n ];\n return [u, v];\n}\n","// src/core/scene/kinds/cylinder3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { perpBasis } from './_ringBasis';\n\nexport type Cylinder3DAttrs = { baseCenter: string; topCenter: string; radius: number; color?: string };\n\n// Faceted cylinder: 16 segments, copied from old JxgRenderer faceted.ts approach.\nconst CURVED_SEGMENTS = 16;\n\nregisterKind<Cylinder3DAttrs>({\n type: 'cylinder3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.baseCenter || !a?.topCenter) throw new Error('cylinder3d: baseCenter/topCenter required');\n if (!(a.radius > 0)) throw new Error('cylinder3d: radius > 0');\n },\n dependsOn: (a) => [a.baseCenter, a.topCenter],\n describe: (obj) => `Trụ ${obj.label} R=${obj.attrs.radius.toFixed(2)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const a = ctx.resolveRef(obj.attrs.baseCenter) as any;\n const b = ctx.resolveRef(obj.attrs.topCenter) as any;\n const r = obj.attrs.radius;\n // Read world coords from JSXGraph point3d objects at render time.\n const ax = a.X?.() ?? 0, ay = a.Y?.() ?? 0, az = a.Z?.() ?? 0;\n const bx = b.X?.() ?? 0, by = b.Y?.() ?? 0, bz = b.Z?.() ?? 0;\n // Build faceted cylinder vertices. Vành 2 đáy nằm trên mặt ⊥ trục (base→top) — trục\n // đứng ⟹ vành ngang (như cũ); trục nghiêng (trụ nội tiếp mặt nghiêng) ⟹ vành đúng mặt.\n const [u, v] = perpBasis([bx - ax, by - ay, bz - az]);\n const baseRing: [number, number, number][] = [];\n const topRing: [number, number, number][] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n const c = Math.cos(theta), s = Math.sin(theta);\n const ox = r * (c * u[0] + s * v[0]);\n const oy = r * (c * u[1] + s * v[1]);\n const oz = r * (c * u[2] + s * v[2]);\n baseRing.push([ax + ox, ay + oy, az + oz]);\n topRing.push([bx + ox, by + oy, bz + oz]);\n }\n const vertices = [...baseRing, ...topRing];\n const faces: number[][] = [];\n faces.push(baseRing.map((_, i) => i));\n faces.push(topRing.map((_, i) => CURVED_SEGMENTS + i));\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const next = (i + 1) % CURVED_SEGMENTS;\n faces.push([i, next, CURVED_SEGMENTS + next, CURVED_SEGMENTS + i]);\n }\n const vertJxgs: unknown[] = vertices.map((v, i) =>\n view.create('point3d', v, {\n id: `${obj.id}.v${i}`,\n visible: false,\n fixed: true,\n withLabel: false,\n })\n );\n const faceJxgs: unknown[] = faces.map((face, fi) =>\n view.create('polygon3d', [face.map(idx => vertJxgs[idx])], {\n id: `${obj.id}.face${fi}`,\n fillOpacity: 0.25,\n fillColor: obj.attrs.color ?? '#f97316',\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n })\n );\n return { _verts: vertJxgs, faces: faceJxgs };\n },\n});\n","// src/core/scene/kinds/cone3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { perpBasis } from './_ringBasis';\n\nexport type Cone3DAttrs = { baseCenter: string; apex: string; radius: number; color?: string };\n\n// Faceted cone: 16 segments, copied from old JxgRenderer faceted.ts approach.\nconst CURVED_SEGMENTS = 16;\n\nregisterKind<Cone3DAttrs>({\n type: 'cone3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.baseCenter || !a?.apex) throw new Error('cone3d: baseCenter/apex required');\n if (!(a.radius > 0)) throw new Error('cone3d: radius > 0');\n },\n dependsOn: (a) => [a.baseCenter, a.apex],\n describe: (obj) => `Nón ${obj.label} R=${obj.attrs.radius.toFixed(2)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const base = ctx.resolveRef(obj.attrs.baseCenter) as any;\n const apexPt = ctx.resolveRef(obj.attrs.apex) as any;\n const r = obj.attrs.radius;\n // Read world coords from JSXGraph point3d objects at render time.\n const bx = base.X?.() ?? 0, by = base.Y?.() ?? 0, bz = base.Z?.() ?? 0;\n const apexCoords: [number, number, number] = [\n apexPt.X?.() ?? 0,\n apexPt.Y?.() ?? 0,\n apexPt.Z?.() ?? 0,\n ];\n // Build faceted cone vertices. Vành đáy nằm trên mặt ⊥ trục (base→apex) — trục đứng\n // ⟹ vành ngang (như cũ); trục nghiêng (nón nội tiếp mặt nghiêng) ⟹ vành đúng mặt đáy.\n const [u, v] = perpBasis([apexCoords[0] - bx, apexCoords[1] - by, apexCoords[2] - bz]);\n const baseRing: [number, number, number][] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n const c = Math.cos(theta), s = Math.sin(theta);\n baseRing.push([\n bx + r * (c * u[0] + s * v[0]),\n by + r * (c * u[1] + s * v[1]),\n bz + r * (c * u[2] + s * v[2]),\n ]);\n }\n const apexIdx = baseRing.length;\n const vertices = [...baseRing, apexCoords];\n const faces: number[][] = [baseRing.map((_, i) => i)];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n faces.push([i, (i + 1) % CURVED_SEGMENTS, apexIdx]);\n }\n const vertJxgs: unknown[] = vertices.map((v, i) =>\n view.create('point3d', v, {\n id: `${obj.id}.v${i}`,\n visible: false,\n fixed: true,\n withLabel: false,\n })\n );\n const faceJxgs: unknown[] = faces.map((face, fi) =>\n view.create('polygon3d', [face.map(idx => vertJxgs[idx])], {\n id: `${obj.id}.face${fi}`,\n fillOpacity: 0.25,\n fillColor: obj.attrs.color ?? '#f59e0b',\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n })\n );\n return { _verts: vertJxgs, faces: faceJxgs };\n },\n});\n","// src/core/scene/kinds/2d-constraint.ts\nexport type Vec2 = [number, number];\n\n/**\n * Phép biến hình áp dụng lên một điểm. Tham số là id điểm/đường gốc, không phải\n * giá trị toạ độ — để dependency graph cập nhật đúng khi user kéo gốc.\n *\n * - translate: dx/dy là số literal (frozen). Trade-off để serialize đơn giản\n * qua JSON; transformed object không tự cập nhật khi user kéo điểm vector.\n * - reflectPoint = rotate π quanh center — biểu diễn riêng để render trực tiếp.\n * - dilate quanh center: implement bằng chain T(-c) → S(k) → T(+c) ở render-time\n * (JSXGraph 'scale' không nhận center).\n */\nexport type TransformDef =\n | { kind: 'translate'; dx: number; dy: number }\n | { kind: 'rotate'; angleRad: number; center: string }\n | { kind: 'reflectLine'; line: string }\n | { kind: 'reflectPoint'; center: string }\n | { kind: 'dilate'; k: number; center: string };\n\nexport function transformRefs(t: TransformDef): string[] {\n switch (t.kind) {\n case 'translate': return [];\n case 'rotate':\n case 'reflectPoint':\n case 'dilate':\n return [t.center];\n case 'reflectLine':\n return [t.line];\n }\n}\n\n/**\n * Nguồn khoảng cách cho pointAtDistance. ids là scene-object id (string).\n *\n * Khoảng cách hiệu dụng: d = scale·base + offset (scale mặc định 1, offset mặc\n * định 0). base ∈ {circleRadius=Radius, segmentLength=|p1p2|, literal=value}.\n * scale/offset OPTIONAL → spec cũ (absent) tính d = base Y HỆT trước (additive).\n * Issue #46 nhóm C (hệ số/bội: \"BD = 2R\", \"BD = 2·AB\", \"BD = R+1\").\n */\nexport type ConstraintDistanceSpec =\n | { kind: 'circleRadius'; circle: string; scale?: number; offset?: number }\n | { kind: 'segmentLength'; p1: string; p2: string; scale?: number; offset?: number }\n | { kind: 'literal'; value: number; scale?: number; offset?: number };\n\nexport type Constraint2D =\n | { kind: 'free'; x: number; y: number }\n | { kind: 'onAxis'; axis: 'x' | 'y'; t: number }\n | { kind: 'onLine'; lineId: string; t: number }\n | { kind: 'onSegment'; segmentId: string; t: number }\n | { kind: 'onCircle'; circleId: string; theta: number }\n | { kind: 'onPolygon'; polygonId: string; u: number; v: number }\n | { kind: 'midpoint'; p1: string; p2: string }\n | { kind: 'transformed'; source: string; transform: TransformDef }\n | { kind: 'perpFoot'; from: string; onLine: string }\n | { kind: 'circumcenter'; vertices: [string, string, string] }\n | { kind: 'incenter'; vertices: [string, string, string] }\n | { kind: 'centroid'; vertices: [string, string, string] }\n | { kind: 'orthocenter'; vertices: [string, string, string] }\n | { kind: 'onPerpendicular'; through: string; perpToA: string; perpToB: string; t: number }\n | { kind: 'onPerpBisector'; p1: string; p2: string; t: number }\n | { kind: 'onCircleAroundPoint'; center: string; radiusPoint: string; theta: number }\n // Tiếp điểm khi vẽ 2 tiếp tuyến từ điểm ngoài đường tròn.\n // `which` chọn 1 trong 2 nhánh (0 = nhánh dương theo Thales, 1 = nhánh âm).\n | { kind: 'tangentPointExt'; from: string; circle: string; which: 0 | 1 }\n // Giao điểm của 2 đường tròn (c1, c2). `which` chọn 1 trong 2 nghiệm.\n | { kind: 'circleIntersection'; c1: string; c2: string; which: 0 | 1 }\n // Giao điểm THỨ HAI của 2 đường tròn (c1, c2), biết điểm chung `exclude`.\n // JSXGraph 'otherintersection' trả nghiệm KHÁC `exclude` — dùng cho đề\n // \"đường tròn đường kính AB, AC đôi một cắt nhau lần thứ hai\" (điểm chung A).\n | { kind: 'circleSecondIntersection'; c1: string; c2: string; exclude: string }\n // Giao điểm THỨ HAI của đường thẳng `line` với đường tròn `circle`, biết\n // giao điểm thứ nhất là `other`.\n | { kind: 'secondIntersection'; line: string; circle: string; other: string }\n // Tiếp điểm của đường thẳng `onLine` (đã tiếp xúc) với đường tròn `circle`\n // = chân vuông góc hạ từ tâm xuống đường thẳng.\n | { kind: 'tangencyPoint'; circle: string; onLine: string }\n // Trung điểm cung AB của đường tròn `circle`. Đúng 1 trong:\n // - `notContaining`: cung KHÔNG chứa điểm này\n // - `containing`: cung CHỨA điểm này (= antipode của trường hợp notContaining)\n | { kind: 'arcMidpoint'; circle: string; a: string; b: string; notContaining?: string; containing?: string }\n // Điểm trên tia from→through kéo dài qua through, cách through khoảng `distance`.\n | { kind: 'pointAtDistance'; from: string; through: string; distance: ConstraintDistanceSpec }\n // Tâm bàng tiếp tam giác `vertices` đối diện đỉnh `opposite`.\n // `opposite` LUÔN là một phần tử của `vertices` (vì vậy constraintRefs2D không cần thêm nó).\n | { kind: 'excenter'; vertices: [string, string, string]; opposite: string }\n // Mixtilinear: tâm (which='center') hoặc tiếp điểm với (O) (which='touch') của\n // đường tròn tiếp xúc 2 cạnh từ `vertices[0]` + tiếp xúc trong đường tròn ngoại tiếp.\n | { kind: 'mixtilinearPoint'; vertices: [string, string, string]; which: 'center' | 'touch' }\n // Tiếp điểm của tiếp tuyến CHUNG 2 đường tròn `circles` (external/internal).\n // `on` = tiếp điểm trên đtròn 0 hay 1; `variant` = ngoài/trong; `side` = chọn 1\n // trong 2 tiếp tuyến cùng loại. Render functional (đọc tâm+R sống của 2 đtròn).\n | { kind: 'commonTangentPoint'; circles: [string, string]; on: 0 | 1; variant: 'external' | 'internal'; side: 0 | 1 };\n\nexport function constraintRefs2D(c: Constraint2D): string[] {\n switch (c.kind) {\n case 'onLine': return [c.lineId];\n case 'onSegment': return [c.segmentId];\n case 'onCircle': return [c.circleId];\n case 'onPolygon': return [c.polygonId];\n case 'midpoint': return [c.p1, c.p2];\n case 'transformed': return [c.source, ...transformRefs(c.transform)];\n case 'perpFoot': return [c.from, c.onLine];\n case 'circumcenter': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n case 'incenter': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n case 'centroid': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n case 'orthocenter': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n case 'onPerpendicular': return [c.through, c.perpToA, c.perpToB];\n case 'onPerpBisector': return [c.p1, c.p2];\n case 'onCircleAroundPoint': return [c.center, c.radiusPoint];\n case 'tangentPointExt': return [c.from, c.circle];\n case 'circleIntersection': return [c.c1, c.c2];\n case 'circleSecondIntersection': return [c.c1, c.c2, c.exclude];\n case 'secondIntersection': return [c.line, c.circle, c.other];\n case 'tangencyPoint': return [c.circle, c.onLine];\n case 'arcMidpoint': {\n const containment = c.notContaining ?? c.containing;\n return containment ? [c.circle, c.a, c.b, containment] : [c.circle, c.a, c.b];\n }\n case 'mixtilinearPoint': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n case 'pointAtDistance': {\n const d = c.distance;\n const extra = d.kind === 'circleRadius' ? [d.circle]\n : d.kind === 'segmentLength' ? [d.p1, d.p2] : [];\n return [c.from, c.through, ...extra];\n }\n case 'excenter': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n case 'commonTangentPoint': return [c.circles[0], c.circles[1]];\n // Các kind KHÔNG có ref scene-object (toạ độ literal): liệt kê TƯỜNG MINH để\n // exhaustive never-guard bên dưới buộc khai báo khi thêm constraint kind mới.\n case 'free':\n case 'onAxis': return [];\n default: {\n // Thêm constraint kind có ref mà quên case ở trên → compile-error tại đây\n // (thay vì âm thầm return [] khiến dependency graph / cascade-delete bỏ sót).\n const _exhaustive: never = c;\n void _exhaustive;\n return [];\n }\n }\n}\n","// point-constraints/_types.ts\nimport type { RenderCtx, SceneObject, State } from '../../types';\nimport type { Constraint2D } from '../2d-constraint';\n\nexport type PointAttrs = {\n constraint: Constraint2D;\n color?: string;\n showLabel?: boolean;\n showValue?: boolean;\n face?: 'o' | 'circle' | 'cross' | 'plus';\n size?: number;\n /** Offset nhãn (pixel) so với anchor; undefined = default JSXGraph [10,10]. */\n labelOffset?: [number, number];\n};\n\ntype C<K extends Constraint2D['kind']> = Extract<Constraint2D, { kind: K }>;\n\nexport interface PointConstraintModule<K extends Constraint2D['kind'] = Constraint2D['kind']> {\n kind: K;\n validate?: (c: C<K>) => void;\n describe: (obj: SceneObject<PointAttrs>, state: State | undefined, c: C<K>) => string;\n render: (obj: SceneObject<PointAttrs>, ctx: RenderCtx, c: C<K>, opts: Record<string, unknown>) => unknown;\n}\n\n/** Factory widen typed module → generic cho registry (giống defineModule). */\nexport function definePointConstraint<K extends Constraint2D['kind']>(\n m: PointConstraintModule<K>,\n): PointConstraintModule {\n return m as unknown as PointConstraintModule;\n}\n","// point-constraints/free.ts\nimport { definePointConstraint } from './_types';\n\nexport const freeConstraint = definePointConstraint({\n kind: 'free',\n describe: (obj) => `Điểm ${obj.label}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n return board.create('point', [c.x, c.y], opts);\n },\n});\n","// point-constraints/onAxis.ts\nimport { definePointConstraint } from './_types';\n\nexport const onAxisConstraint = definePointConstraint({\n kind: 'onAxis',\n describe: (obj, _state, c) => `${obj.label} trên trục ${c.axis}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const coords: [number, number] = c.axis === 'x' ? [c.t, 0] : [0, c.t];\n return board.create('point', coords, opts);\n },\n});\n","// point-constraints/midpoint.ts\nimport { definePointConstraint } from './_types';\n\nexport const midpointConstraint = definePointConstraint({\n kind: 'midpoint',\n describe: (obj, state, c) => {\n const l1 = state?.objects[c.p1]?.label ?? c.p1;\n const l2 = state?.objects[c.p2]?.label ?? c.p2;\n return `${obj.label} = trung điểm ${l1}${l2}`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const p1 = ctx.resolveRef(c.p1) as any;\n const p2 = ctx.resolveRef(c.p2) as any;\n return board.create('midpoint', [p1, p2], opts);\n },\n});\n","// point-constraints/perpFoot.ts\nimport { definePointConstraint } from './_types';\n\nexport const perpFootConstraint = definePointConstraint({\n kind: 'perpFoot',\n validate: (c) => {\n if (!c.from || !c.onLine) {\n throw new Error('point.perpFoot: from và onLine bắt buộc');\n }\n },\n describe: (obj, state, c) => {\n const fromLabel = state?.objects[c.from]?.label ?? c.from;\n const lineLabel = state?.objects[c.onLine]?.label ?? c.onLine;\n return `${obj.label} = chân ⟂ từ ${fromLabel} xuống ${lineLabel}`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n\n const from: any = ctx.resolveRef(c.from);\n\n const onLine: any = ctx.resolveRef(c.onLine);\n // JSXGraph 'perpendicularpoint': create('perpendicularpoint', [line, point])\n // → trả về chân vuông góc của point xuống line.\n return board.create('perpendicularpoint', [onLine, from], opts);\n },\n});\n","// point-constraints/circumcenter.ts\nimport { definePointConstraint } from './_types';\n\nexport const circumcenterConstraint = definePointConstraint({\n kind: 'circumcenter',\n validate: (c) => {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3) {\n throw new Error('point.circumcenter: vertices phải là tuple 3 id');\n }\n if (!c.vertices[0] || !c.vertices[1] || !c.vertices[2]) {\n throw new Error('point.circumcenter: 3 vertex id phải non-empty');\n }\n },\n describe: (obj, state, c) => {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n return `${obj.label} = tâm ngoại tiếp Δ${labels}`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n\n const a: any = ctx.resolveRef(c.vertices[0]);\n\n const b: any = ctx.resolveRef(c.vertices[1]);\n\n const c3: any = ctx.resolveRef(c.vertices[2]);\n // JSXGraph 'circumcenter': create('circumcenter', [A, B, C])\n return board.create('circumcenter', [a, b, c3], opts);\n },\n});\n","// point-constraints/incenter.ts\nimport { definePointConstraint } from './_types';\n\nexport const incenterConstraint = definePointConstraint({\n kind: 'incenter',\n validate: (c) => {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3) {\n throw new Error('point.incenter: vertices phải là tuple 3 id');\n }\n if (!c.vertices[0] || !c.vertices[1] || !c.vertices[2]) {\n throw new Error('point.incenter: 3 vertex id phải non-empty');\n }\n },\n describe: (obj, state, c) => {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n return `${obj.label} = tâm nội tiếp Δ${labels}`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n\n const a: any = ctx.resolveRef(c.vertices[0]);\n\n const b: any = ctx.resolveRef(c.vertices[1]);\n\n const c3: any = ctx.resolveRef(c.vertices[2]);\n return board.create('incenter', [a, b, c3], opts);\n },\n});\n","// point-constraints/onLine.ts\nimport { definePointConstraint } from './_types';\n\nexport const onLineConstraint = definePointConstraint({\n kind: 'onLine',\n describe: (obj, state, c) => `${obj.label} trên đường ${state?.objects[c.lineId]?.label ?? c.lineId}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const line = ctx.resolveRef(c.lineId) as any;\n const p1 = line.point1; const p2 = line.point2;\n const sx = (p1 && p2) ? p1.X() + c.t * (p2.X() - p1.X()) : c.t;\n const sy = (p1 && p2) ? p1.Y() + c.t * (p2.Y() - p1.Y()) : c.t;\n return board.create('glider', [sx, sy, line], opts);\n },\n});\n","// point-constraints/onSegment.ts\nimport { definePointConstraint } from './_types';\n\nexport const onSegmentConstraint = definePointConstraint({\n kind: 'onSegment',\n describe: (obj, state, c) => `${obj.label} trên đoạn ${state?.objects[c.segmentId]?.label ?? c.segmentId}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const seg = ctx.resolveRef(c.segmentId) as any;\n const p1 = seg.point1; const p2 = seg.point2;\n const sx = (p1 && p2) ? p1.X() + c.t * (p2.X() - p1.X()) : c.t;\n const sy = (p1 && p2) ? p1.Y() + c.t * (p2.Y() - p1.Y()) : c.t;\n return board.create('glider', [sx, sy, seg], opts);\n },\n});\n","// point-constraints/onCircle.ts\nimport { definePointConstraint } from './_types';\n\nexport const onCircleConstraint = definePointConstraint({\n kind: 'onCircle',\n describe: (obj, state, c) => `${obj.label} trên đường tròn ${state?.objects[c.circleId]?.label ?? c.circleId}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const circle = ctx.resolveRef(c.circleId) as any;\n const O = circle.center ?? circle.midpoint;\n const ox = O ? O.X() : 0; const oy = O ? O.Y() : 0;\n return board.create('glider', [ox + Math.cos(c.theta), oy + Math.sin(c.theta), circle], opts);\n },\n});\n","// point-constraints/onPolygon.ts\nimport { definePointConstraint } from './_types';\n\nexport const onPolygonConstraint = definePointConstraint({\n kind: 'onPolygon',\n describe: (obj, state, c) => `${obj.label} trên đa giác ${state?.objects[c.polygonId]?.label ?? c.polygonId}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const poly = ctx.resolveRef(c.polygonId) as any;\n return board.create('glider', [c.u, c.v, poly], opts);\n },\n});\n","// point-constraints/centroid.ts\nimport { definePointConstraint } from './_types';\n\nexport const centroidConstraint = definePointConstraint({\n kind: 'centroid',\n validate: (c) => {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3) {\n throw new Error('point.centroid: vertices phải là tuple 3 id');\n }\n if (!c.vertices[0] || !c.vertices[1] || !c.vertices[2]) {\n throw new Error('point.centroid: 3 vertex id phải non-empty');\n }\n },\n describe: (obj, state, c) => {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n return `${obj.label} = trọng tâm Δ${labels}`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n\n const a: any = ctx.resolveRef(c.vertices[0]);\n\n const b: any = ctx.resolveRef(c.vertices[1]);\n\n const c3: any = ctx.resolveRef(c.vertices[2]);\n // JSXGraph function-based point: parents = [() => x, () => y]\n // Function được gọi lại mỗi frame → live update khi user kéo vertex.\n return board.create('point', [\n () => (a.X() + b.X() + c3.X()) / 3,\n () => (a.Y() + b.Y() + c3.Y()) / 3,\n ], opts);\n },\n});\n","// src/core/scene/kinds/pointConstructions.ts\n//\n// Toán dựng hình thuần (không phụ thuộc JSXGraph) cho các point-constraint mới.\n// Renderer point.ts gọi qua function-coordinate points để reactive khi user kéo.\n\nexport type XY = readonly [number, number];\n\nfunction dist(p: XY, q: XY): number {\n return Math.hypot(p[0] - q[0], p[1] - q[1]);\n}\n\n/** Dấu của (B-A) × (P-A): >0 trái, <0 phải, 0 thẳng hàng với AB. */\nfunction sideOf(a: XY, b: XY, p: XY): number {\n return (b[0] - a[0]) * (p[1] - a[1]) - (b[1] - a[1]) * (p[0] - a[0]);\n}\n\n/**\n * Trung điểm cung AB của đường tròn (center, radius), nằm ở cung KHÔNG chứa\n * `notContaining`. Trả về toạ độ [x, y].\n *\n * Hai ứng viên = giao của đường thẳng (center → trung điểm dây AB) với đường\n * tròn. Cung không chứa `reference` nằm KHÁC PHÍA dây AB so với reference,\n * nên chọn ứng viên có dấu side khác dấu side của reference.\n *\n * `sameSide=true` → đảo lựa chọn: lấy ứng viên CÙNG PHÍA reference = trung điểm\n * cung CHỨA reference (= antipode qua tâm của ứng viên \"không chứa\").\n */\nexport function arcMidpoint(\n center: XY, radius: number, a: XY, b: XY, reference?: XY, sameSide = false,\n): XY {\n const mcx = (a[0] + b[0]) / 2;\n const mcy = (a[1] + b[1]) / 2;\n let ux = mcx - center[0];\n let uy = mcy - center[1];\n let len = Math.hypot(ux, uy);\n if (len < 1e-9) {\n // AB là đường kính → hướng từ tâm tới dây suy biến. Dùng pháp tuyến của AB.\n ux = -(b[1] - a[1]);\n uy = b[0] - a[0];\n len = Math.hypot(ux, uy) || 1;\n }\n ux /= len; uy /= len;\n const cand1: XY = [center[0] + radius * ux, center[1] + radius * uy];\n const cand2: XY = [center[0] - radius * ux, center[1] - radius * uy];\n\n // Không có reference (cung KHÔNG mơ hồ, vd nửa đường tròn đường kính AB):\n // chọn ứng viên ở phía dương pháp tuyến (deterministic) — đỉnh \"trên\" của cung.\n if (!reference) return cand1[1] >= cand2[1] ? cand1 : cand2;\n\n const notContaining = reference;\n const sN = sideOf(a, b, notContaining);\n if (Math.abs(sN) < 1e-9) {\n // reference nằm trên đường AB → side-test suy biến: chọn ứng viên xa reference\n // hơn (notContaining), hoặc gần hơn khi sameSide.\n const far = dist(cand1, notContaining) >= dist(cand2, notContaining) ? cand1 : cand2;\n const near = far === cand1 ? cand2 : cand1;\n return sameSide ? near : far;\n }\n const s1 = sideOf(a, b, cand1);\n // notContaining: khác phía ⇔ tích dấu < 0. sameSide: cùng phía ⇔ tích dấu > 0.\n const opp = s1 * sN < 0 ? cand1 : cand2;\n const same = opp === cand1 ? cand2 : cand1;\n return sameSide ? same : opp;\n}\n\n/**\n * Tâm bàng tiếp tam giác `vertices` đối diện đỉnh index `oppositeIndex` (0|1|2).\n * Công thức trọng tâm có dấu: trọng số = độ dài cạnh đối mỗi đỉnh, lật dấu ở\n * đỉnh đối diện. I = Σ wᵢ·Vᵢ / Σ wᵢ.\n */\nexport function excenter(\n vertices: readonly [XY, XY, XY], oppositeIndex: 0 | 1 | 2,\n): XY {\n const [A, B, C] = vertices;\n const a = dist(B, C); // cạnh đối A\n const b = dist(C, A); // cạnh đối B\n const c = dist(A, B); // cạnh đối C\n const w: [number, number, number] = [a, b, c];\n w[oppositeIndex] = -w[oppositeIndex];\n const sum = w[0] + w[1] + w[2];\n if (Math.abs(sum) < 1e-9) return A; // tam giác suy biến — fallback\n return [\n (w[0] * A[0] + w[1] * B[0] + w[2] * C[0]) / sum,\n (w[0] * A[1] + w[1] * B[1] + w[2] * C[1]) / sum,\n ];\n}\n\n/**\n * Điểm trên tia `from → through` kéo dài QUA `through`, cách `through` khoảng `d`.\n * C = through + d · (through − from)/|through − from|.\n * `from ≡ through` (hướng suy biến) → trả về chính `through` (d bị nuốt vì len=1 guard).\n */\n/** Tâm đường tròn ngoại tiếp tam giác (giao 2 trung trực). */\nfunction circumcenterXY(a: XY, b: XY, c: XY): XY {\n const ax = a[0], ay = a[1], bx = b[0], by = b[1], cx = c[0], cy = c[1];\n const d = 2 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));\n if (Math.abs(d) < 1e-12) return [(ax + bx + cx) / 3, (ay + by + cy) / 3];\n const ux = ((ax * ax + ay * ay) * (by - cy) + (bx * bx + by * by) * (cy - ay) + (cx * cx + cy * cy) * (ay - by)) / d;\n const uy = ((ax * ax + ay * ay) * (cx - bx) + (bx * bx + by * by) * (ax - cx) + (cx * cx + cy * cy) * (bx - ax)) / d;\n return [ux, uy];\n}\n\n/**\n * Tâm đường tròn mixtilinear nội tiếp ứng đỉnh A: tiếp xúc 2 cạnh AB, AC và tiếp\n * xúc TRONG đường tròn ngoại tiếp (O,R). Tâm K trên phân giác trong từ A, cách A\n * khoảng d; bán kính r = d·sin(A/2). Điều kiện tiếp xúc trong |OK| = R − r giải ra\n * d = 2( bis·(O−A) − R·sin(A/2) ) / cos²(A/2).\n * `which='center'` → K; `which='touch'` → tiếp điểm S với (O) = O + R·unit(K−O).\n */\nexport function mixtilinearPoint(a: XY, b: XY, c: XY, which: 'center' | 'touch'): XY {\n const O = circumcenterXY(a, b, c);\n const R = Math.hypot(O[0] - a[0], O[1] - a[1]);\n const ux1 = (b[0] - a[0]) / (Math.hypot(b[0] - a[0], b[1] - a[1]) || 1);\n const uy1 = (b[1] - a[1]) / (Math.hypot(b[0] - a[0], b[1] - a[1]) || 1);\n const ux2 = (c[0] - a[0]) / (Math.hypot(c[0] - a[0], c[1] - a[1]) || 1);\n const uy2 = (c[1] - a[1]) / (Math.hypot(c[0] - a[0], c[1] - a[1]) || 1);\n let bx = ux1 + ux2, by = uy1 + uy2;\n const bl = Math.hypot(bx, by) || 1;\n bx /= bl; by /= bl; // unit bisector từ A\n const cosA = ux1 * ux2 + uy1 * uy2; // cos góc A\n const sinHalf = Math.sqrt(Math.max(0, (1 - cosA) / 2)); // sin(A/2)\n const cos2Half = Math.max(1e-9, (1 + cosA) / 2); // cos²(A/2)\n const dotAO = bx * (O[0] - a[0]) + by * (O[1] - a[1]);\n const d = (2 * (dotAO - R * sinHalf)) / cos2Half;\n const K: XY = [a[0] + d * bx, a[1] + d * by];\n if (which === 'center') return K;\n // Tiếp điểm S trên (O) theo hướng O→K (tiếp xúc trong).\n const kl = Math.hypot(K[0] - O[0], K[1] - O[1]) || 1;\n return [O[0] + (R * (K[0] - O[0])) / kl, O[1] + (R * (K[1] - O[1])) / kl];\n}\n\nexport function pointAtDistanceCoord(from: XY, through: XY, d: number): XY {\n const dx = through[0] - from[0];\n const dy = through[1] - from[1];\n const len = Math.hypot(dx, dy) || 1;\n return [through[0] + (d * dx) / len, through[1] + (d * dy) / len];\n}\n\n/**\n * Chân trục đẳng phương 2 đường tròn (o1,r1),(o2,r2) trên đường nối tâm O₁O₂.\n * F = O₁ + t·(O₂−O₁), t = (d²+r₁²−r₂²)/(2d²). Đồng tâm (d≈0) → trả o1 (suy biến,\n * caller escalate trước khi tới đây).\n */\nexport function radicalAxisFoot(o1: XY, r1: number, o2: XY, r2: number): XY {\n const dx = o2[0] - o1[0], dy = o2[1] - o1[1];\n const d2 = dx * dx + dy * dy;\n if (d2 < 1e-12) return o1;\n const t = (d2 + r1 * r1 - r2 * r2) / (2 * d2);\n return [o1[0] + t * dx, o1[1] + t * dy];\n}\n","// point-constraints/arcMidpoint.ts\nimport { arcMidpoint } from '../pointConstructions';\nimport { definePointConstraint } from './_types';\n\nexport const arcMidpointConstraint = definePointConstraint({\n kind: 'arcMidpoint',\n validate: (c) => {\n if (!c.circle || !c.a || !c.b) {\n throw new Error('point.arcMidpoint: circle, a, b bắt buộc');\n }\n // TỐI ĐA 1 trong notContaining / containing. Cho phép KHÔNG có (cung không\n // mơ hồ — vd nửa đường tròn đường kính AB → điểm chính giữa duy nhất).\n if (c.notContaining && c.containing) {\n throw new Error('point.arcMidpoint: không thể vừa notContaining vừa containing');\n }\n },\n describe: (obj, state, c) => {\n const al = state?.objects[c.a]?.label ?? c.a;\n const bl = state?.objects[c.b]?.label ?? c.b;\n const ref = c.containing ?? c.notContaining;\n if (!ref) return `${obj.label} = trung điểm cung ${al}${bl}`;\n const rl = state?.objects[ref]?.label ?? ref;\n const rel = c.containing ? 'chứa' : 'không chứa';\n return `${obj.label} = trung điểm cung ${al}${bl} (${rel} ${rl})`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const circle: any = ctx.resolveRef(c.circle);\n const A: any = ctx.resolveRef(c.a);\n const B: any = ctx.resolveRef(c.b);\n const refName = c.containing ?? c.notContaining;\n const ref: any = refName ? ctx.resolveRef(refName) : undefined;\n const sameSide = !!c.containing;\n const O = circle?.center ?? circle?.midpoint ?? circle;\n const am = () => arcMidpoint(\n [O.X(), O.Y()], circle.Radius(),\n [A.X(), A.Y()], [B.X(), B.Y()], ref ? [ref.X(), ref.Y()] : undefined, sameSide,\n );\n return board.create('point', [() => am()[0], () => am()[1]], opts);\n },\n});\n","// point-constraints/excenter.ts\nimport { excenter } from '../pointConstructions';\nimport { definePointConstraint } from './_types';\n\nexport const excenterConstraint = definePointConstraint({\n kind: 'excenter',\n validate: (c) => {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3) {\n throw new Error('point.excenter: vertices phải là tuple 3 id');\n }\n if (!c.opposite) throw new Error('point.excenter: opposite bắt buộc');\n if (!c.vertices[0] || !c.vertices[1] || !c.vertices[2]) {\n throw new Error('point.excenter: 3 vertex id phải non-empty');\n }\n if (!c.vertices.includes(c.opposite)) {\n throw new Error('point.excenter: opposite phải là một trong vertices');\n }\n },\n describe: (obj, state, c) => {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n const opp = state?.objects[c.opposite]?.label ?? c.opposite;\n return `${obj.label} = tâm bàng tiếp Δ${labels} đối diện ${opp}`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const a: any = ctx.resolveRef(c.vertices[0]);\n const b: any = ctx.resolveRef(c.vertices[1]);\n const c3: any = ctx.resolveRef(c.vertices[2]);\n const oppIdx = c.vertices.indexOf(c.opposite) as 0 | 1 | 2;\n const idx = (oppIdx < 0 ? 0 : oppIdx) as 0 | 1 | 2;\n const ex = () => excenter(\n [[a.X(), a.Y()], [b.X(), b.Y()], [c3.X(), c3.Y()]], idx,\n );\n return board.create('point', [() => ex()[0], () => ex()[1]], opts);\n },\n});\n","// point-constraints/mixtilinearPoint.ts\nimport { mixtilinearPoint } from '../pointConstructions';\nimport { definePointConstraint } from './_types';\n\nexport const mixtilinearPointConstraint = definePointConstraint({\n kind: 'mixtilinearPoint',\n validate: (c) => {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3 || !c.vertices.every(Boolean)) {\n throw new Error('point.mixtilinearPoint: vertices phải là tuple 3 id non-empty');\n }\n if (c.which !== 'center' && c.which !== 'touch') {\n throw new Error(\"point.mixtilinearPoint: which phải 'center' | 'touch'\");\n }\n },\n describe: (obj, state, c) => {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n return c.which === 'center'\n ? `${obj.label} = tâm đường tròn mixtilinear Δ${labels}`\n : `${obj.label} = tiếp điểm mixtilinear Δ${labels} với (O)`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const a: any = ctx.resolveRef(c.vertices[0]);\n const b: any = ctx.resolveRef(c.vertices[1]);\n const d: any = ctx.resolveRef(c.vertices[2]);\n const mp = () => mixtilinearPoint(\n [a.X(), a.Y()], [b.X(), b.Y()], [d.X(), d.Y()], c.which,\n );\n return board.create('point', [() => mp()[0], () => mp()[1]], opts);\n },\n});\n","// point-constraints/shared.ts\nimport type { RenderCtx, SceneObject } from '../../types';\nimport type { ConstraintDistanceSpec, TransformDef } from '../2d-constraint';\nimport type { PointAttrs } from './_types';\nimport { labelOpts } from '../_label';\n\n/**\n * Build mảng JSXGraph 'transform' elements cho TransformDef. Dilate → chain\n * 3 transform (T(-c) → S(k) → T(+c)) vì JSXGraph 'scale' không nhận center.\n *\n * Center là pointId; resolve qua ctx + dùng function-based để dilate cập nhật\n * live khi user kéo center.\n */\n\nexport function buildJxgTransforms(board: any, ctx: RenderCtx, t: TransformDef): any[] {\n switch (t.kind) {\n case 'translate':\n return [board.create('transform', [t.dx, t.dy], { type: 'translate' })];\n case 'rotate': {\n\n const c: any = ctx.resolveRef(t.center);\n return [board.create('transform', [t.angleRad, c], { type: 'rotate' })];\n }\n case 'reflectPoint': {\n // Đối xứng qua điểm = quay π quanh điểm đó.\n\n const c: any = ctx.resolveRef(t.center);\n return [board.create('transform', [Math.PI, c], { type: 'rotate' })];\n }\n case 'reflectLine': {\n\n const l: any = ctx.resolveRef(t.line);\n return [board.create('transform', [l], { type: 'reflect' })];\n }\n case 'dilate': {\n\n const c: any = ctx.resolveRef(t.center);\n // Function-based để chain cập nhật khi user kéo center.\n return [\n board.create('transform', [() => -c.X(), () => -c.Y()], { type: 'translate' }),\n board.create('transform', [t.k, t.k], { type: 'scale' }),\n board.create('transform', [() => c.X(), () => c.Y()], { type: 'translate' }),\n ];\n }\n }\n}\n\n/**\n * Trả hàm tính khoảng cách `d` reactive cho pointAtDistance.\n * d = scale·base + offset (scale mặc định 1, offset mặc định 0). Spec cũ không\n * có scale/offset → d = base Y HỆT trước (additive).\n */\nexport function makeDistanceFn(ctx: RenderCtx, d: ConstraintDistanceSpec): () => number {\n const scale = d.scale ?? 1;\n const offset = d.offset ?? 0;\n if (d.kind === 'literal') {\n const v = d.value;\n return () => scale * v + offset;\n }\n if (d.kind === 'segmentLength') {\n const p = ctx.resolveRef(d.p1) as any;\n const q = ctx.resolveRef(d.p2) as any;\n return () => scale * Math.hypot(p.X() - q.X(), p.Y() - q.Y()) + offset;\n }\n const circle = ctx.resolveRef(d.circle) as any;\n return () => scale * circle.Radius() + offset;\n}\n\n/** opts y hệt point.ts render hiện tại (defaults #1e40af / 'o' / 4). */\nexport function buildPointOpts(obj: SceneObject<PointAttrs>): Record<string, unknown> {\n return {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? true,\n visible: obj.visible,\n fixed: obj.locked,\n strokeColor: obj.attrs.color ?? '#1e40af',\n fillColor: obj.attrs.color ?? '#1e40af',\n face: obj.attrs.face ?? 'o',\n size: obj.attrs.size ?? 4,\n ...labelOpts(obj.attrs.labelOffset, [10, 10]),\n };\n}\n","// point-constraints/pointAtDistance.ts\nimport { pointAtDistanceCoord } from '../pointConstructions';\nimport { definePointConstraint } from './_types';\nimport { makeDistanceFn } from './shared';\n\nexport const pointAtDistanceConstraint = definePointConstraint({\n kind: 'pointAtDistance',\n describe: (obj, state, c) => {\n const fromL = state?.objects[c.from]?.label ?? c.from;\n const thrL = state?.objects[c.through]?.label ?? c.through;\n const d = c.distance;\n const dLabel = d.kind === 'literal' ? `${d.value}`\n : d.kind === 'segmentLength'\n ? `${state?.objects[d.p1]?.label ?? d.p1}${state?.objects[d.p2]?.label ?? d.p2}`\n : `bán kính (${state?.objects[d.circle]?.label ?? d.circle})`;\n return `${obj.label} = trên tia ${fromL}${thrL} kéo dài, cách ${thrL} khoảng ${dLabel}`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const A: any = ctx.resolveRef(c.from);\n const B: any = ctx.resolveRef(c.through);\n const dFn = makeDistanceFn(ctx, c.distance);\n const pc = () => pointAtDistanceCoord([A.X(), A.Y()], [B.X(), B.Y()], dFn());\n return board.create('point', [() => pc()[0], () => pc()[1]], opts);\n },\n});\n","// src/stamps/geometry-2d/geometry/commonTangent.ts\n//\n// Tiếp điểm của tiếp tuyến CHUNG 2 đường tròn (external/internal). Hàm THUẦN —\n// dùng cho cả render functional (point-constraints/commonTangentPoint) lẫn unit\n// test hình học. Spec: docs/superpowers/specs/2026-06-20-two-circle-relations-design.md (mục A).\n//\n// Hình học. 2 đtròn tâm O1,O2 bán kính r1,r2; d=|O1O2|; β=hướng O1→O2.\n// Pháp tuyến đơn vị n̂ tới đường tiếp tuyến thoả (P−O_i)·n̂ = ±r_i:\n// - external: cos γ = (r1−r2)/d ; T1=O1+r1·n̂ ; T2=O2+r2·n̂. Bền kể cả 2 đtròn\n// cắt nhau, cần KHÔNG lồng nhau (|ratio|≤1 ⇔ d≥|r1−r2|).\n// - internal: cos γ = (r1+r2)/d ; T1=O1+r1·n̂ ; T2=O2−r2·n̂. Cần 2 đtròn đủ\n// tách (|ratio|≤1 ⇔ d≥r1+r2).\n// side chọn 1 trong 2 tiếp tuyến cùng loại (s=±1).\n\ntype XY = [number, number];\n\nconst EPS = 1e-9;\n\nexport function computeCommonTangentPoint(\n O1: XY, r1: number,\n O2: XY, r2: number,\n on: 0 | 1, variant: 'external' | 'internal', side: 0 | 1,\n): XY | null {\n const dx = O2[0] - O1[0];\n const dy = O2[1] - O1[1];\n const d = Math.hypot(dx, dy);\n if (d < EPS) return null;\n\n const beta = Math.atan2(dy, dx);\n const ratio = variant === 'external' ? (r1 - r2) / d : (r1 + r2) / d;\n if (Math.abs(ratio) > 1) return null; // tiếp tuyến loại đó KHÔNG tồn tại.\n\n const gamma = Math.acos(ratio);\n const s = side === 0 ? 1 : -1;\n const angle = beta + s * gamma;\n const nx = Math.cos(angle);\n const ny = Math.sin(angle);\n\n if (on === 0) {\n return [O1[0] + r1 * nx, O1[1] + r1 * ny];\n }\n // on === 1\n if (variant === 'external') {\n return [O2[0] + r2 * nx, O2[1] + r2 * ny];\n }\n return [O2[0] - r2 * nx, O2[1] - r2 * ny];\n}\n","// point-constraints/commonTangentPoint.ts\n//\n// Tiếp điểm của tiếp tuyến CHUNG 2 đường tròn. Render FUNCTIONAL (như\n// pointAtDistance): đọc tâm+R sống của 2 đtròn JSXGraph → computeCommonTangentPoint\n// → trả [x,y] (cập nhật khi kéo tâm). Đặt TRƯỚC fallback [0,0].\nimport { computeCommonTangentPoint } from '../../../../stamps/geometry-2d/geometry/commonTangent';\nimport { definePointConstraint } from './_types';\n\nexport const commonTangentPointConstraint = definePointConstraint({\n kind: 'commonTangentPoint',\n describe: (obj, state, c) => {\n const c1 = state?.objects[c.circles[0]]?.label ?? c.circles[0];\n const c2 = state?.objects[c.circles[1]]?.label ?? c.circles[1];\n const v = c.variant === 'internal' ? 'trong' : 'ngoài';\n return `${obj.label} = tiếp điểm tiếp tuyến chung ${v} ${c1},${c2} (trên ${c.on === 0 ? c1 : c2})`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n const k1: any = ctx.resolveRef(c.circles[0]);\n const k2: any = ctx.resolveRef(c.circles[1]);\n const O1 = k1?.center ?? k1?.midpoint ?? k1;\n const O2 = k2?.center ?? k2?.midpoint ?? k2;\n const compute = (): [number, number] => {\n const t = computeCommonTangentPoint(\n [O1.X(), O1.Y()], k1.Radius(),\n [O2.X(), O2.Y()], k2.Radius(),\n c.on, c.variant, c.side,\n );\n return t ?? [0, 0];\n };\n return board.create('point', [() => compute()[0], () => compute()[1]], opts);\n },\n});\n","// point-constraints/circleIntersection.ts\nimport { definePointConstraint } from './_types';\n\nexport const circleIntersectionConstraint = definePointConstraint({\n kind: 'circleIntersection',\n // Không có describe-arm riêng trong point.ts → giữ fallback `Điểm ${label}`.\n describe: (obj) => `Điểm ${obj.label}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n // Giao 2 đường tròn — JSXGraph 'intersection' nhận branch 0/1.\n\n const k1: any = ctx.resolveRef(c.c1);\n\n const k2: any = ctx.resolveRef(c.c2);\n return board.create('intersection', [k1, k2, c.which], opts);\n },\n});\n","// point-constraints/circleSecondIntersection.ts\nimport { definePointConstraint } from './_types';\n\nexport const circleSecondIntersectionConstraint = definePointConstraint({\n kind: 'circleSecondIntersection',\n // Không có describe-arm riêng trong point.ts → giữ fallback `Điểm ${label}`.\n describe: (obj) => `Điểm ${obj.label}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n // Giao điểm THỨ HAI của 2 đường tròn (c1 ∩ c2), biết điểm chung `exclude`.\n // JSXGraph 'otherintersection' nhận [curve1, curve2, knownPoint] → nghiệm còn lại.\n\n const k1: any = ctx.resolveRef(c.c1);\n\n const k2: any = ctx.resolveRef(c.c2);\n\n const ex: any = ctx.resolveRef(c.exclude);\n return board.create('otherintersection', [k1, k2, ex], opts);\n },\n});\n","// point-constraints/secondIntersection.ts\nimport { definePointConstraint } from './_types';\n\nexport const secondIntersectionConstraint = definePointConstraint({\n kind: 'secondIntersection',\n // Không có describe-arm riêng trong point.ts → giữ fallback `Điểm ${label}`.\n describe: (obj) => `Điểm ${obj.label}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n // Giao điểm thứ hai của line ∩ circle, biết giao điểm thứ nhất `other`.\n // JSXGraph 'otherintersection' nhận [curve, line, knownPoint].\n\n const line: any = ctx.resolveRef(c.line);\n\n const circle: any = ctx.resolveRef(c.circle);\n\n const other: any = ctx.resolveRef(c.other);\n return board.create('otherintersection', [circle, line, other], opts);\n },\n});\n","// point-constraints/tangencyPoint.ts\nimport { definePointConstraint } from './_types';\n\nexport const tangencyPointConstraint = definePointConstraint({\n kind: 'tangencyPoint',\n // Không có describe-arm riêng trong point.ts → giữ fallback `Điểm ${label}`.\n describe: (obj) => `Điểm ${obj.label}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n // Tiếp điểm = chân vuông góc hạ từ tâm đường tròn xuống đường tiếp tuyến.\n\n const circle: any = ctx.resolveRef(c.circle);\n\n const line: any = ctx.resolveRef(c.onLine);\n const O = circle?.center ?? circle?.midpoint ?? circle;\n return board.create('perpendicularpoint', [line, O], opts);\n },\n});\n","// point-constraints/transformed.ts\nimport { definePointConstraint } from './_types';\nimport { buildJxgTransforms } from './shared';\n\nexport const transformedConstraint = definePointConstraint({\n kind: 'transformed',\n describe: (obj, state, c) => {\n const t = c.transform;\n const labelRef = (id: string) => state?.objects[id]?.label ?? id;\n const op =\n t.kind === 'translate' ? `tịnh tiến (${t.dx.toFixed(2)}, ${t.dy.toFixed(2)})`\n : t.kind === 'rotate' ? `quay ${((t.angleRad * 180) / Math.PI).toFixed(0)}° quanh ${labelRef(t.center)}`\n : t.kind === 'reflectLine' ? `đối xứng qua ${labelRef(t.line)}`\n : t.kind === 'reflectPoint' ? `đối xứng qua điểm ${labelRef(t.center)}`\n : t.kind === 'dilate' ? `vị tự k=${t.k} quanh ${labelRef(t.center)}`\n : '';\n return `${obj.label} = ảnh của ${labelRef(c.source)} (${op})`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n\n const src: any = ctx.resolveRef(c.source);\n const transforms = buildJxgTransforms(board, ctx, c.transform);\n const parent = transforms.length === 1 ? transforms[0] : transforms;\n // JSXGraph: create('point', [src, transformParent]) — src first.\n\n const pt: any = board.create('point', [src, parent], opts);\n // Renderer dọn _helpers khi remove element (xem JxgRenderer.remove).\n pt._helpers = transforms;\n return pt;\n },\n});\n","// point-constraints/orthocenter.ts\nimport { definePointConstraint } from './_types';\n\nexport const orthocenterConstraint = definePointConstraint({\n kind: 'orthocenter',\n validate: (c) => {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3) {\n throw new Error('point.orthocenter: vertices phải là tuple 3 id');\n }\n if (!c.vertices[0] || !c.vertices[1] || !c.vertices[2]) {\n throw new Error('point.orthocenter: 3 vertex id phải non-empty');\n }\n },\n describe: (obj, state, c) => {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n return `${obj.label} = trực tâm Δ${labels}`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n\n const a: any = ctx.resolveRef(c.vertices[0]);\n\n const b: any = ctx.resolveRef(c.vertices[1]);\n\n const c3: any = ctx.resolveRef(c.vertices[2]);\n const hide = { visible: false, withLabel: false, fixed: true, name: '' };\n // Altitude A→BC: line BC + perpendicular từ A xuống BC.\n const lineBC = board.create('line', [b, c3], hide);\n const altA = board.create('perpendicular', [lineBC, a], hide);\n // Altitude B→AC: line AC + perpendicular từ B xuống AC.\n const lineAC = board.create('line', [a, c3], hide);\n const altB = board.create('perpendicular', [lineAC, b], hide);\n // Trực tâm = giao 2 altitude (branch 0 — chỉ có 1 giao điểm).\n\n const ortho: any = board.create('intersection', [altA, altB, 0], opts);\n ortho._helpers = [lineBC, altA, lineAC, altB];\n return ortho;\n },\n});\n","// point-constraints/onPerpendicular.ts\nimport { definePointConstraint } from './_types';\n\nexport const onPerpendicularConstraint = definePointConstraint({\n kind: 'onPerpendicular',\n describe: (obj) => `Điểm ${obj.label}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n // Glider trên đường vuông góc qua `through`, vuông góc với line(perpToA, perpToB).\n // Aux line + perp line hidden; glider parent = perp line.\n\n const T: any = ctx.resolveRef(c.through);\n\n const A: any = ctx.resolveRef(c.perpToA);\n\n const B: any = ctx.resolveRef(c.perpToB);\n const hide = { visible: false, withLabel: false, fixed: true, name: '' };\n const refLine = board.create('line', [A, B], hide);\n const perpLine = board.create('perpendicular', [refLine, T], hide);\n // Initial coords: T + t * unit(perp(A→B))\n const dx = B.X() - A.X();\n const dy = B.Y() - A.Y();\n const len = Math.hypot(dx, dy) || 1;\n const ux = -dy / len;\n const uy = dx / len;\n const x0 = T.X() + c.t * ux;\n const y0 = T.Y() + c.t * uy;\n\n const gl: any = board.create('glider', [x0, y0, perpLine], opts);\n gl._helpers = [refLine, perpLine];\n return gl;\n },\n});\n","// point-constraints/onPerpBisector.ts\nimport { definePointConstraint } from './_types';\n\nexport const onPerpBisectorConstraint = definePointConstraint({\n kind: 'onPerpBisector',\n describe: (obj) => `Điểm ${obj.label}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n // Glider trên trung trực của (p1, p2). Build từ midpoint + perpendicular\n // (cùng pattern với line.ts perpBisector — JSXGraph 'perpendicular' trả\n // về line infinite, dùng làm parent cho glider an toàn hơn so với\n // 'perpendicularsegment').\n\n const A: any = ctx.resolveRef(c.p1);\n\n const B: any = ctx.resolveRef(c.p2);\n const hide = { visible: false, withLabel: false, fixed: true, name: '' };\n const refLine = board.create('line', [A, B], hide);\n const mid = board.create('midpoint', [A, B], hide);\n const bisLine = board.create('perpendicular', [refLine, mid], hide);\n const Mx = (A.X() + B.X()) / 2;\n const My = (A.Y() + B.Y()) / 2;\n const dx = B.X() - A.X();\n const dy = B.Y() - A.Y();\n const len = Math.hypot(dx, dy) || 1;\n const ux = -dy / len;\n const uy = dx / len;\n const x0 = Mx + c.t * ux;\n const y0 = My + c.t * uy;\n\n const gl: any = board.create('glider', [x0, y0, bisLine], opts);\n gl._helpers = [refLine, mid, bisLine];\n return gl;\n },\n});\n","// point-constraints/onCircleAroundPoint.ts\nimport { definePointConstraint } from './_types';\n\nexport const onCircleAroundPointConstraint = definePointConstraint({\n kind: 'onCircleAroundPoint',\n describe: (obj) => `Điểm ${obj.label}`,\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n // Glider trên vòng tròn tâm `center`, qua `radiusPoint`.\n\n const C: any = ctx.resolveRef(c.center);\n\n const R: any = ctx.resolveRef(c.radiusPoint);\n const hide = { visible: false, withLabel: false, fixed: true, name: '' };\n const auxCircle = board.create('circle', [C, R], hide);\n const r = Math.hypot(R.X() - C.X(), R.Y() - C.Y());\n const x0 = C.X() + r * Math.cos(c.theta);\n const y0 = C.Y() + r * Math.sin(c.theta);\n\n const gl: any = board.create('glider', [x0, y0, auxCircle], opts);\n gl._helpers = [auxCircle];\n return gl;\n },\n});\n","// point-constraints/tangentPointExt.ts\nimport { definePointConstraint } from './_types';\n\nexport const tangentPointExtConstraint = definePointConstraint({\n kind: 'tangentPointExt',\n describe: (obj, state, c) => {\n const fromLabel = state?.objects[c.from]?.label ?? c.from;\n const circleLabel = state?.objects[c.circle]?.label ?? c.circle;\n return `${obj.label} = tiếp điểm của (${circleLabel}) với tiếp tuyến từ ${fromLabel}`;\n },\n render: (obj, ctx, c, opts) => {\n const board = ctx.jxg as any;\n // Tiếp điểm của tiếp tuyến vẽ từ điểm ngoài `from` tới đường tròn `circle`.\n // Construction: lấy O = tâm đường tròn → mid = trung điểm(from, O) → Thales\n // = đường tròn đường kính from-O (do góc nội tiếp 90° = tiếp tuyến vuông\n // góc với bán kính tại tiếp điểm). Tiếp điểm = giao của Thales với circle,\n // nhánh 0/1 chọn 1 trong 2 nghiệm.\n\n const P: any = ctx.resolveRef(c.from);\n const K: any = ctx.resolveRef(c.circle);\n const O: any = K.center ?? K.midpoint;\n const hide = { visible: false, withLabel: false, fixed: true, name: '' };\n const mid = board.create('midpoint', [P, O], hide);\n const thales = board.create('circle', [mid, P], hide);\n const inter: any = board.create('intersection', [thales, K, c.which], opts);\n inter._helpers = [mid, thales];\n return inter;\n },\n});\n","// point-constraints/registry.ts\nimport type { PointConstraintModule } from './_types';\n// Batch 1 — native/glider kinds\nimport { freeConstraint } from './free';\nimport { onAxisConstraint } from './onAxis';\nimport { midpointConstraint } from './midpoint';\nimport { perpFootConstraint } from './perpFoot';\nimport { circumcenterConstraint } from './circumcenter';\nimport { incenterConstraint } from './incenter';\nimport { onLineConstraint } from './onLine';\nimport { onSegmentConstraint } from './onSegment';\nimport { onCircleConstraint } from './onCircle';\nimport { onPolygonConstraint } from './onPolygon';\n// Batch 2 — function-coords / native intersection kinds\nimport { centroidConstraint } from './centroid';\nimport { arcMidpointConstraint } from './arcMidpoint';\nimport { excenterConstraint } from './excenter';\nimport { mixtilinearPointConstraint } from './mixtilinearPoint';\nimport { pointAtDistanceConstraint } from './pointAtDistance';\nimport { commonTangentPointConstraint } from './commonTangentPoint';\nimport { circleIntersectionConstraint } from './circleIntersection';\nimport { circleSecondIntersectionConstraint } from './circleSecondIntersection';\nimport { secondIntersectionConstraint } from './secondIntersection';\nimport { tangencyPointConstraint } from './tangencyPoint';\n// Batch 3 — aux/_helpers/drag-sync kinds\nimport { transformedConstraint } from './transformed';\nimport { orthocenterConstraint } from './orthocenter';\nimport { onPerpendicularConstraint } from './onPerpendicular';\nimport { onPerpBisectorConstraint } from './onPerpBisector';\nimport { onCircleAroundPointConstraint } from './onCircleAroundPoint';\nimport { tangentPointExtConstraint } from './tangentPointExt';\n\nconst ALL: PointConstraintModule[] = [\n freeConstraint,\n onAxisConstraint,\n midpointConstraint,\n perpFootConstraint,\n circumcenterConstraint,\n incenterConstraint,\n onLineConstraint,\n onSegmentConstraint,\n onCircleConstraint,\n onPolygonConstraint,\n centroidConstraint,\n arcMidpointConstraint,\n excenterConstraint,\n mixtilinearPointConstraint,\n pointAtDistanceConstraint,\n commonTangentPointConstraint,\n circleIntersectionConstraint,\n circleSecondIntersectionConstraint,\n secondIntersectionConstraint,\n tangencyPointConstraint,\n transformedConstraint,\n orthocenterConstraint,\n onPerpendicularConstraint,\n onPerpBisectorConstraint,\n onCircleAroundPointConstraint,\n tangentPointExtConstraint,\n];\nexport const POINT_CONSTRAINTS: ReadonlyMap<string, PointConstraintModule> =\n new Map(ALL.map((m) => [m.kind, m]));\n","// src/core/scene/kinds/point.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { constraintRefs2D } from './2d-constraint';\nimport { POINT_CONSTRAINTS } from './point-constraints/registry';\nimport { buildPointOpts } from './point-constraints/shared';\nimport { labelOpts } from './_label';\n\nexport type { PointAttrs } from './point-constraints/_types';\nimport type { PointAttrs } from './point-constraints/_types';\n\nconst def: KindDef<PointAttrs> = {\n type: 'point',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || !a.constraint || !a.constraint.kind) {\n throw new Error('point: constraint required');\n }\n const c = a.constraint;\n POINT_CONSTRAINTS.get(c.kind)?.validate?.(c as never);\n },\n dependsOn: (a) => constraintRefs2D(a.constraint),\n measure: (obj) => {\n const c = obj.attrs.constraint;\n if (c.kind === 'free') {\n return [\n { label: 'x', value: c.x },\n { label: 'y', value: c.y },\n ];\n }\n return null;\n },\n describe: (obj, state) => {\n const c = obj.attrs.constraint;\n const mod = POINT_CONSTRAINTS.get(c.kind);\n if (mod) return mod.describe(obj, state, c as never);\n return `Điểm ${obj.label}`;\n },\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const c = obj.attrs.constraint;\n const opts = buildPointOpts(obj);\n const mod = POINT_CONSTRAINTS.get(c.kind);\n if (mod) return mod.render(obj, ctx, c as never, opts);\n return board.create('point', [0, 0], opts);\n },\n /**\n * Free → Free update giữ nguyên JxgObj identity (gọi setPositionDirectly +\n * setAttribute) để các object phụ thuộc (line/segment/...) không bị stale\n * parent ref. Đổi constraint kind → throw để renderer fallback recreate.\n *\n * Đây cũng là endpoint cho drag-sync dispatch trong JxgRenderer: khi user\n * kéo điểm, listener dispatch UPDATE_ATTRS → update hook chạy, vị trí đã\n * đúng sẵn nên setPositionDirectly là no-op nhưng vẫn cần để sync các attrs\n * khác (label/color/...).\n */\n update: (obj, prev, ctx, existing) => {\n const c = obj.attrs.constraint;\n const oldC = prev.attrs.constraint;\n if (c.kind === 'free' && oldC.kind === 'free') {\n \n const el = existing as any;\n // JXG.COORDS_BY_USER = 1 (hardcoded constant — JSXGraph không export\n // qua module API, lấy qua window.JXG sẽ phải gánh thêm phụ thuộc).\n if (typeof el.setPositionDirectly === 'function') {\n try { el.setPositionDirectly(1, [c.x, c.y]); } catch { /* ignore */ }\n }\n if (typeof el.setAttribute === 'function') {\n try {\n el.setAttribute({\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? true,\n visible: obj.visible,\n fixed: obj.locked,\n strokeColor: obj.attrs.color ?? '#1e40af',\n fillColor: obj.attrs.color ?? '#1e40af',\n face: obj.attrs.face ?? 'o',\n size: obj.attrs.size ?? 4,\n ...labelOpts(obj.attrs.labelOffset, [10, 10]),\n });\n } catch { /* ignore */ }\n }\n void ctx;\n return;\n }\n throw new Error('point: constraint kind changed — recreate');\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/segment.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\nimport { labelOpts } from './_label';\n\nexport type SegmentAttrs = {\n p1: string;\n p2: string;\n color?: string;\n width?: number;\n dash?: number;\n showLabel?: boolean;\n showValue?: boolean;\n /** Offset nhãn (pixel) so với anchor; undefined = default JSXGraph. */\n labelOffset?: [number, number];\n};\n\nconst def: KindDef<SegmentAttrs> = {\n type: 'segment',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.p1 || !a?.p2) throw new Error('segment: p1 và p2 bắt buộc');\n },\n dependsOn: (a) => [a.p1, a.p2],\n measure: (obj, state) => {\n const p1 = state.objects[obj.attrs.p1];\n const p2 = state.objects[obj.attrs.p2];\n if (!p1 || !p2) return null;\n const c1 = (p1.attrs as { constraint?: { kind: string; x?: number; y?: number } }).constraint;\n const c2 = (p2.attrs as { constraint?: { kind: string; x?: number; y?: number } }).constraint;\n if (c1?.kind !== 'free' || c2?.kind !== 'free') return null;\n const dx = (c2.x ?? 0) - (c1.x ?? 0);\n const dy = (c2.y ?? 0) - (c1.y ?? 0);\n return [{ label: 'length', value: Math.hypot(dx, dy) }];\n },\n describe: (obj, state) => `Đoạn thẳng ${labelOf(obj.attrs.p1, state)}${labelOf(obj.attrs.p2, state)}`,\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const p1 = ctx.resolveRef(obj.attrs.p1);\n const p2 = ctx.resolveRef(obj.attrs.p2);\n return board.create('segment', [p1, p2], {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n visible: obj.visible,\n fixed: obj.locked,\n ...labelOpts(obj.attrs.labelOffset),\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/line.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\nimport { labelOpts } from './_label';\nimport { radicalAxisFoot } from './pointConstructions';\n\n/**\n * Cách dựng đường thẳng phái sinh. Khi `construction` có mặt, `p1`/`p2` ở\n * trên LineAttrs bị bỏ qua — renderer dùng nhánh tương ứng (perpendicular /\n * parallel / perpBisector / angleBisector / tangent).\n *\n * Lưu ý: tangent dựng qua một glider ẩn nằm trên đường tròn gần `throughPoint`;\n * glider được lưu tại property `_helpers` của element trả về để renderer dọn\n * dẹp khi đường tangent bị xoá.\n */\nexport type LineConstruction =\n | { kind: 'perpendicular'; throughPoint: string; toLine: string }\n | { kind: 'parallel'; throughPoint: string; toLine: string }\n | { kind: 'perpBisector'; p1: string; p2: string }\n | { kind: 'angleBisector'; p1: string; vertex: string; p2: string }\n | { kind: 'angleBisectorLines'; line1: string; line2: string; branch: 0 | 1 }\n | { kind: 'lineThrough'; points: string[] }\n | { kind: 'radicalAxis'; circle1: string; circle2: string }\n | { kind: 'tangent'; throughPoint: string; toCircle: string; branch?: 0 | 1 | 'on' };\n\nexport type LineAttrs = {\n /** Hai-điểm fallback — bắt buộc khi không có `construction`. */\n p1?: string;\n p2?: string;\n construction?: LineConstruction;\n color?: string;\n width?: number;\n dash?: number;\n showLabel?: boolean;\n /** Offset nhãn (pixel) so với anchor; undefined = default JSXGraph. */\n labelOffset?: [number, number];\n};\n\n// Polygon edges là sub-segment do JSXGraph tự tạo bên trong polygon — không có\n// scene id riêng. Synthetic id \"<polyId>:border:<i>\" cho phép construct tools\n// (perpendicular, parallel) tham chiếu cạnh đa giác như một line, nhưng\n// dependency graph cần biết line phụ thuộc vào polygon thật (để DELETE polygon\n// cascade xoá line). Strip suffix về polyId ở đây.\nfunction stripBorderSuffix(id: string): string {\n const m = /^(.+):border:\\d+$/.exec(id);\n return m ? m[1] : id;\n}\n\nfunction constructionRefs(c: LineConstruction): string[] {\n switch (c.kind) {\n case 'perpendicular':\n case 'parallel':\n return [c.throughPoint, stripBorderSuffix(c.toLine)];\n case 'perpBisector':\n return [c.p1, c.p2];\n case 'angleBisector':\n return [c.p1, c.vertex, c.p2];\n case 'angleBisectorLines':\n return [stripBorderSuffix(c.line1), stripBorderSuffix(c.line2)];\n case 'lineThrough':\n return [...c.points];\n case 'radicalAxis':\n return [c.circle1, c.circle2];\n case 'tangent':\n return [c.throughPoint, c.toCircle];\n }\n}\n\nconst def: KindDef<LineAttrs> = {\n type: 'line',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (a?.construction) return;\n if (!a?.p1 || !a?.p2) throw new Error('line: p1 và p2 bắt buộc (hoặc construction)');\n },\n dependsOn: (a) => (a.construction ? constructionRefs(a.construction) : [a.p1!, a.p2!]),\n describe: (obj, state) => {\n const L = (id: string) => labelOf(id, state);\n const c = obj.attrs.construction;\n if (!c) return `Đường thẳng ${L(obj.attrs.p1!)}${L(obj.attrs.p2!)}`;\n switch (c.kind) {\n case 'perpendicular': return `${obj.label} ⟂ ${L(c.toLine)} qua ${L(c.throughPoint)}`;\n case 'parallel': return `${obj.label} ∥ ${L(c.toLine)} qua ${L(c.throughPoint)}`;\n case 'perpBisector': return `${obj.label}: trung trực ${L(c.p1)}${L(c.p2)}`;\n case 'angleBisector': return `${obj.label}: phân giác góc ${L(c.p1)}${L(c.vertex)}${L(c.p2)}`;\n case 'angleBisectorLines': return `${obj.label}: phân giác ${L(c.line1)} & ${L(c.line2)} (${c.branch === 0 ? '1' : '2'})`;\n case 'lineThrough': return `${obj.label}: đường qua ${c.points.map(L).join('')}`;\n case 'radicalAxis': return `${obj.label}: trục đẳng phương ${L(c.circle1)} & ${L(c.circle2)}`;\n case 'tangent': return `${obj.label}: tiếp tuyến ${L(c.toCircle)} qua ${L(c.throughPoint)}`;\n }\n },\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const baseOpts: Record<string, unknown> = {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n visible: obj.visible,\n fixed: obj.locked,\n ...labelOpts(obj.attrs.labelOffset),\n };\n const c = obj.attrs.construction;\n if (!c) {\n const p1 = ctx.resolveRef(obj.attrs.p1!);\n const p2 = ctx.resolveRef(obj.attrs.p2!);\n return board.create('line', [p1, p2], {\n ...baseOpts,\n straightFirst: true,\n straightLast: true,\n });\n }\n switch (c.kind) {\n case 'perpendicular': {\n const through = ctx.resolveRef(c.throughPoint);\n const toLine = ctx.resolveRef(c.toLine);\n // JSXGraph: create('perpendicular', [line, point]) → line qua point ⟂ line\n return board.create('perpendicular', [toLine, through], baseOpts);\n }\n case 'parallel': {\n const through = ctx.resolveRef(c.throughPoint);\n const toLine = ctx.resolveRef(c.toLine);\n return board.create('parallel', [toLine, through], baseOpts);\n }\n case 'perpBisector': {\n // JSXGraph 1.12 không có element 'perpendicularbisector' — compose từ\n // midpoint + helper line + perpendicular. Helper objects được lưu vào\n // `_helpers` để JxgRenderer.remove() dọn dẹp khi line bị xoá.\n const p1 = ctx.resolveRef(c.p1);\n const p2 = ctx.resolveRef(c.p2);\n const mid = board.create('midpoint', [p1, p2], {\n visible: false, withLabel: false, fixed: true, name: '',\n });\n const helperLine = board.create('line', [p1, p2], {\n visible: false, withLabel: false, fixed: true, name: '',\n straightFirst: true, straightLast: true,\n });\n const bisector = board.create('perpendicular', [helperLine, mid], baseOpts);\n (bisector as Record<string, unknown>)._helpers = [mid, helperLine];\n return bisector;\n }\n case 'angleBisector': {\n const p1 = ctx.resolveRef(c.p1);\n const vertex = ctx.resolveRef(c.vertex);\n const p2 = ctx.resolveRef(c.p2);\n return board.create('bisector', [p1, vertex, p2], baseOpts);\n }\n case 'angleBisectorLines': {\n // JSXGraph 'bisectorlines' tạo 2 đường phân giác vuông góc của góc giữa\n // 2 đường thẳng (qua giao điểm). Composition trả về có .line1 và .line2.\n // Mỗi scene entry chỉ hiển thị 1 nhánh (branch 0/1) — nhánh còn lại lưu\n // trong _helpers để JxgRenderer dọn dẹp khi entry bị xoá.\n \n const line1Jxg = ctx.resolveRef(c.line1) as any;\n \n const line2Jxg = ctx.resolveRef(c.line2) as any;\n const comp = board.create('bisectorlines', [line1Jxg, line2Jxg], {\n line1: { visible: false, withLabel: false, fixed: true, name: '' },\n line2: { visible: false, withLabel: false, fixed: true, name: '' },\n });\n \n const selected = (c.branch === 0 ? comp.line1 : comp.line2) as any;\n \n const other = (c.branch === 0 ? comp.line2 : comp.line1) as any;\n selected.setAttribute({\n ...baseOpts,\n visible: obj.visible,\n fixed: obj.locked,\n });\n (selected as Record<string, unknown>)._helpers = [other];\n return selected;\n }\n case 'lineThrough': {\n const pts = c.points.map((id) => ctx.resolveRef(id) as any);\n // Chọn 2 điểm xa nhau nhất (ổn định số học; mọi điểm đồng tuyến nên đường\n // qua 2 điểm bất kỳ là như nhau, nhưng cặp xa nhất tránh suy biến gần-trùng).\n let bi = 0, bj = 1, best = -1;\n for (let i = 0; i < pts.length; i++) {\n for (let j = i + 1; j < pts.length; j++) {\n const dx = pts[i].X() - pts[j].X();\n const dy = pts[i].Y() - pts[j].Y();\n const d = dx * dx + dy * dy;\n if (d > best) { best = d; bi = i; bj = j; }\n }\n }\n return board.create('line', [pts[bi], pts[bj]], {\n ...baseOpts, straightFirst: true, straightLast: true,\n });\n }\n case 'radicalAxis': {\n\n const k1 = ctx.resolveRef(c.circle1) as any;\n\n const k2 = ctx.resolveRef(c.circle2) as any;\n const o1 = (): [number, number] => [k1.center.X(), k1.center.Y()];\n const o2 = (): [number, number] => [k2.center.X(), k2.center.Y()];\n const foot = () => radicalAxisFoot(o1(), k1.Radius(), o2(), k2.Radius());\n const hide = { visible: false, withLabel: false, fixed: true, name: '' };\n const f1 = board.create('point', [() => foot()[0], () => foot()[1]], hide);\n // điểm thứ 2 = foot + pháp tuyến của O₁O₂ → đường ⊥ đường nối tâm.\n const f2 = board.create('point', [\n () => foot()[0] - (o2()[1] - o1()[1]),\n () => foot()[1] + (o2()[0] - o1()[0]),\n ], hide);\n const line = board.create('line', [f1, f2], {\n ...baseOpts, straightFirst: true, straightLast: true,\n });\n (line as Record<string, unknown>)._helpers = [f1, f2];\n return line;\n }\n case 'tangent': {\n\n const through = ctx.resolveRef(c.throughPoint) as any;\n \n const toCircle = ctx.resolveRef(c.toCircle) as any;\n const branch = c.branch ?? 'on';\n\n if (branch === 'on') {\n // P trên đường tròn (hoặc legacy data trước khi có branch): glider\n // tại P + JXG tangent element. Backward-compat với data cũ.\n const glider = board.create('glider', [through.X(), through.Y(), toCircle], {\n visible: false, withLabel: false, fixed: true, name: '',\n });\n const tangent = board.create('tangent', [glider], baseOpts);\n (tangent as Record<string, unknown>)._helpers = [glider];\n return tangent;\n }\n\n // branch 0 | 1: dựng qua Thales-circle intersection.\n // M = midpoint(O, P). Auxiliary circle tâm M qua O và P → 2 giao\n // điểm với đường tròn gốc là 2 tiếp điểm T (∠OTP = 90°).\n // Tangent line = line(P, T_branch).\n const center = toCircle.center;\n const mid = board.create('midpoint', [center, through], {\n visible: false, withLabel: false, fixed: true, name: '',\n });\n const thales = board.create('circle', [mid, through], {\n visible: false, withLabel: false, fixed: true,\n strokeOpacity: 0, fillOpacity: 0,\n });\n const touch = board.create('intersection', [thales, toCircle, branch], {\n visible: false, withLabel: false, fixed: true, name: '',\n });\n const tangent = board.create('line', [through, touch], {\n ...baseOpts, straightFirst: true, straightLast: true,\n });\n (tangent as Record<string, unknown>)._helpers = [mid, thales, touch];\n return tangent;\n }\n }\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/ray.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type RayAttrs = {\n origin: string;\n through: string;\n color?: string;\n width?: number;\n dash?: number;\n};\n\nconst def: KindDef<RayAttrs> = {\n type: 'ray',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.origin || !a?.through) throw new Error('ray: origin và through bắt buộc');\n },\n dependsOn: (a) => [a.origin, a.through],\n describe: (obj, state) => `Tia ${labelOf(obj.attrs.origin, state)}${labelOf(obj.attrs.through, state)}`,\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const o = ctx.resolveRef(obj.attrs.origin);\n const t = ctx.resolveRef(obj.attrs.through);\n return board.create('line', [o, t], {\n name: obj.label,\n straightFirst: false,\n straightLast: true,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n visible: obj.visible,\n fixed: obj.locked,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/vector.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type VectorAttrs = {\n from: string;\n to: string;\n color?: string;\n width?: number;\n};\n\nconst def: KindDef<VectorAttrs> = {\n type: 'vector',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.from || !a?.to) throw new Error('vector: from và to bắt buộc');\n },\n dependsOn: (a) => [a.from, a.to],\n describe: (obj, state) => `Vector ${labelOf(obj.attrs.from, state)}${labelOf(obj.attrs.to, state)}`,\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const f = ctx.resolveRef(obj.attrs.from);\n const t = ctx.resolveRef(obj.attrs.to);\n return board.create('arrow', [f, t], {\n name: obj.label,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n visible: obj.visible,\n fixed: obj.locked,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/circle.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\nimport { labelOpts } from './_label';\nimport { excenter } from './pointConstructions';\n\n/**\n * Cách dựng đường tròn phái sinh. Khi `construction` có mặt, `center`/\n * `surfacePoint` bị bỏ qua — renderer dùng JSXGraph `circumcircle` để dựng\n * đường tròn ngoại tiếp 3 điểm.\n */\nexport type CircleConstruction =\n | { kind: 'circumscribed'; p1: string; p2: string; p3: string }\n | { kind: 'incircle'; p1: string; p2: string; p3: string }\n | { kind: 'excircle'; p1: string; p2: string; p3: string; opposite: string }\n // Đường tròn đường kính p1p2: tâm = trung điểm p1p2, bán kính = |p1p2|/2.\n | { kind: 'diameter'; p1: string; p2: string };\n\nexport type CircleAttrs = {\n /** Hai-điểm fallback — bắt buộc khi không có `construction` / `radius`. */\n center?: string;\n surfacePoint?: string;\n /** Số bán kính (mode `center + radius`, DSL `circleCR`). */\n radius?: number;\n construction?: CircleConstruction;\n color?: string;\n width?: number;\n dash?: number;\n showLabel?: boolean;\n showValue?: boolean;\n /** Offset nhãn (pixel) so với anchor; undefined = default JSXGraph. */\n labelOffset?: [number, number];\n};\n\nfunction asConstruction(a: CircleAttrs): CircleConstruction | undefined {\n if (a.construction) return a.construction;\n const raw = a as CircleAttrs & { kind?: string; vertices?: [string, string, string] };\n if (raw.kind === 'incircle' && raw.vertices) {\n return {\n kind: 'incircle',\n p1: raw.vertices[0],\n p2: raw.vertices[1],\n p3: raw.vertices[2],\n };\n }\n return undefined;\n}\n\nfunction constructionRefs(c: CircleConstruction): string[] {\n switch (c.kind) {\n case 'circumscribed': return [c.p1, c.p2, c.p3];\n case 'incircle': return [c.p1, c.p2, c.p3];\n case 'excircle': return [c.p1, c.p2, c.p3];\n case 'diameter': return [c.p1, c.p2];\n }\n}\n\nconst def: KindDef<CircleAttrs> = {\n type: 'circle',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (asConstruction(a)) return;\n if (typeof a?.radius === 'number') {\n if (!a.center) throw new Error('circle: center bắt buộc khi dùng radius');\n if (!(a.radius > 0)) throw new Error('circle: radius phải > 0');\n return;\n }\n if (!a?.center || !a?.surfacePoint) {\n throw new Error('circle: center và surfacePoint bắt buộc (hoặc construction / radius)');\n }\n },\n dependsOn: (a) => {\n const c = asConstruction(a);\n if (c) return constructionRefs(c);\n if (typeof a.radius === 'number') return [a.center!];\n return [a.center!, a.surfacePoint!];\n },\n measure: (obj, state) => {\n // Circumscribed circles need full geometric derivation — skip for now.\n if (asConstruction(obj.attrs)) return null;\n if (typeof obj.attrs.radius === 'number') {\n return [{ label: 'r', value: obj.attrs.radius }];\n }\n const center = obj.attrs.center ? state.objects[obj.attrs.center] : undefined;\n const surface = obj.attrs.surfacePoint ? state.objects[obj.attrs.surfacePoint] : undefined;\n if (!center || !surface) return null;\n const c1 = (center.attrs as { constraint?: { kind: string; x?: number; y?: number } }).constraint;\n const c2 = (surface.attrs as { constraint?: { kind: string; x?: number; y?: number } }).constraint;\n if (c1?.kind !== 'free' || c2?.kind !== 'free') return null;\n const dx = (c2.x ?? 0) - (c1.x ?? 0);\n const dy = (c2.y ?? 0) - (c1.y ?? 0);\n return [{ label: 'r', value: Math.hypot(dx, dy) }];\n },\n describe: (obj, state) => {\n const L = (id: string) => labelOf(id, state);\n const c = asConstruction(obj.attrs);\n if (c?.kind === 'circumscribed') {\n return `Đường tròn đi qua ${L(c.p1)}${L(c.p2)}${L(c.p3)}`;\n }\n if (c?.kind === 'incircle') {\n return `Đường tròn nội tiếp Δ${L(c.p1)}${L(c.p2)}${L(c.p3)}`;\n }\n if (c?.kind === 'excircle') {\n return `Đường tròn bàng tiếp Δ${L(c.p1)}${L(c.p2)}${L(c.p3)} đối diện ${L(c.opposite)}`;\n }\n if (c?.kind === 'diameter') {\n return `Đường tròn đường kính ${L(c.p1)}${L(c.p2)}`;\n }\n if (typeof obj.attrs.radius === 'number') {\n return `Đường tròn tâm ${L(obj.attrs.center!)} bán kính ${obj.attrs.radius}`;\n }\n return `Đường tròn tâm ${L(obj.attrs.center!)} bán kính ${L(obj.attrs.center!)}${L(obj.attrs.surfacePoint!)}`;\n },\n render: (obj, ctx) => {\n\n const board = ctx.jxg as any;\n \n /** Kiểm tra label có phải tên tâm (vd O, I, O1) hay không. */\n const isCenterLabel = (l: string) => /^[A-Z]['′]?\\d*$/u.test(l);\n const isCenter = isCenterLabel(obj.label);\n // Circle bị resolveCircleNameCollisions đổi tên \"X\" → \"X_c\" khi tâm X được\n // tách thành scene point riêng. \"_c\" là id nội bộ (đảm bảo unique), KHÔNG\n // phải nhãn hiển thị — suppress để không hiện \"O_c\" nổi trên vòng tròn (tâm\n // đã có nhãn ở scene point).\n const isRenamedCircle = /_c$/.test(obj.label);\n\n const baseOpts: Record<string, unknown> = {\n name: obj.label,\n withLabel: isCenter ? (obj.attrs.showLabel ?? false) : isRenamedCircle ? false : true,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n fillColor: 'none',\n visible: obj.visible,\n fixed: obj.locked,\n ...labelOpts(obj.attrs.labelOffset),\n };\n\n const c = asConstruction(obj.attrs);\n if (c?.kind === 'circumscribed') {\n const p1 = ctx.resolveRef(c.p1);\n const p2 = ctx.resolveRef(c.p2);\n const p3 = ctx.resolveRef(c.p3);\n if (isCenter) {\n // Nếu tên là tâm (O), tạo circumcenter có nhãn.\n const center = board.create('circumcenter', [p1, p2, p3], {\n visible: obj.visible,\n withLabel: true,\n fixed: true,\n name: obj.label,\n });\n const circ: any = board.create('circumcircle', [p1, p2, p3], { ...baseOpts, withLabel: false });\n circ.center = circ.center ?? center;\n circ._helpers = [center];\n return circ;\n }\n return board.create('circumcircle', [p1, p2, p3], baseOpts);\n }\n if (c?.kind === 'incircle') {\n const p1 = ctx.resolveRef(c.p1);\n const p2 = ctx.resolveRef(c.p2);\n const p3 = ctx.resolveRef(c.p3);\n if (isCenter) {\n const center = board.create('incenter', [p1, p2, p3], {\n visible: obj.visible,\n withLabel: true,\n fixed: true,\n name: obj.label,\n });\n const circ: any = board.create('incircle', [p1, p2, p3], { ...baseOpts, withLabel: false });\n circ.center = circ.center ?? center;\n circ._helpers = [center];\n return circ;\n }\n // Tên không phải tâm (vd alpha) -> nhãn gán cho đường tròn.\n return board.create('incircle', [p1, p2, p3], baseOpts);\n }\n if (c?.kind === 'excircle') {\n\n const P = [ctx.resolveRef(c.p1), ctx.resolveRef(c.p2), ctx.resolveRef(c.p3)] as any[];\n const ids = [c.p1, c.p2, c.p3];\n const oppIdx = Math.max(0, ids.indexOf(c.opposite)) as 0 | 1 | 2;\n const verts = (): [[number, number], [number, number], [number, number]] => [\n [P[0].X(), P[0].Y()], [P[1].X(), P[1].Y()], [P[2].X(), P[2].Y()],\n ];\n const ctr = () => excenter(verts(), oppIdx);\n const radius = () => {\n const I = ctr();\n const others = [0, 1, 2].filter((i) => i !== oppIdx);\n const v = verts();\n const a = v[others[0]]; const b = v[others[1]];\n const dx = b[0] - a[0]; const dy = b[1] - a[1];\n const len = Math.hypot(dx, dy) || 1;\n return Math.abs((I[0] - a[0]) * dy - (I[1] - a[1]) * dx) / len;\n };\n const center = board.create('point', [() => ctr()[0], () => ctr()[1]], { visible: false, withLabel: false, fixed: true, name: '' });\n\n const circ: any = board.create('circle', [center, () => radius()], baseOpts);\n circ._helpers = [center];\n return circ;\n }\n if (c?.kind === 'diameter') {\n const p1 = ctx.resolveRef(c.p1);\n const p2 = ctx.resolveRef(c.p2);\n // Tâm = trung điểm p1p2 (ẩn); circle qua p2 → bán kính = |tâm p2| = |p1p2|/2.\n const center = board.create('midpoint', [p1, p2], { visible: false, withLabel: false, fixed: true, name: '' });\n const circ: any = board.create('circle', [center, p2], baseOpts);\n circ._helpers = [center];\n return circ;\n }\n if (typeof obj.attrs.radius === 'number') {\n const center = ctx.resolveRef(obj.attrs.center!);\n return board.create('circle', [center, obj.attrs.radius], baseOpts);\n }\n const center = ctx.resolveRef(obj.attrs.center!);\n const surface = ctx.resolveRef(obj.attrs.surfacePoint!);\n return board.create('circle', [center, surface], baseOpts);\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/arc.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type ArcConstruction =\n | { kind: 'semicircle'; p1: string; p2: string }\n | { kind: 'byCenter'; center: string; p1: string; p2: string }\n | { kind: 'by3Points'; p1: string; p2: string; p3: string };\n\nexport type ArcAttrs = {\n construction: ArcConstruction;\n color?: string;\n width?: number;\n dash?: number;\n showLabel?: boolean;\n};\n\nfunction constructionRefs(c: ArcConstruction): string[] {\n switch (c.kind) {\n case 'semicircle': return [c.p1, c.p2];\n case 'byCenter': return [c.center, c.p1, c.p2];\n case 'by3Points': return [c.p1, c.p2, c.p3];\n }\n}\n\nconst def: KindDef<ArcAttrs> = {\n type: 'arc',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n const c = a?.construction;\n if (!c) throw new Error('arc: construction bắt buộc');\n if (c.kind === 'semicircle') {\n if (!c.p1 || !c.p2) throw new Error('arc.semicircle: p1, p2 bắt buộc');\n } else if (c.kind === 'byCenter') {\n if (!c.center || !c.p1 || !c.p2) throw new Error('arc.byCenter: center, p1, p2 bắt buộc');\n } else if (c.kind === 'by3Points') {\n if (!c.p1 || !c.p2 || !c.p3) throw new Error('arc.by3Points: p1, p2, p3 bắt buộc');\n }\n },\n dependsOn: (a) => constructionRefs(a.construction),\n describe: (obj, state) => {\n const L = (id: string) => labelOf(id, state);\n const c = obj.attrs.construction;\n switch (c.kind) {\n case 'semicircle': return `Nửa đường tròn đường kính ${L(c.p1)}${L(c.p2)}`;\n case 'byCenter': return `Cung tròn tâm ${L(c.center)} từ ${L(c.p1)} đến ${L(c.p2)}`;\n case 'by3Points': return `Cung tròn qua ${L(c.p1)}${L(c.p2)}${L(c.p3)}`;\n }\n },\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const baseOpts: Record<string, unknown> = {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n fillColor: 'none',\n visible: obj.visible,\n fixed: obj.locked,\n };\n const c = obj.attrs.construction;\n if (c.kind === 'semicircle') {\n const p1 = ctx.resolveRef(c.p1);\n const p2 = ctx.resolveRef(c.p2);\n return board.create('semicircle', [p1, p2], baseOpts);\n }\n if (c.kind === 'byCenter') {\n const O = ctx.resolveRef(c.center);\n const A = ctx.resolveRef(c.p1);\n const B = ctx.resolveRef(c.p2);\n return board.create('arc', [O, A, B], baseOpts);\n }\n // by3Points\n const A = ctx.resolveRef(c.p1);\n const B = ctx.resolveRef(c.p2);\n const C = ctx.resolveRef(c.p3);\n return board.create('circumcirclearc', [A, B, C], baseOpts);\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/sector.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type SectorConstruction =\n | { kind: 'byCenter'; center: string; p1: string; p2: string };\n\nexport type SectorAttrs = {\n construction: SectorConstruction;\n color?: string;\n width?: number;\n fillColor?: string;\n fillOpacity?: number;\n showLabel?: boolean;\n};\n\nconst def: KindDef<SectorAttrs> = {\n type: 'sector',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n const c = a?.construction;\n if (!c) throw new Error('sector: construction bắt buộc');\n if (c.kind === 'byCenter') {\n if (!c.center || !c.p1 || !c.p2) {\n throw new Error('sector.byCenter: center, p1, p2 bắt buộc');\n }\n }\n },\n dependsOn: (a) => {\n const c = a.construction;\n return [c.center, c.p1, c.p2];\n },\n describe: (obj, state) => {\n const L = (id: string) => labelOf(id, state);\n const c = obj.attrs.construction;\n return `Hình quạt tâm ${L(c.center)} từ ${L(c.p1)} đến ${L(c.p2)}`;\n },\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const c = obj.attrs.construction;\n const O = ctx.resolveRef(c.center);\n const A = ctx.resolveRef(c.p1);\n const B = ctx.resolveRef(c.p2);\n return board.create('sector', [O, A, B], {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n fillColor: obj.attrs.fillColor ?? '#f59e0b',\n fillOpacity: obj.attrs.fillOpacity ?? 0.18,\n visible: obj.visible,\n fixed: obj.locked,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/polygon.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\n/** Tên tiếng Việt cho đa giác đều theo số cạnh. */\nfunction regularPolygonName(n: number): string {\n if (n === 3) return 'Tam giác đều';\n if (n === 4) return 'Hình vuông';\n if (n === 5) return 'Ngũ giác đều';\n if (n === 6) return 'Lục giác đều';\n return `${n}-giác đều`;\n}\n\n/**\n * Sinh nhãn đỉnh dạng \"ABCDE...\" khi p1/p2 là 2 chữ cái in hoa liên tiếp.\n * Vd p1=A, p2=B, n=4 → \"ABCD\". Vd p1=C, p2=D, n=3 → \"CDE\".\n * Fallback \"p1Label · p2Label…\" khi không suy ra được dãy chữ.\n */\nfunction regularVertexLabels(p1Label: string, p2Label: string, n: number): string {\n const A = 'A'.charCodeAt(0);\n const Z = 'Z'.charCodeAt(0);\n if (p1Label.length === 1 && p2Label.length === 1) {\n const c1 = p1Label.charCodeAt(0);\n const c2 = p2Label.charCodeAt(0);\n if (c1 >= A && c1 <= Z && c2 === c1 + 1 && c1 + n - 1 <= Z) {\n let out = '';\n for (let i = 0; i < n; i++) out += String.fromCharCode(c1 + i);\n return out;\n }\n }\n return `${p1Label}${p2Label}…`;\n}\n\n/**\n * Cách dựng đa giác phái sinh. Khi `construction` có mặt, `vertices` bị bỏ qua\n * — renderer dùng nhánh tương ứng.\n *\n * - regular: đa giác đều n cạnh dựng từ 2 đỉnh kề (p1, p2 = vertex0, vertex1).\n * JSXGraph 'regularpolygon' tự sinh n-2 đỉnh còn lại.\n * - square: 2 đỉnh kề, render qua 'regularpolygon' n=4.\n * - rectangle/rhombus/parallelogram: 3 đỉnh; D = A + (C − B) suy ngầm trong\n * render. rectangle: p3 nằm trên ⟂ tại p2 ⟂ AB. rhombus: p3 trên vòng tròn\n * tâm p2 bán kính |AB|. parallelogram: p3 free.\n * - isoTrapezoid: 3 đỉnh; đỉnh thứ 4 = ảnh phản chiếu p3 qua trung trực AB.\n * - isoTriangle: 3 đỉnh; apex nằm trên trung trực (base1, base2).\n * - rightTriangle: 3 đỉnh; leg2End nằm trên ⟂ qua rightAngle ⟂ (rightAngle, leg1End).\n */\nexport type PolygonConstruction =\n | { kind: 'regular'; p1: string; p2: string; n: number }\n | { kind: 'square'; p1: string; p2: string }\n | { kind: 'rectangle'; p1: string; p2: string; p3: string }\n | { kind: 'rhombus'; p1: string; p2: string; p3: string }\n | { kind: 'parallelogram'; p1: string; p2: string; p3: string }\n | { kind: 'isoTrapezoid'; p1: string; p2: string; p3: string }\n | { kind: 'isoTriangle'; base1: string; base2: string; apex: string }\n | { kind: 'rightTriangle'; rightAngle: string; leg1End: string; leg2End: string };\n\nfunction specialShapeName(kind: PolygonConstruction['kind']): string {\n switch (kind) {\n case 'square': return 'Hình vuông';\n case 'rectangle': return 'Hình chữ nhật';\n case 'rhombus': return 'Hình thoi';\n case 'parallelogram': return 'Hình bình hành';\n case 'isoTrapezoid': return 'Hình thang cân';\n case 'isoTriangle': return 'Tam giác cân';\n case 'rightTriangle': return 'Tam giác vuông';\n case 'regular': return '';\n }\n}\n\nexport type PolygonAttrs = {\n /** Danh sách đỉnh — bắt buộc khi không có `construction`. */\n vertices?: string[];\n construction?: PolygonConstruction;\n color?: string;\n fillOpacity?: number;\n width?: number;\n showLabel?: boolean;\n showValue?: boolean; // hiển thị diện tích\n};\n\nconst def: KindDef<PolygonAttrs> = {\n type: 'polygon',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (a?.construction) {\n const c = a.construction;\n if (c.kind === 'regular') {\n if (!c.p1 || !c.p2) throw new Error('polygon (regular): p1 và p2 bắt buộc');\n if (!Number.isFinite(c.n) || c.n < 3) throw new Error('polygon (regular): n ≥ 3');\n return;\n }\n if (c.kind === 'square') {\n if (!c.p1 || !c.p2) throw new Error('polygon (square): p1 và p2 bắt buộc');\n return;\n }\n if (c.kind === 'rectangle' || c.kind === 'rhombus' || c.kind === 'parallelogram' || c.kind === 'isoTrapezoid') {\n if (!c.p1 || !c.p2 || !c.p3) throw new Error(`polygon (${c.kind}): p1, p2, p3 bắt buộc`);\n return;\n }\n if (c.kind === 'isoTriangle') {\n if (!c.base1 || !c.base2 || !c.apex) throw new Error('polygon (isoTriangle): base1, base2, apex bắt buộc');\n return;\n }\n if (c.kind === 'rightTriangle') {\n if (!c.rightAngle || !c.leg1End || !c.leg2End) throw new Error('polygon (rightTriangle): rightAngle, leg1End, leg2End bắt buộc');\n return;\n }\n return;\n }\n if (!Array.isArray(a?.vertices) || a.vertices.length < 3) {\n throw new Error('polygon: cần ít nhất 3 đỉnh');\n }\n },\n dependsOn: (a) => {\n const c = a.construction;\n if (!c) return [...(a.vertices ?? [])];\n switch (c.kind) {\n case 'regular': return [c.p1, c.p2];\n case 'square': return [c.p1, c.p2];\n case 'rectangle':\n case 'rhombus':\n case 'parallelogram':\n case 'isoTrapezoid': return [c.p1, c.p2, c.p3];\n case 'isoTriangle': return [c.base1, c.base2, c.apex];\n case 'rightTriangle': return [c.rightAngle, c.leg1End, c.leg2End];\n }\n },\n describe: (obj, state) => {\n const c = obj.attrs.construction;\n if (c) {\n if (c.kind === 'regular') {\n const labels = regularVertexLabels(labelOf(c.p1, state), labelOf(c.p2, state), c.n);\n return `${regularPolygonName(c.n)} ${labels}`;\n }\n const name = specialShapeName(c.kind);\n let labels: string[] = [];\n switch (c.kind) {\n case 'square':\n labels = [labelOf(c.p1, state), labelOf(c.p2, state)];\n break;\n case 'rectangle':\n case 'rhombus':\n case 'parallelogram':\n case 'isoTrapezoid':\n labels = [labelOf(c.p1, state), labelOf(c.p2, state), labelOf(c.p3, state)];\n break;\n case 'isoTriangle':\n labels = [labelOf(c.apex, state), labelOf(c.base1, state), labelOf(c.base2, state)];\n break;\n case 'rightTriangle':\n labels = [labelOf(c.rightAngle, state), labelOf(c.leg1End, state), labelOf(c.leg2End, state)];\n break;\n }\n return `${name} ${labels.join('')}`;\n }\n return `Đa giác ${(obj.attrs.vertices ?? []).map((id) => labelOf(id, state)).join('')}`;\n },\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const label = obj.label;\n const showValue = obj.attrs.showValue ?? false;\n const cons = obj.attrs.construction;\n const commonAttrs = {\n name: label,\n withLabel: obj.attrs.showLabel ?? false,\n borders: {\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n },\n fillColor: obj.attrs.color ?? '#60a5fa',\n fillOpacity: obj.attrs.fillOpacity ?? 0.15,\n visible: obj.visible,\n fixed: obj.locked,\n };\n\n // Construction 'regular' / 'square': dùng JSXGraph 'regularpolygon'.\n if (cons?.kind === 'regular') {\n const p1 = ctx.resolveRef(cons.p1);\n const p2 = ctx.resolveRef(cons.p2);\n return board.create('regularpolygon', [p1, p2, cons.n], commonAttrs);\n }\n if (cons?.kind === 'square') {\n const p1 = ctx.resolveRef(cons.p1);\n const p2 = ctx.resolveRef(cons.p2);\n return board.create('regularpolygon', [p1, p2, 4], commonAttrs);\n }\n\n // rectangle / rhombus / parallelogram: D = A + (C − B) (derived in-render).\n // - rectangle/parallelogram: same formula; rectangle's right-angle invariant\n // được đảm bảo bởi onPerpendicular constraint trên p3.\n // - rhombus: cùng formula; |AB|=|BC| được đảm bảo bởi onCircleAroundPoint.\n if (cons?.kind === 'rectangle' || cons?.kind === 'rhombus' || cons?.kind === 'parallelogram') {\n const A: any = ctx.resolveRef(cons.p1);\n const B: any = ctx.resolveRef(cons.p2);\n const C: any = ctx.resolveRef(cons.p3);\n const D = board.create(\n 'point',\n [() => A.X() + C.X() - B.X(), () => A.Y() + C.Y() - B.Y()],\n { visible: false, withLabel: false, fixed: true, name: '' },\n );\n const poly: any = board.create('polygon', [A, B, C, D], commonAttrs);\n poly._helpers = [D];\n return poly;\n }\n\n // isoTrapezoid: D = phản chiếu C qua trung trực AB.\n // Công thức: D = C − 2 * proj(C-M, u_AB) * u_AB\n if (cons?.kind === 'isoTrapezoid') {\n const A: any = ctx.resolveRef(cons.p1);\n const B: any = ctx.resolveRef(cons.p2);\n const C: any = ctx.resolveRef(cons.p3);\n const Dx = () => {\n const Mx = (A.X() + B.X()) / 2;\n const My = (A.Y() + B.Y()) / 2;\n const ux = B.X() - A.X();\n const uy = B.Y() - A.Y();\n const len2 = ux * ux + uy * uy || 1;\n const proj = ((C.X() - Mx) * ux + (C.Y() - My) * uy) / len2;\n return C.X() - 2 * proj * ux;\n };\n const Dy = () => {\n const Mx = (A.X() + B.X()) / 2;\n const My = (A.Y() + B.Y()) / 2;\n const ux = B.X() - A.X();\n const uy = B.Y() - A.Y();\n const len2 = ux * ux + uy * uy || 1;\n const proj = ((C.X() - Mx) * ux + (C.Y() - My) * uy) / len2;\n return C.Y() - 2 * proj * uy;\n };\n const D = board.create('point', [Dx, Dy], {\n visible: false,\n withLabel: false,\n fixed: true,\n name: '',\n });\n const poly: any = board.create('polygon', [A, B, C, D], commonAttrs);\n poly._helpers = [D];\n return poly;\n }\n\n // isoTriangle: apex, base1, base2 (apex constrained onPerpBisector).\n if (cons?.kind === 'isoTriangle') {\n const Apex = ctx.resolveRef(cons.apex);\n const B1 = ctx.resolveRef(cons.base1);\n const B2 = ctx.resolveRef(cons.base2);\n return board.create('polygon', [Apex, B1, B2], commonAttrs);\n }\n\n // rightTriangle: R, leg1End, leg2End (leg2End constrained onPerpendicular).\n if (cons?.kind === 'rightTriangle') {\n const R = ctx.resolveRef(cons.rightAngle);\n const P = ctx.resolveRef(cons.leg1End);\n const Q = ctx.resolveRef(cons.leg2End);\n return board.create('polygon', [R, P, Q], commonAttrs);\n }\n const verts = (obj.attrs.vertices ?? []).map(id => ctx.resolveRef(id));\n // showValue=true: hiển thị label dạng \"ABC: S = 8.50\" với diện tích live.\n // showLabel=false + showValue=true: chỉ số diện tích. JSXGraph polygon's\n // Area() trả về |∮ x dy| theo đỉnh hiện tại → live update khi kéo đỉnh.\n \n const poly = board.create('polygon', verts, {\n name: showValue\n \n ? function (this: any) {\n // `this` là polygon element; gọi Area() để lấy giá trị live.\n const a = typeof this.Area === 'function' ? this.Area() : 0;\n const prefix = (obj.attrs.showLabel ?? true) ? `${label}: ` : '';\n return `${prefix}S = ${Math.abs(a).toFixed(2)}`;\n }\n : label,\n withLabel: showValue ? true : (obj.attrs.showLabel ?? false),\n borders: {\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n },\n fillColor: obj.attrs.color ?? '#60a5fa',\n fillOpacity: obj.attrs.fillOpacity ?? 0.15,\n visible: obj.visible,\n fixed: obj.locked,\n });\n return poly;\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/intersection.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport type IntersectionAttrs =\n | { kind: 'lineLine'; ref1: string; ref2: string; color?: string }\n | { kind: 'lineCircle'; ref1: string; ref2: string; branch: 0 | 1; color?: string }\n | { kind: 'circleCircle'; ref1: string; ref2: string; branch: 0 | 1; color?: string };\n\nconst def: KindDef<IntersectionAttrs> = {\n type: 'intersection',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || !('kind' in a)) throw new Error('intersection: kind bắt buộc');\n if (!a.ref1 || !a.ref2) throw new Error('intersection: ref1 và ref2 bắt buộc');\n if (a.kind === 'lineLine') return;\n if (a.kind === 'lineCircle' || a.kind === 'circleCircle') {\n if (a.branch !== 0 && a.branch !== 1) {\n throw new Error(`intersection.${a.kind}: branch phải là 0 hoặc 1`);\n }\n return;\n }\n throw new Error(`intersection: kind không hợp lệ \"${(a as { kind: string }).kind}\"`);\n },\n dependsOn: (a) => [a.ref1, a.ref2],\n describe: (obj) => {\n const a = obj.attrs;\n return `${obj.label} = giao ${a.ref1} ∩ ${a.ref2}`;\n },\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const a = ctx.resolveRef(obj.attrs.ref1);\n const b = ctx.resolveRef(obj.attrs.ref2);\n const opts: Record<string, unknown> = {\n name: obj.label,\n withLabel: true,\n // Cùng màu xanh với mọi điểm khác (buildPointOpts dùng '#1e40af').\n // Trước đây điểm giao tô đỏ '#dc2626' → tách biệt thị giác nhưng gây\n // khó hiểu (\"vì sao điểm này khác màu?\"). Giữ chung một màu.\n strokeColor: obj.attrs.color ?? '#1e40af',\n fillColor: obj.attrs.color ?? '#1e40af',\n visible: obj.visible,\n fixed: obj.locked,\n };\n if (obj.attrs.kind === 'lineLine') {\n return board.create('intersection', [a, b, 0], opts);\n }\n // lineCircle hoặc circleCircle: branch 0/1\n const branch = obj.attrs.branch ?? 0;\n return board.create('intersection', [a, b, branch], opts);\n },\n /**\n * Cập nhật TẠI CHỖ các thuộc tính \"trang trí\" (tên/màu/ẩn-hiện/khoá) qua\n * setAttribute — giữ nguyên JxgObj identity nên các object phụ thuộc điểm\n * giao (đường thẳng qua nó, …) KHÔNG bị stale parent ref. Mô phỏng update\n * hook của point.ts.\n *\n * Nếu định nghĩa hình học đổi (kind/ref1/ref2/branch) thì throw → renderer\n * fallback remove + create để JSXGraph dựng lại phép giao đúng.\n */\n update: (obj, prev, ctx, existing) => {\n const a = obj.attrs;\n const p = prev.attrs;\n const branchA = (a as { branch?: number }).branch;\n const branchP = (p as { branch?: number }).branch;\n if (a.kind !== p.kind || a.ref1 !== p.ref1 || a.ref2 !== p.ref2 || branchA !== branchP) {\n throw new Error('intersection: định nghĩa hình học đổi — recreate');\n }\n const el = existing as { setAttribute?: (o: Record<string, unknown>) => void };\n if (typeof el.setAttribute === 'function') {\n try {\n el.setAttribute({\n name: obj.label,\n withLabel: true,\n strokeColor: a.color ?? '#1e40af',\n fillColor: a.color ?? '#1e40af',\n visible: obj.visible,\n fixed: obj.locked,\n });\n } catch { /* ignore */ }\n }\n void ctx;\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/angle.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\n/**\n * Angle measurement: cung tròn + label giá trị tại đỉnh.\n *\n * JSXGraph vẽ cung từ p1 → p2 theo chiều dương (CCW). Nếu cross(p1−v, p2−v) < 0\n * thì cung CCW > 180° (reflex) — đổi vai trò p1/p2 ở render-time để luôn hiển\n * thị góc nhọn/tù thay vì góc phản.\n */\nexport type AngleAttrs = {\n p1: string;\n vertex: string;\n p2: string;\n color?: string;\n fillOpacity?: number;\n radius?: number;\n showLabel?: boolean;\n};\n\nconst def: KindDef<AngleAttrs> = {\n type: 'angle',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.p1 || !a?.vertex || !a?.p2) {\n throw new Error('angle: p1, vertex, p2 bắt buộc');\n }\n },\n dependsOn: (a) => [a.p1, a.vertex, a.p2],\n describe: (obj, state) => `Góc ${labelOf(obj.attrs.p1, state)}${labelOf(obj.attrs.vertex, state)}${labelOf(obj.attrs.p2, state)}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n \n const pa: any = ctx.resolveRef(obj.attrs.p1);\n \n const pv: any = ctx.resolveRef(obj.attrs.vertex);\n \n const pc: any = ctx.resolveRef(obj.attrs.p2);\n // Cross-product check: reorder để tránh cung reflex (> 180°). Chỉ check\n // một lần tại render-time (không live) — user có thể di chuyển điểm sau\n // và làm cung lật reflex; chấp nhận trade-off vì re-order live phức tạp.\n let parents = [pa, pv, pc];\n try {\n const ax = pa.X() - pv.X(), ay = pa.Y() - pv.Y();\n const cx = pc.X() - pv.X(), cy = pc.Y() - pv.Y();\n if (ax * cy - ay * cx < 0) parents = [pc, pv, pa];\n } catch { /* fallback giữ thứ tự gốc */ }\n return board.create('angle', parents, {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? true,\n radius: obj.attrs.radius ?? 1,\n fillColor: obj.attrs.color ?? '#22c55e',\n fillOpacity: obj.attrs.fillOpacity ?? 0.25,\n strokeColor: obj.attrs.color ?? '#16a34a',\n strokeWidth: 1.5,\n visible: obj.visible,\n fixed: obj.locked,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/distance.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\n/**\n * Distance measurement: text \"d = X.XX\" hiển thị tại trung điểm p1-p2.\n *\n * Dùng function-based coords + content cho JSXGraph text → live update khi\n * user kéo p1/p2 (khác commit cũ pre-scene-v2 vốn freeze value lúc create).\n */\nexport type DistanceAttrs = {\n p1: string;\n p2: string;\n color?: string;\n fontSize?: number;\n /** Tiền tố hiển thị, mặc định 'd = '. Để '' nếu chỉ muốn số. */\n prefix?: string;\n /** Số chữ số sau dấu phẩy, mặc định 2. */\n precision?: number;\n};\n\nconst def: KindDef<DistanceAttrs> = {\n type: 'distance',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.p1 || !a?.p2) throw new Error('distance: p1 và p2 bắt buộc');\n },\n dependsOn: (a) => [a.p1, a.p2],\n describe: (obj, state) => `Khoảng cách ${labelOf(obj.attrs.p1, state)}${labelOf(obj.attrs.p2, state)}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n \n const p1: any = ctx.resolveRef(obj.attrs.p1);\n \n const p2: any = ctx.resolveRef(obj.attrs.p2);\n const prefix = obj.attrs.prefix ?? 'd = ';\n const precision = obj.attrs.precision ?? 2;\n return board.create('text', [\n () => (p1.X() + p2.X()) / 2,\n () => (p1.Y() + p2.Y()) / 2,\n () => `${prefix}${Math.hypot(p1.X() - p2.X(), p1.Y() - p2.Y()).toFixed(precision)}`,\n ], {\n fontSize: obj.attrs.fontSize ?? 14,\n strokeColor: obj.attrs.color ?? '#dc2626',\n anchorX: 'middle',\n anchorY: 'middle',\n visible: obj.visible,\n fixed: true,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/function2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { validate as validateExpr, compile } from '../expressions/parser';\n\nexport interface Function2DAttrs {\n expression: string;\n color: string;\n visible: boolean;\n domain?: { min: number; max: number };\n}\n\nconst def: KindDef<Function2DAttrs> = {\n type: 'function2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a) throw new Error('function2d: attrs bắt buộc');\n if (typeof a.expression !== 'string' || !a.expression.trim()) {\n throw new Error('function2d: expression rỗng');\n }\n const v = validateExpr(a.expression);\n if (!v.ok) throw new Error(`function2d: expression invalid — ${v.error}`);\n if (typeof a.color !== 'string') throw new Error('function2d: color bắt buộc');\n if (typeof a.visible !== 'boolean') throw new Error('function2d: visible bắt buộc');\n if (a.domain) {\n if (a.domain.min >= a.domain.max) {\n throw new Error('function2d: domain min phải < max');\n }\n }\n },\n dependsOn: () => [],\n describe: (obj) => `${obj.label}(x) = ${obj.attrs.expression}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n if (!obj.visible || !obj.attrs.visible) return null;\n const fn = compile(obj.attrs.expression, (ctx.paramMap ?? {}) as Record<string, number>);\n if (typeof fn !== 'function') return null;\n const view = (ctx.defaults as { view?: { xMin?: number; xMax?: number } }).view;\n const xMin = obj.attrs.domain?.min ?? view?.xMin ?? -10;\n const xMax = obj.attrs.domain?.max ?? view?.xMax ?? 10;\n return board.create('functiongraph', [fn, xMin, xMax], {\n strokeColor: obj.attrs.color,\n strokeWidth: 2,\n name: obj.label,\n withLabel: false,\n highlight: false,\n fixed: true,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/parameter.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport interface ParameterAttrs {\n value: number;\n min: number;\n max: number;\n step: number;\n}\n\nconst def: KindDef<ParameterAttrs> = {\n type: 'parameter',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a) throw new Error('parameter: attrs bắt buộc');\n if (typeof a.value !== 'number' || typeof a.min !== 'number' || typeof a.max !== 'number') {\n throw new Error('parameter: value/min/max phải là number');\n }\n if (a.min >= a.max) throw new Error('parameter: min phải < max');\n if (a.value < a.min || a.value > a.max) throw new Error('parameter: value ngoài [min, max]');\n if (typeof a.step !== 'number' || a.step <= 0) throw new Error('parameter: step phải > 0');\n },\n dependsOn: () => [],\n describe: (obj) => `${obj.label} = ${obj.attrs.value}`,\n render: () => null, // Không render lên board\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/pointOnCurve.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport interface PointOnCurveAttrs {\n functionId: string;\n x: number;\n}\n\nconst def: KindDef<PointOnCurveAttrs> = {\n type: 'pointOnCurve',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.functionId !== 'string' || !a.functionId) {\n throw new Error('pointOnCurve: functionId bắt buộc');\n }\n if (typeof a.x !== 'number' || !Number.isFinite(a.x)) {\n throw new Error('pointOnCurve: x phải là finite number');\n }\n },\n dependsOn: (a) => [a.functionId],\n describe: (obj) => `${obj.label} trên ${obj.attrs.functionId} tại x=${obj.attrs.x.toFixed(3)}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const curve = ctx.resolveRef(obj.attrs.functionId);\n if (!curve) return null;\n return board.create('glider', [obj.attrs.x, 0, curve], {\n name: obj.label,\n size: 3,\n withLabel: obj.label !== '',\n fillColor: '#000',\n strokeColor: '#000',\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/tangent2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport interface Tangent2DAttrs {\n pointId: string;\n}\n\nconst def: KindDef<Tangent2DAttrs> = {\n type: 'tangent2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.pointId !== 'string' || !a.pointId) {\n throw new Error('tangent2d: pointId bắt buộc');\n }\n },\n dependsOn: (a) => [a.pointId],\n describe: (obj) => `Tiếp tuyến tại ${obj.attrs.pointId}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const pt = ctx.resolveRef(obj.attrs.pointId);\n if (!pt) return null;\n return board.create('tangent', [pt], {\n strokeColor: '#65a30d',\n strokeWidth: 1.5,\n dash: 2,\n withLabel: false,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/expressions/evaluator.ts\n// Numerical root + extrema scanning. Pure module.\n\nconst DEFAULT_SAMPLES = 1000;\n\n/**\n * Quét nghiệm trong [xMin, xMax] bằng sign-change detection + bisection.\n * - Lấy DEFAULT_SAMPLES sample.\n * - Mỗi sub-interval đổi dấu → bisect 30 step.\n */\nexport function scanRoots(\n fn: (x: number) => number,\n xMin: number,\n xMax: number,\n samples = DEFAULT_SAMPLES,\n): number[] {\n if (!Number.isFinite(xMin) || !Number.isFinite(xMax) || xMin >= xMax) return [];\n const out: number[] = [];\n const step = (xMax - xMin) / samples;\n let prev = fn(xMin);\n for (let i = 1; i <= samples; i++) {\n const x = xMin + i * step;\n const curr = fn(x);\n if (!Number.isFinite(prev) || !Number.isFinite(curr)) {\n prev = curr;\n continue;\n }\n // Sign change: strictly opposite signs (not both zero, not just touching zero)\n if (prev * curr < 0) {\n // Bisect\n const root = bisect(fn, x - step, x);\n if (Number.isFinite(root)) out.push(root);\n } else if (prev !== 0 && curr === 0) {\n // Exact root at x\n out.push(x);\n }\n prev = curr;\n }\n return out;\n}\n\nfunction bisect(fn: (x: number) => number, lo: number, hi: number): number {\n for (let i = 0; i < 50; i++) {\n const mid = (lo + hi) / 2;\n const fmid = fn(mid);\n if (!Number.isFinite(fmid)) break;\n if (Math.abs(fmid) < 1e-10) return mid;\n const flo = fn(lo);\n if (!Number.isFinite(flo)) break;\n if (flo * fmid <= 0) hi = mid;\n else lo = mid;\n }\n return (lo + hi) / 2;\n}\n\nexport interface Extremum {\n x: number;\n y: number;\n type: 'max' | 'min';\n}\n\n/**\n * Quét cực trị bằng sample derivative sign-change.\n * - Lấy DEFAULT_SAMPLES sample y = fn(x).\n * - Derivative xấp xỉ Δy / Δx.\n * - Đổi dấu derivative + → - = max, - → + = min.\n */\nexport function scanExtrema(\n fn: (x: number) => number,\n xMin: number,\n xMax: number,\n samples = DEFAULT_SAMPLES,\n): Extremum[] {\n if (!Number.isFinite(xMin) || !Number.isFinite(xMax) || xMin >= xMax) return [];\n const out: Extremum[] = [];\n const step = (xMax - xMin) / samples;\n // xs[0..samples+1] with xs[1..samples] covering [xMin..xMax], xs[0] and xs[samples+1] are guards\n const xs: number[] = [];\n const ys: number[] = [];\n for (let i = 0; i <= samples + 1; i++) {\n const x = xMin + (i - 1) * step;\n xs.push(x);\n ys.push(fn(x));\n }\n // xs[i] for i=1..samples corresponds to xMin + (i-1)*step\n // We check derivative sign change: d = ys[i+1] - ys[i-1]\n // When sign changes, extremum is at xs[i] = xMin + (i-1)*step\n let prevSign = 0;\n let prevSignIdx = 1;\n for (let i = 1; i <= samples; i++) {\n const d = ys[i + 1] - ys[i - 1];\n if (!Number.isFinite(d)) continue;\n const sign = d > 0 ? 1 : d < 0 ? -1 : 0;\n if (sign === 0) continue;\n if (prevSign !== 0 && sign !== prevSign) {\n const type: 'max' | 'min' = prevSign > 0 ? 'max' : 'min';\n // Extremum is between prevSignIdx and i — use midpoint\n const midI = Math.round((prevSignIdx + i) / 2);\n out.push({ x: xs[midI], y: ys[midI], type });\n }\n prevSign = sign;\n prevSignIdx = i;\n }\n return out;\n}\n","// src/core/scene/kinds/extremum2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { scanExtrema } from '../expressions/evaluator';\nimport { compile } from '../expressions/parser';\n\nexport interface Extremum2DAttrs {\n functionId: string;\n interval: { min: number; max: number };\n mode: 'max' | 'min';\n}\n\nconst def: KindDef<Extremum2DAttrs> = {\n type: 'extremum2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.functionId !== 'string' || !a.functionId) {\n throw new Error('extremum2d: functionId bắt buộc');\n }\n if (!a.interval || a.interval.min >= a.interval.max) {\n throw new Error('extremum2d: interval min phải < max');\n }\n if (a.mode !== 'max' && a.mode !== 'min') {\n throw new Error('extremum2d: mode phải là \"max\" hoặc \"min\"');\n }\n },\n dependsOn: (a) => [a.functionId],\n describe: (obj) => `${obj.attrs.mode === 'max' ? 'Cực đại' : 'Cực tiểu'} của ${obj.attrs.functionId} trong [${obj.attrs.interval.min}, ${obj.attrs.interval.max}]`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n // Need expression from function — look up via state if needed.\n // Simplified: use compiled-from-attrs cached in ctx.defaults._functionExpr (renderer populates).\n const expr = (ctx.defaults as { _functionExpr?: Record<string, string> })._functionExpr?.[obj.attrs.functionId];\n if (!expr) return null;\n const fn = compile(expr, (ctx.paramMap ?? {}) as Record<string, number>);\n if (typeof fn !== 'function') return null;\n const extrema = scanExtrema(fn, obj.attrs.interval.min, obj.attrs.interval.max).filter((e) => e.type === obj.attrs.mode);\n return extrema.map((e) => board.create('point', [e.x, e.y], {\n name: obj.label,\n size: 3,\n fillColor: '#dc2626',\n strokeColor: '#dc2626',\n withLabel: obj.label !== '',\n }));\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/root2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { scanRoots } from '../expressions/evaluator';\nimport { compile } from '../expressions/parser';\n\nexport interface Root2DAttrs {\n functionId: string;\n interval: { min: number; max: number };\n}\n\nconst def: KindDef<Root2DAttrs> = {\n type: 'root2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.functionId !== 'string' || !a.functionId) {\n throw new Error('root2d: functionId bắt buộc');\n }\n if (!a.interval || a.interval.min >= a.interval.max) {\n throw new Error('root2d: interval min phải < max');\n }\n },\n dependsOn: (a) => [a.functionId],\n describe: (obj) => `Nghiệm của ${obj.attrs.functionId} trong [${obj.attrs.interval.min}, ${obj.attrs.interval.max}]`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const expr = (ctx.defaults as { _functionExpr?: Record<string, string> })._functionExpr?.[obj.attrs.functionId];\n if (!expr) return null;\n const fn = compile(expr, (ctx.paramMap ?? {}) as Record<string, number>);\n if (typeof fn !== 'function') return null;\n const roots = scanRoots(fn, obj.attrs.interval.min, obj.attrs.interval.max);\n return roots.map((x) => board.create('point', [x, 0], {\n name: obj.label,\n size: 3,\n fillColor: '#dc2626',\n strokeColor: '#dc2626',\n withLabel: obj.label !== '',\n }));\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/slope2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport interface Slope2DAttrs {\n pointId: string;\n}\n\nconst def: KindDef<Slope2DAttrs> = {\n type: 'slope2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.pointId !== 'string' || !a.pointId) {\n throw new Error('slope2d: pointId bắt buộc');\n }\n },\n dependsOn: (a) => [a.pointId],\n describe: (obj) => `Slope tại ${obj.attrs.pointId}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const pt = ctx.resolveRef(obj.attrs.pointId);\n if (!pt) return null;\n return board.create('slopetriangle', [pt], {\n name: obj.label,\n withLabel: true,\n fillColor: '#9333ea',\n strokeColor: '#9333ea',\n fillOpacity: 0.2,\n });\n },\n};\n\nregisterKind(def);\n","// Shared serialize/deserialize cho scene State của stamp interactive\n// (geometry-2d, geometry-3d, graph-2d). Sau Tier D PR 3, customData chỉ\n// store JSON.stringify(state) — không còn envelope `{version, bbox, state}`.\n//\n// View info (bbox/axis/grid/azimuth/elevation) nằm trong `state.meta.view`\n// (discriminated union theo domain). createEmptyState set default view.\n//\n// Note: v0.20 KHÔNG support backward-compat envelope cũ. Data sessionStorage\n// cũ sẽ fallback về empty state khi parse fail (per user spec).\n\nimport { createEmptyState, type Domain, type State } from '../../core/scene';\n\nexport function serializeScene(state: State): string {\n return JSON.stringify(state);\n}\n\nfunction isValidState(value: unknown, domain: Domain): value is State {\n if (!value || typeof value !== 'object') return false;\n const v = value as Partial<State>;\n if (!v.meta || typeof v.meta !== 'object') return false;\n if (v.meta.domain !== domain) return false;\n if (!v.meta.view || typeof v.meta.view !== 'object') return false;\n if (!v.objects || typeof v.objects !== 'object') return false;\n if (!Array.isArray(v.order)) return false;\n return true;\n}\n\nexport function deserializeScene(domain: Domain, raw: string): State {\n if (!raw) return createEmptyState(domain);\n try {\n const parsed = JSON.parse(raw);\n if (isValidState(parsed, domain)) return parsed;\n } catch {\n /* swallow — fallback empty state */\n }\n return createEmptyState(domain);\n}\n"]}
|