@burdenoff/website-sdk 0.0.0-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +24 -0
- package/README.md +357 -0
- package/dist/analytics/index.d.mts +27 -0
- package/dist/analytics/index.d.ts +27 -0
- package/dist/analytics/index.js +36 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +34 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/client/index.d.mts +29 -0
- package/dist/client/index.d.ts +29 -0
- package/dist/client/index.js +261 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.mjs +255 -0
- package/dist/client/index.mjs.map +1 -0
- package/dist/components/contact.d.mts +144 -0
- package/dist/components/contact.d.ts +144 -0
- package/dist/components/contact.js +806 -0
- package/dist/components/contact.js.map +1 -0
- package/dist/components/contact.mjs +780 -0
- package/dist/components/contact.mjs.map +1 -0
- package/dist/components/electron-download.d.mts +32 -0
- package/dist/components/electron-download.d.ts +32 -0
- package/dist/components/electron-download.js +131 -0
- package/dist/components/electron-download.js.map +1 -0
- package/dist/components/electron-download.mjs +108 -0
- package/dist/components/electron-download.mjs.map +1 -0
- package/dist/components/launch-countdown.d.mts +15 -0
- package/dist/components/launch-countdown.d.ts +15 -0
- package/dist/components/launch-countdown.js +89 -0
- package/dist/components/launch-countdown.js.map +1 -0
- package/dist/components/launch-countdown.mjs +87 -0
- package/dist/components/launch-countdown.mjs.map +1 -0
- package/dist/components/newsletter.d.mts +155 -0
- package/dist/components/newsletter.d.ts +155 -0
- package/dist/components/newsletter.js +880 -0
- package/dist/components/newsletter.js.map +1 -0
- package/dist/components/newsletter.mjs +854 -0
- package/dist/components/newsletter.mjs.map +1 -0
- package/dist/components/partners.d.mts +88 -0
- package/dist/components/partners.d.ts +88 -0
- package/dist/components/partners.js +1169 -0
- package/dist/components/partners.js.map +1 -0
- package/dist/components/partners.mjs +1143 -0
- package/dist/components/partners.mjs.map +1 -0
- package/dist/components/pricing.d.mts +194 -0
- package/dist/components/pricing.d.ts +194 -0
- package/dist/components/pricing.js +813 -0
- package/dist/components/pricing.js.map +1 -0
- package/dist/components/pricing.mjs +791 -0
- package/dist/components/pricing.mjs.map +1 -0
- package/dist/components/problems-solved.d.mts +37 -0
- package/dist/components/problems-solved.d.ts +37 -0
- package/dist/components/problems-solved.js +157 -0
- package/dist/components/problems-solved.js.map +1 -0
- package/dist/components/problems-solved.mjs +135 -0
- package/dist/components/problems-solved.mjs.map +1 -0
- package/dist/components/resource-links.d.mts +28 -0
- package/dist/components/resource-links.d.ts +28 -0
- package/dist/components/resource-links.js +229 -0
- package/dist/components/resource-links.js.map +1 -0
- package/dist/components/resource-links.mjs +227 -0
- package/dist/components/resource-links.mjs.map +1 -0
- package/dist/components/social-links.d.mts +37 -0
- package/dist/components/social-links.d.ts +37 -0
- package/dist/components/social-links.js +268 -0
- package/dist/components/social-links.js.map +1 -0
- package/dist/components/social-links.mjs +266 -0
- package/dist/components/social-links.mjs.map +1 -0
- package/dist/components/unsubscribe.d.mts +14 -0
- package/dist/components/unsubscribe.d.ts +14 -0
- package/dist/components/unsubscribe.js +538 -0
- package/dist/components/unsubscribe.js.map +1 -0
- package/dist/components/unsubscribe.mjs +517 -0
- package/dist/components/unsubscribe.mjs.map +1 -0
- package/dist/components/waitlist.d.mts +70 -0
- package/dist/components/waitlist.d.ts +70 -0
- package/dist/components/waitlist.js +864 -0
- package/dist/components/waitlist.js.map +1 -0
- package/dist/components/waitlist.mjs +841 -0
- package/dist/components/waitlist.mjs.map +1 -0
- package/dist/components/website-switcher.d.mts +27 -0
- package/dist/components/website-switcher.d.ts +27 -0
- package/dist/components/website-switcher.js +168 -0
- package/dist/components/website-switcher.js.map +1 -0
- package/dist/components/website-switcher.mjs +146 -0
- package/dist/components/website-switcher.mjs.map +1 -0
- package/dist/content/index.d.mts +247 -0
- package/dist/content/index.d.ts +247 -0
- package/dist/content/index.js +2458 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/index.mjs +2428 -0
- package/dist/content/index.mjs.map +1 -0
- package/dist/index.d.mts +72 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +6273 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +6204 -0
- package/dist/index.mjs.map +1 -0
- package/dist/product/index.d.mts +94 -0
- package/dist/product/index.d.ts +94 -0
- package/dist/product/index.js +282 -0
- package/dist/product/index.js.map +1 -0
- package/dist/product/index.mjs +278 -0
- package/dist/product/index.mjs.map +1 -0
- package/dist/provider-D7Rij9UM.d.mts +86 -0
- package/dist/provider-D7Rij9UM.d.ts +86 -0
- package/dist/seo/index.d.mts +64 -0
- package/dist/seo/index.d.ts +64 -0
- package/dist/seo/index.js +61 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/index.mjs +59 -0
- package/dist/seo/index.mjs.map +1 -0
- package/dist/utils/index.d.mts +21 -0
- package/dist/utils/index.d.ts +21 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +10 -0
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +168 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client/security.ts","../src/client/graphql-client.ts","../src/client/gateway-resolver.ts","../src/client/provider.tsx","../src/product/product-provider.tsx","../src/seo/page-head.tsx","../src/utils/cn.ts","../src/ui/button.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/select.tsx","../src/ui/textarea.tsx","../src/components/contact.tsx","../src/content/content-provider.tsx","../src/components/partners.tsx","../src/components/careers.tsx","../src/components/newsletter.tsx","../src/components/pricing.tsx","../src/components/waitlist.tsx","../src/components/unsubscribe.tsx","../src/components/social-links.tsx","../src/components/resource-links.tsx","../src/components/website-switcher.tsx","../src/components/launch-countdown.tsx","../src/components/problems-solved.tsx","../src/components/electron-download.tsx","../src/analytics/rybbit.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":["createContext","useMemo","useContext","useState","useCallback","useLayoutEffect","jsx","Helmet","twMerge","clsx","cva","React","Slot","React2","React3","LabelPrimitive","React4","React5","useRef","toast","jsxs","Mail","Phone","MapPin","Clock","ReCAPTCHA","Fragment","Send","useEffect","FileText","Download","CheckCircle","Upload","z","useForm","zodResolver","useRateLimit","Twitter","Linkedin","Github","Facebook","Youtube","Instagram","DEFAULT_ITEM_CLASS","isSafeUrl","DropdownMenu","Globe","ChevronDown","Search","Rocket","ArrowRight","ChevronLeft","ChevronRight","History"],"mappings":"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","file":"index.js","sourcesContent":["const LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"::1\"]);\nconst RESERVED_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"x-actor-id\",\n \"x-actor-type\",\n \"x-consent-granted-by\",\n \"x-consent-scope\",\n \"x-consent-granted-at\",\n \"x-consent-expires-at\",\n]);\n\nexport function validateGatewayUrl(value: string): string {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Gateway URL must be a valid absolute URL\");\n }\n\n if (url.protocol === \"https:\") {\n return url.toString();\n }\n\n if (\n url.protocol === \"http:\" &&\n LOOPBACK_HOSTS.has(url.hostname.toLowerCase())\n ) {\n return url.toString();\n }\n\n throw new Error(\"Gateway URL must use HTTPS unless it targets localhost\");\n}\n\nexport function sanitizeHeaders(\n headers?: Record<string, string>,\n): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n return Object.fromEntries(\n Object.entries(headers).filter(\n ([key]) => !RESERVED_HEADERS.has(key.toLowerCase()),\n ),\n );\n}\n","/**\n * Lightweight GraphQL client for the Burdenoff Web SDK.\n * Uses native fetch - zero external dependencies.\n * All calls are unauthenticated (public gateway operations only).\n */\n\nimport { sanitizeHeaders, validateGatewayUrl } from \"./security\";\n\nexport interface WebSDKClientConfig {\n /** Global public gateway URL (e.g. \"https://api.burdenoff.com/global/graphql\") */\n gatewayUrl: string;\n /** Platform product ID for scoping operations */\n productId: string;\n /** Product slug (used for public product queries) */\n productSlug?: string;\n /** reCAPTCHA site key (if not fetched from product config) */\n recaptchaSiteKey?: string;\n /** Rybbit analytics site ID */\n rybbitSiteId?: string;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n}\n\nexport interface GraphQLResponse<T = Record<string, unknown>> {\n data?: T;\n errors?: Array<{\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: Array<string | number>;\n extensions?: Record<string, unknown>;\n }>;\n}\n\nexport class WebSDKClient {\n private config: WebSDKClientConfig;\n private queryCache = new Map<\n string,\n { data: GraphQLResponse<unknown>; ts: number }\n >();\n private inflight = new Map<string, Promise<GraphQLResponse<unknown>>>();\n private static CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private static MAX_CACHE_ENTRIES = 100;\n\n constructor(config: WebSDKClientConfig) {\n this.config = {\n ...config,\n gatewayUrl: validateGatewayUrl(config.gatewayUrl),\n headers: sanitizeHeaders(config.headers),\n };\n }\n\n getConfig(): WebSDKClientConfig {\n return this.config;\n }\n\n /**\n * Execute a GraphQL query (with deduplication and caching)\n */\n async query<T = Record<string, unknown>>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n const cacheKey = JSON.stringify({ query, variables });\n\n // Return cached response if still valid, evict if expired\n const cached = this.queryCache.get(cacheKey);\n if (cached) {\n if (Date.now() - cached.ts < WebSDKClient.CACHE_TTL) {\n return cached.data as GraphQLResponse<T>;\n }\n this.queryCache.delete(cacheKey);\n }\n\n // Deduplicate: if same query is already in-flight, reuse the promise\n const existing = this.inflight.get(cacheKey);\n if (existing) {\n return existing as Promise<GraphQLResponse<T>>;\n }\n\n const promise = this.request<T>(query, variables)\n .then((result) => {\n // Cache successful responses only\n if (result.data && !result.errors?.length) {\n if (this.queryCache.size >= WebSDKClient.MAX_CACHE_ENTRIES) {\n const oldestEntry = this.queryCache.keys().next().value;\n if (oldestEntry) {\n this.queryCache.delete(oldestEntry);\n }\n }\n this.queryCache.set(cacheKey, { data: result, ts: Date.now() });\n }\n return result;\n })\n .finally(() => {\n this.inflight.delete(cacheKey);\n });\n\n this.inflight.set(cacheKey, promise);\n return promise;\n }\n\n /**\n * Execute a GraphQL mutation\n */\n async mutate<T = Record<string, unknown>>(\n mutation: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n return this.request<T>(mutation, variables);\n }\n\n private async request<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n try {\n const response = await fetch(this.config.gatewayUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-product-id\": this.config.productId,\n ...this.config.headers,\n },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n console.error(\n \"[WebSDK] GraphQL request failed\",\n response.status,\n response.statusText,\n );\n return {\n errors: [\n {\n message: `HTTP ${response.status}: ${response.statusText}`,\n extensions: { code: `HTTP_${response.status}` },\n },\n ],\n };\n }\n\n return (await response.json()) as GraphQLResponse<T>;\n } catch (error) {\n console.error(\n \"[WebSDK] Network error\",\n error instanceof Error ? error.message : \"unknown error\",\n );\n return {\n errors: [\n {\n message: error instanceof Error ? error.message : \"Network error\",\n extensions: { code: \"NETWORK_ERROR\" },\n },\n ],\n };\n }\n }\n}\n","/**\n * Runtime gateway URL resolution for product marketing websites.\n *\n * Mirrors the app shell pattern from @burdenoff/fe-libs/shared/config/gatewayUrls\n * but scoped to the website SDK's needs (global gateway only, no workspace gateway).\n *\n * Resolution priority:\n * 1. Explicit `gatewayUrl` passed in config — used as-is only if it is a valid\n * absolute, non-localhost URL (relative/invalid values fall through)\n * 2. Hostname-based auto-detection:\n * - Production domains (vibecontrols.com, bigconsole.com, ...) → prod gateway\n * - Alpha domains (alpha.vibecontrols.com, ...) → alpha gateway\n * - Everything else (localhost, *.local.burdenoff.com) → relative `/global/graphql`\n */\n\nconst PROD_GATEWAY = \"https://graphql.burdenoff.com/global/graphql\";\nconst ALPHA_GATEWAY = \"https://alphagraphql.burdenoff.com/global/graphql\";\n/**\n * Build the local fallback URL. In a browser context we need an absolute\n * URL (the SDK's security validator rejects relative paths), so we\n * prepend `window.location.origin`. During SSR/build (no window) we\n * return a placeholder localhost URL that the validator accepts.\n */\nfunction getLocalFallback(): string {\n if (typeof window !== \"undefined\") {\n return `${window.location.origin}/global/graphql`;\n }\n return \"http://localhost:4000/global/graphql\";\n}\n\n/**\n * All known product domains. When the website is served from any of these,\n * we can determine the environment from the subdomain pattern.\n */\nconst PRODUCT_DOMAINS = [\n \"burdenoff.com\",\n \"algoshred.com\",\n \"vibecontrols.com\",\n \"fluidgrids.com\",\n \"botlit.ai\",\n \"bigconsole.com\",\n \"gethealthybowl.com\",\n \"headshotmarketing.com\",\n \"timecampus.com\",\n \"ggnomad.com\",\n \"movethewheels.com\",\n \"crewfoundry.com\",\n \"planmagnet.com\",\n \"eventfullymanaged.com\",\n \"kadaikodi.com\",\n \"assethandler.com\",\n \"technospam.com\",\n \"semanticfed.com\",\n \"manufacturedops.com\",\n \"theglobalfuel.com\",\n \"housingvista.com\",\n \"proserviceworld.com\",\n \"mybodyshield.com\",\n \"artistrybase.com\",\n \"collabkin.com\",\n \"brainyrich.com\",\n \"theculturepost.com\",\n \"comradecircle.com\",\n \"cosmicintersection.com\",\n \"govcitizenhub.com\",\n \"intelwatchtower.com\",\n \"ecoimpacthub.com\",\n \"buildmyiq.com\",\n \"fluidgrids.ai\",\n];\n\nfunction isProductionHost(hostname: string): boolean {\n return PRODUCT_DOMAINS.some(\n (d) => hostname === d || hostname === `www.${d}` || hostname === `app.${d}`,\n );\n}\n\nfunction isAlphaHost(hostname: string): boolean {\n return PRODUCT_DOMAINS.some(\n (d) =>\n hostname === `alpha.${d}` ||\n hostname === `alphaapp.${d}` ||\n hostname === `staging.${d}`,\n );\n}\n\n/**\n * Resolve the global gateway URL at runtime based on the current hostname.\n *\n * @param explicitUrl - URL explicitly passed in SDK config. Honored only when\n * it is a valid absolute, non-localhost URL; relative/invalid values are\n * ignored so hostname auto-detection can resolve the correct gateway.\n * @returns Resolved gateway URL\n */\nexport function resolveGatewayUrl(explicitUrl?: string): string {\n // Only honor an explicit URL if it's an *absolute* URL and not a localhost\n // dev default. Consumers commonly pass a relative fallback like\n // `'/global/graphql'` when their build-time env var is unset; treating that\n // as authoritative would skip hostname auto-detection and then fail the\n // absolute-URL validator (blank page). A relative/invalid value is ignored\n // here so detection can resolve the correct prod/alpha gateway.\n if (\n explicitUrl &&\n isAbsoluteUrl(explicitUrl) &&\n !isLocalhostUrl(explicitUrl)\n ) {\n return explicitUrl;\n }\n\n if (typeof window === \"undefined\") {\n // SSR / build-time — can't detect hostname. Use the explicit URL only if\n // it's absolute; otherwise the localhost fallback (validator-safe).\n return explicitUrl && isAbsoluteUrl(explicitUrl)\n ? explicitUrl\n : getLocalFallback();\n }\n\n const hostname = window.location.hostname.toLowerCase();\n\n if (isProductionHost(hostname)) return PROD_GATEWAY;\n if (isAlphaHost(hostname)) return ALPHA_GATEWAY;\n\n // Local dev, *.local.burdenoff.com, or unknown — use relative URL\n // which the Vite proxy (dev) or nginx (containerized) will handle.\n return getLocalFallback();\n}\n\nfunction isAbsoluteUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isLocalhostUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n const h = parsed.hostname;\n return h === \"localhost\" || h === \"127.0.0.1\" || h === \"::1\";\n } catch {\n return false;\n }\n}\n","/**\n * React context provider for the Web SDK client.\n * Wraps the application with WebSDKClient configuration.\n */\n\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { resolveGatewayUrl } from \"./gateway-resolver\";\nimport { WebSDKClient, type WebSDKClientConfig } from \"./graphql-client\";\n\nconst WebSDKContext = createContext<WebSDKClient | null>(null);\n\nexport interface WebSDKProviderProps {\n /** SDK client configuration */\n config: WebSDKClientConfig;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider component that makes the WebSDKClient available to all child components.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={{\n * gatewayUrl: \"https://api.burdenoff.com/global/graphql\",\n * productId: \"your-product-id\",\n * productSlug: \"your-product\",\n * }}>\n * <App />\n * </WebSDKProvider>\n * ```\n */\nexport function WebSDKProvider({ config, children }: WebSDKProviderProps) {\n const client = useMemo(() => {\n const resolvedConfig = {\n ...config,\n gatewayUrl: resolveGatewayUrl(config.gatewayUrl),\n };\n return new WebSDKClient(resolvedConfig);\n }, [config]);\n\n return (\n <WebSDKContext.Provider value={client}>{children}</WebSDKContext.Provider>\n );\n}\n\n/**\n * Hook to access the WebSDKClient instance.\n * Must be used within a WebSDKProvider.\n */\nexport function useWebSDK(): WebSDKClient {\n const client = useContext(WebSDKContext);\n if (!client) {\n throw new Error(\"useWebSDK must be used within a WebSDKProvider\");\n }\n return client;\n}\n\n/**\n * Hook to access the SDK configuration.\n * Useful for components that need config values like productId, recaptchaSiteKey, etc.\n */\nexport function useWebSDKConfig(): WebSDKClientConfig {\n const client = useWebSDK();\n return client.getConfig();\n}\n","/**\n * Product Provider\n *\n * React context and hooks for accessing product metadata from the global tenant service.\n * Fetches product info (name, logo, SEO, contact, reCAPTCHA key, etc.) on mount\n * and provides it to all child components.\n */\n\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useLayoutEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ProductData {\n id: string;\n name: string;\n slug: string;\n description?: string | null;\n status: string;\n logoUrl?: string | null;\n website?: string | null;\n appUrl?: string | null;\n docsUrl?: string | null;\n contactEmail?: string | null;\n supportEmail?: string | null;\n contactPhone?: string | null;\n contactAddress?: string | null;\n seoTitle?: string | null;\n seoDescription?: string | null;\n seoKeywords?: string | null;\n ogImage?: string | null;\n socialLinks?: Record<string, string> | null;\n /**\n * Resource links for the website footer \"Resources\" column\n * (JSON: { docs, community, careers, team, companies, ... }).\n * Same shape as socialLinks. Free-form keys; the ResourceLinks\n * component renders known keys and silently ignores the rest.\n * Backed by Product.resourceLinks on the backend (global-tenant-svc).\n */\n resourceLinks?: Record<string, string> | null;\n recaptchaSiteKey?: string | null;\n rybbitSiteId?: string | null;\n notificationEmail?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface ProductProviderProps {\n /** Child components */\n children: ReactNode;\n /** Optional fallback product data (used while loading) */\n fallback?: Partial<ProductData>;\n}\n\n// ============================================================================\n// GraphQL Query\n// ============================================================================\n\n/**\n * Body of fields requested for every product fetch — shared by the primary\n * query and the legacy-backend fallback below. Kept as a string fragment\n * (not a real GraphQL `fragment` block) so we can append/strip\n * `resourceLinks` without touching anything else.\n */\nconst PRODUCT_FIELDS_BASE = `\n id\n name\n slug\n description\n status\n logoUrl\n website\n appUrl\n docsUrl\n contactEmail\n supportEmail\n contactPhone\n contactAddress\n seoTitle\n seoDescription\n seoKeywords\n ogImage\n socialLinks\n recaptchaSiteKey\n rybbitSiteId\n notificationEmail\n metadata\n`;\n\n/**\n * Primary query — includes the recently-added `resourceLinks` field.\n * Backends that have run the corresponding `global-tenant-svc` migration\n * (PR #64) expose this field; older ones don't, in which case\n * GraphQL validation rejects the whole query with\n * `Cannot query field \"resourceLinks\" on type \"PublicProduct\"`. The fetch\n * helper detects that specific error and transparently retries the\n * fallback below, so the SDK works on both pre- and post-migration\n * deployments without consumer-side gating.\n */\nconst PUBLIC_PRODUCT_QUERY = `\n query PublicProduct($slug: String!) {\n publicProduct(slug: $slug) {\n ${PRODUCT_FIELDS_BASE}\n resourceLinks\n }\n }\n`;\n\n/**\n * Fallback query for older backend deployments. Identical to the primary\n * minus `resourceLinks`. Consumers see `product.resourceLinks === undefined`\n * and any consumer (e.g. `<ResourceLinks/>`) falls through to prop / default\n * resolution paths.\n */\nconst PUBLIC_PRODUCT_QUERY_FALLBACK = `\n query PublicProductFallback($slug: String!) {\n publicProduct(slug: $slug) {\n ${PRODUCT_FIELDS_BASE}\n }\n }\n`;\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ProductContextValue {\n product: ProductData | null;\n loading: boolean;\n error: string | null;\n hasProvider: boolean;\n refetch: () => void;\n}\n\nconst ProductContext = createContext<ProductContextValue>({\n product: null,\n loading: true,\n error: null,\n hasProvider: false,\n refetch: () => {},\n});\n\n// ============================================================================\n// Provider\n// ============================================================================\n\n/**\n * ProductProvider fetches and provides product metadata to child components.\n * Uses the product slug from WebSDKConfig to fetch from the public API.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={sdkConfig}>\n * <ProductProvider>\n * <App />\n * </ProductProvider>\n * </WebSDKProvider>\n * ```\n */\nexport function ProductProvider({ children, fallback }: ProductProviderProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const [product, setProduct] = useState<ProductData | null>(\n fallback ? (fallback as ProductData) : null,\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const fetchProduct = useCallback(async () => {\n if (!config.productSlug) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n let result = await client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY,\n { slug: config.productSlug },\n );\n\n // Backwards-compat fallback: if the backend's `publicProduct` schema\n // doesn't yet expose `resourceLinks` (deployed before\n // `global-tenant-svc` PR #64), the primary query fails validation\n // with a \"Cannot query field …\" error and `result.data` is null.\n // Retry the fallback query that omits `resourceLinks`; consumers\n // gracefully see `product.resourceLinks === undefined` and fall\n // through their own resolution paths.\n const schemaMissingResourceLinks = result.errors?.some((e) =>\n /Cannot query field [\"']?resourceLinks[\"']?/i.test(e?.message ?? \"\"),\n );\n if (schemaMissingResourceLinks) {\n result = await client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY_FALLBACK,\n { slug: config.productSlug },\n );\n }\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Unknown error\");\n } else if (result.data?.publicProduct) {\n setProduct(result.data.publicProduct);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch product\");\n } finally {\n setLoading(false);\n }\n }, [client, config.productSlug]);\n\n // Use useLayoutEffect for earliest possible fetch after commit (before paint).\n // Runs when slug or client changes. Client-side query cache + dedup ensures\n // no duplicate network requests even if React StrictMode fires this twice.\n useLayoutEffect(() => {\n fetchProduct();\n }, [fetchProduct]);\n\n const value = useMemo(\n () => ({\n product,\n loading,\n error,\n hasProvider: true,\n refetch: fetchProduct,\n }),\n [product, loading, error, fetchProduct],\n );\n\n return (\n <ProductContext.Provider value={value}>{children}</ProductContext.Provider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to access the current product data.\n *\n * @example\n * ```tsx\n * const { product, loading } = useProduct();\n * if (loading) return <Loading />;\n * return <h1>{product?.name}</h1>;\n * ```\n */\nexport function useProduct(): ProductContextValue {\n return useContext(ProductContext);\n}\n\n/**\n * Hook to get product-specific configuration.\n * Merges SDK config with fetched product data.\n * Useful for getting reCAPTCHA keys, analytics IDs, etc.\n *\n * @example\n * ```tsx\n * const { recaptchaSiteKey, rybbitSiteId } = useProductConfig();\n * ```\n */\nexport function useProductConfig(): {\n recaptchaSiteKey: string | null;\n rybbitSiteId: string | null;\n contactEmail: string | null;\n supportEmail: string | null;\n notificationEmail: string | null;\n productName: string | null;\n logoUrl: string | null;\n} {\n const { product } = useProduct();\n const config = useWebSDKConfig();\n\n return {\n // Prefer product-level config, fall back to SDK config\n recaptchaSiteKey:\n product?.recaptchaSiteKey ?? config.recaptchaSiteKey ?? null,\n rybbitSiteId: product?.rybbitSiteId ?? config.rybbitSiteId ?? null,\n contactEmail: product?.contactEmail ?? null,\n supportEmail: product?.supportEmail ?? null,\n notificationEmail:\n product?.notificationEmail ?? product?.contactEmail ?? null,\n productName: product?.name ?? null,\n logoUrl: product?.logoUrl ?? null,\n };\n}\n","/**\n * PageHead Component\n * Manages dynamic meta tags for SEO optimization on a per-page basis.\n * Supports JSON-LD structured data, Open Graph, Twitter Cards, favicons, and robots directives.\n *\n * @example\n * ```tsx\n * <PageHead\n * title=\"About Us\"\n * description=\"Learn about our mission and team\"\n * productName=\"MyProduct\"\n * keywords=\"about, team, mission\"\n * image=\"/og-about.png\"\n * url=\"https://myproduct.com/about\"\n * favicon=\"/favicon.ico\"\n * robots=\"index, follow\"\n * locale=\"en_US\"\n * twitterHandle=\"@burdenoff\"\n * themeColor=\"#1a1a2e\"\n * structuredData={{\n * \"@context\": \"https://schema.org\",\n * \"@type\": \"WebPage\",\n * name: \"About Us\",\n * }}\n * />\n * ```\n */\n\nimport { Helmet } from \"react-helmet-async\";\n\nexport interface PageHeadProps {\n /** Page title */\n title: string;\n /** Meta description */\n description?: string;\n /** Product/brand name (appended to title) */\n productName?: string;\n /** SEO keywords */\n keywords?: string;\n /** Open Graph image URL */\n image?: string;\n /** Page canonical URL */\n url?: string;\n /** Favicon URL */\n favicon?: string;\n /** Robots directive (e.g., \"index, follow\") */\n robots?: string;\n /** Open Graph locale (e.g., \"en_US\") */\n locale?: string;\n /** Twitter handle (e.g., \"@burdenoff\") */\n twitterHandle?: string;\n /** Theme color for mobile browsers */\n themeColor?: string;\n /** JSON-LD structured data objects */\n structuredData?: Record<string, unknown> | Array<Record<string, unknown>>;\n /** Additional meta tags */\n additionalMeta?: Array<{\n name?: string;\n property?: string;\n content: string;\n }>;\n}\n\nexport function PageHead({\n title,\n description,\n productName,\n keywords,\n image,\n url,\n favicon,\n robots = \"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\",\n locale = \"en_US\",\n twitterHandle,\n themeColor = \"#000000\",\n structuredData,\n additionalMeta,\n}: PageHeadProps) {\n const fullTitle =\n productName && !title.includes(productName)\n ? `${title} | ${productName}`\n : title;\n\n const fullImageUrl =\n image && !image.startsWith(\"http\") && url\n ? `${url.replace(/\\/$/, \"\")}${image}`\n : image;\n\n // Normalize structured data to an array\n const structuredDataItems: Array<Record<string, unknown>> = structuredData\n ? Array.isArray(structuredData)\n ? structuredData\n : [structuredData]\n : [];\n\n return (\n <Helmet>\n {/* Primary Meta Tags */}\n <title>{fullTitle}</title>\n <meta name=\"title\" content={fullTitle} />\n {description && <meta name=\"description\" content={description} />}\n {keywords && <meta name=\"keywords\" content={keywords} />}\n <meta name=\"author\" content=\"Burdenoff Consultancy Services Pvt Ltd\" />\n <meta name=\"robots\" content={robots} />\n\n {/* Canonical URL */}\n {url && <link rel=\"canonical\" href={url} />}\n\n {/* Favicon */}\n {favicon && <link rel=\"icon\" href={favicon} />}\n\n {/* Open Graph / Facebook */}\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={fullTitle} />\n {description && <meta property=\"og:description\" content={description} />}\n {fullImageUrl && <meta property=\"og:image\" content={fullImageUrl} />}\n {url && <meta property=\"og:url\" content={url} />}\n <meta property=\"og:locale\" content={locale} />\n {productName && <meta property=\"og:site_name\" content={productName} />}\n\n {/* Twitter Card */}\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta name=\"twitter:title\" content={fullTitle} />\n {description && <meta name=\"twitter:description\" content={description} />}\n {fullImageUrl && <meta name=\"twitter:image\" content={fullImageUrl} />}\n {twitterHandle && <meta name=\"twitter:creator\" content={twitterHandle} />}\n\n {/* Theme Color */}\n <meta name=\"theme-color\" content={themeColor} />\n\n {/* JSON-LD Structured Data */}\n {structuredDataItems.map((data, index) => (\n <script key={`ld-${index}`} type=\"application/ld+json\">\n {JSON.stringify(data)}\n </script>\n ))}\n\n {/* Additional Meta Tags */}\n {additionalMeta?.map((meta, index) => (\n <meta\n key={`meta-${index}`}\n {...(meta.name ? { name: meta.name } : {})}\n {...(meta.property ? { property: meta.property } : {})}\n content={meta.content}\n />\n ))}\n </Helmet>\n );\n}\n","/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx and tailwind-merge for optimal class handling\n */\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge multiple class names intelligently\n * - Handles conditional classes via clsx\n * - Deduplicates and resolves Tailwind conflicts via tailwind-merge\n *\n * @example\n * ```ts\n * cn('px-4 py-2', 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-4 py-2 bg-blue-500 text-white' (if isActive is true)\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","import * as React from \"react\";\n\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils/cn\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n);\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\n/** Native `<select>` wrapper matching the `Input` design tokens. */\nconst Select = React.forwardRef<\n HTMLSelectElement,\n React.ComponentProps<\"select\">\n>(({ className, children, ...props }, ref) => {\n return (\n <select\n className={cn(\n \"flex h-9 w-full appearance-none rounded-md border border-input bg-transparent bg-[length:1rem_1rem] bg-[right_0.75rem_center] bg-no-repeat px-3 py-1 pr-8 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n // Inline SVG chevron: SVG inside a `background-image: url(data:…)`\n // does NOT inherit `currentColor` from the host element (the SVG is\n // its own document with no parent CSS context), so the stroke is\n // hardcoded to a muted slate-400 (#94a3b8). Matches the muted\n // foreground token visually in both light and dark themes well\n // enough for a passive chevron — addresses #9 review feedback.\n \"bg-[url(\\\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\\\")]\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </select>\n );\n});\nSelect.displayName = \"Select\";\n\nexport { Select };\n","import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","/**\n * Contact Page Component\n * Complete contact page with form submission via GraphQL, reCAPTCHA validation,\n * contact information display, and additional contact options.\n * Uses the WebSDKClient provider for API calls.\n *\n * @example\n * ```tsx\n * import { ContactPage } from '@burdenoff/website-sdk/components/contact'\n *\n * <ContactPage\n * productName=\"MyProduct\"\n * recaptchaSiteKey=\"your-recaptcha-key\"\n * contactEmail=\"contact@myproduct.com\"\n * contactPhone=\"+1-234-567-8900\"\n * officeAddress={{\n * line1: \"123 Main St\",\n * line2: \"Suite 100\",\n * line3: \"City, State 12345\",\n * country: \"USA\"\n * }}\n * />\n * ```\n */\n\n\"use client\";\n\nimport { useState, useRef } from \"react\";\n\nimport { Mail, MapPin, Phone, Clock, Send } from \"lucide-react\";\nimport ReCAPTCHA from \"react-google-recaptcha\";\nimport { toast } from \"sonner\";\n\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 { Label } from \"../ui/label\";\nimport { Select } from \"../ui/select\";\nimport { Textarea } from \"../ui/textarea\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\ninterface OfficeAddress {\n line1: string;\n line2: string;\n line3: string;\n country: string;\n}\n\ninterface ContactOption {\n title: string;\n description: string;\n buttonText: string;\n buttonLink: string;\n}\n\n/**\n * One entry in the contact-form Category dropdown. Each product website\n * supplies its own allow-list via the `categories` prop so the\n * vocabulary stays product-appropriate (e.g. VibeControls uses\n * `plugin-developer`, a manufacturing site uses `dealer`). The backend\n * accepts whatever `value` string is sent and persists it directly.\n *\n * `value` flows to the backend; `label` is what the user sees.\n */\nexport interface ContactCategory {\n /** Stored on the server. Short, kebab-case is conventional. */\n value: string;\n /** Human-readable label shown in the dropdown. */\n label: string;\n}\n\n/**\n * Conservative starter category list — Burdenoff-generic vocabulary\n * (General / Sales / Support / Partnership / Press / Careers / Security).\n *\n * **Not** applied by default: pass it explicitly to opt in:\n *\n * ```tsx\n * <ContactPage\n * …\n * categories={DEFAULT_CONTACT_CATEGORIES}\n * />\n * ```\n *\n * The component default for `categories` is `[]` (no dropdown) so this\n * SDK release is backward-compatible with existing consumers that\n * don't yet know about the field — see the prop docs.\n */\nexport const DEFAULT_CONTACT_CATEGORIES: ContactCategory[] = [\n { value: \"general\", label: \"General enquiry\" },\n { value: \"sales\", label: \"Sales\" },\n { value: \"support\", label: \"Support\" },\n { value: \"partnership\", label: \"Partnership\" },\n { value: \"press\", label: \"Press / media\" },\n { value: \"careers\", label: \"Careers\" },\n { value: \"security\", label: \"Security disclosure\" },\n];\n\ninterface ContactFormData {\n firstName: string;\n lastName: string;\n email: string;\n company?: string;\n category?: string;\n subject: string;\n message: string;\n recaptchaToken: string;\n}\n\ntype SubmitStatus = \"idle\" | \"success\" | \"error\";\n\nexport interface ContactPageProps {\n /** Product name. Falls back to SDK config productId if not provided. */\n productName?: string;\n /** reCAPTCHA site key (optional, falls back to SDK config) */\n recaptchaSiteKey?: string;\n /** Contact email */\n contactEmail: string;\n /** Contact phone number */\n contactPhone: string;\n /** Office address */\n officeAddress: OfficeAddress;\n /** Response time message */\n responseTime?: string;\n /** Hero title */\n heroTitle?: string;\n /** Hero description */\n heroDescription?: string;\n /**\n * Heading level for the hero title. Defaults to `1` (a full page hero,\n * `<h1>`). Pass `2` when embedding ContactPage inside another page that\n * already owns the page `<h1>` (e.g. `PartnersPage`) — renders a compact\n * `<h2>` section header instead of a competing hero, keeping one `<h1>`\n * per page for SEO and a clean visual hierarchy.\n */\n headingLevel?: 1 | 2;\n /** Additional contact options */\n additionalOptions?: ContactOption[];\n /**\n * Inquiry-type dropdown allow-list. **Defaults to `[]`** — the\n * dropdown does not render unless the consumer explicitly opts in.\n *\n * Two ways to opt in:\n *\n * ```tsx\n * // 1. Provide a product-specific list\n * <ContactPage categories={[{ value: 'sales', label: 'Sales' }, …]} />\n *\n * // 2. Or use the conservative SDK starter list\n * <ContactPage categories={DEFAULT_CONTACT_CATEGORIES} />\n * ```\n *\n * Default is intentionally empty (not `DEFAULT_CONTACT_CATEGORIES`)\n * to keep this SDK release backward-compatible with existing\n * consumers that don't yet wire `categories` — they get zero\n * behavior change.\n *\n * Typed `readonly` because the component never mutates the array;\n * lets product sites pass an `as const`-frozen config without an\n * extra `[...spread]` at the call site.\n */\n categories?: readonly ContactCategory[];\n /** Label shown above the category dropdown. */\n categoryLabel?: string;\n /** Placeholder text for the unselected state of the dropdown. */\n categoryPlaceholder?: string;\n /**\n * Whether selecting a category is required to submit. Defaults to\n * `true` — the whole point of the dropdown is routing, so users\n * self-triage instead of pushing that work onto support.\n */\n categoryRequired?: boolean;\n /** SEO metadata */\n seo?: {\n title?: string;\n description?: string;\n keywords?: string;\n image?: string;\n url?: string;\n };\n}\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst SUBMIT_CONTACT_INQUIRY_MUTATION = /* GraphQL */ `\n mutation SubmitContactInquiry($input: SubmitContactInquiryInput!) {\n submitContactInquiry(input: $input) {\n success\n message\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function submitContactForm(\n client: WebSDKClient,\n data: ContactFormData,\n productId: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n submitContactInquiry: {\n success: boolean;\n message: string;\n };\n }>(SUBMIT_CONTACT_INQUIRY_MUTATION, {\n input: {\n name: `${data.firstName} ${data.lastName}`,\n email: data.email.trim().toLowerCase(),\n company: data.company || undefined,\n subject: data.subject,\n message: data.message,\n productId,\n // Send `category` only when the user actually picked one. Older\n // backend deployments without the `category` field in the\n // `SubmitContactInquiryInput` schema would reject any unknown\n // field; spreading conditionally keeps the SDK forward-\n // compatible.\n ...(data.category ? { category: data.category } : {}),\n ...(data.recaptchaToken ? { recaptchaToken: data.recaptchaToken } : {}),\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Failed to send message\";\n return { success: false, message: errorMsg };\n }\n\n const response = result.data?.submitContactInquiry;\n if (response?.success) {\n return {\n success: true,\n message: response.message || \"Message sent successfully!\",\n };\n }\n\n return {\n success: false,\n message: response?.message || \"Failed to send message\",\n };\n } catch (error) {\n console.error(\"Contact form submission error:\", error);\n return {\n success: false,\n message: \"Network error. Please try again.\",\n };\n }\n}\n\n// ============================================================================\n// HELPER\n// ============================================================================\n\nfunction replacePlaceholders(\n text: string,\n productName: string,\n email: string,\n): string {\n return text.replace(/{productName}/g, productName).replace(/{email}/g, email);\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function ContactPage({\n productName,\n recaptchaSiteKey,\n contactEmail,\n contactPhone,\n officeAddress,\n responseTime = \"We typically respond within 24 hours\",\n heroTitle = \"Get in Touch\",\n heroDescription = \"Have questions about {productName}? We're here to help. Reach out to our team and we'll get back to you as soon as possible.\",\n headingLevel = 1,\n // Backward-compatibility: default to `[]` so existing consumers\n // (fluidgrids/burdenoff/algoshred websites) that don't pass\n // `categories` continue to render with NO dropdown — same behavior\n // they had before this SDK version. To opt in, pass an explicit\n // `categories={…}` array (or the exported `DEFAULT_CONTACT_CATEGORIES`\n // constant for the sane Burdenoff-generic vocabulary).\n categories = [],\n categoryLabel = \"Category\",\n categoryPlaceholder = \"Select a category\",\n categoryRequired = true,\n additionalOptions = [\n {\n title: \"Sales Inquiries\",\n description:\n \"Ready to see {productName} in action? Our sales team is here to help.\",\n buttonText: \"Contact Sales\",\n buttonLink: `mailto:${contactEmail}`,\n },\n {\n title: \"Technical Support\",\n description:\n \"Need help with your {productName} setup? Our support team is ready.\",\n buttonText: \"Get Support\",\n buttonLink: `mailto:${contactEmail}`,\n },\n {\n title: \"Partnership\",\n description:\n \"Interested in partnering with {productName}? Let's explore opportunities.\",\n buttonText: \"Partner With Us\",\n buttonLink: `mailto:${contactEmail}`,\n },\n ],\n seo,\n}: ContactPageProps) {\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 // Resolution order: explicit prop → product CMS (publicProduct.recaptchaSiteKey)\n // → SDK config/env. Lets the key be managed per-product in the CMS without\n // any env wiring on the consuming site.\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ??\n product?.recaptchaSiteKey ??\n config.recaptchaSiteKey ??\n \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<SubmitStatus>(\"idle\");\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Get reCAPTCHA token (skip validation when no site key is configured)\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n setIsSubmitting(true);\n setSubmitStatus(\"idle\");\n\n // Store form reference before async operations\n const form = e.currentTarget;\n\n try {\n const formData = new FormData(form);\n\n // Category is rendered only when `categories` is non-empty. Read\n // it conditionally so an opt-out site (`categories={[]}`) never\n // sends an empty-string `category` on the wire.\n const showCategory = categories.length > 0;\n const rawCategory = showCategory\n ? ((formData.get(\"category\") as string | null) ?? \"\").trim()\n : \"\";\n if (showCategory && categoryRequired && !rawCategory) {\n // Belt-and-braces validation. Browsers already enforce the\n // `required` attribute, but the form-data path runs even when\n // the native check is bypassed by a custom client.\n //\n // Message is hardcoded (not derived from `categoryPlaceholder`)\n // so a placeholder like \"Department type\" doesn't produce\n // ungrammatical output like \"Please department type\" —\n // addresses #9 review feedback.\n toast.error(\"Please select a category\");\n setIsSubmitting(false);\n return;\n }\n\n const contactData: ContactFormData = {\n firstName: formData.get(\"firstName\") as string,\n lastName: formData.get(\"lastName\") as string,\n email: formData.get(\"email\") as string,\n company: formData.get(\"company\") as string,\n category: rawCategory || undefined,\n subject: formData.get(\"subject\") as string,\n message: formData.get(\"message\") as string,\n recaptchaToken,\n };\n\n const result = await submitContactForm(\n client,\n contactData,\n resolvedProductId,\n );\n\n if (result.success) {\n setSubmitStatus(\"success\");\n toast.success(\n result.message ??\n `Thank you for contacting ${displayName}. We'll get back to you within 24 hours.`,\n );\n\n // Reset form\n if (form) {\n form.reset();\n }\n // Reset reCAPTCHA\n recaptchaRef.current?.reset();\n } else {\n setSubmitStatus(\"error\");\n toast.error(\n result.message ?? \"Failed to send message. Please try again.\",\n );\n recaptchaRef.current?.reset();\n }\n } catch (error) {\n console.error(\"Error submitting form:\", error);\n setSubmitStatus(\"error\");\n toast.error(\"Failed to send message. Please try again later.\");\n recaptchaRef.current?.reset();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <div className=\"w-full\">\n {seo && (\n <PageHead\n title={\n seo.title ?? `Contact ${displayName} - Get in Touch With Our Team`\n }\n description={\n seo.description ??\n `Ready to transform your business? Contact our team for sales inquiries, technical support, or partnership opportunities. We're here to help you succeed.`\n }\n productName={displayName}\n keywords={\n seo.keywords ??\n `contact ${displayName.toLowerCase()}, sales inquiries, customer support, technical support, partnership opportunities, get in touch`\n }\n image={seo.image ?? \"/og-image-contact.png\"}\n url={seo.url}\n />\n )}\n\n {/* Hero Section — full page hero (h1) by default; compact section\n header (h2) when embedded in a page that already owns the <h1>. */}\n <section\n className={\n headingLevel === 2\n ? \"py-12 md:py-16\"\n : \"bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg:py-24\"\n }\n >\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 {headingLevel === 2 ? (\n <h2 className=\"text-2xl md:text-3xl font-bold mb-3\">\n {heroTitle}\n </h2>\n ) : (\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6\">\n {heroTitle}\n </h1>\n )}\n <p className=\"text-lg sm:text-xl text-muted-foreground leading-relaxed\">\n {replacePlaceholders(heroDescription, displayName, contactEmail)}\n </p>\n </div>\n </div>\n </section>\n\n {/* Contact Form and Info */}\n <section className=\"py-12 sm:py-16 md:py-20 lg:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"grid sm:grid-cols-1 lg:grid-cols-3 gap-8 sm:gap-10 lg:gap-12\">\n {/* Contact Information */}\n <div className=\"lg:col-span-1 order-2 lg:order-1\">\n <h2 className=\"text-xl sm:text-2xl font-bold mb-4 sm:mb-6\">\n Contact Information\n </h2>\n\n <div className=\"space-y-4 sm:space-y-6\">\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Mail className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Email\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base break-all\">\n {contactEmail}\n </p>\n </div>\n </div>\n\n {contactPhone && (\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Phone className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Phone\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base\">\n {contactPhone}\n </p>\n </div>\n </div>\n )}\n\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <MapPin className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Office\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base leading-relaxed\">\n {officeAddress.line1}\n <br />\n {officeAddress.line2}\n <br />\n {officeAddress.line3}\n <br />\n {officeAddress.country}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Clock className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Response Time\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base\">\n {responseTime}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Contact Form */}\n <div className=\"lg:col-span-2 order-1 lg:order-2\">\n <div className=\"bg-card border rounded-lg p-4 sm:p-6 md:p-8\">\n <h2 className=\"text-xl sm:text-2xl font-bold mb-4 sm:mb-6\">\n Send us a Message\n </h2>\n\n <form\n onSubmit={handleSubmit}\n className=\"space-y-4 sm:space-y-6\"\n >\n <div className=\"grid sm:grid-cols-2 gap-4 sm:gap-6\">\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"firstName\"\n className=\"text-sm sm:text-base\"\n >\n First Name *\n </Label>\n <Input\n id=\"firstName\"\n name=\"firstName\"\n required\n placeholder=\"John\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"lastName\"\n className=\"text-sm sm:text-base\"\n >\n Last Name *\n </Label>\n <Input\n id=\"lastName\"\n name=\"lastName\"\n required\n placeholder=\"Doe\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\" className=\"text-sm sm:text-base\">\n Email *\n </Label>\n <Input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n required\n placeholder=\"john@company.com\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"company\" className=\"text-sm sm:text-base\">\n Company\n </Label>\n <Input\n id=\"company\"\n name=\"company\"\n placeholder=\"Acme Inc.\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n {categories.length > 0 && (\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"category\"\n className=\"text-sm sm:text-base\"\n >\n {categoryLabel}\n {categoryRequired ? \" *\" : \"\"}\n </Label>\n <Select\n id=\"category\"\n name=\"category\"\n required={categoryRequired}\n defaultValue=\"\"\n className=\"text-sm sm:text-base\"\n >\n {/*\n * `disabled` is tied to `categoryRequired` on\n * purpose. When required, the placeholder is\n * locked out so the native form-validation can\n * enforce that the user picks a real value;\n * when optional, leaving it enabled lets the\n * user clear an accidental selection back to\n * the empty / uncategorized state (otherwise\n * an optional dropdown becomes effectively\n * sticky after any click). The form-submit\n * handler treats `category === ''` as\n * `undefined` on the wire so unselected\n * submissions don't carry a category at all.\n */}\n <option value=\"\" disabled={categoryRequired}>\n {categoryPlaceholder}\n </option>\n {categories.map((c) => (\n <option key={c.value} value={c.value}>\n {c.label}\n </option>\n ))}\n </Select>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"subject\" className=\"text-sm sm:text-base\">\n Subject *\n </Label>\n <Input\n id=\"subject\"\n name=\"subject\"\n required\n placeholder=\"How can we help you?\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"message\" className=\"text-sm sm:text-base\">\n Message *\n </Label>\n <Textarea\n id=\"message\"\n name=\"message\"\n required\n placeholder=\"Tell us more about your needs...\"\n rows={5}\n className=\"text-sm sm:text-base min-h-[120px] sm:min-h-[150px] resize-y\"\n />\n </div>\n\n <div className=\"space-y-4\">\n {effectiveRecaptchaSiteKey && (\n <div className=\"flex justify-center sm:justify-start\">\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n </div>\n )}\n\n <Button\n type=\"submit\"\n size=\"lg\"\n disabled={isSubmitting}\n className=\"w-full sm:w-auto min-w-[200px]\"\n >\n {isSubmitting ? (\n \"Sending...\"\n ) : (\n <>\n Send Message <Send className=\"ml-2 h-4 w-4\" />\n </>\n )}\n </Button>\n </div>\n\n {submitStatus === \"success\" && (\n <div className=\"p-3 sm:p-4 bg-green-50 border border-green-200 rounded-lg text-green-800 mt-4\">\n <p className=\"font-medium text-sm sm:text-base\">\n Message sent successfully!\n </p>\n <p className=\"text-xs sm:text-sm mt-1\">\n Thank you for contacting {displayName}. We'll get\n back to you within 24 hours.\n </p>\n </div>\n )}\n\n {submitStatus === \"error\" && (\n <div className=\"p-3 sm:p-4 bg-red-50 border border-red-200 rounded-lg text-red-800 mt-4\">\n <p className=\"font-medium text-sm sm:text-base\">\n Failed to send message\n </p>\n <p className=\"text-xs sm:text-sm mt-1\">\n Please try again later or contact us directly at{\" \"}\n {contactEmail}\n </p>\n </div>\n )}\n </form>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Additional Contact Options — hidden when additionalOptions is empty */}\n {additionalOptions.length > 0 && (\n <section className=\"py-12 sm:py-16 md:py-20 lg:py-24 bg-muted/30\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <h2 className=\"text-2xl sm:text-3xl font-bold text-center mb-8 sm:mb-12\">\n More Ways to Connect\n </h2>\n\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8 max-w-5xl mx-auto\">\n {additionalOptions.map((option, index) => (\n <div\n key={index}\n className=\"text-center p-4 sm:p-6 bg-card border rounded-lg\"\n >\n <h3 className=\"font-semibold text-base sm:text-lg mb-2\">\n {option.title}\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base mb-4 leading-relaxed\">\n {replacePlaceholders(\n option.description,\n displayName,\n contactEmail,\n )}\n </p>\n <Button\n variant=\"outline\"\n asChild\n className=\"text-sm sm:text-base\"\n >\n <a href={option.buttonLink}>{option.buttonText}</a>\n </Button>\n </div>\n ))}\n </div>\n </div>\n </section>\n )}\n </div>\n );\n}\n","/**\n * Content Provider\n *\n * React hooks for fetching public content pages from the global tenant service.\n * Content pages include privacy policies, terms of service, blogs, changelogs, etc.\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\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ContentPageData {\n id: string;\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;\n version: number;\n tags?: string[];\n excerpt?: string | null;\n thumbnail?: string | null;\n author?: string | null;\n publishedAt?: string | null;\n readingTime?: number | null;\n featured?: boolean;\n category?: string | null;\n}\n\nexport interface ContentPageListItem {\n id: string;\n title: string;\n slug: string;\n lastUpdated: string;\n tags?: string[];\n excerpt?: string | null;\n thumbnail?: string | null;\n author?: string | null;\n publishedAt?: string | null;\n readingTime?: number | null;\n featured?: boolean;\n category?: string | null;\n seoDescription?: string | null;\n}\n\nexport interface ContentPageListData {\n items: ContentPageListItem[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface UseContentPageOptions {\n /** Whether to use template variable replacement (resolvedContentPage) */\n resolve?: boolean;\n}\n\n// ============================================================================\n// GraphQL Queries\n// ============================================================================\n\nconst PUBLIC_CONTENT_PAGE_QUERY = `\n query PublicContentPage($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 version\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\nconst PUBLIC_RESOLVED_CONTENT_PAGE_QUERY = `\n query PublicResolvedContentPage($slug: String!, $productId: String!) {\n publicResolvedContentPage(slug: $slug, productId: $productId) {\n id\n title\n slug\n content\n contentFormat\n seoTitle\n seoDescription\n seoKeywords\n lastUpdated\n version\n excerpt\n thumbnail\n author\n publishedAt\n readingTime\n featured\n category\n }\n }\n`;\n\nconst PUBLIC_CONTENT_PAGES_QUERY = `\n query PublicContentPages($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\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to fetch a single public content page by slug.\n *\n * @example\n * ```tsx\n * const { data, loading, error } = useContentPage('privacy-policy');\n * ```\n */\nexport function useContentPage(\n slug: string,\n options?: UseContentPageOptions,\n): {\n data: ContentPageData | 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 = product?.id || config.productId;\n const [data, setData] = useState<ContentPageData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPage = useCallback(async () => {\n if (!resolvedProductId) return; // Wait for product to load\n\n setLoading(true);\n setError(null);\n\n try {\n const query = options?.resolve\n ? PUBLIC_RESOLVED_CONTENT_PAGE_QUERY\n : PUBLIC_CONTENT_PAGE_QUERY;\n\n const queryName = options?.resolve\n ? \"publicResolvedContentPage\"\n : \"publicContentPage\";\n\n const result = await client.query<Record<string, ContentPageData | null>>(\n query,\n {\n slug,\n productId: resolvedProductId,\n },\n );\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Unknown error\");\n setData(null);\n } else {\n setData(result.data?.[queryName] ?? null);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch content\");\n setData(null);\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, slug, options?.resolve]);\n\n useEffect(() => {\n fetchPage();\n }, [fetchPage]);\n\n return { data, loading, error, refetch: fetchPage };\n}\n\n/**\n * Hook to fetch a list of public content pages for the current product.\n *\n * @example\n * ```tsx\n * const { data, loading } = useContentPages({ limit: 10 });\n * ```\n */\nexport function useContentPages(options?: {\n limit?: number;\n offset?: number;\n}): {\n data: ContentPageListData | null;\n loading: boolean;\n error: string | null;\n refetch: () => void;\n} {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const [data, setData] = useState<ContentPageListData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchPages = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.query<{\n publicContentPages: ContentPageListData;\n }>(PUBLIC_CONTENT_PAGES_QUERY, {\n productId: config.productId,\n limit: options?.limit ?? 50,\n offset: options?.offset ?? 0,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Unknown error\");\n setData(null);\n } else {\n setData(result.data?.publicContentPages ?? null);\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to fetch content pages\",\n );\n setData(null);\n } finally {\n setLoading(false);\n }\n }, [client, config.productId, options?.limit, options?.offset]);\n\n useEffect(() => {\n fetchPages();\n }, [fetchPages]);\n\n return { data, loading, error, refetch: fetchPages };\n}\n\n/**\n * Minimal, dependency-free Markdown → HTML renderer.\n *\n * HTML entities are escaped first so raw user content cannot inject markup\n * (the output is fed to dangerouslySetInnerHTML). Mirrors the admin content\n * editor's preview renderer so authored content looks the same everywhere.\n */\nfunction renderMarkdown(md: string): string {\n let html = md;\n\n html = html\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n\n // Fenced code blocks\n html = html.replace(/```(\\w*)\\n([\\s\\S]*?)```/g, (_m, _lang, code) => {\n return `<pre><code>${code.trim()}</code></pre>`;\n });\n // Inline code\n html = html.replace(/`([^`]+)`/g, \"<code>$1</code>\");\n\n // Headings\n html = html.replace(/^###### (.+)$/gm, \"<h6>$1</h6>\");\n html = html.replace(/^##### (.+)$/gm, \"<h5>$1</h5>\");\n html = html.replace(/^#### (.+)$/gm, \"<h4>$1</h4>\");\n html = html.replace(/^### (.+)$/gm, \"<h3>$1</h3>\");\n html = html.replace(/^## (.+)$/gm, \"<h2>$1</h2>\");\n html = html.replace(/^# (.+)$/gm, \"<h1>$1</h1>\");\n\n // Bold / italic\n html = html.replace(/\\*\\*\\*(.+?)\\*\\*\\*/g, \"<strong><em>$1</em></strong>\");\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\");\n html = html.replace(/\\*(.+?)\\*/g, \"<em>$1</em>\");\n\n // Links\n html = html.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>',\n );\n\n // Blockquotes (entities already escaped → match >)\n html = html.replace(/^> (.+)$/gm, \"<blockquote>$1</blockquote>\");\n\n // Unordered lists\n html = html.replace(/(^- .+$(\\n^- .+$)*)/gm, (block) => {\n const items = block\n .split(\"\\n\")\n .map((line) => `<li>${line.replace(/^- /, \"\")}</li>`)\n .join(\"\");\n return `<ul>${items}</ul>`;\n });\n // Ordered lists\n html = html.replace(/(^\\d+\\. .+$(\\n^\\d+\\. .+$)*)/gm, (block) => {\n const items = block\n .split(\"\\n\")\n .map((line) => `<li>${line.replace(/^\\d+\\. /, \"\")}</li>`)\n .join(\"\");\n return `<ol>${items}</ol>`;\n });\n\n // Horizontal rule\n html = html.replace(/^---$/gm, \"<hr />\");\n\n // Paragraphs\n html = html\n .split(/\\n\\n+/)\n .map((block) => {\n const trimmed = block.trim();\n if (!trimmed) return \"\";\n if (/^<(h[1-6]|ul|ol|pre|blockquote|hr)/.test(trimmed)) return trimmed;\n return `<p>${trimmed.replace(/\\n/g, \"<br />\")}</p>`;\n })\n .join(\"\\n\");\n\n return html;\n}\n\n/**\n * Content renderer component.\n *\n * - `markdown` (default): converts to HTML via {@link renderMarkdown}\n * - `html`: rendered as-is (assumed already sanitized upstream)\n * - anything else: plain-text fallback\n *\n * @example\n * ```tsx\n * <ContentRenderer content={page.content} format={page.contentFormat} />\n * ```\n */\nexport function ContentRenderer({\n content,\n format = \"markdown\",\n className,\n}: {\n content: string;\n format?: string;\n className?: string;\n}) {\n if (format === \"markdown\") {\n return (\n <div\n className={className}\n dangerouslySetInnerHTML={{ __html: renderMarkdown(content) }}\n />\n );\n }\n\n if (format === \"html\") {\n return (\n <div\n className={className}\n dangerouslySetInnerHTML={{ __html: content }}\n />\n );\n }\n\n // Plain text fallback\n return (\n <div className={className}>\n <pre style={{ whiteSpace: \"pre-wrap\", fontFamily: \"inherit\" }}>\n {content}\n </pre>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Partners Page Component\n *\n * CMS-powered public partner programme page. Composes three sources of truth\n * we already manage in the admin:\n *\n * 1. **Marketing copy** — a single `ProductContentPage` matched by `tag`\n * (default `\"partner\"`) or by `slug`. Rendered through `ContentRenderer`\n * so admins can use the full CMS editor — no hardcoded copy in this file.\n * 2. **Downloadable documents** — `ProductPressKitAsset`s with category\n * `\"DOCUMENT\"` and a matching `tag` (default `\"partner\"`). Typically the\n * Partner / Reseller Agreement PDF, deck, FAQ, etc. Self-hides when empty.\n * 3. **\"Become a partner\" contact form** — embedded `<ContactPage>` with the\n * inquiry category **locked** to `\"partnership\"` so submissions land in the\n * admin support inbox tagged for the partner-program lane (shared inbox\n * routing for v1; per-category email routing is a separate backend change).\n *\n * The page is intentionally section-based and gracefully degrades: if the\n * admin hasn't created a content page yet, only the hero + form render; if\n * no documents are uploaded, the document section disappears; if neither\n * exists, the page is just a form. This keeps the partner page useful from\n * day one without blocking on CMS data.\n *\n * Mirrors the `PressKitPage` + `BlogListPage` architecture; data fetching\n * goes through the same `WebSDKClient` GraphQL helpers everything else uses.\n *\n * @example\n * ```tsx\n * import { PartnersPage } from '@burdenoff/website-sdk'\n *\n * <Route\n * path=\"/partners\"\n * element={\n * <PartnersPage\n * productName=\"VibeControls\"\n * contactEmail=\"partnerships@vibecontrols.com\"\n * contactPhone=\"+91-XXX-XXX-XXXX\"\n * officeAddress={{ line1: \"…\", line2: \"\", line3: \"\", country: \"India\" }}\n * />\n * }\n * />\n * ```\n */\n\nimport { useEffect, useState } from \"react\";\n\nimport { Download, FileText } from \"lucide-react\";\n\nimport { ContactPage } from \"./contact\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { ContentRenderer } from \"../content/content-provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\n\nimport type { ContactCategory, ContactPageProps } from \"./contact\";\nimport type { ContentPageListItem } from \"../content/content-provider\";\n\n/**\n * Office address shape consumed by `<ContactPage>`. Mirrored here as a\n * local type so we don't widen `contact.tsx`'s public surface just for\n * this consumer — keeps the contact module's exports unchanged.\n */\ninterface OfficeAddress {\n line1: string;\n line2: string;\n line3: string;\n country: string;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A downloadable document surfaced on the partners page. Same shape as\n * `PressKitAsset` but only the fields the card uses — keeps the type\n * surface tight and avoids a cross-file import of the press-kit type.\n */\ninterface PartnerDocument {\n id: string;\n category: string;\n title: 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 PartnersPageProps {\n /** Product name (e.g. `\"VibeControls\"`). Falls back to SDK config. */\n productName?: string;\n\n // ── Hero ─────────────────────────────────────────────────────────────\n /** Hero headline. Default: `\"Partner with us\"`. */\n heroTitle?: string;\n /** Hero subtitle / pitch line. */\n heroSubtitle?: string;\n\n // ── CMS marketing copy section ───────────────────────────────────────\n /**\n * Tag filter for the marketing-copy body. Default: `\"partner\"`. The\n * component fetches the FIRST published `ProductContentPage` whose\n * tags array contains this tag and renders its body via\n * `ContentRenderer`. Self-hides if none exist.\n */\n contentTag?: string;\n /**\n * Pin a specific content page by slug. If set, overrides `contentTag`.\n * Useful when multiple partner pages exist and you want to render one\n * canonical version per route.\n */\n contentSlug?: string;\n\n // ── Documents section ────────────────────────────────────────────────\n /**\n * Tag filter for the downloadable documents. Default: `\"partner\"`.\n * Combined with the implicit `category === \"DOCUMENT\"` filter — only\n * Press Kit assets that match BOTH are rendered as cards. Self-hides\n * when empty.\n */\n documentsTag?: string;\n /** Documents-section heading. Default: `\"Partner Documents\"`. */\n documentsTitle?: string;\n /** Documents-section subtitle / lead. */\n documentsSubtitle?: string;\n\n // ── Contact form section ─────────────────────────────────────────────\n /**\n * Whether to render the \"Become a partner\" contact form. Default: `true`.\n * Set to `false` for a documents-only / read-only partner landing page.\n */\n showContactForm?: boolean;\n /**\n * Inquiry-category options for the embedded `<ContactPage>` dropdown.\n * Default: `{ value: \"partnership\", label: \"Partner program\" }` (a single,\n * required option so every submission is tagged for partner triage). Pass an\n * **array** to offer multiple selectable partner tracks (Referral, Reseller,\n * MSP, …). Pass `false` to disable the dropdown entirely.\n */\n contactCategory?: ContactCategory | ContactCategory[] | false;\n /** Heading shown above the form. Default: `\"Become a partner\"`. */\n formTitle?: string;\n /** Subtitle / lead above the form. */\n formSubtitle?: string;\n\n // ── Contact-form passthroughs (required for <ContactPage>) ───────────\n contactEmail: string;\n contactPhone: string;\n officeAddress: OfficeAddress;\n responseTime?: string;\n recaptchaSiteKey?: string;\n /** Forwarded to `<ContactPage additionalOptions>`. */\n additionalOptions?: ContactPageProps[\"additionalOptions\"];\n\n // ── SEO ──────────────────────────────────────────────────────────────\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: string;\n\n className?: string;\n}\n\n// ============================================================================\n// Queries\n// ============================================================================\n\nconst PARTNER_CONTENT_QUERY = `\n query PartnerContent($productId: String!, $limit: Int) {\n publicContentPages(productId: $productId, limit: $limit, offset: 0) {\n items {\n id\n title\n slug\n excerpt\n content\n contentFormat\n thumbnail\n tags\n publishedAt\n lastUpdated\n }\n }\n }\n`;\n\nconst PARTNER_DOCUMENTS_QUERY = `\n query PartnerDocuments($productId: String!, $limit: Int) {\n publicPressKitAssets(productId: $productId, limit: $limit, offset: 0) {\n items {\n id\n category\n title\n description\n fileUrl\n fileName\n fileSize\n mimeType\n version\n tags\n sortOrder\n updatedAt\n }\n }\n }\n`;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatFileSize(bytes: number | null | undefined): string {\n if (!bytes || bytes <= 0) return \"\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\n let i = 0;\n let n = bytes;\n while (n >= 1024 && i < units.length - 1) {\n n /= 1024;\n i++;\n }\n return `${n.toFixed(n >= 10 || i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\n/**\n * Download an asset as a file (vs opening in a tab). Same blob-fetch\n * pattern as press-kit `downloadAsset` — works wherever the bucket\n * allows cross-origin GET (verified for dev/alpha/prod presskit\n * buckets, 2026-05-20).\n */\nasync function downloadDocument(\n e: { preventDefault: () => void },\n doc: PartnerDocument,\n): Promise<void> {\n e.preventDefault();\n const name =\n doc.fileName ||\n doc.fileUrl.split(\"/\").pop()?.split(\"?\")[0] ||\n doc.title ||\n \"partner-document\";\n const openInTab = () =>\n window.open(doc.fileUrl, \"_blank\", \"noopener,noreferrer\");\n try {\n const res = await fetch(doc.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\n// ============================================================================\n// Sub-components\n// ============================================================================\n\nfunction PartnerHero({\n title,\n subtitle,\n}: {\n title: string;\n subtitle?: string;\n}) {\n return (\n <section className=\"bg-gradient-to-b from-background to-muted/20 py-16 md:py-24\">\n <div className=\"container mx-auto px-4 max-w-4xl text-center\">\n <h1 className=\"text-4xl md:text-5xl font-bold tracking-tight text-foreground mb-4\">\n {title}\n </h1>\n {subtitle && (\n <p className=\"text-lg md:text-xl text-muted-foreground max-w-2xl mx-auto\">\n {subtitle}\n </p>\n )}\n </div>\n </section>\n );\n}\n\n/**\n * Strip a single leading top-level heading from CMS body content. The\n * `PartnerHero` already renders the page title, so a content body that also\n * opens with `# Title` (the natural way an author writes a page) would print\n * the title twice. Removing the body's leading heading keeps one visible\n * title and one `<h1>` per page. Only the *first* heading is touched — all\n * section headings below it are preserved.\n *\n * Exported for unit testing only; not re-exported from the package barrel.\n */\nexport function stripLeadingHeading(content: string, format?: string): string {\n if (format === \"html\") {\n return content.replace(/^\\s*<h1\\b[^>]*>[\\s\\S]*?<\\/h1>\\s*/i, \"\");\n }\n // markdown (default): drop a leading \"# Heading\" line + any trailing blanks.\n // Trailing newlines are optional (`*`, not `+`) so a body that is only\n // \"# Title\" with no trailing newline — common after editor/API trimming —\n // still gets stripped. `#\\s+` matches H1 only; `## Section` is left intact.\n return content.replace(/^\\s*#\\s+.*(?:\\r?\\n)*/, \"\");\n}\n\nfunction PartnerContentSection({\n page,\n}: {\n page: ContentPageListItem & { content?: string; contentFormat?: string };\n}) {\n // Restore typography for the markdown-rendered HTML — Tailwind preflight\n // strips browser defaults, and we don't want to assume consumer sites have\n // `@tailwindcss/typography` installed. Arbitrary-children selectors keep\n // this portable to every product website that consumes the SDK.\n return (\n <section className=\"py-12 md:py-16\">\n <div\n className={[\n \"mx-auto max-w-3xl px-4\",\n // Headings\n \"[&_h1]:text-3xl [&_h1]:font-bold [&_h1]:tracking-tight [&_h1]:mt-0 [&_h1]:mb-6\",\n \"[&_h2]:text-2xl [&_h2]:font-bold [&_h2]:tracking-tight [&_h2]:mt-10 [&_h2]:mb-4\",\n \"[&_h3]:text-xl [&_h3]:font-semibold [&_h3]:mt-7 [&_h3]:mb-3\",\n \"[&_h4]:text-lg [&_h4]:font-semibold [&_h4]:mt-6 [&_h4]:mb-2\",\n // Block elements\n \"[&_p]:my-4 [&_p]:leading-relaxed [&_p]:text-base\",\n \"[&_ul]:my-4 [&_ul]:pl-6 [&_ul]:list-disc [&_ul]:space-y-1\",\n \"[&_ol]:my-4 [&_ol]:pl-6 [&_ol]:list-decimal [&_ol]:space-y-1\",\n \"[&_li]:leading-relaxed\",\n \"[&_li>p]:my-1\",\n \"[&_blockquote]:border-l-4 [&_blockquote]:border-border [&_blockquote]:pl-4 [&_blockquote]:italic [&_blockquote]:my-4 [&_blockquote]:text-muted-foreground\",\n \"[&_hr]:my-8 [&_hr]:border-border\",\n // Inline elements\n \"[&_strong]:font-semibold [&_strong]:text-foreground\",\n \"[&_em]:italic\",\n \"[&_a]:underline [&_a]:underline-offset-2 [&_a]:text-accent hover:[&_a]:text-accent/80 [&_a]:transition-colors\",\n \"[&_code]:rounded [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:text-sm [&_code]:font-mono\",\n \"[&_pre]:my-4 [&_pre]:overflow-x-auto [&_pre]:rounded-lg [&_pre]:bg-muted [&_pre]:p-4 [&_pre]:text-sm\",\n \"[&_pre>code]:bg-transparent [&_pre>code]:p-0\",\n ].join(\" \")}\n >\n {page.content && (\n <ContentRenderer\n content={stripLeadingHeading(page.content, page.contentFormat)}\n format={\n // Validate before passing; unknown formats fall through to\n // ContentRenderer's default behavior (markdown rendering)\n // rather than getting silently force-cast to an\n // unsupported variant.\n page.contentFormat === \"markdown\" || page.contentFormat === \"html\"\n ? page.contentFormat\n : undefined\n }\n />\n )}\n </div>\n </section>\n );\n}\n\nfunction PartnerDocumentCard({ doc }: { doc: PartnerDocument }) {\n const sizeLabel = formatFileSize(doc.fileSize);\n const ext = doc.fileName?.split(\".\").pop()?.toUpperCase();\n return (\n <article className=\"flex flex-col gap-3 rounded-xl border border-border bg-card p-5 shadow-sm hover:shadow-md transition-shadow\">\n <div className=\"flex items-start gap-3\">\n <div className=\"rounded-lg bg-muted p-2.5 shrink-0\">\n <FileText size={20} className=\"text-muted-foreground\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold text-foreground truncate\">\n {doc.title}\n </h3>\n {doc.version && (\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n Version {doc.version}\n </p>\n )}\n </div>\n </div>\n {doc.description && (\n <p className=\"text-sm text-muted-foreground line-clamp-3\">\n {doc.description}\n </p>\n )}\n <div className=\"flex items-center justify-between gap-3 mt-auto pt-2 border-t border-border/60\">\n <div className=\"text-xs text-muted-foreground flex items-center gap-2\">\n {ext && <span>{ext}</span>}\n {sizeLabel && (\n <>\n <span aria-hidden>·</span>\n <span>{sizeLabel}</span>\n </>\n )}\n </div>\n <a\n href={doc.fileUrl}\n download={doc.fileName ?? undefined}\n onClick={(e) => void downloadDocument(e, doc)}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-sm font-medium text-foreground hover:bg-muted transition-colors\"\n >\n <Download size={14} />\n Download\n </a>\n </div>\n </article>\n );\n}\n\nfunction PartnerDocumentsSection({\n title,\n subtitle,\n docs,\n}: {\n title: string;\n subtitle?: string;\n docs: PartnerDocument[];\n}) {\n return (\n <section className=\"py-12 md:py-16 bg-muted/20\">\n <div className=\"container mx-auto px-4 max-w-5xl\">\n <header className=\"mb-8 md:mb-10 text-center\">\n <h2 className=\"text-2xl md:text-3xl font-bold text-foreground mb-2\">\n {title}\n </h2>\n {subtitle && (\n <p className=\"text-muted-foreground max-w-2xl mx-auto\">\n {subtitle}\n </p>\n )}\n </header>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {docs.map((doc) => (\n <PartnerDocumentCard key={doc.id} doc={doc} />\n ))}\n </div>\n </div>\n </section>\n );\n}\n\n// ============================================================================\n// Main component\n// ============================================================================\n\nconst DEFAULT_PARTNER_CATEGORY: ContactCategory = {\n value: \"partnership\",\n label: \"Partner program\",\n};\n\nexport function PartnersPage(props: PartnersPageProps) {\n const {\n productName: productNameProp,\n heroTitle = \"Partner with us\",\n heroSubtitle,\n\n contentTag = \"partner\",\n contentSlug,\n\n documentsTag = \"partner\",\n documentsTitle = \"Partner Documents\",\n documentsSubtitle,\n\n showContactForm = true,\n contactCategory,\n formTitle = \"Become a partner\",\n formSubtitle,\n\n contactEmail,\n contactPhone,\n officeAddress,\n responseTime,\n recaptchaSiteKey,\n additionalOptions,\n\n seoTitle,\n seoDescription,\n seoKeywords,\n className,\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n\n const resolvedProductId =\n product?.id ?? config?.productId ?? productNameProp ?? \"\";\n const resolvedProductName =\n productNameProp ?? product?.name ?? config?.productId ?? \"our team\";\n\n const [contentPage, setContentPage] = useState<\n (ContentPageListItem & { content?: string; contentFormat?: string }) | null\n >(null);\n const [docs, setDocs] = useState<PartnerDocument[]>([]);\n const [loading, setLoading] = useState<boolean>(true);\n\n // Single fetch on mount/productId-change — small payloads, no pagination needed\n // on a partners page (one content body + a handful of docs at most).\n useEffect(() => {\n if (!client || !resolvedProductId) {\n // Reset section state when the product scope unsets (e.g. provider re-\n // resolution between routes). Without this, the page would keep\n // rendering the previous product's content + docs because the render\n // guards only check `!loading` plus existing state.\n setContentPage(null);\n setDocs([]);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n\n void Promise.allSettled([\n client.query<{\n publicContentPages: {\n items: (ContentPageListItem & {\n content?: string;\n contentFormat?: string;\n })[];\n };\n }>(PARTNER_CONTENT_QUERY, { productId: resolvedProductId, limit: 50 }),\n client.query<{ publicPressKitAssets: { items: PartnerDocument[] } }>(\n PARTNER_DOCUMENTS_QUERY,\n { productId: resolvedProductId, limit: 50 },\n ),\n ]).then(([contentResult, docsResult]) => {\n if (cancelled) return;\n\n // Content page — match by slug if given, else first item carrying the tag.\n // Clear the previous match on a rejected request so stale data from an\n // earlier product / tag doesn't linger on screen across navigations.\n if (contentResult.status === \"rejected\") {\n setContentPage(null);\n } else if (contentResult.status === \"fulfilled\") {\n type ContentItem = ContentPageListItem & {\n content?: string;\n contentFormat?: string;\n };\n const items: ContentItem[] =\n contentResult.value.data?.publicContentPages?.items ?? [];\n const match: ContentItem | undefined = contentSlug\n ? items.find((p: ContentItem) => p.slug === contentSlug)\n : items.find((p: ContentItem) => p.tags?.includes(contentTag));\n setContentPage(match ?? null);\n }\n\n // Documents — only category === \"DOCUMENT\" AND tag matches AND has a fileUrl.\n // Same stale-clear behavior as the content section above.\n if (docsResult.status === \"rejected\") {\n setDocs([]);\n } else if (docsResult.status === \"fulfilled\") {\n const items: PartnerDocument[] =\n docsResult.value.data?.publicPressKitAssets?.items ?? [];\n const filtered = items\n .filter(\n (d: PartnerDocument) =>\n d.category === \"DOCUMENT\" &&\n d.tags?.includes(documentsTag) &&\n !!d.fileUrl,\n )\n .sort(\n (a: PartnerDocument, b: PartnerDocument) =>\n a.sortOrder - b.sortOrder,\n );\n setDocs(filtered);\n }\n\n setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [client, resolvedProductId, contentSlug, contentTag, documentsTag]);\n\n // Normalise the contact-category options for the dropdown:\n // - `false` → no dropdown (explicitly disabled)\n // - a non-empty array → those partner tracks\n // - a single value → that one option\n // - unset OR `[]` → the default partner category\n // An empty array is treated as \"use the default\", not \"disable\" — so an\n // accidental `contactCategory={[]}` doesn't silently drop the dropdown; pass\n // `false` to disable it intentionally.\n let partnerCategories: ContactCategory[];\n if (contactCategory === false) {\n partnerCategories = [];\n } else if (Array.isArray(contactCategory)) {\n partnerCategories =\n contactCategory.length > 0 ? contactCategory : [DEFAULT_PARTNER_CATEGORY];\n } else {\n partnerCategories = [contactCategory ?? DEFAULT_PARTNER_CATEGORY];\n }\n\n return (\n <div className={className}>\n <PageHead\n title={seoTitle ?? `${heroTitle} — ${resolvedProductName}`}\n description={\n seoDescription ??\n heroSubtitle ??\n `Join the ${resolvedProductName} partner programme.`\n }\n keywords={seoKeywords}\n />\n\n <PartnerHero title={heroTitle} subtitle={heroSubtitle} />\n\n {!loading && contentPage && <PartnerContentSection page={contentPage} />}\n\n {!loading && docs.length > 0 && (\n <PartnerDocumentsSection\n title={documentsTitle}\n subtitle={documentsSubtitle}\n docs={docs}\n />\n )}\n\n {showContactForm && (\n <ContactPage\n productName={resolvedProductName}\n heroTitle={formTitle}\n // Embedded inside PartnersPage, which already owns the page <h1>.\n // Render the form's \"Become a partner\" as an <h2> section header so\n // there's a single <h1> per page and no competing full-size hero.\n headingLevel={2}\n heroDescription={\n formSubtitle ??\n `Tell us about your organisation and a partner manager from ${resolvedProductName} will be in touch.`\n }\n contactEmail={contactEmail}\n contactPhone={contactPhone}\n officeAddress={officeAddress}\n responseTime={responseTime}\n recaptchaSiteKey={recaptchaSiteKey}\n additionalOptions={additionalOptions}\n // Partnership-type dropdown: one or more partner tracks so every\n // submission is tagged for the partner-program lane. Skipped when the\n // consumer passes `false`.\n categories={partnerCategories}\n categoryLabel=\"Partnership type\"\n categoryRequired={partnerCategories.length > 0}\n />\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Careers Apply Form\n *\n * Public job-application form for product careers pages (e.g.\n * burdenoff.com/careers). Mirrors `ContactPage` — reCAPTCHA-gated submit via\n * the WebSDKClient — plus a resume upload. The resume is read client-side and\n * sent as base64 in the `submitJobApplication` mutation; the backend uploads it\n * to a private bucket server-side (no public presign endpoint).\n *\n * @example\n * ```tsx\n * <CareersApplyForm\n * productName=\"VibeControls\"\n * positions={[\"Senior Engineer\", \"Product Designer\"]}\n * />\n * ```\n */\n\nimport { useRef, useState } from \"react\";\n\nimport { CheckCircle, Send, Upload } from \"lucide-react\";\nimport ReCAPTCHA from \"react-google-recaptcha\";\nimport { toast } from \"sonner\";\n\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 { Label } from \"../ui/label\";\nimport { Textarea } from \"../ui/textarea\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// Resumes only — must match the backend allow-list (PDF/DOC/DOCX).\nconst ALLOWED_RESUME_TYPES: Record<string, string> = {\n \"application/pdf\": \"PDF\",\n \"application/msword\": \"DOC\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n \"DOCX\",\n};\n// Some browsers/OSes report an empty or generic `file.type` for valid\n// .doc/.docx uploads. Fall back to the file extension → canonical MIME so the\n// upload validates client-side AND the backend (which checks `contentType`)\n// accepts it.\nconst EXT_TO_MIME: Record<string, string> = {\n pdf: \"application/pdf\",\n doc: \"application/msword\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n};\nconst DEFAULT_MAX_RESUME_BYTES = 10 * 1024 * 1024; // 10MB — matches backend cap\n\n/** Resolve a canonical resume MIME from `file.type`, falling back to extension. */\nfunction resolveResumeType(file: File): string | null {\n if (ALLOWED_RESUME_TYPES[file.type]) return file.type;\n const ext = file.name.split(\".\").pop()?.toLowerCase();\n return ext && EXT_TO_MIME[ext] ? EXT_TO_MIME[ext] : null;\n}\n\nexport interface CareersApplyFormProps {\n /** Product name (falls back to product context / SDK config). */\n productName?: string;\n /** reCAPTCHA site key (falls back to SDK config). */\n recaptchaSiteKey?: string;\n /**\n * Position options for the dropdown. When empty, a free-text \"position\"\n * input is shown instead so the form works before a postings list exists.\n */\n positions?: readonly string[];\n heroTitle?: string;\n heroDescription?: string;\n /**\n * `1` (default) renders a full page hero `<h1>`; `2` renders a compact\n * `<h2>` section header for embedding under a page that owns the `<h1>`.\n */\n headingLevel?: 1 | 2;\n /** Max resume size in bytes (default 10MB, matches backend). */\n maxResumeBytes?: number;\n className?: string;\n seo?: { title?: string; description?: string; keywords?: string };\n}\n\nconst SUBMIT_JOB_APPLICATION_MUTATION = /* GraphQL */ `\n mutation SubmitJobApplication($input: SubmitJobApplicationInput!) {\n submitJobApplication(input: $input) {\n success\n message\n }\n }\n`;\n\ninterface JobApplicationData {\n firstName: string;\n lastName: string;\n email: string;\n phone?: string;\n position: string;\n linkedinUrl?: string;\n portfolioUrl?: string;\n coverLetter?: string;\n resumeBase64: string;\n resumeFileName: string;\n resumeContentType: string;\n recaptchaToken?: string;\n}\n\n/** Read a File as raw base64 (strips the `data:...;base64,` prefix). */\nfunction fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = typeof reader.result === \"string\" ? reader.result : \"\";\n const comma = result.indexOf(\",\");\n resolve(comma >= 0 ? result.slice(comma + 1) : result);\n };\n reader.onerror = () => reject(new Error(\"Failed to read the resume file\"));\n reader.readAsDataURL(file);\n });\n}\n\nasync function submitApplication(\n client: WebSDKClient,\n data: JobApplicationData,\n productId: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n submitJobApplication: { success: boolean; message: string };\n }>(SUBMIT_JOB_APPLICATION_MUTATION, {\n input: {\n firstName: data.firstName,\n lastName: data.lastName,\n email: data.email.trim().toLowerCase(),\n position: data.position,\n resumeBase64: data.resumeBase64,\n resumeFileName: data.resumeFileName,\n resumeContentType: data.resumeContentType,\n productId,\n ...(data.phone ? { phone: data.phone } : {}),\n ...(data.linkedinUrl ? { linkedinUrl: data.linkedinUrl } : {}),\n ...(data.portfolioUrl ? { portfolioUrl: data.portfolioUrl } : {}),\n ...(data.coverLetter ? { coverLetter: data.coverLetter } : {}),\n ...(data.recaptchaToken ? { recaptchaToken: data.recaptchaToken } : {}),\n },\n });\n\n if (result.errors?.length) {\n return {\n success: false,\n message: result.errors[0]?.message ?? \"Failed to submit application\",\n };\n }\n const response = result.data?.submitJobApplication;\n return response?.success\n ? { success: true, message: response.message || \"Application submitted!\" }\n : {\n success: false,\n message: response?.message || \"Failed to submit application\",\n };\n } catch (error) {\n console.error(\"Job application submission error:\", error);\n return { success: false, message: \"Network error. Please try again.\" };\n }\n}\n\nexport function CareersApplyForm({\n productName,\n recaptchaSiteKey,\n positions = [],\n heroTitle = \"Become a part of the team\",\n heroDescription = \"Tell us about yourself and upload your resume — we'll be in touch.\",\n headingLevel = 1,\n maxResumeBytes = DEFAULT_MAX_RESUME_BYTES,\n className,\n seo,\n}: CareersApplyFormProps) {\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 const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ??\n product?.recaptchaSiteKey ??\n config.recaptchaSiteKey ??\n \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [resumeFile, setResumeFile] = useState<File | null>(null);\n const [resumeType, setResumeType] = useState<string | null>(null);\n const [resumeError, setResumeError] = useState<string | null>(null);\n\n const maxMb = Math.floor(maxResumeBytes / (1024 * 1024));\n\n const clearResume = (): void => {\n setResumeFile(null);\n setResumeType(null);\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>): void => {\n setResumeError(null);\n const file = e.target.files?.[0] ?? null;\n if (!file) {\n clearResume();\n return;\n }\n const type = resolveResumeType(file);\n if (!type) {\n clearResume();\n setResumeError(\"Resume must be a PDF, DOC, or DOCX file.\");\n return;\n }\n if (file.size > maxResumeBytes) {\n clearResume();\n setResumeError(`Resume must be ${maxMb}MB or smaller.`);\n return;\n }\n setResumeFile(file);\n setResumeType(type);\n };\n\n const handleSubmit = async (\n e: React.FormEvent<HTMLFormElement>,\n ): Promise<void> => {\n e.preventDefault();\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n if (!resumeFile) {\n setResumeError(\"Please attach your resume (PDF, DOC, or DOCX).\");\n return;\n }\n if (!resolvedProductId) {\n // Mirrors ContactPage. Warn so a misconfigured provider (no product\n // context and no config.productId) is visible rather than silently\n // sending an unattributed submission.\n console.warn(\n \"[CareersApplyForm] No productId resolved — submission will not be attributed to a product.\",\n );\n }\n\n const form = e.currentTarget;\n setIsSubmitting(true);\n try {\n const formData = new FormData(form);\n const resumeBase64 = await fileToBase64(resumeFile);\n const result = await submitApplication(\n client,\n {\n firstName: (formData.get(\"firstName\") as string) ?? \"\",\n lastName: (formData.get(\"lastName\") as string) ?? \"\",\n email: (formData.get(\"email\") as string) ?? \"\",\n phone: (formData.get(\"phone\") as string) || undefined,\n position: (formData.get(\"position\") as string) ?? \"\",\n linkedinUrl: (formData.get(\"linkedinUrl\") as string) || undefined,\n portfolioUrl: (formData.get(\"portfolioUrl\") as string) || undefined,\n coverLetter: (formData.get(\"coverLetter\") as string) || undefined,\n resumeBase64,\n resumeFileName: resumeFile.name,\n // Use the resolved type (handles browsers that report an empty\n // file.type for .doc/.docx).\n resumeContentType: resumeType ?? resumeFile.type,\n recaptchaToken,\n },\n resolvedProductId,\n );\n\n if (result.success) {\n setSubmitted(true);\n toast.success(result.message ?? \"Application submitted!\");\n } else {\n toast.error(result.message ?? \"Failed to submit application\");\n recaptchaRef.current?.reset();\n }\n } catch (err) {\n console.error(\"Careers form error:\", err);\n toast.error(\"Something went wrong. Please try again.\");\n recaptchaRef.current?.reset();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const Heading = headingLevel === 2 ? \"h2\" : \"h1\";\n const headingClass =\n headingLevel === 2\n ? \"text-2xl md:text-3xl font-bold mb-3\"\n : \"text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6\";\n\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? `Careers — ${displayName}`}\n description={seo.description ?? heroDescription}\n keywords={seo.keywords}\n />\n )}\n\n <section\n className={\n headingLevel === 2\n ? \"py-12 md:py-16\"\n : \"bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg:py-24\"\n }\n >\n <div className=\"max-w-3xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center mb-8 sm:mb-10\">\n <Heading className={headingClass}>{heroTitle}</Heading>\n <p className=\"text-lg text-muted-foreground leading-relaxed\">\n {heroDescription}\n </p>\n </div>\n\n {submitted ? (\n <div className=\"text-center rounded-xl border border-border bg-card p-10\">\n <CheckCircle className=\"mx-auto mb-4 h-12 w-12 text-accent\" />\n <h3 className=\"text-xl font-semibold text-foreground mb-2\">\n Application received\n </h3>\n <p className=\"text-muted-foreground\">\n Thanks for applying to {displayName}. We've emailed you a\n confirmation and our team will be in touch.\n </p>\n </div>\n ) : (\n <form onSubmit={handleSubmit} className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <Label htmlFor=\"firstName\">First name *</Label>\n <Input\n id=\"firstName\"\n name=\"firstName\"\n required\n placeholder=\"Ada\"\n />\n </div>\n <div>\n <Label htmlFor=\"lastName\">Last name *</Label>\n <Input\n id=\"lastName\"\n name=\"lastName\"\n required\n placeholder=\"Lovelace\"\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <Label htmlFor=\"email\">Email *</Label>\n <Input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n required\n placeholder=\"ada@example.com\"\n />\n </div>\n <div>\n <Label htmlFor=\"phone\">Phone</Label>\n <Input\n id=\"phone\"\n name=\"phone\"\n placeholder=\"+1 555 010 0100\"\n />\n </div>\n </div>\n\n <div>\n <Label htmlFor=\"position\">Position *</Label>\n {positions.length > 0 ? (\n <select\n id=\"position\"\n name=\"position\"\n required\n defaultValue=\"\"\n className=\"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"\" disabled>\n Select a role\n </option>\n {positions.map((p) => (\n <option key={p} value={p}>\n {p}\n </option>\n ))}\n </select>\n ) : (\n <Input\n id=\"position\"\n name=\"position\"\n required\n placeholder=\"Role you're applying for\"\n />\n )}\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <Label htmlFor=\"linkedinUrl\">LinkedIn</Label>\n <Input\n id=\"linkedinUrl\"\n name=\"linkedinUrl\"\n type=\"url\"\n placeholder=\"https://linkedin.com/in/…\"\n />\n </div>\n <div>\n <Label htmlFor=\"portfolioUrl\">Portfolio / GitHub</Label>\n <Input\n id=\"portfolioUrl\"\n name=\"portfolioUrl\"\n type=\"url\"\n placeholder=\"https://…\"\n />\n </div>\n </div>\n\n <div>\n <Label htmlFor=\"coverLetter\">Cover letter</Label>\n <Textarea\n id=\"coverLetter\"\n name=\"coverLetter\"\n rows={5}\n placeholder=\"Tell us why you'd be a great fit…\"\n />\n </div>\n\n <div>\n <Label htmlFor=\"resume\">\n Resume * (PDF, DOC, or DOCX — max {maxMb}MB)\n </Label>\n <label\n htmlFor=\"resume\"\n className=\"mt-1 flex cursor-pointer items-center gap-3 rounded-md border border-dashed border-input bg-background px-4 py-3 text-sm hover:bg-muted/40 transition-colors\"\n >\n <Upload\n className=\"h-5 w-5 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <span className=\"text-foreground\">\n {resumeFile ? resumeFile.name : \"Choose a file…\"}\n </span>\n <input\n id=\"resume\"\n name=\"resume\"\n type=\"file\"\n accept=\".pdf,.doc,.docx,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n className=\"sr-only\"\n aria-describedby={resumeError ? \"resume-error\" : undefined}\n aria-invalid={resumeError ? true : undefined}\n onChange={handleFileChange}\n />\n </label>\n {resumeError && (\n <p\n id=\"resume-error\"\n role=\"alert\"\n className=\"mt-1 text-sm text-destructive\"\n >\n {resumeError}\n </p>\n )}\n </div>\n\n {effectiveRecaptchaSiteKey && (\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n )}\n\n <Button\n type=\"submit\"\n size=\"lg\"\n disabled={isSubmitting}\n className=\"w-full sm:w-auto\"\n >\n {isSubmitting ? (\n \"Submitting…\"\n ) : (\n <>\n <Send className=\"mr-2 h-4 w-4\" /> Submit application\n </>\n )}\n </Button>\n </form>\n )}\n </div>\n </section>\n </div>\n );\n}\n","/**\n * Newsletter Component\n * Reusable newsletter subscription component with email validation and rate limiting.\n * Uses GraphQL mutations via the WebSDKClient provider.\n *\n * @example\n * ```tsx\n * import { NewsletterPage } from '@burdenoff/website-sdk/components/newsletter'\n *\n * function Newsletter() {\n * return (\n * <NewsletterPage\n * productName=\"BigConsole\"\n * layout=\"centered\"\n * seoTitle=\"Subscribe to Newsletter\"\n * seoDescription=\"Stay updated with our latest news\"\n * seoKeywords=\"newsletter, updates, news\"\n * />\n * )\n * }\n * ```\n */\n\n\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport ReCAPTCHA from \"react-google-recaptcha\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct, useProductConfig } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\n/**\n * Newsletter page component configuration props\n */\nexport interface NewsletterPageProps {\n /**\n * Product name (used in title and branding).\n * Falls back to SDK config productId if not provided.\n */\n productName?: string;\n /**\n * Layout variant\n * @default 'centered'\n */\n layout?: \"centered\" | \"split\";\n /**\n * Rate limit attempts\n * @default 3\n */\n rateLimitAttempts?: number;\n /**\n * Rate limit window in minutes\n * @default 15\n */\n rateLimitWindowMinutes?: number;\n /**\n * Hero section heading\n * @default 'Stay Updated'\n */\n heroHeading?: string;\n /**\n * Hero section subtitle\n * @default 'Subscribe to our newsletter'\n */\n heroSubtitle?: string;\n /**\n * Hero section description\n */\n heroDescription?: string;\n /**\n * Features to display (for split layout)\n */\n features?: Array<{\n icon: React.ReactNode;\n title: string;\n description: string;\n }>;\n /**\n * Success message after subscription\n * @default 'Successfully subscribed to newsletter!'\n */\n successMessage?: string;\n /**\n * Error message on failure\n * @default 'Failed to subscribe. Please try again.'\n */\n errorMessage?: string;\n /**\n * Rate limit error message\n */\n rateLimitMessage?: string;\n /**\n * Custom CSS class for container\n */\n className?: string;\n /**\n * SEO: Page title (optional, for SEO meta tags)\n */\n seoTitle?: string;\n /**\n * SEO: Page description (optional, for SEO meta tags)\n */\n seoDescription?: string;\n /**\n * SEO: Keywords (optional, for SEO meta tags)\n */\n seoKeywords?: string;\n /**\n * SEO: OG Image URL (optional, for SEO meta tags)\n */\n seoImage?: string;\n /**\n * SEO: Canonical URL (optional, for SEO meta tags)\n */\n seoUrl?: string;\n /**\n * reCAPTCHA site key (optional, falls back to SDK config)\n */\n recaptchaSiteKey?: string;\n}\n\ninterface RateLimitState {\n attempts: number;\n resetTime: number;\n}\n\n// ============================================================================\n// VALIDATION SCHEMA\n// ============================================================================\n\nconst newsletterSchema = z.object({\n email: z.string().email(\"Please enter a valid email address\"),\n});\n\ntype NewsletterFormData = z.infer<typeof newsletterSchema>;\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst SUBSCRIBE_MUTATION = /* GraphQL */ `\n mutation Subscribe($input: SubscribeInput!) {\n subscribe(input: $input) {\n id\n email\n alreadySubscribed\n status\n subscribedAt\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function subscribeNewsletter(\n client: WebSDKClient,\n email: string,\n productId: string,\n recaptchaToken?: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n subscribe: {\n id: string;\n email: string;\n status: string;\n alreadySubscribed?: boolean;\n };\n }>(SUBSCRIBE_MUTATION, {\n input: {\n email: email.trim().toLowerCase(),\n platformProductId: productId,\n metadata: {\n source: \"website\",\n referrer: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n ...(recaptchaToken ? { recaptchaToken } : {}),\n },\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Subscription failed\";\n const code = (result.errors[0] as { extensions?: { code?: string } })\n ?.extensions?.code;\n if (\n code === \"DUPLICATE_SUBSCRIBER\" ||\n errorMsg.toLowerCase().includes(\"already subscribed\")\n ) {\n return {\n success: true,\n message: \"You are already part of this newsletter.\",\n };\n }\n return { success: false, message: errorMsg };\n }\n\n if (result.data?.subscribe?.alreadySubscribed) {\n return {\n success: true,\n message: \"You are already part of this newsletter.\",\n };\n }\n\n return { success: true };\n } catch (error) {\n console.error(\"Newsletter subscription error:\", error);\n return { success: false, message: \"Network error. Please try again.\" };\n }\n}\n\n// ============================================================================\n// RATE LIMITING (in-memory for SSR compatibility)\n// ============================================================================\n\nfunction useRateLimit(maxAttempts: number, windowMinutes: number) {\n const rateLimitRef = useRef<RateLimitState | null>(null);\n const [isLimited, setIsLimited] = useState(false);\n const [resetTime, setResetTime] = useState<Date | null>(null);\n\n useEffect(() => {\n // Check if existing rate limit has expired on mount\n const state = rateLimitRef.current;\n if (state && Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n } else if (state && state.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(state.resetTime));\n }\n }, [maxAttempts]);\n\n function recordAttempt(): boolean {\n const now = Date.now();\n const state = rateLimitRef.current;\n\n // Reset if window expired\n if (state && now > state.resetTime) {\n rateLimitRef.current = null;\n }\n\n const current = rateLimitRef.current;\n\n if (!current) {\n rateLimitRef.current = {\n attempts: 1,\n resetTime: now + windowMinutes * 60 * 1000,\n };\n return false;\n }\n\n current.attempts += 1;\n\n if (current.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(current.resetTime));\n return true;\n }\n\n return false;\n }\n\n function checkLimit(): boolean {\n const state = rateLimitRef.current;\n if (!state) return false;\n if (Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n return false;\n }\n return state.attempts >= maxAttempts;\n }\n\n return { isLimited, resetTime, recordAttempt, checkLimit };\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function NewsletterPage({\n productName,\n layout = \"centered\",\n rateLimitAttempts = 3,\n rateLimitWindowMinutes = 15,\n heroHeading = \"Stay Updated\",\n heroSubtitle = \"Subscribe to our newsletter\",\n heroDescription,\n features,\n successMessage = \"Successfully subscribed to newsletter!\",\n errorMessage = \"Failed to subscribe. Please try again.\",\n rateLimitMessage,\n className,\n seoTitle,\n seoDescription,\n seoKeywords,\n seoImage,\n seoUrl,\n recaptchaSiteKey,\n}: NewsletterPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const productConfig = useProductConfig();\n const effectiveProductId = product?.id || config.productId;\n const displayName = productName ?? product?.name ?? config.productId;\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ??\n productConfig.recaptchaSiteKey ??\n config.recaptchaSiteKey ??\n \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isLimited, resetTime, recordAttempt, checkLimit } = useRateLimit(\n rateLimitAttempts,\n rateLimitWindowMinutes,\n );\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n reset,\n } = useForm<NewsletterFormData>({\n resolver: zodResolver(newsletterSchema),\n });\n\n const onSubmit = async (data: NewsletterFormData) => {\n // Check reCAPTCHA\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n // Check rate limit\n if (checkLimit()) {\n toast.error(\n rateLimitMessage ??\n `Too many attempts. Please try again after ${resetTime?.toLocaleTimeString()}`,\n );\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const result = await subscribeNewsletter(\n client,\n data.email,\n effectiveProductId,\n recaptchaToken || undefined,\n );\n\n if (result.success) {\n if (result.message) {\n toast.info(result.message);\n } else {\n toast.success(successMessage);\n }\n reset();\n } else {\n toast.error(result.message ?? errorMessage);\n }\n\n // Record the attempt for rate limiting\n recordAttempt();\n recaptchaRef.current?.reset();\n } catch (_error) {\n toast.error(errorMessage);\n recaptchaRef.current?.reset();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const defaultFeatures = [\n {\n icon: (\n <svg\n className=\"h-6 w-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n ),\n title: \"Latest Updates\",\n description: \"Get the latest news and updates delivered to your inbox\",\n },\n {\n icon: (\n <svg\n className=\"h-6 w-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4\"\n />\n </svg>\n ),\n title: \"Exclusive Content\",\n description:\n \"Access exclusive content and insights not available elsewhere\",\n },\n {\n icon: (\n <svg\n className=\"h-6 w-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\"\n />\n </svg>\n ),\n title: \"Early Access\",\n description:\n \"Be the first to know about new features and product launches\",\n },\n ];\n\n const displayFeatures = features ?? defaultFeatures;\n\n return (\n <>\n {/* SEO Meta Tags */}\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription ?? heroDescription ?? heroSubtitle}\n productName={displayName}\n keywords={seoKeywords}\n image={seoImage}\n url={seoUrl}\n />\n )}\n\n <div className={className}>\n {layout === \"centered\" ? (\n // Centered Layout\n <div className=\"min-h-screen flex items-center justify-center px-4 py-12\">\n <div className=\"max-w-md w-full space-y-8\">\n {/* Header */}\n <div className=\"text-center\">\n <h1 className=\"text-4xl font-bold tracking-tight\">\n {heroHeading}\n </h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">Email address</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n {effectiveRecaptchaSiteKey && (\n <div className=\"flex justify-center\">\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n </div>\n )}\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Subscribing...\" : \"Subscribe\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground text-center\">\n By subscribing, you agree to receive emails from {displayName}.\n You can unsubscribe at any time.\n </p>\n </div>\n </div>\n ) : (\n // Split Layout\n <div className=\"min-h-screen grid lg:grid-cols-2\">\n {/* Left Column - Form */}\n <div className=\"flex items-center justify-center px-4 py-12 sm:px-6 lg:px-8\">\n <div className=\"max-w-md w-full space-y-8\">\n {/* Header */}\n <div>\n <h1 className=\"text-4xl font-bold tracking-tight\">\n {heroHeading}\n </h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">Email address</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n {effectiveRecaptchaSiteKey && (\n <div className=\"flex justify-center sm:justify-start\">\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n </div>\n )}\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Subscribing...\" : \"Subscribe\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground\">\n By subscribing, you agree to receive emails from {displayName}\n . You can unsubscribe at any time.\n </p>\n </div>\n </div>\n\n {/* Right Column - Features */}\n <div className=\"hidden lg:flex items-center justify-center bg-muted px-4 py-12 sm:px-6 lg:px-8\">\n <div className=\"max-w-md space-y-8\">\n <h2 className=\"text-2xl font-bold\">Why Subscribe?</h2>\n <div className=\"space-y-6\">\n {displayFeatures.map((feature, index) => (\n <div key={index} className=\"flex gap-4\">\n <div className=\"flex-shrink-0 text-primary\">\n {feature.icon}\n </div>\n <div>\n <h3 className=\"font-semibold\">{feature.title}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {feature.description}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n\n// ============================================================================\n// NEWSLETTER FORM (Inline Component)\n// ============================================================================\n\nexport interface NewsletterFormProps {\n /**\n * Layout variant\n * @default 'inline'\n */\n variant?: \"inline\" | \"stacked\";\n /**\n * Show email label\n * @default false\n */\n showLabel?: boolean;\n /**\n * Show description text\n * @default false\n */\n showDescription?: boolean;\n /**\n * Description text\n * @default 'Subscribe to our newsletter for updates'\n */\n description?: string;\n /**\n * Button text\n * @default 'Subscribe'\n */\n buttonText?: string;\n /**\n * Custom CSS class\n */\n className?: string;\n /**\n * reCAPTCHA site key (optional, falls back to SDK config)\n */\n recaptchaSiteKey?: string;\n}\n\n/**\n * Lightweight newsletter subscription form for inline use (e.g., footers)\n */\nexport function NewsletterForm({\n variant = \"inline\",\n showLabel = false,\n showDescription = false,\n description = \"Subscribe to our newsletter for updates\",\n buttonText = \"Subscribe\",\n className = \"\",\n recaptchaSiteKey,\n}: NewsletterFormProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const productConfig = useProductConfig();\n const effectiveProductId = product?.id || config.productId;\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ??\n productConfig.recaptchaSiteKey ??\n config.recaptchaSiteKey ??\n \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [email, setEmail] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!email || !email.includes(\"@\")) {\n toast.error(\"Please enter a valid email address\");\n return;\n }\n\n // Check reCAPTCHA\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await subscribeNewsletter(\n client,\n email,\n effectiveProductId,\n recaptchaToken || undefined,\n );\n\n if (result.success) {\n if (result.message) {\n toast.info(result.message);\n } else {\n toast.success(\"Successfully subscribed!\");\n }\n setEmail(\"\");\n } else {\n toast.error(result.message ?? \"Subscription failed\");\n }\n recaptchaRef.current?.reset();\n } catch (_error) {\n toast.error(\"An error occurred. Please try again.\");\n recaptchaRef.current?.reset();\n } finally {\n setIsLoading(false);\n }\n };\n\n const isInline = variant === \"inline\";\n\n return (\n <div className={className} style={{ overflow: \"visible\" }}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <form\n onSubmit={handleSubmit}\n className={isInline ? \"flex flex-col gap-2\" : \"flex flex-col gap-2\"}\n style={{ overflow: \"visible\" }}\n >\n <div\n className={\n isInline && !effectiveRecaptchaSiteKey\n ? \"flex gap-2\"\n : \"flex flex-col gap-2\"\n }\n >\n <div\n className={\n isInline && !effectiveRecaptchaSiteKey ? \"flex-1\" : \"w-full\"\n }\n >\n {showLabel && (\n <Label htmlFor=\"newsletter-email\" className=\"text-sm mb-1 block\">\n Email\n </Label>\n )}\n <Input\n id=\"newsletter-email\"\n type=\"email\"\n placeholder=\"Enter your email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n disabled={isLoading}\n required\n className=\"w-full\"\n />\n </div>\n {!effectiveRecaptchaSiteKey && (\n <Button\n type=\"submit\"\n disabled={isLoading}\n className={isInline ? \"whitespace-nowrap\" : \"w-full\"}\n >\n {isLoading ? \"Subscribing...\" : buttonText}\n </Button>\n )}\n </div>\n {effectiveRecaptchaSiteKey && (\n <>\n <style>{`\n body > div[style*=\"position: absolute\"] > div > iframe[title*=\"recaptcha challenge\"],\n body > div:not([class]):not([id]) > div > iframe[title*=\"recaptcha\"] {\n position: fixed !important;\n top: 50% !important;\n left: 50% !important;\n transform: translate(-50%, -50%) !important;\n z-index: 99999 !important;\n }\n body > div[style*=\"position: absolute\"]:has(iframe[title*=\"recaptcha challenge\"]) {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n width: 100vw !important;\n height: 100vh !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n z-index: 99999 !important;\n background: rgba(0,0,0,0.3) !important;\n }\n `}</style>\n <div\n style={{\n position: \"relative\",\n zIndex: 50,\n display: \"flex\",\n justifyContent: \"flex-start\",\n }}\n >\n {/* Normal size (not the cramped compact square), left-aligned to\n the form fields' edge so it reads as a standard checkbox. */}\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n size=\"normal\"\n />\n </div>\n </>\n )}\n {effectiveRecaptchaSiteKey && (\n <Button type=\"submit\" disabled={isLoading} className=\"w-full\">\n {isLoading ? \"Subscribing...\" : buttonText}\n </Button>\n )}\n </form>\n </div>\n );\n}\n","/**\n * Pricing Component\n * GraphQL-powered pricing component with quota-based features and monthly/yearly toggle\n *\n * @example\n * ```tsx\n * import { PricingPage, PricingSection } from '@burdenoff/website-sdk/components/pricing'\n *\n * // Full page with hero\n * <PricingPage\n * productName=\"BigConsole\"\n * productId=\"bigconsole-123\"\n * appLoginUrl=\"https://app.bigconsole.com/login\"\n * contactUrl=\"/contact\"\n * fallbackFeatures={{\n * basic: ['Up to 5 dashboards', '10 data sources'],\n * professional: ['Unlimited dashboards', 'API access'],\n * enterprise: ['Everything in Professional', 'Dedicated support']\n * }}\n * />\n *\n * // Embeddable section\n * <PricingSection {...props} id=\"pricing\" className=\"bg-muted/30\" />\n * ```\n */\n\n\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\n\n// ============================================================================\n// GRAPHQL QUERY\n// ============================================================================\n\nconst GET_PLANS_QUERY = `\n query GetPublicPlans($productId: String!) {\n publicPlans(productId: $productId) {\n id\n name\n price\n currency\n currencyPrices\n duration\n features {\n id\n quotaId\n quota {\n id\n name\n limits\n }\n }\n isActive\n productID\n createdAt\n }\n }\n`;\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\ninterface PlanFeature {\n id: string;\n quotaId?: string | null;\n quota?: {\n id: string;\n name: string;\n limits?: unknown;\n } | null;\n}\n\ninterface GatewayPlan {\n id: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number> | null;\n duration: string;\n features: PlanFeature[];\n isActive: boolean;\n productID?: string | null;\n createdAt: string;\n}\n\ninterface GetPlansResponse {\n publicPlans: GatewayPlan[];\n}\n\nexport interface PlanCard {\n id: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number> | null;\n duration: string;\n features: Array<{\n id: string;\n quotaId?: string | null;\n quota?: {\n id: string;\n name: string;\n limits?: unknown;\n } | null;\n }>;\n isActive: boolean;\n productID?: string | null;\n}\n\ninterface CurrencyConfig {\n code: string;\n symbol: string;\n position: \"prefix\" | \"suffix\";\n}\n\ninterface PlanMetadata {\n tier: \"basic\" | \"professional\" | \"enterprise\";\n displayName: string;\n defaultDescription: string;\n popular: boolean;\n ctaText: string;\n ctaType: \"signup\" | \"contact\";\n /**\n * Curated feature bullets for this specific plan. When provided, these win\n * over the tier-based `fallbackFeatures` and the raw quota list — letting a\n * consumer differentiate plans that share a tier keyword (e.g. Free vs Hobby,\n * Pro vs Team) with concise, accurate copy.\n */\n features?: string[];\n}\n\nexport interface PricingProps {\n /**\n * Product name (used in branding and SEO)\n */\n productName?: string;\n /**\n * Product ID for GraphQL query (falls back to WebSDKConfig.productId)\n */\n productId?: string;\n /**\n * App login URL for signup CTA\n */\n appLoginUrl: string;\n /**\n * Contact page URL for enterprise CTA\n * @default '/contact'\n */\n contactUrl?: string;\n /**\n * Supported currencies\n */\n currencies?: Record<string, CurrencyConfig>;\n /**\n * Billing interval display text\n */\n billingIntervals?: Record<string, string>;\n /**\n * Plan metadata (tier info, CTA text, etc.)\n */\n planMetadata?: Record<string, Partial<PlanMetadata>>;\n /**\n * Fallback features when API doesn't provide them or is unavailable\n */\n fallbackFeatures?: {\n basic?: string[];\n professional?: string[];\n enterprise?: string[];\n };\n /**\n * Enable audience tabs (Individual / Enterprise).\n * When enabled, shows a two-level tab system.\n * @default false\n */\n showAudienceTabs?: boolean;\n /**\n * Enterprise plans to show when Enterprise tab is selected.\n * Each entry defines a static plan card (not fetched from API).\n */\n enterprisePlans?: Array<{\n name: string;\n subtitle: string;\n price: string;\n period: string;\n note?: string;\n button: string;\n buttonLink: string;\n popular: boolean;\n badge?: string;\n features: string[];\n }>;\n /**\n * Enterprise section heading\n * @default 'Enterprise Solutions'\n */\n enterpriseHeading?: string;\n /**\n * Enterprise section subtitle\n */\n enterpriseSubtitle?: string;\n /**\n * Hero section heading (for PricingPage)\n * @default 'Simple, Transparent Pricing'\n */\n heroHeading?: string;\n /**\n * Hero section subtitle (for PricingPage)\n * @default \"Choose the plan that's right for you. No hidden fees, no surprises.\"\n */\n heroSubtitle?: string;\n /**\n * Section heading (for PricingSection)\n * @default 'Pricing Plans'\n */\n sectionHeading?: string;\n /**\n * Section subtitle (for PricingSection)\n * @default 'Choose the perfect plan for your needs'\n */\n sectionSubtitle?: string;\n /**\n * Custom CSS class\n */\n className?: string;\n /**\n * Section ID for anchor links\n */\n id?: string;\n /**\n * SEO: Page title (optional, for PricingPage)\n */\n seoTitle?: string;\n /**\n * SEO: Page description (optional, for PricingPage)\n */\n seoDescription?: string;\n /**\n * SEO: Keywords (optional, for PricingPage)\n */\n seoKeywords?: string;\n /**\n * SEO: OG Image URL (optional, for PricingPage)\n */\n seoImage?: string;\n /**\n * SEO: Canonical URL (optional, for PricingPage)\n */\n seoUrl?: string;\n}\n\n// ============================================================================\n// SERVICE FUNCTIONS\n// ============================================================================\n\n/**\n * Format price for display with currency symbol\n */\nfunction formatPrice(\n price: number,\n currencyCode: string = \"USD\",\n currencies?: Record<string, CurrencyConfig>,\n): string {\n const defaultCurrencies: Record<string, CurrencyConfig> = {\n USD: { code: \"USD\", symbol: \"$\", position: \"prefix\" },\n EUR: { code: \"EUR\", symbol: \"\\u20AC\", position: \"prefix\" },\n GBP: { code: \"GBP\", symbol: \"\\u00A3\", position: \"prefix\" },\n INR: { code: \"INR\", symbol: \"\\u20B9\", position: \"prefix\" },\n };\n\n const currencyMap = currencies || defaultCurrencies;\n const currency: CurrencyConfig = currencyMap[currencyCode] || {\n code: currencyCode,\n symbol: currencyCode,\n position: \"prefix\",\n };\n\n const formattedNumber = price % 1 === 0 ? price.toString() : price.toFixed(2);\n\n return currency.position === \"prefix\"\n ? `${currency.symbol}${formattedNumber}`\n : `${formattedNumber}${currency.symbol}`;\n}\n\n/**\n * Format billing interval for display\n */\nfunction formatInterval(\n duration: string,\n billingIntervals?: Record<string, string>,\n): string {\n const defaultIntervals: Record<string, string> = {\n monthly: \"/month\",\n yearly: \"/year\",\n };\n\n const intervals = billingIntervals || defaultIntervals;\n return intervals[duration] || `/${duration}`;\n}\n\n/**\n * Detect if a plan belongs to the enterprise audience based on name.\n * Plans with \"team\", \"business\", or \"enterprise\" in the name are enterprise.\n */\nfunction isEnterprisePlan(planName: string): boolean {\n const name = planName.toLowerCase();\n return (\n name.includes(\"team\") ||\n name.includes(\"business\") ||\n name.includes(\"enterprise\")\n );\n}\n\n/**\n * Detect plan tier from plan name\n */\nfunction detectPlanTier(\n planName: string,\n): \"basic\" | \"professional\" | \"enterprise\" | null {\n const name = planName.toLowerCase();\n\n if (\n name.includes(\"free\") ||\n name.includes(\"basic\") ||\n name.includes(\"starter\") ||\n name.includes(\"hobby\")\n ) {\n return \"basic\";\n } else if (\n name.includes(\"pro\") ||\n name.includes(\"professional\") ||\n name.includes(\"premium\") ||\n name.includes(\"team\")\n ) {\n return \"professional\";\n } else if (name.includes(\"enterprise\") || name.includes(\"business\")) {\n return \"enterprise\";\n }\n\n return null;\n}\n\n/**\n * Get features for a specific plan tier from fallback config\n */\nfunction getFallbackFeaturesForTier(\n tier: \"basic\" | \"professional\" | \"enterprise\",\n fallbackFeatures?: {\n basic?: string[];\n professional?: string[];\n enterprise?: string[];\n },\n): string[] {\n return [...(fallbackFeatures?.[tier] || [])];\n}\n\n/**\n * Get metadata for a plan by name\n */\nfunction getMetadataForPlan(\n planName: string,\n planMetadata?: Record<string, Partial<PlanMetadata>>,\n): PlanMetadata {\n const normalizedName = planName.toLowerCase();\n\n // Try exact match first\n if (planMetadata?.[normalizedName]) {\n const meta = planMetadata[normalizedName];\n return {\n tier: meta.tier || \"basic\",\n displayName: meta.displayName || planName,\n defaultDescription: meta.defaultDescription || \"Choose this plan\",\n popular: meta.popular ?? false,\n ctaText: meta.ctaText || \"Get Started\",\n ctaType: meta.ctaType || \"signup\",\n features: meta.features,\n };\n }\n\n // Try tier detection\n const tier = detectPlanTier(planName);\n if (tier) {\n return {\n tier,\n displayName: planName,\n defaultDescription: \"Choose this plan\",\n popular: tier === \"professional\",\n ctaText: tier === \"enterprise\" ? \"Contact Sales\" : \"Get Started\",\n ctaType: tier === \"enterprise\" ? \"contact\" : \"signup\",\n };\n }\n\n // Fallback\n return {\n tier: \"basic\",\n displayName: planName,\n defaultDescription: \"Choose this plan\",\n popular: false,\n ctaText: \"Get Started\",\n ctaType: \"signup\",\n };\n}\n\n/**\n * Transform quota limits to a human-readable feature string\n */\n/**\n * Derive a human-readable label from a dotted quota name.\n * e.g. \"vibecontrols.workspaces.count\" → \"Workspaces\"\n * \"vibecontrols.storage.bytes\" → \"Storage\"\n */\nfunction humanizeQuotaName(name: string): string {\n const parts = name.split(\".\");\n // Use the second-to-last segment (the resource), or fall back to the last\n const resource =\n parts.length >= 3 ? parts[parts.length - 2]! : parts[parts.length - 1]!;\n // Capitalize and replace hyphens/underscores with spaces\n return resource\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction transformQuotaToFeature(quota: {\n id: string;\n name: string;\n limits?: unknown;\n}): string {\n const { name, limits } = quota;\n\n if (!limits || typeof limits !== \"object\") {\n return humanizeQuotaName(name);\n }\n\n const limitsObj = limits as Record<string, unknown>;\n const value = limitsObj.value;\n const unit = limitsObj.unit;\n const type = limitsObj.type;\n const description = limitsObj.description;\n\n // Use explicit description if provided\n if (typeof description === \"string\" && description) {\n if (type === \"number\" && typeof value === \"number\") {\n return `${value.toLocaleString()} ${description}`;\n }\n return description;\n }\n\n // Use unit if provided\n if (typeof unit === \"string\" && unit) {\n if (typeof value === \"number\") {\n return `${value.toLocaleString()} ${unit}`;\n }\n return `${unit}`;\n }\n\n // Derive label from quota name\n const label = humanizeQuotaName(name);\n\n if (type === \"boolean\") {\n return label;\n }\n\n if (typeof value === \"number\") {\n return `${value.toLocaleString()} ${label}`;\n }\n\n return label;\n}\n\n/**\n * Extract display features from a plan's feature list\n */\nfunction extractDisplayFeatures(\n features: PlanFeature[],\n planName: string,\n fallbackFeatures?: {\n basic?: string[];\n professional?: string[];\n enterprise?: string[];\n },\n): string[] {\n // Prefer curated fallback features when available — they are concise\n // and differentiated per tier, unlike raw quota dumps\n const tier = detectPlanTier(planName);\n if (tier) {\n const tierFeatures = getFallbackFeaturesForTier(tier, fallbackFeatures);\n if (tierFeatures.length > 0) {\n return tierFeatures;\n }\n }\n\n // No fallback: transform quota features from API\n const quotaFeatures = features\n .filter((f) => f.quota)\n .map((f) => transformQuotaToFeature(f.quota!));\n\n if (quotaFeatures.length > 0) {\n return quotaFeatures;\n }\n\n return [];\n}\n\n// ============================================================================\n// UI CARD TYPE (internal)\n// ============================================================================\n\ninterface DisplayPlanCard {\n id: string;\n name: string;\n description: string;\n price: string;\n priceRaw: number;\n interval: string;\n duration: string;\n features: string[];\n popular: boolean;\n ctaText: string;\n ctaLink: string;\n tier: \"basic\" | \"professional\" | \"enterprise\" | null;\n}\n\n/**\n * Transform a GatewayPlan into a display card\n */\nfunction transformToDisplayCard(\n plan: GatewayPlan,\n props: PricingProps,\n): DisplayPlanCard {\n const metadata = getMetadataForPlan(plan.name, props.planMetadata);\n\n const formattedPrice = formatPrice(\n plan.price,\n plan.currency,\n props.currencies,\n );\n const interval = formatInterval(plan.duration, props.billingIntervals);\n\n // A curated per-plan list (via planMetadata) wins over the tier fallback and\n // the raw quota dump — this is how Free/Hobby and Pro/Team get distinct copy.\n const features =\n metadata.features && metadata.features.length > 0\n ? metadata.features\n : extractDisplayFeatures(\n plan.features,\n plan.name,\n props.fallbackFeatures,\n );\n\n const contactUrl = props.contactUrl || \"/contact\";\n const ctaLink =\n metadata.ctaType === \"contact\" ? contactUrl : props.appLoginUrl;\n\n return {\n id: plan.id,\n name: plan.name,\n description: metadata.defaultDescription,\n price: formattedPrice,\n priceRaw: plan.price,\n interval,\n duration: plan.duration,\n features,\n popular: metadata.popular,\n ctaText: metadata.ctaText,\n ctaLink,\n tier: metadata.tier,\n };\n}\n\n// ============================================================================\n// REACT COMPONENTS\n// ============================================================================\n\n/**\n * Pricing Section Component - Embeddable\n */\nexport function PricingSection(props: PricingProps) {\n const {\n sectionHeading = \"Pricing Plans\",\n sectionSubtitle = \"Choose the perfect plan for your needs\",\n id,\n className = \"\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n\n const resolvedProductId = props.productId || config.productId;\n\n const [allPlans, setAllPlans] = useState<DisplayPlanCard[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [billingCycle, setBillingCycle] = useState<\"monthly\" | \"yearly\">(\n \"monthly\",\n );\n const [audience, setAudience] = useState<\"individual\" | \"enterprise\">(\n \"individual\",\n );\n\n useEffect(() => {\n let cancelled = false;\n\n async function loadPlans() {\n try {\n setLoading(true);\n\n const response = await client.query<GetPlansResponse>(GET_PLANS_QUERY, {\n productId: resolvedProductId,\n });\n\n if (cancelled) return;\n\n if (response.errors && response.errors.length > 0) {\n throw new Error(response.errors[0]!.message);\n }\n\n if (!response.data?.publicPlans) {\n throw new Error(\"No plans data received\");\n }\n\n // Server already filters by productId — just filter active, transform, sort\n const cards = response.data.publicPlans\n .filter((plan) => plan.isActive)\n .map((plan) => transformToDisplayCard(plan, props))\n .sort((a, b) => a.priceRaw - b.priceRaw);\n\n setAllPlans(cards);\n setError(null);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Failed to load plans:\", err);\n setError(\"Unable to load pricing information. Please try again later.\");\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n loadPlans();\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- props is destructured, actual deps are client + productId\n }, [client, resolvedProductId]);\n\n // Split plans by audience (individual vs enterprise) based on plan name\n const individualAllPlans = allPlans.filter((p) => !isEnterprisePlan(p.name));\n const enterpriseApiPlans = allPlans.filter((p) => isEnterprisePlan(p.name));\n\n // Filter individual plans by billing cycle\n const individualPlans = individualAllPlans.filter((plan) =>\n billingCycle === \"monthly\"\n ? plan.duration === \"monthly\"\n : plan.duration === \"yearly\",\n );\n\n // Enterprise plans from API (show all — no billing cycle filter since enterprise is typically monthly)\n const enterpriseCards: DisplayPlanCard[] = enterpriseApiPlans.map((p) => {\n // Mark $0 enterprise plans as \"Custom\" pricing with Contact Sales CTA\n if (p.priceRaw === 0 && p.name.toLowerCase().includes(\"enterprise\")) {\n return {\n ...p,\n price: \"Custom\",\n interval: \"\",\n ctaText: \"Contact Sales\",\n ctaLink: props.contactUrl || \"/contact\",\n };\n }\n return p;\n });\n\n // Use API enterprise plans if available, otherwise fall back to static prop, otherwise use built-in default\n const hasApiEnterprisePlans = enterpriseCards.length > 0;\n const defaultEnterpriseCard: Record<string, unknown> = {\n name: \"Enterprise\",\n subtitle: \"For organizations that need more\",\n description: \"For organizations that need more\",\n price: \"Custom\",\n period: \"\",\n interval: \"\",\n button: \"Contact Sales\",\n buttonLink: props.contactUrl || \"/contact\",\n ctaText: \"Contact Sales\",\n ctaLink: props.contactUrl || \"/contact\",\n popular: false,\n features: props.fallbackFeatures?.enterprise || [\n \"Unlimited everything\",\n \"SSO & SAML\",\n \"Audit logs\",\n \"Dedicated support\",\n \"Self-hosted option\",\n ],\n };\n const resolvedEnterprisePlans = hasApiEnterprisePlans\n ? (enterpriseCards as unknown as Record<string, unknown>[])\n : props.enterprisePlans\n ? (props.enterprisePlans as unknown as Record<string, unknown>[])\n : [defaultEnterpriseCard];\n\n // Determine which plans to show based on audience\n const plans =\n props.showAudienceTabs && audience === \"enterprise\"\n ? [] // Enterprise uses separate rendering\n : individualPlans;\n\n if (loading) {\n return (\n <section id={id} className={`py-12 sm:py-16 md:py-20 ${className}`}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"text-center mb-8 sm:mb-12\">\n {sectionHeading ? (\n <h2 className=\"text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4\">\n {sectionHeading}\n </h2>\n ) : (\n // Visually hidden but DOM-present heading so axe's heading-order\n // rule still sees an h2 between the consumer's hero h1 and the\n // h3 plan-card titles. See `getMetadataForPlan` for why a falsy\n // sectionHeading is the canonical \"no visible heading\" signal.\n <h2 className=\"sr-only\">Pricing</h2>\n )}\n <p className=\"text-muted-foreground text-sm sm:text-base md:text-lg\">\n Loading pricing information...\n </p>\n </div>\n <div className=\"grid md: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-lg p-6 animate-pulse\"\n >\n <div className=\"h-6 bg-muted rounded w-1/2 mb-4\"></div>\n <div className=\"h-4 bg-muted rounded w-3/4 mb-6\"></div>\n <div className=\"h-10 bg-muted rounded w-1/3 mb-6\"></div>\n <div className=\"space-y-3 mb-6\">\n {[1, 2, 3, 4].map((j) => (\n <div key={j} className=\"h-4 bg-muted rounded\"></div>\n ))}\n </div>\n <div className=\"h-10 bg-muted rounded\"></div>\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n }\n\n if (error && plans.length === 0) {\n return (\n <section id={id} className={`py-12 sm:py-16 md:py-20 ${className}`}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"text-center\">\n {sectionHeading ? (\n <h2 className=\"text-2xl sm:text-3xl md:text-4xl font-bold mb-4\">\n {sectionHeading}\n </h2>\n ) : (\n <h2 className=\"sr-only\">Pricing</h2>\n )}\n <p className=\"text-muted-foreground mb-8\">{error}</p>\n <Button onClick={() => window.location.reload()}>Retry</Button>\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <section id={id} className={`py-12 sm:py-16 md:py-20 ${className}`}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"text-center mb-8 sm:mb-12\">\n {sectionHeading ? (\n <h2 className=\"text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4\">\n {sectionHeading}\n </h2>\n ) : (\n <h2 className=\"sr-only\">Pricing</h2>\n )}\n <p className=\"text-muted-foreground text-sm sm:text-base md:text-lg mb-6\">\n {sectionSubtitle}\n </p>\n\n {/* Audience Toggle (Individual / Enterprise) */}\n {props.showAudienceTabs && (\n <div className=\"flex justify-center mb-4\">\n <div className=\"inline-flex items-center bg-muted p-1.5 rounded-xl\">\n <button\n type=\"button\"\n onClick={() => setAudience(\"individual\")}\n className={`px-6 sm:px-8 py-2.5 rounded-lg text-sm font-semibold transition-all ${\n audience === \"individual\"\n ? \"bg-background shadow-sm text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Individual\n </button>\n <button\n type=\"button\"\n onClick={() => setAudience(\"enterprise\")}\n className={`px-6 sm:px-8 py-2.5 rounded-lg text-sm font-semibold transition-all ${\n audience === \"enterprise\"\n ? \"bg-background shadow-sm text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Enterprise\n </button>\n </div>\n </div>\n )}\n\n {/* Billing Cycle Toggle — only for Individual */}\n {(audience === \"individual\" || !props.showAudienceTabs) && (\n <div className=\"flex justify-center\">\n <div className=\"inline-flex items-center bg-muted/60 p-1.5 rounded-xl\">\n <button\n type=\"button\"\n onClick={() => setBillingCycle(\"monthly\")}\n className={`px-5 sm:px-6 py-2 rounded-lg text-sm font-medium transition-all ${\n billingCycle === \"monthly\"\n ? \"bg-background shadow-sm text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Monthly\n </button>\n <button\n type=\"button\"\n onClick={() => setBillingCycle(\"yearly\")}\n className={`px-5 sm:px-6 py-2 rounded-lg text-sm font-medium transition-all ${\n billingCycle === \"yearly\"\n ? \"bg-background shadow-sm text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Yearly\n </button>\n </div>\n </div>\n )}\n </div>\n\n {/* Enterprise Intro — only when Enterprise is selected */}\n {props.showAudienceTabs && audience === \"enterprise\" && (\n <div className=\"mx-auto max-w-3xl text-center mb-8\">\n <h3 className=\"text-xl sm:text-2xl font-bold text-foreground\">\n {props.enterpriseHeading || \"Enterprise Solutions\"}\n </h3>\n <p className=\"mt-3 text-muted-foreground\">\n {props.enterpriseSubtitle ||\n \"Built for teams, agencies, and organizations that need advanced collaboration, security, support, and scale.\"}\n </p>\n </div>\n )}\n\n <div className=\"grid md:grid-cols-3 gap-6 sm:gap-8 max-w-6xl mx-auto items-stretch\">\n {props.showAudienceTabs && audience === \"enterprise\"\n ? /* Enterprise cards — from API, static prop, or built-in default */\n resolvedEnterprisePlans.map((ep) => {\n // Normalize fields — API uses description/ctaText/ctaLink/interval, static prop uses subtitle/button/buttonLink/period\n const subtitle = (ep.subtitle ||\n ep.description ||\n \"\") as string;\n const btnText = (ep.button ||\n ep.ctaText ||\n \"Get Started\") as string;\n const btnLink = (ep.buttonLink ||\n ep.ctaLink ||\n props.appLoginUrl) as string;\n const period = (ep.period || ep.interval || \"\") as string;\n const note = (ep.note || \"\") as string;\n const badge = (ep.badge || \"\") as string;\n const isPopular = ep.popular as boolean;\n const features = (ep.features || []) as string[];\n const price = String(ep.price);\n\n return (\n <div\n key={ep.name as string}\n className={`bg-card rounded-xl p-6 sm:p-8 transition-all duration-300 flex flex-col ${\n isPopular\n ? \"border-2 border-primary shadow-xl ring-1 ring-primary/20\"\n : \"border hover:shadow-lg hover:border-primary/50\"\n }`}\n >\n <div className=\"text-center mb-6\">\n {isPopular && badge && (\n <span className=\"inline-block bg-primary text-primary-foreground px-4 py-1 rounded-full text-xs font-semibold mb-3\">\n {badge}\n </span>\n )}\n <h3 className=\"text-xl sm:text-2xl font-bold mb-2\">\n {ep.name as string}\n </h3>\n <p className=\"text-muted-foreground text-sm\">\n {subtitle}\n </p>\n </div>\n\n <div className=\"text-center mb-2\">\n {price === \"Custom\" ? (\n <span className=\"text-3xl sm:text-4xl font-bold\">\n Custom\n </span>\n ) : (\n <div className=\"flex items-baseline justify-center gap-1\">\n <span className=\"text-4xl sm:text-5xl font-extrabold\">\n {price}\n </span>\n <span className=\"text-muted-foreground text-lg\">\n {period}\n </span>\n </div>\n )}\n {note && (\n <p className=\"mt-2 text-sm font-medium text-primary\">\n {note}\n </p>\n )}\n </div>\n\n <ul className=\"space-y-3 mb-8 mt-6 flex-1\">\n {features.map((feature) => (\n <li\n key={feature}\n className=\"text-sm flex items-start gap-2\"\n >\n <span className=\"text-primary mt-0.5 flex-shrink-0\">\n ✓\n </span>\n <span>{feature}</span>\n </li>\n ))}\n </ul>\n\n {btnLink.startsWith(\"/\") ? (\n <Button\n className=\"w-full h-11\"\n variant={isPopular ? \"default\" : \"outline\"}\n size=\"lg\"\n asChild\n >\n <a\n href={btnLink}\n onClick={() =>\n window.scrollTo({ top: 0, behavior: \"smooth\" })\n }\n >\n {btnText}\n </a>\n </Button>\n ) : (\n <Button\n className=\"w-full h-11\"\n variant={isPopular ? \"default\" : \"outline\"}\n size=\"lg\"\n asChild\n >\n <a\n href={btnLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {btnText}\n </a>\n </Button>\n )}\n </div>\n );\n })\n : /* Individual API-fetched cards */\n plans.map((plan) => (\n <div\n key={plan.id}\n className={`bg-card rounded-xl p-6 sm:p-8 transition-all duration-300 flex flex-col ${\n plan.popular\n ? \"border-2 border-primary shadow-xl ring-1 ring-primary/20\"\n : \"border hover:shadow-lg hover:border-primary/50\"\n }`}\n >\n <div className=\"text-center mb-6\">\n {plan.popular && (\n <span className=\"inline-block bg-primary text-primary-foreground px-4 py-1 rounded-full text-xs font-semibold mb-3\">\n Most Popular\n </span>\n )}\n <h3 className=\"text-xl sm:text-2xl font-bold mb-2\">\n {plan.name}\n </h3>\n <p className=\"text-muted-foreground text-sm\">\n {plan.description}\n </p>\n </div>\n\n <div className=\"text-center mb-8\">\n {plan.price === \"Custom\" ? (\n <span className=\"text-3xl sm:text-4xl font-bold\">\n Custom\n </span>\n ) : (\n <div className=\"flex items-baseline justify-center gap-1\">\n <span className=\"text-4xl sm:text-5xl font-bold\">\n {plan.price}\n </span>\n <span className=\"text-muted-foreground text-lg\">\n {plan.interval}\n </span>\n </div>\n )}\n </div>\n\n <ul className=\"space-y-3 mb-8 flex-1\">\n {plan.features.map((feature, index) => (\n <li\n key={index}\n className=\"text-sm flex items-start gap-2\"\n >\n <span className=\"text-primary mt-0.5 flex-shrink-0\">\n ✓\n </span>\n <span>{feature}</span>\n </li>\n ))}\n </ul>\n\n {plan.ctaLink.startsWith(\"/\") ? (\n <Button\n className=\"w-full h-11\"\n variant={plan.popular ? \"default\" : \"outline\"}\n size=\"lg\"\n asChild\n >\n <a\n href={plan.ctaLink}\n onClick={() =>\n window.scrollTo({ top: 0, behavior: \"smooth\" })\n }\n >\n {plan.ctaText}\n </a>\n </Button>\n ) : (\n <Button\n className=\"w-full h-11\"\n variant={plan.popular ? \"default\" : \"outline\"}\n size=\"lg\"\n asChild\n >\n <a\n href={plan.ctaLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {plan.ctaText}\n </a>\n </Button>\n )}\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n}\n\n/**\n * Pricing Page Component - Full Page with Hero\n */\nexport function PricingPage(props: PricingProps) {\n const {\n productName,\n heroHeading = \"Simple, Transparent Pricing\",\n heroSubtitle = \"Choose the plan that's right for you. No hidden fees, no surprises.\",\n seoTitle,\n seoDescription,\n seoKeywords,\n seoImage,\n seoUrl,\n } = props;\n\n return (\n <div className=\"w-full\">\n {/* SEO Meta Tags */}\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n image={seoImage}\n url={seoUrl}\n />\n )}\n\n {/* Hero Section */}\n <section className=\"bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg: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 mb-4 sm:mb-6\">\n {heroHeading}\n </h1>\n <p className=\"text-lg sm:text-xl text-muted-foreground leading-relaxed\">\n {heroSubtitle}\n </p>\n </div>\n </div>\n </section>\n\n {/* Pricing Section */}\n <PricingSection {...props} />\n </div>\n );\n}\n","/**\n * Waitlist Components\n * Full-page and inline waitlist signup forms using GraphQL via WebSDKClient.\n *\n * @example\n * ```tsx\n * // Full-page waitlist\n * import { WaitlistPage } from '@burdenoff/website-sdk/components/waitlist'\n *\n * <WaitlistPage\n * productName=\"BigConsole\"\n * heroTitle=\"Join the Waitlist\"\n * heroSubtitle=\"Be among the first to try BigConsole\"\n * />\n *\n * // Inline waitlist form (for hero sections / footers)\n * import { WaitlistForm } from '@burdenoff/website-sdk/components/waitlist'\n *\n * <WaitlistForm variant=\"inline\" buttonText=\"Join Waitlist\" />\n * ```\n */\n\n\"use client\";\n\nimport { useState, useRef } from \"react\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\n\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 { Label } from \"../ui/label\";\nimport { Textarea } from \"../ui/textarea\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\nexport interface WaitlistPageProps {\n /** Product name. Falls back to SDK config productId if not provided. */\n productName?: string;\n /** Hero title */\n heroTitle?: string;\n /** Hero subtitle */\n heroSubtitle?: string;\n /** Hero description */\n heroDescription?: string;\n /** Message shown on successful signup */\n successMessage?: string;\n /** Message shown on error */\n errorMessage?: string;\n /** Custom CSS class for container */\n className?: string;\n /** SEO metadata */\n seo?: {\n title?: string;\n description?: string;\n keywords?: string;\n image?: string;\n url?: string;\n };\n}\n\nexport interface WaitlistFormProps {\n /** Layout variant */\n variant?: \"inline\" | \"stacked\";\n /** Show email label */\n showLabel?: boolean;\n /** Show description text */\n showDescription?: boolean;\n /** Whether to show the name field */\n showNameField?: boolean;\n /** Description text */\n description?: string;\n /** Button text */\n buttonText?: string;\n /** Custom CSS class */\n className?: string;\n}\n\ninterface RateLimitState {\n attempts: number;\n resetTime: number;\n}\n\n// ============================================================================\n// VALIDATION SCHEMAS\n// ============================================================================\n\nconst waitlistPageSchema = z.object({\n name: z.string().min(1, \"Name is required\"),\n email: z.string().email(\"Please enter a valid email address\"),\n company: z.string().optional(),\n reason: z.string().optional(),\n});\n\ntype WaitlistPageFormData = z.infer<typeof waitlistPageSchema>;\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst JOIN_WAITLIST_MUTATION = /* GraphQL */ `\n mutation JoinWaitlist($input: JoinWaitlistInput!) {\n joinWaitlist(input: $input) {\n id\n email\n name\n status\n createdAt\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function joinWaitlist(\n client: WebSDKClient,\n data: {\n email: string;\n name?: string;\n company?: string;\n reason?: string;\n },\n productId: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n joinWaitlist: {\n id: string;\n email: string;\n name: string | null;\n status: string;\n createdAt: string;\n };\n }>(JOIN_WAITLIST_MUTATION, {\n input: {\n email: data.email.trim().toLowerCase(),\n platformProductId: productId,\n name: data.name?.trim() || undefined,\n company: data.company?.trim() || undefined,\n reason: data.reason?.trim() || undefined,\n context: {\n source: \"website\",\n referrer: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n },\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Failed to join waitlist\";\n if (errorMsg.toLowerCase().includes(\"already\")) {\n return {\n success: false,\n message: \"You are already on the waitlist!\",\n };\n }\n return { success: false, message: errorMsg };\n }\n\n return { success: true, message: \"You have been added to the waitlist!\" };\n } catch (error) {\n console.error(\"Waitlist signup error:\", error);\n return { success: false, message: \"Network error. Please try again.\" };\n }\n}\n\n// ============================================================================\n// RATE LIMITING (in-memory for SSR compatibility)\n// ============================================================================\n\nfunction useRateLimit(maxAttempts: number, windowMinutes: number) {\n const rateLimitRef = useRef<RateLimitState | null>(null);\n const [isLimited, setIsLimited] = useState(false);\n const [resetTime, setResetTime] = useState<Date | null>(null);\n\n function recordAttempt(): boolean {\n const now = Date.now();\n const state = rateLimitRef.current;\n\n // Reset if window expired\n if (state && now > state.resetTime) {\n rateLimitRef.current = null;\n }\n\n const current = rateLimitRef.current;\n\n if (!current) {\n rateLimitRef.current = {\n attempts: 1,\n resetTime: now + windowMinutes * 60 * 1000,\n };\n return false;\n }\n\n current.attempts += 1;\n\n if (current.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(current.resetTime));\n return true;\n }\n\n return false;\n }\n\n function checkLimit(): boolean {\n const state = rateLimitRef.current;\n if (!state) return false;\n if (Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n return false;\n }\n return state.attempts >= maxAttempts;\n }\n\n return { isLimited, resetTime, recordAttempt, checkLimit };\n}\n\n// ============================================================================\n// WAITLIST PAGE (Full-page component)\n// ============================================================================\n\nexport function WaitlistPage({\n productName,\n heroTitle = \"Join the Waitlist\",\n heroSubtitle = \"Be among the first to experience what's coming next\",\n heroDescription,\n successMessage = \"You have been added to the waitlist!\",\n errorMessage = \"Failed to join waitlist. Please try again.\",\n className,\n seo,\n}: WaitlistPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const {\n product,\n loading: productLoading,\n error: productError,\n hasProvider,\n } = useProduct();\n const displayName = productName ?? product?.name ?? config.productId;\n const productStatus = product?.status;\n const canCheckStatus = Boolean(config.productSlug);\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isLimited, resetTime, recordAttempt, checkLimit } = useRateLimit(\n 3,\n 15,\n );\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n reset,\n } = useForm<WaitlistPageFormData>({\n resolver: zodResolver(waitlistPageSchema),\n });\n\n if (canCheckStatus && !hasProvider) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Product status checks require <code>ProductProvider</code> to be\n mounted. Please update your integration configuration.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n if (canCheckStatus && productLoading) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Loading…\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Fetching product status.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n if (canCheckStatus && (productError || !productStatus)) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n We can’t confirm waitlist availability right now. Please try again\n later.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n // If product is already available, show \"already available\" instead of waitlist form\n if (\n canCheckStatus &&\n (productStatus === \"ACTIVE\" || productStatus === \"RELEASED\")\n ) {\n const appUrl = product?.appUrl || product?.website || \"#\";\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n {displayName} is now available!\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Great news — {displayName} is open to everyone. Sign up or log in\n to get started.\n </p>\n <Button size=\"lg\" asChild>\n <a href={appUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Get Started\n </a>\n </Button>\n </div>\n </section>\n </div>\n );\n }\n\n // If product is DRAFT or COMING_SOON, don't show waitlist form\n if (\n canCheckStatus &&\n (productStatus === \"DRAFT\" || productStatus === \"COMING_SOON\")\n ) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Coming Soon\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n {displayName} is not yet accepting waitlist signups. Check back\n soon!\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n // Defensive: if backend introduces a new status we don't recognize, don't render a signup form.\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n {displayName} is not accepting waitlist signups right now.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n const onSubmit = async (data: WaitlistPageFormData) => {\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n toast.error(\"This product is not accepting waitlist signups right now.\");\n return;\n }\n\n if (checkLimit()) {\n toast.error(\n `Too many attempts. Please try again after ${resetTime?.toLocaleTimeString()}`,\n );\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const result = await joinWaitlist(\n client,\n data,\n product?.id || config.productId,\n );\n\n if (result.success) {\n toast.success(result.message ?? successMessage);\n reset();\n } else {\n toast.error(result.message ?? errorMessage);\n }\n\n recordAttempt();\n } catch (_error) {\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <>\n {seo && (\n <PageHead\n title={seo.title ?? `Join the Waitlist - ${displayName}`}\n description={seo.description ?? heroDescription ?? heroSubtitle}\n productName={displayName}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n\n <div className={className}>\n <div className=\"min-h-screen flex items-center justify-center px-4 py-12\">\n <div className=\"max-w-lg w-full space-y-8\">\n {/* Hero */}\n <div className=\"text-center\">\n <h1 className=\"text-4xl font-bold tracking-tight\">{heroTitle}</h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-5\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-name\">Name *</Label>\n <Input\n id=\"waitlist-name\"\n type=\"text\"\n placeholder=\"Your name\"\n disabled={isSubmitting || isLimited}\n {...register(\"name\")}\n />\n {errors.name && (\n <p className=\"text-sm text-destructive\">\n {errors.name.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-email\">Email *</Label>\n <Input\n id=\"waitlist-email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-company\">Company</Label>\n <Input\n id=\"waitlist-company\"\n type=\"text\"\n placeholder=\"Your company (optional)\"\n disabled={isSubmitting || isLimited}\n {...register(\"company\")}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-reason\">Why are you interested?</Label>\n <Textarea\n id=\"waitlist-reason\"\n placeholder=\"Tell us what excites you about the product (optional)\"\n rows={3}\n disabled={isSubmitting || isLimited}\n className=\"resize-y\"\n {...register(\"reason\")}\n />\n </div>\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Joining...\" : \"Join Waitlist\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground text-center\">\n By joining the waitlist, you agree to receive updates from{\" \"}\n {displayName}. We respect your privacy and will never share your\n information.\n </p>\n </div>\n </div>\n </div>\n </>\n );\n}\n\n// ============================================================================\n// WAITLIST FORM (Inline Component)\n// ============================================================================\n\n/**\n * Lightweight inline waitlist signup form for hero sections, footers, etc.\n */\nexport function WaitlistForm({\n variant = \"inline\",\n showLabel = false,\n showDescription = false,\n showNameField = false,\n description = \"Join our waitlist to get early access\",\n buttonText = \"Join Waitlist\",\n className = \"\",\n}: WaitlistFormProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const {\n product,\n loading: productLoading,\n error: productError,\n hasProvider,\n } = useProduct();\n const productStatus = product?.status;\n const canCheckStatus = Boolean(config.productSlug);\n\n const [email, setEmail] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n toast.error(\"This product is not accepting waitlist signups right now.\");\n return;\n }\n\n if (!email || !email.includes(\"@\")) {\n toast.error(\"Please enter a valid email address\");\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await joinWaitlist(\n client,\n { email, name: name || undefined },\n product?.id || config.productId,\n );\n\n if (result.success) {\n toast.success(result.message ?? \"You have been added to the waitlist!\");\n setEmail(\"\");\n setName(\"\");\n } else {\n toast.error(result.message ?? \"Failed to join waitlist\");\n }\n } catch (_error) {\n toast.error(\"An error occurred. Please try again.\");\n } finally {\n setIsLoading(false);\n }\n };\n\n const isInline = variant === \"inline\";\n\n if (canCheckStatus && !hasProvider) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">\n Product status checks require <code>ProductProvider</code> to be\n mounted.\n </p>\n </div>\n );\n }\n\n if (canCheckStatus && productLoading) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">Loading waitlist…</p>\n </div>\n );\n }\n\n if (canCheckStatus && (productError || productStatus !== \"WAITLIST\")) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">\n Waitlist signups are not available right now.\n </p>\n </div>\n );\n }\n\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <form\n onSubmit={handleSubmit}\n className={isInline ? \"flex gap-2\" : \"flex flex-col gap-2\"}\n >\n {showNameField && (\n <div className={isInline ? \"flex-1\" : \"w-full\"}>\n {showLabel && (\n <Label\n htmlFor=\"waitlist-inline-name\"\n className=\"text-sm mb-1 block\"\n >\n Name\n </Label>\n )}\n <Input\n id=\"waitlist-inline-name\"\n type=\"text\"\n placeholder=\"Your name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n disabled={isLoading}\n className=\"w-full\"\n />\n </div>\n )}\n <div className={isInline ? \"flex-1\" : \"w-full\"}>\n {showLabel && (\n <Label\n htmlFor=\"waitlist-inline-email\"\n className=\"text-sm mb-1 block\"\n >\n Email\n </Label>\n )}\n <Input\n id=\"waitlist-inline-email\"\n type=\"email\"\n placeholder=\"Enter your email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n disabled={isLoading}\n required\n className=\"w-full\"\n />\n </div>\n <Button\n type=\"submit\"\n disabled={isLoading}\n className={isInline ? \"whitespace-nowrap\" : \"w-full\"}\n >\n {isLoading ? \"Joining...\" : buttonText}\n </Button>\n </form>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\nimport { toast } from \"sonner\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst UNSUBSCRIBE_MUTATION = /* GraphQL */ `\n mutation PublicUnsubscribeByToken($token: String!) {\n publicUnsubscribeByToken(token: $token)\n }\n`;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UnsubscribePageProps {\n productName?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n resubscribeUrl?: string;\n successMessage?: string;\n errorMessage?: string;\n}\n\ntype UnsubscribeState =\n | \"loading\"\n | \"confirming\"\n | \"processing\"\n | \"success\"\n | \"error\"\n | \"invalid\";\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function UnsubscribePage({\n productName,\n className = \"\",\n seoTitle = \"Unsubscribe from Newsletter\",\n seoDescription = \"Manage your newsletter subscription preferences.\",\n resubscribeUrl,\n successMessage = \"You have been successfully unsubscribed from our newsletter.\",\n errorMessage = \"Something went wrong. Please try again or contact support.\",\n}: UnsubscribePageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const displayName = productName ?? config.productId;\n\n const [state, setState] = useState<UnsubscribeState>(\"loading\");\n const [error, setError] = useState<string>(\"\");\n const [token, setToken] = useState<string>(\"\");\n const [successCopy, setSuccessCopy] = useState<string>(successMessage);\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const t = params.get(\"token\");\n if (t) {\n setToken(t);\n setState(\"confirming\");\n } else {\n setState(\"invalid\");\n }\n }, []);\n\n const handleUnsubscribe = async () => {\n if (!token) return;\n\n setState(\"processing\");\n\n try {\n const result = await client.mutate<{\n publicUnsubscribeByToken: boolean;\n }>(UNSUBSCRIBE_MUTATION, { token });\n\n if (result.errors?.length) {\n const errMsg = result.errors[0]?.message ?? errorMessage;\n const code = (result.errors[0] as { extensions?: { code?: string } })\n ?.extensions?.code;\n\n if (code === \"ALREADY_UNSUBSCRIBED\") {\n toast.info(\"You are already unsubscribed from this newsletter.\");\n setSuccessCopy(\"You were already unsubscribed from this newsletter.\");\n setState(\"success\");\n return;\n } else if (code === \"UNSUBSCRIBE_TOKEN_EXPIRED\") {\n setError(\n \"This unsubscribe link has expired. Please contact support.\",\n );\n } else if (code === \"INVALID_UNSUBSCRIBE_TOKEN\") {\n setState(\"invalid\");\n return;\n } else {\n setError(errMsg);\n }\n setState(\"error\");\n return;\n }\n\n if (result.data?.publicUnsubscribeByToken) {\n setSuccessCopy(successMessage);\n setState(\"success\");\n toast.success(\"Successfully unsubscribed\");\n } else {\n setError(errorMessage);\n setState(\"error\");\n }\n } catch {\n setError(errorMessage);\n setState(\"error\");\n }\n };\n\n return (\n <div\n className={className}\n style={{\n minHeight: \"60vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"6rem 1rem 4rem\",\n }}\n >\n <PageHead title={seoTitle} description={seoDescription} />\n\n <div className=\"max-w-md w-full text-center\">\n {/* Loading */}\n {state === \"loading\" && (\n <div className=\"animate-pulse\">\n <div className=\"h-8 w-48 bg-muted rounded mx-auto mb-4\" />\n <div className=\"h-4 w-64 bg-muted rounded mx-auto\" />\n </div>\n )}\n\n {/* Confirm */}\n {state === \"confirming\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-amber-100 dark:bg-amber-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-amber-600 dark:text-amber-400\"\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=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribe from Newsletter\n </h1>\n <p className=\"text-muted-foreground mb-8\">\n Are you sure you want to unsubscribe from {displayName}{\" \"}\n newsletter? You will no longer receive updates and news from us.\n </p>\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\n <Button\n onClick={handleUnsubscribe}\n variant=\"destructive\"\n className=\"px-8\"\n >\n Yes, Unsubscribe\n </Button>\n {resubscribeUrl && (\n <Button\n variant=\"outline\"\n onClick={() => {\n window.location.href = resubscribeUrl;\n }}\n className=\"px-8\"\n >\n Cancel\n </Button>\n )}\n </div>\n </div>\n )}\n\n {/* Processing */}\n {state === \"processing\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-muted flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-muted-foreground animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribing...\n </h1>\n <p className=\"text-muted-foreground\">\n Please wait while we process your request.\n </p>\n </div>\n )}\n\n {/* Success */}\n {state === \"success\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-green-600 dark:text-green-400\"\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=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Successfully Unsubscribed\n </h1>\n <p className=\"text-muted-foreground mb-8\">{successCopy}</p>\n {resubscribeUrl && (\n <p className=\"text-sm text-muted-foreground\">\n Changed your mind?{\" \"}\n <a\n href={resubscribeUrl}\n className=\"text-primary underline hover:no-underline\"\n >\n Resubscribe\n </a>\n </p>\n )}\n </div>\n )}\n\n {/* Error */}\n {state === \"error\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-red-600 dark:text-red-400\"\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 </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribe Failed\n </h1>\n <p className=\"text-muted-foreground mb-8\">{error}</p>\n <Button onClick={() => setState(\"confirming\")} variant=\"outline\">\n Try Again\n </Button>\n </div>\n )}\n\n {/* Invalid / No Token */}\n {state === \"invalid\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-gray-400\"\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=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Invalid Unsubscribe Link\n </h1>\n <p className=\"text-muted-foreground\">\n This unsubscribe link is invalid or missing. If you want to\n unsubscribe, please use the link from your newsletter email.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * SocialLinks Component\n *\n * Renders a row of social-media icons sourced from the **product CMS**.\n * The `socialLinks` field on `Product` (and `PublicProduct`) is a free-form\n * JSON record: `{ twitter, github, linkedin, facebook, youtube, instagram,\n * discord, pinterest, … }`. The admin sets per-product URLs in\n * `microfe-product → Products → <product>`; this component reads them via\n * `useProduct()` and renders icons for the platforms we know how to map.\n *\n * Unknown keys are **silently ignored** — the schema accepts any string key\n * so new platforms can be wired in admin without an SDK change, but they\n * won't render until this map grows.\n *\n * Why a component instead of inlining in each product website's Footer\n *\n * - Single source of truth for the platform → icon mapping.\n * - One swap to add a new platform (e.g. Threads, Bluesky) across all 5\n * product websites.\n * - Eliminates the drift today between hard-coded URLs and CMS values\n * (e.g. vibecontrols-website Footer had `twitter.com/vibecontrols`\n * hard-coded while CMS had `twitter.com/burdenoff`).\n *\n * @example\n * ```tsx\n * import { SocialLinks } from '@burdenoff/website-sdk'\n *\n * // Auto-derives from useProduct().product.socialLinks\n * <SocialLinks />\n *\n * // Or pass explicitly\n * <SocialLinks\n * links={{ twitter: 'https://twitter.com/example', github: 'https://github.com/example' }}\n * email=\"contact@example.com\"\n * />\n *\n * // Restrict + reorder\n * <SocialLinks platforms={['github', 'twitter', 'linkedin']} />\n * ```\n */\n\nimport { type ComponentType } from \"react\";\n\nimport {\n Facebook,\n Github,\n Instagram,\n Linkedin,\n Mail,\n Twitter,\n Youtube,\n} from \"lucide-react\";\n\nimport { useProduct } from \"../product/product-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Platform keys the component knows how to render. Extends as we add icons.\n * Note: this is intentionally a small allowlist; the CMS JSON schema is\n * open-ended and the component silently skips unknown keys.\n */\nexport type SocialPlatform =\n | \"twitter\"\n | \"linkedin\"\n | \"github\"\n | \"facebook\"\n | \"youtube\"\n | \"instagram\"\n | \"discord\"\n | \"pinterest\";\n\nexport interface SocialLinksProps {\n /**\n * Map of platform → URL. If unset, reads from `useProduct().product.socialLinks`.\n * Useful for passing static config when there's no `<ProductProvider>` upstream.\n */\n links?: Record<string, string> | null;\n /**\n * Contact email — renders a Mail icon linking to `mailto:…`. If unset,\n * reads from `useProduct().product.contactEmail`. Pass `null` to suppress.\n */\n email?: string | null;\n /**\n * Allowlist + ORDER of platforms to render. Defaults to the natural CMS\n * order (whatever the JSON returns). Use this to pin a stable visual order\n * across products that may have different platform sets.\n */\n platforms?: readonly SocialPlatform[];\n /** Whether to render the Mail icon for `email`. Default: `true` when an email is available. */\n showEmail?: boolean;\n /** Tailwind class controlling icon size. Default: `\"h-5 w-5\"`. */\n iconClassName?: string;\n /** Tailwind class for each `<a>` wrapping link. Defaults to a muted-foreground / hover-foreground transition. */\n itemClassName?: string;\n /** Tailwind class for the outer container. Default: `\"flex space-x-4\"`. */\n className?: string;\n}\n\n// ============================================================================\n// Platform → icon map\n// ============================================================================\n\n/**\n * Custom inline SVG for platforms not covered by lucide-react.\n * Stays minimal — single-path icons keep bundle size tight.\n */\nfunction DiscordIcon({ className }: { className?: string }) {\n return (\n <svg\n role=\"img\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M20.317 4.369A19.79 19.79 0 0 0 16.558 3a.075.075 0 0 0-.079.037c-.34.6-.717 1.382-.98 1.99a18.27 18.27 0 0 0-5.998 0 12.51 12.51 0 0 0-.99-1.99.077.077 0 0 0-.079-.037 19.74 19.74 0 0 0-3.76 1.369.07.07 0 0 0-.032.028C.533 8.045-.32 11.6.099 15.114a.082.082 0 0 0 .031.056 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.027 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.105 13.1 13.1 0 0 1-1.872-.892.077.077 0 0 1-.008-.128c.126-.094.252-.192.372-.291a.074.074 0 0 1 .078-.01c3.927 1.793 8.18 1.793 12.061 0a.074.074 0 0 1 .079.009c.12.099.246.198.372.292a.077.077 0 0 1-.006.127 12.3 12.3 0 0 1-1.873.892.077.077 0 0 0-.041.106c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.84 19.84 0 0 0 6.002-3.03.077.077 0 0 0 .032-.055c.5-4.063-.838-7.587-3.549-10.717a.061.061 0 0 0-.031-.028zM8.02 13.001c-1.182 0-2.157-1.085-2.157-2.419 0-1.333.956-2.418 2.157-2.418 1.21 0 2.176 1.094 2.157 2.418 0 1.334-.956 2.419-2.157 2.419zm7.974 0c-1.182 0-2.157-1.085-2.157-2.419 0-1.333.956-2.418 2.157-2.418 1.21 0 2.176 1.094 2.157 2.418 0 1.334-.946 2.419-2.157 2.419z\" />\n </svg>\n );\n}\n\nfunction PinterestIcon({ className }: { className?: string }) {\n return (\n <svg\n role=\"img\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.357-.629-2.75-1.378l-.748 2.853c-.271 1.043-1.002 2.35-1.492 3.146C9.57 23.812 10.763 24 12.017 24c6.624 0 11.99-5.367 11.99-11.987C24.007 5.367 18.641 0 12.017 0z\" />\n </svg>\n );\n}\n\ninterface PlatformDef {\n /** lucide-react component or custom SVG component */\n Icon: ComponentType<{ className?: string }>;\n /** Accessible label for the link */\n label: string;\n /** Optional alias keys that should also resolve to this platform */\n aliases?: readonly string[];\n}\n\nconst PLATFORMS: Record<SocialPlatform, PlatformDef> = {\n twitter: { Icon: Twitter, label: \"Twitter / X\", aliases: [\"x\"] },\n linkedin: { Icon: Linkedin, label: \"LinkedIn\" },\n github: { Icon: Github, label: \"GitHub\" },\n facebook: { Icon: Facebook, label: \"Facebook\" },\n youtube: { Icon: Youtube, label: \"YouTube\" },\n instagram: { Icon: Instagram, label: \"Instagram\" },\n discord: { Icon: DiscordIcon, label: \"Discord\" },\n pinterest: { Icon: PinterestIcon, label: \"Pinterest\" },\n};\n\n/**\n * Build a `key → SocialPlatform` lookup so aliases (e.g. `\"x\"` → `\"twitter\"`)\n * resolve in O(1). Memoised at module scope; never recomputed.\n */\nconst KEY_TO_PLATFORM: Record<string, SocialPlatform> = (() => {\n const map: Record<string, SocialPlatform> = {};\n for (const [key, def] of Object.entries(PLATFORMS) as [\n SocialPlatform,\n PlatformDef,\n ][]) {\n map[key] = key;\n for (const alias of def.aliases ?? []) {\n map[alias] = key;\n }\n }\n return map;\n})();\n\nconst DEFAULT_ITEM_CLASS =\n \"text-muted-foreground hover:text-foreground transition-colors\";\n\n/**\n * Defense-in-depth XSS guard. Only http(s), mailto, and tel URLs are allowed\n * through to a rendered `href`; anything else (notably `javascript:`,\n * `data:`, `vbscript:`) is rejected and the link is silently skipped. Inputs\n * are admin-controlled today, but treating the URL field as untrusted is\n * cheap and matches the wider Burdenoff posture.\n */\nfunction isSafeUrl(value: string): boolean {\n const trimmed = value.trim();\n // Relative URLs (no scheme) are safe — browser treats them as same-origin.\n if (/^[/?#]/.test(trimmed)) return true;\n return /^(https?:|mailto:|tel:)/i.test(trimmed);\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function SocialLinks({\n links: linksProp,\n email: emailProp,\n platforms: platformAllow,\n showEmail,\n iconClassName = \"h-5 w-5\",\n itemClassName = DEFAULT_ITEM_CLASS,\n className = \"flex space-x-4\",\n}: SocialLinksProps) {\n const { product } = useProduct();\n\n // Source of truth: prop > product CMS > empty.\n const links: Record<string, string> = (linksProp ??\n product?.socialLinks ??\n {}) as Record<string, string>;\n // `emailProp === undefined` → fall back to CMS. Explicit `null` from the\n // caller means \"suppress the mail icon entirely\" — don't fall back. This\n // matches the documented prop contract.\n const email: string | null =\n emailProp !== undefined ? emailProp : (product?.contactEmail ?? null);\n\n // Normalise CMS keys → canonical platform names, dedupe, preserve URL.\n // Last-writer-wins on duplicate platforms (alias + canonical both set).\n // Rejects `javascript:`/`data:`/`vbscript:` URLs as a defense-in-depth XSS\n // guard — a compromised admin CMS could otherwise inject an active script\n // into the `href`. Only http(s), mailto, and tel schemes are allowed.\n const resolved = new Map<SocialPlatform, string>();\n for (const [rawKey, url] of Object.entries(links)) {\n if (!url || typeof url !== \"string\") continue;\n if (!isSafeUrl(url)) continue;\n const platform = KEY_TO_PLATFORM[rawKey.toLowerCase()];\n if (!platform) continue; // unknown platform key — silently skip\n resolved.set(platform, url);\n }\n\n // Optional allowlist + ordering. When provided, only render listed\n // platforms, and in that order. Otherwise render in insertion order\n // (which mirrors the JSON object key order from the CMS).\n const orderedPlatforms: SocialPlatform[] = platformAllow\n ? platformAllow.filter((p) => resolved.has(p))\n : Array.from(resolved.keys());\n\n const wantEmail = (showEmail ?? !!email) && !!email;\n\n // Render nothing at all when no links and no email — caller can render an\n // empty parent without an extra falsy-guard.\n if (orderedPlatforms.length === 0 && !wantEmail) return null;\n\n return (\n <div className={className}>\n {orderedPlatforms.map((platform) => {\n const { Icon, label } = PLATFORMS[platform];\n const url = resolved.get(platform)!;\n return (\n <a\n key={platform}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={label}\n className={itemClassName}\n >\n <Icon className={iconClassName} />\n </a>\n );\n })}\n {wantEmail && (\n <a\n key=\"email\"\n href={`mailto:${email}`}\n aria-label=\"Email\"\n className={itemClassName}\n >\n <Mail className={iconClassName} />\n </a>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * ResourceLinks Component\n *\n * Renders the Footer \"Resources\" column. Hybrid data sourcing — uses the\n * product CMS where a field already exists, prop overrides where CMS doesn't\n * (yet) have a column, and Burdenoff-group-wide defaults for resources that\n * are constant across every product website.\n *\n * | Resource | Default source | Notes |\n * | ------------ | ----------------------------------------------- | ----- |\n * | `docs` | `useProduct().product.docsUrl` (existing field) | Per-product; admin can change in `microfe-product → Products → <product>` |\n * | `community` | (none — pass via `links` prop) | Per-product; needs `Product.communityUrl` in backend to become CMS-managed |\n * | `careers` | `https://burdenoff.com/careers` (group default) | Burdenoff-wide constant; overridable |\n * | `team` | `https://burdenoff.com/team` (group default) | Burdenoff-wide constant; overridable |\n * | `companies` | `https://burdenoff.com/companies` (group default)| Burdenoff-wide constant; overridable |\n *\n * Future-compat: if the CMS grows a `Product.resourceLinks` JSON field\n * mirroring `socialLinks`, the resolver below switches to read it as the\n * first preference — no consumer-side change.\n *\n * @example\n * ```tsx\n * import { ResourceLinks } from '@burdenoff/website-sdk'\n *\n * // Minimal — pass the one resource without a CMS source today\n * <ResourceLinks links={{ community: 'https://support.vibecontrols.com' }} />\n *\n * // Suppress an item (e.g. hide Sister Companies for a standalone product)\n * <ResourceLinks links={{ companies: null }} />\n *\n * // Restrict + reorder\n * <ResourceLinks resources={['docs', 'community']} />\n * ```\n */\n\nimport { useProduct } from \"../product/product-provider\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type Resource = \"docs\" | \"community\" | \"careers\" | \"team\" | \"companies\";\n\nexport interface ResourceLinksProps {\n /**\n * Per-resource URL overrides. `undefined` falls through to CMS/default\n * resolution; explicit `null` suppresses the link entirely.\n */\n links?: Partial<Record<Resource, string | null>>;\n /**\n * Allowlist + ORDER of resources to render. Default: canonical order\n * (docs, community, careers, team, companies). Pass a subset/reorder to\n * customise the column on a per-site basis.\n */\n resources?: readonly Resource[];\n /** Per-link label overrides. Falls back to canonical English labels. */\n labels?: Partial<Record<Resource, string>>;\n /** Outer container className. Default: `\"space-y-2\"` (vertical list). */\n className?: string;\n /**\n * Per-link className. Default matches the muted-foreground / hover-foreground\n * style used by the other Footer columns.\n */\n itemClassName?: string;\n}\n\n// ============================================================================\n// Defaults\n// ============================================================================\n\nconst DEFAULT_LABELS: Record<Resource, string> = {\n docs: \"Docs\",\n community: \"Community\",\n careers: \"Careers\",\n team: \"Team\",\n companies: \"Sister Companies\",\n};\n\n/**\n * Burdenoff-group-wide URLs — same across every product website by default.\n * `null` means \"no group default; must be supplied per-site or via CMS\".\n */\nconst BURDENOFF_GROUP_DEFAULTS: Record<Resource, string | null> = {\n docs: null, // per-product → read from `Product.docsUrl`\n community: null, // per-product → caller supplies via prop until CMS field exists\n careers: \"https://burdenoff.com/careers\",\n team: \"https://burdenoff.com/team\",\n companies: \"https://burdenoff.com/companies\",\n};\n\nconst DEFAULT_ORDER: readonly Resource[] = [\n \"docs\",\n \"community\",\n \"careers\",\n \"team\",\n \"companies\",\n];\n\nconst DEFAULT_ITEM_CLASS =\n \"text-sm text-muted-foreground hover:text-foreground transition-colors\";\n\n/**\n * Defense-in-depth XSS guard for any URL flowing into a rendered `href`.\n * Only http(s), mailto, tel, and relative URLs pass through. `javascript:`,\n * `data:`, `vbscript:`, etc. are rejected. The CMS is admin-only, but\n * treating the URL as untrusted is cheap and consistent with the wider\n * Burdenoff posture.\n */\nfunction isSafeUrl(value: string): boolean {\n const trimmed = value.trim();\n if (/^[/?#]/.test(trimmed)) return true;\n return /^(https?:|mailto:|tel:)/i.test(trimmed);\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function ResourceLinks({\n links: linksProp,\n resources = DEFAULT_ORDER,\n labels = {},\n className = \"space-y-2\",\n itemClassName = DEFAULT_ITEM_CLASS,\n}: ResourceLinksProps) {\n const { product } = useProduct();\n\n /**\n * Resolve a resource's URL. Precedence:\n * 1. Explicit prop — caller wins.\n * • `string` → use it\n * • `null` → suppress (force-omit even if CMS / defaults exist)\n * • `undefined` value (the key exists in `links` but is undefined)\n * → treat as \"fall through to CMS / defaults\" (same as\n * if the key wasn't in `links` at all)\n * 2. `product.resourceLinks[resource]` — CMS-managed JSON record on\n * `Product`; the canonical source once an admin has set values\n * via microfe-product → Products → <product> → Resource Links.\n * 3. CMS field for resources that have a dedicated column\n * (`docs` → `product.docsUrl`) — kept as a fallback for legacy\n * products that only have the older single-field set.\n * 4. Burdenoff group-wide default.\n * 5. `null` → omit the link.\n *\n * URLs returned by any path go through `isSafeUrl()` downstream; bad\n * schemes are dropped during the render pass.\n */\n function resolve(resource: Resource): string | null {\n if (linksProp && resource in linksProp) {\n const override = linksProp[resource];\n // `undefined` → fall through; `null` (explicit) → suppress\n if (override === undefined) {\n // continue to CMS / defaults below\n } else {\n return override;\n }\n }\n const fromCms = product?.resourceLinks?.[resource];\n if (typeof fromCms === \"string\" && fromCms.length > 0) {\n return fromCms;\n }\n if (resource === \"docs\" && product?.docsUrl) {\n return product.docsUrl;\n }\n return BURDENOFF_GROUP_DEFAULTS[resource];\n }\n\n const items = resources\n .map((r) => ({ resource: r, url: resolve(r) }))\n .filter(\n (x): x is { resource: Resource; url: string } =>\n !!x.url && isSafeUrl(x.url),\n );\n\n if (items.length === 0) return null;\n\n return (\n <ul className={className}>\n {items.map(({ resource, url }) => (\n <li key={resource}>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={itemClassName}\n >\n {labels[resource] ?? DEFAULT_LABELS[resource]}\n </a>\n </li>\n ))}\n </ul>\n );\n}\n","\"use client\";\n\n/**\n * WebsiteSwitcher Component\n *\n * A dropdown menu for navigating between Burdenoff ecosystem product websites.\n * Includes a search filter and renders each product with its logo and name.\n *\n * @example\n * ```tsx\n * import { WebsiteSwitcher } from '@burdenoff/website-sdk'\n *\n * <WebsiteSwitcher\n * products={[\n * { slug: 'vibecontrols', name: 'VibeControls', logoUrl: '/vibe.svg', websiteUrl: 'https://vibecontrols.com' },\n * { slug: 'fluidgrids', name: 'FluidGrids', logoUrl: '/fg.svg', websiteUrl: 'https://fluidgrids.com' },\n * ]}\n * />\n * ```\n */\n\nimport { useMemo, useState } from \"react\";\n\nimport * as DropdownMenu from \"@radix-ui/react-dropdown-menu\";\nimport { ChevronDown, Globe, Search } from \"lucide-react\";\n\nimport { Input } from \"../ui/input\";\nimport { cn } from \"../utils/cn\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface WebsiteSwitcherProduct {\n /** Stable identifier for the product. */\n slug: string;\n /** Human-readable product name. */\n name: string;\n /** URL to the product logo (absolute or relative). */\n logoUrl?: string | null;\n /** Product marketing site URL. */\n websiteUrl: string;\n}\n\nexport interface WebsiteSwitcherProps {\n /** All Burdenoff ecosystem products to display. */\n products: WebsiteSwitcherProduct[];\n /** Accessible label for the trigger. */\n triggerLabel?: string;\n /** Placeholder text for the search input. */\n searchPlaceholder?: string;\n /** Empty-state text when filtering returns no results. */\n emptyText?: string;\n /** Optional additional CSS class for the trigger. */\n className?: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction normalizeSearch(value: string): string {\n return value.toLowerCase().trim();\n}\n\nfunction filterProducts(\n products: WebsiteSwitcherProduct[],\n query: string,\n): WebsiteSwitcherProduct[] {\n const normalized = normalizeSearch(query);\n if (!normalized) return products;\n return products.filter((p) => normalizeSearch(p.name).includes(normalized));\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function WebsiteSwitcher({\n products,\n triggerLabel = \"Explore products\",\n searchPlaceholder = \"Find a product…\",\n emptyText = \"No products match your search.\",\n className,\n}: WebsiteSwitcherProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n\n const filtered = useMemo(\n () => filterProducts(products, query),\n [products, query],\n );\n\n return (\n <DropdownMenu.Root open={open} onOpenChange={setOpen}>\n <DropdownMenu.Trigger\n className={cn(\n \"inline-flex items-center gap-1.5 text-sm font-medium transition-colors\",\n \"text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring rounded-md\",\n className,\n )}\n aria-label={triggerLabel}\n >\n <Globe className=\"h-4 w-4\" aria-hidden=\"true\" />\n <span className=\"hidden sm:inline\">{triggerLabel}</span>\n <ChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform duration-200\",\n open && \"rotate-180\",\n )}\n aria-hidden=\"true\"\n />\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n className=\"z-50 min-w-[16rem] max-w-[20rem] rounded-lg border border-border/60 bg-popover p-2 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2\"\n sideOffset={8}\n align=\"end\"\n avoidCollisions\n >\n <div className=\"px-2 pb-2 pt-1\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n Burdenoff ecosystem\n </p>\n <div className=\"relative\">\n <Search\n className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n <Input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"h-8 pl-8 text-sm\"\n aria-label={searchPlaceholder}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n setQuery(\"\");\n }\n }}\n />\n </div>\n </div>\n\n <DropdownMenu.Separator className=\"my-1 h-px bg-border/60\" />\n\n <div className=\"max-h-[min(60vh,24rem)] overflow-y-auto py-1\">\n {filtered.length === 0 ? (\n <div className=\"px-3 py-4 text-center text-sm text-muted-foreground\">\n {emptyText}\n </div>\n ) : (\n filtered.map((product) => (\n <DropdownMenu.Item key={product.slug} asChild>\n <a\n href={product.websiteUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"flex items-center gap-3 rounded-md px-2 py-2 text-sm outline-none\",\n \"text-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\",\n )}\n >\n {product.logoUrl ? (\n <img\n src={product.logoUrl}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"h-5 w-5 shrink-0 rounded object-contain\"\n />\n ) : (\n <span className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded bg-primary/10 text-[10px] font-bold text-primary\">\n {product.name.charAt(0)}\n </span>\n )}\n <span className=\"truncate\">{product.name}</span>\n </a>\n </DropdownMenu.Item>\n ))\n )}\n </div>\n\n <DropdownMenu.Arrow className=\"fill-popover\" />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n}\n","\"use client\";\n\n/**\n * LaunchCountdown Component\n *\n * Reusable countdown timer counting down to a `launchDate` (epoch ms). Renders\n * a fixed-size grid of days / hours / minutes / seconds and flips to a\n * \"Launched\" message once the moment passes. Uses semantic theme tokens so it\n * works in light, dark, and high-contrast themes.\n *\n * @example\n * ```tsx\n * import { LaunchCountdown } from '@burdenoff/website-sdk'\n *\n * <LaunchCountdown launchDate={Date.UTC(2026, 7, 15, 0, 0, 0)} />\n * ```\n */\n\nimport { useEffect, useState } from \"react\";\n\nimport { Rocket } from \"lucide-react\";\n\nimport { cn } from \"../utils/cn\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LaunchCountdownProps {\n /** Launch moment as epoch milliseconds. */\n launchDate: number;\n /** Optional accessible label describing the launch moment. */\n launchLabel?: string;\n /** Message shown once the countdown reaches zero. */\n launchedMessage?: string;\n /** Optional additional CSS class for the outer container. */\n className?: string;\n}\n\ninterface Remaining {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction splitRemaining(ms: number): Remaining {\n const clamped = Math.max(0, ms);\n const totalSeconds = Math.floor(clamped / 1000);\n return {\n days: Math.floor(totalSeconds / 86400),\n hours: Math.floor((totalSeconds % 86400) / 3600),\n minutes: Math.floor((totalSeconds % 3600) / 60),\n seconds: totalSeconds % 60,\n };\n}\n\nfunction padTwo(n: number): string {\n return String(n).padStart(2, \"0\");\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function LaunchCountdown({\n launchDate,\n launchLabel,\n launchedMessage = \"We have launched!\",\n className,\n}: LaunchCountdownProps) {\n const [now, setNow] = useState(() => Date.now());\n const remainingMs = launchDate - now;\n const hasLaunched = remainingMs <= 0;\n\n useEffect(() => {\n if (hasLaunched) return;\n\n const interval = setInterval(() => {\n setNow(Date.now());\n }, 1000);\n\n return () => clearInterval(interval);\n }, [hasLaunched]);\n\n const { days, hours, minutes, seconds } = splitRemaining(remainingMs);\n\n const cells: Array<{ label: string; value: string }> = [\n { label: \"Days\", value: padTwo(Math.min(days, 99)) },\n { label: \"Hours\", value: padTwo(hours) },\n { label: \"Minutes\", value: padTwo(minutes) },\n { label: \"Seconds\", value: padTwo(seconds) },\n ];\n\n return (\n <div\n className={cn(\"inline-flex flex-col gap-3\", className)}\n role=\"timer\"\n aria-label={\n launchLabel ?? (hasLaunched ? launchedMessage : `Countdown to launch`)\n }\n >\n {!hasLaunched && (\n <span className=\"text-xs font-mono uppercase tracking-wider text-muted-foreground\">\n Launching in\n </span>\n )}\n\n <div className=\"flex gap-2 sm:gap-3\">\n {hasLaunched ? (\n <div\n className={cn(\n \"flex min-w-[15rem] items-center justify-center gap-3 rounded-lg border border-primary/30 bg-primary/10 px-6 py-4\",\n \"text-center\",\n )}\n >\n <Rocket className=\"h-5 w-5 text-primary\" aria-hidden=\"true\" />\n <span className=\"text-lg font-semibold text-foreground\">\n {launchedMessage}\n </span>\n </div>\n ) : (\n cells.map((cell) => (\n <div\n key={cell.label}\n className={cn(\n \"flex min-w-[3.75rem] flex-col items-center rounded-lg border border-border/60 bg-card px-3 py-2 sm:min-w-[4.5rem] sm:px-4 sm:py-3\",\n )}\n >\n <span className=\"font-mono text-2xl font-bold tabular-nums text-foreground sm:text-3xl\">\n {cell.value}\n </span>\n <span className=\"mt-1 text-[10px] font-medium uppercase tracking-wide text-muted-foreground sm:text-xs\">\n {cell.label}\n </span>\n </div>\n ))\n )}\n </div>\n\n {!hasLaunched && launchLabel && (\n <span className=\"text-sm text-muted-foreground\">{launchLabel}</span>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * ProblemsSolvedSection Component\n *\n * A creative, conversion-oriented section that pairs a problem with the\n * product's solution. Each card highlights the pain point, the fix, and an\n * optional link to a deeper use-case story.\n *\n * @example\n * ```tsx\n * import { ProblemsSolvedSection } from '@burdenoff/website-sdk'\n *\n * <ProblemsSolvedSection\n * eyebrow=\"Why teams switch\"\n * title=\"Stop fighting your tools\"\n * subtitle=\"We built VibeControls around the friction that actually slows engineering teams down.\"\n * problems={[...]}\n * />\n * ```\n */\n\nimport type { ComponentType, ReactNode } from \"react\";\n\nimport { ArrowRight } from \"lucide-react\";\n\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../utils/cn\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ProblemSolved {\n /** The pain point or before-state. */\n problem: string;\n /** How the product addresses the pain point. */\n solution: string;\n /** Lucide-style icon component. */\n icon: ComponentType<{ className?: string; \"aria-hidden\"?: boolean }>;\n /** Optional use-case story slug for linking to /use-cases/:slug. */\n storySlug?: string;\n}\n\nexport interface ProblemsSolvedSectionProps {\n /** Section eyebrow text. */\n eyebrow?: string;\n /** Section heading. */\n title?: string;\n /** Section subtitle. */\n subtitle?: string;\n /** Problem/solution pairs to render. */\n problems: ProblemSolved[];\n /** Base path for use-case story links. */\n storyBasePath?: string;\n /** Label for story links. */\n storyLabel?: string;\n /** Optional additional CSS class for the outer section. */\n className?: string;\n /** Optional child element rendered at the bottom of the section. */\n children?: ReactNode;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function ProblemsSolvedSection({\n eyebrow,\n title,\n subtitle,\n problems,\n storyBasePath = \"/use-cases\",\n storyLabel = \"See the story\",\n className,\n children,\n}: ProblemsSolvedSectionProps) {\n return (\n <section\n className={cn(\n \"py-16 md:py-24 px-4 sm:px-6 lg:px-8 bg-muted/30\",\n className,\n )}\n >\n <div className=\"max-w-7xl mx-auto\">\n {(eyebrow || title || subtitle) && (\n <div className=\"max-w-3xl mx-auto text-center mb-12 md:mb-16\">\n {eyebrow && (\n <p className=\"text-xs font-mono uppercase tracking-widest text-primary mb-4\">\n {eyebrow}\n </p>\n )}\n {title && (\n <h2 className=\"text-3xl sm:text-4xl font-bold text-foreground mb-4\">\n {title}\n </h2>\n )}\n {subtitle && (\n <p className=\"text-lg text-muted-foreground\">{subtitle}</p>\n )}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n {problems.map((item, index) => {\n const Icon = item.icon;\n const storyHref = item.storySlug\n ? `${storyBasePath.replace(/\\/$/, \"\")}/${item.storySlug}`\n : null;\n\n return (\n <div\n key={`${item.problem}-${index}`}\n className={cn(\n \"group relative flex flex-col rounded-2xl border border-border/40 bg-card p-6 transition-colors\",\n \"hover:border-primary/30\",\n )}\n >\n <div\n className={cn(\n \"mb-5 inline-flex h-12 w-12 items-center justify-center rounded-xl\",\n \"bg-primary/10 text-primary\",\n )}\n >\n <Icon className=\"h-6 w-6\" aria-hidden={true} />\n </div>\n\n <h3 className=\"text-lg font-semibold text-foreground mb-2\">\n {item.problem}\n </h3>\n\n <p className=\"text-sm text-muted-foreground leading-relaxed mb-4 flex-1\">\n {item.solution}\n </p>\n\n {storyHref && (\n <Button\n variant=\"ghost\"\n className=\"justify-start px-0 h-auto py-0 text-sm group/link\"\n asChild\n >\n <a\n href={storyHref}\n className=\"inline-flex items-center gap-1 text-primary hover:underline\"\n >\n {storyLabel}\n <ArrowRight\n className=\"h-3.5 w-3.5 transition-transform group-hover/link:translate-x-0.5\"\n aria-hidden=\"true\"\n />\n </a>\n </Button>\n )}\n </div>\n );\n })}\n </div>\n\n {children && <div className=\"mt-12\">{children}</div>}\n </div>\n </section>\n );\n}\n","\"use client\";\n\n/**\n * ElectronDownloadLink Component\n *\n * A download link that auto-detects the visitor's operating system and points\n * to the matching Electron artifact. Hidden by default via the `hidden` prop so\n * it can be staged in pages and revealed once a desktop build is ready.\n *\n * The `artifactName` prop may contain a `{platform}` token which is replaced\n * with the detected platform key (`win`, `mac`, or `linux`).\n *\n * @example\n * ```tsx\n * import { ElectronDownloadLink } from '@burdenoff/website-sdk'\n *\n * <ElectronDownloadLink\n * downloadBaseUrl=\"https://releases.example.com/desktop\"\n * artifactName=\"MyApp-{platform}.zip\"\n * />\n * ```\n */\n\nimport { Download } from \"lucide-react\";\n\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../utils/cn\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DetectedPlatform = \"win\" | \"mac\" | \"linux\" | \"unknown\";\n\nexport interface ElectronDownloadLinkProps {\n /** Base URL where artifacts are hosted (with or without trailing slash). */\n downloadBaseUrl: string;\n /** Artifact file name; may include a `{platform}` token. */\n artifactName: string;\n /** When true, the element is not rendered. Defaults to true (hidden). */\n hidden?: boolean;\n /** Link/button text. */\n label?: string;\n /** Accessible label for the download action. */\n downloadLabel?: string;\n /** Optional mapping from detected platform to artifact platform key. */\n platformMap?: Partial<Record<DetectedPlatform, string>>;\n /** Additional CSS class for the link. */\n className?: string;\n /** Variant for the rendered button. */\n variant?: \"default\" | \"outline\" | \"ghost\" | \"link\";\n /** Size for the rendered button. */\n size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Detect the visitor's desktop operating system from the user agent string.\n * Returns `win`, `mac`, `linux`, or `unknown`. This is intended for choosing\n * a download artifact; it intentionally does not distinguish mobile OSes.\n */\nexport function detectElectronPlatform(\n userAgent: string = typeof navigator !== \"undefined\"\n ? navigator.userAgent\n : \"\",\n): DetectedPlatform {\n const ua = userAgent.toLowerCase();\n\n if (ua.includes(\"win\")) return \"win\";\n if (ua.includes(\"mac\")) return \"mac\";\n if (ua.includes(\"linux\")) return \"linux\";\n\n return \"unknown\";\n}\n\nfunction buildDownloadUrl(\n base: string,\n artifactName: string,\n platform: DetectedPlatform,\n platformMap: Partial<Record<DetectedPlatform, string>>,\n): string {\n const normalizedBase = base.replace(/\\/$/, \"\");\n const platformKey = platformMap[platform] ?? platform;\n const fileName = artifactName.includes(\"{platform}\")\n ? artifactName.replace(/\\{platform\\}/g, platformKey)\n : artifactName;\n return `${normalizedBase}/${fileName}`;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function ElectronDownloadLink({\n downloadBaseUrl,\n artifactName,\n hidden = true,\n label = \"Download desktop app\",\n downloadLabel = label,\n platformMap = {},\n className,\n variant = \"default\",\n size = \"default\",\n}: ElectronDownloadLinkProps) {\n if (hidden) return null;\n\n const platform = detectElectronPlatform();\n const href = buildDownloadUrl(\n downloadBaseUrl,\n artifactName,\n platform,\n platformMap,\n );\n\n return (\n <Button\n variant={variant}\n size={size}\n className={cn(\"inline-flex items-center gap-2\", className)}\n asChild\n >\n <a\n href={href}\n download\n aria-label={`${downloadLabel}${platform !== \"unknown\" ? ` for ${platform}` : \"\"}`}\n >\n <Download className=\"h-4 w-4\" aria-hidden=\"true\" />\n {label}\n </a>\n </Button>\n );\n}\n","/**\n * Rybbit Analytics Component\n *\n * Injects the Rybbit tracking script into the page head.\n * Works with both Vite (CSR) and Next.js (SSR/CSR) applications.\n *\n * @example\n * ```tsx\n * // In your app layout or root component\n * import { RybbitAnalytics } from '@burdenoff/website-sdk/analytics'\n *\n * function App() {\n * return (\n * <>\n * <RybbitAnalytics siteId=\"1\" />\n * <Router>...</Router>\n * </>\n * )\n * }\n * ```\n */\n\"use client\";\n\nimport { useEffect } from \"react\";\n\nexport interface RybbitAnalyticsProps {\n /**\n * Rybbit site ID (obtained from the Rybbit dashboard)\n */\n siteId: string;\n\n /**\n * Rybbit script URL (defaults to the self-hosted instance)\n * @default \"https://analytics.burdenoff.com/api/script.js\"\n */\n scriptUrl?: string;\n\n /**\n * Whether to enable tracking (useful for disabling in development)\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * RybbitAnalytics - Embeds the Rybbit analytics tracking script.\n *\n * The script is loaded asynchronously with `defer` to avoid blocking page load.\n * It automatically tracks page views and user interactions.\n *\n * In development mode (when `enabled` is false), no script is loaded.\n */\nexport function RybbitAnalytics({\n siteId,\n scriptUrl = \"https://analytics.burdenoff.com/api/script.js\",\n enabled = true,\n}: RybbitAnalyticsProps) {\n useEffect(() => {\n if (!enabled || !siteId) return;\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[data-site-id=\"${siteId}\"]`,\n );\n if (existingScript) return;\n\n // Create and inject the script. `crossOrigin=\"anonymous\"` puts the\n // request in CORS-no-credentials mode so the browser does not include\n // any third-party cookies the visitor may have on the analytics origin\n // (e.g. `app.rybbit.io`'s own dashboard session cookie). Without this,\n // Lighthouse `third-party-cookies` audit flags the page even though we\n // never read those cookies ourselves.\n const script = document.createElement(\"script\");\n script.src = scriptUrl;\n script.defer = true;\n script.crossOrigin = \"anonymous\";\n script.setAttribute(\"data-site-id\", siteId);\n document.head.appendChild(script);\n\n // Cleanup on unmount\n return () => {\n const scriptToRemove = document.querySelector(\n `script[data-site-id=\"${siteId}\"]`,\n );\n if (scriptToRemove) {\n document.head.removeChild(scriptToRemove);\n }\n };\n }, [siteId, scriptUrl, enabled]);\n\n // This component renders nothing - it only manages the script tag\n return null;\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 { 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 <h3 className=\"text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2\">\n {post.title}\n </h3>\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 />\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 <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=\"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=\"prose prose-gray dark:prose-invert 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. Mirrors the Blog components\n * but sources ProductContentPage records tagged \"case-study\". Same look, feel,\n * and data path as the blog so the two stay visually consistent.\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 } from \"react\";\n\nimport { ContentRenderer } from \"./content-provider\";\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 heroTitle?: string;\n heroSubtitle?: string;\n caseStudyBasePath?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n seoKeywords?: 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 className?: string;\n}\n\n/** Tag that marks a ProductContentPage as a case study. */\nconst CASE_STUDY_TAG = \"case-study\";\n\n// ============================================================================\n// Query\n// ============================================================================\n\nconst CASE_STUDIES_QUERY = `\n query CaseStudies($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 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 }\n }\n`;\n\n// ============================================================================\n// CaseStudyCard\n// ============================================================================\n\nfunction CaseStudyCard({\n post,\n basePath = \"/case-studies\",\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 <h3 className=\"text-lg font-semibold text-foreground mb-2 group-hover:text-primary transition-colors line-clamp-2\">\n {post.title}\n </h3>\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// CaseStudiesListPage\n// ============================================================================\n\nexport function CaseStudiesListPage(props: CaseStudiesListPageProps) {\n const {\n productName,\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 } = 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 }>(CASE_STUDIES_QUERY, {\n productId: resolvedProductId,\n limit,\n offset,\n });\n\n if (result.errors?.length) {\n setError(result.errors[0]?.message ?? \"Failed to load case studies\");\n return;\n }\n\n // Filter to only case-study-tagged pages\n const caseStudies = (result.data?.publicContentPages?.items || []).filter(\n (p) => p.tags?.includes(CASE_STUDY_TAG),\n );\n\n setPosts(caseStudies);\n setTotal(result.data?.publicContentPages?.total || 0);\n setError(null);\n } catch {\n setError(\"Failed to load case studies\");\n } finally {\n setLoading(false);\n }\n }, [client, resolvedProductId, offset]);\n\n useEffect(() => {\n fetchPosts();\n }, [fetchPosts]);\n\n // Separate featured and regular case studies\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 />\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 {/* Case studies */}\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 case studies yet. Check back soon!\n </p>\n </div>\n ) : (\n <>\n {/* Featured case studies (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 <CaseStudyCard\n key={post.id}\n post={post}\n basePath={caseStudyBasePath}\n />\n ))}\n </div>\n )}\n\n {/* Regular case studies (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 <CaseStudyCard\n key={post.id}\n post={post}\n basePath={caseStudyBasePath}\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// CaseStudyPage\n// ============================================================================\n\nexport function CaseStudyPage(props: CaseStudyPageProps) {\n const {\n productName,\n caseStudiesListUrl = \"/case-studies\",\n backLabel = \"Back to Case Studies\",\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 }>(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 setPost(result.data?.publicContentPage ?? 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=\"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\">Case study not found</h1>\n <p className=\"text-muted-foreground mb-6\">\n {error || \"This case study doesn't exist or has been removed.\"}\n </p>\n <a\n href={caseStudiesListUrl}\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 <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=\"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={caseStudiesListUrl}\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=\"prose prose-gray dark:prose-invert 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 * 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 { 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=\"prose prose-sm prose-gray dark:prose-invert 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=\"prose prose-sm prose-gray dark:prose-invert max-w-none\">\n <ContentRenderer content={content} format=\"markdown\" />\n </div>\n );\n }\n return <div className=\"prose 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 <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 hover: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 hover: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"]}
|