{"_id":"@businessdash/sdk","_rev":"5-6579d5f463d7a33da94ae3be96561eeb","name":"@businessdash/sdk","dist-tags":{"latest":"0.9.90"},"versions":{"0.9.60":{"name":"@businessdash/sdk","version":"0.9.60","keywords":["businessdash","biab","business-in-a-box","alpha"],"license":"MIT","_id":"@businessdash/sdk@0.9.60","maintainers":[{"name":"michaelmartell","email":"240designworks@gmail.com"}],"homepage":"https://businessdash.us","bugs":{"url":"https://github.com/Gold240sx/business-in-a-box/issues"},"bin":{"biab-dev":"dist/cli.js","businessdash":"dist/cli.js"},"dist":{"shasum":"9fd145f94c8cafb09089b20fd8fbb97e586e7c3e","tarball":"https://registry.npmjs.org/@businessdash/sdk/-/sdk-0.9.60.tgz","fileCount":268,"integrity":"sha512-7sBf6YYPaTDw56qnddkKYNOAnEzICuM9JPjyilxT2zz08OH73n0JeMOLNVE5UUEIwmajcye2iv/NSAt8CpZSig==","signatures":[{"sig":"MEYCIQCd/9glATPKGmKH5Wm+Iv2cdTdpruZDaFYyMC2GZdDnaQIhAPW6ft33ARAHBavo5S28x8+f3dgbp9WJZV44dblomKjs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5722653},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./mcp":{"types":"./dist/mcp.d.ts","import":"./dist/mcp.js"},"./seo":{"types":"./dist/seo.d.ts","import":"./dist/seo.js"},"./vue":{"types":"./src/vue/index.ts","import":"./src/vue/index.ts"},"./qwik":{"types":"./src/qwik.tsx","import":"./src/qwik.tsx"},"./alpha":{"types":"./dist/alpha.d.ts","import":"./dist/alpha.js"},"./enums":{"types":"./dist/enums.d.ts","import":"./dist/enums.js"},"./forms":{"types":"./dist/forms.d.ts","import":"./dist/forms.js"},"./proxy":{"types":"./dist/proxy.d.ts","import":"./dist/proxy.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./solid":{"solid":"./src/solid.tsx","types":"./src/solid.tsx","import":"./src/solid.tsx"},"./native":{"types":"./dist/native.d.ts","import":"./dist/native.js"},"./static":{"types":"./dist/static.d.ts","import":"./dist/static.js"},"./svelte":{"types":"./src/svelte/index.ts","import":"./src/svelte/index.ts","svelte":"./src/svelte/index.ts"},"./angular":{"types":"./src/angular/index.ts","import":"./src/angular/index.ts"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js"},"./graphql":{"types":"./dist/graphql.d.ts","import":"./dist/graphql.js"},"./vanilla":{"types":"./dist/vanilla.d.ts","import":"./dist/vanilla.js"},"./contracts":{"types":"./dist/contracts.d.ts","import":"./dist/contracts.js"},"./collections":{"types":"./dist/collections.d.ts","import":"./dist/collections.js"},"./distribution":{"types":"./dist/distribution.d.ts","import":"./dist/distribution.js"},"./analytics-core":{"types":"./dist/analytics-core.d.ts","import":"./dist/analytics-core.js"},"./biab-forms.css":"./dist/biab-forms.css","./next/revalidate":{"types":"./dist/next-revalidate.d.ts","import":"./dist/next-revalidate.js"},"./react-analytics":{"types":"./dist/react-analytics.d.ts","import":"./dist/react-analytics.js"},"./analytics-server":{"types":"./dist/analytics-server.d.ts","import":"./dist/analytics-server.js"},"./marketing-schema":{"types":"./dist/marketing-schema.d.ts","import":"./dist/marketing-schema.js"},"./data-model-schema":{"types":"./dist/data-model-schema.d.ts","import":"./dist/data-model-schema.js"},"./react-attribution":{"types":"./dist/react-attribution.d.ts","import":"./dist/react-attribution.js"},"./adapters/revalidate":{"types":"./dist/adapters-revalidate.d.ts","import":"./dist/adapters-revalidate.js"}},"gitHead":"b175c98d12131bab30e3d08c2a973c742a9ae59b","scripts":{"lint":"biome check .","test":"tsx --test test/*.test.ts test/*.test.tsx","build":"npm run clean && tsc -p tsconfig.build.json && node scripts/build-cjs.js && node -e \"require('node:fs').copyFileSync('src/styles/biab-forms.css','dist/biab-forms.css')\"","clean":"node -e \"const fs=require('node:fs');fs.rmSync('dist',{recursive:true,force:true})\"","openapi":"tsx scripts/openapi.ts","lint:fix":"biome check --write .","postbuild":"node scripts/publish-types.js","typecheck":"tsc -p tsconfig.json --noEmit","test:types":"tsc -p tsconfig.type-tests.json --noEmit","openapi:check":"tsx scripts/openapi.ts --check","prepublishOnly":"npm run build"},"_npmUser":{"name":"michaelmartell","email":"240designworks@gmail.com"},"repository":{"url":"git+https://github.com/Gold240sx/business-in-a-box.git","type":"git","directory":"biab-dev"},"_npmVersion":"11.12.1","description":"BusinessDash developer SDK — the data layer that lets you build customer-facing surfaces on your own domain while BusinessDash handles the operations stack behind the scenes. 0.9.x ships a comprehensive programmatic surface: storefront (products, categori","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.25.76","zod-to-json-schema":"^3.25.2","@js-temporal/polyfill":"^0.5.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","react":"^19.2.7","esbuild":"^0.28.1","typescript":"^5.9.3","@types/node":"^20.19.43","@types/react":"^19.2.17","@biomejs/biome":"^2.5.1"},"peerDependencies":{"react":">=18.0.0","react-dom":">=18.0.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.9.60_1786620090361_0.068671961531233","host":"s3://npm-registry-packages-npm-production"}},"0.9.70":{"name":"@businessdash/sdk","version":"0.9.70","keywords":["businessdash","biab","business-in-a-box","alpha"],"license":"MIT","_id":"@businessdash/sdk@0.9.70","maintainers":[{"name":"michaelmartell","email":"240designworks@gmail.com"}],"homepage":"https://businessdash.us","bugs":{"url":"https://github.com/businessdash/platform/issues"},"bin":{"biab-dev":"dist/cli.js","businessdash":"dist/cli.js"},"dist":{"shasum":"9ab9e16df062dbad892640834854837cf1b49340","tarball":"https://registry.npmjs.org/@businessdash/sdk/-/sdk-0.9.70.tgz","fileCount":455,"integrity":"sha512-IeMQnGCruD4PypWJog5LvnSdDLgZ7hohXfJNP9rHOp6rW29xf8jtZuUrr2Lebl75+dmsv+j6CgXsfCbPrQG2pA==","signatures":[{"sig":"MEQCIHk7BnQCz0QWLsMS1jhboF0yKXKP1kVLRrcPs9jjnlypAiB5BwImM5G7XIfcpwBcgSCS1F711q65vfGrebho9In78g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7302831},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./mcp":{"types":"./dist/mcp.d.ts","import":"./dist/mcp.js"},"./seo":{"types":"./dist/seo.d.ts","import":"./dist/seo.js"},"./vue":{"types":"./src/vue/index.ts","import":"./src/vue/index.ts"},"./blog":{"types":"./dist/blog.d.ts","import":"./dist/blog.js"},"./chat":{"types":"./dist/chat.d.ts","import":"./dist/chat.js"},"./qwik":{"types":"./src/qwik.tsx","import":"./src/qwik.tsx"},"./seed":{"types":"./dist/seed.d.ts","import":"./dist/seed.js"},"./alpha":{"types":"./dist/alpha.d.ts","import":"./dist/alpha.js"},"./enums":{"types":"./dist/enums.d.ts","import":"./dist/enums.js"},"./forms":{"types":"./dist/forms.d.ts","import":"./dist/forms.js"},"./legal":{"types":"./dist/legal-core/index.d.ts","import":"./dist/legal-core/index.js","require":"./dist/legal-core/index.cjs"},"./proxy":{"types":"./dist/proxy.d.ts","import":"./dist/proxy.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./solid":{"solid":"./src/solid.tsx","types":"./src/solid.tsx","import":"./src/solid.tsx"},"./store":{"types":"./dist/store.d.ts","import":"./dist/store.js"},"./native":{"types":"./dist/native.d.ts","import":"./dist/native.js"},"./portal":{"types":"./dist/portal.d.ts","import":"./dist/portal.js"},"./social":{"types":"./dist/social.d.ts","import":"./dist/social.js"},"./static":{"types":"./dist/static.d.ts","import":"./dist/static.js"},"./svelte":{"types":"./src/svelte/index.ts","import":"./src/svelte/index.ts","svelte":"./src/svelte/index.ts"},"./verify":{"types":"./dist/verify.d.ts","import":"./dist/verify.js"},"./account":{"types":"./dist/account.d.ts","import":"./dist/account.js"},"./angular":{"types":"./src/angular/index.ts","import":"./src/angular/index.ts"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js"},"./graphql":{"types":"./dist/graphql.d.ts","import":"./dist/graphql.js"},"./model3d":{"types":"./dist/model3d-core/index.d.ts","import":"./dist/model3d-core/index.js","require":"./dist/model3d-core/index.cjs"},"./sitemap":{"types":"./dist/sitemap-core/index.d.ts","import":"./dist/sitemap-core/index.js","require":"./dist/sitemap-core/index.cjs"},"./vanilla":{"types":"./dist/vanilla.d.ts","import":"./dist/vanilla.js"},"./checkout":{"types":"./dist/checkout.d.ts","import":"./dist/checkout.js"},"./seo-core":{"types":"./dist/seo-core/index.d.ts","import":"./dist/seo-core/index.js","require":"./dist/seo-core/index.cjs"},"./contracts":{"types":"./dist/contracts.d.ts","import":"./dist/contracts.js"},"./marketing":{"types":"./dist/marketing.d.ts","import":"./dist/marketing.js"},"./push-core":{"types":"./dist/push-core/index.d.ts","import":"./dist/push-core/index.js","require":"./dist/push-core/index.cjs"},"./biab-sw.js":"./assets/biab-sw.js","./collections":{"types":"./dist/collections.d.ts","import":"./dist/collections.js"},"./distribution":{"types":"./dist/distribution.d.ts","import":"./dist/distribution.js"},"./mcp-adapters":{"types":"./dist/mcp-adapters.d.ts","import":"./dist/mcp-adapters.js"},"./notifications":{"types":"./dist/notifications-core/index.d.ts","import":"./dist/notifications-core/index.js","require":"./dist/notifications-core/index.cjs"},"./analytics-core":{"types":"./dist/analytics-core.d.ts","import":"./dist/analytics-core.js"},"./biab-forms.css":"./dist/biab-forms.css","./next/revalidate":{"types":"./dist/next-revalidate.d.ts","import":"./dist/next-revalidate.js"},"./react-analytics":{"types":"./dist/react-analytics.d.ts","import":"./dist/react-analytics.js"},"./analytics-server":{"types":"./dist/analytics-server.d.ts","import":"./dist/analytics-server.js"},"./marketing-schema":{"types":"./dist/marketing-schema.d.ts","import":"./dist/marketing-schema.js"},"./data-model-schema":{"types":"./dist/data-model-schema.d.ts","import":"./dist/data-model-schema.js"},"./framework-support":{"types":"./dist/framework-support.d.ts","import":"./dist/framework-support.js"},"./react-attribution":{"types":"./dist/react-attribution.d.ts","import":"./dist/react-attribution.js"},"./adapters/revalidate":{"types":"./dist/adapters-revalidate.d.ts","import":"./dist/adapters-revalidate.js"}},"gitHead":"4335a6a09bea95428136f6381b90c2d5145bc695","scripts":{"lint":"biome check .","test":"tsx --test test/*.test.ts test/*.test.tsx","build":"npm run clean && tsc -p tsconfig.build.json && node scripts/build-cjs.js && node -e \"require('node:fs').copyFileSync('src/styles/biab-forms.css','dist/biab-forms.css')\"","clean":"node -e \"const fs=require('node:fs');fs.rmSync('dist',{recursive:true,force:true})\"","openapi":"tsx scripts/openapi.ts","lint:fix":"biome check --write .","postbuild":"node scripts/publish-types.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.solid.json --noEmit && tsc -p tsconfig.qwik.json --noEmit && tsc -p tsconfig.headless.json --noEmit","test:types":"tsc -p tsconfig.type-tests.json --noEmit","gen:socials":"tsx scripts/gen-social-tables.ts","openapi:check":"tsx scripts/openapi.ts --check","prepublishOnly":"npm run build","typecheck:qwik":"tsc -p tsconfig.qwik.json --noEmit","typecheck:solid":"tsc -p tsconfig.solid.json --noEmit","typecheck:solid2":"tsc -p tsconfig.solid2.json --noEmit","gen:socials:check":"tsx scripts/gen-social-tables.ts --check","typecheck:headless":"tsc -p tsconfig.headless.json --noEmit"},"_npmUser":{"name":"michaelmartell","email":"240designworks@gmail.com"},"repository":{"url":"git+https://github.com/businessdash/platform.git","type":"git","directory":"biab-dev"},"_npmVersion":"11.17.0","description":"BusinessDash developer SDK — the data layer that lets you build customer-facing surfaces on your own domain while BusinessDash handles the operations stack behind the scenes. 0.9.x ships a comprehensive programmatic surface: storefront (products, categori","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^3.25.76","zod-to-json-schema":"^3.25.2","@js-temporal/polyfill":"^0.5.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","react":"^19.2.8","preact":"^10.29.8","esbuild":"^0.28.1","react-dom":"^19.2.8","typescript":"^5.9.3","@types/node":"^20.19.43","solid-js-v2":"npm:solid-js@2.0.0-rc.1","@solidjs/web":"2.0.0-rc.1","@types/react":"^19.2.17","@biomejs/biome":"^2.5.1","@builder.io/qwik":"^1.5.0","preact-render-to-string":"^6.7.0"},"peerDependencies":{"vue":">=3.3.0 <4","react":">=18.0.0 <20","svelte":">=5.0.0 <6","solid-js":">=1.8.0 <3","react-dom":">=18.0.0 <20","@angular/core":">=17.0.0","@builder.io/qwik":">=1.5.0 <2"},"peerDependenciesMeta":{"vue":{"optional":true},"react":{"optional":true},"svelte":{"optional":true},"solid-js":{"optional":true},"react-dom":{"optional":true},"@angular/core":{"optional":true},"@builder.io/qwik":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.9.70_1787262445368_0.7825258242819066","host":"s3://npm-registry-packages-npm-production"}},"0.9.80":{"name":"@businessdash/sdk","version":"0.9.80","keywords":["businessdash","biab","business-in-a-box","alpha"],"license":"MIT","_id":"@businessdash/sdk@0.9.80","maintainers":[{"name":"michaelmartell","email":"240designworks@gmail.com"}],"homepage":"https://businessdash.us","bugs":{"url":"https://github.com/businessdash/platform/issues"},"bin":{"biab-dev":"dist/cli.js","businessdash":"dist/cli.js"},"dist":{"shasum":"10c95a3d5f8824ac3adf48e06ce903269168916e","tarball":"https://registry.npmjs.org/@businessdash/sdk/-/sdk-0.9.80.tgz","fileCount":461,"integrity":"sha512-teHMusoVtVO5B+jFPols6IVPCxigszoqQ3bxQnSUtX783p4EoqzNfpVw0NexI0m+2Mh3aODBfmgbEAoIxjhhTQ==","signatures":[{"sig":"MEUCIFWBC35Tx+A/SdlacWwRM7mN9uB9GMUhPgFPwBak2AzCAiEAhmNh8iEvrrPbtj977LfavXykcSK+nxP3H/4T1KrfbO4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7352790},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./mcp":{"types":"./dist/mcp.d.ts","import":"./dist/mcp.js"},"./seo":{"types":"./dist/seo.d.ts","import":"./dist/seo.js"},"./vue":{"types":"./src/vue/index.ts","import":"./src/vue/index.ts"},"./blog":{"types":"./dist/blog.d.ts","import":"./dist/blog.js"},"./chat":{"types":"./dist/chat.d.ts","import":"./dist/chat.js"},"./qwik":{"types":"./src/qwik.tsx","import":"./src/qwik.tsx"},"./seed":{"types":"./dist/seed.d.ts","import":"./dist/seed.js"},"./alpha":{"types":"./dist/alpha.d.ts","import":"./dist/alpha.js"},"./enums":{"types":"./dist/enums.d.ts","import":"./dist/enums.js"},"./forms":{"types":"./dist/forms.d.ts","import":"./dist/forms.js"},"./legal":{"types":"./dist/legal-core/index.d.ts","import":"./dist/legal-core/index.js","require":"./dist/legal-core/index.cjs"},"./proxy":{"types":"./dist/proxy.d.ts","import":"./dist/proxy.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./solid":{"solid":"./src/solid.tsx","types":"./src/solid.tsx","import":"./src/solid.tsx"},"./store":{"types":"./dist/store.d.ts","import":"./dist/store.js"},"./native":{"types":"./dist/native.d.ts","import":"./dist/native.js"},"./portal":{"types":"./dist/portal.d.ts","import":"./dist/portal.js"},"./social":{"types":"./dist/social.d.ts","import":"./dist/social.js"},"./static":{"types":"./dist/static.d.ts","import":"./dist/static.js"},"./svelte":{"types":"./src/svelte/index.ts","import":"./src/svelte/index.ts","svelte":"./src/svelte/index.ts"},"./verify":{"types":"./dist/verify.d.ts","import":"./dist/verify.js"},"./account":{"types":"./dist/account.d.ts","import":"./dist/account.js"},"./angular":{"types":"./src/angular/index.ts","import":"./src/angular/index.ts"},"./consent":{"types":"./dist/consent-core/index.d.ts","import":"./dist/consent-core/index.js","require":"./dist/consent-core/index.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js"},"./graphql":{"types":"./dist/graphql.d.ts","import":"./dist/graphql.js"},"./model3d":{"types":"./dist/model3d-core/index.d.ts","import":"./dist/model3d-core/index.js","require":"./dist/model3d-core/index.cjs"},"./sitemap":{"types":"./dist/sitemap-core/index.d.ts","import":"./dist/sitemap-core/index.js","require":"./dist/sitemap-core/index.cjs"},"./vanilla":{"types":"./dist/vanilla.d.ts","import":"./dist/vanilla.js"},"./checkout":{"types":"./dist/checkout.d.ts","import":"./dist/checkout.js"},"./seo-core":{"types":"./dist/seo-core/index.d.ts","import":"./dist/seo-core/index.js","require":"./dist/seo-core/index.cjs"},"./contracts":{"types":"./dist/contracts.d.ts","import":"./dist/contracts.js"},"./marketing":{"types":"./dist/marketing.d.ts","import":"./dist/marketing.js"},"./push-core":{"types":"./dist/push-core/index.d.ts","import":"./dist/push-core/index.js","require":"./dist/push-core/index.cjs"},"./biab-sw.js":"./assets/biab-sw.js","./collections":{"types":"./dist/collections.d.ts","import":"./dist/collections.js"},"./distribution":{"types":"./dist/distribution.d.ts","import":"./dist/distribution.js"},"./mcp-adapters":{"types":"./dist/mcp-adapters.d.ts","import":"./dist/mcp-adapters.js"},"./notifications":{"types":"./dist/notifications-core/index.d.ts","import":"./dist/notifications-core/index.js","require":"./dist/notifications-core/index.cjs"},"./analytics-core":{"types":"./dist/analytics-core.d.ts","import":"./dist/analytics-core.js"},"./biab-forms.css":"./dist/biab-forms.css","./next/revalidate":{"types":"./dist/next-revalidate.d.ts","import":"./dist/next-revalidate.js"},"./react-analytics":{"types":"./dist/react-analytics.d.ts","import":"./dist/react-analytics.js"},"./analytics-server":{"types":"./dist/analytics-server.d.ts","import":"./dist/analytics-server.js"},"./marketing-schema":{"types":"./dist/marketing-schema.d.ts","import":"./dist/marketing-schema.js"},"./data-model-schema":{"types":"./dist/data-model-schema.d.ts","import":"./dist/data-model-schema.js"},"./framework-support":{"types":"./dist/framework-support.d.ts","import":"./dist/framework-support.js"},"./react-attribution":{"types":"./dist/react-attribution.d.ts","import":"./dist/react-attribution.js"},"./adapters/revalidate":{"types":"./dist/adapters-revalidate.d.ts","import":"./dist/adapters-revalidate.js"}},"gitHead":"4cb1049db894e2fef31599647c0c909fa733163c","scripts":{"lint":"biome check .","test":"tsx --test test/*.test.ts test/*.test.tsx","build":"npm run clean && tsc -p tsconfig.build.json && node scripts/build-cjs.js && node -e \"require('node:fs').copyFileSync('src/styles/biab-forms.css','dist/biab-forms.css')\"","clean":"node -e \"const fs=require('node:fs');fs.rmSync('dist',{recursive:true,force:true})\"","openapi":"tsx scripts/openapi.ts","lint:fix":"biome check --write .","postbuild":"node scripts/publish-types.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.solid.json --noEmit && tsc -p tsconfig.qwik.json --noEmit && tsc -p tsconfig.headless.json --noEmit","test:types":"tsc -p tsconfig.type-tests.json --noEmit","gen:socials":"tsx scripts/gen-social-tables.ts","openapi:check":"tsx scripts/openapi.ts --check","prepublishOnly":"npm run build","typecheck:qwik":"tsc -p tsconfig.qwik.json --noEmit","typecheck:solid":"tsc -p tsconfig.solid.json --noEmit","typecheck:solid2":"tsc -p tsconfig.solid2.json --noEmit","gen:socials:check":"tsx scripts/gen-social-tables.ts --check","typecheck:headless":"tsc -p tsconfig.headless.json --noEmit"},"_npmUser":{"name":"michaelmartell","email":"240designworks@gmail.com"},"repository":{"url":"git+https://github.com/businessdash/platform.git","type":"git","directory":"biab-dev"},"_npmVersion":"11.17.0","description":"BusinessDash developer SDK — the data layer that lets you build customer-facing surfaces on your own domain while BusinessDash handles the operations stack behind the scenes. 0.9.x ships a comprehensive programmatic surface: storefront (products, categori","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^3.25.76","zod-to-json-schema":"^3.25.2","@js-temporal/polyfill":"^0.5.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","react":"^19.2.8","preact":"^10.29.8","esbuild":"^0.28.1","react-dom":"^19.2.8","typescript":"^5.9.3","@types/node":"^20.19.43","solid-js-v2":"npm:solid-js@2.0.0-rc.1","@solidjs/web":"2.0.0-rc.1","@types/react":"^19.2.17","@biomejs/biome":"^2.5.1","@builder.io/qwik":"^1.5.0","preact-render-to-string":"^6.7.0"},"peerDependencies":{"vue":">=3.3.0 <4","react":">=18.0.0 <20","svelte":">=5.0.0 <6","solid-js":">=1.8.0 <3","react-dom":">=18.0.0 <20","@angular/core":">=17.0.0","@builder.io/qwik":">=1.5.0 <2"},"peerDependenciesMeta":{"vue":{"optional":true},"react":{"optional":true},"svelte":{"optional":true},"solid-js":{"optional":true},"react-dom":{"optional":true},"@angular/core":{"optional":true},"@builder.io/qwik":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.9.80_1787801835173_0.5464716239498684","host":"s3://npm-registry-packages-npm-production"}},"0.9.81":{"name":"@businessdash/sdk","version":"0.9.81","keywords":["businessdash","biab","business-in-a-box","alpha"],"license":"MIT","_id":"@businessdash/sdk@0.9.81","maintainers":[{"name":"michaelmartell","email":"240designworks@gmail.com"}],"homepage":"https://businessdash.us","bugs":{"url":"https://github.com/businessdash/platform/issues"},"bin":{"biab-dev":"dist/cli.js","businessdash":"dist/cli.js"},"dist":{"shasum":"4f06d467757b58d035200abdf0450835c5cd6711","tarball":"https://registry.npmjs.org/@businessdash/sdk/-/sdk-0.9.81.tgz","fileCount":461,"integrity":"sha512-G+sSsJ75QjzC2BHLrVaqE71FE0ZWsGKjOfsOr+RQBpw3RY2Iwm2tkWyppS62czR4ustR6d9FgSDGcD9gtKpepg==","signatures":[{"sig":"MEUCIQC/voF44wBXpBpoA6xeroJqOiYTwzFoXgjVB6Bruz5xdAIgfmi6BdI81oUSVpwEc1wHu17ixElLsS9Nma6A3Ze9m3U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7355756},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./mcp":{"types":"./dist/mcp.d.ts","import":"./dist/mcp.js"},"./seo":{"types":"./dist/seo.d.ts","import":"./dist/seo.js"},"./vue":{"types":"./src/vue/index.ts","import":"./src/vue/index.ts"},"./blog":{"types":"./dist/blog.d.ts","import":"./dist/blog.js"},"./chat":{"types":"./dist/chat.d.ts","import":"./dist/chat.js"},"./qwik":{"types":"./src/qwik.tsx","import":"./src/qwik.tsx"},"./seed":{"types":"./dist/seed.d.ts","import":"./dist/seed.js"},"./alpha":{"types":"./dist/alpha.d.ts","import":"./dist/alpha.js"},"./enums":{"types":"./dist/enums.d.ts","import":"./dist/enums.js"},"./forms":{"types":"./dist/forms.d.ts","import":"./dist/forms.js"},"./legal":{"types":"./dist/legal-core/index.d.ts","import":"./dist/legal-core/index.js","require":"./dist/legal-core/index.cjs"},"./proxy":{"types":"./dist/proxy.d.ts","import":"./dist/proxy.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./solid":{"solid":"./src/solid.tsx","types":"./src/solid.tsx","import":"./src/solid.tsx"},"./store":{"types":"./dist/store.d.ts","import":"./dist/store.js"},"./native":{"types":"./dist/native.d.ts","import":"./dist/native.js"},"./portal":{"types":"./dist/portal.d.ts","import":"./dist/portal.js"},"./social":{"types":"./dist/social.d.ts","import":"./dist/social.js"},"./static":{"types":"./dist/static.d.ts","import":"./dist/static.js"},"./svelte":{"types":"./src/svelte/index.ts","import":"./src/svelte/index.ts","svelte":"./src/svelte/index.ts"},"./verify":{"types":"./dist/verify.d.ts","import":"./dist/verify.js"},"./account":{"types":"./dist/account.d.ts","import":"./dist/account.js"},"./angular":{"types":"./src/angular/index.ts","import":"./src/angular/index.ts"},"./consent":{"types":"./dist/consent-core/index.d.ts","import":"./dist/consent-core/index.js","require":"./dist/consent-core/index.cjs"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js"},"./graphql":{"types":"./dist/graphql.d.ts","import":"./dist/graphql.js"},"./model3d":{"types":"./dist/model3d-core/index.d.ts","import":"./dist/model3d-core/index.js","require":"./dist/model3d-core/index.cjs"},"./sitemap":{"types":"./dist/sitemap-core/index.d.ts","import":"./dist/sitemap-core/index.js","require":"./dist/sitemap-core/index.cjs"},"./vanilla":{"types":"./dist/vanilla.d.ts","import":"./dist/vanilla.js"},"./checkout":{"types":"./dist/checkout.d.ts","import":"./dist/checkout.js"},"./seo-core":{"types":"./dist/seo-core/index.d.ts","import":"./dist/seo-core/index.js","require":"./dist/seo-core/index.cjs"},"./contracts":{"types":"./dist/contracts.d.ts","import":"./dist/contracts.js"},"./marketing":{"types":"./dist/marketing.d.ts","import":"./dist/marketing.js"},"./push-core":{"types":"./dist/push-core/index.d.ts","import":"./dist/push-core/index.js","require":"./dist/push-core/index.cjs"},"./biab-sw.js":"./assets/biab-sw.js","./collections":{"types":"./dist/collections.d.ts","import":"./dist/collections.js"},"./distribution":{"types":"./dist/distribution.d.ts","import":"./dist/distribution.js"},"./mcp-adapters":{"types":"./dist/mcp-adapters.d.ts","import":"./dist/mcp-adapters.js"},"./notifications":{"types":"./dist/notifications-core/index.d.ts","import":"./dist/notifications-core/index.js","require":"./dist/notifications-core/index.cjs"},"./analytics-core":{"types":"./dist/analytics-core.d.ts","import":"./dist/analytics-core.js"},"./biab-forms.css":"./dist/biab-forms.css","./next/revalidate":{"types":"./dist/next-revalidate.d.ts","import":"./dist/next-revalidate.js"},"./react-analytics":{"types":"./dist/react-analytics.d.ts","import":"./dist/react-analytics.js"},"./analytics-server":{"types":"./dist/analytics-server.d.ts","import":"./dist/analytics-server.js"},"./marketing-schema":{"types":"./dist/marketing-schema.d.ts","import":"./dist/marketing-schema.js"},"./data-model-schema":{"types":"./dist/data-model-schema.d.ts","import":"./dist/data-model-schema.js"},"./framework-support":{"types":"./dist/framework-support.d.ts","import":"./dist/framework-support.js"},"./react-attribution":{"types":"./dist/react-attribution.d.ts","import":"./dist/react-attribution.js"},"./adapters/revalidate":{"types":"./dist/adapters-revalidate.d.ts","import":"./dist/adapters-revalidate.js"}},"gitHead":"b0ceddee8b9a6c35f5748bf89e2bc7c0fede0fb3","scripts":{"lint":"biome check .","test":"tsx --test test/*.test.ts test/*.test.tsx","build":"npm run clean && tsc -p tsconfig.build.json && node scripts/build-cjs.js && node -e \"require('node:fs').copyFileSync('src/styles/biab-forms.css','dist/biab-forms.css')\"","clean":"node -e \"const fs=require('node:fs');fs.rmSync('dist',{recursive:true,force:true})\"","openapi":"tsx scripts/openapi.ts","lint:fix":"biome check --write .","postbuild":"node scripts/publish-types.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.solid.json --noEmit && tsc -p tsconfig.qwik.json --noEmit && tsc -p tsconfig.headless.json --noEmit","test:types":"tsc -p tsconfig.type-tests.json --noEmit","gen:socials":"tsx scripts/gen-social-tables.ts","openapi:check":"tsx scripts/openapi.ts --check","prepublishOnly":"npm run build","typecheck:qwik":"tsc -p tsconfig.qwik.json --noEmit","typecheck:solid":"tsc -p tsconfig.solid.json --noEmit","typecheck:solid2":"tsc -p tsconfig.solid2.json --noEmit","gen:socials:check":"tsx scripts/gen-social-tables.ts --check","typecheck:headless":"tsc -p tsconfig.headless.json --noEmit"},"_npmUser":{"name":"michaelmartell","email":"240designworks@gmail.com"},"repository":{"url":"git+https://github.com/businessdash/platform.git","type":"git","directory":"biab-dev"},"_npmVersion":"11.17.0","description":"BusinessDash developer SDK — the data layer that lets you build customer-facing surfaces on your own domain while BusinessDash handles the operations stack behind the scenes. 0.9.x ships a comprehensive programmatic surface: storefront (products, categori","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^3.25.76","zod-to-json-schema":"^3.25.2","@js-temporal/polyfill":"^0.5.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","react":"^19.2.8","preact":"^10.29.8","esbuild":"^0.28.1","react-dom":"^19.2.8","typescript":"^5.9.3","@types/node":"^20.19.43","solid-js-v2":"npm:solid-js@2.0.0-rc.1","@solidjs/web":"2.0.0-rc.1","@types/react":"^19.2.17","@biomejs/biome":"^2.5.1","@builder.io/qwik":"^1.5.0","preact-render-to-string":"^6.7.0"},"peerDependencies":{"vue":">=3.3.0 <4","react":">=18.0.0 <20","svelte":">=5.0.0 <6","solid-js":">=1.8.0 <3","react-dom":">=18.0.0 <20","@angular/core":">=17.0.0","@builder.io/qwik":">=1.5.0 <2"},"peerDependenciesMeta":{"vue":{"optional":true},"react":{"optional":true},"svelte":{"optional":true},"solid-js":{"optional":true},"react-dom":{"optional":true},"@angular/core":{"optional":true},"@builder.io/qwik":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.9.81_1787804019184_0.34355287665703904","host":"s3://npm-registry-packages-npm-production"}},"0.9.90":{"name":"@businessdash/sdk","version":"0.9.90","description":"BusinessDash developer SDK — the data layer that lets you build customer-facing surfaces on your own domain while BusinessDash handles the operations stack behind the scenes. 0.9.x ships a comprehensive programmatic surface: storefront (products, categori","type":"module","sideEffects":false,"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","bin":{"bd":"dist/cli.js","businessdash":"dist/cli.js"},"exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./contracts":{"types":"./dist/contracts.d.ts","import":"./dist/contracts.js"},"./framework-support":{"types":"./dist/framework-support.d.ts","import":"./dist/framework-support.js"},"./native":{"types":"./dist/native.d.ts","import":"./dist/native.js"},"./enums":{"types":"./dist/enums.d.ts","import":"./dist/enums.js"},"./graphql":{"types":"./dist/graphql.d.ts","import":"./dist/graphql.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./forms":{"types":"./dist/forms.d.ts","import":"./dist/forms.js"},"./store":{"types":"./dist/store.d.ts","import":"./dist/store.js"},"./chat":{"types":"./dist/chat.d.ts","import":"./dist/chat.js"},"./blog":{"types":"./dist/blog.d.ts","import":"./dist/blog.js"},"./checkout":{"types":"./dist/checkout.d.ts","import":"./dist/checkout.js"},"./account":{"types":"./dist/account.d.ts","import":"./dist/account.js"},"./marketing":{"types":"./dist/marketing.d.ts","import":"./dist/marketing.js"},"./verify":{"types":"./dist/verify.d.ts","import":"./dist/verify.js"},"./portal":{"types":"./dist/portal.d.ts","import":"./dist/portal.js"},"./social":{"types":"./dist/social.d.ts","import":"./dist/social.js"},"./seed":{"types":"./dist/seed.d.ts","import":"./dist/seed.js"},"./collections":{"types":"./dist/collections.d.ts","import":"./dist/collections.js"},"./static":{"types":"./dist/static.d.ts","import":"./dist/static.js"},"./element":{"types":"./dist/element.d.ts","import":"./dist/element.js"},"./vanilla":{"types":"./dist/vanilla.d.ts","import":"./dist/vanilla.js"},"./vue":{"types":"./src/vue/index.ts","import":"./src/vue/index.ts"},"./svelte":{"svelte":"./src/svelte/index.ts","types":"./src/svelte/index.ts","import":"./src/svelte/index.ts"},"./solid":{"types":"./src/solid.tsx","solid":"./src/solid.tsx","import":"./src/solid.tsx"},"./qwik":{"types":"./src/qwik.tsx","import":"./src/qwik.tsx"},"./angular":{"types":"./src/angular/index.ts","import":"./src/angular/index.ts"},"./react-analytics":{"types":"./dist/react-analytics.d.ts","import":"./dist/react-analytics.js"},"./react-attribution":{"types":"./dist/react-attribution.d.ts","import":"./dist/react-attribution.js"},"./analytics-core":{"types":"./dist/analytics-core.d.ts","import":"./dist/analytics-core.js"},"./analytics-server":{"types":"./dist/analytics-server.d.ts","import":"./dist/analytics-server.js"},"./distribution":{"types":"./dist/distribution.d.ts","import":"./dist/distribution.js"},"./mcp":{"types":"./dist/mcp.d.ts","import":"./dist/mcp.js"},"./mcp-adapters":{"types":"./dist/mcp-adapters.d.ts","import":"./dist/mcp-adapters.js"},"./proxy":{"types":"./dist/proxy.d.ts","import":"./dist/proxy.js"},"./seo":{"types":"./dist/seo.d.ts","import":"./dist/seo.js"},"./data-model-schema":{"types":"./dist/data-model-schema.d.ts","import":"./dist/data-model-schema.js"},"./alpha":{"types":"./dist/alpha.d.ts","import":"./dist/alpha.js"},"./marketing-schema":{"types":"./dist/marketing-schema.d.ts","import":"./dist/marketing-schema.js"},"./next/revalidate":{"types":"./dist/next-revalidate.d.ts","import":"./dist/next-revalidate.js"},"./adapters/revalidate":{"types":"./dist/adapters-revalidate.d.ts","import":"./dist/adapters-revalidate.js"},"./bd-forms.css":"./dist/bd-forms.css","./seo-core":{"types":"./dist/seo-core/index.d.ts","import":"./dist/seo-core/index.js","require":"./dist/seo-core/index.cjs"},"./push-core":{"types":"./dist/push-core/index.d.ts","import":"./dist/push-core/index.js","require":"./dist/push-core/index.cjs"},"./notifications":{"types":"./dist/notifications-core/index.d.ts","import":"./dist/notifications-core/index.js","require":"./dist/notifications-core/index.cjs"},"./legal":{"types":"./dist/legal-core/index.d.ts","import":"./dist/legal-core/index.js","require":"./dist/legal-core/index.cjs"},"./sitemap":{"types":"./dist/sitemap-core/index.d.ts","import":"./dist/sitemap-core/index.js","require":"./dist/sitemap-core/index.cjs"},"./model3d":{"types":"./dist/model3d-core/index.d.ts","import":"./dist/model3d-core/index.js","require":"./dist/model3d-core/index.cjs"},"./consent":{"types":"./dist/consent-core/index.d.ts","import":"./dist/consent-core/index.js","require":"./dist/consent-core/index.cjs"},"./bd-sw.js":"./assets/bd-sw.js"},"scripts":{"clean":"node -e \"const fs=require('node:fs');fs.rmSync('dist',{recursive:true,force:true})\"","build":"npm run clean && tsc -p tsconfig.build.json && node scripts/build-cjs.js && node -e \"require('node:fs').copyFileSync('src/styles/bd-forms.css','dist/bd-forms.css')\"","openapi":"tsx scripts/openapi.ts","openapi:check":"tsx scripts/openapi.ts --check","postbuild":"node scripts/publish-types.js","typecheck":"tsc -p tsconfig.json --noEmit && tsc -p tsconfig.solid.json --noEmit && tsc -p tsconfig.qwik.json --noEmit && tsc -p tsconfig.headless.json --noEmit","test:types":"tsc -p tsconfig.type-tests.json --noEmit","test":"tsx --test test/*.test.ts test/*.test.tsx","lint":"biome check .","lint:fix":"biome check --write .","prepublishOnly":"npm run build","typecheck:solid":"tsc -p tsconfig.solid.json --noEmit","typecheck:headless":"tsc -p tsconfig.headless.json --noEmit","typecheck:qwik":"tsc -p tsconfig.qwik.json --noEmit","gen:socials":"tsx scripts/gen-social-tables.ts","gen:socials:check":"tsx scripts/gen-social-tables.ts --check","typecheck:solid2":"tsc -p tsconfig.solid2.json --noEmit"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/businessdash/platform.git","directory":"bd"},"license":"MIT","homepage":"https://businessdash.us","keywords":["businessdash","bd","business-in-a-box","alpha"],"dependencies":{"@js-temporal/polyfill":"^0.5.1","zod":"^3.25.76","zod-to-json-schema":"^3.25.2"},"peerDependencies":{"@angular/core":">=17.0.0","@builder.io/qwik":">=1.5.0 <2","react":">=18.0.0 <20","react-dom":">=18.0.0 <20","solid-js":">=1.8.0 <3","svelte":">=5.0.0 <6","vue":">=3.3.0 <4"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"solid-js":{"optional":true},"vue":{"optional":true},"svelte":{"optional":true},"@builder.io/qwik":{"optional":true},"@angular/core":{"optional":true}},"devDependencies":{"@biomejs/biome":"^2.5.1","@builder.io/qwik":"^1.5.0","@solidjs/web":"2.0.0-rc.1","@types/node":"^20.19.43","@types/react":"^19.2.17","esbuild":"^0.28.1","preact":"^10.29.8","preact-render-to-string":"^6.7.0","react":"^19.2.8","react-dom":"^19.2.8","solid-js-v2":"npm:solid-js@2.0.0-rc.1","tsx":"^4.22.4","typescript":"^5.9.3"},"engines":{"node":">=18"},"gitHead":"e213ae579cfe05b50ba4cb8531d4cd9230e880b9","_id":"@businessdash/sdk@0.9.90","bugs":{"url":"https://github.com/businessdash/platform/issues"},"_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-kFQYQk6EdSqfPueSC0z/Mh4oGiyvdfCywaF6Opg0OMlU807FFTl84bBCCuSLLXjC0/5IvB0RCs0Pf1H7XkMaJQ==","shasum":"addb70fd1547777c94ff88f5624c70432a1b2836","tarball":"https://registry.npmjs.org/@businessdash/sdk/-/sdk-0.9.90.tgz","fileCount":461,"unpackedSize":7391342,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDTTQ0b2nrkv0mg24almS+SchUUoUIOx18RaChrdxjAfwIgE+7fy1uQDNcxIg2qehP+yG90rbRGdcMWYTo/H2LNGM0="}]},"_npmUser":{"name":"michaelmartell","email":"240designworks@gmail.com"},"directories":{},"maintainers":[{"name":"michaelmartell","email":"240designworks@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.9.90_1788452535214_0.5691303407710464"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-13T11:21:30.048Z","modified":"2026-09-03T16:22:15.646Z","0.9.60":"2026-08-13T11:21:30.537Z","0.9.70":"2026-08-20T21:47:25.553Z","0.9.80":"2026-08-27T03:37:15.373Z","0.9.81":"2026-08-27T04:13:39.381Z","0.9.90":"2026-09-03T16:22:15.414Z"},"bugs":{"url":"https://github.com/businessdash/platform/issues"},"license":"MIT","homepage":"https://businessdash.us","keywords":["businessdash","bd","business-in-a-box","alpha"],"repository":{"type":"git","url":"git+https://github.com/businessdash/platform.git","directory":"bd"},"description":"BusinessDash developer SDK — the data layer that lets you build customer-facing surfaces on your own domain while BusinessDash handles the operations stack behind the scenes. 0.9.x ships a comprehensive programmatic surface: storefront (products, categori","maintainers":[{"name":"michaelmartell","email":"240designworks@gmail.com"}],"readme":"# `@businessdash/sdk`\n\n> Formerly published as `@businessdash/sdk` (≤0.9.53) — same API, new name.\n\n**Alpha — 0.9.53.** This package declares, validates, and orchestrates your application's database schema, form layout, and type-safe field rules in a single declarative pipeline — and ships the answer-engine surface (llms.txt + product feed, MCP connector proxy, AI-crawler analytics) that makes the site you build with it legible to AI assistants.\n\n---\n\n## Install\n\n```bash\npnpm add @businessdash/sdk\n```\n\n## Imports\n\n```ts\nimport {\n  collection,\n  bd,\n  Enums,\n  createFormSchemaOrchestrator,\n  layoutContainers,\n  SchemaBoundary,\n} from \"@businessdash/sdk\";\n\n// Destructure visual layout wrappers for intuitive, HTML-like inline grouping\nconst { FormStep, ConditionalBlock, MultiPopulator, OrCondition } = layoutContainers;\n```\n\n---\n\n## Core `bd` Primitive Modifiers\n\nThe compact `bd` factory namespace eliminates boilerplate. Each chain method implements fluent builders to define data rules, UI presentation hints, database constraints, and cryptographic security features.\n\n### Core Field API Reference\n\n```ts\nbd.text().formElement(\"short_text\")       // Map raw DB type to a front-end input component\n  .validate({ minLength: 3, maxLength: 100 })  // Append structural validation parameters\n  .helper(\"The display name of the item\")       // Descriptive metadata for tooltips\n  .regex(/^[A-Z][a-z]+$/)                      // Absolute input string validation\n  .check(\"name != ''\")                          // Low-level SQL CHECK constraint\n  .encrypted()                                  // Per-user cryptographic isolation\n  .encryptedLight()                             // Master key encryption-at-rest\n  .private()                                    // Strip from public log telemetry\n  .required();\n```\n\nAvailable `.validate()` rules:\n\n| Rule | Applies to | Description |\n|---|---|---|\n| `minLength` | TEXT, ARRAY | Minimum characters or entries |\n| `maxLength` | TEXT, ARRAY | Maximum characters or entries |\n| `lessThan` | NUMBER, NUMERIC | Strictly less than |\n| `greaterThan` | NUMBER, NUMERIC | Strictly greater than |\n| `round` | NUMBER, NUMERIC | Decimal places to round to |\n| `positive` | NUMBER, NUMERIC | Must be >= 0 |\n| `notNull` | Any | Reject null/empty |\n| `floor` | NUMBER, NUMERIC | Floor the value |\n| `isDecimal` | NUMBER, NUMERIC | Must have decimal component |\n| `regex` | TEXT | Pattern match |\n| `checkExpression` | TEXT, NUMBER | SQL CHECK expression |\n| `lessThanToday` | DATE, DATE_TIME | Must be historical |\n| `greaterThanToday` | DATE, DATE_TIME | Must be future |\n\n### Form Elements\n\n```ts\n.formElement(\"short_text\")     // TEXT → short/long/email/url/dropdown/radio/color/…\n.formElement(\"currency\")       // NUMBER/NUMERIC → currency/range/star_rating/…\n.formElement(\"yes_no_toggle\")  // BOOLEAN → yes_no_toggle / yes_no_checkbox\n.formElement(\"dropdown\")       // SELECT → dropdown / radio_group\n.formElement(\"measurement\")    // RAW_JSON → measurement/address_group/geo/object\n.formElement(\"formFileValue\")  // FILES → file upload\n```\n\n### Complex Data Fields\n\n**`bd.measurement(options)`** — Explicit physics metrics compiler block:\n\n```ts\nmemoryBusSpeed: bd.measurement({\n  category: \"storageSpeed\",\n  unitPicker: \"fixed\",\n  default_unit: \"MHz\",\n  resolve_to_your_unit: \"MT/s\",\n  allow_decimals: true,\n}).required()\n```\n\nSupported categories: `sound`, `pressure`, `torque`, `speed` (incl. `Mach`, `ly/yr`), `time`, `area`, `volume`, `power`, `energy`, `storage`, `storageSpeed`, `frequency`, `temperature`, `mass`, `length` ( incl. `µm`, `nm`), `currency`.\n\n**`bd.object(properties)`** — Structural nested JSON with storage strategy:\n\n```ts\nmetadata: bd.object({\n  sku: bd.text().required(),\n  warehouse: bd.text(),\n}).strategy(\"flattened\")  // or \"jsonb\" | \"separateTable\" (spawns 1:1 side-table)\n```\n\nAll `RAW_JSON` object elements support JSONB output, not only `bd.object()`:\n\n```ts\nshippingAddress: bd.address().strategy(\"jsonb\"),\navailability: bd.json().formElement(\"availability\").strategy(\"jsonb\"),\nbookingWindow: bd.json().formElement(\"date_range\").strategy(\"jsonb\"),\ncoordinates: bd.geo().strategy(\"jsonb\"),\n```\n\n`strategy` and `separateTableName` are included in `toJSONSchema()`.\n\n**`bd.file(options)`** — File uploads:\n\n```ts\narchitectureSpecs: bd.file({\n  max_size_mb: 15,\n  allowed_mimetypes: [\"application/pdf\"],\n}).optional()\n```\n\n---\n\n## Optional Schema Boundaries\n\n`SchemaBoundary()` is feature metadata, not form layout. It accepts collections\nor nested boundaries directly and does not require a step, wizard, repeater, or\ngroup:\n\n```ts\nconst projects = collection(\"projects\", {\n  fields: { title: bd.text().required() },\n});\n\nconst direct = createFormSchemaOrchestrator([projects]);\n\nconst tagged = createFormSchemaOrchestrator([\n  SchemaBoundary(\n    { featureId: \"projects\", name: \"Projects\" },\n    projects,\n  ),\n]);\n```\n\nBoth declarations compile the same collection. The second additionally sets\n`tagged.featureTags.project` to `\"projects\"`.\n\n## High-Utility Form Layout Containers\n\nLayout containers are optional semantic wrappers. Add them only when the UI\nneeds steps, conditional visibility, repetition, or branching.\n\n### `FormStep(name, options, ...children)`\n\nWraps schema portions into sequential steps for multi-step wizards:\n\n```ts\nFormStep(\"taxonomy_setup\", {\n  showTitle: true,\n  helperText: \"Configure high-level project taxonomy.\",\n},\n  collection(\"categories\", { fields: { name: bd.text().required() } }),\n  collection(\"feature_groups\", { fields: { name: bd.text().required() } }),\n)\n```\n\n### `ConditionalBlock(config, ...children)`\n\nDynamically toggles visibility based on matching logic gates:\n\n```ts\nConditionalBlock(\n  {\n    matchStrategy: \"AND\",\n    showTitle: true,\n    rules: [\n      { fieldRef: \"project.isActive\", op: \"equals\", values: [true] },\n    ],\n  },\n  collection(\"features\", { fields: { name: bd.text().required() } }),\n)\n```\n\nSupports `matchStrategy: 'AND' | 'OR'` and operators: `equals`, `not_equals`, `any_of`, `none_of`.\n\n### `MultiPopulator(config, ...children)`\n\nGenerates an N+1 array row repeater grid. A single child collection is inferred\nas a secondary-table output:\n\n```ts\nMultiPopulator({ max_entries: 5, button_label: \"➕ Register Node\" },\n  collection(\"hardware_nodes\", {\n    fields: {\n      nodeSerial: bd.text().required().private(),\n      memoryBusSpeed: bd.measurement({\n        category: \"storageSpeed\",\n        unitPicker: \"fixed\",\n        default_unit: \"MHz\",\n        resolve_to_your_unit: \"MT/s\",\n        allow_decimals: true,\n      }).required(),\n    },\n  }),\n)\n```\n\nTo keep the repeated array on a parent record instead, bind the repeater to a\nJSONB field and declare the shape of one entry:\n\n```ts\nconst projects = collection(\"projects\", {\n  fields: {\n    name: bd.text().required(),\n    teamMembers: bd.array().strategy(\"jsonb\"),\n  },\n})\n\ncreateFormSchemaOrchestrator([\n  projects,\n  MultiPopulator({\n    max_entries: 10,\n    output: {\n      strategy: \"jsonb\",\n      fieldRef: \"project.teamMembers\",\n    },\n    entryFields: {\n      name: bd.text().required(),\n      role: bd.text().optional(),\n    },\n  }),\n])\n```\n\nThe orchestrator rejects missing targets, scalar JSONB targets, fields without\n`.strategy(\"jsonb\")`, and ambiguous implicit secondary-table outputs.\n\n### `OrCondition(options, branches)`\n\nMulti-path router layout engine for custom branching (tabbed selections):\n\n```ts\nOrCondition({ showTitle: true, button_label: \"Select Target Pathway\" }, [\n  {\n    name: \"Hardware Validation Path\",\n    helperText: \"Provisions system telemetry benchmarks.\",\n    nodes: [\n      MultiPopulator({ max_entries: 5, button_label: \"➕ Register Node\" },\n        collection(\"hardware_nodes\", { fields: { /* ... */ } }),\n      ),\n    ],\n  },\n  {\n    name: \"Standard Baseline Deployment Only\",\n    nodes: [ /* ... */ ],\n  },\n])\n```\n\n---\n\n## Compile-Time Type Safety & Form Alignment\n\nThe SDK leverages TypeScript type inference to turn common engineering mistakes into instant IDE compile errors.\n\n### Invalid Field Refs\n\nA typo inside a conditional block path (e.g. `projects.isActveeee`) fails validation at orchestration time:\n\n```bash\n⚠️ [BusinessDash SDK] Conditional rule references field \"isActveeee\"\n   in collection \"projects\" which does not exist.\n```\n\n### Data Type Mismatches\n\nConditional `fieldRef` values are validated when orchestration runs. The current\npublic type is `string`, so invalid collection or field paths are runtime\nalignment errors rather than template-literal compile-time errors.\n\n### Implicit Key Generation\n\nPrimary keys are optional. The orchestration engine pre-scans collections, automatically injecting type-safe sequential integer or secure random `uuid` primary identifiers.\n\n---\n\n## Unified Schema & Form Orchestration Blueprint\n\nThe complete declaration — combining database layers, field constraints, RLS policies, and layout:\n\n```ts\nimport {\n  collection, bd, Enums,\n  createFormSchemaOrchestrator,\n  layoutContainers,\n} from \"@businessdash/sdk\";\n\nconst { FormStep, ConditionalBlock, MultiPopulator, OrCondition } = layoutContainers;\n\nexport const ProjectStatus = Enums([\"planned\", \"in_progress\", \"beta\", \"completed\"] as const);\n\nexport const applicationMasterContext = createFormSchemaOrchestrator([\n\n  FormStep(\"taxonomy_setup\", {\n      showTitle: true,\n      helperText: \"Configure high-level project taxonomy and categorization mappings.\",\n    },\n      collection(\"categories\", {\n        fields: {\n          name: bd.text().formElement(\"short_text\").required()\n            .validate({ minLength: 3 }).helper(\"Category name.\"),\n          icon: bd.text().formElement(\"short_text\").optional(),\n        },\n      }),\n\n      collection(\"feature_groups\", {\n        fields: {\n          name: bd.text().formElement(\"short_text\").required(),\n          category_id: bd.relation()\n            .references(\"categories\").onDelete(\"CASCADE\").required(),\n        },\n      }),\n    ),\n\n  FormStep(\"feature_engineering\", { showTitle: true },\n\n      collection(\"features\", {\n        rlsPolicies: [\n          { roles: [\"authenticated\"], actions: [\"read\"], expression: \"owner_id = auth.uid()\" },\n        ],\n        fields: {\n          name: bd.text().formElement(\"short_text\").required().regex(/^[A-Z][a-z]+$/),\n          status: bd.text().formElement(\"dropdown\").required(),\n\n          estimatedBudget: bd.number().formElement(\"currency\")\n            .check(\"estimated_budget >= 0\").validate({ round: 2 }),\n\n          feature_group_id: bd.relation()\n            .references(\"feature_groups\").onDelete(\"CASCADE\").required(),\n\n          related_features: bd.relation().belongsToMany(\"features\", {\n            joinCollectionName: \"feature_references\",\n            fields: {\n              isBidirectional: bd.boolean().formElement(\"yes_no_toggle\").default(false),\n            },\n          }),\n        },\n      }),\n  ),\n\n  FormStep(\"routing_and_sandbox_studio\", { showTitle: true },\n\n      OrCondition({ showTitle: true, button_label: \"Select Target Pathway\" }, [\n        {\n          name: \"Hardware Validation Path\",\n          helperText: \"Provisions system telemetry benchmarks using physical metrics components.\",\n          nodes: [\n            MultiPopulator({ max_entries: 5, button_label: \"➕ Register Network Hardware Node\" },\n              collection(\"hardware_nodes\", {\n                fields: {\n                  nodeSerial: bd.text().formElement(\"short_text\").required().private(),\n                  memoryBusSpeed: bd.measurement({\n                    category: \"storageSpeed\",\n                    unitPicker: \"fixed\",\n                    default_unit: \"MHz\",\n                    resolve_to_your_unit: \"MT/s\",\n                    allow_decimals: true,\n                  }).required(),\n                  architectureSpecs: bd.file({\n                    max_size_mb: 15,\n                    allowed_mimetypes: [\"application/pdf\"],\n                  }).optional(),\n                },\n              }),\n            ),\n          ],\n        },\n        {\n          name: \"Standard Baseline Deployment Only\",\n          nodes: [],\n        },\n      ]),\n  ),\n\n], {\n  defaultIdType: \"uuid\",        // Auto-injects unique string identifiers for missing primary keys\n  consecutive: true,            // Forces strict wizard sequence stepping rules\n  progress_style: \"progress_bar\", // Instructs the layout renderer to generate progress indicators\n});\n```\n\n---\n\n## Deployment Validation Lifecycle\n\nWhen `createFormSchemaOrchestrator` compiles, it parses the layout tree and splits it into two isolated channels:\n\n- **`databaseSchema`** — A pure array of raw collection models, stripped of UI components, ready to stream to Prisma, Drizzle, or raw storage pipelines.\n- **`uiFormTree`** — The complete visual rendering graph mapping steps, multi-populators, validation constraints, and helper text fields for your form engine.\n\nIf a layout node points to an unmapped collection or field, orchestration stops\nwith a focused diagnostic:\n\n```bash\n[BusinessDash SDK] Conditional rule references field \"isActive\"\nin collection \"project\" which does not exist.\n```\n\n---\n\n## AI Distribution — llms.txt & Product Feed on Your Domain\n\nOrgs curate products/services for answer engines under **Dashboard → Marketing\n→ AI Distribution**; the platform keeps two public artifacts current per site —\nan OpenAI merchant-feed-shaped product feed and an `llms.txt`. The llms.txt\nconvention only works at the site's own root (an AI crawler asks for\n`https://yoursite.com/llms.txt`), while the source of truth lives on BusinessDash where\nthe org curates it. `@businessdash/sdk/distribution` proxies the two together:\n\n```ts\n// app/llms.txt/route.ts\nimport { llmsTxtHandler } from '@businessdash/sdk/distribution'\n\nexport const GET = llmsTxtHandler({\n  siteId: process.env.BD_SITE_ID!,\n  baseUrl: process.env.NEXT_PUBLIC_BD_APP_URL!, // e.g. https://www.biab.app\n})\n```\n\n- **`llmsTxtHandler(options)`** serves the curated llms.txt from your own\n  domain root, with a 5-minute `s-maxage` + `stale-while-revalidate`. An\n  upstream 404 (feed disabled or entitlement lapsed) passes through untouched;\n  network failure returns a plain 503 — it never throws into the framework.\n- **`productFeedUrl(options)` / `llmsTxtUrl(options)`** build the public BD\n  feed URLs. The product feed needs no proxy — submit its BusinessDash URL directly to\n  merchant/feed programs; `productFeedUrl` builds it for display/submission.\n\nPair the feed with the `product()` JSON-LD builder from `@businessdash/sdk/seo`:\nthe feed gets your product INTO the engines' catalogs; the markup is what their\ncrawlers verify on the landing page itself.\n\n## MCP Connector on Your Domain\n\nThe platform's host-resolved `/api/mcp` only exists on sites the platform\nserves. If you host your own app with the SDK, mount the two\n`@businessdash/sdk/mcp` handlers and your domain gains the same connector surface —\nso the URL an org hands to Claude / ChatGPT / Gemini is their own site:\n\n```ts\n// app/api/mcp/route.ts\nimport { mcpHandler } from '@businessdash/sdk/mcp'\nexport const { POST, GET } = mcpHandler({\n  siteId: process.env.BD_SITE_ID!,\n  baseUrl: process.env.NEXT_PUBLIC_BD_APP_URL!, // https://www.biab.app\n})\n\n// app/.well-known/mcp.json/route.ts\nimport { mcpManifestHandler } from '@businessdash/sdk/mcp'\nexport const GET = mcpManifestHandler({\n  siteId: process.env.BD_SITE_ID!,\n  baseUrl: process.env.NEXT_PUBLIC_BD_APP_URL!,\n})\n```\n\n- **`mcpHandler(options)`** — `POST` proxies JSON-RPC to the platform's public\n  per-site connector; `GET` mirrors the spec's 405. An unreachable upstream\n  answers with a proper JSON-RPC `-32603` error and a 502.\n- **`mcpManifestHandler(options)`** — serves `.well-known/mcp.json` with the\n  endpoint URL rewritten to YOUR domain (the requesting origin).\n- **Thin by design.** The body is forwarded verbatim and the platform still\n  enforces the org's MCP opt-in and per-tool write gates — a proxy can't widen\n  anything.\n\n## AI-Crawler Visibility (AEO Analytics)\n\nAI crawlers (GPTBot, ClaudeBot, PerplexityBot, …) fetch your HTML without\nexecuting JavaScript, so `<BDAnalytics />` never sees them. Your server does\n— report them from middleware via `@businessdash/sdk/analytics-server`:\n\n```ts\n// middleware.ts\nimport { isAiCrawlerUserAgent, reportAiCrawlerHit } from \"@businessdash/sdk/analytics-server\";\n\nexport function middleware(request: Request) {\n  const ua = request.headers.get(\"user-agent\");\n  if (isAiCrawlerUserAgent(ua)) {\n    // Fire-and-forget — never block or fail the crawler's request.\n    void reportAiCrawlerHit({\n      siteId: process.env.BD_SITE_ID!,\n      baseUrl: process.env.NEXT_PUBLIC_BD_API_URL!,\n      apiKey: process.env.NEXT_PUBLIC_BD_PUBLISHABLE_KEY!,\n      userAgent: ua,\n      path: new URL(request.url).pathname,\n    });\n  }\n}\n```\n\nRead it back with `bd.site(siteId).analytics.aiVisibility({ days: 30 })` —\nper-crawler fetch counts, distinct pages read, vendor, intent\n(`training` / `search` / `user`), and last-seen timestamps. Branch on\n`.available`; same plan gating as `pageViews()`.\n\n---\n\n## Entrypoints\n\n| Import path | Contents |\n|---|---|\n| `@businessdash/sdk` | Main barrel — all schema, layout, client, auth, SEO exports |\n| `@businessdash/sdk/contracts` | Zod schemas + inferred types for every API surface |\n| `@businessdash/sdk/enums` | Enum helpers — label formatting, enum entry utilities |\n| `@businessdash/sdk/collections` | Schema primitives — `collection()`, `createSchema()`, `bd`, `Enums()`, `SchemaBoundary` |\n| `@businessdash/sdk/forms` | Form layout + runtime — `layoutContainers`, `createFormSchemaOrchestrator()`, `createSingleResourceForm()`, controller, formula engine |\n| `@businessdash/sdk/static` | Static data — `Enums()`, enum types |\n| `@businessdash/sdk/react` | React bindings — **the full UI surface**: forms, chat, auth, storefront, cart, checkout, blog, customer portal, marketing pages, followers, social links, verification |\n| `@businessdash/sdk/vue` | Vue binding — `<BdForm>` + shared client |\n| `@businessdash/sdk/svelte` | Svelte binding — `<BdForm>` + shared client |\n| `@businessdash/sdk/solid` | Solid binding — `<BdForm>` + shared client |\n| `@businessdash/sdk/qwik` | Qwik binding — `<BdForm>` |\n| `@businessdash/sdk/angular` | Angular binding — `<bd-form>` component + shared client |\n| `@businessdash/sdk/element` | `<bd-form>` custom element — drop-in web component |\n| `@businessdash/sdk/vanilla` | Framework-free imperative DOM binding — `mountBdForm()` |\n| `@businessdash/sdk/react-analytics` | `<BDAnalytics />` — browser page-view tracker for React |\n| `@businessdash/sdk/react-attribution` | \"Powered by BusinessDash\" attribution badge |\n| `@businessdash/sdk/analytics-core` | Framework-agnostic analytics core — `initBdAnalytics()` |\n| `@businessdash/sdk/analytics-server` | Server-side AEO reporting — `isAiCrawlerUserAgent()`, `reportAiCrawlerHit()` |\n| `@businessdash/sdk/distribution` | llms.txt proxy + feed URLs — `llmsTxtHandler()`, `productFeedUrl()`, `llmsTxtUrl()` |\n| `@businessdash/sdk/mcp` | MCP connector proxy — `mcpHandler()`, `mcpManifestHandler()` |\n| `@businessdash/sdk/proxy` | `BdApiClient` / customer-portal client re-exports for proxy setups |\n| `@businessdash/sdk/seo` | JSON-LD builders — `localBusiness()`, `product()`, … |\n| `@businessdash/sdk/data-model-schema` | `defineDataModel` — org custom database (tables + enums) as code |\n| `@businessdash/sdk/alpha` | Legacy/deprecated pre-0.9 schema API, re-exported for compatibility |\n| `@businessdash/sdk/marketing-schema` | `defineSiteMarketingSchema()` — schema-driven marketing-page flow |\n| `@businessdash/sdk/next/revalidate` | One-line Next.js route handler for BusinessDash revalidation webhooks |\n| `@businessdash/sdk/adapters/revalidate` | Framework-agnostic revalidation handler builder |\n| `@businessdash/sdk/bd-forms.css` | Default form stylesheet |\n\n### Framework parity — read this before picking a stack\n\nForms work identically on all eight bindings, and every binding renders them\n**natively** — real components in your own DOM, styled by your own CSS.\n\nBeyond forms, two questions matter: does the binding have the surface at all,\nand does it render into your DOM or into an iframe?\n\n| Capability | react | solid | vue | svelte | qwik | angular | vanilla | element |\n|---|---|---|---|---|---|---|---|---|\n| Forms | native | native | native | native | native | native | native | native |\n| Shared client | native | native | native | native | — | native | — | native |\n| AI chat | both | both | native | native | native | native | native | native |\n| Storefront | both | both | native | native | native | native | native | native |\n| Cart | both | both | native | native | native | native | native | native |\n| Blog | both | both | native | native | native | native | native | native |\n| Checkout | both | both | native | native | native | native | native | native |\n| Customer portal | both | both | native | native | native | native | native | native |\n| Customer auth | native | native | native | native | native | native | native | native |\n| Followers | native | native | native | native | native | native | native | native |\n| Marketing pages | native | native | native | native | native | native | native | native |\n| Social links | native | native | native | native | native | native | native | native |\n| Email verification | native | native | native | native | native | native | native | native |\n| Phone verification | native | native | native | native | native | native | native | native |\n| **Surfaces** | **14** | **14** | **14** | **14** | **13** | **14** | **13** | **14** |\n\n`iframe` means a BusinessDash-hosted page in a sandbox. It works and it ships\nfast, but it renders our markup, not yours.\n\nTwo things worth reading against the obvious summary:\n\n**Every capability is available on every binding**, via ten shared cores\n(`forms`, `store`, `chat`, `blog`, `checkout`, `account`, `portal`, `marketing`,\n`verify`, `social`) — all as data you render yourself. React and Solid also\noffer the hosted iframe widgets, hence `both`.\n\nThe only `—` cells are the shared-client primitive on `qwik` and `vanilla`, and\nneither needs one: both take the client per form instead.\n\n**The customer portal** is the largest surface — 34 methods. `sessionToken` is\nrequired (without one it renders empty rather than signed-out); there are no\nlist endpoints for invoices, quotes, contracts or shipments, so `work` carries\nthe counts and you open each by id; and a submitted review is queued for staff\napproval, so watch `reviewAwaitingModeration` rather than expecting it in\n`reviews`.\n\n**React remains ahead on `<ChatbotInline>`** — a rendered chat UI over the same\nshared controller.\n\nFor anything a binding lacks, `BdClient` from the root export is\nframework-agnostic: `client.storefront()`, `client.cart()`,\n`client.customerPortal()` and the rest work anywhere JavaScript runs. You write\nthe markup; the data layer is already there.\n\n**React-compatible targets get the full surface**, because they render React:\nNext.js (App Router included — the adapter ships its own `\"use client\"`\nboundary), Astro via `@astrojs/react`, Remix / React Router 7, TanStack Start,\nand **Preact** via the standard `preact/compat` alias all import\n`@businessdash/sdk/react`. React Native uses `@businessdash/sdk/native`.\n\nThe matrix lives in `@businessdash/sdk/framework-support` as data, and release\ngates assert that the code, the manifest and the published docs table all\nagree — including the level, so an iframe can never be published as if it were\na native component.\n\n## Releases\n\n> **Versioning convention (0.9.50+):** Significant feature groups bump the minor\n> field directly. Previous releases used the 36-band patch series (0.9.36, 0.9.35…).\n> The 0.9.35 docs are archived at `docs-legacy/0.9.35/` — this is the first\n> supported SDK baseline. 0.9.50 introduces the unified Schema, Validation, and\n> Form orchestration pipeline with `createFormSchemaOrchestrator`, `layoutContainers`,\n> and the full `bd` field builder namespace.\n>\n> **0.8.x = schema-driven marketing flow.** Major surface bump (still\n> alpha). New entrypoints: `defineSiteMarketingSchema()`,\n> `@businessdash/sdk/seo` for typed JSON-LD builders, and a `bd` CLI.\n>\n> **0.9.x = full programmatic consumer surface.** The largest expansion\n> yet: native storefront / cart / checkout / coupons / subscriptions,\n> customer portal + tenant auth (`createAuthHandler`, `getTenantSession`,\n> `<SignIn/>` `<SignUp/>` `<SignOut/>` `useUser`), blog, a paginated\n> reviews wall, address autocomplete + shipping, programmatic local SEO\n> (`defineParallelPage()`), the revalidation webhook channel\n> (`@businessdash/sdk/next/revalidate` + `@businessdash/sdk/adapters/revalidate`),\n> privacy-conscious analytics (`@businessdash/sdk/react-analytics` +\n> `@businessdash/sdk/analytics-core`), and a three-state billing-lifecycle\n> degradation contract. Detailed per-version notes below.\n\nThe 3 most recent releases are below. **For the complete release\nhistory, see the [changelog](https://www.biab.app/docs/developer/changelog).**\n\n### 0.9.90\n\n#### Every `Biab*` export is now `Bd*` — a breaking rename with no aliases\n\n`biab` was the old application name (Business In A Box). The product is\nBusinessDash, and the old name survived across the SDK's whole public\nsurface long after that stopped being true.\n\nRenamed as a clean break rather than with a deprecation layer, because\nnothing outside this repo consumes these names yet. Waiting would only have\nmade the alias layer larger.\n\n```\nBiabDevClient          -> BdApiClient      (the HTTP transport)\nBiabClient             -> BdClient         (the composed client interface)\nBiabForm, BiabProvider -> BdForm, BdProvider\nBiabApiError and every other error class\ncreateBiabClient, initBiabAnalytics, mountBiabForm, getBiabEnv, …\n.biab-* CSS classes    -> .bd-*            (54 of them)\nBIAB_* env vars        -> BD_*\n@biab-dev/* packages   -> @businessdash/*\n```\n\nTwo names needed a decision rather than a pattern. `BiabClient` (the\ninterface a consumer holds) and `BiabDevClient` (the HTTP transport under it)\nwould both have become `BdClient`; the interface keeps the plain name and the\ntransport is now **`BdApiClient`**.\n\n**Upgrading.** Every rename is mechanical — a find-and-replace of `Biab` to\n`Bd` and `biab` to `bd` covers all of it except `BiabDevClient`, which\nbecomes `BdApiClient`. If you style the form components, the CSS hooks moved\nfrom `.biab-*` to `.bd-*` in the same way.\n\n**`./biab-forms.css` still resolves.** The stylesheet subpath is exported\nunder both names, so a stylesheet import does not have to move in lockstep\nwith the code.\n\nThree things deliberately did NOT change. `biab.app` is the API host and is\nserved forever. The `biab.app/schemas/*` URLs are JSON-Schema `$id`s —\nidentifiers rather than addresses — so changing one would break validation\nfor anything pinned to it. And the historical note that this was formerly\nBusiness In A Box stays true.\n\n#### Proposals: the document a customer is sent, not just the quote\n\n`customerProposalSchema`, `listProposals()` and `getProposal()`.\n\nA proposal is the document built around a quote — either a rendered PDF or a\nlive page — and `kind` tells you which, so a UI can offer a download or frame\na page rather than guessing and being wrong half the time. Only rendered\nproposals appear: before that it is a rep's working copy, possibly at a price\nnobody has agreed, and a customer refreshing the list should not watch it\ntake shape.\n\nIt carries no template, bindings or resolved snapshot. Those describe how an\norg builds proposals; a customer's client has no business reading them.\n\n#### The customer quote detail carries the proposal narrative\n\n`customerQuoteDetailSchema` was dropping `sections` — the cover letter, scope\nof work and terms that make a quote a proposal — so a consumer could fetch\none and receive only line items. It now carries them, along with the decision\nstate (`canAccept`, `expired`, and the sent/accepted/rejected timestamps) so\na client does not have to re-derive whether accepting is still possible.\n\n`items` was `z.array(z.unknown())`. It is typed now: no consumer should have\nto guess a line item's shape before rendering a row.\n\n#### React's marketing pages run on the shared core\n\n`useMarketingPage`, `useMarketingPagesList` and `useMarketingPagePreloader`\nreimplemented the fetch, the status flag and the in-flight guard that\n`marketing-core` already had, so a fix in the core never reached React. They\nare thin shells over `createMarketingController` now, with the\nsnapshot-to-view derivation moved into the core as `marketingPageView()` and\n`marketingListView()` for every binding to share.\n\nPublic signatures are unchanged. The synchronous cache read stays in React,\nbecause the controller does not duplicate the client's cache and without that\nread an already-cached page flashes \"loading\".\n\n### 0.9.81\n\n#### The `createBdClient` facade serves the legal and sitemap routes\n\nThe facade lacked `legal` and `site`, so any starter handing it to\n`resolveLegalPage()` or `buildSitemap()` failed to typecheck against the\npublished package — the template fleet caught T3-App, Qwik and Svelte on\n0.9.80. `client.legal` and `client.site(siteId)` now exist on the facade,\nmirroring the raw `BdApiClient`, and compile-time contract guards in\n`sdk.ts` fail `typecheck` if a helper-required surface is ever dropped\nagain.\n\n#### Sitemaps actually include blog posts and products now\n\n`SitemapClientLike` described responses as `{ posts }` / `{ products }`,\nbut the real client serves `{ items }` — the collector's destructure came\nback undefined, the loop threw, and every real sitemap silently reported\nthose sections as \"unreachable\". The contract and collector now consume\nthe shapes the API actually serves.\n\n#### Shipped source compiles on consumers' older TypeScript\n\n`push-core` used the `Uint8Array<ArrayBuffer>` generic, which only parses\non TS 5.7+ — consumers whose toolchains typecheck the shipped source\n(Qwik's does) failed to build. The annotation is gone; the one\n`BufferSource` call site casts instead.\n\n### 0.9.80\n\n#### Tracking consent — `@businessdash/sdk/consent`\n\nThere was no consent mechanism anywhere: `initBdAnalytics()` started\nunconditionally and analytics, attribution and AEO all collected regardless.\n\n`loadConsent()` returns what a visitor currently allows, at THIS org, and\n`recordConsent()` stores their answer. Gate analytics on it:\n\n```ts\nconst consent = await loadConsent({ client })\nif (consent.allows('analytics')) initBdAnalytics({ siteId, baseUrl, apiKey })\nif (consent.mustAsk) showYourBanner(consent)\n```\n\n`initBdAnalytics` is deliberately NOT made to call this itself — a gate that\nfires implicitly is one nobody can see in review, and what happens before\nconsent (render nothing, render a placeholder, collect essential-only) is the\nsite's decision, not ours.\n\n**Consent is per-org and never travels.** A visitor who refuses at org 2 has\nsaid nothing to org 1, and one who consents at org 1 has NOT consented to org 2\n— that second half is the one with legal teeth. The visitor key lives in a\nfirst-party cookie on the org's own domain, so two sites cannot see each\nother's, and the isolation is the browser's rather than something we remember\nto scope.\n\n**The gate fails closed.** Any failure returns deny-everything: a gate that\nfails open collects data nobody agreed to, and only one of those outcomes is an\nincident.\n\nAlso ships `client.consent.get()` / `.record()` as the transport underneath,\nand `browserOptOut()` for DNT and Global Privacy Control.\n\n## Legacy Docs\n\nThe 0.9.35 docs are archived at [`docs-legacy/0.9.35/`](./docs-legacy/0.9.35/).\n","readmeFilename":"README.md"}