@lumencast/runtime 0.6.0 → 0.8.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 (133) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/broadcast-Gcd-dmC7.js +12 -0
  3. package/dist/broadcast-Gcd-dmC7.js.map +1 -0
  4. package/dist/control-C5TfClga.js +17 -0
  5. package/dist/control-C5TfClga.js.map +1 -0
  6. package/dist/{index-Crkij3C4.js → index-N-VqrIxN.js} +305 -210
  7. package/dist/index-N-VqrIxN.js.map +1 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.html +1 -1
  11. package/dist/index.js +13 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/lumencast.js +14 -9
  14. package/dist/modes/broadcast.d.ts.map +1 -1
  15. package/dist/modes/broadcast.js +6 -1
  16. package/dist/modes/broadcast.js.map +1 -1
  17. package/dist/modes/control.d.ts.map +1 -1
  18. package/dist/modes/control.js +6 -1
  19. package/dist/modes/control.js.map +1 -1
  20. package/dist/modes/test.d.ts.map +1 -1
  21. package/dist/modes/test.js +2 -1
  22. package/dist/modes/test.js.map +1 -1
  23. package/dist/render/allowed-hosts.d.ts +41 -0
  24. package/dist/render/allowed-hosts.d.ts.map +1 -0
  25. package/dist/render/allowed-hosts.js +88 -0
  26. package/dist/render/allowed-hosts.js.map +1 -0
  27. package/dist/render/asset-resolve.d.ts +27 -0
  28. package/dist/render/asset-resolve.d.ts.map +1 -0
  29. package/dist/render/asset-resolve.js +86 -0
  30. package/dist/render/asset-resolve.js.map +1 -0
  31. package/dist/render/blend-mode.d.ts +7 -0
  32. package/dist/render/blend-mode.d.ts.map +1 -0
  33. package/dist/render/blend-mode.js +49 -0
  34. package/dist/render/blend-mode.js.map +1 -0
  35. package/dist/render/bundle.d.ts +9 -1
  36. package/dist/render/bundle.d.ts.map +1 -1
  37. package/dist/render/bundle.js.map +1 -1
  38. package/dist/render/fill.d.ts +36 -3
  39. package/dist/render/fill.d.ts.map +1 -1
  40. package/dist/render/fill.js +222 -23
  41. package/dist/render/fill.js.map +1 -1
  42. package/dist/render/headless.d.ts +39 -0
  43. package/dist/render/headless.d.ts.map +1 -0
  44. package/dist/render/headless.js +83 -0
  45. package/dist/render/headless.js.map +1 -0
  46. package/dist/render/mask.d.ts +87 -0
  47. package/dist/render/mask.d.ts.map +1 -0
  48. package/dist/render/mask.js +243 -0
  49. package/dist/render/mask.js.map +1 -0
  50. package/dist/render/primitives/frame.d.ts.map +1 -1
  51. package/dist/render/primitives/frame.js +91 -5
  52. package/dist/render/primitives/frame.js.map +1 -1
  53. package/dist/render/primitives/grid.d.ts +1 -1
  54. package/dist/render/primitives/grid.d.ts.map +1 -1
  55. package/dist/render/primitives/grid.js +4 -1
  56. package/dist/render/primitives/grid.js.map +1 -1
  57. package/dist/render/primitives/image.d.ts +8 -1
  58. package/dist/render/primitives/image.d.ts.map +1 -1
  59. package/dist/render/primitives/image.js +17 -3
  60. package/dist/render/primitives/image.js.map +1 -1
  61. package/dist/render/primitives/index.d.ts +7 -0
  62. package/dist/render/primitives/index.d.ts.map +1 -1
  63. package/dist/render/primitives/index.js.map +1 -1
  64. package/dist/render/primitives/media.d.ts +11 -2
  65. package/dist/render/primitives/media.d.ts.map +1 -1
  66. package/dist/render/primitives/media.js +14 -3
  67. package/dist/render/primitives/media.js.map +1 -1
  68. package/dist/render/primitives/shape.d.ts.map +1 -1
  69. package/dist/render/primitives/shape.js +29 -26
  70. package/dist/render/primitives/shape.js.map +1 -1
  71. package/dist/render/primitives/stack.d.ts +1 -1
  72. package/dist/render/primitives/stack.d.ts.map +1 -1
  73. package/dist/render/primitives/stack.js +5 -1
  74. package/dist/render/primitives/stack.js.map +1 -1
  75. package/dist/render/primitives/text.d.ts.map +1 -1
  76. package/dist/render/primitives/text.js +0 -1
  77. package/dist/render/primitives/text.js.map +1 -1
  78. package/dist/render/prop-allowlist.d.ts.map +1 -1
  79. package/dist/render/prop-allowlist.js +25 -2
  80. package/dist/render/prop-allowlist.js.map +1 -1
  81. package/dist/render/shape-geometry.d.ts +81 -0
  82. package/dist/render/shape-geometry.d.ts.map +1 -0
  83. package/dist/render/shape-geometry.js +199 -0
  84. package/dist/render/shape-geometry.js.map +1 -0
  85. package/dist/render/shape-index.d.ts +28 -0
  86. package/dist/render/shape-index.d.ts.map +1 -0
  87. package/dist/render/shape-index.js +77 -0
  88. package/dist/render/shape-index.js.map +1 -0
  89. package/dist/render/tree.d.ts.map +1 -1
  90. package/dist/render/tree.js +175 -3
  91. package/dist/render/tree.js.map +1 -1
  92. package/dist/render/universal-wrapper.d.ts +27 -1
  93. package/dist/render/universal-wrapper.d.ts.map +1 -1
  94. package/dist/render/universal-wrapper.js +98 -22
  95. package/dist/render/universal-wrapper.js.map +1 -1
  96. package/dist/{status-pill-BT5b-yET.js → status-pill-BaLQoIDl.js} +2 -2
  97. package/dist/{status-pill-BT5b-yET.js.map → status-pill-BaLQoIDl.js.map} +1 -1
  98. package/dist/{test-_hh1JvAd.js → test-CA30C2By.js} +51 -51
  99. package/dist/{test-_hh1JvAd.js.map → test-CA30C2By.js.map} +1 -1
  100. package/dist/tree-1coZ32nd.js +1777 -0
  101. package/dist/tree-1coZ32nd.js.map +1 -0
  102. package/package.json +6 -5
  103. package/src/index.ts +24 -0
  104. package/src/modes/broadcast.tsx +12 -1
  105. package/src/modes/control.tsx +10 -1
  106. package/src/modes/test.tsx +4 -1
  107. package/src/render/allowed-hosts.tsx +100 -0
  108. package/src/render/asset-resolve.ts +97 -0
  109. package/src/render/blend-mode.ts +50 -0
  110. package/src/render/bundle.ts +6 -1
  111. package/src/render/fill.tsx +266 -24
  112. package/src/render/headless.tsx +129 -0
  113. package/src/render/mask.tsx +389 -0
  114. package/src/render/primitives/frame.tsx +101 -5
  115. package/src/render/primitives/grid.tsx +4 -1
  116. package/src/render/primitives/image.tsx +17 -3
  117. package/src/render/primitives/index.ts +7 -0
  118. package/src/render/primitives/media.tsx +14 -3
  119. package/src/render/primitives/shape.tsx +39 -75
  120. package/src/render/primitives/stack.tsx +5 -1
  121. package/src/render/primitives/text.tsx +0 -1
  122. package/src/render/prop-allowlist.ts +25 -2
  123. package/src/render/shape-geometry.tsx +315 -0
  124. package/src/render/shape-index.tsx +90 -0
  125. package/src/render/tree.tsx +214 -12
  126. package/src/render/universal-wrapper.tsx +128 -21
  127. package/dist/broadcast-DO7jEkix.js +0 -11
  128. package/dist/broadcast-DO7jEkix.js.map +0 -1
  129. package/dist/control-BSfl4_cO.js +0 -16
  130. package/dist/control-BSfl4_cO.js.map +0 -1
  131. package/dist/index-Crkij3C4.js.map +0 -1
  132. package/dist/tree-DBj9SJgs.js +0 -1230
  133. package/dist/tree-DBj9SJgs.js.map +0 -1
@@ -0,0 +1,28 @@
1
+ import { type ReactNode } from "react";
2
+ import type { RenderNode } from "./bundle";
3
+ export type ShapeIndex = ReadonlyMap<string, RenderNode>;
4
+ /**
5
+ * Walk the bundle tree once and index every referenceable node — a
6
+ * `kind:"shape"` (shape-source, #K) or a `kind:"frame"` (group/frame-source,
7
+ * #O) — that carries an `id`. Collisions keep the first occurrence and
8
+ * diagnose the rest.
9
+ *
10
+ * The walk descends `children` only (the render tree's structural edges) ; it
11
+ * never reads `node.mask`, so building the index can never trigger mask
12
+ * resolution (anti-cycle is enforced at the builder, but the index walk is
13
+ * independent of masks entirely).
14
+ */
15
+ export declare function buildShapeIndex(root: RenderNode | undefined): ShapeIndex;
16
+ /**
17
+ * Provide a prebuilt shape index to the render subtree. Mounted ONCE at the
18
+ * render root by each mode, wrapping `<Tree>`. Accepts the index directly so
19
+ * the (cheap, one-pass) build happens once per bundle rather than per render.
20
+ */
21
+ export declare function ShapeIndexProvider({ index, children, }: {
22
+ index: ShapeIndex;
23
+ children: ReactNode;
24
+ }): import("react/jsx-runtime").JSX.Element;
25
+ /** Read the active shape index. Empty map when no provider is mounted (a
26
+ * pending ref then resolves to "not found" → mask omitted, never a crash). */
27
+ export declare function useShapeIndex(): ShapeIndex;
28
+ //# sourceMappingURL=shape-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-index.d.ts","sourceRoot":"","sources":["../../src/render/shape-index.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAKzD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,CA0BxE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAEA;AAED;+EAC+E;AAC/E,wBAAgB,aAAa,IAAI,UAAU,CAE1C"}
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // Render-side shape index (ADR 002 §3.2 Amendment 2 / A2.1 #K).
3
+ //
4
+ // A `mask.source.kind:"shape"` references a shape primitive by its stable `id`
5
+ // (mapper-assigned `fig-<safeIdRef(figmaNodeId)>`, see lumencast-figma). At
6
+ // render time the `<mask>` must INLINE the referenced shape's resolved geometry
7
+ // (the former `<use href="#id">` relied on a defs-resolvable sibling that does
8
+ // not exist in the runtime's flat tree). This module builds, in ONE pass over
9
+ // the bundle root, an index `id → RenderNode` of every referenceable shape, and
10
+ // threads it to the Tree via a plain React context (the bundle is immutable and
11
+ // content-addressed, so a mount-stable context is the right tool).
12
+ //
13
+ // ── Invariants (A2.1 / A4.3) ─────────────────────────────────────────
14
+ // - A `kind:"shape"` node carrying an `id` (shape-source target, #K) OR a
15
+ // `kind:"frame"` node carrying an `id` (group/frame-source target, #O —
16
+ // a GROUP and a FRAME container both lower to `frame`) is indexed. The
17
+ // mapper only emits `id` on actually-referenced nodes (no inflation).
18
+ // - Uniqueness : two nodes claiming the same `id` is a build-time defect. The
19
+ // FIRST occurrence wins and a diagnostic is emitted for each collision
20
+ // (never the id value beyond the field tag — R9-clean field only).
21
+ // - The index is read-only ; resolution is a pure in-memory lookup (A2.4 : no
22
+ // new surface, no URL, no fetch).
23
+ import { createContext, useContext } from "react";
24
+ import { emitDiagnostic } from "./diagnostics";
25
+ const EMPTY = new Map();
26
+ const ShapeIndexCtx = createContext(EMPTY);
27
+ /**
28
+ * Walk the bundle tree once and index every referenceable node — a
29
+ * `kind:"shape"` (shape-source, #K) or a `kind:"frame"` (group/frame-source,
30
+ * #O) — that carries an `id`. Collisions keep the first occurrence and
31
+ * diagnose the rest.
32
+ *
33
+ * The walk descends `children` only (the render tree's structural edges) ; it
34
+ * never reads `node.mask`, so building the index can never trigger mask
35
+ * resolution (anti-cycle is enforced at the builder, but the index walk is
36
+ * independent of masks entirely).
37
+ */
38
+ export function buildShapeIndex(root) {
39
+ if (!root)
40
+ return EMPTY;
41
+ const index = new Map();
42
+ const stack = [root];
43
+ while (stack.length > 0) {
44
+ const node = stack.pop();
45
+ const referenceable = node.kind === "shape" || node.kind === "frame";
46
+ if (referenceable && typeof node.id === "string" && node.id.length > 0) {
47
+ if (index.has(node.id)) {
48
+ emitDiagnostic(node.id, "id", "duplicate shape id ; first occurrence kept, later ones ignored (ADR 002 A2.1 #K)");
49
+ }
50
+ else {
51
+ index.set(node.id, node);
52
+ }
53
+ }
54
+ // Push children in REVERSE so the LIFO stack pops them in document order :
55
+ // "first occurrence wins" on a duplicate id must follow the bundle's order.
56
+ const children = node.children;
57
+ if (children) {
58
+ for (let i = children.length - 1; i >= 0; i--)
59
+ stack.push(children[i]);
60
+ }
61
+ }
62
+ return index;
63
+ }
64
+ /**
65
+ * Provide a prebuilt shape index to the render subtree. Mounted ONCE at the
66
+ * render root by each mode, wrapping `<Tree>`. Accepts the index directly so
67
+ * the (cheap, one-pass) build happens once per bundle rather than per render.
68
+ */
69
+ export function ShapeIndexProvider({ index, children, }) {
70
+ return _jsx(ShapeIndexCtx.Provider, { value: index, children: children });
71
+ }
72
+ /** Read the active shape index. Empty map when no provider is mounted (a
73
+ * pending ref then resolves to "not found" → mask omitted, never a crash). */
74
+ export function useShapeIndex() {
75
+ return useContext(ShapeIndexCtx);
76
+ }
77
+ //# sourceMappingURL=shape-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-index.js","sourceRoot":"","sources":["../../src/render/shape-index.tsx"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,EAAE;AACF,+EAA+E;AAC/E,4EAA4E;AAC5E,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,mEAAmE;AACnE,EAAE;AACF,wEAAwE;AACxE,2EAA2E;AAC3E,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,+EAA+E;AAC/E,0EAA0E;AAC1E,sEAAsE;AACtE,+EAA+E;AAC/E,qCAAqC;AAErC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAI/C,MAAM,KAAK,GAAe,IAAI,GAAG,EAAE,CAAC;AACpC,MAAM,aAAa,GAAG,aAAa,CAAa,KAAK,CAAC,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,IAA4B;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC5C,MAAM,KAAK,GAAiB,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAgB,CAAC;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;QACrE,IAAI,aAAa,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvE,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvB,cAAc,CACZ,IAAI,CAAC,EAAE,EACP,IAAI,EACJ,kFAAkF,CACnF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,2EAA2E;QAC3E,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,GAIT;IACC,OAAO,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA0B,CAAC;AACnF,CAAC;AAED;+EAC+E;AAC/E,MAAM,UAAU,aAAa;IAC3B,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/render/tree.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAI5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAQ3C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,GAAG,SAAS,CAK1D"}
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/render/tree.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAI5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAiB3C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,GAAG,SAAS,CAK1D"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  // Recursive tree renderer — resolves bindings, dispatches to
3
3
  // primitives, handles `repeat` specially.
4
4
  import { useSignals } from "@preact/signals-react/runtime";
@@ -12,6 +12,11 @@ import { StaggerContext, computeStaggerDelayMs } from "./stagger-context";
12
12
  import { useBindAnimate } from "./bind-animate";
13
13
  import { checkNodeProps } from "./prop-allowlist";
14
14
  import { emitDiagnostic } from "./diagnostics";
15
+ import { buildMask, parseMaskSpec, MASK_FEATHER_PAD } from "./mask";
16
+ import { parseBlendMode } from "./blend-mode";
17
+ import { useAllowedHosts } from "./allowed-hosts";
18
+ import { useShapeIndex } from "./shape-index";
19
+ import { buildMaskCoverageFromShape, buildMaskCoverageFromGroup, coverageIsFeathered, } from "./shape-geometry";
15
20
  export function Tree({ node, store }) {
16
21
  if (node.kind === "repeat") {
17
22
  return _jsx(Repeat, { node: node, store: store });
@@ -24,6 +29,12 @@ function Node({ node, store }) {
24
29
  // re-renders only fire on touched paths.
25
30
  useSignals();
26
31
  const scope = usePathScope();
32
+ // ADR 002 §3.2 (#E) — the bundle's host allowlist, for gating an image
33
+ // mask source (T1/T2). `undefined` = deny every remote host.
34
+ const allowedHosts = useAllowedHosts();
35
+ // ADR 002 A2.1 (#K) — the bundle-wide `id → shape` index, for resolving a
36
+ // `mask.source.kind:"shape"` ref to inlined coverage geometry.
37
+ const shapeIndex = useShapeIndex();
27
38
  // Hooks must run unconditionally — the early-return for unknown
28
39
  // kinds happens *after* every hook has fired.
29
40
  const resolved = useMemo(() => resolveProps(node, store, scope),
@@ -75,18 +86,140 @@ function Node({ node, store }) {
75
86
  // primitives. Pulled out of `resolved` so primitives can ignore
76
87
  // them ; the wrapper composes with whatever transform/opacity the
77
88
  // primitive's own framer-motion may apply.
89
+ //
90
+ // ADR 002 §3.1 (D1) — absolute placement. The compiler flattens LSML
91
+ // `position:{x,y}` → `resolved.x`/`resolved.y` and `size:{w,h}` →
92
+ // `resolved.width`/`resolved.height` on EVERY primitive (compile.ts
93
+ // §universal-props). The wrapper consumes them as absolute placement,
94
+ // EXCEPT on `frame` : a frame already positions itself (it reads
95
+ // `x`/`y`/`width`/`height` into its own absolute box + transform), so
96
+ // letting the wrapper pin it too would double the offset. Every other
97
+ // kind (text/shape/image/media/instance/stack/grid) is placed by the
98
+ // wrapper. A node without `x`/`y` gets `position: undefined` → normal
99
+ // flow (RC#2 non-regression).
100
+ // A masked node with a real blend hoists that blend above the mask wrapper
101
+ // (the mask isolates an inner `mix-blend-mode`). Compute it once here so the
102
+ // universal prop and the wrapper below agree.
103
+ const maskHoistsBlend = resolved.mask !== undefined &&
104
+ typeof resolved.blendMode === "string" &&
105
+ parseBlendMode(resolved.blendMode) !== undefined;
78
106
  const universal = {
79
107
  visible: typeof resolved.visible === "boolean" ? resolved.visible : undefined,
80
108
  opacity: typeof resolved.universal_opacity === "number" ? resolved.universal_opacity : undefined,
81
- rotation: typeof resolved.rotation === "number" ? resolved.rotation : undefined,
109
+ // A frame applies its own static rotation (frame.tsx) so it pivots around
110
+ // its centre ; the wrapper has no box for a self-positioning frame and would
111
+ // pivot around a collapsed (0-height) box. Non-frames keep it on the wrapper
112
+ // (they DO carry position/size there).
113
+ rotation: node.kind === "frame"
114
+ ? undefined
115
+ : typeof resolved.rotation === "number"
116
+ ? resolved.rotation
117
+ : undefined,
118
+ // Mirror (Figma scaleY(-1)) — like rotation, a frame mirrors itself
119
+ // (frame.tsx) ; non-frames carry it on the wrapper, composed with rotation.
120
+ flipY: node.kind === "frame" ? undefined : resolved.flipY === true,
121
+ blur: typeof resolved.blur === "number" ? resolved.blur : undefined,
82
122
  sizing: extractSizing(resolved.sizing),
123
+ position: node.kind === "frame" ? undefined : extractPosition(resolved),
124
+ size: node.kind === "frame" ? undefined : extractSize(resolved),
125
+ // ADR 002 §3.2 (D2 / #D) — `blendMode` is a universal prop on every
126
+ // primitive ; the wrapper re-validates it against the closed enum
127
+ // before applying `mix-blend-mode` (T4 runtime gate). Pass the raw
128
+ // resolved value through ; the wrapper omits anything off the enum.
129
+ // A blend on a MASKED node is hoisted ABOVE the mask wrapper (see below) —
130
+ // a CSS mask forms an isolating group, so a `mix-blend-mode` left on the
131
+ // (inner) wrapper would fold over a transparent backdrop (the caramel
132
+ // hard-light showed the raw blue wave instead of compositing over the warm
133
+ // gradient). Drop it here when it will be hoisted.
134
+ blendMode: typeof resolved.blendMode === "string" && !maskHoistsBlend ? resolved.blendMode : undefined,
83
135
  };
136
+ // ADR 002 §3.1 (D1) — a container holding at least one absolutely
137
+ // positioned child must establish the containing block so the child's
138
+ // `left/top` resolve against it (and not a distant ancestor). `Frame`
139
+ // is already `position:absolute` ; `Stack`/`Grid` flip to
140
+ // `position:relative` only when needed (no change for pure auto-layout
141
+ // boards — RC#2). Threaded to the primitive so the layout container
142
+ // decides ; a node without absolute children is untouched.
143
+ const hasAbsoluteChild = node.children?.some(childIsAbsolute) ?? false;
84
144
  // Merge live-interpolated colour values (§6.5) over the resolved
85
145
  // props — the primitive re-validates them through `parseCssColor`.
86
146
  const resolvedWithColors = Object.keys(bindAnimate.colorProps).length > 0
87
147
  ? { ...resolved, ...bindAnimate.colorProps }
88
148
  : resolved;
89
- let body = (_jsx(UniversalWrapper, { ...universal, children: _jsx(Primitive, { resolved: resolvedWithColors, nodeId: node.id, transitionFor: transitionFor, animateInitial: node.animate_initial, children: children }) }));
149
+ const primitiveEl = (_jsx(Primitive, { resolved: resolvedWithColors, nodeId: node.id, transitionFor: transitionFor, animateInitial: node.animate_initial, establishesContainingBlock: hasAbsoluteChild, children: children }));
150
+ // ADR 002 §3.2 (#E) — a typed `mask` lowered onto the node. Build it up-front
151
+ // so an IMAGE mask (CSS `mask-image`) can sit INSIDE the wrapper — it must
152
+ // rotate WITH the content under the wrapper's transform, else an outer
153
+ // un-rotated mask clips a mis-rotated crop (the caramel wave shrank off-box).
154
+ // A group/shape SVG mask stays OUTSIDE (its coverage is authored in the parent
155
+ // coordinate space). The mask is built ENTIRELY from typed fields (T3) ; enums
156
+ // re-validated (T4), image source host-gated (T1/T2) before any `href`.
157
+ let built = null;
158
+ if (resolved.mask !== undefined) {
159
+ const spec = parseMaskSpec(resolved.mask, node.id);
160
+ // #K/#O — resolve a ref to its inlined coverage geometry, routed on the
161
+ // referenced node's `kind` (shape → own outline ; frame → visible children).
162
+ const resolveShape = (ref) => {
163
+ const target = shapeIndex.get(ref);
164
+ if (!target)
165
+ return null;
166
+ return target.kind === "frame"
167
+ ? buildMaskCoverageFromGroup(target, target.id)
168
+ : buildMaskCoverageFromShape(target, target.id);
169
+ };
170
+ // A FEATHERED coverage (a blurred mask edge, e.g. the bg-texture ellipse) is
171
+ // the only case that needs the wrapper feather pad. Detect it from the mask
172
+ // SOURCE group's children so a sharp mask skips the pad entirely (no extra
173
+ // wrapper, no structural change).
174
+ let feather = false;
175
+ if (spec) {
176
+ const src = spec.source;
177
+ if ((src.kind === "group" || src.kind === "shape") && typeof src.ref === "string") {
178
+ const t = shapeIndex.get(src.ref);
179
+ feather = t ? coverageIsFeathered(t) : false;
180
+ }
181
+ }
182
+ built = spec
183
+ ? buildMask(spec, allowedHosts, node.id, resolveShape, extractSize(resolved), feather)
184
+ : null;
185
+ }
186
+ const isImageMask = built !== null && built.style != null && "maskImage" in built.style;
187
+ let inner = primitiveEl;
188
+ if (built && isImageMask) {
189
+ // Image mask co-located with the content : the CSS mask-image is on a box the
190
+ // wrapper's transform rotates, keeping its alpha aligned to the wave.
191
+ inner = _jsx("div", { style: { width: "100%", height: "100%", ...built.style }, children: inner });
192
+ }
193
+ let body = _jsx(UniversalWrapper, { ...universal, children: inner });
194
+ if (built && !isImageMask) {
195
+ // The (group/shape) mask wrapper MUST own a real box for the CSS mask to clip
196
+ // anything : its content is `position:absolute`, so fill the parent's
197
+ // containing block to share the absolutely-placed body's coordinate space.
198
+ // `overflow:hidden` bounds the (oversized) masked content to this box — the
199
+ // CSS `mask` alone does NOT clip it (removing it leaked the 2786×1491 tile
200
+ // group everywhere).
201
+ // Only a FEATHERED mask grows the box (+ shifts the coverage, mask.tsx) ;
202
+ // a sharp mask uses pad 0 → inset:0, identical to the un-padded structure.
203
+ const pad = built.feather ? MASK_FEATHER_PAD : 0;
204
+ body = (_jsxs("div", { style: {
205
+ position: "absolute",
206
+ inset: -pad,
207
+ overflow: "hidden",
208
+ ...built.style,
209
+ }, children: [_jsx("svg", { width: 0, height: 0, style: { position: "absolute" }, "aria-hidden": true, children: _jsx("defs", { children: built.def }) }), _jsx("div", { style: { position: "absolute", inset: pad }, children: body })] }));
210
+ }
211
+ // Hoist the node's blend ABOVE the wrapper+mask : an outer box carrying ONLY
212
+ // `mix-blend-mode` (no transform / opacity / filter / mask) so it composites
213
+ // the masked result with the SCENE backdrop. The caramel 3d-render then
214
+ // hard-lights over the warm gradient (orange) instead of its raw image (blue).
215
+ if (built && maskHoistsBlend) {
216
+ const hoisted = parseBlendMode(resolved.blendMode);
217
+ body = (_jsx("div", { style: {
218
+ position: "absolute",
219
+ inset: 0,
220
+ mixBlendMode: hoisted,
221
+ }, children: body }));
222
+ }
90
223
  // Scalar bindAnimate channels apply on a wrapping motion.div (same
91
224
  // composition model as UniversalWrapper). Motion values mutate the
92
225
  // style directly — zero React re-render per frame on the hot path.
@@ -113,6 +246,45 @@ function extractSizing(value) {
113
246
  out.y = obj.y;
114
247
  return out.x !== undefined || out.y !== undefined ? out : undefined;
115
248
  }
249
+ function finite(v) {
250
+ return typeof v === "number" && Number.isFinite(v) ? v : undefined;
251
+ }
252
+ /** ADR 002 §3.1 (D1) — form the absolute-placement `position:{x,y}` from
253
+ * the compiler-flattened `resolved.x`/`resolved.y`. BOTH axes must be
254
+ * finite numbers : a partial or malformed pair yields `undefined` (the
255
+ * node stays in the normal flow — RC#3 mistyped-position is inert, not
256
+ * injected). Values are plain numbers, never untrusted strings. */
257
+ function extractPosition(resolved) {
258
+ const x = finite(resolved.x);
259
+ const y = finite(resolved.y);
260
+ if (x === undefined || y === undefined)
261
+ return undefined;
262
+ return { x, y };
263
+ }
264
+ /** ADR 002 §3.1 (D1) — the absolute box size from `resolved.width`/
265
+ * `resolved.height`. Only meaningful alongside `position` (the wrapper
266
+ * ignores it otherwise). Partial sizes are allowed (one axis hugs). */
267
+ function extractSize(resolved) {
268
+ const w = finite(resolved.width);
269
+ const h = finite(resolved.height);
270
+ if (w === undefined && h === undefined)
271
+ return undefined;
272
+ return { w, h };
273
+ }
274
+ /** True when a child node carries a finite `{x,y}` absolute position
275
+ * (static prop OR a bound `x`/`y`). Used by a container primitive to
276
+ * decide whether to establish a positioned containing block. A bound
277
+ * position is treated as "absolute" structurally — the key presence is
278
+ * static even if the value moves live. */
279
+ function childIsAbsolute(child) {
280
+ if (child.kind === "frame")
281
+ return false; // a frame positions itself
282
+ const props = child.props ?? {};
283
+ const bindings = child.bindings ?? {};
284
+ const hasX = finite(props.x) !== undefined || "x" in bindings;
285
+ const hasY = finite(props.y) !== undefined || "y" in bindings;
286
+ return hasX && hasY;
287
+ }
116
288
  function Repeat({ node, store }) {
117
289
  useSignals();
118
290
  const scope = usePathScope();
@@ -1 +1 @@
1
- {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/render/tree.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/render/tree.tsx"],"names":[],"mappings":"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"}
@@ -4,13 +4,39 @@ export interface UniversalProps {
4
4
  visible?: boolean;
5
5
  opacity?: number;
6
6
  rotation?: number;
7
+ /** Mirror across the local X axis (Figma `scaleY(-1)`, negative-determinant
8
+ * transform). Composed with `rotation` on the wrapper so image/shape leaves
9
+ * mirror like frames do — without it the caramel 3d-render rendered as the
10
+ * un-mirrored wave (blue where Figma is orange). */
11
+ flipY?: boolean;
12
+ /** Figma LAYER_BLUR radius (px) → CSS `filter: blur()`. */
13
+ blur?: number;
7
14
  sizing?: {
8
15
  x?: SizingMode;
9
16
  y?: SizingMode;
10
17
  };
18
+ /** ADR 002 §3.1 (D1) — parent-relative absolute placement. When set,
19
+ * the wrapper pins the primitive at `left:x; top:y` (position:absolute)
20
+ * instead of leaving it in the normal flow. Both axes are required
21
+ * (the Tree only forms this object from a finite `{x,y}` pair). */
22
+ position?: {
23
+ x: number;
24
+ y: number;
25
+ };
26
+ /** ADR 002 §3.1 (D1) — the absolute box's fixed size, applied only
27
+ * alongside `position`. Omitted → the box hugs its content. */
28
+ size?: {
29
+ w?: number;
30
+ h?: number;
31
+ };
32
+ /** ADR 002 §3.2 (D2 / #D) — a Figma blend mode → CSS `mix-blend-mode`.
33
+ * The value is re-validated against the closed enum at render
34
+ * (`parseBlendMode`, T4 double-gate) ; anything outside the allowlist
35
+ * is omitted, never written to the style. */
36
+ blendMode?: string;
11
37
  }
12
38
  export interface UniversalWrapperProps extends UniversalProps {
13
39
  children: ReactNode;
14
40
  }
15
- export declare function UniversalWrapper({ visible, opacity, rotation, sizing, children, }: UniversalWrapperProps): import("react/jsx-runtime").JSX.Element | null;
41
+ export declare function UniversalWrapper({ visible, opacity, rotation, flipY, blur, sizing, position, size, blendMode, children, }: UniversalWrapperProps): import("react/jsx-runtime").JSX.Element | null;
16
42
  //# sourceMappingURL=universal-wrapper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"universal-wrapper.d.ts","sourceRoot":"","sources":["../../src/render/universal-wrapper.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,OAAO,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,UAAU,CAAC;QAAC,CAAC,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAqBD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,OAAO,EACP,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,EAAE,qBAAqB,kDAsCvB"}
1
+ {"version":3,"file":"universal-wrapper.d.ts","sourceRoot":"","sources":["../../src/render/universal-wrapper.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,OAAO,CAAC;AAItD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;yDAGqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,UAAU,CAAC;QAAC,CAAC,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;IAC5C;;;wEAGoE;IACpE,QAAQ,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC;oEACgE;IAChE,IAAI,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC;;;kDAG8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,EAAE,SAAS,CAAC;CACrB;AA+BD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,OAAO,EACP,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,QAAQ,GACT,EAAE,qBAAqB,kDAmGvB"}
@@ -1,4 +1,5 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { parseBlendMode } from "./blend-mode";
2
3
  /**
3
4
  * Maps a SizingMode onto a flex shorthand. Per LSML 1.1 §5.4.1 :
4
5
  * - fixed : the primitive honours its declared size verbatim
@@ -17,42 +18,117 @@ function flexFor(mode) {
17
18
  return undefined;
18
19
  }
19
20
  }
20
- export function UniversalWrapper({ visible, opacity, rotation, sizing, children, }) {
21
+ /** Collapse a {x,y} sizing pair to a single `flex` shorthand. When both axes
22
+ * agree, that value ; otherwise honour x (horizontal stacks dominate broadcast
23
+ * boards — the renderer doesn't know the parent's axis here). */
24
+ function sizingToFlex(sizing) {
25
+ const x = flexFor(sizing?.x);
26
+ const y = flexFor(sizing?.y);
27
+ if (x === y && x !== undefined)
28
+ return x;
29
+ return x ?? y;
30
+ }
31
+ export function UniversalWrapper({ visible, opacity, rotation, flipY, blur, sizing, position, size, blendMode, children, }) {
21
32
  if (visible === false) {
22
33
  return null; // slot collapses in flex/grid layouts (§5.4)
23
34
  }
35
+ // ADR 002 §3.2 (D2 / #D) — re-validate the blend mode against the
36
+ // closed enum at render (T4 runtime gate). A recognised mode yields a
37
+ // CSS `mix-blend-mode` keyword ; anything else is `undefined` and never
38
+ // reaches the style (no free CSS string, no passthrough).
39
+ const mixBlendMode = parseBlendMode(blendMode);
24
40
  // No-op fast path — when no universal props are set, render children
25
41
  // directly. Lets simple bundles avoid an extra DOM node per primitive.
42
+ // A child WITHOUT `position` never enters the absolute branch, so the
43
+ // normal flow (auto-layout) is left exactly as before (ADR 002 §3.1
44
+ // non-regression : RC#2).
26
45
  const hasOpacity = typeof opacity === "number" && opacity !== 1;
27
46
  const hasRotation = typeof rotation === "number" && rotation !== 0;
47
+ const hasFlipY = flipY === true;
48
+ const hasBlur = typeof blur === "number" && blur > 0;
28
49
  const hasSizing = sizing?.x !== undefined || sizing?.y !== undefined;
29
- if (!hasOpacity && !hasRotation && !hasSizing) {
50
+ const hasPosition = position !== undefined;
51
+ const hasBlendMode = mixBlendMode !== undefined;
52
+ if (!hasOpacity &&
53
+ !hasRotation &&
54
+ !hasFlipY &&
55
+ !hasBlur &&
56
+ !hasSizing &&
57
+ !hasPosition &&
58
+ !hasBlendMode) {
30
59
  return _jsx(_Fragment, { children: children });
31
60
  }
61
+ // Build the transform string (rotation + mirror). `rotate(θ) scaleY(-1)`
62
+ // applies the mirror first (rightmost), then the rotation — matching Figma's
63
+ // `rotate·scaleY(-1)` matrix (the caramel's −114° + mirror).
64
+ let transform;
65
+ if (hasRotation || hasFlipY) {
66
+ const parts = [];
67
+ if (hasRotation)
68
+ parts.push(`rotate(${rotation}deg)`);
69
+ if (hasFlipY)
70
+ parts.push("scaleY(-1)");
71
+ transform = parts.join(" ");
72
+ }
73
+ // Figma LAYER_BLUR → CSS blur (radius ≈ 2× the CSS sigma, measured on 817:3).
74
+ // (A gamma-correct linearRGB blur was tried to close the bg-shine corner's ~23 R
75
+ // deficit vs the Figma PNG ; it measured WORSE — the deficit is in the high-R
76
+ // channel, which is gamma-INVARIANT — and supersampling the render closed that
77
+ // corner anyway. The Chromium(sRGB)≠Figma(linearRGB) blur gap is else irreducible.)
78
+ const filter = hasBlur ? `blur(${blur / 2}px)` : undefined;
79
+ const sizingFlex = hasSizing ? sizingToFlex(sizing) : undefined;
80
+ // A `mix-blend-mode` composites with the SCENE backdrop only when its element
81
+ // does not also form an isolating group. `transform`, `opacity < 1` and
82
+ // `filter` each force the element into its own group, so the blend would fold
83
+ // over a TRANSPARENT backdrop instead — the caramel hard-light then shows the
84
+ // raw blue wave rather than compositing over the warm gradient, a screen layer
85
+ // silently no-ops. When the node needs BOTH a blend and one of those, SPLIT:
86
+ // the blend (+ absolute placement) lives on the OUTER box, the isolating
87
+ // transform/opacity/blur on an INNER box that carries the sized content.
88
+ if (hasBlendMode && (hasOpacity || transform !== undefined || filter !== undefined)) {
89
+ const outer = { mixBlendMode: mixBlendMode };
90
+ if (hasPosition) {
91
+ outer.position = "absolute";
92
+ outer.left = position.x;
93
+ outer.top = position.y;
94
+ }
95
+ if (sizingFlex !== undefined)
96
+ outer.flex = sizingFlex;
97
+ const inner = {};
98
+ if (typeof size?.w === "number")
99
+ inner.width = size.w;
100
+ if (typeof size?.h === "number")
101
+ inner.height = size.h;
102
+ if (hasOpacity)
103
+ inner.opacity = opacity;
104
+ if (transform !== undefined)
105
+ inner.transform = transform;
106
+ if (filter !== undefined)
107
+ inner.filter = filter;
108
+ return (_jsx("div", { style: outer, children: _jsx("div", { style: inner, children: children }) }));
109
+ }
32
110
  const style = {};
33
111
  if (hasOpacity)
34
112
  style.opacity = opacity;
35
- if (hasRotation)
36
- style.transform = `rotate(${rotation}deg)`;
37
- // sizing.x / sizing.y map to flex / row-flex behaviour. The
38
- // x-axis applies along the main axis of a horizontal stack ; the
39
- // y-axis along a vertical stack. We emit `flex` (covers both via
40
- // CSS's flex-direction) and rely on the parent stack for orientation.
41
- if (hasSizing) {
42
- const x = flexFor(sizing?.x);
43
- const y = flexFor(sizing?.y);
44
- // Emit a single flex declaration when both axes agree, otherwise
45
- // ship explicit grow/shrink/basis based on the dominant intent.
46
- if (x === y && x !== undefined) {
47
- style.flex = x;
48
- }
49
- else {
50
- // Heuristic : honour x for horizontal stacks (most common in
51
- // broadcast UIs). Renderer doesn't know the parent's axis here ;
52
- // a future iteration could thread that through context.
53
- style.flex = x ?? y;
54
- }
113
+ if (transform !== undefined)
114
+ style.transform = transform;
115
+ if (filter !== undefined)
116
+ style.filter = filter;
117
+ if (hasBlendMode)
118
+ style.mixBlendMode = mixBlendMode;
119
+ // ADR 002 §3.1 (D1) — absolute placement relative to the nearest positioned
120
+ // ancestor. `size` (when present) fixes the box ; otherwise it hugs content.
121
+ if (hasPosition) {
122
+ style.position = "absolute";
123
+ style.left = position.x;
124
+ style.top = position.y;
125
+ if (typeof size?.w === "number")
126
+ style.width = size.w;
127
+ if (typeof size?.h === "number")
128
+ style.height = size.h;
55
129
  }
130
+ if (sizingFlex !== undefined)
131
+ style.flex = sizingFlex;
56
132
  return _jsx("div", { style: style, children: children });
57
133
  }
58
134
  //# sourceMappingURL=universal-wrapper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"universal-wrapper.js","sourceRoot":"","sources":["../../src/render/universal-wrapper.tsx"],"names":[],"mappings":";AA+BA;;;;;GAKG;AACH,SAAS,OAAO,CAAC,IAA4B;IAC3C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,UAAU,CAAC;QACpB,KAAK,KAAK;YACR,OAAO,UAAU,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,EACP,OAAO,EACP,QAAQ,EACR,MAAM,EACN,QAAQ,GACc;IACtB,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,CAAC,6CAA6C;IAC5D,CAAC;IAED,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,UAAU,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,KAAK,SAAS,IAAI,MAAM,EAAE,CAAC,KAAK,SAAS,CAAC;IACrE,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9C,OAAO,4BAAG,QAAQ,GAAI,CAAC;IACzB,CAAC;IAED,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,UAAU;QAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IACxC,IAAI,WAAW;QAAE,KAAK,CAAC,SAAS,GAAG,UAAU,QAAQ,MAAM,CAAC;IAE5D,4DAA4D;IAC5D,iEAAiE;IACjE,iEAAiE;IACjE,sEAAsE;IACtE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7B,iEAAiE;QACjE,gEAAgE;QAChE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,6DAA6D;YAC7D,iEAAiE;YACjE,wDAAwD;YACxD,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,cAAK,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAO,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"universal-wrapper.js","sourceRoot":"","sources":["../../src/render/universal-wrapper.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs as c, jsx as s } from "react/jsx-runtime";
2
2
  import { useSignals as g } from "@preact/signals-react/runtime";
3
- import { u as d } from "./index-Crkij3C4.js";
3
+ import { u as d } from "./index-N-VqrIxN.js";
4
4
  const f = {
5
5
  position: "fixed",
6
6
  bottom: 12,
@@ -238,4 +238,4 @@ export {
238
238
  k as C,
239
239
  w as S
240
240
  };
241
- //# sourceMappingURL=status-pill-BT5b-yET.js.map
241
+ //# sourceMappingURL=status-pill-BaLQoIDl.js.map