@monetizekit/react 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +423 -107
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +66 -7
- package/dist/index.d.ts +66 -7
- package/dist/index.js +417 -108
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/client.ts","../src/theme/tokens.ts","../src/provider.tsx","../src/hooks.ts","../src/lib/format.ts","../src/components/PricingTable.tsx","../src/components/Paywall.tsx","../src/components/UsageBanner.tsx","../src/components/CustomerPortal.tsx","../src/components/EntitlementGate.tsx"],"names":["createContext","useMemo","jsx","useContext","useState","useEffect","jsxs","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Minimal fetch client for the MonetizeKit public API. Uses a publishable key\n * (pk_*) as a Bearer token; safe for browser use against allowlisted origins.\n */\nexport interface MonetizeKitClientConfig {\n publishableKey: string;\n baseUrl: string;\n customerToken?: string;\n}\n\nexport class MonetizeKitClient {\n constructor(private readonly config: MonetizeKitClientConfig) {}\n\n private async get<T>(path: string): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.publishableKey}`,\n };\n if (this.config.customerToken) {\n headers[\"X-Customer-Token\"] = this.config.customerToken;\n }\n const res = await fetch(`${this.config.baseUrl}${path}`, { headers });\n if (!res.ok) {\n throw new Error(`MonetizeKit API ${res.status} for ${path}`);\n }\n return (await res.json()) as T;\n }\n\n listPlans<T>(): Promise<T> {\n return this.get<T>(\"/api/v1/plans?page=1&pageSize=100\");\n }\n\n getEntitlement<T>(customerId: string, featureKey: string): Promise<T> {\n return this.get<T>(`/api/v1/entitlements/${customerId}/${encodeURIComponent(featureKey)}`);\n }\n\n getUsage<T>(customerId: string, meterId: string): Promise<T> {\n return this.get<T>(`/api/v1/usage/${customerId}/${encodeURIComponent(meterId)}`);\n }\n\n getCredits<T>(customerId: string): Promise<T> {\n return this.get<T>(`/api/v1/credits/${customerId}`);\n }\n}\n","/**\n * Appearance/theme token contract for MonetizeKit components. Components consume\n * CSS custom properties derived from these tokens, so a host app can pass a\n * preset name, a partial token override, or both.\n *\n * Presets:\n * - `memphis` — the marketing site identity (coral/yellow/cyan, sharp corners)\n * - `dashboard` — the app's neutral palette (rounded, muted)\n * - `light` / `dark` — neutral defaults\n */\nimport type { CSSProperties } from \"react\";\n\nexport interface ThemeTokens {\n colorBackground: string;\n colorForeground: string;\n colorMuted: string;\n colorPrimary: string;\n colorPrimaryForeground: string;\n colorAccent: string;\n colorBorder: string;\n radius: string;\n fontFamily: string;\n}\n\nexport type ThemePresetName = \"light\" | \"dark\" | \"memphis\" | \"dashboard\";\n\nexport const THEME_PRESETS: Record<ThemePresetName, ThemeTokens> = {\n light: {\n colorBackground: \"#ffffff\",\n colorForeground: \"#0a0a0a\",\n colorMuted: \"#71717a\",\n colorPrimary: \"#4f46e5\",\n colorPrimaryForeground: \"#ffffff\",\n colorAccent: \"#10b981\",\n colorBorder: \"#e4e4e7\",\n radius: \"0.5rem\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n dark: {\n colorBackground: \"#0a0a0a\",\n colorForeground: \"#fafafa\",\n colorMuted: \"#a1a1aa\",\n colorPrimary: \"#6366f1\",\n colorPrimaryForeground: \"#0a0a0a\",\n colorAccent: \"#10b981\",\n colorBorder: \"#27272a\",\n radius: \"0.5rem\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n memphis: {\n colorBackground: \"#FFFEF2\",\n colorForeground: \"#1a1a1a\",\n colorMuted: \"#5b5b52\",\n colorPrimary: \"#FF6B35\",\n colorPrimaryForeground: \"#1a1a1a\",\n colorAccent: \"#00D9FF\",\n colorBorder: \"#1a1a1a\",\n radius: \"0\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n dashboard: {\n colorBackground: \"oklch(1 0 0)\",\n colorForeground: \"oklch(0.145 0 0)\",\n colorMuted: \"oklch(0.556 0 0)\",\n colorPrimary: \"oklch(0.205 0 0)\",\n colorPrimaryForeground: \"oklch(0.985 0 0)\",\n colorAccent: \"oklch(0.97 0 0)\",\n colorBorder: \"oklch(0.922 0 0)\",\n radius: \"0.625rem\",\n fontFamily: \"Geist, system-ui, sans-serif\",\n },\n};\n\nexport type Appearance =\n | ThemePresetName\n | { preset?: ThemePresetName; tokens?: Partial<ThemeTokens> };\n\n/** Resolve an appearance prop into a concrete token set. */\nexport function resolveTokens(appearance: Appearance = \"light\"): ThemeTokens {\n if (typeof appearance === \"string\") {\n return THEME_PRESETS[appearance];\n }\n const base = THEME_PRESETS[appearance.preset ?? \"light\"];\n return { ...base, ...appearance.tokens };\n}\n\nconst TOKEN_TO_CSS_VAR: Record<keyof ThemeTokens, string> = {\n colorBackground: \"--mk-bg\",\n colorForeground: \"--mk-fg\",\n colorMuted: \"--mk-muted\",\n colorPrimary: \"--mk-primary\",\n colorPrimaryForeground: \"--mk-primary-fg\",\n colorAccent: \"--mk-accent\",\n colorBorder: \"--mk-border\",\n radius: \"--mk-radius\",\n fontFamily: \"--mk-font\",\n};\n\n/** Convert tokens into a CSS custom-property style object for a wrapper element. */\nexport function tokensToStyle(tokens: ThemeTokens): CSSProperties {\n const style: Record<string, string> = {};\n (Object.keys(tokens) as (keyof ThemeTokens)[]).forEach((key) => {\n style[TOKEN_TO_CSS_VAR[key]] = String(tokens[key]);\n });\n return style as CSSProperties;\n}\n\n","import {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { MonetizeKitClient } from \"./lib/client\";\nimport {\n resolveTokens,\n type Appearance,\n type ThemeTokens,\n} from \"./theme/tokens\";\n\nexport interface MonetizeKitContextValue {\n client: MonetizeKitClient;\n customerId?: string;\n appearance: Appearance;\n tokens: ThemeTokens;\n}\n\nconst MonetizeKitContext = createContext<MonetizeKitContextValue | null>(null);\n\nexport interface MonetizeKitProviderProps {\n /** Browser-safe publishable key (pk_*). */\n publishableKey: string;\n /** API origin, e.g. https://app.monetizekit.app. */\n baseUrl: string;\n /** Optional customer JWT for customer-scoped reads (entitlements/usage/credits). */\n customerToken?: string;\n /** Customer id for entitlement/usage/credit hooks. */\n customerId?: string;\n /** Theme preset name or token overrides. */\n appearance?: Appearance;\n children: ReactNode;\n}\n\nexport function MonetizeKitProvider({\n publishableKey,\n baseUrl,\n customerToken,\n customerId,\n appearance = \"light\",\n children,\n}: MonetizeKitProviderProps) {\n const value = useMemo<MonetizeKitContextValue>(() => {\n return {\n client: new MonetizeKitClient({ publishableKey, baseUrl, customerToken }),\n customerId,\n appearance,\n tokens: resolveTokens(appearance),\n };\n }, [publishableKey, baseUrl, customerToken, customerId, appearance]);\n\n return (\n <MonetizeKitContext.Provider value={value}>\n {children}\n </MonetizeKitContext.Provider>\n );\n}\n\nexport function useMonetizeKit(): MonetizeKitContextValue {\n const ctx = useContext(MonetizeKitContext);\n if (!ctx) {\n throw new Error(\"useMonetizeKit must be used within a <MonetizeKitProvider>.\");\n }\n return ctx;\n}\n","import { useEffect, useState } from \"react\";\nimport { useMonetizeKit } from \"./provider\";\nimport type { CreditBalance, EntitlementResult, UsageResult } from \"./types\";\n\ninterface AsyncState<T> {\n data: T | null;\n loading: boolean;\n error: Error | null;\n}\n\nfunction useAsync<T>(\n run: () => Promise<T> | null,\n deps: unknown[],\n): AsyncState<T> {\n const [state, setState] = useState<AsyncState<T>>({\n data: null,\n loading: true,\n error: null,\n });\n\n useEffect(() => {\n let active = true;\n const promise = run();\n if (!promise) {\n setState({ data: null, loading: false, error: null });\n return;\n }\n setState((prev) => ({ ...prev, loading: true, error: null }));\n promise\n .then((data) => {\n if (active) setState({ data, loading: false, error: null });\n })\n .catch((error: unknown) => {\n if (active) {\n setState({\n data: null,\n loading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n });\n return () => {\n active = false;\n };\n }, deps);\n\n return state;\n}\n\n/** Resolve a single feature entitlement for the provider's customer. */\nexport function useEntitlement(featureKey: string) {\n const { client, customerId } = useMonetizeKit();\n const state = useAsync<EntitlementResult>(\n () =>\n customerId\n ? client.getEntitlement<EntitlementResult>(customerId, featureKey)\n : null,\n [client, customerId, featureKey],\n );\n return {\n value: state.data?.value ?? null,\n allowed: state.data?.allowed ?? false,\n loading: state.loading,\n error: state.error,\n };\n}\n\n/** Resolve current usage for a meter. */\nexport function useUsage(meterId: string) {\n const { client, customerId } = useMonetizeKit();\n const state = useAsync<UsageResult>(\n () => (customerId ? client.getUsage<UsageResult>(customerId, meterId) : null),\n [client, customerId, meterId],\n );\n return {\n current: state.data?.current ?? 0,\n limit: state.data?.limit ?? null,\n loading: state.loading,\n error: state.error,\n };\n}\n\n/** Resolve the customer's credit balance. */\nexport function useCredits() {\n const { client, customerId } = useMonetizeKit();\n const state = useAsync<CreditBalance>(\n () => (customerId ? client.getCredits<CreditBalance>(customerId) : null),\n [client, customerId],\n );\n return {\n balance: state.data?.balance ?? 0,\n currency: state.data?.currency,\n loading: state.loading,\n error: state.error,\n };\n}\n","import type { Plan, PricingTerm } from \"../types\";\n\n/** Format a monetary amount with Intl, honoring locale + currency. */\nexport function formatMoney(\n amount: number,\n currency = \"USD\",\n locale?: string,\n): string {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n minimumFractionDigits: Number.isInteger(amount) ? 0 : 2,\n maximumFractionDigits: amount < 1 ? 3 : 2,\n }).format(amount);\n}\n\n/** Format a large unit count compactly (e.g. 5,000 / 1M). */\nexport function formatUnits(value: number, locale?: string): string {\n return new Intl.NumberFormat(locale, {\n notation: value >= 10_000 ? \"compact\" : \"standard\",\n maximumFractionDigits: 1,\n }).format(value);\n}\n\nexport interface PriceDisplay {\n /** Headline price string, or null for contact-sales. */\n headline: string | null;\n /** Secondary line (e.g. \"+ usage\" or billing interval). */\n caption?: string;\n contactSales: boolean;\n}\n\nconst INTERVAL_SUFFIX: Record<PricingTerm[\"interval\"], string> = {\n monthly: \"/mo\",\n annually: \"/yr\",\n one_time: \"\",\n};\n\n/**\n * Derive a display from a plan's pricing terms. Returns a contact-sales display\n * when the plan is tagged `contact_sales` or has no public price; renders a\n * \"from $base + usage\" headline when metered usage terms are present.\n */\nexport function describePlanPrice(\n plan: Plan,\n locale?: string,\n): PriceDisplay {\n const pricing = plan.pricing ?? [];\n const contactSales =\n (plan.tags ?? []).includes(\"contact_sales\") || pricing.length === 0;\n if (contactSales) {\n return { headline: null, contactSales: true };\n }\n\n const base = pricing.find((t) => t.type === \"flat\");\n const hasUsage = pricing.some((t) => t.type === \"usage\");\n const currency = base?.currency ?? pricing[0]?.currency ?? \"USD\";\n const interval = base?.interval ?? pricing[0]?.interval ?? \"monthly\";\n const baseAmount = base?.amount ?? 0;\n\n const headline = `${formatMoney(baseAmount, currency, locale)}${INTERVAL_SUFFIX[interval]}`;\n return {\n headline,\n caption: hasUsage ? \"+ usage\" : undefined,\n contactSales: false,\n };\n}\n\n/** Human-readable description of a usage term's metered tiers. */\nexport function describeUsageTerm(term: PricingTerm, locale?: string): string {\n const parts: string[] = [];\n if (term.includedUnits && term.includedUnits > 0) {\n parts.push(`${formatUnits(term.includedUnits, locale)} ${term.meterDisplayName ?? \"units\"} included`);\n }\n const tiers = term.tieredPricing ?? [];\n if (tiers.length > 0) {\n const first = tiers[0]!;\n parts.push(\n `then ${formatMoney(first.unitPrice, term.currency, locale)}/unit${\n term.tierMode === \"volume\" ? \" (volume)\" : \"\"\n }`,\n );\n }\n return parts.join(\", \");\n}\n","import { useEffect, useState, type CSSProperties } from \"react\";\nimport { useMonetizeKit } from \"../provider\";\nimport { tokensToStyle } from \"../theme/tokens\";\nimport { describePlanPrice } from \"../lib/format\";\nimport type { Plan } from \"../types\";\n\nexport interface PricingTableProps {\n /** Plans to render; if omitted, fetched live from the publishable-key API. */\n plans?: Plan[];\n /** Plan name to highlight as \"Most Popular\". */\n highlightPlan?: string;\n billingCycle?: \"monthly\" | \"annually\";\n locale?: string;\n onSelectPlan?: (planId: string) => void;\n /** Where the Contact Sales CTA links (defaults to no-op). */\n onContactSales?: (planId: string) => void;\n}\n\nconst wrapperStyle: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(240px, 1fr))\",\n gap: \"1.5rem\",\n background: \"var(--mk-bg)\",\n color: \"var(--mk-fg)\",\n fontFamily: \"var(--mk-font)\",\n};\n\nconst cardBase: CSSProperties = {\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"1.5rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.75rem\",\n};\n\nexport function PricingTable({\n plans: plansProp,\n highlightPlan,\n locale,\n onSelectPlan,\n onContactSales,\n}: PricingTableProps) {\n const { client, tokens } = useMonetizeKit();\n const [plans, setPlans] = useState<Plan[] | null>(plansProp ?? null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (plansProp) {\n setPlans(plansProp);\n return;\n }\n let active = true;\n client\n .listPlans<{ data: Plan[] }>()\n .then((res) => {\n if (active) setPlans(res.data ?? []);\n })\n .catch((e: unknown) => {\n if (active) setError(e instanceof Error ? e : new Error(String(e)));\n });\n return () => {\n active = false;\n };\n }, [client, plansProp]);\n\n if (error) {\n return <div role=\"alert\" style={{ color: \"var(--mk-muted)\" }}>Unable to load pricing.</div>;\n }\n if (!plans) {\n return <div aria-busy=\"true\" style={{ color: \"var(--mk-muted)\" }}>Loading pricing…</div>;\n }\n\n return (\n <div style={{ ...tokensToStyle(tokens), ...wrapperStyle }} data-mk-component=\"pricing-table\">\n {plans.map((plan) => {\n const price = describePlanPrice(plan, locale);\n const highlighted =\n highlightPlan != null &&\n plan.name.toLowerCase() === highlightPlan.toLowerCase();\n return (\n <div\n key={plan.id}\n style={{\n ...cardBase,\n borderColor: highlighted ? \"var(--mk-primary)\" : \"var(--mk-border)\",\n borderWidth: highlighted ? 2 : 1,\n }}\n data-mk-plan={plan.name}\n data-mk-highlighted={highlighted ? \"true\" : undefined}\n >\n {highlighted ? (\n <span\n style={{\n alignSelf: \"flex-start\",\n background: \"var(--mk-primary)\",\n color: \"var(--mk-primary-fg)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.125rem 0.5rem\",\n fontSize: \"0.75rem\",\n fontWeight: 600,\n }}\n >\n Most Popular\n </span>\n ) : null}\n <h3 style={{ margin: 0, fontSize: \"1.25rem\", fontWeight: 700 }}>{plan.name}</h3>\n {plan.description ? (\n <p style={{ margin: 0, color: \"var(--mk-muted)\", fontSize: \"0.875rem\" }}>\n {plan.description}\n </p>\n ) : null}\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: \"0.375rem\" }}>\n <span style={{ fontSize: \"2rem\", fontWeight: 700 }}>\n {price.contactSales ? \"Custom\" : price.headline}\n </span>\n {price.caption ? (\n <span style={{ color: \"var(--mk-muted)\", fontSize: \"0.875rem\" }}>\n {price.caption}\n </span>\n ) : null}\n </div>\n {plan.entitlements && plan.entitlements.length > 0 ? (\n <ul style={{ margin: 0, paddingLeft: \"1rem\", color: \"var(--mk-fg)\", fontSize: \"0.875rem\" }}>\n {plan.entitlements.slice(0, 6).map((e) => (\n <li key={e.featureKey}>\n {e.featureDisplayName}\n {e.type !== \"boolean\" ? `: ${String(e.value)}` : \"\"}\n </li>\n ))}\n </ul>\n ) : null}\n <button\n type=\"button\"\n onClick={() =>\n price.contactSales\n ? onContactSales?.(plan.id)\n : onSelectPlan?.(plan.id)\n }\n style={{\n marginTop: \"auto\",\n background: \"var(--mk-primary)\",\n color: \"var(--mk-primary-fg)\",\n border: \"none\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.625rem 1rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {price.contactSales ? \"Contact Sales\" : \"Get started\"}\n </button>\n </div>\n );\n })}\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode } from \"react\";\nimport { useEntitlement } from \"../hooks\";\nimport { useMonetizeKit } from \"../provider\";\nimport { tokensToStyle } from \"../theme/tokens\";\n\nexport interface PaywallProps {\n /** Feature key gating the content. */\n feature: string;\n /** Protected content, shown when entitled. */\n children: ReactNode;\n title?: string;\n description?: string;\n ctaLabel?: string;\n onUpgrade?: () => void;\n}\n\nconst overlayStyle: CSSProperties = {\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"2rem\",\n textAlign: \"center\",\n background: \"var(--mk-bg)\",\n color: \"var(--mk-fg)\",\n fontFamily: \"var(--mk-font)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.75rem\",\n alignItems: \"center\",\n};\n\n/** Gate content behind an entitlement, showing an upgrade prompt when locked. */\nexport function Paywall({\n feature,\n children,\n title = \"Upgrade to unlock this feature\",\n description = \"This feature isn't included in your current plan.\",\n ctaLabel = \"Upgrade\",\n onUpgrade,\n}: PaywallProps) {\n const { allowed, loading } = useEntitlement(feature);\n const { tokens } = useMonetizeKit();\n\n if (loading) {\n return <div aria-busy=\"true\" style={{ color: \"var(--mk-muted)\" }}>Checking access…</div>;\n }\n if (allowed) {\n return <>{children}</>;\n }\n\n return (\n <div style={{ ...tokensToStyle(tokens), ...overlayStyle }} data-mk-component=\"paywall\">\n <h3 style={{ margin: 0, fontSize: \"1.125rem\", fontWeight: 700 }}>{title}</h3>\n <p style={{ margin: 0, color: \"var(--mk-muted)\", fontSize: \"0.875rem\" }}>{description}</p>\n <button\n type=\"button\"\n onClick={onUpgrade}\n style={{\n background: \"var(--mk-primary)\",\n color: \"var(--mk-primary-fg)\",\n border: \"none\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.625rem 1.25rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {ctaLabel}\n </button>\n </div>\n );\n}\n","import { type CSSProperties } from \"react\";\nimport { useUsage } from \"../hooks\";\nimport { useMonetizeKit } from \"../provider\";\nimport { tokensToStyle } from \"../theme/tokens\";\nimport { formatUnits } from \"../lib/format\";\n\nexport interface UsageBannerProps {\n /** Meter to display usage for. */\n meterId: string;\n label?: string;\n locale?: string;\n /** Fraction (0-1) at which the banner switches to a warning style. */\n warnAt?: number;\n}\n\nconst bannerStyle: CSSProperties = {\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.875rem 1rem\",\n background: \"var(--mk-bg)\",\n color: \"var(--mk-fg)\",\n fontFamily: \"var(--mk-font)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n};\n\n/** Show current usage vs allotment for a capacity meter, with overage hint. */\nexport function UsageBanner({\n meterId,\n label = \"Usage\",\n locale,\n warnAt = 0.8,\n}: UsageBannerProps) {\n const { current, limit, loading } = useUsage(meterId);\n const { tokens } = useMonetizeKit();\n\n if (loading) {\n return <div aria-busy=\"true\" style={{ color: \"var(--mk-muted)\" }}>Loading usage…</div>;\n }\n\n const hasLimit = typeof limit === \"number\" && limit > 0;\n const fraction = hasLimit ? Math.min(1, current / (limit as number)) : 0;\n const over = hasLimit && current > (limit as number);\n const warn = hasLimit && fraction >= warnAt;\n const barColor = over || warn ? \"var(--mk-primary)\" : \"var(--mk-accent)\";\n\n return (\n <div style={{ ...tokensToStyle(tokens), ...bannerStyle }} data-mk-component=\"usage-banner\">\n <div style={{ display: \"flex\", justifyContent: \"space-between\", fontSize: \"0.875rem\" }}>\n <span style={{ fontWeight: 600 }}>{label}</span>\n <span style={{ color: \"var(--mk-muted)\" }}>\n {formatUnits(current, locale)}\n {hasLimit ? ` / ${formatUnits(limit as number, locale)}` : \"\"}\n </span>\n </div>\n {hasLimit ? (\n <div\n style={{\n height: 6,\n borderRadius: 999,\n background: \"var(--mk-border)\",\n overflow: \"hidden\",\n }}\n role=\"progressbar\"\n aria-valuenow={Math.round(fraction * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div style={{ width: `${fraction * 100}%`, height: \"100%\", background: barColor }} />\n </div>\n ) : null}\n {over ? (\n <span style={{ color: \"var(--mk-primary)\", fontSize: \"0.75rem\" }}>\n Over included allotment — overage billed per usage pricing.\n </span>\n ) : null}\n </div>\n );\n}\n","import { type CSSProperties } from \"react\";\nimport { useCredits } from \"../hooks\";\nimport { useMonetizeKit } from \"../provider\";\nimport { tokensToStyle } from \"../theme/tokens\";\nimport { formatMoney } from \"../lib/format\";\nimport { UsageBanner } from \"./UsageBanner\";\n\nexport interface CustomerPortalProps {\n /** Current plan name to display. */\n planName?: string;\n /** Meters to surface usage for. */\n meterIds?: string[];\n /** Whether to show the credit balance card. */\n showCredits?: boolean;\n locale?: string;\n currency?: string;\n onManageBilling?: () => void;\n}\n\nconst containerStyle: CSSProperties = {\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"1.25rem\",\n background: \"var(--mk-bg)\",\n color: \"var(--mk-fg)\",\n fontFamily: \"var(--mk-font)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1rem\",\n maxWidth: 480,\n};\n\n/** A self-service portal: current plan, usage meters, and credit balance. */\nexport function CustomerPortal({\n planName = \"Current plan\",\n meterIds = [],\n showCredits = true,\n locale,\n currency = \"USD\",\n onManageBilling,\n}: CustomerPortalProps) {\n const { tokens } = useMonetizeKit();\n const credits = useCredits();\n\n return (\n <div style={{ ...tokensToStyle(tokens), ...containerStyle }} data-mk-component=\"customer-portal\">\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <div>\n <div style={{ fontSize: \"0.75rem\", color: \"var(--mk-muted)\" }}>Plan</div>\n <div style={{ fontSize: \"1.125rem\", fontWeight: 700 }}>{planName}</div>\n </div>\n <button\n type=\"button\"\n onClick={onManageBilling}\n style={{\n background: \"var(--mk-primary)\",\n color: \"var(--mk-primary-fg)\",\n border: \"none\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.5rem 0.875rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n Manage billing\n </button>\n </div>\n\n {meterIds.map((meterId) => (\n <UsageBanner key={meterId} meterId={meterId} label={meterId} locale={locale} />\n ))}\n\n {showCredits ? (\n <div\n style={{\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.875rem 1rem\",\n display: \"flex\",\n justifyContent: \"space-between\",\n }}\n >\n <span style={{ fontWeight: 600, fontSize: \"0.875rem\" }}>Credits</span>\n <span style={{ color: \"var(--mk-muted)\" }}>\n {credits.loading\n ? \"…\"\n : formatMoney(credits.balance, credits.currency ?? currency, locale)}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useEntitlement } from \"../hooks\";\n\nexport interface EntitlementGateProps {\n /** Feature key to check for the provider's customer. */\n feature: string;\n /** Rendered when the customer is entitled. */\n children: ReactNode;\n /** Rendered when not entitled (defaults to nothing). */\n fallback?: ReactNode;\n /** Rendered while the entitlement check is loading. */\n loadingFallback?: ReactNode;\n}\n\n/** Conditionally render children based on a live entitlement check. */\nexport function EntitlementGate({\n feature,\n children,\n fallback = null,\n loadingFallback = null,\n}: EntitlementGateProps) {\n const { allowed, loading } = useEntitlement(feature);\n if (loading) return <>{loadingFallback}</>;\n return <>{allowed ? children : fallback}</>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/client.ts","../src/theme/tokens.ts","../src/provider.tsx","../src/hooks.ts","../src/lib/format.ts","../src/lib/sample-data.ts","../src/components/SampleNotice.tsx","../src/components/PricingTable.tsx","../src/components/Paywall.tsx","../src/components/UsageBanner.tsx","../src/components/CustomerPortal.tsx","../src/components/EntitlementGate.tsx"],"names":["createContext","useMemo","jsx","useContext","useState","useEffect","jsxs","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Minimal fetch client for the MonetizeKit public API. Uses a publishable key\n * (pk_*) as a Bearer token; safe for browser use against allowlisted origins.\n */\nexport interface MonetizeKitClientConfig {\n publishableKey: string;\n baseUrl: string;\n customerToken?: string;\n}\n\nexport class MonetizeKitClient {\n constructor(private readonly config: MonetizeKitClientConfig) {}\n\n private async get<T>(path: string): Promise<T> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.publishableKey}`,\n };\n if (this.config.customerToken) {\n headers[\"X-Customer-Token\"] = this.config.customerToken;\n }\n const res = await fetch(`${this.config.baseUrl}${path}`, { headers });\n if (!res.ok) {\n throw new Error(`MonetizeKit API ${res.status} for ${path}`);\n }\n return (await res.json()) as T;\n }\n\n listPlans<T>(): Promise<T> {\n return this.get<T>(\"/api/v1/plans?page=1&pageSize=100\");\n }\n\n getEntitlement<T>(customerId: string, featureKey: string): Promise<T> {\n return this.get<T>(`/api/v1/entitlements/${customerId}/${encodeURIComponent(featureKey)}`);\n }\n\n getUsage<T>(customerId: string, meterId: string): Promise<T> {\n return this.get<T>(`/api/v1/usage/${customerId}/${encodeURIComponent(meterId)}`);\n }\n\n getCredits<T>(customerId: string): Promise<T> {\n return this.get<T>(`/api/v1/credits/${customerId}`);\n }\n}\n","/**\n * Appearance/theme token contract for MonetizeKit components. Components consume\n * CSS custom properties derived from these tokens, so a host app can pass a\n * preset name, a partial token override, or both.\n *\n * Presets:\n * - `light` / `dark` — neutral defaults\n * - `memphis` — the marketing site identity (coral/yellow/cyan, hard edges + hard shadow)\n * - `dashboard` — the app's neutral palette (rounded, muted)\n * - `console` — the dashboard \"widgets\" mock look: dark cards, emerald/amber/red\n * semantics, soft elevation. Lets you reproduce the in-app preview style.\n * - `midnight` — deep slate/indigo dark\n * - `ocean` / `forest` / `sunset` / `grape` — light brand palettes for variety\n */\nimport type { CSSProperties } from \"react\";\n\nexport interface ThemeTokens {\n colorBackground: string;\n colorForeground: string;\n colorMuted: string;\n colorPrimary: string;\n colorPrimaryForeground: string;\n colorAccent: string;\n colorBorder: string;\n /** Surface color for cards/panels layered on the background. */\n colorCard: string;\n /** Foreground used on top of `colorCard`. */\n colorCardForeground: string;\n /** Semantic colors for status (healthy / approaching limit / over limit). */\n colorSuccess: string;\n colorWarning: string;\n colorDanger: string;\n radius: string;\n /** Box-shadow applied to elevated surfaces (cards/portals). */\n shadow: string;\n fontFamily: string;\n}\n\nexport type ThemePresetName =\n | \"light\"\n | \"dark\"\n | \"memphis\"\n | \"dashboard\"\n | \"console\"\n | \"midnight\"\n | \"ocean\"\n | \"forest\"\n | \"sunset\"\n | \"grape\";\n\nexport const THEME_PRESETS: Record<ThemePresetName, ThemeTokens> = {\n light: {\n colorBackground: \"#ffffff\",\n colorForeground: \"#0a0a0a\",\n colorMuted: \"#71717a\",\n colorPrimary: \"#4f46e5\",\n colorPrimaryForeground: \"#ffffff\",\n colorAccent: \"#10b981\",\n colorBorder: \"#e4e4e7\",\n colorCard: \"#ffffff\",\n colorCardForeground: \"#0a0a0a\",\n colorSuccess: \"#16a34a\",\n colorWarning: \"#d97706\",\n colorDanger: \"#dc2626\",\n radius: \"0.5rem\",\n shadow: \"0 1px 3px rgba(0,0,0,0.1)\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n dark: {\n colorBackground: \"#0a0a0a\",\n colorForeground: \"#fafafa\",\n colorMuted: \"#a1a1aa\",\n colorPrimary: \"#6366f1\",\n colorPrimaryForeground: \"#0a0a0a\",\n colorAccent: \"#10b981\",\n colorBorder: \"#27272a\",\n colorCard: \"#18181b\",\n colorCardForeground: \"#fafafa\",\n colorSuccess: \"#22c55e\",\n colorWarning: \"#f59e0b\",\n colorDanger: \"#ef4444\",\n radius: \"0.5rem\",\n shadow: \"0 1px 3px rgba(0,0,0,0.4)\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n memphis: {\n colorBackground: \"#FFFEF2\",\n colorForeground: \"#1a1a1a\",\n colorMuted: \"#5b5b52\",\n colorPrimary: \"#FF6B35\",\n colorPrimaryForeground: \"#1a1a1a\",\n colorAccent: \"#00D9FF\",\n colorBorder: \"#1a1a1a\",\n colorCard: \"#ffffff\",\n colorCardForeground: \"#1a1a1a\",\n colorSuccess: \"#00C853\",\n colorWarning: \"#FFB400\",\n colorDanger: \"#FF3B30\",\n radius: \"0\",\n shadow: \"4px 4px 0 #1a1a1a\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n dashboard: {\n colorBackground: \"oklch(1 0 0)\",\n colorForeground: \"oklch(0.145 0 0)\",\n colorMuted: \"oklch(0.556 0 0)\",\n colorPrimary: \"oklch(0.205 0 0)\",\n colorPrimaryForeground: \"oklch(0.985 0 0)\",\n colorAccent: \"oklch(0.97 0 0)\",\n colorBorder: \"oklch(0.922 0 0)\",\n colorCard: \"oklch(1 0 0)\",\n colorCardForeground: \"oklch(0.145 0 0)\",\n colorSuccess: \"#16a34a\",\n colorWarning: \"#d97706\",\n colorDanger: \"#dc2626\",\n radius: \"0.625rem\",\n shadow: \"0 1px 2px rgba(0,0,0,0.06)\",\n fontFamily: \"Geist, system-ui, sans-serif\",\n },\n console: {\n colorBackground: \"#0b0f14\",\n colorForeground: \"#e6edf3\",\n colorMuted: \"#8b949e\",\n colorPrimary: \"#6366f1\",\n colorPrimaryForeground: \"#ffffff\",\n colorAccent: \"#00D9FF\",\n colorBorder: \"#1f2630\",\n colorCard: \"#11161d\",\n colorCardForeground: \"#e6edf3\",\n colorSuccess: \"#34d399\",\n colorWarning: \"#fbbf24\",\n colorDanger: \"#f87171\",\n radius: \"0.625rem\",\n shadow: \"0 8px 24px rgba(0,0,0,0.5)\",\n fontFamily: \"Geist, system-ui, sans-serif\",\n },\n midnight: {\n colorBackground: \"#0f172a\",\n colorForeground: \"#e2e8f0\",\n colorMuted: \"#94a3b8\",\n colorPrimary: \"#818cf8\",\n colorPrimaryForeground: \"#0f172a\",\n colorAccent: \"#38bdf8\",\n colorBorder: \"#1e293b\",\n colorCard: \"#1e293b\",\n colorCardForeground: \"#e2e8f0\",\n colorSuccess: \"#4ade80\",\n colorWarning: \"#facc15\",\n colorDanger: \"#fb7185\",\n radius: \"0.75rem\",\n shadow: \"0 10px 30px rgba(2,6,23,0.6)\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n ocean: {\n colorBackground: \"#f0fdfa\",\n colorForeground: \"#0f3d3e\",\n colorMuted: \"#5b7c7d\",\n colorPrimary: \"#0d9488\",\n colorPrimaryForeground: \"#ffffff\",\n colorAccent: \"#06b6d4\",\n colorBorder: \"#99f6e4\",\n colorCard: \"#ffffff\",\n colorCardForeground: \"#0f3d3e\",\n colorSuccess: \"#059669\",\n colorWarning: \"#d97706\",\n colorDanger: \"#e11d48\",\n radius: \"0.75rem\",\n shadow: \"0 4px 14px rgba(13,148,136,0.15)\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n forest: {\n colorBackground: \"#f7fee7\",\n colorForeground: \"#1a2e05\",\n colorMuted: \"#5c6b47\",\n colorPrimary: \"#4d7c0f\",\n colorPrimaryForeground: \"#ffffff\",\n colorAccent: \"#65a30d\",\n colorBorder: \"#d9f99d\",\n colorCard: \"#ffffff\",\n colorCardForeground: \"#1a2e05\",\n colorSuccess: \"#16a34a\",\n colorWarning: \"#ca8a04\",\n colorDanger: \"#dc2626\",\n radius: \"0.5rem\",\n shadow: \"0 4px 14px rgba(77,124,15,0.12)\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n sunset: {\n colorBackground: \"#fff7ed\",\n colorForeground: \"#431407\",\n colorMuted: \"#9a6b4f\",\n colorPrimary: \"#ea580c\",\n colorPrimaryForeground: \"#ffffff\",\n colorAccent: \"#f43f5e\",\n colorBorder: \"#fed7aa\",\n colorCard: \"#ffffff\",\n colorCardForeground: \"#431407\",\n colorSuccess: \"#16a34a\",\n colorWarning: \"#d97706\",\n colorDanger: \"#e11d48\",\n radius: \"1rem\",\n shadow: \"0 6px 20px rgba(234,88,12,0.15)\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n grape: {\n colorBackground: \"#faf5ff\",\n colorForeground: \"#2e1065\",\n colorMuted: \"#7c6f93\",\n colorPrimary: \"#7c3aed\",\n colorPrimaryForeground: \"#ffffff\",\n colorAccent: \"#d946ef\",\n colorBorder: \"#e9d5ff\",\n colorCard: \"#ffffff\",\n colorCardForeground: \"#2e1065\",\n colorSuccess: \"#16a34a\",\n colorWarning: \"#d97706\",\n colorDanger: \"#dc2626\",\n radius: \"0.875rem\",\n shadow: \"0 6px 20px rgba(124,58,237,0.15)\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n },\n};\n\n/** All preset names, useful for theme pickers / story matrices. */\nexport const THEME_PRESET_NAMES = Object.keys(THEME_PRESETS) as ThemePresetName[];\n\nexport type Appearance =\n | ThemePresetName\n | { preset?: ThemePresetName; tokens?: Partial<ThemeTokens> };\n\n/** Resolve an appearance prop into a concrete token set. */\nexport function resolveTokens(appearance: Appearance = \"light\"): ThemeTokens {\n if (typeof appearance === \"string\") {\n return THEME_PRESETS[appearance];\n }\n const base = THEME_PRESETS[appearance.preset ?? \"light\"];\n return { ...base, ...appearance.tokens };\n}\n\nconst TOKEN_TO_CSS_VAR: Record<keyof ThemeTokens, string> = {\n colorBackground: \"--mk-bg\",\n colorForeground: \"--mk-fg\",\n colorMuted: \"--mk-muted\",\n colorPrimary: \"--mk-primary\",\n colorPrimaryForeground: \"--mk-primary-fg\",\n colorAccent: \"--mk-accent\",\n colorBorder: \"--mk-border\",\n colorCard: \"--mk-card\",\n colorCardForeground: \"--mk-card-fg\",\n colorSuccess: \"--mk-success\",\n colorWarning: \"--mk-warning\",\n colorDanger: \"--mk-danger\",\n radius: \"--mk-radius\",\n shadow: \"--mk-shadow\",\n fontFamily: \"--mk-font\",\n};\n\n/** Convert tokens into a CSS custom-property style object for a wrapper element. */\nexport function tokensToStyle(tokens: ThemeTokens): CSSProperties {\n const style: Record<string, string> = {};\n (Object.keys(tokens) as (keyof ThemeTokens)[]).forEach((key) => {\n style[TOKEN_TO_CSS_VAR[key]] = String(tokens[key]);\n });\n return style as CSSProperties;\n}\n","import {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { MonetizeKitClient } from \"./lib/client\";\nimport {\n resolveTokens,\n type Appearance,\n type ThemeTokens,\n} from \"./theme/tokens\";\n\nexport interface MonetizeKitContextValue {\n client: MonetizeKitClient;\n customerId?: string;\n appearance: Appearance;\n tokens: ThemeTokens;\n}\n\nconst MonetizeKitContext = createContext<MonetizeKitContextValue | null>(null);\n\nexport interface MonetizeKitProviderProps {\n /** Browser-safe publishable key (pk_*). */\n publishableKey: string;\n /** API origin, e.g. https://app.monetizekit.app. */\n baseUrl: string;\n /** Optional customer JWT for customer-scoped reads (entitlements/usage/credits). */\n customerToken?: string;\n /** Customer id for entitlement/usage/credit hooks. */\n customerId?: string;\n /** Theme preset name or token overrides. */\n appearance?: Appearance;\n children: ReactNode;\n}\n\nexport function MonetizeKitProvider({\n publishableKey,\n baseUrl,\n customerToken,\n customerId,\n appearance = \"light\",\n children,\n}: MonetizeKitProviderProps) {\n const value = useMemo<MonetizeKitContextValue>(() => {\n return {\n client: new MonetizeKitClient({ publishableKey, baseUrl, customerToken }),\n customerId,\n appearance,\n tokens: resolveTokens(appearance),\n };\n }, [publishableKey, baseUrl, customerToken, customerId, appearance]);\n\n return (\n <MonetizeKitContext.Provider value={value}>\n {children}\n </MonetizeKitContext.Provider>\n );\n}\n\nexport function useMonetizeKit(): MonetizeKitContextValue {\n const ctx = useContext(MonetizeKitContext);\n if (!ctx) {\n throw new Error(\"useMonetizeKit must be used within a <MonetizeKitProvider>.\");\n }\n return ctx;\n}\n","import { useEffect, useState } from \"react\";\nimport { useMonetizeKit } from \"./provider\";\nimport type { CreditBalance, EntitlementResult, UsageResult } from \"./types\";\n\ninterface AsyncState<T> {\n data: T | null;\n loading: boolean;\n error: Error | null;\n}\n\nfunction useAsync<T>(\n run: () => Promise<T> | null,\n deps: unknown[],\n): AsyncState<T> {\n const [state, setState] = useState<AsyncState<T>>({\n data: null,\n loading: true,\n error: null,\n });\n\n useEffect(() => {\n let active = true;\n const promise = run();\n if (!promise) {\n setState({ data: null, loading: false, error: null });\n return;\n }\n setState((prev) => ({ ...prev, loading: true, error: null }));\n promise\n .then((data) => {\n if (active) setState({ data, loading: false, error: null });\n })\n .catch((error: unknown) => {\n if (active) {\n setState({\n data: null,\n loading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n });\n return () => {\n active = false;\n };\n }, deps);\n\n return state;\n}\n\n/** Resolve a single feature entitlement for the provider's customer. */\nexport function useEntitlement(featureKey: string) {\n const { client, customerId } = useMonetizeKit();\n const state = useAsync<EntitlementResult>(\n () =>\n customerId\n ? client.getEntitlement<EntitlementResult>(customerId, featureKey)\n : null,\n [client, customerId, featureKey],\n );\n return {\n value: state.data?.value ?? null,\n allowed: state.data?.allowed ?? false,\n loading: state.loading,\n error: state.error,\n };\n}\n\n/** Resolve current usage for a meter. */\nexport function useUsage(meterId: string) {\n const { client, customerId } = useMonetizeKit();\n const state = useAsync<UsageResult>(\n () => (customerId ? client.getUsage<UsageResult>(customerId, meterId) : null),\n [client, customerId, meterId],\n );\n return {\n current: state.data?.current ?? 0,\n limit: state.data?.limit ?? null,\n loading: state.loading,\n error: state.error,\n };\n}\n\n/** Resolve the customer's credit balance. */\nexport function useCredits() {\n const { client, customerId } = useMonetizeKit();\n const state = useAsync<CreditBalance>(\n () => (customerId ? client.getCredits<CreditBalance>(customerId) : null),\n [client, customerId],\n );\n return {\n balance: state.data?.balance ?? 0,\n currency: state.data?.currency,\n loading: state.loading,\n error: state.error,\n };\n}\n","import type { Plan, PricingTerm } from \"../types\";\n\n/** Format a monetary amount with Intl, honoring locale + currency. */\nexport function formatMoney(\n amount: number,\n currency = \"USD\",\n locale?: string,\n): string {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n minimumFractionDigits: Number.isInteger(amount) ? 0 : 2,\n maximumFractionDigits: amount < 1 ? 3 : 2,\n }).format(amount);\n}\n\n/** Format a large unit count compactly (e.g. 5,000 / 1M). */\nexport function formatUnits(value: number, locale?: string): string {\n return new Intl.NumberFormat(locale, {\n notation: value >= 10_000 ? \"compact\" : \"standard\",\n maximumFractionDigits: 1,\n }).format(value);\n}\n\nexport interface PriceDisplay {\n /** Headline price string, or null for contact-sales. */\n headline: string | null;\n /** Secondary line (e.g. \"+ usage\" or billing interval). */\n caption?: string;\n contactSales: boolean;\n}\n\nconst INTERVAL_SUFFIX: Record<PricingTerm[\"interval\"], string> = {\n monthly: \"/mo\",\n annually: \"/yr\",\n one_time: \"\",\n};\n\n/**\n * Derive a display from a plan's pricing terms. Returns a contact-sales display\n * when the plan is tagged `contact_sales` or has no public price; renders a\n * \"from $base + usage\" headline when metered usage terms are present.\n */\nexport function describePlanPrice(\n plan: Plan,\n locale?: string,\n): PriceDisplay {\n const pricing = plan.pricing ?? [];\n const contactSales =\n (plan.tags ?? []).includes(\"contact_sales\") || pricing.length === 0;\n if (contactSales) {\n return { headline: null, contactSales: true };\n }\n\n const base = pricing.find((t) => t.type === \"flat\");\n const hasUsage = pricing.some((t) => t.type === \"usage\");\n const currency = base?.currency ?? pricing[0]?.currency ?? \"USD\";\n const interval = base?.interval ?? pricing[0]?.interval ?? \"monthly\";\n const baseAmount = base?.amount ?? 0;\n\n const headline = `${formatMoney(baseAmount, currency, locale)}${INTERVAL_SUFFIX[interval]}`;\n return {\n headline,\n caption: hasUsage ? \"+ usage\" : undefined,\n contactSales: false,\n };\n}\n\n/** Human-readable description of a usage term's metered tiers. */\nexport function describeUsageTerm(term: PricingTerm, locale?: string): string {\n const parts: string[] = [];\n if (term.includedUnits && term.includedUnits > 0) {\n parts.push(`${formatUnits(term.includedUnits, locale)} ${term.meterDisplayName ?? \"units\"} included`);\n }\n const tiers = term.tieredPricing ?? [];\n if (tiers.length > 0) {\n const first = tiers[0]!;\n parts.push(\n `then ${formatMoney(first.unitPrice, term.currency, locale)}/unit${\n term.tierMode === \"volume\" ? \" (volume)\" : \"\"\n }`,\n );\n }\n return parts.join(\", \");\n}\n","/**\n * Illustrative sample data used to show what a surface *could* look like when no\n * real catalog/customer data is available yet (e.g. a fresh workspace with no\n * plans or products defined). Always paired with a visible <SampleNotice/> so it\n * is never mistaken for live data.\n */\nimport type { CreditBalance, Plan, UsageResult } from \"../types\";\n\nexport const SAMPLE_PLANS: Plan[] = [\n {\n id: \"sample_free\",\n name: \"Starter\",\n description: \"Evaluate the platform and model your catalog\",\n pricing: [{ type: \"flat\", amount: 0, currency: \"USD\", interval: \"monthly\" }],\n entitlements: [\n { featureKey: \"max_customers\", featureDisplayName: \"Tracked customers\", type: \"limit\", value: 100 },\n { featureKey: \"api_access\", featureDisplayName: \"REST & GraphQL API\", type: \"boolean\", value: true },\n { featureKey: \"metering\", featureDisplayName: \"Usage metering\", type: \"boolean\", value: true },\n ],\n },\n {\n id: \"sample_pro\",\n name: \"Growth\",\n description: \"Product-led monetization at scale\",\n pricing: [{ type: \"flat\", amount: 49900, currency: \"USD\", interval: \"monthly\" }],\n entitlements: [\n { featureKey: \"max_customers\", featureDisplayName: \"Tracked customers\", type: \"limit\", value: 10000 },\n { featureKey: \"stripe\", featureDisplayName: \"Stripe integration\", type: \"boolean\", value: true },\n { featureKey: \"experiments\", featureDisplayName: \"Experiments & A/B testing\", type: \"boolean\", value: true },\n { featureKey: \"widgets\", featureDisplayName: \"Embeddable widgets\", type: \"boolean\", value: true },\n ],\n },\n {\n id: \"sample_scale\",\n name: \"Scale\",\n description: \"Volume-based capacity pricing\",\n pricing: [\n { type: \"flat\", amount: 99900, currency: \"USD\", interval: \"monthly\" },\n {\n type: \"usage\",\n amount: 0,\n currency: \"USD\",\n interval: \"monthly\",\n meterId: \"sample_mtc\",\n meterDisplayName: \"Tracked customers\",\n includedUnits: 25000,\n tierMode: \"graduated\",\n tieredPricing: [\n { upTo: 100000, unitPrice: 0.012 },\n { upTo: null, unitPrice: 0.006 },\n ],\n },\n ],\n entitlements: [\n { featureKey: \"everything_pro\", featureDisplayName: \"Everything in Growth\", type: \"boolean\", value: true },\n { featureKey: \"approvals\", featureDisplayName: \"Approval workflows\", type: \"boolean\", value: true },\n ],\n },\n {\n id: \"sample_enterprise\",\n name: \"Enterprise\",\n description: \"Governance, scale, and advanced controls\",\n tags: [\"contact_sales\"],\n pricing: [],\n entitlements: [\n { featureKey: \"sso\", featureDisplayName: \"SSO / SAML\", type: \"boolean\", value: true },\n { featureKey: \"sla\", featureDisplayName: \"Custom SLA\", type: \"boolean\", value: true },\n ],\n },\n];\n\nexport const SAMPLE_USAGE: Record<string, UsageResult> = {\n api_calls: { meterId: \"api_calls\", current: 72000, limit: 100000 },\n seats: { meterId: \"seats\", current: 8, limit: 10 },\n storage_gb: { meterId: \"storage_gb\", current: 3, limit: 10 },\n};\n\nexport const SAMPLE_CREDITS: CreditBalance = { balance: 120000, currency: \"USD\" };\n\nexport const SAMPLE_PORTAL = {\n planName: \"Growth\",\n meterIds: [\"api_calls\", \"seats\"],\n} as const;\n\n/** Default disclaimer copy shown alongside sample data. */\nexport const SAMPLE_NOTICE_TEXT =\n \"Sample data for illustration only — define plans and products to show live values.\";\n","import { type CSSProperties, type ReactNode } from \"react\";\nimport { SAMPLE_NOTICE_TEXT } from \"../lib/sample-data\";\n\nexport interface SampleNoticeProps {\n /** Override the default disclaimer copy. */\n children?: ReactNode;\n}\n\nconst noticeStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n border: \"1px dashed var(--mk-warning)\",\n borderRadius: \"var(--mk-radius)\",\n background: \"color-mix(in srgb, var(--mk-warning) 12%, transparent)\",\n color: \"var(--mk-card-fg)\",\n fontFamily: \"var(--mk-font)\",\n fontSize: \"0.75rem\",\n padding: \"0.5rem 0.75rem\",\n};\n\n/**\n * A clearly-styled disclaimer banner shown above illustrative sample content so\n * it is never mistaken for live data.\n */\nexport function SampleNotice({ children }: SampleNoticeProps) {\n return (\n <div role=\"note\" data-mk-component=\"sample-notice\" style={noticeStyle}>\n <span aria-hidden=\"true\" style={{ color: \"var(--mk-warning)\", fontWeight: 700 }}>\n ●\n </span>\n <span>{children ?? SAMPLE_NOTICE_TEXT}</span>\n </div>\n );\n}\n","import { useEffect, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { useMonetizeKit } from \"../provider\";\nimport { tokensToStyle } from \"../theme/tokens\";\nimport { describePlanPrice } from \"../lib/format\";\nimport { SAMPLE_PLANS } from \"../lib/sample-data\";\nimport { SampleNotice } from \"./SampleNotice\";\nimport type { Plan } from \"../types\";\n\nexport interface PricingTableProps {\n /** Plans to render; if omitted, fetched live from the publishable-key API. */\n plans?: Plan[];\n /** Plan name to highlight as \"Most Popular\". */\n highlightPlan?: string;\n billingCycle?: \"monthly\" | \"annually\";\n locale?: string;\n onSelectPlan?: (planId: string) => void;\n /** Where the Contact Sales CTA links (defaults to no-op). */\n onContactSales?: (planId: string) => void;\n /**\n * When there are no plans to show, render illustrative sample plans behind a\n * clear disclaimer instead of an empty table. Defaults to `true`.\n */\n sampleWhenEmpty?: boolean;\n /** Override the sample-data disclaimer copy. */\n disclaimer?: ReactNode;\n}\n\nconst wrapperStyle: CSSProperties = {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(240px, 1fr))\",\n gap: \"1.5rem\",\n background: \"var(--mk-bg)\",\n color: \"var(--mk-fg)\",\n fontFamily: \"var(--mk-font)\",\n};\n\nconst cardBase: CSSProperties = {\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"1.5rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.75rem\",\n};\n\nexport function PricingTable({\n plans: plansProp,\n highlightPlan,\n locale,\n onSelectPlan,\n onContactSales,\n sampleWhenEmpty = true,\n disclaimer,\n}: PricingTableProps) {\n const { client, tokens } = useMonetizeKit();\n const [plans, setPlans] = useState<Plan[] | null>(plansProp ?? null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (plansProp) {\n setPlans(plansProp);\n return;\n }\n let active = true;\n client\n .listPlans<{ data: Plan[] }>()\n .then((res) => {\n if (active) setPlans(res.data ?? []);\n })\n .catch((e: unknown) => {\n if (active) setError(e instanceof Error ? e : new Error(String(e)));\n });\n return () => {\n active = false;\n };\n }, [client, plansProp]);\n\n if (error) {\n return <div role=\"alert\" style={{ color: \"var(--mk-muted)\" }}>Unable to load pricing.</div>;\n }\n if (!plans) {\n return <div aria-busy=\"true\" style={{ color: \"var(--mk-muted)\" }}>Loading pricing…</div>;\n }\n\n const isSample = plans.length === 0 && sampleWhenEmpty;\n const effectivePlans = isSample ? SAMPLE_PLANS : plans;\n\n if (effectivePlans.length === 0) {\n return <div style={{ color: \"var(--mk-muted)\" }}>No plans available.</div>;\n }\n\n return (\n <div\n style={{ ...tokensToStyle(tokens), display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}\n data-mk-component=\"pricing-table\"\n data-mk-sample={isSample ? \"true\" : undefined}\n >\n {isSample ? <SampleNotice>{disclaimer}</SampleNotice> : null}\n <div style={wrapperStyle}>\n {effectivePlans.map((plan) => {\n const price = describePlanPrice(plan, locale);\n const highlighted =\n highlightPlan != null &&\n plan.name.toLowerCase() === highlightPlan.toLowerCase();\n return (\n <div\n key={plan.id}\n style={{\n ...cardBase,\n borderColor: highlighted ? \"var(--mk-primary)\" : \"var(--mk-border)\",\n borderWidth: highlighted ? 2 : 1,\n }}\n data-mk-plan={plan.name}\n data-mk-highlighted={highlighted ? \"true\" : undefined}\n >\n {highlighted ? (\n <span\n style={{\n alignSelf: \"flex-start\",\n background: \"var(--mk-primary)\",\n color: \"var(--mk-primary-fg)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.125rem 0.5rem\",\n fontSize: \"0.75rem\",\n fontWeight: 600,\n }}\n >\n Most Popular\n </span>\n ) : null}\n <h3 style={{ margin: 0, fontSize: \"1.25rem\", fontWeight: 700 }}>{plan.name}</h3>\n {plan.description ? (\n <p style={{ margin: 0, color: \"var(--mk-muted)\", fontSize: \"0.875rem\" }}>\n {plan.description}\n </p>\n ) : null}\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: \"0.375rem\" }}>\n <span style={{ fontSize: \"2rem\", fontWeight: 700 }}>\n {price.contactSales ? \"Custom\" : price.headline}\n </span>\n {price.caption ? (\n <span style={{ color: \"var(--mk-muted)\", fontSize: \"0.875rem\" }}>\n {price.caption}\n </span>\n ) : null}\n </div>\n {plan.entitlements && plan.entitlements.length > 0 ? (\n <ul style={{ margin: 0, paddingLeft: \"1rem\", color: \"var(--mk-fg)\", fontSize: \"0.875rem\" }}>\n {plan.entitlements.slice(0, 6).map((e) => (\n <li key={e.featureKey}>\n {e.featureDisplayName}\n {e.type !== \"boolean\" ? `: ${String(e.value)}` : \"\"}\n </li>\n ))}\n </ul>\n ) : null}\n <button\n type=\"button\"\n onClick={() =>\n price.contactSales\n ? onContactSales?.(plan.id)\n : onSelectPlan?.(plan.id)\n }\n style={{\n marginTop: \"auto\",\n background: \"var(--mk-primary)\",\n color: \"var(--mk-primary-fg)\",\n border: \"none\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.625rem 1rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {price.contactSales ? \"Contact Sales\" : \"Get started\"}\n </button>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode } from \"react\";\nimport { useEntitlement } from \"../hooks\";\nimport { useMonetizeKit } from \"../provider\";\nimport { tokensToStyle } from \"../theme/tokens\";\n\nexport interface PaywallProps {\n /** Feature key gating the content. */\n feature: string;\n /** Protected content, shown when entitled. */\n children: ReactNode;\n title?: string;\n description?: string;\n ctaLabel?: string;\n onUpgrade?: () => void;\n}\n\nconst overlayStyle: CSSProperties = {\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"2rem\",\n textAlign: \"center\",\n background: \"var(--mk-bg)\",\n color: \"var(--mk-fg)\",\n fontFamily: \"var(--mk-font)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.75rem\",\n alignItems: \"center\",\n};\n\n/** Gate content behind an entitlement, showing an upgrade prompt when locked. */\nexport function Paywall({\n feature,\n children,\n title = \"Upgrade to unlock this feature\",\n description = \"This feature isn't included in your current plan.\",\n ctaLabel = \"Upgrade\",\n onUpgrade,\n}: PaywallProps) {\n const { allowed, loading } = useEntitlement(feature);\n const { tokens } = useMonetizeKit();\n\n if (loading) {\n return <div aria-busy=\"true\" style={{ color: \"var(--mk-muted)\" }}>Checking access…</div>;\n }\n if (allowed) {\n return <>{children}</>;\n }\n\n return (\n <div style={{ ...tokensToStyle(tokens), ...overlayStyle }} data-mk-component=\"paywall\">\n <h3 style={{ margin: 0, fontSize: \"1.125rem\", fontWeight: 700 }}>{title}</h3>\n <p style={{ margin: 0, color: \"var(--mk-muted)\", fontSize: \"0.875rem\" }}>{description}</p>\n <button\n type=\"button\"\n onClick={onUpgrade}\n style={{\n background: \"var(--mk-primary)\",\n color: \"var(--mk-primary-fg)\",\n border: \"none\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.625rem 1.25rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {ctaLabel}\n </button>\n </div>\n );\n}\n","import { type CSSProperties } from \"react\";\nimport { useUsage } from \"../hooks\";\nimport { useMonetizeKit } from \"../provider\";\nimport { tokensToStyle } from \"../theme/tokens\";\nimport { formatUnits } from \"../lib/format\";\n\nexport interface UsageBannerProps {\n /** Meter to display usage for. */\n meterId: string;\n label?: string;\n locale?: string;\n /** Fraction (0-1) at which the banner switches to a warning style. */\n warnAt?: number;\n}\n\nconst bannerStyle: CSSProperties = {\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.875rem 1rem\",\n background: \"var(--mk-bg)\",\n color: \"var(--mk-fg)\",\n fontFamily: \"var(--mk-font)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n};\n\n/** Show current usage vs allotment for a capacity meter, with overage hint. */\nexport function UsageBanner({\n meterId,\n label = \"Usage\",\n locale,\n warnAt = 0.8,\n}: UsageBannerProps) {\n const { current, limit, loading } = useUsage(meterId);\n const { tokens } = useMonetizeKit();\n\n if (loading) {\n return <div aria-busy=\"true\" style={{ color: \"var(--mk-muted)\" }}>Loading usage…</div>;\n }\n\n const hasLimit = typeof limit === \"number\" && limit > 0;\n const fraction = hasLimit ? Math.min(1, current / (limit as number)) : 0;\n const over = hasLimit && current > (limit as number);\n const warn = hasLimit && fraction >= warnAt;\n const barColor = over ? \"var(--mk-danger)\" : warn ? \"var(--mk-warning)\" : \"var(--mk-accent)\";\n\n return (\n <div style={{ ...tokensToStyle(tokens), ...bannerStyle }} data-mk-component=\"usage-banner\">\n <div style={{ display: \"flex\", justifyContent: \"space-between\", fontSize: \"0.875rem\" }}>\n <span style={{ fontWeight: 600 }}>{label}</span>\n <span style={{ color: \"var(--mk-muted)\" }}>\n {formatUnits(current, locale)}\n {hasLimit ? ` / ${formatUnits(limit as number, locale)}` : \"\"}\n </span>\n </div>\n {hasLimit ? (\n <div\n style={{\n height: 6,\n borderRadius: 999,\n background: \"var(--mk-border)\",\n overflow: \"hidden\",\n }}\n role=\"progressbar\"\n aria-valuenow={Math.round(fraction * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div style={{ width: `${fraction * 100}%`, height: \"100%\", background: barColor }} />\n </div>\n ) : null}\n {over ? (\n <span style={{ color: \"var(--mk-danger)\", fontSize: \"0.75rem\" }}>\n Over included allotment — overage billed per usage pricing.\n </span>\n ) : null}\n </div>\n );\n}\n","import { type CSSProperties, type ReactNode } from \"react\";\nimport { useCredits } from \"../hooks\";\nimport { useMonetizeKit } from \"../provider\";\nimport { tokensToStyle } from \"../theme/tokens\";\nimport { formatMoney, formatUnits } from \"../lib/format\";\nimport { UsageBanner } from \"./UsageBanner\";\nimport { SampleNotice } from \"./SampleNotice\";\nimport { SAMPLE_CREDITS, SAMPLE_PORTAL, SAMPLE_USAGE } from \"../lib/sample-data\";\n\nexport interface CustomerPortalProps {\n /** Current plan name to display. */\n planName?: string;\n /** Meters to surface usage for. */\n meterIds?: string[];\n /** Whether to show the credit balance card. */\n showCredits?: boolean;\n /**\n * Render illustrative sample plan/usage/credit data behind a clear disclaimer.\n * Use for previews or a fresh workspace with no plans/products defined yet.\n */\n sample?: boolean;\n /** Override the sample-data disclaimer copy. */\n disclaimer?: ReactNode;\n /** Show the \"Powered by MonetizeKit\" footer. */\n showBranding?: boolean;\n locale?: string;\n currency?: string;\n onManageBilling?: () => void;\n}\n\nconst containerStyle: CSSProperties = {\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"1.25rem\",\n background: \"var(--mk-card)\",\n color: \"var(--mk-card-fg)\",\n boxShadow: \"var(--mk-shadow)\",\n fontFamily: \"var(--mk-font)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1rem\",\n maxWidth: 480,\n};\n\nconst cardStyle: CSSProperties = {\n border: \"1px solid var(--mk-border)\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.875rem 1rem\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.5rem\",\n};\n\n/** A static usage row for sample mode (no live `useUsage` fetch). */\nfunction SampleUsageRow({\n label,\n current,\n limit,\n locale,\n}: {\n label: string;\n current: number;\n limit: number | null;\n locale?: string;\n}) {\n const hasLimit = typeof limit === \"number\" && limit > 0;\n const fraction = hasLimit ? Math.min(1, current / (limit as number)) : 0;\n const barColor = fraction >= 0.8 ? \"var(--mk-warning)\" : \"var(--mk-accent)\";\n return (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", fontSize: \"0.875rem\" }}>\n <span style={{ fontWeight: 600 }}>{label}</span>\n <span style={{ color: \"var(--mk-muted)\" }}>\n {formatUnits(current, locale)}\n {hasLimit ? ` / ${formatUnits(limit as number, locale)}` : \"\"}\n </span>\n </div>\n {hasLimit ? (\n <div style={{ height: 6, borderRadius: 999, background: \"var(--mk-border)\", overflow: \"hidden\" }}>\n <div style={{ width: `${fraction * 100}%`, height: \"100%\", background: barColor }} />\n </div>\n ) : null}\n </div>\n );\n}\n\n/** A self-service portal: current plan, usage meters, and credit balance. */\nexport function CustomerPortal({\n planName,\n meterIds,\n showCredits = true,\n sample = false,\n disclaimer,\n showBranding = false,\n locale,\n currency = \"USD\",\n onManageBilling,\n}: CustomerPortalProps) {\n const { tokens } = useMonetizeKit();\n const credits = useCredits();\n\n const resolvedPlanName = planName ?? (sample ? SAMPLE_PORTAL.planName : \"Current plan\");\n const resolvedMeterIds = meterIds ?? (sample ? [...SAMPLE_PORTAL.meterIds] : []);\n const creditBalance = sample ? SAMPLE_CREDITS.balance : credits.balance;\n const creditCurrency = sample ? SAMPLE_CREDITS.currency : credits.currency;\n const creditLoading = sample ? false : credits.loading;\n\n return (\n <div\n style={{ ...tokensToStyle(tokens), ...containerStyle }}\n data-mk-component=\"customer-portal\"\n data-mk-sample={sample ? \"true\" : undefined}\n >\n {sample ? <SampleNotice>{disclaimer}</SampleNotice> : null}\n\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", gap: \"1rem\" }}>\n <div>\n <div style={{ fontSize: \"0.75rem\", color: \"var(--mk-muted)\" }}>Plan</div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\", marginTop: \"0.125rem\" }}>\n <span style={{ fontSize: \"1.125rem\", fontWeight: 700 }}>{resolvedPlanName}</span>\n <span\n style={{\n fontSize: \"0.6875rem\",\n fontWeight: 600,\n color: \"var(--mk-success)\",\n border: \"1px solid var(--mk-success)\",\n borderRadius: 999,\n padding: \"0.0625rem 0.5rem\",\n }}\n >\n Active\n </span>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onManageBilling}\n style={{\n background: \"var(--mk-primary)\",\n color: \"var(--mk-primary-fg)\",\n border: \"none\",\n borderRadius: \"var(--mk-radius)\",\n padding: \"0.5rem 0.875rem\",\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n Manage billing\n </button>\n </div>\n\n {sample\n ? resolvedMeterIds.map((meterId) => {\n const usage = SAMPLE_USAGE[meterId];\n if (!usage) return null;\n return (\n <SampleUsageRow\n key={meterId}\n label={meterId}\n current={usage.current}\n limit={usage.limit}\n locale={locale}\n />\n );\n })\n : resolvedMeterIds.map((meterId) => (\n <UsageBanner key={meterId} meterId={meterId} label={meterId} locale={locale} />\n ))}\n\n {showCredits ? (\n <div style={{ ...cardStyle, flexDirection: \"row\", justifyContent: \"space-between\" }}>\n <span style={{ fontWeight: 600, fontSize: \"0.875rem\" }}>Credits</span>\n <span style={{ color: \"var(--mk-muted)\" }}>\n {creditLoading ? \"…\" : formatMoney(creditBalance, creditCurrency ?? currency, locale)}\n </span>\n </div>\n ) : null}\n\n {showBranding ? (\n <div style={{ textAlign: \"center\", fontSize: \"0.625rem\", color: \"var(--mk-muted)\" }}>\n Powered by MonetizeKit\n </div>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useEntitlement } from \"../hooks\";\n\nexport interface EntitlementGateProps {\n /** Feature key to check for the provider's customer. */\n feature: string;\n /** Rendered when the customer is entitled. */\n children: ReactNode;\n /** Rendered when not entitled (defaults to nothing). */\n fallback?: ReactNode;\n /** Rendered while the entitlement check is loading. */\n loadingFallback?: ReactNode;\n}\n\n/** Conditionally render children based on a live entitlement check. */\nexport function EntitlementGate({\n feature,\n children,\n fallback = null,\n loadingFallback = null,\n}: EntitlementGateProps) {\n const { allowed, loading } = useEntitlement(feature);\n if (loading) return <>{loadingFallback}</>;\n return <>{allowed ? children : fallback}</>;\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -26,9 +26,13 @@ declare class MonetizeKitClient {
|
|
|
26
26
|
* preset name, a partial token override, or both.
|
|
27
27
|
*
|
|
28
28
|
* Presets:
|
|
29
|
-
* - `
|
|
30
|
-
* - `
|
|
31
|
-
* - `
|
|
29
|
+
* - `light` / `dark` — neutral defaults
|
|
30
|
+
* - `memphis` — the marketing site identity (coral/yellow/cyan, hard edges + hard shadow)
|
|
31
|
+
* - `dashboard` — the app's neutral palette (rounded, muted)
|
|
32
|
+
* - `console` — the dashboard "widgets" mock look: dark cards, emerald/amber/red
|
|
33
|
+
* semantics, soft elevation. Lets you reproduce the in-app preview style.
|
|
34
|
+
* - `midnight` — deep slate/indigo dark
|
|
35
|
+
* - `ocean` / `forest` / `sunset` / `grape` — light brand palettes for variety
|
|
32
36
|
*/
|
|
33
37
|
|
|
34
38
|
interface ThemeTokens {
|
|
@@ -39,11 +43,23 @@ interface ThemeTokens {
|
|
|
39
43
|
colorPrimaryForeground: string;
|
|
40
44
|
colorAccent: string;
|
|
41
45
|
colorBorder: string;
|
|
46
|
+
/** Surface color for cards/panels layered on the background. */
|
|
47
|
+
colorCard: string;
|
|
48
|
+
/** Foreground used on top of `colorCard`. */
|
|
49
|
+
colorCardForeground: string;
|
|
50
|
+
/** Semantic colors for status (healthy / approaching limit / over limit). */
|
|
51
|
+
colorSuccess: string;
|
|
52
|
+
colorWarning: string;
|
|
53
|
+
colorDanger: string;
|
|
42
54
|
radius: string;
|
|
55
|
+
/** Box-shadow applied to elevated surfaces (cards/portals). */
|
|
56
|
+
shadow: string;
|
|
43
57
|
fontFamily: string;
|
|
44
58
|
}
|
|
45
|
-
type ThemePresetName = "light" | "dark" | "memphis" | "dashboard";
|
|
59
|
+
type ThemePresetName = "light" | "dark" | "memphis" | "dashboard" | "console" | "midnight" | "ocean" | "forest" | "sunset" | "grape";
|
|
46
60
|
declare const THEME_PRESETS: Record<ThemePresetName, ThemeTokens>;
|
|
61
|
+
/** All preset names, useful for theme pickers / story matrices. */
|
|
62
|
+
declare const THEME_PRESET_NAMES: ThemePresetName[];
|
|
47
63
|
type Appearance = ThemePresetName | {
|
|
48
64
|
preset?: ThemePresetName;
|
|
49
65
|
tokens?: Partial<ThemeTokens>;
|
|
@@ -157,8 +173,15 @@ interface PricingTableProps {
|
|
|
157
173
|
onSelectPlan?: (planId: string) => void;
|
|
158
174
|
/** Where the Contact Sales CTA links (defaults to no-op). */
|
|
159
175
|
onContactSales?: (planId: string) => void;
|
|
176
|
+
/**
|
|
177
|
+
* When there are no plans to show, render illustrative sample plans behind a
|
|
178
|
+
* clear disclaimer instead of an empty table. Defaults to `true`.
|
|
179
|
+
*/
|
|
180
|
+
sampleWhenEmpty?: boolean;
|
|
181
|
+
/** Override the sample-data disclaimer copy. */
|
|
182
|
+
disclaimer?: ReactNode;
|
|
160
183
|
}
|
|
161
|
-
declare function PricingTable({ plans: plansProp, highlightPlan, locale, onSelectPlan, onContactSales, }: PricingTableProps): react.JSX.Element;
|
|
184
|
+
declare function PricingTable({ plans: plansProp, highlightPlan, locale, onSelectPlan, onContactSales, sampleWhenEmpty, disclaimer, }: PricingTableProps): react.JSX.Element;
|
|
162
185
|
|
|
163
186
|
interface PaywallProps {
|
|
164
187
|
/** Feature key gating the content. */
|
|
@@ -191,12 +214,21 @@ interface CustomerPortalProps {
|
|
|
191
214
|
meterIds?: string[];
|
|
192
215
|
/** Whether to show the credit balance card. */
|
|
193
216
|
showCredits?: boolean;
|
|
217
|
+
/**
|
|
218
|
+
* Render illustrative sample plan/usage/credit data behind a clear disclaimer.
|
|
219
|
+
* Use for previews or a fresh workspace with no plans/products defined yet.
|
|
220
|
+
*/
|
|
221
|
+
sample?: boolean;
|
|
222
|
+
/** Override the sample-data disclaimer copy. */
|
|
223
|
+
disclaimer?: ReactNode;
|
|
224
|
+
/** Show the "Powered by MonetizeKit" footer. */
|
|
225
|
+
showBranding?: boolean;
|
|
194
226
|
locale?: string;
|
|
195
227
|
currency?: string;
|
|
196
228
|
onManageBilling?: () => void;
|
|
197
229
|
}
|
|
198
230
|
/** A self-service portal: current plan, usage meters, and credit balance. */
|
|
199
|
-
declare function CustomerPortal({ planName, meterIds, showCredits, locale, currency, onManageBilling, }: CustomerPortalProps): react.JSX.Element;
|
|
231
|
+
declare function CustomerPortal({ planName, meterIds, showCredits, sample, disclaimer, showBranding, locale, currency, onManageBilling, }: CustomerPortalProps): react.JSX.Element;
|
|
200
232
|
|
|
201
233
|
interface EntitlementGateProps {
|
|
202
234
|
/** Feature key to check for the provider's customer. */
|
|
@@ -211,6 +243,33 @@ interface EntitlementGateProps {
|
|
|
211
243
|
/** Conditionally render children based on a live entitlement check. */
|
|
212
244
|
declare function EntitlementGate({ feature, children, fallback, loadingFallback, }: EntitlementGateProps): react.JSX.Element;
|
|
213
245
|
|
|
246
|
+
interface SampleNoticeProps {
|
|
247
|
+
/** Override the default disclaimer copy. */
|
|
248
|
+
children?: ReactNode;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* A clearly-styled disclaimer banner shown above illustrative sample content so
|
|
252
|
+
* it is never mistaken for live data.
|
|
253
|
+
*/
|
|
254
|
+
declare function SampleNotice({ children }: SampleNoticeProps): react.JSX.Element;
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Illustrative sample data used to show what a surface *could* look like when no
|
|
258
|
+
* real catalog/customer data is available yet (e.g. a fresh workspace with no
|
|
259
|
+
* plans or products defined). Always paired with a visible <SampleNotice/> so it
|
|
260
|
+
* is never mistaken for live data.
|
|
261
|
+
*/
|
|
262
|
+
|
|
263
|
+
declare const SAMPLE_PLANS: Plan[];
|
|
264
|
+
declare const SAMPLE_USAGE: Record<string, UsageResult>;
|
|
265
|
+
declare const SAMPLE_CREDITS: CreditBalance;
|
|
266
|
+
declare const SAMPLE_PORTAL: {
|
|
267
|
+
readonly planName: "Growth";
|
|
268
|
+
readonly meterIds: readonly ["api_calls", "seats"];
|
|
269
|
+
};
|
|
270
|
+
/** Default disclaimer copy shown alongside sample data. */
|
|
271
|
+
declare const SAMPLE_NOTICE_TEXT = "Sample data for illustration only \u2014 define plans and products to show live values.";
|
|
272
|
+
|
|
214
273
|
/** Format a monetary amount with Intl, honoring locale + currency. */
|
|
215
274
|
declare function formatMoney(amount: number, currency?: string, locale?: string): string;
|
|
216
275
|
/** Format a large unit count compactly (e.g. 5,000 / 1M). */
|
|
@@ -231,4 +290,4 @@ declare function describePlanPrice(plan: Plan, locale?: string): PriceDisplay;
|
|
|
231
290
|
/** Human-readable description of a usage term's metered tiers. */
|
|
232
291
|
declare function describeUsageTerm(term: PricingTerm, locale?: string): string;
|
|
233
292
|
|
|
234
|
-
export { type Appearance, type CreditBalance, CustomerPortal, type CustomerPortalProps, EntitlementGate, type EntitlementGateProps, type EntitlementResult, MonetizeKitClient, type MonetizeKitClientConfig, type MonetizeKitContextValue, MonetizeKitProvider, type MonetizeKitProviderProps, Paywall, type PaywallProps, type Plan, type PlanEntitlement, type PriceDisplay, PricingTable, type PricingTableProps, type PricingTerm, type PricingTier, THEME_PRESETS, type ThemePresetName, type ThemeTokens, UsageBanner, type UsageBannerProps, type UsageResult, describePlanPrice, describeUsageTerm, formatMoney, formatUnits, resolveTokens, tokensToStyle, useCredits, useEntitlement, useMonetizeKit, useUsage };
|
|
293
|
+
export { type Appearance, type CreditBalance, CustomerPortal, type CustomerPortalProps, EntitlementGate, type EntitlementGateProps, type EntitlementResult, MonetizeKitClient, type MonetizeKitClientConfig, type MonetizeKitContextValue, MonetizeKitProvider, type MonetizeKitProviderProps, Paywall, type PaywallProps, type Plan, type PlanEntitlement, type PriceDisplay, PricingTable, type PricingTableProps, type PricingTerm, type PricingTier, SAMPLE_CREDITS, SAMPLE_NOTICE_TEXT, SAMPLE_PLANS, SAMPLE_PORTAL, SAMPLE_USAGE, SampleNotice, type SampleNoticeProps, THEME_PRESETS, THEME_PRESET_NAMES, type ThemePresetName, type ThemeTokens, UsageBanner, type UsageBannerProps, type UsageResult, describePlanPrice, describeUsageTerm, formatMoney, formatUnits, resolveTokens, tokensToStyle, useCredits, useEntitlement, useMonetizeKit, useUsage };
|
package/dist/index.d.ts
CHANGED
|
@@ -26,9 +26,13 @@ declare class MonetizeKitClient {
|
|
|
26
26
|
* preset name, a partial token override, or both.
|
|
27
27
|
*
|
|
28
28
|
* Presets:
|
|
29
|
-
* - `
|
|
30
|
-
* - `
|
|
31
|
-
* - `
|
|
29
|
+
* - `light` / `dark` — neutral defaults
|
|
30
|
+
* - `memphis` — the marketing site identity (coral/yellow/cyan, hard edges + hard shadow)
|
|
31
|
+
* - `dashboard` — the app's neutral palette (rounded, muted)
|
|
32
|
+
* - `console` — the dashboard "widgets" mock look: dark cards, emerald/amber/red
|
|
33
|
+
* semantics, soft elevation. Lets you reproduce the in-app preview style.
|
|
34
|
+
* - `midnight` — deep slate/indigo dark
|
|
35
|
+
* - `ocean` / `forest` / `sunset` / `grape` — light brand palettes for variety
|
|
32
36
|
*/
|
|
33
37
|
|
|
34
38
|
interface ThemeTokens {
|
|
@@ -39,11 +43,23 @@ interface ThemeTokens {
|
|
|
39
43
|
colorPrimaryForeground: string;
|
|
40
44
|
colorAccent: string;
|
|
41
45
|
colorBorder: string;
|
|
46
|
+
/** Surface color for cards/panels layered on the background. */
|
|
47
|
+
colorCard: string;
|
|
48
|
+
/** Foreground used on top of `colorCard`. */
|
|
49
|
+
colorCardForeground: string;
|
|
50
|
+
/** Semantic colors for status (healthy / approaching limit / over limit). */
|
|
51
|
+
colorSuccess: string;
|
|
52
|
+
colorWarning: string;
|
|
53
|
+
colorDanger: string;
|
|
42
54
|
radius: string;
|
|
55
|
+
/** Box-shadow applied to elevated surfaces (cards/portals). */
|
|
56
|
+
shadow: string;
|
|
43
57
|
fontFamily: string;
|
|
44
58
|
}
|
|
45
|
-
type ThemePresetName = "light" | "dark" | "memphis" | "dashboard";
|
|
59
|
+
type ThemePresetName = "light" | "dark" | "memphis" | "dashboard" | "console" | "midnight" | "ocean" | "forest" | "sunset" | "grape";
|
|
46
60
|
declare const THEME_PRESETS: Record<ThemePresetName, ThemeTokens>;
|
|
61
|
+
/** All preset names, useful for theme pickers / story matrices. */
|
|
62
|
+
declare const THEME_PRESET_NAMES: ThemePresetName[];
|
|
47
63
|
type Appearance = ThemePresetName | {
|
|
48
64
|
preset?: ThemePresetName;
|
|
49
65
|
tokens?: Partial<ThemeTokens>;
|
|
@@ -157,8 +173,15 @@ interface PricingTableProps {
|
|
|
157
173
|
onSelectPlan?: (planId: string) => void;
|
|
158
174
|
/** Where the Contact Sales CTA links (defaults to no-op). */
|
|
159
175
|
onContactSales?: (planId: string) => void;
|
|
176
|
+
/**
|
|
177
|
+
* When there are no plans to show, render illustrative sample plans behind a
|
|
178
|
+
* clear disclaimer instead of an empty table. Defaults to `true`.
|
|
179
|
+
*/
|
|
180
|
+
sampleWhenEmpty?: boolean;
|
|
181
|
+
/** Override the sample-data disclaimer copy. */
|
|
182
|
+
disclaimer?: ReactNode;
|
|
160
183
|
}
|
|
161
|
-
declare function PricingTable({ plans: plansProp, highlightPlan, locale, onSelectPlan, onContactSales, }: PricingTableProps): react.JSX.Element;
|
|
184
|
+
declare function PricingTable({ plans: plansProp, highlightPlan, locale, onSelectPlan, onContactSales, sampleWhenEmpty, disclaimer, }: PricingTableProps): react.JSX.Element;
|
|
162
185
|
|
|
163
186
|
interface PaywallProps {
|
|
164
187
|
/** Feature key gating the content. */
|
|
@@ -191,12 +214,21 @@ interface CustomerPortalProps {
|
|
|
191
214
|
meterIds?: string[];
|
|
192
215
|
/** Whether to show the credit balance card. */
|
|
193
216
|
showCredits?: boolean;
|
|
217
|
+
/**
|
|
218
|
+
* Render illustrative sample plan/usage/credit data behind a clear disclaimer.
|
|
219
|
+
* Use for previews or a fresh workspace with no plans/products defined yet.
|
|
220
|
+
*/
|
|
221
|
+
sample?: boolean;
|
|
222
|
+
/** Override the sample-data disclaimer copy. */
|
|
223
|
+
disclaimer?: ReactNode;
|
|
224
|
+
/** Show the "Powered by MonetizeKit" footer. */
|
|
225
|
+
showBranding?: boolean;
|
|
194
226
|
locale?: string;
|
|
195
227
|
currency?: string;
|
|
196
228
|
onManageBilling?: () => void;
|
|
197
229
|
}
|
|
198
230
|
/** A self-service portal: current plan, usage meters, and credit balance. */
|
|
199
|
-
declare function CustomerPortal({ planName, meterIds, showCredits, locale, currency, onManageBilling, }: CustomerPortalProps): react.JSX.Element;
|
|
231
|
+
declare function CustomerPortal({ planName, meterIds, showCredits, sample, disclaimer, showBranding, locale, currency, onManageBilling, }: CustomerPortalProps): react.JSX.Element;
|
|
200
232
|
|
|
201
233
|
interface EntitlementGateProps {
|
|
202
234
|
/** Feature key to check for the provider's customer. */
|
|
@@ -211,6 +243,33 @@ interface EntitlementGateProps {
|
|
|
211
243
|
/** Conditionally render children based on a live entitlement check. */
|
|
212
244
|
declare function EntitlementGate({ feature, children, fallback, loadingFallback, }: EntitlementGateProps): react.JSX.Element;
|
|
213
245
|
|
|
246
|
+
interface SampleNoticeProps {
|
|
247
|
+
/** Override the default disclaimer copy. */
|
|
248
|
+
children?: ReactNode;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* A clearly-styled disclaimer banner shown above illustrative sample content so
|
|
252
|
+
* it is never mistaken for live data.
|
|
253
|
+
*/
|
|
254
|
+
declare function SampleNotice({ children }: SampleNoticeProps): react.JSX.Element;
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Illustrative sample data used to show what a surface *could* look like when no
|
|
258
|
+
* real catalog/customer data is available yet (e.g. a fresh workspace with no
|
|
259
|
+
* plans or products defined). Always paired with a visible <SampleNotice/> so it
|
|
260
|
+
* is never mistaken for live data.
|
|
261
|
+
*/
|
|
262
|
+
|
|
263
|
+
declare const SAMPLE_PLANS: Plan[];
|
|
264
|
+
declare const SAMPLE_USAGE: Record<string, UsageResult>;
|
|
265
|
+
declare const SAMPLE_CREDITS: CreditBalance;
|
|
266
|
+
declare const SAMPLE_PORTAL: {
|
|
267
|
+
readonly planName: "Growth";
|
|
268
|
+
readonly meterIds: readonly ["api_calls", "seats"];
|
|
269
|
+
};
|
|
270
|
+
/** Default disclaimer copy shown alongside sample data. */
|
|
271
|
+
declare const SAMPLE_NOTICE_TEXT = "Sample data for illustration only \u2014 define plans and products to show live values.";
|
|
272
|
+
|
|
214
273
|
/** Format a monetary amount with Intl, honoring locale + currency. */
|
|
215
274
|
declare function formatMoney(amount: number, currency?: string, locale?: string): string;
|
|
216
275
|
/** Format a large unit count compactly (e.g. 5,000 / 1M). */
|
|
@@ -231,4 +290,4 @@ declare function describePlanPrice(plan: Plan, locale?: string): PriceDisplay;
|
|
|
231
290
|
/** Human-readable description of a usage term's metered tiers. */
|
|
232
291
|
declare function describeUsageTerm(term: PricingTerm, locale?: string): string;
|
|
233
292
|
|
|
234
|
-
export { type Appearance, type CreditBalance, CustomerPortal, type CustomerPortalProps, EntitlementGate, type EntitlementGateProps, type EntitlementResult, MonetizeKitClient, type MonetizeKitClientConfig, type MonetizeKitContextValue, MonetizeKitProvider, type MonetizeKitProviderProps, Paywall, type PaywallProps, type Plan, type PlanEntitlement, type PriceDisplay, PricingTable, type PricingTableProps, type PricingTerm, type PricingTier, THEME_PRESETS, type ThemePresetName, type ThemeTokens, UsageBanner, type UsageBannerProps, type UsageResult, describePlanPrice, describeUsageTerm, formatMoney, formatUnits, resolveTokens, tokensToStyle, useCredits, useEntitlement, useMonetizeKit, useUsage };
|
|
293
|
+
export { type Appearance, type CreditBalance, CustomerPortal, type CustomerPortalProps, EntitlementGate, type EntitlementGateProps, type EntitlementResult, MonetizeKitClient, type MonetizeKitClientConfig, type MonetizeKitContextValue, MonetizeKitProvider, type MonetizeKitProviderProps, Paywall, type PaywallProps, type Plan, type PlanEntitlement, type PriceDisplay, PricingTable, type PricingTableProps, type PricingTerm, type PricingTier, SAMPLE_CREDITS, SAMPLE_NOTICE_TEXT, SAMPLE_PLANS, SAMPLE_PORTAL, SAMPLE_USAGE, SampleNotice, type SampleNoticeProps, THEME_PRESETS, THEME_PRESET_NAMES, type ThemePresetName, type ThemeTokens, UsageBanner, type UsageBannerProps, type UsageResult, describePlanPrice, describeUsageTerm, formatMoney, formatUnits, resolveTokens, tokensToStyle, useCredits, useEntitlement, useMonetizeKit, useUsage };
|