@cogentic-co/ds 0.4.1
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/LICENSE +21 -0
- package/README.md +139 -0
- package/dist/animations/animation-ai-analysis.d.ts +7 -0
- package/dist/animations/animation-ai-analysis.js +7 -0
- package/dist/animations/animation-ai-analysis.js.map +1 -0
- package/dist/animations/animation-audit-trail.d.ts +7 -0
- package/dist/animations/animation-audit-trail.js +5 -0
- package/dist/animations/animation-audit-trail.js.map +1 -0
- package/dist/animations/animation-compliance-reports.d.ts +7 -0
- package/dist/animations/animation-compliance-reports.js +7 -0
- package/dist/animations/animation-compliance-reports.js.map +1 -0
- package/dist/animations/animation-custom-rules.d.ts +7 -0
- package/dist/animations/animation-custom-rules.js +7 -0
- package/dist/animations/animation-custom-rules.js.map +1 -0
- package/dist/animations/animation-jira-ticket.d.ts +7 -0
- package/dist/animations/animation-jira-ticket.js +6 -0
- package/dist/animations/animation-jira-ticket.js.map +1 -0
- package/dist/animations/animation-jurisdiction-detection.d.ts +7 -0
- package/dist/animations/animation-jurisdiction-detection.js +7 -0
- package/dist/animations/animation-jurisdiction-detection.js.map +1 -0
- package/dist/animations/animation-multi-protocol.d.ts +7 -0
- package/dist/animations/animation-multi-protocol.js +5 -0
- package/dist/animations/animation-multi-protocol.js.map +1 -0
- package/dist/animations/animation-pricing-preview.d.ts +16 -0
- package/dist/animations/animation-pricing-preview.js +7 -0
- package/dist/animations/animation-pricing-preview.js.map +1 -0
- package/dist/animations/animation-realtime-updates.d.ts +7 -0
- package/dist/animations/animation-realtime-updates.js +8 -0
- package/dist/animations/animation-realtime-updates.js.map +1 -0
- package/dist/animations/animation-rest-api.d.ts +7 -0
- package/dist/animations/animation-rest-api.js +5 -0
- package/dist/animations/animation-rest-api.js.map +1 -0
- package/dist/animations/animation-risk-scoring.d.ts +7 -0
- package/dist/animations/animation-risk-scoring.js +8 -0
- package/dist/animations/animation-risk-scoring.js.map +1 -0
- package/dist/animations/animation-sandbox.d.ts +7 -0
- package/dist/animations/animation-sandbox.js +5 -0
- package/dist/animations/animation-sandbox.js.map +1 -0
- package/dist/animations/animation-scheduled-reports.d.ts +7 -0
- package/dist/animations/animation-scheduled-reports.js +7 -0
- package/dist/animations/animation-scheduled-reports.js.map +1 -0
- package/dist/animations/animation-secure-messaging.d.ts +7 -0
- package/dist/animations/animation-secure-messaging.js +6 -0
- package/dist/animations/animation-secure-messaging.js.map +1 -0
- package/dist/animations/animation-slack-notification.d.ts +7 -0
- package/dist/animations/animation-slack-notification.js +6 -0
- package/dist/animations/animation-slack-notification.js.map +1 -0
- package/dist/animations/animation-sop-mapping.d.ts +7 -0
- package/dist/animations/animation-sop-mapping.js +5 -0
- package/dist/animations/animation-sop-mapping.js.map +1 -0
- package/dist/animations/animation-team-routing.d.ts +7 -0
- package/dist/animations/animation-team-routing.js +7 -0
- package/dist/animations/animation-team-routing.js.map +1 -0
- package/dist/animations/animation-teams-notification.d.ts +7 -0
- package/dist/animations/animation-teams-notification.js +6 -0
- package/dist/animations/animation-teams-notification.js.map +1 -0
- package/dist/animations/animation-vasp-identification.d.ts +7 -0
- package/dist/animations/animation-vasp-identification.js +7 -0
- package/dist/animations/animation-vasp-identification.js.map +1 -0
- package/dist/animations/animation-webhooks.d.ts +7 -0
- package/dist/animations/animation-webhooks.js +6 -0
- package/dist/animations/animation-webhooks.js.map +1 -0
- package/dist/blocks/auth-form.d.ts +18 -0
- package/dist/blocks/auth-form.js +7 -0
- package/dist/blocks/auth-form.js.map +1 -0
- package/dist/blocks/feature-section.d.ts +17 -0
- package/dist/blocks/feature-section.js +5 -0
- package/dist/blocks/feature-section.js.map +1 -0
- package/dist/blocks/hero-section.d.ts +19 -0
- package/dist/blocks/hero-section.js +5 -0
- package/dist/blocks/hero-section.js.map +1 -0
- package/dist/blocks/pricing-table.d.ts +24 -0
- package/dist/blocks/pricing-table.js +6 -0
- package/dist/blocks/pricing-table.js.map +1 -0
- package/dist/blocks/stat-card.d.ts +15 -0
- package/dist/blocks/stat-card.js +6 -0
- package/dist/blocks/stat-card.js.map +1 -0
- package/dist/card-Cumdyf_G.d.ts +15 -0
- package/dist/charts.d.ts +4 -0
- package/dist/charts.js +5 -0
- package/dist/charts.js.map +1 -0
- package/dist/chatbot.d.ts +280 -0
- package/dist/chatbot.js +2202 -0
- package/dist/chatbot.js.map +1 -0
- package/dist/chunk-4NEQV6H2.js +39 -0
- package/dist/chunk-4NEQV6H2.js.map +1 -0
- package/dist/chunk-4YD3YS4B.js +110 -0
- package/dist/chunk-4YD3YS4B.js.map +1 -0
- package/dist/chunk-5JLZ42JT.js +125 -0
- package/dist/chunk-5JLZ42JT.js.map +1 -0
- package/dist/chunk-5OOO6TRA.js +111 -0
- package/dist/chunk-5OOO6TRA.js.map +1 -0
- package/dist/chunk-65Z2VEKG.js +161 -0
- package/dist/chunk-65Z2VEKG.js.map +1 -0
- package/dist/chunk-6RWCZUAD.js +12 -0
- package/dist/chunk-6RWCZUAD.js.map +1 -0
- package/dist/chunk-7HRPF2N2.js +56 -0
- package/dist/chunk-7HRPF2N2.js.map +1 -0
- package/dist/chunk-BNFSXNP2.js +71 -0
- package/dist/chunk-BNFSXNP2.js.map +1 -0
- package/dist/chunk-BTFYV3TI.js +102 -0
- package/dist/chunk-BTFYV3TI.js.map +1 -0
- package/dist/chunk-BTZB4JRC.js +117 -0
- package/dist/chunk-BTZB4JRC.js.map +1 -0
- package/dist/chunk-BZSA47MS.js +121 -0
- package/dist/chunk-BZSA47MS.js.map +1 -0
- package/dist/chunk-CG5JA7FM.js +107 -0
- package/dist/chunk-CG5JA7FM.js.map +1 -0
- package/dist/chunk-EFLWU2JP.js +145 -0
- package/dist/chunk-EFLWU2JP.js.map +1 -0
- package/dist/chunk-F7REPQOA.js +93 -0
- package/dist/chunk-F7REPQOA.js.map +1 -0
- package/dist/chunk-FKPK3CB7.js +143 -0
- package/dist/chunk-FKPK3CB7.js.map +1 -0
- package/dist/chunk-GZNLQE3I.js +55 -0
- package/dist/chunk-GZNLQE3I.js.map +1 -0
- package/dist/chunk-H7VUIMEL.js +172 -0
- package/dist/chunk-H7VUIMEL.js.map +1 -0
- package/dist/chunk-HTYR73ON.js +161 -0
- package/dist/chunk-HTYR73ON.js.map +1 -0
- package/dist/chunk-I26ZXVSY.js +124 -0
- package/dist/chunk-I26ZXVSY.js.map +1 -0
- package/dist/chunk-IKATDPHG.js +92 -0
- package/dist/chunk-IKATDPHG.js.map +1 -0
- package/dist/chunk-KUOF3XRZ.js +108 -0
- package/dist/chunk-KUOF3XRZ.js.map +1 -0
- package/dist/chunk-LW6GAWZM.js +148 -0
- package/dist/chunk-LW6GAWZM.js.map +1 -0
- package/dist/chunk-N7PBUY7G.js +110 -0
- package/dist/chunk-N7PBUY7G.js.map +1 -0
- package/dist/chunk-NAPDFVBI.js +102 -0
- package/dist/chunk-NAPDFVBI.js.map +1 -0
- package/dist/chunk-RTK7R4KZ.js +66 -0
- package/dist/chunk-RTK7R4KZ.js.map +1 -0
- package/dist/chunk-RXV2XUDZ.js +31 -0
- package/dist/chunk-RXV2XUDZ.js.map +1 -0
- package/dist/chunk-RZZTDJHG.js +110 -0
- package/dist/chunk-RZZTDJHG.js.map +1 -0
- package/dist/chunk-SNOJLZP4.js +197 -0
- package/dist/chunk-SNOJLZP4.js.map +1 -0
- package/dist/chunk-TAPJEVUA.js +24 -0
- package/dist/chunk-TAPJEVUA.js.map +1 -0
- package/dist/chunk-U4EPKN7G.js +518 -0
- package/dist/chunk-U4EPKN7G.js.map +1 -0
- package/dist/chunk-VWSX75RB.js +202 -0
- package/dist/chunk-VWSX75RB.js.map +1 -0
- package/dist/chunk-XFWKI45G.js +800 -0
- package/dist/chunk-XFWKI45G.js.map +1 -0
- package/dist/chunk-XQYFQ6PU.js +77 -0
- package/dist/chunk-XQYFQ6PU.js.map +1 -0
- package/dist/index-CcPuHWa-.d.ts +118 -0
- package/dist/index.d.ts +1385 -0
- package/dist/index.js +8673 -0
- package/dist/index.js.map +1 -0
- package/dist/workflow.d.ts +165 -0
- package/dist/workflow.js +5 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +157 -0
- package/src/styles/globals.css +211 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Button } from './chunk-BNFSXNP2.js';
|
|
3
|
+
import { cn, __objRest, __spreadProps, __spreadValues } from './chunk-GZNLQE3I.js';
|
|
4
|
+
import { CheckCircle2 } from 'lucide-react';
|
|
5
|
+
import Link from 'next/link';
|
|
6
|
+
import { useRef, useState, useEffect } from 'react';
|
|
7
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
8
|
+
import { Switch as Switch$1 } from '@base-ui/react/switch';
|
|
9
|
+
|
|
10
|
+
var prefersReducedMotion = typeof window !== "undefined" && typeof window.matchMedia === "function" ? window.matchMedia("(prefers-reduced-motion: reduce)").matches : false;
|
|
11
|
+
function FadeIn({ as: Tag = "div", delay = 0, className, children }) {
|
|
12
|
+
const ref = useRef(null);
|
|
13
|
+
const [visible, setVisible] = useState(prefersReducedMotion);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
const el = ref.current;
|
|
16
|
+
if (!el || visible) return;
|
|
17
|
+
const observer = new IntersectionObserver(
|
|
18
|
+
([entry]) => {
|
|
19
|
+
if (entry.isIntersecting) {
|
|
20
|
+
setVisible(true);
|
|
21
|
+
observer.disconnect();
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
{ rootMargin: "-80px" }
|
|
25
|
+
);
|
|
26
|
+
observer.observe(el);
|
|
27
|
+
return () => observer.disconnect();
|
|
28
|
+
}, [visible]);
|
|
29
|
+
return /* @__PURE__ */ jsx(
|
|
30
|
+
Tag,
|
|
31
|
+
{
|
|
32
|
+
ref,
|
|
33
|
+
"data-slot": "fade-in",
|
|
34
|
+
className: cn(className, visible ? "animate-[fade-up_0.5s_ease-out_both]" : "opacity-0"),
|
|
35
|
+
style: delay > 0 && visible ? { animationDelay: `${delay}ms` } : void 0,
|
|
36
|
+
children
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
function Switch(_a) {
|
|
41
|
+
var _b = _a, {
|
|
42
|
+
className,
|
|
43
|
+
size = "default"
|
|
44
|
+
} = _b, props = __objRest(_b, [
|
|
45
|
+
"className",
|
|
46
|
+
"size"
|
|
47
|
+
]);
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
Switch$1.Root,
|
|
50
|
+
__spreadProps(__spreadValues({
|
|
51
|
+
"data-slot": "switch",
|
|
52
|
+
"data-size": size,
|
|
53
|
+
className: cn(
|
|
54
|
+
"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs outline-none transition-all after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=sm]:h-[14px] data-[size=default]:w-[32px] data-[size=sm]:w-[24px] data-disabled:cursor-not-allowed data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-50 dark:data-unchecked:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
55
|
+
className
|
|
56
|
+
)
|
|
57
|
+
}, props), {
|
|
58
|
+
children: /* @__PURE__ */ jsx(
|
|
59
|
+
Switch$1.Thumb,
|
|
60
|
+
{
|
|
61
|
+
"data-slot": "switch-thumb",
|
|
62
|
+
className: "pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground"
|
|
63
|
+
}
|
|
64
|
+
)
|
|
65
|
+
})
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
var DEFAULT_PLANS = [
|
|
69
|
+
{
|
|
70
|
+
name: "Starter",
|
|
71
|
+
blurb: "For early-stage VASPs getting started with Travel Rule compliance.",
|
|
72
|
+
features: [
|
|
73
|
+
"Up to 50 transfers/month",
|
|
74
|
+
"5 jurisdictions",
|
|
75
|
+
"Basic jurisdiction detection",
|
|
76
|
+
"Email support",
|
|
77
|
+
"Audit trail"
|
|
78
|
+
],
|
|
79
|
+
ctaLabel: "Get started free",
|
|
80
|
+
ctaHref: "/contact"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: "Growth",
|
|
84
|
+
monthlyPrice: "$499",
|
|
85
|
+
annualPrice: "$399",
|
|
86
|
+
perUnitMonthly: "Per month",
|
|
87
|
+
perUnitAnnual: "Per month / billed yearly",
|
|
88
|
+
blurb: "For scaling VASPs with growing transfer volumes.",
|
|
89
|
+
features: [
|
|
90
|
+
"Up to 1,000 transfers/month",
|
|
91
|
+
"25 jurisdictions",
|
|
92
|
+
"AI-powered investigation",
|
|
93
|
+
"SOP mapping",
|
|
94
|
+
"Priority support",
|
|
95
|
+
"API access",
|
|
96
|
+
"Custom reports"
|
|
97
|
+
],
|
|
98
|
+
ctaLabel: "Start free trial",
|
|
99
|
+
ctaHref: "/contact",
|
|
100
|
+
highlight: true
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: "Enterprise",
|
|
104
|
+
blurb: "For high-volume VASPs with complex compliance requirements.",
|
|
105
|
+
features: [
|
|
106
|
+
"Unlimited transfers",
|
|
107
|
+
"All 45+ jurisdictions",
|
|
108
|
+
"Custom AI models",
|
|
109
|
+
"Dedicated compliance adviser",
|
|
110
|
+
"SLA guarantee",
|
|
111
|
+
"SSO & advanced security",
|
|
112
|
+
"Data residency options",
|
|
113
|
+
"Custom integrations"
|
|
114
|
+
],
|
|
115
|
+
ctaLabel: "Talk to sales",
|
|
116
|
+
ctaHref: "/contact"
|
|
117
|
+
}
|
|
118
|
+
];
|
|
119
|
+
function PricingCard({
|
|
120
|
+
plan,
|
|
121
|
+
index,
|
|
122
|
+
yearly,
|
|
123
|
+
prevPlanName
|
|
124
|
+
}) {
|
|
125
|
+
const price = yearly ? plan.annualPrice : plan.monthlyPrice;
|
|
126
|
+
const perUnit = yearly ? plan.perUnitAnnual : plan.perUnitMonthly;
|
|
127
|
+
return /* @__PURE__ */ jsxs(
|
|
128
|
+
FadeIn,
|
|
129
|
+
{
|
|
130
|
+
as: "article",
|
|
131
|
+
delay: index * 100,
|
|
132
|
+
className: cn("flex flex-col", plan.highlight && "bg-muted"),
|
|
133
|
+
children: [
|
|
134
|
+
/* @__PURE__ */ jsxs("div", { className: "flex h-[300px] flex-col gap-y-4 p-6", children: [
|
|
135
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
136
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold text-foreground text-lg", children: plan.name }),
|
|
137
|
+
yearly && plan.badge && /* @__PURE__ */ jsx("span", { className: "rounded-md bg-accent px-2 py-0.5 text-foreground text-xs", children: plan.badge })
|
|
138
|
+
] }),
|
|
139
|
+
!!plan.blurb && /* @__PURE__ */ jsx("p", { className: "mt-2 text-muted-foreground text-sm", children: plan.blurb }),
|
|
140
|
+
/* @__PURE__ */ jsx("div", { className: "mt-auto", children: price ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
141
|
+
/* @__PURE__ */ jsx("div", { className: "font-semibold text-[40px] text-foreground leading-none sm:text-[44px]", children: price }),
|
|
142
|
+
!!perUnit && /* @__PURE__ */ jsx("div", { className: "mt-2 text-muted-foreground text-sm", children: perUnit })
|
|
143
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
144
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium text-[40px] text-foreground leading-none sm:text-[44px]", children: index === 0 ? "Free" : "Let\u2019s talk" }),
|
|
145
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2 text-muted-foreground text-sm", children: index === 0 ? "No credit card required" : "Contact us for details" })
|
|
146
|
+
] }) }),
|
|
147
|
+
/* @__PURE__ */ jsx(
|
|
148
|
+
Button,
|
|
149
|
+
__spreadProps(__spreadValues({
|
|
150
|
+
variant: plan.highlight ? "default" : "outline"
|
|
151
|
+
}, plan.ctaHref ? { render: /* @__PURE__ */ jsx(Link, { href: plan.ctaHref }) } : {}), {
|
|
152
|
+
children: plan.ctaLabel
|
|
153
|
+
})
|
|
154
|
+
)
|
|
155
|
+
] }),
|
|
156
|
+
/* @__PURE__ */ jsxs("div", { className: "border-t p-6", children: [
|
|
157
|
+
/* @__PURE__ */ jsx("p", { className: "mb-4 font-medium text-foreground", children: prevPlanName ? `Everything in ${prevPlanName}, and:` : "Features" }),
|
|
158
|
+
/* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-y-3", children: plan.features.map((f) => /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2", children: [
|
|
159
|
+
/* @__PURE__ */ jsx(CheckCircle2, { className: "mt-0.5 size-5 shrink-0 text-primary", strokeWidth: 2.5 }),
|
|
160
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold text-muted-foreground text-sm", children: f })
|
|
161
|
+
] }, f)) })
|
|
162
|
+
] })
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
function PricingTable({ headline, subheadline, plans, className }) {
|
|
168
|
+
const items = (plans == null ? void 0 : plans.length) ? plans : DEFAULT_PLANS;
|
|
169
|
+
const [yearly, setYearly] = useState(true);
|
|
170
|
+
return /* @__PURE__ */ jsx("section", { "data-slot": "pricing-table", className: cn("bg-background px-6 lg:px-0", className), children: /* @__PURE__ */ jsx("div", { className: "container px-0 md:px-6", children: /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden", children: [
|
|
171
|
+
headline && /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-4xl px-6 py-12 text-center sm:px-8 sm:py-16 md:py-20", children: [
|
|
172
|
+
/* @__PURE__ */ jsx("h1", { className: "text-balance font-medium text-4xl text-foreground leading-tight tracking-tight sm:text-5xl md:text-[68px]", children: headline }),
|
|
173
|
+
subheadline && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-2xl text-base text-muted-foreground sm:text-lg", children: subheadline })
|
|
174
|
+
] }),
|
|
175
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-3 pb-8", children: [
|
|
176
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold text-muted-foreground text-sm sm:text-base", children: "Monthly" }),
|
|
177
|
+
/* @__PURE__ */ jsx(
|
|
178
|
+
Switch,
|
|
179
|
+
{
|
|
180
|
+
checked: yearly,
|
|
181
|
+
onCheckedChange: setYearly,
|
|
182
|
+
"aria-label": "Toggle yearly billing"
|
|
183
|
+
}
|
|
184
|
+
),
|
|
185
|
+
/* @__PURE__ */ jsx("span", { className: cn("font-semibold text-sm sm:text-base", yearly && "text-foreground"), children: "Yearly" })
|
|
186
|
+
] }),
|
|
187
|
+
/* @__PURE__ */ jsx("div", { className: "mx-auto max-w-7xl px-6 pb-12 sm:px-8", children: /* @__PURE__ */ jsx("div", { className: "grid rounded-md border md:grid-cols-2 lg:grid-cols-3 lg:divide-x", children: items.map((plan, i) => /* @__PURE__ */ jsx(
|
|
188
|
+
PricingCard,
|
|
189
|
+
{
|
|
190
|
+
plan,
|
|
191
|
+
index: i,
|
|
192
|
+
yearly,
|
|
193
|
+
prevPlanName: i > 0 ? items[i - 1].name : null
|
|
194
|
+
},
|
|
195
|
+
plan.name
|
|
196
|
+
)) }) })
|
|
197
|
+
] }) }) });
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export { FadeIn, PricingTable, Switch };
|
|
201
|
+
//# sourceMappingURL=chunk-VWSX75RB.js.map
|
|
202
|
+
//# sourceMappingURL=chunk-VWSX75RB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/fade-in.tsx","../src/components/switch.tsx","../src/blocks/pricing-table.tsx"],"names":["jsx","SwitchPrimitive","useState"],"mappings":";;;;;;;;AAaA,IAAM,oBAAA,GACJ,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,UAAA,KAAe,UAAA,GAC1D,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA,GACtD,KAAA;AAEN,SAAS,MAAA,CAAO,EAAE,EAAA,EAAI,GAAA,GAAM,OAAO,KAAA,GAAQ,CAAA,EAAG,SAAA,EAAW,QAAA,EAAS,EAAgB;AAChF,EAAA,MAAM,GAAA,GAAM,OAAoB,IAAI,CAAA;AACpC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,oBAAoB,CAAA;AAE3D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAEpB,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,CAAC,KAAK,CAAA,KAAM;AACX,QAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,QAAA,CAAS,UAAA,EAAW;AAAA,QACtB;AAAA,MACF,CAAA;AAAA,MACA,EAAE,YAAY,OAAA;AAAQ,KACxB;AAEA,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,uBACE,GAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,OAAA,GAAU,yCAAyC,WAAW,CAAA;AAAA,MACvF,KAAA,EAAO,QAAQ,CAAA,IAAK,OAAA,GAAU,EAAE,cAAA,EAAgB,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,EAAK,GAAI,MAAA;AAAA,MAEhE;AAAA;AAAA,GACH;AAEJ;AC5CA,SAAS,OAAO,EAAA,EAMb;AANa,EAAA,IAAA,EAAA,GAAA,EAAA,EACd;AAAA,IAAA,SAAA;AAAA,IACA,IAAA,GAAO;AAAA,GART,GAMgB,EAAA,EAGX,KAAA,GAAA,SAAA,CAHW,EAAA,EAGX;AAAA,IAFH,WAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAKA,EAAA,uBACEA,GAAAA;AAAA,IAACC,QAAA,CAAgB,IAAA;AAAA,IAAhB,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,+pBAAA;AAAA,QACA;AAAA;AACF,KAAA,EACI,KAAA,CAAA,EAPL;AAAA,MASC,QAAA,kBAAAD,GAAAA;AAAA,QAACC,QAAA,CAAgB,KAAA;AAAA,QAAhB;AAAA,UACC,WAAA,EAAU,cAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA;AAAA,GACF;AAEJ;ACEA,IAAM,aAAA,GAAwB;AAAA,EAC5B;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,oEAAA;AAAA,IACP,QAAA,EAAU;AAAA,MACR,0BAAA;AAAA,MACA,iBAAA;AAAA,MACA,8BAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,YAAA,EAAc,MAAA;AAAA,IACd,WAAA,EAAa,MAAA;AAAA,IACb,cAAA,EAAgB,WAAA;AAAA,IAChB,aAAA,EAAe,2BAAA;AAAA,IACf,KAAA,EAAO,kDAAA;AAAA,IACP,QAAA,EAAU;AAAA,MACR,6BAAA;AAAA,MACA,kBAAA;AAAA,MACA,0BAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,kBAAA;AAAA,IACV,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,6DAAA;AAAA,IACP,QAAA,EAAU;AAAA,MACR,qBAAA;AAAA,MACA,uBAAA;AAAA,MACA,kBAAA;AAAA,MACA,8BAAA;AAAA,MACA,eAAA;AAAA,MACA,yBAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,eAAA;AAAA,IACV,OAAA,EAAS;AAAA;AAEb,CAAA;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,YAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,MAAA,GAAS,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,cAAA;AAEnD,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAG,SAAA;AAAA,MACH,OAAO,KAAA,GAAQ,GAAA;AAAA,MACf,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,IAAA,CAAK,aAAa,UAAU,CAAA;AAAA,MAE3D,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAyC,eAAK,IAAA,EAAK,CAAA;AAAA,YAChE,MAAA,IAAU,KAAK,KAAA,oBACdA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EACb,QAAA,EAAA,IAAA,CAAK,KAAA,EACR;AAAA,WAAA,EAEJ,CAAA;AAAA,UAEC,CAAC,CAAC,IAAA,CAAK,KAAA,oBAASA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,0BAE/EA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACZ,kCACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACZ,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,YACC,CAAC,CAAC,OAAA,oBAAWA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAsC,QAAA,EAAA,OAAA,EAAQ;AAAA,WAAA,EAC7E,oBAEA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEACZ,QAAA,EAAA,KAAA,KAAU,CAAA,GAAI,SAAS,iBAAA,EAC1B,CAAA;AAAA,4BACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCACZ,QAAA,EAAA,KAAA,KAAU,CAAA,GAAI,4BAA4B,wBAAA,EAC7C;AAAA,WAAA,EACF,CAAA,EAEJ,CAAA;AAAA,0BAEAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA,aAAA,CAAA,cAAA,CAAA;AAAA,cACC,OAAA,EAAS,IAAA,CAAK,SAAA,GAAY,SAAA,GAAY;AAAA,aAAA,EACjC,IAAA,CAAK,OAAA,GAAU,EAAE,MAAA,kBAAQA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,GAAI,EAAC,CAAA,EAFjE;AAAA,cAIE,QAAA,EAAA,IAAA,CAAK;AAAA,aAAA;AAAA;AACR,SAAA,EACF,CAAA;AAAA,wBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,GAAAA,CAAC,OAAE,SAAA,EAAU,kCAAA,EACV,yBAAe,CAAA,cAAA,EAAiB,YAAY,WAAW,UAAA,EAC1D,CAAA;AAAA,0BACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EACX,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBAClB,IAAA,CAAC,IAAA,EAAA,EAAW,WAAU,yBAAA,EACpB,QAAA,EAAA;AAAA,4BAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,qCAAA,EAAsC,aAAa,GAAA,EAAK,CAAA;AAAA,4BAChFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+CAA+C,QAAA,EAAA,CAAA,EAAE;AAAA,WAAA,EAAA,EAF1D,CAGT,CACD,CAAA,EACH;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,aAAa,EAAE,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,WAAU,EAAsB;AACpF,EAAA,MAAM,KAAA,GAAA,CAAQ,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,MAAA,IAAS,KAAA,GAAQ,aAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,SAAS,IAAI,CAAA;AAEzC,EAAA,uBACEF,GAAAA,CAAC,SAAA,EAAA,EAAQ,aAAU,eAAA,EAAgB,SAAA,EAAW,GAAG,4BAAA,EAA8B,SAAS,CAAA,EACtF,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,QAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2GAAA,EACX,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,MACC,+BACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qEACV,QAAA,EAAA,WAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0DAAA,EAA2D,QAAA,EAAA,SAAA,EAE3E,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAA;AAAA,UACT,eAAA,EAAiB,SAAA;AAAA,UACjB,YAAA,EAAW;AAAA;AAAA,OACb;AAAA,sBACAA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,oCAAA,EAAsC,MAAA,IAAU,iBAAiB,CAAA,EAAG,QAAA,EAAA,QAAA,EAExF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,sBAChBA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,KAAA,EAAO,CAAA;AAAA,QACP,MAAA;AAAA,QACA,cAAc,CAAA,GAAI,CAAA,GAAI,MAAM,CAAA,GAAI,CAAC,EAAE,IAAA,GAAO;AAAA,OAAA;AAAA,MAJrC,IAAA,CAAK;AAAA,KAMb,GACH,CAAA,EACF;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ","file":"chunk-VWSX75RB.js","sourcesContent":["\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\ntype FadeInProps = {\n as?: \"div\" | \"li\" | \"article\" | \"section\" | \"p\" | \"h2\"\n delay?: number\n className?: string\n children: React.ReactNode\n}\n\nconst prefersReducedMotion =\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\"\n ? window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n : false\n\nfunction FadeIn({ as: Tag = \"div\", delay = 0, className, children }: FadeInProps) {\n const ref = useRef<HTMLElement>(null)\n const [visible, setVisible] = useState(prefersReducedMotion)\n\n useEffect(() => {\n const el = ref.current\n if (!el || visible) return\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setVisible(true)\n observer.disconnect()\n }\n },\n { rootMargin: \"-80px\" },\n )\n\n observer.observe(el)\n return () => observer.disconnect()\n }, [visible])\n\n return (\n <Tag\n ref={ref as React.RefObject<never>}\n data-slot=\"fade-in\"\n className={cn(className, visible ? \"animate-[fade-up_0.5s_ease-out_both]\" : \"opacity-0\")}\n style={delay > 0 && visible ? { animationDelay: `${delay}ms` } : undefined}\n >\n {children}\n </Tag>\n )\n}\n\nexport { FadeIn }\n","\"use client\"\n\nimport { Switch as SwitchPrimitive } from \"@base-ui/react/switch\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: SwitchPrimitive.Root.Props & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n \"peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs outline-none transition-all after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=sm]:h-[14px] data-[size=default]:w-[32px] data-[size=sm]:w-[24px] data-disabled:cursor-not-allowed data-checked:bg-primary data-unchecked:bg-input data-disabled:opacity-50 dark:data-unchecked:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-checked:bg-primary-foreground dark:data-unchecked:bg-foreground\"\n />\n </SwitchPrimitive.Root>\n )\n}\n\nexport { Switch }\n","\"use client\"\n\nimport { CheckCircle2 } from \"lucide-react\"\nimport Link from \"next/link\"\nimport { useState } from \"react\"\nimport { Button } from \"../components/button\"\nimport { FadeIn } from \"../components/fade-in\"\nimport { Switch } from \"../components/switch\"\nimport { cn } from \"../lib/utils\"\n\ntype Plan = {\n name: string\n monthlyPrice?: string\n annualPrice?: string\n perUnitMonthly?: string\n perUnitAnnual?: string\n features: string[]\n ctaLabel: string\n ctaHref?: string\n highlight?: boolean\n badge?: string\n blurb?: string\n}\n\ninterface PricingTableProps {\n headline?: string\n subheadline?: string\n plans?: Plan[]\n className?: string\n}\n\nconst DEFAULT_PLANS: Plan[] = [\n {\n name: \"Starter\",\n blurb: \"For early-stage VASPs getting started with Travel Rule compliance.\",\n features: [\n \"Up to 50 transfers/month\",\n \"5 jurisdictions\",\n \"Basic jurisdiction detection\",\n \"Email support\",\n \"Audit trail\",\n ],\n ctaLabel: \"Get started free\",\n ctaHref: \"/contact\",\n },\n {\n name: \"Growth\",\n monthlyPrice: \"$499\",\n annualPrice: \"$399\",\n perUnitMonthly: \"Per month\",\n perUnitAnnual: \"Per month / billed yearly\",\n blurb: \"For scaling VASPs with growing transfer volumes.\",\n features: [\n \"Up to 1,000 transfers/month\",\n \"25 jurisdictions\",\n \"AI-powered investigation\",\n \"SOP mapping\",\n \"Priority support\",\n \"API access\",\n \"Custom reports\",\n ],\n ctaLabel: \"Start free trial\",\n ctaHref: \"/contact\",\n highlight: true,\n },\n {\n name: \"Enterprise\",\n blurb: \"For high-volume VASPs with complex compliance requirements.\",\n features: [\n \"Unlimited transfers\",\n \"All 45+ jurisdictions\",\n \"Custom AI models\",\n \"Dedicated compliance adviser\",\n \"SLA guarantee\",\n \"SSO & advanced security\",\n \"Data residency options\",\n \"Custom integrations\",\n ],\n ctaLabel: \"Talk to sales\",\n ctaHref: \"/contact\",\n },\n]\n\nfunction PricingCard({\n plan,\n index,\n yearly,\n prevPlanName,\n}: {\n plan: Plan\n index: number\n yearly: boolean\n prevPlanName: string | null\n}) {\n const price = yearly ? plan.annualPrice : plan.monthlyPrice\n const perUnit = yearly ? plan.perUnitAnnual : plan.perUnitMonthly\n\n return (\n <FadeIn\n as=\"article\"\n delay={index * 100}\n className={cn(\"flex flex-col\", plan.highlight && \"bg-muted\")}\n >\n <div className=\"flex h-[300px] flex-col gap-y-4 p-6\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-foreground text-lg\">{plan.name}</h3>\n {yearly && plan.badge && (\n <span className=\"rounded-md bg-accent px-2 py-0.5 text-foreground text-xs\">\n {plan.badge}\n </span>\n )}\n </div>\n\n {!!plan.blurb && <p className=\"mt-2 text-muted-foreground text-sm\">{plan.blurb}</p>}\n\n <div className=\"mt-auto\">\n {price ? (\n <>\n <div className=\"font-semibold text-[40px] text-foreground leading-none sm:text-[44px]\">\n {price}\n </div>\n {!!perUnit && <div className=\"mt-2 text-muted-foreground text-sm\">{perUnit}</div>}\n </>\n ) : (\n <>\n <div className=\"font-medium text-[40px] text-foreground leading-none sm:text-[44px]\">\n {index === 0 ? \"Free\" : \"Let\\u2019s talk\"}\n </div>\n <div className=\"mt-2 text-muted-foreground text-sm\">\n {index === 0 ? \"No credit card required\" : \"Contact us for details\"}\n </div>\n </>\n )}\n </div>\n\n <Button\n variant={plan.highlight ? \"default\" : \"outline\"}\n {...(plan.ctaHref ? { render: <Link href={plan.ctaHref} /> } : {})}\n >\n {plan.ctaLabel}\n </Button>\n </div>\n\n <div className=\"border-t p-6\">\n <p className=\"mb-4 font-medium text-foreground\">\n {prevPlanName ? `Everything in ${prevPlanName}, and:` : \"Features\"}\n </p>\n <ul className=\"flex flex-col gap-y-3\">\n {plan.features.map((f) => (\n <li key={f} className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"mt-0.5 size-5 shrink-0 text-primary\" strokeWidth={2.5} />\n <span className=\"font-semibold text-muted-foreground text-sm\">{f}</span>\n </li>\n ))}\n </ul>\n </div>\n </FadeIn>\n )\n}\n\nfunction PricingTable({ headline, subheadline, plans, className }: PricingTableProps) {\n const items = plans?.length ? plans : DEFAULT_PLANS\n const [yearly, setYearly] = useState(true)\n\n return (\n <section data-slot=\"pricing-table\" className={cn(\"bg-background px-6 lg:px-0\", className)}>\n <div className=\"container px-0 md:px-6\">\n <div className=\"relative overflow-hidden\">\n {headline && (\n <div className=\"mx-auto max-w-4xl px-6 py-12 text-center sm:px-8 sm:py-16 md:py-20\">\n <h1 className=\"text-balance font-medium text-4xl text-foreground leading-tight tracking-tight sm:text-5xl md:text-[68px]\">\n {headline}\n </h1>\n {subheadline && (\n <p className=\"mx-auto mt-4 max-w-2xl text-base text-muted-foreground sm:text-lg\">\n {subheadline}\n </p>\n )}\n </div>\n )}\n\n <div className=\"flex items-center justify-center gap-3 pb-8\">\n <span className=\"font-semibold text-muted-foreground text-sm sm:text-base\">\n Monthly\n </span>\n <Switch\n checked={yearly}\n onCheckedChange={setYearly}\n aria-label=\"Toggle yearly billing\"\n />\n <span className={cn(\"font-semibold text-sm sm:text-base\", yearly && \"text-foreground\")}>\n Yearly\n </span>\n </div>\n\n <div className=\"mx-auto max-w-7xl px-6 pb-12 sm:px-8\">\n <div className=\"grid rounded-md border md:grid-cols-2 lg:grid-cols-3 lg:divide-x\">\n {items.map((plan, i) => (\n <PricingCard\n key={plan.name}\n plan={plan}\n index={i}\n yearly={yearly}\n prevPlanName={i > 0 ? items[i - 1].name : null}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n </section>\n )\n}\n\nexport { PricingTable }\nexport type { Plan, PricingTableProps }\n"]}
|