@weasel-js/core 1.14.1 → 1.14.2

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 +1 @@
1
- {"version":3,"file":"session2d.js","names":[],"sources":["../../../src/domains/snap/session2d.ts"],"sourcesContent":["import { closestOnFlat, resolveSnap, type SnapCandidate } from '@weasel-js/geom/nd';\nimport type { View, Point } from '@weasel-js/geom';\nimport type { DebugSink } from '@weasel-js/routing';\nimport type { Scene } from 'core/scene/types';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport type { PlaneMap } from 'core/viewport/parallax';\nimport type { SnapBegin, SnapOutcome, SnapSession } from 'interactions/actions/snapDep';\nimport { angleAt } from './angle2d';\nimport { inputFlat } from './inputSubspace';\nimport { gatherSnapCandidates, resolvedSnapMarks, snapSourcesFor, type SnapCandidateMark } from './gather';\nimport { recordSnapCandidates } from './debugCandidates';\nimport { markFromPlane } from './marks';\nimport { createSnapOutcomeStore, type SnapOutcomeStore } from './outcomeStore';\nimport { resizedBox, resizeEdges, resizeSubject, type ResizeSubject } from './resizeBox';\nimport { screenOf } from './screen';\nimport type { SnapCollect, SnapFrame, SnapMark, SnapProbeAt, SnapSource } from './types';\n\n/** The canvas's reach when neither a source nor the kit settings name one. */\nexport const DEFAULT_SNAP_PX = 8;\n\n/** What a 2D session runs on, captured at press. */\nexport interface Session2dInputs {\n req: SnapBegin;\n /** In source order: earlier wins a full tie. */\n sources: readonly SnapSource[];\n /** At press. */\n probes: readonly SnapProbeAt[];\n /** A move's subject: its drawn box at press. */\n box?: Bounds | null;\n /** A resize's box and frame. */\n resize?: ResizeSubject | null;\n /** `id`'s drawn box now, for sources measuring the scene the way the\n * subject's box was. */\n drawnBox?: (id: string) => Bounds | undefined;\n view(): View | null;\n /** The reach of a source that sets none, in screen px. */\n reachPx: number;\n scene?: Scene<unknown, string, unknown>;\n /** `id`'s world rotation, for angle targets; undefined for a node that\n * cannot turn. */\n rotationOf?: (id: string) => number | undefined;\n /** `id`'s box frame, for sources that work in a container's axes. */\n frameOf?: (id: string) => SnapFrame | undefined;\n store: SnapOutcomeStore;\n /** Nodes that offer no targets. Default `req.ids`. */\n exclude?: readonly string[];\n /** Where each frame's candidates are recorded, cleared at `end`. */\n debug?: DebugSink;\n}\n\n/** A snap session over a 2D canvas: ctx points are world points. */\nexport function createSession2d(inputs: Session2dInputs): SnapSession {\n const { req, store } = inputs;\n const sources = snapSourcesFor(inputs.sources, req.gesture);\n const fixed = collectAtPress(inputs);\n return {\n at(p, mods) {\n const delta0 = { x: p.x - req.press.x, y: p.y - req.press.y };\n const input = inputFlat(req, mods, delta0, inputs.resize);\n if (mods.suspend) {\n store.set([]);\n inputs.debug?.clearSnap();\n return outcome(req.press, closestOnFlat(input, [delta0.x, delta0.y]), false, []);\n }\n const view = inputs.view();\n const plane = req.plane?.() ?? null;\n const subject = subjectAt(inputs, delta0);\n const candidates = collectAll(sources, inputs.probes, { ...fixed, ...subject }, { delta0, view, plane }, inputs.reachPx);\n const res = resolveSnap({\n probes: inputs.probes.map((q) => ({ id: q.id, at: [q.at.x, q.at.y], role: q.role })),\n input,\n delta0: [delta0.x, delta0.y],\n candidates,\n toScreen: screenOf(view, plane),\n });\n if (inputs.debug) recordSnapCandidates(inputs.debug, candidates, res.satisfied, inputs.probes, delta0, plane);\n const delta = { x: res.delta[0], y: res.delta[1] };\n const marks = resolvedSnapMarks(res.satisfied, delta);\n store.set(plane ? marks.map((m) => markFromPlane(m, plane)) : marks);\n return outcome(req.press, res.delta, res.members.length > 0, marks);\n },\n angle: (theta, mods) => angleAt(inputs, sources, theta, mods),\n end() {\n store.set([]);\n inputs.debug?.clearSnap();\n },\n };\n}\n\nfunction outcome(press: Point, delta: readonly number[], held: boolean, marks: readonly SnapMark[]): SnapOutcome {\n return { point: { x: press.x + delta[0], y: press.y + delta[1] }, held, marks };\n}\n\n/** What a source is told that holds from press to release. */\ntype FixedCollect = Pick<SnapCollect, 'gesture' | 'ids' | 'parent' | 'exclude' | 'drawnBox' | 'origin' | 'also' | 'scene' | 'frameOf'>;\n\n/** What changes from one frame to the next. */\ninterface Frame {\n delta0: Point;\n view: View | null;\n plane: PlaneMap | null;\n}\n\nfunction collectAtPress(inputs: Session2dInputs): FixedCollect {\n const { req } = inputs;\n return {\n gesture: req.gesture,\n ...(req.ids ? { ids: req.ids } : {}),\n ...(req.parent !== undefined ? { parent: req.parent } : {}),\n exclude: inputs.exclude ?? req.ids ?? [],\n ...(inputs.drawnBox ? { drawnBox: inputs.drawnBox } : {}),\n ...(req.origin ? { origin: req.origin } : {}),\n ...(req.also ? { also: req.also } : {}),\n ...(inputs.scene ? { scene: inputs.scene } : {}),\n ...(inputs.frameOf ? { frameOf: inputs.frameOf } : {}),\n };\n}\n\nfunction collectAll(\n sources: readonly SnapSource[], probesAtPress: readonly SnapProbeAt[],\n fixed: FixedCollect & Pick<SnapCollect, 'box' | 'edges'>, { delta0, view, plane }: Frame, reachPx: number,\n): SnapCandidate<SnapCandidateMark<Point>>[] {\n const camera = view ? Math.min(Math.abs(view.scale.x), Math.abs(view.scale.y)) : 1;\n // A camera unit is `plane.scale` plane units.\n const scale = plane ? camera / Math.max(Math.abs(plane.scale.x), Math.abs(plane.scale.y)) : camera;\n const probes = probesAtPress.map((q) => ({ ...q, at: { x: q.at.x + delta0.x, y: q.at.y + delta0.y } }));\n return gatherSnapCandidates(sources, probes, (_source, offered, sourceReach) => ({\n ...fixed, probes: offered, delta0,\n ...(plane ? { plane } : {}),\n reachWorld: (px) => px / scale,\n reachPx: sourceReach,\n }), { toVec: (p) => [p.x, p.y], reachPx, ...(fixed.origin ? { origin: fixed.origin } : {}) });\n}\n\n/** The subject's box where `delta0` puts it, and the sides that moved. */\nfunction subjectAt(\n { box, resize }: Pick<Session2dInputs, 'box' | 'resize'>, delta0: Point,\n): Pick<SnapCollect, 'box' | 'edges'> {\n if (resize) return { box: resizedBox(resize, delta0), edges: resizeEdges(resize, delta0) };\n return box ? { box: { ...box, x: box.x + delta0.x, y: box.y + delta0.y } } : {};\n}\n\n/** A session no source answers: it only holds the point to the gesture's\n * input subspace, as when a host provides no `snap` dep. */\nexport function inputSession(req: SnapBegin): SnapSession {\n return createSession2d({\n req,\n sources: [],\n probes: [],\n resize: req.gesture === 'resize' && req.handle && req.box ? resizeSubject(req.box, req.handle) : null,\n view: () => null,\n reachPx: 0,\n store: createSnapOutcomeStore(),\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"session2d.js","names":[],"sources":["../../../src/domains/snap/session2d.ts"],"sourcesContent":["import { closestOnFlat, resolveSnap, type SnapCandidate } from '@weasel-js/geom/nd';\nimport type { View, Point } from '@weasel-js/geom';\nimport type { DebugSink } from '@weasel-js/routing';\nimport type { Scene } from 'core/scene/types';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport type { PlaneMap } from 'core/viewport/parallax';\nimport type { SnapBegin, SnapOutcome, SnapSession } from 'interactions/actions/snapDep';\nimport { angleAt } from './angle2d';\nimport { inputFlat } from './inputSubspace';\nimport { gatherSnapCandidates, resolvedSnapMarks, snapSourcesFor, type SnapCandidateMark } from './gather';\nimport { recordSnapCandidates } from './debugCandidates';\nimport { markFromPlane } from './marks';\nimport { createSnapOutcomeStore, type SnapOutcomeStore } from './outcomeStore';\nimport { resizedBox, resizeSides, resizeSubject, type ResizeSubject } from './resizeBox';\nimport { screenOf } from './screen';\nimport type { SnapCollect, SnapFrame, SnapMark, SnapProbeAt, SnapSource } from './types';\n\n/** The canvas's reach when neither a source nor the kit settings name one. */\nexport const DEFAULT_SNAP_PX = 8;\n\n/** What a 2D session runs on, captured at press. */\nexport interface Session2dInputs {\n req: SnapBegin;\n /** In source order: earlier wins a full tie. */\n sources: readonly SnapSource[];\n /** At press. */\n probes: readonly SnapProbeAt[];\n /** A move's subject: its drawn box at press. */\n box?: Bounds | null;\n /** A resize's box and frame. */\n resize?: ResizeSubject | null;\n /** `id`'s drawn box now, for sources measuring the scene the way the\n * subject's box was. */\n drawnBox?: (id: string) => Bounds | undefined;\n view(): View | null;\n /** The reach of a source that sets none, in screen px. */\n reachPx: number;\n scene?: Scene<unknown, string, unknown>;\n /** `id`'s world rotation, for angle targets; undefined for a node that\n * cannot turn. */\n rotationOf?: (id: string) => number | undefined;\n /** `id`'s box frame, for sources that work in a container's axes. */\n frameOf?: (id: string) => SnapFrame | undefined;\n store: SnapOutcomeStore;\n /** Nodes that offer no targets. Default `req.ids`. */\n exclude?: readonly string[];\n /** Where each frame's candidates are recorded, cleared at `end`. */\n debug?: DebugSink;\n}\n\n/** A snap session over a 2D canvas: ctx points are world points. */\nexport function createSession2d(inputs: Session2dInputs): SnapSession {\n const { req, store } = inputs;\n const sources = snapSourcesFor(inputs.sources, req.gesture);\n const fixed = collectAtPress(inputs);\n return {\n at(p, mods) {\n const delta0 = { x: p.x - req.press.x, y: p.y - req.press.y };\n const input = inputFlat(req, mods, delta0, inputs.resize);\n if (mods.suspend) {\n store.set([]);\n inputs.debug?.clearSnap();\n return outcome(req.press, closestOnFlat(input, [delta0.x, delta0.y]), false, []);\n }\n const view = inputs.view();\n const plane = req.plane?.() ?? null;\n const subject = subjectAt(inputs, delta0);\n const candidates = collectAll(sources, inputs.probes, { ...fixed, ...subject }, { delta0, view, plane }, inputs.reachPx);\n const res = resolveSnap({\n probes: inputs.probes.map((q) => ({ id: q.id, at: [q.at.x, q.at.y], role: q.role })),\n input,\n delta0: [delta0.x, delta0.y],\n candidates,\n toScreen: screenOf(view, plane),\n });\n if (inputs.debug) recordSnapCandidates(inputs.debug, candidates, res.satisfied, inputs.probes, delta0, plane);\n const delta = { x: res.delta[0], y: res.delta[1] };\n const marks = resolvedSnapMarks(res.satisfied, delta);\n store.set(plane ? marks.map((m) => markFromPlane(m, plane)) : marks);\n return outcome(req.press, res.delta, res.members.length > 0, marks);\n },\n angle: (theta, mods) => angleAt(inputs, sources, theta, mods),\n end() {\n store.set([]);\n inputs.debug?.clearSnap();\n },\n };\n}\n\nfunction outcome(press: Point, delta: readonly number[], held: boolean, marks: readonly SnapMark[]): SnapOutcome {\n return { point: { x: press.x + delta[0], y: press.y + delta[1] }, held, marks };\n}\n\n/** What a source is told that holds from press to release. */\ntype FixedCollect = Pick<SnapCollect, 'gesture' | 'ids' | 'parent' | 'exclude' | 'drawnBox' | 'origin' | 'also' | 'scene' | 'frameOf'>;\n\n/** What changes from one frame to the next. */\ninterface Frame {\n delta0: Point;\n view: View | null;\n plane: PlaneMap | null;\n}\n\nfunction collectAtPress(inputs: Session2dInputs): FixedCollect {\n const { req } = inputs;\n return {\n gesture: req.gesture,\n ...(req.ids ? { ids: req.ids } : {}),\n ...(req.parent !== undefined ? { parent: req.parent } : {}),\n exclude: inputs.exclude ?? req.ids ?? [],\n ...(inputs.drawnBox ? { drawnBox: inputs.drawnBox } : {}),\n ...(req.origin ? { origin: req.origin } : {}),\n ...(req.also ? { also: req.also } : {}),\n ...(inputs.scene ? { scene: inputs.scene } : {}),\n ...(inputs.frameOf ? { frameOf: inputs.frameOf } : {}),\n };\n}\n\nfunction collectAll(\n sources: readonly SnapSource[], probesAtPress: readonly SnapProbeAt[],\n fixed: FixedCollect & Pick<SnapCollect, 'box' | 'sides' | 'boxAt'>, { delta0, view, plane }: Frame, reachPx: number,\n): SnapCandidate<SnapCandidateMark<Point>>[] {\n const camera = view ? Math.min(Math.abs(view.scale.x), Math.abs(view.scale.y)) : 1;\n // A camera unit is `plane.scale` plane units.\n const scale = plane ? camera / Math.max(Math.abs(plane.scale.x), Math.abs(plane.scale.y)) : camera;\n const probes = probesAtPress.map((q) => ({ ...q, at: { x: q.at.x + delta0.x, y: q.at.y + delta0.y } }));\n return gatherSnapCandidates(sources, probes, (_source, offered, sourceReach) => ({\n ...fixed, probes: offered, delta0,\n ...(plane ? { plane } : {}),\n reachWorld: (px) => px / scale,\n reachPx: sourceReach,\n }), { toVec: (p) => [p.x, p.y], reachPx, ...(fixed.origin ? { origin: fixed.origin } : {}) });\n}\n\n/** The subject's box where `delta0` puts it, the sides that move, and where\n * any other move would put it. */\nfunction subjectAt(\n { box, resize }: Pick<Session2dInputs, 'box' | 'resize'>, delta0: Point,\n): Pick<SnapCollect, 'box' | 'sides' | 'boxAt'> {\n if (resize) {\n return { box: resizedBox(resize, delta0), sides: resizeSides(resize, delta0), boxAt: (d) => resizedBox(resize, d) };\n }\n if (!box) return {};\n const boxAt = (d: Point): Bounds => ({ ...box, x: box.x + d.x, y: box.y + d.y });\n return { box: boxAt(delta0), boxAt };\n}\n\n/** A session no source answers: it only holds the point to the gesture's\n * input subspace, as when a host provides no `snap` dep. */\nexport function inputSession(req: SnapBegin): SnapSession {\n return createSession2d({\n req,\n sources: [],\n probes: [],\n resize: req.gesture === 'resize' && req.handle && req.box ? resizeSubject(req.box, req.handle) : null,\n view: () => null,\n reachPx: 0,\n store: createSnapOutcomeStore(),\n });\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,IAAa,kBAAkB;;AAiC/B,SAAgB,gBAAgB,QAAsC;CACpE,MAAM,EAAE,KAAK,UAAU;CACvB,MAAM,UAAU,eAAe,OAAO,SAAS,IAAI,OAAO;CAC1D,MAAM,QAAQ,eAAe,MAAM;CACnC,OAAO;EACL,GAAG,GAAG,MAAM;GACV,MAAM,SAAS;IAAE,GAAG,EAAE,IAAI,IAAI,MAAM;IAAG,GAAG,EAAE,IAAI,IAAI,MAAM;GAAE;GAC5D,MAAM,QAAQ,UAAU,KAAK,MAAM,QAAQ,OAAO,MAAM;GACxD,IAAI,KAAK,SAAS;IAChB,MAAM,IAAI,CAAC,CAAC;IACZ,OAAO,OAAO,UAAU;IACxB,OAAO,QAAQ,IAAI,OAAO,cAAc,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;GACjF;GACA,MAAM,OAAO,OAAO,KAAK;GACzB,MAAM,QAAQ,IAAI,QAAQ,KAAK;GAC/B,MAAM,UAAU,UAAU,QAAQ,MAAM;GACxC,MAAM,aAAa,WAAW,SAAS,OAAO,QAAQ;IAAE,GAAG;IAAO,GAAG;GAAQ,GAAG;IAAE;IAAQ;IAAM;GAAM,GAAG,OAAO,OAAO;GACvH,MAAM,MAAM,YAAY;IACtB,QAAQ,OAAO,OAAO,KAAK,OAAO;KAAE,IAAI,EAAE;KAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC;KAAG,MAAM,EAAE;IAAK,EAAE;IACnF;IACA,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B;IACA,UAAU,SAAS,MAAM,KAAK;GAChC,CAAC;GACD,IAAI,OAAO,OAAO,qBAAqB,OAAO,OAAO,YAAY,IAAI,WAAW,OAAO,QAAQ,QAAQ,KAAK;GAC5G,MAAM,QAAQ;IAAE,GAAG,IAAI,MAAM;IAAI,GAAG,IAAI,MAAM;GAAG;GACjD,MAAM,QAAQ,kBAAkB,IAAI,WAAW,KAAK;GACpD,MAAM,IAAI,QAAQ,MAAM,KAAK,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,KAAK;GACnE,OAAO,QAAQ,IAAI,OAAO,IAAI,OAAO,IAAI,QAAQ,SAAS,GAAG,KAAK;EACpE;EACA,QAAQ,OAAO,SAAS,QAAQ,QAAQ,SAAS,OAAO,IAAI;EAC5D,MAAM;GACJ,MAAM,IAAI,CAAC,CAAC;GACZ,OAAO,OAAO,UAAU;EAC1B;CACF;AACF;AAEA,SAAS,QAAQ,OAAc,OAA0B,MAAe,OAAyC;CAC/G,OAAO;EAAE,OAAO;GAAE,GAAG,MAAM,IAAI,MAAM;GAAI,GAAG,MAAM,IAAI,MAAM;EAAG;EAAG;EAAM;CAAM;AAChF;AAYA,SAAS,eAAe,QAAuC;CAC7D,MAAM,EAAE,QAAQ;CAChB,OAAO;EACL,SAAS,IAAI;EACb,GAAI,IAAI,MAAM,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC;EAClC,GAAI,IAAI,WAAW,SAAY,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;EACzD,SAAS,OAAO,WAAW,IAAI,OAAO,CAAC;EACvC,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;EACvD,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;EAC3C,GAAI,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;EACrC,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;EAC9C,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;CACtD;AACF;AAEA,SAAS,WACP,SAAgC,eAChC,OAAoE,EAAE,QAAQ,MAAM,SAAgB,SACzD;CAC3C,MAAM,SAAS,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,CAAC,GAAG,KAAK,IAAI,KAAK,MAAM,CAAC,CAAC,IAAI;CAEjF,MAAM,QAAQ,QAAQ,SAAS,KAAK,IAAI,KAAK,IAAI,MAAM,MAAM,CAAC,GAAG,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC,IAAI;CAC5F,MAAM,SAAS,cAAc,KAAK,OAAO;EAAE,GAAG;EAAG,IAAI;GAAE,GAAG,EAAE,GAAG,IAAI,OAAO;GAAG,GAAG,EAAE,GAAG,IAAI,OAAO;EAAE;CAAE,EAAE;CACtG,OAAO,qBAAqB,SAAS,SAAS,SAAS,SAAS,iBAAiB;EAC/E,GAAG;EAAO,QAAQ;EAAS;EAC3B,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;EACzB,aAAa,OAAO,KAAK;EACzB,SAAS;CACX,IAAI;EAAE,QAAQ,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;EAAG;EAAS,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;CAAG,CAAC;AAC9F;;;AAIA,SAAS,UACP,EAAE,KAAK,UAAmD,QACZ;CAC9C,IAAI,QACF,OAAO;EAAE,KAAK,WAAW,QAAQ,MAAM;EAAG,OAAO,YAAY,QAAQ,MAAM;EAAG,QAAQ,MAAM,WAAW,QAAQ,CAAC;CAAE;CAEpH,IAAI,CAAC,KAAK,OAAO,CAAC;CAClB,MAAM,SAAS,OAAsB;EAAE,GAAG;EAAK,GAAG,IAAI,IAAI,EAAE;EAAG,GAAG,IAAI,IAAI,EAAE;CAAE;CAC9E,OAAO;EAAE,KAAK,MAAM,MAAM;EAAG;CAAM;AACrC;;;AAIA,SAAgB,aAAa,KAA6B;CACxD,OAAO,gBAAgB;EACrB;EACA,SAAS,CAAC;EACV,QAAQ,CAAC;EACT,QAAQ,IAAI,YAAY,YAAY,IAAI,UAAU,IAAI,MAAM,cAAc,IAAI,KAAK,IAAI,MAAM,IAAI;EACjG,YAAY;EACZ,SAAS;EACT,OAAO,uBAAuB;CAChC,CAAC;AACH"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { D as Dims, R as RenderLayer, L as LayerHit, h as LayerDims, V as ViewAnimationOptions, a as PathEditExtension, i as ViewportDims, F as FitViewToBoundsOptions, j as RedrawSource, k as EditAnchorsParams, I as InertiaConfig, E as EditAnchorsDep, G as GestureLifecycleOptions, l as SliceDep, m as StickyStyle, A as AnchorMarkerShape, P as PathEditMark, T as TextOverflow, n as EnteredGroupApi, C as ContentHandlerEntry, o as ChromeState, p as LayerGroup, S as SnapSource, q as TransformFollower, r as GeometryProjection, s as InsertNodeFactory, t as InsertPaint, u as SvgIngestOptions, v as SceneCanvasSnap, w as Affordance, x as AffordanceRegion, y as AffordanceBinding, z as CommonAffordanceScratch, B as CreateOutlinesAdapter, J as PaintKindEntry, K as PathEditTarget, M as FinishedEditFrame, N as PathSymmetryDep, H as HandleLocks, O as BooleanOpOptions, Q as BooleansAdapter, U as BooleanOp, W as PathPaint, X as BooleanOpResult, Y as BooleanStrokes, Z as SnapMods, $ as SourceCandidate, a0 as SnapProbeAt, a1 as SnapCollect, a2 as SnapMark, b as SnapGesture, a3 as SnapDep, a4 as SnapOutcome, f as SnapOutcomeStore, a5 as SnapReadoutStyle } from './depSchema-C3BwxitB.js';
2
- export { a6 as AngleCandidate, a7 as AngleCollect, a8 as AnimateToBoundsOptions, a9 as AreaSelectDep, aa as BooleanOpPreview, ab as BooleanPreviewPiece, ac as CanDropIntoDep, ad as ClipboardDep, ae as ClipboardIngestCtx, af as CreateOutlinesResult, ag as CustomPaintContext, ah as DEFAULT_LAYER_RETAIN, ai as DecayLoopConfig, aj as DropRefusal, ak as DropVerdict, al as FinishedPathEdit, am as GEOMETRY_BOUND_DATA, an as HandleLock, ao as HitTestView, ap as IngestCtx, aq as IngestionDep, ar as InsertDep, as as InsertEnds, at as InsertExtras, au as InsertIntoDep, av as InsertLive, aw as LassoSelectDep, ax as LayerCommandCache, ay as LayerDrawFailure, az as LayerDrawSpan, aA as LayerRetainPolicy, aB as LayoutDep, aC as Locus, aD as MinSize, aE as NodeAtPointDep, aF as OutlinePathSpec, aG as PATH_OVERLAY_ROLES, aH as PaintKind, aI as PaintKindEditorProps, aJ as PaintKindFamily, aK as PaintKindLoader, aL as PanBounds, aM as PathEditDrag, aN as PathEditDragStart, aO as PathEditFinishCtx, aP as PathEditHandleMove, aQ as PathEditMarksCtx, aR as PathEditOther, aS as PathEditPart, aT as PathEditStore, aU as PathForm, aV as PathOverlay, aW as PathOverlayOptions, aX as PathOverlayStyle, aY as PathRepresentation, aZ as PathTransformFinishCtx, a_ as PoseChange, a$ as PreviewPathsDep, b0 as ResizePolicy, b1 as STICKY_DEFAULTS, b2 as SnapBegin, c as SnapConstrain, b3 as SnapEdge, b4 as SnapEdges, b5 as SnapFrame, e as SnapGeometry, b6 as SnapMarks, b7 as SnapReadoutDep, d as SnapResizeBox, g as SnapSession, b8 as SvgUnpacker, b9 as TextEditDep, ba as TextNodeData, bb as TransformPreviewNode, bc as TransientPath, bd as VIEW_ANIMATION_KEY, be as ViewAnimationApi, bf as ViewApi, bg as ViewChannel, bh as applyBooleanOp, bi as applyCreateOutlines, bj as asPaint, bk as createEnteredGroup, bl as createPathOverlay, bm as createSnapOutcomeStore, bn as depsUnchanged, bo as drawLayers, bp as drawOneLayer, bq as fitViewToBounds, br as getPaintKind, bs as isLayerPainted, bt as isLayerVisible, bu as listGradientKinds, bv as listPaintKinds, bw as minSizeOf, bx as paintKindOf, by as paintKindRegistry, bz as paintedLayers, bA as paintsLayer, bB as paletteInsertPaint, bC as pathPaintOf, bD as patternFamily, bE as previewBooleanOp, bF as refusalOf, bG as registerContentHandler, bH as registerPaintKind, bI as registerPaintKindLoader, bJ as seedTile, bK as stickyData, bL as stickyNodeFactory, bM as subscribeToSources, bN as switchGradientKind, bO as textBoxOf, bP as useDecayLoop, bQ as useEnteredGroup, bR as useViewAnimation, bS as useViewAnimationOn, bT as viewAxes, bU as withoutGeometryBoundData } from './depSchema-C3BwxitB.js';
1
+ import { D as Dims, R as RenderLayer, L as LayerHit, h as LayerDims, V as ViewAnimationOptions, a as PathEditExtension, i as ViewportDims, F as FitViewToBoundsOptions, j as RedrawSource, k as EditAnchorsParams, I as InertiaConfig, E as EditAnchorsDep, G as GestureLifecycleOptions, l as SliceDep, m as StickyStyle, A as AnchorMarkerShape, P as PathEditMark, T as TextOverflow, n as EnteredGroupApi, C as ContentHandlerEntry, o as ChromeState, p as LayerGroup, S as SnapSource, q as TransformFollower, r as GeometryProjection, s as InsertNodeFactory, t as InsertPaint, u as SvgIngestOptions, v as SceneCanvasSnap, w as Affordance, x as AffordanceRegion, y as AffordanceBinding, z as CommonAffordanceScratch, B as CreateOutlinesAdapter, J as PaintKindEntry, K as PathEditTarget, M as FinishedEditFrame, N as PathSymmetryDep, H as HandleLocks, O as BooleanOpOptions, Q as BooleansAdapter, U as BooleanOp, W as PathPaint, X as BooleanOpResult, Y as BooleanStrokes, Z as SnapMods, $ as SourceCandidate, a0 as SnapProbeAt, a1 as SnapCollect, a2 as SnapMark, b as SnapGesture, a3 as SnapDep, a4 as SnapOutcome, f as SnapOutcomeStore, a5 as SnapReadoutStyle } from './depSchema-DD9H89gX.js';
2
+ export { a6 as AngleCandidate, a7 as AngleCollect, a8 as AnimateToBoundsOptions, a9 as AreaSelectDep, aa as BooleanOpPreview, ab as BooleanPreviewPiece, ac as CanDropIntoDep, ad as ClipboardDep, ae as ClipboardIngestCtx, af as CreateOutlinesResult, ag as CustomPaintContext, ah as DEFAULT_LAYER_RETAIN, ai as DecayLoopConfig, aj as DropRefusal, ak as DropVerdict, al as FinishedPathEdit, am as GEOMETRY_BOUND_DATA, an as HandleLock, ao as HitTestView, ap as IngestCtx, aq as IngestionDep, ar as InsertDep, as as InsertEnds, at as InsertExtras, au as InsertIntoDep, av as InsertLive, aw as LassoSelectDep, ax as LayerCommandCache, ay as LayerDrawFailure, az as LayerDrawSpan, aA as LayerRetainPolicy, aB as LayoutDep, aC as Locus, aD as MinSize, aE as NodeAtPointDep, aF as OutlinePathSpec, aG as PATH_OVERLAY_ROLES, aH as PaintKind, aI as PaintKindEditorProps, aJ as PaintKindFamily, aK as PaintKindLoader, aL as PanBounds, aM as PathEditDrag, aN as PathEditDragStart, aO as PathEditFinishCtx, aP as PathEditHandleMove, aQ as PathEditMarksCtx, aR as PathEditOther, aS as PathEditPart, aT as PathEditStore, aU as PathForm, aV as PathOverlay, aW as PathOverlayOptions, aX as PathOverlayStyle, aY as PathRepresentation, aZ as PathTransformFinishCtx, a_ as PoseChange, a$ as PreviewPathsDep, b0 as ResizePolicy, b1 as STICKY_DEFAULTS, b2 as SnapBegin, c as SnapConstrain, b3 as SnapFrame, e as SnapGeometry, b4 as SnapMarks, b5 as SnapReadoutDep, d as SnapResizeBox, g as SnapSession, b6 as SnapSide, b7 as SvgUnpacker, b8 as TextEditDep, b9 as TextNodeData, ba as TransformPreviewNode, bb as TransientPath, bc as VIEW_ANIMATION_KEY, bd as ViewAnimationApi, be as ViewApi, bf as ViewChannel, bg as applyBooleanOp, bh as applyCreateOutlines, bi as asPaint, bj as createEnteredGroup, bk as createPathOverlay, bl as createSnapOutcomeStore, bm as depsUnchanged, bn as drawLayers, bo as drawOneLayer, bp as fitViewToBounds, bq as getPaintKind, br as isLayerPainted, bs as isLayerVisible, bt as listGradientKinds, bu as listPaintKinds, bv as minSizeOf, bw as paintKindOf, bx as paintKindRegistry, by as paintedLayers, bz as paintsLayer, bA as paletteInsertPaint, bB as pathPaintOf, bC as patternFamily, bD as previewBooleanOp, bE as refusalOf, bF as registerContentHandler, bG as registerPaintKind, bH as registerPaintKindLoader, bI as seedTile, bJ as stickyData, bK as stickyNodeFactory, bL as subscribeToSources, bM as switchGradientKind, bN as textBoxOf, bO as useDecayLoop, bP as useEnteredGroup, bQ as useViewAnimation, bR as useViewAnimationOn, bS as viewAxes, bT as withoutGeometryBoundData } from './depSchema-DD9H89gX.js';
3
3
  import { View, Scale2, Path, FramedBox, PolygonPath, Affine, GlMat3, Point, AnchorField, AnchorSet, PlacementAlign, Rect, PathSnapKind, PathInWorldPose, AnchorFieldValues, NumberEntry, JoinOptions, SegmentHit, PointOrigin, AnchorSymmetry, BlendPathsOptions, RunAlign, TrackSide, BendAlongPathOptions, RepeatAlongPathOptions, RoughenPathOptions, ZigzagPathOptions, PuckerBloatPathOptions, PoseLinear } from '@weasel-js/geom';
4
4
  export { AnchorField, AnchorFieldValues, AnchorPair, AverageAxis, BendAlongPathOptions, BezierEasing, BlendPathsOptions, FramedBox as Bounds, CONSTRAINT_TOLERANCE, CORNER_FIT_TOLERANCE, CORNER_KEYWORDS, ConstrainedPathEdit, ConstraintPoint, CornerFrame, CornerKeyword, CornerPiece, CornerShape, CornerShapeFrame, CornerSpec, DEFAULT_FLATTEN_TOLERANCE, EASINGS, EasingFn, EasingName, EasingSpec, ExtendToMeetOptions, JoinOptions, MeasurePathOptions, NumberEntry, OpenPathEnd, PATH_C, PATH_CMD_LENGTHS, PATH_L, PATH_M, PATH_Q, PATH_SNAP_KINDS, PATH_Z, Path, PathBlend, PathBuilder, PathConstraint, PathConstraintKind, PathCrossing, PathFillRule, PathInWorldPose, PathMeasure, PathSegment, PathSnapHit, PathSnapIndex, PathSnapKind, PathSnapQuery, PathStation, PathStop, PenAnchor, PointAlongPathOptions, PointInPathOptions, PolygonPath, PoseLinear, PoseRotation, PuckerBloatPathOptions, Rect, RectPath, RepeatAlongPathOptions, RepeatStation, ResolvedCorners, RoughenPathOptions, SPRING_PRESETS, Scale2, SegmentCrossing, SimplifyPathOptions, SmudgePathOptions, SolveConstraintsOptions, SolveConstraintsResult, SpringPreset, SpringPresetName, TrimPathOptions, TrimResult, Point as Vec2, View, ZOOM_FLOOR, ZigzagPathOptions, asPolygonPath, averageAnchorsAt, bendAlongPath, blendPaths, boundsOfPath, circlePath, composePath, constrainPathEdit, constraintAnchors, cornerAt, cornerFrameAt, cornerFrames, cornerKeywordOf, cornerShapeK, cornerShapePieces, cornerSpecAt, countPathAnchors, createPathSnapIndex, cubicBezierEasing, decomposePath, 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, ellipsePath, extendToMeet, findPathSnap, flattenCubic, flattenCubicWithArcLen, flattenQuadratic, flattenQuadraticWithArcLen, hasCorners, hasOpenSubpath, intersectSegments, isCornerShape, joinAnchorsAt, lengthenOpenEnd, linePath, linear, meanScale, measurePath, nextCornerShape, openEndRay, openPathEnds, pathAnchorPoints, pathCommandCoordCount, pathContainsPoint, pathContainsPolygon, pathContainsRect, pathCrossings, pathDistanceToPoint, pathFromD, pathInPoseFrame, pathInWorld, pathIntersectsPolygon, pathIntersectsRect, pathSegments, pathSignedArea, pathThroughPoseFrame, pathToAnchors, pathToD, pointAlongPath, pointInPath, polygonFromPoints, polylineFromPoints, poseFrameInverseOf, poseFrameOf, poseLinearOf, poseRotationOf, prepareBlend, puckerBloatPath, pxExtent, rectMarkerPath, rectPath, regularPolygonPath, remapPerAnchor, repeatAlongPath, resolveCorners, resolveCornersWithSources, resolveEasing, reversePath, rotatePathAround, roughenPath, roundRectPath, scaleDelta, scalePathToBounds, screenAngleOf, simplifyAnchorsAt, simplifyPath, smudgePath, solveConstraints, solvePathConstraints, splitByClosure, splitSubpaths, squarePath, standoff, starPath, stationsAlongPath, transformPath, translatePath, trimPathAt, unionBoundsPath, unsatisfiedConstraints, withCorner, withinPxBox, withinPxRadius, withoutCorners, worldEditToStorage, zigzagPath } from '@weasel-js/geom';
5
5
  import { a as PlaneMap, L as LayoutStrategy, R as ReflowTransition, b as LayoutDropTargetMode } from './types-A_sNJYRd.js';
@@ -9164,9 +9164,9 @@ interface StatedNodeFields {
9164
9164
  * each present only when stated, so an unstated one keeps the scene's
9165
9165
  * default, and a flag states only `true`. What a copy of a node carries over
9166
9166
  * besides its kind, layer, pose, data and functions. */
9167
- declare const statedFields: (n: StatedNodeFields & {
9167
+ declare function statedFields(n: StatedNodeFields & {
9168
9168
  kind?: string;
9169
- }) => StatedNodeFields;
9169
+ }): StatedNodeFields;
9170
9170
 
9171
9171
  /**
9172
9172
  * Reading a save from before a scene's poses composed by default. Versions 1
@@ -1,5 +1,5 @@
1
- import { E as EditAnchorsDep, P as PathEditMark, a as PathEditExtension, H as HandleLocks, S as SnapSource, b as SnapGesture, c as SnapConstrain, d as SnapResizeBox, e as SnapGeometry, f as SnapOutcomeStore, g as SnapSession } from './depSchema-C3BwxitB.js';
2
- export { _ as _resetPaintKindsForTests } from './depSchema-C3BwxitB.js';
1
+ import { E as EditAnchorsDep, P as PathEditMark, a as PathEditExtension, H as HandleLocks, S as SnapSource, b as SnapGesture, c as SnapConstrain, d as SnapResizeBox, e as SnapGeometry, f as SnapOutcomeStore, g as SnapSession } from './depSchema-DD9H89gX.js';
2
+ export { _ as _resetPaintKindsForTests } from './depSchema-DD9H89gX.js';
3
3
  export { _resetMarkersForTests } from '@weasel-js/stroke/test-seams';
4
4
  import { S as Scene } from './types-DW14eu9B.js';
5
5
  import { SelectionApi, ActionTunings, WorldPoint, ResizeAnchor } from '@weasel-js/routing';
package/dist/version.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * throwing, since nothing about version reporting should be able to break a
8
8
  * consumer's build.
9
9
  */
10
- var VERSION = "1.14.1";
10
+ var VERSION = "1.14.2";
11
11
 
12
12
  //#endregion
13
13
  export { VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weasel-js/core",
3
- "version": "1.14.1",
3
+ "version": "1.14.2",
4
4
  "description": "A 2D scene-graph engine for React, rendered on WebGL2: the scene tree, viewport math, pointer and keyboard input, layered rendering, and op-based undo.",
5
5
  "weasel": {
6
6
  "needs": ["webgl2"]
@@ -110,31 +110,31 @@
110
110
  "typecheck": "tsc --noEmit -p tsconfig.json"
111
111
  },
112
112
  "peerDependencies": {
113
- "@weasel-js/font": "1.14.1",
113
+ "@weasel-js/font": "1.14.2",
114
114
  "react": ">=18"
115
115
  },
116
116
  "dependencies": {
117
117
  "@msb235/blits": "0.12.0",
118
- "@weasel-js/animator": "1.14.1",
119
- "@weasel-js/cursor": "1.14.1",
120
- "@weasel-js/geom": "1.14.1",
121
- "@weasel-js/gestures": "1.14.1",
122
- "@weasel-js/headless": "1.14.1",
123
- "@weasel-js/history": "1.14.1",
124
- "@weasel-js/icons": "1.14.1",
125
- "@weasel-js/modes": "1.14.1",
126
- "@weasel-js/paint": "1.14.1",
127
- "@weasel-js/prefs": "1.14.1",
128
- "@weasel-js/quantity": "1.14.1",
129
- "@weasel-js/react": "1.14.1",
130
- "@weasel-js/registry": "1.14.1",
131
- "@weasel-js/renderer": "1.14.1",
132
- "@weasel-js/routing": "1.14.1",
133
- "@weasel-js/select": "1.14.1",
134
- "@weasel-js/simulation": "1.14.1",
135
- "@weasel-js/stroke": "1.14.1",
136
- "@weasel-js/text": "1.14.1",
137
- "@weasel-js/text-dom": "1.14.1",
118
+ "@weasel-js/animator": "1.14.2",
119
+ "@weasel-js/cursor": "1.14.2",
120
+ "@weasel-js/geom": "1.14.2",
121
+ "@weasel-js/gestures": "1.14.2",
122
+ "@weasel-js/headless": "1.14.2",
123
+ "@weasel-js/history": "1.14.2",
124
+ "@weasel-js/icons": "1.14.2",
125
+ "@weasel-js/modes": "1.14.2",
126
+ "@weasel-js/paint": "1.14.2",
127
+ "@weasel-js/prefs": "1.14.2",
128
+ "@weasel-js/quantity": "1.14.2",
129
+ "@weasel-js/react": "1.14.2",
130
+ "@weasel-js/registry": "1.14.2",
131
+ "@weasel-js/renderer": "1.14.2",
132
+ "@weasel-js/routing": "1.14.2",
133
+ "@weasel-js/select": "1.14.2",
134
+ "@weasel-js/simulation": "1.14.2",
135
+ "@weasel-js/stroke": "1.14.2",
136
+ "@weasel-js/text": "1.14.2",
137
+ "@weasel-js/text-dom": "1.14.2",
138
138
  "earcut": "3.2.3",
139
139
  "polygon-clipping": "^0.15.7"
140
140
  },
@@ -152,8 +152,8 @@
152
152
  "2d"
153
153
  ],
154
154
  "devDependencies": {
155
- "@weasel-js/icons-plugin": "1.14.1",
156
- "@weasel-js/modes": "1.14.1",
157
- "@weasel-js/theme": "1.14.1"
155
+ "@weasel-js/icons-plugin": "1.14.2",
156
+ "@weasel-js/modes": "1.14.2",
157
+ "@weasel-js/theme": "1.14.2"
158
158
  }
159
159
  }