canvu-react 0.3.23 → 0.3.25
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.cjs +67 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +67 -40
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +177 -76
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +177 -76
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
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
|
|
328
|
-
|
|
329
|
-
|
|
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);
|
|
@@ -554,16 +572,23 @@ function distanceBetween(a, b) {
|
|
|
554
572
|
function midpoint(a, b) {
|
|
555
573
|
return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };
|
|
556
574
|
}
|
|
557
|
-
function
|
|
558
|
-
switch (
|
|
575
|
+
function wheelDeltaPixels(delta, deltaMode) {
|
|
576
|
+
switch (deltaMode) {
|
|
559
577
|
case WheelEvent.DOM_DELTA_LINE:
|
|
560
|
-
return
|
|
578
|
+
return delta * 16;
|
|
561
579
|
case WheelEvent.DOM_DELTA_PAGE:
|
|
562
|
-
return
|
|
580
|
+
return delta * 400;
|
|
563
581
|
default:
|
|
564
|
-
return
|
|
582
|
+
return delta;
|
|
565
583
|
}
|
|
566
584
|
}
|
|
585
|
+
var TRACKPAD_MAX_DELTA = 20;
|
|
586
|
+
var MOUSE_WHEEL_DAMPING = 0.4;
|
|
587
|
+
function softenWheelDelta(d) {
|
|
588
|
+
const a = Math.abs(d);
|
|
589
|
+
if (a <= TRACKPAD_MAX_DELTA) return d;
|
|
590
|
+
return Math.sign(d) * (TRACKPAD_MAX_DELTA + (a - TRACKPAD_MAX_DELTA) * MOUSE_WHEEL_DAMPING);
|
|
591
|
+
}
|
|
567
592
|
function attachViewportInput(options) {
|
|
568
593
|
const {
|
|
569
594
|
element,
|
|
@@ -586,8 +611,8 @@ function attachViewportInput(options) {
|
|
|
586
611
|
const onWheel = (e) => {
|
|
587
612
|
if (e.ctrlKey || e.metaKey) {
|
|
588
613
|
e.preventDefault();
|
|
589
|
-
const dy =
|
|
590
|
-
const normDy = Math.abs(dy) <
|
|
614
|
+
const dy = wheelDeltaPixels(e.deltaY, e.deltaMode);
|
|
615
|
+
const normDy = Math.abs(dy) < TRACKPAD_MAX_DELTA ? dy * 12 : dy;
|
|
591
616
|
const factor = Math.exp(-normDy * wheelZoomSensitivity);
|
|
592
617
|
const rect = element.getBoundingClientRect();
|
|
593
618
|
camera.setZoom(camera.zoom * factor, {
|
|
@@ -598,8 +623,10 @@ function attachViewportInput(options) {
|
|
|
598
623
|
return;
|
|
599
624
|
}
|
|
600
625
|
e.preventDefault();
|
|
601
|
-
|
|
602
|
-
|
|
626
|
+
const panDx = softenWheelDelta(wheelDeltaPixels(e.deltaX, e.deltaMode));
|
|
627
|
+
const panDy = softenWheelDelta(wheelDeltaPixels(e.deltaY, e.deltaMode));
|
|
628
|
+
camera.x -= panDx * wheelPanSensitivity / camera.zoom;
|
|
629
|
+
camera.y -= panDy * wheelPanSensitivity / camera.zoom;
|
|
603
630
|
onUpdate();
|
|
604
631
|
};
|
|
605
632
|
const onPointerDown = (e) => {
|
|
@@ -2359,6 +2386,6 @@ var VectorScene = class {
|
|
|
2359
2386
|
}
|
|
2360
2387
|
};
|
|
2361
2388
|
|
|
2362
|
-
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 };
|
|
2363
2390
|
//# sourceMappingURL=index.js.map
|
|
2364
2391
|
//# sourceMappingURL=index.js.map
|