@lumencast/runtime 0.1.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 (204) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +79 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/animate/crossfade.d.ts +13 -0
  5. package/dist/animate/crossfade.d.ts.map +1 -0
  6. package/dist/animate/crossfade.js +10 -0
  7. package/dist/animate/crossfade.js.map +1 -0
  8. package/dist/animate/keyframes.d.ts +42 -0
  9. package/dist/animate/keyframes.d.ts.map +1 -0
  10. package/dist/animate/keyframes.js +94 -0
  11. package/dist/animate/keyframes.js.map +1 -0
  12. package/dist/animate/transitions.d.ts +38 -0
  13. package/dist/animate/transitions.d.ts.map +1 -0
  14. package/dist/animate/transitions.js +81 -0
  15. package/dist/animate/transitions.js.map +1 -0
  16. package/dist/app.d.ts +16 -0
  17. package/dist/app.d.ts.map +1 -0
  18. package/dist/app.js +35 -0
  19. package/dist/app.js.map +1 -0
  20. package/dist/broadcast-BqOhSNsY.js +11 -0
  21. package/dist/broadcast-BqOhSNsY.js.map +1 -0
  22. package/dist/control-CRFn328D.js +16 -0
  23. package/dist/control-CRFn328D.js.map +1 -0
  24. package/dist/dev-entry.d.ts +2 -0
  25. package/dist/dev-entry.d.ts.map +1 -0
  26. package/dist/dev-entry.js +31 -0
  27. package/dist/dev-entry.js.map +1 -0
  28. package/dist/index-DUhPPRvw.js +583 -0
  29. package/dist/index-DUhPPRvw.js.map +1 -0
  30. package/dist/index.d.ts +4 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.html +46 -0
  33. package/dist/index.js +3 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/internal/validate-options.d.ts +5 -0
  36. package/dist/internal/validate-options.d.ts.map +1 -0
  37. package/dist/internal/validate-options.js +19 -0
  38. package/dist/internal/validate-options.js.map +1 -0
  39. package/dist/lumencast.js +5 -0
  40. package/dist/lumencast.js.map +1 -0
  41. package/dist/modes/broadcast.d.ts +3 -0
  42. package/dist/modes/broadcast.d.ts.map +1 -0
  43. package/dist/modes/broadcast.js +9 -0
  44. package/dist/modes/broadcast.js.map +1 -0
  45. package/dist/modes/control.d.ts +4 -0
  46. package/dist/modes/control.d.ts.map +1 -0
  47. package/dist/modes/control.js +12 -0
  48. package/dist/modes/control.js.map +1 -0
  49. package/dist/modes/test.d.ts +4 -0
  50. package/dist/modes/test.d.ts.map +1 -0
  51. package/dist/modes/test.js +13 -0
  52. package/dist/modes/test.js.map +1 -0
  53. package/dist/mount.d.ts +3 -0
  54. package/dist/mount.d.ts.map +1 -0
  55. package/dist/mount.js +144 -0
  56. package/dist/mount.js.map +1 -0
  57. package/dist/overlay/control.d.ts +2 -0
  58. package/dist/overlay/control.d.ts.map +1 -0
  59. package/dist/overlay/control.js +127 -0
  60. package/dist/overlay/control.js.map +1 -0
  61. package/dist/overlay/runtime-context.d.ts +20 -0
  62. package/dist/overlay/runtime-context.d.ts.map +1 -0
  63. package/dist/overlay/runtime-context.js +14 -0
  64. package/dist/overlay/runtime-context.js.map +1 -0
  65. package/dist/overlay/status-pill.d.ts +2 -0
  66. package/dist/overlay/status-pill.d.ts.map +1 -0
  67. package/dist/overlay/status-pill.js +29 -0
  68. package/dist/overlay/status-pill.js.map +1 -0
  69. package/dist/overlay/test.d.ts +5 -0
  70. package/dist/overlay/test.d.ts.map +1 -0
  71. package/dist/overlay/test.js +116 -0
  72. package/dist/overlay/test.js.map +1 -0
  73. package/dist/render/bundle.d.ts +102 -0
  74. package/dist/render/bundle.d.ts.map +1 -0
  75. package/dist/render/bundle.js +86 -0
  76. package/dist/render/bundle.js.map +1 -0
  77. package/dist/render/fill.d.ts +41 -0
  78. package/dist/render/fill.d.ts.map +1 -0
  79. package/dist/render/fill.js +95 -0
  80. package/dist/render/fill.js.map +1 -0
  81. package/dist/render/keyframe-player.d.ts +10 -0
  82. package/dist/render/keyframe-player.d.ts.map +1 -0
  83. package/dist/render/keyframe-player.js +65 -0
  84. package/dist/render/keyframe-player.js.map +1 -0
  85. package/dist/render/primitives/frame.d.ts +12 -0
  86. package/dist/render/primitives/frame.d.ts.map +1 -0
  87. package/dist/render/primitives/frame.js +65 -0
  88. package/dist/render/primitives/frame.js.map +1 -0
  89. package/dist/render/primitives/grid.d.ts +4 -0
  90. package/dist/render/primitives/grid.d.ts.map +1 -0
  91. package/dist/render/primitives/grid.js +14 -0
  92. package/dist/render/primitives/grid.js.map +1 -0
  93. package/dist/render/primitives/image.d.ts +5 -0
  94. package/dist/render/primitives/image.d.ts.map +1 -0
  95. package/dist/render/primitives/image.js +25 -0
  96. package/dist/render/primitives/image.js.map +1 -0
  97. package/dist/render/primitives/index.d.ts +10 -0
  98. package/dist/render/primitives/index.d.ts.map +1 -0
  99. package/dist/render/primitives/index.js +22 -0
  100. package/dist/render/primitives/index.js.map +1 -0
  101. package/dist/render/primitives/instance.d.ts +4 -0
  102. package/dist/render/primitives/instance.d.ts.map +1 -0
  103. package/dist/render/primitives/instance.js +35 -0
  104. package/dist/render/primitives/instance.js.map +1 -0
  105. package/dist/render/primitives/media.d.ts +6 -0
  106. package/dist/render/primitives/media.d.ts.map +1 -0
  107. package/dist/render/primitives/media.js +19 -0
  108. package/dist/render/primitives/media.js.map +1 -0
  109. package/dist/render/primitives/shape.d.ts +12 -0
  110. package/dist/render/primitives/shape.d.ts.map +1 -0
  111. package/dist/render/primitives/shape.js +66 -0
  112. package/dist/render/primitives/shape.js.map +1 -0
  113. package/dist/render/primitives/stack.d.ts +13 -0
  114. package/dist/render/primitives/stack.d.ts.map +1 -0
  115. package/dist/render/primitives/stack.js +45 -0
  116. package/dist/render/primitives/stack.js.map +1 -0
  117. package/dist/render/primitives/text.d.ts +6 -0
  118. package/dist/render/primitives/text.d.ts.map +1 -0
  119. package/dist/render/primitives/text.js +27 -0
  120. package/dist/render/primitives/text.js.map +1 -0
  121. package/dist/render/scope.d.ts +10 -0
  122. package/dist/render/scope.d.ts.map +1 -0
  123. package/dist/render/scope.js +27 -0
  124. package/dist/render/scope.js.map +1 -0
  125. package/dist/render/stagger-context.d.ts +9 -0
  126. package/dist/render/stagger-context.d.ts.map +1 -0
  127. package/dist/render/stagger-context.js +22 -0
  128. package/dist/render/stagger-context.js.map +1 -0
  129. package/dist/render/tree.d.ts +9 -0
  130. package/dist/render/tree.d.ts.map +1 -0
  131. package/dist/render/tree.js +139 -0
  132. package/dist/render/tree.js.map +1 -0
  133. package/dist/render/universal-wrapper.d.ts +16 -0
  134. package/dist/render/universal-wrapper.d.ts.map +1 -0
  135. package/dist/render/universal-wrapper.js +58 -0
  136. package/dist/render/universal-wrapper.js.map +1 -0
  137. package/dist/state/apply-delta.d.ts +11 -0
  138. package/dist/state/apply-delta.d.ts.map +1 -0
  139. package/dist/state/apply-delta.js +23 -0
  140. package/dist/state/apply-delta.js.map +1 -0
  141. package/dist/state/apply-snapshot.d.ts +6 -0
  142. package/dist/state/apply-snapshot.d.ts.map +1 -0
  143. package/dist/state/apply-snapshot.js +6 -0
  144. package/dist/state/apply-snapshot.js.map +1 -0
  145. package/dist/state/store.d.ts +28 -0
  146. package/dist/state/store.d.ts.map +1 -0
  147. package/dist/state/store.js +119 -0
  148. package/dist/state/store.js.map +1 -0
  149. package/dist/status-pill-DCHvrd_y.js +241 -0
  150. package/dist/status-pill-DCHvrd_y.js.map +1 -0
  151. package/dist/test-DBCtwx_I.js +210 -0
  152. package/dist/test-DBCtwx_I.js.map +1 -0
  153. package/dist/transport/reconnect.d.ts +22 -0
  154. package/dist/transport/reconnect.d.ts.map +1 -0
  155. package/dist/transport/reconnect.js +60 -0
  156. package/dist/transport/reconnect.js.map +1 -0
  157. package/dist/transport/ws.d.ts +66 -0
  158. package/dist/transport/ws.d.ts.map +1 -0
  159. package/dist/transport/ws.js +270 -0
  160. package/dist/transport/ws.js.map +1 -0
  161. package/dist/tree-CnhX02kd.js +494 -0
  162. package/dist/tree-CnhX02kd.js.map +1 -0
  163. package/dist/types.d.ts +38 -0
  164. package/dist/types.d.ts.map +1 -0
  165. package/dist/types.js +3 -0
  166. package/dist/types.js.map +1 -0
  167. package/package.json +64 -0
  168. package/src/animate/crossfade.tsx +31 -0
  169. package/src/animate/keyframes.ts +142 -0
  170. package/src/animate/transitions.ts +116 -0
  171. package/src/app.tsx +84 -0
  172. package/src/dev-entry.tsx +38 -0
  173. package/src/index.ts +24 -0
  174. package/src/internal/validate-options.ts +20 -0
  175. package/src/modes/broadcast.tsx +8 -0
  176. package/src/modes/control.tsx +17 -0
  177. package/src/modes/test.tsx +19 -0
  178. package/src/mount.ts +169 -0
  179. package/src/overlay/control.tsx +239 -0
  180. package/src/overlay/runtime-context.tsx +37 -0
  181. package/src/overlay/status-pill.tsx +37 -0
  182. package/src/overlay/test.tsx +213 -0
  183. package/src/render/bundle.ts +208 -0
  184. package/src/render/fill.tsx +163 -0
  185. package/src/render/keyframe-player.tsx +89 -0
  186. package/src/render/primitives/frame.tsx +78 -0
  187. package/src/render/primitives/grid.tsx +20 -0
  188. package/src/render/primitives/image.tsx +35 -0
  189. package/src/render/primitives/index.ts +35 -0
  190. package/src/render/primitives/instance.tsx +70 -0
  191. package/src/render/primitives/media.tsx +28 -0
  192. package/src/render/primitives/shape.tsx +135 -0
  193. package/src/render/primitives/stack.tsx +48 -0
  194. package/src/render/primitives/text.tsx +38 -0
  195. package/src/render/scope.tsx +27 -0
  196. package/src/render/stagger-context.tsx +24 -0
  197. package/src/render/tree.tsx +182 -0
  198. package/src/render/universal-wrapper.tsx +95 -0
  199. package/src/state/apply-delta.ts +24 -0
  200. package/src/state/apply-snapshot.ts +8 -0
  201. package/src/state/store.ts +141 -0
  202. package/src/transport/reconnect.ts +83 -0
  203. package/src/transport/ws.ts +359 -0
  204. package/src/types.ts +54 -0
@@ -0,0 +1,95 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ let gradientIdSeq = 0;
3
+ function nextGradientId() {
4
+ gradientIdSeq = (gradientIdSeq + 1) % 1_000_000;
5
+ return `lumen-grad-${gradientIdSeq.toString(36)}`;
6
+ }
7
+ /** Compile a Fill into an SVG `<defs>` entry + a `fill="url(#…)"` ref.
8
+ * Solid fills produce no defs and return the colour directly. */
9
+ export function renderFill(fill) {
10
+ if (fill.kind === "solid") {
11
+ // Solid fill — no defs needed, just hand the colour to fill.
12
+ // SVG fill-opacity composes with element opacity multiplicatively
13
+ // so we apply both consistently.
14
+ return { defs: [], ref: fill.color };
15
+ }
16
+ const id = nextGradientId();
17
+ if (fill.kind === "linear-gradient") {
18
+ // angle_deg : 0 = bottom-to-top per §4.12 (matches CSS `linear-gradient`)
19
+ const angle = fill.angle_deg ?? 0;
20
+ // Translate angle (degrees from up) to SVG x1/y1/x2/y2 in user space.
21
+ const rad = ((angle - 90) * Math.PI) / 180; // 0° → x1=0,y1=1 (bottom-up)
22
+ const x1 = 0.5 - 0.5 * Math.cos(rad);
23
+ const y1 = 0.5 - 0.5 * Math.sin(rad);
24
+ const x2 = 0.5 + 0.5 * Math.cos(rad);
25
+ const y2 = 0.5 + 0.5 * Math.sin(rad);
26
+ const defs = [
27
+ _jsx("linearGradient", { id: id, x1: `${x1 * 100}%`, y1: `${y1 * 100}%`, x2: `${x2 * 100}%`, y2: `${y2 * 100}%`, children: fill.stops.map((s, i) => (_jsx("stop", { offset: s.offset, stopColor: s.color, ...(s.opacity !== undefined ? { stopOpacity: s.opacity } : {}) }, i))) }, id),
28
+ ];
29
+ return { defs, ref: `url(#${id})` };
30
+ }
31
+ // radial-gradient
32
+ const cx = fill.center?.x ?? 0.5;
33
+ const cy = fill.center?.y ?? 0.5;
34
+ const r = fill.radius ?? 0.5;
35
+ const defs = [
36
+ _jsx("radialGradient", { id: id, cx: `${cx * 100}%`, cy: `${cy * 100}%`, r: `${r * 100}%`, children: fill.stops.map((s, i) => (_jsx("stop", { offset: s.offset, stopColor: s.color, ...(s.opacity !== undefined ? { stopOpacity: s.opacity } : {}) }, i))) }, id),
37
+ ];
38
+ return { defs, ref: `url(#${id})` };
39
+ }
40
+ /** Compile an array of Fill into a CSS `background-image` value usable
41
+ * on a `<div>` (frame backgrounds — non-SVG context). Returns the CSS
42
+ * string + opacity. Stops use percentages in CSS gradient syntax. */
43
+ export function backgroundsToCss(fills) {
44
+ // Per §4.12, fills[0] renders on top — CSS background-image stacks
45
+ // first → top-most. Match by passing in the same order.
46
+ const layers = fills.map(fillToCss).filter(Boolean);
47
+ if (layers.length === 0)
48
+ return {};
49
+ return { backgroundImage: layers.join(", ") };
50
+ }
51
+ function fillToCss(fill) {
52
+ if (fill.kind === "solid") {
53
+ // Wrap solid in linear-gradient so it can stack with other layers.
54
+ return `linear-gradient(${fill.color}, ${fill.color})`;
55
+ }
56
+ const stops = fill.stops
57
+ .map((s) => {
58
+ const c = s.opacity !== undefined ? cssWithOpacity(s.color, s.opacity) : s.color;
59
+ return `${c} ${(s.offset * 100).toFixed(2)}%`;
60
+ })
61
+ .join(", ");
62
+ if (fill.kind === "linear-gradient") {
63
+ const angle = fill.angle_deg ?? 0;
64
+ return `linear-gradient(${angle}deg, ${stops})`;
65
+ }
66
+ // radial-gradient
67
+ const cx = (fill.center?.x ?? 0.5) * 100;
68
+ const cy = (fill.center?.y ?? 0.5) * 100;
69
+ return `radial-gradient(circle at ${cx}% ${cy}%, ${stops})`;
70
+ }
71
+ function cssWithOpacity(color, opacity) {
72
+ // Best-effort wrapper — for hex/rgb we can append alpha. For
73
+ // unrecognised forms, fall back to color-mix.
74
+ const hex = color.match(/^#([0-9a-f]{6})$/i);
75
+ if (hex) {
76
+ const a = Math.round(opacity * 255)
77
+ .toString(16)
78
+ .padStart(2, "0");
79
+ return `#${hex[1]}${a}`;
80
+ }
81
+ return `color-mix(in srgb, ${color} ${opacity * 100}%, transparent)`;
82
+ }
83
+ /** Coerce loose JSON into a Fill array. Returns [] for non-arrays. */
84
+ export function parseFills(value) {
85
+ if (!Array.isArray(value))
86
+ return [];
87
+ return value.filter(isFill);
88
+ }
89
+ function isFill(v) {
90
+ if (typeof v !== "object" || v === null)
91
+ return false;
92
+ const k = v.kind;
93
+ return k === "solid" || k === "linear-gradient" || k === "radial-gradient";
94
+ }
95
+ //# sourceMappingURL=fill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fill.js","sourceRoot":"","sources":["../../src/render/fill.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ReactNode } from "react";
2
+ import type { Store } from "../state/store";
3
+ import { type Keyframes } from "../animate/keyframes";
4
+ export interface KeyframePlayerProps {
5
+ keyframes: Keyframes;
6
+ store: Store;
7
+ children: ReactNode;
8
+ }
9
+ export declare function KeyframePlayer({ keyframes, store, children }: KeyframePlayerProps): ReactNode;
10
+ //# sourceMappingURL=keyframe-player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyframe-player.d.ts","sourceRoot":"","sources":["../../src/render/keyframe-player.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIxE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,mBAAmB,GAAG,SAAS,CAwC7F"}
@@ -0,0 +1,65 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // LSML 1.1 §6.6 — keyframe sequence playback wrapper.
3
+ //
4
+ // Wraps a primitive subtree in a framer-motion `motion.div` that plays
5
+ // out the compiled keyframe arrays once on (re)mount, or whenever the
6
+ // bound `key` LeafPath changes. We trigger replay via React's `key=`
7
+ // reconciliation — bumping a counter when the keyframe key value flips
8
+ // remounts the motion subtree, restarting the animation from `at: 0`.
9
+ //
10
+ // LSML 1.1 §6.7 — when this player runs inside a `repeat` iteration, a
11
+ // `staggerDelay` (ms) is provided through `StaggerContext` and added to
12
+ // framer's transition.delay so each iteration starts `index * stagger_ms`
13
+ // after the previous one.
14
+ import { motion } from "framer-motion";
15
+ import { useContext, useEffect, useRef } from "react";
16
+ import { useSignals } from "@preact/signals-react/runtime";
17
+ import { compileForFramer } from "../animate/keyframes";
18
+ import { StaggerContext } from "./stagger-context";
19
+ import { scopedPath, usePathScope } from "./scope";
20
+ export function KeyframePlayer({ keyframes, store, children }) {
21
+ useSignals();
22
+ const scope = usePathScope();
23
+ const staggerDelayMs = useContext(StaggerContext);
24
+ // Pull the latest `key` LeafPath value and remount whenever it
25
+ // changes. We track via a ref + counter so React's reconciliation
26
+ // gives us a fresh motion.div (and thus a fresh animation pass).
27
+ const lastKeyValue = useRef(undefined);
28
+ const replayTokenRef = useRef(0);
29
+ if (keyframes.key !== undefined) {
30
+ const v = store.signal(scopedPath(scope, keyframes.key)).value;
31
+ if (lastKeyValue.current !== v) {
32
+ lastKeyValue.current = v;
33
+ replayTokenRef.current += 1;
34
+ }
35
+ }
36
+ const compiled = compileForFramer(keyframes);
37
+ if (!compiled) {
38
+ return _jsx(_Fragment, { children: children });
39
+ }
40
+ const transition = staggerDelayMs > 0
41
+ ? { ...compiled.transition, delay: staggerDelayMs / 1000 }
42
+ : compiled.transition;
43
+ return (_jsxs(motion.div, { style: { display: "contents" }, initial: firstFrame(compiled.animate), animate: compiled.animate, transition: transition, children: [_jsx(ReplayOnMount, {}), children] }, replayTokenRef.current));
44
+ }
45
+ /** No-op effect placeholder — kept for symmetry / future hooks like
46
+ * reporting playback completion to the renderer. */
47
+ function ReplayOnMount() {
48
+ useEffect(() => {
49
+ // intentional no-op
50
+ }, []);
51
+ return null;
52
+ }
53
+ /** Pluck the `at: 0` waypoint values into a framer-motion `initial` prop
54
+ * so the very first frame matches the start of the keyframe path. Without
55
+ * this, framer interpolates from the element's current style which can
56
+ * produce a visible jump on mount. */
57
+ function firstFrame(animate) {
58
+ const out = {};
59
+ for (const [k, arr] of Object.entries(animate)) {
60
+ if (arr.length > 0)
61
+ out[k] = arr[0];
62
+ }
63
+ return out;
64
+ }
65
+ //# sourceMappingURL=keyframe-player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyframe-player.js","sourceRoot":"","sources":["../../src/render/keyframe-player.tsx"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,qEAAqE;AACrE,uEAAuE;AACvE,sEAAsE;AACtE,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,0EAA0E;AAC1E,0BAA0B;AAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAkB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAQnD,MAAM,UAAU,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAuB;IAChF,UAAU,EAAE,CAAC;IACb,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAElD,+DAA+D;IAC/D,kEAAkE;IAClE,iEAAiE;IACjE,MAAM,YAAY,GAAG,MAAM,CAAU,SAAS,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,IAAI,YAAY,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YAC/B,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;YACzB,cAAc,CAAC,OAAO,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,4BAAG,QAAQ,GAAI,CAAC;IACzB,CAAC;IAED,MAAM,UAAU,GACd,cAAc,GAAG,CAAC;QAChB,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,EAAE;QAC1D,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;IAE1B,OAAO,CACL,MAAC,MAAM,CAAC,GAAG,IAET,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAC9B,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EACrC,OAAO,EAAE,QAAQ,CAAC,OAAO,EACzB,UAAU,EAAE,UAAU,aAEtB,KAAC,aAAa,KAAG,EAChB,QAAQ,KAPJ,cAAc,CAAC,OAAO,CAQhB,CACd,CAAC;AACJ,CAAC;AAED;qDACqD;AACrD,SAAS,aAAa;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,oBAAoB;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;uCAGuC;AACvC,SAAS,UAAU,CAAC,OAA4C;IAC9D,MAAM,GAAG,GAAoC,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { PrimitiveProps } from "./index";
2
+ /** Absolute-positioned container with size + transform + opacity.
3
+ * Animatable on `transform` and `opacity` only — width/height/position
4
+ * changes are intentionally *not* animatable to keep the broadcast
5
+ * off the layout path.
6
+ *
7
+ * LSML 1.1 §4.3 + §4.12 add `backgrounds[]` as an alternative to the
8
+ * legacy `background` (single color). The array form supports stacked
9
+ * fills with linear / radial gradients ; first entry renders on top.
10
+ */
11
+ export declare function Frame({ resolved, transitionFor, children }: PrimitiveProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/frame.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAoD1E"}
@@ -0,0 +1,65 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { motion } from "framer-motion";
3
+ import { toFramer } from "../../animate/transitions";
4
+ import { backgroundsToCss, parseFills } from "../fill";
5
+ /** Absolute-positioned container with size + transform + opacity.
6
+ * Animatable on `transform` and `opacity` only — width/height/position
7
+ * changes are intentionally *not* animatable to keep the broadcast
8
+ * off the layout path.
9
+ *
10
+ * LSML 1.1 §4.3 + §4.12 add `backgrounds[]` as an alternative to the
11
+ * legacy `background` (single color). The array form supports stacked
12
+ * fills with linear / radial gradients ; first entry renders on top.
13
+ */
14
+ export function Frame({ resolved, transitionFor, children }) {
15
+ const x = numberOr(resolved.x, 0);
16
+ const y = numberOr(resolved.y, 0);
17
+ const width = sizeProp(resolved.width);
18
+ const height = sizeProp(resolved.height);
19
+ const opacity = numberOr(resolved.opacity, 1);
20
+ const scale = numberOr(resolved.scale, 1);
21
+ const rotate = numberOr(resolved.rotate, 0);
22
+ // 1.0 single-fill prop — used as fallback when 1.1 `backgrounds[]`
23
+ // is empty.
24
+ const legacyBackground = resolved.background ?? undefined;
25
+ const backgrounds = parseFills(resolved.backgrounds);
26
+ // Pick the most expressive declared transition among the animated
27
+ // bindings (transform / opacity). If none, no animation.
28
+ const tx = transitionFor("opacity") ??
29
+ transitionFor("scale") ??
30
+ transitionFor("rotate") ??
31
+ transitionFor("x") ??
32
+ transitionFor("y");
33
+ const style = {
34
+ position: "absolute",
35
+ left: 0,
36
+ top: 0,
37
+ width,
38
+ height,
39
+ willChange: "transform, opacity",
40
+ };
41
+ if (backgrounds.length > 0) {
42
+ Object.assign(style, backgroundsToCss(backgrounds));
43
+ }
44
+ else if (legacyBackground !== undefined) {
45
+ style.background = legacyBackground;
46
+ }
47
+ return (_jsx(motion.div, { style: style, animate: {
48
+ opacity,
49
+ x,
50
+ y,
51
+ scale,
52
+ rotate,
53
+ }, transition: toFramer(tx), children: children }));
54
+ }
55
+ function numberOr(v, fallback) {
56
+ return typeof v === "number" && Number.isFinite(v) ? v : fallback;
57
+ }
58
+ function sizeProp(v) {
59
+ if (typeof v === "number" && Number.isFinite(v))
60
+ return v;
61
+ if (typeof v === "string" && v.length > 0)
62
+ return v;
63
+ return undefined;
64
+ }
65
+ //# sourceMappingURL=frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../src/render/primitives/frame.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGvC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAkB;IACzE,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE5C,mEAAmE;IACnE,YAAY;IACZ,MAAM,gBAAgB,GAAI,QAAQ,CAAC,UAAiC,IAAI,SAAS,CAAC;IAClF,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAErD,kEAAkE;IAClE,yDAAyD;IACzD,MAAM,EAAE,GACN,aAAa,CAAC,SAAS,CAAC;QACxB,aAAa,CAAC,OAAO,CAAC;QACtB,aAAa,CAAC,QAAQ,CAAC;QACvB,aAAa,CAAC,GAAG,CAAC;QAClB,aAAa,CAAC,GAAG,CAAC,CAAC;IAErB,MAAM,KAAK,GAAkB;QAC3B,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,CAAC;QACP,GAAG,EAAE,CAAC;QACN,KAAK;QACL,MAAM;QACN,UAAU,EAAE,oBAAoB;KACjC,CAAC;IACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC1C,KAAK,CAAC,UAAU,GAAG,gBAAgB,CAAC;IACtC,CAAC;IAED,OAAO,CACL,KAAC,MAAM,CAAC,GAAG,IACT,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE;YACP,OAAO;YACP,CAAC;YACD,CAAC;YACD,KAAK;YACL,MAAM;SACP,EACD,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,YAEvB,QAAQ,GACE,CACd,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU,EAAE,QAAgB;IAC5C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpE,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PrimitiveProps } from "./index";
2
+ /** CSS Grid container with declared rows / cols. */
3
+ export declare function Grid({ resolved, children }: PrimitiveProps): import("react/jsx-runtime").JSX.Element;
4
+ //# sourceMappingURL=grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,oDAAoD;AACpD,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAgB1D"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** CSS Grid container with declared rows / cols. */
3
+ export function Grid({ resolved, children }) {
4
+ const cols = resolved.cols ?? "1fr";
5
+ const rows = resolved.rows ?? "auto";
6
+ const gap = resolved.gap ?? 0;
7
+ return (_jsx("div", { style: {
8
+ display: "grid",
9
+ gridTemplateColumns: cols,
10
+ gridTemplateRows: rows,
11
+ gap,
12
+ }, children: children }));
13
+ }
14
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sourceRoot":"","sources":["../../../src/render/primitives/grid.tsx"],"names":[],"mappings":";AAEA,oDAAoD;AACpD,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAkB;IACzD,MAAM,IAAI,GAAI,QAAQ,CAAC,IAAe,IAAI,KAAK,CAAC;IAChD,MAAM,IAAI,GAAI,QAAQ,CAAC,IAAe,IAAI,MAAM,CAAC;IACjD,MAAM,GAAG,GAAI,QAAQ,CAAC,GAAmC,IAAI,CAAC,CAAC;IAC/D,OAAO,CACL,cACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,mBAAmB,EAAE,IAAI;YACzB,gBAAgB,EAAE,IAAI;YACtB,GAAG;SACJ,YAEA,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { PrimitiveProps } from "./index";
2
+ /** Image leaf. `src`, `fit` (cover/contain/fill), `position`,
3
+ * `opacity`. Opacity is animated when a transition is declared. */
4
+ export declare function Image({ resolved, transitionFor }: PrimitiveProps): import("react/jsx-runtime").JSX.Element | null;
5
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/image.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C;oEACoE;AACpE,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,cAAc,kDAwBhE"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { motion } from "framer-motion";
3
+ import { toFramer } from "../../animate/transitions";
4
+ /** Image leaf. `src`, `fit` (cover/contain/fill), `position`,
5
+ * `opacity`. Opacity is animated when a transition is declared. */
6
+ export function Image({ resolved, transitionFor }) {
7
+ const src = resolved.src;
8
+ if (!src)
9
+ return null;
10
+ const fit = resolved.fit ?? "contain";
11
+ const position = resolved.position ?? "center";
12
+ const opacity = numberOr(resolved.opacity, 1);
13
+ const tx = transitionFor("opacity") ?? transitionFor("src");
14
+ return (_jsx(motion.img, { src: src, style: {
15
+ objectFit: fit,
16
+ objectPosition: position,
17
+ width: "100%",
18
+ height: "100%",
19
+ willChange: "opacity",
20
+ }, animate: { opacity }, transition: toFramer(tx), draggable: false }));
21
+ }
22
+ function numberOr(v, fallback) {
23
+ return typeof v === "number" && Number.isFinite(v) ? v : fallback;
24
+ }
25
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../../src/render/primitives/image.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD;oEACoE;AACpE,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAkB;IAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAyB,CAAC;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,GAAG,GAAI,QAAQ,CAAC,GAA0B,IAAI,SAAS,CAAC;IAC9D,MAAM,QAAQ,GAAI,QAAQ,CAAC,QAA+B,IAAI,QAAQ,CAAC;IACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAE9C,MAAM,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;IAE5D,OAAO,CACL,KAAC,MAAM,CAAC,GAAG,IACT,GAAG,EAAE,GAAG,EACR,KAAK,EAAE;YACL,SAAS,EAAE,GAAuC;YAClD,cAAc,EAAE,QAAQ;YACxB,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,SAAS;SACtB,EACD,OAAO,EAAE,EAAE,OAAO,EAAE,EACpB,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,EACxB,SAAS,EAAE,KAAK,GAChB,CACH,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU,EAAE,QAAgB;IAC5C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ import type { RenderKind } from "../bundle";
3
+ import type { Transition } from "../../animate/transitions";
4
+ export interface PrimitiveProps {
5
+ resolved: Record<string, unknown>;
6
+ transitionFor: (key: string) => Transition | undefined;
7
+ children?: ReactNode;
8
+ }
9
+ export declare const PRIMITIVES: Partial<Record<RenderKind, ComponentType<PrimitiveProps>>>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAa5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC,CASjF,CAAC"}
@@ -0,0 +1,22 @@
1
+ // Primitive component registry. Tree dispatch uses this map to look
2
+ // up the React component for each `kind` ; user components are inlined
3
+ // at compile time so Lumencast's runtime never sees them.
4
+ import { Stack } from "./stack";
5
+ import { Grid } from "./grid";
6
+ import { Frame } from "./frame";
7
+ import { Text } from "./text";
8
+ import { Image } from "./image";
9
+ import { Shape } from "./shape";
10
+ import { Media } from "./media";
11
+ import { Instance } from "./instance";
12
+ export const PRIMITIVES = {
13
+ stack: Stack,
14
+ grid: Grid,
15
+ frame: Frame,
16
+ text: Text,
17
+ image: Image,
18
+ shape: Shape,
19
+ media: Media,
20
+ instance: Instance,
21
+ };
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/render/primitives/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,uEAAuE;AACvE,0DAA0D;AAK1D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWtC,MAAM,CAAC,MAAM,UAAU,GAA+D;IACpF,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,QAAQ;CACnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ReactElement } from "react";
2
+ import type { PrimitiveProps } from "./index";
3
+ export declare function Instance({ resolved }: PrimitiveProps): ReactElement | null;
4
+ //# sourceMappingURL=instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/instance.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,GAAG,YAAY,GAAG,IAAI,CA0C1E"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const warned = new Set();
3
+ export function Instance({ resolved }) {
4
+ const sceneId = resolved.scene_id;
5
+ const sceneVersion = resolved.scene_version;
6
+ if (!sceneId || !sceneVersion) {
7
+ if (import.meta.env.DEV) {
8
+ console.warn("[lumencast/instance] missing scene_id or scene_version", resolved);
9
+ }
10
+ return null;
11
+ }
12
+ // One-time DEV warning per (sceneId,version) so authors know the
13
+ // scaffold limitation.
14
+ if (import.meta.env.DEV) {
15
+ const key = `${sceneId}:${sceneVersion}`;
16
+ if (!warned.has(key)) {
17
+ warned.add(key);
18
+ console.warn(`[lumencast/instance] scaffold render — async bundle fetch + ` +
19
+ `__params.* injection are not yet wired (LSML 1.1 §4.9). ` +
20
+ `scene_id=${sceneId}`);
21
+ }
22
+ }
23
+ const size = resolved.size;
24
+ const position = resolved.position;
25
+ return (_jsx("div", { "data-lumencast-instance": sceneId, "data-lumencast-version": sceneVersion, style: {
26
+ position: position ? "absolute" : "relative",
27
+ left: position?.x,
28
+ top: position?.y,
29
+ width: size?.w,
30
+ height: size?.h,
31
+ outline: import.meta.env.DEV ? "1px dashed rgba(255,180,0,0.5)" : "none",
32
+ boxSizing: "border-box",
33
+ } }));
34
+ }
35
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../../src/render/primitives/instance.tsx"],"names":[],"mappings":";AAyBA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;AAEjC,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAkB;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAA8B,CAAC;IACxD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAmC,CAAC;IAClE,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,wDAAwD,EAAE,QAAQ,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iEAAiE;IACjE,uBAAuB;IACvB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,IAAI,CACV,8DAA8D;gBAC5D,0DAA0D;gBAC1D,YAAY,OAAO,EAAE,CACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA8C,CAAC;IACrE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAkD,CAAC;IAE7E,OAAO,CACL,yCAC2B,OAAO,4BACR,YAAY,EACpC,KAAK,EAAE;YACL,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;YAC5C,IAAI,EAAE,QAAQ,EAAE,CAAC;YACjB,GAAG,EAAE,QAAQ,EAAE,CAAC;YAChB,KAAK,EAAE,IAAI,EAAE,CAAC;YACd,MAAM,EAAE,IAAI,EAAE,CAAC;YACf,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,MAAM;YACxE,SAAS,EAAE,YAAY;SACxB,GACD,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { PrimitiveProps } from "./index";
2
+ /** Embedded video. `src`, `loop`, `mute`, `autoplay`. Audio is muted
3
+ * by default — broadcast audio is Pulsar-side, not from the browser
4
+ * source. */
5
+ export declare function Media({ resolved }: PrimitiveProps): import("react/jsx-runtime").JSX.Element | null;
6
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/media.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;cAEc;AACd,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,kDAsBjD"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /** Embedded video. `src`, `loop`, `mute`, `autoplay`. Audio is muted
3
+ * by default — broadcast audio is Pulsar-side, not from the browser
4
+ * source. */
5
+ export function Media({ resolved }) {
6
+ const src = resolved.src;
7
+ if (!src)
8
+ return null;
9
+ const loop = resolved.loop ?? true;
10
+ const mute = resolved.mute ?? true;
11
+ const autoplay = resolved.autoplay ?? true;
12
+ const fit = resolved.fit ?? "cover";
13
+ return (_jsx("video", { src: src, autoPlay: autoplay, loop: loop, muted: mute, playsInline: true, style: {
14
+ width: "100%",
15
+ height: "100%",
16
+ objectFit: fit,
17
+ } }));
18
+ }
19
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/render/primitives/media.tsx"],"names":[],"mappings":";AAEA;;cAEc;AACd,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAkB;IAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAyB,CAAC;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,IAAI,GAAI,QAAQ,CAAC,IAA4B,IAAI,IAAI,CAAC;IAC5D,MAAM,IAAI,GAAI,QAAQ,CAAC,IAA4B,IAAI,IAAI,CAAC;IAC5D,MAAM,QAAQ,GAAI,QAAQ,CAAC,QAAgC,IAAI,IAAI,CAAC;IACpE,MAAM,GAAG,GAAI,QAAQ,CAAC,GAA0B,IAAI,OAAO,CAAC;IAE5D,OAAO,CACL,gBACE,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,IAAI,EACX,WAAW,QACX,KAAK,EAAE;YACL,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,GAAuC;SACnD,GACD,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { PrimitiveProps } from "./index";
2
+ /** Rectangle / circle / line. Renders as SVG so stroke + fill behave
3
+ * predictably across hosts. Opacity animatable.
4
+ *
5
+ * LSML 1.1 §4.6 + §4.12 add `fills[]` / `strokes[]` arrays as the
6
+ * preferred way to declare multi-layer fills with linear/radial
7
+ * gradients. The legacy single `fill` / `stroke` props remain
8
+ * accepted for 1.0 bundles ; when both are present the array form
9
+ * wins (the spec forbids mixing, but we tolerate to ease migration).
10
+ */
11
+ export declare function Shape({ resolved, transitionFor }: PrimitiveProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/shape.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAS9C;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,cAAc,2CAuGhE"}
@@ -0,0 +1,66 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { motion } from "framer-motion";
3
+ import { toFramer } from "../../animate/transitions";
4
+ import { parseFills, renderFill } from "../fill";
5
+ /** Rectangle / circle / line. Renders as SVG so stroke + fill behave
6
+ * predictably across hosts. Opacity animatable.
7
+ *
8
+ * LSML 1.1 §4.6 + §4.12 add `fills[]` / `strokes[]` arrays as the
9
+ * preferred way to declare multi-layer fills with linear/radial
10
+ * gradients. The legacy single `fill` / `stroke` props remain
11
+ * accepted for 1.0 bundles ; when both are present the array form
12
+ * wins (the spec forbids mixing, but we tolerate to ease migration).
13
+ */
14
+ export function Shape({ resolved, transitionFor }) {
15
+ const kind = resolved.kind ?? "rect";
16
+ const legacyFill = resolved.fill ?? "transparent";
17
+ const legacyStroke = resolved.stroke ?? "transparent";
18
+ const legacyStrokeWidth = numberOr(resolved.stroke_width, 0);
19
+ const width = numberOr(resolved.width, 100);
20
+ const height = numberOr(resolved.height, 100);
21
+ const radius = numberOr(resolved.radius, 0);
22
+ const opacity = numberOr(resolved.opacity, 1);
23
+ const tx = transitionFor("opacity");
24
+ const transition = toFramer(tx);
25
+ // LSML 1.1 §4.6 — `fills[]` is the preferred multi-fill form. Fall
26
+ // back to the singular `fill` for 1.0 bundles.
27
+ const fills = parseFills(resolved.fills);
28
+ const strokes = parseStrokes(resolved.strokes);
29
+ // Each fill compiles to a (defs, ref) pair. We render the shape
30
+ // outline once per fill, layered top-to-bottom (first entry → on
31
+ // top, per §4.12). The defs are aggregated for a single <defs>.
32
+ const fillRenders = fills.map(renderFill);
33
+ const allDefs = fillRenders.flatMap((r) => r.defs);
34
+ const fillRefs = fillRenders.length > 0 ? fillRenders.map((r) => r.ref) : [legacyFill];
35
+ // Strokes : same layered approach, but solid colours only (gradient
36
+ // strokes are out of scope for §4.6 1.1). Each stroke is rendered
37
+ // as an additional pass over the same shape outline.
38
+ const strokeLayers = strokes.length > 0
39
+ ? strokes.map((s) => ({ color: s.color ?? "transparent", width: s.width ?? 0 }))
40
+ : [{ color: legacyStroke, width: legacyStrokeWidth }];
41
+ // Stack order : fillRefs are emitted top-to-bottom per §4.12. SVG
42
+ // paints later siblings on top, so we reverse here so the first
43
+ // entry in fills[] ends up rendered last (visually on top).
44
+ const stackedFills = [...fillRefs].reverse();
45
+ const stackedStrokes = [...strokeLayers].reverse();
46
+ const renderShape = (fill, stroke, keyPrefix) => {
47
+ if (kind === "circle") {
48
+ return (_jsx("circle", { cx: width / 2, cy: height / 2, r: Math.min(width, height) / 2 - stroke.width / 2, fill: fill, stroke: stroke.color, strokeWidth: stroke.width }, keyPrefix));
49
+ }
50
+ if (kind === "line") {
51
+ return (_jsx("line", { x1: "0", y1: height / 2, x2: width, y2: height / 2, stroke: stroke.color || fill, strokeWidth: stroke.width || 1 }, keyPrefix));
52
+ }
53
+ // rect default
54
+ return (_jsx("rect", { x: stroke.width / 2, y: stroke.width / 2, width: Math.max(0, width - stroke.width), height: Math.max(0, height - stroke.width), rx: radius, ry: radius, fill: fill, stroke: stroke.color, strokeWidth: stroke.width }, keyPrefix));
55
+ };
56
+ return (_jsxs(motion.svg, { width: width, height: height, viewBox: `0 0 ${width} ${height}`, animate: { opacity }, transition: transition, style: { willChange: "opacity" }, children: [allDefs.length > 0 && _jsx("defs", { children: allDefs }), stackedFills.map((ref, i) => renderShape(ref, { color: "transparent", width: 0 }, `fill-${i}`)), stackedStrokes.map((s, i) => renderShape("none", s, `stroke-${i}`))] }));
57
+ }
58
+ function parseStrokes(value) {
59
+ if (!Array.isArray(value))
60
+ return [];
61
+ return value.filter((v) => typeof v === "object" && v !== null && ("color" in v || "width" in v));
62
+ }
63
+ function numberOr(v, fallback) {
64
+ return typeof v === "number" && Number.isFinite(v) ? v : fallback;
65
+ }
66
+ //# sourceMappingURL=shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../../../src/render/primitives/shape.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { PrimitiveProps } from "./index";
2
+ /** Vertical or horizontal flex container. Layout-only — bindings
3
+ * here are unusual but tolerated.
4
+ *
5
+ * LSML 1.1 §4.1 adds `wrap` (boolean) and `crossGap` (number) :
6
+ * - wrap: true sets `flex-wrap: wrap` so children flow onto the
7
+ * next row / column when they overflow the main axis.
8
+ * - crossGap is the spacing between rows / columns when wrapping.
9
+ * Mapped to CSS `row-gap` (horizontal stack) or `column-gap`
10
+ * (vertical stack). Ignored when `wrap` is false.
11
+ */
12
+ export declare function Stack({ resolved, children }: PrimitiveProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/stack.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,2CA8B3D"}