@xom11/whiteboard 0.30.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/ai.d.mts +226 -32
  2. package/dist/ai.d.ts +226 -32
  3. package/dist/ai.js +5126 -351
  4. package/dist/ai.js.map +1 -1
  5. package/dist/ai.mjs +4970 -352
  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-XVVLT6B3.mjs → chunk-BMYC2ILT.mjs} +4 -4
  11. package/dist/{chunk-XVVLT6B3.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-SF3U7ZF4.mjs → chunk-DWIEVCGK.mjs} +180 -15
  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-QGNU34T7.mjs → chunk-QLQ4MJNO.mjs} +10 -4
  33. package/dist/chunk-QLQ4MJNO.mjs.map +1 -0
  34. package/dist/{chunk-BU5KLO3P.mjs → chunk-T3N4BSJV.mjs} +4 -4
  35. package/dist/{chunk-BU5KLO3P.mjs.map → chunk-T3N4BSJV.mjs.map} +1 -1
  36. package/dist/{chunk-5JM35CXV.mjs → chunk-TMRFSOM7.mjs} +4 -4
  37. package/dist/{chunk-5JM35CXV.mjs.map → chunk-TMRFSOM7.mjs.map} +1 -1
  38. package/dist/geometry-2d.d.mts +1 -1
  39. package/dist/geometry-2d.d.ts +1 -1
  40. package/dist/geometry-2d.js +449 -172
  41. package/dist/geometry-2d.js.map +1 -1
  42. package/dist/geometry-2d.mjs +5 -5
  43. package/dist/geometry-3d.d.mts +1 -1
  44. package/dist/geometry-3d.d.ts +1 -1
  45. package/dist/geometry-3d.js +172 -22
  46. package/dist/geometry-3d.js.map +1 -1
  47. package/dist/geometry-3d.mjs +4 -4
  48. package/dist/graph-2d.d.mts +1 -1
  49. package/dist/graph-2d.d.ts +1 -1
  50. package/dist/graph-2d.js +307 -100
  51. package/dist/graph-2d.js.map +1 -1
  52. package/dist/graph-2d.mjs +7 -7
  53. package/dist/{host-HOSJHQ5H.mjs → host-4FIUNIDQ.mjs} +13 -12
  54. package/dist/host-4FIUNIDQ.mjs.map +1 -0
  55. package/dist/{host-2ISGVO7O.mjs → host-4ZB4XD4S.mjs} +9 -8
  56. package/dist/host-4ZB4XD4S.mjs.map +1 -0
  57. package/dist/{host-ZQCDAT6O.mjs → host-H2IGOKJU.mjs} +3 -3
  58. package/dist/{host-ZQCDAT6O.mjs.map → host-H2IGOKJU.mjs.map} +1 -1
  59. package/dist/{host-3UFGFMJ2.mjs → host-KMWP7KBT.mjs} +90 -43
  60. package/dist/host-KMWP7KBT.mjs.map +1 -0
  61. package/dist/index.d.mts +2 -2
  62. package/dist/index.d.ts +2 -2
  63. package/dist/index.js +453 -174
  64. package/dist/index.js.map +1 -1
  65. package/dist/index.mjs +21 -21
  66. package/dist/latex.d.mts +1 -1
  67. package/dist/latex.d.ts +1 -1
  68. package/dist/latex.js +8 -2
  69. package/dist/latex.js.map +1 -1
  70. package/dist/latex.mjs +1 -1
  71. package/dist/render-NMS7OAV6.mjs +10 -0
  72. package/dist/{render-ZX2O2IK7.mjs.map → render-NMS7OAV6.mjs.map} +1 -1
  73. package/dist/serialize-PGHQZEPV.mjs +9 -0
  74. package/dist/{serialize-N4G6RFBB.mjs.map → serialize-PGHQZEPV.mjs.map} +1 -1
  75. package/dist/{types-C3FjpoUi.d.ts → types-tePd94vW.d.mts} +8 -0
  76. package/dist/{types-C3FjpoUi.d.mts → types-tePd94vW.d.ts} +8 -0
  77. package/package.json +1 -1
  78. package/dist/chunk-H22OZYTW.mjs.map +0 -1
  79. package/dist/chunk-IHUFOV7L.mjs.map +0 -1
  80. package/dist/chunk-QGNU34T7.mjs.map +0 -1
  81. package/dist/chunk-SF3U7ZF4.mjs.map +0 -1
  82. package/dist/chunk-SZDAS7LK.mjs.map +0 -1
  83. package/dist/chunk-ZTQBUKLJ.mjs.map +0 -1
  84. package/dist/host-2ISGVO7O.mjs.map +0 -1
  85. package/dist/host-3UFGFMJ2.mjs.map +0 -1
  86. package/dist/host-HOSJHQ5H.mjs.map +0 -1
  87. package/dist/render-ZX2O2IK7.mjs +0 -10
  88. package/dist/serialize-N4G6RFBB.mjs +0 -9
@@ -122,6 +122,8 @@ var freeModule = defineModule({
122
122
  y: z.number().finite()
123
123
  }),
124
124
  collectRefs: () => [],
125
+ refSpecs: [],
126
+ // không có ref — khai rỗng để registry-handled tường minh
125
127
  emit: (e, ctx) => [{
126
128
  role: "primary",
127
129
  object: emitPointObject(ctx.resolveId(e.name), e.name, { kind: "free", x: e.x, y: e.y })
@@ -140,6 +142,10 @@ var midpointModule = defineModule({
140
142
  visible: z.boolean().optional()
141
143
  }),
142
144
  collectRefs: (e) => [e.p1, e.p2],
145
+ refSpecs: [
146
+ { field: "p1", role: "point" },
147
+ { field: "p2", role: "point" }
148
+ ],
143
149
  emit: (e, ctx) => [{
144
150
  role: "primary",
145
151
  object: emitPointObject(
@@ -150,6 +156,29 @@ var midpointModule = defineModule({
150
156
  )
151
157
  }]
152
158
  });
159
+ var onPerpBisectorModule = defineModule({
160
+ kind: "onPerpBisector",
161
+ role: "point",
162
+ category: "points",
163
+ prefix: "p",
164
+ schema: z.object({
165
+ name: NameZ,
166
+ kind: z.literal("onPerpBisector"),
167
+ p1: NameZ,
168
+ p2: NameZ,
169
+ t: z.number().optional()
170
+ }),
171
+ collectRefs: (e) => [e.p1, e.p2],
172
+ emit: (e, ctx) => [{
173
+ role: "primary",
174
+ object: emitPointObject(ctx.resolveId(e.name), e.name, {
175
+ kind: "onPerpBisector",
176
+ p1: ctx.resolveId(e.p1),
177
+ p2: ctx.resolveId(e.p2),
178
+ t: e.t ?? 3
179
+ })
180
+ }]
181
+ });
153
182
  var onSegmentModule = defineModule({
154
183
  kind: "onSegment",
155
184
  role: "point",
@@ -162,6 +191,7 @@ var onSegmentModule = defineModule({
162
191
  t: z.number().min(0).max(1)
163
192
  }),
164
193
  collectRefs: (e) => [e.segmentId],
194
+ refSpecs: [{ field: "segmentId", role: "segment" }],
165
195
  emit: (e, ctx) => [{
166
196
  role: "primary",
167
197
  object: emitPointObject(
@@ -183,6 +213,7 @@ var onLineModule = defineModule({
183
213
  t: z.number().finite()
184
214
  }),
185
215
  collectRefs: (e) => [e.lineId],
216
+ refSpecs: [{ field: "lineId", role: "line-like" }],
186
217
  emit: (e, ctx) => [{
187
218
  role: "primary",
188
219
  object: emitPointObject(
@@ -204,6 +235,7 @@ var onCircleModule = defineModule({
204
235
  theta: z.number().finite()
205
236
  }),
206
237
  collectRefs: (e) => [e.circleId],
238
+ refSpecs: [{ field: "circleId", role: "circle" }],
207
239
  emit: (e, ctx) => [{
208
240
  role: "primary",
209
241
  object: emitPointObject(
@@ -225,6 +257,10 @@ var perpFootModule = defineModule({
225
257
  onLine: NameZ
226
258
  }),
227
259
  collectRefs: (e) => [e.from, e.onLine],
260
+ refSpecs: [
261
+ { field: "from", role: "point" },
262
+ { field: "onLine", role: "line-like" }
263
+ ],
228
264
  emit: (e, ctx) => [{
229
265
  role: "primary",
230
266
  object: emitPointObject(
@@ -245,6 +281,7 @@ var circumcenterModule = defineModule({
245
281
  vertices: z.tuple([NameZ, NameZ, NameZ])
246
282
  }),
247
283
  collectRefs: (e) => [...e.vertices],
284
+ refSpecs: [{ field: "vertices", role: "point", many: true }],
248
285
  emit: (e, ctx) => [{
249
286
  role: "primary",
250
287
  object: emitPointObject(
@@ -265,6 +302,7 @@ var incenterModule = defineModule({
265
302
  vertices: z.tuple([NameZ, NameZ, NameZ])
266
303
  }),
267
304
  collectRefs: (e) => [...e.vertices],
305
+ refSpecs: [{ field: "vertices", role: "point", many: true }],
268
306
  emit: (e, ctx) => [{
269
307
  role: "primary",
270
308
  object: emitPointObject(
@@ -285,6 +323,7 @@ var centroidModule = defineModule({
285
323
  vertices: z.tuple([NameZ, NameZ, NameZ])
286
324
  }),
287
325
  collectRefs: (e) => [...e.vertices],
326
+ refSpecs: [{ field: "vertices", role: "point", many: true }],
288
327
  emit: (e, ctx) => [{
289
328
  role: "primary",
290
329
  object: emitPointObject(
@@ -305,6 +344,7 @@ var orthocenterModule = defineModule({
305
344
  vertices: z.tuple([NameZ, NameZ, NameZ])
306
345
  }),
307
346
  collectRefs: (e) => [...e.vertices],
347
+ refSpecs: [{ field: "vertices", role: "point", many: true }],
308
348
  emit: (e, ctx) => [{
309
349
  role: "primary",
310
350
  object: emitPointObject(
@@ -327,6 +367,10 @@ var intersectionModule = defineModule({
327
367
  branch: z.union([z.literal(0), z.literal(1)]).optional()
328
368
  }),
329
369
  collectRefs: (e) => [e.ref1, e.ref2],
370
+ refSpecs: [
371
+ { field: "ref1", role: "line-or-circle" },
372
+ { field: "ref2", role: "line-or-circle" }
373
+ ],
330
374
  emit: (e, ctx) => {
331
375
  const r1IsCircle = ctx.hintOf(e.ref1) === "circle";
332
376
  const r2IsCircle = ctx.hintOf(e.ref2) === "circle";
@@ -366,6 +410,10 @@ var segmentModule = defineModule({
366
410
  p2: NameZ
367
411
  }),
368
412
  collectRefs: (e) => [e.p1, e.p2],
413
+ refSpecs: [
414
+ { field: "p1", role: "point" },
415
+ { field: "p2", role: "point" }
416
+ ],
369
417
  emit: (e, ctx) => [{
370
418
  role: "primary",
371
419
  object: {
@@ -389,6 +437,10 @@ var lineModule = defineModule({
389
437
  p2: NameZ
390
438
  }),
391
439
  collectRefs: (e) => [e.p1, e.p2],
440
+ refSpecs: [
441
+ { field: "p1", role: "point" },
442
+ { field: "p2", role: "point" }
443
+ ],
392
444
  emit: (e, ctx) => [{
393
445
  role: "primary",
394
446
  object: {
@@ -412,6 +464,10 @@ var rayModule = defineModule({
412
464
  through: NameZ
413
465
  }),
414
466
  collectRefs: (e) => [e.origin, e.through],
467
+ refSpecs: [
468
+ { field: "origin", role: "point" },
469
+ { field: "through", role: "point" }
470
+ ],
415
471
  emit: (e, ctx) => [{
416
472
  role: "primary",
417
473
  object: {
@@ -435,6 +491,10 @@ var perpendicularModule = defineModule({
435
491
  toLine: NameZ
436
492
  }),
437
493
  collectRefs: (e) => [e.throughPoint, e.toLine],
494
+ refSpecs: [
495
+ { field: "throughPoint", role: "point" },
496
+ { field: "toLine", role: "line-like" }
497
+ ],
438
498
  emit: (e, ctx) => [{
439
499
  role: "primary",
440
500
  object: {
@@ -464,6 +524,10 @@ var parallelModule = defineModule({
464
524
  toLine: NameZ
465
525
  }),
466
526
  collectRefs: (e) => [e.throughPoint, e.toLine],
527
+ refSpecs: [
528
+ { field: "throughPoint", role: "point" },
529
+ { field: "toLine", role: "line-like" }
530
+ ],
467
531
  emit: (e, ctx) => [{
468
532
  role: "primary",
469
533
  object: {
@@ -493,6 +557,10 @@ var perpBisectorModule = defineModule({
493
557
  p2: NameZ
494
558
  }),
495
559
  collectRefs: (e) => [e.p1, e.p2],
560
+ refSpecs: [
561
+ { field: "p1", role: "point" },
562
+ { field: "p2", role: "point" }
563
+ ],
496
564
  emit: (e, ctx) => [{
497
565
  role: "primary",
498
566
  object: {
@@ -523,6 +591,11 @@ var angleBisectorModule = defineModule({
523
591
  p2: NameZ
524
592
  }),
525
593
  collectRefs: (e) => [e.p1, e.vertex, e.p2],
594
+ refSpecs: [
595
+ { field: "p1", role: "point" },
596
+ { field: "vertex", role: "point" },
597
+ { field: "p2", role: "point" }
598
+ ],
526
599
  emit: (e, ctx) => [{
527
600
  role: "primary",
528
601
  object: {
@@ -615,6 +688,10 @@ var tangentModule = defineModule({
615
688
  branch: z.union([z.literal(0), z.literal(1), z.literal("on")]).optional()
616
689
  }),
617
690
  collectRefs: (e) => [e.throughPoint, e.toCircle],
691
+ refSpecs: [
692
+ { field: "throughPoint", role: "point" },
693
+ { field: "toCircle", role: "circle" }
694
+ ],
618
695
  emit: (e, ctx) => {
619
696
  const construction = {
620
697
  kind: "tangent",
@@ -645,6 +722,7 @@ var polygonModule = defineModule({
645
722
  vertices: z.array(NameZ).min(3)
646
723
  }),
647
724
  collectRefs: (e) => [...e.vertices],
725
+ refSpecs: [{ field: "vertices", role: "point", many: true }],
648
726
  emit: (e, ctx) => [{
649
727
  role: "primary",
650
728
  object: {
@@ -669,6 +747,10 @@ var circleCPModule = defineModule({
669
747
  visible: z.boolean().optional()
670
748
  }),
671
749
  collectRefs: (e) => [e.center, e.surfacePoint],
750
+ refSpecs: [
751
+ { field: "center", role: "point" },
752
+ { field: "surfacePoint", role: "point" }
753
+ ],
672
754
  emit: (e, ctx) => [{
673
755
  role: "primary",
674
756
  object: {
@@ -694,6 +776,11 @@ var circle3Module = defineModule({
694
776
  p3: NameZ
695
777
  }),
696
778
  collectRefs: (e) => [e.p1, e.p2, e.p3],
779
+ refSpecs: [
780
+ { field: "p1", role: "point" },
781
+ { field: "p2", role: "point" },
782
+ { field: "p3", role: "point" }
783
+ ],
697
784
  emit: (e, ctx) => [{
698
785
  role: "primary",
699
786
  object: {
@@ -998,9 +1085,30 @@ var arcMidpointModule = defineModule({
998
1085
  circle: NameZ,
999
1086
  a: NameZ,
1000
1087
  b: NameZ,
1001
- notContaining: NameZ
1088
+ // Đúng 1 trong notContaining / containing — bất biến cứng kiểm ở
1089
+ // scene-constraint validate (không .refine vì registry dựng
1090
+ // discriminatedUnion yêu cầu ZodObject thuần).
1091
+ notContaining: NameZ.optional(),
1092
+ containing: NameZ.optional()
1002
1093
  }),
1003
- collectRefs: (e) => [e.circle, e.a, e.b, e.notContaining],
1094
+ collectRefs: (e) => {
1095
+ const refs = [e.circle, e.a, e.b];
1096
+ const containment = e.notContaining ?? e.containing;
1097
+ if (containment) refs.push(containment);
1098
+ return refs;
1099
+ },
1100
+ // refSpecs động: notContaining/containing TỐI ĐA 1 — có thể không có (cung không mơ hồ).
1101
+ refSpecs: (e) => {
1102
+ const specs = [
1103
+ { field: "circle", role: "circle" },
1104
+ { field: "a", role: "point" },
1105
+ { field: "b", role: "point" }
1106
+ ];
1107
+ if (e.containing ?? e.notContaining) {
1108
+ specs.push({ field: e.containing ? "containing" : "notContaining", role: "point" });
1109
+ }
1110
+ return specs;
1111
+ },
1004
1112
  emit: (e, ctx) => [{
1005
1113
  role: "primary",
1006
1114
  object: emitPointObject(ctx.resolveId(e.name), e.name, {
@@ -1008,7 +1116,8 @@ var arcMidpointModule = defineModule({
1008
1116
  circle: ctx.resolveId(e.circle),
1009
1117
  a: ctx.resolveId(e.a),
1010
1118
  b: ctx.resolveId(e.b),
1011
- notContaining: ctx.resolveId(e.notContaining)
1119
+ // notContaining/containing optional: cung KHÔNG mơ hồ (nửa đường tròn) → bỏ cả hai.
1120
+ ...e.containing ? { containing: ctx.resolveId(e.containing) } : e.notContaining ? { notContaining: ctx.resolveId(e.notContaining) } : {}
1012
1121
  })
1013
1122
  }]
1014
1123
  });
@@ -1024,6 +1133,10 @@ var excenterModule = defineModule({
1024
1133
  opposite: NameZ
1025
1134
  }),
1026
1135
  collectRefs: (e) => [...e.vertices],
1136
+ refSpecs: [
1137
+ { field: "vertices", role: "point", many: true },
1138
+ { field: "opposite", role: "point" }
1139
+ ],
1027
1140
  emit: (e, ctx) => [{
1028
1141
  role: "primary",
1029
1142
  object: emitPointObject(ctx.resolveId(e.name), e.name, {
@@ -1033,6 +1146,27 @@ var excenterModule = defineModule({
1033
1146
  })
1034
1147
  }]
1035
1148
  });
1149
+ var mixtilinearPointModule = defineModule({
1150
+ kind: "mixtilinearPoint",
1151
+ role: "point",
1152
+ category: "points",
1153
+ prefix: "p",
1154
+ schema: z.object({
1155
+ name: NameZ,
1156
+ kind: z.literal("mixtilinearPoint"),
1157
+ vertices: z.tuple([NameZ, NameZ, NameZ]),
1158
+ which: z.union([z.literal("center"), z.literal("touch")])
1159
+ }),
1160
+ collectRefs: (e) => [...e.vertices],
1161
+ emit: (e, ctx) => [{
1162
+ role: "primary",
1163
+ object: emitPointObject(ctx.resolveId(e.name), e.name, {
1164
+ kind: "mixtilinearPoint",
1165
+ vertices: resolveTriangleVertices(ctx, e.vertices),
1166
+ which: e.which
1167
+ })
1168
+ }]
1169
+ });
1036
1170
  var reflectPointModule = defineModule({
1037
1171
  kind: "reflectPoint",
1038
1172
  role: "point",
@@ -1040,6 +1174,10 @@ var reflectPointModule = defineModule({
1040
1174
  prefix: "p",
1041
1175
  schema: z.object({ name: NameZ, kind: z.literal("reflectPoint"), of: NameZ, through: NameZ }),
1042
1176
  collectRefs: (e) => [e.of, e.through],
1177
+ refSpecs: [
1178
+ { field: "of", role: "point" },
1179
+ { field: "through", role: "point" }
1180
+ ],
1043
1181
  emit: (e, ctx) => [{
1044
1182
  role: "primary",
1045
1183
  object: emitPointObject(ctx.resolveId(e.name), e.name, {
@@ -1056,6 +1194,10 @@ var reflectLineModule = defineModule({
1056
1194
  prefix: "p",
1057
1195
  schema: z.object({ name: NameZ, kind: z.literal("reflectLine"), of: NameZ, through: NameZ }),
1058
1196
  collectRefs: (e) => [e.of, e.through],
1197
+ refSpecs: [
1198
+ { field: "of", role: "point" },
1199
+ { field: "through", role: "line-like" }
1200
+ ],
1059
1201
  emit: (e, ctx) => [{
1060
1202
  role: "primary",
1061
1203
  object: emitPointObject(ctx.resolveId(e.name), e.name, {
@@ -1097,12 +1239,25 @@ var pointAtDistanceModule = defineModule({
1097
1239
  const extra = d.kind === "circleRadius" ? [d.circle] : d.kind === "segmentLength" ? [d.p1, d.p2] : [];
1098
1240
  return [e.from, e.through, ...extra];
1099
1241
  },
1100
- // TODO(Mức 1 defer): distance.{circle,p1,p2} nested trong `distance` refSpec
1101
- // phẳng đọc top-level không với tới, validate riêng nếu cần. Hiện validate from/through.
1102
- refSpecs: [
1103
- { field: "from", role: "point" },
1104
- { field: "through", role: "point" }
1105
- ],
1242
+ // refSpecs động: distance.{circle,p1,p2} nested validate qua dotted path
1243
+ // ('distance.circle' runSpecs transpile/refs.ts đọc bằng reduce theo '.').
1244
+ refSpecs: (e) => {
1245
+ const base = [
1246
+ { field: "from", role: "point" },
1247
+ { field: "through", role: "point" }
1248
+ ];
1249
+ if (e.distance.kind === "circleRadius") {
1250
+ return [...base, { field: "distance.circle", role: "circle" }];
1251
+ }
1252
+ if (e.distance.kind === "segmentLength") {
1253
+ return [
1254
+ ...base,
1255
+ { field: "distance.p1", role: "point" },
1256
+ { field: "distance.p2", role: "point" }
1257
+ ];
1258
+ }
1259
+ return base;
1260
+ },
1106
1261
  emit: (e, ctx) => {
1107
1262
  const d = e.distance;
1108
1263
  const distance = d.kind === "circleRadius" ? withScaleOffset({ kind: "circleRadius", circle: ctx.resolveId(d.circle) }, d) : d.kind === "segmentLength" ? withScaleOffset({ kind: "segmentLength", p1: ctx.resolveId(d.p1), p2: ctx.resolveId(d.p2) }, d) : withScaleOffset({ kind: "literal", value: d.value }, d);
@@ -1122,6 +1277,7 @@ var pointAtDistanceModule = defineModule({
1122
1277
  var ALL_MODULES = [
1123
1278
  freeModule,
1124
1279
  midpointModule,
1280
+ onPerpBisectorModule,
1125
1281
  onSegmentModule,
1126
1282
  onLineModule,
1127
1283
  onCircleModule,
@@ -1158,6 +1314,7 @@ var ALL_MODULES = [
1158
1314
  // Cụm A points
1159
1315
  arcMidpointModule,
1160
1316
  excenterModule,
1317
+ mixtilinearPointModule,
1161
1318
  reflectPointModule,
1162
1319
  reflectLineModule,
1163
1320
  // Cụm B points
@@ -1294,8 +1451,11 @@ function serializePoint(obj, state) {
1294
1451
  };
1295
1452
  }
1296
1453
  case "arcMidpoint": {
1297
- const refs = resolveRefs([c.circle, c.a, c.b, c.notContaining], state);
1298
- if (!refs) return fail("unresolved-ref", `${c.circle},${c.a},${c.b},${c.notContaining}`);
1454
+ const containment = c.containing ?? c.notContaining;
1455
+ const baseRefs = [c.circle, c.a, c.b];
1456
+ if (containment) baseRefs.push(containment);
1457
+ const refs = resolveRefs(baseRefs, state);
1458
+ if (!refs) return fail("unresolved-ref", baseRefs.join(","));
1299
1459
  return {
1300
1460
  ok: true,
1301
1461
  entity: {
@@ -1304,7 +1464,7 @@ function serializePoint(obj, state) {
1304
1464
  circle: refs[0],
1305
1465
  a: refs[1],
1306
1466
  b: refs[2],
1307
- notContaining: refs[3]
1467
+ ...c.containing ? { containing: refs[3] } : c.notContaining ? { notContaining: refs[3] } : {}
1308
1468
  }
1309
1469
  };
1310
1470
  }
@@ -1348,6 +1508,7 @@ function serializePoint(obj, state) {
1348
1508
  case "onPerpendicular":
1349
1509
  case "onPerpBisector":
1350
1510
  case "onCircleAroundPoint":
1511
+ case "mixtilinearPoint":
1351
1512
  return fail("unsupported-constraint", c.kind);
1352
1513
  default: {
1353
1514
  return fail("unsupported-constraint");
@@ -1644,9 +1805,11 @@ function describeEntity(e) {
1644
1805
  return `${e.name} = \u0111\u01B0\u1EDDng tr\xF2n b\xE0ng ti\u1EBFp ${e.vertices.join("")} \u0111\u1ED1i di\u1EC7n ${e.opposite}`;
1645
1806
  // Cụm A
1646
1807
  case "arcMidpoint":
1647
- return `${e.name} = trung \u0111i\u1EC3m cung ${e.a}${e.b} (kh\xF4ng ch\u1EE9a ${e.notContaining}) tr\xEAn ${e.circle}`;
1808
+ return `${e.name} = trung \u0111i\u1EC3m cung ${e.a}${e.b}${e.containing || e.notContaining ? ` (${e.containing ? "ch\u1EE9a" : "kh\xF4ng ch\u1EE9a"} ${e.containing ?? e.notContaining})` : ""} tr\xEAn ${e.circle}`;
1648
1809
  case "excenter":
1649
1810
  return `${e.name} = t\xE2m b\xE0ng ti\u1EBFp ${e.vertices.join("")} \u0111\u1ED1i di\u1EC7n ${e.opposite}`;
1811
+ case "mixtilinearPoint":
1812
+ return `${e.name} = ${e.which === "center" ? "t\xE2m" : "ti\u1EBFp \u0111i\u1EC3m"} mixtilinear ${e.vertices.join("")}`;
1650
1813
  case "reflectPoint":
1651
1814
  return `${e.name} = \u0111\u1ED1i x\u1EE9ng ${e.of} qua \u0111i\u1EC3m ${e.through}`;
1652
1815
  case "reflectLine":
@@ -1657,6 +1820,8 @@ function describeEntity(e) {
1657
1820
  const distStr = d.kind === "circleRadius" ? `r(${d.circle})` : d.kind === "segmentLength" ? `|${d.p1}${d.p2}|` : `${d.value}`;
1658
1821
  return `${e.name} = \u0111i\u1EC3m tr\xEAn tia ${e.from}${e.through} c\xE1ch ${e.through} m\u1ED9t kho\u1EA3ng ${distStr}`;
1659
1822
  }
1823
+ case "onPerpBisector":
1824
+ return `${e.name} = \u0111i\u1EC3m tr\xEAn trung tr\u1EF1c ${e.p1}${e.p2}`;
1660
1825
  default: {
1661
1826
  return "";
1662
1827
  }
@@ -1675,5 +1840,5 @@ function describeDsl(obj, state) {
1675
1840
  }
1676
1841
 
1677
1842
  export { CIRCLE_KINDS, KIND_REGISTRY, LINE_LIKE_SHAPE_KINDS, POINT_KINDS, describeDsl, fileToImagePart, inferMediaType, validateFile };
1678
- //# sourceMappingURL=chunk-SF3U7ZF4.mjs.map
1679
- //# sourceMappingURL=chunk-SF3U7ZF4.mjs.map
1843
+ //# sourceMappingURL=chunk-DWIEVCGK.mjs.map
1844
+ //# sourceMappingURL=chunk-DWIEVCGK.mjs.map