@wix/himalaya-cli 0.1559.0 → 0.1561.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 (82) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/builder.d.ts +3 -1
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +2 -0
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/events/src/index.d.ts +60 -7
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-events.mjs +11 -5
  5. package/dist/cli.mjs +191 -60
  6. package/dist/preview-assets.generated.bin +0 -0
  7. package/guides/component-reference.json +3 -2
  8. package/guides/component-reference.md +3 -1
  9. package/guides/one-app-to-himi-app.md +30 -5
  10. package/guides/sdk-reference.json +7 -7
  11. package/package.json +2 -2
  12. package/templates/beauty-salon/tier5-src/_shared/engine-intl.ts +18 -0
  13. package/templates/beauty-salon/tier5-src/_shared/himi-events.ts +7 -0
  14. package/templates/beauty-salon-owner/tier5-src/_shared/engine-intl.ts +18 -0
  15. package/templates/beauty-salon-owner/tier5-src/_shared/himi-events.ts +7 -0
  16. package/templates/branded-lite/dev/index.ts +2390 -851
  17. package/templates/branded-lite/himalaya.content.json +1 -1
  18. package/templates/branded-lite/tier5-src/_shared/engine-intl.ts +18 -0
  19. package/templates/branded-lite/tier5-src/_shared/himi-events.ts +7 -0
  20. package/templates/branded-lite/tier5-src/himi-events-detail/index.ts +803 -361
  21. package/templates/community-club/dev/index.ts +2387 -848
  22. package/templates/community-club/himalaya.content.json +1 -1
  23. package/templates/community-club/tier5-src/_shared/engine-intl.ts +18 -0
  24. package/templates/community-club/tier5-src/_shared/himi-events.ts +7 -0
  25. package/templates/community-club/tier5-src/himi-events-detail/index.ts +803 -361
  26. package/templates/community-club-owner/tier5-src/_shared/engine-intl.ts +18 -0
  27. package/templates/community-club-owner/tier5-src/_shared/himi-events.ts +7 -0
  28. package/templates/events-meetups/dev/index.ts +2387 -848
  29. package/templates/events-meetups/himalaya.content.json +1 -1
  30. package/templates/events-meetups/tier5-src/_shared/engine-intl.ts +18 -0
  31. package/templates/events-meetups/tier5-src/_shared/himi-events.ts +7 -0
  32. package/templates/events-meetups/tier5-src/himi-events-detail/index.ts +803 -361
  33. package/templates/events-meetups-owner/tier5-src/_shared/engine-intl.ts +18 -0
  34. package/templates/events-meetups-owner/tier5-src/_shared/himi-events.ts +7 -0
  35. package/templates/gym-fitness/dev/index.ts +2392 -853
  36. package/templates/gym-fitness/himalaya.content.json +1 -1
  37. package/templates/gym-fitness/tier5-src/_shared/engine-intl.ts +18 -0
  38. package/templates/gym-fitness/tier5-src/_shared/himi-events.ts +7 -0
  39. package/templates/gym-fitness/tier5-src/himi-events-detail/index.ts +803 -361
  40. package/templates/gym-fitness-owner/tier5-src/_shared/engine-intl.ts +18 -0
  41. package/templates/gym-fitness-owner/tier5-src/_shared/himi-events.ts +7 -0
  42. package/templates/nonprofit-cause/dev/index.ts +2387 -848
  43. package/templates/nonprofit-cause/himalaya.content.json +1 -1
  44. package/templates/nonprofit-cause/tier5-src/_shared/engine-intl.ts +18 -0
  45. package/templates/nonprofit-cause/tier5-src/_shared/himi-events.ts +7 -0
  46. package/templates/nonprofit-cause/tier5-src/himi-events-detail/index.ts +803 -361
  47. package/templates/nonprofit-cause-owner/tier5-src/_shared/engine-intl.ts +18 -0
  48. package/templates/nonprofit-cause-owner/tier5-src/_shared/himi-events.ts +7 -0
  49. package/templates/owner-lite/tier5-src/_shared/engine-intl.ts +18 -0
  50. package/templates/owner-lite/tier5-src/_shared/himi-events.ts +7 -0
  51. package/templates/podcast-creator/dev/index.ts +2388 -849
  52. package/templates/podcast-creator/himalaya.content.json +1 -1
  53. package/templates/podcast-creator/tier5-src/_shared/engine-intl.ts +18 -0
  54. package/templates/podcast-creator/tier5-src/_shared/himi-events.ts +7 -0
  55. package/templates/podcast-creator/tier5-src/himi-events-detail/index.ts +803 -361
  56. package/templates/podcast-creator-owner/tier5-src/_shared/engine-intl.ts +18 -0
  57. package/templates/podcast-creator-owner/tier5-src/_shared/himi-events.ts +7 -0
  58. package/templates/portfolio-creative/dev/index.ts +2375 -836
  59. package/templates/portfolio-creative/himalaya.content.json +1 -1
  60. package/templates/portfolio-creative/tier5-src/_shared/engine-intl.ts +18 -0
  61. package/templates/portfolio-creative/tier5-src/_shared/himi-events.ts +7 -0
  62. package/templates/portfolio-creative/tier5-src/himi-events-detail/index.ts +803 -361
  63. package/templates/portfolio-creative-owner/tier5-src/_shared/engine-intl.ts +18 -0
  64. package/templates/portfolio-creative-owner/tier5-src/_shared/himi-events.ts +7 -0
  65. package/templates/restaurant/dev/index.ts +2388 -849
  66. package/templates/restaurant/himalaya.content.json +1 -1
  67. package/templates/restaurant/tier5-src/_shared/engine-intl.ts +18 -0
  68. package/templates/restaurant/tier5-src/_shared/himi-events.ts +7 -0
  69. package/templates/restaurant/tier5-src/himi-events-detail/index.ts +803 -361
  70. package/templates/restaurant-owner/tier5-src/_shared/engine-intl.ts +18 -0
  71. package/templates/restaurant-owner/tier5-src/_shared/himi-events.ts +7 -0
  72. package/templates/retail-store/tier5-src/_shared/engine-intl.ts +18 -0
  73. package/templates/retail-store/tier5-src/_shared/himi-events.ts +7 -0
  74. package/templates/retail-store-owner/tier5-src/_shared/engine-intl.ts +18 -0
  75. package/templates/retail-store-owner/tier5-src/_shared/himi-events.ts +7 -0
  76. package/templates/yoga-studio/dev/index.ts +2403 -864
  77. package/templates/yoga-studio/himalaya.content.json +1 -1
  78. package/templates/yoga-studio/tier5-src/_shared/engine-intl.ts +18 -0
  79. package/templates/yoga-studio/tier5-src/_shared/himi-events.ts +7 -0
  80. package/templates/yoga-studio/tier5-src/himi-events-detail/index.ts +803 -361
  81. package/templates/yoga-studio-owner/tier5-src/_shared/engine-intl.ts +18 -0
  82. package/templates/yoga-studio-owner/tier5-src/_shared/himi-events.ts +7 -0
Binary file
@@ -238,7 +238,8 @@
238
238
  "category": "Core",
239
239
  "propsType": "StepperProps",
240
240
  "bindings": [
241
- "valuePath"
241
+ "valuePath",
242
+ "maxPath"
242
243
  ],
243
244
  "dispatches": [
244
245
  {
@@ -259,7 +260,7 @@
259
260
  ]
260
261
  }
261
262
  ],
262
- "propsSource": "export interface StepperProps {\n value: number;\n /** `$service:`/`$item.` binding → a live integer (overrides `value`). */\n valuePath?: string;\n min?: number;\n max?: number;\n onChange?: Action;\n /** \"plain\" draws exposed minus/value/plus controls; absent uses the default capsule. */\n presentation?: \"plain\";\n}"
263
+ "propsSource": "export interface StepperProps {\n value: number;\n /** `$service:`/`$item.` binding → a live integer (overrides `value`). */\n valuePath?: string;\n min?: number;\n max?: number;\n /** `$service:`/`$item.` binding → integer maximum, overrides `max`. */\n maxPath?: string;\n onChange?: Action;\n /** \"plain\" draws exposed minus/value/plus controls; absent uses the default capsule. */\n presentation?: \"plain\";\n}"
263
264
  },
264
265
  {
265
266
  "name": "Avatar",
@@ -44,7 +44,7 @@ See also **[Modifiers](#modifiers)** (the `modifiers` block) and **[Actions](#ac
44
44
  | `Button` | Core | `disabledPath`, `title` |
45
45
  | `TextField` | Core | `valuePath`, `focusPath`, `errorPath` |
46
46
  | `Toggle` | Core | `valuePath` |
47
- | `Stepper` | Core | `valuePath` |
47
+ | `Stepper` | Core | `valuePath`, `maxPath` |
48
48
  | `Avatar` | Core | `imageUrl`, `initials` |
49
49
  | `Badge` | Core | `tokenPath`, `text` |
50
50
  | `Tag` | Core | `tokenPath`, `text` |
@@ -684,6 +684,8 @@ export interface StepperProps {
684
684
  valuePath?: string;
685
685
  min?: number;
686
686
  max?: number;
687
+ /** `$service:`/`$item.` binding → integer maximum, overrides `max`. */
688
+ maxPath?: string;
687
689
  onChange?: Action;
688
690
  /** "plain" draws exposed minus/value/plus controls; absent uses the default capsule. */
689
691
  presentation?: "plain";
@@ -163,20 +163,45 @@ Apply these interpretation rules:
163
163
  a feature to account for; they do not alone prove visibility or access for every
164
164
  visitor or member. Resolve those rules separately. This check is specific to this
165
165
  migration workflow; it does not change the behavior of `himi validate`.
166
- - Before publishing, run the migration-only design check:
166
+ - Apply the collected app theme before the first build: run
167
+ `himi one-app validate-design --evidence-dir .himi/one-app --content . --fix`,
168
+ resolve any remaining mismatches/unresolved values, then rebuild. The source is
169
+ `settings.theme`, not the website or the starter template. Before publishing,
170
+ run the migration-only design check:
167
171
  `himi one-app validate-design --evidence-dir .himi/one-app --content .`.
168
172
  It resolves the effective source theme with the reader the source app instance
169
- actually uses, then compares the resolved primary, background and content colors
170
- and each button's `borderRadius` and `outlineWidth` against the app's `tokens.json`.
173
+ actually uses, then compares the resolved primary, background and content colors,
174
+ each button's `borderRadius` and `outlineWidth`, and resolved heading/body font families
175
+ against the app's `tokens.json`.
171
176
  Hex case and shorthand are normalized; an absent button token is compared with the
172
177
  value the renderer draws (an outline only on `secondary`; a radius of `radius.pill`,
173
178
  else 24), not called a difference. A variant without its own radius must draw the
174
179
  source radius at every Button size. A descriptor's per-button `cornerRadius` overrides
175
- the tokens and is not checked. `--fix` writes the mismatching source values into
180
+ the tokens and is not checked; descriptor/control-specific fill and label overrides
181
+ also need a rendered check. `--fix` writes the mismatching source values into
176
182
  `tokens.json` and pins the dark and high-contrast schemes to what they drew before,
177
183
  because a missing scheme falls back to the light value. Rebuild after `--fix`.
184
+ For Branded apps, known source typography IDs (for example `lato`) become family
185
+ names (`Lato`); tokens whose names contain title/heading/headline/display/hero use the heading family; other
186
+ typography tokens use the body family. Numeric metrics stay unchanged. Unknown IDs,
187
+ families outside the Himi font catalog, and missing target typography roles remain unresolved; resolve them before recording
188
+ a pass, even when the coverage ledger cites an adaptation. A deliberate difference
189
+ between resolved font roles can still be adapted. Build/font validation still has
190
+ to prove the font bytes are available. Unresolved fonts and contrast also fail
191
+ the plain check used by push, not only `--record`.
192
+ Branded accent text must reach 4.5:1: `textOnAccent` against the fill, and `accentText` against the target page and declared neutral
193
+ surfaces. `--fix` chooses readable ink and derives a same-hue text shade while
194
+ retaining the exact source accent fill. For example, `#D6BD07` needs dark labels;
195
+ `#7A6C00` is a readable accent text shade on white. Translucent target colors cannot earn
196
+ an opaque contrast claim; an explicitly adapted source color still needs independently
197
+ readable opaque target roles. Author `surfacePrimary` explicitly when absent: native
198
+ hosts do not share the web's white page fallback. Conflicting page/card backdrops with no derived shade
199
+ that clears every surface stay unresolved; use separate local text roles. A missing
200
+ or translucent target accent palette must be authored explicitly before `--fix`,
201
+ because its non-light appearance cannot be preserved safely. Source `system` font
202
+ IDs use the portable `$system` sentinel. Contrast failures cannot be waived by a ledger adaptation.
178
203
  The report names every theme pointer the check did not compare, including typography
179
- kits and any button `uppercase`, which Himi tokens cannot carry; resolve those
204
+ kit IDs and any button `uppercase`, which Himi tokens cannot carry; resolve those
180
205
  explicitly rather than treating a pass as full design parity. A deliberate difference
181
206
  is waived only by a `design` coverage row with status `adapted` that cites the user's
182
207
  instruction and explains the change. This check compares values, not rendered screens.
@@ -18428,7 +18428,7 @@
18428
18428
  "name": "WixEventFieldset",
18429
18429
  "kind": "type",
18430
18430
  "jsdoc": "/** Events v3 response fieldsets (`RequestedFields`). A bare read returns the base fieldset;\n * each value adds fields: `DETAILS` → `shortDescription`, `mainImage`, `calendarUrls`;\n * `TEXTS` → the Ricos `description`; `REGISTRATION` → `registration`; `URLS` → `eventPageUrl`;\n * `FORM` → `form`, the published registration controls and inputs. */",
18431
- "decl": "export type WixEventFieldset = \"DETAILS\" | \"TEXTS\" | \"REGISTRATION\" | \"URLS\" | \"FORM\";"
18431
+ "decl": "export type WixEventFieldset = \"DETAILS\" | \"TEXTS\" | \"REGISTRATION\" | \"URLS\" | \"FORM\" | \"AGENDA\";"
18432
18432
  },
18433
18433
  {
18434
18434
  "name": "WixEventRichContent",
@@ -18439,7 +18439,7 @@
18439
18439
  {
18440
18440
  "name": "getEvent",
18441
18441
  "kind": "function",
18442
- "jsdoc": "/** Get one event — GET /events/v3/events/{eventId}. Response wraps as `{ event }`.\n * NOTE: this GET returns the Events v3 BASE fieldset — slimmer than `queryEvents`,\n * which returns the richer default (fields such as `registration` and `calendarUrls`\n * are absent from a bare `getEvent`). If a detail screen needs those fields for one\n * event, prefer `queryEvents` and pick the row by id over `getEvent`.\n * `opts.fields` requests extra v3 fieldsets; `[\"TEXTS\"]` returns `description`. */",
18442
+ "jsdoc": "/** Get one event — GET /events/v3/events/{eventId}. Response wraps as `{ event }`.\n * This GET returns the Events v3 BASE fieldset, which is slimmer than `queryEvents`;\n * fields such as `registration` and `calendarUrls` are absent from a bare `getEvent`.\n * Use `opts.fields` to request fieldsets such as `DETAILS`, `TEXTS`, `REGISTRATION`,\n * `URLS`, `FORM`, and `AGENDA` when a one-event read needs them. */",
18443
18443
  "decl": "export async function getEvent(eventId: string, opts: { fields?: WixEventFieldset[] } = {}, readOptions?: WixCallOptions): Promise<WixGetEventResponse>;",
18444
18444
  "http": "GET /events/v3/events/{…}{…}"
18445
18445
  },
@@ -18535,7 +18535,7 @@
18535
18535
  "name": "WixAvailableTicket",
18536
18536
  "kind": "interface",
18537
18537
  "jsdoc": "",
18538
- "decl": "export interface WixAvailableTicket {\n id?: string;\n eventId?: string;\n name?: string;\n description?: string;\n price?: WixTicketPrice;\n free?: boolean;\n limitPerCheckout?: number;\n orderIndex?: number;\n saleStatus?: string;\n state?: string[];\n pricing?: { pricingType?: string; fixedPrice?: WixTicketPrice };\n dashboard?: { hidden?: boolean };\n}"
18538
+ "decl": "export interface WixAvailableTicket {\n id?: string;\n eventId?: string;\n name?: string;\n description?: string;\n price?: WixTicketPrice;\n free?: boolean;\n limitPerCheckout?: number;\n orderIndex?: number;\n saleStatus?: string;\n salesDetails?: { unsoldCount?: number; soldCount?: number; reservedCount?: number; soldOut?: boolean };\n salePeriod?: { startDate?: string; endDate?: string };\n state?: string[];\n pricing?: { pricingType?: string; fixedPrice?: WixTicketPrice };\n pricingOptions?: Array<{ id?: string; optionId?: string; name?: string; price?: { amount?: string; value?: string; currency?: string } }>;\n pricingMethod?: { type?: string; pricingType?: string; free?: boolean; fixedPrice?: { value?: string; currency?: string }; guestPrice?: { value?: string; currency?: string }; pricingOptions?: { optionDetails?: Array<{ id?: string; optionId?: string; name?: string; price?: { amount?: string; value?: string; currency?: string } }> } };\n policy?: string;\n policyText?: string;\n wixFeeConfig?: { type?: string };\n dashboard?: { hidden?: boolean };\n}"
18539
18539
  },
18540
18540
  {
18541
18541
  "name": "WixQueryAvailableTicketsResponse",
@@ -18555,7 +18555,7 @@
18555
18555
  "name": "WixTicketQuantity",
18556
18556
  "kind": "interface",
18557
18557
  "jsdoc": "/** One tier's ask in a reservation — `{ticketDefinitionId, quantity}`. */",
18558
- "decl": "export interface WixTicketQuantity {\n ticketDefinitionId: string;\n quantity: number;\n}"
18558
+ "decl": "export interface WixTicketQuantity {\n ticketDefinitionId: string;\n quantity: number;\n priceOverride?: string;\n ticketDetails?: Array<{ pricingOptionId?: string }>;\n}"
18559
18559
  },
18560
18560
  {
18561
18561
  "name": "WixReservationInvoice",
@@ -18590,9 +18590,9 @@
18590
18590
  {
18591
18591
  "name": "queryAvailableTickets",
18592
18592
  "kind": "function",
18593
- "jsdoc": "/** Buyer-visible ticket tiers for an event — POST /events/v1/checkout/available-tickets/query. */",
18594
- "decl": "export function queryAvailableTickets(eventId: string, limit = 100): Promise<WixQueryAvailableTicketsResponse>;",
18595
- "http": "POST /events/v1/checkout/available-tickets/query"
18593
+ "jsdoc": "/** Buyer-visible ticket tiers for an event — visitor-readable Events ticket definitions v3. */",
18594
+ "decl": "export async function queryAvailableTickets(eventId: string, limit = 100): Promise<WixQueryAvailableTicketsResponse>;",
18595
+ "http": "POST /events-ticket-definitions/v3/ticket-definitions/available/query"
18596
18596
  },
18597
18597
  {
18598
18598
  "name": "createTicketReservation",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.1559.0",
3
+ "version": "0.1561.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": "10b9cfbdf8247c393305b2341b984702640668ff76c32fbc09ae2d8e"
74
+ "falconPackageHash": "218dfa6fb52b7f6f3cd393536b9c163e3928bdf54eeb2c0020520fa5"
75
75
  }
@@ -486,3 +486,21 @@ export function zoneOffsetAt(at: number, timeZone: string): number {
486
486
  }
487
487
  return NaN;
488
488
  }
489
+
490
+ /** Long zone label plus its short offset, e.g. "Israel Standard Time (GMT+2)". An engine
491
+ * without ECMA-402 has no zone database, so callers omit the supplementary label there. */
492
+ export function formatTimeZoneLabel(date: Date, timeZone: string, locale = "en"): string {
493
+ if (hasIntl()) {
494
+ if (!timeZone) return "";
495
+ try {
496
+ const parts = new Intl.DateTimeFormat(locale, { timeZone, timeZoneName: "long" }).formatToParts(date);
497
+ const name = parts.find((part) => part.type === "timeZoneName")?.value || timeZone;
498
+ const offset = new Intl.DateTimeFormat(locale, { timeZone, timeZoneName: "shortOffset" })
499
+ .formatToParts(date).find((part) => part.type === "timeZoneName")?.value;
500
+ return offset ? `${name} (${offset.replace(/:00$/, "")})` : name;
501
+ } catch {
502
+ return timeZone;
503
+ }
504
+ }
505
+ return "";
506
+ }
@@ -56,3 +56,10 @@ export function rememberRsvp(eventId: string): void {
56
56
  const next = [eventId, ...ids.filter((id) => id !== eventId)].slice(0, 50);
57
57
  try { storage()?.setItem(RSVP_KEY, JSON.stringify(next)); } catch { /* best-effort */ }
58
58
  }
59
+
60
+ /** Remove a locally confirmed RSVP after Wix confirms its cancellation. */
61
+ export function forgetRsvp(eventId: string): void {
62
+ if (!eventId) return;
63
+ const next = confirmedRsvpIds().filter((id) => id !== eventId);
64
+ try { storage()?.setItem(RSVP_KEY, JSON.stringify(next)); } catch { /* best-effort */ }
65
+ }
@@ -486,3 +486,21 @@ export function zoneOffsetAt(at: number, timeZone: string): number {
486
486
  }
487
487
  return NaN;
488
488
  }
489
+
490
+ /** Long zone label plus its short offset, e.g. "Israel Standard Time (GMT+2)". An engine
491
+ * without ECMA-402 has no zone database, so callers omit the supplementary label there. */
492
+ export function formatTimeZoneLabel(date: Date, timeZone: string, locale = "en"): string {
493
+ if (hasIntl()) {
494
+ if (!timeZone) return "";
495
+ try {
496
+ const parts = new Intl.DateTimeFormat(locale, { timeZone, timeZoneName: "long" }).formatToParts(date);
497
+ const name = parts.find((part) => part.type === "timeZoneName")?.value || timeZone;
498
+ const offset = new Intl.DateTimeFormat(locale, { timeZone, timeZoneName: "shortOffset" })
499
+ .formatToParts(date).find((part) => part.type === "timeZoneName")?.value;
500
+ return offset ? `${name} (${offset.replace(/:00$/, "")})` : name;
501
+ } catch {
502
+ return timeZone;
503
+ }
504
+ }
505
+ return "";
506
+ }
@@ -56,3 +56,10 @@ export function rememberRsvp(eventId: string): void {
56
56
  const next = [eventId, ...ids.filter((id) => id !== eventId)].slice(0, 50);
57
57
  try { storage()?.setItem(RSVP_KEY, JSON.stringify(next)); } catch { /* best-effort */ }
58
58
  }
59
+
60
+ /** Remove a locally confirmed RSVP after Wix confirms its cancellation. */
61
+ export function forgetRsvp(eventId: string): void {
62
+ if (!eventId) return;
63
+ const next = confirmedRsvpIds().filter((id) => id !== eventId);
64
+ try { storage()?.setItem(RSVP_KEY, JSON.stringify(next)); } catch { /* best-effort */ }
65
+ }