@wix/himalaya-cli 0.1568.0 → 0.1570.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 (168) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/l10n-strings.d.ts +3 -2
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/business-contact-service.d.ts +17 -0
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/business-contact.d.ts +73 -0
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/index.d.ts +3 -0
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/invite-target.d.ts +1 -0
  6. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/invite.d.ts +148 -0
  7. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/screens.mjs +558 -84
  8. package/dist/cli.mjs +21211 -20843
  9. package/dist/preview-assets.generated.bin +0 -0
  10. package/guides/app-config.md +10 -0
  11. package/guides/app-icon.md +20 -1
  12. package/guides/getting-started.md +5 -0
  13. package/guides/himi-json-output.md +7 -0
  14. package/guides/himi-skill.md +5 -0
  15. package/guides/one-app-to-himi-app.md +159 -4
  16. package/guides/skill.md +5 -0
  17. package/guides/splash-screens.md +156 -5
  18. package/guides/tier-5-add-a-screen.md +20 -0
  19. package/package.json +2 -2
  20. package/templates/beauty-salon/config.ts +17 -0
  21. package/templates/beauty-salon/dev/index.ts +478 -0
  22. package/templates/beauty-salon/himalaya.content.json +6 -0
  23. package/templates/beauty-salon/splash.json +3 -0
  24. package/templates/beauty-salon/tier5-src/_shared/himi-copy.ts +17 -6
  25. package/templates/beauty-salon/tier5-src/_shared/rich-body.ts +44 -0
  26. package/templates/beauty-salon/tier5-src/business-contact/index.ts +6 -0
  27. package/templates/beauty-salon/tier5-src/himi-booking-service/index.ts +13 -9
  28. package/templates/beauty-salon/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  29. package/templates/beauty-salon-owner/config.ts +8 -0
  30. package/templates/beauty-salon-owner/dev/index.ts +1 -0
  31. package/templates/beauty-salon-owner/tier5-src/_shared/himi-copy.ts +17 -6
  32. package/templates/beauty-salon-owner/tier5-src/_shared/rich-body.ts +44 -0
  33. package/templates/branded-lite/config.ts +17 -0
  34. package/templates/branded-lite/dev/index.ts +541 -1
  35. package/templates/branded-lite/himalaya.content.json +6 -0
  36. package/templates/branded-lite/splash.json +3 -0
  37. package/templates/branded-lite/tier5-src/_shared/himi-copy.ts +17 -6
  38. package/templates/branded-lite/tier5-src/_shared/rich-body.ts +44 -0
  39. package/templates/branded-lite/tier5-src/business-contact/index.ts +6 -0
  40. package/templates/branded-lite/tier5-src/himi-booking-service/index.ts +13 -9
  41. package/templates/branded-lite/tier5-src/himi-branded-lite-group/index.ts +20 -3
  42. package/templates/branded-lite/tier5-src/himi-branded-lite-groups/index.ts +18 -2
  43. package/templates/branded-lite/tier5-src/himi-branded-lite-notifsettings/index.ts +39 -11
  44. package/templates/branded-lite/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  45. package/templates/brandy/tier5-src/_shared/himi-copy.ts +17 -6
  46. package/templates/community-club/config.ts +17 -0
  47. package/templates/community-club/dev/index.ts +480 -1
  48. package/templates/community-club/himalaya.content.json +6 -0
  49. package/templates/community-club/splash.json +3 -0
  50. package/templates/community-club/tier5-src/_shared/himi-copy.ts +17 -6
  51. package/templates/community-club/tier5-src/_shared/rich-body.ts +44 -0
  52. package/templates/community-club/tier5-src/business-contact/index.ts +6 -0
  53. package/templates/community-club/tier5-src/himi-branded-lite-group/index.ts +20 -3
  54. package/templates/community-club/tier5-src/himi-branded-lite-groups/index.ts +18 -2
  55. package/templates/community-club/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  56. package/templates/community-club-owner/config.ts +8 -0
  57. package/templates/community-club-owner/dev/index.ts +1 -0
  58. package/templates/community-club-owner/tier5-src/_shared/himi-copy.ts +17 -6
  59. package/templates/community-club-owner/tier5-src/_shared/rich-body.ts +44 -0
  60. package/templates/events-meetups/config.ts +17 -0
  61. package/templates/events-meetups/dev/index.ts +480 -1
  62. package/templates/events-meetups/himalaya.content.json +6 -0
  63. package/templates/events-meetups/splash.json +3 -0
  64. package/templates/events-meetups/tier5-src/_shared/himi-copy.ts +17 -6
  65. package/templates/events-meetups/tier5-src/_shared/rich-body.ts +44 -0
  66. package/templates/events-meetups/tier5-src/business-contact/index.ts +6 -0
  67. package/templates/events-meetups/tier5-src/himi-branded-lite-group/index.ts +20 -3
  68. package/templates/events-meetups/tier5-src/himi-branded-lite-groups/index.ts +18 -2
  69. package/templates/events-meetups/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  70. package/templates/events-meetups-owner/config.ts +8 -0
  71. package/templates/events-meetups-owner/dev/index.ts +1 -0
  72. package/templates/events-meetups-owner/tier5-src/_shared/himi-copy.ts +17 -6
  73. package/templates/events-meetups-owner/tier5-src/_shared/rich-body.ts +44 -0
  74. package/templates/gym-fitness/config.ts +17 -0
  75. package/templates/gym-fitness/dev/index.ts +478 -0
  76. package/templates/gym-fitness/himalaya.content.json +6 -0
  77. package/templates/gym-fitness/splash.json +3 -0
  78. package/templates/gym-fitness/tier5-src/_shared/himi-copy.ts +17 -6
  79. package/templates/gym-fitness/tier5-src/_shared/rich-body.ts +44 -0
  80. package/templates/gym-fitness/tier5-src/business-contact/index.ts +6 -0
  81. package/templates/gym-fitness/tier5-src/himi-booking-service/index.ts +13 -9
  82. package/templates/gym-fitness/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  83. package/templates/gym-fitness-owner/config.ts +8 -0
  84. package/templates/gym-fitness-owner/dev/index.ts +1 -0
  85. package/templates/gym-fitness-owner/tier5-src/_shared/himi-copy.ts +17 -6
  86. package/templates/gym-fitness-owner/tier5-src/_shared/rich-body.ts +44 -0
  87. package/templates/himi-chat/dev/index.ts +1 -0
  88. package/templates/himi-chat/tier5-src/_shared/himi-copy.ts +17 -6
  89. package/templates/nonprofit-cause/config.ts +17 -0
  90. package/templates/nonprofit-cause/dev/index.ts +480 -1
  91. package/templates/nonprofit-cause/himalaya.content.json +6 -0
  92. package/templates/nonprofit-cause/splash.json +3 -0
  93. package/templates/nonprofit-cause/tier5-src/_shared/himi-copy.ts +17 -6
  94. package/templates/nonprofit-cause/tier5-src/_shared/rich-body.ts +44 -0
  95. package/templates/nonprofit-cause/tier5-src/business-contact/index.ts +6 -0
  96. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-group/index.ts +20 -3
  97. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-groups/index.ts +18 -2
  98. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  99. package/templates/nonprofit-cause-owner/config.ts +8 -0
  100. package/templates/nonprofit-cause-owner/dev/index.ts +1 -0
  101. package/templates/nonprofit-cause-owner/tier5-src/_shared/himi-copy.ts +17 -6
  102. package/templates/nonprofit-cause-owner/tier5-src/_shared/rich-body.ts +44 -0
  103. package/templates/owner-lite/config.ts +8 -0
  104. package/templates/owner-lite/dev/index.ts +1 -0
  105. package/templates/owner-lite/tier5-src/_shared/himi-copy.ts +17 -6
  106. package/templates/owner-lite/tier5-src/_shared/rich-body.ts +44 -0
  107. package/templates/podcast-creator/config.ts +17 -0
  108. package/templates/podcast-creator/dev/index.ts +450 -0
  109. package/templates/podcast-creator/himalaya.content.json +6 -0
  110. package/templates/podcast-creator/splash.json +3 -0
  111. package/templates/podcast-creator/tier5-src/_shared/himi-copy.ts +17 -6
  112. package/templates/podcast-creator/tier5-src/_shared/rich-body.ts +44 -0
  113. package/templates/podcast-creator/tier5-src/business-contact/index.ts +6 -0
  114. package/templates/podcast-creator/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  115. package/templates/podcast-creator-owner/config.ts +8 -0
  116. package/templates/podcast-creator-owner/dev/index.ts +1 -0
  117. package/templates/podcast-creator-owner/tier5-src/_shared/himi-copy.ts +17 -6
  118. package/templates/podcast-creator-owner/tier5-src/_shared/rich-body.ts +44 -0
  119. package/templates/portfolio-creative/config.ts +17 -0
  120. package/templates/portfolio-creative/dev/index.ts +450 -0
  121. package/templates/portfolio-creative/himalaya.content.json +6 -0
  122. package/templates/portfolio-creative/splash.json +3 -0
  123. package/templates/portfolio-creative/tier5-src/_shared/himi-copy.ts +17 -6
  124. package/templates/portfolio-creative/tier5-src/_shared/rich-body.ts +44 -0
  125. package/templates/portfolio-creative/tier5-src/business-contact/index.ts +6 -0
  126. package/templates/portfolio-creative/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  127. package/templates/portfolio-creative-owner/config.ts +8 -0
  128. package/templates/portfolio-creative-owner/dev/index.ts +1 -0
  129. package/templates/portfolio-creative-owner/tier5-src/_shared/himi-copy.ts +17 -6
  130. package/templates/portfolio-creative-owner/tier5-src/_shared/rich-body.ts +44 -0
  131. package/templates/restaurant/config.ts +17 -0
  132. package/templates/restaurant/dev/index.ts +450 -0
  133. package/templates/restaurant/himalaya.content.json +6 -0
  134. package/templates/restaurant/splash.json +3 -0
  135. package/templates/restaurant/tier5-src/_shared/himi-copy.ts +17 -6
  136. package/templates/restaurant/tier5-src/_shared/rich-body.ts +44 -0
  137. package/templates/restaurant/tier5-src/business-contact/index.ts +6 -0
  138. package/templates/restaurant/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  139. package/templates/restaurant-owner/config.ts +8 -0
  140. package/templates/restaurant-owner/dev/index.ts +1 -0
  141. package/templates/restaurant-owner/tier5-src/_shared/himi-copy.ts +17 -6
  142. package/templates/restaurant-owner/tier5-src/_shared/rich-body.ts +44 -0
  143. package/templates/retail-store/config.ts +17 -0
  144. package/templates/retail-store/dev/index.ts +450 -0
  145. package/templates/retail-store/himalaya.content.json +6 -0
  146. package/templates/retail-store/splash.json +3 -0
  147. package/templates/retail-store/tier5-src/_shared/himi-copy.ts +17 -6
  148. package/templates/retail-store/tier5-src/_shared/rich-body.ts +44 -0
  149. package/templates/retail-store/tier5-src/business-contact/index.ts +6 -0
  150. package/templates/retail-store/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  151. package/templates/retail-store-owner/config.ts +8 -0
  152. package/templates/retail-store-owner/dev/index.ts +1 -0
  153. package/templates/retail-store-owner/tier5-src/_shared/himi-copy.ts +17 -6
  154. package/templates/retail-store-owner/tier5-src/_shared/rich-body.ts +44 -0
  155. package/templates/surface-showcase/dev/index.ts +1 -0
  156. package/templates/yoga-studio/config.ts +17 -0
  157. package/templates/yoga-studio/dev/index.ts +478 -0
  158. package/templates/yoga-studio/himalaya.content.json +6 -0
  159. package/templates/yoga-studio/splash.json +3 -0
  160. package/templates/yoga-studio/tier5-src/_shared/himi-copy.ts +17 -6
  161. package/templates/yoga-studio/tier5-src/_shared/rich-body.ts +44 -0
  162. package/templates/yoga-studio/tier5-src/business-contact/index.ts +6 -0
  163. package/templates/yoga-studio/tier5-src/himi-booking-service/index.ts +13 -9
  164. package/templates/yoga-studio/tier5-src/himi-branded-lite-splash/index.ts +35 -0
  165. package/templates/yoga-studio-owner/config.ts +8 -0
  166. package/templates/yoga-studio-owner/dev/index.ts +1 -0
  167. package/templates/yoga-studio-owner/tier5-src/_shared/himi-copy.ts +17 -6
  168. package/templates/yoga-studio-owner/tier5-src/_shared/rich-body.ts +44 -0
Binary file
@@ -79,6 +79,16 @@ your envelope + per-surface links), and `himi render <screen> --device mac|watch
79
79
 
80
80
  ## Splash (the launch moment)
81
81
 
82
+ **T5 Branded Lite apps:** when the existing exact screen registry contains
83
+ `himi_branded_splash`, its descriptor/worker owns the editable in-app appearance.
84
+ Read `himi docs splash-screens` before editing: change its `input.showIcon`, the
85
+ root background token and the gradient token's colours/stops/angle. CSS angles such
86
+ as 90 (horizontal) and 135 (diagonal) are supported by that T5 layer. Preserve the
87
+ native fallback and binary OS launch settings. Generated packages keep the descriptor
88
+ in `dev/index.ts` and the worker in `tier5-src/`. Do not assume an older native
89
+ host can mount a newly added screen. The following contract describes the native
90
+ fallback and legacy apps; it is not the T5 appearance editor.
91
+
82
92
  `splash` is ONE declaration with TWO consumers, and only the second is OTA:
83
93
 
84
94
  - **Build time** — `splash.backgroundColor` (a color TOKEN name, never a hex) generates the
@@ -26,6 +26,7 @@ it. Offer the customer the choice — it is their brand:
26
26
  ```sh
27
27
  himi icon status # what would ship right now, and whether a store would take it
28
28
  himi icon from-site --book .himi/business-book # the logo `himi site analyze` downloaded
29
+ himi icon from-one-app --evidence-dir .himi/one-app # the verified collected app's existing logo
29
30
  himi icon set ./their-logo.png # a file the customer supplied
30
31
  himi icon generate # a gradient tile + glyph, for a customer with no mark
31
32
  himi icon glyphs # what `generate --glyph` accepts
@@ -44,10 +45,22 @@ nobody has said what the app is. So pick one with `--glyph` when you know
44
45
  (`himi icon glyphs` lists them, `book` and `graduation` among them), and read the neutral
45
46
  tile as what it is — a placeholder, still waiting for the customer's real mark.
46
47
 
47
- `set`, `from-site` and `generate` all do the same finishing work: **trim** the art, centre
48
+ `set`, `from-site`, `from-one-app` and `generate` all do the same finishing work: **trim** the art, centre
48
49
  it, **flatten it onto your app's accent colour**, write it as an exactly-1024 square with no
49
50
  alpha channel, derive the 512 Play listing icon, and record it in `himalaya.content.json`.
50
51
 
52
+ Source images accept at most 16 MiB of encoded input and a 2048-square decoded canvas.
53
+ SVGs use density-bounded rasterization before normalization, under the same pixel cap.
54
+ Animated GIF/WebP marks use a composited poster with the most distinguishable artwork,
55
+ measured against one background reference for the animation. Review the resulting mark
56
+ against the source. Poster decoding accepts at most 256 frames, a 4-million-pixel canvas,
57
+ 64 million total frame pixels and 16 MiB of encoded input; larger animations are refused
58
+ with advice to supply the existing static mark. Other multi-page formats retain their
59
+ first-page behavior. `from-one-app` requires the image toolchain before downloading or
60
+ replacing an icon, so it cannot report success without normalization and the Play rendition.
61
+ It checks both renditions in a scratch package before installing them; a rejected source
62
+ leaves the current master, Play icon and manifest unchanged.
63
+
51
64
  **The declaration is the part people miss.** An off-repo package's icon is whatever
52
65
  `himalaya.content.json` names:
53
66
 
@@ -62,6 +75,12 @@ declare is art nothing ships: the release bakes no icon, and a binary then falls
62
75
  `himi icon` writes both halves, and `himi validate` / `push` / `dist` refuse a package whose
63
76
  declared icon is missing.
64
77
 
78
+ Customer native builds copy the contract's prepared master into the iOS and Android
79
+ launcher resources. The shared Mac materializer resizes that same master into all ten
80
+ `AppIcon.appiconset` renditions and writes their catalog metadata; it preserves the source
81
+ artwork. A platform-only preparation writes only that platform's native tree. Existing
82
+ binaries need rebuilding to pick up a changed launcher icon.
83
+
65
84
  ## What each store wants
66
85
 
67
86
  The two specs **conflict**, so these are two derived files and neither can serve both:
@@ -33,6 +33,11 @@ and template-preview journey below. Write the reconstruction plan, `SPEC.md`,
33
33
  same-site One App visitor binding, checks and hosted draft. Obtain the
34
34
  site owner's agreement before creating or updating an OAuth client for optional
35
35
  member flows; visitor reads and native email/password sign-in need no client.
36
+ Before composing content, read `himi docs designing-himi-screens` and apply the
37
+ migration guide's screen-content contract: readable detail sections, stable rail
38
+ and image sizing, grouped icon rows for More, native bottom clearance and distinct
39
+ loading/empty/error states. Put the relevant cases in `MOBILE-UX.md` and verify
40
+ the generated screens; reading the guide is not layout evidence.
36
41
  Preserve the supplied layout and
37
42
  apply the user's separate optional prompt. Use `CI=1 himi init` with
38
43
  `--no-first-look`; do not execute its generic `doNow` / `doNowAgain` template-preview
@@ -32,6 +32,13 @@ keeps its existing fields and adds the code:
32
32
  }
33
33
  ```
34
34
 
35
+ ## `himi icon from-one-app` codes
36
+
37
+ | Code | Meaning |
38
+ | --- | --- |
39
+ | `source_icon_unavailable` | Verified source evidence or its logo is missing, unreadable, unavailable, over the download/decoding budget, or cannot be normalized. |
40
+ | `source_icon_unusable` | The prepared source mark fails mechanical launcher/store checks. Existing icon files and metadata are left unchanged. |
41
+
35
42
  ## Push codes
36
43
 
37
44
  | Code | Meaning |
@@ -56,6 +56,11 @@ and template-preview journey below. Write the reconstruction plan, `SPEC.md`,
56
56
  same-site One App visitor binding, checks and hosted draft. Obtain the
57
57
  site owner's agreement before creating or updating an OAuth client for optional
58
58
  member flows; visitor reads and native email/password sign-in need no client.
59
+ Before composing content, read `himi docs designing-himi-screens` and apply the
60
+ migration guide's screen-content contract: readable detail sections, stable rail
61
+ and image sizing, grouped icon rows for More, native bottom clearance and distinct
62
+ loading/empty/error states. Put the relevant cases in `MOBILE-UX.md` and verify
63
+ the generated screens; reading the guide is not layout evidence.
59
64
  Preserve the supplied layout and
60
65
  apply the user's separate optional prompt. Use `CI=1 himi init` with
61
66
  `--no-first-look`; do not execute its generic `doNow` / `doNowAgain` template-preview
@@ -195,10 +195,13 @@ Apply these interpretation rules:
195
195
  - Before publishing, run the migration-only top-bar coverage check:
196
196
  `himi one-app validate-topbar --evidence-dir .himi/one-app --content .`.
197
197
  It verifies the collected raw and platform-enriched evidence hashes, then checks
198
- authored cart/chat settings and the resolved platform top-bar button definitions
198
+ authored cart/chat/Invite settings and the resolved platform top-bar button definitions
199
199
  against tappable `navigation.topBarDefault.actions` or mapped
200
200
  `ScreenDescriptor.topBar.actions` when a screen replaces the default. A dynamic
201
- bar that cannot be inspected is reported as unverified. Platform definitions establish
201
+ bar that cannot be inspected is reported as unverified. The maintained `inviteAction`
202
+ builder is recognized; its conditional ID and hidden binding must also appear in
203
+ `topBarDefault.actions` with a configured `navLogicBundle`, even when the screen
204
+ overrides its bar. A screen-only binding is not subscribed. Platform definitions establish
202
205
  a feature to account for; they do not alone prove visibility or access for every
203
206
  visitor or member. Resolve those rules separately. This check is specific to this
204
207
  migration workflow; it does not change the behavior of `himi validate`.
@@ -250,6 +253,32 @@ Apply these interpretation rules:
250
253
  `CollapsingHeader` hero/card above the page. This target adaptation supersedes
251
254
  the older instruction to reproduce the source cover header; the source
252
255
  research still explains how to interpret its settings.
256
+ - **Business contact is shared content.** For native contact sections
257
+ `platform_general_contact_section` / `platform_general_contact_section_bp`, use
258
+ `businessContactSection` and `createBusinessContactService` from
259
+ `@wix/himalaya/screens`, rather than hand-authoring phone/URL/map rows. Pass
260
+ `businessContext.contact` as normalized public business evidence, retaining
261
+ `isPhysical` and numeric coordinates; combine the separate source website URL
262
+ and legacy phoneNumber only when the corresponding contact value is absent.
263
+ Pass source visibility/get-in-touch settings; mark BP settings with
264
+ `isBusinessProfile: true`. Empty normal settings receive source defaults,
265
+ while nonempty settings leave omitted visibility flags off. Map visibility
266
+ still follows source settings. An address-only business can offer external
267
+ directions, but invalid/incomplete/virtual points never become guessed
268
+ coordinates. Message opens the existing `himi_business_chat` route with its
269
+ normal auth behavior. The Branded app's source builder accepts the same data through
270
+ provisioning `businessContact: { contact, settings, showMemberCount, memberCount }`;
271
+ `himi_business_contact` is inherited by generated starters; adopt the same SDK
272
+ builder with normalized source inputs when authoring their baked descriptors.
273
+ Do not route business
274
+ contact to `himi_app_info`, which describes the app's support and release details.
275
+ Preserve member-count content outside obsolete custom header chrome when the
276
+ source requests it. Set the section's `showMemberCount` and pass the optional
277
+ public `businessContext.memberCount` through typed onAppear `args`. Omit an
278
+ unknown count, and show unavailable/error states; avatar/page lengths are not
279
+ totals. A collected total is a source snapshot. Only use an injected live
280
+ count reader when its public, site-bound permission path has been verified.
281
+ See the screens SDK's downloadable business-contact guide for the full recipe.
253
282
  - Emit resolved native actions in `navigation.topBarDefault` or a complete
254
283
  per-screen `topBar` override. The shell owns back/menu controls. Per-screen
255
284
  actions support `hiddenPath` when `navigation.topBarDefault.actions` declares
@@ -268,12 +297,78 @@ Apply these interpretation rules:
268
297
  access rules. Report unsupported avatar/logo/action behavior as a gap; do not
269
298
  invent member data, drop a configured CTA silently, or add an in-page toolbar
270
299
  to imitate a missing native control.
300
+ - **Invite is behavior, independent of the custom cover.** When the source header's
301
+ `settings.showInviteButton` is true, use the reusable `inviteAction`, `inviteScreen`
302
+ and service recipes from `@wix/himalaya/screens`. The source opens an Invite modal;
303
+ the target uses a native screen whose explicit Share button owns creation and login.
304
+ For each source screen, use the corresponding generated
305
+ `.himi/one-app/invite-plan.json` metadata: its flag comes from the referenced
306
+ header and `businessId` from collected `manifest.source.metaSiteId`. Do not use
307
+ a public website as an invitation or copy an example business ID.
308
+
309
+ In the nav worker, mount `createInviteAvailabilityService({ source })` and
310
+ declare `share` and `app_info`. It only reads availability. Register
311
+ `inviteAction({ id: "source.invite", screenId: "source_invite" })` with the same
312
+ ID and hidden binding in `topBarDefault.actions` and every complete screen
313
+ override that needs it. A source screen with `showInviteButton: false` must
314
+ exclude Invite from its effective actions (use a complete screen override if
315
+ the default includes it). Unresolved top-bar visibility paths remain visible
316
+ under the current native resolver policy; the screen always rechecks source
317
+ availability and authorization before acting. The validator refuses opaque
318
+ action entries, including nested handlers/parameters and computed helper options.
319
+ Literal actions need literal `id`, `icon`, `label`, and `accessibilityLabel` values
320
+ when supplied so classification cannot silently discard an unknown Invite;
321
+ use native path bindings for live labels. If a disabled header flag conflicts with a collected native
322
+ Invite action, resolve that source-policy conflict before authoring the target.
323
+ Declare the Invite and existing member sign-in screens
324
+ in `navigation.linkableScreens`. Add
325
+ `inviteScreen({ screenId: "source_invite", bundleUrl: "/v1/bundles/source-invite" })`
326
+ to the screen registry. Its separate screen worker mounts:
327
+
328
+ ```ts
329
+ import { createInviteService } from "@wix/himalaya/screens";
330
+ export const invite = createInviteService({
331
+ source: () => sourceInvite, // this migration's bound flag/businessId or verified URL
332
+ signInScreenId: existingMemberSignInScreenId,
333
+ });
334
+ ```
335
+
336
+ The descriptor declares `share`, `wix_api` and `app_info`. `inviteButton` is also
337
+ available for ordinary page content owned by this screen service. Bind the same
338
+ current source metadata in both workers; never take the target from route params.
339
+ The reusable screen recipes include an Invite integration example.
340
+ The native nav worker stays alive across account switches, so it must not own
341
+ a fresh-load login continuation. The screen service uses shared confirmed
342
+ consumer auth continuation: its Share tap begins
343
+ an opaque host intent, opens the app's existing sign-in screen as a modal, and
344
+ a fresh screen load rechecks source, sharing availability and member identity
345
+ before atomically consuming the confirmed intent once. The sign-in worker must
346
+ forward that token with its existing credential action. Cancellation, expiry,
347
+ another account, bare routes and ordinary loads do not authorize an invitation.
348
+ Unsupported hosts show an update-required message without starting a guest write.
349
+ This requires the updated host continuation/auth SDK in rebuilt native binaries
350
+ or the updated web host; OTA content alone cannot supply it.
351
+
352
+ Business resolution additionally requires the explicit native host signal
353
+ `oneAppInviteAvailable === true`, supplied by the updated native core.
354
+ Old binaries and web fail closed for this resolver. A verified, already resolved
355
+ source invite URL can use sharing on web, including guest login continuation
356
+ on a supported host. An already signed-in member can share without a continuation.
357
+ On web, an expired browser activation is resumed by a host-owned Share/Copy
358
+ confirmation; this requires the updated web host and does not repeat the Invite
359
+ action or create another invitation. A cancelled or degraded share retains
360
+ incomplete-sharing feedback; it never reports a completed share.
361
+ Only a validated HTTPS URL from bound metadata or the source Invite response is
362
+ shared. No invitation is created while migrating or just loading the screen.
363
+ Source Invite produces an `interaction` coverage row requiring behavioral proof;
364
+ unresolved transport or permissions remain gaps, never silent omission.
271
365
  - Verify the migrated app's native top bar, bottom tabs, back navigation and
272
366
  configured actions on the affected devices, including RTL. A web screenshot
273
367
  alone does not prove native navigation or control availability. Record any
274
368
  unavailable device check as unverified.
275
- - Business context contains only `phoneNumber`, `website`, and `services`, with
276
- their permitted nested values. Structure wins on authored phone/URL/design.
369
+ - Business context contains `phoneNumber`, `website`, `services`, optional public
370
+ `contact`, and an optional validated public `memberCount`, with their permitted
371
+ nested values. Structure wins on authored phone/URL/design.
277
372
  Installed services do not add features. Installation IDs are not record IDs.
278
373
  Do not restore excluded Business titles, colors, identity or member fields.
279
374
  - Referenced editor-authored documents, such as Pages rich text, are presentation
@@ -349,6 +444,13 @@ those operations with fixtures, not real transactions. `MOBILE-UX.md` needs its
349
444
  acceptance states with one `Primary CTA` per cell and actual render widths under
350
445
  `## Evidence`.
351
446
 
447
+ Before composing or adapting content, read `himi docs designing-himi-screens`.
448
+ Apply the **Screen-content contract** in step 3 below to the
449
+ reconstruction plan and its `MOBILE-UX.md` acceptance cases. Keep the source's
450
+ content, order, actions and access rules; this contract supplies layout choices
451
+ where a source section needs a native composition. It does not replace the
452
+ native-navigation policy above or authorize a different business feature.
453
+
352
454
  Keep `.himi/one-app/migration-report.md` throughout the run. For every in-scope
353
455
  placement and interaction, record supported, adapted, conditional or unresolved
354
456
  status, the implementation and evidence, and intentional prompt-driven differences.
@@ -362,6 +464,20 @@ Rows cover source graph warnings and app-wide design values as well as routes an
362
464
  controls. This is an inventory of migration obligations, not proof that their target
363
465
  actions work.
364
466
 
467
+ Preserve the existing app mark after scaffolding: run `himi icon from-one-app
468
+ --content . --evidence-dir .himi/one-app`. This reads the hash-verified collected
469
+ `settings.logoImageUrl`, downloads that mark and uses the existing icon normalizer
470
+ to produce the opaque launcher master and Play listing icon. Animated marks use
471
+ their fullest composited frame within bounded decoding limits. It does not run
472
+ site analysis or generate new artwork. If the source mark is absent or unavailable,
473
+ keep that migration obligation unresolved; obtain the existing mark and use
474
+ `himi icon set <file>`. An already collected site's logo may be used with
475
+ `himi icon from-site --book <dir>` only when it is the intended source identity.
476
+ Run `himi icon check --content .` and visually compare the result with the source.
477
+ For a marked One App migration, `himi validate --strict` fails when the icon is
478
+ missing, still byte-identical to a bundled template, or its pixel checks cannot run. A passing mechanical check
479
+ cannot establish ownership of arbitrary custom artwork; compare the real mark too.
480
+
365
481
  Map each row to a target screen and, for interactions or top-bar controls, a
366
482
  target control. A `design` row is app-wide, so it needs no screen or control: it is
367
483
  satisfied by the design check instead. Set its `status` to `supported`, `adapted`, `conditional`, or
@@ -482,6 +598,45 @@ not share mutable filters accidentally. Keep static authored content in the app,
482
598
  and products, services, availability, posts and member records live on the same site.
483
599
  Refresh data after operations without reconnecting layout to the One App editor.
484
600
 
601
+ ### Screen-content contract
602
+
603
+ Use the current [screen design guide](https://apps.wix.com/_api/himi-serve/docs/designing-himi-screens.md) and the app's
604
+ actual tokens and component reference. Do not copy dimensions or a card wrapper
605
+ from an unrelated template. Choose these patterns before building the screens:
606
+
607
+ | Content case | Compose | Check in the generated app |
608
+ |---|---|---|
609
+ | Page rhythm | Use one consistent content gutter and the app's spacing scale. Separate headings, body copy and sections through type and spacing. Use logical leading/trailing insets. | Short and long localized copy remain readable on a narrow phone and in RTL; a missing optional section leaves no extra gap. |
610
+ | Program, group and other detail sections | Keep the main description and facts in a readable page column. Use a `Section` or ordinary stack for hierarchy; use `Card` only for a related cluster that needs a separate surface. Do not put every paragraph or section inside another bordered box. Retain authored borders when they convey meaning. | The loaded page and its empty/error states have deliberate hierarchy, without repeated decorative borders or nested card padding. Rich descriptions retain their supported formatting. |
611
+ | Horizontal content rails | Give each card an explicit consistent width and reserve its image area using the supported `width`/`height` or `aspectRatio` modifiers. Reserve the same text/action area across neighboring cards; use `Text.maxLines` for bounded previews and keep full content reachable. Match the loading placeholder and missing-image fallback to those slots. Keep horizontal worker-backed lists bounded, as described in the design guide. | A delayed image, failed image and loaded image keep the card and following section in place. Long titles and larger text do not clip controls; adjust the rail's shared size when necessary instead of cutting off content. |
612
+ | More / overflow destinations | Keep every source destination and its routing. Group related destinations under meaningful headings; use consistent icon-and-label rows such as `ListItem`, with one row owning the navigation action. Use a shared group surface when appropriate instead of giving every row its own border. | Every overflow destination is reachable, its icon and label describe its content, and the last group remains reachable. Do not add a second in-page top bar. |
613
+ | Bottom clearance | Keep scrolling content inside the shell's native navigation and safe-area layout. Put a persistent screen action in `stickyFooter`, outside the scrolling body. Add intentional content-end spacing using the app's tokens; do not guess a universal tab-bar height or copy a web-only spacer. | Scroll to the actual last row and activate its control on each affected native device, with tabs and any footer visible. The row and tap target sit above the chrome, including after content or text-size changes. |
614
+ | Empty content | Render an `EmptyState` that explains the current result and offers a real next step only when one exists. Loading, sign-in, permission and failed reads keep their own states. | An empty response is understandable, a failed read is not presented as an empty success, and an unavailable source section is recorded as a gap rather than replaced with sample records or a blank tab. |
615
+
616
+ These are composition instructions, not a new renderer feature or an automatic
617
+ layout guarantee. Reuse existing live-data workers and supported components;
618
+ retain customer-authored copy and the chosen locale. A missing platform feature
619
+ remains an explicit gap.
620
+
621
+ Include the relevant cases in `MOBILE-UX.md` before implementation. Verify the
622
+ actual generated screens after implementation, rather than signing off from the
623
+ guide or an unchanged template screenshot:
624
+
625
+ - Drive More and a representative detail screen, including every overflow
626
+ destination and the final row below the fold.
627
+ - Capture a rail before images resolve, after they resolve and with a failed
628
+ image. Use controlled delayed responses in test fixtures; keep fixture data and
629
+ scenario switches out of the published app.
630
+ - Check loaded, loading, empty and failed-read states at the recorded narrow
631
+ width, with long copy, larger text and the target layout direction. Check
632
+ native bottom tabs and a persistent footer where present; web rendering alone
633
+ cannot establish native clearance or tap behavior.
634
+ - Save the observations and artifacts in `MOBILE-UX.md` and the migration report.
635
+ Fix layout defects and retest the affected cases before calling the migration
636
+ complete. Record unavailable checks as unverified.
637
+
638
+ ### Same-site identity
639
+
485
640
  Bind the app to the same site through its **One App visitor identity**. It is the
486
641
  identity a visitor of the source Branded app already has, so it needs no OAuth client
487
642
  and creates nothing on the customer's site. The `branded-lite` template does not supply `provisioning.json`:
package/guides/skill.md CHANGED
@@ -27,6 +27,11 @@ and template-preview journey below. Write the reconstruction plan, `SPEC.md`,
27
27
  same-site One App visitor binding, checks and hosted draft. Obtain the
28
28
  site owner's agreement before creating or updating an OAuth client for optional
29
29
  member flows; visitor reads and native email/password sign-in need no client.
30
+ Before composing content, read `himi docs designing-himi-screens` and apply the
31
+ migration guide's screen-content contract: readable detail sections, stable rail
32
+ and image sizing, grouped icon rows for More, native bottom clearance and distinct
33
+ loading/empty/error states. Put the relevant cases in `MOBILE-UX.md` and verify
34
+ the generated screens; reading the guide is not layout evidence.
30
35
  Preserve the supplied layout and
31
36
  apply the user's separate optional prompt. Use `CI=1 himi init` with
32
37
  `--no-first-look`; do not execute its generic `doNow` / `doNowAgain` template-preview
@@ -364,13 +364,165 @@ Note that the `splash` accessibility id / `testTag` on some apps today belongs t
364
364
 
365
365
  ### Branded-lite logo and handoff
366
366
 
367
+ #### Branded-lite T5 splash (iOS, Android and macOS)
368
+
369
+ When `splash.enabled` is true, the standalone Branded Lite native hosts can render
370
+ `himi_branded_splash` above the existing native in-app splash. The system launch
371
+ screen stays binary-owned. After seeding and artwork readiness, the hosts mount
372
+ the T5 region first. Home mounts after the T5 presentation animation finishes, so
373
+ its startup work cannot consume the entrance animation's first frames
374
+ (JavaScriptCore on iOS and WebView construction/rendering on Android).
375
+ Dismissal then waits for Home's first content.
376
+ `maxHoldMs` always takes priority, including a missing or unresponsive worker.
377
+ A failed descriptor/bundle keeps the native fallback and releases the T5 wait.
378
+ The splash worker never marks Home ready.
379
+
380
+ On Android the OS exit provider stays above Compose until the native splash
381
+ has actually drawn. Composition alone is too early and can expose a blank icon gap.
382
+ The pre-draw keep condition is released at composition so this cannot deadlock drawing.
383
+ Before mounting the worker screens, the host awaits removal of the OS exit provider.
384
+ Otherwise WebView startup can block Android's splash transfer past its deadline and
385
+ trigger the default 20dp window-shift animation, even with identical icon bounds.
386
+ The wait ends immediately on removal, skips Activity recreation, and has a one-second
387
+ ceiling for launches with no system splash callback.
388
+ The native surface remains visible while the region loads and if its descriptor
389
+ or bundle fails. Set `splash.logoAsset: "branded_lite_app_icon"`, `logoWidth: 192`
390
+ and `minVisibleMs: 0` for an immediate native icon that matches Android's OS crop.
391
+ Once the worker is ready, the T5 screen paints its own opaque background and content.
392
+ The native artwork cannot leak through when T5 hides its icon. The native hosts
393
+ suppress the region's default spinner. The region tears its worker down on dismissal
394
+ and does not occupy a warm-worker pool slot. The standalone macOS host uses the
395
+ same T5 handoff. The web host keeps its existing startup surface and resolves the
396
+ `branded_lite_app_icon` alias through the current app's web icon URL; it does not
397
+ mount the native T5 handoff.
398
+
399
+ #### Editing from an agent or Containers
400
+
401
+ First check the app's screen registry. A T5-capable Branded Lite app contains the exact
402
+ `himi_branded_splash` descriptor and the `himi-branded-lite-splash` worker. For this app,
403
+ edit that descriptor and its referenced design tokens. Do not use the legacy native `splash`
404
+ block as the primary appearance editor: it controls the underlying native fallback.
405
+ Do not assume an older binary can mount a newly added T5 screen. Without the descriptor or
406
+ T5 host support, retain the legacy contract and state the required native upgrade.
407
+
408
+ In a generated content package, the descriptor lives in `SCREENS` in `dev/index.ts`.
409
+ Its editable contract is:
410
+
411
+ - `input.showIcon`: `true` shows the app icon; `false` fades it out. Preserve the existing
412
+ worker bindings, the 192-point native handoff icon, presentation marker and motion wiring.
413
+ - Root node `splash_t5`: `modifiers.background.token` names an opaque colour token.
414
+ - Node `splash_t5_gradient`: `modifiers.backgroundGradient.token` names a gradient in
415
+ `tokens.json`. Its `colors` are colour-token names; `angle` uses CSS degrees (`180`
416
+ top-to-bottom, `90` left-to-right, `135` diagonal); optional `locations` place its stops.
417
+ More than two colours are supported. Unlike the legacy native fallback, the T5 renderers
418
+ honour the gradient angle. Preserve light/dark token values that were not requested to change.
419
+
420
+ An orientation-only request changes the gradient angle, preserving the colours and icon.
421
+ An icon-visibility request changes `input.showIcon`, preserving background tokens. Keep
422
+ `splash.enabled: true` for the native host and preserve the native launch/fallback colour
423
+ and icon for ordinary T5 edits. In particular, hiding the T5 icon does not empty native
424
+ `logoAsset`: Android's OS launch icon stays in the binary and the T5 icon fades away at handoff.
425
+ A newly generated home-screen app icon is a different operation and still requires a native build.
426
+ Generated Branded Lite templates also include `splash.json` with an `iconUrl` field. Set it to
427
+ the app's approved public HTTPS image URL; AppSmith supplies the Plan's app icon when scaffolding
428
+ under the splash experiment. Each app owns this source. Publishing a later URL change updates
429
+ the T5 image without rebuilding or changing `config.ts` native splash settings. An empty URL
430
+ keeps the bundled fallback. In source apps, `splashAppearance.iconUrl` reads the same file.
431
+ The hosted icon uses the same `splash_t5_icon` circle and inner `splash_t5_icon_image` as the
432
+ bundled icon: a 192-point frame with the central two-thirds crop. The native hosts prewarm its URL
433
+ before presentation. Containers reads that same crop and size. Image fetch failure keeps the native
434
+ fallback within the boot deadline. Neither this source nor a T5 update changes the launcher
435
+ icon or the very first OS splash. Existing binaries require the T5 splash host to use it.
436
+
437
+ A custom T5 splash logo can use a public HTTPS Media Manager/generated-image URL without replacing
438
+ that home-screen icon. Source apps use `logoUrl` and `logoSize` (48–240 points) in `splashAppearance`.
439
+ The builder keeps the initial 192-point app icon as `splash_t5_handoff_icon`, then cross-fades to the
440
+ requested `splash_t5_icon` at the same centre. `input.customLogo: true` enables that worker path:
441
+ `customLogoHidden` starts true and changes to the inverse of `showIcon` on `present`, while
442
+ `iconHidden` hides the handoff icon. Keep the custom logo node while hidden so it can be restored.
443
+ In raw descriptors, update the custom Image and wrapper dimensions together, and preserve the
444
+ existing worker/motion wiring. Old splash workers need the matching content update.
445
+
446
+ `backgroundImageUrl` adds a full-canvas layer above the gradient. Use a VStack containing a
447
+ Spacer, with `fillMaxWidth: true` and `backgroundImagePath: "$service:splash.backgroundImageUrl"`.
448
+ The worker exposes `input.backgroundImageUrl` as that state field. This existing bound-background
449
+ renderer fills the canvas on iOS and Android. Do not size an Image with `onMeasure`, `$measure:`
450
+ or `widthPath`/`heightPath`: those size bindings are decode-only on native. Image > gradient >
451
+ colour remains the precedence. URLs must be public HTTPS without embedded credentials. The host
452
+ keeps native launch artwork visible until remote splash images are cached; failed artwork leaves
453
+ the native fallback within the original boot deadline. Neither URL changes the OS splash.
454
+
455
+ For a solid T5 background, use the root colour token and omit the gradient layer. When adding
456
+ one back, retain the existing fade transition and presentation marker's motion contract.
457
+ Build and validate the content package, inspect the built splash descriptor and referenced
458
+ gradient, then render `himi_branded_splash` in the requested colour scheme. Ship the change
459
+ through the normal authorized draft release so Containers reads the descriptor and tokens
460
+ from that same release. A chat acknowledgement alone is not evidence of an applied edit.
461
+
462
+ In source apps, edit `splashAppearance` in the splash descriptor builder:
463
+
464
+ ```ts
465
+ export const splashAppearance: SplashAppearance = {
466
+ showIcon: false, // true shows the app icon; false fades it out
467
+ backgroundColor: "accentPrimary", // opaque fallback underneath the gradient
468
+ backgroundGradient: "brand", // key in tokens.json's gradients registry
469
+ // Optional: logoSize: 120, logoUrl: "https://static.wixstatic.com/media/logo.png",
470
+ // Optional: backgroundImageUrl: "https://static.wixstatic.com/media/background.jpg",
471
+ };
472
+ ```
473
+
474
+ Remove `backgroundGradient` for a solid background. To change gradient colors, edit
475
+ the selected gradient's `colors` array in `tokens.json` (color token names), or add
476
+ a dedicated gradient there and select its name above. Use a dark gradient with
477
+ `textOnAccent` so the copy stays readable. The default is the `brand` gradient with
478
+ the icon visible. The visible icon keeps the native fallback's 192-point circle,
479
+ center and central-two-thirds crop. The copy stays in place when the icon hides.
480
+
481
+ The gradient fades in over the opaque solid color using the existing `appearSoft`
482
+ motion token (500 ms by default). Hiding the icon uses the same token for an
483
+ exit fade. The copy stays still. A small presentation marker appears after the
484
+ worker commits visibility and tells the host which motion to wait for. Once T5
485
+ is presented, the host cross-fades the entire native surface directly into the T5
486
+ appearance using the T5 motion duration (400 ms when none is specified). There is no
487
+ intermediate solid-color stage or icon disappearance. Both icons keep the same
488
+ 192-point centre and crop; matching artwork stays steady, and changed artwork
489
+ cross-fades in place. Home starts after the background handoff so its worker boot
490
+ and first paint cannot cut across the animation. It then dismisses the splash
491
+ when its content is ready. The initial color
492
+ comes from the installed build's resources; the target appearance and motion
493
+ come from T5. This handoff requires one host build; subsequent T5 edits use OTA
494
+ content. The native cover cannot reappear during the final fade to Home.
495
+ Native Reduced Motion skips these fades and the
496
+ presentation wait. A solid-color splash has no gradient layer. These animations
497
+ can delay an otherwise-ready Home, but never extend the hard startup deadline.
498
+
499
+ These settings affect only the T5 layer. A new color or hidden icon becomes visible
500
+ at the single native-to-T5 handoff. They do not change Android's OS launch screen or
501
+ the native fallback; those keep their existing settings. The fallback can still be
502
+ configured separately through the existing `splash` app-config. Changing the OS
503
+ launch screen requires a native build.
504
+
505
+ The descriptor and its `himi-branded-lite-splash` worker
506
+ use existing components, tokens and `splash.title` / `splash.caption` copy keys. The
507
+ worker makes no network or native capability calls. The exact-screen seed includes
508
+ it for release/offline builds. Host integration requires one initial native build;
509
+ later appearance, token and worker changes use the ordinary app release/OTA path.
510
+
511
+ For local previews, enable `splash` through the local preview service's ephemeral
512
+ `PUT /v1/admin/app-config`. Preview alternate descriptors with
513
+ `PUT /v1/admin/screens/himi_branded_splash` and token changes with
514
+ `PUT /v1/admin/tokens`; these overrides are not saved. A temporary
515
+ `minVisibleMs: 2000` makes capture easier but adds a one-second native logo fade.
516
+ Run the phone `splash/startup.yaml` flows to check the handoff to navigation.
517
+
367
518
  Use the baked branded-lite app icon as the in-app logo:
368
519
 
369
520
  ```ts
370
521
  splash: { enabled: true, logoAsset: "branded_lite_app_icon", logoWidth: 192 }
371
522
  ```
372
523
 
373
- Hide the logo on both Android splash layers with an **explicit empty string**:
524
+ Hide the logo on Android's OS and native fallback layers with an **explicit empty
525
+ string** (the T5 icon is controlled separately by `showIcon` above):
374
526
 
375
527
  ```ts
376
528
  splash: { enabled: true, logoAsset: "" }
@@ -408,10 +560,9 @@ within the same deadline. Once dismissed, the iOS splash stays dismissed even if
408
560
  OTA timing settings change. Branded-lite Android image splashes use translucent dark system-bar
409
561
  scrims with light icons for legibility; color and gradient splashes remain full-bleed.
410
562
  Web retains its current transitions and readiness.
411
- The standalone branded-lite macOS shell currently does not mount a boot splash
412
- overlay; `splash.enabled` does not enable one there. The shared SwiftUI background
413
- renderer is available on macOS, but this host handoff integration covers Android
414
- and iOS. macOS shell integration requires a separate change.
563
+ The standalone branded-lite macOS shell mounts the same T5 splash with its native fallback,
564
+ artwork readiness and bounded exit. AppKit has no OS launch splash. The shared artwork gate is
565
+ used by the iOS and Mac shells; the Android host warms the same URLs through its renderer cache.
415
566
 
416
567
  Branded-lite builds expose the launcher artwork as the regular iOS image asset
417
568
  `branded_lite_app_icon`, so the same logo configuration works on Android and iOS.
@@ -35,6 +35,26 @@ the runtime staged inside it, so neither is a build error. The snippets below us
35
35
  `himi init` scaffolds `@wix/himalaya/*`, which is also the form your editor and `tsc` resolve
36
36
  off-repo. Full mapping: `himi docs wix-api-usage`.
37
37
 
38
+ ### Look up descriptor names before authoring
39
+
40
+ Use `himi docs component-reference` as the reference for your installed CLI's component
41
+ props, modifiers and allowed enum values. `himi components Text` or `himi components EmptyState`
42
+ narrows the prop lookup to one component. Props belong in `body.props`; the reference's
43
+ **Modifiers** section describes the separate `modifiers` bag beside `body`.
44
+
45
+ Typography names come from your app's `tokens.json` → `typography`, rather than a universal
46
+ component enum. Use the names declared there; [Design tokens](../tools/himi-cli/guides/tokens.md) explains their shape.
47
+ For example, a template may declare `pageTitle` and `bodyEmphasis` without declaring `largeTitle`
48
+ or `headline`.
49
+
50
+ Run `himi validate --strict` after editing. Name diagnostics suggest close spellings within
51
+ the correct component or modifier vocabulary: `Text.lineLimit` points to `maxLines`, and
52
+ `EmptyState.message` points to `subtitle`. They report the rejected key at root and nested
53
+ nodes. These are hints; validation does not rewrite your descriptor or accept aliases.
54
+ Unsupported layout options need an authored decision: `maxHeight` has no maximum-height
55
+ modifier equivalent, and `clipped` is not a boolean modifier. A fixed `height` or a particular
56
+ `clipShape` can change the layout or clipping behavior, so consult the reference before using it.
57
+
38
58
  Author the worker in `tier5-src/<name>/index.ts` and bind it from a screen in `dev/index.ts`,
39
59
  exactly as the walkthrough below shows.
40
60
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1568.0",
3
+ "version": "0.1570.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": "c098ae02840c1a3393199b2b6a265dd3f41ddafe769490763d9f7f7e"
74
+ "falconPackageHash": "6d016296db51d313f3d18d71aa7f7937e8a5119832948c7722bd3bda"
75
75
  }
@@ -52,6 +52,16 @@ export default defineApp({
52
52
  ]
53
53
  },
54
54
  designTokensPath: "./tokens.json",
55
+ // Native fallback; the T5 splash descriptor owns the editable launch appearance.
56
+ splash: {
57
+ "enabled": true,
58
+ "backgroundColor": "accentPrimary",
59
+ "logoAsset": "branded_lite_app_icon",
60
+ "logoWidth": 192,
61
+ "layout": "logoOnly",
62
+ "minVisibleMs": 0,
63
+ "maxHoldMs": 5000
64
+ },
55
65
  navigation: {
56
66
  "navKind": "responsive",
57
67
  "scheme": "himalaya-__HIMI_APP_SLUG__",
@@ -71,6 +81,13 @@ export default defineApp({
71
81
  "parentScreenId": "himi_account",
72
82
  "tabId": "profile"
73
83
  },
84
+ {
85
+ "screenId": "himi_business_contact",
86
+ "isPublic": true,
87
+ "paramKeys": [],
88
+ "parentScreenId": "himi_account",
89
+ "tabId": "profile"
90
+ },
74
91
  {
75
92
  "screenId": "himi_appearance",
76
93
  "isPublic": true,