@wix/himalaya-cli 0.1405.0 → 0.1407.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.
@@ -62,6 +62,7 @@ export interface NavigationConfig {
62
62
  site?: import("@wix/himalaya/core").SiteNavConfig;
63
63
  /** Signed release allowlist for contained browser Tier-5 `_stream` requests. */
64
64
  streamPolicy?: StreamPolicy;
65
+ topBarLogo?: import("@wix/himalaya/core").TopBarLogo;
65
66
  splash?: SplashConfig;
66
67
  locale?: LocaleConfig;
67
68
  backAffordance?: BackAffordanceConfig;
@@ -227,6 +227,9 @@ export interface DerivedAppMeta {
227
227
  site?: import("@wix/himalaya/core").SiteNavConfig;
228
228
  /** Forwarded from AppConfig.navigation.streamPolicy — the signed browser stream allowlist. */
229
229
  streamPolicy?: import("@wix/himalaya/core").StreamPolicy;
230
+ /** Forwarded from AppConfig.navigation.topBarLogo — the app-wide logo for tab-stack roots
231
+ * (RFC 0066 amendment "top-bar gap items"). */
232
+ topBarLogo?: import("@wix/himalaya/core").TopBarLogo;
230
233
  /** Forwarded from AppConfig.`splash` — the in-app splash surface. NOTE the
231
234
  * asymmetry with the fields above: this reads the TOP-LEVEL `config.splash`, not
232
235
  * `config.navigation.splash`, because the same block also drives the build-time
@@ -6,11 +6,74 @@ export interface WixCacheRule {
6
6
  ttl: number;
7
7
  swr: number;
8
8
  tag: string | null;
9
+ queueOffline?: true;
10
+ /** How a resend of this write is deduplicated (§2.1). The client applies what it receives. */
11
+ idempotency?: OfflineIdempotency;
12
+ /** Seconds a queued write may wait before it is dead-lettered as `expired` (§6), already clamped. */
13
+ queueMaxAge?: number;
9
14
  }
15
+ /** RFC 0072 §2.1 — how an endpoint dedupes a resend after an ambiguous attempt. */
16
+ export type OfflineIdempotency = "header" | "clientId" | "conflictIsApplied" | "unsentOnly";
10
17
  export interface WixCachePolicy {
11
18
  rules: WixCacheRule[];
12
19
  defaultCacheable: boolean;
13
20
  }
21
+ /** One endpoint whose writes may queue offline (§2.1): a method, ONE exact path, and the dedupe
22
+ * mechanism Task 0 observed live, with the evidence. An app rule queues only when it names this
23
+ * endpoint exactly — a prefix would take in its siblings (`/wix-data/v2/items` covers
24
+ * `/wix-data/v2/items/bulk/remove`), whose dedupe nobody verified. */
25
+ export interface OfflineQueueableEndpoint {
26
+ method: string;
27
+ path: string;
28
+ idempotency: OfflineIdempotency;
29
+ /** The write carries personal data even where no personal read prefix says so (§6). */
30
+ personal: boolean;
31
+ /** Where the Task 0 probe that justifies `idempotency` is recorded. */
32
+ evidence: string;
33
+ }
34
+ /** RFC 0072 §2.1 — deny-by-default: a write queues only if its endpoint is here. No row exists
35
+ * until its Task 0 probe is recorded, and none assumes an endpoint honours `Idempotency-Key`. */
36
+ export declare const OFFLINE_QUEUEABLE: readonly OfflineQueueableEndpoint[];
37
+ /** RFC 0072 §2.1 — never queueable, whatever an app declares: money, identity, stored value and
38
+ * capacity holds. `/gift-cards` and `/loyalty` have no trailing slash on purpose
39
+ * (`/loyalty-accounts/v1/accounts/{id}/adjust-points`). Checked before the allow-table. */
40
+ export declare const NEVER_QUEUEABLE_PREFIXES: readonly string[];
41
+ /** RFC 0072 §2.1 — a path any of whose segments, split on `-`, is one of these is never queueable:
42
+ * every checkout, payment, order, refund and hold route, under whatever allow prefix it sits. */
43
+ export declare const NEVER_QUEUEABLE_TOKENS: readonly string[];
44
+ /** RFC 0072 §6 — personal WRITES the personal-read list misses: a form submission carries a name,
45
+ * an email and a phone. */
46
+ export declare const OFFLINE_PERSONAL_WRITE_PREFIXES: readonly string[];
47
+ /** RFC 0072 §6 (D2) — how long a queued write may wait: 7 days, or 24 hours for personal data. */
48
+ export declare const OFFLINE_MAX_AGE: number;
49
+ export declare const OFFLINE_PERSONAL_MAX_AGE = 86400;
50
+ /** RFC 0072 §2.1 — whether `path` is on the never-queueable floor. Every client runs the same
51
+ * check on the concrete call path (core/schema/fixtures/offline-writes/never-queueable.json). */
52
+ export declare function isNeverQueueable(path: string): boolean;
53
+ /** Why a declared `queueOffline` rule does not queue, as a stable code (§2.2). */
54
+ export type OfflineQueueRefusalCode = "never_queueable" | "not_queueable" | "missing_method" | "missing_tag" | "absolute_url";
55
+ export interface OfflineQueueRefusal {
56
+ code: OfflineQueueRefusalCode;
57
+ method: string | null;
58
+ pathPrefix: string;
59
+ }
60
+ /** Every rule of `declared` that asks to queue offline but will not, with the coded reason, so
61
+ * `himalaya-dev app validate` and the dev-server can say so instead of dropping it silently. */
62
+ export declare function offlineQueueRefusals(declared?: DeclaredWixCache, table?: readonly OfflineQueueableEndpoint[]): OfflineQueueRefusal[];
63
+ /** RFC 0072 §2.2 — the effective queueing of one app rule:
64
+ * `app_wants AND on OFFLINE_QUEUEABLE AND NOT never_queueable AND method AND tag`, with the
65
+ * mechanism and the clamped max age stamped on, so no client needs the table. */
66
+ export declare function stampOfflineQueue(rule: WixCacheRule, declared: {
67
+ queueOffline?: boolean;
68
+ queueMaxAge?: number;
69
+ }, table?: readonly OfflineQueueableEndpoint[]): WixCacheRule;
70
+ /** RFC 0072 §2.2 — re-vet every queue rule of a served `wixCachePolicy` against the allow-table.
71
+ * An operator overlay (or an admin override) is deep-merged OVER the stamped policy, and its
72
+ * `rules` array replaces the stamped one wholesale — so a rule it carries with `queueOffline`
73
+ * would otherwise reach every client unchecked, with any mechanism and any max age. Here such a
74
+ * rule is stamped exactly like an app's own (or stripped), so the served queueing is always the
75
+ * table's. Rules without a queue key pass through untouched. */
76
+ export declare function sanitizeServedOfflineQueue<T>(policy: T, table?: readonly OfflineQueueableEndpoint[]): T;
14
77
  /** The path a rule's prefix names: itself, or the path of an absolute `https://host/path` prefix
15
78
  * (an account-level read a worker makes to a full Wix URL) — so the platform denies apply to it. */
16
79
  export declare function rulePath(pathPrefix: string): string;
@@ -34,4 +97,4 @@ export type DeclaredWixCache = AppCacheConfig;
34
97
  * `defaultCacheable: true` can never make a PII path cacheable by matching nothing.
35
98
  * Everything is clamped under the platform envelope (PII denies, TTL ceiling).
36
99
  */
37
- export declare function resolveWixCachePolicy(appName: string, declared?: DeclaredWixCache): WixCachePolicy;
100
+ export declare function resolveWixCachePolicy(appName: string, declared?: DeclaredWixCache, queueable?: readonly OfflineQueueableEndpoint[]): WixCachePolicy;
@@ -198,3 +198,4 @@ export declare const monitoring: {
198
198
  };
199
199
  /** Capability version, for bundles that gate on min binary version. */
200
200
  export declare const version = 2;
201
+ export { offline, isOfflineWriteBlocked, isOfflineWriteOutcomeUnknown, type Sent, type Queued, type OfflineResult, type OfflineEvent, type OfflineEventType, type PendingWrite, type RejectedWrite, } from "./offline.js";
@@ -0,0 +1,66 @@
1
+ /** The endpoint answered: `value` is what the call would have returned without the option. */
2
+ export interface Sent<T> {
3
+ status: "sent";
4
+ value: T;
5
+ }
6
+ /** The write waits in the outbox; `writeId` identifies it in events, `pending()` and `rejected()`. */
7
+ export interface Queued {
8
+ status: "queued";
9
+ writeId: string;
10
+ tag: string;
11
+ }
12
+ export type OfflineResult<T> = Sent<T> | Queued;
13
+ export type OfflineEventType = "queued" | "applied" | "rejected";
14
+ export interface OfflineEvent {
15
+ writeId: string;
16
+ tag: string;
17
+ status?: number;
18
+ code?: string;
19
+ reason?: string;
20
+ }
21
+ export interface PendingWrite {
22
+ writeId: string;
23
+ tag: string;
24
+ createdAt: number;
25
+ attempts: number;
26
+ }
27
+ export interface RejectedWrite {
28
+ writeId: string;
29
+ tag: string;
30
+ /** `http` | `conflict` | `expired` | `outcome_unknown` | `unauthorized`. */
31
+ reason: string;
32
+ status?: number;
33
+ code?: string;
34
+ method: string;
35
+ pathTemplate: string;
36
+ createdAt: number;
37
+ rejectedAt: number;
38
+ /** The request body, while the write has not expired: for "retry" or "copy your text". */
39
+ body?: string;
40
+ }
41
+ /** `wixApi.call` with `{ offline: "queue" }`. On a runtime without offline writes the call is a plain
42
+ * live call, reported as `sent`. */
43
+ declare function call<T>(method: string, path: string, body?: unknown, headers?: Record<string, string>): Promise<OfflineResult<T>>;
44
+ /** The two offline errors a worker branches on (`err.code`). */
45
+ export declare function isOfflineWriteBlocked(e: unknown): e is Error & {
46
+ code: "offline_write_blocked";
47
+ reason: string;
48
+ };
49
+ /** An `unsentOnly` write whose outcome is unknown: say "we couldn't confirm this went through". */
50
+ export declare function isOfflineWriteOutcomeUnknown(e: unknown): e is Error & {
51
+ code: "offline_write_outcome_unknown";
52
+ };
53
+ export declare const offline: {
54
+ call: typeof call;
55
+ /** This scope's queued writes (no bodies). */
56
+ pending: (opts?: {
57
+ tag?: string;
58
+ }) => Promise<PendingWrite[]>;
59
+ /** This scope's rejected writes. */
60
+ rejected: () => Promise<RejectedWrite[]>;
61
+ /** Clear one rejected write. A retry is a new write with a new `writeId`. */
62
+ dismiss: (writeId: string) => Promise<boolean>;
63
+ /** `queued`, `applied` and `rejected`, delivered while this worker runs. Returns an unsubscribe. */
64
+ on: (type: OfflineEventType, cb: (e: OfflineEvent) => void) => (() => void);
65
+ };
66
+ export {};
@@ -676,6 +676,16 @@ export interface AppCacheRule {
676
676
  swr?: number;
677
677
  /** Resource family for write-through purge, e.g. "stores/products". */
678
678
  tag?: string;
679
+ /**
680
+ * RFC 0072 — let a worker queue this endpoint's writes while offline (`{ offline: "queue" }` at
681
+ * the call site). Default false. Takes effect only where the platform allow-table lists the
682
+ * endpoint (method + this exact path) and it is not a payment, identity, stored-value or hold
683
+ * route; `method` and `tag` are then required. The server stamps the dedupe mechanism.
684
+ */
685
+ queueOffline?: boolean;
686
+ /** Seconds a queued write may wait before it is dropped as expired. Clamped to 7 days, and to
687
+ * 24 hours for personal data. Defaults to that ceiling. */
688
+ queueMaxAge?: number;
679
689
  }
680
690
  export interface AppCacheConfig {
681
691
  /** Behavior for a request no rule matches. Defaults to false (deny). */
@@ -2700,6 +2700,8 @@ export interface NavigationConfig {
2700
2700
  * links resolve as before. Build it with `siteNavConfig()` from
2701
2701
  * `@himalaya/core/site-shell`; resolution is `resolveSiteLink()`. */
2702
2702
  site?: SiteNavConfig;
2703
+ /** RFC 0066 amendment "top-bar gap items" — app-wide logo for tab-stack roots. */
2704
+ topBarLogo?: TopBarLogo;
2703
2705
  scheme: string;
2704
2706
  deepLinkPatterns: DeepLinkPattern[];
2705
2707
  linkableScreens: LinkableScreen[];
@@ -2903,6 +2905,86 @@ export interface TopBarConfig {
2903
2905
  leading?: string;
2904
2906
  /** Content-under-bar: "" | "opaque" (default) | "transparent" | "immersive". */
2905
2907
  style?: string;
2908
+ /** RFC 0066 §1 — toolbar items (drawn after the legacy `actions`). */
2909
+ items?: ToolbarItem[];
2910
+ /** RFC 0066 §1 — "" / "automatic" (default) | "large" | "inline". */
2911
+ titleDisplay?: string;
2912
+ /** RFC 0066 §1 — the literal subtitle (the fallback for `subtitlePath`). */
2913
+ subtitle?: string;
2914
+ /** RFC 0066 §1 — "" / "visible" (default) | "hidden". */
2915
+ visibility?: string;
2916
+ /** RFC 0066 §1 — bar fill token. iOS 26 keeps the system glass (amendment R12). */
2917
+ background?: TokenRef;
2918
+ /** RFC 0066 amendment — the screen's logo; overrides `NavigationConfig.topBarLogo`. */
2919
+ logo?: TopBarLogo;
2920
+ /** RFC 0066 amendment — the title as a menu. */
2921
+ titleMenu?: TopBarTitleMenu;
2922
+ /** RFC 0066 amendment — live subtitle (`$service:`); `subtitle` is the fallback. */
2923
+ subtitlePath?: string;
2924
+ /** RFC 0066 amendment — "" / "pinned" (default) | "hide_on_scroll". */
2925
+ scrollBehavior?: string;
2926
+ /** RFC 0066 amendment — truthy ⇒ leaving the presentation asks to discard. Unset/unresolved ⇒ false. */
2927
+ dirtyPath?: string;
2928
+ }
2929
+ /** RFC 0066 §1 (+ its "top-bar gap items" amendment) — one top-bar item. Test id `toolbar.<id>`
2930
+ * (`toolbar-<id>` on web and React Native). Every tap carries an existing `Action`
2931
+ * (invariant 15). Bindings are `$service:` sentinels resolved by the screen host. */
2932
+ export interface ToolbarItem {
2933
+ id: string;
2934
+ /** "leading" | "trailing" (default) | "principal" | "bottom" | "keyboard" | "overflow". */
2935
+ placement?: string;
2936
+ /** Text button when there is no icon; the accessible name always. */
2937
+ label?: string;
2938
+ icon?: IconRef;
2939
+ onTap?: Action;
2940
+ /** "" | "cancel" | "confirm" | "destructive". */
2941
+ role?: string;
2942
+ disabled?: boolean;
2943
+ /** OR'd with `disabled`. For Save, bind "nothing to save" (e.g. `cannotSave`), never the dirty flag. */
2944
+ disabledPath?: string;
2945
+ /** Non-empty ⇒ the item opens a menu. */
2946
+ menu?: MenuItem[];
2947
+ /** "principal" only: a custom title view. */
2948
+ content?: Component;
2949
+ /** Truthy ⇒ a progress indicator replaces the item. Unset/unresolved ⇒ false. */
2950
+ loadingPath?: string;
2951
+ /** Set ⇒ the item draws an avatar; `label` stays the accessible name ("Profile" by default). */
2952
+ avatar?: ToolbarAvatar;
2953
+ /** Live label; `label` is the fallback. */
2954
+ labelPath?: string;
2955
+ }
2956
+ /** RFC 0066 amendment — an avatar item. Images are absolute https URLs (resolve a Wix
2957
+ * media id with `wixMediaUrl` before publishing). */
2958
+ export interface ToolbarAvatar {
2959
+ imageUrl?: string;
2960
+ initials?: string;
2961
+ imageUrlPath?: string;
2962
+ initialsPath?: string;
2963
+ }
2964
+ /** RFC 0066 amendment — the bar logo, per screen (`TopBarConfig.logo`) or app-wide
2965
+ * (`NavigationConfig.topBarLogo`). `imageUrlPath` resolves by the parent's context: the
2966
+ * screen host per screen, the nav worker app-wide. */
2967
+ export interface TopBarLogo {
2968
+ imageUrl?: string;
2969
+ imageUrlDark?: string;
2970
+ /** Baked asset name; wins over `imageUrl`. */
2971
+ imageAsset?: string;
2972
+ /** Optional business name beside a mark-only logo. */
2973
+ name?: string;
2974
+ /** "" / "title" (default) | "leading" | "none". */
2975
+ placement?: string;
2976
+ imageUrlPath?: string;
2977
+ /** Default: the app's display name. */
2978
+ accessibilityLabel?: string;
2979
+ }
2980
+ /** RFC 0066 amendment — the title as a menu (switch location or feed). */
2981
+ export interface TopBarTitleMenu {
2982
+ items?: MenuItem[];
2983
+ selectedId?: string;
2984
+ /** `selectedId` is the fallback. */
2985
+ selectedIdPath?: string;
2986
+ /** Default "<title>, switch". */
2987
+ accessibilityLabel?: string;
2906
2988
  }
2907
2989
  /** RFC 0010 (top-bar amendment) — one trailing top-bar action. Reuses the
2908
2990
  * design-system icon name, the `NavBadge` overlay, and the same `Action`
@@ -272,6 +272,181 @@ export declare const screenDescriptorSchema: {
272
272
  readonly style: {
273
273
  readonly type: "string";
274
274
  };
275
+ readonly items: {
276
+ readonly type: "array";
277
+ readonly items: {
278
+ readonly $ref: "#/$defs/toolbarItem";
279
+ };
280
+ };
281
+ readonly titleDisplay: {
282
+ readonly type: "string";
283
+ };
284
+ readonly subtitle: {
285
+ readonly type: "string";
286
+ };
287
+ readonly visibility: {
288
+ readonly type: "string";
289
+ };
290
+ readonly background: {
291
+ readonly $ref: "#/$defs/tokenRef";
292
+ };
293
+ readonly logo: {
294
+ readonly $ref: "#/$defs/topBarLogo";
295
+ };
296
+ readonly titleMenu: {
297
+ readonly $ref: "#/$defs/topBarTitleMenu";
298
+ };
299
+ readonly subtitlePath: {
300
+ readonly type: "string";
301
+ };
302
+ readonly scrollBehavior: {
303
+ readonly type: "string";
304
+ };
305
+ readonly dirtyPath: {
306
+ readonly type: "string";
307
+ };
308
+ };
309
+ };
310
+ readonly toolbarItem: {
311
+ readonly type: "object";
312
+ readonly additionalProperties: false;
313
+ readonly required: readonly ["id"];
314
+ readonly properties: {
315
+ readonly id: {
316
+ readonly type: "string";
317
+ readonly minLength: 1;
318
+ };
319
+ readonly placement: {
320
+ readonly type: "string";
321
+ };
322
+ readonly label: {
323
+ readonly type: "string";
324
+ };
325
+ readonly icon: {
326
+ readonly type: "string";
327
+ };
328
+ readonly onTap: {
329
+ readonly $ref: "#/$defs/action";
330
+ };
331
+ readonly role: {
332
+ readonly type: "string";
333
+ };
334
+ readonly disabled: {
335
+ readonly type: "boolean";
336
+ };
337
+ readonly disabledPath: {
338
+ readonly type: "string";
339
+ };
340
+ readonly menu: {
341
+ readonly type: "array";
342
+ readonly items: {
343
+ readonly $ref: "#/$defs/topBarMenuItem";
344
+ };
345
+ };
346
+ readonly content: {
347
+ readonly $ref: "#/$defs/component";
348
+ };
349
+ readonly loadingPath: {
350
+ readonly type: "string";
351
+ };
352
+ readonly avatar: {
353
+ readonly $ref: "#/$defs/toolbarAvatar";
354
+ };
355
+ readonly labelPath: {
356
+ readonly type: "string";
357
+ };
358
+ };
359
+ };
360
+ readonly toolbarAvatar: {
361
+ readonly type: "object";
362
+ readonly additionalProperties: false;
363
+ readonly properties: {
364
+ readonly imageUrl: {
365
+ readonly type: "string";
366
+ };
367
+ readonly initials: {
368
+ readonly type: "string";
369
+ };
370
+ readonly imageUrlPath: {
371
+ readonly type: "string";
372
+ };
373
+ readonly initialsPath: {
374
+ readonly type: "string";
375
+ };
376
+ };
377
+ };
378
+ readonly topBarLogo: {
379
+ readonly type: "object";
380
+ readonly additionalProperties: false;
381
+ readonly properties: {
382
+ readonly imageUrl: {
383
+ readonly type: "string";
384
+ };
385
+ readonly imageUrlDark: {
386
+ readonly type: "string";
387
+ };
388
+ readonly imageAsset: {
389
+ readonly type: "string";
390
+ };
391
+ readonly name: {
392
+ readonly type: "string";
393
+ };
394
+ readonly placement: {
395
+ readonly type: "string";
396
+ };
397
+ readonly imageUrlPath: {
398
+ readonly type: "string";
399
+ };
400
+ readonly accessibilityLabel: {
401
+ readonly type: "string";
402
+ };
403
+ };
404
+ };
405
+ readonly topBarTitleMenu: {
406
+ readonly type: "object";
407
+ readonly additionalProperties: false;
408
+ readonly properties: {
409
+ readonly items: {
410
+ readonly type: "array";
411
+ readonly items: {
412
+ readonly $ref: "#/$defs/topBarMenuItem";
413
+ };
414
+ };
415
+ readonly selectedId: {
416
+ readonly type: "string";
417
+ };
418
+ readonly selectedIdPath: {
419
+ readonly type: "string";
420
+ };
421
+ readonly accessibilityLabel: {
422
+ readonly type: "string";
423
+ };
424
+ };
425
+ };
426
+ readonly topBarMenuItem: {
427
+ readonly type: "object";
428
+ readonly additionalProperties: false;
429
+ readonly required: readonly ["id", "label"];
430
+ readonly properties: {
431
+ readonly id: {
432
+ readonly type: "string";
433
+ readonly minLength: 1;
434
+ };
435
+ readonly label: {
436
+ readonly type: "string";
437
+ };
438
+ readonly icon: {
439
+ readonly type: "string";
440
+ };
441
+ readonly destructive: {
442
+ readonly type: "boolean";
443
+ };
444
+ readonly disabled: {
445
+ readonly type: "boolean";
446
+ };
447
+ readonly action: {
448
+ readonly $ref: "#/$defs/action";
449
+ };
275
450
  };
276
451
  };
277
452
  readonly topBarAction: {
@@ -1260,6 +1435,181 @@ export declare const widgetSnapshotSchema: {
1260
1435
  readonly style: {
1261
1436
  readonly type: "string";
1262
1437
  };
1438
+ readonly items: {
1439
+ readonly type: "array";
1440
+ readonly items: {
1441
+ readonly $ref: "#/$defs/toolbarItem";
1442
+ };
1443
+ };
1444
+ readonly titleDisplay: {
1445
+ readonly type: "string";
1446
+ };
1447
+ readonly subtitle: {
1448
+ readonly type: "string";
1449
+ };
1450
+ readonly visibility: {
1451
+ readonly type: "string";
1452
+ };
1453
+ readonly background: {
1454
+ readonly $ref: "#/$defs/tokenRef";
1455
+ };
1456
+ readonly logo: {
1457
+ readonly $ref: "#/$defs/topBarLogo";
1458
+ };
1459
+ readonly titleMenu: {
1460
+ readonly $ref: "#/$defs/topBarTitleMenu";
1461
+ };
1462
+ readonly subtitlePath: {
1463
+ readonly type: "string";
1464
+ };
1465
+ readonly scrollBehavior: {
1466
+ readonly type: "string";
1467
+ };
1468
+ readonly dirtyPath: {
1469
+ readonly type: "string";
1470
+ };
1471
+ };
1472
+ };
1473
+ readonly toolbarItem: {
1474
+ readonly type: "object";
1475
+ readonly additionalProperties: false;
1476
+ readonly required: readonly ["id"];
1477
+ readonly properties: {
1478
+ readonly id: {
1479
+ readonly type: "string";
1480
+ readonly minLength: 1;
1481
+ };
1482
+ readonly placement: {
1483
+ readonly type: "string";
1484
+ };
1485
+ readonly label: {
1486
+ readonly type: "string";
1487
+ };
1488
+ readonly icon: {
1489
+ readonly type: "string";
1490
+ };
1491
+ readonly onTap: {
1492
+ readonly $ref: "#/$defs/action";
1493
+ };
1494
+ readonly role: {
1495
+ readonly type: "string";
1496
+ };
1497
+ readonly disabled: {
1498
+ readonly type: "boolean";
1499
+ };
1500
+ readonly disabledPath: {
1501
+ readonly type: "string";
1502
+ };
1503
+ readonly menu: {
1504
+ readonly type: "array";
1505
+ readonly items: {
1506
+ readonly $ref: "#/$defs/topBarMenuItem";
1507
+ };
1508
+ };
1509
+ readonly content: {
1510
+ readonly $ref: "#/$defs/component";
1511
+ };
1512
+ readonly loadingPath: {
1513
+ readonly type: "string";
1514
+ };
1515
+ readonly avatar: {
1516
+ readonly $ref: "#/$defs/toolbarAvatar";
1517
+ };
1518
+ readonly labelPath: {
1519
+ readonly type: "string";
1520
+ };
1521
+ };
1522
+ };
1523
+ readonly toolbarAvatar: {
1524
+ readonly type: "object";
1525
+ readonly additionalProperties: false;
1526
+ readonly properties: {
1527
+ readonly imageUrl: {
1528
+ readonly type: "string";
1529
+ };
1530
+ readonly initials: {
1531
+ readonly type: "string";
1532
+ };
1533
+ readonly imageUrlPath: {
1534
+ readonly type: "string";
1535
+ };
1536
+ readonly initialsPath: {
1537
+ readonly type: "string";
1538
+ };
1539
+ };
1540
+ };
1541
+ readonly topBarLogo: {
1542
+ readonly type: "object";
1543
+ readonly additionalProperties: false;
1544
+ readonly properties: {
1545
+ readonly imageUrl: {
1546
+ readonly type: "string";
1547
+ };
1548
+ readonly imageUrlDark: {
1549
+ readonly type: "string";
1550
+ };
1551
+ readonly imageAsset: {
1552
+ readonly type: "string";
1553
+ };
1554
+ readonly name: {
1555
+ readonly type: "string";
1556
+ };
1557
+ readonly placement: {
1558
+ readonly type: "string";
1559
+ };
1560
+ readonly imageUrlPath: {
1561
+ readonly type: "string";
1562
+ };
1563
+ readonly accessibilityLabel: {
1564
+ readonly type: "string";
1565
+ };
1566
+ };
1567
+ };
1568
+ readonly topBarTitleMenu: {
1569
+ readonly type: "object";
1570
+ readonly additionalProperties: false;
1571
+ readonly properties: {
1572
+ readonly items: {
1573
+ readonly type: "array";
1574
+ readonly items: {
1575
+ readonly $ref: "#/$defs/topBarMenuItem";
1576
+ };
1577
+ };
1578
+ readonly selectedId: {
1579
+ readonly type: "string";
1580
+ };
1581
+ readonly selectedIdPath: {
1582
+ readonly type: "string";
1583
+ };
1584
+ readonly accessibilityLabel: {
1585
+ readonly type: "string";
1586
+ };
1587
+ };
1588
+ };
1589
+ readonly topBarMenuItem: {
1590
+ readonly type: "object";
1591
+ readonly additionalProperties: false;
1592
+ readonly required: readonly ["id", "label"];
1593
+ readonly properties: {
1594
+ readonly id: {
1595
+ readonly type: "string";
1596
+ readonly minLength: 1;
1597
+ };
1598
+ readonly label: {
1599
+ readonly type: "string";
1600
+ };
1601
+ readonly icon: {
1602
+ readonly type: "string";
1603
+ };
1604
+ readonly destructive: {
1605
+ readonly type: "boolean";
1606
+ };
1607
+ readonly disabled: {
1608
+ readonly type: "boolean";
1609
+ };
1610
+ readonly action: {
1611
+ readonly $ref: "#/$defs/action";
1612
+ };
1263
1613
  };
1264
1614
  };
1265
1615
  readonly topBarAction: {