@pixerate/editor 0.57.0 → 0.58.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.
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Behaviours: how a change gets from `from` to `to` other than straight along its ease (a
3
+ * pulse there and back, an oscillation, a seeded wriggle, a springy overshoot). Ported from
4
+ * `@pixerate/flair` (MIT): `SvgBehavior` and `behaviorProgress` in `vector/motion.ts`, the
5
+ * oscillate and overshoot evaluators in `scene/behavior.ts` and the noise in `time/noise.ts`.
6
+ * The numbers must stay identical to Flair's, so a behaviour exported to Flair plays the same
7
+ * frames there as here (the animation editor writes them as Flair `behavior`s, Flair ≥ 0.38).
8
+ */
9
+ /**
10
+ * A behaviour: its progress `u` at each moment, where 0 is `from`, 1 is `to`, and numbers go
11
+ * past either. `t` is the change's time, 0–1, through its ease (linear unless given).
12
+ *
13
+ * - `pulse`: there and back `count` times (default 1): u = sin²(π·count·t).
14
+ * - `oscillate`: swings round `from`, out to `to` and as far the other way, `count` times
15
+ * (default 1), dying away by (1 − t)^`decay` (default 0, no decay).
16
+ * - `wriggle`: wanders round `from` by up to about `to − from`, as seeded smooth fractal noise
17
+ * at `frequency` Hz (default 2) with `octaves` layers (default 2); each number in a value
18
+ * wanders on its own channel. It eases out of and back to rest over the first and last 15%
19
+ * of its time. The same `seed` (default 42) gives the same wander.
20
+ * - `overshoot`: goes to `to`, past it and back, settling like a spring:
21
+ * u = 1 − e^(−damping·t)·cos(cycles·π·t) (default 3 cycles, damping 4).
22
+ */
23
+ type MotionBehavior = {
24
+ type: 'pulse';
25
+ count?: number;
26
+ } | {
27
+ type: 'oscillate';
28
+ count?: number;
29
+ decay?: number;
30
+ wave?: 'sine' | 'triangle' | 'square' | 'sawtooth';
31
+ } | {
32
+ type: 'wriggle';
33
+ frequency?: number;
34
+ octaves?: number;
35
+ seed?: number;
36
+ } | {
37
+ type: 'overshoot';
38
+ cycles?: number;
39
+ damping?: number;
40
+ };
41
+ /** Every `MotionBehavior` type. */
42
+ declare const MOTION_BEHAVIORS: readonly ["pulse", "oscillate", "wriggle", "overshoot"];
43
+ /**
44
+ * A behaviour's progress at `t` (0–1, eased) of a change lasting `ms`, for the `index`-th number
45
+ * in a value (only a wriggle tells numbers apart).
46
+ */
47
+ declare function behaviorProgress(behavior: MotionBehavior, t: number, index?: number, ms?: number): number;
48
+ /** Whether `value` is a well-formed `MotionBehavior`. */
49
+ declare function isMotionBehavior(value: unknown): value is MotionBehavior;
50
+ /** A seed from an id (FNV-1a), so each element wriggles its own way: Flair's `seedOf`. */
51
+ declare function motionSeedFromId(id: string): number;
52
+ /** 6t⁵ − 15t⁴ + 10t³: zero slope and curvature at 0 and 1. */
53
+ declare function quinticFade(t: number): number;
54
+ /**
55
+ * Multi-octave smooth noise (After Effects' `wiggle`): the sum over `octaves` of
56
+ * amp·ampMult^k · noise(freq·2^k·t), each octave and `dimension` seeded apart. `t` in seconds.
57
+ */
58
+ declare function fractalWiggle(freq: number, amp: number, octaves?: number, ampMult?: number, t?: number, seed?: number, dimension?: number): number;
59
+
60
+ export { MOTION_BEHAVIORS as M, type MotionBehavior as a, behaviorProgress as b, fractalWiggle as f, isMotionBehavior as i, motionSeedFromId as m, quinticFade as q };
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Behaviours: how a change gets from `from` to `to` other than straight along its ease (a
3
+ * pulse there and back, an oscillation, a seeded wriggle, a springy overshoot). Ported from
4
+ * `@pixerate/flair` (MIT): `SvgBehavior` and `behaviorProgress` in `vector/motion.ts`, the
5
+ * oscillate and overshoot evaluators in `scene/behavior.ts` and the noise in `time/noise.ts`.
6
+ * The numbers must stay identical to Flair's, so a behaviour exported to Flair plays the same
7
+ * frames there as here (the animation editor writes them as Flair `behavior`s, Flair ≥ 0.38).
8
+ */
9
+ /**
10
+ * A behaviour: its progress `u` at each moment, where 0 is `from`, 1 is `to`, and numbers go
11
+ * past either. `t` is the change's time, 0–1, through its ease (linear unless given).
12
+ *
13
+ * - `pulse`: there and back `count` times (default 1): u = sin²(π·count·t).
14
+ * - `oscillate`: swings round `from`, out to `to` and as far the other way, `count` times
15
+ * (default 1), dying away by (1 − t)^`decay` (default 0, no decay).
16
+ * - `wriggle`: wanders round `from` by up to about `to − from`, as seeded smooth fractal noise
17
+ * at `frequency` Hz (default 2) with `octaves` layers (default 2); each number in a value
18
+ * wanders on its own channel. It eases out of and back to rest over the first and last 15%
19
+ * of its time. The same `seed` (default 42) gives the same wander.
20
+ * - `overshoot`: goes to `to`, past it and back, settling like a spring:
21
+ * u = 1 − e^(−damping·t)·cos(cycles·π·t) (default 3 cycles, damping 4).
22
+ */
23
+ type MotionBehavior = {
24
+ type: 'pulse';
25
+ count?: number;
26
+ } | {
27
+ type: 'oscillate';
28
+ count?: number;
29
+ decay?: number;
30
+ wave?: 'sine' | 'triangle' | 'square' | 'sawtooth';
31
+ } | {
32
+ type: 'wriggle';
33
+ frequency?: number;
34
+ octaves?: number;
35
+ seed?: number;
36
+ } | {
37
+ type: 'overshoot';
38
+ cycles?: number;
39
+ damping?: number;
40
+ };
41
+ /** Every `MotionBehavior` type. */
42
+ declare const MOTION_BEHAVIORS: readonly ["pulse", "oscillate", "wriggle", "overshoot"];
43
+ /**
44
+ * A behaviour's progress at `t` (0–1, eased) of a change lasting `ms`, for the `index`-th number
45
+ * in a value (only a wriggle tells numbers apart).
46
+ */
47
+ declare function behaviorProgress(behavior: MotionBehavior, t: number, index?: number, ms?: number): number;
48
+ /** Whether `value` is a well-formed `MotionBehavior`. */
49
+ declare function isMotionBehavior(value: unknown): value is MotionBehavior;
50
+ /** A seed from an id (FNV-1a), so each element wriggles its own way: Flair's `seedOf`. */
51
+ declare function motionSeedFromId(id: string): number;
52
+ /** 6t⁵ − 15t⁴ + 10t³: zero slope and curvature at 0 and 1. */
53
+ declare function quinticFade(t: number): number;
54
+ /**
55
+ * Multi-octave smooth noise (After Effects' `wiggle`): the sum over `octaves` of
56
+ * amp·ampMult^k · noise(freq·2^k·t), each octave and `dimension` seeded apart. `t` in seconds.
57
+ */
58
+ declare function fractalWiggle(freq: number, amp: number, octaves?: number, ampMult?: number, t?: number, seed?: number, dimension?: number): number;
59
+
60
+ export { MOTION_BEHAVIORS as M, type MotionBehavior as a, behaviorProgress as b, fractalWiggle as f, isMotionBehavior as i, motionSeedFromId as m, quinticFade as q };
@@ -0,0 +1,122 @@
1
+ // src/animation/behavior.ts
2
+ var MOTION_BEHAVIORS = ["pulse", "oscillate", "wriggle", "overshoot"];
3
+ var WRIGGLE_EDGE = 0.15;
4
+ function wave(kind, angle) {
5
+ switch (kind) {
6
+ case "square":
7
+ return Math.sin(angle) >= 0 ? 1 : -1;
8
+ case "triangle":
9
+ return 2 / Math.PI * Math.asin(Math.sin(angle));
10
+ case "sawtooth": {
11
+ const norm = angle / (2 * Math.PI) % 1;
12
+ return 2 * (norm < 0 ? norm + 1 : norm) - 1;
13
+ }
14
+ default:
15
+ return Math.sin(angle);
16
+ }
17
+ }
18
+ function behaviorProgress(behavior, t, index = 0, ms = 800) {
19
+ const time = Math.max(0, t);
20
+ switch (behavior.type) {
21
+ case "pulse":
22
+ return 0.5 + 0.5 * Math.sin(2 * Math.PI * (behavior.count ?? 1) * time - Math.PI / 2);
23
+ case "oscillate": {
24
+ const w = wave(behavior.wave, 2 * Math.PI * (behavior.count ?? 1) * time);
25
+ const decay = behavior.decay ?? 0;
26
+ return decay > 0 ? w * Math.max(0, 1 - t) ** decay : w;
27
+ }
28
+ case "wriggle": {
29
+ const edge = quinticFade(Math.min(1, Math.max(0, Math.min(t, 1 - t) / WRIGGLE_EDGE)));
30
+ if (edge === 0) return 0;
31
+ return edge * fractalWiggle(behavior.frequency ?? 2, 1, behavior.octaves ?? 2, 0.5, t * ms / 1e3, behavior.seed ?? 42, index);
32
+ }
33
+ case "overshoot": {
34
+ const p = Math.min(1, time);
35
+ if (p >= 1) return 1;
36
+ return 1 - Math.exp(-(behavior.damping ?? 4) * p) * Math.cos((behavior.cycles ?? 3) * Math.PI * p);
37
+ }
38
+ }
39
+ }
40
+ function isMotionBehavior(value) {
41
+ if (typeof value !== "object" || value === null) return false;
42
+ const b = value;
43
+ const positive = (k) => b[k] === void 0 || typeof b[k] === "number" && Number.isFinite(b[k]) && b[k] > 0;
44
+ const atLeastZero = (k) => b[k] === void 0 || typeof b[k] === "number" && Number.isFinite(b[k]) && b[k] >= 0;
45
+ switch (b.type) {
46
+ case "pulse":
47
+ return positive("count");
48
+ case "oscillate":
49
+ return positive("count") && atLeastZero("decay") && (b.wave === void 0 || ["sine", "triangle", "square", "sawtooth"].includes(b.wave));
50
+ case "wriggle":
51
+ return positive("frequency") && positive("octaves") && (b.seed === void 0 || Number.isInteger(b.seed));
52
+ case "overshoot":
53
+ return positive("cycles") && atLeastZero("damping");
54
+ default:
55
+ return false;
56
+ }
57
+ }
58
+ function motionSeedFromId(id) {
59
+ let h = 2166136261;
60
+ for (let i = 0; i < id.length; i++) h = Math.imul(h ^ id.charCodeAt(i), 16777619);
61
+ return (h >>> 0) % 2147483647 || 1;
62
+ }
63
+ var GOLDEN_GAMMA = 0x9e3779b97f4a7c15n;
64
+ var MULT1 = 0xbf58476d1ce4e5b9n;
65
+ var MULT2 = 0x94d049bb133111ebn;
66
+ var MASK64 = 0xffffffffffffffffn;
67
+ var BASE_MIX = 0x2545f4914f6cdd1dn;
68
+ var POW2_53 = 9007199254740992;
69
+ function hash64(x) {
70
+ let v = x + GOLDEN_GAMMA & MASK64;
71
+ v = (v ^ v >> 30n) * MULT1 & MASK64;
72
+ v = (v ^ v >> 27n) * MULT2 & MASK64;
73
+ return (v ^ v >> 31n) & MASK64;
74
+ }
75
+ function mixSeeds(parts) {
76
+ let h = BASE_MIX;
77
+ for (const p of parts) {
78
+ const val = typeof p === "bigint" ? p : BigInt(Math.floor(p));
79
+ h = hash64(h ^ hash64(val & MASK64));
80
+ }
81
+ return h;
82
+ }
83
+ function unitFloat(seed) {
84
+ return Number(hash64(seed) >> 11n) / POW2_53;
85
+ }
86
+ function quinticFade(t) {
87
+ return t * t * t * (t * (t * 6 - 15) + 10);
88
+ }
89
+ function noise1d(seed, x) {
90
+ if (!Number.isFinite(x)) return 0;
91
+ const floorX = Math.floor(x);
92
+ const u = quinticFade(x - floorX);
93
+ const i = BigInt(floorX);
94
+ const a = unitFloat(seed ^ hash64(i & MASK64)) * 2 - 1;
95
+ const b = unitFloat(seed ^ hash64(i + 1n & MASK64)) * 2 - 1;
96
+ return a + (b - a) * u;
97
+ }
98
+ function fractalWiggle(freq, amp, octaves = 3, ampMult = 0.5, t = 0, seed = 42, dimension = 0) {
99
+ const oct = Math.max(1, Math.min(16, Math.floor(octaves)));
100
+ let currentAmp = amp;
101
+ let currentFreq = freq;
102
+ let sum = 0;
103
+ const baseSeed = BigInt(Math.floor(seed));
104
+ for (let k = 0; k < oct; k++) {
105
+ const s = mixSeeds([baseSeed, BigInt(dimension), BigInt(k)]);
106
+ const phaseOffset = unitFloat(s) * 1e3;
107
+ sum += currentAmp * noise1d(s, currentFreq * t + phaseOffset);
108
+ currentAmp *= ampMult;
109
+ currentFreq *= 2;
110
+ }
111
+ return sum;
112
+ }
113
+
114
+ export {
115
+ MOTION_BEHAVIORS,
116
+ behaviorProgress,
117
+ isMotionBehavior,
118
+ motionSeedFromId,
119
+ quinticFade,
120
+ fractalWiggle
121
+ };
122
+ //# sourceMappingURL=chunk-3NYXDBBW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/animation/behavior.ts"],"sourcesContent":["/**\n * Behaviours: how a change gets from `from` to `to` other than straight along its ease (a\n * pulse there and back, an oscillation, a seeded wriggle, a springy overshoot). Ported from\n * `@pixerate/flair` (MIT): `SvgBehavior` and `behaviorProgress` in `vector/motion.ts`, the\n * oscillate and overshoot evaluators in `scene/behavior.ts` and the noise in `time/noise.ts`.\n * The numbers must stay identical to Flair's, so a behaviour exported to Flair plays the same\n * frames there as here (the animation editor writes them as Flair `behavior`s, Flair ≥ 0.38).\n */\n\n/**\n * A behaviour: its progress `u` at each moment, where 0 is `from`, 1 is `to`, and numbers go\n * past either. `t` is the change's time, 0–1, through its ease (linear unless given).\n *\n * - `pulse`: there and back `count` times (default 1): u = sin²(π·count·t).\n * - `oscillate`: swings round `from`, out to `to` and as far the other way, `count` times\n * (default 1), dying away by (1 − t)^`decay` (default 0, no decay).\n * - `wriggle`: wanders round `from` by up to about `to − from`, as seeded smooth fractal noise\n * at `frequency` Hz (default 2) with `octaves` layers (default 2); each number in a value\n * wanders on its own channel. It eases out of and back to rest over the first and last 15%\n * of its time. The same `seed` (default 42) gives the same wander.\n * - `overshoot`: goes to `to`, past it and back, settling like a spring:\n * u = 1 − e^(−damping·t)·cos(cycles·π·t) (default 3 cycles, damping 4).\n */\nexport type MotionBehavior =\n\t| { type: 'pulse'; count?: number }\n\t| { type: 'oscillate'; count?: number; decay?: number; wave?: 'sine' | 'triangle' | 'square' | 'sawtooth' }\n\t| { type: 'wriggle'; frequency?: number; octaves?: number; seed?: number }\n\t| { type: 'overshoot'; cycles?: number; damping?: number };\n\n/** Every `MotionBehavior` type. */\nexport const MOTION_BEHAVIORS = ['pulse', 'oscillate', 'wriggle', 'overshoot'] as const;\n\n/** Share of a wriggle's time spent easing out of and back to rest, at each end. */\nconst WRIGGLE_EDGE = 0.15;\n\nfunction wave(kind: 'sine' | 'triangle' | 'square' | 'sawtooth' | undefined, angle: number): number {\n\tswitch (kind) {\n\t\tcase 'square':\n\t\t\treturn Math.sin(angle) >= 0 ? 1 : -1;\n\t\tcase 'triangle':\n\t\t\treturn (2 / Math.PI) * Math.asin(Math.sin(angle));\n\t\tcase 'sawtooth': {\n\t\t\tconst norm = (angle / (2 * Math.PI)) % 1;\n\t\t\treturn 2 * (norm < 0 ? norm + 1 : norm) - 1;\n\t\t}\n\t\tdefault:\n\t\t\treturn Math.sin(angle);\n\t}\n}\n\n/**\n * A behaviour's progress at `t` (0–1, eased) of a change lasting `ms`, for the `index`-th number\n * in a value (only a wriggle tells numbers apart).\n */\nexport function behaviorProgress(behavior: MotionBehavior, t: number, index = 0, ms = 800): number {\n\tconst time = Math.max(0, t);\n\tswitch (behavior.type) {\n\t\tcase 'pulse':\n\t\t\t// sin²(πct) = (1 − cos 2πct) / 2: written as Flair writes it, so the numbers match.\n\t\t\treturn 0.5 + 0.5 * Math.sin(2 * Math.PI * (behavior.count ?? 1) * time - Math.PI / 2);\n\t\tcase 'oscillate': {\n\t\t\tconst w = wave(behavior.wave, 2 * Math.PI * (behavior.count ?? 1) * time);\n\t\t\tconst decay = behavior.decay ?? 0;\n\t\t\treturn decay > 0 ? w * Math.max(0, 1 - t) ** decay : w;\n\t\t}\n\t\tcase 'wriggle': {\n\t\t\tconst edge = quinticFade(Math.min(1, Math.max(0, Math.min(t, 1 - t) / WRIGGLE_EDGE)));\n\t\t\tif (edge === 0) return 0;\n\t\t\treturn edge * fractalWiggle(behavior.frequency ?? 2, 1, behavior.octaves ?? 2, 0.5, (t * ms) / 1000, behavior.seed ?? 42, index);\n\t\t}\n\t\tcase 'overshoot': {\n\t\t\tconst p = Math.min(1, time);\n\t\t\tif (p >= 1) return 1;\n\t\t\treturn 1 - Math.exp(-(behavior.damping ?? 4) * p) * Math.cos((behavior.cycles ?? 3) * Math.PI * p);\n\t\t}\n\t}\n}\n\n/** Whether `value` is a well-formed `MotionBehavior`. */\nexport function isMotionBehavior(value: unknown): value is MotionBehavior {\n\tif (typeof value !== 'object' || value === null) return false;\n\tconst b = value as Record<string, unknown>;\n\tconst positive = (k: string) => b[k] === undefined || (typeof b[k] === 'number' && Number.isFinite(b[k]) && (b[k] as number) > 0);\n\tconst atLeastZero = (k: string) => b[k] === undefined || (typeof b[k] === 'number' && Number.isFinite(b[k]) && (b[k] as number) >= 0);\n\tswitch (b.type) {\n\t\tcase 'pulse':\n\t\t\treturn positive('count');\n\t\tcase 'oscillate':\n\t\t\treturn positive('count') && atLeastZero('decay') && (b.wave === undefined || ['sine', 'triangle', 'square', 'sawtooth'].includes(b.wave as string));\n\t\tcase 'wriggle':\n\t\t\treturn positive('frequency') && positive('octaves') && (b.seed === undefined || Number.isInteger(b.seed));\n\t\tcase 'overshoot':\n\t\t\treturn positive('cycles') && atLeastZero('damping');\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/** A seed from an id (FNV-1a), so each element wriggles its own way: Flair's `seedOf`. */\nexport function motionSeedFromId(id: string): number {\n\tlet h = 0x811c9dc5;\n\tfor (let i = 0; i < id.length; i++) h = Math.imul(h ^ id.charCodeAt(i), 0x01000193);\n\treturn (h >>> 0) % 2147483647 || 1;\n}\n\n// ── Noise (SplitMix64 hashing, quintic value noise), as Flair's `time/noise.ts` ─────────────\n\nconst GOLDEN_GAMMA = 0x9e3779b97f4a7c15n;\nconst MULT1 = 0xbf58476d1ce4e5b9n;\nconst MULT2 = 0x94d049bb133111ebn;\nconst MASK64 = 0xffffffffffffffffn;\nconst BASE_MIX = 0x2545f4914f6cdd1dn;\nconst POW2_53 = 9007199254740992;\n\nfunction hash64(x: bigint): bigint {\n\tlet v = (x + GOLDEN_GAMMA) & MASK64;\n\tv = ((v ^ (v >> 30n)) * MULT1) & MASK64;\n\tv = ((v ^ (v >> 27n)) * MULT2) & MASK64;\n\treturn (v ^ (v >> 31n)) & MASK64;\n}\n\nfunction mixSeeds(parts: (bigint | number)[]): bigint {\n\tlet h = BASE_MIX;\n\tfor (const p of parts) {\n\t\tconst val = typeof p === 'bigint' ? p : BigInt(Math.floor(p));\n\t\th = hash64(h ^ hash64(val & MASK64));\n\t}\n\treturn h;\n}\n\nfunction unitFloat(seed: bigint): number {\n\treturn Number(hash64(seed) >> 11n) / POW2_53;\n}\n\n/** 6t⁵ − 15t⁴ + 10t³: zero slope and curvature at 0 and 1. */\nexport function quinticFade(t: number): number {\n\treturn t * t * t * (t * (t * 6.0 - 15.0) + 10.0);\n}\n\nfunction noise1d(seed: bigint, x: number): number {\n\tif (!Number.isFinite(x)) return 0;\n\tconst floorX = Math.floor(x);\n\tconst u = quinticFade(x - floorX);\n\tconst i = BigInt(floorX);\n\tconst a = unitFloat(seed ^ hash64(i & MASK64)) * 2 - 1;\n\tconst b = unitFloat(seed ^ hash64((i + 1n) & MASK64)) * 2 - 1;\n\treturn a + (b - a) * u;\n}\n\n/**\n * Multi-octave smooth noise (After Effects' `wiggle`): the sum over `octaves` of\n * amp·ampMult^k · noise(freq·2^k·t), each octave and `dimension` seeded apart. `t` in seconds.\n */\nexport function fractalWiggle(freq: number, amp: number, octaves = 3, ampMult = 0.5, t = 0, seed = 42, dimension = 0): number {\n\tconst oct = Math.max(1, Math.min(16, Math.floor(octaves)));\n\tlet currentAmp = amp;\n\tlet currentFreq = freq;\n\tlet sum = 0;\n\tconst baseSeed = BigInt(Math.floor(seed));\n\tfor (let k = 0; k < oct; k++) {\n\t\tconst s = mixSeeds([baseSeed, BigInt(dimension), BigInt(k)]);\n\t\tconst phaseOffset = unitFloat(s) * 1000.0;\n\t\tsum += currentAmp * noise1d(s, currentFreq * t + phaseOffset);\n\t\tcurrentAmp *= ampMult;\n\t\tcurrentFreq *= 2.0;\n\t}\n\treturn sum;\n}\n"],"mappings":"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","names":[]}
@@ -5195,10 +5195,25 @@ function vectorDocumentToSvg(doc, options = {}) {
5195
5195
  };
5196
5196
  const emit2 = (node, depth) => {
5197
5197
  if (node.visible === false && !options.includeHidden) return;
5198
+ const wrappers = _nullishCoalesce(_optionalChain([options, 'access', _90 => _90.wrap, 'optionalAccess', _91 => _91[node.id]]), () => ( []));
5199
+ wrappers.forEach((w2, i) => {
5200
+ let attrs = w2.id !== void 0 ? ` id="${escapeAttr(w2.id)}"` : "";
5201
+ if (w2.transform) attrs += ` transform="${escapeAttr(w2.transform)}"`;
5202
+ if (w2.clip) {
5203
+ const shape = Object.entries(w2.clip.attrs).map(([k, v2]) => ` ${k}="${_chunkO2UH7LZEcjs.formatNumber.call(void 0, v2, 4)}"`).join("");
5204
+ defs.push(`<clipPath id="${escapeAttr(w2.clip.id)}" clipPathUnits="objectBoundingBox"><${w2.clip.shape}${w2.clip.shapeId !== void 0 ? ` id="${escapeAttr(w2.clip.shapeId)}"` : ""}${shape}/></clipPath>`);
5205
+ attrs += ` clip-path="url(#${escapeAttr(w2.clip.id)})"`;
5206
+ }
5207
+ lines.push(`${indent(depth + i)}<g${attrs}>`);
5208
+ });
5209
+ emitNode(node, depth + wrappers.length);
5210
+ for (let i = wrappers.length - 1; i >= 0; i--) lines.push(`${indent(depth + i)}</g>`);
5211
+ };
5212
+ const emitNode = (node, depth) => {
5198
5213
  if (hasOwnVectorAppearance(node)) {
5199
5214
  const live2 = {
5200
5215
  kind: node.type,
5201
- ..._optionalChain([node, 'access', _90 => _90.effects, 'optionalAccess', _91 => _91.length]) ? { effects: node.effects } : {},
5216
+ ..._optionalChain([node, 'access', _92 => _92.effects, 'optionalAccess', _93 => _93.length]) ? { effects: node.effects } : {},
5202
5217
  ...node.type === "group" && node.liveBoolean ? { liveBoolean: node.liveBoolean } : {}
5203
5218
  };
5204
5219
  lines.push(`${indent(depth)}<g${common(node)} data-vector-live="${escapeAttr(JSON.stringify(live2))}">`);
@@ -5231,7 +5246,7 @@ function vectorDocumentToSvg(doc, options = {}) {
5231
5246
  let out2 = ` stroke="${escapeAttr(stroke.value)}" stroke-width="${num2(width)}"`;
5232
5247
  if (node.strokeLinecap && node.strokeLinecap !== "butt") out2 += ` stroke-linecap="${node.strokeLinecap}"`;
5233
5248
  if (node.strokeLinejoin && node.strokeLinejoin !== "miter") out2 += ` stroke-linejoin="${node.strokeLinejoin}"`;
5234
- if (_optionalChain([node, 'access', _92 => _92.strokeDasharray, 'optionalAccess', _93 => _93.length])) out2 += ` stroke-dasharray="${node.strokeDasharray.map(num2).join(" ")}"`;
5249
+ if (_optionalChain([node, 'access', _94 => _94.strokeDasharray, 'optionalAccess', _95 => _95.length])) out2 += ` stroke-dasharray="${node.strokeDasharray.map(num2).join(" ")}"`;
5235
5250
  return out2;
5236
5251
  };
5237
5252
  const parts = stroke.value !== "none" ? vectorStrokeSvgParts(node, `${prefix}clip-${node.id}`, precision) : void 0;
@@ -5251,7 +5266,7 @@ function vectorDocumentToSvg(doc, options = {}) {
5251
5266
  data += ` data-vector-width-profile="${widthProfileToAttribute(profile)}"`;
5252
5267
  if (node.strokeLinecap && node.strokeLinecap !== "butt") data += ` data-vector-stroke-linecap="${node.strokeLinecap}"`;
5253
5268
  if (node.strokeLinejoin && node.strokeLinejoin !== "miter") data += ` data-vector-stroke-linejoin="${node.strokeLinejoin}"`;
5254
- if (_optionalChain([node, 'access', _94 => _94.strokeDasharray, 'optionalAccess', _95 => _95.length])) data += ` data-vector-stroke-dasharray="${node.strokeDasharray.map(num2).join(" ")}"`;
5269
+ if (_optionalChain([node, 'access', _96 => _96.strokeDasharray, 'optionalAccess', _97 => _97.length])) data += ` data-vector-stroke-dasharray="${node.strokeDasharray.map(num2).join(" ")}"`;
5255
5270
  }
5256
5271
  lines.push(`${indent(depth)}<g${common(node)}${data}>`);
5257
5272
  lines.push(`${indent(depth + 1)}<path data-vector-part="fill" d="${d}"${fillAttrs}${live}/>`);
@@ -5434,9 +5449,9 @@ function resolveGradient(id, raw) {
5434
5449
  for (let el = first; el && !chain.includes(el) && chain.length < 32; ) {
5435
5450
  chain.push(el);
5436
5451
  const href = _nullishCoalesce(el.attrs.href, () => ( el.attrs["xlink:href"]));
5437
- el = _optionalChain([href, 'optionalAccess', _96 => _96.startsWith, 'call', _97 => _97("#")]) ? raw.get(href.slice(1)) : void 0;
5452
+ el = _optionalChain([href, 'optionalAccess', _98 => _98.startsWith, 'call', _99 => _99("#")]) ? raw.get(href.slice(1)) : void 0;
5438
5453
  }
5439
- const attr = (name) => _optionalChain([chain, 'access', _98 => _98.find, 'call', _99 => _99((el) => el.attrs[name] !== void 0), 'optionalAccess', _100 => _100.attrs, 'access', _101 => _101[name]]);
5454
+ const attr = (name) => _optionalChain([chain, 'access', _100 => _100.find, 'call', _101 => _101((el) => el.attrs[name] !== void 0), 'optionalAccess', _102 => _102.attrs, 'access', _103 => _103[name]]);
5440
5455
  const stops = _nullishCoalesce(chain.map(readStops).find((s) => s.length), () => ( []));
5441
5456
  if (!stops.length) return null;
5442
5457
  const user = attr("gradientUnits") === "userSpaceOnUse";
@@ -5586,7 +5601,7 @@ function parseVectorSvg(svg, options = {}) {
5586
5601
  const part = (name) => g.children.find((c) => c.name === "path" && c.attrs["data-vector-part"] === name);
5587
5602
  const fillEl = part("fill");
5588
5603
  const subpaths = fillEl ? shapeOf(fillEl) : null;
5589
- if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _102 => _102.length])) return null;
5604
+ if (!fillEl || !_optionalChain([subpaths, 'optionalAccess', _104 => _104.length])) return null;
5590
5605
  const a = g.attrs;
5591
5606
  const fs = readStyle(fillEl, style);
5592
5607
  const strokeEl = part("stroke");
@@ -5623,7 +5638,7 @@ function parseVectorSvg(svg, options = {}) {
5623
5638
  ...profile.length ? { strokeWidthProfile: profile } : {},
5624
5639
  ...keptCap ? { strokeLinecap: keptCap } : {},
5625
5640
  ...keptJoin ? { strokeLinejoin: keptJoin } : {},
5626
- ..._optionalChain([keptDash, 'optionalAccess', _103 => _103.length]) ? { strokeDasharray: keptDash } : {}
5641
+ ..._optionalChain([keptDash, 'optionalAccess', _105 => _105.length]) ? { strokeDasharray: keptDash } : {}
5627
5642
  };
5628
5643
  return placed(node, m);
5629
5644
  };
@@ -5976,4 +5991,4 @@ function parseVectorSvg(svg, options = {}) {
5976
5991
 
5977
5992
 
5978
5993
  exports.VECTOR_CORNER_KINDS = VECTOR_CORNER_KINDS; exports.VECTOR_GRADIENT_TYPES = VECTOR_GRADIENT_TYPES; exports.VECTOR_GRADIENT_SPREADS = VECTOR_GRADIENT_SPREADS; exports.VECTOR_GRADIENT_INTERPOLATIONS = VECTOR_GRADIENT_INTERPOLATIONS; exports.VECTOR_STROKE_GRADIENT_MODES = VECTOR_STROKE_GRADIENT_MODES; exports.VECTOR_ARROWHEADS = VECTOR_ARROWHEADS; exports.VECTOR_BLEND_SPACINGS = VECTOR_BLEND_SPACINGS; exports.VECTOR_TOOLS = VECTOR_TOOLS; exports.VECTOR_TRANSFORM_HANDLES = VECTOR_TRANSFORM_HANDLES; exports.VECTOR_PATHFINDER_OPERATIONS = VECTOR_PATHFINDER_OPERATIONS; exports.VECTOR_EFFECT_TYPES = VECTOR_EFFECT_TYPES; exports.VECTOR_MERGE_MODES = VECTOR_MERGE_MODES; exports.isVectorGradient = isVectorGradient; exports.parseVectorColor = parseVectorColor; exports.VECTOR_GRADIENT_MIN_STOPS = VECTOR_GRADIENT_MIN_STOPS; exports.gradientMidpointRemap = gradientMidpointRemap; exports.sortedVectorGradientStops = sortedVectorGradientStops; exports.vectorGradientNeedsExpansion = vectorGradientNeedsExpansion; exports.vectorGradientRamp = vectorGradientRamp; exports.sampleVectorGradient = sampleVectorGradient; exports.expandVectorGradientStops = expandVectorGradientStops; exports.samplePlainStops = samplePlainStops; exports.reverseVectorGradient = reverseVectorGradient; exports.insertVectorGradientStop = insertVectorGradientStop; exports.moveVectorGradientStop = moveVectorGradientStop; exports.removeVectorGradientStop = removeVectorGradientStop; exports.vectorGradientMidpointPosition = vectorGradientMidpointPosition; exports.vectorGradientMidpointFromPosition = vectorGradientMidpointFromPosition; exports.spanVectorGradientStops = spanVectorGradientStops; exports.hasExplicitGradientGeometry = hasExplicitGradientGeometry; exports.vectorGradientPoints = vectorGradientPoints; exports.vectorBoxMatrix = vectorBoxMatrix; exports.vectorGradientUnitsMatrix = vectorGradientUnitsMatrix; exports.vectorGradientMatrix = vectorGradientMatrix; exports.vectorGradientFocalParam = vectorGradientFocalParam; exports.vectorGradientParam = vectorGradientParam; exports.applyVectorGradientSpread = applyVectorGradientSpread; exports.vectorGradientTAt = vectorGradientTAt; exports.sampleVectorGradientAt = sampleVectorGradientAt; exports.vectorGradientAspect = vectorGradientAspect; exports.explicitVectorGradient = explicitVectorGradient; exports.pinVectorGradient = pinVectorGradient; exports.transformVectorGradient = transformVectorGradient; exports.mapVectorGradient = mapVectorGradient; exports.mapVectorPaint = mapVectorPaint; exports.transformVectorPaint = transformVectorPaint; exports.isCentredVectorGradient = isCentredVectorGradient; exports.vectorGradientHandles = vectorGradientHandles; exports.moveVectorGradientHandle = moveVectorGradientHandle; exports.setVectorGradientVector = setVectorGradientVector; exports.VECTOR_GRADIENT_MAX_PERIODS = VECTOR_GRADIENT_MAX_PERIODS; exports.periodicVectorGradientStops = periodicVectorGradientStops; exports.expandVectorGradientSpread = expandVectorGradientSpread; exports.vectorGradientArea = vectorGradientArea; exports.patternAttrs = patternAttrs; exports.vectorGradientSvgDefs = vectorGradientSvgDefs; exports.sampleVectorPaintDefAt = sampleVectorPaintDefAt; exports.sanitizeVectorGradient = sanitizeVectorGradient; exports.convertVectorGradient = convertVectorGradient; exports.defaultVectorGradient = defaultVectorGradient; exports.applyVectorGradientPatch = applyVectorGradientPatch; exports.vectorCornerAt = vectorCornerAt; exports.vectorCorners = vectorCorners; exports.cornerSetback = cornerSetback; exports.fitCornerRadius = fitCornerRadius; exports.cornerBisectorPoint = cornerBisectorPoint; exports.cornerRadiusChange = cornerRadiusChange; exports.hasVectorCorners = hasVectorCorners; exports.expandVectorCornersOf = expandVectorCornersOf; exports.expandVectorCorners = expandVectorCorners; exports.setAnchorCorner = setAnchorCorner; exports.nextVectorCornerKind = nextVectorCornerKind; exports.setSubpathCorners = setSubpathCorners; exports.VECTOR_WIDTH_PROFILE_MAX_POINTS = VECTOR_WIDTH_PROFILE_MAX_POINTS; exports.VECTOR_WIDTH_PROFILE_MAX_SCALE = VECTOR_WIDTH_PROFILE_MAX_SCALE; exports.VECTOR_WIDTH_SAME_T = VECTOR_WIDTH_SAME_T; exports.VECTOR_WIDTH_PRESETS = VECTOR_WIDTH_PRESETS; exports.VECTOR_WIDTH_PRESET_IDS = VECTOR_WIDTH_PRESET_IDS; exports.sanitizeWidthProfile = sanitizeWidthProfile; exports.isUniformWidthProfile = isUniformWidthProfile; exports.widthProfileAt = widthProfileAt; exports.widthProfileMaxScale = widthProfileMaxScale; exports.widthProfilePreset = widthProfilePreset; exports.widthProfilePresetId = widthProfilePresetId; exports.reverseWidthProfile = reverseWidthProfile; exports.mirrorWidthProfile = mirrorWidthProfile; exports.insertWidthPoint = insertWidthPoint; exports.setWidthPoint = setWidthPoint; exports.removeWidthPoints = removeWidthPoints; exports.taperWaveFactor = taperWaveFactor; exports.generateWidthProfile = generateWidthProfile; exports.VECTOR_PRESSURE_NOMINAL = VECTOR_PRESSURE_NOMINAL; exports.pressureWidthProfile = pressureWidthProfile; exports.dashIntervals = dashIntervals; exports.variableStrokeRings = variableStrokeRings; exports.variableStrokeOutline = variableStrokeOutline; exports.nearestStrokePosition = nearestStrokePosition; exports.strokePositionPoint = strokePositionPoint; exports.isClosedBezierShape = isClosedBezierShape; exports.effectiveStrokeAlign = effectiveStrokeAlign; exports.strokeWidthProfileOf = strokeWidthProfileOf; exports.hasStrokeExtras = hasStrokeExtras; exports.vectorStrokeLineArea = vectorStrokeLineArea; exports.arrowheadWeight = arrowheadWeight; exports.arrowheadInset = arrowheadInset; exports.arrowheadPath = arrowheadPath; exports.vectorStrokeParts = vectorStrokeParts; exports.vectorStrokeOutlinePath = vectorStrokeOutlinePath; exports.hitTestVectorStroke = hitTestVectorStroke; exports.vectorStrokeReach = vectorStrokeReach; exports.effectPathLength = effectPathLength; exports.effectPathVertexCount = effectPathVertexCount; exports.trimIntervals = trimIntervals; exports.trimPaths = trimPaths; exports.trimPathsIndividually = trimPathsIndividually; exports.puckerBloatPaths = puckerBloatPaths; exports.roundCornerPaths = roundCornerPaths; exports.offsetPaths = offsetPaths; exports.twistPaths = twistPaths; exports.zigzagPaths = zigzagPaths; exports.wigglePaths = wigglePaths; exports.mergePaths = mergePaths; exports.vectorRepeaterCopies = vectorRepeaterCopies; exports.repeatPaths = repeatPaths; exports.pathsCenter = pathsCenter; exports.mapVectorPoints = mapVectorPoints; exports.mapVectorSubpaths = mapVectorSubpaths; exports.mapBezierPath = mapBezierPath; exports.VECTOR_WARP_STYLES = VECTOR_WARP_STYLES; exports.VECTOR_WARP_STYLE_LABELS = VECTOR_WARP_STYLE_LABELS; exports.vectorWarpPresetGrid = vectorWarpPresetGrid; exports.vectorWarpPresetMesh = vectorWarpPresetMesh; exports.vectorMeshColumns = vectorMeshColumns; exports.vectorMeshRows = vectorMeshRows; exports.isValidVectorMesh = isValidVectorMesh; exports.fitVectorMesh = fitVectorMesh; exports.vectorIdentityMesh = vectorIdentityMesh; exports.evalVectorMesh = evalVectorMesh; exports.splitVectorMeshU = splitVectorMeshU; exports.splitVectorMeshV = splitVectorMeshV; exports.removeVectorMeshSplitU = removeVectorMeshSplitU; exports.removeVectorMeshSplitV = removeVectorMeshSplitV; exports.mapVectorMeshPoints = mapVectorMeshPoints; exports.resizeVectorMesh = resizeVectorMesh; exports.vectorMeshControlBounds = vectorMeshControlBounds; exports.vectorMeshParamAt = vectorMeshParamAt; exports.dragVectorMeshPoint = dragVectorMeshPoint; exports.pullVectorMesh = pullVectorMesh; exports.vectorMeshFromOutline = vectorMeshFromOutline; exports.vectorMeshOutline = vectorMeshOutline; exports.vectorMeshEditPoints = vectorMeshEditPoints; exports.vectorMeshGridCurves = vectorMeshGridCurves; exports.VECTOR_EFFECT_DEFAULTS = VECTOR_EFFECT_DEFAULTS; exports.VECTOR_EFFECT_LABELS = VECTOR_EFFECT_LABELS; exports.VECTOR_EFFECT_PARAM_SPECS = VECTOR_EFFECT_PARAM_SPECS; exports.vectorEnvelopeMesh = vectorEnvelopeMesh; exports.vectorEnvelopeMap = vectorEnvelopeMap; exports.normalizeVectorEffectParams = normalizeVectorEffectParams; exports.createVectorEffect = createVectorEffect; exports.activeVectorEffects = activeVectorEffects; exports.hasOwnVectorAppearance = hasOwnVectorAppearance; exports.hasVectorAppearance = hasVectorAppearance; exports.isVectorLiveBoolean = isVectorLiveBoolean; exports.vectorOperandOperation = vectorOperandOperation; exports.vectorLiveBooleanSteps = vectorLiveBooleanSteps; exports.clearVectorLiveBooleanCache = clearVectorLiveBooleanCache; exports.foldVectorBooleanOperands = foldVectorBooleanOperands; exports.applyVectorEffects = applyVectorEffects; exports.vectorEffectInputPaths = vectorEffectInputPaths; exports.vectorEffectInputBounds = vectorEffectInputBounds; exports.vectorNodeEnvelope = vectorNodeEnvelope; exports.vectorEnvelopeFrame = vectorEnvelopeFrame; exports.vectorAppearanceShapes = vectorAppearanceShapes; exports.vectorAppearanceOutline = vectorAppearanceOutline; exports.vectorAppearanceNodes = vectorAppearanceNodes; exports.expandVectorAppearance = expandVectorAppearance; exports.expandVectorAppearances = expandVectorAppearances; exports.sanitizeVectorEffects = sanitizeVectorEffects; exports.transformVectorEffects = transformVectorEffects; exports.vectorEnteredGroups = vectorEnteredGroups; exports.cloneAnchor = cloneAnchor; exports.cloneSubpath = cloneSubpath; exports.cloneVectorNode = cloneVectorNode; exports.cloneVectorDocument = cloneVectorDocument; exports.hasPaint = hasPaint; exports.subpathSegmentCount = subpathSegmentCount; exports.subpathSegment = subpathSegment; exports.subpathsToBezier = subpathsToBezier; exports.vectorNodeToBezier = vectorNodeToBezier; exports.vectorPathData = vectorPathData; exports.inferAnchorType = inferAnchorType; exports.bezierToSubpaths = bezierToSubpaths; exports.walkVectorNodes = walkVectorNodes; exports.findVectorNode = findVectorNode; exports.locateVectorNode = locateVectorNode; exports.collectPathNodes = collectPathNodes; exports.nodeMatrix = nodeMatrix; exports.vectorPathWorldBezier = vectorPathWorldBezier; exports.vectorNodeBounds = vectorNodeBounds; exports.unionBounds = unionBounds; exports.boundsIntersect = boundsIntersect; exports.boundsFromPoints = boundsFromPoints; exports.hitTestVectorNode = hitTestVectorNode; exports.vectorStrokeOutline = vectorStrokeOutline; exports.hitTestVectorNodes = hitTestVectorNodes; exports.nearestSegment = nearestSegment; exports.IDENTITY_MATRIX = IDENTITY_MATRIX; exports.multiplyMatrices = multiplyMatrices; exports.translateMatrix = translateMatrix; exports.scaleMatrix = scaleMatrix; exports.rotateMatrix = rotateMatrix; exports.applyMatrix = applyMatrix; exports.isIdentityMatrix = isIdentityMatrix; exports.invertMatrix = invertMatrix; exports.applyMatrixLinear = applyMatrixLinear; exports.matrixRotation = matrixRotation; exports.decomposeRigid = decomposeRigid; exports.transformVectorNode = transformVectorNode; exports.vectorNodeRotation = vectorNodeRotation; exports.vectorWorldMatrix = vectorWorldMatrix; exports.vectorParentMatrix = vectorParentMatrix; exports.translateAnchor = translateAnchor; exports.moveAnchorHandle = moveAnchorHandle; exports.convertAnchor = convertAnchor; exports.insertAnchor = insertAnchor; exports.removeAnchors = removeAnchors; exports.reverseSubpath = reverseSubpath; exports.KAPPA = KAPPA2; exports.rectSubpath = rectSubpath; exports.ellipseSubpath = ellipseSubpath; exports.polygonSubpath = polygonSubpath; exports.starSubpath = starSubpath; exports.lineSubpath = lineSubpath; exports.roundSubpaths = roundSubpaths; exports.subpathToMorphContour = subpathToMorphContour; exports.morphContourToSubpath = morphContourToSubpath; exports.refineMorphContour = refineMorphContour; exports.reverseMorphContour = reverseMorphContour; exports.turnMorphContour = turnMorphContour; exports.correspondMorphContours = correspondMorphContours; exports.morphPathsCross = morphPathsCross; exports.interpolateMorphContours = interpolateMorphContours; exports.interpolateRigidMatrix = interpolateRigidMatrix; exports.interpolateVectorColor = interpolateVectorColor; exports.resampleGradientStops = resampleGradientStops; exports.interpolateVectorPaint = interpolateVectorPaint; exports.interpolateWidthProfiles = interpolateWidthProfiles; exports.interpolateVectorStyle = interpolateVectorStyle; exports.createVectorMorph = createVectorMorph; exports.interpolateVectorPaths = interpolateVectorPaths; exports.evaluateVectorPathKeyframes = evaluateVectorPathKeyframes; exports.vectorStrokeGradientDefs = vectorStrokeGradientDefs; exports.vectorCornersAttribute = vectorCornersAttribute; exports.applyVectorCornersAttribute = applyVectorCornersAttribute; exports.vectorPathLocalBounds = vectorPathLocalBounds; exports.vectorPaintToSvg = vectorPaintToSvg; exports.vectorStrokeSvgParts = vectorStrokeSvgParts; exports.widthProfileToAttribute = widthProfileToAttribute; exports.widthProfileFromAttribute = widthProfileFromAttribute; exports.vectorDocumentToSvg = vectorDocumentToSvg; exports.parseSvgTransform = parseSvgTransform; exports.parseVectorSvg = parseVectorSvg;
5979
- //# sourceMappingURL=chunk-XCXQDPID.cjs.map
5994
+ //# sourceMappingURL=chunk-FKONE6AO.cjs.map