{"_id":"@bernierllc/website-builder-suite","_rev":"5-322c659b497d4c16ec9ded3ce92efc7e","name":"@bernierllc/website-builder-suite","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.1":{"name":"@bernierllc/website-builder-suite","version":"0.0.1","keywords":["oidc","trusted-publishing","setup"],"_id":"@bernierllc/website-builder-suite@0.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"f3ea7d8242dd55fbb4ffcb424d3aadaf40e9ae15","tarball":"https://registry.npmjs.org/@bernierllc/website-builder-suite/-/website-builder-suite-0.0.1.tgz","fileCount":2,"integrity":"sha512-lbCv9QLgbrzYDUf6Bm/ZYqSH5tbsq2Gz31jftC8EeXb/3isFWR+8I6Unc6uI35QJXepUHy0XI6FSwNCeNkBkIw==","signatures":[{"sig":"MEYCIQDkdw6wDeGnSr0rwka5OTwoRdHCMyAmrPSsxBnpO2HyBAIhAOCPNWtqF0YNNmikg5DCW9GwPVl8Tz8r5ArJ8r2ZHlhx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2095},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_npmVersion":"11.12.1","description":"OIDC trusted publishing setup package for @bernierllc/website-builder-suite","directories":{},"_nodeVersion":"25.9.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/website-builder-suite_0.0.1_1782236359882_0.8131660238100527","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@bernierllc/website-builder-suite","version":"0.1.0","keywords":["website-builder","site-config","tenant","onboarding","preview","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/website-builder-suite@0.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"c0ae70ef6bb27b854709e632b4843dc535966367","tarball":"https://registry.npmjs.org/@bernierllc/website-builder-suite/-/website-builder-suite-0.1.0.tgz","fileCount":19,"integrity":"sha512-sa2d+ztXrHIJQkQSL7Xu1tf6paaUI6sc019C7Xrp9CVzUHwYZFOYcfLvnh8BEoN56ErzFf6YY8r68UifEyLDyg==","signatures":[{"sig":"MEQCICpeGZeMpjCYDGPNZHIDSTlqQjiEfE7jECINkCZSsvirAiARxvILfAs0zArAFA6n3gPxivIXZY31cnfrwDDpXH9QGw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29499},"main":"dist/index.js","_from":"file:bernierllc-website-builder-suite-0.1.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"echo 'Tests skipped for initial publish'","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:82c89d5a-8158-4b95-b771-bc013c02e7e3"}},"_resolved":"/home/runner/work/tools/tools/packages/suite/website-builder-suite/bernierllc-website-builder-suite-0.1.0.tgz","_integrity":"sha512-sa2d+ztXrHIJQkQSL7Xu1tf6paaUI6sc019C7Xrp9CVzUHwYZFOYcfLvnh8BEoN56ErzFf6YY8r68UifEyLDyg==","bernierllc":{"runtime":"universal","category":"suite","integration":{"logger":"integrated","neverhub":"required","neveradmin":"optional"}},"_npmVersion":"11.17.0","description":"Ready-to-use website builder bundle: config-driven site profiles, tenant resolution, preview UI, and onboarding plugin.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@bernierllc/site-preview-ui":"0.1.0","@bernierllc/site-config-core":"0.3.0","@bernierllc/site-builder-service":"0.1.1","@bernierllc/onboarding-plugin-website-builder":"0.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","react":"^18.0.0","eslint":"^8.45.0","ts-jest":"^29.1.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","jest-environment-jsdom":"^29.5.0","@testing-library/jest-dom":"^5.16.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/website-builder-suite_0.1.0_1782237842273_0.8033299066002131","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bernierllc/website-builder-suite","version":"0.1.1","keywords":["website-builder","site-config","tenant","onboarding","preview","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/website-builder-suite@0.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"55c4880c0bd083bd5cb188bbdd87e63f5a7fa20e","tarball":"https://registry.npmjs.org/@bernierllc/website-builder-suite/-/website-builder-suite-0.1.1.tgz","fileCount":19,"integrity":"sha512-3dY9MZzGCT8sjtetM425JxnbpquIFWCIvOR6EMYZffr+6xA/p+EQeycdxb7hISYbZ+gmUIrKmw6jm4KgZJyXog==","signatures":[{"sig":"MEQCIEFYiwHzCD4mbBte7dECOI/vQHhqnWNZFsus1IZ6U+yqAiBW9z9pK91DpUwAy9Gdkp1Clg+kY5q33nbkQt9JABbxPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29499},"main":"dist/index.js","_from":"file:bernierllc-website-builder-suite-0.1.1.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"echo 'Tests skipped for initial publish'","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:82c89d5a-8158-4b95-b771-bc013c02e7e3"}},"_resolved":"/home/runner/work/tools/tools/packages/suite/website-builder-suite/bernierllc-website-builder-suite-0.1.1.tgz","_integrity":"sha512-3dY9MZzGCT8sjtetM425JxnbpquIFWCIvOR6EMYZffr+6xA/p+EQeycdxb7hISYbZ+gmUIrKmw6jm4KgZJyXog==","bernierllc":{"runtime":"universal","category":"suite","integration":{"logger":"integrated","neverhub":"required","neveradmin":"optional"}},"_npmVersion":"12.0.1","description":"Ready-to-use website builder bundle: config-driven site profiles, tenant resolution, preview UI, and onboarding plugin.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@bernierllc/site-preview-ui":"0.1.1","@bernierllc/site-config-core":"0.3.1","@bernierllc/site-builder-service":"0.1.2","@bernierllc/onboarding-plugin-website-builder":"0.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","react":"^18.0.0","eslint":"^8.45.0","ts-jest":"^29.1.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","jest-environment-jsdom":"^29.5.0","@testing-library/jest-dom":"^5.16.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/website-builder-suite_0.1.1_1784016119926_0.29941990982727096","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@bernierllc/website-builder-suite","version":"0.1.2","keywords":["website-builder","site-config","tenant","onboarding","preview","bernierllc"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/website-builder-suite@0.1.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"dist":{"shasum":"ebae3c13bcbebb9ba95441ed7b01af70d0c5e232","tarball":"https://registry.npmjs.org/@bernierllc/website-builder-suite/-/website-builder-suite-0.1.2.tgz","fileCount":19,"integrity":"sha512-EpXObEGDC54Wn+s2BblGUuq+XPSWuktOtrX+R+Ii8PCGowKJiOxm04aLHj2nJmwJ5xrXmqHpHnnOkz4gx/4hFA==","signatures":[{"sig":"MEYCIQDrRs4CJkjNy0fgkKAV5F2cK1O60C+qajvbFPqd6TAp/QIhAPxlwpUvxxzo6Zjtrmqr08Z0CLgHUYsxIuNTMNGFhrW4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCyBItJNoQQjlhAmJHwccyYUlen0L5sGdXkEyLq4vovgwIgYwIQ5mGxYKtHOigAMiLbxgKeOpgeLU5++7+UPttM/6k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29503},"main":"dist/index.js","_from":"file:bernierllc-website-builder-suite-0.1.2.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"echo 'Tests skipped for initial publish'","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"82c89d5a-8158-4b95-b771-bc013c02e7e3"}},"_resolved":"/home/runner/work/tools/tools/packages/suite/website-builder-suite/bernierllc-website-builder-suite-0.1.2.tgz","_integrity":"sha512-EpXObEGDC54Wn+s2BblGUuq+XPSWuktOtrX+R+Ii8PCGowKJiOxm04aLHj2nJmwJ5xrXmqHpHnnOkz4gx/4hFA==","bernierllc":{"runtime":"universal","category":"suite","integration":{"logger":"integrated","neverhub":"required","neveradmin":"optional"}},"_npmVersion":"12.2.0","description":"Ready-to-use website builder bundle: config-driven site profiles, tenant resolution, preview UI, and onboarding plugin.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@bernierllc/site-preview-ui":"^0.1.2","@bernierllc/site-config-core":"^0.3.1","@bernierllc/site-builder-service":"^0.1.2","@bernierllc/onboarding-plugin-website-builder":"^0.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","react":"^18.0.0","eslint":"^8.45.0","ts-jest":"^29.1.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","jest-environment-jsdom":"^29.5.0","@testing-library/jest-dom":"^5.16.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/website-builder-suite_0.1.2_1790797233970_0.6573861787625195","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"_id":"@bernierllc/website-builder-suite@0.1.3","dist":{"shasum":"aee319bc01c00d65b337da0a6bc87234303f05a4","tarball":"https://registry.npmjs.org/@bernierllc/website-builder-suite/-/website-builder-suite-0.1.3.tgz","fileCount":19,"integrity":"sha512-j5CLI7uCxq67W5nwTGh59Q+ywQBHO3HWmWkWRUfJ6oOJeQEEcWv6fujW2jHhAPbUpkJPzDYSacwxj+BPvQEK2w==","signatures":[{"sig":"MEUCIF29xLvsowPw13COPd5TbMv4cV9Sgq5aK/3CIU39roECAiEA5slMcuAsLEGRujdhF2vOcgpCJ7JMhexe3Kks1m4OI8Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIA9Z8RVQ+mZQi+Xes3dqRStNCVp1aM2moDMlf2iLRBxXAiA89mQN4MHb56VkG8D9w6Ic1SxshGMhRcArLisjnsrD0A=="}],"unpackedSize":29503},"main":"dist/index.js","name":"@bernierllc/website-builder-suite","_from":"file:bernierllc-website-builder-suite-0.1.3.tgz","types":"dist/index.d.ts","author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts,.tsx","test":"echo 'Tests skipped for initial publish'","build":"tsc","clean":"rm -rf dist","test:run":"jest --watchAll=false","test:watch":"jest --watch","test:coverage":"jest --coverage"},"version":"0.1.3","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"82c89d5a-8158-4b95-b771-bc013c02e7e3"}},"keywords":["website-builder","site-config","tenant","onboarding","preview","bernierllc"],"_resolved":"/home/runner/work/tools/tools/packages/suite/website-builder-suite/bernierllc-website-builder-suite-0.1.3.tgz","_integrity":"sha512-j5CLI7uCxq67W5nwTGh59Q+ywQBHO3HWmWkWRUfJ6oOJeQEEcWv6fujW2jHhAPbUpkJPzDYSacwxj+BPvQEK2w==","bernierllc":{"runtime":"universal","category":"suite","integration":{"logger":"integrated","neverhub":"required","neveradmin":"optional"}},"_npmVersion":"12.2.0","description":"Ready-to-use website builder bundle: config-driven site profiles, tenant resolution, preview UI, and onboarding plugin.","directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"@bernierllc/site-preview-ui":"^0.1.2","@bernierllc/site-config-core":"^0.3.1","@bernierllc/site-builder-service":"^0.1.3","@bernierllc/onboarding-plugin-website-builder":"^0.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","react":"^18.0.0","eslint":"^8.45.0","ts-jest":"^29.1.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@testing-library/react":"^13.4.0","jest-environment-jsdom":"^29.5.0","@testing-library/jest-dom":"^5.16.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/website-builder-suite_0.1.3_1790884769175_0.31174185238558505"}}},"time":{"created":"2026-06-23T17:39:19.715Z","modified":"2026-10-01T19:59:29.515Z","0.0.1":"2026-06-23T17:39:20.020Z","0.1.0":"2026-06-23T18:04:02.431Z","0.1.1":"2026-07-14T08:02:00.085Z","0.1.2":"2026-09-30T19:40:34.052Z","0.1.3":"2026-10-01T19:59:29.264Z"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","keywords":["website-builder","site-config","tenant","onboarding","preview","bernierllc"],"description":"Ready-to-use website builder bundle: config-driven site profiles, tenant resolution, preview UI, and onboarding plugin.","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/website-builder-suite\n\nReady-to-use bundle wiring the Website Builder cluster: config-driven site profiles, tenant resolution, live preview UI, and one-line onboarding agent integration.\n\n## Overview\n\n`website-builder-suite` provides a single import for the complete Website Builder cluster:\n\n- **`createWebsiteBuilder(config)`** — factory wiring `SiteBuilder` with one call\n- **UI components** from `@bernierllc/site-preview-ui` (re-exported)\n- **`WebsiteBuilderPlugin`** from `@bernierllc/onboarding-plugin-website-builder` (re-exported)\n- **Schema helpers and types** from `@bernierllc/site-config-core` (re-exported)\n- **`InMemorySiteConfigStore`** from `@bernierllc/site-builder-service` (re-exported)\n\n## Installation\n\n```bash\nnpm install @bernierllc/website-builder-suite\n# React peer deps (required for UI components)\nnpm install react react-dom\n```\n\n## Usage\n\n### Standalone Admin Setup\n\n```typescript\n// server/site-builder.ts\nimport { createWebsiteBuilder, InMemorySiteConfigStore } from '@bernierllc/website-builder-suite';\n\nexport const builder = createWebsiteBuilder({\n  store: new InMemorySiteConfigStore(), // Replace with PrismaSiteConfigStore for production\n  neverhub: { enabled: process.env.NEVERHUB_ENABLED === 'true' },\n});\n\n// Call initialize() once at server startup\nawait builder.initialize();\n```\n\n```typescript\n// app/api/sites/[tenantId]/route.ts (Next.js 15)\nimport { builder } from '@/server/site-builder';\n\nexport async function GET(req: Request, { params }: { params: { tenantId: string } }) {\n  const model = await builder.loadByTenant(params.tenantId);\n  if (!model) return Response.json({ error: 'Not found' }, { status: 404 });\n  return Response.json(model);\n}\n\nexport async function PATCH(req: Request, { params }: { params: { tenantId: string } }) {\n  const patch = await req.json();\n  const saved = await builder.save({ tenantId: params.tenantId, ...patch });\n  return Response.json(saved);\n}\n```\n\n```tsx\n// app/admin/site/page.tsx (admin editing UI)\n'use client';\nimport { SitePreviewCard, useSitePreview } from '@bernierllc/website-builder-suite';\n\nexport default function SiteAdminPage() {\n  const { renderModel, refresh } = useSitePreview({\n    fetchFn: () => fetch('/api/sites/my-tenant').then(r => r.json()),\n  });\n\n  return (\n    <div>\n      <SitePreviewCard renderModel={renderModel} onRefresh={refresh} />\n      {/* Admin editing forms here */}\n    </div>\n  );\n}\n```\n\n### Onboarding Agent Integration\n\n```typescript\n// server/onboarding-setup.ts\nimport { createWebsiteBuilder, WebsiteBuilderPlugin } from '@bernierllc/website-builder-suite';\nimport { OnboardingAgentSuite } from '@bernierllc/onboarding-agent-suite';\n\nconst builder = createWebsiteBuilder({ store: myPrismaStore });\nawait builder.initialize();\n\nconst agent = new OnboardingAgentSuite({\n  plugins: [\n    new WebsiteBuilderPlugin({\n      siteBuilder: builder,\n      tenantId: session.tenantId,\n      slug: 'acme-plumbing',\n      previewSlugPattern: '/booking-preview/{slug}',\n      offeredSections: ['services', 'serviceArea', 'hours', 'contact'],\n    }),\n  ],\n});\n```\n\n### Next.js Middleware Recipe (Tenant Resolution)\n\n```typescript\n// middleware.ts — subdomain-based tenant resolution\nimport { NextRequest, NextResponse } from 'next/server';\n\nexport function middleware(request: NextRequest) {\n  const host = request.headers.get('host') ?? '';\n  const slug = host.split('.')[0];\n  const response = NextResponse.rewrite(new URL('/booking-site', request.url));\n  response.headers.set('x-org-slug', slug);\n  return response;\n}\n```\n\n```tsx\n// app/booking-site/page.tsx\nimport { builder } from '@/server/site-builder';\nimport { headers } from 'next/headers';\n\nexport default async function BookingSitePage() {\n  const slug = (await headers()).get('x-org-slug') ?? '';\n  const model = await builder.loadBySlug(slug);\n  if (!model) return <div>Site not found</div>;\n\n  return (\n    <main style={model.cssVariables as React.CSSProperties}>\n      <h1>{model.config.branding.name}</h1>\n    </main>\n  );\n}\n```\n\n### Schema Helpers\n\n```typescript\nimport {\n  validate,\n  defaultConfig,\n  completenessScore,\n  toCssVariables,\n  mergeConfigs,\n} from '@bernierllc/website-builder-suite';\n\n// Create a default config\nconst config = defaultConfig('tenant-1', 'acme-plumbing');\n\n// Validate a config\nconst result = validate(config);\nif (!result.success) console.error(result.error);\n\n// Check completeness\nconst { score, missingFields } = completenessScore(config);\nconsole.log(`${score}% complete, missing: ${missingFields.join(', ')}`);\n\n// Generate CSS variables\nconst cssVars = toCssVariables(config);\n// { '--color-primary': '#1a1a2e', '--font-heading': 'Inter', ... }\n\n// Merge a partial patch\nconst updated = mergeConfigs(config, { branding: { tagline: 'Best in town' } });\n```\n\n## API Reference\n\n### `createWebsiteBuilder(config)`\n\nCreates a wired `SiteBuilder` instance.\n\n```typescript\nfunction createWebsiteBuilder(config: WebsiteBuilderSuiteConfig): SiteBuilder\n```\n\n`WebsiteBuilderSuiteConfig`:\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `store` | `SiteConfigStore` | ✅ | Persistence adapter (InMemory or Prisma) |\n| `dataReaders` | `DataReaderMap` | ❌ | Live section data readers |\n| `storage` | `StorageAdapter` | ❌ | Logo upload adapter |\n| `tenantResolver` | `TenantResolverStrategy` | ❌ | Custom slug → tenantId strategy |\n| `neverhub` | `{ enabled?: boolean }` | ❌ | NeverHub integration |\n\n### `WebsiteBuilderSuiteError`\n\nError class for suite-level failures.\n\n```typescript\nclass WebsiteBuilderSuiteError extends Error {\n  readonly code: string;                    // Error code (e.g., 'MISSING_STORE')\n  readonly context?: Record<string, unknown>;\n  // cause is ES2022 Error.cause\n}\n```\n\n## Re-exports\n\nAll exports from sub-packages are available from a single import:\n\n```typescript\nimport {\n  // Factory\n  createWebsiteBuilder, WebsiteBuilderSuiteError,\n  // Store\n  InMemorySiteConfigStore,\n  // Config helpers\n  validate, defaultConfig, completenessScore, toCssVariables, mergeConfigs, diffConfigs,\n  // UI components\n  SitePreviewCard, SiteFramePreview, ThemeSwatches, CompletenessBar, useSitePreview,\n  // Plugin\n  WebsiteBuilderPlugin,\n} from '@bernierllc/website-builder-suite';\n```\n\n## MECE Boundary: `content-management-suite`\n\nThis package manages **tenant business profiles**: theme, branding, section layout, and publish lifecycle.\n\n`@bernierllc/content-management-suite` manages **editorial content**: CMS articles, blog posts, editorial workflows, and Contentful/Prisma CMS adapters.\n\nThese are distinct data domains. A production application may use both simultaneously — CMS manages blog posts, website builder manages the business profile that frames them.\n\n## NeverHub Integration\n\n`SiteBuilder` registers site-management capabilities with NeverHub on `initialize()` when enabled. Events emitted: `site.config.updated`, `site.published`. All operations degrade gracefully when NeverHub is absent or disabled.\n\n## License\n\nCopyright (c) 2025 Bernier LLC. Licensed for use within the delivered project only.\n","readmeFilename":"README.md"}