@xom11/whiteboard 0.30.0 → 0.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai.d.mts +226 -32
- package/dist/ai.d.ts +226 -32
- package/dist/ai.js +5126 -351
- package/dist/ai.js.map +1 -1
- package/dist/ai.mjs +4970 -352
- package/dist/ai.mjs.map +1 -1
- package/dist/catalog.json +5 -5
- package/dist/{chunk-V3YJ6JFL.mjs → chunk-44JY2AKC.mjs} +3 -3
- package/dist/{chunk-V3YJ6JFL.mjs.map → chunk-44JY2AKC.mjs.map} +1 -1
- package/dist/{chunk-XVVLT6B3.mjs → chunk-BMYC2ILT.mjs} +4 -4
- package/dist/{chunk-XVVLT6B3.mjs.map → chunk-BMYC2ILT.mjs.map} +1 -1
- package/dist/{chunk-PPKHCRRE.mjs → chunk-C76SOFXF.mjs} +3 -3
- package/dist/{chunk-PPKHCRRE.mjs.map → chunk-C76SOFXF.mjs.map} +1 -1
- package/dist/{chunk-IHUFOV7L.mjs → chunk-CH6SFONH.mjs} +15 -3
- package/dist/chunk-CH6SFONH.mjs.map +1 -0
- package/dist/{chunk-SF3U7ZF4.mjs → chunk-DWIEVCGK.mjs} +180 -15
- package/dist/chunk-DWIEVCGK.mjs.map +1 -0
- package/dist/{chunk-SZDAS7LK.mjs → chunk-IE2GGHNF.mjs} +131 -81
- package/dist/chunk-IE2GGHNF.mjs.map +1 -0
- package/dist/{chunk-ZTQBUKLJ.mjs → chunk-JJ4FPCBE.mjs} +142 -22
- package/dist/chunk-JJ4FPCBE.mjs.map +1 -0
- package/dist/{chunk-QRUAEXLR.mjs → chunk-K5BS2H56.mjs} +5 -5
- package/dist/{chunk-QRUAEXLR.mjs.map → chunk-K5BS2H56.mjs.map} +1 -1
- package/dist/{chunk-BNBOIDO5.mjs → chunk-K7VJU7LQ.mjs} +3 -3
- package/dist/{chunk-BNBOIDO5.mjs.map → chunk-K7VJU7LQ.mjs.map} +1 -1
- package/dist/{chunk-H22OZYTW.mjs → chunk-KOXOC2FI.mjs} +48 -39
- package/dist/chunk-KOXOC2FI.mjs.map +1 -0
- package/dist/{chunk-CXHNVYMD.mjs → chunk-KWDBVLST.mjs} +5 -5
- package/dist/{chunk-CXHNVYMD.mjs.map → chunk-KWDBVLST.mjs.map} +1 -1
- package/dist/{chunk-OQIQNKPQ.mjs → chunk-LTLLQUMN.mjs} +4 -4
- package/dist/{chunk-OQIQNKPQ.mjs.map → chunk-LTLLQUMN.mjs.map} +1 -1
- package/dist/{chunk-QGNU34T7.mjs → chunk-QLQ4MJNO.mjs} +10 -4
- package/dist/chunk-QLQ4MJNO.mjs.map +1 -0
- package/dist/{chunk-BU5KLO3P.mjs → chunk-T3N4BSJV.mjs} +4 -4
- package/dist/{chunk-BU5KLO3P.mjs.map → chunk-T3N4BSJV.mjs.map} +1 -1
- package/dist/{chunk-5JM35CXV.mjs → chunk-TMRFSOM7.mjs} +4 -4
- package/dist/{chunk-5JM35CXV.mjs.map → chunk-TMRFSOM7.mjs.map} +1 -1
- package/dist/geometry-2d.d.mts +1 -1
- package/dist/geometry-2d.d.ts +1 -1
- package/dist/geometry-2d.js +449 -172
- package/dist/geometry-2d.js.map +1 -1
- package/dist/geometry-2d.mjs +5 -5
- package/dist/geometry-3d.d.mts +1 -1
- package/dist/geometry-3d.d.ts +1 -1
- package/dist/geometry-3d.js +172 -22
- package/dist/geometry-3d.js.map +1 -1
- package/dist/geometry-3d.mjs +4 -4
- package/dist/graph-2d.d.mts +1 -1
- package/dist/graph-2d.d.ts +1 -1
- package/dist/graph-2d.js +307 -100
- package/dist/graph-2d.js.map +1 -1
- package/dist/graph-2d.mjs +7 -7
- package/dist/{host-HOSJHQ5H.mjs → host-4FIUNIDQ.mjs} +13 -12
- package/dist/host-4FIUNIDQ.mjs.map +1 -0
- package/dist/{host-2ISGVO7O.mjs → host-4ZB4XD4S.mjs} +9 -8
- package/dist/host-4ZB4XD4S.mjs.map +1 -0
- package/dist/{host-ZQCDAT6O.mjs → host-H2IGOKJU.mjs} +3 -3
- package/dist/{host-ZQCDAT6O.mjs.map → host-H2IGOKJU.mjs.map} +1 -1
- package/dist/{host-3UFGFMJ2.mjs → host-KMWP7KBT.mjs} +90 -43
- package/dist/host-KMWP7KBT.mjs.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +453 -174
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -21
- package/dist/latex.d.mts +1 -1
- package/dist/latex.d.ts +1 -1
- package/dist/latex.js +8 -2
- package/dist/latex.js.map +1 -1
- package/dist/latex.mjs +1 -1
- package/dist/render-NMS7OAV6.mjs +10 -0
- package/dist/{render-ZX2O2IK7.mjs.map → render-NMS7OAV6.mjs.map} +1 -1
- package/dist/serialize-PGHQZEPV.mjs +9 -0
- package/dist/{serialize-N4G6RFBB.mjs.map → serialize-PGHQZEPV.mjs.map} +1 -1
- package/dist/{types-C3FjpoUi.d.ts → types-tePd94vW.d.mts} +8 -0
- package/dist/{types-C3FjpoUi.d.mts → types-tePd94vW.d.ts} +8 -0
- package/package.json +1 -1
- package/dist/chunk-H22OZYTW.mjs.map +0 -1
- package/dist/chunk-IHUFOV7L.mjs.map +0 -1
- package/dist/chunk-QGNU34T7.mjs.map +0 -1
- package/dist/chunk-SF3U7ZF4.mjs.map +0 -1
- package/dist/chunk-SZDAS7LK.mjs.map +0 -1
- package/dist/chunk-ZTQBUKLJ.mjs.map +0 -1
- package/dist/host-2ISGVO7O.mjs.map +0 -1
- package/dist/host-3UFGFMJ2.mjs.map +0 -1
- package/dist/host-HOSJHQ5H.mjs.map +0 -1
- package/dist/render-ZX2O2IK7.mjs +0 -10
- package/dist/serialize-N4G6RFBB.mjs +0 -9
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/scene/reducer.ts","../src/core/scene/store.ts","../src/core/scene/expressions/parser.ts"],"names":[],"mappings":"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","file":"chunk-IHUFOV7L.mjs","sourcesContent":["// 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/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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stamps/shared/insertImage.ts"],"names":[],"mappings":"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","file":"chunk-QGNU34T7.mjs","sourcesContent":["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\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 const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width, height, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stamps/geometry-2d/ai/vision/preprocess.ts","../src/stamps/geometry-2d/dsl/names.ts","../src/stamps/geometry-2d/dsl/kinds/_types.ts","../src/stamps/geometry-2d/dsl/kinds/_shared.ts","../src/stamps/geometry-2d/dsl/kinds/points/free.ts","../src/stamps/geometry-2d/dsl/kinds/points/midpoint.ts","../src/stamps/geometry-2d/dsl/kinds/points/onSegment.ts","../src/stamps/geometry-2d/dsl/kinds/points/onLine.ts","../src/stamps/geometry-2d/dsl/kinds/points/onCircle.ts","../src/stamps/geometry-2d/dsl/kinds/points/perpFoot.ts","../src/stamps/geometry-2d/dsl/kinds/points/circumcenter.ts","../src/stamps/geometry-2d/dsl/kinds/points/incenter.ts","../src/stamps/geometry-2d/dsl/kinds/points/centroid.ts","../src/stamps/geometry-2d/dsl/kinds/points/orthocenter.ts","../src/stamps/geometry-2d/dsl/kinds/points/intersection.ts","../src/stamps/geometry-2d/dsl/kinds/lines/segment.ts","../src/stamps/geometry-2d/dsl/kinds/lines/line.ts","../src/stamps/geometry-2d/dsl/kinds/lines/ray.ts","../src/stamps/geometry-2d/dsl/kinds/lines/perpendicular.ts","../src/stamps/geometry-2d/dsl/kinds/lines/parallel.ts","../src/stamps/geometry-2d/dsl/kinds/lines/perpBisector.ts","../src/stamps/geometry-2d/dsl/kinds/lines/angleBisector.ts","../src/stamps/geometry-2d/dsl/kinds/lines/lineThrough.ts","../src/stamps/geometry-2d/dsl/kinds/lines/radicalAxis.ts","../src/stamps/geometry-2d/dsl/kinds/lines/tangent.ts","../src/stamps/geometry-2d/dsl/kinds/polygons/polygon.ts","../src/stamps/geometry-2d/dsl/kinds/circles/circleCP.ts","../src/stamps/geometry-2d/dsl/kinds/circles/circle3.ts","../src/stamps/geometry-2d/dsl/kinds/circles/circleDiameter.ts","../src/stamps/geometry-2d/dsl/kinds/points/secondIntersection.ts","../src/stamps/geometry-2d/dsl/kinds/points/circleIntersection.ts","../src/stamps/geometry-2d/dsl/kinds/points/circleSecondIntersection.ts","../src/stamps/geometry-2d/dsl/kinds/points/tangencyPoint.ts","../src/stamps/geometry-2d/dsl/kinds/points/tangentPointExt.ts","../src/stamps/geometry-2d/dsl/kinds/circles/circleCR.ts","../src/stamps/geometry-2d/dsl/kinds/circles/incircle.ts","../src/stamps/geometry-2d/dsl/kinds/circles/excircle.ts","../src/stamps/geometry-2d/dsl/kinds/points/arcMidpoint.ts","../src/stamps/geometry-2d/dsl/kinds/points/excenter.ts","../src/stamps/geometry-2d/dsl/kinds/points/reflectPoint.ts","../src/stamps/geometry-2d/dsl/kinds/points/reflectLine.ts","../src/stamps/geometry-2d/dsl/kinds/points/pointAtDistance.ts","../src/stamps/geometry-2d/dsl/registry.ts","../src/stamps/geometry-2d/dsl/serialize.ts","../src/stamps/geometry-2d/dsl/describeDsl.ts"],"names":["z","refs"],"mappings":"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","file":"chunk-SF3U7ZF4.mjs","sourcesContent":["// src/stamps/geometry-2d/ai/vision/preprocess.ts\n//\n// Pure-ish browser utilities cho image: validate, infer media type, downscale,\n// encode base64. fileToImagePart() là entry point chính cho UI.\n\nimport type { ImagePart } from './types';\n\nexport const MAX_EDGE_PX = 2048;\nexport const MAX_RAW_BYTES = 10 * 1024 * 1024; // 10 MB\nexport const MAX_ENCODED_BYTES = 3 * 1024 * 1024; // 3 MB blob threshold; base64 inflate ~33% → ~4 MB string\n\nconst ALLOWED_TYPES = ['image/png', 'image/jpeg', 'image/webp'] as const;\ntype AllowedType = (typeof ALLOWED_TYPES)[number];\n\nexport type ValidationResult =\n | { ok: true; mediaType: AllowedType }\n | { ok: false; code: 'invalid-format' | 'too-large'; message: string };\n\nexport function inferMediaType(file: File): AllowedType | null {\n const t = file.type.toLowerCase();\n if ((ALLOWED_TYPES as readonly string[]).includes(t)) return t as AllowedType;\n return null;\n}\n\nexport function validateFile(file: File): ValidationResult {\n const mt = inferMediaType(file);\n if (mt == null) {\n return {\n ok: false,\n code: 'invalid-format',\n message: 'Chỉ hỗ trợ PNG, JPEG, WEBP.',\n };\n }\n if (file.size > MAX_RAW_BYTES) {\n return {\n ok: false,\n code: 'too-large',\n message: `Ảnh quá lớn (> ${Math.round(MAX_RAW_BYTES / 1024 / 1024)} MB). Crop hoặc resize trước.`,\n };\n }\n return { ok: true, mediaType: mt };\n}\n\n/**\n * Convert File → ImagePart. Auto-downscale nếu max edge > MAX_EDGE_PX.\n * Throws nếu file invalid hoặc decode fail.\n */\nexport async function fileToImagePart(file: File): Promise<ImagePart> {\n const v = validateFile(file);\n if (!v.ok) throw new Error(v.message);\n\n // Decode + có thể downscale qua canvas.\n const bitmap = await createImageBitmap(file);\n const { width, height } = bitmap;\n const maxEdge = Math.max(width, height);\n const scale = maxEdge > MAX_EDGE_PX ? MAX_EDGE_PX / maxEdge : 1;\n const targetW = Math.round(width * scale);\n const targetH = Math.round(height * scale);\n\n const canvas =\n typeof OffscreenCanvas !== 'undefined'\n ? new OffscreenCanvas(targetW, targetH)\n : Object.assign(document.createElement('canvas'), { width: targetW, height: targetH });\n const ctx = canvas.getContext('2d') as\n | CanvasRenderingContext2D\n | OffscreenCanvasRenderingContext2D\n | null;\n if (!ctx) throw new Error('Không tạo được canvas 2D context');\n ctx.drawImage(bitmap, 0, 0, targetW, targetH);\n bitmap.close();\n\n // Encode: PNG nếu input PNG, JPEG cho jpeg/webp.\n let outputType: AllowedType =\n v.mediaType === 'image/png' ? 'image/png' : 'image/jpeg';\n let finalBlob = await canvasToBlob(canvas, outputType, 0.92);\n\n // Nếu vẫn quá cap encoded → fallback JPEG quality 0.7 (kể cả PNG → JPEG,\n // vì OCR không cần alpha và JPEG nén tốt hơn nhiều).\n if (finalBlob.size > MAX_ENCODED_BYTES) {\n outputType = 'image/jpeg';\n finalBlob = await canvasToBlob(canvas, 'image/jpeg', 0.7);\n }\n\n const base64 = await blobToBase64(finalBlob);\n return { mediaType: outputType, base64 };\n}\n\nasync function canvasToBlob(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n type: AllowedType,\n quality: number,\n): Promise<Blob> {\n if ('convertToBlob' in canvas) {\n return canvas.convertToBlob({ type, quality });\n }\n return new Promise((resolve, reject) => {\n (canvas as HTMLCanvasElement).toBlob(\n (b) => (b ? resolve(b) : reject(new Error('Canvas encode fail'))),\n type,\n quality,\n );\n });\n}\n\nasync function blobToBase64(blob: Blob): Promise<string> {\n const buf = await blob.arrayBuffer();\n // btoa cần string → dùng chunked conversion cho Uint8Array.\n let binary = '';\n const bytes = new Uint8Array(buf);\n const chunk = 0x8000;\n for (let i = 0; i < bytes.length; i += chunk) {\n binary += String.fromCharCode(...bytes.subarray(i, i + chunk));\n }\n return typeof btoa === 'function' ? btoa(binary) : Buffer.from(binary, 'binary').toString('base64');\n}\n","// src/stamps/geometry-2d/dsl/names.ts\nimport { z } from 'zod';\n\n// Label-style name: chữ cái Latin đầu, cho phép unicode prime (') + subscript ₀-₉.\n// Max length 12 ký tự. Phân biệt hoa/thường.\nexport const NameZ = z\n .string()\n .regex(/^[A-Za-z][A-Za-z0-9_'₀-₉]{0,11}$/);\n","// src/stamps/geometry-2d/dsl/kinds/_types.ts\nimport type { z } from 'zod';\nimport type { SceneObject } from '../../../../core/scene/types';\n\nexport type KindRole =\n | 'point'\n | 'segment'\n | 'line'\n | 'ray'\n | 'lineConstruction'\n | 'circle'\n | 'polygon';\n\nexport type KindCategory = 'points' | 'lines' | 'polygons' | 'circles' | 'compound';\n\n/** Vai trò ref mà một field của kind yêu cầu — dùng cho validateRefs registry-driven. */\nexport type RefRole =\n | 'point'\n | 'line-like'\n | 'circle'\n | 'segment'\n | 'shape'\n | 'any-existing';\n\nexport interface RefSpec {\n /** Tên field trên entity chứa ref (vd 'from', 'circle', 'vertices'). */\n field: string;\n role: RefRole;\n /** field là mảng tên (vd vertices[]). */\n many?: boolean;\n}\n\nexport interface EmitContext {\n /** Look up the scene-object id assigned to a DSL symbol name. */\n resolveId(name: string): string;\n /** Hint lookup for intersection-style emit needing to know what a referenced symbol is. */\n hintOf(name: string): KindRole;\n /** Generate a unique auxiliary id for an internal entity (not addressable from DSL). */\n mintAuxId(parentName: string, suffix: string): string;\n}\n\nexport interface EmittedEntity {\n /** The first emitted entity per kind MUST have role 'primary'. */\n role: 'primary' | 'auxiliary';\n object: SceneObject;\n}\n\nexport interface DslKindModule<TKind extends string = string, TInput = unknown> {\n kind: TKind;\n role: KindRole;\n category: KindCategory;\n prefix: string;\n schema: z.ZodObject<any>;\n collectRefs: (entity: TInput) => string[];\n /**\n * Khai báo ref requirements để validateRefs kiểm tra unknown/mismatch mà không\n * cần switch theo kind. Dạng hàm cho kind có ref phụ thuộc discriminated union\n * (vd pointAtDistance.distance). Kind chưa khai → validateRefs dùng legacy switch.\n */\n refSpecs?: readonly RefSpec[] | ((entity: TInput) => readonly RefSpec[]);\n emit: (entity: TInput, ctx: EmitContext) => EmittedEntity[];\n}\n\n/**\n * Factory that widens a typed module into the registry's generic shape.\n * Each kind module exports its module via this factory so `ALL_MODULES`\n * in registry.ts can be typed as ReadonlyArray<DslKindModule> without a cast.\n */\nexport function defineModule<TKind extends string, TInput>(\n m: DslKindModule<TKind, TInput>,\n): DslKindModule {\n return m as DslKindModule;\n}\n","// src/stamps/geometry-2d/dsl/kinds/_shared.ts\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { EmitContext } from './_types';\n\nexport const POINT_BASE_FIELDS = {\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n} as const;\n\n/** Wrap a Constraint2D-style attrs into a primary 'point' SceneObject. */\nexport function emitPointObject(\n id: string,\n name: string,\n constraint: Record<string, unknown>,\n visible = true,\n): SceneObject {\n return {\n id,\n kind: 'point',\n label: name,\n ...POINT_BASE_FIELDS,\n visible,\n attrs: { constraint },\n };\n}\n\n/** Resolve a triangle's 3 vertex ids. */\nexport function resolveTriangleVertices(\n ctx: EmitContext,\n vertices: readonly [string, string, string],\n): [string, string, string] {\n return [ctx.resolveId(vertices[0]), ctx.resolveId(vertices[1]), ctx.resolveId(vertices[2])];\n}\n\nexport const SHAPE_BASE_FIELDS = {\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n} as const;\n","// src/stamps/geometry-2d/dsl/kinds/points/free.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'free' }>;\n\nexport const freeModule = defineModule<'free', Input>({\n kind: 'free',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('free'),\n x: z.number().finite(),\n y: z.number().finite(),\n }),\n collectRefs: () => [],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(ctx.resolveId(e.name), e.name, { kind: 'free', x: e.x, y: e.y }),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/midpoint.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'midpoint' }>;\n\nexport const midpointModule = defineModule<'midpoint', Input>({\n kind: 'midpoint',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('midpoint'),\n p1: NameZ,\n p2: NameZ,\n visible: z.boolean().optional(),\n }),\n collectRefs: (e) => [e.p1, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'midpoint', p1: ctx.resolveId(e.p1), p2: ctx.resolveId(e.p2) },\n e.visible ?? true,\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/onSegment.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'onSegment' }>;\n\nexport const onSegmentModule = defineModule<'onSegment', Input>({\n kind: 'onSegment',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('onSegment'),\n segmentId: NameZ,\n t: z.number().min(0).max(1),\n }),\n collectRefs: (e) => [e.segmentId],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'onSegment', segmentId: ctx.resolveId(e.segmentId), t: e.t },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/onLine.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'onLine' }>;\n\nexport const onLineModule = defineModule<'onLine', Input>({\n kind: 'onLine',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('onLine'),\n lineId: NameZ,\n t: z.number().finite(),\n }),\n collectRefs: (e) => [e.lineId],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'onLine', lineId: ctx.resolveId(e.lineId), t: e.t },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/onCircle.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'onCircle' }>;\n\nexport const onCircleModule = defineModule<'onCircle', Input>({\n kind: 'onCircle',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('onCircle'),\n circleId: NameZ,\n theta: z.number().finite(),\n }),\n collectRefs: (e) => [e.circleId],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'onCircle', circleId: ctx.resolveId(e.circleId), theta: e.theta },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/perpFoot.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'perpFoot' }>;\n\nexport const perpFootModule = defineModule<'perpFoot', Input>({\n kind: 'perpFoot',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('perpFoot'),\n from: NameZ,\n onLine: NameZ,\n }),\n collectRefs: (e) => [e.from, e.onLine],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'perpFoot', from: ctx.resolveId(e.from), onLine: ctx.resolveId(e.onLine) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/circumcenter.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject, resolveTriangleVertices } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'circumcenter' }>;\n\nexport const circumcenterModule = defineModule<'circumcenter', Input>({\n kind: 'circumcenter',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circumcenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'circumcenter', vertices: resolveTriangleVertices(ctx, e.vertices) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/incenter.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject, resolveTriangleVertices } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'incenter' }>;\n\nexport const incenterModule = defineModule<'incenter', Input>({\n kind: 'incenter',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('incenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'incenter', vertices: resolveTriangleVertices(ctx, e.vertices) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/centroid.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject, resolveTriangleVertices } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'centroid' }>;\n\nexport const centroidModule = defineModule<'centroid', Input>({\n kind: 'centroid',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('centroid'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'centroid', vertices: resolveTriangleVertices(ctx, e.vertices) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/orthocenter.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject, resolveTriangleVertices } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'orthocenter' }>;\n\nexport const orthocenterModule = defineModule<'orthocenter', Input>({\n kind: 'orthocenter',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('orthocenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n { kind: 'orthocenter', vertices: resolveTriangleVertices(ctx, e.vertices) },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/intersection.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { POINT_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'intersection' }>;\n\nexport const intersectionModule = defineModule<'intersection', Input>({\n kind: 'intersection',\n role: 'point',\n category: 'points',\n prefix: 'i',\n schema: z.object({\n name: NameZ,\n kind: z.literal('intersection'),\n ref1: NameZ,\n ref2: NameZ,\n branch: z.union([z.literal(0), z.literal(1)]).optional(),\n }),\n collectRefs: (e) => [e.ref1, e.ref2],\n emit: (e, ctx) => {\n const r1IsCircle = ctx.hintOf(e.ref1) === 'circle';\n const r2IsCircle = ctx.hintOf(e.ref2) === 'circle';\n let intersectKind: 'lineLine' | 'lineCircle' | 'circleCircle';\n if (r1IsCircle && r2IsCircle) intersectKind = 'circleCircle';\n else if (r1IsCircle || r2IsCircle) intersectKind = 'lineCircle';\n else intersectKind = 'lineLine';\n\n const attrs: Record<string, unknown> = {\n kind: intersectKind,\n ref1: ctx.resolveId(e.ref1),\n ref2: ctx.resolveId(e.ref2),\n };\n if (intersectKind !== 'lineLine') {\n attrs.branch = e.branch ?? 0;\n }\n return [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'intersection',\n label: e.name,\n ...POINT_BASE_FIELDS,\n attrs,\n },\n }];\n },\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/segment.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'segment' }>;\n\nexport const segmentModule = defineModule<'segment', Input>({\n kind: 'segment',\n role: 'segment',\n category: 'lines',\n prefix: 's',\n schema: z.object({\n name: NameZ,\n kind: z.literal('segment'),\n p1: NameZ,\n p2: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'segment',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { p1: ctx.resolveId(e.p1), p2: ctx.resolveId(e.p2) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/line.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'line' }>;\n\nexport const lineModule = defineModule<'line', Input>({\n kind: 'line',\n role: 'line',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('line'),\n p1: NameZ,\n p2: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { p1: ctx.resolveId(e.p1), p2: ctx.resolveId(e.p2) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/ray.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'ray' }>;\n\nexport const rayModule = defineModule<'ray', Input>({\n kind: 'ray',\n role: 'ray',\n category: 'lines',\n prefix: 'r',\n schema: z.object({\n name: NameZ,\n kind: z.literal('ray'),\n origin: NameZ,\n through: NameZ,\n }),\n collectRefs: (e) => [e.origin, e.through],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'ray',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { origin: ctx.resolveId(e.origin), through: ctx.resolveId(e.through) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/perpendicular.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'perpendicular' }>;\n\nexport const perpendicularModule = defineModule<'perpendicular', Input>({\n kind: 'perpendicular',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('perpendicular'),\n throughPoint: NameZ,\n toLine: NameZ,\n }),\n collectRefs: (e) => [e.throughPoint, e.toLine],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'perpendicular',\n throughPoint: ctx.resolveId(e.throughPoint),\n toLine: ctx.resolveId(e.toLine),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/parallel.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'parallel' }>;\n\nexport const parallelModule = defineModule<'parallel', Input>({\n kind: 'parallel',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('parallel'),\n throughPoint: NameZ,\n toLine: NameZ,\n }),\n collectRefs: (e) => [e.throughPoint, e.toLine],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'parallel',\n throughPoint: ctx.resolveId(e.throughPoint),\n toLine: ctx.resolveId(e.toLine),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/perpBisector.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'perpBisector' }>;\n\nexport const perpBisectorModule = defineModule<'perpBisector', Input>({\n kind: 'perpBisector',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('perpBisector'),\n p1: NameZ,\n p2: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'perpBisector',\n p1: ctx.resolveId(e.p1),\n p2: ctx.resolveId(e.p2),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/angleBisector.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'angleBisector' }>;\n\nexport const angleBisectorModule = defineModule<'angleBisector', Input>({\n kind: 'angleBisector',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('angleBisector'),\n p1: NameZ,\n vertex: NameZ,\n p2: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.vertex, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'angleBisector',\n p1: ctx.resolveId(e.p1),\n vertex: ctx.resolveId(e.vertex),\n p2: ctx.resolveId(e.p2),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/lineThrough.ts\n//\n// Đường thẳng qua ≥2 điểm đồng tuyến (vd 3 tâm Euler G/H/O). Render là đường\n// VÔ HẠN qua 2 điểm xa nhau nhất (ổn định số học). Kind tổng quát role\n// 'lineConstruction' — tái dùng cho Euler line (issue #47) và sau này Simson.\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport type { RefSpec } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'lineThrough' }>;\n\nexport const lineThroughModule = defineModule<'lineThrough', Input>({\n kind: 'lineThrough',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('lineThrough'),\n points: z.array(NameZ).min(2),\n }),\n collectRefs: (e) => [...e.points],\n refSpecs: [{ field: 'points', role: 'point', many: true }] as readonly RefSpec[],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'lineThrough',\n points: e.points.map((p) => ctx.resolveId(p)),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/radicalAxis.ts\n//\n// Trục đẳng phương 2 đường tròn (issue #47, construct 2): đường ⊥ đường nối tâm\n// O₁O₂, mọi điểm trên nó có lũy thừa (power) bằng nhau với 2 đường tròn. Kind\n// role 'lineConstruction' nhưng tham chiếu 2 CIRCLE (không phải điểm) — mirror\n// `lineThrough` về cấu trúc, khác ở refSpecs role 'circle'.\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport type { RefSpec } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'radicalAxis' }>;\n\nexport const radicalAxisModule = defineModule<'radicalAxis', Input>({\n kind: 'radicalAxis',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('radicalAxis'),\n circle1: NameZ,\n circle2: NameZ,\n }),\n collectRefs: (e) => [e.circle1, e.circle2],\n refSpecs: [\n { field: 'circle1', role: 'circle' },\n { field: 'circle2', role: 'circle' },\n ] as readonly RefSpec[],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'radicalAxis',\n circle1: ctx.resolveId(e.circle1),\n circle2: ctx.resolveId(e.circle2),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/lines/tangent.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'tangent' }>;\n\nexport const tangentModule = defineModule<'tangent', Input>({\n kind: 'tangent',\n role: 'lineConstruction',\n category: 'lines',\n prefix: 'l',\n schema: z.object({\n name: NameZ,\n kind: z.literal('tangent'),\n throughPoint: NameZ,\n toCircle: NameZ,\n branch: z.union([z.literal(0), z.literal(1), z.literal('on')]).optional(),\n }),\n collectRefs: (e) => [e.throughPoint, e.toCircle],\n emit: (e, ctx) => {\n const construction: Record<string, unknown> = {\n kind: 'tangent',\n throughPoint: ctx.resolveId(e.throughPoint),\n toCircle: ctx.resolveId(e.toCircle),\n };\n if (e.branch !== undefined) construction.branch = e.branch;\n return [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'line',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { construction },\n },\n }];\n },\n});\n","// src/stamps/geometry-2d/dsl/kinds/polygons/polygon.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'polygon' }>;\n\nexport const polygonModule = defineModule<'polygon', Input>({\n kind: 'polygon',\n role: 'polygon',\n category: 'polygons',\n prefix: 'poly',\n schema: z.object({\n name: NameZ,\n kind: z.literal('polygon'),\n vertices: z.array(NameZ).min(3),\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'polygon',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { vertices: e.vertices.map((v) => ctx.resolveId(v)) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/circles/circleCP.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'circleCP' }>;\n\nexport const circleCPModule = defineModule<'circleCP', Input>({\n kind: 'circleCP',\n role: 'circle',\n category: 'circles',\n prefix: 'c',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circleCP'),\n center: NameZ,\n surfacePoint: NameZ,\n visible: z.boolean().optional(),\n }),\n collectRefs: (e) => [e.center, e.surfacePoint],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'circle',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n visible: e.visible ?? true,\n attrs: { center: ctx.resolveId(e.center), surfacePoint: ctx.resolveId(e.surfacePoint) },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/circles/circle3.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'circle3' }>;\n\nexport const circle3Module = defineModule<'circle3', Input>({\n kind: 'circle3',\n role: 'circle',\n category: 'circles',\n prefix: 'c',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circle3'),\n p1: NameZ,\n p2: NameZ,\n p3: NameZ,\n }),\n collectRefs: (e) => [e.p1, e.p2, e.p3],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'circle',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'circumscribed',\n p1: ctx.resolveId(e.p1),\n p2: ctx.resolveId(e.p2),\n p3: ctx.resolveId(e.p3),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/circles/circleDiameter.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'circleDiameter' }>;\n\n// Đường tròn đường kính p1p2 — tâm = trung điểm, bán kính = |p1p2|/2.\n// Emit circle với construction 'diameter'; renderer dựng midpoint ẩn + circle qua p2.\nexport const circleDiameterModule = defineModule<'circleDiameter', Input>({\n kind: 'circleDiameter',\n role: 'circle',\n category: 'circles',\n prefix: 'c',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circleDiameter'),\n p1: NameZ,\n p2: NameZ,\n visible: z.boolean().optional(),\n }),\n collectRefs: (e) => [e.p1, e.p2],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'circle',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n visible: e.visible ?? true,\n attrs: {\n construction: {\n kind: 'diameter',\n p1: ctx.resolveId(e.p1),\n p2: ctx.resolveId(e.p2),\n },\n },\n },\n }],\n});\n","import { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'secondIntersection' }>;\n\nexport const secondIntersectionModule = defineModule<'secondIntersection', Input>({\n kind: 'secondIntersection',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('secondIntersection'),\n line: NameZ,\n circle: NameZ,\n other: NameZ,\n }),\n collectRefs: (e) => [e.line, e.circle, e.other],\n refSpecs: [\n { field: 'line', role: 'line-like' },\n { field: 'circle', role: 'circle' },\n { field: 'other', role: 'point' },\n ],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n {\n kind: 'secondIntersection',\n line: ctx.resolveId(e.line),\n circle: ctx.resolveId(e.circle),\n other: ctx.resolveId(e.other),\n },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/circleIntersection.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'circleIntersection' }>;\n\nexport const circleIntersectionModule = defineModule<'circleIntersection', Input>({\n kind: 'circleIntersection',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circleIntersection'),\n c1: NameZ,\n c2: NameZ,\n which: z.union([z.literal(0), z.literal(1)]),\n }),\n collectRefs: (e) => [e.c1, e.c2],\n refSpecs: [\n { field: 'c1', role: 'circle' },\n { field: 'c2', role: 'circle' },\n ],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n {\n kind: 'circleIntersection',\n c1: ctx.resolveId(e.c1),\n c2: ctx.resolveId(e.c2),\n which: e.which,\n },\n ),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/circleSecondIntersection.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'circleSecondIntersection' }>;\n\n// Giao điểm THỨ HAI của 2 đường tròn (c1 ∩ c2), biết điểm chung `exclude`.\n// Renderer: JSXGraph 'otherintersection' → nghiệm KHÁC `exclude`.\nexport const circleSecondIntersectionModule = defineModule<'circleSecondIntersection', Input>({\n kind: 'circleSecondIntersection',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circleSecondIntersection'),\n c1: NameZ,\n c2: NameZ,\n exclude: NameZ,\n }),\n collectRefs: (e) => [e.c1, e.c2, e.exclude],\n refSpecs: [\n { field: 'c1', role: 'circle' },\n { field: 'c2', role: 'circle' },\n { field: 'exclude', role: 'point' },\n ],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n {\n kind: 'circleSecondIntersection',\n c1: ctx.resolveId(e.c1),\n c2: ctx.resolveId(e.c2),\n exclude: ctx.resolveId(e.exclude),\n },\n ),\n }],\n});\n","import { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'tangencyPoint' }>;\n\nexport const tangencyPointModule = defineModule<'tangencyPoint', Input>({\n kind: 'tangencyPoint',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('tangencyPoint'),\n circle: NameZ,\n onLine: NameZ,\n }),\n collectRefs: (e) => [e.circle, e.onLine],\n refSpecs: [\n { field: 'circle', role: 'circle' },\n { field: 'onLine', role: 'line-like' },\n ],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n {\n kind: 'tangencyPoint',\n circle: ctx.resolveId(e.circle),\n onLine: ctx.resolveId(e.onLine),\n },\n ),\n }],\n});\n","import { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'tangentPointExt' }>;\n\nexport const tangentPointExtModule = defineModule<'tangentPointExt', Input>({\n kind: 'tangentPointExt',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('tangentPointExt'),\n from: NameZ,\n circle: NameZ,\n which: z.union([z.literal(0), z.literal(1)]),\n }),\n collectRefs: (e) => [e.from, e.circle],\n refSpecs: [\n { field: 'from', role: 'point' },\n { field: 'circle', role: 'circle' },\n ],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(\n ctx.resolveId(e.name),\n e.name,\n {\n kind: 'tangentPointExt',\n from: ctx.resolveId(e.from),\n circle: ctx.resolveId(e.circle),\n which: e.which,\n },\n ),\n }],\n});\n","import { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'circleCR' }>;\n\nexport const circleCRModule = defineModule<'circleCR', Input>({\n kind: 'circleCR',\n role: 'circle',\n category: 'circles',\n prefix: 'c',\n schema: z.object({\n name: NameZ,\n kind: z.literal('circleCR'),\n center: NameZ,\n radius: z.number().positive(),\n }),\n collectRefs: (e) => [e.center],\n refSpecs: [{ field: 'center', role: 'point' }],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'circle',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: { center: ctx.resolveId(e.center), radius: e.radius },\n },\n }],\n});\n","import { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'incircle' }>;\n\nexport const incircleModule = defineModule<'incircle', Input>({\n kind: 'incircle',\n role: 'circle',\n category: 'circles',\n prefix: 'c',\n schema: z.object({\n name: NameZ,\n kind: z.literal('incircle'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n }),\n collectRefs: (e) => [...e.vertices],\n refSpecs: [{ field: 'vertices', role: 'point', many: true }],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'circle',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n kind: 'incircle',\n vertices: [\n ctx.resolveId(e.vertices[0]),\n ctx.resolveId(e.vertices[1]),\n ctx.resolveId(e.vertices[2]),\n ],\n },\n },\n }],\n});\n","import { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslShapeT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { SHAPE_BASE_FIELDS } from '../_shared';\n\ntype Input = Extract<DslShapeT, { kind: 'excircle' }>;\n\nexport const excircleModule = defineModule<'excircle', Input>({\n kind: 'excircle',\n role: 'circle',\n category: 'circles',\n prefix: 'c',\n schema: z.object({\n name: NameZ,\n kind: z.literal('excircle'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n opposite: NameZ,\n }),\n collectRefs: (e) => [...e.vertices],\n refSpecs: [\n { field: 'vertices', role: 'point', many: true },\n { field: 'opposite', role: 'point' },\n ],\n emit: (e, ctx) => [{\n role: 'primary',\n object: {\n id: ctx.resolveId(e.name),\n kind: 'circle',\n label: e.name,\n ...SHAPE_BASE_FIELDS,\n attrs: {\n construction: {\n kind: 'excircle',\n p1: ctx.resolveId(e.vertices[0]),\n p2: ctx.resolveId(e.vertices[1]),\n p3: ctx.resolveId(e.vertices[2]),\n opposite: ctx.resolveId(e.opposite),\n },\n },\n },\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/arcMidpoint.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'arcMidpoint' }>;\n\nexport const arcMidpointModule = defineModule<'arcMidpoint', Input>({\n kind: 'arcMidpoint',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('arcMidpoint'),\n circle: NameZ,\n a: NameZ,\n b: NameZ,\n notContaining: NameZ,\n }),\n collectRefs: (e) => [e.circle, e.a, e.b, e.notContaining],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(ctx.resolveId(e.name), e.name, {\n kind: 'arcMidpoint',\n circle: ctx.resolveId(e.circle),\n a: ctx.resolveId(e.a),\n b: ctx.resolveId(e.b),\n notContaining: ctx.resolveId(e.notContaining),\n }),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/excenter.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject, resolveTriangleVertices } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'excenter' }>;\n\nexport const excenterModule = defineModule<'excenter', Input>({\n kind: 'excenter',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('excenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]),\n opposite: NameZ,\n }),\n collectRefs: (e) => [...e.vertices],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(ctx.resolveId(e.name), e.name, {\n kind: 'excenter',\n vertices: resolveTriangleVertices(ctx, e.vertices),\n opposite: ctx.resolveId(e.opposite),\n }),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/reflectPoint.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'reflectPoint' }>;\n\nexport const reflectPointModule = defineModule<'reflectPoint', Input>({\n kind: 'reflectPoint',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({ name: NameZ, kind: z.literal('reflectPoint'), of: NameZ, through: NameZ }),\n collectRefs: (e) => [e.of, e.through],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(ctx.resolveId(e.name), e.name, {\n kind: 'transformed',\n source: ctx.resolveId(e.of),\n transform: { kind: 'reflectPoint', center: ctx.resolveId(e.through) },\n }),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/reflectLine.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'reflectLine' }>;\n\nexport const reflectLineModule = defineModule<'reflectLine', Input>({\n kind: 'reflectLine',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({ name: NameZ, kind: z.literal('reflectLine'), of: NameZ, through: NameZ }),\n collectRefs: (e) => [e.of, e.through],\n emit: (e, ctx) => [{\n role: 'primary',\n object: emitPointObject(ctx.resolveId(e.name), e.name, {\n kind: 'transformed',\n source: ctx.resolveId(e.of),\n transform: { kind: 'reflectLine', line: ctx.resolveId(e.through) },\n }),\n }],\n});\n","// src/stamps/geometry-2d/dsl/kinds/points/pointAtDistance.ts\nimport { z } from 'zod';\nimport { NameZ } from '../../names';\nimport type { DslPointT } from '../../schema';\nimport { defineModule } from '../_types';\nimport { emitPointObject } from '../_shared';\n\ntype Input = Extract<DslPointT, { kind: 'pointAtDistance' }>;\n\n// scale/offset OPTIONAL (Issue #46 nhóm C): d = scale·base + offset. scale phải\n// > 0; offset bất kỳ (âm OK — guard d>0 ở render). Absent → giữ form cũ (additive).\nconst ScaleOffsetZ = {\n scale: z.number().positive().optional(),\n offset: z.number().optional(),\n};\nconst DistanceZ = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('circleRadius'), circle: NameZ, ...ScaleOffsetZ }),\n z.object({ kind: z.literal('segmentLength'), p1: NameZ, p2: NameZ, ...ScaleOffsetZ }),\n z.object({ kind: z.literal('literal'), value: z.number().positive(), ...ScaleOffsetZ }),\n]);\n\n/** Chỉ chèn scale/offset khi có giá trị → object cũ KHÔNG mọc key (additive). */\nfunction withScaleOffset<T extends object>(base: T, d: { scale?: number; offset?: number }): T {\n const out = { ...base } as T & { scale?: number; offset?: number };\n if (d.scale !== undefined) out.scale = d.scale;\n if (d.offset !== undefined) out.offset = d.offset;\n return out;\n}\n\nexport const pointAtDistanceModule = defineModule<'pointAtDistance', Input>({\n kind: 'pointAtDistance',\n role: 'point',\n category: 'points',\n prefix: 'p',\n schema: z.object({\n name: NameZ,\n kind: z.literal('pointAtDistance'),\n from: NameZ,\n through: NameZ,\n distance: DistanceZ,\n }),\n collectRefs: (e) => {\n const d = e.distance;\n const extra = d.kind === 'circleRadius' ? [d.circle]\n : d.kind === 'segmentLength' ? [d.p1, d.p2] : [];\n return [e.from, e.through, ...extra];\n },\n // TODO(Mức 1 defer): distance.{circle,p1,p2} là nested trong `distance` — refSpec\n // phẳng đọc top-level không với tới, validate riêng nếu cần. Hiện validate from/through.\n refSpecs: [\n { field: 'from', role: 'point' },\n { field: 'through', role: 'point' },\n ],\n emit: (e, ctx) => {\n const d = e.distance;\n const distance = d.kind === 'circleRadius'\n ? withScaleOffset({ kind: 'circleRadius', circle: ctx.resolveId(d.circle) }, d)\n : d.kind === 'segmentLength'\n ? withScaleOffset({ kind: 'segmentLength', p1: ctx.resolveId(d.p1), p2: ctx.resolveId(d.p2) }, d)\n : withScaleOffset({ kind: 'literal', value: d.value }, d);\n return [{\n role: 'primary',\n object: emitPointObject(ctx.resolveId(e.name), e.name, {\n kind: 'pointAtDistance',\n from: ctx.resolveId(e.from),\n through: ctx.resolveId(e.through),\n distance,\n }),\n }];\n },\n});\n","// src/stamps/geometry-2d/dsl/registry.ts\nimport { z } from 'zod';\nimport type { DslKindModule } from './kinds/_types';\nimport { freeModule } from './kinds/points/free';\nimport { midpointModule } from './kinds/points/midpoint';\nimport { onSegmentModule } from './kinds/points/onSegment';\nimport { onLineModule } from './kinds/points/onLine';\nimport { onCircleModule } from './kinds/points/onCircle';\nimport { perpFootModule } from './kinds/points/perpFoot';\nimport { circumcenterModule } from './kinds/points/circumcenter';\nimport { incenterModule } from './kinds/points/incenter';\nimport { centroidModule } from './kinds/points/centroid';\nimport { orthocenterModule } from './kinds/points/orthocenter';\nimport { intersectionModule } from './kinds/points/intersection';\nimport { segmentModule } from './kinds/lines/segment';\nimport { lineModule } from './kinds/lines/line';\nimport { rayModule } from './kinds/lines/ray';\nimport { perpendicularModule } from './kinds/lines/perpendicular';\nimport { parallelModule } from './kinds/lines/parallel';\nimport { perpBisectorModule } from './kinds/lines/perpBisector';\nimport { angleBisectorModule } from './kinds/lines/angleBisector';\nimport { lineThroughModule } from './kinds/lines/lineThrough';\nimport { radicalAxisModule } from './kinds/lines/radicalAxis';\nimport { tangentModule } from './kinds/lines/tangent';\nimport { polygonModule } from './kinds/polygons/polygon';\nimport { circleCPModule } from './kinds/circles/circleCP';\nimport { circle3Module } from './kinds/circles/circle3';\nimport { circleDiameterModule } from './kinds/circles/circleDiameter';\nimport { secondIntersectionModule } from './kinds/points/secondIntersection';\nimport { circleIntersectionModule } from './kinds/points/circleIntersection';\nimport { circleSecondIntersectionModule } from './kinds/points/circleSecondIntersection';\nimport { tangencyPointModule } from './kinds/points/tangencyPoint';\nimport { tangentPointExtModule } from './kinds/points/tangentPointExt';\nimport { circleCRModule } from './kinds/circles/circleCR';\nimport { incircleModule } from './kinds/circles/incircle';\nimport { excircleModule } from './kinds/circles/excircle';\nimport { arcMidpointModule } from './kinds/points/arcMidpoint';\nimport { excenterModule } from './kinds/points/excenter';\nimport { reflectPointModule } from './kinds/points/reflectPoint';\nimport { reflectLineModule } from './kinds/points/reflectLine';\nimport { pointAtDistanceModule } from './kinds/points/pointAtDistance';\n\nconst ALL_MODULES: ReadonlyArray<DslKindModule> = [\n freeModule, midpointModule, onSegmentModule, onLineModule, onCircleModule,\n perpFootModule, circumcenterModule, incenterModule, centroidModule,\n orthocenterModule, intersectionModule,\n // NEW Tier 4+5 points\n secondIntersectionModule, circleIntersectionModule, circleSecondIntersectionModule,\n tangencyPointModule, tangentPointExtModule,\n segmentModule, lineModule, rayModule,\n perpendicularModule, parallelModule, perpBisectorModule,\n angleBisectorModule, lineThroughModule, radicalAxisModule, tangentModule,\n polygonModule,\n circleCPModule, circle3Module, circleDiameterModule,\n // NEW Tier 4+5 circles\n circleCRModule, incircleModule, excircleModule,\n // Cụm A points\n arcMidpointModule, excenterModule, reflectPointModule, reflectLineModule,\n // Cụm B points\n pointAtDistanceModule,\n];\n\nexport const KIND_REGISTRY: ReadonlyMap<string, DslKindModule> =\n new Map(ALL_MODULES.map((m) => [m.kind, m]));\n\nexport const POINT_KINDS: ReadonlySet<string> = new Set(\n ALL_MODULES.filter((m) => m.role === 'point').map((m) => m.kind),\n);\n\nexport const LINE_LIKE_SHAPE_KINDS: ReadonlySet<string> = new Set(\n ALL_MODULES.filter(\n (m) =>\n m.role === 'segment' ||\n m.role === 'line' ||\n m.role === 'ray' ||\n m.role === 'lineConstruction',\n ).map((m) => m.kind),\n);\n\nexport const CIRCLE_KINDS: ReadonlySet<string> = new Set(\n ALL_MODULES.filter((m) => m.role === 'circle').map((m) => m.kind),\n);\n\n// Top-level entity discriminated union — used internally by schema.ts for building DslPoint/DslShape.\nexport const DslEntitySchema = z.discriminatedUnion(\n 'kind',\n ALL_MODULES.map((m) => m.schema) as unknown as [z.ZodObject<any>, z.ZodObject<any>, ...z.ZodObject<any>[]],\n);\n","// src/stamps/geometry-2d/dsl/serialize.ts\n//\n// Reverse path: SceneObject → DSL entity. Counterpart cho `transpile` (forward\n// DSL → State). Dùng cho tab Đối tượng hiển thị mô tả DSL-style + reuse khi\n// muốn export state về DSL.\n//\n// Lossless với mọi primitive DSL v1 hỗ trợ. Out-of-DSL state (vector, distance,\n// angle, arc, sector, onAxis/onPolygon/transformed constraint, polygon regular,\n// angleBisectorLines) → fallback `{ ok: false; reason }` không drop.\n\nimport type { SceneObject, State } from '../../../core/scene/types';\nimport type { Constraint2D } from '../../../core/scene/kinds/2d-constraint';\nimport type { LineConstruction, LineAttrs } from '../../../core/scene/kinds/line';\nimport type { CircleAttrs } from '../../../core/scene/kinds/circle';\nimport type { PolygonAttrs } from '../../../core/scene/kinds/polygon';\nimport type { SegmentAttrs } from '../../../core/scene/kinds/segment';\nimport type { RayAttrs } from '../../../core/scene/kinds/ray';\nimport type { IntersectionAttrs } from '../../../core/scene/kinds/intersection';\nimport type { PointAttrs } from '../../../core/scene/kinds/point';\nimport type { DslInputT, DslPointT, DslShapeT } from './schema';\nimport { POINT_KINDS } from './registry';\n\nexport type SerializeReason =\n | 'unsupported-kind'\n | 'unsupported-constraint'\n | 'unsupported-construction'\n | 'unresolved-ref'\n | 'invalid-label';\n\nexport type SerializedEntity =\n | { ok: true; entity: DslPointT | DslShapeT }\n | { ok: false; reason: SerializeReason; detail?: string };\n\nexport interface UnsupportedEntry {\n id: string;\n label: string;\n kind: string;\n reason: SerializeReason;\n detail?: string;\n}\n\nexport interface SerializeStateResult {\n dsl: DslInputT;\n unsupported: UnsupportedEntry[];\n}\n\n// Đồng bộ với NameZ ở names.ts. Dup ở đây để serializer không phụ thuộc Zod\n// parse cho mỗi label (hot path khi tab Đối tượng render hàng chục row).\nconst NAME_REGEX = /^[A-Za-z][A-Za-z0-9_'₀-₉]{0,11}$/;\n\nfunction isValidName(s: string): boolean {\n return NAME_REGEX.test(s);\n}\n\nfunction labelOf(id: string, state: State): string | null {\n const obj = state.objects[id];\n return obj ? obj.label : null;\n}\n\nfunction resolveRefs(ids: readonly string[], state: State): string[] | null {\n const out: string[] = [];\n for (const id of ids) {\n const lab = labelOf(id, state);\n if (lab == null || !isValidName(lab)) return null;\n out.push(lab);\n }\n return out;\n}\n\nfunction fail(reason: SerializeReason, detail?: string): SerializedEntity {\n return { ok: false, reason, detail };\n}\n\n// ---------------------------------------------------------------------------\n// point — drill into Constraint2D\n// ---------------------------------------------------------------------------\n\nfunction serializePoint(obj: SceneObject<PointAttrs>, state: State): SerializedEntity {\n const c: Constraint2D | undefined = obj.attrs?.constraint;\n if (!c) return fail('unsupported-constraint', 'missing');\n\n switch (c.kind) {\n case 'free':\n return { ok: true, entity: { name: obj.label, kind: 'free', x: c.x, y: c.y } };\n\n case 'midpoint': {\n const refs = resolveRefs([c.p1, c.p2], state);\n if (!refs) return fail('unresolved-ref', `${c.p1},${c.p2}`);\n return { ok: true, entity: { name: obj.label, kind: 'midpoint', p1: refs[0], p2: refs[1] } };\n }\n\n case 'onSegment': {\n const refs = resolveRefs([c.segmentId], state);\n if (!refs) return fail('unresolved-ref', c.segmentId);\n return { ok: true, entity: { name: obj.label, kind: 'onSegment', segmentId: refs[0], t: c.t } };\n }\n\n case 'onLine': {\n const refs = resolveRefs([c.lineId], state);\n if (!refs) return fail('unresolved-ref', c.lineId);\n return { ok: true, entity: { name: obj.label, kind: 'onLine', lineId: refs[0], t: c.t } };\n }\n\n case 'onCircle': {\n const refs = resolveRefs([c.circleId], state);\n if (!refs) return fail('unresolved-ref', c.circleId);\n return { ok: true, entity: { name: obj.label, kind: 'onCircle', circleId: refs[0], theta: c.theta } };\n }\n\n case 'perpFoot': {\n const refs = resolveRefs([c.from, c.onLine], state);\n if (!refs) return fail('unresolved-ref', `${c.from},${c.onLine}`);\n return { ok: true, entity: { name: obj.label, kind: 'perpFoot', from: refs[0], onLine: refs[1] } };\n }\n\n case 'circumcenter':\n case 'incenter':\n case 'centroid':\n case 'orthocenter': {\n const refs = resolveRefs(c.vertices, state);\n if (!refs || refs.length !== 3) return fail('unresolved-ref', c.vertices.join(','));\n return {\n ok: true,\n entity: {\n name: obj.label,\n kind: c.kind,\n vertices: [refs[0], refs[1], refs[2]],\n },\n };\n }\n\n case 'tangentPointExt': {\n const refs = resolveRefs([c.from, c.circle], state);\n if (!refs) return fail('unresolved-ref', `${c.from},${c.circle}`);\n return {\n ok: true,\n entity: {\n name: obj.label,\n kind: 'tangentPointExt',\n from: refs[0],\n circle: refs[1],\n which: c.which,\n },\n };\n }\n\n case 'circleIntersection': {\n const refs = resolveRefs([c.c1, c.c2], state);\n if (!refs) return fail('unresolved-ref', `${c.c1},${c.c2}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'circleIntersection', c1: refs[0], c2: refs[1], which: c.which },\n };\n }\n\n case 'circleSecondIntersection': {\n const refs = resolveRefs([c.c1, c.c2, c.exclude], state);\n if (!refs) return fail('unresolved-ref', `${c.c1},${c.c2},${c.exclude}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'circleSecondIntersection', c1: refs[0], c2: refs[1], exclude: refs[2] },\n };\n }\n\n case 'secondIntersection': {\n const refs = resolveRefs([c.line, c.circle, c.other], state);\n if (!refs) return fail('unresolved-ref', `${c.line},${c.circle},${c.other}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'secondIntersection', line: refs[0], circle: refs[1], other: refs[2] },\n };\n }\n\n case 'tangencyPoint': {\n const refs = resolveRefs([c.circle, c.onLine], state);\n if (!refs) return fail('unresolved-ref', `${c.circle},${c.onLine}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'tangencyPoint', circle: refs[0], onLine: refs[1] },\n };\n }\n\n case 'arcMidpoint': {\n const refs = resolveRefs([c.circle, c.a, c.b, c.notContaining], state);\n if (!refs) return fail('unresolved-ref', `${c.circle},${c.a},${c.b},${c.notContaining}`);\n return {\n ok: true,\n entity: {\n name: obj.label,\n kind: 'arcMidpoint',\n circle: refs[0],\n a: refs[1],\n b: refs[2],\n notContaining: refs[3],\n },\n };\n }\n\n case 'excenter': {\n const refs = resolveRefs([c.vertices[0], c.vertices[1], c.vertices[2], c.opposite], state);\n if (!refs) return fail('unresolved-ref', `${c.vertices.join(',')},${c.opposite}`);\n return {\n ok: true,\n entity: {\n name: obj.label,\n kind: 'excenter',\n vertices: [refs[0], refs[1], refs[2]],\n opposite: refs[3],\n },\n };\n }\n\n case 'pointAtDistance': {\n const d = c.distance;\n const distRefIds = d.kind === 'circleRadius' ? [d.circle]\n : d.kind === 'segmentLength' ? [d.p1, d.p2] : [];\n const refs = resolveRefs([c.from, c.through, ...distRefIds], state);\n if (!refs) return fail('unresolved-ref', [c.from, c.through, ...distRefIds].join(','));\n let distance: import('./schema').DslDistanceSpec;\n if (d.kind === 'circleRadius') {\n distance = { kind: 'circleRadius', circle: refs[2] };\n } else if (d.kind === 'segmentLength') {\n distance = { kind: 'segmentLength', p1: refs[2], p2: refs[3] };\n } else {\n distance = { kind: 'literal', value: d.value };\n }\n // scale/offset OPTIONAL (Issue #46 nhóm C): chỉ ghi khi có → distance cũ\n // KHÔNG mọc key (additive, golden không đổi).\n if (d.scale !== undefined) distance.scale = d.scale;\n if (d.offset !== undefined) distance.offset = d.offset;\n return {\n ok: true,\n entity: { name: obj.label, kind: 'pointAtDistance', from: refs[0], through: refs[1], distance },\n };\n }\n\n // Out of DSL v1:\n case 'onAxis':\n case 'onPolygon':\n case 'transformed':\n case 'onPerpendicular':\n case 'onPerpBisector':\n case 'onCircleAroundPoint':\n return fail('unsupported-constraint', c.kind);\n\n default: {\n // exhaustive guard\n const _exhaust: never = c;\n void _exhaust;\n return fail('unsupported-constraint');\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// intersection — branch field only for non-lineLine\n// ---------------------------------------------------------------------------\n\nfunction serializeIntersection(\n obj: SceneObject<IntersectionAttrs>,\n state: State,\n): SerializedEntity {\n const a = obj.attrs;\n const refs = resolveRefs([a.ref1, a.ref2], state);\n if (!refs) return fail('unresolved-ref', `${a.ref1},${a.ref2}`);\n if (a.kind === 'lineLine') {\n return { ok: true, entity: { name: obj.label, kind: 'intersection', ref1: refs[0], ref2: refs[1] } };\n }\n return {\n ok: true,\n entity: {\n name: obj.label,\n kind: 'intersection',\n ref1: refs[0],\n ref2: refs[1],\n branch: a.branch,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// segment / ray\n// ---------------------------------------------------------------------------\n\nfunction serializeSegment(obj: SceneObject<SegmentAttrs>, state: State): SerializedEntity {\n const refs = resolveRefs([obj.attrs.p1, obj.attrs.p2], state);\n if (!refs) return fail('unresolved-ref', `${obj.attrs.p1},${obj.attrs.p2}`);\n return { ok: true, entity: { name: obj.label, kind: 'segment', p1: refs[0], p2: refs[1] } };\n}\n\nfunction serializeRay(obj: SceneObject<RayAttrs>, state: State): SerializedEntity {\n const refs = resolveRefs([obj.attrs.origin, obj.attrs.through], state);\n if (!refs) return fail('unresolved-ref', `${obj.attrs.origin},${obj.attrs.through}`);\n return { ok: true, entity: { name: obj.label, kind: 'ray', origin: refs[0], through: refs[1] } };\n}\n\n// ---------------------------------------------------------------------------\n// line — no construction → 'line'; construction → matching DSL kind\n// ---------------------------------------------------------------------------\n\nfunction serializeLine(obj: SceneObject<LineAttrs>, state: State): SerializedEntity {\n const a = obj.attrs;\n const c: LineConstruction | undefined = a.construction;\n if (!c) {\n if (!a.p1 || !a.p2) return fail('unsupported-construction', 'missing p1/p2');\n const refs = resolveRefs([a.p1, a.p2], state);\n if (!refs) return fail('unresolved-ref', `${a.p1},${a.p2}`);\n return { ok: true, entity: { name: obj.label, kind: 'line', p1: refs[0], p2: refs[1] } };\n }\n\n switch (c.kind) {\n case 'perpendicular':\n case 'parallel': {\n const refs = resolveRefs([c.throughPoint, c.toLine], state);\n if (!refs) return fail('unresolved-ref', `${c.throughPoint},${c.toLine}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: c.kind, throughPoint: refs[0], toLine: refs[1] },\n };\n }\n\n case 'perpBisector': {\n const refs = resolveRefs([c.p1, c.p2], state);\n if (!refs) return fail('unresolved-ref', `${c.p1},${c.p2}`);\n return { ok: true, entity: { name: obj.label, kind: 'perpBisector', p1: refs[0], p2: refs[1] } };\n }\n\n case 'angleBisector': {\n const refs = resolveRefs([c.p1, c.vertex, c.p2], state);\n if (!refs) return fail('unresolved-ref', `${c.p1},${c.vertex},${c.p2}`);\n return {\n ok: true,\n entity: {\n name: obj.label,\n kind: 'angleBisector',\n p1: refs[0],\n vertex: refs[1],\n p2: refs[2],\n },\n };\n }\n\n case 'tangent': {\n const refs = resolveRefs([c.throughPoint, c.toCircle], state);\n if (!refs) return fail('unresolved-ref', `${c.throughPoint},${c.toCircle}`);\n const entity: DslShapeT =\n c.branch !== undefined\n ? {\n name: obj.label,\n kind: 'tangent',\n throughPoint: refs[0],\n toCircle: refs[1],\n branch: c.branch,\n }\n : { name: obj.label, kind: 'tangent', throughPoint: refs[0], toCircle: refs[1] };\n return { ok: true, entity };\n }\n\n case 'lineThrough': {\n const refs = resolveRefs(c.points, state);\n if (!refs) return fail('unresolved-ref', c.points.join(','));\n return { ok: true, entity: { name: obj.label, kind: 'lineThrough', points: refs } };\n }\n\n case 'radicalAxis': {\n const refs = resolveRefs([c.circle1, c.circle2], state);\n if (!refs) return fail('unresolved-ref', `${c.circle1},${c.circle2}`);\n return { ok: true, entity: { name: obj.label, kind: 'radicalAxis', circle1: refs[0], circle2: refs[1] } };\n }\n\n case 'angleBisectorLines':\n return fail('unsupported-construction', 'angleBisectorLines');\n\n default: {\n const _exhaust: never = c;\n void _exhaust;\n return fail('unsupported-construction');\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// polygon — no construction OK; 'regular' unsupported\n// ---------------------------------------------------------------------------\n\nfunction serializePolygon(obj: SceneObject<PolygonAttrs>, state: State): SerializedEntity {\n const a = obj.attrs;\n if (a.construction) return fail('unsupported-construction', a.construction.kind);\n if (!Array.isArray(a.vertices) || a.vertices.length < 3) {\n return fail('unsupported-construction', 'missing vertices');\n }\n const refs = resolveRefs(a.vertices, state);\n if (!refs) return fail('unresolved-ref', a.vertices.join(','));\n return { ok: true, entity: { name: obj.label, kind: 'polygon', vertices: refs } };\n}\n\n// ---------------------------------------------------------------------------\n// circle — no construction → circleCP; 'circumscribed' → circle3\n// ---------------------------------------------------------------------------\n\nfunction serializeCircle(obj: SceneObject<CircleAttrs>, state: State): SerializedEntity {\n const a = obj.attrs;\n const c = (() => {\n if (a.construction) return a.construction;\n const raw = a as CircleAttrs & {\n kind?: string;\n vertices?: [string, string, string];\n opposite?: string;\n p1?: string;\n p2?: string;\n };\n if (raw.kind === 'incircle' && raw.vertices) {\n return {\n kind: 'incircle' as const,\n p1: raw.vertices[0],\n p2: raw.vertices[1],\n p3: raw.vertices[2],\n };\n }\n if (raw.kind === 'excircle' && raw.vertices && raw.opposite) {\n return {\n kind: 'excircle' as const,\n p1: raw.vertices[0],\n p2: raw.vertices[1],\n p3: raw.vertices[2],\n opposite: raw.opposite,\n };\n }\n if (raw.kind === 'circleDiameter' && raw.p1 && raw.p2) {\n return {\n kind: 'diameter' as const,\n p1: raw.p1,\n p2: raw.p2,\n };\n }\n return undefined;\n })();\n if (!c) {\n // center + radius (DSL circleCR) — ưu tiên trước center/surfacePoint.\n if (typeof a.radius === 'number') {\n if (!a.center) return fail('unsupported-construction', 'missing center');\n const refs = resolveRefs([a.center], state);\n if (!refs) return fail('unresolved-ref', `${a.center}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'circleCR', center: refs[0], radius: a.radius },\n };\n }\n if (!a.center || !a.surfacePoint) {\n return fail('unsupported-construction', 'missing center/surfacePoint');\n }\n const refs = resolveRefs([a.center, a.surfacePoint], state);\n if (!refs) return fail('unresolved-ref', `${a.center},${a.surfacePoint}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'circleCP', center: refs[0], surfacePoint: refs[1] },\n };\n }\n if (c.kind === 'circumscribed') {\n const refs = resolveRefs([c.p1, c.p2, c.p3], state);\n if (!refs) return fail('unresolved-ref', `${c.p1},${c.p2},${c.p3}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'circle3', p1: refs[0], p2: refs[1], p3: refs[2] },\n };\n }\n if (c.kind === 'incircle') {\n const refs = resolveRefs([c.p1, c.p2, c.p3], state);\n if (!refs) return fail('unresolved-ref', `${c.p1},${c.p2},${c.p3}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'incircle', vertices: [refs[0], refs[1], refs[2]] },\n };\n }\n if (c.kind === 'excircle') {\n const refs = resolveRefs([c.p1, c.p2, c.p3, c.opposite], state);\n if (!refs) return fail('unresolved-ref', `${c.p1},${c.p2},${c.p3},${c.opposite}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'excircle', vertices: [refs[0], refs[1], refs[2]], opposite: refs[3] },\n };\n }\n if (c.kind === 'diameter') {\n const refs = resolveRefs([c.p1, c.p2], state);\n if (!refs) return fail('unresolved-ref', `${c.p1},${c.p2}`);\n return {\n ok: true,\n entity: { name: obj.label, kind: 'circleDiameter', p1: refs[0], p2: refs[1] },\n };\n }\n return fail('unsupported-construction');\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function serializeObject(obj: SceneObject, state: State): SerializedEntity {\n if (!isValidName(obj.label)) {\n return fail('invalid-label', obj.label);\n }\n switch (obj.kind) {\n case 'point':\n return serializePoint(obj as SceneObject<PointAttrs>, state);\n case 'segment':\n return serializeSegment(obj as SceneObject<SegmentAttrs>, state);\n case 'ray':\n return serializeRay(obj as SceneObject<RayAttrs>, state);\n case 'line':\n return serializeLine(obj as SceneObject<LineAttrs>, state);\n case 'polygon':\n return serializePolygon(obj as SceneObject<PolygonAttrs>, state);\n case 'circle':\n return serializeCircle(obj as SceneObject<CircleAttrs>, state);\n case 'intersection':\n return serializeIntersection(obj as SceneObject<IntersectionAttrs>, state);\n default:\n return fail('unsupported-kind', obj.kind);\n }\n}\n\nexport function serializeState(state: State): SerializeStateResult {\n const points: DslPointT[] = [];\n const shapes: DslShapeT[] = [];\n const unsupported: UnsupportedEntry[] = [];\n\n for (const id of state.order) {\n const obj = state.objects[id];\n if (!obj) continue;\n const r = serializeObject(obj, state);\n if (!r.ok) {\n unsupported.push({\n id: obj.id,\n label: obj.label,\n kind: obj.kind,\n reason: r.reason,\n detail: r.detail,\n });\n continue;\n }\n if (POINT_KINDS.has(r.entity.kind)) {\n points.push(r.entity as DslPointT);\n } else {\n shapes.push(r.entity as DslShapeT);\n }\n }\n\n return {\n dsl: { version: 1, points, shapes },\n unsupported,\n };\n}\n","// src/stamps/geometry-2d/dsl/describeDsl.ts\n//\n// DSL-style description tiếng Việt cho tab Đối tượng (issue #41). Reuse\n// serializeObject để đảm bảo mô tả khớp với DSL hỗ trợ; out-of-DSL object\n// fallback về `kindDef.describe()` qua getKind, kèm suffix \"(không hỗ trợ DSL)\"\n// để rõ ràng cho user.\n\nimport type { SceneObject, State } from '../../../core/scene/types';\nimport { getKind } from '../../../core/scene/registry';\nimport type { DslPointT, DslShapeT } from './schema';\nimport { serializeObject } from './serialize';\n\nfunction describeEntity(e: DslPointT | DslShapeT): string {\n switch (e.kind) {\n case 'free': return `${e.name} = (${e.x}, ${e.y})`;\n case 'midpoint': return `${e.name} = trung điểm ${e.p1}${e.p2}`;\n case 'onSegment': return `${e.name} ∈ đoạn ${e.segmentId} (t = ${e.t})`;\n case 'onLine': return `${e.name} ∈ đường ${e.lineId} (t = ${e.t})`;\n case 'onCircle': return `${e.name} ∈ đường tròn ${e.circleId} (θ = ${e.theta})`;\n case 'perpFoot': return `${e.name} = chân vuông góc từ ${e.from} xuống ${e.onLine}`;\n case 'circumcenter': return `${e.name} = tâm ngoại tiếp ${e.vertices.join('')}`;\n case 'incenter': return `${e.name} = tâm nội tiếp ${e.vertices.join('')}`;\n case 'centroid': return `${e.name} = trọng tâm ${e.vertices.join('')}`;\n case 'orthocenter': return `${e.name} = trực tâm ${e.vertices.join('')}`;\n case 'intersection': {\n const branch = 'branch' in e && e.branch !== undefined ? ` (nhánh ${e.branch})` : '';\n return `${e.name} = ${e.ref1} ∩ ${e.ref2}${branch}`;\n }\n case 'segment': return `${e.name} = đoạn ${e.p1}${e.p2}`;\n case 'line': return `${e.name} = đường thẳng ${e.p1}${e.p2}`;\n case 'ray': return `${e.name} = tia ${e.origin}${e.through}`;\n case 'polygon': return `${e.name} = đa giác ${e.vertices.join('')}`;\n case 'perpendicular': return `${e.name} ⟂ ${e.toLine} qua ${e.throughPoint}`;\n case 'parallel': return `${e.name} ∥ ${e.toLine} qua ${e.throughPoint}`;\n case 'perpBisector': return `${e.name} = trung trực ${e.p1}${e.p2}`;\n case 'angleBisector': return `${e.name} = phân giác ∠${e.p1}${e.vertex}${e.p2}`;\n case 'lineThrough': return `${e.name} = đường qua ${e.points.join('')}`;\n case 'radicalAxis': return `${e.name} = trục đẳng phương ${e.circle1} & ${e.circle2}`;\n case 'tangent': {\n const branch = 'branch' in e && e.branch !== undefined ? ` (nhánh ${e.branch})` : '';\n return `${e.name} = tiếp tuyến ${e.toCircle} qua ${e.throughPoint}${branch}`;\n }\n case 'circleCP': return `${e.name} = (${e.center}; ${e.center}${e.surfacePoint})`;\n case 'circle3': return `${e.name} = đường tròn qua ${e.p1}${e.p2}${e.p3}`;\n case 'circleDiameter': return `${e.name} = đường tròn đường kính ${e.p1}${e.p2}`;\n // NEW Tier 4+5\n case 'secondIntersection': return `${e.name} = giao thứ hai của ${e.line} và ${e.circle} (khác ${e.other})`;\n case 'circleIntersection': return `${e.name} = giao ${e.c1} ∩ ${e.c2} (nhánh ${e.which})`;\n case 'circleSecondIntersection': return `${e.name} = giao thứ hai ${e.c1} ∩ ${e.c2} (khác ${e.exclude})`;\n case 'tangencyPoint': return `${e.name} = tiếp điểm của ${e.circle} trên ${e.onLine}`;\n case 'tangentPointExt': return `${e.name} = tiếp điểm từ ${e.from} lên ${e.circle} (nhánh ${e.which})`;\n case 'circleCR': return `${e.name} = đường tròn (${e.center}; r=${e.radius})`;\n case 'incircle': return `${e.name} = đường tròn nội tiếp ${e.vertices.join('')}`;\n case 'excircle': return `${e.name} = đường tròn bàng tiếp ${e.vertices.join('')} đối diện ${e.opposite}`;\n // Cụm A\n case 'arcMidpoint': return `${e.name} = trung điểm cung ${e.a}${e.b} (không chứa ${e.notContaining}) trên ${e.circle}`;\n case 'excenter': return `${e.name} = tâm bàng tiếp ${e.vertices.join('')} đối diện ${e.opposite}`;\n case 'reflectPoint': return `${e.name} = đối xứng ${e.of} qua điểm ${e.through}`;\n case 'reflectLine': return `${e.name} = đối xứng ${e.of} qua đường ${e.through}`;\n // Cụm B\n case 'pointAtDistance': {\n const d = e.distance;\n const distStr = d.kind === 'circleRadius' ? `r(${d.circle})`\n : d.kind === 'segmentLength' ? `|${d.p1}${d.p2}|`\n : `${d.value}`;\n return `${e.name} = điểm trên tia ${e.from}${e.through} cách ${e.through} một khoảng ${distStr}`;\n }\n default: {\n const _exhaust: never = e;\n void _exhaust;\n return '';\n }\n }\n}\n\n/**\n * Mô tả DSL-style cho 1 SceneObject. Dùng cho `ObjectListPanel.renderRow`.\n *\n * - Object trong miền DSL → mô tả Việt ngắn gọn (vd \"M = trung điểm BC\").\n * - Object ngoài miền DSL → fallback `kindDef.describe()` + suffix\n * \"(không hỗ trợ DSL)\" để user biết object này không export sang DSL được.\n */\nexport function describeDsl(obj: SceneObject, state: State): string {\n const r = serializeObject(obj, state);\n if (r.ok) return describeEntity(r.entity);\n\n // Fallback — dùng describe từ scene kind registry. Mặc định \"(không hỗ trợ DSL)\"\n // để user thấy rõ giới hạn.\n let base: string;\n try {\n base = getKind(obj.kind).describe(obj, state);\n } catch {\n base = `${obj.kind} ${obj.label}`;\n }\n return `${base} (không hỗ trợ DSL)`;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/scene/render/types2d.ts","../src/core/scene/render/JxgRenderer.ts"],"names":[],"mappings":"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","file":"chunk-SZDAS7LK.mjs","sourcesContent":["// src/core/scene/render/types2d.ts\nimport type { RenderCtx } from '../types';\n\nexport type Theme2D = {\n stroke: string;\n fill: string;\n label: string;\n axis: string;\n grid: string;\n pointFill: string;\n};\n\nexport const DEFAULT_THEME_2D: Theme2D = {\n stroke: '#0f172a',\n fill: '#60a5fa',\n label: '#0f172a',\n axis: '#94a3b8',\n grid: '#e2e8f0',\n pointFill: '#1e40af',\n};\n\nexport type RenderCtx2D = RenderCtx & {\n theme: Theme2D;\n};\n","// src/core/scene/render/JxgRenderer.ts\nimport type { Store } from '../store';\nimport type { State, SceneObject, RenderCtx } from '../types';\nimport { getKind } from '../registry';\nimport { DEFAULT_THEME_2D, type Theme2D } from './types2d';\nimport { collectFreeVars } from '../expressions/parser';\n\nexport type JxgRendererOptions = { theme?: Theme2D };\n\nexport class JxgRenderer {\n private board: unknown;\n private store: Store;\n private theme: Theme2D;\n private elements = new Map<string, unknown>();\n private unsubscribe: () => void;\n private disposed = false;\n\n /** Chỉ dùng cho domain='graph2d': parameter.label → parameter.value */\n private paramMap: Record<string, number> = {};\n /** Chỉ dùng cho domain='graph2d': function2d.id → expression string */\n private functionExpr: Record<string, string> = {};\n\n constructor(store: Store, board: unknown, options: JxgRendererOptions = {}) {\n this.store = store;\n this.board = board;\n this.theme = options.theme ?? DEFAULT_THEME_2D;\n this.unsubscribe = store.subscribe((next, prev) => this.applyDiff(prev, next));\n // Render state hiện tại (vd LOAD chạy trước khi subscribe).\n this.applyDiff(undefined, store.getState());\n }\n\n private ctx(): RenderCtx {\n return {\n jxg: this.board,\n resolveRef: (id: string) => {\n // Synthetic \"<polyId>:border:<N>\" → polygon.borders[N]. Polygon edges\n // là sub-segment do JSXGraph auto-tạo bên trong polygon; chúng không\n // có scene id riêng. Synthetic id cho phép construct tools (vd\n // perpendicular qua một cạnh đa giác) tham chiếu cạnh như một line.\n const m = /^(.+):border:(\\d+)$/.exec(id);\n if (m) {\n const poly = this.elements.get(m[1]) as { borders?: unknown[] } | undefined;\n if (!poly) throw new Error(`[scene/2d] resolveRef: chưa render polygon id=\"${m[1]}\"`);\n const borders = poly.borders;\n const idx = parseInt(m[2], 10);\n if (!Array.isArray(borders) || !borders[idx]) {\n throw new Error(`[scene/2d] resolveRef: polygon \"${m[1]}\" không có border[${idx}]`);\n }\n return borders[idx];\n }\n const el = this.elements.get(id);\n if (!el) throw new Error(`[scene/2d] resolveRef: chưa render id=\"${id}\"`);\n return el;\n },\n defaults: { theme: this.theme, _functionExpr: this.functionExpr },\n paramMap: this.paramMap,\n };\n }\n\n /**\n * Rebuild `paramMap` và `functionExpr` từ state hiện tại.\n * Chỉ chạy khi domain='graph2d'. Chi phí thấp vì parameters thường ≤ 8.\n */\n private rebuildGraphMaps(state: State): void {\n if (state.meta.domain !== 'graph2d') return;\n const params: Record<string, number> = {};\n const fns: Record<string, string> = {};\n for (const id of state.order) {\n const obj = state.objects[id];\n if (obj.kind === 'parameter') {\n params[obj.label] = (obj.attrs as { value: number }).value;\n } else if (obj.kind === 'function2d') {\n fns[obj.id] = (obj.attrs as { expression: string }).expression;\n }\n }\n this.paramMap = params;\n this.functionExpr = fns;\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 this.attachFreePointDragSync(obj, el);\n this.attachGliderDragSync(obj, el);\n } catch (err) {\n console.warn(`[scene/render/2d] không render được ${obj.kind} id=\"${obj.id}\":`, err);\n }\n }\n\n /**\n * Sync vị trí glider của 3 constraint mới (onPerpendicular / onPerpBisector /\n * onCircleAroundPoint) — kéo → recompute t/theta dựa trên ref points + vị trí\n * glider hiện tại → UPDATE_ATTRS. Không đụng onLine/onSegment/onCircle hiện\n * tại (giữ behavior cũ).\n */\n private attachGliderDragSync(obj: SceneObject, el: unknown): void {\n if (obj.kind !== 'point') return;\n const c = (obj.attrs as { constraint?: { kind?: string } }).constraint as\n | { kind: string; [k: string]: unknown }\n | undefined;\n if (!c) return;\n if (\n c.kind !== 'onPerpendicular' &&\n c.kind !== 'onPerpBisector' &&\n c.kind !== 'onCircleAroundPoint'\n ) {\n return;\n }\n\n const point = el as { on?: (ev: string, cb: () => void) => void; X?: () => number; Y?: () => number };\n if (typeof point.on !== 'function') return;\n const sceneId = obj.id;\n\n point.on('up', () => {\n if (this.disposed) return;\n const cur = this.store.getState().objects[sceneId];\n if (!cur) return;\n const curC = (cur.attrs as { constraint?: { kind?: string; [k: string]: unknown } }).constraint as\n | { kind: string; [k: string]: unknown }\n | undefined;\n if (!curC) return;\n if (typeof point.X !== 'function' || typeof point.Y !== 'function') return;\n const x = point.X();\n const y = point.Y();\n if (!Number.isFinite(x) || !Number.isFinite(y)) return;\n\n if (curC.kind === 'onPerpendicular') {\n const T = this.elements.get(curC.through as string) as { X: () => number; Y: () => number } | null;\n const A = this.elements.get(curC.perpToA as string) as { X: () => number; Y: () => number } | null;\n const B = this.elements.get(curC.perpToB as string) as { X: () => number; Y: () => number } | null;\n if (!T || !A || !B) return;\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 newT = (x - T.X()) * ux + (y - T.Y()) * uy;\n if (Math.abs(newT - (curC.t as number)) < 1e-9) return;\n this.store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: sceneId, patch: { constraint: { ...curC, t: newT } } },\n });\n return;\n }\n\n if (curC.kind === 'onPerpBisector') {\n const A = this.elements.get(curC.p1 as string) as { X: () => number; Y: () => number } | null;\n const B = this.elements.get(curC.p2 as string) as { X: () => number; Y: () => number } | null;\n if (!A || !B) return;\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 newT = (x - Mx) * ux + (y - My) * uy;\n if (Math.abs(newT - (curC.t as number)) < 1e-9) return;\n this.store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: sceneId, patch: { constraint: { ...curC, t: newT } } },\n });\n return;\n }\n\n if (curC.kind === 'onCircleAroundPoint') {\n const C = this.elements.get(curC.center as string) as { X: () => number; Y: () => number } | null;\n if (!C) return;\n const newTheta = Math.atan2(y - C.Y(), x - C.X());\n if (Math.abs(newTheta - (curC.theta as number)) < 1e-9) return;\n this.store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: sceneId, patch: { constraint: { ...curC, theta: newTheta } } },\n });\n return;\n }\n });\n }\n\n /**\n * Đồng bộ toạ độ live của free point về scene.constraint khi user kéo bằng\n * tay (Move tool / mobile drag). JSXGraph mutate obj.X()/Y() ngay nhưng\n * constraint vẫn giữ giá trị lúc tạo → serialize sẽ ra SVG y hệt cũ →\n * fileId SHA-256 trùng → Excalidraw bỏ qua refresh. (Regression từ\n * commit f41f366 sau scene v2 port.)\n *\n * Chỉ áp dụng cho free point — glider/intersection/midpoint không drag được\n * trực tiếp (toạ độ derived từ ref khác).\n */\n private attachFreePointDragSync(obj: SceneObject, el: unknown): void {\n if (obj.kind !== 'point') return;\n const c = (obj.attrs as { constraint?: { kind?: string } }).constraint;\n if (!c || c.kind !== 'free') return;\n \n const point = el as any;\n if (typeof point.on !== 'function') return;\n const sceneId = obj.id;\n point.on('up', () => {\n if (this.disposed) return;\n if (typeof point.X !== 'function' || typeof point.Y !== 'function') return;\n const x = point.X();\n const y = point.Y();\n if (!Number.isFinite(x) || !Number.isFinite(y)) return;\n const cur = this.store.getState().objects[sceneId];\n if (!cur) return;\n const curC = (cur.attrs as { constraint?: { kind?: string; x?: number; y?: number } }).constraint;\n if (!curC || curC.kind !== 'free') return;\n if (curC.x === x && curC.y === y) return;\n this.store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: sceneId, patch: { constraint: { kind: 'free', x, y } } },\n });\n });\n }\n\n private remove(id: string): void {\n // Selection halo (nếu có) phải bị xoá TRƯỚC element gốc — halo tham chiếu\n // tới point1/point2/center/vertices của element gốc qua lambda; xoá element\n // gốc trước sẽ làm halo dangling.\n this.removeHalo(id);\n this.selectedIds.delete(id);\n const el = this.elements.get(id);\n if (!el) return;\n try {\n const helpers = (el as Record<string, unknown>)._helpers;\n // Element chính bị remove trước, sau đó helpers (glider phụ trợ cho\n // tangent ...). Helpers thường là parent của element chính — nếu xoá\n // parent trước, JSXGraph có thể phàn nàn dangling reference.\n (this.board as { removeObject?: (e: unknown) => void }).removeObject?.(el);\n if (Array.isArray(helpers)) {\n for (const h of helpers) {\n try {\n (this.board as { removeObject?: (e: unknown) => void }).removeObject?.(h);\n } catch { /* ignore */ }\n }\n }\n } catch (err) {\n console.warn(`[scene/render/2d] không remove được id=\"${id}\":`, err);\n }\n this.elements.delete(id);\n }\n\n private applyDiff(prev: State | undefined, next: State): void {\n if (this.disposed) return;\n\n // Rebuild paramMap + functionExpr TRƯỚC khi diff, để ctx() có đúng\n // paramMap khi render lần đầu tiên.\n this.rebuildGraphMaps(next);\n\n const prevObjs = prev?.objects ?? {};\n const nextObjs = next.objects;\n\n // Xoá ids biến mất.\n for (const id of Object.keys(prevObjs)) {\n if (!(id in nextObjs)) this.remove(id);\n }\n\n // Thêm/cập nhật theo state.order — đảm bảo refs có trước.\n for (const id of next.order) {\n const cur = nextObjs[id];\n const old = prevObjs[id] as SceneObject | undefined;\n if (!old) {\n this.create(cur);\n continue;\n }\n if (Object.is(old, cur)) continue;\n const def = getKind(cur.kind);\n const existing = this.elements.get(id);\n if (def.update && existing) {\n try { def.update(cur, old, this.ctx(), existing); continue; }\n catch (err) { console.warn(`[scene/render/2d] update fail, recreate:`, err); }\n }\n this.remove(id);\n this.create(cur);\n }\n\n // Sau diff bình thường: nếu domain='graph2d', detect parameter value changes\n // và force re-render các function2d phụ thuộc.\n if (next.meta.domain === 'graph2d' && prev) {\n const changedParams = new Set<string>();\n for (const id of next.order) {\n const cur = next.objects[id];\n const old = prev.objects[id] as SceneObject | undefined;\n if (cur.kind !== 'parameter' || old?.kind !== 'parameter') continue;\n if ((cur.attrs as { value: number }).value !== (old.attrs as { value: number }).value) {\n changedParams.add(cur.label);\n }\n }\n if (changedParams.size > 0) {\n for (const id of next.order) {\n const obj = next.objects[id];\n if (obj.kind !== 'function2d') continue;\n const expr = (obj.attrs as { expression: string }).expression;\n const refs = collectFreeVars(expr);\n if (refs.some((r) => changedParams.has(r))) {\n this.remove(id);\n this.create(obj);\n }\n }\n }\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.unsubscribe();\n for (const id of Array.from(this.elements.keys())) this.remove(id);\n this.disposed = true;\n }\n\n /** Return the rendered JSXGraph element for a scene id, or null if not found. */\n getElement(id: string): unknown {\n return this.elements.get(id) ?? null;\n }\n\n /** Return a read-only view of the scene id → JSXGraph element map (for hit-test). */\n listElements(): Map<string, unknown> {\n return this.elements;\n }\n\n // Selection halo overlay model: thay vì đổi màu element gốc thành đỏ, tạo\n // một halo element gray phía sau (lower layer) → giữ nguyên màu gốc. Hỗ\n // trợ multi-select cho cả canvas click-selection lẫn ObjectListPanel.\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 // Remove halos cho ids đã bị bỏ chọn.\n for (const id of this.selectedIds) {\n if (!newIds.has(id)) this.removeHalo(id);\n }\n // Add halos cho ids mới chọ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.board 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 board = this.board as { removeObject?: (e: unknown) => void };\n for (const h of halos) {\n try { board.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 X?: () => number;\n Y?: () => number;\n point1?: unknown;\n point2?: unknown;\n center?: unknown;\n Radius?: () => number;\n vertices?: unknown[];\n }\n | undefined;\n if (!el) return;\n const board = this.board as {\n create?: (kind: string, parents: unknown[], attrs?: unknown) => unknown;\n };\n if (!board.create) return;\n\n // Selection palette — gray fill + darker gray border (xem\n // tham chiếu /tmp/ss.png).\n const SEL_STROKE = '#475569'; // slate-600\n const SEL_FILL = '#cbd5e1'; // slate-300\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 layer: 4,\n needsRegularUpdate: true,\n };\n const halos: unknown[] = [];\n try {\n switch (el.elType) {\n case 'point':\n case 'glider':\n case 'intersection': {\n const baseSize = (el.getAttribute?.('size') as number | undefined) ?? 4;\n const halo = board.create('point', [\n () => el.X?.() ?? 0,\n () => el.Y?.() ?? 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 break;\n }\n case 'segment': {\n if (el.point1 && el.point2) {\n const halo = board.create('segment', [el.point1, el.point2], {\n ...haloBase,\n strokeWidth: 9,\n straightFirst: false,\n straightLast: false,\n });\n halos.push(halo);\n }\n break;\n }\n case 'line':\n case 'arrow':\n case 'ray':\n case 'vector':\n case 'tangent':\n case 'normal':\n case 'parallel':\n case 'perpendicular':\n case 'bisector': {\n if (el.point1 && el.point2) {\n const halo = board.create('line', [el.point1, el.point2], {\n ...haloBase,\n strokeWidth: 9,\n });\n halos.push(halo);\n }\n break;\n }\n case 'circle': {\n if (el.center && typeof el.Radius === 'function') {\n const halo = board.create('circle', [el.center, () => el.Radius?.() ?? 0], {\n ...haloBase,\n strokeWidth: 9,\n fillOpacity: 0,\n });\n halos.push(halo);\n }\n break;\n }\n case 'polygon': {\n if (Array.isArray(el.vertices) && el.vertices.length >= 3) {\n // JSXGraph polygon.vertices có thể append vertex đầu lặp lại ở\n // cuối để đóng path — trim cho an toàn.\n const last = el.vertices.length - 1;\n const verts = el.vertices[last] === el.vertices[0]\n ? el.vertices.slice(0, last)\n : el.vertices.slice();\n const halo = board.create('polygon', verts, {\n ...haloBase,\n fillOpacity: 0.2,\n borders: {\n strokeColor: SEL_STROKE,\n strokeWidth: 7,\n strokeOpacity: 0.55,\n highlight: false,\n },\n });\n halos.push(halo);\n }\n break;\n }\n default:\n // Các kind khác (curve, arc, sector, angle, ...) — chưa hỗ trợ halo.\n break;\n }\n } catch (err) {\n console.warn('[scene/render/2d] halo create fail:', err);\n }\n if (halos.length) this.haloMap.set(id, halos);\n }\n}\n"]}
|