@idle-screens/schema 3.12.1 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/FORMAT.md CHANGED
@@ -46,7 +46,9 @@ sequence-level) (2026-09-10 — the print look); `timeline` (keyframes on the
46
46
  scene's own clock), paint-level layer `opacity` and `transform`,
47
47
  `position.dx` / `dy`, `wrapMorph` on the sequence envelope and
48
48
  `text: 'dip'` on `morph` (2026-09-25 — timed scenes); layer `groups` and
49
- `transform.origin` (2026-09-26 — groups and origin).
49
+ `transform.origin` (2026-09-26 — groups and origin); path drawings on
50
+ `polygon` — `path`, `fillRule`, `fill`, `gradient`, `stroke`, `parts`,
51
+ `span`, `origin` (2026-10-17 — vector drawings).
50
52
 
51
53
  ## Safety invariants
52
54
 
@@ -302,7 +304,9 @@ own `finish` is not steerable; steer a segment's, or republish.
302
304
  `maxDist`; `"chain"` wires entities in order (Mystify polygons — ignores
303
305
  `k`/`maxDist`, `closed: true` closes the loop); `"random"` uses a fixed
304
306
  deterministic wiring filtered by `maxDist`. `falloff: true` fades link alpha
305
- with distance, removing pop-in at the cutoff.
307
+ with distance, removing pop-in at the cutoff. `k` and `maxDist` are required
308
+ for `"nearest"` and `"random"`; a `"chain"` may omit both, except that
309
+ `falloff: true` needs `maxDist` (the distance at which a link has faded out).
306
310
 
307
311
  ### `sprite` (one of)
308
312
 
@@ -349,7 +353,68 @@ with distance, removing pop-in at the cutoff.
349
353
  or `morph` target for `sprite.points` is in the **same unit coordinates**,
350
354
  scaled by each entity's seeded radius (not by the keyed shape's own extent):
351
355
  keep every keyed point inside −1..1 (the validator rejects one outside), and
352
- shrink a target shape by scaling its points, not by exceeding the box
356
+ shrink a target shape by scaling its points, not by exceeding the box.
357
+ For anything more detailed than a 24-point facet, give the polygon a
358
+ **path** instead (next entry)
359
+ - **Path drawings** — `{ "kind": "polygon", "radius": [0.3, 0.3], "color": "#2f6a3e", "path": "M 0 -0.9 C 0.5 -0.9 0.7 -0.3 0.5 0.1 … Z" }`:
360
+ an SVG path `d` string in the same −1..1 unit box (`M L H V C S Q T A Z`,
361
+ absolute or relative, curves and arcs included), flattened once to a smooth
362
+ outline. Use it for illustration: leaves, creatures, lettering-like marks,
363
+ architecture. Everything below is **only** for polygons with a `path` (or
364
+ `parts`).
365
+ - **Holes and pieces.** Several subpaths in one `path` are one drawing.
366
+ `fillRule: "auto"` (default) decides by containment: a subpath lying
367
+ entirely inside another is a hole; one inside a hole is solid again (a
368
+ pupil in an eye-spot ring); pieces that merely overlap merge (branches,
369
+ veins, leaflets on a stem), and a hole cuts through every overlapping
370
+ piece of the layer (a window across two walls). `"nonzero"` /
371
+ `"evenodd"` are SVG's own rules — use them for pasted SVG, for overlap
372
+ patterns (a rosette of overlapping circles wants `evenodd`), and when a
373
+ same-colour shape sits inside another on purpose (`auto` would cut it).
374
+ - **`gradient`** replaces the flat colour of the fill:
375
+ `{ "type": "linear", "from": [0, -1], "to": [0, 1], "stops": [{ "at": 0, "color": "#2c6a3a" }, { "at": 1, "color": "#7ab070", "opacity": 0.6 }] }`
376
+ or `{ "type": "radial", "center": [0, 0], "radius": 1, "focus": [-0.3, -0.4], "stops": [...] }`
377
+ (2..8 stops, `at` 0..1 non-decreasing, optional per-stop `opacity`).
378
+ Coordinates are in the drawing's unit box, so the shading scales and
379
+ rotates with it; `"units": "part"` reads them in the part's own bounding
380
+ box (−1..1), so one gradient lights every piece on its own (a radial
381
+ there is the piece's ellipse). A `focus` off-centre gives a lit sphere.
382
+ - **`stroke`** — `{ "color": "#1f2a1c", "width": 0.006, "opacity": 0.8, "join": "round", "cap": "round" }`
383
+ — an outline along every subpath **as drawn** (holes included; open
384
+ subpaths too). `width` is in unit-box units (0.01 = 1% of the drawing's
385
+ half-size). Overlapping pieces show their inner edges, as in SVG.
386
+ - **`fill: false`** draws the stroke only — line art. Then open paths
387
+ (no `Z`) are fine: veins, hatching, antennae, rigging.
388
+ - **`parts`** — a multi-colour drawing in one layer:
389
+ `"parts": [{ "path": "…", "color": "#c8501e" }, { "path": "…", "gradient": {…}, "stroke": {…}, "opacity": 0.85 }, …]`
390
+ (1..256), drawn back to front, each with its own `path`, `color`
391
+ (default: the entity's colour, so `colors` palettes still pick per
392
+ entity), `fillRule`, `fill`, `gradient`, `stroke` and `opacity`. With
393
+ `parts`, put that paint on the parts, never on the sprite. One layer
394
+ holds a whole illustration, and a counted layer reuses it: a balloon with
395
+ gores, shading, ropes and basket × 7 drifting entities, all parts moving
396
+ as one.
397
+ - **`span`** — how the unit box lands on screen: `"box"` (default, the
398
+ square sized by `radius`), `"width"` (x spans the full screen width; y
399
+ keeps `radius`), `"height"`, `"screen"` (both). **`origin`** `[x, y]` is
400
+ the unit-box point placed at `position`: hills and ground bands are
401
+ `span: "width", origin: [0, 1]` at `position: { x: 0.5, y: 1 }` — their
402
+ base sits on the bottom edge, edge to edge, on 16:9, 9:16 and 1:1 alike.
403
+ Strokes keep one width when a drawing stretches. Anything meant to sit
404
+ at a screen position (a moon beside its glow) is its own layer, not a
405
+ part of a big centred drawing — positions are screen fractions, a
406
+ drawing's interior is not.
407
+ - **Budget.** A path flattens to at most 4096 points; a scene's path
408
+ outlines total at most 16384 (flattened points, strokes included, ×
409
+ `count`). Curves cost points; straight segments and gentle curves are
410
+ nearly free (flattening drops points within 0.0005 of the line).
411
+ - **Steering and morphs.** Part colours, gradient stops, stroke widths
412
+ and opacities glide like any paint. Two paths with the **same commands**
413
+ (same letters, same count of numbers — draw both from one template)
414
+ morph number by number; any other path change steps.
415
+ - Drawings are rendered once and reused while they look the same (moving
416
+ copies are resampled), so a detailed still drawing costs about what a
417
+ flat one does per frame.
353
418
  - `{ "kind": "stroke", "length": [0.08, 0.18], "points": [[-1, 0.3], [-0.5, -0.6], [0.3, -0.7], [1, 0.1]], "width": 0.004, "taper": true, "color": "#f2e8c9" }` —
354
419
  a freehand mark: a path through 2..24 unit-coordinate points, scaled so the
355
420
  unit box spans the seeded `length`, stroked `width` wide with round joins.
package/dist/index.d.ts CHANGED
@@ -334,11 +334,13 @@ interface LayerSpec {
334
334
  * - 'random': a fixed golden-ratio-stride wiring (k partners per entity,
335
335
  * deterministic, no RNG draws) — breaks the crystalline k-nearest look.
336
336
  * `falloff` fades link alpha with distance/maxDist, killing pop-in at the cutoff.
337
+ * `k` and `maxDist` are required for 'nearest' and 'random'; 'chain' needs
338
+ * neither, except `maxDist` when `falloff` is set (it is the fade distance).
337
339
  * Capped at LIMITS.maxLinksK. Layer count must be <= LIMITS.maxLinkLayerCount when set.
338
340
  */
339
341
  links?: {
340
- k: number;
341
- maxDist: number;
342
+ k?: number;
343
+ maxDist?: number;
342
344
  color?: string;
343
345
  alpha?: number;
344
346
  width?: number;
@@ -547,6 +549,14 @@ type SpriteSpec = {
547
549
  color: string;
548
550
  sides?: number;
549
551
  points?: Array<[number, number]>;
552
+ path?: string;
553
+ fillRule?: 'auto' | 'nonzero' | 'evenodd';
554
+ fill?: boolean;
555
+ gradient?: PathGradient;
556
+ stroke?: PathStroke;
557
+ parts?: PathPart[];
558
+ span?: 'box' | 'width' | 'height' | 'screen';
559
+ origin?: [number, number];
550
560
  soft?: boolean;
551
561
  colors?: string[];
552
562
  colorWeights?: number[];
@@ -961,6 +971,54 @@ interface IdleSequence {
961
971
  finish?: FinishSpec;
962
972
  segments: SequenceSegment[];
963
973
  }
974
+ /**
975
+ * A gradient fill for a path polygon, in the path's own −1..1 unit box (so it
976
+ * scales and rotates with the drawing). Overrides `color` for the fill;
977
+ * `color` stays what perception and palettes read when no gradient is known.
978
+ */
979
+ type PathGradient = {
980
+ type: 'linear';
981
+ from: [number, number];
982
+ to: [number, number];
983
+ stops: PathGradientStop[];
984
+ units?: 'box' | 'part';
985
+ } | {
986
+ type: 'radial';
987
+ center: [number, number];
988
+ radius: number;
989
+ focus?: [number, number];
990
+ stops: PathGradientStop[];
991
+ units?: 'box' | 'part';
992
+ };
993
+ interface PathGradientStop {
994
+ at: number;
995
+ color: string;
996
+ opacity?: number;
997
+ }
998
+ /** An outline drawn along every subpath of a path polygon (open ones too). `width` is in unit-box units. */
999
+ interface PathStroke {
1000
+ color: string;
1001
+ width: number;
1002
+ opacity?: number;
1003
+ join?: 'round' | 'miter' | 'bevel';
1004
+ cap?: 'round' | 'butt' | 'square';
1005
+ }
1006
+ /**
1007
+ * One piece of a multi-colour path drawing (`polygon.parts`), drawn back to
1008
+ * front in the drawing's unit box: its own outline, colour (default: the
1009
+ * sprite's), gradient, stroke and opacity. A gradient with `units: 'part'`
1010
+ * reads its coordinates in this part's own bounding box mapped to −1..1, so
1011
+ * one gradient spec shades each piece on its own.
1012
+ */
1013
+ interface PathPart {
1014
+ path: string;
1015
+ color?: string;
1016
+ fillRule?: 'auto' | 'nonzero' | 'evenodd';
1017
+ fill?: boolean;
1018
+ gradient?: PathGradient;
1019
+ stroke?: PathStroke;
1020
+ opacity?: number;
1021
+ }
964
1022
 
965
1023
  declare function validateSpec(spec: unknown): ValidationResult;
966
1024
  /**
@@ -1164,15 +1222,25 @@ interface LinkEdge {
1164
1222
  j: number;
1165
1223
  dist: number;
1166
1224
  }
1225
+ /**
1226
+ * `links.maxDist` in px at `scale` (px per spec unit), or `Infinity` when it is
1227
+ * absent — a chain needs no cutoff. Callers apply `falloff` only to a finite
1228
+ * value, so an absent `maxDist` can never put NaN into an alpha.
1229
+ */
1230
+ declare function linkMaxDistPx(links: {
1231
+ maxDist?: number;
1232
+ }, scale: number): number;
1167
1233
  /**
1168
1234
  * Edge list for a layer's `links`, dispatching on mode:
1169
1235
  * 'nearest' (default) k-nearest within maxDist; 'chain' sequential order
1170
1236
  * (Mystify — ignores k/maxDist, `closed` joins last to first); 'random' a fixed
1171
1237
  * golden-ratio-stride wiring filtered by maxDist (deterministic, no RNG draws).
1238
+ * An absent `k` reads as 1 and an absent `maxDist` (`Infinity` from
1239
+ * `linkMaxDistPx`) as no cutoff; the validator requires both outside chain mode.
1172
1240
  */
1173
1241
  declare function linkEdges(links: {
1174
- k: number;
1175
- maxDist: number;
1242
+ k?: number;
1243
+ maxDist?: number;
1176
1244
  mode?: 'nearest' | 'chain' | 'random';
1177
1245
  closed?: boolean;
1178
1246
  }, positions: Array<{
@@ -1391,6 +1459,13 @@ declare function lerpSpec(from: SaverSpec, to: SaverSpec, k: number): SaverSpec;
1391
1459
  * timeline, so every stored morph and glide is unchanged.
1392
1460
  */
1393
1461
  declare function lerpValue(from: unknown, to: unknown, k: number, specRoot?: boolean, rootKey?: string): unknown;
1462
+ /**
1463
+ * Interpolate two SVG path d strings that share their structure — the same
1464
+ * command letters in the same order and the same count of numbers — by
1465
+ * lerping every number; null when they differ in structure (the morph then
1466
+ * steps). Arc flags (0/1) round, so a half-way arc stays a valid arc.
1467
+ */
1468
+ declare function lerpPathD(a: string, b: string, k: number): string | null;
1394
1469
  /**
1395
1470
  * The string(s) a text layer paints — `strings` of a `text` sprite, `text`
1396
1471
  * of a `textBlock` — or null for every other sprite.
@@ -1643,9 +1718,9 @@ interface LuminanceGridOptions extends PerceiveOptions {
1643
1718
  * re-uses drawTrail's sampling — past positions with decaying alpha and
1644
1719
  * shrinking radius. Polygons larger than POLYGON_OUTLINE_CELLS are scanned by
1645
1720
  * their real (rotated) outline; smaller ones splat as a fill-weighted disc.
1646
- * Remaining approximations (documented, deliberate): soft circles use a linear
1647
- * falloff, background drift is sampled at its rest position. Good enough to
1648
- * perceive composition, focus, balance — and now smear.
1721
+ * Remaining approximations (documented, deliberate): background drift is
1722
+ * sampled at its rest position. Good enough to perceive composition, focus,
1723
+ * balance — and now smear.
1649
1724
  */
1650
1725
  declare function luminanceGrid(spec: SaverSpec, opts?: LuminanceGridOptions): LuminanceGrid;
1651
1726
  /**
@@ -2678,4 +2753,89 @@ declare const EXAMPLE_SPECS: SaverSpec[];
2678
2753
  /** Lookup by saver id. */
2679
2754
  declare const EXAMPLE_BY_ID: Readonly<Record<string, SaverSpec>>;
2680
2755
 
2681
- export { AQUARIUM_SPEC, AURORA_SPEC, type BackgroundDrift, type BackgroundSpec, type BandSpec, COHESION_T, COMETS_SPEC, CONSTELLATION_SPEC, type CapabilityTier, type CohesionRead, type CycleSpec, DASHBOARD_SPEC, DEFAULT_KEY_DUR, DITHER_ALPHA, DITHER_TILE, type DominanceEntry, EXAMPLE_BY_ID, EXAMPLE_SEQUENCES, EXAMPLE_SPECS, type Entity, FACETS_SPEC, FIELD_BUCKET_MS, FIELD_DRIFT_DEFAULT_AMOUNT, FIELD_RASTER_SHORT_SIDE, FIELD_RASTER_SHORT_SIDE_LOW, FINISH_ANIMATE_HZ, type FieldBackground, type FieldDrift, type FinishPass, type FinishSpec, GRAIN_ALPHA, GRAIN_TILE, type GradientStop, HAIKU_SPEC, type IdleSequence, LANTERNS_SPEC, LIMITS, LOBBY_TALK_SPEC, type LayerCohesion, type LayerGroup, type LayerMotionStats, type LayerSnapshot, type LayerSpec, type LayerTransform, type LinkEdge, type LuminanceGrid, type LuminanceGridOptions, MATRIX_RAIN_SPEC, MURMUR_SPEC, type MotionEase, type MotionSpec, NOSTALGHIA_CANDLE_SPEC, ORRERY_SPEC, PHASE_DUET_SPEC, PINGS_SPEC, POLYGONS_SPEC, PROCESSION_SPEC, type PerceiveOptions, type PerceiveSequenceOptions, type Placed, RAIN_SPEC, RELAY_BOARD_SPEC, type ResolveOptions, type ResolvedSegment, type RevealState, SAKURA_SPEC, SCHEMA_EXAMPLES, SCHEMA_VERSION, SHARD_FALL_SPEC, SIGNAL_BOARD_SPEC, SNOWFALL_SPEC, SPARSE_NIGHT_SPEC, type SaverSpec, type SceneColour, type SceneDescription, type SceneDiff, type ScenePerception, type SceneSnapshot, type SchemaExample, type ScreenOp, type SequenceExample, type SequenceFramePerception, type SequenceMountContext, type SequenceSaverInstance, type SequenceSaverPlugin, type SequenceSegment, type SequenceTransition, type SpecError, type SpecMountContext, type SpecWarning, type SpriteSpec, type SteerDelta, THERMAL_FIELD_SPEC, THREE_MOVEMENTS_SEQUENCE, TYPED_CUE_SPEC, type TextBlockAnchor, type TextBlockLine, type TextMetricsClass, type TextRevealInput, type TextRevealSpec, type TextRole, type TextSpriteInfo, type Timeline, type TimelineKey, type ValidationResult, WARP_MAX_SCALE, WARP_NEAR, WARP_TUNNEL_SPEC, WEB_WORK_SPEC, type WanderOsc, type WarningBox, adviseSequence, adviseSpec, alphaAt, applyDeltasToSpec, assertValidSequence, assertValidSpec, bayerMatrix, bayerTilePixels, bedRenderSeed, breakTextBlock, buildEntities, canMorph, canWrapMorph, canonicalSpecPath, cohesionOf, compileSaver, compileSequence, createFinishPass, createSceneCanvas, describeScene, diffScenes, dominanceRanking, easeSmooth, emitEnvelope, emitWindow, entityScales, fieldAt, fieldOctaves, fieldRgb, fieldRgbAt, fieldSampleTime, finishStrength, grainOffset, grainTilePixels, graphemeClusters, hasHotSwapSequence, headingAt, hexToRgb255, ignoredPropertyPaths, latticeHash, layerCohesion, lerpSpec, lerpValue, lifeAlphaAt, linkEdges, linkPairs, luminanceGrid, manifestFor, morphChainRoot, morphNothingMorphable, motionStats, nextKeyAfter, normalizeSeed, perceiveScene, perceiveSequenceFrame, pickScreenOp, positionAt, presentWithFinish, readSpecPath, renderBrailleMap, renderDensityMap, resolveSegment, resolveSpecPath, resolveTimelineAt, revealState, rgb255Luma, rotationAt, sceneColour, seamCauseOf, seamsWorthWarning, segmentRenderSeed, segmentStart, sequenceSteerablePaths, sequenceSwapCompatible, sequenceWantsFinish, sizeAt, spriteIndexAt, spriteVariants, steerablePaths, structuralSignature, textBlockAnchorOffset, textMetricsClassFor, textSprites, textStringsDiffer, textStringsOf, textWidthEm, timelineLocalTime, timelineSampleTimes, timelineSampleTimesAfter, timelineTracks, validateSequence, validateSpec, validateSpecPaths, withoutTimeline };
2756
+ /**
2757
+ * Shape glyph geometry — pure, renderer-free, shared by the compiler (what to
2758
+ * stroke/fill), perception (how much ink that is) and advise. Everything is
2759
+ * computed from the sprite spec + the entity's seeded size, so the canvas and
2760
+ * the analytic model agree by construction.
2761
+ *
2762
+ * Unit coordinates: `polygon.points` and `stroke.points` live in a −1..1 box
2763
+ * that is scaled by the entity's half-size (circumradius for polygons, half of
2764
+ * `length` for strokes), so the seeded size range is the glyph's bounding
2765
+ * diameter — the same rule `circle.radius` / `streak.length` already follow.
2766
+ */
2767
+
2768
+ type PolygonSprite = Extract<SpriteSpec, {
2769
+ kind: 'polygon';
2770
+ }>;
2771
+ /** Most outline points one flattened path may produce. */
2772
+ declare const MAX_PATH_POINTS = 4096;
2773
+ interface FlattenedPath {
2774
+ /** One closed ring: subpaths joined by zero-width bridges, inner ones wound as holes. */
2775
+ points: Array<[number, number]>;
2776
+ subpaths: number;
2777
+ /** Every subpath as drawn (simplified, no bridges), for strokes: open unless it ended in Z. */
2778
+ lines: Array<{
2779
+ points: Array<[number, number]>;
2780
+ closed: boolean;
2781
+ }>;
2782
+ /** Parse error, if the string is not a usable path. */
2783
+ error?: string;
2784
+ }
2785
+ /**
2786
+ * How a path's subpaths combine. `auto` (default): containment decides which
2787
+ * subpaths are holes (see joinRings) — for authors who never think about
2788
+ * winding. `nonzero` / `evenodd`: SVG's own fill rules, honouring the winding
2789
+ * as drawn — for pasted SVG, and for a deliberate same-colour shape that sits
2790
+ * inside another (auto would read it as a hole).
2791
+ */
2792
+ type PathFillRule = 'auto' | 'nonzero' | 'evenodd';
2793
+ declare function flattenPath(d: string, rule?: PathFillRule): FlattenedPath;
2794
+ /** A polygon drawn from SVG paths: one `path`, or a multi-colour drawing of `parts`. */
2795
+ declare function isPathPolygon(s: SpriteSpec): boolean;
2796
+ /** One drawable piece of a path polygon, resolved: its outline, paint and part-space box. */
2797
+ interface ResolvedPart {
2798
+ flat: FlattenedPath;
2799
+ /** Its own colour, or null to use the entity's (sprite colour / palette pick). */
2800
+ color: string | null;
2801
+ fill: boolean;
2802
+ rule: 'nonzero' | 'evenodd';
2803
+ gradient?: PathGradient;
2804
+ stroke?: PathStroke;
2805
+ opacity: number;
2806
+ /** The fill's bounding box in the unit box (centre + half extents) — the space of `gradient.units: 'part'`. */
2807
+ box: {
2808
+ cx: number;
2809
+ cy: number;
2810
+ hw: number;
2811
+ hh: number;
2812
+ };
2813
+ }
2814
+ /**
2815
+ * A path polygon as an ordered list of parts, back to front. A single
2816
+ * `path` is a drawing of one part (its colour the entity's), so the renderer,
2817
+ * perception and the budget treat both forms one way. Memoised per sprite.
2818
+ */
2819
+ declare function pathParts(s: PolygonSprite): ResolvedPart[];
2820
+ /**
2821
+ * How a path drawing's −1..1 unit box lands on screen, in px: scale per axis
2822
+ * (sx, sy) and the unit-box point (ox, oy) that sits at the entity position.
2823
+ * span 'box' (default): uniform, the entity radius r on both axes — the
2824
+ * classic square box sized by the short side;
2825
+ * 'width': x spans the full screen width (sx = w/2), y keeps r — skylines,
2826
+ * hills and ground bands that must reach both side edges on any aspect;
2827
+ * 'height': y spans the full height, x keeps r;
2828
+ * 'screen': both — a frame or wash that hugs every edge.
2829
+ * `origin` [ox, oy] picks the anchored point: [0, 1] with position y = 1 sets
2830
+ * the drawing's bottom on the screen's bottom edge. Strokes keep the uniform
2831
+ * r for their width, so stretching never fattens an outline sideways.
2832
+ */
2833
+ declare function pathFrame(s: PolygonSprite, r: number, w: number, h: number): {
2834
+ sx: number;
2835
+ sy: number;
2836
+ ox: number;
2837
+ oy: number;
2838
+ uniform: boolean;
2839
+ };
2840
+
2841
+ export { AQUARIUM_SPEC, AURORA_SPEC, type BackgroundDrift, type BackgroundSpec, type BandSpec, COHESION_T, COMETS_SPEC, CONSTELLATION_SPEC, type CapabilityTier, type CohesionRead, type CycleSpec, DASHBOARD_SPEC, DEFAULT_KEY_DUR, DITHER_ALPHA, DITHER_TILE, type DominanceEntry, EXAMPLE_BY_ID, EXAMPLE_SEQUENCES, EXAMPLE_SPECS, type Entity, FACETS_SPEC, FIELD_BUCKET_MS, FIELD_DRIFT_DEFAULT_AMOUNT, FIELD_RASTER_SHORT_SIDE, FIELD_RASTER_SHORT_SIDE_LOW, FINISH_ANIMATE_HZ, type FieldBackground, type FieldDrift, type FinishPass, type FinishSpec, type FlattenedPath, GRAIN_ALPHA, GRAIN_TILE, type GradientStop, HAIKU_SPEC, type IdleSequence, LANTERNS_SPEC, LIMITS, LOBBY_TALK_SPEC, type LayerCohesion, type LayerGroup, type LayerMotionStats, type LayerSnapshot, type LayerSpec, type LayerTransform, type LinkEdge, type LuminanceGrid, type LuminanceGridOptions, MATRIX_RAIN_SPEC, MAX_PATH_POINTS, MURMUR_SPEC, type MotionEase, type MotionSpec, NOSTALGHIA_CANDLE_SPEC, ORRERY_SPEC, PHASE_DUET_SPEC, PINGS_SPEC, POLYGONS_SPEC, PROCESSION_SPEC, type PathGradient, type PathGradientStop, type PathPart, type PathStroke, type PerceiveOptions, type PerceiveSequenceOptions, type Placed, RAIN_SPEC, RELAY_BOARD_SPEC, type ResolveOptions, type ResolvedPart, type ResolvedSegment, type RevealState, SAKURA_SPEC, SCHEMA_EXAMPLES, SCHEMA_VERSION, SHARD_FALL_SPEC, SIGNAL_BOARD_SPEC, SNOWFALL_SPEC, SPARSE_NIGHT_SPEC, type SaverSpec, type SceneColour, type SceneDescription, type SceneDiff, type ScenePerception, type SceneSnapshot, type SchemaExample, type ScreenOp, type SequenceExample, type SequenceFramePerception, type SequenceMountContext, type SequenceSaverInstance, type SequenceSaverPlugin, type SequenceSegment, type SequenceTransition, type SpecError, type SpecMountContext, type SpecWarning, type SpriteSpec, type SteerDelta, THERMAL_FIELD_SPEC, THREE_MOVEMENTS_SEQUENCE, TYPED_CUE_SPEC, type TextBlockAnchor, type TextBlockLine, type TextMetricsClass, type TextRevealInput, type TextRevealSpec, type TextRole, type TextSpriteInfo, type Timeline, type TimelineKey, type ValidationResult, WARP_MAX_SCALE, WARP_NEAR, WARP_TUNNEL_SPEC, WEB_WORK_SPEC, type WanderOsc, type WarningBox, adviseSequence, adviseSpec, alphaAt, applyDeltasToSpec, assertValidSequence, assertValidSpec, bayerMatrix, bayerTilePixels, bedRenderSeed, breakTextBlock, buildEntities, canMorph, canWrapMorph, canonicalSpecPath, cohesionOf, compileSaver, compileSequence, createFinishPass, createSceneCanvas, describeScene, diffScenes, dominanceRanking, easeSmooth, emitEnvelope, emitWindow, entityScales, fieldAt, fieldOctaves, fieldRgb, fieldRgbAt, fieldSampleTime, finishStrength, flattenPath, grainOffset, grainTilePixels, graphemeClusters, hasHotSwapSequence, headingAt, hexToRgb255, ignoredPropertyPaths, isPathPolygon, latticeHash, layerCohesion, lerpPathD, lerpSpec, lerpValue, lifeAlphaAt, linkEdges, linkMaxDistPx, linkPairs, luminanceGrid, manifestFor, morphChainRoot, morphNothingMorphable, motionStats, nextKeyAfter, normalizeSeed, pathFrame, pathParts, perceiveScene, perceiveSequenceFrame, pickScreenOp, positionAt, presentWithFinish, readSpecPath, renderBrailleMap, renderDensityMap, resolveSegment, resolveSpecPath, resolveTimelineAt, revealState, rgb255Luma, rotationAt, sceneColour, seamCauseOf, seamsWorthWarning, segmentRenderSeed, segmentStart, sequenceSteerablePaths, sequenceSwapCompatible, sequenceWantsFinish, sizeAt, spriteIndexAt, spriteVariants, steerablePaths, structuralSignature, textBlockAnchorOffset, textMetricsClassFor, textSprites, textStringsDiffer, textStringsOf, textWidthEm, timelineLocalTime, timelineSampleTimes, timelineSampleTimesAfter, timelineTracks, validateSequence, validateSpec, validateSpecPaths, withoutTimeline };