@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,277 @@
1
+ /**
2
+ * `@businessdash/sdk/store` — the headless storefront + cart controller.
3
+ *
4
+ * ## Why this exists
5
+ *
6
+ * Until now the only storefront the SDK offered was `<Storefront>`: a
7
+ * BusinessDash-hosted page in a sandboxed iframe. It works, and it ships fast,
8
+ * but it renders OUR markup inside YOUR app — your design system stops at the
9
+ * iframe boundary, and there is no way to put a product card in your own grid.
10
+ * That was true in every binding, React included.
11
+ *
12
+ * This is the native path. It owns all of the behaviour — pagination, category
13
+ * filtering, the cart, coupons, the product detail — and none of the markup.
14
+ * Exactly the split `createFormController` already uses for forms: one
15
+ * framework-agnostic controller, and a thin reactive view per framework.
16
+ *
17
+ * A binding subscribes to `snapshot()` and renders it. That is the whole
18
+ * contract, and it is why React, Solid, Vue, Svelte, Qwik, Angular and plain
19
+ * DOM can each expose a native storefront without any of them reimplementing
20
+ * what "add to cart" means.
21
+ *
22
+ * ## Money
23
+ *
24
+ * Every price crossing this boundary is an INTEGER of the currency's minor unit
25
+ * — cents for USD. The controller never divides, rounds or formats: it passes
26
+ * what the API sent straight to your renderer. Format at the edge, where you
27
+ * know the locale.
28
+ *
29
+ * @module
30
+ */
31
+ const DEFAULT_PAGE_SIZE = 24;
32
+ function toError(cause, fallback) {
33
+ return cause instanceof Error ? cause : new Error(fallback);
34
+ }
35
+ export function createStoreController(options) {
36
+ const { client, onError } = options;
37
+ const pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;
38
+ let destroyed = false;
39
+ let cursor = null;
40
+ /**
41
+ * Guards against a stale page landing after the category changed. Every
42
+ * product fetch captures the token it started under and drops its result if
43
+ * the token moved on — otherwise clicking two categories quickly can leave
44
+ * the second one's products under the first one's heading.
45
+ */
46
+ let requestToken = 0;
47
+ const subscribers = new Set();
48
+ const state = {
49
+ status: "idle",
50
+ products: [],
51
+ categories: [],
52
+ cart: null,
53
+ activeProduct: null,
54
+ categoryId: options.categoryId ?? null,
55
+ hasMore: false,
56
+ error: null,
57
+ pending: {
58
+ products: false,
59
+ categories: false,
60
+ product: false,
61
+ cart: false,
62
+ },
63
+ };
64
+ let cached = null;
65
+ function snapshot() {
66
+ if (!cached) {
67
+ cached = {
68
+ status: state.status,
69
+ products: state.products,
70
+ categories: state.categories,
71
+ cart: state.cart,
72
+ activeProduct: state.activeProduct,
73
+ categoryId: state.categoryId,
74
+ hasMore: state.hasMore,
75
+ error: state.error,
76
+ pending: state.pending,
77
+ itemCount: state.cart?.itemCount ?? 0,
78
+ subtotal: state.cart?.subtotal ?? 0,
79
+ currency: state.cart?.currency ?? null,
80
+ };
81
+ }
82
+ return cached;
83
+ }
84
+ function notify() {
85
+ if (destroyed)
86
+ return;
87
+ cached = null;
88
+ const next = snapshot();
89
+ for (const cb of subscribers)
90
+ cb(next);
91
+ }
92
+ function fail(cause, fallback) {
93
+ const error = toError(cause, fallback);
94
+ state.error = error;
95
+ if (state.status !== "ready")
96
+ state.status = "error";
97
+ onError?.(error);
98
+ }
99
+ /** Run a cart mutation, keeping `pending.cart` honest even on failure. */
100
+ async function cartAction(run, fallback) {
101
+ if (destroyed)
102
+ return;
103
+ state.pending.cart = true;
104
+ state.error = null;
105
+ notify();
106
+ try {
107
+ const cart = await run();
108
+ if (destroyed)
109
+ return;
110
+ state.cart = cart;
111
+ }
112
+ catch (cause) {
113
+ if (destroyed)
114
+ return;
115
+ fail(cause, fallback);
116
+ }
117
+ finally {
118
+ if (!destroyed) {
119
+ state.pending.cart = false;
120
+ notify();
121
+ }
122
+ }
123
+ }
124
+ async function fetchProducts(append) {
125
+ const token = ++requestToken;
126
+ state.pending.products = true;
127
+ if (!append)
128
+ state.error = null;
129
+ notify();
130
+ try {
131
+ const page = await client.storefront.listProducts({
132
+ limit: pageSize,
133
+ ...(append && cursor !== null ? { cursor } : {}),
134
+ ...(state.categoryId ? { categoryId: state.categoryId } : {}),
135
+ });
136
+ // A newer request superseded this one — its result is now wrong.
137
+ if (destroyed || token !== requestToken)
138
+ return;
139
+ state.products = append ? [...state.products, ...page.items] : page.items;
140
+ cursor = page.nextCursor;
141
+ state.hasMore = page.nextCursor !== null;
142
+ state.status = "ready";
143
+ }
144
+ catch (cause) {
145
+ if (destroyed || token !== requestToken)
146
+ return;
147
+ fail(cause, "Failed to load products.");
148
+ }
149
+ finally {
150
+ if (!destroyed && token === requestToken) {
151
+ state.pending.products = false;
152
+ notify();
153
+ }
154
+ }
155
+ }
156
+ return {
157
+ snapshot,
158
+ subscribe(callback) {
159
+ subscribers.add(callback);
160
+ return () => {
161
+ subscribers.delete(callback);
162
+ };
163
+ },
164
+ async load() {
165
+ if (destroyed)
166
+ return;
167
+ if (state.status === "idle")
168
+ state.status = "loading";
169
+ state.pending.categories = true;
170
+ notify();
171
+ // Categories and the cart are independent of the product page, so all
172
+ // three go out together rather than waterfalling.
173
+ const categories = client.storefront
174
+ .listCategories()
175
+ .then((res) => {
176
+ if (destroyed)
177
+ return;
178
+ state.categories = res.items;
179
+ })
180
+ .catch((cause) => {
181
+ if (!destroyed)
182
+ fail(cause, "Failed to load categories.");
183
+ })
184
+ .finally(() => {
185
+ if (!destroyed)
186
+ state.pending.categories = false;
187
+ });
188
+ const cart = client.cart
189
+ .get()
190
+ .then((res) => {
191
+ if (destroyed)
192
+ return;
193
+ state.cart = res;
194
+ })
195
+ .catch((cause) => {
196
+ // A visitor with no cart yet is normal, not an error worth
197
+ // surfacing — leave `cart` null and let the products render.
198
+ void cause;
199
+ });
200
+ await Promise.all([fetchProducts(false), categories, cart]);
201
+ if (!destroyed)
202
+ notify();
203
+ },
204
+ async loadMore() {
205
+ if (destroyed || !state.hasMore || state.pending.products)
206
+ return;
207
+ await fetchProducts(true);
208
+ },
209
+ async filterByCategory(categoryId) {
210
+ if (destroyed)
211
+ return;
212
+ state.categoryId = categoryId;
213
+ cursor = null;
214
+ await fetchProducts(false);
215
+ },
216
+ async openProduct(productId) {
217
+ if (destroyed)
218
+ return;
219
+ state.pending.product = true;
220
+ state.error = null;
221
+ notify();
222
+ try {
223
+ const detail = await client.storefront.getProduct(productId);
224
+ if (destroyed)
225
+ return;
226
+ state.activeProduct = detail;
227
+ }
228
+ catch (cause) {
229
+ if (!destroyed)
230
+ fail(cause, "Failed to load the product.");
231
+ }
232
+ finally {
233
+ if (!destroyed) {
234
+ state.pending.product = false;
235
+ notify();
236
+ }
237
+ }
238
+ },
239
+ closeProduct() {
240
+ if (destroyed)
241
+ return;
242
+ state.activeProduct = null;
243
+ notify();
244
+ },
245
+ addToCart(input) {
246
+ return cartAction(() => client.cart.addItem(input), "Failed to add the item to the cart.");
247
+ },
248
+ updateQuantity(itemId, quantity) {
249
+ // The API treats 0 as a removal; going through `removeItem` keeps that
250
+ // explicit rather than relying on every binding knowing the convention.
251
+ if (quantity <= 0) {
252
+ return cartAction(() => client.cart.removeItem(itemId), "Failed to remove the item.");
253
+ }
254
+ return cartAction(() => client.cart.updateItem(itemId, { quantity }), "Failed to update the quantity.");
255
+ },
256
+ removeItem(itemId) {
257
+ return cartAction(() => client.cart.removeItem(itemId), "Failed to remove the item.");
258
+ },
259
+ applyCoupon(code) {
260
+ return cartAction(() => client.cart.applyCoupon({ code }), "That coupon could not be applied.");
261
+ },
262
+ removeCoupon() {
263
+ return cartAction(() => client.cart.removeCoupon(), "Failed to remove the coupon.");
264
+ },
265
+ clearCart() {
266
+ return cartAction(() => client.cart.clear(), "Failed to clear the cart.");
267
+ },
268
+ refreshCart() {
269
+ return cartAction(() => client.cart.get(), "Failed to read the cart.");
270
+ },
271
+ destroy() {
272
+ destroyed = true;
273
+ subscribers.clear();
274
+ },
275
+ };
276
+ }
277
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store-core/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `@businessdash/sdk/store` — the framework-agnostic storefront + cart core.
3
+ *
4
+ * Bindings shipped as SOURCE (Vue / Svelte / Solid / Qwik / Angular) import
5
+ * through this public subpath rather than a relative path, so the consumer's
6
+ * bundler resolves it exactly as their own code would. `forms` works the same
7
+ * way.
8
+ *
9
+ * @module
10
+ */
11
+ export * from "./store-core/index.js";
12
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,uBAAuB,CAAC"}
package/dist/store.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `@businessdash/sdk/store` — the framework-agnostic storefront + cart core.
3
+ *
4
+ * Bindings shipped as SOURCE (Vue / Svelte / Solid / Qwik / Angular) import
5
+ * through this public subpath rather than a relative path, so the consumer's
6
+ * bundler resolves it exactly as their own code would. `forms` works the same
7
+ * way.
8
+ *
9
+ * @module
10
+ */
11
+ export * from "./store-core/index.js";
12
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,uBAAuB,CAAC"}
package/dist/vanilla.d.ts CHANGED
@@ -74,4 +74,115 @@ export interface BiabFormInstance {
74
74
  destroy(): void;
75
75
  }
76
76
  export declare function mountBiabForm(elOrSelector: Element | string, opts: MountBiabFormOptions): BiabFormInstance;
77
+ import { type ChatController } from "./chat-core/index.js";
78
+ import { type StoreController } from "./store-core/index.js";
79
+ export type CreateStorefrontOptions = {
80
+ apiKey: string;
81
+ baseUrl: string;
82
+ pageSize?: number;
83
+ categoryId?: string | null;
84
+ onError?: (error: Error) => void;
85
+ };
86
+ /** Headless storefront + cart. Call `load()` to populate it. */
87
+ export declare function createStorefront(options: CreateStorefrontOptions): StoreController;
88
+ export type CreateChatOptions = {
89
+ apiKey: string;
90
+ baseUrl: string;
91
+ onError?: (error: Error) => void;
92
+ };
93
+ /** Headless Front Desk chat — the native alternative to the iframe widget. */
94
+ export declare function createChat(options: CreateChatOptions): ChatController;
95
+ export type { ChatController, ChatSnapshot } from "./chat-core/index.js";
96
+ export type { StoreController, StoreSnapshot, } from "./store-core/index.js";
97
+ import { type BlogController } from "./blog-core/index.js";
98
+ export type CreateBlogOptions = {
99
+ apiKey: string;
100
+ baseUrl: string;
101
+ pageSize?: number;
102
+ commentPageSize?: number;
103
+ categoryId?: string | null;
104
+ onError?: (error: Error) => void;
105
+ };
106
+ /** Headless blog — posts, taxonomy, a single post, comments and likes. */
107
+ export declare function createBlog(options: CreateBlogOptions): BlogController;
108
+ export type { BlogController, BlogSnapshot } from "./blog-core/index.js";
109
+ import { type FollowersController, type UserController } from "./account-core/index.js";
110
+ import { type CheckoutController } from "./checkout-core/index.js";
111
+ /** Headless checkout — mint a Stripe session, then `redirect()` or render it. */
112
+ export declare function createCheckout(options: {
113
+ apiKey: string;
114
+ baseUrl: string;
115
+ onError?: (error: Error) => void;
116
+ }): CheckoutController;
117
+ /** The signed-in customer, read from the auth handler's `/me`. */
118
+ export declare function createUser(options?: {
119
+ basePath?: string;
120
+ }): UserController;
121
+ /** Newsletter / follower subscribe, bound to a publishable token. */
122
+ export declare function createFollowers(options: {
123
+ token: string;
124
+ siteId: string;
125
+ baseUrl?: string;
126
+ onError?: (error: Error) => void;
127
+ }): FollowersController;
128
+ export type { FollowersController, FollowersSnapshot, UserController, UserSnapshot, } from "./account-core/index.js";
129
+ export { signIn, signInHref, signOut, signOutHref, signUp, signUpHref, } from "./account-core/index.js";
130
+ export type { CheckoutController, CheckoutSnapshot, } from "./checkout-core/index.js";
131
+ import { type MarketingController } from "./marketing-core/index.js";
132
+ import { type CreateVerifyControllerOptions, type VerifyController } from "./verify-core/index.js";
133
+ /**
134
+ * Headless marketing pages — the index, plus one page at a time.
135
+ *
136
+ * Bound to the PUBLISHABLE client, like followers: marketing pages are a
137
+ * browser-readable surface keyed by site, so they need a `siteId` and work with
138
+ * an origin-locked `pk_…` token.
139
+ */
140
+ export declare function createMarketing(options: {
141
+ token: string;
142
+ siteId: string;
143
+ baseUrl?: string;
144
+ onError?: (error: Error) => void;
145
+ }): MarketingController;
146
+ /** Headless email / phone verification. Read `flow` before rendering a field. */
147
+ export declare function createVerify(options: {
148
+ apiKey: string;
149
+ baseUrl: string;
150
+ } & Omit<CreateVerifyControllerOptions, "client">): VerifyController;
151
+ export type { MarketingController, MarketingSnapshot, } from "./marketing-core/index.js";
152
+ export type { VerifyController, VerifyFlow, VerifySnapshot, } from "./verify-core/index.js";
153
+ import { type PortalController } from "./portal-core/index.js";
154
+ /**
155
+ * The signed-in customer's portal. `sessionToken` is required — every portal
156
+ * route is scoped to the customer, and without one it renders empty rather than
157
+ * signed-out.
158
+ */
159
+ export declare function createPortal(options: {
160
+ apiKey: string;
161
+ baseUrl: string;
162
+ sessionToken: string;
163
+ onError?: (error: Error) => void;
164
+ }): PortalController;
165
+ export type { PortalController, PortalSnapshot } from "./portal-core/index.js";
166
+ export type MountSocialLinksOptions = {
167
+ socials: unknown;
168
+ /** Icon colour — hex without `#`, or a CSS keyword. */
169
+ color?: string;
170
+ /** Icon edge length in px. Default 20. */
171
+ size?: number;
172
+ class?: string;
173
+ linkClass?: string;
174
+ iconClass?: string;
175
+ };
176
+ /**
177
+ * Render a company's social links into `target`, replacing its contents.
178
+ *
179
+ * Returns a `destroy()` that empties the element again, so a single-page app
180
+ * can tear it down. Renders nothing at all when there are no profiles — an
181
+ * empty `<ul>` in a footer is worse than no list.
182
+ */
183
+ export declare function mountSocialLinks(target: Element, options: MountSocialLinksOptions): {
184
+ destroy: () => void;
185
+ };
186
+ export type { SocialLinkRow } from "./social-core/index.js";
187
+ export { resolveSocialLinks } from "./social-core/index.js";
77
188
  //# sourceMappingURL=vanilla.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vanilla.d.ts","sourceRoot":"","sources":["../src/vanilla.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,OAAO,EAKN,KAAK,cAAc,EAEnB,KAAK,QAAQ,EAEb,KAAK,iBAAiB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACX,UAAU,EAEV,UAAU,EACV,gBAAgB,EAChB,MAAM,UAAU,CAAC;AAGlB,cAAc,uBAAuB,CAAC;AAMtC,MAAM,WAAW,oBAAoB;IACpC;sEACkE;IAClE,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC;8EAC0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;yEACqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACrD;+EAC2E;IAC3E,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpC,uCAAuC;IACvC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,EAAE;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IACtE,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,EAAE;QAAE,EAAE,EAAE,KAAK,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;CACrE;AAED,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAChC,yDAAyD;IACzD,UAAU,EAAE,cAAc,CAAC;IAC3B,uDAAuD;IACvD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,oEAAoE;IACpE,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/D,kDAAkD;IAClD,KAAK,IAAI,IAAI,CAAC;IACd,oEAAoE;IACpE,OAAO,IAAI,IAAI,CAAC;CAChB;AAo3BD,wBAAgB,aAAa,CAC5B,YAAY,EAAE,OAAO,GAAG,MAAM,EAC9B,IAAI,EAAE,oBAAoB,GACxB,gBAAgB,CA2RlB"}
1
+ {"version":3,"file":"vanilla.d.ts","sourceRoot":"","sources":["../src/vanilla.ts"],"names":[],"mappings":"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"}
package/dist/vanilla.js CHANGED
@@ -900,4 +900,210 @@ function observeReveal(node) {
900
900
  }, { threshold: 0.15, rootMargin: "0px 0px -8% 0px" });
901
901
  obs.observe(node);
902
902
  }
903
+ // ─────────────────────────────────────────────────────────────────────────────
904
+ // Native storefront + chat, framework-free
905
+ //
906
+ // There is no reactivity system here to bridge into, so the controllers ARE the
907
+ // binding: subscribe, render, call the actions. That is also why these are the
908
+ // reference implementations — every framework binding is a wrapper around
909
+ // exactly these objects.
910
+ //
911
+ // const store = createStorefront({ apiKey, baseUrl });
912
+ // store.subscribe((s) => render(s.products));
913
+ // await store.load();
914
+ //
915
+ // Remember to `destroy()` when the surface goes away.
916
+ // ─────────────────────────────────────────────────────────────────────────────
917
+ import { createChatController, } from "./chat-core/index.js";
918
+ import { BiabDevClient as BiabDevClientForSurfaces } from "./client.js";
919
+ import { createStoreController, } from "./store-core/index.js";
920
+ /** Headless storefront + cart. Call `load()` to populate it. */
921
+ export function createStorefront(options) {
922
+ return createStoreController({
923
+ client: new BiabDevClientForSurfaces({
924
+ apiKey: options.apiKey,
925
+ baseUrl: options.baseUrl,
926
+ }),
927
+ ...(options.pageSize ? { pageSize: options.pageSize } : {}),
928
+ ...(options.categoryId ? { categoryId: options.categoryId } : {}),
929
+ ...(options.onError ? { onError: options.onError } : {}),
930
+ });
931
+ }
932
+ /** Headless Front Desk chat — the native alternative to the iframe widget. */
933
+ export function createChat(options) {
934
+ return createChatController({
935
+ client: new BiabDevClientForSurfaces({
936
+ apiKey: options.apiKey,
937
+ baseUrl: options.baseUrl,
938
+ }),
939
+ ...(options.onError ? { onError: options.onError } : {}),
940
+ });
941
+ }
942
+ import { createBlogController, } from "./blog-core/index.js";
943
+ /** Headless blog — posts, taxonomy, a single post, comments and likes. */
944
+ export function createBlog(options) {
945
+ return createBlogController({
946
+ client: new BiabDevClientForSurfaces({
947
+ apiKey: options.apiKey,
948
+ baseUrl: options.baseUrl,
949
+ }),
950
+ ...(options.pageSize ? { pageSize: options.pageSize } : {}),
951
+ ...(options.commentPageSize
952
+ ? { commentPageSize: options.commentPageSize }
953
+ : {}),
954
+ ...(options.categoryId ? { categoryId: options.categoryId } : {}),
955
+ ...(options.onError ? { onError: options.onError } : {}),
956
+ });
957
+ }
958
+ import { createFollowersController, createUserController, } from "./account-core/index.js";
959
+ import { createCheckoutController, } from "./checkout-core/index.js";
960
+ import { createBiabClient as createBiabClientForFollowers } from "./sdk.js";
961
+ /** Headless checkout — mint a Stripe session, then `redirect()` or render it. */
962
+ export function createCheckout(options) {
963
+ return createCheckoutController({
964
+ client: new BiabDevClientForSurfaces({
965
+ apiKey: options.apiKey,
966
+ baseUrl: options.baseUrl,
967
+ }),
968
+ ...(options.onError ? { onError: options.onError } : {}),
969
+ });
970
+ }
971
+ /** The signed-in customer, read from the auth handler's `/me`. */
972
+ export function createUser(options = {}) {
973
+ return createUserController(options);
974
+ }
975
+ /** Newsletter / follower subscribe, bound to a publishable token. */
976
+ export function createFollowers(options) {
977
+ // Followers hang off the PUBLISHABLE client (`createBiabClient`), not
978
+ // `BiabDevClient`: they are the one surface a browser calls directly with an
979
+ // origin-locked `pk_…` token and no backend.
980
+ return createFollowersController({
981
+ client: createBiabClientForFollowers({
982
+ apiKey: options.token,
983
+ siteId: options.siteId,
984
+ baseUrl: options.baseUrl ?? DEFAULT_PACKAGE_BASE_URL_FOR_SURFACES,
985
+ }),
986
+ siteId: options.siteId,
987
+ ...(options.onError ? { onError: options.onError } : {}),
988
+ });
989
+ }
990
+ export { signIn, signInHref, signOut, signOutHref, signUp, signUpHref, } from "./account-core/index.js";
991
+ /** Production package-API base, used when a surface doesn't specify one. */
992
+ const DEFAULT_PACKAGE_BASE_URL_FOR_SURFACES = "https://businessdash.us/api/package/v1";
993
+ import { createMarketingController, } from "./marketing-core/index.js";
994
+ import { createVerifyController, } from "./verify-core/index.js";
995
+ /**
996
+ * Headless marketing pages — the index, plus one page at a time.
997
+ *
998
+ * Bound to the PUBLISHABLE client, like followers: marketing pages are a
999
+ * browser-readable surface keyed by site, so they need a `siteId` and work with
1000
+ * an origin-locked `pk_…` token.
1001
+ */
1002
+ export function createMarketing(options) {
1003
+ return createMarketingController({
1004
+ client: createBiabClientForFollowers({
1005
+ apiKey: options.token,
1006
+ siteId: options.siteId,
1007
+ baseUrl: options.baseUrl ?? DEFAULT_PACKAGE_BASE_URL_FOR_SURFACES,
1008
+ }),
1009
+ ...(options.onError ? { onError: options.onError } : {}),
1010
+ });
1011
+ }
1012
+ /** Headless email / phone verification. Read `flow` before rendering a field. */
1013
+ export function createVerify(options) {
1014
+ const { apiKey, baseUrl, ...rest } = options;
1015
+ return createVerifyController({
1016
+ client: new BiabDevClientForSurfaces({ apiKey, baseUrl }),
1017
+ ...rest,
1018
+ });
1019
+ }
1020
+ import { createPortalController, } from "./portal-core/index.js";
1021
+ /**
1022
+ * The signed-in customer's portal. `sessionToken` is required — every portal
1023
+ * route is scoped to the customer, and without one it renders empty rather than
1024
+ * signed-out.
1025
+ */
1026
+ export function createPortal(options) {
1027
+ return createPortalController({
1028
+ client: new BiabDevClientForSurfaces({
1029
+ apiKey: options.apiKey,
1030
+ baseUrl: options.baseUrl,
1031
+ }),
1032
+ sessionToken: options.sessionToken,
1033
+ ...(options.onError ? { onError: options.onError } : {}),
1034
+ });
1035
+ }
1036
+ import { resolveSocialLinks, SOCIAL_FALLBACK_GLYPH, SOCIAL_LIST_STYLE, } from "./social-core/index.js";
1037
+ /**
1038
+ * Render a company's social links into `target`, replacing its contents.
1039
+ *
1040
+ * Returns a `destroy()` that empties the element again, so a single-page app
1041
+ * can tear it down. Renders nothing at all when there are no profiles — an
1042
+ * empty `<ul>` in a footer is worse than no list.
1043
+ */
1044
+ export function mountSocialLinks(target, options) {
1045
+ const size = options.size ?? 20;
1046
+ const rows = resolveSocialLinks(options.socials, { color: options.color });
1047
+ target.replaceChildren();
1048
+ if (rows.length === 0)
1049
+ return { destroy: () => target.replaceChildren() };
1050
+ const ul = document.createElement("ul");
1051
+ if (options.class)
1052
+ ul.className = options.class;
1053
+ for (const [prop, value] of Object.entries(SOCIAL_LIST_STYLE)) {
1054
+ ul.style.setProperty(prop, value);
1055
+ }
1056
+ for (const row of rows) {
1057
+ const li = document.createElement("li");
1058
+ const a = document.createElement("a");
1059
+ a.href = row.url;
1060
+ a.target = "_blank";
1061
+ a.rel = "noopener noreferrer";
1062
+ a.title = row.label;
1063
+ a.setAttribute("aria-label", row.label);
1064
+ if (options.linkClass)
1065
+ a.className = options.linkClass;
1066
+ a.append(socialGlyph(row, size, options.iconClass));
1067
+ li.append(a);
1068
+ ul.append(li);
1069
+ }
1070
+ target.append(ul);
1071
+ return { destroy: () => target.replaceChildren() };
1072
+ }
1073
+ /** Brand icon when the platform has one, generic globe when it doesn't. */
1074
+ function socialGlyph(row, size, iconClass) {
1075
+ if (row.iconUrl) {
1076
+ const img = document.createElement("img");
1077
+ img.src = row.iconUrl;
1078
+ img.alt = row.label;
1079
+ img.width = size;
1080
+ img.height = size;
1081
+ img.loading = "lazy";
1082
+ if (iconClass)
1083
+ img.className = iconClass;
1084
+ return img;
1085
+ }
1086
+ const ns = "http://www.w3.org/2000/svg";
1087
+ const svg = document.createElementNS(ns, "svg");
1088
+ svg.setAttribute("viewBox", SOCIAL_FALLBACK_GLYPH.viewBox);
1089
+ svg.setAttribute("width", String(size));
1090
+ svg.setAttribute("height", String(size));
1091
+ svg.setAttribute("fill", "none");
1092
+ svg.setAttribute("stroke", "currentColor");
1093
+ svg.setAttribute("stroke-width", String(SOCIAL_FALLBACK_GLYPH.strokeWidth));
1094
+ svg.setAttribute("aria-hidden", "true");
1095
+ if (iconClass)
1096
+ svg.setAttribute("class", iconClass);
1097
+ const title = document.createElementNS(ns, "title");
1098
+ title.textContent = row.label;
1099
+ const circle = document.createElementNS(ns, "circle");
1100
+ circle.setAttribute("cx", String(SOCIAL_FALLBACK_GLYPH.circle.cx));
1101
+ circle.setAttribute("cy", String(SOCIAL_FALLBACK_GLYPH.circle.cy));
1102
+ circle.setAttribute("r", String(SOCIAL_FALLBACK_GLYPH.circle.r));
1103
+ const path = document.createElementNS(ns, "path");
1104
+ path.setAttribute("d", SOCIAL_FALLBACK_GLYPH.path);
1105
+ svg.append(title, circle, path);
1106
+ return svg;
1107
+ }
1108
+ export { resolveSocialLinks } from "./social-core/index.js";
903
1109
  //# sourceMappingURL=vanilla.js.map