@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,444 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
|
|
31
|
+
// src/components/index.ts
|
|
32
|
+
var components_exports = {};
|
|
33
|
+
__export(components_exports, {
|
|
34
|
+
Cta: () => Cta,
|
|
35
|
+
Faq: () => Faq,
|
|
36
|
+
Features: () => Features,
|
|
37
|
+
Footer: () => Footer,
|
|
38
|
+
Hero: () => Hero,
|
|
39
|
+
Navbar: () => Navbar,
|
|
40
|
+
Pricing: () => Pricing
|
|
41
|
+
});
|
|
42
|
+
module.exports = __toCommonJS(components_exports);
|
|
43
|
+
|
|
44
|
+
// src/components/hero.tsx
|
|
45
|
+
var import_link = __toESM(require("next/link"));
|
|
46
|
+
var import_lucide_react = require("lucide-react");
|
|
47
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
48
|
+
function Hero({
|
|
49
|
+
badge,
|
|
50
|
+
title,
|
|
51
|
+
subtitle,
|
|
52
|
+
stats,
|
|
53
|
+
primaryCta = { text: "Get Started Free", href: "/signup" },
|
|
54
|
+
secondaryCta = { text: "Sign In", href: "/login" },
|
|
55
|
+
trustedBy,
|
|
56
|
+
children,
|
|
57
|
+
className
|
|
58
|
+
}) {
|
|
59
|
+
const BadgeIcon = badge?.icon || import_lucide_react.Sparkles;
|
|
60
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: `relative overflow-hidden ${className}`, children: [
|
|
61
|
+
/* @__PURE__ */ (0, import_jsx_runtime.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]" }),
|
|
62
|
+
/* @__PURE__ */ (0, import_jsx_runtime.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]" }),
|
|
63
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "container px-4 py-24 md:py-32 lg:py-40", children: [
|
|
64
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mx-auto flex max-w-5xl flex-col items-center text-center", children: [
|
|
65
|
+
badge && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "mb-6 inline-flex items-center rounded-full border px-4 py-2 text-sm font-medium", children: [
|
|
66
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(BadgeIcon, { className: "mr-2 h-3.5 w-3.5 text-primary" }),
|
|
67
|
+
badge.text
|
|
68
|
+
] }),
|
|
69
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { className: "mb-6 text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl xl:text-7xl", children: title }),
|
|
70
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "mb-8 max-w-2xl text-lg text-muted-foreground md:text-xl", children: subtitle }),
|
|
71
|
+
stats && stats.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mb-10 flex flex-wrap items-center justify-center gap-8 text-sm", children: stats.map((stat, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
72
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-2xl font-bold text-primary", children: stat.value }),
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-muted-foreground", children: stat.label }),
|
|
74
|
+
index < stats.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "ml-6 h-8 w-px bg-border" })
|
|
75
|
+
] }, stat.label)) }),
|
|
76
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col gap-4 sm:flex-row", children: [
|
|
77
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
78
|
+
import_link.default,
|
|
79
|
+
{
|
|
80
|
+
href: primaryCta.href,
|
|
81
|
+
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",
|
|
82
|
+
children: [
|
|
83
|
+
primaryCta.text,
|
|
84
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "ml-2 h-4 w-4" })
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
),
|
|
88
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
89
|
+
import_link.default,
|
|
90
|
+
{
|
|
91
|
+
href: secondaryCta.href,
|
|
92
|
+
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",
|
|
93
|
+
children: [
|
|
94
|
+
secondaryCta.text,
|
|
95
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { className: "ml-2 h-4 w-4" })
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
)
|
|
99
|
+
] }),
|
|
100
|
+
trustedBy && trustedBy.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-12 flex flex-col items-center gap-4", children: [
|
|
101
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: "Trusted by developers at" }),
|
|
102
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex flex-wrap items-center justify-center gap-8 opacity-50 grayscale", children: trustedBy.map((company) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-xl font-bold", children: company }, company)) })
|
|
103
|
+
] })
|
|
104
|
+
] }),
|
|
105
|
+
children
|
|
106
|
+
] })
|
|
107
|
+
] });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// src/components/features.tsx
|
|
111
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
112
|
+
function Features({
|
|
113
|
+
badge = "Features",
|
|
114
|
+
title,
|
|
115
|
+
subtitle,
|
|
116
|
+
features,
|
|
117
|
+
techStack,
|
|
118
|
+
className
|
|
119
|
+
}) {
|
|
120
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("section", { id: "features", className: `py-24 md:py-32 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "container px-4", children: [
|
|
121
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
122
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "mb-4 inline-block rounded-full bg-primary/10 px-4 py-1.5 text-sm font-medium text-primary", children: badge }),
|
|
123
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { className: "mb-4 text-3xl font-bold tracking-tight md:text-4xl lg:text-5xl", children: title }),
|
|
124
|
+
subtitle && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-lg text-muted-foreground", children: subtitle })
|
|
125
|
+
] }),
|
|
126
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "mx-auto mt-16 max-w-6xl", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "grid gap-6 md:grid-cols-2 lg:grid-cols-4", children: features.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
127
|
+
"div",
|
|
128
|
+
{
|
|
129
|
+
className: "group relative overflow-hidden rounded-2xl border bg-background p-6 transition-all hover:shadow-lg hover:shadow-primary/5",
|
|
130
|
+
children: [
|
|
131
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "absolute inset-0 bg-gradient-to-b from-transparent to-muted/20 opacity-0 transition-opacity group-hover:opacity-100" }),
|
|
132
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
133
|
+
"div",
|
|
134
|
+
{
|
|
135
|
+
className: `mb-4 inline-flex rounded-xl p-3 ${feature.bg || "bg-primary/10"}`,
|
|
136
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
137
|
+
feature.icon,
|
|
138
|
+
{
|
|
139
|
+
className: `h-6 w-6 ${feature.color || "text-primary"}`
|
|
140
|
+
}
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
),
|
|
144
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "mb-2 text-lg font-semibold", children: feature.name }),
|
|
145
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm text-muted-foreground leading-relaxed", children: feature.description })
|
|
146
|
+
]
|
|
147
|
+
},
|
|
148
|
+
feature.name
|
|
149
|
+
)) }) }),
|
|
150
|
+
techStack && techStack.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "mx-auto mt-20 max-w-4xl", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "rounded-2xl border bg-muted/30 p-8 text-center", children: [
|
|
151
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h3", { className: "mb-6 text-lg font-semibold", children: "Built with modern technologies" }),
|
|
152
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex flex-wrap items-center justify-center gap-6 md:gap-10", children: techStack.map((tech) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
153
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
154
|
+
"div",
|
|
155
|
+
{
|
|
156
|
+
className: "h-8 w-8 rounded-lg flex items-center justify-center",
|
|
157
|
+
style: { backgroundColor: tech.color },
|
|
158
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
159
|
+
"span",
|
|
160
|
+
{
|
|
161
|
+
className: "text-xs font-bold",
|
|
162
|
+
style: { color: tech.textColor || "white" },
|
|
163
|
+
children: tech.label
|
|
164
|
+
}
|
|
165
|
+
)
|
|
166
|
+
}
|
|
167
|
+
),
|
|
168
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "font-medium", children: tech.name })
|
|
169
|
+
] }, tech.name)) })
|
|
170
|
+
] }) })
|
|
171
|
+
] }) });
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// src/components/pricing.tsx
|
|
175
|
+
var import_link2 = __toESM(require("next/link"));
|
|
176
|
+
var import_lucide_react2 = require("lucide-react");
|
|
177
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
178
|
+
function Pricing({
|
|
179
|
+
title = "Simple, transparent pricing",
|
|
180
|
+
subtitle = "Choose the plan that best fits your needs. All plans include a 14-day free trial.",
|
|
181
|
+
plans,
|
|
182
|
+
className
|
|
183
|
+
}) {
|
|
184
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("section", { id: "pricing", className: `py-20 sm:py-32 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "container", children: [
|
|
185
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
186
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h2", { className: "text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
|
|
187
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-4 text-lg text-muted-foreground", children: subtitle })
|
|
188
|
+
] }),
|
|
189
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "mx-auto mt-16 grid max-w-5xl grid-cols-1 gap-8 lg:grid-cols-3", children: plans.map((plan) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
190
|
+
"div",
|
|
191
|
+
{
|
|
192
|
+
className: `relative flex flex-col rounded-2xl border bg-background p-8 shadow-sm ${plan.popular ? "border-primary shadow-lg" : ""}`,
|
|
193
|
+
children: [
|
|
194
|
+
plan.popular && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("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" }),
|
|
195
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "mb-6", children: [
|
|
196
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h3", { className: "text-lg font-semibold", children: plan.name }),
|
|
197
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "mt-4 flex items-baseline", children: [
|
|
198
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-4xl font-bold", children: plan.price }),
|
|
199
|
+
plan.period && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "ml-1 text-muted-foreground", children: plan.period })
|
|
200
|
+
] }),
|
|
201
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "mt-2 text-sm text-muted-foreground", children: plan.description })
|
|
202
|
+
] }),
|
|
203
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("ul", { className: "mb-8 flex-1 space-y-3", children: plan.features.map((feature) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("li", { className: "flex items-center gap-3", children: [
|
|
204
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_lucide_react2.Check, { className: "h-4 w-4 text-primary" }),
|
|
205
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "text-sm", children: feature })
|
|
206
|
+
] }, feature)) }),
|
|
207
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
208
|
+
import_link2.default,
|
|
209
|
+
{
|
|
210
|
+
href: plan.href,
|
|
211
|
+
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"}`,
|
|
212
|
+
children: plan.cta
|
|
213
|
+
}
|
|
214
|
+
)
|
|
215
|
+
]
|
|
216
|
+
},
|
|
217
|
+
plan.name
|
|
218
|
+
)) })
|
|
219
|
+
] }) });
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// src/components/faq.tsx
|
|
223
|
+
var import_react = require("react");
|
|
224
|
+
var import_lucide_react3 = require("lucide-react");
|
|
225
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
226
|
+
function Faq({
|
|
227
|
+
title = "Frequently asked questions",
|
|
228
|
+
subtitle = "Everything you need to know about our product.",
|
|
229
|
+
items,
|
|
230
|
+
className
|
|
231
|
+
}) {
|
|
232
|
+
const [openIndex, setOpenIndex] = (0, import_react.useState)(null);
|
|
233
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("section", { id: "faq", className: `py-20 sm:py-32 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "container", children: [
|
|
234
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
235
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h2", { className: "text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
|
|
236
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "mt-4 text-lg text-muted-foreground", children: subtitle })
|
|
237
|
+
] }),
|
|
238
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mx-auto mt-16 max-w-3xl", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "divide-y rounded-2xl border", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
|
|
239
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
|
|
240
|
+
"button",
|
|
241
|
+
{
|
|
242
|
+
className: "flex w-full items-center justify-between px-6 py-4 text-left",
|
|
243
|
+
onClick: () => setOpenIndex(openIndex === index ? null : index),
|
|
244
|
+
children: [
|
|
245
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "font-medium", children: item.question }),
|
|
246
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
247
|
+
import_lucide_react3.ChevronDown,
|
|
248
|
+
{
|
|
249
|
+
className: `h-5 w-5 text-muted-foreground transition-transform ${openIndex === index ? "rotate-180" : ""}`
|
|
250
|
+
}
|
|
251
|
+
)
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
),
|
|
255
|
+
openIndex === index && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "px-6 pb-4", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-muted-foreground", children: item.answer }) })
|
|
256
|
+
] }, index)) }) })
|
|
257
|
+
] }) });
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// src/components/cta.tsx
|
|
261
|
+
var import_link3 = __toESM(require("next/link"));
|
|
262
|
+
var import_lucide_react4 = require("lucide-react");
|
|
263
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
264
|
+
function Cta({
|
|
265
|
+
title,
|
|
266
|
+
subtitle,
|
|
267
|
+
primaryCta = { text: "Get Started", href: "/signup" },
|
|
268
|
+
secondaryCta,
|
|
269
|
+
className
|
|
270
|
+
}) {
|
|
271
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("section", { className: `py-20 sm:py-32 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "container", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "relative overflow-hidden rounded-3xl bg-primary px-6 py-20 sm:px-12 sm:py-28", children: [
|
|
272
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "absolute inset-0 -z-10", children: [
|
|
273
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "absolute -left-1/4 -top-1/4 h-1/2 w-1/2 rounded-full bg-white/10 blur-3xl" }),
|
|
274
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "absolute -bottom-1/4 -right-1/4 h-1/2 w-1/2 rounded-full bg-white/10 blur-3xl" })
|
|
275
|
+
] }),
|
|
276
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
277
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className: "text-3xl font-bold tracking-tight text-primary-foreground sm:text-4xl", children: title }),
|
|
278
|
+
subtitle && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "mt-4 text-lg text-primary-foreground/80", children: subtitle }),
|
|
279
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "mt-8 flex flex-col items-center justify-center gap-4 sm:flex-row", children: [
|
|
280
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
|
|
281
|
+
import_link3.default,
|
|
282
|
+
{
|
|
283
|
+
href: primaryCta.href,
|
|
284
|
+
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",
|
|
285
|
+
children: [
|
|
286
|
+
primaryCta.text,
|
|
287
|
+
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_lucide_react4.ArrowRight, { className: "ml-2 h-4 w-4" })
|
|
288
|
+
]
|
|
289
|
+
}
|
|
290
|
+
),
|
|
291
|
+
secondaryCta && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
292
|
+
import_link3.default,
|
|
293
|
+
{
|
|
294
|
+
href: secondaryCta.href,
|
|
295
|
+
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",
|
|
296
|
+
children: secondaryCta.text
|
|
297
|
+
}
|
|
298
|
+
)
|
|
299
|
+
] })
|
|
300
|
+
] })
|
|
301
|
+
] }) }) });
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// src/components/footer.tsx
|
|
305
|
+
var import_link4 = __toESM(require("next/link"));
|
|
306
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
307
|
+
function Footer({
|
|
308
|
+
logo,
|
|
309
|
+
siteName = "SaaS Kit",
|
|
310
|
+
description = "Build your SaaS faster with our production-ready starter kit.",
|
|
311
|
+
columns = [],
|
|
312
|
+
socialLinks = [],
|
|
313
|
+
copyright,
|
|
314
|
+
className
|
|
315
|
+
}) {
|
|
316
|
+
const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
|
|
317
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("footer", { className: `border-t py-12 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "container", children: [
|
|
318
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "grid gap-8 md:grid-cols-2 lg:grid-cols-5", children: [
|
|
319
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "lg:col-span-2", children: [
|
|
320
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_link4.default, { href: "/", className: "flex items-center gap-2", children: [
|
|
321
|
+
logo || /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold", children: "S" }),
|
|
322
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-lg font-semibold", children: siteName })
|
|
323
|
+
] }),
|
|
324
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "mt-4 max-w-xs text-sm text-muted-foreground", children: description }),
|
|
325
|
+
socialLinks.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mt-6 flex gap-4", children: socialLinks.map((link) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
326
|
+
"a",
|
|
327
|
+
{
|
|
328
|
+
href: link.href,
|
|
329
|
+
className: "text-muted-foreground hover:text-foreground",
|
|
330
|
+
"aria-label": link.label,
|
|
331
|
+
children: link.icon
|
|
332
|
+
},
|
|
333
|
+
link.label
|
|
334
|
+
)) })
|
|
335
|
+
] }),
|
|
336
|
+
columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { children: [
|
|
337
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "font-semibold", children: column.title }),
|
|
338
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "mt-4 space-y-2", children: column.links.map((link) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
339
|
+
import_link4.default,
|
|
340
|
+
{
|
|
341
|
+
href: link.href,
|
|
342
|
+
className: "text-sm text-muted-foreground hover:text-foreground",
|
|
343
|
+
children: link.label
|
|
344
|
+
}
|
|
345
|
+
) }, link.label)) })
|
|
346
|
+
] }, column.title))
|
|
347
|
+
] }),
|
|
348
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "mt-12 border-t pt-8 text-center text-sm text-muted-foreground", children: copyright || `\xA9 ${currentYear} ${siteName}. All rights reserved.` })
|
|
349
|
+
] }) });
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// src/components/navbar.tsx
|
|
353
|
+
var import_link5 = __toESM(require("next/link"));
|
|
354
|
+
var import_react2 = require("react");
|
|
355
|
+
var import_lucide_react5 = require("lucide-react");
|
|
356
|
+
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
357
|
+
function Navbar({
|
|
358
|
+
logo,
|
|
359
|
+
siteName = "SaaS Kit",
|
|
360
|
+
links = [
|
|
361
|
+
{ label: "Features", href: "#features" },
|
|
362
|
+
{ label: "Pricing", href: "#pricing" },
|
|
363
|
+
{ label: "FAQ", href: "#faq" }
|
|
364
|
+
],
|
|
365
|
+
ctaText = "Get Started",
|
|
366
|
+
ctaHref = "/signup",
|
|
367
|
+
className
|
|
368
|
+
}) {
|
|
369
|
+
const [isOpen, setIsOpen] = (0, import_react2.useState)(false);
|
|
370
|
+
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
|
|
371
|
+
"header",
|
|
372
|
+
{
|
|
373
|
+
className: `sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 ${className}`,
|
|
374
|
+
children: [
|
|
375
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("nav", { className: "container flex h-16 items-center justify-between", children: [
|
|
376
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_link5.default, { href: "/", className: "flex items-center gap-2", children: [
|
|
377
|
+
logo || /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground font-bold", children: "S" }),
|
|
378
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-lg font-semibold", children: siteName })
|
|
379
|
+
] }),
|
|
380
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "hidden items-center gap-6 md:flex", children: [
|
|
381
|
+
links.map((link) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
382
|
+
import_link5.default,
|
|
383
|
+
{
|
|
384
|
+
href: link.href,
|
|
385
|
+
className: "text-sm font-medium text-muted-foreground transition-colors hover:text-foreground",
|
|
386
|
+
children: link.label
|
|
387
|
+
},
|
|
388
|
+
link.label
|
|
389
|
+
)),
|
|
390
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
391
|
+
import_link5.default,
|
|
392
|
+
{
|
|
393
|
+
href: ctaHref,
|
|
394
|
+
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",
|
|
395
|
+
children: ctaText
|
|
396
|
+
}
|
|
397
|
+
)
|
|
398
|
+
] }),
|
|
399
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
400
|
+
"button",
|
|
401
|
+
{
|
|
402
|
+
className: "md:hidden",
|
|
403
|
+
onClick: () => setIsOpen(!isOpen),
|
|
404
|
+
"aria-label": "Toggle menu",
|
|
405
|
+
children: isOpen ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react5.X, { className: "h-6 w-6" }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_lucide_react5.Menu, { className: "h-6 w-6" })
|
|
406
|
+
}
|
|
407
|
+
)
|
|
408
|
+
] }),
|
|
409
|
+
isOpen && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "border-t md:hidden", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "container py-4", children: [
|
|
410
|
+
links.map((link) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
411
|
+
import_link5.default,
|
|
412
|
+
{
|
|
413
|
+
href: link.href,
|
|
414
|
+
className: "block py-2 text-sm font-medium text-muted-foreground transition-colors hover:text-foreground",
|
|
415
|
+
onClick: () => setIsOpen(false),
|
|
416
|
+
children: link.label
|
|
417
|
+
},
|
|
418
|
+
link.label
|
|
419
|
+
)),
|
|
420
|
+
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
421
|
+
import_link5.default,
|
|
422
|
+
{
|
|
423
|
+
href: ctaHref,
|
|
424
|
+
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",
|
|
425
|
+
onClick: () => setIsOpen(false),
|
|
426
|
+
children: ctaText
|
|
427
|
+
}
|
|
428
|
+
)
|
|
429
|
+
] }) })
|
|
430
|
+
]
|
|
431
|
+
}
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
435
|
+
0 && (module.exports = {
|
|
436
|
+
Cta,
|
|
437
|
+
Faq,
|
|
438
|
+
Features,
|
|
439
|
+
Footer,
|
|
440
|
+
Hero,
|
|
441
|
+
Navbar,
|
|
442
|
+
Pricing
|
|
443
|
+
});
|
|
444
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/index.ts","../../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":["export { Hero } from \"./hero\";\nexport type { HeroProps, HeroStat } from \"./hero\";\n\nexport { Features } from \"./features\";\nexport type { FeaturesProps, Feature } from \"./features\";\n\nexport { Pricing } from \"./pricing\";\nexport type { PricingProps, PricingPlan } from \"./pricing\";\n\nexport { Faq } from \"./faq\";\nexport type { FaqProps, FaqItem } from \"./faq\";\n\nexport { Cta } from \"./cta\";\nexport type { CtaProps } from \"./cta\";\n\nexport { Footer } from \"./footer\";\nexport type { FooterProps, FooterColumn, FooterLink } from \"./footer\";\n\nexport { Navbar } from \"./navbar\";\nexport type { NavbarProps, NavLink } from \"./navbar\";\n","\"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":["Link","import_jsx_runtime","import_link","import_lucide_react","import_jsx_runtime","Link","import_lucide_react","import_jsx_runtime","import_link","import_lucide_react","import_jsx_runtime","Link","import_link","import_jsx_runtime","Link","import_link","import_react","import_lucide_react","import_jsx_runtime","Link"]}
|