canvu-react 0.3.16 → 0.3.19

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
@@ -266,6 +266,42 @@ declare function cloneVectorSceneItemsWithNewIds(items: readonly VectorSceneItem
266
266
  */
267
267
  declare function cullItemsByViewport(items: readonly VectorSceneItem[], visibleWorld: Rect): VectorSceneItem[];
268
268
 
269
+ declare const MANAGED_KEY = "managed";
270
+ declare function isManagedImage(item: VectorSceneItem): boolean;
271
+ declare function markImageAsManaged(item: VectorSceneItem): VectorSceneItem;
272
+ /**
273
+ * Repositions every managed image into a single vertical stack. The stack
274
+ * origin is the current topmost (minimum Y) managed item — that point in world
275
+ * space is stable across reorder/copy/delete operations, so reorder swaps slots
276
+ * instead of making the whole stack drift downward. Subsequent items are
277
+ * centered on the anchor's center X and stacked downward with a fixed gap.
278
+ *
279
+ * Non-managed items keep their position. Call this after any operation that
280
+ * changes the relative order or count of managed images so the canvas reflects
281
+ * the menu order.
282
+ */
283
+ declare function restackManagedImages(items: readonly VectorSceneItem[]): VectorSceneItem[];
284
+ /**
285
+ * Marks `newItem` as a managed image (locked + `pluginData.managed = true`),
286
+ * appends it to `items`, and restacks all managed images so the new one lands
287
+ * at the bottom of the stack with the anchor preserved.
288
+ *
289
+ * Typical usage: after producing scene items with
290
+ * `ingestAssetFilesToSceneItems`, push each result through this helper to add
291
+ * them to the managed-images stack:
292
+ *
293
+ * ```ts
294
+ * let next = doc.items;
295
+ * for (const created of result.items) next = addManagedImage(next, created);
296
+ * doc.onItemsChange(next);
297
+ * ```
298
+ */
299
+ declare function addManagedImage(items: readonly VectorSceneItem[], newItem: VectorSceneItem): VectorSceneItem[];
300
+ declare function copyManagedImage(items: readonly VectorSceneItem[], id: string): VectorSceneItem[];
301
+ declare function rotateManagedImage(items: readonly VectorSceneItem[], id: string): VectorSceneItem[];
302
+ declare function deleteManagedImage(items: readonly VectorSceneItem[], id: string): VectorSceneItem[];
303
+ declare function reorderManagedImages(items: readonly VectorSceneItem[], orderedManagedIds: readonly string[]): VectorSceneItem[];
304
+
269
305
  /** Default body font size for vector text (local SVG units). */
270
306
  declare const DEFAULT_TEXT_FONT_SIZE = 18;
271
307
  /**
@@ -274,4 +310,4 @@ declare const DEFAULT_TEXT_FONT_SIZE = 18;
274
310
  */
275
311
  declare function buildTextSvg(content: string, _width: number, _height: number, fillColor?: string, fontSize?: number): string;
276
312
 
277
- export { ARROW_BIND_SNAP_PX, type ApplePencilNavOptions, ArrowEndpointBinding, Camera2D, type CreateCustomShapeContent, type CustomShapeSize, DEFAULT_TEXT_FONT_SIZE, type LoadRasterImageFileOptions, MAX_RASTER_EMBED_DIMENSION, type RasterEmbedMode, type RasterSceneSource, Rect, SvgVectorRenderer, type SvgVectorRendererOptions, VectorScene, VectorSceneItem, type ViewportInputOptions, attachApplePencilNavigation, attachViewportInput, bakeArrowItemToAbsolute, buildCustomShapeChildrenSvg, buildTextSvg, cloneVectorSceneItemWithNewId, cloneVectorSceneItemsWithNewIds, collectEraserTargetsAtWorldPoint, createCustomShapeItem, cullItemsByViewport, expandCustomShapeTemplate, formatCameraTransform, formatItemPlacementTransform, hitTestWorldPoint, isArrowBindTarget, itemHitTestWorldPoint, loadImageFileAsRasterSceneSource, resolveArrowBindingsInScene, snapArrowEndpointToShape };
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 };
package/dist/index.d.ts CHANGED
@@ -266,6 +266,42 @@ declare function cloneVectorSceneItemsWithNewIds(items: readonly VectorSceneItem
266
266
  */
267
267
  declare function cullItemsByViewport(items: readonly VectorSceneItem[], visibleWorld: Rect): VectorSceneItem[];
268
268
 
269
+ declare const MANAGED_KEY = "managed";
270
+ declare function isManagedImage(item: VectorSceneItem): boolean;
271
+ declare function markImageAsManaged(item: VectorSceneItem): VectorSceneItem;
272
+ /**
273
+ * Repositions every managed image into a single vertical stack. The stack
274
+ * origin is the current topmost (minimum Y) managed item — that point in world
275
+ * space is stable across reorder/copy/delete operations, so reorder swaps slots
276
+ * instead of making the whole stack drift downward. Subsequent items are
277
+ * centered on the anchor's center X and stacked downward with a fixed gap.
278
+ *
279
+ * Non-managed items keep their position. Call this after any operation that
280
+ * changes the relative order or count of managed images so the canvas reflects
281
+ * the menu order.
282
+ */
283
+ declare function restackManagedImages(items: readonly VectorSceneItem[]): VectorSceneItem[];
284
+ /**
285
+ * Marks `newItem` as a managed image (locked + `pluginData.managed = true`),
286
+ * appends it to `items`, and restacks all managed images so the new one lands
287
+ * at the bottom of the stack with the anchor preserved.
288
+ *
289
+ * Typical usage: after producing scene items with
290
+ * `ingestAssetFilesToSceneItems`, push each result through this helper to add
291
+ * them to the managed-images stack:
292
+ *
293
+ * ```ts
294
+ * let next = doc.items;
295
+ * for (const created of result.items) next = addManagedImage(next, created);
296
+ * doc.onItemsChange(next);
297
+ * ```
298
+ */
299
+ declare function addManagedImage(items: readonly VectorSceneItem[], newItem: VectorSceneItem): VectorSceneItem[];
300
+ declare function copyManagedImage(items: readonly VectorSceneItem[], id: string): VectorSceneItem[];
301
+ declare function rotateManagedImage(items: readonly VectorSceneItem[], id: string): VectorSceneItem[];
302
+ declare function deleteManagedImage(items: readonly VectorSceneItem[], id: string): VectorSceneItem[];
303
+ declare function reorderManagedImages(items: readonly VectorSceneItem[], orderedManagedIds: readonly string[]): VectorSceneItem[];
304
+
269
305
  /** Default body font size for vector text (local SVG units). */
270
306
  declare const DEFAULT_TEXT_FONT_SIZE = 18;
271
307
  /**
@@ -274,4 +310,4 @@ declare const DEFAULT_TEXT_FONT_SIZE = 18;
274
310
  */
275
311
  declare function buildTextSvg(content: string, _width: number, _height: number, fillColor?: string, fontSize?: number): string;
276
312
 
277
- export { ARROW_BIND_SNAP_PX, type ApplePencilNavOptions, ArrowEndpointBinding, Camera2D, type CreateCustomShapeContent, type CustomShapeSize, DEFAULT_TEXT_FONT_SIZE, type LoadRasterImageFileOptions, MAX_RASTER_EMBED_DIMENSION, type RasterEmbedMode, type RasterSceneSource, Rect, SvgVectorRenderer, type SvgVectorRendererOptions, VectorScene, VectorSceneItem, type ViewportInputOptions, attachApplePencilNavigation, attachViewportInput, bakeArrowItemToAbsolute, buildCustomShapeChildrenSvg, buildTextSvg, cloneVectorSceneItemWithNewId, cloneVectorSceneItemsWithNewIds, collectEraserTargetsAtWorldPoint, createCustomShapeItem, cullItemsByViewport, expandCustomShapeTemplate, formatCameraTransform, formatItemPlacementTransform, hitTestWorldPoint, isArrowBindTarget, itemHitTestWorldPoint, loadImageFileAsRasterSceneSource, resolveArrowBindingsInScene, snapArrowEndpointToShape };
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 };
package/dist/index.js CHANGED
@@ -2264,6 +2264,84 @@ function cloneVectorSceneItemsWithNewIds(items) {
2264
2264
  return items.map(cloneVectorSceneItemWithNewId);
2265
2265
  }
2266
2266
 
2267
+ // src/scene/managed-images.ts
2268
+ var MANAGED_KEY = "managed";
2269
+ var STACK_GAP_WORLD = 16;
2270
+ function isManagedImage(item) {
2271
+ const data = item.pluginData;
2272
+ return data != null && data[MANAGED_KEY] === true;
2273
+ }
2274
+ function markImageAsManaged(item) {
2275
+ return {
2276
+ ...item,
2277
+ locked: true,
2278
+ pluginData: { ...item.pluginData ?? {}, [MANAGED_KEY]: true }
2279
+ };
2280
+ }
2281
+ function restackManagedImages(items) {
2282
+ let anchor;
2283
+ for (const item of items) {
2284
+ if (!isManagedImage(item)) continue;
2285
+ if (!anchor || item.bounds.y < anchor.bounds.y) anchor = item;
2286
+ }
2287
+ if (!anchor) return [...items];
2288
+ const anchorCenterX = anchor.bounds.x + anchor.bounds.width / 2;
2289
+ const anchorTopY = anchor.bounds.y;
2290
+ let cursorY = anchorTopY;
2291
+ return items.map((item) => {
2292
+ if (!isManagedImage(item)) return item;
2293
+ const newX = anchorCenterX - item.bounds.width / 2;
2294
+ const newY = cursorY;
2295
+ cursorY = newY + item.bounds.height + STACK_GAP_WORLD;
2296
+ if (item.bounds.x === newX && item.bounds.y === newY) return item;
2297
+ return {
2298
+ ...item,
2299
+ x: newX,
2300
+ y: newY,
2301
+ bounds: { ...item.bounds, x: newX, y: newY }
2302
+ };
2303
+ });
2304
+ }
2305
+ function addManagedImage(items, newItem) {
2306
+ return restackManagedImages([...items, markImageAsManaged(newItem)]);
2307
+ }
2308
+ function copyManagedImage(items, id) {
2309
+ const idx = items.findIndex((i) => i.id === id);
2310
+ if (idx < 0) return [...items];
2311
+ const source = items[idx];
2312
+ if (!source) return [...items];
2313
+ const clone = markImageAsManaged(cloneVectorSceneItemWithNewId(source));
2314
+ const inserted = [...items.slice(0, idx + 1), clone, ...items.slice(idx + 1)];
2315
+ return restackManagedImages(inserted);
2316
+ }
2317
+ function rotateManagedImage(items, id) {
2318
+ return items.map(
2319
+ (i) => i.id === id ? { ...i, rotation: ((i.rotation ?? 0) + Math.PI / 2) % (Math.PI * 2) } : i
2320
+ );
2321
+ }
2322
+ function deleteManagedImage(items, id) {
2323
+ return restackManagedImages(items.filter((i) => i.id !== id));
2324
+ }
2325
+ function reorderManagedImages(items, orderedManagedIds) {
2326
+ const managedSlots = [];
2327
+ for (let i = 0; i < items.length; i++) {
2328
+ const item = items[i];
2329
+ if (item && isManagedImage(item)) managedSlots.push(i);
2330
+ }
2331
+ if (managedSlots.length !== orderedManagedIds.length) {
2332
+ return [...items];
2333
+ }
2334
+ const byId = new Map(items.map((i) => [i.id, i]));
2335
+ const next = [...items];
2336
+ managedSlots.forEach((slot, k) => {
2337
+ const orderedId = orderedManagedIds[k];
2338
+ if (orderedId === void 0) return;
2339
+ const replacement = byId.get(orderedId);
2340
+ if (replacement) next[slot] = replacement;
2341
+ });
2342
+ return restackManagedImages(next);
2343
+ }
2344
+
2267
2345
  // src/scene/scene.ts
2268
2346
  var VectorScene = class {
2269
2347
  items = [];
@@ -2281,6 +2359,6 @@ var VectorScene = class {
2281
2359
  }
2282
2360
  };
2283
2361
 
2284
- export { ARROW_BIND_SNAP_PX, Camera2D, DEFAULT_STROKE_STYLE, DEFAULT_TEXT_FONT_SIZE, MAX_RASTER_EMBED_DIMENSION, SvgVectorRenderer, VectorScene, applyStrokeToItem, attachApplePencilNavigation, attachViewportInput, bakeArrowItemToAbsolute, buildArrowSvg, buildCustomShapeChildrenSvg, buildDrawDotSvg, buildEllipseSvg, buildFreehandPathSvg, buildLineSvg, buildRectSvg, buildTextSvg, cloneVectorSceneItemWithNewId, cloneVectorSceneItemsWithNewIds, collectEraserTargetsAtWorldPoint, computeFreehandSvgPayload, createCustomShapeItem, createDrawDotItem, createEllipseItem, createFreehandStrokeItem, createImageFromVectorTrace, createImageItem, createLineItem, createRectangleItem, createShapeId, createTextItem, cullItemsByViewport, expandCustomShapeTemplate, formatCameraTransform, formatItemPlacementTransform, hitTestWorldPoint, hydrateSceneItemsWithAssets, isArrowBindTarget, itemHitTestWorldPoint, lineEndpointsToLocal, loadImageFileAsRasterSceneSource, normalizeRect, rebuildItemSvg, rectsIntersect, resolveArrowBindingsInScene, resolveStrokeStyle, snapArrowEndpointToShape };
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 };
2285
2363
  //# sourceMappingURL=index.js.map
2286
2364
  //# sourceMappingURL=index.js.map