@monetizekit/react 0.2.0 → 0.3.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 +110 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +36 -5
- package/dist/index.d.ts +36 -5
- package/dist/index.js +109 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -409,7 +409,7 @@ var SAMPLE_PLANS = [
|
|
|
409
409
|
id: "sample_pro",
|
|
410
410
|
name: "Growth",
|
|
411
411
|
description: "Product-led monetization at scale",
|
|
412
|
-
pricing: [{ type: "flat", amount:
|
|
412
|
+
pricing: [{ type: "flat", amount: 499, currency: "USD", interval: "monthly" }],
|
|
413
413
|
entitlements: [
|
|
414
414
|
{ featureKey: "max_customers", featureDisplayName: "Tracked customers", type: "limit", value: 1e4 },
|
|
415
415
|
{ featureKey: "stripe", featureDisplayName: "Stripe integration", type: "boolean", value: true },
|
|
@@ -422,7 +422,7 @@ var SAMPLE_PLANS = [
|
|
|
422
422
|
name: "Scale",
|
|
423
423
|
description: "Volume-based capacity pricing",
|
|
424
424
|
pricing: [
|
|
425
|
-
{ type: "flat", amount:
|
|
425
|
+
{ type: "flat", amount: 999, currency: "USD", interval: "monthly" },
|
|
426
426
|
{
|
|
427
427
|
type: "usage",
|
|
428
428
|
amount: 0,
|
|
@@ -460,7 +460,21 @@ var SAMPLE_USAGE = {
|
|
|
460
460
|
seats: { meterId: "seats", current: 8, limit: 10 },
|
|
461
461
|
storage_gb: { meterId: "storage_gb", current: 3, limit: 10 }
|
|
462
462
|
};
|
|
463
|
-
var SAMPLE_CREDITS = { balance:
|
|
463
|
+
var SAMPLE_CREDITS = { balance: 1200, currency: "USD" };
|
|
464
|
+
var SAMPLE_TEAM = {
|
|
465
|
+
members: [
|
|
466
|
+
{ name: "Jordan Lee", email: "jordan@acme.test", role: "owner" },
|
|
467
|
+
{ name: "Sam Rivera", email: "sam@acme.test", role: "admin" },
|
|
468
|
+
{ name: "Taylor Kim", email: "taylor@acme.test", role: "member" }
|
|
469
|
+
],
|
|
470
|
+
seats: 3,
|
|
471
|
+
maxSeats: 10
|
|
472
|
+
};
|
|
473
|
+
var SAMPLE_INVOICES = [
|
|
474
|
+
{ id: "in_1003", date: "2026-03-01T00:00:00Z", amount: 499, currency: "USD", status: "paid" },
|
|
475
|
+
{ id: "in_1002", date: "2026-02-01T00:00:00Z", amount: 499, currency: "USD", status: "paid" },
|
|
476
|
+
{ id: "in_1001", date: "2026-01-01T00:00:00Z", amount: 499, currency: "USD", status: "paid" }
|
|
477
|
+
];
|
|
464
478
|
var SAMPLE_PORTAL = {
|
|
465
479
|
planName: "Growth",
|
|
466
480
|
meterIds: ["api_calls", "seats"]
|
|
@@ -758,10 +772,38 @@ function SampleUsageRow({
|
|
|
758
772
|
hasLimit ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: 6, borderRadius: 999, background: "var(--mk-border)", overflow: "hidden" }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { width: `${fraction * 100}%`, height: "100%", background: barColor } }) }) : null
|
|
759
773
|
] });
|
|
760
774
|
}
|
|
775
|
+
var ROW_DIVIDER = { borderTop: "1px solid var(--mk-border)" };
|
|
776
|
+
var INVOICE_STATUS_COLOR = {
|
|
777
|
+
paid: "var(--mk-success)",
|
|
778
|
+
pending: "var(--mk-warning)",
|
|
779
|
+
overdue: "var(--mk-danger)"
|
|
780
|
+
};
|
|
781
|
+
function StatusBadge({ label, color }) {
|
|
782
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
783
|
+
"span",
|
|
784
|
+
{
|
|
785
|
+
style: {
|
|
786
|
+
fontSize: "0.6875rem",
|
|
787
|
+
fontWeight: 600,
|
|
788
|
+
textTransform: "capitalize",
|
|
789
|
+
color,
|
|
790
|
+
border: `1px solid ${color}`,
|
|
791
|
+
borderRadius: 999,
|
|
792
|
+
padding: "0.0625rem 0.5rem"
|
|
793
|
+
},
|
|
794
|
+
children: label
|
|
795
|
+
}
|
|
796
|
+
);
|
|
797
|
+
}
|
|
761
798
|
function CustomerPortal({
|
|
762
799
|
planName,
|
|
763
800
|
meterIds,
|
|
764
801
|
showCredits = true,
|
|
802
|
+
showTeam,
|
|
803
|
+
teamMembers,
|
|
804
|
+
seats,
|
|
805
|
+
showInvoices,
|
|
806
|
+
invoices,
|
|
765
807
|
sample = false,
|
|
766
808
|
disclaimer,
|
|
767
809
|
showBranding = false,
|
|
@@ -776,6 +818,11 @@ function CustomerPortal({
|
|
|
776
818
|
const creditBalance = sample ? SAMPLE_CREDITS.balance : credits.balance;
|
|
777
819
|
const creditCurrency = sample ? SAMPLE_CREDITS.currency : credits.currency;
|
|
778
820
|
const creditLoading = sample ? false : credits.loading;
|
|
821
|
+
const teamEnabled = showTeam ?? sample;
|
|
822
|
+
const resolvedTeam = teamMembers ?? (sample ? SAMPLE_TEAM.members : []);
|
|
823
|
+
const resolvedSeats = seats ?? (sample ? { used: SAMPLE_TEAM.seats, max: SAMPLE_TEAM.maxSeats } : void 0);
|
|
824
|
+
const invoicesEnabled = showInvoices ?? sample;
|
|
825
|
+
const resolvedInvoices = invoices ?? (sample ? SAMPLE_INVOICES : []);
|
|
779
826
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
780
827
|
"div",
|
|
781
828
|
{
|
|
@@ -842,6 +889,64 @@ function CustomerPortal({
|
|
|
842
889
|
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "Credits" }),
|
|
843
890
|
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--mk-muted)" }, children: creditLoading ? "\u2026" : formatMoney(creditBalance, creditCurrency ?? currency, locale) })
|
|
844
891
|
] }) : null,
|
|
892
|
+
teamEnabled ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: cardStyle, children: [
|
|
893
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" }, children: [
|
|
894
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "Team" }),
|
|
895
|
+
resolvedSeats ? /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { color: "var(--mk-muted)", fontSize: "0.75rem" }, children: [
|
|
896
|
+
resolvedSeats.used,
|
|
897
|
+
"/",
|
|
898
|
+
resolvedSeats.max >= 9999 ? "Unlimited" : resolvedSeats.max,
|
|
899
|
+
" seats"
|
|
900
|
+
] }) : null
|
|
901
|
+
] }),
|
|
902
|
+
resolvedTeam.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--mk-muted)", fontSize: "0.8125rem" }, children: "No team members." }) : resolvedTeam.map((member, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
903
|
+
"div",
|
|
904
|
+
{
|
|
905
|
+
style: {
|
|
906
|
+
display: "flex",
|
|
907
|
+
justifyContent: "space-between",
|
|
908
|
+
alignItems: "center",
|
|
909
|
+
gap: "0.75rem",
|
|
910
|
+
fontSize: "0.8125rem",
|
|
911
|
+
paddingTop: i === 0 ? 0 : "0.5rem",
|
|
912
|
+
...i === 0 ? {} : ROW_DIVIDER
|
|
913
|
+
},
|
|
914
|
+
children: [
|
|
915
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { minWidth: 0 }, children: [
|
|
916
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontWeight: 600 }, children: member.name }),
|
|
917
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: "var(--mk-muted)", fontSize: "0.75rem" }, children: member.email })
|
|
918
|
+
] }),
|
|
919
|
+
/* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { label: member.role, color: "var(--mk-muted)" })
|
|
920
|
+
]
|
|
921
|
+
},
|
|
922
|
+
member.email
|
|
923
|
+
))
|
|
924
|
+
] }) : null,
|
|
925
|
+
invoicesEnabled ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: cardStyle, children: [
|
|
926
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontSize: "0.875rem" }, children: "Invoices" }),
|
|
927
|
+
resolvedInvoices.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--mk-muted)", fontSize: "0.8125rem" }, children: "No invoices yet." }) : resolvedInvoices.map((invoice, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
928
|
+
"div",
|
|
929
|
+
{
|
|
930
|
+
style: {
|
|
931
|
+
display: "flex",
|
|
932
|
+
justifyContent: "space-between",
|
|
933
|
+
alignItems: "center",
|
|
934
|
+
gap: "0.75rem",
|
|
935
|
+
fontSize: "0.8125rem",
|
|
936
|
+
paddingTop: i === 0 ? 0 : "0.5rem",
|
|
937
|
+
...i === 0 ? {} : ROW_DIVIDER
|
|
938
|
+
},
|
|
939
|
+
children: [
|
|
940
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 500 }, children: new Date(invoice.date).toLocaleDateString(locale) }),
|
|
941
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [
|
|
942
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600 }, children: formatMoney(invoice.amount, invoice.currency, locale) }),
|
|
943
|
+
/* @__PURE__ */ jsxRuntime.jsx(StatusBadge, { label: invoice.status, color: INVOICE_STATUS_COLOR[invoice.status] })
|
|
944
|
+
] })
|
|
945
|
+
]
|
|
946
|
+
},
|
|
947
|
+
invoice.id
|
|
948
|
+
))
|
|
949
|
+
] }) : null,
|
|
845
950
|
showBranding ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { textAlign: "center", fontSize: "0.625rem", color: "var(--mk-muted)" }, children: "Powered by MonetizeKit" }) : null
|
|
846
951
|
]
|
|
847
952
|
}
|
|
@@ -865,9 +970,11 @@ exports.MonetizeKitProvider = MonetizeKitProvider;
|
|
|
865
970
|
exports.Paywall = Paywall;
|
|
866
971
|
exports.PricingTable = PricingTable;
|
|
867
972
|
exports.SAMPLE_CREDITS = SAMPLE_CREDITS;
|
|
973
|
+
exports.SAMPLE_INVOICES = SAMPLE_INVOICES;
|
|
868
974
|
exports.SAMPLE_NOTICE_TEXT = SAMPLE_NOTICE_TEXT;
|
|
869
975
|
exports.SAMPLE_PLANS = SAMPLE_PLANS;
|
|
870
976
|
exports.SAMPLE_PORTAL = SAMPLE_PORTAL;
|
|
977
|
+
exports.SAMPLE_TEAM = SAMPLE_TEAM;
|
|
871
978
|
exports.SAMPLE_USAGE = SAMPLE_USAGE;
|
|
872
979
|
exports.SampleNotice = SampleNotice;
|
|
873
980
|
exports.THEME_PRESETS = THEME_PRESETS;
|
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/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"]}
|
|
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, Invoice, Plan, TeamMember, 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: 499, 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: 999, 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: 1200, currency: \"USD\" };\n\nexport const SAMPLE_TEAM: { members: TeamMember[]; seats: number; maxSeats: number } = {\n members: [\n { name: \"Jordan Lee\", email: \"jordan@acme.test\", role: \"owner\" },\n { name: \"Sam Rivera\", email: \"sam@acme.test\", role: \"admin\" },\n { name: \"Taylor Kim\", email: \"taylor@acme.test\", role: \"member\" },\n ],\n seats: 3,\n maxSeats: 10,\n};\n\nexport const SAMPLE_INVOICES: Invoice[] = [\n { id: \"in_1003\", date: \"2026-03-01T00:00:00Z\", amount: 499, currency: \"USD\", status: \"paid\" },\n { id: \"in_1002\", date: \"2026-02-01T00:00:00Z\", amount: 499, currency: \"USD\", status: \"paid\" },\n { id: \"in_1001\", date: \"2026-01-01T00:00:00Z\", amount: 499, currency: \"USD\", status: \"paid\" },\n];\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 {\n SAMPLE_CREDITS,\n SAMPLE_INVOICES,\n SAMPLE_PORTAL,\n SAMPLE_TEAM,\n SAMPLE_USAGE,\n} from \"../lib/sample-data\";\nimport type { Invoice, TeamMember } from \"../types\";\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 /** Show a team/seats section. Defaults to on in `sample` mode. */\n showTeam?: boolean;\n teamMembers?: TeamMember[];\n seats?: { used: number; max: number };\n /** Show a billing-history (invoices) section. Defaults to on in `sample` mode. */\n showInvoices?: boolean;\n invoices?: Invoice[];\n /**\n * Render illustrative sample plan/usage/credit/team/invoice data behind a clear\n * disclaimer. Use for previews or a fresh workspace with no plans/products 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\nconst ROW_DIVIDER: CSSProperties = { borderTop: \"1px solid var(--mk-border)\" };\n\nconst INVOICE_STATUS_COLOR: Record<Invoice[\"status\"], string> = {\n paid: \"var(--mk-success)\",\n pending: \"var(--mk-warning)\",\n overdue: \"var(--mk-danger)\",\n};\n\nfunction StatusBadge({ label, color }: { label: string; color: string }) {\n return (\n <span\n style={{\n fontSize: \"0.6875rem\",\n fontWeight: 600,\n textTransform: \"capitalize\",\n color,\n border: `1px solid ${color}`,\n borderRadius: 999,\n padding: \"0.0625rem 0.5rem\",\n }}\n >\n {label}\n </span>\n );\n}\n\n/** A self-service portal: plan, usage, credits, team, and invoices. */\nexport function CustomerPortal({\n planName,\n meterIds,\n showCredits = true,\n showTeam,\n teamMembers,\n seats,\n showInvoices,\n invoices,\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 const teamEnabled = showTeam ?? sample;\n const resolvedTeam = teamMembers ?? (sample ? SAMPLE_TEAM.members : []);\n const resolvedSeats = seats ?? (sample ? { used: SAMPLE_TEAM.seats, max: SAMPLE_TEAM.maxSeats } : undefined);\n const invoicesEnabled = showInvoices ?? sample;\n const resolvedInvoices = invoices ?? (sample ? SAMPLE_INVOICES : []);\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 {teamEnabled ? (\n <div style={cardStyle}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <span style={{ fontWeight: 600, fontSize: \"0.875rem\" }}>Team</span>\n {resolvedSeats ? (\n <span style={{ color: \"var(--mk-muted)\", fontSize: \"0.75rem\" }}>\n {resolvedSeats.used}/{resolvedSeats.max >= 9999 ? \"Unlimited\" : resolvedSeats.max} seats\n </span>\n ) : null}\n </div>\n {resolvedTeam.length === 0 ? (\n <span style={{ color: \"var(--mk-muted)\", fontSize: \"0.8125rem\" }}>No team members.</span>\n ) : (\n resolvedTeam.map((member, i) => (\n <div\n key={member.email}\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n fontSize: \"0.8125rem\",\n paddingTop: i === 0 ? 0 : \"0.5rem\",\n ...(i === 0 ? {} : ROW_DIVIDER),\n }}\n >\n <div style={{ minWidth: 0 }}>\n <div style={{ fontWeight: 600 }}>{member.name}</div>\n <div style={{ color: \"var(--mk-muted)\", fontSize: \"0.75rem\" }}>{member.email}</div>\n </div>\n <StatusBadge label={member.role} color=\"var(--mk-muted)\" />\n </div>\n ))\n )}\n </div>\n ) : null}\n\n {invoicesEnabled ? (\n <div style={cardStyle}>\n <span style={{ fontWeight: 600, fontSize: \"0.875rem\" }}>Invoices</span>\n {resolvedInvoices.length === 0 ? (\n <span style={{ color: \"var(--mk-muted)\", fontSize: \"0.8125rem\" }}>No invoices yet.</span>\n ) : (\n resolvedInvoices.map((invoice, i) => (\n <div\n key={invoice.id}\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n fontSize: \"0.8125rem\",\n paddingTop: i === 0 ? 0 : \"0.5rem\",\n ...(i === 0 ? {} : ROW_DIVIDER),\n }}\n >\n <span style={{ fontWeight: 500 }}>\n {new Date(invoice.date).toLocaleDateString(locale)}\n </span>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <span style={{ fontWeight: 600 }}>\n {formatMoney(invoice.amount, invoice.currency, locale)}\n </span>\n <StatusBadge label={invoice.status} color={INVOICE_STATUS_COLOR[invoice.status]} />\n </div>\n </div>\n ))\n )}\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"]}
|