@nozle-js/react 0.7.1 → 0.8.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/dist/index.cjs CHANGED
@@ -31,7 +31,7 @@ var BillingContext = React.createContext(null);
31
31
  function BillingProvider({
32
32
  publishableKey,
33
33
  createCheckout,
34
- baseUrl = "https://api.nozle.app",
34
+ baseUrl = "https://api.nozle.app/engine",
35
35
  children
36
36
  }) {
37
37
  if (!publishableKey.startsWith("pk_")) {
@@ -1 +1 @@
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":"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","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 /** Where Stripe should return the buyer after a redirect-required payment. */\n returnUrl?: 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' | 'returnUrl'\n> & {children?: React.ReactNode};\n\nfunction CheckoutInner({\n submitLabel,\n onSuccess,\n onError,\n onReady,\n className,\n style,\n returnUrl,\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: returnUrl ?? 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 returnUrl,\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 returnUrl={returnUrl}\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&apos;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"]}
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":"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","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/engine',\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 /** Where Stripe should return the buyer after a redirect-required payment. */\n returnUrl?: 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' | 'returnUrl'\n> & {children?: React.ReactNode};\n\nfunction CheckoutInner({\n submitLabel,\n onSuccess,\n onError,\n onReady,\n className,\n style,\n returnUrl,\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: returnUrl ?? 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 returnUrl,\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 returnUrl={returnUrl}\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&apos;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"]}
package/dist/index.js CHANGED
@@ -25,7 +25,7 @@ var BillingContext = createContext(null);
25
25
  function BillingProvider({
26
26
  publishableKey,
27
27
  createCheckout,
28
- baseUrl = "https://api.nozle.app",
28
+ baseUrl = "https://api.nozle.app/engine",
29
29
  children
30
30
  }) {
31
31
  if (!publishableKey.startsWith("pk_")) {