@wix/himalaya-cli 0.1569.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.
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/l10n-strings.d.ts +3 -2
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/business-contact-service.d.ts +17 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/business-contact.d.ts +73 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/index.d.ts +3 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/invite-target.d.ts +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/invite.d.ts +148 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/screens.mjs +558 -84
- package/dist/cli.mjs +232 -27
- package/guides/getting-started.md +5 -0
- package/guides/himi-skill.md +5 -0
- package/guides/one-app-to-himi-app.md +145 -4
- package/guides/skill.md +5 -0
- package/guides/tier-5-add-a-screen.md +20 -0
- package/package.json +2 -2
- package/templates/beauty-salon/config.ts +7 -0
- package/templates/beauty-salon/dev/index.ts +213 -0
- package/templates/beauty-salon/himalaya.content.json +3 -0
- package/templates/beauty-salon/tier5-src/business-contact/index.ts +6 -0
- package/templates/branded-lite/config.ts +7 -0
- package/templates/branded-lite/dev/index.ts +246 -0
- package/templates/branded-lite/himalaya.content.json +3 -0
- package/templates/branded-lite/tier5-src/business-contact/index.ts +6 -0
- package/templates/branded-lite/tier5-src/himi-branded-lite-notifsettings/index.ts +39 -11
- package/templates/community-club/config.ts +7 -0
- package/templates/community-club/dev/index.ts +213 -0
- package/templates/community-club/himalaya.content.json +3 -0
- package/templates/community-club/tier5-src/business-contact/index.ts +6 -0
- package/templates/events-meetups/config.ts +7 -0
- package/templates/events-meetups/dev/index.ts +213 -0
- package/templates/events-meetups/himalaya.content.json +3 -0
- package/templates/events-meetups/tier5-src/business-contact/index.ts +6 -0
- package/templates/gym-fitness/config.ts +7 -0
- package/templates/gym-fitness/dev/index.ts +213 -0
- package/templates/gym-fitness/himalaya.content.json +3 -0
- package/templates/gym-fitness/tier5-src/business-contact/index.ts +6 -0
- package/templates/nonprofit-cause/config.ts +7 -0
- package/templates/nonprofit-cause/dev/index.ts +213 -0
- package/templates/nonprofit-cause/himalaya.content.json +3 -0
- package/templates/nonprofit-cause/tier5-src/business-contact/index.ts +6 -0
- package/templates/podcast-creator/config.ts +7 -0
- package/templates/podcast-creator/dev/index.ts +213 -0
- package/templates/podcast-creator/himalaya.content.json +3 -0
- package/templates/podcast-creator/tier5-src/business-contact/index.ts +6 -0
- package/templates/portfolio-creative/config.ts +7 -0
- package/templates/portfolio-creative/dev/index.ts +213 -0
- package/templates/portfolio-creative/himalaya.content.json +3 -0
- package/templates/portfolio-creative/tier5-src/business-contact/index.ts +6 -0
- package/templates/restaurant/config.ts +7 -0
- package/templates/restaurant/dev/index.ts +213 -0
- package/templates/restaurant/himalaya.content.json +3 -0
- package/templates/restaurant/tier5-src/business-contact/index.ts +6 -0
- package/templates/retail-store/config.ts +7 -0
- package/templates/retail-store/dev/index.ts +213 -0
- package/templates/retail-store/himalaya.content.json +3 -0
- package/templates/retail-store/tier5-src/business-contact/index.ts +6 -0
- package/templates/yoga-studio/config.ts +7 -0
- package/templates/yoga-studio/dev/index.ts +213 -0
- package/templates/yoga-studio/himalaya.content.json +3 -0
- package/templates/yoga-studio/tier5-src/business-contact/index.ts +6 -0
|
@@ -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
|
package/guides/himi-skill.md
CHANGED
|
@@ -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.
|
|
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
|
|
276
|
-
|
|
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.
|
|
@@ -496,6 +598,45 @@ not share mutable filters accidentally. Keep static authored content in the app,
|
|
|
496
598
|
and products, services, availability, posts and member records live on the same site.
|
|
497
599
|
Refresh data after operations without reconnecting layout to the One App editor.
|
|
498
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
|
+
|
|
499
640
|
Bind the app to the same site through its **One App visitor identity**. It is the
|
|
500
641
|
identity a visitor of the source Branded app already has, so it needs no OAuth client
|
|
501
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
|
|
@@ -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.
|
|
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": "
|
|
74
|
+
"falconPackageHash": "6d016296db51d313f3d18d71aa7f7937e8a5119832948c7722bd3bda"
|
|
75
75
|
}
|
|
@@ -81,6 +81,13 @@ export default defineApp({
|
|
|
81
81
|
"parentScreenId": "himi_account",
|
|
82
82
|
"tabId": "profile"
|
|
83
83
|
},
|
|
84
|
+
{
|
|
85
|
+
"screenId": "himi_business_contact",
|
|
86
|
+
"isPublic": true,
|
|
87
|
+
"paramKeys": [],
|
|
88
|
+
"parentScreenId": "himi_account",
|
|
89
|
+
"tabId": "profile"
|
|
90
|
+
},
|
|
84
91
|
{
|
|
85
92
|
"screenId": "himi_appearance",
|
|
86
93
|
"isPublic": true,
|
|
@@ -6812,6 +6812,219 @@ const SCREENS = runtimeSetting({
|
|
|
6812
6812
|
"bundleVersion": "0.0.1"
|
|
6813
6813
|
}
|
|
6814
6814
|
},
|
|
6815
|
+
"himi_business_contact": {
|
|
6816
|
+
"screenId": "himi_business_contact",
|
|
6817
|
+
"title": "Business contact",
|
|
6818
|
+
"renderer": "sdui_intent",
|
|
6819
|
+
"schemaVersion": 1,
|
|
6820
|
+
"cacheControl": {
|
|
6821
|
+
"maxAge": 0,
|
|
6822
|
+
"staleWhileRevalidate": 0
|
|
6823
|
+
},
|
|
6824
|
+
"payload": {
|
|
6825
|
+
"id": "himi_business_contact.root",
|
|
6826
|
+
"body": {
|
|
6827
|
+
"package": "himalaya",
|
|
6828
|
+
"type": "VStack",
|
|
6829
|
+
"props": {
|
|
6830
|
+
"spacing": 16,
|
|
6831
|
+
"alignment": "leading",
|
|
6832
|
+
"children": [
|
|
6833
|
+
{
|
|
6834
|
+
"id": "himi_business_contact.section",
|
|
6835
|
+
"body": {
|
|
6836
|
+
"package": "himalaya",
|
|
6837
|
+
"type": "VStack",
|
|
6838
|
+
"props": {
|
|
6839
|
+
"spacing": 12,
|
|
6840
|
+
"alignment": "leading",
|
|
6841
|
+
"children": [
|
|
6842
|
+
{
|
|
6843
|
+
"id": "himi_business_contact.section.directions_copy",
|
|
6844
|
+
"body": {
|
|
6845
|
+
"package": "himalaya",
|
|
6846
|
+
"type": "Text",
|
|
6847
|
+
"props": {
|
|
6848
|
+
"text": "Directions",
|
|
6849
|
+
"style": "body",
|
|
6850
|
+
"collapseWhenEmpty": true
|
|
6851
|
+
}
|
|
6852
|
+
},
|
|
6853
|
+
"modifiers": {
|
|
6854
|
+
"hidden": true
|
|
6855
|
+
}
|
|
6856
|
+
},
|
|
6857
|
+
{
|
|
6858
|
+
"id": "himi_business_contact.section.unavailable",
|
|
6859
|
+
"body": {
|
|
6860
|
+
"package": "himalaya",
|
|
6861
|
+
"type": "Text",
|
|
6862
|
+
"props": {
|
|
6863
|
+
"text": "Contact details unavailable",
|
|
6864
|
+
"style": "body",
|
|
6865
|
+
"collapseWhenEmpty": true
|
|
6866
|
+
}
|
|
6867
|
+
}
|
|
6868
|
+
},
|
|
6869
|
+
{
|
|
6870
|
+
"id": "himi_business_contact.section.member_count",
|
|
6871
|
+
"body": {
|
|
6872
|
+
"package": "himalaya",
|
|
6873
|
+
"type": "FragmentSlot",
|
|
6874
|
+
"props": {
|
|
6875
|
+
"casePath": "$service:businessContact.memberCountCase",
|
|
6876
|
+
"defaultCase": "unavailable",
|
|
6877
|
+
"cases": [
|
|
6878
|
+
{
|
|
6879
|
+
"id": "one",
|
|
6880
|
+
"content": {
|
|
6881
|
+
"id": "himi_business_contact.section.members_one",
|
|
6882
|
+
"body": {
|
|
6883
|
+
"package": "himalaya",
|
|
6884
|
+
"type": "HStack",
|
|
6885
|
+
"props": {
|
|
6886
|
+
"spacing": 4,
|
|
6887
|
+
"alignment": "center",
|
|
6888
|
+
"children": [
|
|
6889
|
+
{
|
|
6890
|
+
"id": "himi_business_contact.section.count_one",
|
|
6891
|
+
"body": {
|
|
6892
|
+
"package": "himalaya",
|
|
6893
|
+
"type": "Text",
|
|
6894
|
+
"props": {
|
|
6895
|
+
"text": "$service:businessContact.memberCount",
|
|
6896
|
+
"style": "footnote",
|
|
6897
|
+
"collapseWhenEmpty": true
|
|
6898
|
+
}
|
|
6899
|
+
}
|
|
6900
|
+
},
|
|
6901
|
+
{
|
|
6902
|
+
"id": "himi_business_contact.section.unit_one",
|
|
6903
|
+
"body": {
|
|
6904
|
+
"package": "himalaya",
|
|
6905
|
+
"type": "Text",
|
|
6906
|
+
"props": {
|
|
6907
|
+
"text": "member",
|
|
6908
|
+
"style": "footnote",
|
|
6909
|
+
"collapseWhenEmpty": true
|
|
6910
|
+
}
|
|
6911
|
+
}
|
|
6912
|
+
}
|
|
6913
|
+
]
|
|
6914
|
+
}
|
|
6915
|
+
}
|
|
6916
|
+
}
|
|
6917
|
+
},
|
|
6918
|
+
{
|
|
6919
|
+
"id": "other",
|
|
6920
|
+
"content": {
|
|
6921
|
+
"id": "himi_business_contact.section.members_other",
|
|
6922
|
+
"body": {
|
|
6923
|
+
"package": "himalaya",
|
|
6924
|
+
"type": "HStack",
|
|
6925
|
+
"props": {
|
|
6926
|
+
"spacing": 4,
|
|
6927
|
+
"alignment": "center",
|
|
6928
|
+
"children": [
|
|
6929
|
+
{
|
|
6930
|
+
"id": "himi_business_contact.section.count_other",
|
|
6931
|
+
"body": {
|
|
6932
|
+
"package": "himalaya",
|
|
6933
|
+
"type": "Text",
|
|
6934
|
+
"props": {
|
|
6935
|
+
"text": "$service:businessContact.memberCount",
|
|
6936
|
+
"style": "footnote",
|
|
6937
|
+
"collapseWhenEmpty": true
|
|
6938
|
+
}
|
|
6939
|
+
}
|
|
6940
|
+
},
|
|
6941
|
+
{
|
|
6942
|
+
"id": "himi_business_contact.section.unit_other",
|
|
6943
|
+
"body": {
|
|
6944
|
+
"package": "himalaya",
|
|
6945
|
+
"type": "Text",
|
|
6946
|
+
"props": {
|
|
6947
|
+
"text": "members",
|
|
6948
|
+
"style": "footnote",
|
|
6949
|
+
"collapseWhenEmpty": true
|
|
6950
|
+
}
|
|
6951
|
+
}
|
|
6952
|
+
}
|
|
6953
|
+
]
|
|
6954
|
+
}
|
|
6955
|
+
}
|
|
6956
|
+
}
|
|
6957
|
+
},
|
|
6958
|
+
{
|
|
6959
|
+
"id": "unavailable",
|
|
6960
|
+
"content": {
|
|
6961
|
+
"id": "himi_business_contact.section.members_unavailable",
|
|
6962
|
+
"body": {
|
|
6963
|
+
"package": "himalaya",
|
|
6964
|
+
"type": "Text",
|
|
6965
|
+
"props": {
|
|
6966
|
+
"text": "Member count unavailable",
|
|
6967
|
+
"style": "footnote",
|
|
6968
|
+
"collapseWhenEmpty": true
|
|
6969
|
+
}
|
|
6970
|
+
}
|
|
6971
|
+
}
|
|
6972
|
+
}
|
|
6973
|
+
]
|
|
6974
|
+
}
|
|
6975
|
+
},
|
|
6976
|
+
"modifiers": {
|
|
6977
|
+
"hidden": true
|
|
6978
|
+
}
|
|
6979
|
+
},
|
|
6980
|
+
{
|
|
6981
|
+
"id": "himi_business_contact.section.feedback",
|
|
6982
|
+
"body": {
|
|
6983
|
+
"package": "himalaya",
|
|
6984
|
+
"type": "Text",
|
|
6985
|
+
"props": {
|
|
6986
|
+
"text": "$service:businessContact.message",
|
|
6987
|
+
"style": "footnote",
|
|
6988
|
+
"collapseWhenEmpty": true
|
|
6989
|
+
}
|
|
6990
|
+
}
|
|
6991
|
+
}
|
|
6992
|
+
]
|
|
6993
|
+
}
|
|
6994
|
+
}
|
|
6995
|
+
}
|
|
6996
|
+
]
|
|
6997
|
+
}
|
|
6998
|
+
},
|
|
6999
|
+
"modifiers": {
|
|
7000
|
+
"background": {
|
|
7001
|
+
"token": "surfacePrimary"
|
|
7002
|
+
},
|
|
7003
|
+
"padding": {
|
|
7004
|
+
"leading": 20,
|
|
7005
|
+
"trailing": 20,
|
|
7006
|
+
"top": 18,
|
|
7007
|
+
"bottom": 28
|
|
7008
|
+
},
|
|
7009
|
+
"onAppear": {
|
|
7010
|
+
"actionId": "tier5.businessContact.load",
|
|
7011
|
+
"args": {
|
|
7012
|
+
"showMemberCount": false
|
|
7013
|
+
}
|
|
7014
|
+
}
|
|
7015
|
+
}
|
|
7016
|
+
},
|
|
7017
|
+
"logicBundle": {
|
|
7018
|
+
"url": "http://localhost:8190/v1/bundles/business-contact?integrity=",
|
|
7019
|
+
"integrity": "",
|
|
7020
|
+
"contentType": "application/javascript+ts-bundle",
|
|
7021
|
+
"declaredCapabilities": [
|
|
7022
|
+
"open_url"
|
|
7023
|
+
],
|
|
7024
|
+
"minBinaryVersion": "0.1.0",
|
|
7025
|
+
"bundleVersion": "0.0.1"
|
|
7026
|
+
}
|
|
7027
|
+
},
|
|
6815
7028
|
"himi_appearance": {
|
|
6816
7029
|
"screenId": "himi_appearance",
|
|
6817
7030
|
"renderer": "sdui_intent",
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createBusinessContactService } from "@himalaya/screens";
|
|
2
|
+
|
|
3
|
+
// Contact values and the optional public total are build-time source evidence.
|
|
4
|
+
// No owner API, device location, or cross-site source URL is read by this worker.
|
|
5
|
+
const svc = createBusinessContactService();
|
|
6
|
+
export { svc };
|
|
@@ -81,6 +81,13 @@ export default defineApp({
|
|
|
81
81
|
"parentScreenId": "himi_account",
|
|
82
82
|
"tabId": "profile"
|
|
83
83
|
},
|
|
84
|
+
{
|
|
85
|
+
"screenId": "himi_business_contact",
|
|
86
|
+
"isPublic": true,
|
|
87
|
+
"paramKeys": [],
|
|
88
|
+
"parentScreenId": "himi_account",
|
|
89
|
+
"tabId": "profile"
|
|
90
|
+
},
|
|
84
91
|
{
|
|
85
92
|
"screenId": "himi_appearance",
|
|
86
93
|
"isPublic": true,
|