@neta-art/cohub 12.2.0 → 12.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +87 -3
  2. package/dist/board/editor/context.d.ts +2 -0
  3. package/dist/board/editor/document.d.ts +3 -1
  4. package/dist/board/editor/document.js +8 -6
  5. package/dist/board/editor/editor.d.ts +7 -3
  6. package/dist/board/editor/editor.js +8 -1
  7. package/dist/board/editor/index.d.ts +3 -3
  8. package/dist/board/editor/index.js +2 -2
  9. package/dist/board/editor/interaction.d.ts +23 -2
  10. package/dist/board/editor/interaction.js +99 -5
  11. package/dist/board/editor/query.d.ts +1 -1
  12. package/dist/board/editor/query.js +3 -7
  13. package/dist/board/editor/selection.js +13 -1
  14. package/dist/board/editor/tool.d.ts +4 -1
  15. package/dist/board/editor/tool.js +6 -1
  16. package/dist/board/model/asset-key.d.ts +9 -1
  17. package/dist/board/model/asset-key.js +27 -7
  18. package/dist/board/model/index.d.ts +5 -5
  19. package/dist/board/model/index.js +4 -4
  20. package/dist/board/model/items/create.js +1 -1
  21. package/dist/board/model/items/definition.d.ts +9 -1
  22. package/dist/board/model/items/index.d.ts +2 -2
  23. package/dist/board/model/items/registry.d.ts +2 -1
  24. package/dist/board/model/items/registry.js +1 -0
  25. package/dist/board/model/text-metrics.d.ts +21 -1
  26. package/dist/board/model/text-metrics.js +24 -1
  27. package/dist/board/model/themes.d.ts +49 -42
  28. package/dist/board/model/themes.js +49 -44
  29. package/dist/board/render/index.d.ts +8 -6
  30. package/dist/board/render/index.js +7 -5
  31. package/dist/board/render/labels.d.ts +15 -0
  32. package/dist/board/render/labels.js +14 -0
  33. package/dist/board/render/lod.d.ts +9 -1
  34. package/dist/board/render/lod.js +7 -1
  35. package/dist/board/render/media-interaction.d.ts +5 -2
  36. package/dist/board/render/media-interaction.js +14 -2
  37. package/dist/board/render/renderers/arrow-card-renderer.js +7 -5
  38. package/dist/board/render/renderers/board-renderer-registry.d.ts +12 -1
  39. package/dist/board/render/renderers/board-renderer-registry.js +9 -4
  40. package/dist/board/render/renderers/far-plate.d.ts +4 -1
  41. package/dist/board/render/renderers/far-plate.js +5 -1
  42. package/dist/board/render/renderers/file-card-renderer.js +44 -24
  43. package/dist/board/render/renderers/frame-card-renderer.js +9 -3
  44. package/dist/board/render/renderers/image-card-renderer.js +2 -2
  45. package/dist/board/render/renderers/model-card-renderer.js +2 -2
  46. package/dist/board/render/renderers/task-card-renderer.js +2 -2
  47. package/dist/board/render/renderers/video-card-renderer.js +2 -2
  48. package/dist/board/render/style.d.ts +1 -0
  49. package/dist/board/render/style.js +3 -1
  50. package/dist/board/render/text-edit.d.ts +32 -0
  51. package/dist/board/render/text-edit.js +134 -0
  52. package/dist/board/render/text-fit.d.ts +1 -3
  53. package/dist/board/render/text-fit.js +4 -43
  54. package/dist/board/render/text-measurement.d.ts +12 -2
  55. package/dist/board/render/text-measurement.js +55 -10
  56. package/dist/board/replica/index.d.ts +4 -2
  57. package/dist/board/replica/index.js +34 -21
  58. package/dist/board/replica/indexeddb.d.ts +16 -0
  59. package/dist/board/replica/indexeddb.js +155 -0
  60. package/dist/board/stage/assets.d.ts +16 -4
  61. package/dist/board/stage/assets.js +155 -30
  62. package/dist/board/stage/bench.d.ts +35 -0
  63. package/dist/board/stage/bench.js +153 -0
  64. package/dist/board/stage/device.d.ts +41 -0
  65. package/dist/board/stage/device.js +62 -0
  66. package/dist/board/stage/frame-budget.d.ts +19 -0
  67. package/dist/board/stage/frame-budget.js +69 -0
  68. package/dist/board/stage/idle.d.ts +4 -0
  69. package/dist/board/stage/idle.js +26 -0
  70. package/dist/board/stage/index.d.ts +9 -5
  71. package/dist/board/stage/index.js +5 -2
  72. package/dist/board/stage/presses.d.ts +21 -0
  73. package/dist/board/stage/presses.js +66 -0
  74. package/dist/board/stage/scene.d.ts +4 -0
  75. package/dist/board/stage/scene.js +45 -13
  76. package/dist/board/stage/stage.d.ts +21 -2
  77. package/dist/board/stage/stage.js +309 -89
  78. package/dist/board/stage/texture-pool.d.ts +6 -4
  79. package/dist/board/stage/texture-pool.js +42 -8
  80. package/dist/board/stage/views.d.ts +1 -1
  81. package/dist/board/stage/views.js +2 -2
  82. package/dist/chunks/environment.d.ts +6 -0
  83. package/dist/chunks/http.d.ts +9 -1
  84. package/dist/chunks/http.js +791 -4
  85. package/dist/index.d.ts +52 -1
  86. package/dist/index.js +65 -733
  87. package/dist/protocol/dist/board-model.d.ts +15 -1
  88. package/dist/protocol/dist/board-model.js +12 -2
  89. package/dist/protocol/dist/board-schema.d.ts +2 -1
  90. package/dist/protocol/dist/board-schema.js +4 -1
  91. package/dist/protocol/dist/core/media.js +4 -0
  92. package/dist/protocol/dist/index.d.ts +2 -2
  93. package/package.json +2 -1
@@ -265,12 +265,12 @@ const BOARD_THEME_DATA = {
265
265
  colorScheme: "dark",
266
266
  palette: {
267
267
  bg: 329221,
268
- surface: 2039072,
269
- hover: 1842202,
268
+ surface: 1249814,
269
+ hover: 1973788,
270
270
  border: 1842202,
271
- brand: 888041,
272
- text: 15920612,
273
- muted: 9999759,
271
+ brand: 3900150,
272
+ text: 16314853,
273
+ muted: 7630695,
274
274
  rare: 9235170,
275
275
  epic: 7266776,
276
276
  legendary: 15449187
@@ -279,58 +279,61 @@ const BOARD_THEME_DATA = {
279
279
  brand: {
280
280
  stroke: 15524306,
281
281
  fill: 15524306,
282
- label: 15920612
282
+ label: 16314853
283
283
  },
284
284
  neutral: {
285
- stroke: 15920612,
286
- fill: 15920612,
287
- label: 15920612
285
+ stroke: 15524306,
286
+ fill: 15524306,
287
+ label: 16314853
288
288
  },
289
289
  black: {
290
290
  stroke: 0,
291
291
  fill: 0,
292
- label: 15920612
292
+ label: 16314853
293
293
  },
294
294
  white: {
295
295
  stroke: 16777215,
296
296
  fill: 16777215,
297
- label: 15920612
297
+ label: 16314853
298
298
  },
299
299
  blue: {
300
300
  stroke: 9235170,
301
301
  fill: 9235170,
302
- label: 15920612
302
+ label: 16314853
303
303
  },
304
304
  green: {
305
305
  stroke: 8177036,
306
306
  fill: 8177036,
307
- label: 15920612
307
+ label: 16314853
308
308
  },
309
309
  amber: {
310
310
  stroke: 15449187,
311
311
  fill: 15449187,
312
- label: 15920612
312
+ label: 16314853
313
313
  },
314
314
  violet: {
315
315
  stroke: 11971327,
316
316
  fill: 11971327,
317
- label: 15920612
317
+ label: 16314853
318
318
  },
319
319
  rose: {
320
320
  stroke: 15562341,
321
321
  fill: 15562341,
322
- label: 15920612
322
+ label: 16314853
323
323
  }
324
324
  },
325
- style: {}
325
+ style: {
326
+ selection: { outset: 0 },
327
+ frameLabelSize: 16
328
+ }
326
329
  },
327
330
  "neta-pixel": {
328
331
  colorScheme: "light",
329
332
  palette: {
330
333
  bg: 16185078,
331
334
  surface: 16777215,
332
- hover: 15461355,
333
- border: 14935011,
335
+ hover: 16185078,
336
+ border: 15527149,
334
337
  brand: 1824230,
335
338
  text: 1447704,
336
339
  muted: 7566452,
@@ -394,9 +397,9 @@ const BOARD_THEME_DATA = {
394
397
  y: 0
395
398
  },
396
399
  selection: {
397
- width: 2,
398
- outset: 8,
399
- dash: 4,
400
+ width: 1.5,
401
+ outset: 0,
402
+ dash: 0,
400
403
  handle: "square",
401
404
  handleSize: 8
402
405
  },
@@ -404,19 +407,20 @@ const BOARD_THEME_DATA = {
404
407
  progress: "mosaic",
405
408
  icons: "pixel",
406
409
  motion: "stepped",
407
- font: "\"Figtree Variable\", \"PingFang SC\", \"Noto Sans CJK SC\", \"Microsoft YaHei\", system-ui, sans-serif"
410
+ font: "\"Figtree Variable\", \"PingFang SC\", \"Noto Sans CJK SC\", \"Microsoft YaHei\", system-ui, sans-serif",
411
+ frameLabelSize: 16
408
412
  }
409
413
  },
410
414
  "neta-pixel-dark": {
411
415
  colorScheme: "dark",
412
416
  palette: {
413
- bg: 1447704,
414
- surface: 2631979,
415
- hover: 3224115,
416
- border: 3618875,
417
+ bg: 1118739,
418
+ surface: 1842463,
419
+ hover: 2237220,
420
+ border: 2763565,
417
421
  brand: 1824230,
418
- text: 15921907,
419
- muted: 9408656,
422
+ text: 16185078,
423
+ muted: 9079436,
420
424
  rare: 1824230,
421
425
  epic: 1824230,
422
426
  legendary: 16766287
@@ -425,47 +429,47 @@ const BOARD_THEME_DATA = {
425
429
  brand: {
426
430
  stroke: 16185078,
427
431
  fill: 16185078,
428
- label: 15921907
432
+ label: 16185078
429
433
  },
430
434
  neutral: {
431
- stroke: 9408656,
432
- fill: 9408656,
433
- label: 15921907
435
+ stroke: 9079436,
436
+ fill: 9079436,
437
+ label: 16185078
434
438
  },
435
439
  black: {
436
440
  stroke: 0,
437
441
  fill: 0,
438
- label: 15921907
442
+ label: 16185078
439
443
  },
440
444
  white: {
441
445
  stroke: 16777215,
442
446
  fill: 16777215,
443
- label: 15921907
447
+ label: 16185078
444
448
  },
445
449
  blue: {
446
450
  stroke: 6010853,
447
451
  fill: 6010853,
448
- label: 15921907
452
+ label: 16185078
449
453
  },
450
454
  green: {
451
455
  stroke: 9683613,
452
456
  fill: 9683613,
453
- label: 15921907
457
+ label: 16185078
454
458
  },
455
459
  amber: {
456
460
  stroke: 14264410,
457
461
  fill: 14264410,
458
- label: 15921907
462
+ label: 16185078
459
463
  },
460
464
  violet: {
461
465
  stroke: 11441117,
462
466
  fill: 11441117,
463
- label: 15921907
467
+ label: 16185078
464
468
  },
465
469
  rose: {
466
470
  stroke: 15043210,
467
471
  fill: 15043210,
468
- label: 15921907
472
+ label: 16185078
469
473
  }
470
474
  },
471
475
  style: {
@@ -477,9 +481,9 @@ const BOARD_THEME_DATA = {
477
481
  y: 0
478
482
  },
479
483
  selection: {
480
- width: 2,
481
- outset: 8,
482
- dash: 4,
484
+ width: 1.5,
485
+ outset: 0,
486
+ dash: 0,
483
487
  handle: "square",
484
488
  handleSize: 8
485
489
  },
@@ -487,7 +491,8 @@ const BOARD_THEME_DATA = {
487
491
  progress: "mosaic",
488
492
  icons: "pixel",
489
493
  motion: "stepped",
490
- font: "\"Figtree Variable\", \"PingFang SC\", \"Noto Sans CJK SC\", \"Microsoft YaHei\", system-ui, sans-serif"
494
+ font: "\"Figtree Variable\", \"PingFang SC\", \"Noto Sans CJK SC\", \"Microsoft YaHei\", system-ui, sans-serif",
495
+ frameLabelSize: 16
491
496
  }
492
497
  }
493
498
  };
@@ -1,13 +1,13 @@
1
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";
3
- import { BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderLabels, BoardRenderPalette, BoardScriptHost, DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
2
+ import { BOARD_LOD_HYSTERESIS, BoardLod, BoardLodKind, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLodRatio, boardLodSize, boardLongEdge, boardTextSize } from "./lod.js";
3
+ import { BoardCardHit, BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderLabels, BoardRenderPalette, BoardScriptHost, DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
4
4
  import { createBoardRenderSampler } from "./sampling.js";
5
5
  import { BoardRenderDiagnostic, inspectBoardItems, inspectBoardScene, measureBoardText } from "./diagnostics.js";
6
6
  import { BoardBackgroundContext, createBoardBackground, updateBoardBackground } from "./board-background.js";
7
7
  import { CARD_TAG_SIZE, CardGlyph, CardTag, createCardTag, drawCardGlyph, formatBoardDuration, syncCardTag, traceCube, zoomCardTag } from "./card-tag.js";
8
8
  import { ClipGroup, clippingAncestor, isClippingFrame, syncClipGroup, traceFrameOutline } from "./clip.js";
9
9
  import { BoardCssPaint, parseBoardCssColor, parseBoardCssPaint } from "./css-color.js";
10
- import { BoardMediaAction, boardMediaActionAt, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayKeyCenter } from "./media-interaction.js";
10
+ import { BOARD_PLAY_MEDIA, BoardMediaAction, boardMediaActionAt, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayHit, mediaPlayKeyCenter } from "./media-interaction.js";
11
11
  import { defaultBoardPalette, itemAlpha, itemColor } from "./palette.js";
12
12
  import { BoardScriptHostOptions, BrowserBoardScriptHost, createBoardScriptHost } from "./script-host.js";
13
13
  import { prepareBrowserBoardScripts } from "./script-export.js";
@@ -15,8 +15,10 @@ import { dashPattern, endAngle, roundRectPoints, traceArrowhead, tracePolyline,
15
15
  import { CardCrop, CardElevation, CardRect, CardSurface, PIXEL_STEP, cardElevation, cardOutlinePoints, cardShadow, containRect, drawCardShadow, drawCardSurface, fillCardPicture, isBoardCard, traceCardOutline, tracePixelRect } from "./surface.js";
16
16
  import { BoardRenderTheme, boardRenderTheme } from "./theme.js";
17
17
  import { BOARD_EFFECT_MAX_PARTICLES } from "./renderers/effect-card-renderer.js";
18
- import { ellipsizeWrappedLines, fitLineWithEllipsis, fitTextToLines, fitTextToWidth } from "./text-fit.js";
19
- import { BOARD_FONT_STACKS, BoardTextStyle, boardTextStyle, canvasFont, canvasFontFamily, cssBaselineShift, ensureBoardTextMeasurement, installBoardTextMeasurement, layoutTextLines, onBoardTextFontsChange } from "./text-measurement.js";
18
+ import { FarPlateStyle, drawFarBars, drawFarPlate, farPictureTone } from "./renderers/far-plate.js";
19
+ import { BOARD_FONT_STACKS, BoardTextLineLayout, BoardTextLineOptions, BoardTextStyle, BoardTextWhiteSpace, boardTextStyle, canvasFont, canvasFontFamily, cssBaselineShift, ensureBoardTextMeasurement, fitLineWithEllipsis, installBoardTextMeasurement, layoutTextLines, measureTextWidth, onBoardTextFontsChange } from "./text-measurement.js";
20
+ import { BoardTextEditInput, BoardTextEditLayout, boardTextEditLayout } from "./text-edit.js";
21
+ import { fitTextToLines, fitTextToWidth } from "./text-fit.js";
20
22
  import { boardTextResolution, getBoardResolution, syncTextResolution, textZoomBucket } from "./text-resolution.js";
21
23
  import { VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, loadVideoThumbnailTexture, videoTextureNaturalSize, videoThumbnailSize } from "./video-thumbnail.js";
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 };
24
+ export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, BOARD_LOD_HYSTERESIS, BOARD_PLAY_MEDIA, BoardBackgroundContext, BoardCardHit, BoardCardRenderer, BoardCardRendererResolver, BoardCssPaint, BoardLod, BoardLodKind, BoardMediaAction, BoardRenderContext, BoardRenderDiagnostic, BoardRenderLabels, BoardRenderPalette, BoardRenderStyle, BoardRenderStyleInput, BoardRenderTheme, BoardScriptHost, BoardScriptHostOptions, BoardSelectionStyle, BoardShadowStyle, BoardTextEditInput, BoardTextEditLayout, BoardTextLineLayout, BoardTextLineOptions, BoardTextStyle, BoardTextWhiteSpace, BrowserBoardScriptHost, CARD_TAG_SIZE, COMPACT_BOARD_LOD, CardCrop, CardElevation, CardGlyph, CardRect, CardSurface, CardTag, ClipGroup, DEFAULT_BOARD_LOD, DEFAULT_BOARD_RENDER_LABELS, type FarPlateStyle, PIXEL_STEP, VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, boardCardDetailed, boardLodRatio, boardLodSize, boardLongEdge, boardMediaActionAt, boardRenderTheme, boardTextEditLayout, boardTextResolution, boardTextSize, boardTextStyle, canvasFont, canvasFontFamily, cardElevation, cardOutlinePoints, cardShadow, clippingAncestor, containRect, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, createCardTag, cssBaselineShift, dashPattern, defaultBoardPalette, defaultBoardRenderStyle, drawCardGlyph, drawCardShadow, drawCardSurface, drawFarBars, drawFarPlate, endAngle, ensureBoardTextMeasurement, farPictureTone, fillCardPicture, fitLineWithEllipsis, fitTextToLines, fitTextToWidth, formatBoardDuration, getBoardCardRenderer, getBoardResolution, inspectBoardItems, inspectBoardScene, installBoardTextMeasurement, isBoardCard, isClippingFrame, itemAlpha, itemColor, layoutTextLines, loadVideoThumbnailTexture, measureBoardText, measureTextWidth, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayHit, mediaPlayKeyCenter, onBoardTextFontsChange, parseBoardCssColor, parseBoardCssPaint, prepareBrowserBoardScripts, resolveBoardRenderStyle, roundRectPoints, syncCardTag, syncClipGroup, syncTextResolution, textZoomBucket, traceArrowhead, traceCardOutline, traceCube, traceFrameOutline, tracePixelRect, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize, zoomCardTag };
@@ -1,22 +1,24 @@
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, boardTextStyle, canvasFont, canvasFontFamily, cssBaselineShift, ensureBoardTextMeasurement, installBoardTextMeasurement, layoutTextLines, onBoardTextFontsChange } from "./text-measurement.js";
4
+ import { BOARD_FONT_STACKS, boardTextStyle, canvasFont, canvasFontFamily, cssBaselineShift, ensureBoardTextMeasurement, fitLineWithEllipsis, installBoardTextMeasurement, layoutTextLines, measureTextWidth, 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
+ import { BOARD_LOD_HYSTERESIS, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLodRatio, boardLodSize, boardLongEdge, boardTextSize } from "./lod.js";
7
7
  import { createBoardBackground, updateBoardBackground } from "./board-background.js";
8
- import { ellipsizeWrappedLines, fitLineWithEllipsis, fitTextToLines, fitTextToWidth } from "./text-fit.js";
8
+ import { fitTextToLines, fitTextToWidth } from "./text-fit.js";
9
9
  import { boardTextResolution, getBoardResolution, syncTextResolution, textZoomBucket } from "./text-resolution.js";
10
10
  import { CARD_TAG_SIZE, createCardTag, drawCardGlyph, formatBoardDuration, syncCardTag, traceCube, zoomCardTag } from "./card-tag.js";
11
11
  import { clippingAncestor, isClippingFrame, syncClipGroup, traceFrameOutline } from "./clip.js";
12
12
  import { dashPattern, endAngle, roundRectPoints, traceArrowhead, tracePolyline, trimPolyline } from "./stroke.js";
13
13
  import { PIXEL_STEP, cardElevation, cardOutlinePoints, cardShadow, containRect, drawCardShadow, drawCardSurface, fillCardPicture, isBoardCard, traceCardOutline, tracePixelRect } from "./surface.js";
14
- import { boardMediaActionAt, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayKeyCenter } from "./media-interaction.js";
14
+ import { drawFarBars, drawFarPlate, farPictureTone } from "./renderers/far-plate.js";
15
+ import { BOARD_PLAY_MEDIA, boardMediaActionAt, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayHit, mediaPlayKeyCenter } from "./media-interaction.js";
15
16
  import { BOARD_EFFECT_MAX_PARTICLES } from "./renderers/effect-card-renderer.js";
16
17
  import { DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
17
18
  import { createBoardScriptHost } from "./script-host.js";
18
19
  import { prepareBrowserBoardScripts } from "./script-export.js";
19
20
  import { defaultBoardRenderStyle, resolveBoardRenderStyle } from "./style.js";
20
21
  import { boardRenderTheme } from "./theme.js";
22
+ import { boardTextEditLayout } from "./text-edit.js";
21
23
  import { VIDEO_THUMBNAIL_MAX_EDGE, loadVideoThumbnailTexture, videoTextureNaturalSize, videoThumbnailSize } from "./video-thumbnail.js";
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 };
24
+ export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, BOARD_LOD_HYSTERESIS, BOARD_PLAY_MEDIA, CARD_TAG_SIZE, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, DEFAULT_BOARD_RENDER_LABELS, PIXEL_STEP, VIDEO_THUMBNAIL_MAX_EDGE, boardCardDetailed, boardLodRatio, boardLodSize, boardLongEdge, boardMediaActionAt, boardRenderTheme, boardTextEditLayout, boardTextResolution, boardTextSize, boardTextStyle, canvasFont, canvasFontFamily, cardElevation, cardOutlinePoints, cardShadow, clippingAncestor, containRect, createBoardBackground, createBoardCardRendererResolver, createBoardRenderSampler, createBoardScriptHost, createCardTag, cssBaselineShift, dashPattern, defaultBoardPalette, defaultBoardRenderStyle, drawCardGlyph, drawCardShadow, drawCardSurface, drawFarBars, drawFarPlate, endAngle, ensureBoardTextMeasurement, farPictureTone, fillCardPicture, fitLineWithEllipsis, fitTextToLines, fitTextToWidth, formatBoardDuration, getBoardCardRenderer, getBoardResolution, inspectBoardItems, inspectBoardScene, installBoardTextMeasurement, isBoardCard, isClippingFrame, itemAlpha, itemColor, layoutTextLines, loadVideoThumbnailTexture, measureBoardText, measureTextWidth, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayHit, 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,15 @@
1
+ import { BoardArrowItem } from "../../protocol/dist/board-model.js";
2
+ import "../../protocol/dist/index.js";
3
+ import { WorldPoint } from "../model/geometry.js";
4
+ import { ResolvedArrow } from "../model/arrow-geometry.js";
5
+ //#region src/board/render/labels.d.ts
6
+ declare const FRAME_LABEL_WEIGHT = "600";
7
+ declare const ARROW_LABEL: {
8
+ readonly fontWeight: "500";
9
+ readonly lineHeight: 1.25;
10
+ readonly padX: 0.5;
11
+ readonly padY: 0.25;
12
+ };
13
+ declare function arrowLabelAnchor(arrow: ResolvedArrow, style: BoardArrowItem["style"]): WorldPoint;
14
+ //#endregion
15
+ export { ARROW_LABEL, FRAME_LABEL_WEIGHT, arrowLabelAnchor };
@@ -0,0 +1,14 @@
1
+ import { pathPointAt } from "../model/arrow-geometry.js";
2
+ //#region src/board/render/labels.ts
3
+ const FRAME_LABEL_WEIGHT = "600";
4
+ const ARROW_LABEL = {
5
+ fontWeight: "500",
6
+ lineHeight: 1.25,
7
+ padX: .5,
8
+ padY: .25
9
+ };
10
+ function arrowLabelAnchor(arrow, style) {
11
+ return style.trim === void 0 ? arrow.mid : pathPointAt(arrow.path, .5);
12
+ }
13
+ //#endregion
14
+ export { ARROW_LABEL, FRAME_LABEL_WEIGHT, arrowLabelAnchor };
@@ -17,6 +17,14 @@ declare const COMPACT_BOARD_LOD: BoardLod;
17
17
  declare const BOARD_LOD_HYSTERESIS = 0.8;
18
18
  declare function boardCardDetailed(zoom: number): boolean;
19
19
  declare function boardLongEdge(item: BoardSceneItem): number;
20
+ type BoardLodRenderer = {
21
+ lod?: {
22
+ kind: BoardLodKind;
23
+ size?: (item: BoardSceneItem) => number;
24
+ };
25
+ };
26
+ declare function boardLodSize(renderer: BoardLodRenderer, item: BoardSceneItem): number;
27
+ declare function boardLodRatio(renderer: BoardLodRenderer, size: number, zoom: number, lod: BoardLod): number;
20
28
  declare function boardTextSize(item: BoardSceneItem): number;
21
29
  //#endregion
22
- export { BOARD_LOD_HYSTERESIS, BoardLod, BoardLodKind, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLongEdge, boardTextSize };
30
+ export { BOARD_LOD_HYSTERESIS, BoardLod, BoardLodKind, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLodRatio, boardLodSize, boardLongEdge, boardTextSize };
@@ -18,10 +18,16 @@ function boardCardDetailed(zoom) {
18
18
  function boardLongEdge(item) {
19
19
  return Math.max(item.frame.width, item.frame.height);
20
20
  }
21
+ function boardLodSize(renderer, item) {
22
+ return renderer.lod?.size?.(item) ?? boardLongEdge(item);
23
+ }
24
+ function boardLodRatio(renderer, size, zoom, lod) {
25
+ return size * zoom / lod[renderer.lod?.kind ?? "card"];
26
+ }
21
27
  function boardTextSize(item) {
22
28
  if (item.type !== "text") return boardLongEdge(item);
23
29
  const scale = item.frame.width / Math.max(1e-4, layoutBoardText(item.props).width);
24
30
  return clampBoardFontSize(item.props.fontSize ?? 24) * scale;
25
31
  }
26
32
  //#endregion
27
- export { BOARD_LOD_HYSTERESIS, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLongEdge, boardTextSize };
33
+ export { BOARD_LOD_HYSTERESIS, COMPACT_BOARD_LOD, DEFAULT_BOARD_LOD, boardCardDetailed, boardLodRatio, boardLodSize, boardLongEdge, boardTextSize };
@@ -1,8 +1,10 @@
1
1
  import { WorldPoint } from "../model/geometry.js";
2
2
  import { BoardSceneItem } from "../model/scene.js";
3
+ import { BoardCardHit, BoardRenderContext } from "./renderers/board-renderer-registry.js";
3
4
  //#region src/board/render/media-interaction.d.ts
5
+ declare const BOARD_PLAY_MEDIA = "play-media";
4
6
  type BoardMediaAction = {
5
- action: "play-media";
7
+ action: typeof BOARD_PLAY_MEDIA;
6
8
  itemId: string;
7
9
  };
8
10
  declare function mediaPlayBadgeVisible(item: BoardSceneItem, zoom: number, options: {
@@ -15,5 +17,6 @@ declare function boardMediaActionAt(item: BoardSceneItem, point: WorldPoint, zoo
15
17
  materialized: boolean;
16
18
  hasVideoPreview: boolean;
17
19
  }): BoardMediaAction | null;
20
+ declare function mediaPlayHit(item: BoardSceneItem, point: WorldPoint, context: BoardRenderContext): BoardCardHit | null;
18
21
  //#endregion
19
- export { BoardMediaAction, boardMediaActionAt, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayKeyCenter };
22
+ export { BOARD_PLAY_MEDIA, BoardMediaAction, boardMediaActionAt, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayHit, mediaPlayKeyCenter };
@@ -5,6 +5,7 @@ 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
8
+ const BOARD_PLAY_MEDIA = "play-media";
8
9
  function mediaPlayBadgeVisible(item, zoom, options) {
9
10
  if (!options.materialized) return false;
10
11
  if (item.type === "video" || item.type === "audio") return true;
@@ -34,9 +35,20 @@ function mediaPlayBadgeHit(item, point, zoom) {
34
35
  }
35
36
  function boardMediaActionAt(item, point, zoom, options) {
36
37
  return mediaPlayBadgeVisible(item, zoom, options) && mediaPlayBadgeHit(item, point, zoom) ? {
37
- action: "play-media",
38
+ action: BOARD_PLAY_MEDIA,
38
39
  itemId: item.id
39
40
  } : null;
40
41
  }
42
+ const PLAY_HIT = {
43
+ action: BOARD_PLAY_MEDIA,
44
+ cursor: "pointer"
45
+ };
46
+ function mediaPlayHit(item, point, context) {
47
+ const key = context.assetKey(item);
48
+ return boardMediaActionAt(item, point, context.zoom, {
49
+ materialized: true,
50
+ hasVideoPreview: Boolean(key && context.getTexture(key))
51
+ }) ? PLAY_HIT : null;
52
+ }
41
53
  //#endregion
42
- export { boardMediaActionAt, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayKeyCenter };
54
+ export { BOARD_PLAY_MEDIA, boardMediaActionAt, mediaPlayBadgeHit, mediaPlayBadgeVisible, mediaPlayHit, mediaPlayKeyCenter };
@@ -1,10 +1,11 @@
1
1
  import { BOARD_FONT_STACK } from "../../../protocol/dist/board-constants.js";
2
- import { pathPointAt, resolveSceneArrow } from "../../model/arrow-geometry.js";
2
+ import { resolveSceneArrow } from "../../model/arrow-geometry.js";
3
3
  import { itemAlpha, itemColor } from "../palette.js";
4
4
  import { syncTextResolution } from "../text-resolution.js";
5
5
  import { dashPattern, endAngle, traceArrowhead, tracePolyline, trimPolyline } from "../stroke.js";
6
6
  import { drawCardSurface } from "../surface.js";
7
7
  import { drawFarStroke } from "./far-plate.js";
8
+ import { ARROW_LABEL, arrowLabelAnchor } from "../labels.js";
8
9
  import { Container, Graphics, Text } from "pixi.js";
9
10
  //#region src/board/render/renderers/arrow-card-renderer.ts
10
11
  const partsByContainer = /* @__PURE__ */ new WeakMap();
@@ -67,8 +68,9 @@ function sync(container, item, context) {
67
68
  parts.label.text = props.label;
68
69
  parts.label.style.fill = context.palette.text;
69
70
  parts.label.style.fontSize = props.fontSize;
70
- const padX = props.fontSize * .5;
71
- const padY = props.fontSize * .25;
71
+ parts.label.style.lineHeight = props.fontSize * ARROW_LABEL.lineHeight;
72
+ const padX = props.fontSize * ARROW_LABEL.padX;
73
+ const padY = props.fontSize * ARROW_LABEL.padY;
72
74
  const { width, height } = parts.label;
73
75
  const plate = {
74
76
  x: -width / 2 - padX,
@@ -88,7 +90,7 @@ function sync(container, item, context) {
88
90
  const visible = props.label.length > 0 && (style.trim === void 0 || style.trim >= .5);
89
91
  parts.label.visible = visible;
90
92
  parts.backdrop.visible = visible;
91
- const mid = style.trim === void 0 ? resolved.mid : pathPointAt(resolved.path, .5);
93
+ const mid = arrowLabelAnchor(resolved, style);
92
94
  parts.label.position.set(mid.x, mid.y);
93
95
  parts.backdrop.position.set(mid.x, mid.y);
94
96
  }
@@ -104,7 +106,7 @@ const arrowCardRenderer = {
104
106
  fill: 16777215,
105
107
  fontFamily: BOARD_FONT_STACK,
106
108
  fontSize: 14,
107
- fontWeight: "500"
109
+ fontWeight: ARROW_LABEL.fontWeight
108
110
  },
109
111
  resolution: context.textResolution,
110
112
  roundPixels: true
@@ -1,6 +1,7 @@
1
1
  import { BoardCustomItem, BoardDocument, BoardSettings, BoardTaskItem } from "../../../protocol/dist/board-model.js";
2
2
  import { BoardFrame } from "../../../protocol/dist/board-layout.js";
3
3
  import "../../../protocol/dist/index.js";
4
+ import { WorldPoint } from "../../model/geometry.js";
4
5
  import { BoardScene, BoardSceneItem, SceneItem } from "../../model/scene.js";
5
6
  import { BoardShapeColors } from "../../model/palette.js";
6
7
  import { BoardRenderStyle } from "../style.js";
@@ -64,9 +65,18 @@ type BoardRenderContext = {
64
65
  assetKey: (item: BoardSceneItem) => string | null;
65
66
  getTexture: (key: string) => Texture | null;
66
67
  hasError: (key: string) => boolean;
68
+ assetTone?: (key: string) => number | null;
67
69
  fileState: (path: string) => "ok" | "missing" | "unavailable";
68
70
  acquireTexture: (key: string, item: BoardSceneItem) => void;
69
71
  releaseTexture: (key: string) => void;
72
+ hoveredHit?: {
73
+ itemId: string;
74
+ action: string;
75
+ } | null;
76
+ };
77
+ type BoardCardHit = {
78
+ action: string;
79
+ cursor?: string;
70
80
  };
71
81
  type BoardCardRenderer = {
72
82
  id: string;
@@ -89,6 +99,7 @@ type BoardCardRenderer = {
89
99
  kind: BoardLodKind;
90
100
  size?: (item: BoardSceneItem) => number;
91
101
  };
102
+ hitAt?: (item: BoardSceneItem, point: WorldPoint, context: BoardRenderContext) => BoardCardHit | null;
92
103
  renderFar?: (graphics: Graphics, item: BoardSceneItem, context: BoardRenderContext) => void;
93
104
  destroy?: (container: Container, context: BoardRenderContext) => void;
94
105
  };
@@ -101,4 +112,4 @@ declare function createBoardCardRendererResolver(renderers?: Iterable<BoardCardR
101
112
  /** The built-in renderers alone. */
102
113
  declare const getBoardCardRenderer: BoardCardRendererResolver;
103
114
  //#endregion
104
- export { BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderLabels, BoardRenderPalette, BoardScriptHost, DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer };
115
+ export { BoardCardHit, BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderLabels, BoardRenderPalette, BoardScriptHost, DEFAULT_BOARD_RENDER_LABELS, createBoardCardRendererResolver, getBoardCardRenderer };
@@ -1,6 +1,7 @@
1
1
  import { ensureBoardTextMeasurement } from "../text-measurement.js";
2
2
  import { audioCardRenderer } from "./audio-card-renderer.js";
3
3
  import { modelCardRenderer } from "./model-card-renderer.js";
4
+ import { mediaPlayHit } from "../media-interaction.js";
4
5
  import { arrowCardRenderer } from "./arrow-card-renderer.js";
5
6
  import { drawCardRenderer } from "./draw-card-renderer.js";
6
7
  import { effectCardRenderer } from "./effect-card-renderer.js";
@@ -21,14 +22,18 @@ const DEFAULT_BOARD_RENDER_LABELS = {
21
22
  previewUnavailable: "Preview unavailable",
22
23
  noPreview: "No preview"
23
24
  };
25
+ const playable = (renderer) => ({
26
+ ...renderer,
27
+ hitAt: mediaPlayHit
28
+ });
24
29
  const builtinCardRenderers = [
25
30
  textCardRenderer,
26
31
  imageCardRenderer,
27
- videoCardRenderer,
28
- audioCardRenderer,
29
- modelCardRenderer,
32
+ playable(videoCardRenderer),
33
+ playable(audioCardRenderer),
34
+ playable(modelCardRenderer),
30
35
  fileCardRenderer,
31
- taskCardRenderer,
36
+ playable(taskCardRenderer),
32
37
  shapeCardRenderer,
33
38
  drawCardRenderer,
34
39
  arrowCardRenderer,
@@ -1,5 +1,7 @@
1
1
  import { BoardFrame } from "../../../protocol/dist/board-layout.js";
2
2
  import "../../../protocol/dist/index.js";
3
+ import { BoardSceneItem } from "../../model/scene.js";
4
+ import { BoardRenderContext } from "./board-renderer-registry.js";
3
5
  import { Graphics } from "pixi.js";
4
6
  //#region src/board/render/renderers/far-plate.d.ts
5
7
  type LocalRect = {
@@ -14,6 +16,7 @@ type FarPlateStyle = {
14
16
  accent?: number;
15
17
  accentAlpha?: number;
16
18
  };
19
+ declare function farPictureTone(item: BoardSceneItem, context: BoardRenderContext): number | undefined;
17
20
  declare function drawFarPlate(graphics: Graphics, frame: BoardFrame, style: FarPlateStyle): void;
18
21
  declare function drawFarBars(graphics: Graphics, frame: BoardFrame, bars: readonly LocalRect[], style: {
19
22
  color: number;
@@ -29,4 +32,4 @@ declare function drawFarStroke(graphics: Graphics, points: ReadonlyArray<{
29
32
  alpha?: number;
30
33
  }): void;
31
34
  //#endregion
32
- export { FarPlateStyle, drawFarBars, drawFarPlate, drawFarStroke, farStrokeSamples };
35
+ export { FarPlateStyle, drawFarBars, drawFarPlate, drawFarStroke, farPictureTone, farStrokeSamples };
@@ -32,6 +32,10 @@ function traceLocal(graphics, frame, rect) {
32
32
  const d = corner(x, y + height);
33
33
  graphics.moveTo(a.x, a.y).lineTo(b.x, b.y).lineTo(c.x, c.y).lineTo(d.x, d.y).closePath();
34
34
  }
35
+ function farPictureTone(item, context) {
36
+ const key = context.assetKey(item);
37
+ return (key ? context.assetTone?.(key) : null) ?? void 0;
38
+ }
35
39
  function drawFarPlate(graphics, frame, style) {
36
40
  if (frame.width <= 0 || frame.height <= 0) return;
37
41
  traceLocal(graphics, frame, {
@@ -89,4 +93,4 @@ function drawFarStroke(graphics, points, style) {
89
93
  });
90
94
  }
91
95
  //#endregion
92
- export { drawFarBars, drawFarPlate, drawFarStroke, farStrokeSamples };
96
+ export { drawFarBars, drawFarPlate, drawFarStroke, farPictureTone, farStrokeSamples };