@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.
Files changed (54) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/app-config.d.ts +18 -3
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/builder.d.ts +3 -0
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/motion/src/index.d.ts +51 -5
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/network/src/index.d.ts +39 -0
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/sdk-types/src/capabilities.generated.d.ts +2 -1
  6. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/webview-page/src/capabilities.generated.d.ts +2 -0
  7. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts +1 -1
  8. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +12 -0
  9. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/validator.d.ts +6 -0
  10. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/media/src/index.d.ts +1 -0
  11. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/media/src/rendition.d.ts +42 -0
  12. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/audio-record.mjs +1 -0
  13. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calendar.mjs +1 -0
  14. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calls.mjs +1 -0
  15. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/contacts.mjs +1 -0
  16. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core.mjs +1 -0
  17. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/location.mjs +1 -0
  18. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/motion.mjs +23 -2
  19. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/network.mjs +45 -0
  20. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/photos.mjs +1 -0
  21. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdk-types.mjs +1 -0
  22. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdui.mjs +1 -0
  23. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/tasks.mjs +1 -0
  24. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-media.mjs +78 -0
  25. package/dist/authoring-runtime/node_modules/@wix/himalaya/package.json +4 -0
  26. package/dist/cli.mjs +9144 -7459
  27. package/dist/preview-assets.generated.bin +0 -0
  28. package/dist/quickjs-intl.js +462 -0
  29. package/dist/quickjs-web-globals.js +540 -0
  30. package/dist/quickjs-worker-entry.js +313 -0
  31. package/guides/app-config.md +1 -1
  32. package/guides/component-reference.json +5 -3
  33. package/guides/component-reference.md +10 -2
  34. package/guides/designing-himi-screens.md +24 -0
  35. package/guides/himi-json-output.md +30 -1
  36. package/guides/importable-sdks.md +1 -0
  37. package/guides/one-app-section-mappings.md +4 -5
  38. package/guides/one-app-to-himi-app.md +214 -6
  39. package/guides/one-app-viewer.md +2 -2
  40. package/guides/sdk-reference.json +74 -7
  41. package/guides/tier-5-add-a-screen.md +32 -0
  42. package/guides/web-page-sdk-reference.md +1 -0
  43. package/package.json +3 -2
  44. package/templates/beauty-salon/dev/index.ts +197 -304
  45. package/templates/beauty-salon/tier5-src/himi-store-product/index.ts +44 -13
  46. package/templates/branded-lite/dev/index.ts +197 -304
  47. package/templates/branded-lite/l10n/en.json +2 -2
  48. package/templates/branded-lite/tier5-src/himi-store-product/index.ts +49 -17
  49. package/templates/gym-fitness/dev/index.ts +197 -304
  50. package/templates/gym-fitness/tier5-src/himi-store-product/index.ts +44 -13
  51. package/templates/portfolio-creative/dev/index.ts +197 -304
  52. package/templates/portfolio-creative/tier5-src/himi-store-product/index.ts +44 -13
  53. package/templates/retail-store/dev/index.ts +197 -304
  54. 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 five fields — the defaults Kotlin and Swift apply. Binaries
293
- * shipped before #3318 decode a linkable screen with all five REQUIRED and drop the whole
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;
@@ -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. The platform treats this as a hint and may deliver
125
- * faster (heading is event-driven) or slower (a step sample needs steps to have happened). */
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;
@@ -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. */
@@ -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 {
@@ -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
  };
@@ -57,3 +57,4 @@ export declare function wixMediaUrl(value: unknown, size?: WixImageSize | null):
57
57
  * Wiring a runtime gate to this predicate is tracked separately.
58
58
  */
59
59
  export declare function isUnsizedWixMedia(url: string): boolean;
60
+ export * from "./rendition.js";
@@ -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 (typeof options?.intervalMs === "number") startParams.intervalMs = options.intervalMs;
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"],