canvu-react 0.3.24 → 0.3.26

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/index.d.cts CHANGED
@@ -5,6 +5,13 @@ export { a as ArrowBindings, b as VectorPathPoint, n as normalizeRect, r as rect
5
5
  export { H as HydratedSceneItemsWithAssetsResult, h as hydrateSceneItemsWithAssets } from './asset-hydration-3Iv5xHxM.cjs';
6
6
  export { D as DEFAULT_STROKE_STYLE, F as FreehandSvgPayload, S as StrokeStyle, a as applyStrokeToItem, b as buildArrowSvg, c as buildDrawDotSvg, d as buildEllipseSvg, e as buildFreehandPathSvg, f as buildLineSvg, g as buildRectSvg, h as computeFreehandSvgPayload, i as createDrawDotItem, j as createEllipseItem, k as createFreehandStrokeItem, l as createImageFromVectorTrace, m as createImageItem, n as createLineItem, o as createRectangleItem, p as createShapeId, q as createTextItem, r as lineEndpointsToLocal, s as rebuildItemSvg, t as resolveStrokeStyle } from './shape-builders-DFudWDFI.cjs';
7
7
 
8
+ type EncodeCanvasToBlobOptions = {
9
+ mimeType?: string;
10
+ quality?: number;
11
+ fallbackMimeTypes?: readonly string[];
12
+ };
13
+ declare function encodeCanvasToBlob(canvas: HTMLCanvasElement, options?: EncodeCanvasToBlobOptions): Promise<Blob>;
14
+
8
15
  /**
9
16
  * Embeds the bitmap as a single SVG `<image>` (data URL or blob URL) instead of tracing paths.
10
17
  * Avoids huge path counts and keeps screenshots/photos sharp.
@@ -310,4 +317,4 @@ declare const DEFAULT_TEXT_FONT_SIZE = 18;
310
317
  */
311
318
  declare function buildTextSvg(content: string, _width: number, _height: number, fillColor?: string, fontSize?: number): string;
312
319
 
313
- export { ARROW_BIND_SNAP_PX, type ApplePencilNavOptions, ArrowEndpointBinding, Camera2D, type CreateCustomShapeContent, type CustomShapeSize, DEFAULT_TEXT_FONT_SIZE, type LoadRasterImageFileOptions, MANAGED_KEY, MAX_RASTER_EMBED_DIMENSION, type RasterEmbedMode, type RasterSceneSource, Rect, SvgVectorRenderer, type SvgVectorRendererOptions, VectorScene, VectorSceneItem, type ViewportInputOptions, addManagedImage, attachApplePencilNavigation, attachViewportInput, bakeArrowItemToAbsolute, buildCustomShapeChildrenSvg, buildTextSvg, cloneVectorSceneItemWithNewId, cloneVectorSceneItemsWithNewIds, collectEraserTargetsAtWorldPoint, copyManagedImage, createCustomShapeItem, cullItemsByViewport, deleteManagedImage, expandCustomShapeTemplate, formatCameraTransform, formatItemPlacementTransform, hitTestWorldPoint, isArrowBindTarget, isManagedImage, itemHitTestWorldPoint, loadImageFileAsRasterSceneSource, markImageAsManaged, reorderManagedImages, resolveArrowBindingsInScene, restackManagedImages, rotateManagedImage, snapArrowEndpointToShape };
320
+ export { ARROW_BIND_SNAP_PX, type ApplePencilNavOptions, ArrowEndpointBinding, Camera2D, type CreateCustomShapeContent, type CustomShapeSize, DEFAULT_TEXT_FONT_SIZE, type EncodeCanvasToBlobOptions, type LoadRasterImageFileOptions, MANAGED_KEY, MAX_RASTER_EMBED_DIMENSION, type RasterEmbedMode, type RasterSceneSource, Rect, SvgVectorRenderer, type SvgVectorRendererOptions, VectorScene, VectorSceneItem, type ViewportInputOptions, addManagedImage, attachApplePencilNavigation, attachViewportInput, bakeArrowItemToAbsolute, buildCustomShapeChildrenSvg, buildTextSvg, cloneVectorSceneItemWithNewId, cloneVectorSceneItemsWithNewIds, collectEraserTargetsAtWorldPoint, copyManagedImage, createCustomShapeItem, cullItemsByViewport, deleteManagedImage, encodeCanvasToBlob, expandCustomShapeTemplate, formatCameraTransform, formatItemPlacementTransform, hitTestWorldPoint, isArrowBindTarget, isManagedImage, itemHitTestWorldPoint, loadImageFileAsRasterSceneSource, markImageAsManaged, reorderManagedImages, resolveArrowBindingsInScene, restackManagedImages, rotateManagedImage, snapArrowEndpointToShape };
package/dist/index.d.ts CHANGED
@@ -5,6 +5,13 @@ export { a as ArrowBindings, b as VectorPathPoint, n as normalizeRect, r as rect
5
5
  export { H as HydratedSceneItemsWithAssetsResult, h as hydrateSceneItemsWithAssets } from './asset-hydration-BEG21hMp.js';
6
6
  export { D as DEFAULT_STROKE_STYLE, F as FreehandSvgPayload, S as StrokeStyle, a as applyStrokeToItem, b as buildArrowSvg, c as buildDrawDotSvg, d as buildEllipseSvg, e as buildFreehandPathSvg, f as buildLineSvg, g as buildRectSvg, h as computeFreehandSvgPayload, i as createDrawDotItem, j as createEllipseItem, k as createFreehandStrokeItem, l as createImageFromVectorTrace, m as createImageItem, n as createLineItem, o as createRectangleItem, p as createShapeId, q as createTextItem, r as lineEndpointsToLocal, s as rebuildItemSvg, t as resolveStrokeStyle } from './shape-builders-ENwnK-zT.js';
7
7
 
8
+ type EncodeCanvasToBlobOptions = {
9
+ mimeType?: string;
10
+ quality?: number;
11
+ fallbackMimeTypes?: readonly string[];
12
+ };
13
+ declare function encodeCanvasToBlob(canvas: HTMLCanvasElement, options?: EncodeCanvasToBlobOptions): Promise<Blob>;
14
+
8
15
  /**
9
16
  * Embeds the bitmap as a single SVG `<image>` (data URL or blob URL) instead of tracing paths.
10
17
  * Avoids huge path counts and keeps screenshots/photos sharp.
@@ -310,4 +317,4 @@ declare const DEFAULT_TEXT_FONT_SIZE = 18;
310
317
  */
311
318
  declare function buildTextSvg(content: string, _width: number, _height: number, fillColor?: string, fontSize?: number): string;
312
319
 
313
- export { ARROW_BIND_SNAP_PX, type ApplePencilNavOptions, ArrowEndpointBinding, Camera2D, type CreateCustomShapeContent, type CustomShapeSize, DEFAULT_TEXT_FONT_SIZE, type LoadRasterImageFileOptions, MANAGED_KEY, MAX_RASTER_EMBED_DIMENSION, type RasterEmbedMode, type RasterSceneSource, Rect, SvgVectorRenderer, type SvgVectorRendererOptions, VectorScene, VectorSceneItem, type ViewportInputOptions, addManagedImage, attachApplePencilNavigation, attachViewportInput, bakeArrowItemToAbsolute, buildCustomShapeChildrenSvg, buildTextSvg, cloneVectorSceneItemWithNewId, cloneVectorSceneItemsWithNewIds, collectEraserTargetsAtWorldPoint, copyManagedImage, createCustomShapeItem, cullItemsByViewport, deleteManagedImage, expandCustomShapeTemplate, formatCameraTransform, formatItemPlacementTransform, hitTestWorldPoint, isArrowBindTarget, isManagedImage, itemHitTestWorldPoint, loadImageFileAsRasterSceneSource, markImageAsManaged, reorderManagedImages, resolveArrowBindingsInScene, restackManagedImages, rotateManagedImage, snapArrowEndpointToShape };
320
+ export { ARROW_BIND_SNAP_PX, type ApplePencilNavOptions, ArrowEndpointBinding, Camera2D, type CreateCustomShapeContent, type CustomShapeSize, DEFAULT_TEXT_FONT_SIZE, type EncodeCanvasToBlobOptions, type LoadRasterImageFileOptions, MANAGED_KEY, MAX_RASTER_EMBED_DIMENSION, type RasterEmbedMode, type RasterSceneSource, Rect, SvgVectorRenderer, type SvgVectorRendererOptions, VectorScene, VectorSceneItem, type ViewportInputOptions, addManagedImage, attachApplePencilNavigation, attachViewportInput, bakeArrowItemToAbsolute, buildCustomShapeChildrenSvg, buildTextSvg, cloneVectorSceneItemWithNewId, cloneVectorSceneItemsWithNewIds, collectEraserTargetsAtWorldPoint, copyManagedImage, createCustomShapeItem, cullItemsByViewport, deleteManagedImage, encodeCanvasToBlob, expandCustomShapeTemplate, formatCameraTransform, formatItemPlacementTransform, hitTestWorldPoint, isArrowBindTarget, isManagedImage, itemHitTestWorldPoint, loadImageFileAsRasterSceneSource, markImageAsManaged, reorderManagedImages, resolveArrowBindingsInScene, restackManagedImages, rotateManagedImage, snapArrowEndpointToShape };
package/dist/index.js CHANGED
@@ -78,6 +78,47 @@ var Camera2D = class {
78
78
  }
79
79
  };
80
80
 
81
+ // src/image/canvas-encode.ts
82
+ var DEFAULT_FALLBACK_MIME_TYPES = ["image/png"];
83
+ var tryCanvasToBlob = (canvas, mimeType, quality) => new Promise((resolve) => {
84
+ canvas.toBlob((blob) => resolve(blob), mimeType, quality);
85
+ });
86
+ var blobFromDataUrl = async (dataUrl) => {
87
+ const response = await fetch(dataUrl);
88
+ const blob = await response.blob();
89
+ if (blob.size === 0) {
90
+ throw new Error("Failed to encode canvas to blob");
91
+ }
92
+ return blob;
93
+ };
94
+ async function encodeCanvasToBlob(canvas, options) {
95
+ const primaryMimeType = options?.mimeType ?? "image/png";
96
+ const quality = options?.quality;
97
+ const mimeTypes = [
98
+ primaryMimeType,
99
+ ...options?.fallbackMimeTypes ?? DEFAULT_FALLBACK_MIME_TYPES
100
+ ].filter(
101
+ (mimeType, index, mimeTypeList) => mimeTypeList.indexOf(mimeType) === index
102
+ );
103
+ for (const mimeType of mimeTypes) {
104
+ const blob = await tryCanvasToBlob(
105
+ canvas,
106
+ mimeType,
107
+ mimeType === primaryMimeType ? quality : void 0
108
+ );
109
+ if (blob) {
110
+ return blob;
111
+ }
112
+ }
113
+ for (const mimeType of mimeTypes) {
114
+ const dataUrl = canvas.toDataURL(mimeType, quality);
115
+ if (dataUrl && dataUrl !== "data:,") {
116
+ return blobFromDataUrl(dataUrl);
117
+ }
118
+ }
119
+ throw new Error("Failed to encode canvas to blob");
120
+ }
121
+
81
122
  // src/image/indexed-db-image-store.ts
82
123
  var DB_NAME = "canvu-image-store";
83
124
  var DB_VERSION = 1;
@@ -193,21 +234,6 @@ async function renderPageToCanvas(page, scale) {
193
234
  await page.render({ canvas, viewport }).promise;
194
235
  return { canvas, width: w, height: h };
195
236
  }
196
- function canvasToBlob(canvas, mime, quality) {
197
- return new Promise((resolve, reject) => {
198
- canvas.toBlob(
199
- (blob) => {
200
- if (!blob) {
201
- reject(new Error("Could not encode blob"));
202
- return;
203
- }
204
- resolve(blob);
205
- },
206
- mime,
207
- quality
208
- );
209
- });
210
- }
211
237
  function normalizePdfPageNumbers(pageNumbers, pageCount) {
212
238
  if (!pageNumbers || pageNumbers.length === 0) {
213
239
  return Array.from({ length: pageCount }, (_, index) => index + 1);
@@ -269,7 +295,7 @@ async function loadPdfToStore(file, store, options) {
269
295
  const page = await pdf.getPage(pageNumber);
270
296
  const { canvas, width, height } = await renderPageToCanvas(page, scale);
271
297
  const mime = "image/png";
272
- const pageBlob = await canvasToBlob(canvas, mime);
298
+ const pageBlob = await encodeCanvasToBlob(canvas, { mimeType: mime });
273
299
  const blobId = await store.storeOriginal(pageBlob);
274
300
  const thumbnailBlobId = storeThumbnails ? await (async () => {
275
301
  const thumbScale = Math.min(1, 256 / Math.max(width, height));
@@ -284,7 +310,9 @@ async function loadPdfToStore(file, store, options) {
284
310
  tCtx.imageSmoothingQuality = "high";
285
311
  tCtx.drawImage(canvas, 0, 0, tw, th);
286
312
  }
287
- const thumbBlob = await canvasToBlob(thumbCanvas, mime);
313
+ const thumbBlob = await encodeCanvasToBlob(thumbCanvas, {
314
+ mimeType: mime
315
+ });
288
316
  return await store.storeThumbnail(thumbBlob);
289
317
  })() : "";
290
318
  const pageResult = {
@@ -324,19 +352,9 @@ function loadImageFromObjectUrl(objectUrl) {
324
352
  });
325
353
  }
326
354
  function canvasToObjectUrl(canvas, mime, quality) {
327
- return new Promise((resolve, reject) => {
328
- canvas.toBlob(
329
- (blob) => {
330
- if (!blob) {
331
- reject(new Error("Could not encode image blob"));
332
- return;
333
- }
334
- resolve(URL.createObjectURL(blob));
335
- },
336
- mime,
337
- quality
338
- );
339
- });
355
+ return encodeCanvasToBlob(canvas, { mimeType: mime, quality }).then(
356
+ (blob) => URL.createObjectURL(blob)
357
+ );
340
358
  }
341
359
  async function loadImageFileAsRasterSceneSource(file, maxDimensionOrOptions) {
342
360
  const { maxDimension: maxDim, embedMode } = normalizeLoadOptions(maxDimensionOrOptions);
@@ -2368,6 +2386,6 @@ var VectorScene = class {
2368
2386
  }
2369
2387
  };
2370
2388
 
2371
- export { ARROW_BIND_SNAP_PX, Camera2D, DEFAULT_STROKE_STYLE, DEFAULT_TEXT_FONT_SIZE, MANAGED_KEY, MAX_RASTER_EMBED_DIMENSION, SvgVectorRenderer, VectorScene, addManagedImage, applyStrokeToItem, attachApplePencilNavigation, attachViewportInput, bakeArrowItemToAbsolute, buildArrowSvg, buildCustomShapeChildrenSvg, buildDrawDotSvg, buildEllipseSvg, buildFreehandPathSvg, buildLineSvg, buildRectSvg, buildTextSvg, cloneVectorSceneItemWithNewId, cloneVectorSceneItemsWithNewIds, collectEraserTargetsAtWorldPoint, computeFreehandSvgPayload, copyManagedImage, createCustomShapeItem, createDrawDotItem, createEllipseItem, createFreehandStrokeItem, createImageFromVectorTrace, createImageItem, createLineItem, createRectangleItem, createShapeId, createTextItem, cullItemsByViewport, deleteManagedImage, expandCustomShapeTemplate, formatCameraTransform, formatItemPlacementTransform, hitTestWorldPoint, hydrateSceneItemsWithAssets, isArrowBindTarget, isManagedImage, itemHitTestWorldPoint, lineEndpointsToLocal, loadImageFileAsRasterSceneSource, markImageAsManaged, normalizeRect, rebuildItemSvg, rectsIntersect, reorderManagedImages, resolveArrowBindingsInScene, resolveStrokeStyle, restackManagedImages, rotateManagedImage, snapArrowEndpointToShape };
2389
+ export { ARROW_BIND_SNAP_PX, Camera2D, DEFAULT_STROKE_STYLE, DEFAULT_TEXT_FONT_SIZE, MANAGED_KEY, MAX_RASTER_EMBED_DIMENSION, SvgVectorRenderer, VectorScene, addManagedImage, applyStrokeToItem, attachApplePencilNavigation, attachViewportInput, bakeArrowItemToAbsolute, buildArrowSvg, buildCustomShapeChildrenSvg, buildDrawDotSvg, buildEllipseSvg, buildFreehandPathSvg, buildLineSvg, buildRectSvg, buildTextSvg, cloneVectorSceneItemWithNewId, cloneVectorSceneItemsWithNewIds, collectEraserTargetsAtWorldPoint, computeFreehandSvgPayload, copyManagedImage, createCustomShapeItem, createDrawDotItem, createEllipseItem, createFreehandStrokeItem, createImageFromVectorTrace, createImageItem, createLineItem, createRectangleItem, createShapeId, createTextItem, cullItemsByViewport, deleteManagedImage, encodeCanvasToBlob, expandCustomShapeTemplate, formatCameraTransform, formatItemPlacementTransform, hitTestWorldPoint, hydrateSceneItemsWithAssets, isArrowBindTarget, isManagedImage, itemHitTestWorldPoint, lineEndpointsToLocal, loadImageFileAsRasterSceneSource, markImageAsManaged, normalizeRect, rebuildItemSvg, rectsIntersect, reorderManagedImages, resolveArrowBindingsInScene, resolveStrokeStyle, restackManagedImages, rotateManagedImage, snapArrowEndpointToShape };
2372
2390
  //# sourceMappingURL=index.js.map
2373
2391
  //# sourceMappingURL=index.js.map