@lumencast/runtime 0.3.0 → 0.5.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 (130) hide show
  1. package/README.md +57 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/animate/frame-coalescer.d.ts +13 -0
  4. package/dist/animate/frame-coalescer.d.ts.map +1 -0
  5. package/dist/animate/frame-coalescer.js +46 -0
  6. package/dist/animate/frame-coalescer.js.map +1 -0
  7. package/dist/animate/keyframes.d.ts +1 -1
  8. package/dist/animate/keyframes.d.ts.map +1 -1
  9. package/dist/animate/keyframes.js +20 -6
  10. package/dist/animate/keyframes.js.map +1 -1
  11. package/dist/animate/transitions.d.ts +33 -1
  12. package/dist/animate/transitions.d.ts.map +1 -1
  13. package/dist/animate/transitions.js +78 -3
  14. package/dist/animate/transitions.js.map +1 -1
  15. package/dist/{broadcast-B82fQPph.js → broadcast-3vYij4k-.js} +3 -3
  16. package/dist/{broadcast-B82fQPph.js.map → broadcast-3vYij4k-.js.map} +1 -1
  17. package/dist/{control-DIfwMYRb.js → control-BFNkY7-6.js} +4 -4
  18. package/dist/{control-DIfwMYRb.js.map → control-BFNkY7-6.js.map} +1 -1
  19. package/dist/{index-BFZXQAD7.js → index-CyOlpZAL.js} +318 -145
  20. package/dist/index-CyOlpZAL.js.map +1 -0
  21. package/dist/index.d.ts +5 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.html +1 -1
  24. package/dist/index.js +10 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/lumencast.js +9 -2
  27. package/dist/mount.d.ts.map +1 -1
  28. package/dist/mount.js +11 -1
  29. package/dist/mount.js.map +1 -1
  30. package/dist/render/bind-animate.d.ts +40 -0
  31. package/dist/render/bind-animate.d.ts.map +1 -0
  32. package/dist/render/bind-animate.js +329 -0
  33. package/dist/render/bind-animate.js.map +1 -0
  34. package/dist/render/bundle.d.ts +48 -6
  35. package/dist/render/bundle.d.ts.map +1 -1
  36. package/dist/render/bundle.js +71 -4
  37. package/dist/render/bundle.js.map +1 -1
  38. package/dist/render/color-interp.d.ts +18 -0
  39. package/dist/render/color-interp.d.ts.map +1 -0
  40. package/dist/render/color-interp.js +303 -0
  41. package/dist/render/color-interp.js.map +1 -0
  42. package/dist/render/css-color.d.ts +16 -0
  43. package/dist/render/css-color.d.ts.map +1 -0
  44. package/dist/render/css-color.js +130 -0
  45. package/dist/render/css-color.js.map +1 -0
  46. package/dist/render/diagnostics.d.ts +26 -0
  47. package/dist/render/diagnostics.d.ts.map +1 -0
  48. package/dist/render/diagnostics.js +58 -0
  49. package/dist/render/diagnostics.js.map +1 -0
  50. package/dist/render/fill.d.ts +15 -3
  51. package/dist/render/fill.d.ts.map +1 -1
  52. package/dist/render/fill.js +81 -14
  53. package/dist/render/fill.js.map +1 -1
  54. package/dist/render/filter-clamp.d.ts +35 -0
  55. package/dist/render/filter-clamp.d.ts.map +1 -0
  56. package/dist/render/filter-clamp.js +90 -0
  57. package/dist/render/filter-clamp.js.map +1 -0
  58. package/dist/render/keyframe-player.d.ts +4 -1
  59. package/dist/render/keyframe-player.d.ts.map +1 -1
  60. package/dist/render/keyframe-player.js +2 -2
  61. package/dist/render/keyframe-player.js.map +1 -1
  62. package/dist/render/primitives/frame.d.ts +16 -1
  63. package/dist/render/primitives/frame.d.ts.map +1 -1
  64. package/dist/render/primitives/frame.js +44 -13
  65. package/dist/render/primitives/frame.js.map +1 -1
  66. package/dist/render/primitives/image.d.ts +1 -1
  67. package/dist/render/primitives/image.d.ts.map +1 -1
  68. package/dist/render/primitives/image.js +8 -5
  69. package/dist/render/primitives/image.js.map +1 -1
  70. package/dist/render/primitives/index.d.ts +3 -0
  71. package/dist/render/primitives/index.d.ts.map +1 -1
  72. package/dist/render/primitives/index.js.map +1 -1
  73. package/dist/render/primitives/instance.d.ts +1 -1
  74. package/dist/render/primitives/instance.d.ts.map +1 -1
  75. package/dist/render/primitives/instance.js +10 -13
  76. package/dist/render/primitives/instance.js.map +1 -1
  77. package/dist/render/primitives/shape.d.ts +9 -3
  78. package/dist/render/primitives/shape.d.ts.map +1 -1
  79. package/dist/render/primitives/shape.js +58 -14
  80. package/dist/render/primitives/shape.js.map +1 -1
  81. package/dist/render/primitives/text.d.ts +35 -4
  82. package/dist/render/primitives/text.d.ts.map +1 -1
  83. package/dist/render/primitives/text.js +181 -9
  84. package/dist/render/primitives/text.js.map +1 -1
  85. package/dist/render/prop-allowlist.d.ts +10 -0
  86. package/dist/render/prop-allowlist.d.ts.map +1 -0
  87. package/dist/render/prop-allowlist.js +112 -0
  88. package/dist/render/prop-allowlist.js.map +1 -0
  89. package/dist/render/svg-path.d.ts +35 -0
  90. package/dist/render/svg-path.d.ts.map +1 -0
  91. package/dist/render/svg-path.js +211 -0
  92. package/dist/render/svg-path.js.map +1 -0
  93. package/dist/render/tree.d.ts.map +1 -1
  94. package/dist/render/tree.js +30 -5
  95. package/dist/render/tree.js.map +1 -1
  96. package/dist/{status-pill-DNHbHdag.js → status-pill-DIpXc5du.js} +2 -2
  97. package/dist/{status-pill-DNHbHdag.js.map → status-pill-DIpXc5du.js.map} +1 -1
  98. package/dist/{test-Dp0QrKYM.js → test-ByRec1kd.js} +4 -4
  99. package/dist/{test-Dp0QrKYM.js.map → test-ByRec1kd.js.map} +1 -1
  100. package/dist/tree-D5wYHpPu.js +1230 -0
  101. package/dist/tree-D5wYHpPu.js.map +1 -0
  102. package/dist/types.d.ts +26 -0
  103. package/dist/types.d.ts.map +1 -1
  104. package/package.json +5 -4
  105. package/src/animate/frame-coalescer.ts +63 -0
  106. package/src/animate/keyframes.ts +24 -5
  107. package/src/animate/transitions.ts +85 -3
  108. package/src/index.ts +24 -0
  109. package/src/mount.ts +12 -1
  110. package/src/render/bind-animate.tsx +370 -0
  111. package/src/render/bundle.ts +102 -10
  112. package/src/render/color-interp.ts +303 -0
  113. package/src/render/css-color.ts +145 -0
  114. package/src/render/diagnostics.ts +75 -0
  115. package/src/render/fill.tsx +85 -14
  116. package/src/render/filter-clamp.ts +99 -0
  117. package/src/render/keyframe-player.tsx +10 -2
  118. package/src/render/primitives/frame.tsx +53 -14
  119. package/src/render/primitives/image.tsx +8 -4
  120. package/src/render/primitives/index.ts +3 -0
  121. package/src/render/primitives/instance.tsx +14 -15
  122. package/src/render/primitives/shape.tsx +78 -14
  123. package/src/render/primitives/text.tsx +226 -9
  124. package/src/render/prop-allowlist.ts +119 -0
  125. package/src/render/svg-path.ts +215 -0
  126. package/src/render/tree.tsx +41 -6
  127. package/src/types.ts +27 -0
  128. package/dist/index-BFZXQAD7.js.map +0 -1
  129. package/dist/tree-x5Qd9Kq0.js +0 -508
  130. package/dist/tree-x5Qd9Kq0.js.map +0 -1
@@ -8,6 +8,8 @@ export interface SpringTransition {
8
8
  kind: "spring";
9
9
  stiffness?: number;
10
10
  damping?: number;
11
+ /** LSML 1.1 §6.2 — spring mass (kg). Default 1 (framer default). */
12
+ mass?: number;
11
13
  }
12
14
  export interface CrossfadeTransition {
13
15
  kind: "crossfade";
@@ -24,12 +26,42 @@ export interface FramerTransition {
24
26
  type?: "tween" | "spring";
25
27
  stiffness?: number;
26
28
  damping?: number;
29
+ mass?: number;
27
30
  }
28
31
  export declare function toFramer(t: Transition | undefined): FramerTransition;
29
32
  export interface MountPlay {
30
33
  initial: Record<string, number | string>;
31
34
  animate: Record<string, number | string>;
32
35
  }
36
+ /**
37
+ * Default mount-play timing — applies when a node carries an
38
+ * `animate_initial` (LSML 1.1 `animate.from`) but no per-prop
39
+ * `transitions` entry resolves for any animated key. The compiler
40
+ * documents that `from` without an explicit `transition` mount-plays
41
+ * "with the runtime's default timing" ; before this constant existed the
42
+ * fallback was `toFramer(undefined)` → `{ duration: 0 }`, which snapped
43
+ * the element straight to its settled state (the mount-play never
44
+ * visibly played). 400 ms ease-out matches the runtime's other implicit
45
+ * timings (crossfade fallback, scene-track fade).
46
+ */
47
+ export declare const DEFAULT_MOUNT_PLAY_TRANSITION: Transition;
48
+ /**
49
+ * Resolve the transition a primitive should hand framer-motion.
50
+ *
51
+ * `keys` are the primitive's native animated prop keys, scanned in
52
+ * order (e.g. `["opacity", "src"]` for Image). When the node also
53
+ * carries an `animate_initial`, the lookup widens to the keys the
54
+ * mount-play actually moves (`from.scale` may have lowered a `scale`
55
+ * transition that an opacity-only primitive would otherwise never look
56
+ * up), and — critically — falls back to
57
+ * `DEFAULT_MOUNT_PLAY_TRANSITION` instead of "no animation" : a
58
+ * mount-play must tween, never complete in zero frames.
59
+ *
60
+ * Without `animate_initial` the prior behaviour is preserved exactly :
61
+ * first declared transition among `keys`, else `undefined` (deltas
62
+ * snap unless a transition is declared).
63
+ */
64
+ export declare function resolveTransition(transitionFor: (key: string) => Transition | undefined, keys: string[], animateInitial?: Record<string, number | string>): Transition | undefined;
33
65
  /**
34
66
  * Build framer-motion `initial` / `animate` props for a primitive that
35
67
  * may carry an LSML 1.1 `animate.from` initial state.
@@ -46,7 +78,7 @@ export interface MountPlay {
46
78
  * doesn't already drive — so the mount-play plays out and settles
47
79
  * correctly even on opacity-only primitives.
48
80
  */
49
- export declare function mountPlay(base: Record<string, number | string>, initial: Record<string, number | string> | undefined): MountPlay;
81
+ export declare function mountPlay(base: Record<string, number | string>, initial: Record<string, number | string> | undefined, nodeId?: string): MountPlay;
50
82
  /**
51
83
  * Parse a wire-format `TransitionSpec` (LSDP/1.1 §3.2.2) into the
52
84
  * runtime's local Transition type. Returns `undefined` for malformed
@@ -1 +1 @@
1
- {"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/animate/transitions.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,CAAC;CAC7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAEjG,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAWD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,gBAAgB,CAsBpE;AAgBD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,GACnD,SAAS,CAcX;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAmB1E"}
1
+ {"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/animate/transitions.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,CAAC;CAC7D;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAEjG,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAWD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,gBAAgB,CAuBpE;AAsBD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,EAAE,UAI3C,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,EACtD,IAAI,EAAE,MAAM,EAAE,EACd,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAC/C,UAAU,GAAG,SAAS,CAaxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,EACpD,MAAM,CAAC,EAAE,MAAM,GACd,SAAS,CA6BX;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAqB1E"}
@@ -10,6 +10,7 @@
10
10
  // We deliberately animate only GPU-friendly properties (transform, opacity,
11
11
  // filter). Primitives enforce this at the DOM level by exposing those props as
12
12
  // motion-bindable values rather than raw CSS.
13
+ import { sanitizeCssFilterString, warnRejectedFilter } from "../render/filter-clamp";
13
14
  const NO_ANIMATION = { duration: 0 };
14
15
  const EASE_MAP = {
15
16
  linear: "linear",
@@ -32,6 +33,7 @@ export function toFramer(t) {
32
33
  type: "spring",
33
34
  ...(t.stiffness !== undefined ? { stiffness: t.stiffness } : {}),
34
35
  ...(t.damping !== undefined ? { damping: t.damping } : {}),
36
+ ...(t.mass !== undefined ? { mass: t.mass } : {}),
35
37
  };
36
38
  }
37
39
  // crossfade at the per-prop level degenerates into a tween on opacity.
@@ -49,10 +51,64 @@ export function toFramer(t) {
49
51
  const INITIAL_IDENTITY = {
50
52
  opacity: 1,
51
53
  scale: 1,
54
+ scaleX: 1,
55
+ scaleY: 1,
52
56
  rotate: 0,
53
57
  x: 0,
54
58
  y: 0,
59
+ // LSML §6.1 filter identity — both functions are always present so
60
+ // framer interpolates between structurally-identical filter lists
61
+ // (the compiler emits the same two-function form, clamped per R8).
62
+ filter: "blur(0px) brightness(1)",
55
63
  };
64
+ /**
65
+ * Default mount-play timing — applies when a node carries an
66
+ * `animate_initial` (LSML 1.1 `animate.from`) but no per-prop
67
+ * `transitions` entry resolves for any animated key. The compiler
68
+ * documents that `from` without an explicit `transition` mount-plays
69
+ * "with the runtime's default timing" ; before this constant existed the
70
+ * fallback was `toFramer(undefined)` → `{ duration: 0 }`, which snapped
71
+ * the element straight to its settled state (the mount-play never
72
+ * visibly played). 400 ms ease-out matches the runtime's other implicit
73
+ * timings (crossfade fallback, scene-track fade).
74
+ */
75
+ export const DEFAULT_MOUNT_PLAY_TRANSITION = {
76
+ kind: "tween",
77
+ duration_ms: 400,
78
+ ease: "cubic-out",
79
+ };
80
+ /**
81
+ * Resolve the transition a primitive should hand framer-motion.
82
+ *
83
+ * `keys` are the primitive's native animated prop keys, scanned in
84
+ * order (e.g. `["opacity", "src"]` for Image). When the node also
85
+ * carries an `animate_initial`, the lookup widens to the keys the
86
+ * mount-play actually moves (`from.scale` may have lowered a `scale`
87
+ * transition that an opacity-only primitive would otherwise never look
88
+ * up), and — critically — falls back to
89
+ * `DEFAULT_MOUNT_PLAY_TRANSITION` instead of "no animation" : a
90
+ * mount-play must tween, never complete in zero frames.
91
+ *
92
+ * Without `animate_initial` the prior behaviour is preserved exactly :
93
+ * first declared transition among `keys`, else `undefined` (deltas
94
+ * snap unless a transition is declared).
95
+ */
96
+ export function resolveTransition(transitionFor, keys, animateInitial) {
97
+ for (const key of keys) {
98
+ const t = transitionFor(key);
99
+ if (t !== undefined)
100
+ return t;
101
+ }
102
+ if (animateInitial && Object.keys(animateInitial).length > 0) {
103
+ for (const key of Object.keys(animateInitial)) {
104
+ const t = transitionFor(key);
105
+ if (t !== undefined)
106
+ return t;
107
+ }
108
+ return DEFAULT_MOUNT_PLAY_TRANSITION;
109
+ }
110
+ return undefined;
111
+ }
56
112
  /**
57
113
  * Build framer-motion `initial` / `animate` props for a primitive that
58
114
  * may carry an LSML 1.1 `animate.from` initial state.
@@ -69,20 +125,36 @@ const INITIAL_IDENTITY = {
69
125
  * doesn't already drive — so the mount-play plays out and settles
70
126
  * correctly even on opacity-only primitives.
71
127
  */
72
- export function mountPlay(base, initial) {
128
+ export function mountPlay(base, initial, nodeId) {
73
129
  if (!initial || Object.keys(initial).length === 0) {
74
130
  // No `from` → mount directly at target. Pinning `initial` to the
75
131
  // target (rather than letting framer infer from current style)
76
132
  // preserves the existing "no jump, no mount-play" behaviour.
77
133
  return { initial: base, animate: base };
78
134
  }
135
+ // R8 runtime half (ADR 001 §5.1, issue #42) — `animate_initial` may
136
+ // come from a hand-crafted bundle that never went through the
137
+ // compiler clamps. Re-gate the filter string ; rejected → drop the
138
+ // key (the element mounts at the identity filter instead).
139
+ let from = initial;
140
+ if (initial["filter"] !== undefined) {
141
+ const safe = sanitizeCssFilterString(initial["filter"]);
142
+ from = { ...initial };
143
+ if (safe === null) {
144
+ warnRejectedFilter("animate_initial.filter", nodeId);
145
+ delete from["filter"];
146
+ }
147
+ else {
148
+ from["filter"] = safe;
149
+ }
150
+ }
79
151
  const animate = { ...base };
80
- for (const key of Object.keys(initial)) {
152
+ for (const key of Object.keys(from)) {
81
153
  if (!(key in animate)) {
82
154
  animate[key] = INITIAL_IDENTITY[key] ?? 0;
83
155
  }
84
156
  }
85
- return { initial, animate };
157
+ return { initial: from, animate };
86
158
  }
87
159
  /**
88
160
  * Parse a wire-format `TransitionSpec` (LSDP/1.1 §3.2.2) into the
@@ -111,6 +183,9 @@ export function parseWireTransition(value) {
111
183
  out.stiffness = v.stiffness;
112
184
  if (typeof v.damping === "number")
113
185
  out.damping = v.damping;
186
+ // LSML §6.2 — mass rides the same wire spring shape.
187
+ if (typeof v.mass === "number")
188
+ out.mass = v.mass;
114
189
  return out;
115
190
  }
116
191
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../src/animate/transitions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../src/animate/transitions.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as t } from "react/jsx-runtime";
2
- import { T as e } from "./tree-x5Qd9Kq0.js";
3
- import { u as m } from "./index-BFZXQAD7.js";
2
+ import { T as e } from "./tree-D5wYHpPu.js";
3
+ import { u as m } from "./index-CyOlpZAL.js";
4
4
  function a() {
5
5
  const { store: o, bundle: r } = m();
6
6
  return /* @__PURE__ */ t(e, { node: r.root, store: o });
@@ -8,4 +8,4 @@ function a() {
8
8
  export {
9
9
  a as BroadcastMode
10
10
  };
11
- //# sourceMappingURL=broadcast-B82fQPph.js.map
11
+ //# sourceMappingURL=broadcast-3vYij4k-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast-B82fQPph.js","sources":["../src/modes/broadcast.tsx"],"sourcesContent":["import { Tree } from \"../render/tree\";\nimport { useLumencastRuntime } from \"../overlay/runtime-context\";\n\n/** Broadcast mode : pure scene render, no UI chrome. */\nexport function BroadcastMode() {\n const { store, bundle } = useLumencastRuntime();\n return <Tree node={bundle.root} store={store} />;\n}\n"],"names":["BroadcastMode","store","bundle","useLumencastRuntime","jsx","Tree"],"mappings":";;;AAIO,SAASA,IAAgB;AAC9B,QAAM,EAAE,OAAAC,GAAO,QAAAC,EAAA,IAAWC,EAAA;AAC1B,SAAO,gBAAAC,EAACC,GAAA,EAAK,MAAMH,EAAO,MAAM,OAAAD,GAAc;AAChD;"}
1
+ {"version":3,"file":"broadcast-3vYij4k-.js","sources":["../src/modes/broadcast.tsx"],"sourcesContent":["import { Tree } from \"../render/tree\";\nimport { useLumencastRuntime } from \"../overlay/runtime-context\";\n\n/** Broadcast mode : pure scene render, no UI chrome. */\nexport function BroadcastMode() {\n const { store, bundle } = useLumencastRuntime();\n return <Tree node={bundle.root} store={store} />;\n}\n"],"names":["BroadcastMode","store","bundle","useLumencastRuntime","jsx","Tree"],"mappings":";;;AAIO,SAASA,IAAgB;AAC9B,QAAM,EAAE,OAAAC,GAAO,QAAAC,EAAA,IAAWC,EAAA;AAC1B,SAAO,gBAAAC,EAACC,GAAA,EAAK,MAAMH,EAAO,MAAM,OAAAD,GAAc;AAChD;"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs as e, Fragment as n, jsx as o } from "react/jsx-runtime";
2
- import { T as s } from "./tree-x5Qd9Kq0.js";
3
- import { S as m, C as a } from "./status-pill-DNHbHdag.js";
4
- import { u as i } from "./index-BFZXQAD7.js";
2
+ import { T as s } from "./tree-D5wYHpPu.js";
3
+ import { S as m, C as a } from "./status-pill-DIpXc5du.js";
4
+ import { u as i } from "./index-CyOlpZAL.js";
5
5
  function c() {
6
6
  const { store: r, bundle: t } = i();
7
7
  return /* @__PURE__ */ e(n, { children: [
@@ -13,4 +13,4 @@ function c() {
13
13
  export {
14
14
  c as ControlMode
15
15
  };
16
- //# sourceMappingURL=control-DIfwMYRb.js.map
16
+ //# sourceMappingURL=control-BFNkY7-6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-DIfwMYRb.js","sources":["../src/modes/control.tsx"],"sourcesContent":["import { Tree } from \"../render/tree\";\nimport { ControlPanel } from \"../overlay/control\";\nimport { StatusPill } from \"../overlay/status-pill\";\nimport { useLumencastRuntime } from \"../overlay/runtime-context\";\n\n/** Control mode : scene + operator overlay (status pill + fields\n * panel from operator_inputs). */\nexport function ControlMode() {\n const { store, bundle } = useLumencastRuntime();\n return (\n <>\n <Tree node={bundle.root} store={store} />\n <StatusPill />\n <ControlPanel />\n </>\n );\n}\n"],"names":["ControlMode","store","bundle","useLumencastRuntime","jsxs","Fragment","jsx","Tree","StatusPill","ControlPanel"],"mappings":";;;;AAOO,SAASA,IAAc;AAC5B,QAAM,EAAE,OAAAC,GAAO,QAAAC,EAAA,IAAWC,EAAA;AAC1B,SACE,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAK,MAAML,EAAO,MAAM,OAAAD,GAAc;AAAA,sBACtCO,GAAA,EAAW;AAAA,sBACXC,GAAA,CAAA,CAAa;AAAA,EAAA,GAChB;AAEJ;"}
1
+ {"version":3,"file":"control-BFNkY7-6.js","sources":["../src/modes/control.tsx"],"sourcesContent":["import { Tree } from \"../render/tree\";\nimport { ControlPanel } from \"../overlay/control\";\nimport { StatusPill } from \"../overlay/status-pill\";\nimport { useLumencastRuntime } from \"../overlay/runtime-context\";\n\n/** Control mode : scene + operator overlay (status pill + fields\n * panel from operator_inputs). */\nexport function ControlMode() {\n const { store, bundle } = useLumencastRuntime();\n return (\n <>\n <Tree node={bundle.root} store={store} />\n <StatusPill />\n <ControlPanel />\n </>\n );\n}\n"],"names":["ControlMode","store","bundle","useLumencastRuntime","jsxs","Fragment","jsx","Tree","StatusPill","ControlPanel"],"mappings":";;;;AAOO,SAASA,IAAc;AAC5B,QAAM,EAAE,OAAAC,GAAO,QAAAC,EAAA,IAAWC,EAAA;AAC1B,SACE,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAK,MAAML,EAAO,MAAM,OAAAD,GAAc;AAAA,sBACtCO,GAAA,EAAW;AAAA,sBACXC,GAAA,CAAA,CAAa;AAAA,EAAA,GAChB;AAEJ;"}