@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.
- package/LICENSE +21 -0
- package/README.md +899 -0
- package/dist/adapters-revalidate.d.ts +44 -0
- package/dist/adapters-revalidate.d.ts.map +1 -0
- package/dist/adapters-revalidate.js +68 -0
- package/dist/adapters-revalidate.js.map +1 -0
- package/dist/alpha.d.ts +21 -0
- package/dist/alpha.d.ts.map +1 -0
- package/dist/alpha.js +21 -0
- package/dist/alpha.js.map +1 -0
- package/dist/analytics-core.d.ts +34 -0
- package/dist/analytics-core.d.ts.map +1 -0
- package/dist/analytics-core.js +138 -0
- package/dist/analytics-core.js.map +1 -0
- package/dist/analytics-server.d.ts +54 -0
- package/dist/analytics-server.d.ts.map +1 -0
- package/dist/analytics-server.js +78 -0
- package/dist/analytics-server.js.map +1 -0
- package/dist/attribution-logo.d.ts +2 -0
- package/dist/attribution-logo.d.ts.map +1 -0
- package/dist/attribution-logo.js +5 -0
- package/dist/attribution-logo.js.map +1 -0
- package/dist/auth-handler.d.ts +92 -0
- package/dist/auth-handler.d.ts.map +1 -0
- package/dist/auth-handler.js +277 -0
- package/dist/auth-handler.js.map +1 -0
- package/dist/biab-forms.css +484 -0
- package/dist/cli.d.ts +46 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1824 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +1681 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2845 -0
- package/dist/client.js.map +1 -0
- package/dist/collections.d.ts +13 -0
- package/dist/collections.d.ts.map +1 -0
- package/dist/collections.js +13 -0
- package/dist/collections.js.map +1 -0
- package/dist/contracts.d.ts +14609 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +2428 -0
- package/dist/contracts.js.map +1 -0
- package/dist/data-model-schema.d.ts +962 -0
- package/dist/data-model-schema.d.ts.map +1 -0
- package/dist/data-model-schema.js +2295 -0
- package/dist/data-model-schema.js.map +1 -0
- package/dist/distribution.d.ts +38 -0
- package/dist/distribution.d.ts.map +1 -0
- package/dist/distribution.js +61 -0
- package/dist/distribution.js.map +1 -0
- package/dist/element.d.ts +121 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/element.js +276 -0
- package/dist/element.js.map +1 -0
- package/dist/enums.d.ts +25 -0
- package/dist/enums.d.ts.map +1 -0
- package/dist/enums.js +38 -0
- package/dist/enums.js.map +1 -0
- package/dist/errors.d.ts +195 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +188 -0
- package/dist/errors.js.map +1 -0
- package/dist/forms-core/autocomplete.d.ts +37 -0
- package/dist/forms-core/autocomplete.d.ts.map +1 -0
- package/dist/forms-core/autocomplete.js +82 -0
- package/dist/forms-core/autocomplete.js.map +1 -0
- package/dist/forms-core/business-function.d.ts +61 -0
- package/dist/forms-core/business-function.d.ts.map +1 -0
- package/dist/forms-core/business-function.js +149 -0
- package/dist/forms-core/business-function.js.map +1 -0
- package/dist/forms-core/calculation.d.ts +72 -0
- package/dist/forms-core/calculation.d.ts.map +1 -0
- package/dist/forms-core/calculation.js +103 -0
- package/dist/forms-core/calculation.js.map +1 -0
- package/dist/forms-core/controller.d.ts +249 -0
- package/dist/forms-core/controller.d.ts.map +1 -0
- package/dist/forms-core/controller.js +590 -0
- package/dist/forms-core/controller.js.map +1 -0
- package/dist/forms-core/elements.d.ts +44 -0
- package/dist/forms-core/elements.d.ts.map +1 -0
- package/dist/forms-core/elements.js +68 -0
- package/dist/forms-core/elements.js.map +1 -0
- package/dist/forms-core/email-domains.d.ts +10 -0
- package/dist/forms-core/email-domains.d.ts.map +1 -0
- package/dist/forms-core/email-domains.js +69 -0
- package/dist/forms-core/email-domains.js.map +1 -0
- package/dist/forms-core/file-rules.d.ts +51 -0
- package/dist/forms-core/file-rules.d.ts.map +1 -0
- package/dist/forms-core/file-rules.js +105 -0
- package/dist/forms-core/file-rules.js.map +1 -0
- package/dist/forms-core/formula.d.ts +114 -0
- package/dist/forms-core/formula.d.ts.map +1 -0
- package/dist/forms-core/formula.js +1170 -0
- package/dist/forms-core/formula.js.map +1 -0
- package/dist/forms-core/index.d.ts +24 -0
- package/dist/forms-core/index.d.ts.map +1 -0
- package/dist/forms-core/index.js +28 -0
- package/dist/forms-core/index.js.map +1 -0
- package/dist/forms-core/units.d.ts +49 -0
- package/dist/forms-core/units.d.ts.map +1 -0
- package/dist/forms-core/units.js +255 -0
- package/dist/forms-core/units.js.map +1 -0
- package/dist/forms-core/us-states.d.ts +14 -0
- package/dist/forms-core/us-states.d.ts.map +1 -0
- package/dist/forms-core/us-states.js +66 -0
- package/dist/forms-core/us-states.js.map +1 -0
- package/dist/forms-core/validation.d.ts +266 -0
- package/dist/forms-core/validation.d.ts.map +1 -0
- package/dist/forms-core/validation.js +850 -0
- package/dist/forms-core/validation.js.map +1 -0
- package/dist/forms.d.ts +19 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +29 -0
- package/dist/forms.js.map +1 -0
- package/dist/gallery-types.d.ts +32 -0
- package/dist/gallery-types.d.ts.map +1 -0
- package/dist/gallery-types.js +2 -0
- package/dist/gallery-types.js.map +1 -0
- package/dist/graphql.d.ts +97 -0
- package/dist/graphql.d.ts.map +1 -0
- package/dist/graphql.js +212 -0
- package/dist/graphql.js.map +1 -0
- package/dist/index.cjs +19448 -0
- package/dist/index.d.cts +19 -0
- package/dist/index.d.mts +19 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/marketing-schema.d.ts +216 -0
- package/dist/marketing-schema.d.ts.map +1 -0
- package/dist/marketing-schema.js +200 -0
- package/dist/marketing-schema.js.map +1 -0
- package/dist/mcp.d.ts +42 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +87 -0
- package/dist/mcp.js.map +1 -0
- package/dist/native.d.ts +45 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +43 -0
- package/dist/native.js.map +1 -0
- package/dist/next-revalidate.d.ts +43 -0
- package/dist/next-revalidate.d.ts.map +1 -0
- package/dist/next-revalidate.js +84 -0
- package/dist/next-revalidate.js.map +1 -0
- package/dist/parallel-pages.d.ts +102 -0
- package/dist/parallel-pages.d.ts.map +1 -0
- package/dist/parallel-pages.js +108 -0
- package/dist/parallel-pages.js.map +1 -0
- package/dist/payment-icons.d.ts +66 -0
- package/dist/payment-icons.d.ts.map +1 -0
- package/dist/payment-icons.js +160 -0
- package/dist/payment-icons.js.map +1 -0
- package/dist/proxy.d.ts +67 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +97 -0
- package/dist/proxy.js.map +1 -0
- package/dist/react-analytics.d.ts +39 -0
- package/dist/react-analytics.d.ts.map +1 -0
- package/dist/react-analytics.js +59 -0
- package/dist/react-analytics.js.map +1 -0
- package/dist/react-attribution.d.ts +99 -0
- package/dist/react-attribution.d.ts.map +1 -0
- package/dist/react-attribution.js +52 -0
- package/dist/react-attribution.js.map +1 -0
- package/dist/react-marketing.d.ts +181 -0
- package/dist/react-marketing.d.ts.map +1 -0
- package/dist/react-marketing.js +215 -0
- package/dist/react-marketing.js.map +1 -0
- package/dist/react.d.ts +727 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +2418 -0
- package/dist/react.js.map +1 -0
- package/dist/reserved-paths.d.ts +24 -0
- package/dist/reserved-paths.d.ts.map +1 -0
- package/dist/reserved-paths.js +60 -0
- package/dist/reserved-paths.js.map +1 -0
- package/dist/revalidate-verify.d.ts +30 -0
- package/dist/revalidate-verify.d.ts.map +1 -0
- package/dist/revalidate-verify.js +74 -0
- package/dist/revalidate-verify.js.map +1 -0
- package/dist/sdk.d.ts +678 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +801 -0
- package/dist/sdk.js.map +1 -0
- package/dist/seo.d.ts +218 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +309 -0
- package/dist/seo.js.map +1 -0
- package/dist/socials.d.ts +47 -0
- package/dist/socials.d.ts.map +1 -0
- package/dist/socials.js +172 -0
- package/dist/socials.js.map +1 -0
- package/dist/static.d.ts +14 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/static.js +14 -0
- package/dist/static.js.map +1 -0
- package/dist/url-pattern.d.ts +47 -0
- package/dist/url-pattern.d.ts.map +1 -0
- package/dist/url-pattern.js +124 -0
- package/dist/url-pattern.js.map +1 -0
- package/dist/vanilla.d.ts +77 -0
- package/dist/vanilla.d.ts.map +1 -0
- package/dist/vanilla.js +903 -0
- package/dist/vanilla.js.map +1 -0
- package/openapi.json +13779 -0
- package/package.json +204 -0
- package/src/adapters-revalidate.ts +88 -0
- package/src/alpha.ts +89 -0
- package/src/analytics-core.ts +175 -0
- package/src/analytics-server.ts +99 -0
- package/src/angular/biab-form.component.ts +1443 -0
- package/src/angular/index.ts +26 -0
- package/src/attribution-logo.ts +5 -0
- package/src/auth-handler.ts +352 -0
- package/src/cli.ts +2517 -0
- package/src/client.ts +3578 -0
- package/src/collections.ts +101 -0
- package/src/contracts.ts +3390 -0
- package/src/data-model-schema.ts +4042 -0
- package/src/distribution.ts +73 -0
- package/src/element.ts +321 -0
- package/src/enums.ts +65 -0
- package/src/errors.ts +338 -0
- package/src/forms-core/autocomplete.ts +97 -0
- package/src/forms-core/business-function.ts +209 -0
- package/src/forms-core/calculation.ts +167 -0
- package/src/forms-core/controller.ts +922 -0
- package/src/forms-core/elements.ts +86 -0
- package/src/forms-core/email-domains.ts +68 -0
- package/src/forms-core/file-rules.ts +123 -0
- package/src/forms-core/formula.ts +1339 -0
- package/src/forms-core/index.ts +122 -0
- package/src/forms-core/units.ts +308 -0
- package/src/forms-core/us-states.ts +68 -0
- package/src/forms-core/validation.ts +1037 -0
- package/src/forms.ts +63 -0
- package/src/gallery-types.ts +31 -0
- package/src/graphql.ts +295 -0
- package/src/index.ts +505 -0
- package/src/marketing-schema.ts +395 -0
- package/src/mcp.ts +108 -0
- package/src/native.ts +73 -0
- package/src/next-revalidate.ts +124 -0
- package/src/parallel-pages.ts +192 -0
- package/src/payment-icons.ts +205 -0
- package/src/proxy.ts +173 -0
- package/src/qwik.tsx +1234 -0
- package/src/react-analytics.tsx +76 -0
- package/src/react-attribution.tsx +192 -0
- package/src/react-marketing.tsx +338 -0
- package/src/react.tsx +5495 -0
- package/src/reserved-paths.ts +65 -0
- package/src/revalidate-verify.ts +98 -0
- package/src/sdk.ts +1671 -0
- package/src/seo.ts +488 -0
- package/src/socials.ts +230 -0
- package/src/solid.tsx +1466 -0
- package/src/static.ts +21 -0
- package/src/styles/biab-forms.css +484 -0
- package/src/svelte/BiabForm.svelte +1069 -0
- package/src/svelte/context.ts +57 -0
- package/src/svelte/index.ts +79 -0
- package/src/url-pattern.ts +153 -0
- package/src/vanilla.ts +1290 -0
- package/src/vue/BiabForm.vue +1538 -0
- 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":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAgB5C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAOtC;IACA,MAAM,EACL,MAAM,EACN,OAAO,EACP,MAAM,EACN,OAAO,GAAG,MAAM,EAChB,MAAM,GAAG,IAAI,EACb,OAAO,GAAG,IAAI,GACd,GAAG,OAAO,CAAC;IACZ,MAAM,MAAM,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAC5C,CAAC,MAAM,EAAE,OAAO,CAAC,CACjB,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM;SACpB,IAAI,CAAC,MAAM,CAAC;SACZ,SAAS,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CACjC,OAAO;QACN,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;QACnD,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAChD,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAC5B,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE;QAC3B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,MAAM;iBAC3B,IAAI,CAAC,MAAM,CAAC;iBACZ,SAAS,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9D,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC;gBACR,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC;aACnE,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,EACD,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAC1C,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,GAAG,GAAG,MAAM;aAChB,IAAI,CAAC,MAAM,CAAC;aACZ,SAAS,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,IAAI,GAAG,EAAE,CAAC;YACT,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,OAAO;QACR,CAAC;QACD,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAE1D,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC;AAcD;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAI,OAStC;IACA,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAE/D,oEAAoE;IACpE,gEAAgE;IAChE,oEAAoE;IACpE,qEAAqE;IACrE,MAAM,aAAa,GAAiD;QACnE,MAAM;QACN,OAAO;QACP,MAAM;KACN,CAAC;IACF,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,aAAa,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACxE,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,aAAa,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAE3E,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAErD,OAAO,OAAO,CAAkB,GAAG,EAAE;QACpC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACxE,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1E,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;QACzD,MAAM,IAAI,GAAa,KAAK;YAC3B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YACd,CAAC,CAAC,KAAK,EAAE,EAAE;gBACV,CAAC,CAAE,KAAK,CAAC,IAAU;gBACnB,CAAC,CAAC,IAAI,CAAC;QACT,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,mBAAmB,CAAC,OAMnC;IACA,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,OAAO,CAAC,GAAG,EAAE;QACnB,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAW,CAAC;QACtD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,OAAgB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IAC7D,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACd,CAAC;AAaD;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAK3C;IACA,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAC5C,CAAC,MAAM,EAAE,OAAO,CAAC,CACjB,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc;QAC/C,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,WAAW,CAC5B,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE;QAC3B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,MAAM;iBAC3B,IAAI,CAAC,MAAM,CAAC;iBACZ,SAAS,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9C,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC;gBACR,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC;aACnE,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,EACD,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CACzB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACd,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC;AASD,MAAM,UAAU,mBAAmB,CAAC,OAInC;IACA,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAC5C,CAAC,MAAM,EAAE,OAAO,CAAC,CACjB,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe;QAChD,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,4DAA4D;IAC5D,mDAAmD;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAE5B,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,EAAE,GAAG,GAAG,MAAM,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QAC5C,IAAI,QAAQ,CAAC,OAAO,KAAK,EAAE;YAAE,OAAO;QACpC,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM;aACJ,IAAI,CAAC,MAAM,CAAC;aACZ,SAAS,CAAC,UAAU,EAAE;aACtB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aAChE,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACd,QAAQ,CAAC;YACR,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC;SACpE,CAAC,CACF,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtC,OAAO,KAAK,CAAC;AACd,CAAC;AAED,uEAAuE;AAEvE;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAI3C;IACA,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAC5C,CAAC,MAAM,EAAE,OAAO,CAAC,CACjB,CAAC;IACF,OAAO,WAAW,CACjB,KAAK,EAAE,KAA6C,EAAE,EAAE;QACvD,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACR,+DAA+D;YAC/D,yCAAyC;QAC1C,CAAC;IACF,CAAC,EACD,CAAC,MAAM,EAAE,MAAM,CAAC,CAChB,CAAC;AACH,CAAC"}
|