@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
package/src/solid.tsx CHANGED
@@ -27,22 +27,32 @@
27
27
  * @module
28
28
  */
29
29
 
30
- import type { JSX } from "solid-js";
30
+ // Only the primitives that exist UNCHANGED in both Solid 1 and Solid 2.
31
+ // Everything Solid 2 moved or dropped comes from `solid-compat` instead, so
32
+ // this one binding compiles and runs on either version. See that module for
33
+ // the measured API differences.
34
+ import {
35
+ createContext,
36
+ createMemo,
37
+ createSignal,
38
+ onCleanup,
39
+ useContext,
40
+ } from "solid-js";
41
+
31
42
  import {
32
43
  type Accessor,
33
44
  For,
34
45
  Match,
35
46
  Show,
47
+ type SolidNode,
36
48
  Switch,
37
- createContext,
38
- createMemo,
39
- createSignal,
40
49
  createUniqueId,
41
- from,
42
- onCleanup,
50
+ cx,
51
+ fromStore,
43
52
  onMount,
44
- useContext,
45
- } from "solid-js";
53
+ providerFor,
54
+ renderNode,
55
+ } from "./solid-compat.js";
46
56
 
47
57
  import type {
48
58
  BiabClient,
@@ -72,11 +82,15 @@ import {
72
82
  // ─────────────────────────────────────────────────────────────────────────────
73
83
 
74
84
  const BiabClientContext = createContext<Accessor<BiabClient | undefined>>();
85
+ /** Solid 1 exposes `.Provider`; Solid 2 makes the context its own provider. */
86
+ const BiabClientProvider = providerFor<Accessor<BiabClient | undefined>>(
87
+ BiabClientContext,
88
+ );
75
89
 
76
90
  export interface BiabProviderProps {
77
91
  /** The SDK client shared with descendant `<BiabForm>`s. */
78
92
  client: BiabClient;
79
- children?: JSX.Element;
93
+ children?: SolidNode;
80
94
  }
81
95
 
82
96
  /**
@@ -84,12 +98,12 @@ export interface BiabProviderProps {
84
98
  * doesn't get its own `client` prop falls back to this one. Optional — passing
85
99
  * `client` directly to `<BiabForm>` works without a provider.
86
100
  */
87
- export function BiabProvider(props: BiabProviderProps): JSX.Element {
101
+ export function BiabProvider(props: BiabProviderProps) {
88
102
  const value = createMemo(() => props.client);
89
103
  return (
90
- <BiabClientContext.Provider value={value}>
91
- {props.children}
92
- </BiabClientContext.Provider>
104
+ <BiabClientProvider value={value}>
105
+ {renderNode(props.children)}
106
+ </BiabClientProvider>
93
107
  );
94
108
  }
95
109
 
@@ -126,17 +140,12 @@ export function createFormStore(
126
140
  ): BiabFormStore {
127
141
  const controller = createFormController(options);
128
142
 
129
- // `from` wraps the subscribe contract: it calls subscribe(setter) and returns
130
- // an accessor. We pre-seed with snapshot() because the core never replays on
131
- // subscribe, so the very first read must not be undefined.
132
- const tracked = from<FormSnapshot>((set) => {
133
- set(controller.snapshot());
134
- return controller.subscribe(set);
135
- });
136
- // `from` accessors are `T | undefined` until the first emit; the seed above
137
- // makes that window empty, but narrow it for callers regardless.
138
- const snapshot: Accessor<FormSnapshot> = () =>
139
- tracked() ?? controller.snapshot();
143
+ // `fromStore` bridges the controller's snapshot/subscribe contract into a
144
+ // Solid accessor. It reads `snapshot()` up front because the core does NOT
145
+ // replay on subscribe waiting for the first notification would render an
146
+ // empty form until something happened to change, which on an untouched form
147
+ // is forever. Unlike Solid 1's `from`, it is never `undefined`.
148
+ const snapshot: Accessor<FormSnapshot> = fromStore(controller);
140
149
 
141
150
  onMount(() => {
142
151
  void controller.load();
@@ -205,7 +214,7 @@ function asString(v: unknown): string {
205
214
  return typeof v === "string" ? v : "";
206
215
  }
207
216
 
208
- function FieldInput(props: FieldInputProps): JSX.Element {
217
+ function FieldInput(props: FieldInputProps) {
209
218
  const t = () => props.field.type;
210
219
  const field = () => props.field;
211
220
  // Resolved HTML autofill token for this field (or undefined to omit the
@@ -415,11 +424,10 @@ function FieldInput(props: FieldInputProps): JSX.Element {
415
424
  {(color) => (
416
425
  <button
417
426
  type="button"
418
- class="biab-color-swatch"
419
- classList={{
427
+ class={cx("biab-color-swatch", {
420
428
  "biab-color-swatch--selected":
421
429
  asString(props.value()) === color,
422
- }}
430
+ })}
423
431
  style={{ "background-color": color }}
424
432
  title={color}
425
433
  onClick={() => props.set(color)}
@@ -508,8 +516,7 @@ function FieldInput(props: FieldInputProps): JSX.Element {
508
516
  {(_, i) => (
509
517
  <button
510
518
  type="button"
511
- class="biab-stars__star"
512
- classList={{ "biab-stars__star--on": i() < cur() }}
519
+ class={cx("biab-stars__star", { "biab-stars__star--on": i() < cur() })}
513
520
  aria-label={`${i() + 1} star`}
514
521
  onClick={() => props.set(i() + 1)}
515
522
  >
@@ -533,8 +540,7 @@ function FieldInput(props: FieldInputProps): JSX.Element {
533
540
  {(emoji, i) => (
534
541
  <button
535
542
  type="button"
536
- class="biab-happiness__face"
537
- classList={{ "biab-happiness__face--on": i() === cur() }}
543
+ class={cx("biab-happiness__face", { "biab-happiness__face--on": i() === cur() })}
538
544
  onClick={() => props.set(i())}
539
545
  >
540
546
  {emoji}
@@ -754,10 +760,15 @@ function FieldInput(props: FieldInputProps): JSX.Element {
754
760
  };
755
761
  const maxFiles = () => cfg().maxFiles ?? 1;
756
762
  const remaining = () => Math.max(maxFiles() - files().length, 0);
757
- const accept = () =>
758
- cfg().allowedTypes && cfg().allowedTypes.length > 0
759
- ? cfg().allowedTypes.join(",")
763
+ // Read the accessor ONCE. Calling `cfg()` again inside the branch
764
+ // starts a fresh, un-narrowed read, so the guard above buys
765
+ // nothing and `allowedTypes` is still possibly-undefined.
766
+ const accept = () => {
767
+ const allowed = cfg().allowedTypes;
768
+ return allowed && allowed.length > 0
769
+ ? allowed.join(",")
760
770
  : undefined;
771
+ };
761
772
  let inputRef: HTMLInputElement | undefined;
762
773
  const [localError, setLocalError] = createSignal<string | null>(null);
763
774
 
@@ -882,7 +893,7 @@ interface RenderCtx {
882
893
  setValue: (id: string, value: unknown) => void;
883
894
  upload: (fieldId: string, file: File, filename?: string) => Promise<FormFileValue>;
884
895
  /** Optional consumer render override, per field. */
885
- fieldSlot?: (args: FieldSlotArgs) => JSX.Element;
896
+ fieldSlot?: (args: FieldSlotArgs) => SolidNode;
886
897
  /** Resolve the HTML autofill token for a field (or `undefined` to omit). */
887
898
  autocomplete: (field: FormCoreField) => string | undefined;
888
899
  }
@@ -894,7 +905,7 @@ export interface FieldSlotArgs {
894
905
  setValue: (value: unknown) => void;
895
906
  }
896
907
 
897
- function FieldRow(props: { field: FormCoreField; ctx: RenderCtx }): JSX.Element {
908
+ function FieldRow(props: { field: FormCoreField; ctx: RenderCtx }) {
898
909
  const field = () => props.field;
899
910
  const value = () => props.ctx.snapshot().values[field().id];
900
911
  const error = () => props.ctx.snapshot().errors[field().id];
@@ -914,12 +925,11 @@ function FieldRow(props: { field: FormCoreField; ctx: RenderCtx }): JSX.Element
914
925
  data-field-id={field().id}
915
926
  data-biab-field={fieldCssKey(field())}
916
927
  data-biab-type={field().type}
917
- class="biab-field"
918
- classList={{
928
+ class={cx("biab-field", {
919
929
  [`biab-field--${field().type}`]: true,
920
930
  "biab-field--required": field().required === true,
921
931
  "biab-field--error": Boolean(error()),
922
- }}
932
+ })}
923
933
  >
924
934
  <Show when={showLabel() && (field().label || field().required)}>
925
935
  <label class="biab-field__label">
@@ -961,7 +971,7 @@ function RenderTree(props: {
961
971
  fields: FormCoreField[];
962
972
  ctx: RenderCtx;
963
973
  flat?: boolean;
964
- }): JSX.Element {
974
+ }) {
965
975
  return (
966
976
  <div class="biab-tree">
967
977
  <For each={props.fields}>
@@ -981,8 +991,7 @@ function RenderTree(props: {
981
991
  return (
982
992
  <div
983
993
  data-biab-group={fieldCssKey(node)}
984
- class="biab-group"
985
- classList={{ "biab-group--bordered": !props.flat }}
994
+ class={cx("biab-group", { "biab-group--bordered": !props.flat })}
986
995
  >
987
996
  <Show
988
997
  when={node.label && node.showGroupLabel === true}
@@ -1035,8 +1044,7 @@ function RenderTree(props: {
1035
1044
  };
1036
1045
  return (
1037
1046
  <div
1038
- class="biab-or"
1039
- classList={{ "biab-or--error": errored() }}
1047
+ class={cx("biab-or", { "biab-or--error": errored() })}
1040
1048
  >
1041
1049
  <Show when={node.label}>
1042
1050
  <div class="biab-or__label">
@@ -1101,7 +1109,7 @@ function RenderTree(props: {
1101
1109
  // Progress — labeled "steps" or thin "bar". Mirrors FormPreview's two indicators.
1102
1110
  // ─────────────────────────────────────────────────────────────────────────────
1103
1111
 
1104
- function StepProgress(props: { snapshot: Accessor<FormSnapshot> }): JSX.Element {
1112
+ function StepProgress(props: { snapshot: Accessor<FormSnapshot> }) {
1105
1113
  const steps = () => props.snapshot().steps;
1106
1114
  const current = () => props.snapshot().step;
1107
1115
  return (
@@ -1119,27 +1127,24 @@ function StepProgress(props: { snapshot: Accessor<FormSnapshot> }): JSX.Element
1119
1127
  <>
1120
1128
  <Show when={i() > 0}>
1121
1129
  <div
1122
- class="biab-progress__line"
1123
- classList={{
1130
+ class={cx("biab-progress__line", {
1124
1131
  "biab-progress__line--filled": i() <= current(),
1125
- }}
1132
+ })}
1126
1133
  />
1127
1134
  </Show>
1128
1135
  <div class="biab-progress__node">
1129
1136
  <span
1130
- class="biab-progress__dot"
1131
- classList={{
1137
+ class={cx("biab-progress__dot", {
1132
1138
  "biab-progress__dot--current": isCurrent(),
1133
1139
  "biab-progress__dot--done": done(),
1134
- }}
1140
+ })}
1135
1141
  >
1136
1142
  {done() ? "✓" : i() + 1}
1137
1143
  </span>
1138
1144
  <span
1139
- class="biab-progress__step-label"
1140
- classList={{
1145
+ class={cx("biab-progress__step-label", {
1141
1146
  "biab-progress__step-label--current": isCurrent(),
1142
- }}
1147
+ })}
1143
1148
  >
1144
1149
  {title()}
1145
1150
  </span>
@@ -1153,7 +1158,7 @@ function StepProgress(props: { snapshot: Accessor<FormSnapshot> }): JSX.Element
1153
1158
  );
1154
1159
  }
1155
1160
 
1156
- function BarProgress(props: { snapshot: Accessor<FormSnapshot> }): JSX.Element {
1161
+ function BarProgress(props: { snapshot: Accessor<FormSnapshot> }) {
1157
1162
  return (
1158
1163
  <div class="biab-progress biab-progress--bar">
1159
1164
  <span class="biab-progress__count">
@@ -1194,7 +1199,7 @@ export interface BiabFormProps {
1194
1199
  /** Fired only on a failed submit. */
1195
1200
  onError?: (result: Extract<FormSubmitResult, { ok: false }>) => void;
1196
1201
  /** Per-field render override; return your own markup for any field. */
1197
- field?: (args: FieldSlotArgs) => JSX.Element;
1202
+ field?: (args: FieldSlotArgs) => SolidNode;
1198
1203
  /** Global HTML autofill switch. Defaults to inferring a token per field;
1199
1204
  * `false` emits `autocomplete="off"` on every input. Override individual
1200
1205
  * fields with `fieldAutoComplete`. */
@@ -1205,7 +1210,10 @@ export interface BiabFormProps {
1205
1210
  /** Extra class on the form root (alias: `className`). */
1206
1211
  class?: string;
1207
1212
  className?: string;
1208
- style?: JSX.CSSProperties | string;
1213
+ // `string` or a style object. Not `JSX.CSSProperties`: that type lives in
1214
+ // `solid-js` on Solid 1 and `@solidjs/web` on Solid 2, and naming it would
1215
+ // reintroduce the version split `solid-compat` exists to remove.
1216
+ style?: Record<string, string | number> | string;
1209
1217
  }
1210
1218
 
1211
1219
  /**
@@ -1217,13 +1225,19 @@ export interface BiabFormProps {
1217
1225
  * All visual classes are `biab-*` on light DOM, so consumer CSS cascades. The
1218
1226
  * component ships no styles of its own.
1219
1227
  */
1220
- export function BiabForm(props: BiabFormProps): JSX.Element {
1228
+ export function BiabForm(props: BiabFormProps) {
1221
1229
  const providerClient = useBiabClient();
1222
1230
  const resolvedClient = () => props.client ?? providerClient;
1223
1231
  const formId = createUniqueId();
1224
1232
 
1233
+ // Resolved once, for the same reason as `accept` above: the ternary narrows
1234
+ // the FIRST call, and the second call in the branch is a fresh read that TS
1235
+ // still types as possibly-undefined — which is also what would reach the
1236
+ // controller if the provider ever changed between the two reads.
1237
+ const initialClient = resolvedClient();
1238
+
1225
1239
  const store = createFormStore({
1226
- ...(resolvedClient() ? { client: resolvedClient() } : {}),
1240
+ ...(initialClient ? { client: initialClient } : {}),
1227
1241
  ...(props.slug ? { slug: props.slug } : {}),
1228
1242
  ...(props.schema ? { schema: props.schema } : {}),
1229
1243
  submitOptions: {
@@ -1464,3 +1478,11 @@ export type {
1464
1478
  FormSubmitOptions,
1465
1479
  } from "./forms-core/index.js";
1466
1480
  export { createFormController } from "./forms-core/index.js";
1481
+
1482
+ // ─────────────────────────────────────────────────────────────────────────────
1483
+ // The rest of the product surface — storefront, cart, checkout, blog, chat,
1484
+ // the customer portal, auth, followers and social links. Split into its own
1485
+ // file to keep this one about forms; re-exported here so `/solid` stays a
1486
+ // single entry point.
1487
+ // ─────────────────────────────────────────────────────────────────────────────
1488
+ export * from "./solid-surfaces.js";