@scrawl-board/board 0.1.0-beta.7 → 0.1.0-beta.8

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.
package/dist/core.d.ts CHANGED
@@ -181,6 +181,21 @@ interface CustomObjectDefinition<Props extends JsonValue = JsonValue> {
181
181
  /** One pure, synchronous step per consecutive schema version. */
182
182
  migrate?: Readonly<Record<number, (oldProps: JsonValue) => JsonValue>>;
183
183
  describe(object: ReadonlyCustomObject<Props>, context: ObjectDescribeContext): BoardScene;
184
+ /**
185
+ * Optional point-level hit-test precision (Phase 8). Every custom object
186
+ * hit-tests against its bounding box (`fallback.bounds`) by default — this
187
+ * lets a non-rectangular shape (e.g. a circular card, an L-shaped region)
188
+ * reject a point that's inside that box but outside its actual visible
189
+ * silhouette, tightening a click/marquee/raycast hit to the shape's real
190
+ * outline. `point` is in this object's own local space — the same
191
+ * untransformed space `describe`'s returned geometry already lives in
192
+ * (the caller inverse-transforms the pointer's board point through
193
+ * `object.transform` before calling this). Absent means every point
194
+ * inside the bounding box hits, matching pre-Phase-8 behavior exactly.
195
+ * Rejecting a point here does not fall through to whatever's underneath —
196
+ * the gesture simply misses this object, same as clicking empty space.
197
+ */
198
+ hitTest?(object: ReadonlyCustomObject<Props>, point: BoardPoint): boolean;
184
199
  }
185
200
  interface SceneNodeBase {
186
201
  key: string;
@@ -214,6 +229,15 @@ interface SceneGroup extends SceneNodeBase {
214
229
  kind: "group";
215
230
  children: readonly BoardScene[];
216
231
  }
232
+ /**
233
+ * **No renderer or SVG-export interpreter exists for this node kind yet**
234
+ * (tracked as deferred work — see `renderer/shapes/customObjects.ts`'s
235
+ * `"path"` case). Returning a `ScenePath` from `describe()` renders nothing,
236
+ * exports nothing, and contributes no hit-test bounds — it neither errors
237
+ * nor emits a diagnostic. Until an interpreter ships, build custom shapes
238
+ * from `SceneRect`/`SceneEllipse`/`SceneGroup`/`SceneText`/`SceneImage`
239
+ * instead.
240
+ */
217
241
  interface ScenePath extends SceneNodeBase {
218
242
  kind: "path";
219
243
  /** SVG-style path data, board-local coordinates. */
@@ -386,8 +410,23 @@ declare function canUnlockItem(item: Lockable | undefined, userId: string | unde
386
410
  /** Wire fields for a locked item; omitted entirely when unlocked. */
387
411
  declare function serializeLock(item: Lockable): Lockable;
388
412
 
413
+ /**
414
+ * Per-object visibility (Phase 8) — mirrors `itemLock.ts`'s `Lockable`
415
+ * pattern exactly, but simpler: unlike a lock, hidden state carries no
416
+ * holder/ownership concept, so there's no analogue to `LockHolder`/
417
+ * `canUnlockItem`. A hidden object stays fully present in the Document
418
+ * (still serializes, persists, syncs, undoes/redoes) — it just skips
419
+ * rendering and hit-testing/selection candidacy. `hidden` absent or
420
+ * `false` means visible; this keeps every pre-Phase-8 document (which has
421
+ * no `hidden` field on any object at all) implicitly fully visible with
422
+ * zero migration needed.
423
+ */
424
+ interface Hideable {
425
+ hidden?: boolean;
426
+ }
427
+
389
428
  /** A kitchen timer sitting on the board. Remaining time is derived, not ticked. */
390
- interface KitchenTimer extends Lockable {
429
+ interface KitchenTimer extends Lockable, Hideable {
391
430
  id: string;
392
431
  x: number;
393
432
  y: number;
@@ -413,9 +452,25 @@ declare function setTimerDuration(timer: KitchenTimer, durationMs: number): Kitc
413
452
  declare function formatTimer(ms: number): string;
414
453
 
415
454
  declare const SHAPE_MIN_SIZE = 0.5;
416
- declare const SHAPE_DEFAULT_STROKE = "#1C1C1E";
417
- declare const SHAPE_DEFAULT_STROKE_WIDTH = 0.12;
418
- interface RectangleObject extends Lockable {
455
+ /**
456
+ * Centralized shape style defaults (Phase 8) — one object a Host can read
457
+ * to know (or, by not relying on the standalone constants below, override
458
+ * via its own UI state) what a newly drawn Rectangle/Ellipse/Line/Arrow/
459
+ * Polygon/Star/Heart starts with when the user hasn't picked a stroke/width
460
+ * yet. `shapeTool.ts` (commit-time), `renderer/shapes/lines.ts` (render-time
461
+ * fallback for an object missing these fields), and
462
+ * `persistence/serialization/svg.ts` (export-time fallback) all read from
463
+ * here — the two standalone constants below are kept for source
464
+ * compatibility and simply mirror this object's values, not a second
465
+ * source of truth.
466
+ */
467
+ declare const SHAPE_STYLE_DEFAULTS: {
468
+ readonly stroke: "#1C1C1E";
469
+ readonly strokeWidth: 0.12;
470
+ };
471
+ declare const SHAPE_DEFAULT_STROKE: "#1C1C1E";
472
+ declare const SHAPE_DEFAULT_STROKE_WIDTH: 0.12;
473
+ interface RectangleObject extends Lockable, Hideable {
419
474
  id: string;
420
475
  x: number;
421
476
  y: number;
@@ -437,7 +492,7 @@ interface RectangleObject extends Lockable {
437
492
  */
438
493
  rotation?: number;
439
494
  }
440
- interface EllipseObject extends Lockable {
495
+ interface EllipseObject extends Lockable, Hideable {
441
496
  id: string;
442
497
  x: number;
443
498
  y: number;
@@ -455,7 +510,7 @@ declare function cloneRectangle(rect: RectangleObject): RectangleObject;
455
510
  declare function cloneEllipse(ellipse: EllipseObject): EllipseObject;
456
511
  /** `"none"` is a plain line with no arrowhead; today's only real head shape is `"triangle"`. New head shapes extend this union without touching `ArrowObject`'s own fields. */
457
512
  type ArrowHeadStyle = "triangle" | "none";
458
- interface LineObject extends Lockable {
513
+ interface LineObject extends Lockable, Hideable {
459
514
  id: string;
460
515
  start: BoardPoint;
461
516
  end: BoardPoint;
@@ -463,7 +518,7 @@ interface LineObject extends Lockable {
463
518
  strokeWidth?: number;
464
519
  opacity?: number;
465
520
  }
466
- interface ArrowObject extends Lockable {
521
+ interface ArrowObject extends Lockable, Hideable {
467
522
  id: string;
468
523
  start: BoardPoint;
469
524
  end: BoardPoint;
@@ -482,7 +537,7 @@ interface ArrowObject extends Lockable {
482
537
  * `polygonStartAngle`, which encodes each side count's own vertex
483
538
  * orientation so the outline always matches the legacy drag-preview shape.
484
539
  */
485
- interface PolygonObject extends Lockable {
540
+ interface PolygonObject extends Lockable, Hideable {
486
541
  id: string;
487
542
  x: number;
488
543
  y: number;
@@ -498,7 +553,7 @@ interface PolygonObject extends Lockable {
498
553
  }
499
554
  declare function clonePolygon(polygon: PolygonObject): PolygonObject;
500
555
  /** Same bounding-box/rotation convention as Rectangle; a 5-pointed star with a tuned inner-radius ratio, matching the legacy tool's own default (see `polygonGeometry.ts`'s `starPoints`). */
501
- interface StarObject extends Lockable {
556
+ interface StarObject extends Lockable, Hideable {
502
557
  id: string;
503
558
  x: number;
504
559
  y: number;
@@ -516,7 +571,7 @@ interface StarObject extends Lockable {
516
571
  }
517
572
  declare function cloneStar(star: StarObject): StarObject;
518
573
  /** Same bounding-box/rotation convention as Rectangle; the standard parametric heart curve (see `polygonGeometry.ts`'s `heartPoints`), no extra parameters beyond the shared shape fields. */
519
- interface HeartObject extends Lockable {
574
+ interface HeartObject extends Lockable, Hideable {
520
575
  id: string;
521
576
  x: number;
522
577
  y: number;
@@ -544,7 +599,7 @@ declare function cloneArrow(arrow: ArrowObject): ArrowObject;
544
599
  * a group into its leaf members is always done by the caller (recursively,
545
600
  * with cycle protection), never assumed here.
546
601
  */
547
- interface GroupObject extends Lockable {
602
+ interface GroupObject extends Lockable, Hideable {
548
603
  id: string;
549
604
  children: string[];
550
605
  }
@@ -570,7 +625,7 @@ interface StrokePoint extends BoardPoint {
570
625
  * geometric outline, not an expressive ink mark.
571
626
  */
572
627
  type StrokeTool = "marker" | "highlighter" | "shape";
573
- interface Stroke extends Lockable {
628
+ interface Stroke extends Lockable, Hideable {
574
629
  id: string;
575
630
  color: string;
576
631
  baseWidth: number;
@@ -589,7 +644,7 @@ interface Stroke extends Lockable {
589
644
  declare const ERASE_THRESHOLD = 0.95;
590
645
  declare function cloneStroke(stroke: Stroke): Stroke;
591
646
  type SerializedPoint = [number, number, number, number];
592
- interface SerializedStroke extends Lockable {
647
+ interface SerializedStroke extends Lockable, Hideable {
593
648
  id: string;
594
649
  color: string;
595
650
  baseWidth: number;
@@ -683,7 +738,7 @@ interface NoteVote {
683
738
  * A sticky note: content floating above the board at a z-offset (pillar 3 —
684
739
  * depth as an organizational axis). Center position in board space.
685
740
  */
686
- interface StickyNote extends Lockable {
741
+ interface StickyNote extends Lockable, Hideable {
687
742
  id: string;
688
743
  x: number;
689
744
  y: number;
@@ -701,7 +756,7 @@ interface StickyNote extends Lockable {
701
756
  * top-left corner; lines flow downward (-y). Text joins the clustering
702
757
  * system like handwriting (build prompt §6.4).
703
758
  */
704
- interface TextBlock extends Lockable {
759
+ interface TextBlock extends Lockable, Hideable {
705
760
  id: string;
706
761
  x: number;
707
762
  y: number;
@@ -731,7 +786,7 @@ declare function cloneNote(note: StickyNote): StickyNote;
731
786
  * Interactive structured table on the board. Position (x, y) is top-left in board units.
732
787
  * Cells are indexed as `${row},${col}` keys mapping to cell text content.
733
788
  */
734
- interface TableBlock extends Lockable {
789
+ interface TableBlock extends Lockable, Hideable {
735
790
  id: string;
736
791
  x: number;
737
792
  y: number;
@@ -757,7 +812,7 @@ declare const FOG_COLOR = "#FFFFFF";
757
812
  * An imported image block on the board plane.
758
813
  * Coordinates (x, y) represent the center of the image in board space.
759
814
  */
760
- interface ImageBlock extends Lockable {
815
+ interface ImageBlock extends Lockable, Hideable {
761
816
  id: string;
762
817
  /**
763
818
  * A legacy, read-only data URL (or, historically, an arbitrary string) —
@@ -807,6 +862,15 @@ type DocumentLoadResult = {
807
862
  declare function loadDocumentBytes(originalBytes: string): DocumentLoadResult;
808
863
  declare function migrateDocument(raw: unknown): DocumentLoadResult;
809
864
  declare function serializeDocument(document: unknown): string;
865
+ /**
866
+ * A Document's serialized size in bytes (Phase 5) — UTF-8, not UTF-16
867
+ * `string.length`, since a Document with non-ASCII note/text content (most
868
+ * of them, eventually) would otherwise under-report. Useful for a Host
869
+ * deciding when to warn about an unusually large board, or for logging/
870
+ * telemetry around save size — not consulted by anything inside this
871
+ * package itself, which has no size limit of its own.
872
+ */
873
+ declare function documentSize(document: CurrentSerializedDocument): number;
810
874
 
811
875
  interface SearchableComment {
812
876
  id: string;
@@ -1016,6 +1080,16 @@ declare class BoardDocument {
1016
1080
  * `getSelectedItemInfo`'s custom branch hardcodes `isLocked: false`).
1017
1081
  */
1018
1082
  isLocked(id: string): boolean;
1083
+ /**
1084
+ * True if `id` exists and is hidden, for any type — the same per-type
1085
+ * probe pattern as {@link isLocked} (Phase 8). Custom objects are
1086
+ * excluded for the same reason `isLocked` excludes them: they have no
1087
+ * `Hideable` field at all, so "hidden" isn't a concept that applies to
1088
+ * them yet. Used by marquee selection (`selectTool.ts`) to keep a hidden
1089
+ * object out of a rubber-band selection even for object types whose own
1090
+ * renderer doesn't yet suppress click-based hit-testing.
1091
+ */
1092
+ isHidden(id: string): boolean;
1019
1093
  subscribe(listener: Listener): () => void;
1020
1094
  addStrokes(strokes: Stroke[]): void;
1021
1095
  removeStrokes(ids: string[]): void;
@@ -1142,7 +1216,17 @@ declare class BoardDocument {
1142
1216
  static deserializeNotes(data: SerializedDocument): StickyNote[];
1143
1217
  static deserializeTexts(data: SerializedDocument): TextBlock[];
1144
1218
  static deserializeTables(data: SerializedDocument): TableBlock[];
1145
- static deserializeStrokes(data: SerializedDocument): Stroke[];
1219
+ /**
1220
+ * `onSkip` (Phase 9) replaces an unconditional `console.error` — `core`
1221
+ * must never do raw console I/O (no dev-gate, no way for a Host to
1222
+ * suppress or redirect it), so a skipped stroke is now reported only if
1223
+ * the caller asks for it, via whatever diagnostic channel it already
1224
+ * has (e.g. `controller-internal.ts` routes this into the same typed
1225
+ * `"error"` event every other diagnostic already uses). Silent by
1226
+ * default, matching how every other `deserialize*` method here already
1227
+ * behaves (no diagnostics at all).
1228
+ */
1229
+ static deserializeStrokes(data: SerializedDocument, onSkip?: (id: string, cause: unknown) => void): Stroke[];
1146
1230
  /**
1147
1231
  * Every mutation funnels through here, so paint-order tracking lives in
1148
1232
  * exactly one place rather than at every individual add/remove call site
@@ -1153,17 +1237,18 @@ declare class BoardDocument {
1153
1237
  * ids already tracked (idempotent by construction: `orderIndex.has` gates
1154
1238
  * every append).
1155
1239
  *
1156
- * `orderChanged` is populated here whenever `objectOrder` actually
1157
- * changed — not just for an explicit reorder, but for any add/remove too.
1158
- * A pure append never shifts an existing id's rank (new ids land at the
1159
- * tail), but a removal splices a middle id out, which *does* shift every
1160
- * id after it down by one — a renderer that only resynced Z on an
1161
- * explicit reorder would silently render those with a stale rank until
1162
- * something else happened to touch them, eventually colliding with a
1163
- * freshly-added object's freshly-computed Z. Firing this on every
1164
- * order-touching change (not just removes) is simpler than special-
1165
- * casing which kind of change actually needs it, at the cost of a
1166
- * redundant same-value resync on a pure append.
1240
+ * `orderChanged` (Phase 9) reports exactly the ids whose rank actually
1241
+ * changed, using `orderIndex` throughout instead of `indexOf` — a pure
1242
+ * append never shifts any existing id's rank (new ids land at the tail,
1243
+ * already covered by this same change's own `Added` field, so
1244
+ * `orderChanged` stays unset), while a removal shifts every id at-or-
1245
+ * after the lowest removed rank down by one, computed in a single O(n)
1246
+ * filter pass (not one `indexOf`+`splice` per removed id) regardless of
1247
+ * how many ids this one change removes. Every renderer's `onChange` now
1248
+ * looks up only the ids actually in `orderChanged` instead of walking
1249
+ * its entire mesh map on any order-touching change — a broad, unfiltered
1250
+ * `orderChanged` here would silently defeat that fix, not just waste
1251
+ * cycles here.
1167
1252
  */
1168
1253
  private emit;
1169
1254
  }
@@ -1786,5 +1871,5 @@ type BoardStroke = Stroke;
1786
1871
  type SerializedBoardStroke = SerializedStroke;
1787
1872
  type SerializedBoardDocument = CurrentSerializedDocument;
1788
1873
 
1789
- export { ASSET_CACHE_BYTES_DEFAULT, ASSET_CACHE_BYTES_MAX, ASSET_CACHE_BYTES_MIN, ASSET_EXPORT_MAX_DECODED_MEGAPIXELS, ASSET_EXPORT_MAX_ENCODED_BYTES, ASSET_MAX_CONCURRENT_RESOLUTIONS, ASSET_MAX_DECODED_MEGAPIXELS, ASSET_MAX_DIMENSION_PX, ASSET_MAX_ENCODED_BYTES, ASSET_REF_MAX_BYTES, ASSET_REF_PATTERN, AddArrowCommand, AddEllipseCommand, AddGroupCommand, AddHeartCommand, AddImageCommand, AddLineCommand, AddNoteCommand, AddPolygonCommand, AddRectangleCommand, AddStarCommand, AddStrokesCommand, AddTableCommand, AddTextCommand, AddTimerCommand, AssetResolutionError, BEACON_INSET, BoardDocument, CURRENT_DOCUMENT_SCHEMA_VERSION, ClusterStore, CommandBatch, DeleteArrowCommand, DeleteEllipseCommand, DeleteGroupCommand, DeleteHeartCommand, DeleteImageCommand, DeleteLineCommand, DeleteNoteCommand, DeletePolygonCommand, DeleteRectangleCommand, DeleteStarCommand, DeleteStrokesCommand, DeleteTableCommand, DeleteTextCommand, DeleteTimerCommand, DocumentRecoveryError, END_TAPER, ERASE_THRESHOLD, EraseCommand, FOG_COLOR, HIGHLIGHT_COLORS, History, IDENTITY, INK_COLORS, LockItemsCommand, MIN_WIDTH_FACTOR, NOTE_COLORS, NOTE_DEFAULT_SIZE, NOTE_DEFAULT_Z, NOTE_MAX_Z, NOTE_MIN_Z, NOTE_PEEL_STEP, ReorderObjectCommand, SDK_DEVELOPMENT_VERSION, SDK_PACKAGE_NAME, SHAPE_DEFAULT_STROKE, SHAPE_DEFAULT_STROKE_WIDTH, SHAPE_MIN_SIZE, STAMPS, STAMP_SIZE, SUPPORTED_ASSET_MEDIA_TYPES, SpatialIndex, TABLE_DEFAULT_CELL_HEIGHT, TABLE_DEFAULT_CELL_WIDTH, TABLE_DEFAULT_FONT_SIZE, TEXT_DEFAULT_SIZE, TIMER_DEFAULT_DURATION_MS, TIMER_DEFAULT_SIZE, TIMER_PRESETS_MS, TransformCommand, TransformObjectsCommand, UpdateArrowCommand, UpdateEllipseCommand, UpdateGroupCommand, UpdateHeartCommand, UpdateImageCommand, UpdateLineCommand, UpdateNoteCommand, UpdatePolygonCommand, UpdateRectangleCommand, UpdateStarCommand, UpdateTableCommand, UpdateTextCommand, UpdateTimerCommand, apply, applyItemLock, assetRef, avgScale, canUnlockItem, changeToOps, clampAssetCacheBytes, cloneArrow, cloneCustomObject, cloneEllipse, cloneGroup, cloneHeart, cloneImage, cloneLine, cloneNote, clonePolygon, cloneRectangle, cloneStar, cloneStroke, cloneTable, cloneText, cloneTimer, documentId, documentToSVG, formatTimer, invert, isAssetRef, isIdentity, isStampKind, loadDocumentBytes, measureTable, measureTextBlock, migrateDocument, mul, pauseTimer, placePresenceBeacon, ribbonEdges, rotationAbout, scalingAbout, searchBoard, serializeDocument, serializeLock, serializeStroke, setTimerDuration, stampDataUrl, startTimer, strokeId, timerExpired, timerRemaining, toggleTimer, translation };
1874
+ export { ASSET_CACHE_BYTES_DEFAULT, ASSET_CACHE_BYTES_MAX, ASSET_CACHE_BYTES_MIN, ASSET_EXPORT_MAX_DECODED_MEGAPIXELS, ASSET_EXPORT_MAX_ENCODED_BYTES, ASSET_MAX_CONCURRENT_RESOLUTIONS, ASSET_MAX_DECODED_MEGAPIXELS, ASSET_MAX_DIMENSION_PX, ASSET_MAX_ENCODED_BYTES, ASSET_REF_MAX_BYTES, ASSET_REF_PATTERN, AddArrowCommand, AddEllipseCommand, AddGroupCommand, AddHeartCommand, AddImageCommand, AddLineCommand, AddNoteCommand, AddPolygonCommand, AddRectangleCommand, AddStarCommand, AddStrokesCommand, AddTableCommand, AddTextCommand, AddTimerCommand, AssetResolutionError, BEACON_INSET, BoardDocument, CURRENT_DOCUMENT_SCHEMA_VERSION, ClusterStore, CommandBatch, DeleteArrowCommand, DeleteEllipseCommand, DeleteGroupCommand, DeleteHeartCommand, DeleteImageCommand, DeleteLineCommand, DeleteNoteCommand, DeletePolygonCommand, DeleteRectangleCommand, DeleteStarCommand, DeleteStrokesCommand, DeleteTableCommand, DeleteTextCommand, DeleteTimerCommand, DocumentRecoveryError, END_TAPER, ERASE_THRESHOLD, EraseCommand, FOG_COLOR, HIGHLIGHT_COLORS, History, IDENTITY, INK_COLORS, LockItemsCommand, MIN_WIDTH_FACTOR, NOTE_COLORS, NOTE_DEFAULT_SIZE, NOTE_DEFAULT_Z, NOTE_MAX_Z, NOTE_MIN_Z, NOTE_PEEL_STEP, ReorderObjectCommand, SDK_DEVELOPMENT_VERSION, SDK_PACKAGE_NAME, SHAPE_DEFAULT_STROKE, SHAPE_DEFAULT_STROKE_WIDTH, SHAPE_MIN_SIZE, SHAPE_STYLE_DEFAULTS, STAMPS, STAMP_SIZE, SUPPORTED_ASSET_MEDIA_TYPES, SpatialIndex, TABLE_DEFAULT_CELL_HEIGHT, TABLE_DEFAULT_CELL_WIDTH, TABLE_DEFAULT_FONT_SIZE, TEXT_DEFAULT_SIZE, TIMER_DEFAULT_DURATION_MS, TIMER_DEFAULT_SIZE, TIMER_PRESETS_MS, TransformCommand, TransformObjectsCommand, UpdateArrowCommand, UpdateEllipseCommand, UpdateGroupCommand, UpdateHeartCommand, UpdateImageCommand, UpdateLineCommand, UpdateNoteCommand, UpdatePolygonCommand, UpdateRectangleCommand, UpdateStarCommand, UpdateTableCommand, UpdateTextCommand, UpdateTimerCommand, apply, applyItemLock, assetRef, avgScale, canUnlockItem, changeToOps, clampAssetCacheBytes, cloneArrow, cloneCustomObject, cloneEllipse, cloneGroup, cloneHeart, cloneImage, cloneLine, cloneNote, clonePolygon, cloneRectangle, cloneStar, cloneStroke, cloneTable, cloneText, cloneTimer, documentId, documentSize, documentToSVG, formatTimer, invert, isAssetRef, isIdentity, isStampKind, loadDocumentBytes, measureTable, measureTextBlock, migrateDocument, mul, pauseTimer, placePresenceBeacon, ribbonEdges, rotationAbout, scalingAbout, searchBoard, serializeDocument, serializeLock, serializeStroke, setTimerDuration, stampDataUrl, startTimer, strokeId, timerExpired, timerRemaining, toggleTimer, translation };
1790
1875
  export type { ArrowHeadStyle, ArrowObject, AssetDiagnostic, AssetIngestRequest, AssetIngestResult, AssetIngestor, AssetKind, AssetPurpose, AssetRef, AssetResolutionErrorCode, AssetResolveRequest, AssetResolveResult, AssetResolver, BBox, BoardKeyInput, BoardPoint, BoardPointerInput, BoardScene, BoardStroke, ClusterIdFactory, Command, CommandKind, CurrentSerializedDocument, CurrentSerializedStroke, CustomBoardObject, CustomObjectAddInput, CustomObjectDefinition, CustomTool, CustomToolDefinition, DocumentChange, DocumentId, DocumentLoadResult, DocumentRecoveryCode, EllipseObject, ExtensionCommand, ExtensionDiagnostic, ExtensionHitResult, ExtensionId, ExtensionRequirement, GroupObject, HeartObject, ImageBlock, InputModifiers, JsonObject, JsonValue, KitchenTimer, LineObject, LockHolder, LockTarget, Lockable, Mat2x3, NoteVote, ObjectDescribeContext, ObjectIntent, ObjectType, Op, OpCollection, PolygonObject, PresencePlacement, QueryableBoardObject, ReadonlyCustomObject, RectangleObject, ReorderDirection, RibbonEdgePoint, SceneEllipse, SceneGroup, SceneImage, ScenePath, SceneRect, SceneText, ScrawlExtension, SearchHit, SearchHitKind, SearchableBoard, SearchableComment, SerializedBoardDocument, SerializedBoardStroke, SerializedPoint, SerializedStroke, StampKind, StarObject, StickyNote, Stroke, StrokeId, StrokePoint, StrokeTool, SupportedAssetMediaType, TableBlock, TextBlock, ToolCancelReason, ToolCapabilities, ToolCursor, ToolId, ViewportInset };