@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/broadcast-Gcd-dmC7.js +12 -0
- package/dist/broadcast-Gcd-dmC7.js.map +1 -0
- package/dist/control-C5TfClga.js +17 -0
- package/dist/control-C5TfClga.js.map +1 -0
- package/dist/{index-Crkij3C4.js → index-N-VqrIxN.js} +305 -210
- package/dist/index-N-VqrIxN.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.html +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/lumencast.js +14 -9
- package/dist/modes/broadcast.d.ts.map +1 -1
- package/dist/modes/broadcast.js +6 -1
- package/dist/modes/broadcast.js.map +1 -1
- package/dist/modes/control.d.ts.map +1 -1
- package/dist/modes/control.js +6 -1
- package/dist/modes/control.js.map +1 -1
- package/dist/modes/test.d.ts.map +1 -1
- package/dist/modes/test.js +2 -1
- package/dist/modes/test.js.map +1 -1
- package/dist/render/allowed-hosts.d.ts +41 -0
- package/dist/render/allowed-hosts.d.ts.map +1 -0
- package/dist/render/allowed-hosts.js +88 -0
- package/dist/render/allowed-hosts.js.map +1 -0
- package/dist/render/asset-resolve.d.ts +27 -0
- package/dist/render/asset-resolve.d.ts.map +1 -0
- package/dist/render/asset-resolve.js +86 -0
- package/dist/render/asset-resolve.js.map +1 -0
- package/dist/render/blend-mode.d.ts +7 -0
- package/dist/render/blend-mode.d.ts.map +1 -0
- package/dist/render/blend-mode.js +49 -0
- package/dist/render/blend-mode.js.map +1 -0
- package/dist/render/bundle.d.ts +9 -1
- package/dist/render/bundle.d.ts.map +1 -1
- package/dist/render/bundle.js.map +1 -1
- package/dist/render/fill.d.ts +36 -3
- package/dist/render/fill.d.ts.map +1 -1
- package/dist/render/fill.js +222 -23
- package/dist/render/fill.js.map +1 -1
- package/dist/render/headless.d.ts +39 -0
- package/dist/render/headless.d.ts.map +1 -0
- package/dist/render/headless.js +83 -0
- package/dist/render/headless.js.map +1 -0
- package/dist/render/mask.d.ts +87 -0
- package/dist/render/mask.d.ts.map +1 -0
- package/dist/render/mask.js +243 -0
- package/dist/render/mask.js.map +1 -0
- package/dist/render/primitives/frame.d.ts.map +1 -1
- package/dist/render/primitives/frame.js +91 -5
- package/dist/render/primitives/frame.js.map +1 -1
- package/dist/render/primitives/grid.d.ts +1 -1
- package/dist/render/primitives/grid.d.ts.map +1 -1
- package/dist/render/primitives/grid.js +4 -1
- package/dist/render/primitives/grid.js.map +1 -1
- package/dist/render/primitives/image.d.ts +8 -1
- package/dist/render/primitives/image.d.ts.map +1 -1
- package/dist/render/primitives/image.js +17 -3
- package/dist/render/primitives/image.js.map +1 -1
- package/dist/render/primitives/index.d.ts +7 -0
- package/dist/render/primitives/index.d.ts.map +1 -1
- package/dist/render/primitives/index.js.map +1 -1
- package/dist/render/primitives/media.d.ts +11 -2
- package/dist/render/primitives/media.d.ts.map +1 -1
- package/dist/render/primitives/media.js +14 -3
- package/dist/render/primitives/media.js.map +1 -1
- package/dist/render/primitives/shape.d.ts.map +1 -1
- package/dist/render/primitives/shape.js +29 -26
- package/dist/render/primitives/shape.js.map +1 -1
- package/dist/render/primitives/stack.d.ts +1 -1
- package/dist/render/primitives/stack.d.ts.map +1 -1
- package/dist/render/primitives/stack.js +5 -1
- package/dist/render/primitives/stack.js.map +1 -1
- package/dist/render/primitives/text.d.ts.map +1 -1
- package/dist/render/primitives/text.js +0 -1
- package/dist/render/primitives/text.js.map +1 -1
- package/dist/render/prop-allowlist.d.ts.map +1 -1
- package/dist/render/prop-allowlist.js +25 -2
- package/dist/render/prop-allowlist.js.map +1 -1
- package/dist/render/shape-geometry.d.ts +81 -0
- package/dist/render/shape-geometry.d.ts.map +1 -0
- package/dist/render/shape-geometry.js +199 -0
- package/dist/render/shape-geometry.js.map +1 -0
- package/dist/render/shape-index.d.ts +28 -0
- package/dist/render/shape-index.d.ts.map +1 -0
- package/dist/render/shape-index.js +77 -0
- package/dist/render/shape-index.js.map +1 -0
- package/dist/render/tree.d.ts.map +1 -1
- package/dist/render/tree.js +175 -3
- package/dist/render/tree.js.map +1 -1
- package/dist/render/universal-wrapper.d.ts +27 -1
- package/dist/render/universal-wrapper.d.ts.map +1 -1
- package/dist/render/universal-wrapper.js +98 -22
- package/dist/render/universal-wrapper.js.map +1 -1
- package/dist/{status-pill-BT5b-yET.js → status-pill-BaLQoIDl.js} +2 -2
- package/dist/{status-pill-BT5b-yET.js.map → status-pill-BaLQoIDl.js.map} +1 -1
- package/dist/{test-_hh1JvAd.js → test-CA30C2By.js} +51 -51
- package/dist/{test-_hh1JvAd.js.map → test-CA30C2By.js.map} +1 -1
- package/dist/tree-1coZ32nd.js +1777 -0
- package/dist/tree-1coZ32nd.js.map +1 -0
- package/package.json +6 -5
- package/src/index.ts +24 -0
- package/src/modes/broadcast.tsx +12 -1
- package/src/modes/control.tsx +10 -1
- package/src/modes/test.tsx +4 -1
- package/src/render/allowed-hosts.tsx +100 -0
- package/src/render/asset-resolve.ts +97 -0
- package/src/render/blend-mode.ts +50 -0
- package/src/render/bundle.ts +6 -1
- package/src/render/fill.tsx +266 -24
- package/src/render/headless.tsx +129 -0
- package/src/render/mask.tsx +389 -0
- package/src/render/primitives/frame.tsx +101 -5
- package/src/render/primitives/grid.tsx +4 -1
- package/src/render/primitives/image.tsx +17 -3
- package/src/render/primitives/index.ts +7 -0
- package/src/render/primitives/media.tsx +14 -3
- package/src/render/primitives/shape.tsx +39 -75
- package/src/render/primitives/stack.tsx +5 -1
- package/src/render/primitives/text.tsx +0 -1
- package/src/render/prop-allowlist.ts +25 -2
- package/src/render/shape-geometry.tsx +315 -0
- package/src/render/shape-index.tsx +90 -0
- package/src/render/tree.tsx +214 -12
- package/src/render/universal-wrapper.tsx +128 -21
- package/dist/broadcast-DO7jEkix.js +0 -11
- package/dist/broadcast-DO7jEkix.js.map +0 -1
- package/dist/control-BSfl4_cO.js +0 -16
- package/dist/control-BSfl4_cO.js.map +0 -1
- package/dist/index-Crkij3C4.js.map +0 -1
- package/dist/tree-DBj9SJgs.js +0 -1230
- package/dist/tree-DBj9SJgs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/render/primitives/media.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/render/primitives/media.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;;;;;;;;;mDAWmD;AACnD,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAkB;IACxD,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACrE,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"}
|
|
@@ -1 +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;
|
|
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;AAY9C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,EAAE,cAAc,2CAiHxF"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { motion } from "framer-motion";
|
|
3
3
|
import { toFramer, mountPlay, resolveTransition } from "../../animate/transitions";
|
|
4
|
-
import { parseFills, renderFill, sanitizeFills } from "../fill";
|
|
4
|
+
import { parseFills, renderFill, sanitizeFills, gateImageFills } from "../fill";
|
|
5
5
|
import { parseCssColor, warnRejectedColor } from "../css-color";
|
|
6
|
-
import {
|
|
6
|
+
import { useAllowedHosts } from "../allowed-hosts";
|
|
7
|
+
import { buildShapeOutline } from "../shape-geometry";
|
|
7
8
|
/** Rectangle / circle / line / path. Renders as SVG so stroke + fill
|
|
8
9
|
* behave predictably across hosts. Opacity animatable.
|
|
9
10
|
*
|
|
@@ -29,7 +30,6 @@ export function Shape({ resolved, nodeId, transitionFor, animateInitial }) {
|
|
|
29
30
|
const legacyStrokeWidth = numberOr(resolved.stroke_width, 0);
|
|
30
31
|
const width = numberOr(resolved.width, 100);
|
|
31
32
|
const height = numberOr(resolved.height, 100);
|
|
32
|
-
const radius = numberOr(resolved.radius, 0);
|
|
33
33
|
const opacity = numberOr(resolved.opacity, 1);
|
|
34
34
|
// LSML §4.6 `ariaLabel` was silently unrendered until issue #34's
|
|
35
35
|
// allowlist audit surfaced it — now forwarded as the SVG label.
|
|
@@ -40,18 +40,24 @@ export function Shape({ resolved, nodeId, transitionFor, animateInitial }) {
|
|
|
40
40
|
// LSML 1.1 §4.6 — `fills[]` is the preferred multi-fill form. Fall
|
|
41
41
|
// back to the singular `fill` for 1.0 bundles. Colours are strict-
|
|
42
42
|
// validated (a rejected colour drops its layer, with diagnostic).
|
|
43
|
-
|
|
43
|
+
// LSML 1.2 §3.2 — image-fill `src` is host/scheme-gated (Bastion T1/T2)
|
|
44
|
+
// BEFORE any URL reaches an SVG <image href>. A rejected image-fill is
|
|
45
|
+
// dropped (no passthrough) with an R9-clean diagnostic. Colour fills go
|
|
46
|
+
// through `sanitizeFills` (RC#11) ; image fills pass it through untouched.
|
|
47
|
+
const allowedHosts = useAllowedHosts();
|
|
48
|
+
const fills = gateImageFills(sanitizeFills(parseFills(resolved.fills, "shape.fills", nodeId), "shape.fills", nodeId), allowedHosts, "shape.fills", nodeId);
|
|
44
49
|
const strokes = parseStrokes(resolved.strokes);
|
|
45
|
-
// LSML 1.1 §4.6 — `geometry:"path"` : validated subpaths, one
|
|
46
|
-
// `<path>` element per entry (ADR 001 §3.2.3). Re-validated at every
|
|
47
|
-
// render — see module header of svg-path.ts (RC#10).
|
|
48
|
-
const subpaths = kind === "path" ? parseShapePaths(resolved, nodeId) : [];
|
|
49
50
|
// Each fill compiles to a (defs, ref) pair. We render the shape
|
|
50
51
|
// outline once per fill, layered top-to-bottom (first entry → on
|
|
51
52
|
// top, per §4.12). The defs are aggregated for a single <defs>.
|
|
52
53
|
const fillRenders = fills.map(renderFill);
|
|
53
54
|
const allDefs = fillRenders.flatMap((r) => r.defs);
|
|
54
|
-
|
|
55
|
+
// #L — each fill layer carries its (runtime-revalidated) `mix-blend-mode`,
|
|
56
|
+
// applied on that layer's SVG element, independent of the node-level blend
|
|
57
|
+
// (#D, on the wrapper). Legacy single-fill path carries no per-fill blend.
|
|
58
|
+
const fillLayers = fillRenders.length > 0
|
|
59
|
+
? fillRenders.map((r) => ({ ref: r.ref, mixBlendMode: r.mixBlendMode }))
|
|
60
|
+
: [{ ref: legacyFill }];
|
|
55
61
|
// Strokes : same layered approach, but solid colours only (gradient
|
|
56
62
|
// strokes are out of scope for §4.6 1.1). Each stroke is rendered
|
|
57
63
|
// as an additional pass over the same shape outline.
|
|
@@ -64,29 +70,26 @@ export function Shape({ resolved, nodeId, transitionFor, animateInitial }) {
|
|
|
64
70
|
// Stack order : fillRefs are emitted top-to-bottom per §4.12. SVG
|
|
65
71
|
// paints later siblings on top, so we reverse here so the first
|
|
66
72
|
// entry in fills[] ends up rendered last (visually on top).
|
|
67
|
-
const stackedFills = [...
|
|
73
|
+
const stackedFills = [...fillLayers].reverse();
|
|
68
74
|
const stackedStrokes = [...strokeLayers].reverse();
|
|
69
75
|
// For paths, a zero-width / transparent stroke pass would only emit
|
|
70
76
|
// invisible duplicate <path> elements — skip it.
|
|
71
77
|
const effectiveStrokes = kind === "path"
|
|
72
78
|
? stackedStrokes.filter((s) => s.width > 0 && s.color !== "transparent")
|
|
73
79
|
: stackedStrokes;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
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));
|
|
88
|
-
};
|
|
89
|
-
return (_jsxs(motion.svg, { width: width, height: height, viewBox: `0 0 ${width} ${height}`, ...(ariaLabel !== undefined ? { "aria-label": ariaLabel, role: "img" } : {}), initial: play.initial, animate: play.animate, transition: transition, style: { willChange: "opacity, transform" }, children: [allDefs.length > 0 && _jsx("defs", { children: allDefs }), stackedFills.map((ref, i) => renderShape(ref, { color: "transparent", width: 0 }, `fill-${i}`)), effectiveStrokes.map((s, i) => renderShape("none", s, `stroke-${i}`))] }));
|
|
80
|
+
// Integration #K × #L — geometry construction is delegated to the single
|
|
81
|
+
// typed outline builder (`shape-geometry.tsx`, ADR 002 A2.1 #K), so a
|
|
82
|
+
// referenced shape's mask coverage is built from the IDENTICAL geometry as
|
|
83
|
+
// its on-screen render. The per-fill `mix-blend-mode` (#L, already runtime-
|
|
84
|
+
// revalidated by `renderFill` against the closed enum) is threaded through
|
|
85
|
+
// the paint argument and applied as inline `style` on the painted layer's
|
|
86
|
+
// SVG element. `undefined` (absent / out-of-enum) → no style key, layer
|
|
87
|
+
// blends `normal` (rétro-compat). Stroke passes never carry a fill blend —
|
|
88
|
+
// and the mask coverage path NEVER carries a blend (a mask is a coverage
|
|
89
|
+
// stencil, not a colour reproduction : `buildMaskCoverageFromShape` omits
|
|
90
|
+
// `mixBlendMode` entirely, #K hypothesis 2).
|
|
91
|
+
const renderShape = (fill, stroke, keyPrefix, mixBlendMode) => buildShapeOutline(resolved, { fill, stroke: stroke.color, strokeWidth: stroke.width, mixBlendMode }, nodeId, keyPrefix);
|
|
92
|
+
return (_jsxs(motion.svg, { width: width, height: height, viewBox: `0 0 ${width} ${height}`, ...(ariaLabel !== undefined ? { "aria-label": ariaLabel, role: "img" } : {}), initial: play.initial, animate: play.animate, transition: transition, children: [allDefs.length > 0 && _jsx("defs", { children: allDefs }), stackedFills.map((layer, i) => renderShape(layer.ref, { color: "transparent", width: 0 }, `fill-${i}`, layer.mixBlendMode)), effectiveStrokes.map((s, i) => renderShape("none", s, `stroke-${i}`))] }));
|
|
90
93
|
}
|
|
91
94
|
/** Strict-validate a colour prop (RC#11 — SVG attributes are injection
|
|
92
95
|
* sites too once values are wire-drivable). Non-strings resolve to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape.js","sourceRoot":"","sources":["../../../src/render/primitives/shape.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGvC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"shape.js","sourceRoot":"","sources":["../../../src/render/primitives/shape.tsx"],"names":[],"mappings":"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"}
|
|
@@ -9,5 +9,5 @@ import type { PrimitiveProps } from "./index";
|
|
|
9
9
|
* Mapped to CSS `row-gap` (horizontal stack) or `column-gap`
|
|
10
10
|
* (vertical stack). Ignored when `wrap` is false.
|
|
11
11
|
*/
|
|
12
|
-
export declare function Stack({ resolved, children }: PrimitiveProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function Stack({ resolved, children, establishesContainingBlock }: PrimitiveProps): import("react/jsx-runtime").JSX.Element;
|
|
13
13
|
//# sourceMappingURL=stack.d.ts.map
|
|
@@ -1 +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,
|
|
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,0BAA0B,EAAE,EAAE,cAAc,2CAkCvF"}
|
|
@@ -9,7 +9,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
9
9
|
* Mapped to CSS `row-gap` (horizontal stack) or `column-gap`
|
|
10
10
|
* (vertical stack). Ignored when `wrap` is false.
|
|
11
11
|
*/
|
|
12
|
-
export function Stack({ resolved, children }) {
|
|
12
|
+
export function Stack({ resolved, children, establishesContainingBlock }) {
|
|
13
13
|
const direction = resolved.direction ?? "vertical";
|
|
14
14
|
const gap = numberOr(resolved.gap, 0);
|
|
15
15
|
const wrap = resolved.wrap === true;
|
|
@@ -22,6 +22,10 @@ export function Stack({ resolved, children }) {
|
|
|
22
22
|
flexDirection: isHorizontal ? "row" : "column",
|
|
23
23
|
alignItems: align,
|
|
24
24
|
justifyContent: justify,
|
|
25
|
+
// ADR 002 §3.1 (D1) — establish a containing block when a child is
|
|
26
|
+
// absolutely placed, so its `left/top` resolve against this stack.
|
|
27
|
+
// Untouched for pure auto-layout stacks (RC#2).
|
|
28
|
+
...(establishesContainingBlock ? { position: "relative" } : {}),
|
|
25
29
|
};
|
|
26
30
|
if (wrap) {
|
|
27
31
|
style.flexWrap = "wrap";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../src/render/primitives/stack.tsx"],"names":[],"mappings":";AAGA;;;;;;;;;GASG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAkB;
|
|
1
|
+
{"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../src/render/primitives/stack.tsx"],"names":[],"mappings":";AAGA;;;;;;;;;GASG;AACH,MAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,0BAA0B,EAAkB;IACtF,MAAM,SAAS,GAAI,QAAQ,CAAC,SAAoB,IAAI,UAAU,CAAC;IAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAI,QAAQ,CAAC,KAAgB,IAAI,SAAS,CAAC;IACtD,MAAM,OAAO,GAAI,QAAQ,CAAC,OAAkB,IAAI,YAAY,CAAC;IAC7D,MAAM,YAAY,GAAG,SAAS,KAAK,YAAY,CAAC;IAEhD,MAAM,KAAK,GAAkB;QAC3B,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;QAC9C,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,OAAO;QACvB,mEAAmE;QACnE,mEAAmE;QACnE,gDAAgD;QAChD,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC;QACxB,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC;YACtB,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;YACnB,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC7B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;IAClB,CAAC;IAED,OAAO,cAAK,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAO,CAAC;AAC7C,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/text.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA6B9C,oEAAoE;AACpE,eAAO,MAAM,aAAa,OAAO,CAAC;AAClC;wCACwC;AACxC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC;wCACwC;AACxC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAiB1C;0EAC0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAK7D;AAED;;;;;;mCAMmC;AACnC,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/text.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA6B9C,oEAAoE;AACpE,eAAO,MAAM,aAAa,OAAO,CAAC;AAClC;wCACwC;AACxC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC;wCACwC;AACxC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAiB1C;0EAC0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAK7D;AAED;;;;;;mCAMmC;AACnC,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,EAAE,cAAc,2CAqDvF;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,GACd,KAAK,CAAC,aAAa,CAsDrB"}
|
|
@@ -108,7 +108,6 @@ export function Text({ resolved, nodeId, transitionFor, animateInitial }) {
|
|
|
108
108
|
color: colour,
|
|
109
109
|
textAlign: align,
|
|
110
110
|
...typography,
|
|
111
|
-
willChange: "opacity, transform",
|
|
112
111
|
}, initial: play.initial, animate: play.animate, transition: toFramer(tx), children: value }));
|
|
113
112
|
}
|
|
114
113
|
function numberOr(v, fallback) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/render/primitives/text.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/render/primitives/text.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prop-allowlist.d.ts","sourceRoot":"","sources":["../../src/render/prop-allowlist.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"prop-allowlist.d.ts","sourceRoot":"","sources":["../../src/render/prop-allowlist.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAkCvD,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAiDtF,CAAC;AAgBF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAgBrD"}
|
|
@@ -19,8 +19,31 @@
|
|
|
19
19
|
// anti-silent-drop policy they must warn until they are implemented.
|
|
20
20
|
import { emitDiagnostic } from "./diagnostics";
|
|
21
21
|
/** Universal props consumed by the Tree renderer itself
|
|
22
|
-
* (`UniversalWrapper`, LSML 1.1 §5.4) on every primitive.
|
|
23
|
-
|
|
22
|
+
* (`UniversalWrapper`, LSML 1.1 §5.4) on every primitive.
|
|
23
|
+
*
|
|
24
|
+
* ADR 002 §3.1 (D1) — `x`/`y` (compiler-flattened LSML `position:{x,y}`)
|
|
25
|
+
* and `width`/`height` (flattened `size:{w,h}`) are consumed universally
|
|
26
|
+
* for absolute placement : the Tree reads them into the wrapper's
|
|
27
|
+
* `position`/`size`, so they are honoured on EVERY primitive, not
|
|
28
|
+
* silently dropped. Frame additionally reads them into its own absolute
|
|
29
|
+
* box (it lists them explicitly below too — the union is harmless). */
|
|
30
|
+
const UNIVERSAL_PROPS = [
|
|
31
|
+
"visible",
|
|
32
|
+
"opacity",
|
|
33
|
+
"universal_opacity",
|
|
34
|
+
"rotation",
|
|
35
|
+
"sizing",
|
|
36
|
+
"x",
|
|
37
|
+
"y",
|
|
38
|
+
"width",
|
|
39
|
+
"height",
|
|
40
|
+
// ADR 002 §3.2 (D2 / #D) — `blendMode` is consumed universally by the
|
|
41
|
+
// wrapper (→ CSS `mix-blend-mode`) on every primitive.
|
|
42
|
+
"blendMode",
|
|
43
|
+
// ADR 002 §3.2 (#E) — a typed `mask` is lowered onto EVERY primitive by the
|
|
44
|
+
// compiler and consumed by the Tree (built into a `<mask>` SVG element).
|
|
45
|
+
"mask",
|
|
46
|
+
];
|
|
24
47
|
function allow(keys) {
|
|
25
48
|
return new Set([...UNIVERSAL_PROPS, ...keys]);
|
|
26
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prop-allowlist.js","sourceRoot":"","sources":["../../src/render/prop-allowlist.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,iEAAiE;AACjE,sEAAsE;AACtE,uEAAuE;AACvE,sEAAsE;AACtE,qEAAqE;AACrE,oBAAoB;AACpB,EAAE;AACF,uEAAuE;AACvE,0DAA0D;AAC1D,sEAAsE;AACtE,wEAAwE;AACxE,gEAAgE;AAChE,EAAE;AACF,mEAAmE;AACnE,sEAAsE;AACtE,qEAAqE;AACrE,qEAAqE;AAGrE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;
|
|
1
|
+
{"version":3,"file":"prop-allowlist.js","sourceRoot":"","sources":["../../src/render/prop-allowlist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { ReactElement } from "react";
|
|
2
|
+
import type { RenderNode } from "./bundle";
|
|
3
|
+
/**
|
|
4
|
+
* Build the outline of a `shape` node as SVG elements painted with the given
|
|
5
|
+
* `fill` and `stroke`. Used by the `shape` primitive (per-fill layering) and,
|
|
6
|
+
* with a fixed coverage paint, by the mask builder (#K).
|
|
7
|
+
*
|
|
8
|
+
* Integration #L — `paint.mixBlendMode` carries a per-fill `mix-blend-mode`
|
|
9
|
+
* that has ALREADY been revalidated against the closed enum by `renderFill`
|
|
10
|
+
* (double-gate T4). It is applied as an inline `style` on the painted layer's
|
|
11
|
+
* SVG element. It is `undefined` for stroke passes and ALWAYS `undefined` for
|
|
12
|
+
* mask coverage (`buildMaskCoverageFromShape` never sets it) — a mask is a
|
|
13
|
+
* coverage stencil, never a colour/blend reproduction (#K hypothesis 2). No
|
|
14
|
+
* value other than an enum-validated keyword can reach this style key.
|
|
15
|
+
*
|
|
16
|
+
* `nodeId` is for path-validation diagnostics only (never a value, R9).
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildShapeOutline(props: Record<string, unknown>, paint: {
|
|
19
|
+
fill: string;
|
|
20
|
+
stroke?: string;
|
|
21
|
+
strokeWidth?: number;
|
|
22
|
+
mixBlendMode?: string;
|
|
23
|
+
}, nodeId: string | undefined, keyPrefix?: string): ReactElement;
|
|
24
|
+
/**
|
|
25
|
+
* Build a referenced shape's geometry as mask COVERAGE paint (#K).
|
|
26
|
+
*
|
|
27
|
+
* Resolves to a white-painted outline (the default mask luminance paint) of
|
|
28
|
+
* the referenced `shape` node — inlined into the `<mask>`. Returns `null` when
|
|
29
|
+
* the node is not a paintable shape (defensive : the index only stores shapes,
|
|
30
|
+
* but a live delta could mutate one), so the caller omits the mask.
|
|
31
|
+
*
|
|
32
|
+
* Anti-cycle : reads only `node.props` geometry — never the node's own `mask`
|
|
33
|
+
* or children (profondeur de résolution = 1, A2.1 invariant).
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildMaskCoverageFromShape(node: RenderNode, nodeId: string | undefined): ReactElement | null;
|
|
36
|
+
/** Default cap on the number of direct children composited into a group mask
|
|
37
|
+
* (A4.4 budget T5). A container with more visible resolvable children is
|
|
38
|
+
* TRUNCATED at this count with a diagnostic — never an unbounded build. The
|
|
39
|
+
* real `817:2011` has 4 children ; the cap is generous yet bounded. */
|
|
40
|
+
export declare const GROUP_MASK_MAX_CHILDREN = 64;
|
|
41
|
+
/** Default cap on container-descent depth (A4.4 anti-cycle). `1` = a group's
|
|
42
|
+
* direct children may themselves be one level of sub-container ; below that a
|
|
43
|
+
* sub-container contributes nothing (diagnostic), so a `group → group → …`
|
|
44
|
+
* chain can never recurse without bound. We NEVER read a node's own `mask`
|
|
45
|
+
* during descent (a `mask → group → … → mask` cycle is structurally cut). */
|
|
46
|
+
export declare const GROUP_MASK_MAX_DEPTH = 1;
|
|
47
|
+
/**
|
|
48
|
+
* Composite the mask COVERAGE of a GROUP/FRAME container's VISIBLE children
|
|
49
|
+
* into a single typed `<g>` (#O, ADR 002 A4.3/A4.4).
|
|
50
|
+
*
|
|
51
|
+
* The coverage is the **union** of the white outlines of every visible direct
|
|
52
|
+
* child of geometry-resolvable kind — union being the native behaviour of
|
|
53
|
+
* stacking white coverages in one `<mask>` (SVG alpha cumulates). Each child's
|
|
54
|
+
* geometry is translated by its own `x`/`y` so the union lands in the
|
|
55
|
+
* container's coordinate space.
|
|
56
|
+
*
|
|
57
|
+
* Invariants (A4.4) :
|
|
58
|
+
* - **visible-only** : `visible:false` children do not contribute.
|
|
59
|
+
* - **anti-cycle, depth = 1** : a direct child that is itself a container is
|
|
60
|
+
* descended at most `maxDepth` levels (default 1). We read ONLY geometry —
|
|
61
|
+
* never any node's own `mask` — so a `mask → group → … → mask` chain is
|
|
62
|
+
* structurally cut and no recursion through masks is possible.
|
|
63
|
+
* - **budget T5** : at most `maxChildren` direct children are composited ;
|
|
64
|
+
* beyond the cap the remainder is dropped with a static-reason diagnostic
|
|
65
|
+
* (R9 — never the id value), never an unbounded composite / freeze.
|
|
66
|
+
* - **omission, not crash** : a container with no visible resolvable child
|
|
67
|
+
* returns `null` so the caller omits the mask (no throw).
|
|
68
|
+
*
|
|
69
|
+
* @param nodeId for diagnostics only (never a value, R9).
|
|
70
|
+
* @param maxDepth container-descent cap (default {@link GROUP_MASK_MAX_DEPTH}).
|
|
71
|
+
* @param maxChildren per-container child cap (default {@link GROUP_MASK_MAX_CHILDREN}).
|
|
72
|
+
*/
|
|
73
|
+
export declare function buildMaskCoverageFromGroup(node: RenderNode, nodeId: string | undefined, maxDepth?: number, maxChildren?: number): ReactElement | null;
|
|
74
|
+
/** True when a group-mask source carries a LAYER_BLUR on any (depth-bounded)
|
|
75
|
+
* visible geometry child — the FEATHERED case (e.g. the bg-texture ellipse
|
|
76
|
+
* blurred 107.76) whose soft rim needs the wrapper feather pad (mask.tsx /
|
|
77
|
+
* tree.tsx). A sharp source returns false so the pad is skipped entirely — no
|
|
78
|
+
* extra wrapper, no structural change to ordinary masks. Mirrors the blur
|
|
79
|
+
* detection + descent bounds of `collectCoverage`. */
|
|
80
|
+
export declare function coverageIsFeathered(node: RenderNode, depth?: number): boolean;
|
|
81
|
+
//# sourceMappingURL=shape-geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape-geometry.d.ts","sourceRoot":"","sources":["../../src/render/shape-geometry.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAa3C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,EACrF,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,SAAS,SAAS,GACjB,YAAY,CAiFd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,YAAY,GAAG,IAAI,CAOrB;AAED;;;wEAGwE;AACxE,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;8EAI8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AActC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,GAAE,MAA6B,EACvC,WAAW,GAAE,MAAgC,GAC5C,YAAY,GAAG,IAAI,CAKrB;AAED;;;;;uDAKuD;AACvD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,KAAK,GAAE,MAA6B,GACnC,OAAO,CAQT"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { parseShapePaths } from "./svg-path";
|
|
3
|
+
import { emitDiagnostic } from "./diagnostics";
|
|
4
|
+
/** The geometry kind, read from `geometry` (compiler) or `kind` (legacy). */
|
|
5
|
+
function geometryKind(props) {
|
|
6
|
+
return props.geometry ?? props.kind ?? "rect";
|
|
7
|
+
}
|
|
8
|
+
function numberOr(v, fallback) {
|
|
9
|
+
return typeof v === "number" && Number.isFinite(v) ? v : fallback;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Build the outline of a `shape` node as SVG elements painted with the given
|
|
13
|
+
* `fill` and `stroke`. Used by the `shape` primitive (per-fill layering) and,
|
|
14
|
+
* with a fixed coverage paint, by the mask builder (#K).
|
|
15
|
+
*
|
|
16
|
+
* Integration #L — `paint.mixBlendMode` carries a per-fill `mix-blend-mode`
|
|
17
|
+
* that has ALREADY been revalidated against the closed enum by `renderFill`
|
|
18
|
+
* (double-gate T4). It is applied as an inline `style` on the painted layer's
|
|
19
|
+
* SVG element. It is `undefined` for stroke passes and ALWAYS `undefined` for
|
|
20
|
+
* mask coverage (`buildMaskCoverageFromShape` never sets it) — a mask is a
|
|
21
|
+
* coverage stencil, never a colour/blend reproduction (#K hypothesis 2). No
|
|
22
|
+
* value other than an enum-validated keyword can reach this style key.
|
|
23
|
+
*
|
|
24
|
+
* `nodeId` is for path-validation diagnostics only (never a value, R9).
|
|
25
|
+
*/
|
|
26
|
+
export function buildShapeOutline(props, paint, nodeId, keyPrefix = "geom") {
|
|
27
|
+
const kind = geometryKind(props);
|
|
28
|
+
const width = numberOr(props.width, 100);
|
|
29
|
+
const height = numberOr(props.height, 100);
|
|
30
|
+
const radius = numberOr(props.radius, 0);
|
|
31
|
+
const stroke = paint.stroke ?? "none";
|
|
32
|
+
const strokeWidth = paint.strokeWidth ?? 0;
|
|
33
|
+
// #L — only an enum-revalidated keyword reaches here ; absent → no style key
|
|
34
|
+
// (layer blends `normal`, rétro-compat). Mask coverage never passes one.
|
|
35
|
+
const style = paint.mixBlendMode !== undefined
|
|
36
|
+
? { mixBlendMode: paint.mixBlendMode }
|
|
37
|
+
: undefined;
|
|
38
|
+
if (kind === "path") {
|
|
39
|
+
const subpaths = parseShapePaths(props, nodeId);
|
|
40
|
+
return (_jsx("g", { style: style, children: subpaths.map((p, i) => (_jsx("path", { d: p.d, fillRule: p.fillRule, fill: paint.fill, stroke: stroke, strokeWidth: strokeWidth }, i))) }, keyPrefix));
|
|
41
|
+
}
|
|
42
|
+
if (kind === "circle") {
|
|
43
|
+
// A Figma ELLIPSE node lowers to `circle`, but its box is often NON-square
|
|
44
|
+
// (the bg-shine glows are 699×428, 955×586…). Render an <ellipse> with the
|
|
45
|
+
// per-axis radii so the shape keeps its real size — a circle (w===h) is the
|
|
46
|
+
// degenerate case. Rendering a `min(w,h)` circle shrank the glows → the warm
|
|
47
|
+
// wash came out too dark and the wrong shape.
|
|
48
|
+
return (_jsx("ellipse", { style: style, cx: width / 2, cy: height / 2, rx: Math.max(0, width / 2 - strokeWidth / 2), ry: Math.max(0, height / 2 - strokeWidth / 2), fill: paint.fill, stroke: stroke, strokeWidth: strokeWidth }, keyPrefix));
|
|
49
|
+
}
|
|
50
|
+
if (kind === "line") {
|
|
51
|
+
return (_jsx("line", { style: style, x1: "0", y1: height / 2, x2: width, y2: height / 2, stroke: stroke !== "none" ? stroke : paint.fill, strokeWidth: strokeWidth || 1 }, keyPrefix));
|
|
52
|
+
}
|
|
53
|
+
// rect default
|
|
54
|
+
return (_jsx("rect", { style: style, x: strokeWidth / 2, y: strokeWidth / 2, width: Math.max(0, width - strokeWidth), height: Math.max(0, height - strokeWidth), rx: radius, ry: radius, fill: paint.fill, stroke: stroke, strokeWidth: strokeWidth }, keyPrefix));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build a referenced shape's geometry as mask COVERAGE paint (#K).
|
|
58
|
+
*
|
|
59
|
+
* Resolves to a white-painted outline (the default mask luminance paint) of
|
|
60
|
+
* the referenced `shape` node — inlined into the `<mask>`. Returns `null` when
|
|
61
|
+
* the node is not a paintable shape (defensive : the index only stores shapes,
|
|
62
|
+
* but a live delta could mutate one), so the caller omits the mask.
|
|
63
|
+
*
|
|
64
|
+
* Anti-cycle : reads only `node.props` geometry — never the node's own `mask`
|
|
65
|
+
* or children (profondeur de résolution = 1, A2.1 invariant).
|
|
66
|
+
*/
|
|
67
|
+
export function buildMaskCoverageFromShape(node, nodeId) {
|
|
68
|
+
if (node.kind !== "shape")
|
|
69
|
+
return null;
|
|
70
|
+
const props = node.props ?? {};
|
|
71
|
+
// White coverage : the SVG mask default paints luminance from white = full
|
|
72
|
+
// coverage. We deliberately ignore the shape's own fills/strokes — a mask is
|
|
73
|
+
// a coverage stencil, not a colour reproduction (A2.1 : inline the geometry).
|
|
74
|
+
return buildShapeOutline(props, { fill: "white" }, nodeId, "mask-cover");
|
|
75
|
+
}
|
|
76
|
+
/** Default cap on the number of direct children composited into a group mask
|
|
77
|
+
* (A4.4 budget T5). A container with more visible resolvable children is
|
|
78
|
+
* TRUNCATED at this count with a diagnostic — never an unbounded build. The
|
|
79
|
+
* real `817:2011` has 4 children ; the cap is generous yet bounded. */
|
|
80
|
+
export const GROUP_MASK_MAX_CHILDREN = 64;
|
|
81
|
+
/** Default cap on container-descent depth (A4.4 anti-cycle). `1` = a group's
|
|
82
|
+
* direct children may themselves be one level of sub-container ; below that a
|
|
83
|
+
* sub-container contributes nothing (diagnostic), so a `group → group → …`
|
|
84
|
+
* chain can never recurse without bound. We NEVER read a node's own `mask`
|
|
85
|
+
* during descent (a `mask → group → … → mask` cycle is structurally cut). */
|
|
86
|
+
export const GROUP_MASK_MAX_DEPTH = 1;
|
|
87
|
+
/** True iff a child node is excluded from the composite (`visible:false`).
|
|
88
|
+
* `visible` lives in the node's static props (compiler-flattened), mirroring
|
|
89
|
+
* the Tree's universal extraction (`resolved.visible`). */
|
|
90
|
+
function isHidden(node) {
|
|
91
|
+
return node.props?.visible === false;
|
|
92
|
+
}
|
|
93
|
+
function numProp(props, key) {
|
|
94
|
+
const v = props?.[key];
|
|
95
|
+
return typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Composite the mask COVERAGE of a GROUP/FRAME container's VISIBLE children
|
|
99
|
+
* into a single typed `<g>` (#O, ADR 002 A4.3/A4.4).
|
|
100
|
+
*
|
|
101
|
+
* The coverage is the **union** of the white outlines of every visible direct
|
|
102
|
+
* child of geometry-resolvable kind — union being the native behaviour of
|
|
103
|
+
* stacking white coverages in one `<mask>` (SVG alpha cumulates). Each child's
|
|
104
|
+
* geometry is translated by its own `x`/`y` so the union lands in the
|
|
105
|
+
* container's coordinate space.
|
|
106
|
+
*
|
|
107
|
+
* Invariants (A4.4) :
|
|
108
|
+
* - **visible-only** : `visible:false` children do not contribute.
|
|
109
|
+
* - **anti-cycle, depth = 1** : a direct child that is itself a container is
|
|
110
|
+
* descended at most `maxDepth` levels (default 1). We read ONLY geometry —
|
|
111
|
+
* never any node's own `mask` — so a `mask → group → … → mask` chain is
|
|
112
|
+
* structurally cut and no recursion through masks is possible.
|
|
113
|
+
* - **budget T5** : at most `maxChildren` direct children are composited ;
|
|
114
|
+
* beyond the cap the remainder is dropped with a static-reason diagnostic
|
|
115
|
+
* (R9 — never the id value), never an unbounded composite / freeze.
|
|
116
|
+
* - **omission, not crash** : a container with no visible resolvable child
|
|
117
|
+
* returns `null` so the caller omits the mask (no throw).
|
|
118
|
+
*
|
|
119
|
+
* @param nodeId for diagnostics only (never a value, R9).
|
|
120
|
+
* @param maxDepth container-descent cap (default {@link GROUP_MASK_MAX_DEPTH}).
|
|
121
|
+
* @param maxChildren per-container child cap (default {@link GROUP_MASK_MAX_CHILDREN}).
|
|
122
|
+
*/
|
|
123
|
+
export function buildMaskCoverageFromGroup(node, nodeId, maxDepth = GROUP_MASK_MAX_DEPTH, maxChildren = GROUP_MASK_MAX_CHILDREN) {
|
|
124
|
+
if (node.kind !== "frame")
|
|
125
|
+
return null;
|
|
126
|
+
const parts = collectCoverage(node, nodeId, maxDepth, maxChildren, "grp");
|
|
127
|
+
if (parts.length === 0)
|
|
128
|
+
return null;
|
|
129
|
+
return _jsx("g", { children: parts }, "mask-group-cover");
|
|
130
|
+
}
|
|
131
|
+
/** True when a group-mask source carries a LAYER_BLUR on any (depth-bounded)
|
|
132
|
+
* visible geometry child — the FEATHERED case (e.g. the bg-texture ellipse
|
|
133
|
+
* blurred 107.76) whose soft rim needs the wrapper feather pad (mask.tsx /
|
|
134
|
+
* tree.tsx). A sharp source returns false so the pad is skipped entirely — no
|
|
135
|
+
* extra wrapper, no structural change to ordinary masks. Mirrors the blur
|
|
136
|
+
* detection + descent bounds of `collectCoverage`. */
|
|
137
|
+
export function coverageIsFeathered(node, depth = GROUP_MASK_MAX_DEPTH) {
|
|
138
|
+
if (node.kind !== "frame")
|
|
139
|
+
return false;
|
|
140
|
+
for (const child of (node.children ?? [])) {
|
|
141
|
+
if (isHidden(child))
|
|
142
|
+
continue;
|
|
143
|
+
if (numProp(child.props, "blur") > 0)
|
|
144
|
+
return true;
|
|
145
|
+
if (child.kind === "frame" && depth > 0 && coverageIsFeathered(child, depth - 1))
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
/** Recursive (depth-bounded) collector : returns the white coverage elements
|
|
151
|
+
* of `node`'s visible direct children, translating each by its own `x`/`y`.
|
|
152
|
+
* A child container is descended only while `depth > 0`. NEVER reads a node's
|
|
153
|
+
* `mask`. */
|
|
154
|
+
function collectCoverage(node, nodeId, depth, maxChildren, keyPrefix) {
|
|
155
|
+
const children = node.children ?? [];
|
|
156
|
+
const out = [];
|
|
157
|
+
let composited = 0;
|
|
158
|
+
for (let i = 0; i < children.length; i++) {
|
|
159
|
+
const child = children[i];
|
|
160
|
+
if (isHidden(child))
|
|
161
|
+
continue;
|
|
162
|
+
if (composited >= maxChildren) {
|
|
163
|
+
emitDiagnostic(nodeId, "mask.source.ref", `group mask exceeds the ${maxChildren}-child composite cap ; remainder truncated (ADR 002 A4.4 T5)`);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
let part = null;
|
|
167
|
+
if (child.kind === "shape") {
|
|
168
|
+
part = buildShapeOutline(child.props ?? {}, { fill: "white" }, child.id, `${keyPrefix}-${i}`);
|
|
169
|
+
}
|
|
170
|
+
else if (child.kind === "frame" && depth > 0) {
|
|
171
|
+
// Bounded container descent (anti-cycle) — geometry only, never `mask`.
|
|
172
|
+
const sub = collectCoverage(child, nodeId, depth - 1, maxChildren, `${keyPrefix}-${i}`);
|
|
173
|
+
if (sub.length > 0)
|
|
174
|
+
part = _jsx("g", { children: sub }, `${keyPrefix}-${i}`);
|
|
175
|
+
}
|
|
176
|
+
// A non-geometry child (text/image/instance) or a too-deep sub-container
|
|
177
|
+
// contributes nothing — the mask is a coverage stencil over geometry only.
|
|
178
|
+
if (part === null)
|
|
179
|
+
continue;
|
|
180
|
+
// A LAYER_BLUR on the coverage shape FEATHERS the mask edge — the bg-texture
|
|
181
|
+
// mask is a single ellipse blurred 107.76 (radius), so the WP tiles fade out
|
|
182
|
+
// softly instead of being cut by a hard circular edge. Apply it via an SVG
|
|
183
|
+
// `<feGaussianBlur>` (radius ≈ 2× the CSS sigma) with a WIDE filter region :
|
|
184
|
+
// a plain CSS `filter:blur()` on an SVG element clips to the default
|
|
185
|
+
// −10%..120% box, so the feathered ellipse re-appeared with a hard SQUARE
|
|
186
|
+
// edge. The wide region (−120%..340%) lets the soft rim spread unclipped.
|
|
187
|
+
const childBlur = numProp(child.props, "blur");
|
|
188
|
+
if (childBlur > 0) {
|
|
189
|
+
const bf = `lumen-mcov-blur-${nodeId ?? "x"}-${keyPrefix}-${i}`;
|
|
190
|
+
part = (_jsxs("g", { children: [_jsx("filter", { id: bf, x: "-120%", y: "-120%", width: "340%", height: "340%", children: _jsx("feGaussianBlur", { stdDeviation: childBlur / 2 }) }), _jsx("g", { filter: `url(#${bf})`, children: part })] }, `${keyPrefix}-b-${i}`));
|
|
191
|
+
}
|
|
192
|
+
const x = numProp(child.props, "x");
|
|
193
|
+
const y = numProp(child.props, "y");
|
|
194
|
+
out.push(x !== 0 || y !== 0 ? (_jsx("g", { transform: `translate(${x} ${y})`, children: part }, `${keyPrefix}-t-${i}`)) : (part));
|
|
195
|
+
composited++;
|
|
196
|
+
}
|
|
197
|
+
return out;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=shape-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shape-geometry.js","sourceRoot":"","sources":["../../src/render/shape-geometry.tsx"],"names":[],"mappings":"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"}
|