@pixerate/editor 0.36.0 → 0.37.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.
- package/THIRD_PARTY_NOTICES.md +10 -0
- package/dist/canvas/index.cjs +25 -25
- package/dist/canvas/index.d.cts +3 -217
- package/dist/canvas/index.d.ts +3 -217
- package/dist/canvas/index.js +1 -1
- package/dist/{chunk-BGNPT5PE.cjs → chunk-GVB7ZPLZ.cjs} +24 -3
- package/dist/chunk-GVB7ZPLZ.cjs.map +1 -0
- package/dist/{chunk-EGPIVUEF.js → chunk-HPEKB352.js} +23 -2
- package/dist/chunk-HPEKB352.js.map +1 -0
- package/dist/{bezier-D8bsO-L0.d.cts → stroke-CWjFKal4.d.cts} +215 -1
- package/dist/{bezier-BvqVmWMg.d.ts → stroke-ysgaPpAo.d.ts} +215 -1
- package/dist/vector/index.cjs +1301 -284
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +381 -8
- package/dist/vector/index.d.ts +381 -8
- package/dist/vector/index.js +1100 -83
- package/dist/vector/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-BGNPT5PE.cjs.map +0 -1
- package/dist/chunk-EGPIVUEF.js.map +0 -1
package/dist/vector/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as CanvasGradientDef, A as AffineMatrix, B as BezierPathInput, a as BezierPath, S as SvgGradientDef } from '../
|
|
1
|
+
import { C as CanvasGradientDef, A as AffineMatrix, B as BezierPathInput, a as BezierPath, S as SvgGradientDef, b as StrokeJoin, c as StrokeCap } from '../stroke-CWjFKal4.cjs';
|
|
2
2
|
import { P as Point } from '../types-BFkYA4eF.cjs';
|
|
3
3
|
import { H as HistoryManager } from '../HistoryManager-DeQQMBCj.cjs';
|
|
4
4
|
import { C as CommandSpec } from '../registry-D0GADKc7.cjs';
|
|
@@ -75,6 +75,17 @@ declare const VECTOR_ARROWHEADS: readonly VectorArrowhead[];
|
|
|
75
75
|
* tip sits on the end point and the stroke is shortened under the head.
|
|
76
76
|
*/
|
|
77
77
|
type VectorArrowAlign = 'extend' | 'tip';
|
|
78
|
+
/**
|
|
79
|
+
* One point of a variable-width stroke profile. `t` is the position along the subpath by
|
|
80
|
+
* length (0 at its start, 1 at its end); `left` and `right` are how far the stroke reaches on
|
|
81
|
+
* each side, as multiples of half the stroke width (looking along the path on screen, y down).
|
|
82
|
+
* A uniform stroke has 1 on both sides. Two points at the same `t` make a step.
|
|
83
|
+
*/
|
|
84
|
+
interface VectorWidthPoint {
|
|
85
|
+
t: number;
|
|
86
|
+
left: number;
|
|
87
|
+
right: number;
|
|
88
|
+
}
|
|
78
89
|
/** Paint and stroke settings of a path. */
|
|
79
90
|
interface VectorStyle {
|
|
80
91
|
fill?: VectorPaint;
|
|
@@ -98,6 +109,12 @@ interface VectorStyle {
|
|
|
98
109
|
startArrowScale?: number;
|
|
99
110
|
/** Size of the end head (default 1). */
|
|
100
111
|
endArrowScale?: number;
|
|
112
|
+
/**
|
|
113
|
+
* Variable width: side scales along each subpath, interpolated with a monotone cubic (see
|
|
114
|
+
* `widthProfileAt`). Absent, empty or `null` strokes at a uniform width. A profiled stroke is
|
|
115
|
+
* drawn as its filled outline.
|
|
116
|
+
*/
|
|
117
|
+
strokeWidthProfile?: VectorWidthPoint[] | null;
|
|
101
118
|
}
|
|
102
119
|
interface VectorNodeBase {
|
|
103
120
|
id: string;
|
|
@@ -154,10 +171,10 @@ interface VectorHandleRef extends VectorAnchorRef {
|
|
|
154
171
|
}
|
|
155
172
|
/**
|
|
156
173
|
* Canvas tools. `direct` edits anchors, handles and segments; the shape tools drag out a new
|
|
157
|
-
* shape; `scissors` cuts a path at a point, `knife` cuts filled shapes along a freehand stroke
|
|
158
|
-
*
|
|
174
|
+
* shape; `scissors` cuts a path at a point, `knife` cuts filled shapes along a freehand stroke,
|
|
175
|
+
* `eraser` rubs out the area under one and `width` drags a stroke's width at a point.
|
|
159
176
|
*/
|
|
160
|
-
type VectorTool = 'select' | 'direct' | 'pen' | 'pencil' | 'rect' | 'ellipse' | 'polygon' | 'star' | 'line' | 'scissors' | 'knife' | 'eraser';
|
|
177
|
+
type VectorTool = 'select' | 'direct' | 'pen' | 'pencil' | 'rect' | 'ellipse' | 'polygon' | 'star' | 'line' | 'scissors' | 'knife' | 'eraser' | 'width';
|
|
161
178
|
declare const VECTOR_TOOLS: readonly VectorTool[];
|
|
162
179
|
/** Keyboard modifiers held during a pointer event. */
|
|
163
180
|
interface VectorModifiers {
|
|
@@ -408,6 +425,11 @@ interface VectorRenderStrokeParts {
|
|
|
408
425
|
d: string;
|
|
409
426
|
/** Width to draw it with: twice the stroke width when aligned, half of it being clipped away. */
|
|
410
427
|
width: number;
|
|
428
|
+
/**
|
|
429
|
+
* A variable-width stroke: the area to fill with `stroke` (nonzero) instead of stroking `d`,
|
|
430
|
+
* clipped or masked like the stroke would be.
|
|
431
|
+
*/
|
|
432
|
+
outline?: string;
|
|
411
433
|
/**
|
|
412
434
|
* Inside: a `<clipPath id>` holding the shape (`d`, `clip-rule` = `fillRule`). Outside: a
|
|
413
435
|
* `<mask id>` in user space over `bounds`, white with the shape (`d`) in black.
|
|
@@ -422,6 +444,10 @@ interface VectorRenderStrokeParts {
|
|
|
422
444
|
}
|
|
423
445
|
/** The stroke parts of a path whose stroke needs more than one element, in its own space (undefined otherwise). */
|
|
424
446
|
declare function vectorStrokeSvgParts(node: VectorPathNode, clipId: string, precision?: number): VectorRenderStrokeParts | undefined;
|
|
447
|
+
/** A width profile as a data attribute: `t,left,right` points separated by `;`. */
|
|
448
|
+
declare function widthProfileToAttribute(points: readonly VectorWidthPoint[], precision?: number): string;
|
|
449
|
+
/** Reads `widthProfileToAttribute` output (invalid points are dropped). */
|
|
450
|
+
declare function widthProfileFromAttribute(value: string | undefined): VectorWidthPoint[];
|
|
425
451
|
/** Serializes a vector document as a standalone SVG string. */
|
|
426
452
|
declare function vectorDocumentToSvg(doc: VectorDocument, options?: VectorSvgExportOptions): string;
|
|
427
453
|
interface VectorSvgImportOptions {
|
|
@@ -491,6 +517,136 @@ declare function nextVectorCornerKind(kind: VectorCornerKind | undefined): Vecto
|
|
|
491
517
|
/** Every anchor of a subpath given the same live corner (radius 0 clears them). */
|
|
492
518
|
declare function setSubpathCorners(sp: VectorSubpath, radius: number, kind?: VectorCornerKind): VectorSubpath;
|
|
493
519
|
|
|
520
|
+
/**
|
|
521
|
+
* Variable-width stroke profiles: stroke widths at positions along a path (each subpath on its
|
|
522
|
+
* own), interpolated smoothly and held flat before the first and after the last point. Each
|
|
523
|
+
* point has a left and a right side scale (looking along the path on screen, y down), so a
|
|
524
|
+
* stroke can grow on one side only.
|
|
525
|
+
*
|
|
526
|
+
* Ported from ArtCraft (MIT OR Apache-2.0, see THIRD_PARTY_NOTICES.md):
|
|
527
|
+
* - figcraft `crates/doc/src/props.rs` — `WidthProfile` / `WidthPoint`: sanitising, side
|
|
528
|
+
* scales, inserting and moving points, and the monotone cubic (Fritsch–Carlson) interpolation
|
|
529
|
+
* that never overshoots its neighbouring points.
|
|
530
|
+
* - vectorcraft `crates/doc/src/appearance.rs` — `WidthProfile` as `(t, left, right)` points,
|
|
531
|
+
* discontinuous points (two points at one `t` make a step) and the profile presets.
|
|
532
|
+
* - effectcraft `crates/path/src/varstroke.rs` — `width_factor`: the parametric Taper (lengths,
|
|
533
|
+
* end widths, ease) and Wave (amount, cycles, phase) shapes, used here as profile generators.
|
|
534
|
+
*/
|
|
535
|
+
|
|
536
|
+
/** The most points a profile keeps. */
|
|
537
|
+
declare const VECTOR_WIDTH_PROFILE_MAX_POINTS = 64;
|
|
538
|
+
/** The widest a side can be, as a multiple of the stroke width. */
|
|
539
|
+
declare const VECTOR_WIDTH_PROFILE_MAX_SCALE = 1000;
|
|
540
|
+
/** Positions closer than this are the same place (the two sides of a discontinuous point). */
|
|
541
|
+
declare const VECTOR_WIDTH_SAME_T = 0.000001;
|
|
542
|
+
/** Built-in profiles. `uniform` is the plain stroke (no profile). */
|
|
543
|
+
type VectorWidthPreset = 'uniform' | 'taperStart' | 'taperEnd' | 'taperBoth' | 'bulge' | 'pinch' | 'teardrop' | 'wave' | 'pressure';
|
|
544
|
+
/** One preset as a menu shows it. */
|
|
545
|
+
interface VectorWidthPresetInfo {
|
|
546
|
+
id: VectorWidthPreset;
|
|
547
|
+
label: string;
|
|
548
|
+
points: readonly VectorWidthPoint[];
|
|
549
|
+
}
|
|
550
|
+
/** The built-in profiles, in menu order. */
|
|
551
|
+
declare const VECTOR_WIDTH_PRESETS: readonly VectorWidthPresetInfo[];
|
|
552
|
+
declare const VECTOR_WIDTH_PRESET_IDS: readonly VectorWidthPreset[];
|
|
553
|
+
/**
|
|
554
|
+
* A profile as the outline uses it: finite points only, `t` in 0–1, side scales in 0–1000,
|
|
555
|
+
* sorted by `t` (stable, so a step keeps its order), at most 64 points. Points missing a side
|
|
556
|
+
* take the other side's scale.
|
|
557
|
+
*/
|
|
558
|
+
declare function sanitizeWidthProfile(points: readonly Partial<VectorWidthPoint>[] | null | undefined): VectorWidthPoint[];
|
|
559
|
+
/** True when the profile draws a plain stroke: no points, or every side at scale 1. */
|
|
560
|
+
declare function isUniformWidthProfile(points: readonly VectorWidthPoint[] | null | undefined): boolean;
|
|
561
|
+
/**
|
|
562
|
+
* The left and right side scales at `t` (0–1 along the subpath by length). Each side is
|
|
563
|
+
* interpolated on its own with a monotone cubic, so the width never overshoots its points;
|
|
564
|
+
* a profile without points is uniform (1, 1).
|
|
565
|
+
*/
|
|
566
|
+
declare function widthProfileAt(points: readonly VectorWidthPoint[] | null | undefined, t: number): {
|
|
567
|
+
left: number;
|
|
568
|
+
right: number;
|
|
569
|
+
};
|
|
570
|
+
/** The largest side scale (the interpolation never exceeds its points); 1 without a profile. */
|
|
571
|
+
declare function widthProfileMaxScale(points: readonly VectorWidthPoint[] | null | undefined): number;
|
|
572
|
+
/** The points of a preset (empty for `uniform`), or null for an unknown id. */
|
|
573
|
+
declare function widthProfilePreset(id: string): VectorWidthPoint[] | null;
|
|
574
|
+
/** The preset a profile matches: `uniform` without one (or all at scale 1), `custom` when none matches. */
|
|
575
|
+
declare function widthProfilePresetId(points: readonly VectorWidthPoint[] | null | undefined): VectorWidthPreset | 'custom';
|
|
576
|
+
/** The profile of the reversed path: positions mirrored and the sides swapped. */
|
|
577
|
+
declare function reverseWidthProfile(points: readonly VectorWidthPoint[]): VectorWidthPoint[];
|
|
578
|
+
/** The profile of a mirrored path (it runs the same way, but its sides swap). */
|
|
579
|
+
declare function mirrorWidthProfile(points: readonly VectorWidthPoint[]): VectorWidthPoint[];
|
|
580
|
+
/**
|
|
581
|
+
* Adds a width point at `t` (side scales `left` / `right`, default: as wide as the stroke is
|
|
582
|
+
* there) and returns the new profile and the point's index. Inserting at the position of an
|
|
583
|
+
* existing point replaces it, unless `step` is set (which makes a discontinuous point).
|
|
584
|
+
*/
|
|
585
|
+
declare function insertWidthPoint(points: readonly VectorWidthPoint[] | null | undefined, t: number, sides?: {
|
|
586
|
+
left?: number;
|
|
587
|
+
right?: number;
|
|
588
|
+
}, options?: {
|
|
589
|
+
step?: boolean;
|
|
590
|
+
}): {
|
|
591
|
+
points: VectorWidthPoint[];
|
|
592
|
+
index: number;
|
|
593
|
+
};
|
|
594
|
+
/**
|
|
595
|
+
* Changes point `index`: moves it to `t` (kept between its neighbours, so indices stay put)
|
|
596
|
+
* and / or sets its side scales. Out-of-range indices leave the profile as it is.
|
|
597
|
+
*/
|
|
598
|
+
declare function setWidthPoint(points: readonly VectorWidthPoint[], index: number, patch: Partial<VectorWidthPoint>): VectorWidthPoint[];
|
|
599
|
+
/** Removes the points at `indices`. */
|
|
600
|
+
declare function removeWidthPoints(points: readonly VectorWidthPoint[], indices: readonly number[]): VectorWidthPoint[];
|
|
601
|
+
/** A parametric taper (effectcraft's Stroke Taper), lengths as fractions of the path. */
|
|
602
|
+
interface VectorTaperOptions {
|
|
603
|
+
/** Fraction of the path the start taper covers (default 0). */
|
|
604
|
+
startLength?: number;
|
|
605
|
+
/** Fraction the end taper covers (default 0). */
|
|
606
|
+
endLength?: number;
|
|
607
|
+
/** Width at the start as a fraction of the stroke width (default 0: a point). */
|
|
608
|
+
startWidth?: number;
|
|
609
|
+
endWidth?: number;
|
|
610
|
+
/** 0 linear, 1 a quarter circle bulging outwards (default 0). */
|
|
611
|
+
startEase?: number;
|
|
612
|
+
endEase?: number;
|
|
613
|
+
}
|
|
614
|
+
/** A width wave (effectcraft's Stroke Wave): the width swings between `1 − amount` and 1. */
|
|
615
|
+
interface VectorWaveOptions {
|
|
616
|
+
/** 0–1 (default 0.5). */
|
|
617
|
+
amount?: number;
|
|
618
|
+
/** Whole cycles along the path (default 4). */
|
|
619
|
+
cycles?: number;
|
|
620
|
+
/** Degrees (default 0). */
|
|
621
|
+
phase?: number;
|
|
622
|
+
}
|
|
623
|
+
/** The width factor at fraction `t` of a taper and / or a wave (effectcraft `width_factor`). */
|
|
624
|
+
declare function taperWaveFactor(t: number, taper?: VectorTaperOptions | null, wave?: VectorWaveOptions | null): number;
|
|
625
|
+
/**
|
|
626
|
+
* Samples a taper and / or wave into profile points (symmetric), simplified to within
|
|
627
|
+
* `tolerance` of the factor (default 0.01). The monotone interpolation draws them back smoothly.
|
|
628
|
+
*/
|
|
629
|
+
declare function generateWidthProfile(options: {
|
|
630
|
+
taper?: VectorTaperOptions | null;
|
|
631
|
+
wave?: VectorWaveOptions | null;
|
|
632
|
+
samples?: number;
|
|
633
|
+
tolerance?: number;
|
|
634
|
+
}): VectorWidthPoint[];
|
|
635
|
+
/** Pen pressure that draws the stroke's own width (a mouse reports 0.5 while a button is down). */
|
|
636
|
+
declare const VECTOR_PRESSURE_NOMINAL = 0.5;
|
|
637
|
+
/**
|
|
638
|
+
* A profile from pen pressure recorded along a stroke: `(t, pressure 0–1)` samples in order.
|
|
639
|
+
* The width scale is pressure ÷ 0.5 (so half pressure draws the stroke's width, full pressure
|
|
640
|
+
* twice it), at least 0.05; the samples are simplified to within `tolerance` (default 0.02).
|
|
641
|
+
* Returns an empty (uniform) profile when every sample is the same.
|
|
642
|
+
*/
|
|
643
|
+
declare function pressureWidthProfile(samples: readonly {
|
|
644
|
+
t: number;
|
|
645
|
+
pressure: number;
|
|
646
|
+
}[], options?: {
|
|
647
|
+
tolerance?: number;
|
|
648
|
+
}): VectorWidthPoint[];
|
|
649
|
+
|
|
494
650
|
/**
|
|
495
651
|
* What a guide line shows: `align` lines run from a target through the snapped point or box,
|
|
496
652
|
* `construction` lines from where a drawn point leaves, `spacing` marks equal gaps and `size`
|
|
@@ -725,6 +881,11 @@ interface VectorPathEditOptions {
|
|
|
725
881
|
recognizeShapes: boolean;
|
|
726
882
|
/** Eraser diameter in document units (default 10). */
|
|
727
883
|
eraserSize: number;
|
|
884
|
+
/**
|
|
885
|
+
* Record pointer pressure on pencil strokes as a width profile: `pen` (default) for pen input
|
|
886
|
+
* only, `all` for any pointer that reports pressure, `off` never.
|
|
887
|
+
*/
|
|
888
|
+
pencilPressure: 'pen' | 'all' | 'off';
|
|
728
889
|
}
|
|
729
890
|
/** Path-editing options new editors start with. */
|
|
730
891
|
declare const DEFAULT_VECTOR_PATH_EDIT: Readonly<VectorPathEditOptions>;
|
|
@@ -752,6 +913,27 @@ interface VectorEditorOptions {
|
|
|
752
913
|
interface VectorPointerInput extends VectorModifiers {
|
|
753
914
|
/** 0 = primary, 1 = middle (pans), 2 = secondary. Default 0. */
|
|
754
915
|
button?: number;
|
|
916
|
+
/** `PointerEvent.pressure` (0–1), recorded on pencil strokes. */
|
|
917
|
+
pressure?: number;
|
|
918
|
+
/** `PointerEvent.pointerType` (`mouse`, `pen`, `touch`). */
|
|
919
|
+
pointerType?: string;
|
|
920
|
+
}
|
|
921
|
+
/** One width point of a path's stroke profile; `subpath` is the subpath it is shown on. */
|
|
922
|
+
interface VectorWidthPointRef {
|
|
923
|
+
nodeId: string;
|
|
924
|
+
index: number;
|
|
925
|
+
subpath: number;
|
|
926
|
+
}
|
|
927
|
+
/** A spot on a stroke (width tool): where a drag would add a width point. Positions in document units. */
|
|
928
|
+
interface VectorStrokeSpot {
|
|
929
|
+
nodeId: string;
|
|
930
|
+
subpath: number;
|
|
931
|
+
/** Position along the subpath by length, 0–1. */
|
|
932
|
+
t: number;
|
|
933
|
+
point: Vec2;
|
|
934
|
+
/** Ends of the stroke's width across the path there. */
|
|
935
|
+
left: Vec2;
|
|
936
|
+
right: Vec2;
|
|
755
937
|
}
|
|
756
938
|
/** A key press as the controller needs it. */
|
|
757
939
|
interface VectorKeyInput extends VectorModifiers {
|
|
@@ -774,6 +956,12 @@ interface VectorHover {
|
|
|
774
956
|
transformHandle?: VectorTransformHandle;
|
|
775
957
|
/** A live corner widget (direct tool): the corner's anchor. */
|
|
776
958
|
corner?: VectorAnchorRef;
|
|
959
|
+
/** A width point (width tool): its centre or the end of its left / right side. */
|
|
960
|
+
widthPoint?: VectorWidthPointRef & {
|
|
961
|
+
part: 'center' | 'left' | 'right';
|
|
962
|
+
};
|
|
963
|
+
/** A spot on a stroke away from its width points (width tool). */
|
|
964
|
+
strokeSpot?: VectorStrokeSpot;
|
|
777
965
|
}
|
|
778
966
|
/** The drag in progress, for overlays and status text. */
|
|
779
967
|
type VectorInteraction = {
|
|
@@ -816,6 +1004,11 @@ type VectorInteraction = {
|
|
|
816
1004
|
tool: 'knife' | 'eraser';
|
|
817
1005
|
points: Vec2[];
|
|
818
1006
|
width: number;
|
|
1007
|
+
} | {
|
|
1008
|
+
type: 'width';
|
|
1009
|
+
ref: VectorWidthPointRef;
|
|
1010
|
+
mode: 'width' | 'move';
|
|
1011
|
+
width: number;
|
|
819
1012
|
} | {
|
|
820
1013
|
type: 'pen';
|
|
821
1014
|
nodeId: string;
|
|
@@ -830,6 +1023,8 @@ interface VectorEditorState {
|
|
|
830
1023
|
selection: readonly string[];
|
|
831
1024
|
/** Selected anchors (direct tool). */
|
|
832
1025
|
selectedAnchors: readonly VectorAnchorRef[];
|
|
1026
|
+
/** The selected width point (width tool); Delete removes it. */
|
|
1027
|
+
selectedWidthPoint: VectorWidthPointRef | null;
|
|
833
1028
|
/** The path whose anchors are being edited, if any. */
|
|
834
1029
|
editingId: string | null;
|
|
835
1030
|
/** Axis-aligned bounds of the selected nodes in document units. */
|
|
@@ -893,7 +1088,7 @@ interface VectorShapeInput extends VectorStyle {
|
|
|
893
1088
|
name?: string;
|
|
894
1089
|
}
|
|
895
1090
|
/** Every field of `VectorStyle`, in the order style panels and commands list them. */
|
|
896
|
-
declare const VECTOR_STYLE_KEYS: readonly ["fill", "stroke", "strokeWidth", "strokeLinecap", "strokeLinejoin", "strokeDasharray", "fillRule", "strokeAlign", "startArrow", "endArrow", "arrowAlign", "startArrowScale", "endArrowScale"];
|
|
1091
|
+
declare const VECTOR_STYLE_KEYS: readonly ["fill", "stroke", "strokeWidth", "strokeLinecap", "strokeLinejoin", "strokeDasharray", "fillRule", "strokeAlign", "startArrow", "endArrow", "arrowAlign", "startArrowScale", "endArrowScale", "strokeWidthProfile"];
|
|
897
1092
|
/** Clipboard payload type written by `copy()`. */
|
|
898
1093
|
declare const VECTOR_CLIPBOARD_TYPE = "pixerate/vector";
|
|
899
1094
|
/** Screen distance of the rotation handle above the selection box. */
|
|
@@ -930,6 +1125,37 @@ interface VectorCornerWidget {
|
|
|
930
1125
|
* THIRD_PARTY_NOTICES.md), as is the `corner` drag below.
|
|
931
1126
|
*/
|
|
932
1127
|
declare function getVectorCornerWidgets(state: Pick<VectorEditorState, 'document' | 'selection' | 'editingId' | 'tool' | 'pen' | 'selectedAnchors' | 'viewport'>): VectorCornerWidget[];
|
|
1128
|
+
/**
|
|
1129
|
+
* The line a path's stroke follows (node space; shortened under `tip` arrowheads) and the
|
|
1130
|
+
* distance a side scale of 1 reaches from it (half the drawn width: twice the stroke width for
|
|
1131
|
+
* inside / outside strokes). Null for paths without a visible stroke.
|
|
1132
|
+
*/
|
|
1133
|
+
declare function vectorStrokeWidthGeometry(node: VectorPathNode): {
|
|
1134
|
+
line: BezierPath;
|
|
1135
|
+
unit: number;
|
|
1136
|
+
} | null;
|
|
1137
|
+
/** A width point of the width tool, in document units. */
|
|
1138
|
+
interface VectorWidthHandle {
|
|
1139
|
+
ref: VectorWidthPointRef;
|
|
1140
|
+
/** The point on the path. */
|
|
1141
|
+
x: number;
|
|
1142
|
+
y: number;
|
|
1143
|
+
/** Ends of its left and right sides. */
|
|
1144
|
+
left: Vec2;
|
|
1145
|
+
right: Vec2;
|
|
1146
|
+
t: number;
|
|
1147
|
+
/** Side scales (multiples of half the stroke width). */
|
|
1148
|
+
leftScale: number;
|
|
1149
|
+
rightScale: number;
|
|
1150
|
+
selected: boolean;
|
|
1151
|
+
}
|
|
1152
|
+
/**
|
|
1153
|
+
* The width points the width tool shows: every profile point on every subpath of the stroke
|
|
1154
|
+
* under the pointer, the selected paths and the stroke being edited. Ported from ArtCraft
|
|
1155
|
+
* vectorcraft `crates/tools/src/distort/width.rs` (MIT OR Apache-2.0, see
|
|
1156
|
+
* THIRD_PARTY_NOTICES.md), as are the `width` drag and hover below.
|
|
1157
|
+
*/
|
|
1158
|
+
declare function getVectorWidthHandles(state: Pick<VectorEditorState, 'document' | 'selection' | 'tool' | 'hover' | 'interaction' | 'selectedWidthPoint'>): VectorWidthHandle[];
|
|
933
1159
|
/** Looks up an anchor (positions in its node's own space). */
|
|
934
1160
|
declare function getAnchor(doc: VectorDocument, ref: VectorAnchorRef): VectorAnchor | undefined;
|
|
935
1161
|
/** An anchor with its position and handles in document space (its node's transforms applied). */
|
|
@@ -998,6 +1224,7 @@ declare class VectorEditorController {
|
|
|
998
1224
|
private doc;
|
|
999
1225
|
private selection;
|
|
1000
1226
|
private anchors;
|
|
1227
|
+
private widthPoint;
|
|
1001
1228
|
private editingId;
|
|
1002
1229
|
private pen;
|
|
1003
1230
|
private tool;
|
|
@@ -1131,6 +1358,19 @@ declare class VectorEditorController {
|
|
|
1131
1358
|
}, ids?: readonly string[], options?: {
|
|
1132
1359
|
label?: string;
|
|
1133
1360
|
}): VectorActionResult;
|
|
1361
|
+
/**
|
|
1362
|
+
* Sets the variable-width profile of the selected (or given) paths: a preset id
|
|
1363
|
+
* (`uniform` removes the profile), points, or a parametric taper / wave. Returns an error for
|
|
1364
|
+
* an unknown preset.
|
|
1365
|
+
*/
|
|
1366
|
+
setWidthProfile(profile: VectorWidthPreset | readonly VectorWidthPoint[] | {
|
|
1367
|
+
taper?: VectorTaperOptions;
|
|
1368
|
+
wave?: VectorWaveOptions;
|
|
1369
|
+
} | null, options?: {
|
|
1370
|
+
ids?: readonly string[];
|
|
1371
|
+
}): VectorActionResult;
|
|
1372
|
+
/** Removes one width point of a path's profile (the width tool's Delete). */
|
|
1373
|
+
removeWidthPoint(ref: Pick<VectorWidthPointRef, 'nodeId' | 'index'>): VectorActionResult;
|
|
1134
1374
|
/**
|
|
1135
1375
|
* Sets the live corner radius (and optionally the kind) of anchors: `refs`, else the selected
|
|
1136
1376
|
* anchors (direct tool), else every anchor of the `ids` / selected paths. Radius 0 makes the
|
|
@@ -1403,6 +1643,12 @@ declare class VectorEditorController {
|
|
|
1403
1643
|
/** Endpoints of open subpaths of unlocked visible paths (pen tool resumes from them). */
|
|
1404
1644
|
private openEndpoints;
|
|
1405
1645
|
private computeHover;
|
|
1646
|
+
private widthView;
|
|
1647
|
+
/** The width point centre or side end under `screen` (width tool). */
|
|
1648
|
+
private hitWidthHandle;
|
|
1649
|
+
/** The nearest stroked, unlocked visible path whose stroke is under document point `p` (width tool). */
|
|
1650
|
+
private strokeSpotAt;
|
|
1651
|
+
private downWidth;
|
|
1406
1652
|
/** The nearest outline point of any visible, unlocked path within the pick distance of document point `p`. */
|
|
1407
1653
|
private nearestOutline;
|
|
1408
1654
|
private sameHover;
|
|
@@ -1517,6 +1763,22 @@ interface VectorRenderCornerWidget {
|
|
|
1517
1763
|
/** Its corners are being dragged. */
|
|
1518
1764
|
active: boolean;
|
|
1519
1765
|
}
|
|
1766
|
+
/**
|
|
1767
|
+
* A width point of the width tool in screen pixels: a diamond at (`x`, `y`) on the path and a
|
|
1768
|
+
* line across the stroke from `left` to `right`, with a handle at each end.
|
|
1769
|
+
*/
|
|
1770
|
+
interface VectorRenderWidthPoint {
|
|
1771
|
+
ref: VectorWidthPointRef;
|
|
1772
|
+
x: number;
|
|
1773
|
+
y: number;
|
|
1774
|
+
left: Vec2;
|
|
1775
|
+
right: Vec2;
|
|
1776
|
+
selected: boolean;
|
|
1777
|
+
/** The part under the pointer, if any. */
|
|
1778
|
+
hovered: 'center' | 'left' | 'right' | null;
|
|
1779
|
+
/** Being dragged. */
|
|
1780
|
+
active: boolean;
|
|
1781
|
+
}
|
|
1520
1782
|
/** A smart guide line in screen pixels. */
|
|
1521
1783
|
interface VectorRenderGuideLine {
|
|
1522
1784
|
kind: VectorGuideKind;
|
|
@@ -1586,6 +1848,18 @@ interface VectorOverlayRenderData {
|
|
|
1586
1848
|
* Alt-click to cycle round / inverted / chamfer, click to pick its corner alone.
|
|
1587
1849
|
*/
|
|
1588
1850
|
cornerWidgets: VectorRenderCornerWidget[];
|
|
1851
|
+
/** Width points of the width tool (screen space). */
|
|
1852
|
+
widthPoints: VectorRenderWidthPoint[];
|
|
1853
|
+
/**
|
|
1854
|
+
* Where a width-tool drag would add a width point (screen space): draw a dashed line from
|
|
1855
|
+
* `left` to `right` and a hollow diamond at (`x`, `y`).
|
|
1856
|
+
*/
|
|
1857
|
+
widthSpot: {
|
|
1858
|
+
x: number;
|
|
1859
|
+
y: number;
|
|
1860
|
+
left: Vec2;
|
|
1861
|
+
right: Vec2;
|
|
1862
|
+
} | null;
|
|
1589
1863
|
/** A short status, e.g. "W 120 × H 80" or "45°". */
|
|
1590
1864
|
status: string | null;
|
|
1591
1865
|
}
|
|
@@ -1612,7 +1886,11 @@ declare const VECTOR_OVERLAY_THEME: {
|
|
|
1612
1886
|
readonly handleRadius: 3.5;
|
|
1613
1887
|
/** Radius of a live corner widget (a ring with a dot). */
|
|
1614
1888
|
readonly cornerWidgetRadius: 4;
|
|
1889
|
+
/** Half the diagonal of a width point's diamond. */
|
|
1890
|
+
readonly widthPointSize: 5;
|
|
1615
1891
|
};
|
|
1892
|
+
/** SVG path data of the diamond a width point is drawn with (screen pixels). */
|
|
1893
|
+
declare function vectorDiamondPath(x: number, y: number, r?: number): string;
|
|
1616
1894
|
interface ModifierEventLike {
|
|
1617
1895
|
shiftKey?: boolean;
|
|
1618
1896
|
altKey?: boolean;
|
|
@@ -1625,10 +1903,17 @@ declare function toVectorModifiers(event: ModifierEventLike): {
|
|
|
1625
1903
|
alt: boolean;
|
|
1626
1904
|
mod: boolean;
|
|
1627
1905
|
};
|
|
1628
|
-
/**
|
|
1906
|
+
/**
|
|
1907
|
+
* A pointer event as `VectorEditorController.pointerDown/Move/Up` input: modifiers, button,
|
|
1908
|
+
* and the pressure and pointer type the pencil records as a width profile.
|
|
1909
|
+
*/
|
|
1629
1910
|
declare function toVectorPointerInput(event: ModifierEventLike & {
|
|
1630
1911
|
button?: number;
|
|
1912
|
+
pressure?: number;
|
|
1913
|
+
pointerType?: string;
|
|
1631
1914
|
}): {
|
|
1915
|
+
pointerType?: string | undefined;
|
|
1916
|
+
pressure?: number | undefined;
|
|
1632
1917
|
button: number | undefined;
|
|
1633
1918
|
shift: boolean;
|
|
1634
1919
|
alt: boolean;
|
|
@@ -1657,6 +1942,9 @@ interface VectorSelectionStyle {
|
|
|
1657
1942
|
arrowAlign: VectorArrowAlign;
|
|
1658
1943
|
startArrowScale: number;
|
|
1659
1944
|
endArrowScale: number;
|
|
1945
|
+
/** The first path's width profile (null when uniform) and the preset it matches. */
|
|
1946
|
+
strokeWidthProfile: VectorWidthPoint[] | null;
|
|
1947
|
+
widthProfile: VectorWidthPreset | 'custom';
|
|
1660
1948
|
/**
|
|
1661
1949
|
* Live corners of the selected anchors (direct tool) or of every corner of the selected
|
|
1662
1950
|
* paths: the first one's radius and kind, and how many corners there are (0: none to round).
|
|
@@ -1677,6 +1965,7 @@ interface VectorSelectionStyle {
|
|
|
1677
1965
|
arrowAlign: boolean;
|
|
1678
1966
|
startArrowScale: boolean;
|
|
1679
1967
|
endArrowScale: boolean;
|
|
1968
|
+
widthProfile: boolean;
|
|
1680
1969
|
cornerRadius: boolean;
|
|
1681
1970
|
cornerKind: boolean;
|
|
1682
1971
|
};
|
|
@@ -1954,8 +2243,15 @@ interface VectorStrokeParts {
|
|
|
1954
2243
|
declare function isClosedBezierShape(path: BezierPath): boolean;
|
|
1955
2244
|
/** The alignment a stroke is drawn with: the style's, or `center` for open shapes. */
|
|
1956
2245
|
declare function effectiveStrokeAlign(style: Pick<VectorStyle, 'strokeAlign'>, closedShape: boolean): VectorStrokeAlign;
|
|
1957
|
-
/**
|
|
2246
|
+
/** The style's width profile, sanitised, or null when the stroke is uniform. */
|
|
2247
|
+
declare function strokeWidthProfileOf(style: Pick<VectorStyle, 'strokeWidthProfile'>): VectorWidthPoint[] | null;
|
|
2248
|
+
/** True when the style asks for more than a plain centred stroke (an alignment, arrowheads or a width profile). */
|
|
1958
2249
|
declare function hasStrokeExtras(style: VectorStyle): boolean;
|
|
2250
|
+
/**
|
|
2251
|
+
* The area of the stroke along `parts.line` before alignment clipping: SVG's stroke for a
|
|
2252
|
+
* uniform width, the variable-width outline (`variableStrokeOutline`) for a profiled one.
|
|
2253
|
+
*/
|
|
2254
|
+
declare function vectorStrokeLineArea(parts: Pick<VectorStrokeParts, 'line' | 'drawWidth'>, style: VectorStyle, tolerance?: number): BezierPath;
|
|
1959
2255
|
/** The weight of a head: the stroke width times its scale (at least 0.25). A head is 4 weights long and wide. */
|
|
1960
2256
|
declare function arrowheadWeight(style: VectorStyle, end: 'start' | 'end'): number;
|
|
1961
2257
|
/** Distance from the tip where the stroke ends, for a stroke whose cap reaches `cap` past its end. */
|
|
@@ -1983,4 +2279,81 @@ declare function hitTestVectorStroke(path: BezierPath, p: Vec2, style: VectorSty
|
|
|
1983
2279
|
/** How far the stroke can reach past the outline (for padding bounds and masks). */
|
|
1984
2280
|
declare function vectorStrokeReach(style: VectorStyle): number;
|
|
1985
2281
|
|
|
1986
|
-
|
|
2282
|
+
/**
|
|
2283
|
+
* The outline of a variable-width stroke, as a clean filled Bézier path.
|
|
2284
|
+
*
|
|
2285
|
+
* Each subpath is flattened (finely enough for the width to vary smoothly) and the stroke is
|
|
2286
|
+
* the union of positively wound pieces: one trapezoid per flattened segment (its ends at the
|
|
2287
|
+
* local side widths), a wedge on the outer side of every bend (the style's join at the path's
|
|
2288
|
+
* own corners, round inside curves) and the caps. Filled with the non-zero rule the union is
|
|
2289
|
+
* exact whatever the profile does; it is built as the boundary those pieces add up to (see
|
|
2290
|
+
* `variableStrokeRings`), normalised with the polygon boolean engine, and every ring is refitted
|
|
2291
|
+
* with cubics (`fitCubics`) to within the tolerance — a real Bézier outline, not a polyline.
|
|
2292
|
+
*
|
|
2293
|
+
* Ported from ArtCraft effectcraft `crates/path/src/varstroke.rs` (`outline`, `dash_intervals`)
|
|
2294
|
+
* (MIT OR Apache-2.0, see THIRD_PARTY_NOTICES.md), with one-sided widths after figcraft
|
|
2295
|
+
* `crates/pathops/src/width.rs` (`variable_outline`).
|
|
2296
|
+
*/
|
|
2297
|
+
|
|
2298
|
+
interface VariableStrokeOptions {
|
|
2299
|
+
/** Stroke width: a side scale of 1 reaches half of it from the centre line. */
|
|
2300
|
+
width: number;
|
|
2301
|
+
profile: readonly VectorWidthPoint[];
|
|
2302
|
+
/** Joins at the path's own corners (default `miter`); bends inside curves are always round. */
|
|
2303
|
+
join?: StrokeJoin;
|
|
2304
|
+
/** Default `butt`. */
|
|
2305
|
+
cap?: StrokeCap;
|
|
2306
|
+
/** Default 4 (as SVG). */
|
|
2307
|
+
miterLimit?: number;
|
|
2308
|
+
/** Dash pattern (as SVG); the profile still runs along the whole subpath. */
|
|
2309
|
+
dash?: readonly number[];
|
|
2310
|
+
dashOffset?: number;
|
|
2311
|
+
/** Largest distance of the result from the exact outline (default 0.05). */
|
|
2312
|
+
tolerance?: number;
|
|
2313
|
+
}
|
|
2314
|
+
type Vec = [number, number];
|
|
2315
|
+
/** Arc-length intervals that are "on" for a dash pattern on a path `len` long (effectcraft `dash_intervals`). */
|
|
2316
|
+
declare function dashIntervals(pattern: readonly number[], offset: number, len: number): [number, number][];
|
|
2317
|
+
/**
|
|
2318
|
+
* The rings of a variable-width stroke in the path's own space; filled with the non-zero rule
|
|
2319
|
+
* they are the stroke.
|
|
2320
|
+
*
|
|
2321
|
+
* effectcraft builds the stroke as a union of positively wound pieces: a trapezoid per flattened
|
|
2322
|
+
* segment (its ends at the local side widths), a wedge on the outer side of every bend and the
|
|
2323
|
+
* caps. Unioning thousands of overlapping pieces is slow, so each run is emitted as the boundary
|
|
2324
|
+
* those pieces add up to instead (winding numbers add, so the non-zero fill is the same): the
|
|
2325
|
+
* offset sides with the outer join between them, and on the inner side of a bend either the point
|
|
2326
|
+
* where the two offsets cross (the region cut off is covered by both trapezoids) or, when they do
|
|
2327
|
+
* not cross, a detour through the centre point (which keeps the winding right when segments are
|
|
2328
|
+
* shorter than the width). A closed subpath gives two rings, an open run one.
|
|
2329
|
+
*/
|
|
2330
|
+
declare function variableStrokeRings(path: BezierPath, options: VariableStrokeOptions): Point[][];
|
|
2331
|
+
/**
|
|
2332
|
+
* The outline of a variable-width stroke of `path` (side widths from `profile`), as a clean
|
|
2333
|
+
* Bézier path: overlaps removed, outer rings and holes, each refitted with cubics to within
|
|
2334
|
+
* `tolerance` of the exact outline. Fill it with the non-zero rule (either rule works).
|
|
2335
|
+
*/
|
|
2336
|
+
declare function variableStrokeOutline(path: BezierPath, options: VariableStrokeOptions): BezierPath;
|
|
2337
|
+
/**
|
|
2338
|
+
* Where point `p` lies relative to the stroke's centre line: the nearest point's contour,
|
|
2339
|
+
* its position `t` by length (0–1), the distance, and the side (`left` looking along the
|
|
2340
|
+
* path on screen) — what hit-testing and the width tool need.
|
|
2341
|
+
*/
|
|
2342
|
+
declare function nearestStrokePosition(path: BezierPath, p: Point,
|
|
2343
|
+
/** Only this contour (subpath) of the path. */
|
|
2344
|
+
only?: number): {
|
|
2345
|
+
contour: number;
|
|
2346
|
+
t: number;
|
|
2347
|
+
distance: number;
|
|
2348
|
+
side: 'left' | 'right';
|
|
2349
|
+
point: Point;
|
|
2350
|
+
tangent: Vec;
|
|
2351
|
+
length: number;
|
|
2352
|
+
} | null;
|
|
2353
|
+
/** The point and unit tangent at position `t` (0–1 by length) of contour `index` of `path`. */
|
|
2354
|
+
declare function strokePositionPoint(path: BezierPath, index: number, t: number): {
|
|
2355
|
+
point: Point;
|
|
2356
|
+
tangent: Vec;
|
|
2357
|
+
} | null;
|
|
2358
|
+
|
|
2359
|
+
export { type AddVectorNodeOptions, AffineMatrix, DEFAULT_VECTOR_PATH_EDIT, DEFAULT_VECTOR_SNAP, IDENTITY_MATRIX, KAPPA, LazyMouse, type NearestSegment, type RecognizeInkOptions, SvgGradientDef, VECTOR_ARROWHEADS, VECTOR_ARROWHEAD_LABELS, VECTOR_CLIPBOARD_TYPE, VECTOR_CONSTRUCTION_ANGLES, VECTOR_CORNER_KINDS, VECTOR_CORNER_KIND_LABELS, VECTOR_CORNER_WIDGET_INSET, VECTOR_EDIT_TOGGLES, VECTOR_INK_MAX_CORNERS, VECTOR_OVERLAY_THEME, 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 VectorBooleanOperation, type VectorBounds, 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 VectorNode, type VectorNodeListing, type VectorOverlayRenderData, type VectorPaint, type VectorPathAction, type VectorPathEditOptions, type VectorPathNode, 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 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 VectorWidthPointRef, type VectorWidthPreset, type VectorWidthPresetInfo, applyMatrix, applyMatrixLinear, applyVectorCornersAttribute, arrowheadInset, arrowheadPath, arrowheadWeight, bendSegment, bezierToSubpaths, boundsFromPoints, boundsIntersect, cloneAnchor, cloneSubpath, cloneVectorDocument, cloneVectorNode, collectPathNodes, constrainToLeave, convertAnchor, cornerBisectorPoint, cornerRadiusChange, cornerSetback, createVectorCommands, curvatureMoveAnchor, cutSubpathAt, dashIntervals, decomposeRigid, effectiveStrokeAlign, ellipseSubpath, eraseFromFill, eraseFromOutline, eraserRegion, expandVectorCorners, expandVectorCornersOf, findVectorNode, fitCornerRadius, generateWidthProfile, getAnchor, getAnchorWorld, getEditablePathIds, getTransformHandlePositions, getVectorCornerWidgets, getVectorOverlayRenderData, getVectorSceneRenderData, getVectorSelectionBoxGeometry, getVectorSelectionFrame, getVectorSelectionStyle, getVectorWidthHandles, getVisibleAnchors, getVisibleHandles, hasPaint, hasStrokeExtras, hasVectorCorners, hitTestVectorNode, hitTestVectorNodes, hitTestVectorStroke, inferAnchorType, insertAnchor, insertWidthPoint, invertMatrix, isClosedBezierShape, isIdentityMatrix, isUniformWidthProfile, isVectorTextTarget, joinSubpaths, knifePath, lineSubpath, locateVectorNode, matrixRotation, mirrorWidthProfile, moveAnchorHandle, multiplyMatrices, nearestSegment, nearestStrokePosition, nextVectorCornerKind, nodeMatrix, parseSvgTransform, parseVectorSvg, polygonSubpath, polylineBounds, pressureWidthProfile, recognizeInkShape, rectSubpath, removeAnchorKeepingShape, removeAnchors, removeAnchorsKeepingShape, removeRedundantPoints, removeWidthPoints, reverseSubpath, reverseWidthProfile, rotateMatrix, roundSubpaths, sanitizeWidthProfile, scaleFor, scaleMatrix, setAnchorCorner, setSubpathCorners, setWidthPoint, simplifyPolyline, smoothSubpath, splitIntoFaces, splitSubpathAt, starSubpath, strokePositionPoint, strokeWidthProfileOf, subpathPointAt, subpathSegment, subpathSegmentCount, subpathsToBezier, taperWaveFactor, toVectorKeyInput, toVectorModifiers, toVectorPointerInput, transformVectorNode, translateAnchor, translateMatrix, unionBounds, variableStrokeOutline, variableStrokeRings, vectorCornerAt, vectorCorners, vectorCornersAttribute, vectorDiamondPath, vectorDocumentToSvg, vectorInkShapeName, vectorNodeBounds, vectorNodeRotation, vectorNodeToBezier, vectorPaintToHex, vectorPaintToSvg, vectorParentMatrix, vectorPathData, vectorPathWorldBezier, vectorResizeCursor, vectorStrokeLineArea, vectorStrokeOutline, vectorStrokeOutlinePath, vectorStrokeParts, vectorStrokeReach, vectorStrokeSvgParts, vectorStrokeWidthGeometry, vectorToolLabel, vectorWorldMatrix, walkVectorNodes, widthProfileAt, widthProfileFromAttribute, widthProfileMaxScale, widthProfilePreset, widthProfilePresetId, widthProfileToAttribute };
|