@neta-art/cohub 12.1.1 → 12.3.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 (134) hide show
  1. package/README.md +85 -8
  2. package/dist/board/editor/clipboard.js +1 -1
  3. package/dist/board/editor/creation.js +1 -1
  4. package/dist/board/editor/document.d.ts +3 -1
  5. package/dist/board/editor/document.js +8 -6
  6. package/dist/board/editor/editor.d.ts +8 -3
  7. package/dist/board/editor/editor.js +8 -2
  8. package/dist/board/editor/index.d.ts +3 -3
  9. package/dist/board/editor/index.js +2 -2
  10. package/dist/board/editor/interaction.d.ts +23 -2
  11. package/dist/board/editor/interaction.js +93 -4
  12. package/dist/board/editor/query.d.ts +1 -1
  13. package/dist/board/editor/query.js +3 -7
  14. package/dist/board/editor/selection.js +1 -1
  15. package/dist/board/editor/snapshots.js +5 -57
  16. package/dist/board/editor/tool.d.ts +4 -1
  17. package/dist/board/editor/tool.js +6 -1
  18. package/dist/board/export/index.d.ts +2 -2
  19. package/dist/board/export/index.js +1 -1
  20. package/dist/board/export/node/fonts.js +4 -0
  21. package/dist/board/export/node/index.d.ts +2 -0
  22. package/dist/board/export/node/index.js +8 -1
  23. package/dist/board/export/node/scripts.js +1 -1
  24. package/dist/board/export/scene.d.ts +2 -2
  25. package/dist/board/export/scene.js +2 -2
  26. package/dist/board/model/asset-key.d.ts +24 -0
  27. package/dist/board/model/asset-key.js +104 -0
  28. package/dist/board/model/export-assets.d.ts +7 -3
  29. package/dist/board/model/export-assets.js +34 -13
  30. package/dist/board/model/index.d.ts +9 -7
  31. package/dist/board/model/index.js +22 -20
  32. package/dist/board/model/items/create.js +3 -3
  33. package/dist/board/model/items/definition.d.ts +9 -1
  34. package/dist/board/model/items/index.d.ts +2 -2
  35. package/dist/board/model/items/registry.d.ts +2 -1
  36. package/dist/board/model/items/registry.js +1 -0
  37. package/dist/board/model/media-sizes.d.ts +28 -0
  38. package/dist/board/model/media-sizes.js +64 -0
  39. package/dist/board/model/palette.d.ts +1 -0
  40. package/dist/board/model/palette.js +20 -130
  41. package/dist/board/model/sampling.js +1 -1
  42. package/dist/board/model/text-metrics.d.ts +28 -3
  43. package/dist/board/model/text-metrics.js +36 -2
  44. package/dist/board/model/themes.d.ts +495 -0
  45. package/dist/board/model/themes.js +500 -0
  46. package/dist/board/render/card-tag.js +2 -2
  47. package/dist/board/render/index.d.ts +11 -7
  48. package/dist/board/render/index.js +9 -5
  49. package/dist/board/render/labels.d.ts +15 -0
  50. package/dist/board/render/labels.js +14 -0
  51. package/dist/board/render/lod.d.ts +30 -0
  52. package/dist/board/render/lod.js +33 -0
  53. package/dist/board/render/media-interaction.d.ts +5 -2
  54. package/dist/board/render/media-interaction.js +15 -3
  55. package/dist/board/render/palette.js +2 -25
  56. package/dist/board/render/renderers/arrow-card-renderer.js +7 -5
  57. package/dist/board/render/renderers/audio-card-renderer.js +3 -2
  58. package/dist/board/render/renderers/board-renderer-registry.d.ts +22 -1
  59. package/dist/board/render/renderers/board-renderer-registry.js +9 -4
  60. package/dist/board/render/renderers/custom-card-renderer.js +5 -5
  61. package/dist/board/render/renderers/draw-card-renderer.js +1 -1
  62. package/dist/board/render/renderers/far-plate.d.ts +14 -1
  63. package/dist/board/render/renderers/far-plate.js +31 -8
  64. package/dist/board/render/renderers/file-card-renderer.js +49 -31
  65. package/dist/board/render/renderers/frame-card-renderer.js +9 -3
  66. package/dist/board/render/renderers/image-card-renderer.js +34 -8
  67. package/dist/board/render/renderers/model-card-renderer.js +6 -6
  68. package/dist/board/render/renderers/shape-card-renderer.js +25 -24
  69. package/dist/board/render/renderers/task-card-renderer.js +9 -10
  70. package/dist/board/render/renderers/text-card-renderer.js +86 -41
  71. package/dist/board/render/renderers/video-card-renderer.js +5 -4
  72. package/dist/board/render/script-export.js +1 -1
  73. package/dist/board/render/script-host.js +3 -3
  74. package/dist/board/render/style.d.ts +8 -2
  75. package/dist/board/render/style.js +8 -2
  76. package/dist/board/render/surface.d.ts +5 -0
  77. package/dist/board/render/surface.js +13 -3
  78. package/dist/board/render/text-edit.d.ts +32 -0
  79. package/dist/board/render/text-edit.js +134 -0
  80. package/dist/board/render/text-fit.d.ts +1 -3
  81. package/dist/board/render/text-fit.js +6 -49
  82. package/dist/board/render/text-measurement.d.ts +25 -1
  83. package/dist/board/render/text-measurement.js +157 -19
  84. package/dist/board/render/text-resolution.d.ts +1 -6
  85. package/dist/board/render/text-resolution.js +1 -10
  86. package/dist/board/render/theme.d.ts +15 -0
  87. package/dist/board/render/theme.js +15 -0
  88. package/dist/board/replica/index.d.ts +4 -2
  89. package/dist/board/replica/index.js +28 -17
  90. package/dist/board/replica/indexeddb.d.ts +16 -0
  91. package/dist/board/replica/indexeddb.js +155 -0
  92. package/dist/board/stage/assets.d.ts +28 -5
  93. package/dist/board/stage/assets.js +293 -102
  94. package/dist/board/stage/bench.d.ts +35 -0
  95. package/dist/board/stage/bench.js +153 -0
  96. package/dist/board/stage/device.d.ts +41 -0
  97. package/dist/board/stage/device.js +62 -0
  98. package/dist/board/stage/frame-budget.d.ts +19 -0
  99. package/dist/board/stage/frame-budget.js +69 -0
  100. package/dist/board/stage/idle.d.ts +4 -0
  101. package/dist/board/stage/idle.js +26 -0
  102. package/dist/board/stage/index.d.ts +11 -7
  103. package/dist/board/stage/index.js +7 -4
  104. package/dist/board/stage/lru.d.ts +13 -9
  105. package/dist/board/stage/lru.js +38 -20
  106. package/dist/board/stage/presses.d.ts +21 -0
  107. package/dist/board/stage/presses.js +66 -0
  108. package/dist/board/stage/scene.d.ts +15 -1
  109. package/dist/board/stage/scene.js +248 -141
  110. package/dist/board/stage/stage.d.ts +28 -2
  111. package/dist/board/stage/stage.js +404 -112
  112. package/dist/board/stage/texture-pool.d.ts +10 -1
  113. package/dist/board/stage/texture-pool.js +72 -2
  114. package/dist/chunks/environment.d.ts +6 -0
  115. package/dist/chunks/http.d.ts +9 -1
  116. package/dist/chunks/http.js +791 -4
  117. package/dist/index.d.ts +52 -1
  118. package/dist/index.js +202 -862
  119. package/dist/media.d.ts +3 -27
  120. package/dist/media.js +3 -82
  121. package/dist/protocol/dist/board-constants.js +3 -3
  122. package/dist/protocol/dist/board-layout.d.ts +17 -3
  123. package/dist/protocol/dist/board-layout.js +68 -11
  124. package/dist/protocol/dist/board-model.d.ts +15 -1
  125. package/dist/protocol/dist/board-model.js +12 -2
  126. package/dist/protocol/dist/board-patch.js +1 -1
  127. package/dist/protocol/dist/board-schema.d.ts +2 -1
  128. package/dist/protocol/dist/board-schema.js +4 -1
  129. package/dist/protocol/dist/core/media.d.ts +35 -1
  130. package/dist/protocol/dist/core/media.js +127 -1
  131. package/dist/protocol/dist/index.d.ts +3 -3
  132. package/package.json +4 -2
  133. package/dist/board/model/image-key.d.ts +0 -9
  134. package/dist/board/model/image-key.js +0 -33
@@ -1,37 +1,39 @@
1
1
  import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "../../protocol/dist/board-constants.js";
2
2
  import { isPublicBoardRemoteAddress, normalizeBoardRemoteUrl } from "../../protocol/dist/board-url.js";
3
- import { 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, BoardMediaOriginSchema, 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 } from "../../protocol/dist/board-model.js";
4
- import { IDENTITY_MATRIX, anchorPoint, applyMatrix, arrowBindings, autoAnchorSide, bendControl, clampBoardFontSize, createBoardLayout, createDocumentLayout, drawPointsBounds, drawSampleRadius, estimateTextWidth, fitBoardMediaSize, framePoint, invertMatrix, isArrowBinding, layoutBoardText, multiplyMatrix, pointsRect, rotateAround, scaleVector, setBoardTextMeasurer, sideAnchor } from "../../protocol/dist/board-layout.js";
5
- import { applyBoardDelta, applyBoardPatch, applyBoardPatchToDocument, boardPatchTouches, createDocumentState, diffBoardDocuments, diffMergePatch, isEmptyBoardPatch, listBoardProperties, mergePatch, parseBoardDocument, pruneBoardTrack, resolveBoardProperty, trackReferences } from "../../protocol/dist/board-patch.js";
3
+ import { 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, BoardItemPreviewSchema, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, boardItemPreview, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource } from "../../protocol/dist/board-model.js";
6
4
  import { isBoardPath, parseBoardManifest, serializeBoardManifest } from "../../protocol/dist/board.js";
7
- import { BOARD_SCHEMA_TARGETS, boardJsonSchema, boardSchemaOverview } from "../../protocol/dist/board-schema.js";
8
5
  import { BOARD_TASK_SOURCE_PREFIX, boardTaskSource, featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, withObservedArtifactFacts } from "../../protocol/dist/board-task.js";
9
- import { placeBoardOverlay } from "./overlay-placement.js";
10
- import { boardScriptItems, hasBoardScripts } from "./script-index.js";
11
- import { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, VIEWPORT_MARGIN_RATIO, angleFromCenter, cameraForFocus, cameraForRect, cameraForState, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, normalizedPoint, panBy, pointToWorld, pointsBounds, radToDeg, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenOffset, screenPoint, screenToWorld, selectionBounds, stableCullRect, unionRects, visibleWorldRect, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround } from "./geometry.js";
12
- import { boardScriptScope, composeBoardScriptItems, prepareBoardScriptOutput, scriptTemporaryPrefix, validateBoardScriptCommit, validateBoardScriptOutput } from "./script-scene.js";
13
- import { boardScriptHitVisible, boardScriptTarget, resolveBoardScriptHit } from "./script-hit.js";
14
- import { BOARD_SCRIPT_API } from "./script-api.js";
15
- import { BOARD_SCRIPT_DRAWING_EXAMPLE } from "./script-example.js";
6
+ import { IDENTITY_MATRIX, adoptBoardNaturalSize, anchorPoint, applyMatrix, arrowBindings, autoAnchorSide, bendControl, clampBoardFontSize, createBoardLayout, createDocumentLayout, drawPointsBounds, drawSampleRadius, estimateTextWidth, fitBoardMediaSize, framePoint, invertMatrix, isArrowBinding, layoutBoardText, multiplyMatrix, pointsRect, rotateAround, scaleVector, setBoardTextLayouter, sideAnchor } from "../../protocol/dist/board-layout.js";
7
+ import { applyBoardDelta, applyBoardPatch, applyBoardPatchToDocument, boardPatchTouches, createDocumentState, diffBoardDocuments, diffMergePatch, isEmptyBoardPatch, listBoardProperties, mergePatch, parseBoardDocument, pruneBoardTrack, resolveBoardProperty, trackReferences } from "../../protocol/dist/board-patch.js";
8
+ import { BOARD_SCHEMA_TARGETS, boardJsonSchema, boardSchemaOverview } from "../../protocol/dist/board-schema.js";
16
9
  import { applyBoardEvaluation, boardAnimationTime, boardDocumentAt, boardEase, compileBoardAnimations, evaluateBoardAnimations, parseHexColor, sampleBoardTrack } from "./animation.js";
17
10
  import { buildBoardScene, orderBoardItems, placeItem, refreshBoardScene, sceneItemToItem, sceneItemsToRecord, toSceneItem } from "./scene.js";
11
+ import { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, VIEWPORT_MARGIN_RATIO, angleFromCenter, cameraForFocus, cameraForRect, cameraForState, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, normalizedPoint, panBy, pointToWorld, pointsBounds, radToDeg, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenOffset, screenPoint, screenToWorld, selectionBounds, stableCullRect, unionRects, visibleWorldRect, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround } from "./geometry.js";
18
12
  import { createBoardAnimationSampler, resolveBoardAnimationCamera } from "./sampling.js";
19
- import { boardPathTrack, boardSequence, boardSequencePatch } from "./authoring.js";
20
- import { BOARD_PRESET_NAMES, boardNestedAnimation, boardNestedAnimationTrack, boardPresetTracks, isBoardPresetName, listBoardPresets } from "./presets.js";
13
+ import { BOARD_THEME_IDS } from "./themes.js";
14
+ import { BOARD_COLORS, DEFAULT_BOARD_COLOR, boardColorCssVar, buildFallbackShapeColors, isBoardColorId, pickBoardColor, resolveBoardColor, resolveItemColor } from "./palette.js";
21
15
  import { ARROW_BINDING_GAP, arrowHitRadius, arrowPathBounds, distanceToArrow, pathMidpoint, pathPointAt, resolveAnchor, resolveArrow, resolveSceneArrow } from "./arrow-geometry.js";
22
- import { buildStrokeOutline, buildStrokeRibbonGeometry, computeDrawBounds, createStrokeRibbonBuilder, distanceToStroke, isStrokeCorner, sampleRadius, simplifyDrawIndices, trimDrawPoints } from "./draw-geometry.js";
23
- import { appendBoardDrawSamples, quantizeDrawCoordinate } from "./draw-input.js";
24
- import { BOARD_EXPORT_MAX_TEXTURES, selectBoardExportAssets } from "./export-assets.js";
25
16
  import { BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, exportItemBounds, normalizeBoardDocument, planBoardExport } from "./export-plan.js";
17
+ import { BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, SHAPE_LABEL_PADDING, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardEditableText, boardFontFamily, frameLabelHitRect, frameLabelOffset, layoutShapeLabel } from "./text-metrics.js";
26
18
  import { boardModelFormat, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind, isBoardModelItem } from "./media.js";
27
19
  import { FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, buildCodeExcerpt, buildFileExcerpt, buildFileSnapshot, fileBaseName, fileCategory, fileStem, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, resolveCoverRef, resolveFileTitle, resolveSpacePath, shouldFetchFileExcerpt, splitFrontmatter } from "./file-snapshot.js";
28
20
  import { availabilityFromError, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, formatFileSize, isFileSnapshotFresh, mergeFileSnapshot } from "./file-preview.js";
29
- import { BOARD_COLORS, DEFAULT_BOARD_COLOR, boardColorCssVar, buildFallbackShapeColors, isBoardColorId, pickBoardColor, resolveBoardColor, resolveItemColor } from "./palette.js";
21
+ import { buildStrokeOutline, buildStrokeRibbonGeometry, computeDrawBounds, createStrokeRibbonBuilder, distanceToStroke, isStrokeCorner, sampleRadius, simplifyDrawIndices, trimDrawPoints } from "./draw-geometry.js";
22
+ import { boardScriptItems, hasBoardScripts } from "./script-index.js";
23
+ import { boardScriptScope, composeBoardScriptItems, prepareBoardScriptOutput, scriptTemporaryPrefix, validateBoardScriptCommit, validateBoardScriptOutput } from "./script-scene.js";
24
+ import { boardScriptHitVisible, boardScriptTarget, resolveBoardScriptHit } from "./script-hit.js";
25
+ import { BOARD_THUMBNAIL_EDGE, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardTextureEdge, boardTexturePixels, imageAssetKey } from "./asset-key.js";
26
+ import { placeBoardOverlay } from "./overlay-placement.js";
27
+ import { BOARD_SCRIPT_API } from "./script-api.js";
28
+ import { BOARD_SCRIPT_DRAWING_EXAMPLE } from "./script-example.js";
29
+ import { boardPathTrack, boardSequence, boardSequencePatch } from "./authoring.js";
30
+ import { BOARD_PRESET_NAMES, boardNestedAnimation, boardNestedAnimationTrack, boardPresetTracks, isBoardPresetName, listBoardPresets } from "./presets.js";
31
+ import { appendBoardDrawSamples, quantizeDrawCoordinate } from "./draw-input.js";
32
+ import { BOARD_EXPORT_TEXTURE_BYTES, boardTextureBytes, selectBoardExportAssets } from "./export-assets.js";
30
33
  import { SHAPE_KINDS, isShapeKind } from "./shape-types.js";
31
- import { TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardFontFamily } from "./text-metrics.js";
32
34
  import { DEFAULT_BOARD_TOOL_STYLES, createBoardToolStyles } from "./tool-styles.js";
33
35
  import { clientToLocal, elementClientToLocal } from "./client-geometry.js";
34
- import { boardImageKeySource, imageAssetKey } from "./image-key.js";
36
+ import { boardMediaTarget, probeBoardMediaSize, settleBoardMediaSizes } from "./media-sizes.js";
35
37
  import { FULL_CAPABILITIES, defineBoardItem } from "./items/definition.js";
36
38
  import { builtinBoardItems } from "./items/builtin.js";
37
39
  import { createBoardEntityId, createBoardItemId } from "./items/id.js";
@@ -39,4 +41,4 @@ import { boardItemOrigin, boardOriginKey, boardTaskCardSize, createAppBoardItem,
39
41
  import { createBoardRegistry, defaultBoardRegistry } from "./items/registry.js";
40
42
  import { playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl } from "./media-playback.js";
41
43
  import { boardReplayActorKind, createBoardReplayPlayer } from "./replay.js";
42
- export { ARROW_BINDING_GAP, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_MAX_TEXTURES, 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_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_API, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, 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, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, SHAPE_KINDS, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardColorCssVar, boardDocumentAt, boardEase, boardFontFamily, boardImageKeySource, boardItemOrigin, boardItemSchema, boardJsonSchema, boardModelFormat, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskCardSize, boardTaskSource, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, clientToLocal, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, elementClientToLocal, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitBoardMediaSize, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardModelItem, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
44
+ export { ARROW_BINDING_GAP, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_TEXTURE_BYTES, BOARD_EXTENSION_TYPE_PATTERN, BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, 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_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_API, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BOARD_THEME_IDS, BOARD_THUMBNAIL_EDGE, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchorSchema, BoardArrowBindingSchema, BoardArrowEndSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardBackgroundSchema, BoardColorSchema, BoardCropSchema, BoardCustomItemSchema, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardItemPreviewSchema, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, SHAPE_KINDS, SHAPE_LABEL_PADDING, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, adoptBoardNaturalSize, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardColorCssVar, boardDocumentAt, boardEase, boardEditableText, boardFontFamily, boardItemOrigin, boardItemPreview, boardItemSchema, boardJsonSchema, boardMediaTarget, boardModelFormat, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskCardSize, boardTaskSource, boardTextureBytes, boardTextureEdge, boardTexturePixels, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, clientToLocal, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, elementClientToLocal, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitBoardMediaSize, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameLabelHitRect, frameLabelOffset, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardModelItem, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, layoutShapeLabel, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, probeBoardMediaSize, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextLayouter, settleBoardMediaSizes, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
@@ -1,12 +1,12 @@
1
1
  import { BOARD_DEFAULT_SIZES } from "../../../protocol/dist/board-constants.js";
2
2
  import { BoardMediaOriginSchema, parseBoardItem } from "../../../protocol/dist/board-model.js";
3
- import { fitBoardMediaSize, pointsRect } from "../../../protocol/dist/board-layout.js";
4
3
  import { featuredTaskArtifact } from "../../../protocol/dist/board-task.js";
4
+ import { fitBoardMediaSize, pointsRect } from "../../../protocol/dist/board-layout.js";
5
5
  import "../geometry.js";
6
- import { quantizeDrawCoordinate } from "../draw-input.js";
7
6
  import { boardModelFormat, getMediaResourceTitle, inferBoardMediaKind } from "../media.js";
8
7
  import { fileStem } from "../file-snapshot.js";
9
8
  import { filePreviewKind } from "../file-preview.js";
9
+ import { quantizeDrawCoordinate } from "../draw-input.js";
10
10
  import { DEFAULT_BOARD_TOOL_STYLES } from "../tool-styles.js";
11
11
  import { createBoardItemId } from "./id.js";
12
12
  //#region src/board/model/items/create.ts
@@ -249,7 +249,7 @@ function titleForBoardItem(value) {
249
249
  case "task": return value.props.snapshot.title;
250
250
  case "effect": return value.props.kind;
251
251
  case "custom": return value.script.src.split("/").pop() ?? "Custom";
252
- default: return value.type;
252
+ default: return value.preview?.title || value.type;
253
253
  }
254
254
  }
255
255
  const RESULT_GAP = 24;
@@ -15,10 +15,18 @@ type BoardItemCapabilities = {
15
15
  canLock: boolean;
16
16
  };
17
17
  type BoardItemResizeMode = "none" | "uniform" | "free";
18
+ /**
19
+ * What a plain press on an unselected item does. `select` selects it, like any
20
+ * item. `tap` opens it: a quick press reports an activation instead of selecting,
21
+ * a drag moves it (or pans, with the hand tool or read-only) without selecting,
22
+ * and hovering shows a pointer instead of connection ports.
23
+ */
24
+ type BoardItemActivation = "select" | "tap";
18
25
  declare const FULL_CAPABILITIES: BoardItemCapabilities;
19
26
  type BoardItemDefinition<Props extends Record<string, unknown> = Record<string, unknown>> = {
20
27
  type: BoardItemType;
21
28
  capabilities?: Partial<BoardItemCapabilities>;
29
+ activation?: BoardItemActivation;
22
30
  size?: {
23
31
  width: number;
24
32
  height: number;
@@ -32,4 +40,4 @@ type BoardItemOf<Definition> = Definition extends BoardItemDefinition<infer Prop
32
40
  } : never;
33
41
  declare function defineBoardItem<Props extends Record<string, unknown>>(definition: BoardItemDefinition<Props>): BoardItemDefinition<Props>;
34
42
  //#endregion
35
- export { BoardItemCapabilities, BoardItemDefinition, BoardItemOf, BoardItemResizeMode, FULL_CAPABILITIES, defineBoardItem };
43
+ export { BoardItemActivation, BoardItemCapabilities, BoardItemDefinition, BoardItemOf, BoardItemResizeMode, FULL_CAPABILITIES, defineBoardItem };
@@ -1,6 +1,6 @@
1
- import { BoardItemCapabilities, BoardItemDefinition, BoardItemOf, BoardItemResizeMode, FULL_CAPABILITIES, defineBoardItem } from "./definition.js";
1
+ import { BoardItemActivation, BoardItemCapabilities, BoardItemDefinition, BoardItemOf, BoardItemResizeMode, FULL_CAPABILITIES, defineBoardItem } from "./definition.js";
2
2
  import { builtinBoardItems } from "./builtin.js";
3
3
  import { BoardAppMetadata, BoardItemEntry, BoardMediaItemKind, boardItemOrigin, boardOriginKey, boardTaskCardSize, createAppBoardItem, createArrowBoardItem, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createTaskBoardItem, createTaskResultItems, createTextBoardItem, mediaFrameSize, titleForBoardItem } from "./create.js";
4
4
  import { createBoardEntityId, createBoardItemId } from "./id.js";
5
5
  import { BoardItemInput, BoardRegistry, createBoardRegistry, defaultBoardRegistry } from "./registry.js";
6
- export { BoardAppMetadata, BoardItemCapabilities, BoardItemDefinition, BoardItemEntry, BoardItemInput, BoardItemOf, BoardItemResizeMode, BoardMediaItemKind, BoardRegistry, FULL_CAPABILITIES, boardItemOrigin, boardOriginKey, boardTaskCardSize, builtinBoardItems, createAppBoardItem, createArrowBoardItem, createBoardEntityId, createBoardItemId, createBoardRegistry, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, mediaFrameSize, titleForBoardItem };
6
+ export { BoardAppMetadata, BoardItemActivation, BoardItemCapabilities, BoardItemDefinition, BoardItemEntry, BoardItemInput, BoardItemOf, BoardItemResizeMode, BoardMediaItemKind, BoardRegistry, FULL_CAPABILITIES, boardItemOrigin, boardOriginKey, boardTaskCardSize, builtinBoardItems, createAppBoardItem, createArrowBoardItem, createBoardEntityId, createBoardItemId, createBoardRegistry, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, mediaFrameSize, titleForBoardItem };
@@ -2,7 +2,7 @@ import { BoardItem } from "../../../protocol/dist/board-model.js";
2
2
  import "../../../protocol/dist/index.js";
3
3
  import { Rect, WorldPoint } from "../geometry.js";
4
4
  import { BoardSceneItem } from "../scene.js";
5
- import { BoardItemCapabilities, BoardItemDefinition, BoardItemResizeMode } from "./definition.js";
5
+ import { BoardItemActivation, BoardItemCapabilities, BoardItemDefinition, BoardItemResizeMode } from "./definition.js";
6
6
  import { BoardItemEntry } from "./create.js";
7
7
  //#region src/board/model/items/registry.d.ts
8
8
  type BoardItemInput = {
@@ -18,6 +18,7 @@ type BoardRegistry = {
18
18
  readonly definitions: readonly BoardItemDefinition[];
19
19
  get(type: string): BoardItemDefinition | undefined;
20
20
  capabilities(item: Pick<BoardItem, "type">): BoardItemCapabilities;
21
+ activation(item: Pick<BoardItem, "type">): BoardItemActivation;
21
22
  resizeMode(item: Pick<BoardItem, "type">): BoardItemResizeMode;
22
23
  bounds(item: BoardSceneItem): Rect;
23
24
  hitTest(item: BoardSceneItem, point: WorldPoint): boolean;
@@ -35,6 +35,7 @@ function createBoardRegistry(definitions = []) {
35
35
  definitions: [...byType.values()],
36
36
  get: (type) => byType.get(type),
37
37
  capabilities: (item) => capabilitiesOf(item.type),
38
+ activation: (item) => byType.get(item.type)?.activation ?? "select",
38
39
  resizeMode(item) {
39
40
  const value = capabilitiesOf(item.type);
40
41
  if (!value.canResize) return "none";
@@ -0,0 +1,28 @@
1
+ import { BoardItem } from "../../protocol/dist/board-model.js";
2
+ import "../../protocol/dist/index.js";
3
+ //#region src/board/model/media-sizes.d.ts
4
+ type BoardMediaSize = {
5
+ width: number;
6
+ height: number;
7
+ };
8
+ type BoardMediaTarget = {
9
+ id: string;
10
+ type: "image" | "video";
11
+ source: {
12
+ kind: "file" | "url";
13
+ value: string;
14
+ };
15
+ };
16
+ type BoardMediaFileResolver = (path: string, type: BoardMediaTarget["type"], signal?: AbortSignal) => Promise<BoardMediaSize | string | null>;
17
+ type BoardMediaSizeOptions = {
18
+ resolveFile?: BoardMediaFileResolver;
19
+ signal?: AbortSignal;
20
+ };
21
+ declare function boardMediaTarget(id: string, item: BoardItem): BoardMediaTarget | null;
22
+ declare function probeBoardMediaSize(target: Omit<BoardMediaTarget, "id">, options?: BoardMediaSizeOptions): Promise<BoardMediaSize | null>;
23
+ /** Probes each unique media source once; unresolved items are left as is. */
24
+ declare function settleBoardMediaSizes(items: Readonly<Record<string, BoardItem>>, options?: Omit<BoardMediaSizeOptions, "signal"> & {
25
+ timeoutMs?: number;
26
+ }): Promise<Record<string, BoardItem>>;
27
+ //#endregion
28
+ export { BoardMediaFileResolver, BoardMediaSize, BoardMediaSizeOptions, BoardMediaTarget, boardMediaTarget, probeBoardMediaSize, settleBoardMediaSizes };
@@ -0,0 +1,64 @@
1
+ import { probeMediaSize } from "../../protocol/dist/core/media.js";
2
+ import { parseBoardMediaSource } from "../../protocol/dist/board-model.js";
3
+ import { featuredTaskArtifact } from "../../protocol/dist/board-task.js";
4
+ import { adoptBoardNaturalSize } from "../../protocol/dist/board-layout.js";
5
+ //#region src/board/model/media-sizes.ts
6
+ function boardMediaTarget(id, item) {
7
+ if (item.type === "image" || item.type === "video") {
8
+ if (item.props.snapshot?.naturalWidth && item.props.snapshot.naturalHeight) return null;
9
+ const source = parseBoardMediaSource(item.props.src);
10
+ return source ? {
11
+ id,
12
+ type: item.type,
13
+ source
14
+ } : null;
15
+ }
16
+ if (item.type !== "task") return null;
17
+ const artifact = featuredTaskArtifact(item.props.snapshot.artifacts);
18
+ if (artifact?.type !== "image" && artifact?.type !== "video" || artifact.naturalWidth && artifact.naturalHeight) return null;
19
+ return {
20
+ id,
21
+ type: artifact.type,
22
+ source: {
23
+ kind: "url",
24
+ value: artifact.url
25
+ }
26
+ };
27
+ }
28
+ async function probeBoardMediaSize(target, options = {}) {
29
+ const { type, source } = target;
30
+ try {
31
+ const resolved = source.kind === "url" ? source.value : await options.resolveFile?.(source.value, type, options.signal);
32
+ if (typeof resolved !== "string") return resolved ?? null;
33
+ return await probeMediaSize(resolved, type, { signal: options.signal });
34
+ } catch {
35
+ return null;
36
+ }
37
+ }
38
+ const CONCURRENCY = 8;
39
+ /** Probes each unique media source once; unresolved items are left as is. */
40
+ async function settleBoardMediaSizes(items, options = {}) {
41
+ const targets = Object.entries(items).flatMap(([id, item]) => boardMediaTarget(id, item) ?? []);
42
+ const signal = AbortSignal.timeout(options.timeoutMs ?? 5e3);
43
+ const probes = /* @__PURE__ */ new Map();
44
+ const settled = {};
45
+ let next = 0;
46
+ const work = async () => {
47
+ for (let target = targets[next++]; target; target = targets[next++]) {
48
+ const key = `${target.type}:${target.source.kind}:${target.source.value}`;
49
+ const probe = probes.get(key) ?? probeBoardMediaSize(target, {
50
+ ...options,
51
+ signal
52
+ });
53
+ probes.set(key, probe);
54
+ const size = await probe;
55
+ const item = items[target.id];
56
+ const adopted = size && item && adoptBoardNaturalSize(item, size);
57
+ if (adopted) settled[target.id] = adopted;
58
+ }
59
+ };
60
+ await Promise.all(Array.from({ length: CONCURRENCY }, work));
61
+ return settled;
62
+ }
63
+ //#endregion
64
+ export { boardMediaTarget, probeBoardMediaSize, settleBoardMediaSizes };
@@ -13,6 +13,7 @@ type BoardColorEntry = {
13
13
  dark: BoardColorValue;
14
14
  light: BoardColorValue;
15
15
  };
16
+ /** Swatches with the colors of the default dark and light themes. */
16
17
  declare const BOARD_COLORS: readonly BoardColorEntry[];
17
18
  declare const DEFAULT_BOARD_COLOR: BoardColorId;
18
19
  declare function isBoardColorId(value: unknown): value is BoardColorId;
@@ -1,134 +1,24 @@
1
+ import { BOARD_COLOR_TOKENS } from "../../protocol/dist/board-model.js";
2
+ import { BOARD_THEME_DATA } from "./themes.js";
1
3
  //#region src/board/model/palette.ts
2
- const LABEL_DARK = 16053492;
3
- const LABEL_LIGHT = 1579035;
4
- const BOARD_COLORS = [
5
- {
6
- id: "brand",
7
- label: "Brand",
8
- dark: {
9
- stroke: 16734751,
10
- fill: 16734751,
11
- label: LABEL_DARK
12
- },
13
- light: {
14
- stroke: 15222030,
15
- fill: 15222030,
16
- label: LABEL_LIGHT
17
- }
18
- },
19
- {
20
- id: "neutral",
21
- label: "Neutral",
22
- dark: {
23
- stroke: 10133670,
24
- fill: 10133670,
25
- label: LABEL_DARK
26
- },
27
- light: {
28
- stroke: 6251368,
29
- fill: 6251368,
30
- label: LABEL_LIGHT
31
- }
32
- },
33
- {
34
- id: "black",
35
- label: "Black",
36
- dark: {
37
- stroke: 0,
38
- fill: 0,
39
- label: LABEL_DARK
40
- },
41
- light: {
42
- stroke: 0,
43
- fill: 0,
44
- label: LABEL_LIGHT
45
- }
46
- },
47
- {
48
- id: "white",
49
- label: "White",
50
- dark: {
51
- stroke: 16777215,
52
- fill: 16777215,
53
- label: LABEL_DARK
54
- },
55
- light: {
56
- stroke: 16777215,
57
- fill: 16777215,
58
- label: LABEL_LIGHT
59
- }
60
- },
61
- {
62
- id: "blue",
63
- label: "Blue",
64
- dark: {
65
- stroke: 3718648,
66
- fill: 3718648,
67
- label: LABEL_DARK
68
- },
69
- light: {
70
- stroke: 2450411,
71
- fill: 2450411,
72
- label: LABEL_LIGHT
73
- }
74
- },
75
- {
76
- id: "green",
77
- label: "Green",
78
- dark: {
79
- stroke: 3462041,
80
- fill: 3462041,
81
- label: LABEL_DARK
82
- },
83
- light: {
84
- stroke: 1483594,
85
- fill: 1483594,
86
- label: LABEL_LIGHT
87
- }
88
- },
89
- {
90
- id: "amber",
91
- label: "Amber",
92
- dark: {
93
- stroke: 16096779,
94
- fill: 16096779,
95
- label: LABEL_DARK
96
- },
97
- light: {
98
- stroke: 14251782,
99
- fill: 14251782,
100
- label: LABEL_LIGHT
101
- }
102
- },
103
- {
104
- id: "violet",
105
- label: "Violet",
106
- dark: {
107
- stroke: 10980346,
108
- fill: 10980346,
109
- label: LABEL_DARK
110
- },
111
- light: {
112
- stroke: 8141549,
113
- fill: 8141549,
114
- label: LABEL_LIGHT
115
- }
116
- },
117
- {
118
- id: "rose",
119
- label: "Rose",
120
- dark: {
121
- stroke: 16478597,
122
- fill: 16478597,
123
- label: LABEL_DARK
124
- },
125
- light: {
126
- stroke: 14753096,
127
- fill: 14753096,
128
- label: LABEL_LIGHT
129
- }
130
- }
131
- ];
4
+ const COLOR_LABELS = {
5
+ brand: "Brand",
6
+ neutral: "Neutral",
7
+ black: "Black",
8
+ white: "White",
9
+ blue: "Blue",
10
+ green: "Green",
11
+ amber: "Amber",
12
+ violet: "Violet",
13
+ rose: "Rose"
14
+ };
15
+ /** Swatches with the colors of the default dark and light themes. */
16
+ const BOARD_COLORS = BOARD_COLOR_TOKENS.map((id) => ({
17
+ id,
18
+ label: COLOR_LABELS[id],
19
+ dark: { ...BOARD_THEME_DATA.dark.colors[id] },
20
+ light: { ...BOARD_THEME_DATA.light.colors[id] }
21
+ }));
132
22
  const DEFAULT_BOARD_COLOR = "brand";
133
23
  const COLOR_INDEX = new Map(BOARD_COLORS.map((entry) => [entry.id, entry]));
134
24
  function isBoardColorId(value) {
@@ -1,7 +1,7 @@
1
1
  import { arrowBindings } from "../../protocol/dist/board-layout.js";
2
- import { cameraForFocus, cameraForState } from "./geometry.js";
3
2
  import { applyBoardEvaluation, boardAnimationTime, compileBoardAnimations, evaluateBoardAnimations } from "./animation.js";
4
3
  import { buildBoardScene } from "./scene.js";
4
+ import { cameraForFocus, cameraForState } from "./geometry.js";
5
5
  //#region src/board/model/sampling.ts
6
6
  function createBoardAnimationSampler(document, animation, options = {}) {
7
7
  const selected = animation ? document.animations[animation] : void 0;
@@ -1,7 +1,7 @@
1
- import { clampBoardFontSize } from "../../protocol/dist/board-layout.js";
1
+ import { BoardTextLayout, clampBoardFontSize } from "../../protocol/dist/board-layout.js";
2
2
  import "../../protocol/dist/index.js";
3
3
  //#region src/board/model/text-metrics.d.ts
4
- declare const TEXT_FONT_FAMILY = "Geist";
4
+ declare const TEXT_FONT_FAMILY = "Geist Variable";
5
5
  declare const TEXT_FONT_SIZE = 24;
6
6
  declare const TEXT_LINE_HEIGHT = 32;
7
7
  declare const TEXT_MIN_FONT_SIZE = 2;
@@ -11,5 +11,30 @@ declare function boardFontFamily(font: string, stacks: {
11
11
  serif: string;
12
12
  mono: string;
13
13
  }): string;
14
+ declare const SHAPE_LABEL_PADDING = 8;
15
+ declare function layoutShapeLabel(props: {
16
+ text: string;
17
+ fontSize: number;
18
+ }, width: number): BoardTextLayout;
19
+ declare const BOARD_FRAME_LABEL_SIZE = 12;
20
+ declare const BOARD_FRAME_LABEL_LINE_HEIGHT = 1.25;
21
+ declare function frameLabelOffset(size: number): {
22
+ x: number;
23
+ y: number;
24
+ };
25
+ declare function frameLabelHitRect(frame: {
26
+ x: number;
27
+ y: number;
28
+ width: number;
29
+ }, size: number): {
30
+ x: number;
31
+ y: number;
32
+ width: number;
33
+ height: number;
34
+ };
35
+ declare function boardEditableText(item: {
36
+ type: string;
37
+ props: unknown;
38
+ }): string | null;
14
39
  //#endregion
15
- export { TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardFontFamily, clampBoardFontSize as clampBoardTextFontSize };
40
+ export { BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, SHAPE_LABEL_PADDING, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardEditableText, boardFontFamily, clampBoardFontSize as clampBoardTextFontSize, frameLabelHitRect, frameLabelOffset, layoutShapeLabel };
@@ -1,5 +1,5 @@
1
1
  import { BOARD_TEXT_FONT_FAMILY } from "../../protocol/dist/board-constants.js";
2
- import { clampBoardFontSize } from "../../protocol/dist/board-layout.js";
2
+ import { clampBoardFontSize, layoutBoardText } from "../../protocol/dist/board-layout.js";
3
3
  //#region src/board/model/text-metrics.ts
4
4
  const TEXT_FONT_FAMILY = BOARD_TEXT_FONT_FAMILY;
5
5
  const TEXT_FONT_SIZE = 24;
@@ -10,5 +10,39 @@ function boardFontFamily(font, stacks) {
10
10
  if (font === "sans" || font === "serif" || font === "mono") return stacks[font];
11
11
  return `"${font.replaceAll("\"", "")}", ${stacks.sans}`;
12
12
  }
13
+ const SHAPE_LABEL_PADDING = 8;
14
+ function layoutShapeLabel(props, width) {
15
+ return layoutBoardText({
16
+ text: props.text,
17
+ fontSize: props.fontSize,
18
+ fontWeight: 500,
19
+ font: "sans",
20
+ lineHeight: 1.4,
21
+ width: Math.max(1, width - 16)
22
+ });
23
+ }
24
+ const BOARD_FRAME_LABEL_SIZE = 12;
25
+ const BOARD_FRAME_LABEL_LINE_HEIGHT = 1.25;
26
+ function frameLabelOffset(size) {
27
+ return {
28
+ x: 4,
29
+ y: -(size + 6)
30
+ };
31
+ }
32
+ function frameLabelHitRect(frame, size) {
33
+ const above = size + 10;
34
+ return {
35
+ x: frame.x,
36
+ y: frame.y - above,
37
+ width: Math.max(48, frame.width * .5),
38
+ height: above + 2
39
+ };
40
+ }
41
+ function boardEditableText(item) {
42
+ const props = item.props;
43
+ if (item.type === "text" || item.type === "shape") return props.text ?? "";
44
+ if (item.type === "arrow" || item.type === "frame") return props.label ?? "";
45
+ return null;
46
+ }
13
47
  //#endregion
14
- export { TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardFontFamily, clampBoardFontSize as clampBoardTextFontSize };
48
+ export { BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, SHAPE_LABEL_PADDING, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardEditableText, boardFontFamily, clampBoardFontSize as clampBoardTextFontSize, frameLabelHitRect, frameLabelOffset, layoutShapeLabel };