@wix/himalaya-cli 0.1579.0 → 0.1581.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/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/app-config.d.ts +18 -3
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/builder.d.ts +3 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/motion/src/index.d.ts +51 -5
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/network/src/index.d.ts +39 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/sdk-types/src/capabilities.generated.d.ts +2 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/webview-page/src/capabilities.generated.d.ts +2 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +12 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/validator.d.ts +6 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/media/src/index.d.ts +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/media/src/rendition.d.ts +42 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/audio-record.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calendar.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calls.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/contacts.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/location.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/motion.mjs +23 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/network.mjs +45 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/photos.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdk-types.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdui.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/tasks.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-media.mjs +78 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/package.json +4 -0
- package/dist/cli.mjs +9144 -7459
- package/dist/preview-assets.generated.bin +0 -0
- package/dist/quickjs-intl.js +462 -0
- package/dist/quickjs-web-globals.js +540 -0
- package/dist/quickjs-worker-entry.js +313 -0
- package/guides/app-config.md +1 -1
- package/guides/component-reference.json +5 -3
- package/guides/component-reference.md +10 -2
- package/guides/designing-himi-screens.md +24 -0
- package/guides/himi-json-output.md +30 -1
- package/guides/importable-sdks.md +1 -0
- package/guides/one-app-section-mappings.md +4 -5
- package/guides/one-app-to-himi-app.md +214 -6
- package/guides/one-app-viewer.md +2 -2
- package/guides/sdk-reference.json +74 -7
- package/guides/tier-5-add-a-screen.md +32 -0
- package/guides/web-page-sdk-reference.md +1 -0
- package/package.json +3 -2
- package/templates/beauty-salon/dev/index.ts +197 -304
- package/templates/beauty-salon/tier5-src/himi-store-product/index.ts +44 -13
- package/templates/branded-lite/dev/index.ts +197 -304
- package/templates/branded-lite/l10n/en.json +2 -2
- package/templates/branded-lite/tier5-src/himi-store-product/index.ts +49 -17
- package/templates/gym-fitness/dev/index.ts +197 -304
- package/templates/gym-fitness/tier5-src/himi-store-product/index.ts +44 -13
- package/templates/portfolio-creative/dev/index.ts +197 -304
- package/templates/portfolio-creative/tier5-src/himi-store-product/index.ts +44 -13
- package/templates/retail-store/dev/index.ts +197 -304
- package/templates/retail-store/tier5-src/himi-store-product/index.ts +49 -17
|
@@ -16,6 +16,8 @@ export interface LinkableScreen {
|
|
|
16
16
|
paramKeys: string[];
|
|
17
17
|
parentScreenId: string;
|
|
18
18
|
tabId: string;
|
|
19
|
+
/** #4656 — an external link to this screen asks for a sign-in first. Always served (false by default). */
|
|
20
|
+
requiresAuth: boolean;
|
|
19
21
|
}
|
|
20
22
|
export interface FrogTelemetryConfig {
|
|
21
23
|
src: number;
|
|
@@ -234,6 +236,16 @@ export interface NavBundleContext {
|
|
|
234
236
|
serverBaseUrl: string;
|
|
235
237
|
bundleIntegrity(bundleName: string): string | null;
|
|
236
238
|
}
|
|
239
|
+
/** #4656 — `requiresAuth: true` on a linkable screen of an app with no `auth` block can never be
|
|
240
|
+
* satisfied: there is no sign-in to present, so the native coordinator applies the link as if the
|
|
241
|
+
* flag were unset. One message per such screen; empty when nothing is wrong. A warning, never a
|
|
242
|
+
* failure — the link still opens. */
|
|
243
|
+
export declare function requiresAuthLinkableProblems(auth: {
|
|
244
|
+
providerId?: string;
|
|
245
|
+
} | null | undefined, linkables: readonly {
|
|
246
|
+
screenId: string;
|
|
247
|
+
requiresAuth?: boolean;
|
|
248
|
+
}[] | undefined): string[];
|
|
237
249
|
/** The push block an app serves, and what a derived route table could not cover. */
|
|
238
250
|
export interface ServedPush {
|
|
239
251
|
push?: import("@wix/himalaya/core").PushConfig;
|
|
@@ -289,20 +301,23 @@ export interface AppConfigDocument {
|
|
|
289
301
|
* `/v1/boot` uses this too, so the first-paint optimization cannot drift from
|
|
290
302
|
* the authoritative per-document fallback in locale handling, overrides, or
|
|
291
303
|
* navigation-bundle expansion. */
|
|
292
|
-
/** Every linkable-screen entry with all
|
|
293
|
-
* shipped before #3318 decode a linkable screen with
|
|
294
|
-
* NavigationConfig when one is missing, so nothing served may carry a partial entry.
|
|
304
|
+
/** Every linkable-screen entry with all its fields — the defaults Kotlin and Swift apply. Binaries
|
|
305
|
+
* shipped before #3318 decode a linkable screen with the first five REQUIRED and drop the whole
|
|
306
|
+
* NavigationConfig when one is missing, so nothing served may carry a partial entry.
|
|
307
|
+
* `requiresAuth` (#4656) is newer: older binaries ignore the unknown key, newer ones default it. */
|
|
295
308
|
export declare function completeLinkableScreens<T extends {
|
|
296
309
|
screenId: string;
|
|
297
310
|
isPublic?: boolean;
|
|
298
311
|
paramKeys?: string[];
|
|
299
312
|
parentScreenId?: string;
|
|
300
313
|
tabId?: string;
|
|
314
|
+
requiresAuth?: boolean;
|
|
301
315
|
}>(list: readonly T[]): (T & {
|
|
302
316
|
isPublic: boolean;
|
|
303
317
|
paramKeys: string[];
|
|
304
318
|
parentScreenId: string;
|
|
305
319
|
tabId: string;
|
|
320
|
+
requiresAuth: boolean;
|
|
306
321
|
})[];
|
|
307
322
|
/** A merged (overridden) config with its linkable screens completed — ONE rule for every place that
|
|
308
323
|
* shows or serves the effective config, so the admin view and the device payload cannot diverge. */
|
|
@@ -528,6 +528,7 @@ export declare function button(props: {
|
|
|
528
528
|
leadingIcon?: string;
|
|
529
529
|
trailingIcon?: string;
|
|
530
530
|
loading?: boolean;
|
|
531
|
+
loadingPath?: string;
|
|
531
532
|
size?: "sm" | "md" | "lg";
|
|
532
533
|
fullWidth?: boolean;
|
|
533
534
|
iconOnly?: boolean;
|
|
@@ -908,6 +909,8 @@ export declare function segmentedControl(props: {
|
|
|
908
909
|
}): Component;
|
|
909
910
|
export declare function carousel(props: {
|
|
910
911
|
items: Component[];
|
|
912
|
+
paged?: boolean;
|
|
913
|
+
currentIndexPath?: string;
|
|
911
914
|
currentIndex?: number;
|
|
912
915
|
onChange?: ActionShape;
|
|
913
916
|
autoplayIntervalMs?: number;
|
package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/motion/src/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PermissionStatus } from "@wix/himalaya/sdk-types";
|
|
2
2
|
export type { PermissionStatus } from "@wix/himalaya/sdk-types";
|
|
3
|
-
/** Which sensor a watch streams. */
|
|
4
|
-
export type MotionSensor = "steps" | "altitude" | "heading";
|
|
3
|
+
/** Which sensor (or gesture event) a watch streams. */
|
|
4
|
+
export type MotionSensor = "steps" | "altitude" | "heading" | "accelerometer" | "gyroscope" | "magnetometer" | "shake" | "tilt" | "significantMotion";
|
|
5
5
|
/**
|
|
6
6
|
* Whether `getStepCount` can answer a PAST window right now, and if not, what would fix it.
|
|
7
7
|
*
|
|
@@ -26,6 +26,18 @@ export interface MotionAvailability {
|
|
|
26
26
|
/** Whether `getStepCount` can answer a past window — see {@link StepHistoryStatus}. An
|
|
27
27
|
* unknown or absent value reads as "unsupported", never as "available". */
|
|
28
28
|
stepHistory: StepHistoryStatus;
|
|
29
|
+
/** Accelerometer present (web: DeviceMotion exists — false on desktop browsers). */
|
|
30
|
+
accelerometer: boolean;
|
|
31
|
+
/** Gyroscope present (web: DeviceMotion rotationRate). */
|
|
32
|
+
gyroscope: boolean;
|
|
33
|
+
/** Raw magnetometer present. Always false on web — no browser exposes one by default. */
|
|
34
|
+
magnetometer: boolean;
|
|
35
|
+
/** Shake events can be detected (needs an accelerometer). */
|
|
36
|
+
shake: boolean;
|
|
37
|
+
/** Tilt events can be detected (needs an accelerometer). */
|
|
38
|
+
tilt: boolean;
|
|
39
|
+
/** Significant-motion events can be detected (a hardware trigger or an accelerometer). */
|
|
40
|
+
significantMotion: boolean;
|
|
29
41
|
}
|
|
30
42
|
export interface StepSample {
|
|
31
43
|
/** Steps in the sampled window (a DELTA, not a lifetime total). */
|
|
@@ -63,7 +75,31 @@ export interface HeadingSample {
|
|
|
63
75
|
accuracy: number;
|
|
64
76
|
timestamp: number;
|
|
65
77
|
}
|
|
66
|
-
export type MotionSample = StepSample | AltitudeSample | HeadingSample
|
|
78
|
+
export type MotionSample = StepSample | AltitudeSample | HeadingSample
|
|
79
|
+
/** accelerometer / gyroscope / magnetometer: one raw reading. Units: accelerometer g (gravity
|
|
80
|
+
* included; flat face-up ⇒ z ≈ +1 on every platform), gyroscope rad/s, magnetometer µT. */
|
|
81
|
+
| {
|
|
82
|
+
x: number;
|
|
83
|
+
y: number;
|
|
84
|
+
z: number;
|
|
85
|
+
timestampMs: number;
|
|
86
|
+
}
|
|
87
|
+
/** shake: ONE event per shake. `magnitude` is the shake's peak total acceleration, g. */
|
|
88
|
+
| {
|
|
89
|
+
magnitude: number;
|
|
90
|
+
timestampMs: number;
|
|
91
|
+
}
|
|
92
|
+
/** tilt: attitude relative to gravity, degrees. Flat face-up is { pitch: 0, roll: 0 }; pitch is
|
|
93
|
+
* positive when the top edge rises, roll positive when the right edge dips. */
|
|
94
|
+
| {
|
|
95
|
+
pitch: number;
|
|
96
|
+
roll: number;
|
|
97
|
+
timestampMs: number;
|
|
98
|
+
}
|
|
99
|
+
/** significantMotion: the device started moving after a period at rest. */
|
|
100
|
+
| {
|
|
101
|
+
timestampMs: number;
|
|
102
|
+
};
|
|
67
103
|
/**
|
|
68
104
|
* Motion permission status. iOS gates CMPedometer behind a motion authorization;
|
|
69
105
|
* Android 10+ gates the step counter behind runtime ACTIVITY_RECOGNITION. Altitude and
|
|
@@ -121,8 +157,11 @@ export declare function getHeading(): Promise<HeadingSample | null>;
|
|
|
121
157
|
export interface MotionWatchOptions {
|
|
122
158
|
/** Which sensor to stream. Defaults to "steps". */
|
|
123
159
|
sensor?: MotionSensor;
|
|
124
|
-
/** Requested sample interval, ms.
|
|
125
|
-
*
|
|
160
|
+
/** Requested sample interval, ms. For the raw sensors (accelerometer / gyroscope /
|
|
161
|
+
* magnetometer) it is clamped to 16–1000 ms (default 100) and honoured, subject to the
|
|
162
|
+
* 60-samples/s ceiling. For steps / altitude / heading the platform treats it as a hint and
|
|
163
|
+
* may deliver faster (heading is event-driven) or slower (a step sample needs steps to have
|
|
164
|
+
* happened). Ignored by the gesture events, which fire when the gesture happens. */
|
|
126
165
|
intervalMs?: number;
|
|
127
166
|
/** Per-poll bridge timeout. Rarely needs changing — see DEFAULT_POLL_TIMEOUT_MS. */
|
|
128
167
|
pollTimeoutMs?: number;
|
|
@@ -149,6 +188,13 @@ export interface MotionWatcher<T extends MotionSample = MotionSample> extends As
|
|
|
149
188
|
* ```
|
|
150
189
|
*
|
|
151
190
|
* Type the stream by passing the sample type: `watch<HeadingSample>({ sensor: "heading" })`.
|
|
191
|
+
*
|
|
192
|
+
* ```ts
|
|
193
|
+
* // Shake to reroll.
|
|
194
|
+
* for await (const _ of watch({ sensor: "shake" })) reroll();
|
|
195
|
+
* // Tilt to steer.
|
|
196
|
+
* for await (const t of watch<{ pitch: number; roll: number; timestampMs: number }>({ sensor: "tilt" })) steer(t.roll);
|
|
197
|
+
* ```
|
|
152
198
|
*/
|
|
153
199
|
export declare function watch<T extends MotionSample = MotionSample>(options?: MotionWatchOptions): MotionWatcher<T>;
|
|
154
200
|
export declare const version = 1;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** What kind of link carries the traffic. `"none"` when offline; `"unknown"` when the
|
|
2
|
+
* platform cannot say (most desktop browsers). */
|
|
3
|
+
export type NetworkType = "wifi" | "cellular" | "ethernet" | "other" | "none" | "unknown";
|
|
4
|
+
/** One reading of the device's connectivity. */
|
|
5
|
+
export interface NetworkStatus {
|
|
6
|
+
/** The device has a usable network path. */
|
|
7
|
+
online: boolean;
|
|
8
|
+
type: NetworkType;
|
|
9
|
+
/** The link is metered / costly (cellular, a personal hotspot). Best-effort. */
|
|
10
|
+
expensive: boolean;
|
|
11
|
+
/** The user asked to save data (iOS Low Data Mode, Android Data Saver, web Save-Data). Best-effort. */
|
|
12
|
+
constrained: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Coerce whatever crossed the bridge into a well-formed {@link NetworkStatus}. A malformed
|
|
15
|
+
* or missing field degrades to the honest default rather than throwing. */
|
|
16
|
+
export declare function normalizeNetworkStatus(raw: unknown): NetworkStatus;
|
|
17
|
+
/** Read the current connectivity. */
|
|
18
|
+
export declare function status(): Promise<NetworkStatus>;
|
|
19
|
+
/**
|
|
20
|
+
* Have `handler` (`"<service>.<action>"`) invoked with the new {@link NetworkStatus} on each
|
|
21
|
+
* CHANGE. Changes are debounced 500 ms and a reading equal to the last one delivered is
|
|
22
|
+
* suppressed, so a flapping interface does not storm the reducer. The subscription lives
|
|
23
|
+
* as long as the calling worker and is released when it is torn down. Subscribing the same
|
|
24
|
+
* handler twice is idempotent.
|
|
25
|
+
*
|
|
26
|
+
* Resolves with the status at the moment of subscribing, so the screen can paint the
|
|
27
|
+
* current state without waiting for the first change.
|
|
28
|
+
*
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { subscribe } from "@wix/himalaya/network";
|
|
31
|
+
*
|
|
32
|
+
* init: (s) => {
|
|
33
|
+
* subscribe("net.changed").then((now) => net.changed(now)).catch(() => {});
|
|
34
|
+
* return s;
|
|
35
|
+
* },
|
|
36
|
+
* changed: (s, status) => ({ ...s, online: status.online, type: status.type }),
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function subscribe(handler: string): Promise<NetworkStatus>;
|
|
@@ -23,6 +23,7 @@ export declare const CAPABILITY_REGISTRY: {
|
|
|
23
23
|
readonly location: readonly ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"];
|
|
24
24
|
readonly media_playback: readonly ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"];
|
|
25
25
|
readonly motion: readonly ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"];
|
|
26
|
+
readonly network: readonly ["status", "subscribe"];
|
|
26
27
|
readonly on_device_ai: readonly ["availability", "generateText"];
|
|
27
28
|
readonly open_url: readonly ["canOpen", "open"];
|
|
28
29
|
readonly pdf: readonly ["isAvailable", "open"];
|
|
@@ -42,7 +43,7 @@ export declare const CAPABILITY_REGISTRY: {
|
|
|
42
43
|
readonly wix_chat: readonly ["getRealtimeStatus", "subscribeRealtime", "unsubscribeRealtime"];
|
|
43
44
|
};
|
|
44
45
|
/** A capability id backed by an @himalaya/* SDK binding. */
|
|
45
|
-
export type SdkCapability = "app_info" | "audio_record" | "base44" | "biometrics" | "browser_auth" | "calendar" | "calls" | "camera" | "clipboard" | "contacts" | "file_picker" | "files" | "godot" | "haptic" | "health" | "himi_apps" | "iap" | "keyboard" | "live_activity" | "local_database" | "location" | "media_playback" | "motion" | "on_device_ai" | "open_url" | "pdf" | "photos" | "presigned_upload" | "push" | "release_control" | "secure_storage" | "share" | "speaker_diarization" | "speech" | "system_intents" | "tasks" | "theme" | "ui" | "wix_cashier" | "wix_chat";
|
|
46
|
+
export type SdkCapability = "app_info" | "audio_record" | "base44" | "biometrics" | "browser_auth" | "calendar" | "calls" | "camera" | "clipboard" | "contacts" | "file_picker" | "files" | "godot" | "haptic" | "health" | "himi_apps" | "iap" | "keyboard" | "live_activity" | "local_database" | "location" | "media_playback" | "motion" | "network" | "on_device_ai" | "open_url" | "pdf" | "photos" | "presigned_upload" | "push" | "release_control" | "secure_storage" | "share" | "speaker_diarization" | "speech" | "system_intents" | "tasks" | "theme" | "ui" | "wix_cashier" | "wix_chat";
|
|
46
47
|
/** All `capability.<id>.<verb>` action ids, flattened (the worker-bridge wire vocabulary). */
|
|
47
48
|
export declare const CAPABILITY_ACTION_IDS: readonly string[];
|
|
48
49
|
/** Capability id → the @himalaya/* package(s) a worker imports to reach it — every dispatch
|
|
@@ -21,6 +21,7 @@ import type * as LocalDatabaseSdk from "@wix/himalaya/local-db";
|
|
|
21
21
|
import type * as LocationSdk from "@wix/himalaya/location";
|
|
22
22
|
import type * as MediaPlaybackSdk from "@wix/himalaya/media-playback";
|
|
23
23
|
import type * as MotionSdk from "@wix/himalaya/motion";
|
|
24
|
+
import type * as NetworkSdk from "@wix/himalaya/network";
|
|
24
25
|
import type * as OnDeviceAiSdk from "@wix/himalaya/on-device-ai";
|
|
25
26
|
import type * as OpenUrlSdk from "@wix/himalaya/open-url";
|
|
26
27
|
import type * as PdfSdk from "@wix/himalaya/pdf";
|
|
@@ -73,6 +74,7 @@ export interface HimalayaPageCapabilities {
|
|
|
73
74
|
readonly "location": PageModule<typeof LocationSdk> & PageEvents;
|
|
74
75
|
readonly "media_playback": PageModule<typeof MediaPlaybackSdk> & PageEvents;
|
|
75
76
|
readonly "motion": PageModule<typeof MotionSdk> & PageEvents;
|
|
77
|
+
readonly "network": PageModule<typeof NetworkSdk> & PageEvents;
|
|
76
78
|
readonly "on_device_ai": PageModule<typeof OnDeviceAiSdk> & PageEvents;
|
|
77
79
|
readonly "open_url": PageModule<typeof OpenUrlSdk> & PageEvents;
|
|
78
80
|
readonly "pdf": PageModule<typeof PdfSdk> & PageEvents;
|
package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts
CHANGED
|
@@ -791,7 +791,7 @@ export interface OrientationEnvelope {
|
|
|
791
791
|
export declare const DEFAULT_ORIENTATION_ENVELOPE: Required<OrientationEnvelope>;
|
|
792
792
|
/** Fill in the absent families. Total, so callers never branch on `undefined`. */
|
|
793
793
|
export declare function resolveOrientationEnvelope(env?: OrientationEnvelope): Required<OrientationEnvelope>;
|
|
794
|
-
export type Capability = "camera" | "barcode_scanner" | "biometrics" | "secure_storage" | "share" | "push" | "file_picker" | "files" | "open_url" | "pdf" | "clipboard" | "theme" | "photos" | "presigned_upload" | "ui" | "calendar" | "contacts" | "tasks" | "audio_record" | "audio_record_background" | "calls" | "location" | "location_background" | "motion" | "health" | "media_playback" | "webview" | "browser_auth" | "haptic" | "himi_apps" | "iap" | "keyboard" | "wix_cashier" | "wix_chat" | "live_activity" | "local_database" | "speech" | "speaker_diarization" | "system_intents" | "on_device_ai" | "app_info" | "release_control" | "godot" | "base44" | "animation";
|
|
794
|
+
export type Capability = "camera" | "barcode_scanner" | "biometrics" | "secure_storage" | "share" | "push" | "file_picker" | "files" | "open_url" | "pdf" | "clipboard" | "theme" | "photos" | "presigned_upload" | "ui" | "calendar" | "contacts" | "tasks" | "audio_record" | "audio_record_background" | "calls" | "location" | "location_background" | "motion" | "health" | "media_playback" | "webview" | "browser_auth" | "haptic" | "himi_apps" | "iap" | "keyboard" | "network" | "wix_cashier" | "wix_chat" | "live_activity" | "local_database" | "speech" | "speaker_diarization" | "system_intents" | "on_device_ai" | "app_info" | "release_control" | "godot" | "base44" | "animation";
|
|
795
795
|
/** `defineApp({ wixIap })` — the purchases-service app a build binds this app to. */
|
|
796
796
|
export interface WixIapConfig {
|
|
797
797
|
/** The purchases service's app UUID, registered on the app's own auth site. Not a secret. */
|
package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts
CHANGED
|
@@ -142,6 +142,8 @@ export interface Shadow {
|
|
|
142
142
|
y?: number;
|
|
143
143
|
}
|
|
144
144
|
export interface Modifiers {
|
|
145
|
+
/** Changing non-empty token: scroll this node into view and move accessibility focus to it. */
|
|
146
|
+
scrollIntoViewPath?: string;
|
|
145
147
|
padding?: EdgeInsets;
|
|
146
148
|
background?: TokenRef;
|
|
147
149
|
cornerRadius?: number;
|
|
@@ -811,6 +813,8 @@ export interface ButtonProps {
|
|
|
811
813
|
cornerRadius?: number;
|
|
812
814
|
/** #1049 — minimum height (pt/dp/px). */
|
|
813
815
|
minHeight?: number;
|
|
816
|
+
/** Live loading bool; OR with literal loading. */
|
|
817
|
+
loadingPath?: string;
|
|
814
818
|
}
|
|
815
819
|
export type Keyboard = "default" | "email" | "phone" | "number" | "url" | "decimal";
|
|
816
820
|
export type AutoCapitalization = "none" | "words" | "sentences" | "characters";
|
|
@@ -1258,6 +1262,10 @@ export interface SegmentedControlProps {
|
|
|
1258
1262
|
optionsPath?: string;
|
|
1259
1263
|
}
|
|
1260
1264
|
export interface CarouselProps {
|
|
1265
|
+
/** Opt-in paging for itemsPath; absent preserves the horizontal card rail. */
|
|
1266
|
+
paged?: boolean;
|
|
1267
|
+
/** Worker-driven page index; clamped to the current page count. */
|
|
1268
|
+
currentIndexPath?: string;
|
|
1261
1269
|
items: Component[];
|
|
1262
1270
|
currentIndex?: number;
|
|
1263
1271
|
onChange?: Action;
|
|
@@ -3234,6 +3242,10 @@ export interface LinkableScreen {
|
|
|
3234
3242
|
paramKeys: string[];
|
|
3235
3243
|
parentScreenId: string;
|
|
3236
3244
|
tabId: string;
|
|
3245
|
+
/** #4656 — a signed-in user is required: an external link / push route to this screen while
|
|
3246
|
+
* signed out presents the sign-in first, then continues to it. Absent ⇒ false. Needs an
|
|
3247
|
+
* `auth` block (validator warns otherwise). */
|
|
3248
|
+
requiresAuth?: boolean;
|
|
3237
3249
|
}
|
|
3238
3250
|
export type RendererKind = "sdui_intent" | "sdui_layout" | "webview_native_bridge" | "webview_ds";
|
|
3239
3251
|
export interface CacheControl {
|
package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/validator.d.ts
CHANGED
|
@@ -797,6 +797,9 @@ export declare const screenDescriptorSchema: {
|
|
|
797
797
|
readonly type: "object";
|
|
798
798
|
readonly additionalProperties: false;
|
|
799
799
|
readonly properties: {
|
|
800
|
+
readonly scrollIntoViewPath: {
|
|
801
|
+
readonly type: "string";
|
|
802
|
+
};
|
|
800
803
|
readonly padding: {
|
|
801
804
|
readonly $ref: "#/$defs/edgeInsets";
|
|
802
805
|
};
|
|
@@ -2223,6 +2226,9 @@ export declare const widgetSnapshotSchema: {
|
|
|
2223
2226
|
readonly type: "object";
|
|
2224
2227
|
readonly additionalProperties: false;
|
|
2225
2228
|
readonly properties: {
|
|
2229
|
+
readonly scrollIntoViewPath: {
|
|
2230
|
+
readonly type: "string";
|
|
2231
|
+
};
|
|
2226
2232
|
readonly padding: {
|
|
2227
2233
|
readonly $ref: "#/$defs/edgeInsets";
|
|
2228
2234
|
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Pure rendition policy shared by web/RN. Native mirrors use the same request fixtures. */
|
|
2
|
+
export interface ImageTarget {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
scale: number;
|
|
6
|
+
mode?: string;
|
|
7
|
+
maxEdge?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The pixel size an image is requested at for a box of `width`×`height` points at `scale`: the box in pixels,
|
|
11
|
+
* its longer edge rounded up to a shared bucket (96 … 1400, or up to `maxEdge`, at most 4096) so nearby sizes
|
|
12
|
+
* share one cached rendition. A size it returns maps to itself. An invalid box asks for `maxEdge` square.
|
|
13
|
+
*/
|
|
14
|
+
export declare function imagePixelSize(width: number, height: number, scale: number, maxEdge?: number): {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
};
|
|
18
|
+
/** Keep the caller's source untouched: this URL belongs to a display request, not entity data. */
|
|
19
|
+
export declare function resolveImageRendition(source: string, target: ImageTarget): {
|
|
20
|
+
url: string;
|
|
21
|
+
family: string;
|
|
22
|
+
width: number;
|
|
23
|
+
height: number;
|
|
24
|
+
};
|
|
25
|
+
export interface ImageCandidate {
|
|
26
|
+
url: string;
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The renditions a renderer offers for one image, smallest first, so the HOST picks among them by
|
|
32
|
+
* its own layout and pixel density (web `srcset`, a React Native `source` array) with no
|
|
33
|
+
* measurement code of ours. A fixed box gets one candidate per screen density; a fluid one (no
|
|
34
|
+
* numeric width) gets fluid widths, its height from `ratio` when known. A source that cannot be
|
|
35
|
+
* resized safely yields exactly itself.
|
|
36
|
+
*/
|
|
37
|
+
export declare function imageCandidates(source: string, box: {
|
|
38
|
+
width?: number;
|
|
39
|
+
height?: number;
|
|
40
|
+
ratio?: number;
|
|
41
|
+
mode?: string;
|
|
42
|
+
}, scales?: number[]): ImageCandidate[];
|
|
@@ -38,6 +38,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
38
38
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
39
39
|
"media_playback": ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"],
|
|
40
40
|
"motion": ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
41
|
+
"network": ["status", "subscribe"],
|
|
41
42
|
"on_device_ai": ["availability", "generateText"],
|
|
42
43
|
"open_url": ["canOpen", "open"],
|
|
43
44
|
"pdf": ["isAvailable", "open"],
|
|
@@ -38,6 +38,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
38
38
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
39
39
|
"media_playback": ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"],
|
|
40
40
|
"motion": ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
41
|
+
"network": ["status", "subscribe"],
|
|
41
42
|
"on_device_ai": ["availability", "generateText"],
|
|
42
43
|
"open_url": ["canOpen", "open"],
|
|
43
44
|
"pdf": ["isAvailable", "open"],
|
|
@@ -38,6 +38,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
38
38
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
39
39
|
"media_playback": ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"],
|
|
40
40
|
"motion": ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
41
|
+
"network": ["status", "subscribe"],
|
|
41
42
|
"on_device_ai": ["availability", "generateText"],
|
|
42
43
|
"open_url": ["canOpen", "open"],
|
|
43
44
|
"pdf": ["isAvailable", "open"],
|
|
@@ -38,6 +38,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
38
38
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
39
39
|
"media_playback": ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"],
|
|
40
40
|
"motion": ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
41
|
+
"network": ["status", "subscribe"],
|
|
41
42
|
"on_device_ai": ["availability", "generateText"],
|
|
42
43
|
"open_url": ["canOpen", "open"],
|
|
43
44
|
"pdf": ["isAvailable", "open"],
|
|
@@ -8853,6 +8853,7 @@ var screenDescriptorSchema = {
|
|
|
8853
8853
|
type: "object",
|
|
8854
8854
|
additionalProperties: false,
|
|
8855
8855
|
properties: {
|
|
8856
|
+
scrollIntoViewPath: { type: "string" },
|
|
8856
8857
|
padding: { $ref: "#/$defs/edgeInsets" },
|
|
8857
8858
|
background: { $ref: "#/$defs/tokenRef" },
|
|
8858
8859
|
cornerRadius: { type: "integer", minimum: 0 },
|
|
@@ -38,6 +38,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
38
38
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
39
39
|
"media_playback": ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"],
|
|
40
40
|
"motion": ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
41
|
+
"network": ["status", "subscribe"],
|
|
41
42
|
"on_device_ai": ["availability", "generateText"],
|
|
42
43
|
"open_url": ["canOpen", "open"],
|
|
43
44
|
"pdf": ["isAvailable", "open"],
|
|
@@ -38,6 +38,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
38
38
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
39
39
|
"media_playback": ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"],
|
|
40
40
|
"motion": ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
41
|
+
"network": ["status", "subscribe"],
|
|
41
42
|
"on_device_ai": ["availability", "generateText"],
|
|
42
43
|
"open_url": ["canOpen", "open"],
|
|
43
44
|
"pdf": ["isAvailable", "open"],
|
|
@@ -66,6 +67,19 @@ function normalizePermissionStatus(s) {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
// ../../core/sdk/motion/src/index.ts
|
|
70
|
+
var MIN_RAW_INTERVAL_MS = 16;
|
|
71
|
+
var MAX_RAW_INTERVAL_MS = 1e3;
|
|
72
|
+
var DEFAULT_RAW_INTERVAL_MS = 100;
|
|
73
|
+
var RAW_SENSORS = ["accelerometer", "gyroscope", "magnetometer"];
|
|
74
|
+
function isRawSensor(sensor) {
|
|
75
|
+
return RAW_SENSORS.includes(sensor);
|
|
76
|
+
}
|
|
77
|
+
function clampRawInterval(intervalMs) {
|
|
78
|
+
if (typeof intervalMs !== "number" || !Number.isFinite(intervalMs) || intervalMs <= 0) {
|
|
79
|
+
return DEFAULT_RAW_INTERVAL_MS;
|
|
80
|
+
}
|
|
81
|
+
return Math.min(MAX_RAW_INTERVAL_MS, Math.max(MIN_RAW_INTERVAL_MS, Math.round(intervalMs)));
|
|
82
|
+
}
|
|
69
83
|
var STEP_HISTORY_STATUSES = [
|
|
70
84
|
"available",
|
|
71
85
|
"needs_permission",
|
|
@@ -87,7 +101,13 @@ async function availability() {
|
|
|
87
101
|
steps: r?.steps === true,
|
|
88
102
|
altimeter: r?.altimeter === true,
|
|
89
103
|
heading: r?.heading === true,
|
|
90
|
-
stepHistory: normalizeStepHistory(r?.stepHistory)
|
|
104
|
+
stepHistory: normalizeStepHistory(r?.stepHistory),
|
|
105
|
+
accelerometer: r?.accelerometer === true,
|
|
106
|
+
gyroscope: r?.gyroscope === true,
|
|
107
|
+
magnetometer: r?.magnetometer === true,
|
|
108
|
+
shake: r?.shake === true,
|
|
109
|
+
tilt: r?.tilt === true,
|
|
110
|
+
significantMotion: r?.significantMotion === true
|
|
91
111
|
};
|
|
92
112
|
}
|
|
93
113
|
function normalizeStepHistory(raw) {
|
|
@@ -113,7 +133,8 @@ var DEFAULT_POLL_TIMEOUT_MS = 3e4;
|
|
|
113
133
|
function watch(options) {
|
|
114
134
|
const sensor = options?.sensor ?? "steps";
|
|
115
135
|
const startParams = { sensor };
|
|
116
|
-
if (
|
|
136
|
+
if (isRawSensor(sensor)) startParams.intervalMs = clampRawInterval(options?.intervalMs);
|
|
137
|
+
else if (typeof options?.intervalMs === "number") startParams.intervalMs = options.intervalMs;
|
|
117
138
|
const started = (async () => {
|
|
118
139
|
const r = await dispatch("capability.motion.watchStart", startParams);
|
|
119
140
|
if (!r?.watchId) throw new Error("motion.watch: native handler returned no watchId");
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// ../../core/sdk/dispatch/src/index.ts
|
|
2
|
+
function dispatch(handlerId, params, _options) {
|
|
3
|
+
const himalaya = globalThis.himalaya;
|
|
4
|
+
if (!himalaya) {
|
|
5
|
+
return Promise.reject(
|
|
6
|
+
new Error("@himalaya/dispatch: called outside a Himalaya runtime. This bundle must run inside a JSWorker (Tier 5).")
|
|
7
|
+
);
|
|
8
|
+
}
|
|
9
|
+
const stringParams = {};
|
|
10
|
+
if (params) {
|
|
11
|
+
for (const [k, v] of Object.entries(params)) stringParams[k] = String(v);
|
|
12
|
+
}
|
|
13
|
+
return himalaya.dispatch(handlerId, stringParams);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// ../../core/sdk/network/src/index.ts
|
|
17
|
+
var TYPES = ["wifi", "cellular", "ethernet", "other", "none", "unknown"];
|
|
18
|
+
function normalizeNetworkStatus(raw) {
|
|
19
|
+
const r = raw && typeof raw === "object" ? raw : {};
|
|
20
|
+
const online = r.online === true || r.online === "true";
|
|
21
|
+
const type = TYPES.includes(r.type) ? r.type : "unknown";
|
|
22
|
+
return {
|
|
23
|
+
online,
|
|
24
|
+
// An offline device has no link, whatever a stale `type` said.
|
|
25
|
+
type: online ? type === "none" ? "unknown" : type : "none",
|
|
26
|
+
expensive: online && (r.expensive === true || r.expensive === "true"),
|
|
27
|
+
constrained: online && (r.constrained === true || r.constrained === "true")
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function status() {
|
|
31
|
+
return normalizeNetworkStatus(await dispatch("capability.network.status", {}));
|
|
32
|
+
}
|
|
33
|
+
async function subscribe(handler) {
|
|
34
|
+
const parts = handler.split(".");
|
|
35
|
+
if (parts.length !== 2 || parts.some((part) => part.trim().length === 0)) {
|
|
36
|
+
throw new Error('network.subscribe: handler must be "<service>.<action>"');
|
|
37
|
+
}
|
|
38
|
+
return normalizeNetworkStatus(await dispatch("capability.network.subscribe", { onChange: handler }));
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
normalizeNetworkStatus,
|
|
42
|
+
status,
|
|
43
|
+
subscribe
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=network.mjs.map
|
|
@@ -38,6 +38,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
38
38
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
39
39
|
"media_playback": ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"],
|
|
40
40
|
"motion": ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
41
|
+
"network": ["status", "subscribe"],
|
|
41
42
|
"on_device_ai": ["availability", "generateText"],
|
|
42
43
|
"open_url": ["canOpen", "open"],
|
|
43
44
|
"pdf": ["isAvailable", "open"],
|
|
@@ -23,6 +23,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
23
23
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
24
24
|
"media_playback": ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"],
|
|
25
25
|
"motion": ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
26
|
+
"network": ["status", "subscribe"],
|
|
26
27
|
"on_device_ai": ["availability", "generateText"],
|
|
27
28
|
"open_url": ["canOpen", "open"],
|
|
28
29
|
"pdf": ["isAvailable", "open"],
|
|
@@ -7425,6 +7425,7 @@ var screenDescriptorSchema = {
|
|
|
7425
7425
|
type: "object",
|
|
7426
7426
|
additionalProperties: false,
|
|
7427
7427
|
properties: {
|
|
7428
|
+
scrollIntoViewPath: { type: "string" },
|
|
7428
7429
|
padding: { $ref: "#/$defs/edgeInsets" },
|
|
7429
7430
|
background: { $ref: "#/$defs/tokenRef" },
|
|
7430
7431
|
cornerRadius: { type: "integer", minimum: 0 },
|
|
@@ -38,6 +38,7 @@ var CAPABILITY_REGISTRY = {
|
|
|
38
38
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
39
39
|
"media_playback": ["download", "getCapabilities", "getState", "next", "pause", "pictureInPicture", "play", "presentFullscreen", "previous", "release", "removeDownload", "seek", "seekTo", "setMuted", "setQueue", "setRate", "skip", "status", "stop", "subscribeStatus", "unsubscribeStatus"],
|
|
40
40
|
"motion": ["availability", "getAltitude", "getHeading", "getPermissionStatus", "getStepCount", "openStepHistorySetup", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
41
|
+
"network": ["status", "subscribe"],
|
|
41
42
|
"on_device_ai": ["availability", "generateText"],
|
|
42
43
|
"open_url": ["canOpen", "open"],
|
|
43
44
|
"pdf": ["isAvailable", "open"],
|