@neta-art/cohub 12.1.0 → 12.2.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 +8 -5
  2. package/dist/board/editor/editor.d.ts +1 -0
  3. package/dist/board/editor/editor.js +4 -0
  4. package/dist/board/editor/snapshots.js +5 -57
  5. package/dist/board/export/index.d.ts +2 -2
  6. package/dist/board/export/node/fonts.js +4 -0
  7. package/dist/board/export/node/index.d.ts +3 -0
  8. package/dist/board/export/node/index.js +13 -1
  9. package/dist/board/export/scene.d.ts +2 -2
  10. package/dist/board/export/scene.js +2 -2
  11. package/dist/board/model/asset-key.d.ts +16 -0
  12. package/dist/board/model/asset-key.js +92 -0
  13. package/dist/board/model/export-assets.d.ts +7 -3
  14. package/dist/board/model/export-assets.js +34 -13
  15. package/dist/board/model/index.d.ts +7 -5
  16. package/dist/board/model/index.js +9 -7
  17. package/dist/board/model/items/create.js +1 -1
  18. package/dist/board/model/media-sizes.d.ts +28 -0
  19. package/dist/board/model/media-sizes.js +64 -0
  20. package/dist/board/model/palette.d.ts +1 -0
  21. package/dist/board/model/palette.js +20 -130
  22. package/dist/board/model/text-metrics.d.ts +8 -3
  23. package/dist/board/model/text-metrics.js +13 -2
  24. package/dist/board/model/themes.d.ts +488 -0
  25. package/dist/board/model/themes.js +495 -0
  26. package/dist/board/render/card-tag.js +2 -2
  27. package/dist/board/render/index.d.ts +6 -4
  28. package/dist/board/render/index.js +5 -3
  29. package/dist/board/render/lod.d.ts +22 -0
  30. package/dist/board/render/lod.js +27 -0
  31. package/dist/board/render/media-interaction.js +1 -1
  32. package/dist/board/render/palette.js +2 -25
  33. package/dist/board/render/renderers/audio-card-renderer.js +2 -1
  34. package/dist/board/render/renderers/board-renderer-registry.d.ts +10 -0
  35. package/dist/board/render/renderers/custom-card-renderer.js +5 -5
  36. package/dist/board/render/renderers/far-plate.d.ts +11 -1
  37. package/dist/board/render/renderers/far-plate.js +27 -8
  38. package/dist/board/render/renderers/file-card-renderer.js +3 -5
  39. package/dist/board/render/renderers/image-card-renderer.js +32 -6
  40. package/dist/board/render/renderers/model-card-renderer.js +1 -1
  41. package/dist/board/render/renderers/shape-card-renderer.js +25 -24
  42. package/dist/board/render/renderers/task-card-renderer.js +7 -8
  43. package/dist/board/render/renderers/text-card-renderer.js +86 -41
  44. package/dist/board/render/renderers/video-card-renderer.js +2 -1
  45. package/dist/board/render/style.d.ts +7 -2
  46. package/dist/board/render/style.js +5 -1
  47. package/dist/board/render/surface.d.ts +5 -0
  48. package/dist/board/render/surface.js +13 -3
  49. package/dist/board/render/text-fit.js +8 -12
  50. package/dist/board/render/text-measurement.d.ts +15 -1
  51. package/dist/board/render/text-measurement.js +113 -20
  52. package/dist/board/render/text-resolution.d.ts +1 -6
  53. package/dist/board/render/text-resolution.js +1 -10
  54. package/dist/board/render/theme.d.ts +15 -0
  55. package/dist/board/render/theme.js +15 -0
  56. package/dist/board/stage/assets.d.ts +15 -4
  57. package/dist/board/stage/assets.js +155 -89
  58. package/dist/board/stage/index.d.ts +5 -5
  59. package/dist/board/stage/index.js +4 -4
  60. package/dist/board/stage/lru.d.ts +13 -9
  61. package/dist/board/stage/lru.js +38 -20
  62. package/dist/board/stage/scene.d.ts +11 -1
  63. package/dist/board/stage/scene.js +213 -138
  64. package/dist/board/stage/stage.d.ts +12 -1
  65. package/dist/board/stage/stage.js +97 -24
  66. package/dist/board/stage/texture-pool.d.ts +8 -1
  67. package/dist/board/stage/texture-pool.js +37 -1
  68. package/dist/chunks/app-realtime.js +1 -1
  69. package/dist/chunks/{transport.js → http-error.js} +37 -1
  70. package/dist/chunks/http.js +30 -10
  71. package/dist/http.js +1 -1
  72. package/dist/index.js +139 -131
  73. package/dist/media.d.ts +3 -27
  74. package/dist/media.js +3 -82
  75. package/dist/protocol/dist/board-constants.js +3 -3
  76. package/dist/protocol/dist/board-layout.d.ts +17 -3
  77. package/dist/protocol/dist/board-layout.js +68 -11
  78. package/dist/protocol/dist/core/media.d.ts +35 -1
  79. package/dist/protocol/dist/core/media.js +123 -1
  80. package/dist/protocol/dist/index.d.ts +2 -2
  81. package/dist/websocket.js +951 -1
  82. package/package.json +3 -2
  83. package/dist/board/model/image-key.d.ts +0 -9
  84. package/dist/board/model/image-key.js +0 -33
  85. package/dist/chunks/websocket.js +0 -988
@@ -0,0 +1,495 @@
1
+ //#region src/board/model/themes.ts
2
+ const BOARD_THEME_IDS = [
3
+ "dark",
4
+ "light",
5
+ "solarized-dark",
6
+ "solarized-light",
7
+ "neta-studio",
8
+ "neta-pixel",
9
+ "neta-pixel-dark"
10
+ ];
11
+ const BOARD_THEME_DATA = {
12
+ dark: {
13
+ colorScheme: "dark",
14
+ palette: {
15
+ bg: 1053203,
16
+ surface: 2369321,
17
+ hover: 2500907,
18
+ border: 3158838,
19
+ brand: 14564909,
20
+ text: 15330286,
21
+ muted: 10198947,
22
+ rare: 6009047,
23
+ epic: 2070983,
24
+ legendary: 15580004
25
+ },
26
+ colors: {
27
+ brand: {
28
+ stroke: 14564909,
29
+ fill: 14564909,
30
+ label: 15330286
31
+ },
32
+ neutral: {
33
+ stroke: 10198947,
34
+ fill: 10198947,
35
+ label: 15330286
36
+ },
37
+ black: {
38
+ stroke: 0,
39
+ fill: 0,
40
+ label: 15330286
41
+ },
42
+ white: {
43
+ stroke: 16777215,
44
+ fill: 16777215,
45
+ label: 15330286
46
+ },
47
+ blue: {
48
+ stroke: 6009047,
49
+ fill: 6009047,
50
+ label: 15330286
51
+ },
52
+ green: {
53
+ stroke: 7065501,
54
+ fill: 7065501,
55
+ label: 15330286
56
+ },
57
+ amber: {
58
+ stroke: 15580004,
59
+ fill: 15580004,
60
+ label: 15330286
61
+ },
62
+ violet: {
63
+ stroke: 11971577,
64
+ fill: 11971577,
65
+ label: 15330286
66
+ },
67
+ rose: {
68
+ stroke: 15950429,
69
+ fill: 15950429,
70
+ label: 15330286
71
+ }
72
+ },
73
+ style: {}
74
+ },
75
+ light: {
76
+ colorScheme: "light",
77
+ palette: {
78
+ bg: 16251130,
79
+ surface: 16777215,
80
+ hover: 15330029,
81
+ border: 14409442,
82
+ brand: 13582898,
83
+ text: 66050,
84
+ muted: 6251625,
85
+ rare: 24458,
86
+ epic: 19325,
87
+ legendary: 8804608
88
+ },
89
+ colors: {
90
+ brand: {
91
+ stroke: 13582898,
92
+ fill: 13582898,
93
+ label: 66050
94
+ },
95
+ neutral: {
96
+ stroke: 6251625,
97
+ fill: 6251625,
98
+ label: 66050
99
+ },
100
+ black: {
101
+ stroke: 0,
102
+ fill: 0,
103
+ label: 66050
104
+ },
105
+ white: {
106
+ stroke: 16777215,
107
+ fill: 16777215,
108
+ label: 66050
109
+ },
110
+ blue: {
111
+ stroke: 24458,
112
+ fill: 24458,
113
+ label: 66050
114
+ },
115
+ green: {
116
+ stroke: 26685,
117
+ fill: 26685,
118
+ label: 66050
119
+ },
120
+ amber: {
121
+ stroke: 8804608,
122
+ fill: 8804608,
123
+ label: 66050
124
+ },
125
+ violet: {
126
+ stroke: 6904238,
127
+ fill: 6904238,
128
+ label: 66050
129
+ },
130
+ rose: {
131
+ stroke: 10165794,
132
+ fill: 10165794,
133
+ label: 66050
134
+ }
135
+ },
136
+ style: {}
137
+ },
138
+ "solarized-dark": {
139
+ colorScheme: "dark",
140
+ palette: {
141
+ bg: 70677,
142
+ surface: 859936,
143
+ hover: 1057828,
144
+ border: 1582887,
145
+ brand: 34240,
146
+ text: 12572374,
147
+ muted: 6848639,
148
+ rare: 2206648,
149
+ epic: 38821,
150
+ legendary: 14790474
151
+ },
152
+ colors: {
153
+ brand: {
154
+ stroke: 34240,
155
+ fill: 34240,
156
+ label: 12572374
157
+ },
158
+ neutral: {
159
+ stroke: 6848639,
160
+ fill: 6848639,
161
+ label: 12572374
162
+ },
163
+ black: {
164
+ stroke: 0,
165
+ fill: 0,
166
+ label: 12572374
167
+ },
168
+ white: {
169
+ stroke: 16777215,
170
+ fill: 16777215,
171
+ label: 12572374
172
+ },
173
+ blue: {
174
+ stroke: 2206648,
175
+ fill: 2206648,
176
+ label: 12572374
177
+ },
178
+ green: {
179
+ stroke: 9481815,
180
+ fill: 9481815,
181
+ label: 12572374
182
+ },
183
+ amber: {
184
+ stroke: 14790474,
185
+ fill: 14790474,
186
+ label: 12572374
187
+ },
188
+ violet: {
189
+ stroke: 11182560,
190
+ fill: 11182560,
191
+ label: 12572374
192
+ },
193
+ rose: {
194
+ stroke: 15950429,
195
+ fill: 15950429,
196
+ label: 12572374
197
+ }
198
+ },
199
+ style: {}
200
+ },
201
+ "solarized-light": {
202
+ colorScheme: "light",
203
+ palette: {
204
+ bg: 16775902,
205
+ surface: 16446169,
206
+ hover: 15920337,
207
+ border: 14341313,
208
+ brand: 31924,
209
+ text: 2110772,
210
+ muted: 5860973,
211
+ rare: 28541,
212
+ epic: 23659,
213
+ legendary: 8936704
214
+ },
215
+ colors: {
216
+ brand: {
217
+ stroke: 31924,
218
+ fill: 31924,
219
+ label: 2110772
220
+ },
221
+ neutral: {
222
+ stroke: 5860973,
223
+ fill: 5860973,
224
+ label: 2110772
225
+ },
226
+ black: {
227
+ stroke: 0,
228
+ fill: 0,
229
+ label: 2110772
230
+ },
231
+ white: {
232
+ stroke: 16777215,
233
+ fill: 16777215,
234
+ label: 2110772
235
+ },
236
+ blue: {
237
+ stroke: 28541,
238
+ fill: 28541,
239
+ label: 2110772
240
+ },
241
+ green: {
242
+ stroke: 4809217,
243
+ fill: 4809217,
244
+ label: 2110772
245
+ },
246
+ amber: {
247
+ stroke: 8936704,
248
+ fill: 8936704,
249
+ label: 2110772
250
+ },
251
+ violet: {
252
+ stroke: 6904995,
253
+ fill: 6904995,
254
+ label: 2110772
255
+ },
256
+ rose: {
257
+ stroke: 10363429,
258
+ fill: 10363429,
259
+ label: 2110772
260
+ }
261
+ },
262
+ style: {}
263
+ },
264
+ "neta-studio": {
265
+ colorScheme: "dark",
266
+ palette: {
267
+ bg: 329221,
268
+ surface: 2039072,
269
+ hover: 1842202,
270
+ border: 1842202,
271
+ brand: 888041,
272
+ text: 15920612,
273
+ muted: 9999759,
274
+ rare: 9235170,
275
+ epic: 7266776,
276
+ legendary: 15449187
277
+ },
278
+ colors: {
279
+ brand: {
280
+ stroke: 15524306,
281
+ fill: 15524306,
282
+ label: 15920612
283
+ },
284
+ neutral: {
285
+ stroke: 15920612,
286
+ fill: 15920612,
287
+ label: 15920612
288
+ },
289
+ black: {
290
+ stroke: 0,
291
+ fill: 0,
292
+ label: 15920612
293
+ },
294
+ white: {
295
+ stroke: 16777215,
296
+ fill: 16777215,
297
+ label: 15920612
298
+ },
299
+ blue: {
300
+ stroke: 9235170,
301
+ fill: 9235170,
302
+ label: 15920612
303
+ },
304
+ green: {
305
+ stroke: 8177036,
306
+ fill: 8177036,
307
+ label: 15920612
308
+ },
309
+ amber: {
310
+ stroke: 15449187,
311
+ fill: 15449187,
312
+ label: 15920612
313
+ },
314
+ violet: {
315
+ stroke: 11971327,
316
+ fill: 11971327,
317
+ label: 15920612
318
+ },
319
+ rose: {
320
+ stroke: 15562341,
321
+ fill: 15562341,
322
+ label: 15920612
323
+ }
324
+ },
325
+ style: {}
326
+ },
327
+ "neta-pixel": {
328
+ colorScheme: "light",
329
+ palette: {
330
+ bg: 16185078,
331
+ surface: 16777215,
332
+ hover: 15461355,
333
+ border: 14935011,
334
+ brand: 1824230,
335
+ text: 1447704,
336
+ muted: 7566452,
337
+ rare: 31378,
338
+ epic: 31378,
339
+ legendary: 9725440
340
+ },
341
+ colors: {
342
+ brand: {
343
+ stroke: 1447704,
344
+ fill: 1447704,
345
+ label: 1447704
346
+ },
347
+ neutral: {
348
+ stroke: 7566452,
349
+ fill: 7566452,
350
+ label: 1447704
351
+ },
352
+ black: {
353
+ stroke: 0,
354
+ fill: 0,
355
+ label: 1447704
356
+ },
357
+ white: {
358
+ stroke: 16777215,
359
+ fill: 16777215,
360
+ label: 1447704
361
+ },
362
+ blue: {
363
+ stroke: 6010853,
364
+ fill: 6010853,
365
+ label: 1447704
366
+ },
367
+ green: {
368
+ stroke: 9683613,
369
+ fill: 9683613,
370
+ label: 1447704
371
+ },
372
+ amber: {
373
+ stroke: 14264410,
374
+ fill: 14264410,
375
+ label: 1447704
376
+ },
377
+ violet: {
378
+ stroke: 11441117,
379
+ fill: 11441117,
380
+ label: 1447704
381
+ },
382
+ rose: {
383
+ stroke: 15043210,
384
+ fill: 15043210,
385
+ label: 1447704
386
+ }
387
+ },
388
+ style: {
389
+ corner: "pixel",
390
+ shadow: {
391
+ color: 1447704,
392
+ alpha: .1,
393
+ blur: 20,
394
+ y: 0
395
+ },
396
+ selection: {
397
+ width: 2,
398
+ outset: 8,
399
+ dash: 4,
400
+ handle: "square",
401
+ handleSize: 8
402
+ },
403
+ media: "framed",
404
+ progress: "mosaic",
405
+ icons: "pixel",
406
+ motion: "stepped",
407
+ font: "\"Figtree Variable\", \"PingFang SC\", \"Noto Sans CJK SC\", \"Microsoft YaHei\", system-ui, sans-serif"
408
+ }
409
+ },
410
+ "neta-pixel-dark": {
411
+ colorScheme: "dark",
412
+ palette: {
413
+ bg: 1447704,
414
+ surface: 2631979,
415
+ hover: 3224115,
416
+ border: 3618875,
417
+ brand: 1824230,
418
+ text: 15921907,
419
+ muted: 9408656,
420
+ rare: 1824230,
421
+ epic: 1824230,
422
+ legendary: 16766287
423
+ },
424
+ colors: {
425
+ brand: {
426
+ stroke: 16185078,
427
+ fill: 16185078,
428
+ label: 15921907
429
+ },
430
+ neutral: {
431
+ stroke: 9408656,
432
+ fill: 9408656,
433
+ label: 15921907
434
+ },
435
+ black: {
436
+ stroke: 0,
437
+ fill: 0,
438
+ label: 15921907
439
+ },
440
+ white: {
441
+ stroke: 16777215,
442
+ fill: 16777215,
443
+ label: 15921907
444
+ },
445
+ blue: {
446
+ stroke: 6010853,
447
+ fill: 6010853,
448
+ label: 15921907
449
+ },
450
+ green: {
451
+ stroke: 9683613,
452
+ fill: 9683613,
453
+ label: 15921907
454
+ },
455
+ amber: {
456
+ stroke: 14264410,
457
+ fill: 14264410,
458
+ label: 15921907
459
+ },
460
+ violet: {
461
+ stroke: 11441117,
462
+ fill: 11441117,
463
+ label: 15921907
464
+ },
465
+ rose: {
466
+ stroke: 15043210,
467
+ fill: 15043210,
468
+ label: 15921907
469
+ }
470
+ },
471
+ style: {
472
+ corner: "pixel",
473
+ shadow: {
474
+ color: 0,
475
+ alpha: .4,
476
+ blur: 20,
477
+ y: 0
478
+ },
479
+ selection: {
480
+ width: 2,
481
+ outset: 8,
482
+ dash: 4,
483
+ handle: "square",
484
+ handleSize: 8
485
+ },
486
+ media: "framed",
487
+ progress: "mosaic",
488
+ icons: "pixel",
489
+ motion: "stepped",
490
+ font: "\"Figtree Variable\", \"PingFang SC\", \"Noto Sans CJK SC\", \"Microsoft YaHei\", system-ui, sans-serif"
491
+ }
492
+ }
493
+ };
494
+ //#endregion
495
+ export { BOARD_THEME_DATA, BOARD_THEME_IDS };
@@ -113,7 +113,7 @@ function drawLineGlyph(graphics, glyph, color) {
113
113
  11,
114
114
  2.5,
115
115
  11
116
- ]).stroke(line);
116
+ ], true).stroke(line);
117
117
  graphics.moveTo(7.5, 1).lineTo(7.5, 3).lineTo(9.5, 3).stroke(line);
118
118
  return;
119
119
  case "task":
@@ -154,7 +154,7 @@ function traceCube(graphics, cx, cy, radius) {
154
154
  cy + dy,
155
155
  cx - dx,
156
156
  cy - dy
157
- ]).moveTo(cx - dx, cy - dy).lineTo(cx, cy).lineTo(cx + dx, cy - dy).moveTo(cx, cy).lineTo(cx, cy + radius);
157
+ ], true).moveTo(cx - dx, cy - dy).lineTo(cx, cy).lineTo(cx + dx, cy - dy).moveTo(cx, cy).lineTo(cx, cy + radius);
158
158
  return graphics;
159
159
  }
160
160
  function drawCardGlyph(graphics, glyph, color, pixel) {
@@ -1,4 +1,5 @@
1
- import { BoardRenderStyle, BoardSelectionStyle, BoardShadowStyle, defaultBoardRenderStyle, resolveBoardRenderStyle } from "./style.js";
1
+ import { BoardRenderStyle, BoardRenderStyleInput, BoardSelectionStyle, BoardShadowStyle, defaultBoardRenderStyle, resolveBoardRenderStyle } from "./style.js";
2
+ import { BOARD_LOD_HYSTERESIS, BoardLod, BoardLodKind, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLongEdge, boardTextSize } from "./lod.js";
2
3
  import { BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderLabels, BoardRenderPalette, BoardScriptHost, DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
3
4
  import { createBoardRenderSampler } from "./sampling.js";
4
5
  import { BoardRenderDiagnostic, inspectBoardItems, inspectBoardScene, measureBoardText } from "./diagnostics.js";
@@ -12,9 +13,10 @@ import { BoardScriptHostOptions, BrowserBoardScriptHost, createBoardScriptHost }
12
13
  import { prepareBrowserBoardScripts } from "./script-export.js";
13
14
  import { dashPattern, endAngle, roundRectPoints, traceArrowhead, tracePolyline, trimPolyline } from "./stroke.js";
14
15
  import { CardCrop, CardElevation, CardRect, CardSurface, PIXEL_STEP, cardElevation, cardOutlinePoints, cardShadow, containRect, drawCardShadow, drawCardSurface, fillCardPicture, isBoardCard, traceCardOutline, tracePixelRect } from "./surface.js";
16
+ import { BoardRenderTheme, boardRenderTheme } from "./theme.js";
15
17
  import { BOARD_EFFECT_MAX_PARTICLES } from "./renderers/effect-card-renderer.js";
16
18
  import { ellipsizeWrappedLines, fitLineWithEllipsis, fitTextToLines, fitTextToWidth } from "./text-fit.js";
17
- import { BOARD_FONT_STACKS, ensureBoardTextMeasurement, installBoardTextMeasurement } from "./text-measurement.js";
18
- import { boardCardDetailed, boardTextResolution, getBoardResolution, syncTextResolution, syncTextWrapWidth, textZoomBucket } from "./text-resolution.js";
19
+ import { BOARD_FONT_STACKS, BoardTextStyle, boardTextStyle, canvasFont, canvasFontFamily, cssBaselineShift, ensureBoardTextMeasurement, installBoardTextMeasurement, layoutTextLines, onBoardTextFontsChange } from "./text-measurement.js";
20
+ import { boardTextResolution, getBoardResolution, syncTextResolution, textZoomBucket } from "./text-resolution.js";
19
21
  import { VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, loadVideoThumbnailTexture, videoTextureNaturalSize, videoThumbnailSize } from "./video-thumbnail.js";
20
- export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, BoardBackgroundContext, BoardCardRenderer, BoardCardRendererResolver, BoardCssPaint, BoardMediaAction, BoardRenderContext, BoardRenderDiagnostic, BoardRenderLabels, BoardRenderPalette, BoardRenderStyle, BoardScriptHost, BoardScriptHostOptions, BoardSelectionStyle, BoardShadowStyle, BrowserBoardScriptHost, CARD_TAG_SIZE, CardCrop, CardElevation, CardGlyph, CardRect, CardSurface, CardTag, ClipGroup, DEFAULT_BOARD_RENDER_LABELS, PIXEL_STEP, VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, boardCardDetailed, boardMediaActionAt, boardTextResolution, cardElevation, cardOutlinePoints, cardShadow, clippingAncestor, containRect, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, createCardTag, dashPattern, defaultBoardPalette, defaultBoardRenderStyle, drawCardGlyph, drawCardShadow, drawCardSurface, ellipsizeWrappedLines, endAngle, ensureBoardTextMeasurement, fillCardPicture, fitLineWithEllipsis, fitTextToLines, fitTextToWidth, formatBoardDuration, getBoardCardRenderer, getBoardResolution, inspectBoardItems, inspectBoardScene, installBoardTextMeasurement, isBoardCard, isClippingFrame, itemAlpha, itemColor, loadVideoThumbnailTexture, measureBoardText, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayKeyCenter, parseBoardCssColor, parseBoardCssPaint, prepareBrowserBoardScripts, resolveBoardRenderStyle, roundRectPoints, syncCardTag, syncClipGroup, syncTextResolution, syncTextWrapWidth, textZoomBucket, traceArrowhead, traceCardOutline, traceCube, traceFrameOutline, tracePixelRect, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize, zoomCardTag };
22
+ export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, BOARD_LOD_HYSTERESIS, BoardBackgroundContext, BoardCardRenderer, BoardCardRendererResolver, BoardCssPaint, BoardLod, BoardLodKind, BoardMediaAction, BoardRenderContext, BoardRenderDiagnostic, BoardRenderLabels, BoardRenderPalette, BoardRenderStyle, BoardRenderStyleInput, BoardRenderTheme, BoardScriptHost, BoardScriptHostOptions, BoardSelectionStyle, BoardShadowStyle, BoardTextStyle, BrowserBoardScriptHost, CARD_TAG_SIZE, COMPACT_BOARD_LOD, CardCrop, CardElevation, CardGlyph, CardRect, CardSurface, CardTag, ClipGroup, DEFAULT_BOARD_LOD, DEFAULT_BOARD_RENDER_LABELS, PIXEL_STEP, VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, boardCardDetailed, boardLongEdge, boardMediaActionAt, boardRenderTheme, boardTextResolution, boardTextSize, boardTextStyle, canvasFont, canvasFontFamily, cardElevation, cardOutlinePoints, cardShadow, clippingAncestor, containRect, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, createCardTag, cssBaselineShift, dashPattern, defaultBoardPalette, defaultBoardRenderStyle, drawCardGlyph, drawCardShadow, drawCardSurface, ellipsizeWrappedLines, endAngle, ensureBoardTextMeasurement, fillCardPicture, fitLineWithEllipsis, fitTextToLines, fitTextToWidth, formatBoardDuration, getBoardCardRenderer, getBoardResolution, inspectBoardItems, inspectBoardScene, installBoardTextMeasurement, isBoardCard, isClippingFrame, itemAlpha, itemColor, layoutTextLines, loadVideoThumbnailTexture, measureBoardText, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayKeyCenter, onBoardTextFontsChange, parseBoardCssColor, parseBoardCssPaint, prepareBrowserBoardScripts, resolveBoardRenderStyle, roundRectPoints, syncCardTag, syncClipGroup, syncTextResolution, textZoomBucket, traceArrowhead, traceCardOutline, traceCube, traceFrameOutline, tracePixelRect, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize, zoomCardTag };
@@ -1,11 +1,12 @@
1
1
  import { parseBoardCssColor, parseBoardCssPaint } from "./css-color.js";
2
2
  import { defaultBoardPalette, itemAlpha, itemColor } from "./palette.js";
3
3
  import { createBoardRenderSampler } from "./sampling.js";
4
- import { BOARD_FONT_STACKS, ensureBoardTextMeasurement, installBoardTextMeasurement } from "./text-measurement.js";
4
+ import { BOARD_FONT_STACKS, boardTextStyle, canvasFont, canvasFontFamily, cssBaselineShift, ensureBoardTextMeasurement, installBoardTextMeasurement, layoutTextLines, onBoardTextFontsChange } from "./text-measurement.js";
5
5
  import { inspectBoardItems, inspectBoardScene, measureBoardText } from "./diagnostics.js";
6
+ import { BOARD_LOD_HYSTERESIS, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLongEdge, boardTextSize } from "./lod.js";
6
7
  import { createBoardBackground, updateBoardBackground } from "./board-background.js";
7
8
  import { ellipsizeWrappedLines, fitLineWithEllipsis, fitTextToLines, fitTextToWidth } from "./text-fit.js";
8
- import { boardCardDetailed, boardTextResolution, getBoardResolution, syncTextResolution, syncTextWrapWidth, textZoomBucket } from "./text-resolution.js";
9
+ import { boardTextResolution, getBoardResolution, syncTextResolution, textZoomBucket } from "./text-resolution.js";
9
10
  import { CARD_TAG_SIZE, createCardTag, drawCardGlyph, formatBoardDuration, syncCardTag, traceCube, zoomCardTag } from "./card-tag.js";
10
11
  import { clippingAncestor, isClippingFrame, syncClipGroup, traceFrameOutline } from "./clip.js";
11
12
  import { dashPattern, endAngle, roundRectPoints, traceArrowhead, tracePolyline, trimPolyline } from "./stroke.js";
@@ -16,5 +17,6 @@ import { DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardC
16
17
  import { createBoardScriptHost } from "./script-host.js";
17
18
  import { prepareBrowserBoardScripts } from "./script-export.js";
18
19
  import { defaultBoardRenderStyle, resolveBoardRenderStyle } from "./style.js";
20
+ import { boardRenderTheme } from "./theme.js";
19
21
  import { VIDEO_THUMBNAIL_MAX_EDGE, loadVideoThumbnailTexture, videoTextureNaturalSize, videoThumbnailSize } from "./video-thumbnail.js";
20
- export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, CARD_TAG_SIZE, DEFAULT_BOARD_RENDER_LABELS, PIXEL_STEP, VIDEO_THUMBNAIL_MAX_EDGE, boardCardDetailed, boardMediaActionAt, boardTextResolution, cardElevation, cardOutlinePoints, cardShadow, clippingAncestor, containRect, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, createCardTag, dashPattern, defaultBoardPalette, defaultBoardRenderStyle, drawCardGlyph, drawCardShadow, drawCardSurface, ellipsizeWrappedLines, endAngle, ensureBoardTextMeasurement, fillCardPicture, fitLineWithEllipsis, fitTextToLines, fitTextToWidth, formatBoardDuration, getBoardCardRenderer, getBoardResolution, inspectBoardItems, inspectBoardScene, installBoardTextMeasurement, isBoardCard, isClippingFrame, itemAlpha, itemColor, loadVideoThumbnailTexture, measureBoardText, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayKeyCenter, parseBoardCssColor, parseBoardCssPaint, prepareBrowserBoardScripts, resolveBoardRenderStyle, roundRectPoints, syncCardTag, syncClipGroup, syncTextResolution, syncTextWrapWidth, textZoomBucket, traceArrowhead, traceCardOutline, traceCube, traceFrameOutline, tracePixelRect, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize, zoomCardTag };
22
+ export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, BOARD_LOD_HYSTERESIS, CARD_TAG_SIZE, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, DEFAULT_BOARD_RENDER_LABELS, PIXEL_STEP, VIDEO_THUMBNAIL_MAX_EDGE, boardCardDetailed, boardLongEdge, boardMediaActionAt, boardRenderTheme, boardTextResolution, boardTextSize, boardTextStyle, canvasFont, canvasFontFamily, cardElevation, cardOutlinePoints, cardShadow, clippingAncestor, containRect, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, createCardTag, cssBaselineShift, dashPattern, defaultBoardPalette, defaultBoardRenderStyle, drawCardGlyph, drawCardShadow, drawCardSurface, ellipsizeWrappedLines, endAngle, ensureBoardTextMeasurement, fillCardPicture, fitLineWithEllipsis, fitTextToLines, fitTextToWidth, formatBoardDuration, getBoardCardRenderer, getBoardResolution, inspectBoardItems, inspectBoardScene, installBoardTextMeasurement, isBoardCard, isClippingFrame, itemAlpha, itemColor, layoutTextLines, loadVideoThumbnailTexture, measureBoardText, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayKeyCenter, onBoardTextFontsChange, parseBoardCssColor, parseBoardCssPaint, prepareBrowserBoardScripts, resolveBoardRenderStyle, roundRectPoints, syncCardTag, syncClipGroup, syncTextResolution, textZoomBucket, traceArrowhead, traceCardOutline, traceCube, traceFrameOutline, tracePixelRect, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize, zoomCardTag };
@@ -0,0 +1,22 @@
1
+ import { BoardSceneItem } from "../model/scene.js";
2
+ //#region src/board/render/lod.d.ts
3
+ /** On-screen thresholds, in CSS pixels, below which a card draws on the far layer. */
4
+ type BoardLod = {
5
+ /** Long edge of images and video stills. */
6
+ media: number;
7
+ /** Font size of text. */
8
+ text: number;
9
+ /** Long edge of every other card. */
10
+ card: number;
11
+ /** Most live cards; beyond it the smallest draw on the far layer. */
12
+ live: number;
13
+ };
14
+ type BoardLodKind = Exclude<keyof BoardLod, "live">;
15
+ declare const DEFAULT_BOARD_LOD: BoardLod;
16
+ declare const COMPACT_BOARD_LOD: BoardLod;
17
+ declare const BOARD_LOD_HYSTERESIS = 0.8;
18
+ declare function boardCardDetailed(zoom: number): boolean;
19
+ declare function boardLongEdge(item: BoardSceneItem): number;
20
+ declare function boardTextSize(item: BoardSceneItem): number;
21
+ //#endregion
22
+ export { BOARD_LOD_HYSTERESIS, BoardLod, BoardLodKind, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLongEdge, boardTextSize };
@@ -0,0 +1,27 @@
1
+ import { clampBoardFontSize, layoutBoardText } from "../../protocol/dist/board-layout.js";
2
+ //#region src/board/render/lod.ts
3
+ const DEFAULT_BOARD_LOD = {
4
+ media: 12,
5
+ text: 4,
6
+ card: 24,
7
+ live: 1200
8
+ };
9
+ const COMPACT_BOARD_LOD = {
10
+ ...DEFAULT_BOARD_LOD,
11
+ live: 400
12
+ };
13
+ const BOARD_LOD_HYSTERESIS = .8;
14
+ const CARD_TEXT_SIZE = 12;
15
+ function boardCardDetailed(zoom) {
16
+ return zoom * CARD_TEXT_SIZE >= DEFAULT_BOARD_LOD.text;
17
+ }
18
+ function boardLongEdge(item) {
19
+ return Math.max(item.frame.width, item.frame.height);
20
+ }
21
+ function boardTextSize(item) {
22
+ if (item.type !== "text") return boardLongEdge(item);
23
+ const scale = item.frame.width / Math.max(1e-4, layoutBoardText(item.props).width);
24
+ return clampBoardFontSize(item.props.fontSize ?? 24) * scale;
25
+ }
26
+ //#endregion
27
+ export { BOARD_LOD_HYSTERESIS, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLongEdge, boardTextSize };
@@ -1,7 +1,7 @@
1
1
  import { featuredTaskArtifact } from "../../protocol/dist/board-task.js";
2
2
  import { degToRad, rotatePointAround, worldPoint } from "../model/geometry.js";
3
3
  import { isBoardModelItem } from "../model/media.js";
4
- import { boardCardDetailed } from "./text-resolution.js";
4
+ import { boardCardDetailed } from "./lod.js";
5
5
  import { audioKeyCenter } from "./renderers/audio-card-renderer.js";
6
6
  import { modelKeyCenter } from "./renderers/model-card-renderer.js";
7
7
  //#region src/board/render/media-interaction.ts
@@ -1,32 +1,9 @@
1
+ import { BOARD_THEME_DATA } from "../model/themes.js";
1
2
  import { resolveItemColor } from "../model/palette.js";
2
3
  import { parseBoardCssColor, parseBoardCssPaint } from "./css-color.js";
3
4
  //#region src/board/render/palette.ts
4
- const DARK = {
5
- bg: 1315860,
6
- surface: 2105376,
7
- hover: 2763306,
8
- border: 3815994,
9
- brand: 16734751,
10
- text: 16053492,
11
- muted: 9211020,
12
- rare: 3718648,
13
- epic: 10980346,
14
- legendary: 16096779
15
- };
16
- const LIGHT = {
17
- bg: 16251129,
18
- surface: 16777215,
19
- hover: 15329772,
20
- border: 14079706,
21
- brand: 15222030,
22
- text: 1579035,
23
- muted: 7041664,
24
- rare: 2450411,
25
- epic: 8141549,
26
- legendary: 11817737
27
- };
28
5
  function defaultBoardPalette(mode) {
29
- return { ...mode === "light" ? LIGHT : DARK };
6
+ return { ...BOARD_THEME_DATA[mode].palette };
30
7
  }
31
8
  function itemAlpha(context, color) {
32
9
  const value = typeof color === "object" && color ? color[context.colorScheme] : color;
@@ -1,6 +1,7 @@
1
1
  import { getMediaResourceTitle } from "../../model/media.js";
2
+ import { boardCardDetailed } from "../lod.js";
2
3
  import { fitTextToWidth } from "../text-fit.js";
3
- import { boardCardDetailed, syncTextResolution } from "../text-resolution.js";
4
+ import { syncTextResolution } from "../text-resolution.js";
4
5
  import { formatBoardDuration } from "../card-tag.js";
5
6
  import { drawAudioWaveform } from "../audio-waveform.js";
6
7
  import { cardElevation, drawCardSurface } from "../surface.js";
@@ -4,6 +4,7 @@ import "../../../protocol/dist/index.js";
4
4
  import { BoardScene, BoardSceneItem, SceneItem } from "../../model/scene.js";
5
5
  import { BoardShapeColors } from "../../model/palette.js";
6
6
  import { BoardRenderStyle } from "../style.js";
7
+ import { BoardLodKind } from "../lod.js";
7
8
  import { Container, Graphics, Texture } from "pixi.js";
8
9
  //#region src/board/render/renderers/board-renderer-registry.d.ts
9
10
  type BoardRenderPalette = {
@@ -41,6 +42,7 @@ type BoardRenderContext = {
41
42
  hoveredId: string | null;
42
43
  resizingIds: Set<string>;
43
44
  liftedIds: ReadonlySet<string>;
45
+ editingId?: string | null;
44
46
  palette: BoardRenderPalette;
45
47
  colors: BoardShapeColors;
46
48
  colorScheme: "dark" | "light";
@@ -79,6 +81,14 @@ type BoardCardRenderer = {
79
81
  resolution?: (container: Container, item: BoardSceneItem, context: BoardRenderContext) => void;
80
82
  /** Runs on every zoom step; only update transforms and visibility. */
81
83
  zoom?: (container: Container, zoom: number) => void;
84
+ /**
85
+ * Level of detail for `renderFar`: `size` is the world-unit measure kept
86
+ * legible (default: the long edge), held against the `BoardLod[kind]` threshold.
87
+ */
88
+ lod?: {
89
+ kind: BoardLodKind;
90
+ size?: (item: BoardSceneItem) => number;
91
+ };
82
92
  renderFar?: (graphics: Graphics, item: BoardSceneItem, context: BoardRenderContext) => void;
83
93
  destroy?: (container: Container, context: BoardRenderContext) => void;
84
94
  };