@nozle-js/react 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +241 -0
- package/dist/index.cjs +2773 -897
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +603 -117
- package/dist/index.d.ts +603 -117
- package/dist/index.js +2741 -894
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store.ts","../src/centrifugo.ts","../src/provider.tsx","../src/hooks/use-can.ts","../src/hooks/use-usage.ts","../src/hooks/use-plan.ts","../src/hooks/use-checkout.ts","../src/hooks/use-subscribe.ts","../src/hooks/use-plans.ts","../src/components/usage-meter.tsx","../src/components/plan-badge.tsx","../src/components/upgrade-prompt.tsx"],"names":["useSyncExternalStore","useState","useCallback","useEffect","jsx","labelStyle","fontFamily","skeletonStyleInjected","ensureKeyframes","dotStyle","jsxs","msgStyle","btnStyle"],"mappings":"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","file":"index.js","sourcesContent":["import type { BillingState } from \"./types\";\n\nexport class BillingStore {\n readonly baseUrl: string;\n readonly apiKey: string;\n readonly customerId: string;\n\n private state: BillingState = {\n entitlements: null,\n credits: null,\n usage: {},\n connectionState: \"connecting\",\n error: null,\n };\n\n private listeners = new Set<() => void>();\n\n constructor(baseUrl: string, apiKey: string, customerId: string) {\n this.baseUrl = baseUrl;\n this.apiKey = apiKey;\n this.customerId = customerId;\n }\n\n getSnapshot = (): BillingState => this.state;\n getServerSnapshot = (): BillingState => this.state;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n private emit(): void {\n for (const listener of this.listeners) {\n listener();\n }\n }\n\n setConnectionState(state: BillingState[\"connectionState\"]): void {\n this.state = { ...this.state, connectionState: state };\n this.emit();\n }\n\n setError(error: Error | null): void {\n this.state = { ...this.state, error };\n this.emit();\n }\n\n updateUsage(metric: string, used: number, limit: number, remaining: number): void {\n this.state = {\n ...this.state,\n usage: {\n ...this.state.usage,\n [metric]: { used, limit, remaining },\n },\n };\n this.emit();\n }\n\n async fetchUsage(feature: string): Promise<void> {\n try {\n const res = await fetch(\n `${this.baseUrl}/v1/can?customer_id=${this.customerId}&feature=${feature}`,\n { headers: { Authorization: `Bearer ${this.apiKey}` } }\n );\n if (!res.ok) return;\n const data = await res.json();\n this.updateUsage(feature, data.used, data.limit, data.remaining);\n\n this.state = {\n ...this.state,\n entitlements: {\n plan_slug: \"pro\",\n subscription_status: \"active\",\n features: { [feature]: { enabled: data.allowed } },\n limits: { [feature]: { limit: data.limit, used: data.used, source: \"entitlement\" } },\n },\n };\n this.emit();\n } catch (err) {\n this.state = {\n ...this.state,\n error: err instanceof Error ? err : new Error(String(err)),\n };\n this.emit();\n }\n }\n\n async fetchCheckoutSecret(planCode: string, successUrl?: string): Promise<string> {\n const res = await fetch(`${this.baseUrl}/v1/checkout`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n plan_code: planCode,\n customer_id: this.customerId,\n success_url: successUrl || `${window.location.origin}/checkout/complete?session_id={CHECKOUT_SESSION_ID}`,\n }),\n });\n if (!res.ok) throw new Error(\"Failed to create checkout session\");\n const data = await res.json();\n return data.client_secret;\n }\n\n async fetchPlans(): Promise<Array<{ code: string; name: string; amount_cents: number; amount_currency: string; interval: string }>> {\n const res = await fetch(`${this.baseUrl}/v1/plans`, {\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n if (!res.ok) return [];\n const data = await res.json();\n return data.plans || [];\n }\n\n handleEvent(event: { type: string; [key: string]: unknown }): void {\n if (event.type === \"usage.updated\") {\n const metric = event.metric as string;\n const used = event.used as number;\n const limit = event.limit as number;\n const remaining = event.remaining as number;\n this.updateUsage(metric, used, limit, remaining);\n }\n }\n}\n","import { Centrifuge, type Subscription } from \"centrifuge\";\nimport type { BillingStore } from \"./store\";\n\nexport interface CentrifugoConnection {\n disconnect: () => void;\n}\n\nexport function connectCentrifugo(\n store: BillingStore,\n customerId: string,\n wsUrl: string\n): CentrifugoConnection {\n const centrifuge = new Centrifuge(wsUrl, {});\n\n const sub: Subscription = centrifuge.newSubscription(\n `customer:${customerId}`\n );\n\n sub.on(\"publication\", (ctx) => {\n store.handleEvent(\n ctx.data as { type: string; [key: string]: unknown }\n );\n });\n\n sub.on(\"subscribed\", () => {\n store.setConnectionState(\"connected\");\n });\n\n centrifuge.on(\"connected\", () => {\n store.setConnectionState(\"connected\");\n });\n\n centrifuge.on(\"disconnected\", () => {\n store.setConnectionState(\"disconnected\");\n });\n\n sub.subscribe();\n centrifuge.connect();\n store.setConnectionState(\"connecting\");\n\n return {\n disconnect: () => {\n sub.unsubscribe();\n centrifuge.disconnect();\n },\n };\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n type ReactNode,\n} from \"react\";\nimport { loadStripe, type Stripe } from \"@stripe/stripe-js\";\nimport { BillingStore } from \"./store\";\nimport { connectCentrifugo, type CentrifugoConnection } from \"./centrifugo\";\n\ninterface BillingContextValue {\n store: BillingStore;\n stripePromise: Promise<Stripe | null> | null;\n}\n\nconst BillingContext = createContext<BillingContextValue | null>(null);\n\ninterface BillingProviderProps {\n apiKey: string;\n customerId: string;\n baseUrl?: string;\n wsUrl?: string;\n stripeKey?: string;\n features?: string[];\n children: ReactNode;\n}\n\nexport function BillingProvider({\n apiKey,\n customerId,\n baseUrl = \"http://localhost:8080\",\n wsUrl = \"ws://localhost:8001/connection/websocket\",\n stripeKey,\n features = [],\n children,\n}: BillingProviderProps) {\n const storeRef = useRef<BillingStore>(null!);\n\n if (!storeRef.current) {\n storeRef.current = new BillingStore(baseUrl, apiKey, customerId);\n }\n\n const stripePromise = useMemo(\n () => (stripeKey ? loadStripe(stripeKey) : null),\n [stripeKey]\n );\n\n useEffect(() => {\n const store = storeRef.current!;\n\n for (const feature of features) {\n store.fetchUsage(feature);\n }\n\n const connection: CentrifugoConnection = connectCentrifugo(\n store,\n customerId,\n wsUrl\n );\n\n return () => {\n connection.disconnect();\n };\n }, [apiKey, customerId, baseUrl, wsUrl, features]);\n\n return (\n <BillingContext.Provider value={{ store: storeRef.current, stripePromise }}>\n {children}\n </BillingContext.Provider>\n );\n}\n\nexport function useBillingContext(): BillingContextValue {\n const ctx = useContext(BillingContext);\n if (!ctx) {\n throw new Error(\"useBillingContext must be used within a BillingProvider\");\n }\n return ctx;\n}\n","import { useSyncExternalStore } from \"react\";\nimport { useBillingContext } from \"../provider\";\nimport type { UseCanResult } from \"../types\";\n\nexport function useCan(feature: string): UseCanResult {\n const { store } = useBillingContext();\n const state = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getServerSnapshot\n );\n\n if (state.error) {\n return { allowed: false, isLoading: false, error: state.error };\n }\n if (state.entitlements === null) {\n return { allowed: false, isLoading: true, error: null };\n }\n\n const featureState = state.entitlements.features[feature];\n return {\n allowed: featureState?.enabled ?? false,\n isLoading: false,\n error: null,\n };\n}\n","import { useSyncExternalStore } from \"react\";\nimport { useBillingContext } from \"../provider\";\nimport type { UseUsageResult } from \"../types\";\n\nexport function useUsage(metric: string): UseUsageResult {\n const { store } = useBillingContext();\n const state = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getServerSnapshot\n );\n\n if (state.error) {\n return { data: null, isLoading: false, error: state.error };\n }\n if (state.entitlements === null) {\n return { data: null, isLoading: true, error: null };\n }\n\n const usage = state.usage[metric] ?? null;\n return { data: usage, isLoading: false, error: null };\n}\n","import { useSyncExternalStore } from \"react\";\nimport { useBillingContext } from \"../provider\";\nimport type { UsePlanResult } from \"../types\";\n\nexport function usePlan(): UsePlanResult {\n const { store } = useBillingContext();\n const state = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getServerSnapshot\n );\n\n if (state.error) {\n return { data: null, isLoading: false, error: state.error };\n }\n if (state.entitlements === null) {\n return { data: null, isLoading: true, error: null };\n }\n\n return {\n data: {\n plan_slug: state.entitlements.plan_slug,\n subscription_status: state.entitlements.subscription_status,\n },\n isLoading: false,\n error: null,\n };\n}\n","import { useCallback, useState } from \"react\";\nimport { useBillingContext } from \"../provider\";\n\nexport interface UseCheckoutResult {\n fetchClientSecret: (planCode: string, successUrl?: string) => Promise<string>;\n stripePromise: ReturnType<typeof import(\"@stripe/stripe-js\").loadStripe> | null;\n isLoading: boolean;\n error: Error | null;\n}\n\nexport function useCheckout(): UseCheckoutResult {\n const { store, stripePromise } = useBillingContext();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchClientSecret = useCallback(\n async (planCode: string, successUrl?: string): Promise<string> => {\n setIsLoading(true);\n setError(null);\n try {\n return await store.fetchCheckoutSecret(planCode, successUrl);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setIsLoading(false);\n }\n },\n [store]\n );\n\n return { fetchClientSecret, stripePromise, isLoading, error };\n}\n","import { useCallback, useState } from \"react\";\nimport { useBillingContext } from \"../provider\";\n\nexport interface UseSubscribeResult {\n subscribe: (planCode: string) => Promise<any>;\n isLoading: boolean;\n error: Error | null;\n}\n\nexport function useSubscribe(): UseSubscribeResult {\n const { store } = useBillingContext();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const subscribe = useCallback(\n async (planCode: string) => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${store.baseUrl}/v1/subscribe`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${store.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n plan_code: planCode,\n customer_id: store.customerId,\n }),\n });\n if (!res.ok) throw new Error(\"Failed to create subscription\");\n return await res.json();\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n throw e;\n } finally {\n setIsLoading(false);\n }\n },\n [store]\n );\n\n return { subscribe, isLoading, error };\n}\n","import { useEffect, useState } from \"react\";\nimport { useBillingContext } from \"../provider\";\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 { store } = useBillingContext();\n const [plans, setPlans] = useState<Plan[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n store\n .fetchPlans()\n .then(setPlans)\n .finally(() => setIsLoading(false));\n }, [store]);\n\n return { plans, isLoading };\n}\n","import { useUsage } from \"../hooks/use-usage\";\nimport type { CSSProperties } from \"react\";\nimport type { UsageMeterProps } from \"./types\";\n\nconst fontFamily =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif';\n\nconst levelColors: Record<string, { fg: string; bg: string; trackBg: string }> =\n {\n normal: {\n fg: \"#6366f1\",\n bg: \"rgba(99, 102, 241, 0.08)\",\n trackBg: \"#e5e7eb\",\n },\n warning: {\n fg: \"#f59e0b\",\n bg: \"rgba(245, 158, 11, 0.08)\",\n trackBg: \"#e5e7eb\",\n },\n critical: {\n fg: \"#ef4444\",\n bg: \"rgba(239, 68, 68, 0.08)\",\n trackBg: \"#e5e7eb\",\n },\n };\n\nlet skeletonStyleInjected = false;\nfunction ensureKeyframes() {\n if (skeletonStyleInjected || typeof document === \"undefined\") return;\n const sheet = document.createElement(\"style\");\n sheet.textContent = `@keyframes nozle-pulse{0%,100%{opacity:1}50%{opacity:.4}}`;\n document.head.appendChild(sheet);\n skeletonStyleInjected = true;\n}\n\nexport function UsageMeter({\n metric,\n variant = \"bar\",\n className,\n style,\n ...props\n}: UsageMeterProps) {\n const { data, isLoading, error } = useUsage(metric);\n\n if (isLoading) {\n ensureKeyframes();\n if (variant === \"minimal\") {\n return (\n <span\n data-nozle=\"usage-meter\"\n data-variant=\"minimal\"\n className={className}\n style={{\n display: \"inline-block\",\n width: 80,\n height: 16,\n borderRadius: 4,\n background: \"#e5e7eb\",\n animation: \"nozle-pulse 1.5s ease-in-out infinite\",\n ...style,\n }}\n {...props}\n />\n );\n }\n if (variant === \"ring\") {\n return (\n <div\n data-nozle=\"usage-meter\"\n data-variant=\"ring\"\n className={className}\n style={{\n width: 96,\n height: 96,\n borderRadius: \"50%\",\n background: \"#e5e7eb\",\n animation: \"nozle-pulse 1.5s ease-in-out infinite\",\n ...style,\n }}\n {...props}\n />\n );\n }\n return (\n <div\n data-nozle=\"usage-meter\"\n data-variant=\"bar\"\n className={className}\n style={{\n maxWidth: 360,\n fontFamily,\n ...style,\n }}\n {...props}\n >\n <div\n style={{\n height: 8,\n borderRadius: 4,\n background: \"#e5e7eb\",\n animation: \"nozle-pulse 1.5s ease-in-out infinite\",\n }}\n />\n </div>\n );\n }\n\n if (error || !data) return null;\n\n const percent =\n data.limit > 0 ? Math.round((data.used / data.limit) * 100) : 0;\n const level =\n percent >= 90 ? \"critical\" : percent >= 75 ? \"warning\" : \"normal\";\n const colors = levelColors[level];\n\n if (variant === \"minimal\") {\n const minimalStyle: CSSProperties = {\n fontFamily,\n fontSize: 13,\n fontWeight: 500,\n color: colors.fg,\n background: colors.bg,\n padding: \"3px 8px\",\n borderRadius: 6,\n whiteSpace: \"nowrap\",\n ...style,\n };\n return (\n <span\n data-nozle=\"usage-meter\"\n data-variant=\"minimal\"\n data-level={level}\n className={className}\n style={minimalStyle}\n {...props}\n >\n {data.used.toLocaleString()}/{data.limit.toLocaleString()}\n </span>\n );\n }\n\n if (variant === \"ring\") {\n const size = 96;\n const strokeWidth = 7;\n const radius = (size - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - (percent / 100) * circumference;\n\n const containerStyle: CSSProperties = {\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: size,\n height: size,\n fontFamily,\n ...style,\n };\n\n const labelStyle: CSSProperties = {\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontWeight: 700,\n fontSize: 20,\n lineHeight: 1,\n color: colors.fg,\n };\n\n return (\n <div\n data-nozle=\"usage-meter\"\n data-variant=\"ring\"\n data-level={level}\n className={className}\n style={containerStyle}\n {...props}\n >\n <svg\n viewBox={`0 0 ${size} ${size}`}\n width={size}\n height={size}\n style={{ display: \"block\", transform: \"rotate(-90deg)\" }}\n >\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke={colors.trackBg}\n strokeWidth={strokeWidth}\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke={colors.fg}\n strokeWidth={strokeWidth}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n style={{ transition: \"stroke-dashoffset 0.4s ease\" }}\n />\n </svg>\n <span data-nozle=\"usage-meter-label\" style={labelStyle}>\n <span>{percent}%</span>\n <span\n style={{\n fontSize: 10,\n fontWeight: 400,\n color: \"#6b7280\",\n marginTop: 2,\n }}\n >\n used\n </span>\n </span>\n </div>\n );\n }\n\n const cardStyle: CSSProperties = {\n fontFamily,\n maxWidth: 360,\n background: \"#ffffff\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 12,\n padding: \"16px 20px\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.04), 0 1px 2px rgba(0,0,0,0.02)\",\n ...style,\n };\n\n const headerStyle: CSSProperties = {\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"baseline\",\n marginBottom: 10,\n };\n\n const labelStyle: CSSProperties = {\n fontSize: 13,\n fontWeight: 500,\n color: \"#374151\",\n };\n\n const valueStyle: CSSProperties = {\n fontSize: 13,\n fontWeight: 600,\n color: colors.fg,\n };\n\n const trackStyle: CSSProperties = {\n height: 8,\n borderRadius: 4,\n background: colors.trackBg,\n overflow: \"hidden\",\n };\n\n const fillStyle: CSSProperties = {\n height: \"100%\",\n borderRadius: 4,\n background: colors.fg,\n width: `${Math.min(percent, 100)}%`,\n transition: \"width 0.4s ease\",\n };\n\n return (\n <div\n data-nozle=\"usage-meter\"\n data-variant=\"bar\"\n data-level={level}\n className={className}\n style={cardStyle}\n {...props}\n >\n <div style={headerStyle}>\n <span data-nozle=\"usage-meter-label\" style={labelStyle}>\n {data.used.toLocaleString()} / {data.limit.toLocaleString()}\n </span>\n <span style={valueStyle}>{percent}%</span>\n </div>\n <div data-nozle=\"usage-meter-track\" style={trackStyle}>\n <div data-nozle=\"usage-meter-fill\" style={fillStyle} />\n </div>\n </div>\n );\n}\n","import { usePlan } from \"../hooks/use-plan\";\nimport type { CSSProperties } from \"react\";\nimport type { PlanBadgeProps } from \"./types\";\n\nconst fontFamily =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif';\n\nconst statusColorMap: Record<string, { dot: string; bg: string; text: string }> = {\n active: { dot: \"#22c55e\", bg: \"rgba(34, 197, 94, 0.08)\", text: \"#15803d\" },\n trialing: { dot: \"#6366f1\", bg: \"rgba(99, 102, 241, 0.08)\", text: \"#4f46e5\" },\n past_due: { dot: \"#f59e0b\", bg: \"rgba(245, 158, 11, 0.08)\", text: \"#b45309\" },\n canceled: { dot: \"#6b7280\", bg: \"rgba(107, 114, 128, 0.08)\", text: \"#4b5563\" },\n unpaid: { dot: \"#ef4444\", bg: \"rgba(239, 68, 68, 0.08)\", text: \"#dc2626\" },\n incomplete: { dot: \"#f59e0b\", bg: \"rgba(245, 158, 11, 0.08)\", text: \"#b45309\" },\n};\nconst defaultStatusColors = { dot: \"#6366f1\", bg: \"rgba(99, 102, 241, 0.08)\", text: \"#4f46e5\" };\n\nfunction getStatusColors(status: string) {\n return statusColorMap[status] ?? defaultStatusColors;\n}\n\nlet skeletonStyleInjected = false;\nfunction ensureKeyframes() {\n if (skeletonStyleInjected || typeof document === \"undefined\") return;\n const sheet = document.createElement(\"style\");\n sheet.textContent = `@keyframes nozle-pulse{0%,100%{opacity:1}50%{opacity:.4}}`;\n document.head.appendChild(sheet);\n skeletonStyleInjected = true;\n}\n\nexport function PlanBadge({\n variant = \"pill\",\n className,\n style,\n ...props\n}: PlanBadgeProps) {\n const { data, isLoading, error } = usePlan();\n\n if (isLoading) {\n ensureKeyframes();\n if (variant === \"icon\") {\n return (\n <span\n data-nozle=\"plan-badge\"\n data-variant=\"icon\"\n className={className}\n style={{\n display: \"inline-block\",\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n background: \"#e5e7eb\",\n animation: \"nozle-pulse 1.5s ease-in-out infinite\",\n ...style,\n }}\n {...props}\n />\n );\n }\n return (\n <span\n data-nozle=\"plan-badge\"\n data-variant={variant}\n className={className}\n style={{\n display: \"inline-block\",\n width: 72,\n height: 22,\n borderRadius: variant === \"pill\" ? 999 : 4,\n background: \"#e5e7eb\",\n animation: \"nozle-pulse 1.5s ease-in-out infinite\",\n ...style,\n }}\n {...props}\n />\n );\n }\n\n if (error || !data) return null;\n\n const statusLabel = data.subscription_status.replace(/_/g, \" \");\n const colors = getStatusColors(data.subscription_status);\n const planName = data.plan_slug;\n\n if (variant === \"text\") {\n const textStyle: CSSProperties = {\n fontFamily,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 14,\n fontWeight: 500,\n color: \"#111827\",\n ...style,\n };\n const dotStyle: CSSProperties = {\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: colors.dot,\n flexShrink: 0,\n };\n return (\n <span\n data-nozle=\"plan-badge\"\n data-variant=\"text\"\n data-status={data.subscription_status}\n className={className}\n style={textStyle}\n {...props}\n >\n <span style={dotStyle} aria-hidden=\"true\" />\n {planName}\n </span>\n );\n }\n\n if (variant === \"icon\") {\n const iconStyle: CSSProperties = {\n fontFamily,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n background: colors.bg,\n color: colors.text,\n fontSize: 14,\n fontWeight: 700,\n lineHeight: 1,\n flexShrink: 0,\n ...style,\n };\n return (\n <span\n data-nozle=\"plan-badge\"\n data-variant=\"icon\"\n data-status={data.subscription_status}\n className={className}\n style={iconStyle}\n title={`${planName} (${statusLabel})`}\n {...props}\n >\n {planName.charAt(0).toUpperCase()}\n </span>\n );\n }\n\n const pillStyle: CSSProperties = {\n fontFamily,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n fontWeight: 600,\n lineHeight: 1.4,\n color: colors.text,\n background: colors.bg,\n padding: \"4px 12px\",\n borderRadius: 999,\n whiteSpace: \"nowrap\",\n ...style,\n };\n const dotStyle: CSSProperties = {\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: colors.dot,\n flexShrink: 0,\n };\n\n return (\n <span\n data-nozle=\"plan-badge\"\n data-variant=\"pill\"\n data-status={data.subscription_status}\n className={className}\n style={pillStyle}\n {...props}\n >\n <span style={dotStyle} aria-hidden=\"true\" />\n {planName}\n </span>\n );\n}\n","import { useCan } from \"../hooks/use-can\";\nimport type { CSSProperties } from \"react\";\nimport type { UpgradePromptProps } from \"./types\";\n\nconst fontFamily =\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif';\n\nconst primaryColor = \"#6366f1\";\nconst primaryHover = \"#4f46e5\";\n\nexport function UpgradePrompt({\n feature,\n variant = \"card\",\n upgradeUrl = \"/upgrade\",\n message = \"Upgrade your plan to unlock this feature\",\n className,\n style,\n ...props\n}: UpgradePromptProps) {\n const { allowed, isLoading } = useCan(feature ?? \"\");\n\n if (isLoading || allowed || !feature) return null;\n\n if (variant === \"inline\") {\n const inlineStyle: CSSProperties = {\n fontFamily,\n fontSize: 13,\n color: \"#6b7280\",\n ...style,\n };\n const linkStyle: CSSProperties = {\n color: primaryColor,\n fontWeight: 600,\n textDecoration: \"none\",\n marginLeft: 4,\n };\n return (\n <span\n data-nozle=\"upgrade-prompt\"\n data-variant=\"inline\"\n className={className}\n style={inlineStyle}\n {...props}\n >\n {message}\n <a\n href={upgradeUrl}\n data-nozle=\"upgrade-prompt-link\"\n style={linkStyle}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.textDecoration = \"underline\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.textDecoration = \"none\";\n }}\n >\n Upgrade\n </a>\n </span>\n );\n }\n\n if (variant === \"banner\") {\n const bannerStyle: CSSProperties = {\n fontFamily,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 16,\n background: \"rgba(99, 102, 241, 0.06)\",\n border: \"1px solid rgba(99, 102, 241, 0.15)\",\n borderRadius: 10,\n padding: \"12px 20px\",\n ...style,\n };\n const msgStyle: CSSProperties = {\n fontSize: 14,\n fontWeight: 500,\n color: \"#374151\",\n flex: 1,\n };\n const btnStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 13,\n fontWeight: 600,\n color: \"#ffffff\",\n background: primaryColor,\n border: \"none\",\n borderRadius: 8,\n padding: \"8px 18px\",\n textDecoration: \"none\",\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n transition: \"background 0.15s ease\",\n };\n return (\n <div\n data-nozle=\"upgrade-prompt\"\n data-variant=\"banner\"\n className={className}\n style={bannerStyle}\n {...props}\n >\n <span data-nozle=\"upgrade-prompt-message\" style={msgStyle}>\n {message}\n </span>\n <a\n href={upgradeUrl}\n data-nozle=\"upgrade-prompt-action\"\n style={btnStyle}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.background = primaryHover;\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.background = primaryColor;\n }}\n >\n Upgrade\n </a>\n </div>\n );\n }\n\n const cardStyle: CSSProperties = {\n fontFamily,\n maxWidth: 400,\n background: \"#ffffff\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 16,\n padding: 24,\n boxShadow: \"0 1px 3px rgba(0,0,0,0.04), 0 1px 2px rgba(0,0,0,0.02)\",\n textAlign: \"center\",\n ...style,\n };\n\n const iconWrapStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 48,\n height: 48,\n borderRadius: 12,\n background: \"rgba(99, 102, 241, 0.08)\",\n marginBottom: 16,\n };\n\n const msgStyle: CSSProperties = {\n fontSize: 15,\n fontWeight: 500,\n color: \"#374151\",\n lineHeight: 1.5,\n margin: 0,\n marginBottom: 20,\n };\n\n const btnStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 14,\n fontWeight: 600,\n color: \"#ffffff\",\n background: primaryColor,\n border: \"none\",\n borderRadius: 10,\n padding: \"10px 24px\",\n textDecoration: \"none\",\n cursor: \"pointer\",\n transition: \"background 0.15s ease\",\n width: \"100%\",\n };\n\n return (\n <div\n data-nozle=\"upgrade-prompt\"\n data-variant=\"card\"\n className={className}\n style={cardStyle}\n {...props}\n >\n <div data-nozle=\"upgrade-prompt-content\">\n <div style={iconWrapStyle}>\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={primaryColor}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M13 2L3 14h9l-1 8 10-12h-9l1-8z\" />\n </svg>\n </div>\n <p data-nozle=\"upgrade-prompt-message\" style={msgStyle}>\n {message}\n </p>\n </div>\n <a\n href={upgradeUrl}\n data-nozle=\"upgrade-prompt-action\"\n style={btnStyle}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.background = primaryHover;\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.background = primaryColor;\n }}\n >\n Upgrade Now\n </a>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider.tsx","../src/hooks/use-can.ts","../src/hooks/use-usage.ts","../src/hooks/use-credits.ts","../src/components/billing/BillingPortalProvider.tsx","../src/components/pricing/PlanCard.tsx","../src/components/pricing/PricingTable.tsx","../src/components/pricing/PlanComparison.tsx","../src/components/billing/CheckoutButton.tsx","../src/components/billing/Checkout.tsx","../src/components/billing/UpgradeModal.tsx","../src/components/billing/UpgradeButton.tsx","../src/components/billing/CreditTopUpButton.tsx","../src/components/gates/FeatureGate.tsx","../src/components/gates/UsageGate.tsx","../src/components/gates/PlanGate.tsx","../src/components/gates/UpgradePrompt.tsx","../src/components/gates/LockedOverlay.tsx","../src/components/usage/UsageMeter.tsx","../src/components/usage/UsageDashboard.tsx","../src/components/usage/UsageAlert.tsx","../src/components/billing/CreditBalance.tsx","../src/components/billing/CreditHistory.tsx","../src/components/billing/PlanBadge.tsx","../src/components/billing/CurrentPlan.tsx","../src/components/billing/InvoiceList.tsx","../src/components/billing/BillingPortal.tsx","../src/components/billing/PaymentMethodDisplay.tsx","../src/components/billing/CancelSubscriptionButton.tsx"],"names":["useState","useEffect","createContext","useContext","jsx","jsxs","useMemo","Fragment","formatDate"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useEffect, useState, useMemo, type ReactNode } from 'react';\n\nexport interface CanResult {\n allowed: boolean;\n remaining: number | null;\n limit: number | null;\n used: number;\n error?: string | null;\n}\n\nexport interface NozleClient {\n apiKey: string;\n baseUrl: string;\n fetch(path: string, init?: RequestInit): Promise<Response>;\n can(customerId: string, feature: string): Promise<CanResult>;\n}\n\nfunction createClient(apiKey: string, baseUrl: string): NozleClient {\n const base = baseUrl.replace(/\\/+$/, '');\n\n async function apiFetch(path: string, init?: RequestInit): Promise<Response> {\n return fetch(`${base}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n ...init?.headers,\n },\n });\n }\n\n return {\n apiKey,\n baseUrl: base,\n fetch: apiFetch,\n async can(customerId: string, feature: string): Promise<CanResult> {\n const res = await apiFetch(`/api/v1/can?customer_id=${encodeURIComponent(customerId)}&feature=${encodeURIComponent(feature)}`);\n if (!res.ok) return { allowed: false, remaining: null, limit: null, used: 0 };\n return res.json();\n },\n };\n}\n\nexport interface BillingContextValue {\n client: NozleClient | null;\n workspaceId: string;\n centrifugoUrl: string;\n centrifugoToken: string | null;\n}\n\nexport const BillingContext = createContext<BillingContextValue>({\n client: null,\n workspaceId: '',\n centrifugoUrl: '',\n centrifugoToken: null,\n});\n\nexport interface BillingProviderProps {\n apiKey: string;\n baseUrl?: string;\n workspaceId?: string;\n centrifugoUrl?: string;\n children: ReactNode;\n}\n\nexport function BillingProvider({\n apiKey,\n baseUrl = 'https://api.nozle.app',\n workspaceId = '',\n centrifugoUrl,\n children,\n}: BillingProviderProps): React.ReactElement {\n const client = useMemo(() => createClient(apiKey, baseUrl), [apiKey, baseUrl]);\n const [centrifugoToken, setCentrifugoToken] = useState<string | null>(null);\n\n const resolvedCentrifugoUrl =\n centrifugoUrl ??\n (typeof process !== 'undefined' ? (process.env['NEXT_PUBLIC_CENTRIFUGO_URL'] ?? '') : '');\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchCentrifugoToken(): Promise<void> {\n try {\n const response = await client.fetch('/api/v1/auth/centrifugo-token');\n if (!response.ok) return;\n const data = await response.json();\n if (!cancelled && data.token) {\n setCentrifugoToken(data.token);\n }\n } catch {\n // Best-effort: centrifugo is optional for real-time updates\n }\n }\n\n void fetchCentrifugoToken();\n return () => { cancelled = true; };\n }, [client]);\n\n const contextValue: BillingContextValue = {\n client,\n workspaceId,\n centrifugoUrl: resolvedCentrifugoUrl,\n centrifugoToken,\n };\n\n return React.createElement(BillingContext.Provider, { value: contextValue }, children);\n}\n\nexport function useBillingContext(): BillingContextValue {\n return useContext(BillingContext);\n}\n\nexport function useNozleClient(): NozleClient {\n const { client } = useBillingContext();\n if (!client) throw new Error('useNozleClient must be used within <BillingProvider>');\n return client;\n}\n","/**\n * useCan hook — check whether a customer can use a feature.\n * SDK-03: Calls client.can() for initial state, then subscribes to Centrifugo\n * workspace:{id}:entitlements channel for live updates.\n *\n * CONTEXT.md hard requirement: NO setInterval polling — Centrifugo WebSocket only.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { Centrifuge } from \"centrifuge\";\nimport { useBillingContext } from '../provider.js';\n\nexport interface CanState {\n allowed: boolean;\n remaining: number | null;\n limit: number | null;\n loading: boolean;\n error: string | null;\n}\n\nconst initialState: CanState = {\n allowed: false,\n remaining: null,\n limit: null,\n loading: true,\n error: null,\n};\n\ninterface EntitlementPublication {\n customerId?: string;\n customer_id?: string;\n featureKey?: string;\n feature_key?: string;\n allowed?: boolean;\n remaining?: number;\n limit?: number;\n}\n\n/**\n * Check whether a customer is entitled to a feature.\n * Subscribes to Centrifugo workspace:{workspaceId}:entitlements channel for live updates.\n * No polling — WebSocket only per CONTEXT.md locked decision.\n *\n * @param customerId - Customer ID to check entitlement for\n * @param featureKey - Feature key to check\n * @returns CanState with allowed, remaining, limit, loading, error\n */\nexport function useCan(customerId: string, featureKey: string): CanState {\n const { client, workspaceId, centrifugoUrl, centrifugoToken } =\n useBillingContext();\n const [state, setState] = useState<CanState>(initialState);\n\n // Initial entitlement check via client.can()\n useEffect(() => {\n if (!client) {\n setState({\n ...initialState,\n loading: false,\n error: \"No client in context\",\n });\n return;\n }\n\n let cancelled = false;\n setState(initialState);\n\n async function checkEntitlement(): Promise<void> {\n try {\n const result = await client!.can(customerId, featureKey);\n if (!cancelled) {\n setState({\n allowed: result.allowed,\n remaining: result.remaining,\n limit: result.limit,\n loading: false,\n error: result.error ?? null,\n });\n }\n } catch (err: unknown) {\n if (!cancelled) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n setState({\n allowed: false,\n remaining: null,\n limit: null,\n loading: false,\n error: message,\n });\n }\n }\n }\n\n void checkEntitlement();\n\n return () => {\n cancelled = true;\n };\n }, [client, customerId, featureKey]);\n\n // Centrifugo subscription for live updates\n // CONTEXT.md hard requirement: Centrifugo WebSocket only, no setInterval\n useEffect(() => {\n if (!centrifugoToken || !centrifugoUrl || !workspaceId) {\n return;\n }\n\n const cf = new Centrifuge(centrifugoUrl, {\n token: centrifugoToken,\n });\n\n const channel = `workspace:${workspaceId}:entitlements`;\n const sub = cf.newSubscription(channel);\n\n sub.on(\"publication\", (ctx: { data: EntitlementPublication }) => {\n const data = ctx.data;\n // Only update state if this publication is for the same customer+feature\n const pubCustomerId = data.customerId ?? data.customer_id;\n const pubFeatureKey = data.featureKey ?? data.feature_key;\n\n if (pubCustomerId === customerId && pubFeatureKey === featureKey) {\n setState((prev) => ({\n ...prev,\n allowed: data.allowed ?? prev.allowed,\n remaining:\n data.remaining !== undefined ? data.remaining : prev.remaining,\n limit: data.limit !== undefined ? data.limit : prev.limit,\n }));\n }\n });\n\n sub.subscribe();\n cf.connect();\n\n return () => {\n sub.unsubscribe();\n cf.disconnect();\n };\n }, [centrifugoToken, centrifugoUrl, workspaceId, customerId, featureKey]);\n\n return state;\n}\n","/**\n * useUsage hook — fetch usage data for a customer metric.\n * Calls GET /api/v1/usage/:customerId/:metricKey via client's fetch wrapper.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from '../provider.js';\n\nexport interface UsageState {\n value: number | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface UsageResponse {\n value?: number;\n total?: number;\n}\n\n/**\n * Fetch usage for a customer metric.\n *\n * @param customerId - Customer ID to fetch usage for\n * @param metricKey - Metric key to fetch\n * @returns UsageState with value, loading, error\n */\nexport function useUsage(customerId: string, metricKey: string): UsageState {\n const { client } = useBillingContext();\n const [state, setState] = useState<UsageState>({\n value: null,\n loading: true,\n error: null,\n });\n\n useEffect(() => {\n if (!client) {\n setState({ value: null, loading: false, error: \"No client in context\" });\n return;\n }\n\n let cancelled = false;\n\n async function fetchUsage(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/usage/${customerId}/${metricKey}`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n signal: controller.signal,\n },\n );\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as UsageResponse;\n if (!cancelled) {\n setState({\n value: data.value ?? data.total ?? null,\n loading: false,\n error: null,\n });\n }\n } catch (err: unknown) {\n if (!cancelled) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n setState({ value: null, loading: false, error: message });\n }\n }\n }\n\n void fetchUsage();\n\n return () => {\n cancelled = true;\n };\n }, [client, customerId, metricKey]);\n\n return state;\n}\n","/**\n * useCredits hook — fetch credit balance for a customer.\n * Calls GET /api/v1/credits/:customerId/balance via client's fetch wrapper.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from '../provider.js';\n\nexport interface CreditsState {\n balance: number | null;\n loading: boolean;\n error: string | null;\n}\n\ninterface CreditsResponse {\n balance?: number;\n amount?: number;\n}\n\n/**\n * Fetch credit balance for a customer.\n *\n * @param customerId - Customer ID to fetch credit balance for\n * @returns CreditsState with balance, loading, error\n */\nexport function useCredits(customerId: string): CreditsState {\n const { client } = useBillingContext();\n const [state, setState] = useState<CreditsState>({\n balance: null,\n loading: true,\n error: null,\n });\n\n useEffect(() => {\n if (!client) {\n setState({\n balance: null,\n loading: false,\n error: \"No client in context\",\n });\n return;\n }\n\n let cancelled = false;\n\n async function fetchCredits(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/credits/${customerId}/balance`,\n {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n signal: controller.signal,\n },\n );\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as CreditsResponse;\n if (!cancelled) {\n setState({\n balance: data.balance ?? data.amount ?? null,\n loading: false,\n error: null,\n });\n }\n } catch (err: unknown) {\n if (!cancelled) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n setState({ balance: null, loading: false, error: message });\n }\n }\n }\n\n void fetchCredits();\n\n return () => {\n cancelled = true;\n };\n }, [client, customerId]);\n\n return state;\n}\n","/**\n * BillingPortalProvider — Context wrapper for embeddable SDK components.\n * UI-01: Wraps children and exposes a React context with { customerId, apiKey }.\n * Components inside can consume this via the useBillingPortal() hook.\n *\n * Internally renders BillingProvider so all billing hooks work inside.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nexport interface BillingPortalContextValue {\n customerId: string;\n apiKey: string;\n}\n\nconst BillingPortalContext = createContext<BillingPortalContextValue | null>(\n null,\n);\n\nexport function useBillingPortal(): BillingPortalContextValue {\n const ctx = useContext(BillingPortalContext);\n if (!ctx) {\n throw new Error(\n \"useBillingPortal must be used inside BillingPortalProvider\",\n );\n }\n return ctx;\n}\n\nexport interface BillingPortalProviderProps {\n customerId: string;\n apiKey: string;\n children: ReactNode;\n}\n\n/**\n * BillingPortalProvider wraps your embedded billing UI and provides\n * { customerId, apiKey } context to all nested SDK components.\n *\n * Usage:\n * ```tsx\n * <BillingPortalProvider customerId=\"cus_xxx\" apiKey=\"bsr_pk_xxx\">\n * <PricingTable plans={plans} />\n * <FeatureGate feature=\"analytics\" />\n * </BillingPortalProvider>\n * ```\n */\nexport function BillingPortalProvider({\n customerId,\n apiKey,\n children,\n}: BillingPortalProviderProps): React.ReactElement {\n return (\n <BillingPortalContext.Provider value={{ customerId, apiKey }}>\n {children}\n </BillingPortalContext.Provider>\n );\n}\n","/**\n * PlanCard — Individual pricing plan card component.\n * UI-01: Shows plan name, price, interval, features list, and CTA button.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport type { ReactNode } from \"react\";\n\nexport interface Plan {\n id: string;\n name: string;\n monthlyPrice: number;\n annualPrice: number;\n features: string[];\n description?: string;\n}\n\nexport interface PlanCardProps extends Plan {\n isAnnual: boolean;\n isCurrent: boolean;\n onSelect?: () => void;\n children?: ReactNode;\n}\n\n/**\n * PlanCard renders a single pricing plan.\n * Highlighted with aria-current=\"true\" when isCurrent=true.\n */\nexport function PlanCard({\n id,\n name,\n monthlyPrice,\n annualPrice,\n features,\n description,\n isAnnual,\n isCurrent,\n onSelect,\n}: PlanCardProps): React.ReactElement {\n const price = isAnnual ? annualPrice : monthlyPrice;\n const interval = isAnnual ? \"year\" : \"month\";\n\n return (\n <div\n data-testid={`plan-card-${id}`}\n aria-current={isCurrent ? \"true\" : undefined}\n style={{\n background: \"var(--nozle-background, var(--background))\",\n border: isCurrent\n ? \"2px solid var(--nozle-primary, var(--primary))\"\n : \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"1.5rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1rem\",\n }}\n className={isCurrent ? \"border-primary\" : \"\"}\n >\n <div>\n <h3\n style={{\n fontSize: \"1.25rem\",\n fontWeight: 600,\n color: \"var(--nozle-foreground, var(--foreground))\",\n margin: 0,\n }}\n >\n {name}\n </h3>\n {description && (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n margin: \"0.25rem 0 0\",\n }}\n >\n {description}\n </p>\n )}\n </div>\n\n <div>\n <span\n style={{\n fontSize: \"2rem\",\n fontWeight: 700,\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n ${price}\n </span>\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n marginLeft: \"0.25rem\",\n }}\n >\n /{interval}\n </span>\n </div>\n\n <ul\n style={{\n listStyle: \"none\",\n padding: 0,\n margin: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n flex: 1,\n }}\n >\n {features.map((feature) => (\n <li\n key={feature}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n <span\n style={{ color: \"var(--nozle-primary, var(--primary))\" }}\n aria-hidden=\"true\"\n >\n ✓\n </span>\n {feature}\n </li>\n ))}\n </ul>\n\n {onSelect && (\n <button\n onClick={onSelect}\n style={{\n background: isCurrent\n ? \"var(--nozle-muted, var(--muted))\"\n : \"var(--nozle-primary, var(--primary))\",\n color: isCurrent\n ? \"var(--nozle-muted-foreground, var(--muted-foreground))\"\n : \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n border: \"none\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"0.75rem 1.5rem\",\n cursor: isCurrent ? \"default\" : \"pointer\",\n fontWeight: 500,\n width: \"100%\",\n }}\n disabled={isCurrent}\n aria-label={isCurrent ? `Current plan: ${name}` : `Select ${name}`}\n >\n {isCurrent ? \"Current Plan\" : \"Get Started\"}\n </button>\n )}\n </div>\n );\n}\n","/**\n * PricingTable — Renders plan cards with monthly/annual toggle.\n * UI-01: Responsive grid, monthly/annual toggle, highlights currentPlanId.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { useState } from \"react\";\nimport { PlanCard, type Plan } from \"./PlanCard.js\";\n\nexport interface PricingTableProps {\n plans: Plan[];\n currentPlanId?: string;\n onSelect?: (planId: string) => void;\n}\n\n/**\n * PricingTable renders plan cards in a responsive grid with monthly/annual toggle.\n * The current plan is highlighted with aria-current=\"true\" and border-primary class.\n *\n * Usage:\n * ```tsx\n * <PricingTable\n * plans={plans}\n * currentPlanId=\"pro\"\n * onSelect={(planId) => handleUpgrade(planId)}\n * />\n * ```\n */\nexport function PricingTable({\n plans,\n currentPlanId,\n onSelect,\n}: PricingTableProps): React.ReactElement {\n const [isAnnual, setIsAnnual] = useState(false);\n\n return (\n <div\n style={{\n background: \"var(--nozle-background, var(--background))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {/* Monthly / Annual toggle */}\n <div\n style={{\n display: \"flex\",\n gap: \"0.5rem\",\n justifyContent: \"center\",\n marginBottom: \"1.5rem\",\n }}\n >\n <button\n onClick={() => setIsAnnual(false)}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background: !isAnnual\n ? \"var(--nozle-primary, var(--primary))\"\n : \"transparent\",\n color: !isAnnual\n ? \"var(--nozle-primary-foreground, var(--primary-foreground))\"\n : \"var(--nozle-foreground, var(--foreground))\",\n cursor: \"pointer\",\n fontWeight: !isAnnual ? 600 : 400,\n }}\n aria-pressed={!isAnnual}\n >\n Monthly\n </button>\n <button\n onClick={() => setIsAnnual(true)}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background: isAnnual\n ? \"var(--nozle-primary, var(--primary))\"\n : \"transparent\",\n color: isAnnual\n ? \"var(--nozle-primary-foreground, var(--primary-foreground))\"\n : \"var(--nozle-foreground, var(--foreground))\",\n cursor: \"pointer\",\n fontWeight: isAnnual ? 600 : 400,\n }}\n aria-pressed={isAnnual}\n >\n Annual\n </button>\n </div>\n\n {/* Plan cards grid */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: `repeat(${Math.min(plans.length, 3)}, 1fr)`,\n gap: \"1rem\",\n }}\n >\n {plans.map((plan) => (\n <PlanCard\n key={plan.id}\n {...plan}\n isAnnual={isAnnual}\n isCurrent={plan.id === currentPlanId}\n onSelect={onSelect ? () => onSelect(plan.id) : undefined}\n />\n ))}\n </div>\n </div>\n );\n}\n","/**\n * PlanComparison — Side-by-side feature comparison table.\n * UI-01: Renders shadcn-style table with plan names as headers and features as rows.\n * Check/cross icons for boolean values. Uses CSS variable theming.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport type { Plan } from \"./PlanCard.js\";\n\nexport interface ComparisonFeature {\n key: string;\n label: string;\n values: Record<string, string | boolean>;\n}\n\nexport interface PlanComparisonProps {\n plans: Plan[];\n features: ComparisonFeature[];\n}\n\n/**\n * PlanComparison renders a side-by-side feature comparison table.\n *\n * Usage:\n * ```tsx\n * <PlanComparison\n * plans={plans}\n * features={[\n * { key: 'api_calls', label: 'API Calls', values: { starter: '10K', pro: '100K' } },\n * { key: 'analytics', label: 'Analytics', values: { starter: false, pro: true } },\n * ]}\n * />\n * ```\n */\nexport function PlanComparison({\n plans,\n features,\n}: PlanComparisonProps): React.ReactElement {\n return (\n <div\n style={{\n overflowX: \"auto\",\n background: \"var(--nozle-background, var(--background))\",\n }}\n >\n <table\n style={{\n width: \"100%\",\n borderCollapse: \"collapse\",\n fontSize: \"0.875rem\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n <thead>\n <tr>\n <th\n style={{\n padding: \"0.75rem 1rem\",\n textAlign: \"left\",\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontWeight: 500,\n }}\n >\n Feature\n </th>\n {plans.map((plan) => (\n <th\n key={plan.id}\n style={{\n padding: \"0.75rem 1rem\",\n textAlign: \"center\",\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontWeight: 600,\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {plan.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {features.map((feature) => (\n <tr key={feature.key}>\n <td\n style={{\n padding: \"0.75rem 1rem\",\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {feature.label}\n </td>\n {plans.map((plan) => {\n const value = feature.values[plan.id];\n return (\n <td\n key={plan.id}\n style={{\n padding: \"0.75rem 1rem\",\n textAlign: \"center\",\n borderBottom:\n \"1px solid var(--nozle-border, var(--border))\",\n }}\n >\n {typeof value === \"boolean\" ? (\n value ? (\n <span\n style={{\n color: \"var(--nozle-primary, var(--primary))\",\n }}\n aria-label=\"Included\"\n >\n ✓\n </span>\n ) : (\n <span\n style={{\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n aria-label=\"Not included\"\n >\n ✕\n </span>\n )\n ) : (\n <span>{value ?? \"—\"}</span>\n )}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","/**\n * CheckoutButton — Initiates checkout for a plan.\n * UI-02: Calls POST /api/v1/checkout, detects processor type from the response,\n * and branches to the appropriate payment flow:\n * - Stripe hosted checkout: redirect to url\n * - Stripe embedded Elements: emit clientSecret via onStripeClientSecret callback\n * - Razorpay: inject Razorpay.js and open the checkout modal\n * - Legacy (no type): redirect to url for backwards compatibility\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { useState } from \"react\";\nimport { useBillingPortal } from \"./BillingPortalProvider.js\";\n\nexport interface CheckoutButtonProps {\n planId: string;\n label?: string;\n apiBaseUrl?: string;\n className?: string;\n style?: React.CSSProperties;\n onError?: (error: Error) => void;\n /** Required for Razorpay checkout path — the Razorpay publishable key (key_id). */\n razorpayKeyId?: string;\n /** Called with the Stripe Payment Intent / Checkout Session client secret\n * when the BFF returns type:'stripe' without a hosted url.\n * The host app is responsible for mounting Stripe Elements. */\n onStripeClientSecret?: (clientSecret: string) => void;\n /** Called with the Razorpay payment ID after a successful Razorpay payment. */\n onSuccess?: (paymentId: string) => void;\n}\n\ninterface RazorpayOptions {\n key: string;\n order_id: string;\n name?: string;\n description?: string;\n handler: (response: { razorpay_payment_id: string }) => void;\n modal?: { ondismiss?: () => void };\n}\n\ndeclare global {\n interface Window {\n Razorpay: new (opts: RazorpayOptions) => { open(): void };\n }\n}\n\ntype CheckoutResponse =\n | { type: \"stripe\"; url: string; clientSecret?: string }\n | { type: \"stripe\"; clientSecret: string; url?: string }\n | { type: \"razorpay\"; orderId: string }\n | { url: string }; // legacy — no type field\n\n/**\n * Injects the Razorpay checkout.js script once, then resolves.\n * If the script is already present, resolves immediately.\n */\nfunction loadRazorpayScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (document.getElementById(\"razorpay-js\")) {\n resolve();\n return;\n }\n const script = document.createElement(\"script\");\n script.id = \"razorpay-js\";\n script.src = \"https://checkout.razorpay.com/v1/checkout.js\";\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"Failed to load Razorpay.js\"));\n document.body.appendChild(script);\n });\n}\n\n/**\n * CheckoutButton initiates a checkout session and routes to the appropriate\n * payment processor path.\n *\n * Must be used inside a BillingPortalProvider.\n */\nexport function CheckoutButton({\n planId,\n label = \"Get Started\",\n apiBaseUrl = \"https://api.nozle.app\",\n className,\n style,\n onError,\n razorpayKeyId,\n onStripeClientSecret,\n onSuccess,\n}: CheckoutButtonProps): React.ReactElement {\n const { customerId, apiKey } = useBillingPortal();\n const [loading, setLoading] = useState(false);\n\n async function handleClick(): Promise<void> {\n setLoading(true);\n try {\n const response = await fetch(`${apiBaseUrl}/api/v1/checkout`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ planId, customerId }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: Checkout failed`);\n }\n\n const data = (await response.json()) as CheckoutResponse;\n\n if (\"type\" in data && data.type === \"razorpay\") {\n // Razorpay checkout path\n if (!razorpayKeyId) {\n onError?.(\n new Error(\"razorpayKeyId prop required for Razorpay checkout\"),\n );\n return;\n }\n await loadRazorpayScript();\n const rzp = new window.Razorpay({\n key: razorpayKeyId,\n order_id: data.orderId,\n handler: (r) => {\n onSuccess?.(r.razorpay_payment_id);\n },\n modal: {\n ondismiss: () => setLoading(false),\n },\n });\n rzp.open();\n } else if (\"type\" in data && data.type === \"stripe\") {\n // Stripe checkout path\n if (data.url) {\n window.location.href = data.url;\n } else if (data.clientSecret) {\n onStripeClientSecret?.(data.clientSecret);\n } else {\n onError?.(\n new Error(\"Stripe checkout: no url or clientSecret in response\"),\n );\n }\n } else if (\"url\" in data && data.url) {\n // Legacy path — plain url redirect\n window.location.href = data.url;\n } else {\n onError?.(new Error(\"Unknown checkout response format\"));\n }\n } catch (err: unknown) {\n const error = err instanceof Error ? err : new Error(\"Checkout failed\");\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <button\n onClick={() => void handleClick()}\n disabled={loading}\n className={className}\n style={{\n padding: \"0.75rem 1.5rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: loading ? \"not-allowed\" : \"pointer\",\n fontWeight: 500,\n opacity: loading ? 0.7 : 1,\n ...style,\n }}\n aria-busy={loading}\n >\n {loading ? \"Loading...\" : label}\n </button>\n );\n}\n","'use client';\n\nimport React, { createContext, useContext, useMemo, useState } from 'react';\nimport { Elements, PaymentElement, useStripe, useElements } from '@stripe/react-stripe-js';\nimport { loadStripe } from '@stripe/stripe-js';\nimport type { Appearance, StripeElementsOptions } from '@stripe/stripe-js';\n\n// ── Public interfaces ────────────────────────────────────────────────────────\n\nexport interface CheckoutProps {\n /** Stripe PaymentIntent client secret */\n clientSecret: string;\n /** Stripe publishable key */\n publishableKey: string;\n /** Optional Stripe Connect account ID */\n stripeAccount?: string;\n /** Custom label for the submit button (default: \"Pay now\") */\n submitLabel?: string;\n /** Called with the paymentIntentId when payment succeeds without redirect */\n onSuccess?: (paymentIntentId: string) => void;\n /** Called with the error when payment fails */\n onError?: (error: Error) => void;\n /** Called when the PaymentElement becomes interactive */\n onReady?: () => void;\n /** Additional CSS class for the outer wrapper */\n className?: string;\n /** Inline styles for the outer wrapper */\n style?: React.CSSProperties;\n}\n\nexport interface UseCheckoutResult {\n /** Trigger payment confirmation programmatically */\n confirmPayment: () => Promise<void>;\n /** True while a payment confirmation is in-flight */\n isProcessing: boolean;\n /** Last payment error, or null if no error */\n error: Error | null;\n}\n\n// ── Internal context ──────────────────────────────────────────────────────────\n\ninterface CheckoutContextValue {\n confirmPayment: () => Promise<void>;\n isProcessing: boolean;\n error: Error | null;\n}\n\nconst CheckoutContext = createContext<CheckoutContextValue | null>(null);\n\n// ── Public hook ───────────────────────────────────────────────────────────────\n\nexport function useCheckout(): UseCheckoutResult {\n const ctx = useContext(CheckoutContext);\n if (ctx === null) {\n throw new Error('useCheckout must be used inside a <Checkout> component');\n }\n return ctx;\n}\n\n// ── Stripe appearance builder ─────────────────────────────────────────────────\n\nfunction buildStripeAppearance(): Appearance {\n if (typeof document === 'undefined') {\n return { theme: 'stripe' };\n }\n\n const style = getComputedStyle(document.documentElement);\n const get = (prop: string, fallback: string) => style.getPropertyValue(prop).trim() || fallback;\n\n return {\n theme: 'stripe',\n variables: {\n colorPrimary: get('--nozle-primary', '#16a34a'),\n colorBackground: get('--nozle-background', '#f8fafc'),\n colorText: get('--nozle-foreground', '#1e293b'),\n colorDanger: get('--nozle-destructive', '#dc2626'),\n borderRadius: get('--nozle-radius', '0.5rem'),\n fontFamily: 'inherit',\n },\n };\n}\n\n// ── Inner form component ──────────────────────────────────────────────────────\n\ntype CheckoutInnerProps = Pick<\n CheckoutProps,\n 'submitLabel' | 'onSuccess' | 'onError' | 'onReady' | 'className' | 'style'\n>;\n\nfunction CheckoutInner({\n submitLabel,\n onSuccess,\n onError,\n onReady,\n className,\n style,\n}: CheckoutInnerProps) {\n const stripe = useStripe();\n const elements = useElements();\n\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [isReady, setIsReady] = useState(false);\n\n async function confirmPayment(): Promise<void> {\n if (!stripe || !elements) return;\n\n setIsProcessing(true);\n setError(null);\n\n const result = await stripe.confirmPayment({\n elements,\n confirmParams: { return_url: window.location.href },\n redirect: 'if_required',\n });\n\n setIsProcessing(false);\n\n if (result.error) {\n const err = new Error(result.error.message ?? 'Payment failed');\n setError(err);\n onError?.(err);\n } else if (result.paymentIntent?.status === 'succeeded') {\n onSuccess?.(result.paymentIntent.id);\n }\n }\n\n return (\n <CheckoutContext.Provider value={{ confirmPayment, isProcessing, error }}>\n <div className={className} style={style}>\n <style>{`@keyframes nozle-skeleton-pulse { 0%{background-position:200% 0} 100%{background-position:-200% 0} }`}</style>\n\n {!isReady && (\n <div\n data-testid=\"checkout-skeleton\"\n style={{\n height: '200px',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n background: 'linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%)',\n backgroundSize: '200% 100%',\n animation: 'nozle-skeleton-pulse 1.5s ease-in-out infinite',\n }}\n />\n )}\n\n <PaymentElement\n onReady={() => {\n setIsReady(true);\n onReady?.();\n }}\n />\n\n {error !== null && (\n <p style={{ color: 'var(--nozle-destructive, #dc2626)', margin: '0.5rem 0 0' }}>\n {error.message}\n </p>\n )}\n\n <button\n type=\"button\"\n onClick={() => void confirmPayment()}\n disabled={isProcessing || !stripe}\n aria-busy={isProcessing}\n style={{\n padding: '0.75rem 1.5rem',\n borderRadius: 'var(--nozle-radius, 0.5rem)',\n border: 'none',\n background: 'var(--nozle-primary, var(--primary))',\n color: 'var(--nozle-primary-foreground, var(--primary-foreground))',\n cursor: isProcessing ? 'not-allowed' : 'pointer',\n fontWeight: 500,\n opacity: isProcessing ? 0.7 : 1,\n marginTop: '1rem',\n width: '100%',\n }}\n >\n {isProcessing ? 'Processing...' : (submitLabel ?? 'Pay now')}\n </button>\n </div>\n </CheckoutContext.Provider>\n );\n}\n\n// ── Public Checkout component ─────────────────────────────────────────────────\n\nexport function Checkout({\n clientSecret,\n publishableKey,\n stripeAccount,\n submitLabel,\n onSuccess,\n onError,\n onReady,\n className,\n style,\n}: CheckoutProps) {\n const stripePromise = useMemo(\n () => loadStripe(publishableKey, stripeAccount ? { stripeAccount } : undefined),\n [publishableKey, stripeAccount]\n );\n\n const appearance = useMemo(() => buildStripeAppearance(), []);\n\n const options: StripeElementsOptions = { clientSecret, appearance };\n\n return (\n <Elements key={clientSecret} stripe={stripePromise} options={options}>\n <CheckoutInner\n submitLabel={submitLabel}\n onSuccess={onSuccess}\n onError={onError}\n onReady={onReady}\n className={className}\n style={style}\n />\n </Elements>\n );\n}\n","/**\n * UpgradeModal — Shows live proration preview before confirming plan upgrade.\n * UI-02: Fetches proration preview from POST /api/v1/subscriptions/preview.\n * Shows credit, debit, net, and next billing date before confirming.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { useState, useEffect } from \"react\";\n\nexport interface ProrationPreview {\n credit: number;\n debit: number;\n net: number;\n nextBillingDate: string;\n}\n\nexport interface UpgradeModalProps {\n isOpen: boolean;\n targetPlanId: string;\n customerId: string;\n apiBaseUrl?: string;\n apiKey?: string;\n onConfirm?: () => void;\n onCancel?: () => void;\n}\n\n/**\n * UpgradeModal shows proration preview from POST /api/v1/subscriptions/preview\n * before the customer confirms a plan upgrade.\n */\nexport function UpgradeModal({\n isOpen,\n targetPlanId,\n customerId,\n apiBaseUrl = \"https://api.nozle.app\",\n apiKey = \"\",\n onConfirm,\n onCancel,\n}: UpgradeModalProps): React.ReactElement | null {\n const [preview, setPreview] = useState<ProrationPreview | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [confirming, setConfirming] = useState(false);\n\n useEffect(() => {\n if (!isOpen || !targetPlanId || !customerId) {\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n setPreview(null);\n\n async function fetchPreview(): Promise<void> {\n try {\n const response = await fetch(\n `${apiBaseUrl}/api/v1/subscriptions/preview`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ targetPlanId, customerId }),\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `HTTP ${response.status}: Failed to load proration preview`,\n );\n }\n\n const data = (await response.json()) as ProrationPreview;\n if (!cancelled) {\n setPreview(data);\n }\n } catch (err: unknown) {\n if (!cancelled) {\n const message =\n err instanceof Error ? err.message : \"Failed to load preview\";\n setError(message);\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n }\n\n void fetchPreview();\n\n return () => {\n cancelled = true;\n };\n }, [isOpen, targetPlanId, customerId, apiBaseUrl, apiKey]);\n\n async function handleConfirm(): Promise<void> {\n setConfirming(true);\n try {\n const response = await fetch(\n `${apiBaseUrl}/api/v1/subscriptions/change`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ targetPlanId, customerId }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: Upgrade failed`);\n }\n\n onConfirm?.();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : \"Upgrade failed\";\n setError(message);\n } finally {\n setConfirming(false);\n }\n }\n\n if (!isOpen) {\n return null;\n }\n\n const overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"oklch(0 0 0 / 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n };\n\n const modalStyle: React.CSSProperties = {\n background: \"var(--nozle-background, var(--background))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"2rem\",\n maxWidth: \"28rem\",\n width: \"100%\",\n boxShadow: \"var(--nozle-shadow, 0 4px 6px -1px rgb(0 0 0 / 0.1))\",\n };\n\n return (\n <div\n style={overlayStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Upgrade plan\"\n >\n <div style={modalStyle}>\n <h2\n style={{ fontSize: \"1.25rem\", fontWeight: 600, margin: \"0 0 1rem\" }}\n >\n Confirm Plan Upgrade\n </h2>\n\n {loading && (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n Loading proration preview...\n </p>\n )}\n\n {error && (\n <p style={{ color: \"oklch(0.6 0.2 25)\", marginBottom: \"1rem\" }}>\n {error}\n </p>\n )}\n\n {preview && !loading && (\n <div style={{ marginBottom: \"1.5rem\" }}>\n <div\n style={{\n background: \"var(--nozle-muted, var(--muted))\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"1rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n }}\n >\n {preview.credit > 0 && (\n <div\n style={{ display: \"flex\", justifyContent: \"space-between\" }}\n >\n <span>Credit from current plan</span>\n <span style={{ color: \"oklch(0.6 0.15 150)\" }}>\n -${preview.credit.toFixed(2)}\n </span>\n </div>\n )}\n <div style={{ display: \"flex\", justifyContent: \"space-between\" }}>\n <span>New plan charge</span>\n <span>${preview.debit.toFixed(2)}</span>\n </div>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n fontWeight: 600,\n borderTop: \"1px solid var(--nozle-border, var(--border))\",\n paddingTop: \"0.5rem\",\n marginTop: \"0.25rem\",\n }}\n >\n <span>You'll be charged today</span>\n <span>${preview.net.toFixed(2)}</span>\n </div>\n </div>\n <p\n style={{\n fontSize: \"0.875rem\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n marginTop: \"0.75rem\",\n }}\n >\n Your next billing date is{\" \"}\n {new Date(preview.nextBillingDate).toLocaleDateString()}.\n </p>\n </div>\n )}\n\n <div\n style={{\n display: \"flex\",\n gap: \"0.75rem\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={onCancel}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background: \"transparent\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n cursor: \"pointer\",\n }}\n disabled={confirming}\n >\n Cancel\n </button>\n <button\n onClick={() => void handleConfirm()}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color:\n \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: confirming || loading ? \"not-allowed\" : \"pointer\",\n fontWeight: 500,\n opacity: confirming || loading ? 0.7 : 1,\n }}\n disabled={confirming || loading || !!error}\n >\n {confirming ? \"Upgrading...\" : \"Confirm Upgrade\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * UpgradeButton — Opens UpgradeModal on click.\n * UI-02: Triggers plan upgrade flow with proration preview.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { useState } from \"react\";\nimport { UpgradeModal } from \"./UpgradeModal.js\";\nimport { useBillingPortal } from \"./BillingPortalProvider.js\";\n\nexport interface UpgradeButtonProps {\n targetPlanId: string;\n label?: string;\n apiBaseUrl?: string;\n className?: string;\n style?: React.CSSProperties;\n onUpgraded?: () => void;\n}\n\n/**\n * UpgradeButton opens an UpgradeModal with live proration preview.\n * Must be used inside a BillingPortalProvider.\n */\nexport function UpgradeButton({\n targetPlanId,\n label = \"Upgrade\",\n apiBaseUrl = \"https://api.nozle.app\",\n className,\n style,\n onUpgraded,\n}: UpgradeButtonProps): React.ReactElement {\n const { customerId, apiKey } = useBillingPortal();\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <>\n <button\n onClick={() => setIsOpen(true)}\n className={className}\n style={{\n padding: \"0.75rem 1.5rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: \"pointer\",\n fontWeight: 500,\n ...style,\n }}\n >\n {label}\n </button>\n\n <UpgradeModal\n isOpen={isOpen}\n targetPlanId={targetPlanId}\n customerId={customerId}\n apiBaseUrl={apiBaseUrl}\n apiKey={apiKey}\n onConfirm={() => {\n setIsOpen(false);\n onUpgraded?.();\n }}\n onCancel={() => setIsOpen(false)}\n />\n </>\n );\n}\n","/**\n * CreditTopUpButton — Opens a dialog for purchasing credits.\n * UI-02: Allows customers to top up their credit balance.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\nimport React from \"react\";\n\nimport { useState } from \"react\";\nimport { useBillingPortal } from \"./BillingPortalProvider.js\";\n\nconst PRESET_AMOUNTS = [10, 25, 50, 100, 250];\n\nexport interface CreditTopUpButtonProps {\n label?: string;\n apiBaseUrl?: string;\n className?: string;\n style?: React.CSSProperties;\n onSuccess?: (amount: number) => void;\n onError?: (error: Error) => void;\n}\n\n/**\n * CreditTopUpButton opens a dialog to purchase credits.\n * Must be used inside a BillingPortalProvider.\n */\nexport function CreditTopUpButton({\n label = \"Add Credits\",\n apiBaseUrl = \"https://api.nozle.app\",\n className,\n style,\n onSuccess,\n onError,\n}: CreditTopUpButtonProps): React.ReactElement {\n const { customerId, apiKey } = useBillingPortal();\n const [isOpen, setIsOpen] = useState(false);\n const [selectedAmount, setSelectedAmount] = useState<number>(25);\n const [customAmount, setCustomAmount] = useState<string>(\"\");\n const [useCustom, setUseCustom] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const finalAmount = useCustom\n ? parseFloat(customAmount) || 0\n : selectedAmount;\n\n async function handlePurchase(): Promise<void> {\n if (finalAmount <= 0) {\n setError(\"Please enter a valid amount\");\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetch(`${apiBaseUrl}/api/v1/credits/purchase`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ customerId, amount: finalAmount }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: Credit purchase failed`);\n }\n\n setIsOpen(false);\n onSuccess?.(finalAmount);\n } catch (err: unknown) {\n const purchaseError =\n err instanceof Error ? err : new Error(\"Credit purchase failed\");\n setError(purchaseError.message);\n onError?.(purchaseError);\n } finally {\n setLoading(false);\n }\n }\n\n const overlayStyle: React.CSSProperties = {\n position: \"fixed\",\n inset: 0,\n background: \"oklch(0 0 0 / 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 1000,\n };\n\n const dialogStyle: React.CSSProperties = {\n background: \"var(--nozle-background, var(--background))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n padding: \"2rem\",\n maxWidth: \"24rem\",\n width: \"100%\",\n };\n\n return (\n <>\n <button\n onClick={() => setIsOpen(true)}\n className={className}\n style={{\n padding: \"0.75rem 1.5rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: \"pointer\",\n fontWeight: 500,\n ...style,\n }}\n >\n {label}\n </button>\n\n {isOpen && (\n <div\n style={overlayStyle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Add credits\"\n >\n <div style={dialogStyle}>\n <h2\n style={{\n fontSize: \"1.25rem\",\n fontWeight: 600,\n margin: \"0 0 1.25rem\",\n }}\n >\n Add Credits\n </h2>\n\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n marginBottom: \"1rem\",\n }}\n >\n {PRESET_AMOUNTS.map((amount) => (\n <button\n key={amount}\n onClick={() => {\n setUseCustom(false);\n setSelectedAmount(amount);\n }}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background:\n !useCustom && selectedAmount === amount\n ? \"var(--nozle-primary, var(--primary))\"\n : \"transparent\",\n color:\n !useCustom && selectedAmount === amount\n ? \"var(--nozle-primary-foreground, var(--primary-foreground))\"\n : \"var(--nozle-foreground, var(--foreground))\",\n cursor: \"pointer\",\n }}\n aria-pressed={!useCustom && selectedAmount === amount}\n >\n ${amount}\n </button>\n ))}\n </div>\n\n <div style={{ marginBottom: \"1.25rem\" }}>\n <label\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n marginBottom: \"0.5rem\",\n fontSize: \"0.875rem\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n <input\n type=\"checkbox\"\n checked={useCustom}\n onChange={(e) => setUseCustom(e.target.checked)}\n />\n Custom amount\n </label>\n {useCustom && (\n <input\n type=\"number\"\n value={customAmount}\n onChange={(e) => setCustomAmount(e.target.value)}\n placeholder=\"Enter amount\"\n min={1}\n style={{\n width: \"100%\",\n padding: \"0.5rem 0.75rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background: \"var(--nozle-background, var(--background))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n boxSizing: \"border-box\",\n }}\n />\n )}\n </div>\n\n {error && (\n <p\n style={{\n color: \"oklch(0.6 0.2 25)\",\n marginBottom: \"1rem\",\n fontSize: \"0.875rem\",\n }}\n >\n {error}\n </p>\n )}\n\n <div\n style={{\n display: \"flex\",\n gap: \"0.75rem\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={() => setIsOpen(false)}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n background: \"transparent\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n cursor: \"pointer\",\n }}\n disabled={loading}\n >\n Cancel\n </button>\n <button\n onClick={() => void handlePurchase()}\n style={{\n padding: \"0.5rem 1rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color:\n \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: loading ? \"not-allowed\" : \"pointer\",\n fontWeight: 500,\n opacity: loading ? 0.7 : 1,\n }}\n disabled={loading || finalAmount <= 0}\n >\n {loading ? \"Processing...\" : `Add $${finalAmount}`}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n","/**\n * FeatureGate — Renders children if customer has access to a feature.\n * UI-03: Uses useCan hook; renders fallback when allowed=false.\n * Renders null while loading to avoid layout shift.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\nimport { useCan } from '../../hooks/use-can.js';\n\nexport interface FeatureGateProps {\n /** Customer ID to check entitlement for */\n customerId: string;\n /** Feature key to check */\n feature: string;\n /** Rendered when customer does not have access. Defaults to null. */\n fallback?: ReactNode;\n /** Content to show when customer has access */\n children: ReactNode;\n}\n\n/**\n * FeatureGate renders children only when the customer is entitled to the feature.\n * Returns null while the entitlement check is loading.\n *\n * Usage:\n * ```tsx\n * <FeatureGate customerId=\"cus_123\" feature=\"analytics\" fallback={<UpgradePrompt />}>\n * <AnalyticsDashboard />\n * </FeatureGate>\n * ```\n */\nexport function FeatureGate({\n customerId,\n feature,\n fallback = null,\n children,\n}: FeatureGateProps): React.ReactElement | null {\n const { allowed, loading } = useCan(customerId, feature);\n\n if (loading) {\n return null;\n }\n\n if (!allowed) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n","/**\n * UsageGate — Renders children if usage is below limit.\n * UI-03: Renders fallback when usage >= limit.\n * Pure render logic — caller provides usage and limit values.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\n\nexport interface UsageGateProps {\n /** Current usage value */\n usage: number;\n /** Usage limit */\n limit: number;\n /** Rendered when usage is at or above limit. Defaults to null. */\n fallback?: ReactNode;\n /** Content to show when usage is below limit */\n children: ReactNode;\n}\n\n/**\n * UsageGate renders children only when current usage is below the limit.\n * When usage >= limit, renders fallback.\n *\n * Usage:\n * ```tsx\n * <UsageGate usage={currentUsage} limit={plan.apiCallLimit} fallback={<UpgradePrompt />}>\n * <ApiCallButton />\n * </UsageGate>\n * ```\n */\nexport function UsageGate({\n usage,\n limit,\n fallback = null,\n children,\n}: UsageGateProps): React.ReactElement {\n if (usage >= limit) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n","/**\n * PlanGate — Renders children if customer's plan is in the allowed list.\n * UI-03: Pure render logic — caller provides currentPlan and allowedPlans.\n * Renders fallback when customer is not on an allowed plan tier.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\n\nexport interface PlanGateProps {\n /** The customer's current plan identifier */\n currentPlan: string;\n /** List of plan identifiers that are allowed to see the children */\n allowedPlans: string[];\n /** Rendered when customer is not on an allowed plan. Defaults to null. */\n fallback?: ReactNode;\n /** Content to show when customer is on an allowed plan */\n children: ReactNode;\n}\n\n/**\n * PlanGate renders children only when the customer's currentPlan is in allowedPlans.\n * When not on an allowed plan, renders fallback.\n *\n * Usage:\n * ```tsx\n * <PlanGate\n * currentPlan={customer.plan}\n * allowedPlans={['pro', 'enterprise']}\n * fallback={<UpgradePrompt planName=\"Pro\" />}\n * >\n * <ProFeature />\n * </PlanGate>\n * ```\n */\nexport function PlanGate({\n currentPlan,\n allowedPlans,\n fallback = null,\n children,\n}: PlanGateProps): React.ReactElement {\n if (!allowedPlans.includes(currentPlan)) {\n return <>{fallback}</>;\n }\n\n return <>{children}</>;\n}\n","/**\n * UpgradePrompt — Reusable upgrade message component.\n * UI-03: Shows plan name + upgrade button; used as default fallback for LockedOverlay.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\n\nimport React from \"react\";\n\nexport interface UpgradePromptProps {\n text?: string;\n planName?: string;\n onUpgrade?: () => void;\n}\n\n/**\n * UpgradePrompt renders an upgrade call-to-action with a message and button.\n * Used as default fallback in LockedOverlay and gate components.\n */\nexport function UpgradePrompt({\n text = \"Upgrade to access this feature\",\n planName,\n onUpgrade,\n}: UpgradePromptProps): React.ReactElement {\n const displayText = planName\n ? `Upgrade to ${planName} to access this feature`\n : text;\n\n function handleUpgrade(): void {\n if (onUpgrade) {\n onUpgrade();\n } else {\n window.location.href = \"/upgrade\";\n }\n }\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"1rem\",\n textAlign: \"center\",\n }}\n >\n <p\n style={{\n color: \"var(--nozle-foreground, var(--foreground))\",\n fontSize: \"0.875rem\",\n margin: 0,\n }}\n >\n {displayText}\n </p>\n <button\n onClick={handleUpgrade}\n style={{\n padding: \"0.5rem 1.25rem\",\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n border: \"none\",\n background: \"var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary-foreground, var(--primary-foreground))\",\n cursor: \"pointer\",\n fontWeight: 500,\n fontSize: \"0.875rem\",\n }}\n >\n Upgrade\n </button>\n </div>\n );\n}\n","/**\n * LockedOverlay — Wraps children with a blur filter + upgrade CTA overlay when locked.\n * UI-03: Applies CSS blur(4px) to children with an upgrade prompt overlay.\n * Uses CSS variable theming with --nozle-* namespace.\n */\n\n\"use client\";\n\nimport React, { type ReactNode } from \"react\";\nimport { UpgradePrompt } from \"./UpgradePrompt.js\";\n\nexport interface LockedOverlayProps {\n /** Whether to apply the locked blur + overlay state */\n locked: boolean;\n /** Text to show in the upgrade prompt */\n upgradeText?: string;\n /** Plan name to show in the upgrade prompt */\n upgradePlanName?: string;\n /** Called when the upgrade button is clicked */\n onUpgrade?: () => void;\n /** Content to blur when locked */\n children: ReactNode;\n}\n\n/**\n * LockedOverlay wraps children in a relative container.\n * When locked=true:\n * - Children receive CSS blur(4px) and pointer-events: none\n * - An upgrade CTA overlay is positioned on top\n *\n * When locked=false, children render normally without any overlay.\n *\n * Usage:\n * ```tsx\n * <LockedOverlay locked={!canAccessFeature} upgradeText=\"Upgrade to Pro\" onUpgrade={openUpgradeModal}>\n * <FeatureContent />\n * </LockedOverlay>\n * ```\n */\nexport function LockedOverlay({\n locked,\n upgradeText,\n upgradePlanName,\n onUpgrade,\n children,\n}: LockedOverlayProps): React.ReactElement {\n if (!locked) {\n return <>{children}</>;\n }\n\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }}>\n {/* Blurred content — inaccessible to users */}\n <div\n style={{\n filter: \"blur(4px)\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n }}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n\n {/* Upgrade CTA overlay */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"var(--nozle-background, var(--background))\",\n opacity: 0.92,\n borderRadius: \"var(--nozle-radius, 0.5rem)\",\n }}\n role=\"dialog\"\n aria-label=\"Feature locked — upgrade required\"\n >\n <UpgradePrompt\n text={upgradeText}\n planName={upgradePlanName}\n onUpgrade={onUpgrade}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * UsageMeter — embeddable usage progress bar with automatic color thresholds.\n * Uses --nozle-* CSS variables for theming (customer-facing portal layer).\n *\n * Color thresholds:\n * < 80% → primary (normal)\n * 80-94% → warning (amber)\n * ≥ 95% → destructive (red)\n */\n\nexport function getUsageMeterColor(percentage: number): string {\n if (percentage >= 95) return \"var(--nozle-destructive, var(--destructive))\";\n if (percentage >= 80) return \"var(--nozle-warning, var(--warning))\";\n return \"var(--nozle-primary, var(--primary))\";\n}\n\nexport interface UsageMeterProps {\n used: number;\n limit: number;\n label?: string;\n showText?: boolean;\n}\n\nexport function UsageMeter({\n used,\n limit,\n label,\n showText = true,\n}: UsageMeterProps) {\n const percentage = limit > 0 ? Math.min(100, (used / limit) * 100) : 0;\n const color = getUsageMeterColor(percentage);\n\n return (\n <div className=\"w-full space-y-1\">\n {label && (\n <div className=\"flex justify-between text-sm\">\n <span>{label}</span>\n {showText && (\n <span style={{ color }}>\n {used.toLocaleString()} / {limit.toLocaleString()}\n </span>\n )}\n </div>\n )}\n <div\n className=\"h-2 rounded-full overflow-hidden\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n >\n <div\n className=\"h-full rounded-full\"\n style={{\n width: `${percentage}%`,\n background: color,\n transition: \"width 0.3s ease\",\n }}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * UsageDashboard — renders multiple UsageMeters for all features.\n *\n * Accepts features as props. When loading=true renders skeleton placeholders.\n */\n\nimport { UsageMeter } from \"./UsageMeter.js\";\n\nexport interface UsageDashboardFeature {\n key: string;\n label: string;\n used: number;\n limit: number;\n}\n\nexport interface UsageDashboardProps {\n features?: UsageDashboardFeature[];\n loading?: boolean;\n}\n\nexport function UsageDashboard({\n features = [],\n loading = false,\n}: UsageDashboardProps) {\n if (loading) {\n return (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-8 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {features.map((f) => (\n <UsageMeter key={f.key} used={f.used} limit={f.limit} label={f.label} />\n ))}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * UsageAlert — warning banner shown when any feature usage is >= threshold.\n *\n * Shows dismissible alerts for features approaching their limit.\n * Default threshold: 80% (amber zone entry point).\n */\n\nimport { useState } from \"react\";\n\nexport interface UsageAlertFeature {\n key: string;\n label: string;\n percentage: number;\n}\n\nexport interface UsageAlertProps {\n features: UsageAlertFeature[];\n threshold?: number;\n upgradeHref?: string;\n}\n\nexport function UsageAlert({\n features,\n threshold = 80,\n upgradeHref = \"/plans\",\n}: UsageAlertProps) {\n const [dismissed, setDismissed] = useState<Set<string>>(new Set());\n\n const alertFeatures = features.filter(\n (f) => f.percentage >= threshold && !dismissed.has(f.key),\n );\n\n if (alertFeatures.length === 0) {\n return null;\n }\n\n const handleDismiss = (key: string) => {\n setDismissed((prev) => new Set(prev).add(key));\n };\n\n return (\n <div className=\"space-y-2\">\n {alertFeatures.map((f) => (\n <div\n key={f.key}\n role=\"alert\"\n className=\"flex items-center justify-between rounded-md px-4 py-3 text-sm\"\n style={{\n background: \"var(--nozle-warning-bg, var(--warning-bg, #fef9c3))\",\n color: \"var(--nozle-warning-text, var(--warning-text, #854d0e))\",\n border:\n \"1px solid var(--nozle-warning-border, var(--warning-border, #fde047))\",\n }}\n >\n <span>\n <span\n aria-hidden=\"true\"\n style={{ marginRight: \"0.5rem\", fontSize: \"1rem\" }}\n >\n ⚠\n </span>\n You're approaching your <strong>{f.label}</strong> limit (\n {Math.round(f.percentage)}%).{\" \"}\n <a\n href={upgradeHref}\n style={{\n color: \"inherit\",\n fontWeight: 600,\n textDecoration: \"underline\",\n }}\n >\n Upgrade\n </a>\n </span>\n <button\n onClick={() => handleDismiss(f.key)}\n aria-label={`Dismiss ${f.label} alert`}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: \"0 0 0 0.75rem\",\n fontSize: \"1rem\",\n color: \"inherit\",\n }}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * CreditBalance — displays the current credit balance for a customer.\n * Uses the useCredits hook with customerId prop.\n */\n\nimport { useCredits } from '../../hooks/use-credits.js';\n\nexport interface CreditBalanceProps {\n customerId: string;\n currency?: string;\n}\n\nexport function CreditBalance({\n customerId,\n currency = \"USD\",\n}: CreditBalanceProps) {\n const { balance, loading, error } = useCredits(customerId);\n\n if (loading) {\n return (\n <div\n className=\"animate-pulse h-8 w-24 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n );\n }\n\n if (error) {\n return (\n <span\n style={{ color: \"var(--nozle-destructive, var(--destructive))\" }}\n className=\"text-sm\"\n >\n Failed to load balance\n </span>\n );\n }\n\n const amount = balance ?? 0;\n\n return (\n <div className=\"flex items-center gap-2\">\n <span aria-label=\"wallet icon\" style={{ fontSize: \"1.25rem\" }} role=\"img\">\n 💳\n </span>\n {amount === 0 ? (\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n className=\"text-sm\"\n >\n No credits\n </span>\n ) : (\n <span className=\"font-semibold\">\n {new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n }).format(amount)}\n </span>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * CreditHistory — renders a list of credit transactions for a customer.\n * Shows type badge, amount, description, and date. Latest first.\n * Max 20 rows with \"View all\" link.\n */\n\nimport type React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from \"../../provider.js\";\n\nexport interface CreditTransaction {\n id: string;\n amount: number;\n type: string;\n description: string;\n createdAt: string;\n}\n\nexport interface CreditHistoryProps {\n customerId: string;\n viewAllHref?: string;\n}\n\ntype TxType = \"grant\" | \"deduct\" | \"purchase\" | \"application\";\n\nconst TYPE_BADGE_STYLES: Record<TxType, React.CSSProperties> = {\n grant: {\n background: \"var(--nozle-success-bg, #dcfce7)\",\n color: \"var(--nozle-success, #16a34a)\",\n },\n deduct: {\n background: \"var(--nozle-destructive-bg, #fee2e2)\",\n color: \"var(--nozle-destructive, #dc2626)\",\n },\n purchase: {\n background: \"var(--nozle-info-bg, #dbeafe)\",\n color: \"var(--nozle-info, #2563eb)\",\n },\n application: {\n background: \"var(--nozle-muted, #f1f5f9)\",\n color: \"var(--nozle-muted-foreground, #64748b)\",\n },\n};\n\nfunction getTypeBadgeStyle(type: string): React.CSSProperties {\n return TYPE_BADGE_STYLES[type as TxType] ?? TYPE_BADGE_STYLES.application;\n}\n\nfunction formatDate(iso: string): string {\n try {\n return new Date(iso).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nexport function CreditHistory({\n customerId,\n viewAllHref = \"/billing/credits\",\n}: CreditHistoryProps) {\n const { client } = useBillingContext();\n const [transactions, setTransactions] = useState<CreditTransaction[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!client) {\n setError(\"No client in context\");\n setLoading(false);\n return;\n }\n\n let cancelled = false;\n\n async function fetchHistory(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/credits/${customerId}/transactions`,\n {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n },\n );\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as {\n transactions?: CreditTransaction[];\n };\n if (!cancelled) {\n setTransactions(\n (data.transactions ?? [])\n .slice()\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() -\n new Date(a.createdAt).getTime(),\n ),\n );\n setLoading(false);\n }\n } catch (err: unknown) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n setLoading(false);\n }\n }\n }\n\n void fetchHistory();\n return () => {\n cancelled = true;\n };\n }, [client, customerId]);\n\n if (loading) {\n return (\n <div className=\"animate-pulse space-y-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-6 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <span\n style={{ color: \"var(--nozle-destructive, var(--destructive))\" }}\n className=\"text-sm\"\n >\n Failed to load transactions\n </span>\n );\n }\n\n const displayed = transactions.slice(0, 20);\n\n return (\n <div className=\"space-y-2\">\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr\n style={{\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontSize: \"0.75rem\",\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n <th style={{ textAlign: \"left\", padding: \"0.25rem 0.5rem\" }}>\n Type\n </th>\n <th style={{ textAlign: \"right\", padding: \"0.25rem 0.5rem\" }}>\n Amount\n </th>\n <th style={{ textAlign: \"left\", padding: \"0.25rem 0.5rem\" }}>\n Description\n </th>\n <th style={{ textAlign: \"right\", padding: \"0.25rem 0.5rem\" }}>\n Date\n </th>\n </tr>\n </thead>\n <tbody>\n {displayed.map((tx) => (\n <tr\n key={tx.id}\n style={{\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontSize: \"0.875rem\",\n }}\n >\n <td style={{ padding: \"0.5rem\" }}>\n <span\n style={{\n ...getTypeBadgeStyle(tx.type),\n padding: \"0.125rem 0.5rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n }}\n >\n {tx.type}\n </span>\n </td>\n <td\n style={{\n textAlign: \"right\",\n padding: \"0.5rem\",\n fontVariantNumeric: \"tabular-nums\",\n color:\n tx.type === \"deduct\"\n ? \"var(--nozle-destructive, var(--destructive))\"\n : \"var(--nozle-success, #16a34a)\",\n }}\n >\n {tx.type === \"deduct\" ? \"-\" : \"+\"}\n {Math.abs(tx.amount).toLocaleString()}\n </td>\n <td\n style={{\n padding: \"0.5rem\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {tx.description}\n </td>\n <td\n style={{\n textAlign: \"right\",\n padding: \"0.5rem\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.75rem\",\n }}\n >\n {formatDate(tx.createdAt)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {transactions.length > 20 && (\n <div style={{ textAlign: \"right\" }}>\n <a\n href={viewAllHref}\n style={{\n color: \"var(--nozle-primary, var(--primary))\",\n fontSize: \"0.875rem\",\n textDecoration: \"underline\",\n }}\n >\n View all ({transactions.length})\n </a>\n </div>\n )}\n {displayed.length === 0 && (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n textAlign: \"center\",\n padding: \"1rem\",\n }}\n >\n No credit transactions yet.\n </p>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * PlanBadge — simple badge displaying plan name with tier-based coloring.\n */\n\nimport type React from \"react\";\n\nexport interface PlanBadgeProps {\n plan: string;\n tier?: \"free\" | \"starter\" | \"pro\" | \"enterprise\";\n}\n\nconst TIER_STYLES: Record<string, React.CSSProperties> = {\n free: {\n background: \"var(--nozle-muted, var(--muted, #f1f5f9))\",\n color: \"var(--nozle-muted-foreground, var(--muted-foreground, #64748b))\",\n border: \"1px solid var(--nozle-border, var(--border, #e2e8f0))\",\n },\n starter: {\n background:\n \"color-mix(in srgb, var(--nozle-primary, var(--primary, #3b82f6)) 10%, transparent)\",\n color: \"var(--nozle-primary, var(--primary, #3b82f6))\",\n border:\n \"1px solid color-mix(in srgb, var(--nozle-primary, var(--primary, #3b82f6)) 30%, transparent)\",\n },\n pro: {\n background: \"var(--nozle-primary, var(--primary, #3b82f6))\",\n color:\n \"var(--nozle-primary-foreground, var(--primary-foreground, #ffffff))\",\n border: \"1px solid transparent\",\n },\n enterprise: {\n background: \"var(--nozle-accent, var(--accent, #8b5cf6))\",\n color: \"var(--nozle-accent-foreground, var(--accent-foreground, #ffffff))\",\n border: \"1px solid transparent\",\n },\n};\n\nexport function PlanBadge({ plan, tier = \"free\" }: PlanBadgeProps) {\n const style = TIER_STYLES[tier] ?? TIER_STYLES.free;\n\n return (\n <span\n style={{\n ...style,\n display: \"inline-flex\",\n alignItems: \"center\",\n padding: \"0.125rem 0.5rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 600,\n lineHeight: \"1.25rem\",\n whiteSpace: \"nowrap\",\n }}\n >\n {plan}\n </span>\n );\n}\n","\"use client\";\n\n/**\n * CurrentPlan — shows the customer's current subscription plan.\n * Fetches from GET /api/v1/subscriptions/current.\n * Includes plan name, interval, next billing date, status.\n */\n\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from \"../../provider.js\";\nimport { PlanBadge } from \"./PlanBadge.js\";\n\nexport interface CurrentPlanData {\n id: string;\n planName: string;\n interval: string;\n status: string;\n nextBillingDate?: string;\n tier?: \"free\" | \"starter\" | \"pro\" | \"enterprise\";\n}\n\nexport interface CurrentPlanProps {\n customerId: string;\n onChangePlan?: () => void;\n changePlanHref?: string;\n}\n\nfunction formatDate(iso?: string): string {\n if (!iso) return \"—\";\n try {\n return new Date(iso).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nexport function CurrentPlan({\n customerId,\n onChangePlan,\n changePlanHref = \"/plans\",\n}: CurrentPlanProps) {\n const { client } = useBillingContext();\n const [plan, setPlan] = useState<CurrentPlanData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!client) {\n setError(\"No client in context\");\n setLoading(false);\n return;\n }\n\n let cancelled = false;\n\n async function fetchPlan(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/subscriptions/current?customer_id=${customerId}`,\n {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n },\n );\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as CurrentPlanData;\n if (!cancelled) {\n setPlan(data);\n setLoading(false);\n }\n } catch (err: unknown) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n setLoading(false);\n }\n }\n }\n\n void fetchPlan();\n return () => {\n cancelled = true;\n };\n }, [client, customerId]);\n\n if (loading) {\n return (\n <div className=\"animate-pulse space-y-2\">\n <div\n className=\"h-6 w-32 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n <div\n className=\"h-4 w-48 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n </div>\n );\n }\n\n if (error || !plan) {\n return (\n <span\n style={{ color: \"var(--nozle-destructive, var(--destructive))\" }}\n className=\"text-sm\"\n >\n Failed to load current plan\n </span>\n );\n }\n\n const handleChangePlan = () => {\n if (onChangePlan) {\n onChangePlan();\n } else {\n window.location.href = changePlanHref;\n }\n };\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <PlanBadge plan={plan.planName} tier={plan.tier} />\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n {plan.interval}\n </span>\n <span\n style={{\n color:\n plan.status === \"active\"\n ? \"var(--nozle-success, #16a34a)\"\n : \"var(--nozle-warning, var(--warning))\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n }}\n >\n {plan.status}\n </span>\n </div>\n {plan.nextBillingDate && (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n Next billing: {formatDate(plan.nextBillingDate)}\n </p>\n )}\n <button\n onClick={handleChangePlan}\n style={{\n background: \"transparent\",\n border: \"1px solid var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary, var(--primary))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Change Plan\n </button>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * InvoiceList — renders customer invoices with status badge and download link.\n * Fetches from GET /api/v1/invoices?customer_id={customerId}.\n */\n\nimport type React from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { useBillingContext } from \"../../provider.js\";\n\nexport interface Invoice {\n id: string;\n number: string;\n date: string;\n amount: number;\n currency: string;\n status: \"draft\" | \"open\" | \"paid\" | \"void\" | \"uncollectible\";\n pdf_url?: string;\n}\n\nexport interface InvoiceListProps {\n customerId: string;\n}\n\nconst STATUS_STYLES: Record<string, React.CSSProperties> = {\n paid: {\n background: \"var(--nozle-success-bg, #dcfce7)\",\n color: \"var(--nozle-success, #16a34a)\",\n },\n open: {\n background: \"var(--nozle-info-bg, #dbeafe)\",\n color: \"var(--nozle-info, #2563eb)\",\n },\n draft: {\n background: \"var(--nozle-muted, #f1f5f9)\",\n color: \"var(--nozle-muted-foreground, #64748b)\",\n },\n void: {\n background: \"var(--nozle-muted, #f1f5f9)\",\n color: \"var(--nozle-muted-foreground, #64748b)\",\n },\n uncollectible: {\n background: \"var(--nozle-destructive-bg, #fee2e2)\",\n color: \"var(--nozle-destructive, #dc2626)\",\n },\n};\n\nfunction formatDate(iso: string): string {\n try {\n return new Date(iso).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nexport function InvoiceList({ customerId }: InvoiceListProps) {\n const { client } = useBillingContext();\n const [invoices, setInvoices] = useState<Invoice[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!client) {\n setError(\"No client in context\");\n setLoading(false);\n return;\n }\n\n let cancelled = false;\n\n async function fetchInvoices(): Promise<void> {\n try {\n const clientInternal = client as unknown as {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n };\n const apiKey = clientInternal.apiKey ?? \"\";\n const baseUrl = clientInternal.baseUrl ?? \"https://api.nozle.app\";\n const timeout = clientInternal.timeout ?? 5000;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(\n `${baseUrl}/api/v1/invoices?customer_id=${customerId}`,\n {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: controller.signal,\n },\n );\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = (await response.json()) as {\n invoices?: Invoice[];\n data?: Invoice[];\n };\n if (!cancelled) {\n setInvoices(data.invoices ?? data.data ?? []);\n setLoading(false);\n }\n } catch (err: unknown) {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n setLoading(false);\n }\n }\n }\n\n void fetchInvoices();\n return () => {\n cancelled = true;\n };\n }, [client, customerId]);\n\n if (loading) {\n return (\n <div className=\"animate-pulse space-y-2\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-8 rounded\"\n style={{ background: \"var(--nozle-border, var(--border))\" }}\n />\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <span\n style={{ color: \"var(--nozle-destructive, var(--destructive))\" }}\n className=\"text-sm\"\n >\n Failed to load invoices\n </span>\n );\n }\n\n if (invoices.length === 0) {\n return (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n textAlign: \"center\",\n padding: \"1.5rem\",\n }}\n >\n No invoices yet.\n </p>\n );\n }\n\n return (\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n <tr\n style={{\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontSize: \"0.75rem\",\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n <th style={{ textAlign: \"left\", padding: \"0.5rem\" }}>#</th>\n <th style={{ textAlign: \"left\", padding: \"0.5rem\" }}>Date</th>\n <th style={{ textAlign: \"right\", padding: \"0.5rem\" }}>Amount</th>\n <th style={{ textAlign: \"center\", padding: \"0.5rem\" }}>Status</th>\n <th style={{ textAlign: \"center\", padding: \"0.5rem\" }}>PDF</th>\n </tr>\n </thead>\n <tbody>\n {invoices.map((inv) => (\n <tr\n key={inv.id}\n style={{\n borderBottom: \"1px solid var(--nozle-border, var(--border))\",\n fontSize: \"0.875rem\",\n }}\n >\n <td\n style={{\n padding: \"0.5rem\",\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n {inv.number}\n </td>\n <td style={{ padding: \"0.5rem\" }}>{formatDate(inv.date)}</td>\n <td\n style={{\n textAlign: \"right\",\n padding: \"0.5rem\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: inv.currency ?? \"USD\",\n }).format(inv.amount / 100)}\n </td>\n <td style={{ textAlign: \"center\", padding: \"0.5rem\" }}>\n <span\n style={{\n ...(STATUS_STYLES[inv.status] ?? STATUS_STYLES.draft),\n padding: \"0.125rem 0.5rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n }}\n >\n {inv.status}\n </span>\n </td>\n <td style={{ textAlign: \"center\", padding: \"0.5rem\" }}>\n {inv.pdf_url ? (\n <a\n href={inv.pdf_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Download invoice ${inv.number}`}\n style={{\n color: \"var(--nozle-primary, var(--primary))\",\n textDecoration: \"underline\",\n fontSize: \"0.75rem\",\n }}\n >\n Download\n </a>\n ) : (\n <span\n style={{\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.75rem\",\n }}\n >\n —\n </span>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n","\"use client\";\n\n/**\n * BillingPortal — self-contained customer-facing billing portal.\n * Aggregates CurrentPlan, UsageDashboard, InvoiceList, and CreditBalance\n * in a single vertical stack.\n */\n\nimport type React from \"react\";\nimport { CurrentPlan } from \"./CurrentPlan.js\";\nimport { InvoiceList } from \"./InvoiceList.js\";\nimport { CreditBalance } from \"./CreditBalance.js\";\nimport { UsageDashboard } from \"../usage/UsageDashboard.js\";\nimport type { UsageDashboardFeature } from \"../usage/UsageDashboard.js\";\n\nexport interface BillingPortalProps {\n customerId: string;\n usageFeatures?: UsageDashboardFeature[];\n usageLoading?: boolean;\n onChangePlan?: () => void;\n subscriptionId?: string;\n onCancelled?: () => void;\n}\n\nfunction Section({\n title,\n children,\n}: {\n title: string;\n children: React.ReactNode;\n}) {\n return (\n <div\n style={{\n padding: \"1.25rem\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.75rem\",\n background: \"var(--nozle-card, var(--card, #ffffff))\",\n }}\n >\n <h3\n style={{\n fontSize: \"0.875rem\",\n fontWeight: 600,\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n marginBottom: \"1rem\",\n }}\n >\n {title}\n </h3>\n {children}\n </div>\n );\n}\n\nexport function BillingPortal({\n customerId,\n usageFeatures,\n usageLoading = false,\n onChangePlan,\n}: BillingPortalProps) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1.25rem\",\n fontFamily:\n \"var(--nozle-font-sans, var(--font-sans, system-ui, sans-serif))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n <Section title=\"Current Plan\">\n <CurrentPlan customerId={customerId} onChangePlan={onChangePlan} />\n </Section>\n\n <Section title=\"Usage\">\n <UsageDashboard features={usageFeatures} loading={usageLoading} />\n </Section>\n\n <Section title=\"Invoices\">\n <InvoiceList customerId={customerId} />\n </Section>\n\n <Section title=\"Credits\">\n <CreditBalance customerId={customerId} />\n </Section>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * PaymentMethodDisplay — shows saved payment method details.\n * Displays last4, brand, expiry. \"Update Payment Method\" button opens checkout.\n */\n\nexport interface PaymentMethod {\n last4: string;\n brand: string;\n expMonth: number;\n expYear: number;\n}\n\nexport interface PaymentMethodDisplayProps {\n paymentMethod?: PaymentMethod;\n onUpdatePaymentMethod?: () => void;\n updateHref?: string;\n}\n\nconst BRAND_LABELS: Record<string, string> = {\n visa: \"Visa\",\n mastercard: \"Mastercard\",\n amex: \"American Express\",\n discover: \"Discover\",\n jcb: \"JCB\",\n diners: \"Diners Club\",\n unionpay: \"UnionPay\",\n};\n\nexport function PaymentMethodDisplay({\n paymentMethod,\n onUpdatePaymentMethod,\n updateHref = \"/billing/update-payment\",\n}: PaymentMethodDisplayProps) {\n const handleUpdate = () => {\n if (onUpdatePaymentMethod) {\n onUpdatePaymentMethod();\n } else {\n window.location.href = updateHref;\n }\n };\n\n return (\n <div className=\"space-y-3\">\n {paymentMethod ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"0.75rem 1rem\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.5rem\",\n fontSize: \"0.875rem\",\n }}\n >\n <span\n style={{\n fontWeight: 600,\n color: \"var(--nozle-foreground, var(--foreground))\",\n }}\n >\n {BRAND_LABELS[paymentMethod.brand.toLowerCase()] ??\n paymentMethod.brand}\n </span>\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n }}\n >\n •••• {paymentMethod.last4}\n </span>\n <span\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.75rem\",\n }}\n >\n Expires {String(paymentMethod.expMonth).padStart(2, \"0\")}/\n {String(paymentMethod.expYear).slice(-2)}\n </span>\n </div>\n ) : (\n <p\n style={{\n color: \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n }}\n >\n No payment method on file.\n </p>\n )}\n <button\n onClick={handleUpdate}\n style={{\n background: \"transparent\",\n border: \"1px solid var(--nozle-primary, var(--primary))\",\n color: \"var(--nozle-primary, var(--primary))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Update Payment Method\n </button>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * CancelSubscriptionButton — two-step cancellation flow.\n *\n * Step 1 (confirm): Opens a confirmation dialog. \"Keep Subscription\" closes\n * without any API call.\n *\n * Step 2 (reason): \"Confirm Cancel\" transitions to a reason survey with 5\n * radio options. Selecting \"Other\" shows a free-text input.\n * \"Submit Cancellation\" calls DELETE /api/v1/subscriptions/{id}\n * with body { reason: string }.\n */\n\nimport { useState } from \"react\";\n\ntype CancelStep = \"idle\" | \"confirm\" | \"reason\";\n\nexport const CANCEL_REASONS = [\n \"Too expensive\",\n \"Missing features\",\n \"Switching to competitor\",\n \"Not using it enough\",\n \"Other\",\n] as const;\n\nexport interface CancelSubscriptionButtonProps {\n subscriptionId: string;\n onCancelled?: () => void;\n}\n\nexport function CancelSubscriptionButton({\n subscriptionId,\n onCancelled,\n}: CancelSubscriptionButtonProps) {\n const [step, setStep] = useState<CancelStep>(\"idle\");\n const [selectedReason, setSelectedReason] = useState(\"\");\n const [otherText, setOtherText] = useState(\"\");\n const [loading, setLoading] = useState(false);\n\n const handleDismiss = () => {\n setStep(\"idle\");\n setSelectedReason(\"\");\n setOtherText(\"\");\n };\n\n const handleConfirmCancel = () => {\n setStep(\"reason\");\n };\n\n const handleSubmitCancellation = async () => {\n const reason = selectedReason === \"Other\" ? otherText : selectedReason;\n setLoading(true);\n await fetch(`/api/v1/subscriptions/${subscriptionId}`, {\n method: \"DELETE\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ reason }),\n });\n setLoading(false);\n handleDismiss();\n onCancelled?.();\n };\n\n const isSubmitDisabled =\n loading ||\n !selectedReason ||\n (selectedReason === \"Other\" && !otherText.trim());\n\n return (\n <>\n <button\n onClick={() => setStep(\"confirm\")}\n style={{\n background: \"transparent\",\n border:\n \"1px solid var(--nozle-destructive, var(--destructive, #dc2626))\",\n color: \"var(--nozle-destructive, var(--destructive, #dc2626))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Cancel Subscription\n </button>\n\n {step === \"confirm\" && (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Cancel subscription confirmation\"\n style={{\n position: \"fixed\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.4)\",\n zIndex: 50,\n }}\n >\n <div\n style={{\n background: \"var(--nozle-background, var(--background, #fff))\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.75rem\",\n padding: \"1.5rem\",\n maxWidth: \"28rem\",\n width: \"90%\",\n boxShadow: \"0 20px 60px rgba(0,0,0,0.15)\",\n }}\n >\n <h2\n style={{\n fontSize: \"1.125rem\",\n fontWeight: 600,\n marginBottom: \"0.75rem\",\n }}\n >\n Cancel Subscription?\n </h2>\n <p\n style={{\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n marginBottom: \"1.5rem\",\n }}\n >\n Your access will end at the end of the billing period.\n </p>\n <div\n style={{\n display: \"flex\",\n gap: \"0.75rem\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={handleDismiss}\n style={{\n background: \"transparent\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n cursor: \"pointer\",\n }}\n >\n Keep Subscription\n </button>\n <button\n onClick={handleConfirmCancel}\n style={{\n background:\n \"var(--nozle-destructive, var(--destructive, #dc2626))\",\n border: \"1px solid transparent\",\n color: \"#fff\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n Confirm Cancel\n </button>\n </div>\n </div>\n </div>\n )}\n\n {step === \"reason\" && (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Cancellation reason survey\"\n style={{\n position: \"fixed\",\n inset: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.4)\",\n zIndex: 50,\n }}\n >\n <div\n style={{\n background: \"var(--nozle-background, var(--background, #fff))\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.75rem\",\n padding: \"1.5rem\",\n maxWidth: \"28rem\",\n width: \"90%\",\n boxShadow: \"0 20px 60px rgba(0,0,0,0.15)\",\n }}\n >\n <h2\n style={{\n fontSize: \"1.125rem\",\n fontWeight: 600,\n marginBottom: \"0.5rem\",\n }}\n >\n Why are you cancelling?\n </h2>\n <p\n style={{\n color:\n \"var(--nozle-muted-foreground, var(--muted-foreground))\",\n fontSize: \"0.875rem\",\n marginBottom: \"1rem\",\n }}\n >\n Your feedback helps us improve.\n </p>\n <fieldset\n style={{\n border: \"none\",\n padding: 0,\n margin: 0,\n marginBottom: \"1rem\",\n }}\n >\n <legend className=\"sr-only\">Cancellation reason</legend>\n {CANCEL_REASONS.map((r) => (\n <label\n key={r}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n padding: \"0.375rem 0\",\n fontSize: \"0.875rem\",\n cursor: \"pointer\",\n }}\n >\n <input\n type=\"radio\"\n name=\"cancel-reason\"\n value={r}\n checked={selectedReason === r}\n onChange={() => setSelectedReason(r)}\n aria-label={r}\n />\n {r}\n </label>\n ))}\n </fieldset>\n {selectedReason === \"Other\" && (\n <input\n type=\"text\"\n placeholder=\"Please describe your reason\"\n value={otherText}\n onChange={(e) => setOtherText(e.target.value)}\n aria-label=\"Other reason\"\n style={{\n width: \"100%\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n borderRadius: \"0.375rem\",\n padding: \"0.5rem 0.75rem\",\n fontSize: \"0.875rem\",\n marginBottom: \"1rem\",\n background:\n \"var(--nozle-background, var(--background, #fff))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n boxSizing: \"border-box\",\n }}\n />\n )}\n <div\n style={{\n display: \"flex\",\n gap: \"0.75rem\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n onClick={handleDismiss}\n style={{\n background: \"transparent\",\n border: \"1px solid var(--nozle-border, var(--border))\",\n color: \"var(--nozle-foreground, var(--foreground))\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n cursor: \"pointer\",\n }}\n >\n Keep Subscription\n </button>\n <button\n onClick={handleSubmitCancellation}\n disabled={isSubmitDisabled}\n style={{\n background: isSubmitDisabled\n ? \"var(--nozle-muted, var(--muted, #f1f5f9))\"\n : \"var(--nozle-destructive, var(--destructive, #dc2626))\",\n border: \"1px solid transparent\",\n color: isSubmitDisabled\n ? \"var(--nozle-muted-foreground, var(--muted-foreground))\"\n : \"#fff\",\n padding: \"0.375rem 0.875rem\",\n borderRadius: \"0.375rem\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: isSubmitDisabled ? \"not-allowed\" : \"pointer\",\n }}\n >\n {loading ? \"Cancelling...\" : \"Submit Cancellation\"}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n"]}
|