@nozle-js/react 0.5.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -304
- package/dist/index.cjs +400 -1909
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +122 -295
- package/dist/index.d.ts +122 -295
- package/dist/index.js +400 -1899
- package/dist/index.js.map +1 -1
- package/package.json +11 -7
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider.tsx","../src/hooks/use-can.ts","../src/hooks/use-usage.ts","../src/hooks/use-credits.ts","../src/components/billing/BillingPortalProvider.tsx","../src/components/pricing/PricingTable.tsx","../src/components/pricing/PlanCard.tsx","../src/components/pricing/PlanComparison.tsx","../src/components/billing/CheckoutButton.tsx","../src/components/billing/Checkout.tsx","../src/components/billing/UpgradeModal.tsx","../src/components/billing/UpgradeButton.tsx","../src/components/billing/CreditTopUpButton.tsx","../src/components/gates/FeatureGate.tsx","../src/components/gates/UsageGate.tsx","../src/components/gates/PlanGate.tsx","../src/components/gates/UpgradePrompt.tsx","../src/components/gates/LockedOverlay.tsx","../src/components/usage/UsageMeter.tsx","../src/components/usage/UsageDashboard.tsx","../src/components/usage/UsageAlert.tsx","../src/components/billing/CreditBalance.tsx","../src/components/billing/CreditHistory.tsx","../src/components/billing/PlanBadge.tsx","../src/components/billing/CurrentPlan.tsx","../src/components/billing/InvoiceList.tsx","../src/components/billing/BillingPortal.tsx","../src/components/billing/PaymentMethodDisplay.tsx","../src/components/billing/CancelSubscriptionButton.tsx"],"names":["createContext","useMemo","useState","useEffect","React","useContext","Centrifuge","jsx","jsxs","useStripe","useElements","PaymentElement","loadStripe","Elements","Fragment","formatDate"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useEffect, useState, useMemo, type ReactNode } from 'react';\n\nexport interface CanResult {\n allowed: boolean;\n remaining: number | null;\n limit: number | null;\n used: number;\n error?: string | null;\n}\n\nexport interface NozleClient {\n apiKey: string;\n baseUrl: string;\n fetch(path: string, init?: RequestInit): Promise<Response>;\n can(customerId: string, feature: string): Promise<CanResult>;\n}\n\nfunction createClient(apiKey: string, baseUrl: string): NozleClient {\n const base = baseUrl.replace(/\\/+$/, '');\n\n async function apiFetch(path: string, init?: RequestInit): Promise<Response> {\n return fetch(`${base}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n\n return {\n apiKey,\n baseUrl: base,\n fetch: apiFetch,\n async can(customerId: string, feature: string): Promise<CanResult> {\n const res = await apiFetch(`/api/v1/can?customer_id=${encodeURIComponent(customerId)}&feature=${encodeURIComponent(feature)}`);\n if (!res.ok) return { allowed: false, remaining: null, limit: null, used: 0 };\n return res.json();\n },\n };\n}\n\nexport interface BillingContextValue {\n client: NozleClient | null;\n workspaceId: string;\n centrifugoUrl: string;\n centrifugoToken: string | null;\n}\n\nexport const BillingContext = createContext<BillingContextValue>({\n client: null,\n workspaceId: '',\n centrifugoUrl: '',\n centrifugoToken: null,\n});\n\nexport interface BillingProviderProps {\n apiKey: string;\n baseUrl?: string;\n workspaceId?: string;\n centrifugoUrl?: string;\n children: ReactNode;\n}\n\nexport function BillingProvider({\n apiKey,\n baseUrl = 'https://api.nozle.app',\n workspaceId = '',\n centrifugoUrl,\n children,\n}: BillingProviderProps): React.ReactElement {\n const client = useMemo(() => createClient(apiKey, baseUrl), [apiKey, baseUrl]);\n const [centrifugoToken, setCentrifugoToken] = useState<string | null>(null);\n\n const resolvedCentrifugoUrl =\n centrifugoUrl ??\n (typeof process !== 'undefined' ? (process.env['NEXT_PUBLIC_CENTRIFUGO_URL'] ?? '') : '');\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchCentrifugoToken(): Promise<void> {\n try {\n const response = await client.fetch('/api/v1/auth/centrifugo-token');\n if (!response.ok) return;\n const data = await response.json();\n if (!cancelled && data.token) {\n setCentrifugoToken(data.token);\n }\n } catch {\n // Best-effort: centrifugo is optional for real-time updates\n }\n }\n\n void fetchCentrifugoToken();\n return () => { cancelled = true; };\n }, [client]);\n\n const contextValue: BillingContextValue = {\n client,\n workspaceId,\n centrifugoUrl: resolvedCentrifugoUrl,\n centrifugoToken,\n };\n\n return React.createElement(BillingContext.Provider, { value: contextValue }, children);\n}\n\nexport function useBillingContext(): BillingContextValue {\n return useContext(BillingContext);\n}\n\nexport function useNozleClient(): NozleClient {\n const { client } = useBillingContext();\n if (!client) throw new Error('useNozleClient must be used within <BillingProvider>');\n return client;\n}\n","/**\n * useCan hook — check whether a customer can use a feature.\n * SDK-03: Calls client.can() for initial state, then subscribes to Centrifugo\n * workspace:{id}:entitlements channel for live updates.\n *\n * CONTEXT.md hard requirement: NO setInterval polling — Centrifugo WebSocket only.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { Centrifuge } from \"centrifuge\";\nimport { useBillingContext } from '../provider.js';\n\nexport interface CanState {\n allowed: boolean;\n remaining: number | null;\n limit: number | null;\n loading: boolean;\n error: string | null;\n}\n\nconst initialState: CanState = {\n allowed: false,\n remaining: null,\n limit: null,\n loading: true,\n error: null,\n};\n\ninterface EntitlementPublication {\n customerId?: string;\n customer_id?: string;\n featureKey?: string;\n feature_key?: string;\n allowed?: boolean;\n remaining?: number;\n limit?: number;\n}\n\n/**\n * Check whether a customer is entitled to a feature.\n * Subscribes to Centrifugo workspace:{workspaceId}:entitlements channel for live updates.\n * No polling — WebSocket only per CONTEXT.md locked decision.\n *\n * @param customerId - Customer ID to check entitlement for\n * @param featureKey - Feature key to check\n * @returns CanState with allowed, remaining, limit, loading, error\n */\nexport function useCan(customerId: string, featureKey: string): CanState {\n const { client, workspaceId, centrifugoUrl, centrifugoToken } =\n useBillingContext();\n const [state, setState] = useState<CanState>(initialState);\n\n // Initial entitlement check via client.can()\n useEffect(() => {\n if (!client) {\n setState({\n ...initialState,\n loading: false,\n error: \"No client in context\",\n });\n return;\n }\n\n let cancelled = false;\n setState(initialState);\n\n async function checkEntitlement(): Promise<void> {\n try {\n const result = await client!.can(customerId, featureKey);\n if (!cancelled) {\n setState({\n allowed: result.allowed,\n remaining: result.remaining,\n limit: result.limit,\n loading: false,\n error: result.error ?? null,\n });\n }\n } catch (err: unknown) {\n if (!cancelled) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n setState({\n allowed: false,\n remaining: null,\n limit: null,\n loading: false,\n error: message,\n });\n }\n }\n }\n\n void checkEntitlement();\n\n return () => {\n cancelled = true;\n };\n }, [client, customerId, featureKey]);\n\n // Centrifugo subscription for live updates\n // CONTEXT.md hard requirement: Centrifugo WebSocket only, no setInterval\n useEffect(() => {\n if (!centrifugoToken || !centrifugoUrl || !workspaceId) {\n return;\n }\n\n const cf = new Centrifuge(centrifugoUrl, {\n token: centrifugoToken,\n });\n\n const channel = `workspace:${workspaceId}:entitlements`;\n const sub = cf.newSubscription(channel);\n\n sub.on(\"publication\", (ctx: { data: EntitlementPublication }) => {\n const data = ctx.data;\n // Only update state if this publication is for the same customer+feature\n const pubCustomerId = data.customerId ?? data.customer_id;\n const pubFeatureKey = data.featureKey ?? data.feature_key;\n\n if (pubCustomerId === customerId && pubFeatureKey === featureKey) {\n setState((prev) => ({\n ...prev,\n allowed: data.allowed ?? prev.allowed,\n remaining:\n data.remaining !== undefined ? data.remaining : prev.remaining,\n limit: data.limit !== undefined ? data.limit : prev.limit,\n }));\n }\n });\n\n sub.subscribe();\n cf.connect();\n\n return () => {\n sub.unsubscribe();\n cf.disconnect();\n };\n }, [centrifugoToken, centrifugoUrl, workspaceId, customerId, featureKey]);\n\n return state;\n}\n","/**\n * useUsage hook — fetch usage data for a customer metric.\n * Calls GET /api/v1/usage/:customerId/:metricKey via client's fetch wrapper.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from '../provider.js';\n\nexport interface UsageState {\n value: number | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface UsageResponse {\n value?: number;\n total?: number;\n}\n\n/**\n * Fetch usage for a customer metric.\n *\n * @param customerId - Customer ID to fetch usage for\n * @param metricKey - Metric key to fetch\n * @returns UsageState with value, loading, error\n */\nexport function useUsage(customerId: string, metricKey: string): UsageState {\n const { client } = useBillingContext();\n const [state, setState] = useState<UsageState>({\n value: null,\n loading: true,\n error: null,\n });\n\n useEffect(() => {\n if (!client) {\n setState({ value: null, loading: false, error: \"No client in context\" });\n return;\n }\n\n let cancelled = false;\n\n async function fetchUsage(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/usage/${customerId}/${metricKey}`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n signal: controller.signal,\n },\n );\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as UsageResponse;\n if (!cancelled) {\n setState({\n value: data.value ?? data.total ?? null,\n loading: false,\n error: null,\n });\n }\n } catch (err: unknown) {\n if (!cancelled) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n setState({ value: null, loading: false, error: message });\n }\n }\n }\n\n void fetchUsage();\n\n return () => {\n cancelled = true;\n };\n }, [client, customerId, metricKey]);\n\n return state;\n}\n","/**\n * useCredits hook — fetch credit balance for a customer.\n * Calls GET /api/v1/credits/:customerId/balance via client's fetch wrapper.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from '../provider.js';\n\nexport interface CreditsState {\n balance: number | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface CreditsResponse {\n balance?: number;\n amount?: number;\n}\n\n/**\n * Fetch credit balance for a customer.\n *\n * @param customerId - Customer ID to fetch credit balance for\n * @returns CreditsState with balance, loading, error\n */\nexport function useCredits(customerId: string): CreditsState {\n const { client } = useBillingContext();\n const [state, setState] = useState<CreditsState>({\n balance: null,\n loading: true,\n error: null,\n });\n\n useEffect(() => {\n if (!client) {\n setState({\n balance: null,\n loading: false,\n error: \"No client in context\",\n });\n return;\n }\n\n let cancelled = false;\n\n async function fetchCredits(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/credits/${customerId}/balance`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n signal: controller.signal,\n },\n );\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as CreditsResponse;\n if (!cancelled) {\n setState({\n balance: data.balance ?? data.amount ?? null,\n loading: false,\n error: null,\n });\n }\n } catch (err: unknown) {\n if (!cancelled) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n setState({ balance: null, loading: false, error: message });\n }\n }\n }\n\n void fetchCredits();\n\n return () => {\n cancelled = true;\n };\n }, [client, customerId]);\n\n return state;\n}\n","/**\n * BillingPortalProvider — Context wrapper for embeddable SDK components.\n * UI-01: Wraps children and exposes a React context with { customerId, apiKey }.\n * Components inside can consume this via the useBillingPortal() hook.\n *\n * Internally renders BillingProvider so all billing hooks work inside.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nexport interface BillingPortalContextValue {\n customerId: string;\n apiKey: string;\n}\n\nconst BillingPortalContext = createContext<BillingPortalContextValue | null>(\n null,\n);\n\nexport function useBillingPortal(): BillingPortalContextValue {\n const ctx = useContext(BillingPortalContext);\n if (!ctx) {\n throw new Error(\n \"useBillingPortal must be used inside BillingPortalProvider\",\n );\n }\n return ctx;\n}\n\nexport interface BillingPortalProviderProps {\n customerId: string;\n apiKey: string;\n children: ReactNode;\n}\n\n/**\n * BillingPortalProvider wraps your embedded billing UI and provides\n * { customerId, apiKey } context to all nested SDK components.\n *\n * Usage:\n * ```tsx\n * <BillingPortalProvider customerId=\"cus_xxx\" apiKey=\"bsr_pk_xxx\">\n * <PricingTable plans={plans} />\n * <FeatureGate feature=\"analytics\" />\n * </BillingPortalProvider>\n * ```\n */\nexport function BillingPortalProvider({\n customerId,\n apiKey,\n children,\n}: BillingPortalProviderProps): React.ReactElement {\n return (\n <BillingPortalContext.Provider value={{ customerId, apiKey }}>\n {children}\n </BillingPortalContext.Provider>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, type CSSProperties } from 'react';\nimport { useNozleClient } from '../../provider.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface PricingPlan {\n code: string;\n name: string;\n amount_cents: number;\n amount_currency: string;\n interval: string;\n description?: string;\n}\n\nexport interface PricingTableProps {\n customerId?: string;\n currentPlanCode?: string;\n plans?: PricingPlan[];\n features?: string[][];\n onSelect?: (plan: PricingPlan) => void;\n showToggle?: boolean;\n highlightPlan?: string;\n className?: string;\n enterpriseEmail?: string;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nconst SYMBOLS: Record<string, string> = { USD: '$', EUR: '€', GBP: '£', JPY: '¥' };\n\nfunction fmtPrice(cents: number, cur: string): string {\n const s = SYMBOLS[cur] ?? cur + ' ';\n const val = cents % 100 === 0 ? String(cents / 100) : (cents / 100).toFixed(2);\n return `${s}${val}`;\n}\n\nfunction isEnterprise(p: PricingPlan): boolean {\n return /enterprise|custom/i.test(p.name + p.code);\n}\n\nfunction v(name: string, fb: string): string {\n return `var(${name}, ${fb})`;\n}\n\n// ─── CSS variable shortcuts ──────────────────────────────────────────────────\n\nconst C = {\n bg: v('--nozle-pricing-bg', v('--nozle-background', '#ffffff')),\n cardBg: v('--nozle-pricing-card-bg', v('--nozle-card', '#ffffff')),\n hl: v('--nozle-pricing-highlight', v('--nozle-primary', '#6366f1')),\n border: v('--nozle-pricing-border', v('--nozle-border', '#e5e7eb')),\n radius: v('--nozle-pricing-radius', v('--nozle-radius', '12px')),\n text: v('--nozle-foreground', '#111827'),\n muted: v('--nozle-muted-foreground', '#6b7280'),\n mutedBg: v('--nozle-muted', '#f3f4f6'),\n hlFg: v('--nozle-primary-foreground', '#ffffff'),\n};\n\n// ─── Check icon ──────────────────────────────────────────────────────────────\n\nfunction Check(): React.ReactElement {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0 }}>\n <path d=\"M3.5 8.5L6.5 11.5L12.5 4.5\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n// ─── Toggle ──────────────────────────────────────────────────────────────────\n\nfunction Toggle({ isAnnual, onChange }: { isAnnual: boolean; onChange: (v: boolean) => void }) {\n const pill: CSSProperties = {\n display: 'inline-flex',\n borderRadius: '9999px',\n padding: '4px',\n background: C.mutedBg,\n gap: '2px',\n };\n const tab = (active: boolean): CSSProperties => ({\n padding: '8px 20px',\n borderRadius: '9999px',\n border: 'none',\n background: active ? C.cardBg : 'transparent',\n color: active ? C.text : C.muted,\n fontWeight: active ? 600 : 400,\n fontSize: '0.875rem',\n cursor: 'pointer',\n boxShadow: active ? '0 1px 3px rgba(0,0,0,0.08)' : 'none',\n transition: 'all 0.15s ease',\n });\n\n return (\n <div style={{ display: 'flex', justifyContent: 'center', marginBottom: '2.5rem' }}>\n <div style={pill}>\n <button onClick={() => onChange(false)} style={tab(!isAnnual)} aria-pressed={!isAnnual}>\n Monthly\n </button>\n <button onClick={() => onChange(true)} style={tab(isAnnual)} aria-pressed={isAnnual}>\n Annual\n <span style={{\n marginLeft: '6px',\n fontSize: '0.7rem',\n fontWeight: 600,\n color: isAnnual ? C.hl : C.muted,\n }}>\n Save 20%\n </span>\n </button>\n </div>\n </div>\n );\n}\n\n// ─── Card ────────────────────────────────────────────────────────────────────\n\ninterface CardProps {\n plan: PricingPlan;\n features?: string[];\n isCurrent: boolean;\n isHighlighted: boolean;\n isEnt: boolean;\n enterpriseEmail?: string;\n onSelect?: () => void;\n}\n\nfunction Card({\n plan,\n features,\n isCurrent,\n isHighlighted,\n isEnt,\n enterpriseEmail,\n onSelect,\n}: CardProps): React.ReactElement {\n const [hover, setHover] = useState(false);\n\n const shadow = isHighlighted\n ? '0 8px 28px rgba(99,102,241,0.12), 0 2px 8px rgba(99,102,241,0.06)'\n : hover\n ? '0 8px 24px rgba(0,0,0,0.06), 0 2px 8px rgba(0,0,0,0.03)'\n : '0 1px 3px rgba(0,0,0,0.04), 0 1px 2px rgba(0,0,0,0.03)';\n\n const interval = plan.interval === 'yearly' ? '/year' : '/month';\n\n const handleClick = () => {\n if (isCurrent) return;\n if (isEnt && enterpriseEmail) {\n window.location.href = `mailto:${enterpriseEmail}?subject=Enterprise Plan Inquiry`;\n return;\n }\n onSelect?.();\n };\n\n return (\n <div\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n background: C.cardBg,\n border: `1px solid ${isHighlighted ? C.hl : C.border}`,\n borderTopWidth: isHighlighted ? '3px' : '1px',\n borderRadius: C.radius,\n padding: '2rem',\n transition: 'box-shadow 0.2s ease, transform 0.2s ease',\n boxShadow: shadow,\n transform: hover && !isCurrent ? 'translateY(-2px)' : 'none',\n }}\n >\n {/* Badge */}\n {isHighlighted && (\n <div style={{\n position: 'absolute',\n top: '-1px',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n background: C.hl,\n color: C.hlFg,\n fontSize: '0.7rem',\n fontWeight: 700,\n padding: '4px 12px',\n borderRadius: '9999px',\n letterSpacing: '0.025em',\n textTransform: 'uppercase',\n whiteSpace: 'nowrap',\n }}>\n {isCurrent ? 'Current Plan' : 'Most Popular'}\n </div>\n )}\n {isCurrent && !isHighlighted && (\n <div style={{\n position: 'absolute',\n top: '0',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n background: C.mutedBg,\n color: C.muted,\n fontSize: '0.7rem',\n fontWeight: 700,\n padding: '4px 12px',\n borderRadius: '9999px',\n letterSpacing: '0.025em',\n textTransform: 'uppercase',\n whiteSpace: 'nowrap',\n }}>\n Current Plan\n </div>\n )}\n\n {/* Plan name + description */}\n <div style={{ marginBottom: '1.25rem', marginTop: isHighlighted || isCurrent ? '0.5rem' : 0 }}>\n <h3 style={{\n fontSize: '1.25rem',\n fontWeight: 700,\n color: C.text,\n margin: 0,\n lineHeight: 1.3,\n }}>\n {plan.name}\n </h3>\n {plan.description && (\n <p style={{\n fontSize: '0.875rem',\n color: C.muted,\n margin: '6px 0 0',\n lineHeight: 1.5,\n }}>\n {plan.description}\n </p>\n )}\n </div>\n\n {/* Price */}\n <div style={{ marginBottom: '1.5rem' }}>\n {isEnt ? (\n <span style={{ fontSize: '2.25rem', fontWeight: 700, color: C.text, lineHeight: 1 }}>\n Custom\n </span>\n ) : (\n <div style={{ display: 'flex', alignItems: 'baseline', gap: '2px' }}>\n <span style={{ fontSize: '2.75rem', fontWeight: 700, color: C.text, lineHeight: 1, letterSpacing: '-0.025em' }}>\n {fmtPrice(plan.amount_cents, plan.amount_currency)}\n </span>\n <span style={{ fontSize: '0.9375rem', color: C.muted, marginLeft: '4px' }}>\n {interval}\n </span>\n </div>\n )}\n </div>\n\n {/* Features */}\n {features && features.length > 0 && (\n <ul style={{\n listStyle: 'none',\n padding: 0,\n margin: '0 0 2rem',\n display: 'flex',\n flexDirection: 'column',\n gap: '0.75rem',\n flex: 1,\n }}>\n {features.map((feat) => (\n <li key={feat} style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '10px',\n fontSize: '0.875rem',\n color: C.text,\n lineHeight: 1.5,\n }}>\n <span style={{ color: C.hl, marginTop: '2px' }}><Check /></span>\n <span>{feat}</span>\n </li>\n ))}\n </ul>\n )}\n\n {/* Spacer if no features */}\n {(!features || features.length === 0) && <div style={{ flex: 1 }} />}\n\n {/* CTA */}\n {onSelect && (\n <CTAButton\n onClick={handleClick}\n disabled={isCurrent}\n variant={isCurrent ? 'current' : isEnt ? 'outline' : isHighlighted ? 'primary' : 'secondary'}\n >\n {isCurrent ? 'Current Plan' : isEnt ? 'Contact Sales' : `Get ${plan.name}`}\n </CTAButton>\n )}\n </div>\n );\n}\n\n// ─── CTA Button ──────────────────────────────────────────────────────────────\n\ntype ButtonVariant = 'primary' | 'secondary' | 'outline' | 'current';\n\nfunction CTAButton({\n children,\n onClick,\n disabled,\n variant,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n variant: ButtonVariant;\n}) {\n const [hover, setHover] = useState(false);\n\n const base: CSSProperties = {\n width: '100%',\n padding: '12px 24px',\n borderRadius: '10px',\n fontSize: '0.9375rem',\n fontWeight: 600,\n cursor: disabled ? 'default' : 'pointer',\n border: 'none',\n transition: 'all 0.15s ease',\n lineHeight: 1.4,\n };\n\n const variants: Record<ButtonVariant, CSSProperties> = {\n primary: {\n background: hover && !disabled ? '#4f46e5' : C.hl,\n color: C.hlFg,\n },\n secondary: {\n background: hover && !disabled ? '#f0f0f3' : C.mutedBg,\n color: C.text,\n border: `1px solid ${C.border}`,\n },\n outline: {\n background: hover && !disabled ? 'rgba(99,102,241,0.04)' : 'transparent',\n color: C.hl,\n border: `1.5px solid ${C.hl}`,\n },\n current: {\n background: C.mutedBg,\n color: C.muted,\n },\n };\n\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{ ...base, ...variants[variant] }}\n >\n {children}\n </button>\n );\n}\n\n// ─── Loading skeleton ────────────────────────────────────────────────────────\n\nfunction Skeleton(): React.ReactElement {\n return (\n <div style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))',\n gap: '1.5rem',\n }}>\n {[0, 1, 2].map((i) => (\n <div key={i} style={{\n background: C.cardBg,\n border: `1px solid ${C.border}`,\n borderRadius: C.radius,\n padding: '2rem',\n height: '380px',\n }}>\n <div style={{ height: 20, width: '40%', borderRadius: 6, background: '#f0f0f0', marginBottom: 12 }} />\n <div style={{ height: 40, width: '50%', borderRadius: 6, background: '#f0f0f0', marginBottom: 24 }} />\n <div style={{ height: 14, width: '80%', borderRadius: 6, background: '#f0f0f0', marginBottom: 10 }} />\n <div style={{ height: 14, width: '70%', borderRadius: 6, background: '#f0f0f0', marginBottom: 10 }} />\n <div style={{ height: 14, width: '60%', borderRadius: 6, background: '#f0f0f0' }} />\n </div>\n ))}\n </div>\n );\n}\n\n// ─── Main Component ──────────────────────────────────────────────────────────\n\nexport function PricingTable({\n customerId,\n currentPlanCode,\n plans: propPlans,\n features,\n onSelect,\n showToggle = true,\n highlightPlan,\n className,\n enterpriseEmail,\n}: PricingTableProps): React.ReactElement {\n const client = useNozleClient();\n const [plans, setPlans] = useState<PricingPlan[]>(propPlans ?? []);\n const [currentPlan, setCurrentPlan] = useState<string | null>(currentPlanCode ?? null);\n const [isAnnual, setIsAnnual] = useState(false);\n const [loading, setLoading] = useState(!propPlans);\n\n useEffect(() => {\n if (propPlans) { setPlans(propPlans); return; }\n let cancelled = false;\n client.fetch('/api/v1/plans').then(async (res) => {\n if (!cancelled && res.ok) {\n const data = await res.json();\n setPlans(data.plans || []);\n }\n }).finally(() => { if (!cancelled) setLoading(false); });\n return () => { cancelled = true; };\n }, [client, propPlans]);\n\n useEffect(() => {\n if (currentPlanCode !== undefined) {\n setCurrentPlan(currentPlanCode);\n return;\n }\n if (!customerId) return;\n let cancelled = false;\n client.fetch(`/api/v1/billing/status?customer_id=${encodeURIComponent(customerId)}`)\n .then(async (res) => {\n if (!cancelled && res.ok) {\n const data = await res.json();\n setCurrentPlan(data.plan ?? data.planName ?? null);\n }\n }).catch(() => {});\n return () => { cancelled = true; };\n }, [client, customerId, currentPlanCode]);\n\n const hasAnnual = plans.some(p => p.interval === 'yearly');\n const filtered = showToggle && hasAnnual\n ? plans.filter(p => p.interval === (isAnnual ? 'yearly' : 'monthly') || isEnterprise(p))\n : plans;\n\n if (loading) return <Skeleton />;\n\n return (\n <div className={className} style={{\n fontFamily: \"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n color: C.text,\n background: C.bg,\n }}>\n {showToggle && hasAnnual && (\n <Toggle isAnnual={isAnnual} onChange={setIsAnnual} />\n )}\n\n <div style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))',\n gap: '1.5rem',\n }}>\n {filtered.map((plan, i) => (\n <Card\n key={plan.code}\n plan={plan}\n features={features?.[i]}\n isCurrent={currentPlan === plan.code}\n isHighlighted={highlightPlan === plan.code}\n isEnt={isEnterprise(plan)}\n enterpriseEmail={enterpriseEmail}\n onSelect={onSelect ? () => onSelect(plan) : undefined}\n />\n ))}\n </div>\n </div>\n );\n}\n","/**\n * PlanCard — Individual pricing plan card component.\n * UI-01: Shows plan name, price, interval, features list, and CTA button.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport type { ReactNode } from \"react\";\n\nexport interface Plan {\n id: string;\n name: string;\n monthlyPrice: number;\n annualPrice: number;\n features: string[];\n description?: string;\n}\n\nexport interface PlanCardProps extends Plan {\n isAnnual: boolean;\n isCurrent: boolean;\n onSelect?: () => void;\n children?: ReactNode;\n}\n\n/**\n * PlanCard renders a single pricing plan.\n * Highlighted with aria-current=\"true\" when isCurrent=true.\n */\nexport function PlanCard({\n id,\n name,\n monthlyPrice,\n annualPrice,\n features,\n description,\n isAnnual,\n isCurrent,\n onSelect,\n}: PlanCardProps): React.ReactElement {\n const price = isAnnual ? annualPrice : monthlyPrice;\n const interval = isAnnual ? \"year\" : \"month\";\n\n return (\n <div\n data-testid={`plan-card-${id}`}\n aria-current={isCurrent ? \"true\" : undefined}\n style={{\n background: \"var(--nozle-background, var(--background))\",\n border: isCurrent\n ? \"2px solid var(--nozle-primary, var(--primary))\"\n : \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"1.5rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1rem\",\n }}\n className={isCurrent ? \"border-primary\" : \"\"}\n >\n <div>\n <h3\n style={{\n fontSize: \"1.25rem\",\n fontWeight: 600,\n color: \"var(--nozle-foreground, var(--foreground))\",\n margin: 0,\n }}\n >\n {name}\n </h3>\n {description && (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n margin: \"0.25rem 0 0\",\n }}\n >\n {description}\n </p>\n )}\n </div>\n\n <div>\n <span\n style={{\n fontSize: \"2rem\",\n fontWeight: 700,\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n ${price}\n </span>\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n marginLeft: \"0.25rem\",\n }}\n >\n /{interval}\n </span>\n </div>\n\n <ul\n style={{\n listStyle: \"none\",\n padding: 0,\n margin: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n flex: 1,\n }}\n >\n {features.map((feature) => (\n <li\n key={feature}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n <span\n style={{ color: \"var(--nozle-primary, var(--primary))\" }}\n aria-hidden=\"true\"\n >\n ✓\n </span>\n {feature}\n </li>\n ))}\n </ul>\n\n {onSelect && (\n <button\n onClick={onSelect}\n style={{\n background: isCurrent\n ? \"var(--nozle-muted, var(--muted))\"\n : \"var(--nozle-primary, var(--primary))\",\n color: isCurrent\n ? \"var(--nozle-muted-foreground, var(--muted-foreground))\"\n : \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n border: \"none\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"0.75rem 1.5rem\",\n cursor: isCurrent ? \"default\" : \"pointer\",\n fontWeight: 500,\n width: \"100%\",\n }}\n disabled={isCurrent}\n aria-label={isCurrent ? `Current plan: ${name}` : `Select ${name}`}\n >\n {isCurrent ? \"Current Plan\" : \"Get Started\"}\n </button>\n )}\n </div>\n );\n}\n","/**\n * PlanComparison — Side-by-side feature comparison table.\n * UI-01: Renders shadcn-style table with plan names as headers and features as rows.\n * Check/cross icons for boolean values. Uses CSS variable theming.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport type { Plan } from \"./PlanCard.js\";\n\nexport interface ComparisonFeature {\n key: string;\n label: string;\n values: Record<string, string | boolean>;\n}\n\nexport interface PlanComparisonProps {\n plans: Plan[];\n features: ComparisonFeature[];\n}\n\n/**\n * PlanComparison renders a side-by-side feature comparison table.\n *\n * Usage:\n * ```tsx\n * <PlanComparison\n * plans={plans}\n * features={[\n * { key: 'api_calls', label: 'API Calls', values: { starter: '10K', pro: '100K' } },\n * { key: 'analytics', label: 'Analytics', values: { starter: false, pro: true } },\n * ]}\n * />\n * ```\n */\nexport function PlanComparison({\n plans,\n features,\n}: PlanComparisonProps): React.ReactElement {\n return (\n <div\n style={{\n overflowX: \"auto\",\n background: \"var(--nozle-background, var(--background))\",\n }}\n >\n <table\n style={{\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"0.875rem\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n <thead>\n <tr>\n <th\n style={{\n padding: \"0.75rem 1rem\",\n textAlign: \"left\",\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontWeight: 500,\n }}\n >\n Feature\n </th>\n {plans.map((plan) => (\n <th\n key={plan.id}\n style={{\n padding: \"0.75rem 1rem\",\n textAlign: \"center\",\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontWeight: 600,\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {plan.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {features.map((feature) => (\n <tr key={feature.key}>\n <td\n style={{\n padding: \"0.75rem 1rem\",\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {feature.label}\n </td>\n {plans.map((plan) => {\n const value = feature.values[plan.id];\n return (\n <td\n key={plan.id}\n style={{\n padding: \"0.75rem 1rem\",\n textAlign: \"center\",\n borderBottom:\n \"1px solid var(--nozle-border, var(--border))\",\n }}\n >\n {typeof value === \"boolean\" ? (\n value ? (\n <span\n style={{\n color: \"var(--nozle-primary, var(--primary))\",\n }}\n aria-label=\"Included\"\n >\n ✓\n </span>\n ) : (\n <span\n style={{\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n aria-label=\"Not included\"\n >\n ✕\n </span>\n )\n ) : (\n <span>{value ?? \"—\"}</span>\n )}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","/**\n * CheckoutButton — Initiates checkout for a plan.\n * UI-02: Calls POST /api/v1/checkout, detects processor type from the response,\n * and branches to the appropriate payment flow:\n * - Stripe hosted checkout: redirect to url\n * - Stripe embedded Elements: emit clientSecret via onStripeClientSecret callback\n * - Razorpay: inject Razorpay.js and open the checkout modal\n * - Legacy (no type): redirect to url for backwards compatibility\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { useState } from \"react\";\nimport { useBillingPortal } from \"./BillingPortalProvider.js\";\n\nexport interface CheckoutButtonProps {\n planId: string;\n label?: string;\n apiBaseUrl?: string;\n className?: string;\n style?: React.CSSProperties;\n onError?: (error: Error) => void;\n /** Required for Razorpay checkout path — the Razorpay publishable key (key_id). */\n razorpayKeyId?: string;\n /** Called with the Stripe Payment Intent / Checkout Session client secret\n * when the BFF returns type:'stripe' without a hosted url.\n * The host app is responsible for mounting Stripe Elements. */\n onStripeClientSecret?: (clientSecret: string) => void;\n /** Called with the Razorpay payment ID after a successful Razorpay payment. */\n onSuccess?: (paymentId: string) => void;\n}\n\ninterface RazorpayOptions {\n key: string;\n order_id: string;\n name?: string;\n description?: string;\n handler: (response: { razorpay_payment_id: string }) => void;\n modal?: { ondismiss?: () => void };\n}\n\ndeclare global {\n interface Window {\n Razorpay: new (opts: RazorpayOptions) => { open(): void };\n }\n}\n\ntype CheckoutResponse =\n | { type: \"stripe\"; url: string; clientSecret?: string }\n | { type: \"stripe\"; clientSecret: string; url?: string }\n | { type: \"razorpay\"; orderId: string }\n | { url: string }; // legacy — no type field\n\n/**\n * Injects the Razorpay checkout.js script once, then resolves.\n * If the script is already present, resolves immediately.\n */\nfunction loadRazorpayScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (document.getElementById(\"razorpay-js\")) {\n resolve();\n return;\n }\n const script = document.createElement(\"script\");\n script.id = \"razorpay-js\";\n script.src = \"https://checkout.razorpay.com/v1/checkout.js\";\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"Failed to load Razorpay.js\"));\n document.body.appendChild(script);\n });\n}\n\n/**\n * CheckoutButton initiates a checkout session and routes to the appropriate\n * payment processor path.\n *\n * Must be used inside a BillingPortalProvider.\n */\nexport function CheckoutButton({\n planId,\n label = \"Get Started\",\n apiBaseUrl = \"https://api.nozle.app\",\n className,\n style,\n onError,\n razorpayKeyId,\n onStripeClientSecret,\n onSuccess,\n}: CheckoutButtonProps): React.ReactElement {\n const { customerId, apiKey } = useBillingPortal();\n const [loading, setLoading] = useState(false);\n\n async function handleClick(): Promise<void> {\n setLoading(true);\n try {\n const response = await fetch(`${apiBaseUrl}/api/v1/checkout`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ planId, customerId }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: Checkout failed`);\n }\n\n const data = (await response.json()) as CheckoutResponse;\n\n if (\"type\" in data && data.type === \"razorpay\") {\n // Razorpay checkout path\n if (!razorpayKeyId) {\n onError?.(\n new Error(\"razorpayKeyId prop required for Razorpay checkout\"),\n );\n return;\n }\n await loadRazorpayScript();\n const rzp = new window.Razorpay({\n key: razorpayKeyId,\n order_id: data.orderId,\n handler: (r) => {\n onSuccess?.(r.razorpay_payment_id);\n },\n modal: {\n ondismiss: () => setLoading(false),\n },\n });\n rzp.open();\n } else if (\"type\" in data && data.type === \"stripe\") {\n // Stripe checkout path\n if (data.url) {\n window.location.href = data.url;\n } else if (data.clientSecret) {\n onStripeClientSecret?.(data.clientSecret);\n } else {\n onError?.(\n new Error(\"Stripe checkout: no url or clientSecret in response\"),\n );\n }\n } else if (\"url\" in data && data.url) {\n // Legacy path — plain url redirect\n window.location.href = data.url;\n } else {\n onError?.(new Error(\"Unknown checkout response format\"));\n }\n } catch (err: unknown) {\n const error = err instanceof Error ? err : new Error(\"Checkout failed\");\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <button\n onClick={() => void handleClick()}\n disabled={loading}\n className={className}\n style={{\n padding: \"0.75rem 1.5rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: loading ? \"not-allowed\" : \"pointer\",\n fontWeight: 500,\n opacity: loading ? 0.7 : 1,\n ...style,\n }}\n aria-busy={loading}\n >\n {loading ? \"Loading...\" : label}\n </button>\n );\n}\n","'use client';\n\nimport React, { createContext, useContext, useMemo, useState } from 'react';\nimport { Elements, PaymentElement, useStripe, useElements } from '@stripe/react-stripe-js';\nimport { loadStripe } from '@stripe/stripe-js';\nimport type { Appearance, StripeElementsOptions } from '@stripe/stripe-js';\n\n// ── Public interfaces ────────────────────────────────────────────────────────\n\nexport interface CheckoutProps {\n /** Stripe PaymentIntent client secret */\n clientSecret: string;\n /** Stripe publishable key */\n publishableKey: string;\n /** Optional Stripe Connect account ID */\n stripeAccount?: string;\n /** Custom label for the submit button (default: \"Pay now\") */\n submitLabel?: string;\n /** Called with the paymentIntentId when payment succeeds without redirect */\n onSuccess?: (paymentIntentId: string) => void;\n /** Called with the error when payment fails */\n onError?: (error: Error) => void;\n /** Called when the PaymentElement becomes interactive */\n onReady?: () => void;\n /** Additional CSS class for the outer wrapper */\n className?: string;\n /** Inline styles for the outer wrapper */\n style?: React.CSSProperties;\n}\n\nexport interface UseCheckoutResult {\n /** Trigger payment confirmation programmatically */\n confirmPayment: () => Promise<void>;\n /** True while a payment confirmation is in-flight */\n isProcessing: boolean;\n /** Last payment error, or null if no error */\n error: Error | null;\n}\n\n// ── Internal context ──────────────────────────────────────────────────────────\n\ninterface CheckoutContextValue {\n confirmPayment: () => Promise<void>;\n isProcessing: boolean;\n error: Error | null;\n}\n\nconst CheckoutContext = createContext<CheckoutContextValue | null>(null);\n\n// ── Public hook ───────────────────────────────────────────────────────────────\n\nexport function useCheckout(): UseCheckoutResult {\n const ctx = useContext(CheckoutContext);\n if (ctx === null) {\n throw new Error('useCheckout must be used inside a <Checkout> component');\n }\n return ctx;\n}\n\n// ── Stripe appearance builder ─────────────────────────────────────────────────\n\nfunction buildStripeAppearance(): Appearance {\n if (typeof document === 'undefined') {\n return { theme: 'stripe' };\n }\n\n const style = getComputedStyle(document.documentElement);\n const get = (prop: string, fallback: string) => style.getPropertyValue(prop).trim() || fallback;\n\n return {\n theme: 'stripe',\n variables: {\n colorPrimary: get('--nozle-primary', '#16a34a'),\n colorBackground: get('--nozle-background', '#f8fafc'),\n colorText: get('--nozle-foreground', '#1e293b'),\n colorDanger: get('--nozle-destructive', '#dc2626'),\n borderRadius: get('--nozle-radius', '0.5rem'),\n fontFamily: 'inherit',\n },\n };\n}\n\n// ── Inner form component ──────────────────────────────────────────────────────\n\ntype CheckoutInnerProps = Pick<\n CheckoutProps,\n 'submitLabel' | 'onSuccess' | 'onError' | 'onReady' | 'className' | 'style'\n>;\n\nfunction CheckoutInner({\n submitLabel,\n onSuccess,\n onError,\n onReady,\n className,\n style,\n}: CheckoutInnerProps) {\n const stripe = useStripe();\n const elements = useElements();\n\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [isReady, setIsReady] = useState(false);\n\n async function confirmPayment(): Promise<void> {\n if (!stripe || !elements) return;\n\n setIsProcessing(true);\n setError(null);\n\n const result = await stripe.confirmPayment({\n elements,\n confirmParams: { return_url: window.location.href },\n redirect: 'if_required',\n });\n\n setIsProcessing(false);\n\n if (result.error) {\n const err = new Error(result.error.message ?? 'Payment failed');\n setError(err);\n onError?.(err);\n } else if (result.paymentIntent?.status === 'succeeded') {\n onSuccess?.(result.paymentIntent.id);\n }\n }\n\n return (\n <CheckoutContext.Provider value={{ confirmPayment, isProcessing, error }}>\n <div className={className} style={style}>\n <style>{`@keyframes nozle-skeleton-pulse { 0%{background-position:200% 0} 100%{background-position:-200% 0} }`}</style>\n\n {!isReady && (\n <div\n data-testid=\"checkout-skeleton\"\n style={{\n height: '200px',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n background: 'linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%)',\n backgroundSize: '200% 100%',\n animation: 'nozle-skeleton-pulse 1.5s ease-in-out infinite',\n }}\n />\n )}\n\n <PaymentElement\n onReady={() => {\n setIsReady(true);\n onReady?.();\n }}\n />\n\n {error !== null && (\n <p style={{ color: 'var(--nozle-destructive, #dc2626)', margin: '0.5rem 0 0' }}>\n {error.message}\n </p>\n )}\n\n <button\n type=\"button\"\n onClick={() => void confirmPayment()}\n disabled={isProcessing || !stripe}\n aria-busy={isProcessing}\n style={{\n padding: '0.75rem 1.5rem',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n border: 'none',\n background: 'var(--nozle-primary, var(--primary))',\n color: 'var(--nozle-primary-foreground, var(--primary-foreground))',\n cursor: isProcessing ? 'not-allowed' : 'pointer',\n fontWeight: 500,\n opacity: isProcessing ? 0.7 : 1,\n marginTop: '1rem',\n width: '100%',\n }}\n >\n {isProcessing ? 'Processing...' : (submitLabel ?? 'Pay now')}\n </button>\n </div>\n </CheckoutContext.Provider>\n );\n}\n\n// ── Public Checkout component ─────────────────────────────────────────────────\n\nexport function Checkout({\n clientSecret,\n publishableKey,\n stripeAccount,\n submitLabel,\n onSuccess,\n onError,\n onReady,\n className,\n style,\n}: CheckoutProps) {\n const stripePromise = useMemo(\n () => loadStripe(publishableKey, stripeAccount ? { stripeAccount } : undefined),\n [publishableKey, stripeAccount]\n );\n\n const appearance = useMemo(() => buildStripeAppearance(), []);\n\n const options: StripeElementsOptions = { clientSecret, appearance };\n\n return (\n <Elements key={clientSecret} stripe={stripePromise} options={options}>\n <CheckoutInner\n submitLabel={submitLabel}\n onSuccess={onSuccess}\n onError={onError}\n onReady={onReady}\n className={className}\n style={style}\n />\n </Elements>\n );\n}\n","/**\n * UpgradeModal — Shows live proration preview before confirming plan upgrade.\n * UI-02: Fetches proration preview from POST /api/v1/subscriptions/preview.\n * Shows credit, debit, net, and next billing date before confirming.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { useState, useEffect } from \"react\";\n\nexport interface ProrationPreview {\n credit: number;\n debit: number;\n net: number;\n nextBillingDate: string;\n}\n\nexport interface UpgradeModalProps {\n isOpen: boolean;\n targetPlanId: string;\n customerId: string;\n apiBaseUrl?: string;\n apiKey?: string;\n onConfirm?: () => void;\n onCancel?: () => void;\n}\n\n/**\n * UpgradeModal shows proration preview from POST /api/v1/subscriptions/preview\n * before the customer confirms a plan upgrade.\n */\nexport function UpgradeModal({\n isOpen,\n targetPlanId,\n customerId,\n apiBaseUrl = \"https://api.nozle.app\",\n apiKey = \"\",\n onConfirm,\n onCancel,\n}: UpgradeModalProps): React.ReactElement | null {\n const [preview, setPreview] = useState<ProrationPreview | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [confirming, setConfirming] = useState(false);\n\n useEffect(() => {\n if (!isOpen || !targetPlanId || !customerId) {\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n setPreview(null);\n\n async function fetchPreview(): Promise<void> {\n try {\n const response = await fetch(\n `${apiBaseUrl}/api/v1/subscriptions/preview`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ targetPlanId, customerId }),\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status}: Failed to load proration preview`,\n );\n }\n\n const data = (await response.json()) as ProrationPreview;\n if (!cancelled) {\n setPreview(data);\n }\n } catch (err: unknown) {\n if (!cancelled) {\n const message =\n err instanceof Error ? err.message : \"Failed to load preview\";\n setError(message);\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n void fetchPreview();\n\n return () => {\n cancelled = true;\n };\n }, [isOpen, targetPlanId, customerId, apiBaseUrl, apiKey]);\n\n async function handleConfirm(): Promise<void> {\n setConfirming(true);\n try {\n const response = await fetch(\n `${apiBaseUrl}/api/v1/subscriptions/change`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ targetPlanId, customerId }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: Upgrade failed`);\n }\n\n onConfirm?.();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Upgrade failed\";\n setError(message);\n } finally {\n setConfirming(false);\n }\n }\n\n if (!isOpen) {\n return null;\n }\n\n const overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"oklch(0 0 0 / 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n };\n\n const modalStyle: React.CSSProperties = {\n background: \"var(--nozle-background, var(--background))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"2rem\",\n maxWidth: \"28rem\",\n width: \"100%\",\n boxShadow: \"var(--nozle-shadow, 0 4px 6px -1px rgb(0 0 0 / 0.1))\",\n };\n\n return (\n <div\n style={overlayStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Upgrade plan\"\n >\n <div style={modalStyle}>\n <h2\n style={{ fontSize: \"1.25rem\", fontWeight: 600, margin: \"0 0 1rem\" }}\n >\n Confirm Plan Upgrade\n </h2>\n\n {loading && (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n Loading proration preview...\n </p>\n )}\n\n {error && (\n <p style={{ color: \"oklch(0.6 0.2 25)\", marginBottom: \"1rem\" }}>\n {error}\n </p>\n )}\n\n {preview && !loading && (\n <div style={{ marginBottom: \"1.5rem\" }}>\n <div\n style={{\n background: \"var(--nozle-muted, var(--muted))\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"1rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n >\n {preview.credit > 0 && (\n <div\n style={{ display: \"flex\", justifyContent: \"space-between\" }}\n >\n <span>Credit from current plan</span>\n <span style={{ color: \"oklch(0.6 0.15 150)\" }}>\n -${preview.credit.toFixed(2)}\n </span>\n </div>\n )}\n <div style={{ display: \"flex\", justifyContent: \"space-between\" }}>\n <span>New plan charge</span>\n <span>${preview.debit.toFixed(2)}</span>\n </div>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n fontWeight: 600,\n borderTop: \"1px solid var(--nozle-border, var(--border))\",\n paddingTop: \"0.5rem\",\n marginTop: \"0.25rem\",\n }}\n >\n <span>You'll be charged today</span>\n <span>${preview.net.toFixed(2)}</span>\n </div>\n </div>\n <p\n style={{\n fontSize: \"0.875rem\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n marginTop: \"0.75rem\",\n }}\n >\n Your next billing date is{\" \"}\n {new Date(preview.nextBillingDate).toLocaleDateString()}.\n </p>\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n gap: \"0.75rem\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={onCancel}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background: \"transparent\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n cursor: \"pointer\",\n }}\n disabled={confirming}\n >\n Cancel\n </button>\n <button\n onClick={() => void handleConfirm()}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color:\n \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: confirming || loading ? \"not-allowed\" : \"pointer\",\n fontWeight: 500,\n opacity: confirming || loading ? 0.7 : 1,\n }}\n disabled={confirming || loading || !!error}\n >\n {confirming ? \"Upgrading...\" : \"Confirm Upgrade\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * UpgradeButton — Opens UpgradeModal on click.\n * UI-02: Triggers plan upgrade flow with proration preview.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { useState } from \"react\";\nimport { UpgradeModal } from \"./UpgradeModal.js\";\nimport { useBillingPortal } from \"./BillingPortalProvider.js\";\n\nexport interface UpgradeButtonProps {\n targetPlanId: string;\n label?: string;\n apiBaseUrl?: string;\n className?: string;\n style?: React.CSSProperties;\n onUpgraded?: () => void;\n}\n\n/**\n * UpgradeButton opens an UpgradeModal with live proration preview.\n * Must be used inside a BillingPortalProvider.\n */\nexport function UpgradeButton({\n targetPlanId,\n label = \"Upgrade\",\n apiBaseUrl = \"https://api.nozle.app\",\n className,\n style,\n onUpgraded,\n}: UpgradeButtonProps): React.ReactElement {\n const { customerId, apiKey } = useBillingPortal();\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <>\n <button\n onClick={() => setIsOpen(true)}\n className={className}\n style={{\n padding: \"0.75rem 1.5rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: \"pointer\",\n fontWeight: 500,\n ...style,\n }}\n >\n {label}\n </button>\n\n <UpgradeModal\n isOpen={isOpen}\n targetPlanId={targetPlanId}\n customerId={customerId}\n apiBaseUrl={apiBaseUrl}\n apiKey={apiKey}\n onConfirm={() => {\n setIsOpen(false);\n onUpgraded?.();\n }}\n onCancel={() => setIsOpen(false)}\n />\n </>\n );\n}\n","/**\n * CreditTopUpButton — Opens a dialog for purchasing credits.\n * UI-02: Allows customers to top up their credit balance.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { useState } from \"react\";\nimport { useBillingPortal } from \"./BillingPortalProvider.js\";\n\nconst PRESET_AMOUNTS = [10, 25, 50, 100, 250];\n\nexport interface CreditTopUpButtonProps {\n label?: string;\n apiBaseUrl?: string;\n className?: string;\n style?: React.CSSProperties;\n onSuccess?: (amount: number) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * CreditTopUpButton opens a dialog to purchase credits.\n * Must be used inside a BillingPortalProvider.\n */\nexport function CreditTopUpButton({\n label = \"Add Credits\",\n apiBaseUrl = \"https://api.nozle.app\",\n className,\n style,\n onSuccess,\n onError,\n}: CreditTopUpButtonProps): React.ReactElement {\n const { customerId, apiKey } = useBillingPortal();\n const [isOpen, setIsOpen] = useState(false);\n const [selectedAmount, setSelectedAmount] = useState<number>(25);\n const [customAmount, setCustomAmount] = useState<string>(\"\");\n const [useCustom, setUseCustom] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const finalAmount = useCustom\n ? parseFloat(customAmount) || 0\n : selectedAmount;\n\n async function handlePurchase(): Promise<void> {\n if (finalAmount <= 0) {\n setError(\"Please enter a valid amount\");\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetch(`${apiBaseUrl}/api/v1/credits/purchase`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ customerId, amount: finalAmount }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: Credit purchase failed`);\n }\n\n setIsOpen(false);\n onSuccess?.(finalAmount);\n } catch (err: unknown) {\n const purchaseError =\n err instanceof Error ? err : new Error(\"Credit purchase failed\");\n setError(purchaseError.message);\n onError?.(purchaseError);\n } finally {\n setLoading(false);\n }\n }\n\n const overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"oklch(0 0 0 / 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n };\n\n const dialogStyle: React.CSSProperties = {\n background: \"var(--nozle-background, var(--background))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"2rem\",\n maxWidth: \"24rem\",\n width: \"100%\",\n };\n\n return (\n <>\n <button\n onClick={() => setIsOpen(true)}\n className={className}\n style={{\n padding: \"0.75rem 1.5rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: \"pointer\",\n fontWeight: 500,\n ...style,\n }}\n >\n {label}\n </button>\n\n {isOpen && (\n <div\n style={overlayStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Add credits\"\n >\n <div style={dialogStyle}>\n <h2\n style={{\n fontSize: \"1.25rem\",\n fontWeight: 600,\n margin: \"0 0 1.25rem\",\n }}\n >\n Add Credits\n </h2>\n\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n marginBottom: \"1rem\",\n }}\n >\n {PRESET_AMOUNTS.map((amount) => (\n <button\n key={amount}\n onClick={() => {\n setUseCustom(false);\n setSelectedAmount(amount);\n }}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background:\n !useCustom && selectedAmount === amount\n ? \"var(--nozle-primary, var(--primary))\"\n : \"transparent\",\n color:\n !useCustom && selectedAmount === amount\n ? \"var(--nozle-primary-foreground, var(--primary-foreground))\"\n : \"var(--nozle-foreground, var(--foreground))\",\n cursor: \"pointer\",\n }}\n aria-pressed={!useCustom && selectedAmount === amount}\n >\n ${amount}\n </button>\n ))}\n </div>\n\n <div style={{ marginBottom: \"1.25rem\" }}>\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n marginBottom: \"0.5rem\",\n fontSize: \"0.875rem\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n <input\n type=\"checkbox\"\n checked={useCustom}\n onChange={(e) => setUseCustom(e.target.checked)}\n />\n Custom amount\n </label>\n {useCustom && (\n <input\n type=\"number\"\n value={customAmount}\n onChange={(e) => setCustomAmount(e.target.value)}\n placeholder=\"Enter amount\"\n min={1}\n style={{\n width: \"100%\",\n padding: \"0.5rem 0.75rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background: \"var(--nozle-background, var(--background))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n boxSizing: \"border-box\",\n }}\n />\n )}\n </div>\n\n {error && (\n <p\n style={{\n color: \"oklch(0.6 0.2 25)\",\n marginBottom: \"1rem\",\n fontSize: \"0.875rem\",\n }}\n >\n {error}\n </p>\n )}\n\n <div\n style={{\n display: \"flex\",\n gap: \"0.75rem\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={() => setIsOpen(false)}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background: \"transparent\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n cursor: \"pointer\",\n }}\n disabled={loading}\n >\n Cancel\n </button>\n <button\n onClick={() => void handlePurchase()}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color:\n \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: loading ? \"not-allowed\" : \"pointer\",\n fontWeight: 500,\n opacity: loading ? 0.7 : 1,\n }}\n disabled={loading || finalAmount <= 0}\n >\n {loading ? \"Processing...\" : `Add $${finalAmount}`}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n","/**\n * FeatureGate — Renders children if customer has access to a feature.\n * UI-03: Uses useCan hook; renders fallback when allowed=false.\n * Renders null while loading to avoid layout shift.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\nimport { useCan } from '../../hooks/use-can.js';\n\nexport interface FeatureGateProps {\n /** Customer ID to check entitlement for */\n customerId: string;\n /** Feature key to check */\n feature: string;\n /** Rendered when customer does not have access. Defaults to null. */\n fallback?: ReactNode;\n /** Content to show when customer has access */\n children: ReactNode;\n}\n\n/**\n * FeatureGate renders children only when the customer is entitled to the feature.\n * Returns null while the entitlement check is loading.\n *\n * Usage:\n * ```tsx\n * <FeatureGate customerId=\"cus_123\" feature=\"analytics\" fallback={<UpgradePrompt />}>\n * <AnalyticsDashboard />\n * </FeatureGate>\n * ```\n */\nexport function FeatureGate({\n customerId,\n feature,\n fallback = null,\n children,\n}: FeatureGateProps): React.ReactElement | null {\n const { allowed, loading } = useCan(customerId, feature);\n\n if (loading) {\n return null;\n }\n\n if (!allowed) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n","/**\n * UsageGate — Renders children if usage is below limit.\n * UI-03: Renders fallback when usage >= limit.\n * Pure render logic — caller provides usage and limit values.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\n\nexport interface UsageGateProps {\n /** Current usage value */\n usage: number;\n /** Usage limit */\n limit: number;\n /** Rendered when usage is at or above limit. Defaults to null. */\n fallback?: ReactNode;\n /** Content to show when usage is below limit */\n children: ReactNode;\n}\n\n/**\n * UsageGate renders children only when current usage is below the limit.\n * When usage >= limit, renders fallback.\n *\n * Usage:\n * ```tsx\n * <UsageGate usage={currentUsage} limit={plan.apiCallLimit} fallback={<UpgradePrompt />}>\n * <ApiCallButton />\n * </UsageGate>\n * ```\n */\nexport function UsageGate({\n usage,\n limit,\n fallback = null,\n children,\n}: UsageGateProps): React.ReactElement {\n if (usage >= limit) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n","/**\n * PlanGate — Renders children if customer's plan is in the allowed list.\n * UI-03: Pure render logic — caller provides currentPlan and allowedPlans.\n * Renders fallback when customer is not on an allowed plan tier.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\n\nexport interface PlanGateProps {\n /** The customer's current plan identifier */\n currentPlan: string;\n /** List of plan identifiers that are allowed to see the children */\n allowedPlans: string[];\n /** Rendered when customer is not on an allowed plan. Defaults to null. */\n fallback?: ReactNode;\n /** Content to show when customer is on an allowed plan */\n children: ReactNode;\n}\n\n/**\n * PlanGate renders children only when the customer's currentPlan is in allowedPlans.\n * When not on an allowed plan, renders fallback.\n *\n * Usage:\n * ```tsx\n * <PlanGate\n * currentPlan={customer.plan}\n * allowedPlans={['pro', 'enterprise']}\n * fallback={<UpgradePrompt planName=\"Pro\" />}\n * >\n * <ProFeature />\n * </PlanGate>\n * ```\n */\nexport function PlanGate({\n currentPlan,\n allowedPlans,\n fallback = null,\n children,\n}: PlanGateProps): React.ReactElement {\n if (!allowedPlans.includes(currentPlan)) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n","/**\n * UpgradePrompt — Reusable upgrade message component.\n * UI-03: Shows plan name + upgrade button; used as default fallback for LockedOverlay.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\n\nimport React from \"react\";\n\nexport interface UpgradePromptProps {\n text?: string;\n planName?: string;\n onUpgrade?: () => void;\n}\n\n/**\n * UpgradePrompt renders an upgrade call-to-action with a message and button.\n * Used as default fallback in LockedOverlay and gate components.\n */\nexport function UpgradePrompt({\n text = \"Upgrade to access this feature\",\n planName,\n onUpgrade,\n}: UpgradePromptProps): React.ReactElement {\n const displayText = planName\n ? `Upgrade to ${planName} to access this feature`\n : text;\n\n function handleUpgrade(): void {\n if (onUpgrade) {\n onUpgrade();\n } else {\n window.location.href = \"/upgrade\";\n }\n }\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"1rem\",\n textAlign: \"center\",\n }}\n >\n <p\n style={{\n color: \"var(--nozle-foreground, var(--foreground))\",\n fontSize: \"0.875rem\",\n margin: 0,\n }}\n >\n {displayText}\n </p>\n <button\n onClick={handleUpgrade}\n style={{\n padding: \"0.5rem 1.25rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: \"pointer\",\n fontWeight: 500,\n fontSize: \"0.875rem\",\n }}\n >\n Upgrade\n </button>\n </div>\n );\n}\n","/**\n * LockedOverlay — Wraps children with a blur filter + upgrade CTA overlay when locked.\n * UI-03: Applies CSS blur(4px) to children with an upgrade prompt overlay.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\nimport { UpgradePrompt } from \"./UpgradePrompt.js\";\n\nexport interface LockedOverlayProps {\n /** Whether to apply the locked blur + overlay state */\n locked: boolean;\n /** Text to show in the upgrade prompt */\n upgradeText?: string;\n /** Plan name to show in the upgrade prompt */\n upgradePlanName?: string;\n /** Called when the upgrade button is clicked */\n onUpgrade?: () => void;\n /** Content to blur when locked */\n children: ReactNode;\n}\n\n/**\n * LockedOverlay wraps children in a relative container.\n * When locked=true:\n * - Children receive CSS blur(4px) and pointer-events: none\n * - An upgrade CTA overlay is positioned on top\n *\n * When locked=false, children render normally without any overlay.\n *\n * Usage:\n * ```tsx\n * <LockedOverlay locked={!canAccessFeature} upgradeText=\"Upgrade to Pro\" onUpgrade={openUpgradeModal}>\n * <FeatureContent />\n * </LockedOverlay>\n * ```\n */\nexport function LockedOverlay({\n locked,\n upgradeText,\n upgradePlanName,\n onUpgrade,\n children,\n}: LockedOverlayProps): React.ReactElement {\n if (!locked) {\n return <>{children}</>;\n }\n\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }}>\n {/* Blurred content — inaccessible to users */}\n <div\n style={{\n filter: \"blur(4px)\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n\n {/* Upgrade CTA overlay */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"var(--nozle-background, var(--background))\",\n opacity: 0.92,\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n }}\n role=\"dialog\"\n aria-label=\"Feature locked — upgrade required\"\n >\n <UpgradePrompt\n text={upgradeText}\n planName={upgradePlanName}\n onUpgrade={onUpgrade}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * UsageMeter — embeddable usage progress bar with automatic color thresholds.\n * Uses --nozle-* CSS variables for theming (customer-facing portal layer).\n *\n * Color thresholds:\n * < 80% → primary (normal)\n * 80-94% → warning (amber)\n * ≥ 95% → destructive (red)\n */\n\nexport function getUsageMeterColor(percentage: number): string {\n if (percentage >= 95) return \"var(--nozle-destructive, var(--destructive))\";\n if (percentage >= 80) return \"var(--nozle-warning, var(--warning))\";\n return \"var(--nozle-primary, var(--primary))\";\n}\n\nexport interface UsageMeterProps {\n used: number;\n limit: number;\n label?: string;\n showText?: boolean;\n}\n\nexport function UsageMeter({\n used,\n limit,\n label,\n showText = true,\n}: UsageMeterProps) {\n const percentage = limit > 0 ? Math.min(100, (used / limit) * 100) : 0;\n const color = getUsageMeterColor(percentage);\n\n return (\n <div className=\"w-full space-y-1\">\n {label && (\n <div className=\"flex justify-between text-sm\">\n <span>{label}</span>\n {showText && (\n <span style={{ color }}>\n {used.toLocaleString()} / {limit.toLocaleString()}\n </span>\n )}\n </div>\n )}\n <div\n className=\"h-2 rounded-full overflow-hidden\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n >\n <div\n className=\"h-full rounded-full\"\n style={{\n width: `${percentage}%`,\n background: color,\n transition: \"width 0.3s ease\",\n }}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * UsageDashboard — renders multiple UsageMeters for all features.\n *\n * Accepts features as props. When loading=true renders skeleton placeholders.\n */\n\nimport { UsageMeter } from \"./UsageMeter.js\";\n\nexport interface UsageDashboardFeature {\n key: string;\n label: string;\n used: number;\n limit: number;\n}\n\nexport interface UsageDashboardProps {\n features?: UsageDashboardFeature[];\n loading?: boolean;\n}\n\nexport function UsageDashboard({\n features = [],\n loading = false,\n}: UsageDashboardProps) {\n if (loading) {\n return (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-8 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {features.map((f) => (\n <UsageMeter key={f.key} used={f.used} limit={f.limit} label={f.label} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * UsageAlert — warning banner shown when any feature usage is >= threshold.\n *\n * Shows dismissible alerts for features approaching their limit.\n * Default threshold: 80% (amber zone entry point).\n */\n\nimport { useState } from \"react\";\n\nexport interface UsageAlertFeature {\n key: string;\n label: string;\n percentage: number;\n}\n\nexport interface UsageAlertProps {\n features: UsageAlertFeature[];\n threshold?: number;\n upgradeHref?: string;\n}\n\nexport function UsageAlert({\n features,\n threshold = 80,\n upgradeHref = \"/plans\",\n}: UsageAlertProps) {\n const [dismissed, setDismissed] = useState<Set<string>>(new Set());\n\n const alertFeatures = features.filter(\n (f) => f.percentage >= threshold && !dismissed.has(f.key),\n );\n\n if (alertFeatures.length === 0) {\n return null;\n }\n\n const handleDismiss = (key: string) => {\n setDismissed((prev) => new Set(prev).add(key));\n };\n\n return (\n <div className=\"space-y-2\">\n {alertFeatures.map((f) => (\n <div\n key={f.key}\n role=\"alert\"\n className=\"flex items-center justify-between rounded-md px-4 py-3 text-sm\"\n style={{\n background: \"var(--nozle-warning-bg, var(--warning-bg, #fef9c3))\",\n color: \"var(--nozle-warning-text, var(--warning-text, #854d0e))\",\n border:\n \"1px solid var(--nozle-warning-border, var(--warning-border, #fde047))\",\n }}\n >\n <span>\n <span\n aria-hidden=\"true\"\n style={{ marginRight: \"0.5rem\", fontSize: \"1rem\" }}\n >\n ⚠\n </span>\n You're approaching your <strong>{f.label}</strong> limit (\n {Math.round(f.percentage)}%).{\" \"}\n <a\n href={upgradeHref}\n style={{\n color: \"inherit\",\n fontWeight: 600,\n textDecoration: \"underline\",\n }}\n >\n Upgrade\n </a>\n </span>\n <button\n onClick={() => handleDismiss(f.key)}\n aria-label={`Dismiss ${f.label} alert`}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"0 0 0 0.75rem\",\n fontSize: \"1rem\",\n color: \"inherit\",\n }}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * CreditBalance — displays the current credit balance for a customer.\n * Uses the useCredits hook with customerId prop.\n */\n\nimport { useCredits } from '../../hooks/use-credits.js';\n\nexport interface CreditBalanceProps {\n customerId: string;\n currency?: string;\n}\n\nexport function CreditBalance({\n customerId,\n currency = \"USD\",\n}: CreditBalanceProps) {\n const { balance, loading, error } = useCredits(customerId);\n\n if (loading) {\n return (\n <div\n className=\"animate-pulse h-8 w-24 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n );\n }\n\n if (error) {\n return (\n <span\n style={{ color: \"var(--nozle-destructive, var(--destructive))\" }}\n className=\"text-sm\"\n >\n Failed to load balance\n </span>\n );\n }\n\n const amount = balance ?? 0;\n\n return (\n <div className=\"flex items-center gap-2\">\n <span aria-label=\"wallet icon\" style={{ fontSize: \"1.25rem\" }} role=\"img\">\n 💳\n </span>\n {amount === 0 ? (\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n className=\"text-sm\"\n >\n No credits\n </span>\n ) : (\n <span className=\"font-semibold\">\n {new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(amount)}\n </span>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * CreditHistory — renders a list of credit transactions for a customer.\n * Shows type badge, amount, description, and date. Latest first.\n * Max 20 rows with \"View all\" link.\n */\n\nimport type React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from \"../../provider.js\";\n\nexport interface CreditTransaction {\n id: string;\n amount: number;\n type: string;\n description: string;\n createdAt: string;\n}\n\nexport interface CreditHistoryProps {\n customerId: string;\n viewAllHref?: string;\n}\n\ntype TxType = \"grant\" | \"deduct\" | \"purchase\" | \"application\";\n\nconst TYPE_BADGE_STYLES: Record<TxType, React.CSSProperties> = {\n grant: {\n background: \"var(--nozle-success-bg, #dcfce7)\",\n color: \"var(--nozle-success, #16a34a)\",\n },\n deduct: {\n background: \"var(--nozle-destructive-bg, #fee2e2)\",\n color: \"var(--nozle-destructive, #dc2626)\",\n },\n purchase: {\n background: \"var(--nozle-info-bg, #dbeafe)\",\n color: \"var(--nozle-info, #2563eb)\",\n },\n application: {\n background: \"var(--nozle-muted, #f1f5f9)\",\n color: \"var(--nozle-muted-foreground, #64748b)\",\n },\n};\n\nfunction getTypeBadgeStyle(type: string): React.CSSProperties {\n return TYPE_BADGE_STYLES[type as TxType] ?? TYPE_BADGE_STYLES.application;\n}\n\nfunction formatDate(iso: string): string {\n try {\n return new Date(iso).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nexport function CreditHistory({\n customerId,\n viewAllHref = \"/billing/credits\",\n}: CreditHistoryProps) {\n const { client } = useBillingContext();\n const [transactions, setTransactions] = useState<CreditTransaction[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!client) {\n setError(\"No client in context\");\n setLoading(false);\n return;\n }\n\n let cancelled = false;\n\n async function fetchHistory(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/credits/${customerId}/transactions`,\n {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n },\n );\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as {\n transactions?: CreditTransaction[];\n };\n if (!cancelled) {\n setTransactions(\n (data.transactions ?? [])\n .slice()\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() -\n new Date(a.createdAt).getTime(),\n ),\n );\n setLoading(false);\n }\n } catch (err: unknown) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n setLoading(false);\n }\n }\n }\n\n void fetchHistory();\n return () => {\n cancelled = true;\n };\n }, [client, customerId]);\n\n if (loading) {\n return (\n <div className=\"animate-pulse space-y-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-6 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <span\n style={{ color: \"var(--nozle-destructive, var(--destructive))\" }}\n className=\"text-sm\"\n >\n Failed to load transactions\n </span>\n );\n }\n\n const displayed = transactions.slice(0, 20);\n\n return (\n <div className=\"space-y-2\">\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr\n style={{\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontSize: \"0.75rem\",\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n <th style={{ textAlign: \"left\", padding: \"0.25rem 0.5rem\" }}>\n Type\n </th>\n <th style={{ textAlign: \"right\", padding: \"0.25rem 0.5rem\" }}>\n Amount\n </th>\n <th style={{ textAlign: \"left\", padding: \"0.25rem 0.5rem\" }}>\n Description\n </th>\n <th style={{ textAlign: \"right\", padding: \"0.25rem 0.5rem\" }}>\n Date\n </th>\n </tr>\n </thead>\n <tbody>\n {displayed.map((tx) => (\n <tr\n key={tx.id}\n style={{\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontSize: \"0.875rem\",\n }}\n >\n <td style={{ padding: \"0.5rem\" }}>\n <span\n style={{\n ...getTypeBadgeStyle(tx.type),\n padding: \"0.125rem 0.5rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n }}\n >\n {tx.type}\n </span>\n </td>\n <td\n style={{\n textAlign: \"right\",\n padding: \"0.5rem\",\n fontVariantNumeric: \"tabular-nums\",\n color:\n tx.type === \"deduct\"\n ? \"var(--nozle-destructive, var(--destructive))\"\n : \"var(--nozle-success, #16a34a)\",\n }}\n >\n {tx.type === \"deduct\" ? \"-\" : \"+\"}\n {Math.abs(tx.amount).toLocaleString()}\n </td>\n <td\n style={{\n padding: \"0.5rem\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {tx.description}\n </td>\n <td\n style={{\n textAlign: \"right\",\n padding: \"0.5rem\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.75rem\",\n }}\n >\n {formatDate(tx.createdAt)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {transactions.length > 20 && (\n <div style={{ textAlign: \"right\" }}>\n <a\n href={viewAllHref}\n style={{\n color: \"var(--nozle-primary, var(--primary))\",\n fontSize: \"0.875rem\",\n textDecoration: \"underline\",\n }}\n >\n View all ({transactions.length})\n </a>\n </div>\n )}\n {displayed.length === 0 && (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n textAlign: \"center\",\n padding: \"1rem\",\n }}\n >\n No credit transactions yet.\n </p>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * PlanBadge — simple badge displaying plan name with tier-based coloring.\n */\n\nimport type React from \"react\";\n\nexport interface PlanBadgeProps {\n plan: string;\n tier?: \"free\" | \"starter\" | \"pro\" | \"enterprise\";\n}\n\nconst TIER_STYLES: Record<string, React.CSSProperties> = {\n free: {\n background: \"var(--nozle-muted, var(--muted, #f1f5f9))\",\n color: \"var(--nozle-muted-foreground, var(--muted-foreground, #64748b))\",\n border: \"1px solid var(--nozle-border, var(--border, #e2e8f0))\",\n },\n starter: {\n background:\n \"color-mix(in srgb, var(--nozle-primary, var(--primary, #3b82f6)) 10%, transparent)\",\n color: \"var(--nozle-primary, var(--primary, #3b82f6))\",\n border:\n \"1px solid color-mix(in srgb, var(--nozle-primary, var(--primary, #3b82f6)) 30%, transparent)\",\n },\n pro: {\n background: \"var(--nozle-primary, var(--primary, #3b82f6))\",\n color:\n \"var(--nozle-primary-foreground, var(--primary-foreground, #ffffff))\",\n border: \"1px solid transparent\",\n },\n enterprise: {\n background: \"var(--nozle-accent, var(--accent, #8b5cf6))\",\n color: \"var(--nozle-accent-foreground, var(--accent-foreground, #ffffff))\",\n border: \"1px solid transparent\",\n },\n};\n\nexport function PlanBadge({ plan, tier = \"free\" }: PlanBadgeProps) {\n const style = TIER_STYLES[tier] ?? TIER_STYLES.free;\n\n return (\n <span\n style={{\n ...style,\n display: \"inline-flex\",\n alignItems: \"center\",\n padding: \"0.125rem 0.5rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 600,\n lineHeight: \"1.25rem\",\n whiteSpace: \"nowrap\",\n }}\n >\n {plan}\n </span>\n );\n}\n","\"use client\";\n\n/**\n * CurrentPlan — shows the customer's current subscription plan.\n * Fetches from GET /api/v1/subscriptions/current.\n * Includes plan name, interval, next billing date, status.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from \"../../provider.js\";\nimport { PlanBadge } from \"./PlanBadge.js\";\n\nexport interface CurrentPlanData {\n id: string;\n planName: string;\n interval: string;\n status: string;\n nextBillingDate?: string;\n tier?: \"free\" | \"starter\" | \"pro\" | \"enterprise\";\n}\n\nexport interface CurrentPlanProps {\n customerId: string;\n onChangePlan?: () => void;\n changePlanHref?: string;\n}\n\nfunction formatDate(iso?: string): string {\n if (!iso) return \"—\";\n try {\n return new Date(iso).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nexport function CurrentPlan({\n customerId,\n onChangePlan,\n changePlanHref = \"/plans\",\n}: CurrentPlanProps) {\n const { client } = useBillingContext();\n const [plan, setPlan] = useState<CurrentPlanData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!client) {\n setError(\"No client in context\");\n setLoading(false);\n return;\n }\n\n let cancelled = false;\n\n async function fetchPlan(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/subscriptions/current?customer_id=${customerId}`,\n {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n },\n );\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as CurrentPlanData;\n if (!cancelled) {\n setPlan(data);\n setLoading(false);\n }\n } catch (err: unknown) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n setLoading(false);\n }\n }\n }\n\n void fetchPlan();\n return () => {\n cancelled = true;\n };\n }, [client, customerId]);\n\n if (loading) {\n return (\n <div className=\"animate-pulse space-y-2\">\n <div\n className=\"h-6 w-32 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n <div\n className=\"h-4 w-48 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n </div>\n );\n }\n\n if (error || !plan) {\n return (\n <span\n style={{ color: \"var(--nozle-destructive, var(--destructive))\" }}\n className=\"text-sm\"\n >\n Failed to load current plan\n </span>\n );\n }\n\n const handleChangePlan = () => {\n if (onChangePlan) {\n onChangePlan();\n } else {\n window.location.href = changePlanHref;\n }\n };\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <PlanBadge plan={plan.planName} tier={plan.tier} />\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n {plan.interval}\n </span>\n <span\n style={{\n color:\n plan.status === \"active\"\n ? \"var(--nozle-success, #16a34a)\"\n : \"var(--nozle-warning, var(--warning))\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n }}\n >\n {plan.status}\n </span>\n </div>\n {plan.nextBillingDate && (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n Next billing: {formatDate(plan.nextBillingDate)}\n </p>\n )}\n <button\n onClick={handleChangePlan}\n style={{\n background: \"transparent\",\n border: \"1px solid var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary, var(--primary))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Change Plan\n </button>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * InvoiceList — renders customer invoices with status badge and download link.\n * Fetches from GET /api/v1/invoices?customer_id={customerId}.\n */\n\nimport type React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from \"../../provider.js\";\n\nexport interface Invoice {\n id: string;\n number: string;\n date: string;\n amount: number;\n currency: string;\n status: \"draft\" | \"open\" | \"paid\" | \"void\" | \"uncollectible\";\n pdf_url?: string;\n}\n\nexport interface InvoiceListProps {\n customerId: string;\n}\n\nconst STATUS_STYLES: Record<string, React.CSSProperties> = {\n paid: {\n background: \"var(--nozle-success-bg, #dcfce7)\",\n color: \"var(--nozle-success, #16a34a)\",\n },\n open: {\n background: \"var(--nozle-info-bg, #dbeafe)\",\n color: \"var(--nozle-info, #2563eb)\",\n },\n draft: {\n background: \"var(--nozle-muted, #f1f5f9)\",\n color: \"var(--nozle-muted-foreground, #64748b)\",\n },\n void: {\n background: \"var(--nozle-muted, #f1f5f9)\",\n color: \"var(--nozle-muted-foreground, #64748b)\",\n },\n uncollectible: {\n background: \"var(--nozle-destructive-bg, #fee2e2)\",\n color: \"var(--nozle-destructive, #dc2626)\",\n },\n};\n\nfunction formatDate(iso: string): string {\n try {\n return new Date(iso).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nexport function InvoiceList({ customerId }: InvoiceListProps) {\n const { client } = useBillingContext();\n const [invoices, setInvoices] = useState<Invoice[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!client) {\n setError(\"No client in context\");\n setLoading(false);\n return;\n }\n\n let cancelled = false;\n\n async function fetchInvoices(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/invoices?customer_id=${customerId}`,\n {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n },\n );\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as {\n invoices?: Invoice[];\n data?: Invoice[];\n };\n if (!cancelled) {\n setInvoices(data.invoices ?? data.data ?? []);\n setLoading(false);\n }\n } catch (err: unknown) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n setLoading(false);\n }\n }\n }\n\n void fetchInvoices();\n return () => {\n cancelled = true;\n };\n }, [client, customerId]);\n\n if (loading) {\n return (\n <div className=\"animate-pulse space-y-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-8 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <span\n style={{ color: \"var(--nozle-destructive, var(--destructive))\" }}\n className=\"text-sm\"\n >\n Failed to load invoices\n </span>\n );\n }\n\n if (invoices.length === 0) {\n return (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n textAlign: \"center\",\n padding: \"1.5rem\",\n }}\n >\n No invoices yet.\n </p>\n );\n }\n\n return (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr\n style={{\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontSize: \"0.75rem\",\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n <th style={{ textAlign: \"left\", padding: \"0.5rem\" }}>#</th>\n <th style={{ textAlign: \"left\", padding: \"0.5rem\" }}>Date</th>\n <th style={{ textAlign: \"right\", padding: \"0.5rem\" }}>Amount</th>\n <th style={{ textAlign: \"center\", padding: \"0.5rem\" }}>Status</th>\n <th style={{ textAlign: \"center\", padding: \"0.5rem\" }}>PDF</th>\n </tr>\n </thead>\n <tbody>\n {invoices.map((inv) => (\n <tr\n key={inv.id}\n style={{\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontSize: \"0.875rem\",\n }}\n >\n <td\n style={{\n padding: \"0.5rem\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n {inv.number}\n </td>\n <td style={{ padding: \"0.5rem\" }}>{formatDate(inv.date)}</td>\n <td\n style={{\n textAlign: \"right\",\n padding: \"0.5rem\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: inv.currency ?? \"USD\",\n }).format(inv.amount / 100)}\n </td>\n <td style={{ textAlign: \"center\", padding: \"0.5rem\" }}>\n <span\n style={{\n ...(STATUS_STYLES[inv.status] ?? STATUS_STYLES.draft),\n padding: \"0.125rem 0.5rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n }}\n >\n {inv.status}\n </span>\n </td>\n <td style={{ textAlign: \"center\", padding: \"0.5rem\" }}>\n {inv.pdf_url ? (\n <a\n href={inv.pdf_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Download invoice ${inv.number}`}\n style={{\n color: \"var(--nozle-primary, var(--primary))\",\n textDecoration: \"underline\",\n fontSize: \"0.75rem\",\n }}\n >\n Download\n </a>\n ) : (\n <span\n style={{\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.75rem\",\n }}\n >\n —\n </span>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n","\"use client\";\n\n/**\n * BillingPortal — self-contained customer-facing billing portal.\n * Aggregates CurrentPlan, UsageDashboard, InvoiceList, and CreditBalance\n * in a single vertical stack.\n */\n\nimport type React from \"react\";\nimport { CurrentPlan } from \"./CurrentPlan.js\";\nimport { InvoiceList } from \"./InvoiceList.js\";\nimport { CreditBalance } from \"./CreditBalance.js\";\nimport { UsageDashboard } from \"../usage/UsageDashboard.js\";\nimport type { UsageDashboardFeature } from \"../usage/UsageDashboard.js\";\n\nexport interface BillingPortalProps {\n customerId: string;\n usageFeatures?: UsageDashboardFeature[];\n usageLoading?: boolean;\n onChangePlan?: () => void;\n subscriptionId?: string;\n onCancelled?: () => void;\n}\n\nfunction Section({\n title,\n children,\n}: {\n title: string;\n children: React.ReactNode;\n}) {\n return (\n <div\n style={{\n padding: \"1.25rem\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.75rem\",\n background: \"var(--nozle-card, var(--card, #ffffff))\",\n }}\n >\n <h3\n style={{\n fontSize: \"0.875rem\",\n fontWeight: 600,\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n marginBottom: \"1rem\",\n }}\n >\n {title}\n </h3>\n {children}\n </div>\n );\n}\n\nexport function BillingPortal({\n customerId,\n usageFeatures,\n usageLoading = false,\n onChangePlan,\n}: BillingPortalProps) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1.25rem\",\n fontFamily:\n \"var(--nozle-font-sans, var(--font-sans, system-ui, sans-serif))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n <Section title=\"Current Plan\">\n <CurrentPlan customerId={customerId} onChangePlan={onChangePlan} />\n </Section>\n\n <Section title=\"Usage\">\n <UsageDashboard features={usageFeatures} loading={usageLoading} />\n </Section>\n\n <Section title=\"Invoices\">\n <InvoiceList customerId={customerId} />\n </Section>\n\n <Section title=\"Credits\">\n <CreditBalance customerId={customerId} />\n </Section>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * PaymentMethodDisplay — shows saved payment method details.\n * Displays last4, brand, expiry. \"Update Payment Method\" button opens checkout.\n */\n\nexport interface PaymentMethod {\n last4: string;\n brand: string;\n expMonth: number;\n expYear: number;\n}\n\nexport interface PaymentMethodDisplayProps {\n paymentMethod?: PaymentMethod;\n onUpdatePaymentMethod?: () => void;\n updateHref?: string;\n}\n\nconst BRAND_LABELS: Record<string, string> = {\n visa: \"Visa\",\n mastercard: \"Mastercard\",\n amex: \"American Express\",\n discover: \"Discover\",\n jcb: \"JCB\",\n diners: \"Diners Club\",\n unionpay: \"UnionPay\",\n};\n\nexport function PaymentMethodDisplay({\n paymentMethod,\n onUpdatePaymentMethod,\n updateHref = \"/billing/update-payment\",\n}: PaymentMethodDisplayProps) {\n const handleUpdate = () => {\n if (onUpdatePaymentMethod) {\n onUpdatePaymentMethod();\n } else {\n window.location.href = updateHref;\n }\n };\n\n return (\n <div className=\"space-y-3\">\n {paymentMethod ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"0.75rem 1rem\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.5rem\",\n fontSize: \"0.875rem\",\n }}\n >\n <span\n style={{\n fontWeight: 600,\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {BRAND_LABELS[paymentMethod.brand.toLowerCase()] ??\n paymentMethod.brand}\n </span>\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n •••• {paymentMethod.last4}\n </span>\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.75rem\",\n }}\n >\n Expires {String(paymentMethod.expMonth).padStart(2, \"0\")}/\n {String(paymentMethod.expYear).slice(-2)}\n </span>\n </div>\n ) : (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n No payment method on file.\n </p>\n )}\n <button\n onClick={handleUpdate}\n style={{\n background: \"transparent\",\n border: \"1px solid var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary, var(--primary))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Update Payment Method\n </button>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * CancelSubscriptionButton — two-step cancellation flow.\n *\n * Step 1 (confirm): Opens a confirmation dialog. \"Keep Subscription\" closes\n * without any API call.\n *\n * Step 2 (reason): \"Confirm Cancel\" transitions to a reason survey with 5\n * radio options. Selecting \"Other\" shows a free-text input.\n * \"Submit Cancellation\" calls DELETE /api/v1/subscriptions/{id}\n * with body { reason: string }.\n */\n\nimport { useState } from \"react\";\n\ntype CancelStep = \"idle\" | \"confirm\" | \"reason\";\n\nexport const CANCEL_REASONS = [\n \"Too expensive\",\n \"Missing features\",\n \"Switching to competitor\",\n \"Not using it enough\",\n \"Other\",\n] as const;\n\nexport interface CancelSubscriptionButtonProps {\n subscriptionId: string;\n onCancelled?: () => void;\n}\n\nexport function CancelSubscriptionButton({\n subscriptionId,\n onCancelled,\n}: CancelSubscriptionButtonProps) {\n const [step, setStep] = useState<CancelStep>(\"idle\");\n const [selectedReason, setSelectedReason] = useState(\"\");\n const [otherText, setOtherText] = useState(\"\");\n const [loading, setLoading] = useState(false);\n\n const handleDismiss = () => {\n setStep(\"idle\");\n setSelectedReason(\"\");\n setOtherText(\"\");\n };\n\n const handleConfirmCancel = () => {\n setStep(\"reason\");\n };\n\n const handleSubmitCancellation = async () => {\n const reason = selectedReason === \"Other\" ? otherText : selectedReason;\n setLoading(true);\n await fetch(`/api/v1/subscriptions/${subscriptionId}`, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reason }),\n });\n setLoading(false);\n handleDismiss();\n onCancelled?.();\n };\n\n const isSubmitDisabled =\n loading ||\n !selectedReason ||\n (selectedReason === \"Other\" && !otherText.trim());\n\n return (\n <>\n <button\n onClick={() => setStep(\"confirm\")}\n style={{\n background: \"transparent\",\n border:\n \"1px solid var(--nozle-destructive, var(--destructive, #dc2626))\",\n color: \"var(--nozle-destructive, var(--destructive, #dc2626))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Cancel Subscription\n </button>\n\n {step === \"confirm\" && (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Cancel subscription confirmation\"\n style={{\n position: \"fixed\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.4)\",\n zIndex: 50,\n }}\n >\n <div\n style={{\n background: \"var(--nozle-background, var(--background, #fff))\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.75rem\",\n padding: \"1.5rem\",\n maxWidth: \"28rem\",\n width: \"90%\",\n boxShadow: \"0 20px 60px rgba(0,0,0,0.15)\",\n }}\n >\n <h2\n style={{\n fontSize: \"1.125rem\",\n fontWeight: 600,\n marginBottom: \"0.75rem\",\n }}\n >\n Cancel Subscription?\n </h2>\n <p\n style={{\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n marginBottom: \"1.5rem\",\n }}\n >\n Your access will end at the end of the billing period.\n </p>\n <div\n style={{\n display: \"flex\",\n gap: \"0.75rem\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={handleDismiss}\n style={{\n background: \"transparent\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n cursor: \"pointer\",\n }}\n >\n Keep Subscription\n </button>\n <button\n onClick={handleConfirmCancel}\n style={{\n background:\n \"var(--nozle-destructive, var(--destructive, #dc2626))\",\n border: \"1px solid transparent\",\n color: \"#fff\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Confirm Cancel\n </button>\n </div>\n </div>\n </div>\n )}\n\n {step === \"reason\" && (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Cancellation reason survey\"\n style={{\n position: \"fixed\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.4)\",\n zIndex: 50,\n }}\n >\n <div\n style={{\n background: \"var(--nozle-background, var(--background, #fff))\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.75rem\",\n padding: \"1.5rem\",\n maxWidth: \"28rem\",\n width: \"90%\",\n boxShadow: \"0 20px 60px rgba(0,0,0,0.15)\",\n }}\n >\n <h2\n style={{\n fontSize: \"1.125rem\",\n fontWeight: 600,\n marginBottom: \"0.5rem\",\n }}\n >\n Why are you cancelling?\n </h2>\n <p\n style={{\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n marginBottom: \"1rem\",\n }}\n >\n Your feedback helps us improve.\n </p>\n <fieldset\n style={{\n border: \"none\",\n padding: 0,\n margin: 0,\n marginBottom: \"1rem\",\n }}\n >\n <legend className=\"sr-only\">Cancellation reason</legend>\n {CANCEL_REASONS.map((r) => (\n <label\n key={r}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n padding: \"0.375rem 0\",\n fontSize: \"0.875rem\",\n cursor: \"pointer\",\n }}\n >\n <input\n type=\"radio\"\n name=\"cancel-reason\"\n value={r}\n checked={selectedReason === r}\n onChange={() => setSelectedReason(r)}\n aria-label={r}\n />\n {r}\n </label>\n ))}\n </fieldset>\n {selectedReason === \"Other\" && (\n <input\n type=\"text\"\n placeholder=\"Please describe your reason\"\n value={otherText}\n onChange={(e) => setOtherText(e.target.value)}\n aria-label=\"Other reason\"\n style={{\n width: \"100%\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.375rem\",\n padding: \"0.5rem 0.75rem\",\n fontSize: \"0.875rem\",\n marginBottom: \"1rem\",\n background:\n \"var(--nozle-background, var(--background, #fff))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n boxSizing: \"border-box\",\n }}\n />\n )}\n <div\n style={{\n display: \"flex\",\n gap: \"0.75rem\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={handleDismiss}\n style={{\n background: \"transparent\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n cursor: \"pointer\",\n }}\n >\n Keep Subscription\n </button>\n <button\n onClick={handleSubmitCancellation}\n disabled={isSubmitDisabled}\n style={{\n background: isSubmitDisabled\n ? \"var(--nozle-muted, var(--muted, #f1f5f9))\"\n : \"var(--nozle-destructive, var(--destructive, #dc2626))\",\n border: \"1px solid transparent\",\n color: isSubmitDisabled\n ? \"var(--nozle-muted-foreground, var(--muted-foreground))\"\n : \"#fff\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: isSubmitDisabled ? \"not-allowed\" : \"pointer\",\n }}\n >\n {loading ? \"Cancelling...\" : \"Submit Cancellation\"}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider.tsx","../src/hooks/use-plans.ts","../src/components/billing/checkout-navigation.ts","../src/hooks/use-checkout.ts","../src/components/billing/CheckoutButton.tsx","../src/components/pricing/PricingTable.tsx","../src/components/pricing/PlanCard.tsx","../src/components/pricing/PlanComparison.tsx","../src/components/billing/Checkout.tsx","../src/components/billing/UpgradeModal.tsx","../src/components/billing/UpgradeButton.tsx","../src/components/gates/FeatureGate.tsx","../src/components/gates/UsageGate.tsx","../src/components/gates/PlanGate.tsx","../src/components/gates/UpgradePrompt.tsx","../src/components/gates/LockedOverlay.tsx","../src/components/usage/UsageMeter.tsx","../src/components/usage/UsageDashboard.tsx","../src/components/usage/UsageAlert.tsx","../src/components/billing/PlanBadge.tsx","../src/components/billing/PaymentMethodDisplay.tsx"],"names":["createContext","useMemo","React","useContext","useState","useEffect","useCallback","jsxs","Fragment","jsx","useCheckout","useStripe","useElements","PaymentElement","loadStripe","EmbeddedCheckoutProvider","StripeEmbeddedCheckout","Elements"],"mappings":";;;;;;;;;;;;AA+CA,SAAS,YAAA,CAAa,gBAAwB,OAAA,EAA8B;AAC1E,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAEvC,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,YAAA,CAAa,MAAc,IAAA,EAAuC;AAChE,MAAA,OAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,QAC7B,GAAG,IAAA;AAAA,QACH,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,UAAU,cAAc,CAAA,CAAA;AAAA,UACvC,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAG,IAAA,EAAM;AAAA;AACX,OACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAOO,IAAM,cAAA,GAAiBA,oBAA0C,IAAI;AASrE,SAAS,eAAA,CAAgB;AAAA,EAC9B,cAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA,GAAU,uBAAA;AAAA,EACV;AACF,CAAA,EAA6C;AAC3C,EAAA,IAAI,CAAC,cAAA,CAAe,UAAA,CAAW,KAAK,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,MAAA,GAASC,aAAA;AAAA,IACb,MAAM,YAAA,CAAa,cAAA,EAAgB,OAAO,CAAA;AAAA,IAC1C,CAAC,gBAAgB,OAAO;AAAA,GAC1B;AACA,EAAA,MAAM,YAAA,GAAeA,aAAA;AAAA,IACnB,OAAO,EAAE,MAAA,EAAQ,cAAA,EAAe,CAAA;AAAA,IAChC,CAAC,QAAQ,cAAc;AAAA,GACzB;AAEA,EAAA,OAAOC,sBAAA,CAAM,cAAc,cAAA,CAAe,QAAA,EAAU,EAAE,KAAA,EAAO,YAAA,IAAgB,QAAQ,CAAA;AACvF;AAEO,SAAS,yBAAA,GAAwD;AACtE,EAAA,OAAOC,iBAAW,cAAc,CAAA;AAClC;AAEO,SAAS,iBAAA,GAAyC;AACvD,EAAA,MAAM,UAAU,yBAAA,EAA0B;AAC1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,cAAA,GAA8B;AAC5C,EAAA,OAAO,mBAAkB,CAAE,MAAA;AAC7B;ACzGO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,iBAAA,EAAkB;AACrC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,cAAA,CAAiB,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAE/C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,KAAK,OACF,YAAA,CAAa,eAAe,CAAA,CAC5B,IAAA,CAAK,OAAO,QAAA,KAAa;AACxB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAC3D,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AAAA,IAC3C,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAI,CAAC,SAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAO,EAAE,OAAO,SAAA,EAAU;AAC5B;;;ACxCO,SAAS,kBAAA,CACd,GAAA,EACA,QAAA,GAAqC,MAAA,CAAO,QAAA,EACtC;AACN,EAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AACrB;;;ACMO,SAAS,WAAA,GAAiC;AAC/C,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,iBAAA,EAAkB;AAC7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAID,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAgC,IAAI,CAAA;AAEpE,EAAA,MAAM,iBAAA,GAAoBE,iBAAA;AAAA,IACxB,OAAO,UAAkB,SAAA,KAA+C;AACtE,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,QACpF;AACA,QAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,UAClC,QAAA;AAAA,UACA,SAAA,EAAW,SAAA,IAAa,MAAA,CAAO,QAAA,CAAS;AAAA,SACzC,CAAA;AACD,QAAA,WAAA,CAAY,MAAM,CAAA;AAElB,QAAA,IAAI,eAAA,IAAmB,MAAA,IAAU,cAAA,IAAkB,MAAA,EAAQ;AACzD,UAAA,MAAM,YAAA,GAAe,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,YAAA;AACpD,UAAA,IAAI,cAAc,OAAO,YAAA;AAAA,QAC3B;AACA,QAAA,IAAI,KAAA,IAAS,MAAA,IAAU,MAAA,CAAO,GAAA,EAAK;AACjC,UAAA,kBAAA,CAAmB,OAAO,GAAG,CAAA;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,IAAI,UAAU,MAAA,KAAW,MAAA,CAAO,SAAS,WAAA,IAAe,MAAA,CAAO,SAAS,WAAA,CAAA,EAAc;AACpF,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,MAC7E,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,aAAA,GAAgB,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAC9E,QAAA,QAAA,CAAS,aAAa,CAAA;AACtB,QAAA,MAAM,aAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,OAAO,EAAE,iBAAA,EAAmB,QAAA,EAAU,SAAA,EAAW,KAAA,EAAM;AACzD;AClBA,SAAS,kBAAA,GAAoC;AAC3C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,QAAA,CAAS,cAAA,CAAe,aAAa,CAAA,EAAG;AAC1C,MAAA,OAAA,EAAQ;AACR,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,EAAA,GAAK,aAAA;AACZ,IAAA,MAAA,CAAO,GAAA,GAAM,8CAAA;AACb,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,IAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,4BAA4B,CAAC,CAAA;AACrE,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAClC,CAAC,CAAA;AACH;AAEA,eAAsB,oBAAA,CACpB,QACA,OAAA,EAQe;AACf,EAAA,IAAI,MAAA,IAAU,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,WAAA,EAAa;AACnD,IAAA,OAAA,CAAQ,cAAc,MAAM,CAAA;AAC5B,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAA,IAAU,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,WAAA,EAAa;AACnD,IAAA,OAAA,CAAQ,aAAa,MAAM,CAAA;AAC3B,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAA,IAAU,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAClD,IAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,EAAe,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAC7F,IAAA,MAAM,kBAAA,EAAmB;AACzB,IAAA,MAAM,QAAA,GAAW,IAAI,MAAA,CAAO,QAAA,CAAS;AAAA,MACnC,KAAK,OAAA,CAAQ,aAAA;AAAA,MACb,UAAU,MAAA,CAAO,OAAA;AAAA,MACjB,SAAS,CAAC,QAAA,KAAa,OAAA,CAAQ,SAAA,GAAY,SAAS,mBAAmB;AAAA,KACxE,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,EAAK;AACd,IAAA;AAAA,EACF;AACA,EAAA,IAAI,KAAA,IAAS,MAAA,IAAU,MAAA,CAAO,GAAA,EAAK;AACjC,IAAA,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA;AACjC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAA,IAAU,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,QAAA,EAAU;AAChD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,aAAA;AACnD,IAAA,IAAI,YAAA,IAAgB,QAAQ,oBAAA,EAAsB;AAChD,MAAA,OAAA,CAAQ,qBAAqB,YAAY,CAAA;AACzC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAA,EAAc,MAAM,IAAI,KAAA,CAAM,+DAA+D,CAAA;AACjG,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AACpD;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA,GAAQ,aAAA;AAAA,EACR,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,iBAAA,EAAkB;AAC7C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIF,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AAErD,EAAA,eAAe,WAAA,GAA6B;AAC1C,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,MACpF;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,QAClC,QAAA;AAAA,QACA,SAAA,EAAW,SAAA,IAAa,MAAA,CAAO,QAAA,CAAS;AAAA,OACzC,CAAA;AACD,MAAA,MAAM,qBAAqB,MAAA,EAAQ;AAAA,QACjC,aAAA;AAAA,QACA,oBAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,gBAAgB,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,iBAAiB,CAAA;AAClF,MAAA,QAAA,CAAS,aAAa,CAAA;AACtB,MAAA,OAAA,GAAU,aAAa,CAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,uBACEG,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,KAAK,WAAA,EAAY;AAAA,QAChC,QAAA,EAAU,OAAA;AAAA,QACV,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,gBAAA;AAAA,UACT,YAAA,EAAc,6BAAA;AAAA,UACd,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY,sCAAA;AAAA,UACZ,KAAA,EAAO,4DAAA;AAAA,UACP,MAAA,EAAQ,UAAU,aAAA,GAAgB,SAAA;AAAA,UAClC,UAAA,EAAY,GAAA;AAAA,UACZ,OAAA,EAAS,UAAU,GAAA,GAAM,CAAA;AAAA,UACzB,GAAG;AAAA,SACL;AAAA,QACA,WAAA,EAAW,OAAA;AAAA,QAEV,oBAAU,YAAA,GAAe;AAAA;AAAA,KAC5B;AAAA,IACC,yBAASA,cAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,OAAA,EAAS,gBAAM,OAAA,EAAQ;AAAA,GAAA,EAC9C,CAAA;AAEJ;AClIA,IAAM,OAAA,GAAkC,EAAE,GAAA,EAAK,GAAA,EAAK,KAAK,QAAA,EAAK,GAAA,EAAK,MAAA,EAAK,GAAA,EAAK,MAAA,EAAI;AAEjF,SAAS,QAAA,CAAS,OAAe,GAAA,EAAqB;AACpD,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAG,CAAA,IAAK,GAAA,GAAM,GAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,GAAA,KAAQ,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,GAAG,CAAA,GAAA,CAAK,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA;AAC7E,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA;AACnB;AAEA,SAAS,aAAa,CAAA,EAAyB;AAC7C,EAAA,OAAO,oBAAA,CAAqB,IAAA,CAAK,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAClD;AAEA,SAAS,CAAA,CAAE,MAAc,EAAA,EAAoB;AAC3C,EAAA,OAAO,CAAA,IAAA,EAAO,IAAI,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,CAAA;AAC3B;AAIA,IAAM,CAAA,GAAI;AAAA,EACR,IAAU,CAAA,CAAE,oBAAA,EAAsB,CAAA,CAAE,oBAAA,EAAsB,SAAS,CAAC,CAAA;AAAA,EACpE,QAAU,CAAA,CAAE,yBAAA,EAA2B,CAAA,CAAE,cAAA,EAAgB,SAAS,CAAC,CAAA;AAAA,EACnE,IAAU,CAAA,CAAE,2BAAA,EAA6B,CAAA,CAAE,iBAAA,EAAmB,SAAS,CAAC,CAAA;AAAA,EACxE,QAAU,CAAA,CAAE,wBAAA,EAA0B,CAAA,CAAE,gBAAA,EAAkB,SAAS,CAAC,CAAA;AAAA,EACpE,QAAU,CAAA,CAAE,wBAAA,EAA0B,CAAA,CAAE,gBAAA,EAAkB,MAAM,CAAC,CAAA;AAAA,EACjE,IAAA,EAAU,CAAA,CAAE,oBAAA,EAAsB,SAAS,CAAA;AAAA,EAC3C,KAAA,EAAU,CAAA,CAAE,0BAAA,EAA4B,SAAS,CAAA;AAAA,EACjD,OAAA,EAAU,CAAA,CAAE,eAAA,EAAiB,SAAS,CAAA;AAAA,EACtC,IAAA,EAAU,CAAA,CAAE,4BAAA,EAA8B,SAAS;AACrD,CAAA;AAIA,SAAS,KAAA,GAA4B;AACnC,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA,EAAE,EACjF,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4BAAA,EAA6B,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,MAAA,EAAO,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SAAQ,CAAA,EAC7H,CAAA;AAEJ;AAIA,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,QAAA,EAAS,EAA0D;AAC7F,EAAA,MAAM,IAAA,GAAsB;AAAA,IAC1B,OAAA,EAAS,aAAA;AAAA,IACT,YAAA,EAAc,QAAA;AAAA,IACd,OAAA,EAAS,KAAA;AAAA,IACT,YAAY,CAAA,CAAE,OAAA;AAAA,IACd,GAAA,EAAK;AAAA,GACP;AACA,EAAA,MAAM,GAAA,GAAM,CAAC,MAAA,MAAoC;AAAA,IAC/C,OAAA,EAAS,UAAA;AAAA,IACT,YAAA,EAAc,QAAA;AAAA,IACd,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,MAAA,GAAS,CAAA,CAAE,MAAA,GAAS,aAAA;AAAA,IAChC,KAAA,EAAO,MAAA,GAAS,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,KAAA;AAAA,IAC3B,UAAA,EAAY,SAAS,GAAA,GAAM,GAAA;AAAA,IAC3B,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,SAAS,4BAAA,GAA+B,MAAA;AAAA,IACnD,UAAA,EAAY;AAAA,GACd,CAAA;AAEA,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,YAAA,EAAc,UAAS,EAC9E,QAAA,kBAAAF,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,IAAA,EACV,QAAA,EAAA;AAAA,oBAAAE,cAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,SAAS,KAAK,CAAA,EAAG,KAAA,EAAO,GAAA,CAAI,CAAC,QAAQ,CAAA,EAAG,cAAA,EAAc,CAAC,UAAU,QAAA,EAAA,SAAA,EAExF,CAAA;AAAA,oBACAF,eAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA,EAAG,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAA,EAAG,gBAAc,QAAA,EAAU,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,sBAEnFE,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO;AAAA,QACX,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY,GAAA;AAAA,QACZ,KAAA,EAAO,QAAA,GAAW,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE;AAAA,SAC1B,QAAA,EAAA,UAAA,EAEH;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAcA,SAAS,IAAA,CAAK;AAAA,EACZ,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,eAAS,KAAK,CAAA;AAExC,EAAA,MAAM,MAAA,GAAS,aAAA,GACX,mEAAA,GACA,KAAA,GACA,yDAAA,GACA,wDAAA;AAEJ,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,OAAA,GAAU,QAAA;AAExD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,CAAA,OAAA,EAAU,eAAe,CAAA,gCAAA,CAAA;AAChD,MAAA;AAAA,IACF;AACA,IAAA,QAAA,IAAW;AAAA,EACb,CAAA;AAEA,EAAA,uBACEG,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAc,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,MACjC,YAAA,EAAc,MAAM,QAAA,CAAS,KAAK,CAAA;AAAA,MAClC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,YAAY,CAAA,CAAE,MAAA;AAAA,QACd,QAAQ,CAAA,UAAA,EAAa,aAAA,GAAgB,CAAA,CAAE,EAAA,GAAK,EAAE,MAAM,CAAA,CAAA;AAAA,QACpD,cAAA,EAAgB,gBAAgB,KAAA,GAAQ,KAAA;AAAA,QACxC,cAAc,CAAA,CAAE,MAAA;AAAA,QAChB,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,2CAAA;AAAA,QACZ,SAAA,EAAW,MAAA;AAAA,QACX,SAAA,EAAW,KAAA,IAAS,CAAC,SAAA,GAAY,kBAAA,GAAqB;AAAA,OACxD;AAAA,MAGC,QAAA,EAAA;AAAA,QAAA,aAAA,oBACCE,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,UACV,QAAA,EAAU,UAAA;AAAA,UACV,GAAA,EAAK,MAAA;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,SAAA,EAAW,uBAAA;AAAA,UACX,YAAY,CAAA,CAAE,EAAA;AAAA,UACd,OAAO,CAAA,CAAE,IAAA;AAAA,UACT,QAAA,EAAU,QAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,OAAA,EAAS,UAAA;AAAA,UACT,YAAA,EAAc,QAAA;AAAA,UACd,aAAA,EAAe,SAAA;AAAA,UACf,aAAA,EAAe,WAAA;AAAA,UACf,UAAA,EAAY;AAAA,SACd,EACG,QAAA,EAAA,SAAA,GAAY,cAAA,GAAiB,cAAA,EAChC,CAAA;AAAA,QAED,aAAa,CAAC,aAAA,oBACbA,cAAAA,CAAC,SAAI,KAAA,EAAO;AAAA,UACV,QAAA,EAAU,UAAA;AAAA,UACV,GAAA,EAAK,GAAA;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,SAAA,EAAW,uBAAA;AAAA,UACX,YAAY,CAAA,CAAE,OAAA;AAAA,UACd,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,QAAA,EAAU,QAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,OAAA,EAAS,UAAA;AAAA,UACT,YAAA,EAAc,QAAA;AAAA,UACd,aAAA,EAAe,SAAA;AAAA,UACf,aAAA,EAAe,WAAA;AAAA,UACf,UAAA,EAAY;AAAA,WACX,QAAA,EAAA,cAAA,EAEH,CAAA;AAAA,wBAIFF,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EAAc,SAAA,EAAW,SAAA,EAAW,aAAA,IAAiB,SAAA,GAAY,QAAA,GAAW,CAAA,EAAE,EAC1F,QAAA,EAAA;AAAA,0BAAAE,cAAAA,CAAC,QAAG,KAAA,EAAO;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,UAAA,EAAY,GAAA;AAAA,YACZ,OAAO,CAAA,CAAE,IAAA;AAAA,YACT,MAAA,EAAQ,CAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd,EACG,eAAK,IAAA,EACR,CAAA;AAAA,UACC,IAAA,CAAK,WAAA,oBACJA,cAAAA,CAAC,OAAE,KAAA,EAAO;AAAA,YACR,QAAA,EAAU,UAAA;AAAA,YACV,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,MAAA,EAAQ,SAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd,EACG,eAAK,WAAA,EACR;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,cAAc,QAAA,EAAS,EAClC,QAAA,EAAA,KAAA,mBACCA,eAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,WAAW,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,CAAA,CAAE,MAAM,UAAA,EAAY,CAAA,EAAE,EAAG,QAAA,EAAA,QAAA,EAErF,oBAEAF,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,YAAY,UAAA,EAAY,GAAA,EAAK,OAAM,EAChE,QAAA,EAAA;AAAA,0BAAAE,cAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,UAAU,SAAA,EAAW,UAAA,EAAY,KAAK,KAAA,EAAO,CAAA,CAAE,MAAM,UAAA,EAAY,CAAA,EAAG,eAAe,UAAA,EAAW,EAC1G,mBAAS,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,eAAe,CAAA,EACnD,CAAA;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,KAAA,IAC/D,QAAA,EAAA,QAAA,EACH;AAAA,SAAA,EACF,CAAA,EAEJ,CAAA;AAAA,QAGC,YAAY,QAAA,CAAS,MAAA,GAAS,qBAC7BA,cAAAA,CAAC,QAAG,KAAA,EAAO;AAAA,UACT,SAAA,EAAW,MAAA;AAAA,UACX,OAAA,EAAS,CAAA;AAAA,UACT,MAAA,EAAQ,UAAA;AAAA,UACR,OAAA,EAAS,MAAA;AAAA,UACT,aAAA,EAAe,QAAA;AAAA,UACf,GAAA,EAAK,SAAA;AAAA,UACL,IAAA,EAAM;AAAA,SACR,EACG,mBAAS,GAAA,CAAI,CAAC,yBACbF,eAAAA,CAAC,QAAc,KAAA,EAAO;AAAA,UACpB,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,YAAA;AAAA,UACZ,GAAA,EAAK,MAAA;AAAA,UACL,QAAA,EAAU,UAAA;AAAA,UACV,OAAO,CAAA,CAAE,IAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd,EACE,QAAA,EAAA;AAAA,0BAAAE,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,CAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAM,EAAG,QAAA,kBAAAA,cAAAA,CAAC,SAAM,CAAA,EAAE,CAAA;AAAA,0BACzDA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,EAAK;AAAA,SAAA,EAAA,EATL,IAUT,CACD,CAAA,EACH,CAAA;AAAA,QAAA,CAIA,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,qBAAMA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAG,CAAA;AAAA,QAGjE,4BACCA,cAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,WAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,SAAS,SAAA,GAAY,SAAA,GAAY,KAAA,GAAQ,SAAA,GAAY,gBAAgB,SAAA,GAAY,WAAA;AAAA,YAEhF,sBAAY,cAAA,GAAiB,KAAA,GAAQ,eAAA,GAAkB,CAAA,IAAA,EAAO,KAAK,IAAI,CAAA;AAAA;AAAA;AAC1E;AAAA;AAAA,GAEJ;AAEJ;AAMA,SAAS,SAAA,CAAU;AAAA,EACjB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,eAAS,KAAK,CAAA;AAExC,EAAA,MAAM,IAAA,GAAsB;AAAA,IAC1B,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,WAAA;AAAA,IACT,YAAA,EAAc,MAAA;AAAA,IACd,QAAA,EAAU,WAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,MAAA,EAAQ,WAAW,SAAA,GAAY,SAAA;AAAA,IAC/B,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,gBAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,QAAA,GAAiD;AAAA,IACrD,OAAA,EAAS;AAAA,MACP,UAAA,EAAY,KAAA,IAAS,CAAC,QAAA,GAAW,YAAY,CAAA,CAAE,EAAA;AAAA,MAC/C,OAAO,CAAA,CAAE;AAAA,KACX;AAAA,IACA,SAAA,EAAW;AAAA,MACT,UAAA,EAAY,KAAA,IAAS,CAAC,QAAA,GAAW,YAAY,CAAA,CAAE,OAAA;AAAA,MAC/C,OAAO,CAAA,CAAE,IAAA;AAAA,MACT,MAAA,EAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,KAC/B;AAAA,IACA,OAAA,EAAS;AAAA,MACP,UAAA,EAAY,KAAA,IAAS,CAAC,QAAA,GAAW,uBAAA,GAA0B,aAAA;AAAA,MAC3D,OAAO,CAAA,CAAE,EAAA;AAAA,MACT,MAAA,EAAQ,CAAA,YAAA,EAAe,CAAA,CAAE,EAAE,CAAA;AAAA,KAC7B;AAAA,IACA,OAAA,EAAS;AAAA,MACP,YAAY,CAAA,CAAE,OAAA;AAAA,MACd,OAAO,CAAA,CAAE;AAAA;AACX,GACF;AAEA,EAAA,uBACEK,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,MAChC,QAAA;AAAA,MACA,YAAA,EAAc,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,MACjC,YAAA,EAAc,MAAM,QAAA,CAAS,KAAK,CAAA;AAAA,MAClC,OAAO,EAAE,GAAG,MAAM,GAAG,QAAA,CAAS,OAAO,CAAA,EAAE;AAAA,MAEtC;AAAA;AAAA,GACH;AAEJ;AAIA,SAAS,QAAA,GAA+B;AACtC,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IACT,mBAAA,EAAqB,sCAAA;AAAA,IACrB,GAAA,EAAK;AAAA,GACP,EACG,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACdF,eAAAA,CAAC,KAAA,EAAA,EAAY,KAAA,EAAO;AAAA,IAClB,YAAY,CAAA,CAAE,MAAA;AAAA,IACd,MAAA,EAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA,CAAA;AAAA,IAC7B,cAAc,CAAA,CAAE,MAAA;AAAA,IAChB,OAAA,EAAS,MAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV,EACE,QAAA,EAAA;AAAA,oBAAAE,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAQ,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,CAAA,EAAG,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,IAAG,EAAG,CAAA;AAAA,oBACpGA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAc,CAAA,EAAG,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,IAAG,EAAG,CAAA;AAAA,oBACpGA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAc,CAAA,EAAG,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,IAAG,EAAG,CAAA;AAAA,oBACpGA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,cAAc,CAAA,EAAG,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,IAAG,EAAG,CAAA;AAAA,oBACpGA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,CAAA,EAAG,UAAA,EAAY,WAAU,EAAG;AAAA,GAAA,EAAA,EAX1E,CAYV,CACD,CAAA,EACH,CAAA;AAEJ;AAIO,SAAS,YAAA,CAAa;AAAA,EAC3B,eAAA;AAAA,EACA,KAAA,EAAO,SAAA;AAAA,EACP,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,oBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA0C;AACxC,EAAA,MAAM,UAAU,yBAAA,EAA0B;AAC1C,EAAA,MAAM,SAAS,OAAA,EAAS,MAAA;AACxB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIL,cAAAA,CAAwB,SAAA,IAAa,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAAA,CAAwB,mBAAmB,IAAI,CAAA;AACrF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAAA,CAAS,CAAC,SAAS,CAAA;AACjD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtE,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW;AAAE,MAAA,QAAA,CAAS,SAAS,CAAA;AAAG,MAAA;AAAA,IAAQ;AAC9C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,gBAAA,CAAiB,iEAAiE,CAAA;AAClF,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAA,CAAO,YAAA,CAAa,eAAe,CAAA,CAAE,IAAA,CAAK,OAAO,GAAA,KAAQ;AACvD,MAAA,IAAI,CAAC,SAAA,IAAa,GAAA,CAAI,EAAA,EAAI;AACxB,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,QAAA,CAAS,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AAAA,MAC3B;AAAA,IACF,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM;AAAE,MAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,IAAG,CAAC,CAAA;AACvD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AAEtB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,eAAA,KAAoB,MAAA,EAAW,cAAA,CAAe,eAAe,CAAA;AAAA,EACnE,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,eAAe,WAAW,IAAA,EAAkC;AAC1D,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,SAAS,cAAA,EAAgB;AAC5B,QAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,MACpF;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,cAAA,CAAe;AAAA,QAC1C,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,SAAA,EAAW,SAAA,IAAa,MAAA,CAAO,QAAA,CAAS;AAAA,OACzC,CAAA;AACD,MAAA,gBAAA,GAAmB,MAAM,CAAA;AACzB,MAAA,MAAM,oBAAA,CAAqB,MAAA,EAAQ,EAAE,oBAAA,EAAsB,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,iBAAiB,CAAA;AAC1E,MAAA,gBAAA,CAAiB,MAAM,OAAO,CAAA;AAC9B,MAAA,eAAA,GAAkB,KAAK,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,QAAQ,CAAA;AACzD,EAAA,MAAM,QAAA,GAAW,UAAA,IAAc,SAAA,GAC3B,KAAA,CAAM,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,MAAc,QAAA,GAAW,QAAA,GAAW,SAAA,CAAA,IAAc,YAAA,CAAa,CAAC,CAAC,CAAA,GACrF,KAAA;AAEJ,EAAA,IAAI,OAAA,EAAS,uBAAOI,cAAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAE9B,EAAA,uBACEF,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO;AAAA,IAChC,UAAA,EAAY,sEAAA;AAAA,IACZ,OAAO,CAAA,CAAE,IAAA;AAAA,IACT,YAAY,CAAA,CAAE;AAAA,GAChB,EACG,QAAA,EAAA;AAAA,IAAA,UAAA,IAAc,6BACbE,cAAAA,CAAC,MAAA,EAAA,EAAO,QAAA,EAAoB,UAAU,WAAA,EAAa,CAAA;AAAA,IAGpD,iCAAiBA,cAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,SAAS,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,oBAEjDA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,mBAAA,EAAqB,sCAAA;AAAA,MACrB,GAAA,EAAK;AAAA,OAEJ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,EAAM,sBACnBA,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,QACtB,SAAA,EAAW,gBAAgB,IAAA,CAAK,IAAA;AAAA,QAChC,aAAA,EAAe,kBAAkB,IAAA,CAAK,IAAA;AAAA,QACtC,KAAA,EAAO,aAAa,IAAI,CAAA;AAAA,QACxB,eAAA;AAAA,QACA,QAAA,EAAU,MAAM,KAAK,UAAA,CAAW,IAAI;AAAA,OAAA;AAAA,MAP/B,IAAA,CAAK;AAAA,KASb,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACtdO,SAAS,QAAA,CAAS;AAAA,EACvB,EAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAsC;AACpC,EAAA,MAAM,KAAA,GAAQ,WAAW,WAAA,GAAc,YAAA;AACvC,EAAA,MAAM,QAAA,GAAW,WAAW,MAAA,GAAS,OAAA;AAErC,EAAA,uBACEF,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAa,aAAa,EAAE,CAAA,CAAA;AAAA,MAC5B,cAAA,EAAc,YAAY,MAAA,GAAS,MAAA;AAAA,MACnC,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,4CAAA;AAAA,QACZ,MAAA,EAAQ,YACJ,gDAAA,GACA,8CAAA;AAAA,QACJ,YAAA,EAAc,6BAAA;AAAA,QACd,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,GAAA,EAAK;AAAA,OACP;AAAA,MACA,SAAA,EAAW,YAAY,gBAAA,GAAmB,EAAA;AAAA,MAE1C,QAAA,EAAA;AAAA,wBAAAA,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAE,cAAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,SAAA;AAAA,gBACV,UAAA,EAAY,GAAA;AAAA,gBACZ,KAAA,EAAO,4CAAA;AAAA,gBACP,MAAA,EAAQ;AAAA,eACV;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACC,+BACCA,cAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,wDAAA;AAAA,gBACP,QAAA,EAAU,UAAA;AAAA,gBACV,MAAA,EAAQ;AAAA,eACV;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACH,SAAA,EAEJ,CAAA;AAAA,wBAEAF,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAA,eAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,QAAA,EAAU,MAAA;AAAA,gBACV,UAAA,EAAY,GAAA;AAAA,gBACZ,KAAA,EAAO;AAAA,eACT;AAAA,cACD,QAAA,EAAA;AAAA,gBAAA,GAAA;AAAA,gBACG;AAAA;AAAA;AAAA,WACJ;AAAA,0BACAA,eAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,wDAAA;AAAA,gBACP,UAAA,EAAY;AAAA,eACd;AAAA,cACD,QAAA,EAAA;AAAA,gBAAA,GAAA;AAAA,gBACG;AAAA;AAAA;AAAA;AACJ,SAAA,EACF,CAAA;AAAA,wBAEAE,cAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,SAAA,EAAW,MAAA;AAAA,cACX,OAAA,EAAS,CAAA;AAAA,cACT,MAAA,EAAQ,CAAA;AAAA,cACR,OAAA,EAAS,MAAA;AAAA,cACT,aAAA,EAAe,QAAA;AAAA,cACf,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAM;AAAA,aACR;AAAA,YAEC,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACbF,eAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAEC,KAAA,EAAO;AAAA,kBACL,OAAA,EAAS,MAAA;AAAA,kBACT,UAAA,EAAY,QAAA;AAAA,kBACZ,GAAA,EAAK,QAAA;AAAA,kBACL,KAAA,EAAO,4CAAA;AAAA,kBACP,QAAA,EAAU;AAAA,iBACZ;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAE,cAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO,EAAE,KAAA,EAAO,sCAAA,EAAuC;AAAA,sBACvD,aAAA,EAAY,MAAA;AAAA,sBACb,QAAA,EAAA;AAAA;AAAA,mBAED;AAAA,kBACC;AAAA;AAAA,eAAA;AAAA,cAfI;AAAA,aAiBR;AAAA;AAAA,SACH;AAAA,QAEC,4BACCA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MACP,QAAA,GAAW;AAAA,cACT,QAAA,EAAU,EAAA;AAAA,cACV,SAAA,EAAW,SAAA,IAAa,MAAA,CAAO,QAAA,CAAS;AAAA,aACzC,CAAA;AAAA,YAEH,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,YACR,kCAAA,GACA,sCAAA;AAAA,cACJ,KAAA,EAAO,YACH,wDAAA,GACA,4DAAA;AAAA,cACJ,MAAA,EAAQ,MAAA;AAAA,cACR,YAAA,EAAc,6BAAA;AAAA,cACd,OAAA,EAAS,gBAAA;AAAA,cACT,MAAA,EAAQ,YAAY,SAAA,GAAY,SAAA;AAAA,cAChC,UAAA,EAAY,GAAA;AAAA,cACZ,KAAA,EAAO;AAAA,aACT;AAAA,YACA,QAAA,EAAU,SAAA;AAAA,YACV,cAAY,SAAA,GAAY,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,GAAK,UAAU,IAAI,CAAA,CAAA;AAAA,YAE/D,sBAAY,cAAA,GAAiB;AAAA;AAAA;AAChC;AAAA;AAAA,GAEJ;AAEJ;ACxIO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,MAAA;AAAA,QACX,UAAA,EAAY;AAAA,OACd;AAAA,MAEA,QAAA,kBAAAF,eAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,cAAA,EAAgB,UAAA;AAAA,YAChB,QAAA,EAAU,UAAA;AAAA,YACV,KAAA,EAAO;AAAA,WACT;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAE,cAAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAAF,eAAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAE,cAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,OAAA,EAAS,cAAA;AAAA,oBACT,SAAA,EAAW,MAAA;AAAA,oBACX,YAAA,EAAc,8CAAA;AAAA,oBACd,KAAA,EACE,wDAAA;AAAA,oBACF,UAAA,EAAY;AAAA,mBACd;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA,eAED;AAAA,cACC,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,cAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBAEC,KAAA,EAAO;AAAA,oBACL,OAAA,EAAS,cAAA;AAAA,oBACT,SAAA,EAAW,QAAA;AAAA,oBACX,YAAA,EAAc,8CAAA;AAAA,oBACd,UAAA,EAAY,GAAA;AAAA,oBACZ,KAAA,EAAO;AAAA,mBACT;AAAA,kBAEC,QAAA,EAAA,IAAA,CAAK;AAAA,iBAAA;AAAA,gBATD,IAAA,CAAK;AAAA,eAWb;AAAA,aAAA,EACH,CAAA,EACF,CAAA;AAAA,4BACAA,eAAC,OAAA,EAAA,EACE,QAAA,EAAA,QAAA,CAAS,IAAI,CAAC,OAAA,qBACbF,eAAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAAE,cAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,OAAA,EAAS,cAAA;AAAA,oBACT,YAAA,EAAc,8CAAA;AAAA,oBACd,KAAA,EAAO;AAAA,mBACT;AAAA,kBAEC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,eACX;AAAA,cACC,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,gBAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACpC,gBAAA,uBACEA,cAAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBAEC,KAAA,EAAO;AAAA,sBACL,OAAA,EAAS,cAAA;AAAA,sBACT,SAAA,EAAW,QAAA;AAAA,sBACX,YAAA,EACE;AAAA,qBACJ;AAAA,oBAEC,QAAA,EAAA,OAAO,KAAA,KAAU,SAAA,GAChB,KAAA,mBACEA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,KAAA,EAAO;AAAA,yBACT;AAAA,wBACA,YAAA,EAAW,UAAA;AAAA,wBACZ,QAAA,EAAA;AAAA;AAAA,wCAIDA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,KAAA,EAAO;AAAA,0BACL,KAAA,EACE;AAAA,yBACJ;AAAA,wBACA,YAAA,EAAW,cAAA;AAAA,wBACZ,QAAA,EAAA;AAAA;AAAA,qBAED,mBAGFA,cAAAA,CAAC,MAAA,EAAA,EAAM,mBAAS,QAAA,EAAI;AAAA,mBAAA;AAAA,kBA9BjB,IAAA,CAAK;AAAA,iBAgCZ;AAAA,cAEJ,CAAC;AAAA,aAAA,EAAA,EAhDM,OAAA,CAAQ,GAiDjB,CACD,CAAA,EACH;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;ACpFA,IAAM,eAAA,GAAkBT,oBAA2C,IAAI,CAAA;AAIhE,SAASU,YAAAA,GAAiC;AAC/C,EAAA,MAAM,GAAA,GAAMP,iBAAW,eAAe,CAAA;AACtC,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,GAAA;AACT;AAIA,SAAS,qBAAA,GAAoC;AAC3C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,OAAO,EAAE,OAAO,QAAA,EAAS;AAAA,EAC3B;AAEA,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,QAAA,CAAS,eAAe,CAAA;AACvD,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,EAAc,QAAA,KAAqB,MAAM,gBAAA,CAAiB,IAAI,CAAA,CAAE,IAAA,EAAK,IAAK,QAAA;AAEvF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,YAAA,EAAc,GAAA,CAAI,iBAAA,EAAmB,SAAS,CAAA;AAAA,MAC9C,eAAA,EAAiB,GAAA,CAAI,oBAAA,EAAsB,SAAS,CAAA;AAAA,MACpD,SAAA,EAAW,GAAA,CAAI,oBAAA,EAAsB,SAAS,CAAA;AAAA,MAC9C,WAAA,EAAa,GAAA,CAAI,qBAAA,EAAuB,SAAS,CAAA;AAAA,MACjD,YAAA,EAAc,GAAA,CAAI,gBAAA,EAAkB,QAAQ,CAAA;AAAA,MAC5C,UAAA,EAAY;AAAA;AACd,GACF;AACF;AASA,SAAS,aAAA,CAAc;AAAA,EACrB,WAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,SAASQ,uBAAA,EAAU;AACzB,EAAA,MAAM,WAAWC,yBAAA,EAAY;AAE7B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIR,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE5C,EAAA,eAAe,cAAA,GAAgC;AAC7C,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,QAAA,EAAU;AAE1B,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,cAAA,CAAe;AAAA,MACzC,QAAA;AAAA,MACA,aAAA,EAAe,EAAE,UAAA,EAAY,MAAA,CAAO,SAAS,IAAA,EAAK;AAAA,MAClD,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,eAAA,CAAgB,KAAK,CAAA;AAErB,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAM,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,WAAW,gBAAgB,CAAA;AAC9D,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,OAAA,GAAU,GAAG,CAAA;AAAA,IACf,CAAA,MAAA,IAAW,MAAA,CAAO,aAAA,EAAe,MAAA,KAAW,WAAA,EAAa;AACvD,MAAA,SAAA,GAAY,MAAA,CAAO,cAAc,EAAE,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,uBACEK,cAAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EAAO,EAAE,cAAA,EAAgB,YAAA,EAAc,OAAM,EACrE,QAAA,kBAAAF,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAsB,KAAA,EACzB,QAAA,EAAA;AAAA,oBAAAE,cAAAA,CAAC,WAAO,QAAA,EAAA,CAAA,oGAAA,CAAA,EAAuG,CAAA;AAAA,IAE9G,CAAC,2BACAA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,mBAAA;AAAA,QACZ,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,OAAA;AAAA,UACR,YAAA,EAAc,6BAAA;AAAA,UACd,UAAA,EAAY,+DAAA;AAAA,UACZ,cAAA,EAAgB,WAAA;AAAA,UAChB,SAAA,EAAW;AAAA;AACb;AAAA,KACF;AAAA,oBAGFA,cAAAA;AAAA,MAACI,4BAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAM;AACb,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,OAAA,IAAU;AAAA,QACZ;AAAA;AAAA,KACF;AAAA,IAEC,KAAA,KAAU,IAAA,oBACTJ,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,mCAAA,EAAqC,MAAA,EAAQ,YAAA,EAAa,EAC1E,gBAAM,OAAA,EACT,CAAA;AAAA,IAGD,4BACCA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,KAAK,cAAA,EAAe;AAAA,QACnC,QAAA,EAAU,gBAAgB,CAAC,MAAA;AAAA,QAC3B,WAAA,EAAW,YAAA;AAAA,QACX,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,gBAAA;AAAA,UACT,YAAA,EAAc,6BAAA;AAAA,UACd,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY,sCAAA;AAAA,UACZ,KAAA,EAAO,4DAAA;AAAA,UACP,MAAA,EAAQ,eAAe,aAAA,GAAgB,SAAA;AAAA,UACvC,UAAA,EAAY,GAAA;AAAA,UACZ,OAAA,EAAS,eAAe,GAAA,GAAM,CAAA;AAAA,UAC9B,SAAA,EAAW,MAAA;AAAA,UACX,KAAA,EAAO;AAAA,SACT;AAAA,QAEC,QAAA,EAAA,YAAA,GAAe,kBAAmB,WAAA,IAAe;AAAA;AAAA;AACpD,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;AAIO,SAAS,QAAA,CAAS;AAAA,EACvB,YAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM,aAAA,GAAgBR,aAAAA;AAAA,IACpB,MAAMa,mBAAA,CAAW,cAAA,EAAgB,gBAAgB,EAAE,aAAA,KAAkB,MAAS,CAAA;AAAA,IAC9E,CAAC,gBAAgB,aAAa;AAAA,GAChC;AAEA,EAAA,MAAM,aAAab,aAAAA,CAAQ,MAAM,qBAAA,EAAsB,EAAG,EAAE,CAAA;AAE5D,EAAA,MAAM,eAAA,GAAkBA,aAAAA;AAAA,IACtB,OAAO,EAAC,YAAA,EAAc,UAAA,EAAU,CAAA;AAAA,IAChC,CAAC,cAAc,UAAU;AAAA,GAC3B;AAEA,EAAA,IAAI,YAAA,CAAa,UAAA,CAAW,KAAK,CAAA,EAAG;AAClC,IAAA,uBACEQ,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EACzB,0BAAAA,cAAAA,CAACM,sCAAA,EAAA,EAAyB,MAAA,EAAQ,aAAA,EAAe,SAAS,eAAA,EACxD,QAAA,kBAAAN,cAAAA,CAACO,8BAAA,EAAA,EAAuB,GAC1B,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,OAAA,GAAiC,EAAE,YAAA,EAAc,UAAA,EAAW;AAElE,EAAA,uBACEP,cAAAA,CAACQ,sBAAA,EAAA,EAA4B,MAAA,EAAQ,aAAA,EAAe,SAClD,QAAA,kBAAAR,cAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,WAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA;AAAA,OARW,YAUf,CAAA;AAEJ;AC9NO,SAAS,YAAA,CAAa;AAAA,EAC3B,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAiD;AAC/C,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,iBAAA,EAAkB;AAC7C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAElD,EAAA,eAAe,aAAA,GAA+B;AAC5C,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,MACpF;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,QAClC,QAAA;AAAA,QACA,SAAA,EAAW,SAAA,IAAa,MAAA,CAAO,QAAA,CAAS;AAAA,OACzC,CAAA;AACD,MAAA,MAAM,qBAAqB,MAAA,EAAQ;AAAA,QACjC,oBAAA,EAAsB,CAAC,YAAA,KAAiB;AACtC,UAAA,oBAAA,GAAuB,YAAY,CAAA;AACnC,UAAA,iBAAA,IAAoB;AAAA,QACtB,CAAA;AAAA,QACA,UAAA,EAAY,MAAM,WAAA,IAAc;AAAA,QAChC,WAAA,EAAa,MAAM,WAAA;AAAc,OAClC,CAAA;AACD,MAAA,SAAA,IAAY;AAAA,IACd,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,gBAAgB,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,iBAAiB,CAAA;AAClF,MAAA,QAAA,CAAS,cAAc,OAAO,CAAA;AAC9B,MAAA,OAAA,GAAU,aAAa,CAAA;AAAA,IACzB,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACEK,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,UAAA,EAAY,oBAAA;AAAA,QACZ,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,MAAA;AAAA,MACX,YAAA,EAAW,aAAA;AAAA,MAEX,QAAA,kBAAAF,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,4CAAA;AAAA,YACZ,KAAA,EAAO,4CAAA;AAAA,YACP,MAAA,EAAQ,8CAAA;AAAA,YACR,YAAA,EAAc,6BAAA;AAAA,YACd,OAAA,EAAS,MAAA;AAAA,YACT,QAAA,EAAU,OAAA;AAAA,YACV,KAAA,EAAO,MAAA;AAAA,YACP,SAAA,EAAW;AAAA,WACb;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAE,cAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,GAAA,EAAK,MAAA,EAAQ,UAAA,EAAW,EAAG,QAAA,EAAA,qBAAA,EAEzE,CAAA;AAAA,YAEC,KAAA,oBAASA,cAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,OAAA,EAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,mBAAA,EAAoB,EAAI,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,YAEvE,OAAA,oBACCF,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,YAAA,EAAc,UAAS,EACnC,QAAA,EAAA;AAAA,8BAAAA,eAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO;AAAA,oBACL,UAAA,EAAY,kCAAA;AAAA,oBACZ,YAAA,EAAc,6BAAA;AAAA,oBACd,OAAA,EAAS,MAAA;AAAA,oBACT,OAAA,EAAS,MAAA;AAAA,oBACT,aAAA,EAAe,QAAA;AAAA,oBACf,GAAA,EAAK;AAAA,mBACP;AAAA,kBAEC,QAAA,EAAA;AAAA,oBAAA,OAAA,CAAQ,MAAA,GAAS,CAAA,oBAAKA,eAAAA,CAAC,KAAA,EAAA,EAAI,QAAA,EAAA;AAAA,sBAAA,qBAAA;AAAA,sBAAoB,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,CAAC;AAAA,qBAAA,EAAE,CAAA;AAAA,oCAC1EA,gBAAC,KAAA,EAAA,EAAI,QAAA,EAAA;AAAA,sBAAA,oBAAA;AAAA,sBAAmB,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,qBAAA,EAAE,CAAA;AAAA,oCACjDA,gBAAC,QAAA,EAAA,EAAO,QAAA,EAAA;AAAA,sBAAA,cAAA;AAAA,sBAAa,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,CAAC;AAAA,qBAAA,EAAE;AAAA;AAAA;AAAA,eAC9C;AAAA,8BACAA,eAAAA,CAAC,GAAA,EAAA,EAAE,OAAO,EAAE,QAAA,EAAU,YAAW,EAAG,QAAA,EAAA;AAAA,gBAAA,qBAAA;AAAA,gBACd,IAAI,IAAA,CAAK,OAAA,CAAQ,eAAe,EAAE,kBAAA,EAAmB;AAAA,gBAAE;AAAA,eAAA,EAC7E;AAAA,aAAA,EACF,CAAA;AAAA,4BAGFA,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,SAAA,EAAW,cAAA,EAAgB,UAAA,EAAW,EACxE,QAAA,EAAA;AAAA,8BAAAE,cAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,SAAS,QAAA,EAAU,QAAA,EAAU,YAAY,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BACrEA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,MAAM,KAAK,aAAA,EAAc,EAAG,QAAA,EAAU,UAAA,EAClE,QAAA,EAAA,UAAA,GAAa,yBAAyB,SAAA,EACzC;AAAA,aAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;ACxHO,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA,GAAQ,SAAA;AAAA,EACR,SAAA;AAAA,EACA,KAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIL,eAAS,KAAK,CAAA;AAE1C,EAAA,uBACEG,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,QAC7B,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,gBAAA;AAAA,UACT,YAAA,EAAc,6BAAA;AAAA,UACd,MAAA,EAAQ,MAAA;AAAA,UACR,UAAA,EAAY,sCAAA;AAAA,UACZ,KAAA,EAAO,4DAAA;AAAA,UACP,MAAA,EAAQ,SAAA;AAAA,UACR,UAAA,EAAY,GAAA;AAAA,UACZ,GAAG;AAAA,SACL;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAEAA,cAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA;AAAA,QACA,oBAAA;AAAA,QACA,mBAAmB,MAAM;AACvB,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA,iBAAA,IAAoB;AAAA,QACtB,CAAA;AAAA,QACA,aAAa,MAAM;AACjB,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA,UAAA,IAAa;AAAA,QACf,CAAA;AAAA,QACA,aAAa,MAAM;AACjB,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA,oBAAA,IAAuB;AAAA,QACzB,CAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA,EAAU,MAAM,SAAA,CAAU,KAAK;AAAA;AAAA;AACjC,GAAA,EACF,CAAA;AAEJ;AC7DO,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,QAAA,GAAW,IAAA;AAAA,EACX;AACF,CAAA,EAAgD;AAC9C,EAAA,IAAI,SAAS,OAAO,IAAA;AACpB,EAAA,IAAI,CAAC,OAAA,EAAS,uBAAOA,cAAAA,CAAAD,mBAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AACjC,EAAA,uBAAOC,cAAAA,CAAAD,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;ACOO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX;AACF,CAAA,EAAuC;AACrC,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,uBAAOC,cAAAA,CAAAD,mBAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAOC,cAAAA,CAAAD,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;ACPO,SAAS,QAAA,CAAS;AAAA,EACvB,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX;AACF,CAAA,EAAsC;AACpC,EAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,EAAG;AACvC,IAAA,uBAAOC,cAAAA,CAAAD,mBAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAOC,cAAAA,CAAAD,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;AC3BO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA,GAAO,gCAAA;AAAA,EACP,QAAA;AAAA,EACA;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,WAAA,GAAc,QAAA,GAChB,CAAA,WAAA,EAAc,QAAQ,CAAA,uBAAA,CAAA,GACtB,IAAA;AAEJ,EAAA,SAAS,aAAA,GAAsB;AAC7B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,UAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,uBACED,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,SAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,SAAA,EAAW;AAAA,OACb;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAE,cAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,4CAAA;AAAA,cACP,QAAA,EAAU,UAAA;AAAA,cACV,MAAA,EAAQ;AAAA,aACV;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,aAAA;AAAA,YACT,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,gBAAA;AAAA,cACT,YAAA,EAAc,6BAAA;AAAA,cACd,MAAA,EAAQ,MAAA;AAAA,cACR,UAAA,EAAY,sCAAA;AAAA,cACZ,KAAA,EAAO,4DAAA;AAAA,cACP,MAAA,EAAQ,SAAA;AAAA,cACR,UAAA,EAAY,GAAA;AAAA,cACZ,QAAA,EAAU;AAAA,aACZ;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;ACnCO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA2C;AACzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBAAOA,cAAAA,CAAAD,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBACED,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,cAAA,EAAe,EAE1D,QAAA,EAAA;AAAA,oBAAAE,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,WAAA;AAAA,UACR,aAAA,EAAe,MAAA;AAAA,UACf,UAAA,EAAY;AAAA,SACd;AAAA,QACA,aAAA,EAAY,MAAA;AAAA,QAEX;AAAA;AAAA,KACH;AAAA,oBAGAA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,UAAA;AAAA,UACV,KAAA,EAAO,CAAA;AAAA,UACP,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,UAAA,EAAY,4CAAA;AAAA,UACZ,OAAA,EAAS,IAAA;AAAA,UACT,YAAA,EAAc;AAAA,SAChB;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,wCAAA;AAAA,QAEX,QAAA,kBAAAA,cAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,WAAA;AAAA,YACN,QAAA,EAAU,eAAA;AAAA,YACV;AAAA;AAAA;AACF;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AC3EO,SAAS,mBAAmB,UAAA,EAA4B;AAC7D,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,8CAAA;AAC7B,EAAA,IAAI,UAAA,IAAc,IAAI,OAAO,sCAAA;AAC7B,EAAA,OAAO,sCAAA;AACT;AASO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAoB;AAClB,EAAA,MAAM,UAAA,GAAa,QAAQ,CAAA,GAAI,IAAA,CAAK,IAAI,GAAA,EAAM,IAAA,GAAO,KAAA,GAAS,GAAG,CAAA,GAAI,CAAA;AACrE,EAAA,MAAM,KAAA,GAAQ,mBAAmB,UAAU,CAAA;AAE3C,EAAA,uBACEF,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,sBAAAE,cAAAA,CAAC,UAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACZ,4BACCF,eAAAA,CAAC,UAAK,KAAA,EAAO,EAAE,OAAM,EAClB,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,QAAE,KAAA;AAAA,QAAI,MAAM,cAAA;AAAe,OAAA,EAClD;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEFE,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,kCAAA;AAAA,QACV,KAAA,EAAO,EAAE,UAAA,EAAY,oCAAA,EAAqC;AAAA,QAE1D,QAAA,kBAAAA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACV,KAAA,EAAO;AAAA,cACL,KAAA,EAAO,GAAG,UAAU,CAAA,CAAA,CAAA;AAAA,cACpB,UAAA,EAAY,KAAA;AAAA,cACZ,UAAA,EAAY;AAAA;AACd;AAAA;AACF;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACvCO,SAAS,cAAA,CAAe;AAAA,EAC7B,WAAW,EAAC;AAAA,EACZ,OAAA,GAAU;AACZ,CAAA,EAAwB;AACtB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,sBACdA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,aAAA;AAAA,QACV,KAAA,EAAO,EAAE,UAAA,EAAY,oCAAA;AAAqC,OAAA;AAAA,MAFrD;AAAA,KAIR,CAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,mBAAS,GAAA,CAAI,CAAC,CAAA,qBACbA,cAAAA,CAAC,UAAA,EAAA,EAAuB,MAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,KAAA,EAAO,EAAE,KAAA,EAAA,EAA9C,CAAA,CAAE,GAAmD,CACvE,CAAA,EACH,CAAA;AAEJ;ACxBO,SAAS,UAAA,CAAW;AAAA,EACzB,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc;AAChB,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIL,cAAAA,iBAAsB,IAAI,KAAK,CAAA;AAEjE,EAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA;AAAA,IAC7B,CAAC,MAAM,CAAA,CAAE,UAAA,IAAc,aAAa,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,GAAG;AAAA,GAC1D;AAEA,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAgB;AACrC,IAAA,YAAA,CAAa,CAAC,SAAS,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EAC/C,CAAA;AAEA,EAAA,uBACEK,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,qBAClBF,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAU,gEAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,qDAAA;AAAA,QACZ,KAAA,EAAO,yDAAA;AAAA,QACP,MAAA,EACE;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,gBAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAE,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAY,MAAA;AAAA,cACZ,KAAA,EAAO,EAAE,WAAA,EAAa,QAAA,EAAU,UAAU,MAAA,EAAO;AAAA,cAClD,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,UAAO,0BAAA;AAAA,0BACsBA,cAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,UAAS,UAAA;AAAA,UACtD,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,UAAU,CAAA;AAAA,UAAE,KAAA;AAAA,UAAI,GAAA;AAAA,0BAC9BA,cAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,WAAA;AAAA,cACN,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,SAAA;AAAA,gBACP,UAAA,EAAY,GAAA;AAAA,gBACZ,cAAA,EAAgB;AAAA,eAClB;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAM,aAAA,CAAc,CAAA,CAAE,GAAG,CAAA;AAAA,YAClC,YAAA,EAAY,CAAA,QAAA,EAAW,CAAA,CAAE,KAAK,CAAA,MAAA,CAAA;AAAA,YAC9B,KAAA,EAAO;AAAA,cACL,UAAA,EAAY,MAAA;AAAA,cACZ,MAAA,EAAQ,MAAA;AAAA,cACR,MAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,eAAA;AAAA,cACT,QAAA,EAAU,MAAA;AAAA,cACV,KAAA,EAAO;AAAA,aACT;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,KAAA;AAAA,IA3CK,CAAA,CAAE;AAAA,GA6CV,CAAA,EACH,CAAA;AAEJ;ACjFA,IAAM,WAAA,GAAmD;AAAA,EACvD,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,2CAAA;AAAA,IACZ,KAAA,EAAO,iEAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EACE,oFAAA;AAAA,IACF,KAAA,EAAO,+CAAA;AAAA,IACP,MAAA,EACE;AAAA,GACJ;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,+CAAA;AAAA,IACZ,KAAA,EACE,qEAAA;AAAA,IACF,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,6CAAA;AAAA,IACZ,KAAA,EAAO,mEAAA;AAAA,IACP,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAEO,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,IAAA,GAAO,QAAO,EAAmB;AACjE,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAI,CAAA,IAAK,WAAA,CAAY,IAAA;AAE/C,EAAA,uBACEA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,OAAA,EAAS,aAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,OAAA,EAAS,iBAAA;AAAA,QACT,YAAA,EAAc,QAAA;AAAA,QACd,QAAA,EAAU,SAAA;AAAA,QACV,UAAA,EAAY,GAAA;AAAA,QACZ,UAAA,EAAY,SAAA;AAAA,QACZ,UAAA,EAAY;AAAA,OACd;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;ACvCA,IAAM,YAAA,GAAuC;AAAA,EAC3C,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,YAAA;AAAA,EACZ,IAAA,EAAM,kBAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,aAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAEO,SAAS,oBAAA,CAAqB;AAAA,EACnC,aAAA;AAAA,EACA,qBAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,EAA8B;AAC5B,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,qBAAA,EAAsB;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,UAAA;AAAA,IACzB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEF,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,aAAA,mBACCA,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,GAAA,EAAK,SAAA;AAAA,UACL,OAAA,EAAS,cAAA;AAAA,UACT,MAAA,EAAQ,8CAAA;AAAA,UACR,YAAA,EAAc,QAAA;AAAA,UACd,QAAA,EAAU;AAAA,SACZ;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAE,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,UAAA,EAAY,GAAA;AAAA,gBACZ,KAAA,EAAO;AAAA,eACT;AAAA,cAEC,uBAAa,aAAA,CAAc,KAAA,CAAM,WAAA,EAAa,KAC7C,aAAA,CAAc;AAAA;AAAA,WAClB;AAAA,0BACAF,eAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO;AAAA,eACT;AAAA,cACD,QAAA,EAAA;AAAA,gBAAA,2BAAA;AAAA,gBACO,aAAA,CAAc;AAAA;AAAA;AAAA,WACtB;AAAA,0BACAA,eAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,wDAAA;AAAA,gBACP,QAAA,EAAU;AAAA,eACZ;AAAA,cACD,QAAA,EAAA;AAAA,gBAAA,UAAA;AAAA,gBACU,OAAO,aAAA,CAAc,QAAQ,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,gBAAE,GAAA;AAAA,gBACxD,MAAA,CAAO,aAAA,CAAc,OAAO,CAAA,CAAE,MAAM,EAAE;AAAA;AAAA;AAAA;AACzC;AAAA;AAAA,wBAGFE,cAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,wDAAA;AAAA,UACP,QAAA,EAAU;AAAA,SACZ;AAAA,QACD,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBAEFA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,YAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,aAAA;AAAA,UACZ,MAAA,EAAQ,gDAAA;AAAA,UACR,KAAA,EAAO,sCAAA;AAAA,UACP,OAAA,EAAS,mBAAA;AAAA,UACT,YAAA,EAAc,UAAA;AAAA,UACd,QAAA,EAAU,UAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,MAAA,EAAQ;AAAA,SACV;AAAA,QACD,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAEJ","file":"index.cjs","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useMemo, type ReactNode } from 'react';\n\nexport interface CompletedCheckoutResult {\n type: 'completed';\n status: string;\n payment_source?: string;\n subscription_id?: string;\n plan_code?: string;\n invoice_id?: string;\n amount_cents?: number;\n currency?: string;\n}\n\nexport interface ScheduledCheckoutResult {\n type: 'scheduled';\n status: string;\n subscription_id?: string;\n plan_code?: string;\n}\n\nexport type CheckoutResult =\n | {\n type: 'stripe';\n url?: string;\n clientSecret?: string;\n client_secret?: string;\n }\n | { type: 'razorpay'; orderId: string }\n | CompletedCheckoutResult\n | ScheduledCheckoutResult\n | { url: string };\n\nexport interface CreateCheckoutInput {\n planCode: string;\n returnUrl: string;\n}\n\nexport type CreateCheckout = (input: CreateCheckoutInput) => Promise<CheckoutResult>;\n\nexport interface NozleClient {\n publishableKey: string;\n baseUrl: string;\n catalogFetch(path: string, init?: RequestInit): Promise<Response>;\n}\n\nfunction createClient(publishableKey: string, baseUrl: string): NozleClient {\n const base = baseUrl.replace(/\\/+$/, '');\n\n return {\n publishableKey,\n baseUrl: base,\n catalogFetch(path: string, init?: RequestInit): Promise<Response> {\n return fetch(`${base}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${publishableKey}`,\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n },\n };\n}\n\nexport interface BillingContextValue {\n client: NozleClient;\n createCheckout?: CreateCheckout;\n}\n\nexport const BillingContext = createContext<BillingContextValue | null>(null);\n\nexport interface BillingProviderProps {\n publishableKey: string;\n createCheckout?: CreateCheckout;\n baseUrl?: string;\n children: ReactNode;\n}\n\nexport function BillingProvider({\n publishableKey,\n createCheckout,\n baseUrl = 'https://api.nozle.app',\n children,\n}: BillingProviderProps): React.ReactElement {\n if (!publishableKey.startsWith('pk_')) {\n throw new Error('BillingProvider publishableKey must be a publishable key (pk_)');\n }\n\n const client = useMemo(\n () => createClient(publishableKey, baseUrl),\n [publishableKey, baseUrl],\n );\n const contextValue = useMemo(\n () => ({ client, createCheckout }),\n [client, createCheckout],\n );\n\n return React.createElement(BillingContext.Provider, { value: contextValue }, children);\n}\n\nexport function useOptionalBillingContext(): BillingContextValue | null {\n return useContext(BillingContext);\n}\n\nexport function useBillingContext(): BillingContextValue {\n const context = useOptionalBillingContext();\n if (!context) {\n throw new Error('useBillingContext must be used within a BillingProvider');\n }\n return context;\n}\n\nexport function useNozleClient(): NozleClient {\n return useBillingContext().client;\n}\n","import { useEffect, useState } from \"react\";\nimport { useBillingContext } from '../provider.js';\n\nexport interface Plan {\n code: string;\n name: string;\n amount_cents: number;\n amount_currency: string;\n interval: string;\n}\n\nexport function usePlans() {\n const { client } = useBillingContext();\n const [plans, setPlans] = useState<Plan[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n if (!client) {\n setIsLoading(false);\n return;\n }\n\n void client\n .catalogFetch(\"/api/v1/plans\")\n .then(async (response) => {\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n const data = (await response.json()) as { plans?: Plan[] };\n if (!cancelled) setPlans(data.plans ?? []);\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [client]);\n\n return { plans, isLoading };\n}\n","export function navigateToCheckout(\n url: string,\n location: Pick<Location, \"assign\"> = window.location,\n): void {\n location.assign(url);\n}\n","import { useCallback, useState } from 'react';\nimport { navigateToCheckout } from '../components/billing/checkout-navigation.js';\nimport { useBillingContext, type CheckoutResult } from '../provider.js';\n\nexport interface UseCheckoutResult {\n fetchClientSecret: (planCode: string, returnUrl?: string) => Promise<string | null>;\n checkout: CheckoutResult | null;\n isLoading: boolean;\n error: Error | null;\n}\n\nexport function useCheckout(): UseCheckoutResult {\n const { createCheckout } = useBillingContext();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [checkout, setCheckout] = useState<CheckoutResult | null>(null);\n\n const fetchClientSecret = useCallback(\n async (planCode: string, returnUrl?: string): Promise<string | null> => {\n setIsLoading(true);\n setError(null);\n try {\n if (!createCheckout) {\n throw new Error('BillingProvider createCheckout callback is required for checkout');\n }\n const result = await createCheckout({\n planCode,\n returnUrl: returnUrl ?? window.location.href,\n });\n setCheckout(result);\n\n if ('client_secret' in result || 'clientSecret' in result) {\n const clientSecret = result.client_secret ?? result.clientSecret;\n if (clientSecret) return clientSecret;\n }\n if ('url' in result && result.url) {\n navigateToCheckout(result.url);\n return null;\n }\n if ('type' in result && (result.type === 'completed' || result.type === 'scheduled')) {\n return null;\n }\n throw new Error('Checkout response did not include a supported result type');\n } catch (cause) {\n const checkoutError = cause instanceof Error ? cause : new Error(String(cause));\n setError(checkoutError);\n throw checkoutError;\n } finally {\n setIsLoading(false);\n }\n },\n [createCheckout],\n );\n\n return { fetchClientSecret, checkout, isLoading, error };\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport {\n useBillingContext,\n type CheckoutResult,\n type CompletedCheckoutResult,\n type ScheduledCheckoutResult,\n} from '../../provider.js';\n\nexport interface CheckoutButtonProps {\n planCode: string;\n returnUrl?: string;\n label?: string;\n className?: string;\n style?: React.CSSProperties;\n onError?: (error: Error) => void;\n razorpayKeyId?: string;\n onStripeClientSecret?: (clientSecret: string) => void;\n onSuccess?: (paymentId: string) => void;\n onComplete?: (result: CompletedCheckoutResult) => void;\n onScheduled?: (result: ScheduledCheckoutResult) => void;\n}\n\ninterface RazorpayOptions {\n key: string;\n order_id: string;\n handler: (response: { razorpay_payment_id: string }) => void;\n modal?: { ondismiss?: () => void };\n}\n\ndeclare global {\n interface Window {\n Razorpay: new (options: RazorpayOptions) => { open(): void };\n }\n}\n\nfunction loadRazorpayScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (document.getElementById('razorpay-js')) {\n resolve();\n return;\n }\n const script = document.createElement('script');\n script.id = 'razorpay-js';\n script.src = 'https://checkout.razorpay.com/v1/checkout.js';\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Razorpay.js'));\n document.body.appendChild(script);\n });\n}\n\nexport async function handleCheckoutResult(\n result: CheckoutResult,\n options: Pick<\n CheckoutButtonProps,\n | 'razorpayKeyId'\n | 'onStripeClientSecret'\n | 'onSuccess'\n | 'onComplete'\n | 'onScheduled'\n >,\n): Promise<void> {\n if ('type' in result && result.type === 'scheduled') {\n options.onScheduled?.(result);\n return;\n }\n if ('type' in result && result.type === 'completed') {\n options.onComplete?.(result);\n return;\n }\n if ('type' in result && result.type === 'razorpay') {\n if (!options.razorpayKeyId) throw new Error('razorpayKeyId is required for Razorpay checkout');\n await loadRazorpayScript();\n const checkout = new window.Razorpay({\n key: options.razorpayKeyId,\n order_id: result.orderId,\n handler: (response) => options.onSuccess?.(response.razorpay_payment_id),\n });\n checkout.open();\n return;\n }\n if ('url' in result && result.url) {\n window.location.assign(result.url);\n return;\n }\n if ('type' in result && result.type === 'stripe') {\n const clientSecret = result.clientSecret ?? result.client_secret;\n if (clientSecret && options.onStripeClientSecret) {\n options.onStripeClientSecret(clientSecret);\n return;\n }\n if (clientSecret) throw new Error('onStripeClientSecret is required for embedded Stripe checkout');\n throw new Error('Stripe checkout did not include a URL or client secret');\n }\n throw new Error('Unknown checkout response format');\n}\n\nexport function CheckoutButton({\n planCode,\n returnUrl,\n label = 'Get Started',\n className,\n style,\n onError,\n razorpayKeyId,\n onStripeClientSecret,\n onSuccess,\n onComplete,\n onScheduled,\n}: CheckoutButtonProps): React.ReactElement {\n const { createCheckout } = useBillingContext();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n async function handleClick(): Promise<void> {\n setLoading(true);\n setError(null);\n try {\n if (!createCheckout) {\n throw new Error('BillingProvider createCheckout callback is required for checkout');\n }\n const result = await createCheckout({\n planCode,\n returnUrl: returnUrl ?? window.location.href,\n });\n await handleCheckoutResult(result, {\n razorpayKeyId,\n onStripeClientSecret,\n onSuccess,\n onComplete,\n onScheduled,\n });\n } catch (cause) {\n const checkoutError = cause instanceof Error ? cause : new Error('Checkout failed');\n setError(checkoutError);\n onError?.(checkoutError);\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => void handleClick()}\n disabled={loading}\n className={className}\n style={{\n padding: '0.75rem 1.5rem',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n border: 'none',\n background: 'var(--nozle-primary, var(--primary))',\n color: 'var(--nozle-primary-foreground, var(--primary-foreground))',\n cursor: loading ? 'not-allowed' : 'pointer',\n fontWeight: 500,\n opacity: loading ? 0.7 : 1,\n ...style,\n }}\n aria-busy={loading}\n >\n {loading ? 'Loading...' : label}\n </button>\n {error && <span role=\"alert\">{error.message}</span>}\n </>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect, type CSSProperties } from 'react';\nimport {\n useOptionalBillingContext,\n type CheckoutResult,\n} from '../../provider.js';\nimport { handleCheckoutResult } from '../billing/CheckoutButton.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface PricingPlan {\n code: string;\n name: string;\n amount_cents: number;\n amount_currency: string;\n interval: string;\n description?: string;\n}\n\nexport interface PricingTableProps {\n currentPlanCode?: string;\n plans?: PricingPlan[];\n features?: string[][];\n onSelect?: (plan: PricingPlan) => void;\n returnUrl?: string;\n onStripeClientSecret?: (clientSecret: string) => void;\n onCheckoutResult?: (result: CheckoutResult) => void;\n onCheckoutError?: (error: Error) => void;\n showToggle?: boolean;\n highlightPlan?: string;\n className?: string;\n enterpriseEmail?: string;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nconst SYMBOLS: Record<string, string> = { USD: '$', EUR: '€', GBP: '£', JPY: '¥' };\n\nfunction fmtPrice(cents: number, cur: string): string {\n const s = SYMBOLS[cur] ?? cur + ' ';\n const val = cents % 100 === 0 ? String(cents / 100) : (cents / 100).toFixed(2);\n return `${s}${val}`;\n}\n\nfunction isEnterprise(p: PricingPlan): boolean {\n return /enterprise|custom/i.test(p.name + p.code);\n}\n\nfunction v(name: string, fb: string): string {\n return `var(${name}, ${fb})`;\n}\n\n// ─── CSS variable shortcuts ──────────────────────────────────────────────────\n\nconst C = {\n bg: v('--nozle-pricing-bg', v('--nozle-background', '#ffffff')),\n cardBg: v('--nozle-pricing-card-bg', v('--nozle-card', '#ffffff')),\n hl: v('--nozle-pricing-highlight', v('--nozle-primary', '#6366f1')),\n border: v('--nozle-pricing-border', v('--nozle-border', '#e5e7eb')),\n radius: v('--nozle-pricing-radius', v('--nozle-radius', '12px')),\n text: v('--nozle-foreground', '#111827'),\n muted: v('--nozle-muted-foreground', '#6b7280'),\n mutedBg: v('--nozle-muted', '#f3f4f6'),\n hlFg: v('--nozle-primary-foreground', '#ffffff'),\n};\n\n// ─── Check icon ──────────────────────────────────────────────────────────────\n\nfunction Check(): React.ReactElement {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style={{ flexShrink: 0 }}>\n <path d=\"M3.5 8.5L6.5 11.5L12.5 4.5\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n// ─── Toggle ──────────────────────────────────────────────────────────────────\n\nfunction Toggle({ isAnnual, onChange }: { isAnnual: boolean; onChange: (v: boolean) => void }) {\n const pill: CSSProperties = {\n display: 'inline-flex',\n borderRadius: '9999px',\n padding: '4px',\n background: C.mutedBg,\n gap: '2px',\n };\n const tab = (active: boolean): CSSProperties => ({\n padding: '8px 20px',\n borderRadius: '9999px',\n border: 'none',\n background: active ? C.cardBg : 'transparent',\n color: active ? C.text : C.muted,\n fontWeight: active ? 600 : 400,\n fontSize: '0.875rem',\n cursor: 'pointer',\n boxShadow: active ? '0 1px 3px rgba(0,0,0,0.08)' : 'none',\n transition: 'all 0.15s ease',\n });\n\n return (\n <div style={{ display: 'flex', justifyContent: 'center', marginBottom: '2.5rem' }}>\n <div style={pill}>\n <button onClick={() => onChange(false)} style={tab(!isAnnual)} aria-pressed={!isAnnual}>\n Monthly\n </button>\n <button onClick={() => onChange(true)} style={tab(isAnnual)} aria-pressed={isAnnual}>\n Annual\n <span style={{\n marginLeft: '6px',\n fontSize: '0.7rem',\n fontWeight: 600,\n color: isAnnual ? C.hl : C.muted,\n }}>\n Save 20%\n </span>\n </button>\n </div>\n </div>\n );\n}\n\n// ─── Card ────────────────────────────────────────────────────────────────────\n\ninterface CardProps {\n plan: PricingPlan;\n features?: string[];\n isCurrent: boolean;\n isHighlighted: boolean;\n isEnt: boolean;\n enterpriseEmail?: string;\n onSelect?: () => void;\n}\n\nfunction Card({\n plan,\n features,\n isCurrent,\n isHighlighted,\n isEnt,\n enterpriseEmail,\n onSelect,\n}: CardProps): React.ReactElement {\n const [hover, setHover] = useState(false);\n\n const shadow = isHighlighted\n ? '0 8px 28px rgba(99,102,241,0.12), 0 2px 8px rgba(99,102,241,0.06)'\n : hover\n ? '0 8px 24px rgba(0,0,0,0.06), 0 2px 8px rgba(0,0,0,0.03)'\n : '0 1px 3px rgba(0,0,0,0.04), 0 1px 2px rgba(0,0,0,0.03)';\n\n const interval = plan.interval === 'yearly' ? '/year' : '/month';\n\n const handleClick = () => {\n if (isCurrent) return;\n if (isEnt && enterpriseEmail) {\n window.location.href = `mailto:${enterpriseEmail}?subject=Enterprise Plan Inquiry`;\n return;\n }\n onSelect?.();\n };\n\n return (\n <div\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n background: C.cardBg,\n border: `1px solid ${isHighlighted ? C.hl : C.border}`,\n borderTopWidth: isHighlighted ? '3px' : '1px',\n borderRadius: C.radius,\n padding: '2rem',\n transition: 'box-shadow 0.2s ease, transform 0.2s ease',\n boxShadow: shadow,\n transform: hover && !isCurrent ? 'translateY(-2px)' : 'none',\n }}\n >\n {/* Badge */}\n {isHighlighted && (\n <div style={{\n position: 'absolute',\n top: '-1px',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n background: C.hl,\n color: C.hlFg,\n fontSize: '0.7rem',\n fontWeight: 700,\n padding: '4px 12px',\n borderRadius: '9999px',\n letterSpacing: '0.025em',\n textTransform: 'uppercase',\n whiteSpace: 'nowrap',\n }}>\n {isCurrent ? 'Current Plan' : 'Most Popular'}\n </div>\n )}\n {isCurrent && !isHighlighted && (\n <div style={{\n position: 'absolute',\n top: '0',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n background: C.mutedBg,\n color: C.muted,\n fontSize: '0.7rem',\n fontWeight: 700,\n padding: '4px 12px',\n borderRadius: '9999px',\n letterSpacing: '0.025em',\n textTransform: 'uppercase',\n whiteSpace: 'nowrap',\n }}>\n Current Plan\n </div>\n )}\n\n {/* Plan name + description */}\n <div style={{ marginBottom: '1.25rem', marginTop: isHighlighted || isCurrent ? '0.5rem' : 0 }}>\n <h3 style={{\n fontSize: '1.25rem',\n fontWeight: 700,\n color: C.text,\n margin: 0,\n lineHeight: 1.3,\n }}>\n {plan.name}\n </h3>\n {plan.description && (\n <p style={{\n fontSize: '0.875rem',\n color: C.muted,\n margin: '6px 0 0',\n lineHeight: 1.5,\n }}>\n {plan.description}\n </p>\n )}\n </div>\n\n {/* Price */}\n <div style={{ marginBottom: '1.5rem' }}>\n {isEnt ? (\n <span style={{ fontSize: '2.25rem', fontWeight: 700, color: C.text, lineHeight: 1 }}>\n Custom\n </span>\n ) : (\n <div style={{ display: 'flex', alignItems: 'baseline', gap: '2px' }}>\n <span style={{ fontSize: '2.75rem', fontWeight: 700, color: C.text, lineHeight: 1, letterSpacing: '-0.025em' }}>\n {fmtPrice(plan.amount_cents, plan.amount_currency)}\n </span>\n <span style={{ fontSize: '0.9375rem', color: C.muted, marginLeft: '4px' }}>\n {interval}\n </span>\n </div>\n )}\n </div>\n\n {/* Features */}\n {features && features.length > 0 && (\n <ul style={{\n listStyle: 'none',\n padding: 0,\n margin: '0 0 2rem',\n display: 'flex',\n flexDirection: 'column',\n gap: '0.75rem',\n flex: 1,\n }}>\n {features.map((feat) => (\n <li key={feat} style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '10px',\n fontSize: '0.875rem',\n color: C.text,\n lineHeight: 1.5,\n }}>\n <span style={{ color: C.hl, marginTop: '2px' }}><Check /></span>\n <span>{feat}</span>\n </li>\n ))}\n </ul>\n )}\n\n {/* Spacer if no features */}\n {(!features || features.length === 0) && <div style={{ flex: 1 }} />}\n\n {/* CTA */}\n {onSelect && (\n <CTAButton\n onClick={handleClick}\n disabled={isCurrent}\n variant={isCurrent ? 'current' : isEnt ? 'outline' : isHighlighted ? 'primary' : 'secondary'}\n >\n {isCurrent ? 'Current Plan' : isEnt ? 'Contact Sales' : `Get ${plan.name}`}\n </CTAButton>\n )}\n </div>\n );\n}\n\n// ─── CTA Button ──────────────────────────────────────────────────────────────\n\ntype ButtonVariant = 'primary' | 'secondary' | 'outline' | 'current';\n\nfunction CTAButton({\n children,\n onClick,\n disabled,\n variant,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n variant: ButtonVariant;\n}) {\n const [hover, setHover] = useState(false);\n\n const base: CSSProperties = {\n width: '100%',\n padding: '12px 24px',\n borderRadius: '10px',\n fontSize: '0.9375rem',\n fontWeight: 600,\n cursor: disabled ? 'default' : 'pointer',\n border: 'none',\n transition: 'all 0.15s ease',\n lineHeight: 1.4,\n };\n\n const variants: Record<ButtonVariant, CSSProperties> = {\n primary: {\n background: hover && !disabled ? '#4f46e5' : C.hl,\n color: C.hlFg,\n },\n secondary: {\n background: hover && !disabled ? '#f0f0f3' : C.mutedBg,\n color: C.text,\n border: `1px solid ${C.border}`,\n },\n outline: {\n background: hover && !disabled ? 'rgba(99,102,241,0.04)' : 'transparent',\n color: C.hl,\n border: `1.5px solid ${C.hl}`,\n },\n current: {\n background: C.mutedBg,\n color: C.muted,\n },\n };\n\n return (\n <button\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n style={{ ...base, ...variants[variant] }}\n >\n {children}\n </button>\n );\n}\n\n// ─── Loading skeleton ────────────────────────────────────────────────────────\n\nfunction Skeleton(): React.ReactElement {\n return (\n <div style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))',\n gap: '1.5rem',\n }}>\n {[0, 1, 2].map((i) => (\n <div key={i} style={{\n background: C.cardBg,\n border: `1px solid ${C.border}`,\n borderRadius: C.radius,\n padding: '2rem',\n height: '380px',\n }}>\n <div style={{ height: 20, width: '40%', borderRadius: 6, background: '#f0f0f0', marginBottom: 12 }} />\n <div style={{ height: 40, width: '50%', borderRadius: 6, background: '#f0f0f0', marginBottom: 24 }} />\n <div style={{ height: 14, width: '80%', borderRadius: 6, background: '#f0f0f0', marginBottom: 10 }} />\n <div style={{ height: 14, width: '70%', borderRadius: 6, background: '#f0f0f0', marginBottom: 10 }} />\n <div style={{ height: 14, width: '60%', borderRadius: 6, background: '#f0f0f0' }} />\n </div>\n ))}\n </div>\n );\n}\n\n// ─── Main Component ──────────────────────────────────────────────────────────\n\nexport function PricingTable({\n currentPlanCode,\n plans: propPlans,\n features,\n onSelect,\n returnUrl,\n onStripeClientSecret,\n onCheckoutResult,\n onCheckoutError,\n showToggle = true,\n highlightPlan,\n className,\n enterpriseEmail,\n}: PricingTableProps): React.ReactElement {\n const billing = useOptionalBillingContext();\n const client = billing?.client;\n const [plans, setPlans] = useState<PricingPlan[]>(propPlans ?? []);\n const [currentPlan, setCurrentPlan] = useState<string | null>(currentPlanCode ?? null);\n const [isAnnual, setIsAnnual] = useState(false);\n const [loading, setLoading] = useState(!propPlans);\n const [checkoutError, setCheckoutError] = useState<string | null>(null);\n\n useEffect(() => {\n if (propPlans) { setPlans(propPlans); return; }\n if (!client) {\n setLoading(false);\n setCheckoutError('BillingProvider with a publishableKey is required to load plans');\n return;\n }\n let cancelled = false;\n client.catalogFetch('/api/v1/plans').then(async (res) => {\n if (!cancelled && res.ok) {\n const data = await res.json();\n setPlans(data.plans || []);\n }\n }).finally(() => { if (!cancelled) setLoading(false); });\n return () => { cancelled = true; };\n }, [client, propPlans]);\n\n useEffect(() => {\n if (currentPlanCode !== undefined) setCurrentPlan(currentPlanCode);\n }, [currentPlanCode]);\n\n async function selectPlan(plan: PricingPlan): Promise<void> {\n setCheckoutError(null);\n if (onSelect) {\n onSelect(plan);\n return;\n }\n try {\n if (!billing?.createCheckout) {\n throw new Error('BillingProvider createCheckout callback is required for checkout');\n }\n const result = await billing.createCheckout({\n planCode: plan.code,\n returnUrl: returnUrl ?? window.location.href,\n });\n onCheckoutResult?.(result);\n await handleCheckoutResult(result, { onStripeClientSecret });\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error('Checkout failed');\n setCheckoutError(error.message);\n onCheckoutError?.(error);\n }\n }\n\n const hasAnnual = plans.some(p => p.interval === 'yearly');\n const filtered = showToggle && hasAnnual\n ? plans.filter(p => p.interval === (isAnnual ? 'yearly' : 'monthly') || isEnterprise(p))\n : plans;\n\n if (loading) return <Skeleton />;\n\n return (\n <div className={className} style={{\n fontFamily: \"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n color: C.text,\n background: C.bg,\n }}>\n {showToggle && hasAnnual && (\n <Toggle isAnnual={isAnnual} onChange={setIsAnnual} />\n )}\n\n {checkoutError && <p role=\"alert\">{checkoutError}</p>}\n\n <div style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))',\n gap: '1.5rem',\n }}>\n {filtered.map((plan, i) => (\n <Card\n key={plan.code}\n plan={plan}\n features={features?.[i]}\n isCurrent={currentPlan === plan.code}\n isHighlighted={highlightPlan === plan.code}\n isEnt={isEnterprise(plan)}\n enterpriseEmail={enterpriseEmail}\n onSelect={() => void selectPlan(plan)}\n />\n ))}\n </div>\n </div>\n );\n}\n","/**\n * PlanCard — Individual pricing plan card component.\n * UI-01: Shows plan name, price, interval, features list, and CTA button.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport type { ReactNode } from \"react\";\nimport type { CreateCheckoutInput } from \"../../provider.js\";\n\nexport interface Plan {\n id: string;\n name: string;\n monthlyPrice: number;\n annualPrice: number;\n features: string[];\n description?: string;\n}\n\nexport interface PlanCardProps extends Plan {\n isAnnual: boolean;\n isCurrent: boolean;\n returnUrl?: string;\n onSelect?: (input: CreateCheckoutInput) => void;\n children?: ReactNode;\n}\n\n/**\n * PlanCard renders a single pricing plan.\n * Highlighted with aria-current=\"true\" when isCurrent=true.\n */\nexport function PlanCard({\n id,\n name,\n monthlyPrice,\n annualPrice,\n features,\n description,\n isAnnual,\n isCurrent,\n returnUrl,\n onSelect,\n}: PlanCardProps): React.ReactElement {\n const price = isAnnual ? annualPrice : monthlyPrice;\n const interval = isAnnual ? \"year\" : \"month\";\n\n return (\n <div\n data-testid={`plan-card-${id}`}\n aria-current={isCurrent ? \"true\" : undefined}\n style={{\n background: \"var(--nozle-background, var(--background))\",\n border: isCurrent\n ? \"2px solid var(--nozle-primary, var(--primary))\"\n : \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"1.5rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1rem\",\n }}\n className={isCurrent ? \"border-primary\" : \"\"}\n >\n <div>\n <h3\n style={{\n fontSize: \"1.25rem\",\n fontWeight: 600,\n color: \"var(--nozle-foreground, var(--foreground))\",\n margin: 0,\n }}\n >\n {name}\n </h3>\n {description && (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n margin: \"0.25rem 0 0\",\n }}\n >\n {description}\n </p>\n )}\n </div>\n\n <div>\n <span\n style={{\n fontSize: \"2rem\",\n fontWeight: 700,\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n ${price}\n </span>\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n marginLeft: \"0.25rem\",\n }}\n >\n /{interval}\n </span>\n </div>\n\n <ul\n style={{\n listStyle: \"none\",\n padding: 0,\n margin: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n flex: 1,\n }}\n >\n {features.map((feature) => (\n <li\n key={feature}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n <span\n style={{ color: \"var(--nozle-primary, var(--primary))\" }}\n aria-hidden=\"true\"\n >\n ✓\n </span>\n {feature}\n </li>\n ))}\n </ul>\n\n {onSelect && (\n <button\n onClick={() =>\n onSelect?.({\n planCode: id,\n returnUrl: returnUrl ?? window.location.href,\n })\n }\n style={{\n background: isCurrent\n ? \"var(--nozle-muted, var(--muted))\"\n : \"var(--nozle-primary, var(--primary))\",\n color: isCurrent\n ? \"var(--nozle-muted-foreground, var(--muted-foreground))\"\n : \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n border: \"none\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"0.75rem 1.5rem\",\n cursor: isCurrent ? \"default\" : \"pointer\",\n fontWeight: 500,\n width: \"100%\",\n }}\n disabled={isCurrent}\n aria-label={isCurrent ? `Current plan: ${name}` : `Select ${name}`}\n >\n {isCurrent ? \"Current Plan\" : \"Get Started\"}\n </button>\n )}\n </div>\n );\n}\n","/**\n * PlanComparison — Side-by-side feature comparison table.\n * UI-01: Renders shadcn-style table with plan names as headers and features as rows.\n * Check/cross icons for boolean values. Uses CSS variable theming.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport type { Plan } from \"./PlanCard.js\";\n\nexport interface ComparisonFeature {\n key: string;\n label: string;\n values: Record<string, string | boolean>;\n}\n\nexport interface PlanComparisonProps {\n plans: Plan[];\n features: ComparisonFeature[];\n}\n\n/**\n * PlanComparison renders a side-by-side feature comparison table.\n *\n * Usage:\n * ```tsx\n * <PlanComparison\n * plans={plans}\n * features={[\n * { key: 'api_calls', label: 'API Calls', values: { starter: '10K', pro: '100K' } },\n * { key: 'analytics', label: 'Analytics', values: { starter: false, pro: true } },\n * ]}\n * />\n * ```\n */\nexport function PlanComparison({\n plans,\n features,\n}: PlanComparisonProps): React.ReactElement {\n return (\n <div\n style={{\n overflowX: \"auto\",\n background: \"var(--nozle-background, var(--background))\",\n }}\n >\n <table\n style={{\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"0.875rem\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n <thead>\n <tr>\n <th\n style={{\n padding: \"0.75rem 1rem\",\n textAlign: \"left\",\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontWeight: 500,\n }}\n >\n Feature\n </th>\n {plans.map((plan) => (\n <th\n key={plan.id}\n style={{\n padding: \"0.75rem 1rem\",\n textAlign: \"center\",\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontWeight: 600,\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {plan.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {features.map((feature) => (\n <tr key={feature.key}>\n <td\n style={{\n padding: \"0.75rem 1rem\",\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {feature.label}\n </td>\n {plans.map((plan) => {\n const value = feature.values[plan.id];\n return (\n <td\n key={plan.id}\n style={{\n padding: \"0.75rem 1rem\",\n textAlign: \"center\",\n borderBottom:\n \"1px solid var(--nozle-border, var(--border))\",\n }}\n >\n {typeof value === \"boolean\" ? (\n value ? (\n <span\n style={{\n color: \"var(--nozle-primary, var(--primary))\",\n }}\n aria-label=\"Included\"\n >\n ✓\n </span>\n ) : (\n <span\n style={{\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n aria-label=\"Not included\"\n >\n ✕\n </span>\n )\n ) : (\n <span>{value ?? \"—\"}</span>\n )}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","'use client';\n\nimport React, { createContext, useContext, useMemo, useState } from 'react';\nimport {\n EmbeddedCheckout as StripeEmbeddedCheckout,\n EmbeddedCheckoutProvider,\n Elements,\n PaymentElement,\n useStripe,\n useElements,\n} from '@stripe/react-stripe-js';\nimport { loadStripe } from '@stripe/stripe-js';\nimport type { Appearance, StripeElementsOptions } from '@stripe/stripe-js';\n\n// ── Public interfaces ────────────────────────────────────────────────────────\n\nexport interface CheckoutProps {\n /** Stripe PaymentIntent client secret */\n clientSecret: string;\n /** Stripe publishable key */\n publishableKey: string;\n /** Optional Stripe Connect account ID */\n stripeAccount?: string;\n /** Custom label for the submit button (default: \"Pay now\") */\n submitLabel?: string;\n /** Called with the paymentIntentId when payment succeeds without redirect */\n onSuccess?: (paymentIntentId: string) => void;\n /** Called when an embedded Checkout Session completes without a redirect. */\n onComplete?: () => void;\n /** Called with the error when payment fails */\n onError?: (error: Error) => void;\n /** Called when the PaymentElement becomes interactive */\n onReady?: () => void;\n /** Additional CSS class for the outer wrapper */\n className?: string;\n /** Inline styles for the outer wrapper */\n style?: React.CSSProperties;\n /** Optional custom controls for the PaymentIntent/PaymentElement branch. */\n children?: React.ReactNode;\n}\n\nexport interface UseCheckoutResult {\n /** Trigger payment confirmation programmatically */\n confirmPayment: () => Promise<void>;\n /** True while a payment confirmation is in-flight */\n isProcessing: boolean;\n /** Last payment error, or null if no error */\n error: Error | null;\n}\n\n// ── Internal context ──────────────────────────────────────────────────────────\n\ninterface CheckoutContextValue {\n confirmPayment: () => Promise<void>;\n isProcessing: boolean;\n error: Error | null;\n}\n\nconst CheckoutContext = createContext<CheckoutContextValue | null>(null);\n\n// ── Public hook ───────────────────────────────────────────────────────────────\n\nexport function useCheckout(): UseCheckoutResult {\n const ctx = useContext(CheckoutContext);\n if (ctx === null) {\n throw new Error('useCheckout must be used inside a <Checkout> component');\n }\n return ctx;\n}\n\n// ── Stripe appearance builder ─────────────────────────────────────────────────\n\nfunction buildStripeAppearance(): Appearance {\n if (typeof document === 'undefined') {\n return { theme: 'stripe' };\n }\n\n const style = getComputedStyle(document.documentElement);\n const get = (prop: string, fallback: string) => style.getPropertyValue(prop).trim() || fallback;\n\n return {\n theme: 'stripe',\n variables: {\n colorPrimary: get('--nozle-primary', '#16a34a'),\n colorBackground: get('--nozle-background', '#f8fafc'),\n colorText: get('--nozle-foreground', '#1e293b'),\n colorDanger: get('--nozle-destructive', '#dc2626'),\n borderRadius: get('--nozle-radius', '0.5rem'),\n fontFamily: 'inherit',\n },\n };\n}\n\n// ── Inner form component ──────────────────────────────────────────────────────\n\ntype CheckoutInnerProps = Pick<\n CheckoutProps,\n 'submitLabel' | 'onSuccess' | 'onError' | 'onReady' | 'className' | 'style'\n> & {children?: React.ReactNode};\n\nfunction CheckoutInner({\n submitLabel,\n onSuccess,\n onError,\n onReady,\n className,\n style,\n children,\n}: CheckoutInnerProps) {\n const stripe = useStripe();\n const elements = useElements();\n\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [isReady, setIsReady] = useState(false);\n\n async function confirmPayment(): Promise<void> {\n if (!stripe || !elements) return;\n\n setIsProcessing(true);\n setError(null);\n\n const result = await stripe.confirmPayment({\n elements,\n confirmParams: { return_url: window.location.href },\n redirect: 'if_required',\n });\n\n setIsProcessing(false);\n\n if (result.error) {\n const err = new Error(result.error.message ?? 'Payment failed');\n setError(err);\n onError?.(err);\n } else if (result.paymentIntent?.status === 'succeeded') {\n onSuccess?.(result.paymentIntent.id);\n }\n }\n\n return (\n <CheckoutContext.Provider value={{ confirmPayment, isProcessing, error }}>\n <div className={className} style={style}>\n <style>{`@keyframes nozle-skeleton-pulse { 0%{background-position:200% 0} 100%{background-position:-200% 0} }`}</style>\n\n {!isReady && (\n <div\n data-testid=\"checkout-skeleton\"\n style={{\n height: '200px',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n background: 'linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%)',\n backgroundSize: '200% 100%',\n animation: 'nozle-skeleton-pulse 1.5s ease-in-out infinite',\n }}\n />\n )}\n\n <PaymentElement\n onReady={() => {\n setIsReady(true);\n onReady?.();\n }}\n />\n\n {error !== null && (\n <p style={{ color: 'var(--nozle-destructive, #dc2626)', margin: '0.5rem 0 0' }}>\n {error.message}\n </p>\n )}\n\n {children ?? (\n <button\n type=\"button\"\n onClick={() => void confirmPayment()}\n disabled={isProcessing || !stripe}\n aria-busy={isProcessing}\n style={{\n padding: '0.75rem 1.5rem',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n border: 'none',\n background: 'var(--nozle-primary, var(--primary))',\n color: 'var(--nozle-primary-foreground, var(--primary-foreground))',\n cursor: isProcessing ? 'not-allowed' : 'pointer',\n fontWeight: 500,\n opacity: isProcessing ? 0.7 : 1,\n marginTop: '1rem',\n width: '100%',\n }}\n >\n {isProcessing ? 'Processing...' : (submitLabel ?? 'Pay now')}\n </button>\n )}\n </div>\n </CheckoutContext.Provider>\n );\n}\n\n// ── Public Checkout component ─────────────────────────────────────────────────\n\nexport function Checkout({\n clientSecret,\n publishableKey,\n stripeAccount,\n submitLabel,\n onSuccess,\n onComplete,\n onError,\n onReady,\n className,\n style,\n children,\n}: CheckoutProps) {\n const stripePromise = useMemo(\n () => loadStripe(publishableKey, stripeAccount ? { stripeAccount } : undefined),\n [publishableKey, stripeAccount]\n );\n\n const appearance = useMemo(() => buildStripeAppearance(), []);\n\n const embeddedOptions = useMemo(\n () => ({clientSecret, onComplete}),\n [clientSecret, onComplete]\n );\n\n if (clientSecret.startsWith('cs_')) {\n return (\n <div className={className} style={style}>\n <EmbeddedCheckoutProvider stripe={stripePromise} options={embeddedOptions}>\n <StripeEmbeddedCheckout />\n </EmbeddedCheckoutProvider>\n </div>\n );\n }\n\n const options: StripeElementsOptions = { clientSecret, appearance };\n\n return (\n <Elements key={clientSecret} stripe={stripePromise} options={options}>\n <CheckoutInner\n submitLabel={submitLabel}\n onSuccess={onSuccess}\n onError={onError}\n onReady={onReady}\n className={className}\n style={style}\n children={children}\n />\n </Elements>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { useBillingContext } from '../../provider.js';\nimport { handleCheckoutResult } from './CheckoutButton.js';\n\nexport interface ProrationPreview {\n credit: number;\n debit: number;\n net: number;\n nextBillingDate: string;\n}\n\nexport interface UpgradeModalProps {\n isOpen: boolean;\n planCode: string;\n returnUrl?: string;\n preview?: ProrationPreview;\n onStripeClientSecret?: (clientSecret: string) => void;\n onCheckoutStarted?: () => void;\n onCompleted?: () => void;\n onScheduled?: () => void;\n onConfirm?: () => void;\n onCancel?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport function UpgradeModal({\n isOpen,\n planCode,\n returnUrl,\n preview,\n onStripeClientSecret,\n onCheckoutStarted,\n onCompleted,\n onScheduled,\n onConfirm,\n onCancel,\n onError,\n}: UpgradeModalProps): React.ReactElement | null {\n const { createCheckout } = useBillingContext();\n const [error, setError] = useState<string | null>(null);\n const [confirming, setConfirming] = useState(false);\n\n async function handleConfirm(): Promise<void> {\n setConfirming(true);\n setError(null);\n try {\n if (!createCheckout) {\n throw new Error('BillingProvider createCheckout callback is required for checkout');\n }\n const result = await createCheckout({\n planCode,\n returnUrl: returnUrl ?? window.location.href,\n });\n await handleCheckoutResult(result, {\n onStripeClientSecret: (clientSecret) => {\n onStripeClientSecret?.(clientSecret);\n onCheckoutStarted?.();\n },\n onComplete: () => onCompleted?.(),\n onScheduled: () => onScheduled?.(),\n });\n onConfirm?.();\n } catch (cause) {\n const checkoutError = cause instanceof Error ? cause : new Error('Checkout failed');\n setError(checkoutError.message);\n onError?.(checkoutError);\n } finally {\n setConfirming(false);\n }\n }\n\n if (!isOpen) return null;\n\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n background: 'oklch(0 0 0 / 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1000,\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Change plan\"\n >\n <div\n style={{\n background: 'var(--nozle-background, var(--background))',\n color: 'var(--nozle-foreground, var(--foreground))',\n border: '1px solid var(--nozle-border, var(--border))',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n padding: '2rem',\n maxWidth: '28rem',\n width: '100%',\n boxShadow: 'var(--nozle-shadow, 0 4px 6px -1px rgb(0 0 0 / 0.1))',\n }}\n >\n <h2 style={{ fontSize: '1.25rem', fontWeight: 600, margin: '0 0 1rem' }}>\n Confirm plan change\n </h2>\n\n {error && <p role=\"alert\" style={{ color: 'oklch(0.6 0.2 25)' }}>{error}</p>}\n\n {preview && (\n <div style={{ marginBottom: '1.5rem' }}>\n <div\n style={{\n background: 'var(--nozle-muted, var(--muted))',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n padding: '1rem',\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5rem',\n }}\n >\n {preview.credit > 0 && <div>Credits applied: -${preview.credit.toFixed(2)}</div>}\n <div>New plan charge: ${preview.debit.toFixed(2)}</div>\n <strong>Due today: ${preview.net.toFixed(2)}</strong>\n </div>\n <p style={{ fontSize: '0.875rem' }}>\n Next billing date: {new Date(preview.nextBillingDate).toLocaleDateString()}.\n </p>\n </div>\n )}\n\n <div style={{ display: 'flex', gap: '0.75rem', justifyContent: 'flex-end' }}>\n <button type=\"button\" onClick={onCancel} disabled={confirming}>Cancel</button>\n <button type=\"button\" onClick={() => void handleConfirm()} disabled={confirming}>\n {confirming ? 'Starting checkout...' : 'Confirm'}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { UpgradeModal, type ProrationPreview } from './UpgradeModal.js';\n\nexport interface UpgradeButtonProps {\n planCode: string;\n returnUrl?: string;\n preview?: ProrationPreview;\n label?: string;\n className?: string;\n style?: React.CSSProperties;\n onStripeClientSecret?: (clientSecret: string) => void;\n onCheckoutStarted?: () => void;\n onDowngradeScheduled?: () => void;\n onUpgraded?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport function UpgradeButton({\n planCode,\n returnUrl,\n preview,\n label = 'Upgrade',\n className,\n style,\n onStripeClientSecret,\n onCheckoutStarted,\n onDowngradeScheduled,\n onUpgraded,\n onError,\n}: UpgradeButtonProps): React.ReactElement {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n className={className}\n style={{\n padding: '0.75rem 1.5rem',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n border: 'none',\n background: 'var(--nozle-primary, var(--primary))',\n color: 'var(--nozle-primary-foreground, var(--primary-foreground))',\n cursor: 'pointer',\n fontWeight: 500,\n ...style,\n }}\n >\n {label}\n </button>\n\n <UpgradeModal\n isOpen={isOpen}\n planCode={planCode}\n returnUrl={returnUrl}\n preview={preview}\n onStripeClientSecret={onStripeClientSecret}\n onCheckoutStarted={() => {\n setIsOpen(false);\n onCheckoutStarted?.();\n }}\n onCompleted={() => {\n setIsOpen(false);\n onUpgraded?.();\n }}\n onScheduled={() => {\n setIsOpen(false);\n onDowngradeScheduled?.();\n }}\n onError={onError}\n onCancel={() => setIsOpen(false)}\n />\n </>\n );\n}\n","/**\n * Presentational entitlement gate. The merchant backend owns entitlement\n * retrieval; callers pass the resulting state into this component.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\n\nexport interface FeatureGateProps {\n allowed: boolean;\n loading?: boolean;\n fallback?: ReactNode;\n children: ReactNode;\n}\n\nexport function FeatureGate({\n allowed,\n loading = false,\n fallback = null,\n children,\n}: FeatureGateProps): React.ReactElement | null {\n if (loading) return null;\n if (!allowed) return <>{fallback}</>;\n return <>{children}</>;\n}\n","/**\n * UsageGate — Renders children if usage is below limit.\n * UI-03: Renders fallback when usage >= limit.\n * Pure render logic — caller provides usage and limit values.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\n\nexport interface UsageGateProps {\n /** Current usage value */\n usage: number;\n /** Usage limit */\n limit: number;\n /** Rendered when usage is at or above limit. Defaults to null. */\n fallback?: ReactNode;\n /** Content to show when usage is below limit */\n children: ReactNode;\n}\n\n/**\n * UsageGate renders children only when current usage is below the limit.\n * When usage >= limit, renders fallback.\n *\n * Usage:\n * ```tsx\n * <UsageGate usage={currentUsage} limit={plan.apiCallLimit} fallback={<UpgradePrompt />}>\n * <ApiCallButton />\n * </UsageGate>\n * ```\n */\nexport function UsageGate({\n usage,\n limit,\n fallback = null,\n children,\n}: UsageGateProps): React.ReactElement {\n if (usage >= limit) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n","/**\n * PlanGate — Renders children if customer's plan is in the allowed list.\n * UI-03: Pure render logic — caller provides currentPlan and allowedPlans.\n * Renders fallback when customer is not on an allowed plan tier.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\n\nexport interface PlanGateProps {\n /** The customer's current plan identifier */\n currentPlan: string;\n /** List of plan identifiers that are allowed to see the children */\n allowedPlans: string[];\n /** Rendered when customer is not on an allowed plan. Defaults to null. */\n fallback?: ReactNode;\n /** Content to show when customer is on an allowed plan */\n children: ReactNode;\n}\n\n/**\n * PlanGate renders children only when the customer's currentPlan is in allowedPlans.\n * When not on an allowed plan, renders fallback.\n *\n * Usage:\n * ```tsx\n * <PlanGate\n * currentPlan={customer.plan}\n * allowedPlans={['pro', 'enterprise']}\n * fallback={<UpgradePrompt planName=\"Pro\" />}\n * >\n * <ProFeature />\n * </PlanGate>\n * ```\n */\nexport function PlanGate({\n currentPlan,\n allowedPlans,\n fallback = null,\n children,\n}: PlanGateProps): React.ReactElement {\n if (!allowedPlans.includes(currentPlan)) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n","/**\n * UpgradePrompt — Reusable upgrade message component.\n * UI-03: Shows plan name + upgrade button; used as default fallback for LockedOverlay.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\n\nimport React from \"react\";\n\nexport interface UpgradePromptProps {\n text?: string;\n planName?: string;\n onUpgrade?: () => void;\n}\n\n/**\n * UpgradePrompt renders an upgrade call-to-action with a message and button.\n * Used as default fallback in LockedOverlay and gate components.\n */\nexport function UpgradePrompt({\n text = \"Upgrade to access this feature\",\n planName,\n onUpgrade,\n}: UpgradePromptProps): React.ReactElement {\n const displayText = planName\n ? `Upgrade to ${planName} to access this feature`\n : text;\n\n function handleUpgrade(): void {\n if (onUpgrade) {\n onUpgrade();\n } else {\n window.location.href = \"/upgrade\";\n }\n }\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"1rem\",\n textAlign: \"center\",\n }}\n >\n <p\n style={{\n color: \"var(--nozle-foreground, var(--foreground))\",\n fontSize: \"0.875rem\",\n margin: 0,\n }}\n >\n {displayText}\n </p>\n <button\n onClick={handleUpgrade}\n style={{\n padding: \"0.5rem 1.25rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: \"pointer\",\n fontWeight: 500,\n fontSize: \"0.875rem\",\n }}\n >\n Upgrade\n </button>\n </div>\n );\n}\n","/**\n * LockedOverlay — Wraps children with a blur filter + upgrade CTA overlay when locked.\n * UI-03: Applies CSS blur(4px) to children with an upgrade prompt overlay.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\nimport { UpgradePrompt } from \"./UpgradePrompt.js\";\n\nexport interface LockedOverlayProps {\n /** Whether to apply the locked blur + overlay state */\n locked: boolean;\n /** Text to show in the upgrade prompt */\n upgradeText?: string;\n /** Plan name to show in the upgrade prompt */\n upgradePlanName?: string;\n /** Called when the upgrade button is clicked */\n onUpgrade?: () => void;\n /** Content to blur when locked */\n children: ReactNode;\n}\n\n/**\n * LockedOverlay wraps children in a relative container.\n * When locked=true:\n * - Children receive CSS blur(4px) and pointer-events: none\n * - An upgrade CTA overlay is positioned on top\n *\n * When locked=false, children render normally without any overlay.\n *\n * Usage:\n * ```tsx\n * <LockedOverlay locked={!canAccessFeature} upgradeText=\"Upgrade to Pro\" onUpgrade={openUpgradeModal}>\n * <FeatureContent />\n * </LockedOverlay>\n * ```\n */\nexport function LockedOverlay({\n locked,\n upgradeText,\n upgradePlanName,\n onUpgrade,\n children,\n}: LockedOverlayProps): React.ReactElement {\n if (!locked) {\n return <>{children}</>;\n }\n\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }}>\n {/* Blurred content — inaccessible to users */}\n <div\n style={{\n filter: \"blur(4px)\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n\n {/* Upgrade CTA overlay */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"var(--nozle-background, var(--background))\",\n opacity: 0.92,\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n }}\n role=\"dialog\"\n aria-label=\"Feature locked — upgrade required\"\n >\n <UpgradePrompt\n text={upgradeText}\n planName={upgradePlanName}\n onUpgrade={onUpgrade}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * UsageMeter — embeddable usage progress bar with automatic color thresholds.\n * Uses --nozle-* CSS variables for theming (customer-facing portal layer).\n *\n * Color thresholds:\n * < 80% → primary (normal)\n * 80-94% → warning (amber)\n * ≥ 95% → destructive (red)\n */\n\nexport function getUsageMeterColor(percentage: number): string {\n if (percentage >= 95) return \"var(--nozle-destructive, var(--destructive))\";\n if (percentage >= 80) return \"var(--nozle-warning, var(--warning))\";\n return \"var(--nozle-primary, var(--primary))\";\n}\n\nexport interface UsageMeterProps {\n used: number;\n limit: number;\n label?: string;\n showText?: boolean;\n}\n\nexport function UsageMeter({\n used,\n limit,\n label,\n showText = true,\n}: UsageMeterProps) {\n const percentage = limit > 0 ? Math.min(100, (used / limit) * 100) : 0;\n const color = getUsageMeterColor(percentage);\n\n return (\n <div className=\"w-full space-y-1\">\n {label && (\n <div className=\"flex justify-between text-sm\">\n <span>{label}</span>\n {showText && (\n <span style={{ color }}>\n {used.toLocaleString()} / {limit.toLocaleString()}\n </span>\n )}\n </div>\n )}\n <div\n className=\"h-2 rounded-full overflow-hidden\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n >\n <div\n className=\"h-full rounded-full\"\n style={{\n width: `${percentage}%`,\n background: color,\n transition: \"width 0.3s ease\",\n }}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * UsageDashboard — renders multiple UsageMeters for all features.\n *\n * Accepts features as props. When loading=true renders skeleton placeholders.\n */\n\nimport { UsageMeter } from \"./UsageMeter.js\";\n\nexport interface UsageDashboardFeature {\n key: string;\n label: string;\n used: number;\n limit: number;\n}\n\nexport interface UsageDashboardProps {\n features?: UsageDashboardFeature[];\n loading?: boolean;\n}\n\nexport function UsageDashboard({\n features = [],\n loading = false,\n}: UsageDashboardProps) {\n if (loading) {\n return (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-8 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {features.map((f) => (\n <UsageMeter key={f.key} used={f.used} limit={f.limit} label={f.label} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * UsageAlert — warning banner shown when any feature usage is >= threshold.\n *\n * Shows dismissible alerts for features approaching their limit.\n * Default threshold: 80% (amber zone entry point).\n */\n\nimport { useState } from \"react\";\n\nexport interface UsageAlertFeature {\n key: string;\n label: string;\n percentage: number;\n}\n\nexport interface UsageAlertProps {\n features: UsageAlertFeature[];\n threshold?: number;\n upgradeHref?: string;\n}\n\nexport function UsageAlert({\n features,\n threshold = 80,\n upgradeHref = \"/plans\",\n}: UsageAlertProps) {\n const [dismissed, setDismissed] = useState<Set<string>>(new Set());\n\n const alertFeatures = features.filter(\n (f) => f.percentage >= threshold && !dismissed.has(f.key),\n );\n\n if (alertFeatures.length === 0) {\n return null;\n }\n\n const handleDismiss = (key: string) => {\n setDismissed((prev) => new Set(prev).add(key));\n };\n\n return (\n <div className=\"space-y-2\">\n {alertFeatures.map((f) => (\n <div\n key={f.key}\n role=\"alert\"\n className=\"flex items-center justify-between rounded-md px-4 py-3 text-sm\"\n style={{\n background: \"var(--nozle-warning-bg, var(--warning-bg, #fef9c3))\",\n color: \"var(--nozle-warning-text, var(--warning-text, #854d0e))\",\n border:\n \"1px solid var(--nozle-warning-border, var(--warning-border, #fde047))\",\n }}\n >\n <span>\n <span\n aria-hidden=\"true\"\n style={{ marginRight: \"0.5rem\", fontSize: \"1rem\" }}\n >\n ⚠\n </span>\n You're approaching your <strong>{f.label}</strong> limit (\n {Math.round(f.percentage)}%).{\" \"}\n <a\n href={upgradeHref}\n style={{\n color: \"inherit\",\n fontWeight: 600,\n textDecoration: \"underline\",\n }}\n >\n Upgrade\n </a>\n </span>\n <button\n onClick={() => handleDismiss(f.key)}\n aria-label={`Dismiss ${f.label} alert`}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"0 0 0 0.75rem\",\n fontSize: \"1rem\",\n color: \"inherit\",\n }}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * PlanBadge — simple badge displaying plan name with tier-based coloring.\n */\n\nimport type React from \"react\";\n\nexport interface PlanBadgeProps {\n plan: string;\n tier?: \"free\" | \"starter\" | \"pro\" | \"enterprise\";\n}\n\nconst TIER_STYLES: Record<string, React.CSSProperties> = {\n free: {\n background: \"var(--nozle-muted, var(--muted, #f1f5f9))\",\n color: \"var(--nozle-muted-foreground, var(--muted-foreground, #64748b))\",\n border: \"1px solid var(--nozle-border, var(--border, #e2e8f0))\",\n },\n starter: {\n background:\n \"color-mix(in srgb, var(--nozle-primary, var(--primary, #3b82f6)) 10%, transparent)\",\n color: \"var(--nozle-primary, var(--primary, #3b82f6))\",\n border:\n \"1px solid color-mix(in srgb, var(--nozle-primary, var(--primary, #3b82f6)) 30%, transparent)\",\n },\n pro: {\n background: \"var(--nozle-primary, var(--primary, #3b82f6))\",\n color:\n \"var(--nozle-primary-foreground, var(--primary-foreground, #ffffff))\",\n border: \"1px solid transparent\",\n },\n enterprise: {\n background: \"var(--nozle-accent, var(--accent, #8b5cf6))\",\n color: \"var(--nozle-accent-foreground, var(--accent-foreground, #ffffff))\",\n border: \"1px solid transparent\",\n },\n};\n\nexport function PlanBadge({ plan, tier = \"free\" }: PlanBadgeProps) {\n const style = TIER_STYLES[tier] ?? TIER_STYLES.free;\n\n return (\n <span\n style={{\n ...style,\n display: \"inline-flex\",\n alignItems: \"center\",\n padding: \"0.125rem 0.5rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 600,\n lineHeight: \"1.25rem\",\n whiteSpace: \"nowrap\",\n }}\n >\n {plan}\n </span>\n );\n}\n","\"use client\";\n\n/**\n * PaymentMethodDisplay — shows saved payment method details.\n * Displays last4, brand, expiry. \"Update Payment Method\" button opens checkout.\n */\n\nexport interface PaymentMethod {\n last4: string;\n brand: string;\n expMonth: number;\n expYear: number;\n}\n\nexport interface PaymentMethodDisplayProps {\n paymentMethod?: PaymentMethod;\n onUpdatePaymentMethod?: () => void;\n updateHref?: string;\n}\n\nconst BRAND_LABELS: Record<string, string> = {\n visa: \"Visa\",\n mastercard: \"Mastercard\",\n amex: \"American Express\",\n discover: \"Discover\",\n jcb: \"JCB\",\n diners: \"Diners Club\",\n unionpay: \"UnionPay\",\n};\n\nexport function PaymentMethodDisplay({\n paymentMethod,\n onUpdatePaymentMethod,\n updateHref = \"/billing/update-payment\",\n}: PaymentMethodDisplayProps) {\n const handleUpdate = () => {\n if (onUpdatePaymentMethod) {\n onUpdatePaymentMethod();\n } else {\n window.location.href = updateHref;\n }\n };\n\n return (\n <div className=\"space-y-3\">\n {paymentMethod ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"0.75rem 1rem\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.5rem\",\n fontSize: \"0.875rem\",\n }}\n >\n <span\n style={{\n fontWeight: 600,\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {BRAND_LABELS[paymentMethod.brand.toLowerCase()] ??\n paymentMethod.brand}\n </span>\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n •••• {paymentMethod.last4}\n </span>\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.75rem\",\n }}\n >\n Expires {String(paymentMethod.expMonth).padStart(2, \"0\")}/\n {String(paymentMethod.expYear).slice(-2)}\n </span>\n </div>\n ) : (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n No payment method on file.\n </p>\n )}\n <button\n onClick={handleUpdate}\n style={{\n background: \"transparent\",\n border: \"1px solid var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary, var(--primary))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Update Payment Method\n </button>\n </div>\n );\n}\n"]}
|