@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
@@ -8117,6 +8117,252 @@ const SCREENS = runtimeSetting({
8117
8117
  "bundleVersion": "0.0.1"
8118
8118
  }
8119
8119
  },
8120
+ "himi_business_contact": {
8121
+ "screenId": "himi_business_contact",
8122
+ "title": "Business contact",
8123
+ "renderer": "sdui_intent",
8124
+ "schemaVersion": 1,
8125
+ "cacheControl": {
8126
+ "maxAge": 0,
8127
+ "staleWhileRevalidate": 0
8128
+ },
8129
+ "payload": {
8130
+ "id": "himi_business_contact.root",
8131
+ "body": {
8132
+ "package": "himalaya",
8133
+ "type": "VStack",
8134
+ "props": {
8135
+ "spacing": 16,
8136
+ "alignment": "leading",
8137
+ "children": [
8138
+ {
8139
+ "id": "himi_business_contact.section",
8140
+ "body": {
8141
+ "package": "himalaya",
8142
+ "type": "VStack",
8143
+ "props": {
8144
+ "spacing": 12,
8145
+ "alignment": "leading",
8146
+ "children": [
8147
+ {
8148
+ "id": "himi_business_contact.section.title",
8149
+ "body": {
8150
+ "package": "himalaya",
8151
+ "type": "Text",
8152
+ "props": {
8153
+ "text": "Get in touch",
8154
+ "style": "title3",
8155
+ "collapseWhenEmpty": true
8156
+ }
8157
+ }
8158
+ },
8159
+ {
8160
+ "id": "himi_business_contact.section.message",
8161
+ "body": {
8162
+ "package": "himalaya",
8163
+ "type": "Button",
8164
+ "props": {
8165
+ "title": "Message",
8166
+ "style": "primary",
8167
+ "fullWidth": true,
8168
+ "action": {
8169
+ "actionId": "himi.open",
8170
+ "params": {
8171
+ "screenId": "himi_business_chat"
8172
+ }
8173
+ }
8174
+ }
8175
+ }
8176
+ },
8177
+ {
8178
+ "id": "himi_business_contact.section.directions_copy",
8179
+ "body": {
8180
+ "package": "himalaya",
8181
+ "type": "Text",
8182
+ "props": {
8183
+ "text": "Directions",
8184
+ "style": "body",
8185
+ "collapseWhenEmpty": true
8186
+ }
8187
+ },
8188
+ "modifiers": {
8189
+ "hidden": true
8190
+ }
8191
+ },
8192
+ {
8193
+ "id": "himi_business_contact.section.unavailable",
8194
+ "body": {
8195
+ "package": "himalaya",
8196
+ "type": "Text",
8197
+ "props": {
8198
+ "text": "Contact details unavailable",
8199
+ "style": "body",
8200
+ "collapseWhenEmpty": true
8201
+ }
8202
+ },
8203
+ "modifiers": {
8204
+ "hidden": true
8205
+ }
8206
+ },
8207
+ {
8208
+ "id": "himi_business_contact.section.member_count",
8209
+ "body": {
8210
+ "package": "himalaya",
8211
+ "type": "FragmentSlot",
8212
+ "props": {
8213
+ "casePath": "$service:businessContact.memberCountCase",
8214
+ "defaultCase": "unavailable",
8215
+ "cases": [
8216
+ {
8217
+ "id": "one",
8218
+ "content": {
8219
+ "id": "himi_business_contact.section.members_one",
8220
+ "body": {
8221
+ "package": "himalaya",
8222
+ "type": "HStack",
8223
+ "props": {
8224
+ "spacing": 4,
8225
+ "alignment": "center",
8226
+ "children": [
8227
+ {
8228
+ "id": "himi_business_contact.section.count_one",
8229
+ "body": {
8230
+ "package": "himalaya",
8231
+ "type": "Text",
8232
+ "props": {
8233
+ "text": "$service:businessContact.memberCount",
8234
+ "style": "footnote",
8235
+ "collapseWhenEmpty": true
8236
+ }
8237
+ }
8238
+ },
8239
+ {
8240
+ "id": "himi_business_contact.section.unit_one",
8241
+ "body": {
8242
+ "package": "himalaya",
8243
+ "type": "Text",
8244
+ "props": {
8245
+ "text": "member",
8246
+ "style": "footnote",
8247
+ "collapseWhenEmpty": true
8248
+ }
8249
+ }
8250
+ }
8251
+ ]
8252
+ }
8253
+ }
8254
+ }
8255
+ },
8256
+ {
8257
+ "id": "other",
8258
+ "content": {
8259
+ "id": "himi_business_contact.section.members_other",
8260
+ "body": {
8261
+ "package": "himalaya",
8262
+ "type": "HStack",
8263
+ "props": {
8264
+ "spacing": 4,
8265
+ "alignment": "center",
8266
+ "children": [
8267
+ {
8268
+ "id": "himi_business_contact.section.count_other",
8269
+ "body": {
8270
+ "package": "himalaya",
8271
+ "type": "Text",
8272
+ "props": {
8273
+ "text": "$service:businessContact.memberCount",
8274
+ "style": "footnote",
8275
+ "collapseWhenEmpty": true
8276
+ }
8277
+ }
8278
+ },
8279
+ {
8280
+ "id": "himi_business_contact.section.unit_other",
8281
+ "body": {
8282
+ "package": "himalaya",
8283
+ "type": "Text",
8284
+ "props": {
8285
+ "text": "members",
8286
+ "style": "footnote",
8287
+ "collapseWhenEmpty": true
8288
+ }
8289
+ }
8290
+ }
8291
+ ]
8292
+ }
8293
+ }
8294
+ }
8295
+ },
8296
+ {
8297
+ "id": "unavailable",
8298
+ "content": {
8299
+ "id": "himi_business_contact.section.members_unavailable",
8300
+ "body": {
8301
+ "package": "himalaya",
8302
+ "type": "Text",
8303
+ "props": {
8304
+ "text": "Member count unavailable",
8305
+ "style": "footnote",
8306
+ "collapseWhenEmpty": true
8307
+ }
8308
+ }
8309
+ }
8310
+ }
8311
+ ]
8312
+ }
8313
+ },
8314
+ "modifiers": {
8315
+ "hidden": true
8316
+ }
8317
+ },
8318
+ {
8319
+ "id": "himi_business_contact.section.feedback",
8320
+ "body": {
8321
+ "package": "himalaya",
8322
+ "type": "Text",
8323
+ "props": {
8324
+ "text": "$service:businessContact.message",
8325
+ "style": "footnote",
8326
+ "collapseWhenEmpty": true
8327
+ }
8328
+ }
8329
+ }
8330
+ ]
8331
+ }
8332
+ }
8333
+ }
8334
+ ]
8335
+ }
8336
+ },
8337
+ "modifiers": {
8338
+ "background": {
8339
+ "token": "surfacePrimary"
8340
+ },
8341
+ "padding": {
8342
+ "leading": 20,
8343
+ "trailing": 20,
8344
+ "top": 18,
8345
+ "bottom": 28
8346
+ },
8347
+ "onAppear": {
8348
+ "actionId": "tier5.businessContact.load",
8349
+ "args": {
8350
+ "showMemberCount": false
8351
+ }
8352
+ }
8353
+ }
8354
+ },
8355
+ "logicBundle": {
8356
+ "url": "http://localhost:8190/v1/bundles/business-contact?integrity=",
8357
+ "integrity": "",
8358
+ "contentType": "application/javascript+ts-bundle",
8359
+ "declaredCapabilities": [
8360
+ "open_url"
8361
+ ],
8362
+ "minBinaryVersion": "0.1.0",
8363
+ "bundleVersion": "0.0.1"
8364
+ }
8365
+ },
8120
8366
  "himi_appearance": {
8121
8367
  "screenId": "himi_appearance",
8122
8368
  "renderer": "sdui_intent",
@@ -49,6 +49,9 @@
49
49
  "himi_business_chat": {
50
50
  "displayName": "Inbox"
51
51
  },
52
+ "himi_business_contact": {
53
+ "displayName": "Business contact"
54
+ },
52
55
  "himi_cart": {
53
56
  "displayName": "Cart"
54
57
  },
@@ -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 };
@@ -9,6 +9,7 @@ import { withOnlineWrites } from "../_shared/online-actions.js";
9
9
  import { defineService as registerService } from "@himalaya/state";
10
10
  import { withEmptyFlags } from "../_shared/empty-flags.js";
11
11
  import { stashCopy } from "../_shared/himi-copy.js";
12
+ import { memberAccess, assertMemberAccess, type MemberAccess } from "../_shared/member-access.js";
12
13
  import { LOADING, loaded, loadFailed, type LoadCopy, type LoadFlags } from "../_shared/branded-load-state.js";
13
14
  import {
14
15
  getNotificationTopics,
@@ -33,6 +34,7 @@ interface Row { id: string; name: string; subtitle: string; note: string; on: bo
33
34
  /** Inverse of `locked` (hiddenWhen hides on TRUE) and the plain On/Off a locked row shows. */
34
35
  notLocked: boolean; stateLabel: string }
35
36
  interface S extends LoadFlags {
37
+ preferencesMember: MemberAccess | null;
36
38
  topics: Row[]; emptyText: string; actionMessage: string;
37
39
  isMock: boolean; notMock: boolean; /** #2849 — hiddenWhen() hides on TRUE, so these are inverted: the empty-state banner
38
40
  * shows only when the site really has none, and the unavailable one only when the
@@ -94,32 +96,55 @@ const COPY: LoadCopy<Row> = {
94
96
  };
95
97
 
96
98
  const defineService = withOnlineWrites(registerService, ["toggle"], { messageFields: ["actionMessage"] });
99
+ const INITIAL = { ...LOADING, topics: [] as Row[], emptyText: "", actionMessage: "", preferencesMember: null };
100
+ const signInRequired = () => new Error("Unauthenticated: sign in to manage notifications");
101
+ let loadVersion = 0;
97
102
  const svc = defineService<S, {
98
- load: (s: S, arg?: unknown) => Promise<S>;
99
- toggle: (s: S, p?: { id?: string; value?: unknown }) => Promise<S>;
103
+ prepare: (s: S) => S;
104
+ load: (s: S, arg?: unknown) => Promise<S | undefined>;
105
+ toggle: (s: S, p?: { id?: string; value?: unknown }) => Promise<S | undefined>;
100
106
  }>("himiBrandedNotifSettings", withEmptyFlags({
101
- state: { ...LOADING, topics: [], emptyText: "", actionMessage: "" },
107
+ state: INITIAL,
102
108
  actions: {
103
- load: async (s, arg) => {
109
+ prepare: (s) => ({ ...s, ...INITIAL }),
110
+ load: async (s, arg): Promise<S | undefined> => {
104
111
  stashCopy(arg);
112
+ const version = ++loadVersion;
113
+ await svc.prepare();
105
114
  try {
115
+ const member = await memberAccess();
116
+ if (!member.email) throw signInRequired();
106
117
  const [topicsRes, prefsRes] = await Promise.all([
107
118
  getNotificationTopics(),
108
- getMyNotificationPreferences().catch(() => ({} as Awaited<ReturnType<typeof getMyNotificationPreferences>>)),
119
+ getMyNotificationPreferences(),
109
120
  ]);
121
+ await assertMemberAccess(member);
110
122
  const prefs = readPreferences(prefsRes);
111
123
  const topics = readTopics(topicsRes).map((t) => norm(t, prefs));
112
- return { ...s, ...loaded("topics", topics, COPY), actionMessage: "" };
113
- } catch (err) {
114
- return { ...s, ...loadFailed("topics", err, COPY) };
124
+ return version === loadVersion ? { ...s, ...loaded("topics", topics, COPY), preferencesMember: member, actionMessage: "" } : undefined;
125
+ } catch {
126
+ const member = await memberAccess();
127
+ // An authenticated denial is not repaired by an endless sign-in loop.
128
+ const failure = member.email ? new Error(COPY.error) : signInRequired();
129
+ return version === loadVersion ? { ...s, ...loadFailed("topics", failure, COPY), preferencesMember: null, actionMessage: "" } : undefined;
115
130
  }
116
131
  },
117
132
  // Flip one topic's On/Off. Optimistic (updates the row immediately); the real
118
133
  // upsert is best-effort and a no-op on sample rows.
119
- toggle: async (s, p) => {
134
+ toggle: async (s, p): Promise<S | undefined> => {
120
135
  const id = p?.id;
121
136
  const target = s.topics.find((r) => r.id === id);
122
- if (!id || !target || target.locked) return s;
137
+ if (s.busy || !id || !target || target.locked) return undefined;
138
+ if (!s.isMock) {
139
+ try {
140
+ if (!s.preferencesMember) return undefined;
141
+ await assertMemberAccess(s.preferencesMember);
142
+ if (svc.getState().preferencesMember !== s.preferencesMember) return undefined;
143
+ } catch {
144
+ await svc.load();
145
+ return undefined;
146
+ }
147
+ }
123
148
  let nextOn = true;
124
149
  const topics = s.topics.map((r) => {
125
150
  if (r.id !== id) return r;
@@ -136,10 +161,13 @@ const svc = defineService<S, {
136
161
  { topicId: id, channel: CHANNEL, stateData: { state: muteStatusFor(nextOn) } },
137
162
  ]);
138
163
  } catch { /* keep the optimistic state */ }
164
+ try { await assertMemberAccess(s.preferencesMember!); }
165
+ catch { await svc.load(); return undefined; }
139
166
  }
140
- return { ...s, topics };
167
+ return svc.getState().preferencesMember === s.preferencesMember ? { ...svc.getState(), topics } : undefined;
141
168
  },
142
169
  },
143
170
  }, { topics: "noTopics" }));
171
+ svc.prepare();
144
172
  svc.load();
145
173
  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,
@@ -5948,6 +5948,219 @@ const SCREENS = runtimeSetting({
5948
5948
  "bundleVersion": "0.0.1"
5949
5949
  }
5950
5950
  },
5951
+ "himi_business_contact": {
5952
+ "screenId": "himi_business_contact",
5953
+ "title": "Business contact",
5954
+ "renderer": "sdui_intent",
5955
+ "schemaVersion": 1,
5956
+ "cacheControl": {
5957
+ "maxAge": 0,
5958
+ "staleWhileRevalidate": 0
5959
+ },
5960
+ "payload": {
5961
+ "id": "himi_business_contact.root",
5962
+ "body": {
5963
+ "package": "himalaya",
5964
+ "type": "VStack",
5965
+ "props": {
5966
+ "spacing": 16,
5967
+ "alignment": "leading",
5968
+ "children": [
5969
+ {
5970
+ "id": "himi_business_contact.section",
5971
+ "body": {
5972
+ "package": "himalaya",
5973
+ "type": "VStack",
5974
+ "props": {
5975
+ "spacing": 12,
5976
+ "alignment": "leading",
5977
+ "children": [
5978
+ {
5979
+ "id": "himi_business_contact.section.directions_copy",
5980
+ "body": {
5981
+ "package": "himalaya",
5982
+ "type": "Text",
5983
+ "props": {
5984
+ "text": "Directions",
5985
+ "style": "body",
5986
+ "collapseWhenEmpty": true
5987
+ }
5988
+ },
5989
+ "modifiers": {
5990
+ "hidden": true
5991
+ }
5992
+ },
5993
+ {
5994
+ "id": "himi_business_contact.section.unavailable",
5995
+ "body": {
5996
+ "package": "himalaya",
5997
+ "type": "Text",
5998
+ "props": {
5999
+ "text": "Contact details unavailable",
6000
+ "style": "body",
6001
+ "collapseWhenEmpty": true
6002
+ }
6003
+ }
6004
+ },
6005
+ {
6006
+ "id": "himi_business_contact.section.member_count",
6007
+ "body": {
6008
+ "package": "himalaya",
6009
+ "type": "FragmentSlot",
6010
+ "props": {
6011
+ "casePath": "$service:businessContact.memberCountCase",
6012
+ "defaultCase": "unavailable",
6013
+ "cases": [
6014
+ {
6015
+ "id": "one",
6016
+ "content": {
6017
+ "id": "himi_business_contact.section.members_one",
6018
+ "body": {
6019
+ "package": "himalaya",
6020
+ "type": "HStack",
6021
+ "props": {
6022
+ "spacing": 4,
6023
+ "alignment": "center",
6024
+ "children": [
6025
+ {
6026
+ "id": "himi_business_contact.section.count_one",
6027
+ "body": {
6028
+ "package": "himalaya",
6029
+ "type": "Text",
6030
+ "props": {
6031
+ "text": "$service:businessContact.memberCount",
6032
+ "style": "footnote",
6033
+ "collapseWhenEmpty": true
6034
+ }
6035
+ }
6036
+ },
6037
+ {
6038
+ "id": "himi_business_contact.section.unit_one",
6039
+ "body": {
6040
+ "package": "himalaya",
6041
+ "type": "Text",
6042
+ "props": {
6043
+ "text": "member",
6044
+ "style": "footnote",
6045
+ "collapseWhenEmpty": true
6046
+ }
6047
+ }
6048
+ }
6049
+ ]
6050
+ }
6051
+ }
6052
+ }
6053
+ },
6054
+ {
6055
+ "id": "other",
6056
+ "content": {
6057
+ "id": "himi_business_contact.section.members_other",
6058
+ "body": {
6059
+ "package": "himalaya",
6060
+ "type": "HStack",
6061
+ "props": {
6062
+ "spacing": 4,
6063
+ "alignment": "center",
6064
+ "children": [
6065
+ {
6066
+ "id": "himi_business_contact.section.count_other",
6067
+ "body": {
6068
+ "package": "himalaya",
6069
+ "type": "Text",
6070
+ "props": {
6071
+ "text": "$service:businessContact.memberCount",
6072
+ "style": "footnote",
6073
+ "collapseWhenEmpty": true
6074
+ }
6075
+ }
6076
+ },
6077
+ {
6078
+ "id": "himi_business_contact.section.unit_other",
6079
+ "body": {
6080
+ "package": "himalaya",
6081
+ "type": "Text",
6082
+ "props": {
6083
+ "text": "members",
6084
+ "style": "footnote",
6085
+ "collapseWhenEmpty": true
6086
+ }
6087
+ }
6088
+ }
6089
+ ]
6090
+ }
6091
+ }
6092
+ }
6093
+ },
6094
+ {
6095
+ "id": "unavailable",
6096
+ "content": {
6097
+ "id": "himi_business_contact.section.members_unavailable",
6098
+ "body": {
6099
+ "package": "himalaya",
6100
+ "type": "Text",
6101
+ "props": {
6102
+ "text": "Member count unavailable",
6103
+ "style": "footnote",
6104
+ "collapseWhenEmpty": true
6105
+ }
6106
+ }
6107
+ }
6108
+ }
6109
+ ]
6110
+ }
6111
+ },
6112
+ "modifiers": {
6113
+ "hidden": true
6114
+ }
6115
+ },
6116
+ {
6117
+ "id": "himi_business_contact.section.feedback",
6118
+ "body": {
6119
+ "package": "himalaya",
6120
+ "type": "Text",
6121
+ "props": {
6122
+ "text": "$service:businessContact.message",
6123
+ "style": "footnote",
6124
+ "collapseWhenEmpty": true
6125
+ }
6126
+ }
6127
+ }
6128
+ ]
6129
+ }
6130
+ }
6131
+ }
6132
+ ]
6133
+ }
6134
+ },
6135
+ "modifiers": {
6136
+ "background": {
6137
+ "token": "surfacePrimary"
6138
+ },
6139
+ "padding": {
6140
+ "leading": 20,
6141
+ "trailing": 20,
6142
+ "top": 18,
6143
+ "bottom": 28
6144
+ },
6145
+ "onAppear": {
6146
+ "actionId": "tier5.businessContact.load",
6147
+ "args": {
6148
+ "showMemberCount": false
6149
+ }
6150
+ }
6151
+ }
6152
+ },
6153
+ "logicBundle": {
6154
+ "url": "http://localhost:8190/v1/bundles/business-contact?integrity=",
6155
+ "integrity": "",
6156
+ "contentType": "application/javascript+ts-bundle",
6157
+ "declaredCapabilities": [
6158
+ "open_url"
6159
+ ],
6160
+ "minBinaryVersion": "0.1.0",
6161
+ "bundleVersion": "0.0.1"
6162
+ }
6163
+ },
5951
6164
  "himi_appearance": {
5952
6165
  "screenId": "himi_appearance",
5953
6166
  "renderer": "sdui_intent",
@@ -28,6 +28,9 @@
28
28
  "himi_branded_splash": {
29
29
  "displayName": "Splash"
30
30
  },
31
+ "himi_business_contact": {
32
+ "displayName": "Business contact"
33
+ },
31
34
  "himi_cms": {
32
35
  "displayName": "Content"
33
36
  },
@@ -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,