@edv4h/usketch-dom-renderer 2.1.13 → 2.2.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.
@@ -1,5 +1,12 @@
1
- import type { LayerRenderContext, ShapeRegistry } from "@edv4h/usketch-shared";
2
- export declare function DomShapeLayer({ ctx, shapeRegistry, claimedIds, dropTargetId, viewportLod, viewportLodRatio, }: {
1
+ import type { BoundingBox, LayerRenderContext, ShapeRegistry } from "@edv4h/usketch-shared";
2
+ /**
3
+ * The region outside which shapes are not rendered at all: `viewportBounds` scaled
4
+ * by `ratio` about its center, then grown by `padPx` screen px on every side (a 3D
5
+ * view showing content past the viewport). `null` while the canvas is unmeasured
6
+ * (nothing is culled then).
7
+ */
8
+ export declare function cullRegion(viewportBounds: BoundingBox, ratio: number, padPx: number, zoom: number): BoundingBox | null;
9
+ export declare function DomShapeLayer({ ctx, shapeRegistry, claimedIds, dropTargetId, viewportLod, viewportLodRatio, viewportCull, viewportCullRatio, cullPadPx, }: {
3
10
  ctx: LayerRenderContext;
4
11
  shapeRegistry: ShapeRegistry;
5
12
  /** Shape IDs already claimed by another renderer (e.g. GPU). These are skipped. */
@@ -10,5 +17,14 @@ export declare function DomShapeLayer({ ctx, shapeRegistry, claimedIds, dropTarg
10
17
  viewportLod?: boolean;
11
18
  /** Full-detail region as a multiple of the viewport (1.2 = 120%). See isShapeOutsideViewport. */
12
19
  viewportLodRatio?: number;
20
+ /** Don't render shapes outside `viewportCullRatio` × the viewport at all. */
21
+ viewportCull?: boolean;
22
+ /**
23
+ * Cull region as a multiple of the viewport (2 = 200%). While `viewportLod` is on it
24
+ * is never below `viewportLodRatio` (shapes between the two render simplified).
25
+ */
26
+ viewportCullRatio?: number;
27
+ /** Extra screen px around the cull region (content a 3D view shows past the viewport). */
28
+ cullPadPx?: number;
13
29
  }): import("react").JSX.Element | null;
14
30
  //# sourceMappingURL=dom-shape-layer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom-shape-layer.d.ts","sourceRoot":"","sources":["../src/dom-shape-layer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAa,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA6H1F,wBAAgB,aAAa,CAAC,EAC7B,GAAG,EACH,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAkB,EAClB,gBAAsB,GACtB,EAAE;IACF,GAAG,EAAE,kBAAkB,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,mFAAmF;IACnF,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B,sCA8HA"}
1
+ {"version":3,"file":"dom-shape-layer.d.ts","sourceRoot":"","sources":["../src/dom-shape-layer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,WAAW,EACX,kBAAkB,EAElB,aAAa,EACb,MAAM,uBAAuB,CAAC;AAyD/B;;;;;GAKG;AACH,wBAAgB,UAAU,CACzB,cAAc,EAAE,WAAW,EAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACV,WAAW,GAAG,IAAI,CAUpB;AA6FD,wBAAgB,aAAa,CAAC,EAC7B,GAAG,EACH,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAkB,EAClB,gBAAsB,EACtB,YAAmB,EACnB,iBAAqB,EACrB,SAAa,GACb,EAAE;IACF,GAAG,EAAE,kBAAkB,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,mFAAmF;IACnF,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,sCAwIA"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { isShapeContainer, isShapeOutsideViewport, safeRotation } from "@edv4h/usketch-shared";
3
- import { memo } from "react";
2
+ import { isShapeContainer, isShapeOutsideViewport, safeRotation, scaleRectAboutCenter, } from "@edv4h/usketch-shared";
3
+ import { memo, useMemo } from "react";
4
4
  import { LodFallback } from "./lod-fallback.js";
5
5
  /**
6
6
  * Reorder shapes so that each child appears immediately after its parent container,
@@ -49,6 +49,24 @@ function stableParentSort(sorted) {
49
49
  }
50
50
  return result;
51
51
  }
52
+ /**
53
+ * The region outside which shapes are not rendered at all: `viewportBounds` scaled
54
+ * by `ratio` about its center, then grown by `padPx` screen px on every side (a 3D
55
+ * view showing content past the viewport). `null` while the canvas is unmeasured
56
+ * (nothing is culled then).
57
+ */
58
+ export function cullRegion(viewportBounds, ratio, padPx, zoom) {
59
+ if (viewportBounds.width <= 0 || viewportBounds.height <= 0)
60
+ return null;
61
+ const scaled = scaleRectAboutCenter(viewportBounds, ratio);
62
+ const pad = padPx > 0 && zoom > 0 ? padPx / zoom : 0;
63
+ return {
64
+ x: scaled.x - pad,
65
+ y: scaled.y - pad,
66
+ width: scaled.width + 2 * pad,
67
+ height: scaled.height + 2 * pad,
68
+ };
69
+ }
52
70
  // When dragging shapes onto a frame (drop target detected), boost their
53
71
  // zIndex so they render above the frame's opaque background.
54
72
  // Only applied when a drop target is active, not during normal selection.
@@ -84,10 +102,29 @@ const ShapeWrapper = memo(function ShapeWrapper({ shape, index, selected, overDr
84
102
  transformOrigin: "center center",
85
103
  }, children: isHtml ? (def.render(shape)) : (_jsx("svg", { width: svgW, height: svgH, viewBox: `${bounds.x} ${bounds.y} ${svgW} ${svgH}`, style: { display: "block", overflow: "visible" }, children: def.render(shape) })) }));
86
104
  });
87
- export function DomShapeLayer({ ctx, shapeRegistry, claimedIds, dropTargetId, viewportLod = true, viewportLodRatio = 1.2, }) {
105
+ /**
106
+ * LOD 表示の 1 シェイプ分。`ShapeWrapper` と同じく `React.memo` で囲み、`shape` 参照と
107
+ * `Simplified` が変わらないフレームでは再描画をスキップする。
108
+ *
109
+ * 画面外のシェイプはすべてここを通るため、memo が無いとパン・ズームの毎フレームや、
110
+ * 別のシェイプを 1 件ドラッグしただけでも、画面外のシェイプ全件の simplifiedComponent が
111
+ * 再実行されていた。
112
+ */
113
+ const LodShape = memo(function LodShape({ shape, Simplified, }) {
114
+ return _jsx(Simplified, { shape: shape });
115
+ });
116
+ export function DomShapeLayer({ ctx, shapeRegistry, claimedIds, dropTargetId, viewportLod = true, viewportLodRatio = 1.2, viewportCull = true, viewportCullRatio = 2, cullPadPx = 0, }) {
117
+ // Parents-before-children order only depends on the shapes, not the viewport, so
118
+ // it is not redone on every pan / zoom frame.
119
+ const shapes = useMemo(() => stableParentSort(ctx.shapesSorted), [ctx.shapesSorted]);
88
120
  // `gpu-only` mode: hide the DOM layer entirely (reserved for future use).
89
121
  if (ctx.renderMode === "gpu-only")
90
122
  return null;
123
+ // Off-screen shapes beyond the cull region aren't mounted: even simplified, every
124
+ // mounted node is walked and painted again on each pan / zoom frame.
125
+ const culling = viewportCull
126
+ ? cullRegion(ctx.viewportBounds, viewportLod ? Math.max(viewportCullRatio, viewportLodRatio) : viewportCullRatio, cullPadPx, ctx.viewport.zoom)
127
+ : null;
91
128
  // Global LOD (zoom/count/fps): every shape renders simplified.
92
129
  const globalLod = ctx.renderMode === "lod";
93
130
  // GPU is "active" only when it is both enabled (non-interactive mode) AND has
@@ -99,11 +136,6 @@ export function DomShapeLayer({ ctx, shapeRegistry, claimedIds, dropTargetId, vi
99
136
  // so DOM owns the full shape set.
100
137
  const gpuActive = ctx.renderMode !== "interactive" && claimedIds !== undefined;
101
138
  const effectiveClaimedIds = gpuActive ? claimedIds : undefined;
102
- // Use pre-sorted shapes (by zIndex ascending) from the layer render context,
103
- // then reorder so that each child appears immediately after its parent container.
104
- // This preserves user-controlled z-order within each sibling group while keeping
105
- // the container-before-child invariant required by the DOM stacking context.
106
- const shapes = stableParentSort(ctx.shapesSorted);
107
139
  return (_jsx("div", { "data-layer": "shapes", children: shapes.map((shape, index) => {
108
140
  // Skip invalid shapes (e.g. leaked Yjs internal objects)
109
141
  if (!shape || typeof shape.id !== "string" || typeof shape.type !== "string") {
@@ -114,6 +146,8 @@ export function DomShapeLayer({ ctx, shapeRegistry, claimedIds, dropTargetId, vi
114
146
  return null;
115
147
  }
116
148
  const def = shapeRegistry.get(shape.type);
149
+ if (culling && isShapeOutsideViewport(shape, culling, 1))
150
+ return null;
117
151
  // LOD when the global mode says so, OR (per-shape) when the shape sits
118
152
  // outside the scaled viewport — off-screen shapes render simplified.
119
153
  const isLod = globalLod ||
@@ -132,7 +166,7 @@ export function DomShapeLayer({ ctx, shapeRegistry, claimedIds, dropTargetId, vi
132
166
  if (def?.gpuPrimitive && gpuActive)
133
167
  return null;
134
168
  const Simplified = def?.simplifiedComponent ?? LodFallback;
135
- return _jsx(Simplified, { shape: shape }, shape.id);
169
+ return _jsx(LodShape, { shape: shape, Simplified: Simplified }, shape.id);
136
170
  }
137
171
  if (!def) {
138
172
  const sx = shape.x || 0;
@@ -1 +1 @@
1
- {"version":3,"file":"dom-shape-layer.js","sourceRoot":"","sources":["../src/dom-shape-layer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dom-shape-layer.js","sourceRoot":"","sources":["../src/dom-shape-layer.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { DomShapeLayer } from "./dom-shape-layer.js";
2
- export { createDomRendererPlugin, type DomRendererOptions, SET_VIEWPORT_LOD_EVENT, type SetViewportLodEvent, } from "./plugin.js";
2
+ export { createDomRendererPlugin, type DomRendererOptions, SET_VIEWPORT_CULL_EVENT, SET_VIEWPORT_LOD_EVENT, type SetViewportCullEvent, type SetViewportLodEvent, VIEWPORT_OVERSCAN_EVENT, } from "./plugin.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACN,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,sBAAsB,EACtB,KAAK,mBAAmB,GACxB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACN,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,uBAAuB,GACvB,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { DomShapeLayer } from "./dom-shape-layer.js";
2
- export { createDomRendererPlugin, SET_VIEWPORT_LOD_EVENT, } from "./plugin.js";
2
+ export { createDomRendererPlugin, SET_VIEWPORT_CULL_EVENT, SET_VIEWPORT_LOD_EVENT, VIEWPORT_OVERSCAN_EVENT, } from "./plugin.js";
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACN,uBAAuB,EAEvB,sBAAsB,GAEtB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACN,uBAAuB,EAEvB,uBAAuB,EACvB,sBAAsB,EAGtB,uBAAuB,GACvB,MAAM,aAAa,CAAC"}
package/dist/plugin.d.ts CHANGED
@@ -9,6 +9,15 @@ export interface DomRendererOptions {
9
9
  viewportLod?: boolean | {
10
10
  ratio?: number;
11
11
  };
12
+ /**
13
+ * Don't render shapes far outside the camera viewport at all (perf: every mounted
14
+ * shape is painted again on each pan / zoom frame). `true` (default) culls beyond a
15
+ * 200% region; pass `{ ratio }` to tune it (never below the LOD region while LOD is
16
+ * on). `false` disables it (every shape stays mounted).
17
+ */
18
+ viewportCull?: boolean | {
19
+ ratio?: number;
20
+ };
12
21
  }
13
22
  /** Runtime override of the viewport-LOD setting (emit to adjust from a UI control). */
14
23
  export interface SetViewportLodEvent {
@@ -16,5 +25,17 @@ export interface SetViewportLodEvent {
16
25
  ratio?: number;
17
26
  }
18
27
  export declare const SET_VIEWPORT_LOD_EVENT = "renderer:set-viewport-lod";
28
+ /** Runtime override of the viewport-culling setting (emit to adjust from a UI control). */
29
+ export interface SetViewportCullEvent {
30
+ enabled?: boolean;
31
+ ratio?: number;
32
+ }
33
+ export declare const SET_VIEWPORT_CULL_EVENT = "renderer:set-viewport-cull";
34
+ /**
35
+ * Event a 3D view (Mode 7) emits with how many screen px of the board it shows past the
36
+ * viewport (`{ px }`); the cull region grows by that much so those shapes stay drawn.
37
+ * Shared with the background grid and the map ground, which follow the same event.
38
+ */
39
+ export declare const VIEWPORT_OVERSCAN_EVENT = "bg-grid:set-overscan";
19
40
  export declare function createDomRendererPlugin(options?: DomRendererOptions): UsketchPlugin;
20
41
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG1E,MAAM,WAAW,kBAAkB;IAClC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,uFAAuF;AACvF,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AACD,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAYlE,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,kBAAuB,GAAG,aAAa,CAoFvF"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG1E,MAAM,WAAW,kBAAkB;IAClC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,uFAAuF;AACvF,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AACD,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAElE,2FAA2F;AAC3F,MAAM,WAAW,oBAAoB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AACD,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAa9D,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,kBAAuB,GAAG,aAAa,CAkHvF"}
package/dist/plugin.js CHANGED
@@ -1,11 +1,19 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { DomShapeLayer } from "./dom-shape-layer.js";
3
3
  export const SET_VIEWPORT_LOD_EVENT = "renderer:set-viewport-lod";
4
+ export const SET_VIEWPORT_CULL_EVENT = "renderer:set-viewport-cull";
5
+ /**
6
+ * Event a 3D view (Mode 7) emits with how many screen px of the board it shows past the
7
+ * viewport (`{ px }`); the cull region grows by that much so those shapes stay drawn.
8
+ * Shared with the background grid and the map ground, which follow the same event.
9
+ */
10
+ export const VIEWPORT_OVERSCAN_EVENT = "bg-grid:set-overscan";
4
11
  const DEFAULT_VIEWPORT_LOD_RATIO = 1.2;
12
+ const DEFAULT_VIEWPORT_CULL_RATIO = 2;
5
13
  /** Clamp a user-provided ratio to a finite positive number (else the default). */
6
- function sanitizeRatio(ratio) {
14
+ function sanitizeRatio(ratio, fallback = DEFAULT_VIEWPORT_LOD_RATIO) {
7
15
  if (typeof ratio !== "number" || !Number.isFinite(ratio) || ratio <= 0) {
8
- return DEFAULT_VIEWPORT_LOD_RATIO;
16
+ return fallback;
9
17
  }
10
18
  return ratio;
11
19
  }
@@ -14,6 +22,8 @@ export function createDomRendererPlugin(options = {}) {
14
22
  // render closure below reads the latest values.
15
23
  let viewportLodEnabled = options.viewportLod !== false;
16
24
  let viewportLodRatio = sanitizeRatio(typeof options.viewportLod === "object" ? options.viewportLod.ratio : undefined);
25
+ let viewportCullEnabled = options.viewportCull !== false;
26
+ let viewportCullRatio = sanitizeRatio(typeof options.viewportCull === "object" ? options.viewportCull.ratio : undefined, DEFAULT_VIEWPORT_CULL_RATIO);
17
27
  return {
18
28
  id: "usketch-dom-renderer",
19
29
  name: "DOM Renderer",
@@ -22,6 +32,8 @@ export function createDomRendererPlugin(options = {}) {
22
32
  let claimedIds = new Set();
23
33
  // Track drop target frame (set by select tool during drag)
24
34
  let dropTargetId = null;
35
+ // Screen px a 3D view shows past the viewport (see VIEWPORT_OVERSCAN_EVENT)
36
+ let overscanPx = 0;
25
37
  // Runtime viewport-LOD adjustment from a UI control (Control HUD).
26
38
  const unsubViewportLod = ctx.events.on(SET_VIEWPORT_LOD_EVENT, (d) => {
27
39
  if (typeof d.enabled === "boolean")
@@ -30,6 +42,21 @@ export function createDomRendererPlugin(options = {}) {
30
42
  viewportLodRatio = sanitizeRatio(d.ratio);
31
43
  ctx.events.emit("layers:changed", {});
32
44
  });
45
+ const unsubViewportCull = ctx.events.on(SET_VIEWPORT_CULL_EVENT, (d) => {
46
+ if (typeof d.enabled === "boolean")
47
+ viewportCullEnabled = d.enabled;
48
+ if (typeof d.ratio === "number") {
49
+ viewportCullRatio = sanitizeRatio(d.ratio, DEFAULT_VIEWPORT_CULL_RATIO);
50
+ }
51
+ ctx.events.emit("layers:changed", {});
52
+ });
53
+ const unsubOverscan = ctx.events.on(VIEWPORT_OVERSCAN_EVENT, ({ px }) => {
54
+ const next = Number.isFinite(px) && px > 0 ? px : 0;
55
+ if (next === overscanPx)
56
+ return;
57
+ overscanPx = next;
58
+ ctx.events.emit("layers:changed", {});
59
+ });
33
60
  const unsubClaim = ctx.events.on("renderer:claim-shapes", (data) => {
34
61
  // Only nudge the canvas to re-render if the claim set
35
62
  // actually changed — otherwise we'd loop with GpuShapeLayer's
@@ -61,12 +88,14 @@ export function createDomRendererPlugin(options = {}) {
61
88
  ctx.layers.register({
62
89
  id: "dom-shapes",
63
90
  order: 50,
64
- render: (renderCtx) => (_jsx(DomShapeLayer, { ctx: renderCtx, shapeRegistry: ctx.shapes, claimedIds: claimedIds.size > 0 ? claimedIds : undefined, dropTargetId: dropTargetId, viewportLod: viewportLodEnabled, viewportLodRatio: viewportLodRatio })),
91
+ render: (renderCtx) => (_jsx(DomShapeLayer, { ctx: renderCtx, shapeRegistry: ctx.shapes, claimedIds: claimedIds.size > 0 ? claimedIds : undefined, dropTargetId: dropTargetId, viewportLod: viewportLodEnabled, viewportLodRatio: viewportLodRatio, viewportCull: viewportCullEnabled, viewportCullRatio: viewportCullRatio, cullPadPx: overscanPx })),
65
92
  });
66
93
  return () => {
67
94
  unsubClaim();
68
95
  unsubDropTarget();
69
96
  unsubViewportLod();
97
+ unsubViewportCull();
98
+ unsubOverscan();
70
99
  ctx.layers.unregister("dom-shapes");
71
100
  };
72
101
  },
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edv4h/usketch-dom-renderer",
3
- "version": "2.1.13",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -12,7 +12,7 @@
12
12
  }
13
13
  },
14
14
  "dependencies": {
15
- "@edv4h/usketch-shared": "4.18.0"
15
+ "@edv4h/usketch-shared": "4.19.0"
16
16
  },
17
17
  "peerDependencies": {
18
18
  "react": ">=19",
@@ -21,6 +21,7 @@
21
21
  "devDependencies": {
22
22
  "@types/react": "19.3.0",
23
23
  "@types/react-dom": "19.3.0",
24
+ "jsdom": "30.1.3",
24
25
  "typescript": "7.0.2",
25
26
  "vitest": "5.0.5"
26
27
  },