@lumencast/runtime 0.5.0 → 0.7.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-DUYqvcgo.js +12 -0
- package/dist/broadcast-DUYqvcgo.js.map +1 -0
- package/dist/control-CL8TWXaE.js +17 -0
- package/dist/control-CL8TWXaE.js.map +1 -0
- package/dist/{index-CyOlpZAL.js → index-C6viWFcT.js} +216 -182
- package/dist/index-C6viWFcT.js.map +1 -0
- package/dist/index.html +1 -1
- package/dist/lumencast.js +1 -1
- 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/mount.d.ts.map +1 -1
- package/dist/mount.js +5 -0
- package/dist/mount.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/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 +17 -1
- package/dist/render/bundle.d.ts.map +1 -1
- package/dist/render/bundle.js +15 -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/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/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-DIpXc5du.js → status-pill-jJT54n07.js} +2 -2
- package/dist/{status-pill-DIpXc5du.js.map → status-pill-jJT54n07.js.map} +1 -1
- package/dist/{test-ByRec1kd.js → test-84XodL1c.js} +51 -51
- package/dist/{test-ByRec1kd.js.map → test-84XodL1c.js.map} +1 -1
- package/dist/transport/ws.d.ts +5 -0
- package/dist/transport/ws.d.ts.map +1 -1
- package/dist/transport/ws.js +7 -0
- package/dist/transport/ws.js.map +1 -1
- package/dist/tree-BIimahCf.js +1777 -0
- package/dist/tree-BIimahCf.js.map +1 -0
- package/package.json +4 -4
- package/src/modes/broadcast.tsx +12 -1
- package/src/modes/control.tsx +10 -1
- package/src/modes/test.tsx +4 -1
- package/src/mount.ts +5 -0
- package/src/render/allowed-hosts.tsx +100 -0
- package/src/render/blend-mode.ts +50 -0
- package/src/render/bundle.ts +28 -2
- package/src/render/fill.tsx +266 -24
- 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/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/src/transport/ws.ts +8 -0
- package/dist/broadcast-3vYij4k-.js +0 -11
- package/dist/broadcast-3vYij4k-.js.map +0 -1
- package/dist/control-BFNkY7-6.js +0 -16
- package/dist/control-BFNkY7-6.js.map +0 -1
- package/dist/index-CyOlpZAL.js.map +0 -1
- package/dist/tree-D5wYHpPu.js +0 -1230
- package/dist/tree-D5wYHpPu.js.map +0 -1
package/dist/render/bundle.d.ts
CHANGED
|
@@ -72,7 +72,15 @@ export interface RenderBundle {
|
|
|
72
72
|
root: RenderNode;
|
|
73
73
|
operator_inputs?: OperatorInput[];
|
|
74
74
|
external_adapters?: ExternalAdapter[];
|
|
75
|
-
|
|
75
|
+
/** Bundle-level asset declarations. `allowedHosts` is the host
|
|
76
|
+
* allowlist (LSML 1.2 §3.2, Bastion T1) every image / image-fill `src`
|
|
77
|
+
* is gated against at render BEFORE reaching the DOM. Absent / empty =
|
|
78
|
+
* deny every remote host (deny-by-default). Other keys (`fonts`,
|
|
79
|
+
* `preload`) are forwarded opaquely by the compiler. */
|
|
80
|
+
assets?: {
|
|
81
|
+
allowedHosts?: string[];
|
|
82
|
+
[key: string]: unknown;
|
|
83
|
+
};
|
|
76
84
|
/** LSML 1.1 §17.3 — capability profiles required for correct rendering.
|
|
77
85
|
* Each entry is an `x-<vendor>.<name>/<version>` string. The runtime
|
|
78
86
|
* checks every behavioural entry against its supported list ; an
|
|
@@ -146,6 +154,14 @@ export interface BundleFetcherOptions {
|
|
|
146
154
|
* Lets a gateway-prefixed server be addressed without changing the
|
|
147
155
|
* host-root default. */
|
|
148
156
|
resolveUrl?: BundleUrlResolver;
|
|
157
|
+
/** Resolve the bearer token used to authenticate each bundle GET. The
|
|
158
|
+
* render-bundle endpoint is auth-gated identically to the LSDP/1 WS
|
|
159
|
+
* subscription, so the fetch carries the same session token as
|
|
160
|
+
* `Authorization: Bearer <token>`. Resolved per request so a token swap
|
|
161
|
+
* (`setToken`) takes effect on the next fetch ; a `LumencastTokenProvider`
|
|
162
|
+
* is awaited. When omitted — or when it resolves to an empty/undefined
|
|
163
|
+
* value — no `Authorization` header is sent (v0.5.0 behaviour). */
|
|
164
|
+
getAuthToken?: () => string | undefined | Promise<string | undefined>;
|
|
149
165
|
fetchImpl?: typeof fetch;
|
|
150
166
|
}
|
|
151
167
|
export declare function createBundleFetcher(opts: BundleFetcherOptions): BundleFetcher;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/render/bundle.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIzD,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,MAAM,GACN,OAAO,GACP,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,QAAQ,GACR,UAAU,CAAC;AAEf,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,kDAAkD;IAClD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;kEAC8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;;kCAE8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC;;;;;;iDAM6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAClD;;;;;;;;;0BASsB;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;mDAG+C;IAC/C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;mEAC+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,MAAM,GACN,UAAU,GACV,QAAQ,GACR,UAAU,CAAC;AAEf,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAC;IACtC,MAAM,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/render/bundle.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIzD,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,MAAM,GACN,OAAO,GACP,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,QAAQ,GACR,UAAU,CAAC;AAEf,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,kDAAkD;IAClD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC;kEAC8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;;kCAE8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC;;;;;;iDAM6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAClD;;;;;;;;;0BASsB;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;mDAG+C;IAC/C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB;mEAC+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,MAAM,GACN,UAAU,GACV,QAAQ,GACR,UAAU,CAAC;AAEf,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAC;IACtC;;;;6DAIyD;IACzD,MAAM,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC7D;;;;;yEAKqE;IACrE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAEjD,CAAC;AAuBH;;0EAE0E;AAC1E,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAYtD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAgB,IAAI,EAAG,qBAAqB,CAAU;IACtD,SAAgB,mBAAmB,EAAE,MAAM,EAAE,CAAC;gBAClC,mBAAmB,EAAE,MAAM,EAAE;CAS1C;AAED;;;;;;;;;;;;;;;wBAewB;AACxB,wBAAgB,sBAAsB,CACpC,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAC/B,SAAS,GAAE,WAAW,CAAC,MAAM,CAAsB,GAClD,IAAI,CAaN;AAID,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAClE;gCAC4B;IAC5B,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CACrC;AAED;;;sEAGsE;AACtE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;AAElF,MAAM,WAAW,oBAAoB;IACnC;;oCAEgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB;iDAC6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;6BAGyB;IACzB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;;;;wEAMoE;IACpE,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACtE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAgED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAE7E"}
|
package/dist/render/bundle.js
CHANGED
|
@@ -109,13 +109,26 @@ class FetcherImpl {
|
|
|
109
109
|
baseUrl;
|
|
110
110
|
pathPrefix;
|
|
111
111
|
resolveUrl;
|
|
112
|
+
getAuthToken;
|
|
112
113
|
fetchImpl;
|
|
113
114
|
constructor(opts) {
|
|
114
115
|
this.baseUrl = opts.baseUrl.replace(/\/$/, "");
|
|
115
116
|
this.pathPrefix = (opts.pathPrefix ?? "/lsdp/v1/scenes").replace(/\/$/, "");
|
|
116
117
|
this.resolveUrl = opts.resolveUrl;
|
|
118
|
+
this.getAuthToken = opts.getAuthToken;
|
|
117
119
|
this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);
|
|
118
120
|
}
|
|
121
|
+
/** Build the request init carrying the bearer token, if any. Returns
|
|
122
|
+
* `undefined` when no token is available — the fetch stays header-less,
|
|
123
|
+
* preserving v0.5.0 behaviour. */
|
|
124
|
+
async buildInit() {
|
|
125
|
+
if (!this.getAuthToken)
|
|
126
|
+
return undefined;
|
|
127
|
+
const token = await this.getAuthToken();
|
|
128
|
+
if (!token)
|
|
129
|
+
return undefined;
|
|
130
|
+
return { headers: { Authorization: `Bearer ${token}` } };
|
|
131
|
+
}
|
|
119
132
|
buildUrl(sceneId, sceneVersion) {
|
|
120
133
|
if (this.resolveUrl) {
|
|
121
134
|
return this.resolveUrl(sceneId, sceneVersion);
|
|
@@ -134,7 +147,8 @@ class FetcherImpl {
|
|
|
134
147
|
if (cached)
|
|
135
148
|
return cached;
|
|
136
149
|
const url = this.buildUrl(sceneId, sceneVersion);
|
|
137
|
-
const
|
|
150
|
+
const init = await this.buildInit();
|
|
151
|
+
const response = init ? await this.fetchImpl(url, init) : await this.fetchImpl(url);
|
|
138
152
|
if (!response.ok) {
|
|
139
153
|
throw new Error(`bundle fetch failed: ${response.status} ${response.statusText}`);
|
|
140
154
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/render/bundle.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,oEAAoE;AACpE,0EAA0E;AAC1E,8EAA8E;AAC9E,EAAE;AACF,6EAA6E;AAC7E,iFAAiF;AACjF,8EAA8E;AAC9E,0EAA0E;AAC1E,yEAAyE;AACzE,mDAAmD;
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/render/bundle.ts"],"names":[],"mappings":"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"}
|
package/dist/render/fill.d.ts
CHANGED
|
@@ -4,15 +4,22 @@ export interface FillStop {
|
|
|
4
4
|
color: string;
|
|
5
5
|
opacity?: number;
|
|
6
6
|
}
|
|
7
|
+
export type ObjectFit = "cover" | "contain" | "fill" | "none" | "scale-down";
|
|
8
|
+
/** Validate an `objectFit` against the closed enum at render. Returns the
|
|
9
|
+
* value or `undefined` (caller falls back to the default + diagnoses).
|
|
10
|
+
* Never passthrough. */
|
|
11
|
+
export declare function parseObjectFitRuntime(value: unknown): ObjectFit | undefined;
|
|
7
12
|
export type Fill = {
|
|
8
13
|
kind: "solid";
|
|
9
14
|
color: string;
|
|
10
15
|
opacity?: number;
|
|
16
|
+
blendMode?: string;
|
|
11
17
|
} | {
|
|
12
18
|
kind: "linear-gradient";
|
|
13
19
|
angle_deg?: number;
|
|
14
20
|
stops: FillStop[];
|
|
15
21
|
opacity?: number;
|
|
22
|
+
blendMode?: string;
|
|
16
23
|
} | {
|
|
17
24
|
kind: "radial-gradient";
|
|
18
25
|
center?: {
|
|
@@ -22,19 +29,36 @@ export type Fill = {
|
|
|
22
29
|
radius?: number;
|
|
23
30
|
stops: FillStop[];
|
|
24
31
|
opacity?: number;
|
|
32
|
+
blendMode?: string;
|
|
33
|
+
} | {
|
|
34
|
+
kind: "image";
|
|
35
|
+
src: string;
|
|
36
|
+
objectFit?: ObjectFit;
|
|
37
|
+
opacity?: number;
|
|
38
|
+
blendMode?: string;
|
|
25
39
|
};
|
|
26
40
|
export interface FillRenderResult {
|
|
27
41
|
/** SVG <defs> contributions (gradient definitions). */
|
|
28
42
|
defs: ReactElement[];
|
|
29
43
|
/** Reference to use as the `fill` attribute on the shape. */
|
|
30
44
|
ref: string;
|
|
45
|
+
/** #L — the per-fill-layer `mix-blend-mode` keyword, re-validated against
|
|
46
|
+
* the closed enum at the runtime (T4) ; `undefined` when absent or
|
|
47
|
+
* out-of-enum (caller omits — never reaches the style). Applied on the
|
|
48
|
+
* fill layer element, independent of the node-level blend (#D). */
|
|
49
|
+
mixBlendMode?: string;
|
|
31
50
|
}
|
|
32
51
|
/** Compile a Fill into an SVG `<defs>` entry + a `fill="url(#…)"` ref.
|
|
33
52
|
* Solid fills produce no defs and return the colour directly. */
|
|
34
53
|
export declare function renderFill(fill: Fill): FillRenderResult;
|
|
35
|
-
/** Compile an array of Fill into
|
|
36
|
-
*
|
|
37
|
-
*
|
|
54
|
+
/** Compile an array of Fill into background CSS usable on a `<div>` (frame
|
|
55
|
+
* backgrounds — non-SVG context). Returns `backgroundImage` plus, when an
|
|
56
|
+
* image-fill is present, the matching `backgroundSize`/`backgroundPosition`/
|
|
57
|
+
* `backgroundRepeat`. Stops use percentages in CSS gradient syntax.
|
|
58
|
+
*
|
|
59
|
+
* Image-fill `src` MUST already be host/scheme-gated (`gateImageFills`) —
|
|
60
|
+
* `backgroundsToCss` assumes the URL is trusted at this point and only
|
|
61
|
+
* CSS-escapes it for safe interpolation into `url("…")`. */
|
|
38
62
|
export declare function backgroundsToCss(fills: Fill[], nodeId?: string): CSSProperties;
|
|
39
63
|
/** Validate every colour carried by a Fill array through the strict
|
|
40
64
|
* parser (RC#11 — issue #30 contractual comment : SVG `fill`/`stroke`
|
|
@@ -50,4 +74,13 @@ export declare function sanitizeFills(fills: Fill[], field: string, nodeId?: str
|
|
|
50
74
|
* to core by the LSML 1.2 RFC) is dropped WITH a diagnostic — never
|
|
51
75
|
* silently (ADR 001 §3.4, issue #34). */
|
|
52
76
|
export declare function parseFills(value: unknown, field?: string, nodeId?: string): Fill[];
|
|
77
|
+
/**
|
|
78
|
+
* Drop every image-fill whose `src` fails the host/scheme allowlist
|
|
79
|
+
* (Bastion T1/T2), BEFORE any image-fill reaches the DOM. A rejected
|
|
80
|
+
* image-fill is omitted entirely (never a passthrough URL) with an
|
|
81
|
+
* R9-clean diagnostic emitted by `gateSrc`. Non-image fills pass through
|
|
82
|
+
* untouched. Call this once, after `parseFills`, with the active
|
|
83
|
+
* `allowedHosts` from `useAllowedHosts()`.
|
|
84
|
+
*/
|
|
85
|
+
export declare function gateImageFills(fills: Fill[], allowedHosts: readonly string[] | undefined, field: string, nodeId?: string): Fill[];
|
|
53
86
|
//# sourceMappingURL=fill.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../src/render/fill.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"fill.d.ts","sourceRoot":"","sources":["../../src/render/fill.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAMzD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;AAE7E;;yBAEyB;AACzB,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAE3E;AAOD,MAAM,MAAM,IAAI,GACZ;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IAKE,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAQN,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ;;;wEAGoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;iEACiE;AACjE,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,gBAAgB,CA2FvD;AAwCD;;;;;;;4DAO4D;AAC5D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAsC9E;AAgFD;;;;;;sEAMsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAkCnF;AAED;;;;yCAIyC;AACzC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CA+ClF;AAWD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,IAAI,EAAE,EACb,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAC3C,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,EAAE,CAKR"}
|
package/dist/render/fill.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { parseCssColor, warnRejectedColor } from "./css-color";
|
|
3
3
|
import { emitDiagnostic } from "./diagnostics";
|
|
4
|
+
import { gateSrc } from "./allowed-hosts";
|
|
5
|
+
import { parseBlendMode } from "./blend-mode";
|
|
6
|
+
/** LSML 1.2 §3.2 closed `objectFit` enum, re-validated at the RUNTIME (the
|
|
7
|
+
* compiler is the other arm of the double-gate, Bastion T4). These are
|
|
8
|
+
* exactly the legal CSS `object-fit` / `background-size`-mappable values ;
|
|
9
|
+
* anything else is omitted + diagnosed, never passed through to inline CSS.
|
|
10
|
+
* Kept local to the runtime — the runtime must not import from the
|
|
11
|
+
* compiler (the dependency edge points the other way). */
|
|
12
|
+
const OBJECT_FITS = new Set(["cover", "contain", "fill", "none", "scale-down"]);
|
|
13
|
+
/** Validate an `objectFit` against the closed enum at render. Returns the
|
|
14
|
+
* value or `undefined` (caller falls back to the default + diagnoses).
|
|
15
|
+
* Never passthrough. */
|
|
16
|
+
export function parseObjectFitRuntime(value) {
|
|
17
|
+
return typeof value === "string" && OBJECT_FITS.has(value) ? value : undefined;
|
|
18
|
+
}
|
|
4
19
|
let gradientIdSeq = 0;
|
|
5
20
|
function nextGradientId() {
|
|
6
21
|
gradientIdSeq = (gradientIdSeq + 1) % 1_000_000;
|
|
@@ -9,26 +24,61 @@ function nextGradientId() {
|
|
|
9
24
|
/** Compile a Fill into an SVG `<defs>` entry + a `fill="url(#…)"` ref.
|
|
10
25
|
* Solid fills produce no defs and return the colour directly. */
|
|
11
26
|
export function renderFill(fill) {
|
|
27
|
+
// #L — re-validate the per-fill blend mode once (runtime T4 arm). An absent
|
|
28
|
+
// or out-of-enum value yields `undefined` → the layer renders `normal`.
|
|
29
|
+
const mixBlendMode = parseBlendMode(fill.blendMode);
|
|
12
30
|
if (fill.kind === "solid") {
|
|
13
|
-
// Solid fill — no defs needed, just hand the colour to fill.
|
|
14
|
-
//
|
|
15
|
-
// so
|
|
16
|
-
|
|
31
|
+
// Solid fill — no defs needed, just hand the colour to fill. A solid fill
|
|
32
|
+
// carries its OWN opacity (Figma per-paint alpha, e.g. the bg-texture tiles
|
|
33
|
+
// at 6% white) ; fold it into the colour so the SVG path actually renders
|
|
34
|
+
// at that alpha instead of full-strength (the tiles came out 16× too bright
|
|
35
|
+
// pre-mask, near-black post-mask).
|
|
36
|
+
const ref = fill.opacity !== undefined ? cssWithOpacity(fill.color, fill.opacity) : fill.color;
|
|
37
|
+
return { defs: [], ref, mixBlendMode };
|
|
38
|
+
}
|
|
39
|
+
if (fill.kind === "image") {
|
|
40
|
+
// LSML 1.2 §3.2 — image-fill on a shape. Rendered as an SVG <pattern>
|
|
41
|
+
// holding a single <image> that fills the object bounding box ;
|
|
42
|
+
// `preserveAspectRatio` reproduces the closed-enum `objectFit`. `src`
|
|
43
|
+
// is pre-gated (T1/T2) by `gateImageFills`, so it is safe to place on
|
|
44
|
+
// the SVG <image href>. No bundle-derived markup is interpolated — only
|
|
45
|
+
// the URL string and closed-enum-derived attribute values.
|
|
46
|
+
const imgId = nextGradientId();
|
|
47
|
+
const par = objectFitToPreserveAspectRatio(fill.objectFit);
|
|
48
|
+
const defs = [
|
|
49
|
+
_jsx("pattern", { id: imgId, patternContentUnits: "objectBoundingBox", width: "1", height: "1", children: _jsx("image", { href: fill.src, width: "1", height: "1", preserveAspectRatio: par }) }, imgId),
|
|
50
|
+
];
|
|
51
|
+
return { defs, ref: `url(#${imgId})`, mixBlendMode };
|
|
17
52
|
}
|
|
18
53
|
const id = nextGradientId();
|
|
19
54
|
if (fill.kind === "linear-gradient") {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
55
|
+
let x1, y1, x2, y2;
|
|
56
|
+
// Honour the Figma `gradientTransform` : the gradient axis (offset 0 → 1) is
|
|
57
|
+
// column 0 = (a, b) of the matrix, in the SVG's y-down space. `angle_deg`
|
|
58
|
+
// alone ignored it and mis-oriented the picto/caramel gradients (too red).
|
|
59
|
+
const t = fill.transform;
|
|
60
|
+
if (Array.isArray(t) && t.length === 6 && Number.isFinite(t[0]) && Number.isFinite(t[1])) {
|
|
61
|
+
const len = Math.hypot(t[0], t[1]) || 1;
|
|
62
|
+
const an = t[0] / len;
|
|
63
|
+
const bn = t[1] / len;
|
|
64
|
+
x1 = 0.5 - 0.5 * an;
|
|
65
|
+
y1 = 0.5 - 0.5 * bn;
|
|
66
|
+
x2 = 0.5 + 0.5 * an;
|
|
67
|
+
y2 = 0.5 + 0.5 * bn;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// angle_deg : 0 = bottom-to-top per §4.12.
|
|
71
|
+
const angle = fill.angle_deg ?? 0;
|
|
72
|
+
const rad = ((angle - 90) * Math.PI) / 180; // 0° → x1=0,y1=1 (bottom-up)
|
|
73
|
+
x1 = 0.5 - 0.5 * Math.cos(rad);
|
|
74
|
+
y1 = 0.5 - 0.5 * Math.sin(rad);
|
|
75
|
+
x2 = 0.5 + 0.5 * Math.cos(rad);
|
|
76
|
+
y2 = 0.5 + 0.5 * Math.sin(rad);
|
|
77
|
+
}
|
|
28
78
|
const defs = [
|
|
29
79
|
_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),
|
|
30
80
|
];
|
|
31
|
-
return { defs, ref: `url(#${id})
|
|
81
|
+
return { defs, ref: `url(#${id})`, mixBlendMode };
|
|
32
82
|
}
|
|
33
83
|
// radial-gradient
|
|
34
84
|
const cx = fill.center?.x ?? 0.5;
|
|
@@ -37,20 +87,102 @@ export function renderFill(fill) {
|
|
|
37
87
|
const defs = [
|
|
38
88
|
_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),
|
|
39
89
|
];
|
|
40
|
-
return { defs, ref: `url(#${id})
|
|
90
|
+
return { defs, ref: `url(#${id})`, mixBlendMode };
|
|
41
91
|
}
|
|
42
|
-
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
92
|
+
/** Map a closed-enum `objectFit` to the CSS `background-size` keyword that
|
|
93
|
+
* reproduces the same fit for a `background-image`. `fill`/`none`/`scale-
|
|
94
|
+
* down` have no exact 1:1 `background-size` keyword — we approximate with
|
|
95
|
+
* the nearest safe keyword (all from the closed enum, never free input). */
|
|
96
|
+
function objectFitToBackgroundSize(fit) {
|
|
97
|
+
switch (fit) {
|
|
98
|
+
case "contain":
|
|
99
|
+
case "scale-down":
|
|
100
|
+
return "contain";
|
|
101
|
+
case "none":
|
|
102
|
+
return "auto";
|
|
103
|
+
case "fill":
|
|
104
|
+
return "100% 100%";
|
|
105
|
+
case "cover":
|
|
106
|
+
default:
|
|
107
|
+
return "cover";
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Map a closed-enum `objectFit` to the SVG `<image preserveAspectRatio>`
|
|
111
|
+
* value that reproduces the same fit inside a pattern tile. Every returned
|
|
112
|
+
* value is a fixed literal (closed enum → fixed mapping) — never free
|
|
113
|
+
* input reaching an SVG attribute. */
|
|
114
|
+
function objectFitToPreserveAspectRatio(fit) {
|
|
115
|
+
switch (fit) {
|
|
116
|
+
case "contain":
|
|
117
|
+
case "scale-down":
|
|
118
|
+
return "xMidYMid meet";
|
|
119
|
+
case "fill":
|
|
120
|
+
return "none";
|
|
121
|
+
case "none":
|
|
122
|
+
return "xMidYMid meet";
|
|
123
|
+
case "cover":
|
|
124
|
+
default:
|
|
125
|
+
return "xMidYMid slice";
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** Compile an array of Fill into background CSS usable on a `<div>` (frame
|
|
129
|
+
* backgrounds — non-SVG context). Returns `backgroundImage` plus, when an
|
|
130
|
+
* image-fill is present, the matching `backgroundSize`/`backgroundPosition`/
|
|
131
|
+
* `backgroundRepeat`. Stops use percentages in CSS gradient syntax.
|
|
132
|
+
*
|
|
133
|
+
* Image-fill `src` MUST already be host/scheme-gated (`gateImageFills`) —
|
|
134
|
+
* `backgroundsToCss` assumes the URL is trusted at this point and only
|
|
135
|
+
* CSS-escapes it for safe interpolation into `url("…")`. */
|
|
45
136
|
export function backgroundsToCss(fills, nodeId) {
|
|
46
137
|
// Per §4.12, fills[0] renders on top — CSS background-image stacks
|
|
47
138
|
// first → top-most. Match by passing in the same order.
|
|
48
|
-
|
|
139
|
+
// #L — keep each layer's validated blend keyword aligned with its CSS
|
|
140
|
+
// layer (a rejected colour drops the layer → drop its blend too), so
|
|
141
|
+
// `background-blend-mode` stays positionally correct.
|
|
142
|
+
const kept = [];
|
|
143
|
+
const layers = [];
|
|
144
|
+
for (const f of fills) {
|
|
145
|
+
const css = fillToCss(f, nodeId);
|
|
146
|
+
if (css) {
|
|
147
|
+
layers.push(css);
|
|
148
|
+
kept.push(f);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
49
151
|
if (layers.length === 0)
|
|
50
152
|
return {};
|
|
51
|
-
|
|
153
|
+
const css = { backgroundImage: layers.join(", ") };
|
|
154
|
+
// #L — per-fill-layer blend on a frame background uses CSS
|
|
155
|
+
// `background-blend-mode` (one keyword per layer, same order). Each value is
|
|
156
|
+
// re-validated against the closed enum (runtime T4 arm) ; an absent/rejected
|
|
157
|
+
// value falls back to `normal`. Emitted only when at least one layer carries
|
|
158
|
+
// a non-`normal` blend, to keep pre-#L output byte-identical (rétro-compat).
|
|
159
|
+
const blends = kept.map((f) => parseBlendMode(f.blendMode) ?? "normal");
|
|
160
|
+
if (blends.some((b) => b !== "normal")) {
|
|
161
|
+
css.backgroundBlendMode = blends.join(", ");
|
|
162
|
+
}
|
|
163
|
+
// When any layer is an image-fill, drive its sizing from the (already
|
|
164
|
+
// validated) objectFit. A single image-fill is the common cover case ;
|
|
165
|
+
// for the first image-fill we set the background sizing for the whole box.
|
|
166
|
+
const firstImage = fills.find((f) => f.kind === "image");
|
|
167
|
+
if (firstImage) {
|
|
168
|
+
css.backgroundSize = objectFitToBackgroundSize(firstImage.objectFit);
|
|
169
|
+
css.backgroundPosition = "center";
|
|
170
|
+
css.backgroundRepeat = "no-repeat";
|
|
171
|
+
}
|
|
172
|
+
return css;
|
|
173
|
+
}
|
|
174
|
+
/** CSS-escape a (already host-gated) URL for safe interpolation into a
|
|
175
|
+
* `url("…")` token — escape backslash and the double-quote that would
|
|
176
|
+
* otherwise break out of the quoted string. */
|
|
177
|
+
function cssUrl(src) {
|
|
178
|
+
return `url("${src.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}")`;
|
|
52
179
|
}
|
|
53
180
|
function fillToCss(fill, nodeId) {
|
|
181
|
+
if (fill.kind === "image") {
|
|
182
|
+
// `src` is pre-gated (T1/T2) by `gateImageFills` ; only escape it for
|
|
183
|
+
// the CSS string context here.
|
|
184
|
+
return cssUrl(fill.src);
|
|
185
|
+
}
|
|
54
186
|
// RC#11 — every colour interpolated into an inline CSS string MUST
|
|
55
187
|
// pass the strict parser first (fills/stops arrive from untrusted
|
|
56
188
|
// bundles AND live LSDP deltas). A rejected colour drops the whole
|
|
@@ -61,8 +193,12 @@ function fillToCss(fill, nodeId) {
|
|
|
61
193
|
warnRejectedColor("fill.color", nodeId);
|
|
62
194
|
return null;
|
|
63
195
|
}
|
|
196
|
+
// A solid fill carries its OWN opacity (Figma layer-fill alpha, e.g. a 14%
|
|
197
|
+
// white pill) — apply it like a gradient stop's, else the layer renders
|
|
198
|
+
// fully opaque and hides whatever it overlays.
|
|
199
|
+
const c = fill.opacity !== undefined ? cssWithOpacity(color, fill.opacity) : color;
|
|
64
200
|
// Wrap solid in linear-gradient so it can stack with other layers.
|
|
65
|
-
return `linear-gradient(${
|
|
201
|
+
return `linear-gradient(${c}, ${c})`;
|
|
66
202
|
}
|
|
67
203
|
const safeStops = [];
|
|
68
204
|
for (const s of fill.stops) {
|
|
@@ -76,7 +212,17 @@ function fillToCss(fill, nodeId) {
|
|
|
76
212
|
}
|
|
77
213
|
const stops = safeStops.join(", ");
|
|
78
214
|
if (fill.kind === "linear-gradient") {
|
|
79
|
-
|
|
215
|
+
let angle = fill.angle_deg ?? 0;
|
|
216
|
+
// Honour the Figma `gradientTransform` when present : the gradient's main
|
|
217
|
+
// axis (offset 0 → 1) is column 0 = (a, b) of the 2×3 matrix. CSS `Ndeg`
|
|
218
|
+
// measures clockwise from "up" and screen-y points down, so that direction
|
|
219
|
+
// maps to `atan2(a, -b)`. `angle_deg` alone ignored the matrix and rendered
|
|
220
|
+
// the Cover's warm base as a 270° (horizontal) wash instead of the real 180°
|
|
221
|
+
// (warm at top) — leaving the top-right black under the Ruby20 hard-light.
|
|
222
|
+
const t = fill.transform;
|
|
223
|
+
if (Array.isArray(t) && t.length === 6 && Number.isFinite(t[0]) && Number.isFinite(t[1])) {
|
|
224
|
+
angle = ((Math.atan2(t[0], -t[1]) * 180) / Math.PI + 360) % 360;
|
|
225
|
+
}
|
|
80
226
|
return `linear-gradient(${angle}deg, ${stops})`;
|
|
81
227
|
}
|
|
82
228
|
// radial-gradient
|
|
@@ -110,6 +256,13 @@ function cssWithOpacity(color, opacity) {
|
|
|
110
256
|
export function sanitizeFills(fills, field, nodeId) {
|
|
111
257
|
const out = [];
|
|
112
258
|
for (const fill of fills) {
|
|
259
|
+
// Image-fills carry no colour — they are colour-clean by construction.
|
|
260
|
+
// Their `src` is gated separately (`gateImageFills`, T1/T2) ; pass them
|
|
261
|
+
// through here unchanged so `sanitizeFills` only owns colour validation.
|
|
262
|
+
if (fill.kind === "image") {
|
|
263
|
+
out.push(fill);
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
113
266
|
if (fill.kind === "solid") {
|
|
114
267
|
const color = parseCssColor(fill.color);
|
|
115
268
|
if (color === null) {
|
|
@@ -151,12 +304,58 @@ export function parseFills(value, field, nodeId) {
|
|
|
151
304
|
}
|
|
152
305
|
}
|
|
153
306
|
}
|
|
154
|
-
|
|
307
|
+
// Image-fill `objectFit` is re-validated against the closed enum here
|
|
308
|
+
// (Bastion T4 runtime arm) : a hostile / unknown value is dropped with a
|
|
309
|
+
// diagnostic and the fill falls back to the default fit — never passed
|
|
310
|
+
// through to inline CSS. `src` is NOT gated here (it needs the host
|
|
311
|
+
// allowlist) — `gateImageFills` does that downstream, before render.
|
|
312
|
+
return value.filter(isFill).map((v) => {
|
|
313
|
+
let fill = v;
|
|
314
|
+
// #L — re-validate a per-fill `blendMode` against the closed enum (runtime
|
|
315
|
+
// T4 arm). An out-of-enum value is diagnosed + stripped (the layer falls
|
|
316
|
+
// back to `normal`), never passed through to inline CSS. Applies to every
|
|
317
|
+
// fill kind.
|
|
318
|
+
if (fill.blendMode !== undefined && parseBlendMode(fill.blendMode) === undefined) {
|
|
319
|
+
emitDiagnostic(nodeId, field !== undefined ? `${field}.blendMode` : "fill.blendMode", "is not a recognised mix-blend-mode ; falling back to normal (ADR 002 §3.2)");
|
|
320
|
+
const { blendMode: _drop, ...rest } = fill;
|
|
321
|
+
fill = rest;
|
|
322
|
+
}
|
|
323
|
+
if (fill.kind !== "image")
|
|
324
|
+
return fill;
|
|
325
|
+
if (fill.objectFit === undefined)
|
|
326
|
+
return fill;
|
|
327
|
+
const fit = parseObjectFitRuntime(fill.objectFit);
|
|
328
|
+
if (fit === undefined) {
|
|
329
|
+
emitDiagnostic(nodeId, field !== undefined ? `${field}.objectFit` : "fill.objectFit", "is not a recognised object-fit ; falling back to default (ADR 002 §3.2)");
|
|
330
|
+
const { objectFit: _drop, ...rest } = fill;
|
|
331
|
+
return rest;
|
|
332
|
+
}
|
|
333
|
+
return { ...fill, objectFit: fit };
|
|
334
|
+
});
|
|
155
335
|
}
|
|
156
336
|
function isFill(v) {
|
|
157
337
|
if (typeof v !== "object" || v === null)
|
|
158
338
|
return false;
|
|
159
339
|
const k = v.kind;
|
|
160
|
-
|
|
340
|
+
if (k === "solid" || k === "linear-gradient" || k === "radial-gradient")
|
|
341
|
+
return true;
|
|
342
|
+
// An image-fill must carry a string `src` to be structurally valid ; a
|
|
343
|
+
// malformed image entry is dropped like any other unrenderable fill.
|
|
344
|
+
return k === "image" && typeof v.src === "string";
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Drop every image-fill whose `src` fails the host/scheme allowlist
|
|
348
|
+
* (Bastion T1/T2), BEFORE any image-fill reaches the DOM. A rejected
|
|
349
|
+
* image-fill is omitted entirely (never a passthrough URL) with an
|
|
350
|
+
* R9-clean diagnostic emitted by `gateSrc`. Non-image fills pass through
|
|
351
|
+
* untouched. Call this once, after `parseFills`, with the active
|
|
352
|
+
* `allowedHosts` from `useAllowedHosts()`.
|
|
353
|
+
*/
|
|
354
|
+
export function gateImageFills(fills, allowedHosts, field, nodeId) {
|
|
355
|
+
return fills.filter((fill) => {
|
|
356
|
+
if (fill.kind !== "image")
|
|
357
|
+
return true;
|
|
358
|
+
return gateSrc(fill.src, allowedHosts, `${field}.src`, nodeId) !== undefined;
|
|
359
|
+
});
|
|
161
360
|
}
|
|
162
361
|
//# sourceMappingURL=fill.js.map
|
package/dist/render/fill.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill.js","sourceRoot":"","sources":["../../src/render/fill.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fill.js","sourceRoot":"","sources":["../../src/render/fill.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { ReactElement, CSSProperties } from "react";
|
|
2
|
+
/** Resolve a shape `mask.source.ref` to its inlined mask-coverage geometry
|
|
3
|
+
* (#K). The Tree supplies this from its one-pass `id → shape` index ; it
|
|
4
|
+
* returns `null` for a PENDING ref (id absent from the index) so the mask is
|
|
5
|
+
* omitted, never crashing. The resolver inlines ONLY the referenced shape's
|
|
6
|
+
* geometry — never its own mask (anti-cycle, profondeur = 1). */
|
|
7
|
+
export type ShapeRefResolver = (ref: string) => ReactElement | null;
|
|
8
|
+
/** Feather pad (px). The group/shape mask wrapper's `overflow:hidden` box is
|
|
9
|
+
* grown by this on every side (tree.tsx, `inset:-PAD`) and the coverage is
|
|
10
|
+
* shifted back by the same amount (buildMask) so a BLURRED mask rim isn't
|
|
11
|
+
* re-cut into a hard square at the box edge. Generous enough for the
|
|
12
|
+
* bg-texture ellipse's ~3σ (53.88 CSS sigma) feather. Sharp masks are
|
|
13
|
+
* unaffected (their alpha-0 region simply sits inside the grown box). */
|
|
14
|
+
export declare const MASK_FEATHER_PAD = 180;
|
|
15
|
+
/** A typed mask source, the only shapes the builder accepts. Anything else
|
|
16
|
+
* (string, missing discriminant, extra markup) is rejected. A `group` source
|
|
17
|
+
* (#O) references a GROUP/FRAME container by id, composited downstream. */
|
|
18
|
+
export type MaskSource = {
|
|
19
|
+
kind: "shape";
|
|
20
|
+
ref: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: "image";
|
|
23
|
+
src: string;
|
|
24
|
+
srcRect?: {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
w: number;
|
|
28
|
+
h: number;
|
|
29
|
+
};
|
|
30
|
+
} | {
|
|
31
|
+
kind: "group";
|
|
32
|
+
ref: string;
|
|
33
|
+
};
|
|
34
|
+
/** The typed mask spec as it reaches the runtime (compiler-lowered or a live
|
|
35
|
+
* LSDP delta). All fields are re-validated here — nothing is trusted. */
|
|
36
|
+
export interface MaskSpec {
|
|
37
|
+
source: MaskSource;
|
|
38
|
+
type: "alpha" | "luminance";
|
|
39
|
+
op: "intersect" | "subtract" | "union";
|
|
40
|
+
position?: {
|
|
41
|
+
x: number;
|
|
42
|
+
y: number;
|
|
43
|
+
};
|
|
44
|
+
size?: {
|
|
45
|
+
w: number;
|
|
46
|
+
h: number;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** What a successfully-built mask contributes to the render. */
|
|
50
|
+
export interface BuiltMask {
|
|
51
|
+
/** The `<mask>` element to drop into the masked element's SVG `<defs>`. */
|
|
52
|
+
def: ReactElement;
|
|
53
|
+
/** Inline style applying the mask to the masked subtree's wrapper. */
|
|
54
|
+
style: CSSProperties;
|
|
55
|
+
/** The generated mask id (for `url(#…)` wiring and test assertions). */
|
|
56
|
+
id: string;
|
|
57
|
+
/** True when the coverage is FEATHERED (a blurred edge) : the masked wrapper
|
|
58
|
+
* must grow by MASK_FEATHER_PAD (tree.tsx) so the soft rim isn't re-cut into a
|
|
59
|
+
* square, and the coverage here is pre-shifted by the same pad. A sharp mask
|
|
60
|
+
* leaves this false and skips the pad entirely (no structural change). */
|
|
61
|
+
feather: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate a loose `mask` value into a strict {@link MaskSpec}, or `null`.
|
|
65
|
+
* Re-runs the closed-enum gates (T4) and the source-shape discriminant ;
|
|
66
|
+
* a malformed mask is dropped whole (it cannot be partially honoured).
|
|
67
|
+
*/
|
|
68
|
+
export declare function parseMaskSpec(value: unknown, nodeId: string | undefined): MaskSpec | null;
|
|
69
|
+
/**
|
|
70
|
+
* Build a `<mask>` element + the CSS reference from a typed mask spec.
|
|
71
|
+
* Returns `null` when the mask must be omitted (bad enum, rejected host,
|
|
72
|
+
* unsafe ref) — the caller renders the subtree unmasked.
|
|
73
|
+
*
|
|
74
|
+
* @param mask the typed spec (already enum-checked by parseMaskSpec,
|
|
75
|
+
* but re-checked here so the builder is safe standalone).
|
|
76
|
+
* @param allowedHosts the bundle's `assets.allowedHosts` ; an image source is
|
|
77
|
+
* gated against it (T1/T2) before reaching `<image href>`.
|
|
78
|
+
* @param nodeId for diagnostics (never carries a value, R9).
|
|
79
|
+
* @param resolveShape resolves a shape `mask.source.ref` to its inlined
|
|
80
|
+
* coverage geometry (#K). Omitted / returns `null` ⇒ the
|
|
81
|
+
* shape source is pending → the whole mask is omitted.
|
|
82
|
+
*/
|
|
83
|
+
export declare function buildMask(mask: MaskSpec, allowedHosts: readonly string[] | undefined, nodeId: string | undefined, resolveShape?: ShapeRefResolver, boxSize?: {
|
|
84
|
+
w?: number;
|
|
85
|
+
h?: number;
|
|
86
|
+
}, feather?: boolean): BuiltMask | null;
|
|
87
|
+
//# sourceMappingURL=mask.d.ts.map
|