@wix/himalaya-cli 0.1462.0 → 0.1464.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.
Binary file
@@ -21,8 +21,7 @@
21
21
  "Video",
22
22
  "PdfView",
23
23
  "MediaPlayer",
24
- "TimeGrid",
25
- "Agenda"
24
+ "TimeGrid"
26
25
  ],
27
26
  "components": [
28
27
  {
@@ -1277,31 +1276,18 @@
1277
1276
  "category": "Cross-cutting & media",
1278
1277
  "propsType": "PdfViewProps",
1279
1278
  "bindings": [],
1280
- "notImplemented": [
1281
- {
1282
- "props": [
1283
- "showPageControls",
1284
- "startPage"
1285
- ],
1286
- "platforms": [
1287
- "android"
1288
- ],
1289
- "severity": "styling",
1290
- "note": "No page controls. `startPage` is ignored."
1291
- },
1292
- {
1293
- "props": [
1294
- "showPageControls",
1295
- "zoomable",
1296
- "allowShare"
1297
- ],
1298
- "platforms": [
1299
- "web"
1300
- ],
1301
- "severity": "styling",
1302
- "note": "No page controls. The browser PDF viewer ignores `zoomable` and `allowShare`."
1303
- }
1304
- ],
1279
+ "notImplemented": {
1280
+ "props": [
1281
+ "showPageControls",
1282
+ "zoomable",
1283
+ "allowShare"
1284
+ ],
1285
+ "platforms": [
1286
+ "web"
1287
+ ],
1288
+ "severity": "styling",
1289
+ "note": "Interactive PDF.js canvas rendering honours the reader’s page, zoom and export controls. Static previews and PDF.js loading/rendering failures use a native browser-viewer fallback. In that fallback, hiding page or zoom controls is only a viewer hint and cannot reliably hide browser chrome; allowShare hides the reader’s export controls but cannot prevent browser save/print. These props are UI controls, not document access restrictions."
1290
+ },
1305
1291
  "propsSource": "export interface PdfViewProps {\n url?: string;\n height?: number;\n showPageControls?: boolean;\n /** 1-based; 0/absent ⇒ page 1. */\n startPage?: number;\n zoomable?: boolean;\n allowShare?: boolean;\n}"
1306
1292
  },
1307
1293
  {
@@ -1399,20 +1385,19 @@
1399
1385
  "category": "Rich vector & celebration (motion grammar Batch 4)",
1400
1386
  "propsType": "TimeGridProps",
1401
1387
  "bindings": [
1388
+ "anchorDatePath",
1402
1389
  "eventsPath",
1403
1390
  "resourcesPath"
1404
1391
  ],
1405
1392
  "notImplemented": {
1406
1393
  "props": [
1407
- "anchorDatePath",
1408
- "onRangeChange",
1409
1394
  "onCreate"
1410
1395
  ],
1411
1396
  "platforms": [
1412
1397
  "android"
1413
1398
  ],
1414
1399
  "severity": "category",
1415
- "note": "`anchorDatePath` does not bind, and `onRangeChange` and `onCreate` never fire."
1400
+ "note": "`onCreate` never fires."
1416
1401
  },
1417
1402
  "propsSource": "export interface TimeGridProps {\n mode?: \"day\" | \"3day\" | \"week\";\n anchorDate?: string;\n anchorDatePath?: string;\n events?: CalendarEvent[];\n eventsPath?: string;\n startHour?: number;\n endHour?: number;\n firstWeekday?: number;\n showNowLine?: boolean;\n onSelectEvent?: Action;\n onRangeChange?: Action;\n /** Per-event body, `$item.*`-substituted per event. Absent ⇒ the built-in block. */\n eventTemplate?: Component;\n /** RESOURCE lanes: staff, rooms, chairs, courts. Overlap packing already splits\n * concurrent events into ANONYMOUS sub-columns; lanes make a column MEAN\n * something. Single-day modes only — a week of resource columns is a 2-D grid\n * that does not fit a phone, so `mode: \"week\"` ignores them. */\n resources?: TimeGridResource[];\n resourcesPath?: string;\n /** EDITING. Opt-in, default off, so no existing read-only\n * grid can regress into one that moves bookings when a user meant to scroll. */\n editable?: boolean;\n /** Snap grid in minutes (default 15). A drag landing on 10:07 is almost never\n * what anyone meant, and no scheduling system accepts it. */\n snapMinutes?: number;\n /** Moved or resized → args{id, start, end}. The component REPORTS; the worker\n * decides. An edit that must be rejected has to be able to fail. */\n onEventChange?: Action;\n /** Empty space long-pressed → args{start, end} for one `snapMinutes` slot. */\n onCreate?: Action;\n /** Labels for the non-drag equivalents. Drag is unreachable by VoiceOver,\n * TalkBack and keyboard, so these are how editing stays operable at all. */\n moveActionLabel?: string;\n resizeActionLabel?: string;\n}"
1418
1403
  },
@@ -1424,16 +1409,6 @@
1424
1409
  "eventsPath",
1425
1410
  "scrollToDatePath"
1426
1411
  ],
1427
- "notImplemented": {
1428
- "props": [
1429
- "stickyHeaders"
1430
- ],
1431
- "platforms": [
1432
- "android"
1433
- ],
1434
- "severity": "styling",
1435
- "note": "Day headers do not pin."
1436
- },
1437
1412
  "propsSource": "export interface AgendaProps {\n events?: CalendarEvent[];\n eventsPath?: string;\n scrollToDate?: string;\n /** Worker-driven jump target (a literal `scrollToDate` is frozen in the descriptor). */\n scrollToDatePath?: string;\n stickyHeaders?: boolean;\n emptyText?: string;\n onSelectEvent?: Action;\n /** Per-event row body, `$item.*`-substituted per event. Closes the gap that made\n * `agendaList()` (the LazyList-backed PRESET, which takes a `rowTemplate`) more\n * expressive than this component. Absent ⇒ the built-in row. */\n eventTemplate?: Component;\n /** Newest-first. Absent/false ⇒ ascending. Applies to the day GROUPS and to the\n * events within each group. Without it a list whose default sort is \"Newest\"\n * (an owner's orders, recent activity) could not become an Agenda without\n * silently inverting itself — every arm sorted ascending unconditionally. */\n descending?: boolean;\n}"
1438
1413
  }
1439
1414
  ],
@@ -111,17 +111,17 @@ See also **[Modifiers](#modifiers)** (the `modifiers` block) and **[Actions](#ac
111
111
  | `Lottie` | Rich vector & celebration (motion grammar Batch 4) | — |
112
112
  | `Rive` | Rich vector & celebration (motion grammar Batch 4) | — |
113
113
  | `MonthCalendar` | Rich vector & celebration (motion grammar Batch 4) | `selectedDatePath`, `decorationsPath`, `yearPath`, `monthPath`, `selectedStartDatePath`, `selectedEndDatePath` |
114
- | `TimeGrid` | Rich vector & celebration (motion grammar Batch 4) | `eventsPath`, `resourcesPath` |
114
+ | `TimeGrid` | Rich vector & celebration (motion grammar Batch 4) | `anchorDatePath`, `eventsPath`, `resourcesPath` |
115
115
  | `Agenda` | Rich vector & celebration (motion grammar Batch 4) | `eventsPath`, `scrollToDatePath` |
116
116
 
117
117
  ## Not implemented (decoded but never read)
118
118
 
119
119
  These props are accepted by the schema and pass validation, but the named platform's renderer never reads them — they silently do nothing (no warning, no log). Prefer a prop NOT listed here, or drive the behaviour from a worker.
120
120
 
121
- **Scope: 19 of 86 components, all of them android / web / ios-only** — every other component/platform pair reads every prop it decodes. The list splits in two, and the halves mean different things:
121
+ **Scope: 18 of 86 components, all of them android / web / ios-only** — every other component/platform pair reads every prop it decodes. The list splits in two, and the halves mean different things:
122
122
 
123
123
  - **`category` (7: `Menu`, `Tooltip`, `Popover`, `ChipsInput`, `OtpInput`, `MediaPlayer`, `TimeGrid`)** — the prop changes the component's *kind*. These genuinely are **not implemented**: an overlay renders always-visible inline, so the component does not do the job its name implies. Check the row's note for a working alternative.
124
- - **`styling` (12: `Text`, `Icon`, `Carousel`, `Pager`, `Snackbar`, `WebView`, `Slider`, `SelectionControl`, `ActivityIndicator`, `Video`, `PdfView`, `Agenda`)** — the component itself **works**; only the listed prop is inert. `Slider` on iOS is a working slider whose `debounceMs` does not throttle — not a broken `Slider`. Use the component; just do not depend on that one prop.
124
+ - **`styling` (11: `Text`, `Icon`, `Carousel`, `Pager`, `Snackbar`, `WebView`, `Slider`, `SelectionControl`, `ActivityIndicator`, `Video`, `PdfView`)** — the component itself **works**; only the listed prop is inert. `Slider` on iOS is a working slider whose `debounceMs` does not throttle — not a broken `Slider`. Use the component; just do not depend on that one prop.
125
125
 
126
126
  | Component | Unread props | Platform | Kind | Note |
127
127
  |---|---|---|---|---|
@@ -141,13 +141,11 @@ These props are accepted by the schema and pass validation, but the named platfo
141
141
  | `ChipsInput` | `onAdd` | ios, android | category | `onAdd` never dispatches. |
142
142
  | `OtpInput` | `onComplete`, `onChange` | ios, android, web | category | Neither `onChange` nor `onComplete` dispatches. |
143
143
  | `Video` | `poster` | ios | styling | `poster` is not shown. |
144
- | `PdfView` | `showPageControls`, `startPage` | android | styling | No page controls. `startPage` is ignored. |
145
- | `PdfView` | `showPageControls`, `zoomable`, `allowShare` | web | styling | No page controls. The browser PDF viewer ignores `zoomable` and `allowShare`. |
144
+ | `PdfView` | `showPageControls`, `zoomable`, `allowShare` | web | styling | Interactive PDF.js canvas rendering honours the reader’s page, zoom and export controls. Static previews and PDF.js loading/rendering failures use a native browser-viewer fallback. In that fallback, hiding page or zoom controls is only a viewer hint and cannot reliably hide browser chrome; allowShare hides the reader’s export controls but cannot prevent browser save/print. These props are UI controls, not document access restrictions. |
146
145
  | `MediaPlayer` | `autoplayVisibilityThreshold`, `preload`, `playbackRates`, `showQueue`, `showChapters`, `showTranscript` | ios | category | `autoplayVisibilityThreshold` is ignored (whenVisible = once on appear). `preload` is ignored. `playbackRates` is ignored, and the queue/chapters/transcript panels never render. |
147
146
  | `MediaPlayer` | `externalPlayback`, `appearance`, `allowCellular`, `preload`, `playbackRates`, `showQueue`, `showChapters`, `showTranscript` | android | category | `externalPlayback` is forced off. `appearance` is ignored. `allowCellular` is ignored. `preload` is ignored. `playbackRates` is ignored, and the queue/chapters/transcript panels never render. |
148
147
  | `MediaPlayer` | `allowCellular`, `forwardSkipSeconds`, `backwardSkipSeconds`, `playbackRates`, `showQueue`, `showChapters`, `showTranscript` | web | category | `allowCellular` is ignored. Skip buttons ignore `forwardSkipSeconds`/`backwardSkipSeconds`. `playbackRates` is ignored, and the queue/chapters/transcript panels never render. |
149
- | `TimeGrid` | `anchorDatePath`, `onRangeChange`, `onCreate` | android | category | `anchorDatePath` does not bind, and `onRangeChange` and `onCreate` never fire. |
150
- | `Agenda` | `stickyHeaders` | android | styling | Day headers do not pin. |
148
+ | `TimeGrid` | `onCreate` | android | category | `onCreate` never fires. |
151
149
 
152
150
  ## Token slots: `TokenRef` object vs bare `TokenName` string
153
151
 
@@ -2090,9 +2088,7 @@ export interface PdfViewProps {
2090
2088
  }
2091
2089
  ```
2092
2090
 
2093
- > ⚠️ **Implemented, but these props are inert on android:** `showPageControls`, `startPage` — No page controls. `startPage` is ignored.
2094
-
2095
- > ⚠️ **Implemented, but these props are inert on web:** `showPageControls`, `zoomable`, `allowShare` — No page controls. The browser PDF viewer ignores `zoomable` and `allowShare`.
2091
+ > ⚠️ **Implemented, but these props are inert on web:** `showPageControls`, `zoomable`, `allowShare` — Interactive PDF.js canvas rendering honours the reader’s page, zoom and export controls. Static previews and PDF.js loading/rendering failures use a native browser-viewer fallback. In that fallback, hiding page or zoom controls is only a viewer hint and cannot reliably hide browser chrome; allowShare hides the reader’s export controls but cannot prevent browser save/print. These props are UI controls, not document access restrictions.
2096
2092
 
2097
2093
  #### MediaPlayer
2098
2094
 
@@ -2265,7 +2261,7 @@ export interface TimeGridProps {
2265
2261
  }
2266
2262
  ```
2267
2263
 
2268
- > ⚠️ **Not implemented on android:** `anchorDatePath`, `onRangeChange`, `onCreate` — `anchorDatePath` does not bind, and `onRangeChange` and `onCreate` never fire.
2264
+ > ⚠️ **Not implemented on android:** `onCreate` — `onCreate` never fires.
2269
2265
 
2270
2266
  #### Agenda
2271
2267
 
@@ -2291,8 +2287,6 @@ export interface AgendaProps {
2291
2287
  }
2292
2288
  ```
2293
2289
 
2294
- > ⚠️ **Implemented, but these props are inert on android:** `stickyHeaders` — Day headers do not pin.
2295
-
2296
2290
  ## Screen descriptor shape
2297
2291
 
2298
2292
  ```ts
@@ -70,6 +70,12 @@
70
70
  "jsdoc": "/**\n * Repeating-refresh directive. An action may return its new state with a transient\n * `_poll` field; the runtime strips it and asks the host to invoke `action` every\n * `intervalMs`. The worker has no timers — this is the only way it refreshes on a\n * cadence. Each fire runs through the normal reducer→render loop.\n *\n * The polled action MUST be idempotent (merge by id, never append): overlapping\n * ticks, a retried query and a cold-start refetch all have to converge on one row.\n */",
71
71
  "decl": "export interface PollDirective {\n /** Stable id; a new directive with the same id REPLACES the prior timer. */\n id: string;\n /** Requested period. Native clamps to a 1000ms floor and logs the clamp. */\n intervalMs: number;\n /** \"<service>.<action>\" — invoked on every fire. */\n action: string;\n /** Fire once immediately instead of waiting out the first interval. */\n immediate?: boolean;\n}"
72
72
  },
73
+ {
74
+ "name": "PollStopDirective",
75
+ "kind": "interface",
76
+ "jsdoc": "/**\n * Stops the poll `id`. Return it as `_poll` — typically from the polled\n * action itself, on the tick that sees the job finish: the host cancels `id` and does\n * not re-arm it. Stopping an id that is not polling is a no-op. A stop never starts or\n * replaces a poll, so it carries nothing else. Type a state's field as\n * `_poll?: PollDirective | PollStopDirective` to allow both.\n */",
77
+ "decl": "export interface PollStopDirective {\n /** The id the poll was started under. */\n id: string;\n /** Must be the boolean `true`. */\n stop: true;\n}"
78
+ },
73
79
  {
74
80
  "name": "encodeSubtree",
75
81
  "kind": "function",
@@ -565,10 +565,24 @@ What the host guarantees, on every surface:
565
565
 
566
566
  Two things to know before you reach for it:
567
567
 
568
- - **`_poll` has no stop form.** The directive can start and replace a poll, not end one.
569
- Worker teardown is the only stop; navigating away from a pooled screen pauses the poll
570
- rather than ending it. Pick a cadence you would be comfortable running on several
571
- screens at once.
568
+ - **Stop it when the work is done.** Return `_poll: { id, stop: true }` to cancel the poll
569
+ `id` — typically from the polled action itself, on the tick that sees the job finish:
570
+
571
+ ```ts
572
+ checkJob: async (s) => {
573
+ const job = await fetchJob(s.jobId);
574
+ return job.status === "done"
575
+ ? { ...s, job, _poll: { id: `job-${s.jobId}`, stop: true } } // ends the poll
576
+ : { ...s, job }; // keeps polling
577
+ },
578
+ ```
579
+
580
+ The stop is stripped from state like any `_poll`. The tick that returns it finishes
581
+ normally and the host does not re-arm it. Stopping an id that is not polling is a no-op.
582
+ `stop` must be the boolean `true`. A stop never starts or replaces a poll, so other
583
+ fields on it (`intervalMs`, `action`, `immediate`) are ignored; leave them off. Without
584
+ a stop, worker teardown ends the poll, and leaving a pooled screen only pauses it. So
585
+ pick a cadence you would be comfortable running on several screens at once.
572
586
  - **Emit it from the action that runs on every entry**, not only from a first-open path.
573
587
  Restored worker state re-paints data but arms no timer, so a poll armed only by `open`
574
588
  restores into a screen that *looks* live and never refreshes.
@@ -583,7 +597,7 @@ invisible: the timer arms, fires forever, and does nothing.
583
597
  > state. And contrast with `_stream` ([RFC 0040](../core/schema/RFC/0040-tier5-streaming-bridge.md)):
584
598
  > `_stream` is for data the server pushes, `_poll` for data it does not.
585
599
 
586
- Full specification, the eight host semantics, the per-surface background signal, and the
600
+ Full specification, the nine host semantics, the per-surface background signal, and the
587
601
  accepted limitations: [RFC 0040 § Amendment — the `_poll` directive](../core/schema/RFC/0040-tier5-streaming-bridge.md#amendment-2026-08-16--the-_poll-directive).
588
602
 
589
603
  ### Navigate to a detail screen (tabs + push)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1462.0",
3
+ "version": "0.1464.0",
4
4
  "type": "module",
5
5
  "description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
6
6
  "keywords": [
@@ -71,5 +71,5 @@
71
71
  "artifactId": "himalaya-cli"
72
72
  }
73
73
  },
74
- "falconPackageHash": "d40739f8a350f4cf15d4ea5e3677bd4b4b29a3c9311c8e80752b9d3b"
74
+ "falconPackageHash": "3919cfeb6cc26ef641fd143cfe0395aad1e15aea098655650caa396b"
75
75
  }