@mdxui/named 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1121 @@
1
+ // src/view/view.tsx
2
+ import { Site } from "@mdxui/themes";
3
+ import { Navbar17, FooterSmall, NoiseTexture } from "@mdxui/neo";
4
+
5
+ // src/components/hero/hero.tsx
6
+ import Image from "next/image";
7
+ import { HiChevronRight } from "react-icons/hi";
8
+
9
+ // src/shared/scroll-reveal/scroll-reveal.tsx
10
+ import { motion } from "motion/react";
11
+ import { jsx } from "react/jsx-runtime";
12
+ var directionVariants = {
13
+ up: {
14
+ hidden: { opacity: 0, y: 50 },
15
+ visible: { opacity: 1, y: 0 }
16
+ },
17
+ down: {
18
+ hidden: { opacity: 0, y: -50 },
19
+ visible: { opacity: 1, y: 0 }
20
+ },
21
+ left: {
22
+ hidden: { opacity: 0, x: -50 },
23
+ visible: { opacity: 1, x: 0 }
24
+ },
25
+ right: {
26
+ hidden: { opacity: 0, x: 50 },
27
+ visible: { opacity: 1, x: 0 }
28
+ },
29
+ none: {
30
+ hidden: { opacity: 0 },
31
+ visible: { opacity: 1 }
32
+ }
33
+ };
34
+ function ScrollReveal({
35
+ children,
36
+ className,
37
+ delay = 0,
38
+ direction = "up",
39
+ duration = 0.5,
40
+ trigger = "inView",
41
+ once = true,
42
+ margin = "-100px"
43
+ }) {
44
+ if (trigger === "mount") {
45
+ return /* @__PURE__ */ jsx(
46
+ motion.div,
47
+ {
48
+ initial: "hidden",
49
+ animate: "visible",
50
+ transition: { duration, delay, ease: "easeOut" },
51
+ variants: directionVariants[direction],
52
+ className,
53
+ children
54
+ }
55
+ );
56
+ }
57
+ return /* @__PURE__ */ jsx(
58
+ motion.div,
59
+ {
60
+ initial: "hidden",
61
+ whileInView: "visible",
62
+ viewport: { once, margin },
63
+ transition: { duration, delay, ease: "easeOut" },
64
+ variants: directionVariants[direction],
65
+ className,
66
+ children
67
+ }
68
+ );
69
+ }
70
+
71
+ // src/lib/utils.ts
72
+ import { clsx } from "clsx";
73
+ import { twMerge } from "tailwind-merge";
74
+ function cn(...inputs) {
75
+ return twMerge(clsx(inputs));
76
+ }
77
+
78
+ // src/shared/marquee/marquee.tsx
79
+ import { jsx as jsx2 } from "react/jsx-runtime";
80
+ function Marquee({
81
+ className,
82
+ reverse = false,
83
+ pauseOnHover = false,
84
+ children,
85
+ vertical = false,
86
+ repeat = 4,
87
+ ...props
88
+ }) {
89
+ return /* @__PURE__ */ jsx2(
90
+ "div",
91
+ {
92
+ ...props,
93
+ className: cn(
94
+ "group flex [gap:var(--gap)] overflow-hidden p-2 [--duration:40s] [--gap:1rem]",
95
+ {
96
+ "flex-row": !vertical,
97
+ "flex-col": vertical
98
+ },
99
+ className
100
+ ),
101
+ children: Array(repeat).fill(0).map((_, i) => /* @__PURE__ */ jsx2(
102
+ "div",
103
+ {
104
+ className: cn("flex shrink-0 justify-around [gap:var(--gap)]", {
105
+ "animate-marquee flex-row": !vertical,
106
+ "animate-marquee-vertical flex-col": vertical,
107
+ "group-hover:[animation-play-state:paused]": pauseOnHover,
108
+ "[animation-direction:reverse]": reverse
109
+ }),
110
+ children
111
+ },
112
+ i
113
+ ))
114
+ }
115
+ );
116
+ }
117
+
118
+ // src/components/hero/hero.tsx
119
+ import { Button } from "@mdxui/primitives";
120
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
121
+ function Hero({
122
+ badgeEmoji = "",
123
+ badgeText = "Meet Priya",
124
+ badgeHref = "#",
125
+ heading = "Your AI Product Manager for GitHub",
126
+ description = "Priya triages issues, plans sprints, and grooms your backlog automatically. You focus on building.",
127
+ ctaText = "Get Started",
128
+ ctaHref = "#pricing",
129
+ ctaVariant = "default",
130
+ rightImageSrc = "/images/hero/hero-main.png",
131
+ rightImageAlt = "Portfolio showcase",
132
+ rightImageSizes = "(max-width: 768px) 100vw, 500px",
133
+ showIconOverlay: _showIconOverlay = true,
134
+ marqueeTitle = "Tools I work with",
135
+ marqueeImages = Array.from({ length: 12 }).map(
136
+ () => "https://zapier-images.imgix.net/storage/services/c63f7c57dc0afb733535a5adccce4d01.png?auto=format&fit=crop&ixlib=react-9.10.0&q=50&w=60&h=60&dpr=2"
137
+ ),
138
+ className
139
+ }) {
140
+ return /* @__PURE__ */ jsx3("section", { className: cn("relative py-12 md:py-16 px-6 lg:px-12 bg-background", className), children: /* @__PURE__ */ jsxs("div", { className: "max-w-7xl mx-auto p-0 sm:p-16 rounded-none sm:rounded-3xl md:[background:linear-gradient(180deg,var(--card)_0%,transparent_83.55%)]", children: [
141
+ /* @__PURE__ */ jsxs("div", { className: "grid lg:grid-cols-2 gap-8 lg:gap-16 items-start mb-16 lg:mb-20", children: [
142
+ /* @__PURE__ */ jsxs("div", { className: "space-y-6 lg:pt-8", children: [
143
+ /* @__PURE__ */ jsx3(ScrollReveal, { direction: "down", delay: 0.1, children: /* @__PURE__ */ jsx3("div", { className: "inline-block", children: /* @__PURE__ */ jsxs(
144
+ "a",
145
+ {
146
+ href: badgeHref,
147
+ target: "_blank",
148
+ rel: "noopener noreferrer",
149
+ className: "inline-flex items-center gap-2.5 px-4 py-2 rounded-full transition-colors border border-border bg-card",
150
+ children: [
151
+ /* @__PURE__ */ jsx3("span", { className: "text-base", children: badgeEmoji }),
152
+ /* @__PURE__ */ jsx3("p", { className: "font-normal text-sm tracking-wide leading-snug text-foreground uppercase", children: badgeText })
153
+ ]
154
+ }
155
+ ) }) }),
156
+ /* @__PURE__ */ jsx3(ScrollReveal, { direction: "up", delay: 0.2, children: /* @__PURE__ */ jsx3("h1", { className: "font-normal text-[clamp(56px,6vw,72px)] leading-tight tracking-tight text-foreground", children: heading }) }),
157
+ /* @__PURE__ */ jsx3(ScrollReveal, { direction: "up", delay: 0.3, children: /* @__PURE__ */ jsx3("p", { className: "text-lg leading-relaxed max-w-lg", children: description }) }),
158
+ /* @__PURE__ */ jsx3(ScrollReveal, { direction: "up", delay: 0.4, trigger: "mount", children: /* @__PURE__ */ jsx3("div", { className: "flex flex-col sm:flex-row gap-3 pt-4", children: /* @__PURE__ */ jsx3(Button, { asChild: true, variant: ctaVariant, children: /* @__PURE__ */ jsxs("a", { href: ctaHref, children: [
159
+ ctaText,
160
+ /* @__PURE__ */ jsx3(HiChevronRight, { className: "w-4 h-4" })
161
+ ] }) }) }) })
162
+ ] }),
163
+ /* @__PURE__ */ jsx3(ScrollReveal, { direction: "right", delay: 0.2, children: /* @__PURE__ */ jsx3("div", { className: "relative flex justify-center lg:justify-end", children: /* @__PURE__ */ jsx3("div", { className: "relative w-full max-w-lg", children: /* @__PURE__ */ jsx3("div", { className: "relative w-full aspect-square", children: /* @__PURE__ */ jsx3(
164
+ Image,
165
+ {
166
+ src: rightImageSrc,
167
+ alt: rightImageAlt,
168
+ fill: true,
169
+ className: "object-cover object-left-center rounded-2xl",
170
+ priority: true,
171
+ sizes: rightImageSizes
172
+ }
173
+ ) }) }) }) })
174
+ ] }),
175
+ /* @__PURE__ */ jsxs(ScrollReveal, { direction: "up", delay: 0.4, trigger: "mount", children: [
176
+ /* @__PURE__ */ jsx3("div", { className: "mt-12", children: /* @__PURE__ */ jsx3("p", { className: "text-base text-muted-foreground text-center", children: marqueeTitle }) }),
177
+ /* @__PURE__ */ jsxs("div", { className: "relative mt-4 sm:mt-6", children: [
178
+ /* @__PURE__ */ jsx3(
179
+ "div",
180
+ {
181
+ className: "pointer-events-none absolute inset-y-0 left-0 w-20 sm:w-28 z-10",
182
+ style: { background: "linear-gradient(to right, var(--background), transparent)" }
183
+ }
184
+ ),
185
+ /* @__PURE__ */ jsx3(
186
+ "div",
187
+ {
188
+ className: "pointer-events-none absolute inset-y-0 right-0 w-20 sm:w-28 z-10",
189
+ style: { background: "linear-gradient(to left, var(--background), transparent)" }
190
+ }
191
+ ),
192
+ /* @__PURE__ */ jsx3(Marquee, { className: "relative z-0 py-2 [--gap:1.25rem] sm:[--gap:3rem]", children: marqueeImages.map((src, i) => /* @__PURE__ */ jsx3("img", { src, alt: "Placeholder", className: "h-16 w-16 rounded-xl bg-card p-2" }, `${src}-${i}`)) })
193
+ ] })
194
+ ] })
195
+ ] }) });
196
+ }
197
+
198
+ // src/components/features/features.tsx
199
+ import { CheckCircle } from "lucide-react";
200
+
201
+ // src/shared/code-window/code-window.tsx
202
+ import { jsx as jsx4 } from "react/jsx-runtime";
203
+ function CodeWindow({ code, className }) {
204
+ const highlightCode = (code2) => {
205
+ const lines = code2.split("\n");
206
+ const result = [];
207
+ let prevWasComment = false;
208
+ let prevWasCode = false;
209
+ for (let i = 0; i < lines.length; i++) {
210
+ const line = lines[i];
211
+ const isComment = line.trim().startsWith("//");
212
+ const isEmpty = line.trim() === "";
213
+ const isCode = !isComment && !isEmpty;
214
+ if (isComment && prevWasCode) {
215
+ result.push(/* @__PURE__ */ jsx4("div", { className: "h-5" }, `space-before-${i}`));
216
+ }
217
+ if (prevWasComment && isCode) {
218
+ result.push(/* @__PURE__ */ jsx4("div", { className: "h-5" }, `space-after-${i}`));
219
+ }
220
+ if (isEmpty) {
221
+ result.push(/* @__PURE__ */ jsx4("div", { className: "h-5" }, i));
222
+ prevWasComment = false;
223
+ prevWasCode = false;
224
+ continue;
225
+ }
226
+ if (isComment) {
227
+ result.push(
228
+ /* @__PURE__ */ jsx4("div", { className: "text-[#7d8590]", children: line }, i)
229
+ );
230
+ prevWasComment = true;
231
+ prevWasCode = false;
232
+ continue;
233
+ }
234
+ let highlighted = line;
235
+ highlighted = highlighted.replace(
236
+ /\$\.(\w+)\.(\w+)/g,
237
+ '<span class="text-[#79c0ff]">$</span>.<span class="text-[#d2a8ff]">$1</span>.<span class="text-[#ffa657]">$2</span>'
238
+ );
239
+ highlighted = highlighted.replace(/(\w+):/g, '<span class="text-[#79c0ff]">$1</span>:');
240
+ highlighted = highlighted.replace(/'([^']*)'/g, `<span class="text-[#a5d6ff]">'$1'</span>`);
241
+ highlighted = highlighted.replace(/\b(\d+)\b/g, '<span class="text-[#79c0ff]">$1</span>');
242
+ result.push(/* @__PURE__ */ jsx4("div", { dangerouslySetInnerHTML: { __html: highlighted } }, i));
243
+ prevWasComment = false;
244
+ prevWasCode = true;
245
+ }
246
+ return result;
247
+ };
248
+ return /* @__PURE__ */ jsx4("div", { className: `w-full h-full bg-[#0d1117] rounded-lg overflow-hidden ${className ?? ""}`, children: /* @__PURE__ */ jsx4("div", { className: "flex-1 overflow-auto p-6 lg:p-8", children: /* @__PURE__ */ jsx4("pre", { className: "text-sm lg:text-sm leading-relaxed font-mono text-[#e6edf3]", children: highlightCode(code) }) }) });
249
+ }
250
+
251
+ // src/components/features/features.tsx
252
+ import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
253
+ var defaultFeatures = [
254
+ {
255
+ title: "Automatic Issue Triage",
256
+ description: "Every new issue gets analyzed, labeled, prioritized, and assigned to the right person\u2014automatically in seconds.",
257
+ items: [{ text: "Smart labels based on content" }, { text: "Priority using impact + urgency" }, { text: "Auto-assigned to right person" }],
258
+ code: `// New issue arrives
259
+ $.Priya.triage({
260
+ issue: '#347'
261
+ })
262
+
263
+ // Priya handles everything:
264
+ // \u2192 Reads issue content
265
+ // \u2192 Applies correct labels
266
+ // \u2192 Sets priority level
267
+ // \u2192 Assigns to team member
268
+ // \u2192 Adds to project board`,
269
+ badge: "01"
270
+ },
271
+ {
272
+ title: "Sprint Planning",
273
+ description: "Priya reviews your backlog, calculates what your team can handle, and builds the sprint for you.",
274
+ items: [{ text: "Capacity based on team velocity" }, { text: "Best issues selected automatically" }, { text: "Sprint board ready to go" }],
275
+ code: `// Sprint planning day
276
+ $.Priya.planSprint({
277
+ capacity: 40,
278
+ startDate: 'Monday'
279
+ })
280
+
281
+ // Priya prepares:
282
+ // \u2192 Reviews all backlog items
283
+ // \u2192 Calculates team velocity
284
+ // \u2192 Selects optimal issues
285
+ // \u2192 Organizes sprint board
286
+ // \u2192 Notifies team`,
287
+ badge: "02"
288
+ },
289
+ {
290
+ title: "Backlog Grooming",
291
+ description: "Your backlog stays healthy automatically\u2014prioritized, organized, and actionable.",
292
+ items: [{ text: "Always prioritized correctly" }, { text: "No more zombie issues" }, { text: "Epics become user stories" }],
293
+ code: `// Runs continuously
294
+ $.Priya.groomBacklog({
295
+ framework: 'RICE'
296
+ })
297
+
298
+ // Priya maintains:
299
+ // \u2192 Applies RICE scoring
300
+ // \u2192 Closes stale issues
301
+ // \u2192 Breaks down epics
302
+ // \u2192 Updates priorities
303
+ // \u2192 Tracks dependencies`,
304
+ badge: "03"
305
+ },
306
+ {
307
+ title: "Status Reports",
308
+ description: "Weekly progress reports generated and shared automatically. No more manual updates.",
309
+ items: [{ text: "Automatic progress tracking" }, { text: "Blockers surfaced early" }, { text: "Team stays informed" }],
310
+ code: `// Every Friday
311
+ $.Priya.statusReport({
312
+ period: 'week'
313
+ })
314
+
315
+ // Priya reports:
316
+ // \u2192 Issues closed
317
+ // \u2192 PRs merged
318
+ // \u2192 Sprint progress
319
+ // \u2192 Blockers identified
320
+ // \u2192 Shares with team`,
321
+ badge: "04"
322
+ }
323
+ ];
324
+ function Features({ heading = "How It Works", description = "Priya handles the repetitive work so you can focus on what matters. Here's how she automates your entire product workflow.", features = defaultFeatures, className }) {
325
+ return /* @__PURE__ */ jsx5("section", { id: "features", className: cn("flex justify-center items-center pb-0 md:pb-10 bg-background", className), children: /* @__PURE__ */ jsxs2("div", { className: "features-gradient flex flex-col items-center w-full relative overflow-visible rounded-[36px] gap-16 h-min max-w-[1400px] py-10 sm:py-20", children: [
326
+ /* @__PURE__ */ jsx5(ScrollReveal, { direction: "up", delay: 0.1, children: /* @__PURE__ */ jsxs2("div", { className: "text-center w-full px-4 md:px-6 space-y-4", children: [
327
+ /* @__PURE__ */ jsx5("h2", { className: "font-normal text-[clamp(32px,4vw,40px)] leading-tight text-foreground", children: heading }),
328
+ /* @__PURE__ */ jsx5("p", { className: "text-base md:text-lg text-muted-foreground max-w-2xl mx-auto", children: description })
329
+ ] }) }),
330
+ /* @__PURE__ */ jsx5("div", { className: "w-full px-4 lg:px-18 space-y-10", children: features.map((feature, index) => /* @__PURE__ */ jsx5(ScrollReveal, { direction: "up", delay: index * 0.1, children: /* @__PURE__ */ jsxs2("div", { className: "grid md:grid-cols-2 overflow-hidden bg-card w-full rounded-3xl feature-card-shadow opacity-100 border border-border", children: [
331
+ /* @__PURE__ */ jsxs2("div", { className: "flex flex-col px-6 py-8 lg:px-8 lg:py-12 xl:px-12 xl:py-20", children: [
332
+ /* @__PURE__ */ jsx5("div", { className: "mb-4", children: /* @__PURE__ */ jsx5("span", { className: "inline-flex size-10 items-center justify-center rounded-lg font-mono text-sm font-medium bg-card dark:bg-muted border border-border dark:border-border text-foreground", children: feature.badge }) }),
333
+ /* @__PURE__ */ jsx5("h3", { className: "mb-3 text-2xl font-medium sm:mb-5 md:text-3xl text-foreground", children: feature.title }),
334
+ /* @__PURE__ */ jsx5("div", { className: "mb-8 text-sm sm:mb-10 md:text-base text-muted-foreground", children: feature.description }),
335
+ /* @__PURE__ */ jsx5("ul", { className: "space-y-2 sm:space-y-3", children: feature.items.map((item, itemIndex) => /* @__PURE__ */ jsxs2("li", { className: "flex gap-x-3 items-start", children: [
336
+ /* @__PURE__ */ jsx5(CheckCircle, { className: "mt-1 size-4 shrink-0 text-primary" }),
337
+ /* @__PURE__ */ jsx5("p", { className: "text-sm md:text-base text-foreground", children: item.text })
338
+ ] }, itemIndex)) })
339
+ ] }),
340
+ /* @__PURE__ */ jsx5("div", { className: "relative order-last md:order-last h-96 md:h-[500px] p-4 md:p-8 lg:p-10", children: /* @__PURE__ */ jsx5(CodeWindow, { code: feature.code }) })
341
+ ] }) }, index)) })
342
+ ] }) });
343
+ }
344
+
345
+ // src/components/pricing/pricing.tsx
346
+ import { Check } from "lucide-react";
347
+ import { Button as Button2 } from "@mdxui/primitives";
348
+ import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
349
+ var defaultFeatures2 = [
350
+ { text: "Automated backups" },
351
+ { text: "24/7 support" },
352
+ { text: "Unlimited projects" },
353
+ { text: "Unlimited users" },
354
+ { text: "Custom domain" },
355
+ { text: "Custom branding" },
356
+ { text: "Advanced analytics" },
357
+ { text: "Custom permissions" },
358
+ { text: "Advanced reports" }
359
+ ];
360
+ function Pricing({
361
+ heading = "Simple, transparent pricing",
362
+ subheading = "Start automating your product workflow in minutes. No credit card required to get started.",
363
+ price = "$16",
364
+ priceUnit = "/ month",
365
+ trialText = "With a 7-day free trial",
366
+ ctaText = "Get Started",
367
+ ctaHref = "#contact",
368
+ featuresHeading = "What's included",
369
+ features = defaultFeatures2,
370
+ backgroundColor = "bg-background",
371
+ securityNote = "Priya only accesses GitHub Issues and Projects\u2014she cannot read your code or secrets.",
372
+ className
373
+ }) {
374
+ return /* @__PURE__ */ jsx6("section", { id: "pricing", className: cn(`pt-12 md:pt-16 pb-10 sm:pb-20 ${backgroundColor}`, className), children: /* @__PURE__ */ jsxs3("div", { className: "max-w-7xl mx-auto p-6 sm:p-16 rounded-none sm:rounded-3xl pricing-gradient", children: [
375
+ /* @__PURE__ */ jsx6(ScrollReveal, { direction: "up", delay: 0.1, children: /* @__PURE__ */ jsxs3("div", { className: "text-center my-16 sm:my-12", children: [
376
+ /* @__PURE__ */ jsx6("h2", { className: "font-normal text-[clamp(32px,4vw,40px)] leading-tight text-foreground mb-4", children: heading }),
377
+ /* @__PURE__ */ jsx6("p", { className: "text-base text-muted-foreground max-w-2xl mx-auto", children: subheading })
378
+ ] }) }),
379
+ /* @__PURE__ */ jsx6(ScrollReveal, { direction: "up", delay: 0.2, children: /* @__PURE__ */ jsxs3("div", { className: "bg-card mx-auto flex w-full md:max-w-md lg:max-w-3xl flex-col rounded-3xl border border-border feature-card-shadow p-6 md:p-8 px-6", children: [
380
+ /* @__PURE__ */ jsxs3("div", { className: "text-center", children: [
381
+ /* @__PURE__ */ jsxs3("div", { className: "flex justify-start sm:justify-center items-baseline", children: [
382
+ /* @__PURE__ */ jsx6("span", { className: "text-3xl font-semibold text-foreground", children: price }),
383
+ /* @__PURE__ */ jsx6("span", { className: "text-muted-foreground ml-2 text-sm", children: priceUnit })
384
+ ] }),
385
+ trialText && /* @__PURE__ */ jsx6("p", { className: "text-left sm:text-center text-muted-foreground mt-3 text-sm", children: trialText }),
386
+ /* @__PURE__ */ jsx6(Button2, { asChild: true, variant: "default", className: "mt-5 w-full md:w-64", children: /* @__PURE__ */ jsx6("a", { href: ctaHref, children: ctaText }) })
387
+ ] }),
388
+ /* @__PURE__ */ jsxs3("div", { className: "mt-8", children: [
389
+ /* @__PURE__ */ jsx6("p", { className: "text-left sm:text-center text-lg font-semibold text-foreground mb-4", children: featuresHeading }),
390
+ /* @__PURE__ */ jsx6("ul", { className: "grid gap-y-3 gap-x-6 md:grid-cols-2 lg:grid-cols-3 ", children: features.map((feature, index) => /* @__PURE__ */ jsxs3("li", { className: "flex items-start text-left", children: [
391
+ /* @__PURE__ */ jsx6(Check, { className: "text-primary mr-2 size-4 shrink-0" }),
392
+ /* @__PURE__ */ jsx6("span", { className: "text-foreground text-sm", children: feature.text })
393
+ ] }, index)) })
394
+ ] })
395
+ ] }) }),
396
+ securityNote && /* @__PURE__ */ jsx6(ScrollReveal, { direction: "up", delay: 0.3, children: /* @__PURE__ */ jsx6("div", { className: "text-center mt-8", children: /* @__PURE__ */ jsxs3("p", { className: "text-sm text-muted-foreground", children: [
397
+ /* @__PURE__ */ jsx6("strong", { children: "Your code stays private." }),
398
+ " ",
399
+ securityNote
400
+ ] }) }) })
401
+ ] }) });
402
+ }
403
+
404
+ // src/components/pricing/pricing-tiers.tsx
405
+ import { Check as Check2 } from "lucide-react";
406
+ import Image2 from "next/image";
407
+ import { Button as Button3 } from "@mdxui/primitives";
408
+ import { Fragment, jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
409
+ var defaultTiers = [
410
+ {
411
+ title: "Business",
412
+ description: "For growing teams that need more power and priority support.",
413
+ price: "$299",
414
+ priceUnit: "/ month",
415
+ ctaText: "Get Started",
416
+ ctaVariant: "primary",
417
+ ctaHref: "#contact",
418
+ features: [
419
+ { text: "Unlimited repositories" },
420
+ { text: "Unlimited issues & projects" },
421
+ { text: "Unlimited team members" },
422
+ { text: "Priority support" },
423
+ { text: "Custom workflows" },
424
+ { text: "Advanced analytics" }
425
+ ],
426
+ image: "/images/hero/hero-main.png",
427
+ imageAlt: "Business Plan",
428
+ featured: true
429
+ },
430
+ {
431
+ title: "Team",
432
+ description: "Perfect for small teams getting started with AI product management.",
433
+ price: "$99",
434
+ priceUnit: "/ month",
435
+ ctaText: "Get Started",
436
+ ctaVariant: "secondary",
437
+ ctaHref: "#contact",
438
+ features: [{ text: "Up to 10 repositories" }, { text: "Unlimited issues & projects" }, { text: "Unlimited team members" }, { text: "Email support" }],
439
+ featured: false
440
+ }
441
+ ];
442
+ function PricingTiers({
443
+ heading = "Simple, transparent pricing",
444
+ subheading = "Start automating your product workflow in minutes. No credit card required to get started.",
445
+ tiers = defaultTiers,
446
+ backgroundColor = "bg-background",
447
+ securityNote = "Priya only accesses GitHub Issues and Projects\u2014she cannot read your code or secrets.",
448
+ className
449
+ }) {
450
+ return /* @__PURE__ */ jsx7("section", { id: "pricing", className: cn(`pt-12 md:pt-16 pb-10 sm:pb-20 ${backgroundColor}`, className), children: /* @__PURE__ */ jsxs4("div", { className: "max-w-7xl mx-auto p-6 sm:p-16 rounded-none sm:rounded-3xl pricing-gradient", children: [
451
+ /* @__PURE__ */ jsx7(ScrollReveal, { direction: "up", delay: 0.1, children: /* @__PURE__ */ jsxs4("div", { className: "text-center my-16 sm:my-12", children: [
452
+ /* @__PURE__ */ jsx7("h2", { className: "font-normal text-[clamp(32px,4vw,52px)] leading-tight text-foreground mb-4", children: heading }),
453
+ /* @__PURE__ */ jsx7("p", { className: "text-base text-muted-foreground max-w-2xl mx-auto", children: subheading })
454
+ ] }) }),
455
+ /* @__PURE__ */ jsx7("ul", { className: "grid gap-6 lg:grid-cols-3 lg:items-stretch", children: tiers.map((tier, index) => /* @__PURE__ */ jsx7("li", { className: tier.featured ? "lg:col-span-2 flex" : "lg:col-span-1 flex", children: /* @__PURE__ */ jsx7(ScrollReveal, { direction: "up", delay: 0.2 + index * 0.1, className: "w-full", children: /* @__PURE__ */ jsx7(
456
+ "div",
457
+ {
458
+ className: tier.featured ? "bg-card flex w-full h-full flex-col-reverse rounded-3xl border border-border feature-card-shadow md:flex-row" : "bg-card w-full h-full rounded-3xl border border-border feature-card-shadow p-6 md:p-8",
459
+ children: tier.featured ? /* @__PURE__ */ jsxs4(Fragment, { children: [
460
+ tier.image && /* @__PURE__ */ jsx7("div", { className: "hidden xl:block xl:w-1/2 pl-6 md:pl-8 py-6 md:py-8", children: /* @__PURE__ */ jsx7("div", { className: "h-full rounded-lg overflow-hidden relative min-h-96", children: /* @__PURE__ */ jsx7(Image2, { src: tier.image, alt: tier.imageAlt || tier.title, fill: true, className: "object-cover", sizes: "(max-width: 1280px) 0vw, 50vw" }) }) }),
461
+ /* @__PURE__ */ jsxs4("div", { className: "flex flex-col p-6 md:p-8 xl:w-1/2", children: [
462
+ /* @__PURE__ */ jsxs4("div", { className: "flex-1", children: [
463
+ /* @__PURE__ */ jsx7("p", { className: "text-lg font-semibold text-foreground", children: tier.title }),
464
+ /* @__PURE__ */ jsx7("p", { className: "text-muted-foreground mt-3", children: tier.description }),
465
+ /* @__PURE__ */ jsxs4("div", { className: "mt-6 flex items-baseline", children: [
466
+ /* @__PURE__ */ jsx7("span", { className: "text-3xl font-semibold text-foreground", children: tier.price }),
467
+ /* @__PURE__ */ jsx7("span", { className: "text-muted-foreground ml-2 text-sm", children: tier.priceUnit })
468
+ ] }),
469
+ /* @__PURE__ */ jsx7(Button3, { asChild: true, variant: tier.ctaVariant === "primary" ? "default" : "secondary", className: "mt-5 w-full sm:w-auto", children: /* @__PURE__ */ jsx7("a", { href: tier.ctaHref || "#", children: tier.ctaText }) })
470
+ ] }),
471
+ /* @__PURE__ */ jsx7("div", { className: "mt-8", children: /* @__PURE__ */ jsx7("ul", { className: "space-y-2", children: tier.features.map((feature, featureIndex) => /* @__PURE__ */ jsxs4("li", { className: "flex items-start", children: [
472
+ /* @__PURE__ */ jsx7(Check2, { className: "text-primary mr-2 size-4 shrink-0" }),
473
+ /* @__PURE__ */ jsx7("span", { className: "text-foreground text-sm", children: feature.text })
474
+ ] }, featureIndex)) }) })
475
+ ] })
476
+ ] }) : /* @__PURE__ */ jsx7("div", { className: "flex h-full flex-col", children: /* @__PURE__ */ jsxs4("div", { children: [
477
+ /* @__PURE__ */ jsx7("p", { className: "text-lg font-semibold text-foreground", children: tier.title }),
478
+ /* @__PURE__ */ jsx7("p", { className: "text-muted-foreground mt-3", children: tier.description }),
479
+ /* @__PURE__ */ jsxs4("div", { className: "mt-6 flex items-baseline", children: [
480
+ /* @__PURE__ */ jsx7("span", { className: "text-3xl font-semibold text-foreground", children: tier.price }),
481
+ /* @__PURE__ */ jsx7("span", { className: "text-muted-foreground ml-2 text-sm", children: tier.priceUnit })
482
+ ] }),
483
+ /* @__PURE__ */ jsx7(Button3, { asChild: true, variant: tier.ctaVariant === "primary" ? "default" : "secondary", className: "mt-5 w-full sm:w-auto", children: /* @__PURE__ */ jsx7("a", { href: tier.ctaHref || "#", children: tier.ctaText }) }),
484
+ /* @__PURE__ */ jsx7("div", { className: "mt-8", children: /* @__PURE__ */ jsx7("ul", { className: "space-y-2", children: tier.features.map((feature, featureIndex) => /* @__PURE__ */ jsxs4("li", { className: "flex items-start", children: [
485
+ /* @__PURE__ */ jsx7(Check2, { className: "text-primary mr-2 size-4 shrink-0" }),
486
+ /* @__PURE__ */ jsx7("span", { className: "text-foreground text-sm", children: feature.text })
487
+ ] }, featureIndex)) }) })
488
+ ] }) })
489
+ }
490
+ ) }) }, index)) }),
491
+ securityNote && /* @__PURE__ */ jsx7(ScrollReveal, { direction: "up", delay: 0.4, children: /* @__PURE__ */ jsx7("div", { className: "text-center mt-8", children: /* @__PURE__ */ jsxs4("p", { className: "text-sm text-muted-foreground", children: [
492
+ /* @__PURE__ */ jsx7("strong", { children: "Your code stays private." }),
493
+ " ",
494
+ securityNote
495
+ ] }) }) })
496
+ ] }) });
497
+ }
498
+
499
+ // src/components/cta/cta.tsx
500
+ import { HiArrowRight } from "react-icons/hi";
501
+ import { Button as Button4 } from "@mdxui/primitives";
502
+ import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
503
+ var defaultButtons = [
504
+ {
505
+ text: "Get Started",
506
+ href: "#pricing",
507
+ variant: "primary",
508
+ showArrow: true
509
+ }
510
+ ];
511
+ function CTA({ heading = "Ready to Save 15 Hours Per Week?", subheading = "Setup with Github \u2013 takes 5 minutes.", buttons = defaultButtons, backgroundColor: _backgroundColor, className }) {
512
+ const bgClass = "bg-card";
513
+ return /* @__PURE__ */ jsx8("section", { className: cn(`py-20 md:py-32 px-4 md:px-6 ${bgClass}`, className), children: /* @__PURE__ */ jsx8("div", { className: "max-w-3xl mx-auto text-center", children: /* @__PURE__ */ jsx8(ScrollReveal, { direction: "up", delay: 0.1, children: /* @__PURE__ */ jsxs5("div", { className: "space-y-6", children: [
514
+ /* @__PURE__ */ jsx8("h2", { className: "font-normal text-foreground text-[clamp(32px,5vw,52px)] leading-tight tracking-tight", children: heading }),
515
+ /* @__PURE__ */ jsx8("p", { className: "max-w-2xl mx-auto text-[clamp(16px,2vw,18px)] leading-relaxed text-muted-foreground", children: subheading }),
516
+ /* @__PURE__ */ jsx8("div", { className: "flex flex-col sm:flex-row gap-3 justify-center items-center pt-4", children: buttons.map((button, index) => /* @__PURE__ */ jsx8(Button4, { asChild: true, variant: button.variant === "primary" ? "default" : "secondary", children: /* @__PURE__ */ jsxs5("a", { href: button.href, children: [
517
+ button.text,
518
+ button.showArrow && /* @__PURE__ */ jsx8(HiArrowRight, { className: "w-4 h-4" })
519
+ ] }) }, index)) })
520
+ ] }) }) }) });
521
+ }
522
+
523
+ // src/components/faq/faq.tsx
524
+ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@mdxui/primitives";
525
+ import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
526
+ var defaultFaqs = [
527
+ {
528
+ question: "How do I get started?",
529
+ answer: "Choose your plan, connect your GitHub account, and Priya starts working. Setup takes 5 minutes."
530
+ },
531
+ {
532
+ question: "Does it work with private repos?",
533
+ answer: "Yes, both plans work with private and public repositories."
534
+ },
535
+ {
536
+ question: "What if it makes a mistake?",
537
+ answer: "You can override any decision. Priya learns from your corrections."
538
+ },
539
+ {
540
+ question: "Can I switch plans later?",
541
+ answer: "Yes, upgrade or downgrade anytime. Changes take effect immediately."
542
+ },
543
+ {
544
+ question: "What about Enterprise?",
545
+ answer: "Contact us for custom solutions tailored to your organization's needs, including dedicated support, custom workflows, and enterprise-grade SLAs."
546
+ },
547
+ {
548
+ question: "Is Priya SOC 2 and HIPAA compliant?",
549
+ answer: "Yes, Priya is SOC 2 Type II certified and HIPAA compliant, ensuring your data is handled with the highest security and privacy standards."
550
+ }
551
+ ];
552
+ function FAQ({ heading = "FAQs", faqs = defaultFaqs, backgroundColor = "bg-background", className }) {
553
+ return /* @__PURE__ */ jsx9("section", { id: "faq", className: cn(`py-20 px-6 lg:px-12 ${backgroundColor}`, className), children: /* @__PURE__ */ jsxs6("div", { className: "max-w-4xl mx-auto", children: [
554
+ /* @__PURE__ */ jsx9(ScrollReveal, { direction: "up", delay: 0.1, children: /* @__PURE__ */ jsx9("div", { className: "text-center mb-12", children: /* @__PURE__ */ jsx9("h2", { className: "font-normal text-[clamp(32px,4vw,52px)] leading-tight text-foreground mb-4", children: heading }) }) }),
555
+ /* @__PURE__ */ jsx9(Accordion, { type: "single", collapsible: true, className: "space-y-4", children: faqs.map((faq, index) => /* @__PURE__ */ jsx9(ScrollReveal, { direction: "up", delay: 0.15 + index * 0.05, children: /* @__PURE__ */ jsxs6(AccordionItem, { value: `item-${index}`, className: "rounded-xl px-6 border border-border bg-card shadow-sm", children: [
556
+ /* @__PURE__ */ jsx9(AccordionTrigger, { className: "hover:no-underline py-5 text-base font-medium text-foreground", children: faq.question }),
557
+ /* @__PURE__ */ jsx9(AccordionContent, { className: "pb-5 text-sm text-muted-foreground leading-relaxed", children: faq.answer })
558
+ ] }) }, index)) })
559
+ ] }) });
560
+ }
561
+
562
+ // src/components/problem/problem.tsx
563
+ import { FaInbox, FaCalendarAlt, FaListUl, FaFileAlt, FaRocket, FaProjectDiagram, FaBug, FaLightbulb } from "react-icons/fa";
564
+ import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
565
+ var defaultWorkflows = [
566
+ { icon: FaInbox, label: "Issue triage" },
567
+ { icon: FaCalendarAlt, label: "Sprint planning" },
568
+ { icon: FaListUl, label: "Backlog grooming" },
569
+ { icon: FaFileAlt, label: "Status updates" },
570
+ { icon: FaRocket, label: "Release planning" },
571
+ { icon: FaProjectDiagram, label: "Dependency tracking" },
572
+ { icon: FaBug, label: "Bug prioritization" },
573
+ { icon: FaLightbulb, label: "Feature requests" }
574
+ ];
575
+ function Problem({
576
+ heading = "Product managers <strong>spend 15+ hours</strong> per week on busywork",
577
+ workflows = defaultWorkflows,
578
+ subheading = "What if all of that just... ",
579
+ subheadingHighlight = "happened automatically?",
580
+ highlightColor = "bg-primary/20",
581
+ marqueeDuration = "30s",
582
+ marqueeGap = "0.5rem",
583
+ backgroundColor = "bg-background",
584
+ className
585
+ }) {
586
+ return /* @__PURE__ */ jsx10("section", { id: "problem", className: cn(`py-20 md:pb-32 px-6 lg:px-12 ${backgroundColor}`, className), children: /* @__PURE__ */ jsx10("div", { className: "max-w-4xl mx-auto", children: /* @__PURE__ */ jsxs7("div", { className: "text-center space-y-8", children: [
587
+ /* @__PURE__ */ jsx10(ScrollReveal, { direction: "up", delay: 0.1, children: /* @__PURE__ */ jsx10(
588
+ "h2",
589
+ {
590
+ className: "font-normal text-[clamp(36px,4vw,40px)] leading-tight text-foreground",
591
+ dangerouslySetInnerHTML: { __html: heading }
592
+ }
593
+ ) }),
594
+ /* @__PURE__ */ jsx10(ScrollReveal, { direction: "none", delay: 0.2, children: /* @__PURE__ */ jsxs7("div", { className: "relative py-6", children: [
595
+ /* @__PURE__ */ jsx10("div", { className: "absolute left-0 top-0 bottom-0 w-32 bg-gradient-to-r from-background to-transparent z-10 pointer-events-none" }),
596
+ /* @__PURE__ */ jsx10("div", { className: "absolute right-0 top-0 bottom-0 w-32 bg-gradient-to-l from-background to-transparent z-10 pointer-events-none" }),
597
+ /* @__PURE__ */ jsx10(
598
+ Marquee,
599
+ {
600
+ className: "[--duration:30s] [--gap:0.5rem]",
601
+ style: {
602
+ "--duration": marqueeDuration,
603
+ "--gap": marqueeGap
604
+ },
605
+ children: workflows.map((workflow, index) => /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-2.5 pl-1.5 pr-3.5 py-1.5 bg-card border border-border rounded-full", children: [
606
+ /* @__PURE__ */ jsx10("div", { className: "flex items-center justify-center w-7 h-7 rounded-full bg-background", children: /* @__PURE__ */ jsx10(workflow.icon, { className: "w-3.5 h-3.5 text-foreground" }) }),
607
+ /* @__PURE__ */ jsx10("span", { className: "text-sm text-foreground whitespace-nowrap", children: workflow.label })
608
+ ] }, index))
609
+ }
610
+ )
611
+ ] }) }),
612
+ /* @__PURE__ */ jsx10(ScrollReveal, { direction: "up", delay: 0.3, children: /* @__PURE__ */ jsx10("div", { className: "pt-2 md:pt-4", children: /* @__PURE__ */ jsxs7("h3", { className: "font-normal text-[clamp(26px,3.5vw,32px)] leading-tight text-foreground", children: [
613
+ subheading,
614
+ /* @__PURE__ */ jsxs7("span", { className: "relative inline-block", children: [
615
+ /* @__PURE__ */ jsx10("span", { className: "relative z-10", children: subheadingHighlight }),
616
+ /* @__PURE__ */ jsx10("span", { className: `absolute bottom-1 left-0 w-full h-3 ${highlightColor} opacity-30 -rotate-1` })
617
+ ] })
618
+ ] }) }) })
619
+ ] }) }) });
620
+ }
621
+
622
+ // src/components/contact/contact.tsx
623
+ import { useState } from "react";
624
+ import { Button as Button5, Input, Label, Textarea } from "@mdxui/primitives";
625
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
626
+ var defaultFields = [
627
+ {
628
+ id: "name",
629
+ label: "Name",
630
+ type: "text",
631
+ required: true
632
+ },
633
+ {
634
+ id: "email",
635
+ label: "Company Email",
636
+ type: "email",
637
+ required: true
638
+ },
639
+ {
640
+ id: "message",
641
+ label: "Message",
642
+ type: "textarea",
643
+ placeholder: "Tell us about your use case, team size, or any other questions you may have.",
644
+ required: true
645
+ }
646
+ ];
647
+ function Contact({
648
+ heading = "Get in touch",
649
+ subheading = "Have questions about use cases, pricing, or anything else? Let's chat!",
650
+ fields = defaultFields,
651
+ submitButtonText = "Submit",
652
+ successMessage = "Thanks for reaching out! I'll get back to you within 24 hours.",
653
+ errorMessage = "Hmm, something went wrong. Mind trying again?",
654
+ onSubmit,
655
+ backgroundColor = "bg-background",
656
+ className
657
+ }) {
658
+ const [isSubmitting, setIsSubmitting] = useState(false);
659
+ const [formData, setFormData] = useState({});
660
+ const [submitStatus, setSubmitStatus] = useState("idle");
661
+ const handleSubmit = async (e) => {
662
+ e.preventDefault();
663
+ setIsSubmitting(true);
664
+ setSubmitStatus("idle");
665
+ try {
666
+ if (onSubmit) {
667
+ await onSubmit(formData);
668
+ }
669
+ setSubmitStatus("success");
670
+ setFormData({});
671
+ e.target.reset();
672
+ } catch {
673
+ setSubmitStatus("error");
674
+ } finally {
675
+ setIsSubmitting(false);
676
+ }
677
+ };
678
+ const handleChange = (e) => {
679
+ setFormData((prev) => ({
680
+ ...prev,
681
+ [e.target.id]: e.target.value
682
+ }));
683
+ };
684
+ return /* @__PURE__ */ jsx11("section", { className: cn(`relative py-12 md:py-32 px-6 lg:px-12 ${backgroundColor}`, className), children: /* @__PURE__ */ jsxs8("div", { className: "max-w-3xl mx-auto", children: [
685
+ /* @__PURE__ */ jsx11(ScrollReveal, { direction: "up", delay: 0.1, children: /* @__PURE__ */ jsxs8("div", { className: "mb-14 text-center", children: [
686
+ /* @__PURE__ */ jsx11("h1", { className: "font-normal text-[clamp(32px,4vw,40px)] leading-tight text-foreground mb-4", children: heading }),
687
+ /* @__PURE__ */ jsx11("p", { className: "text-base text-muted-foreground max-w-2xl mx-auto", children: subheading })
688
+ ] }) }),
689
+ /* @__PURE__ */ jsx11(ScrollReveal, { direction: "up", delay: 0.2, children: /* @__PURE__ */ jsxs8(
690
+ "form",
691
+ {
692
+ onSubmit: handleSubmit,
693
+ className: "mx-auto flex max-w-lg flex-col gap-6 bg-card p-6 md:p-8 rounded-3xl border border-border feature-card-shadow",
694
+ children: [
695
+ fields.map((field) => /* @__PURE__ */ jsxs8("div", { className: "grid w-full items-center gap-2", children: [
696
+ /* @__PURE__ */ jsxs8(Label, { htmlFor: field.id, className: "text-foreground", children: [
697
+ field.label,
698
+ field.required && /* @__PURE__ */ jsx11("span", { className: "text-destructive ml-1", children: "*" })
699
+ ] }),
700
+ field.type === "textarea" ? /* @__PURE__ */ jsx11(Textarea, { id: field.id, placeholder: field.placeholder, required: field.required, onChange: handleChange, className: "min-h-[120px]" }) : /* @__PURE__ */ jsx11(Input, { type: field.type, id: field.id, placeholder: field.placeholder, required: field.required, onChange: handleChange })
701
+ ] }, field.id)),
702
+ /* @__PURE__ */ jsx11(Button5, { type: "submit", className: "w-full", disabled: isSubmitting, children: isSubmitting ? "Submitting..." : submitButtonText }),
703
+ submitStatus === "success" && /* @__PURE__ */ jsx11("p", { className: "text-primary text-sm text-center", children: successMessage }),
704
+ submitStatus === "error" && /* @__PURE__ */ jsx11("p", { className: "text-destructive text-sm text-center", children: errorMessage })
705
+ ]
706
+ }
707
+ ) })
708
+ ] }) });
709
+ }
710
+
711
+ // src/components/integration/integration.tsx
712
+ import { forwardRef, useRef, useEffect as useEffect2, useState as useState3 } from "react";
713
+
714
+ // src/shared/animated-beam/animated-beam.tsx
715
+ import { useEffect, useId, useState as useState2 } from "react";
716
+ import { motion as motion2 } from "motion/react";
717
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
718
+ function AnimatedBeam({
719
+ className,
720
+ containerRef,
721
+ fromRef,
722
+ toRef,
723
+ curvature = 0,
724
+ reverse = false,
725
+ duration = Math.random() * 3 + 4,
726
+ delay = 0,
727
+ pathColor = "gray",
728
+ pathWidth = 2,
729
+ pathOpacity = 0.2,
730
+ gradientStartColor = "#ffaa40",
731
+ gradientStopColor = "#9c40ff",
732
+ startXOffset = 0,
733
+ startYOffset = 0,
734
+ endXOffset = 0,
735
+ endYOffset = 0
736
+ }) {
737
+ const id = useId();
738
+ const [pathD, setPathD] = useState2("");
739
+ const [svgDimensions, setSvgDimensions] = useState2({ width: 0, height: 0 });
740
+ const gradientCoordinates = reverse ? {
741
+ x1: ["90%", "-10%"],
742
+ x2: ["100%", "0%"],
743
+ y1: ["0%", "0%"],
744
+ y2: ["0%", "0%"]
745
+ } : {
746
+ x1: ["10%", "110%"],
747
+ x2: ["0%", "100%"],
748
+ y1: ["0%", "0%"],
749
+ y2: ["0%", "0%"]
750
+ };
751
+ useEffect(() => {
752
+ const updatePath = () => {
753
+ if (containerRef.current && fromRef.current && toRef.current) {
754
+ const containerRect = containerRef.current.getBoundingClientRect();
755
+ const rectA = fromRef.current.getBoundingClientRect();
756
+ const rectB = toRef.current.getBoundingClientRect();
757
+ const svgWidth = containerRect.width;
758
+ const svgHeight = containerRect.height;
759
+ setSvgDimensions({ width: svgWidth, height: svgHeight });
760
+ const startX = rectA.left - containerRect.left + rectA.width / 2 + startXOffset;
761
+ const startY = rectA.top - containerRect.top + rectA.height / 2 + startYOffset;
762
+ const endX = rectB.left - containerRect.left + rectB.width / 2 + endXOffset;
763
+ const endY = rectB.top - containerRect.top + rectB.height / 2 + endYOffset;
764
+ const controlY = startY - curvature;
765
+ const d = `M ${startX},${startY} Q ${(startX + endX) / 2},${controlY} ${endX},${endY}`;
766
+ setPathD(d);
767
+ }
768
+ };
769
+ const resizeObserver = new ResizeObserver(() => {
770
+ updatePath();
771
+ });
772
+ if (containerRef.current) {
773
+ resizeObserver.observe(containerRef.current);
774
+ }
775
+ updatePath();
776
+ return () => {
777
+ resizeObserver.disconnect();
778
+ };
779
+ }, [containerRef, fromRef, toRef, curvature, startXOffset, startYOffset, endXOffset, endYOffset]);
780
+ return /* @__PURE__ */ jsxs9(
781
+ "svg",
782
+ {
783
+ fill: "none",
784
+ width: svgDimensions.width,
785
+ height: svgDimensions.height,
786
+ xmlns: "http://www.w3.org/2000/svg",
787
+ className: cn("pointer-events-none absolute top-0 left-0 transform-gpu stroke-2", className),
788
+ viewBox: `0 0 ${svgDimensions.width} ${svgDimensions.height}`,
789
+ children: [
790
+ /* @__PURE__ */ jsx12("path", { d: pathD, stroke: pathColor, strokeWidth: pathWidth, strokeOpacity: pathOpacity, strokeLinecap: "round" }),
791
+ /* @__PURE__ */ jsx12("path", { d: pathD, strokeWidth: pathWidth, stroke: `url(#${id})`, strokeOpacity: "1", strokeLinecap: "round" }),
792
+ /* @__PURE__ */ jsx12("defs", { children: /* @__PURE__ */ jsxs9(
793
+ motion2.linearGradient,
794
+ {
795
+ className: "transform-gpu",
796
+ id,
797
+ gradientUnits: "userSpaceOnUse",
798
+ initial: {
799
+ x1: "0%",
800
+ x2: "0%",
801
+ y1: "0%",
802
+ y2: "0%"
803
+ },
804
+ animate: {
805
+ x1: gradientCoordinates.x1,
806
+ x2: gradientCoordinates.x2,
807
+ y1: gradientCoordinates.y1,
808
+ y2: gradientCoordinates.y2
809
+ },
810
+ transition: {
811
+ delay,
812
+ duration,
813
+ ease: [0.16, 1, 0.3, 1],
814
+ repeat: Infinity,
815
+ repeatDelay: 0
816
+ },
817
+ children: [
818
+ /* @__PURE__ */ jsx12("stop", { stopColor: gradientStartColor, stopOpacity: "0" }),
819
+ /* @__PURE__ */ jsx12("stop", { stopColor: gradientStartColor }),
820
+ /* @__PURE__ */ jsx12("stop", { offset: "32.5%", stopColor: gradientStopColor }),
821
+ /* @__PURE__ */ jsx12("stop", { offset: "100%", stopColor: gradientStopColor, stopOpacity: "0" })
822
+ ]
823
+ }
824
+ ) })
825
+ ]
826
+ }
827
+ );
828
+ }
829
+
830
+ // src/shared/grid-pattern/grid-pattern.tsx
831
+ import { useId as useId2 } from "react";
832
+ import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
833
+ function GridPattern({
834
+ width = 40,
835
+ height = 40,
836
+ x = -1,
837
+ y = -1,
838
+ strokeDasharray = "0",
839
+ squares,
840
+ className,
841
+ ...props
842
+ }) {
843
+ const id = useId2();
844
+ return /* @__PURE__ */ jsxs10(
845
+ "svg",
846
+ {
847
+ "aria-hidden": "true",
848
+ className: cn("pointer-events-none absolute inset-0 h-full w-full fill-muted-foreground/20 stroke-muted-foreground/20", className),
849
+ ...props,
850
+ children: [
851
+ /* @__PURE__ */ jsx13("defs", { children: /* @__PURE__ */ jsx13("pattern", { id, width, height, patternUnits: "userSpaceOnUse", x, y, children: /* @__PURE__ */ jsx13("path", { d: `M.5 ${height}V.5H${width}`, fill: "none", strokeDasharray }) }) }),
852
+ /* @__PURE__ */ jsx13("rect", { width: "100%", height: "100%", strokeWidth: 0, fill: `url(#${id})` }),
853
+ squares && /* @__PURE__ */ jsx13("svg", { x, y, className: "overflow-visible", children: squares.map(([sx, sy]) => /* @__PURE__ */ jsx13("rect", { strokeWidth: "0", width: width - 1, height: height - 1, x: sx * width + 1, y: sy * height + 1 }, `${sx}-${sy}`)) })
854
+ ]
855
+ }
856
+ );
857
+ }
858
+
859
+ // src/components/integration/integration.tsx
860
+ import Image3 from "next/image";
861
+ import { Button as Button6 } from "@mdxui/primitives";
862
+ import { Fragment as Fragment2, jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
863
+ var Square = forwardRef(({ className, children }, ref) => {
864
+ return /* @__PURE__ */ jsx14(
865
+ "div",
866
+ {
867
+ ref,
868
+ className: cn("z-10 flex size-16 items-center justify-center rounded-lg bg-card border border-border p-3 integration-square-shadow", className),
869
+ children
870
+ }
871
+ );
872
+ });
873
+ Square.displayName = "Square";
874
+ function Integration({
875
+ title = "Connect in Seconds",
876
+ description = "Just connect your account and get started immediately \u2013 no configuration, no setup, no hassle.",
877
+ buttonText = "Get Started",
878
+ buttonHref = "#pricing",
879
+ leftNode,
880
+ rightNode,
881
+ beamAnimations = [
882
+ { startYOffset: 10, endYOffset: 10, curvature: -20, duration: 3 },
883
+ { startYOffset: -10, endYOffset: -10, curvature: 20, duration: 3, reverse: true }
884
+ ],
885
+ gridPatternWidth = 30,
886
+ gridPatternHeight = 30,
887
+ maxWidth = "5xl",
888
+ className,
889
+ contentOrder = "left"
890
+ }) {
891
+ const containerRef = useRef(null);
892
+ const leftRef = useRef(null);
893
+ const rightRef = useRef(null);
894
+ const [isDark, setIsDark] = useState3(false);
895
+ useEffect2(() => {
896
+ const checkDarkMode = () => {
897
+ const isDarkMode = document.documentElement.classList.contains("dark") || window.matchMedia("(prefers-color-scheme: dark)").matches;
898
+ setIsDark(isDarkMode);
899
+ };
900
+ checkDarkMode();
901
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
902
+ const observer = new MutationObserver(checkDarkMode);
903
+ mediaQuery.addEventListener("change", checkDarkMode);
904
+ observer.observe(document.documentElement, {
905
+ attributes: true,
906
+ attributeFilter: ["class"]
907
+ });
908
+ return () => {
909
+ mediaQuery.removeEventListener("change", checkDarkMode);
910
+ observer.disconnect();
911
+ };
912
+ }, []);
913
+ const renderNode = (node, ref) => {
914
+ const squareContent = (() => {
915
+ if (node.type === "image" && typeof node.content === "string") {
916
+ return /* @__PURE__ */ jsx14("div", { className: "relative w-full h-full", children: /* @__PURE__ */ jsx14(Image3, { src: node.content, alt: node.alt || "Integration", fill: true, className: "object-cover rounded-lg" }) });
917
+ }
918
+ if (node.type === "icon" && typeof node.content === "string") {
919
+ return /* @__PURE__ */ jsx14("div", { className: cn("text-foreground", node.className), children: node.content });
920
+ }
921
+ return node.content;
922
+ })();
923
+ return /* @__PURE__ */ jsx14(Square, { ref, className: cn("size-20", node.type === "image" ? "p-0" : "", node.className), children: squareContent });
924
+ };
925
+ const maxWidthClasses = {
926
+ sm: "max-w-sm",
927
+ md: "max-w-md",
928
+ lg: "max-w-lg",
929
+ xl: "max-w-xl",
930
+ "2xl": "max-w-2xl",
931
+ "3xl": "max-w-3xl",
932
+ "4xl": "max-w-4xl",
933
+ "5xl": "max-w-5xl",
934
+ "6xl": "max-w-6xl",
935
+ "7xl": "max-w-7xl"
936
+ };
937
+ const content = /* @__PURE__ */ jsxs11("div", { className: "space-y-6", children: [
938
+ /* @__PURE__ */ jsx14(ScrollReveal, { direction: "up", delay: 0.1, children: /* @__PURE__ */ jsx14("h2", { className: "font-normal text-[clamp(32px,4vw,40px)] leading-tight text-foreground", children: title }) }),
939
+ /* @__PURE__ */ jsx14(ScrollReveal, { direction: "up", delay: 0.2, children: /* @__PURE__ */ jsx14("p", { className: "text-base text-muted-foreground max-w-lg", children: description }) }),
940
+ buttonText && buttonHref && /* @__PURE__ */ jsx14(ScrollReveal, { direction: "up", delay: 0.3, children: /* @__PURE__ */ jsx14(Button6, { asChild: true, variant: "default", children: /* @__PURE__ */ jsx14("a", { href: buttonHref, children: buttonText }) }) })
941
+ ] });
942
+ const animation = /* @__PURE__ */ jsx14(ScrollReveal, { direction: contentOrder === "left" ? "right" : "left", delay: 0.2, children: /* @__PURE__ */ jsxs11("div", { className: "relative flex aspect-square max-w-md mx-auto w-full items-center justify-center overflow-hidden rounded-lg", ref: containerRef, children: [
943
+ /* @__PURE__ */ jsx14(
944
+ GridPattern,
945
+ {
946
+ width: gridPatternWidth,
947
+ height: gridPatternHeight,
948
+ className: "opacity-30 mask-[radial-gradient(ellipse_at_center,black_40%,transparent_85%)] dark:mask-[radial-gradient(ellipse_at_center,white_40%,transparent_85%)]"
949
+ }
950
+ ),
951
+ /* @__PURE__ */ jsxs11("div", { className: "flex size-full flex-row items-center justify-center gap-20 relative z-10", children: [
952
+ /* @__PURE__ */ jsx14("div", { className: "flex flex-col justify-center", children: renderNode(leftNode, leftRef) }),
953
+ /* @__PURE__ */ jsx14("div", { className: "flex flex-col justify-center", children: renderNode(rightNode, rightRef) })
954
+ ] }),
955
+ beamAnimations.map((config, index) => /* @__PURE__ */ jsx14(
956
+ AnimatedBeam,
957
+ {
958
+ containerRef,
959
+ fromRef: leftRef,
960
+ toRef: rightRef,
961
+ startYOffset: config.startYOffset,
962
+ endYOffset: config.endYOffset,
963
+ curvature: config.curvature,
964
+ duration: config.duration,
965
+ reverse: config.reverse,
966
+ pathColor: isDark ? "rgba(255, 255, 255, 0.2)" : "rgba(0, 0, 0, 0.2)"
967
+ },
968
+ index
969
+ ))
970
+ ] }) });
971
+ return /* @__PURE__ */ jsx14("section", { className: cn("pt-10 sm:pt-0 px-8 lg:px-24 bg-background", className), children: /* @__PURE__ */ jsx14("div", { className: cn(maxWidthClasses[maxWidth], "mx-auto"), children: /* @__PURE__ */ jsx14("div", { className: "grid lg:grid-cols-2 gap-1 items-center", children: contentOrder === "left" ? /* @__PURE__ */ jsxs11(Fragment2, { children: [
972
+ content,
973
+ animation
974
+ ] }) : /* @__PURE__ */ jsxs11(Fragment2, { children: [
975
+ animation,
976
+ content
977
+ ] }) }) }) });
978
+ }
979
+
980
+ // src/view/mapper.ts
981
+ import {
982
+ FaInbox as FaInbox2,
983
+ FaCalendarAlt as FaCalendarAlt2,
984
+ FaListUl as FaListUl2,
985
+ FaFileAlt as FaFileAlt2,
986
+ FaRocket as FaRocket2,
987
+ FaProjectDiagram as FaProjectDiagram2,
988
+ FaBug as FaBug2,
989
+ FaLightbulb as FaLightbulb2,
990
+ FaRegDotCircle
991
+ } from "react-icons/fa";
992
+ var WORKFLOW_ICONS = {
993
+ inbox: FaInbox2,
994
+ calendar: FaCalendarAlt2,
995
+ list: FaListUl2,
996
+ file: FaFileAlt2,
997
+ rocket: FaRocket2,
998
+ project: FaProjectDiagram2,
999
+ bug: FaBug2,
1000
+ lightbulb: FaLightbulb2
1001
+ };
1002
+ function resolveWorkflowIcon(hint) {
1003
+ return WORKFLOW_ICONS[hint] ?? FaRegDotCircle;
1004
+ }
1005
+ function mapWorkflows(workflows) {
1006
+ return workflows.map((w) => ({ icon: resolveWorkflowIcon(w.icon), label: w.label }));
1007
+ }
1008
+
1009
+ // src/view/view.tsx
1010
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
1011
+ function NamedAgentView({ content, theme, mode, brandName, hostname }) {
1012
+ const { hero, problem, features, integration, pricing, faq, cta, contact } = content;
1013
+ return /* @__PURE__ */ jsx15(Site, { theme, mode, children: /* @__PURE__ */ jsxs12("div", { className: "relative min-h-screen bg-background text-foreground antialiased", children: [
1014
+ /* @__PURE__ */ jsx15(NoiseTexture, { fixed: true }),
1015
+ /* @__PURE__ */ jsx15(
1016
+ Navbar17,
1017
+ {
1018
+ logo: { url: "/", src: "", alt: brandName, title: brandName },
1019
+ primaryCta: { text: hero.ctaText, url: hero.ctaHref }
1020
+ }
1021
+ ),
1022
+ /* @__PURE__ */ jsx15(
1023
+ Hero,
1024
+ {
1025
+ badgeEmoji: hero.badgeEmoji,
1026
+ badgeText: hero.badgeText,
1027
+ badgeHref: hero.badgeHref,
1028
+ heading: hero.heading,
1029
+ description: hero.description,
1030
+ ctaText: hero.ctaText,
1031
+ ctaHref: hero.ctaHref,
1032
+ rightImageSrc: hero.rightImageSrc,
1033
+ rightImageAlt: hero.rightImageAlt,
1034
+ showIconOverlay: hero.showIconOverlay,
1035
+ marqueeTitle: hero.marqueeTitle,
1036
+ marqueeImages: hero.marqueeImages
1037
+ }
1038
+ ),
1039
+ /* @__PURE__ */ jsx15(
1040
+ Problem,
1041
+ {
1042
+ heading: problem.heading,
1043
+ workflows: mapWorkflows(problem.workflows),
1044
+ subheading: problem.subheading,
1045
+ subheadingHighlight: problem.subheadingHighlight
1046
+ }
1047
+ ),
1048
+ /* @__PURE__ */ jsx15(
1049
+ Features,
1050
+ {
1051
+ heading: features.heading,
1052
+ description: features.description,
1053
+ features: features.features
1054
+ }
1055
+ ),
1056
+ integration && /* @__PURE__ */ jsx15(
1057
+ Integration,
1058
+ {
1059
+ title: integration.title,
1060
+ description: integration.description,
1061
+ buttonText: integration.buttonText,
1062
+ buttonHref: integration.buttonHref,
1063
+ leftNode: integration.leftNode,
1064
+ rightNode: integration.rightNode
1065
+ }
1066
+ ),
1067
+ pricing.variant === "single" ? /* @__PURE__ */ jsx15(
1068
+ Pricing,
1069
+ {
1070
+ heading: pricing.heading,
1071
+ subheading: pricing.subheading,
1072
+ price: pricing.price,
1073
+ priceUnit: pricing.priceUnit,
1074
+ trialText: pricing.trialText,
1075
+ ctaText: pricing.ctaText,
1076
+ ctaHref: pricing.ctaHref,
1077
+ featuresHeading: pricing.featuresHeading,
1078
+ features: pricing.features,
1079
+ securityNote: pricing.securityNote
1080
+ }
1081
+ ) : /* @__PURE__ */ jsx15(
1082
+ PricingTiers,
1083
+ {
1084
+ heading: pricing.heading,
1085
+ subheading: pricing.subheading,
1086
+ tiers: pricing.tiers,
1087
+ securityNote: pricing.securityNote
1088
+ }
1089
+ ),
1090
+ /* @__PURE__ */ jsx15(FAQ, { heading: faq.heading, faqs: faq.faqs }),
1091
+ /* @__PURE__ */ jsx15(CTA, { heading: cta.heading, subheading: cta.subheading, buttons: cta.buttons }),
1092
+ contact && /* @__PURE__ */ jsx15(
1093
+ Contact,
1094
+ {
1095
+ heading: contact.heading,
1096
+ subheading: contact.subheading,
1097
+ fields: contact.fields,
1098
+ submitButtonText: contact.submitButtonText
1099
+ }
1100
+ ),
1101
+ /* @__PURE__ */ jsx15(
1102
+ FooterSmall,
1103
+ {
1104
+ logo: brandName,
1105
+ domain: hostname,
1106
+ showOpenInAI: true,
1107
+ openInAIVariant: "dropdown",
1108
+ openInAIDefaultPrompt: `Help me decide whether ${brandName} fits my team's workflow`,
1109
+ pageTitle: brandName
1110
+ }
1111
+ )
1112
+ ] }) });
1113
+ }
1114
+ var view_default = NamedAgentView;
1115
+ export {
1116
+ NamedAgentView,
1117
+ view_default as default,
1118
+ mapWorkflows,
1119
+ resolveWorkflowIcon
1120
+ };
1121
+ //# sourceMappingURL=index.js.map