@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.
Files changed (59) 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 +232 -27
  9. package/guides/getting-started.md +5 -0
  10. package/guides/himi-skill.md +5 -0
  11. package/guides/one-app-to-himi-app.md +145 -4
  12. package/guides/skill.md +5 -0
  13. package/guides/tier-5-add-a-screen.md +20 -0
  14. package/package.json +2 -2
  15. package/templates/beauty-salon/config.ts +7 -0
  16. package/templates/beauty-salon/dev/index.ts +213 -0
  17. package/templates/beauty-salon/himalaya.content.json +3 -0
  18. package/templates/beauty-salon/tier5-src/business-contact/index.ts +6 -0
  19. package/templates/branded-lite/config.ts +7 -0
  20. package/templates/branded-lite/dev/index.ts +246 -0
  21. package/templates/branded-lite/himalaya.content.json +3 -0
  22. package/templates/branded-lite/tier5-src/business-contact/index.ts +6 -0
  23. package/templates/branded-lite/tier5-src/himi-branded-lite-notifsettings/index.ts +39 -11
  24. package/templates/community-club/config.ts +7 -0
  25. package/templates/community-club/dev/index.ts +213 -0
  26. package/templates/community-club/himalaya.content.json +3 -0
  27. package/templates/community-club/tier5-src/business-contact/index.ts +6 -0
  28. package/templates/events-meetups/config.ts +7 -0
  29. package/templates/events-meetups/dev/index.ts +213 -0
  30. package/templates/events-meetups/himalaya.content.json +3 -0
  31. package/templates/events-meetups/tier5-src/business-contact/index.ts +6 -0
  32. package/templates/gym-fitness/config.ts +7 -0
  33. package/templates/gym-fitness/dev/index.ts +213 -0
  34. package/templates/gym-fitness/himalaya.content.json +3 -0
  35. package/templates/gym-fitness/tier5-src/business-contact/index.ts +6 -0
  36. package/templates/nonprofit-cause/config.ts +7 -0
  37. package/templates/nonprofit-cause/dev/index.ts +213 -0
  38. package/templates/nonprofit-cause/himalaya.content.json +3 -0
  39. package/templates/nonprofit-cause/tier5-src/business-contact/index.ts +6 -0
  40. package/templates/podcast-creator/config.ts +7 -0
  41. package/templates/podcast-creator/dev/index.ts +213 -0
  42. package/templates/podcast-creator/himalaya.content.json +3 -0
  43. package/templates/podcast-creator/tier5-src/business-contact/index.ts +6 -0
  44. package/templates/portfolio-creative/config.ts +7 -0
  45. package/templates/portfolio-creative/dev/index.ts +213 -0
  46. package/templates/portfolio-creative/himalaya.content.json +3 -0
  47. package/templates/portfolio-creative/tier5-src/business-contact/index.ts +6 -0
  48. package/templates/restaurant/config.ts +7 -0
  49. package/templates/restaurant/dev/index.ts +213 -0
  50. package/templates/restaurant/himalaya.content.json +3 -0
  51. package/templates/restaurant/tier5-src/business-contact/index.ts +6 -0
  52. package/templates/retail-store/config.ts +7 -0
  53. package/templates/retail-store/dev/index.ts +213 -0
  54. package/templates/retail-store/himalaya.content.json +3 -0
  55. package/templates/retail-store/tier5-src/business-contact/index.ts +6 -0
  56. package/templates/yoga-studio/config.ts +7 -0
  57. package/templates/yoga-studio/dev/index.ts +213 -0
  58. package/templates/yoga-studio/himalaya.content.json +3 -0
  59. package/templates/yoga-studio/tier5-src/business-contact/index.ts +6 -0
@@ -126,6 +126,221 @@ function defineService(name, def) {
126
126
  return himalaya.defineService(name, def);
127
127
  }
128
128
 
129
+ // ../../stdlib/flows/screens/src/business-contact.ts
130
+ var node = (id2, type, props) => ({ id: id2, body: { package: "himalaya", type, props } });
131
+ var clean = (value) => typeof value === "string" ? value.trim() : "";
132
+ function businessContactSettings(source = {}) {
133
+ const defaults = {
134
+ isDescriptionVisible: true,
135
+ isGetInTouchVisible: true,
136
+ isPhoneVisible: true,
137
+ isWebSiteLinkVisible: true,
138
+ isAddressVisible: true
139
+ };
140
+ const empty = Object.keys(source).every((key) => key === "isBusinessProfile");
141
+ if (source.isBusinessProfile) return {
142
+ ...empty ? defaults : {},
143
+ ...source,
144
+ showMap: true,
145
+ isDescriptionVisible: false
146
+ };
147
+ return empty ? defaults : { ...source };
148
+ }
149
+ function businessContactPoint(contact) {
150
+ const p = contact.coordinates;
151
+ return contact.isPhysical !== false && p && typeof p.latitude === "number" && Number.isFinite(p.latitude) && Math.abs(p.latitude) <= 90 && typeof p.longitude === "number" && Number.isFinite(p.longitude) && Math.abs(p.longitude) <= 180 ? { latitude: p.latitude, longitude: p.longitude } : void 0;
152
+ }
153
+ function businessContactLink(kind, value) {
154
+ const text3 = clean(value);
155
+ if (!text3 || /[\u0000-\u001f\u007f]/.test(text3)) return "";
156
+ switch (kind) {
157
+ case "website":
158
+ return /^https?:\/\/[^\s/@]+(?:[/:?#]|$)/i.test(text3) && !/\s/.test(text3) && !/^https?:\/\/[^/]*@/i.test(text3) ? text3 : "";
159
+ case "phone":
160
+ return /^\+?[\d ()\-.]+$/.test(text3) && /\d/.test(text3) ? `tel:${text3.replace(/[ ()\-.]/g, "")}` : "";
161
+ case "email":
162
+ return /^[^\s@?&#]+@[^\s@?&#]+\.[^\s@?&#]+$/.test(text3) ? `mailto:${encodeURIComponent(text3)}` : "";
163
+ case "directions":
164
+ return `https://www.google.com/maps/dir/?api=1&destination=${encodeURIComponent(text3)}`;
165
+ default:
166
+ return "";
167
+ }
168
+ }
169
+ function businessContactSection(opts = {}) {
170
+ const id2 = opts.id ?? "business_contact";
171
+ const contact = opts.contact ?? {};
172
+ const settings = businessContactSettings(opts.settings);
173
+ const copy = { title: "Get in touch", message: "Message", directions: "Directions", unavailable: "Contact details unavailable", memberCountUnavailable: "Member count unavailable", member: "member", members: "members", ...opts.copy };
174
+ const service = opts.service ?? "businessContact";
175
+ const children = [];
176
+ const text3 = (key, value, style = "body") => node(`${id2}.${key}`, "Text", { text: value, style, collapseWhenEmpty: true });
177
+ const link = (key, label, value) => {
178
+ if (businessContactLink(key, value)) children.push(node(`${id2}.${key}`, "Button", {
179
+ title: label,
180
+ style: "secondary",
181
+ fullWidth: true,
182
+ action: { actionId: `tier5.${service}.open`, params: { kind: key, value, failureLabel: copy.unavailable } }
183
+ }));
184
+ };
185
+ if (settings.isDescriptionVisible && clean(contact.description)) children.push(text3("description", clean(contact.description)));
186
+ if (settings.isGetInTouchVisible && opts.chatScreenId) {
187
+ children.push(text3("title", clean(settings.getInTouchTitle) || copy.title, "title3"));
188
+ if (clean(settings.getInTouchDescription)) children.push(text3("subtitle", clean(settings.getInTouchDescription)));
189
+ children.push(node(`${id2}.message`, "Button", {
190
+ title: clean(settings.getInTouchButton) || copy.message,
191
+ style: "primary",
192
+ fullWidth: true,
193
+ action: { actionId: "himi.open", params: { screenId: opts.chatScreenId } }
194
+ }));
195
+ }
196
+ if (settings.isPhoneVisible) link("phone", clean(contact.phone), clean(contact.phone));
197
+ if (settings.isWebSiteLinkVisible) link("website", clean(contact.website), clean(contact.website));
198
+ if (settings.isEmailVisible === true) link("email", clean(contact.email), clean(contact.email));
199
+ if (settings.isAddressVisible) {
200
+ const address = clean(contact.address);
201
+ if (address) children.push(text3("address", address));
202
+ const point = businessContactPoint(contact);
203
+ if (settings.showMap && point) children.push(node(`${id2}.map`, "Map", {
204
+ ...point,
205
+ height: 180,
206
+ zoom: 14,
207
+ interactive: false,
208
+ markers: [{ id: `${id2}.location`, ...point, ...address ? { label: address } : {} }]
209
+ }));
210
+ if (address && contact.isPhysical !== false) link("directions", copy.directions, address);
211
+ }
212
+ const hasContent = children.length > 0;
213
+ if (!(settings.isAddressVisible && clean(contact.address) && contact.isPhysical !== false)) {
214
+ children.push({ ...text3("directions_copy", copy.directions), modifiers: { hidden: true } });
215
+ }
216
+ const unavailable2 = text3("unavailable", copy.unavailable);
217
+ if (hasContent) unavailable2.modifiers = { hidden: true };
218
+ children.push(unavailable2);
219
+ if (opts.showMemberCount !== void 0) {
220
+ const ready = (key, unit) => node(`${id2}.members_${key}`, "HStack", {
221
+ spacing: 4,
222
+ alignment: "center",
223
+ children: [
224
+ text3(`count_${key}`, `$service:${service}.memberCount`, "footnote"),
225
+ text3(`unit_${key}`, unit, "footnote")
226
+ ]
227
+ });
228
+ const count = node(`${id2}.member_count`, "FragmentSlot", {
229
+ casePath: `$service:${service}.memberCountCase`,
230
+ defaultCase: "unavailable",
231
+ cases: [
232
+ { id: "one", content: ready("one", copy.member) },
233
+ { id: "other", content: ready("other", copy.members) },
234
+ { id: "unavailable", content: text3("members_unavailable", copy.memberCountUnavailable, "footnote") }
235
+ ]
236
+ });
237
+ if (opts.showMemberCount === false) count.modifiers = { hidden: true };
238
+ children.push(count);
239
+ }
240
+ children.push(text3("feedback", `$service:${service}.message`, "footnote"));
241
+ return node(id2, "VStack", { spacing: 12, alignment: "leading", children });
242
+ }
243
+
244
+ // ../../core/sdk/dispatch/src/index.ts
245
+ function dispatch(handlerId, params, _options) {
246
+ const himalaya = globalThis.himalaya;
247
+ if (!himalaya) {
248
+ return Promise.reject(
249
+ new Error("@himalaya/dispatch: called outside a Himalaya runtime. This bundle must run inside a JSWorker (Tier 5).")
250
+ );
251
+ }
252
+ const stringParams = {};
253
+ if (params) {
254
+ for (const [k, v] of Object.entries(params)) stringParams[k] = String(v);
255
+ }
256
+ return himalaya.dispatch(handlerId, stringParams);
257
+ }
258
+
259
+ // ../../core/sdk/open-url/src/index.ts
260
+ function defaultMode(url) {
261
+ return /^https?:/i.test(url) ? "in_app_browser" : "external_app";
262
+ }
263
+ async function open(url, mode) {
264
+ if (!url) return { opened: false };
265
+ const r = await dispatch("capability.open_url.open", { url, mode: mode ?? defaultMode(url) });
266
+ return { opened: r?.opened === true };
267
+ }
268
+
269
+ // ../../stdlib/flows/screens/src/business-contact-service.ts
270
+ function createBusinessContactService(opts = {}) {
271
+ const initialState = { message: "", memberCount: null, countStatus: "unrequested", memberCountCase: "unavailable" };
272
+ const currentState = () => svc.getState();
273
+ let loadGeneration = 0;
274
+ let openGeneration = 0;
275
+ const svc = defineService(opts.service ?? "businessContact", {
276
+ state: initialState,
277
+ notHydrated: ["message"],
278
+ perVisit: ["message"],
279
+ actions: {
280
+ load: async (state, arg) => {
281
+ const generation = ++loadGeneration;
282
+ const next = () => {
283
+ const current = currentState();
284
+ return { ...current, message: current === state ? "" : current.message };
285
+ };
286
+ if (arg?.showMemberCount !== true) return { ...next(), memberCount: null, countStatus: "unrequested", memberCountCase: "unavailable" };
287
+ try {
288
+ const count = opts.loadMemberCount ? await opts.loadMemberCount() : arg.memberCount;
289
+ if (generation !== loadGeneration) return currentState();
290
+ if (typeof count !== "number" || !Number.isSafeInteger(count) || count < 0) {
291
+ return { ...next(), memberCount: null, countStatus: "unavailable", memberCountCase: "unavailable" };
292
+ }
293
+ return { ...next(), memberCount: count, countStatus: "ready", memberCountCase: count === 1 ? "one" : "other" };
294
+ } catch {
295
+ if (generation !== loadGeneration) return currentState();
296
+ return { ...next(), memberCount: null, countStatus: "error", memberCountCase: "unavailable" };
297
+ }
298
+ },
299
+ open: async (state, arg) => {
300
+ const generation = ++openGeneration;
301
+ const url = businessContactLink(arg?.kind ?? "", arg?.value);
302
+ if (!url) return { ...currentState(), message: arg?.failureLabel || "This contact link is unavailable." };
303
+ try {
304
+ const result = await open(url, arg?.kind === "phone" || arg?.kind === "email" ? "external_app" : "system_browser");
305
+ if (generation !== openGeneration) return currentState();
306
+ return { ...currentState(), message: result.opened ? "" : arg?.failureLabel || "This contact link could not be opened." };
307
+ } catch {
308
+ if (generation !== openGeneration) return currentState();
309
+ return { ...currentState(), message: arg?.failureLabel || "This contact link could not be opened." };
310
+ }
311
+ }
312
+ }
313
+ });
314
+ return svc;
315
+ }
316
+
317
+ // ../../core/sdk/app-info/src/index.ts
318
+ var PLATFORMS = ["ios", "android", "macos", "web", "react-native"];
319
+ function str(v) {
320
+ return typeof v === "string" ? v.trim() : "";
321
+ }
322
+ async function get() {
323
+ const r = await dispatch("capability.app_info.get");
324
+ const platform = str(r?.platform);
325
+ const releaseId = str(r?.releaseId);
326
+ const serveBaseUrl = str(r?.serveBaseUrl);
327
+ return {
328
+ appId: str(r?.appId),
329
+ bundleId: str(r?.bundleId),
330
+ version: str(r?.version),
331
+ buildNumber: str(r?.buildNumber),
332
+ binaryVersion: str(r?.binaryVersion),
333
+ releaseId: releaseId || null,
334
+ releasePinned: r?.releasePinned === true,
335
+ // Trust the host's own answer; fall back to inferring from whether a serve origin is set.
336
+ environment: str(r?.environment) === "prod" ? "prod" : serveBaseUrl ? "prod" : "dev",
337
+ serveBaseUrl: serveBaseUrl || null,
338
+ platform: PLATFORMS.includes(platform) ? platform : "unknown",
339
+ memberSiteBound: r?.memberSiteBound === true,
340
+ oneAppInviteAvailable: r?.oneAppInviteAvailable === true
341
+ };
342
+ }
343
+
129
344
  // ../../stdlib/flows/auth/src/copy.generated.ts
130
345
  var copy_generated_default = {
131
346
  "auth.gate.title": "Welcome",
@@ -308,7 +523,7 @@ function identityErrors(input, operation, requireName = false) {
308
523
  }
309
524
 
310
525
  // ../../stdlib/flows/auth/src/index.ts
311
- async function dispatch(handlerId, params) {
526
+ async function dispatch2(handlerId, params) {
312
527
  const fn = globalThis.himalaya?.dispatch;
313
528
  if (!fn) throw new Error("@himalaya/auth: host did not install the dispatch bridge");
314
529
  return await fn(handlerId, params);
@@ -328,7 +543,7 @@ function reportedOk(raw) {
328
543
  }
329
544
  async function authState(opts) {
330
545
  try {
331
- const raw = await dispatch(id(opts, "memberIdentity"));
546
+ const raw = await dispatch2(id(opts, "memberIdentity"));
332
547
  if (!reportedOk(raw)) return { signedIn: false, email: "" };
333
548
  const email = emailOf(raw);
334
549
  return { signedIn: !!email, email };
@@ -339,7 +554,7 @@ async function authState(opts) {
339
554
  async function attempt(action2, params, failureText, opts) {
340
555
  let raw;
341
556
  try {
342
- raw = await dispatch(id(opts, action2), params);
557
+ raw = await dispatch2(id(opts, action2), params);
343
558
  } catch (e) {
344
559
  return { ok: false, ...authFailure(e, action2 === "registerDirect" ? "register" : "signIn") };
345
560
  }
@@ -379,25 +594,311 @@ function registerMember(email, password, profile, opts) {
379
594
  }
380
595
  async function signOut(opts) {
381
596
  try {
382
- await dispatch(id(opts, "signOut"));
597
+ await dispatch2(id(opts, "signOut"));
383
598
  } catch {
384
599
  }
385
600
  return !(await authState(opts)).signedIn;
386
601
  }
387
602
 
388
- // ../../core/sdk/dispatch/src/index.ts
389
- function dispatch2(handlerId, params, _options) {
390
- const himalaya = globalThis.himalaya;
391
- if (!himalaya) {
392
- return Promise.reject(
393
- new Error("@himalaya/dispatch: called outside a Himalaya runtime. This bundle must run inside a JSWorker (Tier 5).")
394
- );
603
+ // ../../core/sdk/share/src/index.ts
604
+ async function share(options) {
605
+ const params = {};
606
+ if (options.text) params.text = options.text;
607
+ if (options.url) params.url = options.url;
608
+ if (options.subject) params.subject = options.subject;
609
+ if (options.files && options.files.length > 0) {
610
+ params.files = JSON.stringify(options.files.map((f) => f.uri));
611
+ if (options.files.some((f) => f.ownerScope)) {
612
+ params.fileOwners = JSON.stringify(options.files.map((f) => f.ownerScope ?? ""));
613
+ }
395
614
  }
396
- const stringParams = {};
397
- if (params) {
398
- for (const [k, v] of Object.entries(params)) stringParams[k] = String(v);
615
+ const r = await dispatch("capability.share.share", params);
616
+ return { completed: r?.completed === true };
617
+ }
618
+ async function availability() {
619
+ const r = await dispatch("capability.share.availability");
620
+ return r?.availability ?? "full";
621
+ }
622
+
623
+ // ../../stdlib/flows/screens/src/invite-target.ts
624
+ function inviteTarget(identity) {
625
+ const bytes = [];
626
+ for (let i = 0; i < identity.length; i++) {
627
+ const unit = identity.charCodeAt(i);
628
+ bytes.push(unit & 255, unit >>> 8);
629
+ }
630
+ const K = [
631
+ 1116352408,
632
+ 1899447441,
633
+ 3049323471,
634
+ 3921009573,
635
+ 961987163,
636
+ 1508970993,
637
+ 2453635748,
638
+ 2870763221,
639
+ 3624381080,
640
+ 310598401,
641
+ 607225278,
642
+ 1426881987,
643
+ 1925078388,
644
+ 2162078206,
645
+ 2614888103,
646
+ 3248222580,
647
+ 3835390401,
648
+ 4022224774,
649
+ 264347078,
650
+ 604807628,
651
+ 770255983,
652
+ 1249150122,
653
+ 1555081692,
654
+ 1996064986,
655
+ 2554220882,
656
+ 2821834349,
657
+ 2952996808,
658
+ 3210313671,
659
+ 3336571891,
660
+ 3584528711,
661
+ 113926993,
662
+ 338241895,
663
+ 666307205,
664
+ 773529912,
665
+ 1294757372,
666
+ 1396182291,
667
+ 1695183700,
668
+ 1986661051,
669
+ 2177026350,
670
+ 2456956037,
671
+ 2730485921,
672
+ 2820302411,
673
+ 3259730800,
674
+ 3345764771,
675
+ 3516065817,
676
+ 3600352804,
677
+ 4094571909,
678
+ 275423344,
679
+ 430227734,
680
+ 506948616,
681
+ 659060556,
682
+ 883997877,
683
+ 958139571,
684
+ 1322822218,
685
+ 1537002063,
686
+ 1747873779,
687
+ 1955562222,
688
+ 2024104815,
689
+ 2227730452,
690
+ 2361852424,
691
+ 2428436474,
692
+ 2756734187,
693
+ 3204031479,
694
+ 3329325298
695
+ ];
696
+ const H = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225];
697
+ const padded = Array.from(bytes);
698
+ const bitLen = bytes.length * 8;
699
+ padded.push(128);
700
+ while (padded.length % 64 !== 56) padded.push(0);
701
+ for (let i = 7; i >= 0; i--) padded.push(i >= 4 ? 0 : Math.floor(bitLen / 2 ** (i * 8)) & 255);
702
+ const w = new Array(64);
703
+ for (let off = 0; off < padded.length; off += 64) {
704
+ for (let t = 0; t < 16; t++) w[t] = padded[off + t * 4] << 24 | padded[off + t * 4 + 1] << 16 | padded[off + t * 4 + 2] << 8 | padded[off + t * 4 + 3];
705
+ for (let t = 16; t < 64; t++) {
706
+ const s0 = (w[t - 15] >>> 7 | w[t - 15] << 25) ^ (w[t - 15] >>> 18 | w[t - 15] << 14) ^ w[t - 15] >>> 3;
707
+ const s1 = (w[t - 2] >>> 17 | w[t - 2] << 15) ^ (w[t - 2] >>> 19 | w[t - 2] << 13) ^ w[t - 2] >>> 10;
708
+ w[t] = w[t - 16] + s0 + w[t - 7] + s1 | 0;
709
+ }
710
+ let [a, b, c, d, e, f, g, h] = H;
711
+ for (let t = 0; t < 64; t++) {
712
+ const s1 = (e >>> 6 | e << 26) ^ (e >>> 11 | e << 21) ^ (e >>> 25 | e << 7);
713
+ const ch = e & f ^ ~e & g;
714
+ const t1 = h + s1 + ch + K[t] + w[t] | 0;
715
+ const s0 = (a >>> 2 | a << 30) ^ (a >>> 13 | a << 19) ^ (a >>> 22 | a << 10);
716
+ const t2 = s0 + (a & b ^ a & c ^ b & c) | 0;
717
+ h = g;
718
+ g = f;
719
+ f = e;
720
+ e = d + t1 | 0;
721
+ d = c;
722
+ c = b;
723
+ b = a;
724
+ a = t1 + t2 | 0;
725
+ }
726
+ H[0] = H[0] + a | 0;
727
+ H[1] = H[1] + b | 0;
728
+ H[2] = H[2] + c | 0;
729
+ H[3] = H[3] + d | 0;
730
+ H[4] = H[4] + e | 0;
731
+ H[5] = H[5] + f | 0;
732
+ H[6] = H[6] + g | 0;
733
+ H[7] = H[7] + h | 0;
399
734
  }
400
- return himalaya.dispatch(handlerId, stringParams);
735
+ return "invite:" + H.map((word) => (word >>> 0).toString(16).padStart(8, "0")).join("");
736
+ }
737
+
738
+ // ../../stdlib/flows/screens/src/invite.ts
739
+ function inviteAction(opts) {
740
+ if (!opts.screenId.trim()) throw new Error("Invite requires its flow screen.");
741
+ const service = opts.service ?? "invite";
742
+ return {
743
+ id: opts.id ?? "invite",
744
+ icon: "share",
745
+ label: opts.label ?? "Invite",
746
+ accessibilityLabel: opts.label ?? "Invite",
747
+ hiddenPath: `$service:${service}.hidden`,
748
+ onTap: { actionId: "himi.open", params: { screenId: opts.screenId } }
749
+ };
750
+ }
751
+ function inviteButton(opts = {}) {
752
+ const service = opts.service ?? "invite";
753
+ return {
754
+ id: opts.id ?? "invite.share",
755
+ body: { package: "himalaya", type: "Button", props: {
756
+ title: opts.label ?? "Share invitation",
757
+ style: "secondary",
758
+ fullWidth: false,
759
+ action: { actionId: `tier5.${service}.invite` }
760
+ } },
761
+ modifiers: { hiddenPath: `$service:${service}.hidden` }
762
+ };
763
+ }
764
+ function inviteScreen(opts) {
765
+ const service = opts.service ?? "invite";
766
+ return {
767
+ screenId: opts.screenId,
768
+ renderer: "sdui_intent",
769
+ title: opts.title ?? "Invite",
770
+ schemaVersion: 1,
771
+ cacheControl: { maxAge: 0, staleWhileRevalidate: 0 },
772
+ topBar: { actions: [] },
773
+ // The flow must not inherit an Invite action that opens itself.
774
+ logicBundle: { url: opts.bundleUrl, integrity: "", declaredCapabilities: ["share", "wix_api", "app_info"] },
775
+ payload: { id: "root", body: { package: "himalaya", type: "VStack", props: { spacing: 16, alignment: "leading", children: [
776
+ { id: `${service}.error`, body: { package: "himalaya", type: "Text", props: { text: `$service:${service}.error`, style: "body" } } },
777
+ inviteButton({ service, label: opts.shareLabel })
778
+ ] } } }
779
+ };
780
+ }
781
+ var wixApi = () => globalThis.himalaya?.wixApi;
782
+ var businessId = (value) => typeof value === "string" && /^[a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{12}$/i.test(value);
783
+ function inviteUrl(value) {
784
+ return typeof value === "string" && value.length <= 8192 && !/[^\x21-\x7e]|\\|%(?![a-f\d]{2})/i.test(value) && /^https:\/\/(?:[a-z\d](?:[a-z\d-]{0,61}[a-z\d])?\.)+[a-z](?:[a-z\d-]{0,61}[a-z\d])?(?::443)?(?:[/?#][^]*)?$/i.test(value);
785
+ }
786
+ async function readInvite(opts) {
787
+ const source = await opts.source();
788
+ if (source?.showInviteButton !== true) return void 0;
789
+ const data = { ...source };
790
+ if (data.url !== void 0) {
791
+ if (!inviteUrl(data.url)) return void 0;
792
+ } else if (!businessId(data.businessId) || !wixApi() || (await get()).oneAppInviteAvailable !== true) {
793
+ return void 0;
794
+ }
795
+ const host = await availability();
796
+ return host === "full" || host === "degraded" ? data : void 0;
797
+ }
798
+ function createInviteAvailabilityService(opts) {
799
+ const svc = defineService(opts.service ?? "invite", {
800
+ state: { hidden: true },
801
+ notHydrated: ["hidden"],
802
+ actions: { load: async () => {
803
+ try {
804
+ return { hidden: !await readInvite(opts) };
805
+ } catch {
806
+ return { hidden: true };
807
+ }
808
+ } }
809
+ });
810
+ void svc.load();
811
+ return svc;
812
+ }
813
+ var accountOf = (email) => email.trim().toLowerCase();
814
+ var target = (data) => inviteTarget(JSON.stringify([data.businessId ?? "", data.url ?? ""]));
815
+ async function continuation(operation, data, token = "") {
816
+ try {
817
+ return await dispatch("himi.wix.authContinuation", { operation, target: target(data), token });
818
+ } catch {
819
+ return null;
820
+ }
821
+ }
822
+ function createInviteService(opts) {
823
+ if (!opts.signInScreenId.trim()) throw new Error("Invite requires the app's sign-in screen.");
824
+ const read2 = () => readInvite(opts);
825
+ const sameSource = async (data) => {
826
+ const current = await read2();
827
+ return current && target(current) === target(data);
828
+ };
829
+ const unavailable2 = (hidden = false) => ({ hidden, error: "Invite is unavailable." });
830
+ let busy = false;
831
+ const perform = async (data, account) => {
832
+ const member = await authState();
833
+ if (!account || !member.signedIn || accountOf(member.email) !== account || !await sameSource(data)) return unavailable2(true);
834
+ const response = data.url ? void 0 : await wixApi().call(
835
+ "POST",
836
+ "https://apps.wix.com/clubs/api/v1/invites",
837
+ { target: { businessId: data.businessId } },
838
+ { "wix-site-id": data.businessId }
839
+ );
840
+ const url = data.url ?? response?.url;
841
+ if (!inviteUrl(url)) return unavailable2();
842
+ const current = await authState();
843
+ if (!current.signedIn || accountOf(current.email) !== account || !await sameSource(data)) return unavailable2(true);
844
+ const result = await share({ url, text: data.text, subject: data.subject });
845
+ return { hidden: false, error: result.completed ? "" : "Sharing was not completed." };
846
+ };
847
+ const svc = defineService(opts.service ?? "invite", {
848
+ state: { hidden: true, error: "" },
849
+ notHydrated: ["hidden", "error"],
850
+ actions: {
851
+ load: async () => {
852
+ if (busy) return void 0;
853
+ busy = true;
854
+ try {
855
+ const data = await read2();
856
+ if (!data) return unavailable2(true);
857
+ const waiting = await continuation("check", data);
858
+ if (waiting?.supported === true && waiting.confirmed === true && waiting.account) {
859
+ const account = accountOf(waiting.account);
860
+ const member = await authState();
861
+ if (!account || !member.signedIn || accountOf(member.email) !== account || !await sameSource(data)) return unavailable2(true);
862
+ const permit = await continuation("consume", data);
863
+ if (permit?.supported === true && permit.confirmed === true && permit.account && accountOf(permit.account) === account) {
864
+ return await perform(data, account);
865
+ }
866
+ }
867
+ return { hidden: false, error: "" };
868
+ } catch {
869
+ return unavailable2();
870
+ } finally {
871
+ busy = false;
872
+ }
873
+ },
874
+ invite: async () => {
875
+ if (busy) return void 0;
876
+ busy = true;
877
+ try {
878
+ const data = await read2();
879
+ if (!data) return unavailable2(true);
880
+ const member = await authState();
881
+ if (member.signedIn) return await perform(data, accountOf(member.email));
882
+ const request = await continuation("begin", data);
883
+ if (request?.supported !== true) return { hidden: false, error: "Update the app to sign in and share an invitation." };
884
+ if (!request.token) return unavailable2();
885
+ try {
886
+ await dispatch("himi.open", { screenId: opts.signInScreenId, presentation: "sheet", modal: "1", mode: "signin", authContinuation: request.token });
887
+ } catch (error) {
888
+ await continuation("cancel", data, request.token);
889
+ throw error;
890
+ }
891
+ return { hidden: false, error: "" };
892
+ } catch {
893
+ return unavailable2();
894
+ } finally {
895
+ busy = false;
896
+ }
897
+ }
898
+ }
899
+ });
900
+ void svc.load();
901
+ return svc;
401
902
  }
402
903
 
403
904
  // ../../core/sdk/wix-cashier/src/index.ts
@@ -415,7 +916,7 @@ function s(v) {
415
916
  return v == null || v === "" ? void 0 : v;
416
917
  }
417
918
  async function isAvailable() {
418
- const r = await dispatch2("capability.wix_cashier.isAvailable");
919
+ const r = await dispatch("capability.wix_cashier.isAvailable");
419
920
  return normalizeAvailability(r?.availability);
420
921
  }
421
922
  async function proceedToPayment(config) {
@@ -434,7 +935,7 @@ async function proceedToPayment(config) {
434
935
  if (label) params.label = label;
435
936
  if (config.allowInPersonPayment) params.allowInPersonPayment = true;
436
937
  if (config.allowManualPayment) params.allowManualPayment = true;
437
- const r = await dispatch2("capability.wix_cashier.proceedToPayment", params);
938
+ const r = await dispatch("capability.wix_cashier.proceedToPayment", params);
438
939
  return {
439
940
  status: normalizeStatus(r?.status),
440
941
  chargeId: s(r?.chargeId),
@@ -460,16 +961,6 @@ function normalizeStatus(raw) {
460
961
  }
461
962
  }
462
963
 
463
- // ../../core/sdk/open-url/src/index.ts
464
- function defaultMode(url) {
465
- return /^https?:/i.test(url) ? "in_app_browser" : "external_app";
466
- }
467
- async function open(url, mode) {
468
- if (!url) return { opened: false };
469
- const r = await dispatch2("capability.open_url.open", { url, mode: mode ?? defaultMode(url) });
470
- return { opened: r?.opened === true };
471
- }
472
-
473
964
  // ../../stdlib/wix-sdk/pricing-plans/src/index.ts
474
965
  function wixCall(method, path, body, readOptions) {
475
966
  if (!globalThis.himalaya?.wixApi) {
@@ -527,8 +1018,8 @@ async function payOrder(req) {
527
1018
  if (!req.snapshotId && !req.cashierUrl && !req.openCashier) {
528
1019
  return { kind: "failed", reason: "no order to settle" };
529
1020
  }
530
- const availability = await isAvailable().catch(() => "unavailable");
531
- if (availability === "full" && req.snapshotId) {
1021
+ const availability2 = await isAvailable().catch(() => "unavailable");
1022
+ if (availability2 === "full" && req.snapshotId) {
532
1023
  if (await req.mayCharge?.() === false) return WITHDRAWN;
533
1024
  const r = await proceedToPayment({
534
1025
  appId: req.appId,
@@ -562,34 +1053,7 @@ async function payOrder(req) {
562
1053
  }
563
1054
  return {
564
1055
  kind: "failed",
565
- reason: availability === "full" ? "the wallet declined and no in-app cashier is configured" : "no payment rail is available"
566
- };
567
- }
568
-
569
- // ../../core/sdk/app-info/src/index.ts
570
- var PLATFORMS = ["ios", "android", "macos", "web", "react-native"];
571
- function str(v) {
572
- return typeof v === "string" ? v.trim() : "";
573
- }
574
- async function get() {
575
- const r = await dispatch2("capability.app_info.get");
576
- const platform = str(r?.platform);
577
- const releaseId = str(r?.releaseId);
578
- const serveBaseUrl = str(r?.serveBaseUrl);
579
- return {
580
- appId: str(r?.appId),
581
- bundleId: str(r?.bundleId),
582
- version: str(r?.version),
583
- buildNumber: str(r?.buildNumber),
584
- binaryVersion: str(r?.binaryVersion),
585
- releaseId: releaseId || null,
586
- releasePinned: r?.releasePinned === true,
587
- // Trust the host's own answer; fall back to inferring from whether a serve origin is set.
588
- environment: str(r?.environment) === "prod" ? "prod" : serveBaseUrl ? "prod" : "dev",
589
- serveBaseUrl: serveBaseUrl || null,
590
- platform: PLATFORMS.includes(platform) ? platform : "unknown",
591
- memberSiteBound: r?.memberSiteBound === true,
592
- oneAppInviteAvailable: r?.oneAppInviteAvailable === true
1056
+ reason: availability2 === "full" ? "the wallet declined and no in-app cashier is configured" : "no payment rail is available"
593
1057
  };
594
1058
  }
595
1059
 
@@ -2065,7 +2529,7 @@ var zeroPrice = (value) => typeof value === "string" && /^0+(?:\.0+)?$/.test(val
2065
2529
  // ../../core/sdk/iap/src/index.ts
2066
2530
  async function getProducts(productIds) {
2067
2531
  if (!productIds || productIds.length === 0) return [];
2068
- const r = await dispatch2("capability.iap.getProducts", {
2532
+ const r = await dispatch("capability.iap.getProducts", {
2069
2533
  // Product ids are reverse-DNS-ish and never contain commas — comma-join
2070
2534
  // matches the @himalaya/push list-param convention.
2071
2535
  productIds: productIds.join(",")
@@ -2073,12 +2537,12 @@ async function getProducts(productIds) {
2073
2537
  return Array.isArray(r?.products) ? r.products : [];
2074
2538
  }
2075
2539
  async function restore() {
2076
- const r = await dispatch2("capability.iap.restore");
2540
+ const r = await dispatch("capability.iap.restore");
2077
2541
  return Array.isArray(r?.entitlements) ? r.entitlements : [];
2078
2542
  }
2079
2543
  async function purchaseForVerification(input) {
2080
2544
  if (!nonempty2(input?.productId) || !isUUID2(input?.appAccountToken)) return failure2("invalidArgument");
2081
- const result = await managedDispatch(() => dispatch2("capability.iap.purchaseForVerification", input));
2545
+ const result = await managedDispatch(() => dispatch("capability.iap.purchaseForVerification", input));
2082
2546
  if (result?.status === "purchased" && isAppleTransaction(result.transaction)) {
2083
2547
  return { status: "purchased", transaction: decodeTransaction(result.transaction) };
2084
2548
  }
@@ -2086,7 +2550,7 @@ async function purchaseForVerification(input) {
2086
2550
  return decodeFailure(result);
2087
2551
  }
2088
2552
  async function getUnfinishedTransactions() {
2089
- const result = await managedDispatch(() => dispatch2("capability.iap.getUnfinishedTransactions"));
2553
+ const result = await managedDispatch(() => dispatch("capability.iap.getUnfinishedTransactions"));
2090
2554
  if (result?.status === "ok" && Array.isArray(result.transactions) && result.transactions.every(isAppleTransaction)) {
2091
2555
  return { status: "ok", transactions: result.transactions.map(decodeTransaction) };
2092
2556
  }
@@ -2094,7 +2558,7 @@ async function getUnfinishedTransactions() {
2094
2558
  }
2095
2559
  async function finishTransaction(input) {
2096
2560
  if (!nonempty2(input?.transactionId)) return failure2("invalidArgument");
2097
- const result = await managedDispatch(() => dispatch2("capability.iap.finishTransaction", input));
2561
+ const result = await managedDispatch(() => dispatch("capability.iap.finishTransaction", input));
2098
2562
  if (result?.status === "finished" || result?.status === "notFound") return { status: result.status };
2099
2563
  return decodeFailure(result);
2100
2564
  }
@@ -2111,7 +2575,7 @@ function hostAppBindingSource() {
2111
2575
  async function readHostBinding() {
2112
2576
  let answer;
2113
2577
  try {
2114
- answer = await dispatch2("capability.iap.appBinding");
2578
+ answer = await dispatch("capability.iap.appBinding");
2115
2579
  } catch (error) {
2116
2580
  if (bindingNotOffered(error)) return null;
2117
2581
  throw new Error("the host could not read the app binding");
@@ -3830,9 +4294,9 @@ async function openBooking(item, bridge, beforeCreate, afterCreate) {
3830
4294
  const metadata = bookingAttendanceOf(service);
3831
4295
  if (classifyForApple(metadata, item.attendance.currency) !== "appleIap" || !samePrice({ amount: metadata.amount, currency: metadata.currency }, item)) return notCreated(CHANGED);
3832
4296
  if (isObject7(service?.onlineBooking) && service.onlineBooking.requireManualApproval === true) return notCreated({ status: "refused", reason: "approvalRequired" });
3833
- const availability = await bridge.call("POST", "/bookings/v1/availability/query", { query: { filter: { serviceId: [item.reference.id], startDate: selected.slot.startDate, endDate: selected.slot.endDate, bookable: true } } });
3834
- if (isRefusal(availability)) return notCreated(attemptRefused(availability));
3835
- const entries = isObject7(availability.body) ? availability.body.availabilityEntries : void 0;
4297
+ const availability2 = await bridge.call("POST", "/bookings/v1/availability/query", { query: { filter: { serviceId: [item.reference.id], startDate: selected.slot.startDate, endDate: selected.slot.endDate, bookable: true } } });
4298
+ if (isRefusal(availability2)) return notCreated(attemptRefused(availability2));
4299
+ const entries = isObject7(availability2.body) ? availability2.body.availabilityEntries : void 0;
3836
4300
  if (!Array.isArray(entries) || !entries.some((entry) => isObject7(entry) && entry.bookable === true && matchesSlot(entry.slot, selected.slot))) return notCreated(CHANGED);
3837
4301
  if (beforeCreate && !beforeCreate(slotGuard(selected.slot))) return notCreated({ status: "refused", reason: "storageUnavailable" });
3838
4302
  const created = await bridge.call("POST", "/bookings/v2/bookings", { booking: { bookedEntity: { slot: selected.slot }, contactDetails: selected.contactDetails, totalParticipants: 1, selectedPaymentOption: "ONLINE", ...selected.formInfo ? { formInfo: selected.formInfo } : {} } });
@@ -4031,14 +4495,14 @@ function createRedirectSession(req = {}, opts) {
4031
4495
 
4032
4496
  // ../../stdlib/flows/screens/src/index.ts
4033
4497
  var PKG = "himalaya";
4034
- var node = (id2, type, props) => ({ id: id2, body: { package: PKG, type, props } });
4498
+ var node2 = (id2, type, props) => ({ id: id2, body: { package: PKG, type, props } });
4035
4499
  var hideWhen = (n, path) => ({
4036
4500
  ...n,
4037
4501
  modifiers: { ...n.modifiers ?? {}, hiddenPath: path }
4038
4502
  });
4039
- var text2 = (id2, value, style = "body") => node(id2, "Text", { text: value, style });
4040
- var vstack = (id2, children, spacing = 12, alignment = "leading") => node(id2, "VStack", { spacing, alignment, children });
4041
- var button = (id2, title, action2, style = "primary") => node(id2, "Button", { title, style, fullWidth: true, action: action2 });
4503
+ var text2 = (id2, value, style = "body") => node2(id2, "Text", { text: value, style });
4504
+ var vstack = (id2, children, spacing = 12, alignment = "leading") => node2(id2, "VStack", { spacing, alignment, children });
4505
+ var button = (id2, title, action2, style = "primary") => node2(id2, "Button", { title, style, fullWidth: true, action: action2 });
4042
4506
  var openScreen = (screenId) => ({ actionId: "himi.open", params: { screenId } });
4043
4507
  function detailedHeader(opts) {
4044
4508
  const id2 = opts.id ?? "detailed_header";
@@ -4046,7 +4510,7 @@ function detailedHeader(opts) {
4046
4510
  if (opts.logoUrl || opts.locationLabel) {
4047
4511
  const identity = [];
4048
4512
  if (opts.logoUrl) {
4049
- identity.push(node(`${id2}.logo`, "Image", {
4513
+ identity.push(node2(`${id2}.logo`, "Image", {
4050
4514
  url: opts.logoUrl,
4051
4515
  width: 56,
4052
4516
  height: 56,
@@ -4057,12 +4521,12 @@ function detailedHeader(opts) {
4057
4521
  }
4058
4522
  if (opts.locationLabel) {
4059
4523
  if (opts.locationAction) {
4060
- identity.push(node(`${id2}.locationGroup`, "HStack", {
4524
+ identity.push(node2(`${id2}.locationGroup`, "HStack", {
4061
4525
  spacing: 8,
4062
4526
  alignment: "center",
4063
4527
  children: [
4064
4528
  text2(`${id2}.location`, opts.locationLabel, "caption"),
4065
- node(`${id2}.location.action`, "Button", {
4529
+ node2(`${id2}.location.action`, "Button", {
4066
4530
  title: opts.locationAction.label,
4067
4531
  style: opts.locationAction.style ?? "plain",
4068
4532
  fullWidth: false,
@@ -4074,10 +4538,10 @@ function detailedHeader(opts) {
4074
4538
  identity.push(text2(`${id2}.location`, opts.locationLabel, "caption"));
4075
4539
  }
4076
4540
  }
4077
- cardChildren.push(node(`${id2}.identity`, "HStack", { spacing: 12, alignment: "center", children: identity }));
4541
+ cardChildren.push(node2(`${id2}.identity`, "HStack", { spacing: 12, alignment: "center", children: identity }));
4078
4542
  }
4079
4543
  if (opts.memberCaption || opts.memberAvatarsPath || opts.memberAvatars?.length) {
4080
- cardChildren.push(node(`${id2}.members`, "AvatarStrip", {
4544
+ cardChildren.push(node2(`${id2}.members`, "AvatarStrip", {
4081
4545
  size: 36,
4082
4546
  maxVisible: 5,
4083
4547
  ...opts.memberCaption ? { caption: opts.memberCaption } : {},
@@ -4092,7 +4556,7 @@ function detailedHeader(opts) {
4092
4556
  ]) {
4093
4557
  if (action2) cardChildren.push(button(`${id2}.${key}`, action2.label, action2.action, action2.style ?? (key === "primary" ? "primary" : "secondary")));
4094
4558
  }
4095
- const card = node(`${id2}.card`, "VStack", {
4559
+ const card = node2(`${id2}.card`, "VStack", {
4096
4560
  spacing: 14,
4097
4561
  alignment: "leading",
4098
4562
  children: cardChildren
@@ -4105,7 +4569,7 @@ function detailedHeader(opts) {
4105
4569
  fillMaxWidth: true
4106
4570
  };
4107
4571
  const fixed = opts.collapsible === false;
4108
- return node(id2, "CollapsingHeader", {
4572
+ return node2(id2, "CollapsingHeader", {
4109
4573
  ...opts.imageUrl ? { imageUrl: opts.imageUrl } : {},
4110
4574
  title: opts.title,
4111
4575
  ...opts.subtitle ? { subtitle: opts.subtitle } : {},
@@ -4131,7 +4595,7 @@ function authScreen(opts) {
4131
4595
  const screenId = opts.screenId ?? "signin";
4132
4596
  const c = opts.copy ?? {};
4133
4597
  const withRegister = opts.register !== false;
4134
- const field = (key, label, action2, extra = {}) => node(`${s2}.${key}`, "TextField", {
4598
+ const field = (key, label, action2, extra = {}) => node2(`${s2}.${key}`, "TextField", {
4135
4599
  label,
4136
4600
  placeholder: label,
4137
4601
  valuePath: `$service:${s2}.${key}`,
@@ -4151,7 +4615,7 @@ function authScreen(opts) {
4151
4615
  `$service:${s2}.signedIn`
4152
4616
  ),
4153
4617
  hideWhen(
4154
- node(`${s2}.submit`, "Button", {
4618
+ node2(`${s2}.submit`, "Button", {
4155
4619
  title: `$service:${s2}.submitCta`,
4156
4620
  style: "primary",
4157
4621
  fullWidth: true,
@@ -4163,7 +4627,7 @@ function authScreen(opts) {
4163
4627
  if (withRegister) {
4164
4628
  children.push(
4165
4629
  hideWhen(
4166
- node(`${s2}.toggle`, "Button", {
4630
+ node2(`${s2}.toggle`, "Button", {
4167
4631
  title: `$service:${s2}.switchCta`,
4168
4632
  style: "secondary",
4169
4633
  fullWidth: true,
@@ -4183,7 +4647,7 @@ function authScreen(opts) {
4183
4647
  }
4184
4648
  children.push(
4185
4649
  hideWhen(
4186
- node(`${s2}.signout`, "Button", {
4650
+ node2(`${s2}.signout`, "Button", {
4187
4651
  title: c.signOutCta ?? "Sign out",
4188
4652
  style: "secondary",
4189
4653
  fullWidth: true,
@@ -4637,7 +5101,7 @@ function checkoutScreen(opts) {
4637
5101
  // someone the thing they are currently paying for is the obvious next bug.
4638
5102
  hideWhen(text2(`${s2}.row_joined`, "$item.joinedLabel", "bodyEmphasis"), "$item.notJoined"),
4639
5103
  hideWhen(
4640
- node(`${s2}.row_join`, "Button", {
5104
+ node2(`${s2}.row_join`, "Button", {
4641
5105
  title: "$item.cta",
4642
5106
  disabledPath: "$item.joinDisabled",
4643
5107
  style: "primary",
@@ -4676,7 +5140,7 @@ function checkoutScreen(opts) {
4676
5140
  }
4677
5141
  children.push(
4678
5142
  hideWhen(
4679
- node(`${s2}.list`, "LazyList", { itemsPath: `$service:${s2}.rows`, spacing: 18, items: [row] }),
5143
+ node2(`${s2}.list`, "LazyList", { itemsPath: `$service:${s2}.rows`, spacing: 18, items: [row] }),
4680
5144
  `$service:${s2}.noRows`
4681
5145
  )
4682
5146
  );
@@ -4689,10 +5153,20 @@ function checkoutScreen(opts) {
4689
5153
  }
4690
5154
  export {
4691
5155
  authScreen,
5156
+ businessContactLink,
5157
+ businessContactPoint,
5158
+ businessContactSection,
5159
+ businessContactSettings,
4692
5160
  checkoutScreen,
4693
5161
  createAuthService,
5162
+ createBusinessContactService,
4694
5163
  createCheckoutService,
5164
+ createInviteAvailabilityService,
5165
+ createInviteService,
4695
5166
  detailedHeader,
4696
- entitlement
5167
+ entitlement,
5168
+ inviteAction,
5169
+ inviteButton,
5170
+ inviteScreen
4697
5171
  };
4698
5172
  //# sourceMappingURL=screens.mjs.map