@burdenoff/website-sdk 2026.511.1 → 2026.513.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/contact.js +1 -1
- package/dist/components/contact.js.map +1 -1
- package/dist/components/contact.mjs +1 -1
- package/dist/components/contact.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/security.ts","../src/client/graphql-client.ts","../src/client/gateway-resolver.ts","../src/client/provider.tsx","../src/seo/page-head.tsx","../src/utils/cn.ts","../src/ui/button.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/textarea.tsx","../src/components/contact.tsx","../src/product/product-provider.tsx","../src/components/newsletter.tsx","../src/components/pricing.tsx","../src/components/waitlist.tsx","../src/components/unsubscribe.tsx","../src/analytics/rybbit.tsx","../src/content/content-provider.tsx"],"names":["createContext","useMemo","useContext","Helmet","jsx","twMerge","clsx","cva","React","Slot","React2","React3","LabelPrimitive","React4","useRef","useState","toast","jsxs","Mail","Phone","MapPin","Clock","ReCAPTCHA","Fragment","Send","useCallback","useLayoutEffect","z","useEffect","useForm","zodResolver","useRateLimit"],"mappings":"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","file":"index.js","sourcesContent":["const LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"::1\"]);\nconst RESERVED_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"x-actor-id\",\n \"x-actor-type\",\n \"x-consent-granted-by\",\n \"x-consent-scope\",\n \"x-consent-granted-at\",\n \"x-consent-expires-at\",\n]);\n\nexport function validateGatewayUrl(value: string): string {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Gateway URL must be a valid absolute URL\");\n }\n\n if (url.protocol === \"https:\") {\n return url.toString();\n }\n\n if (\n url.protocol === \"http:\" &&\n LOOPBACK_HOSTS.has(url.hostname.toLowerCase())\n ) {\n return url.toString();\n }\n\n throw new Error(\"Gateway URL must use HTTPS unless it targets localhost\");\n}\n\nexport function sanitizeHeaders(\n headers?: Record<string, string>,\n): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n return Object.fromEntries(\n Object.entries(headers).filter(\n ([key]) => !RESERVED_HEADERS.has(key.toLowerCase()),\n ),\n );\n}\n","/**\n * Lightweight GraphQL client for the Burdenoff Web SDK.\n * Uses native fetch - zero external dependencies.\n * All calls are unauthenticated (public gateway operations only).\n */\n\nimport { sanitizeHeaders, validateGatewayUrl } from \"./security\";\n\nexport interface WebSDKClientConfig {\n /** Global public gateway URL (e.g. \"https://api.burdenoff.com/global/graphql\") */\n gatewayUrl: string;\n /** Platform product ID for scoping operations */\n productId: string;\n /** Product slug (used for public product queries) */\n productSlug?: string;\n /** reCAPTCHA site key (if not fetched from product config) */\n recaptchaSiteKey?: string;\n /** Rybbit analytics site ID */\n rybbitSiteId?: string;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n}\n\nexport interface GraphQLResponse<T = Record<string, unknown>> {\n data?: T;\n errors?: Array<{\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: Array<string | number>;\n extensions?: Record<string, unknown>;\n }>;\n}\n\nexport class WebSDKClient {\n private config: WebSDKClientConfig;\n private queryCache = new Map<\n string,\n { data: GraphQLResponse<unknown>; ts: number }\n >();\n private inflight = new Map<string, Promise<GraphQLResponse<unknown>>>();\n private static CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private static MAX_CACHE_ENTRIES = 100;\n\n constructor(config: WebSDKClientConfig) {\n this.config = {\n ...config,\n gatewayUrl: validateGatewayUrl(config.gatewayUrl),\n headers: sanitizeHeaders(config.headers),\n };\n }\n\n getConfig(): WebSDKClientConfig {\n return this.config;\n }\n\n /**\n * Execute a GraphQL query (with deduplication and caching)\n */\n async query<T = Record<string, unknown>>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n const cacheKey = JSON.stringify({ query, variables });\n\n // Return cached response if still valid, evict if expired\n const cached = this.queryCache.get(cacheKey);\n if (cached) {\n if (Date.now() - cached.ts < WebSDKClient.CACHE_TTL) {\n return cached.data as GraphQLResponse<T>;\n }\n this.queryCache.delete(cacheKey);\n }\n\n // Deduplicate: if same query is already in-flight, reuse the promise\n const existing = this.inflight.get(cacheKey);\n if (existing) {\n return existing as Promise<GraphQLResponse<T>>;\n }\n\n const promise = this.request<T>(query, variables)\n .then((result) => {\n // Cache successful responses only\n if (result.data && !result.errors?.length) {\n if (this.queryCache.size >= WebSDKClient.MAX_CACHE_ENTRIES) {\n const oldestEntry = this.queryCache.keys().next().value;\n if (oldestEntry) {\n this.queryCache.delete(oldestEntry);\n }\n }\n this.queryCache.set(cacheKey, { data: result, ts: Date.now() });\n }\n return result;\n })\n .finally(() => {\n this.inflight.delete(cacheKey);\n });\n\n this.inflight.set(cacheKey, promise);\n return promise;\n }\n\n /**\n * Execute a GraphQL mutation\n */\n async mutate<T = Record<string, unknown>>(\n mutation: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n return this.request<T>(mutation, variables);\n }\n\n private async request<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n try {\n const response = await fetch(this.config.gatewayUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-product-id\": this.config.productId,\n ...this.config.headers,\n },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n console.error(\n \"[WebSDK] GraphQL request failed\",\n response.status,\n response.statusText,\n );\n return {\n errors: [\n {\n message: `HTTP ${response.status}: ${response.statusText}`,\n extensions: { code: `HTTP_${response.status}` },\n },\n ],\n };\n }\n\n return (await response.json()) as GraphQLResponse<T>;\n } catch (error) {\n console.error(\n \"[WebSDK] Network error\",\n error instanceof Error ? error.message : \"unknown error\",\n );\n return {\n errors: [\n {\n message: error instanceof Error ? error.message : \"Network error\",\n extensions: { code: \"NETWORK_ERROR\" },\n },\n ],\n };\n }\n }\n}\n","/**\n * Runtime gateway URL resolution for product marketing websites.\n *\n * Mirrors the app shell pattern from @burdenoff/fe-libs/shared/config/gatewayUrls\n * but scoped to the website SDK's needs (global gateway only, no workspace gateway).\n *\n * Resolution priority:\n * 1. Explicit `gatewayUrl` passed in config (non-empty) — used as-is\n * 2. Hostname-based auto-detection:\n * - Production domains (vibecontrols.com, bigconsole.com, ...) → prod gateway\n * - Alpha domains (alpha.vibecontrols.com, ...) → alpha gateway\n * - Everything else (localhost, *.local.burdenoff.com) → relative `/global/graphql`\n */\n\nconst PROD_GATEWAY = \"https://graphql.burdenoff.com/global/graphql\";\nconst ALPHA_GATEWAY = \"https://alphagraphql.burdenoff.com/global/graphql\";\n/**\n * Build the local fallback URL. In a browser context we need an absolute\n * URL (the SDK's security validator rejects relative paths), so we\n * prepend `window.location.origin`. During SSR/build (no window) we\n * return a placeholder localhost URL that the validator accepts.\n */\nfunction getLocalFallback(): string {\n if (typeof window !== \"undefined\") {\n return `${window.location.origin}/global/graphql`;\n }\n return \"http://localhost:4000/global/graphql\";\n}\n\n/**\n * All known product domains. When the website is served from any of these,\n * we can determine the environment from the subdomain pattern.\n */\nconst PRODUCT_DOMAINS = [\n \"burdenoff.com\",\n \"vibecontrols.com\",\n \"fluidgrids.com\",\n \"botlit.ai\",\n \"bigconsole.com\",\n \"gethealthybowl.com\",\n \"headshotmarketing.com\",\n \"timecampus.com\",\n \"ggnomad.com\",\n \"movethewheels.com\",\n \"crewfoundry.com\",\n \"planmagnet.com\",\n \"eventfullymanaged.com\",\n \"kadaikodi.com\",\n \"assethandler.com\",\n \"technospam.com\",\n \"semanticfed.com\",\n \"manufacturedops.com\",\n \"theglobalfuel.com\",\n \"housingvista.com\",\n \"proserviceworld.com\",\n \"mybodyshield.com\",\n \"artistrybase.com\",\n \"collabkin.com\",\n \"brainyrich.com\",\n \"theculturepost.com\",\n \"comradecircle.com\",\n \"cosmicintersection.com\",\n \"govcitizenhub.com\",\n \"intelwatchtower.com\",\n \"ecoimpacthub.com\",\n \"buildmyiq.com\",\n \"fluidgrids.ai\",\n];\n\nfunction isProductionHost(hostname: string): boolean {\n return PRODUCT_DOMAINS.some(\n (d) => hostname === d || hostname === `www.${d}` || hostname === `app.${d}`,\n );\n}\n\nfunction isAlphaHost(hostname: string): boolean {\n return PRODUCT_DOMAINS.some(\n (d) =>\n hostname === `alpha.${d}` ||\n hostname === `alphaapp.${d}` ||\n hostname === `staging.${d}`,\n );\n}\n\n/**\n * Resolve the global gateway URL at runtime based on the current hostname.\n *\n * @param explicitUrl - URL explicitly passed in SDK config (takes precedence if non-empty)\n * @returns Resolved gateway URL\n */\nexport function resolveGatewayUrl(explicitUrl?: string): string {\n // If an explicit URL is provided and it's not a localhost dev default,\n // respect it — the consumer knows what they want.\n if (explicitUrl && !isLocalhostUrl(explicitUrl)) {\n return explicitUrl;\n }\n\n if (typeof window === \"undefined\") {\n // SSR / build-time — can't detect hostname, use the explicit URL or fallback\n return explicitUrl || getLocalFallback();\n }\n\n const hostname = window.location.hostname.toLowerCase();\n\n if (isProductionHost(hostname)) return PROD_GATEWAY;\n if (isAlphaHost(hostname)) return ALPHA_GATEWAY;\n\n // Local dev, *.local.burdenoff.com, or unknown — use relative URL\n // which the Vite proxy (dev) or nginx (containerized) will handle.\n return getLocalFallback();\n}\n\nfunction isLocalhostUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n const h = parsed.hostname;\n return h === \"localhost\" || h === \"127.0.0.1\" || h === \"::1\";\n } catch {\n return false;\n }\n}\n","/**\n * React context provider for the Web SDK client.\n * Wraps the application with WebSDKClient configuration.\n */\n\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { resolveGatewayUrl } from \"./gateway-resolver\";\nimport { WebSDKClient, type WebSDKClientConfig } from \"./graphql-client\";\n\nconst WebSDKContext = createContext<WebSDKClient | null>(null);\n\nexport interface WebSDKProviderProps {\n /** SDK client configuration */\n config: WebSDKClientConfig;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider component that makes the WebSDKClient available to all child components.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={{\n * gatewayUrl: \"https://api.burdenoff.com/global/graphql\",\n * productId: \"your-product-id\",\n * productSlug: \"your-product\",\n * }}>\n * <App />\n * </WebSDKProvider>\n * ```\n */\nexport function WebSDKProvider({ config, children }: WebSDKProviderProps) {\n const client = useMemo(() => {\n const resolvedConfig = {\n ...config,\n gatewayUrl: resolveGatewayUrl(config.gatewayUrl),\n };\n return new WebSDKClient(resolvedConfig);\n }, [config]);\n\n return (\n <WebSDKContext.Provider value={client}>{children}</WebSDKContext.Provider>\n );\n}\n\n/**\n * Hook to access the WebSDKClient instance.\n * Must be used within a WebSDKProvider.\n */\nexport function useWebSDK(): WebSDKClient {\n const client = useContext(WebSDKContext);\n if (!client) {\n throw new Error(\"useWebSDK must be used within a WebSDKProvider\");\n }\n return client;\n}\n\n/**\n * Hook to access the SDK configuration.\n * Useful for components that need config values like productId, recaptchaSiteKey, etc.\n */\nexport function useWebSDKConfig(): WebSDKClientConfig {\n const client = useWebSDK();\n return client.getConfig();\n}\n","/**\n * PageHead Component\n * Manages dynamic meta tags for SEO optimization on a per-page basis.\n * Supports JSON-LD structured data, Open Graph, Twitter Cards, favicons, and robots directives.\n *\n * @example\n * ```tsx\n * <PageHead\n * title=\"About Us\"\n * description=\"Learn about our mission and team\"\n * productName=\"MyProduct\"\n * keywords=\"about, team, mission\"\n * image=\"/og-about.png\"\n * url=\"https://myproduct.com/about\"\n * favicon=\"/favicon.ico\"\n * robots=\"index, follow\"\n * locale=\"en_US\"\n * twitterHandle=\"@burdenoff\"\n * themeColor=\"#1a1a2e\"\n * structuredData={{\n * \"@context\": \"https://schema.org\",\n * \"@type\": \"WebPage\",\n * name: \"About Us\",\n * }}\n * />\n * ```\n */\n\nimport { Helmet } from \"react-helmet-async\";\n\nexport interface PageHeadProps {\n /** Page title */\n title: string;\n /** Meta description */\n description?: string;\n /** Product/brand name (appended to title) */\n productName?: string;\n /** SEO keywords */\n keywords?: string;\n /** Open Graph image URL */\n image?: string;\n /** Page canonical URL */\n url?: string;\n /** Favicon URL */\n favicon?: string;\n /** Robots directive (e.g., \"index, follow\") */\n robots?: string;\n /** Open Graph locale (e.g., \"en_US\") */\n locale?: string;\n /** Twitter handle (e.g., \"@burdenoff\") */\n twitterHandle?: string;\n /** Theme color for mobile browsers */\n themeColor?: string;\n /** JSON-LD structured data objects */\n structuredData?: Record<string, unknown> | Array<Record<string, unknown>>;\n /** Additional meta tags */\n additionalMeta?: Array<{\n name?: string;\n property?: string;\n content: string;\n }>;\n}\n\nexport function PageHead({\n title,\n description,\n productName,\n keywords,\n image,\n url,\n favicon,\n robots = \"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\",\n locale = \"en_US\",\n twitterHandle,\n themeColor = \"#000000\",\n structuredData,\n additionalMeta,\n}: PageHeadProps) {\n const fullTitle =\n productName && !title.includes(productName)\n ? `${title} | ${productName}`\n : title;\n\n const fullImageUrl =\n image && !image.startsWith(\"http\") && url\n ? `${url.replace(/\\/$/, \"\")}${image}`\n : image;\n\n // Normalize structured data to an array\n const structuredDataItems: Array<Record<string, unknown>> = structuredData\n ? Array.isArray(structuredData)\n ? structuredData\n : [structuredData]\n : [];\n\n return (\n <Helmet>\n {/* Primary Meta Tags */}\n <title>{fullTitle}</title>\n <meta name=\"title\" content={fullTitle} />\n {description && <meta name=\"description\" content={description} />}\n {keywords && <meta name=\"keywords\" content={keywords} />}\n <meta name=\"author\" content=\"Burdenoff Consultancy Services Pvt Ltd\" />\n <meta name=\"robots\" content={robots} />\n\n {/* Canonical URL */}\n {url && <link rel=\"canonical\" href={url} />}\n\n {/* Favicon */}\n {favicon && <link rel=\"icon\" href={favicon} />}\n\n {/* Open Graph / Facebook */}\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={fullTitle} />\n {description && <meta property=\"og:description\" content={description} />}\n {fullImageUrl && <meta property=\"og:image\" content={fullImageUrl} />}\n {url && <meta property=\"og:url\" content={url} />}\n <meta property=\"og:locale\" content={locale} />\n {productName && <meta property=\"og:site_name\" content={productName} />}\n\n {/* Twitter Card */}\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta name=\"twitter:title\" content={fullTitle} />\n {description && <meta name=\"twitter:description\" content={description} />}\n {fullImageUrl && <meta name=\"twitter:image\" content={fullImageUrl} />}\n {twitterHandle && <meta name=\"twitter:creator\" content={twitterHandle} />}\n\n {/* Theme Color */}\n <meta name=\"theme-color\" content={themeColor} />\n\n {/* JSON-LD Structured Data */}\n {structuredDataItems.map((data, index) => (\n <script key={`ld-${index}`} type=\"application/ld+json\">\n {JSON.stringify(data)}\n </script>\n ))}\n\n {/* Additional Meta Tags */}\n {additionalMeta?.map((meta, index) => (\n <meta\n key={`meta-${index}`}\n {...(meta.name ? { name: meta.name } : {})}\n {...(meta.property ? { property: meta.property } : {})}\n content={meta.content}\n />\n ))}\n </Helmet>\n );\n}\n","/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx and tailwind-merge for optimal class handling\n */\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge multiple class names intelligently\n * - Handles conditional classes via clsx\n * - Deduplicates and resolves Tailwind conflicts via tailwind-merge\n *\n * @example\n * ```ts\n * cn('px-4 py-2', 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-4 py-2 bg-blue-500 text-white' (if isActive is true)\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","import * as React from \"react\";\n\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils/cn\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n);\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","/**\n * Contact Page Component\n * Complete contact page with form submission via GraphQL, reCAPTCHA validation,\n * contact information display, and additional contact options.\n * Uses the WebSDKClient provider for API calls.\n *\n * @example\n * ```tsx\n * import { ContactPage } from '@burdenoff/website-sdk/components/contact'\n *\n * <ContactPage\n * productName=\"MyProduct\"\n * recaptchaSiteKey=\"your-recaptcha-key\"\n * contactEmail=\"contact@myproduct.com\"\n * contactPhone=\"+1-234-567-8900\"\n * officeAddress={{\n * line1: \"123 Main St\",\n * line2: \"Suite 100\",\n * line3: \"City, State 12345\",\n * country: \"USA\"\n * }}\n * />\n * ```\n */\n\n\"use client\";\n\nimport { useState, useRef } from \"react\";\n\nimport { Mail, MapPin, Phone, Clock, Send } from \"lucide-react\";\nimport ReCAPTCHA from \"react-google-recaptcha\";\nimport { toast } from \"sonner\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Textarea } from \"../ui/textarea\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\ninterface OfficeAddress {\n line1: string;\n line2: string;\n line3: string;\n country: string;\n}\n\ninterface ContactOption {\n title: string;\n description: string;\n buttonText: string;\n buttonLink: string;\n}\n\ninterface ContactFormData {\n firstName: string;\n lastName: string;\n email: string;\n company?: string;\n subject: string;\n message: string;\n recaptchaToken: string;\n}\n\ntype SubmitStatus = \"idle\" | \"success\" | \"error\";\n\nexport interface ContactPageProps {\n /** Product name. Falls back to SDK config productId if not provided. */\n productName?: string;\n /** reCAPTCHA site key (optional, falls back to SDK config) */\n recaptchaSiteKey?: string;\n /** Contact email */\n contactEmail: string;\n /** Contact phone number */\n contactPhone: string;\n /** Office address */\n officeAddress: OfficeAddress;\n /** Response time message */\n responseTime?: string;\n /** Hero title */\n heroTitle?: string;\n /** Hero description */\n heroDescription?: string;\n /** Additional contact options */\n additionalOptions?: ContactOption[];\n /** SEO metadata */\n seo?: {\n title?: string;\n description?: string;\n keywords?: string;\n image?: string;\n url?: string;\n };\n}\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst SUBMIT_CONTACT_INQUIRY_MUTATION = /* GraphQL */ `\n mutation SubmitContactInquiry($input: SubmitContactInquiryInput!) {\n submitContactInquiry(input: $input) {\n success\n message\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function submitContactForm(\n client: WebSDKClient,\n data: ContactFormData,\n productId: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n submitContactInquiry: {\n success: boolean;\n message: string;\n };\n }>(SUBMIT_CONTACT_INQUIRY_MUTATION, {\n input: {\n name: `${data.firstName} ${data.lastName}`,\n email: data.email.trim().toLowerCase(),\n company: data.company || undefined,\n subject: data.subject,\n message: data.message,\n productId,\n ...(data.recaptchaToken ? { recaptchaToken: data.recaptchaToken } : {}),\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Failed to send message\";\n return { success: false, message: errorMsg };\n }\n\n const response = result.data?.submitContactInquiry;\n if (response?.success) {\n return {\n success: true,\n message: response.message || \"Message sent successfully!\",\n };\n }\n\n return {\n success: false,\n message: response?.message || \"Failed to send message\",\n };\n } catch (error) {\n console.error(\"Contact form submission error:\", error);\n return {\n success: false,\n message: \"Network error. Please try again.\",\n };\n }\n}\n\n// ============================================================================\n// HELPER\n// ============================================================================\n\nfunction replacePlaceholders(\n text: string,\n productName: string,\n email: string,\n): string {\n return text.replace(/{productName}/g, productName).replace(/{email}/g, email);\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function ContactPage({\n productName,\n recaptchaSiteKey,\n contactEmail,\n contactPhone,\n officeAddress,\n responseTime = \"We typically respond within 24 hours\",\n heroTitle = \"Get in Touch\",\n heroDescription = \"Have questions about {productName}? We're here to help. Reach out to our team and we'll get back to you as soon as possible.\",\n additionalOptions = [\n {\n title: \"Sales Inquiries\",\n description:\n \"Ready to see {productName} in action? Our sales team is here to help.\",\n buttonText: \"Contact Sales\",\n buttonLink: `mailto:${contactEmail}`,\n },\n {\n title: \"Technical Support\",\n description:\n \"Need help with your {productName} setup? Our support team is ready.\",\n buttonText: \"Get Support\",\n buttonLink: `mailto:${contactEmail}`,\n },\n {\n title: \"Partnership\",\n description:\n \"Interested in partnering with {productName}? Let's explore opportunities.\",\n buttonText: \"Partner With Us\",\n buttonLink: `mailto:${contactEmail}`,\n },\n ],\n seo,\n}: ContactPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const displayName = productName ?? config.productId;\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ?? config.recaptchaSiteKey ?? \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<SubmitStatus>(\"idle\");\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Get reCAPTCHA token (skip validation when no site key is configured)\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n setIsSubmitting(true);\n setSubmitStatus(\"idle\");\n\n // Store form reference before async operations\n const form = e.currentTarget;\n\n try {\n const formData = new FormData(form);\n\n const contactData: ContactFormData = {\n firstName: formData.get(\"firstName\") as string,\n lastName: formData.get(\"lastName\") as string,\n email: formData.get(\"email\") as string,\n company: formData.get(\"company\") as string,\n subject: formData.get(\"subject\") as string,\n message: formData.get(\"message\") as string,\n recaptchaToken,\n };\n\n const result = await submitContactForm(\n client,\n contactData,\n config.productId,\n );\n\n if (result.success) {\n setSubmitStatus(\"success\");\n toast.success(\n result.message ??\n `Thank you for contacting ${displayName}. We'll get back to you within 24 hours.`,\n );\n\n // Reset form\n if (form) {\n form.reset();\n }\n // Reset reCAPTCHA\n recaptchaRef.current?.reset();\n } else {\n setSubmitStatus(\"error\");\n toast.error(\n result.message ?? \"Failed to send message. Please try again.\",\n );\n recaptchaRef.current?.reset();\n }\n } catch (error) {\n console.error(\"Error submitting form:\", error);\n setSubmitStatus(\"error\");\n toast.error(\"Failed to send message. Please try again later.\");\n recaptchaRef.current?.reset();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <div className=\"w-full\">\n {seo && (\n <PageHead\n title={\n seo.title ?? `Contact ${displayName} - Get in Touch With Our Team`\n }\n description={\n seo.description ??\n `Ready to transform your business? Contact our team for sales inquiries, technical support, or partnership opportunities. We're here to help you succeed.`\n }\n productName={displayName}\n keywords={\n seo.keywords ??\n `contact ${displayName.toLowerCase()}, sales inquiries, customer support, technical support, partnership opportunities, get in touch`\n }\n image={seo.image ?? \"/og-image-contact.png\"}\n url={seo.url}\n />\n )}\n\n {/* Hero Section */}\n <section className=\"bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6\">\n {heroTitle}\n </h1>\n <p className=\"text-lg sm:text-xl text-muted-foreground leading-relaxed\">\n {replacePlaceholders(heroDescription, displayName, contactEmail)}\n </p>\n </div>\n </div>\n </section>\n\n {/* Contact Form and Info */}\n <section className=\"py-12 sm:py-16 md:py-20 lg:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"grid sm:grid-cols-1 lg:grid-cols-3 gap-8 sm:gap-10 lg:gap-12\">\n {/* Contact Information */}\n <div className=\"lg:col-span-1 order-2 lg:order-1\">\n <h2 className=\"text-xl sm:text-2xl font-bold mb-4 sm:mb-6\">\n Contact Information\n </h2>\n\n <div className=\"space-y-4 sm:space-y-6\">\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Mail className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Email\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base break-all\">\n {contactEmail}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Phone className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Phone\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base\">\n {contactPhone}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <MapPin className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Office\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base leading-relaxed\">\n {officeAddress.line1}\n <br />\n {officeAddress.line2}\n <br />\n {officeAddress.line3}\n <br />\n {officeAddress.country}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Clock className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Response Time\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base\">\n {responseTime}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Contact Form */}\n <div className=\"lg:col-span-2 order-1 lg:order-2\">\n <div className=\"bg-card border rounded-lg p-4 sm:p-6 md:p-8\">\n <h2 className=\"text-xl sm:text-2xl font-bold mb-4 sm:mb-6\">\n Send us a Message\n </h2>\n\n <form\n onSubmit={handleSubmit}\n className=\"space-y-4 sm:space-y-6\"\n >\n <div className=\"grid sm:grid-cols-2 gap-4 sm:gap-6\">\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"firstName\"\n className=\"text-sm sm:text-base\"\n >\n First Name *\n </Label>\n <Input\n id=\"firstName\"\n name=\"firstName\"\n required\n placeholder=\"John\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"lastName\"\n className=\"text-sm sm:text-base\"\n >\n Last Name *\n </Label>\n <Input\n id=\"lastName\"\n name=\"lastName\"\n required\n placeholder=\"Doe\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\" className=\"text-sm sm:text-base\">\n Email *\n </Label>\n <Input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n required\n placeholder=\"john@company.com\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"company\" className=\"text-sm sm:text-base\">\n Company\n </Label>\n <Input\n id=\"company\"\n name=\"company\"\n placeholder=\"Acme Inc.\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"subject\" className=\"text-sm sm:text-base\">\n Subject *\n </Label>\n <Input\n id=\"subject\"\n name=\"subject\"\n required\n placeholder=\"How can we help you?\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"message\" className=\"text-sm sm:text-base\">\n Message *\n </Label>\n <Textarea\n id=\"message\"\n name=\"message\"\n required\n placeholder=\"Tell us more about your needs...\"\n rows={5}\n className=\"text-sm sm:text-base min-h-[120px] sm:min-h-[150px] resize-y\"\n />\n </div>\n\n <div className=\"space-y-4\">\n {effectiveRecaptchaSiteKey && (\n <div className=\"flex justify-center sm:justify-start\">\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n </div>\n )}\n\n <Button\n type=\"submit\"\n size=\"lg\"\n disabled={isSubmitting}\n className=\"w-full sm:w-auto min-w-[200px]\"\n >\n {isSubmitting ? (\n \"Sending...\"\n ) : (\n <>\n Send Message <Send className=\"ml-2 h-4 w-4\" />\n </>\n )}\n </Button>\n </div>\n\n {submitStatus === \"success\" && (\n <div className=\"p-3 sm:p-4 bg-green-50 border border-green-200 rounded-lg text-green-800 mt-4\">\n <p className=\"font-medium text-sm sm:text-base\">\n Message sent successfully!\n </p>\n <p className=\"text-xs sm:text-sm mt-1\">\n Thank you for contacting {displayName}. We'll get\n back to you within 24 hours.\n </p>\n </div>\n )}\n\n {submitStatus === \"error\" && (\n <div className=\"p-3 sm:p-4 bg-red-50 border border-red-200 rounded-lg text-red-800 mt-4\">\n <p className=\"font-medium text-sm sm:text-base\">\n Failed to send message\n </p>\n <p className=\"text-xs sm:text-sm mt-1\">\n Please try again later or contact us directly at{\" \"}\n {contactEmail}\n </p>\n </div>\n )}\n </form>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Additional Contact Options */}\n <section className=\"py-12 sm:py-16 md:py-20 lg:py-24 bg-muted/30\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <h2 className=\"text-2xl sm:text-3xl font-bold text-center mb-8 sm:mb-12\">\n More Ways to Connect\n </h2>\n\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8 max-w-5xl mx-auto\">\n {additionalOptions.map((option, index) => (\n <div\n key={index}\n className=\"text-center p-4 sm:p-6 bg-card border rounded-lg\"\n >\n <h3 className=\"font-semibold text-base sm:text-lg mb-2\">\n {option.title}\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base mb-4 leading-relaxed\">\n {replacePlaceholders(\n option.description,\n displayName,\n contactEmail,\n )}\n </p>\n <Button\n variant=\"outline\"\n asChild\n className=\"text-sm sm:text-base\"\n >\n <a href={option.buttonLink}>{option.buttonText}</a>\n </Button>\n </div>\n ))}\n </div>\n </div>\n </section>\n </div>\n );\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 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\nconst PUBLIC_PRODUCT_QUERY = `\n query PublicProduct($slug: String!) {\n publicProduct(slug: $slug) {\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\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 const result = await client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY,\n { slug: config.productSlug },\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 * Newsletter Component\n * Reusable newsletter subscription component with email validation and rate limiting.\n * Uses GraphQL mutations via the WebSDKClient provider.\n *\n * @example\n * ```tsx\n * import { NewsletterPage } from '@burdenoff/website-sdk/components/newsletter'\n *\n * function Newsletter() {\n * return (\n * <NewsletterPage\n * productName=\"BigConsole\"\n * layout=\"centered\"\n * seoTitle=\"Subscribe to Newsletter\"\n * seoDescription=\"Stay updated with our latest news\"\n * seoKeywords=\"newsletter, updates, news\"\n * />\n * )\n * }\n * ```\n */\n\n\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport ReCAPTCHA from \"react-google-recaptcha\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct, useProductConfig } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\n/**\n * Newsletter page component configuration props\n */\nexport interface NewsletterPageProps {\n /**\n * Product name (used in title and branding).\n * Falls back to SDK config productId if not provided.\n */\n productName?: string;\n /**\n * Layout variant\n * @default 'centered'\n */\n layout?: \"centered\" | \"split\";\n /**\n * Rate limit attempts\n * @default 3\n */\n rateLimitAttempts?: number;\n /**\n * Rate limit window in minutes\n * @default 15\n */\n rateLimitWindowMinutes?: number;\n /**\n * Hero section heading\n * @default 'Stay Updated'\n */\n heroHeading?: string;\n /**\n * Hero section subtitle\n * @default 'Subscribe to our newsletter'\n */\n heroSubtitle?: string;\n /**\n * Hero section description\n */\n heroDescription?: string;\n /**\n * Features to display (for split layout)\n */\n features?: Array<{\n icon: React.ReactNode;\n title: string;\n description: string;\n }>;\n /**\n * Success message after subscription\n * @default 'Successfully subscribed to newsletter!'\n */\n successMessage?: string;\n /**\n * Error message on failure\n * @default 'Failed to subscribe. Please try again.'\n */\n errorMessage?: string;\n /**\n * Rate limit error message\n */\n rateLimitMessage?: string;\n /**\n * Custom CSS class for container\n */\n className?: string;\n /**\n * SEO: Page title (optional, for SEO meta tags)\n */\n seoTitle?: string;\n /**\n * SEO: Page description (optional, for SEO meta tags)\n */\n seoDescription?: string;\n /**\n * SEO: Keywords (optional, for SEO meta tags)\n */\n seoKeywords?: string;\n /**\n * SEO: OG Image URL (optional, for SEO meta tags)\n */\n seoImage?: string;\n /**\n * SEO: Canonical URL (optional, for SEO meta tags)\n */\n seoUrl?: string;\n /**\n * reCAPTCHA site key (optional, falls back to SDK config)\n */\n recaptchaSiteKey?: string;\n}\n\ninterface RateLimitState {\n attempts: number;\n resetTime: number;\n}\n\n// ============================================================================\n// VALIDATION SCHEMA\n// ============================================================================\n\nconst newsletterSchema = z.object({\n email: z.string().email(\"Please enter a valid email address\"),\n});\n\ntype NewsletterFormData = z.infer<typeof newsletterSchema>;\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst SUBSCRIBE_MUTATION = /* GraphQL */ `\n mutation Subscribe($input: SubscribeInput!) {\n subscribe(input: $input) {\n id\n email\n alreadySubscribed\n status\n subscribedAt\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function subscribeNewsletter(\n client: WebSDKClient,\n email: string,\n productId: string,\n recaptchaToken?: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n subscribe: {\n id: string;\n email: string;\n status: string;\n alreadySubscribed?: boolean;\n };\n }>(SUBSCRIBE_MUTATION, {\n input: {\n email: email.trim().toLowerCase(),\n platformProductId: productId,\n metadata: {\n source: \"website\",\n referrer: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n ...(recaptchaToken ? { recaptchaToken } : {}),\n },\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Subscription failed\";\n const code = (result.errors[0] as { extensions?: { code?: string } })\n ?.extensions?.code;\n if (\n code === \"DUPLICATE_SUBSCRIBER\" ||\n errorMsg.toLowerCase().includes(\"already subscribed\")\n ) {\n return {\n success: true,\n message: \"You are already part of this newsletter.\",\n };\n }\n return { success: false, message: errorMsg };\n }\n\n if (result.data?.subscribe?.alreadySubscribed) {\n return {\n success: true,\n message: \"You are already part of this newsletter.\",\n };\n }\n\n return { success: true };\n } catch (error) {\n console.error(\"Newsletter subscription error:\", error);\n return { success: false, message: \"Network error. Please try again.\" };\n }\n}\n\n// ============================================================================\n// RATE LIMITING (in-memory for SSR compatibility)\n// ============================================================================\n\nfunction useRateLimit(maxAttempts: number, windowMinutes: number) {\n const rateLimitRef = useRef<RateLimitState | null>(null);\n const [isLimited, setIsLimited] = useState(false);\n const [resetTime, setResetTime] = useState<Date | null>(null);\n\n useEffect(() => {\n // Check if existing rate limit has expired on mount\n const state = rateLimitRef.current;\n if (state && Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n } else if (state && state.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(state.resetTime));\n }\n }, [maxAttempts]);\n\n function recordAttempt(): boolean {\n const now = Date.now();\n const state = rateLimitRef.current;\n\n // Reset if window expired\n if (state && now > state.resetTime) {\n rateLimitRef.current = null;\n }\n\n const current = rateLimitRef.current;\n\n if (!current) {\n rateLimitRef.current = {\n attempts: 1,\n resetTime: now + windowMinutes * 60 * 1000,\n };\n return false;\n }\n\n current.attempts += 1;\n\n if (current.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(current.resetTime));\n return true;\n }\n\n return false;\n }\n\n function checkLimit(): boolean {\n const state = rateLimitRef.current;\n if (!state) return false;\n if (Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n return false;\n }\n return state.attempts >= maxAttempts;\n }\n\n return { isLimited, resetTime, recordAttempt, checkLimit };\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function NewsletterPage({\n productName,\n layout = \"centered\",\n rateLimitAttempts = 3,\n rateLimitWindowMinutes = 15,\n heroHeading = \"Stay Updated\",\n heroSubtitle = \"Subscribe to our newsletter\",\n heroDescription,\n features,\n successMessage = \"Successfully subscribed to newsletter!\",\n errorMessage = \"Failed to subscribe. Please try again.\",\n rateLimitMessage,\n className,\n seoTitle,\n seoDescription,\n seoKeywords,\n seoImage,\n seoUrl,\n recaptchaSiteKey,\n}: NewsletterPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const productConfig = useProductConfig();\n const effectiveProductId = product?.id || config.productId;\n const displayName = productName ?? product?.name ?? config.productId;\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ??\n productConfig.recaptchaSiteKey ??\n config.recaptchaSiteKey ??\n \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isLimited, resetTime, recordAttempt, checkLimit } = useRateLimit(\n rateLimitAttempts,\n rateLimitWindowMinutes,\n );\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n reset,\n } = useForm<NewsletterFormData>({\n resolver: zodResolver(newsletterSchema),\n });\n\n const onSubmit = async (data: NewsletterFormData) => {\n // Check reCAPTCHA\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n // Check rate limit\n if (checkLimit()) {\n toast.error(\n rateLimitMessage ??\n `Too many attempts. Please try again after ${resetTime?.toLocaleTimeString()}`,\n );\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const result = await subscribeNewsletter(\n client,\n data.email,\n effectiveProductId,\n recaptchaToken || undefined,\n );\n\n if (result.success) {\n if (result.message) {\n toast.info(result.message);\n } else {\n toast.success(successMessage);\n }\n reset();\n } else {\n toast.error(result.message ?? errorMessage);\n }\n\n // Record the attempt for rate limiting\n recordAttempt();\n recaptchaRef.current?.reset();\n } catch (_error) {\n toast.error(errorMessage);\n recaptchaRef.current?.reset();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const defaultFeatures = [\n {\n icon: (\n <svg\n className=\"h-6 w-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n ),\n title: \"Latest Updates\",\n description: \"Get the latest news and updates delivered to your inbox\",\n },\n {\n icon: (\n <svg\n className=\"h-6 w-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4\"\n />\n </svg>\n ),\n title: \"Exclusive Content\",\n description:\n \"Access exclusive content and insights not available elsewhere\",\n },\n {\n icon: (\n <svg\n className=\"h-6 w-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\"\n />\n </svg>\n ),\n title: \"Early Access\",\n description:\n \"Be the first to know about new features and product launches\",\n },\n ];\n\n const displayFeatures = features ?? defaultFeatures;\n\n return (\n <>\n {/* SEO Meta Tags */}\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription ?? heroDescription ?? heroSubtitle}\n productName={displayName}\n keywords={seoKeywords}\n image={seoImage}\n url={seoUrl}\n />\n )}\n\n <div className={className}>\n {layout === \"centered\" ? (\n // Centered Layout\n <div className=\"min-h-screen flex items-center justify-center px-4 py-12\">\n <div className=\"max-w-md w-full space-y-8\">\n {/* Header */}\n <div className=\"text-center\">\n <h1 className=\"text-4xl font-bold tracking-tight\">\n {heroHeading}\n </h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">Email address</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n {effectiveRecaptchaSiteKey && (\n <div className=\"flex justify-center\">\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n </div>\n )}\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Subscribing...\" : \"Subscribe\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground text-center\">\n By subscribing, you agree to receive emails from {displayName}.\n You can unsubscribe at any time.\n </p>\n </div>\n </div>\n ) : (\n // Split Layout\n <div className=\"min-h-screen grid lg:grid-cols-2\">\n {/* Left Column - Form */}\n <div className=\"flex items-center justify-center px-4 py-12 sm:px-6 lg:px-8\">\n <div className=\"max-w-md w-full space-y-8\">\n {/* Header */}\n <div>\n <h1 className=\"text-4xl font-bold tracking-tight\">\n {heroHeading}\n </h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">Email address</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n {effectiveRecaptchaSiteKey && (\n <div className=\"flex justify-center sm:justify-start\">\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n </div>\n )}\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Subscribing...\" : \"Subscribe\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground\">\n By subscribing, you agree to receive emails from {displayName}\n . You can unsubscribe at any time.\n </p>\n </div>\n </div>\n\n {/* Right Column - Features */}\n <div className=\"hidden lg:flex items-center justify-center bg-muted px-4 py-12 sm:px-6 lg:px-8\">\n <div className=\"max-w-md space-y-8\">\n <h2 className=\"text-2xl font-bold\">Why Subscribe?</h2>\n <div className=\"space-y-6\">\n {displayFeatures.map((feature, index) => (\n <div key={index} className=\"flex gap-4\">\n <div className=\"flex-shrink-0 text-primary\">\n {feature.icon}\n </div>\n <div>\n <h3 className=\"font-semibold\">{feature.title}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {feature.description}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n\n// ============================================================================\n// NEWSLETTER FORM (Inline Component)\n// ============================================================================\n\nexport interface NewsletterFormProps {\n /**\n * Layout variant\n * @default 'inline'\n */\n variant?: \"inline\" | \"stacked\";\n /**\n * Show email label\n * @default false\n */\n showLabel?: boolean;\n /**\n * Show description text\n * @default false\n */\n showDescription?: boolean;\n /**\n * Description text\n * @default 'Subscribe to our newsletter for updates'\n */\n description?: string;\n /**\n * Button text\n * @default 'Subscribe'\n */\n buttonText?: string;\n /**\n * Custom CSS class\n */\n className?: string;\n /**\n * reCAPTCHA site key (optional, falls back to SDK config)\n */\n recaptchaSiteKey?: string;\n}\n\n/**\n * Lightweight newsletter subscription form for inline use (e.g., footers)\n */\nexport function NewsletterForm({\n variant = \"inline\",\n showLabel = false,\n showDescription = false,\n description = \"Subscribe to our newsletter for updates\",\n buttonText = \"Subscribe\",\n className = \"\",\n recaptchaSiteKey,\n}: NewsletterFormProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const productConfig = useProductConfig();\n const effectiveProductId = product?.id || config.productId;\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ??\n productConfig.recaptchaSiteKey ??\n config.recaptchaSiteKey ??\n \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [email, setEmail] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!email || !email.includes(\"@\")) {\n toast.error(\"Please enter a valid email address\");\n return;\n }\n\n // Check reCAPTCHA\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await subscribeNewsletter(\n client,\n email,\n effectiveProductId,\n recaptchaToken || undefined,\n );\n\n if (result.success) {\n if (result.message) {\n toast.info(result.message);\n } else {\n toast.success(\"Successfully subscribed!\");\n }\n setEmail(\"\");\n } else {\n toast.error(result.message ?? \"Subscription failed\");\n }\n recaptchaRef.current?.reset();\n } catch (_error) {\n toast.error(\"An error occurred. Please try again.\");\n recaptchaRef.current?.reset();\n } finally {\n setIsLoading(false);\n }\n };\n\n const isInline = variant === \"inline\";\n\n return (\n <div className={className} style={{ overflow: \"visible\" }}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <form\n onSubmit={handleSubmit}\n className={isInline ? \"flex flex-col gap-2\" : \"flex flex-col gap-2\"}\n style={{ overflow: \"visible\" }}\n >\n <div\n className={\n isInline && !effectiveRecaptchaSiteKey\n ? \"flex gap-2\"\n : \"flex flex-col gap-2\"\n }\n >\n <div\n className={\n isInline && !effectiveRecaptchaSiteKey ? \"flex-1\" : \"w-full\"\n }\n >\n {showLabel && (\n <Label htmlFor=\"newsletter-email\" className=\"text-sm mb-1 block\">\n Email\n </Label>\n )}\n <Input\n id=\"newsletter-email\"\n type=\"email\"\n placeholder=\"Enter your email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n disabled={isLoading}\n required\n className=\"w-full\"\n />\n </div>\n {!effectiveRecaptchaSiteKey && (\n <Button\n type=\"submit\"\n disabled={isLoading}\n className={isInline ? \"whitespace-nowrap\" : \"w-full\"}\n >\n {isLoading ? \"Subscribing...\" : buttonText}\n </Button>\n )}\n </div>\n {effectiveRecaptchaSiteKey && (\n <>\n <style>{`\n body > div[style*=\"position: absolute\"] > div > iframe[title*=\"recaptcha challenge\"],\n body > div:not([class]):not([id]) > div > iframe[title*=\"recaptcha\"] {\n position: fixed !important;\n top: 50% !important;\n left: 50% !important;\n transform: translate(-50%, -50%) !important;\n z-index: 99999 !important;\n }\n body > div[style*=\"position: absolute\"]:has(iframe[title*=\"recaptcha challenge\"]) {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n width: 100vw !important;\n height: 100vh !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n z-index: 99999 !important;\n background: rgba(0,0,0,0.3) !important;\n }\n `}</style>\n <div style={{ position: \"relative\", zIndex: 50 }}>\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n size=\"compact\"\n />\n </div>\n </>\n )}\n {effectiveRecaptchaSiteKey && (\n <Button type=\"submit\" disabled={isLoading} className=\"w-full\">\n {isLoading ? \"Subscribing...\" : buttonText}\n </Button>\n )}\n </form>\n </div>\n );\n}\n","/**\n * Pricing Component\n * GraphQL-powered pricing component with quota-based features and monthly/yearly toggle\n *\n * @example\n * ```tsx\n * import { PricingPage, PricingSection } from '@burdenoff/website-sdk/components/pricing'\n *\n * // Full page with hero\n * <PricingPage\n * productName=\"BigConsole\"\n * productId=\"bigconsole-123\"\n * appLoginUrl=\"https://app.bigconsole.com/login\"\n * contactUrl=\"/contact\"\n * fallbackFeatures={{\n * basic: ['Up to 5 dashboards', '10 data sources'],\n * professional: ['Unlimited dashboards', 'API access'],\n * enterprise: ['Everything in Professional', 'Dedicated support']\n * }}\n * />\n *\n * // Embeddable section\n * <PricingSection {...props} id=\"pricing\" className=\"bg-muted/30\" />\n * ```\n */\n\n\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\n\n// ============================================================================\n// GRAPHQL QUERY\n// ============================================================================\n\nconst GET_ALL_PLANS_QUERY = `\n query GetAllPlans {\n getAllPlans {\n id\n name\n price\n currency\n currencyPrices\n duration\n features {\n id\n quotaId\n quota {\n id\n name\n limits\n }\n }\n isActive\n productID\n createdAt\n }\n }\n`;\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\ninterface PlanFeature {\n id: string;\n quotaId?: string | null;\n quota?: {\n id: string;\n name: string;\n limits?: unknown;\n } | null;\n}\n\ninterface GatewayPlan {\n id: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number> | null;\n duration: string;\n features: PlanFeature[];\n isActive: boolean;\n productID?: string | null;\n createdAt: string;\n}\n\ninterface GetAllPlansResponse {\n getAllPlans: GatewayPlan[];\n}\n\nexport interface PlanCard {\n id: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number> | null;\n duration: string;\n features: Array<{\n id: string;\n quotaId?: string | null;\n quota?: {\n id: string;\n name: string;\n limits?: unknown;\n } | null;\n }>;\n isActive: boolean;\n productID?: string | null;\n}\n\ninterface CurrencyConfig {\n code: string;\n symbol: string;\n position: \"prefix\" | \"suffix\";\n}\n\ninterface PlanMetadata {\n tier: \"basic\" | \"professional\" | \"enterprise\";\n displayName: string;\n defaultDescription: string;\n popular: boolean;\n ctaText: string;\n ctaType: \"signup\" | \"contact\";\n}\n\nexport interface PricingProps {\n /**\n * Product name (used in branding and SEO)\n */\n productName?: string;\n /**\n * Product ID for GraphQL query (falls back to WebSDKConfig.productId)\n */\n productId?: string;\n /**\n * App login URL for signup CTA\n */\n appLoginUrl: string;\n /**\n * Contact page URL for enterprise CTA\n * @default '/contact'\n */\n contactUrl?: string;\n /**\n * Supported currencies\n */\n currencies?: Record<string, CurrencyConfig>;\n /**\n * Billing interval display text\n */\n billingIntervals?: Record<string, string>;\n /**\n * Plan metadata (tier info, CTA text, etc.)\n */\n planMetadata?: Record<string, Partial<PlanMetadata>>;\n /**\n * Fallback features when API doesn't provide them or is unavailable\n */\n fallbackFeatures?: {\n basic?: string[];\n professional?: string[];\n enterprise?: string[];\n };\n /**\n * Hero section heading (for PricingPage)\n * @default 'Simple, Transparent Pricing'\n */\n heroHeading?: string;\n /**\n * Hero section subtitle (for PricingPage)\n * @default \"Choose the plan that's right for you. No hidden fees, no surprises.\"\n */\n heroSubtitle?: string;\n /**\n * Section heading (for PricingSection)\n * @default 'Pricing Plans'\n */\n sectionHeading?: string;\n /**\n * Section subtitle (for PricingSection)\n * @default 'Choose the perfect plan for your needs'\n */\n sectionSubtitle?: string;\n /**\n * Custom CSS class\n */\n className?: string;\n /**\n * Section ID for anchor links\n */\n id?: string;\n /**\n * SEO: Page title (optional, for PricingPage)\n */\n seoTitle?: string;\n /**\n * SEO: Page description (optional, for PricingPage)\n */\n seoDescription?: string;\n /**\n * SEO: Keywords (optional, for PricingPage)\n */\n seoKeywords?: string;\n /**\n * SEO: OG Image URL (optional, for PricingPage)\n */\n seoImage?: string;\n /**\n * SEO: Canonical URL (optional, for PricingPage)\n */\n seoUrl?: string;\n}\n\n// ============================================================================\n// SERVICE FUNCTIONS\n// ============================================================================\n\n/**\n * Format price for display with currency symbol\n */\nfunction formatPrice(\n price: number,\n currencyCode: string = \"USD\",\n currencies?: Record<string, CurrencyConfig>,\n): string {\n const defaultCurrencies: Record<string, CurrencyConfig> = {\n USD: { code: \"USD\", symbol: \"$\", position: \"prefix\" },\n EUR: { code: \"EUR\", symbol: \"\\u20AC\", position: \"prefix\" },\n GBP: { code: \"GBP\", symbol: \"\\u00A3\", position: \"prefix\" },\n INR: { code: \"INR\", symbol: \"\\u20B9\", position: \"prefix\" },\n };\n\n const currencyMap = currencies || defaultCurrencies;\n const currency: CurrencyConfig = currencyMap[currencyCode] || {\n code: currencyCode,\n symbol: currencyCode,\n position: \"prefix\",\n };\n\n const formattedNumber = price % 1 === 0 ? price.toString() : price.toFixed(2);\n\n return currency.position === \"prefix\"\n ? `${currency.symbol}${formattedNumber}`\n : `${formattedNumber}${currency.symbol}`;\n}\n\n/**\n * Format billing interval for display\n */\nfunction formatInterval(\n duration: string,\n billingIntervals?: Record<string, string>,\n): string {\n const defaultIntervals: Record<string, string> = {\n monthly: \"/month\",\n yearly: \"/year\",\n };\n\n const intervals = billingIntervals || defaultIntervals;\n return intervals[duration] || `/${duration}`;\n}\n\n/**\n * Detect plan tier from plan name\n */\nfunction detectPlanTier(\n planName: string,\n): \"basic\" | \"professional\" | \"enterprise\" | null {\n const name = planName.toLowerCase();\n\n if (name.includes(\"basic\") || name.includes(\"starter\")) {\n return \"basic\";\n } else if (\n name.includes(\"pro\") ||\n name.includes(\"professional\") ||\n name.includes(\"premium\")\n ) {\n return \"professional\";\n } else if (name.includes(\"enterprise\") || name.includes(\"business\")) {\n return \"enterprise\";\n }\n\n return null;\n}\n\n/**\n * Get features for a specific plan tier from fallback config\n */\nfunction getFallbackFeaturesForTier(\n tier: \"basic\" | \"professional\" | \"enterprise\",\n fallbackFeatures?: {\n basic?: string[];\n professional?: string[];\n enterprise?: string[];\n },\n): string[] {\n return [...(fallbackFeatures?.[tier] || [])];\n}\n\n/**\n * Get metadata for a plan by name\n */\nfunction getMetadataForPlan(\n planName: string,\n planMetadata?: Record<string, Partial<PlanMetadata>>,\n): PlanMetadata {\n const normalizedName = planName.toLowerCase();\n\n // Try exact match first\n if (planMetadata?.[normalizedName]) {\n const meta = planMetadata[normalizedName];\n return {\n tier: meta.tier || \"basic\",\n displayName: meta.displayName || planName,\n defaultDescription: meta.defaultDescription || \"Choose this plan\",\n popular: meta.popular ?? false,\n ctaText: meta.ctaText || \"Get Started\",\n ctaType: meta.ctaType || \"signup\",\n };\n }\n\n // Try tier detection\n const tier = detectPlanTier(planName);\n if (tier) {\n return {\n tier,\n displayName: planName,\n defaultDescription: \"Choose this plan\",\n popular: tier === \"professional\",\n ctaText: tier === \"enterprise\" ? \"Contact Sales\" : \"Get Started\",\n ctaType: tier === \"enterprise\" ? \"contact\" : \"signup\",\n };\n }\n\n // Fallback\n return {\n tier: \"basic\",\n displayName: planName,\n defaultDescription: \"Choose this plan\",\n popular: false,\n ctaText: \"Get Started\",\n ctaType: \"signup\",\n };\n}\n\n/**\n * Transform quota limits to a human-readable feature string\n */\nfunction transformQuotaToFeature(quota: {\n id: string;\n name: string;\n limits?: unknown;\n}): string {\n const { name, limits } = quota;\n\n if (!limits || typeof limits !== \"object\") {\n return name;\n }\n\n const limitsObj = limits as Record<string, unknown>;\n const value = limitsObj.value;\n const unit = limitsObj.unit;\n const type = limitsObj.type;\n const description = limitsObj.description;\n\n if (type === \"number\" && typeof value === \"number\") {\n const formattedValue = value.toLocaleString();\n return `${formattedValue} ${unit || \"\"}${description ? \" - \" + description : \"\"}`.trim();\n } else if (type === \"boolean\") {\n return (typeof description === \"string\" && description) || name;\n }\n\n if (typeof value === \"number\") {\n const formattedValue = value.toLocaleString();\n return `${name}: ${formattedValue} ${unit || \"\"}`.trim();\n }\n\n return name;\n}\n\n/**\n * Extract display features from a plan's feature list\n */\nfunction extractDisplayFeatures(\n features: PlanFeature[],\n planName: string,\n fallbackFeatures?: {\n basic?: string[];\n professional?: string[];\n enterprise?: string[];\n },\n): string[] {\n // If API provides features with quotas, transform them\n const quotaFeatures = features\n .filter((f) => f.quota)\n .map((f) => transformQuotaToFeature(f.quota!));\n\n if (quotaFeatures.length > 0) {\n return quotaFeatures;\n }\n\n // Fall back to tier-based features\n const tier = detectPlanTier(planName);\n if (tier) {\n return getFallbackFeaturesForTier(tier, fallbackFeatures);\n }\n\n return [];\n}\n\n// ============================================================================\n// UI CARD TYPE (internal)\n// ============================================================================\n\ninterface DisplayPlanCard {\n id: string;\n name: string;\n description: string;\n price: string;\n priceRaw: number;\n interval: string;\n duration: string;\n features: string[];\n popular: boolean;\n ctaText: string;\n ctaLink: string;\n tier: \"basic\" | \"professional\" | \"enterprise\" | null;\n}\n\n/**\n * Transform a GatewayPlan into a display card\n */\nfunction transformToDisplayCard(\n plan: GatewayPlan,\n props: PricingProps,\n): DisplayPlanCard {\n const metadata = getMetadataForPlan(plan.name, props.planMetadata);\n\n const formattedPrice = formatPrice(\n plan.price,\n plan.currency,\n props.currencies,\n );\n const interval = formatInterval(plan.duration, props.billingIntervals);\n\n const features = extractDisplayFeatures(\n plan.features,\n plan.name,\n props.fallbackFeatures,\n );\n\n const contactUrl = props.contactUrl || \"/contact\";\n const ctaLink =\n metadata.ctaType === \"contact\" ? contactUrl : props.appLoginUrl;\n\n return {\n id: plan.id,\n name: plan.name,\n description: metadata.defaultDescription,\n price: formattedPrice,\n priceRaw: plan.price,\n interval,\n duration: plan.duration,\n features,\n popular: metadata.popular,\n ctaText: metadata.ctaText,\n ctaLink,\n tier: metadata.tier,\n };\n}\n\n// ============================================================================\n// REACT COMPONENTS\n// ============================================================================\n\n/**\n * Pricing Section Component - Embeddable\n */\nexport function PricingSection(props: PricingProps) {\n const {\n sectionHeading = \"Pricing Plans\",\n sectionSubtitle = \"Choose the perfect plan for your needs\",\n id,\n className = \"\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n\n const resolvedProductId = props.productId || config.productId;\n\n const [allPlans, setAllPlans] = useState<DisplayPlanCard[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [billingCycle, setBillingCycle] = useState<\"monthly\" | \"yearly\">(\n \"monthly\",\n );\n\n useEffect(() => {\n let cancelled = false;\n\n async function loadPlans() {\n try {\n setLoading(true);\n\n const response =\n await client.query<GetAllPlansResponse>(GET_ALL_PLANS_QUERY);\n\n if (cancelled) return;\n\n if (response.errors && response.errors.length > 0) {\n throw new Error(response.errors[0]!.message);\n }\n\n if (!response.data?.getAllPlans) {\n throw new Error(\"No plans data received\");\n }\n\n // Filter active plans by productID (client-side), transform to display cards, sort by price\n const cards = response.data.getAllPlans\n .filter(\n (plan) =>\n plan.isActive &&\n (!resolvedProductId || plan.productID === resolvedProductId),\n )\n .map((plan) => transformToDisplayCard(plan, props))\n .sort((a, b) => a.priceRaw - b.priceRaw);\n\n setAllPlans(cards);\n setError(null);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Failed to load plans:\", err);\n setError(\"Unable to load pricing information. Please try again later.\");\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n loadPlans();\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- props is destructured, actual deps are client + productId\n }, [client, resolvedProductId]);\n\n // Filter plans based on selected billing cycle\n const plans = allPlans.filter((plan) =>\n billingCycle === \"monthly\"\n ? plan.duration === \"monthly\"\n : plan.duration === \"yearly\",\n );\n\n if (loading) {\n return (\n <section id={id} className={`py-12 sm:py-16 md:py-20 ${className}`}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"text-center mb-8 sm:mb-12\">\n <h2 className=\"text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4\">\n {sectionHeading}\n </h2>\n <p className=\"text-muted-foreground text-sm sm:text-base md:text-lg\">\n Loading pricing information...\n </p>\n </div>\n <div className=\"grid md:grid-cols-3 gap-6 sm:gap-8\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-lg p-6 animate-pulse\"\n >\n <div className=\"h-6 bg-muted rounded w-1/2 mb-4\"></div>\n <div className=\"h-4 bg-muted rounded w-3/4 mb-6\"></div>\n <div className=\"h-10 bg-muted rounded w-1/3 mb-6\"></div>\n <div className=\"space-y-3 mb-6\">\n {[1, 2, 3, 4].map((j) => (\n <div key={j} className=\"h-4 bg-muted rounded\"></div>\n ))}\n </div>\n <div className=\"h-10 bg-muted rounded\"></div>\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n }\n\n if (error && plans.length === 0) {\n return (\n <section id={id} className={`py-12 sm:py-16 md:py-20 ${className}`}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl sm:text-3xl md:text-4xl font-bold mb-4\">\n {sectionHeading}\n </h2>\n <p className=\"text-muted-foreground mb-8\">{error}</p>\n <Button onClick={() => window.location.reload()}>Retry</Button>\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <section id={id} className={`py-12 sm:py-16 md:py-20 ${className}`}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"text-center mb-8 sm:mb-12\">\n <h2 className=\"text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4\">\n {sectionHeading}\n </h2>\n <p className=\"text-muted-foreground text-sm sm:text-base md:text-lg mb-6\">\n {sectionSubtitle}\n </p>\n\n {/* Billing Cycle Toggle */}\n <div className=\"inline-flex items-center gap-3 bg-muted p-1.5 rounded-lg\">\n <button\n onClick={() => setBillingCycle(\"monthly\")}\n className={`px-6 py-2 rounded-md text-sm font-medium transition-all ${\n billingCycle === \"monthly\"\n ? \"bg-background shadow-sm text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Monthly\n </button>\n <button\n onClick={() => setBillingCycle(\"yearly\")}\n className={`px-6 py-2 rounded-md text-sm font-medium transition-all ${\n billingCycle === \"yearly\"\n ? \"bg-background shadow-sm text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Yearly\n </button>\n </div>\n </div>\n\n <div className=\"grid md:grid-cols-3 gap-6 sm:gap-8 max-w-6xl mx-auto items-stretch\">\n {plans.map((plan) => (\n <div\n key={plan.id}\n className={`bg-card rounded-xl p-6 sm:p-8 transition-all duration-300 flex flex-col ${\n plan.popular\n ? \"border-2 border-primary shadow-xl ring-1 ring-primary/20\"\n : \"border hover:shadow-lg hover:border-primary/50\"\n }`}\n >\n <div className=\"text-center mb-6\">\n {plan.popular && (\n <span className=\"inline-block bg-primary text-primary-foreground px-4 py-1 rounded-full text-xs font-semibold mb-3\">\n Most Popular\n </span>\n )}\n <h3 className=\"text-xl sm:text-2xl font-bold mb-2\">\n {plan.name}\n </h3>\n <p className=\"text-muted-foreground text-sm\">\n {plan.description}\n </p>\n </div>\n\n <div className=\"text-center mb-8\">\n <div className=\"flex items-baseline justify-center gap-1\">\n <span className=\"text-4xl sm:text-5xl font-bold\">\n {plan.price}\n </span>\n <span className=\"text-muted-foreground text-lg\">\n {plan.interval}\n </span>\n </div>\n </div>\n\n <ul className=\"space-y-3 mb-8 flex-1\">\n {plan.features.map((feature, index) => (\n <li key={index} className=\"text-sm flex items-start gap-2\">\n <span className=\"text-primary mt-0.5 flex-shrink-0\">\n ✓\n </span>\n <span>{feature}</span>\n </li>\n ))}\n </ul>\n\n {plan.ctaLink.startsWith(\"/\") ? (\n <Button\n className=\"w-full h-11\"\n variant={plan.popular ? \"default\" : \"outline\"}\n size=\"lg\"\n asChild\n >\n <a\n href={plan.ctaLink}\n onClick={() =>\n window.scrollTo({ top: 0, behavior: \"smooth\" })\n }\n >\n {plan.ctaText}\n </a>\n </Button>\n ) : (\n <Button\n className=\"w-full h-11\"\n variant={plan.popular ? \"default\" : \"outline\"}\n size=\"lg\"\n asChild\n >\n <a\n href={plan.ctaLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {plan.ctaText}\n </a>\n </Button>\n )}\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n}\n\n/**\n * Pricing Page Component - Full Page with Hero\n */\nexport function PricingPage(props: PricingProps) {\n const {\n productName,\n heroHeading = \"Simple, Transparent Pricing\",\n heroSubtitle = \"Choose the plan that's right for you. No hidden fees, no surprises.\",\n seoTitle,\n seoDescription,\n seoKeywords,\n seoImage,\n seoUrl,\n } = props;\n\n return (\n <div className=\"w-full\">\n {/* SEO Meta Tags */}\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n image={seoImage}\n url={seoUrl}\n />\n )}\n\n {/* Hero Section */}\n <section className=\"bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6\">\n {heroHeading}\n </h1>\n <p className=\"text-lg sm:text-xl text-muted-foreground leading-relaxed\">\n {heroSubtitle}\n </p>\n </div>\n </div>\n </section>\n\n {/* Pricing Section */}\n <PricingSection {...props} />\n </div>\n );\n}\n","/**\n * Waitlist Components\n * Full-page and inline waitlist signup forms using GraphQL via WebSDKClient.\n *\n * @example\n * ```tsx\n * // Full-page waitlist\n * import { WaitlistPage } from '@burdenoff/website-sdk/components/waitlist'\n *\n * <WaitlistPage\n * productName=\"BigConsole\"\n * heroTitle=\"Join the Waitlist\"\n * heroSubtitle=\"Be among the first to try BigConsole\"\n * />\n *\n * // Inline waitlist form (for hero sections / footers)\n * import { WaitlistForm } from '@burdenoff/website-sdk/components/waitlist'\n *\n * <WaitlistForm variant=\"inline\" buttonText=\"Join Waitlist\" />\n * ```\n */\n\n\"use client\";\n\nimport { useState, useRef } from \"react\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Textarea } from \"../ui/textarea\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\nexport interface WaitlistPageProps {\n /** Product name. Falls back to SDK config productId if not provided. */\n productName?: string;\n /** Hero title */\n heroTitle?: string;\n /** Hero subtitle */\n heroSubtitle?: string;\n /** Hero description */\n heroDescription?: string;\n /** Message shown on successful signup */\n successMessage?: string;\n /** Message shown on error */\n errorMessage?: string;\n /** Custom CSS class for container */\n className?: string;\n /** SEO metadata */\n seo?: {\n title?: string;\n description?: string;\n keywords?: string;\n image?: string;\n url?: string;\n };\n}\n\nexport interface WaitlistFormProps {\n /** Layout variant */\n variant?: \"inline\" | \"stacked\";\n /** Show email label */\n showLabel?: boolean;\n /** Show description text */\n showDescription?: boolean;\n /** Whether to show the name field */\n showNameField?: boolean;\n /** Description text */\n description?: string;\n /** Button text */\n buttonText?: string;\n /** Custom CSS class */\n className?: string;\n}\n\ninterface RateLimitState {\n attempts: number;\n resetTime: number;\n}\n\n// ============================================================================\n// VALIDATION SCHEMAS\n// ============================================================================\n\nconst waitlistPageSchema = z.object({\n name: z.string().min(1, \"Name is required\"),\n email: z.string().email(\"Please enter a valid email address\"),\n company: z.string().optional(),\n reason: z.string().optional(),\n});\n\ntype WaitlistPageFormData = z.infer<typeof waitlistPageSchema>;\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst JOIN_WAITLIST_MUTATION = /* GraphQL */ `\n mutation JoinWaitlist($input: JoinWaitlistInput!) {\n joinWaitlist(input: $input) {\n id\n email\n name\n status\n createdAt\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function joinWaitlist(\n client: WebSDKClient,\n data: {\n email: string;\n name?: string;\n company?: string;\n reason?: string;\n },\n productId: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n joinWaitlist: {\n id: string;\n email: string;\n name: string | null;\n status: string;\n createdAt: string;\n };\n }>(JOIN_WAITLIST_MUTATION, {\n input: {\n email: data.email.trim().toLowerCase(),\n platformProductId: productId,\n name: data.name?.trim() || undefined,\n company: data.company?.trim() || undefined,\n reason: data.reason?.trim() || undefined,\n context: {\n source: \"website\",\n referrer: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n },\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Failed to join waitlist\";\n if (errorMsg.toLowerCase().includes(\"already\")) {\n return {\n success: false,\n message: \"You are already on the waitlist!\",\n };\n }\n return { success: false, message: errorMsg };\n }\n\n return { success: true, message: \"You have been added to the waitlist!\" };\n } catch (error) {\n console.error(\"Waitlist signup error:\", error);\n return { success: false, message: \"Network error. Please try again.\" };\n }\n}\n\n// ============================================================================\n// RATE LIMITING (in-memory for SSR compatibility)\n// ============================================================================\n\nfunction useRateLimit(maxAttempts: number, windowMinutes: number) {\n const rateLimitRef = useRef<RateLimitState | null>(null);\n const [isLimited, setIsLimited] = useState(false);\n const [resetTime, setResetTime] = useState<Date | null>(null);\n\n function recordAttempt(): boolean {\n const now = Date.now();\n const state = rateLimitRef.current;\n\n // Reset if window expired\n if (state && now > state.resetTime) {\n rateLimitRef.current = null;\n }\n\n const current = rateLimitRef.current;\n\n if (!current) {\n rateLimitRef.current = {\n attempts: 1,\n resetTime: now + windowMinutes * 60 * 1000,\n };\n return false;\n }\n\n current.attempts += 1;\n\n if (current.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(current.resetTime));\n return true;\n }\n\n return false;\n }\n\n function checkLimit(): boolean {\n const state = rateLimitRef.current;\n if (!state) return false;\n if (Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n return false;\n }\n return state.attempts >= maxAttempts;\n }\n\n return { isLimited, resetTime, recordAttempt, checkLimit };\n}\n\n// ============================================================================\n// WAITLIST PAGE (Full-page component)\n// ============================================================================\n\nexport function WaitlistPage({\n productName,\n heroTitle = \"Join the Waitlist\",\n heroSubtitle = \"Be among the first to experience what's coming next\",\n heroDescription,\n successMessage = \"You have been added to the waitlist!\",\n errorMessage = \"Failed to join waitlist. Please try again.\",\n className,\n seo,\n}: WaitlistPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const {\n product,\n loading: productLoading,\n error: productError,\n hasProvider,\n } = useProduct();\n const displayName = productName ?? product?.name ?? config.productId;\n const productStatus = product?.status;\n const canCheckStatus = Boolean(config.productSlug);\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isLimited, resetTime, recordAttempt, checkLimit } = useRateLimit(\n 3,\n 15,\n );\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n reset,\n } = useForm<WaitlistPageFormData>({\n resolver: zodResolver(waitlistPageSchema),\n });\n\n if (canCheckStatus && !hasProvider) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Product status checks require <code>ProductProvider</code> to be\n mounted. Please update your integration configuration.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n if (canCheckStatus && productLoading) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Loading…\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Fetching product status.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n if (canCheckStatus && (productError || !productStatus)) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n We can’t confirm waitlist availability right now. Please try again\n later.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n // If product is already available, show \"already available\" instead of waitlist form\n if (\n canCheckStatus &&\n (productStatus === \"ACTIVE\" || productStatus === \"RELEASED\")\n ) {\n const appUrl = product?.appUrl || product?.website || \"#\";\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n {displayName} is now available!\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Great news — {displayName} is open to everyone. Sign up or log in\n to get started.\n </p>\n <Button size=\"lg\" asChild>\n <a href={appUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Get Started\n </a>\n </Button>\n </div>\n </section>\n </div>\n );\n }\n\n // If product is DRAFT or COMING_SOON, don't show waitlist form\n if (\n canCheckStatus &&\n (productStatus === \"DRAFT\" || productStatus === \"COMING_SOON\")\n ) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Coming Soon\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n {displayName} is not yet accepting waitlist signups. Check back\n soon!\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n // Defensive: if backend introduces a new status we don't recognize, don't render a signup form.\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n {displayName} is not accepting waitlist signups right now.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n const onSubmit = async (data: WaitlistPageFormData) => {\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n toast.error(\"This product is not accepting waitlist signups right now.\");\n return;\n }\n\n if (checkLimit()) {\n toast.error(\n `Too many attempts. Please try again after ${resetTime?.toLocaleTimeString()}`,\n );\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const result = await joinWaitlist(client, data, config.productId);\n\n if (result.success) {\n toast.success(result.message ?? successMessage);\n reset();\n } else {\n toast.error(result.message ?? errorMessage);\n }\n\n recordAttempt();\n } catch (_error) {\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <>\n {seo && (\n <PageHead\n title={seo.title ?? `Join the Waitlist - ${displayName}`}\n description={seo.description ?? heroDescription ?? heroSubtitle}\n productName={displayName}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n\n <div className={className}>\n <div className=\"min-h-screen flex items-center justify-center px-4 py-12\">\n <div className=\"max-w-lg w-full space-y-8\">\n {/* Hero */}\n <div className=\"text-center\">\n <h1 className=\"text-4xl font-bold tracking-tight\">{heroTitle}</h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-5\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-name\">Name *</Label>\n <Input\n id=\"waitlist-name\"\n type=\"text\"\n placeholder=\"Your name\"\n disabled={isSubmitting || isLimited}\n {...register(\"name\")}\n />\n {errors.name && (\n <p className=\"text-sm text-destructive\">\n {errors.name.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-email\">Email *</Label>\n <Input\n id=\"waitlist-email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-company\">Company</Label>\n <Input\n id=\"waitlist-company\"\n type=\"text\"\n placeholder=\"Your company (optional)\"\n disabled={isSubmitting || isLimited}\n {...register(\"company\")}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-reason\">Why are you interested?</Label>\n <Textarea\n id=\"waitlist-reason\"\n placeholder=\"Tell us what excites you about the product (optional)\"\n rows={3}\n disabled={isSubmitting || isLimited}\n className=\"resize-y\"\n {...register(\"reason\")}\n />\n </div>\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Joining...\" : \"Join Waitlist\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground text-center\">\n By joining the waitlist, you agree to receive updates from{\" \"}\n {displayName}. We respect your privacy and will never share your\n information.\n </p>\n </div>\n </div>\n </div>\n </>\n );\n}\n\n// ============================================================================\n// WAITLIST FORM (Inline Component)\n// ============================================================================\n\n/**\n * Lightweight inline waitlist signup form for hero sections, footers, etc.\n */\nexport function WaitlistForm({\n variant = \"inline\",\n showLabel = false,\n showDescription = false,\n showNameField = false,\n description = \"Join our waitlist to get early access\",\n buttonText = \"Join Waitlist\",\n className = \"\",\n}: WaitlistFormProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const {\n product,\n loading: productLoading,\n error: productError,\n hasProvider,\n } = useProduct();\n const productStatus = product?.status;\n const canCheckStatus = Boolean(config.productSlug);\n\n const [email, setEmail] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n toast.error(\"This product is not accepting waitlist signups right now.\");\n return;\n }\n\n if (!email || !email.includes(\"@\")) {\n toast.error(\"Please enter a valid email address\");\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await joinWaitlist(\n client,\n { email, name: name || undefined },\n config.productId,\n );\n\n if (result.success) {\n toast.success(result.message ?? \"You have been added to the waitlist!\");\n setEmail(\"\");\n setName(\"\");\n } else {\n toast.error(result.message ?? \"Failed to join waitlist\");\n }\n } catch (_error) {\n toast.error(\"An error occurred. Please try again.\");\n } finally {\n setIsLoading(false);\n }\n };\n\n const isInline = variant === \"inline\";\n\n if (canCheckStatus && !hasProvider) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">\n Product status checks require <code>ProductProvider</code> to be\n mounted.\n </p>\n </div>\n );\n }\n\n if (canCheckStatus && productLoading) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">Loading waitlist…</p>\n </div>\n );\n }\n\n if (canCheckStatus && (productError || productStatus !== \"WAITLIST\")) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">\n Waitlist signups are not available right now.\n </p>\n </div>\n );\n }\n\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <form\n onSubmit={handleSubmit}\n className={isInline ? \"flex gap-2\" : \"flex flex-col gap-2\"}\n >\n {showNameField && (\n <div className={isInline ? \"flex-1\" : \"w-full\"}>\n {showLabel && (\n <Label\n htmlFor=\"waitlist-inline-name\"\n className=\"text-sm mb-1 block\"\n >\n Name\n </Label>\n )}\n <Input\n id=\"waitlist-inline-name\"\n type=\"text\"\n placeholder=\"Your name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n disabled={isLoading}\n className=\"w-full\"\n />\n </div>\n )}\n <div className={isInline ? \"flex-1\" : \"w-full\"}>\n {showLabel && (\n <Label\n htmlFor=\"waitlist-inline-email\"\n className=\"text-sm mb-1 block\"\n >\n Email\n </Label>\n )}\n <Input\n id=\"waitlist-inline-email\"\n type=\"email\"\n placeholder=\"Enter your email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n disabled={isLoading}\n required\n className=\"w-full\"\n />\n </div>\n <Button\n type=\"submit\"\n disabled={isLoading}\n className={isInline ? \"whitespace-nowrap\" : \"w-full\"}\n >\n {isLoading ? \"Joining...\" : buttonText}\n </Button>\n </form>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\nimport { toast } from \"sonner\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst UNSUBSCRIBE_MUTATION = /* GraphQL */ `\n mutation PublicUnsubscribeByToken($token: String!) {\n publicUnsubscribeByToken(token: $token)\n }\n`;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UnsubscribePageProps {\n productName?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n resubscribeUrl?: string;\n successMessage?: string;\n errorMessage?: string;\n}\n\ntype UnsubscribeState =\n | \"loading\"\n | \"confirming\"\n | \"processing\"\n | \"success\"\n | \"error\"\n | \"invalid\";\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function UnsubscribePage({\n productName,\n className = \"\",\n seoTitle = \"Unsubscribe from Newsletter\",\n seoDescription = \"Manage your newsletter subscription preferences.\",\n resubscribeUrl,\n successMessage = \"You have been successfully unsubscribed from our newsletter.\",\n errorMessage = \"Something went wrong. Please try again or contact support.\",\n}: UnsubscribePageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const displayName = productName ?? config.productId;\n\n const [state, setState] = useState<UnsubscribeState>(\"loading\");\n const [error, setError] = useState<string>(\"\");\n const [token, setToken] = useState<string>(\"\");\n const [successCopy, setSuccessCopy] = useState<string>(successMessage);\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const t = params.get(\"token\");\n if (t) {\n setToken(t);\n setState(\"confirming\");\n } else {\n setState(\"invalid\");\n }\n }, []);\n\n const handleUnsubscribe = async () => {\n if (!token) return;\n\n setState(\"processing\");\n\n try {\n const result = await client.mutate<{\n publicUnsubscribeByToken: boolean;\n }>(UNSUBSCRIBE_MUTATION, { token });\n\n if (result.errors?.length) {\n const errMsg = result.errors[0]?.message ?? errorMessage;\n const code = (result.errors[0] as { extensions?: { code?: string } })\n ?.extensions?.code;\n\n if (code === \"ALREADY_UNSUBSCRIBED\") {\n toast.info(\"You are already unsubscribed from this newsletter.\");\n setSuccessCopy(\"You were already unsubscribed from this newsletter.\");\n setState(\"success\");\n return;\n } else if (code === \"UNSUBSCRIBE_TOKEN_EXPIRED\") {\n setError(\n \"This unsubscribe link has expired. Please contact support.\",\n );\n } else if (code === \"INVALID_UNSUBSCRIBE_TOKEN\") {\n setState(\"invalid\");\n return;\n } else {\n setError(errMsg);\n }\n setState(\"error\");\n return;\n }\n\n if (result.data?.publicUnsubscribeByToken) {\n setSuccessCopy(successMessage);\n setState(\"success\");\n toast.success(\"Successfully unsubscribed\");\n } else {\n setError(errorMessage);\n setState(\"error\");\n }\n } catch {\n setError(errorMessage);\n setState(\"error\");\n }\n };\n\n return (\n <div\n className={className}\n style={{\n minHeight: \"60vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"6rem 1rem 4rem\",\n }}\n >\n <PageHead title={seoTitle} description={seoDescription} />\n\n <div className=\"max-w-md w-full text-center\">\n {/* Loading */}\n {state === \"loading\" && (\n <div className=\"animate-pulse\">\n <div className=\"h-8 w-48 bg-muted rounded mx-auto mb-4\" />\n <div className=\"h-4 w-64 bg-muted rounded mx-auto\" />\n </div>\n )}\n\n {/* Confirm */}\n {state === \"confirming\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-amber-100 dark:bg-amber-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-amber-600 dark:text-amber-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribe from Newsletter\n </h1>\n <p className=\"text-muted-foreground mb-8\">\n Are you sure you want to unsubscribe from {displayName}{\" \"}\n newsletter? You will no longer receive updates and news from us.\n </p>\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\n <Button\n onClick={handleUnsubscribe}\n variant=\"destructive\"\n className=\"px-8\"\n >\n Yes, Unsubscribe\n </Button>\n {resubscribeUrl && (\n <Button\n variant=\"outline\"\n onClick={() => {\n window.location.href = resubscribeUrl;\n }}\n className=\"px-8\"\n >\n Cancel\n </Button>\n )}\n </div>\n </div>\n )}\n\n {/* Processing */}\n {state === \"processing\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-muted flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-muted-foreground animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribing...\n </h1>\n <p className=\"text-muted-foreground\">\n Please wait while we process your request.\n </p>\n </div>\n )}\n\n {/* Success */}\n {state === \"success\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-green-600 dark:text-green-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Successfully Unsubscribed\n </h1>\n <p className=\"text-muted-foreground mb-8\">{successCopy}</p>\n {resubscribeUrl && (\n <p className=\"text-sm text-muted-foreground\">\n Changed your mind?{\" \"}\n <a\n href={resubscribeUrl}\n className=\"text-primary underline hover:no-underline\"\n >\n Resubscribe\n </a>\n </p>\n )}\n </div>\n )}\n\n {/* Error */}\n {state === \"error\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribe Failed\n </h1>\n <p className=\"text-muted-foreground mb-8\">{error}</p>\n <Button onClick={() => setState(\"confirming\")} variant=\"outline\">\n Try Again\n </Button>\n </div>\n )}\n\n {/* Invalid / No Token */}\n {state === \"invalid\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Invalid Unsubscribe Link\n </h1>\n <p className=\"text-muted-foreground\">\n This unsubscribe link is invalid or missing. If you want to\n unsubscribe, please use the link from your newsletter email.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Rybbit Analytics Component\n *\n * Injects the Rybbit tracking script into the page head.\n * Works with both Vite (CSR) and Next.js (SSR/CSR) applications.\n *\n * @example\n * ```tsx\n * // In your app layout or root component\n * import { RybbitAnalytics } from '@burdenoff/website-sdk/analytics'\n *\n * function App() {\n * return (\n * <>\n * <RybbitAnalytics siteId=\"1\" />\n * <Router>...</Router>\n * </>\n * )\n * }\n * ```\n */\n\"use client\";\n\nimport { useEffect } from \"react\";\n\nexport interface RybbitAnalyticsProps {\n /**\n * Rybbit site ID (obtained from the Rybbit dashboard)\n */\n siteId: string;\n\n /**\n * Rybbit script URL (defaults to the self-hosted instance)\n * @default \"https://analytics.burdenoff.com/api/script.js\"\n */\n scriptUrl?: string;\n\n /**\n * Whether to enable tracking (useful for disabling in development)\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * RybbitAnalytics - Embeds the Rybbit analytics tracking script.\n *\n * The script is loaded asynchronously with `defer` to avoid blocking page load.\n * It automatically tracks page views and user interactions.\n *\n * In development mode (when `enabled` is false), no script is loaded.\n */\nexport function RybbitAnalytics({\n siteId,\n scriptUrl = \"https://analytics.burdenoff.com/api/script.js\",\n enabled = true,\n}: RybbitAnalyticsProps) {\n useEffect(() => {\n if (!enabled || !siteId) return;\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[data-site-id=\"${siteId}\"]`,\n );\n if (existingScript) return;\n\n // Create and inject the script\n const script = document.createElement(\"script\");\n script.src = scriptUrl;\n script.defer = true;\n script.setAttribute(\"data-site-id\", siteId);\n document.head.appendChild(script);\n\n // Cleanup on unmount\n return () => {\n const scriptToRemove = document.querySelector(\n `script[data-site-id=\"${siteId}\"]`,\n );\n if (scriptToRemove) {\n document.head.removeChild(scriptToRemove);\n }\n };\n }, [siteId, scriptUrl, enabled]);\n\n // This component renders nothing - it only manages the script tag\n return null;\n}\n","/**\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\";\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}\n\nexport interface ContentPageListData {\n items: Array<{\n id: string;\n title: string;\n slug: string;\n lastUpdated: string;\n }>;\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 }\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 }\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 }\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 [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 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: config.productId,\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, config.productId, 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 * Simple content renderer component.\n * Renders markdown content as HTML (assumes pre-rendered HTML or plain text).\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 === \"html\" || format === \"markdown\") {\n // For both HTML and markdown, we render as HTML\n // (markdown should be pre-rendered to HTML by the backend)\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/security.ts","../src/client/graphql-client.ts","../src/client/gateway-resolver.ts","../src/client/provider.tsx","../src/seo/page-head.tsx","../src/utils/cn.ts","../src/ui/button.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/textarea.tsx","../src/components/contact.tsx","../src/product/product-provider.tsx","../src/components/newsletter.tsx","../src/components/pricing.tsx","../src/components/waitlist.tsx","../src/components/unsubscribe.tsx","../src/analytics/rybbit.tsx","../src/content/content-provider.tsx"],"names":["createContext","useMemo","useContext","Helmet","jsx","twMerge","clsx","cva","React","Slot","React2","React3","LabelPrimitive","React4","useRef","useState","toast","jsxs","Mail","Phone","MapPin","Clock","ReCAPTCHA","Fragment","Send","useCallback","useLayoutEffect","z","useEffect","useForm","zodResolver","useRateLimit"],"mappings":"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","file":"index.js","sourcesContent":["const LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"::1\"]);\nconst RESERVED_HEADERS = new Set([\n \"authorization\",\n \"cookie\",\n \"x-actor-id\",\n \"x-actor-type\",\n \"x-consent-granted-by\",\n \"x-consent-scope\",\n \"x-consent-granted-at\",\n \"x-consent-expires-at\",\n]);\n\nexport function validateGatewayUrl(value: string): string {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"Gateway URL must be a valid absolute URL\");\n }\n\n if (url.protocol === \"https:\") {\n return url.toString();\n }\n\n if (\n url.protocol === \"http:\" &&\n LOOPBACK_HOSTS.has(url.hostname.toLowerCase())\n ) {\n return url.toString();\n }\n\n throw new Error(\"Gateway URL must use HTTPS unless it targets localhost\");\n}\n\nexport function sanitizeHeaders(\n headers?: Record<string, string>,\n): Record<string, string> | undefined {\n if (!headers) return undefined;\n\n return Object.fromEntries(\n Object.entries(headers).filter(\n ([key]) => !RESERVED_HEADERS.has(key.toLowerCase()),\n ),\n );\n}\n","/**\n * Lightweight GraphQL client for the Burdenoff Web SDK.\n * Uses native fetch - zero external dependencies.\n * All calls are unauthenticated (public gateway operations only).\n */\n\nimport { sanitizeHeaders, validateGatewayUrl } from \"./security\";\n\nexport interface WebSDKClientConfig {\n /** Global public gateway URL (e.g. \"https://api.burdenoff.com/global/graphql\") */\n gatewayUrl: string;\n /** Platform product ID for scoping operations */\n productId: string;\n /** Product slug (used for public product queries) */\n productSlug?: string;\n /** reCAPTCHA site key (if not fetched from product config) */\n recaptchaSiteKey?: string;\n /** Rybbit analytics site ID */\n rybbitSiteId?: string;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n}\n\nexport interface GraphQLResponse<T = Record<string, unknown>> {\n data?: T;\n errors?: Array<{\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: Array<string | number>;\n extensions?: Record<string, unknown>;\n }>;\n}\n\nexport class WebSDKClient {\n private config: WebSDKClientConfig;\n private queryCache = new Map<\n string,\n { data: GraphQLResponse<unknown>; ts: number }\n >();\n private inflight = new Map<string, Promise<GraphQLResponse<unknown>>>();\n private static CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private static MAX_CACHE_ENTRIES = 100;\n\n constructor(config: WebSDKClientConfig) {\n this.config = {\n ...config,\n gatewayUrl: validateGatewayUrl(config.gatewayUrl),\n headers: sanitizeHeaders(config.headers),\n };\n }\n\n getConfig(): WebSDKClientConfig {\n return this.config;\n }\n\n /**\n * Execute a GraphQL query (with deduplication and caching)\n */\n async query<T = Record<string, unknown>>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n const cacheKey = JSON.stringify({ query, variables });\n\n // Return cached response if still valid, evict if expired\n const cached = this.queryCache.get(cacheKey);\n if (cached) {\n if (Date.now() - cached.ts < WebSDKClient.CACHE_TTL) {\n return cached.data as GraphQLResponse<T>;\n }\n this.queryCache.delete(cacheKey);\n }\n\n // Deduplicate: if same query is already in-flight, reuse the promise\n const existing = this.inflight.get(cacheKey);\n if (existing) {\n return existing as Promise<GraphQLResponse<T>>;\n }\n\n const promise = this.request<T>(query, variables)\n .then((result) => {\n // Cache successful responses only\n if (result.data && !result.errors?.length) {\n if (this.queryCache.size >= WebSDKClient.MAX_CACHE_ENTRIES) {\n const oldestEntry = this.queryCache.keys().next().value;\n if (oldestEntry) {\n this.queryCache.delete(oldestEntry);\n }\n }\n this.queryCache.set(cacheKey, { data: result, ts: Date.now() });\n }\n return result;\n })\n .finally(() => {\n this.inflight.delete(cacheKey);\n });\n\n this.inflight.set(cacheKey, promise);\n return promise;\n }\n\n /**\n * Execute a GraphQL mutation\n */\n async mutate<T = Record<string, unknown>>(\n mutation: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n return this.request<T>(mutation, variables);\n }\n\n private async request<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n try {\n const response = await fetch(this.config.gatewayUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-product-id\": this.config.productId,\n ...this.config.headers,\n },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!response.ok) {\n console.error(\n \"[WebSDK] GraphQL request failed\",\n response.status,\n response.statusText,\n );\n return {\n errors: [\n {\n message: `HTTP ${response.status}: ${response.statusText}`,\n extensions: { code: `HTTP_${response.status}` },\n },\n ],\n };\n }\n\n return (await response.json()) as GraphQLResponse<T>;\n } catch (error) {\n console.error(\n \"[WebSDK] Network error\",\n error instanceof Error ? error.message : \"unknown error\",\n );\n return {\n errors: [\n {\n message: error instanceof Error ? error.message : \"Network error\",\n extensions: { code: \"NETWORK_ERROR\" },\n },\n ],\n };\n }\n }\n}\n","/**\n * Runtime gateway URL resolution for product marketing websites.\n *\n * Mirrors the app shell pattern from @burdenoff/fe-libs/shared/config/gatewayUrls\n * but scoped to the website SDK's needs (global gateway only, no workspace gateway).\n *\n * Resolution priority:\n * 1. Explicit `gatewayUrl` passed in config (non-empty) — used as-is\n * 2. Hostname-based auto-detection:\n * - Production domains (vibecontrols.com, bigconsole.com, ...) → prod gateway\n * - Alpha domains (alpha.vibecontrols.com, ...) → alpha gateway\n * - Everything else (localhost, *.local.burdenoff.com) → relative `/global/graphql`\n */\n\nconst PROD_GATEWAY = \"https://graphql.burdenoff.com/global/graphql\";\nconst ALPHA_GATEWAY = \"https://alphagraphql.burdenoff.com/global/graphql\";\n/**\n * Build the local fallback URL. In a browser context we need an absolute\n * URL (the SDK's security validator rejects relative paths), so we\n * prepend `window.location.origin`. During SSR/build (no window) we\n * return a placeholder localhost URL that the validator accepts.\n */\nfunction getLocalFallback(): string {\n if (typeof window !== \"undefined\") {\n return `${window.location.origin}/global/graphql`;\n }\n return \"http://localhost:4000/global/graphql\";\n}\n\n/**\n * All known product domains. When the website is served from any of these,\n * we can determine the environment from the subdomain pattern.\n */\nconst PRODUCT_DOMAINS = [\n \"burdenoff.com\",\n \"vibecontrols.com\",\n \"fluidgrids.com\",\n \"botlit.ai\",\n \"bigconsole.com\",\n \"gethealthybowl.com\",\n \"headshotmarketing.com\",\n \"timecampus.com\",\n \"ggnomad.com\",\n \"movethewheels.com\",\n \"crewfoundry.com\",\n \"planmagnet.com\",\n \"eventfullymanaged.com\",\n \"kadaikodi.com\",\n \"assethandler.com\",\n \"technospam.com\",\n \"semanticfed.com\",\n \"manufacturedops.com\",\n \"theglobalfuel.com\",\n \"housingvista.com\",\n \"proserviceworld.com\",\n \"mybodyshield.com\",\n \"artistrybase.com\",\n \"collabkin.com\",\n \"brainyrich.com\",\n \"theculturepost.com\",\n \"comradecircle.com\",\n \"cosmicintersection.com\",\n \"govcitizenhub.com\",\n \"intelwatchtower.com\",\n \"ecoimpacthub.com\",\n \"buildmyiq.com\",\n \"fluidgrids.ai\",\n];\n\nfunction isProductionHost(hostname: string): boolean {\n return PRODUCT_DOMAINS.some(\n (d) => hostname === d || hostname === `www.${d}` || hostname === `app.${d}`,\n );\n}\n\nfunction isAlphaHost(hostname: string): boolean {\n return PRODUCT_DOMAINS.some(\n (d) =>\n hostname === `alpha.${d}` ||\n hostname === `alphaapp.${d}` ||\n hostname === `staging.${d}`,\n );\n}\n\n/**\n * Resolve the global gateway URL at runtime based on the current hostname.\n *\n * @param explicitUrl - URL explicitly passed in SDK config (takes precedence if non-empty)\n * @returns Resolved gateway URL\n */\nexport function resolveGatewayUrl(explicitUrl?: string): string {\n // If an explicit URL is provided and it's not a localhost dev default,\n // respect it — the consumer knows what they want.\n if (explicitUrl && !isLocalhostUrl(explicitUrl)) {\n return explicitUrl;\n }\n\n if (typeof window === \"undefined\") {\n // SSR / build-time — can't detect hostname, use the explicit URL or fallback\n return explicitUrl || getLocalFallback();\n }\n\n const hostname = window.location.hostname.toLowerCase();\n\n if (isProductionHost(hostname)) return PROD_GATEWAY;\n if (isAlphaHost(hostname)) return ALPHA_GATEWAY;\n\n // Local dev, *.local.burdenoff.com, or unknown — use relative URL\n // which the Vite proxy (dev) or nginx (containerized) will handle.\n return getLocalFallback();\n}\n\nfunction isLocalhostUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n const h = parsed.hostname;\n return h === \"localhost\" || h === \"127.0.0.1\" || h === \"::1\";\n } catch {\n return false;\n }\n}\n","/**\n * React context provider for the Web SDK client.\n * Wraps the application with WebSDKClient configuration.\n */\n\"use client\";\n\nimport { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { resolveGatewayUrl } from \"./gateway-resolver\";\nimport { WebSDKClient, type WebSDKClientConfig } from \"./graphql-client\";\n\nconst WebSDKContext = createContext<WebSDKClient | null>(null);\n\nexport interface WebSDKProviderProps {\n /** SDK client configuration */\n config: WebSDKClientConfig;\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider component that makes the WebSDKClient available to all child components.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={{\n * gatewayUrl: \"https://api.burdenoff.com/global/graphql\",\n * productId: \"your-product-id\",\n * productSlug: \"your-product\",\n * }}>\n * <App />\n * </WebSDKProvider>\n * ```\n */\nexport function WebSDKProvider({ config, children }: WebSDKProviderProps) {\n const client = useMemo(() => {\n const resolvedConfig = {\n ...config,\n gatewayUrl: resolveGatewayUrl(config.gatewayUrl),\n };\n return new WebSDKClient(resolvedConfig);\n }, [config]);\n\n return (\n <WebSDKContext.Provider value={client}>{children}</WebSDKContext.Provider>\n );\n}\n\n/**\n * Hook to access the WebSDKClient instance.\n * Must be used within a WebSDKProvider.\n */\nexport function useWebSDK(): WebSDKClient {\n const client = useContext(WebSDKContext);\n if (!client) {\n throw new Error(\"useWebSDK must be used within a WebSDKProvider\");\n }\n return client;\n}\n\n/**\n * Hook to access the SDK configuration.\n * Useful for components that need config values like productId, recaptchaSiteKey, etc.\n */\nexport function useWebSDKConfig(): WebSDKClientConfig {\n const client = useWebSDK();\n return client.getConfig();\n}\n","/**\n * PageHead Component\n * Manages dynamic meta tags for SEO optimization on a per-page basis.\n * Supports JSON-LD structured data, Open Graph, Twitter Cards, favicons, and robots directives.\n *\n * @example\n * ```tsx\n * <PageHead\n * title=\"About Us\"\n * description=\"Learn about our mission and team\"\n * productName=\"MyProduct\"\n * keywords=\"about, team, mission\"\n * image=\"/og-about.png\"\n * url=\"https://myproduct.com/about\"\n * favicon=\"/favicon.ico\"\n * robots=\"index, follow\"\n * locale=\"en_US\"\n * twitterHandle=\"@burdenoff\"\n * themeColor=\"#1a1a2e\"\n * structuredData={{\n * \"@context\": \"https://schema.org\",\n * \"@type\": \"WebPage\",\n * name: \"About Us\",\n * }}\n * />\n * ```\n */\n\nimport { Helmet } from \"react-helmet-async\";\n\nexport interface PageHeadProps {\n /** Page title */\n title: string;\n /** Meta description */\n description?: string;\n /** Product/brand name (appended to title) */\n productName?: string;\n /** SEO keywords */\n keywords?: string;\n /** Open Graph image URL */\n image?: string;\n /** Page canonical URL */\n url?: string;\n /** Favicon URL */\n favicon?: string;\n /** Robots directive (e.g., \"index, follow\") */\n robots?: string;\n /** Open Graph locale (e.g., \"en_US\") */\n locale?: string;\n /** Twitter handle (e.g., \"@burdenoff\") */\n twitterHandle?: string;\n /** Theme color for mobile browsers */\n themeColor?: string;\n /** JSON-LD structured data objects */\n structuredData?: Record<string, unknown> | Array<Record<string, unknown>>;\n /** Additional meta tags */\n additionalMeta?: Array<{\n name?: string;\n property?: string;\n content: string;\n }>;\n}\n\nexport function PageHead({\n title,\n description,\n productName,\n keywords,\n image,\n url,\n favicon,\n robots = \"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\",\n locale = \"en_US\",\n twitterHandle,\n themeColor = \"#000000\",\n structuredData,\n additionalMeta,\n}: PageHeadProps) {\n const fullTitle =\n productName && !title.includes(productName)\n ? `${title} | ${productName}`\n : title;\n\n const fullImageUrl =\n image && !image.startsWith(\"http\") && url\n ? `${url.replace(/\\/$/, \"\")}${image}`\n : image;\n\n // Normalize structured data to an array\n const structuredDataItems: Array<Record<string, unknown>> = structuredData\n ? Array.isArray(structuredData)\n ? structuredData\n : [structuredData]\n : [];\n\n return (\n <Helmet>\n {/* Primary Meta Tags */}\n <title>{fullTitle}</title>\n <meta name=\"title\" content={fullTitle} />\n {description && <meta name=\"description\" content={description} />}\n {keywords && <meta name=\"keywords\" content={keywords} />}\n <meta name=\"author\" content=\"Burdenoff Consultancy Services Pvt Ltd\" />\n <meta name=\"robots\" content={robots} />\n\n {/* Canonical URL */}\n {url && <link rel=\"canonical\" href={url} />}\n\n {/* Favicon */}\n {favicon && <link rel=\"icon\" href={favicon} />}\n\n {/* Open Graph / Facebook */}\n <meta property=\"og:type\" content=\"website\" />\n <meta property=\"og:title\" content={fullTitle} />\n {description && <meta property=\"og:description\" content={description} />}\n {fullImageUrl && <meta property=\"og:image\" content={fullImageUrl} />}\n {url && <meta property=\"og:url\" content={url} />}\n <meta property=\"og:locale\" content={locale} />\n {productName && <meta property=\"og:site_name\" content={productName} />}\n\n {/* Twitter Card */}\n <meta name=\"twitter:card\" content=\"summary_large_image\" />\n <meta name=\"twitter:title\" content={fullTitle} />\n {description && <meta name=\"twitter:description\" content={description} />}\n {fullImageUrl && <meta name=\"twitter:image\" content={fullImageUrl} />}\n {twitterHandle && <meta name=\"twitter:creator\" content={twitterHandle} />}\n\n {/* Theme Color */}\n <meta name=\"theme-color\" content={themeColor} />\n\n {/* JSON-LD Structured Data */}\n {structuredDataItems.map((data, index) => (\n <script key={`ld-${index}`} type=\"application/ld+json\">\n {JSON.stringify(data)}\n </script>\n ))}\n\n {/* Additional Meta Tags */}\n {additionalMeta?.map((meta, index) => (\n <meta\n key={`meta-${index}`}\n {...(meta.name ? { name: meta.name } : {})}\n {...(meta.property ? { property: meta.property } : {})}\n content={meta.content}\n />\n ))}\n </Helmet>\n );\n}\n","/**\n * Utility function to merge Tailwind CSS classes\n * Combines clsx and tailwind-merge for optimal class handling\n */\n\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Merge multiple class names intelligently\n * - Handles conditional classes via clsx\n * - Deduplicates and resolves Tailwind conflicts via tailwind-merge\n *\n * @example\n * ```ts\n * cn('px-4 py-2', 'bg-blue-500', { 'text-white': isActive })\n * // => 'px-4 py-2 bg-blue-500 text-white' (if isActive is true)\n * ```\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils/cn\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","import * as React from \"react\";\n\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils/cn\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n);\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n","import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n});\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","/**\n * Contact Page Component\n * Complete contact page with form submission via GraphQL, reCAPTCHA validation,\n * contact information display, and additional contact options.\n * Uses the WebSDKClient provider for API calls.\n *\n * @example\n * ```tsx\n * import { ContactPage } from '@burdenoff/website-sdk/components/contact'\n *\n * <ContactPage\n * productName=\"MyProduct\"\n * recaptchaSiteKey=\"your-recaptcha-key\"\n * contactEmail=\"contact@myproduct.com\"\n * contactPhone=\"+1-234-567-8900\"\n * officeAddress={{\n * line1: \"123 Main St\",\n * line2: \"Suite 100\",\n * line3: \"City, State 12345\",\n * country: \"USA\"\n * }}\n * />\n * ```\n */\n\n\"use client\";\n\nimport { useState, useRef } from \"react\";\n\nimport { Mail, MapPin, Phone, Clock, Send } from \"lucide-react\";\nimport ReCAPTCHA from \"react-google-recaptcha\";\nimport { toast } from \"sonner\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Textarea } from \"../ui/textarea\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\ninterface OfficeAddress {\n line1: string;\n line2: string;\n line3: string;\n country: string;\n}\n\ninterface ContactOption {\n title: string;\n description: string;\n buttonText: string;\n buttonLink: string;\n}\n\ninterface ContactFormData {\n firstName: string;\n lastName: string;\n email: string;\n company?: string;\n subject: string;\n message: string;\n recaptchaToken: string;\n}\n\ntype SubmitStatus = \"idle\" | \"success\" | \"error\";\n\nexport interface ContactPageProps {\n /** Product name. Falls back to SDK config productId if not provided. */\n productName?: string;\n /** reCAPTCHA site key (optional, falls back to SDK config) */\n recaptchaSiteKey?: string;\n /** Contact email */\n contactEmail: string;\n /** Contact phone number */\n contactPhone: string;\n /** Office address */\n officeAddress: OfficeAddress;\n /** Response time message */\n responseTime?: string;\n /** Hero title */\n heroTitle?: string;\n /** Hero description */\n heroDescription?: string;\n /** Additional contact options */\n additionalOptions?: ContactOption[];\n /** SEO metadata */\n seo?: {\n title?: string;\n description?: string;\n keywords?: string;\n image?: string;\n url?: string;\n };\n}\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst SUBMIT_CONTACT_INQUIRY_MUTATION = /* GraphQL */ `\n mutation SubmitContactInquiry($input: SubmitContactInquiryInput!) {\n submitContactInquiry(input: $input) {\n success\n message\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function submitContactForm(\n client: WebSDKClient,\n data: ContactFormData,\n productId: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n submitContactInquiry: {\n success: boolean;\n message: string;\n };\n }>(SUBMIT_CONTACT_INQUIRY_MUTATION, {\n input: {\n name: `${data.firstName} ${data.lastName}`,\n email: data.email.trim().toLowerCase(),\n company: data.company || undefined,\n subject: data.subject,\n message: data.message,\n productId,\n ...(data.recaptchaToken ? { recaptchaToken: data.recaptchaToken } : {}),\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Failed to send message\";\n return { success: false, message: errorMsg };\n }\n\n const response = result.data?.submitContactInquiry;\n if (response?.success) {\n return {\n success: true,\n message: response.message || \"Message sent successfully!\",\n };\n }\n\n return {\n success: false,\n message: response?.message || \"Failed to send message\",\n };\n } catch (error) {\n console.error(\"Contact form submission error:\", error);\n return {\n success: false,\n message: \"Network error. Please try again.\",\n };\n }\n}\n\n// ============================================================================\n// HELPER\n// ============================================================================\n\nfunction replacePlaceholders(\n text: string,\n productName: string,\n email: string,\n): string {\n return text.replace(/{productName}/g, productName).replace(/{email}/g, email);\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function ContactPage({\n productName,\n recaptchaSiteKey,\n contactEmail,\n contactPhone,\n officeAddress,\n responseTime = \"We typically respond within 24 hours\",\n heroTitle = \"Get in Touch\",\n heroDescription = \"Have questions about {productName}? We're here to help. Reach out to our team and we'll get back to you as soon as possible.\",\n additionalOptions = [\n {\n title: \"Sales Inquiries\",\n description:\n \"Ready to see {productName} in action? Our sales team is here to help.\",\n buttonText: \"Contact Sales\",\n buttonLink: `mailto:${contactEmail}`,\n },\n {\n title: \"Technical Support\",\n description:\n \"Need help with your {productName} setup? Our support team is ready.\",\n buttonText: \"Get Support\",\n buttonLink: `mailto:${contactEmail}`,\n },\n {\n title: \"Partnership\",\n description:\n \"Interested in partnering with {productName}? Let's explore opportunities.\",\n buttonText: \"Partner With Us\",\n buttonLink: `mailto:${contactEmail}`,\n },\n ],\n seo,\n}: ContactPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const displayName = productName ?? config.productId;\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ?? config.recaptchaSiteKey ?? \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<SubmitStatus>(\"idle\");\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Get reCAPTCHA token (skip validation when no site key is configured)\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n setIsSubmitting(true);\n setSubmitStatus(\"idle\");\n\n // Store form reference before async operations\n const form = e.currentTarget;\n\n try {\n const formData = new FormData(form);\n\n const contactData: ContactFormData = {\n firstName: formData.get(\"firstName\") as string,\n lastName: formData.get(\"lastName\") as string,\n email: formData.get(\"email\") as string,\n company: formData.get(\"company\") as string,\n subject: formData.get(\"subject\") as string,\n message: formData.get(\"message\") as string,\n recaptchaToken,\n };\n\n const result = await submitContactForm(\n client,\n contactData,\n config.productId,\n );\n\n if (result.success) {\n setSubmitStatus(\"success\");\n toast.success(\n result.message ??\n `Thank you for contacting ${displayName}. We'll get back to you within 24 hours.`,\n );\n\n // Reset form\n if (form) {\n form.reset();\n }\n // Reset reCAPTCHA\n recaptchaRef.current?.reset();\n } else {\n setSubmitStatus(\"error\");\n toast.error(\n result.message ?? \"Failed to send message. Please try again.\",\n );\n recaptchaRef.current?.reset();\n }\n } catch (error) {\n console.error(\"Error submitting form:\", error);\n setSubmitStatus(\"error\");\n toast.error(\"Failed to send message. Please try again later.\");\n recaptchaRef.current?.reset();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <div className=\"w-full\">\n {seo && (\n <PageHead\n title={\n seo.title ?? `Contact ${displayName} - Get in Touch With Our Team`\n }\n description={\n seo.description ??\n `Ready to transform your business? Contact our team for sales inquiries, technical support, or partnership opportunities. We're here to help you succeed.`\n }\n productName={displayName}\n keywords={\n seo.keywords ??\n `contact ${displayName.toLowerCase()}, sales inquiries, customer support, technical support, partnership opportunities, get in touch`\n }\n image={seo.image ?? \"/og-image-contact.png\"}\n url={seo.url}\n />\n )}\n\n {/* Hero Section */}\n <section className=\"bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6\">\n {heroTitle}\n </h1>\n <p className=\"text-lg sm:text-xl text-muted-foreground leading-relaxed\">\n {replacePlaceholders(heroDescription, displayName, contactEmail)}\n </p>\n </div>\n </div>\n </section>\n\n {/* Contact Form and Info */}\n <section className=\"py-12 sm:py-16 md:py-20 lg:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"grid sm:grid-cols-1 lg:grid-cols-3 gap-8 sm:gap-10 lg:gap-12\">\n {/* Contact Information */}\n <div className=\"lg:col-span-1 order-2 lg:order-1\">\n <h2 className=\"text-xl sm:text-2xl font-bold mb-4 sm:mb-6\">\n Contact Information\n </h2>\n\n <div className=\"space-y-4 sm:space-y-6\">\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Mail className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Email\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base break-all\">\n {contactEmail}\n </p>\n </div>\n </div>\n\n {contactPhone && (\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Phone className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Phone\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base\">\n {contactPhone}\n </p>\n </div>\n </div>\n )}\n\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <MapPin className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Office\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base leading-relaxed\">\n {officeAddress.line1}\n <br />\n {officeAddress.line2}\n <br />\n {officeAddress.line3}\n <br />\n {officeAddress.country}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Clock className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Response Time\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base\">\n {responseTime}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Contact Form */}\n <div className=\"lg:col-span-2 order-1 lg:order-2\">\n <div className=\"bg-card border rounded-lg p-4 sm:p-6 md:p-8\">\n <h2 className=\"text-xl sm:text-2xl font-bold mb-4 sm:mb-6\">\n Send us a Message\n </h2>\n\n <form\n onSubmit={handleSubmit}\n className=\"space-y-4 sm:space-y-6\"\n >\n <div className=\"grid sm:grid-cols-2 gap-4 sm:gap-6\">\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"firstName\"\n className=\"text-sm sm:text-base\"\n >\n First Name *\n </Label>\n <Input\n id=\"firstName\"\n name=\"firstName\"\n required\n placeholder=\"John\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"lastName\"\n className=\"text-sm sm:text-base\"\n >\n Last Name *\n </Label>\n <Input\n id=\"lastName\"\n name=\"lastName\"\n required\n placeholder=\"Doe\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\" className=\"text-sm sm:text-base\">\n Email *\n </Label>\n <Input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n required\n placeholder=\"john@company.com\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"company\" className=\"text-sm sm:text-base\">\n Company\n </Label>\n <Input\n id=\"company\"\n name=\"company\"\n placeholder=\"Acme Inc.\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"subject\" className=\"text-sm sm:text-base\">\n Subject *\n </Label>\n <Input\n id=\"subject\"\n name=\"subject\"\n required\n placeholder=\"How can we help you?\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"message\" className=\"text-sm sm:text-base\">\n Message *\n </Label>\n <Textarea\n id=\"message\"\n name=\"message\"\n required\n placeholder=\"Tell us more about your needs...\"\n rows={5}\n className=\"text-sm sm:text-base min-h-[120px] sm:min-h-[150px] resize-y\"\n />\n </div>\n\n <div className=\"space-y-4\">\n {effectiveRecaptchaSiteKey && (\n <div className=\"flex justify-center sm:justify-start\">\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n </div>\n )}\n\n <Button\n type=\"submit\"\n size=\"lg\"\n disabled={isSubmitting}\n className=\"w-full sm:w-auto min-w-[200px]\"\n >\n {isSubmitting ? (\n \"Sending...\"\n ) : (\n <>\n Send Message <Send className=\"ml-2 h-4 w-4\" />\n </>\n )}\n </Button>\n </div>\n\n {submitStatus === \"success\" && (\n <div className=\"p-3 sm:p-4 bg-green-50 border border-green-200 rounded-lg text-green-800 mt-4\">\n <p className=\"font-medium text-sm sm:text-base\">\n Message sent successfully!\n </p>\n <p className=\"text-xs sm:text-sm mt-1\">\n Thank you for contacting {displayName}. We'll get\n back to you within 24 hours.\n </p>\n </div>\n )}\n\n {submitStatus === \"error\" && (\n <div className=\"p-3 sm:p-4 bg-red-50 border border-red-200 rounded-lg text-red-800 mt-4\">\n <p className=\"font-medium text-sm sm:text-base\">\n Failed to send message\n </p>\n <p className=\"text-xs sm:text-sm mt-1\">\n Please try again later or contact us directly at{\" \"}\n {contactEmail}\n </p>\n </div>\n )}\n </form>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Additional Contact Options */}\n <section className=\"py-12 sm:py-16 md:py-20 lg:py-24 bg-muted/30\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <h2 className=\"text-2xl sm:text-3xl font-bold text-center mb-8 sm:mb-12\">\n More Ways to Connect\n </h2>\n\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8 max-w-5xl mx-auto\">\n {additionalOptions.map((option, index) => (\n <div\n key={index}\n className=\"text-center p-4 sm:p-6 bg-card border rounded-lg\"\n >\n <h3 className=\"font-semibold text-base sm:text-lg mb-2\">\n {option.title}\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base mb-4 leading-relaxed\">\n {replacePlaceholders(\n option.description,\n displayName,\n contactEmail,\n )}\n </p>\n <Button\n variant=\"outline\"\n asChild\n className=\"text-sm sm:text-base\"\n >\n <a href={option.buttonLink}>{option.buttonText}</a>\n </Button>\n </div>\n ))}\n </div>\n </div>\n </section>\n </div>\n );\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 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\nconst PUBLIC_PRODUCT_QUERY = `\n query PublicProduct($slug: String!) {\n publicProduct(slug: $slug) {\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\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 const result = await client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY,\n { slug: config.productSlug },\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 * Newsletter Component\n * Reusable newsletter subscription component with email validation and rate limiting.\n * Uses GraphQL mutations via the WebSDKClient provider.\n *\n * @example\n * ```tsx\n * import { NewsletterPage } from '@burdenoff/website-sdk/components/newsletter'\n *\n * function Newsletter() {\n * return (\n * <NewsletterPage\n * productName=\"BigConsole\"\n * layout=\"centered\"\n * seoTitle=\"Subscribe to Newsletter\"\n * seoDescription=\"Stay updated with our latest news\"\n * seoKeywords=\"newsletter, updates, news\"\n * />\n * )\n * }\n * ```\n */\n\n\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport ReCAPTCHA from \"react-google-recaptcha\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct, useProductConfig } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\n/**\n * Newsletter page component configuration props\n */\nexport interface NewsletterPageProps {\n /**\n * Product name (used in title and branding).\n * Falls back to SDK config productId if not provided.\n */\n productName?: string;\n /**\n * Layout variant\n * @default 'centered'\n */\n layout?: \"centered\" | \"split\";\n /**\n * Rate limit attempts\n * @default 3\n */\n rateLimitAttempts?: number;\n /**\n * Rate limit window in minutes\n * @default 15\n */\n rateLimitWindowMinutes?: number;\n /**\n * Hero section heading\n * @default 'Stay Updated'\n */\n heroHeading?: string;\n /**\n * Hero section subtitle\n * @default 'Subscribe to our newsletter'\n */\n heroSubtitle?: string;\n /**\n * Hero section description\n */\n heroDescription?: string;\n /**\n * Features to display (for split layout)\n */\n features?: Array<{\n icon: React.ReactNode;\n title: string;\n description: string;\n }>;\n /**\n * Success message after subscription\n * @default 'Successfully subscribed to newsletter!'\n */\n successMessage?: string;\n /**\n * Error message on failure\n * @default 'Failed to subscribe. Please try again.'\n */\n errorMessage?: string;\n /**\n * Rate limit error message\n */\n rateLimitMessage?: string;\n /**\n * Custom CSS class for container\n */\n className?: string;\n /**\n * SEO: Page title (optional, for SEO meta tags)\n */\n seoTitle?: string;\n /**\n * SEO: Page description (optional, for SEO meta tags)\n */\n seoDescription?: string;\n /**\n * SEO: Keywords (optional, for SEO meta tags)\n */\n seoKeywords?: string;\n /**\n * SEO: OG Image URL (optional, for SEO meta tags)\n */\n seoImage?: string;\n /**\n * SEO: Canonical URL (optional, for SEO meta tags)\n */\n seoUrl?: string;\n /**\n * reCAPTCHA site key (optional, falls back to SDK config)\n */\n recaptchaSiteKey?: string;\n}\n\ninterface RateLimitState {\n attempts: number;\n resetTime: number;\n}\n\n// ============================================================================\n// VALIDATION SCHEMA\n// ============================================================================\n\nconst newsletterSchema = z.object({\n email: z.string().email(\"Please enter a valid email address\"),\n});\n\ntype NewsletterFormData = z.infer<typeof newsletterSchema>;\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst SUBSCRIBE_MUTATION = /* GraphQL */ `\n mutation Subscribe($input: SubscribeInput!) {\n subscribe(input: $input) {\n id\n email\n alreadySubscribed\n status\n subscribedAt\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function subscribeNewsletter(\n client: WebSDKClient,\n email: string,\n productId: string,\n recaptchaToken?: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n subscribe: {\n id: string;\n email: string;\n status: string;\n alreadySubscribed?: boolean;\n };\n }>(SUBSCRIBE_MUTATION, {\n input: {\n email: email.trim().toLowerCase(),\n platformProductId: productId,\n metadata: {\n source: \"website\",\n referrer: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n ...(recaptchaToken ? { recaptchaToken } : {}),\n },\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Subscription failed\";\n const code = (result.errors[0] as { extensions?: { code?: string } })\n ?.extensions?.code;\n if (\n code === \"DUPLICATE_SUBSCRIBER\" ||\n errorMsg.toLowerCase().includes(\"already subscribed\")\n ) {\n return {\n success: true,\n message: \"You are already part of this newsletter.\",\n };\n }\n return { success: false, message: errorMsg };\n }\n\n if (result.data?.subscribe?.alreadySubscribed) {\n return {\n success: true,\n message: \"You are already part of this newsletter.\",\n };\n }\n\n return { success: true };\n } catch (error) {\n console.error(\"Newsletter subscription error:\", error);\n return { success: false, message: \"Network error. Please try again.\" };\n }\n}\n\n// ============================================================================\n// RATE LIMITING (in-memory for SSR compatibility)\n// ============================================================================\n\nfunction useRateLimit(maxAttempts: number, windowMinutes: number) {\n const rateLimitRef = useRef<RateLimitState | null>(null);\n const [isLimited, setIsLimited] = useState(false);\n const [resetTime, setResetTime] = useState<Date | null>(null);\n\n useEffect(() => {\n // Check if existing rate limit has expired on mount\n const state = rateLimitRef.current;\n if (state && Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n } else if (state && state.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(state.resetTime));\n }\n }, [maxAttempts]);\n\n function recordAttempt(): boolean {\n const now = Date.now();\n const state = rateLimitRef.current;\n\n // Reset if window expired\n if (state && now > state.resetTime) {\n rateLimitRef.current = null;\n }\n\n const current = rateLimitRef.current;\n\n if (!current) {\n rateLimitRef.current = {\n attempts: 1,\n resetTime: now + windowMinutes * 60 * 1000,\n };\n return false;\n }\n\n current.attempts += 1;\n\n if (current.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(current.resetTime));\n return true;\n }\n\n return false;\n }\n\n function checkLimit(): boolean {\n const state = rateLimitRef.current;\n if (!state) return false;\n if (Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n return false;\n }\n return state.attempts >= maxAttempts;\n }\n\n return { isLimited, resetTime, recordAttempt, checkLimit };\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function NewsletterPage({\n productName,\n layout = \"centered\",\n rateLimitAttempts = 3,\n rateLimitWindowMinutes = 15,\n heroHeading = \"Stay Updated\",\n heroSubtitle = \"Subscribe to our newsletter\",\n heroDescription,\n features,\n successMessage = \"Successfully subscribed to newsletter!\",\n errorMessage = \"Failed to subscribe. Please try again.\",\n rateLimitMessage,\n className,\n seoTitle,\n seoDescription,\n seoKeywords,\n seoImage,\n seoUrl,\n recaptchaSiteKey,\n}: NewsletterPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const productConfig = useProductConfig();\n const effectiveProductId = product?.id || config.productId;\n const displayName = productName ?? product?.name ?? config.productId;\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ??\n productConfig.recaptchaSiteKey ??\n config.recaptchaSiteKey ??\n \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isLimited, resetTime, recordAttempt, checkLimit } = useRateLimit(\n rateLimitAttempts,\n rateLimitWindowMinutes,\n );\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n reset,\n } = useForm<NewsletterFormData>({\n resolver: zodResolver(newsletterSchema),\n });\n\n const onSubmit = async (data: NewsletterFormData) => {\n // Check reCAPTCHA\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n // Check rate limit\n if (checkLimit()) {\n toast.error(\n rateLimitMessage ??\n `Too many attempts. Please try again after ${resetTime?.toLocaleTimeString()}`,\n );\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const result = await subscribeNewsletter(\n client,\n data.email,\n effectiveProductId,\n recaptchaToken || undefined,\n );\n\n if (result.success) {\n if (result.message) {\n toast.info(result.message);\n } else {\n toast.success(successMessage);\n }\n reset();\n } else {\n toast.error(result.message ?? errorMessage);\n }\n\n // Record the attempt for rate limiting\n recordAttempt();\n recaptchaRef.current?.reset();\n } catch (_error) {\n toast.error(errorMessage);\n recaptchaRef.current?.reset();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const defaultFeatures = [\n {\n icon: (\n <svg\n className=\"h-6 w-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 10V3L4 14h7v7l9-11h-7z\"\n />\n </svg>\n ),\n title: \"Latest Updates\",\n description: \"Get the latest news and updates delivered to your inbox\",\n },\n {\n icon: (\n <svg\n className=\"h-6 w-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4\"\n />\n </svg>\n ),\n title: \"Exclusive Content\",\n description:\n \"Access exclusive content and insights not available elsewhere\",\n },\n {\n icon: (\n <svg\n className=\"h-6 w-6\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\"\n />\n </svg>\n ),\n title: \"Early Access\",\n description:\n \"Be the first to know about new features and product launches\",\n },\n ];\n\n const displayFeatures = features ?? defaultFeatures;\n\n return (\n <>\n {/* SEO Meta Tags */}\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription ?? heroDescription ?? heroSubtitle}\n productName={displayName}\n keywords={seoKeywords}\n image={seoImage}\n url={seoUrl}\n />\n )}\n\n <div className={className}>\n {layout === \"centered\" ? (\n // Centered Layout\n <div className=\"min-h-screen flex items-center justify-center px-4 py-12\">\n <div className=\"max-w-md w-full space-y-8\">\n {/* Header */}\n <div className=\"text-center\">\n <h1 className=\"text-4xl font-bold tracking-tight\">\n {heroHeading}\n </h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">Email address</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n {effectiveRecaptchaSiteKey && (\n <div className=\"flex justify-center\">\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n </div>\n )}\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Subscribing...\" : \"Subscribe\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground text-center\">\n By subscribing, you agree to receive emails from {displayName}.\n You can unsubscribe at any time.\n </p>\n </div>\n </div>\n ) : (\n // Split Layout\n <div className=\"min-h-screen grid lg:grid-cols-2\">\n {/* Left Column - Form */}\n <div className=\"flex items-center justify-center px-4 py-12 sm:px-6 lg:px-8\">\n <div className=\"max-w-md w-full space-y-8\">\n {/* Header */}\n <div>\n <h1 className=\"text-4xl font-bold tracking-tight\">\n {heroHeading}\n </h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\">Email address</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n {effectiveRecaptchaSiteKey && (\n <div className=\"flex justify-center sm:justify-start\">\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n </div>\n )}\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Subscribing...\" : \"Subscribe\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground\">\n By subscribing, you agree to receive emails from {displayName}\n . You can unsubscribe at any time.\n </p>\n </div>\n </div>\n\n {/* Right Column - Features */}\n <div className=\"hidden lg:flex items-center justify-center bg-muted px-4 py-12 sm:px-6 lg:px-8\">\n <div className=\"max-w-md space-y-8\">\n <h2 className=\"text-2xl font-bold\">Why Subscribe?</h2>\n <div className=\"space-y-6\">\n {displayFeatures.map((feature, index) => (\n <div key={index} className=\"flex gap-4\">\n <div className=\"flex-shrink-0 text-primary\">\n {feature.icon}\n </div>\n <div>\n <h3 className=\"font-semibold\">{feature.title}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {feature.description}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n\n// ============================================================================\n// NEWSLETTER FORM (Inline Component)\n// ============================================================================\n\nexport interface NewsletterFormProps {\n /**\n * Layout variant\n * @default 'inline'\n */\n variant?: \"inline\" | \"stacked\";\n /**\n * Show email label\n * @default false\n */\n showLabel?: boolean;\n /**\n * Show description text\n * @default false\n */\n showDescription?: boolean;\n /**\n * Description text\n * @default 'Subscribe to our newsletter for updates'\n */\n description?: string;\n /**\n * Button text\n * @default 'Subscribe'\n */\n buttonText?: string;\n /**\n * Custom CSS class\n */\n className?: string;\n /**\n * reCAPTCHA site key (optional, falls back to SDK config)\n */\n recaptchaSiteKey?: string;\n}\n\n/**\n * Lightweight newsletter subscription form for inline use (e.g., footers)\n */\nexport function NewsletterForm({\n variant = \"inline\",\n showLabel = false,\n showDescription = false,\n description = \"Subscribe to our newsletter for updates\",\n buttonText = \"Subscribe\",\n className = \"\",\n recaptchaSiteKey,\n}: NewsletterFormProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const productConfig = useProductConfig();\n const effectiveProductId = product?.id || config.productId;\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ??\n productConfig.recaptchaSiteKey ??\n config.recaptchaSiteKey ??\n \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const [email, setEmail] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (!email || !email.includes(\"@\")) {\n toast.error(\"Please enter a valid email address\");\n return;\n }\n\n // Check reCAPTCHA\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await subscribeNewsletter(\n client,\n email,\n effectiveProductId,\n recaptchaToken || undefined,\n );\n\n if (result.success) {\n if (result.message) {\n toast.info(result.message);\n } else {\n toast.success(\"Successfully subscribed!\");\n }\n setEmail(\"\");\n } else {\n toast.error(result.message ?? \"Subscription failed\");\n }\n recaptchaRef.current?.reset();\n } catch (_error) {\n toast.error(\"An error occurred. Please try again.\");\n recaptchaRef.current?.reset();\n } finally {\n setIsLoading(false);\n }\n };\n\n const isInline = variant === \"inline\";\n\n return (\n <div className={className} style={{ overflow: \"visible\" }}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <form\n onSubmit={handleSubmit}\n className={isInline ? \"flex flex-col gap-2\" : \"flex flex-col gap-2\"}\n style={{ overflow: \"visible\" }}\n >\n <div\n className={\n isInline && !effectiveRecaptchaSiteKey\n ? \"flex gap-2\"\n : \"flex flex-col gap-2\"\n }\n >\n <div\n className={\n isInline && !effectiveRecaptchaSiteKey ? \"flex-1\" : \"w-full\"\n }\n >\n {showLabel && (\n <Label htmlFor=\"newsletter-email\" className=\"text-sm mb-1 block\">\n Email\n </Label>\n )}\n <Input\n id=\"newsletter-email\"\n type=\"email\"\n placeholder=\"Enter your email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n disabled={isLoading}\n required\n className=\"w-full\"\n />\n </div>\n {!effectiveRecaptchaSiteKey && (\n <Button\n type=\"submit\"\n disabled={isLoading}\n className={isInline ? \"whitespace-nowrap\" : \"w-full\"}\n >\n {isLoading ? \"Subscribing...\" : buttonText}\n </Button>\n )}\n </div>\n {effectiveRecaptchaSiteKey && (\n <>\n <style>{`\n body > div[style*=\"position: absolute\"] > div > iframe[title*=\"recaptcha challenge\"],\n body > div:not([class]):not([id]) > div > iframe[title*=\"recaptcha\"] {\n position: fixed !important;\n top: 50% !important;\n left: 50% !important;\n transform: translate(-50%, -50%) !important;\n z-index: 99999 !important;\n }\n body > div[style*=\"position: absolute\"]:has(iframe[title*=\"recaptcha challenge\"]) {\n position: fixed !important;\n top: 0 !important;\n left: 0 !important;\n width: 100vw !important;\n height: 100vh !important;\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n z-index: 99999 !important;\n background: rgba(0,0,0,0.3) !important;\n }\n `}</style>\n <div style={{ position: \"relative\", zIndex: 50 }}>\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n size=\"compact\"\n />\n </div>\n </>\n )}\n {effectiveRecaptchaSiteKey && (\n <Button type=\"submit\" disabled={isLoading} className=\"w-full\">\n {isLoading ? \"Subscribing...\" : buttonText}\n </Button>\n )}\n </form>\n </div>\n );\n}\n","/**\n * Pricing Component\n * GraphQL-powered pricing component with quota-based features and monthly/yearly toggle\n *\n * @example\n * ```tsx\n * import { PricingPage, PricingSection } from '@burdenoff/website-sdk/components/pricing'\n *\n * // Full page with hero\n * <PricingPage\n * productName=\"BigConsole\"\n * productId=\"bigconsole-123\"\n * appLoginUrl=\"https://app.bigconsole.com/login\"\n * contactUrl=\"/contact\"\n * fallbackFeatures={{\n * basic: ['Up to 5 dashboards', '10 data sources'],\n * professional: ['Unlimited dashboards', 'API access'],\n * enterprise: ['Everything in Professional', 'Dedicated support']\n * }}\n * />\n *\n * // Embeddable section\n * <PricingSection {...props} id=\"pricing\" className=\"bg-muted/30\" />\n * ```\n */\n\n\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\n\n// ============================================================================\n// GRAPHQL QUERY\n// ============================================================================\n\nconst GET_ALL_PLANS_QUERY = `\n query GetAllPlans {\n getAllPlans {\n id\n name\n price\n currency\n currencyPrices\n duration\n features {\n id\n quotaId\n quota {\n id\n name\n limits\n }\n }\n isActive\n productID\n createdAt\n }\n }\n`;\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\ninterface PlanFeature {\n id: string;\n quotaId?: string | null;\n quota?: {\n id: string;\n name: string;\n limits?: unknown;\n } | null;\n}\n\ninterface GatewayPlan {\n id: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number> | null;\n duration: string;\n features: PlanFeature[];\n isActive: boolean;\n productID?: string | null;\n createdAt: string;\n}\n\ninterface GetAllPlansResponse {\n getAllPlans: GatewayPlan[];\n}\n\nexport interface PlanCard {\n id: string;\n name: string;\n price: number;\n currency: string;\n currencyPrices?: Record<string, number> | null;\n duration: string;\n features: Array<{\n id: string;\n quotaId?: string | null;\n quota?: {\n id: string;\n name: string;\n limits?: unknown;\n } | null;\n }>;\n isActive: boolean;\n productID?: string | null;\n}\n\ninterface CurrencyConfig {\n code: string;\n symbol: string;\n position: \"prefix\" | \"suffix\";\n}\n\ninterface PlanMetadata {\n tier: \"basic\" | \"professional\" | \"enterprise\";\n displayName: string;\n defaultDescription: string;\n popular: boolean;\n ctaText: string;\n ctaType: \"signup\" | \"contact\";\n}\n\nexport interface PricingProps {\n /**\n * Product name (used in branding and SEO)\n */\n productName?: string;\n /**\n * Product ID for GraphQL query (falls back to WebSDKConfig.productId)\n */\n productId?: string;\n /**\n * App login URL for signup CTA\n */\n appLoginUrl: string;\n /**\n * Contact page URL for enterprise CTA\n * @default '/contact'\n */\n contactUrl?: string;\n /**\n * Supported currencies\n */\n currencies?: Record<string, CurrencyConfig>;\n /**\n * Billing interval display text\n */\n billingIntervals?: Record<string, string>;\n /**\n * Plan metadata (tier info, CTA text, etc.)\n */\n planMetadata?: Record<string, Partial<PlanMetadata>>;\n /**\n * Fallback features when API doesn't provide them or is unavailable\n */\n fallbackFeatures?: {\n basic?: string[];\n professional?: string[];\n enterprise?: string[];\n };\n /**\n * Hero section heading (for PricingPage)\n * @default 'Simple, Transparent Pricing'\n */\n heroHeading?: string;\n /**\n * Hero section subtitle (for PricingPage)\n * @default \"Choose the plan that's right for you. No hidden fees, no surprises.\"\n */\n heroSubtitle?: string;\n /**\n * Section heading (for PricingSection)\n * @default 'Pricing Plans'\n */\n sectionHeading?: string;\n /**\n * Section subtitle (for PricingSection)\n * @default 'Choose the perfect plan for your needs'\n */\n sectionSubtitle?: string;\n /**\n * Custom CSS class\n */\n className?: string;\n /**\n * Section ID for anchor links\n */\n id?: string;\n /**\n * SEO: Page title (optional, for PricingPage)\n */\n seoTitle?: string;\n /**\n * SEO: Page description (optional, for PricingPage)\n */\n seoDescription?: string;\n /**\n * SEO: Keywords (optional, for PricingPage)\n */\n seoKeywords?: string;\n /**\n * SEO: OG Image URL (optional, for PricingPage)\n */\n seoImage?: string;\n /**\n * SEO: Canonical URL (optional, for PricingPage)\n */\n seoUrl?: string;\n}\n\n// ============================================================================\n// SERVICE FUNCTIONS\n// ============================================================================\n\n/**\n * Format price for display with currency symbol\n */\nfunction formatPrice(\n price: number,\n currencyCode: string = \"USD\",\n currencies?: Record<string, CurrencyConfig>,\n): string {\n const defaultCurrencies: Record<string, CurrencyConfig> = {\n USD: { code: \"USD\", symbol: \"$\", position: \"prefix\" },\n EUR: { code: \"EUR\", symbol: \"\\u20AC\", position: \"prefix\" },\n GBP: { code: \"GBP\", symbol: \"\\u00A3\", position: \"prefix\" },\n INR: { code: \"INR\", symbol: \"\\u20B9\", position: \"prefix\" },\n };\n\n const currencyMap = currencies || defaultCurrencies;\n const currency: CurrencyConfig = currencyMap[currencyCode] || {\n code: currencyCode,\n symbol: currencyCode,\n position: \"prefix\",\n };\n\n const formattedNumber = price % 1 === 0 ? price.toString() : price.toFixed(2);\n\n return currency.position === \"prefix\"\n ? `${currency.symbol}${formattedNumber}`\n : `${formattedNumber}${currency.symbol}`;\n}\n\n/**\n * Format billing interval for display\n */\nfunction formatInterval(\n duration: string,\n billingIntervals?: Record<string, string>,\n): string {\n const defaultIntervals: Record<string, string> = {\n monthly: \"/month\",\n yearly: \"/year\",\n };\n\n const intervals = billingIntervals || defaultIntervals;\n return intervals[duration] || `/${duration}`;\n}\n\n/**\n * Detect plan tier from plan name\n */\nfunction detectPlanTier(\n planName: string,\n): \"basic\" | \"professional\" | \"enterprise\" | null {\n const name = planName.toLowerCase();\n\n if (name.includes(\"basic\") || name.includes(\"starter\")) {\n return \"basic\";\n } else if (\n name.includes(\"pro\") ||\n name.includes(\"professional\") ||\n name.includes(\"premium\")\n ) {\n return \"professional\";\n } else if (name.includes(\"enterprise\") || name.includes(\"business\")) {\n return \"enterprise\";\n }\n\n return null;\n}\n\n/**\n * Get features for a specific plan tier from fallback config\n */\nfunction getFallbackFeaturesForTier(\n tier: \"basic\" | \"professional\" | \"enterprise\",\n fallbackFeatures?: {\n basic?: string[];\n professional?: string[];\n enterprise?: string[];\n },\n): string[] {\n return [...(fallbackFeatures?.[tier] || [])];\n}\n\n/**\n * Get metadata for a plan by name\n */\nfunction getMetadataForPlan(\n planName: string,\n planMetadata?: Record<string, Partial<PlanMetadata>>,\n): PlanMetadata {\n const normalizedName = planName.toLowerCase();\n\n // Try exact match first\n if (planMetadata?.[normalizedName]) {\n const meta = planMetadata[normalizedName];\n return {\n tier: meta.tier || \"basic\",\n displayName: meta.displayName || planName,\n defaultDescription: meta.defaultDescription || \"Choose this plan\",\n popular: meta.popular ?? false,\n ctaText: meta.ctaText || \"Get Started\",\n ctaType: meta.ctaType || \"signup\",\n };\n }\n\n // Try tier detection\n const tier = detectPlanTier(planName);\n if (tier) {\n return {\n tier,\n displayName: planName,\n defaultDescription: \"Choose this plan\",\n popular: tier === \"professional\",\n ctaText: tier === \"enterprise\" ? \"Contact Sales\" : \"Get Started\",\n ctaType: tier === \"enterprise\" ? \"contact\" : \"signup\",\n };\n }\n\n // Fallback\n return {\n tier: \"basic\",\n displayName: planName,\n defaultDescription: \"Choose this plan\",\n popular: false,\n ctaText: \"Get Started\",\n ctaType: \"signup\",\n };\n}\n\n/**\n * Transform quota limits to a human-readable feature string\n */\nfunction transformQuotaToFeature(quota: {\n id: string;\n name: string;\n limits?: unknown;\n}): string {\n const { name, limits } = quota;\n\n if (!limits || typeof limits !== \"object\") {\n return name;\n }\n\n const limitsObj = limits as Record<string, unknown>;\n const value = limitsObj.value;\n const unit = limitsObj.unit;\n const type = limitsObj.type;\n const description = limitsObj.description;\n\n if (type === \"number\" && typeof value === \"number\") {\n const formattedValue = value.toLocaleString();\n return `${formattedValue} ${unit || \"\"}${description ? \" - \" + description : \"\"}`.trim();\n } else if (type === \"boolean\") {\n return (typeof description === \"string\" && description) || name;\n }\n\n if (typeof value === \"number\") {\n const formattedValue = value.toLocaleString();\n return `${name}: ${formattedValue} ${unit || \"\"}`.trim();\n }\n\n return name;\n}\n\n/**\n * Extract display features from a plan's feature list\n */\nfunction extractDisplayFeatures(\n features: PlanFeature[],\n planName: string,\n fallbackFeatures?: {\n basic?: string[];\n professional?: string[];\n enterprise?: string[];\n },\n): string[] {\n // If API provides features with quotas, transform them\n const quotaFeatures = features\n .filter((f) => f.quota)\n .map((f) => transformQuotaToFeature(f.quota!));\n\n if (quotaFeatures.length > 0) {\n return quotaFeatures;\n }\n\n // Fall back to tier-based features\n const tier = detectPlanTier(planName);\n if (tier) {\n return getFallbackFeaturesForTier(tier, fallbackFeatures);\n }\n\n return [];\n}\n\n// ============================================================================\n// UI CARD TYPE (internal)\n// ============================================================================\n\ninterface DisplayPlanCard {\n id: string;\n name: string;\n description: string;\n price: string;\n priceRaw: number;\n interval: string;\n duration: string;\n features: string[];\n popular: boolean;\n ctaText: string;\n ctaLink: string;\n tier: \"basic\" | \"professional\" | \"enterprise\" | null;\n}\n\n/**\n * Transform a GatewayPlan into a display card\n */\nfunction transformToDisplayCard(\n plan: GatewayPlan,\n props: PricingProps,\n): DisplayPlanCard {\n const metadata = getMetadataForPlan(plan.name, props.planMetadata);\n\n const formattedPrice = formatPrice(\n plan.price,\n plan.currency,\n props.currencies,\n );\n const interval = formatInterval(plan.duration, props.billingIntervals);\n\n const features = extractDisplayFeatures(\n plan.features,\n plan.name,\n props.fallbackFeatures,\n );\n\n const contactUrl = props.contactUrl || \"/contact\";\n const ctaLink =\n metadata.ctaType === \"contact\" ? contactUrl : props.appLoginUrl;\n\n return {\n id: plan.id,\n name: plan.name,\n description: metadata.defaultDescription,\n price: formattedPrice,\n priceRaw: plan.price,\n interval,\n duration: plan.duration,\n features,\n popular: metadata.popular,\n ctaText: metadata.ctaText,\n ctaLink,\n tier: metadata.tier,\n };\n}\n\n// ============================================================================\n// REACT COMPONENTS\n// ============================================================================\n\n/**\n * Pricing Section Component - Embeddable\n */\nexport function PricingSection(props: PricingProps) {\n const {\n sectionHeading = \"Pricing Plans\",\n sectionSubtitle = \"Choose the perfect plan for your needs\",\n id,\n className = \"\",\n } = props;\n\n const client = useWebSDK();\n const config = useWebSDKConfig();\n\n const resolvedProductId = props.productId || config.productId;\n\n const [allPlans, setAllPlans] = useState<DisplayPlanCard[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [billingCycle, setBillingCycle] = useState<\"monthly\" | \"yearly\">(\n \"monthly\",\n );\n\n useEffect(() => {\n let cancelled = false;\n\n async function loadPlans() {\n try {\n setLoading(true);\n\n const response =\n await client.query<GetAllPlansResponse>(GET_ALL_PLANS_QUERY);\n\n if (cancelled) return;\n\n if (response.errors && response.errors.length > 0) {\n throw new Error(response.errors[0]!.message);\n }\n\n if (!response.data?.getAllPlans) {\n throw new Error(\"No plans data received\");\n }\n\n // Filter active plans by productID (client-side), transform to display cards, sort by price\n const cards = response.data.getAllPlans\n .filter(\n (plan) =>\n plan.isActive &&\n (!resolvedProductId || plan.productID === resolvedProductId),\n )\n .map((plan) => transformToDisplayCard(plan, props))\n .sort((a, b) => a.priceRaw - b.priceRaw);\n\n setAllPlans(cards);\n setError(null);\n } catch (err) {\n if (cancelled) return;\n console.error(\"Failed to load plans:\", err);\n setError(\"Unable to load pricing information. Please try again later.\");\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n loadPlans();\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- props is destructured, actual deps are client + productId\n }, [client, resolvedProductId]);\n\n // Filter plans based on selected billing cycle\n const plans = allPlans.filter((plan) =>\n billingCycle === \"monthly\"\n ? plan.duration === \"monthly\"\n : plan.duration === \"yearly\",\n );\n\n if (loading) {\n return (\n <section id={id} className={`py-12 sm:py-16 md:py-20 ${className}`}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"text-center mb-8 sm:mb-12\">\n <h2 className=\"text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4\">\n {sectionHeading}\n </h2>\n <p className=\"text-muted-foreground text-sm sm:text-base md:text-lg\">\n Loading pricing information...\n </p>\n </div>\n <div className=\"grid md:grid-cols-3 gap-6 sm:gap-8\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"bg-card border rounded-lg p-6 animate-pulse\"\n >\n <div className=\"h-6 bg-muted rounded w-1/2 mb-4\"></div>\n <div className=\"h-4 bg-muted rounded w-3/4 mb-6\"></div>\n <div className=\"h-10 bg-muted rounded w-1/3 mb-6\"></div>\n <div className=\"space-y-3 mb-6\">\n {[1, 2, 3, 4].map((j) => (\n <div key={j} className=\"h-4 bg-muted rounded\"></div>\n ))}\n </div>\n <div className=\"h-10 bg-muted rounded\"></div>\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n }\n\n if (error && plans.length === 0) {\n return (\n <section id={id} className={`py-12 sm:py-16 md:py-20 ${className}`}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"text-center\">\n <h2 className=\"text-2xl sm:text-3xl md:text-4xl font-bold mb-4\">\n {sectionHeading}\n </h2>\n <p className=\"text-muted-foreground mb-8\">{error}</p>\n <Button onClick={() => window.location.reload()}>Retry</Button>\n </div>\n </div>\n </section>\n );\n }\n\n return (\n <section id={id} className={`py-12 sm:py-16 md:py-20 ${className}`}>\n <div className=\"container mx-auto px-4 sm:px-6\">\n <div className=\"text-center mb-8 sm:mb-12\">\n <h2 className=\"text-2xl sm:text-3xl md:text-4xl font-bold mb-3 sm:mb-4\">\n {sectionHeading}\n </h2>\n <p className=\"text-muted-foreground text-sm sm:text-base md:text-lg mb-6\">\n {sectionSubtitle}\n </p>\n\n {/* Billing Cycle Toggle */}\n <div className=\"inline-flex items-center gap-3 bg-muted p-1.5 rounded-lg\">\n <button\n onClick={() => setBillingCycle(\"monthly\")}\n className={`px-6 py-2 rounded-md text-sm font-medium transition-all ${\n billingCycle === \"monthly\"\n ? \"bg-background shadow-sm text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Monthly\n </button>\n <button\n onClick={() => setBillingCycle(\"yearly\")}\n className={`px-6 py-2 rounded-md text-sm font-medium transition-all ${\n billingCycle === \"yearly\"\n ? \"bg-background shadow-sm text-foreground\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Yearly\n </button>\n </div>\n </div>\n\n <div className=\"grid md:grid-cols-3 gap-6 sm:gap-8 max-w-6xl mx-auto items-stretch\">\n {plans.map((plan) => (\n <div\n key={plan.id}\n className={`bg-card rounded-xl p-6 sm:p-8 transition-all duration-300 flex flex-col ${\n plan.popular\n ? \"border-2 border-primary shadow-xl ring-1 ring-primary/20\"\n : \"border hover:shadow-lg hover:border-primary/50\"\n }`}\n >\n <div className=\"text-center mb-6\">\n {plan.popular && (\n <span className=\"inline-block bg-primary text-primary-foreground px-4 py-1 rounded-full text-xs font-semibold mb-3\">\n Most Popular\n </span>\n )}\n <h3 className=\"text-xl sm:text-2xl font-bold mb-2\">\n {plan.name}\n </h3>\n <p className=\"text-muted-foreground text-sm\">\n {plan.description}\n </p>\n </div>\n\n <div className=\"text-center mb-8\">\n <div className=\"flex items-baseline justify-center gap-1\">\n <span className=\"text-4xl sm:text-5xl font-bold\">\n {plan.price}\n </span>\n <span className=\"text-muted-foreground text-lg\">\n {plan.interval}\n </span>\n </div>\n </div>\n\n <ul className=\"space-y-3 mb-8 flex-1\">\n {plan.features.map((feature, index) => (\n <li key={index} className=\"text-sm flex items-start gap-2\">\n <span className=\"text-primary mt-0.5 flex-shrink-0\">\n ✓\n </span>\n <span>{feature}</span>\n </li>\n ))}\n </ul>\n\n {plan.ctaLink.startsWith(\"/\") ? (\n <Button\n className=\"w-full h-11\"\n variant={plan.popular ? \"default\" : \"outline\"}\n size=\"lg\"\n asChild\n >\n <a\n href={plan.ctaLink}\n onClick={() =>\n window.scrollTo({ top: 0, behavior: \"smooth\" })\n }\n >\n {plan.ctaText}\n </a>\n </Button>\n ) : (\n <Button\n className=\"w-full h-11\"\n variant={plan.popular ? \"default\" : \"outline\"}\n size=\"lg\"\n asChild\n >\n <a\n href={plan.ctaLink}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {plan.ctaText}\n </a>\n </Button>\n )}\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n}\n\n/**\n * Pricing Page Component - Full Page with Hero\n */\nexport function PricingPage(props: PricingProps) {\n const {\n productName,\n heroHeading = \"Simple, Transparent Pricing\",\n heroSubtitle = \"Choose the plan that's right for you. No hidden fees, no surprises.\",\n seoTitle,\n seoDescription,\n seoKeywords,\n seoImage,\n seoUrl,\n } = props;\n\n return (\n <div className=\"w-full\">\n {/* SEO Meta Tags */}\n {seoTitle && (\n <PageHead\n title={seoTitle}\n description={seoDescription || heroSubtitle}\n productName={productName}\n keywords={seoKeywords}\n image={seoImage}\n url={seoUrl}\n />\n )}\n\n {/* Hero Section */}\n <section className=\"bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6\">\n {heroHeading}\n </h1>\n <p className=\"text-lg sm:text-xl text-muted-foreground leading-relaxed\">\n {heroSubtitle}\n </p>\n </div>\n </div>\n </section>\n\n {/* Pricing Section */}\n <PricingSection {...props} />\n </div>\n );\n}\n","/**\n * Waitlist Components\n * Full-page and inline waitlist signup forms using GraphQL via WebSDKClient.\n *\n * @example\n * ```tsx\n * // Full-page waitlist\n * import { WaitlistPage } from '@burdenoff/website-sdk/components/waitlist'\n *\n * <WaitlistPage\n * productName=\"BigConsole\"\n * heroTitle=\"Join the Waitlist\"\n * heroSubtitle=\"Be among the first to try BigConsole\"\n * />\n *\n * // Inline waitlist form (for hero sections / footers)\n * import { WaitlistForm } from '@burdenoff/website-sdk/components/waitlist'\n *\n * <WaitlistForm variant=\"inline\" buttonText=\"Join Waitlist\" />\n * ```\n */\n\n\"use client\";\n\nimport { useState, useRef } from \"react\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Textarea } from \"../ui/textarea\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\nexport interface WaitlistPageProps {\n /** Product name. Falls back to SDK config productId if not provided. */\n productName?: string;\n /** Hero title */\n heroTitle?: string;\n /** Hero subtitle */\n heroSubtitle?: string;\n /** Hero description */\n heroDescription?: string;\n /** Message shown on successful signup */\n successMessage?: string;\n /** Message shown on error */\n errorMessage?: string;\n /** Custom CSS class for container */\n className?: string;\n /** SEO metadata */\n seo?: {\n title?: string;\n description?: string;\n keywords?: string;\n image?: string;\n url?: string;\n };\n}\n\nexport interface WaitlistFormProps {\n /** Layout variant */\n variant?: \"inline\" | \"stacked\";\n /** Show email label */\n showLabel?: boolean;\n /** Show description text */\n showDescription?: boolean;\n /** Whether to show the name field */\n showNameField?: boolean;\n /** Description text */\n description?: string;\n /** Button text */\n buttonText?: string;\n /** Custom CSS class */\n className?: string;\n}\n\ninterface RateLimitState {\n attempts: number;\n resetTime: number;\n}\n\n// ============================================================================\n// VALIDATION SCHEMAS\n// ============================================================================\n\nconst waitlistPageSchema = z.object({\n name: z.string().min(1, \"Name is required\"),\n email: z.string().email(\"Please enter a valid email address\"),\n company: z.string().optional(),\n reason: z.string().optional(),\n});\n\ntype WaitlistPageFormData = z.infer<typeof waitlistPageSchema>;\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst JOIN_WAITLIST_MUTATION = /* GraphQL */ `\n mutation JoinWaitlist($input: JoinWaitlistInput!) {\n joinWaitlist(input: $input) {\n id\n email\n name\n status\n createdAt\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function joinWaitlist(\n client: WebSDKClient,\n data: {\n email: string;\n name?: string;\n company?: string;\n reason?: string;\n },\n productId: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n joinWaitlist: {\n id: string;\n email: string;\n name: string | null;\n status: string;\n createdAt: string;\n };\n }>(JOIN_WAITLIST_MUTATION, {\n input: {\n email: data.email.trim().toLowerCase(),\n platformProductId: productId,\n name: data.name?.trim() || undefined,\n company: data.company?.trim() || undefined,\n reason: data.reason?.trim() || undefined,\n context: {\n source: \"website\",\n referrer: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n },\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Failed to join waitlist\";\n if (errorMsg.toLowerCase().includes(\"already\")) {\n return {\n success: false,\n message: \"You are already on the waitlist!\",\n };\n }\n return { success: false, message: errorMsg };\n }\n\n return { success: true, message: \"You have been added to the waitlist!\" };\n } catch (error) {\n console.error(\"Waitlist signup error:\", error);\n return { success: false, message: \"Network error. Please try again.\" };\n }\n}\n\n// ============================================================================\n// RATE LIMITING (in-memory for SSR compatibility)\n// ============================================================================\n\nfunction useRateLimit(maxAttempts: number, windowMinutes: number) {\n const rateLimitRef = useRef<RateLimitState | null>(null);\n const [isLimited, setIsLimited] = useState(false);\n const [resetTime, setResetTime] = useState<Date | null>(null);\n\n function recordAttempt(): boolean {\n const now = Date.now();\n const state = rateLimitRef.current;\n\n // Reset if window expired\n if (state && now > state.resetTime) {\n rateLimitRef.current = null;\n }\n\n const current = rateLimitRef.current;\n\n if (!current) {\n rateLimitRef.current = {\n attempts: 1,\n resetTime: now + windowMinutes * 60 * 1000,\n };\n return false;\n }\n\n current.attempts += 1;\n\n if (current.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(current.resetTime));\n return true;\n }\n\n return false;\n }\n\n function checkLimit(): boolean {\n const state = rateLimitRef.current;\n if (!state) return false;\n if (Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n return false;\n }\n return state.attempts >= maxAttempts;\n }\n\n return { isLimited, resetTime, recordAttempt, checkLimit };\n}\n\n// ============================================================================\n// WAITLIST PAGE (Full-page component)\n// ============================================================================\n\nexport function WaitlistPage({\n productName,\n heroTitle = \"Join the Waitlist\",\n heroSubtitle = \"Be among the first to experience what's coming next\",\n heroDescription,\n successMessage = \"You have been added to the waitlist!\",\n errorMessage = \"Failed to join waitlist. Please try again.\",\n className,\n seo,\n}: WaitlistPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const {\n product,\n loading: productLoading,\n error: productError,\n hasProvider,\n } = useProduct();\n const displayName = productName ?? product?.name ?? config.productId;\n const productStatus = product?.status;\n const canCheckStatus = Boolean(config.productSlug);\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isLimited, resetTime, recordAttempt, checkLimit } = useRateLimit(\n 3,\n 15,\n );\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n reset,\n } = useForm<WaitlistPageFormData>({\n resolver: zodResolver(waitlistPageSchema),\n });\n\n if (canCheckStatus && !hasProvider) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Product status checks require <code>ProductProvider</code> to be\n mounted. Please update your integration configuration.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n if (canCheckStatus && productLoading) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Loading…\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Fetching product status.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n if (canCheckStatus && (productError || !productStatus)) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n We can’t confirm waitlist availability right now. Please try again\n later.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n // If product is already available, show \"already available\" instead of waitlist form\n if (\n canCheckStatus &&\n (productStatus === \"ACTIVE\" || productStatus === \"RELEASED\")\n ) {\n const appUrl = product?.appUrl || product?.website || \"#\";\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n {displayName} is now available!\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Great news — {displayName} is open to everyone. Sign up or log in\n to get started.\n </p>\n <Button size=\"lg\" asChild>\n <a href={appUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Get Started\n </a>\n </Button>\n </div>\n </section>\n </div>\n );\n }\n\n // If product is DRAFT or COMING_SOON, don't show waitlist form\n if (\n canCheckStatus &&\n (productStatus === \"DRAFT\" || productStatus === \"COMING_SOON\")\n ) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Coming Soon\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n {displayName} is not yet accepting waitlist signups. Check back\n soon!\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n // Defensive: if backend introduces a new status we don't recognize, don't render a signup form.\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n {displayName} is not accepting waitlist signups right now.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n const onSubmit = async (data: WaitlistPageFormData) => {\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n toast.error(\"This product is not accepting waitlist signups right now.\");\n return;\n }\n\n if (checkLimit()) {\n toast.error(\n `Too many attempts. Please try again after ${resetTime?.toLocaleTimeString()}`,\n );\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const result = await joinWaitlist(client, data, config.productId);\n\n if (result.success) {\n toast.success(result.message ?? successMessage);\n reset();\n } else {\n toast.error(result.message ?? errorMessage);\n }\n\n recordAttempt();\n } catch (_error) {\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <>\n {seo && (\n <PageHead\n title={seo.title ?? `Join the Waitlist - ${displayName}`}\n description={seo.description ?? heroDescription ?? heroSubtitle}\n productName={displayName}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n\n <div className={className}>\n <div className=\"min-h-screen flex items-center justify-center px-4 py-12\">\n <div className=\"max-w-lg w-full space-y-8\">\n {/* Hero */}\n <div className=\"text-center\">\n <h1 className=\"text-4xl font-bold tracking-tight\">{heroTitle}</h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-5\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-name\">Name *</Label>\n <Input\n id=\"waitlist-name\"\n type=\"text\"\n placeholder=\"Your name\"\n disabled={isSubmitting || isLimited}\n {...register(\"name\")}\n />\n {errors.name && (\n <p className=\"text-sm text-destructive\">\n {errors.name.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-email\">Email *</Label>\n <Input\n id=\"waitlist-email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-company\">Company</Label>\n <Input\n id=\"waitlist-company\"\n type=\"text\"\n placeholder=\"Your company (optional)\"\n disabled={isSubmitting || isLimited}\n {...register(\"company\")}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-reason\">Why are you interested?</Label>\n <Textarea\n id=\"waitlist-reason\"\n placeholder=\"Tell us what excites you about the product (optional)\"\n rows={3}\n disabled={isSubmitting || isLimited}\n className=\"resize-y\"\n {...register(\"reason\")}\n />\n </div>\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Joining...\" : \"Join Waitlist\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground text-center\">\n By joining the waitlist, you agree to receive updates from{\" \"}\n {displayName}. We respect your privacy and will never share your\n information.\n </p>\n </div>\n </div>\n </div>\n </>\n );\n}\n\n// ============================================================================\n// WAITLIST FORM (Inline Component)\n// ============================================================================\n\n/**\n * Lightweight inline waitlist signup form for hero sections, footers, etc.\n */\nexport function WaitlistForm({\n variant = \"inline\",\n showLabel = false,\n showDescription = false,\n showNameField = false,\n description = \"Join our waitlist to get early access\",\n buttonText = \"Join Waitlist\",\n className = \"\",\n}: WaitlistFormProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const {\n product,\n loading: productLoading,\n error: productError,\n hasProvider,\n } = useProduct();\n const productStatus = product?.status;\n const canCheckStatus = Boolean(config.productSlug);\n\n const [email, setEmail] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n toast.error(\"This product is not accepting waitlist signups right now.\");\n return;\n }\n\n if (!email || !email.includes(\"@\")) {\n toast.error(\"Please enter a valid email address\");\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await joinWaitlist(\n client,\n { email, name: name || undefined },\n config.productId,\n );\n\n if (result.success) {\n toast.success(result.message ?? \"You have been added to the waitlist!\");\n setEmail(\"\");\n setName(\"\");\n } else {\n toast.error(result.message ?? \"Failed to join waitlist\");\n }\n } catch (_error) {\n toast.error(\"An error occurred. Please try again.\");\n } finally {\n setIsLoading(false);\n }\n };\n\n const isInline = variant === \"inline\";\n\n if (canCheckStatus && !hasProvider) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">\n Product status checks require <code>ProductProvider</code> to be\n mounted.\n </p>\n </div>\n );\n }\n\n if (canCheckStatus && productLoading) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">Loading waitlist…</p>\n </div>\n );\n }\n\n if (canCheckStatus && (productError || productStatus !== \"WAITLIST\")) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">\n Waitlist signups are not available right now.\n </p>\n </div>\n );\n }\n\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <form\n onSubmit={handleSubmit}\n className={isInline ? \"flex gap-2\" : \"flex flex-col gap-2\"}\n >\n {showNameField && (\n <div className={isInline ? \"flex-1\" : \"w-full\"}>\n {showLabel && (\n <Label\n htmlFor=\"waitlist-inline-name\"\n className=\"text-sm mb-1 block\"\n >\n Name\n </Label>\n )}\n <Input\n id=\"waitlist-inline-name\"\n type=\"text\"\n placeholder=\"Your name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n disabled={isLoading}\n className=\"w-full\"\n />\n </div>\n )}\n <div className={isInline ? \"flex-1\" : \"w-full\"}>\n {showLabel && (\n <Label\n htmlFor=\"waitlist-inline-email\"\n className=\"text-sm mb-1 block\"\n >\n Email\n </Label>\n )}\n <Input\n id=\"waitlist-inline-email\"\n type=\"email\"\n placeholder=\"Enter your email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n disabled={isLoading}\n required\n className=\"w-full\"\n />\n </div>\n <Button\n type=\"submit\"\n disabled={isLoading}\n className={isInline ? \"whitespace-nowrap\" : \"w-full\"}\n >\n {isLoading ? \"Joining...\" : buttonText}\n </Button>\n </form>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\nimport { toast } from \"sonner\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst UNSUBSCRIBE_MUTATION = /* GraphQL */ `\n mutation PublicUnsubscribeByToken($token: String!) {\n publicUnsubscribeByToken(token: $token)\n }\n`;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UnsubscribePageProps {\n productName?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n resubscribeUrl?: string;\n successMessage?: string;\n errorMessage?: string;\n}\n\ntype UnsubscribeState =\n | \"loading\"\n | \"confirming\"\n | \"processing\"\n | \"success\"\n | \"error\"\n | \"invalid\";\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function UnsubscribePage({\n productName,\n className = \"\",\n seoTitle = \"Unsubscribe from Newsletter\",\n seoDescription = \"Manage your newsletter subscription preferences.\",\n resubscribeUrl,\n successMessage = \"You have been successfully unsubscribed from our newsletter.\",\n errorMessage = \"Something went wrong. Please try again or contact support.\",\n}: UnsubscribePageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const displayName = productName ?? config.productId;\n\n const [state, setState] = useState<UnsubscribeState>(\"loading\");\n const [error, setError] = useState<string>(\"\");\n const [token, setToken] = useState<string>(\"\");\n const [successCopy, setSuccessCopy] = useState<string>(successMessage);\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const t = params.get(\"token\");\n if (t) {\n setToken(t);\n setState(\"confirming\");\n } else {\n setState(\"invalid\");\n }\n }, []);\n\n const handleUnsubscribe = async () => {\n if (!token) return;\n\n setState(\"processing\");\n\n try {\n const result = await client.mutate<{\n publicUnsubscribeByToken: boolean;\n }>(UNSUBSCRIBE_MUTATION, { token });\n\n if (result.errors?.length) {\n const errMsg = result.errors[0]?.message ?? errorMessage;\n const code = (result.errors[0] as { extensions?: { code?: string } })\n ?.extensions?.code;\n\n if (code === \"ALREADY_UNSUBSCRIBED\") {\n toast.info(\"You are already unsubscribed from this newsletter.\");\n setSuccessCopy(\"You were already unsubscribed from this newsletter.\");\n setState(\"success\");\n return;\n } else if (code === \"UNSUBSCRIBE_TOKEN_EXPIRED\") {\n setError(\n \"This unsubscribe link has expired. Please contact support.\",\n );\n } else if (code === \"INVALID_UNSUBSCRIBE_TOKEN\") {\n setState(\"invalid\");\n return;\n } else {\n setError(errMsg);\n }\n setState(\"error\");\n return;\n }\n\n if (result.data?.publicUnsubscribeByToken) {\n setSuccessCopy(successMessage);\n setState(\"success\");\n toast.success(\"Successfully unsubscribed\");\n } else {\n setError(errorMessage);\n setState(\"error\");\n }\n } catch {\n setError(errorMessage);\n setState(\"error\");\n }\n };\n\n return (\n <div\n className={className}\n style={{\n minHeight: \"60vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"6rem 1rem 4rem\",\n }}\n >\n <PageHead title={seoTitle} description={seoDescription} />\n\n <div className=\"max-w-md w-full text-center\">\n {/* Loading */}\n {state === \"loading\" && (\n <div className=\"animate-pulse\">\n <div className=\"h-8 w-48 bg-muted rounded mx-auto mb-4\" />\n <div className=\"h-4 w-64 bg-muted rounded mx-auto\" />\n </div>\n )}\n\n {/* Confirm */}\n {state === \"confirming\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-amber-100 dark:bg-amber-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-amber-600 dark:text-amber-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribe from Newsletter\n </h1>\n <p className=\"text-muted-foreground mb-8\">\n Are you sure you want to unsubscribe from {displayName}{\" \"}\n newsletter? You will no longer receive updates and news from us.\n </p>\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\n <Button\n onClick={handleUnsubscribe}\n variant=\"destructive\"\n className=\"px-8\"\n >\n Yes, Unsubscribe\n </Button>\n {resubscribeUrl && (\n <Button\n variant=\"outline\"\n onClick={() => {\n window.location.href = resubscribeUrl;\n }}\n className=\"px-8\"\n >\n Cancel\n </Button>\n )}\n </div>\n </div>\n )}\n\n {/* Processing */}\n {state === \"processing\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-muted flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-muted-foreground animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribing...\n </h1>\n <p className=\"text-muted-foreground\">\n Please wait while we process your request.\n </p>\n </div>\n )}\n\n {/* Success */}\n {state === \"success\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-green-600 dark:text-green-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Successfully Unsubscribed\n </h1>\n <p className=\"text-muted-foreground mb-8\">{successCopy}</p>\n {resubscribeUrl && (\n <p className=\"text-sm text-muted-foreground\">\n Changed your mind?{\" \"}\n <a\n href={resubscribeUrl}\n className=\"text-primary underline hover:no-underline\"\n >\n Resubscribe\n </a>\n </p>\n )}\n </div>\n )}\n\n {/* Error */}\n {state === \"error\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribe Failed\n </h1>\n <p className=\"text-muted-foreground mb-8\">{error}</p>\n <Button onClick={() => setState(\"confirming\")} variant=\"outline\">\n Try Again\n </Button>\n </div>\n )}\n\n {/* Invalid / No Token */}\n {state === \"invalid\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Invalid Unsubscribe Link\n </h1>\n <p className=\"text-muted-foreground\">\n This unsubscribe link is invalid or missing. If you want to\n unsubscribe, please use the link from your newsletter email.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Rybbit Analytics Component\n *\n * Injects the Rybbit tracking script into the page head.\n * Works with both Vite (CSR) and Next.js (SSR/CSR) applications.\n *\n * @example\n * ```tsx\n * // In your app layout or root component\n * import { RybbitAnalytics } from '@burdenoff/website-sdk/analytics'\n *\n * function App() {\n * return (\n * <>\n * <RybbitAnalytics siteId=\"1\" />\n * <Router>...</Router>\n * </>\n * )\n * }\n * ```\n */\n\"use client\";\n\nimport { useEffect } from \"react\";\n\nexport interface RybbitAnalyticsProps {\n /**\n * Rybbit site ID (obtained from the Rybbit dashboard)\n */\n siteId: string;\n\n /**\n * Rybbit script URL (defaults to the self-hosted instance)\n * @default \"https://analytics.burdenoff.com/api/script.js\"\n */\n scriptUrl?: string;\n\n /**\n * Whether to enable tracking (useful for disabling in development)\n * @default true\n */\n enabled?: boolean;\n}\n\n/**\n * RybbitAnalytics - Embeds the Rybbit analytics tracking script.\n *\n * The script is loaded asynchronously with `defer` to avoid blocking page load.\n * It automatically tracks page views and user interactions.\n *\n * In development mode (when `enabled` is false), no script is loaded.\n */\nexport function RybbitAnalytics({\n siteId,\n scriptUrl = \"https://analytics.burdenoff.com/api/script.js\",\n enabled = true,\n}: RybbitAnalyticsProps) {\n useEffect(() => {\n if (!enabled || !siteId) return;\n\n // Check if script already exists\n const existingScript = document.querySelector(\n `script[data-site-id=\"${siteId}\"]`,\n );\n if (existingScript) return;\n\n // Create and inject the script\n const script = document.createElement(\"script\");\n script.src = scriptUrl;\n script.defer = true;\n script.setAttribute(\"data-site-id\", siteId);\n document.head.appendChild(script);\n\n // Cleanup on unmount\n return () => {\n const scriptToRemove = document.querySelector(\n `script[data-site-id=\"${siteId}\"]`,\n );\n if (scriptToRemove) {\n document.head.removeChild(scriptToRemove);\n }\n };\n }, [siteId, scriptUrl, enabled]);\n\n // This component renders nothing - it only manages the script tag\n return null;\n}\n","/**\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\";\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}\n\nexport interface ContentPageListData {\n items: Array<{\n id: string;\n title: string;\n slug: string;\n lastUpdated: string;\n }>;\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 }\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 }\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 }\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 [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 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: config.productId,\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, config.productId, 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 * Simple content renderer component.\n * Renders markdown content as HTML (assumes pre-rendered HTML or plain text).\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 === \"html\" || format === \"markdown\") {\n // For both HTML and markdown, we render as HTML\n // (markdown should be pre-rendered to HTML by the backend)\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"]}
|