@burdenoff/website-sdk 2026.1031.3 → 2026.1101.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -8
- package/dist/analytics/index.js +19 -69
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +3 -69
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/avatar-live/index.js +1 -0
- package/dist/avatar-live/index.js.map +1 -1
- package/dist/avatar-live/index.mjs +1 -0
- package/dist/avatar-live/index.mjs.map +1 -1
- package/dist/avatar-live-view/index.js +10 -30
- package/dist/avatar-live-view/index.js.map +1 -1
- package/dist/avatar-live-view/index.mjs +4 -24
- package/dist/avatar-live-view/index.mjs.map +1 -1
- package/dist/chunk-23H4JUL4.js +41 -0
- package/dist/chunk-23H4JUL4.js.map +1 -0
- package/dist/chunk-34RX5P75.mjs +25 -0
- package/dist/chunk-34RX5P75.mjs.map +1 -0
- package/dist/chunk-3LFFY7AZ.js +184 -0
- package/dist/chunk-3LFFY7AZ.js.map +1 -0
- package/dist/chunk-3X26GE4S.js +2794 -0
- package/dist/chunk-3X26GE4S.js.map +1 -0
- package/dist/chunk-45GCA4GG.js +85 -0
- package/dist/chunk-45GCA4GG.js.map +1 -0
- package/dist/chunk-4SAGVLHN.js +876 -0
- package/dist/chunk-4SAGVLHN.js.map +1 -0
- package/dist/chunk-4U6YAII5.js +218 -0
- package/dist/chunk-4U6YAII5.js.map +1 -0
- package/dist/chunk-5GMTBOO6.js +21 -0
- package/dist/chunk-5GMTBOO6.js.map +1 -0
- package/dist/chunk-5JRJ57CL.mjs +329 -0
- package/dist/chunk-5JRJ57CL.mjs.map +1 -0
- package/dist/chunk-6C2DKIC7.js +4 -0
- package/dist/chunk-6C2DKIC7.js.map +1 -0
- package/dist/chunk-6IBFBWC5.mjs +17 -0
- package/dist/chunk-6IBFBWC5.mjs.map +1 -0
- package/dist/chunk-6KY2ZRVI.js +116 -0
- package/dist/chunk-6KY2ZRVI.js.map +1 -0
- package/dist/chunk-6VJT3SM4.mjs +182 -0
- package/dist/chunk-6VJT3SM4.mjs.map +1 -0
- package/dist/chunk-6YZUFMK2.mjs +40 -0
- package/dist/chunk-6YZUFMK2.mjs.map +1 -0
- package/dist/chunk-7A6R7CGG.js +47 -0
- package/dist/chunk-7A6R7CGG.js.map +1 -0
- package/dist/chunk-7PWL4V2R.js +4 -0
- package/dist/chunk-7PWL4V2R.js.map +1 -0
- package/dist/chunk-AA33WDYS.js +161 -0
- package/dist/chunk-AA33WDYS.js.map +1 -0
- package/dist/chunk-AHRGFXV2.js +525 -0
- package/dist/chunk-AHRGFXV2.js.map +1 -0
- package/dist/chunk-B63XLDZH.mjs +109 -0
- package/dist/chunk-B63XLDZH.mjs.map +1 -0
- package/dist/chunk-BX2USEWF.mjs +35 -0
- package/dist/chunk-BX2USEWF.mjs.map +1 -0
- package/dist/chunk-BYSZT35R.js +150 -0
- package/dist/chunk-BYSZT35R.js.map +1 -0
- package/dist/chunk-C6OJIHNO.js +12 -0
- package/dist/chunk-C6OJIHNO.js.map +1 -0
- package/dist/chunk-COOELBX7.mjs +63 -0
- package/dist/chunk-COOELBX7.mjs.map +1 -0
- package/dist/chunk-D2TW7MNC.mjs +2771 -0
- package/dist/chunk-D2TW7MNC.mjs.map +1 -0
- package/dist/chunk-D5KEZ6V6.mjs +3 -0
- package/dist/chunk-D5KEZ6V6.mjs.map +1 -0
- package/dist/chunk-E3GUGJMY.js +46 -0
- package/dist/chunk-E3GUGJMY.js.map +1 -0
- package/dist/chunk-EBZ2HGJ2.mjs +52 -0
- package/dist/chunk-EBZ2HGJ2.mjs.map +1 -0
- package/dist/chunk-EDLTUOIA.mjs +210 -0
- package/dist/chunk-EDLTUOIA.mjs.map +1 -0
- package/dist/chunk-EJQSOT4X.js +4 -0
- package/dist/chunk-EJQSOT4X.js.map +1 -0
- package/dist/chunk-EUPFS6MZ.mjs +2019 -0
- package/dist/chunk-EUPFS6MZ.mjs.map +1 -0
- package/dist/chunk-F3XWDC3B.js +77 -0
- package/dist/chunk-F3XWDC3B.js.map +1 -0
- package/dist/chunk-FFADMVIK.mjs +5127 -0
- package/dist/chunk-FFADMVIK.mjs.map +1 -0
- package/dist/chunk-FJWS7BKT.mjs +3 -0
- package/dist/chunk-FJWS7BKT.mjs.map +1 -0
- package/dist/chunk-FJZJDUOR.mjs +3 -0
- package/dist/chunk-FJZJDUOR.mjs.map +1 -0
- package/dist/chunk-GCFLCO2Z.mjs +145 -0
- package/dist/chunk-GCFLCO2Z.mjs.map +1 -0
- package/dist/chunk-GEXC4LRP.js +61 -0
- package/dist/chunk-GEXC4LRP.js.map +1 -0
- package/dist/chunk-GTRAXQGC.mjs +3 -0
- package/dist/chunk-GTRAXQGC.mjs.map +1 -0
- package/dist/chunk-IKOIRUKW.js +270 -0
- package/dist/chunk-IKOIRUKW.js.map +1 -0
- package/dist/chunk-IXTWOPRN.js +45 -0
- package/dist/chunk-IXTWOPRN.js.map +1 -0
- package/dist/chunk-JDXOXGOK.js +547 -0
- package/dist/chunk-JDXOXGOK.js.map +1 -0
- package/dist/chunk-JSLDWYV7.mjs +558 -0
- package/dist/chunk-JSLDWYV7.mjs.map +1 -0
- package/dist/chunk-JXLSTVBK.js +336 -0
- package/dist/chunk-JXLSTVBK.js.map +1 -0
- package/dist/chunk-KHYXK7FG.mjs +49 -0
- package/dist/chunk-KHYXK7FG.mjs.map +1 -0
- package/dist/chunk-KSMBOWQQ.js +2034 -0
- package/dist/chunk-KSMBOWQQ.js.map +1 -0
- package/dist/chunk-KU2PXHGB.mjs +83 -0
- package/dist/chunk-KU2PXHGB.mjs.map +1 -0
- package/dist/chunk-KZANIV3S.mjs +37 -0
- package/dist/chunk-KZANIV3S.mjs.map +1 -0
- package/dist/chunk-L4BP6YOB.js +20 -0
- package/dist/chunk-L4BP6YOB.js.map +1 -0
- package/dist/chunk-MRKA2OAF.mjs +75 -0
- package/dist/chunk-MRKA2OAF.mjs.map +1 -0
- package/dist/chunk-N5EC53MH.mjs +80 -0
- package/dist/chunk-N5EC53MH.mjs.map +1 -0
- package/dist/chunk-NZANQGDM.mjs +34 -0
- package/dist/chunk-NZANQGDM.mjs.map +1 -0
- package/dist/chunk-O4GS3XPZ.js +10 -0
- package/dist/chunk-O4GS3XPZ.js.map +1 -0
- package/dist/chunk-O76QDGRM.js +5154 -0
- package/dist/chunk-O76QDGRM.js.map +1 -0
- package/dist/chunk-OYEUNZJY.js +114 -0
- package/dist/chunk-OYEUNZJY.js.map +1 -0
- package/dist/chunk-PHXAGQNB.js +74 -0
- package/dist/chunk-PHXAGQNB.js.map +1 -0
- package/dist/chunk-PIHHPP7J.mjs +16 -0
- package/dist/chunk-PIHHPP7J.mjs.map +1 -0
- package/dist/chunk-PXRHVVOU.mjs +499 -0
- package/dist/chunk-PXRHVVOU.mjs.map +1 -0
- package/dist/chunk-QMA6U6AU.js +36 -0
- package/dist/chunk-QMA6U6AU.js.map +1 -0
- package/dist/chunk-R6J7IULF.js +44 -0
- package/dist/chunk-R6J7IULF.js.map +1 -0
- package/dist/chunk-R7G6TWIS.mjs +10 -0
- package/dist/chunk-R7G6TWIS.mjs.map +1 -0
- package/dist/chunk-RUMGFI6L.mjs +544 -0
- package/dist/chunk-RUMGFI6L.mjs.map +1 -0
- package/dist/chunk-S54JWSJF.js +565 -0
- package/dist/chunk-S54JWSJF.js.map +1 -0
- package/dist/chunk-SK5UGG6A.js +2041 -0
- package/dist/chunk-SK5UGG6A.js.map +1 -0
- package/dist/chunk-SKIYDKIS.mjs +70 -0
- package/dist/chunk-SKIYDKIS.mjs.map +1 -0
- package/dist/chunk-SZNS5IK6.mjs +322 -0
- package/dist/chunk-SZNS5IK6.mjs.map +1 -0
- package/dist/chunk-T7JIPZAC.js +66 -0
- package/dist/chunk-T7JIPZAC.js.map +1 -0
- package/dist/chunk-TGYQHO2E.mjs +864 -0
- package/dist/chunk-TGYQHO2E.mjs.map +1 -0
- package/dist/chunk-TT3MHN42.mjs +8 -0
- package/dist/chunk-TT3MHN42.mjs.map +1 -0
- package/dist/chunk-UM55U65W.mjs +268 -0
- package/dist/chunk-UM55U65W.mjs.map +1 -0
- package/dist/chunk-UQ2HALUD.js +72 -0
- package/dist/chunk-UQ2HALUD.js.map +1 -0
- package/dist/chunk-UXWT7G77.js +82 -0
- package/dist/chunk-UXWT7G77.js.map +1 -0
- package/dist/chunk-VNS5WDWO.mjs +7 -0
- package/dist/chunk-VNS5WDWO.mjs.map +1 -0
- package/dist/chunk-VRWZLGR7.js +4 -0
- package/dist/chunk-VRWZLGR7.js.map +1 -0
- package/dist/chunk-VZLDSNH4.mjs +22 -0
- package/dist/chunk-VZLDSNH4.mjs.map +1 -0
- package/dist/chunk-W6P3YETJ.js +92 -0
- package/dist/chunk-W6P3YETJ.js.map +1 -0
- package/dist/chunk-WPKFFQCR.mjs +90 -0
- package/dist/chunk-WPKFFQCR.mjs.map +1 -0
- package/dist/chunk-WTVTI5TO.mjs +22 -0
- package/dist/chunk-WTVTI5TO.mjs.map +1 -0
- package/dist/chunk-XJOBZ4RJ.js +44 -0
- package/dist/chunk-XJOBZ4RJ.js.map +1 -0
- package/dist/chunk-XP2JDNDU.js +325 -0
- package/dist/chunk-XP2JDNDU.js.map +1 -0
- package/dist/chunk-Y4V5CEWD.mjs +112 -0
- package/dist/chunk-Y4V5CEWD.mjs.map +1 -0
- package/dist/chunk-YERN2UWM.js +116 -0
- package/dist/chunk-YERN2UWM.js.map +1 -0
- package/dist/chunk-ZKJQWFAA.mjs +114 -0
- package/dist/chunk-ZKJQWFAA.mjs.map +1 -0
- package/dist/chunk-ZOON3S3Y.mjs +138 -0
- package/dist/chunk-ZOON3S3Y.mjs.map +1 -0
- package/dist/chunk-ZP6QRAYC.mjs +2024 -0
- package/dist/chunk-ZP6QRAYC.mjs.map +1 -0
- package/dist/chunk-ZSTFX7FV.js +9 -0
- package/dist/chunk-ZSTFX7FV.js.map +1 -0
- package/dist/client/index.js +23 -331
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +3 -330
- package/dist/client/index.mjs.map +1 -1
- package/dist/comparison/index.js +28 -111
- package/dist/comparison/index.js.map +1 -1
- package/dist/comparison/index.mjs +2 -107
- package/dist/comparison/index.mjs.map +1 -1
- package/dist/components/contact.js +21 -931
- package/dist/components/contact.js.map +1 -1
- package/dist/components/contact.mjs +12 -909
- package/dist/components/contact.mjs.map +1 -1
- package/dist/components/electron-download.js +12 -124
- package/dist/components/electron-download.js.map +1 -1
- package/dist/components/electron-download.mjs +4 -106
- package/dist/components/electron-download.mjs.map +1 -1
- package/dist/components/explore-cta.js +8 -112
- package/dist/components/explore-cta.js.map +1 -1
- package/dist/components/explore-cta.mjs +3 -114
- package/dist/components/explore-cta.mjs.map +1 -1
- package/dist/components/explore.js +62 -7833
- package/dist/components/explore.js.map +1 -1
- package/dist/components/explore.mjs +13 -7800
- package/dist/components/explore.mjs.map +1 -1
- package/dist/components/launch-countdown.js +8 -83
- package/dist/components/launch-countdown.js.map +1 -1
- package/dist/components/launch-countdown.mjs +3 -85
- package/dist/components/launch-countdown.mjs.map +1 -1
- package/dist/components/newsletter.js +20 -993
- package/dist/components/newsletter.js.map +1 -1
- package/dist/components/newsletter.mjs +11 -971
- package/dist/components/newsletter.mjs.map +1 -1
- package/dist/components/partners.js +24 -1302
- package/dist/components/partners.js.map +1 -1
- package/dist/components/partners.mjs +15 -1276
- package/dist/components/partners.mjs.map +1 -1
- package/dist/components/pricing.js +49 -1249
- package/dist/components/pricing.js.map +1 -1
- package/dist/components/pricing.mjs +8 -1226
- package/dist/components/pricing.mjs.map +1 -1
- package/dist/components/problems-solved.js +8 -150
- package/dist/components/problems-solved.js.map +1 -1
- package/dist/components/problems-solved.mjs +4 -133
- package/dist/components/problems-solved.mjs.map +1 -1
- package/dist/components/resource-links.js +8 -304
- package/dist/components/resource-links.js.map +1 -1
- package/dist/components/resource-links.mjs +5 -308
- package/dist/components/resource-links.mjs.map +1 -1
- package/dist/components/social-links.js +8 -343
- package/dist/components/social-links.js.map +1 -1
- package/dist/components/social-links.mjs +5 -347
- package/dist/components/social-links.mjs.map +1 -1
- package/dist/components/unsubscribe.js +10 -627
- package/dist/components/unsubscribe.js.map +1 -1
- package/dist/components/unsubscribe.mjs +6 -611
- package/dist/components/unsubscribe.mjs.map +1 -1
- package/dist/components/waitlist.js +21 -1001
- package/dist/components/waitlist.js.map +1 -1
- package/dist/components/waitlist.mjs +12 -982
- package/dist/components/waitlist.mjs.map +1 -1
- package/dist/components/website-switcher.js +12 -175
- package/dist/components/website-switcher.js.map +1 -1
- package/dist/components/website-switcher.mjs +4 -157
- package/dist/components/website-switcher.mjs.map +1 -1
- package/dist/content/index.js +118 -3616
- package/dist/content/index.js.map +1 -1
- package/dist/content/index.mjs +12 -3567
- package/dist/content/index.mjs.map +1 -1
- package/dist/hooks/index.js +37 -2321
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +6 -2318
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/index.js +4145 -20599
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3766 -20567
- package/dist/index.mjs.map +1 -1
- package/dist/product/index.js +20 -393
- package/dist/product/index.js.map +1 -1
- package/dist/product/index.mjs +5 -394
- package/dist/product/index.mjs.map +1 -1
- package/dist/seo/index.js +8 -76
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +3 -78
- package/dist/seo/index.mjs.map +1 -1
- package/dist/store/index.js +51 -2650
- package/dist/store/index.js.map +1 -1
- package/dist/store/index.mjs +13 -2619
- package/dist/store/index.mjs.map +1 -1
- package/dist/utils/index.js +69 -134
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +5 -122
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/content/legal.tsx","../src/content/job-postings.tsx","../src/content/blog.tsx","../src/content/case-studies.tsx","../src/content/changelog.tsx","../src/content/utils.ts","../src/content/press-kit.tsx","../src/content/contracts.tsx"],"names":["document","useContentPage","jsxs","jsx","ProseStyles","PageHead","ContentRenderer","useWebSDK","useWebSDKConfig","useProduct","useState","useCallback","useEffect","Fragment","useMemo","formatDate","Search","Input","cn","Button","ChevronLeft","ChevronRight","History"],"mappings":"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","file":"chunk-3X26GE4S.js","sourcesContent":["\"use client\";\n\n/**\n * Legal pages\n *\n * One shared source for every product website's legal documents: privacy,\n * terms, cookies, refunds, acceptable use, the Data Processing Addendum, the\n * AI Product Terms and the subprocessor list.\n *\n * The text lives in the global CMS (`ProductContentPage` in the global tenant\n * service). A product either has its own row for a slug or falls back to the\n * global template, whose `{{productName}}`-style placeholders are filled in\n * by `publicResolvedContentPage`. That is why everything here reads the\n * RESOLVED query: the unresolved one returns raw placeholders for the\n * fallback templates.\n *\n * Two ways to use it:\n *\n * 1. Build time (recommended for prerendered sites): call\n * {@link fetchLegalContent} from a build script, write the result to JSON,\n * and pass each entry to `<LegalPage initialContent={…} />`. The page then\n * renders its final HTML with no request and no layout shift.\n * 2. Run time: `<LegalPage document=\"dpa\" />` fetches the page through the\n * `WebSDKProvider` client.\n *\n * @example\n * ```tsx\n * import { LegalPage } from '@burdenoff/website-sdk'\n * import legal from '@/data/legal-content.json'\n *\n * <Route\n * path=\"/dpa\"\n * element={<LegalPage document=\"dpa\" initialContent={legal['data-processing-addendum']} />}\n * />\n * ```\n */\n\nimport { ContentRenderer, useContentPage } from \"./content-provider\";\nimport { ProseStyles } from \"./prose-styles\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// Document registry\n// ============================================================================\n\n/** The legal documents every product website is expected to publish. */\nexport type LegalDocumentKey =\n | \"privacy\"\n | \"terms\"\n | \"cookies\"\n | \"refunds\"\n | \"aup\"\n | \"dpa\"\n | \"ai-terms\"\n | \"subprocessors\";\n\nexport interface LegalDocument {\n key: LegalDocumentKey;\n /** CMS slug (`ProductContentPage.slug`), shared by every product. */\n slug: string;\n /** Title used when the CMS row has none, or cannot be loaded. */\n title: string;\n /** Meta description used when the CMS row has no `seoDescription`. */\n description: string;\n}\n\n/**\n * Canonical CMS slugs for the legal set. Website routes may differ per site\n * (`/privacy` or `/legal/privacy`); the slug never does.\n */\nexport const LEGAL_DOCUMENTS: Readonly<\n Record<LegalDocumentKey, LegalDocument>\n> = {\n privacy: {\n key: \"privacy\",\n slug: \"privacy-policy\",\n title: \"Privacy Policy\",\n description:\n \"How we collect, use, share and protect your personal information.\",\n },\n terms: {\n key: \"terms\",\n slug: \"terms-of-service\",\n title: \"Terms of Service\",\n description: \"The terms that govern your use of the service.\",\n },\n cookies: {\n key: \"cookies\",\n slug: \"cookie-policy\",\n title: \"Cookie Policy\",\n description: \"The cookies and similar technologies we use, and why.\",\n },\n refunds: {\n key: \"refunds\",\n slug: \"refund-policy\",\n title: \"Refund Policy\",\n description: \"How cancellations and refunds work for paid plans.\",\n },\n aup: {\n key: \"aup\",\n slug: \"acceptable-use-policy\",\n title: \"Acceptable Use Policy\",\n description: \"What you may and may not do with the service.\",\n },\n dpa: {\n key: \"dpa\",\n slug: \"data-processing-addendum\",\n title: \"Data Processing Addendum\",\n description:\n \"Our obligations as a processor of personal data on your behalf.\",\n },\n \"ai-terms\": {\n key: \"ai-terms\",\n slug: \"ai-product-terms\",\n title: \"AI Product Terms\",\n description:\n \"The terms that apply to AI features, including how your data is and is not used.\",\n },\n subprocessors: {\n key: \"subprocessors\",\n slug: \"subprocessors\",\n title: \"Subprocessors\",\n description:\n \"The third parties that help us host, secure and support the service.\",\n },\n};\n\n/** Every legal document key, in display order. */\nexport const LEGAL_DOCUMENT_KEYS: readonly LegalDocumentKey[] = Object.keys(\n LEGAL_DOCUMENTS,\n) as LegalDocumentKey[];\n\n/** Look up a legal document by its key or its CMS slug. */\nexport function findLegalDocument(keyOrSlug: string): LegalDocument | null {\n if (Object.prototype.hasOwnProperty.call(LEGAL_DOCUMENTS, keyOrSlug)) {\n return LEGAL_DOCUMENTS[keyOrSlug as LegalDocumentKey];\n }\n return (\n Object.values(LEGAL_DOCUMENTS).find((doc) => doc.slug === keyOrSlug) ?? null\n );\n}\n\n// ============================================================================\n// Content fetching\n// ============================================================================\n\n/** A legal page as fetched from the CMS (and as stored in build-time JSON). */\nexport interface LegalContentEntry {\n title: string;\n slug: string;\n content: string;\n contentFormat: string;\n seoTitle?: string | null;\n seoDescription?: string | null;\n seoKeywords?: string | null;\n lastUpdated?: string | null;\n}\n\nconst LEGAL_CONTENT_QUERY = `\n query PublicLegalContentPage($slug: String!, $productId: String!) {\n publicResolvedContentPage(slug: $slug, productId: $productId) {\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n }\n }\n`;\n\n/**\n * Fetch one legal page for a product. `productId` may be the product UUID or\n * its slug. Resolves to `null` when neither the product nor the global\n * template has the page; rejects on GraphQL or transport errors, so a build\n * script can keep its previous cache instead of publishing an empty page.\n */\nexport async function fetchLegalContentPage(\n client: WebSDKClient,\n slug: string,\n productId: string,\n): Promise<LegalContentEntry | null> {\n const result = await client.query<{\n publicResolvedContentPage: LegalContentEntry | null;\n }>(LEGAL_CONTENT_QUERY, { slug, productId }, { cache: false });\n if (result.errors?.length) {\n throw new Error(result.errors[0]?.message ?? \"Unknown error\");\n }\n return result.data?.publicResolvedContentPage ?? null;\n}\n\nexport interface FetchLegalContentOptions {\n /** Product UUID or slug. */\n productId: string;\n /** Documents to fetch. Defaults to the full legal set. */\n documents?: readonly LegalDocumentKey[];\n}\n\n/**\n * Fetch a product's legal pages, keyed by CMS slug. Pages the CMS does not\n * have are `null`. Rejects if any request fails, so callers never mistake an\n * outage for a missing page.\n *\n * @example\n * ```ts\n * // scripts/fetch-legal-content.ts (build time)\n * const client = new WebSDKClient({\n * gatewayUrl: 'https://graphql.burdenoff.com/global/graphql',\n * productId: 'vibecontrols',\n * })\n * const pages = await fetchLegalContent(client, { productId: 'vibecontrols' })\n * writeFileSync('src/data/legal-content.json', JSON.stringify(pages, null, 2))\n * ```\n */\nexport async function fetchLegalContent(\n client: WebSDKClient,\n options: FetchLegalContentOptions,\n): Promise<Record<string, LegalContentEntry | null>> {\n const docs = (options.documents ?? LEGAL_DOCUMENT_KEYS).map(\n (key) => LEGAL_DOCUMENTS[key],\n );\n const entries = await Promise.all(\n docs.map(\n async (doc) =>\n [\n doc.slug,\n await fetchLegalContentPage(client, doc.slug, options.productId),\n ] as const,\n ),\n );\n return Object.fromEntries(entries);\n}\n\n// ============================================================================\n// Rendering helpers\n// ============================================================================\n\n/**\n * Split a leading `# Heading` off markdown content. The CMS documents start\n * with their own H1; the page renders the title itself, so keeping both would\n * put two H1s on the page.\n */\nexport function splitLeadingHeading(\n content: string,\n format: string,\n): { heading: string | null; body: string } {\n if (format.toLowerCase() !== \"markdown\")\n return { heading: null, body: content };\n const match = /^\\s*#[ \\t]+([^\\n]+?)[ \\t#]*(?:\\n|$)/.exec(content);\n if (!match?.[1]) return { heading: null, body: content };\n return {\n heading: match[1].trim(),\n body: content.slice(match[0].length).replace(/^\\s+/, \"\"),\n };\n}\n\n/**\n * Format an ISO date as \"October 21, 2026\". UTC, so prerendered HTML and the\n * hydrated page agree whatever the visitor's time zone. Returns `null` for a\n * missing or unparsable date.\n */\nexport function formatLegalDate(iso: string | null | undefined): string | null {\n if (!iso) return null;\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return null;\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n timeZone: \"UTC\",\n });\n}\n\n// ============================================================================\n// LegalPage\n// ============================================================================\n\nexport interface LegalPageProps {\n /** Which legal document to show. Use `slug` instead for a non-standard page. */\n document?: LegalDocumentKey;\n /** CMS slug, for a page outside {@link LEGAL_DOCUMENTS}. Ignored when `document` is set. */\n slug?: string;\n /**\n * Content fetched at build time (see {@link fetchLegalContent}). When this\n * prop is present the page makes no request; pass `null` for a page the\n * build found missing.\n */\n initialContent?: LegalContentEntry | null;\n /** Overrides the registry title used when the CMS row has none. */\n fallbackTitle?: string;\n /** Overrides the registry description used when the CMS row has none. */\n fallbackDescription?: string;\n /** Product/brand name appended to the browser title. */\n productName?: string;\n /** Canonical URL of this page. */\n canonicalUrl?: string;\n /** Address shown when the document cannot be loaded. */\n contactEmail?: string;\n className?: string;\n}\n\nexport function LegalPage(props: LegalPageProps) {\n const {\n document,\n slug: slugProp,\n initialContent,\n fallbackTitle,\n fallbackDescription,\n productName,\n canonicalUrl,\n contactEmail,\n className = \"\",\n } = props;\n\n const registered = document\n ? LEGAL_DOCUMENTS[document]\n : slugProp\n ? findLegalDocument(slugProp)\n : null;\n const slug = registered?.slug ?? slugProp ?? \"\";\n const prefetched = initialContent !== undefined;\n\n const { data: fetched, loading } = useContentPage(slug, {\n resolve: true,\n enabled: !prefetched && slug !== \"\",\n });\n\n const page: LegalContentEntry | null = prefetched\n ? (initialContent ?? null)\n : fetched;\n const isLoading = !prefetched && slug !== \"\" && loading;\n\n const defaultTitle = fallbackTitle ?? registered?.title ?? \"Legal\";\n const defaultDescription =\n fallbackDescription ?? registered?.description ?? \"\";\n\n const { heading, body } = page\n ? splitLeadingHeading(page.content, page.contentFormat)\n : { heading: null, body: \"\" };\n const title = page?.title || heading || defaultTitle;\n const updated = formatLegalDate(page?.lastUpdated);\n const unavailable = !isLoading && !page;\n\n return (\n <div className={`w-full ${className}`}>\n <ProseStyles />\n <PageHead\n title={page?.seoTitle || title}\n description={page?.seoDescription?.trim() || defaultDescription}\n keywords={page?.seoKeywords ?? undefined}\n productName={productName}\n url={canonicalUrl}\n robots={unavailable ? \"noindex, follow\" : undefined}\n />\n\n <article\n className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-16 sm:py-24\"\n aria-busy={isLoading}\n >\n <h1 className=\"text-3xl sm:text-4xl font-bold tracking-tight text-foreground mb-3\">\n {title}\n </h1>\n {updated && (\n <p className=\"text-sm text-muted-foreground mb-10\">\n Last updated:{\" \"}\n <time dateTime={page?.lastUpdated ?? undefined}>{updated}</time>\n </p>\n )}\n\n {isLoading ? (\n <div className=\"space-y-3\" data-testid=\"legal-page-loading\">\n <div className=\"h-4 w-3/4 rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-full rounded bg-muted animate-pulse\" />\n <div className=\"h-4 w-5/6 rounded bg-muted animate-pulse\" />\n </div>\n ) : page ? (\n <div className=\"boff-prose max-w-none\">\n <ContentRenderer content={body} format={page.contentFormat} />\n </div>\n ) : (\n <div\n role=\"status\"\n className=\"rounded-xl border border-border bg-muted/30 p-6\"\n >\n <p className=\"text-base text-foreground\">\n This document is not available right now.\n </p>\n {contactEmail && (\n <p className=\"mt-2 text-sm text-muted-foreground\">\n For a copy, contact{\" \"}\n <a\n className=\"text-primary underline\"\n href={`mailto:${contactEmail}`}\n >\n {contactEmail}\n </a>\n .\n </p>\n )}\n </div>\n )}\n </article>\n </div>\n );\n}\n","/**\n * Public Job Postings\n *\n * React hooks and fetch helpers for reading public job postings from the\n * global support service (global public gateway — no auth). Mirrors the\n * content-provider pattern: plain fetch via WebSDKClient, 5-minute query\n * cache from the client, loading/error/empty states settled by the hooks.\n */\n\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\nimport type { CareersPostingOption } from \"../components/careers\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PublicInterviewRoundConfig {\n roundNumber: number;\n name: string;\n /** Round type enum from the backend (PHONE_SCREEN, TECHNICAL, …) as a string. */\n roundType: string;\n isRequired: boolean;\n description?: string | null;\n}\n\nexport interface PublicJobPosting {\n id: string;\n slug: string;\n title: string;\n department?: string | null;\n location?: string | null;\n employmentType?: string | null;\n openings?: number | null;\n description?: string | null;\n overview?: string | null;\n responsibilities: string[];\n learnings: string[];\n qualifications: string[];\n rounds: PublicInterviewRoundConfig[];\n}\n\nexport interface UsePublicJobPostingsOptions {\n /** Product ID override (falls back to product context / SDK config). */\n productId?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface UsePublicJobPostingOptions {\n /** Product ID override (falls back to product context / SDK config). */\n productId?: string;\n}\n\n// ============================================================================\n// GraphQL Queries\n// ============================================================================\n\nconst PUBLIC_JOB_POSTING_FIELDS = /* GraphQL */ `\n id\n slug\n title\n department\n location\n employmentType\n openings\n description\n overview\n responsibilities\n learnings\n qualifications\n rounds {\n roundNumber\n name\n roundType\n isRequired\n description\n }\n`;\n\nconst PUBLIC_JOB_POSTINGS_QUERY = /* GraphQL */ `\n query PublicJobPostings($productId: ID, $limit: Int, $offset: Int) {\n publicJobPostings(productId: $productId, limit: $limit, offset: $offset) {\n ${PUBLIC_JOB_POSTING_FIELDS}\n }\n }\n`;\n\nconst PUBLIC_JOB_POSTING_QUERY = /* GraphQL */ `\n query PublicJobPosting($slug: String!, $productId: ID) {\n publicJobPosting(slug: $slug, productId: $productId) {\n ${PUBLIC_JOB_POSTING_FIELDS}\n }\n }\n`;\n\n// Deliberately id/title only — this backs the assignment-submission position\n// picker, which (unlike `publicJobPostings`) must also list CLOSED postings\n// so a candidate can still find the exact role they applied to after it\n// stops accepting new applicants.\nconst PUBLIC_JOB_POSTINGS_FOR_SUBMISSION_QUERY = /* GraphQL */ `\n query PublicJobPostingsForSubmission(\n $productId: ID\n $limit: Int\n $offset: Int\n ) {\n publicJobPostingsForSubmission(\n productId: $productId\n limit: $limit\n offset: $offset\n ) {\n id\n title\n }\n }\n`;\n\n// ============================================================================\n// Fetch helpers\n// ============================================================================\n\n/**\n * Fetch the list of public job postings for a product.\n * Throws on GraphQL/transport errors so callers can settle an error state.\n */\nexport async function fetchPublicJobPostings(\n client: WebSDKClient,\n options?: UsePublicJobPostingsOptions,\n): Promise<PublicJobPosting[]> {\n const result = await client.query<{\n publicJobPostings: PublicJobPosting[];\n }>(PUBLIC_JOB_POSTINGS_QUERY, {\n productId: options?.productId,\n limit: options?.limit ?? 50,\n offset: options?.offset ?? 0,\n });\n\n if (result.errors?.length) {\n throw new Error(result.errors[0]?.message ?? \"Unknown error\");\n }\n return result.data?.publicJobPostings ?? [];\n}\n\n/**\n * Fetch a single public job posting by slug. Returns `null` when the posting\n * does not exist; throws on GraphQL/transport errors.\n */\nexport async function fetchPublicJobPosting(\n client: WebSDKClient,\n slug: string,\n options?: UsePublicJobPostingOptions,\n): Promise<PublicJobPosting | null> {\n const result = await client.query<{\n publicJobPosting: PublicJobPosting | null;\n }>(PUBLIC_JOB_POSTING_QUERY, {\n slug,\n productId: options?.productId,\n });\n\n if (result.errors?.length) {\n throw new Error(result.errors[0]?.message ?? \"Unknown error\");\n }\n return result.data?.publicJobPosting ?? null;\n}\n\n/**\n * Fetch OPEN + CLOSED postings (id/title only) for the assignment-submission\n * position picker. Throws on GraphQL/transport errors so callers can settle\n * an error state.\n */\nexport async function fetchPublicJobPostingsForSubmission(\n client: WebSDKClient,\n options?: UsePublicJobPostingsOptions,\n): Promise<CareersPostingOption[]> {\n const result = await client.query<{\n publicJobPostingsForSubmission: CareersPostingOption[];\n }>(PUBLIC_JOB_POSTINGS_FOR_SUBMISSION_QUERY, {\n productId: options?.productId,\n limit: options?.limit ?? 50,\n offset: options?.offset ?? 0,\n });\n\n if (result.errors?.length) {\n throw new Error(result.errors[0]?.message ?? \"Unknown error\");\n }\n return result.data?.publicJobPostingsForSubmission ?? [];\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to fetch the public job postings for the current product.\n *\n * @example\n * ```tsx\n * const { postings, loading, error } = usePublicJobPostings({ limit: 20 });\n * ```\n */\nexport function usePublicJobPostings(options?: UsePublicJobPostingsOptions): {\n postings: PublicJobPosting[];\n loading: boolean;\n error: string | null;\n refetch: () => void;\n} {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId =\n options?.productId ?? product?.id ?? config.productId;\n const [postings, setPostings] = useState<PublicJobPosting[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPostings = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const items = await fetchPublicJobPostings(client, {\n productId: resolvedProductId,\n limit: options?.limit,\n offset: options?.offset,\n });\n setPostings(items);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to fetch job postings\",\n );\n setPostings([]);\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, options?.limit, options?.offset]);\n\n useEffect(() => {\n fetchPostings();\n }, [fetchPostings]);\n\n return { postings, loading, error, refetch: fetchPostings };\n}\n\n/**\n * Hook to fetch postings (OPEN + CLOSED, id/title only) for the\n * assignment-submission position picker — a candidate must still be able to\n * select the role they applied to after it closes to new applicants.\n *\n * @example\n * ```tsx\n * const { postings, loading, error } = usePublicJobPostingsForSubmission();\n * ```\n */\nexport function usePublicJobPostingsForSubmission(\n options?: UsePublicJobPostingsOptions,\n): {\n postings: CareersPostingOption[];\n loading: boolean;\n error: string | null;\n refetch: () => void;\n} {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId =\n options?.productId ?? product?.id ?? config.productId;\n const [postings, setPostings] = useState<CareersPostingOption[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPostings = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const items = await fetchPublicJobPostingsForSubmission(client, {\n productId: resolvedProductId,\n limit: options?.limit,\n offset: options?.offset,\n });\n setPostings(items);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to fetch job postings\",\n );\n setPostings([]);\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, options?.limit, options?.offset]);\n\n useEffect(() => {\n fetchPostings();\n }, [fetchPostings]);\n\n return { postings, loading, error, refetch: fetchPostings };\n}\n\n/**\n * Hook to fetch a single public job posting by slug.\n *\n * @example\n * ```tsx\n * const { posting, loading, error } = usePublicJobPosting('senior-engineer');\n * ```\n */\nexport function usePublicJobPosting(\n slug: string,\n options?: UsePublicJobPostingOptions,\n): {\n posting: PublicJobPosting | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n} {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId =\n options?.productId ?? product?.id ?? config.productId;\n const [posting, setPosting] = useState<PublicJobPosting | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPosting = useCallback(async () => {\n if (!slug) {\n setPosting(null);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const item = await fetchPublicJobPosting(client, slug, {\n productId: resolvedProductId,\n });\n setPosting(item);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to fetch job posting\",\n );\n setPosting(null);\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, slug]);\n\n useEffect(() => {\n fetchPosting();\n }, [fetchPosting]);\n\n return { posting, loading, error, refetch: fetchPosting };\n}\n","\"use client\";\n\n/**\n * Blog Components\n *\n * CMS-powered blog list and post pages. Uses ProductContentPage with tag \"blog\".\n *\n * @example\n * ```tsx\n * import { BlogListPage, BlogPostPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/blog\" element={<BlogListPage productName=\"VibeControls\" />} />\n * <Route path=\"/blog/:slug\" element={<BlogPostPage productName=\"VibeControls\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { ContentRenderer } from \"./content-provider\";\nimport { ProseStyles } from \"./prose-styles\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContentPageData, ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface BlogListPageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n blogPostBasePath?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n}\n\nexport interface BlogPostPageProps {\n productName?: string;\n blogListUrl?: string;\n /** Back-link label. Default: \"Back to Blog\". Use e.g. \"Back to Press\"\n * when reusing this renderer for a press release at /press/:slug. */\n backLabel?: string;\n className?: string;\n}\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst BLOG_POSTS_QUERY = `\n query BlogPosts($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst BLOG_POST_QUERY = `\n query BlogPost($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n tags\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\n// ============================================================================\n// BlogCard\n// ============================================================================\n\nfunction BlogCard({\n post,\n basePath = \"/blog\",\n}: {\n post: ContentPageListItem;\n basePath?: string;\n}) {\n const date = post.publishedAt || post.lastUpdated;\n const formattedDate = date\n ? new Date(date).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : \"\";\n // Dead/unreachable thumbnail → placeholder, never a broken-image glyph.\n const [imgError, setImgError] = useState(false);\n\n return (\n <a\n href={`${basePath}/${post.slug}`}\n className=\"group block bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300\"\n >\n {/* Thumbnail */}\n {post.thumbnail && !imgError ? (\n <div className=\"aspect-[16/9] overflow-hidden\">\n <img\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n </div>\n ) : (\n <div className=\"aspect-[16/9] bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-muted-foreground/20\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"\n />\n </svg>\n </div>\n )}\n\n <div className=\"p-5 sm:p-6\">\n {/* Category badge */}\n {post.category && (\n <span className=\"inline-block text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3\">\n {post.category}\n </span>\n )}\n\n {/* Title */}\n {/* h2, not h3: cards sit directly under the page h1 (axe heading-order). */}\n <h2 className=\"text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2\">\n {post.title}\n </h2>\n\n {/* Excerpt */}\n <p className=\"text-sm text-muted-foreground mb-4 line-clamp-3\">\n {post.excerpt || post.seoDescription || \"\"}\n </p>\n\n {/* Footer: author + date + reading time */}\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n {post.author && <span className=\"font-medium\">{post.author}</span>}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n )}\n </div>\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// BlogListPage\n// ============================================================================\n\nexport function BlogListPage(props: BlogListPageProps) {\n const {\n productName,\n heroTitle = \"Blog\",\n heroSubtitle = \"Latest updates, engineering insights, and product news\",\n blogPostBasePath = \"/blog\",\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n\n const [posts, setPosts] = useState<ContentPageListItem[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [offset, setOffset] = useState(0);\n const limit = 12;\n\n const fetchPosts = useCallback(async () => {\n if (!resolvedProductId) return;\n\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n };\n }>(BLOG_POSTS_QUERY, {\n productId: resolvedProductId,\n limit,\n offset,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load posts\");\n return;\n }\n\n // Filter to only blog-tagged posts\n const blogPosts = (result.data?.publicContentPages?.items || []).filter(\n (p) => p.tags?.includes(\"blog\"),\n );\n\n setPosts(blogPosts);\n setTotal(result.data?.publicContentPages?.total || 0);\n setError(null);\n } catch {\n setError(\"Failed to load blog posts\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, offset]);\n\n useEffect(() => {\n fetchPosts();\n }, [fetchPosts]);\n\n // Separate featured and regular posts\n const featuredPosts = posts.filter((p) => p.featured);\n const regularPosts = posts.filter((p) => !p.featured);\n\n return (\n <div className={`w-full ${className}`}>\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n url={\n typeof window !== \"undefined\"\n ? window.location.origin + window.location.pathname\n : undefined\n }\n />\n )}\n\n {/* Hero */}\n <section className=\"py-16 sm:py-20 md:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground\">\n {heroTitle}\n </h1>\n <p className=\"mt-4 text-lg text-muted-foreground\">{heroSubtitle}</p>\n </div>\n </div>\n </section>\n\n {/* Posts */}\n <section className=\"pb-16 sm:pb-20\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n {loading ? (\n <div className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-xl overflow-hidden animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"p-6 space-y-3\">\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n <div className=\"h-6 bg-muted rounded w-3/4\" />\n <div className=\"h-4 bg-muted rounded\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n ) : error ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{error}</p>\n </div>\n ) : posts.length === 0 ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No blog posts yet. Check back soon!\n </p>\n </div>\n ) : (\n <>\n {/* Featured posts (full width) */}\n {featuredPosts.length > 0 && (\n <div className=\"grid md:grid-cols-2 gap-6 sm:gap-8 mb-8\">\n {featuredPosts.map((post) => (\n <BlogCard\n key={post.id}\n post={post}\n basePath={blogPostBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Regular posts (3-column grid) */}\n <div className=\"grid md:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8\">\n {regularPosts.map((post) => (\n <BlogCard\n key={post.id}\n post={post}\n basePath={blogPostBasePath}\n />\n ))}\n </div>\n\n {/* Pagination */}\n {total > limit && (\n <div className=\"flex justify-center gap-4 mt-12\">\n <button\n onClick={() => setOffset(Math.max(0, offset - limit))}\n disabled={offset === 0}\n className=\"px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors\"\n >\n Previous\n </button>\n <button\n onClick={() => setOffset(offset + limit)}\n disabled={offset + limit >= total}\n className=\"px-5 py-2.5 text-sm font-medium border rounded-lg disabled:opacity-40 hover:bg-muted transition-colors\"\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </section>\n </div>\n );\n}\n\n// ============================================================================\n// BlogPostPage\n// ============================================================================\n\nexport function BlogPostPage(props: BlogPostPageProps) {\n const {\n productName,\n blogListUrl = \"/blog\",\n backLabel = \"Back to Blog\",\n className = \"\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n\n const [post, setPost] = useState<ContentPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Get slug from URL\n const slug =\n typeof window !== \"undefined\"\n ? window.location.pathname.split(\"/\").pop() || \"\"\n : \"\";\n\n useEffect(() => {\n if (!slug || !resolvedProductId) return;\n\n async function fetchPost() {\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPage: ContentPageData | null;\n }>(BLOG_POST_QUERY, {\n slug,\n productId: resolvedProductId,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load post\");\n return;\n }\n\n setPost(result.data?.publicContentPage ?? null);\n setError(null);\n } catch {\n setError(\"Failed to load blog post\");\n } finally {\n setLoading(false);\n }\n }\n\n fetchPost();\n }, [client, slug, resolvedProductId]);\n\n if (loading) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24\">\n <div className=\"animate-pulse space-y-6\">\n <div className=\"h-8 bg-muted rounded w-2/3\" />\n <div className=\"h-4 bg-muted rounded w-1/3\" />\n <div className=\"aspect-[16/9] bg-muted rounded-xl\" />\n <div className=\"space-y-3\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-4 bg-muted rounded\" />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (error || !post) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-24 text-center\">\n <h1 className=\"text-2xl font-bold mb-4\">Post not found</h1>\n <p className=\"text-muted-foreground mb-6\">\n {error || \"This blog post doesn't exist or has been removed.\"}\n </p>\n <a\n href={blogListUrl}\n className=\"text-primary hover:underline font-medium\"\n >\n ← {backLabel}\n </a>\n </div>\n </div>\n );\n }\n\n const date = post.publishedAt || post.lastUpdated;\n const formattedDate = date\n ? new Date(date).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : \"\";\n\n return (\n <div className={`w-full ${className}`}>\n <ProseStyles />\n <PageHead\n title={post.seoTitle || post.title}\n description={post.seoDescription || post.excerpt || \"\"}\n productName={productName}\n keywords={post.seoKeywords || \"\"}\n image={post.thumbnail || undefined}\n url={\n typeof window !== \"undefined\"\n ? window.location.origin + window.location.pathname\n : undefined\n }\n />\n\n <article className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-16 sm:py-20\">\n {/* Back link */}\n <a\n href={blogListUrl}\n className=\"inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground mb-8 transition-colors\"\n >\n ← {backLabel}\n </a>\n\n {/* Category */}\n {post.category && (\n <span className=\"inline-block text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-4\">\n {post.category}\n </span>\n )}\n\n {/* Title */}\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground mb-4\">\n {post.title}\n </h1>\n\n {/* Meta */}\n <div className=\"flex items-center gap-3 text-sm text-muted-foreground mb-8\">\n {post.author && (\n <span className=\"font-medium text-foreground\">{post.author}</span>\n )}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n )}\n </div>\n\n {/* Hero image */}\n {post.thumbnail && (\n <div className=\"aspect-[16/9] rounded-xl overflow-hidden mb-10\">\n <img\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full object-cover\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"boff-prose max-w-none\">\n <ContentRenderer content={post.content} format={post.contentFormat} />\n </div>\n </article>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Case Studies Components\n *\n * CMS-powered case-study list and detail pages. Data is sourced from the\n * global tenant service — ProductContentPage records tagged \"case-study\" —\n * exactly like the blog and changelog, so the three stay on the same data path.\n *\n * The list page is designed to shine in BOTH states:\n * - When a product has published stories: a modern, interactive gallery with a\n * featured spotlight, category filtering, and hover-lift cards.\n * - When a product has none yet (the common case for a newly launched\n * product): a warm, professional \"no stories yet\" state that frames the\n * product as early-and-growing and invites the visitor to get in touch —\n * never a dead end, never fabricated traction.\n *\n * `data-cs=\"case-studies-v2\"` on the root is an intentional, minify-safe marker\n * used to confirm which published SDK artifact actually contains this design.\n *\n * @example\n * ```tsx\n * import { CaseStudiesListPage, CaseStudyPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/case-studies\" element={<CaseStudiesListPage productName=\"VibeControls\" />} />\n * <Route path=\"/case-studies/:slug\" element={<CaseStudyPage productName=\"VibeControls\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\n\nimport { ContentRenderer } from \"./content-provider\";\nimport { ProseStyles } from \"./prose-styles\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContentPageData, ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CaseStudiesListPageProps {\n productName?: string;\n /** Small label above the hero title. Default: \"Customer Stories\". */\n eyebrow?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n caseStudyBasePath?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n /** Where the primary \"get in touch\" CTA points. Default: \"/contact\". */\n contactHref?: string;\n /** Primary CTA label. Default: \"Get in touch\". */\n contactLabel?: string;\n /** Secondary CTA target (shown in the empty state). Default: \"/features\". */\n exploreHref?: string;\n /** Secondary CTA label. Default: \"Explore the product\". */\n exploreLabel?: string;\n /** Heading for the empty state. Falls back to a product-aware default. */\n emptyTitle?: string;\n /** Body copy for the empty state. Falls back to a product-aware default. */\n emptySubtitle?: string;\n}\n\nexport interface CaseStudyPageProps {\n productName?: string;\n caseStudiesListUrl?: string;\n /** Back-link label. Default: \"Back to Case Studies\". */\n backLabel?: string;\n /** Where the closing \"get in touch\" CTA points. Default: \"/contact\". */\n contactHref?: string;\n /** Closing CTA label. Default: \"Get in touch\". */\n contactLabel?: string;\n className?: string;\n}\n\n/** Tag that marks a ProductContentPage as a case study. */\nconst CASE_STUDY_TAG = \"case-study\";\n\n/**\n * True when the customer has approved the story in writing (BOFF-9971).\n *\n * The CMS already refuses to serve an unapproved case study; this check is the\n * second lock, so no website renders one even against a CMS build that predates\n * the gate. A case study states results on a customer's behalf, and we never\n * publish numbers a customer has not signed off.\n */\nexport function hasCustomerSignOff(page: {\n customerSignOff?: { signedAt?: string | null } | null;\n}): boolean {\n const signedAt = page.customerSignOff?.signedAt;\n return (\n typeof signedAt === \"string\" && !Number.isNaN(new Date(signedAt).getTime())\n );\n}\n\n// One-time injected keyframes (scoped class names avoid host collisions).\n// Pure CSS — deliberately no framer-motion (it white-screens under rolldown).\nconst ANIMATION_STYLES = `\n@keyframes csFadeUp { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } }\n@keyframes csFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-14px); } }\n.cs-fade-up { animation: csFadeUp 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; }\n.cs-float { animation: csFloat 7s ease-in-out infinite; }\n@media (prefers-reduced-motion: reduce) {\n .cs-fade-up, .cs-float { animation: none !important; }\n}\n`;\n\nfunction AnimationStyles() {\n return <style dangerouslySetInnerHTML={{ __html: ANIMATION_STYLES }} />;\n}\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst CASE_STUDIES_QUERY = `\n query CaseStudies($productId: String!, $tag: String, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, tag: $tag, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n customerSignOff {\n signedAt\n }\n }\n total\n hasMore\n }\n }\n`;\n\nconst CASE_STUDY_QUERY = `\n query CaseStudy($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n tags\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n customerSignOff {\n signedAt\n }\n }\n }\n`;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatDate(value?: string | null): string {\n if (!value) return \"\";\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return \"\";\n return d.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\n/** Thumbnail with graceful placeholder fallback (never a broken-image glyph). */\nfunction Thumbnail({\n src,\n alt,\n className = \"\",\n}: {\n src?: string | null;\n alt: string;\n className?: string;\n}) {\n const [imgError, setImgError] = useState(false);\n if (src && !imgError) {\n return (\n <img\n src={src}\n alt={alt}\n className={className}\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n );\n }\n return (\n <div\n className={`flex items-center justify-center bg-gradient-to-br from-muted/60 to-muted ${className}`}\n aria-hidden=\"true\"\n >\n <svg\n className=\"w-12 h-12 text-muted-foreground/25\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253\"\n />\n </svg>\n </div>\n );\n}\n\nfunction MetaRow({\n post,\n className = \"\",\n}: {\n post: ContentPageListItem | ContentPageData;\n className?: string;\n}) {\n const formattedDate = formatDate(post.publishedAt || post.lastUpdated);\n return (\n <div\n className={`flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground ${className}`}\n >\n {post.author && <span className=\"font-medium\">{post.author}</span>}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime ? (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n ) : null}\n </div>\n );\n}\n\n// ============================================================================\n// FeaturedCard — large spotlight for featured case studies\n// ============================================================================\n\nfunction FeaturedCard({\n post,\n basePath,\n}: {\n post: ContentPageListItem;\n basePath: string;\n}) {\n return (\n <a\n href={`${basePath}/${post.slug}`}\n className=\"group relative grid md:grid-cols-2 gap-0 overflow-hidden rounded-2xl border bg-card shadow-sm transition-all duration-300 hover:-translate-y-1 hover:shadow-xl hover:border-primary/40\"\n >\n <div className=\"relative aspect-[16/10] md:aspect-auto md:h-full overflow-hidden\">\n <Thumbnail\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full min-h-[220px] object-cover transition-transform duration-500 group-hover:scale-[1.04]\"\n />\n <span className=\"absolute top-4 left-4 inline-flex items-center gap-1 rounded-full bg-primary px-2.5 py-1 text-xs font-semibold text-primary-foreground shadow-sm\">\n <svg\n className=\"h-3 w-3\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.286 3.957a1 1 0 00.95.69h4.162c.969 0 1.371 1.24.588 1.81l-3.368 2.447a1 1 0 00-.364 1.118l1.287 3.957c.3.921-.755 1.688-1.54 1.118l-3.367-2.447a1 1 0 00-1.176 0l-3.367 2.447c-.784.57-1.838-.197-1.539-1.118l1.286-3.957a1 1 0 00-.363-1.118L2.98 9.384c-.783-.57-.38-1.81.588-1.81h4.162a1 1 0 00.95-.69l1.286-3.957z\" />\n </svg>\n Featured\n </span>\n </div>\n <div className=\"flex flex-col justify-center p-6 sm:p-8\">\n {post.category && (\n <span className=\"mb-3 inline-block w-fit rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary\">\n {post.category}\n </span>\n )}\n {/* h2, not h3: cards sit directly under the page h1 (axe heading-order). */}\n <h2 className=\"text-xl sm:text-2xl font-bold text-foreground transition-colors group-hover:text-primary line-clamp-3\">\n {post.title}\n </h2>\n <p className=\"mt-3 text-sm sm:text-base text-muted-foreground line-clamp-3\">\n {post.excerpt || post.seoDescription || \"\"}\n </p>\n <MetaRow post={post} className=\"mt-5\" />\n <span className=\"mt-5 inline-flex items-center gap-1 text-sm font-semibold text-primary\">\n Read the story\n <svg\n className=\"h-4 w-4 transition-transform duration-300 group-hover:translate-x-1\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 4.293a1 1 0 011.414 0l5 5a1 1 0 010 1.414l-5 5a1 1 0 01-1.414-1.414L11.586 10 7.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </span>\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// CaseStudyCard — standard grid card\n// ============================================================================\n\nfunction CaseStudyCard({\n post,\n basePath = \"/case-studies\",\n}: {\n post: ContentPageListItem;\n basePath?: string;\n}) {\n return (\n <a\n href={`${basePath}/${post.slug}`}\n className=\"group flex flex-col overflow-hidden rounded-xl border bg-card transition-all duration-300 hover:-translate-y-1 hover:shadow-lg hover:border-primary/40\"\n >\n <div className=\"aspect-[16/9] overflow-hidden\">\n <Thumbnail\n src={post.thumbnail}\n alt={post.title}\n className=\"w-full h-full object-cover transition-transform duration-500 group-hover:scale-105\"\n />\n </div>\n\n <div className=\"flex flex-1 flex-col p-5 sm:p-6\">\n {post.category && (\n <span className=\"mb-3 inline-block w-fit rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary\">\n {post.category}\n </span>\n )}\n {/* h2, not h3: cards sit directly under the page h1 (axe heading-order). */}\n <h2 className=\"mb-2 text-lg font-semibold text-foreground transition-colors group-hover:text-primary line-clamp-2\">\n {post.title}\n </h2>\n <p className=\"mb-4 text-sm text-muted-foreground line-clamp-3\">\n {post.excerpt || post.seoDescription || \"\"}\n </p>\n <MetaRow post={post} className=\"mt-auto\" />\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// EmptyState — warm, professional \"no stories yet\" experience\n// ============================================================================\n\nfunction EmptyState({\n productLabel,\n title,\n subtitle,\n contactHref,\n contactLabel,\n exploreHref,\n exploreLabel,\n}: {\n productLabel: string;\n title: string;\n subtitle: string;\n contactHref: string;\n contactLabel: string;\n exploreHref: string;\n exploreLabel: string;\n}) {\n const highlights = [\n {\n title: \"Real outcomes, real teams\",\n body: `We're partnering with our earliest adopters right now. As they ship results with ${productLabel}, their stories will land here — measured and unembellished.`,\n icon: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z\"\n />\n ),\n },\n {\n title: \"See it on your use case\",\n body: `Want to know how ${productLabel} would work for your team? We'll walk you through exactly what to expect — no pitch, just specifics.`,\n icon: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z M15 12a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n ),\n },\n {\n title: \"Be the first story\",\n body: `Building something with ${productLabel} worth talking about? Tell us — the best early stories become the case studies featured on this page.`,\n icon: (\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.562.562 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.562.562 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z\"\n />\n ),\n },\n ];\n\n return (\n <div className=\"cs-fade-up mx-auto max-w-4xl\">\n <div className=\"relative overflow-hidden rounded-3xl border bg-card px-6 py-14 text-center sm:px-12 sm:py-16\">\n {/* Decorative, token-based backdrop */}\n <div\n className=\"pointer-events-none absolute -top-24 -right-16 h-64 w-64 rounded-full bg-primary/10 blur-3xl\"\n aria-hidden=\"true\"\n />\n <div\n className=\"pointer-events-none absolute -bottom-24 -left-16 h-64 w-64 rounded-full bg-primary/5 blur-3xl\"\n aria-hidden=\"true\"\n />\n\n <div className=\"relative\">\n <div className=\"cs-float mx-auto flex h-20 w-20 items-center justify-center rounded-2xl bg-primary/10 text-primary ring-1 ring-primary/20\">\n <svg\n className=\"h-10 w-10\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n </div>\n\n <h2 className=\"mt-8 text-2xl font-bold tracking-tight text-foreground sm:text-3xl\">\n {title}\n </h2>\n <p className=\"mx-auto mt-4 max-w-2xl text-base leading-relaxed text-muted-foreground sm:text-lg\">\n {subtitle}\n </p>\n\n <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n <a\n href={contactHref}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md sm:w-auto\"\n >\n {contactLabel}\n <svg\n className=\"h-4 w-4\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 4.293a1 1 0 011.414 0l5 5a1 1 0 010 1.414l-5 5a1 1 0 01-1.414-1.414L11.586 10 7.293 5.707a1 1 0 010-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </a>\n <a\n href={exploreHref}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lg border border-border bg-background px-6 py-3 text-sm font-semibold text-foreground transition-colors hover:bg-muted sm:w-auto\"\n >\n {exploreLabel}\n </a>\n </div>\n </div>\n </div>\n\n {/* Supporting trio */}\n <div className=\"mt-8 grid gap-4 sm:grid-cols-3\">\n {highlights.map((h) => (\n <div\n key={h.title}\n className=\"rounded-2xl border bg-card/60 p-5 text-left transition-colors hover:border-primary/30\"\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <svg\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n {h.icon}\n </svg>\n </div>\n <h3 className=\"mt-4 text-sm font-semibold text-foreground\">\n {h.title}\n </h3>\n <p className=\"mt-1.5 text-sm leading-relaxed text-muted-foreground\">\n {h.body}\n </p>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// CaseStudiesListPage\n// ============================================================================\n\nexport function CaseStudiesListPage(props: CaseStudiesListPageProps) {\n const {\n productName,\n eyebrow = \"Customer Stories\",\n heroTitle = \"Case Studies\",\n heroSubtitle = \"Real-world stories of teams building with our platform.\",\n caseStudyBasePath = \"/case-studies\",\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n contactHref = \"/contact\",\n contactLabel = \"Get in touch\",\n exploreHref = \"/features\",\n exploreLabel = \"Explore the product\",\n emptyTitle,\n emptySubtitle,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const productLabel = product?.name || productName || \"our platform\";\n\n const [posts, setPosts] = useState<ContentPageListItem[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [offset, setOffset] = useState(0);\n const [activeCategory, setActiveCategory] = useState<string>(\"All\");\n const limit = 12;\n\n const fetchPosts = useCallback(async () => {\n if (!resolvedProductId) return;\n\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n };\n }>(CASE_STUDIES_QUERY, {\n productId: resolvedProductId,\n // Filter server-side: an unfiltered page of `limit` rows is mostly blog/legal pages, so\n // real case studies past it were never listed and the page fell back to the empty state.\n tag: CASE_STUDY_TAG,\n limit,\n offset,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load case studies\");\n setPosts([]);\n return;\n }\n\n // Defensive: keep only case-study-tagged pages even if a server ignores `tag`,\n // and only the ones the customer has signed off.\n const items = result.data?.publicContentPages?.items || [];\n const caseStudies = items.filter(\n (p) => p.tags?.includes(CASE_STUDY_TAG) && hasCustomerSignOff(p),\n );\n\n setPosts(caseStudies);\n // A server that ignored the gate would count the dropped rows too.\n const dropped = items.length - caseStudies.length;\n setTotal(\n Math.max(0, (result.data?.publicContentPages?.total || 0) - dropped),\n );\n setError(null);\n } catch {\n // A visitor should never see a raw error on a marketing page — fall\n // through to the encouraging empty state instead of a dead end.\n setError(\"load-failed\");\n setPosts([]);\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, offset]);\n\n useEffect(() => {\n fetchPosts();\n }, [fetchPosts]);\n\n // Distinct categories for the interactive filter (only meaningful with data).\n const categories = useMemo(() => {\n const set = new Set<string>();\n posts.forEach((p) => {\n if (p.category) set.add(p.category);\n });\n return [\"All\", ...Array.from(set)];\n }, [posts]);\n\n const visiblePosts = useMemo(() => {\n if (activeCategory === \"All\") return posts;\n return posts.filter((p) => p.category === activeCategory);\n }, [posts, activeCategory]);\n\n const featuredPosts = visiblePosts.filter((p) => p.featured);\n const regularPosts = visiblePosts.filter((p) => !p.featured);\n\n const hasContent = !loading && !error && posts.length > 0;\n const showEmpty = !loading && (error !== null || posts.length === 0);\n\n const resolvedEmptyTitle = emptyTitle ?? \"Case studies are on the way\";\n const resolvedEmptySubtitle =\n emptySubtitle ??\n `${productLabel} is early in its journey, and we'd rather show you real, measurable results than filler. We're working closely with our first teams now — their stories will be published here soon. In the meantime, we'd love to show you what's possible.`;\n\n return (\n <div className={`w-full ${className}`} data-cs=\"case-studies-v2\">\n <ProseStyles />\n <AnimationStyles />\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n />\n )}\n\n {/* Hero */}\n <section className=\"relative overflow-hidden\">\n <div\n className=\"pointer-events-none absolute inset-x-0 -top-32 mx-auto h-72 max-w-3xl rounded-full bg-primary/10 blur-3xl\"\n aria-hidden=\"true\"\n />\n <div className=\"relative mx-auto max-w-7xl px-4 py-16 sm:px-6 sm:py-20 md:py-24 lg:px-8\">\n <div className=\"mx-auto max-w-3xl text-center\">\n <span className=\"inline-flex items-center gap-2 rounded-full border border-primary/20 bg-primary/10 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-primary\">\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary\" />\n {eyebrow}\n </span>\n <h1 className=\"mt-5 text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl\">\n {heroTitle}\n </h1>\n <p className=\"mt-4 text-lg text-muted-foreground\">{heroSubtitle}</p>\n </div>\n </div>\n </section>\n\n {/* Body */}\n <section className=\"pb-20 sm:pb-24\">\n <div className=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8\">\n {loading ? (\n <div className=\"grid gap-6 sm:gap-8 md:grid-cols-2 lg:grid-cols-3\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"overflow-hidden rounded-xl border bg-card animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"space-y-3 p-6\">\n <div className=\"h-4 w-1/4 rounded bg-muted\" />\n <div className=\"h-6 w-3/4 rounded bg-muted\" />\n <div className=\"h-4 rounded bg-muted\" />\n <div className=\"h-4 w-1/2 rounded bg-muted\" />\n </div>\n </div>\n ))}\n </div>\n ) : showEmpty ? (\n <EmptyState\n productLabel={productLabel}\n title={resolvedEmptyTitle}\n subtitle={resolvedEmptySubtitle}\n contactHref={contactHref}\n contactLabel={contactLabel}\n exploreHref={exploreHref}\n exploreLabel={exploreLabel}\n />\n ) : hasContent ? (\n <>\n {/* Interactive category filter */}\n {categories.length > 2 && (\n <div className=\"mb-10 flex flex-wrap justify-center gap-2\">\n {categories.map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setActiveCategory(cat)}\n className={`rounded-full border px-4 py-1.5 text-sm font-medium transition-colors ${\n activeCategory === cat\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-border bg-background text-muted-foreground hover:border-primary/40 hover:text-foreground\"\n }`}\n >\n {cat}\n </button>\n ))}\n </div>\n )}\n\n {/* Featured spotlight */}\n {featuredPosts.length > 0 && (\n <div className=\"mb-10 grid gap-6 sm:gap-8 lg:grid-cols-2\">\n {featuredPosts.map((post) => (\n <FeaturedCard\n key={post.id}\n post={post}\n basePath={caseStudyBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Regular grid */}\n {regularPosts.length > 0 && (\n <div className=\"grid gap-6 sm:gap-8 md:grid-cols-2 lg:grid-cols-3\">\n {regularPosts.map((post) => (\n <CaseStudyCard\n key={post.id}\n post={post}\n basePath={caseStudyBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Pagination (only for the full, unfiltered set) */}\n {activeCategory === \"All\" && total > limit && (\n <div className=\"mt-14 flex justify-center gap-4\">\n <button\n onClick={() => setOffset(Math.max(0, offset - limit))}\n disabled={offset === 0}\n className=\"rounded-lg border px-5 py-2.5 text-sm font-medium transition-colors hover:bg-muted disabled:opacity-40\"\n >\n Previous\n </button>\n <button\n onClick={() => setOffset(offset + limit)}\n disabled={offset + limit >= total}\n className=\"rounded-lg border px-5 py-2.5 text-sm font-medium transition-colors hover:bg-muted disabled:opacity-40\"\n >\n Next\n </button>\n </div>\n )}\n\n {/* Closing CTA band */}\n <div className=\"mt-16 overflow-hidden rounded-2xl border bg-gradient-to-br from-primary/10 via-card to-card p-8 text-center sm:p-10\">\n <h2 className=\"text-xl font-bold text-foreground sm:text-2xl\">\n Want results like these?\n </h2>\n <p className=\"mx-auto mt-2 max-w-xl text-sm text-muted-foreground sm:text-base\">\n Tell us about your goals and we’ll show you exactly how{\" \"}\n {productLabel} can help.\n </p>\n <a\n href={contactHref}\n className=\"mt-6 inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md\"\n >\n {contactLabel}\n </a>\n </div>\n </>\n ) : null}\n </div>\n </section>\n </div>\n );\n}\n\n// ============================================================================\n// CaseStudyPage (detail)\n// ============================================================================\n\nexport function CaseStudyPage(props: CaseStudyPageProps) {\n const {\n productName,\n caseStudiesListUrl = \"/case-studies\",\n backLabel = \"Back to Case Studies\",\n contactHref = \"/contact\",\n contactLabel = \"Get in touch\",\n className = \"\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const productLabel = product?.name || productName || \"our team\";\n\n const [post, setPost] = useState<ContentPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n // Get slug from URL\n const slug =\n typeof window !== \"undefined\"\n ? window.location.pathname.split(\"/\").pop() || \"\"\n : \"\";\n\n useEffect(() => {\n if (!slug || !resolvedProductId) return;\n\n async function fetchPost() {\n setLoading(true);\n try {\n const result = await client.query<{\n publicContentPage: ContentPageData | null;\n }>(CASE_STUDY_QUERY, {\n slug,\n productId: resolvedProductId,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load case study\");\n return;\n }\n\n const page = result.data?.publicContentPage ?? null;\n // Without the customer's sign-off the story is treated as not found.\n setPost(page && hasCustomerSignOff(page) ? page : null);\n setError(null);\n } catch {\n setError(\"Failed to load case study\");\n } finally {\n setLoading(false);\n }\n }\n\n fetchPost();\n }, [client, slug, resolvedProductId]);\n\n if (loading) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"mx-auto max-w-4xl px-4 py-24 sm:px-6 lg:px-8\">\n <div className=\"animate-pulse space-y-6\">\n <div className=\"h-8 w-2/3 rounded bg-muted\" />\n <div className=\"h-4 w-1/3 rounded bg-muted\" />\n <div className=\"aspect-[16/9] rounded-xl bg-muted\" />\n <div className=\"space-y-3\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-4 rounded bg-muted\" />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n if (error || !post) {\n return (\n <div className={`w-full ${className}`}>\n <div className=\"mx-auto max-w-2xl px-4 py-24 text-center sm:px-6 lg:px-8\">\n <div className=\"mx-auto flex h-16 w-16 items-center justify-center rounded-2xl bg-primary/10 text-primary\">\n <svg\n className=\"h-8 w-8\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z\"\n />\n </svg>\n </div>\n <h1 className=\"mt-6 text-2xl font-bold text-foreground\">\n Case study not found\n </h1>\n <p className=\"mx-auto mt-3 max-w-md text-muted-foreground\">\n This story isn’t available yet — but there’s plenty more to explore,\n and we’re always happy to talk through what {productLabel} can do.\n </p>\n <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n <a\n href={caseStudiesListUrl}\n className=\"inline-flex items-center justify-center rounded-lg border px-5 py-2.5 text-sm font-semibold text-foreground transition-colors hover:bg-muted\"\n >\n ← {backLabel}\n </a>\n <a\n href={contactHref}\n className=\"inline-flex items-center justify-center rounded-lg bg-primary px-5 py-2.5 text-sm font-semibold text-primary-foreground transition-all hover:opacity-90\"\n >\n {contactLabel}\n </a>\n </div>\n </div>\n </div>\n );\n }\n\n const formattedDate = formatDate(post.publishedAt || post.lastUpdated);\n const approvedDate = formatDate(post.customerSignOff?.signedAt);\n\n return (\n <div className={`w-full ${className}`}>\n <ProseStyles />\n <PageHead\n title={post.seoTitle || post.title}\n description={post.seoDescription || post.excerpt || \"\"}\n productName={productName}\n keywords={post.seoKeywords || \"\"}\n />\n\n <article className=\"mx-auto max-w-4xl px-4 py-16 sm:px-6 sm:py-20 lg:px-8\">\n {/* Back link */}\n <a\n href={caseStudiesListUrl}\n className=\"mb-8 inline-flex items-center gap-1 text-sm text-muted-foreground transition-colors hover:text-foreground\"\n >\n ← {backLabel}\n </a>\n\n {/* Category */}\n {post.category && (\n <span className=\"mb-4 inline-block rounded-full bg-primary/10 px-2.5 py-1 text-xs font-medium text-primary\">\n {post.category}\n </span>\n )}\n\n {/* Title */}\n <h1 className=\"mb-4 text-3xl font-bold tracking-tight text-foreground sm:text-4xl md:text-5xl\">\n {post.title}\n </h1>\n\n {/* Meta */}\n <div className=\"mb-8 flex flex-wrap items-center gap-3 text-sm text-muted-foreground\">\n {post.author && (\n <span className=\"font-medium text-foreground\">{post.author}</span>\n )}\n {post.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {post.readingTime ? (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{post.readingTime} min read</span>\n </>\n ) : null}\n </div>\n {approvedDate && (\n <p\n className=\"-mt-4 mb-8 text-xs text-muted-foreground\"\n data-cs=\"customer-signoff\"\n >\n Approved for publication by the customer on {approvedDate}\n </p>\n )}\n\n {/* Hero image */}\n {post.thumbnail && (\n <div className=\"mb-10 aspect-[16/9] overflow-hidden rounded-xl\">\n <img\n src={post.thumbnail}\n alt={post.title}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"boff-prose max-w-none\">\n <ContentRenderer content={post.content} format={post.contentFormat} />\n </div>\n\n {/* Closing CTA */}\n <div className=\"mt-14 rounded-2xl border bg-gradient-to-br from-primary/10 via-card to-card p-8 text-center\">\n <h2 className=\"text-xl font-bold text-foreground\">\n Curious what {productLabel} could do for you?\n </h2>\n <p className=\"mx-auto mt-2 max-w-lg text-sm text-muted-foreground\">\n We’re happy to walk you through it — no pressure, just a\n conversation about your goals.\n </p>\n <a\n href={contactHref}\n className=\"mt-6 inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-semibold text-primary-foreground shadow-sm transition-all hover:opacity-90 hover:shadow-md\"\n >\n {contactLabel}\n </a>\n </div>\n </article>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Changelog Component\n *\n * CMS-powered changelog. Sources ProductContentPage records tagged \"changelog\"\n * and renders them as a newest-first version timeline (hero + version cards +\n * optional CTA). Each entry's markdown body is rendered inline. Replaces the\n * older per-site static `data/changelog.ts` arrays so releases are managed in\n * the product CMS instead of code.\n *\n * Also supports a prop-driven mode via the `entries` prop for sites that want\n * to source changelog data locally or from another provider. In that mode the\n * component adds search, category filters, and pagination on top of the\n * timeline UI.\n *\n * @example\n * ```tsx\n * import { ChangelogPage } from '@burdenoff/website-sdk'\n *\n * // CMS-powered\n * <Route path=\"/changelog\" element={<ChangelogPage productName=\"VibeControls\" />} />\n *\n * // Prop-driven\n * <ChangelogPage\n * productName=\"VibeControls\"\n * entries={[...]}\n * pageSize={10}\n * />\n * ```\n */\n\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { Search, History, ChevronLeft, ChevronRight } from \"lucide-react\";\n\nimport { ContentRenderer } from \"./content-provider\";\nimport { ProseStyles } from \"./prose-styles\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { cn } from \"../utils/cn\";\n\nimport type { ContentPageData, ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ChangelogEntry {\n /** Release date as an ISO string. */\n date: string;\n /** Version identifier, e.g. \"1.2.0\". */\n version: string;\n /** Entry headline. */\n title: string;\n /** Category used for filtering, e.g. \"feature\", \"fix\", \"improvement\". */\n category: string;\n /** Entry body — plain text, markdown, or a React node. */\n content: ReactNode | string;\n /** Optional tags for search and filtering. */\n tags?: string[];\n}\n\nexport interface ChangelogPageProps {\n productName?: string;\n heroEyebrow?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n /** Optional bottom CTA. Rendered only when ctaHref + ctaLabel are provided. */\n ctaTitle?: string;\n ctaSubtitle?: string;\n ctaHref?: string;\n ctaLabel?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n /**\n * Optional prop-driven entries. When provided, the component skips the CMS\n * fetch and renders these entries with search, category filters, and\n * pagination.\n */\n entries?: ChangelogEntry[];\n /** Number of entries per page in prop-driven mode. Defaults to 10. */\n pageSize?: number;\n}\n\n/** A list item plus its resolved full body. */\ninterface ResolvedChangelogEntry extends ContentPageListItem {\n content?: string;\n contentFormat?: string;\n}\n\n// ============================================================================\n// Queries\n// ============================================================================\n\n/** Tag that marks a ProductContentPage as a changelog entry. */\nconst CHANGELOG_TAG = \"changelog\";\n\nconst CHANGELOG_LIST_QUERY = `\n query ChangelogList($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n excerpt\n seoDescription\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst CHANGELOG_ENTRY_QUERY = `\n query ChangelogEntry($slug: String!, $productId: String) {\n publicContentPage(slug: $slug, productId: $productId) {\n content\n contentFormat\n }\n }\n`;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatDate(value?: string | null): string {\n if (!value) return \"\";\n return new Date(value).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\nfunction sortByDateDesc(\n a: ResolvedChangelogEntry,\n b: ResolvedChangelogEntry,\n): number {\n const da = new Date(a.publishedAt || a.lastUpdated || 0).getTime();\n const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();\n return db - da;\n}\n\nfunction normalize(value: string): string {\n return value.toLowerCase().trim();\n}\n\nfunction paginate<T>(items: T[], page: number, pageSize: number): T[] {\n const start = (page - 1) * pageSize;\n return items.slice(start, start + pageSize);\n}\n\nfunction parseEntryDate(date: string): number {\n return new Date(date).getTime();\n}\n\n// ============================================================================\n// CMS-Powered Changelog\n// ============================================================================\n\nfunction useCmsChangelog() {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n\n const [entries, setEntries] = useState<ResolvedChangelogEntry[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchEntries = useCallback(async () => {\n if (!resolvedProductId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n try {\n const listResult = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n };\n }>(CHANGELOG_LIST_QUERY, {\n productId: resolvedProductId,\n limit: 50,\n offset: 0,\n });\n\n if (listResult.errors?.length) {\n setError(listResult.errors[0]?.message ?? \"Failed to load changelog\");\n return;\n }\n\n const changelogItems = (listResult.data?.publicContentPages?.items || [])\n .filter((p) => p.tags?.includes(CHANGELOG_TAG))\n .sort(sortByDateDesc);\n\n // Resolve each entry's full markdown body (list items omit `content`).\n const resolved = await Promise.all(\n changelogItems.map(async (item) => {\n try {\n const detail = await client.query<{\n publicContentPage: Pick<\n ContentPageData,\n \"content\" | \"contentFormat\"\n > | null;\n }>(CHANGELOG_ENTRY_QUERY, {\n slug: item.slug,\n productId: resolvedProductId,\n });\n const page = detail.data?.publicContentPage;\n return {\n ...item,\n content: page?.content,\n contentFormat: page?.contentFormat,\n } as ResolvedChangelogEntry;\n } catch {\n return { ...item } as ResolvedChangelogEntry;\n }\n }),\n );\n\n setEntries(resolved);\n setError(null);\n } catch {\n setError(\"Failed to load changelog\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId]);\n\n useEffect(() => {\n fetchEntries();\n }, [fetchEntries]);\n\n return { entries, loading, error };\n}\n\nfunction CmsTimeline(props: {\n entries: ResolvedChangelogEntry[];\n loading: boolean;\n error: string | null;\n}) {\n const { entries, loading, error } = props;\n\n if (loading) {\n return (\n <div className=\"max-w-3xl mx-auto space-y-12\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"rounded-2xl border border-border/40 bg-card overflow-hidden animate-pulse\"\n >\n <div className=\"p-6 sm:p-8 space-y-4\">\n <div className=\"h-3 bg-muted rounded w-1/3\" />\n <div className=\"h-6 bg-muted rounded w-2/3\" />\n <div className=\"h-4 bg-muted rounded\" />\n <div className=\"h-4 bg-muted rounded w-5/6\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{error}</p>\n </div>\n );\n }\n\n if (entries.length === 0) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No changelog entries yet. Check back soon!\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"max-w-3xl mx-auto space-y-12\">\n {entries.map((entry) => (\n <article\n key={entry.id}\n id={entry.slug}\n className=\"rounded-2xl border border-border/40 bg-card overflow-hidden scroll-mt-24\"\n >\n {entry.thumbnail && (\n <img\n src={entry.thumbnail}\n alt=\"\"\n width={1024}\n height={576}\n loading=\"lazy\"\n decoding=\"async\"\n className=\"w-full aspect-video object-cover border-b border-border/40\"\n />\n )}\n <div className=\"p-6 sm:p-8\">\n <p className=\"text-xs text-muted-foreground mb-2\">\n {entry.publishedAt && (\n <time dateTime={entry.publishedAt}>\n {formatDate(entry.publishedAt || entry.lastUpdated)}\n </time>\n )}\n {entry.author && (\n <>\n {\" · \"}\n {entry.author}\n </>\n )}\n </p>\n <h2 className=\"text-xl sm:text-2xl font-bold text-foreground mb-4\">\n {entry.title}\n </h2>\n {entry.content ? (\n <div className=\"boff-prose boff-prose-sm max-w-none\">\n <ContentRenderer\n content={entry.content}\n format={entry.contentFormat}\n />\n </div>\n ) : (\n entry.excerpt && (\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {entry.excerpt}\n </p>\n )\n )}\n </div>\n </article>\n ))}\n </div>\n );\n}\n\n// ============================================================================\n// Prop-Driven Changelog\n// ============================================================================\n\nfunction EntryContent({ content }: { content: ReactNode | string }) {\n if (typeof content === \"string\") {\n return (\n <div className=\"boff-prose boff-prose-sm max-w-none\">\n <ContentRenderer content={content} format=\"markdown\" />\n </div>\n );\n }\n return <div className=\"boff-prose boff-prose-sm max-w-none\">{content}</div>;\n}\n\nfunction EntriesTimeline(props: {\n entries: ChangelogEntry[];\n pageSize: number;\n productName?: string;\n}) {\n const { entries, pageSize, productName } = props;\n const [query, setQuery] = useState(\"\");\n const [selectedCategory, setSelectedCategory] = useState<string | null>(null);\n const [page, setPage] = useState(1);\n\n const categories = useMemo(\n () => Array.from(new Set(entries.map((e) => e.category))).sort(),\n [entries],\n );\n\n const filtered = useMemo(() => {\n const normalized = normalize(query);\n return entries\n .filter((entry) => {\n if (selectedCategory && entry.category !== selectedCategory) {\n return false;\n }\n if (!normalized) return true;\n const haystack = [\n entry.title,\n entry.version,\n entry.category,\n ...(entry.tags ?? []),\n typeof entry.content === \"string\" ? entry.content : \"\",\n ]\n .join(\" \")\n .toLowerCase();\n return haystack.includes(normalized);\n })\n .sort((a, b) => parseEntryDate(b.date) - parseEntryDate(a.date));\n }, [entries, query, selectedCategory]);\n\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const safePage = Math.min(page, totalPages);\n const pageItems = paginate(filtered, safePage, pageSize);\n\n // Reset to first page when filters change.\n useEffect(() => {\n setPage(1);\n }, [query, selectedCategory]);\n\n if (entries.length === 0) {\n return (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No changelog entries yet. Check back soon!\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"max-w-3xl mx-auto\">\n {/* Controls */}\n <div className=\"mb-8 space-y-4\">\n <div className=\"relative\">\n <Search\n className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <Input\n type=\"search\"\n placeholder=\"Search releases, features, fixes…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n className=\"pl-9\"\n aria-label=\"Search changelog\"\n />\n </div>\n\n {categories.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => setSelectedCategory(null)}\n className={cn(\n \"px-3 py-1 rounded-full text-xs font-medium border transition-colors\",\n selectedCategory === null\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground border-border/60 hover:border-primary/40\",\n )}\n >\n All\n </button>\n {categories.map((category) => (\n <button\n key={category}\n type=\"button\"\n onClick={() => setSelectedCategory(category)}\n className={cn(\n \"px-3 py-1 rounded-full text-xs font-medium border transition-colors\",\n selectedCategory === category\n ? \"bg-primary text-primary-foreground border-primary\"\n : \"bg-background text-muted-foreground border-border/60 hover:border-primary/40\",\n )}\n >\n {category}\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Timeline */}\n <div className=\"relative\">\n {/* Vertical timeline line */}\n <div\n className=\"absolute left-[1.125rem] top-3 bottom-3 w-px bg-border/60 hidden sm:block\"\n aria-hidden=\"true\"\n />\n\n <div className=\"space-y-8\">\n {pageItems.map((entry) => (\n <article\n key={`${entry.version}-${entry.date}`}\n className=\"relative sm:pl-12\"\n >\n {/* Timeline dot */}\n <div\n className=\"hidden sm:flex absolute left-2 top-2 h-5 w-5 items-center justify-center rounded-full border-2 border-background bg-primary ring-1 ring-border/40\"\n aria-hidden=\"true\"\n >\n <span className=\"h-2 w-2 rounded-full bg-primary-foreground\" />\n </div>\n\n <div className=\"rounded-2xl border border-border/40 bg-card overflow-hidden\">\n <div className=\"p-6 sm:p-8\">\n <div className=\"flex flex-wrap items-center gap-2 mb-3\">\n <span className=\"inline-flex items-center rounded-md bg-primary/10 px-2 py-1 text-xs font-medium text-primary\">\n {entry.category}\n </span>\n <span className=\"inline-flex items-center rounded-md bg-muted px-2 py-1 text-xs font-mono font-medium text-muted-foreground\">\n v{entry.version}\n </span>\n <time\n className=\"text-xs text-muted-foreground\"\n dateTime={entry.date}\n >\n {formatDate(entry.date)}\n </time>\n </div>\n\n {entry.tags && entry.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mb-3\">\n {entry.tags.map((tag) => (\n <span\n key={tag}\n className=\"text-[10px] uppercase tracking-wide text-muted-foreground bg-background border border-border/40 px-1.5 py-0.5 rounded\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n\n <h2 className=\"text-xl sm:text-2xl font-bold text-foreground mb-4\">\n {entry.title}\n </h2>\n\n <EntryContent content={entry.content} />\n </div>\n </div>\n </article>\n ))}\n </div>\n </div>\n\n {/* Empty state after filtering */}\n {pageItems.length === 0 && (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n No entries match your filters.\n </p>\n </div>\n )}\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"mt-10 flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Page {safePage} of {totalPages} · {filtered.length} entries\n </p>\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.max(1, p - 1))}\n disabled={safePage <= 1}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setPage((p) => Math.min(totalPages, p + 1))}\n disabled={safePage >= totalPages}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n\n {productName && pageItems.length > 0 && (\n <script type=\"application/ld+json\">\n {JSON.stringify({\n \"@context\": \"https://schema.org\",\n \"@type\": \"ItemList\",\n name: `${productName} Changelog`,\n itemListElement: pageItems.map((entry, index) => ({\n \"@type\": \"ListItem\",\n position: (safePage - 1) * pageSize + index + 1,\n name: entry.title,\n description:\n typeof entry.content === \"string\"\n ? entry.content.slice(0, 200)\n : undefined,\n datePublished: entry.date,\n })),\n })}\n </script>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// ChangelogPage\n// ============================================================================\n\nexport function ChangelogPage(props: ChangelogPageProps) {\n const {\n productName,\n heroEyebrow = \"What's new\",\n heroTitle = \"Changelog\",\n heroSubtitle = \"Platform updates, improvements, and announcements — newest first.\",\n ctaTitle,\n ctaSubtitle,\n ctaHref,\n ctaLabel,\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n entries,\n pageSize = 10,\n } = props;\n\n const { product } = useProduct();\n const resolvedProductName = productName || product?.name;\n const cms = useCmsChangelog();\n const showCta = Boolean(ctaHref && ctaLabel);\n const isPropDriven = entries != null;\n\n return (\n <div className={`w-full ${className}`}>\n <ProseStyles />\n <PageHead\n title={seoTitle || heroTitle}\n description={seoDescription || heroSubtitle}\n productName={resolvedProductName}\n keywords={seoKeywords}\n />\n\n {/* Hero */}\n <section className=\"py-16 md:py-20 px-4 sm:px-6 lg:px-8 text-center\">\n <div className=\"max-w-3xl mx-auto\">\n <div className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary/10 border border-primary/20 text-xs font-medium text-primary mb-6\">\n <History className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {heroEyebrow}\n </div>\n <h1 className=\"text-4xl sm:text-5xl font-bold text-foreground mb-4\">\n {heroTitle}\n </h1>\n <p className=\"text-lg text-muted-foreground\">{heroSubtitle}</p>\n </div>\n </section>\n\n {/* Timeline */}\n <section className=\"px-4 sm:px-6 lg:px-8 pb-20\">\n {isPropDriven ? (\n <EntriesTimeline\n entries={entries}\n pageSize={pageSize}\n productName={resolvedProductName}\n />\n ) : (\n <CmsTimeline\n entries={cms.entries}\n loading={cms.loading}\n error={cms.error}\n />\n )}\n </section>\n\n {/* CTA (optional) */}\n {showCta && (\n <section className=\"py-14 px-4 sm:px-6 lg:px-8 bg-primary/5 border-t border-border/40\">\n <div className=\"max-w-2xl mx-auto text-center\">\n {ctaTitle && (\n <h2 className=\"text-2xl font-bold text-foreground mb-3\">\n {ctaTitle}\n </h2>\n )}\n {ctaSubtitle && (\n <p className=\"text-muted-foreground mb-7\">{ctaSubtitle}</p>\n )}\n <a\n href={ctaHref}\n className=\"inline-flex items-center justify-center rounded-lg bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:opacity-90 transition-opacity\"\n >\n {ctaLabel}\n </a>\n </div>\n </section>\n )}\n </div>\n );\n}\n","/**\n * Shared content helpers.\n *\n * Used by the file-download content lists (press kit, contracts, …) so that\n * formatting and download behaviour — and any bug fixes — live in one place.\n */\n\n/** Human-readable byte size (e.g. \"1.2 MB\"); empty string when unknown. */\nexport function formatBytes(bytes?: number | null): string {\n if (bytes == null) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\n/** Minimal shape needed to derive an extension / trigger a download. */\nexport interface DownloadableFile {\n fileUrl: string;\n fileName?: string | null;\n title?: string | null;\n}\n\n/** Uppercased file extension (e.g. \"PDF\"); \"FILE\" when none can be derived. */\nexport function fileExt(file: DownloadableFile): string {\n const name =\n file.fileName || file.fileUrl.split(\"/\").pop()?.split(\"?\")[0] || \"\";\n const ext = name.split(\".\").pop();\n return ext && ext !== name ? ext.toUpperCase() : \"FILE\";\n}\n\n// The HTML `download` attribute is ignored by browsers for cross-origin URLs\n// (files are served from S3/CDN). To actually save the file we fetch it as a\n// blob and trigger a real save; if that's blocked (CORS / network) we fall\n// back to opening it in a new tab — never worse than before.\nexport async function downloadFile(\n e: { preventDefault: () => void },\n file: DownloadableFile,\n): Promise<void> {\n e.preventDefault();\n const openInTab = () =>\n window.open(file.fileUrl, \"_blank\", \"noopener,noreferrer\");\n const name =\n file.fileName ||\n file.fileUrl.split(\"/\").pop()?.split(\"?\")[0] ||\n file.title ||\n \"download\";\n try {\n const res = await fetch(file.fileUrl, { mode: \"cors\" });\n if (!res.ok) {\n openInTab();\n return;\n }\n const blob = await res.blob();\n const objUrl = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = objUrl;\n a.download = name;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(objUrl);\n } catch {\n openInTab();\n }\n}\n","\"use client\";\n\n/**\n * Press Kit Component\n *\n * CMS-powered public press/media kit. Lists downloadable assets (logos,\n * banners, brochures, documents, brand guides) grouped by category, with a\n * media-contact block. Mirrors the BlogListPage architecture.\n *\n * @example\n * ```tsx\n * import { PressKitPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/press\" element={<PressKitPage productName=\"VibeControls\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { formatBytes, downloadFile } from \"./utils\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContentPageListItem } from \"./content-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type PressKitAssetCategory =\n | \"LOGO\"\n | \"BANNER\"\n | \"SCREENSHOT\"\n | \"BROCHURE\"\n | \"DOCUMENT\"\n | \"PRESS_RELEASE\"\n | \"BRAND_GUIDE\";\n\nexport interface PressKitAsset {\n id: string;\n category: PressKitAssetCategory;\n title: string;\n slug: string;\n description?: string | null;\n fileUrl: string;\n fileName?: string | null;\n fileSize?: number | null;\n mimeType?: string | null;\n thumbnailUrl?: string | null;\n version?: string | null;\n tags: string[];\n sortOrder: number;\n updatedAt: string;\n}\n\nexport interface PressKitPageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n /** Media/press contact email shown in the contact block */\n mediaContactEmail?: string;\n /** Optional URL for a \"Download brand kit\" hero CTA (e.g. a zip asset) */\n brandKitUrl?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n /**\n * Show a \"Press Releases\" section (published content pages tagged\n * \"press\") above the downloadable assets. Self-hides when there are\n * none. Default: true.\n */\n showPressReleases?: boolean;\n /**\n * Base path for press-release detail links — `${basePath}/${slug}`.\n * Default: \"/press\".\n */\n pressReleaseBasePath?: string;\n /** Heading for the press-releases section. Default: \"Press Releases\". */\n pressReleasesTitle?: string;\n}\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst PRESS_KIT_QUERY = `\n query PublicPressKit($productId: String!, $limit: Int, $offset: Int) {\n publicPressKitAssets(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n category\n title\n slug\n description\n fileUrl\n fileName\n fileSize\n mimeType\n thumbnailUrl\n version\n tags\n sortOrder\n updatedAt\n }\n total\n hasMore\n }\n }\n`;\n\n// Press releases are ProductContentPages with primary tag \"press\"\n// (published + public). publicContentPages already filters to\n// isPublished + visibility=PUBLIC server-side; we filter by tag client-side.\nconst PRESS_RELEASES_QUERY = `\n query PublicPressReleases($productId: String!, $limit: Int, $offset: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n lastUpdated\n tags\n seoDescription\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n total\n hasMore\n }\n }\n`;\n\nconst CATEGORY_ORDER: PressKitAssetCategory[] = [\n \"LOGO\",\n \"BANNER\",\n \"SCREENSHOT\",\n \"BRAND_GUIDE\",\n \"BROCHURE\",\n \"DOCUMENT\",\n \"PRESS_RELEASE\",\n];\n\nconst CATEGORY_LABELS: Record<PressKitAssetCategory, string> = {\n LOGO: \"Logos\",\n BANNER: \"Banners\",\n SCREENSHOT: \"Screenshots\",\n BRAND_GUIDE: \"Brand Guides\",\n BROCHURE: \"Brochures\",\n DOCUMENT: \"Documents\",\n PRESS_RELEASE: \"Press Releases\",\n};\n\nfunction isImageAsset(a: PressKitAsset): boolean {\n return (a.mimeType || \"\").startsWith(\"image/\");\n}\n\n// ============================================================================\n// PressKitLightbox — image preview modal (Esc / backdrop / ✕ to close,\n// Download inside). Image assets open this; other types open the file.\n// ============================================================================\n\nfunction PressKitLightbox({\n asset,\n onClose,\n}: {\n asset: PressKitAsset | null;\n onClose: () => void;\n}) {\n useEffect(() => {\n if (!asset) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n const prevOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.body.style.overflow = prevOverflow;\n };\n }, [asset, onClose]);\n\n if (!asset) return null;\n const ext =\n (asset.mimeType || \"file\").split(\"/\").pop()?.toUpperCase() || \"FILE\";\n const size = formatBytes(asset.fileSize);\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`${asset.title} preview`}\n onClick={onClose}\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/80 p-4 sm:p-8\"\n >\n <div\n onClick={(e) => e.stopPropagation()}\n className=\"relative flex max-h-full w-full max-w-4xl flex-col overflow-hidden rounded-xl border bg-card shadow-2xl\"\n >\n <div className=\"flex items-start justify-between gap-4 border-b p-4\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">\n {asset.title}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {ext}\n {size ? ` · ${size}` : \"\"}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close preview\"\n className=\"shrink-0 rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <svg\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"flex flex-1 items-center justify-center overflow-auto bg-muted/20 p-4\">\n <img\n src={asset.fileUrl}\n alt={asset.title}\n className=\"max-h-[70vh] w-auto max-w-full object-contain\"\n />\n </div>\n\n <div className=\"flex justify-end border-t p-4\">\n <a\n href={asset.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download\n onClick={(e) => {\n void downloadFile(e, asset);\n }}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90\"\n >\n <svg\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </a>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// AssetCard\n// ============================================================================\n\nfunction AssetCard({\n asset,\n onPreview,\n}: {\n asset: PressKitAsset;\n onPreview?: (a: PressKitAsset) => void;\n}) {\n const date = asset.updatedAt\n ? new Date(asset.updatedAt).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })\n : \"\";\n const ext =\n (asset.mimeType || \"file\").split(\"/\").pop()?.toUpperCase() || \"FILE\";\n const size = formatBytes(asset.fileSize);\n // Dead/unreachable thumbnail URLs (stale data, expired CDN, etc.) must\n // degrade to the placeholder instead of a broken-image glyph.\n const [imgError, setImgError] = useState(false);\n\n const thumb =\n asset.thumbnailUrl && !imgError ? (\n <div className=\"aspect-[16/9] overflow-hidden bg-muted/30\">\n <img\n src={asset.thumbnailUrl}\n alt={asset.title}\n className=\"w-full h-full object-contain group-hover:scale-105 transition-transform duration-300\"\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n </div>\n ) : (\n <div className=\"aspect-[16/9] bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-muted-foreground/20\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\"\n />\n </svg>\n </div>\n );\n\n return (\n <div className=\"group flex flex-col bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300\">\n {/* Image assets open a preview modal; other types open the file. */}\n {onPreview && isImageAsset(asset) ? (\n <button\n type=\"button\"\n onClick={() => onPreview(asset)}\n aria-label={`Preview ${asset.title}`}\n className=\"block w-full text-left cursor-zoom-in\"\n >\n {thumb}\n </button>\n ) : (\n <a\n href={asset.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Open ${asset.title}`}\n className=\"block\"\n >\n {thumb}\n </a>\n )}\n\n <div className=\"flex flex-col flex-1 p-5\">\n <span className=\"inline-block self-start text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3\">\n {CATEGORY_LABELS[asset.category] ?? asset.category}\n </span>\n <h3 className=\"text-base font-semibold text-foreground mb-1 line-clamp-2\">\n {asset.title}\n </h3>\n {asset.description && (\n <p className=\"text-sm text-muted-foreground mb-3 line-clamp-2\">\n {asset.description}\n </p>\n )}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">{ext}</span>\n {size && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{size}</span>\n </>\n )}\n {date && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{date}</span>\n </>\n )}\n </div>\n <a\n href={asset.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download\n onClick={(e) => {\n void downloadFile(e, asset);\n }}\n className=\"inline-flex items-center gap-1.5 text-sm font-medium text-primary hover:underline\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </a>\n </div>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// PressReleaseCard\n// ============================================================================\n\nfunction PressReleaseCard({\n release,\n basePath,\n}: {\n release: ContentPageListItem;\n basePath: string;\n}) {\n const date = release.publishedAt || release.lastUpdated;\n const formattedDate = date\n ? new Date(date).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })\n : \"\";\n // Dead/unreachable thumbnail → placeholder, never a broken-image glyph.\n const [imgError, setImgError] = useState(false);\n\n return (\n <a\n href={`${basePath}/${release.slug}`}\n className=\"group flex flex-col bg-card border rounded-xl overflow-hidden hover:shadow-lg hover:border-primary/30 transition-all duration-300\"\n >\n {release.thumbnail && !imgError ? (\n <div className=\"aspect-[16/9] overflow-hidden bg-muted/30\">\n <img\n src={release.thumbnail}\n alt={release.title}\n className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\"\n loading=\"lazy\"\n onError={() => setImgError(true)}\n />\n </div>\n ) : (\n <div className=\"aspect-[16/9] bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-12 h-12 text-muted-foreground/20\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m-1 13a2 2 0 01-2-2V7m3 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z\"\n />\n </svg>\n </div>\n )}\n\n <div className=\"flex flex-col flex-1 p-5 sm:p-6\">\n {release.category && (\n <span className=\"inline-block self-start text-xs font-medium text-primary bg-primary/10 px-2.5 py-1 rounded-full mb-3\">\n {release.category}\n </span>\n )}\n <h3 className=\"text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2\">\n {release.title}\n </h3>\n <p className=\"text-sm text-muted-foreground mb-4 line-clamp-3\">\n {release.excerpt || release.seoDescription || \"\"}\n </p>\n <div className=\"mt-auto flex items-center gap-3 text-xs text-muted-foreground\">\n {release.author && (\n <span className=\"font-medium\">{release.author}</span>\n )}\n {release.author && formattedDate && (\n <span className=\"text-muted-foreground/40\">·</span>\n )}\n {formattedDate && <span>{formattedDate}</span>}\n {release.readingTime ? (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{release.readingTime} min read</span>\n </>\n ) : null}\n </div>\n </div>\n </a>\n );\n}\n\n// ============================================================================\n// PressKitPage\n// ============================================================================\n\nexport function PressKitPage(props: PressKitPageProps) {\n const {\n productName,\n heroTitle = \"Press & Media Kit\",\n heroSubtitle = \"Official logos, brand assets, and media resources. Everything you need to write about us.\",\n mediaContactEmail,\n brandKitUrl,\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n showPressReleases = true,\n pressReleaseBasePath = \"/press\",\n pressReleasesTitle = \"Press Releases\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const contactEmail = mediaContactEmail || product?.contactEmail || undefined;\n\n const [assets, setAssets] = useState<PressKitAsset[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [activeCategory, setActiveCategory] = useState<\n PressKitAssetCategory | \"ALL\"\n >(\"ALL\");\n const [releases, setReleases] = useState<ContentPageListItem[]>([]);\n const [releasesLoading, setReleasesLoading] = useState(true);\n const [preview, setPreview] = useState<PressKitAsset | null>(null);\n\n const fetchAssets = useCallback(async () => {\n if (!resolvedProductId) {\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const PAGE_SIZE = 100;\n // Page through every asset instead of hard-capping at one request —\n // products can have more than a single page — but bound the loop so a\n // stuck `hasMore: true` can't spin into unbounded requests.\n const MAX_PAGES = 10;\n const all: PressKitAsset[] = [];\n let offset = 0;\n for (let pageNum = 0; pageNum < MAX_PAGES; pageNum++) {\n const result = await client.query<{\n publicPressKitAssets: { items: PressKitAsset[]; hasMore: boolean };\n }>(PRESS_KIT_QUERY, {\n productId: resolvedProductId,\n limit: PAGE_SIZE,\n offset,\n });\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load press kit\");\n return;\n }\n const page = result.data?.publicPressKitAssets;\n const items = page?.items || [];\n all.push(...items);\n if (!page?.hasMore || items.length === 0) break;\n offset += PAGE_SIZE;\n }\n setAssets(all);\n setError(null);\n } catch {\n setError(\"Failed to load press kit\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId]);\n\n useEffect(() => {\n fetchAssets();\n }, [fetchAssets]);\n\n // Press releases — published content pages tagged \"press\". Failure here\n // must NOT break the press-kit assets page, so errors are swallowed and\n // the section simply self-hides (releases stays empty).\n const fetchReleases = useCallback(async () => {\n if (!resolvedProductId || !showPressReleases) {\n setReleasesLoading(false);\n return;\n }\n setReleasesLoading(true);\n try {\n const PAGE_SIZE = 100;\n // Safety cap: publicContentPages has no server-side tag filter yet,\n // so this pages through ALL content pages then filters \"press\"\n // client-side. Bound it to avoid a runaway loop (stuck hasMore) and\n // unbounded over-fetch on products with many content pages.\n // TODO(follow-up): add a `tags` arg to publicContentPages and drop this.\n const MAX_PAGES = 10;\n const all: ContentPageListItem[] = [];\n let offset = 0;\n for (let pageNum = 0; pageNum < MAX_PAGES; pageNum++) {\n const result = await client.query<{\n publicContentPages: {\n items: ContentPageListItem[];\n hasMore: boolean;\n };\n }>(PRESS_RELEASES_QUERY, {\n productId: resolvedProductId,\n limit: PAGE_SIZE,\n offset,\n });\n if (result.errors?.length) {\n // Clear stale releases so the section self-hides instead of\n // showing outdated cards from a prior product/context.\n setReleases([]);\n return;\n }\n const page = result.data?.publicContentPages;\n const items = page?.items || [];\n all.push(...items);\n if (!page?.hasMore || items.length === 0) break;\n offset += PAGE_SIZE;\n }\n const pressOnly = all\n .filter((p) => p.tags?.includes(\"press\"))\n .sort((a, b) => {\n const da = new Date(a.publishedAt || a.lastUpdated || 0).getTime();\n const db = new Date(b.publishedAt || b.lastUpdated || 0).getTime();\n return db - da; // newest first\n });\n setReleases(pressOnly);\n } catch {\n // Non-fatal — clear stale and let the section self-hide.\n setReleases([]);\n } finally {\n setReleasesLoading(false);\n }\n }, [client, resolvedProductId, showPressReleases]);\n\n useEffect(() => {\n fetchReleases();\n }, [fetchReleases]);\n\n const presentCategories = CATEGORY_ORDER.filter((c) =>\n assets.some((a) => a.category === c),\n );\n const visibleAssets =\n activeCategory === \"ALL\"\n ? assets\n : assets.filter((a) => a.category === activeCategory);\n\n const grouped = (\n activeCategory === \"ALL\" ? presentCategories : [activeCategory]\n )\n .map((cat) => ({\n cat,\n items: visibleAssets\n .filter((a) => a.category === cat)\n .sort((a, b) => a.sortOrder - b.sortOrder),\n }))\n .filter((g) => g.items.length > 0);\n\n return (\n <div className={`w-full ${className}`}>\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n />\n )}\n\n {/* Hero */}\n <section className=\"py-16 sm:py-20 md:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold tracking-tight text-foreground\">\n {heroTitle}\n </h1>\n <p className=\"mt-4 text-lg text-muted-foreground\">{heroSubtitle}</p>\n {(brandKitUrl || contactEmail) && (\n <div className=\"mt-8 flex flex-wrap items-center justify-center gap-4\">\n {brandKitUrl && (\n <a\n href={brandKitUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-2 px-6 py-3 rounded-lg bg-primary text-primary-foreground font-medium hover:opacity-90 transition-opacity\"\n >\n Download brand kit\n </a>\n )}\n {contactEmail && (\n <a\n href={`mailto:${contactEmail}`}\n className=\"inline-flex items-center gap-2 px-6 py-3 rounded-lg border font-medium text-foreground hover:bg-muted transition-colors\"\n >\n Media inquiries\n </a>\n )}\n </div>\n )}\n </div>\n </div>\n </section>\n\n {/* Press Releases — shows a skeleton while loading (no layout shift),\n then the cards; self-hides when there are none. */}\n {showPressReleases && (releasesLoading || releases.length > 0) && (\n <section className=\"pb-16 sm:pb-20\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <h2 className=\"text-xl font-semibold text-foreground mb-6\">\n {pressReleasesTitle}\n </h2>\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {releasesLoading\n ? [1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-xl overflow-hidden animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"p-5 space-y-3\">\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n <div className=\"h-5 bg-muted rounded w-3/4\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n </div>\n </div>\n ))\n : releases.map((r) => (\n <PressReleaseCard\n key={r.id}\n release={r}\n basePath={pressReleaseBasePath}\n />\n ))}\n </div>\n </div>\n </section>\n )}\n\n {/* Assets */}\n <section className=\"pb-16 sm:pb-20\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n {loading ? (\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-xl overflow-hidden animate-pulse\"\n >\n <div className=\"aspect-[16/9] bg-muted\" />\n <div className=\"p-5 space-y-3\">\n <div className=\"h-4 bg-muted rounded w-1/4\" />\n <div className=\"h-5 bg-muted rounded w-3/4\" />\n <div className=\"h-4 bg-muted rounded w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n ) : error ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">{error}</p>\n </div>\n ) : assets.length === 0 ? (\n <div className=\"text-center py-12\">\n <p className=\"text-muted-foreground\">\n Press materials are coming soon. For media inquiries\n {contactEmail ? (\n <>\n {\", contact \"}\n <a\n href={`mailto:${contactEmail}`}\n className=\"text-primary underline underline-offset-4 hover:no-underline\"\n >\n {contactEmail}\n </a>\n </>\n ) : (\n \" please reach out to our team\"\n )}\n .\n </p>\n </div>\n ) : (\n <>\n {/* Category tabs */}\n {presentCategories.length > 1 && (\n <div className=\"flex flex-wrap gap-2 mb-10 justify-center\">\n {([\"ALL\", ...presentCategories] as const).map((c) => {\n const active = activeCategory === c;\n return (\n <button\n key={c}\n type=\"button\"\n onClick={() => setActiveCategory(c)}\n className={`px-4 py-2 rounded-full text-sm font-medium transition-colors ${\n active\n ? \"bg-primary text-primary-foreground\"\n : \"bg-muted text-muted-foreground hover:text-foreground\"\n }`}\n >\n {c === \"ALL\"\n ? \"All\"\n : (CATEGORY_LABELS[c as PressKitAssetCategory] ?? c)}\n </button>\n );\n })}\n </div>\n )}\n\n {grouped.map((group) => (\n <div key={group.cat} className=\"mb-12\">\n <h2 className=\"text-xl font-semibold text-foreground mb-5\">\n {CATEGORY_LABELS[group.cat] ?? group.cat}\n </h2>\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6\">\n {group.items.map((a) => (\n <AssetCard key={a.id} asset={a} onPreview={setPreview} />\n ))}\n </div>\n </div>\n ))}\n\n {/* Media contact */}\n {contactEmail && (\n <div className=\"mt-8 border-t pt-10 text-center\">\n <h2 className=\"text-lg font-semibold text-foreground mb-2\">\n Media Contact\n </h2>\n <p className=\"text-muted-foreground\">\n For interviews, partnerships, and press inquiries:{\" \"}\n <a\n href={`mailto:${contactEmail}`}\n className=\"text-primary underline underline-offset-4 hover:no-underline\"\n >\n {contactEmail}\n </a>\n </p>\n </div>\n )}\n </>\n )}\n </div>\n </section>\n\n <PressKitLightbox asset={preview} onClose={() => setPreview(null)} />\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Contracts Component\n *\n * CMS-powered public list of downloadable legal contracts. Contracts are\n * stored as press-kit assets with `category: CONTRACT` (files-only, no rich\n * body) and served from the public CDN — same pipeline as the press kit.\n * Renders a simple download list (title + description + download), no preview.\n *\n * @example\n * ```tsx\n * import { ContractsPage } from '@burdenoff/website-sdk'\n *\n * <Route path=\"/contracts\" element={<ContractsPage productName=\"Burdenoff\" />} />\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\nimport { formatBytes, fileExt, downloadFile } from \"./utils\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ContractAsset {\n id: string;\n title: string;\n slug: string;\n description?: string | null;\n fileUrl: string;\n fileName?: string | null;\n fileSize?: number | null;\n mimeType?: string | null;\n version?: string | null;\n tags: string[];\n sortOrder: number;\n updatedAt: string;\n}\n\nexport interface ContractsPageProps {\n productName?: string;\n heroTitle?: string;\n heroSubtitle?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n}\n\n// ============================================================================\n// Query — press-kit assets filtered to the CONTRACT category (server-side)\n// ============================================================================\n\nconst CONTRACTS_QUERY = `\n query PublicContracts($productId: String!, $limit: Int, $offset: Int) {\n publicPressKitAssets(productId: $productId, category: CONTRACT, limit: $limit, offset: $offset) {\n items {\n id\n title\n slug\n description\n fileUrl\n fileName\n fileSize\n mimeType\n version\n tags\n sortOrder\n updatedAt\n }\n hasMore\n }\n }\n`;\n\n// ============================================================================\n// ContractsPage\n// ============================================================================\n\nexport function ContractsPage(props: ContractsPageProps) {\n const {\n productName,\n heroTitle = \"Contracts & Legal Agreements\",\n heroSubtitle = \"Download our standard legal agreements and policies.\",\n className = \"\",\n seoTitle,\n seoDescription,\n seoKeywords,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const displayName = productName ?? product?.name ?? config.productId;\n\n const [contracts, setContracts] = useState<ContractAsset[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchContracts = useCallback(async () => {\n if (!resolvedProductId) {\n setLoading(false);\n return;\n }\n setLoading(true);\n try {\n const PAGE_SIZE = 100;\n // Upper bound so a stuck `hasMore: true` (API bug / malformed cursor)\n // can never spin into unbounded requests — mirrors press-kit's guard.\n const MAX_PAGES = 10;\n const all: ContractAsset[] = [];\n let offset = 0;\n for (let pageNum = 0; pageNum < MAX_PAGES; pageNum++) {\n const result = await client.query<{\n publicPressKitAssets: { items: ContractAsset[]; hasMore: boolean };\n }>(CONTRACTS_QUERY, {\n productId: resolvedProductId,\n limit: PAGE_SIZE,\n offset,\n });\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load contracts\");\n return;\n }\n const page = result.data?.publicPressKitAssets;\n const items = page?.items || [];\n all.push(...items);\n if (!page?.hasMore || items.length === 0) break;\n offset += PAGE_SIZE;\n }\n all.sort(\n (a, b) => a.sortOrder - b.sortOrder || a.title.localeCompare(b.title),\n );\n setContracts(all);\n setError(null);\n } catch {\n setError(\"Failed to load contracts\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId]);\n\n useEffect(() => {\n fetchContracts();\n }, [fetchContracts]);\n\n return (\n <div className={`min-h-screen bg-background ${className}`}>\n <PageHead\n title={seoTitle || `Contracts — ${displayName}`}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n />\n\n {/* Hero */}\n <section className=\"border-b border-border bg-muted/30\">\n <div className=\"max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-16 text-center\">\n <h1 className=\"text-4xl md:text-5xl font-bold text-foreground mb-4\">\n {heroTitle}\n </h1>\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\n {heroSubtitle}\n </p>\n </div>\n </section>\n\n <section className=\"max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12\">\n {loading ? (\n <div className=\"flex justify-center py-20\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-primary border-t-transparent\" />\n </div>\n ) : error ? (\n <div className=\"text-center py-16\">\n <p className=\"text-sm text-muted-foreground\">{error}</p>\n </div>\n ) : contracts.length === 0 ? (\n <div className=\"text-center py-16\">\n <p className=\"text-base text-muted-foreground\">\n No contracts are available yet.\n </p>\n </div>\n ) : (\n <ul className=\"divide-y divide-border rounded-xl border border-border overflow-hidden bg-card\">\n {contracts.map((c) => {\n const ext = fileExt(c);\n const size = formatBytes(c.fileSize);\n return (\n <li\n key={c.id}\n className=\"flex items-center justify-between gap-4 p-5 hover:bg-muted/40 transition-colors\"\n >\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h3 className=\"text-base font-semibold text-foreground truncate\">\n {c.title}\n </h3>\n {c.version && (\n <span className=\"text-xs font-medium text-primary bg-primary/10 px-2 py-0.5 rounded-full\">\n {c.version}\n </span>\n )}\n </div>\n {c.description && (\n <p className=\"text-sm text-muted-foreground mt-1 line-clamp-2\">\n {c.description}\n </p>\n )}\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"font-medium\">{ext}</span>\n {size && (\n <>\n <span className=\"text-muted-foreground/40\">·</span>\n <span>{size}</span>\n </>\n )}\n </div>\n </div>\n <a\n href={c.fileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n download\n aria-label={`Download ${c.title}`}\n onClick={(e) => {\n void downloadFile(e, c);\n }}\n className=\"flex-shrink-0 inline-flex items-center gap-1.5 text-sm font-medium text-primary-foreground bg-primary hover:opacity-90 px-4 py-2 rounded-lg transition-opacity\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\"\n />\n </svg>\n Download\n </a>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n </div>\n );\n}\n"]}
|