@xom11/whiteboard 0.24.1 → 0.25.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 (85) hide show
  1. package/README.md +85 -12
  2. package/dist/ai.d.mts +472 -0
  3. package/dist/ai.d.ts +472 -0
  4. package/dist/ai.js +2156 -0
  5. package/dist/ai.js.map +1 -0
  6. package/dist/ai.mjs +1495 -0
  7. package/dist/ai.mjs.map +1 -0
  8. package/dist/catalog.json +4 -4
  9. package/dist/chunk-73Q7ADVL.mjs +35 -0
  10. package/dist/chunk-73Q7ADVL.mjs.map +1 -0
  11. package/dist/{chunk-BKSXPNPQ.mjs → chunk-AYSFWUPK.mjs} +4 -3
  12. package/dist/chunk-AYSFWUPK.mjs.map +1 -0
  13. package/dist/chunk-B4NJJZFR.mjs +18 -0
  14. package/dist/chunk-B4NJJZFR.mjs.map +1 -0
  15. package/dist/{chunk-LVNCYP4J.mjs → chunk-CJBLJUWG.mjs} +5 -5
  16. package/dist/{chunk-LVNCYP4J.mjs.map → chunk-CJBLJUWG.mjs.map} +1 -1
  17. package/dist/{chunk-YIPI3WUL.mjs → chunk-ESVPQWHX.mjs} +5 -5
  18. package/dist/{chunk-YIPI3WUL.mjs.map → chunk-ESVPQWHX.mjs.map} +1 -1
  19. package/dist/{chunk-IBTRMWD6.mjs → chunk-I24QOHPU.mjs} +3 -3
  20. package/dist/{chunk-IBTRMWD6.mjs.map → chunk-I24QOHPU.mjs.map} +1 -1
  21. package/dist/{chunk-ZBJBQKJ2.mjs → chunk-IHUFOV7L.mjs} +4 -19
  22. package/dist/chunk-IHUFOV7L.mjs.map +1 -0
  23. package/dist/{chunk-AZIARTGX.mjs → chunk-M42TGYT6.mjs} +3 -3
  24. package/dist/{chunk-AZIARTGX.mjs.map → chunk-M42TGYT6.mjs.map} +1 -1
  25. package/dist/{chunk-WWMQ2VHZ.mjs → chunk-NDEZJKNY.mjs} +4 -4
  26. package/dist/{chunk-WWMQ2VHZ.mjs.map → chunk-NDEZJKNY.mjs.map} +1 -1
  27. package/dist/{chunk-CSCF3YFZ.mjs → chunk-ONBCUWVI.mjs} +6 -4
  28. package/dist/chunk-ONBCUWVI.mjs.map +1 -0
  29. package/dist/{chunk-6V4SH4JJ.mjs → chunk-REIJZDVZ.mjs} +6 -35
  30. package/dist/chunk-REIJZDVZ.mjs.map +1 -0
  31. package/dist/{chunk-4D5CSIJO.mjs → chunk-TB4CL25L.mjs} +10 -8
  32. package/dist/chunk-TB4CL25L.mjs.map +1 -0
  33. package/dist/chunk-VNCCIV6O.mjs +938 -0
  34. package/dist/chunk-VNCCIV6O.mjs.map +1 -0
  35. package/dist/{chunk-MFOGFFIL.mjs → chunk-VRHWDZ66.mjs} +6 -5
  36. package/dist/chunk-VRHWDZ66.mjs.map +1 -0
  37. package/dist/{chunk-CRAPWQKJ.mjs → chunk-YSJOVBCD.mjs} +4 -4
  38. package/dist/{chunk-CRAPWQKJ.mjs.map → chunk-YSJOVBCD.mjs.map} +1 -1
  39. package/dist/geometry-2d.d.mts +2 -1
  40. package/dist/geometry-2d.d.ts +2 -1
  41. package/dist/geometry-2d.js +1383 -23
  42. package/dist/geometry-2d.js.map +1 -1
  43. package/dist/geometry-2d.mjs +7 -5
  44. package/dist/geometry-3d.d.mts +2 -1
  45. package/dist/geometry-3d.d.ts +2 -1
  46. package/dist/geometry-3d.js +2 -2
  47. package/dist/geometry-3d.js.map +1 -1
  48. package/dist/geometry-3d.mjs +6 -4
  49. package/dist/graph-2d.d.mts +2 -1
  50. package/dist/graph-2d.d.ts +2 -1
  51. package/dist/graph-2d.js +2 -2
  52. package/dist/graph-2d.js.map +1 -1
  53. package/dist/graph-2d.mjs +9 -7
  54. package/dist/{host-TLIXN4CF.mjs → host-A64ITWVX.mjs} +8 -6
  55. package/dist/host-A64ITWVX.mjs.map +1 -0
  56. package/dist/{host-DOAYVL35.mjs → host-L7FMFZUW.mjs} +228 -30
  57. package/dist/host-L7FMFZUW.mjs.map +1 -0
  58. package/dist/{host-GKNQBBUE.mjs → host-QK53UYMD.mjs} +12 -10
  59. package/dist/host-QK53UYMD.mjs.map +1 -0
  60. package/dist/index.d.mts +4 -616
  61. package/dist/index.d.ts +4 -616
  62. package/dist/index.js +8889 -8529
  63. package/dist/index.js.map +1 -1
  64. package/dist/index.mjs +21 -1012
  65. package/dist/index.mjs.map +1 -1
  66. package/dist/latex.d.mts +2 -1
  67. package/dist/latex.d.ts +2 -1
  68. package/dist/render-3WTY7NZB.mjs +9 -0
  69. package/dist/{render-SA4JTOW3.mjs.map → render-3WTY7NZB.mjs.map} +1 -1
  70. package/dist/serialize-SRJVKYUG.mjs +8 -0
  71. package/dist/{serialize-3NZS6A6Q.mjs.map → serialize-SRJVKYUG.mjs.map} +1 -1
  72. package/dist/{types-rA4slL08.d.ts → types-DWRyCa2m.d.mts} +139 -1
  73. package/dist/{types-rA4slL08.d.mts → types-DWRyCa2m.d.ts} +139 -1
  74. package/package.json +6 -1
  75. package/dist/chunk-4D5CSIJO.mjs.map +0 -1
  76. package/dist/chunk-6V4SH4JJ.mjs.map +0 -1
  77. package/dist/chunk-BKSXPNPQ.mjs.map +0 -1
  78. package/dist/chunk-CSCF3YFZ.mjs.map +0 -1
  79. package/dist/chunk-MFOGFFIL.mjs.map +0 -1
  80. package/dist/chunk-ZBJBQKJ2.mjs.map +0 -1
  81. package/dist/host-DOAYVL35.mjs.map +0 -1
  82. package/dist/host-GKNQBBUE.mjs.map +0 -1
  83. package/dist/host-TLIXN4CF.mjs.map +0 -1
  84. package/dist/render-SA4JTOW3.mjs +0 -8
  85. package/dist/serialize-3NZS6A6Q.mjs +0 -6
package/dist/latex.d.mts CHANGED
@@ -1,4 +1,5 @@
1
- import { B as BaseStampCustomData, S as StampType } from './types-rA4slL08.mjs';
1
+ import { B as BaseStampCustomData, S as StampType } from './types-DWRyCa2m.mjs';
2
+ import 'zod';
2
3
  import 'react';
3
4
  import '@excalidraw/excalidraw/element/types';
4
5
 
package/dist/latex.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { B as BaseStampCustomData, S as StampType } from './types-rA4slL08.js';
1
+ import { B as BaseStampCustomData, S as StampType } from './types-DWRyCa2m.js';
2
+ import 'zod';
2
3
  import 'react';
3
4
  import '@excalidraw/excalidraw/element/types';
4
5
 
@@ -0,0 +1,9 @@
1
+ "use client";
2
+ export { renderGraphSvgFromState } from './chunk-CJBLJUWG.mjs';
3
+ import './chunk-M42TGYT6.mjs';
4
+ import './chunk-AYSFWUPK.mjs';
5
+ import './chunk-ICR4CVOE.mjs';
6
+ import './chunk-IHUFOV7L.mjs';
7
+ import './chunk-B4NJJZFR.mjs';
8
+ //# sourceMappingURL=render-3WTY7NZB.mjs.map
9
+ //# sourceMappingURL=render-3WTY7NZB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"render-SA4JTOW3.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"render-3WTY7NZB.mjs"}
@@ -0,0 +1,8 @@
1
+ "use client";
2
+ export { parseSceneState, stringifySceneState } from './chunk-I24QOHPU.mjs';
3
+ import './chunk-REIJZDVZ.mjs';
4
+ import './chunk-IHUFOV7L.mjs';
5
+ import './chunk-73Q7ADVL.mjs';
6
+ import './chunk-B4NJJZFR.mjs';
7
+ //# sourceMappingURL=serialize-SRJVKYUG.mjs.map
8
+ //# sourceMappingURL=serialize-SRJVKYUG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"serialize-3NZS6A6Q.mjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"serialize-SRJVKYUG.mjs"}
@@ -1,6 +1,127 @@
1
+ import { z } from 'zod';
1
2
  import { ReactNode, ComponentType, RefAttributes } from 'react';
2
3
  import { ExcalidrawElement } from '@excalidraw/excalidraw/element/types';
3
4
 
5
+ declare const NameZ: z.ZodString;
6
+
7
+ type Name = z.infer<typeof NameZ>;
8
+ type DslPointT = {
9
+ name: Name;
10
+ kind: 'free';
11
+ x: number;
12
+ y: number;
13
+ } | {
14
+ name: Name;
15
+ kind: 'midpoint';
16
+ p1: Name;
17
+ p2: Name;
18
+ } | {
19
+ name: Name;
20
+ kind: 'onSegment';
21
+ segmentId: Name;
22
+ t: number;
23
+ } | {
24
+ name: Name;
25
+ kind: 'onLine';
26
+ lineId: Name;
27
+ t: number;
28
+ } | {
29
+ name: Name;
30
+ kind: 'onCircle';
31
+ circleId: Name;
32
+ theta: number;
33
+ } | {
34
+ name: Name;
35
+ kind: 'perpFoot';
36
+ from: Name;
37
+ onLine: Name;
38
+ } | {
39
+ name: Name;
40
+ kind: 'circumcenter';
41
+ vertices: [Name, Name, Name];
42
+ } | {
43
+ name: Name;
44
+ kind: 'incenter';
45
+ vertices: [Name, Name, Name];
46
+ } | {
47
+ name: Name;
48
+ kind: 'centroid';
49
+ vertices: [Name, Name, Name];
50
+ } | {
51
+ name: Name;
52
+ kind: 'orthocenter';
53
+ vertices: [Name, Name, Name];
54
+ } | {
55
+ name: Name;
56
+ kind: 'intersection';
57
+ ref1: Name;
58
+ ref2: Name;
59
+ branch?: 0 | 1;
60
+ };
61
+ type DslShapeT = {
62
+ name: Name;
63
+ kind: 'segment';
64
+ p1: Name;
65
+ p2: Name;
66
+ } | {
67
+ name: Name;
68
+ kind: 'line';
69
+ p1: Name;
70
+ p2: Name;
71
+ } | {
72
+ name: Name;
73
+ kind: 'ray';
74
+ origin: Name;
75
+ through: Name;
76
+ } | {
77
+ name: Name;
78
+ kind: 'polygon';
79
+ vertices: Name[];
80
+ } | {
81
+ name: Name;
82
+ kind: 'perpendicular';
83
+ throughPoint: Name;
84
+ toLine: Name;
85
+ } | {
86
+ name: Name;
87
+ kind: 'parallel';
88
+ throughPoint: Name;
89
+ toLine: Name;
90
+ } | {
91
+ name: Name;
92
+ kind: 'perpBisector';
93
+ p1: Name;
94
+ p2: Name;
95
+ } | {
96
+ name: Name;
97
+ kind: 'angleBisector';
98
+ p1: Name;
99
+ vertex: Name;
100
+ p2: Name;
101
+ } | {
102
+ name: Name;
103
+ kind: 'tangent';
104
+ throughPoint: Name;
105
+ toCircle: Name;
106
+ branch?: 0 | 1 | 'on';
107
+ } | {
108
+ name: Name;
109
+ kind: 'circleCP';
110
+ center: Name;
111
+ surfacePoint: Name;
112
+ } | {
113
+ name: Name;
114
+ kind: 'circle3';
115
+ p1: Name;
116
+ p2: Name;
117
+ p3: Name;
118
+ };
119
+ type DslInputT = {
120
+ version: 1;
121
+ points: DslPointT[];
122
+ shapes: DslShapeT[];
123
+ };
124
+
4
125
  type SceneObject<A = Record<string, unknown>> = {
5
126
  id: string;
6
127
  kind: string;
@@ -57,12 +178,29 @@ type AiFigureUiResult = {
57
178
  ok: false;
58
179
  message: string;
59
180
  };
181
+ /**
182
+ * Progress event emitted bởi streaming generator. Số token output đã sinh.
183
+ * Editor dùng để hiển thị "Đang nhận N token..." realtime.
184
+ */
185
+ interface AiFigureProgress {
186
+ /** Số token output đã sinh tính đến lúc emit. */
187
+ tokens: number;
188
+ }
60
189
  /**
61
190
  * Consumer-provided bridge to a server-side `generateFigure()` call.
62
191
  * Implementations must keep API credentials outside the browser bundle.
192
+ *
193
+ * `onProgress` là optional: nếu consumer dùng streaming endpoint (SSE),
194
+ * forward chunk events vào đây. Non-streaming impl bỏ qua.
195
+ *
196
+ * `currentDsl` (MỚI cho multi-step refine): khi caller có hình hiện tại
197
+ * (state.order.length > 0) và muốn AI sửa/thêm → pass currentDsl. Consumer
198
+ * branch sang refine endpoint. Không pass → build endpoint cũ.
63
199
  */
64
200
  type GenerateGeometryFigure = (problem: string, options: {
65
201
  signal: AbortSignal;
202
+ onProgress?: (info: AiFigureProgress) => void;
203
+ currentDsl?: DslInputT;
66
204
  }) => Promise<AiFigureUiResult>;
67
205
  /**
68
206
  * Kết quả trả về từ `restoreFileFromCustomData`. Chứa đủ thông tin để
@@ -172,4 +310,4 @@ interface StampType<TCustomData extends BaseStampCustomData = BaseStampCustomDat
172
310
  experimental?: boolean;
173
311
  }
174
312
 
175
- export type { AiFigureUiResult as A, BaseStampCustomData as B, GenerateGeometryFigure as G, StampType as S, State as a };
313
+ export type { AiFigureProgress as A, BaseStampCustomData as B, DslInputT as D, GenerateGeometryFigure as G, StampType as S, AiFigureUiResult as a, State as b };
@@ -1,6 +1,127 @@
1
+ import { z } from 'zod';
1
2
  import { ReactNode, ComponentType, RefAttributes } from 'react';
2
3
  import { ExcalidrawElement } from '@excalidraw/excalidraw/element/types';
3
4
 
5
+ declare const NameZ: z.ZodString;
6
+
7
+ type Name = z.infer<typeof NameZ>;
8
+ type DslPointT = {
9
+ name: Name;
10
+ kind: 'free';
11
+ x: number;
12
+ y: number;
13
+ } | {
14
+ name: Name;
15
+ kind: 'midpoint';
16
+ p1: Name;
17
+ p2: Name;
18
+ } | {
19
+ name: Name;
20
+ kind: 'onSegment';
21
+ segmentId: Name;
22
+ t: number;
23
+ } | {
24
+ name: Name;
25
+ kind: 'onLine';
26
+ lineId: Name;
27
+ t: number;
28
+ } | {
29
+ name: Name;
30
+ kind: 'onCircle';
31
+ circleId: Name;
32
+ theta: number;
33
+ } | {
34
+ name: Name;
35
+ kind: 'perpFoot';
36
+ from: Name;
37
+ onLine: Name;
38
+ } | {
39
+ name: Name;
40
+ kind: 'circumcenter';
41
+ vertices: [Name, Name, Name];
42
+ } | {
43
+ name: Name;
44
+ kind: 'incenter';
45
+ vertices: [Name, Name, Name];
46
+ } | {
47
+ name: Name;
48
+ kind: 'centroid';
49
+ vertices: [Name, Name, Name];
50
+ } | {
51
+ name: Name;
52
+ kind: 'orthocenter';
53
+ vertices: [Name, Name, Name];
54
+ } | {
55
+ name: Name;
56
+ kind: 'intersection';
57
+ ref1: Name;
58
+ ref2: Name;
59
+ branch?: 0 | 1;
60
+ };
61
+ type DslShapeT = {
62
+ name: Name;
63
+ kind: 'segment';
64
+ p1: Name;
65
+ p2: Name;
66
+ } | {
67
+ name: Name;
68
+ kind: 'line';
69
+ p1: Name;
70
+ p2: Name;
71
+ } | {
72
+ name: Name;
73
+ kind: 'ray';
74
+ origin: Name;
75
+ through: Name;
76
+ } | {
77
+ name: Name;
78
+ kind: 'polygon';
79
+ vertices: Name[];
80
+ } | {
81
+ name: Name;
82
+ kind: 'perpendicular';
83
+ throughPoint: Name;
84
+ toLine: Name;
85
+ } | {
86
+ name: Name;
87
+ kind: 'parallel';
88
+ throughPoint: Name;
89
+ toLine: Name;
90
+ } | {
91
+ name: Name;
92
+ kind: 'perpBisector';
93
+ p1: Name;
94
+ p2: Name;
95
+ } | {
96
+ name: Name;
97
+ kind: 'angleBisector';
98
+ p1: Name;
99
+ vertex: Name;
100
+ p2: Name;
101
+ } | {
102
+ name: Name;
103
+ kind: 'tangent';
104
+ throughPoint: Name;
105
+ toCircle: Name;
106
+ branch?: 0 | 1 | 'on';
107
+ } | {
108
+ name: Name;
109
+ kind: 'circleCP';
110
+ center: Name;
111
+ surfacePoint: Name;
112
+ } | {
113
+ name: Name;
114
+ kind: 'circle3';
115
+ p1: Name;
116
+ p2: Name;
117
+ p3: Name;
118
+ };
119
+ type DslInputT = {
120
+ version: 1;
121
+ points: DslPointT[];
122
+ shapes: DslShapeT[];
123
+ };
124
+
4
125
  type SceneObject<A = Record<string, unknown>> = {
5
126
  id: string;
6
127
  kind: string;
@@ -57,12 +178,29 @@ type AiFigureUiResult = {
57
178
  ok: false;
58
179
  message: string;
59
180
  };
181
+ /**
182
+ * Progress event emitted bởi streaming generator. Số token output đã sinh.
183
+ * Editor dùng để hiển thị "Đang nhận N token..." realtime.
184
+ */
185
+ interface AiFigureProgress {
186
+ /** Số token output đã sinh tính đến lúc emit. */
187
+ tokens: number;
188
+ }
60
189
  /**
61
190
  * Consumer-provided bridge to a server-side `generateFigure()` call.
62
191
  * Implementations must keep API credentials outside the browser bundle.
192
+ *
193
+ * `onProgress` là optional: nếu consumer dùng streaming endpoint (SSE),
194
+ * forward chunk events vào đây. Non-streaming impl bỏ qua.
195
+ *
196
+ * `currentDsl` (MỚI cho multi-step refine): khi caller có hình hiện tại
197
+ * (state.order.length > 0) và muốn AI sửa/thêm → pass currentDsl. Consumer
198
+ * branch sang refine endpoint. Không pass → build endpoint cũ.
63
199
  */
64
200
  type GenerateGeometryFigure = (problem: string, options: {
65
201
  signal: AbortSignal;
202
+ onProgress?: (info: AiFigureProgress) => void;
203
+ currentDsl?: DslInputT;
66
204
  }) => Promise<AiFigureUiResult>;
67
205
  /**
68
206
  * Kết quả trả về từ `restoreFileFromCustomData`. Chứa đủ thông tin để
@@ -172,4 +310,4 @@ interface StampType<TCustomData extends BaseStampCustomData = BaseStampCustomDat
172
310
  experimental?: boolean;
173
311
  }
174
312
 
175
- export type { AiFigureUiResult as A, BaseStampCustomData as B, GenerateGeometryFigure as G, StampType as S, State as a };
313
+ export type { AiFigureProgress as A, BaseStampCustomData as B, DslInputT as D, GenerateGeometryFigure as G, StampType as S, AiFigureUiResult as a, State as b };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xom11/whiteboard",
3
- "version": "0.24.1",
3
+ "version": "0.25.0",
4
4
  "private": false,
5
5
  "description": "Excalidraw + JSXGraph + KaTeX whiteboard component (drawing, geometry stamps, LaTeX stamps).",
6
6
  "repository": {
@@ -41,6 +41,11 @@
41
41
  "import": "./dist/graph-2d.mjs",
42
42
  "require": "./dist/graph-2d.js"
43
43
  },
44
+ "./ai": {
45
+ "types": "./dist/ai.d.ts",
46
+ "import": "./dist/ai.mjs",
47
+ "require": "./dist/ai.js"
48
+ },
44
49
  "./styles.css": "./dist/index.css"
45
50
  },
46
51
  "files": [