@neta-art/cohub 10.0.0 → 11.0.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 (129) hide show
  1. package/README.md +11 -2
  2. package/dist/board/editor/animation.d.ts +3 -0
  3. package/dist/board/editor/animation.js +16 -1
  4. package/dist/board/editor/clipboard.js +7 -0
  5. package/dist/board/editor/copy.js +23 -18
  6. package/dist/board/editor/creation.d.ts +5 -1
  7. package/dist/board/editor/creation.js +2 -1
  8. package/dist/board/editor/deletion.js +3 -3
  9. package/dist/board/editor/document.d.ts +8 -2
  10. package/dist/board/editor/document.js +54 -7
  11. package/dist/board/editor/editor.d.ts +18 -3
  12. package/dist/board/editor/editor.js +11 -1
  13. package/dist/board/editor/query.d.ts +5 -5
  14. package/dist/board/editor/query.js +14 -12
  15. package/dist/board/editor/selection.js +2 -1
  16. package/dist/board/export/index.d.ts +25 -4
  17. package/dist/board/export/index.js +45 -12
  18. package/dist/board/export/node/index.d.ts +5 -4
  19. package/dist/board/export/node/index.js +16 -11
  20. package/dist/board/export/node/scripts.d.ts +16 -0
  21. package/dist/board/export/node/scripts.js +258 -0
  22. package/dist/board/export/scene.d.ts +2 -1
  23. package/dist/board/export/scene.js +20 -6
  24. package/dist/board/model/animation.d.ts +4 -1
  25. package/dist/board/model/animation.js +34 -7
  26. package/dist/board/model/authoring.d.ts +20 -0
  27. package/dist/board/model/authoring.js +185 -0
  28. package/dist/board/model/export-plan.js +1 -0
  29. package/dist/board/model/file-preview.js +1 -1
  30. package/dist/board/model/file-snapshot.js +3 -2
  31. package/dist/board/model/image-key.js +6 -2
  32. package/dist/board/model/index.d.ts +13 -6
  33. package/dist/board/model/index.js +14 -8
  34. package/dist/board/model/items/builtin.js +2 -2
  35. package/dist/board/model/items/create.d.ts +4 -2
  36. package/dist/board/model/items/create.js +6 -5
  37. package/dist/board/model/items/index.d.ts +2 -2
  38. package/dist/board/model/items/index.js +2 -2
  39. package/dist/board/model/media-playback.d.ts +2 -1
  40. package/dist/board/model/media-playback.js +14 -4
  41. package/dist/board/model/media.js +7 -1
  42. package/dist/board/model/sampling.d.ts +19 -0
  43. package/dist/board/model/sampling.js +96 -0
  44. package/dist/board/model/script-example.d.ts +4 -0
  45. package/dist/board/model/script-example.js +21 -0
  46. package/dist/board/model/script-hit.d.ts +10 -0
  47. package/dist/board/model/script-hit.js +52 -0
  48. package/dist/board/model/script-index.d.ts +7 -0
  49. package/dist/board/model/script-index.js +15 -0
  50. package/dist/board/model/script-scene.d.ts +24 -0
  51. package/dist/board/model/script-scene.js +267 -0
  52. package/dist/board/model/script.d.ts +105 -0
  53. package/dist/board/model/script.js +1 -0
  54. package/dist/board/render/css-color.d.ts +6 -1
  55. package/dist/board/render/css-color.js +34 -20
  56. package/dist/board/render/diagnostics.d.ts +20 -0
  57. package/dist/board/render/diagnostics.js +117 -0
  58. package/dist/board/render/index.d.ts +9 -6
  59. package/dist/board/render/index.js +9 -6
  60. package/dist/board/render/palette.d.ts +2 -1
  61. package/dist/board/render/palette.js +6 -2
  62. package/dist/board/render/renderers/arrow-card-renderer.js +3 -2
  63. package/dist/board/render/renderers/audio-card-renderer.js +2 -1
  64. package/dist/board/render/renderers/board-renderer-registry.d.ts +10 -5
  65. package/dist/board/render/renderers/board-renderer-registry.js +3 -3
  66. package/dist/board/render/renderers/custom-card-renderer.d.ts +5 -0
  67. package/dist/board/render/renderers/{sketch-card-renderer.js → custom-card-renderer.js} +16 -15
  68. package/dist/board/render/renderers/draw-card-renderer.js +3 -2
  69. package/dist/board/render/renderers/effect-card-renderer.js +22 -5
  70. package/dist/board/render/renderers/frame-card-renderer.js +30 -14
  71. package/dist/board/render/renderers/image-card-renderer.js +43 -4
  72. package/dist/board/render/renderers/shape-card-renderer.js +10 -27
  73. package/dist/board/render/renderers/text-card-renderer.js +5 -3
  74. package/dist/board/render/renderers/unknown-card-renderer.js +1 -0
  75. package/dist/board/render/renderers/video-card-renderer.js +2 -1
  76. package/dist/board/render/sampling.d.ts +22 -0
  77. package/dist/board/render/sampling.js +21 -0
  78. package/dist/board/render/script-export.d.ts +11 -0
  79. package/dist/board/render/script-export.js +86 -0
  80. package/dist/board/render/script-host.d.ts +31 -0
  81. package/dist/board/render/script-host.js +421 -0
  82. package/dist/board/render/script-modules.d.ts +2 -0
  83. package/dist/board/render/script-modules.js +2 -0
  84. package/dist/board/render/script-runtime.d.ts +29 -0
  85. package/dist/board/render/script-runtime.js +213 -0
  86. package/dist/board/render/script-sandbox.d.ts +4 -0
  87. package/dist/board/render/script-sandbox.js +173 -0
  88. package/dist/board/render/stroke.d.ts +2 -1
  89. package/dist/board/render/stroke.js +22 -1
  90. package/dist/board/render/text-measurement.js +1 -1
  91. package/dist/board/stage/assets.js +6 -1
  92. package/dist/board/stage/maintenance.d.ts +5 -0
  93. package/dist/board/stage/maintenance.js +11 -0
  94. package/dist/board/stage/scene.js +5 -2
  95. package/dist/board/stage/script-pointer.d.ts +19 -0
  96. package/dist/board/stage/script-pointer.js +35 -0
  97. package/dist/board/stage/stage.d.ts +10 -0
  98. package/dist/board/stage/stage.js +249 -43
  99. package/dist/board/stage/texture-pool.js +2 -3
  100. package/dist/chunks/environment.d.ts +266 -23
  101. package/dist/chunks/host-bridge.d.ts +2 -2
  102. package/dist/chunks/http.d.ts +88 -7
  103. package/dist/chunks/http.js +155 -63
  104. package/dist/chunks/transport.js +3 -1
  105. package/dist/chunks/websocket.d.ts +9 -1
  106. package/dist/chunks/websocket.js +16 -2
  107. package/dist/host-bridge.js +2 -1
  108. package/dist/http.d.ts +2 -2
  109. package/dist/index.d.ts +182 -4
  110. package/dist/index.js +1374 -126
  111. package/dist/protocol/dist/board-assets.d.ts +1 -0
  112. package/dist/protocol/dist/board-constants.js +2 -2
  113. package/dist/protocol/dist/board-model.d.ts +201 -11
  114. package/dist/protocol/dist/board-model.js +33 -14
  115. package/dist/protocol/dist/board-patch.js +2 -1
  116. package/dist/protocol/dist/board-schema.d.ts +4 -2
  117. package/dist/protocol/dist/board-schema.js +18 -4
  118. package/dist/protocol/dist/board-script-modules.d.ts +25 -0
  119. package/dist/protocol/dist/board-script-modules.js +127 -0
  120. package/dist/protocol/dist/display/index.d.ts +1 -0
  121. package/dist/protocol/dist/index.d.ts +4 -2
  122. package/dist/protocol/dist/realtime/types.d.ts +1 -0
  123. package/dist/protocol/dist/rtc/index.d.ts +1 -0
  124. package/package.json +2 -1
  125. package/dist/board/export/node/sketch.d.ts +0 -19
  126. package/dist/board/export/node/sketch.js +0 -146
  127. package/dist/board/render/renderers/sketch-card-renderer.d.ts +0 -5
  128. package/dist/board/render/sketch-host.d.ts +0 -14
  129. package/dist/board/render/sketch-host.js +0 -216
@@ -0,0 +1 @@
1
+ import "./board.js";
@@ -7,7 +7,7 @@ function clampBoardStrokeSize(size) {
7
7
  if (!Number.isFinite(size)) return BOARD_ARROW_STROKE_SIZE;
8
8
  return Math.min(64, Math.max(1, size));
9
9
  }
10
- const BOARD_FONT_STACK = "\"Geist\", system-ui, -apple-system, \"Noto Sans CJK SC\", \"Noto Sans SC\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif";
11
- const BOARD_MONO_FONT_STACK = "\"Geist Mono\", \"Fira Code\", ui-monospace, \"Noto Sans Mono CJK SC\", monospace";
10
+ const BOARD_FONT_STACK = "\"Geist\", system-ui, -apple-system, \"Noto Sans CJK SC\", \"Noto Sans SC\", \"PingFang SC\", \"Microsoft YaHei\", \"Noto Sans Math\", \"Noto Sans Symbols 2\", \"DejaVu Sans\", \"FreeSans\", \"FreeSerif\", sans-serif";
11
+ const BOARD_MONO_FONT_STACK = "\"Geist Mono\", \"Fira Code\", ui-monospace, \"Noto Sans Mono CJK SC\", \"Noto Sans Math\", \"DejaVu Sans\", \"FreeSans\", \"FreeSerif\", monospace";
12
12
  //#endregion
13
13
  export { BOARD_ARROW_STROKE_SIZE, BOARD_FONT_STACK, BOARD_MONO_FONT_STACK, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TEXT_FONT_FAMILY, clampBoardStrokeSize };
@@ -2,6 +2,7 @@ import { z } from "zod";
2
2
  //#region ../protocol/dist/board-model.d.ts
3
3
  declare const BOARD_ID_MAX_LENGTH = 160;
4
4
  declare const BOARD_CAMERA_TARGET: "camera";
5
+ declare const BoardKeySchema: z.ZodString;
5
6
  declare const BoardIdSchema: z.ZodString;
6
7
  declare const BoardVec2Schema: z.ZodObject<{
7
8
  x: z.ZodNumber;
@@ -44,10 +45,31 @@ declare const BoardStyleSchema: z.ZodObject<{
44
45
  }, z.core.$strict>;
45
46
  type BoardStyle = z.infer<typeof BoardStyleSchema>;
46
47
  declare function isSafeBoardSourcePath(value: string): boolean;
48
+ type BoardMediaSource = {
49
+ kind: "url" | "file";
50
+ value: string;
51
+ };
52
+ declare function parseBoardMediaSource(src: string): BoardMediaSource | null;
53
+ declare const BoardMediaSourceSchema: z.ZodString;
54
+ declare const BoardScriptSchema: z.ZodObject<{
55
+ src: z.ZodString;
56
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
57
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
58
+ seed: z.ZodOptional<z.ZodString>;
59
+ enabled: z.ZodDefault<z.ZodBoolean>;
60
+ }, z.core.$strict>;
61
+ type BoardScript = z.infer<typeof BoardScriptSchema>;
47
62
  declare const BOARD_TEXT_ALIGNS: readonly ["left", "center", "right"];
48
63
  declare const BOARD_SHAPE_GEOMETRIES: readonly ["rectangle", "rounded", "ellipse", "diamond", "triangle", "path"];
49
64
  type BoardShapeGeometry = (typeof BOARD_SHAPE_GEOMETRIES)[number];
50
65
  declare const BoardFrameItemSchema: z.ZodObject<{
66
+ script: z.ZodOptional<z.ZodObject<{
67
+ src: z.ZodString;
68
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
69
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
70
+ seed: z.ZodOptional<z.ZodString>;
71
+ enabled: z.ZodDefault<z.ZodBoolean>;
72
+ }, z.core.$strict>>;
51
73
  parent: z.ZodOptional<z.ZodString>;
52
74
  z: z.ZodOptional<z.ZodNumber>;
53
75
  position: z.ZodDefault<z.ZodObject<{
@@ -92,10 +114,21 @@ declare const BoardFrameItemSchema: z.ZodObject<{
92
114
  type: z.ZodLiteral<"frame">;
93
115
  props: z.ZodPrefault<z.ZodObject<{
94
116
  label: z.ZodDefault<z.ZodString>;
117
+ decoration: z.ZodOptional<z.ZodEnum<{
118
+ frame: "frame";
119
+ none: "none";
120
+ }>>;
95
121
  clip: z.ZodDefault<z.ZodBoolean>;
96
122
  }, z.core.$strict>>;
97
123
  }, z.core.$strict>;
98
124
  declare const BoardTextItemSchema: z.ZodObject<{
125
+ script: z.ZodOptional<z.ZodObject<{
126
+ src: z.ZodString;
127
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
128
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
129
+ seed: z.ZodOptional<z.ZodString>;
130
+ enabled: z.ZodDefault<z.ZodBoolean>;
131
+ }, z.core.$strict>>;
99
132
  parent: z.ZodOptional<z.ZodString>;
100
133
  z: z.ZodOptional<z.ZodNumber>;
101
134
  position: z.ZodDefault<z.ZodObject<{
@@ -151,6 +184,13 @@ declare const BoardTextItemSchema: z.ZodObject<{
151
184
  }, z.core.$strict>>;
152
185
  }, z.core.$strict>;
153
186
  declare const BoardShapeItemSchema: z.ZodObject<{
187
+ script: z.ZodOptional<z.ZodObject<{
188
+ src: z.ZodString;
189
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
190
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
191
+ seed: z.ZodOptional<z.ZodString>;
192
+ enabled: z.ZodDefault<z.ZodBoolean>;
193
+ }, z.core.$strict>>;
154
194
  parent: z.ZodOptional<z.ZodString>;
155
195
  z: z.ZodOptional<z.ZodNumber>;
156
196
  position: z.ZodDefault<z.ZodObject<{
@@ -219,6 +259,13 @@ declare const BoardDrawPointSchema: z.ZodObject<{
219
259
  }, z.core.$strict>;
220
260
  type BoardDrawPoint = z.infer<typeof BoardDrawPointSchema>;
221
261
  declare const BoardDrawItemSchema: z.ZodObject<{
262
+ script: z.ZodOptional<z.ZodObject<{
263
+ src: z.ZodString;
264
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
265
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
266
+ seed: z.ZodOptional<z.ZodString>;
267
+ enabled: z.ZodDefault<z.ZodBoolean>;
268
+ }, z.core.$strict>>;
222
269
  parent: z.ZodOptional<z.ZodString>;
223
270
  z: z.ZodOptional<z.ZodNumber>;
224
271
  position: z.ZodDefault<z.ZodObject<{
@@ -320,6 +367,13 @@ type BoardArrowEnd = z.infer<typeof BoardArrowEndSchema>;
320
367
  declare const BOARD_ARROW_ROUTES: readonly ["straight", "curve", "orthogonal"];
321
368
  type BoardArrowRoute = (typeof BOARD_ARROW_ROUTES)[number];
322
369
  declare const BoardArrowItemSchema: z.ZodObject<{
370
+ script: z.ZodOptional<z.ZodObject<{
371
+ src: z.ZodString;
372
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
373
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
374
+ seed: z.ZodOptional<z.ZodString>;
375
+ enabled: z.ZodDefault<z.ZodBoolean>;
376
+ }, z.core.$strict>>;
323
377
  parent: z.ZodOptional<z.ZodString>;
324
378
  z: z.ZodOptional<z.ZodNumber>;
325
379
  position: z.ZodDefault<z.ZodObject<{
@@ -434,6 +488,13 @@ declare const BoardCropSchema: z.ZodObject<{
434
488
  h: z.ZodNumber;
435
489
  }, z.core.$strict>;
436
490
  declare const BoardImageItemSchema: z.ZodObject<{
491
+ script: z.ZodOptional<z.ZodObject<{
492
+ src: z.ZodString;
493
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
494
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
495
+ seed: z.ZodOptional<z.ZodString>;
496
+ enabled: z.ZodDefault<z.ZodBoolean>;
497
+ }, z.core.$strict>>;
437
498
  parent: z.ZodOptional<z.ZodString>;
438
499
  z: z.ZodOptional<z.ZodNumber>;
439
500
  position: z.ZodDefault<z.ZodObject<{
@@ -499,6 +560,13 @@ declare const BoardImageItemSchema: z.ZodObject<{
499
560
  }, z.core.$strict>;
500
561
  }, z.core.$strict>;
501
562
  declare const BoardVideoItemSchema: z.ZodObject<{
563
+ script: z.ZodOptional<z.ZodObject<{
564
+ src: z.ZodString;
565
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
566
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
567
+ seed: z.ZodOptional<z.ZodString>;
568
+ enabled: z.ZodDefault<z.ZodBoolean>;
569
+ }, z.core.$strict>>;
502
570
  parent: z.ZodOptional<z.ZodString>;
503
571
  z: z.ZodOptional<z.ZodNumber>;
504
572
  position: z.ZodDefault<z.ZodObject<{
@@ -559,6 +627,13 @@ declare const BoardVideoItemSchema: z.ZodObject<{
559
627
  }, z.core.$strict>;
560
628
  }, z.core.$strict>;
561
629
  declare const BoardAudioItemSchema: z.ZodObject<{
630
+ script: z.ZodOptional<z.ZodObject<{
631
+ src: z.ZodString;
632
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
633
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
634
+ seed: z.ZodOptional<z.ZodString>;
635
+ enabled: z.ZodDefault<z.ZodBoolean>;
636
+ }, z.core.$strict>>;
562
637
  parent: z.ZodOptional<z.ZodString>;
563
638
  z: z.ZodOptional<z.ZodNumber>;
564
639
  position: z.ZodDefault<z.ZodObject<{
@@ -619,6 +694,13 @@ declare const BoardAudioItemSchema: z.ZodObject<{
619
694
  }, z.core.$strict>;
620
695
  }, z.core.$strict>;
621
696
  declare const BoardFileItemSchema: z.ZodObject<{
697
+ script: z.ZodOptional<z.ZodObject<{
698
+ src: z.ZodString;
699
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
700
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
701
+ seed: z.ZodOptional<z.ZodString>;
702
+ enabled: z.ZodDefault<z.ZodBoolean>;
703
+ }, z.core.$strict>>;
622
704
  parent: z.ZodOptional<z.ZodString>;
623
705
  z: z.ZodOptional<z.ZodNumber>;
624
706
  position: z.ZodDefault<z.ZodObject<{
@@ -759,6 +841,13 @@ declare const BoardTaskSnapshotSchema: z.ZodObject<{
759
841
  }, z.core.$strict>;
760
842
  type BoardTaskSnapshot = z.infer<typeof BoardTaskSnapshotSchema>;
761
843
  declare const BoardTaskItemSchema: z.ZodObject<{
844
+ script: z.ZodOptional<z.ZodObject<{
845
+ src: z.ZodString;
846
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
847
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
848
+ seed: z.ZodOptional<z.ZodString>;
849
+ enabled: z.ZodDefault<z.ZodBoolean>;
850
+ }, z.core.$strict>>;
762
851
  parent: z.ZodOptional<z.ZodString>;
763
852
  z: z.ZodOptional<z.ZodNumber>;
764
853
  position: z.ZodDefault<z.ZodObject<{
@@ -907,6 +996,13 @@ declare const BOARD_EFFECT_KIND_INFO: {
907
996
  };
908
997
  };
909
998
  declare const BoardEffectItemSchema: z.ZodObject<{
999
+ script: z.ZodOptional<z.ZodObject<{
1000
+ src: z.ZodString;
1001
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1002
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1003
+ seed: z.ZodOptional<z.ZodString>;
1004
+ enabled: z.ZodDefault<z.ZodBoolean>;
1005
+ }, z.core.$strict>>;
910
1006
  parent: z.ZodOptional<z.ZodString>;
911
1007
  z: z.ZodOptional<z.ZodNumber>;
912
1008
  position: z.ZodDefault<z.ZodObject<{
@@ -969,7 +1065,7 @@ declare const BoardEffectItemSchema: z.ZodObject<{
969
1065
  seed: z.ZodOptional<z.ZodString>;
970
1066
  }, z.core.$strict>;
971
1067
  }, z.core.$strict>;
972
- declare const BoardSketchItemSchema: z.ZodObject<{
1068
+ declare const BoardCustomItemSchema: z.ZodObject<{
973
1069
  parent: z.ZodOptional<z.ZodString>;
974
1070
  z: z.ZodOptional<z.ZodNumber>;
975
1071
  position: z.ZodDefault<z.ZodObject<{
@@ -1011,15 +1107,25 @@ declare const BoardSketchItemSchema: z.ZodObject<{
1011
1107
  width: z.ZodNumber;
1012
1108
  height: z.ZodNumber;
1013
1109
  }, z.core.$strict>>;
1014
- type: z.ZodLiteral<"sketch">;
1015
- props: z.ZodObject<{
1110
+ type: z.ZodLiteral<"custom">;
1111
+ script: z.ZodObject<{
1016
1112
  src: z.ZodString;
1017
- params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1113
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1114
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1018
1115
  seed: z.ZodOptional<z.ZodString>;
1116
+ enabled: z.ZodDefault<z.ZodBoolean>;
1019
1117
  }, z.core.$strict>;
1118
+ props: z.ZodDefault<z.ZodObject<{}, z.core.$strict>>;
1020
1119
  }, z.core.$strict>;
1021
1120
  declare const BOARD_EXTENSION_TYPE_PATTERN: RegExp;
1022
1121
  declare const BoardExtensionItemSchema: z.ZodObject<{
1122
+ script: z.ZodOptional<z.ZodObject<{
1123
+ src: z.ZodString;
1124
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1125
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1126
+ seed: z.ZodOptional<z.ZodString>;
1127
+ enabled: z.ZodDefault<z.ZodBoolean>;
1128
+ }, z.core.$strict>>;
1023
1129
  parent: z.ZodOptional<z.ZodString>;
1024
1130
  z: z.ZodOptional<z.ZodNumber>;
1025
1131
  position: z.ZodDefault<z.ZodObject<{
@@ -1066,6 +1172,13 @@ declare const BoardExtensionItemSchema: z.ZodObject<{
1066
1172
  }, z.core.$strict>;
1067
1173
  declare const BOARD_ITEM_SCHEMAS: {
1068
1174
  readonly frame: z.ZodObject<{
1175
+ script: z.ZodOptional<z.ZodObject<{
1176
+ src: z.ZodString;
1177
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1178
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1179
+ seed: z.ZodOptional<z.ZodString>;
1180
+ enabled: z.ZodDefault<z.ZodBoolean>;
1181
+ }, z.core.$strict>>;
1069
1182
  parent: z.ZodOptional<z.ZodString>;
1070
1183
  z: z.ZodOptional<z.ZodNumber>;
1071
1184
  position: z.ZodDefault<z.ZodObject<{
@@ -1110,10 +1223,21 @@ declare const BOARD_ITEM_SCHEMAS: {
1110
1223
  type: z.ZodLiteral<"frame">;
1111
1224
  props: z.ZodPrefault<z.ZodObject<{
1112
1225
  label: z.ZodDefault<z.ZodString>;
1226
+ decoration: z.ZodOptional<z.ZodEnum<{
1227
+ frame: "frame";
1228
+ none: "none";
1229
+ }>>;
1113
1230
  clip: z.ZodDefault<z.ZodBoolean>;
1114
1231
  }, z.core.$strict>>;
1115
1232
  }, z.core.$strict>;
1116
1233
  readonly text: z.ZodObject<{
1234
+ script: z.ZodOptional<z.ZodObject<{
1235
+ src: z.ZodString;
1236
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1237
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1238
+ seed: z.ZodOptional<z.ZodString>;
1239
+ enabled: z.ZodDefault<z.ZodBoolean>;
1240
+ }, z.core.$strict>>;
1117
1241
  parent: z.ZodOptional<z.ZodString>;
1118
1242
  z: z.ZodOptional<z.ZodNumber>;
1119
1243
  position: z.ZodDefault<z.ZodObject<{
@@ -1169,6 +1293,13 @@ declare const BOARD_ITEM_SCHEMAS: {
1169
1293
  }, z.core.$strict>>;
1170
1294
  }, z.core.$strict>;
1171
1295
  readonly shape: z.ZodObject<{
1296
+ script: z.ZodOptional<z.ZodObject<{
1297
+ src: z.ZodString;
1298
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1299
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1300
+ seed: z.ZodOptional<z.ZodString>;
1301
+ enabled: z.ZodDefault<z.ZodBoolean>;
1302
+ }, z.core.$strict>>;
1172
1303
  parent: z.ZodOptional<z.ZodString>;
1173
1304
  z: z.ZodOptional<z.ZodNumber>;
1174
1305
  position: z.ZodDefault<z.ZodObject<{
@@ -1231,6 +1362,13 @@ declare const BOARD_ITEM_SCHEMAS: {
1231
1362
  }, z.core.$strict>>;
1232
1363
  }, z.core.$strict>;
1233
1364
  readonly draw: z.ZodObject<{
1365
+ script: z.ZodOptional<z.ZodObject<{
1366
+ src: z.ZodString;
1367
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1368
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1369
+ seed: z.ZodOptional<z.ZodString>;
1370
+ enabled: z.ZodDefault<z.ZodBoolean>;
1371
+ }, z.core.$strict>>;
1234
1372
  parent: z.ZodOptional<z.ZodString>;
1235
1373
  z: z.ZodOptional<z.ZodNumber>;
1236
1374
  position: z.ZodDefault<z.ZodObject<{
@@ -1278,6 +1416,13 @@ declare const BOARD_ITEM_SCHEMAS: {
1278
1416
  }, z.core.$strict>;
1279
1417
  }, z.core.$strict>;
1280
1418
  readonly arrow: z.ZodObject<{
1419
+ script: z.ZodOptional<z.ZodObject<{
1420
+ src: z.ZodString;
1421
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1422
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1423
+ seed: z.ZodOptional<z.ZodString>;
1424
+ enabled: z.ZodDefault<z.ZodBoolean>;
1425
+ }, z.core.$strict>>;
1281
1426
  parent: z.ZodOptional<z.ZodString>;
1282
1427
  z: z.ZodOptional<z.ZodNumber>;
1283
1428
  position: z.ZodDefault<z.ZodObject<{
@@ -1373,6 +1518,13 @@ declare const BOARD_ITEM_SCHEMAS: {
1373
1518
  }, z.core.$strict>;
1374
1519
  }, z.core.$strict>;
1375
1520
  readonly image: z.ZodObject<{
1521
+ script: z.ZodOptional<z.ZodObject<{
1522
+ src: z.ZodString;
1523
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1524
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1525
+ seed: z.ZodOptional<z.ZodString>;
1526
+ enabled: z.ZodDefault<z.ZodBoolean>;
1527
+ }, z.core.$strict>>;
1376
1528
  parent: z.ZodOptional<z.ZodString>;
1377
1529
  z: z.ZodOptional<z.ZodNumber>;
1378
1530
  position: z.ZodDefault<z.ZodObject<{
@@ -1438,6 +1590,13 @@ declare const BOARD_ITEM_SCHEMAS: {
1438
1590
  }, z.core.$strict>;
1439
1591
  }, z.core.$strict>;
1440
1592
  readonly video: z.ZodObject<{
1593
+ script: z.ZodOptional<z.ZodObject<{
1594
+ src: z.ZodString;
1595
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1596
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1597
+ seed: z.ZodOptional<z.ZodString>;
1598
+ enabled: z.ZodDefault<z.ZodBoolean>;
1599
+ }, z.core.$strict>>;
1441
1600
  parent: z.ZodOptional<z.ZodString>;
1442
1601
  z: z.ZodOptional<z.ZodNumber>;
1443
1602
  position: z.ZodDefault<z.ZodObject<{
@@ -1498,6 +1657,13 @@ declare const BOARD_ITEM_SCHEMAS: {
1498
1657
  }, z.core.$strict>;
1499
1658
  }, z.core.$strict>;
1500
1659
  readonly audio: z.ZodObject<{
1660
+ script: z.ZodOptional<z.ZodObject<{
1661
+ src: z.ZodString;
1662
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1663
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1664
+ seed: z.ZodOptional<z.ZodString>;
1665
+ enabled: z.ZodDefault<z.ZodBoolean>;
1666
+ }, z.core.$strict>>;
1501
1667
  parent: z.ZodOptional<z.ZodString>;
1502
1668
  z: z.ZodOptional<z.ZodNumber>;
1503
1669
  position: z.ZodDefault<z.ZodObject<{
@@ -1558,6 +1724,13 @@ declare const BOARD_ITEM_SCHEMAS: {
1558
1724
  }, z.core.$strict>;
1559
1725
  }, z.core.$strict>;
1560
1726
  readonly file: z.ZodObject<{
1727
+ script: z.ZodOptional<z.ZodObject<{
1728
+ src: z.ZodString;
1729
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1730
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1731
+ seed: z.ZodOptional<z.ZodString>;
1732
+ enabled: z.ZodDefault<z.ZodBoolean>;
1733
+ }, z.core.$strict>>;
1561
1734
  parent: z.ZodOptional<z.ZodString>;
1562
1735
  z: z.ZodOptional<z.ZodNumber>;
1563
1736
  position: z.ZodDefault<z.ZodObject<{
@@ -1617,6 +1790,13 @@ declare const BOARD_ITEM_SCHEMAS: {
1617
1790
  }, z.core.$strict>;
1618
1791
  }, z.core.$strict>;
1619
1792
  readonly task: z.ZodObject<{
1793
+ script: z.ZodOptional<z.ZodObject<{
1794
+ src: z.ZodString;
1795
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1796
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1797
+ seed: z.ZodOptional<z.ZodString>;
1798
+ enabled: z.ZodDefault<z.ZodBoolean>;
1799
+ }, z.core.$strict>>;
1620
1800
  parent: z.ZodOptional<z.ZodString>;
1621
1801
  z: z.ZodOptional<z.ZodNumber>;
1622
1802
  position: z.ZodDefault<z.ZodObject<{
@@ -1710,6 +1890,13 @@ declare const BOARD_ITEM_SCHEMAS: {
1710
1890
  }, z.core.$strict>;
1711
1891
  }, z.core.$strict>;
1712
1892
  readonly effect: z.ZodObject<{
1893
+ script: z.ZodOptional<z.ZodObject<{
1894
+ src: z.ZodString;
1895
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
1896
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1897
+ seed: z.ZodOptional<z.ZodString>;
1898
+ enabled: z.ZodDefault<z.ZodBoolean>;
1899
+ }, z.core.$strict>>;
1713
1900
  parent: z.ZodOptional<z.ZodString>;
1714
1901
  z: z.ZodOptional<z.ZodNumber>;
1715
1902
  position: z.ZodDefault<z.ZodObject<{
@@ -1772,7 +1959,7 @@ declare const BOARD_ITEM_SCHEMAS: {
1772
1959
  seed: z.ZodOptional<z.ZodString>;
1773
1960
  }, z.core.$strict>;
1774
1961
  }, z.core.$strict>;
1775
- readonly sketch: z.ZodObject<{
1962
+ readonly custom: z.ZodObject<{
1776
1963
  parent: z.ZodOptional<z.ZodString>;
1777
1964
  z: z.ZodOptional<z.ZodNumber>;
1778
1965
  position: z.ZodDefault<z.ZodObject<{
@@ -1814,12 +2001,15 @@ declare const BOARD_ITEM_SCHEMAS: {
1814
2001
  width: z.ZodNumber;
1815
2002
  height: z.ZodNumber;
1816
2003
  }, z.core.$strict>>;
1817
- type: z.ZodLiteral<"sketch">;
1818
- props: z.ZodObject<{
2004
+ type: z.ZodLiteral<"custom">;
2005
+ script: z.ZodObject<{
1819
2006
  src: z.ZodString;
1820
- params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
2007
+ params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
2008
+ targets: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodString>>;
1821
2009
  seed: z.ZodOptional<z.ZodString>;
2010
+ enabled: z.ZodDefault<z.ZodBoolean>;
1822
2011
  }, z.core.$strict>;
2012
+ props: z.ZodDefault<z.ZodObject<{}, z.core.$strict>>;
1823
2013
  }, z.core.$strict>;
1824
2014
  };
1825
2015
  type BoardBuiltinItemType = keyof typeof BOARD_ITEM_SCHEMAS;
@@ -1835,11 +2025,11 @@ type BoardAudioItem = z.infer<typeof BoardAudioItemSchema>;
1835
2025
  type BoardFileItem = z.infer<typeof BoardFileItemSchema>;
1836
2026
  type BoardTaskItem = z.infer<typeof BoardTaskItemSchema>;
1837
2027
  type BoardEffectItem = z.infer<typeof BoardEffectItemSchema>;
1838
- type BoardSketchItem = z.infer<typeof BoardSketchItemSchema>;
2028
+ type BoardCustomItem = z.infer<typeof BoardCustomItemSchema>;
1839
2029
  type BoardExtensionItem = Omit<z.infer<typeof BoardExtensionItemSchema>, "type"> & {
1840
2030
  type: `${string}.${string}`;
1841
2031
  };
1842
- type BoardBuiltinItem = BoardFrameItem | BoardTextItem | BoardShapeItem | BoardDrawItem | BoardArrowItem | BoardImageItem | BoardVideoItem | BoardAudioItem | BoardFileItem | BoardTaskItem | BoardEffectItem | BoardSketchItem;
2032
+ type BoardBuiltinItem = BoardFrameItem | BoardTextItem | BoardShapeItem | BoardDrawItem | BoardArrowItem | BoardImageItem | BoardVideoItem | BoardAudioItem | BoardFileItem | BoardTaskItem | BoardEffectItem | BoardCustomItem;
1843
2033
  type BoardItem = BoardBuiltinItem | BoardExtensionItem;
1844
2034
  type BoardItemType = BoardItem["type"];
1845
2035
  type BoardFileBackedItem = BoardImageItem | BoardVideoItem | BoardAudioItem | BoardFileItem;
@@ -2049,4 +2239,4 @@ type BoardDelta = {
2049
2239
  };
2050
2240
  declare function isEmptyBoardDelta(delta: BoardDelta): boolean;
2051
2241
  //#endregion
2052
- export { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXTENSION_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardColor, BoardColorSchema, BoardColorToken, BoardCropSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemType, BoardKeyframe, BoardKeyframeSchema, BoardMarker, BoardMarkerSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardPatch, BoardPatchSchema, BoardPlayMode, BoardSettings, BoardSettingsSchema, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardSketchItem, BoardSketchItemSchema, BoardStyle, BoardStyleSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTrack, BoardTrackSchema, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem };
2242
+ export { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXTENSION_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardColor, BoardColorSchema, BoardColorToken, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardMarker, BoardMarkerSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardPatch, BoardPatchSchema, BoardPlayMode, BoardScript, BoardScriptSchema, BoardSettings, BoardSettingsSchema, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardStyle, BoardStyleSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTrack, BoardTrackSchema, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource };
@@ -1,8 +1,10 @@
1
+ import { normalizeBoardRemoteUrl } from "./board-url.js";
1
2
  import { z } from "zod";
2
3
  //#region ../protocol/dist/board-model.js
3
4
  const BOARD_ID_MAX_LENGTH = 160;
4
5
  const BOARD_CAMERA_TARGET = "camera";
5
- const BoardIdSchema = z.string().min(1).max(160).regex(/^[^\s/]+$/, "ids must not contain whitespace or '/'").refine((value) => value !== BOARD_CAMERA_TARGET, "\"camera\" is reserved");
6
+ const BoardKeySchema = z.string().min(1).max(160).regex(/^[^\s/]+$/, "ids must not contain whitespace or '/'");
7
+ const BoardIdSchema = BoardKeySchema.refine((value) => value !== BOARD_CAMERA_TARGET, "\"camera\" is reserved");
6
8
  const finite = z.number().finite();
7
9
  const nonNegative = finite.nonnegative();
8
10
  const ratio = finite.min(0).max(1);
@@ -50,10 +52,29 @@ const BoardStyleSchema = z.object({
50
52
  trim: ratio.optional()
51
53
  }).strict();
52
54
  function isSafeBoardSourcePath(value) {
53
- return value.length > 0 && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && value.split("/").every((part) => part.length > 0 && part !== "." && part !== "..");
55
+ return value.length > 0 && value.length <= 4096 && !value.startsWith("/") && !/^[a-z][a-z\d+.-]*:/i.test(value.trimStart()) && !value.includes("\\") && value.split("/").every((part) => part.length > 0 && part !== "." && part !== "..");
54
56
  }
55
57
  const srcSchema = z.string().refine(isSafeBoardSourcePath, "src must be a relative Space file path");
58
+ function parseBoardMediaSource(src) {
59
+ if (isSafeBoardSourcePath(src)) return {
60
+ kind: "file",
61
+ value: src
62
+ };
63
+ return normalizeBoardRemoteUrl(src) ? {
64
+ kind: "url",
65
+ value: src
66
+ } : null;
67
+ }
68
+ const BoardMediaSourceSchema = z.string().max(4096).refine((src) => parseBoardMediaSource(src) !== null, "src must be a public HTTP(S) URL or relative Space file path").describe("Prefer a stable public HTTP(S) URL; relative Space file paths remain supported.");
69
+ const BoardScriptSchema = z.object({
70
+ src: srcSchema.refine((path) => /\.m?js$/.test(path), "script src must be a .js or .mjs module"),
71
+ params: z.record(z.string(), z.json()).default({}),
72
+ targets: z.record(z.string().min(1).max(80), BoardIdSchema).default({}),
73
+ seed: z.string().min(1).max(160).optional(),
74
+ enabled: z.boolean().default(true)
75
+ }).strict();
56
76
  const itemEnvelope = {
77
+ script: BoardScriptSchema.optional(),
57
78
  parent: BoardIdSchema.optional(),
58
79
  z: finite.optional(),
59
80
  position: BoardVec2Schema.default({
@@ -98,6 +119,7 @@ const BoardFrameItemSchema = z.object({
98
119
  type: z.literal("frame"),
99
120
  props: z.object({
100
121
  label: z.string().max(280).default(""),
122
+ decoration: z.enum(["frame", "none"]).optional(),
101
123
  clip: z.boolean().default(true)
102
124
  }).strict().prefault({})
103
125
  }).strict();
@@ -197,7 +219,7 @@ const BoardMediaSnapshotSchema = z.object({
197
219
  coverUrl: z.string().optional()
198
220
  }).strict();
199
221
  const fileProps = {
200
- src: srcSchema,
222
+ src: BoardMediaSourceSchema,
201
223
  snapshot: BoardMediaSnapshotSchema.optional()
202
224
  };
203
225
  const timedFileProps = {
@@ -369,14 +391,11 @@ const BoardEffectItemSchema = z.object({
369
391
  seed: z.string().min(1).max(160).optional()
370
392
  }).strict()
371
393
  }).strict();
372
- const BoardSketchItemSchema = z.object({
394
+ const BoardCustomItemSchema = z.object({
373
395
  ...boxed(480, 320),
374
- type: z.literal("sketch"),
375
- props: z.object({
376
- src: srcSchema.refine((path) => /\.m?js$/.test(path), "sketch src must be a .js or .mjs module"),
377
- params: z.record(z.string(), z.unknown()).default({}),
378
- seed: z.string().min(1).max(160).optional()
379
- }).strict()
396
+ type: z.literal("custom"),
397
+ script: BoardScriptSchema,
398
+ props: z.object({}).strict().default({})
380
399
  }).strict();
381
400
  const BOARD_EXTENSION_TYPE_PATTERN = /^[a-z][a-z0-9]*(?:\.[a-z0-9-]+)+$/;
382
401
  const BoardExtensionItemSchema = z.object({
@@ -400,7 +419,7 @@ const BOARD_ITEM_SCHEMAS = {
400
419
  file: BoardFileItemSchema,
401
420
  task: BoardTaskItemSchema,
402
421
  effect: BoardEffectItemSchema,
403
- sketch: BoardSketchItemSchema
422
+ custom: BoardCustomItemSchema
404
423
  };
405
424
  const BOARD_ITEM_TYPES = Object.keys(BOARD_ITEM_SCHEMAS);
406
425
  function isBuiltinItemType(type) {
@@ -533,7 +552,7 @@ const BoardAnimationHeaderSchema = z.object({
533
552
  end: z.enum(["hold", "reset"]).default("hold"),
534
553
  markers: z.array(BoardMarkerSchema).max(1e4).default([])
535
554
  }).strict();
536
- const BoardAnimationSchema = BoardAnimationHeaderSchema.extend({ tracks: z.record(BoardIdSchema, BoardTrackSchema).default({}) }).strict();
555
+ const BoardAnimationSchema = BoardAnimationHeaderSchema.extend({ tracks: z.record(BoardKeySchema, BoardTrackSchema).default({}) }).strict();
537
556
  const BOARD_ENTER_PRESETS = [
538
557
  "fade-in",
539
558
  "rise",
@@ -583,10 +602,10 @@ const patchObject = z.record(z.string(), z.unknown());
583
602
  const BoardPatchSchema = z.object({
584
603
  board: patchObject.nullable().optional(),
585
604
  items: z.record(BoardIdSchema, patchObject.nullable()).optional(),
586
- animations: z.record(BoardIdSchema, patchObject.and(z.object({ tracks: z.record(BoardIdSchema, patchObject.nullable()).optional() })).nullable()).optional()
605
+ animations: z.record(BoardIdSchema, patchObject.and(z.object({ tracks: z.record(BoardKeySchema, patchObject.nullable()).optional() })).nullable()).optional()
587
606
  }).strict();
588
607
  function isEmptyBoardDelta(delta) {
589
608
  return !delta.board && Object.keys(delta.items ?? {}).length === 0 && Object.keys(delta.animations ?? {}).length === 0 && Object.keys(delta.tracks ?? {}).length === 0;
590
609
  }
591
610
  //#endregion
592
- export { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXTENSION_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchorSchema, BoardArrowBindingSchema, BoardArrowEndSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardBackgroundSchema, BoardColorSchema, BoardCropSchema, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaSnapshotSchema, BoardPatchSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardSketchItemSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem };
611
+ export { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXTENSION_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchorSchema, BoardArrowBindingSchema, BoardArrowEndSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardBackgroundSchema, BoardColorSchema, BoardCropSchema, BoardCustomItemSchema, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource };
@@ -82,7 +82,8 @@ const NOT_ANIMATABLE = /* @__PURE__ */ new Set([
82
82
  "parent",
83
83
  "z",
84
84
  "locked",
85
- "metadata"
85
+ "metadata",
86
+ "script"
86
87
  ]);
87
88
  const CAMERA_PROPERTIES = {
88
89
  focus: {
@@ -1,6 +1,6 @@
1
1
  //#region ../protocol/dist/board-schema.d.ts
2
2
  type JsonSchema = Record<string, unknown>;
3
- declare const BOARD_SCHEMA_TARGETS: readonly ["board", "animation", "track", "camera", ...("arrow" | "audio" | "draw" | "effect" | "file" | "frame" | "image" | "shape" | "sketch" | "task" | "text" | "video")[]];
3
+ declare const BOARD_SCHEMA_TARGETS: readonly ["board", "animation", "track", "camera", ...("arrow" | "audio" | "custom" | "draw" | "effect" | "file" | "frame" | "image" | "shape" | "task" | "text" | "video")[]];
4
4
  type BoardJsonSchemaResult = {
5
5
  schema?: JsonSchema;
6
6
  properties?: Array<{
@@ -11,6 +11,7 @@ type BoardJsonSchemaResult = {
11
11
  description: string;
12
12
  parameters: Record<string, string>;
13
13
  }>;
14
+ semantics?: Record<string, string>;
14
15
  };
15
16
  declare function boardJsonSchema(target: string): BoardJsonSchemaResult | null;
16
17
  declare function boardSchemaOverview(): {
@@ -19,7 +20,8 @@ declare function boardSchemaOverview(): {
19
20
  rotation: string;
20
21
  length: string;
21
22
  };
22
- types: ("arrow" | "audio" | "draw" | "effect" | "file" | "frame" | "image" | "shape" | "sketch" | "task" | "text" | "video")[];
23
+ coordinates: string;
24
+ types: ("arrow" | "audio" | "custom" | "draw" | "effect" | "file" | "frame" | "image" | "shape" | "task" | "text" | "video")[];
23
25
  colors: {
24
26
  tokens: readonly ["brand", "neutral", "black", "white", "blue", "green", "amber", "violet", "rose"];
25
27
  css: string;
@@ -1,4 +1,4 @@
1
- import { BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BoardAnimationHeaderSchema, BoardSettingsSchema, BoardTrackSchema, isBuiltinItemType } from "./board-model.js";
1
+ import { BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BoardAnimationHeaderSchema, BoardKeySchema, BoardSettingsSchema, BoardTrackSchema, isBuiltinItemType } from "./board-model.js";
2
2
  import { listBoardProperties } from "./board-patch.js";
3
3
  import { z } from "zod";
4
4
  //#region ../protocol/dist/board-schema.js
@@ -19,13 +19,26 @@ const BOARD_SCHEMA_TARGETS = [
19
19
  function boardJsonSchema(target) {
20
20
  if (target === "board") return { schema: toJsonSchema(BoardSettingsSchema) };
21
21
  if (target === "animation") return {
22
- schema: toJsonSchema(BoardAnimationHeaderSchema.extend({ tracks: z.record(z.string(), BoardTrackSchema).optional() })),
23
- properties: listBoardProperties("animation")
22
+ schema: toJsonSchema(BoardAnimationHeaderSchema.extend({ tracks: z.record(BoardKeySchema, BoardTrackSchema).optional() })),
23
+ properties: listBoardProperties("animation"),
24
+ semantics: { composition: "Target another animation's time property to drive its local clock. Parent markers control pauses; child markers are not automatically promoted." }
25
+ };
26
+ if (target === "track") return {
27
+ schema: toJsonSchema(BoardTrackSchema),
28
+ semantics: {
29
+ boundary: "Before the first keyframe and after the last, the value is held. Use opacity tracks to control visibility.",
30
+ easing: "Defaults to linear. The destination keyframe controls the incoming segment. Supports CSS easing keywords, cubic-bezier() and steps().",
31
+ composition: "replace: the most recently started track wins; ties use the lexicographically larger track ID. Before any start, the nearest upcoming track wins. add: numbers and positions add; opacity and scale multiply.",
32
+ interpolation: "auto interpolates numbers, colors and vectors; other values step. spline smooths vector motion. orient follows the position tangent."
33
+ }
24
34
  };
25
- if (target === "track") return { schema: toJsonSchema(BoardTrackSchema) };
26
35
  if (target === "effect") return {
27
36
  schema: toJsonSchema(BOARD_ITEM_SCHEMAS.effect),
28
37
  properties: listBoardProperties("effect"),
38
+ semantics: {
39
+ follow: "follow is used by trail only. Parent a particle effect to a decoration:none frame to move it with other items.",
40
+ time: "Effects use animation time in milliseconds. trail samples target history; seed makes procedural particles repeatable."
41
+ },
29
42
  kinds: Object.fromEntries(BOARD_EFFECT_KINDS.map((kind) => [kind, BOARD_EFFECT_KIND_INFO[kind]]))
30
43
  };
31
44
  if (target === "camera") return { properties: listBoardProperties(BOARD_CAMERA_TARGET) };
@@ -42,6 +55,7 @@ function boardSchemaOverview() {
42
55
  rotation: "degrees",
43
56
  length: "board units (1 = 1 CSS px at zoom 1)"
44
57
  },
58
+ coordinates: "Positions, draw points and unbound arrow endpoints are relative to their parent frame; without a parent they are world coordinates. Shape paths are fitted to the item size.",
45
59
  types: BOARD_ITEM_TYPES,
46
60
  colors: {
47
61
  tokens: BOARD_COLOR_TOKENS,