@nozle-js/react 0.3.0 → 0.4.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 ADDED
@@ -0,0 +1,241 @@
1
+ # @nozle-js/react
2
+
3
+ React SDK for usage-based billing. Hooks and components for entitlements, real-time usage tracking, plan management, and Stripe checkout.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @nozle-js/react
9
+ ```
10
+
11
+ Peer dependencies:
12
+
13
+ ```bash
14
+ npm install react react-dom @stripe/stripe-js @stripe/react-stripe-js
15
+ ```
16
+
17
+ ## Quick Start
18
+
19
+ Wrap your app with `BillingProvider`:
20
+
21
+ ```tsx
22
+ import { BillingProvider } from "@nozle-js/react";
23
+
24
+ function App() {
25
+ return (
26
+ <BillingProvider
27
+ apiKey="pk_live_..."
28
+ customerId="cust_123"
29
+ baseUrl="https://your-api.example.com"
30
+ wsUrl="wss://your-ws.example.com/connection/websocket"
31
+ stripeKey="pk_test_..."
32
+ features={["tokens_used", "code_completions"]}
33
+ >
34
+ <YourApp />
35
+ </BillingProvider>
36
+ );
37
+ }
38
+ ```
39
+
40
+ ## Hooks
41
+
42
+ ### `useCan(feature)`
43
+
44
+ Check if a customer has access to a feature.
45
+
46
+ ```tsx
47
+ import { useCan } from "@nozle-js/react";
48
+
49
+ function MyFeature() {
50
+ const { allowed, isLoading, error } = useCan("advanced_analytics");
51
+
52
+ if (isLoading) return <p>Loading...</p>;
53
+ if (!allowed) return <p>Upgrade to access this feature.</p>;
54
+
55
+ return <div>Feature content here</div>;
56
+ }
57
+ ```
58
+
59
+ ### `useUsage(metric)`
60
+
61
+ Get real-time usage data for a metric. Updates automatically via WebSocket.
62
+
63
+ ```tsx
64
+ import { useUsage } from "@nozle-js/react";
65
+
66
+ function TokenCounter() {
67
+ const { data, isLoading } = useUsage("tokens_used");
68
+
69
+ if (isLoading || !data) return null;
70
+
71
+ return (
72
+ <p>
73
+ {data.used.toLocaleString()} / {data.limit.toLocaleString()} tokens used
74
+ </p>
75
+ );
76
+ }
77
+ ```
78
+
79
+ ### `usePlan()`
80
+
81
+ Get the customer's current plan and subscription status.
82
+
83
+ ```tsx
84
+ import { usePlan } from "@nozle-js/react";
85
+
86
+ function CurrentPlan() {
87
+ const { data } = usePlan();
88
+
89
+ if (!data) return null;
90
+
91
+ return (
92
+ <p>
93
+ Plan: {data.plan_slug} ({data.subscription_status})
94
+ </p>
95
+ );
96
+ }
97
+ ```
98
+
99
+ ### `usePlans()`
100
+
101
+ Fetch all available plans.
102
+
103
+ ```tsx
104
+ import { usePlans } from "@nozle-js/react";
105
+
106
+ function PlanList() {
107
+ const { plans, isLoading } = usePlans();
108
+
109
+ if (isLoading) return <p>Loading plans...</p>;
110
+
111
+ return (
112
+ <ul>
113
+ {plans.map((plan) => (
114
+ <li key={plan.code}>
115
+ {plan.name} — ${(plan.amount_cents / 100).toFixed(2)}/{plan.interval}
116
+ </li>
117
+ ))}
118
+ </ul>
119
+ );
120
+ }
121
+ ```
122
+
123
+ ### `useCheckout()`
124
+
125
+ Create a Stripe checkout session and render embedded checkout.
126
+
127
+ ```tsx
128
+ import { useCheckout } from "@nozle-js/react";
129
+
130
+ function UpgradeButton({ planCode }: { planCode: string }) {
131
+ const { fetchClientSecret, isLoading } = useCheckout();
132
+
133
+ const handleUpgrade = async () => {
134
+ const clientSecret = await fetchClientSecret(planCode);
135
+ // Use clientSecret with Stripe EmbeddedCheckout
136
+ };
137
+
138
+ return (
139
+ <button onClick={handleUpgrade} disabled={isLoading}>
140
+ Upgrade
141
+ </button>
142
+ );
143
+ }
144
+ ```
145
+
146
+ ### `useSubscribe()`
147
+
148
+ Create a subscription after successful payment.
149
+
150
+ ```tsx
151
+ import { useSubscribe } from "@nozle-js/react";
152
+
153
+ function AfterPayment({ planCode }: { planCode: string }) {
154
+ const { subscribe, isLoading } = useSubscribe();
155
+
156
+ const handleComplete = async () => {
157
+ await subscribe(planCode);
158
+ };
159
+
160
+ return (
161
+ <button onClick={handleComplete} disabled={isLoading}>
162
+ Activate Subscription
163
+ </button>
164
+ );
165
+ }
166
+ ```
167
+
168
+ ## Components
169
+
170
+ Pre-built UI components with built-in styling. No CSS imports needed.
171
+
172
+ ### `UsageMeter`
173
+
174
+ Displays usage with bar, ring, or minimal variants.
175
+
176
+ ```tsx
177
+ import { UsageMeter } from "@nozle-js/react";
178
+
179
+ <UsageMeter metric="tokens_used" variant="bar" />
180
+ <UsageMeter metric="tokens_used" variant="ring" />
181
+ <UsageMeter metric="tokens_used" variant="minimal" />
182
+ ```
183
+
184
+ ### `PlanBadge`
185
+
186
+ Shows the current plan with status indicator.
187
+
188
+ ```tsx
189
+ import { PlanBadge } from "@nozle-js/react";
190
+
191
+ <PlanBadge variant="pill" />
192
+ <PlanBadge variant="text" />
193
+ <PlanBadge variant="icon" />
194
+ ```
195
+
196
+ ### `UpgradePrompt`
197
+
198
+ Conditionally renders an upgrade prompt when a feature is gated.
199
+
200
+ ```tsx
201
+ import { UpgradePrompt } from "@nozle-js/react";
202
+
203
+ <UpgradePrompt feature="advanced_analytics" variant="card" upgradeUrl="/upgrade" />
204
+ <UpgradePrompt feature="advanced_analytics" variant="banner" />
205
+ <UpgradePrompt feature="advanced_analytics" variant="inline" />
206
+ ```
207
+
208
+ ## Tailwind CSS Preset
209
+
210
+ Optional Tailwind preset for styling the `data-nozle` attributes on components.
211
+
212
+ ```ts
213
+ // tailwind.config.ts
214
+ import { nozlePreset } from "@nozle-js/react/styles/preset";
215
+
216
+ export default {
217
+ presets: [nozlePreset],
218
+ };
219
+ ```
220
+
221
+ ## TypeScript
222
+
223
+ All hooks and components are fully typed. Exported types:
224
+
225
+ ```ts
226
+ import type {
227
+ BillingState,
228
+ UseCanResult,
229
+ UseUsageResult,
230
+ UsePlanResult,
231
+ UseCheckoutResult,
232
+ Plan,
233
+ UsageMeterProps,
234
+ PlanBadgeProps,
235
+ UpgradePromptProps,
236
+ } from "@nozle-js/react";
237
+ ```
238
+
239
+ ## License
240
+
241
+ Proprietary
package/dist/index.cjs CHANGED
@@ -96,9 +96,11 @@ var BillingStore = class {
96
96
  success_url: successUrl || `${window.location.origin}/checkout/complete?session_id={CHECKOUT_SESSION_ID}`
97
97
  })
98
98
  });
99
- if (!res.ok) throw new Error("Failed to create checkout session");
100
- const data = await res.json();
101
- return data.client_secret;
99
+ if (!res.ok) {
100
+ const errorBody = await res.json().catch(() => ({}));
101
+ throw new Error(errorBody.error || "Failed to create checkout session");
102
+ }
103
+ return res.json();
102
104
  }
103
105
  async fetchPlans() {
104
106
  const res = await fetch(`${this.baseUrl}/v1/plans`, {
@@ -250,12 +252,15 @@ function useCheckout() {
250
252
  const { store, stripePromise } = useBillingContext();
251
253
  const [isLoading, setIsLoading] = react.useState(false);
252
254
  const [error, setError] = react.useState(null);
255
+ const [checkout, setCheckout] = react.useState(null);
253
256
  const fetchClientSecret = react.useCallback(
254
257
  async (planCode, successUrl) => {
255
258
  setIsLoading(true);
256
259
  setError(null);
257
260
  try {
258
- return await store.fetchCheckoutSecret(planCode, successUrl);
261
+ const result = await store.fetchCheckoutSecret(planCode, successUrl);
262
+ setCheckout(result);
263
+ return result.client_secret;
259
264
  } catch (err) {
260
265
  const e = err instanceof Error ? err : new Error(String(err));
261
266
  setError(e);
@@ -266,7 +271,7 @@ function useCheckout() {
266
271
  },
267
272
  [store]
268
273
  );
269
- return { fetchClientSecret, stripePromise, isLoading, error };
274
+ return { fetchClientSecret, checkout, stripePromise, isLoading, error };
270
275
  }
271
276
  function useSubscribe() {
272
277
  const { store } = useBillingContext();
@@ -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":["centrifuge","Centrifuge","createContext","useRef","useMemo","loadStripe","useEffect","jsx","useContext","useSyncExternalStore","useState","useCallback","jsxs","labelStyle","fontFamily","skeletonStyleInjected","ensureKeyframes","dotStyle","msgStyle","btnStyle"],"mappings":"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","file":"index.cjs","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/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":["centrifuge","Centrifuge","createContext","useRef","useMemo","loadStripe","useEffect","jsx","useContext","useSyncExternalStore","useState","useCallback","jsxs","labelStyle","fontFamily","skeletonStyleInjected","ensureKeyframes","dotStyle","msgStyle","btnStyle"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { BillingState, CheckoutResult } 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<CheckoutResult> {\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) {\n const errorBody = await res.json().catch(() => ({}));\n throw new Error(errorBody.error || \"Failed to create checkout session\");\n }\n return res.json();\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\";\nimport type { CheckoutResult } from \"../types\";\n\nexport interface UseCheckoutResult {\n fetchClientSecret: (planCode: string, successUrl?: string) => Promise<string>;\n checkout: CheckoutResult | null;\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 const [checkout, setCheckout] = useState<CheckoutResult | null>(null);\n\n const fetchClientSecret = useCallback(\n async (planCode: string, successUrl?: string): Promise<string> => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await store.fetchCheckoutSecret(planCode, successUrl);\n setCheckout(result);\n return result.client_secret;\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, checkout, 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"]}
package/dist/index.d.cts CHANGED
@@ -48,6 +48,12 @@ interface UsePlanResult {
48
48
  isLoading: boolean;
49
49
  error: Error | null;
50
50
  }
51
+ interface CheckoutResult {
52
+ client_secret: string;
53
+ invoice_id: string;
54
+ amount_cents: number;
55
+ currency: string;
56
+ }
51
57
 
52
58
  declare class BillingStore {
53
59
  readonly baseUrl: string;
@@ -64,7 +70,7 @@ declare class BillingStore {
64
70
  setError(error: Error | null): void;
65
71
  updateUsage(metric: string, used: number, limit: number, remaining: number): void;
66
72
  fetchUsage(feature: string): Promise<void>;
67
- fetchCheckoutSecret(planCode: string, successUrl?: string): Promise<string>;
73
+ fetchCheckoutSecret(planCode: string, successUrl?: string): Promise<CheckoutResult>;
68
74
  fetchPlans(): Promise<Array<{
69
75
  code: string;
70
76
  name: string;
@@ -102,6 +108,7 @@ declare function usePlan(): UsePlanResult;
102
108
 
103
109
  interface UseCheckoutResult {
104
110
  fetchClientSecret: (planCode: string, successUrl?: string) => Promise<string>;
111
+ checkout: CheckoutResult | null;
105
112
  stripePromise: ReturnType<typeof _stripe_stripe_js.loadStripe> | null;
106
113
  isLoading: boolean;
107
114
  error: Error | null;
@@ -147,4 +154,4 @@ declare function PlanBadge({ variant, className, style, ...props }: PlanBadgePro
147
154
 
148
155
  declare function UpgradePrompt({ feature, variant, upgradeUrl, message, className, style, ...props }: UpgradePromptProps): react_jsx_runtime.JSX.Element | null;
149
156
 
150
- export { BillingProvider, type BillingState, type Plan, PlanBadge, type PlanBadgeProps, UpgradePrompt, type UpgradePromptProps, UsageMeter, type UsageMeterProps, type UseCanResult, type UseCheckoutResult, type UsePlanResult, type UseUsageResult, useBillingContext, useCan, useCheckout, usePlan, usePlans, useSubscribe, useUsage };
157
+ export { BillingProvider, type BillingState, type CheckoutResult, type Plan, PlanBadge, type PlanBadgeProps, UpgradePrompt, type UpgradePromptProps, UsageMeter, type UsageMeterProps, type UseCanResult, type UseCheckoutResult, type UsePlanResult, type UseUsageResult, useBillingContext, useCan, useCheckout, usePlan, usePlans, useSubscribe, useUsage };
package/dist/index.d.ts CHANGED
@@ -48,6 +48,12 @@ interface UsePlanResult {
48
48
  isLoading: boolean;
49
49
  error: Error | null;
50
50
  }
51
+ interface CheckoutResult {
52
+ client_secret: string;
53
+ invoice_id: string;
54
+ amount_cents: number;
55
+ currency: string;
56
+ }
51
57
 
52
58
  declare class BillingStore {
53
59
  readonly baseUrl: string;
@@ -64,7 +70,7 @@ declare class BillingStore {
64
70
  setError(error: Error | null): void;
65
71
  updateUsage(metric: string, used: number, limit: number, remaining: number): void;
66
72
  fetchUsage(feature: string): Promise<void>;
67
- fetchCheckoutSecret(planCode: string, successUrl?: string): Promise<string>;
73
+ fetchCheckoutSecret(planCode: string, successUrl?: string): Promise<CheckoutResult>;
68
74
  fetchPlans(): Promise<Array<{
69
75
  code: string;
70
76
  name: string;
@@ -102,6 +108,7 @@ declare function usePlan(): UsePlanResult;
102
108
 
103
109
  interface UseCheckoutResult {
104
110
  fetchClientSecret: (planCode: string, successUrl?: string) => Promise<string>;
111
+ checkout: CheckoutResult | null;
105
112
  stripePromise: ReturnType<typeof _stripe_stripe_js.loadStripe> | null;
106
113
  isLoading: boolean;
107
114
  error: Error | null;
@@ -147,4 +154,4 @@ declare function PlanBadge({ variant, className, style, ...props }: PlanBadgePro
147
154
 
148
155
  declare function UpgradePrompt({ feature, variant, upgradeUrl, message, className, style, ...props }: UpgradePromptProps): react_jsx_runtime.JSX.Element | null;
149
156
 
150
- export { BillingProvider, type BillingState, type Plan, PlanBadge, type PlanBadgeProps, UpgradePrompt, type UpgradePromptProps, UsageMeter, type UsageMeterProps, type UseCanResult, type UseCheckoutResult, type UsePlanResult, type UseUsageResult, useBillingContext, useCan, useCheckout, usePlan, usePlans, useSubscribe, useUsage };
157
+ export { BillingProvider, type BillingState, type CheckoutResult, type Plan, PlanBadge, type PlanBadgeProps, UpgradePrompt, type UpgradePromptProps, UsageMeter, type UsageMeterProps, type UseCanResult, type UseCheckoutResult, type UsePlanResult, type UseUsageResult, useBillingContext, useCan, useCheckout, usePlan, usePlans, useSubscribe, useUsage };
package/dist/index.js CHANGED
@@ -94,9 +94,11 @@ var BillingStore = class {
94
94
  success_url: successUrl || `${window.location.origin}/checkout/complete?session_id={CHECKOUT_SESSION_ID}`
95
95
  })
96
96
  });
97
- if (!res.ok) throw new Error("Failed to create checkout session");
98
- const data = await res.json();
99
- return data.client_secret;
97
+ if (!res.ok) {
98
+ const errorBody = await res.json().catch(() => ({}));
99
+ throw new Error(errorBody.error || "Failed to create checkout session");
100
+ }
101
+ return res.json();
100
102
  }
101
103
  async fetchPlans() {
102
104
  const res = await fetch(`${this.baseUrl}/v1/plans`, {
@@ -248,12 +250,15 @@ function useCheckout() {
248
250
  const { store, stripePromise } = useBillingContext();
249
251
  const [isLoading, setIsLoading] = useState(false);
250
252
  const [error, setError] = useState(null);
253
+ const [checkout, setCheckout] = useState(null);
251
254
  const fetchClientSecret = useCallback(
252
255
  async (planCode, successUrl) => {
253
256
  setIsLoading(true);
254
257
  setError(null);
255
258
  try {
256
- return await store.fetchCheckoutSecret(planCode, successUrl);
259
+ const result = await store.fetchCheckoutSecret(planCode, successUrl);
260
+ setCheckout(result);
261
+ return result.client_secret;
257
262
  } catch (err) {
258
263
  const e = err instanceof Error ? err : new Error(String(err));
259
264
  setError(e);
@@ -264,7 +269,7 @@ function useCheckout() {
264
269
  },
265
270
  [store]
266
271
  );
267
- return { fetchClientSecret, stripePromise, isLoading, error };
272
+ return { fetchClientSecret, checkout, stripePromise, isLoading, error };
268
273
  }
269
274
  function useSubscribe() {
270
275
  const { store } = useBillingContext();
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":";;;;;;;;AAEO,IAAM,eAAN,MAAmB;AAAA,EACf,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EAED,KAAA,GAAsB;AAAA,IAC5B,YAAA,EAAc,IAAA;AAAA,IACd,OAAA,EAAS,IAAA;AAAA,IACT,OAAO,EAAC;AAAA,IACR,eAAA,EAAiB,YAAA;AAAA,IACjB,KAAA,EAAO;AAAA,GACT;AAAA,EAEQ,SAAA,uBAAgB,GAAA,EAAgB;AAAA,EAExC,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB,UAAA,EAAoB;AAC/D,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,WAAA,GAAc,MAAoB,IAAA,CAAK,KAAA;AAAA,EACvC,iBAAA,GAAoB,MAAoB,IAAA,CAAK,KAAA;AAAA,EAE7C,SAAA,GAAY,CAAC,QAAA,KAAuC;AAClD,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,EACF,CAAA;AAAA,EAEQ,IAAA,GAAa;AACnB,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,QAAA,EAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,mBAAmB,KAAA,EAA8C;AAC/D,IAAA,IAAA,CAAK,QAAQ,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,iBAAiB,KAAA,EAAM;AACrD,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,SAAS,KAAA,EAA2B;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,IAAA,CAAK,OAAO,KAAA,EAAM;AACpC,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,WAAA,CAAY,MAAA,EAAgB,IAAA,EAAc,KAAA,EAAe,SAAA,EAAyB;AAChF,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,GAAG,KAAK,KAAA,CAAM,KAAA;AAAA,QACd,CAAC,MAAM,GAAG,EAAE,IAAA,EAAM,OAAO,SAAA;AAAU;AACrC,KACF;AACA,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,MAAM,WAAW,OAAA,EAAgC;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA;AAAA,QAChB,GAAG,IAAA,CAAK,OAAO,uBAAuB,IAAA,CAAK,UAAU,YAAY,OAAO,CAAA,CAAA;AAAA,QACxE,EAAE,SAAS,EAAE,aAAA,EAAe,UAAU,IAAA,CAAK,MAAM,IAAG;AAAE,OACxD;AACA,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACb,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,IAAA,CAAK,YAAY,OAAA,EAAS,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,EAAO,KAAK,SAAS,CAAA;AAE/D,MAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,QACX,GAAG,IAAA,CAAK,KAAA;AAAA,QACR,YAAA,EAAc;AAAA,UACZ,SAAA,EAAW,KAAA;AAAA,UACX,mBAAA,EAAqB,QAAA;AAAA,UACrB,QAAA,EAAU,EAAE,CAAC,OAAO,GAAG,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ,EAAE;AAAA,UACjD,MAAA,EAAQ,EAAE,CAAC,OAAO,GAAG,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,eAAc;AAAE;AACrF,OACF;AACA,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACZ,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,QACX,GAAG,IAAA,CAAK,KAAA;AAAA,QACR,KAAA,EAAO,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC;AAAA,OAC3D;AACA,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,MAAM,mBAAA,CAAoB,QAAA,EAAkB,UAAA,EAAsC;AAChF,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,YAAA,CAAA,EAAgB;AAAA,MACrD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,QACpC,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,SAAA,EAAW,QAAA;AAAA,QACX,aAAa,IAAA,CAAK,UAAA;AAAA,QAClB,WAAA,EAAa,UAAA,IAAc,CAAA,EAAG,MAAA,CAAO,SAAS,MAAM,CAAA,mDAAA;AAAA,OACrD;AAAA,KACF,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAChE,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,MAAM,UAAA,GAA8H;AAClI,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,SAAA,CAAA,EAAa;AAAA,MAClD,SAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAG,KACnD,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,EAAC;AACrB,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAS,EAAC;AAAA,EACxB;AAAA,EAEA,YAAY,KAAA,EAAuD;AACjE,IAAA,IAAI,KAAA,CAAM,SAAS,eAAA,EAAiB;AAClC,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,MAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,MAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AACxB,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAAA,IACjD;AAAA,EACF;AACF,CAAA;ACtHO,SAAS,iBAAA,CACd,KAAA,EACA,UAAA,EACA,KAAA,EACsB;AACtB,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,KAAA,EAAO,EAAE,CAAA;AAE3C,EAAA,MAAM,MAAoB,UAAA,CAAW,eAAA;AAAA,IACnC,YAAY,UAAU,CAAA;AAAA,GACxB;AAEA,EAAA,GAAA,CAAI,EAAA,CAAG,aAAA,EAAe,CAAC,GAAA,KAAQ;AAC7B,IAAA,KAAA,CAAM,WAAA;AAAA,MACJ,GAAA,CAAI;AAAA,KACN;AAAA,EACF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,EAAA,CAAG,cAAc,MAAM;AACzB,IAAA,KAAA,CAAM,mBAAmB,WAAW,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,UAAA,CAAW,EAAA,CAAG,aAAa,MAAM;AAC/B,IAAA,KAAA,CAAM,mBAAmB,WAAW,CAAA;AAAA,EACtC,CAAC,CAAA;AAED,EAAA,UAAA,CAAW,EAAA,CAAG,gBAAgB,MAAM;AAClC,IAAA,KAAA,CAAM,mBAAmB,cAAc,CAAA;AAAA,EACzC,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,UAAA,CAAW,OAAA,EAAQ;AACnB,EAAA,KAAA,CAAM,mBAAmB,YAAY,CAAA;AAErC,EAAA,OAAO;AAAA,IACL,YAAY,MAAM;AAChB,MAAA,GAAA,CAAI,WAAA,EAAY;AAChB,MAAA,UAAA,CAAW,UAAA,EAAW;AAAA,IACxB;AAAA,GACF;AACF;AC7BA,IAAM,cAAA,GAAiB,cAA0C,IAAI,CAAA;AAY9D,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,uBAAA;AAAA,EACV,KAAA,GAAQ,0CAAA;AAAA,EACR,SAAA;AAAA,EACA,WAAW,EAAC;AAAA,EACZ;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,QAAA,GAAW,OAAqB,IAAK,CAAA;AAE3C,EAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACrB,IAAA,QAAA,CAAS,OAAA,GAAU,IAAI,YAAA,CAAa,OAAA,EAAS,QAAQ,UAAU,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAA;AAAA,IACpB,MAAO,SAAA,GAAY,UAAA,CAAW,SAAS,CAAA,GAAI,IAAA;AAAA,IAC3C,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AAEvB,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,KAAA,CAAM,WAAW,OAAO,CAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,UAAA,GAAmC,iBAAA;AAAA,MACvC,KAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,CAAW,UAAA,EAAW;AAAA,IACxB,CAAA;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,YAAY,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEjD,EAAA,uBACE,GAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,CAAS,OAAA,EAAS,aAAA,EAAc,EACtE,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,iBAAA,GAAyC;AACvD,EAAA,MAAM,GAAA,GAAM,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,GAAA;AACT;AC5EO,SAAS,OAAO,OAAA,EAA+B;AACpD,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,iBAAA,EAAkB;AACpC,EAAA,MAAM,KAAA,GAAQ,oBAAA;AAAA,IACZ,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,EAChE;AACA,EAAA,IAAI,KAAA,CAAM,iBAAiB,IAAA,EAAM;AAC/B,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EACxD;AAEA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AACxD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,cAAc,OAAA,IAAW,KAAA;AAAA,IAClC,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACT;AACF;ACrBO,SAAS,SAAS,MAAA,EAAgC;AACvD,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,iBAAA,EAAkB;AACpC,EAAA,MAAM,KAAA,GAAQA,oBAAAA;AAAA,IACZ,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,WAAW,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,EAC5D;AACA,EAAA,IAAI,KAAA,CAAM,iBAAiB,IAAA,EAAM;AAC/B,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EACpD;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,IAAK,IAAA;AACrC,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,OAAO,IAAA,EAAK;AACtD;ACjBO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,iBAAA,EAAkB;AACpC,EAAA,MAAM,KAAA,GAAQA,oBAAAA;AAAA,IACZ,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,WAAW,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,EAC5D;AACA,EAAA,IAAI,KAAA,CAAM,iBAAiB,IAAA,EAAM;AAC/B,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EACpD;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW,MAAM,YAAA,CAAa,SAAA;AAAA,MAC9B,mBAAA,EAAqB,MAAM,YAAA,CAAa;AAAA,KAC1C;AAAA,IACA,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACT;AACF;ACjBO,SAAS,WAAA,GAAiC;AAC/C,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAc,GAAI,iBAAA,EAAkB;AACnD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,OAAO,UAAkB,UAAA,KAAyC;AAChE,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,KAAA,CAAM,mBAAA,CAAoB,QAAA,EAAU,UAAU,CAAA;AAAA,MAC7D,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,QAAA,QAAA,CAAS,CAAC,CAAA;AACV,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,OAAO,EAAE,iBAAA,EAAmB,aAAA,EAAe,SAAA,EAAW,KAAA,EAAM;AAC9D;ACxBO,SAAS,YAAA,GAAmC;AACjD,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,iBAAA,EAAkB;AACpC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,SAAA,GAAYC,WAAAA;AAAA,IAChB,OAAO,QAAA,KAAqB;AAC1B,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,aAAA,CAAA,EAAiB;AAAA,UACvD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,aAAA,EAAe,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,YACrC,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,SAAA,EAAW,QAAA;AAAA,YACX,aAAa,KAAA,CAAM;AAAA,WACpB;AAAA,SACF,CAAA;AACD,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC5D,QAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,MACxB,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,CAAA,GAAI,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC5D,QAAA,QAAA,CAAS,CAAC,CAAA;AACV,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,KAAA,EAAM;AACvC;ACjCO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,iBAAA,EAAkB;AACpC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,QAAAA,CAAiB,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,IAAI,CAAA;AAE/C,EAAAE,UAAU,MAAM;AACd,IAAA,KAAA,CACG,UAAA,GACA,IAAA,CAAK,QAAQ,EACb,OAAA,CAAQ,MAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,EAAE,OAAO,SAAA,EAAU;AAC5B;ACpBA,IAAM,UAAA,GACJ,uGAAA;AAEF,IAAM,WAAA,GACJ;AAAA,EACE,MAAA,EAAQ;AAAA,IACN,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,0BAAA;AAAA,IACJ,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,0BAAA;AAAA,IACJ,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,yBAAA;AAAA,IACJ,OAAA,EAAS;AAAA;AAEb,CAAA;AAEF,IAAI,qBAAA,GAAwB,KAAA;AAC5B,SAAS,eAAA,GAAkB;AACzB,EAAA,IAAI,qBAAA,IAAyB,OAAO,QAAA,KAAa,WAAA,EAAa;AAC9D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc,CAAA,yDAAA,CAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAC/B,EAAA,qBAAA,GAAwB,IAAA;AAC1B;AAEO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAM,GAAI,SAAS,MAAM,CAAA;AAElD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,eAAA,EAAgB;AAChB,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,uBACEC,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,aAAA;AAAA,UACX,cAAA,EAAa,SAAA;AAAA,UACb,SAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,cAAA;AAAA,YACT,KAAA,EAAO,EAAA;AAAA,YACP,MAAA,EAAQ,EAAA;AAAA,YACR,YAAA,EAAc,CAAA;AAAA,YACd,UAAA,EAAY,SAAA;AAAA,YACZ,SAAA,EAAW,uCAAA;AAAA,YACX,GAAG;AAAA,WACL;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,IAEJ;AACA,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,uBACEA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,aAAA;AAAA,UACX,cAAA,EAAa,MAAA;AAAA,UACb,SAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,EAAA;AAAA,YACP,MAAA,EAAQ,EAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,UAAA,EAAY,SAAA;AAAA,YACZ,SAAA,EAAW,uCAAA;AAAA,YACX,GAAG;AAAA,WACL;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,IAEJ;AACA,IAAA,uBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,aAAA;AAAA,QACX,cAAA,EAAa,KAAA;AAAA,QACb,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,GAAA;AAAA,UACV,UAAA;AAAA,UACA,GAAG;AAAA,SACL;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO;AAAA,cACL,MAAA,EAAQ,CAAA;AAAA,cACR,YAAA,EAAc,CAAA;AAAA,cACd,UAAA,EAAY,SAAA;AAAA,cACZ,SAAA,EAAW;AAAA;AACb;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,IAAS,CAAC,IAAA,EAAM,OAAO,IAAA;AAE3B,EAAA,MAAM,OAAA,GACJ,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAS,GAAG,CAAA,GAAI,CAAA;AAChE,EAAA,MAAM,QACJ,OAAA,IAAW,EAAA,GAAK,UAAA,GAAa,OAAA,IAAW,KAAK,SAAA,GAAY,QAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAEhC,EAAA,IAAI,YAAY,SAAA,EAAW;AACzB,IAAA,MAAM,YAAA,GAA8B;AAAA,MAClC,UAAA;AAAA,MACA,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,OAAO,MAAA,CAAO,EAAA;AAAA,MACd,YAAY,MAAA,CAAO,EAAA;AAAA,MACnB,OAAA,EAAS,SAAA;AAAA,MACT,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,EAAY,QAAA;AAAA,MACZ,GAAG;AAAA,KACL;AACA,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,aAAA;AAAA,QACX,cAAA,EAAa,SAAA;AAAA,QACb,YAAA,EAAY,KAAA;AAAA,QACZ,SAAA;AAAA,QACA,KAAA,EAAO,YAAA;AAAA,QACN,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,KAAK,cAAA,EAAe;AAAA,UAAE,GAAA;AAAA,UAAE,IAAA,CAAK,MAAM,cAAA;AAAe;AAAA;AAAA,KAC1D;AAAA,EAEJ;AAEA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,MAAM,IAAA,GAAO,EAAA;AACb,IAAA,MAAM,WAAA,GAAc,CAAA;AACpB,IAAA,MAAM,MAAA,GAAA,CAAU,OAAO,WAAA,IAAe,CAAA;AACtC,IAAA,MAAM,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,MAAA;AACpC,IAAA,MAAM,MAAA,GAAS,aAAA,GAAiB,OAAA,GAAU,GAAA,GAAO,aAAA;AAEjD,IAAA,MAAM,cAAA,GAAgC;AAAA,MACpC,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,UAAA;AAAA,MACA,GAAG;AAAA,KACL;AAEA,IAAA,MAAMC,WAAAA,GAA4B;AAAA,MAChC,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,CAAA;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,CAAA;AAAA,MACZ,OAAO,MAAA,CAAO;AAAA,KAChB;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,aAAA;AAAA,QACX,cAAA,EAAa,MAAA;AAAA,QACb,YAAA,EAAY,KAAA;AAAA,QACZ,SAAA;AAAA,QACA,KAAA,EAAO,cAAA;AAAA,QACN,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,cAC5B,KAAA,EAAO,IAAA;AAAA,cACP,MAAA,EAAQ,IAAA;AAAA,cACR,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAS,WAAW,gBAAA,EAAiB;AAAA,cAEvD,QAAA,EAAA;AAAA,gCAAAD,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAI,IAAA,GAAO,CAAA;AAAA,oBACX,IAAI,IAAA,GAAO,CAAA;AAAA,oBACX,CAAA,EAAG,MAAA;AAAA,oBACH,IAAA,EAAK,MAAA;AAAA,oBACL,QAAQ,MAAA,CAAO,OAAA;AAAA,oBACf;AAAA;AAAA,iBACF;AAAA,gCACAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAI,IAAA,GAAO,CAAA;AAAA,oBACX,IAAI,IAAA,GAAO,CAAA;AAAA,oBACX,CAAA,EAAG,MAAA;AAAA,oBACH,IAAA,EAAK,MAAA;AAAA,oBACL,QAAQ,MAAA,CAAO,EAAA;AAAA,oBACf,WAAA;AAAA,oBACA,eAAA,EAAiB,aAAA;AAAA,oBACjB,gBAAA,EAAkB,MAAA;AAAA,oBAClB,aAAA,EAAc,OAAA;AAAA,oBACd,KAAA,EAAO,EAAE,UAAA,EAAY,6BAAA;AAA8B;AAAA;AACrD;AAAA;AAAA,WACF;AAAA,0BACA,IAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAW,mBAAA,EAAoB,OAAOC,WAAAA,EAC1C,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,cAAA,OAAA;AAAA,cAAQ;AAAA,aAAA,EAAC,CAAA;AAAA,4BAChBD,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO;AAAA,kBACL,QAAA,EAAU,EAAA;AAAA,kBACV,UAAA,EAAY,GAAA;AAAA,kBACZ,KAAA,EAAO,SAAA;AAAA,kBACP,SAAA,EAAW;AAAA,iBACb;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAA,GAA2B;AAAA,IAC/B,UAAA;AAAA,IACA,QAAA,EAAU,GAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ,mBAAA;AAAA,IACR,YAAA,EAAc,EAAA;AAAA,IACd,OAAA,EAAS,WAAA;AAAA,IACT,SAAA,EAAW,wDAAA;AAAA,IACX,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,WAAA,GAA6B;AAAA,IACjC,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB,eAAA;AAAA,IAChB,UAAA,EAAY,UAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAEA,EAAA,MAAM,UAAA,GAA4B;AAAA,IAChC,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,MAAM,UAAA,GAA4B;AAAA,IAChC,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,OAAO,MAAA,CAAO;AAAA,GAChB;AAEA,EAAA,MAAM,UAAA,GAA4B;AAAA,IAChC,MAAA,EAAQ,CAAA;AAAA,IACR,YAAA,EAAc,CAAA;AAAA,IACd,YAAY,MAAA,CAAO,OAAA;AAAA,IACnB,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,SAAA,GAA2B;AAAA,IAC/B,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,CAAA;AAAA,IACd,YAAY,MAAA,CAAO,EAAA;AAAA,IACnB,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAChC,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,aAAA;AAAA,MACX,cAAA,EAAa,KAAA;AAAA,MACb,YAAA,EAAY,KAAA;AAAA,MACZ,SAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAO,WAAA,EACV,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAW,mBAAA,EAAoB,KAAA,EAAO,UAAA,EACzC,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,KAAK,cAAA,EAAe;AAAA,YAAE,KAAA;AAAA,YAAI,IAAA,CAAK,MAAM,cAAA;AAAe,WAAA,EAC5D,CAAA;AAAA,0BACA,IAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,UAAA,EAAa,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAQ;AAAA,WAAA,EAAC;AAAA,SAAA,EACrC,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAW,qBAAoB,KAAA,EAAO,UAAA,EACzC,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAW,kBAAA,EAAmB,KAAA,EAAO,WAAW,CAAA,EACvD;AAAA;AAAA;AAAA,GACF;AAEJ;AC9RA,IAAME,WAAAA,GACJ,uGAAA;AAEF,IAAM,cAAA,GAA4E;AAAA,EAChF,QAAY,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,yBAAA,EAA4B,MAAM,SAAA,EAAU;AAAA,EAC9E,UAAY,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,0BAAA,EAA4B,MAAM,SAAA,EAAU;AAAA,EAC9E,UAAY,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,0BAAA,EAA4B,MAAM,SAAA,EAAU;AAAA,EAC9E,UAAY,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,2BAAA,EAA6B,MAAM,SAAA,EAAU;AAAA,EAC/E,QAAY,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,yBAAA,EAA4B,MAAM,SAAA,EAAU;AAAA,EAC9E,YAAY,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,0BAAA,EAA4B,MAAM,SAAA;AACtE,CAAA;AACA,IAAM,sBAAsB,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,0BAAA,EAA4B,MAAM,SAAA,EAAU;AAE9F,SAAS,gBAAgB,MAAA,EAAgB;AACvC,EAAA,OAAO,cAAA,CAAe,MAAM,CAAA,IAAK,mBAAA;AACnC;AAEA,IAAIC,sBAAAA,GAAwB,KAAA;AAC5B,SAASC,gBAAAA,GAAkB;AACzB,EAAA,IAAID,sBAAAA,IAAyB,OAAO,QAAA,KAAa,WAAA,EAAa;AAC9D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,WAAA,GAAc,CAAA,yDAAA,CAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAC/B,EAAAA,sBAAAA,GAAwB,IAAA;AAC1B;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,OAAA,GAAU,MAAA;AAAA,EACV,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,KAAU,OAAA,EAAQ;AAE3C,EAAA,IAAI,SAAA,EAAW;AACb,IAAAC,gBAAAA,EAAgB;AAChB,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,uBACEJ,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,YAAA;AAAA,UACX,cAAA,EAAa,MAAA;AAAA,UACb,SAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,cAAA;AAAA,YACT,KAAA,EAAO,EAAA;AAAA,YACP,MAAA,EAAQ,EAAA;AAAA,YACR,YAAA,EAAc,KAAA;AAAA,YACd,UAAA,EAAY,SAAA;AAAA,YACZ,SAAA,EAAW,uCAAA;AAAA,YACX,GAAG;AAAA,WACL;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,IAEJ;AACA,IAAA,uBACEA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,YAAA;AAAA,QACX,cAAA,EAAc,OAAA;AAAA,QACd,SAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,cAAA;AAAA,UACT,KAAA,EAAO,EAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,YAAA,EAAc,OAAA,KAAY,MAAA,GAAS,GAAA,GAAM,CAAA;AAAA,UACzC,UAAA,EAAY,SAAA;AAAA,UACZ,SAAA,EAAW,uCAAA;AAAA,UACX,GAAG;AAAA,SACL;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,IAAS,CAAC,IAAA,EAAM,OAAO,IAAA;AAE3B,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,OAAA,CAAQ,MAAM,GAAG,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,mBAAmB,CAAA;AACvD,EAAA,MAAM,WAAW,IAAA,CAAK,SAAA;AAEtB,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,MAAM,SAAA,GAA2B;AAAA,MAC/B,UAAA,EAAAE,WAAAA;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK,CAAA;AAAA,MACL,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,KAAA,EAAO,SAAA;AAAA,MACP,GAAG;AAAA,KACL;AACA,IAAA,MAAMG,SAAAA,GAA0B;AAAA,MAC9B,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,YAAA,EAAc,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,GAAA;AAAA,MACnB,UAAA,EAAY;AAAA,KACd;AACA,IAAA,uBACEC,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,YAAA;AAAA,QACX,cAAA,EAAa,MAAA;AAAA,QACb,eAAa,IAAA,CAAK,mBAAA;AAAA,QAClB,SAAA;AAAA,QACA,KAAA,EAAO,SAAA;AAAA,QACN,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOK,SAAAA,EAAU,eAAY,MAAA,EAAO,CAAA;AAAA,UACzC;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,MAAM,SAAA,GAA2B;AAAA,MAC/B,UAAA,EAAAH,WAAAA;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,KAAA,EAAO,EAAA;AAAA,MACP,MAAA,EAAQ,EAAA;AAAA,MACR,YAAA,EAAc,KAAA;AAAA,MACd,YAAY,MAAA,CAAO,EAAA;AAAA,MACnB,OAAO,MAAA,CAAO,IAAA;AAAA,MACd,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY,CAAA;AAAA,MACZ,GAAG;AAAA,KACL;AACA,IAAA,uBACEF,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,YAAA;AAAA,QACX,cAAA,EAAa,MAAA;AAAA,QACb,eAAa,IAAA,CAAK,mBAAA;AAAA,QAClB,SAAA;AAAA,QACA,KAAA,EAAO,SAAA;AAAA,QACP,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA,CAAA;AAAA,QACjC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA;AAAY;AAAA,KAClC;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAA,GAA2B;AAAA,IAC/B,UAAA,EAAAE,WAAAA;AAAA,IACA,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,UAAA,EAAY,GAAA;AAAA,IACZ,OAAO,MAAA,CAAO,IAAA;AAAA,IACd,YAAY,MAAA,CAAO,EAAA;AAAA,IACnB,OAAA,EAAS,UAAA;AAAA,IACT,YAAA,EAAc,GAAA;AAAA,IACd,UAAA,EAAY,QAAA;AAAA,IACZ,GAAG;AAAA,GACL;AACA,EAAA,MAAM,QAAA,GAA0B;AAAA,IAC9B,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,YAAY,MAAA,CAAO,GAAA;AAAA,IACnB,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,uBACEI,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,YAAA;AAAA,MACX,cAAA,EAAa,MAAA;AAAA,MACb,eAAa,IAAA,CAAK,mBAAA;AAAA,MAClB,SAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAN,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,QAAA,EAAU,eAAY,MAAA,EAAO,CAAA;AAAA,QACzC;AAAA;AAAA;AAAA,GACH;AAEJ;ACrLA,IAAME,WAAAA,GACJ,uGAAA;AAEF,IAAM,YAAA,GAAe,SAAA;AACrB,IAAM,YAAA,GAAe,SAAA;AAEd,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,OAAA,GAAU,MAAA;AAAA,EACV,UAAA,GAAa,UAAA;AAAA,EACb,OAAA,GAAU,0CAAA;AAAA,EACV,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,MAAA,CAAO,WAAW,EAAE,CAAA;AAEnD,EAAA,IAAI,SAAA,IAAa,OAAA,IAAW,CAAC,OAAA,EAAS,OAAO,IAAA;AAE7C,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,MAAM,WAAA,GAA6B;AAAA,MACjC,UAAA,EAAAA,WAAAA;AAAA,MACA,QAAA,EAAU,EAAA;AAAA,MACV,KAAA,EAAO,SAAA;AAAA,MACP,GAAG;AAAA,KACL;AACA,IAAA,MAAM,SAAA,GAA2B;AAAA,MAC/B,KAAA,EAAO,YAAA;AAAA,MACP,UAAA,EAAY,GAAA;AAAA,MACZ,cAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AACA,IAAA,uBACEI,IAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,gBAAA;AAAA,QACX,cAAA,EAAa,QAAA;AAAA,QACb,SAAA;AAAA,QACA,KAAA,EAAO,WAAA;AAAA,QACN,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,0BACDN,GAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,UAAA;AAAA,cACN,YAAA,EAAW,qBAAA;AAAA,cACX,KAAA,EAAO,SAAA;AAAA,cACP,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,gBAAC,CAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,cAAA,GAAiB,WAAA;AAAA,cAChE,CAAA;AAAA,cACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,gBAAC,CAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,cAAA,GAAiB,MAAA;AAAA,cAChE,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,MAAM,WAAA,GAA6B;AAAA,MACjC,UAAA,EAAAE,WAAAA;AAAA,MACA,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,eAAA;AAAA,MAChB,GAAA,EAAK,EAAA;AAAA,MACL,UAAA,EAAY,0BAAA;AAAA,MACZ,MAAA,EAAQ,oCAAA;AAAA,MACR,YAAA,EAAc,EAAA;AAAA,MACd,OAAA,EAAS,WAAA;AAAA,MACT,GAAG;AAAA,KACL;AACA,IAAA,MAAMK,SAAAA,GAA0B;AAAA,MAC9B,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AACA,IAAA,MAAMC,SAAAA,GAA0B;AAAA,MAC9B,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,KAAA,EAAO,SAAA;AAAA,MACP,UAAA,EAAY,YAAA;AAAA,MACZ,MAAA,EAAQ,MAAA;AAAA,MACR,YAAA,EAAc,CAAA;AAAA,MACd,OAAA,EAAS,UAAA;AAAA,MACT,cAAA,EAAgB,MAAA;AAAA,MAChB,MAAA,EAAQ,SAAA;AAAA,MACR,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AACA,IAAA,uBACEF,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,gBAAA;AAAA,QACX,cAAA,EAAa,QAAA;AAAA,QACb,SAAA;AAAA,QACA,KAAA,EAAO,WAAA;AAAA,QACN,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAN,IAAC,MAAA,EAAA,EAAK,YAAA,EAAW,wBAAA,EAAyB,KAAA,EAAOO,WAC9C,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,0BACAP,GAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,UAAA;AAAA,cACN,YAAA,EAAW,uBAAA;AAAA,cACX,KAAA,EAAOQ,SAAAA;AAAA,cACP,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,gBAAC,CAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,UAAA,GAAa,YAAA;AAAA,cAC5D,CAAA;AAAA,cACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,gBAAC,CAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,UAAA,GAAa,YAAA;AAAA,cAC5D,CAAA;AAAA,cACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAA,GAA2B;AAAA,IAC/B,UAAA,EAAAN,WAAAA;AAAA,IACA,QAAA,EAAU,GAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ,mBAAA;AAAA,IACR,YAAA,EAAc,EAAA;AAAA,IACd,OAAA,EAAS,EAAA;AAAA,IACT,SAAA,EAAW,wDAAA;AAAA,IACX,SAAA,EAAW,QAAA;AAAA,IACX,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,aAAA,GAA+B;AAAA,IACnC,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,YAAA,EAAc,EAAA;AAAA,IACd,UAAA,EAAY,0BAAA;AAAA,IACZ,YAAA,EAAc;AAAA,GAChB;AAEA,EAAA,MAAM,QAAA,GAA0B;AAAA,IAC9B,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,GAAA;AAAA,IACZ,MAAA,EAAQ,CAAA;AAAA,IACR,YAAA,EAAc;AAAA,GAChB;AAEA,EAAA,MAAM,QAAA,GAA0B;AAAA,IAC9B,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,YAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,EAAA;AAAA,IACd,OAAA,EAAS,WAAA;AAAA,IACT,cAAA,EAAgB,MAAA;AAAA,IAChB,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,uBAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,uBACEI,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,gBAAA;AAAA,MACX,cAAA,EAAa,MAAA;AAAA,MACb,SAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACN,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAW,wBAAA,EACd,QAAA,EAAA;AAAA,0BAAAN,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,aAAA,EACV,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,IAAA;AAAA,cACN,MAAA,EAAO,IAAA;AAAA,cACP,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAQ,YAAA;AAAA,cACR,WAAA,EAAY,GAAA;AAAA,cACZ,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cAEf,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iCAAA,EAAkC;AAAA;AAAA,WAC5C,EACF,CAAA;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,cAAW,wBAAA,EAAyB,KAAA,EAAO,UAC3C,QAAA,EAAA,OAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,UAAA;AAAA,YACN,YAAA,EAAW,uBAAA;AAAA,YACX,KAAA,EAAO,QAAA;AAAA,YACP,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,cAAC,CAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,UAAA,GAAa,YAAA;AAAA,YAC5D,CAAA;AAAA,YACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,cAAC,CAAA,CAAE,aAAA,CAAoC,KAAA,CAAM,UAAA,GAAa,YAAA;AAAA,YAC5D,CAAA;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ","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/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, CheckoutResult } 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<CheckoutResult> {\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) {\n const errorBody = await res.json().catch(() => ({}));\n throw new Error(errorBody.error || \"Failed to create checkout session\");\n }\n return res.json();\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\";\nimport type { CheckoutResult } from \"../types\";\n\nexport interface UseCheckoutResult {\n fetchClientSecret: (planCode: string, successUrl?: string) => Promise<string>;\n checkout: CheckoutResult | null;\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 const [checkout, setCheckout] = useState<CheckoutResult | null>(null);\n\n const fetchClientSecret = useCallback(\n async (planCode: string, successUrl?: string): Promise<string> => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await store.fetchCheckoutSecret(planCode, successUrl);\n setCheckout(result);\n return result.client_secret;\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, checkout, 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nozle-js/react",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",