@victusvinceere/saas-landing 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -37,7 +37,9 @@ __export(components_exports, {
37
37
  Footer: () => Footer,
38
38
  Hero: () => Hero,
39
39
  Navbar: () => Navbar,
40
- Pricing: () => Pricing
40
+ Pricing: () => Pricing,
41
+ Testimonials: () => Testimonials,
42
+ Waitlist: () => Waitlist
41
43
  });
42
44
  module.exports = __toCommonJS(components_exports);
43
45
 
@@ -431,6 +433,259 @@ function Navbar({
431
433
  }
432
434
  );
433
435
  }
436
+
437
+ // src/components/testimonials.tsx
438
+ var import_jsx_runtime8 = require("react/jsx-runtime");
439
+ function Testimonials({
440
+ title = "What Our Customers Say",
441
+ subtitle,
442
+ testimonials,
443
+ className = ""
444
+ }) {
445
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
446
+ "section",
447
+ {
448
+ id: "testimonials",
449
+ className: `py-20 sm:py-32 bg-muted/50 ${className}`,
450
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "container", children: [
451
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "mx-auto max-w-2xl text-center mb-12", children: [
452
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h2", { className: "text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
453
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "mt-4 text-lg text-muted-foreground", children: subtitle })
454
+ ] }),
455
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "mx-auto grid max-w-6xl gap-8 sm:grid-cols-2 lg:grid-cols-3", children: testimonials.map((testimonial, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
456
+ "div",
457
+ {
458
+ className: "flex flex-col rounded-2xl bg-background p-6 shadow-sm border",
459
+ children: [
460
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("blockquote", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { className: "text-muted-foreground leading-relaxed", children: [
461
+ '"',
462
+ testimonial.quote,
463
+ '"'
464
+ ] }) }),
465
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "mt-6 flex items-center gap-4", children: [
466
+ testimonial.image ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
467
+ "img",
468
+ {
469
+ src: testimonial.image,
470
+ alt: testimonial.author,
471
+ className: "h-12 w-12 rounded-full object-cover"
472
+ }
473
+ ) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
474
+ "div",
475
+ {
476
+ className: `flex h-12 w-12 items-center justify-center rounded-full bg-gradient-to-br ${testimonial.color || "from-primary to-primary/80"} text-primary-foreground font-bold text-lg`,
477
+ children: testimonial.initial || testimonial.author[0]
478
+ }
479
+ ),
480
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { children: [
481
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "font-semibold", children: testimonial.author }),
482
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { className: "text-sm text-muted-foreground", children: [
483
+ testimonial.role,
484
+ testimonial.company && ` \xB7 ${testimonial.company}`
485
+ ] })
486
+ ] })
487
+ ] })
488
+ ]
489
+ },
490
+ index
491
+ )) })
492
+ ] })
493
+ }
494
+ );
495
+ }
496
+
497
+ // src/components/waitlist.tsx
498
+ var import_react3 = require("react");
499
+ var import_jsx_runtime9 = require("react/jsx-runtime");
500
+ var defaultBusinessTypes = [
501
+ { value: "startup", label: "Startup" },
502
+ { value: "small_business", label: "Small Business" },
503
+ { value: "enterprise", label: "Enterprise" },
504
+ { value: "agency", label: "Agency" },
505
+ { value: "freelancer", label: "Freelancer" },
506
+ { value: "other", label: "Other" }
507
+ ];
508
+ function Waitlist({
509
+ endpoint = "/api/waitlist",
510
+ title = "Join the Waitlist",
511
+ description = "Be the first to know when we launch.",
512
+ badge = "Early Access",
513
+ submitText = "Join Waitlist",
514
+ successMessage = "You're on the list! We'll notify you when we launch.",
515
+ showBusinessType = true,
516
+ businessTypes = defaultBusinessTypes,
517
+ tracking,
518
+ additionalData,
519
+ className = ""
520
+ }) {
521
+ const [email, setEmail] = (0, import_react3.useState)("");
522
+ const [name, setName] = (0, import_react3.useState)("");
523
+ const [businessType, setBusinessType] = (0, import_react3.useState)("");
524
+ const [loading, setLoading] = (0, import_react3.useState)(false);
525
+ const [message, setMessage] = (0, import_react3.useState)("");
526
+ const [success, setSuccess] = (0, import_react3.useState)(false);
527
+ const formStarted = (0, import_react3.useRef)(false);
528
+ const handleFormStart = () => {
529
+ if (!formStarted.current) {
530
+ formStarted.current = true;
531
+ tracking?.onFormStart?.();
532
+ }
533
+ };
534
+ const handleSubmit = async (e) => {
535
+ e.preventDefault();
536
+ setLoading(true);
537
+ setMessage("");
538
+ try {
539
+ const response = await fetch(endpoint, {
540
+ method: "POST",
541
+ headers: {
542
+ "Content-Type": "application/json"
543
+ },
544
+ body: JSON.stringify({
545
+ email,
546
+ name,
547
+ businessType,
548
+ ...additionalData
549
+ })
550
+ });
551
+ const data = await response.json();
552
+ if (data.error) {
553
+ setMessage(data.error);
554
+ tracking?.onSubmit?.(false);
555
+ } else {
556
+ setSuccess(true);
557
+ setMessage(successMessage);
558
+ tracking?.onSubmit?.(true, businessType);
559
+ }
560
+ } catch {
561
+ setMessage("Something went wrong. Please try again.");
562
+ tracking?.onSubmit?.(false);
563
+ } finally {
564
+ setLoading(false);
565
+ }
566
+ };
567
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("section", { id: "waitlist", className: `py-20 sm:py-32 ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "container", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "mx-auto max-w-2xl", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "rounded-2xl border-2 border-primary/20 bg-gradient-to-br from-background to-primary/5 p-8 sm:p-12 shadow-xl", children: [
568
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "text-center mb-8", children: [
569
+ badge && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "inline-flex items-center rounded-full bg-primary/10 px-4 py-1.5 text-sm font-medium text-primary mb-4", children: badge }),
570
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h2", { className: "text-3xl font-bold tracking-tight sm:text-4xl", children: title }),
571
+ description && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "mt-4 text-lg text-muted-foreground", children: description })
572
+ ] }),
573
+ !success ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
574
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { children: [
575
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
576
+ "label",
577
+ {
578
+ htmlFor: "waitlist-name",
579
+ className: "block text-sm font-medium mb-2",
580
+ children: "Your Name *"
581
+ }
582
+ ),
583
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
584
+ "input",
585
+ {
586
+ id: "waitlist-name",
587
+ type: "text",
588
+ placeholder: "John Smith",
589
+ value: name,
590
+ onChange: (e) => setName(e.target.value),
591
+ onFocus: () => {
592
+ handleFormStart();
593
+ tracking?.onFieldFocus?.("name");
594
+ },
595
+ required: true,
596
+ className: "w-full rounded-lg border border-input bg-background px-4 py-3 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
597
+ }
598
+ )
599
+ ] }),
600
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { children: [
601
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
602
+ "label",
603
+ {
604
+ htmlFor: "waitlist-email",
605
+ className: "block text-sm font-medium mb-2",
606
+ children: "Email Address *"
607
+ }
608
+ ),
609
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
610
+ "input",
611
+ {
612
+ id: "waitlist-email",
613
+ type: "email",
614
+ placeholder: "john@company.com",
615
+ value: email,
616
+ onChange: (e) => setEmail(e.target.value),
617
+ onFocus: () => {
618
+ handleFormStart();
619
+ tracking?.onFieldFocus?.("email");
620
+ },
621
+ required: true,
622
+ className: "w-full rounded-lg border border-input bg-background px-4 py-3 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring"
623
+ }
624
+ )
625
+ ] }),
626
+ showBusinessType && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { children: [
627
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
628
+ "label",
629
+ {
630
+ htmlFor: "waitlist-businessType",
631
+ className: "block text-sm font-medium mb-2",
632
+ children: "Business Type *"
633
+ }
634
+ ),
635
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
636
+ "select",
637
+ {
638
+ id: "waitlist-businessType",
639
+ value: businessType,
640
+ onChange: (e) => setBusinessType(e.target.value),
641
+ onFocus: () => {
642
+ handleFormStart();
643
+ tracking?.onFieldFocus?.("businessType");
644
+ },
645
+ required: true,
646
+ className: "w-full rounded-lg border border-input bg-background px-4 py-3 text-sm ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring",
647
+ children: [
648
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: "", children: "Select your business type" }),
649
+ businessTypes.map((type) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("option", { value: type.value, children: type.label }, type.value))
650
+ ]
651
+ }
652
+ )
653
+ ] }),
654
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
655
+ "button",
656
+ {
657
+ type: "submit",
658
+ disabled: loading,
659
+ className: "w-full rounded-lg bg-primary px-4 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90 focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50 disabled:cursor-not-allowed",
660
+ children: loading ? "Joining..." : submitText
661
+ }
662
+ ),
663
+ message && !success && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-sm text-destructive text-center", children: message })
664
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "text-center py-8", children: [
665
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
666
+ "svg",
667
+ {
668
+ className: "h-8 w-8 text-primary",
669
+ fill: "none",
670
+ viewBox: "0 0 24 24",
671
+ stroke: "currentColor",
672
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
673
+ "path",
674
+ {
675
+ strokeLinecap: "round",
676
+ strokeLinejoin: "round",
677
+ strokeWidth: 2,
678
+ d: "M5 13l4 4L19 7"
679
+ }
680
+ )
681
+ }
682
+ ) }),
683
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h3", { className: "text-2xl font-bold mb-2", children: "You're on the list!" }),
684
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-muted-foreground", children: message })
685
+ ] }),
686
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "mt-6 text-center text-sm text-muted-foreground", children: "Your data is 100% secure and never shared." })
687
+ ] }) }) }) });
688
+ }
434
689
  // Annotate the CommonJS export names for ESM import in node:
435
690
  0 && (module.exports = {
436
691
  Cta,
@@ -439,6 +694,8 @@ function Navbar({
439
694
  Footer,
440
695
  Hero,
441
696
  Navbar,
442
- Pricing
697
+ Pricing,
698
+ Testimonials,
699
+ Waitlist
443
700
  });
444
701
  //# sourceMappingURL=index.js.map
@@ -1 +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"]}
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","../../src/components/testimonials.tsx","../../src/components/waitlist.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\nexport { Testimonials } from \"./testimonials\";\nexport type { TestimonialsProps, Testimonial } from \"./testimonials\";\n\nexport { Waitlist } from \"./waitlist\";\nexport type { WaitlistProps } from \"./waitlist\";\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","\"use client\";\n\nexport interface Testimonial {\n quote: string;\n author: string;\n role: string;\n company?: string;\n initial?: string;\n image?: string;\n color?: string;\n}\n\nexport interface TestimonialsProps {\n title?: string;\n subtitle?: string;\n testimonials: Testimonial[];\n className?: string;\n}\n\nexport function Testimonials({\n title = \"What Our Customers Say\",\n subtitle,\n testimonials,\n className = \"\",\n}: TestimonialsProps) {\n return (\n <section\n id=\"testimonials\"\n className={`py-20 sm:py-32 bg-muted/50 ${className}`}\n >\n <div className=\"container\">\n <div className=\"mx-auto max-w-2xl text-center mb-12\">\n <h2 className=\"text-3xl font-bold tracking-tight sm:text-4xl\">\n {title}\n </h2>\n {subtitle && (\n <p className=\"mt-4 text-lg text-muted-foreground\">{subtitle}</p>\n )}\n </div>\n\n <div className=\"mx-auto grid max-w-6xl gap-8 sm:grid-cols-2 lg:grid-cols-3\">\n {testimonials.map((testimonial, index) => (\n <div\n key={index}\n className=\"flex flex-col rounded-2xl bg-background p-6 shadow-sm border\"\n >\n <blockquote className=\"flex-1\">\n <p className=\"text-muted-foreground leading-relaxed\">\n \"{testimonial.quote}\"\n </p>\n </blockquote>\n <div className=\"mt-6 flex items-center gap-4\">\n {testimonial.image ? (\n <img\n src={testimonial.image}\n alt={testimonial.author}\n className=\"h-12 w-12 rounded-full object-cover\"\n />\n ) : (\n <div\n className={`flex h-12 w-12 items-center justify-center rounded-full bg-gradient-to-br ${\n testimonial.color || \"from-primary to-primary/80\"\n } text-primary-foreground font-bold text-lg`}\n >\n {testimonial.initial || testimonial.author[0]}\n </div>\n )}\n <div>\n <p className=\"font-semibold\">{testimonial.author}</p>\n <p className=\"text-sm text-muted-foreground\">\n {testimonial.role}\n {testimonial.company && ` · ${testimonial.company}`}\n </p>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport { useState, useRef } from \"react\";\n\nexport interface WaitlistProps {\n /** API endpoint for waitlist signup */\n endpoint?: string;\n /** Section title */\n title?: string;\n /** Section description */\n description?: React.ReactNode;\n /** Badge text */\n badge?: string;\n /** Submit button text */\n submitText?: string;\n /** Success message */\n successMessage?: string;\n /** Show business type selector */\n showBusinessType?: boolean;\n /** Business types list */\n businessTypes?: Array<{ value: string; label: string }>;\n /** Tracking callbacks */\n tracking?: {\n onFormStart?: () => void;\n onFieldFocus?: (field: string) => void;\n onSubmit?: (success: boolean, businessType?: string) => void;\n };\n /** Additional data to send with the form */\n additionalData?: Record<string, unknown>;\n /** Custom class for the section */\n className?: string;\n}\n\nconst defaultBusinessTypes = [\n { value: \"startup\", label: \"Startup\" },\n { value: \"small_business\", label: \"Small Business\" },\n { value: \"enterprise\", label: \"Enterprise\" },\n { value: \"agency\", label: \"Agency\" },\n { value: \"freelancer\", label: \"Freelancer\" },\n { value: \"other\", label: \"Other\" },\n];\n\nexport function Waitlist({\n endpoint = \"/api/waitlist\",\n title = \"Join the Waitlist\",\n description = \"Be the first to know when we launch.\",\n badge = \"Early Access\",\n submitText = \"Join Waitlist\",\n successMessage = \"You're on the list! We'll notify you when we launch.\",\n showBusinessType = true,\n businessTypes = defaultBusinessTypes,\n tracking,\n additionalData,\n className = \"\",\n}: WaitlistProps) {\n const [email, setEmail] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [businessType, setBusinessType] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [message, setMessage] = useState(\"\");\n const [success, setSuccess] = useState(false);\n const formStarted = useRef(false);\n\n const handleFormStart = () => {\n if (!formStarted.current) {\n formStarted.current = true;\n tracking?.onFormStart?.();\n }\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setLoading(true);\n setMessage(\"\");\n\n try {\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n email,\n name,\n businessType,\n ...additionalData,\n }),\n });\n\n const data = await response.json();\n\n if (data.error) {\n setMessage(data.error);\n tracking?.onSubmit?.(false);\n } else {\n setSuccess(true);\n setMessage(successMessage);\n tracking?.onSubmit?.(true, businessType);\n }\n } catch {\n setMessage(\"Something went wrong. Please try again.\");\n tracking?.onSubmit?.(false);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <section id=\"waitlist\" className={`py-20 sm:py-32 ${className}`}>\n <div className=\"container\">\n <div className=\"mx-auto max-w-2xl\">\n <div className=\"rounded-2xl border-2 border-primary/20 bg-gradient-to-br from-background to-primary/5 p-8 sm:p-12 shadow-xl\">\n <div className=\"text-center mb-8\">\n {badge && (\n <span className=\"inline-flex items-center rounded-full bg-primary/10 px-4 py-1.5 text-sm font-medium text-primary mb-4\">\n {badge}\n </span>\n )}\n <h2 className=\"text-3xl font-bold tracking-tight sm:text-4xl\">\n {title}\n </h2>\n {description && (\n <p className=\"mt-4 text-lg text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n\n {!success ? (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div>\n <label\n htmlFor=\"waitlist-name\"\n className=\"block text-sm font-medium mb-2\"\n >\n Your Name *\n </label>\n <input\n id=\"waitlist-name\"\n type=\"text\"\n placeholder=\"John Smith\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onFocus={() => {\n handleFormStart();\n tracking?.onFieldFocus?.(\"name\");\n }}\n required\n className=\"w-full rounded-lg border border-input bg-background px-4 py-3 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n\n <div>\n <label\n htmlFor=\"waitlist-email\"\n className=\"block text-sm font-medium mb-2\"\n >\n Email Address *\n </label>\n <input\n id=\"waitlist-email\"\n type=\"email\"\n placeholder=\"john@company.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onFocus={() => {\n handleFormStart();\n tracking?.onFieldFocus?.(\"email\");\n }}\n required\n className=\"w-full rounded-lg border border-input bg-background px-4 py-3 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n\n {showBusinessType && (\n <div>\n <label\n htmlFor=\"waitlist-businessType\"\n className=\"block text-sm font-medium mb-2\"\n >\n Business Type *\n </label>\n <select\n id=\"waitlist-businessType\"\n value={businessType}\n onChange={(e) => setBusinessType(e.target.value)}\n onFocus={() => {\n handleFormStart();\n tracking?.onFieldFocus?.(\"businessType\");\n }}\n required\n className=\"w-full rounded-lg border border-input bg-background px-4 py-3 text-sm ring-offset-background focus:outline-none focus:ring-2 focus:ring-ring\"\n >\n <option value=\"\">Select your business type</option>\n {businessTypes.map((type) => (\n <option key={type.value} value={type.value}>\n {type.label}\n </option>\n ))}\n </select>\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={loading}\n className=\"w-full rounded-lg bg-primary px-4 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90 focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {loading ? \"Joining...\" : submitText}\n </button>\n\n {message && !success && (\n <p className=\"text-sm text-destructive text-center\">\n {message}\n </p>\n )}\n </form>\n ) : (\n <div className=\"text-center py-8\">\n <div className=\"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-primary/10\">\n <svg\n className=\"h-8 w-8 text-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <h3 className=\"text-2xl font-bold mb-2\">You're on the list!</h3>\n <p className=\"text-muted-foreground\">{message}</p>\n </div>\n )}\n\n <p className=\"mt-6 text-center text-sm text-muted-foreground\">\n Your data is 100% secure and never shared.\n </p>\n </div>\n </div>\n </div>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,kBAAiB;AACjB,0BAAsD;AA6ChD;AAhBC,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,EAAE,MAAM,oBAAoB,MAAM,UAAU;AAAA,EACzD,eAAe,EAAE,MAAM,WAAW,MAAM,SAAS;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AACF,GAAc;AACZ,QAAM,YAAY,OAAO,QAAQ;AAEjC,SACE,6CAAC,aAAQ,WAAW,4BAA4B,SAAS,IAEvD;AAAA,gDAAC,SAAI,WAAU,oKAAmK;AAAA,IAClL,4CAAC,SAAI,WAAU,qHAAoH;AAAA,IAEnI,6CAAC,SAAI,WAAU,0CACb;AAAA,mDAAC,SAAI,WAAU,4DAEZ;AAAA,iBACC,6CAAC,UAAK,WAAU,mFACd;AAAA,sDAAC,aAAU,WAAU,iCAAgC;AAAA,UACpD,MAAM;AAAA,WACT;AAAA,QAIF,4CAAC,QAAG,WAAU,8EACX,iBACH;AAAA,QAGA,4CAAC,OAAE,WAAU,2DACV,oBACH;AAAA,QAGC,SAAS,MAAM,SAAS,KACvB,4CAAC,SAAI,WAAU,kEACZ,gBAAM,IAAI,CAAC,MAAM,UAChB,6CAAC,SAAqB,WAAU,2BAC9B;AAAA,sDAAC,UAAK,WAAU,mCACb,eAAK,OACR;AAAA,UACA,4CAAC,UAAK,WAAU,yBAAyB,eAAK,OAAM;AAAA,UACnD,QAAQ,MAAM,SAAS,KACtB,4CAAC,SAAI,WAAU,2BAA0B;AAAA,aANnC,KAAK,KAQf,CACD,GACH;AAAA,QAIF,6CAAC,SAAI,WAAU,mCACb;AAAA;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cACC,MAAM,WAAW;AAAA,cACjB,WAAU;AAAA,cAET;AAAA,2BAAW;AAAA,gBACZ,4CAAC,kCAAW,WAAU,gBAAe;AAAA;AAAA;AAAA,UACvC;AAAA,UACA;AAAA,YAAC,YAAAA;AAAA,YAAA;AAAA,cACC,MAAM,aAAa;AAAA,cACnB,WAAU;AAAA,cAET;AAAA,6BAAa;AAAA,gBACd,4CAAC,kCAAW,WAAU,gBAAe;AAAA;AAAA;AAAA,UACvC;AAAA,WACF;AAAA,QAGC,aAAa,UAAU,SAAS,KAC/B,6CAAC,SAAI,WAAU,0CACb;AAAA,sDAAC,OAAE,WAAU,iCAAgC,sCAE7C;AAAA,UACA,4CAAC,SAAI,WAAU,yEACZ,oBAAU,IAAI,CAAC,YACd,4CAAC,UAAmB,WAAU,qBAC3B,qBADQ,OAEX,CACD,GACH;AAAA,WACF;AAAA,SAEJ;AAAA,MAGC;AAAA,OACH;AAAA,KACF;AAEJ;;;AC3FQ,IAAAC,sBAAA;AAXD,SAAS,SAAS;AAAA,EACvB,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,SACE,6CAAC,aAAQ,IAAG,YAAW,WAAW,kBAAkB,SAAS,IAC3D,wDAAC,SAAI,WAAU,kBACb;AAAA,kDAAC,SAAI,WAAU,iCACb;AAAA,mDAAC,UAAK,WAAU,6FACb,iBACH;AAAA,MACA,6CAAC,QAAG,WAAU,kEACX,iBACH;AAAA,MACC,YACC,6CAAC,OAAE,WAAU,iCAAiC,oBAAS;AAAA,OAE3D;AAAA,IAEA,6CAAC,SAAI,WAAU,2BACb,uDAAC,SAAI,WAAU,4CACZ,mBAAS,IAAI,CAAC,YACb;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QAEV;AAAA,uDAAC,SAAI,WAAU,uHAAsH;AAAA,UACrI;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,mCACT,QAAQ,MAAM,eAChB;AAAA,cAEA;AAAA,gBAAC,QAAQ;AAAA,gBAAR;AAAA,kBACC,WAAW,WAAW,QAAQ,SAAS,cAAc;AAAA;AAAA,cACvD;AAAA;AAAA,UACF;AAAA,UACA,6CAAC,QAAG,WAAU,8BAA8B,kBAAQ,MAAK;AAAA,UACzD,6CAAC,OAAE,WAAU,iDACV,kBAAQ,aACX;AAAA;AAAA;AAAA,MAhBK,QAAQ;AAAA,IAiBf,CACD,GACH,GACF;AAAA,IAGC,aAAa,UAAU,SAAS,KAC/B,6CAAC,SAAI,WAAU,2BACb,wDAAC,SAAI,WAAU,kDACb;AAAA,mDAAC,QAAG,WAAU,8BAA6B,4CAE3C;AAAA,MACA,6CAAC,SAAI,WAAU,8DACZ,oBAAU,IAAI,CAAC,SACd,8CAAC,SAAoB,WAAU,2BAC7B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,iBAAiB,KAAK,MAAM;AAAA,YAErC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,KAAK,aAAa,QAAQ;AAAA,gBAEzC,eAAK;AAAA;AAAA,YACR;AAAA;AAAA,QACF;AAAA,QACA,6CAAC,UAAK,WAAU,eAAe,eAAK,MAAK;AAAA,WAZjC,KAAK,IAaf,CACD,GACH;AAAA,OACF,GACF;AAAA,KAEJ,GACF;AAEJ;;;ACxGA,IAAAC,eAAiB;AACjB,IAAAC,uBAAsB;AA6Bd,IAAAC,sBAAA;AATD,SAAS,QAAQ;AAAA,EACtB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAiB;AACf,SACE,6CAAC,aAAQ,IAAG,WAAU,WAAW,kBAAkB,SAAS,IAC1D,wDAAC,SAAI,WAAU,aACb;AAAA,kDAAC,SAAI,WAAU,iCACb;AAAA,mDAAC,QAAG,WAAU,iDACX,iBACH;AAAA,MACA,6CAAC,OAAE,WAAU,sCAAsC,oBAAS;AAAA,OAC9D;AAAA,IAEA,6CAAC,SAAI,WAAU,iEACZ,gBAAM,IAAI,CAAC,SACV;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,yEACT,KAAK,UAAU,6BAA6B,EAC9C;AAAA,QAEC;AAAA,eAAK,WACJ,6CAAC,UAAK,WAAU,oJAAmJ,0BAEnK;AAAA,UAEF,8CAAC,SAAI,WAAU,QACb;AAAA,yDAAC,QAAG,WAAU,yBAAyB,eAAK,MAAK;AAAA,YACjD,8CAAC,SAAI,WAAU,4BACb;AAAA,2DAAC,UAAK,WAAU,sBAAsB,eAAK,OAAM;AAAA,cAChD,KAAK,UACJ,6CAAC,UAAK,WAAU,8BACb,eAAK,QACR;AAAA,eAEJ;AAAA,YACA,6CAAC,OAAE,WAAU,sCACV,eAAK,aACR;AAAA,aACF;AAAA,UAEA,6CAAC,QAAG,WAAU,yBACX,eAAK,SAAS,IAAI,CAAC,YAClB,8CAAC,QAAiB,WAAU,2BAC1B;AAAA,yDAAC,8BAAM,WAAU,wBAAuB;AAAA,YACxC,6CAAC,UAAK,WAAU,WAAW,mBAAQ;AAAA,eAF5B,OAGT,CACD,GACH;AAAA,UAEA;AAAA,YAAC,aAAAC;AAAA,YAAA;AAAA,cACC,MAAM,KAAK;AAAA,cACX,WAAW,6GACT,KAAK,UACD,2DACA,qCACN;AAAA,cAEC,eAAK;AAAA;AAAA,UACR;AAAA;AAAA;AAAA,MA3CK,KAAK;AAAA,IA4CZ,CACD,GACH;AAAA,KACF,GACF;AAEJ;;;AC1FA,mBAAyB;AACzB,IAAAC,uBAA4B;AAyBpB,IAAAC,sBAAA;AAXD,SAAS,IAAI;AAAA,EAClB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAa;AACX,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAwB,IAAI;AAE9D,SACE,6CAAC,aAAQ,IAAG,OAAM,WAAW,kBAAkB,SAAS,IACtD,wDAAC,SAAI,WAAU,aACb;AAAA,kDAAC,SAAI,WAAU,iCACb;AAAA,mDAAC,QAAG,WAAU,iDACX,iBACH;AAAA,MACA,6CAAC,OAAE,WAAU,sCAAsC,oBAAS;AAAA,OAC9D;AAAA,IAEA,6CAAC,SAAI,WAAU,2BACb,uDAAC,SAAI,WAAU,+BACZ,gBAAM,IAAI,CAAC,MAAM,UAChB,8CAAC,SACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MACP,aAAa,cAAc,QAAQ,OAAO,KAAK;AAAA,UAGjD;AAAA,yDAAC,UAAK,WAAU,eAAe,eAAK,UAAS;AAAA,YAC7C;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,sDACT,cAAc,QAAQ,eAAe,EACvC;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA,MACC,cAAc,SACb,6CAAC,SAAI,WAAU,aACb,uDAAC,OAAE,WAAU,yBAAyB,eAAK,QAAO,GACpD;AAAA,SAjBM,KAmBV,CACD,GACH,GACF;AAAA,KACF,GACF;AAEJ;;;AC9DA,IAAAC,eAAiB;AACjB,IAAAC,uBAA2B;AA4BjB,IAAAC,sBAAA;AAZH,SAAS,IAAI;AAAA,EAClB;AAAA,EACA;AAAA,EACA,aAAa,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,EACpD;AAAA,EACA;AACF,GAAa;AACX,SACE,6CAAC,aAAQ,WAAW,kBAAkB,SAAS,IAC7C,uDAAC,SAAI,WAAU,aACb,wDAAC,SAAI,WAAU,gFAEb;AAAA,kDAAC,SAAI,WAAU,0BACb;AAAA,mDAAC,SAAI,WAAU,6EAA4E;AAAA,MAC3F,6CAAC,SAAI,WAAU,iFAAgF;AAAA,OACjG;AAAA,IAEA,8CAAC,SAAI,WAAU,iCACb;AAAA,mDAAC,QAAG,WAAU,yEACX,iBACH;AAAA,MACC,YACC,6CAAC,OAAE,WAAU,2CACV,oBACH;AAAA,MAEF,8CAAC,SAAI,WAAU,oEACb;AAAA;AAAA,UAAC,aAAAC;AAAA,UAAA;AAAA,YACC,MAAM,WAAW;AAAA,YACjB,WAAU;AAAA,YAET;AAAA,yBAAW;AAAA,cACZ,6CAAC,mCAAW,WAAU,gBAAe;AAAA;AAAA;AAAA,QACvC;AAAA,QACC,gBACC;AAAA,UAAC,aAAAA;AAAA,UAAA;AAAA,YACC,MAAM,aAAa;AAAA,YACnB,WAAU;AAAA,YAET,uBAAa;AAAA;AAAA,QAChB;AAAA,SAEJ;AAAA,OACF;AAAA,KACF,GACF,GACF;AAEJ;;;ACjEA,IAAAC,eAAiB;AA4CL,IAAAC,sBAAA;AAjBL,SAAS,OAAO;AAAA,EACrB;AAAA,EACA,WAAW;AAAA,EACX,cAAc;AAAA,EACd,UAAU,CAAC;AAAA,EACX,cAAc,CAAC;AAAA,EACf;AAAA,EACA;AACF,GAAgB;AACd,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAE3C,SACE,6CAAC,YAAO,WAAW,kBAAkB,SAAS,IAC5C,wDAAC,SAAI,WAAU,aACb;AAAA,kDAAC,SAAI,WAAU,4CAEb;AAAA,oDAAC,SAAI,WAAU,iBACb;AAAA,sDAAC,aAAAC,SAAA,EAAK,MAAK,KAAI,WAAU,2BACtB;AAAA,kBACC,6CAAC,SAAI,WAAU,oGAAmG,eAElH;AAAA,UAEF,6CAAC,UAAK,WAAU,yBAAyB,oBAAS;AAAA,WACpD;AAAA,QACA,6CAAC,OAAE,WAAU,+CACV,uBACH;AAAA,QACC,YAAY,SAAS,KACpB,6CAAC,SAAI,WAAU,mBACZ,sBAAY,IAAI,CAAC,SAChB;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM,KAAK;AAAA,YACX,WAAU;AAAA,YACV,cAAY,KAAK;AAAA,YAEhB,eAAK;AAAA;AAAA,UALD,KAAK;AAAA,QAMZ,CACD,GACH;AAAA,SAEJ;AAAA,MAGC,QAAQ,IAAI,CAAC,WACZ,8CAAC,SACC;AAAA,qDAAC,QAAG,WAAU,iBAAiB,iBAAO,OAAM;AAAA,QAC5C,6CAAC,QAAG,WAAU,kBACX,iBAAO,MAAM,IAAI,CAAC,SACjB,6CAAC,QACC;AAAA,UAAC,aAAAA;AAAA,UAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,WAAU;AAAA,YAET,eAAK;AAAA;AAAA,QACR,KANO,KAAK,KAOd,CACD,GACH;AAAA,WAbQ,OAAO,KAcjB,CACD;AAAA,OACH;AAAA,IAEA,6CAAC,SAAI,WAAU,iEACZ,uBAAa,QAAK,WAAW,IAAI,QAAQ,0BAC5C;AAAA,KACF,GACF;AAEJ;;;ACjGA,IAAAC,eAAiB;AACjB,IAAAC,gBAAyB;AACzB,IAAAC,uBAAwB;AAoChB,IAAAC,sBAAA;AAnBD,SAAS,OAAO;AAAA,EACrB;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,IACN,EAAE,OAAO,YAAY,MAAM,YAAY;AAAA,IACvC,EAAE,OAAO,WAAW,MAAM,WAAW;AAAA,IACrC,EAAE,OAAO,OAAO,MAAM,OAAO;AAAA,EAC/B;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAAgB;AACd,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAE1C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,gHAAgH,SAAS;AAAA,MAEpI;AAAA,sDAAC,SAAI,WAAU,oDACb;AAAA,wDAAC,aAAAC,SAAA,EAAK,MAAK,KAAI,WAAU,2BACtB;AAAA,oBACC,6CAAC,SAAI,WAAU,oGAAmG,eAElH;AAAA,YAEF,6CAAC,UAAK,WAAU,yBAAyB,oBAAS;AAAA,aACpD;AAAA,UAGA,8CAAC,SAAI,WAAU,qCACZ;AAAA,kBAAM,IAAI,CAAC,SACV;AAAA,cAAC,aAAAA;AAAA,cAAA;AAAA,gBAEC,MAAM,KAAK;AAAA,gBACX,WAAU;AAAA,gBAET,eAAK;AAAA;AAAA,cAJD,KAAK;AAAA,YAKZ,CACD;AAAA,YACD;AAAA,cAAC,aAAAA;AAAA,cAAA;AAAA,gBACC,MAAM;AAAA,gBACN,WAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA,aACF;AAAA,UAGA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAM,UAAU,CAAC,MAAM;AAAA,cAChC,cAAW;AAAA,cAEV,mBAAS,6CAAC,0BAAE,WAAU,WAAU,IAAK,6CAAC,6BAAK,WAAU,WAAU;AAAA;AAAA,UAClE;AAAA,WACF;AAAA,QAGC,UACC,6CAAC,SAAI,WAAU,sBACb,wDAAC,SAAI,WAAU,kBACZ;AAAA,gBAAM,IAAI,CAAC,SACV;AAAA,YAAC,aAAAA;AAAA,YAAA;AAAA,cAEC,MAAM,KAAK;AAAA,cACX,WAAU;AAAA,cACV,SAAS,MAAM,UAAU,KAAK;AAAA,cAE7B,eAAK;AAAA;AAAA,YALD,KAAK;AAAA,UAMZ,CACD;AAAA,UACD;AAAA,YAAC,aAAAA;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN,WAAU;AAAA,cACV,SAAS,MAAM,UAAU,KAAK;AAAA,cAE7B;AAAA;AAAA,UACH;AAAA,WACF,GACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACzEQ,IAAAC,sBAAA;AAZD,SAAS,aAAa;AAAA,EAC3B,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAsB;AACpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,WAAW,8BAA8B,SAAS;AAAA,MAElD,wDAAC,SAAI,WAAU,aACb;AAAA,sDAAC,SAAI,WAAU,uCACb;AAAA,uDAAC,QAAG,WAAU,iDACX,iBACH;AAAA,UACC,YACC,6CAAC,OAAE,WAAU,sCAAsC,oBAAS;AAAA,WAEhE;AAAA,QAEA,6CAAC,SAAI,WAAU,8DACZ,uBAAa,IAAI,CAAC,aAAa,UAC9B;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YAEV;AAAA,2DAAC,gBAAW,WAAU,UACpB,wDAAC,OAAE,WAAU,yCAAwC;AAAA;AAAA,gBACjD,YAAY;AAAA,gBAAM;AAAA,iBACtB,GACF;AAAA,cACA,8CAAC,SAAI,WAAU,gCACZ;AAAA,4BAAY,QACX;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK,YAAY;AAAA,oBACjB,KAAK,YAAY;AAAA,oBACjB,WAAU;AAAA;AAAA,gBACZ,IAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,6EACT,YAAY,SAAS,4BACvB;AAAA,oBAEC,sBAAY,WAAW,YAAY,OAAO,CAAC;AAAA;AAAA,gBAC9C;AAAA,gBAEF,8CAAC,SACC;AAAA,+DAAC,OAAE,WAAU,iBAAiB,sBAAY,QAAO;AAAA,kBACjD,8CAAC,OAAE,WAAU,iCACV;AAAA,gCAAY;AAAA,oBACZ,YAAY,WAAW,SAAM,YAAY,OAAO;AAAA,qBACnD;AAAA,mBACF;AAAA,iBACF;AAAA;AAAA;AAAA,UA/BK;AAAA,QAgCP,CACD,GACH;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AC/EA,IAAAC,gBAAiC;AA8GrB,IAAAC,sBAAA;AA/EZ,IAAM,uBAAuB;AAAA,EAC3B,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,kBAAkB,OAAO,iBAAiB;AAAA,EACnD,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,EAC3C,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,EAC3C,EAAE,OAAO,SAAS,OAAO,QAAQ;AACnC;AAEO,SAAS,SAAS;AAAA,EACvB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAkB;AAChB,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,EAAE;AACnC,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,EAAE;AACnD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,EAAE;AACzC,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,kBAAc,sBAAO,KAAK;AAEhC,QAAM,kBAAkB,MAAM;AAC5B,QAAI,CAAC,YAAY,SAAS;AACxB,kBAAY,UAAU;AACtB,gBAAU,cAAc;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,eAAW,IAAI;AACf,eAAW,EAAE;AAEb,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,UAAU;AAAA,QACrC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA,GAAG;AAAA,QACL,CAAC;AAAA,MACH,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,UAAI,KAAK,OAAO;AACd,mBAAW,KAAK,KAAK;AACrB,kBAAU,WAAW,KAAK;AAAA,MAC5B,OAAO;AACL,mBAAW,IAAI;AACf,mBAAW,cAAc;AACzB,kBAAU,WAAW,MAAM,YAAY;AAAA,MACzC;AAAA,IACF,QAAQ;AACN,iBAAW,yCAAyC;AACpD,gBAAU,WAAW,KAAK;AAAA,IAC5B,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,6CAAC,aAAQ,IAAG,YAAW,WAAW,kBAAkB,SAAS,IAC3D,uDAAC,SAAI,WAAU,aACb,uDAAC,SAAI,WAAU,qBACb,wDAAC,SAAI,WAAU,+GACb;AAAA,kDAAC,SAAI,WAAU,oBACZ;AAAA,eACC,6CAAC,UAAK,WAAU,yGACb,iBACH;AAAA,MAEF,6CAAC,QAAG,WAAU,iDACX,iBACH;AAAA,MACC,eACC,6CAAC,OAAE,WAAU,sCACV,uBACH;AAAA,OAEJ;AAAA,IAEC,CAAC,UACA,8CAAC,UAAK,UAAU,cAAc,WAAU,aACtC;AAAA,oDAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,YACvC,SAAS,MAAM;AACb,8BAAgB;AAChB,wBAAU,eAAe,MAAM;AAAA,YACjC;AAAA,YACA,UAAQ;AAAA,YACR,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MAEA,8CAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,SAAS,MAAM;AACb,8BAAgB;AAChB,wBAAU,eAAe,OAAO;AAAA,YAClC;AAAA,YACA,UAAQ;AAAA,YACR,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MAEC,oBACC,8CAAC,SACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,YAC/C,SAAS,MAAM;AACb,8BAAgB;AAChB,wBAAU,eAAe,cAAc;AAAA,YACzC;AAAA,YACA,UAAQ;AAAA,YACR,WAAU;AAAA,YAEV;AAAA,2DAAC,YAAO,OAAM,IAAG,uCAAyB;AAAA,cACzC,cAAc,IAAI,CAAC,SAClB,6CAAC,YAAwB,OAAO,KAAK,OAClC,eAAK,SADK,KAAK,KAElB,CACD;AAAA;AAAA;AAAA,QACH;AAAA,SACF;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAU;AAAA,UACV,WAAU;AAAA,UAET,oBAAU,eAAe;AAAA;AAAA,MAC5B;AAAA,MAEC,WAAW,CAAC,WACX,6CAAC,OAAE,WAAU,wCACV,mBACH;AAAA,OAEJ,IAEA,8CAAC,SAAI,WAAU,oBACb;AAAA,mDAAC,SAAI,WAAU,sFACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,QAAO;AAAA,UAEP;AAAA,YAAC;AAAA;AAAA,cACC,eAAc;AAAA,cACd,gBAAe;AAAA,cACf,aAAa;AAAA,cACb,GAAE;AAAA;AAAA,UACJ;AAAA;AAAA,MACF,GACF;AAAA,MACA,6CAAC,QAAG,WAAU,2BAA0B,iCAAmB;AAAA,MAC3D,6CAAC,OAAE,WAAU,yBAAyB,mBAAQ;AAAA,OAChD;AAAA,IAGF,6CAAC,OAAE,WAAU,kDAAiD,wDAE9D;AAAA,KACF,GACF,GACF,GACF;AAEJ;","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","import_jsx_runtime","import_react","import_jsx_runtime"]}