@motionscript/code 0.1.0 → 0.1.1-alpha.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +2 -2
  3. package/dist/browser/index.js +8 -8
  4. package/dist/browser/index.js.map +3 -3
  5. package/dist/browser/manifest.json +1 -1
  6. package/dist/code-range.d.ts +7 -47
  7. package/dist/code-range.d.ts.map +1 -1
  8. package/dist/code-range.js +8 -45
  9. package/dist/code-range.js.map +1 -1
  10. package/dist/diff.d.ts +5 -44
  11. package/dist/diff.d.ts.map +1 -1
  12. package/dist/diff.js +22 -69
  13. package/dist/diff.js.map +1 -1
  14. package/dist/engine.d.ts.map +1 -1
  15. package/dist/engine.js +3 -7
  16. package/dist/engine.js.map +1 -1
  17. package/dist/highlight.d.ts +13 -31
  18. package/dist/highlight.d.ts.map +1 -1
  19. package/dist/highlight.js +25 -87
  20. package/dist/highlight.js.map +1 -1
  21. package/dist/layout.d.ts +7 -26
  22. package/dist/layout.d.ts.map +1 -1
  23. package/dist/layout.js +5 -20
  24. package/dist/layout.js.map +1 -1
  25. package/dist/measure-cache.d.ts +5 -27
  26. package/dist/measure-cache.d.ts.map +1 -1
  27. package/dist/measure-cache.js +0 -0
  28. package/dist/measure-cache.js.map +1 -1
  29. package/dist/node.d.ts +4 -11
  30. package/dist/node.d.ts.map +1 -1
  31. package/dist/node.js +18 -41
  32. package/dist/node.js.map +1 -1
  33. package/dist/nodes.d.ts +0 -12
  34. package/dist/nodes.d.ts.map +1 -1
  35. package/dist/nodes.js +0 -12
  36. package/dist/nodes.js.map +1 -1
  37. package/dist/render.d.ts +5 -14
  38. package/dist/render.d.ts.map +1 -1
  39. package/dist/render.js +13 -54
  40. package/dist/render.js.map +1 -1
  41. package/dist/style.d.ts +6 -61
  42. package/dist/style.d.ts.map +1 -1
  43. package/dist/style.js +4 -40
  44. package/dist/style.js.map +1 -1
  45. package/dist/tokens.d.ts +1 -10
  46. package/dist/tokens.d.ts.map +1 -1
  47. package/dist/tokens.js +3 -38
  48. package/dist/tokens.js.map +1 -1
  49. package/dist/transitions.d.ts +16 -68
  50. package/dist/transitions.d.ts.map +1 -1
  51. package/dist/transitions.js +5 -17
  52. package/dist/transitions.js.map +1 -1
  53. package/package.json +4 -4
  54. package/src/code-range.ts +9 -53
  55. package/src/diff.ts +26 -92
  56. package/src/engine.ts +3 -7
  57. package/src/highlight.ts +25 -98
  58. package/src/layout.ts +10 -35
  59. package/src/measure-cache.ts +0 -0
  60. package/src/node.ts +21 -57
  61. package/src/nodes.ts +0 -12
  62. package/src/render.ts +17 -61
  63. package/src/style.ts +9 -64
  64. package/src/tokens.ts +4 -46
  65. package/src/transitions.ts +16 -72
@@ -1 +1 @@
1
- {"version":3,"file":"measure-cache.js","sourceRoot":"","sources":["../src/measure-cache.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,iBAAiB;IAClB,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,GAAG,GAAG,EAAE,CAAC;IAEjB,+EAA+E;IAC/E,SAAS,CAAC,QAAgB,EAAE,UAAkB;QAC1C,OAAO,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC;IACvC,CAAC;IAED,0EAA0E;IAC1E,IAAI,CAAC,GAAW;QACZ,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACnB,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,OAAO,CACH,KAAyC,EACzC,OAAe,EACf,QAAgB,EAChB,UAAkB,EAClB,aAAqB;QAErB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,aAAa,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QAClC,wEAAwE;QACxE,8DAA8D;QAC9D,iDAAiD;QACjD,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QAC7F,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ","sourcesContent":["import { MeasureContext2D, RenderContext2D } from \"@motionscript/sdk\";\n\n/**\n * Memoizes text-advance measurements for the Code node.\n *\n * `scope.measureText` runs a full paragraph layout (shaping plus\n * font object alloc/free) on every call — far too expensive to repeat for every\n * token on every frame. A token's advance only depends on (content, fontSize,\n * fontFamily, letterSpacing); content changes only at edit time and the font\n * inputs only change via props, so the same string measures to the same width\n * across the many static frames the player renders.\n *\n * fontSize + fontFamily fold into a `signature` checked once per frame: when it\n * changes the cache clears. letterSpacing folds into the per-entry key so the\n * letter-spaced token advances and the unspaced gutter advances coexist in one\n * map. The signature check (not the node's `set()`) is the invalidation point on\n * purpose — animated/bound font props (`to({ fontSize })`, `fontSize={() => …}`)\n * bypass `set()` but still flow through the per-frame signature comparison.\n *\n * NOTE: the two `measureText` implementations in packages/browser/src\n * (measure-scope.ts and render-context.ts) are uncached and shape+free fonts on\n * every call. A shared cache there would speed up all text nodes, but it touches\n * shared infra and cross-font correctness, so it's intentionally left out here.\n */\nexport class TokenAdvanceCache {\n private cache = new Map<string, number>();\n private sig = \"\";\n\n /** Signature of the font inputs that, when changed, invalidate every entry. */\n signature(fontSize: number, fontFamily: string): string {\n return `${fontSize}|${fontFamily}`;\n }\n\n /** Clear the cache if the font signature changed since the last frame. */\n sync(sig: string): void {\n if (sig !== this.sig) {\n this.cache.clear();\n this.sig = sig;\n }\n }\n\n /**\n * Advance width of `content`, measured once per unique (content,\n * letterSpacing) pair under the current font signature. Call `sync()` first\n * each frame so a font change is reflected.\n */\n advance(\n scope: MeasureContext2D | RenderContext2D,\n content: string,\n fontSize: number,\n fontFamily: string,\n letterSpacing: number,\n ): number {\n if (content.length === 0) return 0;\n const key = `${content}\u0000${letterSpacing}`;\n const hit = this.cache.get(key);\n if (hit !== undefined) return hit;\n // Only the advance width is cached: a code block's geometry is a column\n // of x offsets, and its line height comes from the node's own\n // `lineHeight` prop rather than from the shaper.\n const { width } = scope.measureText(content, fontSize, fontFamily, undefined, letterSpacing);\n this.cache.set(key, width);\n return width;\n }\n}\n"]}
1
+ {"version":3,"file":"measure-cache.js","sourceRoot":"","sources":["../src/measure-cache.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAClB,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClC,GAAG,GAAG,EAAE,CAAC;IAEjB,SAAS,CAAC,QAAgB,EAAE,UAAkB;QAC1C,OAAO,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC;IACvC,CAAC;IAED,6EAA6E;IAC7E,IAAI,CAAC,GAAW;QACZ,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACnB,CAAC;IACL,CAAC;IAED,8GAA8G;IAC9G,OAAO,CACH,KAAyC,EACzC,OAAe,EACf,QAAgB,EAChB,UAAkB,EAClB,aAAqB;QAErB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,aAAa,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QAClC,4EAA4E;QAC5E,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QAC7F,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ","sourcesContent":["import { MeasureContext2D, RenderContext2D } from \"@motionscript/sdk\";\n\n/**\n * Memoizes token advances: `measureText` runs a full paragraph layout, too costly\n * per token per frame. The per-frame `signature` check, not the node's `set()`, is\n * the invalidation point because animated or bound font props bypass `set()`.\n */\nexport class TokenAdvanceCache {\n private cache = new Map<string, number>();\n private sig = \"\";\n\n signature(fontSize: number, fontFamily: string): string {\n return `${fontSize}|${fontFamily}`;\n }\n\n /** Clears the cache when the font signature changed since the last frame. */\n sync(sig: string): void {\n if (sig !== this.sig) {\n this.cache.clear();\n this.sig = sig;\n }\n }\n\n /** Measured once per (content, letterSpacing) under the current signature; call `sync()` first each frame. */\n advance(\n scope: MeasureContext2D | RenderContext2D,\n content: string,\n fontSize: number,\n fontFamily: string,\n letterSpacing: number,\n ): number {\n if (content.length === 0) return 0;\n const key = `${content}\u0000${letterSpacing}`;\n const hit = this.cache.get(key);\n if (hit !== undefined) return hit;\n // Width only: line height comes from the `lineHeight` prop, not the shaper.\n const { width } = scope.measureText(content, fontSize, fontFamily, undefined, letterSpacing);\n this.cache.set(key, width);\n return width;\n }\n}\n"]}
package/dist/node.d.ts CHANGED
@@ -1,10 +1,6 @@
1
1
  import { type NodeOf, type NormalizedColor, type Color as _Color, type Node2D as _Node2D, type Node2DProps as _Node2DProps } from "@motionscript/sdk";
2
2
  import { type CodeDiffStrategy, type CodePhaseStrategy, type CodeRange, type CodeTheme, type DimTransition, type IdLine, type RowBand, type RowsTransition, type StructuralTransition } from "./engine.js";
3
- /**
4
- * Which token became which across an edit, and when each part of it happens.
5
- * Arguments of {@link defineCode}: a strategy is a function, which a prop would
6
- * take for a binding, so it is part of the component's definition instead.
7
- */
3
+ /** Arguments of {@link defineCode}: a strategy is a function, which a prop would take for a binding, so it belongs to the definition. */
8
4
  export interface CodeStrategies {
9
5
  /** Decides which token became which across an edit. Defaults to `defaultCodeDiff`. */
10
6
  diffStrategy?: CodeDiffStrategy;
@@ -50,12 +46,9 @@ export interface CodeBanding {
50
46
  readonly fade: RowsTransition | null;
51
47
  }
52
48
  /**
53
- * A `Code` whose edits are paired and timed by `strategies`. {@link Code} is
54
- * the one with the defaults; a project wanting another hands its own to the
55
- * engine in its place (the key is the same).
56
- *
57
- * A listing and nothing else: no paint slots, and no box behind the tokens. A
58
- * listing set on a card is a `Code` inside a hugging `Rect`.
49
+ * A `Code` whose edits are paired and timed by `strategies`; {@link Code} has the
50
+ * defaults, and a project wanting another hands its own to the engine (same key).
51
+ * A listing only, with no box behind it: a card is a `Code` inside a hugging `Rect`.
59
52
  */
60
53
  export declare function defineCode(strategies?: CodeStrategies): import("@motionscript/sdk").Component<"code", import("@motionscript/sdk").Merge<import("@motionscript/sdk").Box2DState, {
61
54
  readonly code: import("@motionscript/sdk").Type<string, CodeSource, false>;
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
package/dist/node.js CHANGED
@@ -14,12 +14,9 @@ function own(initial) {
14
14
  const TARGET = Types.custom(undefined, { kind: "selector" });
15
15
  const TEXT = Types.text("", { multiline: true });
16
16
  /**
17
- * A `Code` whose edits are paired and timed by `strategies`. {@link Code} is
18
- * the one with the defaults; a project wanting another hands its own to the
19
- * engine in its place (the key is the same).
20
- *
21
- * A listing and nothing else: no paint slots, and no box behind the tokens. A
22
- * listing set on a card is a `Code` inside a hugging `Rect`.
17
+ * A `Code` whose edits are paired and timed by `strategies`; {@link Code} has the
18
+ * defaults, and a project wanting another hands its own to the engine (same key).
19
+ * A listing only, with no box behind it: a card is a `Code` inside a hugging `Rect`.
23
20
  */
24
21
  export function defineCode(strategies = {}) {
25
22
  const kit = {
@@ -188,10 +185,7 @@ export function findRangeAt(source, text, index) {
188
185
  export function findFirstRange(source, text) {
189
186
  return findRangeAt(source, text, 0);
190
187
  }
191
- /**
192
- * A `to({ code })` mid-flight comes first: it wrote `code` after any edit
193
- * command did. Then an edit command in flight, then the settled listing.
194
- */
188
+ /** A `to({ code })` mid-flight wins, as it wrote `code` after any edit command; then an edit in flight, then the settled listing. */
195
189
  function shown(s, kit) {
196
190
  const code = s.code;
197
191
  if (typeof code !== "string") {
@@ -211,10 +205,9 @@ function current(s, kit) {
211
205
  return settled(s, normalizeSource(sourceText(s.code)), kit);
212
206
  }
213
207
  /**
214
- * The structure `source` settles on. Until a listing command has acted, the
215
- * props are all there is; after one, it is the listing that command left,
216
- * recoloured keeping its ids when only the theme moved, and diffed onward
217
- * when the source has (a `to({ code })` that landed, a binding).
208
+ * The structure `source` settles on: from the props until a listing command has
209
+ * acted, then the listing it left, recoloured (ids kept) when only the theme moved
210
+ * and diffed onward when the source has.
218
211
  */
219
212
  function settled(s, source, kit) {
220
213
  const basis = basisOf(s);
@@ -230,7 +223,7 @@ function settled(s, source, kit) {
230
223
  return derived(source, basis);
231
224
  }
232
225
  function basisOf(s) {
233
- return { language: s.language, theme: s.theme, highlighted: canHighlight(s.language, s.theme) };
226
+ return { language: s.language, theme: s.theme, highlighted: canHighlight(s.language) };
234
227
  }
235
228
  function sameBasis(a, b) {
236
229
  return a.language === b.language && a.theme === b.theme && a.highlighted === b.highlighted;
@@ -239,10 +232,7 @@ function sameBasis(a, b) {
239
232
  function sourceText(code) {
240
233
  return typeof code === "string" ? code : code.to;
241
234
  }
242
- /**
243
- * Mid-tween `code` holds both sources, so the frame can draw the edit between
244
- * them; at either end it is a source again.
245
- */
235
+ /** Mid-tween `code` holds both sources so the frame can draw the edit between them; at either end it is a source again. */
246
236
  function blendSource(from, to, t) {
247
237
  const leaving = sourceText(from);
248
238
  const arriving = sourceText(to);
@@ -303,7 +293,7 @@ function buildEdit(kit, from, next, basis) {
303
293
  function tokenize(source, basis) {
304
294
  // Best effort outside the asset pipeline (a test, a headless measure): on the timeline `load` has the grammar in first.
305
295
  if (!basis.highlighted)
306
- ensureHighlighter(undefined, [basis.language]).catch(() => { });
296
+ ensureHighlighter([basis.language]).catch(() => { });
307
297
  return tokenizeCodeToIdLines(source, basis.language, basis.theme);
308
298
  }
309
299
  const styleIds = new WeakMap();
@@ -356,11 +346,7 @@ function adoptIds(from, to) {
356
346
  to[i].tokens[j].id = from[i].tokens[j].id;
357
347
  }
358
348
  }
359
- /**
360
- * Each command writes the listing it acted on, at every time it is asked for,
361
- * so the ids it captured are the ones drawn; before it starts the timeline has
362
- * put back the props, and the listing is derived from them again.
363
- */
349
+ /** Each command writes the listing it acted on at every time asked, so the ids it captured are the ones drawn. */
364
350
  function editFrame(kit, seen, source, basis) {
365
351
  const next = normalizeSource(source);
366
352
  if (next === seen.source)
@@ -502,10 +488,7 @@ function rowBandsIn(lines, codeRanges, color, radius) {
502
488
  }
503
489
  return bands;
504
490
  }
505
- /**
506
- * A single range (a plain object) as a one-element array; a chain or an array
507
- * of ranges as itself; the `{ list }` a chain serialises as, as that chain.
508
- */
491
+ /** One range as a one-element array; a chain or array as itself; the `{ list }` a chain serialises as, as that chain. */
509
492
  function normalizeCodeRanges(codeRange) {
510
493
  const maybeIterable = codeRange;
511
494
  if (typeof maybeIterable[Symbol.iterator] === "function") {
@@ -517,12 +500,11 @@ function normalizeCodeRanges(codeRange) {
517
500
  return [codeRange];
518
501
  }
519
502
  const grammarLoaders = new Map();
520
- // One function per language: blocks sharing a grammar declare one key, and a
521
- // second load function for a key already declared is ignored with a warning.
503
+ // One function per language: a second load function for an already-declared task key is ignored with a warning.
522
504
  function grammarLoader(language) {
523
505
  let load = grammarLoaders.get(language);
524
506
  if (load === undefined) {
525
- load = () => ensureHighlighter(undefined, [language]);
507
+ load = () => ensureHighlighter([language]);
526
508
  grammarLoaders.set(language, load);
527
509
  }
528
510
  return load;
@@ -546,11 +528,7 @@ function metricsOf(s) {
546
528
  lineNumberGap: s.lineNumberGap,
547
529
  };
548
530
  }
549
- /**
550
- * The one or two layouts a frame is drawn from: a settled frame has one, a
551
- * frame inside an edit two (where every token was, and where it is going).
552
- * `null` for a node never measured, which has nothing to measure them with.
553
- */
531
+ /** One layout for a settled frame, two (where every token was, where it goes) inside an edit; `null` for a node never measured. */
554
532
  function layoutsOf(measured, view, m) {
555
533
  const signature = measured.advances.signature(m.fontSize, m.fontFamily);
556
534
  measured.advances.sync(signature);
@@ -626,10 +604,9 @@ function drawListing(ctx, s, kit) {
626
604
  });
627
605
  }
628
606
  /**
629
- * A listing is grabbed by its text, line by ragged line: each line a slot as
630
- * wide as its ink, plus the gutter where numbers show, inside the box. Code is
631
- * mostly whitespace, and its empty corners would swallow clicks meant for what
632
- * is behind it. Mid-edit, or before it is laid out, the box.
607
+ * A listing is picked by its ink, line by ragged line (plus the gutter), inside the
608
+ * box: code is mostly whitespace and empty corners would swallow clicks meant for
609
+ * what is behind. Mid-edit, or before layout, the box.
633
610
  */
634
611
  function outlineOf(view, layouts, m, size) {
635
612
  const box = { x: 0, y: 0, width: size.width, height: size.height };
package/dist/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,KAAK,EACL,KAAK,EACL,WAAW,EACX,UAAU,GAab,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACH,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,GAaxB,MAAM,UAAU,CAAC;AAElB,kFAAkF;AAClF,MAAM,cAAc,GAAG,2BAA2B,CAAC;AACnD,MAAM,eAAe,GAAG,CAAC,CAAC;AA0D1B,yFAAyF;AACzF,MAAM,IAAI,GAAG,IAAI,OAAO,EAAe,CAAC;AAExC,MAAM,QAAQ,GAAc,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACtE,MAAM,UAAU,GAAgB,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAE1D,4EAA4E;AAC5E,SAAS,GAAG,CAAI,OAAU;IACtB,OAAO,KAAK,CAAC,MAAM,CAAmC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAyB,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;AACrF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,aAA6B,EAAE;IACtD,MAAM,GAAG,GAAQ;QACb,IAAI,EAAE,UAAU,CAAC,YAAY,IAAI,eAAe;QAChD,MAAM,EAAE,UAAU,CAAC,aAAa,IAAI,iBAAiB;QACrD,KAAK,EAAE,IAAI,OAAO,EAAE;KACvB,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,QAAwE,EAAE,KAAmB,EAAS,EAAE,CACjH,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,WAAW,CAAC;QAC1B,GAAG,EAAE,MAAM;QACX,KAAK,EAAE;YACH,IAAI,EAAE,KAAK,CAAC,MAAM,CAAqB,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACjE,QAAQ,EAAE,YAAY;YACtB,UAAU,EAAE,WAAW;YACvB,oGAAoG;YACpG,KAAK,EAAE,KAAK,CAAC,MAAM,CAAY,qBAAqB,CAAC,IAAI,CAAC;YAC1D,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,GAAG;YACf,wFAAwF;YACxF,aAAa,EAAE,GAAG;YAClB,eAAe,EAAE,KAAK;YACtB,+CAA+C;YAC/C,aAAa,EAAE,CAAC;YAChB,OAAO,EAAE,GAAG,CAAqB,IAAI,CAAC;YACtC,IAAI,EAAE,GAAG,CAAuB,IAAI,CAAC;YACrC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC;YACpB,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC;SAC3B;QACD,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QACzC,eAAe,EAAE,EAAE;QACnB,8FAA8F;QAC9F,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,QAAQ,EAAE;YACN,+CAA+C;YAC/C,MAAM,EAAE;gBACJ,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;gBACpB,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;oBACrB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACjC,OAAO,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjG,CAAC;aACJ;YACD,uCAAuC;YACvC,OAAO,EAAE;gBACL,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;gBACpB,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;oBACrB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACjC,OAAO,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjG,CAAC;aACJ;YACD,kFAAkF;YAClF,MAAM,EAAE;gBACJ,IAAI,EAAE;oBACF,QAAQ,EAAE,KAAK,CAAC,MAAM,CAA+B,SAAS,EAAE;wBAC5D,IAAI,EAAE,OAAO;wBACb,UAAU,EAAE;4BACR,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;4BACrD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;yBACvD;qBACJ,CAAC;oBACF,IAAI,EAAE,IAAI;iBACb;gBACD,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;oBACrB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,QAA4B,CAAC,CAAC;oBAChF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC3F,OAAO,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrE,CAAC;aACJ;YACD;;;eAGG;YACH,MAAM,EAAE;gBACJ,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;gBACxB,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAmB,CAAC,CAAC;aACrG;YACD,OAAO,EAAE;gBACL,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE;gBAC3C,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;oBACrB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACjC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAmB,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBACtG,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC9F,OAAO,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrE,CAAC;aACJ;YACD;;;eAGG;YACH,SAAS,EAAE;gBACP,IAAI,EAAE;oBACF,MAAM,EAAE,MAAM;oBACd,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;iBAChF;gBACD,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC/G;YACD,oEAAoE;YACpE,cAAc,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACnF;;;;eAIG;YACH,aAAa,EAAE;gBACX,IAAI,EAAE;oBACF,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;oBAClC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;iBAC7D;gBACD,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;oBACrB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBACjC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC;oBAC3J,OAAO,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACtE,CAAC;aACJ;YACD,8CAA8C;YAC9C,iBAAiB,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;SACjH;QACD,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC;QAClE,oFAAoF;QACpF,qFAAqF;QACrF,MAAM,EAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;KACjF,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;AAIjC,4FAA4F;AAC5F,MAAM,UAAU,SAAS,CAAC,IAAU;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,2HAA2H;AAC3H,MAAM,UAAU,aAAa,CAAC,MAAkB,EAAE,IAAY;IAC1D,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC;IACzB,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,IAAI,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM;QACtB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,WAAW,CAAC,MAAkB,EAAE,IAAY,EAAE,KAAa;IACvE,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,cAAc,CAAC,MAAkB,EAAE,IAAY;IAC3D,OAAO,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAgDD;;;GAGG;AACH,SAAS,KAAK,CAAC,CAAe,EAAE,GAAQ;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IACpB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpF,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC5I,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAC3F,CAAC;AAED,SAAS,MAAM,CAAC,IAAW;IACvB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpF,CAAC;AAED,yCAAyC;AACzC,SAAS,OAAO,CAAC,CAAe,EAAE,GAAQ;IACtC,OAAO,OAAO,CAAC,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,SAAS,OAAO,CAAC,CAAe,EAAE,MAAc,EAAE,GAAQ;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;IACzB,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC;IAChF,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAClD,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;QAAE,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACjI,OAAO,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,OAAO,CAAC,CAA2D;IACxE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;AACpG,CAAC;AAED,SAAS,SAAS,CAAC,CAAiB,EAAE,CAAiB;IACnD,OAAO,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,CAAC;AAC/F,CAAC;AAED,6EAA6E;AAC7E,SAAS,UAAU,CAAC,IAAgB;IAChC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAgB,EAAE,EAAc,EAAE,CAAS;IAC5D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACpC,0DAA0D;IAC1D,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoC,CAAC;AAC5D,0GAA0G;AAC1G,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,yFAAyF;AACzF,SAAS,OAAO,CAAC,MAAc,EAAE,KAAqB;IAClD,OAAO,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACjI,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,OAAO,EAAmD,CAAC;AAElF,6GAA6G;AAC7G,SAAS,UAAU,CAAC,MAAmB,EAAE,KAAqB;IAC1D,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE;QACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,MAAM,CAAC,IAAiB,EAAE,IAAY,EAAE,KAAqB,EAAE,GAAQ;IAC5E,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,SAAS,SAAS,CAAC,GAAQ,EAAE,IAAc,EAAE,IAAY,EAAE,KAAqB;IAC5E,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACnD,MAAM,UAAU,GAAyB;QACrC,IAAI,EAAE,YAAY;QAClB,IAAI;QACJ,EAAE,EAAE,IAAI,CAAC,KAAK;QACd,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,eAAe,EAAE,IAAI,CAAC,UAAU;QAChC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;QACpE,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;KACjB,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,KAAqB;IACnD,wHAAwH;IACxH,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,iBAAiB,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACxF,OAAO,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAkB,CAAC;AAC/C,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB,SAAS,QAAQ,CAAC,KAAqB;IACnC,IAAI,KAAa,CAAC;IAClB,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAAE,KAAK,GAAG,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;SAC9D,CAAC;QACF,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,EAAE,KAAK,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;QACpE,KAAK,GAAG,SAAS,EAAE,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;AACvE,CAAC;AAED,gHAAgH;AAChH,SAAS,MAAM,CAAI,KAAkC,EAAE,KAAa,EAAE,MAAc,EAAE,KAAa,EAAE,IAAa;IAC9G,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG;QAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrB,OAAO,GAAG,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC;IACpB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtB,IAAI,GAAG,CAAC,IAAI,GAAG,KAAK;QAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAe,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,sFAAsF;AACtF,SAAS,QAAQ,CAAC,IAAc,EAAE,EAAY;IAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;QAAE,OAAO;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACzB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACvB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;gBAAE,OAAO;IACjF,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9F,CAAC;AACL,CAAC;AAeD;;;;GAIG;AACH,SAAS,SAAS,CAAC,GAAQ,EAAE,IAAiB,EAAE,MAAc,EAAE,KAAqB;IACjF,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACxE,2GAA2G;IAC3G,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QACpE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;YAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,UAAU,CAAC,GAAQ,EAAE,KAAmB,EAAE,MAAiB;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,sJAAsJ;IACtJ,MAAM,WAAW,GAAG,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;IAC9D,MAAM,SAAS,GAAG,GAAG,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAChE,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QAC3B,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM;YAAE,GAAG,IAAI,CAAC,CAAC;aAC7B,IAAI,KAAK,GAAG,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;IACnC,CAAC;SAAM,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,cAAc,CAAC,GAAQ,EAAE,KAAmD,EAAE,MAA8B,EAAE,GAAW;IAC9H,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,GAAG,IAAI,GAAG,CAAC;IACzB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;IAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,CAAC,WAAW,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC9C,IAAI,MAAM,KAAK,IAAI;gBAAE,SAAS;YAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;IACL,CAAC;IACD,4HAA4H;IAC5H,MAAM,MAAM,GAAc,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/F,MAAM,IAAI,GAAc,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE;KACrG,CAAC,CAAC;AACP,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAQ,EAAE,KAAmD;IACtF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;IAC7B,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC;IAC7B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACtD,IAAI,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC3B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAc,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1E,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE;KACzG,CAAC,CAAC;AACP,CAAC;AAED,SAAS,SAAS,CAAC,IAAiB,EAAE,IAAe,EAAE,EAAa;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;YACvC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;gBACtC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE;KACvE,CAAC,CAAC;AACP,CAAC;AAED,SAAS,WAAW,CAAC,KAAe;IAChC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,8EAA8E;AAC9E,SAAS,QAAQ,CAAC,KAAe,EAAE,QAA0B;IACzD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC;IACnC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnD,OAAO,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,6EAA6E;AAC7E,SAAS,gBAAgB,CAAC,KAAe,EAAE,UAAuB;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;SAC3C,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAExC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,GAAG,CAAC;YACnB,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;YACtC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,IAAI,MAAM,GAAG,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvF,GAAG,GAAG,IAAI,CAAC;QACf,CAAC;QACD,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,sGAAsG;AACtG,SAAS,UAAU,CAAC,KAAe,EAAE,UAAuB,EAAE,KAAsB,EAAE,MAAc;IAChG,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACtH,IAAI,KAAK,GAAG,IAAI;YAAE,SAAS;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,SAAiC;IAC1D,MAAM,aAAa,GAAG,SAAyC,CAAC;IAChE,IAAI,OAAO,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,UAAU,EAAE,CAAC;QACvD,OAAO,CAAC,GAAI,SAAiC,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,MAAM,GAAI,SAAgC,CAAC,IAAI,CAAC;IACtD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,GAAI,MAAsB,CAAC,CAAC;IAC/D,OAAO,CAAC,SAAsB,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+B,CAAC;AAE9D,6EAA6E;AAC7E,6EAA6E;AAC7E,SAAS,aAAa,CAAC,QAAgB;IACnC,IAAI,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtD,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAsBD,iGAAiG;AACjG,MAAM,UAAU,GAAG,IAAI,OAAO,EAAoB,CAAC;AAEnD,SAAS,UAAU,CAAC,KAAa;IAC7B,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzI,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAAC,CAAc;IAC7B,OAAO;QACH,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,aAAa,EAAE,CAAC,CAAC,aAAa;KACjC,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,QAAkB,EAAE,IAAW,EAAE,CAAc;IAC9D,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IACxE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC7B,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;QACpG,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnE,QAAQ,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QACtD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC1B,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAC7E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG;QACT,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG;QACH,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;QACnE,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;KAClE,CAAC;IACF,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,QAAkB,EAAE,CAAc,EAAE,GAAQ;IAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,QAAQ,CAAC,KAAK,GAAG;YACb,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,CACnE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;SAC/E,CAAC;IACN,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7G,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC;IAC3G,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC;IAC3G,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;AACnH,CAAC;AAED,MAAM,QAAQ,GAAqB,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACpH,MAAM,OAAO,GAAG,GAAS,EAAE,GAAG,CAAC,CAAC;AAEhC,SAAS,WAAW,CAAC,GAAkB,EAAE,CAAY,EAAE,GAAQ;IAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7C,6EAA6E;IAC7E,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACzG,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK;QAAE,OAAO;IAC/B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE;QACjF,UAAU,EAAE,IAAI,CAAC,KAAK;QACtB,OAAO,EAAE,CAAC;QACV,YAAY,EAAE,QAAQ,CAAC,QAAQ;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;QAClB,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;QACjG,eAAe,EAAE,KAAK,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;QAC1D,QAAQ,EAAE,OAAO,CAAC,KAAK;QACvB,QAAQ,EAAE,OAAO,CAAC,IAAI;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;KACvB,CAAC,CAAC;AACP,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,IAAW,EAAE,OAAuB,EAAE,CAAc,EAAE,IAAY;IACjF,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACnE,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC;YAAE,SAAS;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,IAAI,KAAK,GAAG,IAAI,IAAI,GAAG,GAAG,MAAM;YAAE,SAAS;QAC3C,kGAAkG;QAClG,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC;YACT,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC;YACrB,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YACjC,KAAK,EAAE,KAAK,GAAG,IAAI;YACnB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM;SAC1C,CAAC,CAAC;QACH,KAAK,EAAE,CAAC;IACZ,CAAC;IACD,sHAAsH;IACtH,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAC5E,CAAC","sourcesContent":["import {\n Graphics2D,\n Paint,\n Types,\n component2d,\n lerpNumber,\n type InsetsResolved,\n type MeasureContext2D,\n type Measurer,\n type NodeOf,\n type NormalizedColor,\n type Piece,\n type RenderContext,\n type Size2D,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Color as _Color,\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\";\nimport {\n DefaultHighlightStyle,\n TokenAdvanceCache,\n canHighlight,\n charOffsetsToRange,\n defaultCodeDiff,\n defaultCodePhases,\n drawCode,\n ensureHighlighter,\n layoutCode,\n makeAnim,\n metricsSignature,\n moveProgress,\n normalizeSource,\n rangeToCharOffsets,\n resolveTokenStates,\n tokenizeCodeToIdLines,\n type AnimToken,\n type CodeDiffStrategy,\n type CodeLayout,\n type CodeMetrics,\n type CodePhaseStrategy,\n type CodeRange,\n type CodeTheme,\n type DimTransition,\n type IdLine,\n type RowBand,\n type RowsTransition,\n type StructuralTransition,\n} from \"./engine\";\n\n/** A row band's paint and corner radius when `highlightRows` is given neither. */\nconst ROW_BAND_COLOR = \"rgba(255, 255, 255, 0.12)\";\nconst ROW_BAND_RADIUS = 6;\n\n/**\n * Which token became which across an edit, and when each part of it happens.\n * Arguments of {@link defineCode}: a strategy is a function, which a prop would\n * take for a binding, so it is part of the component's definition instead.\n */\nexport interface CodeStrategies {\n /** Decides which token became which across an edit. Defaults to `defaultCodeDiff`. */\n diffStrategy?: CodeDiffStrategy;\n /** Decides when (in normalized transition time) each part of an edit happens. Defaults to `defaultCodePhases`. */\n phaseStrategy?: CodePhaseStrategy;\n}\n\n/** `code` part-way through a `to({ code })`: the source it leaves, the one it lands on, and how far along it is, eased. */\nexport interface CodeBlend {\n readonly from: string;\n readonly to: string;\n readonly t: number;\n}\n\n/** What `code` holds: a source, or a {@link CodeBlend} while a `to({ code })` runs. */\nexport type CodeSource = string | CodeBlend;\n\n/** A range argument: one range, several, or a chain that went through JSON as `{ list }`. */\nexport type CodeTarget = CodeRange | Iterable<CodeRange> | { readonly list: CodeRange[] };\n\n/** What a structure was tokenized with: the grammar, the theme and whether the grammar had landed. */\nexport interface CodeTokenBasis {\n readonly language: string;\n readonly theme: CodeTheme;\n readonly highlighted: boolean;\n}\n\n/** A listing a command left behind: its source, its tokens, and the basis they were made on. */\nexport interface CodeListing {\n readonly source: string;\n readonly lines: IdLine[];\n readonly basis: CodeTokenBasis;\n}\n\nexport interface CodeEditFrame {\n readonly transition: StructuralTransition;\n readonly progress: number;\n}\n\n/** The dim `highlight` leaves: what stays bright, what the rest dims to, and the cross-fade in flight. */\nexport interface CodeFocus {\n readonly dim: number | null;\n readonly ids: Set<number>;\n readonly fade: DimTransition | null;\n}\n\nexport interface CodeBanding {\n readonly bands: RowBand[];\n readonly fade: RowsTransition | null;\n}\n\n/** Each `Code` component's strategies and edit cache, by the node class it generated. */\nconst kits = new WeakMap<object, Kit>();\n\nconst NO_FOCUS: CodeFocus = { dim: null, ids: new Set(), fade: null };\nconst NO_BANDING: CodeBanding = { bands: [], fade: null };\n\n/** A private entry: commands write it, documents and calls never see it. */\nfunction own<T>(initial: T) {\n return Types.custom<T, T, { readonly private: true }>(initial, { private: true });\n}\n\nconst TARGET = Types.custom<CodeTarget | undefined>(undefined, { kind: \"selector\" });\nconst TEXT = Types.text(\"\", { multiline: true });\n\n/**\n * A `Code` whose edits are paired and timed by `strategies`. {@link Code} is\n * the one with the defaults; a project wanting another hands its own to the\n * engine in its place (the key is the same).\n *\n * A listing and nothing else: no paint slots, and no box behind the tokens. A\n * listing set on a card is a `Code` inside a hugging `Rect`.\n */\nexport function defineCode(strategies: CodeStrategies = {}) {\n const kit: Kit = {\n diff: strategies.diffStrategy ?? defaultCodeDiff,\n phases: strategies.phaseStrategy ?? defaultCodePhases,\n edits: new WeakMap(),\n };\n const act = (timeline: { animate(frame: Frame): Piece; wait(seconds: number): Piece }, frame: Frame | null): Piece =>\n (frame ? timeline.animate(frame) : timeline.wait(0));\n\n const component = component2d({\n key: \"code\",\n state: {\n code: Types.custom<string, CodeSource>(\"\", { lerp: blendSource }),\n language: \"typescript\",\n fontFamily: \"Fira Mono\",\n /** A built-in or registered theme name (e.g. `'github-dark'`), or a `CodeHighlightStyle` object. */\n theme: Types.custom<CodeTheme>(DefaultHighlightStyle.name),\n fontSize: 16,\n lineHeight: 1.6,\n // Extra space after every glyph, in px: folded into the advance a token is measured at.\n letterSpacing: 1.1,\n showLineNumbers: false,\n // In space-widths, so it scales with fontSize.\n lineNumberGap: 2,\n listing: own<CodeListing | null>(null),\n edit: own<CodeEditFrame | null>(null),\n focus: own(NO_FOCUS),\n banding: own(NO_BANDING),\n },\n defaults: { width: \"hug\", height: \"hug\" },\n allowedChildren: [],\n // The grammar gates layout: how many tokens there are, and so where each sits, depends on it.\n load: (loader, state) => {\n loader.font(state.fontFamily);\n loader.task(`shiki:lang:${state.language}`, grammarLoader(state.language), { before: \"layout\" });\n },\n commands: {\n /** Append `code` to the end of the listing. */\n append: {\n args: { code: TEXT },\n run: (timeline, state) => {\n const seen = current(state, kit);\n return act(timeline, editFrame(kit, seen, seen.source + timeline.args.code, basisOf(state)));\n },\n },\n /** Insert `code` above the listing. */\n prepend: {\n args: { code: TEXT },\n run: (timeline, state) => {\n const seen = current(state, kit);\n return act(timeline, editFrame(kit, seen, timeline.args.code + seen.source, basisOf(state)));\n },\n },\n /** Insert `code` before the 1-indexed `[line, col]`, clamped into the listing. */\n insert: {\n args: {\n position: Types.custom<[number, number] | undefined>(undefined, {\n kind: \"point\",\n properties: {\n line: { kind: \"number\", default: 1, min: 1, step: 1 },\n col: { kind: \"number\", default: 1, min: 1, step: 1 },\n },\n }),\n code: TEXT,\n },\n run: (timeline, state) => {\n const seen = current(state, kit);\n const offset = offsetAt(seen.lines, timeline.args.position as [number, number]);\n const next = seen.source.slice(0, offset) + timeline.args.code + seen.source.slice(offset);\n return act(timeline, editFrame(kit, seen, next, basisOf(state)));\n },\n },\n /**\n * Erase the code in `target`. A range of whole lines takes their line\n * breaks with it, so the rows below close up.\n */\n remove: {\n args: { target: TARGET },\n run: (timeline, state) => act(timeline, eraseFrame(kit, state, timeline.args.target as CodeRange)),\n },\n replace: {\n args: { target: TARGET, replacement: TEXT },\n run: (timeline, state) => {\n const seen = current(state, kit);\n const { start, end } = rangeToCharOffsets(timeline.args.target as CodeRange, lineLengths(seen.lines));\n const next = seen.source.slice(0, start) + timeline.args.replacement + seen.source.slice(end);\n return act(timeline, editFrame(kit, seen, next, basisOf(state)));\n },\n },\n /**\n * Dim everything outside `target` (one range or several) to `dim`.\n * Persistent: a second highlight cross-fades from this one.\n */\n highlight: {\n args: {\n target: TARGET,\n dim: Types.number(0.4, { min: 0, max: 1, step: 0.01, scale: 100, unit: \"%\" }),\n },\n run: (timeline, state) => act(timeline, highlightFrame(kit, state, timeline.args.target, timeline.args.dim)),\n },\n /** Fade every dimmed token back to full and clear the highlight. */\n resetHighlight: (timeline, state) => act(timeline, resetHighlightFrame(kit, state)),\n /**\n * Lay a band of `color` behind every line a range touches. A second\n * call slides the bands onto their new rows, paired in order; a band\n * keeps to its lines through an edit.\n */\n highlightRows: {\n args: {\n target: TARGET,\n color: Types.color(ROW_BAND_COLOR),\n radius: Types.number(ROW_BAND_RADIUS, { min: 0, step: 1 }),\n },\n run: (timeline, state) => {\n const seen = current(state, kit);\n const bands = rowBandsIn(seen.lines, normalizeCodeRanges(timeline.args.target), timeline.args.color, Math.max(0, timeline.args.radius ?? ROW_BAND_RADIUS));\n return act(timeline, rowsFrame(seen, state.banding.bands, bands));\n },\n },\n /** Fade every row band out and clear them. */\n resetRowHighlight: (timeline, state) => act(timeline, rowsFrame(current(state, kit), state.banding.bands, [])),\n },\n measure: (measurer, state) => measureListing(measurer, state, kit),\n // Refuses the ambient text style: every column is measured against this face, so an\n // inherited family or weight would shape glyphs the geometry was never measured for.\n render:(ctx, state) => ctx.textStyle(null, () => drawListing(ctx, state, kit)),\n });\n kits.set(component.node, kit);\n return component;\n}\n\n/**\n * A syntax-highlighted listing whose edits animate token by token: each edit\n * is diffed against what is on screen, so a token that survives travels to\n * its new column and only what changed fades.\n */\nexport const Code = defineCode();\nexport type Code = NodeOf<typeof Code>;\nexport type CodeProps = NonNullable<Parameters<typeof Code>[0]>;\n\n/** What a listing shows now: its source, its token rows, and the edit in flight, if any. */\nexport function listingOf(code: Code): { readonly source: string; readonly lines: readonly IdLine[]; readonly edit: StructuralTransition | null } {\n const kit = kits.get(code.constructor);\n if (!kit) throw new TypeError(\"listingOf takes a node a `Code` component built.\");\n const view = shown(code, kit);\n return { source: view.source, lines: view.lines, edit: editOf(view) };\n}\n\n/** Every range matching the literal `text` in `source`, in order and not overlapping. Multi-line matches are found too. */\nexport function findAllRanges(source: CodeSource, text: string): CodeRange[] {\n const ranges: CodeRange[] = [];\n if (!text) return ranges;\n const joined = normalizeSource(sourceText(source));\n const lineLens = joined.split(\"\\n\").map((line) => line.length);\n let from = 0;\n while (true) {\n const idx = joined.indexOf(text, from);\n if (idx === -1) break;\n ranges.push(charOffsetsToRange(idx, idx + text.length, lineLens));\n from = idx + Math.max(1, text.length);\n }\n return ranges;\n}\n\n/** The `index`th range matching `text`, or `null`. */\nexport function findRangeAt(source: CodeSource, text: string, index: number): CodeRange | null {\n return findAllRanges(source, text)[index] ?? null;\n}\n\n/** The first range matching `text`, or `null`. */\nexport function findFirstRange(source: CodeSource, text: string): CodeRange | null {\n return findRangeAt(source, text, 0);\n}\n\n// ── What a listing shows ────────────────────────────────────────────────────\n\ninterface Kit {\n readonly diff: CodeDiffStrategy;\n readonly phases: CodePhaseStrategy;\n /** The edit from a listing to a source and basis, built once: a `to({ code })` asks for it every frame. */\n readonly edits: WeakMap<IdLine[], Map<string, Map<string, Edited>>>;\n}\n\ninterface Edited {\n readonly transition: StructuralTransition;\n readonly listing: CodeListing;\n}\n\n/** What the structure resolves from. A command's snapshot and a node's own state view both are one. */\ninterface ListingState {\n readonly code: CodeSource;\n readonly language: string;\n readonly theme: CodeTheme;\n readonly listing: CodeListing | null;\n readonly edit: CodeEditFrame | null;\n}\n\ninterface LayoutState extends ListingState {\n readonly fontSize: number;\n readonly fontFamily: string;\n readonly lineHeight: number;\n readonly letterSpacing: number;\n readonly padding: InsetsResolved;\n readonly showLineNumbers: boolean;\n readonly lineNumberGap: number;\n}\n\ninterface DrawState extends LayoutState {\n readonly focus: CodeFocus;\n readonly banding: CodeBanding;\n}\n\n/** The structure a frame draws, and the edit it is part-way through. */\ninterface Shown {\n readonly source: string;\n readonly lines: IdLine[];\n readonly transition: StructuralTransition | null;\n readonly progress: number;\n}\n\n/**\n * A `to({ code })` mid-flight comes first: it wrote `code` after any edit\n * command did. Then an edit command in flight, then the settled listing.\n */\nfunction shown(s: ListingState, kit: Kit): Shown {\n const code = s.code;\n if (typeof code !== \"string\") {\n const { transition } = edited(settled(s, code.from, kit), code.to, basisOf(s), kit);\n return { source: code.to, lines: transition.to, transition, progress: code.t };\n }\n if (s.edit) return { source: normalizeSource(code), lines: s.edit.transition.to, transition: s.edit.transition, progress: s.edit.progress };\n const listing = settled(s, normalizeSource(code), kit);\n return { source: listing.source, lines: listing.lines, transition: null, progress: 1 };\n}\n\nfunction editOf(view: Shown): StructuralTransition | null {\n return view.transition ? { ...view.transition, progress: view.progress } : null;\n}\n\n/** The listing a command starts from. */\nfunction current(s: ListingState, kit: Kit): CodeListing {\n return settled(s, normalizeSource(sourceText(s.code)), kit);\n}\n\n/**\n * The structure `source` settles on. Until a listing command has acted, the\n * props are all there is; after one, it is the listing that command left,\n * recoloured keeping its ids when only the theme moved, and diffed onward\n * when the source has (a `to({ code })` that landed, a binding).\n */\nfunction settled(s: ListingState, source: string, kit: Kit): CodeListing {\n const basis = basisOf(s);\n const pinned = s.listing;\n if (!pinned) return derived(source, basis);\n if (pinned.source !== source) return edited(pinned, source, basis, kit).listing;\n if (sameBasis(pinned.basis, basis)) return pinned;\n if (pinned.basis.language === basis.language && pinned.basis.highlighted === basis.highlighted) return recoloured(pinned, basis);\n return derived(source, basis);\n}\n\nfunction basisOf(s: { readonly language: string; readonly theme: CodeTheme }): CodeTokenBasis {\n return { language: s.language, theme: s.theme, highlighted: canHighlight(s.language, s.theme) };\n}\n\nfunction sameBasis(a: CodeTokenBasis, b: CodeTokenBasis): boolean {\n return a.language === b.language && a.theme === b.theme && a.highlighted === b.highlighted;\n}\n\n/** The source `code` names: where a `to({ code })` is heading, mid-tween. */\nfunction sourceText(code: CodeSource): string {\n return typeof code === \"string\" ? code : code.to;\n}\n\n/**\n * Mid-tween `code` holds both sources, so the frame can draw the edit between\n * them; at either end it is a source again.\n */\nfunction blendSource(from: CodeSource, to: CodeSource, t: number): CodeSource {\n const leaving = sourceText(from);\n const arriving = sourceText(to);\n const a = normalizeSource(leaving);\n const b = normalizeSource(arriving);\n // Nothing to edit: it snaps at the end, as any text does.\n if (a === b) return t >= 1 ? arriving : leaving;\n if (t <= 0) return a;\n if (t >= 1) return b;\n return { from: a, to: b, t };\n}\n\nconst DERIVED = new Map<string, Map<string, CodeListing>>();\n/** Sources kept tokenized per basis, oldest dropped first; a bound `code` can name any number of them. */\nconst DERIVED_LISTINGS = 256;\n\n/** The props' own listing, the same object (and ids) each time it is asked for again. */\nfunction derived(source: string, basis: CodeTokenBasis): CodeListing {\n return recall(DERIVED, basisKey(basis), source, DERIVED_LISTINGS, () => ({ source, lines: tokenize(source, basis), basis }));\n}\n\nconst RECOLOURED = new WeakMap<IdLine[], Map<string, Map<string, CodeListing>>>();\n\n/** `pinned` in another theme: the same text split the same way keeps the ids a highlight or a band names. */\nfunction recoloured(pinned: CodeListing, basis: CodeTokenBasis): CodeListing {\n let shelf = RECOLOURED.get(pinned.lines);\n if (!shelf) RECOLOURED.set(pinned.lines, shelf = new Map());\n return recall(shelf, basisKey(basis), pinned.source, 4, () => {\n const lines = tokenize(pinned.source, basis);\n adoptIds(pinned.lines, lines);\n return { source: pinned.source, lines, basis };\n });\n}\n\nfunction edited(from: CodeListing, next: string, basis: CodeTokenBasis, kit: Kit): Edited {\n let shelf = kit.edits.get(from.lines);\n if (!shelf) kit.edits.set(from.lines, shelf = new Map());\n return recall(shelf, basisKey(basis), next, 16, () => buildEdit(kit, from.lines, next, basis));\n}\n\nfunction buildEdit(kit: Kit, from: IdLine[], next: string, basis: CodeTokenBasis): Edited {\n const edit = kit.diff(from, tokenize(next, basis));\n const transition: StructuralTransition = {\n kind: \"structural\",\n from,\n to: edit.lines,\n removedIds: edit.removedIds,\n addedIds: edit.addedIds,\n enteringLineIds: edit.newLineIds,\n fromColorById: edit.fromColorById,\n phases: kit.phases(edit.removedIds.size > 0, edit.addedIds.size > 0),\n progress: 0,\n layoutKey: null,\n fromLayout: null,\n toLayout: null,\n };\n return { transition, listing: { source: next, lines: edit.lines, basis } };\n}\n\nfunction tokenize(source: string, basis: CodeTokenBasis): IdLine[] {\n // Best effort outside the asset pipeline (a test, a headless measure): on the timeline `load` has the grammar in first.\n if (!basis.highlighted) ensureHighlighter(undefined, [basis.language]).catch(() => { });\n return tokenizeCodeToIdLines(source, basis.language, basis.theme);\n}\n\nconst styleIds = new WeakMap<object, number>();\nlet nextStyleId = 1;\n\nfunction basisKey(basis: CodeTokenBasis): string {\n let theme: string;\n if (typeof basis.theme === \"string\") theme = `name:${basis.theme}`;\n else {\n let id = styleIds.get(basis.theme);\n if (id === undefined) styleIds.set(basis.theme, id = nextStyleId++);\n theme = `style:${id}`;\n }\n return `${basis.language}\\n${basis.highlighted ? 1 : 0}\\n${theme}`;\n}\n\n/** Memoized by basis, then by source; a basis keeps `limit` sources, least recently asked for dropped first. */\nfunction recall<T>(shelf: Map<string, Map<string, T>>, basis: string, source: string, limit: number, make: () => T): T {\n let row = shelf.get(basis);\n if (!row) shelf.set(basis, row = new Map());\n const hit = row.get(source);\n if (hit !== undefined) {\n row.delete(source);\n row.set(source, hit);\n return hit;\n }\n const made = make();\n row.set(source, made);\n if (row.size > limit) row.delete(row.keys().next().value as string);\n return made;\n}\n\n/** Carry `from`'s line and token ids onto `to` when the two spell the same tokens. */\nfunction adoptIds(from: IdLine[], to: IdLine[]): void {\n if (from.length !== to.length) return;\n for (let i = 0; i < from.length; i++) {\n const a = from[i].tokens;\n const b = to[i].tokens;\n if (a.length !== b.length) return;\n for (let j = 0; j < a.length; j++) if (a[j].content !== b[j].content) return;\n }\n for (let i = 0; i < from.length; i++) {\n to[i].id = from[i].id;\n for (let j = 0; j < from[i].tokens.length; j++) to[i].tokens[j].id = from[i].tokens[j].id;\n }\n}\n\n// ── Commands ────────────────────────────────────────────────────────────────\n\n/** What a listing command writes at a point of its own eased time. */\ninterface ListingWrites {\n readonly code?: string;\n readonly listing?: CodeListing | null;\n readonly edit?: CodeEditFrame | null;\n readonly focus?: CodeFocus;\n readonly banding?: CodeBanding;\n}\n\ntype Frame = (t: number) => ListingWrites;\n\n/**\n * Each command writes the listing it acted on, at every time it is asked for,\n * so the ids it captured are the ones drawn; before it starts the timeline has\n * put back the props, and the listing is derived from them again.\n */\nfunction editFrame(kit: Kit, seen: CodeListing, source: string, basis: CodeTokenBasis): Frame | null {\n const next = normalizeSource(source);\n if (next === seen.source) return null;\n const { transition, listing } = buildEdit(kit, seen.lines, next, basis);\n // Three phases (see `phaseStrategy`): what leaves fades out, what stays reflows, then what is new arrives.\n return (t) => (t <= 0 ? { code: seen.source, listing: seen, edit: null }\n : t >= 1 ? { code: next, listing, edit: null }\n : { code: next, listing, edit: { transition, progress: t } });\n}\n\nfunction eraseFrame(kit: Kit, state: ListingState, target: CodeRange): Frame | null {\n const seen = current(state, kit);\n const source = seen.source;\n let { start, end } = rangeToCharOffsets(target, lineLengths(seen.lines));\n // `lines(2)` resolves to the characters of line 2: the row goes too, as an editor would close the gap. That is also what makes a blank row removable.\n const atLineStart = start === 0 || source[start - 1] === \"\\n\";\n const atLineEnd = end === source.length || source[end] === \"\\n\";\n if (atLineStart && atLineEnd) {\n if (end < source.length) end += 1;\n else if (start > 0) start -= 1;\n } else if (end <= start) {\n return null;\n }\n if (end <= start) return null;\n return editFrame(kit, seen, source.slice(0, start) + source.slice(end), basisOf(state));\n}\n\nfunction highlightFrame(kit: Kit, state: ListingState & { readonly focus: CodeFocus }, target: CodeTarget | undefined, dim: number): Frame | null {\n const seen = current(state, kit);\n const toDim = dim ?? 0.4;\n const matchIds = tokenIdsInRanges(seen.lines, normalizeCodeRanges(target));\n if (matchIds.size === 0) return null;\n\n const previous = state.focus;\n const fromDim = previous.dim ?? 1;\n const hadPrevious = previous.ids.size > 0;\n const tokens: AnimToken[] = [];\n for (const line of seen.lines) {\n for (const tok of line.tokens) {\n const fromOp = !hadPrevious || previous.ids.has(tok.id) ? 1 : fromDim;\n const toOp = matchIds.has(tok.id) ? 1 : toDim;\n if (fromOp === toOp) continue;\n tokens.push(makeAnim(tok.id, { keys: [0, 1], values: [fromOp, toOp] }));\n }\n }\n // Which tokens are dimmed is what the next highlight cross-fades from, so it is committed at the end and put back below it.\n const before: CodeFocus = { dim: hadPrevious ? fromDim : null, ids: previous.ids, fade: null };\n const done: CodeFocus = { dim: toDim, ids: matchIds, fade: null };\n return (t) => ({\n listing: seen,\n focus: t <= 0 ? before : t >= 1 ? done : { ...before, fade: { kind: \"dim\", tokens, progress: t } },\n });\n}\n\nfunction resetHighlightFrame(kit: Kit, state: ListingState & { readonly focus: CodeFocus }): Frame | null {\n const previous = state.focus;\n if (previous.dim === null) return null;\n const seen = current(state, kit);\n const fromDim = previous.dim;\n const tokens: AnimToken[] = [];\n for (const line of seen.lines) {\n for (const tok of line.tokens) {\n const fromOp = previous.ids.has(tok.id) ? 1 : fromDim;\n if (fromOp === 1) continue;\n tokens.push(makeAnim(tok.id, { keys: [0, 1], values: [fromOp, 1] }));\n }\n }\n const before: CodeFocus = { dim: fromDim, ids: previous.ids, fade: null };\n return (t) => ({\n listing: seen,\n focus: t >= 1 ? NO_FOCUS : t <= 0 ? before : { ...before, fade: { kind: \"dim\", tokens, progress: t } },\n });\n}\n\nfunction rowsFrame(seen: CodeListing, from: RowBand[], to: RowBand[]): Frame | null {\n if (from.length === 0 && to.length === 0) return null;\n return (t) => ({\n listing: seen,\n banding: t >= 1 ? { bands: to, fade: null }\n : t <= 0 ? { bands: from, fade: null }\n : { bands: from, fade: { kind: \"rows\", from, to, progress: t } },\n });\n}\n\nfunction lineLengths(lines: IdLine[]): number[] {\n return lines.map((line) => line.tokens.reduce((acc, t) => acc + t.content.length, 0));\n}\n\n/** Character offset of a 1-indexed (line, col), clamped into the document. */\nfunction offsetAt(lines: IdLine[], position: [number, number]): number {\n const lens = lineLengths(lines);\n if (lens.length === 0) return 0;\n const [rawLine, rawCol] = position;\n const li = Math.max(0, Math.min(lens.length - 1, rawLine - 1));\n let offset = 0;\n for (let k = 0; k < li; k++) offset += lens[k] + 1;\n return offset + Math.max(0, Math.min(lens[li], rawCol - 1));\n}\n\n/** The ids of every token any of `codeRanges` overlaps, partly or wholly. */\nfunction tokenIdsInRanges(lines: IdLine[], codeRanges: CodeRange[]): Set<number> {\n const result = new Set<number>();\n const lineLens = lineLengths(lines);\n if (lineLens.length === 0) return result;\n const offsets = codeRanges\n .map((r) => rangeToCharOffsets(r, lineLens))\n .filter(({ start, end }) => end > start);\n if (offsets.length === 0) return result;\n\n let off = 0;\n for (let li = 0; li < lines.length; li++) {\n for (const tok of lines[li].tokens) {\n const tStart = off;\n const tEnd = off + tok.content.length;\n if (offsets.some(({ start, end }) => tEnd > start && tStart < end)) result.add(tok.id);\n off = tEnd;\n }\n if (li < lines.length - 1) off += 1;\n }\n return result;\n}\n\n/** One band per range, over every line it touches; a range past the end of the listing gives none. */\nfunction rowBandsIn(lines: IdLine[], codeRanges: CodeRange[], color: NormalizedColor, radius: number): RowBand[] {\n const count = lines.length;\n const bands: RowBand[] = [];\n for (const range of codeRanges) {\n const first = Math.max(1, Math.round(range.startLine ?? 1));\n const last = Math.min(count, range.endLine == null || range.endLine === Infinity ? count : Math.round(range.endLine));\n if (first > last) continue;\n bands.push({ startId: lines[first - 1].id, endId: lines[last - 1].id, color, radius });\n }\n return bands;\n}\n\n/**\n * A single range (a plain object) as a one-element array; a chain or an array\n * of ranges as itself; the `{ list }` a chain serialises as, as that chain.\n */\nfunction normalizeCodeRanges(codeRange: CodeTarget | undefined): CodeRange[] {\n const maybeIterable = codeRange as Partial<Iterable<CodeRange>>;\n if (typeof maybeIterable[Symbol.iterator] === \"function\") {\n return [...(codeRange as Iterable<CodeRange>)];\n }\n const stored = (codeRange as { list?: unknown }).list;\n if (Array.isArray(stored)) return [...(stored as CodeRange[])];\n return [codeRange as CodeRange];\n}\n\nconst grammarLoaders = new Map<string, () => Promise<void>>();\n\n// One function per language: blocks sharing a grammar declare one key, and a\n// second load function for a key already declared is ignored with a warning.\nfunction grammarLoader(language: string): () => Promise<void> {\n let load = grammarLoaders.get(language);\n if (load === undefined) {\n load = () => ensureHighlighter(undefined, [language]);\n grammarLoaders.set(language, load);\n }\n return load;\n}\n\n// ── Geometry and drawing ────────────────────────────────────────────────────\n\ninterface Layouts {\n readonly from: CodeLayout;\n readonly to: CodeLayout;\n}\n\n/**\n * A node's measurements, kept between frames: the advance of each token, and\n * the layouts last built, reused while what they were built from is unchanged.\n */\ninterface Measured {\n readonly advances: TokenAdvanceCache;\n measurer: Measurer | null;\n /** The measurer of the node's last measure, as the engine's helpers take one. */\n scope: MeasureContext2D | null;\n settled: { readonly lines: IdLine[]; readonly key: string; readonly layout: CodeLayout } | null;\n edit: { readonly transition: StructuralTransition; readonly key: string; readonly from: CodeLayout; readonly to: CodeLayout } | null;\n}\n\n/** By the node's state view, one object per node that `measure` and `render` are both handed. */\nconst measuredBy = new WeakMap<object, Measured>();\n\nfunction measuredOf(state: object): Measured {\n let found = measuredBy.get(state);\n if (!found) measuredBy.set(state, found = { advances: new TokenAdvanceCache(), measurer: null, scope: null, settled: null, edit: null });\n return found;\n}\n\nfunction metricsOf(s: LayoutState): CodeMetrics {\n return {\n fontSize: s.fontSize,\n fontFamily: s.fontFamily,\n lineHeight: s.lineHeight,\n letterSpacing: s.letterSpacing,\n padding: s.padding,\n showLineNumbers: s.showLineNumbers,\n lineNumberGap: s.lineNumberGap,\n };\n}\n\n/**\n * The one or two layouts a frame is drawn from: a settled frame has one, a\n * frame inside an edit two (where every token was, and where it is going).\n * `null` for a node never measured, which has nothing to measure them with.\n */\nfunction layoutsOf(measured: Measured, view: Shown, m: CodeMetrics): Layouts | null {\n const signature = measured.advances.signature(m.fontSize, m.fontFamily);\n measured.advances.sync(signature);\n const key = `${metricsSignature(m)}|${signature}`;\n const scope = measured.scope;\n if (!view.transition) {\n const hit = measured.settled;\n if (hit && hit.lines === view.lines && hit.key === key) return { from: hit.layout, to: hit.layout };\n if (!scope) return null;\n const layout = layoutCode(view.lines, m, measured.advances, scope);\n measured.settled = { lines: view.lines, key, layout };\n return { from: layout, to: layout };\n }\n const hit = measured.edit;\n if (hit && hit.transition === view.transition && hit.key === key) return hit;\n if (!scope) return null;\n const both = {\n transition: view.transition,\n key,\n from: layoutCode(view.transition.from, m, measured.advances, scope),\n to: layoutCode(view.transition.to, m, measured.advances, scope),\n };\n measured.edit = both;\n return both;\n}\n\nfunction measureListing(measurer: Measurer, s: LayoutState, kit: Kit): Size2D {\n const measured = measuredOf(s);\n if (measured.measurer !== measurer) {\n measured.measurer = measurer;\n measured.scope = {\n measureText: (text, fontSize, fontFamily, fontWeight, letterSpacing) =>\n measurer.text(text, { fontFamily, fontSize, fontWeight, letterSpacing }),\n };\n }\n const view = shown(s, kit);\n const m = metricsOf(s);\n const layouts = layoutsOf(measured, view, m);\n if (!layouts) return { width: 0, height: 0 };\n const t = moveProgress(view.transition ? { phases: view.transition.phases, progress: view.progress } : null);\n const innerW = view.transition ? lerpNumber(layouts.from.innerW, layouts.to.innerW, t) : layouts.to.innerW;\n const innerH = view.transition ? lerpNumber(layouts.from.innerH, layouts.to.innerH, t) : layouts.to.innerH;\n return { width: innerW + m.padding.left + m.padding.right, height: innerH + m.padding.top + m.padding.bottom };\n}\n\nconst NO_PAINT: Paint.PaintState = { fill: [], stroke: [], shadow: [], overlay: [], start: 0, end: 1, clip: false };\nconst NOTHING = (): void => { };\n\nfunction drawListing(ctx: RenderContext, s: DrawState, kit: Kit): void {\n const measured = measuredOf(s);\n const view = shown(s, kit);\n const m = metricsOf(s);\n const layouts = layoutsOf(measured, view, m);\n // Paints nothing: it declares the outline picking and backdrop effects read.\n Paint.draw(ctx, NO_PAINT, null, { clipShape: outlineOf(view, layouts, m, ctx.size), children: NOTHING });\n const scope = measured.scope;\n if (!layouts || !scope) return;\n const { focus, banding } = s;\n drawCode({ draw: (graphics) => ctx.draw(graphics), measureText: scope.measureText }, {\n tokenLines: view.lines,\n metrics: m,\n advanceCache: measured.advances,\n from: layouts.from,\n to: layouts.to,\n edit: editOf(view),\n tokenStates: resolveTokenStates(view.lines, focus.fade ? [focus.fade] : [], focus.dim, focus.ids),\n highlightActive: focus.dim !== null || focus.fade !== null,\n rowBands: banding.bands,\n rowsEdit: banding.fade,\n boxW: ctx.size.width,\n });\n}\n\n/**\n * A listing is grabbed by its text, line by ragged line: each line a slot as\n * wide as its ink, plus the gutter where numbers show, inside the box. Code is\n * mostly whitespace, and its empty corners would swallow clicks meant for what\n * is behind it. Mid-edit, or before it is laid out, the box.\n */\nfunction outlineOf(view: Shown, layouts: Layouts | null, m: CodeMetrics, size: Size2D): Graphics2D {\n const box = { x: 0, y: 0, width: size.width, height: size.height };\n if (view.transition || !layouts) return new Graphics2D().rect(box);\n const layout = layouts.to;\n const half = (m.fontSize * m.lineHeight) / 2;\n const gutter = m.showLineNumbers ? layout.gutter : 0;\n const left = Math.max(layout.startX - gutter, -size.width / 2);\n const outline = new Graphics2D();\n let lines = 0;\n for (let i = 0; i < layout.lineY.length; i++) {\n const ink = layout.lineW[i] ?? 0;\n if (ink + gutter <= 0) continue;\n const right = Math.min(layout.startX + ink, size.width / 2);\n const y = layout.lineY[i];\n const top = Math.min(y + half, size.height / 2);\n const bottom = Math.max(y - half, -size.height / 2);\n if (right < left || top < bottom) continue;\n // The row's own centre where the box leaves it whole, so a whole row is tested at its own centre.\n const whole = top === y + half && bottom === y - half;\n outline.rect({\n x: (left + right) / 2,\n y: whole ? y : (top + bottom) / 2,\n width: right - left,\n height: whole ? 2 * half : top - bottom,\n });\n lines++;\n }\n // No line has ink: the box with itself cut away, so nothing is grabbed (an empty outline would fall back to the box).\n return lines > 0 ? outline : new Graphics2D().rect(box).rect(box).cut();\n}\n"]}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Graphics2D,\n Paint,\n Types,\n component2d,\n lerpNumber,\n type InsetsResolved,\n type MeasureContext2D,\n type Measurer,\n type NodeOf,\n type NormalizedColor,\n type Piece,\n type RenderContext,\n type Size2D,\n // Named so the emitted declaration reaches these through the sdk, not core.\n type Color as _Color,\n type Node2D as _Node2D,\n type Node2DProps as _Node2DProps,\n} from \"@motionscript/sdk\";\nimport {\n DefaultHighlightStyle,\n TokenAdvanceCache,\n canHighlight,\n charOffsetsToRange,\n defaultCodeDiff,\n defaultCodePhases,\n drawCode,\n ensureHighlighter,\n layoutCode,\n makeAnim,\n metricsSignature,\n moveProgress,\n normalizeSource,\n rangeToCharOffsets,\n resolveTokenStates,\n tokenizeCodeToIdLines,\n type AnimToken,\n type CodeDiffStrategy,\n type CodeLayout,\n type CodeMetrics,\n type CodePhaseStrategy,\n type CodeRange,\n type CodeTheme,\n type DimTransition,\n type IdLine,\n type RowBand,\n type RowsTransition,\n type StructuralTransition,\n} from \"./engine\";\n\n/** A row band's paint and corner radius when `highlightRows` is given neither. */\nconst ROW_BAND_COLOR = \"rgba(255, 255, 255, 0.12)\";\nconst ROW_BAND_RADIUS = 6;\n\n/** Arguments of {@link defineCode}: a strategy is a function, which a prop would take for a binding, so it belongs to the definition. */\nexport interface CodeStrategies {\n /** Decides which token became which across an edit. Defaults to `defaultCodeDiff`. */\n diffStrategy?: CodeDiffStrategy;\n /** Decides when (in normalized transition time) each part of an edit happens. Defaults to `defaultCodePhases`. */\n phaseStrategy?: CodePhaseStrategy;\n}\n\n/** `code` part-way through a `to({ code })`: the source it leaves, the one it lands on, and how far along it is, eased. */\nexport interface CodeBlend {\n readonly from: string;\n readonly to: string;\n readonly t: number;\n}\n\n/** What `code` holds: a source, or a {@link CodeBlend} while a `to({ code })` runs. */\nexport type CodeSource = string | CodeBlend;\n\n/** A range argument: one range, several, or a chain that went through JSON as `{ list }`. */\nexport type CodeTarget = CodeRange | Iterable<CodeRange> | { readonly list: CodeRange[] };\n\n/** What a structure was tokenized with: the grammar, the theme and whether the grammar had landed. */\nexport interface CodeTokenBasis {\n readonly language: string;\n readonly theme: CodeTheme;\n readonly highlighted: boolean;\n}\n\n/** A listing a command left behind: its source, its tokens, and the basis they were made on. */\nexport interface CodeListing {\n readonly source: string;\n readonly lines: IdLine[];\n readonly basis: CodeTokenBasis;\n}\n\nexport interface CodeEditFrame {\n readonly transition: StructuralTransition;\n readonly progress: number;\n}\n\n/** The dim `highlight` leaves: what stays bright, what the rest dims to, and the cross-fade in flight. */\nexport interface CodeFocus {\n readonly dim: number | null;\n readonly ids: Set<number>;\n readonly fade: DimTransition | null;\n}\n\nexport interface CodeBanding {\n readonly bands: RowBand[];\n readonly fade: RowsTransition | null;\n}\n\n/** Each `Code` component's strategies and edit cache, by the node class it generated. */\nconst kits = new WeakMap<object, Kit>();\n\nconst NO_FOCUS: CodeFocus = { dim: null, ids: new Set(), fade: null };\nconst NO_BANDING: CodeBanding = { bands: [], fade: null };\n\n/** A private entry: commands write it, documents and calls never see it. */\nfunction own<T>(initial: T) {\n return Types.custom<T, T, { readonly private: true }>(initial, { private: true });\n}\n\nconst TARGET = Types.custom<CodeTarget | undefined>(undefined, { kind: \"selector\" });\nconst TEXT = Types.text(\"\", { multiline: true });\n\n/**\n * A `Code` whose edits are paired and timed by `strategies`; {@link Code} has the\n * defaults, and a project wanting another hands its own to the engine (same key).\n * A listing only, with no box behind it: a card is a `Code` inside a hugging `Rect`.\n */\nexport function defineCode(strategies: CodeStrategies = {}) {\n const kit: Kit = {\n diff: strategies.diffStrategy ?? defaultCodeDiff,\n phases: strategies.phaseStrategy ?? defaultCodePhases,\n edits: new WeakMap(),\n };\n const act = (timeline: { animate(frame: Frame): Piece; wait(seconds: number): Piece }, frame: Frame | null): Piece =>\n (frame ? timeline.animate(frame) : timeline.wait(0));\n\n const component = component2d({\n key: \"code\",\n state: {\n code: Types.custom<string, CodeSource>(\"\", { lerp: blendSource }),\n language: \"typescript\",\n fontFamily: \"Fira Mono\",\n /** A built-in or registered theme name (e.g. `'github-dark'`), or a `CodeHighlightStyle` object. */\n theme: Types.custom<CodeTheme>(DefaultHighlightStyle.name),\n fontSize: 16,\n lineHeight: 1.6,\n // Extra space after every glyph, in px: folded into the advance a token is measured at.\n letterSpacing: 1.1,\n showLineNumbers: false,\n // In space-widths, so it scales with fontSize.\n lineNumberGap: 2,\n listing: own<CodeListing | null>(null),\n edit: own<CodeEditFrame | null>(null),\n focus: own(NO_FOCUS),\n banding: own(NO_BANDING),\n },\n defaults: { width: \"hug\", height: \"hug\" },\n allowedChildren: [],\n // The grammar gates layout: how many tokens there are, and so where each sits, depends on it.\n load: (loader, state) => {\n loader.font(state.fontFamily);\n loader.task(`shiki:lang:${state.language}`, grammarLoader(state.language), { before: \"layout\" });\n },\n commands: {\n /** Append `code` to the end of the listing. */\n append: {\n args: { code: TEXT },\n run: (timeline, state) => {\n const seen = current(state, kit);\n return act(timeline, editFrame(kit, seen, seen.source + timeline.args.code, basisOf(state)));\n },\n },\n /** Insert `code` above the listing. */\n prepend: {\n args: { code: TEXT },\n run: (timeline, state) => {\n const seen = current(state, kit);\n return act(timeline, editFrame(kit, seen, timeline.args.code + seen.source, basisOf(state)));\n },\n },\n /** Insert `code` before the 1-indexed `[line, col]`, clamped into the listing. */\n insert: {\n args: {\n position: Types.custom<[number, number] | undefined>(undefined, {\n kind: \"point\",\n properties: {\n line: { kind: \"number\", default: 1, min: 1, step: 1 },\n col: { kind: \"number\", default: 1, min: 1, step: 1 },\n },\n }),\n code: TEXT,\n },\n run: (timeline, state) => {\n const seen = current(state, kit);\n const offset = offsetAt(seen.lines, timeline.args.position as [number, number]);\n const next = seen.source.slice(0, offset) + timeline.args.code + seen.source.slice(offset);\n return act(timeline, editFrame(kit, seen, next, basisOf(state)));\n },\n },\n /**\n * Erase the code in `target`. A range of whole lines takes their line\n * breaks with it, so the rows below close up.\n */\n remove: {\n args: { target: TARGET },\n run: (timeline, state) => act(timeline, eraseFrame(kit, state, timeline.args.target as CodeRange)),\n },\n replace: {\n args: { target: TARGET, replacement: TEXT },\n run: (timeline, state) => {\n const seen = current(state, kit);\n const { start, end } = rangeToCharOffsets(timeline.args.target as CodeRange, lineLengths(seen.lines));\n const next = seen.source.slice(0, start) + timeline.args.replacement + seen.source.slice(end);\n return act(timeline, editFrame(kit, seen, next, basisOf(state)));\n },\n },\n /**\n * Dim everything outside `target` (one range or several) to `dim`.\n * Persistent: a second highlight cross-fades from this one.\n */\n highlight: {\n args: {\n target: TARGET,\n dim: Types.number(0.4, { min: 0, max: 1, step: 0.01, scale: 100, unit: \"%\" }),\n },\n run: (timeline, state) => act(timeline, highlightFrame(kit, state, timeline.args.target, timeline.args.dim)),\n },\n /** Fade every dimmed token back to full and clear the highlight. */\n resetHighlight: (timeline, state) => act(timeline, resetHighlightFrame(kit, state)),\n /**\n * Lay a band of `color` behind every line a range touches. A second\n * call slides the bands onto their new rows, paired in order; a band\n * keeps to its lines through an edit.\n */\n highlightRows: {\n args: {\n target: TARGET,\n color: Types.color(ROW_BAND_COLOR),\n radius: Types.number(ROW_BAND_RADIUS, { min: 0, step: 1 }),\n },\n run: (timeline, state) => {\n const seen = current(state, kit);\n const bands = rowBandsIn(seen.lines, normalizeCodeRanges(timeline.args.target), timeline.args.color, Math.max(0, timeline.args.radius ?? ROW_BAND_RADIUS));\n return act(timeline, rowsFrame(seen, state.banding.bands, bands));\n },\n },\n /** Fade every row band out and clear them. */\n resetRowHighlight: (timeline, state) => act(timeline, rowsFrame(current(state, kit), state.banding.bands, [])),\n },\n measure: (measurer, state) => measureListing(measurer, state, kit),\n // Refuses the ambient text style: every column is measured against this face, so an\n // inherited family or weight would shape glyphs the geometry was never measured for.\n render:(ctx, state) => ctx.textStyle(null, () => drawListing(ctx, state, kit)),\n });\n kits.set(component.node, kit);\n return component;\n}\n\n/**\n * A syntax-highlighted listing whose edits animate token by token: each edit\n * is diffed against what is on screen, so a token that survives travels to\n * its new column and only what changed fades.\n */\nexport const Code = defineCode();\nexport type Code = NodeOf<typeof Code>;\nexport type CodeProps = NonNullable<Parameters<typeof Code>[0]>;\n\n/** What a listing shows now: its source, its token rows, and the edit in flight, if any. */\nexport function listingOf(code: Code): { readonly source: string; readonly lines: readonly IdLine[]; readonly edit: StructuralTransition | null } {\n const kit = kits.get(code.constructor);\n if (!kit) throw new TypeError(\"listingOf takes a node a `Code` component built.\");\n const view = shown(code, kit);\n return { source: view.source, lines: view.lines, edit: editOf(view) };\n}\n\n/** Every range matching the literal `text` in `source`, in order and not overlapping. Multi-line matches are found too. */\nexport function findAllRanges(source: CodeSource, text: string): CodeRange[] {\n const ranges: CodeRange[] = [];\n if (!text) return ranges;\n const joined = normalizeSource(sourceText(source));\n const lineLens = joined.split(\"\\n\").map((line) => line.length);\n let from = 0;\n while (true) {\n const idx = joined.indexOf(text, from);\n if (idx === -1) break;\n ranges.push(charOffsetsToRange(idx, idx + text.length, lineLens));\n from = idx + Math.max(1, text.length);\n }\n return ranges;\n}\n\n/** The `index`th range matching `text`, or `null`. */\nexport function findRangeAt(source: CodeSource, text: string, index: number): CodeRange | null {\n return findAllRanges(source, text)[index] ?? null;\n}\n\n/** The first range matching `text`, or `null`. */\nexport function findFirstRange(source: CodeSource, text: string): CodeRange | null {\n return findRangeAt(source, text, 0);\n}\n\ninterface Kit {\n readonly diff: CodeDiffStrategy;\n readonly phases: CodePhaseStrategy;\n /** The edit from a listing to a source and basis, built once: a `to({ code })` asks for it every frame. */\n readonly edits: WeakMap<IdLine[], Map<string, Map<string, Edited>>>;\n}\n\ninterface Edited {\n readonly transition: StructuralTransition;\n readonly listing: CodeListing;\n}\n\n/** What the structure resolves from; a command's snapshot and a node's state view both qualify. */\ninterface ListingState {\n readonly code: CodeSource;\n readonly language: string;\n readonly theme: CodeTheme;\n readonly listing: CodeListing | null;\n readonly edit: CodeEditFrame | null;\n}\n\ninterface LayoutState extends ListingState {\n readonly fontSize: number;\n readonly fontFamily: string;\n readonly lineHeight: number;\n readonly letterSpacing: number;\n readonly padding: InsetsResolved;\n readonly showLineNumbers: boolean;\n readonly lineNumberGap: number;\n}\n\ninterface DrawState extends LayoutState {\n readonly focus: CodeFocus;\n readonly banding: CodeBanding;\n}\n\n/** The structure a frame draws, and the edit it is part-way through. */\ninterface Shown {\n readonly source: string;\n readonly lines: IdLine[];\n readonly transition: StructuralTransition | null;\n readonly progress: number;\n}\n\n/** A `to({ code })` mid-flight wins, as it wrote `code` after any edit command; then an edit in flight, then the settled listing. */\nfunction shown(s: ListingState, kit: Kit): Shown {\n const code = s.code;\n if (typeof code !== \"string\") {\n const { transition } = edited(settled(s, code.from, kit), code.to, basisOf(s), kit);\n return { source: code.to, lines: transition.to, transition, progress: code.t };\n }\n if (s.edit) return { source: normalizeSource(code), lines: s.edit.transition.to, transition: s.edit.transition, progress: s.edit.progress };\n const listing = settled(s, normalizeSource(code), kit);\n return { source: listing.source, lines: listing.lines, transition: null, progress: 1 };\n}\n\nfunction editOf(view: Shown): StructuralTransition | null {\n return view.transition ? { ...view.transition, progress: view.progress } : null;\n}\n\n/** The listing a command starts from. */\nfunction current(s: ListingState, kit: Kit): CodeListing {\n return settled(s, normalizeSource(sourceText(s.code)), kit);\n}\n\n/**\n * The structure `source` settles on: from the props until a listing command has\n * acted, then the listing it left, recoloured (ids kept) when only the theme moved\n * and diffed onward when the source has.\n */\nfunction settled(s: ListingState, source: string, kit: Kit): CodeListing {\n const basis = basisOf(s);\n const pinned = s.listing;\n if (!pinned) return derived(source, basis);\n if (pinned.source !== source) return edited(pinned, source, basis, kit).listing;\n if (sameBasis(pinned.basis, basis)) return pinned;\n if (pinned.basis.language === basis.language && pinned.basis.highlighted === basis.highlighted) return recoloured(pinned, basis);\n return derived(source, basis);\n}\n\nfunction basisOf(s: { readonly language: string; readonly theme: CodeTheme }): CodeTokenBasis {\n return { language: s.language, theme: s.theme, highlighted: canHighlight(s.language) };\n}\n\nfunction sameBasis(a: CodeTokenBasis, b: CodeTokenBasis): boolean {\n return a.language === b.language && a.theme === b.theme && a.highlighted === b.highlighted;\n}\n\n/** The source `code` names: where a `to({ code })` is heading, mid-tween. */\nfunction sourceText(code: CodeSource): string {\n return typeof code === \"string\" ? code : code.to;\n}\n\n/** Mid-tween `code` holds both sources so the frame can draw the edit between them; at either end it is a source again. */\nfunction blendSource(from: CodeSource, to: CodeSource, t: number): CodeSource {\n const leaving = sourceText(from);\n const arriving = sourceText(to);\n const a = normalizeSource(leaving);\n const b = normalizeSource(arriving);\n // Nothing to edit: it snaps at the end, as any text does.\n if (a === b) return t >= 1 ? arriving : leaving;\n if (t <= 0) return a;\n if (t >= 1) return b;\n return { from: a, to: b, t };\n}\n\nconst DERIVED = new Map<string, Map<string, CodeListing>>();\n/** Sources kept tokenized per basis, oldest dropped first; a bound `code` can name any number of them. */\nconst DERIVED_LISTINGS = 256;\n\n/** The props' own listing, the same object (and ids) each time it is asked for again. */\nfunction derived(source: string, basis: CodeTokenBasis): CodeListing {\n return recall(DERIVED, basisKey(basis), source, DERIVED_LISTINGS, () => ({ source, lines: tokenize(source, basis), basis }));\n}\n\nconst RECOLOURED = new WeakMap<IdLine[], Map<string, Map<string, CodeListing>>>();\n\n/** `pinned` in another theme: the same text split the same way keeps the ids a highlight or a band names. */\nfunction recoloured(pinned: CodeListing, basis: CodeTokenBasis): CodeListing {\n let shelf = RECOLOURED.get(pinned.lines);\n if (!shelf) RECOLOURED.set(pinned.lines, shelf = new Map());\n return recall(shelf, basisKey(basis), pinned.source, 4, () => {\n const lines = tokenize(pinned.source, basis);\n adoptIds(pinned.lines, lines);\n return { source: pinned.source, lines, basis };\n });\n}\n\nfunction edited(from: CodeListing, next: string, basis: CodeTokenBasis, kit: Kit): Edited {\n let shelf = kit.edits.get(from.lines);\n if (!shelf) kit.edits.set(from.lines, shelf = new Map());\n return recall(shelf, basisKey(basis), next, 16, () => buildEdit(kit, from.lines, next, basis));\n}\n\nfunction buildEdit(kit: Kit, from: IdLine[], next: string, basis: CodeTokenBasis): Edited {\n const edit = kit.diff(from, tokenize(next, basis));\n const transition: StructuralTransition = {\n kind: \"structural\",\n from,\n to: edit.lines,\n removedIds: edit.removedIds,\n addedIds: edit.addedIds,\n enteringLineIds: edit.newLineIds,\n fromColorById: edit.fromColorById,\n phases: kit.phases(edit.removedIds.size > 0, edit.addedIds.size > 0),\n progress: 0,\n layoutKey: null,\n fromLayout: null,\n toLayout: null,\n };\n return { transition, listing: { source: next, lines: edit.lines, basis } };\n}\n\nfunction tokenize(source: string, basis: CodeTokenBasis): IdLine[] {\n // Best effort outside the asset pipeline (a test, a headless measure): on the timeline `load` has the grammar in first.\n if (!basis.highlighted) ensureHighlighter([basis.language]).catch(() => { });\n return tokenizeCodeToIdLines(source, basis.language, basis.theme);\n}\n\nconst styleIds = new WeakMap<object, number>();\nlet nextStyleId = 1;\n\nfunction basisKey(basis: CodeTokenBasis): string {\n let theme: string;\n if (typeof basis.theme === \"string\") theme = `name:${basis.theme}`;\n else {\n let id = styleIds.get(basis.theme);\n if (id === undefined) styleIds.set(basis.theme, id = nextStyleId++);\n theme = `style:${id}`;\n }\n return `${basis.language}\\n${basis.highlighted ? 1 : 0}\\n${theme}`;\n}\n\n/** Memoized by basis, then by source; a basis keeps `limit` sources, least recently asked for dropped first. */\nfunction recall<T>(shelf: Map<string, Map<string, T>>, basis: string, source: string, limit: number, make: () => T): T {\n let row = shelf.get(basis);\n if (!row) shelf.set(basis, row = new Map());\n const hit = row.get(source);\n if (hit !== undefined) {\n row.delete(source);\n row.set(source, hit);\n return hit;\n }\n const made = make();\n row.set(source, made);\n if (row.size > limit) row.delete(row.keys().next().value as string);\n return made;\n}\n\n/** Carry `from`'s line and token ids onto `to` when the two spell the same tokens. */\nfunction adoptIds(from: IdLine[], to: IdLine[]): void {\n if (from.length !== to.length) return;\n for (let i = 0; i < from.length; i++) {\n const a = from[i].tokens;\n const b = to[i].tokens;\n if (a.length !== b.length) return;\n for (let j = 0; j < a.length; j++) if (a[j].content !== b[j].content) return;\n }\n for (let i = 0; i < from.length; i++) {\n to[i].id = from[i].id;\n for (let j = 0; j < from[i].tokens.length; j++) to[i].tokens[j].id = from[i].tokens[j].id;\n }\n}\n\n/** What a listing command writes at a point of its own eased time. */\ninterface ListingWrites {\n readonly code?: string;\n readonly listing?: CodeListing | null;\n readonly edit?: CodeEditFrame | null;\n readonly focus?: CodeFocus;\n readonly banding?: CodeBanding;\n}\n\ntype Frame = (t: number) => ListingWrites;\n\n/** Each command writes the listing it acted on at every time asked, so the ids it captured are the ones drawn. */\nfunction editFrame(kit: Kit, seen: CodeListing, source: string, basis: CodeTokenBasis): Frame | null {\n const next = normalizeSource(source);\n if (next === seen.source) return null;\n const { transition, listing } = buildEdit(kit, seen.lines, next, basis);\n // Three phases (see `phaseStrategy`): what leaves fades out, what stays reflows, then what is new arrives.\n return (t) => (t <= 0 ? { code: seen.source, listing: seen, edit: null }\n : t >= 1 ? { code: next, listing, edit: null }\n : { code: next, listing, edit: { transition, progress: t } });\n}\n\nfunction eraseFrame(kit: Kit, state: ListingState, target: CodeRange): Frame | null {\n const seen = current(state, kit);\n const source = seen.source;\n let { start, end } = rangeToCharOffsets(target, lineLengths(seen.lines));\n // `lines(2)` resolves to the characters of line 2: the row goes too, as an editor would close the gap. That is also what makes a blank row removable.\n const atLineStart = start === 0 || source[start - 1] === \"\\n\";\n const atLineEnd = end === source.length || source[end] === \"\\n\";\n if (atLineStart && atLineEnd) {\n if (end < source.length) end += 1;\n else if (start > 0) start -= 1;\n } else if (end <= start) {\n return null;\n }\n if (end <= start) return null;\n return editFrame(kit, seen, source.slice(0, start) + source.slice(end), basisOf(state));\n}\n\nfunction highlightFrame(kit: Kit, state: ListingState & { readonly focus: CodeFocus }, target: CodeTarget | undefined, dim: number): Frame | null {\n const seen = current(state, kit);\n const toDim = dim ?? 0.4;\n const matchIds = tokenIdsInRanges(seen.lines, normalizeCodeRanges(target));\n if (matchIds.size === 0) return null;\n\n const previous = state.focus;\n const fromDim = previous.dim ?? 1;\n const hadPrevious = previous.ids.size > 0;\n const tokens: AnimToken[] = [];\n for (const line of seen.lines) {\n for (const tok of line.tokens) {\n const fromOp = !hadPrevious || previous.ids.has(tok.id) ? 1 : fromDim;\n const toOp = matchIds.has(tok.id) ? 1 : toDim;\n if (fromOp === toOp) continue;\n tokens.push(makeAnim(tok.id, { keys: [0, 1], values: [fromOp, toOp] }));\n }\n }\n // Which tokens are dimmed is what the next highlight cross-fades from, so it is committed at the end and put back below it.\n const before: CodeFocus = { dim: hadPrevious ? fromDim : null, ids: previous.ids, fade: null };\n const done: CodeFocus = { dim: toDim, ids: matchIds, fade: null };\n return (t) => ({\n listing: seen,\n focus: t <= 0 ? before : t >= 1 ? done : { ...before, fade: { kind: \"dim\", tokens, progress: t } },\n });\n}\n\nfunction resetHighlightFrame(kit: Kit, state: ListingState & { readonly focus: CodeFocus }): Frame | null {\n const previous = state.focus;\n if (previous.dim === null) return null;\n const seen = current(state, kit);\n const fromDim = previous.dim;\n const tokens: AnimToken[] = [];\n for (const line of seen.lines) {\n for (const tok of line.tokens) {\n const fromOp = previous.ids.has(tok.id) ? 1 : fromDim;\n if (fromOp === 1) continue;\n tokens.push(makeAnim(tok.id, { keys: [0, 1], values: [fromOp, 1] }));\n }\n }\n const before: CodeFocus = { dim: fromDim, ids: previous.ids, fade: null };\n return (t) => ({\n listing: seen,\n focus: t >= 1 ? NO_FOCUS : t <= 0 ? before : { ...before, fade: { kind: \"dim\", tokens, progress: t } },\n });\n}\n\nfunction rowsFrame(seen: CodeListing, from: RowBand[], to: RowBand[]): Frame | null {\n if (from.length === 0 && to.length === 0) return null;\n return (t) => ({\n listing: seen,\n banding: t >= 1 ? { bands: to, fade: null }\n : t <= 0 ? { bands: from, fade: null }\n : { bands: from, fade: { kind: \"rows\", from, to, progress: t } },\n });\n}\n\nfunction lineLengths(lines: IdLine[]): number[] {\n return lines.map((line) => line.tokens.reduce((acc, t) => acc + t.content.length, 0));\n}\n\n/** Character offset of a 1-indexed (line, col), clamped into the document. */\nfunction offsetAt(lines: IdLine[], position: [number, number]): number {\n const lens = lineLengths(lines);\n if (lens.length === 0) return 0;\n const [rawLine, rawCol] = position;\n const li = Math.max(0, Math.min(lens.length - 1, rawLine - 1));\n let offset = 0;\n for (let k = 0; k < li; k++) offset += lens[k] + 1;\n return offset + Math.max(0, Math.min(lens[li], rawCol - 1));\n}\n\n/** The ids of every token any of `codeRanges` overlaps, partly or wholly. */\nfunction tokenIdsInRanges(lines: IdLine[], codeRanges: CodeRange[]): Set<number> {\n const result = new Set<number>();\n const lineLens = lineLengths(lines);\n if (lineLens.length === 0) return result;\n const offsets = codeRanges\n .map((r) => rangeToCharOffsets(r, lineLens))\n .filter(({ start, end }) => end > start);\n if (offsets.length === 0) return result;\n\n let off = 0;\n for (let li = 0; li < lines.length; li++) {\n for (const tok of lines[li].tokens) {\n const tStart = off;\n const tEnd = off + tok.content.length;\n if (offsets.some(({ start, end }) => tEnd > start && tStart < end)) result.add(tok.id);\n off = tEnd;\n }\n if (li < lines.length - 1) off += 1;\n }\n return result;\n}\n\n/** One band per range, over every line it touches; a range past the end of the listing gives none. */\nfunction rowBandsIn(lines: IdLine[], codeRanges: CodeRange[], color: NormalizedColor, radius: number): RowBand[] {\n const count = lines.length;\n const bands: RowBand[] = [];\n for (const range of codeRanges) {\n const first = Math.max(1, Math.round(range.startLine ?? 1));\n const last = Math.min(count, range.endLine == null || range.endLine === Infinity ? count : Math.round(range.endLine));\n if (first > last) continue;\n bands.push({ startId: lines[first - 1].id, endId: lines[last - 1].id, color, radius });\n }\n return bands;\n}\n\n/** One range as a one-element array; a chain or array as itself; the `{ list }` a chain serialises as, as that chain. */\nfunction normalizeCodeRanges(codeRange: CodeTarget | undefined): CodeRange[] {\n const maybeIterable = codeRange as Partial<Iterable<CodeRange>>;\n if (typeof maybeIterable[Symbol.iterator] === \"function\") {\n return [...(codeRange as Iterable<CodeRange>)];\n }\n const stored = (codeRange as { list?: unknown }).list;\n if (Array.isArray(stored)) return [...(stored as CodeRange[])];\n return [codeRange as CodeRange];\n}\n\nconst grammarLoaders = new Map<string, () => Promise<void>>();\n\n// One function per language: a second load function for an already-declared task key is ignored with a warning.\nfunction grammarLoader(language: string): () => Promise<void> {\n let load = grammarLoaders.get(language);\n if (load === undefined) {\n load = () => ensureHighlighter([language]);\n grammarLoaders.set(language, load);\n }\n return load;\n}\n\ninterface Layouts {\n readonly from: CodeLayout;\n readonly to: CodeLayout;\n}\n\n/** A node's measurements between frames: token advances, and the layouts last built, reused while their inputs are unchanged. */\ninterface Measured {\n readonly advances: TokenAdvanceCache;\n measurer: Measurer | null;\n /** The measurer of the node's last measure, as the engine's helpers take one. */\n scope: MeasureContext2D | null;\n settled: { readonly lines: IdLine[]; readonly key: string; readonly layout: CodeLayout } | null;\n edit: { readonly transition: StructuralTransition; readonly key: string; readonly from: CodeLayout; readonly to: CodeLayout } | null;\n}\n\n/** By the node's state view, one object per node that `measure` and `render` are both handed. */\nconst measuredBy = new WeakMap<object, Measured>();\n\nfunction measuredOf(state: object): Measured {\n let found = measuredBy.get(state);\n if (!found) measuredBy.set(state, found = { advances: new TokenAdvanceCache(), measurer: null, scope: null, settled: null, edit: null });\n return found;\n}\n\nfunction metricsOf(s: LayoutState): CodeMetrics {\n return {\n fontSize: s.fontSize,\n fontFamily: s.fontFamily,\n lineHeight: s.lineHeight,\n letterSpacing: s.letterSpacing,\n padding: s.padding,\n showLineNumbers: s.showLineNumbers,\n lineNumberGap: s.lineNumberGap,\n };\n}\n\n/** One layout for a settled frame, two (where every token was, where it goes) inside an edit; `null` for a node never measured. */\nfunction layoutsOf(measured: Measured, view: Shown, m: CodeMetrics): Layouts | null {\n const signature = measured.advances.signature(m.fontSize, m.fontFamily);\n measured.advances.sync(signature);\n const key = `${metricsSignature(m)}|${signature}`;\n const scope = measured.scope;\n if (!view.transition) {\n const hit = measured.settled;\n if (hit && hit.lines === view.lines && hit.key === key) return { from: hit.layout, to: hit.layout };\n if (!scope) return null;\n const layout = layoutCode(view.lines, m, measured.advances, scope);\n measured.settled = { lines: view.lines, key, layout };\n return { from: layout, to: layout };\n }\n const hit = measured.edit;\n if (hit && hit.transition === view.transition && hit.key === key) return hit;\n if (!scope) return null;\n const both = {\n transition: view.transition,\n key,\n from: layoutCode(view.transition.from, m, measured.advances, scope),\n to: layoutCode(view.transition.to, m, measured.advances, scope),\n };\n measured.edit = both;\n return both;\n}\n\nfunction measureListing(measurer: Measurer, s: LayoutState, kit: Kit): Size2D {\n const measured = measuredOf(s);\n if (measured.measurer !== measurer) {\n measured.measurer = measurer;\n measured.scope = {\n measureText: (text, fontSize, fontFamily, fontWeight, letterSpacing) =>\n measurer.text(text, { fontFamily, fontSize, fontWeight, letterSpacing }),\n };\n }\n const view = shown(s, kit);\n const m = metricsOf(s);\n const layouts = layoutsOf(measured, view, m);\n if (!layouts) return { width: 0, height: 0 };\n const t = moveProgress(view.transition ? { phases: view.transition.phases, progress: view.progress } : null);\n const innerW = view.transition ? lerpNumber(layouts.from.innerW, layouts.to.innerW, t) : layouts.to.innerW;\n const innerH = view.transition ? lerpNumber(layouts.from.innerH, layouts.to.innerH, t) : layouts.to.innerH;\n return { width: innerW + m.padding.left + m.padding.right, height: innerH + m.padding.top + m.padding.bottom };\n}\n\nconst NO_PAINT: Paint.PaintState = { fill: [], stroke: [], shadow: [], overlay: [], start: 0, end: 1, clip: false };\nconst NOTHING = (): void => { };\n\nfunction drawListing(ctx: RenderContext, s: DrawState, kit: Kit): void {\n const measured = measuredOf(s);\n const view = shown(s, kit);\n const m = metricsOf(s);\n const layouts = layoutsOf(measured, view, m);\n // Paints nothing: it declares the outline picking and backdrop effects read.\n Paint.draw(ctx, NO_PAINT, null, { clipShape: outlineOf(view, layouts, m, ctx.size), children: NOTHING });\n const scope = measured.scope;\n if (!layouts || !scope) return;\n const { focus, banding } = s;\n drawCode({ draw: (graphics) => ctx.draw(graphics), measureText: scope.measureText }, {\n tokenLines: view.lines,\n metrics: m,\n advanceCache: measured.advances,\n from: layouts.from,\n to: layouts.to,\n edit: editOf(view),\n tokenStates: resolveTokenStates(view.lines, focus.fade ? [focus.fade] : [], focus.dim, focus.ids),\n highlightActive: focus.dim !== null || focus.fade !== null,\n rowBands: banding.bands,\n rowsEdit: banding.fade,\n boxW: ctx.size.width,\n });\n}\n\n/**\n * A listing is picked by its ink, line by ragged line (plus the gutter), inside the\n * box: code is mostly whitespace and empty corners would swallow clicks meant for\n * what is behind. Mid-edit, or before layout, the box.\n */\nfunction outlineOf(view: Shown, layouts: Layouts | null, m: CodeMetrics, size: Size2D): Graphics2D {\n const box = { x: 0, y: 0, width: size.width, height: size.height };\n if (view.transition || !layouts) return new Graphics2D().rect(box);\n const layout = layouts.to;\n const half = (m.fontSize * m.lineHeight) / 2;\n const gutter = m.showLineNumbers ? layout.gutter : 0;\n const left = Math.max(layout.startX - gutter, -size.width / 2);\n const outline = new Graphics2D();\n let lines = 0;\n for (let i = 0; i < layout.lineY.length; i++) {\n const ink = layout.lineW[i] ?? 0;\n if (ink + gutter <= 0) continue;\n const right = Math.min(layout.startX + ink, size.width / 2);\n const y = layout.lineY[i];\n const top = Math.min(y + half, size.height / 2);\n const bottom = Math.max(y - half, -size.height / 2);\n if (right < left || top < bottom) continue;\n // The row's own centre where the box leaves it whole, so a whole row is tested at its own centre.\n const whole = top === y + half && bottom === y - half;\n outline.rect({\n x: (left + right) / 2,\n y: whole ? y : (top + bottom) / 2,\n width: right - left,\n height: whole ? 2 * half : top - bottom,\n });\n lines++;\n }\n // No line has ink: the box with itself cut away, so nothing is grabbed (an empty outline would fall back to the box).\n return lines > 0 ? outline : new Graphics2D().rect(box).rect(box).cut();\n}\n"]}
package/dist/nodes.d.ts CHANGED
@@ -1,15 +1,3 @@
1
1
  import { Code } from "./node.js";
2
- /**
3
- * Every node type this package publishes.
4
- *
5
- * A host registers these by handing the array to an engine —
6
- * `new Engine(platform, { nodes: NODES })` — which reads each component's key.
7
- * Defining a component only *declares* that key: nothing is registered by
8
- * importing a module, so a registry holds exactly what its owner asked for.
9
- *
10
- * Listing the component **values** is also what survives bundling: this package
11
- * declares `sideEffects: false`, and a document names a node type by string, so
12
- * an import kept only for its side effect is exactly what gets shaken out.
13
- */
14
2
  export declare const NODES: (typeof Code)[];
15
3
  //# sourceMappingURL=nodes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,KAAK,EAAE,CAAC,OAAO,IAAI,CAAC,EAAW,CAAC"}
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAG9B,eAAO,MAAM,KAAK,EAAE,CAAC,OAAO,IAAI,CAAC,EAAW,CAAC"}
package/dist/nodes.js CHANGED
@@ -1,16 +1,4 @@
1
1
  import { Code } from "./node.js";
2
- /**
3
- * Every node type this package publishes.
4
- *
5
- * A host registers these by handing the array to an engine —
6
- * `new Engine(platform, { nodes: NODES })` — which reads each component's key.
7
- * Defining a component only *declares* that key: nothing is registered by
8
- * importing a module, so a registry holds exactly what its owner asked for.
9
- *
10
- * Listing the component **values** is also what survives bundling: this package
11
- * declares `sideEffects: false`, and a document names a node type by string, so
12
- * an import kept only for its side effect is exactly what gets shaken out.
13
- */
14
2
  // Typed by name, so the declaration names each component rather than spelling out its type through core.
15
3
  export const NODES = [Code];
16
4
  //# sourceMappingURL=nodes.js.map
package/dist/nodes.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B;;;;;;;;;;;GAWG;AACH,yGAAyG;AACzG,MAAM,CAAC,MAAM,KAAK,GAAoB,CAAC,IAAI,CAAC,CAAC","sourcesContent":["import { Code } from \"./node\";\n\n/**\n * Every node type this package publishes.\n *\n * A host registers these by handing the array to an engine —\n * `new Engine(platform, { nodes: NODES })` — which reads each component's key.\n * Defining a component only *declares* that key: nothing is registered by\n * importing a module, so a registry holds exactly what its owner asked for.\n *\n * Listing the component **values** is also what survives bundling: this package\n * declares `sideEffects: false`, and a document names a node type by string, so\n * an import kept only for its side effect is exactly what gets shaken out.\n */\n// Typed by name, so the declaration names each component rather than spelling out its type through core.\nexport const NODES: (typeof Code)[] = [Code];\n"]}
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,yGAAyG;AACzG,MAAM,CAAC,MAAM,KAAK,GAAoB,CAAC,IAAI,CAAC,CAAC","sourcesContent":["import { Code } from \"./node\";\n\n// Typed by name, so the declaration names each component rather than spelling out its type through core.\nexport const NODES: (typeof Code)[] = [Code];\n"]}
package/dist/render.d.ts CHANGED
@@ -3,33 +3,24 @@ import type { CodeLayout, CodeMetrics } from "./layout.js";
3
3
  import type { IdLine } from "./tokens.js";
4
4
  import type { TokenState, StructuralTransition, RowBand, RowsTransition } from "./transitions.js";
5
5
  import type { TokenAdvanceCache } from "./measure-cache.js";
6
- /** Everything a `Code` node's own instance state supplies to draw one frame. */
6
+ /** What a `Code` node supplies to draw one frame. */
7
7
  export interface DrawCodeState {
8
8
  tokenLines: IdLine[];
9
9
  metrics: CodeMetrics;
10
10
  advanceCache: TokenAdvanceCache;
11
- /** The one or two layouts this frame draws from — see `frameLayout` in `layout.ts`. */
12
11
  from: CodeLayout;
13
12
  to: CodeLayout;
14
13
  edit: StructuralTransition | null;
15
- /** Per-token opacity from `resolveTokenStates` (persistent highlight + any active dim transition). */
16
14
  tokenStates: Map<number, TokenState>;
17
- /** Whether a highlight (persistent dim, or a highlight()/resetHighlight() cross-fade) is currently engaged. */
15
+ /** A persistent dim or a highlight cross-fade is engaged. */
18
16
  highlightActive: boolean;
19
- /** The settled row bands, and the change between two sets of them in flight, if any. */
20
17
  rowBands?: RowBand[];
21
18
  rowsEdit?: RowsTransition | null;
22
- /** The node's laid-out width, which a band spans when it is wider than the block. */
19
+ /** A band spans this when it is wider than the block. */
23
20
  boxW?: number;
24
21
  }
25
- /** What a frame is drawn onto: somewhere to draw, and the face's measurements. A render context is one. */
22
+ /** Somewhere to draw and the face's measurements; a render context is one. */
26
23
  export type CodeCanvas = Pick<RenderContext2D, "draw" | "measureText">;
27
- /**
28
- * Draw one frame of a code listing: the settled structure, or — mid
29
- * structural edit — the two structures it is interpolating between (what
30
- * stays reflows, what is leaving fades out where it was, what is arriving
31
- * fades/slides in where it lands). Pure over `state`; touches nothing but
32
- * `draw`.
33
- */
24
+ /** Draws the settled structure, or mid-edit the two it interpolates between. Pure over `state`. */
34
25
  export declare function drawCode(draw: CodeCanvas, state: DrawCodeState): void;
35
26
  //# sourceMappingURL=render.d.ts.map