@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.
Files changed (119) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +357 -0
  3. package/dist/analytics/index.d.mts +27 -0
  4. package/dist/analytics/index.d.ts +27 -0
  5. package/dist/analytics/index.js +36 -0
  6. package/dist/analytics/index.js.map +1 -0
  7. package/dist/analytics/index.mjs +34 -0
  8. package/dist/analytics/index.mjs.map +1 -0
  9. package/dist/client/index.d.mts +29 -0
  10. package/dist/client/index.d.ts +29 -0
  11. package/dist/client/index.js +261 -0
  12. package/dist/client/index.js.map +1 -0
  13. package/dist/client/index.mjs +255 -0
  14. package/dist/client/index.mjs.map +1 -0
  15. package/dist/components/contact.d.mts +144 -0
  16. package/dist/components/contact.d.ts +144 -0
  17. package/dist/components/contact.js +806 -0
  18. package/dist/components/contact.js.map +1 -0
  19. package/dist/components/contact.mjs +780 -0
  20. package/dist/components/contact.mjs.map +1 -0
  21. package/dist/components/electron-download.d.mts +32 -0
  22. package/dist/components/electron-download.d.ts +32 -0
  23. package/dist/components/electron-download.js +131 -0
  24. package/dist/components/electron-download.js.map +1 -0
  25. package/dist/components/electron-download.mjs +108 -0
  26. package/dist/components/electron-download.mjs.map +1 -0
  27. package/dist/components/launch-countdown.d.mts +15 -0
  28. package/dist/components/launch-countdown.d.ts +15 -0
  29. package/dist/components/launch-countdown.js +89 -0
  30. package/dist/components/launch-countdown.js.map +1 -0
  31. package/dist/components/launch-countdown.mjs +87 -0
  32. package/dist/components/launch-countdown.mjs.map +1 -0
  33. package/dist/components/newsletter.d.mts +155 -0
  34. package/dist/components/newsletter.d.ts +155 -0
  35. package/dist/components/newsletter.js +880 -0
  36. package/dist/components/newsletter.js.map +1 -0
  37. package/dist/components/newsletter.mjs +854 -0
  38. package/dist/components/newsletter.mjs.map +1 -0
  39. package/dist/components/partners.d.mts +88 -0
  40. package/dist/components/partners.d.ts +88 -0
  41. package/dist/components/partners.js +1169 -0
  42. package/dist/components/partners.js.map +1 -0
  43. package/dist/components/partners.mjs +1143 -0
  44. package/dist/components/partners.mjs.map +1 -0
  45. package/dist/components/pricing.d.mts +194 -0
  46. package/dist/components/pricing.d.ts +194 -0
  47. package/dist/components/pricing.js +813 -0
  48. package/dist/components/pricing.js.map +1 -0
  49. package/dist/components/pricing.mjs +791 -0
  50. package/dist/components/pricing.mjs.map +1 -0
  51. package/dist/components/problems-solved.d.mts +37 -0
  52. package/dist/components/problems-solved.d.ts +37 -0
  53. package/dist/components/problems-solved.js +157 -0
  54. package/dist/components/problems-solved.js.map +1 -0
  55. package/dist/components/problems-solved.mjs +135 -0
  56. package/dist/components/problems-solved.mjs.map +1 -0
  57. package/dist/components/resource-links.d.mts +28 -0
  58. package/dist/components/resource-links.d.ts +28 -0
  59. package/dist/components/resource-links.js +229 -0
  60. package/dist/components/resource-links.js.map +1 -0
  61. package/dist/components/resource-links.mjs +227 -0
  62. package/dist/components/resource-links.mjs.map +1 -0
  63. package/dist/components/social-links.d.mts +37 -0
  64. package/dist/components/social-links.d.ts +37 -0
  65. package/dist/components/social-links.js +268 -0
  66. package/dist/components/social-links.js.map +1 -0
  67. package/dist/components/social-links.mjs +266 -0
  68. package/dist/components/social-links.mjs.map +1 -0
  69. package/dist/components/unsubscribe.d.mts +14 -0
  70. package/dist/components/unsubscribe.d.ts +14 -0
  71. package/dist/components/unsubscribe.js +538 -0
  72. package/dist/components/unsubscribe.js.map +1 -0
  73. package/dist/components/unsubscribe.mjs +517 -0
  74. package/dist/components/unsubscribe.mjs.map +1 -0
  75. package/dist/components/waitlist.d.mts +70 -0
  76. package/dist/components/waitlist.d.ts +70 -0
  77. package/dist/components/waitlist.js +864 -0
  78. package/dist/components/waitlist.js.map +1 -0
  79. package/dist/components/waitlist.mjs +841 -0
  80. package/dist/components/waitlist.mjs.map +1 -0
  81. package/dist/components/website-switcher.d.mts +27 -0
  82. package/dist/components/website-switcher.d.ts +27 -0
  83. package/dist/components/website-switcher.js +168 -0
  84. package/dist/components/website-switcher.js.map +1 -0
  85. package/dist/components/website-switcher.mjs +146 -0
  86. package/dist/components/website-switcher.mjs.map +1 -0
  87. package/dist/content/index.d.mts +247 -0
  88. package/dist/content/index.d.ts +247 -0
  89. package/dist/content/index.js +2458 -0
  90. package/dist/content/index.js.map +1 -0
  91. package/dist/content/index.mjs +2428 -0
  92. package/dist/content/index.mjs.map +1 -0
  93. package/dist/index.d.mts +72 -0
  94. package/dist/index.d.ts +72 -0
  95. package/dist/index.js +6273 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/index.mjs +6204 -0
  98. package/dist/index.mjs.map +1 -0
  99. package/dist/product/index.d.mts +94 -0
  100. package/dist/product/index.d.ts +94 -0
  101. package/dist/product/index.js +282 -0
  102. package/dist/product/index.js.map +1 -0
  103. package/dist/product/index.mjs +278 -0
  104. package/dist/product/index.mjs.map +1 -0
  105. package/dist/provider-D7Rij9UM.d.mts +86 -0
  106. package/dist/provider-D7Rij9UM.d.ts +86 -0
  107. package/dist/seo/index.d.mts +64 -0
  108. package/dist/seo/index.d.ts +64 -0
  109. package/dist/seo/index.js +61 -0
  110. package/dist/seo/index.js.map +1 -0
  111. package/dist/seo/index.mjs +59 -0
  112. package/dist/seo/index.mjs.map +1 -0
  113. package/dist/utils/index.d.mts +21 -0
  114. package/dist/utils/index.d.ts +21 -0
  115. package/dist/utils/index.js +12 -0
  116. package/dist/utils/index.js.map +1 -0
  117. package/dist/utils/index.mjs +10 -0
  118. package/dist/utils/index.mjs.map +1 -0
  119. package/package.json +168 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/security.ts","../../src/client/graphql-client.ts","../../src/client/provider.tsx","../../src/product/product-provider.tsx","../../src/content/content-provider.tsx","../../src/seo/page-head.tsx","../../src/content/blog.tsx","../../src/content/case-studies.tsx","../../src/utils/cn.ts","../../src/ui/button.tsx","../../src/ui/input.tsx","../../src/content/changelog.tsx","../../src/content/utils.ts","../../src/content/press-kit.tsx","../../src/content/contracts.tsx"],"names":["createContext","useContext","useState","useCallback","jsx","jsxs","useEffect","Fragment","React2","useMemo"],"mappings":"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","file":"index.mjs","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 * 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 * 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, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\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 &gt;)\n html = html.replace(/^&gt; (.+)$/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","/**\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","\"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","/**\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","\"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"]}