@businessdash/sdk 0.9.60 → 0.9.80

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 (239) hide show
  1. package/README.md +991 -295
  2. package/assets/biab-sw.js +92 -0
  3. package/dist/account-core/index.d.ts +126 -0
  4. package/dist/account-core/index.d.ts.map +1 -0
  5. package/dist/account-core/index.js +191 -0
  6. package/dist/account-core/index.js.map +1 -0
  7. package/dist/account.d.ts +11 -0
  8. package/dist/account.d.ts.map +1 -0
  9. package/dist/account.js +11 -0
  10. package/dist/account.js.map +1 -0
  11. package/dist/auth-handler.d.ts +1 -1
  12. package/dist/auth-links.d.ts +33 -0
  13. package/dist/auth-links.d.ts.map +1 -0
  14. package/dist/auth-links.js +64 -0
  15. package/dist/auth-links.js.map +1 -0
  16. package/dist/blog-core/index.d.ts +112 -0
  17. package/dist/blog-core/index.d.ts.map +1 -0
  18. package/dist/blog-core/index.js +330 -0
  19. package/dist/blog-core/index.js.map +1 -0
  20. package/dist/blog.d.ts +11 -0
  21. package/dist/blog.d.ts.map +1 -0
  22. package/dist/blog.js +11 -0
  23. package/dist/blog.js.map +1 -0
  24. package/dist/chat-core/index.d.ts +97 -0
  25. package/dist/chat-core/index.d.ts.map +1 -0
  26. package/dist/chat-core/index.js +237 -0
  27. package/dist/chat-core/index.js.map +1 -0
  28. package/dist/chat.d.ts +11 -0
  29. package/dist/chat.d.ts.map +1 -0
  30. package/dist/chat.js +11 -0
  31. package/dist/chat.js.map +1 -0
  32. package/dist/checkout-core/index.d.ts +65 -0
  33. package/dist/checkout-core/index.d.ts.map +1 -0
  34. package/dist/checkout-core/index.js +159 -0
  35. package/dist/checkout-core/index.js.map +1 -0
  36. package/dist/checkout.d.ts +10 -0
  37. package/dist/checkout.d.ts.map +1 -0
  38. package/dist/checkout.js +10 -0
  39. package/dist/checkout.js.map +1 -0
  40. package/dist/cli.js +133 -25
  41. package/dist/cli.js.map +1 -1
  42. package/dist/client.d.ts +622 -1
  43. package/dist/client.d.ts.map +1 -1
  44. package/dist/client.js +888 -1
  45. package/dist/client.js.map +1 -1
  46. package/dist/consent-core/index.cjs +107 -0
  47. package/dist/consent-core/index.d.ts +103 -0
  48. package/dist/consent-core/index.d.ts.map +1 -0
  49. package/dist/consent-core/index.js +157 -0
  50. package/dist/consent-core/index.js.map +1 -0
  51. package/dist/contracts.d.ts +3526 -767
  52. package/dist/contracts.d.ts.map +1 -1
  53. package/dist/contracts.js +571 -4
  54. package/dist/contracts.js.map +1 -1
  55. package/dist/data-model-schema.d.ts +1 -1
  56. package/dist/data-model-schema.d.ts.map +1 -1
  57. package/dist/element.d.ts +30 -0
  58. package/dist/element.d.ts.map +1 -1
  59. package/dist/element.js +56 -0
  60. package/dist/element.js.map +1 -1
  61. package/dist/embed-protocol.d.ts +86 -0
  62. package/dist/embed-protocol.d.ts.map +1 -0
  63. package/dist/embed-protocol.js +60 -0
  64. package/dist/embed-protocol.js.map +1 -0
  65. package/dist/framework-support.d.ts +122 -0
  66. package/dist/framework-support.d.ts.map +1 -0
  67. package/dist/framework-support.js +323 -0
  68. package/dist/framework-support.js.map +1 -0
  69. package/dist/index.cjs +1355 -24
  70. package/dist/legal-core/index.cjs +115 -0
  71. package/dist/legal-core/index.d.ts +160 -0
  72. package/dist/legal-core/index.d.ts.map +1 -0
  73. package/dist/legal-core/index.js +220 -0
  74. package/dist/legal-core/index.js.map +1 -0
  75. package/dist/marketing-core/index.d.ts +66 -0
  76. package/dist/marketing-core/index.d.ts.map +1 -0
  77. package/dist/marketing-core/index.js +154 -0
  78. package/dist/marketing-core/index.js.map +1 -0
  79. package/dist/marketing.d.ts +7 -0
  80. package/dist/marketing.d.ts.map +1 -0
  81. package/dist/marketing.js +7 -0
  82. package/dist/marketing.js.map +1 -0
  83. package/dist/mcp-adapters/index.d.ts +135 -0
  84. package/dist/mcp-adapters/index.d.ts.map +1 -0
  85. package/dist/mcp-adapters/index.js +187 -0
  86. package/dist/mcp-adapters/index.js.map +1 -0
  87. package/dist/mcp-adapters.d.ts +7 -0
  88. package/dist/mcp-adapters.d.ts.map +1 -0
  89. package/dist/mcp-adapters.js +7 -0
  90. package/dist/mcp-adapters.js.map +1 -0
  91. package/dist/model3d-core/index.cjs +95 -0
  92. package/dist/model3d-core/index.d.ts +167 -0
  93. package/dist/model3d-core/index.d.ts.map +1 -0
  94. package/dist/model3d-core/index.js +158 -0
  95. package/dist/model3d-core/index.js.map +1 -0
  96. package/dist/notifications-core/index.cjs +315 -0
  97. package/dist/notifications-core/index.d.ts +229 -0
  98. package/dist/notifications-core/index.d.ts.map +1 -0
  99. package/dist/notifications-core/index.js +445 -0
  100. package/dist/notifications-core/index.js.map +1 -0
  101. package/dist/portal-core/index.d.ts +451 -0
  102. package/dist/portal-core/index.d.ts.map +1 -0
  103. package/dist/portal-core/index.js +819 -0
  104. package/dist/portal-core/index.js.map +1 -0
  105. package/dist/portal.d.ts +7 -0
  106. package/dist/portal.d.ts.map +1 -0
  107. package/dist/portal.js +7 -0
  108. package/dist/portal.js.map +1 -0
  109. package/dist/push-core/index.cjs +171 -0
  110. package/dist/push-core/index.d.ts +149 -0
  111. package/dist/push-core/index.d.ts.map +1 -0
  112. package/dist/push-core/index.js +231 -0
  113. package/dist/push-core/index.js.map +1 -0
  114. package/dist/react-marketing.d.ts +1 -17
  115. package/dist/react-marketing.d.ts.map +1 -1
  116. package/dist/react-marketing.js +4 -0
  117. package/dist/react-marketing.js.map +1 -1
  118. package/dist/react.d.ts +294 -101
  119. package/dist/react.d.ts.map +1 -1
  120. package/dist/react.js +302 -246
  121. package/dist/react.js.map +1 -1
  122. package/dist/seed-core/index.d.ts +354 -0
  123. package/dist/seed-core/index.d.ts.map +1 -0
  124. package/dist/seed-core/index.js +420 -0
  125. package/dist/seed-core/index.js.map +1 -0
  126. package/dist/seed.d.ts +7 -0
  127. package/dist/seed.d.ts.map +1 -0
  128. package/dist/seed.js +7 -0
  129. package/dist/seed.js.map +1 -0
  130. package/dist/seo-core/blog.d.ts +94 -0
  131. package/dist/seo-core/blog.d.ts.map +1 -0
  132. package/dist/seo-core/blog.js +149 -0
  133. package/dist/seo-core/blog.js.map +1 -0
  134. package/dist/seo-core/commerce.d.ts +64 -0
  135. package/dist/seo-core/commerce.d.ts.map +1 -0
  136. package/dist/seo-core/commerce.js +87 -0
  137. package/dist/seo-core/commerce.js.map +1 -0
  138. package/dist/seo-core/index.cjs +751 -0
  139. package/dist/seo-core/index.d.ts +226 -0
  140. package/dist/seo-core/index.d.ts.map +1 -0
  141. package/dist/seo-core/index.js +455 -0
  142. package/dist/seo-core/index.js.map +1 -0
  143. package/dist/seo-core/local.d.ts +181 -0
  144. package/dist/seo-core/local.d.ts.map +1 -0
  145. package/dist/seo-core/local.js +193 -0
  146. package/dist/seo-core/local.js.map +1 -0
  147. package/dist/sitemap-core/index.cjs +167 -0
  148. package/dist/sitemap-core/index.d.ts +155 -0
  149. package/dist/sitemap-core/index.d.ts.map +1 -0
  150. package/dist/sitemap-core/index.js +195 -0
  151. package/dist/sitemap-core/index.js.map +1 -0
  152. package/dist/social-core/index.d.ts +74 -0
  153. package/dist/social-core/index.d.ts.map +1 -0
  154. package/dist/social-core/index.js +72 -0
  155. package/dist/social-core/index.js.map +1 -0
  156. package/dist/social.d.ts +7 -0
  157. package/dist/social.d.ts.map +1 -0
  158. package/dist/social.js +7 -0
  159. package/dist/social.js.map +1 -0
  160. package/dist/solid-compat.d.ts +204 -0
  161. package/dist/solid-compat.d.ts.map +1 -0
  162. package/dist/solid-compat.js +221 -0
  163. package/dist/solid-compat.js.map +1 -0
  164. package/dist/store-core/index.d.ts +141 -0
  165. package/dist/store-core/index.d.ts.map +1 -0
  166. package/dist/store-core/index.js +277 -0
  167. package/dist/store-core/index.js.map +1 -0
  168. package/dist/store.d.ts +12 -0
  169. package/dist/store.d.ts.map +1 -0
  170. package/dist/store.js +12 -0
  171. package/dist/store.js.map +1 -0
  172. package/dist/vanilla.d.ts +111 -0
  173. package/dist/vanilla.d.ts.map +1 -1
  174. package/dist/vanilla.js +206 -0
  175. package/dist/vanilla.js.map +1 -1
  176. package/dist/verify-core/index.d.ts +98 -0
  177. package/dist/verify-core/index.d.ts.map +1 -0
  178. package/dist/verify-core/index.js +186 -0
  179. package/dist/verify-core/index.js.map +1 -0
  180. package/dist/verify.d.ts +8 -0
  181. package/dist/verify.d.ts.map +1 -0
  182. package/dist/verify.js +8 -0
  183. package/dist/verify.js.map +1 -0
  184. package/openapi.json +4516 -1311
  185. package/package.json +128 -11
  186. package/src/account-core/index.ts +309 -0
  187. package/src/account.ts +11 -0
  188. package/src/angular/headless.ts +519 -0
  189. package/src/angular/index.ts +3 -0
  190. package/src/auth-links.ts +76 -0
  191. package/src/blog-core/index.ts +423 -0
  192. package/src/blog.ts +11 -0
  193. package/src/chat-core/index.ts +335 -0
  194. package/src/chat.ts +11 -0
  195. package/src/checkout-core/index.ts +225 -0
  196. package/src/checkout.ts +10 -0
  197. package/src/cli.ts +184 -28
  198. package/src/client.ts +1097 -0
  199. package/src/consent-core/index.ts +213 -0
  200. package/src/contracts.ts +768 -11
  201. package/src/data-model-schema.ts +1 -1
  202. package/src/element.ts +102 -0
  203. package/src/embed-protocol.ts +100 -0
  204. package/src/framework-support.ts +440 -0
  205. package/src/legal-core/index.ts +276 -0
  206. package/src/marketing-core/index.ts +209 -0
  207. package/src/marketing.ts +7 -0
  208. package/src/mcp-adapters/index.ts +264 -0
  209. package/src/mcp-adapters.ts +7 -0
  210. package/src/model3d-core/index.ts +248 -0
  211. package/src/notifications-core/index.ts +650 -0
  212. package/src/portal-core/index.ts +1564 -0
  213. package/src/portal.ts +7 -0
  214. package/src/push-core/index.ts +335 -0
  215. package/src/qwik.tsx +602 -2
  216. package/src/react-marketing.tsx +5 -0
  217. package/src/react.tsx +434 -319
  218. package/src/seed-core/index.ts +735 -0
  219. package/src/seed.ts +7 -0
  220. package/src/seo-core/blog.ts +216 -0
  221. package/src/seo-core/commerce.ts +138 -0
  222. package/src/seo-core/index.ts +605 -0
  223. package/src/seo-core/local.ts +333 -0
  224. package/src/sitemap-core/index.ts +296 -0
  225. package/src/social-core/index.ts +103 -0
  226. package/src/social.ts +7 -0
  227. package/src/solid-compat.tsx +347 -0
  228. package/src/solid-surfaces.tsx +1311 -0
  229. package/src/solid.tsx +82 -60
  230. package/src/store-core/index.ts +426 -0
  231. package/src/store.ts +12 -0
  232. package/src/svelte/SocialLinks.svelte +84 -0
  233. package/src/svelte/headless.ts +435 -0
  234. package/src/svelte/index.ts +9 -0
  235. package/src/vanilla.ts +367 -0
  236. package/src/verify-core/index.ts +288 -0
  237. package/src/verify.ts +8 -0
  238. package/src/vue/headless.ts +527 -0
  239. package/src/vue/index.ts +3 -0
@@ -0,0 +1,435 @@
1
+ /**
2
+ * `@businessdash/sdk/svelte` — headless storefront + chat.
3
+ *
4
+ * `<Storefront>` and `<Chatbot>` are hosted pages in a sandboxed iframe. These
5
+ * are the native path: all behaviour, no markup.
6
+ *
7
+ * Everything real lives in `store-core` / `chat-core`, shared with every other
8
+ * binding. This file bridges a controller's subscribe/snapshot observable into
9
+ * a Svelte store.
10
+ *
11
+ * Stores rather than runes on purpose: runes are a compiler feature that only
12
+ * exists inside `.svelte` / `.svelte.ts` files, and these have to be callable
13
+ * from a plain `.ts` module too. `$store` auto-subscription in a component
14
+ * reads identically either way.
15
+ *
16
+ * @module
17
+ */
18
+
19
+ import { type Readable, readable } from "svelte/store";
20
+
21
+ import {
22
+ type BlogController,
23
+ type BlogSnapshot,
24
+ createBlogController,
25
+ } from "../blog-core/index.js";
26
+ import {
27
+ type ChatController,
28
+ type ChatSnapshot,
29
+ createChatController,
30
+ } from "../chat-core/index.js";
31
+ import { BiabDevClient } from "../client.js";
32
+ import {
33
+ createPortalController,
34
+ type PortalSnapshot,
35
+ } from "../portal-core/index.js";
36
+
37
+ import {
38
+ createMarketingController,
39
+ type MarketingController,
40
+ type MarketingSnapshot,
41
+ } from "../marketing-core/index.js";
42
+ import {
43
+ createVerifyController,
44
+ type CreateVerifyControllerOptions,
45
+ type VerifyController,
46
+ type VerifySnapshot,
47
+ } from "../verify-core/index.js";
48
+
49
+ import {
50
+ createFollowersController,
51
+ createUserController,
52
+ type FollowersController,
53
+ type FollowersSnapshot,
54
+ type UserController,
55
+ type UserSnapshot,
56
+ } from "../account-core/index.js";
57
+ import {
58
+ type CheckoutController,
59
+ type CheckoutSnapshot,
60
+ createCheckoutController,
61
+ } from "../checkout-core/index.js";
62
+ import { createBiabClient } from "../sdk.js";
63
+
64
+ import type {
65
+ BlogCommentPostInput,
66
+ CartAddItemInput,
67
+ ChatbotFormSubmitInput,
68
+ ChatbotRequestHumanInput,
69
+ CustomerPortalMessagePostInput,
70
+ } from "../contracts.js";
71
+ import {
72
+ createStoreController,
73
+ type StoreController,
74
+ type StoreSnapshot,
75
+ } from "../store-core/index.js";
76
+
77
+ type Observable<TSnapshot> = {
78
+ snapshot(): TSnapshot;
79
+ subscribe(cb: (s: TSnapshot) => void): () => void;
80
+ destroy(): void;
81
+ };
82
+
83
+ /**
84
+ * Wrap a controller as a readable store.
85
+ *
86
+ * `readable`'s start function runs on the FIRST subscriber and its return value
87
+ * runs when the LAST one goes away, which is exactly the controller's lifetime:
88
+ * a component that mounts, renders and unmounts destroys it, and one that never
89
+ * subscribes never opens a request.
90
+ *
91
+ * The initial value comes from `snapshot()` because the cores do not replay on
92
+ * subscribe.
93
+ */
94
+ function toStore<TSnapshot>(
95
+ controller: Observable<TSnapshot>,
96
+ start?: () => void,
97
+ ): Readable<TSnapshot> {
98
+ return readable(controller.snapshot(), (set) => {
99
+ const unsubscribe = controller.subscribe(set);
100
+ start?.();
101
+ return () => {
102
+ unsubscribe();
103
+ controller.destroy();
104
+ };
105
+ });
106
+ }
107
+
108
+ export type CreateStorefrontOptions = {
109
+ apiKey: string;
110
+ baseUrl: string;
111
+ pageSize?: number;
112
+ categoryId?: string | null;
113
+ };
114
+
115
+ export type StorefrontHandle = {
116
+ state: Readable<StoreSnapshot>;
117
+ } & Omit<StoreController, "snapshot" | "subscribe" | "destroy" | "load">;
118
+
119
+ /**
120
+ * Headless storefront + cart.
121
+ *
122
+ * ```svelte
123
+ * <script lang="ts">
124
+ * const { state, addToCart } = createStorefront({ apiKey, baseUrl });
125
+ * </script>
126
+ * {#each $state.products as product}
127
+ * <MyCard {product} />
128
+ * {/each}
129
+ * ```
130
+ */
131
+ export function createStorefront(
132
+ options: CreateStorefrontOptions,
133
+ ): StorefrontHandle {
134
+ const controller = createStoreController({
135
+ client: new BiabDevClient({
136
+ apiKey: options.apiKey,
137
+ baseUrl: options.baseUrl,
138
+ }),
139
+ ...(options.pageSize ? { pageSize: options.pageSize } : {}),
140
+ ...(options.categoryId ? { categoryId: options.categoryId } : {}),
141
+ });
142
+
143
+ return {
144
+ state: toStore(controller, () => void controller.load()),
145
+ loadMore: () => controller.loadMore(),
146
+ filterByCategory: (id: string | null) => controller.filterByCategory(id),
147
+ openProduct: (id: string) => controller.openProduct(id),
148
+ closeProduct: () => controller.closeProduct(),
149
+ addToCart: (input: CartAddItemInput) => controller.addToCart(input),
150
+ updateQuantity: (itemId: string, quantity: number) =>
151
+ controller.updateQuantity(itemId, quantity),
152
+ removeItem: (itemId: string) => controller.removeItem(itemId),
153
+ applyCoupon: (code: string) => controller.applyCoupon(code),
154
+ removeCoupon: () => controller.removeCoupon(),
155
+ clearCart: () => controller.clearCart(),
156
+ refreshCart: () => controller.refreshCart(),
157
+ };
158
+ }
159
+
160
+ export type CreateChatOptions = { apiKey: string; baseUrl: string };
161
+
162
+ export type ChatHandle = {
163
+ state: Readable<ChatSnapshot>;
164
+ } & Omit<ChatController, "snapshot" | "subscribe" | "destroy">;
165
+
166
+ /**
167
+ * Headless Front Desk chat — the native alternative to `<Chatbot>`.
168
+ *
169
+ * ```svelte
170
+ * <script lang="ts">
171
+ * const { state, send } = createChat({ apiKey, baseUrl });
172
+ * </script>
173
+ * {#each $state.messages as message}
174
+ * <Bubble {message} />
175
+ * {/each}
176
+ * ```
177
+ */
178
+ export function createChat(options: CreateChatOptions): ChatHandle {
179
+ const controller = createChatController({
180
+ client: new BiabDevClient({
181
+ apiKey: options.apiKey,
182
+ baseUrl: options.baseUrl,
183
+ }),
184
+ });
185
+
186
+ return {
187
+ state: toStore(controller),
188
+ send: (content: string) => controller.send(content),
189
+ reset: () => controller.reset(),
190
+ loadConfig: () => controller.loadConfig(),
191
+ refreshAvailability: () => controller.refreshAvailability(),
192
+ getForm: (slug: string) => controller.getForm(slug),
193
+ submitForm: (slug: string, input: ChatbotFormSubmitInput) =>
194
+ controller.submitForm(slug, input),
195
+ requestHuman: (input: ChatbotRequestHumanInput) =>
196
+ controller.requestHuman(input),
197
+ };
198
+ }
199
+
200
+ export type CreateBlogOptions = {
201
+ apiKey: string;
202
+ baseUrl: string;
203
+ pageSize?: number;
204
+ categoryId?: string | null;
205
+ };
206
+
207
+ export type BlogHandle = {
208
+ state: Readable<BlogSnapshot>;
209
+ } & Omit<BlogController, "snapshot" | "subscribe" | "destroy" | "load">;
210
+
211
+ /** Headless blog — the native alternative to `<Blog>`. */
212
+ export function createBlog(options: CreateBlogOptions): BlogHandle {
213
+ const controller = createBlogController({
214
+ client: new BiabDevClient({
215
+ apiKey: options.apiKey,
216
+ baseUrl: options.baseUrl,
217
+ }),
218
+ ...(options.pageSize ? { pageSize: options.pageSize } : {}),
219
+ ...(options.categoryId ? { categoryId: options.categoryId } : {}),
220
+ });
221
+
222
+ return {
223
+ state: toStore(controller, () => void controller.load()),
224
+ loadMore: () => controller.loadMore(),
225
+ filterByCategory: (id: string | null) => controller.filterByCategory(id),
226
+ openPost: (slug: string) => controller.openPost(slug),
227
+ closePost: () => controller.closePost(),
228
+ loadComments: () => controller.loadComments(),
229
+ loadMoreComments: () => controller.loadMoreComments(),
230
+ postComment: (input: BlogCommentPostInput) =>
231
+ controller.postComment(input),
232
+ toggleLike: () => controller.toggleLike(),
233
+ };
234
+ }
235
+
236
+ export type CreateCheckoutOptions = { apiKey: string; baseUrl: string };
237
+ export type CreateCheckoutResult = {
238
+ state: Readable<CheckoutSnapshot>;
239
+ } & Omit<CheckoutController, "snapshot" | "subscribe" | "destroy">;
240
+
241
+ /** Headless checkout. `start()` mints a session; `redirect()` navigates. */
242
+ export function createCheckout(options: CreateCheckoutOptions): CreateCheckoutResult {
243
+ const controller = createCheckoutController({
244
+ client: new BiabDevClient({
245
+ apiKey: options.apiKey,
246
+ baseUrl: options.baseUrl,
247
+ }),
248
+ });
249
+ const state = toStore(controller);
250
+ return {
251
+ state,
252
+ start: (input) => controller.start(input),
253
+ redirect: () => controller.redirect(),
254
+ resolve: (sessionId: string) => controller.resolve(sessionId),
255
+ reset: () => controller.reset(),
256
+ };
257
+ }
258
+
259
+ export type CreateUserResult = {
260
+ state: Readable<UserSnapshot>;
261
+ refresh: () => Promise<UserSnapshot>;
262
+ };
263
+
264
+ /** The signed-in customer, from the auth handler's `/me`. */
265
+ export function createUser(options: { basePath?: string } = {}): CreateUserResult {
266
+ const controller = createUserController(options);
267
+ const state = toStore(controller, () => controller.start());
268
+ return { state, refresh: () => controller.refresh() };
269
+ }
270
+
271
+ export type CreateFollowersOptions = {
272
+ token: string;
273
+ siteId: string;
274
+ baseUrl?: string;
275
+ };
276
+ export type CreateFollowersResult = {
277
+ state: Readable<FollowersSnapshot>;
278
+ } & Omit<FollowersController, "snapshot" | "subscribe" | "destroy">;
279
+
280
+ /** Newsletter / follower subscribe with the local already-subscribed hint. */
281
+ export function createFollowers(
282
+ options: CreateFollowersOptions,
283
+ ): CreateFollowersResult {
284
+ const controller = createFollowersController({
285
+ client: createBiabClient({
286
+ apiKey: options.token,
287
+ siteId: options.siteId,
288
+ ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
289
+ }),
290
+ siteId: options.siteId,
291
+ });
292
+ const state = toStore(controller);
293
+ return {
294
+ state,
295
+ join: (input) => controller.join(input),
296
+ leave: (email: string) => controller.leave(email),
297
+ me: (email: string) => controller.me(email),
298
+ edit: (email: string, patch: { name?: string; source?: string }) =>
299
+ controller.edit(email, patch),
300
+ };
301
+ }
302
+
303
+ export {
304
+ signIn,
305
+ signInHref,
306
+ signOut,
307
+ signOutHref,
308
+ signUp,
309
+ signUpHref,
310
+ } from "../account-core/index.js";
311
+
312
+ export type CreateMarketingOptions = {
313
+ token: string;
314
+ siteId: string;
315
+ baseUrl?: string;
316
+ };
317
+
318
+ /** Headless marketing pages — the index, plus one page at a time. */
319
+ export function createMarketing(options: CreateMarketingOptions) {
320
+ const controller = createMarketingController({
321
+ client: createBiabClient({
322
+ apiKey: options.token,
323
+ siteId: options.siteId,
324
+ ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
325
+ }),
326
+ });
327
+ const state = toStore(controller, () => void controller.load());
328
+ return {
329
+ state,
330
+ open: (pageKey?: string, opts?: { skipCache?: boolean }) =>
331
+ controller.open(pageKey, opts),
332
+ prefetch: (pageKey?: string) => controller.prefetch(pageKey),
333
+ close: () => controller.close(),
334
+ };
335
+ }
336
+
337
+ export type CreateVerifyOptions = {
338
+ apiKey: string;
339
+ baseUrl: string;
340
+ } & Omit<CreateVerifyControllerOptions, "client">;
341
+
342
+ /**
343
+ * Headless email / phone verification.
344
+ *
345
+ * Read `state.flow` before rendering: `otp` wants a code field, `link` wants a
346
+ * "check your email" message and no field at all.
347
+ */
348
+ export function createVerify(options: CreateVerifyOptions) {
349
+ const { apiKey, baseUrl, ...rest } = options;
350
+ const controller = createVerifyController({
351
+ client: new BiabDevClient({ apiKey, baseUrl }),
352
+ ...rest,
353
+ });
354
+ const state = toStore(controller);
355
+ return {
356
+ state,
357
+ start: (destination: string) => controller.start(destination),
358
+ resend: () => controller.resend(),
359
+ confirm: (token: string) => controller.confirm(token),
360
+ canResend: (now?: number) => controller.canResend(now),
361
+ reset: () => controller.reset(),
362
+ };
363
+ }
364
+
365
+ export type CreatePortalOptions = {
366
+ apiKey: string;
367
+ baseUrl: string;
368
+ sessionToken: string;
369
+ };
370
+
371
+ /**
372
+ * The signed-in customer's portal — work, quotes, contracts, invoices, orders,
373
+ * downloads, shipping, reviews, referrals, profile and notification settings.
374
+ *
375
+ * `sessionToken` is required: every portal route is scoped to the signed-in
376
+ * customer, and without one the portal renders empty rather than signed-out.
377
+ *
378
+ * Note two things the API itself imposes. There are no list endpoints for
379
+ * invoices, quotes, contracts or shipments — `state.work` carries the counts
380
+ * and you open each by id. And a submitted review is queued for staff approval,
381
+ * so it will not appear in `state.reviews`; watch `reviewAwaitingModeration`.
382
+ */
383
+ export function createPortal(options: CreatePortalOptions) {
384
+ const controller = createPortalController({
385
+ client: new BiabDevClient({
386
+ apiKey: options.apiKey,
387
+ baseUrl: options.baseUrl,
388
+ }),
389
+ sessionToken: options.sessionToken,
390
+ });
391
+ const state: Readable<PortalSnapshot> = toStore(controller, () => void controller.load());
392
+ return {
393
+ state,
394
+ load: () => controller.load(),
395
+ loadOrders: (opts?: { limit?: number }) => controller.loadOrders(opts),
396
+ loadInvoices: (opts?: {
397
+ limit?: number;
398
+ status?: string;
399
+ unpaid?: boolean;
400
+ }) => controller.loadInvoices(opts),
401
+ loadQuotes: (opts?: { limit?: number; status?: string }) =>
402
+ controller.loadQuotes(opts),
403
+ loadContracts: (opts?: { limit?: number; status?: string }) =>
404
+ controller.loadContracts(opts),
405
+ loadShipments: (opts?: { limit?: number; active?: boolean }) =>
406
+ controller.loadShipments(opts),
407
+ loadMessages: (opts?: { limit?: number; jobId?: string }) =>
408
+ controller.loadMessages(opts),
409
+ postMessage: (input: CustomerPortalMessagePostInput) =>
410
+ controller.postMessage(input),
411
+ markMessagesRead: () => controller.markMessagesRead(),
412
+ loadPayments: (opts?: { limit?: number }) => controller.loadPayments(opts),
413
+ loadReviews: () => controller.loadReviews(),
414
+ loadReferrals: () => controller.loadReferrals(),
415
+ loadNotificationPreferences: () => controller.loadNotificationPreferences(),
416
+ loadOtherOrgs: () => controller.loadOtherOrgs(),
417
+ openJob: (id: string) => controller.openJob(id),
418
+ openOrder: (id: string) => controller.openOrder(id),
419
+ openInvoice: (id: string) => controller.openInvoice(id),
420
+ openQuote: (id: string) => controller.openQuote(id),
421
+ openContract: (id: string) => controller.openContract(id),
422
+ trackShipment: (id: string) => controller.trackShipment(id),
423
+ closeDetail: () => controller.closeDetail(),
424
+ postJobComment: controller.postJobComment,
425
+ acceptQuote: (id: string) => controller.acceptQuote(id),
426
+ rejectQuote: (id: string) => controller.rejectQuote(id),
427
+ signContract: (id: string) => controller.signContract(id),
428
+ payInvoice: controller.payInvoice,
429
+ updateProfile: controller.updateProfile,
430
+ updateNotificationPreferences: controller.updateNotificationPreferences,
431
+ submitReview: controller.submitReview,
432
+ submitReturnRequest: controller.submitReturnRequest,
433
+ contactCompany: controller.contactCompany,
434
+ };
435
+ }
@@ -77,3 +77,12 @@ export type {
77
77
  FormsResource,
78
78
  } from "../forms-core/index.js";
79
79
  export type { BiabClient } from "../sdk.js";
80
+
81
+ // Headless storefront + chat — the native (non-iframe) surfaces.
82
+ export * from "./headless.js";
83
+
84
+ // The social-links block. Markup lives in an SFC because Svelte has no
85
+ // render-function escape hatch; everything that could drift is in `social-core`.
86
+ export { default as SocialLinks } from "./SocialLinks.svelte";
87
+ export { resolveSocialLinks } from "../social-core/index.js";
88
+ export type { SocialLinkRow } from "../social-core/index.js";