@pnlight/sdk-react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,69 @@
1
+ const IMPACT_STYLES = new Set([
2
+ "light",
3
+ "medium",
4
+ "heavy",
5
+ "soft",
6
+ "rigid"
7
+ ]);
8
+ const NOTIFICATION_TYPES = new Set(["success", "warning", "error"]);
9
+ /**
10
+ * Web is only a markup preview, so it records native haptic actions instead of
11
+ * trying to emulate them through the inconsistent Vibration API.
12
+ */
13
+ export function handleHapticUrl(rawUrl, logId, log) {
14
+ let url;
15
+ try {
16
+ url = new URL(rawUrl);
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ if (url.protocol !== "pnlight:" || url.hostname !== "haptic") {
22
+ return false;
23
+ }
24
+ const command = url.pathname.replace(/^\/+|\/+$/g, "");
25
+ switch (command) {
26
+ case "impact": {
27
+ const requestedStyle = url.searchParams.get("style")?.toLowerCase() ?? "medium";
28
+ const style = IMPACT_STYLES.has(requestedStyle) ? requestedStyle : "medium";
29
+ const requestedIntensity = url.searchParams.get("intensity");
30
+ const parsedIntensity = requestedIntensity == null
31
+ ? null
32
+ : Number(requestedIntensity);
33
+ const intensity = parsedIntensity != null && Number.isFinite(parsedIntensity)
34
+ ? Math.min(1, Math.max(0, parsedIntensity))
35
+ : null;
36
+ log(`Haptic preview: impact · ${style}${intensity == null ? "" : ` · intensity ${intensity}`}`, logId);
37
+ break;
38
+ }
39
+ case "selection":
40
+ log("Haptic preview: selection", logId);
41
+ break;
42
+ case "notification": {
43
+ const requestedType = url.searchParams.get("type")?.toLowerCase() ?? "success";
44
+ const type = NOTIFICATION_TYPES.has(requestedType) ? requestedType : "success";
45
+ log(`Haptic preview: notification · ${type}`, logId);
46
+ break;
47
+ }
48
+ case "start": {
49
+ const pattern = url.searchParams.get("pattern")?.trim();
50
+ log(pattern
51
+ ? `Core Haptics preview: start · ${pattern}`
52
+ : "Core Haptics preview: start · missing pattern", logId);
53
+ break;
54
+ }
55
+ case "stop": {
56
+ const pattern = url.searchParams.get("pattern")?.trim();
57
+ log(pattern
58
+ ? `Core Haptics preview: stop · ${pattern}`
59
+ : "Core Haptics preview: stop all", logId);
60
+ break;
61
+ }
62
+ default:
63
+ log(`Haptic preview: unsupported command · ${command || "(empty)"}`, logId);
64
+ }
65
+ // PNLight owns this protocol. Even malformed/unsupported haptic commands
66
+ // must not escape into DivKit's generic custom-action handling.
67
+ return true;
68
+ }
69
+ //# sourceMappingURL=haptics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"haptics.js","sourceRoot":"","sources":["../src/haptics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { PNLightDivKit, RemoteUi, type RemoteUiProps } from "./RemoteUi.js";
2
+ export type { PNLightActionEvent, PNLightActionKind, RemoteUiDocument } from "./runtime.js";
3
+ export type { FlowDocument, FlowPresentation, FlowRoute } from "./flow.js";
4
+ export type { ReferenceSizeConfiguration, SafeAreaConfiguration, SafeAreaEdge, SafeAreaMode } from "./safe-area.js";
5
+ export type { RemoteUiSchemaVersion } from "./schema-version.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,QAAQ,EACR,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACV,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,0BAA0B,EAC1B,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { PNLightDivKit, RemoteUi } from "./RemoteUi.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,QAAQ,EAET,MAAM,eAAe,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { render as renderDivKit } from "@divkitframework/divkit/client";
2
+ import { type RemoteUiSchemaVersion } from "./schema-version.js";
3
+ type DivKitRenderOptions = Parameters<typeof renderDivKit>[0];
4
+ export type PNLightActionKind = "navigation" | "dialog" | "haptic";
5
+ export interface PNLightActionEvent {
6
+ kind: PNLightActionKind;
7
+ url: string;
8
+ logId: string;
9
+ message?: string;
10
+ }
11
+ export type RemoteUiDocument = DivKitRenderOptions["json"] | Record<string, unknown>;
12
+ export type RemoteUiRenderOptions = Omit<DivKitRenderOptions, "target" | "json" | "globalVariablesController" | "customComponents" | "extensions" | "onCustomAction" | "onError"> & {
13
+ target: HTMLElement;
14
+ json: RemoteUiDocument | string;
15
+ customComponents?: DivKitRenderOptions["customComponents"];
16
+ extensions?: DivKitRenderOptions["extensions"];
17
+ onCustomAction?: DivKitRenderOptions["onCustomAction"];
18
+ onError?: DivKitRenderOptions["onError"];
19
+ onPNLightAction?: (event: PNLightActionEvent) => void;
20
+ };
21
+ export interface MountedRemoteUi {
22
+ readonly schemaVersion: RemoteUiSchemaVersion;
23
+ destroy(): void;
24
+ }
25
+ export declare function mountRemoteUi(options: RemoteUiRenderOptions): MountedRemoteUi;
26
+ export {};
27
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,IAAI,YAAY,EACvB,MAAM,gCAAgC,CAAC;AAaxC,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAE7B,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAG9D,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,iBAAiB,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GACxB,mBAAmB,CAAC,MAAM,CAAC,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,mBAAmB,EACjB,QAAQ,GACR,MAAM,GACN,2BAA2B,GAC3B,kBAAkB,GAClB,YAAY,GACZ,gBAAgB,GAChB,SAAS,CACZ,GAAG;IACF,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IAC3D,UAAU,CAAC,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAC/C,cAAc,CAAC,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACvD,CAAC;AAMF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC;IAC9C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,eAAe,CAE7E"}
@@ -0,0 +1,192 @@
1
+ import { lottieExtensionBuilder, render as renderDivKit } from "@divkitframework/divkit/client";
2
+ import lottie from "lottie-web";
3
+ import { registerPNLightComponents } from "./custom-components.js";
4
+ import { PNLightWebDialogs, readDialogs } from "./dialogs.js";
5
+ import { isFlowDocument, PNLightWebFlow } from "./flow.js";
6
+ import { handleHapticUrl } from "./haptics.js";
7
+ import { configureSafeArea, disconnectSafeArea, readReferenceSize } from "./safe-area.js";
8
+ import { resolveSchemaVersion } from "./schema-version.js";
9
+ export function mountRemoteUi(options) {
10
+ return new PNLightRemoteUiRuntime(options);
11
+ }
12
+ class PNLightRemoteUiRuntime {
13
+ schemaVersion;
14
+ target;
15
+ options;
16
+ instance = null;
17
+ activeFlow = null;
18
+ activeDialogs = null;
19
+ destroyed = false;
20
+ routeCounter = 0;
21
+ constructor(options) {
22
+ this.options = options;
23
+ this.target = options.target;
24
+ const json = parseDocument(options.json);
25
+ this.schemaVersion = resolveSchemaVersion(json);
26
+ this.target.classList.add("pnlight-remote-ui");
27
+ this.target.addEventListener("pnlight-action", this.handleComponentAction);
28
+ try {
29
+ this.render(json);
30
+ }
31
+ catch (error) {
32
+ this.reportError(asError(error));
33
+ }
34
+ }
35
+ destroy() {
36
+ if (this.destroyed)
37
+ return;
38
+ this.destroyed = true;
39
+ this.instance?.$destroy();
40
+ this.activeDialogs?.destroy();
41
+ this.activeFlow = null;
42
+ this.activeDialogs = null;
43
+ this.instance = null;
44
+ this.target.removeEventListener("pnlight-action", this.handleComponentAction);
45
+ disconnectSafeArea(this.target);
46
+ this.target.classList.remove("pnlight-remote-ui", "pnlight-flow-host");
47
+ this.target.replaceChildren();
48
+ }
49
+ render(json) {
50
+ if (this.schemaVersion < 2 && isFlowLike(json)) {
51
+ throw new Error('PNLight flow documents require "schemaVersion": 2.');
52
+ }
53
+ this.activeDialogs = this.schemaVersion >= 2
54
+ ? new PNLightWebDialogs(readDialogs(json), (url, logId) => this.emitPNLightAction("dialog", url, logId))
55
+ : null;
56
+ if (isFlowDocument(json)) {
57
+ configureSafeArea(this.target, { mode: "edge_to_edge" }, undefined, this.schemaVersion);
58
+ this.activeFlow = new PNLightWebFlow({
59
+ host: this.target,
60
+ document: json,
61
+ schemaVersion: this.schemaVersion,
62
+ renderRoute: (routeOptions) => this.renderDivKitRoute(routeOptions),
63
+ onAction: (url, logId) => {
64
+ this.emitPNLightAction(inferKind(url), url, logId);
65
+ },
66
+ onError: (message) => this.reportError(new Error(message))
67
+ });
68
+ this.instance = this.activeFlow;
69
+ return;
70
+ }
71
+ this.instance = this.renderDivKitRoute({
72
+ target: this.target,
73
+ json,
74
+ id: this.options.id,
75
+ onAction: () => { },
76
+ onError: (message) => this.reportError(new Error(message)),
77
+ safeArea: readSafeArea(json),
78
+ referenceSize: readReferenceSize(json),
79
+ schemaVersion: this.schemaVersion
80
+ });
81
+ }
82
+ renderDivKitRoute(route) {
83
+ const { target: _target, json: _json, onPNLightAction: _onPNLightAction, customComponents: suppliedComponents, extensions: suppliedExtensions, onCustomAction, onError: _onError, ...divKitOptions } = this.options;
84
+ const globalVariablesController = configureSafeArea(route.target, route.safeArea, route.referenceSize, route.schemaVersion);
85
+ const customComponents = new Map(suppliedComponents ?? []);
86
+ for (const [name, description] of registerPNLightComponents()) {
87
+ customComponents.set(name, description);
88
+ }
89
+ const extensions = new Map(suppliedExtensions ?? []);
90
+ extensions.set("lottie", lottieExtensionBuilder(lottie.loadAnimation));
91
+ let routeInstance;
92
+ routeInstance = renderDivKit({
93
+ ...divKitOptions,
94
+ id: route.id || `${this.options.id}-route-${++this.routeCounter}`,
95
+ target: route.target,
96
+ json: route.json,
97
+ pagerChildrenClipEnabled: this.options.pagerChildrenClipEnabled ?? false,
98
+ globalVariablesController,
99
+ customComponents,
100
+ extensions,
101
+ onCustomAction: (action, context) => {
102
+ const url = action.url ?? "";
103
+ const logId = action.log_id ?? "custom_action";
104
+ if (!this.handlePNLightUrl(url, logId, routeInstance)) {
105
+ onCustomAction?.(action, context);
106
+ }
107
+ },
108
+ onError: (details) => {
109
+ route.onError(details.error.message);
110
+ }
111
+ });
112
+ return routeInstance;
113
+ }
114
+ handlePNLightUrl(url, logId, instance) {
115
+ if (this.schemaVersion < 2)
116
+ return false;
117
+ if (this.activeFlow?.handleUrl(url, logId))
118
+ return true;
119
+ if (this.activeDialogs?.handleUrl(url, logId, (action) => {
120
+ instance?.execAction(action);
121
+ })) {
122
+ return true;
123
+ }
124
+ let hapticMessage;
125
+ const handled = handleHapticUrl(url, logId, (message) => {
126
+ hapticMessage = message;
127
+ });
128
+ if (handled) {
129
+ this.emitPNLightAction("haptic", url, logId, hapticMessage);
130
+ }
131
+ return handled;
132
+ }
133
+ handleComponentAction = (event) => {
134
+ const detail = event.detail;
135
+ const url = detail?.url ?? "";
136
+ const logId = detail?.log_id ?? "pnlight_custom_component";
137
+ if (this.handlePNLightUrl(url, logId)) {
138
+ event.preventDefault();
139
+ }
140
+ };
141
+ emitPNLightAction(kind, url, logId, message) {
142
+ this.options.onPNLightAction?.({ kind, url, logId, message });
143
+ }
144
+ reportError(error) {
145
+ const divKitError = Object.assign(error, {
146
+ level: "error",
147
+ additional: {}
148
+ });
149
+ this.options.onError?.({ error: divKitError });
150
+ }
151
+ }
152
+ function parseDocument(value) {
153
+ if (typeof value !== "string")
154
+ return value;
155
+ const parsed = JSON.parse(value);
156
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
157
+ throw new Error("Remote UI JSON must be an object.");
158
+ }
159
+ return parsed;
160
+ }
161
+ function readSafeArea(value) {
162
+ if (!value || typeof value !== "object" || Array.isArray(value))
163
+ return undefined;
164
+ const safeArea = value.safe_area;
165
+ if (!safeArea || typeof safeArea !== "object" || Array.isArray(safeArea)) {
166
+ return undefined;
167
+ }
168
+ return safeArea;
169
+ }
170
+ function isFlowLike(value) {
171
+ return Boolean(value
172
+ && typeof value === "object"
173
+ && !Array.isArray(value)
174
+ && value.type === "flow");
175
+ }
176
+ function inferKind(urlValue) {
177
+ try {
178
+ const url = new URL(urlValue);
179
+ if (url.hostname === "dialog")
180
+ return "dialog";
181
+ if (url.hostname === "haptic")
182
+ return "haptic";
183
+ }
184
+ catch {
185
+ // Flow owns malformed navigation URLs only after successful parsing.
186
+ }
187
+ return "navigation";
188
+ }
189
+ function asError(value) {
190
+ return value instanceof Error ? value : new Error(String(value));
191
+ }
192
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { createGlobalVariablesController } from "@divkitframework/divkit/client";
2
+ import type { RemoteUiSchemaVersion } from "./schema-version.js";
3
+ export type SafeAreaMode = "inset" | "content" | "edge_to_edge";
4
+ export type SafeAreaEdge = "top" | "bottom" | "left" | "right";
5
+ export interface SafeAreaConfiguration {
6
+ mode?: SafeAreaMode;
7
+ edges?: SafeAreaEdge[];
8
+ }
9
+ export interface ReferenceSizeConfiguration {
10
+ width: number;
11
+ height: number;
12
+ }
13
+ export declare function disconnectSafeArea(target: HTMLElement): void;
14
+ /**
15
+ * Applies a deterministic portrait-phone safe area for markup testing.
16
+ *
17
+ * Native values depend on the device and presentation. Web deliberately uses
18
+ * fixed values so screenshots and expression debugging are reproducible.
19
+ */
20
+ export declare function configureSafeArea(target: HTMLElement, input?: SafeAreaConfiguration, referenceSize?: ReferenceSizeConfiguration, schemaVersion?: RemoteUiSchemaVersion): ReturnType<typeof createGlobalVariablesController>;
21
+ export declare function readReferenceSize(value: unknown): ReferenceSizeConfiguration | undefined;
22
+ //# sourceMappingURL=safe-area.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-area.d.ts","sourceRoot":"","sources":["../src/safe-area.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAEhC,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,cAAc,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAG5D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,qBAAqB,EAC7B,aAAa,CAAC,EAAE,0BAA0B,EAC1C,aAAa,GAAE,qBAAyB,GACvC,UAAU,CAAC,OAAO,+BAA+B,CAAC,CAyFpD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,0BAA0B,GAAG,SAAS,CAkBxF"}
@@ -0,0 +1,104 @@
1
+ import { createGlobalVariablesController, createVariable } from "@divkitframework/divkit/client";
2
+ const ALL_EDGES = ["top", "bottom", "left", "right"];
3
+ const SIMULATED_INSETS = {
4
+ top: 24,
5
+ bottom: 16,
6
+ left: 0,
7
+ right: 0
8
+ };
9
+ const scaleObservers = new WeakMap();
10
+ export function disconnectSafeArea(target) {
11
+ scaleObservers.get(target)?.disconnect();
12
+ scaleObservers.delete(target);
13
+ }
14
+ /**
15
+ * Applies a deterministic portrait-phone safe area for markup testing.
16
+ *
17
+ * Native values depend on the device and presentation. Web deliberately uses
18
+ * fixed values so screenshots and expression debugging are reproducible.
19
+ */
20
+ export function configureSafeArea(target, input, referenceSize, schemaVersion = 1) {
21
+ disconnectSafeArea(target);
22
+ const extensionsEnabled = schemaVersion >= 2;
23
+ const mode = extensionsEnabled
24
+ ? (input?.mode === "content" || input?.mode === "edge_to_edge"
25
+ ? input.mode
26
+ : "inset")
27
+ : "edge_to_edge";
28
+ const edges = new Set(Array.isArray(input?.edges)
29
+ ? input.edges.filter((edge) => ALL_EDGES.includes(edge))
30
+ : ALL_EDGES);
31
+ target.dataset.safeAreaMode = mode;
32
+ target.style.setProperty("--pnlight-safe-top", mode === "inset" && edges.has("top") ? `${SIMULATED_INSETS.top}px` : "0px");
33
+ target.style.setProperty("--pnlight-safe-bottom", mode === "inset" && edges.has("bottom") ? `${SIMULATED_INSETS.bottom}px` : "0px");
34
+ target.style.setProperty("--pnlight-safe-left", mode === "inset" && edges.has("left") ? `${SIMULATED_INSETS.left}px` : "0px");
35
+ target.style.setProperty("--pnlight-safe-right", mode === "inset" && edges.has("right") ? `${SIMULATED_INSETS.right}px` : "0px");
36
+ const variables = createGlobalVariablesController();
37
+ if (!extensionsEnabled) {
38
+ delete target.dataset.scaleX;
39
+ delete target.dataset.scaleY;
40
+ return variables;
41
+ }
42
+ for (const edge of ALL_EDGES) {
43
+ const value = mode === "content" && edges.has(edge)
44
+ ? SIMULATED_INSETS[edge]
45
+ : 0;
46
+ variables.setVariable(createVariable(`safe_area_${edge}`, "number", value));
47
+ }
48
+ const scaleXVariable = createVariable("scaleX", "number", 1);
49
+ const scaleYVariable = createVariable("scaleY", "number", 1);
50
+ variables.setVariable(scaleXVariable);
51
+ variables.setVariable(scaleYVariable);
52
+ const updateScale = () => {
53
+ const rect = target.getBoundingClientRect();
54
+ const insetWidth = mode === "inset"
55
+ ? (edges.has("left") ? SIMULATED_INSETS.left : 0)
56
+ + (edges.has("right") ? SIMULATED_INSETS.right : 0)
57
+ : 0;
58
+ const insetHeight = mode === "inset"
59
+ ? (edges.has("top") ? SIMULATED_INSETS.top : 0)
60
+ + (edges.has("bottom") ? SIMULATED_INSETS.bottom : 0)
61
+ : 0;
62
+ const availableWidth = Math.max(0, rect.width - insetWidth);
63
+ const availableHeight = Math.max(0, rect.height - insetHeight);
64
+ const hasReference = referenceSize
65
+ && Number.isFinite(referenceSize.width)
66
+ && Number.isFinite(referenceSize.height)
67
+ && referenceSize.width > 0
68
+ && referenceSize.height > 0;
69
+ const scaleX = hasReference && availableWidth > 0
70
+ ? availableWidth / referenceSize.width
71
+ : 1;
72
+ const scaleY = hasReference && availableHeight > 0
73
+ ? availableHeight / referenceSize.height
74
+ : 1;
75
+ target.dataset.scaleX = String(scaleX);
76
+ target.dataset.scaleY = String(scaleY);
77
+ scaleXVariable.setValue(scaleX);
78
+ scaleYVariable.setValue(scaleY);
79
+ };
80
+ updateScale();
81
+ const scaleObserver = new ResizeObserver(updateScale);
82
+ scaleObserver.observe(target);
83
+ scaleObservers.set(target, scaleObserver);
84
+ return variables;
85
+ }
86
+ export function readReferenceSize(value) {
87
+ if (!value || typeof value !== "object" || Array.isArray(value))
88
+ return undefined;
89
+ const candidate = value.referenceSize;
90
+ if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) {
91
+ return undefined;
92
+ }
93
+ const { width, height } = candidate;
94
+ if (typeof width !== "number"
95
+ || typeof height !== "number"
96
+ || !Number.isFinite(width)
97
+ || !Number.isFinite(height)
98
+ || width <= 0
99
+ || height <= 0) {
100
+ return undefined;
101
+ }
102
+ return { width, height };
103
+ }
104
+ //# sourceMappingURL=safe-area.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-area.js","sourceRoot":"","sources":["../src/safe-area.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type RemoteUiSchemaVersion = 1 | 2;
2
+ export declare const LEGACY_SCHEMA_VERSION: RemoteUiSchemaVersion;
3
+ export declare const CURRENT_SCHEMA_VERSION: RemoteUiSchemaVersion;
4
+ /**
5
+ * Missing schema metadata always means the legacy contract.
6
+ *
7
+ * An inherited version is used for nested documents such as routes in a
8
+ * server-authored flow.
9
+ */
10
+ export declare function resolveSchemaVersion(value: unknown, inherited?: RemoteUiSchemaVersion): RemoteUiSchemaVersion;
11
+ //# sourceMappingURL=schema-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-version.d.ts","sourceRoot":"","sources":["../src/schema-version.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,CAAC,CAAC;AAE1C,eAAO,MAAM,qBAAqB,EAAE,qBAAyB,CAAC;AAC9D,eAAO,MAAM,sBAAsB,EAAE,qBAAyB,CAAC;AAE/D;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,SAAS,GAAE,qBAA6C,GACvD,qBAAqB,CAevB"}
@@ -0,0 +1,30 @@
1
+ export const LEGACY_SCHEMA_VERSION = 1;
2
+ export const CURRENT_SCHEMA_VERSION = 2;
3
+ /**
4
+ * Missing schema metadata always means the legacy contract.
5
+ *
6
+ * An inherited version is used for nested documents such as routes in a
7
+ * server-authored flow.
8
+ */
9
+ export function resolveSchemaVersion(value, inherited = LEGACY_SCHEMA_VERSION) {
10
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
11
+ return inherited;
12
+ }
13
+ const raw = value.schemaVersion;
14
+ if (raw === undefined)
15
+ return inherited;
16
+ if (raw === 1 || raw === 2) {
17
+ return raw;
18
+ }
19
+ throw new Error(`Unsupported Remote UI schemaVersion ${formatVersion(raw)}. `
20
+ + `This preview supports schemaVersion 1 and 2.`);
21
+ }
22
+ function formatVersion(value) {
23
+ if (typeof value === "string")
24
+ return JSON.stringify(value);
25
+ if (typeof value === "number" || typeof value === "boolean") {
26
+ return String(value);
27
+ }
28
+ return JSON.stringify(value) ?? String(value);
29
+ }
30
+ //# sourceMappingURL=schema-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-version.js","sourceRoot":"","sources":["../src/schema-version.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAA0B,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAA0B,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAc,EACd,YAAmC,qBAAqB;IAExD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAI,KAAqC,CAAC,aAAa,CAAC;IACjE,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,IAAI,KAAK,CACb,uCAAuC,aAAa,CAAC,GAAG,CAAC,IAAI;UACzD,8CAA8C,CACnD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC"}