@xom11/whiteboard 0.29.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.
Files changed (93) hide show
  1. package/dist/ai.d.mts +259 -33
  2. package/dist/ai.d.ts +259 -33
  3. package/dist/ai.js +5424 -470
  4. package/dist/ai.js.map +1 -1
  5. package/dist/ai.mjs +4971 -351
  6. package/dist/ai.mjs.map +1 -1
  7. package/dist/catalog.json +5 -5
  8. package/dist/{chunk-V3YJ6JFL.mjs → chunk-44JY2AKC.mjs} +3 -3
  9. package/dist/{chunk-V3YJ6JFL.mjs.map → chunk-44JY2AKC.mjs.map} +1 -1
  10. package/dist/{chunk-GEC2D2EQ.mjs → chunk-BMYC2ILT.mjs} +4 -4
  11. package/dist/{chunk-GEC2D2EQ.mjs.map → chunk-BMYC2ILT.mjs.map} +1 -1
  12. package/dist/{chunk-PPKHCRRE.mjs → chunk-C76SOFXF.mjs} +3 -3
  13. package/dist/{chunk-PPKHCRRE.mjs.map → chunk-C76SOFXF.mjs.map} +1 -1
  14. package/dist/{chunk-IHUFOV7L.mjs → chunk-CH6SFONH.mjs} +15 -3
  15. package/dist/chunk-CH6SFONH.mjs.map +1 -0
  16. package/dist/{chunk-E6EDOPGT.mjs → chunk-DWIEVCGK.mjs} +254 -16
  17. package/dist/chunk-DWIEVCGK.mjs.map +1 -0
  18. package/dist/{chunk-SZDAS7LK.mjs → chunk-IE2GGHNF.mjs} +131 -81
  19. package/dist/chunk-IE2GGHNF.mjs.map +1 -0
  20. package/dist/{chunk-ZTQBUKLJ.mjs → chunk-JJ4FPCBE.mjs} +142 -22
  21. package/dist/chunk-JJ4FPCBE.mjs.map +1 -0
  22. package/dist/{chunk-QRUAEXLR.mjs → chunk-K5BS2H56.mjs} +5 -5
  23. package/dist/{chunk-QRUAEXLR.mjs.map → chunk-K5BS2H56.mjs.map} +1 -1
  24. package/dist/{chunk-BNBOIDO5.mjs → chunk-K7VJU7LQ.mjs} +3 -3
  25. package/dist/{chunk-BNBOIDO5.mjs.map → chunk-K7VJU7LQ.mjs.map} +1 -1
  26. package/dist/{chunk-H22OZYTW.mjs → chunk-KOXOC2FI.mjs} +48 -39
  27. package/dist/chunk-KOXOC2FI.mjs.map +1 -0
  28. package/dist/{chunk-CXHNVYMD.mjs → chunk-KWDBVLST.mjs} +5 -5
  29. package/dist/{chunk-CXHNVYMD.mjs.map → chunk-KWDBVLST.mjs.map} +1 -1
  30. package/dist/{chunk-OQIQNKPQ.mjs → chunk-LTLLQUMN.mjs} +4 -4
  31. package/dist/{chunk-OQIQNKPQ.mjs.map → chunk-LTLLQUMN.mjs.map} +1 -1
  32. package/dist/chunk-QK6OVDLC.mjs +103 -0
  33. package/dist/chunk-QK6OVDLC.mjs.map +1 -0
  34. package/dist/{chunk-QGNU34T7.mjs → chunk-QLQ4MJNO.mjs} +10 -4
  35. package/dist/chunk-QLQ4MJNO.mjs.map +1 -0
  36. package/dist/{chunk-BU5KLO3P.mjs → chunk-T3N4BSJV.mjs} +4 -4
  37. package/dist/{chunk-BU5KLO3P.mjs.map → chunk-T3N4BSJV.mjs.map} +1 -1
  38. package/dist/{chunk-5JM35CXV.mjs → chunk-TMRFSOM7.mjs} +4 -4
  39. package/dist/{chunk-5JM35CXV.mjs.map → chunk-TMRFSOM7.mjs.map} +1 -1
  40. package/dist/geometry-2d.d.mts +1 -1
  41. package/dist/geometry-2d.d.ts +1 -1
  42. package/dist/geometry-2d.js +841 -204
  43. package/dist/geometry-2d.js.map +1 -1
  44. package/dist/geometry-2d.mjs +5 -5
  45. package/dist/geometry-3d.d.mts +1 -1
  46. package/dist/geometry-3d.d.ts +1 -1
  47. package/dist/geometry-3d.js +172 -22
  48. package/dist/geometry-3d.js.map +1 -1
  49. package/dist/geometry-3d.mjs +4 -4
  50. package/dist/graph-2d.d.mts +1 -1
  51. package/dist/graph-2d.d.ts +1 -1
  52. package/dist/graph-2d.js +307 -100
  53. package/dist/graph-2d.js.map +1 -1
  54. package/dist/graph-2d.mjs +7 -7
  55. package/dist/handleExtractProblem-BrDY9ifM.d.mts +58 -0
  56. package/dist/handleExtractProblem-BrDY9ifM.d.ts +58 -0
  57. package/dist/{host-HOSJHQ5H.mjs → host-4FIUNIDQ.mjs} +13 -12
  58. package/dist/host-4FIUNIDQ.mjs.map +1 -0
  59. package/dist/{host-2ISGVO7O.mjs → host-4ZB4XD4S.mjs} +9 -8
  60. package/dist/host-4ZB4XD4S.mjs.map +1 -0
  61. package/dist/{host-ZQCDAT6O.mjs → host-H2IGOKJU.mjs} +3 -3
  62. package/dist/{host-ZQCDAT6O.mjs.map → host-H2IGOKJU.mjs.map} +1 -1
  63. package/dist/{host-HKMZSCIT.mjs → host-KMWP7KBT.mjs} +286 -74
  64. package/dist/host-KMWP7KBT.mjs.map +1 -0
  65. package/dist/index.d.mts +3 -2
  66. package/dist/index.d.ts +3 -2
  67. package/dist/index.js +849 -206
  68. package/dist/index.js.map +1 -1
  69. package/dist/index.mjs +22 -21
  70. package/dist/index.mjs.map +1 -1
  71. package/dist/latex.d.mts +1 -1
  72. package/dist/latex.d.ts +1 -1
  73. package/dist/latex.js +8 -2
  74. package/dist/latex.js.map +1 -1
  75. package/dist/latex.mjs +1 -1
  76. package/dist/render-NMS7OAV6.mjs +10 -0
  77. package/dist/{render-ZX2O2IK7.mjs.map → render-NMS7OAV6.mjs.map} +1 -1
  78. package/dist/serialize-PGHQZEPV.mjs +9 -0
  79. package/dist/{serialize-N4G6RFBB.mjs.map → serialize-PGHQZEPV.mjs.map} +1 -1
  80. package/dist/{types-C3FjpoUi.d.ts → types-tePd94vW.d.mts} +8 -0
  81. package/dist/{types-C3FjpoUi.d.mts → types-tePd94vW.d.ts} +8 -0
  82. package/package.json +2 -1
  83. package/dist/chunk-E6EDOPGT.mjs.map +0 -1
  84. package/dist/chunk-H22OZYTW.mjs.map +0 -1
  85. package/dist/chunk-IHUFOV7L.mjs.map +0 -1
  86. package/dist/chunk-QGNU34T7.mjs.map +0 -1
  87. package/dist/chunk-SZDAS7LK.mjs.map +0 -1
  88. package/dist/chunk-ZTQBUKLJ.mjs.map +0 -1
  89. package/dist/host-2ISGVO7O.mjs.map +0 -1
  90. package/dist/host-HKMZSCIT.mjs.map +0 -1
  91. package/dist/host-HOSJHQ5H.mjs.map +0 -1
  92. package/dist/render-ZX2O2IK7.mjs +0 -10
  93. package/dist/serialize-N4G6RFBB.mjs +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../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-E6EDOPGT.mjs","sourcesContent":["// 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/stamps/geometry-2d/serialize.ts","../src/stamps/geometry-2d/autoFitBbox.ts","../src/stamps/geometry-2d/labelLayout.ts","../src/stamps/geometry-2d/render.ts","../src/stamps/geometry-2d/types.ts"],"names":[],"mappings":"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","file":"chunk-H22OZYTW.mjs","sourcesContent":["// src/stamps/geometry-2d/serialize.ts\n//\n// Sau Tier D PR 3: customData.jsonState chỉ chứa `JSON.stringify(state)`\n// (không còn envelope `{version, bbox, state, showAxis, showGrid}`).\n// View info (bbox/axis/grid) nằm trong `state.meta.view` (View2D shape).\n\nimport { serializeScene, deserializeScene } from '../shared/serializeScene';\nimport type { State, View2D } from '../../core/scene';\n\nexport function serializeBoard(state: State, view: View2D): string {\n const withView: State = {\n ...state,\n meta: { domain: '2d', version: state.meta.version, view },\n };\n return serializeScene(withView);\n}\n\nexport function deserializeBoard(raw: string): State {\n return deserializeScene('2d', raw);\n}\n","// Pure geometry helpers for auto-fitting an AI-generated figure into a viewport.\n//\n// Two concerns, both visual-quality fixes:\n// 1. Outlier-robust extent — a single far-flung point or an oversized circle\n// must not compress the main cluster into a sliver (eval cau-13, cau-04).\n// We use Tukey IQR fences per axis to trim statistical outliers.\n// 2. Aspect correction — the offscreen container is sized from the DEFAULT\n// square bbox, so the fitted bbox must be expanded to the same aspect or\n// JSXGraph's setBoundingBox stretches the units → circles become ellipses\n// (eval cau-08). We grow the shorter axis (never shrink) so everything in\n// the robust extent stays visible.\n\n/**\n * Robust [min, max] of a sample using Tukey fences (Q1 - k·IQR, Q3 + k·IQR).\n * Values outside the fence are dropped before taking min/max. With no outliers\n * this returns the raw [min, max]. For < 4 samples IQR is meaningless → raw range.\n */\nexport function robustRange(values: number[], k = 1.5): [number, number] {\n const n = values.length;\n if (n === 0) return [0, 0];\n const sorted = [...values].sort((a, b) => a - b);\n if (n < 4) return [sorted[0], sorted[n - 1]];\n const quantile = (p: number): number => {\n const idx = (n - 1) * p;\n const lo = Math.floor(idx);\n const hi = Math.ceil(idx);\n if (lo === hi) return sorted[lo];\n return sorted[lo] + (sorted[hi] - sorted[lo]) * (idx - lo);\n };\n const q1 = quantile(0.25);\n const q3 = quantile(0.75);\n const iqr = q3 - q1;\n const fenceLo = q1 - k * iqr;\n const fenceHi = q3 + k * iqr;\n let min = Infinity;\n let max = -Infinity;\n for (const v of sorted) {\n if (v < fenceLo || v > fenceHi) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [sorted[0], sorted[n - 1]];\n return [min, max];\n}\n\nexport interface CircleExtent {\n cx: number;\n cy: number;\n r: number;\n}\n\n// A circle whose radius exceeds this multiple of the point-cluster diagonal is\n// treated as an oversized outlier and excluded from the fit (it still draws,\n// just clipped). Keeps a normal circumcircle in-frame while preventing a single\n// degenerate giant circle from compressing the whole figure (eval cau-13).\nconst CIRCLE_MAX_FACTOR = 1.0;\n\n/**\n * Compute a JSXGraph bbox `[xmin, ymax, xmax, ymin]` fitted to the figure.\n *\n * Points are reduced to a robust extent via Tukey IQR fences (trims stray\n * intersection points that fly off to huge coords). Circles are included WHOLE\n * (never per-edge trimmed — a clipped circle looks broken) unless a circle is\n * egregiously larger than the point cluster, in which case it is excluded. The\n * result is padded and expanded to `aspect` (= container width / height) so\n * units stay square (round circles). Returns null when there is no geometry.\n */\nexport function computeAutoFitBbox(\n points: ReadonlyArray<readonly [number, number]>,\n circles: ReadonlyArray<CircleExtent>,\n aspect: number,\n padPct = 0.12,\n): [number, number, number, number] | null {\n const xs = points.map((p) => p[0]).filter(Number.isFinite);\n const ys = points.map((p) => p[1]).filter(Number.isFinite);\n\n let xmin = Infinity, xmax = -Infinity, ymin = Infinity, ymax = -Infinity;\n let clusterDiag = 0;\n if (xs.length >= 2 && ys.length >= 2) {\n [xmin, xmax] = robustRange(xs);\n [ymin, ymax] = robustRange(ys);\n clusterDiag = Math.hypot(xmax - xmin, ymax - ymin);\n }\n\n for (const c of circles) {\n if (!Number.isFinite(c.cx) || !Number.isFinite(c.cy) || !Number.isFinite(c.r)) continue;\n // Exclude an oversized circle only when we have a point cluster to compare to.\n if (clusterDiag > 0 && c.r > CIRCLE_MAX_FACTOR * clusterDiag) continue;\n xmin = Math.min(xmin, c.cx - c.r); xmax = Math.max(xmax, c.cx + c.r);\n ymin = Math.min(ymin, c.cy - c.r); ymax = Math.max(ymax, c.cy + c.r);\n }\n\n if (!Number.isFinite(xmin) || !Number.isFinite(xmax) || !Number.isFinite(ymin) || !Number.isFinite(ymax)) {\n return null;\n }\n let w = xmax - xmin;\n let h = ymax - ymin;\n\n // Degenerate (all coincident / fully collinear on one axis): floor to 1 unit.\n if (w < 0.5) { const cx = (xmin + xmax) / 2; xmin = cx - 0.5; xmax = cx + 0.5; w = 1; }\n if (h < 0.5) { const cy = (ymin + ymax) / 2; ymin = cy - 0.5; ymax = cy + 0.5; h = 1; }\n\n const padX = w * padPct;\n const padY = h * padPct;\n xmin -= padX; xmax += padX; ymin -= padY; ymax += padY;\n w = xmax - xmin; h = ymax - ymin;\n\n // Expand the shorter axis so width/height matches the container aspect.\n const curAspect = w / h;\n if (curAspect < aspect) {\n const newW = h * aspect;\n const cx = (xmin + xmax) / 2;\n xmin = cx - newW / 2; xmax = cx + newW / 2;\n } else if (curAspect > aspect) {\n const newH = w / aspect;\n const cy = (ymin + ymax) / 2;\n ymin = cy - newH / 2; ymax = cy + newH / 2;\n }\n\n return [xmin, ymax, xmax, ymin];\n}\n","// Anti-collision label placement for AI-generated figures.\n//\n// JSXGraph places every point label at a fixed [10,10] pixel offset (up-right).\n// When points cluster, labels overlap and overlap interior lines. We push each\n// label radially OUTWARD from the figure centroid: points on the left get a\n// left offset, points on the right get a right offset, etc. Offsets are in the\n// SAME sign convention as JSXGraph's label `offset` attribute (it negates the\n// y internally for screen space), so [dirX·R, dirY·R] in math coords maps\n// directly to a screen offset away from the centroid.\n\nexport interface LabeledPoint {\n id: string;\n x: number;\n y: number;\n}\n\nexport function radialLabelOffsets(\n points: LabeledPoint[],\n R = 14,\n): Map<string, [number, number]> {\n const out = new Map<string, [number, number]>();\n if (points.length < 2) return out;\n\n const cx = points.reduce((s, p) => s + p.x, 0) / points.length;\n const cy = points.reduce((s, p) => s + p.y, 0) / points.length;\n\n for (const p of points) {\n let dx = p.x - cx;\n let dy = p.y - cy;\n const len = Math.hypot(dx, dy);\n if (len < 1e-9) {\n // Point sits on the centroid → no meaningful direction; push up.\n dx = 0;\n dy = 1;\n } else {\n dx /= len;\n dy /= len;\n }\n out.set(p.id, [Math.round(dx * R), Math.round(dy * R)]);\n }\n return out;\n}\n","import { deserializeBoard } from './serialize';\nimport { paletteFor } from './editor/theme';\nimport { createStore } from '../../core/scene';\nimport { DEFAULT_VIEW_2D } from '../../core/scene/types';\nimport { JxgRenderer } from '../../core/scene/render/JxgRenderer';\nimport { renderJsxgOffscreen } from '../shared/jxgOffscreenRender';\nimport { computeAutoFitBbox } from './autoFitBbox';\nimport { radialLabelOffsets } from './labelLayout';\n\n/**\n * Re-render geometry SVG từ jsonState đã serialize. Dùng cho:\n * 1. Restore math-stamp file sau khi reload page (Excalidraw mất binary files).\n * 2. Generate SVG lúc INSERT (thay vì clone DOM với màu theo theme editor).\n *\n * LƯU Ý quan trọng — luôn dùng LIGHT palette (nét đậm). Excalidraw apply CSS\n * `filter: invert(93%) hue-rotate(180deg)` lên canvas trong dark mode → nét\n * đậm tự đảo thành sáng. Nếu ta bake nét sáng vào SVG cho dark mode, filter\n * sẽ đảo thành đậm → chìm vào nền tối. Giải pháp: luôn dùng nét đậm + để\n * Excalidraw tự lo invert.\n *\n * Implementation: tạo 1 div ẩn (off-screen, real dimensions để JSXGraph render\n * chuẩn), initBoard, replay creation log từ jsonState, dump SVG, dọn dẹp.\n *\n * Container dimensions phải MATCH aspect ratio của bbox (đã được editor lưu\n * sau khi JSXGraph adjust với keepAspectRatio:true). Trước đây hardcode\n * 400×300 + keepAspectRatio:false làm shape bị kéo dãn (circle thành ellipse,\n * góc vuông lệch) khi bbox không 4:3 → ảnh hiển thị khác với editor lúc\n * double-click. Fix: tính container W/H từ bbox + keepAspectRatio:true để\n * SVG output khớp với view trong editor.\n *\n * Lý do JXG.Options.text.display = 'internal': JSXGraph mặc định render\n * label bằng HTML <div> overlay → clone SVG export sẽ thiếu label.\n */\n\nconst PIXELS_PER_UNIT = 20;\nconst MIN_DIM = 100;\nconst MAX_DIM = 1200;\nconst FALLBACK_W = 400;\nconst FALLBACK_H = 300;\n\nexport function containerDimsForBbox(bbox: [number, number, number, number]): { width: number; height: number } {\n const [xmin, ymax, xmax, ymin] = bbox;\n const w = Math.abs(xmax - xmin);\n const h = Math.abs(ymax - ymin);\n if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) {\n return { width: FALLBACK_W, height: FALLBACK_H };\n }\n let width = w * PIXELS_PER_UNIT;\n let height = h * PIXELS_PER_UNIT;\n const maxAxis = Math.max(width, height);\n if (maxAxis > MAX_DIM) {\n const ratio = MAX_DIM / maxAxis;\n width *= ratio;\n height *= ratio;\n }\n const minAxis = Math.min(width, height);\n if (minAxis < MIN_DIM) {\n const ratio = MIN_DIM / minAxis;\n width *= ratio;\n height *= ratio;\n }\n return { width: Math.round(width), height: Math.round(height) };\n}\n\n/**\n * Auto-fit board bbox sau khi entities đã render. Thu thập toạ độ point + 4\n * điểm biên của mỗi circle, đưa qua `computeAutoFitBbox` (Tukey IQR trim\n * outlier + expand theo aspect container) rồi gọi setBoundingBox.\n *\n * Áp dụng khi state.meta.view.bbox còn là DEFAULT_VIEW_2D — i.e. AI-generated\n * figure chưa được editor zoom/pan. Stamp đã edit có bbox riêng của user, giữ\n * nguyên (consumer expectation: re-render khớp với view editor lúc save).\n *\n * `aspect` = container width/height. computeAutoFitBbox expand bbox về đúng\n * aspect này nên setBoundingBox (keepAspectRatio mặc định) cho units vuông →\n * circle tròn (không méo thành ellipse).\n */\nfunction autoFitBboxFromBoard(board: any, aspect: number): void {\n const objs = board?.objectsList;\n if (!Array.isArray(objs)) return;\n const points: [number, number][] = [];\n const circles: { cx: number; cy: number; r: number }[] = [];\n for (const o of objs) {\n // OBJECT_CLASS_POINT = 1\n if (o?.elementClass === 1 && typeof o.X === 'function' && typeof o.Y === 'function') {\n const x = o.X(), y = o.Y();\n if (Number.isFinite(x) && Number.isFinite(y)) points.push([x, y]);\n } else if (o?.elementClass === 3 && o.center?.X && typeof o.Radius === 'function') {\n // OBJECT_CLASS_CIRCLE\n const cx = o.center.X(), cy = o.center.Y(), r = o.Radius();\n if (Number.isFinite(cx) && Number.isFinite(cy) && Number.isFinite(r)) {\n circles.push({ cx, cy, r });\n }\n }\n }\n const bbox = computeAutoFitBbox(points, circles, aspect);\n if (!bbox) return;\n try {\n board.setBoundingBox(bbox);\n if (typeof board.update === 'function') board.update();\n if (typeof board.fullUpdate === 'function') board.fullUpdate();\n } catch { /* ignore */ }\n}\n\n/**\n * Đẩy label điểm ra xa centroid (radial) để giảm chồng nhãn. Chỉ chạy cho\n * AI-generated figure (shouldAutoFit) — stamp user-edit giữ layout nhãn mặc định.\n */\nfunction applyRadialLabelOffsets(board: any): void {\n const objs = board?.objectsList;\n if (!Array.isArray(objs)) return;\n const pts: { id: string; x: number; y: number; el: any }[] = [];\n for (const o of objs) {\n if (o?.elementClass === 1 && typeof o.X === 'function' && o.label) {\n const x = o.X(), y = o.Y();\n if (Number.isFinite(x) && Number.isFinite(y)) pts.push({ id: o.id, x, y, el: o });\n }\n }\n const offsets = radialLabelOffsets(pts.map((p) => ({ id: p.id, x: p.x, y: p.y })));\n if (offsets.size === 0) return;\n for (const p of pts) {\n const off = offsets.get(p.id);\n if (!off) continue;\n try { p.el.setAttribute({ label: { offset: off } }); } catch { /* ignore */ }\n }\n try {\n if (typeof board.update === 'function') board.update();\n } catch { /* ignore */ }\n}\n\nfunction isDefaultBbox(bbox: readonly number[]): boolean {\n const d = DEFAULT_VIEW_2D.bbox;\n return bbox.length === 4 && bbox[0] === d[0] && bbox[1] === d[1] && bbox[2] === d[2] && bbox[3] === d[3];\n}\n\nexport async function renderGeometrySvgFromState(jsonState: string): Promise<string> {\n const state = deserializeBoard(jsonState);\n const view = state.meta.domain === '2d' ? state.meta.view : DEFAULT_VIEW_2D;\n const bbox = view.bbox as [number, number, number, number];\n const shouldAutoFit = isDefaultBbox(bbox);\n // Stamps inserted vào Excalidraw canvas → luôn dùng light palette.\n // Excalidraw's THEME_FILTER tự đảo nét trong dark mode.\n const palette = paletteFor(false);\n const dims = containerDimsForBbox(bbox);\n const { svgString } = await renderJsxgOffscreen({\n bbox,\n dims,\n axis: view.showAxis,\n grid: view.showGrid,\n keepAspectRatio: true,\n applyOptions: (JXG) => {\n \n const opts = (JXG as any).Options;\n if (!opts) return;\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.text.strokeColor = palette.label;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n opts.label.strokeColor = palette.label;\n opts.axis = opts.axis || {};\n opts.axis.strokeColor = palette.axis;\n opts.grid = opts.grid || {};\n opts.grid.strokeColor = palette.grid;\n },\n setup: (board) => {\n const store = createStore(state);\n const renderer = new JxgRenderer(store, board);\n if (shouldAutoFit) {\n autoFitBboxFromBoard(board, dims.width / dims.height);\n applyRadialLabelOffsets(board);\n }\n return renderer;\n },\n });\n return svgString;\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface GeometryCustomData extends BaseStampCustomData {\n kind: 'geometry';\n version: 1;\n jsonState: string;\n}\n\nexport function isGeometryCustomData(data: unknown): data is GeometryCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<GeometryCustomData>;\n return d.kind === 'geometry' && d.version === 1 && typeof d.jsonState === 'string';\n}\n"]}
@@ -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/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"]}