pixi-effects 0.47.4 → 0.47.5

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.
Files changed (51) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +5 -5
  3. package/ai/chat-template.html +3 -3
  4. package/dist/Composition-PMWLJQPI.cjs +16 -0
  5. package/dist/{Composition-ZYRDRLYB.cjs.map → Composition-PMWLJQPI.cjs.map} +1 -1
  6. package/dist/Composition-ZCRJHBB5.js +7 -0
  7. package/dist/{Composition-HTHQ2RLF.js.map → Composition-ZCRJHBB5.js.map} +1 -1
  8. package/dist/Controller.d.cts +1 -1
  9. package/dist/Controller.d.ts +1 -1
  10. package/dist/{Movie-sV8nJr_f.d.ts → Movie--qSYKgAQ.d.ts} +2 -2
  11. package/dist/{Movie-BqrAWN0g.d.cts → Movie-svZQF-9Z.d.cts} +2 -2
  12. package/dist/{Spans-JYCTJV4V.js → Spans-FMAVPATS.js} +4 -4
  13. package/dist/{Spans-JYCTJV4V.js.map → Spans-FMAVPATS.js.map} +1 -1
  14. package/dist/{Spans-I7P7ZVZO.cjs → Spans-KTUPDFSR.cjs} +9 -9
  15. package/dist/{Spans-I7P7ZVZO.cjs.map → Spans-KTUPDFSR.cjs.map} +1 -1
  16. package/dist/{chunk-AES2L75M.cjs → chunk-2AT5WSSV.cjs} +58 -45
  17. package/dist/chunk-2AT5WSSV.cjs.map +1 -0
  18. package/dist/{chunk-34YNRCMT.js → chunk-4PYVHLIK.js} +20 -5
  19. package/dist/chunk-4PYVHLIK.js.map +1 -0
  20. package/dist/{chunk-CJS2S5XU.cjs → chunk-ECLBZV4N.cjs} +20 -5
  21. package/dist/chunk-ECLBZV4N.cjs.map +1 -0
  22. package/dist/{chunk-NCM2WU7R.js → chunk-LHUIEFMH.js} +17 -4
  23. package/dist/chunk-LHUIEFMH.js.map +1 -0
  24. package/dist/{chunk-DS2EWRV4.cjs → chunk-OGLRSR6C.cjs} +63 -63
  25. package/dist/{chunk-DS2EWRV4.cjs.map → chunk-OGLRSR6C.cjs.map} +1 -1
  26. package/dist/{chunk-RTZ5MW3E.js → chunk-UI7CEUTP.js} +3 -3
  27. package/dist/{chunk-RTZ5MW3E.js.map → chunk-UI7CEUTP.js.map} +1 -1
  28. package/dist/index.cjs +33 -33
  29. package/dist/index.d.cts +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.js +3 -3
  32. package/dist/loader.css +1 -1
  33. package/dist/present.cjs +3 -3
  34. package/dist/present.d.cts +1 -1
  35. package/dist/present.d.ts +1 -1
  36. package/dist/present.js +3 -3
  37. package/dist/three.cjs +5 -5
  38. package/dist/three.js +1 -1
  39. package/docs/api.md +2 -2
  40. package/docs/dsl.md +7 -7
  41. package/llms-full.txt +11 -11
  42. package/package.json +1 -1
  43. package/skills/pixi-effects/SKILL.md +1 -1
  44. package/skills/pixi-effects/reference/pitfalls.md +1 -1
  45. package/skills/pixi-effects/template.html +6 -6
  46. package/dist/Composition-HTHQ2RLF.js +0 -7
  47. package/dist/Composition-ZYRDRLYB.cjs +0 -16
  48. package/dist/chunk-34YNRCMT.js.map +0 -1
  49. package/dist/chunk-AES2L75M.cjs.map +0 -1
  50. package/dist/chunk-CJS2S5XU.cjs.map +0 -1
  51. package/dist/chunk-NCM2WU7R.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.47.5
4
+
5
+ An island inside a hole no longer draws a wedge, and `init({ loudness })` is never quieter than the plain gain. Nothing breaks.
6
+
7
+ Eight more test films (playback against seek, same-`at` keyframes and `speed`, the sound in an exported file, a stroke round holes, the loudness target, two more warning families, a matte under a crossfade, what `check` leaves alone).
8
+
9
+ - **Fixed: an island inside a hole of an `evenodd` path drew a wedge of the fill inside the hole** (cutting a shape out of a hole that was already cut). The island is now neither filled nor cut nor stroked, as the docs say.
10
+ - **Fixed: `init({ loudness })` could leave a mix QUIETER than with no option** when a loud click carried the plain mix's loudness: limiting the click let the very quiet bed back into the loudness gate and the integrated loudness fell. The limiter result is compared with the plain gain and the plain gain is used when the limiter would be worse.
11
+ - **Docs, each pinned by a film:** a frame drawn while playing is the snapshot of that frame; keyframes with the same `at`; the loudness of an exported file against the mix (an mp4's sound is padded to a whole AAC frame); the stroke of a shape is centred on its outline; crossfade is not a linear mix and a composition's `alpha` goes into each child; where a wipe starts and ends; `canvas`'s build warning for `Math.random` catches only a direct call; what `check` samples (every 0.25 s) and the layout sentences; the `loudness` JSDoc and the out-of-reach note were stale.
12
+
3
13
  ## 0.47.4
4
14
 
5
15
  A morph between two quads keeps its corners when one is written with a closing line, and `style.colour` points at `fill`. Nothing breaks.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # pixi-effects
2
2
 
3
- > **Status**: experimental — current release `0.47.4`. The API may still change between minor versions; see the [CHANGELOG](./CHANGELOG.md) for what each release changed.
3
+ > **Status**: experimental — current release `0.47.5`. The API may still change between minor versions; see the [CHANGELOG](./CHANGELOG.md) for what each release changed.
4
4
 
5
5
  **[Gallery →](https://yjmtmtk.github.io/pixi-effects/examples/gallery/)** · 43 pieces written as plain data by AI models · **[For AI →](https://yjmtmtk.github.io/pixi-effects/for-ai.html)** · what an AI reads and runs · **[Playground →](https://yjmtmtk.github.io/pixi-effects/examples/playground.html)** in the browser.
6
6
 
@@ -49,8 +49,8 @@ Drop the imports into an [importmap](https://developer.mozilla.org/docs/Web/HTML
49
49
  "imports": {
50
50
  "pixi.js": "https://esm.sh/pixi.js@8.22.0?bundle-deps",
51
51
  "mediabunny": "https://esm.sh/mediabunny",
52
- "pixi-effects": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.4/dist/index.js",
53
- "pixi-effects/controller": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.4/dist/Controller.js"
52
+ "pixi-effects": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.5/dist/index.js",
53
+ "pixi-effects/controller": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.5/dist/Controller.js"
54
54
  }
55
55
  }
56
56
  </script>
@@ -61,7 +61,7 @@ Drop the imports into an [importmap](https://developer.mozilla.org/docs/Web/HTML
61
61
  </script>
62
62
  ```
63
63
 
64
- Load the `dist/` files **as they are** (jsDelivr's `/npm/…/dist/…`, or unpkg's `https://unpkg.com/pixi-effects@0.47.4/dist/index.js`) rather than a CDN-rebundled build such as `esm.sh/pixi-effects` or jsDelivr's `+esm`: the entries (`pixi-effects`, `…/controller`, `…/three`) share internal chunks, which only works when each file is served untouched.
64
+ Load the `dist/` files **as they are** (jsDelivr's `/npm/…/dist/…`, or unpkg's `https://unpkg.com/pixi-effects@0.47.5/dist/index.js`) rather than a CDN-rebundled build such as `esm.sh/pixi-effects` or jsDelivr's `+esm`: the entries (`pixi-effects`, `…/controller`, `…/three`) share internal chunks, which only works when each file is served untouched.
65
65
 
66
66
  > **Using three.js?** Add two more entries (`three` and `pixi-effects/three`) to this importmap — see [Adding three.js](#adding-threejs-optional) below.
67
67
  >
@@ -78,7 +78,7 @@ Add two more entries to the importmap above: three.js itself, and the `pixi-effe
78
78
  "...": "(everything from the importmap above)",
79
79
  "three": "https://esm.sh/three@0.178.0",
80
80
  "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.178.0/examples/jsm/",
81
- "pixi-effects/three": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.4/dist/three.js"
81
+ "pixi-effects/three": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.5/dist/three.js"
82
82
  }
83
83
  }
84
84
  </script>
@@ -59,9 +59,9 @@
59
59
  "imports": {
60
60
  "pixi.js": "https://cdn.jsdelivr.net/npm/pixi.js@8.22.0/dist/pixi.min.mjs",
61
61
  "mediabunny": "https://cdn.jsdelivr.net/npm/mediabunny@1.61.3/+esm",
62
- "pixi-effects": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.4/dist/index.js",
63
- "pixi-effects/controller": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.4/dist/Controller.js",
64
- "pixi-effects/present": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.4/dist/present.js"
62
+ "pixi-effects": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.5/dist/index.js",
63
+ "pixi-effects/controller": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.5/dist/Controller.js",
64
+ "pixi-effects/present": "https://cdn.jsdelivr.net/npm/pixi-effects@0.47.5/dist/present.js"
65
65
  }
66
66
  }
67
67
  </script>
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var chunkOGLRSR6C_cjs = require('./chunk-OGLRSR6C.cjs');
4
+ require('./chunk-ECLBZV4N.cjs');
5
+ require('./chunk-WYR2AU4W.cjs');
6
+ require('./chunk-NGJXVJB7.cjs');
7
+ require('./chunk-DOLTCXCL.cjs');
8
+
9
+
10
+
11
+ Object.defineProperty(exports, "CompositionSequence", {
12
+ enumerable: true,
13
+ get: function () { return chunkOGLRSR6C_cjs.CompositionSequence; }
14
+ });
15
+ //# sourceMappingURL=Composition-PMWLJQPI.cjs.map
16
+ //# sourceMappingURL=Composition-PMWLJQPI.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Composition-ZYRDRLYB.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Composition-PMWLJQPI.cjs"}
@@ -0,0 +1,7 @@
1
+ export { CompositionSequence } from './chunk-UI7CEUTP.js';
2
+ import './chunk-4PYVHLIK.js';
3
+ import './chunk-JBDBICS2.js';
4
+ import './chunk-BFRWSV3R.js';
5
+ import './chunk-WGRWFQOB.js';
6
+ //# sourceMappingURL=Composition-ZCRJHBB5.js.map
7
+ //# sourceMappingURL=Composition-ZCRJHBB5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"Composition-HTHQ2RLF.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Composition-ZCRJHBB5.js"}
@@ -1,4 +1,4 @@
1
- import { M as Movie } from './Movie-BqrAWN0g.cjs';
1
+ import { M as Movie } from './Movie-svZQF-9Z.cjs';
2
2
  import 'pixi.js';
3
3
  import './soundEntry-DT13DNt8.cjs';
4
4
  import './types-CTSrPvY3.cjs';
@@ -1,4 +1,4 @@
1
- import { M as Movie } from './Movie-sV8nJr_f.js';
1
+ import { M as Movie } from './Movie--qSYKgAQ.js';
2
2
  import 'pixi.js';
3
3
  import './soundEntry-DT13DNt8.js';
4
4
  import './types-CTSrPvY3.js';
@@ -434,8 +434,8 @@ interface MovieOptions {
434
434
  /** Start with `movie.loop` on: playing goes back to the start at the end instead of stopping. Default false (like a `<video>`). */
435
435
  loop?: boolean;
436
436
  /**
437
- * The loudness of the whole mix in LUFS (ITU-R BS.1770): `-16` is usual for web video. The finished mix gets one gain (up or down) so its integrated loudness is that number, but the loudest sample
438
- * never passes -1 dBFS: a mix with one loud click in a quiet bed stops short, and `inspectAudio()` / `check` say how far it got. Default: off (the mix is what the layers make; `check` says when it is quiet).
437
+ * The loudness of the whole mix in LUFS (ITU-R BS.1770): `-16` is usual for web video. The finished mix gets one gain (up or down) so its integrated loudness is that number: a look-ahead limiter takes a click or a hit on top of a quiet bed down (by up to 10 dB) and the true peak
438
+ * never passes -1 dBTP. A mix whose peaks are out of that reach stops short, and `inspectAudio()` / `check` say how far it got and why. Default: off (the mix is what the layers make; `check` says when it is quiet).
439
439
  * A number of 0 or below, or `false`.
440
440
  */
441
441
  loudness?: number | false;
@@ -434,8 +434,8 @@ interface MovieOptions {
434
434
  /** Start with `movie.loop` on: playing goes back to the start at the end instead of stopping. Default false (like a `<video>`). */
435
435
  loop?: boolean;
436
436
  /**
437
- * The loudness of the whole mix in LUFS (ITU-R BS.1770): `-16` is usual for web video. The finished mix gets one gain (up or down) so its integrated loudness is that number, but the loudest sample
438
- * never passes -1 dBFS: a mix with one loud click in a quiet bed stops short, and `inspectAudio()` / `check` say how far it got. Default: off (the mix is what the layers make; `check` says when it is quiet).
437
+ * The loudness of the whole mix in LUFS (ITU-R BS.1770): `-16` is usual for web video. The finished mix gets one gain (up or down) so its integrated loudness is that number: a look-ahead limiter takes a click or a hit on top of a quiet bed down (by up to 10 dB) and the true peak
438
+ * never passes -1 dBTP. A mix whose peaks are out of that reach stops short, and `inspectAudio()` / `check` say how far it got and why. Default: off (the mix is what the layers make; `check` says when it is quiet).
439
439
  * A number of 0 or below, or `false`.
440
440
  */
441
441
  loudness?: number | false;
@@ -1,5 +1,5 @@
1
- import { CompositionSequence } from './chunk-RTZ5MW3E.js';
2
- import { spansMeta, resolveNumber, bindCounterKeyframes, TextSequence } from './chunk-34YNRCMT.js';
1
+ import { CompositionSequence } from './chunk-UI7CEUTP.js';
2
+ import { spansMeta, resolveNumber, bindCounterKeyframes, TextSequence } from './chunk-4PYVHLIK.js';
3
3
  import './chunk-JBDBICS2.js';
4
4
  import './chunk-BFRWSV3R.js';
5
5
  import './chunk-WGRWFQOB.js';
@@ -49,5 +49,5 @@ var SpansSequence = class extends CompositionSequence {
49
49
  };
50
50
 
51
51
  export { SpansSequence };
52
- //# sourceMappingURL=Spans-JYCTJV4V.js.map
53
- //# sourceMappingURL=Spans-JYCTJV4V.js.map
52
+ //# sourceMappingURL=Spans-FMAVPATS.js.map
53
+ //# sourceMappingURL=Spans-FMAVPATS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sequences/Spans.ts"],"names":[],"mappings":";;;;;;;AAQA,IAAM,KAAA,GAAQ,CAAC,KAAA,KAAgD;AAC7D,EAAA,IAAI,CAAC,KAAA,IAAS,EAAE,cAAA,IAAkB,QAAQ,OAAO,KAAA;AACjD,EAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AACzC,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,aAAA,GAAN,cAA4B,mBAAA,CAAoB;AAAA,EACpC,KAAA;AAAA,EACA,MAAA,GAAuB,EAAE,KAAA,EAAO,CAAA,EAAG,cAAc,CAAA,EAAE;AAAA,EAEpE,WAAA,CAAY,IAAA,EAAoB,MAAA,EAAiC,IAAA,EAAwB;AACvF,IAAA,KAAA,CAAM,IAAA,EAAM,QAAQ,IAAI,CAAA;AACxB,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA,EAGmB,YAAA,GAAyH;AAC1I,IAAA,MAAM,CAAA,GAAI,MAAM,YAAA,EAAa;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAC/B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA,CAAM,CAAA,CAAE,OAA4B,CAAA;AAAA,MAC7C,SAAA,EAAW,EAAE,SAAA,EAAW,GAAA,CAAI,SAAO,EAAE,GAAG,EAAA,EAAI,GAAA,EAAK,KAAA,CAAM,EAAA,CAAG,GAAG,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,EAAG,MAAM,KAAA,CAAM,EAAA,CAAG,IAAI,CAAA,EAAE,CAAE;AAAA,KAC3G;AAAA,EACF;AAAA,EAES,YAAA,CAAa,QAAA,EAAoB,MAAA,GAAS,CAAA,EAAS;AAC1D,IAAA,KAAA,CAAM,YAAA,CAAa,UAAU,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,IAAA,CAAK,OAAA,EAAiD,YAAA;AAC1E,IAAA,IAAA,CAAK,OAAO,YAAA,GAAe,KAAA,KAAU,SAAY,CAAA,GAAI,aAAA,CAAc,OAAO,KAAK,CAAA;AAC/E,IAAA,oBAAA,CAAqB,UAAU,IAAA,CAAK,MAAA,EAAQ,gBAAgB,MAAM,IAAA,CAAK,aAAY,EAAG,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,IAAA,CAAK,UAAW,MAAA,GAAS,IAAA,CAAK,IAAI,KAAK,CAAA;AACxJ,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA,EAGQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAO,MAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,YAAY,CAAC,CAAA;AAC9D,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,SAAA,EAAW;AAClC,MAAA,IAAI,EAAE,iBAAiB,YAAA,CAAA,EAAe;AACtC,MAAA,MAAM,CAAA,GAAI,OAAO,CAAA,EAAG,CAAA;AACpB,MAAA,IAAI,CAAA,EAAG,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAAA,IAC/E;AAAA,EACF;AACF","file":"Spans-JYCTJV4V.js","sourcesContent":["// The sequence behind a text layer with `spans`: a composition of ordinary text layers (see src/text/spans.ts) that also owns the typewriter\n// (`visibleChars`) of the whole text: it counts over every character of every piece, and tells each piece how many of its own to show.\nimport { CompositionSequence } from './Composition';\nimport { TextSequence, bindCounterKeyframes, resolveNumber, type CounterState } from './Text';\nimport { spansMeta, type SpansMeta } from '../text/spans';\nimport type { CompositionShape, SequenceSpec, Props } from '../types';\nimport type { Timeline } from '../core/timelineEngine';\n\nconst strip = (props: Props | undefined): Props | undefined => {\n if (!props || !('visibleChars' in props)) return props;\n const { visibleChars: _gone, ...rest } = props as Record<string, unknown>;\n return rest as unknown as Props;\n};\n\nexport class SpansSequence extends CompositionSequence {\n private readonly _meta: SpansMeta | undefined;\n private readonly _count: CounterState = { value: 0, visibleChars: 0 };\n\n constructor(spec: SequenceSpec, parent: CompositionShape | null, root: CompositionShape) {\n super(spec, parent, root);\n this._meta = spansMeta.get(spec);\n }\n\n /** `visibleChars` is the group's own counter, not a property to write on the container. */\n protected override displayProps(): { initial: CompositionSequence['spec']['initial']; keyframes: CompositionSequence['spec']['keyframes'] } {\n const p = super.displayProps();\n if (!this._meta?.typed) return p;\n return {\n initial: strip(p.initial as Props | undefined) as never,\n keyframes: p.keyframes?.map(kf => ({ ...kf, set: strip(kf.set), to: strip(kf.to), from: strip(kf.from) })),\n };\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n super.bindTimeline(timeline, offset);\n if (!this._meta?.typed) return;\n const scope = this.scope();\n const first = (this.spec.initial as Record<string, unknown> | undefined)?.visibleChars;\n this._count.visibleChars = first === undefined ? 0 : resolveNumber(first, scope); // like a text: it starts at 0 once it is animated\n bindCounterKeyframes(timeline, this._count, 'visibleChars', () => this._distribute(), this.spec.keyframes ?? [], this.duration!, offset + this.at, scope);\n this._distribute();\n }\n\n /** Every piece shows its part of the first N characters of the whole text. */\n private _distribute(): void {\n const pieces = this._meta!.pieces;\n const total = Math.max(0, Math.floor(this._count.visibleChars));\n let i = 0;\n for (const child of this._children) {\n if (!(child instanceof TextSequence)) continue;\n const p = pieces[i++];\n if (p) child.setVisibleChars(Math.min(p.length, Math.max(0, total - p.start)));\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/sequences/Spans.ts"],"names":[],"mappings":";;;;;;;AAQA,IAAM,KAAA,GAAQ,CAAC,KAAA,KAAgD;AAC7D,EAAA,IAAI,CAAC,KAAA,IAAS,EAAE,cAAA,IAAkB,QAAQ,OAAO,KAAA;AACjD,EAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AACzC,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,aAAA,GAAN,cAA4B,mBAAA,CAAoB;AAAA,EACpC,KAAA;AAAA,EACA,MAAA,GAAuB,EAAE,KAAA,EAAO,CAAA,EAAG,cAAc,CAAA,EAAE;AAAA,EAEpE,WAAA,CAAY,IAAA,EAAoB,MAAA,EAAiC,IAAA,EAAwB;AACvF,IAAA,KAAA,CAAM,IAAA,EAAM,QAAQ,IAAI,CAAA;AACxB,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA,EAGmB,YAAA,GAAyH;AAC1I,IAAA,MAAM,CAAA,GAAI,MAAM,YAAA,EAAa;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAC/B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA,CAAM,CAAA,CAAE,OAA4B,CAAA;AAAA,MAC7C,SAAA,EAAW,EAAE,SAAA,EAAW,GAAA,CAAI,SAAO,EAAE,GAAG,EAAA,EAAI,GAAA,EAAK,KAAA,CAAM,EAAA,CAAG,GAAG,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,EAAG,MAAM,KAAA,CAAM,EAAA,CAAG,IAAI,CAAA,EAAE,CAAE;AAAA,KAC3G;AAAA,EACF;AAAA,EAES,YAAA,CAAa,QAAA,EAAoB,MAAA,GAAS,CAAA,EAAS;AAC1D,IAAA,KAAA,CAAM,YAAA,CAAa,UAAU,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,IAAA,CAAK,OAAA,EAAiD,YAAA;AAC1E,IAAA,IAAA,CAAK,OAAO,YAAA,GAAe,KAAA,KAAU,SAAY,CAAA,GAAI,aAAA,CAAc,OAAO,KAAK,CAAA;AAC/E,IAAA,oBAAA,CAAqB,UAAU,IAAA,CAAK,MAAA,EAAQ,gBAAgB,MAAM,IAAA,CAAK,aAAY,EAAG,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,IAAA,CAAK,UAAW,MAAA,GAAS,IAAA,CAAK,IAAI,KAAK,CAAA;AACxJ,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA,EAGQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAO,MAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,YAAY,CAAC,CAAA;AAC9D,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,SAAA,EAAW;AAClC,MAAA,IAAI,EAAE,iBAAiB,YAAA,CAAA,EAAe;AACtC,MAAA,MAAM,CAAA,GAAI,OAAO,CAAA,EAAG,CAAA;AACpB,MAAA,IAAI,CAAA,EAAG,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAAA,IAC/E;AAAA,EACF;AACF","file":"Spans-FMAVPATS.js","sourcesContent":["// The sequence behind a text layer with `spans`: a composition of ordinary text layers (see src/text/spans.ts) that also owns the typewriter\n// (`visibleChars`) of the whole text: it counts over every character of every piece, and tells each piece how many of its own to show.\nimport { CompositionSequence } from './Composition';\nimport { TextSequence, bindCounterKeyframes, resolveNumber, type CounterState } from './Text';\nimport { spansMeta, type SpansMeta } from '../text/spans';\nimport type { CompositionShape, SequenceSpec, Props } from '../types';\nimport type { Timeline } from '../core/timelineEngine';\n\nconst strip = (props: Props | undefined): Props | undefined => {\n if (!props || !('visibleChars' in props)) return props;\n const { visibleChars: _gone, ...rest } = props as Record<string, unknown>;\n return rest as unknown as Props;\n};\n\nexport class SpansSequence extends CompositionSequence {\n private readonly _meta: SpansMeta | undefined;\n private readonly _count: CounterState = { value: 0, visibleChars: 0 };\n\n constructor(spec: SequenceSpec, parent: CompositionShape | null, root: CompositionShape) {\n super(spec, parent, root);\n this._meta = spansMeta.get(spec);\n }\n\n /** `visibleChars` is the group's own counter, not a property to write on the container. */\n protected override displayProps(): { initial: CompositionSequence['spec']['initial']; keyframes: CompositionSequence['spec']['keyframes'] } {\n const p = super.displayProps();\n if (!this._meta?.typed) return p;\n return {\n initial: strip(p.initial as Props | undefined) as never,\n keyframes: p.keyframes?.map(kf => ({ ...kf, set: strip(kf.set), to: strip(kf.to), from: strip(kf.from) })),\n };\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n super.bindTimeline(timeline, offset);\n if (!this._meta?.typed) return;\n const scope = this.scope();\n const first = (this.spec.initial as Record<string, unknown> | undefined)?.visibleChars;\n this._count.visibleChars = first === undefined ? 0 : resolveNumber(first, scope); // like a text: it starts at 0 once it is animated\n bindCounterKeyframes(timeline, this._count, 'visibleChars', () => this._distribute(), this.spec.keyframes ?? [], this.duration!, offset + this.at, scope);\n this._distribute();\n }\n\n /** Every piece shows its part of the first N characters of the whole text. */\n private _distribute(): void {\n const pieces = this._meta!.pieces;\n const total = Math.max(0, Math.floor(this._count.visibleChars));\n let i = 0;\n for (const child of this._children) {\n if (!(child instanceof TextSequence)) continue;\n const p = pieces[i++];\n if (p) child.setVisibleChars(Math.min(p.length, Math.max(0, total - p.start)));\n }\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkDS2EWRV4_cjs = require('./chunk-DS2EWRV4.cjs');
4
- var chunkCJS2S5XU_cjs = require('./chunk-CJS2S5XU.cjs');
3
+ var chunkOGLRSR6C_cjs = require('./chunk-OGLRSR6C.cjs');
4
+ var chunkECLBZV4N_cjs = require('./chunk-ECLBZV4N.cjs');
5
5
  require('./chunk-WYR2AU4W.cjs');
6
6
  require('./chunk-NGJXVJB7.cjs');
7
7
  require('./chunk-DOLTCXCL.cjs');
@@ -12,12 +12,12 @@ var strip = (props) => {
12
12
  const { visibleChars: _gone, ...rest } = props;
13
13
  return rest;
14
14
  };
15
- var SpansSequence = class extends chunkDS2EWRV4_cjs.CompositionSequence {
15
+ var SpansSequence = class extends chunkOGLRSR6C_cjs.CompositionSequence {
16
16
  _meta;
17
17
  _count = { value: 0, visibleChars: 0 };
18
18
  constructor(spec, parent, root) {
19
19
  super(spec, parent, root);
20
- this._meta = chunkCJS2S5XU_cjs.spansMeta.get(spec);
20
+ this._meta = chunkECLBZV4N_cjs.spansMeta.get(spec);
21
21
  }
22
22
  /** `visibleChars` is the group's own counter, not a property to write on the container. */
23
23
  displayProps() {
@@ -33,8 +33,8 @@ var SpansSequence = class extends chunkDS2EWRV4_cjs.CompositionSequence {
33
33
  if (!this._meta?.typed) return;
34
34
  const scope = this.scope();
35
35
  const first = this.spec.initial?.visibleChars;
36
- this._count.visibleChars = first === void 0 ? 0 : chunkCJS2S5XU_cjs.resolveNumber(first, scope);
37
- chunkCJS2S5XU_cjs.bindCounterKeyframes(timeline, this._count, "visibleChars", () => this._distribute(), this.spec.keyframes ?? [], this.duration, offset + this.at, scope);
36
+ this._count.visibleChars = first === void 0 ? 0 : chunkECLBZV4N_cjs.resolveNumber(first, scope);
37
+ chunkECLBZV4N_cjs.bindCounterKeyframes(timeline, this._count, "visibleChars", () => this._distribute(), this.spec.keyframes ?? [], this.duration, offset + this.at, scope);
38
38
  this._distribute();
39
39
  }
40
40
  /** Every piece shows its part of the first N characters of the whole text. */
@@ -43,7 +43,7 @@ var SpansSequence = class extends chunkDS2EWRV4_cjs.CompositionSequence {
43
43
  const total = Math.max(0, Math.floor(this._count.visibleChars));
44
44
  let i = 0;
45
45
  for (const child of this._children) {
46
- if (!(child instanceof chunkCJS2S5XU_cjs.TextSequence)) continue;
46
+ if (!(child instanceof chunkECLBZV4N_cjs.TextSequence)) continue;
47
47
  const p = pieces[i++];
48
48
  if (p) child.setVisibleChars(Math.min(p.length, Math.max(0, total - p.start)));
49
49
  }
@@ -51,5 +51,5 @@ var SpansSequence = class extends chunkDS2EWRV4_cjs.CompositionSequence {
51
51
  };
52
52
 
53
53
  exports.SpansSequence = SpansSequence;
54
- //# sourceMappingURL=Spans-I7P7ZVZO.cjs.map
55
- //# sourceMappingURL=Spans-I7P7ZVZO.cjs.map
54
+ //# sourceMappingURL=Spans-KTUPDFSR.cjs.map
55
+ //# sourceMappingURL=Spans-KTUPDFSR.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sequences/Spans.ts"],"names":["CompositionSequence","spansMeta","resolveNumber","bindCounterKeyframes","TextSequence"],"mappings":";;;;;;;;;AAQA,IAAM,KAAA,GAAQ,CAAC,KAAA,KAAgD;AAC7D,EAAA,IAAI,CAAC,KAAA,IAAS,EAAE,cAAA,IAAkB,QAAQ,OAAO,KAAA;AACjD,EAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AACzC,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,aAAA,GAAN,cAA4BA,qCAAA,CAAoB;AAAA,EACpC,KAAA;AAAA,EACA,MAAA,GAAuB,EAAE,KAAA,EAAO,CAAA,EAAG,cAAc,CAAA,EAAE;AAAA,EAEpE,WAAA,CAAY,IAAA,EAAoB,MAAA,EAAiC,IAAA,EAAwB;AACvF,IAAA,KAAA,CAAM,IAAA,EAAM,QAAQ,IAAI,CAAA;AACxB,IAAA,IAAA,CAAK,KAAA,GAAQC,2BAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA,EAGmB,YAAA,GAAyH;AAC1I,IAAA,MAAM,CAAA,GAAI,MAAM,YAAA,EAAa;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAC/B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA,CAAM,CAAA,CAAE,OAA4B,CAAA;AAAA,MAC7C,SAAA,EAAW,EAAE,SAAA,EAAW,GAAA,CAAI,SAAO,EAAE,GAAG,EAAA,EAAI,GAAA,EAAK,KAAA,CAAM,EAAA,CAAG,GAAG,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,EAAG,MAAM,KAAA,CAAM,EAAA,CAAG,IAAI,CAAA,EAAE,CAAE;AAAA,KAC3G;AAAA,EACF;AAAA,EAES,YAAA,CAAa,QAAA,EAAoB,MAAA,GAAS,CAAA,EAAS;AAC1D,IAAA,KAAA,CAAM,YAAA,CAAa,UAAU,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,IAAA,CAAK,OAAA,EAAiD,YAAA;AAC1E,IAAA,IAAA,CAAK,OAAO,YAAA,GAAe,KAAA,KAAU,SAAY,CAAA,GAAIC,+BAAA,CAAc,OAAO,KAAK,CAAA;AAC/E,IAAAC,sCAAA,CAAqB,UAAU,IAAA,CAAK,MAAA,EAAQ,gBAAgB,MAAM,IAAA,CAAK,aAAY,EAAG,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,IAAA,CAAK,UAAW,MAAA,GAAS,IAAA,CAAK,IAAI,KAAK,CAAA;AACxJ,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA,EAGQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAO,MAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,YAAY,CAAC,CAAA;AAC9D,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,SAAA,EAAW;AAClC,MAAA,IAAI,EAAE,iBAAiBC,8BAAA,CAAA,EAAe;AACtC,MAAA,MAAM,CAAA,GAAI,OAAO,CAAA,EAAG,CAAA;AACpB,MAAA,IAAI,CAAA,EAAG,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAAA,IAC/E;AAAA,EACF;AACF","file":"Spans-I7P7ZVZO.cjs","sourcesContent":["// The sequence behind a text layer with `spans`: a composition of ordinary text layers (see src/text/spans.ts) that also owns the typewriter\n// (`visibleChars`) of the whole text: it counts over every character of every piece, and tells each piece how many of its own to show.\nimport { CompositionSequence } from './Composition';\nimport { TextSequence, bindCounterKeyframes, resolveNumber, type CounterState } from './Text';\nimport { spansMeta, type SpansMeta } from '../text/spans';\nimport type { CompositionShape, SequenceSpec, Props } from '../types';\nimport type { Timeline } from '../core/timelineEngine';\n\nconst strip = (props: Props | undefined): Props | undefined => {\n if (!props || !('visibleChars' in props)) return props;\n const { visibleChars: _gone, ...rest } = props as Record<string, unknown>;\n return rest as unknown as Props;\n};\n\nexport class SpansSequence extends CompositionSequence {\n private readonly _meta: SpansMeta | undefined;\n private readonly _count: CounterState = { value: 0, visibleChars: 0 };\n\n constructor(spec: SequenceSpec, parent: CompositionShape | null, root: CompositionShape) {\n super(spec, parent, root);\n this._meta = spansMeta.get(spec);\n }\n\n /** `visibleChars` is the group's own counter, not a property to write on the container. */\n protected override displayProps(): { initial: CompositionSequence['spec']['initial']; keyframes: CompositionSequence['spec']['keyframes'] } {\n const p = super.displayProps();\n if (!this._meta?.typed) return p;\n return {\n initial: strip(p.initial as Props | undefined) as never,\n keyframes: p.keyframes?.map(kf => ({ ...kf, set: strip(kf.set), to: strip(kf.to), from: strip(kf.from) })),\n };\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n super.bindTimeline(timeline, offset);\n if (!this._meta?.typed) return;\n const scope = this.scope();\n const first = (this.spec.initial as Record<string, unknown> | undefined)?.visibleChars;\n this._count.visibleChars = first === undefined ? 0 : resolveNumber(first, scope); // like a text: it starts at 0 once it is animated\n bindCounterKeyframes(timeline, this._count, 'visibleChars', () => this._distribute(), this.spec.keyframes ?? [], this.duration!, offset + this.at, scope);\n this._distribute();\n }\n\n /** Every piece shows its part of the first N characters of the whole text. */\n private _distribute(): void {\n const pieces = this._meta!.pieces;\n const total = Math.max(0, Math.floor(this._count.visibleChars));\n let i = 0;\n for (const child of this._children) {\n if (!(child instanceof TextSequence)) continue;\n const p = pieces[i++];\n if (p) child.setVisibleChars(Math.min(p.length, Math.max(0, total - p.start)));\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/sequences/Spans.ts"],"names":["CompositionSequence","spansMeta","resolveNumber","bindCounterKeyframes","TextSequence"],"mappings":";;;;;;;;;AAQA,IAAM,KAAA,GAAQ,CAAC,KAAA,KAAgD;AAC7D,EAAA,IAAI,CAAC,KAAA,IAAS,EAAE,cAAA,IAAkB,QAAQ,OAAO,KAAA;AACjD,EAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AACzC,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,aAAA,GAAN,cAA4BA,qCAAA,CAAoB;AAAA,EACpC,KAAA;AAAA,EACA,MAAA,GAAuB,EAAE,KAAA,EAAO,CAAA,EAAG,cAAc,CAAA,EAAE;AAAA,EAEpE,WAAA,CAAY,IAAA,EAAoB,MAAA,EAAiC,IAAA,EAAwB;AACvF,IAAA,KAAA,CAAM,IAAA,EAAM,QAAQ,IAAI,CAAA;AACxB,IAAA,IAAA,CAAK,KAAA,GAAQC,2BAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA,EAGmB,YAAA,GAAyH;AAC1I,IAAA,MAAM,CAAA,GAAI,MAAM,YAAA,EAAa;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAC/B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA,CAAM,CAAA,CAAE,OAA4B,CAAA;AAAA,MAC7C,SAAA,EAAW,EAAE,SAAA,EAAW,GAAA,CAAI,SAAO,EAAE,GAAG,EAAA,EAAI,GAAA,EAAK,KAAA,CAAM,EAAA,CAAG,GAAG,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,EAAG,MAAM,KAAA,CAAM,EAAA,CAAG,IAAI,CAAA,EAAE,CAAE;AAAA,KAC3G;AAAA,EACF;AAAA,EAES,YAAA,CAAa,QAAA,EAAoB,MAAA,GAAS,CAAA,EAAS;AAC1D,IAAA,KAAA,CAAM,YAAA,CAAa,UAAU,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,IAAA,CAAK,OAAA,EAAiD,YAAA;AAC1E,IAAA,IAAA,CAAK,OAAO,YAAA,GAAe,KAAA,KAAU,SAAY,CAAA,GAAIC,+BAAA,CAAc,OAAO,KAAK,CAAA;AAC/E,IAAAC,sCAAA,CAAqB,UAAU,IAAA,CAAK,MAAA,EAAQ,gBAAgB,MAAM,IAAA,CAAK,aAAY,EAAG,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,IAAA,CAAK,UAAW,MAAA,GAAS,IAAA,CAAK,IAAI,KAAK,CAAA;AACxJ,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA,EAGQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAO,MAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,YAAY,CAAC,CAAA;AAC9D,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,SAAA,EAAW;AAClC,MAAA,IAAI,EAAE,iBAAiBC,8BAAA,CAAA,EAAe;AACtC,MAAA,MAAM,CAAA,GAAI,OAAO,CAAA,EAAG,CAAA;AACpB,MAAA,IAAI,CAAA,EAAG,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AAAA,IAC/E;AAAA,EACF;AACF","file":"Spans-KTUPDFSR.cjs","sourcesContent":["// The sequence behind a text layer with `spans`: a composition of ordinary text layers (see src/text/spans.ts) that also owns the typewriter\n// (`visibleChars`) of the whole text: it counts over every character of every piece, and tells each piece how many of its own to show.\nimport { CompositionSequence } from './Composition';\nimport { TextSequence, bindCounterKeyframes, resolveNumber, type CounterState } from './Text';\nimport { spansMeta, type SpansMeta } from '../text/spans';\nimport type { CompositionShape, SequenceSpec, Props } from '../types';\nimport type { Timeline } from '../core/timelineEngine';\n\nconst strip = (props: Props | undefined): Props | undefined => {\n if (!props || !('visibleChars' in props)) return props;\n const { visibleChars: _gone, ...rest } = props as Record<string, unknown>;\n return rest as unknown as Props;\n};\n\nexport class SpansSequence extends CompositionSequence {\n private readonly _meta: SpansMeta | undefined;\n private readonly _count: CounterState = { value: 0, visibleChars: 0 };\n\n constructor(spec: SequenceSpec, parent: CompositionShape | null, root: CompositionShape) {\n super(spec, parent, root);\n this._meta = spansMeta.get(spec);\n }\n\n /** `visibleChars` is the group's own counter, not a property to write on the container. */\n protected override displayProps(): { initial: CompositionSequence['spec']['initial']; keyframes: CompositionSequence['spec']['keyframes'] } {\n const p = super.displayProps();\n if (!this._meta?.typed) return p;\n return {\n initial: strip(p.initial as Props | undefined) as never,\n keyframes: p.keyframes?.map(kf => ({ ...kf, set: strip(kf.set), to: strip(kf.to), from: strip(kf.from) })),\n };\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n super.bindTimeline(timeline, offset);\n if (!this._meta?.typed) return;\n const scope = this.scope();\n const first = (this.spec.initial as Record<string, unknown> | undefined)?.visibleChars;\n this._count.visibleChars = first === undefined ? 0 : resolveNumber(first, scope); // like a text: it starts at 0 once it is animated\n bindCounterKeyframes(timeline, this._count, 'visibleChars', () => this._distribute(), this.spec.keyframes ?? [], this.duration!, offset + this.at, scope);\n this._distribute();\n }\n\n /** Every piece shows its part of the first N characters of the whole text. */\n private _distribute(): void {\n const pieces = this._meta!.pieces;\n const total = Math.max(0, Math.floor(this._count.visibleChars));\n let i = 0;\n for (const child of this._children) {\n if (!(child instanceof TextSequence)) continue;\n const p = pieces[i++];\n if (p) child.setVisibleChars(Math.min(p.length, Math.max(0, total - p.start)));\n }\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkDS2EWRV4_cjs = require('./chunk-DS2EWRV4.cjs');
4
- var chunkCJS2S5XU_cjs = require('./chunk-CJS2S5XU.cjs');
3
+ var chunkOGLRSR6C_cjs = require('./chunk-OGLRSR6C.cjs');
4
+ var chunkECLBZV4N_cjs = require('./chunk-ECLBZV4N.cjs');
5
5
  var chunkZAHCGFGC_cjs = require('./chunk-ZAHCGFGC.cjs');
6
6
  var chunkWYR2AU4W_cjs = require('./chunk-WYR2AU4W.cjs');
7
7
  var chunkNGJXVJB7_cjs = require('./chunk-NGJXVJB7.cjs');
@@ -250,6 +250,19 @@ async function normalizeMix(buffer, target, between) {
250
250
  gainDb = next;
251
251
  }
252
252
  }
253
+ if (original && final.integratedLufs !== null && m.integratedLufs !== null) {
254
+ const plainDb = Math.min(target - m.integratedLufs, LOUDNESS_CEILING_DB - m.samplePeakDb);
255
+ if (final.integratedLufs < m.integratedLufs + plainDb - 0.1) {
256
+ const k = 10 ** (plainDb / 20);
257
+ for (let ch = 0; ch < chans.length; ch++) {
258
+ const o = original[ch], d = chans[ch];
259
+ for (let i = 0; i < d.length; i++) d[i] = o[i] * k;
260
+ }
261
+ gainDb = plainDb;
262
+ applied = { reductionDb: 0, at: 0 };
263
+ final = chunkZAHCGFGC_cjs.measureLoudness(chans, sr);
264
+ }
265
+ }
253
266
  let trimDb = 0;
254
267
  if (final.truePeakDb > LOUDNESS_CEILING_DB) {
255
268
  trimDb = final.truePeakDb - LOUDNESS_CEILING_DB + 0.01;
@@ -1245,8 +1258,8 @@ function expandTransitions(spec) {
1245
1258
  }
1246
1259
  const transitions = out.transitions;
1247
1260
  const sequences = out.sequences ?? [];
1248
- const remap = out.duration !== void 0 ? chunkCJS2S5XU_cjs.timeRemapOf(out) : null;
1249
- const parentDuration = remap ? chunkCJS2S5XU_cjs.contentLength(remap, out.duration) : out.duration ?? Infinity;
1261
+ const remap = out.duration !== void 0 ? chunkECLBZV4N_cjs.timeRemapOf(out) : null;
1262
+ const parentDuration = remap ? chunkECLBZV4N_cjs.contentLength(remap, out.duration) : out.duration ?? Infinity;
1250
1263
  const compW = out.width;
1251
1264
  const compH = out.height;
1252
1265
  const threeDByName = new Set(sequences.filter((s) => s.name && s.threeD).map((s) => s.name));
@@ -1314,16 +1327,16 @@ function expandTransitions(spec) {
1314
1327
  if (toUses > 1) {
1315
1328
  throw new Error(`pixi-effects: ${tag} sequence "${t.to}" is used as \`to\` in more than one transition`);
1316
1329
  }
1317
- const tStart = chunkCJS2S5XU_cjs.resolveAt(t.at, parentDuration);
1330
+ const tStart = chunkECLBZV4N_cjs.resolveAt(t.at, parentDuration);
1318
1331
  const tEnd = tStart + t.duration;
1319
1332
  const fromSeq = fromEntry.seq;
1320
- const fromStart = chunkCJS2S5XU_cjs.resolveAt(fromSeq.at, parentDuration);
1333
+ const fromStart = chunkECLBZV4N_cjs.resolveAt(fromSeq.at, parentDuration);
1321
1334
  const fromEnd = fromStart + (fromSeq.duration ?? parentDuration);
1322
1335
  if (tStart < fromStart - EPS || tEnd > fromEnd + EPS) {
1323
1336
  throw new Error(`pixi-effects: ${tag} window [${tStart}, ${tEnd}] is not covered by \`from\` "${t.from}" (lives [${fromStart}, ${fromEnd}], so it ends at ${fromEnd})`);
1324
1337
  }
1325
1338
  const toSeq = toEntry.seq;
1326
- const toStart = chunkCJS2S5XU_cjs.resolveAt(toSeq.at, parentDuration);
1339
+ const toStart = chunkECLBZV4N_cjs.resolveAt(toSeq.at, parentDuration);
1327
1340
  const toEnd = toStart + (toSeq.duration ?? parentDuration);
1328
1341
  if (tStart < toStart - EPS || tEnd > toEnd + EPS) {
1329
1342
  throw new Error(`pixi-effects: ${tag} window [${tStart}, ${tEnd}] is not covered by \`to\` "${t.to}" (lives [${toStart}, ${toEnd}], so it starts at ${toStart})`);
@@ -1383,7 +1396,7 @@ function wrapAsFullComposition(seq, compW, compH) {
1383
1396
  delete inner.at;
1384
1397
  delete inner.duration;
1385
1398
  const m = inner.mask;
1386
- const carriesMatte = m !== void 0 && chunkDS2EWRV4_cjs.maskSourceOf(m).kind === "refs";
1399
+ const carriesMatte = m !== void 0 && chunkOGLRSR6C_cjs.maskSourceOf(m).kind === "refs";
1387
1400
  if (carriesMatte) delete inner.mask;
1388
1401
  return {
1389
1402
  ...carriesMatte ? { mask: m } : {},
@@ -1653,7 +1666,7 @@ function canvasReport(root) {
1653
1666
  const problem = threw.length ? `${name} could not draw at ${threw.map((t) => `${t} s`).join(", ")} (its ${kind === "three" ? "update or render threw" : "draw threw"}, or the layer failed to build): ${kind === "three" ? "the warning above says why" : "it shows a magenta checkerboard there; the warning above says why"}, so the layer cannot be called deterministic` : differs.length ? `${name} does not draw the same picture for the same time (checked at ${differs.map(describeDiff).join(", ")}; drawn in two orders after one draw that was thrown away): ` + (kind === "three" ? "usually its update uses Math.random, Date.now, a clock, or state that builds up from call to call: a mixer advanced with mixer.update(dt) is one (pose a clip with mixer.setTime(t), or threeGltf(url).pose(t)), and so is a value moved by the time since the last call. A skinned model of your own (not loaded by threeGltf) that moves and casts a shadow does it too: three culls a skinned mesh by a bounding sphere that does not follow it, so set mesh.frustumCulled = false. Set every object from t, so playback, a seek and an export agree" : "usually its draw uses Math.random, Date.now or state that outlives the call (a value it keeps from the last call), so playback, a seek and an export would not agree: use info.random() (seeded) and derive everything from t. If it uses none of these, look at the canvases it draws from: make sprites and masks with info.canvas(w, h) (not document.createElement) and draw them into the picture before the strokes that depend on them") : "";
1654
1667
  out.push({ name: seq.spec.name ?? name, moments, drawMs, ok: !differs.length && !threw.length, problem, kind });
1655
1668
  }
1656
- if (seq instanceof chunkDS2EWRV4_cjs.CompositionSequence) walk3(seq);
1669
+ if (seq instanceof chunkOGLRSR6C_cjs.CompositionSequence) walk3(seq);
1657
1670
  };
1658
1671
  const walk3 = (comp) => {
1659
1672
  for (const { seq } of comp.layers()) {
@@ -1705,8 +1718,8 @@ function motionOf(keyframes, local, lives, keys = (k) => GEOMETRY.has(k)) {
1705
1718
  let length = 0;
1706
1719
  if (typeof kf.duration === "number") length = kf.duration;
1707
1720
  else if (kf.duration === "auto") {
1708
- const sp = chunkCJS2S5XU_cjs.parseSpring(kf.ease);
1709
- length = sp ? Math.round(chunkCJS2S5XU_cjs.springDuration(sp) * 1e3) / 1e3 : 0.5;
1721
+ const sp = chunkECLBZV4N_cjs.parseSpring(kf.ease);
1722
+ length = sp ? Math.round(chunkECLBZV4N_cjs.springDuration(sp) * 1e3) / 1e3 : 0.5;
1710
1723
  }
1711
1724
  if (!(length > 0)) continue;
1712
1725
  const kat = kf.at ?? 0;
@@ -1786,7 +1799,7 @@ function inspectScene(root, frame, time, canvas, opts = {}) {
1786
1799
  if (motion.ever) hasMotion.add(info);
1787
1800
  let shown = bounds ? clip(bounds, view) : null;
1788
1801
  const maskTarget = seq.maskSequence?.target;
1789
- const maskSrc = chunkDS2EWRV4_cjs.maskSourceOf(seq.spec.mask);
1802
+ const maskSrc = chunkOGLRSR6C_cjs.maskSourceOf(seq.spec.mask);
1790
1803
  if (shown && maskTarget && !(maskSrc.kind === "inline" && maskSrc.invert)) {
1791
1804
  const m = maskTarget.getBounds();
1792
1805
  shown = clip(shown, { x: m.x, y: m.y, width: m.width, height: m.height });
@@ -1795,7 +1808,7 @@ function inspectScene(root, frame, time, canvas, opts = {}) {
1795
1808
  const group = parentScene ?? (name !== void 0 && blending.has(name) ? name : void 0);
1796
1809
  if (group) scene.set(info, group);
1797
1810
  if (zero || seq.showsNothingYet) scaledToNothing.add(info);
1798
- if (seq instanceof chunkDS2EWRV4_cjs.CompositionSequence) walk3(seq, prefix + label + "/", insideThreeD || threeD, visible, group, motion, zero, parentAlpha * alpha);
1811
+ if (seq instanceof chunkOGLRSR6C_cjs.CompositionSequence) walk3(seq, prefix + label + "/", insideThreeD || threeD, visible, group, motion, zero, parentAlpha * alpha);
1799
1812
  });
1800
1813
  };
1801
1814
  walk3(root, "", false, true);
@@ -1967,12 +1980,12 @@ function pickScene(root, x, y, opts = {}, deps = {}) {
1967
1980
  const alive = (threeD ? d.visible : (t?.renderable ?? true) && t?.visible !== false) && carriers.every((c) => c.target?.renderable ?? true);
1968
1981
  const visible = parentVisible && alive && alpha > 0;
1969
1982
  if (!visible) {
1970
- if (seq instanceof chunkDS2EWRV4_cjs.CompositionSequence && !threeD && parentVisible && alpha > 0 && t?.visible === false && (t?.renderable ?? true) && carriers.every((c) => c.target?.renderable ?? true)) hiddenSources.set(seq, path);
1983
+ if (seq instanceof chunkOGLRSR6C_cjs.CompositionSequence && !threeD && parentVisible && alpha > 0 && t?.visible === false && (t?.renderable ?? true) && carriers.every((c) => c.target?.renderable ?? true)) hiddenSources.set(seq, path);
1971
1984
  return;
1972
1985
  }
1973
- const isComposition = seq instanceof chunkDS2EWRV4_cjs.CompositionSequence;
1986
+ const isComposition = seq instanceof chunkOGLRSR6C_cjs.CompositionSequence;
1974
1987
  if (isComposition && !threeD) {
1975
- const gm = seq.maskSequence?.target, gs = chunkDS2EWRV4_cjs.maskSourceOf(seq.spec.mask);
1988
+ const gm = seq.maskSequence?.target, gs = chunkOGLRSR6C_cjs.maskSourceOf(seq.spec.mask);
1976
1989
  if (gm && gs.kind === "inline" && !gs.invert && !inMask(gm, at)) return;
1977
1990
  walk3(seq, path + "/", visible, at, orderBase, via);
1978
1991
  return;
@@ -2028,7 +2041,7 @@ function pickScene(root, x, y, opts = {}, deps = {}) {
2028
2041
  }
2029
2042
  if (!hit) return;
2030
2043
  const maskTarget = seq.maskSequence?.target;
2031
- const maskSrc = chunkDS2EWRV4_cjs.maskSourceOf(seq.spec.mask);
2044
+ const maskSrc = chunkOGLRSR6C_cjs.maskSourceOf(seq.spec.mask);
2032
2045
  if (maskTarget && !(maskSrc.kind === "inline" && maskSrc.invert) && !(maskSrc.kind === "inline" ? inMask(maskTarget, point) : inside(maskTarget.getBounds(), point))) return;
2033
2046
  found.push({ hit: via ? { ...hit, point: { x, y }, via } : hit, order: orderBase ? [...orderBase, ...orderOf(d)] : orderOf(d) });
2034
2047
  });
@@ -2038,7 +2051,7 @@ function pickScene(root, x, y, opts = {}, deps = {}) {
2038
2051
  const path = hiddenSources.get(f.source);
2039
2052
  if (path === void 0) continue;
2040
2053
  const g = f.source.target.toGlobal({ x: f.at.x * f.source.intrinsicWidth, y: f.at.y * f.source.intrinsicHeight });
2041
- const sm = f.source.maskSequence?.target, ss = chunkDS2EWRV4_cjs.maskSourceOf(f.source.spec.mask);
2054
+ const sm = f.source.maskSequence?.target, ss = chunkOGLRSR6C_cjs.maskSourceOf(f.source.spec.mask);
2042
2055
  if (sm && ss.kind === "inline" && !ss.invert && !inMask(sm, g)) continue;
2043
2056
  walk3(f.source, path + "/", true, g, f.order, f.via);
2044
2057
  }
@@ -2074,7 +2087,7 @@ function walk(root, visit) {
2074
2087
  visit(seq);
2075
2088
  const mask = seq.maskSequence;
2076
2089
  if (mask) visit(mask);
2077
- if (seq instanceof chunkDS2EWRV4_cjs.CompositionSequence) walk(seq, visit);
2090
+ if (seq instanceof chunkOGLRSR6C_cjs.CompositionSequence) walk(seq, visit);
2078
2091
  }
2079
2092
  }
2080
2093
  function reusePoolOf(old) {
@@ -2175,7 +2188,7 @@ var round = (n) => Math.round(n * 1e6) / 1e6;
2175
2188
  var family = (name) => name.replace(/\d+/g, "#");
2176
2189
  function detailOf(seq) {
2177
2190
  const s = seq.spec;
2178
- const spans = chunkCJS2S5XU_cjs.spansMeta.get(seq.spec)?.preview;
2191
+ const spans = chunkECLBZV4N_cjs.spansMeta.get(seq.spec)?.preview;
2179
2192
  if (spans) return spans.length > 60 ? spans.slice(0, 57) + "\u2026" : spans;
2180
2193
  if (typeof s.text === "string") return s.text.length > 60 ? s.text.slice(0, 57) + "\u2026" : s.text;
2181
2194
  if (typeof s.asset === "string") return `asset \u201C${s.asset}\u201D`;
@@ -2191,10 +2204,10 @@ function walk2(comp, parentStart, parentEnd, depth, prefix, rows, transitions, l
2191
2204
  const start = parentStart + (seq.at ?? 0);
2192
2205
  const end = Math.min(parentEnd, seq.duration !== void 0 ? start + seq.duration : parentEnd);
2193
2206
  const span = end - start;
2194
- const keys = (seq.spec.keyframes ?? []).map((kf) => round(start + chunkCJS2S5XU_cjs.resolveAt(kf.at, span))).sort((a, b) => a - b).slice(0, MAX_KEYS);
2207
+ const keys = (seq.spec.keyframes ?? []).map((kf) => round(start + chunkECLBZV4N_cjs.resolveAt(kf.at, span))).sort((a, b) => a - b).slice(0, MAX_KEYS);
2195
2208
  const row = { path: prefix + name, name, type: seq.spec.type, depth, start: round(start), end: round(end), keys, detail: detailOf(seq), ...local ? { local } : {} };
2196
2209
  const inner = [];
2197
- const isComp = seq instanceof chunkDS2EWRV4_cjs.CompositionSequence;
2210
+ const isComp = seq instanceof chunkOGLRSR6C_cjs.CompositionSequence;
2198
2211
  if (isComp) {
2199
2212
  const label = seq.remapLabel();
2200
2213
  walk2(seq, label ? 0 : start, label ? seq.contentSpan : end, depth + 1, prefix + name + "/", inner, transitions, label ? `${name} ${label}` : local);
@@ -2353,7 +2366,7 @@ function sheetLayout(n, columns, cellW, srcW, srcH, labelH) {
2353
2366
  }
2354
2367
 
2355
2368
  // src/core/vars.ts
2356
- var RESERVED_NAMES = ["w", "h", "W", "H", "GW", "GH", "t", "d", "T", "contain", "cover", "value", ...chunkCJS2S5XU_cjs.EXPRESSION_NAMES];
2369
+ var RESERVED_NAMES = ["w", "h", "W", "H", "GW", "GH", "t", "d", "T", "contain", "cover", "value", ...chunkECLBZV4N_cjs.EXPRESSION_NAMES];
2357
2370
  var NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
2358
2371
  var isPlain = (v) => !!v && typeof v === "object" && (Object.getPrototypeOf(v) === Object.prototype || Object.getPrototypeOf(v) === null);
2359
2372
  function normalizeVars(raw, where, warn = (m) => console.warn(m)) {
@@ -2897,8 +2910,8 @@ var Movie = class {
2897
2910
  this.stops = normalizeStops(applyVars(options.composition, this._vars)?.stops, this.duration, this.frameRate);
2898
2911
  this._posterFrame = poster.frame;
2899
2912
  this.background = options.background ?? "#000000";
2900
- this.timeline = chunkCJS2S5XU_cjs.createTimeline({ paused: true, defaults: { ease: "none" } });
2901
- chunkCJS2S5XU_cjs.lengthen(this.timeline, this.duration);
2913
+ this.timeline = chunkECLBZV4N_cjs.createTimeline({ paused: true, defaults: { ease: "none" } });
2914
+ chunkECLBZV4N_cjs.lengthen(this.timeline, this.duration);
2902
2915
  const baseAppOptions = {
2903
2916
  width: this.width,
2904
2917
  height: this.height,
@@ -2997,7 +3010,7 @@ var Movie = class {
2997
3010
  height: sizeWins ? height : spec.height ?? height,
2998
3011
  duration: spec.duration ?? this.duration
2999
3012
  } : void 0;
3000
- await chunkCJS2S5XU_cjs.ensureFilterLibrary(seededComposition);
3013
+ await chunkECLBZV4N_cjs.ensureFilterLibrary(seededComposition);
3001
3014
  if (chunkWYR2AU4W_cjs.usesAdvancedBlend(seededComposition)) await chunkWYR2AU4W_cjs.enableAdvancedBlend(this.app.renderer);
3002
3015
  const userComposition = seededComposition ? expandTransitions(seededComposition) : void 0;
3003
3016
  const rootSeqSpec = {
@@ -3008,7 +3021,7 @@ var Movie = class {
3008
3021
  ...userComposition
3009
3022
  };
3010
3023
  if (userComposition) carryTransitionWindows(userComposition, rootSeqSpec);
3011
- const sequence = new chunkDS2EWRV4_cjs.CompositionSequence(rootSeqSpec, null, rootShape);
3024
+ const sequence = new chunkOGLRSR6C_cjs.CompositionSequence(rootSeqSpec, null, rootShape);
3012
3025
  lp?.begin("build", countLayers(rootSeqSpec));
3013
3026
  try {
3014
3027
  await sequence.build();
@@ -3147,8 +3160,8 @@ var Movie = class {
3147
3160
  if (!changed) return { reason, ms: 0, audio: "none", frame: this.currentFrame, playing: this.isPlaying, unchanged: true };
3148
3161
  sequence = await this._construct(composition, vars, width, height, void 0, this._resized || sizeChanged, reusePoolOf(this._rootSequence));
3149
3162
  alive();
3150
- const timeline = chunkCJS2S5XU_cjs.createTimeline({ paused: true, defaults: { ease: "none" } });
3151
- chunkCJS2S5XU_cjs.lengthen(timeline, this.duration);
3163
+ const timeline = chunkECLBZV4N_cjs.createTimeline({ paused: true, defaults: { ease: "none" } });
3164
+ chunkECLBZV4N_cjs.lengthen(timeline, this.duration);
3152
3165
  sequence.bindTimeline(timeline);
3153
3166
  const hadSound = this.audioBuffer !== null;
3154
3167
  const audio = await this._mixSound(sequence, this._ensureAudioContext());
@@ -3923,7 +3936,7 @@ function countLayers(spec) {
3923
3936
  n += 1 + countLayers(s);
3924
3937
  const spans = s.spans;
3925
3938
  if (Array.isArray(spans)) n += spans.length;
3926
- const src = chunkDS2EWRV4_cjs.maskSourceOf(mask);
3939
+ const src = chunkOGLRSR6C_cjs.maskSourceOf(mask);
3927
3940
  if (src.kind === "inline") n += 1 + countLayers(src.spec);
3928
3941
  }
3929
3942
  return n;
@@ -4012,8 +4025,8 @@ function splitVertical(text, style, ts, right, top, align, by) {
4012
4025
 
4013
4026
  // src/presets/_ease.ts
4014
4027
  function parseEase2(name) {
4015
- chunkCJS2S5XU_cjs.checkEase(name, "a preset");
4016
- return chunkCJS2S5XU_cjs.parseEase(name);
4028
+ chunkECLBZV4N_cjs.checkEase(name, "a preset");
4029
+ return chunkECLBZV4N_cjs.parseEase(name);
4017
4030
  }
4018
4031
 
4019
4032
  // src/presets/kenBurns.ts
@@ -4148,17 +4161,17 @@ function orbit(opts) {
4148
4161
  throw new Error("pixi-effects: orbit() cannot combine `radius` with `dollyZoom` \u2014 the radius follows the animated fov");
4149
4162
  }
4150
4163
  const [cx, cy] = opts.center ?? [width / 2, height / 2];
4151
- const fixedR = opts.radius ?? chunkCJS2S5XU_cjs.homeDistance(height, fov ?? chunkCJS2S5XU_cjs.DEFAULT_FOV);
4164
+ const fixedR = opts.radius ?? chunkECLBZV4N_cjs.homeDistance(height, fov ?? chunkECLBZV4N_cjs.DEFAULT_FOV);
4152
4165
  const start = opts.start ?? -degrees / 2;
4153
4166
  const steps = Math.max(1, Math.round(duration * stepsPerSecond));
4154
4167
  const easeFn = parseEase2(ease);
4155
4168
  const dollyEase = dolly ? parseEase2(dolly.ease ?? ease) : null;
4156
4169
  const pos = (i) => {
4157
4170
  const p = i / steps;
4158
- const a = (start + degrees * easeFn(p)) * chunkCJS2S5XU_cjs.DEG;
4171
+ const a = (start + degrees * easeFn(p)) * chunkECLBZV4N_cjs.DEG;
4159
4172
  if (!dolly) return { x: cx + fixedR * Math.sin(a), z: fixedR * Math.cos(a) };
4160
4173
  const f = dolly.from + (dolly.to - dolly.from) * dollyEase(p);
4161
- const R = chunkCJS2S5XU_cjs.homeDistance(height, f);
4174
+ const R = chunkECLBZV4N_cjs.homeDistance(height, f);
4162
4175
  return { x: cx + R * Math.sin(a), z: R * Math.cos(a), fov: f };
4163
4176
  };
4164
4177
  const keyframes = [];
@@ -4213,7 +4226,7 @@ function particles(opts) {
4213
4226
  const round2 = (v) => Math.round(v * 1e6) / 1e6;
4214
4227
  const out = [];
4215
4228
  for (let i = 0; i < count; i++) {
4216
- const r = chunkCJS2S5XU_cjs.random(seed * 1000003 + i * 7919 + 17);
4229
+ const r = chunkECLBZV4N_cjs.random(seed * 1000003 + i * 7919 + 17);
4217
4230
  const pick = ([a2, b]) => a2 + r() * (b - a2);
4218
4231
  const born = at + r() * emit;
4219
4232
  const lifetime = pick(life);
@@ -4226,7 +4239,7 @@ function particles(opts) {
4226
4239
  const turn = spin ? pick(spin) : 0;
4227
4240
  const startAngle = spin ? r() * 360 : 0;
4228
4241
  const swayAmp = sway?.amp ?? 0, swayFreq = sway?.freq ?? 1;
4229
- const n0 = sway ? chunkCJS2S5XU_cjs.noise(0, seed * 1000003 + i) : 0;
4242
+ const n0 = sway ? chunkECLBZV4N_cjs.noise(0, seed * 1000003 + i) : 0;
4230
4243
  const at_ = (t) => {
4231
4244
  const axis = (p0, v0, acc) => {
4232
4245
  if (drag > 0) {
@@ -4235,7 +4248,7 @@ function particles(opts) {
4235
4248
  }
4236
4249
  return p0 + v0 * t + 0.5 * acc * t * t;
4237
4250
  };
4238
- const sw = sway ? swayAmp * (chunkCJS2S5XU_cjs.noise(t * swayFreq, seed * 1000003 + i) - n0) : 0;
4251
+ const sw = sway ? swayAmp * (chunkECLBZV4N_cjs.noise(t * swayFreq, seed * 1000003 + i) - n0) : 0;
4239
4252
  return { x: axis(x0, vx, wind) + sw, y: axis(y0, vy, gravity) };
4240
4253
  };
4241
4254
  const kfs = [];
@@ -4297,7 +4310,7 @@ function followPath(opts) {
4297
4310
  if (steps > MAX_STEPS) throw new Error(`followPath(): ${steps} samples is too many (max ${MAX_STEPS}); lower frameRate or duration`);
4298
4311
  const segments = [];
4299
4312
  let total = 0;
4300
- for (const line of chunkCJS2S5XU_cjs.flattenSvgPath(d)) {
4313
+ for (const line of chunkECLBZV4N_cjs.flattenSvgPath(d)) {
4301
4314
  const p = line.closed ? [...line.pts, line.pts[0], line.pts[1]] : line.pts;
4302
4315
  for (let i = 2; i < p.length; i += 2) {
4303
4316
  const len = Math.hypot(p[i] - p[i - 2], p[i + 1] - p[i - 1]);
@@ -4350,7 +4363,7 @@ function followPath(opts) {
4350
4363
  // src/core/pathSample.ts
4351
4364
  function samplePath(d) {
4352
4365
  if (typeof d !== "string" || d.trim() === "") throw new Error('samplePath(): d must be SVG path data, e.g. "M 40 300 C 200 20 400 20 560 300"');
4353
- const lines = chunkCJS2S5XU_cjs.flattenSvgPath(d);
4366
+ const lines = chunkECLBZV4N_cjs.flattenSvgPath(d);
4354
4367
  const segments = [];
4355
4368
  let length = 0;
4356
4369
  for (const line of lines) {
@@ -4381,7 +4394,7 @@ function samplePath(d) {
4381
4394
  return { x: g.x0 + (g.x1 - g.x0) * t, y: g.y0 + (g.y1 - g.y0) * t, angle: Math.atan2(g.y1 - g.y0, g.x1 - g.x0) };
4382
4395
  },
4383
4396
  trim(start = 0, end = 1) {
4384
- return chunkCJS2S5XU_cjs.trimPolylines(lines, start, end).map((l) => l.closed ? [...l.pts, l.pts[0], l.pts[1]] : l.pts);
4397
+ return chunkECLBZV4N_cjs.trimPolylines(lines, start, end).map((l) => l.closed ? [...l.pts, l.pts[0], l.pts[1]] : l.pts);
4385
4398
  }
4386
4399
  };
4387
4400
  }
@@ -4492,7 +4505,7 @@ function distances(n, from, grid, seed) {
4492
4505
  if (n === 0) return [];
4493
4506
  if (from === "random") {
4494
4507
  const order = Array.from({ length: n }, (_, i) => i);
4495
- const r = chunkCJS2S5XU_cjs.random(seed);
4508
+ const r = chunkECLBZV4N_cjs.random(seed);
4496
4509
  for (let i = n - 1; i > 0; i--) {
4497
4510
  const j = Math.floor(r() * (i + 1));
4498
4511
  [order[i], order[j]] = [order[j], order[i]];
@@ -4554,7 +4567,7 @@ function wiggle(opts) {
4554
4567
  to[n] = p.around;
4555
4568
  return;
4556
4569
  }
4557
- const off = (chunkCJS2S5XU_cjs.rand(seed * 7919 + pi * 104729 + s * 31 + 1) * 2 - 1) * p.amp;
4570
+ const off = (chunkECLBZV4N_cjs.rand(seed * 7919 + pi * 104729 + s * 31 + 1) * 2 - 1) * p.amp;
4558
4571
  to[n] = typeof p.around === "number" ? p.around + off : `(${p.around}) ${off < 0 ? "-" : "+"} ${Math.abs(off)}`;
4559
4572
  });
4560
4573
  out.push({ at: at + s * stepLen, to, duration: stepLen, ease });
@@ -5025,5 +5038,5 @@ exports.splitText = splitText;
5025
5038
  exports.stagger = stagger;
5026
5039
  exports.wiggle = wiggle;
5027
5040
  exports.withFade = withFade;
5028
- //# sourceMappingURL=chunk-AES2L75M.cjs.map
5029
- //# sourceMappingURL=chunk-AES2L75M.cjs.map
5041
+ //# sourceMappingURL=chunk-2AT5WSSV.cjs.map
5042
+ //# sourceMappingURL=chunk-2AT5WSSV.cjs.map