@businessdash/sdk 0.9.60

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 (268) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +899 -0
  3. package/dist/adapters-revalidate.d.ts +44 -0
  4. package/dist/adapters-revalidate.d.ts.map +1 -0
  5. package/dist/adapters-revalidate.js +68 -0
  6. package/dist/adapters-revalidate.js.map +1 -0
  7. package/dist/alpha.d.ts +21 -0
  8. package/dist/alpha.d.ts.map +1 -0
  9. package/dist/alpha.js +21 -0
  10. package/dist/alpha.js.map +1 -0
  11. package/dist/analytics-core.d.ts +34 -0
  12. package/dist/analytics-core.d.ts.map +1 -0
  13. package/dist/analytics-core.js +138 -0
  14. package/dist/analytics-core.js.map +1 -0
  15. package/dist/analytics-server.d.ts +54 -0
  16. package/dist/analytics-server.d.ts.map +1 -0
  17. package/dist/analytics-server.js +78 -0
  18. package/dist/analytics-server.js.map +1 -0
  19. package/dist/attribution-logo.d.ts +2 -0
  20. package/dist/attribution-logo.d.ts.map +1 -0
  21. package/dist/attribution-logo.js +5 -0
  22. package/dist/attribution-logo.js.map +1 -0
  23. package/dist/auth-handler.d.ts +92 -0
  24. package/dist/auth-handler.d.ts.map +1 -0
  25. package/dist/auth-handler.js +277 -0
  26. package/dist/auth-handler.js.map +1 -0
  27. package/dist/biab-forms.css +484 -0
  28. package/dist/cli.d.ts +46 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +1824 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/client.d.ts +1681 -0
  33. package/dist/client.d.ts.map +1 -0
  34. package/dist/client.js +2845 -0
  35. package/dist/client.js.map +1 -0
  36. package/dist/collections.d.ts +13 -0
  37. package/dist/collections.d.ts.map +1 -0
  38. package/dist/collections.js +13 -0
  39. package/dist/collections.js.map +1 -0
  40. package/dist/contracts.d.ts +14609 -0
  41. package/dist/contracts.d.ts.map +1 -0
  42. package/dist/contracts.js +2428 -0
  43. package/dist/contracts.js.map +1 -0
  44. package/dist/data-model-schema.d.ts +962 -0
  45. package/dist/data-model-schema.d.ts.map +1 -0
  46. package/dist/data-model-schema.js +2295 -0
  47. package/dist/data-model-schema.js.map +1 -0
  48. package/dist/distribution.d.ts +38 -0
  49. package/dist/distribution.d.ts.map +1 -0
  50. package/dist/distribution.js +61 -0
  51. package/dist/distribution.js.map +1 -0
  52. package/dist/element.d.ts +121 -0
  53. package/dist/element.d.ts.map +1 -0
  54. package/dist/element.js +276 -0
  55. package/dist/element.js.map +1 -0
  56. package/dist/enums.d.ts +25 -0
  57. package/dist/enums.d.ts.map +1 -0
  58. package/dist/enums.js +38 -0
  59. package/dist/enums.js.map +1 -0
  60. package/dist/errors.d.ts +195 -0
  61. package/dist/errors.d.ts.map +1 -0
  62. package/dist/errors.js +188 -0
  63. package/dist/errors.js.map +1 -0
  64. package/dist/forms-core/autocomplete.d.ts +37 -0
  65. package/dist/forms-core/autocomplete.d.ts.map +1 -0
  66. package/dist/forms-core/autocomplete.js +82 -0
  67. package/dist/forms-core/autocomplete.js.map +1 -0
  68. package/dist/forms-core/business-function.d.ts +61 -0
  69. package/dist/forms-core/business-function.d.ts.map +1 -0
  70. package/dist/forms-core/business-function.js +149 -0
  71. package/dist/forms-core/business-function.js.map +1 -0
  72. package/dist/forms-core/calculation.d.ts +72 -0
  73. package/dist/forms-core/calculation.d.ts.map +1 -0
  74. package/dist/forms-core/calculation.js +103 -0
  75. package/dist/forms-core/calculation.js.map +1 -0
  76. package/dist/forms-core/controller.d.ts +249 -0
  77. package/dist/forms-core/controller.d.ts.map +1 -0
  78. package/dist/forms-core/controller.js +590 -0
  79. package/dist/forms-core/controller.js.map +1 -0
  80. package/dist/forms-core/elements.d.ts +44 -0
  81. package/dist/forms-core/elements.d.ts.map +1 -0
  82. package/dist/forms-core/elements.js +68 -0
  83. package/dist/forms-core/elements.js.map +1 -0
  84. package/dist/forms-core/email-domains.d.ts +10 -0
  85. package/dist/forms-core/email-domains.d.ts.map +1 -0
  86. package/dist/forms-core/email-domains.js +69 -0
  87. package/dist/forms-core/email-domains.js.map +1 -0
  88. package/dist/forms-core/file-rules.d.ts +51 -0
  89. package/dist/forms-core/file-rules.d.ts.map +1 -0
  90. package/dist/forms-core/file-rules.js +105 -0
  91. package/dist/forms-core/file-rules.js.map +1 -0
  92. package/dist/forms-core/formula.d.ts +114 -0
  93. package/dist/forms-core/formula.d.ts.map +1 -0
  94. package/dist/forms-core/formula.js +1170 -0
  95. package/dist/forms-core/formula.js.map +1 -0
  96. package/dist/forms-core/index.d.ts +24 -0
  97. package/dist/forms-core/index.d.ts.map +1 -0
  98. package/dist/forms-core/index.js +28 -0
  99. package/dist/forms-core/index.js.map +1 -0
  100. package/dist/forms-core/units.d.ts +49 -0
  101. package/dist/forms-core/units.d.ts.map +1 -0
  102. package/dist/forms-core/units.js +255 -0
  103. package/dist/forms-core/units.js.map +1 -0
  104. package/dist/forms-core/us-states.d.ts +14 -0
  105. package/dist/forms-core/us-states.d.ts.map +1 -0
  106. package/dist/forms-core/us-states.js +66 -0
  107. package/dist/forms-core/us-states.js.map +1 -0
  108. package/dist/forms-core/validation.d.ts +266 -0
  109. package/dist/forms-core/validation.d.ts.map +1 -0
  110. package/dist/forms-core/validation.js +850 -0
  111. package/dist/forms-core/validation.js.map +1 -0
  112. package/dist/forms.d.ts +19 -0
  113. package/dist/forms.d.ts.map +1 -0
  114. package/dist/forms.js +29 -0
  115. package/dist/forms.js.map +1 -0
  116. package/dist/gallery-types.d.ts +32 -0
  117. package/dist/gallery-types.d.ts.map +1 -0
  118. package/dist/gallery-types.js +2 -0
  119. package/dist/gallery-types.js.map +1 -0
  120. package/dist/graphql.d.ts +97 -0
  121. package/dist/graphql.d.ts.map +1 -0
  122. package/dist/graphql.js +212 -0
  123. package/dist/graphql.js.map +1 -0
  124. package/dist/index.cjs +19448 -0
  125. package/dist/index.d.cts +19 -0
  126. package/dist/index.d.mts +19 -0
  127. package/dist/index.d.ts +19 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +20 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/marketing-schema.d.ts +216 -0
  132. package/dist/marketing-schema.d.ts.map +1 -0
  133. package/dist/marketing-schema.js +200 -0
  134. package/dist/marketing-schema.js.map +1 -0
  135. package/dist/mcp.d.ts +42 -0
  136. package/dist/mcp.d.ts.map +1 -0
  137. package/dist/mcp.js +87 -0
  138. package/dist/mcp.js.map +1 -0
  139. package/dist/native.d.ts +45 -0
  140. package/dist/native.d.ts.map +1 -0
  141. package/dist/native.js +43 -0
  142. package/dist/native.js.map +1 -0
  143. package/dist/next-revalidate.d.ts +43 -0
  144. package/dist/next-revalidate.d.ts.map +1 -0
  145. package/dist/next-revalidate.js +84 -0
  146. package/dist/next-revalidate.js.map +1 -0
  147. package/dist/parallel-pages.d.ts +102 -0
  148. package/dist/parallel-pages.d.ts.map +1 -0
  149. package/dist/parallel-pages.js +108 -0
  150. package/dist/parallel-pages.js.map +1 -0
  151. package/dist/payment-icons.d.ts +66 -0
  152. package/dist/payment-icons.d.ts.map +1 -0
  153. package/dist/payment-icons.js +160 -0
  154. package/dist/payment-icons.js.map +1 -0
  155. package/dist/proxy.d.ts +67 -0
  156. package/dist/proxy.d.ts.map +1 -0
  157. package/dist/proxy.js +97 -0
  158. package/dist/proxy.js.map +1 -0
  159. package/dist/react-analytics.d.ts +39 -0
  160. package/dist/react-analytics.d.ts.map +1 -0
  161. package/dist/react-analytics.js +59 -0
  162. package/dist/react-analytics.js.map +1 -0
  163. package/dist/react-attribution.d.ts +99 -0
  164. package/dist/react-attribution.d.ts.map +1 -0
  165. package/dist/react-attribution.js +52 -0
  166. package/dist/react-attribution.js.map +1 -0
  167. package/dist/react-marketing.d.ts +181 -0
  168. package/dist/react-marketing.d.ts.map +1 -0
  169. package/dist/react-marketing.js +215 -0
  170. package/dist/react-marketing.js.map +1 -0
  171. package/dist/react.d.ts +727 -0
  172. package/dist/react.d.ts.map +1 -0
  173. package/dist/react.js +2418 -0
  174. package/dist/react.js.map +1 -0
  175. package/dist/reserved-paths.d.ts +24 -0
  176. package/dist/reserved-paths.d.ts.map +1 -0
  177. package/dist/reserved-paths.js +60 -0
  178. package/dist/reserved-paths.js.map +1 -0
  179. package/dist/revalidate-verify.d.ts +30 -0
  180. package/dist/revalidate-verify.d.ts.map +1 -0
  181. package/dist/revalidate-verify.js +74 -0
  182. package/dist/revalidate-verify.js.map +1 -0
  183. package/dist/sdk.d.ts +678 -0
  184. package/dist/sdk.d.ts.map +1 -0
  185. package/dist/sdk.js +801 -0
  186. package/dist/sdk.js.map +1 -0
  187. package/dist/seo.d.ts +218 -0
  188. package/dist/seo.d.ts.map +1 -0
  189. package/dist/seo.js +309 -0
  190. package/dist/seo.js.map +1 -0
  191. package/dist/socials.d.ts +47 -0
  192. package/dist/socials.d.ts.map +1 -0
  193. package/dist/socials.js +172 -0
  194. package/dist/socials.js.map +1 -0
  195. package/dist/static.d.ts +14 -0
  196. package/dist/static.d.ts.map +1 -0
  197. package/dist/static.js +14 -0
  198. package/dist/static.js.map +1 -0
  199. package/dist/url-pattern.d.ts +47 -0
  200. package/dist/url-pattern.d.ts.map +1 -0
  201. package/dist/url-pattern.js +124 -0
  202. package/dist/url-pattern.js.map +1 -0
  203. package/dist/vanilla.d.ts +77 -0
  204. package/dist/vanilla.d.ts.map +1 -0
  205. package/dist/vanilla.js +903 -0
  206. package/dist/vanilla.js.map +1 -0
  207. package/openapi.json +13779 -0
  208. package/package.json +204 -0
  209. package/src/adapters-revalidate.ts +88 -0
  210. package/src/alpha.ts +89 -0
  211. package/src/analytics-core.ts +175 -0
  212. package/src/analytics-server.ts +99 -0
  213. package/src/angular/biab-form.component.ts +1443 -0
  214. package/src/angular/index.ts +26 -0
  215. package/src/attribution-logo.ts +5 -0
  216. package/src/auth-handler.ts +352 -0
  217. package/src/cli.ts +2517 -0
  218. package/src/client.ts +3578 -0
  219. package/src/collections.ts +101 -0
  220. package/src/contracts.ts +3390 -0
  221. package/src/data-model-schema.ts +4042 -0
  222. package/src/distribution.ts +73 -0
  223. package/src/element.ts +321 -0
  224. package/src/enums.ts +65 -0
  225. package/src/errors.ts +338 -0
  226. package/src/forms-core/autocomplete.ts +97 -0
  227. package/src/forms-core/business-function.ts +209 -0
  228. package/src/forms-core/calculation.ts +167 -0
  229. package/src/forms-core/controller.ts +922 -0
  230. package/src/forms-core/elements.ts +86 -0
  231. package/src/forms-core/email-domains.ts +68 -0
  232. package/src/forms-core/file-rules.ts +123 -0
  233. package/src/forms-core/formula.ts +1339 -0
  234. package/src/forms-core/index.ts +122 -0
  235. package/src/forms-core/units.ts +308 -0
  236. package/src/forms-core/us-states.ts +68 -0
  237. package/src/forms-core/validation.ts +1037 -0
  238. package/src/forms.ts +63 -0
  239. package/src/gallery-types.ts +31 -0
  240. package/src/graphql.ts +295 -0
  241. package/src/index.ts +505 -0
  242. package/src/marketing-schema.ts +395 -0
  243. package/src/mcp.ts +108 -0
  244. package/src/native.ts +73 -0
  245. package/src/next-revalidate.ts +124 -0
  246. package/src/parallel-pages.ts +192 -0
  247. package/src/payment-icons.ts +205 -0
  248. package/src/proxy.ts +173 -0
  249. package/src/qwik.tsx +1234 -0
  250. package/src/react-analytics.tsx +76 -0
  251. package/src/react-attribution.tsx +192 -0
  252. package/src/react-marketing.tsx +338 -0
  253. package/src/react.tsx +5495 -0
  254. package/src/reserved-paths.ts +65 -0
  255. package/src/revalidate-verify.ts +98 -0
  256. package/src/sdk.ts +1671 -0
  257. package/src/seo.ts +488 -0
  258. package/src/socials.ts +230 -0
  259. package/src/solid.tsx +1466 -0
  260. package/src/static.ts +21 -0
  261. package/src/styles/biab-forms.css +484 -0
  262. package/src/svelte/BiabForm.svelte +1069 -0
  263. package/src/svelte/context.ts +57 -0
  264. package/src/svelte/index.ts +79 -0
  265. package/src/url-pattern.ts +153 -0
  266. package/src/vanilla.ts +1290 -0
  267. package/src/vue/BiabForm.vue +1538 -0
  268. package/src/vue/index.ts +119 -0
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { BUSINESS_DASH_LOGO } from "./attribution-logo.js";
3
+ /**
4
+ * The default link: the verifiable backlink when we have a siteId. Exported for
5
+ * tests — the `?ref` marker is what a verification crawl matches on, so it's the
6
+ * one bit worth pinning.
7
+ */
8
+ export function resolveHref(siteId, href) {
9
+ if (href)
10
+ return href;
11
+ return siteId
12
+ ? `https://biab.app/?ref=${encodeURIComponent(siteId)}`
13
+ : "https://biab.app";
14
+ }
15
+ export function BusinessDashFooterBanner({ siteId, companyName = "Your Company", year = new Date().getFullYear(), variation = "block", href, hidden = false, className = "", }) {
16
+ if (hidden || variation === "none")
17
+ return null;
18
+ const linkHref = resolveHref(siteId, href);
19
+ const content = (_jsxs(_Fragment, { children: [_jsxs("span", { className: "whitespace-nowrap text-zinc-500", children: [_jsx("span", { className: "font-bold", children: "\u00A9" }), " ", year, " ", companyName] }), _jsx("span", { className: "text-zinc-600", children: "\u00B7" }), _jsxs("span", { className: "flex items-center gap-1 whitespace-nowrap text-zinc-600", children: ["Powered by", _jsx("a", { "aria-label": "BusinessDash", className: "inline-flex cursor-pointer items-center opacity-90 transition-opacity hover:opacity-100", href: linkHref, rel: "noopener", target: "_blank", children: _jsx("img", { alt: "BusinessDash", className: "h-[24px] w-auto", src: BUSINESS_DASH_LOGO }) })] })] }));
20
+ if (variation === "inline") {
21
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: `absolute bottom-0 left-0 hidden w-screen flex-wrap items-center justify-center gap-x-3 gap-y-1 pb-1 text-[13px] md:flex ${className}`, children: content }), _jsx("div", { className: `mx-auto flex w-fit flex-wrap items-center justify-center gap-x-3 gap-y-1 pb-1 text-[13px] md:hidden ${className}`, children: content })] }));
22
+ }
23
+ // block (default)
24
+ return (_jsx("div", { className: `mx-auto flex w-fit flex-wrap items-center justify-center gap-x-3 gap-y-1 text-[13px] ${className}`, children: content }));
25
+ }
26
+ export default BusinessDashFooterBanner;
27
+ /**
28
+ * Policy-aware badge for a Next.js Server Component.
29
+ *
30
+ * Reads the live attribution policy, then renders {@link BusinessDashFooterBanner}
31
+ * with the right `siteId` (for the marker) and an auto-resolved `hidden`: a paid
32
+ * plan that passed `optOut` gets a blank; a plan that requires the badge always
33
+ * shows it, `optOut` or not.
34
+ *
35
+ * ```tsx
36
+ * // app/layout.tsx (Server Component)
37
+ * export default async function Layout({ children }) {
38
+ * return (
39
+ * <>
40
+ * {children}
41
+ * <BusinessDashFooter client={biab.site(SITE_ID)} companyName="Acme Co" />
42
+ * </>
43
+ * )
44
+ * }
45
+ * ```
46
+ */
47
+ export async function BusinessDashFooter({ client, optOut = false, ...bannerProps }) {
48
+ const policy = await client.attribution.policy();
49
+ const hidden = optOut && !policy.required;
50
+ return (_jsx(BusinessDashFooterBanner, { ...bannerProps, hidden: hidden, siteId: policy.siteId }));
51
+ }
52
+ //# sourceMappingURL=react-attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-attribution.js","sourceRoot":"","sources":["../src/react-attribution.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAsD3D;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAe,EAAE,IAAa;IACzD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,MAAM;QACZ,CAAC,CAAC,yBAAyB,kBAAkB,CAAC,MAAM,CAAC,EAAE;QACvD,CAAC,CAAC,kBAAkB,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,EACxC,MAAM,EACN,WAAW,GAAG,cAAc,EAC5B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAC/B,SAAS,GAAG,OAAO,EACnB,IAAI,EACJ,MAAM,GAAG,KAAK,EACd,SAAS,GAAG,EAAE,GACiB;IAC/B,IAAI,MAAM,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAEhD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,CACf,8BACC,gBAAM,SAAS,EAAC,iCAAiC,aAChD,eAAM,SAAS,EAAC,WAAW,uBAAc,OAAE,IAAI,OAAG,WAAW,IACvD,EACP,eAAM,SAAS,EAAC,eAAe,uBAAgB,EAC/C,gBAAM,SAAS,EAAC,yDAAyD,2BAExE,0BACY,cAAc,EACzB,SAAS,EAAC,yFAAyF,EACnG,IAAI,EAAE,QAAQ,EACd,GAAG,EAAC,UAAU,EACd,MAAM,EAAC,QAAQ,YAIf,cACC,GAAG,EAAC,cAAc,EAClB,SAAS,EAAC,iBAAiB,EAC3B,GAAG,EAAE,kBAAkB,GACtB,GACC,IACE,IACL,CACH,CAAC;IAEF,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,CACN,8BAEC,cACC,SAAS,EAAE,2HAA2H,SAAS,EAAE,YAEhJ,OAAO,GACH,EAEN,cACC,SAAS,EAAE,uGAAuG,SAAS,EAAE,YAE5H,OAAO,GACH,IACJ,CACH,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,OAAO,CACN,cACC,SAAS,EAAE,wFAAwF,SAAS,EAAE,YAE7G,OAAO,GACH,CACN,CAAC;AACH,CAAC;AAED,eAAe,wBAAwB,CAAC;AAsBxC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACxC,MAAM,EACN,MAAM,GAAG,KAAK,EACd,GAAG,WAAW,EACW;IACzB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC1C,OAAO,CACN,KAAC,wBAAwB,OACpB,WAAW,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,GACpB,CACF,CAAC;AACH,CAAC"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * React hooks for the schema-driven marketing-page flow.
3
+ *
4
+ * The base SDK file (`react.tsx`) is already past the workspace's
5
+ * "stop and ask before growing" file-size threshold, so these new hooks
6
+ * live alongside it in their own module. Same import target for
7
+ * consumers either way — both files are re-exported from `react.tsx`
8
+ * via the SDK's `./react` entrypoint.
9
+ *
10
+ * Hooks here intentionally bypass `useEffect`-managed sessions (the
11
+ * approach the older iframe surfaces use) — marketing data is plain
12
+ * JSON-over-fetch with process-wide caching on the client. That keeps
13
+ * the SSR story simple: the same `client.site(siteId).marketing.*`
14
+ * methods consumed in `getServerSideProps` / RSC code paths are what
15
+ * these hooks call client-side.
16
+ */
17
+ import type { GetMarketingLocalesResponse, GetMarketingPageBundleResponse, GetPublishedMarketingSchemaResponse, SiteMarketingSectionEntry } from "./contracts.js";
18
+ type BundleState = {
19
+ status: "idle";
20
+ bundle: null;
21
+ error: null;
22
+ } | {
23
+ status: "loading";
24
+ bundle: null;
25
+ error: null;
26
+ } | {
27
+ status: "ready";
28
+ bundle: GetMarketingPageBundleResponse;
29
+ error: null;
30
+ } | {
31
+ status: "error";
32
+ bundle: null;
33
+ error: Error;
34
+ };
35
+ /**
36
+ * Live-site bundle reader. One call returns:
37
+ * - `sections`: `Record<sectionKey, {ok:true,data,source} | {ok:false,error}>`
38
+ * — a malformed section degrades to empty in the consumer's renderer
39
+ * instead of crashing the page.
40
+ * - `seo`: a fully-shaped SEO object with brand tokens already expanded.
41
+ * - `availableLocales` for the language switcher.
42
+ *
43
+ * The hook reads from the SDK's process-wide cache when present
44
+ * (warmed by `prefetchPageBundle()` or an earlier render on the same
45
+ * `(siteId, pageKey, locale)` key) and only hits the network on cache
46
+ * miss. `refresh()` does a `skipCache` round-trip — useful after a
47
+ * dashboard save that the SDK didn't initiate.
48
+ */
49
+ export declare function useMarketingPageBundle(options: {
50
+ apiKey: string;
51
+ baseUrl: string;
52
+ siteId: string;
53
+ pageKey?: string;
54
+ locale?: string;
55
+ enabled?: boolean;
56
+ }): BundleState & {
57
+ refresh: () => Promise<void>;
58
+ };
59
+ type SectionState<T> = {
60
+ status: "idle" | "loading";
61
+ data: null;
62
+ entry: null;
63
+ error: null;
64
+ } | {
65
+ status: "ready";
66
+ data: T | null;
67
+ entry: SiteMarketingSectionEntry | null;
68
+ error: null;
69
+ } | {
70
+ status: "error";
71
+ data: null;
72
+ entry: null;
73
+ error: Error;
74
+ };
75
+ /**
76
+ * Pull one section out of the bundle for `(pageKey, locale)`. Pass a
77
+ * `parse` function to validate the section data against the consumer's
78
+ * zod schema (this is what `defineSiteMarketingSchema(...).parseSection(...)`
79
+ * gives you).
80
+ *
81
+ * When the underlying section entry is `{ ok: false }`, `data` resolves
82
+ * to `null` so the consumer renderer can short-circuit to "render
83
+ * empty" without checking the entry shape.
84
+ */
85
+ export declare function useMarketingSection<T>(options: {
86
+ apiKey: string;
87
+ baseUrl: string;
88
+ siteId: string;
89
+ pageKey?: string;
90
+ locale?: string;
91
+ sectionKey: string;
92
+ parse?: (entry: SiteMarketingSectionEntry | null | undefined) => T | null;
93
+ enabled?: boolean;
94
+ }): SectionState<T>;
95
+ export declare function useMarketingPageSeo(options: {
96
+ apiKey: string;
97
+ baseUrl: string;
98
+ siteId: string;
99
+ pageKey?: string;
100
+ locale?: string;
101
+ }): {
102
+ readonly status: "error" | "idle" | "loading";
103
+ readonly seo: null;
104
+ } | {
105
+ status: "ready";
106
+ seo: {
107
+ seoTitle: string | null;
108
+ seoDescription: string | null;
109
+ canonicalUrl: string | null;
110
+ noIndex: boolean;
111
+ ogTitle: string | null;
112
+ ogDescription: string | null;
113
+ ogImageUrl: string | null;
114
+ twitterCard: "summary" | "summary_large_image" | "app" | "player";
115
+ keywords: string[];
116
+ jsonldNodes: unknown[];
117
+ hreflang: Record<string, string>;
118
+ };
119
+ };
120
+ type SchemaState = {
121
+ status: "idle" | "loading";
122
+ schema: null;
123
+ error: null;
124
+ } | {
125
+ status: "ready";
126
+ schema: GetPublishedMarketingSchemaResponse["schema"];
127
+ error: null;
128
+ } | {
129
+ status: "error";
130
+ schema: null;
131
+ error: Error;
132
+ };
133
+ /**
134
+ * Fetch the consumer's *published* schema once per process (cache
135
+ * scoped to `siteId`). Most consumers don't need this in the browser —
136
+ * the schema lives in their own bundle via `defineSiteMarketingSchema`
137
+ * — but it's the right primitive for "preview-as-other-tenant"
138
+ * tooling or for editors that introspect their own published artifact.
139
+ */
140
+ export declare function usePublishedMarketingSchema(options: {
141
+ apiKey: string;
142
+ baseUrl: string;
143
+ siteId: string;
144
+ enabled?: boolean;
145
+ }): SchemaState & {
146
+ refresh: () => Promise<void>;
147
+ };
148
+ type LocalesState = {
149
+ status: "idle" | "loading";
150
+ data: null;
151
+ error: null;
152
+ } | {
153
+ status: "ready";
154
+ data: GetMarketingLocalesResponse;
155
+ error: null;
156
+ } | {
157
+ status: "error";
158
+ data: null;
159
+ error: Error;
160
+ };
161
+ export declare function useMarketingLocales(options: {
162
+ apiKey: string;
163
+ baseUrl: string;
164
+ siteId: string;
165
+ }): LocalesState;
166
+ /**
167
+ * Stable `prefetch({ pageKey, locale })` you can wire to
168
+ * `<Link onPointerEnter>` / `onFocus` so the next page is already
169
+ * loaded by the time the visitor clicks. Idempotent — repeat calls hit
170
+ * the cache.
171
+ */
172
+ export declare function useMarketingBundlePreloader(options: {
173
+ apiKey: string;
174
+ baseUrl: string;
175
+ siteId: string;
176
+ }): (input?: {
177
+ pageKey?: string;
178
+ locale?: string;
179
+ }) => Promise<void>;
180
+ export {};
181
+ //# sourceMappingURL=react-marketing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-marketing.d.ts","sourceRoot":"","sources":["../src/react-marketing.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * React hooks for the schema-driven marketing-page flow.
3
+ *
4
+ * The base SDK file (`react.tsx`) is already past the workspace's
5
+ * "stop and ask before growing" file-size threshold, so these new hooks
6
+ * live alongside it in their own module. Same import target for
7
+ * consumers either way — both files are re-exported from `react.tsx`
8
+ * via the SDK's `./react` entrypoint.
9
+ *
10
+ * Hooks here intentionally bypass `useEffect`-managed sessions (the
11
+ * approach the older iframe surfaces use) — marketing data is plain
12
+ * JSON-over-fetch with process-wide caching on the client. That keeps
13
+ * the SSR story simple: the same `client.site(siteId).marketing.*`
14
+ * methods consumed in `getServerSideProps` / RSC code paths are what
15
+ * these hooks call client-side.
16
+ */
17
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
18
+ import { BiabDevClient } from "./client.js";
19
+ /**
20
+ * Live-site bundle reader. One call returns:
21
+ * - `sections`: `Record<sectionKey, {ok:true,data,source} | {ok:false,error}>`
22
+ * — a malformed section degrades to empty in the consumer's renderer
23
+ * instead of crashing the page.
24
+ * - `seo`: a fully-shaped SEO object with brand tokens already expanded.
25
+ * - `availableLocales` for the language switcher.
26
+ *
27
+ * The hook reads from the SDK's process-wide cache when present
28
+ * (warmed by `prefetchPageBundle()` or an earlier render on the same
29
+ * `(siteId, pageKey, locale)` key) and only hits the network on cache
30
+ * miss. `refresh()` does a `skipCache` round-trip — useful after a
31
+ * dashboard save that the SDK didn't initiate.
32
+ */
33
+ export function useMarketingPageBundle(options) {
34
+ const { apiKey, baseUrl, siteId, pageKey = "home", locale = "en", enabled = true, } = options;
35
+ const client = useMemo(() => new BiabDevClient({ apiKey, baseUrl }), [apiKey, baseUrl]);
36
+ const initial = client
37
+ .site(siteId)
38
+ .marketing.getPageBundleCached({ pageKey, locale });
39
+ const [state, setState] = useState(initial
40
+ ? { status: "ready", bundle: initial, error: null }
41
+ : { status: "idle", bundle: null, error: null });
42
+ const fetchOnce = useCallback(async (skipCache = false) => {
43
+ if (!enabled)
44
+ return;
45
+ setState({ status: "loading", bundle: null, error: null });
46
+ try {
47
+ const response = await client
48
+ .site(siteId)
49
+ .marketing.getPageBundle({ pageKey, locale }, { skipCache });
50
+ setState({ status: "ready", bundle: response, error: null });
51
+ }
52
+ catch (err) {
53
+ setState({
54
+ status: "error",
55
+ bundle: null,
56
+ error: err instanceof Error ? err : new Error("Bundle load failed"),
57
+ });
58
+ }
59
+ }, [client, siteId, pageKey, locale, enabled]);
60
+ useEffect(() => {
61
+ if (!enabled)
62
+ return;
63
+ const hit = client
64
+ .site(siteId)
65
+ .marketing.getPageBundleCached({ pageKey, locale });
66
+ if (hit) {
67
+ setState({ status: "ready", bundle: hit, error: null });
68
+ return;
69
+ }
70
+ void fetchOnce(false);
71
+ }, [client, siteId, pageKey, locale, enabled, fetchOnce]);
72
+ return { ...state, refresh: () => fetchOnce(true) };
73
+ }
74
+ /**
75
+ * Pull one section out of the bundle for `(pageKey, locale)`. Pass a
76
+ * `parse` function to validate the section data against the consumer's
77
+ * zod schema (this is what `defineSiteMarketingSchema(...).parseSection(...)`
78
+ * gives you).
79
+ *
80
+ * When the underlying section entry is `{ ok: false }`, `data` resolves
81
+ * to `null` so the consumer renderer can short-circuit to "render
82
+ * empty" without checking the entry shape.
83
+ */
84
+ export function useMarketingSection(options) {
85
+ const { apiKey, baseUrl, siteId, sectionKey, parse } = options;
86
+ // Build the inner bundle-hook options conditionally so the optional
87
+ // keys aren't present when the consumer didn't pass them. tsc's
88
+ // `exactOptionalPropertyTypes` flag distinguishes `prop: undefined`
89
+ // from "prop absent" and the latter is what the bundle hook expects.
90
+ const bundleOptions = {
91
+ apiKey,
92
+ baseUrl,
93
+ siteId,
94
+ };
95
+ if (options.pageKey !== undefined)
96
+ bundleOptions.pageKey = options.pageKey;
97
+ if (options.locale !== undefined)
98
+ bundleOptions.locale = options.locale;
99
+ if (options.enabled !== undefined)
100
+ bundleOptions.enabled = options.enabled;
101
+ const bundle = useMarketingPageBundle(bundleOptions);
102
+ return useMemo(() => {
103
+ if (bundle.status === "loading" || bundle.status === "idle") {
104
+ return { status: bundle.status, data: null, entry: null, error: null };
105
+ }
106
+ if (bundle.status === "error") {
107
+ return { status: "error", data: null, entry: null, error: bundle.error };
108
+ }
109
+ const entry = bundle.bundle.sections[sectionKey] ?? null;
110
+ const data = parse
111
+ ? parse(entry)
112
+ : entry?.ok
113
+ ? entry.data
114
+ : null;
115
+ return { status: "ready", data, entry, error: null };
116
+ }, [bundle, sectionKey, parse]);
117
+ }
118
+ // ── SEO sub-hook ────────────────────────────────────────────────────
119
+ export function useMarketingPageSeo(options) {
120
+ const bundle = useMarketingPageBundle(options);
121
+ return useMemo(() => {
122
+ if (bundle.status !== "ready") {
123
+ return { status: bundle.status, seo: null };
124
+ }
125
+ return { status: "ready", seo: bundle.bundle.seo };
126
+ }, [bundle]);
127
+ }
128
+ /**
129
+ * Fetch the consumer's *published* schema once per process (cache
130
+ * scoped to `siteId`). Most consumers don't need this in the browser —
131
+ * the schema lives in their own bundle via `defineSiteMarketingSchema`
132
+ * — but it's the right primitive for "preview-as-other-tenant"
133
+ * tooling or for editors that introspect their own published artifact.
134
+ */
135
+ export function usePublishedMarketingSchema(options) {
136
+ const { apiKey, baseUrl, siteId, enabled = true } = options;
137
+ const client = useMemo(() => new BiabDevClient({ apiKey, baseUrl }), [apiKey, baseUrl]);
138
+ const [state, setState] = useState({
139
+ status: "idle",
140
+ schema: null,
141
+ error: null,
142
+ });
143
+ const fetchOnce = useCallback(async (skipCache = false) => {
144
+ if (!enabled)
145
+ return;
146
+ setState({ status: "loading", schema: null, error: null });
147
+ try {
148
+ const response = await client
149
+ .site(siteId)
150
+ .marketing.getPublishedSchema({ skipCache });
151
+ setState({ status: "ready", schema: response.schema, error: null });
152
+ }
153
+ catch (err) {
154
+ setState({
155
+ status: "error",
156
+ schema: null,
157
+ error: err instanceof Error ? err : new Error("Schema load failed"),
158
+ });
159
+ }
160
+ }, [client, siteId, enabled]);
161
+ useEffect(() => {
162
+ void fetchOnce(false);
163
+ }, [fetchOnce]);
164
+ return { ...state, refresh: () => fetchOnce(true) };
165
+ }
166
+ export function useMarketingLocales(options) {
167
+ const { apiKey, baseUrl, siteId } = options;
168
+ const client = useMemo(() => new BiabDevClient({ apiKey, baseUrl }), [apiKey, baseUrl]);
169
+ const [state, setState] = useState({
170
+ status: "idle",
171
+ data: null,
172
+ error: null,
173
+ });
174
+ // Avoid double-fires in strict mode by remembering the last
175
+ // `(siteId, apiKey, baseUrl)` we resolved against.
176
+ const inflight = useRef("");
177
+ useEffect(() => {
178
+ const fp = `${apiKey}|${baseUrl}|${siteId}`;
179
+ if (inflight.current === fp)
180
+ return;
181
+ inflight.current = fp;
182
+ setState({ status: "loading", data: null, error: null });
183
+ client
184
+ .site(siteId)
185
+ .marketing.getLocales()
186
+ .then((data) => setState({ status: "ready", data, error: null }))
187
+ .catch((err) => setState({
188
+ status: "error",
189
+ data: null,
190
+ error: err instanceof Error ? err : new Error("Locales load failed"),
191
+ }));
192
+ }, [client, siteId, apiKey, baseUrl]);
193
+ return state;
194
+ }
195
+ // ── Bundle preloader ────────────────────────────────────────────────
196
+ /**
197
+ * Stable `prefetch({ pageKey, locale })` you can wire to
198
+ * `<Link onPointerEnter>` / `onFocus` so the next page is already
199
+ * loaded by the time the visitor clicks. Idempotent — repeat calls hit
200
+ * the cache.
201
+ */
202
+ export function useMarketingBundlePreloader(options) {
203
+ const { apiKey, baseUrl, siteId } = options;
204
+ const client = useMemo(() => new BiabDevClient({ apiKey, baseUrl }), [apiKey, baseUrl]);
205
+ return useCallback(async (input) => {
206
+ try {
207
+ await client.site(siteId).marketing.prefetchPageBundle(input);
208
+ }
209
+ catch {
210
+ // preload failures are non-fatal — the actual page render will
211
+ // surface the error via the bundle hook.
212
+ }
213
+ }, [client, siteId]);
214
+ }
215
+ //# sourceMappingURL=react-marketing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-marketing.js","sourceRoot":"","sources":["../src/react-marketing.tsx"],"names":[],"mappings":"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"}