@weasel-js/core 1.4.0-pre.0 → 1.4.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,4 +1,4 @@
1
- import { ActionDisabledReason, useOptionalDepRegistry, DepRegistryProvider, useActionsRegistry, ActionsProvider, useDepRegistry, reportRouteConflicts, buildDepsFromRequires, useDepSource, actionBindings } from './chunk-H6E6KPTU.js';
1
+ import { ActionDisabledReason, useOptionalDepRegistry, DepRegistryProvider, useActionsRegistry, ActionsProvider, useDepRegistry, reportRouteConflicts, buildDepsFromRequires, useDepSource, actionBindings } from './chunk-UTIFY2UU.js';
2
2
  import { scratchKey, createTransformOp, snap, getScratch, createReparentOp, setScratch } from './chunk-Y5KS66G7.js';
3
3
  import { fixedCornerOf, DEFAULT_RESIZE_BEHAVIORS, CORNER_ANCHORS, cornerPoint } from './chunk-BLJNRMKB.js';
4
4
  import { AUTO_POSE_DESCRIPTOR, resolveUnit, polylineFromPoints, starPath, regularPolygonPath, linePath, ellipsePath, rectPath, polygonFromPoints, PATH_M, PATH_L, PATH_Z, RECT_POSE_DESCRIPTOR, pathPoseDescriptor, withinPxRadius, boundsOfPath, PATH_Q, PATH_C, DEFAULT_FLATTEN_TOLERANCE, flattenQuadratic, flattenCubic, PathBuilder, pointInPath, strokeHitTest, transformPath, translatePath, pxExtent, remapRotatedLeaf, withinPxBox, flattenCubicWithArcLen, flattenQuadraticWithArcLen, PATH_CMD_LENGTHS, pointToGridCell } from './chunk-SBFC6J3C.js';
@@ -6,7 +6,7 @@ import { dispatchApplyBatch, dlog, dwarn, usePointerContext, PointerContextProvi
6
6
  import { createSetSelectionOp } from './chunk-ZB7UYJVG.js';
7
7
  import { registerOpFactory, createDeleteOp, createInsertOp, rebuildOp } from './chunk-2KKYDDDD.js';
8
8
  import { getTexture, chunks, dots, crosshatch, hatch } from './chunk-BJN5ZRIJ.js';
9
- import { createContext, createElement, forwardRef, useMemo, useRef, useCallback, useState, useImperativeHandle, useSyncExternalStore, useEffect, useLayoutEffect, useContext, useId, useReducer } from 'react';
9
+ import { createContext, createElement, forwardRef, useMemo, useRef, useCallback, useState, useEffect, useImperativeHandle, useSyncExternalStore, useLayoutEffect, useContext, useId, useReducer } from 'react';
10
10
  import { subscribeGlyphReady, DEFAULT_BAKE_BUDGET, TEXT_VERT_SRC, TEXT_FRAG_SRC, TEXT_SDF_UNIFORMS, TEXT_SDF_ATTRIBUTES, TEXT_FRAG_R8_SRC, markAllFontsNotUploaded, resetBakeBudget, syncDynamicPageTexture, ensureFontTexture, dynamicPageTextureId, textureCacheKey } from '@weasel-js/font';
11
11
  export { canQueryLocalFonts, canQueryLocalFonts as canQueryLocalFonts2, enableLocalFontOutlines, enableLocalFontOutlines as enableLocalFontOutlines2, hasFontOutlines, hasFontOutlines as hasFontOutlines2, isCanvasFont, isCanvasFont as isCanvasFont2, listFontOutlines, listFontOutlines as listFontOutlines2, outlineStatus, outlineStatus as outlineStatus2, registerCanvasFont, registerCanvasFont as registerCanvasFont2, registerFont, registerFont as registerFont2, registerFontOutlines, registerFontOutlines as registerFontOutlines2, subscribeGlyphReady, subscribeGlyphReady as subscribeGlyphReady2, unregisterCanvasFont, unregisterCanvasFont as unregisterCanvasFont2, unregisterFontOutlines, unregisterFontOutlines as unregisterFontOutlines2 } from '@weasel-js/font';
12
12
  import { resolveTextStyle, resolveAlign, resolveRuns, cachedLayoutRuns, verticalAlignOffset, runsToPlainText, toRuns, fontString, textLineBoxes } from '@weasel-js/text';
@@ -19,11 +19,13 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
19
19
  import polygonClipping from 'polygon-clipping';
20
20
  import { matchSpec, RESERVED_ID_PREFIXES, RESERVED_ID_NAMES, parseTargetSpec, mimeMatchesGlob } from '@weasel-js/gestures';
21
21
  import { NORMAL, IMPLICIT_TAGS } from '@weasel-js/modes';
22
+ import { GLYPHS, cursorWorldSize, cursorPaintOps, chromeLineWidthScale, cursorPaintMatrix, resolveCursorTier, cursorFor, resolveCursor } from '@weasel-js/cursor';
23
+ export { bakeCursor, cursorFor, resolveCursor, resolveCursorTier } from '@weasel-js/cursor';
22
24
  import { createHistory } from '@weasel-js/history';
23
25
  export * from '@weasel-js/history';
24
26
 
25
27
  // src/version.ts
26
- var VERSION = "1.4.0-pre.0" ;
28
+ var VERSION = "1.4.0" ;
27
29
 
28
30
  // src/features/grid/roundToCell.ts
29
31
  function roundToCell(value, cellSize) {
@@ -6731,8 +6733,8 @@ function runLayoutPass(scratch, moveCtx) {
6731
6733
  for (const [cid, pose] of srcLayout.childPoses(srcContainer, srcChildren)) {
6732
6734
  const cur = composeWorldPose(poseAdapter, cid, pc.compose);
6733
6735
  const next = pose;
6734
- const same = cur.x === next.x && cur.y === next.y && cur.width === next.width && cur.height === next.height;
6735
- if (same) continue;
6736
+ const same2 = cur.x === next.x && cur.y === next.y && cur.width === next.width && cur.height === next.height;
6737
+ if (same2) continue;
6736
6738
  sourceReflow.set(cid, pose);
6737
6739
  const parent = scene.get(asNodeId(cid))?.parent ?? null;
6738
6740
  scratch.previews.set(asNodeId(cid), rebaseLocalPose(poseAdapter, pose, parent, pc.compose, pc.decompose));
@@ -8125,6 +8127,11 @@ var cloneAction = {
8125
8127
  id: "clone",
8126
8128
  label: "Clone",
8127
8129
  defaultBinding: { kind: "drag" },
8130
+ // The platform's duplicate cursor, and the whole reason this field is
8131
+ // modifier-aware: the select tool binds clone behind `mods: { alt: true }`,
8132
+ // so the pump predicts it — and shows this — only while Alt is down.
8133
+ cursor: "copy",
8134
+ activeCursor: "copy",
8128
8135
  eligible: { capability: ["edits-page", "creates-selection"] },
8129
8136
  requires: ["selection", "scene", "applyOps"],
8130
8137
  invoker: {
@@ -12285,8 +12292,6 @@ function useHoverTracking(args) {
12285
12292
  }, [canvasRef, enabled]);
12286
12293
  return () => hoverRef.current;
12287
12294
  }
12288
-
12289
- // src/interactions/dispatcher/dispatcher.ts
12290
12295
  function pointerGestureId(pointerId) {
12291
12296
  return `pointer-${pointerId ?? "mouse"}`;
12292
12297
  }
@@ -12791,7 +12796,7 @@ function createDispatcher(opts) {
12791
12796
  }
12792
12797
  function inFlightCursor() {
12793
12798
  for (const action of inFlightActions.values()) {
12794
- const cursor = action.activeCursor ?? action.cursor;
12799
+ const cursor = resolveCursor(action.activeCursor ?? action.cursor);
12795
12800
  if (cursor) return cursor;
12796
12801
  }
12797
12802
  return null;
@@ -12974,8 +12979,6 @@ function itemsFromClipboardData(cd) {
12974
12979
  }
12975
12980
  return out;
12976
12981
  }
12977
-
12978
- // src/interactions/dispatcher/useGestureDispatcher.tsx
12979
12982
  var DROPOVER_CLASS = "weasel-dropover";
12980
12983
  function stylusOf(e) {
12981
12984
  return {
@@ -13017,7 +13020,7 @@ function computeMultiTouchGeometry(positions) {
13017
13020
  return { centroid, spread };
13018
13021
  }
13019
13022
  function useGestureDispatcher(opts) {
13020
- const { canvasRef, actions, toolsById, enabled = true, keyboard = true, affordanceAt, classifyTarget, dispatcher: dispatcherOpt, clientToWorld: clientToWorld2, requestRedraw, getRuleCtx, onDoubleClick, views } = opts;
13023
+ const { canvasRef, actions, toolsById, enabled = true, keyboard = true, affordanceAt, classifyTarget, dispatcher: dispatcherOpt, clientToWorld: clientToWorld2, requestRedraw, paintedCursor, getRuleCtx, onDoubleClick, views } = opts;
13021
13024
  const onDoubleClickRef = useRef(onDoubleClick);
13022
13025
  onDoubleClickRef.current = onDoubleClick;
13023
13026
  const activeTool = useActiveToolContext();
@@ -13066,6 +13069,8 @@ function useGestureDispatcher(opts) {
13066
13069
  ];
13067
13070
  const requestRedrawRef = useRef(requestRedraw);
13068
13071
  requestRedrawRef.current = requestRedraw;
13072
+ const paintedCursorRef = useRef(paintedCursor);
13073
+ paintedCursorRef.current = paintedCursor;
13069
13074
  const lastClickRef = useRef(null);
13070
13075
  const prevActiveRef = useRef(activeTool.active);
13071
13076
  useEffect(() => {
@@ -13405,20 +13410,39 @@ function useGestureDispatcher(opts) {
13405
13410
  let lastHover = null;
13406
13411
  let cursorOverridden = false;
13407
13412
  const clearHoverCursor = () => {
13413
+ paintedCursorRef.current?.()?.setOverride(null);
13408
13414
  if (cursorOverridden && canvas) {
13409
13415
  canvas.style.cursor = "";
13410
13416
  cursorOverridden = false;
13411
13417
  }
13412
13418
  };
13413
- const applyHoverCursor = (cursor) => {
13414
- if (cursor && canvas) {
13415
- canvas.style.cursor = cursor;
13416
- cursorOverridden = true;
13417
- } else {
13419
+ const applyHoverCursor = (spec) => {
13420
+ const tier = spec === null ? null : resolveCursorTier(spec);
13421
+ if (!tier || !canvas) {
13418
13422
  clearHoverCursor();
13423
+ return;
13419
13424
  }
13425
+ const painted = tier.kind === "painted" ? tier : null;
13426
+ paintedCursorRef.current?.()?.setOverride(painted);
13427
+ const cursor = tier.kind === "css" ? tier.css : "none";
13428
+ if (!cursor) {
13429
+ clearHoverCursor();
13430
+ return;
13431
+ }
13432
+ canvas.style.cursor = cursor;
13433
+ cursorOverridden = true;
13420
13434
  };
13435
+ function pushPaintedPointer() {
13436
+ const painted = paintedCursorRef.current?.();
13437
+ if (!painted?.active() || !canvas || !lastHover) return;
13438
+ const r = canvas.getBoundingClientRect();
13439
+ painted.setPointer(lastHover.clientX - r.left, lastHover.clientY - r.top);
13440
+ }
13421
13441
  function refreshHoverCursor() {
13442
+ resolveHoverCursor();
13443
+ pushPaintedPointer();
13444
+ }
13445
+ function resolveHoverCursor() {
13422
13446
  if (!canvas || !lastHover) return;
13423
13447
  if (activePointers.size > 0 || dispatcherNow().inFlight().size > 0) {
13424
13448
  applyHoverCursor(dispatcherNow().inFlightCursor());
@@ -13470,6 +13494,7 @@ function useGestureDispatcher(opts) {
13470
13494
  };
13471
13495
  const onHoverPointerLeave = () => {
13472
13496
  lastHover = null;
13497
+ paintedCursorRef.current?.()?.clearPointer();
13473
13498
  clearHoverCursor();
13474
13499
  };
13475
13500
  const onPointerUp = (e) => {
@@ -15199,7 +15224,7 @@ function validateId(id, kind) {
15199
15224
  }
15200
15225
  function defineTool(def) {
15201
15226
  validateId(def.id, "tool");
15202
- const resolveCursor = (ctx) => {
15227
+ const resolveCursor3 = (ctx) => {
15203
15228
  if (def.cursor == null) return "";
15204
15229
  return typeof def.cursor === "function" ? def.cursor(ctx) : def.cursor;
15205
15230
  };
@@ -15217,7 +15242,7 @@ function defineTool(def) {
15217
15242
  onActivate: def.onActivate,
15218
15243
  onDeactivate: def.onDeactivate,
15219
15244
  initScratch: def.initScratch ?? (() => null),
15220
- cursor: resolveCursor,
15245
+ cursor: resolveCursor3,
15221
15246
  bindings: def.bindings,
15222
15247
  overlay: def.overlay,
15223
15248
  overlayPosition: def.overlayPosition
@@ -17287,6 +17312,9 @@ function transformOf(state, targetId) {
17287
17312
  identity: false
17288
17313
  };
17289
17314
  }
17315
+ function angleOf(xf) {
17316
+ return xf.identity ? 0 : Math.atan2(xf.sin, xf.cos);
17317
+ }
17290
17318
  function localToWorld(xf, lx, ly) {
17291
17319
  if (xf.identity) return { x: lx, y: ly };
17292
17320
  const dx = lx - xf.cx;
@@ -17590,11 +17618,7 @@ var DEFAULT_PAINT = {
17590
17618
  insetPx: 10
17591
17619
  };
17592
17620
  function createRotationAffordance(opts = {}) {
17593
- const {
17594
- bandPx = 24,
17595
- paint = DEFAULT_PAINT,
17596
- cursor = "grab"
17597
- } = opts;
17621
+ const { bandPx = 24, paint = DEFAULT_PAINT, cursor } = opts;
17598
17622
  const annulusPaint = (() => {
17599
17623
  if (!paint) return null;
17600
17624
  if ("paint" in paint) {
@@ -17632,7 +17656,14 @@ function createRotationAffordance(opts = {}) {
17632
17656
  },
17633
17657
  ...annulusPaint ? { paint: annulusPaint } : {},
17634
17658
  hitKind: "rotate-handle",
17635
- cursor,
17659
+ // Turned with the target, so the arc follows the selection it rotates.
17660
+ // Resolved per region rather than defaulted in the option list because
17661
+ // the angle is only known once a target is picked.
17662
+ cursor: cursor ?? {
17663
+ glyph: "rotate",
17664
+ angle: angleOf(transformOf(state, target.id)),
17665
+ fallback: "grab"
17666
+ },
17636
17667
  bind: () => ({
17637
17668
  initialScratch: {
17638
17669
  targetId: target.id,
@@ -17808,8 +17839,6 @@ function constrainTo45(dx, dy) {
17808
17839
  const snapped = Math.round(angle / step) * step;
17809
17840
  return { dx: Math.cos(snapped) * mag, dy: Math.sin(snapped) * mag };
17810
17841
  }
17811
-
17812
- // src/tools/builtin/pen/usePenTool.ts
17813
17842
  function freshScratch() {
17814
17843
  return {
17815
17844
  finishedSubpaths: [],
@@ -18048,7 +18077,7 @@ function usePenTool(options) {
18048
18077
  hookName: "usePenTool",
18049
18078
  // Reads the tool's own ref rather than a scratch handed in by a
18050
18079
  // dispatcher — the pen owns this state and nothing else needs it.
18051
- cursor: () => scratchRef.current?.closeHintActive ? "pointer" : "crosshair",
18080
+ cursor: () => scratchRef.current?.closeHintActive ? "pointer" : cursorFor("pen", { fallback: "crosshair" }),
18052
18081
  presentation: {
18053
18082
  label: "Pen",
18054
18083
  icon: createElement(PenIcon),
@@ -18117,7 +18146,7 @@ function useRectTool() {
18117
18146
  id: "rect",
18118
18147
  capabilities: ["creates-shapes"],
18119
18148
  hookName: "useRectTool",
18120
- cursor: "crosshair",
18149
+ cursor: cursorFor("crosshairRect", { fallback: "crosshair" }),
18121
18150
  presentation: {
18122
18151
  label: "Rectangle",
18123
18152
  icon: createElement(RectIcon),
@@ -18143,7 +18172,7 @@ function useEllipseTool() {
18143
18172
  id: "ellipse",
18144
18173
  capabilities: ["creates-shapes"],
18145
18174
  hookName: "useEllipseTool",
18146
- cursor: "crosshair",
18175
+ cursor: cursorFor("crosshairEllipse", { fallback: "crosshair" }),
18147
18176
  presentation: {
18148
18177
  label: "Ellipse",
18149
18178
  group: "shape",
@@ -18224,7 +18253,7 @@ function useEyedropperTool(opts) {
18224
18253
  hookName: "useEyedropperTool",
18225
18254
  keybinding,
18226
18255
  hotkey,
18227
- cursor: "crosshair",
18256
+ cursor: cursorFor("eyedropper", { fallback: "crosshair" }),
18228
18257
  presentation: {
18229
18258
  label: "Eyedropper",
18230
18259
  icon: createElement(EyedropperIcon),
@@ -18251,7 +18280,7 @@ function useLineTool() {
18251
18280
  id: "line",
18252
18281
  capabilities: ["creates-shapes"],
18253
18282
  hookName: "useLineTool",
18254
- cursor: "crosshair",
18283
+ cursor: cursorFor("crosshairLine", { fallback: "crosshair" }),
18255
18284
  presentation: {
18256
18285
  label: "Line",
18257
18286
  group: "shape",
@@ -18366,7 +18395,7 @@ function usePolygonTool(options = {}) {
18366
18395
  id: "polygon",
18367
18396
  capabilities: ["creates-shapes"],
18368
18397
  hookName: "usePolygonTool",
18369
- cursor: "crosshair",
18398
+ cursor: cursorFor("crosshairPolygon", { fallback: "crosshair" }),
18370
18399
  // Registered by <ToolActionsMounter>, inside the ActionsProvider —
18371
18400
  // see `ToolDef.actions` for why the hook can't register it itself.
18372
18401
  actions: [adjustSidesAction],
@@ -18466,7 +18495,7 @@ function useStarTool(options = {}) {
18466
18495
  id: "star",
18467
18496
  capabilities: ["creates-shapes"],
18468
18497
  hookName: "useStarTool",
18469
- cursor: "crosshair",
18498
+ cursor: cursorFor("crosshairStar", { fallback: "crosshair" }),
18470
18499
  // Registered by <ToolActionsMounter>, inside the ActionsProvider —
18471
18500
  // see `ToolDef.actions` for why the hook can't register it itself.
18472
18501
  actions: [adjustPointsAction],
@@ -18522,7 +18551,7 @@ function usePencilTool() {
18522
18551
  id: "pencil",
18523
18552
  capabilities: ["creates-paths"],
18524
18553
  hookName: "usePencilTool",
18525
- cursor: "crosshair",
18554
+ cursor: cursorFor("pencil", { fallback: "crosshair" }),
18526
18555
  presentation: {
18527
18556
  label: "Pencil",
18528
18557
  group: "draw",
@@ -19593,6 +19622,113 @@ function buildSceneTree(adapter, drawOne, view, forLayer, derivedPathOf) {
19593
19622
  }
19594
19623
  return out;
19595
19624
  }
19625
+
19626
+ // src/features/cursor/paintedCursorState.ts
19627
+ function same(a, b) {
19628
+ if (a === b) return true;
19629
+ if (!a || !b) return false;
19630
+ return a.glyph === b.glyph && a.angle === b.angle && a.size === b.size && a.worldRadius === b.worldRadius;
19631
+ }
19632
+ function createPaintedCursorState() {
19633
+ let base = null;
19634
+ let override = null;
19635
+ let at = null;
19636
+ const subs = /* @__PURE__ */ new Set();
19637
+ const notify2 = () => {
19638
+ for (const fn of subs) fn();
19639
+ };
19640
+ return {
19641
+ setBase(cursor) {
19642
+ if (same(base, cursor)) return;
19643
+ base = cursor;
19644
+ notify2();
19645
+ },
19646
+ setOverride(cursor) {
19647
+ if (same(override, cursor)) return;
19648
+ override = cursor;
19649
+ notify2();
19650
+ },
19651
+ setPointer(x, y) {
19652
+ if (at && at.x === x && at.y === y) return;
19653
+ at = { x, y };
19654
+ if (override ?? base) notify2();
19655
+ },
19656
+ clearPointer() {
19657
+ if (at === null) return;
19658
+ at = null;
19659
+ notify2();
19660
+ },
19661
+ active() {
19662
+ return (override ?? base) !== null;
19663
+ },
19664
+ current() {
19665
+ const cursor = override ?? base;
19666
+ if (!cursor || !at) return null;
19667
+ return { cursor, at };
19668
+ },
19669
+ subscribe(fn) {
19670
+ subs.add(fn);
19671
+ return () => {
19672
+ subs.delete(fn);
19673
+ };
19674
+ }
19675
+ };
19676
+ }
19677
+ var PAINTED_CURSOR_LAYER_ID = "painted-cursor";
19678
+ var pathCache = /* @__PURE__ */ new Map();
19679
+ function pathFor(d) {
19680
+ let p = pathCache.get(d);
19681
+ if (p === void 0) {
19682
+ p = pathFromD(d);
19683
+ pathCache.set(d, p);
19684
+ }
19685
+ return p;
19686
+ }
19687
+ function commandFor2(op) {
19688
+ return {
19689
+ kind: "path",
19690
+ path: pathFor(op.d),
19691
+ ...op.fill !== void 0 ? { fill: { color: op.fill } } : {},
19692
+ ...op.stroke !== void 0 ? {
19693
+ stroke: {
19694
+ paint: { color: op.stroke.color },
19695
+ width: op.stroke.width,
19696
+ cap: "round",
19697
+ join: "round"
19698
+ }
19699
+ } : {}
19700
+ };
19701
+ }
19702
+ function createPaintedCursorLayer(state) {
19703
+ return {
19704
+ id: PAINTED_CURSOR_LAYER_ID,
19705
+ label: "Painted cursor",
19706
+ space: "screen",
19707
+ draw: (_data, view) => {
19708
+ const frame = state.current();
19709
+ if (!frame) return [];
19710
+ const { cursor, at } = frame;
19711
+ const glyph = GLYPHS[cursor.glyph];
19712
+ if (!glyph) return [];
19713
+ const scale2 = (view.scale.x + view.scale.y) / 2;
19714
+ const worldSized = cursor.worldRadius !== void 0;
19715
+ const size = worldSized ? cursorWorldSize(glyph, cursor.worldRadius, scale2) : cursor.size ?? 24;
19716
+ if (!(size > 0) || !Number.isFinite(size)) return [];
19717
+ const ops = cursorPaintOps(
19718
+ glyph,
19719
+ worldSized ? { lineWidthScale: chromeLineWidthScale(glyph, size) } : {}
19720
+ );
19721
+ const [a, b, c, d, e, f] = cursorPaintMatrix(glyph, {
19722
+ size,
19723
+ angle: cursor.angle,
19724
+ at
19725
+ });
19726
+ const transform = new Float32Array([a, b, 0, c, d, 0, e, f, 1]);
19727
+ const children = ops.map(commandFor2);
19728
+ return [{ kind: "group", transform, children }];
19729
+ }
19730
+ };
19731
+ }
19596
19732
  function mat3ToRenderMatrix(m) {
19597
19733
  return new Float32Array([m[0], m[1], 0, m[2], m[3], 0, m[4], m[5], 1]);
19598
19734
  }
@@ -19973,11 +20109,11 @@ function resolveToolsCursor(tools, ctxBase) {
19973
20109
  const id = tools.hotkeyEngaged ?? tools.active;
19974
20110
  const tool = tools.registry[id];
19975
20111
  if (!tool?.cursor) return void 0;
19976
- if (typeof tool.cursor === "string") return tool.cursor;
20112
+ if (typeof tool.cursor !== "function") return resolveCursorTier(tool.cursor);
19977
20113
  if (!ctxBase) return void 0;
19978
20114
  try {
19979
20115
  const base = ctxBase();
19980
- return tool.cursor({ ...base, scratch: null });
20116
+ return resolveCursorTier(tool.cursor({ ...base, scratch: null }));
19981
20117
  } catch {
19982
20118
  return void 0;
19983
20119
  }
@@ -20142,6 +20278,14 @@ function CanvasInner(props, ref) {
20142
20278
  viewSubsRef.current.delete(fn);
20143
20279
  };
20144
20280
  }, []);
20281
+ const paintedCursor = useMemo(() => createPaintedCursorState(), []);
20282
+ const paintedCursorLayer = useMemo(
20283
+ () => createPaintedCursorLayer(paintedCursor),
20284
+ [paintedCursor]
20285
+ );
20286
+ useEffect(() => paintedCursor.subscribe(() => {
20287
+ requestRedraw();
20288
+ }), [paintedCursor, requestRedraw]);
20145
20289
  useImperativeHandle(ref, () => ({
20146
20290
  // Named rather than read off `canvasRef` so the handle rebuilds when a
20147
20291
  // detached surface's input element arrives, which is a render later.
@@ -20154,7 +20298,8 @@ function CanvasInner(props, ref) {
20154
20298
  getView,
20155
20299
  setView,
20156
20300
  subscribeView,
20157
- getPaintedVersion
20301
+ getPaintedVersion,
20302
+ paintedCursor
20158
20303
  }), [
20159
20304
  canvasRef,
20160
20305
  ownCanvasRef,
@@ -20168,7 +20313,8 @@ function CanvasInner(props, ref) {
20168
20313
  getView,
20169
20314
  setView,
20170
20315
  subscribeView,
20171
- getPaintedVersion
20316
+ getPaintedVersion,
20317
+ paintedCursor
20172
20318
  ]);
20173
20319
  const glRendererRef = useRef(null);
20174
20320
  const layerCacheRef = useRef(/* @__PURE__ */ new Map());
@@ -20432,8 +20578,16 @@ function CanvasInner(props, ref) {
20432
20578
  const layersWithDebug = useMemo(() => {
20433
20579
  const withViews = viewRegistry ? [...layers, ...viewRegistry.list().map((r) => r.layer)] : layers;
20434
20580
  const base = debugSink && resolvedDebugConfig ? [...withViews, createDebugOverlayLayer({ sink: debugSink, config: resolvedDebugConfig })] : withViews;
20435
- return [...base, ...extrasRef.current];
20436
- }, [layers, debugSink, resolvedDebugConfig, extrasVersion, viewRegistry, viewRegistryVersion]);
20581
+ return [...base, ...extrasRef.current, paintedCursorLayer];
20582
+ }, [
20583
+ layers,
20584
+ debugSink,
20585
+ resolvedDebugConfig,
20586
+ extrasVersion,
20587
+ viewRegistry,
20588
+ viewRegistryVersion,
20589
+ paintedCursorLayer
20590
+ ]);
20437
20591
  const shaderIdKey = shaders?.map((h) => h.id).join("|") ?? "";
20438
20592
  const paintInputsRef = useRef({
20439
20593
  layers: layersWithDebug,
@@ -20555,8 +20709,14 @@ function CanvasInner(props, ref) {
20555
20709
  if (!renderer) return;
20556
20710
  registerShadersOnRenderer(renderer, shaders);
20557
20711
  }, [shaderIdKey]);
20558
- const toolsCursor = tools ? resolveToolsCursor(tools, toolsCtxBase) : void 0;
20712
+ const toolsCursorTier = tools ? resolveToolsCursor(tools, toolsCtxBase) : void 0;
20713
+ const toolsCursor = toolsCursorTier === void 0 ? void 0 : toolsCursorTier.kind === "css" ? toolsCursorTier.css : "none";
20559
20714
  const effectiveStyle = toolsCursor ? { ...style, cursor: toolsCursor } : style;
20715
+ const toolsPainted = toolsCursorTier?.kind === "painted" ? toolsCursorTier : null;
20716
+ const toolsPaintedKey = toolsPainted ? `${toolsPainted.glyph}|${toolsPainted.angle}|${toolsPainted.size}|${toolsPainted.worldRadius}` : "";
20717
+ useEffect(() => {
20718
+ paintedCursor.setBase(toolsPainted);
20719
+ }, [paintedCursor, toolsPaintedKey]);
20560
20720
  const layersForMoveRef = useRef(layersWithDebug);
20561
20721
  layersForMoveRef.current = layersWithDebug;
20562
20722
  useEffect(() => {
@@ -21895,10 +22055,16 @@ function createCornerResizeAffordance(opts = {}) {
21895
22055
  hitKind: c.kind,
21896
22056
  // Diagonal by fixed-corner parity: a matched-axis anchor (min-min /
21897
22057
  // max-max fixed) means the dragged corner sits on the ↘ diagonal;
21898
- // mixed axes sit on the ↗ diagonal. Not rotation-aware — a rotated
21899
- // target keeps the unrotated hint, the same policy as every
21900
- // mainstream editor short of Figma.
21901
- cursor: c.anchor.x === c.anchor.y ? "nwse-resize" : "nesw-resize",
22058
+ // mixed axes sit on the ↗ diagonal. The glyph is horizontal at angle
22059
+ // 0, so the diagonal is a half-quarter-turn either way, plus the
22060
+ // target's own rotation. The keyword is the fallback rather than the
22061
+ // answer: CSS has four of them, which cannot express a target
22062
+ // rotated to anything but a multiple of 45°.
22063
+ cursor: {
22064
+ glyph: "resize",
22065
+ angle: (c.anchor.x === c.anchor.y ? Math.PI / 4 : -Math.PI / 4) + angleOf(xf),
22066
+ fallback: c.anchor.x === c.anchor.y ? "nwse-resize" : "nesw-resize"
22067
+ },
21902
22068
  bind: () => ({
21903
22069
  initialScratch: {
21904
22070
  anchor: c.anchor,
@@ -25921,6 +26087,10 @@ function GestureDispatcherMounter({
25921
26087
  const requestRedraw = useCallback(() => {
25922
26088
  canvasApiRef?.current?.requestRedraw?.();
25923
26089
  }, [canvasApiRef]);
26090
+ const paintedCursor = useCallback(
26091
+ () => canvasApiRef?.current?.paintedCursor,
26092
+ [canvasApiRef]
26093
+ );
25924
26094
  const views = useMemo(() => {
25925
26095
  if (!viewRegistry) return void 0;
25926
26096
  return {
@@ -25939,6 +26109,7 @@ function GestureDispatcherMounter({
25939
26109
  dispatcher,
25940
26110
  clientToWorld: clientToWorld2,
25941
26111
  requestRedraw,
26112
+ paintedCursor,
25942
26113
  getRuleCtx,
25943
26114
  onDoubleClick,
25944
26115
  ...views ? { views } : {}
@@ -30685,6 +30856,6 @@ function mergeContributions(...bundles) {
30685
30856
  return out;
30686
30857
  }
30687
30858
 
30688
- export { ALWAYS, ANCHOR_HIT_BASE_PX, ActionsProviderIfRoot, ActiveToolContextProvider, ActiveToolContextProviderIfRoot, ArrowIcon, BUILTIN_MARKERS, BUNDLE_TOOLS, COARSE_TARGET_SCALE, CURVE_REPS, CanvasView, ColorOverrideRegistry, CropIcon, CursorCoordsHud, DEFAULT_ALPHA_DECAY, DEFAULT_ALPHA_MIN, DEFAULT_DEBUG_STROKES, DEFAULT_DEBUG_THEME, DEFAULT_DEVICE_PROFILE, DEFAULT_FILL_COLOR, DEFAULT_HANDLE_SIZE2 as DEFAULT_HANDLE_SIZE, DEFAULT_MAX_ZOOM, DEFAULT_MIN_ZOOM, DEFAULT_PALETTE, DEFAULT_ROTATION_HANDLE_DISTANCE, DEFAULT_SHAPE_FILL, DEFAULT_STROKE_COLOR, DEFAULT_VELOCITY_DECAY, DepRegistryProviderIfRoot, DeviceProfileProvider, DivideIcon, EASINGS, EllipseIcon, ExcludeIcon, EyedropperIcon, FALLBACK_FIT_VIEW, GHOST_STROKE, HANDLE_BASE_PX, HandIcon, IDENTITY_COLOR_MATRIX, IDENTITY_JOINT, IDENTITY_POSE_COMPOSITION, ImageIcon, IntersectIcon, KIT_SHAPE_KINDS, LassoIcon, LineIcon, MIXED, MOVE_ANCHORS, MinimapCanvas, NEVER, OUTLINE_MIN_SCREEN_PX, PATH_ANCHOR_CHROME_ID, PenIcon, PencilIcon, PickHud, PointerProviderIfRoot, PolygonIcon, RECT_ALIGN_PROJECTION, ROTATION_HANDLE_BASE_PX, RectIcon, SPRING_PRESETS, SceneCanvas, SceneViewCanvas, SelectIcon, SelectionContextProvider, SelectionContextProviderIfRoot, ShaderCompileError, StarIcon, SubtractIcon, TOOL_PREF_KINDS, TextIcon, UnionIcon, UnknownIcon, VERSION, VIEW_ANIMATION_KEY, WeaselProvider, WeaselRenderer, _resetMarkersForTests, _resetPaintKindsForTests, aabbCenter, actionIs, actionShortcuts, alignDeltaFor, alignInsertBehavior, alignMoveBehavior, alignResizeBehavior, always, and, animateLifecycle, animateOnSetPose, annulusSemiAxes, applyBooleanOp, applyStyleToRange, areaSelectAction, arrayAdapter, asNodeId, asPaint, axisAlignedBounds, bezierCubic, bezierQuadratic, blendPoses, buildChromeCtx, buildGradientRamp, buildRuleCtx, buildSceneViewCommands, canBringForward, canHover, canSendBackward, capabilityAll, capabilityIn, capabilityIs, capabilityNot, caretIndexAt, cellAt, charOffsetToDomPosition, clampView, clearSelectionAction, clientToCanvas, clipboardCopyAction, clipboardCutAction, cloneAction, coarsePointer, composeAffordanceLayer, composePath, composeRectPose, composeSelectionPose, composeWorldPose, computeFitView, computeFitViewport, computeIndicatorCommand, computeWheelAction, cond, constrainTo45, containedThenNearest, countPathAnchors, createCellHighlightLayer, createChildrenLayer, createCornerResizeAffordance, createDebugOverlayLayer, createDebugSink, createDispatcher, createGridLayer, createGuidesLayer, createHistory2 as createHistory, createMoveToIndexOp, createNodeProperties, createNodeRouting, createParallaxLayer, createPathAnchorAffordances, createPathEditingOverlayLayer, createPathLayer, createPenPreviewLayer, createReorderOp, createRotationAffordance, createScene, createSelectionHandlesLayer, createSelectionOutlineLayer, createSelectionOverlayLayer, createSetDataOp, createSetLayerOp, createSetPathOp, createSetTextOp, createTextLayer, createViewResolver, createViewportLayer, cubicBezierEasing, cycleVertexColors, decomposePath, decomposeRectPose, defaultCommitAdapter, defaultDrawOne, defaultLabelTextRenderer, defaultNodeProperties, defaultNodeRouting, defaultVisibilityRules, defineTool, defineViewportTool, deriveAlignmentGuides, deriveParallaxView, describeRule, domPositionToCharOffset, domToRuns, drawLayers, drawOneLayer, easeIn, easeInBack, easeInBounce, easeInCirc, easeInCubic, easeInElastic, easeInExpo, easeInOut, easeInOutBack, easeInOutBounce, easeInOutCirc, easeInOutCubic, easeInOutElastic, easeInOutExpo, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInOutSine, easeInQuad, easeInQuart, easeInQuint, easeInSine, easeOut, easeOutBack, easeOutBounce, easeOutCirc, easeOutCubic, easeOutElastic, easeOutExpo, easeOutQuad, easeOutQuart, easeOutQuint, easeOutSine, editAnchorsAction, enterTextEditAction, enumerateAnchors, evaluate, fillInPoseFrame, fillToBoundsFrame, findNodeShape, findShapeInk, findShapeSilhouette, fitTextPose, fitToBounds, fitViewToBounds, fitZoom, focused, forEachCoalesced, frameRect, freeform, gateLayer, gesturing, getAlpha01, getImageBitmap, getMarker, getNodeShapes, getPaintKind, getStylusData, gradientForBounds, gradientGeometry, hexToRgba, hitAffordanceRegions, hitAnchor, hitRotationHandle, hostAnchorCss, hostAnchorRect, hovering, hoveringSelected, imageStatus, inferredNodeProperties, inferredNodeRouting, insertAction, interpolateView, isBuiltinToolPref, isEditableTarget2 as isEditableTarget, isGradientFill, isLayerPainted, isLayerVisible, isPatternSpec, keySpecShortcut, lassoSelectAction, lerpColorArray, lerpOklab, lerpOklch, linear, listMarkers, listPaintKinds, liveScope, makePinchZoomAction, makeViewportZoomAction, markerDrawCommands, markerInset, markerKeyOf, markerSites, mat3, matchAlignment, matchesKeyBinding, meanScale, mergeAlphaFromPrev, mergeContributions, modeIn, modeIs, modeNot, modifierHeld, momentum, moveAction, multiActive, nearest, nearestWithin, nestedHitTester, never, nodeHasFlag, none, normalizeHex, not, nurbs, oklabToOklch, oklabToSrgbU8, oklchToOklab, openFilePicker, or, paintAlpha, paintKindOf, paintWithAlpha, paintWithColor, parseColor, parseColorToRgba255, parseDebugFlags, pathContainsPoint, pathContainsPolygon, pathContainsRect, pathDistanceToPoint, pathDivide, pathExclude, pathFromD, pathInPoseFrame, pathInWorld, pathIntersect, pathIntersectsPolygon, pathIntersectsRect, pathOriginProjection, pathSubtract, pathToAnchors, pathUnion, pickTopMostHit, pinchZoomAction, planPixelRender, pointInRotatedRect, pointInTextPose, poseRotationOf, pressureToWidth, rainbowVertexColors, rebaseLocalPose, rectCorners, registerContentHandler, registerMarker, registerNodeShape, registerPaintKind, registerProgram, renderLabel, renderSceneToCanvas, renderSceneToPixels, resizeAction, resolveColor, resolveDeviceProfile, resolveEasing, resolveFillPattern, resolveMarkerSize, resolveParams, resolvePatternSpec, resolveSkeleton, resolveStrokeWidth, resolveVisibility, rgbaToHex, rotateAction, rotateAroundAABBCenter, rotatePathAround, rotatePoint, rotatedRectCorners, rotationDegreesUnit, rotationHandle, roundToCell, runsToDom, sampleGradientStops, sampleTrack, sceneFromJSON, sceneNodeClientRect, sceneSelectionStore, sceneToAdapter, scopeBindings, screenToWorld, selectFromLasso, selectionAtLeast, selectionEmpty, selectionIs, setFlagOverRange, shapeCoversPoint, sliceAction, snapPoint, solid, solidVertexColors, specificity, spiro, splitPathByLine, splitSubpaths, springPose, springVertexColors, srgbU8ToOklab, staggerVertexColors, startThresholdDrag, strokeInsets, strokeOf, strokeWith, styleAtRange, subscribeImageReady, tessellate, tessellateStroke, textCommand, textCommandFromRuns, tileGrid, toHex8, translatePoseViaDescriptor, translateRectPose, trimPolyline, tweenPose, tweenVertexColors, unionAABB, unionBounds, unionBoundsPath, useActiveToolContext, useAlign, useAnimator, useArrayAdapter, useAutoCenter, useBooleans, useBooleansAdapter, useCanvasFocus, useCanvasSize, useDecayLoop, useDeviceProfile, useDistribute, useDragGesture, useDragHandle, useDragRadial, useDragRect, useDropZone, useEllipseTool, useEyedropperTool, useGestureDispatcher, useGridCellHover, useGuides, useHandTool, useHandleDrag, useHostAnchor, useHoverTracking, useImageTool, useKeybindings, useLassoTool, useLineTool, useNodeOverlayFrame, useOptionalActiveToolContext, usePenTool, usePencilTool, usePinchGesture, usePinchZoomTool, usePointerStylus, usePolygonTool, usePublishSelection, useRectTool, useResizePolicy, useRotateTool, useScene, useSceneAdapter, useSceneTextEdit, useSelectTool, useSelection, useSelectionContext, useSimulation, useSliceDep, useStandardActions, useStarTool, useTextEdit, useTextTool, useTools, useVelocityTracker, useViewAnimation, useVisibleRaf, useZoom, viewToMat3, viewToTransform, viewportDragPanAction, viewportZoomAction, viewportsAt, visualBoundsViaDescriptor, when, withAlpha01, withCoord, withGradientKind, worldEditToStorage, worldPoseLookup, worldToScreen, zoomAt, zoomAtLeast };
30689
- //# sourceMappingURL=chunk-IMFXEINV.js.map
30690
- //# sourceMappingURL=chunk-IMFXEINV.js.map
30859
+ export { ALWAYS, ANCHOR_HIT_BASE_PX, ActionsProviderIfRoot, ActiveToolContextProvider, ActiveToolContextProviderIfRoot, ArrowIcon, BUILTIN_MARKERS, BUNDLE_TOOLS, COARSE_TARGET_SCALE, CURVE_REPS, CanvasView, ColorOverrideRegistry, CropIcon, CursorCoordsHud, DEFAULT_ALPHA_DECAY, DEFAULT_ALPHA_MIN, DEFAULT_DEBUG_STROKES, DEFAULT_DEBUG_THEME, DEFAULT_DEVICE_PROFILE, DEFAULT_FILL_COLOR, DEFAULT_HANDLE_SIZE2 as DEFAULT_HANDLE_SIZE, DEFAULT_MAX_ZOOM, DEFAULT_MIN_ZOOM, DEFAULT_PALETTE, DEFAULT_ROTATION_HANDLE_DISTANCE, DEFAULT_SHAPE_FILL, DEFAULT_STROKE_COLOR, DEFAULT_VELOCITY_DECAY, DepRegistryProviderIfRoot, DeviceProfileProvider, DivideIcon, EASINGS, EllipseIcon, ExcludeIcon, EyedropperIcon, FALLBACK_FIT_VIEW, GHOST_STROKE, HANDLE_BASE_PX, HandIcon, IDENTITY_COLOR_MATRIX, IDENTITY_JOINT, IDENTITY_POSE_COMPOSITION, ImageIcon, IntersectIcon, KIT_SHAPE_KINDS, LassoIcon, LineIcon, MIXED, MOVE_ANCHORS, MinimapCanvas, NEVER, OUTLINE_MIN_SCREEN_PX, PAINTED_CURSOR_LAYER_ID, PATH_ANCHOR_CHROME_ID, PenIcon, PencilIcon, PickHud, PointerProviderIfRoot, PolygonIcon, RECT_ALIGN_PROJECTION, ROTATION_HANDLE_BASE_PX, RectIcon, SPRING_PRESETS, SceneCanvas, SceneViewCanvas, SelectIcon, SelectionContextProvider, SelectionContextProviderIfRoot, ShaderCompileError, StarIcon, SubtractIcon, TOOL_PREF_KINDS, TextIcon, UnionIcon, UnknownIcon, VERSION, VIEW_ANIMATION_KEY, WeaselProvider, WeaselRenderer, _resetMarkersForTests, _resetPaintKindsForTests, aabbCenter, actionIs, actionShortcuts, alignDeltaFor, alignInsertBehavior, alignMoveBehavior, alignResizeBehavior, always, and, animateLifecycle, animateOnSetPose, annulusSemiAxes, applyBooleanOp, applyStyleToRange, areaSelectAction, arrayAdapter, asNodeId, asPaint, axisAlignedBounds, bezierCubic, bezierQuadratic, blendPoses, buildChromeCtx, buildGradientRamp, buildRuleCtx, buildSceneViewCommands, canBringForward, canHover, canSendBackward, capabilityAll, capabilityIn, capabilityIs, capabilityNot, caretIndexAt, cellAt, charOffsetToDomPosition, clampView, clearSelectionAction, clientToCanvas, clipboardCopyAction, clipboardCutAction, cloneAction, coarsePointer, composeAffordanceLayer, composePath, composeRectPose, composeSelectionPose, composeWorldPose, computeFitView, computeFitViewport, computeIndicatorCommand, computeWheelAction, cond, constrainTo45, containedThenNearest, countPathAnchors, createCellHighlightLayer, createChildrenLayer, createCornerResizeAffordance, createDebugOverlayLayer, createDebugSink, createDispatcher, createGridLayer, createGuidesLayer, createHistory2 as createHistory, createMoveToIndexOp, createNodeProperties, createNodeRouting, createPaintedCursorLayer, createPaintedCursorState, createParallaxLayer, createPathAnchorAffordances, createPathEditingOverlayLayer, createPathLayer, createPenPreviewLayer, createReorderOp, createRotationAffordance, createScene, createSelectionHandlesLayer, createSelectionOutlineLayer, createSelectionOverlayLayer, createSetDataOp, createSetLayerOp, createSetPathOp, createSetTextOp, createTextLayer, createViewResolver, createViewportLayer, cubicBezierEasing, cycleVertexColors, decomposePath, decomposeRectPose, defaultCommitAdapter, defaultDrawOne, defaultLabelTextRenderer, defaultNodeProperties, defaultNodeRouting, defaultVisibilityRules, defineTool, defineViewportTool, deriveAlignmentGuides, deriveParallaxView, describeRule, domPositionToCharOffset, domToRuns, drawLayers, drawOneLayer, easeIn, easeInBack, easeInBounce, easeInCirc, easeInCubic, easeInElastic, easeInExpo, easeInOut, easeInOutBack, easeInOutBounce, easeInOutCirc, easeInOutCubic, easeInOutElastic, easeInOutExpo, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInOutSine, easeInQuad, easeInQuart, easeInQuint, easeInSine, easeOut, easeOutBack, easeOutBounce, easeOutCirc, easeOutCubic, easeOutElastic, easeOutExpo, easeOutQuad, easeOutQuart, easeOutQuint, easeOutSine, editAnchorsAction, enterTextEditAction, enumerateAnchors, evaluate, fillInPoseFrame, fillToBoundsFrame, findNodeShape, findShapeInk, findShapeSilhouette, fitTextPose, fitToBounds, fitViewToBounds, fitZoom, focused, forEachCoalesced, frameRect, freeform, gateLayer, gesturing, getAlpha01, getImageBitmap, getMarker, getNodeShapes, getPaintKind, getStylusData, gradientForBounds, gradientGeometry, hexToRgba, hitAffordanceRegions, hitAnchor, hitRotationHandle, hostAnchorCss, hostAnchorRect, hovering, hoveringSelected, imageStatus, inferredNodeProperties, inferredNodeRouting, insertAction, interpolateView, isBuiltinToolPref, isEditableTarget2 as isEditableTarget, isGradientFill, isLayerPainted, isLayerVisible, isPatternSpec, keySpecShortcut, lassoSelectAction, lerpColorArray, lerpOklab, lerpOklch, linear, listMarkers, listPaintKinds, liveScope, makePinchZoomAction, makeViewportZoomAction, markerDrawCommands, markerInset, markerKeyOf, markerSites, mat3, matchAlignment, matchesKeyBinding, meanScale, mergeAlphaFromPrev, mergeContributions, modeIn, modeIs, modeNot, modifierHeld, momentum, moveAction, multiActive, nearest, nearestWithin, nestedHitTester, never, nodeHasFlag, none, normalizeHex, not, nurbs, oklabToOklch, oklabToSrgbU8, oklchToOklab, openFilePicker, or, paintAlpha, paintKindOf, paintWithAlpha, paintWithColor, parseColor, parseColorToRgba255, parseDebugFlags, pathContainsPoint, pathContainsPolygon, pathContainsRect, pathDistanceToPoint, pathDivide, pathExclude, pathFromD, pathInPoseFrame, pathInWorld, pathIntersect, pathIntersectsPolygon, pathIntersectsRect, pathOriginProjection, pathSubtract, pathToAnchors, pathUnion, pickTopMostHit, pinchZoomAction, planPixelRender, pointInRotatedRect, pointInTextPose, poseRotationOf, pressureToWidth, rainbowVertexColors, rebaseLocalPose, rectCorners, registerContentHandler, registerMarker, registerNodeShape, registerPaintKind, registerProgram, renderLabel, renderSceneToCanvas, renderSceneToPixels, resizeAction, resolveColor, resolveDeviceProfile, resolveEasing, resolveFillPattern, resolveMarkerSize, resolveParams, resolvePatternSpec, resolveSkeleton, resolveStrokeWidth, resolveVisibility, rgbaToHex, rotateAction, rotateAroundAABBCenter, rotatePathAround, rotatePoint, rotatedRectCorners, rotationDegreesUnit, rotationHandle, roundToCell, runsToDom, sampleGradientStops, sampleTrack, sceneFromJSON, sceneNodeClientRect, sceneSelectionStore, sceneToAdapter, scopeBindings, screenToWorld, selectFromLasso, selectionAtLeast, selectionEmpty, selectionIs, setFlagOverRange, shapeCoversPoint, sliceAction, snapPoint, solid, solidVertexColors, specificity, spiro, splitPathByLine, splitSubpaths, springPose, springVertexColors, srgbU8ToOklab, staggerVertexColors, startThresholdDrag, strokeInsets, strokeOf, strokeWith, styleAtRange, subscribeImageReady, tessellate, tessellateStroke, textCommand, textCommandFromRuns, tileGrid, toHex8, translatePoseViaDescriptor, translateRectPose, trimPolyline, tweenPose, tweenVertexColors, unionAABB, unionBounds, unionBoundsPath, useActiveToolContext, useAlign, useAnimator, useArrayAdapter, useAutoCenter, useBooleans, useBooleansAdapter, useCanvasFocus, useCanvasSize, useDecayLoop, useDeviceProfile, useDistribute, useDragGesture, useDragHandle, useDragRadial, useDragRect, useDropZone, useEllipseTool, useEyedropperTool, useGestureDispatcher, useGridCellHover, useGuides, useHandTool, useHandleDrag, useHostAnchor, useHoverTracking, useImageTool, useKeybindings, useLassoTool, useLineTool, useNodeOverlayFrame, useOptionalActiveToolContext, usePenTool, usePencilTool, usePinchGesture, usePinchZoomTool, usePointerStylus, usePolygonTool, usePublishSelection, useRectTool, useResizePolicy, useRotateTool, useScene, useSceneAdapter, useSceneTextEdit, useSelectTool, useSelection, useSelectionContext, useSimulation, useSliceDep, useStandardActions, useStarTool, useTextEdit, useTextTool, useTools, useVelocityTracker, useViewAnimation, useVisibleRaf, useZoom, viewToMat3, viewToTransform, viewportDragPanAction, viewportZoomAction, viewportsAt, visualBoundsViaDescriptor, when, withAlpha01, withCoord, withGradientKind, worldEditToStorage, worldPoseLookup, worldToScreen, zoomAt, zoomAtLeast };
30860
+ //# sourceMappingURL=chunk-HYJL7OOJ.js.map
30861
+ //# sourceMappingURL=chunk-HYJL7OOJ.js.map