@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
@@ -7,6 +7,15 @@ type BoardImageTexturePool = {
7
7
  /** A CDN variant that fails to process falls back to the media it came from. */
8
8
  declare function loadBoardImageTexture(url: string): Promise<Texture>;
9
9
  declare function unloadBoardImageTexture(url: string, texture: Texture | null): Promise<void>;
10
+ /**
11
+ * Decode an image no larger than `edge` along its long side (short side with
12
+ * `cover`), for sources without CDN variants. The texture is unshared; destroy
13
+ * it to release it.
14
+ */
15
+ declare function loadFittedImageTexture(url: string, edge: number, cover?: boolean): Promise<Texture>;
16
+ /** A smaller unshared copy of a decoded texture, or null when it cannot be read back. */
17
+ declare function shrinkBoardTexture(texture: Texture, edge: number): Promise<Texture | null>;
18
+ declare function readTextureTone(texture: Texture): Promise<number | null>;
10
19
  /**
11
20
  * Share image textures by resolved URL without sharing Board ownership.
12
21
  *
@@ -21,4 +30,4 @@ declare function createBoardImageTexturePool(options?: {
21
30
  }): BoardImageTexturePool;
22
31
  declare const boardImageTexturePool: BoardImageTexturePool;
23
32
  //#endregion
24
- export { BoardImageTexturePool, boardImageTexturePool, createBoardImageTexturePool, loadBoardImageTexture, unloadBoardImageTexture };
33
+ export { BoardImageTexturePool, boardImageTexturePool, createBoardImageTexturePool, loadBoardImageTexture, loadFittedImageTexture, readTextureTone, shrinkBoardTexture, unloadBoardImageTexture };
@@ -1,6 +1,6 @@
1
1
  import { variantSource } from "../../media.js";
2
2
  import { loadVideoThumbnailTexture } from "../render/video-thumbnail.js";
3
- import { Assets, Texture } from "pixi.js";
3
+ import { Assets, DOMAdapter, Texture } from "pixi.js";
4
4
  //#region src/board/stage/texture-pool.ts
5
5
  /** Load an image in the page's CORS context when Pixi's worker path fails. */
6
6
  function loadImageElementTexture(url) {
@@ -62,6 +62,76 @@ async function unloadBoardImageTexture(url, texture) {
62
62
  await Assets.unload(url).catch(() => {});
63
63
  if (!texture?.destroyed) texture?.destroy(true);
64
64
  }
65
+ function fit(width, height, edge, cover = false) {
66
+ const scale = edge / (cover ? Math.min(width, height) : Math.max(width, height));
67
+ return scale < 1 ? {
68
+ resizeWidth: Math.max(1, Math.round(width * scale)),
69
+ resizeHeight: Math.max(1, Math.round(height * scale))
70
+ } : null;
71
+ }
72
+ /**
73
+ * Decode an image no larger than `edge` along its long side (short side with
74
+ * `cover`), for sources without CDN variants. The texture is unshared; destroy
75
+ * it to release it.
76
+ */
77
+ async function loadFittedImageTexture(url, edge, cover = false) {
78
+ const response = await fetch(url);
79
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
80
+ const image = await createImageBitmap(await response.blob());
81
+ const size = fit(image.width, image.height, edge, cover);
82
+ if (!size) return Texture.from(image, true);
83
+ try {
84
+ return Texture.from(await createImageBitmap(image, {
85
+ ...size,
86
+ resizeQuality: "high"
87
+ }), true);
88
+ } finally {
89
+ image.close();
90
+ }
91
+ }
92
+ /** A smaller unshared copy of a decoded texture, or null when it cannot be read back. */
93
+ async function shrinkBoardTexture(texture, edge) {
94
+ const resource = texture.source.resource;
95
+ const size = fit(texture.width, texture.height, edge);
96
+ if (!resource || !size || typeof createImageBitmap !== "function") return null;
97
+ return Texture.from(await createImageBitmap(resource, {
98
+ ...size,
99
+ resizeQuality: "medium"
100
+ }), true);
101
+ }
102
+ const TONE_SAMPLE = 8;
103
+ let toneContext;
104
+ async function readTextureTone(texture) {
105
+ const resource = texture.source.resource;
106
+ if (!resource || texture.destroyed) return null;
107
+ const bitmap = await createImageBitmap(resource, {
108
+ resizeWidth: TONE_SAMPLE,
109
+ resizeHeight: TONE_SAMPLE,
110
+ resizeQuality: "medium"
111
+ });
112
+ try {
113
+ toneContext ??= DOMAdapter.get().createCanvas(TONE_SAMPLE, TONE_SAMPLE).getContext("2d", { willReadFrequently: true });
114
+ if (!toneContext) return null;
115
+ toneContext.clearRect(0, 0, TONE_SAMPLE, TONE_SAMPLE);
116
+ toneContext.drawImage(bitmap, 0, 0);
117
+ const { data } = toneContext.getImageData(0, 0, TONE_SAMPLE, TONE_SAMPLE);
118
+ let red = 0;
119
+ let green = 0;
120
+ let blue = 0;
121
+ let weight = 0;
122
+ for (let index = 0; index < data.length; index += 4) {
123
+ const alpha = data[index + 3];
124
+ red += data[index] * alpha;
125
+ green += data[index + 1] * alpha;
126
+ blue += data[index + 2] * alpha;
127
+ weight += alpha;
128
+ }
129
+ if (weight === 0) return null;
130
+ return Math.round(red / weight) << 16 | Math.round(green / weight) << 8 | Math.round(blue / weight);
131
+ } finally {
132
+ bitmap.close();
133
+ }
134
+ }
65
135
  /**
66
136
  * Share image textures by resolved URL without sharing Board ownership.
67
137
  *
@@ -150,4 +220,4 @@ function createBoardImageTexturePool(options) {
150
220
  }
151
221
  const boardImageTexturePool = createBoardImageTexturePool();
152
222
  //#endregion
153
- export { boardImageTexturePool, createBoardImageTexturePool, loadBoardImageTexture, unloadBoardImageTexture };
223
+ export { boardImageTexturePool, createBoardImageTexturePool, loadBoardImageTexture, loadFittedImageTexture, readTextureTone, shrinkBoardTexture, unloadBoardImageTexture };
@@ -1358,6 +1358,12 @@ declare const BoardExtensionItemSchema: z.ZodObject<{
1358
1358
  }, z.core.$strict>>;
1359
1359
  type: z.ZodString;
1360
1360
  props: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
1361
+ preview: z.ZodOptional<z.ZodObject<{
1362
+ title: z.ZodOptional<z.ZodString>;
1363
+ excerpt: z.ZodOptional<z.ZodString>;
1364
+ cover: z.ZodOptional<z.ZodString>;
1365
+ src: z.ZodOptional<z.ZodString>;
1366
+ }, z.core.$strict>>;
1361
1367
  }, z.core.$strict>;
1362
1368
  declare const BOARD_ITEM_SCHEMAS: {
1363
1369
  readonly frame: z.ZodObject<{
@@ -1251,6 +1251,7 @@ type BoardRemote = {
1251
1251
  playback: BoardPlaybackSnapshot | null;
1252
1252
  };
1253
1253
  }) => void;
1254
+ resync?: () => void;
1254
1255
  }): () => void;
1255
1256
  };
1256
1257
  //#endregion
@@ -1264,6 +1265,7 @@ type BoardSubscriptionHandlers = {
1264
1265
  awareness?: (event: BoardAwarenessUpdatedEvent) => void;
1265
1266
  playback?: (event: BoardPlaybackChangedEvent) => void;
1266
1267
  event?: (event: BoardChangedEvent | BoardAwarenessUpdatedEvent | BoardPlaybackChangedEvent) => void;
1268
+ resync?: () => void;
1267
1269
  };
1268
1270
  type BoardClientOptions = {
1269
1271
  http: HttpTransport;
@@ -1316,12 +1318,18 @@ declare class BoardClient implements BoardRemote {
1316
1318
  on(type: "awareness", handler: (event: BoardAwarenessUpdatedEvent) => void): () => void;
1317
1319
  on(type: "playback", handler: (event: BoardPlaybackChangedEvent) => void): () => void;
1318
1320
  }
1321
+ type BoardFileReader = {
1322
+ read(path: string, customFetch?: Fetch): Promise<SpaceFsFileResponse | SpaceFsPreparingFile>;
1323
+ };
1319
1324
  declare class SpaceBoardsApi {
1320
1325
  private readonly http;
1321
1326
  private readonly spaceId;
1322
1327
  private readonly websocket;
1323
- constructor(http: HttpTransport, spaceId: string, websocket: WebsocketClient | null);
1328
+ private readonly files;
1329
+ constructor(http: HttpTransport, spaceId: string, websocket: WebsocketClient | null, files: BoardFileReader);
1324
1330
  byId(boardId: string): BoardClient;
1331
+ open(target: string, customFetch?: Fetch): Promise<BoardClient>;
1332
+ resolveId(path: string, customFetch?: Fetch): Promise<string>;
1325
1333
  /** Create a `.board` file and its Board, optionally with an initial document. */
1326
1334
  create(input: BoardCreateInput): Promise<BoardReadResult>;
1327
1335
  }