@pixerate/editor 0.41.0 → 0.42.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.
@@ -138,6 +138,17 @@ interface VectorNodeBase {
138
138
  * the blend options change, and are locked (clicks select the blend group).
139
139
  */
140
140
  blendStep?: boolean;
141
+ /**
142
+ * Live path effects, applied top to bottom: each acts on every path above it (the node's own
143
+ * outline, or a group's children, then the result of the effects before it), and effects after a
144
+ * repeater act on its copies. The stored anchors and children never change.
145
+ */
146
+ effects?: VectorEffect[] | null;
147
+ /**
148
+ * As an operand of a live boolean group: how it combines with the result of the operands below
149
+ * it. Absent: the group's `liveBoolean` operation.
150
+ */
151
+ booleanOperation?: VectorBooleanOperation | null;
141
152
  }
142
153
  /** A shape made of one or more subpaths (holes and compound shapes included). */
143
154
  interface VectorPathNode extends VectorNodeBase, VectorStyle {
@@ -183,6 +194,12 @@ interface VectorGroupNode extends VectorNodeBase {
183
194
  * stacking order, and the steps between them are regenerated whenever a key changes.
184
195
  */
185
196
  blend?: VectorBlend | null;
197
+ /**
198
+ * Makes the group a live boolean: its children stay editable operands, folded bottom to top
199
+ * (each by its own `booleanOperation` or this one), and the group draws as the result in the
200
+ * bottom operand's style.
201
+ */
202
+ liveBoolean?: VectorBooleanOperation | null;
186
203
  }
187
204
  type VectorNode = VectorPathNode | VectorGroupNode;
188
205
  /** A vector drawing: an artboard and its nodes, bottom to top. */
@@ -265,6 +282,109 @@ declare const VECTOR_PATHFINDER_OPERATIONS: readonly VectorPathfinderOperation[]
265
282
  type VectorArrange = 'front' | 'forward' | 'backward' | 'back';
266
283
  /** Average: line anchors up on a horizontal line (same y), a vertical one (same x), or both. */
267
284
  type VectorAverageAxis = 'horizontal' | 'vertical' | 'both';
285
+ /**
286
+ * Live path effects (After Effects' path operators): `trim` (Trim Paths), `roundCorners`,
287
+ * `puckerBloat`, `twist`, `zigzag`, `wiggle` (Wiggle Paths), `offset` (Offset Paths), `merge`
288
+ * (Merge Paths) and `repeater`.
289
+ */
290
+ type VectorEffectType = 'trim' | 'roundCorners' | 'puckerBloat' | 'twist' | 'zigzag' | 'wiggle' | 'offset' | 'merge' | 'repeater';
291
+ declare const VECTOR_EFFECT_TYPES: readonly VectorEffectType[];
292
+ /** Merge Paths modes: a compound path (no boolean), union, the first minus the others, intersection or exclusion. */
293
+ type VectorMergeMode = 'merge' | 'add' | 'subtract' | 'intersect' | 'exclude';
294
+ declare const VECTOR_MERGE_MODES: readonly VectorMergeMode[];
295
+ /** Parameters of each effect type. Lengths are in the node's own units, angles in degrees, percentages 0–100. */
296
+ interface VectorEffectParamsMap {
297
+ trim: {
298
+ /** Start and end of the kept part, percent of the length (swapped when start > end). */
299
+ start: number;
300
+ end: number;
301
+ /** Shifts both, in degrees (360° = once round). */
302
+ offset: number;
303
+ /**
304
+ * `simultaneous`: every path trimmed by the same fractions of its own length;
305
+ * `individual`: the paths laid end to end in stacking order and trimmed as one length.
306
+ */
307
+ mode: 'simultaneous' | 'individual';
308
+ };
309
+ roundCorners: {
310
+ radius: number;
311
+ };
312
+ /** Percent, −100 (pucker: spiky) to 100 (bloat: bulging). */
313
+ puckerBloat: {
314
+ amount: number;
315
+ };
316
+ twist: {
317
+ /** Turn at the farthest point from the centre (none at the centre). */
318
+ angle: number;
319
+ /** The centre as an offset from the middle of the paths' bounds. */
320
+ center: Vec2;
321
+ };
322
+ zigzag: {
323
+ /** How far the points move to either side. */
324
+ size: number;
325
+ /** Ridges per segment. */
326
+ ridges: number;
327
+ /** Rounded waves instead of sharp zig zags. */
328
+ smooth: boolean;
329
+ };
330
+ wiggle: {
331
+ /** Largest displacement. */
332
+ size: number;
333
+ /** Points added per segment. */
334
+ detail: number;
335
+ smooth: boolean;
336
+ /** Wiggles per second. */
337
+ speed: number;
338
+ /** Percent: how much neighbouring points move together. */
339
+ correlation: number;
340
+ /** Degrees (360° = one wiggle). */
341
+ phase: number;
342
+ /** The same seed (and time) always gives the same wiggle. */
343
+ seed: number;
344
+ /** Seconds: where along the wiggle's motion it is drawn. */
345
+ time: number;
346
+ };
347
+ offset: {
348
+ /** Grows (positive) or shrinks (negative) the shapes. */
349
+ amount: number;
350
+ join: VectorLineJoin;
351
+ miterLimit: number;
352
+ /** Copies, copy i offset by `amount · (i + 1 + copyOffset)`. */
353
+ copies: number;
354
+ copyOffset: number;
355
+ };
356
+ merge: {
357
+ mode: VectorMergeMode;
358
+ };
359
+ repeater: {
360
+ /** Copies, the original included; a fraction fades the last copy. */
361
+ copies: number;
362
+ /** Shifts the copies along: copy i is transformed `i + offset` times. */
363
+ offset: number;
364
+ /** Each step: move, about `anchor` turn by `rotation` and scale by `scale` percent. */
365
+ position: Vec2;
366
+ /** Offset from the middle of the paths' bounds. */
367
+ anchor: Vec2;
368
+ rotation: number;
369
+ scale: Vec2;
370
+ /** Percent opacity of the first and last copies (in between interpolated). */
371
+ startOpacity: number;
372
+ endOpacity: number;
373
+ /** `below`: each copy draws under the one before it; `above`: over it. */
374
+ composite: 'below' | 'above';
375
+ };
376
+ }
377
+ /** One entry of an effect stack. */
378
+ type VectorEffect = {
379
+ [K in VectorEffectType]: {
380
+ /** Unique within the node. */
381
+ id: string;
382
+ type: K;
383
+ /** Disabled effects are skipped. Default true. */
384
+ enabled?: boolean;
385
+ params: VectorEffectParamsMap[K];
386
+ };
387
+ }[VectorEffectType];
268
388
  /** Identifies one segment of a path node: from anchor `segment` to the next. */
269
389
  interface VectorSegmentRef {
270
390
  nodeId: string;
@@ -295,7 +415,7 @@ declare function subpathSegment(sp: VectorSubpath, i: number): Point[];
295
415
  declare function subpathsToBezier(subpaths: readonly VectorSubpath[], options?: {
296
416
  corners?: boolean;
297
417
  }): BezierPath;
298
- /** The node's outline as Bézier commands. Groups have none. */
418
+ /** The node's outline as Bézier commands, as drawn (path effects applied). Groups have none. */
299
419
  declare function vectorNodeToBezier(node: VectorNode): BezierPath;
300
420
  /** SVG path data (`d`) of a path node or subpaths. */
301
421
  declare function vectorPathData(input: VectorPathNode | readonly VectorSubpath[], precision?: number): string;
@@ -321,8 +441,13 @@ declare function locateVectorNode(nodes: VectorNode[], id: string): {
321
441
  declare function collectPathNodes(node: VectorNode): VectorPathNode[];
322
442
  /** The node's local → parent matrix (identity when it has no `transform`). */
323
443
  declare function nodeMatrix(node: VectorNode): AffineMatrix;
324
- /** A path node's outline in the space `parent` maps to (default: its parent's space). */
325
- declare function vectorPathWorldBezier(node: VectorPathNode, parent?: AffineMatrix): BezierPath;
444
+ /**
445
+ * A path node's outline in the space `parent` maps to (default: its parent's space), as drawn:
446
+ * live corners cut and path effects applied (`{ effects: false }`: the stored path only).
447
+ */
448
+ declare function vectorPathWorldBezier(node: VectorPathNode, parent?: AffineMatrix, options?: {
449
+ effects?: boolean;
450
+ }): BezierPath;
326
451
  /**
327
452
  * Geometric bounds of a node (stroke width not included) in the space `parent` maps to —
328
453
  * by default the node's parent space, which for top-level nodes is the document. Null when
@@ -335,19 +460,27 @@ declare function unionBounds(list: readonly (VectorBounds | null | undefined)[])
335
460
  declare function boundsIntersect(a: VectorBounds, b: VectorBounds): boolean;
336
461
  /** A box from two corners in any order. */
337
462
  declare function boundsFromPoints(a: Vec2, b: Vec2): VectorBounds;
463
+ /** Options of `hitTestVectorNode`. */
464
+ interface VectorHitTestOptions {
465
+ /**
466
+ * Live groups (live booleans or groups with effects) hit by their children as stored rather
467
+ * than by what they draw: the groups being edited.
468
+ */
469
+ entered?: ReadonlySet<string>;
470
+ }
338
471
  /**
339
- * Whether `p` hits a node: inside its fill (when it has one), on its stroke as drawn (its
340
- * alignment and arrowheads respected) or within `tolerance` of either. A group is hit when
341
- * any visible child is.
472
+ * Whether `p` hits a node as drawn (path effects and live booleans applied): inside its fill
473
+ * (when it has one), on its stroke (its alignment and arrowheads respected) or within
474
+ * `tolerance` of either. A group is hit when any visible child is.
342
475
  */
343
- declare function hitTestVectorNode(node: VectorNode, p: Vec2, tolerance?: number, parent?: AffineMatrix): boolean;
476
+ declare function hitTestVectorNode(node: VectorNode, p: Vec2, tolerance?: number, parent?: AffineMatrix, options?: VectorHitTestOptions): boolean;
344
477
  /**
345
478
  * The area a path node's stroke paints (alignment, caps, joins, dashes and arrowheads
346
479
  * included), as a filled path in the space `parent` maps to. Empty without a stroke.
347
480
  */
348
481
  declare function vectorStrokeOutline(node: VectorPathNode, parent?: AffineMatrix): BezierPath;
349
482
  /** The topmost node hit by `p` (skipping hidden and locked ones), or null. */
350
- declare function hitTestVectorNodes(nodes: readonly VectorNode[], p: Vec2, tolerance?: number): VectorNode | null;
483
+ declare function hitTestVectorNodes(nodes: readonly VectorNode[], p: Vec2, tolerance?: number, options?: VectorHitTestOptions): VectorNode | null;
351
484
  interface NearestSegment {
352
485
  subpath: number;
353
486
  segment: number;
@@ -1424,10 +1557,15 @@ declare class VectorEditorController {
1424
1557
  private cursorFor;
1425
1558
  private snapshot;
1426
1559
  private restore;
1427
- /** Records the change from `before` to the current state as one undo step. */
1560
+ /**
1561
+ * Records the change from `before` to the current state as one undo step. Consecutive
1562
+ * changes with the same `merge` key (a slider drag) fold into one step.
1563
+ */
1428
1564
  private commit;
1429
- /** Runs `fn` (which updates fields) and records it as one undo step. */
1565
+ /** Runs `fn` (which updates fields) and records it as one undo step (merged by `merge` key). */
1430
1566
  private change;
1567
+ /** Ends a merged edit (a slider released): the next change starts a new undo step. */
1568
+ endMergedEdit(): void;
1431
1569
  private setDoc;
1432
1570
  private replaceNode;
1433
1571
  private freshIds;
@@ -1588,6 +1726,43 @@ declare class VectorEditorController {
1588
1726
  outlineStroke(options?: {
1589
1727
  ids?: readonly string[];
1590
1728
  }): string[];
1729
+ /** Selected (or given) nodes that can carry effects: the roots of the selection. */
1730
+ private effectTargets;
1731
+ /**
1732
+ * Adds an effect of `type` to the selected (or given) nodes, at the bottom of each stack (or
1733
+ * at `index`), with default parameters merged with `params`. A repeater's copies start one
1734
+ * shape width apart. One undo step; returns the new effect ids (one per node, in order).
1735
+ */
1736
+ addEffect(type: VectorEffectType, options?: {
1737
+ ids?: readonly string[];
1738
+ params?: Record<string, unknown>;
1739
+ index?: number;
1740
+ }): string[];
1741
+ private editEffects;
1742
+ /**
1743
+ * Turns an effect on or off and changes its parameters (unknown or invalid values are
1744
+ * ignored). With `merge` (true, or a key of your own), consecutive updates of the same effect
1745
+ * fold into one undo step, as a slider drag should; call `endMergedEdit` when it ends.
1746
+ */
1747
+ updateEffect(nodeId: string, effectId: string, patch: {
1748
+ enabled?: boolean;
1749
+ params?: Record<string, unknown>;
1750
+ }, options?: {
1751
+ merge?: boolean | string;
1752
+ }): VectorActionResult;
1753
+ /** Removes an effect from a node's stack. */
1754
+ removeEffect(nodeId: string, effectId: string): VectorActionResult;
1755
+ /** Moves an effect to position `index` of its stack (0 is applied first). */
1756
+ moveEffect(nodeId: string, effectId: string, index: number): VectorActionResult;
1757
+ /**
1758
+ * Expand Appearance: bakes the path effects and live booleans of the selected (or given)
1759
+ * nodes, and of everything inside them, into plain paths. A node keeps its id (a group when
1760
+ * it draws as several shapes); the shapes it made get new ids. Returns the ids of the expanded
1761
+ * nodes (empty when none was live).
1762
+ */
1763
+ expandAppearance(options?: {
1764
+ ids?: readonly string[];
1765
+ }): string[];
1591
1766
  rename(id: string, name: string): VectorActionResult;
1592
1767
  setVisible(id: string, visible: boolean): VectorActionResult;
1593
1768
  setLocked(id: string, locked: boolean): VectorActionResult;
@@ -1675,11 +1850,20 @@ declare class VectorEditorController {
1675
1850
  /**
1676
1851
  * Combines the selected paths (two or more) into one with a boolean operation. `subtract`
1677
1852
  * removes the upper shapes from the lowest one. The result takes the lowest shape's style
1678
- * and place.
1853
+ * and place. Shapes take part as drawn (path effects and live booleans applied).
1854
+ *
1855
+ * With `live`, the operands stay editable instead: a lone live boolean group gets the
1856
+ * operation (its operands follow it again), operands of live boolean groups get it as their
1857
+ * own, and anything else (two or more nodes with one parent) is wrapped in a new live boolean
1858
+ * group. Returns the result's (or the live group's) id, or null.
1679
1859
  */
1680
1860
  booleanOp(op: VectorBooleanOperation, options?: {
1681
1861
  ids?: readonly string[];
1862
+ live?: boolean;
1682
1863
  }): string | null;
1864
+ /** Whether stored node `rootId` holds `id` as drawn (`id` may be an expanded path inside it). */
1865
+ private holds;
1866
+ private liveBooleanOp;
1683
1867
  /** Joins the selected paths into one compound path (subpaths kept, lowest style). */
1684
1868
  combine(options?: {
1685
1869
  ids?: readonly string[];
@@ -1922,6 +2106,8 @@ declare class VectorEditorController {
1922
2106
  private hitCornerWidget;
1923
2107
  private hitAnchor;
1924
2108
  /** Deepest unlocked visible path under `p`. */
2109
+ /** Live groups being edited (selected, or holding the selection or the edited path): their children are hit as stored. */
2110
+ private enteredGroups;
1925
2111
  private hitPath;
1926
2112
  /** Endpoints of open subpaths of unlocked visible paths (pen tool resumes from them). */
1927
2113
  private openEndpoints;
@@ -1986,6 +2172,153 @@ declare function scaleFor(handle: VectorTransformHandle, b: VectorBounds, p: Vec
1986
2172
  origin: Vec2;
1987
2173
  };
1988
2174
 
2175
+ /**
2176
+ * Live appearance: path effect stacks and live boolean groups, evaluated on demand while the
2177
+ * stored anchors and children stay editable.
2178
+ *
2179
+ * `expandVectorAppearance` is the one place the effected geometry is made (cached per node
2180
+ * object, so an edit recomputes only the nodes it replaced). Rendering, hit-testing, bounds,
2181
+ * snapping, booleans, the Pathfinder, the Shape Builder and SVG export all read it, the way they
2182
+ * read live corners through `subpathsToBezier`; Expand Appearance stores it.
2183
+ *
2184
+ * Stacking follows After Effects' shape layers (effectcraft `crates/render/src/shapes.rs`): an
2185
+ * effect acts on every path above it — the node's own outline, or for a group every path of its
2186
+ * children (nested groups included, as drawn by their own effects) — in the order of the stack,
2187
+ * and effects placed after a repeater act on its copies. The result paints with the style of the
2188
+ * path each shape came from; Merge Paths and live booleans paint with the bottom one's.
2189
+ *
2190
+ * Live booleans fold their operands bottom to top, each combined with the result below it by its
2191
+ * own operation or the group's, and every prefix of the fold is cached under a rolling hash of the
2192
+ * operands it covers, so editing one operand recombines only the operands from it up; the cache
2193
+ * drops its least recently used half when full. Live groups are hit by their result except while
2194
+ * they are being edited (`vectorEnteredGroups`).
2195
+ *
2196
+ * Ported from ArtCraft (MIT OR Apache-2.0, © ArtCraft Team and contributors; see
2197
+ * THIRD_PARTY_NOTICES.md): the stacking rule of effectcraft `crates/render/src/shapes.rs`
2198
+ * (`collect()`); figcraft `crates/render/src/boolean.rs` (`fold_cached`, `PathCache`) and
2199
+ * `crates/engine/src/booleans.rs` (`operand_op`, `result_outline`); and the live-object model of
2200
+ * vectorcraft `crates/doc/src/live.rs` (`expand_live`, `expanded_group`, `subtree_has_live`).
2201
+ */
2202
+
2203
+ /** One shape of a node's appearance: a path in the node's own space, painted in `source`'s style. */
2204
+ interface VectorAppearanceShape {
2205
+ /** The path whose style paints it. */
2206
+ source: VectorPathNode;
2207
+ path: BezierPath;
2208
+ /** Opacity factor relative to the node (its own opacity not included). */
2209
+ opacity: number;
2210
+ /** Draw-order key (compared element by element). */
2211
+ order: number[];
2212
+ }
2213
+ /** Default parameters of each effect type. */
2214
+ declare const VECTOR_EFFECT_DEFAULTS: {
2215
+ readonly [K in VectorEffectType]: VectorEffectParamsMap[K];
2216
+ };
2217
+ declare const VECTOR_EFFECT_LABELS: Record<VectorEffectType, string>;
2218
+ /** How a panel edits one effect parameter. */
2219
+ type VectorEffectParamSpec = {
2220
+ key: string;
2221
+ label: string;
2222
+ kind: 'number';
2223
+ min?: number;
2224
+ max?: number;
2225
+ step: number;
2226
+ slider?: boolean;
2227
+ } | {
2228
+ key: string;
2229
+ label: string;
2230
+ kind: 'vec2';
2231
+ step: number;
2232
+ } | {
2233
+ key: string;
2234
+ label: string;
2235
+ kind: 'boolean';
2236
+ } | {
2237
+ key: string;
2238
+ label: string;
2239
+ kind: 'select';
2240
+ options: {
2241
+ value: string;
2242
+ label: string;
2243
+ }[];
2244
+ };
2245
+ /** The editable parameters of each effect type, in panel order. */
2246
+ declare const VECTOR_EFFECT_PARAM_SPECS: Record<VectorEffectType, VectorEffectParamSpec[]>;
2247
+ /**
2248
+ * Effect parameters with defaults filled in and invalid values dropped (unknown keys go too).
2249
+ * Returns null for an unknown type.
2250
+ */
2251
+ declare function normalizeVectorEffectParams<K extends VectorEffectType>(type: K, params: Record<string, unknown> | null | undefined, base?: VectorEffectParamsMap[K]): VectorEffectParamsMap[K] | null;
2252
+ /** A new effect of `type` (defaults merged with `params`), or null for an unknown type. */
2253
+ declare function createVectorEffect<K extends VectorEffectType>(type: K, id: string, params?: Partial<VectorEffectParamsMap[K]> | Record<string, unknown>): Extract<VectorEffect, {
2254
+ type: K;
2255
+ }> | null;
2256
+ /** The node's effects that take part (enabled, of a known type). */
2257
+ declare function activeVectorEffects(node: VectorNode): VectorEffect[];
2258
+ /** Whether the node itself draws differently from its stored geometry (effects or a live boolean). */
2259
+ declare function hasOwnVectorAppearance(node: VectorNode): boolean;
2260
+ /** Whether the node or anything inside it has a live appearance. */
2261
+ declare function hasVectorAppearance(node: VectorNode): boolean;
2262
+ /** A live boolean group (its children are operands). */
2263
+ declare function isVectorLiveBoolean(node: VectorNode | null | undefined): node is VectorGroupNode & {
2264
+ liveBoolean: VectorBooleanOperation;
2265
+ };
2266
+ /** How operand `child` of a live boolean group combines with the operands below it. */
2267
+ declare function vectorOperandOperation(group: VectorGroupNode, child: VectorNode): VectorBooleanOperation;
2268
+ /** How many boolean steps (one operand combined with the result below it) live booleans have computed: what a cache miss costs. */
2269
+ declare function vectorLiveBooleanSteps(): number;
2270
+ /** Empties the live boolean prefix cache. */
2271
+ declare function clearVectorLiveBooleanCache(): void;
2272
+ /** One operand of a live boolean: its outline (group space), fill rule and operation (unused for the bottom one). */
2273
+ interface VectorBooleanOperand {
2274
+ path: BezierPath;
2275
+ fillRule: VectorFillRule;
2276
+ operation: VectorBooleanOperation;
2277
+ }
2278
+ /**
2279
+ * The result of folding `operands` bottom to top, reusing the longest cached prefix: only the
2280
+ * operands above it are combined. Invalid geometry gives an empty path.
2281
+ */
2282
+ declare function foldVectorBooleanOperands(operands: readonly VectorBooleanOperand[]): BezierPath;
2283
+ /** Applies an effect stack to shapes, top to bottom (disabled effects skipped). */
2284
+ declare function applyVectorEffects(shapes: readonly VectorAppearanceShape[], effects: readonly VectorEffect[] | null | undefined): VectorAppearanceShape[];
2285
+ /**
2286
+ * What a node draws as: shapes in its own space (its `transform` and opacity not applied),
2287
+ * bottom to top, with its effects and those of everything inside it applied. Cached per node
2288
+ * object.
2289
+ */
2290
+ declare function vectorAppearanceShapes(node: VectorNode): VectorAppearanceShape[];
2291
+ /** Everything a node draws as one path in its own space (live corners cut, effects applied). */
2292
+ declare function vectorAppearanceOutline(node: VectorNode): BezierPath;
2293
+ /** What a node draws as, one plain path per shape (ids `<id>~fx<n>`, opacity relative to the node). */
2294
+ declare function vectorAppearanceNodes(node: VectorNode): VectorPathNode[];
2295
+ /**
2296
+ * The node as plain geometry: path effects and live booleans evaluated into paths (the node
2297
+ * itself when nothing inside it is live). A path keeps its id when it draws as one shape;
2298
+ * otherwise, like any live group, it becomes a group with that id holding one path per shape
2299
+ * (ids `<id>~fx<n>`). Groups without effects of their own keep their structure. Cached per node.
2300
+ */
2301
+ declare function expandVectorAppearance(node: VectorNode): VectorNode;
2302
+ /** Every node of a list expanded (the same array when nothing in it is live). */
2303
+ declare function expandVectorAppearances(nodes: readonly VectorNode[]): VectorNode[];
2304
+ /**
2305
+ * Reads effects from untrusted data (JSON, agent input): unknown types and malformed entries are
2306
+ * dropped, parameters normalized, ids made unique.
2307
+ */
2308
+ declare function sanitizeVectorEffects(value: unknown): VectorEffect[];
2309
+ /**
2310
+ * Effect parameters carried through a linear map baked into a node's geometry (scaling or
2311
+ * flipping it): offsets and positions move with it, angles turn the other way when it mirrors.
2312
+ * Lengths such as sizes and radii are kept, like stroke widths.
2313
+ */
2314
+ declare function transformVectorEffects(effects: readonly VectorEffect[], m: AffineMatrix): VectorEffect[];
2315
+ /**
2316
+ * The live groups (live booleans and groups with effects) being edited: those in `ids` and those
2317
+ * holding a node in `ids`. Their children are hit and outlined as stored instead of as drawn, so
2318
+ * each operand can be picked (figcraft `crates/engine/src/booleans.rs`, `result_outline`).
2319
+ */
2320
+ declare function vectorEnteredGroups(nodes: readonly VectorNode[], ids: readonly string[]): Set<string>;
2321
+
1989
2322
  interface VectorRenderPath {
1990
2323
  kind: 'path';
1991
2324
  id: string;
@@ -2207,6 +2540,8 @@ declare const VECTOR_BUILDER_HATCH_GAP = 6;
2207
2540
  declare function getVectorSceneRenderData(state: Pick<VectorEditorState, 'document' | 'viewport'>, options?: {
2208
2541
  idPrefix?: string;
2209
2542
  }): VectorSceneRenderData;
2543
+ /** Live groups being edited in `state` (see `vectorEnteredGroups`). */
2544
+ declare function getVectorEnteredGroups(state: Pick<VectorEditorState, 'document' | 'selection' | 'editingId'>): Set<string>;
2210
2545
  /** The editing overlay in screen pixels. Render it on top of the scene, untransformed. */
2211
2546
  declare function getVectorOverlayRenderData(state: VectorEditorState): VectorOverlayRenderData;
2212
2547
  /** What the Blend controls of a toolbar or style panel show. */
@@ -2374,6 +2709,33 @@ declare const VECTOR_EDIT_TOGGLES: readonly {
2374
2709
  label: string;
2375
2710
  title: string;
2376
2711
  }[];
2712
+ /** One effect of the listed stack, with what a panel needs to edit it. */
2713
+ interface VectorEffectsPanelItem {
2714
+ id: string;
2715
+ type: VectorEffectType;
2716
+ label: string;
2717
+ enabled: boolean;
2718
+ params: Record<string, unknown>;
2719
+ specs: readonly VectorEffectParamSpec[];
2720
+ }
2721
+ /** What an Effects panel shows for the selection. */
2722
+ interface VectorEffectsPanelData {
2723
+ /** The node whose stack is listed (when one node is selected), else null. */
2724
+ nodeId: string | null;
2725
+ /** Selected nodes an added effect goes to. */
2726
+ count: number;
2727
+ /** The listed stack, applied top to bottom. */
2728
+ effects: VectorEffectsPanelItem[];
2729
+ /** Something selected is live (Expand Appearance applies). */
2730
+ expandable: boolean;
2731
+ }
2732
+ /** Effect types in menu order, with their names. */
2733
+ declare const VECTOR_EFFECT_MENU: readonly {
2734
+ type: VectorEffectType;
2735
+ label: string;
2736
+ }[];
2737
+ /** The Effects panel of the selection, or null when nothing that takes effects is selected. */
2738
+ declare function getVectorEffectsPanel(state: Pick<VectorEditorState, 'document' | 'selection'>): VectorEffectsPanelData | null;
2377
2739
 
2378
2740
  interface VectorCommandOptions {
2379
2741
  /** Id prefix (default `vector.`); use one per editor when several are registered. */
@@ -2419,6 +2781,12 @@ interface VectorNodeListing {
2419
2781
  };
2420
2782
  /** An in-between generated by a blend (locked; changes come from its keys). */
2421
2783
  blendStep?: boolean;
2784
+ /** The node's live path effects, applied in order. */
2785
+ effects?: VectorEffect[];
2786
+ /** A live boolean group's operation (its children are the operands). */
2787
+ liveBoolean?: VectorBooleanOperation;
2788
+ /** An operand's own operation in a live boolean group. */
2789
+ booleanOperation?: VectorBooleanOperation;
2422
2790
  }
2423
2791
  /**
2424
2792
  * Palette and agent commands for a vector editor: list, select, add shapes and paths, style,
@@ -2756,10 +3124,13 @@ interface VectorPathEntry {
2756
3124
  }
2757
3125
  /**
2758
3126
  * The path nodes inside `roots` (or every node when `roots` is null), bottom to top, with their
2759
- * parent matrices. Hidden nodes are skipped, and locked ones unless `locked` is true.
3127
+ * parent matrices. Hidden nodes are skipped, and locked ones unless `locked` is true. Live nodes
3128
+ * (path effects, live booleans) take part as drawn (`expandVectorAppearance`: their entries are
3129
+ * the expanded paths, whose ids may not be in the document) unless `expand` is false.
2760
3130
  */
2761
3131
  declare function vectorPathEntries(doc: VectorDocument, roots: readonly string[] | null, options?: {
2762
3132
  locked?: boolean;
3133
+ expand?: boolean;
2763
3134
  }): VectorPathEntry[];
2764
3135
  /** Whether a subpath, closed, encloses an area (rather than retracing itself). */
2765
3136
  declare function subpathEnclosesArea(sp: VectorSubpath): boolean;
@@ -3115,4 +3486,79 @@ declare function expandVectorBlend(group: VectorGroupNode, newId: () => string):
3115
3486
  */
3116
3487
  declare function releaseVectorBlend(group: VectorGroupNode, newId: () => string): VectorNode[];
3117
3488
 
3118
- export { type AddVectorNodeOptions, AffineMatrix, DEFAULT_VECTOR_BLEND_DISTANCE, DEFAULT_VECTOR_BLEND_STEPS, DEFAULT_VECTOR_PATH_EDIT, DEFAULT_VECTOR_SNAP, IDENTITY_MATRIX, KAPPA, LazyMouse, type NearestSegment, type RecognizeInkOptions, SvgGradientDef, VECTOR_ARROWHEADS, VECTOR_ARROWHEAD_LABELS, VECTOR_BLEND_MAX_SMOOTH_STEPS, VECTOR_BLEND_MAX_STEPS, VECTOR_BLEND_SPACINGS, VECTOR_BLEND_SPACING_LABELS, VECTOR_BUILDER_HATCH_GAP, VECTOR_CLIPBOARD_TYPE, VECTOR_CONSTRUCTION_ANGLES, VECTOR_CORNER_KINDS, VECTOR_CORNER_KIND_LABELS, VECTOR_CORNER_WIDGET_INSET, VECTOR_EDIT_TOGGLES, VECTOR_FILL_GAP, VECTOR_INK_MAX_CORNERS, VECTOR_OVERLAY_THEME, VECTOR_PATHFINDER_ACTIONS, VECTOR_PATHFINDER_LABELS, VECTOR_PATHFINDER_OPERATIONS, VECTOR_PATH_ACTIONS, VECTOR_PENCIL_STRING_PX, VECTOR_PRESSURE_NOMINAL, VECTOR_ROTATE_HANDLE_OFFSET, VECTOR_STROKE_ALIGN_LABELS, VECTOR_STYLE_KEYS, VECTOR_TOOLS, VECTOR_TOOL_GLYPHS, VECTOR_TOOL_SHORTCUTS, VECTOR_TRANSFORM_HANDLES, VECTOR_WIDTH_PRESETS, VECTOR_WIDTH_PRESET_IDS, VECTOR_WIDTH_PROFILE_MAX_POINTS, VECTOR_WIDTH_PROFILE_MAX_SCALE, VECTOR_WIDTH_SAME_T, type VariableStrokeOptions, type Vec2, type VectorActionResult, type VectorAlign, type VectorAnchor, type VectorAnchorRef, type VectorAnchorType, type VectorArrange, type VectorArrowAlign, type VectorArrowhead, type VectorArrowheadShape, type VectorAverageAxis, type VectorBlend, type VectorBlendControls, type VectorBlendInput, type VectorBlendOptions, type VectorBlendRail, type VectorBlendSpacing, type VectorBlendStart, type VectorBooleanOperation, type VectorBounds, type VectorBuilderHit, type VectorBuilderLinePiece, type VectorBuilderPreview, type VectorBuilderReplacement, type VectorBuilderTouched, type VectorCommandOptions, type VectorCorner, type VectorCornerInfo, type VectorCornerKind, type VectorCornerWidget, type VectorDefaults, type VectorDistribute, type VectorDocument, VectorEditorController, type VectorEditorOptions, type VectorEditorState, type VectorFillRule, type VectorGroupNode, type VectorGuideKind, type VectorGuideLabel, type VectorGuideLine, type VectorHandleRef, type VectorHover, type VectorInkShape, type VectorInteraction, type VectorKeyInput, type VectorLineCap, type VectorLineJoin, type VectorMatrix, type VectorModifiers, type VectorMorph, type VectorMorphContour, type VectorMorphCorrespondence, type VectorMorphOptions, type VectorNode, type VectorNodeListing, type VectorOverlayRenderData, type VectorPaint, type VectorPathAction, type VectorPathEditOptions, type VectorPathEntry, type VectorPathKeyframe, type VectorPathNode, type VectorPathfinderAction, type VectorPathfinderOperation, type VectorPathfinderPaint, type VectorPointSnap, type VectorPointerInput, type VectorRectSnap, type VectorRenderAnchor, type VectorRenderCornerWidget, type VectorRenderGroup, type VectorRenderGuideLabel, type VectorRenderGuideLine, type VectorRenderHandle, type VectorRenderNode, type VectorRenderPath, type VectorRenderStrokeParts, type VectorRenderWidthPoint, type VectorScaleSnap, type VectorSceneRenderData, type VectorSegmentRef, type VectorSelectionBoxGeometry, type VectorSelectionFrame, type VectorSelectionStyle, type VectorShapeBuilderFace, type VectorShapeBuilderMap, type VectorShapeBuilderPlan, type VectorShapeBuilderResult, type VectorShapeInput, type VectorSnapGuides, type VectorSnapKind, type VectorSnapLeave, type VectorSnapOptions, VectorSnapTargets, type VectorStrokeAlign, type VectorStrokeParts, type VectorStrokeSpot, type VectorStyle, type VectorSubpath, type VectorSvgExportOptions, type VectorSvgImportOptions, type VectorTaperOptions, type VectorTool, type VectorTransformHandle, type VectorViewport, type VectorWaveOptions, type VectorWidthHandle, type VectorWidthPoint, type VectorWidthPointEdit, type VectorWidthPointRef, type VectorWidthPreset, type VectorWidthPresetInfo, addBuilderHit, applyMatrix, applyMatrixLinear, applyVectorBlendOptions, applyVectorCornersAttribute, arrowheadInset, arrowheadPath, arrowheadWeight, bendSegment, bezierToSubpaths, boundsFromPoints, boundsIntersect, cloneAnchor, cloneSubpath, cloneVectorDocument, cloneVectorNode, collectPathNodes, constrainToLeave, convertAnchor, cornerBisectorPoint, cornerRadiusChange, cornerSetback, correspondMorphContours, createVectorCommands, createVectorMorph, curvatureMoveAnchor, cutSubpathAt, dashIntervals, decomposeRigid, effectiveStrokeAlign, ellipseSubpath, eraseFromFill, eraseFromOutline, eraserRegion, evaluateVectorPathKeyframes, expandVectorBlend, expandVectorCorners, expandVectorCornersOf, findVectorNode, fitCornerRadius, generateVectorBlendChildren, generateWidthProfile, getAnchor, getAnchorWorld, getEditablePathIds, getTransformHandlePositions, getVectorBlendControls, getVectorCornerWidgets, getVectorOverlayRenderData, getVectorSceneRenderData, getVectorSelectionBoxGeometry, getVectorSelectionFrame, getVectorSelectionStyle, getVectorWidthHandles, getVisibleAnchors, getVisibleHandles, hasPaint, hasStrokeExtras, hasVectorCorners, hitTestVectorNode, hitTestVectorNodes, hitTestVectorStroke, inferAnchorType, insertAnchor, insertWidthPoint, interpolateMorphContours, interpolateRigidMatrix, interpolateVectorColor, interpolateVectorPaint, interpolateVectorPaths, interpolateVectorStyle, interpolateWidthProfiles, invertMatrix, isClosedBezierShape, isIdentityMatrix, isUniformWidthProfile, isVectorBlendGroup, isVectorTextTarget, joinSubpaths, knifePath, lineSubpath, locateVectorNode, matrixRotation, mirrorWidthProfile, morphContourToSubpath, morphPathsCross, moveAnchorHandle, multiplyMatrices, nearestSegment, nearestStrokePosition, nextVectorCornerKind, nodeMatrix, parseSvgTransform, parseVectorSvg, planShapeBuilder, polygonSubpath, polylineBounds, pressureWidthProfile, recognizeInkShape, rectSubpath, refineMorphContour, refreshVectorBlends, releaseVectorBlend, removeAnchorKeepingShape, removeAnchors, removeAnchorsKeepingShape, removeRedundantPoints, removeWidthPoints, resampleGradientStops, resolveVectorBlendOptions, reverseMorphContour, reverseSubpath, reverseWidthProfile, rotateMatrix, roundSubpaths, samplePolyline, sanitizeWidthProfile, scaleFor, scaleMatrix, setAnchorCorner, setSubpathCorners, setWidthPoint, simplifyPolyline, smoothSubpath, splitIntoFaces, splitSubpathAt, starSubpath, strokePositionPoint, strokeWidthProfileOf, subpathEnclosesArea, subpathPointAt, subpathSegment, subpathSegmentCount, subpathToMorphContour, subpathsToBezier, taperWaveFactor, toVectorKeyInput, toVectorModifiers, toVectorPointerInput, transformVectorNode, translateAnchor, translateMatrix, turnMorphContour, unionBounds, variableStrokeOutline, variableStrokeRings, vectorBlendColorDistance, vectorBlendKeyTargets, vectorBlendKeys, vectorBlendRail, vectorBlendRailAt, vectorBlendSpine, vectorBlendStepCount, vectorBuilderErasedEdges, vectorCornerAt, vectorCorners, vectorCornersAttribute, vectorDiamondPath, vectorDocumentToSvg, vectorFillMap, vectorInkShapeName, vectorNodeBounds, vectorNodeRotation, vectorNodeToBezier, vectorPaintToHex, vectorPaintToSvg, vectorParentMatrix, vectorPathData, vectorPathEntries, vectorPathWorldBezier, vectorPathfinderShape, vectorResizeCursor, vectorResultStyle, vectorShapeBuilderHit, vectorShapeBuilderMap, vectorStrokeLineArea, vectorStrokeOutline, vectorStrokeOutlinePath, vectorStrokeParts, vectorStrokeReach, vectorStrokeSvgParts, vectorStrokeWidthGeometry, vectorToolLabel, vectorWorldMatrix, walkVectorNodes, widthProfileAt, widthProfileFromAttribute, widthProfileMaxScale, widthProfilePreset, widthProfilePresetId, widthProfileToAttribute };
3489
+ /** Total arc length of a path (closing lines included). */
3490
+ declare function effectPathLength(path: BezierPath): number;
3491
+ /** Number of on-curve points of a path (a closed subpath's start counted once). */
3492
+ declare function effectPathVertexCount(path: BezierPath): number;
3493
+ /** The fractions of the length a trim keeps, or null when it keeps everything. */
3494
+ declare function trimIntervals(start: number, end: number, offsetDegrees: number): [number, number][] | null;
3495
+ /**
3496
+ * Trim Paths, simultaneously: every path is trimmed by the same fractions of its own length.
3497
+ * `start` / `end` in percent, `offset` in degrees. Paths trimmed away entirely come back empty.
3498
+ */
3499
+ declare function trimPaths(paths: readonly BezierPath[], start: number, end: number, offsetDegrees?: number): BezierPath[];
3500
+ /**
3501
+ * Trim Paths, individually: the paths are laid end to end in stacking order and trimmed as one
3502
+ * length, so they draw on one after another.
3503
+ */
3504
+ declare function trimPathsIndividually(paths: readonly BezierPath[], start: number, end: number, offsetDegrees?: number): BezierPath[];
3505
+ /**
3506
+ * Pucker & Bloat (`amount` in percent, −100 to 100). Positive (bloat) moves the points towards
3507
+ * the mean of a path's points and pushes the handles away from it, so the segments bulge
3508
+ * outwards; negative (pucker) does the opposite, giving spiky shapes.
3509
+ */
3510
+ declare function puckerBloatPaths(paths: readonly BezierPath[], amount: number): BezierPath[];
3511
+ /**
3512
+ * Round Corners: every corner (where the direction jumps) gets a circular arc of `radius`,
3513
+ * shrunk to fit where the sides are short. Smooth points and the ends of open paths are kept.
3514
+ */
3515
+ declare function roundCornerPaths(paths: readonly BezierPath[], radius: number): BezierPath[];
3516
+ /**
3517
+ * Offset Paths: grows (positive `amount`) or shrinks (negative) every path with the given join.
3518
+ * `copies` copies are made, copy i offset by `amount · (i + 1 + copyOffset)`, all in one path.
3519
+ */
3520
+ declare function offsetPaths(paths: readonly BezierPath[], amount: number, join?: VectorLineJoin, miterLimit?: number, copies?: number, copyOffset?: number): BezierPath[];
3521
+ /**
3522
+ * Twist: turns the paths about `center` by an angle growing with the distance from it, from 0
3523
+ * at the centre to `angle` degrees at the farthest point. Segments are subdivided and their
3524
+ * handles mapped through the warp's derivative, which keeps the result smooth.
3525
+ */
3526
+ declare function twistPaths(paths: readonly BezierPath[], angle: number, center: Vec2): BezierPath[];
3527
+ /**
3528
+ * Zig Zag: every segment gets `ridges` ridges: it is split into `ridges + 1` equal pieces and the
3529
+ * points (original ones included) are pushed alternately `size` to either side of the path.
3530
+ * `smooth` makes rounded waves. A closed path of n segments ends up with `n · (ridges + 1)` points
3531
+ * (an open one, one more).
3532
+ */
3533
+ declare function zigzagPaths(paths: readonly BezierPath[], size: number, ridges: number, smooth?: boolean): BezierPath[];
3534
+ /**
3535
+ * Wiggle Paths: subdivides the paths (`detail` points per segment) and moves every point by
3536
+ * smooth noise of up to `size` that evolves over `time` seconds at `speed` wiggles per second.
3537
+ * The same parameters always give the same result.
3538
+ */
3539
+ declare function wigglePaths(paths: readonly BezierPath[], w: VectorEffectParamsMap['wiggle']): BezierPath[];
3540
+ /** Merge Paths: the paths (in stacking order, each filled non-zero) combined into one path. */
3541
+ declare function mergePaths(paths: readonly BezierPath[], mode?: VectorMergeMode): BezierPath;
3542
+ /** One copy a repeater makes: its transform (node space) and opacity factor. */
3543
+ interface VectorRepeaterCopy {
3544
+ /** Copy number (0 is the original). */
3545
+ index: number;
3546
+ matrix: AffineMatrix;
3547
+ opacity: number;
3548
+ }
3549
+ /**
3550
+ * The copies of a repeater around `pivot` (the anchor point in node space), in copy order.
3551
+ * Copy i is moved by `translate(position·k) · rotate(rotation·k) · scale^k` about the pivot with
3552
+ * `k = i + offset`; opacity runs from the start to the end opacity across the copies, and a
3553
+ * fractional copy count fades the last copy by its fraction.
3554
+ */
3555
+ declare function vectorRepeaterCopies(r: VectorEffectParamsMap['repeater'], pivot: Vec2): VectorRepeaterCopy[];
3556
+ /** Each path repeated by `vectorRepeaterCopies` (copy order, the original first). */
3557
+ declare function repeatPaths(paths: readonly BezierPath[], r: VectorEffectParamsMap['repeater'], pivot: Vec2): {
3558
+ copy: VectorRepeaterCopy;
3559
+ paths: BezierPath[];
3560
+ }[];
3561
+ /** The middle of the paths' bounds (the origin when they are empty). */
3562
+ declare function pathsCenter(paths: readonly BezierPath[]): Vec2;
3563
+
3564
+ export { type AddVectorNodeOptions, AffineMatrix, DEFAULT_VECTOR_BLEND_DISTANCE, DEFAULT_VECTOR_BLEND_STEPS, DEFAULT_VECTOR_PATH_EDIT, DEFAULT_VECTOR_SNAP, IDENTITY_MATRIX, KAPPA, LazyMouse, type NearestSegment, type RecognizeInkOptions, SvgGradientDef, VECTOR_ARROWHEADS, VECTOR_ARROWHEAD_LABELS, VECTOR_BLEND_MAX_SMOOTH_STEPS, VECTOR_BLEND_MAX_STEPS, VECTOR_BLEND_SPACINGS, VECTOR_BLEND_SPACING_LABELS, VECTOR_BUILDER_HATCH_GAP, VECTOR_CLIPBOARD_TYPE, VECTOR_CONSTRUCTION_ANGLES, VECTOR_CORNER_KINDS, VECTOR_CORNER_KIND_LABELS, VECTOR_CORNER_WIDGET_INSET, VECTOR_EDIT_TOGGLES, VECTOR_EFFECT_DEFAULTS, VECTOR_EFFECT_LABELS, VECTOR_EFFECT_MENU, VECTOR_EFFECT_PARAM_SPECS, VECTOR_EFFECT_TYPES, VECTOR_FILL_GAP, VECTOR_INK_MAX_CORNERS, VECTOR_MERGE_MODES, VECTOR_OVERLAY_THEME, VECTOR_PATHFINDER_ACTIONS, VECTOR_PATHFINDER_LABELS, VECTOR_PATHFINDER_OPERATIONS, VECTOR_PATH_ACTIONS, VECTOR_PENCIL_STRING_PX, VECTOR_PRESSURE_NOMINAL, VECTOR_ROTATE_HANDLE_OFFSET, VECTOR_STROKE_ALIGN_LABELS, VECTOR_STYLE_KEYS, VECTOR_TOOLS, VECTOR_TOOL_GLYPHS, VECTOR_TOOL_SHORTCUTS, VECTOR_TRANSFORM_HANDLES, VECTOR_WIDTH_PRESETS, VECTOR_WIDTH_PRESET_IDS, VECTOR_WIDTH_PROFILE_MAX_POINTS, VECTOR_WIDTH_PROFILE_MAX_SCALE, VECTOR_WIDTH_SAME_T, type VariableStrokeOptions, type Vec2, type VectorActionResult, type VectorAlign, type VectorAnchor, type VectorAnchorRef, type VectorAnchorType, type VectorAppearanceShape, type VectorArrange, type VectorArrowAlign, type VectorArrowhead, type VectorArrowheadShape, type VectorAverageAxis, type VectorBlend, type VectorBlendControls, type VectorBlendInput, type VectorBlendOptions, type VectorBlendRail, type VectorBlendSpacing, type VectorBlendStart, type VectorBooleanOperand, type VectorBooleanOperation, type VectorBounds, type VectorBuilderHit, type VectorBuilderLinePiece, type VectorBuilderPreview, type VectorBuilderReplacement, type VectorBuilderTouched, type VectorCommandOptions, type VectorCorner, type VectorCornerInfo, type VectorCornerKind, type VectorCornerWidget, type VectorDefaults, type VectorDistribute, type VectorDocument, VectorEditorController, type VectorEditorOptions, type VectorEditorState, type VectorEffect, type VectorEffectParamSpec, type VectorEffectParamsMap, type VectorEffectType, type VectorEffectsPanelData, type VectorEffectsPanelItem, type VectorFillRule, type VectorGroupNode, type VectorGuideKind, type VectorGuideLabel, type VectorGuideLine, type VectorHandleRef, type VectorHitTestOptions, type VectorHover, type VectorInkShape, type VectorInteraction, type VectorKeyInput, type VectorLineCap, type VectorLineJoin, type VectorMatrix, type VectorMergeMode, type VectorModifiers, type VectorMorph, type VectorMorphContour, type VectorMorphCorrespondence, type VectorMorphOptions, type VectorNode, type VectorNodeListing, type VectorOverlayRenderData, type VectorPaint, type VectorPathAction, type VectorPathEditOptions, type VectorPathEntry, type VectorPathKeyframe, type VectorPathNode, type VectorPathfinderAction, type VectorPathfinderOperation, type VectorPathfinderPaint, type VectorPointSnap, type VectorPointerInput, type VectorRectSnap, type VectorRenderAnchor, type VectorRenderCornerWidget, type VectorRenderGroup, type VectorRenderGuideLabel, type VectorRenderGuideLine, type VectorRenderHandle, type VectorRenderNode, type VectorRenderPath, type VectorRenderStrokeParts, type VectorRenderWidthPoint, type VectorRepeaterCopy, type VectorScaleSnap, type VectorSceneRenderData, type VectorSegmentRef, type VectorSelectionBoxGeometry, type VectorSelectionFrame, type VectorSelectionStyle, type VectorShapeBuilderFace, type VectorShapeBuilderMap, type VectorShapeBuilderPlan, type VectorShapeBuilderResult, type VectorShapeInput, type VectorSnapGuides, type VectorSnapKind, type VectorSnapLeave, type VectorSnapOptions, VectorSnapTargets, type VectorStrokeAlign, type VectorStrokeParts, type VectorStrokeSpot, type VectorStyle, type VectorSubpath, type VectorSvgExportOptions, type VectorSvgImportOptions, type VectorTaperOptions, type VectorTool, type VectorTransformHandle, type VectorViewport, type VectorWaveOptions, type VectorWidthHandle, type VectorWidthPoint, type VectorWidthPointEdit, type VectorWidthPointRef, type VectorWidthPreset, type VectorWidthPresetInfo, activeVectorEffects, addBuilderHit, applyMatrix, applyMatrixLinear, applyVectorBlendOptions, applyVectorCornersAttribute, applyVectorEffects, arrowheadInset, arrowheadPath, arrowheadWeight, bendSegment, bezierToSubpaths, boundsFromPoints, boundsIntersect, clearVectorLiveBooleanCache, cloneAnchor, cloneSubpath, cloneVectorDocument, cloneVectorNode, collectPathNodes, constrainToLeave, convertAnchor, cornerBisectorPoint, cornerRadiusChange, cornerSetback, correspondMorphContours, createVectorCommands, createVectorEffect, createVectorMorph, curvatureMoveAnchor, cutSubpathAt, dashIntervals, decomposeRigid, effectPathLength, effectPathVertexCount, effectiveStrokeAlign, ellipseSubpath, eraseFromFill, eraseFromOutline, eraserRegion, evaluateVectorPathKeyframes, expandVectorAppearance, expandVectorAppearances, expandVectorBlend, expandVectorCorners, expandVectorCornersOf, findVectorNode, fitCornerRadius, foldVectorBooleanOperands, generateVectorBlendChildren, generateWidthProfile, getAnchor, getAnchorWorld, getEditablePathIds, getTransformHandlePositions, getVectorBlendControls, getVectorCornerWidgets, getVectorEffectsPanel, getVectorEnteredGroups, getVectorOverlayRenderData, getVectorSceneRenderData, getVectorSelectionBoxGeometry, getVectorSelectionFrame, getVectorSelectionStyle, getVectorWidthHandles, getVisibleAnchors, getVisibleHandles, hasOwnVectorAppearance, hasPaint, hasStrokeExtras, hasVectorAppearance, hasVectorCorners, hitTestVectorNode, hitTestVectorNodes, hitTestVectorStroke, inferAnchorType, insertAnchor, insertWidthPoint, interpolateMorphContours, interpolateRigidMatrix, interpolateVectorColor, interpolateVectorPaint, interpolateVectorPaths, interpolateVectorStyle, interpolateWidthProfiles, invertMatrix, isClosedBezierShape, isIdentityMatrix, isUniformWidthProfile, isVectorBlendGroup, isVectorLiveBoolean, isVectorTextTarget, joinSubpaths, knifePath, lineSubpath, locateVectorNode, matrixRotation, mergePaths, mirrorWidthProfile, morphContourToSubpath, morphPathsCross, moveAnchorHandle, multiplyMatrices, nearestSegment, nearestStrokePosition, nextVectorCornerKind, nodeMatrix, normalizeVectorEffectParams, offsetPaths, parseSvgTransform, parseVectorSvg, pathsCenter, planShapeBuilder, polygonSubpath, polylineBounds, pressureWidthProfile, puckerBloatPaths, recognizeInkShape, rectSubpath, refineMorphContour, refreshVectorBlends, releaseVectorBlend, removeAnchorKeepingShape, removeAnchors, removeAnchorsKeepingShape, removeRedundantPoints, removeWidthPoints, repeatPaths, resampleGradientStops, resolveVectorBlendOptions, reverseMorphContour, reverseSubpath, reverseWidthProfile, rotateMatrix, roundCornerPaths, roundSubpaths, samplePolyline, sanitizeVectorEffects, sanitizeWidthProfile, scaleFor, scaleMatrix, setAnchorCorner, setSubpathCorners, setWidthPoint, simplifyPolyline, smoothSubpath, splitIntoFaces, splitSubpathAt, starSubpath, strokePositionPoint, strokeWidthProfileOf, subpathEnclosesArea, subpathPointAt, subpathSegment, subpathSegmentCount, subpathToMorphContour, subpathsToBezier, taperWaveFactor, toVectorKeyInput, toVectorModifiers, toVectorPointerInput, transformVectorEffects, transformVectorNode, translateAnchor, translateMatrix, trimIntervals, trimPaths, trimPathsIndividually, turnMorphContour, twistPaths, unionBounds, variableStrokeOutline, variableStrokeRings, vectorAppearanceNodes, vectorAppearanceOutline, vectorAppearanceShapes, vectorBlendColorDistance, vectorBlendKeyTargets, vectorBlendKeys, vectorBlendRail, vectorBlendRailAt, vectorBlendSpine, vectorBlendStepCount, vectorBuilderErasedEdges, vectorCornerAt, vectorCorners, vectorCornersAttribute, vectorDiamondPath, vectorDocumentToSvg, vectorEnteredGroups, vectorFillMap, vectorInkShapeName, vectorLiveBooleanSteps, vectorNodeBounds, vectorNodeRotation, vectorNodeToBezier, vectorOperandOperation, vectorPaintToHex, vectorPaintToSvg, vectorParentMatrix, vectorPathData, vectorPathEntries, vectorPathWorldBezier, vectorPathfinderShape, vectorRepeaterCopies, vectorResizeCursor, vectorResultStyle, vectorShapeBuilderHit, vectorShapeBuilderMap, vectorStrokeLineArea, vectorStrokeOutline, vectorStrokeOutlinePath, vectorStrokeParts, vectorStrokeReach, vectorStrokeSvgParts, vectorStrokeWidthGeometry, vectorToolLabel, vectorWorldMatrix, walkVectorNodes, widthProfileAt, widthProfileFromAttribute, widthProfileMaxScale, widthProfilePreset, widthProfilePresetId, widthProfileToAttribute, wigglePaths, zigzagPaths };