@xom11/whiteboard 0.31.0 → 0.33.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 +149 -28
- package/dist/ai.d.ts +149 -28
- 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-TMRFSOM7.mjs → chunk-4NJUTCFF.mjs} +4 -4
- package/dist/{chunk-TMRFSOM7.mjs.map → chunk-4NJUTCFF.mjs.map} +1 -1
- package/dist/{chunk-LTLLQUMN.mjs → chunk-BZZ5BROM.mjs} +6 -7
- package/dist/chunk-BZZ5BROM.mjs.map +1 -0
- package/dist/{host-KMWP7KBT.mjs → chunk-C3RDFBQ5.mjs} +20 -35
- package/dist/chunk-C3RDFBQ5.mjs.map +1 -0
- package/dist/chunk-C7C66BAV.mjs +11 -0
- package/dist/chunk-C7C66BAV.mjs.map +1 -0
- package/dist/{chunk-T3N4BSJV.mjs → chunk-DCFZTKFE.mjs} +13 -5
- package/dist/chunk-DCFZTKFE.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-BMYC2ILT.mjs → chunk-FOPZOVI3.mjs} +5 -4
- package/dist/chunk-FOPZOVI3.mjs.map +1 -0
- package/dist/{chunk-K5BS2H56.mjs → chunk-GKDQ5IV7.mjs} +4 -4
- package/dist/{chunk-K5BS2H56.mjs.map → chunk-GKDQ5IV7.mjs.map} +1 -1
- 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-KOXOC2FI.mjs → chunk-NBMYET5H.mjs} +11 -15
- package/dist/chunk-NBMYET5H.mjs.map +1 -0
- package/dist/{chunk-DWIEVCGK.mjs → chunk-NTFG7ZRN.mjs} +53 -3
- package/dist/chunk-NTFG7ZRN.mjs.map +1 -0
- package/dist/{chunk-C76SOFXF.mjs → chunk-QCK3Z5WN.mjs} +3 -3
- package/dist/{chunk-C76SOFXF.mjs.map → chunk-QCK3Z5WN.mjs.map} +1 -1
- package/dist/chunk-SUXIMLYN.mjs +238 -0
- package/dist/chunk-SUXIMLYN.mjs.map +1 -0
- package/dist/geometry-2d.d.mts +1 -1
- package/dist/geometry-2d.d.ts +1 -1
- package/dist/geometry-2d.js +1026 -231
- package/dist/geometry-2d.js.map +1 -1
- package/dist/geometry-2d.mjs +6 -5
- package/dist/geometry-3d.d.mts +1 -1
- package/dist/geometry-3d.d.ts +1 -1
- package/dist/geometry-3d.js +4001 -475
- package/dist/geometry-3d.js.map +1 -1
- package/dist/geometry-3d.mjs +5 -5
- package/dist/graph-2d.d.mts +1 -1
- package/dist/graph-2d.d.ts +1 -1
- package/dist/graph-2d.js +712 -115
- package/dist/graph-2d.js.map +1 -1
- package/dist/graph-2d.mjs +5 -5
- 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-6WTLCXUE.mjs +62 -0
- package/dist/host-6WTLCXUE.mjs.map +1 -0
- package/dist/{host-H2IGOKJU.mjs → host-BWIXT5TR.mjs} +3 -3
- package/dist/{host-H2IGOKJU.mjs.map → host-BWIXT5TR.mjs.map} +1 -1
- package/dist/{host-4FIUNIDQ.mjs → host-QDVRULJV.mjs} +14 -11
- package/dist/host-QDVRULJV.mjs.map +1 -0
- package/dist/host-USOIVTQB.mjs +4976 -0
- package/dist/host-USOIVTQB.mjs.map +1 -0
- package/dist/index.d.mts +14 -4
- package/dist/index.d.ts +14 -4
- package/dist/index.js +4273 -521
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +48 -27
- package/dist/index.mjs.map +1 -1
- package/dist/latex.d.mts +1 -1
- package/dist/latex.d.ts +1 -1
- package/dist/latex.mjs +1 -1
- package/dist/serialize-7UZWQQ4I.mjs +9 -0
- package/dist/{serialize-PGHQZEPV.mjs.map → serialize-7UZWQQ4I.mjs.map} +1 -1
- package/dist/studio.d.mts +35 -0
- package/dist/studio.d.ts +35 -0
- package/dist/studio.js +10883 -0
- package/dist/studio.js.map +1 -0
- package/dist/studio.mjs +28 -0
- package/dist/studio.mjs.map +1 -0
- package/dist/{types-tePd94vW.d.ts → types-eEEEVsLF.d.mts} +1 -1
- package/dist/{types-tePd94vW.d.mts → types-eEEEVsLF.d.ts} +1 -1
- package/package.json +12 -2
- package/dist/chunk-BMYC2ILT.mjs.map +0 -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-LTLLQUMN.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-4FIUNIDQ.mjs.map +0 -1
- package/dist/host-4ZB4XD4S.mjs +0 -2378
- package/dist/host-4ZB4XD4S.mjs.map +0 -1
- package/dist/host-KMWP7KBT.mjs.map +0 -1
- package/dist/serialize-PGHQZEPV.mjs +0 -9
package/dist/geometry-3d.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/scene/types.ts","../src/core/scene/registry.ts","../src/core/scene/reducer.ts","../src/core/scene/store.ts","../src/core/scene/selectors.ts","../src/core/scene/hooks/useEditorState.ts","../src/core/scene/hooks/index.ts","../src/core/scene/kinds/3d-constraint.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/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/_label.ts","../src/core/scene/kinds/point-constraints/shared.ts","../src/core/scene/kinds/point-constraints/pointAtDistance.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/expressions/parser.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/core/scene/kinds/index.ts","../src/core/scene/index.ts","../src/stamps/shared/serializeScene.ts","../src/stamps/geometry-3d/serialize.ts","../src/core/scene/render/types.ts","../src/core/scene/render/JxgRenderer3D.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-3d/editor/theme.ts","../src/stamps/shared/jxgOffscreenRender.ts","../src/stamps/geometry-3d/render.ts","../src/stamps/shared/svgToStampFile.ts","../src/stamps/geometry-3d/editor/tools/handlers/_ensurePoint.ts","../src/stamps/geometry-3d/editor/tools/handlers/point.ts","../src/stamps/geometry-3d/editor/tools/handlers/segment.ts","../src/stamps/geometry-3d/editor/tools/handlers/polygon.ts","../src/stamps/geometry-3d/editor/scene/constraintMath.ts","../src/stamps/geometry-3d/editor/scene/geometryChecks.ts","../src/stamps/geometry-3d/editor/tools/handlers/plane.ts","../src/stamps/geometry-3d/editor/tools/handlers/pyramid.ts","../src/stamps/geometry-3d/editor/tools/handlers/prism.ts","../src/stamps/geometry-3d/editor/tools/handlers/tetrahedron.ts","../src/stamps/geometry-3d/editor/tools/handlers/cube.ts","../src/stamps/geometry-3d/editor/tools/handlers/sphere.ts","../src/stamps/geometry-3d/editor/tools/handlers/cylinder.ts","../src/stamps/geometry-3d/editor/tools/handlers/cone.ts","../src/stamps/geometry-3d/editor/tools/spec.ts","../src/stamps/geometry-3d/editor/tools/controller.ts","../src/stamps/geometry-3d/editor/hitTest/rayCast.ts","../src/stamps/geometry-3d/editor/hitTest/intersect.ts","../src/stamps/geometry-3d/editor/hitTest/snapping.ts","../src/stamps/geometry-3d/editor/hitTest/hitTest.ts","../src/stamps/shared/safeJsx.ts","../src/stamps/shared/attachJxgWheelZoom.ts","../src/stamps/shared/initJxgBoard.ts","../src/stamps/geometry-3d/editor/MiniBoard3D.tsx","../src/stamps/geometry-3d/editor/preview3d.ts","../src/stamps/geometry-3d/editor/StatusHint.tsx","../src/stamps/geometry-3d/editor/usePointDrag.ts","../src/stamps/geometry-3d/editor/editorHelpers.ts","../src/stamps/shared/StampLeftPanel/constants.ts","../src/stamps/shared/Toast/ToastProvider.tsx","../src/stamps/shared/Toast/Toast.tsx","../src/stamps/shared/Toast/useToast.ts","../src/stamps/shared/Toast/ToastHost.tsx","../src/stamps/shared/Toast/index.ts","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/core/scene/ui/LeftPanelShell.tsx","../src/core/scene/ui/kindMeta.ts","../src/core/scene/ui/ObjectRowMenu.tsx","../src/core/scene/ui/ObjectRow.tsx","../src/core/scene/ui/ObjectListPanel.tsx","../src/stamps/shared/StampLeftPanel/AxisGridSection.tsx","../src/stamps/shared/StampLeftPanel/types.ts","../src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts","../src/stamps/shared/StampLeftPanel/ToolGrid.tsx","../src/stamps/shared/StampLeftPanel/Desktop.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/shared/StampLeftPanel/Mobile.tsx","../src/stamps/shared/StampLeftPanel/index.tsx","../src/stamps/geometry-3d/editor/toolPanel/icons.tsx","../src/stamps/geometry-3d/editor/toolPanel/groups.ts","../src/stamps/shared/useChordShortcut.ts","../src/stamps/shared/insertImage.ts","../src/stamps/shared/useIsMobile.ts","../src/stamps/shared/useStampStore.ts","../src/stamps/geometry-3d/host.tsx","../src/stamps/geometry-3d/index.tsx"],"names":["def","sub","produce","React","CURVED_SEGMENTS","init_d_constraint","init_types","scale","init_registry","tangent","constructionRefs","center","A","B","labels","poly","paletteFor","init_theme","init_point","init_segment","init_polygon","id","norm","dot","add","EPS","React2","MiniBoard3D","p","jsx","jsxs","React3","useReducer","useRef","useCallback","useEffect","useMemo","createContext","useContext","init_Toast","EditorPanel","React5","React6","React7","React8","Fragment","useState","normalize","createPortal","UndoIcon","RedoIcon","A_CODE","forwardRef","Geometry3DStampHost","useImperativeHandle","lazy"],"mappings":"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","file":"geometry-3d.js","sourcesContent":["// src/core/scene/types.ts\n\nexport type SceneObject<A = Record<string, unknown>> = {\n id: string;\n kind: string;\n label: string;\n visible: boolean;\n locked: boolean;\n layer: string;\n schemaVersion: number;\n attrs: A;\n};\n\n// View per domain — narrow theo `state.meta.domain`.\nexport type View2D = {\n readonly bbox: readonly [number, number, number, number]; // [xmin, ymax, xmax, ymin]\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\nexport type View3D = {\n readonly bbox3D: readonly [number, number, number, number, number, number]; // [xmin, xmax, ymin, ymax, zmin, zmax]\n readonly azimuth: number;\n readonly elevation: number;\n};\n\nexport type ViewGraph2D = {\n readonly xMin: number;\n readonly xMax: number;\n readonly yMin: number;\n readonly yMax: number;\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\n// Union of all view shapes — narrow qua state.meta.domain.\nexport type SceneView = View2D | View3D | ViewGraph2D;\n\n// Discriminated union: domain narrow → view shape narrow.\nexport type StateMeta =\n | { readonly domain: '2d'; readonly version: number; readonly view: View2D }\n | { readonly domain: '3d'; readonly version: number; readonly view: View3D }\n | { readonly domain: 'graph2d'; readonly version: number; readonly view: ViewGraph2D };\n\nexport type Domain = StateMeta['domain'];\n\n// Backward-compat alias: UPDATE_VIEW patch dùng graph-2d shape (chỉ graph-2d\n// dispatch action này hiện tại).\nexport type ViewSettings = ViewGraph2D;\n\nexport type State = {\n readonly objects: Readonly<Record<string, SceneObject>>;\n readonly order: readonly string[];\n readonly counter: number;\n readonly meta: StateMeta;\n};\n\nexport type Action =\n | { type: 'ADD'; payload: { obj: SceneObject } }\n | { type: 'UPDATE'; payload: { id: string; patch: Partial<Omit<SceneObject, 'id' | 'kind' | 'attrs'>> } }\n | { type: 'UPDATE_ATTRS'; payload: { id: string; patch: Record<string, unknown> } }\n | { type: 'DELETE'; payload: { id: string } }\n | { type: 'RESET' }\n | { type: 'LOAD'; payload: { state: State } }\n | { type: 'TRANSACTION'; payload: { actions: Action[] } }\n | { type: 'UPDATE_VIEW'; payload: { patch: Partial<ViewSettings> } };\n\nexport type RenderCtx = {\n jxg: unknown;\n resolveRef: (id: string) => unknown;\n defaults: Readonly<Record<string, unknown>>;\n /** Map tham số (parameter.label → parameter.value). Chỉ graph2d dùng. */\n paramMap?: Readonly<Record<string, number>>;\n};\n\nexport type KindDef<A = Record<string, unknown>> = {\n type: string;\n schemaVersion: number;\n migrate: Record<number, (prev: any) => any>;\n validate?: (attrs: A) => void;\n dependsOn: (attrs: A) => string[];\n describe: (obj: SceneObject<A>, state?: State) => string;\n measure?: (obj: SceneObject<A>, state: State) =>\n | { label: string; value: number }[]\n | null;\n render: (obj: SceneObject<A>, ctx: RenderCtx) => unknown;\n update?: (\n obj: SceneObject<A>,\n prev: SceneObject<A>,\n ctx: RenderCtx,\n existing: unknown,\n ) => void;\n};\n\nexport const DEFAULT_VIEW_2D: View2D = {\n bbox: [-10, 10, 10, -10],\n showAxis: false,\n showGrid: false,\n};\n\nexport const DEFAULT_VIEW_3D: View3D = {\n bbox3D: [-5, 5, -5, 5, -5, 5],\n azimuth: 60,\n elevation: 30,\n};\n\nexport const DEFAULT_VIEW_GRAPH2D: ViewGraph2D = {\n xMin: -10, xMax: 10, yMin: -10, yMax: 10,\n showAxis: true, showGrid: true,\n};\n\n// EMPTY_STATE giữ shape '3d' (legacy default). Dùng `createEmptyState(domain)`\n// khi cần state cụ thể cho domain — đảm bảo meta.view khớp domain.\nexport const EMPTY_STATE: State = {\n objects: {},\n order: [],\n counter: 0,\n meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D },\n};\n\nexport function createEmptyState(domain: Domain): State {\n const base = { objects: {}, order: [], counter: 0 } as const;\n switch (domain) {\n case '2d':\n return { ...base, meta: { domain: '2d', version: 1, view: DEFAULT_VIEW_2D } };\n case '3d':\n return { ...base, meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D } };\n case 'graph2d':\n return { ...base, meta: { domain: 'graph2d', version: 1, view: DEFAULT_VIEW_GRAPH2D } };\n }\n}\n","// src/core/scene/registry.ts\nimport type { KindDef } from './types';\n\nconst registry = new Map<string, KindDef>();\n\nexport function registerKind<A = Record<string, unknown>>(def: KindDef<A>): void {\n if (registry.has(def.type)) {\n console.warn(`[scene] kind \"${def.type}\" đã được đăng ký — ghi đè định nghĩa cũ`);\n }\n registry.set(def.type, def as unknown as KindDef);\n}\n\nexport function getKind(type: string): KindDef {\n const def = registry.get(type);\n if (!def) throw new Error(`[scene] unknown kind: ${type}`);\n return def;\n}\n\nexport function listKinds(): KindDef[] {\n return Array.from(registry.values());\n}\n\n// Chỉ dùng cho test — reset registry giữa các test case.\nexport function __clearRegistryForTests(): void {\n registry.clear();\n}\n","// src/core/scene/reducer.ts\nimport type { Draft } from 'immer';\nimport type { Action, State, SceneObject } from './types';\nimport { getKind } from './registry';\n\nfunction collectDependents(state: Draft<State> | State, rootId: string): Set<string> {\n const dependents = new Set<string>([rootId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of Object.values(state.objects) as SceneObject[]) {\n if (dependents.has(obj.id)) continue;\n let kindDef;\n try { kindDef = getKind(obj.kind); } catch { continue; }\n const refs = kindDef.dependsOn(obj.attrs as never);\n if (refs.some(r => dependents.has(r))) {\n dependents.add(obj.id);\n grew = true;\n }\n }\n }\n return dependents;\n}\n\nexport function reduce(draft: Draft<State>, action: Action): void {\n switch (action.type) {\n case 'ADD': {\n const { obj } = action.payload;\n if (draft.objects[obj.id]) throw new Error(`[scene] id \"${obj.id}\" đã tồn tại`);\n const kindDef = getKind(obj.kind);\n kindDef.validate?.(obj.attrs as never);\n draft.objects[obj.id] = obj;\n draft.order.push(obj.id);\n draft.counter += 1;\n return;\n }\n case 'UPDATE': {\n const { id, patch } = action.payload;\n const obj = draft.objects[id];\n if (!obj) return;\n Object.assign(obj, patch);\n return;\n }\n case 'UPDATE_ATTRS': {\n const { id, patch } = action.payload;\n const obj = draft.objects[id];\n if (!obj) return;\n const kindDef = getKind(obj.kind);\n const nextAttrs = { ...(obj.attrs as object), ...patch };\n kindDef.validate?.(nextAttrs as never);\n obj.attrs = nextAttrs;\n return;\n }\n case 'DELETE': {\n const { id } = action.payload;\n if (!draft.objects[id]) return;\n const toDelete = collectDependents(draft, id);\n for (const delId of toDelete) {\n delete draft.objects[delId];\n }\n draft.order = draft.order.filter(x => !toDelete.has(x));\n return;\n }\n case 'RESET': {\n draft.objects = {};\n draft.order = [];\n draft.counter = 0;\n return;\n }\n case 'LOAD': {\n const { state } = action.payload;\n draft.objects = { ...state.objects };\n draft.order = [...state.order];\n draft.counter = state.counter;\n // Cast qua Draft<State['meta']> — immer chấp nhận structurally\n // identical shape, chỉ stricter readonly.\n draft.meta = { ...state.meta } as typeof draft.meta;\n return;\n }\n case 'TRANSACTION': {\n for (const sub of action.payload.actions) {\n reduce(draft, sub);\n }\n return;\n }\n case 'UPDATE_VIEW': {\n // Action payload typed cho graph-2d ViewSettings. Bỏ qua nếu domain\n // khác (view shape không tương thích — 2d dùng bbox, 3d dùng bbox3D).\n if (draft.meta.domain !== 'graph2d') return;\n Object.assign(draft.meta.view, action.payload.patch);\n return;\n }\n }\n}\n","// src/core/scene/store.ts\nimport { produce } from 'immer';\nimport { reduce } from './reducer';\nimport type { Action, State } from './types';\n\nexport type StoreListener = (next: State, prev: State, action: Action) => void;\n\nexport interface Store {\n getState(): State;\n dispatch(action: Action): void;\n subscribe(listener: StoreListener): () => void;\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n transaction(fn: (dispatch: (a: Action) => void) => void): void;\n withoutHistory(fn: () => void): void;\n}\n\nexport type StoreOptions = { historyLimit?: number };\n\nconst HISTORY_DEFAULT = 100;\n\nconst UNDO_ACTION: Action = { type: 'TRANSACTION', payload: { actions: [] } };\nconst REDO_ACTION: Action = { type: 'TRANSACTION', payload: { actions: [] } };\n\nexport function createStore(initial: State, options: StoreOptions = {}): Store {\n const limit = options.historyLimit ?? HISTORY_DEFAULT;\n let state = initial;\n const past: State[] = [];\n const future: State[] = [];\n const listeners = new Set<StoreListener>();\n let dispatching = false;\n let suspendHistory = false;\n let transactionActions: Action[] | null = null;\n\n function notify(prev: State, action: Action): void {\n listeners.forEach(l => l(state, prev, action));\n }\n\n function pushHistory(prev: State): void {\n if (suspendHistory) return;\n past.push(prev);\n if (past.length > limit) past.shift();\n future.length = 0;\n }\n\n function applyAction(action: Action): void {\n const prev = state;\n state = produce(state, draft => { reduce(draft, action); });\n if (state !== prev) {\n pushHistory(prev);\n notify(prev, action);\n }\n }\n\n return {\n getState: () => state,\n\n dispatch(action: Action) {\n if (dispatching) throw new Error('[scene] không được dispatch trong subscriber');\n if (transactionActions) {\n transactionActions.push(action);\n return;\n }\n dispatching = true;\n try { applyAction(action); } finally { dispatching = false; }\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n\n undo() {\n const prev = past.pop();\n if (!prev) return;\n future.push(state);\n const old = state;\n state = prev;\n notify(old, UNDO_ACTION);\n },\n\n redo() {\n const next = future.pop();\n if (!next) return;\n past.push(state);\n if (past.length > limit) past.shift();\n const old = state;\n state = next;\n notify(old, REDO_ACTION);\n },\n\n canUndo: () => past.length > 0,\n canRedo: () => future.length > 0,\n\n transaction(fn) {\n if (transactionActions) throw new Error('[scene] transaction lồng nhau không hỗ trợ');\n transactionActions = [];\n try { fn((a) => { transactionActions!.push(a); }); }\n finally {\n const actions = transactionActions;\n transactionActions = null;\n if (actions.length > 0) {\n applyAction({ type: 'TRANSACTION', payload: { actions } });\n }\n }\n },\n\n withoutHistory(fn) {\n const prevSuspend = suspendHistory;\n suspendHistory = true;\n try { fn(); } finally { suspendHistory = prevSuspend; }\n },\n };\n}\n","// 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/hooks/index.ts\nexport { useSceneStore } from './useSceneStore';\nexport type { SceneStoreApi } from './useSceneStore';\nexport { useEditorState } from './useEditorState';\nexport type { UseEditorStateOptions } from './useEditorState';\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\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 default: return [];\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';\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 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 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';\n\nexport type Line3DAttrs = { p1: string; p2: string; color?: string };\n\nregisterKind<Line3DAttrs>({\n type: 'line3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.p1 || !a?.p2) throw new Error('line3d: p1/p2 required'); },\n dependsOn: (a) => [a.p1, a.p2],\n describe: (obj, state) => `Đường ${obj.label} qua ${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: true,\n straightLast: true,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: 2,\n visible: obj.visible,\n });\n },\n});\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';\n\nexport type Plane3DAttrs = { p1: string; p2: string; p3: string; color?: string };\n\nregisterKind<Plane3DAttrs>({\n type: 'plane3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.p1 || !a?.p2 || !a?.p3) throw new Error('plane3d: cần 3 điểm'); },\n dependsOn: (a) => [a.p1, a.p2, a.p3],\n describe: (obj, state) => `Mặt ${obj.label} qua ${labelOf(obj.attrs.p1, state)}, ${labelOf(obj.attrs.p2, state)}, ${labelOf(obj.attrs.p3, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n return view.create('plane3d', [\n ctx.resolveRef(obj.attrs.p1),\n ctx.resolveRef(obj.attrs.p2),\n ctx.resolveRef(obj.attrs.p3),\n ], {\n fillOpacity: 0.15,\n fillColor: obj.attrs.color ?? '#60a5fa',\n strokeColor: obj.attrs.color ?? '#60a5fa',\n visible: obj.visible,\n });\n },\n});\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/cylinder3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\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.\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 dx = r * Math.cos(theta);\n const dy = r * Math.sin(theta);\n baseRing.push([ax + dx, ay + dy, az]);\n topRing.push([bx + dx, by + dy, bz]);\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';\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.\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 baseRing.push([bx + r * Math.cos(theta), by + r * Math.sin(theta), bz]);\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\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 default: return [];\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","// src/core/scene/kinds/_label.ts\n/** Offset nhãn (pixel) so với anchor. offset[1] dương = nhãn đi lên (quy ước JSXGraph). */\nexport type LabelOffset = [number, number];\n\n/**\n * Opts cho `label` của một JSXGraph element: luôn `fixed:false` (kéo được).\n * `labelOffset` (nếu có) hoặc `dflt` (nếu có) thành `offset`. Không có cả hai\n * → chỉ `{ fixed:false }` (giữ default JSXGraph, byte-identical với hiện tại\n * cho line/circle vốn không set offset).\n */\nexport function labelOpts(\n labelOffset?: LabelOffset,\n dflt?: LabelOffset,\n): { label: Record<string, unknown> } {\n const offset = labelOffset ?? dflt;\n return { label: { fixed: false, ...(offset ? { offset } : {}) } };\n}\n\n/**\n * Đọc offset-tổng (pixel) của một label JSXGraph sau khi user kéo, quy về dạng\n * thuần `offset` (để zero relativeCoords mà vị trí không đổi):\n * x = offset[0] + rel.scrCoords[1]\n * y = offset[1] - rel.scrCoords[2] (screen-y xuống, offset-y lên)\n * Trả null nếu thiếu dữ liệu.\n */\nexport function readLabelOffset(label: {\n evalVisProp?: (k: string) => unknown;\n visProp?: { offset?: number[] };\n relativeCoords?: { scrCoords?: number[] };\n}): LabelOffset | null {\n const off = (label.evalVisProp?.('offset') as number[] | undefined) ?? label.visProp?.offset;\n const rel = label.relativeCoords?.scrCoords;\n if (!off || !rel || off.length < 2 || rel.length < 3) return null;\n return [Math.round(off[0] + rel[1]), Math.round(off[1] - rel[2])];\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","// 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 { 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 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/expressions/parser.ts\n// Pure expression parser cho function2d kind. Không import JSXGraph/React.\n\nexport const ALLOWED_CONSTANTS = ['pi', 'e'] as const;\nexport const ALLOWED_FUNCTIONS = [\n 'sin', 'cos', 'tan',\n 'asin', 'acos', 'atan', 'atan2',\n 'sinh', 'cosh', 'tanh',\n 'exp', 'log', 'log10', 'ln',\n 'sqrt', 'cbrt', 'abs',\n 'floor', 'ceil', 'round',\n 'min', 'max', 'pow',\n] as const;\n\nconst ID_RE = /[A-Za-z_][A-Za-z0-9_]*/g;\nconst UNSAFE_RE = /[=;{}]|\\beval\\b|\\bnew\\b|\\breturn\\b|\\bthis\\b|\\bwindow\\b|\\bdocument\\b|\\bglobal\\b|\\bprocess\\b/;\n\nconst NUMBER_RE = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/;\n\nexport type ValidateResult = { ok: true } | { ok: false; error: string };\n\n// Detect identifiers used as function calls (followed by '(')\nconst FUNC_CALL_RE = /([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/g;\n\n/** Kiểm tra expression có hợp lệ không. */\nexport function validate(expression: string): ValidateResult {\n const trimmed = expression.trim();\n if (!trimmed) return { ok: false, error: 'Biểu thức rỗng' };\n if (UNSAFE_RE.test(trimmed)) return { ok: false, error: 'Biểu thức chứa toán tử hoặc identifier không cho phép' };\n\n // Replace ^ với ** (JS không có ^)\n const jsExpr = trimmed.replace(/\\^/g, '**');\n\n // Check function call identifiers — must be in ALLOWED_FUNCTIONS\n let fm: RegExpExecArray | null;\n FUNC_CALL_RE.lastIndex = 0;\n while ((fm = FUNC_CALL_RE.exec(jsExpr)) !== null) {\n const fnName = fm[1];\n if (!(ALLOWED_FUNCTIONS as readonly string[]).includes(fnName)) {\n return { ok: false, error: `Hàm không hợp lệ: ${fnName}` };\n }\n }\n\n // Check identifiers\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(jsExpr)) !== null) ids.add(m[0]);\n\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n // Remaining identifiers treat as parameter — OK at validate time.\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(id)) {\n return { ok: false, error: `Identifier không hợp lệ: ${id}` };\n }\n }\n\n // Try syntactic compile (with dummy params) to catch syntax errors.\n try {\n buildFunctionBody(jsExpr, Array.from(ids).filter(\n (id) => id !== 'x' && !(ALLOWED_CONSTANTS as readonly string[]).includes(id) && !(ALLOWED_FUNCTIONS as readonly string[]).includes(id),\n ));\n } catch (err) {\n return { ok: false, error: `Cú pháp lỗi: ${(err as Error).message}` };\n }\n\n return { ok: true };\n}\n\n/**\n * Compile expression thành function (x: number) => number.\n * - `params` map từ identifier → value để inline vào closure.\n * - Trả string error nếu invalid.\n */\nexport function compile(\n expression: string,\n params: Record<string, number>,\n): ((x: number) => number) | string {\n const v = validate(expression);\n if (!v.ok) return v.error;\n const jsExpr = expression.trim().replace(/\\^/g, '**');\n\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(jsExpr)) !== null) ids.add(m[0]);\n\n const paramNames: string[] = [];\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n paramNames.push(id);\n }\n\n try {\n const body = buildFunctionBody(jsExpr, paramNames);\n \n const fn = new Function('x', ...paramNames, body) as (\n x: number,\n ...args: number[]\n ) => number;\n const args = paramNames.map((name) => params[name] ?? NaN);\n return (x: number) => fn(x, ...args);\n } catch (err) {\n return `Compile error: ${(err as Error).message}`;\n }\n}\n\nfunction buildFunctionBody(jsExpr: string, _paramNames: string[]): string {\n // Inline Math constants and functions.\n // sin → Math.sin, pi → Math.PI, e → Math.E, ln → Math.log.\n let body = jsExpr;\n body = body.replace(/\\bln\\b/g, 'Math.log');\n body = body.replace(/\\blog\\b/g, 'Math.log10');\n body = body.replace(/\\bpi\\b/g, '(Math.PI)');\n body = body.replace(/\\be\\b(?!\\w)/g, '(Math.E)');\n for (const fn of ALLOWED_FUNCTIONS) {\n if (fn === 'log' || fn === 'log10') continue; // already handled\n body = body.replace(new RegExp(`\\\\b${fn}\\\\b`, 'g'), `Math.${fn}`);\n }\n return `\"use strict\"; return (${body});`;\n}\n\n/** Liệt kê free identifiers (≠ x, ≠ allowed const/func). */\nexport function collectFreeVars(expression: string): string[] {\n const v = validate(expression);\n if (!v.ok) return [];\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(expression)) !== null) ids.add(m[0]);\n const out: string[] = [];\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n if (NUMBER_RE.test(id)) continue;\n out.push(id);\n }\n return out.sort();\n}\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","// src/core/scene/kinds/index.ts\nimport './point3d';\nimport './segment3d';\nimport './line3d';\nimport './ray3d';\nimport './vector3d';\nimport './plane3d';\nimport './polygon3d';\nimport './sphere3d';\nimport './polyhedron3d';\nimport './cylinder3d';\nimport './cone3d';\nimport './point';\nimport './segment';\nimport './line';\nimport './ray';\nimport './vector';\nimport './circle';\nimport './arc';\nimport './sector';\nimport './polygon';\nimport './intersection';\nimport './angle';\nimport './distance';\nimport './function2d';\nimport './parameter';\nimport './pointOnCurve';\nimport './tangent2d';\nimport './extremum2d';\nimport './root2d';\nimport './slope2d';\nexport {};\n","// src/core/scene/index.ts\nexport type {\n SceneObject,\n State,\n StateMeta,\n Domain,\n SceneView,\n View2D,\n View3D,\n ViewGraph2D,\n ViewSettings,\n Action,\n KindDef,\n RenderCtx,\n} from './types';\nexport {\n EMPTY_STATE,\n DEFAULT_VIEW_2D,\n DEFAULT_VIEW_3D,\n DEFAULT_VIEW_GRAPH2D,\n createEmptyState,\n} from './types';\nexport { createStore } from './store';\nexport type { Store, StoreListener, StoreOptions } from './store';\nexport { reduce } from './reducer';\nexport { registerKind, getKind, listKinds } from './registry';\nexport { listObjects, byKind, dependentsOf, nextLabel } from './selectors';\nexport { migrateState } from './migrations/runMigrations';\nexport { registerStateMigration, CURRENT_STATE_VERSION } from './migrations/state';\n\nexport { useSceneStore, useEditorState } from './hooks';\nexport type { SceneStoreApi, UseEditorStateOptions } from './hooks';\n\n// IMPORTANT: import kinds barrel để side-effect register chạy.\nimport './kinds';\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","// src/stamps/geometry-3d/serialize.ts\n//\n// Sau Tier D PR 3: customData.jsonState chỉ chứa `JSON.stringify(state)`.\n// View info (bbox3D/azimuth/elevation) nằm trong `state.meta.view` (View3D shape).\n//\n// Type guard `isGeometry3DCustomData` giữ ở đây để index.tsx + host import từ\n// 1 chỗ.\n\nimport { serializeScene, deserializeScene } from '../shared/serializeScene';\nimport type { State, View3D } from '../../core/scene';\nimport type { BaseStampCustomData } from '../shared/types';\n\nexport interface Geometry3DCustomData extends BaseStampCustomData {\n kind: 'geometry3d';\n version: 2;\n jsonState: string;\n}\n\nexport function isGeometry3DCustomData(data: unknown): data is Geometry3DCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<Geometry3DCustomData>;\n return (\n d.kind === 'geometry3d' &&\n d.version === 2 &&\n typeof d.jsonState === 'string'\n );\n}\n\nexport function serializeBoard3D(state: State, view: View3D): string {\n const withView: State = {\n ...state,\n meta: { domain: '3d', version: state.meta.version, view },\n };\n return serializeScene(withView);\n}\n\nexport function deserializeBoard3D(raw: string): State {\n return deserializeScene('3d', raw);\n}\n","// src/core/scene/render/types.ts\nimport type { RenderCtx } from '../types';\n\nexport type Theme3D = {\n point: { size: number; color: string };\n line: { strokeWidth: number; color: string };\n plane: { fillOpacity: number; color: string };\n};\n\nexport const DEFAULT_THEME_3D: Theme3D = {\n point: { size: 4, color: '#1e40af' },\n line: { strokeWidth: 2, color: '#0f172a' },\n plane: { fillOpacity: 0.15, color: '#60a5fa' },\n};\n\nexport type RenderCtx3D = RenderCtx & {\n theme: Theme3D;\n};\n","// src/core/scene/render/JxgRenderer3D.ts\nimport type { Store } from '../store';\nimport type { State, SceneObject, RenderCtx } from '../types';\nimport { getKind } from '../registry';\nimport { DEFAULT_THEME_3D, type Theme3D } from './types';\n\nexport type JxgRenderer3DOptions = { theme?: Theme3D };\n\nexport class JxgRenderer3D {\n private view: unknown;\n private store: Store;\n private theme: Theme3D;\n private elements = new Map<string, unknown>();\n private unsubscribe: () => void;\n private disposed = false;\n\n constructor(store: Store, view: unknown, options: JxgRenderer3DOptions = {}) {\n this.store = store;\n this.view = view;\n this.theme = options.theme ?? DEFAULT_THEME_3D;\n // Subscribe first, then render current state.\n this.unsubscribe = store.subscribe((next, prev) => this.applyDiff(prev, next));\n // Render initial state (e.g. if LOAD ran before subscribe).\n this.applyDiff(undefined, store.getState());\n }\n\n private ctx(): RenderCtx {\n return {\n jxg: this.view,\n resolveRef: (id: string) => {\n const el = this.elements.get(id);\n if (el === undefined) {\n throw new Error(`[scene] resolveRef: chưa render id=\"${id}\"`);\n }\n return el;\n },\n defaults: {},\n };\n }\n\n private create(obj: SceneObject): void {\n try {\n const def = getKind(obj.kind);\n const el = def.render(obj, this.ctx());\n this.elements.set(obj.id, el);\n } catch (err) {\n console.warn(`[scene/render] không render được ${obj.kind} id=\"${obj.id}\":`, err);\n }\n }\n\n private remove(id: string): void {\n // Selection halo phải bị xoá TRƯỚC element gốc (halo tham chiếu parent).\n this.removeHalo(id);\n this.selectedIds.delete(id);\n const el = this.elements.get(id);\n if (el === undefined) return;\n try {\n this.removeFromView(el);\n } catch (err) {\n console.warn(`[scene/render] không remove được id=\"${id}\":`, err);\n }\n this.elements.delete(id);\n }\n\n private removeFromView(el: unknown): void {\n const view = this.view as { removeObject?: (e: unknown) => void };\n if (el && typeof el === 'object') {\n const asObj = el as Record<string, unknown>;\n // Composite shape: { faces: [] } for polyhedron/cylinder/cone.\n if (Array.isArray(asObj['faces'])) {\n for (const face of asObj['faces'] as unknown[]) {\n view.removeObject?.(face);\n }\n // Also remove hidden vertex points if present (_verts).\n if (Array.isArray(asObj['_verts'])) {\n for (const v of asObj['_verts'] as unknown[]) {\n view.removeObject?.(v);\n }\n }\n return;\n }\n }\n view.removeObject?.(el);\n }\n\n private applyDiff(prev: State | undefined, next: State): void {\n if (this.disposed) return;\n const prevObjs = prev?.objects ?? {};\n const nextObjs = next.objects;\n\n // Remove ids that disappeared (iterate in order of prev to respect dependencies).\n for (const id of Object.keys(prevObjs)) {\n if (!(id in nextObjs)) {\n this.remove(id);\n }\n }\n\n // Add or update in next.order (preserves dependency order).\n for (const id of next.order) {\n const cur = nextObjs[id] as SceneObject | undefined;\n if (!cur) continue;\n const old = prevObjs[id] as SceneObject | undefined;\n if (!old) {\n // New object.\n this.create(cur);\n continue;\n }\n if (Object.is(old, cur)) {\n // Unchanged (same Immer reference).\n continue;\n }\n // Changed: try update hook, otherwise remove + recreate.\n let def;\n try { def = getKind(cur.kind); } catch { continue; }\n const existing = this.elements.get(id);\n if (def.update && existing !== undefined) {\n try {\n def.update(cur, old, this.ctx(), existing);\n continue;\n } catch (err) {\n console.warn(`[scene/render] update fail, recreate id=\"${id}\":`, err);\n }\n }\n this.remove(id);\n this.create(cur);\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.unsubscribe();\n this.disposed = true;\n for (const id of Array.from(this.elements.keys())) {\n this.remove(id);\n }\n }\n\n listElements(): Map<string, unknown> {\n return this.elements;\n }\n\n // Selection halo overlay (3D): multi-select, halo phía sau element gốc cho\n // các kind đơn giản (point3d, segment/line/ray/vector). Các composite shape\n // (polyhedron/cone/cylinder/plane) chưa hỗ trợ halo overlay — bỏ qua.\n private selectedIds: Set<string> = new Set();\n private haloMap: Map<string, unknown[]> = new Map();\n\n highlight(ids: string | string[] | null): void {\n if (this.disposed) return;\n const newIds = new Set<string>(\n ids == null ? [] : Array.isArray(ids) ? ids : [ids],\n );\n for (const id of this.selectedIds) {\n if (!newIds.has(id)) this.removeHalo(id);\n }\n for (const id of newIds) {\n if (!this.selectedIds.has(id) && this.elements.has(id)) this.addHalo(id);\n }\n this.selectedIds = newIds;\n try {\n (this.view as { update?: () => void }).update?.();\n } catch { /* ignore */ }\n }\n\n private removeHalo(id: string): void {\n const halos = this.haloMap.get(id);\n if (!halos) return;\n const view = this.view as { removeObject?: (e: unknown) => void };\n for (const h of halos) {\n try { view.removeObject?.(h); } catch { /* ignore */ }\n }\n this.haloMap.delete(id);\n }\n\n private addHalo(id: string): void {\n const el = this.elements.get(id) as\n | {\n elType?: string;\n getAttribute?: (k: string) => unknown;\n point1?: unknown;\n point2?: unknown;\n element2D?: { X?: () => number; Y?: () => number };\n }\n | undefined;\n if (!el) return;\n const view = this.view as {\n create?: (kind: string, parents: unknown[], attrs?: unknown) => unknown;\n };\n if (!view.create) return;\n\n const SEL_STROKE = '#475569';\n const SEL_FILL = '#cbd5e1';\n const haloBase = {\n strokeColor: SEL_STROKE,\n strokeOpacity: 0.55,\n fillColor: SEL_FILL,\n fillOpacity: 0.3,\n fixed: true,\n withLabel: false,\n name: '',\n highlight: false,\n needsRegularUpdate: true,\n };\n const halos: unknown[] = [];\n try {\n switch (el.elType) {\n case 'point3d': {\n // 3D point: tạo point3d ở cùng coords với size to + gray. Lấy coords\n // qua element2D.X/Y (JSXGraph 3D nội bộ chiếu xuống 2D plane), nhưng\n // an toàn nhất là reference element gốc và đọc Z() / coords() runtime.\n const elAny = el as unknown as {\n X?: () => number; Y?: () => number; Z?: () => number;\n getAttribute?: (k: string) => unknown;\n };\n const baseSize = (elAny.getAttribute?.('size') as number | undefined) ?? 4;\n if (typeof elAny.X === 'function' && typeof elAny.Y === 'function' && typeof elAny.Z === 'function') {\n const halo = view.create('point3d', [\n () => elAny.X?.() ?? 0,\n () => elAny.Y?.() ?? 0,\n () => elAny.Z?.() ?? 0,\n ], {\n ...haloBase,\n size: baseSize + 6,\n face: 'o',\n strokeWidth: 2,\n strokeOpacity: 0.75,\n fillOpacity: 0.25,\n });\n halos.push(halo);\n }\n break;\n }\n case 'line3d': {\n if (el.point1 && el.point2) {\n const halo = view.create('line3d', [el.point1, el.point2], {\n ...haloBase,\n strokeWidth: 9,\n straightFirst: (el.getAttribute?.('straightFirst') as boolean | undefined) ?? false,\n straightLast: (el.getAttribute?.('straightLast') as boolean | undefined) ?? false,\n });\n halos.push(halo);\n }\n break;\n }\n default:\n // Composite/plane/sphere/cone/cylinder/polygon3d/polyhedron3d:\n // halo overlay khó (composite faces, depth ordering) — bỏ qua.\n // Selection visible qua ObjectListPanel row highlight thay vì\n // halo trên canvas.\n break;\n }\n } catch (err) {\n console.warn('[scene/render/3d] halo create fail:', err);\n }\n if (halos.length) this.haloMap.set(id, halos);\n }\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Dùng `Theme2D` từ `core/scene/render/types2d` (cùng abstraction graph-2d).\n// JxgRenderer nhận theme qua constructor options và phân phối qua RenderCtx\n// đến mỗi kind handler — không cần sentinel string trong attrs nữa.\n\nimport { type Theme2D } from '../../../core/scene/render/types2d';\n\nexport const themeStroke = (dark: boolean): string => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean): string => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean): string => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean): string => (dark ? '#e2e8f0' : '#000000');\n\nexport function paletteFor(isDark: boolean): Theme2D {\n const stroke = themeStroke(isDark);\n return {\n stroke,\n fill: '#60a5fa',\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n // Geometry-2d điểm fill = stroke color (đồng bộ chấm điểm với nét vẽ).\n pointFill: stroke,\n };\n}\n","import {\n paletteFor as palette2D,\n} from '../../geometry-2d/editor/theme';\nimport type { Theme2D } from '../../../core/scene/render/types2d';\n\nexport type Geom3DPalette = Theme2D & {\n view3dBg: string;\n axisX: string;\n axisY: string;\n axisZ: string;\n};\n\nexport function paletteFor(isDark: boolean): Geom3DPalette {\n const base = palette2D(isDark);\n return {\n ...base,\n view3dBg: isDark ? '#1a1a1a' : '#ffffff',\n axisX: '#d63b3b',\n axisY: '#2d8a2d',\n axisZ: '#2d6dd6',\n };\n}\n\nexport const DEFAULT_VIEW3D: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n} = {\n azimuth: 0.7,\n elevation: 0.4,\n bbox3D: [-3, -3, -3, 3, 3, 3],\n};\n\nexport const VIEW3D_ATTRS = (isDark: boolean) => {\n const p = paletteFor(isDark);\n const axisLabel = (color: string) => ({\n strokeColor: color,\n fontSize: 14,\n offset: [10, 0] as [number, number],\n });\n return {\n az: { slider: { visible: false }, point2: { visible: false } },\n el: { slider: { visible: false } },\n projection: 'central' as const,\n // GeoGebra-style: axes pass through origin (0,0,0) instead of bbox border.\n axesPosition: 'center' as const,\n xAxis: {\n strokeColor: p.axisX,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'x',\n withLabel: true,\n label: axisLabel(p.axisX),\n },\n yAxis: {\n strokeColor: p.axisY,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'y',\n withLabel: true,\n label: axisLabel(p.axisY),\n },\n zAxis: {\n strokeColor: p.axisZ,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'z',\n withLabel: true,\n label: axisLabel(p.axisZ),\n },\n // GeoGebra-style: hide ALL bbox wall planes; the XY ground plane is drawn\n // explicitly at z=0 via the helper below (so it coincides with Ox/Oy).\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: false, mesh3d: { visible: false } },\n };\n};\n\nexport const GROUND_PLANE_ATTRS = (isDark: boolean) => ({\n fillColor: isDark ? '#2a2a2a' : '#e6e6e6',\n fillOpacity: isDark ? 0.5 : 0.55,\n strokeColor: isDark ? '#3a3a3a' : '#cfcfcf',\n strokeOpacity: 0.7,\n strokeWidth: 1,\n fixed: true,\n highlight: false,\n withLabel: false,\n layer: 0,\n});\n\n/** XY ground plane extent (square around origin in user units). */\nexport const GROUND_PLANE_RANGE: [number, number] = [-3, 3];\n","/**\n * Shared offscreen JSXGraph render pipeline.\n *\n * Each JSXGraph stamp (geometry-2d, geometry-3d, graph-2d) needs the same\n * boilerplate to dump SVG offscreen: lazy import JSXGraph, create a hidden\n * DIV with explicit pixel dimensions, initBoard, attach a scene-store renderer\n * (or create a view3d), force update, clone the SVG node, add xmlns, serialize,\n * then tear everything down. This helper owns that lifecycle so each stamp\n * only writes the unique part — what to render — inside `setup`.\n *\n * Intrinsic SVG resolution matters: Excalidraw loads stamp SVGs via <img> then\n * drawImage onto canvas. The browser rasterizes SVG at its intrinsic\n * width/height, so dims passed here should be generous enough that the bitmap\n * downscales (sharp) instead of upscales (blurry) when the user zooms or views\n * on a retina display.\n */\n \ntype JxgModule = any;\n\nexport interface JxgOffscreenRenderOpts {\n /** JSXGraph bounding box: [xmin, ymax, xmax, ymin]. */\n bbox: [number, number, number, number];\n /** Offscreen container size in CSS pixels. Becomes SVG intrinsic size. */\n dims: { width: number; height: number };\n axis?: boolean;\n grid?: boolean;\n keepAspectRatio?: boolean;\n /** Mutate JXG.Options before initBoard (e.g. text.display='internal', palette). */\n applyOptions?: (JXG: JxgModule) => void;\n /**\n * Build the scene on the board. Return a disposable (typically the\n * `JxgRenderer` or `JxgRenderer3D` instance) — its `dispose()` is invoked\n * during teardown before `freeBoard`.\n */\n setup: (board: unknown, JXG: JxgModule) => { dispose: () => void } | Promise<{ dispose: () => void }>;\n /** Optional mutation on the cloned <svg> before serialization. */\n postProcessSvg?: (clone: SVGElement) => void;\n}\n\nexport interface JxgOffscreenRenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nexport async function renderJsxgOffscreen(\n opts: JxgOffscreenRenderOpts,\n): Promise<JxgOffscreenRenderResult> {\n const { bbox, dims, axis = false, grid = false, keepAspectRatio = true } = opts;\n const JXG: JxgModule = (await import('jsxgraph')).default;\n\n if (opts.applyOptions) {\n try {\n opts.applyOptions(JXG);\n } catch {\n /* swallow option-apply errors */\n }\n }\n\n const containerId =\n 'jxg_offscreen_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\n const container = document.createElement('div');\n container.id = containerId;\n container.style.cssText =\n `position:absolute;top:-99999px;left:-99999px;` +\n `width:${dims.width}px;height:${dims.height}px;` +\n `visibility:hidden;pointer-events:none;`;\n document.body.appendChild(container);\n\n let board: unknown = null;\n let disposable: { dispose: () => void } | null = null;\n try {\n board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: bbox,\n axis,\n grid,\n keepAspectRatio,\n showCopyright: false,\n showNavigation: false,\n });\n disposable = await opts.setup(board, JXG);\n try {\n \n (board as any)?.update?.();\n } catch {\n /* ignore — board may already be in valid state */\n }\n\n const svgEl = container.querySelector('svg');\n if (!svgEl) throw new Error('renderJsxgOffscreen: no SVG produced by JSXGraph');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n if (opts.postProcessSvg) opts.postProcessSvg(clone);\n const svgString = new XMLSerializer().serializeToString(clone);\n return { svgString, width: dims.width, height: dims.height };\n } finally {\n try {\n disposable?.dispose();\n } catch {\n /* ignore */\n }\n try {\n if (board) JXG.JSXGraph.freeBoard(board);\n } catch {\n /* ignore */\n }\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","\"use client\";\n\nimport { deserializeBoard3D } from './serialize';\nimport { createStore } from '../../core/scene';\nimport { DEFAULT_VIEW_3D, type View3D } from '../../core/scene/types';\nimport { JxgRenderer3D } from '../../core/scene/render/JxgRenderer3D';\nimport { GROUND_PLANE_ATTRS, GROUND_PLANE_RANGE, VIEW3D_ATTRS } from './editor/theme';\nimport { renderJsxgOffscreen } from '../shared/jxgOffscreenRender';\n\nexport interface RenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nconst OUTPUT_WIDTH = 1024;\nconst OUTPUT_HEIGHT = 768;\nconst BBOX_2D: [number, number, number, number] = [-6, 6, 6, -6];\n\n \ntype JxgObj = any;\n\nexport async function renderGeometry3DSvgFromState(jsonState: string): Promise<RenderResult> {\n const state = deserializeBoard3D(jsonState);\n const view3DInfo: View3D = state.meta.domain === '3d' ? state.meta.view : DEFAULT_VIEW_3D;\n\n const { svgString } = await renderJsxgOffscreen({\n bbox: BBOX_2D,\n dims: { width: OUTPUT_WIDTH, height: OUTPUT_HEIGHT },\n axis: false,\n grid: false,\n keepAspectRatio: true,\n applyOptions: (JXG) => {\n JXG.Options.text.display = 'internal';\n },\n setup: (board) => {\n const baseAttrs = VIEW3D_ATTRS(false);\n const view: JxgObj = (board as { create: (k: string, p: unknown[], a: unknown) => JxgObj }).create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [view3DInfo.bbox3D[0], view3DInfo.bbox3D[3]],\n [view3DInfo.bbox3D[1], view3DInfo.bbox3D[4]],\n [view3DInfo.bbox3D[2], view3DInfo.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n az: { ...baseAttrs.az, slider: { ...baseAttrs.az.slider, start: view3DInfo.azimuth } },\n el: { ...baseAttrs.el, slider: { ...baseAttrs.el.slider, start: view3DInfo.elevation } },\n },\n );\n\n try {\n \n const v = view as any;\n v?.az_slide?.setValue?.(view3DInfo.azimuth);\n v?.el_slide?.setValue?.(view3DInfo.elevation);\n v?.board?.update?.();\n } catch {\n /* older JSXGraph may not expose az_slide on view3d */\n }\n\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => JxgObj }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(false),\n );\n } catch {\n /* swallow */\n }\n\n const store = createStore(state);\n const renderer = new JxgRenderer3D(store, view);\n\n try {\n \n (view as any)?.board?.update?.();\n } catch {\n /* swallow */\n }\n\n return renderer;\n },\n postProcessSvg: (clone) => {\n clone.setAttribute('width', String(OUTPUT_WIDTH));\n clone.setAttribute('height', String(OUTPUT_HEIGHT));\n },\n });\n\n return { svgString, width: OUTPUT_WIDTH, height: OUTPUT_HEIGHT };\n}\n","// SVG inline base64 helper dùng chung cho 3 stamp (geometry-2d, geometry-3d,\n// graph-2d):\n//\n// - `svgToStampFile(svg, fileId)` — sync, dùng cho `restoreFileFromCustomData`\n// khi caller đã có fileId từ element.\n// - `createStampFile(svg)` — async, dùng cho insert path khi cần generate\n// fileId mới từ hash SVG content.\n//\n// Output luôn là SVG inline base64 — Excalidraw render native + tự đảo màu\n// trong dark mode qua CSS filter. KHÔNG raster sang PNG.\n\nconst DEFAULT_WIDTH = 200;\nconst DEFAULT_HEIGHT = 100;\n\nexport interface StampFileResult {\n fileId: string;\n dataURL: string;\n mimeType: 'image/svg+xml';\n width: number;\n height: number;\n}\n\nasync function hashSvgToFileId(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest))\n .slice(0, 16)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars. Fallback Node/jsdom.\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (\n (h1 >>> 0).toString(16).padStart(8, '0') +\n (h2 >>> 0).toString(16).padStart(8, '0')\n );\n}\n\nfunction parseDim(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) {\n return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n }\n return attr === 'width' ? DEFAULT_WIDTH : DEFAULT_HEIGHT;\n}\n\nexport function parseSvgDims(svg: string): { width: number; height: number } {\n return { width: parseDim(svg, 'width'), height: parseDim(svg, 'height') };\n}\n\nexport function svgToStampFile(svgString: string, fileId: string): StampFileResult {\n const { width, height } = parseSvgDims(svgString);\n const utf8 = unescape(encodeURIComponent(svgString));\n const base64 = typeof btoa !== 'undefined'\n ? btoa(utf8)\n : Buffer.from(utf8, 'binary').toString('base64');\n return {\n fileId,\n dataURL: `data:image/svg+xml;base64,${base64}`,\n mimeType: 'image/svg+xml',\n width,\n height,\n };\n}\n\n// Async variant cho insert path: hash SVG → fileId rồi gọi svgToStampFile.\n// Identical SVG content → identical fileId (Excalidraw addFiles dedupe).\nexport async function createStampFile(svgString: string): Promise<StampFileResult> {\n const fileId = await hashSvgToFileId(svgString);\n return svgToStampFile(svgString, fileId);\n}\n","import type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport type { Constraint3D } from '../../../../../core/scene/kinds/3d-constraint';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\nimport type { SceneHit } from '../../hitTest/hitTest';\n\nexport function hitToConstraint(hit: SceneHit): Constraint3D | null {\n switch (hit.kind) {\n case 'onGround': return { kind: 'onGround', x: hit.world[0], y: hit.world[1] };\n case 'onAxis': return { kind: 'onAxis', axis: hit.axis, t: hit.t };\n case 'onPlane': return { kind: 'onPlane', planeId: hit.planeId, u: hit.u, v: hit.v };\n case 'onLine': return { kind: 'onLine', lineId: hit.lineId, t: hit.t };\n case 'onPolygon': return { kind: 'onPolygon', polygonId: hit.polygonId, u: hit.u, v: hit.v };\n case 'onSphere': return { kind: 'onSphere', sphereId: hit.sphereId, theta: hit.theta, phi: hit.phi };\n default: return null;\n }\n}\n\n/**\n * Sinh id `p{counter + offset}` cho point mới — đồng nhất tiền tố cũ của Scene3D\n * và không đụng id đã tồn tại trong state hiện tại.\n */\nexport function makePointId(store: Store, offset = 1): string {\n return `p${store.getState().counter + offset}`;\n}\n\n/**\n * Build SceneObject cho point3d (chưa dispatch). Caller sẽ dispatch ADD hoặc\n * gom trong transaction.\n */\nexport function buildPointObject(\n store: Store,\n constraint: Constraint3D,\n options: { idOffset?: number; label?: string; color?: string } = {},\n): SceneObject<Point3DAttrs> {\n const id = makePointId(store, options.idOffset ?? 1);\n const state = store.getState();\n const label = options.label ?? nextLabel(state, 'point3d');\n return {\n id,\n kind: 'point3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { constraint, ...(options.color ? { color: options.color } : {}) },\n };\n}\n\n/**\n * Tương đương `scene.addPoint(constraint)` cũ: dispatch ADD point ngay và trả\n * về id của point vừa tạo.\n */\nexport function addPoint(store: Store, constraint: Constraint3D, color?: string): string {\n const obj = buildPointObject(store, constraint, color ? { color } : {});\n store.dispatch({ type: 'ADD', payload: { obj } });\n return obj.id;\n}\n\n/**\n * Given a SceneHit, return the id of an existing point (if hit is existingPoint),\n * or create a new constrained point on the hit surface and return its id.\n * Returns null for `empty` hits.\n */\nexport function ensurePoint(hit: SceneHit, store: Store): string | null {\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return addPoint(store, c);\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store } from '../../../../../core/scene';\nimport { hitToConstraint, addPoint } from './_ensurePoint';\n\nexport function buildPoint(args: CollectedArg[], store: Store): string | null {\n const hit = args[0]?.hit;\n if (!hit) return null;\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return addPoint(store, c);\n}\n\nexport const buildPointOnObject = buildPoint; // identical semantics; step.allowNewOn is the only difference\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nfunction makeDerivedId(store: Store, prefix: string): string {\n return `${prefix}${store.getState().counter + 1}`;\n}\n\nfunction addDerived(\n store: Store,\n kind: string,\n prefix: string,\n attrs: Record<string, unknown>,\n): string {\n const id = makeDerivedId(store, prefix);\n const label = nextLabel(store.getState(), kind);\n const obj: SceneObject = {\n id,\n kind,\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs,\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n\nexport function buildSegment(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, store);\n const p2 = ensurePoint(args[1].hit, store);\n if (!p1 || !p2 || p1 === p2) return null;\n return addDerived(store, 'segment3d', 's', { p1, p2 });\n}\n\nexport function buildLine(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, store);\n const p2 = ensurePoint(args[1].hit, store);\n if (!p1 || !p2 || p1 === p2) return null;\n return addDerived(store, 'line3d', 'l', { p1, p2 });\n}\n\nexport function buildRay(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const origin = ensurePoint(args[0].hit, store);\n const through = ensurePoint(args[1].hit, store);\n if (!origin || !through || origin === through) return null;\n return addDerived(store, 'ray3d', 'r', { origin, through });\n}\n\nexport function buildVector(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const from = ensurePoint(args[0].hit, store);\n const to = ensurePoint(args[1].hit, store);\n if (!from || !to || from === to) return null;\n return addDerived(store, 'vector3d', 'v', { from, to });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildPolygon(args: CollectedArg[], store: Store): string | null {\n // Drop the final closingPoint arg, keep all 'point'-step hits as vertices.\n const vertexArgs = args.filter((a) => a.step.type === 'point');\n const vertexIds = vertexArgs\n .map((a) => (a.hit ? ensurePoint(a.hit, store) : null))\n .filter((x): x is string => !!x);\n if (vertexIds.length < 3) return null;\n\n const id = `pg${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polygon3d');\n const obj: SceneObject = {\n id,\n kind: 'polygon3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { vertices: vertexIds },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","// Pure constraint math — không phụ thuộc Scene3D nữa, nhận State của core/scene.\nimport type { State, SceneObject } from '../../../../core/scene';\nimport type { Constraint3D } from '../../../../core/scene/kinds/3d-constraint';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport type { Segment3DAttrs } from '../../../../core/scene/kinds/segment3d';\nimport type { Line3DAttrs } from '../../../../core/scene/kinds/line3d';\nimport type { Ray3DAttrs } from '../../../../core/scene/kinds/ray3d';\nimport type { Vector3DAttrs } from '../../../../core/scene/kinds/vector3d';\nimport type { Plane3DAttrs } from '../../../../core/scene/kinds/plane3d';\nimport type { Polygon3DAttrs } from '../../../../core/scene/kinds/polygon3d';\nimport type { Sphere3DAttrs } from '../../../../core/scene/kinds/sphere3d';\n\nexport type Vec3 = [number, number, number];\n\nfunction sub(a: Vec3, b: Vec3): Vec3 { return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]; }\nfunction add(a: Vec3, b: Vec3): Vec3 { return [a[0] + b[0], a[1] + b[1], a[2] + b[2]]; }\nfunction scale(a: Vec3, k: number): Vec3 { return [a[0] * k, a[1] * k, a[2] * k]; }\nfunction dot(a: Vec3, b: Vec3): number { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; }\nfunction cross(a: Vec3, b: Vec3): Vec3 {\n return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n}\nfunction norm(a: Vec3): number { return Math.sqrt(dot(a, a)); }\nfunction normalize(a: Vec3): Vec3 { const n = norm(a); return n === 0 ? a : scale(a, 1 / n); }\n\nfunction getPointWorld(id: string, state: State): Vec3 {\n const obj = state.objects[id];\n if (!obj || obj.kind !== 'point3d') {\n throw new Error(`constraintMath: point ${id} not found`);\n }\n const attrs = obj.attrs as Point3DAttrs;\n return constraintToWorld(attrs.constraint, state);\n}\n\nfunction getPlaneBasis(\n planeObj: SceneObject<Plane3DAttrs>,\n state: State,\n): { origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3 } {\n const p1 = getPointWorld(planeObj.attrs.p1, state);\n const p2 = getPointWorld(planeObj.attrs.p2, state);\n const p3 = getPointWorld(planeObj.attrs.p3, state);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n return { origin: p1, basis1, basis2, normal };\n}\n\nexport function constraintToWorld(c: Constraint3D, state: State): Vec3 {\n switch (c.kind) {\n case 'free': return [c.x, c.y, c.z];\n case 'onGround': return [c.x, c.y, 0];\n case 'onAxis': {\n if (c.axis === 'x') return [c.t, 0, 0];\n if (c.axis === 'y') return [0, c.t, 0];\n return [0, 0, c.t];\n }\n case 'onPlane': {\n const plane = state.objects[c.planeId];\n if (!plane || plane.kind !== 'plane3d') throw new Error('onPlane: plane missing');\n const { origin, basis1, basis2 } = getPlaneBasis(plane as SceneObject<Plane3DAttrs>, state);\n return add(add(origin, scale(basis1, c.u)), scale(basis2, c.v));\n }\n case 'onLine': {\n const line = state.objects[c.lineId];\n if (!line) throw new Error('onLine: parent missing');\n let p1Id: string;\n let p2Id: string;\n if (line.kind === 'line3d' || line.kind === 'segment3d') {\n const a = line.attrs as Segment3DAttrs | Line3DAttrs;\n p1Id = a.p1; p2Id = a.p2;\n } else if (line.kind === 'ray3d') {\n const a = line.attrs as Ray3DAttrs;\n p1Id = a.origin; p2Id = a.through;\n } else if (line.kind === 'vector3d') {\n const a = line.attrs as Vector3DAttrs;\n p1Id = a.from; p2Id = a.to;\n } else {\n throw new Error('onLine: parent kind not supported');\n }\n const p1 = getPointWorld(p1Id, state);\n const p2 = getPointWorld(p2Id, state);\n const dir = sub(p2, p1);\n return add(p1, scale(dir, c.t));\n }\n case 'onPolygon': {\n const pg = state.objects[c.polygonId];\n if (!pg || pg.kind !== 'polygon3d') throw new Error('onPolygon: parent missing');\n const v = (pg.attrs as Polygon3DAttrs).vertices;\n if (v.length < 3) throw new Error('onPolygon: < 3 vertices');\n const p1 = getPointWorld(v[0], state);\n const p2 = getPointWorld(v[1], state);\n const p3 = getPointWorld(v[2], state);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n return add(add(p1, scale(basis1, c.u)), scale(basis2, c.v));\n }\n case 'onSphere': {\n const sph = state.objects[c.sphereId];\n if (!sph || sph.kind !== 'sphere3d') throw new Error('onSphere: parent missing');\n const a = sph.attrs as Sphere3DAttrs;\n const center = getPointWorld(a.center, state);\n const surface = getPointWorld(a.surfacePoint, state);\n const radius = norm(sub(surface, center));\n const x = center[0] + radius * Math.sin(c.phi) * Math.cos(c.theta);\n const y = center[1] + radius * Math.sin(c.phi) * Math.sin(c.theta);\n const z = center[2] + radius * Math.cos(c.phi);\n return [x, y, z];\n }\n }\n}\n\nexport function worldToConstraint(current: Constraint3D, world: Vec3, state: State): Constraint3D {\n switch (current.kind) {\n case 'free': return { kind: 'free', x: world[0], y: world[1], z: world[2] };\n case 'onGround': return { kind: 'onGround', x: world[0], y: world[1] };\n case 'onAxis': {\n const t = current.axis === 'x' ? world[0] : current.axis === 'y' ? world[1] : world[2];\n return { kind: 'onAxis', axis: current.axis, t };\n }\n case 'onPlane': {\n const plane = state.objects[current.planeId];\n if (!plane || plane.kind !== 'plane3d') return current;\n const { origin, basis1, basis2 } = getPlaneBasis(plane as SceneObject<Plane3DAttrs>, state);\n const rel = sub(world, origin);\n const b1n = dot(basis1, basis1);\n const b2n = dot(basis2, basis2);\n const u = b1n === 0 ? 0 : dot(rel, basis1) / b1n;\n const v = b2n === 0 ? 0 : dot(rel, basis2) / b2n;\n return { kind: 'onPlane', planeId: current.planeId, u, v };\n }\n case 'onLine': {\n const line = state.objects[current.lineId];\n if (!line) return current;\n let p1Id: string;\n let p2Id: string;\n if (line.kind === 'line3d' || line.kind === 'segment3d') {\n const a = line.attrs as Segment3DAttrs | Line3DAttrs;\n p1Id = a.p1; p2Id = a.p2;\n } else if (line.kind === 'ray3d') {\n const a = line.attrs as Ray3DAttrs;\n p1Id = a.origin; p2Id = a.through;\n } else if (line.kind === 'vector3d') {\n const a = line.attrs as Vector3DAttrs;\n p1Id = a.from; p2Id = a.to;\n } else {\n return current;\n }\n const p1 = getPointWorld(p1Id, state);\n const p2 = getPointWorld(p2Id, state);\n const dir = sub(p2, p1);\n const len2 = dot(dir, dir);\n const t = len2 === 0 ? 0 : dot(sub(world, p1), dir) / len2;\n return { kind: 'onLine', lineId: current.lineId, t };\n }\n case 'onPolygon': {\n const pg = state.objects[current.polygonId];\n if (!pg || pg.kind !== 'polygon3d') return current;\n const vertices = (pg.attrs as Polygon3DAttrs).vertices;\n if (vertices.length < 3) return current;\n const p1 = getPointWorld(vertices[0], state);\n const p2 = getPointWorld(vertices[1], state);\n const p3 = getPointWorld(vertices[2], state);\n const basis1 = sub(p2, p1);\n const tmp = sub(p3, p1);\n const normal = normalize(cross(basis1, tmp));\n const basis2 = cross(normal, basis1);\n const rel = sub(world, p1);\n const b1n = dot(basis1, basis1);\n const b2n = dot(basis2, basis2);\n const u = b1n === 0 ? 0 : dot(rel, basis1) / b1n;\n const v = b2n === 0 ? 0 : dot(rel, basis2) / b2n;\n return { kind: 'onPolygon', polygonId: current.polygonId, u, v };\n }\n case 'onSphere': {\n const sph = state.objects[current.sphereId];\n if (!sph || sph.kind !== 'sphere3d') return current;\n const center = getPointWorld((sph.attrs as Sphere3DAttrs).center, state);\n const rel = sub(world, center);\n const r = norm(rel);\n if (r === 0) return current;\n const phi = Math.acos(rel[2] / r);\n const theta = Math.atan2(rel[1], rel[0]);\n return { kind: 'onSphere', sphereId: current.sphereId, theta, phi };\n }\n }\n}\n","import type { State } from '../../../../core/scene';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport { constraintToWorld, type Vec3 } from './constraintMath';\n\nconst EPS = 1e-6;\n\nfunction getWorld(id: string, state: State): Vec3 | null {\n const obj = state.objects[id];\n if (!obj || obj.kind !== 'point3d') return null;\n const attrs = obj.attrs as Point3DAttrs;\n return constraintToWorld(attrs.constraint, state);\n}\n\nexport function areCollinear3(p1Id: string, p2Id: string, p3Id: string, state: State): boolean {\n const p1 = getWorld(p1Id, state);\n const p2 = getWorld(p2Id, state);\n const p3 = getWorld(p3Id, state);\n if (!p1 || !p2 || !p3) return true;\n const a: Vec3 = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]];\n const b: Vec3 = [p3[0] - p1[0], p3[1] - p1[1], p3[2] - p1[2]];\n const c: Vec3 = [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n return Math.hypot(c[0], c[1], c[2]) < EPS;\n}\n\nexport function apexCoplanarWithBase(baseIds: string[], apexId: string, state: State): boolean {\n if (baseIds.length < 3) return false;\n const p1 = getWorld(baseIds[0], state);\n const p2 = getWorld(baseIds[1], state);\n const p3 = getWorld(baseIds[2], state);\n const apex = getWorld(apexId, state);\n if (!p1 || !p2 || !p3 || !apex) return false;\n const a: Vec3 = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]];\n const b: Vec3 = [p3[0] - p1[0], p3[1] - p1[1], p3[2] - p1[2]];\n const n: Vec3 = [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n const d: Vec3 = [apex[0] - p1[0], apex[1] - p1[1], apex[2] - p1[2]];\n const dotND = n[0] * d[0] + n[1] * d[1] + n[2] * d[2];\n return Math.abs(dotND) < EPS;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\nimport { areCollinear3 } from '../../scene/geometryChecks';\n\nexport function buildPlane(args: CollectedArg[], store: Store): string | null {\n if (args.length < 3 || !args[0].hit || !args[1].hit || !args[2].hit) return null;\n const p1 = ensurePoint(args[0].hit, store);\n const p2 = ensurePoint(args[1].hit, store);\n const p3 = ensurePoint(args[2].hit, store);\n if (!p1 || !p2 || !p3) return null;\n if (p1 === p2 || p2 === p3 || p1 === p3) return null;\n if (areCollinear3(p1, p2, p3, store.getState())) return null;\n const id = `pl${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'plane3d');\n const obj: SceneObject = {\n id,\n kind: 'plane3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { p1, p2, p3 },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\nimport { apexCoplanarWithBase } from '../../scene/geometryChecks';\n\nexport function buildPyramid(args: CollectedArg[], store: Store): string | null {\n const pointArgs = args.filter((a) => a.step.type === 'point');\n const baseArgs = pointArgs.slice(0, -1); // last 'point' arg is the apex\n const apexArg = pointArgs.slice(-1)[0];\n if (baseArgs.length < 3 || !apexArg?.hit) return null;\n const baseIds = baseArgs\n .map((a) => (a.hit ? ensurePoint(a.hit, store) : null))\n .filter((x): x is string => !!x);\n const apexId = ensurePoint(apexArg.hit, store);\n if (!apexId || baseIds.length < 3) return null;\n if (apexCoplanarWithBase(baseIds, apexId, store.getState())) return null;\n const vertices = [...baseIds, apexId];\n const apexIdx = vertices.length - 1;\n const faces: number[][] = [baseIds.map((_, i) => i)];\n for (let i = 0; i < baseIds.length; i++) {\n faces.push([i, (i + 1) % baseIds.length, apexIdx]);\n }\n const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'pyramid', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint, addPoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\n\nexport function buildPrism(args: CollectedArg[], store: Store): string | null {\n const baseArgs = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (baseArgs.length < 3 || !numberArg || typeof numberArg.value !== 'number') return null;\n const height = numberArg.value;\n if (height <= 0) return null;\n const baseIds = baseArgs\n .map((a) => (a.hit ? ensurePoint(a.hit, store) : null))\n .filter((x): x is string => !!x);\n if (baseIds.length < 3) return null;\n const topIds: string[] = [];\n for (const id of baseIds) {\n const state = store.getState();\n const p = state.objects[id];\n if (!p || p.kind !== 'point3d') return null;\n const attrs = p.attrs as Point3DAttrs;\n const w = constraintToWorld(attrs.constraint, state);\n topIds.push(addPoint(store, { kind: 'free', x: w[0], y: w[1], z: w[2] + height }));\n }\n const n = baseIds.length;\n const vertices = [...baseIds, ...topIds];\n const faces: number[][] = [\n baseIds.map((_, i) => i),\n topIds.map((_, i) => n + i),\n ];\n for (let i = 0; i < n; i++) {\n faces.push([i, (i + 1) % n, n + ((i + 1) % n), n + i]);\n }\n const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'prism', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint, addPoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\n\nexport function buildTetrahedron(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, store);\n const p2Id = ensurePoint(args[1].hit, store);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const state0 = store.getState();\n const p1Obj = state0.objects[p1Id];\n const p2Obj = state0.objects[p2Id];\n if (!p1Obj || p1Obj.kind !== 'point3d' || !p2Obj || p2Obj.kind !== 'point3d') return null;\n const p1 = constraintToWorld((p1Obj.attrs as Point3DAttrs).constraint, state0);\n const p2 = constraintToWorld((p2Obj.attrs as Point3DAttrs).constraint, state0);\n // Force base plane to z = min(p1.z, p2.z); project both points there.\n const z0 = Math.min(p1[2], p2[2]);\n const baseA: [number, number, number] = [p1[0], p1[1], z0];\n const baseB: [number, number, number] = [p2[0], p2[1], z0];\n const dx = baseB[0] - baseA[0];\n const dy = baseB[1] - baseA[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Third base vertex: rotate (baseB - baseA) by 60° in xy and add to baseA midpoint\n const mid: [number, number, number] = [(baseA[0] + baseB[0]) / 2, (baseA[1] + baseB[1]) / 2, z0];\n const perpX = -dy;\n const perpY = dx;\n const perpLen = Math.hypot(perpX, perpY);\n const height = edge * Math.sqrt(3) / 2;\n const baseC: [number, number, number] = [mid[0] + (perpX / perpLen) * height, mid[1] + (perpY / perpLen) * height, z0];\n // Apex: centroid + edge*sqrt(2/3)\n const centroid: [number, number, number] = [\n (baseA[0] + baseB[0] + baseC[0]) / 3,\n (baseA[1] + baseB[1] + baseC[1]) / 3,\n z0,\n ];\n const apexHeight = edge * Math.sqrt(2 / 3);\n const apex: [number, number, number] = [centroid[0], centroid[1], z0 + apexHeight];\n\n const cId = addPoint(store, { kind: 'free', x: baseC[0], y: baseC[1], z: baseC[2] });\n const apexId = addPoint(store, { kind: 'free', x: apex[0], y: apex[1], z: apex[2] });\n\n const vertices = [p1Id, p2Id, cId, apexId];\n const faces: number[][] = [\n [0, 1, 2], // base\n [0, 1, 3], // face p1-p2-apex\n [1, 2, 3], // face p2-c-apex\n [2, 0, 3], // face c-p1-apex\n ];\n const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'tetrahedron', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint, addPoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\n\nexport function buildCube(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, store);\n const p2Id = ensurePoint(args[1].hit, store);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const state0 = store.getState();\n const p1Obj = state0.objects[p1Id];\n const p2Obj = state0.objects[p2Id];\n if (!p1Obj || p1Obj.kind !== 'point3d' || !p2Obj || p2Obj.kind !== 'point3d') return null;\n const p1 = constraintToWorld((p1Obj.attrs as Point3DAttrs).constraint, state0);\n const p2 = constraintToWorld((p2Obj.attrs as Point3DAttrs).constraint, state0);\n // Require both on the ground (z = 0); reject otherwise\n if (Math.abs(p1[2]) > 1e-6 || Math.abs(p2[2]) > 1e-6) return null;\n const dx = p2[0] - p1[0];\n const dy = p2[1] - p1[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Bottom face: p1, p2, p3 = p2 + perp, p4 = p1 + perp where perp = rotate (p2-p1) by +90°\n const perpX = -dy;\n const perpY = dx;\n const p3: [number, number, number] = [p2[0] + perpX, p2[1] + perpY, 0];\n const p4: [number, number, number] = [p1[0] + perpX, p1[1] + perpY, 0];\n // Top face: same x, y; z = edge\n const t1: [number, number, number] = [p1[0], p1[1], edge];\n const t2: [number, number, number] = [p2[0], p2[1], edge];\n const t3: [number, number, number] = [p3[0], p3[1], edge];\n const t4: [number, number, number] = [p4[0], p4[1], edge];\n\n const p3Id = addPoint(store, { kind: 'onGround', x: p3[0], y: p3[1] });\n const p4Id = addPoint(store, { kind: 'onGround', x: p4[0], y: p4[1] });\n const t1Id = addPoint(store, { kind: 'free', x: t1[0], y: t1[1], z: t1[2] });\n const t2Id = addPoint(store, { kind: 'free', x: t2[0], y: t2[1], z: t2[2] });\n const t3Id = addPoint(store, { kind: 'free', x: t3[0], y: t3[1], z: t3[2] });\n const t4Id = addPoint(store, { kind: 'free', x: t4[0], y: t4[1], z: t4[2] });\n\n const vertices = [p1Id, p2Id, p3Id, p4Id, t1Id, t2Id, t3Id, t4Id];\n // Faces by index in vertices:\n const faces: number[][] = [\n [0, 1, 2, 3], // bottom\n [4, 5, 6, 7], // top\n [0, 1, 5, 4], // front\n [1, 2, 6, 5], // right\n [2, 3, 7, 6], // back\n [3, 0, 4, 7], // left\n ];\n const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'cube', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildSphere(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const center = ensurePoint(args[0].hit, store);\n const surface = ensurePoint(args[1].hit, store);\n if (!center || !surface || center === surface) return null;\n const id = `sp${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'sphere3d');\n const obj: SceneObject = {\n id,\n kind: 'sphere3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { center, surfacePoint: surface },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCylinder(args: CollectedArg[], store: Store): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, store);\n const topCenter = ensurePoint(points[1].hit, store);\n if (!baseCenter || !topCenter || baseCenter === topCenter) return null;\n const id = `cy${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'cylinder3d');\n const obj: SceneObject = {\n id,\n kind: 'cylinder3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { baseCenter, topCenter, radius },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCone(args: CollectedArg[], store: Store): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, store);\n const apex = ensurePoint(points[1].hit, store);\n if (!baseCenter || !apex || baseCenter === apex) return null;\n const id = `co${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'cone3d');\n const obj: SceneObject = {\n id,\n kind: 'cone3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { baseCenter, apex, radius },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { Store } from '../../../../core/scene';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport { buildPoint, buildPointOnObject } from './handlers/point';\nimport { buildSegment, buildLine, buildRay, buildVector } from './handlers/segment';\nimport { buildPolygon } from './handlers/polygon';\nimport { buildPlane } from './handlers/plane';\nimport { buildPyramid } from './handlers/pyramid';\nimport { buildPrism } from './handlers/prism';\nimport { buildTetrahedron } from './handlers/tetrahedron';\nimport { buildCube } from './handlers/cube';\nimport { buildSphere } from './handlers/sphere';\nimport { buildCylinder } from './handlers/cylinder';\nimport { buildCone } from './handlers/cone';\n\nexport type ToolKey =\n | 'move' | 'point' | 'pointOnObject'\n | 'segment' | 'line' | 'ray' | 'vector' | 'polygon'\n | 'plane' | 'pyramid' | 'prism' | 'tetrahedron' | 'cube'\n | 'sphere' | 'cylinder' | 'cone';\n\nexport type ToolStep =\n | {\n type: 'point';\n allowExisting: boolean;\n allowNewOn: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'>;\n hint: string;\n }\n | { type: 'closingPoint'; hint: string }\n | { type: 'object'; kinds: Array<'plane' | 'polygon' | 'line' | 'sphere' | 'polyhedron'>; hint: string }\n | { type: 'number'; prompt: string; min?: number; max?: number };\n\nexport interface CollectedArg {\n step: ToolStep;\n hit?: SceneHit;\n value?: number;\n}\n\nexport interface ToolSpec {\n key: ToolKey;\n label: string;\n hintIdle: string;\n steps: ToolStep[];\n build(args: CollectedArg[], store: Store): string | null;\n /**\n * If true, after build completes the controller re-enters step 0 of this\n * tool (clearing collected args) instead of switching to 'move'. Used by\n * the Point tool so the user can place several points in a row.\n */\n repeatAfterBuild?: boolean;\n}\n\nconst stubBuild = (): string | null => null;\n\nconst ALL_SURFACES: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane', 'line', 'polygon', 'sphere'];\n\nconst OBJECT_ONLY: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['plane', 'line', 'polygon', 'sphere'];\n\nconst NO_SURFACE: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane'];\n\nexport const TOOLS: ToolSpec[] = [\n {\n key: 'move',\n label: 'Di chuyển',\n hintIdle: 'Kéo điểm hoặc xoay khung',\n steps: [],\n build: stubBuild,\n },\n {\n key: 'point',\n label: 'Điểm',\n hintIdle: 'Click trên mặt phẳng Oxy hoặc trên trục để đặt điểm',\n steps: [\n {\n type: 'point',\n allowExisting: false,\n // GeoGebra-style: a new point must lie on the XY ground plane or on\n // one of the coordinate axes (Oz lets you place points off the plane).\n allowNewOn: ['ground', 'axis'],\n hint: 'Click trên mặt phẳng Oxy hoặc trục Ox/Oy/Oz',\n },\n ],\n build: buildPoint,\n repeatAfterBuild: true,\n },\n {\n key: 'pointOnObject',\n label: 'Điểm trên đối tượng',\n hintIdle: 'Chọn một đối tượng để đặt điểm',\n steps: [{ type: 'point', allowExisting: false, allowNewOn: OBJECT_ONLY, hint: 'Click lên mặt / đường để đặt điểm' }],\n build: buildPointOnObject,\n },\n {\n key: 'segment',\n label: 'Đoạn thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đoạn thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildSegment,\n },\n {\n key: 'line',\n label: 'Đường thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đường thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildLine,\n },\n {\n key: 'ray',\n label: 'Tia',\n hintIdle: 'Chọn điểm gốc rồi điểm trên tia',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm gốc' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên tia' },\n ],\n build: buildRay,\n },\n {\n key: 'vector',\n label: 'Vector',\n hintIdle: 'Chọn 2 điểm để vẽ vector',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm đầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm cuối' },\n ],\n build: buildVector,\n },\n {\n key: 'polygon',\n label: 'Đa giác',\n hintIdle: 'Chọn các đỉnh; click điểm đầu để đóng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 1' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 3' },\n { type: 'closingPoint', hint: 'Click điểm đầu để đóng (hoặc chọn thêm đỉnh)' },\n ],\n build: buildPolygon,\n },\n {\n key: 'plane',\n label: 'Mặt phẳng (3 điểm)',\n hintIdle: 'Chọn 3 điểm để xác định mặt phẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 1 của mặt phẳng' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 3' },\n ],\n build: buildPlane,\n },\n {\n key: 'pyramid',\n label: 'Hình chóp',\n hintIdle: 'Chọn đáy đa giác rồi chọn đỉnh chóp',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đáy đầu tiên để đóng (hoặc chọn thêm đỉnh)' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh chóp' },\n ],\n build: buildPyramid,\n },\n {\n key: 'prism',\n label: 'Lăng trụ',\n hintIdle: 'Chọn đáy đa giác rồi nhập chiều cao',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đầu để đóng đáy' },\n { type: 'number', prompt: 'Chiều cao (theo trục z)', min: 0.0001 },\n ],\n build: buildPrism,\n },\n {\n key: 'tetrahedron',\n label: 'Tứ diện đều',\n hintIdle: 'Chọn 2 điểm xác định cạnh của tứ diện',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 2' },\n ],\n build: buildTetrahedron,\n },\n {\n key: 'cube',\n label: 'Lập phương',\n hintIdle: 'Chọn 2 điểm trên nền xác định cạnh',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 1 (trên nền)' },\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 2 (trên nền)' },\n ],\n build: buildCube,\n },\n {\n key: 'sphere',\n label: 'Mặt cầu',\n hintIdle: 'Chọn tâm rồi điểm trên mặt cầu',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm mặt cầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên mặt cầu' },\n ],\n build: buildSphere,\n },\n {\n key: 'cylinder',\n label: 'Hình trụ',\n hintIdle: 'Chọn tâm đáy, tâm trên, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm trên' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCylinder,\n },\n {\n key: 'cone',\n label: 'Hình nón',\n hintIdle: 'Chọn tâm đáy, đỉnh, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCone,\n },\n];\n\nexport const TOOL_GROUPS: Record<string, ToolKey[]> = {\n 'Cơ bản': ['move', 'point', 'segment', 'line', 'plane'],\n 'Điểm': ['point', 'pointOnObject'],\n 'Đường thẳng': ['segment', 'line', 'ray', 'vector', 'polygon'],\n 'Mặt phẳng': ['plane'],\n 'Khối đa diện': ['pyramid', 'prism', 'tetrahedron', 'cube'],\n 'Khối cong': ['sphere', 'cylinder', 'cone'],\n};\n","import type { Store } from '../../../../core/scene';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport type { ToolKey, ToolStep, ToolSpec, CollectedArg } from './spec';\nimport { TOOLS } from './spec';\n\ninterface ControllerState {\n tool: ToolSpec | null;\n stepIndex: number;\n collected: CollectedArg[];\n hint: string;\n}\n\ntype Listener = (state: ControllerState) => void;\n\nfunction stepHint(step: ToolStep): string {\n return step.type === 'number' ? step.prompt : step.hint;\n}\n\nexport class ToolController {\n private state: ControllerState = { tool: null, stepIndex: 0, collected: [], hint: '' };\n private listeners = new Set<Listener>();\n\n constructor(private store: Store) {\n this.selectTool('move');\n }\n\n getState(): ControllerState { return this.state; }\n\n on(cb: Listener): () => void {\n this.listeners.add(cb);\n return () => {\n this.listeners.delete(cb);\n };\n }\n\n selectTool(key: ToolKey): void {\n const tool = TOOLS.find((t) => t.key === key) ?? TOOLS.find((t) => t.key === 'move')!;\n const firstStep = tool.steps[0];\n this.state = {\n tool,\n stepIndex: 0,\n collected: [],\n hint: firstStep ? stepHint(firstStep) : tool.hintIdle,\n };\n this.notify();\n }\n\n cancel(): void { this.selectTool('move'); }\n\n consumeHit(hit: SceneHit): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step) return false;\n\n // Polygon-like variable-vertex flow: when current step is closingPoint, an\n // existing-point hit matching the first collected vertex finalizes the\n // sub-sequence; any other surface hit appends another vertex (and the\n // controller stays at this stepIndex).\n if (step.type === 'closingPoint') {\n if (hit.kind === 'empty') return false;\n if (hit.kind === 'existingPoint') {\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n // Otherwise append another vertex using the previous 'point' step's allowNewOn\n const prevStep = tool.steps[this.state.stepIndex - 1];\n if (!prevStep || prevStep.type !== 'point') return false;\n if (!this.hitMatchesStep(hit, prevStep)) return false;\n this.state.collected.push({ step: prevStep, hit });\n // stepIndex stays at the closingPoint step\n this.notify();\n return true;\n }\n\n if (!this.hitMatchesStep(hit, step)) return false;\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n consumeNumber(value: number): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step || step.type !== 'number') return false;\n if (step.min != null && value < step.min) return false;\n if (step.max != null && value > step.max) return false;\n this.state.collected.push({ step, value });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n private hitMatchesStep(hit: SceneHit, step: ToolStep): boolean {\n if (step.type !== 'point' && step.type !== 'closingPoint') return false;\n if (hit.kind === 'empty') return false;\n if (step.type === 'closingPoint') return hit.kind === 'existingPoint';\n if (hit.kind === 'existingPoint') return step.allowExisting;\n const surfaceMap: Record<string, 'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> = {\n onGround: 'ground', onAxis: 'axis', onPlane: 'plane',\n onLine: 'line', onPolygon: 'polygon', onSphere: 'sphere',\n };\n const k = surfaceMap[hit.kind];\n return k != null && step.type === 'point' && step.allowNewOn.includes(k);\n }\n\n private advance(): void {\n const tool = this.state.tool!;\n if (this.state.stepIndex >= tool.steps.length) {\n tool.build(this.state.collected, this.store);\n if (tool.repeatAfterBuild) {\n // Stay in this tool so the user can place several items in a row.\n this.state.stepIndex = 0;\n this.state.collected = [];\n this.state.hint = stepHint(tool.steps[0]);\n this.notify();\n } else {\n this.selectTool('move');\n }\n return;\n }\n this.state.hint = stepHint(tool.steps[this.state.stepIndex]);\n this.notify();\n }\n\n private notify(): void {\n for (const cb of this.listeners) cb(this.state);\n }\n}\n","import type { Vec3 } from '../scene/constraintMath';\n\nexport interface View3DLike {\n unprojectScreen?(sx: number, sy: number, depth: number): [number, number, number];\n project3DTo2D?(x: number, y: number, z: number): [number, number, number, number];\n}\n\nexport interface Ray3D {\n origin: Vec3;\n dir: Vec3;\n}\n\nexport function screenToRay(screen: { x: number; y: number }, view: View3DLike): Ray3D {\n // Strategy: unproject the screen point at two depths to get a ray through the scene.\n // Prefer view.unprojectScreen if available (mock); fallback to bisection via project3DTo2D.\n const near = unproject(screen, view, +20);\n const far = unproject(screen, view, -20);\n const dir: Vec3 = [far[0] - near[0], far[1] - near[1], far[2] - near[2]];\n const n = Math.sqrt(dir[0] ** 2 + dir[1] ** 2 + dir[2] ** 2);\n const norm: Vec3 = n === 0 ? [0, 0, -1] : [dir[0] / n, dir[1] / n, dir[2] / n];\n return { origin: near, dir: norm };\n}\n\nfunction unproject(screen: { x: number; y: number }, view: View3DLike, depth: number): Vec3 {\n if (typeof view.unprojectScreen === 'function') {\n const v = view.unprojectScreen(screen.x, screen.y, depth);\n return [v[0], v[1], v[2]];\n }\n // Fallback for real JSXGraph view3d (orthographic-affine projection).\n // Extract the world→screen affine coefficients by sampling project3DTo2D at origin\n // and the three unit-axis points, then solve the 2×2 in (x, y) at the given depth.\n if (typeof view.project3DTo2D === 'function') {\n const p0 = view.project3DTo2D(0, 0, 0);\n const px = view.project3DTo2D(1, 0, 0);\n const py = view.project3DTo2D(0, 1, 0);\n const pz = view.project3DTo2D(0, 0, 1);\n const ox = p0[1], oy = p0[2];\n const a = px[1] - ox, b = py[1] - ox, c = pz[1] - ox;\n const d = px[2] - oy, e = py[2] - oy, f = pz[2] - oy;\n const rhsX = screen.x - ox - c * depth;\n const rhsY = screen.y - oy - f * depth;\n const det = a * e - b * d;\n if (Math.abs(det) < 1e-9) return [0, 0, depth];\n const x = (e * rhsX - b * rhsY) / det;\n const y = (-d * rhsX + a * rhsY) / det;\n return [x, y, depth];\n }\n throw new Error('rayCast: view has neither unprojectScreen nor project3DTo2D');\n}\n","import type { Vec3 } from '../scene/constraintMath';\nimport type { Ray3D } from './rayCast';\n\nconst EPS = 1e-9;\n\nexport interface PlaneHit { point: Vec3; t: number }\nexport interface SphereHit { point: Vec3; t: number }\nexport interface SegmentHit { point: Vec3; t: number; tOnSegment: number }\n\nfunction dot(a: Vec3, b: Vec3): number { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; }\nfunction sub(a: Vec3, b: Vec3): Vec3 { return [a[0]-b[0], a[1]-b[1], a[2]-b[2]]; }\nfunction add(a: Vec3, b: Vec3): Vec3 { return [a[0]+b[0], a[1]+b[1], a[2]+b[2]]; }\nfunction scale(a: Vec3, k: number): Vec3 { return [a[0]*k, a[1]*k, a[2]*k]; }\nfunction norm2(a: Vec3): number { return dot(a, a); }\n\nexport function rayPlane(\n ray: Ray3D,\n plane: { point: Vec3; normal: Vec3 },\n): PlaneHit | null {\n const denom = dot(ray.dir, plane.normal);\n if (Math.abs(denom) < EPS) return null;\n const t = dot(sub(plane.point, ray.origin), plane.normal) / denom;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\nexport function rayGround(ray: Ray3D): PlaneHit | null {\n return rayPlane(ray, { point: [0, 0, 0], normal: [0, 0, 1] });\n}\n\nexport function raySphere(\n ray: Ray3D,\n sphere: { center: Vec3; radius: number },\n): SphereHit | null {\n const oc = sub(ray.origin, sphere.center);\n const b = dot(oc, ray.dir);\n const c = dot(oc, oc) - sphere.radius * sphere.radius;\n const disc = b * b - c;\n if (disc < 0) return null;\n const sqrtD = Math.sqrt(disc);\n const t1 = -b - sqrtD;\n const t2 = -b + sqrtD;\n const t = t1 >= 0 ? t1 : t2;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\n/**\n * Closest approach between ray and line segment. Accepts a distance threshold\n * (in world units; caller scales for pixel ratio).\n */\nexport function rayLineSegment(\n ray: Ray3D,\n seg: { a: Vec3; b: Vec3 },\n maxDistance: number,\n): SegmentHit | null {\n const u = ray.dir;\n const v = sub(seg.b, seg.a);\n const w0 = sub(ray.origin, seg.a);\n const a = dot(u, u);\n const bb = dot(u, v);\n const cc = dot(v, v);\n const d = dot(u, w0);\n const e = dot(v, w0);\n const denom = a * cc - bb * bb;\n if (Math.abs(denom) < EPS) return null;\n const sc = (bb * e - cc * d) / denom;\n const tc = (a * e - bb * d) / denom;\n if (sc < 0 || tc < 0 || tc > 1) return null;\n const pRay = add(ray.origin, scale(u, sc));\n const pSeg = add(seg.a, scale(v, tc));\n const dist2 = norm2(sub(pRay, pSeg));\n if (dist2 > maxDistance * maxDistance) return null;\n return { point: pSeg, t: sc, tOnSegment: tc };\n}\n","import { constraintToWorld } from '../scene/constraintMath';\nimport type { State } from '../../../../core/scene';\nimport { listObjects } from '../../../../core/scene';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport type { View3DLike } from './rayCast';\n\nexport function findSnapPoint(\n screen: { x: number; y: number },\n view: View3DLike,\n state: State,\n pixelRadius = 8,\n): string | null {\n // `screen` arrives in JSXGraph user-space (pixelToUser-converted in MiniBoard3D),\n // and project3DTo2D also returns user-space. Convert the desired pixel radius\n // to user units via the board's px-per-unit scale so the snap stays small\n // (a few real pixels) regardless of zoom or board size.\n \n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing — keeps unit tests, whose\n // mock view emits pixel-space coords directly, working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const uy = typeof board?.unitY === 'number' && board.unitY > 0 ? board.unitY : ux;\n const rxUser = pixelRadius / ux;\n const ryUser = pixelRadius / uy;\n let best: { id: string; d2: number } | null = null;\n for (const obj of listObjects(state)) {\n if (obj.kind !== 'point3d') continue;\n if (!obj.visible) continue;\n const attrs = obj.attrs as Point3DAttrs;\n const world = constraintToWorld(attrs.constraint, state);\n const proj = view.project3DTo2D?.(world[0], world[1], world[2]);\n if (!proj) continue;\n const dxN = (proj[1] - screen.x) / rxUser;\n const dyN = (proj[2] - screen.y) / ryUser;\n const d2 = dxN * dxN + dyN * dyN;\n if (d2 <= 1 && (best === null || d2 < best.d2)) {\n best = { id: obj.id, d2 };\n }\n }\n return best?.id ?? null;\n}\n","import { screenToRay, type View3DLike } from './rayCast';\nimport { rayGround, rayLineSegment, rayPlane, raySphere } from './intersect';\nimport { findSnapPoint } from './snapping';\nimport { constraintToWorld, type Vec3 } from '../scene/constraintMath';\nimport type { State } from '../../../../core/scene';\nimport { listObjects } from '../../../../core/scene';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport type { Plane3DAttrs } from '../../../../core/scene/kinds/plane3d';\nimport type { Sphere3DAttrs } from '../../../../core/scene/kinds/sphere3d';\n\n// NOTE (v0.8.0): onPolygon and onLine SceneHit variants are typed but not yet\n// produced by hitTest. They will be added once tools require placing points\n// on user-defined lines/polygons (deferred from Task 2.4).\n\nexport type SceneHit =\n | { kind: 'existingPoint'; pointId: string }\n | { kind: 'onGround'; world: Vec3 }\n | { kind: 'onAxis'; axis: 'x' | 'y' | 'z'; t: number; world: Vec3 }\n | { kind: 'onPlane'; planeId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onLine'; lineId: string; t: number; world: Vec3 }\n | { kind: 'onPolygon'; polygonId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onSphere'; sphereId: string; theta: number; phi: number; world: Vec3 }\n | { kind: 'empty' };\n\nconst AXIS_PIXEL_THRESHOLD = 12;\n\nexport function hitTest(\n screen: { x: number; y: number },\n view: View3DLike,\n state: State,\n): SceneHit {\n // `screen` arrives in user-space; thresholds below are in pixels and need to\n // be converted to user units via the board's px-per-unit scale.\n \n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing so the hitTest unit tests,\n // whose mock view emits pixel-space coords directly, keep working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const axisThresholdUser = AXIS_PIXEL_THRESHOLD / ux;\n\n // 1. Existing point snap\n const snap = findSnapPoint(screen, view, state);\n if (snap) return { kind: 'existingPoint', pointId: snap };\n\n const ray = screenToRay(screen, view);\n\n // 2. Spheres\n let bestSphere: { id: string; t: number; world: Vec3 } | null = null;\n for (const obj of listObjects(state)) {\n if (obj.kind !== 'sphere3d' || !obj.visible) continue;\n const attrs = obj.attrs as Sphere3DAttrs;\n const centerPoint = state.objects[attrs.center];\n const surfacePoint = state.objects[attrs.surfacePoint];\n if (!centerPoint || centerPoint.kind !== 'point3d') continue;\n if (!surfacePoint || surfacePoint.kind !== 'point3d') continue;\n const center = constraintToWorld((centerPoint.attrs as Point3DAttrs).constraint, state);\n const surface = constraintToWorld((surfacePoint.attrs as Point3DAttrs).constraint, state);\n const radius = Math.hypot(\n surface[0] - center[0],\n surface[1] - center[1],\n surface[2] - center[2],\n );\n const sh = raySphere(ray, { center, radius });\n if (sh && (bestSphere === null || sh.t < bestSphere.t)) {\n bestSphere = { id: obj.id, t: sh.t, world: sh.point };\n }\n }\n\n // 3. Axis snap — project click onto each axis line in screen space, check pixel distance\n if (view.project3DTo2D) {\n const axes: { axis: 'x' | 'y' | 'z'; a: Vec3; b: Vec3 }[] = [\n { axis: 'x', a: [-10, 0, 0], b: [10, 0, 0] },\n { axis: 'y', a: [0, -10, 0], b: [0, 10, 0] },\n { axis: 'z', a: [0, 0, -10], b: [0, 0, 10] },\n ];\n for (const ax of axes) {\n const pa = view.project3DTo2D(ax.a[0], ax.a[1], ax.a[2]);\n const pb = view.project3DTo2D(ax.b[0], ax.b[1], ax.b[2]);\n const d = distScreenPointToSegment(screen, [pa[1], pa[2]], [pb[1], pb[2]]);\n if (d <= axisThresholdUser) {\n const hit = rayLineSegment(ray, { a: ax.a, b: ax.b }, 1e3);\n if (hit) {\n const t = ax.axis === 'x' ? hit.point[0] : ax.axis === 'y' ? hit.point[1] : hit.point[2];\n return { kind: 'onAxis', axis: ax.axis, t, world: hit.point };\n }\n }\n }\n }\n\n // 4. User-defined planes\n let bestPlane: { id: string; t: number; world: Vec3; basis: NonNullable<ReturnType<typeof planeBasis>> } | null = null;\n for (const obj of listObjects(state)) {\n if (obj.kind !== 'plane3d' || !obj.visible) continue;\n const basis = planeBasis(obj.attrs as Plane3DAttrs, state);\n if (!basis) continue;\n const ph = rayPlane(ray, { point: basis.origin, normal: basis.normal });\n if (ph && (bestPlane === null || ph.t < bestPlane.t)) {\n bestPlane = { id: obj.id, t: ph.t, world: ph.point, basis };\n }\n }\n // Compare best plane to best sphere — return whichever is closer\n if (bestPlane && (!bestSphere || bestPlane.t < bestSphere.t)) {\n const rel: Vec3 = [\n bestPlane.world[0] - bestPlane.basis.origin[0],\n bestPlane.world[1] - bestPlane.basis.origin[1],\n bestPlane.world[2] - bestPlane.basis.origin[2],\n ];\n const b1n = dot3(bestPlane.basis.basis1, bestPlane.basis.basis1);\n const b2n = dot3(bestPlane.basis.basis2, bestPlane.basis.basis2);\n const u = b1n === 0 ? 0 : dot3(rel, bestPlane.basis.basis1) / b1n;\n const v = b2n === 0 ? 0 : dot3(rel, bestPlane.basis.basis2) / b2n;\n return { kind: 'onPlane', planeId: bestPlane.id, u, v, world: bestPlane.world };\n }\n\n // 5. Sphere result (if found)\n if (bestSphere) {\n const sph = state.objects[bestSphere.id];\n if (sph && sph.kind === 'sphere3d') {\n const centerPt = state.objects[(sph.attrs as Sphere3DAttrs).center];\n if (centerPt && centerPt.kind === 'point3d') {\n const center = constraintToWorld((centerPt.attrs as Point3DAttrs).constraint, state);\n const relX = bestSphere.world[0] - center[0];\n const relY = bestSphere.world[1] - center[1];\n const relZ = bestSphere.world[2] - center[2];\n const r = Math.hypot(relX, relY, relZ);\n const phi = r === 0 ? 0 : Math.acos(relZ / r);\n const theta = Math.atan2(relY, relX);\n return { kind: 'onSphere', sphereId: bestSphere.id, theta, phi, world: bestSphere.world };\n }\n }\n }\n\n // 6. Ground\n const g = rayGround(ray);\n if (g) return { kind: 'onGround', world: g.point };\n\n return { kind: 'empty' };\n}\n\nfunction distScreenPointToSegment(\n p: { x: number; y: number },\n a: [number, number],\n b: [number, number],\n): number {\n const vx = b[0] - a[0];\n const vy = b[1] - a[1];\n const wx = p.x - a[0];\n const wy = p.y - a[1];\n const c1 = vx * wx + vy * wy;\n if (c1 <= 0) return Math.hypot(wx, wy);\n const c2 = vx * vx + vy * vy;\n if (c2 <= c1) return Math.hypot(p.x - b[0], p.y - b[1]);\n const t = c1 / c2;\n const px = a[0] + t * vx;\n const py = a[1] + t * vy;\n return Math.hypot(p.x - px, p.y - py);\n}\n\nfunction planeBasis(\n plane: Plane3DAttrs,\n state: State,\n): { origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3 } | null {\n const p1Obj = state.objects[plane.p1];\n const p2Obj = state.objects[plane.p2];\n const p3Obj = state.objects[plane.p3];\n if (!p1Obj || p1Obj.kind !== 'point3d') return null;\n if (!p2Obj || p2Obj.kind !== 'point3d') return null;\n if (!p3Obj || p3Obj.kind !== 'point3d') return null;\n const p1 = constraintToWorld((p1Obj.attrs as Point3DAttrs).constraint, state);\n const p2 = constraintToWorld((p2Obj.attrs as Point3DAttrs).constraint, state);\n const p3 = constraintToWorld((p3Obj.attrs as Point3DAttrs).constraint, state);\n const basis1: Vec3 = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]];\n const tmp: Vec3 = [p3[0] - p1[0], p3[1] - p1[1], p3[2] - p1[2]];\n const cx = basis1[1] * tmp[2] - basis1[2] * tmp[1];\n const cy = basis1[2] * tmp[0] - basis1[0] * tmp[2];\n const cz = basis1[0] * tmp[1] - basis1[1] * tmp[0];\n const cLen = Math.hypot(cx, cy, cz);\n if (cLen === 0) return null;\n const normal: Vec3 = [cx / cLen, cy / cLen, cz / cLen];\n const basis2: Vec3 = [\n normal[1] * basis1[2] - normal[2] * basis1[1],\n normal[2] * basis1[0] - normal[0] * basis1[2],\n normal[0] * basis1[1] - normal[1] * basis1[0],\n ];\n return { origin: p1, basis1, basis2, normal };\n}\n\nfunction dot3(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n","const isDev = (() => {\n try {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n } catch {\n return false;\n }\n})();\n\n/**\n * Wrap JSXGraph operations that can throw on stale/missing state.\n * In dev mode: log to console. In prod: silent swallow + return fallback.\n *\n * @param label Short tag for grep-ability (vd \"removeObject\", \"board.update\").\n * @param fn Operation to execute.\n * @param fallback Value to return if fn throws (default: undefined).\n */\nexport function safeJsx<T>(label: string, fn: () => T): T | undefined;\nexport function safeJsx<T>(label: string, fn: () => T, fallback: T): T;\nexport function safeJsx<T>(label: string, fn: () => T, fallback?: T): T | undefined {\n try {\n return fn();\n } catch (err) {\n if (isDev) {\n \n console.warn('[whiteboard:jsxgraph]', label, err);\n }\n return fallback;\n }\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Minimal JSXGraph board surface that wheel-zoom logic depends on.\n * Local shape to avoid importing the (untyped) jsxgraph default export here.\n */\nexport interface JxgBoardZoomable {\n zoomIn: (x?: number, y?: number) => void;\n zoomOut: (x?: number, y?: number) => void;\n // JSXGraph older versions may not expose this — wheel still works, just\n // without cursor-anchored zoom (falls back to board-center).\n getUsrCoordsOfMouse?: (e: WheelEvent) => unknown;\n}\n\n/**\n * Attach Excalidraw-style Ctrl/Cmd + wheel zoom to a container element.\n *\n * - Khi wheel kèm Ctrl/Cmd: preventDefault + zoom in/out với anchor tại\n * con trỏ (nếu board hỗ trợ `getUsrCoordsOfMouse`).\n * - Khi wheel không kèm modifier: bỏ qua → page scroll bình thường.\n *\n * Returns cleanup fn. Caller chịu trách nhiệm gọi trong cleanup của useEffect.\n *\n * @param target Container element (`HTMLDivElement` hoặc `SVGSVGElement`).\n * @param board JSXGraph board instance đã initBoard xong.\n * @param label Tag để log dev-mode khi safeJsx swallow lỗi (vd \"MiniBoard.2d\").\n */\nexport function attachJxgWheelZoom(\n target: HTMLElement,\n board: JxgBoardZoomable,\n label = 'wheelZoom',\n): () => void {\n const onWheel = (e: WheelEvent): void => {\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n e.stopPropagation();\n let cx: number | undefined;\n let cy: number | undefined;\n safeJsx(`${label}.coords`, () => {\n const usr = board.getUsrCoordsOfMouse?.(e);\n if (Array.isArray(usr) && usr.length >= 2\n && Number.isFinite(usr[0]) && Number.isFinite(usr[1])) {\n cx = usr[0] as number;\n cy = usr[1] as number;\n }\n });\n if (e.deltaY < 0) safeJsx(`${label}.in`, () => board.zoomIn(cx, cy));\n else if (e.deltaY > 0) safeJsx(`${label}.out`, () => board.zoomOut(cx, cy));\n };\n target.addEventListener('wheel', onWheel, { passive: false });\n return () => { target.removeEventListener('wheel', onWheel); };\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Toggles cho common JSXGraph options. Per-stamp callsite override mặc định\n * nếu cần preserve behavior cụ thể.\n *\n * Mặc định:\n * - text.display = 'internal' (true) — bắt buộc cho clone-SVG export.\n * - text.useASCII/MathJax/Katex = false (true) — JSXGraph default rendering,\n * không load extra text engine.\n * - label.display = 'internal' (true) — point label vào trong SVG.\n * - elements.highlight = false (FALSE mặc định) — opt-in vì graph-2d cần\n * JSXGraph's default hover-highlight để phân biệt object đang hover.\n */\nexport interface JxgInitDefaults {\n textDisplayInternal?: boolean;\n disableTextEngines?: boolean;\n labelDisplayInternal?: boolean;\n disableElementHighlight?: boolean;\n}\n\nexport interface InitJxgBoardConfig {\n /** Per-MiniBoard toggle cho common defaults. */\n defaults?: JxgInitDefaults;\n /** Options pass thẳng vào `JXG.JSXGraph.initBoard(target, opts)`. */\n boardOptions: Record<string, unknown>;\n /**\n * Hook để tweak options sau khi defaults được apply. Dùng cho per-stamp\n * customization (vd themeLabel color cho 2D, axesPosition cho 3D view3d).\n */\n \n extraOptionTweaks?: (opts: any) => void;\n /** Tag cho safeJsx log (vd \"MiniBoard.2d\"). Default: \"JxgBoard\". */\n label?: string;\n}\n\nexport interface InitJxgBoardResult {\n \n JXG: any;\n \n board: any;\n /** Gọi để free JSXGraph board (safe-wrapped). */\n cleanup: () => void;\n}\n\n/**\n * Async dynamic-import JSXGraph + apply common options + initBoard + trả\n * cleanup. Centralize boilerplate shared bởi 3 MiniBoard (2D/3D/graph-2d).\n *\n * Caller vẫn handle cancellation flag, refs, và post-init setup (renderer,\n * view3d, axes, etc.) ngoài helper này.\n *\n * @throws Nếu JSXGraph load hoặc initBoard throw. Caller nên try/catch nếu\n * cần tolerate mock environments.\n */\nexport async function initJxgBoard(\n target: string | HTMLElement,\n config: InitJxgBoardConfig,\n): Promise<InitJxgBoardResult> {\n const label = config.label ?? 'JxgBoard';\n \n const JXG = (await import('jsxgraph')).default as any;\n const {\n textDisplayInternal = true,\n disableTextEngines = true,\n labelDisplayInternal = true,\n disableElementHighlight = false,\n } = config.defaults ?? {};\n safeJsx(`${label}.applyOptions`, () => {\n const opts = JXG.Options;\n if (!opts) return;\n if (textDisplayInternal || disableTextEngines) {\n opts.text = opts.text ?? {};\n if (textDisplayInternal) opts.text.display = 'internal';\n if (disableTextEngines) {\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n }\n }\n if (labelDisplayInternal) {\n opts.label = opts.label ?? {};\n opts.label.display = 'internal';\n }\n if (disableElementHighlight) {\n opts.elements = opts.elements ?? {};\n opts.elements.highlight = false;\n }\n config.extraOptionTweaks?.(opts);\n });\n const board = JXG.JSXGraph.initBoard(target, config.boardOptions);\n const cleanup = (): void => {\n safeJsx(`${label}.freeBoard`, () => JXG.JSXGraph.freeBoard(board));\n };\n return { JXG, board, cleanup };\n}\n","'use client';\nimport * as React from 'react';\nimport {\n DEFAULT_VIEW3D,\n GROUND_PLANE_ATTRS,\n GROUND_PLANE_RANGE,\n VIEW3D_ATTRS,\n paletteFor,\n} from './theme';\nimport { attachJxgWheelZoom } from '../../shared/attachJxgWheelZoom';\nimport { initJxgBoard } from '../../shared/initJxgBoard';\n\n// JSXGraph board / view types are not published — use minimal local shapes.\n \ntype JxgBoard = any;\n \ntype JxgView3D = any;\n\nexport interface MiniBoard3DProps {\n isDark: boolean;\n onView3DReady?: (view: JxgView3D, board: JxgBoard) => void;\n onPointerClick?: (screen: { x: number; y: number }) => void;\n onPointerMove?: (screen: { x: number; y: number }) => void;\n onPointerLeave?: () => void;\n /**\n * Called on pointerdown. Return true to switch the upcoming drag from the\n * default view-rotate mode into a delegated point-drag (passed to\n * onPointerDrag / onPointerDragEnd). The screen coord is in user-space.\n */\n shouldStartPointDrag?: (screen: { x: number; y: number }) => boolean;\n onPointerDrag?: (screen: { x: number; y: number }) => void;\n /**\n * Called at the end of a point-drag gesture (also invoked defensively on\n * pointerleave during an in-flight drag). The screen coord is in user-space.\n * Consumers that only need a \"drag ended\" notification may ignore the arg.\n */\n onPointerDragEnd?: (screen: { x: number; y: number }) => void;\n /**\n * Called on pointermove (khi không đang drag) để biết có hover object không.\n * Return true → cursor đổi 'pointer'; false → cursor reset về ''. Apply mọi\n * tool — báo hiệu \"object click/drag được\".\n */\n isHoveringObject?: (screen: { x: number; y: number }) => boolean;\n}\n\nexport interface MiniBoard3DHandle {\n getBoard: () => JxgBoard | null;\n getView3D: () => JxgView3D | null;\n /** Returns the current SVG element of the board for export. */\n getSvgElement: () => SVGSVGElement | null;\n}\n\nexport const MiniBoard3D = React.forwardRef<MiniBoard3DHandle, MiniBoard3DProps>(\n function MiniBoard3D(props, ref) {\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const boardRef = React.useRef<JxgBoard | null>(null);\n const viewRef = React.useRef<JxgView3D | null>(null);\n const {\n isDark,\n onView3DReady,\n onPointerClick,\n onPointerMove,\n onPointerLeave,\n shouldStartPointDrag,\n onPointerDrag,\n onPointerDragEnd,\n isHoveringObject,\n } = props;\n\n // Keep latest callback refs stable across re-renders so the init effect\n // doesn't have to re-run when handlers change.\n const onView3DReadyRef = React.useRef(onView3DReady);\n const onPointerClickRef = React.useRef(onPointerClick);\n const onPointerMoveRef = React.useRef(onPointerMove);\n const onPointerLeaveRef = React.useRef(onPointerLeave);\n const shouldStartPointDragRef = React.useRef(shouldStartPointDrag);\n const onPointerDragRef = React.useRef(onPointerDrag);\n const onPointerDragEndRef = React.useRef(onPointerDragEnd);\n const isHoveringObjectRef = React.useRef(isHoveringObject);\n onView3DReadyRef.current = onView3DReady;\n onPointerClickRef.current = onPointerClick;\n onPointerMoveRef.current = onPointerMove;\n onPointerLeaveRef.current = onPointerLeave;\n shouldStartPointDragRef.current = shouldStartPointDrag;\n onPointerDragRef.current = onPointerDrag;\n onPointerDragEndRef.current = onPointerDragEnd;\n isHoveringObjectRef.current = isHoveringObject;\n\n React.useImperativeHandle(\n ref,\n () => ({\n getBoard: () => boardRef.current,\n getView3D: () => viewRef.current,\n getSvgElement: () => containerRef.current?.querySelector('svg') ?? null,\n }),\n [],\n );\n\n React.useEffect(() => {\n const div = containerRef.current;\n if (!div) return;\n let cancelled = false;\n let board: JxgBoard | null = null;\n let svgEl: SVGSVGElement | null = null;\n let handlePointerDown: ((e: PointerEvent) => void) | null = null;\n let handlePointerMove: ((e: PointerEvent) => void) | null = null;\n let handlePointerUp: ((e: PointerEvent) => void) | null = null;\n let handlePointerLeave: (() => void) | null = null;\n let wheelCleanup: (() => void) | null = null;\n let freeBoard: (() => void) | null = null;\n\n void (async () => {\n let initResult;\n try {\n initResult = await initJxgBoard(div, {\n label: 'MiniBoard.3d',\n defaults: { disableElementHighlight: true },\n boardOptions: {\n boundingbox: [-6, 6, 6, -6],\n keepaspectratio: true,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n // Wheel zoom được tự xử lý bằng Ctrl/Cmd + wheel ở dưới (Excalidraw-style).\n zoom: { wheel: false },\n },\n });\n } catch {\n return;\n }\n if (cancelled || !containerRef.current) { initResult.cleanup(); return; }\n board = initResult.board;\n freeBoard = initResult.cleanup;\n if (cancelled || !board) return;\n boardRef.current = board;\n\n // Ctrl/Cmd + wheel zoom: cuộn lên phóng to, cuộn xuống thu nhỏ. Không\n // có modifier thì để page scroll bình thường.\n wheelCleanup = attachJxgWheelZoom(div, board, 'MiniBoard.3d');\n\n let view: JxgView3D | null = null;\n try {\n const baseAttrs = VIEW3D_ATTRS(isDark);\n view = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [DEFAULT_VIEW3D.bbox3D[0], DEFAULT_VIEW3D.bbox3D[3]],\n [DEFAULT_VIEW3D.bbox3D[1], DEFAULT_VIEW3D.bbox3D[4]],\n [DEFAULT_VIEW3D.bbox3D[2], DEFAULT_VIEW3D.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n // JSXGraph view3d đọc giá trị khởi tạo từ az.slider.start (không\n // phải az.value). Pass nhầm `value` → JSXGraph dùng default\n // 1.0/0.3, khiến DEFAULT_VIEW3D bị bỏ qua.\n az: { ...baseAttrs.az, slider: { ...baseAttrs.az.slider, start: DEFAULT_VIEW3D.azimuth } },\n el: { ...baseAttrs.el, slider: { ...baseAttrs.el.slider, start: DEFAULT_VIEW3D.elevation } },\n },\n );\n } catch {\n /* ignore — mock or jsdom limitation */\n }\n viewRef.current = view;\n if (view) {\n // GeoGebra-style XY ground plane through origin (z=0), drawn behind\n // any user-created geometry. View3D's built-in zPlaneRear sits at the\n // bbox floor (z=zMin), not at the axes — so we draw an explicit one.\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => unknown }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(isDark),\n );\n } catch {\n /* swallow — older JSXGraph or mock may not support 5-arg plane3d */\n }\n onView3DReadyRef.current?.(view, board);\n }\n\n svgEl = (containerRef.current?.querySelector('svg') ?? null) as SVGSVGElement | null;\n if (svgEl) {\n const p = paletteFor(isDark);\n svgEl.style.background = p.view3dBg;\n\n // Convert browser pixel coords to JSXGraph user-space coords so that\n // hitTest math (which compares against view.project3DTo2D output, also\n // in user-space) is in the same coordinate system.\n const pixelToUser = (e: PointerEvent): { x: number; y: number } => {\n const rect = svgEl!.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n \n const b = board as any;\n if (!b || !b.origin || !b.origin.scrCoords) {\n return { x: px, y: py };\n }\n const ox = b.origin.scrCoords[1];\n const oy = b.origin.scrCoords[2];\n const ux = b.unitX || 1;\n const uy = b.unitY || 1;\n return { x: (px - ox) / ux, y: (oy - py) / uy };\n };\n // Drag-to-rotate: track pointerdown start; if pointer travels past\n // DRAG_THRESHOLD before pointerup → rotate az/el and suppress click.\n const DRAG_THRESHOLD = 4;\n const AZ_PER_PX = 0.01;\n const EL_PER_PX = 0.01;\n const EL_LIMIT = Math.PI / 2 - 0.05;\n let dragStart: { x: number; y: number } | null = null;\n let dragging = false;\n let pointDragMode = false;\n let startAz = 0;\n let startEl = 0;\n const readAng = (s: { Value?: () => number; value?: number } | undefined): number => {\n if (!s) return 0;\n if (typeof s.Value === 'function') {\n try { return s.Value(); } catch { /* fallthrough */ }\n }\n return typeof s.value === 'number' ? s.value : 0;\n };\n const setAng = (\n s: { setValue?: (v: number) => void; value?: number } | undefined,\n v: number,\n ): void => {\n if (!s) return;\n if (typeof s.setValue === 'function') {\n try { s.setValue(v); return; } catch { /* fallthrough */ }\n }\n s.value = v;\n };\n\n handlePointerDown = (e: PointerEvent) => {\n if (!svgEl) return;\n dragStart = { x: e.clientX, y: e.clientY };\n dragging = false;\n pointDragMode = false;\n // If the consumer claims this drag (e.g. cursor is over an existing\n // point), enter point-drag mode and skip view-rotation.\n const screen = pixelToUser(e);\n try {\n pointDragMode = shouldStartPointDragRef.current?.(screen) ?? false;\n } catch { pointDragMode = false; }\n if (!pointDragMode) {\n \n const v = viewRef.current as any;\n startAz = readAng(v?.az_slide ?? v?.az);\n startEl = readAng(v?.el_slide ?? v?.el);\n }\n try { svgEl.setPointerCapture?.(e.pointerId); } catch { /* ignore */ }\n };\n handlePointerMove = (e: PointerEvent) => {\n if (!svgEl) return;\n if (dragStart) {\n const dx = e.clientX - dragStart.x;\n const dy = e.clientY - dragStart.y;\n if (!dragging && Math.hypot(dx, dy) > DRAG_THRESHOLD) dragging = true;\n if (dragging) {\n if (pointDragMode) {\n onPointerDragRef.current?.(pixelToUser(e));\n return;\n }\n \n const v = viewRef.current as any;\n const newAz = startAz + dx * AZ_PER_PX;\n let newEl = startEl - dy * EL_PER_PX;\n if (newEl > EL_LIMIT) newEl = EL_LIMIT;\n if (newEl < -EL_LIMIT) newEl = -EL_LIMIT;\n setAng(v?.az_slide ?? v?.az, newAz);\n setAng(v?.el_slide ?? v?.el, newEl);\n try { v?.board?.update?.(); } catch { /* ignore */ }\n return;\n }\n }\n const screen = pixelToUser(e);\n onPointerMoveRef.current?.(screen);\n // Hover cursor: pointer khi hover object (point/edge/...). Apply\n // mọi tool — báo hiệu draggable/clickable. Khi đang drag thì skip\n // (dragging branch ở trên đã return sớm).\n const hovering = isHoveringObjectRef.current?.(screen) ?? false;\n svgEl.style.cursor = hovering ? 'pointer' : '';\n };\n handlePointerUp = (e: PointerEvent) => {\n if (!svgEl) return;\n const wasDrag = dragging;\n const hadDown = dragStart !== null;\n const wasPointDrag = pointDragMode;\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n try { svgEl.releasePointerCapture?.(e.pointerId); } catch { /* ignore */ }\n // When the consumer claimed the gesture (pointDragMode), it owns\n // both placement and finalisation. Always run onPointerDragEnd so\n // any consumer-side refs are cleared (and an undo checkpoint can\n // be pushed), and SKIP onPointerClick to avoid double-handling\n // (e.g. Point-tool place-and-lift creates the point in\n // shouldStartPointDrag; we mustn't also fire the\n // click→consumeHit→buildPoint path).\n if (hadDown && wasPointDrag) {\n onPointerDragEndRef.current?.(pixelToUser(e));\n return;\n }\n if (hadDown && !wasDrag) {\n onPointerClickRef.current?.(pixelToUser(e));\n }\n };\n handlePointerLeave = () => {\n if (pointDragMode) {\n // Best-effort cleanup so a stray pointerleave during a drag\n // doesn't leak the consumer's draggedPointRef.\n try { onPointerDragEndRef.current?.({ x: 0, y: 0 }); } catch { /* ignore */ }\n }\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n onPointerLeaveRef.current?.();\n };\n svgEl.addEventListener('pointerdown', handlePointerDown);\n svgEl.addEventListener('pointermove', handlePointerMove);\n svgEl.addEventListener('pointerup', handlePointerUp);\n svgEl.addEventListener('pointercancel', handlePointerUp);\n svgEl.addEventListener('pointerleave', handlePointerLeave);\n }\n })();\n\n return () => {\n cancelled = true;\n if (wheelCleanup) {\n wheelCleanup();\n wheelCleanup = null;\n }\n if (svgEl) {\n if (handlePointerDown) svgEl.removeEventListener('pointerdown', handlePointerDown);\n if (handlePointerMove) svgEl.removeEventListener('pointermove', handlePointerMove);\n if (handlePointerUp) {\n svgEl.removeEventListener('pointerup', handlePointerUp);\n svgEl.removeEventListener('pointercancel', handlePointerUp);\n }\n if (handlePointerLeave) svgEl.removeEventListener('pointerleave', handlePointerLeave);\n }\n if (freeBoard) { freeBoard(); freeBoard = null; }\n boardRef.current = null;\n viewRef.current = null;\n };\n }, [isDark]);\n\n const p = paletteFor(isDark);\n\n return (\n <div\n data-testid=\"mini-board-3d\"\n ref={containerRef}\n style={{\n width: '100%',\n height: '100%',\n minHeight: 400,\n background: p.view3dBg,\n position: 'relative',\n // Clip JSXGraph mesh3d paths projecting outside the container.\n overflow: 'hidden',\n }}\n />\n );\n },\n);\n","/**\n * preview3d.ts — Transient \"ghost\" shape that tracks the cursor between clicks\n * for multi-point tools (segment / line / ray / vector / polygon / plane /\n * sphere / pyramid / prism / tetrahedron / cube / cylinder / cone).\n *\n * Lifecycle:\n * - Constructed once per editor session when view3D is ready.\n * - `update(tool, collected, hoverHit)` rebuilds the preview from scratch on\n * every pointer move. Cheap because we only create a handful of JSXGraph\n * primitives.\n * - `clear()` removes everything (called on tool change / cancel / build).\n * - `dispose()` final teardown.\n *\n * Coordinates are derived from the same hit-test path used by the controller,\n * so the phantom point lands exactly where the next real point would land if\n * the user clicked now.\n */\n\nimport type { Store } from '../../../core/scene';\nimport type { Point3DAttrs } from '../../../core/scene/kinds/point3d';\nimport { constraintToWorld, type Vec3 } from './scene/constraintMath';\nimport type { SceneHit } from './hitTest/hitTest';\nimport type { CollectedArg, ToolKey } from './tools/spec';\n\n \ntype JxgView3D = any;\n \ntype JxgEl = any;\n\nconst PREVIEW_STYLE = {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.7,\n dash: 2,\n fixed: true,\n highlight: false,\n withLabel: false,\n} as const;\n\nexport class Preview3DManager {\n private view: JxgView3D;\n private store: Store;\n private phantom: JxgEl | null = null;\n private pickPts: JxgEl[] = [];\n private shapes: JxgEl[] = [];\n private disposed = false;\n\n constructor(view: JxgView3D, store: Store) {\n this.view = view;\n this.store = store;\n }\n\n clear(): void {\n const v = this.view as { removeObject?: (e: unknown) => void };\n for (const s of this.shapes) {\n try { v.removeObject?.(s); } catch { /* ignore */ }\n }\n this.shapes = [];\n for (const p of this.pickPts) {\n try { v.removeObject?.(p); } catch { /* ignore */ }\n }\n this.pickPts = [];\n if (this.phantom) {\n try { v.removeObject?.(this.phantom); } catch { /* ignore */ }\n this.phantom = null;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.clear();\n this.disposed = true;\n }\n\n /**\n * Rebuild the preview from scratch using the controller's current `tool` +\n * `collected` args + the live `hoverHit` from the most recent pointer move.\n *\n * Returns early (and clears) when there's nothing to preview:\n * - no tool selected\n * - no points collected yet\n * - hover is empty / off-surface\n * - any collected arg lacks a hit (number steps)\n */\n update(tool: ToolKey | null, collected: CollectedArg[], hoverHit: SceneHit): void {\n if (this.disposed) return;\n this.clear();\n if (!tool || tool === 'move') return;\n if (collected.length === 0) return;\n if (hoverHit.kind === 'empty') return;\n\n const phantomCoords = this.hitToCoords(hoverHit);\n if (!phantomCoords) return;\n\n const pickCoords: Vec3[] = [];\n for (const c of collected) {\n if (!c.hit) return;\n const coords = this.hitToCoords(c.hit);\n if (!coords) return;\n pickCoords.push(coords);\n }\n\n try {\n this.phantom = this.view.create('point3d', phantomCoords, {\n visible: false, fixed: true, withLabel: false, name: '',\n });\n } catch { return; }\n\n for (const coords of pickCoords) {\n try {\n const p = this.view.create('point3d', coords, {\n visible: false, fixed: true, withLabel: false, name: '',\n });\n this.pickPts.push(p);\n } catch { return; }\n }\n\n this.buildShape(tool);\n }\n\n private buildShape(tool: ToolKey): void {\n const phantom = this.phantom;\n const picks = this.pickPts;\n if (!phantom || picks.length === 0) return;\n const last = picks[picks.length - 1];\n\n try {\n switch (tool) {\n case 'segment':\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n return;\n case 'line':\n this.shapes.push(this.makeLine3d(picks[0], phantom, true, true));\n return;\n case 'ray':\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, true));\n return;\n case 'vector':\n this.shapes.push(this.view.create('line3d', [picks[0], phantom], {\n ...PREVIEW_STYLE,\n straightFirst: false,\n straightLast: false,\n lastArrow: { type: 1 },\n }));\n return;\n case 'polygon':\n case 'pyramid':\n case 'prism': {\n for (let i = 0; i < picks.length - 1; i += 1) {\n this.shapes.push(this.makeLine3d(picks[i], picks[i + 1], false, false));\n }\n this.shapes.push(this.makeLine3d(last, phantom, false, false));\n if (picks.length >= 2) {\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n }\n return;\n }\n case 'plane': {\n if (picks.length === 1) {\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n } else if (picks.length === 2) {\n this.shapes.push(this.makeLine3d(picks[0], picks[1], false, false));\n this.shapes.push(this.makeLine3d(picks[1], phantom, false, false));\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n }\n return;\n }\n case 'sphere': {\n this.shapes.push(this.view.create('sphere3d', [picks[0], phantom], {\n ...PREVIEW_STYLE,\n fillColor: 'none',\n fillOpacity: 0,\n }));\n return;\n }\n case 'tetrahedron':\n case 'cube':\n case 'cylinder':\n case 'cone':\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n return;\n default:\n return;\n }\n } catch { /* ignore */ }\n }\n\n private makeLine3d(a: JxgEl, b: JxgEl, straightFirst: boolean, straightLast: boolean): JxgEl {\n return this.view.create('line3d', [a, b], {\n ...PREVIEW_STYLE,\n straightFirst,\n straightLast,\n });\n }\n\n private hitToCoords(hit: SceneHit): Vec3 | null {\n if (hit.kind === 'existingPoint') {\n const obj = this.store.getState().objects[hit.pointId];\n if (!obj || obj.kind !== 'point3d') return null;\n return constraintToWorld((obj.attrs as Point3DAttrs).constraint, this.store.getState());\n }\n if ('world' in hit) return hit.world;\n return null;\n }\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface StatusHintProps {\n hint: string;\n hoverLabel?: string | null;\n}\n\nexport function StatusHint(props: StatusHintProps): React.ReactElement {\n const { hint, hoverLabel } = props;\n return (\n <div\n data-testid=\"status-hint\"\n className=\"border-t border-zinc-200 bg-zinc-50 px-3 py-1.5 text-xs text-zinc-700 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\"\n >\n <span>📐 {hint || 'Chọn công cụ trong bảng bên trái'}</span>\n {hoverLabel ? (\n <span className=\"ml-3 text-zinc-500\">— đang trên: {hoverLabel}</span>\n ) : null}\n </div>\n );\n}\n","// src/stamps/geometry-3d/editor/usePointDrag.ts\nimport * as React from 'react';\nimport { nextLabel, type State, type Store } from '../../../core/scene';\nimport type { Constraint3D } from '../../../core/scene/kinds/3d-constraint';\nimport type { Point3DAttrs } from '../../../core/scene/kinds/point3d';\nimport { hitTest } from './hitTest/hitTest';\nimport { rayPlane } from './hitTest/intersect';\nimport { screenToRay } from './hitTest/rayCast';\nimport { constraintToWorld, type Vec3 } from './scene/constraintMath';\nimport { hitToConstraint } from './tools/handlers/_ensurePoint';\nimport type { MiniBoard3DHandle } from './MiniBoard3D';\nimport type { ToolKey } from './tools/spec';\n\nexport interface UsePointDragOptions {\n store: Store;\n boardRef: React.RefObject<MiniBoard3DHandle | null>;\n /** Ref tới tool đang chọn — đọc tươi tránh stale closure trong drag. */\n selectedToolRef: React.RefObject<ToolKey>;\n}\n\nexport interface UsePointDragHandlers {\n /**\n * Trả về true nếu gesture là drag/place point của ta. True cũng suppress\n * view rotation của MiniBoard3D suốt phần còn lại của gesture.\n */\n shouldStartPointDrag: (screen: { x: number; y: number }) => boolean;\n onPointerDrag: (screen: { x: number; y: number }) => void;\n onPointerDragEnd: () => void;\n /** True khi đang trong gesture drag — handleMove dùng để pause hover label. */\n isDragging: () => boolean;\n}\n\n// Point-drag handlers cho 3D editor: drag existing point (Z-only ở tool Point,\n// XY raycast ở tool Move) + place-and-lift (tool Point trên ground/axis). Capture\n// snapshot trước mọi mutation để onPointerDragEnd push một undo checkpoint duy\n// nhất cho cả gesture.\nexport function usePointDrag(opts: UsePointDragOptions): UsePointDragHandlers {\n const { store, boardRef, selectedToolRef } = opts;\n\n const draggedPointRef = React.useRef<string | null>(null);\n const dragStartRef = React.useRef<{ screen: { x: number; y: number }; world: Vec3 } | null>(null);\n const dragSnapshotRef = React.useRef<State | null>(null);\n // Track liệu có mutation trong drag không — onPointerDragEnd dùng để quyết\n // định có cần push manual checkpoint qua LOAD-then-LOAD.\n const dragMutatedRef = React.useRef<boolean>(false);\n\n const shouldStartPointDrag = React.useCallback(\n (screen: { x: number; y: number }): boolean => {\n const view = boardRef.current?.getView3D();\n if (!view) return false;\n const tool = selectedToolRef.current;\n if (tool !== 'point' && tool !== 'move') return false;\n let hit;\n try {\n hit = hitTest(screen, view, store.getState());\n } catch {\n return false;\n }\n\n if (hit.kind === 'existingPoint') {\n const pt = store.getState().objects[hit.pointId];\n if (!pt || pt.kind !== 'point3d') return false;\n dragSnapshotRef.current = store.getState();\n dragMutatedRef.current = false;\n draggedPointRef.current = hit.pointId;\n dragStartRef.current = {\n screen,\n world: constraintToWorld((pt.attrs as Point3DAttrs).constraint, store.getState()),\n };\n return true;\n }\n\n // Point tool: place-and-lift. Capture snapshot trước, tạo point bên trong\n // withoutHistory để chỉ drag-end checkpoint nằm trên undo stack. Bypass\n // controller (Point tool repeatAfterBuild — không có collected để unwind);\n // path click→consumeHit→buildPoint bị short-circuit trong handlePointerUp\n // khi pointDragMode được set.\n if (tool === 'point' && (hit.kind === 'onGround' || hit.kind === 'onAxis')) {\n dragSnapshotRef.current = store.getState();\n dragMutatedRef.current = false;\n const constraint = hitToConstraint(hit);\n if (!constraint) {\n dragSnapshotRef.current = null;\n return false;\n }\n let id: string | null = null;\n store.withoutHistory(() => {\n const stateBefore = store.getState();\n const newId = `p${stateBefore.counter + 1}`;\n const label = nextLabel(stateBefore, 'point3d');\n store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id: newId,\n kind: 'point3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { constraint },\n },\n },\n });\n id = newId;\n });\n if (!id) {\n dragSnapshotRef.current = null;\n return false;\n }\n draggedPointRef.current = id;\n dragStartRef.current = {\n screen,\n world: [hit.world[0], hit.world[1], hit.world[2]],\n };\n return true;\n }\n\n // Point tool nhưng non-placeable surface (sphere/plane/empty): suppress\n // view rotation để camera không xoay khi user đang place point, nhưng\n // không enter drag. Clear snapshot phòng hờ.\n if (tool === 'point') {\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n return true;\n }\n\n return false;\n },\n [store, boardRef, selectedToolRef],\n );\n\n const onPointerDrag = React.useCallback(\n (screen: { x: number; y: number }) => {\n const pointId = draggedPointRef.current;\n const start = dragStartRef.current;\n if (!pointId || !start) return;\n const view = boardRef.current?.getView3D();\n if (!view) return;\n const tool = selectedToolRef.current;\n let nextWorld: Vec3;\n if (tool === 'point') {\n // Vertical lift only — giữ X,Y; map screen-Y delta sang world Z (pixelToUser\n // đã invert Y rồi).\n const dz = screen.y - start.screen.y;\n nextWorld = [start.world[0], start.world[1], start.world[2] + dz];\n } else if (tool === 'move') {\n try {\n const ray = screenToRay(screen, view);\n const hit = rayPlane(ray, { point: [0, 0, start.world[2]], normal: [0, 0, 1] });\n if (!hit) return;\n nextWorld = [hit.point[0], hit.point[1], start.world[2]];\n } catch {\n return;\n }\n } else {\n return;\n }\n const obj = store.getState().objects[pointId];\n if (!obj || obj.kind !== 'point3d') return;\n const free: Constraint3D = { kind: 'free', x: nextWorld[0], y: nextWorld[1], z: nextWorld[2] };\n // UPDATE_ATTRS → fire subscribers, JxgRenderer3D diff + update JSXGraph.\n // Wrap withoutHistory: drag-end sẽ push 1 checkpoint duy nhất.\n store.withoutHistory(() => {\n store.dispatch({ type: 'UPDATE_ATTRS', payload: { id: pointId, patch: { constraint: free } } });\n });\n dragMutatedRef.current = true;\n },\n [store, boardRef, selectedToolRef],\n );\n\n const onPointerDragEnd = React.useCallback(() => {\n const snap = dragSnapshotRef.current;\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n dragMutatedRef.current = false;\n // Push undo checkpoint cho cả 2 flow: click-only (ADD point inside\n // withoutHistory → cần checkpoint manual) và drag-and-lift (ADD +\n // UPDATE_ATTRS đều bị withoutHistory wrap → cùng cần). Net: 1 entry duy\n // nhất trong past stack = snap → current. Nếu snap === current (degenerate),\n // 2 LOAD đều no-op, không push gì.\n if (snap) {\n const current = store.getState();\n store.withoutHistory(() => {\n store.dispatch({ type: 'LOAD', payload: { state: snap } });\n });\n store.dispatch({ type: 'LOAD', payload: { state: current } });\n }\n }, [store]);\n\n const isDragging = React.useCallback(() => draggedPointRef.current !== null, []);\n\n return { shouldStartPointDrag, onPointerDrag, onPointerDragEnd, isDragging };\n}\n","// src/stamps/geometry-3d/editor/editorHelpers.ts\nimport type { State, View3D } from '../../../core/scene';\nimport type { SceneHit } from './hitTest/hitTest';\nimport { DEFAULT_VIEW3D } from './theme';\n\nexport function hitToHoverLabel(hit: SceneHit, state: State): string | null {\n if (hit.kind === 'empty') return null;\n if (hit.kind === 'existingPoint') return state.objects[hit.pointId]?.label ?? null;\n if (hit.kind === 'onGround') return 'mặt nền';\n if (hit.kind === 'onAxis') return `trục ${hit.axis.toUpperCase()}`;\n if (hit.kind === 'onPlane') return `mặt phẳng ${hit.planeId}`;\n if (hit.kind === 'onSphere') return `mặt cầu ${hit.sphereId}`;\n return null;\n}\n\nexport function getView3DInfo(view: unknown): View3D {\n \n const v = view as any;\n const azSlider = v?.az_slide ?? v?.az;\n const elSlider = v?.el_slide ?? v?.el;\n const azimuth = typeof azSlider?.Value === 'function' ? azSlider.Value() : 0;\n const elevation = typeof elSlider?.Value === 'function' ? elSlider.Value() : 0;\n return {\n azimuth,\n elevation,\n bbox3D: [...DEFAULT_VIEW3D.bbox3D] as [number, number, number, number, number, number],\n };\n}\n","// src/stamps/shared/StampLeftPanel/constants.ts\n//\n// Desktop popover sizing chia sẻ giữa 3 stamp editor (geometry-2d, geometry-3d,\n// graph-2d). Trước đây mỗi EditorPanel hardcode size riêng (640×540 cho 2D/graph,\n// 800×600 cho 3D) → kích thước canvas nhỏ + không nhất quán. Gom vào constant\n// 880×700 + cap responsive để dùng được trên màn nhỏ.\n\n/** Tailwind class string áp cho outer popover của stamp editor (desktop). */\nexport const STAMP_PANEL_DESKTOP =\n 'h-[700px] w-[880px] max-h-[85vh] max-w-[calc(100vw-280px)]';\n","import React, {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\nimport type { ShowToastFn, DismissToastFn, ToastItem, ToastOptions } from './types';\n\nexport interface ToastContextValue {\n items: ToastItem[];\n showToast: ShowToastFn;\n dismiss: DismissToastFn;\n}\n\nexport const ToastContext = createContext<ToastContextValue | null>(null);\n\ntype Action =\n | { type: 'PUSH'; item: ToastItem; maxVisible: number }\n | { type: 'REPLACE'; item: ToastItem }\n | { type: 'DISMISS'; id: string };\n\nfunction reducer(state: ToastItem[], action: Action): ToastItem[] {\n switch (action.type) {\n case 'PUSH': {\n const next = [...state, action.item];\n return next.length > action.maxVisible ? next.slice(next.length - action.maxVisible) : next;\n }\n case 'REPLACE':\n return state.map((it) => (it.id === action.item.id ? action.item : it));\n case 'DISMISS':\n return state.filter((it) => it.id !== action.id);\n }\n}\n\ninterface ToastProviderProps {\n children: React.ReactNode;\n /** Max simultaneously visible toasts. Default: 3. Pushing more drops oldest. */\n maxVisible?: number;\n}\n\nlet autoIdCounter = 0;\n\nexport function ToastProvider({ children, maxVisible = 3 }: ToastProviderProps) {\n const [items, dispatch] = useReducer(reducer, [] as ToastItem[]);\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n const clearTimer = useCallback((id: string) => {\n const t = timersRef.current.get(id);\n if (t) {\n clearTimeout(t);\n timersRef.current.delete(id);\n }\n }, []);\n\n const dismiss = useCallback<DismissToastFn>((id) => {\n clearTimer(id);\n dispatch({ type: 'DISMISS', id });\n }, [clearTimer]);\n\n const scheduleAutoDismiss = useCallback((id: string, duration: number) => {\n if (duration <= 0) return;\n const t = setTimeout(() => dismiss(id), duration);\n timersRef.current.set(id, t);\n }, [dismiss]);\n\n const showToast = useCallback<ShowToastFn>((message, opts: ToastOptions = {}) => {\n const variant = opts.variant ?? 'info';\n const duration = opts.duration ?? 3000;\n const id = opts.id ?? `toast-${++autoIdCounter}`;\n const item: ToastItem = { id, message, variant, duration };\n const existing = itemsRef.current.find((it) => it.id === id);\n if (existing) {\n clearTimer(id);\n dispatch({ type: 'REPLACE', item });\n } else {\n dispatch({ type: 'PUSH', item, maxVisible });\n }\n scheduleAutoDismiss(id, duration);\n }, [clearTimer, maxVisible, scheduleAutoDismiss]);\n\n useEffect(() => () => {\n timersRef.current.forEach((t) => clearTimeout(t));\n timersRef.current.clear();\n }, []);\n\n const value = useMemo(() => ({ items, showToast, dismiss }), [items, showToast, dismiss]);\n return <ToastContext.Provider value={value}>{children}</ToastContext.Provider>;\n}\n","import React from 'react';\nimport type { ToastVariant } from './types';\n\nconst VARIANT_CLASS: Record<ToastVariant, string> = {\n info: 'border-l-sky-500',\n warning: 'border-l-amber-500',\n error: 'border-l-rose-500',\n};\n\nconst VARIANT_ICON: Record<ToastVariant, React.ReactNode> = {\n info: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n ),\n warning: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n ),\n error: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n ),\n};\n\ninterface ToastProps {\n id: string;\n message: string;\n variant: ToastVariant;\n onDismiss: (id: string) => void;\n}\n\nexport function Toast({ id, message, variant, onDismiss }: ToastProps) {\n return (\n <div\n role=\"status\"\n className={[\n 'pointer-events-auto flex max-w-sm items-start gap-2 rounded-lg border-l-4 bg-white px-3 py-2 text-sm text-slate-800 shadow-md ring-1 ring-black/5',\n VARIANT_CLASS[variant],\n ].join(' ')}\n >\n <span className=\"mt-0.5 shrink-0 text-slate-500\">{VARIANT_ICON[variant]}</span>\n <span className=\"flex-1 leading-snug\">{message}</span>\n <button\n type=\"button\"\n aria-label=\"Đóng thông báo\"\n onClick={() => onDismiss(id)}\n className=\"-mr-1 ml-1 inline-flex h-5 w-5 shrink-0 items-center justify-center rounded text-slate-400 hover:bg-slate-100 hover:text-slate-700\"\n >\n ×\n </button>\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { ToastContext } from './ToastProvider';\n\nexport function useToast() {\n const ctx = useContext(ToastContext);\n if (!ctx) {\n throw new Error('useToast must be used inside <ToastProvider>');\n }\n return ctx;\n}\n","import React from 'react';\nimport { Toast } from './Toast';\nimport { useToast } from './useToast';\n\n/**\n * Renders the active toast queue. Mount once near the root of each stamp\n * EditorPanel (inside ToastProvider). Positions itself absolutely at\n * bottom-center of the nearest positioned ancestor.\n */\nexport function ToastHost() {\n const { items, dismiss } = useToast();\n if (items.length === 0) return null;\n return (\n <div\n aria-live=\"polite\"\n className=\"pointer-events-none absolute inset-x-0 bottom-3 z-50 flex flex-col items-center gap-2\"\n >\n {items.map((it) => (\n <Toast key={it.id} id={it.id} message={it.message} variant={it.variant} onDismiss={dismiss} />\n ))}\n </div>\n );\n}\n","export { ToastProvider } from './ToastProvider';\nexport { ToastHost } from './ToastHost';\nexport { Toast } from './Toast';\nexport { useToast } from './useToast';\nexport type {\n ToastVariant,\n ToastOptions,\n ToastItem,\n ShowToastFn,\n DismissToastFn,\n} from './types';\n","'use client';\nimport * as React from 'react';\nimport {\n useEditorState,\n type Store,\n type View3D,\n} from '../../../core/scene';\nimport { JxgRenderer3D } from '../../../core/scene/render/JxgRenderer3D';\nimport { ToolController } from './tools/controller';\nimport { hitTest } from './hitTest/hitTest';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport { Preview3DManager } from './preview3d';\nimport { StatusHint } from './StatusHint';\nimport type { ToolKey } from './tools/spec';\nimport { usePointDrag } from './usePointDrag';\nimport { getView3DInfo, hitToHoverLabel } from './editorHelpers';\nimport { serializeBoard3D } from '../serialize';\nimport { renderGeometry3DSvgFromState } from '../render';\nimport { STAMP_PANEL_DESKTOP } from '../../shared/StampLeftPanel/constants';\nimport { ToastProvider, ToastHost } from '../../shared/Toast';\n\nexport interface EditorPanelProps {\n isDark?: boolean;\n /** Triggered after serialize + svg render — host wires Excalidraw insertion. */\n onInsert?: (jsonState: string, svgString: string) => void;\n /** Close dialog. Host has the lifecycle hook for \"close + remove host\". */\n onClose: () => void;\n /** Store created by host (so LeftPanel sibling can share it). */\n store: Store;\n /** Currently selected tool — controlled by host. */\n selectedTool: ToolKey;\n /** Host gets notified when the controller switches the active tool. */\n onSelectedToolChange: (k: ToolKey) => void;\n showAxis: boolean;\n showGrid: boolean;\n /** Notifies host của ready/canUndo/canRedo để host wire LeftPanel buttons. */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Mở mobile LeftPanel drawer (host owns drawer visibility). */\n onOpenDrawer?: () => void;\n /** Khi true, panel offset left để chừa chỗ cho LeftPanel (desktop). */\n withLeftPanel?: boolean;\n}\n\nexport interface EditorPanelHandle {\n hasContent: () => boolean;\n /** Try to serialize + render + onInsert. Returns false nếu rỗng. */\n tryInsert: () => boolean;\n setTool: (k: ToolKey) => void;\n undo: () => void;\n redo: () => void;\n highlight: (id: string | null) => void;\n}\n\nconst EditorPanelInner = React.forwardRef<EditorPanelHandle, EditorPanelProps>(\n function EditorPanel(props, ref) {\n const {\n isDark: isDarkProp,\n onInsert,\n onClose,\n store,\n selectedTool,\n onSelectedToolChange,\n showAxis,\n showGrid,\n onHistoryChange,\n isMobile = false,\n onOpenDrawer,\n withLeftPanel = false,\n } = props;\n const isDark = isDarkProp ?? false;\n\n const controllerRef = React.useRef<ToolController | null>(null);\n if (!controllerRef.current) controllerRef.current = new ToolController(store);\n\n const [hint, setHint] = React.useState<string>('Chọn công cụ trong bảng bên trái');\n const [hoverLabel, setHoverLabel] = React.useState<string | null>(null);\n const [ready, setReady] = React.useState(false);\n const [hasContent, setHasContent] = React.useState(false);\n\n const boardRef = React.useRef<MiniBoard3DHandle | null>(null);\n const rendererRef = React.useRef<JxgRenderer3D | null>(null);\n const previewRef = React.useRef<Preview3DManager | null>(null);\n const lastHoverHitRef = React.useRef<import('./hitTest/hitTest').SceneHit>({ kind: 'empty' });\n\n const onSelectedToolChangeRef = React.useRef(onSelectedToolChange);\n onSelectedToolChangeRef.current = onSelectedToolChange;\n\n const selectedToolRef = React.useRef(selectedTool);\n selectedToolRef.current = selectedTool;\n\n const onInsertRef = React.useRef(onInsert);\n onInsertRef.current = onInsert;\n\n // Hook đã pre-load state vào store qua parseInitialState3D — useEditorState\n // không cần initialState LOAD nữa. Vẫn dùng cho canUndo/canRedo propagate\n // + keyboard shortcuts.\n useEditorState({ store, onHistoryChange });\n\n const { shouldStartPointDrag, onPointerDrag, onPointerDragEnd, isDragging } = usePointDrag({\n store,\n boardRef,\n selectedToolRef,\n });\n\n React.useEffect(() => {\n const ctrl = controllerRef.current!;\n return ctrl.on((state) => {\n setHint(state.hint);\n onSelectedToolChangeRef.current(state.tool?.key ?? 'move');\n });\n }, []);\n\n React.useEffect(() => {\n controllerRef.current?.selectTool(selectedTool);\n }, [selectedTool]);\n\n React.useEffect(() => {\n return () => {\n rendererRef.current?.dispose();\n rendererRef.current = null;\n previewRef.current?.dispose();\n previewRef.current = null;\n };\n }, []);\n\n // hasContent: track store size để gate Insert button.\n React.useEffect(() => {\n const sync = (): void => setHasContent(Object.keys(store.getState().objects).length > 0);\n sync();\n return store.subscribe(sync);\n }, [store]);\n\n // Clear preview khi controller reset (tool switch, build complete, cancel).\n React.useEffect(() => {\n const controller = controllerRef.current;\n if (!controller) return;\n return controller.on((state) => {\n if (!previewRef.current) return;\n if (state.collected.length === 0) previewRef.current.clear();\n else previewRef.current.update(state.tool?.key ?? null, state.collected, lastHoverHitRef.current);\n });\n }, []);\n\n React.useEffect(() => {\n const view = boardRef.current?.getView3D();\n \n const v = view as any;\n if (!v || typeof v.setAttribute !== 'function') return;\n try {\n v.setAttribute({\n xAxis: { visible: showAxis },\n yAxis: { visible: showAxis },\n zAxis: { visible: showAxis },\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: showGrid, mesh3d: { visible: false } },\n });\n v.board?.update?.();\n } catch {\n /* swallow — JSXGraph cũ / mocks không support runtime attr changes */\n }\n }, [showAxis, showGrid]);\n\n const handleView3DReady = React.useCallback((view: unknown) => {\n rendererRef.current = new JxgRenderer3D(store, view);\n previewRef.current = new Preview3DManager(view, store);\n const meta = store.getState().meta;\n const savedView: View3D | null = meta.domain === '3d' ? meta.view : null;\n if (savedView) {\n try {\n \n const v = view as any;\n v?.az_slide?.setValue?.(savedView.azimuth);\n v?.el_slide?.setValue?.(savedView.elevation);\n v?.board?.update?.();\n } catch {\n /* swallow — JSXGraph cũ không expose az_slide */\n }\n }\n setReady(true);\n }, [store]);\n\n const handleClick = React.useCallback((screen: { x: number; y: number }) => {\n const view = boardRef.current?.getView3D();\n if (!view) return;\n try {\n const hit = hitTest(screen, view, store.getState());\n controllerRef.current!.consumeHit(hit);\n } catch {\n /* swallow — view có thể chưa expose project3DTo2D trong mock path */\n }\n }, [store]);\n\n const handleMove = React.useCallback((screen: { x: number; y: number }) => {\n const view = boardRef.current?.getView3D();\n if (!view) return;\n if (isDragging()) return;\n let hit;\n try {\n hit = hitTest(screen, view, store.getState());\n } catch {\n setHoverLabel(null);\n return;\n }\n lastHoverHitRef.current = hit;\n const ctrl = controllerRef.current;\n if (previewRef.current && ctrl) {\n const cs = ctrl.getState();\n previewRef.current.update(cs.tool?.key ?? null, cs.collected, hit);\n }\n setHoverLabel(hitToHoverLabel(hit, store.getState()));\n }, [store, isDragging]);\n\n // Cursor hover hit-test — reuse `hitTest()` đã có. SceneHit.kind === 'empty'\n // → không hover; else → hover (point/line/polygon/...). Try/catch để\n // tolerate mock environment khi view chưa expose project3DTo2D.\n const isHoveringObject = React.useCallback((screen: { x: number; y: number }): boolean => {\n const view = boardRef.current?.getView3D();\n if (!view) return false;\n try {\n return hitTest(screen, view, store.getState()).kind !== 'empty';\n } catch {\n return false;\n }\n }, [store]);\n\n const tryInsert = React.useCallback((): boolean => {\n const state = store.getState();\n if (Object.keys(state.objects).length === 0) return false;\n const view = getView3DInfo(boardRef.current?.getView3D());\n const jsonState = serializeBoard3D(state, view);\n void (async () => {\n try {\n const { svgString } = await renderGeometry3DSvgFromState(jsonState);\n onInsertRef.current?.(jsonState, svgString);\n } catch (err) {\n console.error('Geometry3D insert failed:', err);\n }\n })();\n return true;\n }, [store]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n hasContent: () => Object.keys(store.getState().objects).length > 0,\n tryInsert,\n setTool: (k) => controllerRef.current!.selectTool(k),\n undo: () => store.undo(),\n redo: () => store.redo(),\n highlight: (id) => rendererRef.current?.highlight(id),\n }),\n [store, tryInsert],\n );\n\n const dialogStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học 3D\"\n data-testid=\"geom3d-host\"\n data-stamp-area=\"true\"\n style={dialogStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'relative flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : `${STAMP_PANEL_DESKTOP} rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5`,\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z M4 9 L10 4 L20 4 L14 9 Z M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n Dựng hình học không gian\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={tryInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geom3d-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1\">\n <MiniBoard3D\n ref={boardRef}\n isDark={isDark}\n onView3DReady={handleView3DReady}\n onPointerClick={handleClick}\n onPointerMove={handleMove}\n onPointerLeave={() => {\n setHoverLabel(null);\n lastHoverHitRef.current = { kind: 'empty' };\n previewRef.current?.clear();\n }}\n shouldStartPointDrag={shouldStartPointDrag}\n onPointerDrag={onPointerDrag}\n onPointerDragEnd={onPointerDragEnd}\n isHoveringObject={isHoveringObject}\n />\n </div>\n <StatusHint hint={hint} hoverLabel={hoverLabel} />\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={tryInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geom3d-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n <ToastHost />\n </div>\n );\n },\n);\n\nexport const EditorPanel = React.forwardRef<EditorPanelHandle, EditorPanelProps>(\n function EditorPanel(props, ref) {\n return (\n <ToastProvider>\n <EditorPanelInner {...props} ref={ref} />\n </ToastProvider>\n );\n },\n);\n\n// createStore / createEmptyState exported từ core/scene barrel.\n","'use client';\nimport * as React from 'react';\n\nexport interface TabSpec<K extends string = string> {\n key: K;\n label: React.ReactNode;\n testId?: string;\n}\n\nexport interface LeftPanelShellProps<K extends string = string> {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n isDark?: boolean;\n tabs?: readonly TabSpec<K>[];\n activeTab?: K;\n onTabChange?: (k: K) => void;\n /** data-testid trên <aside> root. Mặc định \"left-panel\". */\n testId?: string;\n /** Opt-in: cho phép kéo viền phải để đổi width. */\n resizable?: boolean;\n /** Key localStorage để persist width khi resizable=true. */\n widthStorageKey?: string;\n /** Width mặc định khi resizable. Default 240 (≈ w-60). */\n defaultWidth?: number;\n minWidth?: number;\n maxWidth?: number;\n children: React.ReactNode;\n}\n\nconst FALLBACK_DEFAULT_WIDTH = 240;\nconst FALLBACK_MIN_WIDTH = 220;\nconst FALLBACK_MAX_WIDTH = 480;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n));\n}\n\nfunction readStoredWidth(\n key: string | undefined,\n fallback: number,\n min: number,\n max: number,\n): number {\n if (!key || typeof window === 'undefined') return fallback;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return fallback;\n const n = parseInt(raw, 10);\n if (Number.isFinite(n)) return clamp(n, min, max);\n } catch {\n /* SSR or storage disabled */\n }\n return fallback;\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function LeftPanelShell<K extends string>(props: LeftPanelShellProps<K>): React.ReactElement {\n const {\n title,\n icon,\n onClose,\n isDark,\n tabs,\n activeTab,\n onTabChange,\n testId,\n resizable,\n widthStorageKey,\n defaultWidth,\n minWidth,\n maxWidth,\n children,\n } = props;\n const showTabs = !!tabs && tabs.length >= 2;\n\n const min = minWidth ?? FALLBACK_MIN_WIDTH;\n const max = maxWidth ?? FALLBACK_MAX_WIDTH;\n const initial = clamp(defaultWidth ?? FALLBACK_DEFAULT_WIDTH, min, max);\n\n const [width, setWidth] = React.useState<number>(() =>\n resizable ? readStoredWidth(widthStorageKey, initial, min, max) : initial,\n );\n const widthRef = React.useRef(width);\n widthRef.current = width;\n\n React.useEffect(() => {\n if (!resizable || !widthStorageKey || typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(widthStorageKey, String(width));\n } catch {\n /* storage disabled */\n }\n }, [resizable, widthStorageKey, width]);\n\n const onResizeStart = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!resizable) return;\n e.preventDefault();\n const startX = e.clientX;\n const startW = widthRef.current;\n const onMove = (ev: MouseEvent) => {\n setWidth(clamp(startW + (ev.clientX - startX), min, max));\n };\n const onUp = () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n },\n [resizable, min, max],\n );\n\n const onResizeDoubleClick = React.useCallback(() => {\n if (!resizable) return;\n setWidth(initial);\n }, [resizable, initial]);\n\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid={testId ?? 'left-panel'}\n data-stamp-area=\"true\"\n style={resizable ? { width: `${width}px` } : undefined}\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n resizable ? '' : 'w-60',\n ].join(' ')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n\n {showTabs && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-3\">\n {tabs!.map((t) => (\n <TabPill\n key={t.key}\n active={t.key === activeTab}\n onClick={() => onTabChange?.(t.key)}\n testId={t.testId}\n >\n {t.label}\n </TabPill>\n ))}\n </div>\n )}\n\n <div\n {...(showTabs ? { role: 'tabpanel' } : {})}\n className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-3\"\n >\n {children}\n </div>\n\n {resizable && (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Kéo để đổi rộng panel\"\n data-testid=\"left-panel-resizer\"\n onMouseDown={onResizeStart}\n onDoubleClick={onResizeDoubleClick}\n className=\"group absolute right-0 top-0 z-40 h-full w-1.5 -mr-0.5 cursor-ew-resize select-none\"\n title=\"Kéo để đổi rộng (double-click để reset)\"\n >\n <div className=\"pointer-events-none absolute inset-y-0 right-0 w-px bg-slate-200 transition group-hover:bg-emerald-400 group-hover:w-0.5 group-active:bg-emerald-500 group-active:w-0.5\" />\n </div>\n )}\n </aside>\n );\n}\n\nexport function TabPill(props: {\n active: boolean;\n onClick: () => void;\n testId?: string;\n children: React.ReactNode;\n}): React.ReactElement {\n const { active, onClick, testId, children } = props;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n data-testid={testId}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n active\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nexport function Section(props: { label: string; children: React.ReactNode }): React.ReactElement {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {props.label}\n </h4>\n {props.children}\n </section>\n );\n}\n","// src/core/scene/ui/kindMeta.ts\nexport interface KindUiMeta {\n displayName: string;\n icon: string;\n /** Fallback color khi obj.attrs.color không có. Phải khớp default ở renderer. */\n defaultColor: string;\n}\n\n// Default colors:\n// - Points: blue (#1e40af)\n// - Curves / shapes: dark slate (#0f172a)\n// - 3D planes / spheres: light blue (#60a5fa)\nconst POINT_COLOR = '#1e40af';\nconst CURVE_COLOR = '#0f172a';\nconst PLANE_COLOR = '#60a5fa';\n\nexport const KIND_UI_META: Readonly<Record<string, KindUiMeta>> = {\n // 2D\n point: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n circle: { displayName: 'Đường tròn', icon: '○', defaultColor: CURVE_COLOR },\n polygon: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n intersection: { displayName: 'Giao điểm', icon: '✕', defaultColor: POINT_COLOR },\n angle: { displayName: 'Góc', icon: '∠', defaultColor: '#16a34a' },\n distance: { displayName: 'Khoảng cách', icon: '↔', defaultColor: '#dc2626' },\n // 3D\n point3d: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment3d: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line3d: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray3d: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector3d: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n plane3d: { displayName: 'Mặt phẳng', icon: '▱', defaultColor: PLANE_COLOR },\n polygon3d: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n sphere3d: { displayName: 'Mặt cầu', icon: '◯', defaultColor: PLANE_COLOR },\n polyhedron3d: { displayName: 'Đa diện', icon: '⬢', defaultColor: PLANE_COLOR },\n cylinder3d: { displayName: 'Hình trụ', icon: '⌭', defaultColor: PLANE_COLOR },\n cone3d: { displayName: 'Hình nón', icon: '▲', defaultColor: PLANE_COLOR },\n // Graph 2D\n function2d: { displayName: 'Hàm số', icon: 'ƒ', defaultColor: CURVE_COLOR },\n parameter: { displayName: 'Tham số', icon: 'α', defaultColor: '#7c3aed' },\n pointOnCurve: { displayName: 'Điểm trên đồ thị', icon: '◉', defaultColor: POINT_COLOR },\n tangent2d: { displayName: 'Tiếp tuyến', icon: '╱', defaultColor: CURVE_COLOR },\n extremum2d: { displayName: 'Cực trị', icon: '∧', defaultColor: POINT_COLOR },\n root2d: { displayName: 'Nghiệm', icon: '0', defaultColor: POINT_COLOR },\n slope2d: { displayName: 'Hệ số góc', icon: '△', defaultColor: '#dc2626' },\n};\n\nexport function getKindUiMeta(kind: string): KindUiMeta {\n return KIND_UI_META[kind] ?? { displayName: kind, icon: '?', defaultColor: '#888888' };\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface ObjectRowMenuProps {\n locked: boolean;\n onToggleLocked: () => void;\n onRename: () => void;\n onChangeColor: () => void;\n onDelete: () => void;\n}\n\nexport function ObjectRowMenu(props: ObjectRowMenuProps): React.ReactElement {\n const { locked, onToggleLocked, onRename, onChangeColor, onDelete } = props;\n const [open, setOpen] = React.useState(false);\n\n return (\n <div className=\"relative inline-block\">\n <button\n type=\"button\"\n aria-label=\"Row menu\"\n onClick={(e) => { e.stopPropagation(); setOpen((v) => !v); }}\n className=\"rounded px-1.5 text-black\"\n >\n ⋮\n </button>\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-10 mt-1 w-40 rounded-md border border-zinc-200 bg-white py-1 text-xs shadow-lg dark:border-zinc-700 dark:bg-zinc-900\"\n onClick={(e) => e.stopPropagation()}\n >\n <MenuItem onClick={() => { setOpen(false); onRename(); }}>Đổi tên</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onChangeColor(); }}>Đổi màu</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onToggleLocked(); }}>\n {locked ? 'Mở khoá' : 'Khoá'}\n </MenuItem>\n <MenuItem\n onClick={() => { setOpen(false); onDelete(); }}\n className=\"text-red-600 dark:text-red-400\"\n >\n Xoá\n </MenuItem>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MenuItem({\n children,\n onClick,\n className,\n}: React.PropsWithChildren<{ onClick: () => void; className?: string }>) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={onClick}\n className={`block w-full px-3 py-1 text-left text-black ${className ?? ''}`}\n >\n {children}\n </button>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { SceneObject, State } from '../types';\nimport { getKind } from '../registry';\nimport { getKindUiMeta } from './kindMeta';\nimport { ObjectRowMenu } from './ObjectRowMenu';\n\nexport interface ObjectRowProps {\n obj: SceneObject;\n state: State;\n selected: boolean;\n onSelect: (id: string) => void;\n onToggleVisible: (id: string) => void;\n onToggleLocked: (id: string) => void;\n onRename: (id: string) => void;\n onChangeColor: (id: string) => void;\n onDelete: (id: string) => void;\n /**\n * Override mô tả title của row. Mặc định dùng `getKind(obj.kind).describe()`.\n * Stamp consumer (vd geometry-2d) có thể inject DSL-style description.\n */\n describe?: (obj: SceneObject, state: State) => string;\n}\n\nfunction formatMeasure(items: { label: string; value: number }[]): string {\n return items.map((it) => `${it.label} = ${it.value.toFixed(2)}`).join(', ');\n}\n\nexport function ObjectRow(props: ObjectRowProps): React.ReactElement {\n const { obj, state, selected, onSelect, onToggleVisible, onToggleLocked, onRename, onChangeColor, onDelete, describe } = props;\n\n const meta = getKindUiMeta(obj.kind);\n\n let title = '';\n try {\n title = describe\n ? describe(obj, state)\n : getKind(obj.kind).describe(obj, state);\n } catch {\n title = `${meta.displayName} ${obj.label}`;\n }\n\n let measureText: string | null = null;\n if (selected) {\n try {\n const m = getKind(obj.kind).measure?.(obj, state);\n if (m && m.length > 0) measureText = formatMeasure(m);\n } catch {\n measureText = null;\n }\n }\n\n const color = (obj.attrs as { color?: string }).color ?? meta.defaultColor;\n\n return (\n <li\n data-testid={`object-row-${obj.id}`}\n aria-selected={selected}\n onClick={() => onSelect(obj.id)}\n className={\n 'flex flex-col border-b border-zinc-100 cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : '')\n }\n >\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-xs\">\n <button\n type=\"button\"\n aria-label=\"Toggle visibility\"\n aria-pressed={!obj.visible}\n onClick={(e) => { e.stopPropagation(); onToggleVisible(obj.id); }}\n className=\"h-4 w-4 shrink-0 rounded-full border-2 transition\"\n style={{\n backgroundColor: obj.visible ? color : 'transparent',\n borderColor: color,\n }}\n />\n <span className=\"flex-1 truncate text-black\">\n {title}\n </span>\n <ObjectRowMenu\n locked={obj.locked}\n onToggleLocked={() => onToggleLocked(obj.id)}\n onRename={() => onRename(obj.id)}\n onChangeColor={() => onChangeColor(obj.id)}\n onDelete={() => onDelete(obj.id)}\n />\n </div>\n {selected && measureText && (\n <div\n data-testid={`object-row-detail-${obj.id}`}\n className=\"pl-9 pr-3 pb-1.5 text-[11px] text-black\"\n >\n {measureText}\n </div>\n )}\n </li>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Store } from '../store';\nimport type { SceneObject } from '../types';\nimport { listObjects } from '../selectors';\nimport { ObjectRow } from './ObjectRow';\n\nexport interface ObjectListPanelProps {\n store: Store;\n selectedId?: string;\n /**\n * Called when user clicks a row. Receives the row id, or `null` when the\n * user clicks the already-selected row (toggle off — request to deselect).\n * Parent should treat `null` as \"clear selection\".\n */\n onSelect?: (id: string | null) => void;\n /**\n * Optional per-kind row renderer. Called with the SceneObject and default props\n * (selected, onClick). Return a ReactNode to override the default ObjectRow.\n * Return null/undefined to fall back to the default ObjectRow.\n */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => React.ReactNode;\n}\n\nexport function ObjectListPanel(props: ObjectListPanelProps): React.ReactElement {\n const { store, selectedId, onSelect, renderRow } = props;\n // useSyncExternalStore expects subscribe to receive () => void callback,\n // but Store.subscribe takes (next, prev, action) => void. Wrap to adapt.\n const subscribe = React.useCallback(\n (cb: () => void) => store.subscribe(() => cb()),\n [store],\n );\n const state = React.useSyncExternalStore(subscribe, store.getState, store.getState);\n const objects = listObjects(state);\n\n function handleSelect(id: string) {\n // Toggle: click vào row đang selected → deselect (collapse detail + tắt highlight).\n onSelect?.(id === selectedId ? null : id);\n }\n\n function handleToggleVisible(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { visible: !obj.visible } } });\n }\n\n function handleToggleLocked(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { locked: !obj.locked } } });\n }\n\n function handleDelete(id: string) {\n store.dispatch({ type: 'DELETE', payload: { id } });\n }\n\n function noop() { /* rename + change color stubbed for Phase 3 */ }\n\n return (\n <ul\n data-testid=\"object-list-panel\"\n className=\"flex max-h-[calc(100vh-200px)] flex-col overflow-y-auto\"\n >\n {objects.length === 0 ? (\n <li className=\"px-3 py-4 text-center text-xs text-zinc-500\">Chưa có đối tượng nào</li>\n ) : (\n objects.map((obj) => {\n const selected = obj.id === selectedId;\n const onClick = () => handleSelect(obj.id);\n if (renderRow) {\n const custom = renderRow(obj, { selected, onClick });\n if (custom != null) {\n return <React.Fragment key={obj.id}>{custom}</React.Fragment>;\n }\n }\n return (\n <ObjectRow\n key={obj.id}\n obj={obj}\n state={state}\n selected={selected}\n onSelect={handleSelect}\n onToggleVisible={handleToggleVisible}\n onToggleLocked={handleToggleLocked}\n onRename={noop}\n onChangeColor={noop}\n onDelete={handleDelete}\n />\n );\n })\n )}\n </ul>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/AxisGridSection.tsx\n//\n// Section \"Bố cục\" / \"Góc nhìn\": 2 checkbox axis/grid + (optional) undo/redo\n// button ở mép phải. Render khi có ít nhất 1 trong (view, history).\n// Skip toàn bộ section khi cả 2 đều undefined.\n\nimport React from 'react';\nimport { Section } from '../../../core/scene/ui/LeftPanelShell';\nimport type {\n StampLeftPanelHistoryProps,\n StampLeftPanelViewProps,\n} from './types';\n\nexport interface AxisGridSectionProps {\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function AxisGridSection(props: AxisGridSectionProps): React.ReactElement | null {\n const { view, history } = props;\n if (!view && !history) return null;\n\n const sectionLabel = view?.sectionLabel ?? 'Bố cục';\n const axisLabel = view?.axisLabel ?? 'Trục';\n const gridLabel = view?.gridLabel ?? 'Lưới';\n\n return (\n <Section label={sectionLabel}>\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n {view && (\n <>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showAxis}\n onChange={(e) => view.onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n {axisLabel}\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showGrid}\n onChange={(e) => view.onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n {gridLabel}\n </label>\n </>\n )}\n {history && (\n <div className=\"ml-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={history.onUndo}\n disabled={!history.canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={history.onRedo}\n disabled={!history.canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n )}\n </div>\n </Section>\n );\n}\n","// src/stamps/shared/StampLeftPanel/types.ts\n//\n// Shared types cho StampLeftPanel template. Dùng generic TKey/TGroup để\n// preserve type safety tại call site (host của từng stamp truyền union type\n// riêng); internal cài theo string là OK.\n\nimport type { ReactNode } from 'react';\nimport type { Store } from '../../../core/scene/store';\nimport type { SceneObject } from '../../../core/scene/types';\n\nexport const TOOLTIP_DELAY_MS = 400;\nexport type HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n/** Tool descriptor unified cho 3 stamp editor. */\nexport interface StampToolDef<TKey extends string = string, TGroup extends string = string> {\n key: TKey;\n label: string;\n hint?: string;\n icon: ReactNode;\n group: TGroup;\n shortcut?: string;\n}\n\nexport interface StampLeftPanelTabs {\n /** Label tab \"Đối tượng\" (default \"📐 Đối tượng\"). */\n objectsLabel?: ReactNode;\n /** Label tab \"Công cụ\" (default \"🧰 Công cụ\"). */\n toolsLabel?: ReactNode;\n}\n\nexport interface StampLeftPanelViewProps {\n /** Section header label, default \"Bố cục\". */\n sectionLabel?: string;\n /** Checkbox label cho axis, default \"Trục\". */\n axisLabel?: string;\n /** Checkbox label cho grid, default \"Lưới\". */\n gridLabel?: string;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n}\n\nexport interface StampLeftPanelHistoryProps {\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n}\n\nexport interface StampLeftPanelChordProps<TGroup extends string = string> {\n /** Group đang được focus sau khi user bấm letter. null = không active. */\n activeGroup: TGroup | null;\n /** Mapping group → letter hint (vd \"P\" cho group \"point\"). */\n letterForGroup: (g: TGroup) => string;\n}\n\nexport interface StampLeftPanelObjectsProps {\n store: Store;\n selectedObjectId?: string;\n onObjectSelect?: (id: string | null) => void;\n /** Custom row render (vd graph-2d cần FunctionRow/ParameterRow). Trả null để fallback default ObjectRow. */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => ReactNode | null;\n /** Optional buttons phía trên ObjectListPanel (vd graph-2d \"+Hàm\" \"+Tham số\"). */\n addButtons?: ReadonlyArray<{ label: string; testId?: string; onClick: () => void }>;\n}\n\nexport interface StampLeftPanelProps<\n TKey extends string = string,\n TGroup extends string = string,\n> {\n // Header\n title: string;\n icon: ReactNode;\n onClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> root. Default \"stamp-left-panel\". */\n testId?: string;\n\n // Tools (required)\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n\n // Optional sections\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n chord?: StampLeftPanelChordProps<TGroup>;\n objects?: StampLeftPanelObjectsProps;\n tabs?: StampLeftPanelTabs;\n\n // Mobile\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n","// src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts\n//\n// Generic hover tooltip hook. Trả về { hover, portalReady, showHover, hideHover }\n// để consumer render tooltip qua createPortal. Delay 400ms tránh flash.\n//\n// Generic theo StampToolDef → 3 stamp dùng chung. Moved từ\n// geometry-2d/editor/LeftPanel/useToolHoverTooltip.ts (Phase 1.2).\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { TOOLTIP_DELAY_MS, type HoverState, type StampToolDef } from './types';\n\nexport function useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: StampToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/ToolGrid.tsx\n//\n// Tool button grid với:\n// - Search input ở đầu (filter theo label/hint, ignore diacritics + case).\n// - Group section render 4-col icon button.\n// - Khi chord.activeGroup set: section đó highlight (ring emerald + bg),\n// section khác dimmed. KHÔNG render letter / number badge / hint footer\n// nữa (đã bỏ phím tắt visual ở v0.27).\n\nimport React, { useMemo, useState } from 'react';\nimport type {\n StampLeftPanelChordProps,\n StampToolDef,\n} from './types';\nimport { useToolHoverTooltip } from './useToolHoverTooltip';\nimport { createPortal } from 'react-dom';\n\nexport interface ToolGridProps<TKey extends string, TGroup extends string> {\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n chord?: StampLeftPanelChordProps<TGroup>;\n}\n\nfunction normalize(s: string): string {\n return s\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/đ/g, 'd')\n .replace(/Đ/g, 'd');\n}\n\nfunction SearchIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"20\" y1=\"20\" x2=\"16.5\" y2=\"16.5\" />\n </svg>\n );\n}\n\nfunction ClearIcon(): React.ReactElement {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction ToolResultList<TKey extends string, TGroup extends string>(props: {\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n}): React.ReactElement {\n const { tools, activeTool, onToolChange } = props;\n return (\n <div className=\"flex flex-col gap-0.5\" data-testid=\"tool-result-list\">\n {tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n data-tool={t.key}\n aria-label={t.label}\n aria-pressed={active}\n onClick={() => onToolChange(t.key)}\n className={[\n 'flex items-center gap-2 rounded-md px-2 py-1.5 text-left transition',\n active ? 'bg-emerald-600 text-white' : 'text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-6 w-6 shrink-0 items-center justify-center\">{t.icon}</span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-[12px] font-medium leading-tight\">{t.label}</span>\n {t.hint && (\n <span className={['block truncate text-[10px] leading-tight', active ? 'text-emerald-50' : 'text-slate-400'].join(' ')}>\n {t.hint}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function ToolGrid<TKey extends string, TGroup extends string>(\n props: ToolGridProps<TKey, TGroup>,\n): React.ReactElement {\n const { tools, groupOrder, groupLabels, activeTool, onToolChange, chord } = props;\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n const [query, setQuery] = useState('');\n const normalizedQuery = useMemo(() => normalize(query.trim()), [query]);\n\n const filteredTools = useMemo(() => {\n if (!normalizedQuery) return tools;\n return tools.filter((t) => {\n if (normalize(t.label).includes(normalizedQuery)) return true;\n if (t.hint && normalize(t.hint).includes(normalizedQuery)) return true;\n return false;\n });\n }, [tools, normalizedQuery]);\n\n const grouped = useMemo(() => {\n const acc: Partial<Record<TGroup, StampToolDef<TKey, TGroup>[]>> = {};\n for (const t of filteredTools) {\n (acc[t.group] ??= []).push(t);\n }\n return acc;\n }, [filteredTools]);\n\n const groupKeys = useMemo(\n () => groupOrder.filter((g) => grouped[g] && grouped[g]!.length > 0),\n [grouped, groupOrder],\n );\n\n const noMatch = normalizedQuery !== '' && groupKeys.length === 0;\n\n return (\n <>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-slate-400\">\n <SearchIcon />\n </span>\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Tìm công cụ…\"\n aria-label=\"Tìm công cụ\"\n data-testid=\"tool-search-input\"\n className=\"w-full rounded-md border border-slate-200 bg-slate-50 py-1.5 pl-7 pr-7 text-[12px] text-slate-800 placeholder:text-slate-400 focus:border-emerald-400 focus:bg-white focus:outline-none focus:ring-1 focus:ring-emerald-300\"\n />\n {query && (\n <button\n type=\"button\"\n onClick={() => setQuery('')}\n aria-label=\"Xoá tìm kiếm\"\n data-testid=\"tool-search-clear\"\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-slate-400 transition hover:bg-slate-200 hover:text-slate-700\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {noMatch && (\n <div\n data-testid=\"tool-search-empty\"\n className=\"rounded-md border border-dashed border-slate-200 bg-slate-50 px-3 py-4 text-center text-[11px] text-slate-500\"\n >\n Không có công cụ nào khớp “{query.trim()}”.\n </div>\n )}\n\n {normalizedQuery !== '' && !noMatch ? (\n <ToolResultList tools={filteredTools} activeTool={activeTool} onToolChange={onToolChange} />\n ) : (\n groupKeys.map((group) => {\n const isChordActive = chord?.activeGroup === group;\n const dimmed = chord?.activeGroup != null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1' : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {groupLabels[group]}\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group]!.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n title={t.label + (t.shortcut ? ` (${t.shortcut})` : '')}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'relative flex h-10 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n </button>\n );\n })}\n </div>\n </section>\n );\n })\n )}\n\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Desktop.tsx\n//\n// Desktop layout cho StampLeftPanel. Render:\n// 1. LeftPanelShell chrome + tabs (chỉ render tablist khi có objects)\n// 2. Tab \"tools\": <AxisGridSection> + <ToolGrid> chord-aware\n// 3. Tab \"objects\": optional add buttons + <ObjectListPanel> với custom renderRow\n\nimport React, { useEffect, useState } from 'react';\nimport { LeftPanelShell } from '../../../core/scene/ui/LeftPanelShell';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport { AxisGridSection } from './AxisGridSection';\nimport { ToolGrid } from './ToolGrid';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanelDesktop<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n onClose,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n chord,\n objects,\n tabs,\n } = props;\n\n const [tab, setTab] = useState<'tools' | 'objects'>('tools');\n const hasObjects = !!objects;\n\n useEffect(() => {\n if (!hasObjects && tab === 'objects') setTab('tools');\n }, [hasObjects, tab]);\n\n const tabSpecs = hasObjects\n ? [\n { key: 'tools' as const, label: tabs?.toolsLabel ?? '🧰 Công cụ', testId: 'tab-tools' },\n { key: 'objects' as const, label: tabs?.objectsLabel ?? '📐 Đối tượng', testId: 'tab-objects' },\n ]\n : undefined;\n\n return (\n <LeftPanelShell\n title={title}\n icon={icon}\n onClose={onClose}\n isDark={isDark}\n testId={testId ?? 'stamp-left-panel'}\n tabs={tabSpecs}\n activeTab={hasObjects ? tab : undefined}\n onTabChange={hasObjects ? setTab : undefined}\n resizable\n widthStorageKey=\"xom11.stamp-left-panel.width\"\n >\n {(!hasObjects || tab === 'tools') ? (\n <>\n <AxisGridSection view={view} history={history} />\n <ToolGrid\n tools={tools}\n groupOrder={groupOrder}\n groupLabels={groupLabels}\n activeTool={activeTool}\n onToolChange={onToolChange}\n chord={chord}\n />\n </>\n ) : (\n <section data-testid=\"objects-panel\" className=\"flex flex-col gap-2\">\n {objects!.addButtons && objects!.addButtons.length > 0 && (\n <div className=\"flex gap-1\">\n {objects!.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects!.store}\n selectedId={objects!.selectedObjectId}\n onSelect={objects!.onObjectSelect}\n renderRow={objects!.renderRow}\n />\n </section>\n )}\n </LeftPanelShell>\n );\n}\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n /** Optional: thêm tab \"Đối tượng\" trong drawer body. */\n objectsTab?: {\n label: React.ReactNode;\n render: () => React.ReactNode;\n };\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n objectsTab,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n const [mobileTab, setMobileTab] = React.useState<'tools' | 'objects'>('tools');\n const prevOpenRef = React.useRef(drawerOpen);\n React.useEffect(() => {\n if (!prevOpenRef.current && drawerOpen) setMobileTab('tools');\n prevOpenRef.current = drawerOpen;\n }, [drawerOpen]);\n\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Tab row (chỉ render khi objectsTab được cung cấp) */}\n {objectsTab && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-2\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'tools'}\n onClick={() => setMobileTab('tools')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'tools'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n 🧰 Công cụ\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'objects'}\n onClick={() => setMobileTab('objects')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'objects'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {objectsTab.label}\n </button>\n </div>\n )}\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {objectsTab && mobileTab === 'objects' ? (\n <div className=\"px-3 pt-3\">{objectsTab.render()}</div>\n ) : (\n groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-8 w-8 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))\n )}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Mobile.tsx\n//\n// Mobile layout: wrap shared MobileToolDrawer với mapping:\n// chips = axis/grid (from view)\n// actions = undo/redo (from history)\n// groups = tools grouped by group\n// objects = objectsTab (objects.store + addButtons + custom renderRow)\n\nimport React, { useMemo } from 'react';\nimport { MobileToolDrawer, type MobileToolGroup } from '../MobileToolDrawer';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport type { StampLeftPanelProps } from './types';\n\nfunction AxisIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nfunction GridIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function StampLeftPanelMobile<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n objects,\n tabs,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = useMemo<MobileToolGroup<TKey, TGroup>[]>(() => {\n const acc = new Map<TGroup, typeof tools[number][]>();\n for (const t of tools) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n // Preserve groupOrder\n return groupOrder\n .filter((g) => acc.has(g))\n .map((group) => ({\n group,\n groupLabel: groupLabels[group],\n tools: acc.get(group)!.map((t) => ({ key: t.key, label: t.label, icon: t.icon })),\n }));\n }, [tools, groupOrder, groupLabels]);\n\n const chips = view\n ? [\n {\n label: view.axisLabel ?? 'Trục',\n icon: <AxisIcon />,\n pressed: view.showAxis,\n onToggle: view.onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: view.gridLabel ?? 'Lưới',\n icon: <GridIcon />,\n pressed: view.showGrid,\n onToggle: view.onShowGridChange,\n testId: 'toggle-grid',\n },\n ]\n : [];\n\n const actions = history\n ? [\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: history.onUndo,\n disabled: !history.canUndo,\n testId: 'undo-btn',\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: history.onRedo,\n disabled: !history.canRedo,\n testId: 'redo-btn',\n },\n ]\n : [];\n\n return (\n <MobileToolDrawer\n title={title}\n headerIcon={icon}\n testId={testId ?? 'stamp-left-panel'}\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={chips}\n actions={actions}\n groups={groups}\n activeTool={activeTool}\n onToolSelect={onToolChange}\n objectsTab={\n objects\n ? {\n label: tabs?.objectsLabel ?? '📐 Đối tượng',\n render: () => (\n <div className=\"flex flex-col gap-2 px-3\">\n {objects.addButtons && objects.addButtons.length > 0 && (\n <div className=\"flex gap-1 pt-3\">\n {objects.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects.store}\n selectedId={objects.selectedObjectId}\n onSelect={objects.onObjectSelect}\n renderRow={objects.renderRow}\n />\n </div>\n ),\n }\n : undefined\n }\n />\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/index.tsx\n//\n// Public API. Dispatch isMobile → Desktop hoặc Mobile.\n//\n// Usage:\n//\n// <StampLeftPanel\n// title=\"Hình học\"\n// icon={<GeomIcon />}\n// tools={TOOLS} // ReadonlyArray<StampToolDef>\n// groupOrder={GROUP_ORDER}\n// groupLabels={GROUP_LABELS}\n// activeTool={tool}\n// onToolChange={setTool}\n// view={{ showAxis, showGrid, onShowAxisChange, onShowGridChange }} // optional\n// history={{ onUndo, canUndo, onRedo, canRedo }} // optional\n// chord={{ activeGroup, letterForGroup }} // optional\n// objects={{ store, addButtons, renderRow, ... }} // optional\n// isMobile={isMobile}\n// drawerOpen={drawerOpen}\n// onDrawerClose={...}\n// onClose={onClose}\n// isDark={isDark}\n// />\n\nimport React from 'react';\nimport { StampLeftPanelDesktop } from './Desktop';\nimport { StampLeftPanelMobile } from './Mobile';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanel<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n if (props.isMobile) return <StampLeftPanelMobile {...props} />;\n return <StampLeftPanelDesktop {...props} />;\n}\n\nexport type {\n StampLeftPanelProps,\n StampToolDef,\n StampLeftPanelViewProps,\n StampLeftPanelHistoryProps,\n StampLeftPanelChordProps,\n StampLeftPanelObjectsProps,\n StampLeftPanelTabs,\n HoverState,\n} from './types';\nexport { TOOLTIP_DELAY_MS } from './types';\nexport { useToolHoverTooltip } from './useToolHoverTooltip';\n","import * as React from 'react';\nimport type { ToolKey } from '../tools/spec';\n\nconst wrap = (children: React.ReactNode): React.ReactElement => (\n <svg\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n);\n\nconst dot = (cx: number, cy: number, r = 1.4): React.ReactElement => (\n <circle cx={cx} cy={cy} r={r} fill=\"currentColor\" stroke=\"none\" />\n);\n\nexport const ToolIcons: Record<ToolKey, React.ReactElement> = {\n move: wrap(\n <>\n <path d=\"M5 4 L5 14 L8 11 L10 16 L13 15 L11 10 L15 10 Z\" />\n </>,\n ),\n point: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n pointOnObject: wrap(\n <>\n <path d=\"M3 16 L21 12\" />\n <circle cx=\"12\" cy=\"13.5\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n segment: wrap(\n <>\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"6\" />\n {dot(4, 18, 1.6)}\n {dot(20, 6, 1.6)}\n </>,\n ),\n line: wrap(\n <>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"6\" />\n {dot(8, 14.5, 1.4)}\n {dot(16, 9.5, 1.4)}\n </>,\n ),\n ray: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"7\" />\n <path d=\"M19 7 L15 6 M19 7 L18 11\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n vector: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"18\" y2=\"7\" />\n <path d=\"M18 7 L13 7 M18 7 L18 12\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n polygon: wrap(\n <>\n <polygon points=\"12,4 20,10 17,19 7,19 4,10\" />\n </>,\n ),\n plane: wrap(\n <>\n <polygon points=\"3,9 14,5 21,11 10,15\" />\n </>,\n ),\n pyramid: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 4 Z\" />\n <path d=\"M4 19 L12 16 L20 19\" />\n <path d=\"M12 4 L12 16\" strokeDasharray=\"2 2\" />\n </>,\n ),\n prism: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n <path d=\"M4 8 L14 8\" />\n </>,\n ),\n tetrahedron: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 5 Z\" />\n <path d=\"M4 19 L15 12 L20 19\" />\n <path d=\"M15 12 L12 5\" />\n </>,\n ),\n cube: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n </>,\n ),\n sphere: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"3\" />\n {dot(12, 12, 1.2)}\n </>,\n ),\n cylinder: wrap(\n <>\n <ellipse cx=\"12\" cy=\"6\" rx=\"6\" ry=\"2\" />\n <path d=\"M6 6 L6 18\" />\n <path d=\"M18 6 L18 18\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"6\" ry=\"2\" />\n </>,\n ),\n cone: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <line x1=\"19\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"7\" ry=\"2\" />\n </>,\n ),\n};\n","import type { ReactNode } from 'react';\nimport { TOOLS, type ToolKey, type ToolSpec } from '../tools/spec';\nimport { ToolIcons } from './icons';\n\nexport type Geom3DGroup =\n | 'basic'\n | 'point'\n | 'line'\n | 'plane'\n | 'polyhedron'\n | 'curve';\n\nexport const GROUP_ORDER: Geom3DGroup[] = [\n 'basic',\n 'point',\n 'line',\n 'plane',\n 'polyhedron',\n 'curve',\n];\n\nexport const GROUP_LABELS: Record<Geom3DGroup, string> = {\n basic: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường thẳng',\n plane: 'Mặt phẳng',\n polyhedron: 'Khối đa diện',\n curve: 'Khối cong',\n};\n\nexport const TOOLS_BY_GROUP: Record<Geom3DGroup, ToolKey[]> = {\n basic: ['move'],\n point: ['point', 'pointOnObject'],\n line: ['segment', 'line', 'ray', 'vector', 'polygon'],\n plane: ['plane'],\n polyhedron: ['pyramid', 'prism', 'tetrahedron', 'cube'],\n curve: ['sphere', 'cylinder', 'cone'],\n};\n\nexport interface Geom3DToolEntry {\n key: ToolKey;\n label: string;\n hint: string;\n icon: ReactNode;\n group: Geom3DGroup;\n}\n\nconst SPEC_BY_KEY: Record<ToolKey, ToolSpec> = TOOLS.reduce(\n (acc, t) => {\n acc[t.key] = t;\n return acc;\n },\n {} as Record<ToolKey, ToolSpec>,\n);\n\nexport const TOOLS_FLAT: Geom3DToolEntry[] = GROUP_ORDER.flatMap((group) =>\n TOOLS_BY_GROUP[group].map((key) => {\n const spec = SPEC_BY_KEY[key];\n return {\n key,\n label: spec?.label ?? key,\n hint: spec?.hintIdle ?? '',\n icon: ToolIcons[key],\n group,\n };\n }),\n);\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: Geom3DGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseChordShortcutArgs<G extends string> {\n groupOrder: readonly G[];\n tools: ReadonlyArray<{ key: string; group: G }>;\n onSelect: (toolKey: string) => void;\n enabled: boolean;\n}\n\ninterface UseChordShortcutResult<G extends string> {\n chordGroup: G | null;\n cancel: () => void;\n}\n\nconst A_CODE = 'a'.charCodeAt(0);\n\nfunction isFieldFocused(): boolean {\n const ae = (typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null);\n return !!(\n ae &&\n (ae.tagName === 'INPUT' ||\n ae.tagName === 'TEXTAREA' ||\n ae.isContentEditable)\n );\n}\n\nexport function useChordShortcut<G extends string>(\n args: UseChordShortcutArgs<G>,\n): UseChordShortcutResult<G> {\n const { groupOrder, tools, onSelect, enabled } = args;\n\n const [chordGroup, setChordGroup] = useState<G | null>(null);\n\n const groupOrderRef = useRef(groupOrder);\n const toolsRef = useRef(tools);\n const onSelectRef = useRef(onSelect);\n const chordGroupRef = useRef<G | null>(null);\n\n groupOrderRef.current = groupOrder;\n toolsRef.current = tools;\n onSelectRef.current = onSelect;\n // chordGroupRef được sync ngay trong handler (xem `setChord` dưới đây)\n // thay vì ghi từ render body — nếu ghi ở body sẽ bị React batch hoá khi\n // hai event xảy ra trong cùng một act() (event sau đọc giá trị cũ).\n\n const cancel = useCallback(() => {\n chordGroupRef.current = null;\n setChordGroup(null);\n }, []);\n\n useEffect(() => {\n if (!enabled) return;\n\n const setChord = (next: G | null) => {\n chordGroupRef.current = next;\n setChordGroup(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isFieldFocused()) return;\n\n const key = e.key;\n const lower = key.length === 1 ? key.toLowerCase() : key;\n\n if (key === 'Escape') {\n if (chordGroupRef.current !== null) {\n e.preventDefault();\n e.stopPropagation();\n setChord(null);\n }\n return;\n }\n\n if (lower.length === 1 && lower >= 'a' && lower <= 'z') {\n const idx = lower.charCodeAt(0) - A_CODE;\n if (idx < groupOrderRef.current.length) {\n e.preventDefault();\n e.stopPropagation();\n setChord(groupOrderRef.current[idx]);\n }\n return;\n }\n\n if (key >= '1' && key <= '9') {\n const active = chordGroupRef.current;\n if (active === null) return;\n const n = key.charCodeAt(0) - '1'.charCodeAt(0); // 0-indexed\n const toolsInGroup = toolsRef.current.filter(\n (t) => t.group === active,\n );\n e.preventDefault();\n e.stopPropagation();\n if (n < toolsInGroup.length) {\n onSelectRef.current(toolsInGroup[n].key);\n }\n setChord(null);\n return;\n }\n };\n\n window.addEventListener('keydown', onKey, { capture: true });\n return () => {\n window.removeEventListener('keydown', onKey, { capture: true });\n };\n }, [enabled]);\n\n return { chordGroup, cancel };\n}\n","import { createStampFile } from './svgToStampFile';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n \ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData. Mỗi stamp tự define shape (kind, version, jsonState).\n * width/height của element đã được Excalidraw track riêng — không cần lưu\n * trong customData (drop tại Tier D cleanup v0.20).\n */\n makeCustomData: () => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n /**\n * Khi re-edit: GIỮ size hiện tại của element trên canvas (kể cả user đã\n * resize bằng tay) thay vì reset về size SVG mới render. Dùng cho stamp có\n * \"khung cố định\" (geometry 2D/3D, graph) — size do user kiểm soát. KHÔNG\n * dùng cho latex (size phụ thuộc nội dung công thức → cần re-fit theo natural).\n * Mặc định false.\n */\n preserveExistingSize?: boolean;\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n \nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. createStampFile(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await createStampFile(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData();\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n // Re-edit. Với stamp khung-cố-định (preserveExistingSize): GIỮ size hiện\n // tại của element (kể cả user đã resize tay) thay vì reset về size SVG mới.\n // Giữ cạnh dài nhất của element cũ, áp tỉ lệ (aspect) của SVG mới → không\n // méo khi sửa nội dung làm đổi aspect. Element cũ chưa có size hợp lệ →\n // dùng natural.\n const old = opts.preserveExistingSize ? elements.find((e) => e.id === editingId) : undefined;\n const oldLongest = old ? Math.max(old.width ?? 0, old.height ?? 0) : 0;\n const newLongest = Math.max(width, height);\n const scale = oldLongest > 0 && newLongest > 0 ? oldLongest / newLongest : 1;\n const w = width * scale;\n const h = height * scale;\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width: w, height: h } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width: w, height: h, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 768px)';\nconst NO_HOVER_QUERY = '(hover: none)';\n\nexport interface MobileState {\n /** Viewport ≤ 768px — dùng để chuyển full-screen modal + drawer. */\n isMobile: boolean;\n /** Device không có hover (touch-only) — dùng để ẩn hover tooltips. */\n isTouchOnly: boolean;\n}\n\nfunction readMatch(query: string): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n try {\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\n/**\n * SSR-safe mobile detection qua matchMedia. Trả về `{ isMobile, isTouchOnly }`.\n * Re-render khi viewport resize hoặc input modality đổi (e.g., gắn Bluetooth mouse).\n */\nexport function useIsMobile(): MobileState {\n const [state, setState] = useState<MobileState>(() => ({\n isMobile: readMatch(MOBILE_QUERY),\n isTouchOnly: readMatch(NO_HOVER_QUERY),\n }));\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const tql = window.matchMedia(NO_HOVER_QUERY);\n const update = () => {\n setState({ isMobile: mql.matches, isTouchOnly: tql.matches });\n };\n update();\n mql.addEventListener('change', update);\n tql.addEventListener('change', update);\n return () => {\n mql.removeEventListener('change', update);\n tql.removeEventListener('change', update);\n };\n }, []);\n\n return state;\n}\n","// Hook tạo + giữ scene store tại Host level cho mọi stamp interactive\n// (geometry-2d, geometry-3d, graph-2d).\n//\n// Trước đây mỗi stamp dùng pattern riêng:\n// - 3D: useRef + createStore(createEmptyState('3d')) inline tại host.\n// - 2D + graph-2d: useState<Store|null> + callback `onStoreReady` từ editor.\n//\n// Hook này hợp nhất về 1 mental model: store sống ở host, identity stable,\n// pre-load từ customData ngay frame đầu → bỏ ternary `store ? ... : undefined`\n// + bỏ flash 1 frame trên 2D + graph-2d.\n//\n// Roundtrip edit: khi double-click stamp existing element, `editingElement`\n// được pass vào, hook gọi `parseInitial(customData)` để extract State trước\n// khi createStore. Stamp tự define parseInitial vì format customData khác nhau.\n\nimport { useRef } from 'react';\nimport { createStore, createEmptyState, type Store } from '../../core/scene';\nimport type { State } from '../../core/scene/types';\nimport type { StampHostProps } from './types';\n\nexport type StampDomain = '2d' | '3d' | 'graph2d';\n\nexport type ParseInitialStateFn = (customData: unknown) => State | null;\n\nexport function useStampStore(\n domain: StampDomain,\n editingElement: StampHostProps['editingElement'],\n parseInitial: ParseInitialStateFn,\n): Store {\n const ref = useRef<Store | null>(null);\n if (!ref.current) {\n const initial = editingElement?.customData\n ? parseInitial(editingElement.customData) ?? createEmptyState(domain)\n : createEmptyState(domain);\n ref.current = createStore(initial);\n }\n return ref.current;\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { EditorPanel, type EditorPanelHandle } from './editor/EditorPanel';\nimport { StampLeftPanel } from '../shared/StampLeftPanel';\nimport type { State } from '../../core/scene';\nimport {\n GROUP_ORDER,\n GROUP_LABELS,\n TOOLS_FLAT,\n letterForGroup,\n type Geom3DGroup,\n} from './editor/toolPanel/groups';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { useStampStore } from '../shared/useStampStore';\nimport {\n deserializeBoard3D,\n isGeometry3DCustomData,\n type Geometry3DCustomData,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport type { ToolKey } from './editor/tools/spec';\n\nconst Geom3DIconHeader = (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nfunction parseInitialState(data: unknown): State | null {\n if (!isGeometry3DCustomData(data)) return null;\n return deserializeBoard3D(data.jsonState);\n}\n\nexport const Geometry3DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Geometry3DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const editorRef = useRef<EditorPanelHandle | null>(null);\n const sceneStore = useStampStore('3d', editingElement, parseInitialState);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const [selectedTool, setSelectedTool] = useState<ToolKey>('move');\n const [showAxis, setShowAxis] = useState<boolean>(true);\n const [showGrid, setShowGrid] = useState<boolean>(true);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n const [selectedObjectId, setSelectedObjectId] = useState<string | undefined>(undefined);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n const handleObjectSelect = useCallback((id: string | null) => {\n setSelectedObjectId(id ?? undefined);\n editorRef.current?.highlight(id);\n }, []);\n\n const handleUndo = useCallback(() => editorRef.current?.undo(), []);\n const handleRedo = useCallback(() => editorRef.current?.redo(), []);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS_FLAT,\n onSelect: (key) => {\n setSelectedTool(key as ToolKey);\n editorRef.current?.setTool(key as ToolKey);\n },\n enabled: !isMobile,\n });\n\n const handleSelectTool = useCallback((k: ToolKey) => {\n setSelectedTool(k);\n editorRef.current?.setTool(k);\n }, []);\n\n const handleEditorInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Geometry3DCustomData => ({\n kind: 'geometry3d',\n version: 2,\n jsonState,\n }),\n editingElementId: editingElement?.id ?? null,\n preserveExistingSize: true,\n });\n onClose();\n },\n [api, editingElement, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <StampLeftPanel<ToolKey, Geom3DGroup>\n title=\"Hình học 3D\"\n icon={Geom3DIconHeader}\n onClose={onClose}\n isDark={isDark}\n testId=\"stamp-left-panel\"\n tools={TOOLS_FLAT}\n groupOrder={GROUP_ORDER}\n groupLabels={GROUP_LABELS}\n activeTool={selectedTool}\n onToolChange={handleSelectTool}\n view={{\n sectionLabel: 'Góc nhìn',\n showAxis,\n showGrid,\n onShowAxisChange: setShowAxis,\n onShowGridChange: setShowGrid,\n }}\n history={{\n onUndo: handleUndo,\n canUndo,\n onRedo: handleRedo,\n canRedo,\n }}\n chord={{ activeGroup: chordGroup, letterForGroup }}\n objects={{\n store: sceneStore,\n selectedObjectId,\n onObjectSelect: handleObjectSelect,\n }}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <EditorPanel\n ref={editorRef}\n isDark={isDark}\n onInsert={handleEditorInsert}\n onClose={onClose}\n store={sceneStore}\n selectedTool={selectedTool}\n onSelectedToolChange={setSelectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onHistoryChange={handleHistoryChange}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n withLeftPanel={!isMobile}\n />\n </>\n );\n },\n);\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport {\n isGeometry3DCustomData,\n type Geometry3DCustomData,\n} from './serialize';\nimport { renderGeometry3DSvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport { svgToStampFile } from '../shared/svgToStampFile';\n\nexport type { Geometry3DCustomData };\n\nconst Geometry3DStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.Geometry3DStampHost })),\n);\n\nconst Geometry3DIcon: ReactNode = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {/* Mặt trước */}\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n {/* Mặt trên */}\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n {/* Mặt phải */}\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nexport const geometry3dStamp: StampType<Geometry3DCustomData> = {\n kind: 'geometry3d',\n experimental: true,\n shortcutKey: 'd',\n toolbarLabel: 'D',\n toolbarTitle: 'Hình 3D (D)',\n toolbarIcon: Geometry3DIcon,\n toolbarTestId: 'stamp-toolbar-geometry3d',\n matchesCustomData: isGeometry3DCustomData,\n async renderSvgFromCustomData(data: unknown): Promise<string> {\n if (!isGeometry3DCustomData(data)) {\n throw new Error('geometry3dStamp.renderSvgFromCustomData: customData không phải geometry3d');\n }\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgString;\n },\n restoreFileFromCustomData: async (element): Promise<RestoredStampFile | null> => {\n const data = element.customData as Geometry3DCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId || !isGeometry3DCustomData(data)) return null;\n try {\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgToStampFile(svgString, fileId);\n } catch {\n return null;\n }\n },\n Host: Geometry3DStampHost,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/scene/types.ts","../src/core/scene/registry.ts","../src/core/scene/reducer.ts","../src/core/scene/store.ts","../src/core/scene/selectors.ts","../src/core/scene/hooks/useEditorState.ts","../src/core/scene/hooks/index.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/_label.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/expressions/parser.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/core/scene/kinds/index.ts","../src/core/scene/index.ts","../src/stamps/shared/serializeScene.ts","../src/stamps/geometry-3d/serialize.ts","../src/core/scene/render/types.ts","../src/core/scene/render/JxgRenderer3D.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/stamps/geometry-3d/editor/theme.ts","../src/stamps/shared/jxgOffscreenRender.ts","../src/stamps/geometry-3d/render.ts","../src/stamps/shared/svgToStampFile.ts","../src/stamps/geometry-3d/editor/tools/handlers/_ensurePoint.ts","../src/stamps/geometry-3d/editor/tools/handlers/point.ts","../src/stamps/geometry-3d/editor/tools/handlers/segment.ts","../src/stamps/geometry-3d/editor/tools/handlers/polygon.ts","../src/stamps/geometry-3d/editor/scene/constraintMath.ts","../src/stamps/geometry-3d/editor/scene/geometryChecks.ts","../src/stamps/geometry-3d/editor/tools/handlers/plane.ts","../src/stamps/geometry-3d/editor/tools/handlers/pyramid.ts","../src/stamps/geometry-3d/editor/tools/handlers/prism.ts","../src/stamps/geometry-3d/editor/tools/handlers/tetrahedron.ts","../src/stamps/geometry-3d/editor/tools/handlers/cube.ts","../src/stamps/geometry-3d/editor/tools/handlers/sphere.ts","../src/stamps/geometry-3d/editor/tools/handlers/cylinder.ts","../src/stamps/geometry-3d/editor/tools/handlers/cone.ts","../src/stamps/geometry-3d/editor/tools/handlers/derived.ts","../src/stamps/geometry-3d/editor/tools/handlers/construct3d.ts","../src/stamps/geometry-3d/editor/tools/spec.ts","../src/stamps/geometry-3d/editor/tools/controller.ts","../src/stamps/geometry-3d/editor/hitTest/rayCast.ts","../src/stamps/geometry-3d/editor/hitTest/intersect.ts","../src/stamps/geometry-3d/editor/hitTest/snapping.ts","../src/stamps/geometry-3d/editor/hitTest/hitTest.ts","../src/stamps/shared/safeJsx.ts","../src/stamps/shared/attachJxgWheelZoom.ts","../src/stamps/shared/initJxgBoard.ts","../src/stamps/geometry-3d/editor/MiniBoard3D.tsx","../src/stamps/geometry-3d/editor/preview3d.ts","../src/stamps/geometry-3d/editor/StatusHint.tsx","../src/stamps/geometry-3d/editor/usePointDrag.ts","../src/stamps/geometry-3d/editor/editorHelpers.ts","../src/stamps/shared/StampLeftPanel/constants.ts","../src/stamps/shared/Toast/ToastProvider.tsx","../src/stamps/shared/Toast/Toast.tsx","../src/stamps/shared/Toast/useToast.ts","../src/stamps/shared/Toast/ToastHost.tsx","../src/stamps/shared/Toast/index.ts","../src/stamps/geometry-3d/ai/deterministic/vocabulary3d.ts","../src/stamps/geometry-3d/ai/deterministic/coverage3d.ts","../src/stamps/geometry-3d/ai/intent.ts","../src/stamps/geometry-3d/ai/rules/_shared.ts","../src/stamps/geometry-3d/ai/rules/solid.ts","../src/stamps/geometry-3d/ai/rules/pointOnEdge.ts","../src/stamps/geometry-3d/ai/rules/planeNamed.ts","../src/stamps/geometry-3d/ai/rules/midpoint3d.ts","../src/stamps/geometry-3d/ai/rules/centroid3d.ts","../src/stamps/geometry-3d/ai/rules/intersectionLine.ts","../src/stamps/geometry-3d/ai/rules/crossSection.ts","../src/stamps/geometry-3d/ai/rules/crossSectionParallel.ts","../src/stamps/geometry-3d/ai/rules/linePlanePoint.ts","../src/stamps/geometry-3d/ai/rules/projectionFoot.ts","../src/stamps/geometry-3d/ai/rules/perpLineToPlane.ts","../src/stamps/geometry-3d/ai/rules/perpPlaneToLine.ts","../src/stamps/geometry-3d/ai/rules/angleLinePlane.ts","../src/stamps/geometry-3d/ai/rules/circumsphere.ts","../src/stamps/geometry-3d/ai/rules/insphereOfPyramid.ts","../src/stamps/geometry-3d/ai/rules/cone.ts","../src/stamps/geometry-3d/ai/rules/cylinder.ts","../src/stamps/geometry-3d/ai/rules/insphereCube.ts","../src/stamps/geometry-3d/ai/rules/inscribedRoundSolid.ts","../src/stamps/geometry-3d/ai/rules/registry.ts","../src/stamps/geometry-3d/ai/deterministic/runDeterministicIntents3d.ts","../src/stamps/geometry-3d/ai/intent-builders/_types.ts","../src/stamps/geometry-3d/ai/layout3d.ts","../src/stamps/geometry-3d/ai/intent-builders/solid.ts","../src/stamps/geometry-3d/ai/intent-builders/connect.ts","../src/stamps/geometry-3d/ai/intent-builders/addPoint3d.ts","../src/stamps/geometry-3d/ai/intent-builders/plane.ts","../src/stamps/geometry-3d/ai/intent-builders/line.ts","../src/stamps/geometry-3d/ai/crossSectionGeometry.ts","../src/stamps/geometry-3d/ai/intent-builders/crossSection.ts","../src/stamps/geometry-3d/ai/intent-builders/sphere.ts","../src/stamps/geometry-3d/ai/intent-builders/cone.ts","../src/stamps/geometry-3d/ai/intent-builders/cylinder.ts","../src/stamps/geometry-3d/ai/intent-builders/polygon.ts","../src/stamps/geometry-3d/ai/intent-builders/registry.ts","../src/stamps/geometry-3d/ai/intentTopo3d.ts","../src/stamps/geometry-3d/ai/intentToScene3d.ts","../src/stamps/geometry-3d/ai/verify3d.ts","../src/stamps/geometry-3d/ai/deterministic/guards3d.ts","../src/stamps/geometry-3d/ai/deterministic/tryDeterministicFigure3d.ts","../src/stamps/geometry-3d/ai/buildFigureIntent3d.ts","../src/stamps/geometry-3d/ai/handleGenerateFigure3d.ts","../src/stamps/geometry-3d/editor/EditorPanel.tsx","../src/core/scene/ui/LeftPanelShell.tsx","../src/core/scene/ui/kindMeta.ts","../src/core/scene/ui/ObjectRowMenu.tsx","../src/core/scene/ui/ObjectRow.tsx","../src/core/scene/ui/ObjectListPanel.tsx","../src/stamps/shared/StampLeftPanel/AxisGridSection.tsx","../src/stamps/shared/StampLeftPanel/types.ts","../src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts","../src/stamps/shared/StampLeftPanel/ToolGrid.tsx","../src/stamps/shared/StampLeftPanel/Desktop.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/shared/StampLeftPanel/Mobile.tsx","../src/stamps/shared/StampLeftPanel/index.tsx","../src/stamps/geometry-3d/editor/toolPanel/icons.tsx","../src/stamps/geometry-3d/editor/toolPanel/groups.ts","../src/stamps/shared/useChordShortcut.ts","../src/stamps/shared/insertImage.ts","../src/stamps/shared/useIsMobile.ts","../src/stamps/shared/useStampStore.ts","../src/stamps/geometry-3d/host.tsx","../src/stamps/geometry-3d/index.tsx"],"names":["def","sub","produce","React","z","dist","v","CURVED_SEGMENTS","init_d_constraint","init_types","R","scale","init_registry","tangent","constructionRefs","center","A","B","labels","poly","paletteFor","init_theme","init_point","init_segment","init_polygon","EPS","id","pointHits","sameExistingPoint","k","norm","dot","add","React2","MiniBoard3D","p","jsx","jsxs","React3","useReducer","useRef","useCallback","useEffect","useMemo","createContext","useContext","init_Toast","init_shared","SINGLE","DISTRIB","RE","CUE","OWNED_BY_FOOT","TARGET","INSCRIBED","init_cone","AXIAL","init_cylinder","SPHERE_CUE","CUBE","APEX","TETRA","coverage","init_solid","init_plane","init_line","normalize","cross","init_crossSection","buildSphere","init_sphere","buildCone","buildCylinder","buildPolygon","EditorPanel","React5","Fragment","React6","React7","React8","useState","createPortal","UndoIcon","RedoIcon","A_CODE","forwardRef","Geometry3DStampHost","useImperativeHandle","lazy"],"mappings":"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","file":"geometry-3d.js","sourcesContent":["// src/core/scene/types.ts\n\nexport type SceneObject<A = Record<string, unknown>> = {\n id: string;\n kind: string;\n label: string;\n visible: boolean;\n locked: boolean;\n layer: string;\n schemaVersion: number;\n attrs: A;\n};\n\n// View per domain — narrow theo `state.meta.domain`.\nexport type View2D = {\n readonly bbox: readonly [number, number, number, number]; // [xmin, ymax, xmax, ymin]\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\nexport type View3D = {\n readonly bbox3D: readonly [number, number, number, number, number, number]; // [xmin, xmax, ymin, ymax, zmin, zmax]\n readonly azimuth: number;\n readonly elevation: number;\n};\n\nexport type ViewGraph2D = {\n readonly xMin: number;\n readonly xMax: number;\n readonly yMin: number;\n readonly yMax: number;\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\n// Union of all view shapes — narrow qua state.meta.domain.\nexport type SceneView = View2D | View3D | ViewGraph2D;\n\n// Discriminated union: domain narrow → view shape narrow.\nexport type StateMeta =\n | { readonly domain: '2d'; readonly version: number; readonly view: View2D }\n | { readonly domain: '3d'; readonly version: number; readonly view: View3D }\n | { readonly domain: 'graph2d'; readonly version: number; readonly view: ViewGraph2D };\n\nexport type Domain = StateMeta['domain'];\n\n// Backward-compat alias: UPDATE_VIEW patch dùng graph-2d shape (chỉ graph-2d\n// dispatch action này hiện tại).\nexport type ViewSettings = ViewGraph2D;\n\nexport type State = {\n readonly objects: Readonly<Record<string, SceneObject>>;\n readonly order: readonly string[];\n readonly counter: number;\n readonly meta: StateMeta;\n};\n\nexport type Action =\n | { type: 'ADD'; payload: { obj: SceneObject } }\n | { type: 'UPDATE'; payload: { id: string; patch: Partial<Omit<SceneObject, 'id' | 'kind' | 'attrs'>> } }\n | { type: 'UPDATE_ATTRS'; payload: { id: string; patch: Record<string, unknown> } }\n | { type: 'DELETE'; payload: { id: string } }\n | { type: 'RESET' }\n | { type: 'LOAD'; payload: { state: State } }\n | { type: 'TRANSACTION'; payload: { actions: Action[] } }\n | { type: 'UPDATE_VIEW'; payload: { patch: Partial<ViewSettings> } };\n\nexport type RenderCtx = {\n jxg: unknown;\n resolveRef: (id: string) => unknown;\n defaults: Readonly<Record<string, unknown>>;\n /** Map tham số (parameter.label → parameter.value). Chỉ graph2d dùng. */\n paramMap?: Readonly<Record<string, number>>;\n /**\n * State SỐNG để render điểm PHÁI SINH 3D (point3d.render gọi\n * constraintToWorld(c, getState()) cho midpoint/centroid/intersection…).\n * Chỉ JxgRenderer3D cấp; 2D bỏ qua (điểm phái sinh 2D dùng JSXGraph native).\n */\n getState?: () => State;\n};\n\nexport type KindDef<A = Record<string, unknown>> = {\n type: string;\n schemaVersion: number;\n migrate: Record<number, (prev: any) => any>;\n validate?: (attrs: A) => void;\n dependsOn: (attrs: A) => string[];\n describe: (obj: SceneObject<A>, state?: State) => string;\n measure?: (obj: SceneObject<A>, state: State) =>\n | { label: string; value: number }[]\n | null;\n render: (obj: SceneObject<A>, ctx: RenderCtx) => unknown;\n update?: (\n obj: SceneObject<A>,\n prev: SceneObject<A>,\n ctx: RenderCtx,\n existing: unknown,\n ) => void;\n};\n\nexport const DEFAULT_VIEW_2D: View2D = {\n bbox: [-10, 10, 10, -10],\n showAxis: false,\n showGrid: false,\n};\n\nexport const DEFAULT_VIEW_3D: View3D = {\n bbox3D: [-5, 5, -5, 5, -5, 5],\n azimuth: 60,\n elevation: 30,\n};\n\nexport const DEFAULT_VIEW_GRAPH2D: ViewGraph2D = {\n xMin: -10, xMax: 10, yMin: -10, yMax: 10,\n showAxis: true, showGrid: true,\n};\n\n// EMPTY_STATE giữ shape '3d' (legacy default). Dùng `createEmptyState(domain)`\n// khi cần state cụ thể cho domain — đảm bảo meta.view khớp domain.\nexport const EMPTY_STATE: State = {\n objects: {},\n order: [],\n counter: 0,\n meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D },\n};\n\nexport function createEmptyState(domain: Domain): State {\n const base = { objects: {}, order: [], counter: 0 } as const;\n switch (domain) {\n case '2d':\n return { ...base, meta: { domain: '2d', version: 1, view: DEFAULT_VIEW_2D } };\n case '3d':\n return { ...base, meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D } };\n case 'graph2d':\n return { ...base, meta: { domain: 'graph2d', version: 1, view: DEFAULT_VIEW_GRAPH2D } };\n }\n}\n","// src/core/scene/registry.ts\nimport type { KindDef } from './types';\n\nconst registry = new Map<string, KindDef>();\n\nexport function registerKind<A = Record<string, unknown>>(def: KindDef<A>): void {\n if (registry.has(def.type)) {\n console.warn(`[scene] kind \"${def.type}\" đã được đăng ký — ghi đè định nghĩa cũ`);\n }\n registry.set(def.type, def as unknown as KindDef);\n}\n\nexport function getKind(type: string): KindDef {\n const def = registry.get(type);\n if (!def) throw new Error(`[scene] unknown kind: ${type}`);\n return def;\n}\n\nexport function listKinds(): KindDef[] {\n return Array.from(registry.values());\n}\n\n// Chỉ dùng cho test — reset registry giữa các test case.\nexport function __clearRegistryForTests(): void {\n registry.clear();\n}\n","// src/core/scene/reducer.ts\nimport type { Draft } from 'immer';\nimport type { Action, State, SceneObject } from './types';\nimport { getKind } from './registry';\n\nfunction collectDependents(state: Draft<State> | State, rootId: string): Set<string> {\n const dependents = new Set<string>([rootId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of Object.values(state.objects) as SceneObject[]) {\n if (dependents.has(obj.id)) continue;\n let kindDef;\n try { kindDef = getKind(obj.kind); } catch { continue; }\n const refs = kindDef.dependsOn(obj.attrs as never);\n if (refs.some(r => dependents.has(r))) {\n dependents.add(obj.id);\n grew = true;\n }\n }\n }\n return dependents;\n}\n\nexport function reduce(draft: Draft<State>, action: Action): void {\n switch (action.type) {\n case 'ADD': {\n const { obj } = action.payload;\n if (draft.objects[obj.id]) throw new Error(`[scene] id \"${obj.id}\" đã tồn tại`);\n const kindDef = getKind(obj.kind);\n kindDef.validate?.(obj.attrs as never);\n draft.objects[obj.id] = obj;\n draft.order.push(obj.id);\n draft.counter += 1;\n return;\n }\n case 'UPDATE': {\n const { id, patch } = action.payload;\n const obj = draft.objects[id];\n if (!obj) return;\n Object.assign(obj, patch);\n return;\n }\n case 'UPDATE_ATTRS': {\n const { id, patch } = action.payload;\n const obj = draft.objects[id];\n if (!obj) return;\n const kindDef = getKind(obj.kind);\n const nextAttrs = { ...(obj.attrs as object), ...patch };\n kindDef.validate?.(nextAttrs as never);\n obj.attrs = nextAttrs;\n return;\n }\n case 'DELETE': {\n const { id } = action.payload;\n if (!draft.objects[id]) return;\n const toDelete = collectDependents(draft, id);\n for (const delId of toDelete) {\n delete draft.objects[delId];\n }\n draft.order = draft.order.filter(x => !toDelete.has(x));\n return;\n }\n case 'RESET': {\n draft.objects = {};\n draft.order = [];\n draft.counter = 0;\n return;\n }\n case 'LOAD': {\n const { state } = action.payload;\n draft.objects = { ...state.objects };\n draft.order = [...state.order];\n draft.counter = state.counter;\n // Cast qua Draft<State['meta']> — immer chấp nhận structurally\n // identical shape, chỉ stricter readonly.\n draft.meta = { ...state.meta } as typeof draft.meta;\n return;\n }\n case 'TRANSACTION': {\n for (const sub of action.payload.actions) {\n reduce(draft, sub);\n }\n return;\n }\n case 'UPDATE_VIEW': {\n // Action payload typed cho graph-2d ViewSettings. Bỏ qua nếu domain\n // khác (view shape không tương thích — 2d dùng bbox, 3d dùng bbox3D).\n if (draft.meta.domain !== 'graph2d') return;\n Object.assign(draft.meta.view, action.payload.patch);\n return;\n }\n }\n}\n","// src/core/scene/store.ts\nimport { produce } from 'immer';\nimport { reduce } from './reducer';\nimport type { Action, State } from './types';\n\nexport type StoreListener = (next: State, prev: State, action: Action) => void;\n\nexport interface Store {\n getState(): State;\n dispatch(action: Action): void;\n subscribe(listener: StoreListener): () => void;\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n transaction(fn: (dispatch: (a: Action) => void) => void): void;\n withoutHistory(fn: () => void): void;\n}\n\nexport type StoreOptions = { historyLimit?: number };\n\nconst HISTORY_DEFAULT = 100;\n\nconst UNDO_ACTION: Action = { type: 'TRANSACTION', payload: { actions: [] } };\nconst REDO_ACTION: Action = { type: 'TRANSACTION', payload: { actions: [] } };\n\nexport function createStore(initial: State, options: StoreOptions = {}): Store {\n const limit = options.historyLimit ?? HISTORY_DEFAULT;\n let state = initial;\n const past: State[] = [];\n const future: State[] = [];\n const listeners = new Set<StoreListener>();\n let dispatching = false;\n let suspendHistory = false;\n let transactionActions: Action[] | null = null;\n\n function notify(prev: State, action: Action): void {\n listeners.forEach(l => l(state, prev, action));\n }\n\n function pushHistory(prev: State): void {\n if (suspendHistory) return;\n past.push(prev);\n if (past.length > limit) past.shift();\n future.length = 0;\n }\n\n function applyAction(action: Action): void {\n const prev = state;\n state = produce(state, draft => { reduce(draft, action); });\n if (state !== prev) {\n pushHistory(prev);\n notify(prev, action);\n }\n }\n\n return {\n getState: () => state,\n\n dispatch(action: Action) {\n if (dispatching) throw new Error('[scene] không được dispatch trong subscriber');\n if (transactionActions) {\n transactionActions.push(action);\n return;\n }\n dispatching = true;\n try { applyAction(action); } finally { dispatching = false; }\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n\n undo() {\n const prev = past.pop();\n if (!prev) return;\n future.push(state);\n const old = state;\n state = prev;\n notify(old, UNDO_ACTION);\n },\n\n redo() {\n const next = future.pop();\n if (!next) return;\n past.push(state);\n if (past.length > limit) past.shift();\n const old = state;\n state = next;\n notify(old, REDO_ACTION);\n },\n\n canUndo: () => past.length > 0,\n canRedo: () => future.length > 0,\n\n transaction(fn) {\n if (transactionActions) throw new Error('[scene] transaction lồng nhau không hỗ trợ');\n transactionActions = [];\n try { fn((a) => { transactionActions!.push(a); }); }\n finally {\n const actions = transactionActions;\n transactionActions = null;\n if (actions.length > 0) {\n applyAction({ type: 'TRANSACTION', payload: { actions } });\n }\n }\n },\n\n withoutHistory(fn) {\n const prevSuspend = suspendHistory;\n suspendHistory = true;\n try { fn(); } finally { suspendHistory = prevSuspend; }\n },\n };\n}\n","// 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/hooks/index.ts\nexport { useSceneStore } from './useSceneStore';\nexport type { SceneStoreApi } from './useSceneStore';\nexport { useEditorState } from './useEditorState';\nexport type { UseEditorStateOptions } from './useEditorState';\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","// src/core/scene/kinds/_label.ts\n/** Offset nhãn (pixel) so với anchor. offset[1] dương = nhãn đi lên (quy ước JSXGraph). */\nexport type LabelOffset = [number, number];\n\n/**\n * Opts cho `label` của một JSXGraph element: luôn `fixed:false` (kéo được).\n * `labelOffset` (nếu có) hoặc `dflt` (nếu có) thành `offset`. Không có cả hai\n * → chỉ `{ fixed:false }` (giữ default JSXGraph, byte-identical với hiện tại\n * cho line/circle vốn không set offset).\n */\nexport function labelOpts(\n labelOffset?: LabelOffset,\n dflt?: LabelOffset,\n): { label: Record<string, unknown> } {\n const offset = labelOffset ?? dflt;\n return { label: { fixed: false, ...(offset ? { offset } : {}) } };\n}\n\n/**\n * Đọc offset-tổng (pixel) của một label JSXGraph sau khi user kéo, quy về dạng\n * thuần `offset` (để zero relativeCoords mà vị trí không đổi):\n * x = offset[0] + rel.scrCoords[1]\n * y = offset[1] - rel.scrCoords[2] (screen-y xuống, offset-y lên)\n * Trả null nếu thiếu dữ liệu.\n */\nexport function readLabelOffset(label: {\n evalVisProp?: (k: string) => unknown;\n visProp?: { offset?: number[] };\n relativeCoords?: { scrCoords?: number[] };\n}): LabelOffset | null {\n const off = (label.evalVisProp?.('offset') as number[] | undefined) ?? label.visProp?.offset;\n const rel = label.relativeCoords?.scrCoords;\n if (!off || !rel || off.length < 2 || rel.length < 3) return null;\n return [Math.round(off[0] + rel[1]), Math.round(off[1] - rel[2])];\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/expressions/parser.ts\n// Pure expression parser cho function2d kind. Không import JSXGraph/React.\n\nexport const ALLOWED_CONSTANTS = ['pi', 'e'] as const;\nexport const ALLOWED_FUNCTIONS = [\n 'sin', 'cos', 'tan',\n 'asin', 'acos', 'atan', 'atan2',\n 'sinh', 'cosh', 'tanh',\n 'exp', 'log', 'log10', 'ln',\n 'sqrt', 'cbrt', 'abs',\n 'floor', 'ceil', 'round',\n 'min', 'max', 'pow',\n] as const;\n\nconst ID_RE = /[A-Za-z_][A-Za-z0-9_]*/g;\nconst UNSAFE_RE = /[=;{}]|\\beval\\b|\\bnew\\b|\\breturn\\b|\\bthis\\b|\\bwindow\\b|\\bdocument\\b|\\bglobal\\b|\\bprocess\\b/;\n\nconst NUMBER_RE = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/;\n\nexport type ValidateResult = { ok: true } | { ok: false; error: string };\n\n// Detect identifiers used as function calls (followed by '(')\nconst FUNC_CALL_RE = /([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/g;\n\n/** Kiểm tra expression có hợp lệ không. */\nexport function validate(expression: string): ValidateResult {\n const trimmed = expression.trim();\n if (!trimmed) return { ok: false, error: 'Biểu thức rỗng' };\n if (UNSAFE_RE.test(trimmed)) return { ok: false, error: 'Biểu thức chứa toán tử hoặc identifier không cho phép' };\n\n // Replace ^ với ** (JS không có ^)\n const jsExpr = trimmed.replace(/\\^/g, '**');\n\n // Check function call identifiers — must be in ALLOWED_FUNCTIONS\n let fm: RegExpExecArray | null;\n FUNC_CALL_RE.lastIndex = 0;\n while ((fm = FUNC_CALL_RE.exec(jsExpr)) !== null) {\n const fnName = fm[1];\n if (!(ALLOWED_FUNCTIONS as readonly string[]).includes(fnName)) {\n return { ok: false, error: `Hàm không hợp lệ: ${fnName}` };\n }\n }\n\n // Check identifiers\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(jsExpr)) !== null) ids.add(m[0]);\n\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n // Remaining identifiers treat as parameter — OK at validate time.\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(id)) {\n return { ok: false, error: `Identifier không hợp lệ: ${id}` };\n }\n }\n\n // Try syntactic compile (with dummy params) to catch syntax errors.\n try {\n buildFunctionBody(jsExpr, Array.from(ids).filter(\n (id) => id !== 'x' && !(ALLOWED_CONSTANTS as readonly string[]).includes(id) && !(ALLOWED_FUNCTIONS as readonly string[]).includes(id),\n ));\n } catch (err) {\n return { ok: false, error: `Cú pháp lỗi: ${(err as Error).message}` };\n }\n\n return { ok: true };\n}\n\n/**\n * Compile expression thành function (x: number) => number.\n * - `params` map từ identifier → value để inline vào closure.\n * - Trả string error nếu invalid.\n */\nexport function compile(\n expression: string,\n params: Record<string, number>,\n): ((x: number) => number) | string {\n const v = validate(expression);\n if (!v.ok) return v.error;\n const jsExpr = expression.trim().replace(/\\^/g, '**');\n\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(jsExpr)) !== null) ids.add(m[0]);\n\n const paramNames: string[] = [];\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n paramNames.push(id);\n }\n\n try {\n const body = buildFunctionBody(jsExpr, paramNames);\n \n const fn = new Function('x', ...paramNames, body) as (\n x: number,\n ...args: number[]\n ) => number;\n const args = paramNames.map((name) => params[name] ?? NaN);\n return (x: number) => fn(x, ...args);\n } catch (err) {\n return `Compile error: ${(err as Error).message}`;\n }\n}\n\nfunction buildFunctionBody(jsExpr: string, _paramNames: string[]): string {\n // Inline Math constants and functions.\n // sin → Math.sin, pi → Math.PI, e → Math.E, ln → Math.log.\n let body = jsExpr;\n body = body.replace(/\\bln\\b/g, 'Math.log');\n body = body.replace(/\\blog\\b/g, 'Math.log10');\n body = body.replace(/\\bpi\\b/g, '(Math.PI)');\n body = body.replace(/\\be\\b(?!\\w)/g, '(Math.E)');\n for (const fn of ALLOWED_FUNCTIONS) {\n if (fn === 'log' || fn === 'log10') continue; // already handled\n body = body.replace(new RegExp(`\\\\b${fn}\\\\b`, 'g'), `Math.${fn}`);\n }\n return `\"use strict\"; return (${body});`;\n}\n\n/** Liệt kê free identifiers (≠ x, ≠ allowed const/func). */\nexport function collectFreeVars(expression: string): string[] {\n const v = validate(expression);\n if (!v.ok) return [];\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(expression)) !== null) ids.add(m[0]);\n const out: string[] = [];\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n if (NUMBER_RE.test(id)) continue;\n out.push(id);\n }\n return out.sort();\n}\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","// src/core/scene/kinds/index.ts\nimport './point3d';\nimport './segment3d';\nimport './line3d';\nimport './ray3d';\nimport './vector3d';\nimport './plane3d';\nimport './polygon3d';\nimport './sphere3d';\nimport './polyhedron3d';\nimport './cylinder3d';\nimport './cone3d';\nimport './point';\nimport './segment';\nimport './line';\nimport './ray';\nimport './vector';\nimport './circle';\nimport './arc';\nimport './sector';\nimport './polygon';\nimport './intersection';\nimport './angle';\nimport './distance';\nimport './function2d';\nimport './parameter';\nimport './pointOnCurve';\nimport './tangent2d';\nimport './extremum2d';\nimport './root2d';\nimport './slope2d';\nexport {};\n","// src/core/scene/index.ts\nexport type {\n SceneObject,\n State,\n StateMeta,\n Domain,\n SceneView,\n View2D,\n View3D,\n ViewGraph2D,\n ViewSettings,\n Action,\n KindDef,\n RenderCtx,\n} from './types';\nexport {\n EMPTY_STATE,\n DEFAULT_VIEW_2D,\n DEFAULT_VIEW_3D,\n DEFAULT_VIEW_GRAPH2D,\n createEmptyState,\n} from './types';\nexport { createStore } from './store';\nexport type { Store, StoreListener, StoreOptions } from './store';\nexport { reduce } from './reducer';\nexport { registerKind, getKind, listKinds } from './registry';\nexport { listObjects, byKind, dependentsOf, nextLabel } from './selectors';\nexport { migrateState } from './migrations/runMigrations';\nexport { registerStateMigration, CURRENT_STATE_VERSION } from './migrations/state';\n\nexport { useSceneStore, useEditorState } from './hooks';\nexport type { SceneStoreApi, UseEditorStateOptions } from './hooks';\n\n// IMPORTANT: import kinds barrel để side-effect register chạy.\nimport './kinds';\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","// src/stamps/geometry-3d/serialize.ts\n//\n// Sau Tier D PR 3: customData.jsonState chỉ chứa `JSON.stringify(state)`.\n// View info (bbox3D/azimuth/elevation) nằm trong `state.meta.view` (View3D shape).\n//\n// Type guard `isGeometry3DCustomData` giữ ở đây để index.tsx + host import từ\n// 1 chỗ.\n\nimport { serializeScene, deserializeScene } from '../shared/serializeScene';\nimport type { State, View3D } from '../../core/scene';\nimport type { BaseStampCustomData } from '../shared/types';\n\nexport interface Geometry3DCustomData extends BaseStampCustomData {\n kind: 'geometry3d';\n version: 2;\n jsonState: string;\n}\n\nexport function isGeometry3DCustomData(data: unknown): data is Geometry3DCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<Geometry3DCustomData>;\n return (\n d.kind === 'geometry3d' &&\n d.version === 2 &&\n typeof d.jsonState === 'string'\n );\n}\n\nexport function serializeBoard3D(state: State, view: View3D): string {\n const withView: State = {\n ...state,\n meta: { domain: '3d', version: state.meta.version, view },\n };\n return serializeScene(withView);\n}\n\nexport function deserializeBoard3D(raw: string): State {\n return deserializeScene('3d', raw);\n}\n","// src/core/scene/render/types.ts\nimport type { RenderCtx } from '../types';\n\nexport type Theme3D = {\n point: { size: number; color: string };\n line: { strokeWidth: number; color: string };\n plane: { fillOpacity: number; color: string };\n};\n\nexport const DEFAULT_THEME_3D: Theme3D = {\n point: { size: 4, color: '#1e40af' },\n line: { strokeWidth: 2, color: '#0f172a' },\n plane: { fillOpacity: 0.15, color: '#60a5fa' },\n};\n\nexport type RenderCtx3D = RenderCtx & {\n theme: Theme3D;\n};\n","// src/core/scene/render/JxgRenderer3D.ts\nimport type { Store } from '../store';\nimport type { State, SceneObject, RenderCtx } from '../types';\nimport { getKind } from '../registry';\nimport { DEFAULT_THEME_3D, type Theme3D } from './types';\n\nexport type JxgRenderer3DOptions = { theme?: Theme3D };\n\nexport class JxgRenderer3D {\n private view: unknown;\n private store: Store;\n private theme: Theme3D;\n private elements = new Map<string, unknown>();\n private unsubscribe: () => void;\n private disposed = false;\n\n constructor(store: Store, view: unknown, options: JxgRenderer3DOptions = {}) {\n this.store = store;\n this.view = view;\n this.theme = options.theme ?? DEFAULT_THEME_3D;\n // Subscribe first, then render current state.\n this.unsubscribe = store.subscribe((next, prev) => this.applyDiff(prev, next));\n // Render initial state (e.g. if LOAD ran before subscribe).\n this.applyDiff(undefined, store.getState());\n }\n\n private ctx(): RenderCtx {\n return {\n jxg: this.view,\n resolveRef: (id: string) => {\n const el = this.elements.get(id);\n if (el === undefined) {\n throw new Error(`[scene] resolveRef: chưa render id=\"${id}\"`);\n }\n return el;\n },\n defaults: {},\n // State sống cho điểm phái sinh 3D (constraintToWorld đọc toạ độ gốc hiện tại).\n getState: () => this.store.getState(),\n };\n }\n\n private create(obj: SceneObject): void {\n try {\n const def = getKind(obj.kind);\n const el = def.render(obj, this.ctx());\n this.elements.set(obj.id, el);\n } catch (err) {\n console.warn(`[scene/render] không render được ${obj.kind} id=\"${obj.id}\":`, err);\n }\n }\n\n private remove(id: string): void {\n // Selection halo phải bị xoá TRƯỚC element gốc (halo tham chiếu parent).\n this.removeHalo(id);\n this.selectedIds.delete(id);\n const el = this.elements.get(id);\n if (el === undefined) return;\n try {\n this.removeFromView(el);\n } catch (err) {\n console.warn(`[scene/render] không remove được id=\"${id}\":`, err);\n }\n this.elements.delete(id);\n }\n\n private removeFromView(el: unknown): void {\n const view = this.view as { removeObject?: (e: unknown) => void };\n if (el && typeof el === 'object') {\n const asObj = el as Record<string, unknown>;\n // Composite shape: { faces: [] } for polyhedron/cylinder/cone.\n if (Array.isArray(asObj['faces'])) {\n for (const face of asObj['faces'] as unknown[]) {\n view.removeObject?.(face);\n }\n // Also remove hidden vertex points if present (_verts).\n if (Array.isArray(asObj['_verts'])) {\n for (const v of asObj['_verts'] as unknown[]) {\n view.removeObject?.(v);\n }\n }\n return;\n }\n view.removeObject?.(el);\n // Mặt PHÁI SINH (plane3d construction, render bằng [point, dir1, dir2] điểm-\n // hàm): JSXGraph createPlane3D tạo internal anchor point3d (_is_new) làm gốc\n // NHƯNG KHÔNG adopt làm child (khác createLine3D có guard _is_new) →\n // removeObject(plane) bỏ sót anchor → orphan đọc state-sống MỖI FRAME, tích\n // luỹ qua mỗi remove+recreate. Dọn thủ công; CHỈ point `_is_new` (KHÔNG đụng\n // điểm scene thật của mặt 3-điểm — anchor đó không _is_new). Verify adversarial 2026-06-21.\n const anchor = asObj['point'] as Record<string, unknown> | undefined;\n if (anchor && typeof anchor === 'object' && anchor['_is_new'] === true) {\n view.removeObject?.(anchor);\n }\n return;\n }\n view.removeObject?.(el);\n }\n\n private applyDiff(prev: State | undefined, next: State): void {\n if (this.disposed) return;\n const prevObjs = prev?.objects ?? {};\n const nextObjs = next.objects;\n\n // Remove ids that disappeared (iterate in order of prev to respect dependencies).\n for (const id of Object.keys(prevObjs)) {\n if (!(id in nextObjs)) {\n this.remove(id);\n }\n }\n\n // Add or update in next.order (preserves dependency order).\n for (const id of next.order) {\n const cur = nextObjs[id] as SceneObject | undefined;\n if (!cur) continue;\n const old = prevObjs[id] as SceneObject | undefined;\n if (!old) {\n // New object.\n this.create(cur);\n continue;\n }\n if (Object.is(old, cur)) {\n // Unchanged (same Immer reference).\n continue;\n }\n // Changed: try update hook, otherwise remove + recreate.\n let def;\n try { def = getKind(cur.kind); } catch { continue; }\n const existing = this.elements.get(id);\n if (def.update && existing !== undefined) {\n try {\n def.update(cur, old, this.ctx(), existing);\n continue;\n } catch (err) {\n console.warn(`[scene/render] update fail, recreate id=\"${id}\":`, err);\n }\n }\n this.remove(id);\n this.create(cur);\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.unsubscribe();\n this.disposed = true;\n for (const id of Array.from(this.elements.keys())) {\n this.remove(id);\n }\n }\n\n listElements(): Map<string, unknown> {\n return this.elements;\n }\n\n // Selection halo overlay (3D): multi-select, halo phía sau element gốc cho\n // các kind đơn giản (point3d, segment/line/ray/vector). Các composite shape\n // (polyhedron/cone/cylinder/plane) chưa hỗ trợ halo overlay — bỏ qua.\n private selectedIds: Set<string> = new Set();\n private haloMap: Map<string, unknown[]> = new Map();\n\n highlight(ids: string | string[] | null): void {\n if (this.disposed) return;\n const newIds = new Set<string>(\n ids == null ? [] : Array.isArray(ids) ? ids : [ids],\n );\n for (const id of this.selectedIds) {\n if (!newIds.has(id)) this.removeHalo(id);\n }\n for (const id of newIds) {\n if (!this.selectedIds.has(id) && this.elements.has(id)) this.addHalo(id);\n }\n this.selectedIds = newIds;\n try {\n (this.view as { update?: () => void }).update?.();\n } catch { /* ignore */ }\n }\n\n private removeHalo(id: string): void {\n const halos = this.haloMap.get(id);\n if (!halos) return;\n const view = this.view as { removeObject?: (e: unknown) => void };\n for (const h of halos) {\n try { view.removeObject?.(h); } catch { /* ignore */ }\n }\n this.haloMap.delete(id);\n }\n\n private addHalo(id: string): void {\n const el = this.elements.get(id) as\n | {\n elType?: string;\n getAttribute?: (k: string) => unknown;\n point1?: unknown;\n point2?: unknown;\n element2D?: { X?: () => number; Y?: () => number };\n }\n | undefined;\n if (!el) return;\n const view = this.view as {\n create?: (kind: string, parents: unknown[], attrs?: unknown) => unknown;\n };\n if (!view.create) return;\n\n const SEL_STROKE = '#475569';\n const SEL_FILL = '#cbd5e1';\n const haloBase = {\n strokeColor: SEL_STROKE,\n strokeOpacity: 0.55,\n fillColor: SEL_FILL,\n fillOpacity: 0.3,\n fixed: true,\n withLabel: false,\n name: '',\n highlight: false,\n needsRegularUpdate: true,\n };\n const halos: unknown[] = [];\n try {\n switch (el.elType) {\n case 'point3d': {\n // 3D point: tạo point3d ở cùng coords với size to + gray. Lấy coords\n // qua element2D.X/Y (JSXGraph 3D nội bộ chiếu xuống 2D plane), nhưng\n // an toàn nhất là reference element gốc và đọc Z() / coords() runtime.\n const elAny = el as unknown as {\n X?: () => number; Y?: () => number; Z?: () => number;\n getAttribute?: (k: string) => unknown;\n };\n const baseSize = (elAny.getAttribute?.('size') as number | undefined) ?? 4;\n if (typeof elAny.X === 'function' && typeof elAny.Y === 'function' && typeof elAny.Z === 'function') {\n const halo = view.create('point3d', [\n () => elAny.X?.() ?? 0,\n () => elAny.Y?.() ?? 0,\n () => elAny.Z?.() ?? 0,\n ], {\n ...haloBase,\n size: baseSize + 6,\n face: 'o',\n strokeWidth: 2,\n strokeOpacity: 0.75,\n fillOpacity: 0.25,\n });\n halos.push(halo);\n }\n break;\n }\n case 'line3d': {\n if (el.point1 && el.point2) {\n const halo = view.create('line3d', [el.point1, el.point2], {\n ...haloBase,\n strokeWidth: 9,\n straightFirst: (el.getAttribute?.('straightFirst') as boolean | undefined) ?? false,\n straightLast: (el.getAttribute?.('straightLast') as boolean | undefined) ?? false,\n });\n halos.push(halo);\n }\n break;\n }\n default:\n // Composite/plane/sphere/cone/cylinder/polygon3d/polyhedron3d:\n // halo overlay khó (composite faces, depth ordering) — bỏ qua.\n // Selection visible qua ObjectListPanel row highlight thay vì\n // halo trên canvas.\n break;\n }\n } catch (err) {\n console.warn('[scene/render/3d] halo create fail:', err);\n }\n if (halos.length) this.haloMap.set(id, halos);\n }\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Dùng `Theme2D` từ `core/scene/render/types2d` (cùng abstraction graph-2d).\n// JxgRenderer nhận theme qua constructor options và phân phối qua RenderCtx\n// đến mỗi kind handler — không cần sentinel string trong attrs nữa.\n\nimport { type Theme2D } from '../../../core/scene/render/types2d';\n\nexport const themeStroke = (dark: boolean): string => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean): string => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean): string => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean): string => (dark ? '#e2e8f0' : '#000000');\n\nexport function paletteFor(isDark: boolean): Theme2D {\n const stroke = themeStroke(isDark);\n return {\n stroke,\n fill: '#60a5fa',\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n // Geometry-2d điểm fill = stroke color (đồng bộ chấm điểm với nét vẽ).\n pointFill: stroke,\n };\n}\n","import {\n paletteFor as palette2D,\n} from '../../geometry-2d/editor/theme';\nimport type { Theme2D } from '../../../core/scene/render/types2d';\n\nexport type Geom3DPalette = Theme2D & {\n view3dBg: string;\n axisX: string;\n axisY: string;\n axisZ: string;\n};\n\nexport function paletteFor(isDark: boolean): Geom3DPalette {\n const base = palette2D(isDark);\n return {\n ...base,\n view3dBg: isDark ? '#1a1a1a' : '#ffffff',\n axisX: '#d63b3b',\n axisY: '#2d8a2d',\n axisZ: '#2d6dd6',\n };\n}\n\nexport const DEFAULT_VIEW3D: {\n azimuth: number;\n elevation: number;\n bbox3D: [number, number, number, number, number, number];\n} = {\n azimuth: 0.7,\n elevation: 0.4,\n bbox3D: [-3, -3, -3, 3, 3, 3],\n};\n\nexport const VIEW3D_ATTRS = (isDark: boolean) => {\n const p = paletteFor(isDark);\n const axisLabel = (color: string) => ({\n strokeColor: color,\n fontSize: 14,\n offset: [10, 0] as [number, number],\n });\n return {\n az: { slider: { visible: false }, point2: { visible: false } },\n el: { slider: { visible: false } },\n projection: 'central' as const,\n // GeoGebra-style: axes pass through origin (0,0,0) instead of bbox border.\n axesPosition: 'center' as const,\n xAxis: {\n strokeColor: p.axisX,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'x',\n withLabel: true,\n label: axisLabel(p.axisX),\n },\n yAxis: {\n strokeColor: p.axisY,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'y',\n withLabel: true,\n label: axisLabel(p.axisY),\n },\n zAxis: {\n strokeColor: p.axisZ,\n strokeWidth: 2,\n lastArrow: { type: 2, size: 8 },\n name: 'z',\n withLabel: true,\n label: axisLabel(p.axisZ),\n },\n // GeoGebra-style: hide ALL bbox wall planes; the XY ground plane is drawn\n // explicitly at z=0 via the helper below (so it coincides with Ox/Oy).\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: false, mesh3d: { visible: false } },\n };\n};\n\nexport const GROUND_PLANE_ATTRS = (isDark: boolean) => ({\n fillColor: isDark ? '#2a2a2a' : '#e6e6e6',\n fillOpacity: isDark ? 0.5 : 0.55,\n strokeColor: isDark ? '#3a3a3a' : '#cfcfcf',\n strokeOpacity: 0.7,\n strokeWidth: 1,\n fixed: true,\n highlight: false,\n withLabel: false,\n layer: 0,\n});\n\n/** XY ground plane extent (square around origin in user units). */\nexport const GROUND_PLANE_RANGE: [number, number] = [-3, 3];\n","/**\n * Shared offscreen JSXGraph render pipeline.\n *\n * Each JSXGraph stamp (geometry-2d, geometry-3d, graph-2d) needs the same\n * boilerplate to dump SVG offscreen: lazy import JSXGraph, create a hidden\n * DIV with explicit pixel dimensions, initBoard, attach a scene-store renderer\n * (or create a view3d), force update, clone the SVG node, add xmlns, serialize,\n * then tear everything down. This helper owns that lifecycle so each stamp\n * only writes the unique part — what to render — inside `setup`.\n *\n * Intrinsic SVG resolution matters: Excalidraw loads stamp SVGs via <img> then\n * drawImage onto canvas. The browser rasterizes SVG at its intrinsic\n * width/height, so dims passed here should be generous enough that the bitmap\n * downscales (sharp) instead of upscales (blurry) when the user zooms or views\n * on a retina display.\n */\n \ntype JxgModule = any;\n\nexport interface JxgOffscreenRenderOpts {\n /** JSXGraph bounding box: [xmin, ymax, xmax, ymin]. */\n bbox: [number, number, number, number];\n /** Offscreen container size in CSS pixels. Becomes SVG intrinsic size. */\n dims: { width: number; height: number };\n axis?: boolean;\n grid?: boolean;\n keepAspectRatio?: boolean;\n /** Mutate JXG.Options before initBoard (e.g. text.display='internal', palette). */\n applyOptions?: (JXG: JxgModule) => void;\n /**\n * Build the scene on the board. Return a disposable (typically the\n * `JxgRenderer` or `JxgRenderer3D` instance) — its `dispose()` is invoked\n * during teardown before `freeBoard`.\n */\n setup: (board: unknown, JXG: JxgModule) => { dispose: () => void } | Promise<{ dispose: () => void }>;\n /** Optional mutation on the cloned <svg> before serialization. */\n postProcessSvg?: (clone: SVGElement) => void;\n}\n\nexport interface JxgOffscreenRenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nexport async function renderJsxgOffscreen(\n opts: JxgOffscreenRenderOpts,\n): Promise<JxgOffscreenRenderResult> {\n const { bbox, dims, axis = false, grid = false, keepAspectRatio = true } = opts;\n const JXG: JxgModule = (await import('jsxgraph')).default;\n\n if (opts.applyOptions) {\n try {\n opts.applyOptions(JXG);\n } catch {\n /* swallow option-apply errors */\n }\n }\n\n const containerId =\n 'jxg_offscreen_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\n const container = document.createElement('div');\n container.id = containerId;\n container.style.cssText =\n `position:absolute;top:-99999px;left:-99999px;` +\n `width:${dims.width}px;height:${dims.height}px;` +\n `visibility:hidden;pointer-events:none;`;\n document.body.appendChild(container);\n\n let board: unknown = null;\n let disposable: { dispose: () => void } | null = null;\n try {\n board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: bbox,\n axis,\n grid,\n keepAspectRatio,\n showCopyright: false,\n showNavigation: false,\n });\n disposable = await opts.setup(board, JXG);\n try {\n \n (board as any)?.update?.();\n } catch {\n /* ignore — board may already be in valid state */\n }\n\n const svgEl = container.querySelector('svg');\n if (!svgEl) throw new Error('renderJsxgOffscreen: no SVG produced by JSXGraph');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n if (opts.postProcessSvg) opts.postProcessSvg(clone);\n const svgString = new XMLSerializer().serializeToString(clone);\n return { svgString, width: dims.width, height: dims.height };\n } finally {\n try {\n disposable?.dispose();\n } catch {\n /* ignore */\n }\n try {\n if (board) JXG.JSXGraph.freeBoard(board);\n } catch {\n /* ignore */\n }\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","\"use client\";\n\nimport { deserializeBoard3D } from './serialize';\nimport { createStore } from '../../core/scene';\nimport { DEFAULT_VIEW_3D, type View3D } from '../../core/scene/types';\nimport { JxgRenderer3D } from '../../core/scene/render/JxgRenderer3D';\nimport { GROUND_PLANE_ATTRS, GROUND_PLANE_RANGE, VIEW3D_ATTRS } from './editor/theme';\nimport { renderJsxgOffscreen } from '../shared/jxgOffscreenRender';\n\nexport interface RenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nconst OUTPUT_WIDTH = 1024;\nconst OUTPUT_HEIGHT = 768;\nconst BBOX_2D: [number, number, number, number] = [-6, 6, 6, -6];\n\n \ntype JxgObj = any;\n\nexport async function renderGeometry3DSvgFromState(jsonState: string): Promise<RenderResult> {\n const state = deserializeBoard3D(jsonState);\n const view3DInfo: View3D = state.meta.domain === '3d' ? state.meta.view : DEFAULT_VIEW_3D;\n\n const { svgString } = await renderJsxgOffscreen({\n bbox: BBOX_2D,\n dims: { width: OUTPUT_WIDTH, height: OUTPUT_HEIGHT },\n axis: false,\n grid: false,\n keepAspectRatio: true,\n applyOptions: (JXG) => {\n JXG.Options.text.display = 'internal';\n },\n setup: (board) => {\n const baseAttrs = VIEW3D_ATTRS(false);\n const view: JxgObj = (board as { create: (k: string, p: unknown[], a: unknown) => JxgObj }).create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [view3DInfo.bbox3D[0], view3DInfo.bbox3D[3]],\n [view3DInfo.bbox3D[1], view3DInfo.bbox3D[4]],\n [view3DInfo.bbox3D[2], view3DInfo.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n az: { ...baseAttrs.az, slider: { ...baseAttrs.az.slider, start: view3DInfo.azimuth } },\n el: { ...baseAttrs.el, slider: { ...baseAttrs.el.slider, start: view3DInfo.elevation } },\n },\n );\n\n try {\n \n const v = view as any;\n v?.az_slide?.setValue?.(view3DInfo.azimuth);\n v?.el_slide?.setValue?.(view3DInfo.elevation);\n v?.board?.update?.();\n } catch {\n /* older JSXGraph may not expose az_slide on view3d */\n }\n\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => JxgObj }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(false),\n );\n } catch {\n /* swallow */\n }\n\n const store = createStore(state);\n const renderer = new JxgRenderer3D(store, view);\n\n try {\n \n (view as any)?.board?.update?.();\n } catch {\n /* swallow */\n }\n\n return renderer;\n },\n postProcessSvg: (clone) => {\n clone.setAttribute('width', String(OUTPUT_WIDTH));\n clone.setAttribute('height', String(OUTPUT_HEIGHT));\n },\n });\n\n return { svgString, width: OUTPUT_WIDTH, height: OUTPUT_HEIGHT };\n}\n","// SVG inline base64 helper dùng chung cho 3 stamp (geometry-2d, geometry-3d,\n// graph-2d):\n//\n// - `svgToStampFile(svg, fileId)` — sync, dùng cho `restoreFileFromCustomData`\n// khi caller đã có fileId từ element.\n// - `createStampFile(svg)` — async, dùng cho insert path khi cần generate\n// fileId mới từ hash SVG content.\n//\n// Output luôn là SVG inline base64 — Excalidraw render native + tự đảo màu\n// trong dark mode qua CSS filter. KHÔNG raster sang PNG.\n\nconst DEFAULT_WIDTH = 200;\nconst DEFAULT_HEIGHT = 100;\n\nexport interface StampFileResult {\n fileId: string;\n dataURL: string;\n mimeType: 'image/svg+xml';\n width: number;\n height: number;\n}\n\nasync function hashSvgToFileId(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest))\n .slice(0, 16)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars. Fallback Node/jsdom.\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (\n (h1 >>> 0).toString(16).padStart(8, '0') +\n (h2 >>> 0).toString(16).padStart(8, '0')\n );\n}\n\nfunction parseDim(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) {\n return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n }\n return attr === 'width' ? DEFAULT_WIDTH : DEFAULT_HEIGHT;\n}\n\nexport function parseSvgDims(svg: string): { width: number; height: number } {\n return { width: parseDim(svg, 'width'), height: parseDim(svg, 'height') };\n}\n\nexport function svgToStampFile(svgString: string, fileId: string): StampFileResult {\n const { width, height } = parseSvgDims(svgString);\n const utf8 = unescape(encodeURIComponent(svgString));\n const base64 = typeof btoa !== 'undefined'\n ? btoa(utf8)\n : Buffer.from(utf8, 'binary').toString('base64');\n return {\n fileId,\n dataURL: `data:image/svg+xml;base64,${base64}`,\n mimeType: 'image/svg+xml',\n width,\n height,\n };\n}\n\n// Async variant cho insert path: hash SVG → fileId rồi gọi svgToStampFile.\n// Identical SVG content → identical fileId (Excalidraw addFiles dedupe).\nexport async function createStampFile(svgString: string): Promise<StampFileResult> {\n const fileId = await hashSvgToFileId(svgString);\n return svgToStampFile(svgString, fileId);\n}\n","import type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport type { Constraint3D } from '../../../../../core/scene/kinds/3d-constraint';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\nimport type { SceneHit } from '../../hitTest/hitTest';\n\nexport function hitToConstraint(hit: SceneHit): Constraint3D | null {\n switch (hit.kind) {\n case 'onGround': return { kind: 'onGround', x: hit.world[0], y: hit.world[1] };\n case 'onAxis': return { kind: 'onAxis', axis: hit.axis, t: hit.t };\n case 'onPlane': return { kind: 'onPlane', planeId: hit.planeId, u: hit.u, v: hit.v };\n case 'onLine': return { kind: 'onLine', lineId: hit.lineId, t: hit.t };\n case 'onPolygon': return { kind: 'onPolygon', polygonId: hit.polygonId, u: hit.u, v: hit.v };\n case 'onSphere': return { kind: 'onSphere', sphereId: hit.sphereId, theta: hit.theta, phi: hit.phi };\n default: return null;\n }\n}\n\n/**\n * Sinh id `p{counter + offset}` cho point mới — đồng nhất tiền tố cũ của Scene3D\n * và không đụng id đã tồn tại trong state hiện tại.\n */\nexport function makePointId(store: Store, offset = 1): string {\n return `p${store.getState().counter + offset}`;\n}\n\n/**\n * Build SceneObject cho point3d (chưa dispatch). Caller sẽ dispatch ADD hoặc\n * gom trong transaction.\n */\nexport function buildPointObject(\n store: Store,\n constraint: Constraint3D,\n options: { idOffset?: number; label?: string; color?: string } = {},\n): SceneObject<Point3DAttrs> {\n const id = makePointId(store, options.idOffset ?? 1);\n const state = store.getState();\n const label = options.label ?? nextLabel(state, 'point3d');\n return {\n id,\n kind: 'point3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { constraint, ...(options.color ? { color: options.color } : {}) },\n };\n}\n\n/**\n * Tương đương `scene.addPoint(constraint)` cũ: dispatch ADD point ngay và trả\n * về id của point vừa tạo.\n */\nexport function addPoint(store: Store, constraint: Constraint3D, color?: string): string {\n const obj = buildPointObject(store, constraint, color ? { color } : {});\n store.dispatch({ type: 'ADD', payload: { obj } });\n return obj.id;\n}\n\n/**\n * Given a SceneHit, return the id of an existing point (if hit is existingPoint),\n * or create a new constrained point on the hit surface and return its id.\n * Returns null for `empty` hits.\n */\nexport function ensurePoint(hit: SceneHit, store: Store): string | null {\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return addPoint(store, c);\n}\n\n/**\n * Id của ĐỐI TƯỢNG mà hit chạm vào (mặt phẳng/đường/đa giác/mặt cầu) — dùng cho\n * bước 'object' của tool (chọn cả đối tượng, không phải đặt điểm). null nếu hit\n * không gắn với một object (ground/axis/existingPoint/empty).\n */\nexport function hitObjectId(hit: SceneHit): string | null {\n switch (hit.kind) {\n case 'onPlane': return hit.planeId;\n case 'onLine': return hit.lineId;\n case 'onPolygon': return hit.polygonId;\n case 'onSphere': return hit.sphereId;\n default: return null;\n }\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store } from '../../../../../core/scene';\nimport { hitToConstraint, addPoint } from './_ensurePoint';\n\nexport function buildPoint(args: CollectedArg[], store: Store): string | null {\n const hit = args[0]?.hit;\n if (!hit) return null;\n if (hit.kind === 'existingPoint') return hit.pointId;\n const c = hitToConstraint(hit);\n if (!c) return null;\n return addPoint(store, c);\n}\n\nexport const buildPointOnObject = buildPoint; // identical semantics; step.allowNewOn is the only difference\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nfunction makeDerivedId(store: Store, prefix: string): string {\n return `${prefix}${store.getState().counter + 1}`;\n}\n\nfunction addDerived(\n store: Store,\n kind: string,\n prefix: string,\n attrs: Record<string, unknown>,\n): string {\n const id = makeDerivedId(store, prefix);\n const label = nextLabel(store.getState(), kind);\n const obj: SceneObject = {\n id,\n kind,\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs,\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n\nexport function buildSegment(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, store);\n const p2 = ensurePoint(args[1].hit, store);\n if (!p1 || !p2 || p1 === p2) return null;\n return addDerived(store, 'segment3d', 's', { p1, p2 });\n}\n\nexport function buildLine(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1 = ensurePoint(args[0].hit, store);\n const p2 = ensurePoint(args[1].hit, store);\n if (!p1 || !p2 || p1 === p2) return null;\n return addDerived(store, 'line3d', 'l', { p1, p2 });\n}\n\nexport function buildRay(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const origin = ensurePoint(args[0].hit, store);\n const through = ensurePoint(args[1].hit, store);\n if (!origin || !through || origin === through) return null;\n return addDerived(store, 'ray3d', 'r', { origin, through });\n}\n\nexport function buildVector(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const from = ensurePoint(args[0].hit, store);\n const to = ensurePoint(args[1].hit, store);\n if (!from || !to || from === to) return null;\n return addDerived(store, 'vector3d', 'v', { from, to });\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildPolygon(args: CollectedArg[], store: Store): string | null {\n // Drop the final closingPoint arg, keep all 'point'-step hits as vertices.\n const vertexArgs = args.filter((a) => a.step.type === 'point');\n const vertexIds = vertexArgs\n .map((a) => (a.hit ? ensurePoint(a.hit, store) : null))\n .filter((x): x is string => !!x);\n if (vertexIds.length < 3) return null;\n\n const id = `pg${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polygon3d');\n const obj: SceneObject = {\n id,\n kind: 'polygon3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { vertices: vertexIds },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","// src/stamps/geometry-3d/editor/scene/constraintMath.ts\n// Re-export từ core. constraintToWorld/worldToConstraint ĐÃ CHUYỂN về\n// core/scene/kinds/constraint3d-math.ts (toán thuần trên type core) để\n// point3d.render (core) dùng được mà KHÔNG vi phạm layering core→stamps.\n// Giữ nguyên đường import cũ cho usePointDrag / tools / hitTest / geometryChecks / tests.\nexport {\n constraintToWorld,\n worldToConstraint,\n lineConstructionWorld,\n planeConstructionWorld,\n type Vec3,\n} from '../../../../core/scene/kinds/constraint3d-math';\n","import type { State } from '../../../../core/scene';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport { constraintToWorld, type Vec3 } from './constraintMath';\n\nconst EPS = 1e-6;\n\nfunction getWorld(id: string, state: State): Vec3 | null {\n const obj = state.objects[id];\n if (!obj || obj.kind !== 'point3d') return null;\n const attrs = obj.attrs as Point3DAttrs;\n return constraintToWorld(attrs.constraint, state);\n}\n\nexport function areCollinear3(p1Id: string, p2Id: string, p3Id: string, state: State): boolean {\n const p1 = getWorld(p1Id, state);\n const p2 = getWorld(p2Id, state);\n const p3 = getWorld(p3Id, state);\n if (!p1 || !p2 || !p3) return true;\n const a: Vec3 = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]];\n const b: Vec3 = [p3[0] - p1[0], p3[1] - p1[1], p3[2] - p1[2]];\n const c: Vec3 = [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n return Math.hypot(c[0], c[1], c[2]) < EPS;\n}\n\nexport function apexCoplanarWithBase(baseIds: string[], apexId: string, state: State): boolean {\n if (baseIds.length < 3) return false;\n const p1 = getWorld(baseIds[0], state);\n const p2 = getWorld(baseIds[1], state);\n const p3 = getWorld(baseIds[2], state);\n const apex = getWorld(apexId, state);\n if (!p1 || !p2 || !p3 || !apex) return false;\n const a: Vec3 = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]];\n const b: Vec3 = [p3[0] - p1[0], p3[1] - p1[1], p3[2] - p1[2]];\n const n: Vec3 = [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n const d: Vec3 = [apex[0] - p1[0], apex[1] - p1[1], apex[2] - p1[2]];\n const dotND = n[0] * d[0] + n[1] * d[1] + n[2] * d[2];\n return Math.abs(dotND) < EPS;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\nimport { areCollinear3 } from '../../scene/geometryChecks';\n\nexport function buildPlane(args: CollectedArg[], store: Store): string | null {\n if (args.length < 3 || !args[0].hit || !args[1].hit || !args[2].hit) return null;\n const p1 = ensurePoint(args[0].hit, store);\n const p2 = ensurePoint(args[1].hit, store);\n const p3 = ensurePoint(args[2].hit, store);\n if (!p1 || !p2 || !p3) return null;\n if (p1 === p2 || p2 === p3 || p1 === p3) return null;\n if (areCollinear3(p1, p2, p3, store.getState())) return null;\n const id = `pl${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'plane3d');\n const obj: SceneObject = {\n id,\n kind: 'plane3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { p1, p2, p3 },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\nimport { apexCoplanarWithBase } from '../../scene/geometryChecks';\n\nexport function buildPyramid(args: CollectedArg[], store: Store): string | null {\n const pointArgs = args.filter((a) => a.step.type === 'point');\n const baseArgs = pointArgs.slice(0, -1); // last 'point' arg is the apex\n const apexArg = pointArgs.slice(-1)[0];\n if (baseArgs.length < 3 || !apexArg?.hit) return null;\n const baseIds = baseArgs\n .map((a) => (a.hit ? ensurePoint(a.hit, store) : null))\n .filter((x): x is string => !!x);\n const apexId = ensurePoint(apexArg.hit, store);\n if (!apexId || baseIds.length < 3) return null;\n if (apexCoplanarWithBase(baseIds, apexId, store.getState())) return null;\n const vertices = [...baseIds, apexId];\n const apexIdx = vertices.length - 1;\n const faces: number[][] = [baseIds.map((_, i) => i)];\n for (let i = 0; i < baseIds.length; i++) {\n faces.push([i, (i + 1) % baseIds.length, apexIdx]);\n }\n const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'pyramid', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint, addPoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\n\nexport function buildPrism(args: CollectedArg[], store: Store): string | null {\n const baseArgs = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (baseArgs.length < 3 || !numberArg || typeof numberArg.value !== 'number') return null;\n const height = numberArg.value;\n if (height <= 0) return null;\n const baseIds = baseArgs\n .map((a) => (a.hit ? ensurePoint(a.hit, store) : null))\n .filter((x): x is string => !!x);\n if (baseIds.length < 3) return null;\n const topIds: string[] = [];\n for (const id of baseIds) {\n const state = store.getState();\n const p = state.objects[id];\n if (!p || p.kind !== 'point3d') return null;\n const attrs = p.attrs as Point3DAttrs;\n const w = constraintToWorld(attrs.constraint, state);\n topIds.push(addPoint(store, { kind: 'free', x: w[0], y: w[1], z: w[2] + height }));\n }\n const n = baseIds.length;\n const vertices = [...baseIds, ...topIds];\n const faces: number[][] = [\n baseIds.map((_, i) => i),\n topIds.map((_, i) => n + i),\n ];\n for (let i = 0; i < n; i++) {\n faces.push([i, (i + 1) % n, n + ((i + 1) % n), n + i]);\n }\n const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'prism', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint, addPoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\n\nexport function buildTetrahedron(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, store);\n const p2Id = ensurePoint(args[1].hit, store);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const state0 = store.getState();\n const p1Obj = state0.objects[p1Id];\n const p2Obj = state0.objects[p2Id];\n if (!p1Obj || p1Obj.kind !== 'point3d' || !p2Obj || p2Obj.kind !== 'point3d') return null;\n const p1 = constraintToWorld((p1Obj.attrs as Point3DAttrs).constraint, state0);\n const p2 = constraintToWorld((p2Obj.attrs as Point3DAttrs).constraint, state0);\n // Force base plane to z = min(p1.z, p2.z); project both points there.\n const z0 = Math.min(p1[2], p2[2]);\n const baseA: [number, number, number] = [p1[0], p1[1], z0];\n const baseB: [number, number, number] = [p2[0], p2[1], z0];\n const dx = baseB[0] - baseA[0];\n const dy = baseB[1] - baseA[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Third base vertex: rotate (baseB - baseA) by 60° in xy and add to baseA midpoint\n const mid: [number, number, number] = [(baseA[0] + baseB[0]) / 2, (baseA[1] + baseB[1]) / 2, z0];\n const perpX = -dy;\n const perpY = dx;\n const perpLen = Math.hypot(perpX, perpY);\n const height = edge * Math.sqrt(3) / 2;\n const baseC: [number, number, number] = [mid[0] + (perpX / perpLen) * height, mid[1] + (perpY / perpLen) * height, z0];\n // Apex: centroid + edge*sqrt(2/3)\n const centroid: [number, number, number] = [\n (baseA[0] + baseB[0] + baseC[0]) / 3,\n (baseA[1] + baseB[1] + baseC[1]) / 3,\n z0,\n ];\n const apexHeight = edge * Math.sqrt(2 / 3);\n const apex: [number, number, number] = [centroid[0], centroid[1], z0 + apexHeight];\n\n const cId = addPoint(store, { kind: 'free', x: baseC[0], y: baseC[1], z: baseC[2] });\n const apexId = addPoint(store, { kind: 'free', x: apex[0], y: apex[1], z: apex[2] });\n\n const vertices = [p1Id, p2Id, cId, apexId];\n const faces: number[][] = [\n [0, 1, 2], // base\n [0, 1, 3], // face p1-p2-apex\n [1, 2, 3], // face p2-c-apex\n [2, 0, 3], // face c-p1-apex\n ];\n const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'tetrahedron', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint, addPoint } from './_ensurePoint';\nimport { constraintToWorld } from '../../scene/constraintMath';\nimport type { Point3DAttrs } from '../../../../../core/scene/kinds/point3d';\n\nexport function buildCube(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const p1Id = ensurePoint(args[0].hit, store);\n const p2Id = ensurePoint(args[1].hit, store);\n if (!p1Id || !p2Id || p1Id === p2Id) return null;\n const state0 = store.getState();\n const p1Obj = state0.objects[p1Id];\n const p2Obj = state0.objects[p2Id];\n if (!p1Obj || p1Obj.kind !== 'point3d' || !p2Obj || p2Obj.kind !== 'point3d') return null;\n const p1 = constraintToWorld((p1Obj.attrs as Point3DAttrs).constraint, state0);\n const p2 = constraintToWorld((p2Obj.attrs as Point3DAttrs).constraint, state0);\n // Require both on the ground (z = 0); reject otherwise\n if (Math.abs(p1[2]) > 1e-6 || Math.abs(p2[2]) > 1e-6) return null;\n const dx = p2[0] - p1[0];\n const dy = p2[1] - p1[1];\n const edge = Math.hypot(dx, dy);\n if (edge < 1e-9) return null;\n // Bottom face: p1, p2, p3 = p2 + perp, p4 = p1 + perp where perp = rotate (p2-p1) by +90°\n const perpX = -dy;\n const perpY = dx;\n const p3: [number, number, number] = [p2[0] + perpX, p2[1] + perpY, 0];\n const p4: [number, number, number] = [p1[0] + perpX, p1[1] + perpY, 0];\n // Top face: same x, y; z = edge\n const t1: [number, number, number] = [p1[0], p1[1], edge];\n const t2: [number, number, number] = [p2[0], p2[1], edge];\n const t3: [number, number, number] = [p3[0], p3[1], edge];\n const t4: [number, number, number] = [p4[0], p4[1], edge];\n\n const p3Id = addPoint(store, { kind: 'onGround', x: p3[0], y: p3[1] });\n const p4Id = addPoint(store, { kind: 'onGround', x: p4[0], y: p4[1] });\n const t1Id = addPoint(store, { kind: 'free', x: t1[0], y: t1[1], z: t1[2] });\n const t2Id = addPoint(store, { kind: 'free', x: t2[0], y: t2[1], z: t2[2] });\n const t3Id = addPoint(store, { kind: 'free', x: t3[0], y: t3[1], z: t3[2] });\n const t4Id = addPoint(store, { kind: 'free', x: t4[0], y: t4[1], z: t4[2] });\n\n const vertices = [p1Id, p2Id, p3Id, p4Id, t1Id, t2Id, t3Id, t4Id];\n // Faces by index in vertices:\n const faces: number[][] = [\n [0, 1, 2, 3], // bottom\n [4, 5, 6, 7], // top\n [0, 1, 5, 4], // front\n [1, 2, 6, 5], // right\n [2, 3, 7, 6], // back\n [3, 0, 4, 7], // left\n ];\n const id = `ph${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'polyhedron3d');\n const obj: SceneObject = {\n id,\n kind: 'polyhedron3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { flavor: 'cube', vertices, faces },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildSphere(args: CollectedArg[], store: Store): string | null {\n if (args.length < 2 || !args[0].hit || !args[1].hit) return null;\n const center = ensurePoint(args[0].hit, store);\n const surface = ensurePoint(args[1].hit, store);\n if (!center || !surface || center === surface) return null;\n const id = `sp${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'sphere3d');\n const obj: SceneObject = {\n id,\n kind: 'sphere3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { center, surfacePoint: surface },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCylinder(args: CollectedArg[], store: Store): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, store);\n const topCenter = ensurePoint(points[1].hit, store);\n if (!baseCenter || !topCenter || baseCenter === topCenter) return null;\n const id = `cy${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'cylinder3d');\n const obj: SceneObject = {\n id,\n kind: 'cylinder3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { baseCenter, topCenter, radius },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport { ensurePoint } from './_ensurePoint';\n\nexport function buildCone(args: CollectedArg[], store: Store): string | null {\n const points = args.filter((a) => a.step.type === 'point');\n const numberArg = args.find((a) => a.step.type === 'number');\n if (points.length < 2 || !points[0].hit || !points[1].hit || !numberArg || typeof numberArg.value !== 'number') return null;\n const radius = numberArg.value;\n if (radius <= 0) return null;\n const baseCenter = ensurePoint(points[0].hit, store);\n const apex = ensurePoint(points[1].hit, store);\n if (!baseCenter || !apex || baseCenter === apex) return null;\n const id = `co${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), 'cone3d');\n const obj: SceneObject = {\n id,\n kind: 'cone3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { baseCenter, apex, radius },\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","// src/stamps/geometry-3d/editor/tools/handlers/derived.ts\n// Handler dựng ĐIỂM PHÁI SINH 3D (v1). Mỗi handler: resolve điểm gốc qua\n// ensurePoint → addPoint(store, constraint phái sinh).\n//\n// QUAN TRỌNG (chống điểm MỒ CÔI): ensurePoint có side-effect TẠO điểm cho hit\n// trên-bề-mặt (onGround/onAxis/onPlane/onSphere). Vì vậy kiểm suy biến phải đọc\n// từ HIT *trước* khi gọi ensurePoint — KHÔNG để guard chạy sau khi đã tạo điểm,\n// nếu không một build bị từ chối vẫn để lại điểm mới mồ côi trong scene\n// (phát hiện bởi review đối kháng 2026-06-21).\nimport type { Store } from '../../../../../core/scene';\nimport type { SceneHit } from '../../hitTest/hitTest';\nimport type { CollectedArg } from '../spec';\nimport { addPoint, ensurePoint, hitObjectId } from './_ensurePoint';\n\n// Hit của các bước 'point' theo thứ tự chọn.\nfunction pointHits(args: CollectedArg[]): SceneHit[] {\n return args.filter((a) => a.step.type === 'point' && a.hit).map((a) => a.hit!);\n}\n\n// Hai hit cùng trỏ về MỘT điểm có sẵn (id trùng) → đoạn/đường suy biến. Điểm\n// MỚI luôn nhận id riêng nên không bao giờ trùng theo cách này (chỉ điểm-có-sẵn\n// click 2 lần mới gây suy biến phát hiện được ở tầng id).\nfunction sameExistingPoint(h1: SceneHit | undefined, h2: SceneHit | undefined): boolean {\n return (\n !!h1 && !!h2 &&\n h1.kind === 'existingPoint' && h2.kind === 'existingPoint' &&\n h1.pointId === h2.pointId\n );\n}\n\n// Số ĐỈNH phân biệt các hit sẽ tạo ra: mỗi điểm-mới = 1 đỉnh riêng; điểm-có-sẵn\n// dedup theo id. Dùng để chặn trọng tâm < 3 đỉnh TRƯỚC khi tạo điểm.\nfunction distinctVertexCount(hits: SceneHit[]): number {\n const existing = new Set<string>();\n let fresh = 0;\n for (const h of hits) {\n if (h.kind === 'existingPoint') existing.add(h.pointId);\n else fresh++;\n }\n return existing.size + fresh;\n}\n\n// Id mặt phẳng từ bước 'object' đầu tiên (null nếu thiếu / không phải object).\nfunction objectPlaneId(args: CollectedArg[]): string | null {\n const objArg = args.find((a) => a.step.type === 'object' && a.hit);\n return objArg ? hitObjectId(objArg.hit!) : null;\n}\n\n/** Trung điểm đoạn nối 2 điểm. */\nexport function buildMidpoint(args: CollectedArg[], store: Store): string | null {\n const hits = pointHits(args);\n if (hits.length < 2 || sameExistingPoint(hits[0], hits[1])) return null;\n const p1 = ensurePoint(hits[0], store);\n const p2 = ensurePoint(hits[1], store);\n if (!p1 || !p2 || p1 === p2) return null;\n return addPoint(store, { kind: 'midpoint', p1, p2 });\n}\n\n/** Trọng tâm: trung bình các đỉnh đã chọn (≥3 đỉnh phân biệt). */\nexport function buildCentroid(args: CollectedArg[], store: Store): string | null {\n const hits = pointHits(args);\n if (distinctVertexCount(hits) < 3) return null; // chặn TRƯỚC khi tạo điểm\n const ids = hits.map((h) => ensurePoint(h, store)).filter((x): x is string => !!x);\n const uniq = Array.from(new Set(ids));\n if (uniq.length < 3) return null;\n return addPoint(store, { kind: 'centroid', vertices: uniq });\n}\n\n/** Giao 2 đường — mỗi đường xác định bởi 2 điểm: (a1,b1) & (a2,b2). */\nexport function buildIntersectionLines(args: CollectedArg[], store: Store): string | null {\n const hits = pointHits(args);\n if (hits.length < 4) return null;\n const [h1, h2, h3, h4] = hits;\n if (sameExistingPoint(h1, h2) || sameExistingPoint(h3, h4)) return null; // đường suy biến\n const a1 = ensurePoint(h1, store);\n const b1 = ensurePoint(h2, store);\n const a2 = ensurePoint(h3, store);\n const b2 = ensurePoint(h4, store);\n if (!a1 || !b1 || !a2 || !b2 || a1 === b1 || a2 === b2) return null;\n return addPoint(store, { kind: 'intersectionLines', a1, b1, a2, b2 });\n}\n\n/** Chân vuông góc từ điểm `from` xuống đường (a,b). */\nexport function buildPerpFootLine(args: CollectedArg[], store: Store): string | null {\n const hits = pointHits(args);\n if (hits.length < 3 || sameExistingPoint(hits[1], hits[2])) return null; // đường suy biến\n const from = ensurePoint(hits[0], store);\n const a = ensurePoint(hits[1], store);\n const b = ensurePoint(hits[2], store);\n if (!from || !a || !b || a === b) return null;\n return addPoint(store, { kind: 'perpFootLine', from, a, b });\n}\n\n/** Giao điểm đường (qua 2 điểm a,b) ∩ mặt phẳng (object). */\nexport function buildIntersectionLinePlane(args: CollectedArg[], store: Store): string | null {\n const plane = objectPlaneId(args);\n if (!plane) return null;\n const hits = pointHits(args);\n if (hits.length < 2 || sameExistingPoint(hits[0], hits[1])) return null; // đường suy biến\n const a = ensurePoint(hits[0], store);\n const b = ensurePoint(hits[1], store);\n if (!a || !b || a === b) return null;\n return addPoint(store, { kind: 'intersectionLinePlane', a, b, plane });\n}\n\n/** Chân vuông góc từ điểm `from` xuống mặt phẳng (object). */\nexport function buildPerpFootPlane(args: CollectedArg[], store: Store): string | null {\n const plane = objectPlaneId(args);\n if (!plane) return null;\n const hits = pointHits(args);\n if (hits.length < 1) return null;\n const from = ensurePoint(hits[0], store);\n if (!from) return null;\n return addPoint(store, { kind: 'perpFootPlane', from, plane });\n}\n","// src/stamps/geometry-3d/editor/tools/handlers/construct3d.ts\n// Handler dựng ĐƯỜNG/MẶT phái sinh 3D (construction-variant, v1.5). Khác\n// derived.ts (điểm phái sinh): ở đây tạo object line3d/plane3d với `construction`.\nimport type { CollectedArg } from '../spec';\nimport type { Store, SceneObject } from '../../../../../core/scene';\nimport { nextLabel } from '../../../../../core/scene';\nimport type { SceneHit } from '../../hitTest/hitTest';\nimport { ensurePoint, hitObjectId } from './_ensurePoint';\n\nfunction addShape(store: Store, kind: string, prefix: string, attrs: Record<string, unknown>): string {\n const id = `${prefix}${store.getState().counter + 1}`;\n const label = nextLabel(store.getState(), kind);\n const obj: SceneObject = {\n id, kind, label, visible: true, locked: false, layer: 'default', schemaVersion: 1, attrs,\n };\n store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n\n// Id mặt phẳng từ các bước 'object' (theo thứ tự chọn).\nfunction objectPlaneIds(args: CollectedArg[]): (string | null)[] {\n return args.filter((a) => a.step.type === 'object' && a.hit).map((a) => hitObjectId(a.hit!));\n}\n\n// Hit của các bước 'point' (theo thứ tự chọn).\nfunction pointHits(args: CollectedArg[]): SceneHit[] {\n return args.filter((a) => a.step.type === 'point' && a.hit).map((a) => a.hit!);\n}\n\n// 2 hit cùng trỏ một điểm có sẵn → suy biến (kiểm TRƯỚC ensurePoint để không tạo\n// điểm mồ côi — xem derived.ts).\nfunction sameExistingPoint(h1: SceneHit | undefined, h2: SceneHit | undefined): boolean {\n return (\n !!h1 && !!h2 &&\n h1.kind === 'existingPoint' && h2.kind === 'existingPoint' &&\n h1.pointId === h2.pointId\n );\n}\n\n/** Giao tuyến 2 mặt phẳng → line3d construction planePlaneIntersection. */\nexport function buildPlanePlaneIntersection(args: CollectedArg[], store: Store): string | null {\n const planes = objectPlaneIds(args);\n if (planes.length < 2 || !planes[0] || !planes[1] || planes[0] === planes[1]) return null;\n return addShape(store, 'line3d', 'l', {\n construction: { kind: 'planePlaneIntersection', plane1: planes[0], plane2: planes[1] },\n });\n}\n\n/** Đường qua điểm P song song hướng dirA→dirB → line3d construction. */\nexport function buildLineParallelThrough(args: CollectedArg[], store: Store): string | null {\n const hits = pointHits(args);\n if (hits.length < 3 || sameExistingPoint(hits[1], hits[2])) return null; // hướng suy biến\n const point = ensurePoint(hits[0], store);\n const dirA = ensurePoint(hits[1], store);\n const dirB = ensurePoint(hits[2], store);\n if (!point || !dirA || !dirB || dirA === dirB) return null;\n return addShape(store, 'line3d', 'l', { construction: { kind: 'lineParallelThrough', point, dirA, dirB } });\n}\n\n/** Đường qua điểm P vuông góc mặt phẳng → line3d construction. */\nexport function buildLinePerpToPlane(args: CollectedArg[], store: Store): string | null {\n const plane = objectPlaneIds(args)[0];\n if (!plane) return null;\n const hits = pointHits(args);\n if (hits.length < 1) return null;\n const point = ensurePoint(hits[0], store);\n if (!point) return null;\n return addShape(store, 'line3d', 'l', { construction: { kind: 'linePerpToPlane', point, plane } });\n}\n\n/** Mặt qua điểm P song song mặt refPlane → plane3d construction. */\nexport function buildPlaneParallelThrough(args: CollectedArg[], store: Store): string | null {\n const refPlane = objectPlaneIds(args)[0];\n if (!refPlane) return null;\n const hits = pointHits(args);\n if (hits.length < 1) return null;\n const point = ensurePoint(hits[0], store);\n if (!point) return null;\n return addShape(store, 'plane3d', 'mp', { construction: { kind: 'planeParallelThrough', point, refPlane } });\n}\n\n/** Mặt qua điểm P vuông góc hướng lineA→lineB → plane3d construction. */\nexport function buildPlanePerpToLine(args: CollectedArg[], store: Store): string | null {\n const hits = pointHits(args);\n if (hits.length < 3 || sameExistingPoint(hits[1], hits[2])) return null; // hướng suy biến\n const point = ensurePoint(hits[0], store);\n const lineA = ensurePoint(hits[1], store);\n const lineB = ensurePoint(hits[2], store);\n if (!point || !lineA || !lineB || lineA === lineB) return null;\n return addShape(store, 'plane3d', 'mp', { construction: { kind: 'planePerpToLine', point, lineA, lineB } });\n}\n","import type { Store } from '../../../../core/scene';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport { buildPoint, buildPointOnObject } from './handlers/point';\nimport { buildSegment, buildLine, buildRay, buildVector } from './handlers/segment';\nimport { buildPolygon } from './handlers/polygon';\nimport { buildPlane } from './handlers/plane';\nimport { buildPyramid } from './handlers/pyramid';\nimport { buildPrism } from './handlers/prism';\nimport { buildTetrahedron } from './handlers/tetrahedron';\nimport { buildCube } from './handlers/cube';\nimport { buildSphere } from './handlers/sphere';\nimport { buildCylinder } from './handlers/cylinder';\nimport { buildCone } from './handlers/cone';\nimport {\n buildMidpoint,\n buildCentroid,\n buildIntersectionLines,\n buildPerpFootLine,\n buildIntersectionLinePlane,\n buildPerpFootPlane,\n} from './handlers/derived';\nimport {\n buildPlanePlaneIntersection,\n buildLineParallelThrough,\n buildLinePerpToPlane,\n buildPlaneParallelThrough,\n buildPlanePerpToLine,\n} from './handlers/construct3d';\n\nexport type ToolKey =\n | 'move' | 'point' | 'pointOnObject'\n | 'segment' | 'line' | 'ray' | 'vector' | 'polygon'\n | 'plane' | 'pyramid' | 'prism' | 'tetrahedron' | 'cube'\n | 'sphere' | 'cylinder' | 'cone'\n // ───── Dựng hình: điểm phái sinh (v1) ─────\n | 'midpoint' | 'centroid'\n | 'intersectionLines' | 'perpFootLine'\n | 'intersectionLinePlane' | 'perpFootPlane'\n // ───── Dựng hình: đường/mặt phái sinh (v1.5) ─────\n | 'planePlaneIntersection' | 'lineParallelThrough' | 'linePerpToPlane'\n | 'planeParallelThrough' | 'planePerpToLine';\n\nexport type ToolStep =\n | {\n type: 'point';\n allowExisting: boolean;\n allowNewOn: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'>;\n hint: string;\n }\n | { type: 'closingPoint'; hint: string }\n | { type: 'object'; kinds: Array<'plane' | 'polygon' | 'line' | 'sphere' | 'polyhedron'>; hint: string }\n | { type: 'number'; prompt: string; min?: number; max?: number };\n\nexport interface CollectedArg {\n step: ToolStep;\n hit?: SceneHit;\n value?: number;\n}\n\nexport interface ToolSpec {\n key: ToolKey;\n label: string;\n hintIdle: string;\n steps: ToolStep[];\n build(args: CollectedArg[], store: Store): string | null;\n /**\n * If true, after build completes the controller re-enters step 0 of this\n * tool (clearing collected args) instead of switching to 'move'. Used by\n * the Point tool so the user can place several points in a row.\n */\n repeatAfterBuild?: boolean;\n}\n\nconst stubBuild = (): string | null => null;\n\nconst ALL_SURFACES: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane', 'line', 'polygon', 'sphere'];\n\nconst OBJECT_ONLY: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['plane', 'line', 'polygon', 'sphere'];\n\nconst NO_SURFACE: Array<'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> =\n ['ground', 'axis', 'plane'];\n\nexport const TOOLS: ToolSpec[] = [\n {\n key: 'move',\n label: 'Di chuyển',\n hintIdle: 'Kéo điểm hoặc xoay khung',\n steps: [],\n build: stubBuild,\n },\n {\n key: 'point',\n label: 'Điểm',\n hintIdle: 'Click trên mặt phẳng Oxy hoặc trên trục để đặt điểm',\n steps: [\n {\n type: 'point',\n allowExisting: false,\n // GeoGebra-style: a new point must lie on the XY ground plane or on\n // one of the coordinate axes (Oz lets you place points off the plane).\n allowNewOn: ['ground', 'axis'],\n hint: 'Click trên mặt phẳng Oxy hoặc trục Ox/Oy/Oz',\n },\n ],\n build: buildPoint,\n repeatAfterBuild: true,\n },\n {\n key: 'pointOnObject',\n label: 'Điểm trên đối tượng',\n hintIdle: 'Chọn một đối tượng để đặt điểm',\n steps: [{ type: 'point', allowExisting: false, allowNewOn: OBJECT_ONLY, hint: 'Click lên mặt / đường để đặt điểm' }],\n build: buildPointOnObject,\n },\n {\n key: 'segment',\n label: 'Đoạn thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đoạn thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildSegment,\n },\n {\n key: 'line',\n label: 'Đường thẳng',\n hintIdle: 'Chọn 2 điểm để vẽ đường thẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildLine,\n },\n {\n key: 'ray',\n label: 'Tia',\n hintIdle: 'Chọn điểm gốc rồi điểm trên tia',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm gốc' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên tia' },\n ],\n build: buildRay,\n },\n {\n key: 'vector',\n label: 'Vector',\n hintIdle: 'Chọn 2 điểm để vẽ vector',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm đầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm cuối' },\n ],\n build: buildVector,\n },\n {\n key: 'polygon',\n label: 'Đa giác',\n hintIdle: 'Chọn các đỉnh; click điểm đầu để đóng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 1' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 3' },\n { type: 'closingPoint', hint: 'Click điểm đầu để đóng (hoặc chọn thêm đỉnh)' },\n ],\n build: buildPolygon,\n },\n {\n key: 'plane',\n label: 'Mặt phẳng (3 điểm)',\n hintIdle: 'Chọn 3 điểm để xác định mặt phẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 1 của mặt phẳng' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ 3' },\n ],\n build: buildPlane,\n },\n {\n key: 'pyramid',\n label: 'Hình chóp',\n hintIdle: 'Chọn đáy đa giác rồi chọn đỉnh chóp',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đáy đầu tiên để đóng (hoặc chọn thêm đỉnh)' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh chóp' },\n ],\n build: buildPyramid,\n },\n {\n key: 'prism',\n label: 'Lăng trụ',\n hintIdle: 'Chọn đáy đa giác rồi nhập chiều cao',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 2' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh đáy 3' },\n { type: 'closingPoint', hint: 'Click đỉnh đầu để đóng đáy' },\n { type: 'number', prompt: 'Chiều cao (theo trục z)', min: 0.0001 },\n ],\n build: buildPrism,\n },\n {\n key: 'tetrahedron',\n label: 'Tứ diện đều',\n hintIdle: 'Chọn 2 điểm xác định cạnh của tứ diện',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 1' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn điểm 2' },\n ],\n build: buildTetrahedron,\n },\n {\n key: 'cube',\n label: 'Lập phương',\n hintIdle: 'Chọn 2 điểm trên nền xác định cạnh',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 1 (trên nền)' },\n { type: 'point', allowExisting: true, allowNewOn: ['ground'], hint: 'Chọn điểm 2 (trên nền)' },\n ],\n build: buildCube,\n },\n {\n key: 'sphere',\n label: 'Mặt cầu',\n hintIdle: 'Chọn tâm rồi điểm trên mặt cầu',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm mặt cầu' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm trên mặt cầu' },\n ],\n build: buildSphere,\n },\n {\n key: 'cylinder',\n label: 'Hình trụ',\n hintIdle: 'Chọn tâm đáy, tâm trên, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm trên' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCylinder,\n },\n {\n key: 'cone',\n label: 'Hình nón',\n hintIdle: 'Chọn tâm đáy, đỉnh, rồi nhập bán kính',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn tâm đáy' },\n { type: 'point', allowExisting: true, allowNewOn: NO_SURFACE, hint: 'Chọn đỉnh' },\n { type: 'number', prompt: 'Bán kính', min: 0.0001 },\n ],\n build: buildCone,\n },\n // ───── Dựng hình: điểm phái sinh (v1) ─────\n {\n key: 'midpoint',\n label: 'Trung điểm',\n hintIdle: 'Chọn 2 điểm để lấy trung điểm',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn điểm thứ hai' },\n ],\n build: buildMidpoint,\n },\n {\n key: 'centroid',\n label: 'Trọng tâm',\n hintIdle: 'Chọn 3 đỉnh để lấy trọng tâm',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 1' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 2' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Chọn đỉnh thứ 3' },\n ],\n build: buildCentroid,\n },\n {\n key: 'intersectionLines',\n label: 'Giao 2 đường',\n hintIdle: 'Chọn 2 điểm cho đường thứ nhất, rồi 2 điểm cho đường thứ hai',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường 1: điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường 1: điểm thứ hai' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường 2: điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường 2: điểm thứ hai' },\n ],\n build: buildIntersectionLines,\n },\n {\n key: 'perpFootLine',\n label: 'Chân ⊥ xuống đường',\n hintIdle: 'Chọn điểm cần hạ, rồi 2 điểm xác định đường',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Điểm cần hạ vuông góc' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường: điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường: điểm thứ hai' },\n ],\n build: buildPerpFootLine,\n },\n {\n key: 'intersectionLinePlane',\n label: 'Giao đường ∩ mặt',\n hintIdle: 'Chọn 2 điểm xác định đường, rồi chọn mặt phẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường: điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường: điểm thứ hai' },\n { type: 'object', kinds: ['plane'], hint: 'Chọn mặt phẳng' },\n ],\n build: buildIntersectionLinePlane,\n },\n {\n key: 'perpFootPlane',\n label: 'Chân ⊥ xuống mặt',\n hintIdle: 'Chọn điểm cần hạ, rồi chọn mặt phẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Điểm cần hạ vuông góc' },\n { type: 'object', kinds: ['plane'], hint: 'Chọn mặt phẳng' },\n ],\n build: buildPerpFootPlane,\n },\n {\n key: 'planePlaneIntersection',\n label: 'Giao tuyến 2 mặt',\n hintIdle: 'Chọn 2 mặt phẳng để dựng giao tuyến',\n steps: [\n { type: 'object', kinds: ['plane'], hint: 'Chọn mặt phẳng thứ nhất' },\n { type: 'object', kinds: ['plane'], hint: 'Chọn mặt phẳng thứ hai' },\n ],\n build: buildPlanePlaneIntersection,\n },\n {\n key: 'lineParallelThrough',\n label: 'Đường ∥ (qua điểm)',\n hintIdle: 'Chọn điểm, rồi 2 điểm xác định hướng song song',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Điểm đường đi qua' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Hướng: điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Hướng: điểm thứ hai' },\n ],\n build: buildLineParallelThrough,\n },\n {\n key: 'linePerpToPlane',\n label: 'Đường ⊥ mặt (qua điểm)',\n hintIdle: 'Chọn điểm, rồi chọn mặt phẳng',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Điểm đường đi qua' },\n { type: 'object', kinds: ['plane'], hint: 'Chọn mặt phẳng vuông góc' },\n ],\n build: buildLinePerpToPlane,\n },\n {\n key: 'planeParallelThrough',\n label: 'Mặt ∥ (qua điểm)',\n hintIdle: 'Chọn điểm, rồi chọn mặt phẳng song song',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Điểm mặt đi qua' },\n { type: 'object', kinds: ['plane'], hint: 'Chọn mặt phẳng song song' },\n ],\n build: buildPlaneParallelThrough,\n },\n {\n key: 'planePerpToLine',\n label: 'Mặt ⊥ đường (qua điểm)',\n hintIdle: 'Chọn điểm, rồi 2 điểm xác định đường vuông góc',\n steps: [\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Điểm mặt đi qua' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường ⊥: điểm thứ nhất' },\n { type: 'point', allowExisting: true, allowNewOn: ALL_SURFACES, hint: 'Đường ⊥: điểm thứ hai' },\n ],\n build: buildPlanePerpToLine,\n },\n];\n\nexport const TOOL_GROUPS: Record<string, ToolKey[]> = {\n 'Cơ bản': ['move', 'point', 'segment', 'line', 'plane'],\n 'Điểm': ['point', 'pointOnObject'],\n 'Đường thẳng': ['segment', 'line', 'ray', 'vector', 'polygon'],\n 'Mặt phẳng': ['plane'],\n 'Dựng hình': ['midpoint', 'centroid', 'intersectionLines', 'perpFootLine', 'intersectionLinePlane', 'perpFootPlane', 'planePlaneIntersection', 'lineParallelThrough', 'linePerpToPlane', 'planeParallelThrough', 'planePerpToLine'],\n 'Khối đa diện': ['pyramid', 'prism', 'tetrahedron', 'cube'],\n 'Khối cong': ['sphere', 'cylinder', 'cone'],\n};\n","import type { Store } from '../../../../core/scene';\nimport type { SceneHit } from '../hitTest/hitTest';\nimport type { ToolKey, ToolStep, ToolSpec, CollectedArg } from './spec';\nimport { TOOLS } from './spec';\n\ninterface ControllerState {\n tool: ToolSpec | null;\n stepIndex: number;\n collected: CollectedArg[];\n hint: string;\n}\n\ntype Listener = (state: ControllerState) => void;\n\nfunction stepHint(step: ToolStep): string {\n return step.type === 'number' ? step.prompt : step.hint;\n}\n\nexport class ToolController {\n private state: ControllerState = { tool: null, stepIndex: 0, collected: [], hint: '' };\n private listeners = new Set<Listener>();\n\n constructor(private store: Store) {\n this.selectTool('move');\n }\n\n getState(): ControllerState { return this.state; }\n\n on(cb: Listener): () => void {\n this.listeners.add(cb);\n return () => {\n this.listeners.delete(cb);\n };\n }\n\n selectTool(key: ToolKey): void {\n const tool = TOOLS.find((t) => t.key === key) ?? TOOLS.find((t) => t.key === 'move')!;\n const firstStep = tool.steps[0];\n this.state = {\n tool,\n stepIndex: 0,\n collected: [],\n hint: firstStep ? stepHint(firstStep) : tool.hintIdle,\n };\n this.notify();\n }\n\n cancel(): void { this.selectTool('move'); }\n\n consumeHit(hit: SceneHit): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step) return false;\n\n // Polygon-like variable-vertex flow: when current step is closingPoint, an\n // existing-point hit matching the first collected vertex finalizes the\n // sub-sequence; any other surface hit appends another vertex (and the\n // controller stays at this stepIndex).\n if (step.type === 'closingPoint') {\n if (hit.kind === 'empty') return false;\n if (hit.kind === 'existingPoint') {\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n // Otherwise append another vertex using the previous 'point' step's allowNewOn\n const prevStep = tool.steps[this.state.stepIndex - 1];\n if (!prevStep || prevStep.type !== 'point') return false;\n if (!this.hitMatchesStep(hit, prevStep)) return false;\n this.state.collected.push({ step: prevStep, hit });\n // stepIndex stays at the closingPoint step\n this.notify();\n return true;\n }\n\n if (!this.hitMatchesStep(hit, step)) return false;\n this.state.collected.push({ step, hit });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n consumeNumber(value: number): boolean {\n const tool = this.state.tool;\n if (!tool) return false;\n const step = tool.steps[this.state.stepIndex];\n if (!step || step.type !== 'number') return false;\n if (step.min != null && value < step.min) return false;\n if (step.max != null && value > step.max) return false;\n this.state.collected.push({ step, value });\n this.state.stepIndex++;\n this.advance();\n return true;\n }\n\n private hitMatchesStep(hit: SceneHit, step: ToolStep): boolean {\n if (hit.kind === 'empty') return false;\n // Bước 'object': chọn cả đối tượng (mặt/đường/đa giác/cầu) — KHÔNG đặt điểm.\n // Khớp khi kind của hit ánh xạ về một loại object nằm trong step.kinds.\n if (step.type === 'object') {\n const objKind: Partial<Record<SceneHit['kind'], 'plane' | 'polygon' | 'line' | 'sphere'>> = {\n onPlane: 'plane', onPolygon: 'polygon', onLine: 'line', onSphere: 'sphere',\n };\n const k = objKind[hit.kind];\n return k != null && step.kinds.includes(k);\n }\n if (step.type !== 'point' && step.type !== 'closingPoint') return false;\n if (step.type === 'closingPoint') return hit.kind === 'existingPoint';\n if (hit.kind === 'existingPoint') return step.allowExisting;\n const surfaceMap: Record<string, 'ground' | 'axis' | 'plane' | 'line' | 'polygon' | 'sphere'> = {\n onGround: 'ground', onAxis: 'axis', onPlane: 'plane',\n onLine: 'line', onPolygon: 'polygon', onSphere: 'sphere',\n };\n const k = surfaceMap[hit.kind];\n return k != null && step.type === 'point' && step.allowNewOn.includes(k);\n }\n\n private advance(): void {\n const tool = this.state.tool!;\n if (this.state.stepIndex >= tool.steps.length) {\n tool.build(this.state.collected, this.store);\n if (tool.repeatAfterBuild) {\n // Stay in this tool so the user can place several items in a row.\n this.state.stepIndex = 0;\n this.state.collected = [];\n this.state.hint = stepHint(tool.steps[0]);\n this.notify();\n } else {\n this.selectTool('move');\n }\n return;\n }\n this.state.hint = stepHint(tool.steps[this.state.stepIndex]);\n this.notify();\n }\n\n private notify(): void {\n for (const cb of this.listeners) cb(this.state);\n }\n}\n","import type { Vec3 } from '../scene/constraintMath';\n\nexport interface View3DLike {\n unprojectScreen?(sx: number, sy: number, depth: number): [number, number, number];\n project3DTo2D?(x: number, y: number, z: number): [number, number, number, number];\n}\n\nexport interface Ray3D {\n origin: Vec3;\n dir: Vec3;\n}\n\nexport function screenToRay(screen: { x: number; y: number }, view: View3DLike): Ray3D {\n // Strategy: unproject the screen point at two depths to get a ray through the scene.\n // Prefer view.unprojectScreen if available (mock); fallback to bisection via project3DTo2D.\n const near = unproject(screen, view, +20);\n const far = unproject(screen, view, -20);\n const dir: Vec3 = [far[0] - near[0], far[1] - near[1], far[2] - near[2]];\n const n = Math.sqrt(dir[0] ** 2 + dir[1] ** 2 + dir[2] ** 2);\n const norm: Vec3 = n === 0 ? [0, 0, -1] : [dir[0] / n, dir[1] / n, dir[2] / n];\n return { origin: near, dir: norm };\n}\n\nfunction unproject(screen: { x: number; y: number }, view: View3DLike, depth: number): Vec3 {\n if (typeof view.unprojectScreen === 'function') {\n const v = view.unprojectScreen(screen.x, screen.y, depth);\n return [v[0], v[1], v[2]];\n }\n // Fallback for real JSXGraph view3d (orthographic-affine projection).\n // Extract the world→screen affine coefficients by sampling project3DTo2D at origin\n // and the three unit-axis points, then solve the 2×2 in (x, y) at the given depth.\n if (typeof view.project3DTo2D === 'function') {\n const p0 = view.project3DTo2D(0, 0, 0);\n const px = view.project3DTo2D(1, 0, 0);\n const py = view.project3DTo2D(0, 1, 0);\n const pz = view.project3DTo2D(0, 0, 1);\n const ox = p0[1], oy = p0[2];\n const a = px[1] - ox, b = py[1] - ox, c = pz[1] - ox;\n const d = px[2] - oy, e = py[2] - oy, f = pz[2] - oy;\n const rhsX = screen.x - ox - c * depth;\n const rhsY = screen.y - oy - f * depth;\n const det = a * e - b * d;\n if (Math.abs(det) < 1e-9) return [0, 0, depth];\n const x = (e * rhsX - b * rhsY) / det;\n const y = (-d * rhsX + a * rhsY) / det;\n return [x, y, depth];\n }\n throw new Error('rayCast: view has neither unprojectScreen nor project3DTo2D');\n}\n","import type { Vec3 } from '../scene/constraintMath';\nimport type { Ray3D } from './rayCast';\n\nconst EPS = 1e-9;\n\nexport interface PlaneHit { point: Vec3; t: number }\nexport interface SphereHit { point: Vec3; t: number }\nexport interface SegmentHit { point: Vec3; t: number; tOnSegment: number }\n\nfunction dot(a: Vec3, b: Vec3): number { return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; }\nfunction sub(a: Vec3, b: Vec3): Vec3 { return [a[0]-b[0], a[1]-b[1], a[2]-b[2]]; }\nfunction add(a: Vec3, b: Vec3): Vec3 { return [a[0]+b[0], a[1]+b[1], a[2]+b[2]]; }\nfunction scale(a: Vec3, k: number): Vec3 { return [a[0]*k, a[1]*k, a[2]*k]; }\nfunction norm2(a: Vec3): number { return dot(a, a); }\n\nexport function rayPlane(\n ray: Ray3D,\n plane: { point: Vec3; normal: Vec3 },\n): PlaneHit | null {\n const denom = dot(ray.dir, plane.normal);\n if (Math.abs(denom) < EPS) return null;\n const t = dot(sub(plane.point, ray.origin), plane.normal) / denom;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\nexport function rayGround(ray: Ray3D): PlaneHit | null {\n return rayPlane(ray, { point: [0, 0, 0], normal: [0, 0, 1] });\n}\n\nexport function raySphere(\n ray: Ray3D,\n sphere: { center: Vec3; radius: number },\n): SphereHit | null {\n const oc = sub(ray.origin, sphere.center);\n const b = dot(oc, ray.dir);\n const c = dot(oc, oc) - sphere.radius * sphere.radius;\n const disc = b * b - c;\n if (disc < 0) return null;\n const sqrtD = Math.sqrt(disc);\n const t1 = -b - sqrtD;\n const t2 = -b + sqrtD;\n const t = t1 >= 0 ? t1 : t2;\n if (t < 0) return null;\n return { point: add(ray.origin, scale(ray.dir, t)), t };\n}\n\n/**\n * Closest approach between ray and line segment. Accepts a distance threshold\n * (in world units; caller scales for pixel ratio).\n */\nexport function rayLineSegment(\n ray: Ray3D,\n seg: { a: Vec3; b: Vec3 },\n maxDistance: number,\n): SegmentHit | null {\n const u = ray.dir;\n const v = sub(seg.b, seg.a);\n const w0 = sub(ray.origin, seg.a);\n const a = dot(u, u);\n const bb = dot(u, v);\n const cc = dot(v, v);\n const d = dot(u, w0);\n const e = dot(v, w0);\n const denom = a * cc - bb * bb;\n if (Math.abs(denom) < EPS) return null;\n const sc = (bb * e - cc * d) / denom;\n const tc = (a * e - bb * d) / denom;\n if (sc < 0 || tc < 0 || tc > 1) return null;\n const pRay = add(ray.origin, scale(u, sc));\n const pSeg = add(seg.a, scale(v, tc));\n const dist2 = norm2(sub(pRay, pSeg));\n if (dist2 > maxDistance * maxDistance) return null;\n return { point: pSeg, t: sc, tOnSegment: tc };\n}\n","import { constraintToWorld } from '../scene/constraintMath';\nimport type { State } from '../../../../core/scene';\nimport { listObjects } from '../../../../core/scene';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport type { View3DLike } from './rayCast';\n\nexport function findSnapPoint(\n screen: { x: number; y: number },\n view: View3DLike,\n state: State,\n pixelRadius = 8,\n): string | null {\n // `screen` arrives in JSXGraph user-space (pixelToUser-converted in MiniBoard3D),\n // and project3DTo2D also returns user-space. Convert the desired pixel radius\n // to user units via the board's px-per-unit scale so the snap stays small\n // (a few real pixels) regardless of zoom or board size.\n \n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing — keeps unit tests, whose\n // mock view emits pixel-space coords directly, working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const uy = typeof board?.unitY === 'number' && board.unitY > 0 ? board.unitY : ux;\n const rxUser = pixelRadius / ux;\n const ryUser = pixelRadius / uy;\n let best: { id: string; d2: number } | null = null;\n for (const obj of listObjects(state)) {\n if (obj.kind !== 'point3d') continue;\n if (!obj.visible) continue;\n const attrs = obj.attrs as Point3DAttrs;\n const world = constraintToWorld(attrs.constraint, state);\n const proj = view.project3DTo2D?.(world[0], world[1], world[2]);\n if (!proj) continue;\n const dxN = (proj[1] - screen.x) / rxUser;\n const dyN = (proj[2] - screen.y) / ryUser;\n const d2 = dxN * dxN + dyN * dyN;\n if (d2 <= 1 && (best === null || d2 < best.d2)) {\n best = { id: obj.id, d2 };\n }\n }\n return best?.id ?? null;\n}\n","import { screenToRay, type View3DLike } from './rayCast';\nimport { rayGround, rayLineSegment, rayPlane, raySphere } from './intersect';\nimport { findSnapPoint } from './snapping';\nimport { constraintToWorld, planeConstructionWorld, type Vec3 } from '../scene/constraintMath';\nimport type { State } from '../../../../core/scene';\nimport { listObjects } from '../../../../core/scene';\nimport type { Point3DAttrs } from '../../../../core/scene/kinds/point3d';\nimport type { Plane3DAttrs } from '../../../../core/scene/kinds/plane3d';\nimport type { Sphere3DAttrs } from '../../../../core/scene/kinds/sphere3d';\n\n// NOTE (v0.8.0): onPolygon and onLine SceneHit variants are typed but not yet\n// produced by hitTest. They will be added once tools require placing points\n// on user-defined lines/polygons (deferred from Task 2.4).\n\nexport type SceneHit =\n | { kind: 'existingPoint'; pointId: string }\n | { kind: 'onGround'; world: Vec3 }\n | { kind: 'onAxis'; axis: 'x' | 'y' | 'z'; t: number; world: Vec3 }\n | { kind: 'onPlane'; planeId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onLine'; lineId: string; t: number; world: Vec3 }\n | { kind: 'onPolygon'; polygonId: string; u: number; v: number; world: Vec3 }\n | { kind: 'onSphere'; sphereId: string; theta: number; phi: number; world: Vec3 }\n | { kind: 'empty' };\n\nconst AXIS_PIXEL_THRESHOLD = 12;\n\nexport function hitTest(\n screen: { x: number; y: number },\n view: View3DLike,\n state: State,\n): SceneHit {\n // `screen` arrives in user-space; thresholds below are in pixels and need to\n // be converted to user units via the board's px-per-unit scale.\n \n const board = (view as any)?.board;\n // Fallback to 1 (no scaling) when board is missing so the hitTest unit tests,\n // whose mock view emits pixel-space coords directly, keep working unchanged.\n const ux = typeof board?.unitX === 'number' && board.unitX > 0 ? board.unitX : 1;\n const axisThresholdUser = AXIS_PIXEL_THRESHOLD / ux;\n\n // 1. Existing point snap\n const snap = findSnapPoint(screen, view, state);\n if (snap) return { kind: 'existingPoint', pointId: snap };\n\n const ray = screenToRay(screen, view);\n\n // 2. Spheres\n let bestSphere: { id: string; t: number; world: Vec3 } | null = null;\n for (const obj of listObjects(state)) {\n if (obj.kind !== 'sphere3d' || !obj.visible) continue;\n const attrs = obj.attrs as Sphere3DAttrs;\n const centerPoint = state.objects[attrs.center];\n const surfacePoint = state.objects[attrs.surfacePoint];\n if (!centerPoint || centerPoint.kind !== 'point3d') continue;\n if (!surfacePoint || surfacePoint.kind !== 'point3d') continue;\n const center = constraintToWorld((centerPoint.attrs as Point3DAttrs).constraint, state);\n const surface = constraintToWorld((surfacePoint.attrs as Point3DAttrs).constraint, state);\n const radius = Math.hypot(\n surface[0] - center[0],\n surface[1] - center[1],\n surface[2] - center[2],\n );\n const sh = raySphere(ray, { center, radius });\n if (sh && (bestSphere === null || sh.t < bestSphere.t)) {\n bestSphere = { id: obj.id, t: sh.t, world: sh.point };\n }\n }\n\n // 3. Axis snap — project click onto each axis line in screen space, check pixel distance\n if (view.project3DTo2D) {\n const axes: { axis: 'x' | 'y' | 'z'; a: Vec3; b: Vec3 }[] = [\n { axis: 'x', a: [-10, 0, 0], b: [10, 0, 0] },\n { axis: 'y', a: [0, -10, 0], b: [0, 10, 0] },\n { axis: 'z', a: [0, 0, -10], b: [0, 0, 10] },\n ];\n for (const ax of axes) {\n const pa = view.project3DTo2D(ax.a[0], ax.a[1], ax.a[2]);\n const pb = view.project3DTo2D(ax.b[0], ax.b[1], ax.b[2]);\n const d = distScreenPointToSegment(screen, [pa[1], pa[2]], [pb[1], pb[2]]);\n if (d <= axisThresholdUser) {\n const hit = rayLineSegment(ray, { a: ax.a, b: ax.b }, 1e3);\n if (hit) {\n const t = ax.axis === 'x' ? hit.point[0] : ax.axis === 'y' ? hit.point[1] : hit.point[2];\n return { kind: 'onAxis', axis: ax.axis, t, world: hit.point };\n }\n }\n }\n }\n\n // 4. User-defined planes\n let bestPlane: { id: string; t: number; world: Vec3; basis: NonNullable<ReturnType<typeof planeBasis>> } | null = null;\n for (const obj of listObjects(state)) {\n if (obj.kind !== 'plane3d' || !obj.visible) continue;\n const basis = planeBasis(obj.attrs as Plane3DAttrs, state);\n if (!basis) continue;\n const ph = rayPlane(ray, { point: basis.origin, normal: basis.normal });\n if (ph && (bestPlane === null || ph.t < bestPlane.t)) {\n bestPlane = { id: obj.id, t: ph.t, world: ph.point, basis };\n }\n }\n // Compare best plane to best sphere — return whichever is closer\n if (bestPlane && (!bestSphere || bestPlane.t < bestSphere.t)) {\n const rel: Vec3 = [\n bestPlane.world[0] - bestPlane.basis.origin[0],\n bestPlane.world[1] - bestPlane.basis.origin[1],\n bestPlane.world[2] - bestPlane.basis.origin[2],\n ];\n const b1n = dot3(bestPlane.basis.basis1, bestPlane.basis.basis1);\n const b2n = dot3(bestPlane.basis.basis2, bestPlane.basis.basis2);\n const u = b1n === 0 ? 0 : dot3(rel, bestPlane.basis.basis1) / b1n;\n const v = b2n === 0 ? 0 : dot3(rel, bestPlane.basis.basis2) / b2n;\n return { kind: 'onPlane', planeId: bestPlane.id, u, v, world: bestPlane.world };\n }\n\n // 5. Sphere result (if found)\n if (bestSphere) {\n const sph = state.objects[bestSphere.id];\n if (sph && sph.kind === 'sphere3d') {\n const centerPt = state.objects[(sph.attrs as Sphere3DAttrs).center];\n if (centerPt && centerPt.kind === 'point3d') {\n const center = constraintToWorld((centerPt.attrs as Point3DAttrs).constraint, state);\n const relX = bestSphere.world[0] - center[0];\n const relY = bestSphere.world[1] - center[1];\n const relZ = bestSphere.world[2] - center[2];\n const r = Math.hypot(relX, relY, relZ);\n const phi = r === 0 ? 0 : Math.acos(relZ / r);\n const theta = Math.atan2(relY, relX);\n return { kind: 'onSphere', sphereId: bestSphere.id, theta, phi, world: bestSphere.world };\n }\n }\n }\n\n // 6. Ground\n const g = rayGround(ray);\n if (g) return { kind: 'onGround', world: g.point };\n\n return { kind: 'empty' };\n}\n\nfunction distScreenPointToSegment(\n p: { x: number; y: number },\n a: [number, number],\n b: [number, number],\n): number {\n const vx = b[0] - a[0];\n const vy = b[1] - a[1];\n const wx = p.x - a[0];\n const wy = p.y - a[1];\n const c1 = vx * wx + vy * wy;\n if (c1 <= 0) return Math.hypot(wx, wy);\n const c2 = vx * vx + vy * vy;\n if (c2 <= c1) return Math.hypot(p.x - b[0], p.y - b[1]);\n const t = c1 / c2;\n const px = a[0] + t * vx;\n const py = a[1] + t * vy;\n return Math.hypot(p.x - px, p.y - py);\n}\n\nfunction planeBasis(\n plane: Plane3DAttrs,\n state: State,\n): { origin: Vec3; basis1: Vec3; basis2: Vec3; normal: Vec3 } | null {\n let p1: Vec3, p2: Vec3, p3: Vec3;\n if (plane.construction) {\n // Mặt PHÁI SINH (∥/⊥): 3 điểm tính từ planeConstructionWorld → pick được\n // như mặt thường (math+render đã hỗ trợ; cho phép nối chuỗi mặt phái sinh).\n // Chu trình/suy biến throw → bỏ qua hit.\n try {\n const r = planeConstructionWorld(plane.construction, state);\n p1 = r.p1; p2 = r.p2; p3 = r.p3;\n } catch {\n return null;\n }\n } else {\n if (!plane.p1 || !plane.p2 || !plane.p3) return null;\n const p1Obj = state.objects[plane.p1];\n const p2Obj = state.objects[plane.p2];\n const p3Obj = state.objects[plane.p3];\n if (!p1Obj || p1Obj.kind !== 'point3d') return null;\n if (!p2Obj || p2Obj.kind !== 'point3d') return null;\n if (!p3Obj || p3Obj.kind !== 'point3d') return null;\n p1 = constraintToWorld((p1Obj.attrs as Point3DAttrs).constraint, state);\n p2 = constraintToWorld((p2Obj.attrs as Point3DAttrs).constraint, state);\n p3 = constraintToWorld((p3Obj.attrs as Point3DAttrs).constraint, state);\n }\n const basis1: Vec3 = [p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]];\n const tmp: Vec3 = [p3[0] - p1[0], p3[1] - p1[1], p3[2] - p1[2]];\n const cx = basis1[1] * tmp[2] - basis1[2] * tmp[1];\n const cy = basis1[2] * tmp[0] - basis1[0] * tmp[2];\n const cz = basis1[0] * tmp[1] - basis1[1] * tmp[0];\n const cLen = Math.hypot(cx, cy, cz);\n if (cLen === 0) return null;\n const normal: Vec3 = [cx / cLen, cy / cLen, cz / cLen];\n const basis2: Vec3 = [\n normal[1] * basis1[2] - normal[2] * basis1[1],\n normal[2] * basis1[0] - normal[0] * basis1[2],\n normal[0] * basis1[1] - normal[1] * basis1[0],\n ];\n return { origin: p1, basis1, basis2, normal };\n}\n\nfunction dot3(a: Vec3, b: Vec3): number {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n","const isDev = (() => {\n try {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n } catch {\n return false;\n }\n})();\n\n/**\n * Wrap JSXGraph operations that can throw on stale/missing state.\n * In dev mode: log to console. In prod: silent swallow + return fallback.\n *\n * @param label Short tag for grep-ability (vd \"removeObject\", \"board.update\").\n * @param fn Operation to execute.\n * @param fallback Value to return if fn throws (default: undefined).\n */\nexport function safeJsx<T>(label: string, fn: () => T): T | undefined;\nexport function safeJsx<T>(label: string, fn: () => T, fallback: T): T;\nexport function safeJsx<T>(label: string, fn: () => T, fallback?: T): T | undefined {\n try {\n return fn();\n } catch (err) {\n if (isDev) {\n \n console.warn('[whiteboard:jsxgraph]', label, err);\n }\n return fallback;\n }\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Minimal JSXGraph board surface that wheel-zoom logic depends on.\n * Local shape to avoid importing the (untyped) jsxgraph default export here.\n */\nexport interface JxgBoardZoomable {\n zoomIn: (x?: number, y?: number) => void;\n zoomOut: (x?: number, y?: number) => void;\n // JSXGraph older versions may not expose this — wheel still works, just\n // without cursor-anchored zoom (falls back to board-center).\n getUsrCoordsOfMouse?: (e: WheelEvent) => unknown;\n}\n\n/**\n * Attach Excalidraw-style Ctrl/Cmd + wheel zoom to a container element.\n *\n * - Khi wheel kèm Ctrl/Cmd: preventDefault + zoom in/out với anchor tại\n * con trỏ (nếu board hỗ trợ `getUsrCoordsOfMouse`).\n * - Khi wheel không kèm modifier: bỏ qua → page scroll bình thường.\n *\n * Returns cleanup fn. Caller chịu trách nhiệm gọi trong cleanup của useEffect.\n *\n * @param target Container element (`HTMLDivElement` hoặc `SVGSVGElement`).\n * @param board JSXGraph board instance đã initBoard xong.\n * @param label Tag để log dev-mode khi safeJsx swallow lỗi (vd \"MiniBoard.2d\").\n */\nexport function attachJxgWheelZoom(\n target: HTMLElement,\n board: JxgBoardZoomable,\n label = 'wheelZoom',\n): () => void {\n const onWheel = (e: WheelEvent): void => {\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n e.stopPropagation();\n let cx: number | undefined;\n let cy: number | undefined;\n safeJsx(`${label}.coords`, () => {\n const usr = board.getUsrCoordsOfMouse?.(e);\n if (Array.isArray(usr) && usr.length >= 2\n && Number.isFinite(usr[0]) && Number.isFinite(usr[1])) {\n cx = usr[0] as number;\n cy = usr[1] as number;\n }\n });\n if (e.deltaY < 0) safeJsx(`${label}.in`, () => board.zoomIn(cx, cy));\n else if (e.deltaY > 0) safeJsx(`${label}.out`, () => board.zoomOut(cx, cy));\n };\n target.addEventListener('wheel', onWheel, { passive: false });\n return () => { target.removeEventListener('wheel', onWheel); };\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Toggles cho common JSXGraph options. Per-stamp callsite override mặc định\n * nếu cần preserve behavior cụ thể.\n *\n * Mặc định:\n * - text.display = 'internal' (true) — bắt buộc cho clone-SVG export.\n * - text.useASCII/MathJax/Katex = false (true) — JSXGraph default rendering,\n * không load extra text engine.\n * - label.display = 'internal' (true) — point label vào trong SVG.\n * - elements.highlight = false (FALSE mặc định) — opt-in vì graph-2d cần\n * JSXGraph's default hover-highlight để phân biệt object đang hover.\n */\nexport interface JxgInitDefaults {\n textDisplayInternal?: boolean;\n disableTextEngines?: boolean;\n labelDisplayInternal?: boolean;\n disableElementHighlight?: boolean;\n}\n\nexport interface InitJxgBoardConfig {\n /** Per-MiniBoard toggle cho common defaults. */\n defaults?: JxgInitDefaults;\n /** Options pass thẳng vào `JXG.JSXGraph.initBoard(target, opts)`. */\n boardOptions: Record<string, unknown>;\n /**\n * Hook để tweak options sau khi defaults được apply. Dùng cho per-stamp\n * customization (vd themeLabel color cho 2D, axesPosition cho 3D view3d).\n */\n \n extraOptionTweaks?: (opts: any) => void;\n /** Tag cho safeJsx log (vd \"MiniBoard.2d\"). Default: \"JxgBoard\". */\n label?: string;\n}\n\nexport interface InitJxgBoardResult {\n \n JXG: any;\n \n board: any;\n /** Gọi để free JSXGraph board (safe-wrapped). */\n cleanup: () => void;\n}\n\n/**\n * Async dynamic-import JSXGraph + apply common options + initBoard + trả\n * cleanup. Centralize boilerplate shared bởi 3 MiniBoard (2D/3D/graph-2d).\n *\n * Caller vẫn handle cancellation flag, refs, và post-init setup (renderer,\n * view3d, axes, etc.) ngoài helper này.\n *\n * @throws Nếu JSXGraph load hoặc initBoard throw. Caller nên try/catch nếu\n * cần tolerate mock environments.\n */\nexport async function initJxgBoard(\n target: string | HTMLElement,\n config: InitJxgBoardConfig,\n): Promise<InitJxgBoardResult> {\n const label = config.label ?? 'JxgBoard';\n \n const JXG = (await import('jsxgraph')).default as any;\n const {\n textDisplayInternal = true,\n disableTextEngines = true,\n labelDisplayInternal = true,\n disableElementHighlight = false,\n } = config.defaults ?? {};\n safeJsx(`${label}.applyOptions`, () => {\n const opts = JXG.Options;\n if (!opts) return;\n if (textDisplayInternal || disableTextEngines) {\n opts.text = opts.text ?? {};\n if (textDisplayInternal) opts.text.display = 'internal';\n if (disableTextEngines) {\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n }\n }\n if (labelDisplayInternal) {\n opts.label = opts.label ?? {};\n opts.label.display = 'internal';\n }\n if (disableElementHighlight) {\n opts.elements = opts.elements ?? {};\n opts.elements.highlight = false;\n }\n config.extraOptionTweaks?.(opts);\n });\n const board = JXG.JSXGraph.initBoard(target, config.boardOptions);\n const cleanup = (): void => {\n safeJsx(`${label}.freeBoard`, () => JXG.JSXGraph.freeBoard(board));\n };\n return { JXG, board, cleanup };\n}\n","'use client';\nimport * as React from 'react';\nimport {\n DEFAULT_VIEW3D,\n GROUND_PLANE_ATTRS,\n GROUND_PLANE_RANGE,\n VIEW3D_ATTRS,\n paletteFor,\n} from './theme';\nimport { attachJxgWheelZoom } from '../../shared/attachJxgWheelZoom';\nimport { initJxgBoard } from '../../shared/initJxgBoard';\n\n// JSXGraph board / view types are not published — use minimal local shapes.\n \ntype JxgBoard = any;\n \ntype JxgView3D = any;\n\nexport interface MiniBoard3DProps {\n isDark: boolean;\n onView3DReady?: (view: JxgView3D, board: JxgBoard) => void;\n onPointerClick?: (screen: { x: number; y: number }) => void;\n onPointerMove?: (screen: { x: number; y: number }) => void;\n onPointerLeave?: () => void;\n /**\n * Called on pointerdown. Return true to switch the upcoming drag from the\n * default view-rotate mode into a delegated point-drag (passed to\n * onPointerDrag / onPointerDragEnd). The screen coord is in user-space.\n */\n shouldStartPointDrag?: (screen: { x: number; y: number }) => boolean;\n onPointerDrag?: (screen: { x: number; y: number }) => void;\n /**\n * Called at the end of a point-drag gesture (also invoked defensively on\n * pointerleave during an in-flight drag). The screen coord is in user-space.\n * Consumers that only need a \"drag ended\" notification may ignore the arg.\n */\n onPointerDragEnd?: (screen: { x: number; y: number }) => void;\n /**\n * Called on pointermove (khi không đang drag) để biết có hover object không.\n * Return true → cursor đổi 'pointer'; false → cursor reset về ''. Apply mọi\n * tool — báo hiệu \"object click/drag được\".\n */\n isHoveringObject?: (screen: { x: number; y: number }) => boolean;\n}\n\nexport interface MiniBoard3DHandle {\n getBoard: () => JxgBoard | null;\n getView3D: () => JxgView3D | null;\n /** Returns the current SVG element of the board for export. */\n getSvgElement: () => SVGSVGElement | null;\n}\n\nexport const MiniBoard3D = React.forwardRef<MiniBoard3DHandle, MiniBoard3DProps>(\n function MiniBoard3D(props, ref) {\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const boardRef = React.useRef<JxgBoard | null>(null);\n const viewRef = React.useRef<JxgView3D | null>(null);\n const {\n isDark,\n onView3DReady,\n onPointerClick,\n onPointerMove,\n onPointerLeave,\n shouldStartPointDrag,\n onPointerDrag,\n onPointerDragEnd,\n isHoveringObject,\n } = props;\n\n // Keep latest callback refs stable across re-renders so the init effect\n // doesn't have to re-run when handlers change.\n const onView3DReadyRef = React.useRef(onView3DReady);\n const onPointerClickRef = React.useRef(onPointerClick);\n const onPointerMoveRef = React.useRef(onPointerMove);\n const onPointerLeaveRef = React.useRef(onPointerLeave);\n const shouldStartPointDragRef = React.useRef(shouldStartPointDrag);\n const onPointerDragRef = React.useRef(onPointerDrag);\n const onPointerDragEndRef = React.useRef(onPointerDragEnd);\n const isHoveringObjectRef = React.useRef(isHoveringObject);\n onView3DReadyRef.current = onView3DReady;\n onPointerClickRef.current = onPointerClick;\n onPointerMoveRef.current = onPointerMove;\n onPointerLeaveRef.current = onPointerLeave;\n shouldStartPointDragRef.current = shouldStartPointDrag;\n onPointerDragRef.current = onPointerDrag;\n onPointerDragEndRef.current = onPointerDragEnd;\n isHoveringObjectRef.current = isHoveringObject;\n\n React.useImperativeHandle(\n ref,\n () => ({\n getBoard: () => boardRef.current,\n getView3D: () => viewRef.current,\n getSvgElement: () => containerRef.current?.querySelector('svg') ?? null,\n }),\n [],\n );\n\n React.useEffect(() => {\n const div = containerRef.current;\n if (!div) return;\n let cancelled = false;\n let board: JxgBoard | null = null;\n let svgEl: SVGSVGElement | null = null;\n let handlePointerDown: ((e: PointerEvent) => void) | null = null;\n let handlePointerMove: ((e: PointerEvent) => void) | null = null;\n let handlePointerUp: ((e: PointerEvent) => void) | null = null;\n let handlePointerLeave: (() => void) | null = null;\n let wheelCleanup: (() => void) | null = null;\n let freeBoard: (() => void) | null = null;\n\n void (async () => {\n let initResult;\n try {\n initResult = await initJxgBoard(div, {\n label: 'MiniBoard.3d',\n defaults: { disableElementHighlight: true },\n boardOptions: {\n boundingbox: [-6, 6, 6, -6],\n keepaspectratio: true,\n axis: false,\n showCopyright: false,\n showNavigation: false,\n renderer: 'svg',\n // Wheel zoom được tự xử lý bằng Ctrl/Cmd + wheel ở dưới (Excalidraw-style).\n zoom: { wheel: false },\n },\n });\n } catch {\n return;\n }\n if (cancelled || !containerRef.current) { initResult.cleanup(); return; }\n board = initResult.board;\n freeBoard = initResult.cleanup;\n if (cancelled || !board) return;\n boardRef.current = board;\n\n // Ctrl/Cmd + wheel zoom: cuộn lên phóng to, cuộn xuống thu nhỏ. Không\n // có modifier thì để page scroll bình thường.\n wheelCleanup = attachJxgWheelZoom(div, board, 'MiniBoard.3d');\n\n let view: JxgView3D | null = null;\n try {\n const baseAttrs = VIEW3D_ATTRS(isDark);\n view = board.create(\n 'view3d',\n [\n [-5, -5],\n [10, 10],\n [\n [DEFAULT_VIEW3D.bbox3D[0], DEFAULT_VIEW3D.bbox3D[3]],\n [DEFAULT_VIEW3D.bbox3D[1], DEFAULT_VIEW3D.bbox3D[4]],\n [DEFAULT_VIEW3D.bbox3D[2], DEFAULT_VIEW3D.bbox3D[5]],\n ],\n ],\n {\n ...baseAttrs,\n // JSXGraph view3d đọc giá trị khởi tạo từ az.slider.start (không\n // phải az.value). Pass nhầm `value` → JSXGraph dùng default\n // 1.0/0.3, khiến DEFAULT_VIEW3D bị bỏ qua.\n az: { ...baseAttrs.az, slider: { ...baseAttrs.az.slider, start: DEFAULT_VIEW3D.azimuth } },\n el: { ...baseAttrs.el, slider: { ...baseAttrs.el.slider, start: DEFAULT_VIEW3D.elevation } },\n },\n );\n } catch {\n /* ignore — mock or jsdom limitation */\n }\n viewRef.current = view;\n if (view) {\n // GeoGebra-style XY ground plane through origin (z=0), drawn behind\n // any user-created geometry. View3D's built-in zPlaneRear sits at the\n // bbox floor (z=zMin), not at the axes — so we draw an explicit one.\n try {\n (view as { create: (k: string, p: unknown[], a: unknown) => unknown }).create(\n 'plane3d',\n [\n [0, 0, 0],\n [1, 0, 0],\n [0, 1, 0],\n GROUND_PLANE_RANGE,\n GROUND_PLANE_RANGE,\n ],\n GROUND_PLANE_ATTRS(isDark),\n );\n } catch {\n /* swallow — older JSXGraph or mock may not support 5-arg plane3d */\n }\n onView3DReadyRef.current?.(view, board);\n }\n\n svgEl = (containerRef.current?.querySelector('svg') ?? null) as SVGSVGElement | null;\n if (svgEl) {\n const p = paletteFor(isDark);\n svgEl.style.background = p.view3dBg;\n\n // Convert browser pixel coords to JSXGraph user-space coords so that\n // hitTest math (which compares against view.project3DTo2D output, also\n // in user-space) is in the same coordinate system.\n const pixelToUser = (e: PointerEvent): { x: number; y: number } => {\n const rect = svgEl!.getBoundingClientRect();\n const px = e.clientX - rect.left;\n const py = e.clientY - rect.top;\n \n const b = board as any;\n if (!b || !b.origin || !b.origin.scrCoords) {\n return { x: px, y: py };\n }\n const ox = b.origin.scrCoords[1];\n const oy = b.origin.scrCoords[2];\n const ux = b.unitX || 1;\n const uy = b.unitY || 1;\n return { x: (px - ox) / ux, y: (oy - py) / uy };\n };\n // Drag-to-rotate: track pointerdown start; if pointer travels past\n // DRAG_THRESHOLD before pointerup → rotate az/el and suppress click.\n const DRAG_THRESHOLD = 4;\n const AZ_PER_PX = 0.01;\n const EL_PER_PX = 0.01;\n const EL_LIMIT = Math.PI / 2 - 0.05;\n let dragStart: { x: number; y: number } | null = null;\n let dragging = false;\n let pointDragMode = false;\n let startAz = 0;\n let startEl = 0;\n const readAng = (s: { Value?: () => number; value?: number } | undefined): number => {\n if (!s) return 0;\n if (typeof s.Value === 'function') {\n try { return s.Value(); } catch { /* fallthrough */ }\n }\n return typeof s.value === 'number' ? s.value : 0;\n };\n const setAng = (\n s: { setValue?: (v: number) => void; value?: number } | undefined,\n v: number,\n ): void => {\n if (!s) return;\n if (typeof s.setValue === 'function') {\n try { s.setValue(v); return; } catch { /* fallthrough */ }\n }\n s.value = v;\n };\n\n handlePointerDown = (e: PointerEvent) => {\n if (!svgEl) return;\n dragStart = { x: e.clientX, y: e.clientY };\n dragging = false;\n pointDragMode = false;\n // If the consumer claims this drag (e.g. cursor is over an existing\n // point), enter point-drag mode and skip view-rotation.\n const screen = pixelToUser(e);\n try {\n pointDragMode = shouldStartPointDragRef.current?.(screen) ?? false;\n } catch { pointDragMode = false; }\n if (!pointDragMode) {\n \n const v = viewRef.current as any;\n startAz = readAng(v?.az_slide ?? v?.az);\n startEl = readAng(v?.el_slide ?? v?.el);\n }\n try { svgEl.setPointerCapture?.(e.pointerId); } catch { /* ignore */ }\n };\n handlePointerMove = (e: PointerEvent) => {\n if (!svgEl) return;\n if (dragStart) {\n const dx = e.clientX - dragStart.x;\n const dy = e.clientY - dragStart.y;\n if (!dragging && Math.hypot(dx, dy) > DRAG_THRESHOLD) dragging = true;\n if (dragging) {\n if (pointDragMode) {\n onPointerDragRef.current?.(pixelToUser(e));\n return;\n }\n \n const v = viewRef.current as any;\n const newAz = startAz + dx * AZ_PER_PX;\n let newEl = startEl - dy * EL_PER_PX;\n if (newEl > EL_LIMIT) newEl = EL_LIMIT;\n if (newEl < -EL_LIMIT) newEl = -EL_LIMIT;\n setAng(v?.az_slide ?? v?.az, newAz);\n setAng(v?.el_slide ?? v?.el, newEl);\n try { v?.board?.update?.(); } catch { /* ignore */ }\n return;\n }\n }\n const screen = pixelToUser(e);\n onPointerMoveRef.current?.(screen);\n // Hover cursor: pointer khi hover object (point/edge/...). Apply\n // mọi tool — báo hiệu draggable/clickable. Khi đang drag thì skip\n // (dragging branch ở trên đã return sớm).\n const hovering = isHoveringObjectRef.current?.(screen) ?? false;\n svgEl.style.cursor = hovering ? 'pointer' : '';\n };\n handlePointerUp = (e: PointerEvent) => {\n if (!svgEl) return;\n const wasDrag = dragging;\n const hadDown = dragStart !== null;\n const wasPointDrag = pointDragMode;\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n try { svgEl.releasePointerCapture?.(e.pointerId); } catch { /* ignore */ }\n // When the consumer claimed the gesture (pointDragMode), it owns\n // both placement and finalisation. Always run onPointerDragEnd so\n // any consumer-side refs are cleared (and an undo checkpoint can\n // be pushed), and SKIP onPointerClick to avoid double-handling\n // (e.g. Point-tool place-and-lift creates the point in\n // shouldStartPointDrag; we mustn't also fire the\n // click→consumeHit→buildPoint path).\n if (hadDown && wasPointDrag) {\n onPointerDragEndRef.current?.(pixelToUser(e));\n return;\n }\n if (hadDown && !wasDrag) {\n onPointerClickRef.current?.(pixelToUser(e));\n }\n };\n handlePointerLeave = () => {\n if (pointDragMode) {\n // Best-effort cleanup so a stray pointerleave during a drag\n // doesn't leak the consumer's draggedPointRef.\n try { onPointerDragEndRef.current?.({ x: 0, y: 0 }); } catch { /* ignore */ }\n }\n dragStart = null;\n dragging = false;\n pointDragMode = false;\n onPointerLeaveRef.current?.();\n };\n svgEl.addEventListener('pointerdown', handlePointerDown);\n svgEl.addEventListener('pointermove', handlePointerMove);\n svgEl.addEventListener('pointerup', handlePointerUp);\n svgEl.addEventListener('pointercancel', handlePointerUp);\n svgEl.addEventListener('pointerleave', handlePointerLeave);\n }\n })();\n\n return () => {\n cancelled = true;\n if (wheelCleanup) {\n wheelCleanup();\n wheelCleanup = null;\n }\n if (svgEl) {\n if (handlePointerDown) svgEl.removeEventListener('pointerdown', handlePointerDown);\n if (handlePointerMove) svgEl.removeEventListener('pointermove', handlePointerMove);\n if (handlePointerUp) {\n svgEl.removeEventListener('pointerup', handlePointerUp);\n svgEl.removeEventListener('pointercancel', handlePointerUp);\n }\n if (handlePointerLeave) svgEl.removeEventListener('pointerleave', handlePointerLeave);\n }\n if (freeBoard) { freeBoard(); freeBoard = null; }\n boardRef.current = null;\n viewRef.current = null;\n };\n }, [isDark]);\n\n const p = paletteFor(isDark);\n\n return (\n <div\n data-testid=\"mini-board-3d\"\n ref={containerRef}\n style={{\n width: '100%',\n height: '100%',\n minHeight: 400,\n background: p.view3dBg,\n position: 'relative',\n // Clip JSXGraph mesh3d paths projecting outside the container.\n overflow: 'hidden',\n }}\n />\n );\n },\n);\n","/**\n * preview3d.ts — Transient \"ghost\" shape that tracks the cursor between clicks\n * for multi-point tools (segment / line / ray / vector / polygon / plane /\n * sphere / pyramid / prism / tetrahedron / cube / cylinder / cone).\n *\n * Lifecycle:\n * - Constructed once per editor session when view3D is ready.\n * - `update(tool, collected, hoverHit)` rebuilds the preview from scratch on\n * every pointer move. Cheap because we only create a handful of JSXGraph\n * primitives.\n * - `clear()` removes everything (called on tool change / cancel / build).\n * - `dispose()` final teardown.\n *\n * Coordinates are derived from the same hit-test path used by the controller,\n * so the phantom point lands exactly where the next real point would land if\n * the user clicked now.\n */\n\nimport type { Store } from '../../../core/scene';\nimport type { Point3DAttrs } from '../../../core/scene/kinds/point3d';\nimport { constraintToWorld, type Vec3 } from './scene/constraintMath';\nimport type { SceneHit } from './hitTest/hitTest';\nimport type { CollectedArg, ToolKey } from './tools/spec';\n\n \ntype JxgView3D = any;\n \ntype JxgEl = any;\n\nconst PREVIEW_STYLE = {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.7,\n dash: 2,\n fixed: true,\n highlight: false,\n withLabel: false,\n} as const;\n\nexport class Preview3DManager {\n private view: JxgView3D;\n private store: Store;\n private phantom: JxgEl | null = null;\n private pickPts: JxgEl[] = [];\n private shapes: JxgEl[] = [];\n private disposed = false;\n\n constructor(view: JxgView3D, store: Store) {\n this.view = view;\n this.store = store;\n }\n\n clear(): void {\n const v = this.view as { removeObject?: (e: unknown) => void };\n for (const s of this.shapes) {\n try { v.removeObject?.(s); } catch { /* ignore */ }\n }\n this.shapes = [];\n for (const p of this.pickPts) {\n try { v.removeObject?.(p); } catch { /* ignore */ }\n }\n this.pickPts = [];\n if (this.phantom) {\n try { v.removeObject?.(this.phantom); } catch { /* ignore */ }\n this.phantom = null;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.clear();\n this.disposed = true;\n }\n\n /**\n * Rebuild the preview from scratch using the controller's current `tool` +\n * `collected` args + the live `hoverHit` from the most recent pointer move.\n *\n * Returns early (and clears) when there's nothing to preview:\n * - no tool selected\n * - no points collected yet\n * - hover is empty / off-surface\n * - any collected arg lacks a hit (number steps)\n */\n update(tool: ToolKey | null, collected: CollectedArg[], hoverHit: SceneHit): void {\n if (this.disposed) return;\n this.clear();\n if (!tool || tool === 'move') return;\n if (collected.length === 0) return;\n if (hoverHit.kind === 'empty') return;\n\n const phantomCoords = this.hitToCoords(hoverHit);\n if (!phantomCoords) return;\n\n const pickCoords: Vec3[] = [];\n for (const c of collected) {\n if (!c.hit) return;\n const coords = this.hitToCoords(c.hit);\n if (!coords) return;\n pickCoords.push(coords);\n }\n\n try {\n this.phantom = this.view.create('point3d', phantomCoords, {\n visible: false, fixed: true, withLabel: false, name: '',\n });\n } catch { return; }\n\n for (const coords of pickCoords) {\n try {\n const p = this.view.create('point3d', coords, {\n visible: false, fixed: true, withLabel: false, name: '',\n });\n this.pickPts.push(p);\n } catch { return; }\n }\n\n this.buildShape(tool);\n }\n\n private buildShape(tool: ToolKey): void {\n const phantom = this.phantom;\n const picks = this.pickPts;\n if (!phantom || picks.length === 0) return;\n const last = picks[picks.length - 1];\n\n try {\n switch (tool) {\n case 'segment':\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n return;\n case 'line':\n this.shapes.push(this.makeLine3d(picks[0], phantom, true, true));\n return;\n case 'ray':\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, true));\n return;\n case 'vector':\n this.shapes.push(this.view.create('line3d', [picks[0], phantom], {\n ...PREVIEW_STYLE,\n straightFirst: false,\n straightLast: false,\n lastArrow: { type: 1 },\n }));\n return;\n case 'polygon':\n case 'pyramid':\n case 'prism': {\n for (let i = 0; i < picks.length - 1; i += 1) {\n this.shapes.push(this.makeLine3d(picks[i], picks[i + 1], false, false));\n }\n this.shapes.push(this.makeLine3d(last, phantom, false, false));\n if (picks.length >= 2) {\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n }\n return;\n }\n case 'plane': {\n if (picks.length === 1) {\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n } else if (picks.length === 2) {\n this.shapes.push(this.makeLine3d(picks[0], picks[1], false, false));\n this.shapes.push(this.makeLine3d(picks[1], phantom, false, false));\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n }\n return;\n }\n case 'sphere': {\n this.shapes.push(this.view.create('sphere3d', [picks[0], phantom], {\n ...PREVIEW_STYLE,\n fillColor: 'none',\n fillOpacity: 0,\n }));\n return;\n }\n case 'tetrahedron':\n case 'cube':\n case 'cylinder':\n case 'cone':\n this.shapes.push(this.makeLine3d(picks[0], phantom, false, false));\n return;\n default:\n return;\n }\n } catch { /* ignore */ }\n }\n\n private makeLine3d(a: JxgEl, b: JxgEl, straightFirst: boolean, straightLast: boolean): JxgEl {\n return this.view.create('line3d', [a, b], {\n ...PREVIEW_STYLE,\n straightFirst,\n straightLast,\n });\n }\n\n private hitToCoords(hit: SceneHit): Vec3 | null {\n if (hit.kind === 'existingPoint') {\n const obj = this.store.getState().objects[hit.pointId];\n if (!obj || obj.kind !== 'point3d') return null;\n return constraintToWorld((obj.attrs as Point3DAttrs).constraint, this.store.getState());\n }\n if ('world' in hit) return hit.world;\n return null;\n }\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface StatusHintProps {\n hint: string;\n hoverLabel?: string | null;\n}\n\nexport function StatusHint(props: StatusHintProps): React.ReactElement {\n const { hint, hoverLabel } = props;\n return (\n <div\n data-testid=\"status-hint\"\n className=\"border-t border-zinc-200 bg-zinc-50 px-3 py-1.5 text-xs text-zinc-700 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-300\"\n >\n <span>📐 {hint || 'Chọn công cụ trong bảng bên trái'}</span>\n {hoverLabel ? (\n <span className=\"ml-3 text-zinc-500\">— đang trên: {hoverLabel}</span>\n ) : null}\n </div>\n );\n}\n","// src/stamps/geometry-3d/editor/usePointDrag.ts\nimport * as React from 'react';\nimport { nextLabel, type State, type Store } from '../../../core/scene';\nimport type { Constraint3D } from '../../../core/scene/kinds/3d-constraint';\nimport type { Point3DAttrs } from '../../../core/scene/kinds/point3d';\nimport { hitTest } from './hitTest/hitTest';\nimport { rayPlane } from './hitTest/intersect';\nimport { screenToRay } from './hitTest/rayCast';\nimport { constraintToWorld, type Vec3 } from './scene/constraintMath';\nimport { hitToConstraint } from './tools/handlers/_ensurePoint';\nimport type { MiniBoard3DHandle } from './MiniBoard3D';\nimport type { ToolKey } from './tools/spec';\n\nexport interface UsePointDragOptions {\n store: Store;\n boardRef: React.RefObject<MiniBoard3DHandle | null>;\n /** Ref tới tool đang chọn — đọc tươi tránh stale closure trong drag. */\n selectedToolRef: React.RefObject<ToolKey>;\n}\n\nexport interface UsePointDragHandlers {\n /**\n * Trả về true nếu gesture là drag/place point của ta. True cũng suppress\n * view rotation của MiniBoard3D suốt phần còn lại của gesture.\n */\n shouldStartPointDrag: (screen: { x: number; y: number }) => boolean;\n onPointerDrag: (screen: { x: number; y: number }) => void;\n onPointerDragEnd: () => void;\n /** True khi đang trong gesture drag — handleMove dùng để pause hover label. */\n isDragging: () => boolean;\n}\n\n// Point-drag handlers cho 3D editor: drag existing point (Z-only ở tool Point,\n// XY raycast ở tool Move) + place-and-lift (tool Point trên ground/axis). Capture\n// snapshot trước mọi mutation để onPointerDragEnd push một undo checkpoint duy\n// nhất cho cả gesture.\nexport function usePointDrag(opts: UsePointDragOptions): UsePointDragHandlers {\n const { store, boardRef, selectedToolRef } = opts;\n\n const draggedPointRef = React.useRef<string | null>(null);\n const dragStartRef = React.useRef<{ screen: { x: number; y: number }; world: Vec3 } | null>(null);\n const dragSnapshotRef = React.useRef<State | null>(null);\n // Track liệu có mutation trong drag không — onPointerDragEnd dùng để quyết\n // định có cần push manual checkpoint qua LOAD-then-LOAD.\n const dragMutatedRef = React.useRef<boolean>(false);\n\n const shouldStartPointDrag = React.useCallback(\n (screen: { x: number; y: number }): boolean => {\n const view = boardRef.current?.getView3D();\n if (!view) return false;\n const tool = selectedToolRef.current;\n if (tool !== 'point' && tool !== 'move') return false;\n let hit;\n try {\n hit = hitTest(screen, view, store.getState());\n } catch {\n return false;\n }\n\n if (hit.kind === 'existingPoint') {\n const pt = store.getState().objects[hit.pointId];\n if (!pt || pt.kind !== 'point3d') return false;\n dragSnapshotRef.current = store.getState();\n dragMutatedRef.current = false;\n draggedPointRef.current = hit.pointId;\n dragStartRef.current = {\n screen,\n world: constraintToWorld((pt.attrs as Point3DAttrs).constraint, store.getState()),\n };\n return true;\n }\n\n // Point tool: place-and-lift. Capture snapshot trước, tạo point bên trong\n // withoutHistory để chỉ drag-end checkpoint nằm trên undo stack. Bypass\n // controller (Point tool repeatAfterBuild — không có collected để unwind);\n // path click→consumeHit→buildPoint bị short-circuit trong handlePointerUp\n // khi pointDragMode được set.\n if (tool === 'point' && (hit.kind === 'onGround' || hit.kind === 'onAxis')) {\n dragSnapshotRef.current = store.getState();\n dragMutatedRef.current = false;\n const constraint = hitToConstraint(hit);\n if (!constraint) {\n dragSnapshotRef.current = null;\n return false;\n }\n let id: string | null = null;\n store.withoutHistory(() => {\n const stateBefore = store.getState();\n const newId = `p${stateBefore.counter + 1}`;\n const label = nextLabel(stateBefore, 'point3d');\n store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id: newId,\n kind: 'point3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { constraint },\n },\n },\n });\n id = newId;\n });\n if (!id) {\n dragSnapshotRef.current = null;\n return false;\n }\n draggedPointRef.current = id;\n dragStartRef.current = {\n screen,\n world: [hit.world[0], hit.world[1], hit.world[2]],\n };\n return true;\n }\n\n // Point tool nhưng non-placeable surface (sphere/plane/empty): suppress\n // view rotation để camera không xoay khi user đang place point, nhưng\n // không enter drag. Clear snapshot phòng hờ.\n if (tool === 'point') {\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n return true;\n }\n\n return false;\n },\n [store, boardRef, selectedToolRef],\n );\n\n const onPointerDrag = React.useCallback(\n (screen: { x: number; y: number }) => {\n const pointId = draggedPointRef.current;\n const start = dragStartRef.current;\n if (!pointId || !start) return;\n const view = boardRef.current?.getView3D();\n if (!view) return;\n const tool = selectedToolRef.current;\n let nextWorld: Vec3;\n if (tool === 'point') {\n // Vertical lift only — giữ X,Y; map screen-Y delta sang world Z (pixelToUser\n // đã invert Y rồi).\n const dz = screen.y - start.screen.y;\n nextWorld = [start.world[0], start.world[1], start.world[2] + dz];\n } else if (tool === 'move') {\n try {\n const ray = screenToRay(screen, view);\n const hit = rayPlane(ray, { point: [0, 0, start.world[2]], normal: [0, 0, 1] });\n if (!hit) return;\n nextWorld = [hit.point[0], hit.point[1], start.world[2]];\n } catch {\n return;\n }\n } else {\n return;\n }\n const obj = store.getState().objects[pointId];\n if (!obj || obj.kind !== 'point3d') return;\n const free: Constraint3D = { kind: 'free', x: nextWorld[0], y: nextWorld[1], z: nextWorld[2] };\n // UPDATE_ATTRS → fire subscribers, JxgRenderer3D diff + update JSXGraph.\n // Wrap withoutHistory: drag-end sẽ push 1 checkpoint duy nhất.\n store.withoutHistory(() => {\n store.dispatch({ type: 'UPDATE_ATTRS', payload: { id: pointId, patch: { constraint: free } } });\n });\n dragMutatedRef.current = true;\n },\n [store, boardRef, selectedToolRef],\n );\n\n const onPointerDragEnd = React.useCallback(() => {\n const snap = dragSnapshotRef.current;\n dragSnapshotRef.current = null;\n draggedPointRef.current = null;\n dragStartRef.current = null;\n dragMutatedRef.current = false;\n // Push undo checkpoint cho cả 2 flow: click-only (ADD point inside\n // withoutHistory → cần checkpoint manual) và drag-and-lift (ADD +\n // UPDATE_ATTRS đều bị withoutHistory wrap → cùng cần). Net: 1 entry duy\n // nhất trong past stack = snap → current. Nếu snap === current (degenerate),\n // 2 LOAD đều no-op, không push gì.\n if (snap) {\n const current = store.getState();\n store.withoutHistory(() => {\n store.dispatch({ type: 'LOAD', payload: { state: snap } });\n });\n store.dispatch({ type: 'LOAD', payload: { state: current } });\n }\n }, [store]);\n\n const isDragging = React.useCallback(() => draggedPointRef.current !== null, []);\n\n return { shouldStartPointDrag, onPointerDrag, onPointerDragEnd, isDragging };\n}\n","// src/stamps/geometry-3d/editor/editorHelpers.ts\nimport type { State, View3D } from '../../../core/scene';\nimport type { SceneHit } from './hitTest/hitTest';\nimport { DEFAULT_VIEW3D } from './theme';\n\nexport function hitToHoverLabel(hit: SceneHit, state: State): string | null {\n if (hit.kind === 'empty') return null;\n if (hit.kind === 'existingPoint') return state.objects[hit.pointId]?.label ?? null;\n if (hit.kind === 'onGround') return 'mặt nền';\n if (hit.kind === 'onAxis') return `trục ${hit.axis.toUpperCase()}`;\n if (hit.kind === 'onPlane') return `mặt phẳng ${hit.planeId}`;\n if (hit.kind === 'onSphere') return `mặt cầu ${hit.sphereId}`;\n return null;\n}\n\nexport function getView3DInfo(view: unknown): View3D {\n \n const v = view as any;\n const azSlider = v?.az_slide ?? v?.az;\n const elSlider = v?.el_slide ?? v?.el;\n const azimuth = typeof azSlider?.Value === 'function' ? azSlider.Value() : 0;\n const elevation = typeof elSlider?.Value === 'function' ? elSlider.Value() : 0;\n return {\n azimuth,\n elevation,\n bbox3D: [...DEFAULT_VIEW3D.bbox3D] as [number, number, number, number, number, number],\n };\n}\n","// src/stamps/shared/StampLeftPanel/constants.ts\n//\n// Desktop popover sizing chia sẻ giữa 3 stamp editor (geometry-2d, geometry-3d,\n// graph-2d). Trước đây mỗi EditorPanel hardcode size riêng (640×540 cho 2D/graph,\n// 800×600 cho 3D) → kích thước canvas nhỏ + không nhất quán. Gom vào constant\n// 880×700 + cap responsive để dùng được trên màn nhỏ.\n\n/** Tailwind class string áp cho outer popover của stamp editor (desktop). */\nexport const STAMP_PANEL_DESKTOP =\n 'h-[700px] w-[880px] max-h-[85vh] max-w-[calc(100vw-280px)]';\n","import React, {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\nimport type { ShowToastFn, DismissToastFn, ToastItem, ToastOptions } from './types';\n\nexport interface ToastContextValue {\n items: ToastItem[];\n showToast: ShowToastFn;\n dismiss: DismissToastFn;\n}\n\nexport const ToastContext = createContext<ToastContextValue | null>(null);\n\ntype Action =\n | { type: 'PUSH'; item: ToastItem; maxVisible: number }\n | { type: 'REPLACE'; item: ToastItem }\n | { type: 'DISMISS'; id: string };\n\nfunction reducer(state: ToastItem[], action: Action): ToastItem[] {\n switch (action.type) {\n case 'PUSH': {\n const next = [...state, action.item];\n return next.length > action.maxVisible ? next.slice(next.length - action.maxVisible) : next;\n }\n case 'REPLACE':\n return state.map((it) => (it.id === action.item.id ? action.item : it));\n case 'DISMISS':\n return state.filter((it) => it.id !== action.id);\n }\n}\n\ninterface ToastProviderProps {\n children: React.ReactNode;\n /** Max simultaneously visible toasts. Default: 3. Pushing more drops oldest. */\n maxVisible?: number;\n}\n\nlet autoIdCounter = 0;\n\nexport function ToastProvider({ children, maxVisible = 3 }: ToastProviderProps) {\n const [items, dispatch] = useReducer(reducer, [] as ToastItem[]);\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n const clearTimer = useCallback((id: string) => {\n const t = timersRef.current.get(id);\n if (t) {\n clearTimeout(t);\n timersRef.current.delete(id);\n }\n }, []);\n\n const dismiss = useCallback<DismissToastFn>((id) => {\n clearTimer(id);\n dispatch({ type: 'DISMISS', id });\n }, [clearTimer]);\n\n const scheduleAutoDismiss = useCallback((id: string, duration: number) => {\n if (duration <= 0) return;\n const t = setTimeout(() => dismiss(id), duration);\n timersRef.current.set(id, t);\n }, [dismiss]);\n\n const showToast = useCallback<ShowToastFn>((message, opts: ToastOptions = {}) => {\n const variant = opts.variant ?? 'info';\n const duration = opts.duration ?? 3000;\n const id = opts.id ?? `toast-${++autoIdCounter}`;\n const item: ToastItem = { id, message, variant, duration };\n const existing = itemsRef.current.find((it) => it.id === id);\n if (existing) {\n clearTimer(id);\n dispatch({ type: 'REPLACE', item });\n } else {\n dispatch({ type: 'PUSH', item, maxVisible });\n }\n scheduleAutoDismiss(id, duration);\n }, [clearTimer, maxVisible, scheduleAutoDismiss]);\n\n useEffect(() => () => {\n timersRef.current.forEach((t) => clearTimeout(t));\n timersRef.current.clear();\n }, []);\n\n const value = useMemo(() => ({ items, showToast, dismiss }), [items, showToast, dismiss]);\n return <ToastContext.Provider value={value}>{children}</ToastContext.Provider>;\n}\n","import React from 'react';\nimport type { ToastVariant } from './types';\n\nconst VARIANT_CLASS: Record<ToastVariant, string> = {\n info: 'border-l-sky-500',\n warning: 'border-l-amber-500',\n error: 'border-l-rose-500',\n};\n\nconst VARIANT_ICON: Record<ToastVariant, React.ReactNode> = {\n info: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n ),\n warning: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n ),\n error: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n ),\n};\n\ninterface ToastProps {\n id: string;\n message: string;\n variant: ToastVariant;\n onDismiss: (id: string) => void;\n}\n\nexport function Toast({ id, message, variant, onDismiss }: ToastProps) {\n return (\n <div\n role=\"status\"\n className={[\n 'pointer-events-auto flex max-w-sm items-start gap-2 rounded-lg border-l-4 bg-white px-3 py-2 text-sm text-slate-800 shadow-md ring-1 ring-black/5',\n VARIANT_CLASS[variant],\n ].join(' ')}\n >\n <span className=\"mt-0.5 shrink-0 text-slate-500\">{VARIANT_ICON[variant]}</span>\n <span className=\"flex-1 leading-snug\">{message}</span>\n <button\n type=\"button\"\n aria-label=\"Đóng thông báo\"\n onClick={() => onDismiss(id)}\n className=\"-mr-1 ml-1 inline-flex h-5 w-5 shrink-0 items-center justify-center rounded text-slate-400 hover:bg-slate-100 hover:text-slate-700\"\n >\n ×\n </button>\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { ToastContext } from './ToastProvider';\n\nexport function useToast() {\n const ctx = useContext(ToastContext);\n if (!ctx) {\n throw new Error('useToast must be used inside <ToastProvider>');\n }\n return ctx;\n}\n","import React from 'react';\nimport { Toast } from './Toast';\nimport { useToast } from './useToast';\n\n/**\n * Renders the active toast queue. Mount once near the root of each stamp\n * EditorPanel (inside ToastProvider). Positions itself absolutely at\n * bottom-center of the nearest positioned ancestor.\n */\nexport function ToastHost() {\n const { items, dismiss } = useToast();\n if (items.length === 0) return null;\n return (\n <div\n aria-live=\"polite\"\n className=\"pointer-events-none absolute inset-x-0 bottom-3 z-50 flex flex-col items-center gap-2\"\n >\n {items.map((it) => (\n <Toast key={it.id} id={it.id} message={it.message} variant={it.variant} onDismiss={dismiss} />\n ))}\n </div>\n );\n}\n","export { ToastProvider } from './ToastProvider';\nexport { ToastHost } from './ToastHost';\nexport { Toast } from './Toast';\nexport { useToast } from './useToast';\nexport type {\n ToastVariant,\n ToastOptions,\n ToastItem,\n ShowToastFn,\n DismissToastFn,\n} from './types';\n","export const GEOMETRY_KEYWORDS_3D: string[] = [\n // solids\n 'hình chóp', 'tứ diện', 'lăng trụ', 'hình hộp', 'lập phương', 'hình lập phương',\n 'chóp', 'hộp chữ nhật', 'chóp đều', 'tứ diện đều',\n // planes / lines / relations\n 'mặt phẳng', 'giao tuyến', 'giao điểm', 'thiết diện', 'song song', 'vuông góc',\n 'chéo nhau', 'đồng phẳng', 'cắt', 'đi qua', 'chứa',\n // points / derived\n 'trung điểm', 'trọng tâm', 'hình chiếu', 'đối xứng', 'chân đường', 'đường cao',\n // metric / solids of revolution (recognized early so clauses aren't dropped; constructs come later phases)\n 'khoảng cách', 'góc', 'mặt cầu', 'hình cầu', 'bán kính', 'đường kính',\n 'hình trụ', 'hình nón', 'ngoại tiếp', 'nội tiếp',\n 'khối cầu', 'khối nón', 'khối trụ', 'đường sinh', 'trục',\n // generic geometry nouns\n 'cạnh', 'đáy', 'đỉnh', 'điểm', 'đoạn', 'tam giác', 'hình vuông', 'hình chữ nhật',\n 'hình bình hành', 'hình thang', 'hình thoi', 'đường thẳng', 'tia',\n // symbols\n '⊥', '∩', '∥', '//', '∈',\n];\n\nexport function countGeometryKeywords3D(text: string): number {\n const t = text.toLowerCase();\n let n = 0;\n for (const kw of GEOMETRY_KEYWORDS_3D) {\n let from = 0;\n for (;;) {\n const i = t.indexOf(kw, from);\n if (i < 0) break;\n n += 1;\n from = i + kw.length;\n }\n }\n return n;\n}\n","import { countGeometryKeywords3D } from './vocabulary3d';\n\nexport interface Clause3D { id: number; text: string; hasGeometry: boolean }\nexport interface CoverageReport3D {\n complete: boolean; coveredClauseIds: number[]; uncovered: Clause3D[]; ratio: number;\n}\n\nconst LEADING_VERB =\n '(?:Gọi|Vẽ|Kẻ|Cho|Lấy|Dựng|Xác định|Tìm|Trên|Với|Qua|Từ|Giả sử)';\nconst PROOF_ONLY = /^(?:Chứng minh|Chứng tỏ|CMR|C\\/m|Tính|Suy ra|Hỏi)(?!\\p{L})/u;\n\n// Mask `.`/`;`/`,` inside short parens (≤40) so \"(S.ABCD)\" / \"(SBC)\" don't split.\nfunction maskParens(s: string): { masked: string; restore: (x: string) => string } {\n const tokens: string[] = [];\n let masked = s.replace(/\\([^()]{0,40}\\)/gu, (m) => {\n const idx = tokens.push(m) - 1;\n return ` ${idx} `;\n });\n // Mask the period in 3D solid notation \"S.ABCD\"/\"ABC.A'B'C'\" so it isn't treated\n // as a sentence boundary. [A-Z].[A-Z'] only occurs in solid names (VN decimals use comma).\n masked = masked.replace(/([A-Z])\\.([A-Z'])/g, '$1\\x01$2');\n return {\n masked,\n restore: (x) => x.replace(/\\x01/g, '.').replace(/ (\\d+) /gu, (_, i) => tokens[Number(i)]),\n };\n}\n\nexport function segmentClauses3D(problem: string): Clause3D[] {\n const { masked, restore } = maskParens(problem);\n const splitRe = new RegExp(`[.;\\\\n]+|,\\\\s*(?=${LEADING_VERB}(?!\\\\p{L}))`, 'u');\n const parts = masked.split(splitRe).map((p) => restore(p).trim()).filter(Boolean);\n return parts.map((text, id) => ({\n id,\n text,\n hasGeometry: countGeometryKeywords3D(text) > 0 && !PROOF_ONLY.test(text.trim()),\n }));\n}\n\nexport function computeCoverage3D(\n clauses: readonly Clause3D[],\n claimedIds: readonly number[],\n): CoverageReport3D {\n const claimed = new Set(claimedIds);\n const geo = clauses.filter((c) => c.hasGeometry);\n const uncovered = geo.filter((c) => !claimed.has(c.id));\n return {\n complete: geo.length > 0 && uncovered.length === 0,\n coveredClauseIds: geo.filter((c) => claimed.has(c.id)).map((c) => c.id),\n uncovered,\n ratio: geo.length ? (geo.length - uncovered.length) / geo.length : 0,\n };\n}\n","import { z } from 'zod';\n\n// Accept ASCII apostrophe (') and Unicode prime variants (′ U+2032, ' U+2019, ´ U+00B4)\n// that the rule engine emits for primed labels like A′, B′.\nexport const Label3DZ = z.string().min(1).max(16).regex(/^[A-Za-z][A-Za-z0-9'′’´_]*$/);\n\nexport type SolidFlavor = 'pyramid' | 'prism' | 'tetrahedron' | 'box';\nexport type BaseVariant =\n | 'square' | 'rectangle' | 'parallelogram' | 'trapezoid' | 'rhombus'\n | 'triangle' | 'equilateral-triangle';\nexport type ApexVariant = 'regular' | 'over-vertex' | 'over-edge-mid' | 'free';\n\nconst SolidIntentZ = z.object({\n op: z.literal('solid'),\n flavor: z.enum(['pyramid', 'prism', 'tetrahedron', 'box']),\n baseLabels: z.array(Label3DZ).min(3),\n baseVariant: z.enum(['square','rectangle','parallelogram','trapezoid','rhombus','triangle','equilateral-triangle']),\n apex: Label3DZ.optional(), // pyramid/tetrahedron apex; prism: top labels derived\n apexVariant: z.enum(['regular','over-vertex','over-edge-mid','free']),\n apexAnchor: z.string().optional(), // vertex label (over-vertex) or edge token \"AB\" (over-edge-mid)\n topLabels: z.array(Label3DZ).optional(), // prism/box top face\n});\n\n// Mirror Constraint3D kinds (core/scene/kinds/3d-constraint.ts) + a few rule-level kinds.\nconst AddPoint3DIntentZ = z.object({\n op: z.literal('add-point-3d'),\n name: Label3DZ,\n constraint: z.record(z.unknown()), // validated downstream by builder against Constraint3D\n});\n\nconst Plane3DIntentZ = z.object({\n op: z.literal('plane'),\n name: Label3DZ,\n spec: z.record(z.unknown()), // {kind:'threePoints',p1,p2,p3} | parallelThrough | perpToLine\n});\n\nconst Line3DIntentZ = z.object({\n op: z.literal('line'),\n name: Label3DZ.optional(),\n kind: z.enum(['segment','line','ray','planePlaneIntersection','parallelThrough','perpToPlane']),\n refs: z.record(z.unknown()).optional(),\n});\n\nconst Connect3DIntentZ = z.object({\n op: z.literal('connect'),\n from: Label3DZ, to: Label3DZ,\n style: z.enum(['segment','line','ray']).default('segment'),\n});\n\nconst CrossSectionIntentZ = z.object({\n op: z.literal('cross-section'),\n name: Label3DZ.optional(),\n plane: Label3DZ,\n solid: Label3DZ.optional(),\n});\n\n// ───── Khối tròn xoay (Phase 4) — 1:1 scene kind sphere3d/cone3d/cylinder3d ─────\nconst SphereIntentZ = z.object({\n op: z.literal('sphere'),\n name: Label3DZ.optional(),\n center: Label3DZ,\n surfacePoint: Label3DZ,\n});\n\n// radius: số literal (standalone Phase 4) HOẶC radiusTo: điểm trên đường tròn đáy\n// (bán kính phái sinh — builder tính khoảng cách ⊥ trục lúc build, Phase 5b).\nconst ConeIntentZ = z.object({\n op: z.literal('cone'),\n name: Label3DZ.optional(),\n baseCenter: Label3DZ, apex: Label3DZ,\n radius: z.number().optional(),\n radiusTo: Label3DZ.optional(),\n});\n\nconst CylinderIntentZ = z.object({\n op: z.literal('cylinder'),\n name: Label3DZ.optional(),\n baseCenter: Label3DZ, topCenter: Label3DZ,\n radius: z.number().optional(),\n radiusTo: Label3DZ.optional(),\n});\n\n// Đa giác từ nhãn điểm tường minh (mặt cắt qua trục nón/trụ) → polygon3d.\nconst PolygonIntentZ = z.object({\n op: z.literal('polygon'),\n name: Label3DZ.optional(),\n vertices: z.array(Label3DZ).min(3),\n});\n\nexport const Intent3DZ = z.discriminatedUnion('op', [\n SolidIntentZ, AddPoint3DIntentZ, Plane3DIntentZ, Line3DIntentZ, Connect3DIntentZ, CrossSectionIntentZ,\n SphereIntentZ, ConeIntentZ, CylinderIntentZ, PolygonIntentZ,\n]);\nexport type Intent3DT = z.infer<typeof Intent3DZ>;\n\nexport function solid(spec: {\n flavor: SolidFlavor; baseLabels: string[]; baseVariant: BaseVariant;\n apex?: string; apexVariant: ApexVariant; apexAnchor?: string; topLabels?: string[];\n}): Intent3DT {\n return { op: 'solid', ...spec } as Intent3DT;\n}\n\nexport function addPoint3d(name: string, constraint: Record<string, unknown>): Intent3DT {\n return { op: 'add-point-3d', name, constraint } as Intent3DT;\n}\n\nexport function plane3d(name: string, spec: Record<string, unknown>): Intent3DT {\n return { op: 'plane', name, spec } as Intent3DT;\n}\n\n// Routes all keys other than `name` and `kind` into a `refs` record,\n// so that later tasks (giao tuyến) can pass plane1/plane2 under refs\n// without being stripped by Zod discriminatedUnion.\nexport function line3dIntent(spec: { name?: string; kind: string } & Record<string, unknown>): Intent3DT {\n const { name, kind, ...rest } = spec;\n return { op: 'line', ...(name ? { name } : {}), kind, refs: rest } as Intent3DT;\n}\n\nexport function connect3d(from: string, to: string, style = 'segment'): Intent3DT {\n return { op: 'connect', from, to, style } as Intent3DT;\n}\n\nexport function crossSection3d(spec: { name?: string; plane: string; solid?: string }): Intent3DT {\n return { op: 'cross-section', ...spec } as Intent3DT;\n}\n\nexport function sphereIntent(spec: { name?: string; center: string; surfacePoint: string }): Intent3DT {\n return { op: 'sphere', ...spec } as Intent3DT;\n}\n\nexport function coneIntent(spec: { name?: string; baseCenter: string; apex: string; radius?: number; radiusTo?: string }): Intent3DT {\n return { op: 'cone', ...spec } as Intent3DT;\n}\n\nexport function cylinderIntent(spec: { name?: string; baseCenter: string; topCenter: string; radius?: number; radiusTo?: string }): Intent3DT {\n return { op: 'cylinder', ...spec } as Intent3DT;\n}\n\nexport function polygonIntent(spec: { name?: string; vertices: string[] }): Intent3DT {\n return { op: 'polygon', ...spec } as Intent3DT;\n}\n","export { solid, addPoint3d, plane3d, line3dIntent, connect3d, crossSection3d, sphereIntent, coneIntent, cylinderIntent, polygonIntent } from '../intent';\n\nexport function escapeRe(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nconst INTRO_NAME_3D =\n /(?:Gọi|Lấy|Dựng|Vẽ|Kẻ|Đặt|Xác định)\\s+(?:điểm\\s+)?([A-Z][₀-₉0-9]?)['′]?(?![\\p{L}])/u;\nconst NAME_LA_3D = /(?<![\\p{L}\\d])([A-Z][₀-₉0-9]?)['′]?\\s+là(?!\\p{L})/u;\n\nexport function extractName3D(text: string): string | undefined {\n return text.match(INTRO_NAME_3D)?.[1] ?? text.match(NAME_LA_3D)?.[1];\n}\n\n/**\n * Split a vertex token string into individual vertex labels.\n * Handles primes/subscripts: \"A'B'C'\" → [\"A'\",\"B'\",\"C'\"], \"ABCD\" → [\"A\",\"B\",\"C\",\"D\"].\n */\nexport function splitVertexToken(token: string): string[] {\n return [...token.matchAll(/[A-Z](?:['′]|[₀-₉0-9])?/gu)].map((m) => m[0]);\n}\n\nexport interface SolidHead3D { apex?: string; baseLabels: string[] }\n\n// Mirror guards3d.SOLID_HEAD (non-global here — first match only).\nconst SOLID_HEAD_3D =\n /(?:hình\\s+chóp\\s+([A-Z])\\.([A-Z'′₀-₉0-9]+))|(?:tứ\\s+diện(?:\\s+đều)?\\s+([A-Z'′]{3,}))|(?:lăng\\s+trụ\\s+([A-Z]{3,})\\.([A-Z'′]+))/u;\n\n/** Parse the leading solid header → apex (pyramid only) + base vertex labels. */\nexport function parseSolidHead3D(problem: string): SolidHead3D | null {\n const m = SOLID_HEAD_3D.exec(problem);\n if (!m) return null;\n if (m[1]) return { apex: m[1], baseLabels: splitVertexToken(m[2] ?? '') }; // pyramid\n if (m[3]) return { baseLabels: splitVertexToken(m[3]) }; // tetrahedron\n if (m[4]) return { baseLabels: splitVertexToken(m[4]) }; // prism (bottom face)\n return null;\n}\n\n/** Tên tâm synth: phần tử đầu trong O/I/J/K/T KHÔNG ∈ vertices (non-digit, non-`_`). */\nexport function pickCenter(vertices: string[]): string {\n for (const c of ['O', 'I', 'J', 'K', 'T']) if (!vertices.includes(c)) return c;\n return 'O';\n}\n\n/** N tên điểm mặt cắt: chữ cái đơn (non-digit, non-`_`) đầu tiên KHÔNG ∈ taken (né nhãn đỉnh/tâm). */\nexport function sectionNames(n: number, taken: string[]): string[] {\n const pool = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'M', 'N', 'P', 'Q'];\n const used = new Set(taken);\n const out: string[] = [];\n for (const x of pool) {\n if (out.length === n) break;\n if (!used.has(x)) out.push(x);\n }\n return out;\n}\n\n// Pyramid head tolerant of \"(tứ|tam) giác (đều)?\" qualifier giữa \"chóp\" và nhãn.\n// solidRule.PYRAMID = /hình\\s+chóp\\s+([A-Z])\\./ FAIL khi có qualifier → solidRule KHÔNG vẽ chóp.\nconst PYRAMID_TOLERANT = /(?:hình\\s*)?chóp\\s+(?:(?:tứ|tam)\\s*giác\\s*)?(?:đều\\s+)?([A-Z])\\.([A-Z]+)/u;\n// Mirror CHÍNH XÁC solidRule.PYRAMID /hình\\s+chóp\\s+([A-Z])\\.([A-Z]+)/ (kèm nhãn sau dấu chấm).\nconst SOLID_RULE_PYRAMID = /hình\\s+chóp\\s+[A-Z]\\.[A-Z]/u;\n\n/**\n * Parse chóp head, dung nạp qualifier \"tứ/tam giác đều\". `solidRuleDraws` = solidRule\n * có vẽ chóp không (true khi bare \"hình chóp X.\" khớp PYRAMID gốc; false khi qualifier chen).\n * Rule gọi: !solidRuleDraws ⟹ tự emit solid (tránh dup); solidRuleDraws ⟹ chỉ reference.\n */\nexport function parsePyramidTolerant(problem: string): { apex: string; base: string[]; solidRuleDraws: boolean } | null {\n const m = PYRAMID_TOLERANT.exec(problem);\n if (!m) return null;\n return { apex: m[1], base: splitVertexToken(m[2]), solidRuleDraws: SOLID_RULE_PYRAMID.test(problem) };\n}\n\n// Prism head tolerant of \"đều\" qualifier. solidRule.PRISM = /lăng\\s+trụ\\s+[A-Z]{3,4}\\./ FAIL\n// khi có \"đều\" chen ⟹ solidRule KHÔNG vẽ lăng trụ. (Mirror parsePyramidTolerant.)\nconst PRISM_TOLERANT = /lăng\\s*trụ(?:\\s*đều)?\\s+([A-Z]{3,4})\\.((?:[A-Z]['′])+)/u;\n// Mirror CHÍNH XÁC solidRule.PRISM /lăng\\s+trụ\\s+([A-Z]{3,4})\\.((?:[A-Z]['′])+)/ (kèm top prime).\nconst SOLID_RULE_PRISM = /lăng\\s+trụ\\s+[A-Z]{3,4}\\.(?:[A-Z]['′])+/u;\n\n/** Parse lăng trụ head (đều-tolerant) → base + top labels + solidRuleDraws (bare → solidRule vẽ). */\nexport function parsePrismTolerant(problem: string): { base: string[]; top: string[]; solidRuleDraws: boolean } | null {\n const m = PRISM_TOLERANT.exec(problem);\n if (!m) return null;\n return { base: splitVertexToken(m[1]), top: splitVertexToken(m[2]), solidRuleDraws: SOLID_RULE_PRISM.test(problem) };\n}\n\n/** Implied base plane (3 base vertices) for \"đáy\"/\"mặt đáy\" with no (XYZ) token. */\nexport function baseFaceOf(problem: string): { planeName: string; p1: string; p2: string; p3: string } | null {\n const head = parseSolidHead3D(problem);\n if (!head || head.baseLabels.length < 3) return null;\n const [p1, p2, p3] = head.baseLabels;\n const clean = (s: string) => s.replace(/['′'´₀-₉0-9]/gu, '');\n return { planeName: `mp_${clean(p1)}${clean(p2)}${clean(p3)}`, p1, p2, p3 };\n}\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport { solid, escapeRe, splitVertexToken } from './_shared';\nimport type { BaseVariant, ApexVariant } from '../intent';\n\n// Match against full problem: \"hình chóp S.ABCD\"\nconst PYRAMID = /hình\\s+chóp\\s+([A-Z])\\.([A-Z]+)/u;\n// \"tứ diện [đều]? ABCD\"\nconst TETRA = /tứ\\s+diện(?:\\s+đều)?\\s+([A-Z]{4})/u;\n// \"lăng trụ ABC.A'B'C'\" — base then dot then primed top\nconst PRISM = /lăng\\s+trụ\\s+([A-Z]{3,4})\\.((?:[A-Z]['′])+)/u;\n// \"hình hộp / lập phương ABCD.A'B'C'D'\"\nconst BOX = /hình\\s+(?:hộp|lập\\s+phương)\\s+([A-Z]{4})\\.((?:[A-Z]['′])+)/u;\n\nfunction baseVariantFrom(problem: string, n: number): BaseVariant {\n if (/đáy[^.]*?hình\\s+vuông/u.test(problem)) return 'square';\n if (/đáy[^.]*?hình\\s+chữ\\s+nhật/u.test(problem)) return 'rectangle';\n if (/đáy[^.]*?hình\\s+bình\\s+hành/u.test(problem)) return 'parallelogram';\n if (/đáy[^.]*?hình\\s+thang/u.test(problem)) return 'trapezoid';\n if (/đáy[^.]*?hình\\s+thoi/u.test(problem)) return 'rhombus';\n if (/(tam\\s+giác\\s+đều|đáy[^.]*?đều)/u.test(problem)) return 'equilateral-triangle';\n // Fallback: check the whole problem for shape keywords\n if (/hình\\s+vuông/u.test(problem)) return 'square';\n if (/hình\\s+chữ\\s+nhật/u.test(problem)) return 'rectangle';\n return n === 3 ? 'triangle' : 'square';\n}\n\nfunction apexVariantFrom(problem: string, apex: string): { v: ApexVariant; anchor?: string } {\n // \"SA ⊥ đáy\" or \"SA vuông góc với mặt phẳng đáy\" → over-vertex at A\n const over = new RegExp(\n `${escapeRe(apex)}([A-Z])\\\\s*(?:⊥|vuông\\\\s+góc)[^.]*?đáy`,\n 'u',\n ).exec(problem);\n if (over) return { v: 'over-vertex', anchor: over[1] };\n\n // \"(SAB) ⊥ đáy\" + \"cân tại S\" → over-edge-mid AB\n const face = new RegExp(\n `\\\\(${escapeRe(apex)}([A-Z])([A-Z])\\\\)[^.]*?(?:⊥|vuông\\\\s+góc)[^.]*?đáy`,\n 'u',\n ).exec(problem);\n if (face && new RegExp(`cân\\\\s+tại\\\\s+${escapeRe(apex)}`, 'u').test(problem)) {\n return { v: 'over-edge-mid', anchor: `${face[1]}${face[2]}` };\n }\n\n if (/(chóp\\s+(?:tứ\\s+giác|tam\\s+giác)?\\s*đều|hình\\s+chóp\\s+đều)/u.test(problem)) {\n return { v: 'regular' };\n }\n return { v: 'regular' };\n}\n\n/** Return clause ids that are about the solid declaration (claim the first geo clause). */\nfunction solidClauseIds(ctx: RuleContext3D): number[] {\n const geoIds = ctx.clauses.filter((c) => c.hasGeometry).map((c) => c.id);\n return geoIds.length > 0 ? [geoIds[0]] : ctx.clauses.length > 0 ? [ctx.clauses[0].id] : [];\n}\n\nexport const solidRule: LanguageRule3D = {\n id: 'solid',\n priority: 90,\n languages: ['vi'],\n patterns: [/hình\\s+chóp/u, /tứ\\s+diện/u, /lăng\\s+trụ/u, /hình\\s+(hộp|lập\\s+phương)/u],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const prob = ctx.problem;\n let m: RegExpExecArray | null;\n\n if ((m = PYRAMID.exec(prob))) {\n const apex = m[1];\n const baseLabels = splitVertexToken(m[2]);\n const { v, anchor } = apexVariantFrom(prob, apex);\n return [\n {\n ruleId: this.id,\n clauseIds: solidClauseIds(ctx),\n intents: [\n solid({\n flavor: 'pyramid',\n baseLabels,\n baseVariant: baseVariantFrom(prob, baseLabels.length),\n apex,\n apexVariant: v,\n apexAnchor: anchor,\n }),\n ],\n },\n ];\n }\n\n if ((m = TETRA.exec(prob))) {\n const verts = splitVertexToken(m[1]);\n if (verts.length >= 4) {\n const isReg = /tứ\\s+diện\\s+đều/u.test(prob);\n return [\n {\n ruleId: this.id,\n clauseIds: solidClauseIds(ctx),\n intents: [\n solid({\n flavor: 'tetrahedron',\n baseLabels: verts.slice(0, 3),\n baseVariant: isReg ? 'equilateral-triangle' : 'triangle',\n apex: verts[3],\n apexVariant: 'regular',\n }),\n ],\n },\n ];\n }\n }\n\n if ((m = PRISM.exec(prob))) {\n const baseLabels = splitVertexToken(m[1]);\n const topLabels = splitVertexToken(m[2]);\n return [\n {\n ruleId: this.id,\n clauseIds: solidClauseIds(ctx),\n intents: [\n solid({\n flavor: 'prism',\n baseLabels,\n baseVariant: baseVariantFrom(prob, baseLabels.length),\n apexVariant: 'free',\n topLabels,\n }),\n ],\n },\n ];\n }\n\n if ((m = BOX.exec(prob))) {\n const baseLabels = splitVertexToken(m[1]);\n const topLabels = splitVertexToken(m[2]);\n return [\n {\n ruleId: this.id,\n clauseIds: solidClauseIds(ctx),\n intents: [\n solid({\n flavor: 'box',\n baseLabels,\n baseVariant: 'rectangle',\n apexVariant: 'free',\n topLabels,\n }),\n ],\n },\n ];\n }\n\n return [];\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport { addPoint3d } from './_shared';\n\n// Single: \"Lấy (điểm)? M trên AB\" | \"M ∈ AB\" | \"M thuộc (cạnh)? SC\"\nconst SINGLE =\n /(?:Lấy\\s+(?:điểm\\s+)?)?([A-Z])\\s*(?:∈|thuộc(?:\\s+cạnh)?|(?:nằm\\s+)?trên(?:\\s+cạnh)?)\\s*([A-Z])([A-Z])(?![\\p{L}])/u;\n\n// Distributive: \"M, N lần lượt thuộc AB, AC\"\nconst DISTRIB =\n /([A-Z])\\s*,\\s*([A-Z])\\s+lần\\s+lượt\\s+(?:∈|thuộc(?:\\s+(?:cạnh|cạnh\\s+của)?)?|trên(?:\\s+cạnh)?)\\s*([A-Z])([A-Z])\\s*,\\s*([A-Z])([A-Z])(?![\\p{L}])/u;\n\nexport const pointOnEdgeRule: LanguageRule3D = {\n id: 'pointOnEdge',\n priority: 60,\n languages: ['vi'],\n patterns: [/(?:∈|thuộc|trên)\\s*[A-Z]{2}/u, /lần\\s+lượt\\s+(?:∈|thuộc|trên)/u],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n const d = DISTRIB.exec(c.text);\n if (d) {\n out.push({\n ruleId: this.id,\n clauseIds: [c.id],\n intents: [\n addPoint3d(d[1], { kind: 'onSegmentEdge', a: d[3], b: d[4], t: 0.5 }),\n addPoint3d(d[2], { kind: 'onSegmentEdge', a: d[5], b: d[6], t: 0.55 }),\n ],\n });\n continue;\n }\n const m = SINGLE.exec(c.text);\n if (m) {\n out.push({\n ruleId: this.id,\n clauseIds: [c.id],\n intents: [addPoint3d(m[1], { kind: 'onSegmentEdge', a: m[2], b: m[3], t: 0.5 })],\n });\n }\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { plane3d } from './_shared';\n\n// Match \"(ABC)\" tokens — exactly 3 uppercase letters\nconst PLANE_TOKEN = /\\(([A-Z])([A-Z])([A-Z])\\)/gu;\n\nexport const planeNamedRule: LanguageRule3D = {\n id: 'planeNamed',\n priority: 55,\n languages: ['vi'],\n patterns: [/mặt\\s+phẳng/u, /giao\\s+tuyến/u, /thiết\\s+diện/u, /\\([A-Z]{3}\\)/u],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const seen = new Set<string>();\n const intents: Intent3DT[] = [];\n const claimed: number[] = [];\n for (const c of ctx.clauses) {\n PLANE_TOKEN.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = PLANE_TOKEN.exec(c.text))) {\n const key = `${m[1]}${m[2]}${m[3]}`;\n if (seen.has(key)) continue;\n seen.add(key);\n intents.push(plane3d(`mp_${key}`, { kind: 'threePoints', p1: m[1], p2: m[2], p3: m[3] }));\n if (!claimed.includes(c.id)) claimed.push(c.id);\n }\n }\n return intents.length ? [{ ruleId: this.id, clauseIds: claimed, intents }] : [];\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport { addPoint3d } from './_shared';\n\n// Single: \"M là trung điểm của BC\" | \"M là trung điểm cạnh BC\" | \"M là trung điểm BC\"\nconst SINGLE = /([A-Z])\\s+là\\s+trung\\s+điểm\\s+(?:của\\s+)?(?:cạnh\\s+)?([A-Z])([A-Z])(?![\\p{L}])/u;\n\n// Distributive: \"M, N lần lượt là trung điểm AB, CD\"\nconst DISTRIB =\n /([A-Z])\\s*,\\s*([A-Z])\\s+lần\\s+lượt\\s+là\\s+trung\\s+điểm\\s+(?:(?:của|cạnh)\\s+)?([A-Z])([A-Z])\\s*,\\s*([A-Z])([A-Z])(?![\\p{L}])/u;\n\nexport const midpoint3dRule: LanguageRule3D = {\n id: 'midpoint3d',\n priority: 62,\n languages: ['vi'],\n patterns: [/trung\\s+điểm/u],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n const d = DISTRIB.exec(c.text);\n if (d) {\n out.push({\n ruleId: this.id,\n clauseIds: [c.id],\n intents: [\n addPoint3d(d[1], { kind: 'midpoint', p1: d[3], p2: d[4] }),\n addPoint3d(d[2], { kind: 'midpoint', p1: d[5], p2: d[6] }),\n ],\n });\n continue;\n }\n const m = SINGLE.exec(c.text);\n if (m) {\n out.push({\n ruleId: this.id,\n clauseIds: [c.id],\n intents: [addPoint3d(m[1], { kind: 'midpoint', p1: m[2], p2: m[3] })],\n });\n }\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport { addPoint3d, splitVertexToken } from './_shared';\n\n// \"G là trọng tâm (của)? (tam giác)? SBC\"\nconst RE = /([A-Z])\\s+là\\s+trọng\\s+tâm\\s+(?:của\\s+)?(?:tam\\s+giác\\s+)?([A-Z]{3})(?![\\p{L}])/u;\n\nexport const centroid3dRule: LanguageRule3D = {\n id: 'centroid3d',\n priority: 61,\n languages: ['vi'],\n patterns: [/trọng\\s+tâm/u],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n const m = RE.exec(c.text);\n if (m) {\n out.push({\n ruleId: this.id,\n clauseIds: [c.id],\n intents: [addPoint3d(m[1], { kind: 'centroid', vertices: splitVertexToken(m[2]) })],\n });\n }\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport { line3dIntent } from './_shared';\n\n// \"giao tuyến của (BCD) và (DMN)\" | \"giao tuyến (BCD) và (DMN)\"\nconst RE = /giao\\s+tuyến\\s+(?:của\\s+)?\\(([A-Z]{3})\\)\\s*(?:và|,)\\s*\\(([A-Z]{3})\\)/u;\n\nexport const intersectionLineRule: LanguageRule3D = {\n id: 'intersectionLine',\n priority: 58,\n languages: ['vi'],\n patterns: [/giao\\s+tuyến/u],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n const m = RE.exec(c.text);\n if (m) {\n out.push({\n ruleId: this.id,\n clauseIds: [c.id],\n // Pass plane1/plane2 as top-level keys; line3dIntent routes them into refs.\n intents: [\n line3dIntent({ kind: 'planePlaneIntersection', plane1: `mp_${m[1]}`, plane2: `mp_${m[2]}` }),\n ],\n });\n }\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport { plane3d, crossSection3d } from './_shared';\nimport type { Intent3DT } from '../intent';\n\nconst CUE = /thiết\\s+diện|cắt\\s+bởi/iu;\nconst TOKEN = /\\(([A-Z])([A-Z])([A-Z])\\)/u; // first 3-letter plane token in the clause — stay case-sensitive\n\nexport const crossSectionRule: LanguageRule3D = {\n id: 'crossSection',\n priority: 57,\n languages: ['vi'],\n patterns: [/thiết\\s+diện/iu, /cắt\\s+bởi/iu],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n if (!CUE.test(c.text)) continue;\n // Parallel-plane phrasing (\"qua M song song (SBC)\") is owned by crossSectionParallelRule —\n // the (XYZ) token here is the REFERENCE plane, not the cutting plane. Skip to avoid a spurious section.\n if (/qua\\s+[A-Z]\\s*(?:và\\s+)?song\\s+song/u.test(c.text)) continue;\n const m = TOKEN.exec(c.text);\n if (!m) continue;\n const [, a, b, d] = m;\n const planeName = `mp_${a}${b}${d}`;\n const intents: Intent3DT[] = [\n plane3d(planeName, { kind: 'threePoints', p1: a, p2: b, p3: d }),\n crossSection3d({ plane: planeName }),\n ];\n out.push({ ruleId: this.id, clauseIds: [c.id], intents });\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport { plane3d, crossSection3d } from './_shared';\nimport type { Intent3DT } from '../intent';\n\nconst CUE = /thiết\\s+diện|cắt\\s+bởi/iu;\n// \"qua <P> [và] song song [với] (<X><Y><Z>)\"\nconst RE = /qua\\s+([A-Z])\\s*(?:và\\s+)?song\\s+song\\s+(?:với\\s+)?\\(([A-Z])([A-Z])([A-Z])\\)/u;\n\nexport const crossSectionParallelRule: LanguageRule3D = {\n id: 'crossSectionParallel',\n priority: 58,\n languages: ['vi'],\n patterns: [/song\\s+song/u],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n if (!CUE.test(c.text)) continue;\n const m = RE.exec(c.text);\n if (!m) continue;\n const [, p, x, y, z] = m;\n const refName = `mp_${x}${y}${z}`;\n const parName = `mp_par_${p}`;\n const intents: Intent3DT[] = [\n plane3d(refName, { kind: 'threePoints', p1: x, p2: y, p3: z }),\n plane3d(parName, { kind: 'parallelThrough', point: p, refPlane: refName }),\n crossSection3d({ plane: parName }),\n ];\n out.push({ ruleId: this.id, clauseIds: [c.id], intents });\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport { plane3d, addPoint3d } from './_shared';\nimport type { Intent3DT } from '../intent';\n\n// \"giao điểm [I] [của] MN với|và (BCD)\" — [Gg]iao tolerates sentence-initial capital\nconst RE = /[Gg]iao\\s+điểm\\s+(?:([A-Z])\\s+)?(?:của\\s+)?([A-Z])([A-Z])\\s*(?:với|và)\\s*\\(([A-Z])([A-Z])([A-Z])\\)/u;\n\nexport const linePlanePointRule: LanguageRule3D = {\n id: 'linePlanePoint',\n priority: 56,\n languages: ['vi'],\n patterns: [/giao\\s+điểm/iu],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n const m = RE.exec(c.text);\n if (!m) continue;\n const [, named, a, b, x, y, z] = m;\n const planeName = `mp_${x}${y}${z}`;\n const name = named ?? `gp_${a}${b}`;\n const intents: Intent3DT[] = [\n plane3d(planeName, { kind: 'threePoints', p1: x, p2: y, p3: z }),\n addPoint3d(name, { kind: 'intersectionLinePlane', a, b, plane: planeName }),\n ];\n out.push({ ruleId: this.id, clauseIds: [c.id], intents });\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { plane3d, addPoint3d, connect3d, baseFaceOf } from './_shared';\n\n// Cue/prefilter (full problem): /iu so sentence-initial capitals match.\nconst CUE = /hình\\s*chiếu|chân\\s+đường|khoảng\\s*cách/iu;\n\n// Capture regexes stay /u (strict [A-Z]); sentence-initial capital via [Hh]/[Kk]/[Cc].\n// Target = plane token (≥3 letters), or \"mặt đáy\"/\"đáy\", or a bare 2-letter line.\n// Trailing optional: \"là [điểm] <name>\" after target.\nconst TARGET =\n '(?:(?:mặt\\\\s*phẳng\\\\s*)?\\\\(([A-Z]{3,})\\\\)|(mặt\\\\s*đáy|[Đđ]áy)|(?:cạnh\\\\s+|đường\\\\s*thẳng\\\\s+)?([A-Z](?:[\\'′])?)([A-Z](?:[\\'′])?))';\nconst TRAIL = '(?:\\\\s+là\\\\s+(?:điểm\\\\s+)?([A-Z](?:[\\'′]?)))?';\n\n// \"[<H> là] hình chiếu [vuông góc] [của] [đỉnh|điểm] <from> lên|trên|xuống <target> [là [điểm] <name>]\"\n// Groups: 1=leading-name, 2=from, 3=planeTok, 4=dayKw, 5=lineA, 6=lineB, 7=trailing-name\nconst RE_HC = new RegExp(\n '(?:([A-Z](?:[\\'′])?)\\\\s+là\\\\s+)?[Hh]ình\\\\s*chiếu\\\\s*(?:vuông\\\\s*góc\\\\s*)?(?:của\\\\s+)?(?:đỉnh\\\\s+|điểm\\\\s+)?([A-Z](?:[\\'′])?)\\\\s*(?:lên|trên|xuống)\\\\s+' + TARGET + TRAIL,\n 'u',\n);\n// \"chân đường (vuông góc|cao) [hạ] [từ] <from> [lên|trên|xuống|đến] <target> [là [điểm] <name>]\"\n// Groups: 1=leading-name, 2=from, 3=planeTok, 4=dayKw, 5=lineA, 6=lineB, 7=trailing-name\nconst RE_CHAN = new RegExp(\n '(?:([A-Z](?:[\\'′])?)\\\\s+là\\\\s+)?[Cc]hân\\\\s+đường\\\\s+(?:vuông\\\\s*góc|cao)\\\\s+(?:hạ\\\\s+)?(?:từ\\\\s+|của\\\\s+)?(?:đỉnh\\\\s+|điểm\\\\s+)?([A-Z](?:[\\'′])?)\\\\s*(?:lên|trên|xuống|đến)\\\\s+' + TARGET + TRAIL,\n 'u',\n);\n// \"khoảng cách (từ) <from> đến <target>\" (foot unnamed → synth)\n// Groups: 1=from, 2=planeTok, 3=dayKw, 4=lineA, 5=lineB\nconst RE_KC = new RegExp(\n '[Kk]hoảng\\\\s*cách\\\\s+(?:từ\\\\s+)?(?:đỉnh\\\\s+|điểm\\\\s+)?([A-Z](?:[\\'′])?)\\\\s+đến\\\\s+' + TARGET,\n 'u',\n);\n\nconst stripPrime = (s: string) => s.replace(/['′]/gu, '');\n\ntype Target =\n | { kind: 'plane'; planeName: string; p: [string, string, string] }\n | { kind: 'line'; a: string; b: string };\n\nfunction toTarget(planeTok: string | undefined, dayKw: string | undefined, lineA: string | undefined, lineB: string | undefined, problem: string): Target | null {\n if (planeTok) {\n const L = [...planeTok].slice(0, 3) as [string, string, string];\n return { kind: 'plane', planeName: `mp_${L.join('')}`, p: L };\n }\n if (dayKw) {\n const bf = baseFaceOf(problem);\n if (!bf) return null;\n return { kind: 'plane', planeName: bf.planeName, p: [bf.p1, bf.p2, bf.p3] };\n }\n if (lineA && lineB) return { kind: 'line', a: lineA, b: lineB };\n return null;\n}\n\nfunction emit(named: string | undefined, from: string, t: Target): Intent3DT[] {\n const foot = named ?? `H${stripPrime(from)}`;\n const out: Intent3DT[] = [];\n if (t.kind === 'plane') {\n out.push(plane3d(t.planeName, { kind: 'threePoints', p1: t.p[0], p2: t.p[1], p3: t.p[2] }));\n out.push(addPoint3d(foot, { kind: 'perpFootPlane', from, plane: t.planeName }));\n } else {\n out.push(addPoint3d(foot, { kind: 'perpFootLine', from, a: t.a, b: t.b }));\n }\n out.push(connect3d(from, foot, 'segment'));\n return out;\n}\n\nexport const projectionFootRule: LanguageRule3D = {\n id: 'projectionFoot',\n priority: 54,\n languages: ['vi'],\n patterns: [/hình\\s*chiếu/iu, /chân\\s+đường/iu, /khoảng\\s*cách/iu],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n if (!CUE.test(c.text)) continue;\n let m = RE_HC.exec(c.text) ?? RE_CHAN.exec(c.text);\n if (m) {\n const t = toTarget(m[3], m[4], m[5], m[6], ctx.problem);\n if (!t) continue;\n // Named: leading \"H là\" (m[1]) takes priority; then trailing \"là H\" (m[7]).\n const named = m[1] ?? m[7];\n out.push({ ruleId: this.id, clauseIds: [c.id], intents: emit(named, m[2], t) });\n continue;\n }\n m = RE_KC.exec(c.text);\n if (m) {\n const t = toTarget(m[2], m[3], m[4], m[5], ctx.problem);\n if (!t) continue;\n out.push({ ruleId: this.id, clauseIds: [c.id], intents: emit(undefined, m[1], t) });\n }\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { plane3d, line3dIntent, baseFaceOf } from './_shared';\n\n// Co-fire guard: these cues belong to projectionFoot (priority 54).\nconst OWNED_BY_FOOT = /hình\\s*chiếu|chân\\s+đường|khoảng\\s*cách/iu;\n\n// Guard: target must NOT be a bare 2-letter line like \"BC\" (perpPlaneToLine owns that).\n// A line target is indicated by a 2-uppercase-letter token WITHOUT surrounding parens,\n// not preceded by \"mặt phẳng\" or \"(\", and not followed by more uppercase letters.\nconst LINE_TARGET = /(?:vuông\\s*góc|⊥)\\s*(?:với\\s+)?(?!(?:mặt\\s*(?:phẳng\\s*)?|đáy|mặt\\s*đáy))[A-Z][A-Z](?![A-Z])/u;\n\n// Main capture:\n// \"qua <P> [dựng] [đường thẳng] [và] vuông góc [với] [mặt phẳng] (<XYZ>) | đáy | mặt đáy\"\n// Groups: 1=point, 2=plane token (XYZ), 3=đáy keyword\nconst RE = /[Qq]ua\\s+([A-Z](?:['′]?)?)\\s+(?:dựng\\s+)?(?:đường\\s*thẳng\\s+)?(?:và\\s+)?(?:vuông\\s*góc|⊥)\\s*(?:với\\s+)?(?:mặt\\s*phẳng\\s*)?(?:\\(([A-Z]{3,})\\)|(mặt\\s*đáy|[Đđ]áy)(?!\\s*[A-Z]))/u;\n\nexport const perpLineToPlaneRule: LanguageRule3D = {\n id: 'perpLineToPlane',\n priority: 53,\n languages: ['vi'],\n patterns: [/vuông\\s*góc/iu, /⊥/u],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n if (OWNED_BY_FOOT.test(c.text)) continue; // co-fire guard: projectionFoot owns\n if (LINE_TARGET.test(c.text)) continue; // guard: line target → perpPlaneToLine\n const m = RE.exec(c.text);\n if (!m) continue;\n const point = m[1];\n let planeName: string;\n let p: [string, string, string];\n if (m[2]) {\n // explicit (XYZ) token\n const L = [...m[2]].slice(0, 3) as [string, string, string];\n planeName = `mp_${L.join('')}`;\n p = L;\n } else {\n // \"đáy\" / \"mặt đáy\" — synthesize from solid header\n const bf = baseFaceOf(ctx.problem);\n if (!bf) continue;\n planeName = bf.planeName;\n p = [bf.p1, bf.p2, bf.p3];\n }\n const intents: Intent3DT[] = [\n plane3d(planeName, { kind: 'threePoints', p1: p[0], p2: p[1], p3: p[2] }),\n line3dIntent({ kind: 'perpToPlane', point, plane: planeName }),\n ];\n out.push({ ruleId: this.id, clauseIds: [c.id], intents });\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { plane3d } from './_shared';\n\n// Co-fire guard: these cues belong to projectionFoot (priority 54).\nconst OWNED_BY_FOOT = /hình\\s*chiếu|chân\\s+đường|khoảng\\s*cách/iu;\n\n// Main capture:\n// \"[Mm]ặt phẳng [(P)] qua <Point> [và] vuông góc [với] [đường thẳng] <L1><L2>\"\n// LINE target = exactly two capital letters, NOT a \"(XYZ)\" plane token.\n// Groups: 1=point, 2=lineA, 3=lineB\nconst RE =\n /[Mm]ặt\\s*phẳng\\s*(?:\\([A-Z]\\)\\s*)?[Qq]ua\\s+([A-Z](?:['′])?)\\s*(?:và\\s+)?(?:vuông\\s*góc|⊥)\\s*(?:với\\s+)?(?:đường\\s*thẳng\\s+)?([A-Z](?:['′])?)([A-Z](?:['′])?)(?![\\p{L}])/u;\n\nexport const perpPlaneToLineRule: LanguageRule3D = {\n id: 'perpPlaneToLine',\n priority: 52,\n languages: ['vi'],\n patterns: [/vuông\\s*góc/iu, /⊥/u],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n if (OWNED_BY_FOOT.test(c.text)) continue; // co-fire guard: projectionFoot owns\n const m = RE.exec(c.text);\n if (!m) continue;\n const [, point, lineA, lineB] = m;\n const cleanPoint = point.replace(/['′]/gu, '');\n const intents: Intent3DT[] = [\n plane3d(`mp_perp_${cleanPoint}`, { kind: 'perpToLine', point, lineA, lineB }),\n ];\n out.push({ ruleId: this.id, clauseIds: [c.id], intents });\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { plane3d, addPoint3d, connect3d, baseFaceOf, parseSolidHead3D } from './_shared';\n\n// \"góc/Góc giữa|hợp [cạnh|đường thẳng] <X><Y> và [mặt phẳng] (đáy|(XYZ))\"\n// Uses [Gg]óc instead of /i flag to keep [A-Z] capture groups strictly uppercase.\nconst RE_GIUA = new RegExp(\n '(?:[Gg]óc\\\\s+(?:giữa|hợp(?:\\\\s+bởi)?)\\\\s+(?:cạnh\\\\s+|đường\\\\s*thẳng\\\\s+)?)([A-Z](?:[\\'′])?)([A-Z](?:[\\'′])?)\\\\s+(?:và|với)\\\\s+(?:mặt\\\\s*(?:[Pp]hẳng\\\\s*)?)?(\\\\(([A-Z]{3,})\\\\)|mặt\\\\s*[Đđ]áy|[Đđ]áy)',\n 'u',\n);\n\n// \"<X><Y> tạo với [mặt] (đáy|(XYZ)) [một] góc\"\nconst RE_TAO = new RegExp(\n '([A-Z](?:[\\'′])?)([A-Z](?:[\\'′])?)\\\\s+tạo\\\\s+với\\\\s+(?:mặt\\\\s*phẳng\\\\s*)?(\\\\(([A-Z]{3,})\\\\)|mặt\\\\s*đáy|[Đđ]áy)\\\\s*(?:một\\\\s+)?góc',\n 'u',\n);\n\n// Dihedral / two-plane angle → defer to Phase 3b\nconst DIHEDRAL = /góc\\s+(?:giữa\\s+)?(?:hai\\s+mặt\\s+phẳng|nhị\\s+diện|mặt\\s+bên)/iu;\n\nexport const angleLinePlaneRule: LanguageRule3D = {\n id: 'angleLinePlane',\n priority: 51,\n languages: ['vi'],\n patterns: [/góc\\s+(?:giữa|hợp)/iu, /tạo\\s+với/iu],\n\n match(ctx: RuleContext3D): RuleMatch3D[] {\n const head = parseSolidHead3D(ctx.problem);\n const apex = head?.apex;\n if (!apex) return []; // need a pyramid apex to project\n\n const out: RuleMatch3D[] = [];\n\n for (const c of ctx.clauses) {\n if (DIHEDRAL.test(c.text)) continue; // dihedral → defer (Phase 3b)\n\n const m = RE_GIUA.exec(c.text) ?? RE_TAO.exec(c.text);\n if (!m) continue;\n\n const e1 = m[1];\n const e2 = m[2];\n const planeTok = m[4]; // group 4 = three-letter plane label (no parens), or undefined for đáy\n\n // exactly one endpoint must be the apex; the other is a base vertex\n let vtx: string | null = null;\n if (e1 === apex && e2 !== apex) vtx = e2;\n else if (e2 === apex && e1 !== apex) vtx = e1;\n if (!vtx) continue;\n\n // Resolve base plane\n let planeName: string;\n let p: [string, string, string];\n\n if (planeTok) {\n const L = [...planeTok].slice(0, 3) as [string, string, string];\n planeName = `mp_${L.join('')}`;\n p = L;\n } else {\n const bf = baseFaceOf(ctx.problem);\n if (!bf) continue;\n planeName = bf.planeName;\n p = [bf.p1, bf.p2, bf.p3];\n }\n\n const foot = `H${apex.replace(/['′]/gu, '')}`;\n\n const intents: Intent3DT[] = [\n plane3d(planeName, { kind: 'threePoints', p1: p[0], p2: p[1], p3: p[2] }),\n addPoint3d(foot, { kind: 'perpFootPlane', from: apex, plane: planeName }),\n connect3d(apex, foot, 'segment'),\n connect3d(foot, vtx, 'segment'),\n connect3d(apex, vtx, 'segment'),\n ];\n\n out.push({ ruleId: this.id, clauseIds: [c.id], intents });\n }\n\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { sphereIntent, addPoint3d, parseSolidHead3D, splitVertexToken, pickCenter } from './_shared';\n\nconst CUE = /ngoại\\s*tiếp/iu;\nconst SPHERE_CUE = /(?:mặt|khối|hình)\\s*cầu/iu;\n\n// Token NGAY SAU \"ngoại tiếp\": \"hình chóp S.ABC\" | \"tứ diện ABCD\" | \"lăng trụ ABC.A′B′C′\"\n// | bare \"SCDE\"/\"SABCD\". Strict [A-Z] capture (/u — KHÔNG /i).\nconst TARGET = new RegExp(\n 'ngoại\\\\s*tiếp\\\\s+' +\n '(?:(?:hình\\\\s+)?chóp\\\\s+([A-Z])\\\\.([A-Z]+)' + // 1=apex 2=base (chóp dotted)\n '|tứ\\\\s+diện(?:\\\\s+đều)?\\\\s+([A-Z]{3,})' + // 3 (tetra/đa diện)\n '|(?:hình\\\\s+)?lăng\\\\s+trụ\\\\s+([A-Z]{3,})\\\\.([A-Z\\'′]+)' + // 4=base 5=top (lăng trụ)\n '|([A-Z][A-Z\\'′]{2,}))', // 6 bare token (≥3 chữ)\n 'u',\n);\n// Base quad non-cyclic trong canonical layout (parallelogram/trapezoid) → cầu vô nghiệm → skip.\n// Siết: shape phải KỀ \"đáy [nhãn] (là)\" — KHÔNG nuốt \"mặt bên là hình bình hành\" (mặt ≠ đáy).\nconst NON_CYCLIC = /đáy(?:\\s+[A-Z'′]+)?\\s+(?:là\\s+)?(?:hình\\s+)?(?:bình\\s+hành|thang)/iu;\n\nfunction verticesFromMatch(m: RegExpExecArray): string[] | null {\n if (m[1] && m[2]) return [m[1], ...splitVertexToken(m[2])]; // chóp S.ABC\n if (m[3]) return splitVertexToken(m[3]); // tứ diện ABCD\n if (m[4] && m[5]) return [...splitVertexToken(m[4]), ...splitVertexToken(m[5])]; // lăng trụ\n if (m[6]) return splitVertexToken(m[6]); // bare SCDE\n return null;\n}\n\nexport const circumsphereRule: LanguageRule3D = {\n id: 'circumsphere',\n priority: 50,\n languages: ['vi'],\n patterns: [/ngoại\\s*tiếp/iu, /(?:mặt|khối|hình)\\s*cầu/iu],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n if (NON_CYCLIC.test(ctx.problem)) return [];\n const out: RuleMatch3D[] = [];\n for (const c of ctx.clauses) {\n if (!CUE.test(c.text) || !SPHERE_CUE.test(c.text)) continue;\n const m = TARGET.exec(c.text);\n let vertices: string[] | null = m ? verticesFromMatch(m) : null;\n // Generic \"ngoại tiếp hình chóp/tứ diện/lăng trụ\" (không token) → solid head.\n if (!vertices && /ngoại\\s*tiếp\\s+(?:(?:hình\\s+)?chóp|(?:hình\\s+)?lăng\\s+trụ|tứ\\s+diện)/iu.test(c.text)) {\n const head = parseSolidHead3D(ctx.problem);\n if (head) vertices = [...(head.apex ? [head.apex] : []), ...head.baseLabels];\n }\n if (!vertices || vertices.length < 4) continue;\n const center = pickCenter(vertices);\n const intents: Intent3DT[] = [\n addPoint3d(center, { kind: 'circumsphereCenter', vertices }),\n sphereIntent({ center, surfacePoint: vertices[0] }),\n ];\n out.push({ ruleId: this.id, clauseIds: [c.id], intents });\n }\n return out;\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { solid, addPoint3d, sphereIntent, pickCenter, parsePyramidTolerant } from './_shared';\n\nconst INSCRIBED = /nội\\s*tiếp/iu;\nconst CUBE = /lập\\s*phương/iu;\n// Cầu phải là CHỦ NGỮ của \"nội tiếp\" (cầu TRƯỚC nội tiếp = cầu nội tiếp chóp). Né \"chóp nội tiếp\n// mặt cầu\" (chóp-TRONG-cầu = cầu NGOẠI tiếp → circumsphere lo) — review đối kháng bắt false-positive.\nconst SPHERE_SUBJECT = /(?:mặt|khối|hình)\\s*cầu[^.]{0,40}nội\\s*tiếp/iu;\n\n// Mặt cầu nội tiếp chóp: tâm = pyramidInsphereCenter (cách đều đáy + mọi mặt bên),\n// surfacePoint = centroid đáy (cầu chạm đáy tại tâm-đáy) → R = inradius. Reuse sphere.\n// Tách insphereCube (cube) qua guard CUBE; tách circumsphere (ngoại tiếp+cầu) qua INSCRIBED.\nexport const insphereOfPyramidRule: LanguageRule3D = {\n id: 'insphereOfPyramid',\n priority: 50,\n languages: ['vi'],\n patterns: [/(?:mặt|khối|hình)\\s*cầu/iu, /nội\\s*tiếp/iu],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n if (!INSCRIBED.test(ctx.problem) || CUBE.test(ctx.problem)) return []; // cube → insphereCube\n const head = parsePyramidTolerant(ctx.problem);\n if (!head) return [];\n // Clause có \"cầu … nội tiếp\" (cầu là chủ ngữ) — KHÔNG khớp \"chóp nội tiếp mặt cầu\".\n const c = ctx.clauses.find((cl) => SPHERE_SUBJECT.test(cl.text));\n if (!c) return [];\n const { apex, base, solidRuleDraws } = head;\n const center = pickCenter([apex, ...base]); // tâm cầu (synth, né đỉnh)\n const surf = pickCenter([apex, ...base, center]); // tâm đáy = điểm trên mặt cầu\n const intents: Intent3DT[] = [];\n if (!solidRuleDraws) {\n intents.push(solid({\n flavor: 'pyramid', baseLabels: base,\n baseVariant: base.length === 4 ? 'square' : 'equilateral-triangle',\n apex, apexVariant: 'regular',\n }));\n }\n intents.push(\n addPoint3d(center, { kind: 'pyramidInsphereCenter', apex, vertices: base }),\n addPoint3d(surf, { kind: 'centroid', vertices: base }),\n sphereIntent({ center, surfacePoint: surf }),\n );\n return [{ ruleId: this.id, clauseIds: [c.id], intents }];\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { coneIntent, addPoint3d, parseSolidHead3D, polygonIntent, sectionNames } from './_shared';\n\nconst CUE = /(?:hình|khối)\\s*nón/iu;\nconst INSCRIBED = /(?:nội|ngoại)\\s*tiếp/iu;\n// \"đỉnh S\" hoặc \"đường cao SO\" (đỉnh = chữ đầu). Strict /u.\nconst APEX = /(?:đỉnh\\s+([A-Z])|đường\\s+cao\\s+([A-Z])([A-Z]))/u;\n// Thiết diện qua trục / mặt phẳng (đi) qua trục|đỉnh(=đỉnh nón) → vẽ tam giác qua trục.\n// Bound [^.]{0,40} để không nuốt cross-clause (vd \"mặt phẳng cắt … rồi qua đỉnh A của tam giác\").\nconst AXIAL = /(?:thiết\\s*diện\\s*qua\\s*trục|(?:mặt\\s*phẳng|thiết\\s*diện)[^.]{0,40}qua\\s*(?:trục|đỉnh))/iu;\n\nexport const coneRule: LanguageRule3D = {\n id: 'cone',\n priority: 49,\n languages: ['vi'],\n patterns: [/(?:hình|khối)\\s*nón/iu],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n // Standalone only: skip compound (solid head / nội-ngoại tiếp đa diện-mặt cầu).\n if (parseSolidHead3D(ctx.problem) || INSCRIBED.test(ctx.problem)) return [];\n const c = ctx.clauses.find((cl) => CUE.test(cl.text));\n if (!c) return [];\n // Scope tới CHÍNH clause nón (tránh nhặt \"đỉnh/đường cao\" từ tam giác khác trong đề).\n const am = APEX.exec(c.text);\n const apexName = am ? (am[1] ?? am[2]!) : 'S';\n const baseRaw = am && am[3] ? am[3] : 'O';\n const baseName = baseRaw === apexName ? 'O' : baseRaw;\n const intents: Intent3DT[] = [\n addPoint3d(baseName, { kind: 'free', x: 0, y: 0, z: -1.2 }),\n addPoint3d(apexName, { kind: 'free', x: 0, y: 0, z: 1.2 }),\n coneIntent({ baseCenter: baseName, apex: apexName, radius: 1.4 }),\n ];\n const clauseIds = [c.id];\n if (AXIAL.test(ctx.problem)) {\n // 2 đầu mút đường kính đáy (trên vành R=1.4) + tam giác qua trục [A, đỉnh, B].\n const [pA, pB] = sectionNames(2, [apexName, baseName]);\n intents.push(\n addPoint3d(pA, { kind: 'free', x: -1.4, y: 0, z: -1.2 }),\n addPoint3d(pB, { kind: 'free', x: 1.4, y: 0, z: -1.2 }),\n polygonIntent({ vertices: [pA, apexName, pB] }),\n );\n const sc = ctx.clauses.find((cl) => AXIAL.test(cl.text));\n if (sc && sc.id !== c.id) clauseIds.push(sc.id);\n }\n return [{ ruleId: this.id, clauseIds, intents }];\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { cylinderIntent, addPoint3d, parseSolidHead3D, polygonIntent, sectionNames } from './_shared';\n\nconst CUE = /(?:hình|khối)\\s*trụ/iu;\nconst INSCRIBED = /(?:nội|ngoại)\\s*tiếp/iu;\n// Thiết diện qua trục / mặt phẳng (đi) qua trục → vẽ hình chữ nhật qua trục.\n// Trụ KHÔNG có đỉnh ⟹ chỉ \"qua trục\" (không \"qua đỉnh\"). Bound [^.]{0,40} chống nuốt cross-clause.\nconst AXIAL = /(?:thiết\\s*diện\\s*qua\\s*trục|(?:mặt\\s*phẳng|thiết\\s*diện)[^.]{0,40}qua\\s*trục)/iu;\n\nexport const cylinderRule: LanguageRule3D = {\n id: 'cylinder',\n priority: 48,\n languages: ['vi'],\n patterns: [/(?:hình|khối)\\s*trụ/iu],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n // Standalone only: skip compound (lăng trụ dotted / nội-ngoại tiếp).\n if (parseSolidHead3D(ctx.problem) || INSCRIBED.test(ctx.problem)) return [];\n const c = ctx.clauses.find((cl) => CUE.test(cl.text));\n if (!c) return [];\n const intents: Intent3DT[] = [\n addPoint3d('O', { kind: 'free', x: 0, y: 0, z: -1.2 }),\n addPoint3d('I', { kind: 'free', x: 0, y: 0, z: 1.2 }),\n cylinderIntent({ baseCenter: 'O', topCenter: 'I', radius: 1.4 }),\n ];\n const clauseIds = [c.id];\n if (AXIAL.test(ctx.problem)) {\n // 4 đầu mút 2 đường kính 2 đáy → hcn qua trục [A(đáy−),B(đáy+),C(đỉnh+),D(đỉnh−)].\n const [a, b, cc, d] = sectionNames(4, ['O', 'I']);\n intents.push(\n addPoint3d(a, { kind: 'free', x: -1.4, y: 0, z: -1.2 }),\n addPoint3d(b, { kind: 'free', x: 1.4, y: 0, z: -1.2 }),\n addPoint3d(cc, { kind: 'free', x: 1.4, y: 0, z: 1.2 }),\n addPoint3d(d, { kind: 'free', x: -1.4, y: 0, z: 1.2 }),\n polygonIntent({ vertices: [a, b, cc, d] }),\n );\n const sc = ctx.clauses.find((cl) => AXIAL.test(cl.text));\n if (sc && sc.id !== c.id) clauseIds.push(sc.id);\n }\n return [{ ruleId: this.id, clauseIds, intents }];\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport { sphereIntent, addPoint3d, connect3d, pickCenter } from './_shared';\n\nconst SPHERE_CUE = /(?:mặt|khối|hình)\\s*cầu/iu;\nconst INSCRIBED = /nội\\s*tiếp/iu;\n// CHỈ \"lập phương\" (cube) — \"hình hộp [chữ nhật]\" KHÔNG có mặt cầu nội tiếp (không vuông-cạnh-đều).\nconst CUBE = /lập\\s*phương/iu;\n// Cube CÓ nhãn: \"lập phương ABCD.A′B′C′D′\". Strict [A-Z] /u.\nconst BOX_LABELLED = /lập\\s*phương\\s+[A-Z]{4}\\.(?:[A-Z]['′])+/u;\n\n// Cube canonical cạnh 2·HALF (trong camera box [-3,3]³). Đáy z=−HALF, trên z=+HALF.\n// KHÔNG dùng solid 'box' (layout box ra 3×2×2.4 KHÔNG-cube → sphere nội tiếp sai mặt).\nconst HALF = 1.2;\nconst CUBE_V: Record<string, [number, number, number]> = {\n A: [-HALF, -HALF, -HALF], B: [HALF, -HALF, -HALF], C: [HALF, HALF, -HALF], D: [-HALF, HALF, -HALF],\n E: [-HALF, -HALF, HALF], F: [HALF, -HALF, HALF], G: [HALF, HALF, HALF], H: [-HALF, HALF, HALF],\n};\nconst CUBE_BASE = ['A', 'B', 'C', 'D'];\nconst CUBE_ALL = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'];\nconst CUBE_EDGES: Array<[string, string]> = [\n ['A', 'B'], ['B', 'C'], ['C', 'D'], ['D', 'A'], // đáy\n ['E', 'F'], ['F', 'G'], ['G', 'H'], ['H', 'E'], // trên\n ['A', 'E'], ['B', 'F'], ['C', 'G'], ['D', 'H'], // cạnh đứng\n];\n\n// Mặt cầu nội tiếp lập phương: tâm = tâm khối (centroid 8 đỉnh), surfacePoint = tâm mặt đáy\n// (centroid 4 đỉnh đáy) → bán kính = nửa cạnh = bán kính insphere. Reuse centroid + sphere.\nexport const insphereCubeRule: LanguageRule3D = {\n id: 'insphereCube',\n priority: 47,\n languages: ['vi'],\n patterns: [/(?:mặt|khối|hình)\\s*cầu/iu, /nội\\s*tiếp/iu],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n if (!INSCRIBED.test(ctx.problem) || !CUBE.test(ctx.problem)) return [];\n // Cube CÓ nhãn (ABCD.A′B′C′D′): solidRule (priority 90) vẽ box, NHƯNG layout box KHÔNG vuông-\n // cạnh-đều (3×2×2.4) ⟹ mặt cầu nội tiếp KHÔNG tiếp xúc đúng, verify (chỉ R>0) không bắt được.\n // → Escalate (return []) thay vì emit hình SAI. (Không có case named-cube trong dataset.)\n if (BOX_LABELLED.test(ctx.problem)) return [];\n const c = ctx.clauses.find(\n (cl) => SPHERE_CUE.test(cl.text) && INSCRIBED.test(cl.text) && CUBE.test(cl.text),\n );\n if (!c) return [];\n\n // Cube VÔ nhãn → tự dựng cube canonical (free vertices) + khung dây 12 cạnh. Vuông-cạnh-đều\n // ⟹ sphere(center=tâm, surfacePoint=tâm mặt đáy) tiếp xúc ĐÚNG cả 6 mặt (R = nửa cạnh).\n const intents: Intent3DT[] = [];\n for (const v of CUBE_ALL) {\n const [x, y, z] = CUBE_V[v];\n intents.push(addPoint3d(v, { kind: 'free', x, y, z }));\n }\n for (const [a, b] of CUBE_EDGES) intents.push(connect3d(a, b));\n\n const center = pickCenter(CUBE_ALL);\n const surf = pickCenter([...CUBE_ALL, center]);\n intents.push(\n addPoint3d(center, { kind: 'centroid', vertices: CUBE_ALL }), // tâm khối = tâm cầu\n addPoint3d(surf, { kind: 'centroid', vertices: CUBE_BASE }), // tâm-mặt-đáy = điểm mặt (R = nửa cạnh)\n sphereIntent({ center, surfacePoint: surf }),\n );\n return [{ ruleId: this.id, clauseIds: [c.id], intents }];\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport type { Intent3DT } from '../intent';\nimport {\n coneIntent, cylinderIntent, addPoint3d, solid,\n splitVertexToken, pickCenter, parsePyramidTolerant, parsePrismTolerant, sectionNames,\n} from './_shared';\n\nconst ROUND = /(?:hình|khối)\\s*(?:nón|trụ)/iu;\nconst CONE_T = /(?:hình|khối)\\s*nón/iu;\nconst INSCRIBED = /(?:nội|ngoại)\\s*tiếp/iu;\nconst NGOAI = /ngoại\\s*tiếp/iu;\nconst FACE = /(?:tam\\s*giác|tứ\\s*giác)\\s+([A-Z]{3,4})(?![\\p{L}])/u; // mặt định nghĩa đường tròn đáy\nconst APEX = /đỉnh\\s+([A-Z])(?![\\p{L}])/u;\nconst CUBE = /lập\\s*phương/iu;\nconst REGULAR = /(?:đều|hình\\s*vuông|tứ\\s*giác\\s*đều|tam\\s*giác\\s*đều)/iu; // incircle ≡ centroid hợp lệ\nconst HEAD = /(?:chóp|lăng\\s*trụ|tứ\\s*diện)/iu;\nconst TETRA = /tứ\\s+diện(?:\\s+đều)?\\s+([A-Z]{4})/u; // tứ diện ABCD → 4 đỉnh (mirror solid.ts)\n\n// Tâm + điểm-bán-kính (radiusTo) đường tròn đáy. nội tiếp(mặt đều)→centroid + radiusTo=trung\n// điểm cạnh; ngoại tiếp→faceCircumcenter + radiusTo=đỉnh mặt. Trả intents emit + tên dùng cho op.\nfunction buildCircleBase(\n faceVerts: string[], circum: boolean, taken: string[],\n): { centerName: string; radiusTo: string; intents: Intent3DT[] } {\n const centerName = pickCenter([...faceVerts, ...taken]);\n const intents: Intent3DT[] = [];\n if (circum) {\n intents.push(addPoint3d(centerName, { kind: 'faceCircumcenter', vertices: faceVerts }));\n return { centerName, radiusTo: faceVerts[0], intents }; // đỉnh nằm trên đường tròn ngoại tiếp\n }\n intents.push(addPoint3d(centerName, { kind: 'centroid', vertices: faceVerts }));\n const [midName] = sectionNames(1, [...faceVerts, ...taken, centerName]);\n intents.push(addPoint3d(midName, { kind: 'midpoint', p1: faceVerts[0], p2: faceVerts[1] }));\n return { centerName, radiusTo: midName, intents }; // trung điểm cạnh = chân ⊥ tâm (mặt đều)\n}\n\nfunction topCenterIntent(topVerts: string[], circum: boolean, taken: string[]): { name: string; intent: Intent3DT } {\n const name = pickCenter([...topVerts, ...taken]);\n return {\n name,\n intent: circum\n ? addPoint3d(name, { kind: 'faceCircumcenter', vertices: topVerts })\n : addPoint3d(name, { kind: 'centroid', vertices: topVerts }),\n };\n}\n\n// Khi rule TỰ vẽ host (solidRule miss \"đều\"/\"tứ giác đều\" qualifier), claim luôn clause đầu-đề\n// chứa head solid → coverage đủ (else clause head uncovered → PARTIAL → UI không render).\n// Heuristic: clause HEAD ĐẦU TIÊN khác clause round-solid. Đề ≥2 solid-head (hiếm) → có thể claim\n// nhầm clause → incomplete-coverage → ESCALATE (fail-safe, KHÔNG vẽ sai). Đủ cho dataset 1-host.\nfunction headClauseId(ctx: RuleContext3D, exceptId: number): number[] {\n const h = ctx.clauses.find((cl) => cl.id !== exceptId && HEAD.test(cl.text));\n return h ? [h.id] : [];\n}\n\n// Nón/trụ nội/ngoại tiếp MẶT đa diện. Bán kính phái sinh (inradius/circumradius mặt) qua radiusTo.\n// Coexist solidRule@90 (host vẽ riêng); khi solidRule miss qualifier → rule tự emit host + claim head.\n// Render ⊥-trục (perpBasis) ⟹ trục đứng (nón-chóp, trụ-lăng-trụ) đúng. Trụ trên mặt NGHIÊNG tứ diện\n// (Câu 73/85) qua pointAboveFace (topCenter = tâm mặt + chiều-cao·pháp-tuyến → trục ⊥ mặt). Defer nón XIÊN 88c.\nexport const inscribedRoundSolidRule: LanguageRule3D = {\n id: 'inscribedRoundSolid',\n priority: 46,\n languages: ['vi'],\n patterns: [/(?:hình|khối)\\s*(?:nón|trụ)/iu, /(?:nội|ngoại)\\s*tiếp/iu],\n match(ctx: RuleContext3D): RuleMatch3D[] {\n if (CUBE.test(ctx.problem)) return [];\n const c = ctx.clauses.find(\n (cl) => ROUND.test(cl.text) && INSCRIBED.test(cl.text) && (/đường\\s*tròn/iu.test(cl.text) || /đáy/iu.test(cl.text)),\n );\n if (!c) return [];\n const circum = NGOAI.test(c.text);\n\n // ── Nón: CHỈ right-cone (đỉnh trên tâm đáy) ⟹ host chóp đều (đáy ngang, apex trên centroid).\n // Nón trên mặt tứ diện (đỉnh = đỉnh đáy, vd 88c) = nón XIÊN → defer (cone3d chỉ right-cone).\n if (CONE_T.test(c.text)) {\n const faceM = FACE.exec(c.text);\n if (!faceM) return [];\n const faceVerts = splitVertexToken(faceM[1]);\n if (faceVerts.length < 3) return [];\n if (!circum && !REGULAR.test(ctx.problem)) return []; // incircle mặt không-đều → defer faceIncenter\n const py = parsePyramidTolerant(ctx.problem);\n if (!py) return [];\n const apexM = APEX.exec(c.text);\n const apex = apexM ? apexM[1] : py.apex;\n const intents: Intent3DT[] = [];\n const clauseIds = [c.id];\n if (!py.solidRuleDraws) {\n intents.push(solid({\n flavor: 'pyramid', baseLabels: py.base,\n baseVariant: py.base.length === 4 ? 'square' : 'equilateral-triangle',\n apex: py.apex, apexVariant: 'regular',\n }));\n clauseIds.push(...headClauseId(ctx, c.id));\n }\n const base = buildCircleBase(faceVerts, circum, [apex]);\n intents.push(...base.intents, coneIntent({ baseCenter: base.centerName, apex, radiusTo: base.radiusTo }));\n return [{ ruleId: this.id, clauseIds, intents }];\n }\n\n // ── Trụ trên 2 đáy lăng trụ (trục ĐỨNG — render ⊥-trục đúng). Mặt lấy từ head lăng trụ.\n const prism = parsePrismTolerant(ctx.problem);\n if (prism) {\n const { base: baseVerts, top: topVerts, solidRuleDraws } = prism;\n if (baseVerts.length < 3) return [];\n if (!circum && !REGULAR.test(ctx.problem)) return [];\n const intents: Intent3DT[] = [];\n const clauseIds = [c.id];\n if (!solidRuleDraws) {\n intents.push(solid({\n flavor: 'prism', baseLabels: baseVerts,\n baseVariant: baseVerts.length === 3 ? 'equilateral-triangle' : 'square',\n apexVariant: 'free', topLabels: topVerts,\n }));\n clauseIds.push(...headClauseId(ctx, c.id));\n }\n const bc = buildCircleBase(baseVerts, circum, []);\n const tc = topCenterIntent(topVerts, circum, [bc.centerName, bc.radiusTo]);\n intents.push(...bc.intents, tc.intent, cylinderIntent({ baseCenter: bc.centerName, topCenter: tc.name, radiusTo: bc.radiusTo }));\n return [{ ruleId: this.id, clauseIds, intents }];\n }\n\n // ── Trụ trên MẶT NGHIÊNG tứ diện (Câu 73/85): trục ⊥ mặt qua pointAboveFace (offset tâm mặt\n // dọc pháp tuyến = chiều cao ⊥ đỉnh-đối→mặt). KHÔNG đổi layout → trục ĐÚNG dù tứ diện không-đều.\n const tetraM = TETRA.exec(ctx.problem);\n if (tetraM) {\n const tetra = splitVertexToken(tetraM[1]); // 4 đỉnh tứ diện\n if (tetra.length < 4) return [];\n const faceM = FACE.exec(c.text);\n if (!faceM) return [];\n const faceVerts = splitVertexToken(faceM[1]);\n if (faceVerts.length < 3) return [];\n if (!circum && !REGULAR.test(ctx.problem)) return []; // incircle mặt không-đều → defer faceIncenter\n const apex = tetra.find((v) => !faceVerts.includes(v)); // đỉnh ĐỐI diện mặt\n if (!apex) return [];\n // solidRule (TETRA) vẽ tứ diện → chỉ reference đỉnh (không emit solid → tránh dup).\n const base = buildCircleBase(faceVerts, circum, [apex]);\n const topName = pickCenter([...faceVerts, apex, base.centerName, base.radiusTo]);\n const intents: Intent3DT[] = [\n ...base.intents,\n addPoint3d(topName, { kind: 'pointAboveFace', base: base.centerName, apex, vertices: faceVerts }),\n cylinderIntent({ baseCenter: base.centerName, topCenter: topName, radiusTo: base.radiusTo }),\n ];\n return [{ ruleId: this.id, clauseIds: [c.id], intents }];\n }\n return [];\n },\n};\n","import type { LanguageRule3D, RuleContext3D, RuleMatch3D } from './_types';\nimport { solidRule } from './solid';\nimport { pointOnEdgeRule } from './pointOnEdge';\nimport { planeNamedRule } from './planeNamed';\nimport { midpoint3dRule } from './midpoint3d';\nimport { centroid3dRule } from './centroid3d';\nimport { intersectionLineRule } from './intersectionLine';\nimport { crossSectionRule } from './crossSection';\nimport { crossSectionParallelRule } from './crossSectionParallel';\nimport { linePlanePointRule } from './linePlanePoint';\nimport { projectionFootRule } from './projectionFoot';\nimport { perpLineToPlaneRule } from './perpLineToPlane';\nimport { perpPlaneToLineRule } from './perpPlaneToLine';\nimport { angleLinePlaneRule } from './angleLinePlane';\nimport { circumsphereRule } from './circumsphere';\nimport { insphereOfPyramidRule } from './insphereOfPyramid';\nimport { coneRule } from './cone';\nimport { cylinderRule } from './cylinder';\nimport { insphereCubeRule } from './insphereCube';\nimport { inscribedRoundSolidRule } from './inscribedRoundSolid';\n\nconst RULES: LanguageRule3D[] = [\n solidRule, // priority 90\n midpoint3dRule, // priority 62\n centroid3dRule, // priority 61\n pointOnEdgeRule, // priority 60\n intersectionLineRule, // priority 58\n crossSectionParallelRule, // priority 58\n crossSectionRule, // priority 57\n linePlanePointRule, // priority 56\n planeNamedRule, // priority 55\n projectionFootRule, // priority 54\n perpLineToPlaneRule, // priority 53\n perpPlaneToLineRule, // priority 52\n angleLinePlaneRule, // priority 51\n circumsphereRule, // priority 50\n insphereOfPyramidRule, // priority 50\n coneRule, // priority 49\n cylinderRule, // priority 48\n insphereCubeRule, // priority 47\n inscribedRoundSolidRule, // priority 46\n];\n\nexport const ALL_RULES_3D: readonly LanguageRule3D[] = RULES.slice().sort(\n (a, b) => b.priority - a.priority,\n);\n\nexport function runRules3D(ctx: RuleContext3D): RuleMatch3D[] {\n const results: RuleMatch3D[] = [];\n for (const rule of ALL_RULES_3D) {\n const problemHitsPattern = rule.patterns.some((p) => p.test(ctx.problem));\n if (!problemHitsPattern) continue;\n const matches = rule.match(ctx);\n results.push(...matches);\n }\n return results;\n}\n","import type { Intent3DT } from '../intent';\nimport { segmentClauses3D, computeCoverage3D, type CoverageReport3D, type Clause3D } from './coverage3d';\nimport { runRules3D } from '../rules/registry';\n\nfunction dedup(intents: Intent3DT[]): Intent3DT[] {\n const seen = new Set<string>();\n return intents.filter((i) => {\n const k = JSON.stringify(i);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n\nexport type RunDeterministicResult3D =\n | { ok: true; intents: Intent3DT[]; coverage: CoverageReport3D }\n | { ok: false; reason: 'no-match' | 'incomplete-coverage'; coverage: CoverageReport3D };\n\n/**\n * Chạy toàn bộ rule engine 3D trên `problem`.\n * Trả về intents nếu coverage đầy đủ, ngược lại trả lý do thất bại.\n */\nexport function runDeterministicIntents3d(problem: string): RunDeterministicResult3D {\n const clauses = segmentClauses3D(problem);\n const geo = clauses.filter((c) => c.hasGeometry);\n\n const matches = runRules3D({ problem, clauses: geo });\n\n if (matches.length === 0) {\n const coverage = computeCoverage3D(clauses, []);\n return { ok: false, reason: 'no-match', coverage };\n }\n\n const claimedIds = matches.flatMap((m) => m.clauseIds);\n const coverage = computeCoverage3D(clauses, claimedIds);\n\n if (!coverage.complete) {\n return { ok: false, reason: 'incomplete-coverage', coverage };\n }\n\n const intents = dedup(matches.flatMap((m) => m.intents));\n return { ok: true, intents, coverage };\n}\n\n/**\n * Trả về phần deterministic đã phủ + clause chưa phủ (cho hybrid partial-coverage).\n */\nexport function tryPartial3d(problem: string): {\n detIntents: Intent3DT[];\n uncovered: Clause3D[];\n coverage: CoverageReport3D;\n} {\n const clauses = segmentClauses3D(problem);\n const geo = clauses.filter((c) => c.hasGeometry);\n const matches = runRules3D({ problem, clauses: geo });\n const claimedIds = matches.flatMap((m) => m.clauseIds);\n const coverage = computeCoverage3D(clauses, claimedIds);\n const detIntents = dedup(matches.flatMap((m) => m.intents));\n return { detIntents, uncovered: coverage.uncovered, coverage };\n}\n","import type { Store, SceneObject } from '../../../../core/scene';\nimport { constraintToWorld } from '../../../../core/scene/kinds/constraint3d-math';\nimport type { Intent3DT } from '../intent';\n\nexport interface BuildState3D {\n store: Store;\n nameToId: Map<string, string>;\n}\n\nexport class IntentBuilder3DError extends Error {\n constructor(message: string, public readonly intent?: Intent3DT) {\n super(message);\n this.name = 'IntentBuilder3DError';\n }\n}\n\nexport type IntentBuilder3D = (s: BuildState3D, intent: Intent3DT) => void;\n\nexport function resolveId(s: BuildState3D, name: string): string {\n const id = s.nameToId.get(name);\n if (!id) throw new IntentBuilder3DError(`tham chiếu không tồn tại: ${name}`);\n return id;\n}\n\nexport function addPoint3dObj(\n s: BuildState3D,\n label: string,\n constraint: Record<string, unknown>,\n): string {\n const st = s.store.getState();\n const id = `p${st.counter + 1}`;\n const obj: SceneObject = {\n id,\n kind: 'point3d',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { constraint },\n };\n s.store.dispatch({ type: 'ADD', payload: { obj } });\n s.nameToId.set(label, id);\n return id;\n}\n\n// Toạ độ world của 1 điểm (đã resolve id) tại thời điểm build (mirror crossSection builder).\nexport function resolveWorld3d(s: BuildState3D, id: string): [number, number, number] {\n const st = s.store.getState();\n const obj = st.objects[id];\n if (!obj) throw new IntentBuilder3DError(`điểm không tồn tại: ${id}`);\n return constraintToWorld((obj.attrs as { constraint: never }).constraint, st) as [number, number, number];\n}\n\n// Bán kính phái sinh = khoảng cách từ baseCenter tới radiusTo, CHIẾU ⊥ trục (baseCenter→axisEnd).\n// radiusTo trên đường tròn đáy (đỉnh/trung điểm cạnh/chân ⊥) → ra inradius/circumradius mặt.\nexport function projectedRadius3d(s: BuildState3D, baseId: string, axisEndId: string, radiusToId: string): number {\n const C = resolveWorld3d(s, baseId), E = resolveWorld3d(s, axisEndId), R = resolveWorld3d(s, radiusToId);\n const ax: [number, number, number] = [E[0] - C[0], E[1] - C[1], E[2] - C[2]];\n const an = Math.hypot(ax[0], ax[1], ax[2]) || 1;\n const u: [number, number, number] = [ax[0] / an, ax[1] / an, ax[2] / an];\n const v: [number, number, number] = [R[0] - C[0], R[1] - C[1], R[2] - C[2]];\n const proj = v[0] * u[0] + v[1] * u[1] + v[2] * u[2];\n return Math.hypot(v[0] - proj * u[0], v[1] - proj * u[1], v[2] - proj * u[2]);\n}\n\nexport function addShape3dObj(\n s: BuildState3D,\n kind: string,\n prefix: string,\n label: string,\n attrs: Record<string, unknown>,\n visible = true,\n registerInNameMap = true,\n): string {\n const st = s.store.getState();\n const id = `${prefix}${st.counter + 1}`;\n const obj: SceneObject = {\n id,\n kind,\n label,\n visible,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs,\n };\n s.store.dispatch({ type: 'ADD', payload: { obj } });\n if (label && registerInNameMap) s.nameToId.set(label, id);\n return id;\n}\n","import type { SolidFlavor, BaseVariant, ApexVariant } from './intent';\n\nexport type Vec3 = [number, number, number];\nexport interface SolidLayout { coords: Record<string, Vec3>; faces: number[][]; vertexOrder: string[] }\n\nconst H = 2.4; // apex / prism height\nconst R = 1.4; // base \"radius\"\n\n// 2D base templates centered at origin → list of [x,y] in CCW order.\nfunction baseTemplate(variant: BaseVariant, n: number): Array<[number, number]> {\n switch (variant) {\n case 'square':\n return [[-1,-1],[1,-1],[1,1],[-1,1]];\n case 'rectangle':\n return [[-1.5,-1],[1.5,-1],[1.5,1],[-1.5,1]];\n case 'parallelogram':\n return [[-1.4,-1],[1.0,-1],[1.4,1],[-1.0,1]];\n case 'rhombus':\n return [[0,-1.3],[1.3,0],[0,1.3],[-1.3,0]];\n case 'trapezoid':\n return [[-1.6,-1],[1.6,-1],[0.8,1],[-0.8,1]];\n case 'equilateral-triangle': {\n const pts: Array<[number, number]> = [];\n for (let i = 0; i < 3; i++) {\n const a = Math.PI / 2 + (i * 2 * Math.PI) / 3;\n pts.push([R * Math.cos(a), R * Math.sin(a)]);\n }\n return pts;\n }\n case 'triangle':\n return [[-1.3,-0.9],[1.4,-0.9],[-0.2,1.2]];\n default: {\n // regular n-gon fallback\n const pts: Array<[number, number]> = [];\n for (let i = 0; i < n; i++) {\n const a = Math.PI / 2 + (i * 2 * Math.PI) / n;\n pts.push([R * Math.cos(a), R * Math.sin(a)]);\n }\n return pts;\n }\n }\n}\n\nfunction centroidXY(pts: Array<[number, number]>): [number, number] {\n const s = pts.reduce((acc, p) => [acc[0] + p[0], acc[1] + p[1]] as [number, number], [0, 0] as [number, number]);\n return [s[0] / pts.length, s[1] / pts.length];\n}\n\nexport function solidLayout(spec: {\n flavor: SolidFlavor; baseLabels: string[]; baseVariant: BaseVariant;\n apex?: string; apexVariant: ApexVariant; apexAnchor?: string; topLabels?: string[];\n}): SolidLayout {\n const n = spec.baseLabels.length;\n const tpl = baseTemplate(spec.baseVariant, n);\n const coords: Record<string, Vec3> = {};\n const vertexOrder: string[] = [];\n\n spec.baseLabels.forEach((lab, i) => {\n const [x, y] = tpl[i % tpl.length];\n coords[lab] = [x, y, 0];\n vertexOrder.push(lab);\n });\n\n const faces: number[][] = [];\n faces.push(spec.baseLabels.map((_, i) => i)); // base ring\n\n if (spec.flavor === 'pyramid' || spec.flavor === 'tetrahedron') {\n const apex = spec.apex ?? 'S';\n let ax = 0, ay = 0;\n if (spec.apexVariant === 'over-vertex' && spec.apexAnchor && coords[spec.apexAnchor]) {\n [ax, ay] = [coords[spec.apexAnchor][0], coords[spec.apexAnchor][1]];\n } else if (spec.apexVariant === 'over-edge-mid' && spec.apexAnchor) {\n const a = spec.apexAnchor[0], b = spec.apexAnchor[1];\n if (coords[a] && coords[b]) { ax = (coords[a][0] + coords[b][0]) / 2; ay = (coords[a][1] + coords[b][1]) / 2; }\n } else {\n [ax, ay] = centroidXY(tpl.slice(0, n));\n }\n coords[apex] = [ax, ay, H];\n const apexIdx = vertexOrder.push(apex) - 1;\n for (let i = 0; i < n; i++) faces.push([i, (i + 1) % n, apexIdx]);\n } else {\n // prism / box: translate base up by H to make the top face\n const top = spec.topLabels ?? spec.baseLabels.map((l) => `${l}1`);\n const base0 = vertexOrder.length;\n top.forEach((lab, i) => {\n const [x, y] = tpl[i % tpl.length];\n coords[lab] = [x, y, H];\n vertexOrder.push(lab);\n });\n faces.push(top.map((_, i) => base0 + i)); // top ring\n for (let i = 0; i < n; i++) {\n const j = (i + 1) % n;\n faces.push([i, j, base0 + j, base0 + i]); // side quad\n }\n }\n return { coords, faces, vertexOrder };\n}\n","import type { IntentBuilder3D } from './_types';\nimport { addPoint3dObj, addShape3dObj } from './_types';\nimport { solidLayout } from '../layout3d';\nimport { nextLabel } from '../../../../core/scene';\n\nexport const buildSolid: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'solid') return;\n const L = solidLayout(intent);\n const vertexIds: string[] = [];\n for (const label of L.vertexOrder) {\n const [x, y, z] = L.coords[label];\n vertexIds.push(addPoint3dObj(s, label, { kind: 'free', x, y, z }));\n }\n const polyLabel = nextLabel(s.store.getState(), 'polyhedron3d');\n // registerInNameMap=false: polyhedra không được tham chiếu bởi nhãn trong AI rules\n // (chỉ đỉnh-điểm mới được ref), tránh ghi đè label đỉnh trong nameToId.\n addShape3dObj(s, 'polyhedron3d', 'ph', polyLabel, {\n flavor: intent.flavor,\n vertices: vertexIds,\n faces: L.faces,\n }, true, false);\n};\n","import type { IntentBuilder3D } from './_types';\nimport { addShape3dObj, resolveId } from './_types';\nimport { nextLabel } from '../../../../core/scene';\n\nexport const buildConnect: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'connect') return;\n const p1 = resolveId(s, intent.from);\n const p2 = resolveId(s, intent.to);\n const kind =\n intent.style === 'line' ? 'line3d'\n : intent.style === 'ray' ? 'ray3d'\n : 'segment3d';\n const label = nextLabel(s.store.getState(), kind);\n addShape3dObj(s, kind, 'l', label, { p1, p2 }, true, false);\n};\n","import type { IntentBuilder3D } from './_types';\nimport { addPoint3dObj, resolveId, addShape3dObj } from './_types';\nimport { nextLabel } from '../../../../core/scene';\n\n// Fields that are point/line/plane NAME references (resolve to ids);\n// everything else is a numeric/param literal left intact.\nconst REF_FIELDS = new Set([\n 'p1', 'p2', 'from', 'plane', 'a', 'b', 'a1', 'b1', 'a2', 'b2',\n 'lineId', 'planeId', 'polygonId', 'sphereId', 'apex', 'base',\n]);\n\nexport const buildAddPoint3d: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'add-point-3d') return;\n const raw = intent.constraint as Record<string, unknown>;\n const kind = String(raw.kind);\n\n // Sugar: onSegmentEdge{a,b,t} → ensure a segment3d(a,b) then onLine{lineId,t}\n if (kind === 'onSegmentEdge') {\n const aId = resolveId(s, String(raw.a));\n const bId = resolveId(s, String(raw.b));\n const edgeLabel = nextLabel(s.store.getState(), 'segment3d');\n const lineId = addShape3dObj(s, 'segment3d', 'l', edgeLabel, { p1: aId, p2: bId }, false, false);\n addPoint3dObj(s, intent.name, { kind: 'onLine', lineId, t: typeof raw.t === 'number' ? raw.t : 0.5 });\n return;\n }\n\n // General path: resolve ref fields, leave numeric/param fields intact.\n const resolved: Record<string, unknown> = { kind };\n for (const [k, v] of Object.entries(raw)) {\n if (k === 'kind') continue;\n if (k === 'vertices' && Array.isArray(v)) {\n resolved[k] = v.map((name) => resolveId(s, String(name)));\n } else if (REF_FIELDS.has(k) && typeof v === 'string') {\n resolved[k] = resolveId(s, v);\n } else {\n resolved[k] = v;\n }\n }\n addPoint3dObj(s, intent.name, resolved);\n};\n","import type { IntentBuilder3D } from './_types';\nimport { addShape3dObj, resolveId } from './_types';\n\nexport const buildPlane3d: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'plane') return;\n const spec = intent.spec as Record<string, unknown>;\n const kind = String(spec.kind);\n\n if (kind === 'threePoints') {\n addShape3dObj(s, 'plane3d', 'mp', intent.name, {\n p1: resolveId(s, String(spec.p1)),\n p2: resolveId(s, String(spec.p2)),\n p3: resolveId(s, String(spec.p3)),\n });\n return;\n }\n\n if (kind === 'parallelThrough') {\n addShape3dObj(s, 'plane3d', 'mp', intent.name, {\n construction: {\n kind: 'planeParallelThrough',\n point: resolveId(s, String(spec.point)),\n refPlane: resolveId(s, String(spec.refPlane)),\n },\n });\n return;\n }\n\n if (kind === 'perpToLine') {\n addShape3dObj(s, 'plane3d', 'mp', intent.name, {\n construction: {\n kind: 'planePerpToLine',\n point: resolveId(s, String(spec.point)),\n lineA: resolveId(s, String(spec.lineA)),\n lineB: resolveId(s, String(spec.lineB)),\n },\n });\n return;\n }\n};\n","import type { IntentBuilder3D } from './_types';\nimport { IntentBuilder3DError, addShape3dObj, resolveId } from './_types';\nimport { nextLabel } from '../../../../core/scene';\n\nexport const buildLine3d: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'line') return;\n // line3dIntent factory routes non-(name|kind) keys into refs record.\n const refs = (intent.refs ?? {}) as Record<string, unknown>;\n const label = intent.name ?? nextLabel(s.store.getState(), 'line3d');\n const lineKind = intent.kind;\n\n // Helper: read a required string ref and resolve to scene id.\n function need(field: string): string {\n const v = refs[field];\n if (typeof v !== 'string') throw new IntentBuilder3DError(`thiếu ref '${field}' cho line kind '${lineKind}'`, intent);\n return resolveId(s, v);\n }\n\n if (intent.kind === 'planePlaneIntersection') {\n addShape3dObj(s, 'line3d', 'l', label, {\n construction: {\n kind: 'planePlaneIntersection',\n plane1: need('plane1'),\n plane2: need('plane2'),\n },\n });\n return;\n }\n\n if (intent.kind === 'parallelThrough') {\n addShape3dObj(s, 'line3d', 'l', label, {\n construction: {\n kind: 'lineParallelThrough',\n point: need('point'),\n dirA: need('dirA'),\n dirB: need('dirB'),\n },\n });\n return;\n }\n\n if (intent.kind === 'perpToPlane') {\n addShape3dObj(s, 'line3d', 'l', label, {\n construction: {\n kind: 'linePerpToPlane',\n point: need('point'),\n plane: need('plane'),\n },\n });\n return;\n }\n\n if (intent.kind === 'segment' || intent.kind === 'line' || intent.kind === 'ray') {\n const p1 = need('p1');\n const p2 = need('p2');\n const kind = intent.kind === 'line' ? 'line3d' : intent.kind === 'ray' ? 'ray3d' : 'segment3d';\n addShape3dObj(s, kind, 'l', label, { p1, p2 }, true, false);\n return;\n }\n\n throw new IntentBuilder3DError(`line kind chưa hỗ trợ: ${lineKind}`, intent);\n};\n","// crossSectionGeometry.ts — pure vector math for cross-section computation.\nexport type Vec3 = [number, number, number];\n\nconst sub = (a: Vec3, b: Vec3): Vec3 => [a[0]-b[0], a[1]-b[1], a[2]-b[2]];\nconst dot = (a: Vec3, b: Vec3): number => a[0]*b[0] + a[1]*b[1] + a[2]*b[2];\nconst cross = (a: Vec3, b: Vec3): Vec3 => [\n a[1]*b[2] - a[2]*b[1],\n a[2]*b[0] - a[0]*b[2],\n a[0]*b[1] - a[1]*b[0],\n];\nconst normalize = (a: Vec3): Vec3 => {\n const n = Math.hypot(a[0], a[1], a[2]) || 1;\n return [a[0]/n, a[1]/n, a[2]/n];\n};\n\nexport interface PlaneFrame { origin: Vec3; normal: Vec3; u: Vec3; v: Vec3 }\n\nexport function planeFrame(p1: Vec3, p2: Vec3, p3: Vec3): PlaneFrame {\n const normal = normalize(cross(sub(p2, p1), sub(p3, p1)));\n const u = normalize(sub(p2, p1));\n const v = normalize(cross(normal, u));\n return { origin: p1, normal, u, v };\n}\n\nexport function signedDistance(p: Vec3, f: PlaneFrame): number {\n return dot(sub(p, f.origin), f.normal);\n}\n\n/** Strict crossing param in (0,1); null if same side or an endpoint lies on the plane. */\nexport function edgePlaneCrossing(a: Vec3, b: Vec3, f: PlaneFrame, eps = 1e-9): number | null {\n const dA = signedDistance(a, f);\n const dB = signedDistance(b, f);\n if (Math.abs(dA) < eps || Math.abs(dB) < eps) return null;\n if (dA * dB > 0) return null;\n return dA / (dA - dB);\n}\n\n/** Unordered, deduped edge index pairs from face rings. */\nexport function extractEdges(faces: number[][]): Array<[number, number]> {\n const seen = new Set<string>();\n const out: Array<[number, number]> = [];\n for (const face of faces) {\n for (let i = 0; i < face.length; i++) {\n const a = face[i];\n const b = face[(i + 1) % face.length];\n const key = a < b ? `${a},${b}` : `${b},${a}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push([a, b]);\n }\n }\n return out;\n}\n\n/** Permutation ordering points around their centroid in the plane (u,v) basis. */\nexport function orderAroundPerimeter(points: Vec3[], f: PlaneFrame): number[] {\n const proj = points.map((p) => {\n const d = sub(p, f.origin);\n return [dot(d, f.u), dot(d, f.v)] as [number, number];\n });\n const cx = proj.reduce((s, p) => s + p[0], 0) / proj.length;\n const cy = proj.reduce((s, p) => s + p[1], 0) / proj.length;\n return points\n .map((_, i) => i)\n .sort(\n (i, j) =>\n Math.atan2(proj[i][1] - cy, proj[i][0] - cx) -\n Math.atan2(proj[j][1] - cy, proj[j][0] - cx),\n );\n}\n","import type { IntentBuilder3D } from './_types';\nimport { addShape3dObj, resolveId, IntentBuilder3DError } from './_types';\nimport type { State } from '../../../../core/scene';\nimport { constraintToWorld, planeConstructionWorld } from '../../../../core/scene/kinds/constraint3d-math';\nimport {\n planeFrame, signedDistance, edgePlaneCrossing, extractEdges, orderAroundPerimeter,\n type Vec3,\n} from '../crossSectionGeometry';\n\nconst ON_PLANE_EPS = 1e-6;\n\nfunction pointWorld(state: State, id: string): Vec3 {\n return constraintToWorld((state.objects[id].attrs as { constraint: unknown }).constraint as never, state) as Vec3;\n}\n\nfunction planeWorldPoints(state: State, planeId: string): [Vec3, Vec3, Vec3] {\n const pl = state.objects[planeId];\n if (!pl || pl.kind !== 'plane3d') throw new IntentBuilder3DError(`không phải mặt phẳng: ${planeId}`);\n const a = pl.attrs as { p1?: string; p2?: string; p3?: string; construction?: unknown };\n if (a.construction) {\n const w = planeConstructionWorld(a.construction as never, state);\n return [w.p1, w.p2, w.p3];\n }\n return [pointWorld(state, a.p1 as string), pointWorld(state, a.p2 as string), pointWorld(state, a.p3 as string)];\n}\n\nfunction uniqueSolidId(state: State): string {\n const solids = Object.values(state.objects).filter((o) => o.kind === 'polyhedron3d');\n if (solids.length !== 1) throw new IntentBuilder3DError(`cross-section cần đúng 1 khối, có ${solids.length}`);\n return solids[0].id;\n}\n\nexport const buildCrossSection: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'cross-section') return;\n const state = s.store.getState();\n const planeId = resolveId(s, intent.plane);\n const solidId = intent.solid ? resolveId(s, intent.solid) : uniqueSolidId(state);\n\n const [pp1, pp2, pp3] = planeWorldPoints(state, planeId);\n const frame = planeFrame(pp1, pp2, pp3);\n\n const solidObj = state.objects[solidId];\n const verts = (solidObj.attrs as { vertices: string[] }).vertices;\n const faces = (solidObj.attrs as { faces: number[][] }).faces;\n\n const sv: Array<{ id: string; world: Vec3 }> = [];\n const seenId = new Set<string>();\n\n // 1) solid vertices ON the plane → reuse existing id.\n const onPlane = new Set<number>();\n verts.forEach((vid, idx) => {\n const w = pointWorld(state, vid);\n if (Math.abs(signedDistance(w, frame)) < ON_PLANE_EPS) {\n onPlane.add(idx);\n if (!seenId.has(vid)) { seenId.add(vid); sv.push({ id: vid, world: w }); }\n }\n });\n\n // 2) edges with a strict crossing → a derived intersectionLinePlane point.\n for (const [i, j] of extractEdges(faces)) {\n if (onPlane.has(i) || onPlane.has(j)) continue;\n const aw = pointWorld(state, verts[i]);\n const bw = pointWorld(state, verts[j]);\n const t = edgePlaneCrossing(aw, bw, frame);\n if (t == null) continue;\n const w: Vec3 = [\n aw[0] + t * (bw[0] - aw[0]),\n aw[1] + t * (bw[1] - aw[1]),\n aw[2] + t * (bw[2] - aw[2]),\n ];\n const id = addShape3dObj(\n s, 'point3d', 'p', '',\n { constraint: { kind: 'intersectionLinePlane', a: verts[i], b: verts[j], plane: planeId } },\n true, false,\n );\n sv.push({ id, world: w });\n }\n\n // 3) fail-soft: need ≥3 vertices to form a polygon.\n if (sv.length < 3) return;\n\n // 4) order around perimeter, 5) emit polygon3d.\n const order = orderAroundPerimeter(sv.map((p) => p.world), frame);\n const orderedIds = order.map((idx) => sv[idx].id);\n const label = intent.name ?? '';\n addShape3dObj(s, 'polygon3d', 'poly', label, { vertices: orderedIds, color: '#34d399' }, true, !!intent.name);\n};\n","import type { IntentBuilder3D } from './_types';\nimport { addShape3dObj, resolveId } from './_types';\n\n// Vẽ mặt cầu (trong suốt) qua tâm + 1 điểm mặt. registerInNameMap=false:\n// mặt cầu không được tham chiếu bởi nhãn (chỉ tâm-điểm mới được ref).\nexport const buildSphere: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'sphere') return;\n addShape3dObj(s, 'sphere3d', 'sp', intent.name ?? '', {\n center: resolveId(s, intent.center),\n surfacePoint: resolveId(s, intent.surfacePoint),\n }, true, false);\n};\n","import type { IntentBuilder3D } from './_types';\nimport { addShape3dObj, resolveId, projectedRadius3d } from './_types';\n\n// Vẽ khối nón qua tâm đáy + đỉnh + bán kính. radius literal (standalone) HOẶC radiusTo\n// (điểm trên đường tròn đáy → bán kính phái sinh = khoảng cách ⊥ trục, tính build-time).\nexport const buildCone: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'cone') return;\n const baseId = resolveId(s, intent.baseCenter);\n const apexId = resolveId(s, intent.apex);\n const radius = intent.radiusTo != null\n ? projectedRadius3d(s, baseId, apexId, resolveId(s, intent.radiusTo))\n : (intent.radius ?? 0);\n addShape3dObj(s, 'cone3d', 'co', intent.name ?? '', { baseCenter: baseId, apex: apexId, radius }, true, false);\n};\n","import type { IntentBuilder3D } from './_types';\nimport { addShape3dObj, resolveId, projectedRadius3d } from './_types';\n\n// Vẽ khối trụ qua 2 tâm đáy + bán kính. radius literal (standalone) HOẶC radiusTo\n// (điểm trên đường tròn đáy → bán kính phái sinh = khoảng cách ⊥ trục, tính build-time).\nexport const buildCylinder: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'cylinder') return;\n const baseId = resolveId(s, intent.baseCenter);\n const topId = resolveId(s, intent.topCenter);\n const radius = intent.radiusTo != null\n ? projectedRadius3d(s, baseId, topId, resolveId(s, intent.radiusTo))\n : (intent.radius ?? 0);\n addShape3dObj(s, 'cylinder3d', 'cy', intent.name ?? '', { baseCenter: baseId, topCenter: topId, radius }, true, false);\n};\n","import type { IntentBuilder3D } from './_types';\nimport { addShape3dObj, resolveId } from './_types';\n\n// Đa giác từ nhãn điểm tường minh (mặt cắt qua trục). registerInNameMap=false: không được ref.\nexport const buildPolygon: IntentBuilder3D = (s, intent) => {\n if (intent.op !== 'polygon') return;\n addShape3dObj(s, 'polygon3d', 'sec', intent.name ?? '', {\n vertices: intent.vertices.map((v) => resolveId(s, v)),\n color: '#60a5fa',\n }, true, false);\n};\n","import type { Intent3DT } from '../intent';\nimport type { IntentBuilder3D } from './_types';\nimport { buildSolid } from './solid';\nimport { buildConnect } from './connect';\nimport { buildAddPoint3d } from './addPoint3d';\nimport { buildPlane3d } from './plane';\nimport { buildLine3d } from './line';\nimport { buildCrossSection } from './crossSection';\nimport { buildSphere } from './sphere';\nimport { buildCone } from './cone';\nimport { buildCylinder } from './cylinder';\nimport { buildPolygon } from './polygon';\n\nexport const OP_BUILDERS_3D: Record<Intent3DT['op'], IntentBuilder3D> = {\n solid: buildSolid,\n connect: buildConnect,\n 'add-point-3d': buildAddPoint3d,\n plane: buildPlane3d,\n line: buildLine3d,\n 'cross-section': buildCrossSection,\n sphere: buildSphere,\n cone: buildCone,\n cylinder: buildCylinder,\n polygon: buildPolygon,\n};\n","import type { Intent3DT } from './intent';\n\n/** Labels produced by an intent (available for downstream intents to reference). */\nfunction producesOf(i: Intent3DT): string[] {\n switch (i.op) {\n case 'solid': {\n const out = [...i.baseLabels];\n if (i.apex) out.push(i.apex);\n if (i.topLabels) {\n out.push(...i.topLabels);\n } else if (i.flavor === 'prism' || i.flavor === 'box') {\n out.push(...i.baseLabels.map((l) => `${l}1`));\n }\n return out;\n }\n case 'add-point-3d': return [i.name];\n case 'plane': return [i.name];\n case 'line': return i.name ? [i.name] : [];\n case 'connect': return [];\n case 'cross-section': return i.name ? [i.name] : [];\n case 'sphere': return i.name ? [i.name] : [];\n case 'cone': return i.name ? [i.name] : [];\n case 'cylinder': return i.name ? [i.name] : [];\n case 'polygon': return i.name ? [i.name] : [];\n }\n}\n\n// Keys that are part of an intent's \"definition\" (not reference fields).\nconst PRODUCE_KEYS = new Set([\n 'op', 'baseLabels', 'apex', 'topLabels', 'name', 'flavor',\n 'baseVariant', 'apexVariant', 'style',\n]);\n\n/**\n * Returns labels from `produced` that this intent consumes.\n * Walks all non-produce-key values recursively looking for strings in the\n * global produced set (excluding this intent's own produced labels).\n */\nfunction consumesOf(i: Intent3DT, produced: Set<string>): string[] {\n const refs: string[] = [];\n const own = new Set(producesOf(i));\n\n const walk = (v: unknown): void => {\n if (typeof v === 'string') {\n if (produced.has(v) && !own.has(v)) refs.push(v);\n return;\n }\n if (Array.isArray(v)) {\n v.forEach(walk);\n return;\n }\n if (v && typeof v === 'object') {\n for (const [k, val] of Object.entries(v as Record<string, unknown>)) {\n if (!PRODUCE_KEYS.has(k)) walk(val);\n }\n }\n };\n\n for (const [k, val] of Object.entries(i as Record<string, unknown>)) {\n if (PRODUCE_KEYS.has(k)) continue;\n walk(val);\n }\n return refs;\n}\n\n/**\n * Stable Kahn topological sort on intents.\n *\n * - produces = labels an intent makes available\n * - consumes = labels an intent references from previously produced labels\n * - Cycle leftovers are appended in original order (graceful degradation)\n */\nexport function orderIntents3dByDependency(intents: readonly Intent3DT[]): Intent3DT[] {\n // Build global produced set across all intents.\n const allProduced = new Set<string>();\n for (const i of intents) {\n for (const p of producesOf(i)) allProduced.add(p);\n }\n\n // Map from label → the intent that produces it (for edge-building).\n const producerOf = new Map<string, Intent3DT>();\n for (const i of intents) {\n for (const p of producesOf(i)) producerOf.set(p, i);\n }\n\n // Count how many \"unresolved producer\" dependencies each intent has.\n const inDegree = new Map<Intent3DT, number>();\n // Adjacency: producer → dependents.\n const dependents = new Map<Intent3DT, Set<Intent3DT>>();\n for (const i of intents) {\n inDegree.set(i, 0);\n dependents.set(i, new Set());\n }\n\n for (const i of intents) {\n const consumed = consumesOf(i, allProduced);\n const seen = new Set<Intent3DT>();\n for (const label of consumed) {\n const producer = producerOf.get(label);\n if (producer && producer !== i && !seen.has(producer)) {\n seen.add(producer);\n dependents.get(producer)!.add(i);\n inDegree.set(i, (inDegree.get(i) ?? 0) + 1);\n }\n }\n }\n\n // Stable Kahn: preserve original order among same-degree nodes by using\n // an ordered queue seeded from the original array.\n const result: Intent3DT[] = [];\n // Queue initialized with intents that have inDegree 0, in original order.\n const queue: Intent3DT[] = intents.filter((i) => inDegree.get(i) === 0).slice();\n\n while (queue.length > 0) {\n const node = queue.shift()!;\n result.push(node);\n // Decrement dependents, add newly zero-degree ones in original array order.\n const ready: Intent3DT[] = [];\n for (const dep of dependents.get(node) ?? []) {\n const newDeg = (inDegree.get(dep) ?? 0) - 1;\n inDegree.set(dep, newDeg);\n if (newDeg === 0) ready.push(dep);\n }\n // Sort newly ready nodes by their original index to maintain stability.\n const originalOrder = new Map(intents.map((v, idx) => [v, idx]));\n ready.sort((a, b) => (originalOrder.get(a) ?? 0) - (originalOrder.get(b) ?? 0));\n queue.push(...ready);\n }\n\n // Append any cycle leftovers in original order.\n const placed = new Set(result);\n for (const i of intents) {\n if (!placed.has(i)) result.push(i);\n }\n\n return result;\n}\n","import { createEmptyState, createStore } from '../../../core/scene';\nimport type { State } from '../../../core/scene';\nimport { Intent3DZ, type Intent3DT } from './intent';\nimport { OP_BUILDERS_3D } from './intent-builders/registry';\nimport { IntentBuilder3DError, type BuildState3D } from './intent-builders/_types';\nimport { orderIntents3dByDependency } from './intentTopo3d';\n\nexport { IntentBuilder3DError };\n\nexport function intentToScene3d(intents: readonly Intent3DT[]): State {\n const store = createStore(createEmptyState('3d'));\n const s: BuildState3D = { store, nameToId: new Map() };\n const parsed = intents.map((i) => Intent3DZ.parse(i));\n for (const intent of orderIntents3dByDependency(parsed)) {\n const builder = OP_BUILDERS_3D[intent.op];\n if (!builder) throw new IntentBuilder3DError(`không có builder cho op=${intent.op}`, intent);\n builder(s, intent);\n }\n // Override meta.view so render.ts (which unpacks bbox3D as\n // x=[bbox[0],bbox[3]], y=[bbox[1],bbox[4]], z=[bbox[2],bbox[5]])\n // gets the correct axis ordering [xmin,ymin,zmin,xmax,ymax,zmax].\n // DEFAULT_VIEW_3D uses [xmin,xmax,ymin,ymax,zmin,zmax] which would invert axes.\n const st = store.getState();\n return {\n ...st,\n meta: {\n domain: '3d',\n version: st.meta.version,\n // azimuth/elevation chosen for a clear 3/4 textbook view of solids — verified\n // via Playwright that the editor default el≈0.4 squashes the horizontal base\n // edge-on; el≈0.6 looks down enough to show the base as a proper polygon.\n view: { bbox3D: [-3, -3, -3, 3, 3, 3], azimuth: 1.0, elevation: 0.6 },\n },\n } as State;\n}\n","import type { State } from '../../../core/scene';\nimport { constraintToWorld, planeConstructionWorld } from '../../../core/scene/kinds/constraint3d-math';\nimport { planeFrame, signedDistance, type Vec3 } from './crossSectionGeometry';\n\nfunction ptWorld(state: State, id: string): Vec3 {\n return constraintToWorld((state.objects[id].attrs as any).constraint, state) as Vec3;\n}\nfunction planeWorld3(state: State, planeId: string): [Vec3, Vec3, Vec3] {\n const a = (state.objects[planeId].attrs as any);\n if (a.construction) { const w = planeConstructionWorld(a.construction, state); return [w.p1, w.p2, w.p3]; }\n return [ptWorld(state, a.p1), ptWorld(state, a.p2), ptWorld(state, a.p3)];\n}\n\n/**\n * Kiểm tra tính hợp lệ hình học của scene 3D:\n * 1. Không có chu trình tham chiếu (constraintToWorld ném nếu đệ quy quá sâu).\n * 2. Toạ độ hữu hạn.\n * 3. Với điểm midpoint: w ≈ trung bình p1 + p2.\n * (Missing-ref được phát hiện bởi constraintToWorld ném khi id không tồn tại.)\n */\nexport function verifyFigure3d(state: State): { ok: boolean; issues: string[] } {\n const issues: string[] = [];\n\n for (const obj of Object.values(state.objects)) {\n if (obj.kind !== 'point3d') continue;\n\n const c = (obj.attrs as any).constraint as { kind: string; [k: string]: any };\n\n // Kiểm tra toạ độ + chu trình (constraintToWorld ném nếu ref không tồn tại hoặc đệ quy)\n let w: [number, number, number];\n try {\n w = constraintToWorld(c as any, state);\n } catch (e) {\n issues.push(`${obj.label}: ${(e as Error).message}`);\n continue;\n }\n\n if (!w.every((n) => Number.isFinite(n))) {\n issues.push(`${obj.label}: toạ độ không hữu hạn`);\n continue;\n }\n\n // Kiểm tra riêng midpoint: w ≈ avg(p1, p2)\n if (c.kind === 'midpoint') {\n try {\n const p1Obj = state.objects[c.p1];\n const p2Obj = state.objects[c.p2];\n if (p1Obj && p2Obj) {\n const a = constraintToWorld((p1Obj.attrs as any).constraint, state);\n const b = constraintToWorld((p2Obj.attrs as any).constraint, state);\n for (let k = 0; k < 3; k++) {\n if (Math.abs(w[k] - (a[k] + b[k]) / 2) > 1e-6) {\n issues.push(`${obj.label}: midpoint sai (axis ${k})`);\n }\n }\n }\n } catch (e) {\n issues.push(`${obj.label}: midpoint check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm tra intersectionLinePlane: điểm nằm trên mặt + param t∈[0,1]\n if (c.kind === 'intersectionLinePlane') {\n try {\n const [q1, q2, q3] = planeWorld3(state, c.plane);\n const f = planeFrame(q1, q2, q3);\n if (Math.abs(signedDistance(w, f)) > 1e-6) {\n issues.push(`${obj.label || obj.id}: giao điểm không nằm trên mặt`);\n }\n const dA = signedDistance(ptWorld(state, c.a), f);\n const dB = signedDistance(ptWorld(state, c.b), f);\n const t = dA / (dA - dB);\n if (!Number.isFinite(t) || t < -1e-6 || t > 1 + 1e-6) {\n issues.push(`${obj.label || obj.id}: giao điểm ngoài cạnh (t=${t})`);\n }\n } catch (e) {\n issues.push(`${obj.label || obj.id}: intersectionLinePlane check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm tra perpFootPlane: chân ⊥ nằm trên mặt + (foot−from) ∥ pháp tuyến\n if (c.kind === 'perpFootPlane') {\n try {\n const [q1, q2, q3] = planeWorld3(state, c.plane);\n const f = planeFrame(q1, q2, q3);\n if (Math.abs(signedDistance(w, f)) > 1e-6) {\n issues.push(`${obj.label || obj.id}: chân ⊥ không nằm trên mặt`);\n }\n const from = ptWorld(state, c.from);\n const d: [number, number, number] = [w[0] - from[0], w[1] - from[1], w[2] - from[2]];\n const cr: [number, number, number] = [\n d[1] * f.normal[2] - d[2] * f.normal[1],\n d[2] * f.normal[0] - d[0] * f.normal[2],\n d[0] * f.normal[1] - d[1] * f.normal[0],\n ];\n if (Math.hypot(cr[0], cr[1], cr[2]) > 1e-6) {\n issues.push(`${obj.label || obj.id}: đoạn ⊥ không song song pháp tuyến`);\n }\n } catch (e) {\n issues.push(`${obj.label || obj.id}: perpFootPlane check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm tra perpFootLine: (foot−from)·(b−a) ≈ 0 + chân nằm trên đường AB\n if (c.kind === 'perpFootLine') {\n try {\n const A = ptWorld(state, c.a);\n const B = ptWorld(state, c.b);\n const from = ptWorld(state, c.from);\n const ab: [number, number, number] = [B[0] - A[0], B[1] - A[1], B[2] - A[2]];\n const fh: [number, number, number] = [w[0] - from[0], w[1] - from[1], w[2] - from[2]];\n const perpDot = fh[0] * ab[0] + fh[1] * ab[1] + fh[2] * ab[2];\n if (Math.abs(perpDot) > 1e-6) {\n issues.push(`${obj.label || obj.id}: chân ⊥ trên đường không vuông góc`);\n }\n // Kiểm tra collinearity: (w−A) × (b−a) ≈ 0 (chân phải nằm trên đường AB)\n const wa: [number, number, number] = [w[0] - A[0], w[1] - A[1], w[2] - A[2]];\n const cr: [number, number, number] = [\n wa[1] * ab[2] - wa[2] * ab[1],\n wa[2] * ab[0] - wa[0] * ab[2],\n wa[0] * ab[1] - wa[1] * ab[0],\n ];\n if (Math.hypot(cr[0], cr[1], cr[2]) > 1e-6) {\n issues.push(`${obj.label || obj.id}: chân ⊥ không nằm trên đường`);\n }\n } catch (e) {\n issues.push(`${obj.label || obj.id}: perpFootLine check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm tra circumsphereCenter: tâm cách đều mọi đỉnh\n if (c.kind === 'circumsphereCenter') {\n try {\n const P = (c.vertices as string[]).map((id) => ptWorld(state, id));\n if (P.length >= 2) {\n // Bound sanity: đỉnh near-coplanar → solve3 ra tâm khổng lồ (radii spread lọt\n // tol tương đối). Canonical layout luôn trong [-3,3]³ ⟹ tâm hợp lệ |coord|≲5.\n if (!w.every((n) => Math.abs(n) < 1e3)) {\n issues.push(`${obj.label || obj.id}: tâm mặt cầu ngoài khung hợp lệ`);\n }\n const r0 = Math.hypot(w[0] - P[0][0], w[1] - P[0][1], w[2] - P[0][2]);\n const tol = 1e-6 * Math.max(1, r0);\n for (const p of P) {\n const ri = Math.hypot(w[0] - p[0], w[1] - p[1], w[2] - p[2]);\n if (Math.abs(ri - r0) > tol) { issues.push(`${obj.label || obj.id}: tâm mặt cầu không cách đều đỉnh`); break; }\n }\n }\n } catch (e) {\n issues.push(`${obj.label || obj.id}: circumsphereCenter check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm pyramidInsphereCenter: tâm trên trục chóp (collinear apex-G-tâm) + cách đều đáy/mặt bên\n if (c.kind === 'pyramidInsphereCenter') {\n try {\n const S = ptWorld(state, c.apex);\n const base = (c.vertices as string[]).map((id) => ptWorld(state, id));\n if (base.length >= 3) {\n const G: Vec3 = [0, 0, 0];\n for (const p of base) { G[0] += p[0]; G[1] += p[1]; G[2] += p[2]; }\n G[0] /= base.length; G[1] /= base.length; G[2] /= base.length;\n const pg: Vec3 = [w[0] - G[0], w[1] - G[1], w[2] - G[2]];\n const sg: Vec3 = [S[0] - G[0], S[1] - G[1], S[2] - G[2]];\n const cr: Vec3 = [pg[1] * sg[2] - pg[2] * sg[1], pg[2] * sg[0] - pg[0] * sg[2], pg[0] * sg[1] - pg[1] * sg[0]];\n if (Math.hypot(cr[0], cr[1], cr[2]) > 1e-6) issues.push(`${obj.label || obj.id}: tâm cầu nội tiếp không trên trục chóp`);\n const fb = planeFrame(base[0], base[1], base[2]);\n const dBase = Math.abs(signedDistance(w, fb));\n for (let i = 0; i < base.length; i++) {\n const lf = planeFrame(S, base[i], base[(i + 1) % base.length]);\n if (Math.abs(Math.abs(signedDistance(w, lf)) - dBase) > 1e-6 * Math.max(1, dBase)) {\n issues.push(`${obj.label || obj.id}: mặt cầu nội tiếp chóp không tiếp xúc đều đáy/mặt bên`); break;\n }\n }\n }\n } catch (e) {\n issues.push(`${obj.label || obj.id}: pyramidInsphereCenter check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm faceCircumcenter: trong mặt + cách đều 3 đỉnh\n if (c.kind === 'faceCircumcenter') {\n try {\n const P = (c.vertices as string[]).map((id) => ptWorld(state, id));\n if (P.length >= 3) {\n const f = planeFrame(P[0], P[1], P[2]);\n if (Math.abs(signedDistance(w, f)) > 1e-6) issues.push(`${obj.label || obj.id}: tâm ngoại tiếp không nằm trên mặt`);\n const r0 = Math.hypot(w[0] - P[0][0], w[1] - P[0][1], w[2] - P[0][2]);\n const tol = 1e-6 * Math.max(1, r0);\n for (const p of P) {\n if (Math.abs(Math.hypot(w[0] - p[0], w[1] - p[1], w[2] - p[2]) - r0) > tol) {\n issues.push(`${obj.label || obj.id}: tâm ngoại tiếp không cách đều đỉnh`); break;\n }\n }\n }\n } catch (e) {\n issues.push(`${obj.label || obj.id}: faceCircumcenter check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm pointAboveFace: w−base ∥ pháp tuyến mặt (trên trục ⊥ mặt) + |w−base| = dist(apex, mặt-phẳng)\n if (c.kind === 'pointAboveFace') {\n try {\n const G = ptWorld(state, c.base);\n const P = (c.vertices as string[]).map((id) => ptWorld(state, id));\n const S = ptWorld(state, c.apex);\n if (P.length >= 3) {\n const f = planeFrame(P[0], P[1], P[2]);\n const d: Vec3 = [w[0] - G[0], w[1] - G[1], w[2] - G[2]];\n const cx: Vec3 = [\n d[1] * f.normal[2] - d[2] * f.normal[1],\n d[2] * f.normal[0] - d[0] * f.normal[2],\n d[0] * f.normal[1] - d[1] * f.normal[0],\n ];\n const dlen = Math.hypot(d[0], d[1], d[2]);\n if (Math.hypot(cx[0], cx[1], cx[2]) > 1e-6 * Math.max(1, dlen)) {\n issues.push(`${obj.label || obj.id}: pointAboveFace không trên trục ⊥ mặt`);\n }\n const hExp = Math.abs(signedDistance(S, f));\n if (Math.abs(dlen - hExp) > 1e-6 * Math.max(1, hExp)) {\n issues.push(`${obj.label || obj.id}: pointAboveFace sai chiều cao`);\n }\n }\n } catch (e) {\n issues.push(`${obj.label || obj.id}: pointAboveFace check lỗi — ${(e as Error).message}`);\n }\n }\n }\n\n // Kiểm tra sphere3d: bán kính = |surface − center| hữu hạn > 0\n for (const obj of Object.values(state.objects)) {\n if (obj.kind !== 'sphere3d') continue;\n try {\n const a = obj.attrs as any;\n const center = ptWorld(state, a.center);\n const surface = ptWorld(state, a.surfacePoint);\n const R = Math.hypot(surface[0] - center[0], surface[1] - center[1], surface[2] - center[2]);\n if (!Number.isFinite(R) || R <= 1e-9) issues.push(`${obj.label || obj.id}: mặt cầu bán kính ≤ 0`);\n } catch (e) {\n issues.push(`${obj.label || obj.id}: sphere3d check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm tra cone3d: radius>0 + trục (apex−baseCenter) không suy biến\n for (const obj of Object.values(state.objects)) {\n if (obj.kind !== 'cone3d') continue;\n try {\n const a = obj.attrs as any;\n const bc = ptWorld(state, a.baseCenter);\n const ap = ptWorld(state, a.apex);\n const h = Math.hypot(ap[0] - bc[0], ap[1] - bc[1], ap[2] - bc[2]);\n if (!(a.radius > 0) || !Number.isFinite(h) || h <= 1e-9) issues.push(`${obj.label || obj.id}: khối nón suy biến`);\n } catch (e) {\n issues.push(`${obj.label || obj.id}: cone3d check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm tra cylinder3d: radius>0 + trục (topCenter−baseCenter) không suy biến\n for (const obj of Object.values(state.objects)) {\n if (obj.kind !== 'cylinder3d') continue;\n try {\n const a = obj.attrs as any;\n const bc = ptWorld(state, a.baseCenter);\n const tc = ptWorld(state, a.topCenter);\n const h = Math.hypot(tc[0] - bc[0], tc[1] - bc[1], tc[2] - bc[2]);\n if (!(a.radius > 0) || !Number.isFinite(h) || h <= 1e-9) issues.push(`${obj.label || obj.id}: khối trụ suy biến`);\n } catch (e) {\n issues.push(`${obj.label || obj.id}: cylinder3d check lỗi — ${(e as Error).message}`);\n }\n }\n\n // Kiểm tra polygon3d: ≥3 đỉnh + đồng phẳng\n for (const obj of Object.values(state.objects)) {\n if (obj.kind !== 'polygon3d') continue;\n const vids = (obj.attrs as any).vertices as string[];\n if (!vids || vids.length < 3) { issues.push(`${obj.label || obj.id}: đa giác < 3 đỉnh`); continue; }\n try {\n const ws = vids.map((id) => ptWorld(state, id));\n // Prefer the cutting plane frame when available (avoids near-collinear first-3-vertex degenerate normal).\n let f: ReturnType<typeof planeFrame>;\n const ilpVertex = vids.find((id) => {\n const c = (state.objects[id]?.attrs as any)?.constraint;\n return c?.kind === 'intersectionLinePlane';\n });\n if (ilpVertex) {\n const cPlane = ((state.objects[ilpVertex].attrs as any).constraint as { plane: string }).plane;\n const [q1, q2, q3] = planeWorld3(state, cPlane);\n f = planeFrame(q1, q2, q3);\n } else {\n f = planeFrame(ws[0], ws[1], ws[2]);\n }\n for (const wv of ws) {\n if (Math.abs(signedDistance(wv, f)) > 1e-5) { issues.push(`${obj.label || obj.id}: đa giác không phẳng`); break; }\n }\n } catch (e) {\n issues.push(`${obj.label || obj.id}: polygon check lỗi — ${(e as Error).message}`);\n }\n }\n\n return { ok: issues.length === 0, issues };\n}\n","import type { State } from '../../../../core/scene';\n\n// Khớp đầu khối: \"hình chóp S.ABCD\" → S + ABCD, \"tứ diện ABCD\" → ABCD, \"lăng trụ ABC.A'B'C'\" → ABC + A'B'C'.\n// Mỗi nhóm capture lấy 1 phần, code dưới tách ký tự đơn lẻ.\nconst SOLID_HEAD =\n /(?:hình\\s+chóp\\s+([A-Z])\\.([A-Z'′₀-₉0-9]+))|(?:tứ\\s+diện(?:\\s+đều)?\\s+([A-Z'′]{4}))|(?:lăng\\s+trụ\\s+([A-Z]{3,})\\.([A-Z'′]+))/gu;\n\n// \"Gọi M là…\" / \"Lấy điểm K…\" / \"Dựng điểm N…\"\nconst GOI = /(?:Gọi|Lấy|Dựng)\\s+(?:điểm\\s+)?([A-Z])(?![\\p{L}])/gu;\n\n// \"X là trung điểm…\" / \"X là chân…\" — chỉ lấy tên ĐỘC LẬP (HOA, không đứng sau chữ)\nconst LA_NAMED = /(?<![A-Za-z\\p{L}])([A-Z])\\s+là\\s+(?!hình\\s+chóp|tứ\\s+diện|lăng\\s+trụ)/gu;\n\n/** Tách các nhãn điểm từ chuỗi như \"ABCD\" hoặc \"A'B'C'\" (giữ prime/chỉ số để khớp label thật). */\nfunction splitLabels(s: string): string[] {\n return [...s.matchAll(/[A-Z](?:['′]|[₀-₉0-9])?/gu)].map((m) => m[0]);\n}\n\n/**\n * Kiểm tra mọi tên điểm được nêu rõ trong đề có xuất hiện trong state (dưới dạng point3d).\n *\n * Thu thập tên kỳ vọng từ:\n * - Đầu khối: \"hình chóp S.ABCD\", \"tứ diện ABCD\", \"lăng trụ ABC.A'B'C'\"\n * - \"Gọi/Lấy/Dựng (điểm)? X\"\n * - \"X là <construct>\" (tên điểm phái sinh)\n *\n * Mỗi tên phải xuất hiện dưới dạng label của point3d trong state.\n */\nexport function allNamedEntities3DPresent(\n problem: string,\n state: State,\n): { ok: boolean; missing: string[] } {\n const expected = new Set<string>();\n\n // Vét khối hình\n let m: RegExpExecArray | null;\n SOLID_HEAD.lastIndex = 0;\n while ((m = SOLID_HEAD.exec(problem)) !== null) {\n // hình chóp: m[1]=apex, m[2]=base labels\n if (m[1]) {\n expected.add(m[1]);\n for (const lbl of splitLabels(m[2] ?? '')) expected.add(lbl);\n }\n // tứ diện: m[3]=4 letters\n if (m[3]) {\n for (const lbl of splitLabels(m[3])) expected.add(lbl);\n }\n // lăng trụ: m[4]=base labels, m[5]=top labels\n if (m[4]) {\n for (const lbl of splitLabels(m[4])) expected.add(lbl);\n for (const lbl of splitLabels(m[5] ?? '')) expected.add(lbl);\n }\n }\n\n // \"Gọi/Lấy/Dựng điểm X\"\n const goiRe = new RegExp(GOI.source, 'gu');\n goiRe.lastIndex = 0;\n while ((m = goiRe.exec(problem)) !== null) {\n expected.add(m[1]);\n }\n\n // \"X là …\" (điểm phái sinh)\n const laRe = new RegExp(LA_NAMED.source, 'gu');\n laRe.lastIndex = 0;\n while ((m = laRe.exec(problem)) !== null) {\n expected.add(m[1]);\n }\n\n const labels = new Set(\n Object.values(state.objects)\n .filter((o) => o.kind === 'point3d')\n .map((o) => o.label),\n );\n\n const missing = [...expected].filter((n) => !labels.has(n));\n return { ok: missing.length === 0, missing };\n}\n","import type { State } from '../../../../core/scene';\nimport type { Intent3DT } from '../intent';\nimport type { CoverageReport3D } from './coverage3d';\nimport { runDeterministicIntents3d } from './runDeterministicIntents3d';\nimport { intentToScene3d } from '../intentToScene3d';\nimport { verifyFigure3d } from '../verify3d';\nimport { allNamedEntities3DPresent } from './guards3d';\n\nexport type Reason3D =\n | 'no-match'\n | 'incomplete-coverage'\n | 'build-throw'\n | 'verify-fail'\n | 'named-missing';\n\nexport type TryResult3D =\n | { ok: true; state: State; intents: Intent3DT[]; coverage: CoverageReport3D }\n | { ok: false; reason: Reason3D; detail?: string; coverage?: CoverageReport3D };\n\n/**\n * Track-A engine entry: chạy rule engine → build scene → verify → named-entity guard.\n * intentToScene3d đã topo-sort nội bộ (Bundle 2), nên không cần retry topo ở đây.\n */\nexport function tryDeterministicFigure3d(problem: string): TryResult3D {\n const det = runDeterministicIntents3d(problem);\n if (!det.ok) return { ok: false, reason: det.reason, coverage: det.coverage };\n\n let state: State;\n try {\n state = intentToScene3d(det.intents);\n } catch (e) {\n return {\n ok: false,\n reason: 'build-throw',\n detail: (e as Error).message,\n coverage: det.coverage,\n };\n }\n\n const v = verifyFigure3d(state);\n if (!v.ok) {\n return {\n ok: false,\n reason: 'verify-fail',\n detail: v.issues.join('; '),\n coverage: det.coverage,\n };\n }\n\n const named = allNamedEntities3DPresent(problem, state);\n if (!named.ok) {\n return {\n ok: false,\n reason: 'named-missing',\n detail: named.missing.join(','),\n coverage: det.coverage,\n };\n }\n\n return { ok: true, state, intents: det.intents, coverage: det.coverage };\n}\n","import type { State } from '../../../core/scene';\nimport type { Intent3DT } from './intent';\nimport { tryDeterministicFigure3d } from './deterministic/tryDeterministicFigure3d';\n\n/**\n * Track-A only: deterministic rule engine → State.\n * LLM fallback deferred to a later phase.\n */\nexport function generateFigureIntent3d(\n problem: string,\n): { ok: true; state: State; intents: Intent3DT[] } | { ok: false; reason: string; detail?: string } {\n const r = tryDeterministicFigure3d(problem);\n if (r.ok) return { ok: true, state: r.state, intents: r.intents };\n return { ok: false, reason: r.reason, detail: r.detail };\n}\n","import type { State } from '../../../core/scene';\nimport { generateFigureIntent3d } from './buildFigureIntent3d';\n\nexport interface AiFigure3DResult {\n ok: boolean;\n state?: State;\n message?: string;\n}\n\nconst MSG: Record<string, string> = {\n 'no-match': 'Chưa nhận dạng được hình học 3D trong đề.',\n 'incomplete-coverage': 'Một số chi tiết trong đề chưa dựng được tự động.',\n 'build-throw': 'Không dựng được hình từ các quan hệ trong đề.',\n 'verify-fail': 'Hình dựng ra chưa hợp lệ về mặt hình học.',\n 'named-missing': 'Thiếu một số điểm được nêu tên trong đề.',\n};\n\nexport function handleGenerateFigure3d(input: { problem: string }): AiFigure3DResult {\n const r = generateFigureIntent3d(input.problem);\n if (r.ok) return { ok: true, state: r.state };\n const message = MSG[r.reason] ?? `Không dựng được hình (${r.reason}).`;\n return { ok: false, message };\n}\n","'use client';\nimport * as React from 'react';\nimport {\n useEditorState,\n type Store,\n type View3D,\n} from '../../../core/scene';\nimport { JxgRenderer3D } from '../../../core/scene/render/JxgRenderer3D';\nimport { ToolController } from './tools/controller';\nimport { hitTest } from './hitTest/hitTest';\nimport { MiniBoard3D, type MiniBoard3DHandle } from './MiniBoard3D';\nimport { Preview3DManager } from './preview3d';\nimport { StatusHint } from './StatusHint';\nimport type { ToolKey } from './tools/spec';\nimport { usePointDrag } from './usePointDrag';\nimport { getView3DInfo, hitToHoverLabel } from './editorHelpers';\nimport { serializeBoard3D } from '../serialize';\nimport { renderGeometry3DSvgFromState } from '../render';\nimport { STAMP_PANEL_DESKTOP } from '../../shared/StampLeftPanel/constants';\nimport { ToastProvider, ToastHost, useToast } from '../../shared/Toast';\nimport { handleGenerateFigure3d } from '../ai/handleGenerateFigure3d';\n\nexport interface EditorPanelProps {\n isDark?: boolean;\n /** Triggered after serialize + svg render — host wires Excalidraw insertion. */\n onInsert?: (jsonState: string, svgString: string) => void;\n /** Close dialog. Host has the lifecycle hook for \"close + remove host\". */\n onClose: () => void;\n /** Store created by host (so LeftPanel sibling can share it). */\n store: Store;\n /** Currently selected tool — controlled by host. */\n selectedTool: ToolKey;\n /** Host gets notified when the controller switches the active tool. */\n onSelectedToolChange: (k: ToolKey) => void;\n showAxis: boolean;\n showGrid: boolean;\n /** Notifies host của ready/canUndo/canRedo để host wire LeftPanel buttons. */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Mở mobile LeftPanel drawer (host owns drawer visibility). */\n onOpenDrawer?: () => void;\n /** Khi true, panel offset left để chừa chỗ cho LeftPanel (desktop). */\n withLeftPanel?: boolean;\n}\n\nexport interface EditorPanelHandle {\n hasContent: () => boolean;\n /** Try to serialize + render + onInsert. Returns false nếu rỗng. */\n tryInsert: () => boolean;\n setTool: (k: ToolKey) => void;\n undo: () => void;\n redo: () => void;\n highlight: (id: string | null) => void;\n}\n\nconst EditorPanelInner = React.forwardRef<EditorPanelHandle, EditorPanelProps>(\n function EditorPanel(props, ref) {\n const {\n isDark: isDarkProp,\n onInsert,\n onClose,\n store,\n selectedTool,\n onSelectedToolChange,\n showAxis,\n showGrid,\n onHistoryChange,\n isMobile = false,\n onOpenDrawer,\n withLeftPanel = false,\n } = props;\n const isDark = isDarkProp ?? false;\n\n const controllerRef = React.useRef<ToolController | null>(null);\n if (!controllerRef.current) controllerRef.current = new ToolController(store);\n\n const [hint, setHint] = React.useState<string>('Chọn công cụ trong bảng bên trái');\n const [hoverLabel, setHoverLabel] = React.useState<string | null>(null);\n const [ready, setReady] = React.useState(false);\n const [hasContent, setHasContent] = React.useState(false);\n const [aiText, setAiText] = React.useState('');\n\n const { showToast } = useToast();\n\n const boardRef = React.useRef<MiniBoard3DHandle | null>(null);\n const rendererRef = React.useRef<JxgRenderer3D | null>(null);\n const previewRef = React.useRef<Preview3DManager | null>(null);\n const lastHoverHitRef = React.useRef<import('./hitTest/hitTest').SceneHit>({ kind: 'empty' });\n\n const onSelectedToolChangeRef = React.useRef(onSelectedToolChange);\n onSelectedToolChangeRef.current = onSelectedToolChange;\n\n const selectedToolRef = React.useRef(selectedTool);\n selectedToolRef.current = selectedTool;\n\n const onInsertRef = React.useRef(onInsert);\n onInsertRef.current = onInsert;\n\n // Hook đã pre-load state vào store qua parseInitialState3D — useEditorState\n // không cần initialState LOAD nữa. Vẫn dùng cho canUndo/canRedo propagate\n // + keyboard shortcuts.\n useEditorState({ store, onHistoryChange });\n\n const { shouldStartPointDrag, onPointerDrag, onPointerDragEnd, isDragging } = usePointDrag({\n store,\n boardRef,\n selectedToolRef,\n });\n\n React.useEffect(() => {\n const ctrl = controllerRef.current!;\n return ctrl.on((state) => {\n setHint(state.hint);\n onSelectedToolChangeRef.current(state.tool?.key ?? 'move');\n });\n }, []);\n\n React.useEffect(() => {\n controllerRef.current?.selectTool(selectedTool);\n }, [selectedTool]);\n\n React.useEffect(() => {\n return () => {\n rendererRef.current?.dispose();\n rendererRef.current = null;\n previewRef.current?.dispose();\n previewRef.current = null;\n };\n }, []);\n\n // hasContent: track store size để gate Insert button.\n React.useEffect(() => {\n const sync = (): void => setHasContent(Object.keys(store.getState().objects).length > 0);\n sync();\n return store.subscribe(sync);\n }, [store]);\n\n // Clear preview khi controller reset (tool switch, build complete, cancel).\n React.useEffect(() => {\n const controller = controllerRef.current;\n if (!controller) return;\n return controller.on((state) => {\n if (!previewRef.current) return;\n if (state.collected.length === 0) previewRef.current.clear();\n else previewRef.current.update(state.tool?.key ?? null, state.collected, lastHoverHitRef.current);\n });\n }, []);\n\n React.useEffect(() => {\n const view = boardRef.current?.getView3D();\n \n const v = view as any;\n if (!v || typeof v.setAttribute !== 'function') return;\n try {\n v.setAttribute({\n xAxis: { visible: showAxis },\n yAxis: { visible: showAxis },\n zAxis: { visible: showAxis },\n xPlaneRear: { visible: false, mesh3d: { visible: false } },\n yPlaneRear: { visible: false, mesh3d: { visible: false } },\n zPlaneRear: { visible: showGrid, mesh3d: { visible: false } },\n });\n v.board?.update?.();\n } catch {\n /* swallow — JSXGraph cũ / mocks không support runtime attr changes */\n }\n }, [showAxis, showGrid]);\n\n const handleView3DReady = React.useCallback((view: unknown) => {\n rendererRef.current = new JxgRenderer3D(store, view);\n previewRef.current = new Preview3DManager(view, store);\n const meta = store.getState().meta;\n const savedView: View3D | null = meta.domain === '3d' ? meta.view : null;\n if (savedView) {\n try {\n \n const v = view as any;\n v?.az_slide?.setValue?.(savedView.azimuth);\n v?.el_slide?.setValue?.(savedView.elevation);\n v?.board?.update?.();\n } catch {\n /* swallow — JSXGraph cũ không expose az_slide */\n }\n }\n setReady(true);\n }, [store]);\n\n const runAiGenerate = React.useCallback(() => {\n const r = handleGenerateFigure3d({ problem: aiText });\n if (!r.ok || !r.state) {\n showToast(r.message ?? 'Không dựng được hình.', { variant: 'error' });\n return;\n }\n store.dispatch({ type: 'LOAD', payload: { state: r.state } });\n // LOAD swaps the state but doesn't move the live view3d camera — sync it to the\n // figure's stored view so the generated solid shows at its 3/4 angle immediately\n // (mirror of handleView3DReady's one-shot sync).\n const savedView: View3D | null = r.state.meta.domain === '3d' ? r.state.meta.view : null;\n if (savedView) {\n try {\n\n const v = boardRef.current?.getView3D() as any;\n v?.az_slide?.setValue?.(savedView.azimuth);\n v?.el_slide?.setValue?.(savedView.elevation);\n v?.board?.update?.();\n } catch {\n /* swallow — JSXGraph cũ / mock không expose az_slide */\n }\n }\n }, [aiText, store, showToast]);\n\n const handleClick = React.useCallback((screen: { x: number; y: number }) => {\n const view = boardRef.current?.getView3D();\n if (!view) return;\n try {\n const hit = hitTest(screen, view, store.getState());\n controllerRef.current!.consumeHit(hit);\n } catch {\n /* swallow — view có thể chưa expose project3DTo2D trong mock path */\n }\n }, [store]);\n\n const handleMove = React.useCallback((screen: { x: number; y: number }) => {\n const view = boardRef.current?.getView3D();\n if (!view) return;\n if (isDragging()) return;\n let hit;\n try {\n hit = hitTest(screen, view, store.getState());\n } catch {\n setHoverLabel(null);\n return;\n }\n lastHoverHitRef.current = hit;\n const ctrl = controllerRef.current;\n if (previewRef.current && ctrl) {\n const cs = ctrl.getState();\n previewRef.current.update(cs.tool?.key ?? null, cs.collected, hit);\n }\n setHoverLabel(hitToHoverLabel(hit, store.getState()));\n }, [store, isDragging]);\n\n // Cursor hover hit-test — reuse `hitTest()` đã có. SceneHit.kind === 'empty'\n // → không hover; else → hover (point/line/polygon/...). Try/catch để\n // tolerate mock environment khi view chưa expose project3DTo2D.\n const isHoveringObject = React.useCallback((screen: { x: number; y: number }): boolean => {\n const view = boardRef.current?.getView3D();\n if (!view) return false;\n try {\n return hitTest(screen, view, store.getState()).kind !== 'empty';\n } catch {\n return false;\n }\n }, [store]);\n\n const tryInsert = React.useCallback((): boolean => {\n const state = store.getState();\n if (Object.keys(state.objects).length === 0) return false;\n const view = getView3DInfo(boardRef.current?.getView3D());\n const jsonState = serializeBoard3D(state, view);\n void (async () => {\n try {\n const { svgString } = await renderGeometry3DSvgFromState(jsonState);\n onInsertRef.current?.(jsonState, svgString);\n } catch (err) {\n console.error('Geometry3D insert failed:', err);\n }\n })();\n return true;\n }, [store]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n hasContent: () => Object.keys(store.getState().objects).length > 0,\n tryInsert,\n setTool: (k) => controllerRef.current!.selectTool(k),\n undo: () => store.undo(),\n redo: () => store.redo(),\n highlight: (id) => rendererRef.current?.highlight(id),\n }),\n [store, tryInsert],\n );\n\n const dialogStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học 3D\"\n data-testid=\"geom3d-host\"\n data-stamp-area=\"true\"\n style={dialogStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'relative flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : `${STAMP_PANEL_DESKTOP} rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5`,\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z M4 9 L10 4 L20 4 L14 9 Z M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n Dựng hình học không gian\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={tryInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geom3d-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n )}\n <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n <div className=\"min-h-0 flex-1\">\n <MiniBoard3D\n ref={boardRef}\n isDark={isDark}\n onView3DReady={handleView3DReady}\n onPointerClick={handleClick}\n onPointerMove={handleMove}\n onPointerLeave={() => {\n setHoverLabel(null);\n lastHoverHitRef.current = { kind: 'empty' };\n previewRef.current?.clear();\n }}\n shouldStartPointDrag={shouldStartPointDrag}\n onPointerDrag={onPointerDrag}\n onPointerDragEnd={onPointerDragEnd}\n isHoveringObject={isHoveringObject}\n />\n </div>\n <StatusHint hint={hint} hoverLabel={hoverLabel} />\n {!isMobile && (\n <>\n <div className=\"flex items-center gap-2 border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <input\n data-testid=\"ai-generate-3d-input\"\n type=\"text\"\n value={aiText}\n onChange={(e) => setAiText(e.target.value)}\n placeholder=\"Nhập đề hình không gian…\"\n className=\"flex-1 rounded border border-slate-300 bg-white px-2 py-1 text-xs text-slate-700 placeholder:text-slate-400 focus:border-emerald-500 focus:outline-none\"\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.currentTarget.blur();\n runAiGenerate();\n }\n }}\n />\n <button\n data-testid=\"ai-generate-3d-btn\"\n type=\"button\"\n onClick={runAiGenerate}\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700\"\n >\n AI dựng hình\n </button>\n </div>\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={tryInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geom3d-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n </>\n )}\n <ToastHost />\n </div>\n );\n },\n);\n\nexport const EditorPanel = React.forwardRef<EditorPanelHandle, EditorPanelProps>(\n function EditorPanel(props, ref) {\n return (\n <ToastProvider>\n <EditorPanelInner {...props} ref={ref} />\n </ToastProvider>\n );\n },\n);\n\n// createStore / createEmptyState exported từ core/scene barrel.\n","'use client';\nimport * as React from 'react';\n\nexport interface TabSpec<K extends string = string> {\n key: K;\n label: React.ReactNode;\n testId?: string;\n}\n\nexport interface LeftPanelShellProps<K extends string = string> {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n isDark?: boolean;\n tabs?: readonly TabSpec<K>[];\n activeTab?: K;\n onTabChange?: (k: K) => void;\n /** data-testid trên <aside> root. Mặc định \"left-panel\". */\n testId?: string;\n /** Opt-in: cho phép kéo viền phải để đổi width. */\n resizable?: boolean;\n /** Key localStorage để persist width khi resizable=true. */\n widthStorageKey?: string;\n /** Width mặc định khi resizable. Default 240 (≈ w-60). */\n defaultWidth?: number;\n minWidth?: number;\n maxWidth?: number;\n children: React.ReactNode;\n}\n\nconst FALLBACK_DEFAULT_WIDTH = 240;\nconst FALLBACK_MIN_WIDTH = 220;\nconst FALLBACK_MAX_WIDTH = 480;\n\nfunction clamp(n: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, n));\n}\n\nfunction readStoredWidth(\n key: string | undefined,\n fallback: number,\n min: number,\n max: number,\n): number {\n if (!key || typeof window === 'undefined') return fallback;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return fallback;\n const n = parseInt(raw, 10);\n if (Number.isFinite(n)) return clamp(n, min, max);\n } catch {\n /* SSR or storage disabled */\n }\n return fallback;\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function LeftPanelShell<K extends string>(props: LeftPanelShellProps<K>): React.ReactElement {\n const {\n title,\n icon,\n onClose,\n isDark,\n tabs,\n activeTab,\n onTabChange,\n testId,\n resizable,\n widthStorageKey,\n defaultWidth,\n minWidth,\n maxWidth,\n children,\n } = props;\n const showTabs = !!tabs && tabs.length >= 2;\n\n const min = minWidth ?? FALLBACK_MIN_WIDTH;\n const max = maxWidth ?? FALLBACK_MAX_WIDTH;\n const initial = clamp(defaultWidth ?? FALLBACK_DEFAULT_WIDTH, min, max);\n\n const [width, setWidth] = React.useState<number>(() =>\n resizable ? readStoredWidth(widthStorageKey, initial, min, max) : initial,\n );\n const widthRef = React.useRef(width);\n widthRef.current = width;\n\n React.useEffect(() => {\n if (!resizable || !widthStorageKey || typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(widthStorageKey, String(width));\n } catch {\n /* storage disabled */\n }\n }, [resizable, widthStorageKey, width]);\n\n const onResizeStart = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!resizable) return;\n e.preventDefault();\n const startX = e.clientX;\n const startW = widthRef.current;\n const onMove = (ev: MouseEvent) => {\n setWidth(clamp(startW + (ev.clientX - startX), min, max));\n };\n const onUp = () => {\n window.removeEventListener('mousemove', onMove);\n window.removeEventListener('mouseup', onUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n window.addEventListener('mousemove', onMove);\n window.addEventListener('mouseup', onUp);\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n },\n [resizable, min, max],\n );\n\n const onResizeDoubleClick = React.useCallback(() => {\n if (!resizable) return;\n setWidth(initial);\n }, [resizable, initial]);\n\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid={testId ?? 'left-panel'}\n data-stamp-area=\"true\"\n style={resizable ? { width: `${width}px` } : undefined}\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n resizable ? '' : 'w-60',\n ].join(' ')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n\n {showTabs && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-3\">\n {tabs!.map((t) => (\n <TabPill\n key={t.key}\n active={t.key === activeTab}\n onClick={() => onTabChange?.(t.key)}\n testId={t.testId}\n >\n {t.label}\n </TabPill>\n ))}\n </div>\n )}\n\n <div\n {...(showTabs ? { role: 'tabpanel' } : {})}\n className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-3\"\n >\n {children}\n </div>\n\n {resizable && (\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Kéo để đổi rộng panel\"\n data-testid=\"left-panel-resizer\"\n onMouseDown={onResizeStart}\n onDoubleClick={onResizeDoubleClick}\n className=\"group absolute right-0 top-0 z-40 h-full w-1.5 -mr-0.5 cursor-ew-resize select-none\"\n title=\"Kéo để đổi rộng (double-click để reset)\"\n >\n <div className=\"pointer-events-none absolute inset-y-0 right-0 w-px bg-slate-200 transition group-hover:bg-emerald-400 group-hover:w-0.5 group-active:bg-emerald-500 group-active:w-0.5\" />\n </div>\n )}\n </aside>\n );\n}\n\nexport function TabPill(props: {\n active: boolean;\n onClick: () => void;\n testId?: string;\n children: React.ReactNode;\n}): React.ReactElement {\n const { active, onClick, testId, children } = props;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n data-testid={testId}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n active\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nexport function Section(props: { label: string; children: React.ReactNode }): React.ReactElement {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {props.label}\n </h4>\n {props.children}\n </section>\n );\n}\n","// src/core/scene/ui/kindMeta.ts\nexport interface KindUiMeta {\n displayName: string;\n icon: string;\n /** Fallback color khi obj.attrs.color không có. Phải khớp default ở renderer. */\n defaultColor: string;\n}\n\n// Default colors:\n// - Points: blue (#1e40af)\n// - Curves / shapes: dark slate (#0f172a)\n// - 3D planes / spheres: light blue (#60a5fa)\nconst POINT_COLOR = '#1e40af';\nconst CURVE_COLOR = '#0f172a';\nconst PLANE_COLOR = '#60a5fa';\n\nexport const KIND_UI_META: Readonly<Record<string, KindUiMeta>> = {\n // 2D\n point: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n circle: { displayName: 'Đường tròn', icon: '○', defaultColor: CURVE_COLOR },\n polygon: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n intersection: { displayName: 'Giao điểm', icon: '✕', defaultColor: POINT_COLOR },\n angle: { displayName: 'Góc', icon: '∠', defaultColor: '#16a34a' },\n distance: { displayName: 'Khoảng cách', icon: '↔', defaultColor: '#dc2626' },\n // 3D\n point3d: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment3d: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line3d: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray3d: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector3d: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n plane3d: { displayName: 'Mặt phẳng', icon: '▱', defaultColor: PLANE_COLOR },\n polygon3d: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n sphere3d: { displayName: 'Mặt cầu', icon: '◯', defaultColor: PLANE_COLOR },\n polyhedron3d: { displayName: 'Đa diện', icon: '⬢', defaultColor: PLANE_COLOR },\n cylinder3d: { displayName: 'Hình trụ', icon: '⌭', defaultColor: PLANE_COLOR },\n cone3d: { displayName: 'Hình nón', icon: '▲', defaultColor: PLANE_COLOR },\n // Graph 2D\n function2d: { displayName: 'Hàm số', icon: 'ƒ', defaultColor: CURVE_COLOR },\n parameter: { displayName: 'Tham số', icon: 'α', defaultColor: '#7c3aed' },\n pointOnCurve: { displayName: 'Điểm trên đồ thị', icon: '◉', defaultColor: POINT_COLOR },\n tangent2d: { displayName: 'Tiếp tuyến', icon: '╱', defaultColor: CURVE_COLOR },\n extremum2d: { displayName: 'Cực trị', icon: '∧', defaultColor: POINT_COLOR },\n root2d: { displayName: 'Nghiệm', icon: '0', defaultColor: POINT_COLOR },\n slope2d: { displayName: 'Hệ số góc', icon: '△', defaultColor: '#dc2626' },\n};\n\nexport function getKindUiMeta(kind: string): KindUiMeta {\n return KIND_UI_META[kind] ?? { displayName: kind, icon: '?', defaultColor: '#888888' };\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface ObjectRowMenuProps {\n locked: boolean;\n onToggleLocked: () => void;\n onRename: () => void;\n onChangeColor: () => void;\n onDelete: () => void;\n}\n\nexport function ObjectRowMenu(props: ObjectRowMenuProps): React.ReactElement {\n const { locked, onToggleLocked, onRename, onChangeColor, onDelete } = props;\n const [open, setOpen] = React.useState(false);\n\n return (\n <div className=\"relative inline-block\">\n <button\n type=\"button\"\n aria-label=\"Row menu\"\n onClick={(e) => { e.stopPropagation(); setOpen((v) => !v); }}\n className=\"rounded px-1.5 text-black\"\n >\n ⋮\n </button>\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-10 mt-1 w-40 rounded-md border border-zinc-200 bg-white py-1 text-xs shadow-lg dark:border-zinc-700 dark:bg-zinc-900\"\n onClick={(e) => e.stopPropagation()}\n >\n <MenuItem onClick={() => { setOpen(false); onRename(); }}>Đổi tên</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onChangeColor(); }}>Đổi màu</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onToggleLocked(); }}>\n {locked ? 'Mở khoá' : 'Khoá'}\n </MenuItem>\n <MenuItem\n onClick={() => { setOpen(false); onDelete(); }}\n className=\"text-red-600 dark:text-red-400\"\n >\n Xoá\n </MenuItem>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MenuItem({\n children,\n onClick,\n className,\n}: React.PropsWithChildren<{ onClick: () => void; className?: string }>) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={onClick}\n className={`block w-full px-3 py-1 text-left text-black ${className ?? ''}`}\n >\n {children}\n </button>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { SceneObject, State } from '../types';\nimport { getKind } from '../registry';\nimport { getKindUiMeta } from './kindMeta';\nimport { ObjectRowMenu } from './ObjectRowMenu';\n\nexport interface ObjectRowProps {\n obj: SceneObject;\n state: State;\n selected: boolean;\n onSelect: (id: string) => void;\n onToggleVisible: (id: string) => void;\n onToggleLocked: (id: string) => void;\n onRename: (id: string) => void;\n onChangeColor: (id: string) => void;\n onDelete: (id: string) => void;\n /**\n * Override mô tả title của row. Mặc định dùng `getKind(obj.kind).describe()`.\n * Stamp consumer (vd geometry-2d) có thể inject DSL-style description.\n */\n describe?: (obj: SceneObject, state: State) => string;\n}\n\nfunction formatMeasure(items: { label: string; value: number }[]): string {\n return items.map((it) => `${it.label} = ${it.value.toFixed(2)}`).join(', ');\n}\n\nexport function ObjectRow(props: ObjectRowProps): React.ReactElement {\n const { obj, state, selected, onSelect, onToggleVisible, onToggleLocked, onRename, onChangeColor, onDelete, describe } = props;\n\n const meta = getKindUiMeta(obj.kind);\n\n let title = '';\n try {\n title = describe\n ? describe(obj, state)\n : getKind(obj.kind).describe(obj, state);\n } catch {\n title = `${meta.displayName} ${obj.label}`;\n }\n\n let measureText: string | null = null;\n if (selected) {\n try {\n const m = getKind(obj.kind).measure?.(obj, state);\n if (m && m.length > 0) measureText = formatMeasure(m);\n } catch {\n measureText = null;\n }\n }\n\n const color = (obj.attrs as { color?: string }).color ?? meta.defaultColor;\n\n return (\n <li\n data-testid={`object-row-${obj.id}`}\n aria-selected={selected}\n onClick={() => onSelect(obj.id)}\n className={\n 'flex flex-col border-b border-zinc-100 cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : '')\n }\n >\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-xs\">\n <button\n type=\"button\"\n aria-label=\"Toggle visibility\"\n aria-pressed={!obj.visible}\n onClick={(e) => { e.stopPropagation(); onToggleVisible(obj.id); }}\n className=\"h-4 w-4 shrink-0 rounded-full border-2 transition\"\n style={{\n backgroundColor: obj.visible ? color : 'transparent',\n borderColor: color,\n }}\n />\n <span className=\"flex-1 truncate text-black\">\n {title}\n </span>\n <ObjectRowMenu\n locked={obj.locked}\n onToggleLocked={() => onToggleLocked(obj.id)}\n onRename={() => onRename(obj.id)}\n onChangeColor={() => onChangeColor(obj.id)}\n onDelete={() => onDelete(obj.id)}\n />\n </div>\n {selected && measureText && (\n <div\n data-testid={`object-row-detail-${obj.id}`}\n className=\"pl-9 pr-3 pb-1.5 text-[11px] text-black\"\n >\n {measureText}\n </div>\n )}\n </li>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Store } from '../store';\nimport type { SceneObject } from '../types';\nimport { listObjects } from '../selectors';\nimport { ObjectRow } from './ObjectRow';\n\nexport interface ObjectListPanelProps {\n store: Store;\n selectedId?: string;\n /**\n * Called when user clicks a row. Receives the row id, or `null` when the\n * user clicks the already-selected row (toggle off — request to deselect).\n * Parent should treat `null` as \"clear selection\".\n */\n onSelect?: (id: string | null) => void;\n /**\n * Optional per-kind row renderer. Called with the SceneObject and default props\n * (selected, onClick). Return a ReactNode to override the default ObjectRow.\n * Return null/undefined to fall back to the default ObjectRow.\n */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => React.ReactNode;\n}\n\nexport function ObjectListPanel(props: ObjectListPanelProps): React.ReactElement {\n const { store, selectedId, onSelect, renderRow } = props;\n // useSyncExternalStore expects subscribe to receive () => void callback,\n // but Store.subscribe takes (next, prev, action) => void. Wrap to adapt.\n const subscribe = React.useCallback(\n (cb: () => void) => store.subscribe(() => cb()),\n [store],\n );\n const state = React.useSyncExternalStore(subscribe, store.getState, store.getState);\n const objects = listObjects(state);\n\n function handleSelect(id: string) {\n // Toggle: click vào row đang selected → deselect (collapse detail + tắt highlight).\n onSelect?.(id === selectedId ? null : id);\n }\n\n function handleToggleVisible(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { visible: !obj.visible } } });\n }\n\n function handleToggleLocked(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { locked: !obj.locked } } });\n }\n\n function handleDelete(id: string) {\n store.dispatch({ type: 'DELETE', payload: { id } });\n }\n\n function noop() { /* rename + change color stubbed for Phase 3 */ }\n\n return (\n <ul\n data-testid=\"object-list-panel\"\n className=\"flex max-h-[calc(100vh-200px)] flex-col overflow-y-auto\"\n >\n {objects.length === 0 ? (\n <li className=\"px-3 py-4 text-center text-xs text-zinc-500\">Chưa có đối tượng nào</li>\n ) : (\n objects.map((obj) => {\n const selected = obj.id === selectedId;\n const onClick = () => handleSelect(obj.id);\n if (renderRow) {\n const custom = renderRow(obj, { selected, onClick });\n if (custom != null) {\n return <React.Fragment key={obj.id}>{custom}</React.Fragment>;\n }\n }\n return (\n <ObjectRow\n key={obj.id}\n obj={obj}\n state={state}\n selected={selected}\n onSelect={handleSelect}\n onToggleVisible={handleToggleVisible}\n onToggleLocked={handleToggleLocked}\n onRename={noop}\n onChangeColor={noop}\n onDelete={handleDelete}\n />\n );\n })\n )}\n </ul>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/AxisGridSection.tsx\n//\n// Section \"Bố cục\" / \"Góc nhìn\": 2 checkbox axis/grid + (optional) undo/redo\n// button ở mép phải. Render khi có ít nhất 1 trong (view, history).\n// Skip toàn bộ section khi cả 2 đều undefined.\n\nimport React from 'react';\nimport { Section } from '../../../core/scene/ui/LeftPanelShell';\nimport type {\n StampLeftPanelHistoryProps,\n StampLeftPanelViewProps,\n} from './types';\n\nexport interface AxisGridSectionProps {\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function AxisGridSection(props: AxisGridSectionProps): React.ReactElement | null {\n const { view, history } = props;\n if (!view && !history) return null;\n\n const sectionLabel = view?.sectionLabel ?? 'Bố cục';\n const axisLabel = view?.axisLabel ?? 'Trục';\n const gridLabel = view?.gridLabel ?? 'Lưới';\n\n return (\n <Section label={sectionLabel}>\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n {view && (\n <>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showAxis}\n onChange={(e) => view.onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n {axisLabel}\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showGrid}\n onChange={(e) => view.onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n {gridLabel}\n </label>\n </>\n )}\n {history && (\n <div className=\"ml-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={history.onUndo}\n disabled={!history.canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={history.onRedo}\n disabled={!history.canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n )}\n </div>\n </Section>\n );\n}\n","// src/stamps/shared/StampLeftPanel/types.ts\n//\n// Shared types cho StampLeftPanel template. Dùng generic TKey/TGroup để\n// preserve type safety tại call site (host của từng stamp truyền union type\n// riêng); internal cài theo string là OK.\n\nimport type { ReactNode } from 'react';\nimport type { Store } from '../../../core/scene/store';\nimport type { SceneObject } from '../../../core/scene/types';\n\nexport const TOOLTIP_DELAY_MS = 400;\nexport type HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n/** Tool descriptor unified cho 3 stamp editor. */\nexport interface StampToolDef<TKey extends string = string, TGroup extends string = string> {\n key: TKey;\n label: string;\n hint?: string;\n icon: ReactNode;\n group: TGroup;\n shortcut?: string;\n}\n\nexport interface StampLeftPanelTabs {\n /** Label tab \"Đối tượng\" (default \"📐 Đối tượng\"). */\n objectsLabel?: ReactNode;\n /** Label tab \"Công cụ\" (default \"🧰 Công cụ\"). */\n toolsLabel?: ReactNode;\n}\n\nexport interface StampLeftPanelViewProps {\n /** Section header label, default \"Bố cục\". */\n sectionLabel?: string;\n /** Checkbox label cho axis, default \"Trục\". */\n axisLabel?: string;\n /** Checkbox label cho grid, default \"Lưới\". */\n gridLabel?: string;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n}\n\nexport interface StampLeftPanelHistoryProps {\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n}\n\nexport interface StampLeftPanelChordProps<TGroup extends string = string> {\n /** Group đang được focus sau khi user bấm letter. null = không active. */\n activeGroup: TGroup | null;\n /** Mapping group → letter hint (vd \"P\" cho group \"point\"). */\n letterForGroup: (g: TGroup) => string;\n}\n\nexport interface StampLeftPanelObjectsProps {\n store: Store;\n selectedObjectId?: string;\n onObjectSelect?: (id: string | null) => void;\n /** Custom row render (vd graph-2d cần FunctionRow/ParameterRow). Trả null để fallback default ObjectRow. */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => ReactNode | null;\n /** Optional buttons phía trên ObjectListPanel (vd graph-2d \"+Hàm\" \"+Tham số\"). */\n addButtons?: ReadonlyArray<{ label: string; testId?: string; onClick: () => void }>;\n}\n\nexport interface StampLeftPanelProps<\n TKey extends string = string,\n TGroup extends string = string,\n> {\n // Header\n title: string;\n icon: ReactNode;\n onClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> root. Default \"stamp-left-panel\". */\n testId?: string;\n\n // Tools (required)\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n\n // Optional sections\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n chord?: StampLeftPanelChordProps<TGroup>;\n objects?: StampLeftPanelObjectsProps;\n tabs?: StampLeftPanelTabs;\n\n // Mobile\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n","// src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts\n//\n// Generic hover tooltip hook. Trả về { hover, portalReady, showHover, hideHover }\n// để consumer render tooltip qua createPortal. Delay 400ms tránh flash.\n//\n// Generic theo StampToolDef → 3 stamp dùng chung. Moved từ\n// geometry-2d/editor/LeftPanel/useToolHoverTooltip.ts (Phase 1.2).\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { TOOLTIP_DELAY_MS, type HoverState, type StampToolDef } from './types';\n\nexport function useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: StampToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/ToolGrid.tsx\n//\n// Tool button grid với:\n// - Search input ở đầu (filter theo label/hint, ignore diacritics + case).\n// - Group section render 4-col icon button.\n// - Khi chord.activeGroup set: section đó highlight (ring emerald + bg),\n// section khác dimmed. KHÔNG render letter / number badge / hint footer\n// nữa (đã bỏ phím tắt visual ở v0.27).\n\nimport React, { useMemo, useState } from 'react';\nimport type {\n StampLeftPanelChordProps,\n StampToolDef,\n} from './types';\nimport { useToolHoverTooltip } from './useToolHoverTooltip';\nimport { createPortal } from 'react-dom';\n\nexport interface ToolGridProps<TKey extends string, TGroup extends string> {\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n chord?: StampLeftPanelChordProps<TGroup>;\n}\n\nfunction normalize(s: string): string {\n return s\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/đ/g, 'd')\n .replace(/Đ/g, 'd');\n}\n\nfunction SearchIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <line x1=\"20\" y1=\"20\" x2=\"16.5\" y2=\"16.5\" />\n </svg>\n );\n}\n\nfunction ClearIcon(): React.ReactElement {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction ToolResultList<TKey extends string, TGroup extends string>(props: {\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n}): React.ReactElement {\n const { tools, activeTool, onToolChange } = props;\n return (\n <div className=\"flex flex-col gap-0.5\" data-testid=\"tool-result-list\">\n {tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n data-tool={t.key}\n aria-label={t.label}\n aria-pressed={active}\n onClick={() => onToolChange(t.key)}\n className={[\n 'flex items-center gap-2 rounded-md px-2 py-1.5 text-left transition',\n active ? 'bg-emerald-600 text-white' : 'text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-6 w-6 shrink-0 items-center justify-center\">{t.icon}</span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-[12px] font-medium leading-tight\">{t.label}</span>\n {t.hint && (\n <span className={['block truncate text-[10px] leading-tight', active ? 'text-emerald-50' : 'text-slate-400'].join(' ')}>\n {t.hint}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function ToolGrid<TKey extends string, TGroup extends string>(\n props: ToolGridProps<TKey, TGroup>,\n): React.ReactElement {\n const { tools, groupOrder, groupLabels, activeTool, onToolChange, chord } = props;\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n const [query, setQuery] = useState('');\n const normalizedQuery = useMemo(() => normalize(query.trim()), [query]);\n\n const filteredTools = useMemo(() => {\n if (!normalizedQuery) return tools;\n return tools.filter((t) => {\n if (normalize(t.label).includes(normalizedQuery)) return true;\n if (t.hint && normalize(t.hint).includes(normalizedQuery)) return true;\n return false;\n });\n }, [tools, normalizedQuery]);\n\n const grouped = useMemo(() => {\n const acc: Partial<Record<TGroup, StampToolDef<TKey, TGroup>[]>> = {};\n for (const t of filteredTools) {\n (acc[t.group] ??= []).push(t);\n }\n return acc;\n }, [filteredTools]);\n\n const groupKeys = useMemo(\n () => groupOrder.filter((g) => grouped[g] && grouped[g]!.length > 0),\n [grouped, groupOrder],\n );\n\n const noMatch = normalizedQuery !== '' && groupKeys.length === 0;\n\n return (\n <>\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-slate-400\">\n <SearchIcon />\n </span>\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Tìm công cụ…\"\n aria-label=\"Tìm công cụ\"\n data-testid=\"tool-search-input\"\n className=\"w-full rounded-md border border-slate-200 bg-slate-50 py-1.5 pl-7 pr-7 text-[12px] text-slate-800 placeholder:text-slate-400 focus:border-emerald-400 focus:bg-white focus:outline-none focus:ring-1 focus:ring-emerald-300\"\n />\n {query && (\n <button\n type=\"button\"\n onClick={() => setQuery('')}\n aria-label=\"Xoá tìm kiếm\"\n data-testid=\"tool-search-clear\"\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 rounded p-0.5 text-slate-400 transition hover:bg-slate-200 hover:text-slate-700\"\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {noMatch && (\n <div\n data-testid=\"tool-search-empty\"\n className=\"rounded-md border border-dashed border-slate-200 bg-slate-50 px-3 py-4 text-center text-[11px] text-slate-500\"\n >\n Không có công cụ nào khớp “{query.trim()}”.\n </div>\n )}\n\n {normalizedQuery !== '' && !noMatch ? (\n <ToolResultList tools={filteredTools} activeTool={activeTool} onToolChange={onToolChange} />\n ) : (\n groupKeys.map((group) => {\n const isChordActive = chord?.activeGroup === group;\n const dimmed = chord?.activeGroup != null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1' : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {groupLabels[group]}\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group]!.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n title={t.label + (t.shortcut ? ` (${t.shortcut})` : '')}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'relative flex h-10 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n </button>\n );\n })}\n </div>\n </section>\n );\n })\n )}\n\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Desktop.tsx\n//\n// Desktop layout cho StampLeftPanel. Render:\n// 1. LeftPanelShell chrome + tabs (chỉ render tablist khi có objects)\n// 2. Tab \"tools\": <AxisGridSection> + <ToolGrid> chord-aware\n// 3. Tab \"objects\": optional add buttons + <ObjectListPanel> với custom renderRow\n\nimport React, { useEffect, useState } from 'react';\nimport { LeftPanelShell } from '../../../core/scene/ui/LeftPanelShell';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport { AxisGridSection } from './AxisGridSection';\nimport { ToolGrid } from './ToolGrid';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanelDesktop<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n onClose,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n chord,\n objects,\n tabs,\n } = props;\n\n const [tab, setTab] = useState<'tools' | 'objects'>('tools');\n const hasObjects = !!objects;\n\n useEffect(() => {\n if (!hasObjects && tab === 'objects') setTab('tools');\n }, [hasObjects, tab]);\n\n const tabSpecs = hasObjects\n ? [\n { key: 'tools' as const, label: tabs?.toolsLabel ?? '🧰 Công cụ', testId: 'tab-tools' },\n { key: 'objects' as const, label: tabs?.objectsLabel ?? '📐 Đối tượng', testId: 'tab-objects' },\n ]\n : undefined;\n\n return (\n <LeftPanelShell\n title={title}\n icon={icon}\n onClose={onClose}\n isDark={isDark}\n testId={testId ?? 'stamp-left-panel'}\n tabs={tabSpecs}\n activeTab={hasObjects ? tab : undefined}\n onTabChange={hasObjects ? setTab : undefined}\n resizable\n widthStorageKey=\"xom11.stamp-left-panel.width\"\n >\n {(!hasObjects || tab === 'tools') ? (\n <>\n <AxisGridSection view={view} history={history} />\n <ToolGrid\n tools={tools}\n groupOrder={groupOrder}\n groupLabels={groupLabels}\n activeTool={activeTool}\n onToolChange={onToolChange}\n chord={chord}\n />\n </>\n ) : (\n <section data-testid=\"objects-panel\" className=\"flex flex-col gap-2\">\n {objects!.addButtons && objects!.addButtons.length > 0 && (\n <div className=\"flex gap-1\">\n {objects!.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects!.store}\n selectedId={objects!.selectedObjectId}\n onSelect={objects!.onObjectSelect}\n renderRow={objects!.renderRow}\n />\n </section>\n )}\n </LeftPanelShell>\n );\n}\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n /** Optional: thêm tab \"Đối tượng\" trong drawer body. */\n objectsTab?: {\n label: React.ReactNode;\n render: () => React.ReactNode;\n };\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n objectsTab,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n const [mobileTab, setMobileTab] = React.useState<'tools' | 'objects'>('tools');\n const prevOpenRef = React.useRef(drawerOpen);\n React.useEffect(() => {\n if (!prevOpenRef.current && drawerOpen) setMobileTab('tools');\n prevOpenRef.current = drawerOpen;\n }, [drawerOpen]);\n\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Tab row (chỉ render khi objectsTab được cung cấp) */}\n {objectsTab && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-2\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'tools'}\n onClick={() => setMobileTab('tools')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'tools'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n 🧰 Công cụ\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'objects'}\n onClick={() => setMobileTab('objects')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'objects'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {objectsTab.label}\n </button>\n </div>\n )}\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {objectsTab && mobileTab === 'objects' ? (\n <div className=\"px-3 pt-3\">{objectsTab.render()}</div>\n ) : (\n groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-8 w-8 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))\n )}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Mobile.tsx\n//\n// Mobile layout: wrap shared MobileToolDrawer với mapping:\n// chips = axis/grid (from view)\n// actions = undo/redo (from history)\n// groups = tools grouped by group\n// objects = objectsTab (objects.store + addButtons + custom renderRow)\n\nimport React, { useMemo } from 'react';\nimport { MobileToolDrawer, type MobileToolGroup } from '../MobileToolDrawer';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport type { StampLeftPanelProps } from './types';\n\nfunction AxisIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nfunction GridIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function StampLeftPanelMobile<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n objects,\n tabs,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = useMemo<MobileToolGroup<TKey, TGroup>[]>(() => {\n const acc = new Map<TGroup, typeof tools[number][]>();\n for (const t of tools) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n // Preserve groupOrder\n return groupOrder\n .filter((g) => acc.has(g))\n .map((group) => ({\n group,\n groupLabel: groupLabels[group],\n tools: acc.get(group)!.map((t) => ({ key: t.key, label: t.label, icon: t.icon })),\n }));\n }, [tools, groupOrder, groupLabels]);\n\n const chips = view\n ? [\n {\n label: view.axisLabel ?? 'Trục',\n icon: <AxisIcon />,\n pressed: view.showAxis,\n onToggle: view.onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: view.gridLabel ?? 'Lưới',\n icon: <GridIcon />,\n pressed: view.showGrid,\n onToggle: view.onShowGridChange,\n testId: 'toggle-grid',\n },\n ]\n : [];\n\n const actions = history\n ? [\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: history.onUndo,\n disabled: !history.canUndo,\n testId: 'undo-btn',\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: history.onRedo,\n disabled: !history.canRedo,\n testId: 'redo-btn',\n },\n ]\n : [];\n\n return (\n <MobileToolDrawer\n title={title}\n headerIcon={icon}\n testId={testId ?? 'stamp-left-panel'}\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={chips}\n actions={actions}\n groups={groups}\n activeTool={activeTool}\n onToolSelect={onToolChange}\n objectsTab={\n objects\n ? {\n label: tabs?.objectsLabel ?? '📐 Đối tượng',\n render: () => (\n <div className=\"flex flex-col gap-2 px-3\">\n {objects.addButtons && objects.addButtons.length > 0 && (\n <div className=\"flex gap-1 pt-3\">\n {objects.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects.store}\n selectedId={objects.selectedObjectId}\n onSelect={objects.onObjectSelect}\n renderRow={objects.renderRow}\n />\n </div>\n ),\n }\n : undefined\n }\n />\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/index.tsx\n//\n// Public API. Dispatch isMobile → Desktop hoặc Mobile.\n//\n// Usage:\n//\n// <StampLeftPanel\n// title=\"Hình học\"\n// icon={<GeomIcon />}\n// tools={TOOLS} // ReadonlyArray<StampToolDef>\n// groupOrder={GROUP_ORDER}\n// groupLabels={GROUP_LABELS}\n// activeTool={tool}\n// onToolChange={setTool}\n// view={{ showAxis, showGrid, onShowAxisChange, onShowGridChange }} // optional\n// history={{ onUndo, canUndo, onRedo, canRedo }} // optional\n// chord={{ activeGroup, letterForGroup }} // optional\n// objects={{ store, addButtons, renderRow, ... }} // optional\n// isMobile={isMobile}\n// drawerOpen={drawerOpen}\n// onDrawerClose={...}\n// onClose={onClose}\n// isDark={isDark}\n// />\n\nimport React from 'react';\nimport { StampLeftPanelDesktop } from './Desktop';\nimport { StampLeftPanelMobile } from './Mobile';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanel<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n if (props.isMobile) return <StampLeftPanelMobile {...props} />;\n return <StampLeftPanelDesktop {...props} />;\n}\n\nexport type {\n StampLeftPanelProps,\n StampToolDef,\n StampLeftPanelViewProps,\n StampLeftPanelHistoryProps,\n StampLeftPanelChordProps,\n StampLeftPanelObjectsProps,\n StampLeftPanelTabs,\n HoverState,\n} from './types';\nexport { TOOLTIP_DELAY_MS } from './types';\nexport { useToolHoverTooltip } from './useToolHoverTooltip';\n","import * as React from 'react';\nimport type { ToolKey } from '../tools/spec';\n\nconst wrap = (children: React.ReactNode): React.ReactElement => (\n <svg\n width=\"22\"\n height=\"22\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n);\n\nconst dot = (cx: number, cy: number, r = 1.4): React.ReactElement => (\n <circle cx={cx} cy={cy} r={r} fill=\"currentColor\" stroke=\"none\" />\n);\n\nexport const ToolIcons: Record<ToolKey, React.ReactElement> = {\n move: wrap(\n <>\n <path d=\"M5 4 L5 14 L8 11 L10 16 L13 15 L11 10 L15 10 Z\" />\n </>,\n ),\n point: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n pointOnObject: wrap(\n <>\n <path d=\"M3 16 L21 12\" />\n <circle cx=\"12\" cy=\"13.5\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n segment: wrap(\n <>\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"6\" />\n {dot(4, 18, 1.6)}\n {dot(20, 6, 1.6)}\n </>,\n ),\n line: wrap(\n <>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"6\" />\n {dot(8, 14.5, 1.4)}\n {dot(16, 9.5, 1.4)}\n </>,\n ),\n ray: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"7\" />\n <path d=\"M19 7 L15 6 M19 7 L18 11\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n vector: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"18\" y2=\"7\" />\n <path d=\"M18 7 L13 7 M18 7 L18 12\" />\n {dot(5, 18, 1.6)}\n </>,\n ),\n polygon: wrap(\n <>\n <polygon points=\"12,4 20,10 17,19 7,19 4,10\" />\n </>,\n ),\n plane: wrap(\n <>\n <polygon points=\"3,9 14,5 21,11 10,15\" />\n </>,\n ),\n pyramid: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 4 Z\" />\n <path d=\"M4 19 L12 16 L20 19\" />\n <path d=\"M12 4 L12 16\" strokeDasharray=\"2 2\" />\n </>,\n ),\n prism: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n <path d=\"M4 8 L14 8\" />\n </>,\n ),\n tetrahedron: wrap(\n <>\n <path d=\"M4 19 L20 19 L12 5 Z\" />\n <path d=\"M4 19 L15 12 L20 19\" />\n <path d=\"M15 12 L12 5\" />\n </>,\n ),\n cube: wrap(\n <>\n <path d=\"M4 8 L4 19 L14 19 L14 8 Z\" />\n <path d=\"M4 8 L10 4 L20 4 L14 8\" />\n <path d=\"M14 8 L14 19 L20 15 L20 4\" />\n </>,\n ),\n sphere: wrap(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <ellipse cx=\"12\" cy=\"12\" rx=\"8\" ry=\"3\" />\n {dot(12, 12, 1.2)}\n </>,\n ),\n cylinder: wrap(\n <>\n <ellipse cx=\"12\" cy=\"6\" rx=\"6\" ry=\"2\" />\n <path d=\"M6 6 L6 18\" />\n <path d=\"M18 6 L18 18\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"6\" ry=\"2\" />\n </>,\n ),\n cone: wrap(\n <>\n <line x1=\"5\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <line x1=\"19\" y1=\"18\" x2=\"12\" y2=\"4\" />\n <ellipse cx=\"12\" cy=\"18\" rx=\"7\" ry=\"2\" />\n </>,\n ),\n // Trung điểm: đoạn 2 đầu mút + chấm giữa (12,12 = trung điểm (4,18)-(20,6)).\n midpoint: wrap(\n <>\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"6\" />\n {dot(4, 18, 1.4)}\n {dot(20, 6, 1.4)}\n <circle cx=\"12\" cy=\"12\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n // Trọng tâm: tam giác + chấm tâm.\n centroid: wrap(\n <>\n <polygon points=\"12,4 5,18 19,18\" />\n <circle cx=\"12\" cy=\"13.3\" r=\"2\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n // Giao 2 đường: 2 đường chéo cắt nhau + chấm giao.\n intersectionLines: wrap(\n <>\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"17\" />\n <line x1=\"4\" y1=\"17\" x2=\"20\" y2=\"7\" />\n <circle cx=\"12\" cy=\"12\" r=\"2.2\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n // Chân ⊥ xuống đường: điểm P, đường ngang, đoạn ⊥ + ký hiệu góc vuông + chấm chân.\n perpFootLine: wrap(\n <>\n <line x1=\"3\" y1=\"17\" x2=\"21\" y2=\"17\" />\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"17\" />\n <path d=\"M12 14 L15 14 L15 17\" />\n {dot(12, 4, 1.6)}\n <circle cx=\"12\" cy=\"17\" r=\"2\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n // Giao đường ∩ mặt: mặt phẳng (hình bình hành) + đường xuyên qua + chấm giao.\n intersectionLinePlane: wrap(\n <>\n <polygon points=\"3,11 13,7 21,12 11,16\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"20\" />\n <circle cx=\"12\" cy=\"11.5\" r=\"2\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n // Chân ⊥ xuống mặt: điểm P + mặt phẳng + đoạn ⊥ + chấm chân.\n perpFootPlane: wrap(\n <>\n <polygon points=\"3,14 13,10 21,15 11,19\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"14.5\" />\n <path d=\"M12 12 L14 11.4 L14.4 13\" />\n {dot(12, 3, 1.6)}\n <circle cx=\"12\" cy=\"14.5\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\" />\n </>,\n ),\n // Giao tuyến 2 mặt: 2 hình bình hành cắt nhau + đường giao (đậm).\n planePlaneIntersection: wrap(\n <>\n <polygon points=\"3,7 12,4 17,9 8,12\" />\n <polygon points=\"7,12 16,9 21,14 12,17\" />\n <line x1=\"6\" y1=\"13\" x2=\"18\" y2=\"8\" strokeWidth=\"2.4\" />\n </>,\n ),\n // Đường ∥: 2 đường song song + chấm điểm trên đường dưới.\n lineParallelThrough: wrap(\n <>\n <line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"15\" />\n {dot(8, 17, 1.6)}\n </>,\n ),\n // Đường ⊥ mặt: mặt phẳng + đường đứng qua điểm + ký hiệu góc vuông.\n linePerpToPlane: wrap(\n <>\n <polygon points=\"3,15 13,11 21,16 11,20\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"17\" />\n <path d=\"M12 14 L14.4 13.3 L14.8 15\" />\n {dot(12, 8, 1.6)}\n </>,\n ),\n // Mặt ∥: 2 hình bình hành song song + chấm điểm.\n planeParallelThrough: wrap(\n <>\n <polygon points=\"3,8 12,5 18,9 9,12\" />\n <polygon points=\"6,15 15,12 21,16 12,19\" />\n {dot(9, 11, 1.5)}\n </>,\n ),\n // Mặt ⊥ đường: mặt phẳng + đường đứng ⊥ + ký hiệu góc vuông + chấm điểm.\n planePerpToLine: wrap(\n <>\n <polygon points=\"3,13 13,9 21,14 11,18\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"16\" />\n <path d=\"M12 13 L14.5 12.3 L15 14\" />\n {dot(12, 16, 1.5)}\n </>,\n ),\n};\n","import type { ReactNode } from 'react';\nimport { TOOLS, type ToolKey, type ToolSpec } from '../tools/spec';\nimport { ToolIcons } from './icons';\n\nexport type Geom3DGroup =\n | 'basic'\n | 'point'\n | 'line'\n | 'plane'\n | 'polyhedron'\n | 'curve'\n | 'construct';\n\n// 'construct' (Dựng hình) append CUỐI → không xê dịch letter shortcut nhóm cũ (A–F).\nexport const GROUP_ORDER: Geom3DGroup[] = [\n 'basic',\n 'point',\n 'line',\n 'plane',\n 'polyhedron',\n 'curve',\n 'construct',\n];\n\nexport const GROUP_LABELS: Record<Geom3DGroup, string> = {\n basic: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường thẳng',\n plane: 'Mặt phẳng',\n polyhedron: 'Khối đa diện',\n curve: 'Khối cong',\n construct: 'Dựng hình',\n};\n\nexport const TOOLS_BY_GROUP: Record<Geom3DGroup, ToolKey[]> = {\n basic: ['move'],\n point: ['point', 'pointOnObject'],\n line: ['segment', 'line', 'ray', 'vector', 'polygon'],\n plane: ['plane'],\n polyhedron: ['pyramid', 'prism', 'tetrahedron', 'cube'],\n curve: ['sphere', 'cylinder', 'cone'],\n construct: ['midpoint', 'centroid', 'intersectionLines', 'perpFootLine', 'intersectionLinePlane', 'perpFootPlane', 'planePlaneIntersection', 'lineParallelThrough', 'linePerpToPlane', 'planeParallelThrough', 'planePerpToLine'],\n};\n\nexport interface Geom3DToolEntry {\n key: ToolKey;\n label: string;\n hint: string;\n icon: ReactNode;\n group: Geom3DGroup;\n}\n\nconst SPEC_BY_KEY: Record<ToolKey, ToolSpec> = TOOLS.reduce(\n (acc, t) => {\n acc[t.key] = t;\n return acc;\n },\n {} as Record<ToolKey, ToolSpec>,\n);\n\nexport const TOOLS_FLAT: Geom3DToolEntry[] = GROUP_ORDER.flatMap((group) =>\n TOOLS_BY_GROUP[group].map((key) => {\n const spec = SPEC_BY_KEY[key];\n return {\n key,\n label: spec?.label ?? key,\n hint: spec?.hintIdle ?? '',\n icon: ToolIcons[key],\n group,\n };\n }),\n);\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: Geom3DGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseChordShortcutArgs<G extends string> {\n groupOrder: readonly G[];\n tools: ReadonlyArray<{ key: string; group: G }>;\n onSelect: (toolKey: string) => void;\n enabled: boolean;\n}\n\ninterface UseChordShortcutResult<G extends string> {\n chordGroup: G | null;\n cancel: () => void;\n}\n\nconst A_CODE = 'a'.charCodeAt(0);\n\nfunction isFieldFocused(): boolean {\n const ae = (typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null);\n return !!(\n ae &&\n (ae.tagName === 'INPUT' ||\n ae.tagName === 'TEXTAREA' ||\n ae.isContentEditable)\n );\n}\n\nexport function useChordShortcut<G extends string>(\n args: UseChordShortcutArgs<G>,\n): UseChordShortcutResult<G> {\n const { groupOrder, tools, onSelect, enabled } = args;\n\n const [chordGroup, setChordGroup] = useState<G | null>(null);\n\n const groupOrderRef = useRef(groupOrder);\n const toolsRef = useRef(tools);\n const onSelectRef = useRef(onSelect);\n const chordGroupRef = useRef<G | null>(null);\n\n groupOrderRef.current = groupOrder;\n toolsRef.current = tools;\n onSelectRef.current = onSelect;\n // chordGroupRef được sync ngay trong handler (xem `setChord` dưới đây)\n // thay vì ghi từ render body — nếu ghi ở body sẽ bị React batch hoá khi\n // hai event xảy ra trong cùng một act() (event sau đọc giá trị cũ).\n\n const cancel = useCallback(() => {\n chordGroupRef.current = null;\n setChordGroup(null);\n }, []);\n\n useEffect(() => {\n if (!enabled) return;\n\n const setChord = (next: G | null) => {\n chordGroupRef.current = next;\n setChordGroup(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isFieldFocused()) return;\n\n const key = e.key;\n const lower = key.length === 1 ? key.toLowerCase() : key;\n\n if (key === 'Escape') {\n if (chordGroupRef.current !== null) {\n e.preventDefault();\n e.stopPropagation();\n setChord(null);\n }\n return;\n }\n\n if (lower.length === 1 && lower >= 'a' && lower <= 'z') {\n const idx = lower.charCodeAt(0) - A_CODE;\n if (idx < groupOrderRef.current.length) {\n e.preventDefault();\n e.stopPropagation();\n setChord(groupOrderRef.current[idx]);\n }\n return;\n }\n\n if (key >= '1' && key <= '9') {\n const active = chordGroupRef.current;\n if (active === null) return;\n const n = key.charCodeAt(0) - '1'.charCodeAt(0); // 0-indexed\n const toolsInGroup = toolsRef.current.filter(\n (t) => t.group === active,\n );\n e.preventDefault();\n e.stopPropagation();\n if (n < toolsInGroup.length) {\n onSelectRef.current(toolsInGroup[n].key);\n }\n setChord(null);\n return;\n }\n };\n\n window.addEventListener('keydown', onKey, { capture: true });\n return () => {\n window.removeEventListener('keydown', onKey, { capture: true });\n };\n }, [enabled]);\n\n return { chordGroup, cancel };\n}\n","import { createStampFile } from './svgToStampFile';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n \ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData. Mỗi stamp tự define shape (kind, version, jsonState).\n * width/height của element đã được Excalidraw track riêng — không cần lưu\n * trong customData (drop tại Tier D cleanup v0.20).\n */\n makeCustomData: () => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n /**\n * Khi re-edit: GIỮ size hiện tại của element trên canvas (kể cả user đã\n * resize bằng tay) thay vì reset về size SVG mới render. Dùng cho stamp có\n * \"khung cố định\" (geometry 2D/3D, graph) — size do user kiểm soát. KHÔNG\n * dùng cho latex (size phụ thuộc nội dung công thức → cần re-fit theo natural).\n * Mặc định false.\n */\n preserveExistingSize?: boolean;\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n \nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. createStampFile(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await createStampFile(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData();\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n // Re-edit. Với stamp khung-cố-định (preserveExistingSize): GIỮ size hiện\n // tại của element (kể cả user đã resize tay) thay vì reset về size SVG mới.\n // Giữ cạnh dài nhất của element cũ, áp tỉ lệ (aspect) của SVG mới → không\n // méo khi sửa nội dung làm đổi aspect. Element cũ chưa có size hợp lệ →\n // dùng natural.\n const old = opts.preserveExistingSize ? elements.find((e) => e.id === editingId) : undefined;\n const oldLongest = old ? Math.max(old.width ?? 0, old.height ?? 0) : 0;\n const newLongest = Math.max(width, height);\n const scale = oldLongest > 0 && newLongest > 0 ? oldLongest / newLongest : 1;\n const w = width * scale;\n const h = height * scale;\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width: w, height: h } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width: w, height: h, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 768px)';\nconst NO_HOVER_QUERY = '(hover: none)';\n\nexport interface MobileState {\n /** Viewport ≤ 768px — dùng để chuyển full-screen modal + drawer. */\n isMobile: boolean;\n /** Device không có hover (touch-only) — dùng để ẩn hover tooltips. */\n isTouchOnly: boolean;\n}\n\nfunction readMatch(query: string): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n try {\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\n/**\n * SSR-safe mobile detection qua matchMedia. Trả về `{ isMobile, isTouchOnly }`.\n * Re-render khi viewport resize hoặc input modality đổi (e.g., gắn Bluetooth mouse).\n */\nexport function useIsMobile(): MobileState {\n const [state, setState] = useState<MobileState>(() => ({\n isMobile: readMatch(MOBILE_QUERY),\n isTouchOnly: readMatch(NO_HOVER_QUERY),\n }));\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const tql = window.matchMedia(NO_HOVER_QUERY);\n const update = () => {\n setState({ isMobile: mql.matches, isTouchOnly: tql.matches });\n };\n update();\n mql.addEventListener('change', update);\n tql.addEventListener('change', update);\n return () => {\n mql.removeEventListener('change', update);\n tql.removeEventListener('change', update);\n };\n }, []);\n\n return state;\n}\n","// Hook tạo + giữ scene store tại Host level cho mọi stamp interactive\n// (geometry-2d, geometry-3d, graph-2d).\n//\n// Trước đây mỗi stamp dùng pattern riêng:\n// - 3D: useRef + createStore(createEmptyState('3d')) inline tại host.\n// - 2D + graph-2d: useState<Store|null> + callback `onStoreReady` từ editor.\n//\n// Hook này hợp nhất về 1 mental model: store sống ở host, identity stable,\n// pre-load từ customData ngay frame đầu → bỏ ternary `store ? ... : undefined`\n// + bỏ flash 1 frame trên 2D + graph-2d.\n//\n// Roundtrip edit: caller tự chịu trách nhiệm đọc `editingElement.customData`\n// và trả về State (hoặc null) qua thunk `makeInitialState`.\n\nimport { useRef } from 'react';\nimport { createStore, createEmptyState, type Store } from '../../core/scene';\nimport type { State } from '../../core/scene/types';\n\nexport type StampDomain = '2d' | '3d' | 'graph2d';\n\n/**\n * Tạo + giữ scene store tại Host level. `makeInitialState` là THUNK LƯỜI:\n * chỉ gọi đúng một lần ở render đầu, nên caller thoải mái đặt\n * `deserializeBoard(...)` bên trong mà không sợ parse lại mỗi render.\n */\nexport function useStampStore(\n domain: StampDomain,\n makeInitialState?: () => State | null,\n): Store {\n const ref = useRef<Store | null>(null);\n if (!ref.current) {\n ref.current = createStore(makeInitialState?.() ?? createEmptyState(domain));\n }\n return ref.current;\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { EditorPanel, type EditorPanelHandle } from './editor/EditorPanel';\nimport { StampLeftPanel } from '../shared/StampLeftPanel';\nimport type { State } from '../../core/scene';\nimport {\n GROUP_ORDER,\n GROUP_LABELS,\n TOOLS_FLAT,\n letterForGroup,\n type Geom3DGroup,\n} from './editor/toolPanel/groups';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { useStampStore } from '../shared/useStampStore';\nimport {\n deserializeBoard3D,\n isGeometry3DCustomData,\n type Geometry3DCustomData,\n} from './serialize';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport type { ToolKey } from './editor/tools/spec';\n\nconst Geom3DIconHeader = (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nfunction parseInitialState(data: unknown): State | null {\n if (!isGeometry3DCustomData(data)) return null;\n return deserializeBoard3D(data.jsonState);\n}\n\nexport const Geometry3DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Geometry3DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const editorRef = useRef<EditorPanelHandle | null>(null);\n const sceneStore = useStampStore('3d', () =>\n editingElement?.customData ? parseInitialState(editingElement.customData) : null,\n );\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const [selectedTool, setSelectedTool] = useState<ToolKey>('move');\n const [showAxis, setShowAxis] = useState<boolean>(true);\n const [showGrid, setShowGrid] = useState<boolean>(true);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n const [selectedObjectId, setSelectedObjectId] = useState<string | undefined>(undefined);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n const handleObjectSelect = useCallback((id: string | null) => {\n setSelectedObjectId(id ?? undefined);\n editorRef.current?.highlight(id);\n }, []);\n\n const handleUndo = useCallback(() => editorRef.current?.undo(), []);\n const handleRedo = useCallback(() => editorRef.current?.redo(), []);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS_FLAT,\n onSelect: (key) => {\n setSelectedTool(key as ToolKey);\n editorRef.current?.setTool(key as ToolKey);\n },\n enabled: !isMobile,\n });\n\n const handleSelectTool = useCallback((k: ToolKey) => {\n setSelectedTool(k);\n editorRef.current?.setTool(k);\n }, []);\n\n const handleEditorInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Geometry3DCustomData => ({\n kind: 'geometry3d',\n version: 2,\n jsonState,\n }),\n editingElementId: editingElement?.id ?? null,\n preserveExistingSize: true,\n });\n onClose();\n },\n [api, editingElement, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <StampLeftPanel<ToolKey, Geom3DGroup>\n title=\"Hình học 3D\"\n icon={Geom3DIconHeader}\n onClose={onClose}\n isDark={isDark}\n testId=\"stamp-left-panel\"\n tools={TOOLS_FLAT}\n groupOrder={GROUP_ORDER}\n groupLabels={GROUP_LABELS}\n activeTool={selectedTool}\n onToolChange={handleSelectTool}\n view={{\n sectionLabel: 'Góc nhìn',\n showAxis,\n showGrid,\n onShowAxisChange: setShowAxis,\n onShowGridChange: setShowGrid,\n }}\n history={{\n onUndo: handleUndo,\n canUndo,\n onRedo: handleRedo,\n canRedo,\n }}\n chord={{ activeGroup: chordGroup, letterForGroup }}\n objects={{\n store: sceneStore,\n selectedObjectId,\n onObjectSelect: handleObjectSelect,\n }}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <EditorPanel\n ref={editorRef}\n isDark={isDark}\n onInsert={handleEditorInsert}\n onClose={onClose}\n store={sceneStore}\n selectedTool={selectedTool}\n onSelectedToolChange={setSelectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onHistoryChange={handleHistoryChange}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n withLeftPanel={!isMobile}\n />\n </>\n );\n },\n);\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport {\n isGeometry3DCustomData,\n type Geometry3DCustomData,\n} from './serialize';\nimport { renderGeometry3DSvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport { svgToStampFile } from '../shared/svgToStampFile';\n\nexport type { Geometry3DCustomData };\n\nconst Geometry3DStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.Geometry3DStampHost })),\n);\n\nconst Geometry3DIcon: ReactNode = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {/* Mặt trước */}\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n {/* Mặt trên */}\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n {/* Mặt phải */}\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nexport const geometry3dStamp: StampType<Geometry3DCustomData> = {\n kind: 'geometry3d',\n experimental: true,\n shortcutKey: 'd',\n toolbarLabel: 'D',\n toolbarTitle: 'Hình 3D (D)',\n toolbarIcon: Geometry3DIcon,\n toolbarTestId: 'stamp-toolbar-geometry3d',\n matchesCustomData: isGeometry3DCustomData,\n async renderSvgFromCustomData(data: unknown): Promise<string> {\n if (!isGeometry3DCustomData(data)) {\n throw new Error('geometry3dStamp.renderSvgFromCustomData: customData không phải geometry3d');\n }\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgString;\n },\n restoreFileFromCustomData: async (element): Promise<RestoredStampFile | null> => {\n const data = element.customData as Geometry3DCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId || !isGeometry3DCustomData(data)) return null;\n try {\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgToStampFile(svgString, fileId);\n } catch {\n return null;\n }\n },\n Host: Geometry3DStampHost,\n};\n"]}
|