@wix/himalaya-cli 0.1019.0 → 0.1021.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
@@ -120,6 +120,22 @@ Only **unambiguous** defects, so a green run stays worth trusting:
120
120
  | `list-shrank-on-load-more` | **warning** | A "load more" returned FEWER rows than before it ran: the new page replaced the list instead of extending it. |
121
121
  | `list-grew-on-filter` | **warning** | A filter, search or sort made a list longer. Narrowing can reorder or remove, never add. |
122
122
  | `typed-value-ignored` | **warning** | The crawl typed the value a control really carries — the payload key every renderer injects for that control — and the dispatch changed **nothing**: no state, no navigation, no request. The value is read off the app itself (an id from the control's own options, or a word from the worker's seeded state) and is always one the control is *not* already showing, so a reducer that ignores it cannot work on device. A warning because the input is the crawl's: a reducer that legitimately no-ops on a value is possible, and `himi-test.json` `skip[]` takes the invariant. |
123
+ | `unnamed-control` | error | **Accessibility.** An operable control — a `Button`, `Toggle`, `TextField`, `Chip`, … or any node an `onTap` promotes to a button — whose *only* accessible name is a binding the worker resolved to an empty string, so a screen reader announces an unnamed control. `himi validate`'s a11y pass cannot see this: it counts `$service:` / `$item` as a name, because on device it becomes copy. Only the crawl has run the worker. Judged per real row inside a bound list, and reported once at the row template. Silent on a name authored empty (that is `himi validate`'s finding, not repeated here), on `null` / absent values (other invariants'), on content that is not a control (a bound `Text` that came out empty), and on nodes collapsed in that state. |
124
+
125
+ **Accessibility: what a clean run does NOT mean.** `unnamed-control` is the only
126
+ accessibility property the crawl judges, and it is deliberately the narrow one: the name a
127
+ worker actually produced for a control. It does not judge names authored in the descriptor
128
+ (`himi validate` does — its `a11y` pass is on by default, and the crawl never repeats what it
129
+ reports), role or state announcement, focus order, contrast, or touch-target size. The gap
130
+ ledger says so on every run with an `a11y` entry, because a headless crawl cannot close it —
131
+ before that entry existed, a clean crawl with an empty ledger read as an accessibility pass.
132
+ It ships at `error`: a control a screen reader cannot name is unusable, not a matter of taste.
133
+ Swept before it did, over 53 apps and templates: one false positive (a tap-to-dismiss `Text`
134
+ that `collapseWhenEmpty` removes, now honoured) and one real defect — a blank download button
135
+ on a lesson screen whose id resolves to no lesson. That last one is also why an input-less boot's
136
+ finding is **not** retired the way `no-request-issued` is: a detail screen reached with a stale
137
+ or unknown id renders exactly the state the crawl's input-less boot does, so a label that goes
138
+ blank there goes blank for a real user too.
123
139
 
124
140
  **Deliberately never reported:** an empty collection · an `error` state (often the correct
125
141
  answer to empty input) · a `null` optional.
package/guides/tokens.md CHANGED
@@ -20,6 +20,7 @@ one registry, mirrored byte-for-byte by the iOS + Android decoders.
20
20
  | `tabBar` / `drawer` / `sidebar` | nav-chrome style blocks | optional |
21
21
  | `kit` | { material?, variant?, density?, motion? } | optional — the active design kit |
22
22
  | `contentMaxWidth` | { base, medium?, expanded? } | optional |
23
+ | `elevations` | name → { level?, tint?, shadow?, border? } | optional — a Card wears `card` |
23
24
 
24
25
  ## ⚠️ Typography requires `size`, `weight`, AND `line`
25
26
 
@@ -86,3 +87,12 @@ Alternative full token sets ship with the CLI as design kits (material, shadcn,
86
87
  liquid-glass, brutalist, dark-luxe, neumorphic, skeuomorphic, minimal-editorial). Adopt a kit
87
88
  by copying its `tokens` into tokens.json; the active kit's app-wide axes
88
89
  (material/variant/density/motion) live in the top-level `kit` block.
90
+
91
+ ## Elevation
92
+
93
+ `elevations.card` is the depth every `Card` wears — paint only, never a layout change:
94
+ `level` 0–5 is Material 3 tonal elevation (the fill tinted with `tint`, default `accentPrimary`),
95
+ `shadow` names a `shadows` token cast in the Card's own shape, and `border: { color, width? }`
96
+ is a hairline inside the edge (default 0.5). Declare none and Cards stay flat. To look native on
97
+ each platform, declare `"card": {}` and let the idiom overlays fill it: `material` a `level`,
98
+ `ios` a `border` + `shadow`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1019.0",
3
+ "version": "0.1021.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": [
@@ -65,5 +65,5 @@
65
65
  "artifactId": "himalaya-cli"
66
66
  }
67
67
  },
68
- "falconPackageHash": "1bc07d659f8a5254f7afe76b39faf5f6d53dff12518cfd6257039a78"
68
+ "falconPackageHash": "d1be6f315217ca51d1f3bc16c0ce5d9d9e20bbc364b3a3a171c15ace"
69
69
  }