@victusvinceere/saas-landing 0.1.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/components/index.d.mts +135 -0
- package/dist/components/index.d.ts +135 -0
- package/dist/components/index.js +444 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +402 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +444 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +402 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/hero.tsx
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
import { ArrowRight, Sparkles } from "lucide-react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
function Hero({
|
|
8
|
+
badge,
|
|
9
|
+
title,
|
|
10
|
+
subtitle,
|
|
11
|
+
stats,
|
|
12
|
+
primaryCta = { text: "Get Started Free", href: "/signup" },
|
|
13
|
+
secondaryCta = { text: "Sign In", href: "/login" },
|
|
14
|
+
trustedBy,
|
|
15
|
+
children,
|
|
16
|
+
className
|
|
17
|
+
}) {
|
|
18
|
+
const BadgeIcon = badge?.icon || Sparkles;
|
|
19
|
+
return /* @__PURE__ */ jsxs("section", { className: `relative overflow-hidden ${className}`, children: [
|
|
20
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 -z-10 bg-[linear-gradient(to_right,#8080800a_1px,transparent_1px),linear-gradient(to_bottom,#8080800a_1px,transparent_1px)] bg-[size:14px_24px]" }),
|
|
21
|
+
/* @__PURE__ */ jsx("div", { className: "absolute left-0 right-0 top-0 -z-10 m-auto h-[310px] w-[310px] rounded-full bg-primary/20 opacity-20 blur-[100px]" }),
|
|
22
|
+
/* @__PURE__ */ jsxs("div", { className: "container px-4 py-24 md:py-32 lg:py-40", children: [
|
|
23
|
+
/* @__PURE__ */ jsxs("div", { className: "mx-auto flex max-w-5xl flex-col items-center text-center", children: [
|
|
24
|
+
badge && /* @__PURE__ */ jsxs("span", { className: "mb-6 inline-flex items-center rounded-full border px-4 py-2 text-sm font-medium", children: [
|
|
25
|
+
/* @__PURE__ */ jsx(BadgeIcon, { className: "mr-2 h-3.5 w-3.5 text-primary" }),
|
|
26
|
+
badge.text
|
|
27
|
+
] }),
|
|
28
|
+
/* @__PURE__ */ jsx("h1", { className: "mb-6 text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl xl:text-7xl", children: title }),
|
|
29
|
+
/* @__PURE__ */ jsx("p", { className: "mb-8 max-w-2xl text-lg text-muted-foreground md:text-xl", children: subtitle }),
|
|
30
|
+
stats && stats.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-10 flex flex-wrap items-center justify-center gap-8 text-sm", children: stats.map((stat, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
31
|
+
/* @__PURE__ */ jsx("span", { className: "text-2xl font-bold text-primary", children: stat.value }),
|
|
32
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: stat.label }),
|
|
33
|
+
index < stats.length - 1 && /* @__PURE__ */ jsx("div", { className: "ml-6 h-8 w-px bg-border" })
|
|
34
|
+
] }, stat.label)) }),
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row", children: [
|
|
36
|
+
/* @__PURE__ */ jsxs(
|
|
37
|
+
Link,
|
|
38
|
+
{
|
|
39
|
+
href: primaryCta.href,
|
|
40
|
+
className: "inline-flex h-12 items-center justify-center rounded-md bg-primary px-8 text-base font-medium text-primary-foreground transition-colors hover:bg-primary/90",
|
|
41
|
+
children: [
|
|
42
|
+
primaryCta.text,
|
|
43
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "ml-2 h-4 w-4" })
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
),
|
|
47
|
+
/* @__PURE__ */ jsxs(
|
|
48
|
+
Link,
|
|
49
|
+
{
|
|
50
|
+
href: secondaryCta.href,
|
|
51
|
+
className: "inline-flex h-12 items-center justify-center rounded-md border bg-background px-8 text-base font-medium transition-colors hover:bg-muted",
|
|
52
|
+
children: [
|
|
53
|
+
secondaryCta.text,
|
|
54
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "ml-2 h-4 w-4" })
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
] }),
|
|
59
|
+
trustedBy && trustedBy.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-12 flex flex-col items-center gap-4", children: [
|
|
60
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Trusted by developers at" }),
|
|
61
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center justify-center gap-8 opacity-50 grayscale", children: trustedBy.map((company) => /* @__PURE__ */ jsx("span", { className: "text-xl font-bold", children: company }, company)) })
|
|
62
|
+
] })
|
|
63
|
+
] }),
|
|
64
|
+
children
|
|
65
|
+
] })
|
|
66
|
+
] });
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/components/features.tsx
|
|
70
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
71
|
+
function Features({
|
|
72
|
+
badge = "Features",
|
|
73
|
+
title,
|
|
74
|
+
subtitle,
|
|
75
|
+
features,
|
|
76
|
+
techStack,
|
|
77
|
+
className
|
|
78
|
+
}) {
|
|
79
|
+
return /* @__PURE__ */ jsx2("section", { id: "features", className: `py-24 md:py-32 ${className}`, children: /* @__PURE__ */ jsxs2("div", { className: "container px-4", children: [
|
|
80
|
+
/* @__PURE__ */ jsxs2("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
81
|
+
/* @__PURE__ */ jsx2("span", { className: "mb-4 inline-block rounded-full bg-primary/10 px-4 py-1.5 text-sm font-medium text-primary", children: badge }),
|
|
82
|
+
/* @__PURE__ */ jsx2("h2", { className: "mb-4 text-3xl font-bold tracking-tight md:text-4xl lg:text-5xl", children: title }),
|
|
83
|
+
subtitle && /* @__PURE__ */ jsx2("p", { className: "text-lg text-muted-foreground", children: subtitle })
|
|
84
|
+
] }),
|
|
85
|
+
/* @__PURE__ */ jsx2("div", { className: "mx-auto mt-16 max-w-6xl", children: /* @__PURE__ */ jsx2("div", { className: "grid gap-6 md:grid-cols-2 lg:grid-cols-4", children: features.map((feature) => /* @__PURE__ */ jsxs2(
|
|
86
|
+
"div",
|
|
87
|
+
{
|
|
88
|
+
className: "group relative overflow-hidden rounded-2xl border bg-background p-6 transition-all hover:shadow-lg hover:shadow-primary/5",
|
|
89
|
+
children: [
|
|
90
|
+
/* @__PURE__ */ jsx2("div", { className: "absolute inset-0 bg-gradient-to-b from-transparent to-muted/20 opacity-0 transition-opacity group-hover:opacity-100" }),
|
|
91
|
+
/* @__PURE__ */ jsx2(
|
|
92
|
+
"div",
|
|
93
|
+
{
|
|
94
|
+
className: `mb-4 inline-flex rounded-xl p-3 ${feature.bg || "bg-primary/10"}`,
|
|
95
|
+
children: /* @__PURE__ */ jsx2(
|
|
96
|
+
feature.icon,
|
|
97
|
+
{
|
|
98
|
+
className: `h-6 w-6 ${feature.color || "text-primary"}`
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
),
|
|
103
|
+
/* @__PURE__ */ jsx2("h3", { className: "mb-2 text-lg font-semibold", children: feature.name }),
|
|
104
|
+
/* @__PURE__ */ jsx2("p", { className: "text-sm text-muted-foreground leading-relaxed", children: feature.description })
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
feature.name
|
|
108
|
+
)) }) }),
|
|
109
|
+
techStack && techStack.length > 0 && /* @__PURE__ */ jsx2("div", { className: "mx-auto mt-20 max-w-4xl", children: /* @__PURE__ */ jsxs2("div", { className: "rounded-2xl border bg-muted/30 p-8 text-center", children: [
|
|
110
|
+
/* @__PURE__ */ jsx2("h3", { className: "mb-6 text-lg font-semibold", children: "Built with modern technologies" }),
|
|
111
|
+
/* @__PURE__ */ jsx2("div", { className: "flex flex-wrap items-center justify-center gap-6 md:gap-10", children: techStack.map((tech) => /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-2", children: [
|
|
112
|
+
/* @__PURE__ */ jsx2(
|
|
113
|
+
"div",
|
|
114
|
+
{
|
|
115
|
+
className: "h-8 w-8 rounded-lg flex items-center justify-center",
|
|
116
|
+
style: { backgroundColor: tech.color },
|
|
117
|
+
children: /* @__PURE__ */ jsx2(
|
|
118
|
+
"span",
|
|
119
|
+
{
|
|
120
|
+
className: "text-xs font-bold",
|
|
121
|
+
style: { color: tech.textColor || "white" },
|
|
122
|
+
children: tech.label
|
|
123
|
+
}
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
/* @__PURE__ */ jsx2("span", { className: "font-medium", children: tech.name })
|
|
128
|
+
] }, tech.name)) })
|
|
129
|
+
] }) })
|
|
130
|
+
] }) });
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// src/components/pricing.tsx
|
|
134
|
+
import Link2 from "next/link";
|
|
135
|
+
import { Check } from "lucide-react";
|
|
136
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
137
|
+
function Pricing({
|
|
138
|
+
title = "Simple, transparent pricing",
|
|
139
|
+
subtitle = "Choose the plan that best fits your needs. All plans include a 14-day free trial.",
|
|
140
|
+
plans,
|
|
141
|
+
className
|
|
142
|
+
}) {
|
|
143
|
+
return /* @__PURE__ */ jsx3("section", { id: "pricing", className: `py-20 sm:py-32 ${className}`, children: /* @__PURE__ */ jsxs3("div", { className: "container", children: [
|
|
144
|
+
/* @__PURE__ */ jsxs3("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
145
|
+
/* @__PURE__ */ jsx3("h2", { className: "text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
|
|
146
|
+
/* @__PURE__ */ jsx3("p", { className: "mt-4 text-lg text-muted-foreground", children: subtitle })
|
|
147
|
+
] }),
|
|
148
|
+
/* @__PURE__ */ jsx3("div", { className: "mx-auto mt-16 grid max-w-5xl grid-cols-1 gap-8 lg:grid-cols-3", children: plans.map((plan) => /* @__PURE__ */ jsxs3(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
className: `relative flex flex-col rounded-2xl border bg-background p-8 shadow-sm ${plan.popular ? "border-primary shadow-lg" : ""}`,
|
|
152
|
+
children: [
|
|
153
|
+
plan.popular && /* @__PURE__ */ jsx3("span", { className: "absolute -top-3 left-1/2 -translate-x-1/2 inline-flex items-center rounded-full bg-primary px-3 py-1 text-xs font-medium text-primary-foreground", children: "Most Popular" }),
|
|
154
|
+
/* @__PURE__ */ jsxs3("div", { className: "mb-6", children: [
|
|
155
|
+
/* @__PURE__ */ jsx3("h3", { className: "text-lg font-semibold", children: plan.name }),
|
|
156
|
+
/* @__PURE__ */ jsxs3("div", { className: "mt-4 flex items-baseline", children: [
|
|
157
|
+
/* @__PURE__ */ jsx3("span", { className: "text-4xl font-bold", children: plan.price }),
|
|
158
|
+
plan.period && /* @__PURE__ */ jsx3("span", { className: "ml-1 text-muted-foreground", children: plan.period })
|
|
159
|
+
] }),
|
|
160
|
+
/* @__PURE__ */ jsx3("p", { className: "mt-2 text-sm text-muted-foreground", children: plan.description })
|
|
161
|
+
] }),
|
|
162
|
+
/* @__PURE__ */ jsx3("ul", { className: "mb-8 flex-1 space-y-3", children: plan.features.map((feature) => /* @__PURE__ */ jsxs3("li", { className: "flex items-center gap-3", children: [
|
|
163
|
+
/* @__PURE__ */ jsx3(Check, { className: "h-4 w-4 text-primary" }),
|
|
164
|
+
/* @__PURE__ */ jsx3("span", { className: "text-sm", children: feature })
|
|
165
|
+
] }, feature)) }),
|
|
166
|
+
/* @__PURE__ */ jsx3(
|
|
167
|
+
Link2,
|
|
168
|
+
{
|
|
169
|
+
href: plan.href,
|
|
170
|
+
className: `inline-flex w-full items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors ${plan.popular ? "bg-primary text-primary-foreground hover:bg-primary/90" : "border bg-background hover:bg-muted"}`,
|
|
171
|
+
children: plan.cta
|
|
172
|
+
}
|
|
173
|
+
)
|
|
174
|
+
]
|
|
175
|
+
},
|
|
176
|
+
plan.name
|
|
177
|
+
)) })
|
|
178
|
+
] }) });
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// src/components/faq.tsx
|
|
182
|
+
import { useState } from "react";
|
|
183
|
+
import { ChevronDown } from "lucide-react";
|
|
184
|
+
import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
185
|
+
function Faq({
|
|
186
|
+
title = "Frequently asked questions",
|
|
187
|
+
subtitle = "Everything you need to know about our product.",
|
|
188
|
+
items,
|
|
189
|
+
className
|
|
190
|
+
}) {
|
|
191
|
+
const [openIndex, setOpenIndex] = useState(null);
|
|
192
|
+
return /* @__PURE__ */ jsx4("section", { id: "faq", className: `py-20 sm:py-32 ${className}`, children: /* @__PURE__ */ jsxs4("div", { className: "container", children: [
|
|
193
|
+
/* @__PURE__ */ jsxs4("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
194
|
+
/* @__PURE__ */ jsx4("h2", { className: "text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
|
|
195
|
+
/* @__PURE__ */ jsx4("p", { className: "mt-4 text-lg text-muted-foreground", children: subtitle })
|
|
196
|
+
] }),
|
|
197
|
+
/* @__PURE__ */ jsx4("div", { className: "mx-auto mt-16 max-w-3xl", children: /* @__PURE__ */ jsx4("div", { className: "divide-y rounded-2xl border", children: items.map((item, index) => /* @__PURE__ */ jsxs4("div", { children: [
|
|
198
|
+
/* @__PURE__ */ jsxs4(
|
|
199
|
+
"button",
|
|
200
|
+
{
|
|
201
|
+
className: "flex w-full items-center justify-between px-6 py-4 text-left",
|
|
202
|
+
onClick: () => setOpenIndex(openIndex === index ? null : index),
|
|
203
|
+
children: [
|
|
204
|
+
/* @__PURE__ */ jsx4("span", { className: "font-medium", children: item.question }),
|
|
205
|
+
/* @__PURE__ */ jsx4(
|
|
206
|
+
ChevronDown,
|
|
207
|
+
{
|
|
208
|
+
className: `h-5 w-5 text-muted-foreground transition-transform ${openIndex === index ? "rotate-180" : ""}`
|
|
209
|
+
}
|
|
210
|
+
)
|
|
211
|
+
]
|
|
212
|
+
}
|
|
213
|
+
),
|
|
214
|
+
openIndex === index && /* @__PURE__ */ jsx4("div", { className: "px-6 pb-4", children: /* @__PURE__ */ jsx4("p", { className: "text-muted-foreground", children: item.answer }) })
|
|
215
|
+
] }, index)) }) })
|
|
216
|
+
] }) });
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// src/components/cta.tsx
|
|
220
|
+
import Link3 from "next/link";
|
|
221
|
+
import { ArrowRight as ArrowRight2 } from "lucide-react";
|
|
222
|
+
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
223
|
+
function Cta({
|
|
224
|
+
title,
|
|
225
|
+
subtitle,
|
|
226
|
+
primaryCta = { text: "Get Started", href: "/signup" },
|
|
227
|
+
secondaryCta,
|
|
228
|
+
className
|
|
229
|
+
}) {
|
|
230
|
+
return /* @__PURE__ */ jsx5("section", { className: `py-20 sm:py-32 ${className}`, children: /* @__PURE__ */ jsx5("div", { className: "container", children: /* @__PURE__ */ jsxs5("div", { className: "relative overflow-hidden rounded-3xl bg-primary px-6 py-20 sm:px-12 sm:py-28", children: [
|
|
231
|
+
/* @__PURE__ */ jsxs5("div", { className: "absolute inset-0 -z-10", children: [
|
|
232
|
+
/* @__PURE__ */ jsx5("div", { className: "absolute -left-1/4 -top-1/4 h-1/2 w-1/2 rounded-full bg-white/10 blur-3xl" }),
|
|
233
|
+
/* @__PURE__ */ jsx5("div", { className: "absolute -bottom-1/4 -right-1/4 h-1/2 w-1/2 rounded-full bg-white/10 blur-3xl" })
|
|
234
|
+
] }),
|
|
235
|
+
/* @__PURE__ */ jsxs5("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
236
|
+
/* @__PURE__ */ jsx5("h2", { className: "text-3xl font-bold tracking-tight text-primary-foreground sm:text-4xl", children: title }),
|
|
237
|
+
subtitle && /* @__PURE__ */ jsx5("p", { className: "mt-4 text-lg text-primary-foreground/80", children: subtitle }),
|
|
238
|
+
/* @__PURE__ */ jsxs5("div", { className: "mt-8 flex flex-col items-center justify-center gap-4 sm:flex-row", children: [
|
|
239
|
+
/* @__PURE__ */ jsxs5(
|
|
240
|
+
Link3,
|
|
241
|
+
{
|
|
242
|
+
href: primaryCta.href,
|
|
243
|
+
className: "inline-flex h-12 items-center justify-center rounded-md bg-background px-8 text-base font-medium text-foreground transition-colors hover:bg-background/90",
|
|
244
|
+
children: [
|
|
245
|
+
primaryCta.text,
|
|
246
|
+
/* @__PURE__ */ jsx5(ArrowRight2, { className: "ml-2 h-4 w-4" })
|
|
247
|
+
]
|
|
248
|
+
}
|
|
249
|
+
),
|
|
250
|
+
secondaryCta && /* @__PURE__ */ jsx5(
|
|
251
|
+
Link3,
|
|
252
|
+
{
|
|
253
|
+
href: secondaryCta.href,
|
|
254
|
+
className: "inline-flex h-12 items-center justify-center rounded-md border border-primary-foreground/20 px-8 text-base font-medium text-primary-foreground transition-colors hover:bg-primary-foreground/10",
|
|
255
|
+
children: secondaryCta.text
|
|
256
|
+
}
|
|
257
|
+
)
|
|
258
|
+
] })
|
|
259
|
+
] })
|
|
260
|
+
] }) }) });
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// src/components/footer.tsx
|
|
264
|
+
import Link4 from "next/link";
|
|
265
|
+
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
266
|
+
function Footer({
|
|
267
|
+
logo,
|
|
268
|
+
siteName = "SaaS Kit",
|
|
269
|
+
description = "Build your SaaS faster with our production-ready starter kit.",
|
|
270
|
+
columns = [],
|
|
271
|
+
socialLinks = [],
|
|
272
|
+
copyright,
|
|
273
|
+
className
|
|
274
|
+
}) {
|
|
275
|
+
const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
|
|
276
|
+
return /* @__PURE__ */ jsx6("footer", { className: `border-t py-12 ${className}`, children: /* @__PURE__ */ jsxs6("div", { className: "container", children: [
|
|
277
|
+
/* @__PURE__ */ jsxs6("div", { className: "grid gap-8 md:grid-cols-2 lg:grid-cols-5", children: [
|
|
278
|
+
/* @__PURE__ */ jsxs6("div", { className: "lg:col-span-2", children: [
|
|
279
|
+
/* @__PURE__ */ jsxs6(Link4, { href: "/", className: "flex items-center gap-2", children: [
|
|
280
|
+
logo || /* @__PURE__ */ jsx6("div", { className: "flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold", children: "S" }),
|
|
281
|
+
/* @__PURE__ */ jsx6("span", { className: "text-lg font-semibold", children: siteName })
|
|
282
|
+
] }),
|
|
283
|
+
/* @__PURE__ */ jsx6("p", { className: "mt-4 max-w-xs text-sm text-muted-foreground", children: description }),
|
|
284
|
+
socialLinks.length > 0 && /* @__PURE__ */ jsx6("div", { className: "mt-6 flex gap-4", children: socialLinks.map((link) => /* @__PURE__ */ jsx6(
|
|
285
|
+
"a",
|
|
286
|
+
{
|
|
287
|
+
href: link.href,
|
|
288
|
+
className: "text-muted-foreground hover:text-foreground",
|
|
289
|
+
"aria-label": link.label,
|
|
290
|
+
children: link.icon
|
|
291
|
+
},
|
|
292
|
+
link.label
|
|
293
|
+
)) })
|
|
294
|
+
] }),
|
|
295
|
+
columns.map((column) => /* @__PURE__ */ jsxs6("div", { children: [
|
|
296
|
+
/* @__PURE__ */ jsx6("h3", { className: "font-semibold", children: column.title }),
|
|
297
|
+
/* @__PURE__ */ jsx6("ul", { className: "mt-4 space-y-2", children: column.links.map((link) => /* @__PURE__ */ jsx6("li", { children: /* @__PURE__ */ jsx6(
|
|
298
|
+
Link4,
|
|
299
|
+
{
|
|
300
|
+
href: link.href,
|
|
301
|
+
className: "text-sm text-muted-foreground hover:text-foreground",
|
|
302
|
+
children: link.label
|
|
303
|
+
}
|
|
304
|
+
) }, link.label)) })
|
|
305
|
+
] }, column.title))
|
|
306
|
+
] }),
|
|
307
|
+
/* @__PURE__ */ jsx6("div", { className: "mt-12 border-t pt-8 text-center text-sm text-muted-foreground", children: copyright || `\xA9 ${currentYear} ${siteName}. All rights reserved.` })
|
|
308
|
+
] }) });
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// src/components/navbar.tsx
|
|
312
|
+
import Link5 from "next/link";
|
|
313
|
+
import { useState as useState2 } from "react";
|
|
314
|
+
import { Menu, X } from "lucide-react";
|
|
315
|
+
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
316
|
+
function Navbar({
|
|
317
|
+
logo,
|
|
318
|
+
siteName = "SaaS Kit",
|
|
319
|
+
links = [
|
|
320
|
+
{ label: "Features", href: "#features" },
|
|
321
|
+
{ label: "Pricing", href: "#pricing" },
|
|
322
|
+
{ label: "FAQ", href: "#faq" }
|
|
323
|
+
],
|
|
324
|
+
ctaText = "Get Started",
|
|
325
|
+
ctaHref = "/signup",
|
|
326
|
+
className
|
|
327
|
+
}) {
|
|
328
|
+
const [isOpen, setIsOpen] = useState2(false);
|
|
329
|
+
return /* @__PURE__ */ jsxs7(
|
|
330
|
+
"header",
|
|
331
|
+
{
|
|
332
|
+
className: `sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 ${className}`,
|
|
333
|
+
children: [
|
|
334
|
+
/* @__PURE__ */ jsxs7("nav", { className: "container flex h-16 items-center justify-between", children: [
|
|
335
|
+
/* @__PURE__ */ jsxs7(Link5, { href: "/", className: "flex items-center gap-2", children: [
|
|
336
|
+
logo || /* @__PURE__ */ jsx7("div", { className: "flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold", children: "S" }),
|
|
337
|
+
/* @__PURE__ */ jsx7("span", { className: "text-lg font-semibold", children: siteName })
|
|
338
|
+
] }),
|
|
339
|
+
/* @__PURE__ */ jsxs7("div", { className: "hidden items-center gap-6 md:flex", children: [
|
|
340
|
+
links.map((link) => /* @__PURE__ */ jsx7(
|
|
341
|
+
Link5,
|
|
342
|
+
{
|
|
343
|
+
href: link.href,
|
|
344
|
+
className: "text-sm font-medium text-muted-foreground transition-colors hover:text-foreground",
|
|
345
|
+
children: link.label
|
|
346
|
+
},
|
|
347
|
+
link.label
|
|
348
|
+
)),
|
|
349
|
+
/* @__PURE__ */ jsx7(
|
|
350
|
+
Link5,
|
|
351
|
+
{
|
|
352
|
+
href: ctaHref,
|
|
353
|
+
className: "inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90",
|
|
354
|
+
children: ctaText
|
|
355
|
+
}
|
|
356
|
+
)
|
|
357
|
+
] }),
|
|
358
|
+
/* @__PURE__ */ jsx7(
|
|
359
|
+
"button",
|
|
360
|
+
{
|
|
361
|
+
className: "md:hidden",
|
|
362
|
+
onClick: () => setIsOpen(!isOpen),
|
|
363
|
+
"aria-label": "Toggle menu",
|
|
364
|
+
children: isOpen ? /* @__PURE__ */ jsx7(X, { className: "h-6 w-6" }) : /* @__PURE__ */ jsx7(Menu, { className: "h-6 w-6" })
|
|
365
|
+
}
|
|
366
|
+
)
|
|
367
|
+
] }),
|
|
368
|
+
isOpen && /* @__PURE__ */ jsx7("div", { className: "border-t md:hidden", children: /* @__PURE__ */ jsxs7("div", { className: "container py-4", children: [
|
|
369
|
+
links.map((link) => /* @__PURE__ */ jsx7(
|
|
370
|
+
Link5,
|
|
371
|
+
{
|
|
372
|
+
href: link.href,
|
|
373
|
+
className: "block py-2 text-sm font-medium text-muted-foreground transition-colors hover:text-foreground",
|
|
374
|
+
onClick: () => setIsOpen(false),
|
|
375
|
+
children: link.label
|
|
376
|
+
},
|
|
377
|
+
link.label
|
|
378
|
+
)),
|
|
379
|
+
/* @__PURE__ */ jsx7(
|
|
380
|
+
Link5,
|
|
381
|
+
{
|
|
382
|
+
href: ctaHref,
|
|
383
|
+
className: "mt-2 inline-flex h-9 w-full items-center justify-center rounded-md bg-primary text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90",
|
|
384
|
+
onClick: () => setIsOpen(false),
|
|
385
|
+
children: ctaText
|
|
386
|
+
}
|
|
387
|
+
)
|
|
388
|
+
] }) })
|
|
389
|
+
]
|
|
390
|
+
}
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
export {
|
|
394
|
+
Cta,
|
|
395
|
+
Faq,
|
|
396
|
+
Features,
|
|
397
|
+
Footer,
|
|
398
|
+
Hero,
|
|
399
|
+
Navbar,
|
|
400
|
+
Pricing
|
|
401
|
+
};
|
|
402
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/hero.tsx","../../src/components/features.tsx","../../src/components/pricing.tsx","../../src/components/faq.tsx","../../src/components/cta.tsx","../../src/components/footer.tsx","../../src/components/navbar.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight, Sparkles, type LucideIcon } from \"lucide-react\";\nimport { type ReactNode } from \"react\";\n\nexport interface HeroStat {\n value: string;\n label: string;\n}\n\nexport interface HeroProps {\n badge?: {\n text: string;\n icon?: LucideIcon;\n };\n title: ReactNode;\n subtitle: string;\n stats?: HeroStat[];\n primaryCta?: {\n text: string;\n href: string;\n };\n secondaryCta?: {\n text: string;\n href: string;\n };\n trustedBy?: string[];\n children?: ReactNode;\n className?: string;\n}\n\nexport function Hero({\n badge,\n title,\n subtitle,\n stats,\n primaryCta = { text: \"Get Started Free\", href: \"/signup\" },\n secondaryCta = { text: \"Sign In\", href: \"/login\" },\n trustedBy,\n children,\n className,\n}: HeroProps) {\n const BadgeIcon = badge?.icon || Sparkles;\n\n return (\n <section className={`relative overflow-hidden ${className}`}>\n {/* Background gradient */}\n <div className=\"absolute inset-0 -z-10 bg-[linear-gradient(to_right,#8080800a_1px,transparent_1px),linear-gradient(to_bottom,#8080800a_1px,transparent_1px)] bg-[size:14px_24px]\" />\n <div className=\"absolute left-0 right-0 top-0 -z-10 m-auto h-[310px] w-[310px] rounded-full bg-primary/20 opacity-20 blur-[100px]\" />\n\n <div className=\"container px-4 py-24 md:py-32 lg:py-40\">\n <div className=\"mx-auto flex max-w-5xl flex-col items-center text-center\">\n {/* Badge */}\n {badge && (\n <span className=\"mb-6 inline-flex items-center rounded-full border px-4 py-2 text-sm font-medium\">\n <BadgeIcon className=\"mr-2 h-3.5 w-3.5 text-primary\" />\n {badge.text}\n </span>\n )}\n\n {/* Main headline */}\n <h1 className=\"mb-6 text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl xl:text-7xl\">\n {title}\n </h1>\n\n {/* Subheadline */}\n <p className=\"mb-8 max-w-2xl text-lg text-muted-foreground md:text-xl\">\n {subtitle}\n </p>\n\n {/* Stats */}\n {stats && stats.length > 0 && (\n <div className=\"mb-10 flex flex-wrap items-center justify-center gap-8 text-sm\">\n {stats.map((stat, index) => (\n <div key={stat.label} className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold text-primary\">\n {stat.value}\n </span>\n <span className=\"text-muted-foreground\">{stat.label}</span>\n {index < stats.length - 1 && (\n <div className=\"ml-6 h-8 w-px bg-border\" />\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* CTA Buttons */}\n <div className=\"flex flex-col gap-4 sm:flex-row\">\n <Link\n href={primaryCta.href}\n className=\"inline-flex h-12 items-center justify-center rounded-md bg-primary px-8 text-base font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\n >\n {primaryCta.text}\n <ArrowRight className=\"ml-2 h-4 w-4\" />\n </Link>\n <Link\n href={secondaryCta.href}\n className=\"inline-flex h-12 items-center justify-center rounded-md border bg-background px-8 text-base font-medium transition-colors hover:bg-muted\"\n >\n {secondaryCta.text}\n <ArrowRight className=\"ml-2 h-4 w-4\" />\n </Link>\n </div>\n\n {/* Trust badges */}\n {trustedBy && trustedBy.length > 0 && (\n <div className=\"mt-12 flex flex-col items-center gap-4\">\n <p className=\"text-sm text-muted-foreground\">\n Trusted by developers at\n </p>\n <div className=\"flex flex-wrap items-center justify-center gap-8 opacity-50 grayscale\">\n {trustedBy.map((company) => (\n <span key={company} className=\"text-xl font-bold\">\n {company}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Custom content (e.g., preview) */}\n {children}\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface Feature {\n name: string;\n description: string;\n icon: LucideIcon;\n color?: string;\n bg?: string;\n}\n\nexport interface FeaturesProps {\n badge?: string;\n title: string;\n subtitle?: string;\n features: Feature[];\n techStack?: Array<{\n name: string;\n color: string;\n textColor?: string;\n label: string;\n }>;\n className?: string;\n}\n\nexport function Features({\n badge = \"Features\",\n title,\n subtitle,\n features,\n techStack,\n className,\n}: FeaturesProps) {\n return (\n <section id=\"features\" className={`py-24 md:py-32 ${className}`}>\n <div className=\"container px-4\">\n <div className=\"mx-auto max-w-2xl text-center\">\n <span className=\"mb-4 inline-block rounded-full bg-primary/10 px-4 py-1.5 text-sm font-medium text-primary\">\n {badge}\n </span>\n <h2 className=\"mb-4 text-3xl font-bold tracking-tight md:text-4xl lg:text-5xl\">\n {title}\n </h2>\n {subtitle && (\n <p className=\"text-lg text-muted-foreground\">{subtitle}</p>\n )}\n </div>\n\n <div className=\"mx-auto mt-16 max-w-6xl\">\n <div className=\"grid gap-6 md:grid-cols-2 lg:grid-cols-4\">\n {features.map((feature) => (\n <div\n key={feature.name}\n className=\"group relative overflow-hidden rounded-2xl border bg-background p-6 transition-all hover:shadow-lg hover:shadow-primary/5\"\n >\n <div className=\"absolute inset-0 bg-gradient-to-b from-transparent to-muted/20 opacity-0 transition-opacity group-hover:opacity-100\" />\n <div\n className={`mb-4 inline-flex rounded-xl p-3 ${\n feature.bg || \"bg-primary/10\"\n }`}\n >\n <feature.icon\n className={`h-6 w-6 ${feature.color || \"text-primary\"}`}\n />\n </div>\n <h3 className=\"mb-2 text-lg font-semibold\">{feature.name}</h3>\n <p className=\"text-sm text-muted-foreground leading-relaxed\">\n {feature.description}\n </p>\n </div>\n ))}\n </div>\n </div>\n\n {/* Tech stack */}\n {techStack && techStack.length > 0 && (\n <div className=\"mx-auto mt-20 max-w-4xl\">\n <div className=\"rounded-2xl border bg-muted/30 p-8 text-center\">\n <h3 className=\"mb-6 text-lg font-semibold\">\n Built with modern technologies\n </h3>\n <div className=\"flex flex-wrap items-center justify-center gap-6 md:gap-10\">\n {techStack.map((tech) => (\n <div key={tech.name} className=\"flex items-center gap-2\">\n <div\n className=\"h-8 w-8 rounded-lg flex items-center justify-center\"\n style={{ backgroundColor: tech.color }}\n >\n <span\n className=\"text-xs font-bold\"\n style={{ color: tech.textColor || \"white\" }}\n >\n {tech.label}\n </span>\n </div>\n <span className=\"font-medium\">{tech.name}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { Check } from \"lucide-react\";\n\nexport interface PricingPlan {\n name: string;\n price: string;\n period?: string;\n description: string;\n features: string[];\n cta: string;\n href: string;\n popular?: boolean;\n}\n\nexport interface PricingProps {\n title?: string;\n subtitle?: string;\n plans: PricingPlan[];\n className?: string;\n}\n\nexport function Pricing({\n title = \"Simple, transparent pricing\",\n subtitle = \"Choose the plan that best fits your needs. All plans include a 14-day free trial.\",\n plans,\n className,\n}: PricingProps) {\n return (\n <section id=\"pricing\" className={`py-20 sm:py-32 ${className}`}>\n <div className=\"container\">\n <div className=\"mx-auto max-w-2xl text-center\">\n <h2 className=\"text-3xl font-bold tracking-tight sm:text-4xl\">\n {title}\n </h2>\n <p className=\"mt-4 text-lg text-muted-foreground\">{subtitle}</p>\n </div>\n\n <div className=\"mx-auto mt-16 grid max-w-5xl grid-cols-1 gap-8 lg:grid-cols-3\">\n {plans.map((plan) => (\n <div\n key={plan.name}\n className={`relative flex flex-col rounded-2xl border bg-background p-8 shadow-sm ${\n plan.popular ? \"border-primary shadow-lg\" : \"\"\n }`}\n >\n {plan.popular && (\n <span className=\"absolute -top-3 left-1/2 -translate-x-1/2 inline-flex items-center rounded-full bg-primary px-3 py-1 text-xs font-medium text-primary-foreground\">\n Most Popular\n </span>\n )}\n <div className=\"mb-6\">\n <h3 className=\"text-lg font-semibold\">{plan.name}</h3>\n <div className=\"mt-4 flex items-baseline\">\n <span className=\"text-4xl font-bold\">{plan.price}</span>\n {plan.period && (\n <span className=\"ml-1 text-muted-foreground\">\n {plan.period}\n </span>\n )}\n </div>\n <p className=\"mt-2 text-sm text-muted-foreground\">\n {plan.description}\n </p>\n </div>\n\n <ul className=\"mb-8 flex-1 space-y-3\">\n {plan.features.map((feature) => (\n <li key={feature} className=\"flex items-center gap-3\">\n <Check className=\"h-4 w-4 text-primary\" />\n <span className=\"text-sm\">{feature}</span>\n </li>\n ))}\n </ul>\n\n <Link\n href={plan.href}\n className={`inline-flex w-full items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors ${\n plan.popular\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border bg-background hover:bg-muted\"\n }`}\n >\n {plan.cta}\n </Link>\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { ChevronDown } from \"lucide-react\";\n\nexport interface FaqItem {\n question: string;\n answer: string;\n}\n\nexport interface FaqProps {\n title?: string;\n subtitle?: string;\n items: FaqItem[];\n className?: string;\n}\n\nexport function Faq({\n title = \"Frequently asked questions\",\n subtitle = \"Everything you need to know about our product.\",\n items,\n className,\n}: FaqProps) {\n const [openIndex, setOpenIndex] = useState<number | null>(null);\n\n return (\n <section id=\"faq\" className={`py-20 sm:py-32 ${className}`}>\n <div className=\"container\">\n <div className=\"mx-auto max-w-2xl text-center\">\n <h2 className=\"text-3xl font-bold tracking-tight sm:text-4xl\">\n {title}\n </h2>\n <p className=\"mt-4 text-lg text-muted-foreground\">{subtitle}</p>\n </div>\n\n <div className=\"mx-auto mt-16 max-w-3xl\">\n <div className=\"divide-y rounded-2xl border\">\n {items.map((item, index) => (\n <div key={index}>\n <button\n className=\"flex w-full items-center justify-between px-6 py-4 text-left\"\n onClick={() =>\n setOpenIndex(openIndex === index ? null : index)\n }\n >\n <span className=\"font-medium\">{item.question}</span>\n <ChevronDown\n className={`h-5 w-5 text-muted-foreground transition-transform ${\n openIndex === index ? \"rotate-180\" : \"\"\n }`}\n />\n </button>\n {openIndex === index && (\n <div className=\"px-6 pb-4\">\n <p className=\"text-muted-foreground\">{item.answer}</p>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { ArrowRight } from \"lucide-react\";\n\nexport interface CtaProps {\n title: string;\n subtitle?: string;\n primaryCta?: {\n text: string;\n href: string;\n };\n secondaryCta?: {\n text: string;\n href: string;\n };\n className?: string;\n}\n\nexport function Cta({\n title,\n subtitle,\n primaryCta = { text: \"Get Started\", href: \"/signup\" },\n secondaryCta,\n className,\n}: CtaProps) {\n return (\n <section className={`py-20 sm:py-32 ${className}`}>\n <div className=\"container\">\n <div className=\"relative overflow-hidden rounded-3xl bg-primary px-6 py-20 sm:px-12 sm:py-28\">\n {/* Background decoration */}\n <div className=\"absolute inset-0 -z-10\">\n <div className=\"absolute -left-1/4 -top-1/4 h-1/2 w-1/2 rounded-full bg-white/10 blur-3xl\" />\n <div className=\"absolute -bottom-1/4 -right-1/4 h-1/2 w-1/2 rounded-full bg-white/10 blur-3xl\" />\n </div>\n\n <div className=\"mx-auto max-w-2xl text-center\">\n <h2 className=\"text-3xl font-bold tracking-tight text-primary-foreground sm:text-4xl\">\n {title}\n </h2>\n {subtitle && (\n <p className=\"mt-4 text-lg text-primary-foreground/80\">\n {subtitle}\n </p>\n )}\n <div className=\"mt-8 flex flex-col items-center justify-center gap-4 sm:flex-row\">\n <Link\n href={primaryCta.href}\n className=\"inline-flex h-12 items-center justify-center rounded-md bg-background px-8 text-base font-medium text-foreground transition-colors hover:bg-background/90\"\n >\n {primaryCta.text}\n <ArrowRight className=\"ml-2 h-4 w-4\" />\n </Link>\n {secondaryCta && (\n <Link\n href={secondaryCta.href}\n className=\"inline-flex h-12 items-center justify-center rounded-md border border-primary-foreground/20 px-8 text-base font-medium text-primary-foreground transition-colors hover:bg-primary-foreground/10\"\n >\n {secondaryCta.text}\n </Link>\n )}\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { type ReactNode } from \"react\";\n\nexport interface FooterLink {\n label: string;\n href: string;\n}\n\nexport interface FooterColumn {\n title: string;\n links: FooterLink[];\n}\n\nexport interface FooterProps {\n logo?: ReactNode;\n siteName?: string;\n description?: string;\n columns?: FooterColumn[];\n socialLinks?: Array<{\n icon: ReactNode;\n href: string;\n label: string;\n }>;\n copyright?: string;\n className?: string;\n}\n\nexport function Footer({\n logo,\n siteName = \"SaaS Kit\",\n description = \"Build your SaaS faster with our production-ready starter kit.\",\n columns = [],\n socialLinks = [],\n copyright,\n className,\n}: FooterProps) {\n const currentYear = new Date().getFullYear();\n\n return (\n <footer className={`border-t py-12 ${className}`}>\n <div className=\"container\">\n <div className=\"grid gap-8 md:grid-cols-2 lg:grid-cols-5\">\n {/* Logo and description */}\n <div className=\"lg:col-span-2\">\n <Link href=\"/\" className=\"flex items-center gap-2\">\n {logo || (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold\">\n S\n </div>\n )}\n <span className=\"text-lg font-semibold\">{siteName}</span>\n </Link>\n <p className=\"mt-4 max-w-xs text-sm text-muted-foreground\">\n {description}\n </p>\n {socialLinks.length > 0 && (\n <div className=\"mt-6 flex gap-4\">\n {socialLinks.map((link) => (\n <a\n key={link.label}\n href={link.href}\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={link.label}\n >\n {link.icon}\n </a>\n ))}\n </div>\n )}\n </div>\n\n {/* Link columns */}\n {columns.map((column) => (\n <div key={column.title}>\n <h3 className=\"font-semibold\">{column.title}</h3>\n <ul className=\"mt-4 space-y-2\">\n {column.links.map((link) => (\n <li key={link.label}>\n <Link\n href={link.href}\n className=\"text-sm text-muted-foreground hover:text-foreground\"\n >\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n\n <div className=\"mt-12 border-t pt-8 text-center text-sm text-muted-foreground\">\n {copyright || `© ${currentYear} ${siteName}. All rights reserved.`}\n </div>\n </div>\n </footer>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { useState } from \"react\";\nimport { Menu, X } from \"lucide-react\";\nimport { type ReactNode } from \"react\";\n\nexport interface NavLink {\n label: string;\n href: string;\n}\n\nexport interface NavbarProps {\n logo?: ReactNode;\n siteName?: string;\n links?: NavLink[];\n ctaText?: string;\n ctaHref?: string;\n className?: string;\n}\n\nexport function Navbar({\n logo,\n siteName = \"SaaS Kit\",\n links = [\n { label: \"Features\", href: \"#features\" },\n { label: \"Pricing\", href: \"#pricing\" },\n { label: \"FAQ\", href: \"#faq\" },\n ],\n ctaText = \"Get Started\",\n ctaHref = \"/signup\",\n className,\n}: NavbarProps) {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <header\n className={`sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 ${className}`}\n >\n <nav className=\"container flex h-16 items-center justify-between\">\n <Link href=\"/\" className=\"flex items-center gap-2\">\n {logo || (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold\">\n S\n </div>\n )}\n <span className=\"text-lg font-semibold\">{siteName}</span>\n </Link>\n\n {/* Desktop navigation */}\n <div className=\"hidden items-center gap-6 md:flex\">\n {links.map((link) => (\n <Link\n key={link.label}\n href={link.href}\n className=\"text-sm font-medium text-muted-foreground transition-colors hover:text-foreground\"\n >\n {link.label}\n </Link>\n ))}\n <Link\n href={ctaHref}\n className=\"inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\n >\n {ctaText}\n </Link>\n </div>\n\n {/* Mobile menu button */}\n <button\n className=\"md:hidden\"\n onClick={() => setIsOpen(!isOpen)}\n aria-label=\"Toggle menu\"\n >\n {isOpen ? <X className=\"h-6 w-6\" /> : <Menu className=\"h-6 w-6\" />}\n </button>\n </nav>\n\n {/* Mobile navigation */}\n {isOpen && (\n <div className=\"border-t md:hidden\">\n <div className=\"container py-4\">\n {links.map((link) => (\n <Link\n key={link.label}\n href={link.href}\n className=\"block py-2 text-sm font-medium text-muted-foreground transition-colors hover:text-foreground\"\n onClick={() => setIsOpen(false)}\n >\n {link.label}\n </Link>\n ))}\n <Link\n href={ctaHref}\n className=\"mt-2 inline-flex h-9 w-full items-center justify-center rounded-md bg-primary text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90\"\n onClick={() => setIsOpen(false)}\n >\n {ctaText}\n </Link>\n </div>\n </div>\n )}\n </header>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","Link","jsx","jsxs","jsx","jsxs","Link","ArrowRight","jsx","jsxs","Link","jsx","jsxs","Link","useState","jsx","jsxs"]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Cta, CtaProps, Faq, FaqItem, FaqProps, Feature, Features, FeaturesProps, Footer, FooterColumn, FooterLink, FooterProps, Hero, HeroProps, HeroStat, NavLink, Navbar, NavbarProps, Pricing, PricingPlan, PricingProps } from './components/index.mjs';
|
|
2
|
+
import 'react/jsx-runtime';
|
|
3
|
+
import 'lucide-react';
|
|
4
|
+
import 'react';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Cta, CtaProps, Faq, FaqItem, FaqProps, Feature, Features, FeaturesProps, Footer, FooterColumn, FooterLink, FooterProps, Hero, HeroProps, HeroStat, NavLink, Navbar, NavbarProps, Pricing, PricingPlan, PricingProps } from './components/index.js';
|
|
2
|
+
import 'react/jsx-runtime';
|
|
3
|
+
import 'lucide-react';
|
|
4
|
+
import 'react';
|