create-flexireact 1.2.2 → 1.3.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.
Files changed (2) hide show
  1. package/index.js +426 -841
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -357,6 +357,22 @@ interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
357
357
  children: React.ReactNode;
358
358
  }
359
359
 
360
+ const baseStyles = 'inline-flex items-center justify-center rounded-lg ' +
361
+ 'font-medium transition-all duration-200 focus-visible:outline-none ' +
362
+ 'focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50';
363
+
364
+ const variants = {
365
+ default: 'bg-primary text-black hover:bg-primary/90',
366
+ outline: 'border border-border bg-transparent hover:bg-secondary',
367
+ ghost: 'hover:bg-secondary hover:text-foreground',
368
+ };
369
+
370
+ const sizes = {
371
+ default: 'h-10 px-4 py-2 text-sm',
372
+ sm: 'h-9 px-3 text-sm',
373
+ lg: 'h-12 px-8 text-base',
374
+ };
375
+
360
376
  export function Button({
361
377
  className,
362
378
  variant = 'default',
@@ -366,20 +382,7 @@ export function Button({
366
382
  }: ButtonProps) {
367
383
  return (
368
384
  <button
369
- className={cn(
370
- 'inline-flex items-center justify-center rounded-lg font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',
371
- {
372
- 'bg-primary text-primary-foreground hover:bg-primary/90 shadow-lg shadow-primary/25': variant === 'default',
373
- 'border border-border bg-transparent hover:bg-secondary hover:text-foreground': variant === 'outline',
374
- 'hover:bg-secondary hover:text-foreground': variant === 'ghost',
375
- },
376
- {
377
- 'h-10 px-4 py-2 text-sm': size === 'default',
378
- 'h-9 px-3 text-sm': size === 'sm',
379
- 'h-12 px-8 text-base': size === 'lg',
380
- },
381
- className
382
- )}
385
+ className={cn(baseStyles, variants[variant], sizes[size], className)}
383
386
  {...props}
384
387
  >
385
388
  {children}
@@ -395,15 +398,13 @@ interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
395
398
  children: React.ReactNode;
396
399
  }
397
400
 
401
+ const cardStyles = 'rounded-xl border border-border bg-card ' +
402
+ 'text-card-foreground shadow-sm transition-all duration-300 ' +
403
+ 'hover:border-primary/50';
404
+
398
405
  export function Card({ className, children, ...props }: CardProps) {
399
406
  return (
400
- <div
401
- className={cn(
402
- 'rounded-xl border border-border bg-card text-card-foreground shadow-sm transition-all duration-300 hover:border-primary/50 hover:shadow-lg hover:shadow-primary/5',
403
- className
404
- )}
405
- {...props}
406
- >
407
+ <div className={cn(cardStyles, className)} {...props}>
407
408
  {children}
408
409
  </div>
409
410
  );
@@ -419,7 +420,7 @@ export function CardHeader({ className, children, ...props }: CardProps) {
419
420
 
420
421
  export function CardTitle({ className, children, ...props }: CardProps) {
421
422
  return (
422
- <h3 className={cn('text-lg font-semibold leading-none tracking-tight', className)} {...props}>
423
+ <h3 className={cn('text-lg font-semibold', className)} {...props}>
423
424
  {children}
424
425
  </h3>
425
426
  );
@@ -471,33 +472,18 @@ export function Badge({ className, variant = 'default', children, ...props }: Ba
471
472
  `,
472
473
 
473
474
  'components/Navbar.tsx': () => `import React from 'react';
474
- import { Button } from './ui/button';
475
475
 
476
476
  export function Navbar() {
477
477
  return (
478
- <header className="sticky top-0 z-50 w-full border-b border-border/40 bg-background/80 backdrop-blur-xl">
479
- <nav className="container mx-auto flex h-16 max-w-6xl items-center justify-between px-4">
480
- <a href="/" className="flex items-center gap-2 transition-opacity hover:opacity-80">
481
- <div className="flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-primary to-emerald-400">
482
- <svg className="h-4 w-4 text-primary-foreground" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2.5}>
483
- <path strokeLinecap="round" strokeLinejoin="round" d="M13 10V3L4 14h7v7l9-11h-7z" />
484
- </svg>
485
- </div>
486
- <span className="text-lg font-bold">FlexiReact</span>
478
+ <header className="navbar">
479
+ <nav className="navbar-inner">
480
+ <a href="/" className="logo">
481
+ <div className="logo-icon">⚡</div>
482
+ <span className="logo-text">FlexiReact</span>
487
483
  </a>
488
-
489
- <div className="flex items-center gap-2">
490
- <Button variant="ghost" size="sm" asChild>
491
- <a href="https://github.com/flexireact/flexireact">Docs</a>
492
- </Button>
493
- <Button variant="ghost" size="sm" asChild>
494
- <a href="https://github.com/flexireact/flexireact" className="flex items-center gap-2">
495
- <svg className="h-4 w-4" fill="currentColor" viewBox="0 0 24 24">
496
- <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
497
- </svg>
498
- GitHub
499
- </a>
500
- </Button>
484
+ <div className="nav-links">
485
+ <a href="https://github.com/flexireact/flexireact">Docs</a>
486
+ <a href="https://github.com/flexireact/flexireact">GitHub</a>
501
487
  </div>
502
488
  </nav>
503
489
  </header>
@@ -506,83 +492,41 @@ export function Navbar() {
506
492
  `,
507
493
 
508
494
  'components/Hero.tsx': () => `import React from 'react';
509
- import { Button } from './ui/button';
510
- import { Badge } from './ui/badge';
511
495
 
512
496
  export function Hero() {
513
497
  return (
514
- <section className="relative overflow-hidden">
515
- {/* Gradient Background */}
516
- <div className="absolute inset-0 -z-10">
517
- <div className="absolute left-1/2 top-0 -translate-x-1/2 -translate-y-1/2">
518
- <div className="h-[600px] w-[600px] rounded-full bg-gradient-to-r from-primary/20 via-emerald-500/10 to-cyan-500/20 blur-3xl" />
519
- </div>
520
- <div className="absolute right-0 top-1/2 -translate-y-1/2">
521
- <div className="h-[400px] w-[400px] rounded-full bg-gradient-to-l from-primary/10 to-transparent blur-3xl" />
498
+ <section className="hero">
499
+ <div className="hero-glow" />
500
+ <div className="hero-content">
501
+ <span className="hero-badge">⚡ The Modern React Framework</span>
502
+ <h1 className="hero-title">
503
+ Build <span className="gradient-text">blazing fast</span> web apps
504
+ </h1>
505
+ <p className="hero-subtitle">
506
+ A modern React framework with TypeScript, Tailwind CSS,
507
+ SSR, SSG, Islands architecture, and file-based routing.
508
+ </p>
509
+ <div className="hero-buttons">
510
+ <a href="https://github.com/flexireact/flexireact" className="btn-primary">
511
+ Get Started →
512
+ </a>
513
+ <a href="https://github.com/flexireact/flexireact" className="btn-outline">
514
+ GitHub
515
+ </a>
522
516
  </div>
523
- </div>
524
-
525
- <div className="container mx-auto max-w-6xl px-4 py-24 sm:py-32 lg:py-40">
526
- <div className="flex flex-col items-center text-center">
527
- {/* Badge */}
528
- <Badge className="mb-6 animate-fade-in">
529
- <span className="mr-1">⚡</span> The Modern React Framework
530
- </Badge>
531
-
532
- {/* Title */}
533
- <h1 className="mb-6 max-w-4xl animate-fade-up text-4xl font-extrabold tracking-tight sm:text-5xl md:text-6xl lg:text-7xl">
534
- Build{' '}
535
- <span className="bg-gradient-to-r from-primary via-emerald-400 to-cyan-400 bg-clip-text text-transparent">
536
- blazing fast
537
- </span>{' '}
538
- web apps
539
- </h1>
540
-
541
- {/* Subtitle */}
542
- <p className="mb-10 max-w-2xl animate-fade-up text-lg text-muted-foreground sm:text-xl" style={{ animationDelay: '0.1s' }}>
543
- A modern React framework with TypeScript, Tailwind CSS, SSR, SSG,
544
- Islands architecture, and file-based routing. Ship faster.
545
- </p>
546
-
547
- {/* CTA Buttons */}
548
- <div className="flex flex-wrap items-center justify-center gap-4 animate-fade-up" style={{ animationDelay: '0.2s' }}>
549
- <Button size="lg" className="gap-2">
550
- Start Building
551
- <svg className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
552
- <path strokeLinecap="round" strokeLinejoin="round" d="M13 7l5 5m0 0l-5 5m5-5H6" />
553
- </svg>
554
- </Button>
555
- <Button variant="outline" size="lg" asChild>
556
- <a href="https://github.com/flexireact/flexireact" className="gap-2">
557
- <svg className="h-4 w-4" fill="currentColor" viewBox="0 0 24 24">
558
- <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
559
- </svg>
560
- GitHub
561
- </a>
562
- </Button>
517
+ <div className="terminal">
518
+ <div className="terminal-header">
519
+ <span className="dot red"></span>
520
+ <span className="dot yellow"></span>
521
+ <span className="dot green"></span>
563
522
  </div>
523
+ <pre className="terminal-body">
524
+ <span className="dim">$</span> <span className="green">npx</span> create-flexireact my-app
525
+ <span className="dim">$</span> <span className="green">cd</span> my-app
526
+ <span className="dim">$</span> <span className="green">npm</span> run dev
564
527
 
565
- {/* Code Preview */}
566
- <div className="mt-16 w-full max-w-2xl animate-fade-up rounded-xl border border-border bg-card/50 p-4 backdrop-blur-sm" style={{ animationDelay: '0.3s' }}>
567
- <div className="flex items-center gap-2 border-b border-border pb-3">
568
- <div className="h-3 w-3 rounded-full bg-red-500/80" />
569
- <div className="h-3 w-3 rounded-full bg-yellow-500/80" />
570
- <div className="h-3 w-3 rounded-full bg-green-500/80" />
571
- <span className="ml-2 text-xs text-muted-foreground">terminal</span>
572
- </div>
573
- <pre className="mt-4 overflow-x-auto text-left text-sm">
574
- <code className="text-muted-foreground">
575
- <span className="text-muted-foreground/60">$</span>{' '}
576
- <span className="text-primary">npx</span> create-flexireact@latest my-app{'\n'}
577
- <span className="text-muted-foreground/60">$</span>{' '}
578
- <span className="text-primary">cd</span> my-app{'\n'}
579
- <span className="text-muted-foreground/60">$</span>{' '}
580
- <span className="text-primary">npm</span> run dev{'\n'}
581
- {'\n'}
582
- <span className="text-emerald-400">✓</span> Ready in <span className="text-primary">38ms</span>
583
- </code>
584
- </pre>
585
- </div>
528
+ <span className="green">✓</span> Ready in 38ms
529
+ </pre>
586
530
  </div>
587
531
  </div>
588
532
  </section>
@@ -591,70 +535,28 @@ export function Hero() {
591
535
  `,
592
536
 
593
537
  'components/Features.tsx': () => `import React from 'react';
594
- import { Card, CardHeader, CardTitle, CardDescription } from './ui/card';
595
538
 
596
539
  const features = [
597
- {
598
- icon: (
599
- <svg className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
600
- <path strokeLinecap="round" strokeLinejoin="round" d="M13 10V3L4 14h7v7l9-11h-7z" />
601
- </svg>
602
- ),
603
- title: 'Lightning Fast',
604
- description: 'Powered by esbuild for instant builds and sub-second hot module replacement.',
605
- },
606
- {
607
- icon: (
608
- <svg className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
609
- <path strokeLinecap="round" strokeLinejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z" />
610
- </svg>
611
- ),
612
- title: 'File-based Routing',
613
- description: 'Create a file in pages/, get a route automatically. Simple and intuitive.',
614
- },
615
- {
616
- icon: (
617
- <svg className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
618
- <path strokeLinecap="round" strokeLinejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z" />
619
- </svg>
620
- ),
621
- title: 'Islands Architecture',
622
- description: 'Partial hydration for minimal JavaScript. Only hydrate what needs interactivity.',
623
- },
624
- {
625
- icon: (
626
- <svg className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
627
- <path strokeLinecap="round" strokeLinejoin="round" d="M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01" />
628
- </svg>
629
- ),
630
- title: 'SSR & SSG',
631
- description: 'Server-side rendering and static generation out of the box. SEO friendly.',
632
- },
540
+ { icon: '⚡', title: 'Lightning Fast', desc: 'Powered by esbuild for instant builds.' },
541
+ { icon: '📁', title: 'File Routing', desc: 'Create a file, get a route automatically.' },
542
+ { icon: '🏝️', title: 'Islands', desc: 'Partial hydration for minimal JavaScript.' },
543
+ { icon: '🚀', title: 'SSR & SSG', desc: 'Server rendering out of the box.' },
633
544
  ];
634
545
 
635
546
  export function Features() {
636
547
  return (
637
- <section className="container mx-auto max-w-6xl px-4 py-24">
638
- <div className="mb-12 text-center">
639
- <h2 className="mb-4 text-3xl font-bold tracking-tight sm:text-4xl">
640
- Everything you need
641
- </h2>
642
- <p className="mx-auto max-w-2xl text-muted-foreground">
643
- A complete toolkit for building modern web applications with React.
644
- </p>
645
- </div>
646
-
647
- <div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-4">
648
- {features.map((feature, index) => (
649
- <Card key={index} className="group cursor-default">
650
- <CardHeader>
651
- <div className="mb-3 inline-flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10 text-primary transition-colors group-hover:bg-primary group-hover:text-primary-foreground">
652
- {feature.icon}
653
- </div>
654
- <CardTitle>{feature.title}</CardTitle>
655
- <CardDescription>{feature.description}</CardDescription>
656
- </CardHeader>
657
- </Card>
548
+ <section className="features">
549
+ <h2 className="features-title">Everything you need</h2>
550
+ <p className="features-subtitle">
551
+ A complete toolkit for building modern web apps.
552
+ </p>
553
+ <div className="features-grid">
554
+ {features.map((f, i) => (
555
+ <div key={i} className="feature-card">
556
+ <span className="feature-icon">{f.icon}</span>
557
+ <h3 className="feature-title">{f.title}</h3>
558
+ <p className="feature-desc">{f.desc}</p>
559
+ </div>
658
560
  ))}
659
561
  </div>
660
562
  </section>
@@ -666,25 +568,12 @@ export function Features() {
666
568
 
667
569
  export function Footer() {
668
570
  return (
669
- <footer className="border-t border-border">
670
- <div className="container mx-auto max-w-6xl px-4 py-8">
671
- <div className="flex flex-col items-center justify-between gap-4 sm:flex-row">
672
- <div className="flex items-center gap-2 text-sm text-muted-foreground">
673
- <span>Built with</span>
674
- <span className="text-red-500">❤️</span>
675
- <span>using</span>
676
- <a href="https://github.com/flexireact/flexireact" className="font-medium text-foreground hover:text-primary transition-colors">
677
- FlexiReact
678
- </a>
679
- </div>
680
- <div className="flex items-center gap-4 text-sm text-muted-foreground">
681
- <a href="https://github.com/flexireact/flexireact" className="hover:text-foreground transition-colors">
682
- GitHub
683
- </a>
684
- <a href="https://github.com/flexireact/flexireact" className="hover:text-foreground transition-colors">
685
- Documentation
686
- </a>
687
- </div>
571
+ <footer className="footer">
572
+ <div className="footer-inner">
573
+ <span>Built with ❤️ using FlexiReact</span>
574
+ <div className="footer-links">
575
+ <a href="https://github.com/flexireact/flexireact">GitHub</a>
576
+ <a href="https://github.com/flexireact/flexireact">Docs</a>
688
577
  </div>
689
578
  </div>
690
579
  </footer>
@@ -758,53 +647,216 @@ export default function HomePage() {
758
647
  @tailwind components;
759
648
  @tailwind utilities;
760
649
 
761
- @layer base {
762
- :root {
763
- --background: 240 10% 3.9%;
764
- --foreground: 0 0% 98%;
765
- --card: 240 10% 3.9%;
766
- --card-foreground: 0 0% 98%;
767
- --popover: 240 10% 3.9%;
768
- --popover-foreground: 0 0% 98%;
769
- --primary: 142.1 76.2% 36.3%;
770
- --primary-foreground: 144.9 80.4% 10%;
771
- --secondary: 240 3.7% 15.9%;
772
- --secondary-foreground: 0 0% 98%;
773
- --muted: 240 3.7% 15.9%;
774
- --muted-foreground: 240 5% 64.9%;
775
- --accent: 240 3.7% 15.9%;
776
- --accent-foreground: 0 0% 98%;
777
- --destructive: 0 62.8% 30.6%;
778
- --destructive-foreground: 0 0% 98%;
779
- --border: 240 3.7% 15.9%;
780
- --input: 240 3.7% 15.9%;
781
- --ring: 142.1 76.2% 36.3%;
782
- --radius: 0.75rem;
783
- }
650
+ :root {
651
+ --bg: #0a0a0a;
652
+ --fg: #fafafa;
653
+ --primary: #10b981;
654
+ --muted: #71717a;
655
+ --border: #27272a;
656
+ --card: #18181b;
657
+ }
784
658
 
785
- * {
786
- border-color: hsl(var(--border));
787
- }
659
+ * { box-sizing: border-box; margin: 0; padding: 0; }
788
660
 
789
- html {
790
- scroll-behavior: smooth;
791
- }
661
+ body {
662
+ font-family: 'Inter', system-ui, sans-serif;
663
+ background: var(--bg);
664
+ color: var(--fg);
665
+ min-height: 100vh;
666
+ -webkit-font-smoothing: antialiased;
667
+ }
792
668
 
793
- body {
794
- font-family: 'Inter', system-ui, -apple-system, sans-serif;
795
- background-color: hsl(var(--background));
796
- color: hsl(var(--foreground));
797
- min-height: 100vh;
798
- -webkit-font-smoothing: antialiased;
799
- -moz-osx-font-smoothing: grayscale;
800
- }
669
+ a { color: inherit; text-decoration: none; }
670
+ a:hover { color: var(--primary); }
671
+
672
+ /* Navbar */
673
+ .navbar {
674
+ position: sticky;
675
+ top: 0;
676
+ z-index: 50;
677
+ border-bottom: 1px solid var(--border);
678
+ background: rgba(10,10,10,0.8);
679
+ backdrop-filter: blur(12px);
680
+ }
681
+ .navbar-inner {
682
+ max-width: 1200px;
683
+ margin: 0 auto;
684
+ padding: 1rem 1.5rem;
685
+ display: flex;
686
+ justify-content: space-between;
687
+ align-items: center;
801
688
  }
689
+ .logo { display: flex; align-items: center; gap: 0.5rem; }
690
+ .logo-icon {
691
+ width: 32px;
692
+ height: 32px;
693
+ background: linear-gradient(135deg, var(--primary), #06b6d4);
694
+ border-radius: 8px;
695
+ display: flex;
696
+ align-items: center;
697
+ justify-content: center;
698
+ }
699
+ .logo-text { font-weight: 700; font-size: 1.125rem; }
700
+ .nav-links { display: flex; gap: 1.5rem; }
701
+ .nav-links a { color: var(--muted); font-size: 0.875rem; }
702
+ .nav-links a:hover { color: var(--fg); }
802
703
 
803
- @layer utilities {
804
- .text-balance {
805
- text-wrap: balance;
806
- }
704
+ /* Hero */
705
+ .hero {
706
+ position: relative;
707
+ min-height: 90vh;
708
+ display: flex;
709
+ align-items: center;
710
+ justify-content: center;
711
+ overflow: hidden;
807
712
  }
713
+ .hero-glow {
714
+ position: absolute;
715
+ top: 50%;
716
+ left: 50%;
717
+ transform: translate(-50%, -50%);
718
+ width: 600px;
719
+ height: 600px;
720
+ background: radial-gradient(circle, rgba(16,185,129,0.15), transparent 70%);
721
+ pointer-events: none;
722
+ }
723
+ .hero-content {
724
+ text-align: center;
725
+ padding: 2rem;
726
+ max-width: 800px;
727
+ }
728
+ .hero-badge {
729
+ display: inline-block;
730
+ padding: 0.5rem 1rem;
731
+ background: rgba(16,185,129,0.1);
732
+ border: 1px solid rgba(16,185,129,0.2);
733
+ border-radius: 9999px;
734
+ font-size: 0.875rem;
735
+ color: var(--primary);
736
+ margin-bottom: 2rem;
737
+ }
738
+ .hero-title {
739
+ font-size: clamp(2.5rem, 6vw, 4.5rem);
740
+ font-weight: 800;
741
+ line-height: 1.1;
742
+ margin-bottom: 1.5rem;
743
+ }
744
+ .gradient-text {
745
+ background: linear-gradient(90deg, var(--primary), #06b6d4);
746
+ -webkit-background-clip: text;
747
+ -webkit-text-fill-color: transparent;
748
+ }
749
+ .hero-subtitle {
750
+ font-size: 1.125rem;
751
+ color: var(--muted);
752
+ line-height: 1.7;
753
+ margin-bottom: 2.5rem;
754
+ }
755
+ .hero-buttons {
756
+ display: flex;
757
+ gap: 1rem;
758
+ justify-content: center;
759
+ flex-wrap: wrap;
760
+ margin-bottom: 3rem;
761
+ }
762
+ .btn-primary {
763
+ padding: 0.875rem 2rem;
764
+ background: var(--primary);
765
+ color: #000;
766
+ font-weight: 600;
767
+ border-radius: 8px;
768
+ transition: opacity 0.2s;
769
+ }
770
+ .btn-primary:hover { opacity: 0.9; color: #000; }
771
+ .btn-outline {
772
+ padding: 0.875rem 2rem;
773
+ border: 1px solid var(--border);
774
+ border-radius: 8px;
775
+ transition: border-color 0.2s;
776
+ }
777
+ .btn-outline:hover { border-color: var(--primary); color: var(--fg); }
778
+
779
+ /* Terminal */
780
+ .terminal {
781
+ background: var(--card);
782
+ border: 1px solid var(--border);
783
+ border-radius: 12px;
784
+ max-width: 500px;
785
+ margin: 0 auto;
786
+ overflow: hidden;
787
+ }
788
+ .terminal-header {
789
+ padding: 0.75rem 1rem;
790
+ border-bottom: 1px solid var(--border);
791
+ display: flex;
792
+ gap: 0.5rem;
793
+ }
794
+ .dot { width: 12px; height: 12px; border-radius: 50%; }
795
+ .dot.red { background: #ef4444; }
796
+ .dot.yellow { background: #eab308; }
797
+ .dot.green { background: #22c55e; }
798
+ .terminal-body {
799
+ padding: 1rem;
800
+ font-family: monospace;
801
+ font-size: 0.875rem;
802
+ text-align: left;
803
+ line-height: 1.6;
804
+ }
805
+ .dim { color: var(--muted); }
806
+ .green { color: var(--primary); }
807
+
808
+ /* Features */
809
+ .features {
810
+ padding: 6rem 1.5rem;
811
+ max-width: 1200px;
812
+ margin: 0 auto;
813
+ }
814
+ .features-title {
815
+ font-size: 2rem;
816
+ font-weight: 700;
817
+ text-align: center;
818
+ margin-bottom: 1rem;
819
+ }
820
+ .features-subtitle {
821
+ text-align: center;
822
+ color: var(--muted);
823
+ margin-bottom: 3rem;
824
+ }
825
+ .features-grid {
826
+ display: grid;
827
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
828
+ gap: 1.5rem;
829
+ }
830
+ .feature-card {
831
+ background: var(--card);
832
+ border: 1px solid var(--border);
833
+ border-radius: 12px;
834
+ padding: 1.5rem;
835
+ transition: border-color 0.2s;
836
+ }
837
+ .feature-card:hover { border-color: var(--primary); }
838
+ .feature-icon { font-size: 2rem; margin-bottom: 1rem; display: block; }
839
+ .feature-title { font-weight: 600; margin-bottom: 0.5rem; }
840
+ .feature-desc { color: var(--muted); font-size: 0.875rem; line-height: 1.6; }
841
+
842
+ /* Footer */
843
+ .footer {
844
+ border-top: 1px solid var(--border);
845
+ padding: 2rem 1.5rem;
846
+ }
847
+ .footer-inner {
848
+ max-width: 1200px;
849
+ margin: 0 auto;
850
+ display: flex;
851
+ justify-content: space-between;
852
+ align-items: center;
853
+ flex-wrap: wrap;
854
+ gap: 1rem;
855
+ font-size: 0.875rem;
856
+ color: var(--muted);
857
+ }
858
+ .footer-links { display: flex; gap: 1.5rem; }
859
+ .footer-links a:hover { color: var(--fg); }
808
860
  `,
809
861
 
810
862
  // ============================================================================
@@ -978,73 +1030,30 @@ export default {
978
1030
  `,
979
1031
 
980
1032
  // ============================================================================
981
- // Components
1033
+ // Components - Simple Landing Page
982
1034
  // ============================================================================
983
1035
 
984
1036
  'components/Hero.tsx': () => `import React from 'react';
985
- import { Button, Badge, Card } from '@flexireact/flexi-ui';
986
- import { Github, ArrowRight, Sparkles } from 'lucide-react';
1037
+ import { Button, Badge } from '@flexireact/flexi-ui';
987
1038
 
988
1039
  export function Hero() {
989
1040
  return (
990
- <section className="hero-section">
991
- <div className="hero-bg">
992
- <div className="hero-glow hero-glow-1" />
993
- <div className="hero-glow hero-glow-2" />
994
- <div className="hero-glow hero-glow-3" />
995
- </div>
996
- <div className="hero-grid" />
997
-
998
- <div className="container mx-auto px-6 py-32 max-w-6xl">
999
- <div className="flex flex-col items-center text-center">
1000
- <div className="animate-fade-in">
1001
- <Badge variant="success" className="mb-8 px-4 py-2 text-sm">
1002
- <Sparkles className="w-4 h-4 mr-2" />
1003
- The Modern React Framework
1004
- </Badge>
1005
- </div>
1006
-
1007
- <h1 className="hero-title animate-fade-up">
1008
- Build <span className="hero-gradient">beautiful</span>
1009
- <br />
1010
- apps faster
1011
- </h1>
1012
-
1013
- <p className="hero-subtitle animate-fade-up">
1014
- Flexi UI is a stunning component library with neon emerald accents,
1015
- dark-first design, and seamless React integration.
1016
- </p>
1017
-
1018
- <div className="hero-buttons animate-fade-up">
1019
- <Button size="lg" className="gap-2 px-8 py-4">
1020
- Get Started
1021
- <ArrowRight className="w-5 h-5" />
1022
- </Button>
1023
- <Button variant="outline" size="lg" className="gap-2 px-8 py-4">
1024
- <Github className="w-5 h-5" />
1025
- GitHub
1026
- </Button>
1027
- </div>
1028
-
1029
- <Card className="terminal-card animate-scale-in">
1030
- <div className="p-6">
1031
- <div className="terminal-dots">
1032
- <div className="dot dot-red" />
1033
- <div className="dot dot-yellow" />
1034
- <div className="dot dot-green" />
1035
- <span className="terminal-label">terminal</span>
1036
- </div>
1037
- <pre className="terminal-code">
1038
- <code>
1039
- <span className="dim">$</span> <span className="green">npm</span> install @flexireact/flexi-ui
1040
- <br />
1041
- <span className="dim">$</span> <span className="green">npx</span> create-flexireact my-app
1042
- <br /><br />
1043
- <span className="green">✓</span> Ready in <span className="green">38ms</span>
1044
- </code>
1045
- </pre>
1046
- </div>
1047
- </Card>
1041
+ <section className="hero">
1042
+ <div className="hero-glow" />
1043
+ <div className="hero-content">
1044
+ <Badge variant="success" className="mb-6">
1045
+ Flexi UI Components
1046
+ </Badge>
1047
+ <h1 className="hero-title">
1048
+ Build <span className="gradient-text">beautiful</span> apps
1049
+ </h1>
1050
+ <p className="hero-subtitle">
1051
+ A stunning component library with neon emerald accents,
1052
+ dark-first design, and seamless React integration.
1053
+ </p>
1054
+ <div className="hero-buttons">
1055
+ <Button size="lg">Get Started</Button>
1056
+ <Button variant="outline" size="lg">GitHub</Button>
1048
1057
  </div>
1049
1058
  </div>
1050
1059
  </section>
@@ -1053,267 +1062,27 @@ export function Hero() {
1053
1062
  `,
1054
1063
 
1055
1064
  'components/Features.tsx': () => `import React from 'react';
1056
- import { Card, Badge } from '@flexireact/flexi-ui';
1057
- import { Zap, Folder, Sparkles, Server, Palette, Shield } from 'lucide-react';
1065
+ import { Card } from '@flexireact/flexi-ui';
1058
1066
 
1059
1067
  const features = [
1060
- {
1061
- icon: Zap,
1062
- title: 'Lightning Fast',
1063
- description: 'Powered by esbuild for instant builds and sub-second hot module replacement.',
1064
- badge: 'Performance',
1065
- },
1066
- {
1067
- icon: Folder,
1068
- title: 'File-based Routing',
1069
- description: 'Create a file in pages/, get a route automatically. Simple and intuitive.',
1070
- badge: 'DX',
1071
- },
1072
- {
1073
- icon: Sparkles,
1074
- title: 'Islands Architecture',
1075
- description: 'Partial hydration for minimal JavaScript. Only hydrate what needs interactivity.',
1076
- badge: 'Modern',
1077
- },
1078
- {
1079
- icon: Server,
1080
- title: 'SSR & SSG',
1081
- description: 'Server-side rendering and static generation out of the box. SEO friendly.',
1082
- badge: 'SEO',
1083
- },
1084
- {
1085
- icon: Palette,
1086
- title: 'Beautiful Design',
1087
- description: 'Neon emerald accents with dark-first design. Stunning out of the box.',
1088
- badge: 'UI',
1089
- },
1090
- {
1091
- icon: Shield,
1092
- title: 'Type Safe',
1093
- description: 'Full TypeScript support with strict type checking and excellent DX.',
1094
- badge: 'TypeScript',
1095
- },
1068
+ { icon: '⚡', title: 'Fast', desc: 'Powered by esbuild.' },
1069
+ { icon: '📁', title: 'File Routing', desc: 'Automatic routes.' },
1070
+ { icon: '🏝️', title: 'Islands', desc: 'Partial hydration.' },
1071
+ { icon: '🎨', title: 'Beautiful', desc: 'Dark mode first.' },
1096
1072
  ];
1097
1073
 
1098
1074
  export function Features() {
1099
1075
  return (
1100
- <section className="py-32 px-6">
1101
- <div className="container mx-auto max-w-6xl">
1102
- {/* Section Header */}
1103
- <div className="text-center mb-20">
1104
- <Badge variant="outline" className="mb-6">Features</Badge>
1105
- <h2 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
1106
- Everything you need
1107
- </h2>
1108
- <p className="text-xl text-[#94a3b8] max-w-2xl mx-auto">
1109
- A complete toolkit for building modern web applications with React and Flexi UI.
1110
- </p>
1111
- </div>
1112
-
1113
- {/* Feature Grid */}
1114
- <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
1115
- {features.map((feature, index) => (
1116
- <Card
1117
- key={index}
1118
- className="group p-8 feature-card"
1119
- style={{ animationDelay: (index * 0.1) + 's' }}
1120
- >
1121
- <div className="flex items-start gap-4">
1122
- <div className="feature-icon">
1123
- <feature.icon className="w-6 h-6" />
1124
- </div>
1125
- <div className="flex-1">
1126
- <div className="flex items-center gap-2 mb-2">
1127
- <h3 className="text-lg font-semibold">{feature.title}</h3>
1128
- </div>
1129
- <p className="text-[#94a3b8] text-sm leading-relaxed">
1130
- {feature.description}
1131
- </p>
1132
- </div>
1133
- </div>
1134
- </Card>
1135
- ))}
1136
- </div>
1137
- </div>
1138
- </section>
1139
- );
1140
- }
1141
- `,
1142
-
1143
- 'components/Showcase.tsx': () => `import React from 'react';
1144
- import {
1145
- Button,
1146
- Card,
1147
- Badge,
1148
- Input,
1149
- Checkbox,
1150
- Switch,
1151
- Progress,
1152
- Spinner,
1153
- Avatar,
1154
- Separator
1155
- } from '@flexireact/flexi-ui';
1156
- import { Mail, Lock, User, Search, Heart, Star, Check } from 'lucide-react';
1157
-
1158
- export function Showcase() {
1159
- return (
1160
- <section className="py-32 px-6 relative">
1161
- {/* Background Gradient */}
1162
- <div className="absolute inset-0 -z-10">
1163
- <div className="absolute top-1/2 left-1/4 w-[500px] h-[500px] rounded-full bg-gradient-radial from-[#00FF9C]/10 to-transparent blur-3xl" />
1164
- </div>
1165
-
1166
- <div className="container mx-auto max-w-6xl">
1167
- {/* Section Header */}
1168
- <div className="text-center mb-20">
1169
- <Badge variant="success" className="mb-6">Components</Badge>
1170
- <h2 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
1171
- Beautiful by default
1172
- </h2>
1173
- <p className="text-xl text-[#94a3b8] max-w-2xl mx-auto">
1174
- 23+ components designed with attention to detail. Dark mode first, accessible, and customizable.
1175
- </p>
1176
- </div>
1177
-
1178
- {/* Component Showcase Grid */}
1179
- <div className="grid lg:grid-cols-2 gap-8">
1180
- {/* Buttons Card */}
1181
- <Card className="p-8">
1182
- <h3 className="text-lg font-semibold mb-6 flex items-center gap-2">
1183
- <span className="w-2 h-2 rounded-full bg-[#00FF9C]" />
1184
- Buttons
1185
- </h3>
1186
- <div className="flex flex-wrap gap-3">
1187
- <Button>Primary</Button>
1188
- <Button variant="secondary">Secondary</Button>
1189
- <Button variant="outline">Outline</Button>
1190
- <Button variant="ghost">Ghost</Button>
1191
- <Button variant="danger">Danger</Button>
1192
- <Button variant="link">Link</Button>
1193
- </div>
1194
- <Separator className="my-6" />
1195
- <div className="flex flex-wrap gap-3">
1196
- <Button size="sm">Small</Button>
1197
- <Button size="md">Medium</Button>
1198
- <Button size="lg">Large</Button>
1199
- </div>
1200
- <Separator className="my-6" />
1201
- <div className="flex flex-wrap gap-3">
1202
- <Button loading>Loading</Button>
1203
- <Button disabled>Disabled</Button>
1204
- <Button className="gap-2">
1205
- <Heart className="w-4 h-4" /> With Icon
1206
- </Button>
1207
- </div>
1208
- </Card>
1209
-
1210
- {/* Inputs Card */}
1211
- <Card className="p-8">
1212
- <h3 className="text-lg font-semibold mb-6 flex items-center gap-2">
1213
- <span className="w-2 h-2 rounded-full bg-[#00FF9C]" />
1214
- Inputs
1215
- </h3>
1216
- <div className="space-y-4">
1217
- <Input
1218
- label="Email"
1219
- placeholder="you@example.com"
1220
- type="email"
1221
- />
1222
- <Input
1223
- label="Password"
1224
- placeholder="Enter password"
1225
- type="password"
1226
- />
1227
- <Input
1228
- label="Search"
1229
- placeholder="Search..."
1230
- />
1231
- <Input
1232
- label="With Error"
1233
- placeholder="Invalid input"
1234
- error
1235
- helperText="This field is required"
1236
- />
1237
- </div>
1238
- </Card>
1239
-
1240
- {/* Badges Card */}
1241
- <Card className="p-8">
1242
- <h3 className="text-lg font-semibold mb-6 flex items-center gap-2">
1243
- <span className="w-2 h-2 rounded-full bg-[#00FF9C]" />
1244
- Badges & Status
1245
- </h3>
1246
- <div className="flex flex-wrap gap-3 mb-6">
1247
- <Badge>Default</Badge>
1248
- <Badge variant="success">Success</Badge>
1249
- <Badge variant="warning">Warning</Badge>
1250
- <Badge variant="danger">Danger</Badge>
1251
- <Badge variant="outline">Outline</Badge>
1252
- </div>
1253
- <Separator className="my-6" />
1254
- <h4 className="text-sm font-medium mb-4 text-[#94a3b8]">Progress</h4>
1255
- <div className="space-y-4">
1256
- <Progress value={25} />
1257
- <Progress value={50} />
1258
- <Progress value={75} />
1259
- <Progress value={100} />
1260
- </div>
1076
+ <section className="features">
1077
+ <h2 className="features-title">Features</h2>
1078
+ <div className="features-grid">
1079
+ {features.map((f, i) => (
1080
+ <Card key={i} className="feature-card">
1081
+ <span className="feature-icon">{f.icon}</span>
1082
+ <h3>{f.title}</h3>
1083
+ <p>{f.desc}</p>
1261
1084
  </Card>
1262
-
1263
- {/* Form Controls Card */}
1264
- <Card className="p-8">
1265
- <h3 className="text-lg font-semibold mb-6 flex items-center gap-2">
1266
- <span className="w-2 h-2 rounded-full bg-[#00FF9C]" />
1267
- Form Controls
1268
- </h3>
1269
- <div className="space-y-6">
1270
- <div className="flex items-center gap-4">
1271
- <Checkbox id="terms" />
1272
- <label htmlFor="terms" className="text-sm">Accept terms and conditions</label>
1273
- </div>
1274
- <div className="flex items-center gap-4">
1275
- <Checkbox id="newsletter" defaultChecked />
1276
- <label htmlFor="newsletter" className="text-sm">Subscribe to newsletter</label>
1277
- </div>
1278
- <Separator />
1279
- <div className="flex items-center justify-between">
1280
- <span className="text-sm">Dark Mode</span>
1281
- <Switch defaultChecked />
1282
- </div>
1283
- <div className="flex items-center justify-between">
1284
- <span className="text-sm">Notifications</span>
1285
- <Switch />
1286
- </div>
1287
- <Separator />
1288
- <div className="flex items-center gap-4">
1289
- <Spinner size="sm" />
1290
- <Spinner />
1291
- <Spinner size="lg" />
1292
- </div>
1293
- </div>
1294
- </Card>
1295
- </div>
1296
-
1297
- {/* Avatars Row */}
1298
- <Card className="p-8 mt-8">
1299
- <h3 className="text-lg font-semibold mb-6 flex items-center gap-2">
1300
- <span className="w-2 h-2 rounded-full bg-[#00FF9C]" />
1301
- Avatars
1302
- </h3>
1303
- <div className="flex items-center gap-4 flex-wrap">
1304
- <Avatar size="sm" fallback="JD" />
1305
- <Avatar fallback="AB" />
1306
- <Avatar size="lg" fallback="CD" />
1307
- <Avatar size="xl" fallback="EF" />
1308
- <Separator orientation="vertical" className="h-12 mx-4" />
1309
- <div className="flex -space-x-3">
1310
- <Avatar fallback="A" className="ring-2 ring-[#0a0a0a]" />
1311
- <Avatar fallback="B" className="ring-2 ring-[#0a0a0a]" />
1312
- <Avatar fallback="C" className="ring-2 ring-[#0a0a0a]" />
1313
- <Avatar fallback="+5" className="ring-2 ring-[#0a0a0a]" />
1314
- </div>
1315
- </div>
1316
- </Card>
1085
+ ))}
1317
1086
  </div>
1318
1087
  </section>
1319
1088
  );
@@ -1321,51 +1090,12 @@ export function Showcase() {
1321
1090
  `,
1322
1091
 
1323
1092
  'components/Footer.tsx': () => `import React from 'react';
1324
- import { Separator } from '@flexireact/flexi-ui';
1325
- import { Github, Twitter, Heart } from 'lucide-react';
1326
1093
 
1327
1094
  export function Footer() {
1328
1095
  return (
1329
- <footer className="border-t border-[#1e293b]">
1330
- <div className="container mx-auto max-w-6xl px-6 py-12">
1331
- <div className="flex flex-col md:flex-row items-center justify-between gap-6">
1332
- {/* Logo & Copyright */}
1333
- <div className="flex items-center gap-3">
1334
- <div className="w-8 h-8 rounded-lg bg-gradient-to-br from-[#00FF9C] to-emerald-400 flex items-center justify-center">
1335
- <span className="text-black font-bold text-sm">F</span>
1336
- </div>
1337
- <span className="text-[#94a3b8] text-sm">
1338
- Built with <Heart className="w-4 h-4 inline text-red-500 mx-1" /> using{' '}
1339
- <a href="https://github.com/flexireact/flexi-ui" className="text-[#00FF9C] hover:underline">
1340
- Flexi UI
1341
- </a>
1342
- </span>
1343
- </div>
1344
-
1345
- {/* Links */}
1346
- <div className="flex items-center gap-6">
1347
- <a
1348
- href="https://github.com/flexireact/flexi-ui"
1349
- className="text-[#94a3b8] hover:text-white transition-colors flex items-center gap-2 text-sm"
1350
- >
1351
- <Github className="w-4 h-4" />
1352
- GitHub
1353
- </a>
1354
- <a
1355
- href="https://github.com/flexireact/flexireact"
1356
- className="text-[#94a3b8] hover:text-white transition-colors text-sm"
1357
- >
1358
- Documentation
1359
- </a>
1360
- <a
1361
- href="https://github.com/flexireact/flexi-ui"
1362
- className="text-[#94a3b8] hover:text-white transition-colors text-sm"
1363
- >
1364
- Components
1365
- </a>
1366
- </div>
1367
- </div>
1368
- </div>
1096
+ <footer className="footer">
1097
+ <span>Built with Flexi UI</span>
1098
+ <a href="https://github.com/flexireact/flexi-ui">GitHub</a>
1369
1099
  </footer>
1370
1100
  );
1371
1101
  }
@@ -1373,43 +1103,20 @@ export function Footer() {
1373
1103
 
1374
1104
  'components/Navbar.tsx': () => `import React from 'react';
1375
1105
  import { Button, Badge } from '@flexireact/flexi-ui';
1376
- import { Github, Menu } from 'lucide-react';
1377
1106
 
1378
1107
  export function Navbar() {
1379
1108
  return (
1380
- <header className="fixed top-0 left-0 right-0 z-50 border-b border-[#1e293b]/50 bg-[#0a0a0a]/80 backdrop-blur-xl">
1381
- <nav className="container mx-auto max-w-6xl px-6 h-16 flex items-center justify-between">
1382
- {/* Logo */}
1383
- <a href="/" className="flex items-center gap-3 group">
1384
- <div className="w-9 h-9 rounded-xl bg-gradient-to-br from-[#00FF9C] to-emerald-400 flex items-center justify-center shadow-lg shadow-[#00FF9C]/20 group-hover:shadow-[#00FF9C]/40 transition-shadow">
1385
- <span className="text-black font-black text-lg">F</span>
1386
- </div>
1387
- <span className="text-lg font-bold">Flexi UI</span>
1388
- <Badge variant="outline" className="hidden sm:flex text-xs">v1.0</Badge>
1109
+ <header className="navbar">
1110
+ <nav className="navbar-inner">
1111
+ <a href="/" className="logo">
1112
+ <span className="logo-icon">F</span>
1113
+ <span className="logo-text">Flexi UI</span>
1114
+ <Badge variant="outline" className="ml-2">v1.0</Badge>
1389
1115
  </a>
1390
-
1391
- {/* Desktop Nav */}
1392
- <div className="hidden md:flex items-center gap-2">
1393
- <Button variant="ghost" size="sm">
1394
- <a href="https://github.com/flexireact/flexi-ui">Docs</a>
1395
- </Button>
1396
- <Button variant="ghost" size="sm">
1397
- <a href="https://github.com/flexireact/flexi-ui">Components</a>
1398
- </Button>
1399
- <Button variant="ghost" size="sm">
1400
- <a href="https://github.com/flexireact/flexireact">FlexiReact</a>
1401
- </Button>
1402
- <div className="w-px h-6 bg-[#1e293b] mx-2" />
1403
- <Button variant="outline" size="sm" className="gap-2">
1404
- <Github className="w-4 h-4" />
1405
- <a href="https://github.com/flexireact/flexi-ui">GitHub</a>
1406
- </Button>
1116
+ <div className="nav-links">
1117
+ <Button variant="ghost" size="sm">Docs</Button>
1118
+ <Button variant="outline" size="sm">GitHub</Button>
1407
1119
  </div>
1408
-
1409
- {/* Mobile Menu Button */}
1410
- <Button variant="ghost" size="sm" className="md:hidden">
1411
- <Menu className="w-5 h-5" />
1412
- </Button>
1413
1120
  </nav>
1414
1121
  </header>
1415
1122
  );
@@ -1418,7 +1125,6 @@ export function Navbar() {
1418
1125
 
1419
1126
  'components/index.ts': () => `export { Hero } from './Hero';
1420
1127
  export { Features } from './Features';
1421
- export { Showcase } from './Showcase';
1422
1128
  export { Footer } from './Footer';
1423
1129
  export { Navbar } from './Navbar';
1424
1130
  `,
@@ -1452,14 +1158,12 @@ export default function RootLayout({ children }: LayoutProps) {
1452
1158
  'pages/index.tsx': () => `import React from 'react';
1453
1159
  import { Hero } from '../components/Hero';
1454
1160
  import { Features } from '../components/Features';
1455
- import { Showcase } from '../components/Showcase';
1456
1161
 
1457
1162
  export default function HomePage() {
1458
1163
  return (
1459
1164
  <>
1460
1165
  <Hero />
1461
1166
  <Features />
1462
- <Showcase />
1463
1167
  </>
1464
1168
  );
1465
1169
  }
@@ -1473,264 +1177,145 @@ export default function HomePage() {
1473
1177
  @tailwind components;
1474
1178
  @tailwind utilities;
1475
1179
 
1476
- @layer base {
1477
- :root {
1478
- --flexi-bg: #0a0a0a;
1479
- --flexi-fg: #fafafa;
1480
- --flexi-primary: #00FF9C;
1481
- --flexi-primary-fg: #000000;
1482
- --flexi-muted: #94a3b8;
1483
- --flexi-border: #1e293b;
1484
- --flexi-card: #0f0f0f;
1485
- }
1486
-
1487
- * {
1488
- border-color: var(--flexi-border);
1489
- }
1490
-
1491
- html {
1492
- scroll-behavior: smooth;
1493
- }
1494
-
1495
- body {
1496
- font-family: 'Inter', system-ui, -apple-system, sans-serif;
1497
- background-color: var(--flexi-bg);
1498
- color: var(--flexi-fg);
1499
- min-height: 100vh;
1500
- -webkit-font-smoothing: antialiased;
1501
- -moz-osx-font-smoothing: grayscale;
1502
- }
1503
-
1504
- ::selection {
1505
- background-color: rgba(0, 255, 156, 0.3);
1506
- color: white;
1507
- }
1180
+ :root {
1181
+ --bg: #0a0a0a;
1182
+ --fg: #fafafa;
1183
+ --primary: #00FF9C;
1184
+ --muted: #94a3b8;
1185
+ --border: #1e293b;
1186
+ --card: #0f0f0f;
1508
1187
  }
1509
1188
 
1510
- @layer utilities {
1511
- .bg-gradient-radial {
1512
- background: radial-gradient(circle, var(--tw-gradient-stops));
1513
- }
1514
-
1515
- .text-balance {
1516
- text-wrap: balance;
1517
- }
1518
-
1519
- /* Custom scrollbar */
1520
- ::-webkit-scrollbar {
1521
- width: 8px;
1522
- height: 8px;
1523
- }
1524
-
1525
- ::-webkit-scrollbar-track {
1526
- background: #0a0a0a;
1527
- }
1528
-
1529
- ::-webkit-scrollbar-thumb {
1530
- background: #1e293b;
1531
- border-radius: 4px;
1532
- }
1533
-
1534
- ::-webkit-scrollbar-thumb:hover {
1535
- background: #334155;
1536
- }
1537
- }
1538
-
1539
- /* Animation utilities */
1540
- .animate-fade-in {
1541
- animation: fadeIn 0.6s ease-out forwards;
1542
- opacity: 0;
1543
- }
1544
-
1545
- .animate-fade-up {
1546
- animation: fadeUp 0.6s ease-out forwards;
1547
- opacity: 0;
1548
- }
1549
-
1550
- .animate-scale-in {
1551
- animation: scaleIn 0.4s ease-out forwards;
1552
- opacity: 0;
1553
- }
1554
-
1555
- @keyframes fadeIn {
1556
- from { opacity: 0; }
1557
- to { opacity: 1; }
1558
- }
1559
-
1560
- @keyframes fadeUp {
1561
- from {
1562
- opacity: 0;
1563
- transform: translateY(30px);
1564
- }
1565
- to {
1566
- opacity: 1;
1567
- transform: translateY(0);
1568
- }
1569
- }
1189
+ * { box-sizing: border-box; margin: 0; padding: 0; }
1570
1190
 
1571
- @keyframes scaleIn {
1572
- from {
1573
- opacity: 0;
1574
- transform: scale(0.9);
1575
- }
1576
- to {
1577
- opacity: 1;
1578
- transform: scale(1);
1579
- }
1580
- }
1581
-
1582
- /* Feature card styles */
1583
- .feature-card {
1584
- transition: all 0.3s;
1585
- cursor: default;
1586
- animation: fadeUp 0.6s ease-out forwards;
1587
- opacity: 0;
1191
+ body {
1192
+ font-family: 'Inter', system-ui, sans-serif;
1193
+ background: var(--bg);
1194
+ color: var(--fg);
1195
+ min-height: 100vh;
1588
1196
  }
1589
1197
 
1590
- .feature-card:hover {
1591
- border-color: rgba(0, 255, 156, 0.5);
1592
- box-shadow: 0 0 30px rgba(0, 255, 156, 0.1);
1593
- }
1198
+ a { color: inherit; text-decoration: none; }
1594
1199
 
1595
- .feature-icon {
1596
- padding: 0.75rem;
1597
- border-radius: 0.75rem;
1598
- background-color: rgba(0, 255, 156, 0.1);
1599
- color: #00FF9C;
1600
- transition: all 0.3s;
1200
+ /* Navbar */
1201
+ .navbar {
1202
+ position: fixed;
1203
+ top: 0;
1204
+ left: 0;
1205
+ right: 0;
1206
+ z-index: 50;
1207
+ border-bottom: 1px solid var(--border);
1208
+ background: rgba(10,10,10,0.8);
1209
+ backdrop-filter: blur(12px);
1210
+ }
1211
+ .navbar-inner {
1212
+ max-width: 1200px;
1213
+ margin: 0 auto;
1214
+ padding: 1rem 1.5rem;
1215
+ display: flex;
1216
+ justify-content: space-between;
1217
+ align-items: center;
1601
1218
  }
1602
-
1603
- .group:hover .feature-icon {
1604
- background-color: #00FF9C;
1605
- color: black;
1219
+ .logo { display: flex; align-items: center; gap: 0.5rem; }
1220
+ .logo-icon {
1221
+ width: 32px;
1222
+ height: 32px;
1223
+ background: linear-gradient(135deg, var(--primary), #10b981);
1224
+ border-radius: 8px;
1225
+ display: flex;
1226
+ align-items: center;
1227
+ justify-content: center;
1228
+ font-weight: 900;
1229
+ color: #000;
1606
1230
  }
1231
+ .logo-text { font-weight: 700; }
1232
+ .nav-links { display: flex; gap: 0.5rem; }
1607
1233
 
1608
- /* Hero section styles */
1609
- .hero-section {
1234
+ /* Hero */
1235
+ .hero {
1610
1236
  position: relative;
1611
1237
  min-height: 100vh;
1612
1238
  display: flex;
1613
1239
  align-items: center;
1614
1240
  justify-content: center;
1615
- overflow: hidden;
1616
- }
1617
-
1618
- .hero-bg {
1619
- position: absolute;
1620
- inset: 0;
1621
- z-index: -10;
1241
+ padding-top: 4rem;
1622
1242
  }
1623
-
1624
1243
  .hero-glow {
1625
1244
  position: absolute;
1626
- border-radius: 9999px;
1627
- filter: blur(64px);
1628
- }
1629
-
1630
- .hero-glow-1 {
1631
1245
  top: 50%;
1632
1246
  left: 50%;
1633
1247
  transform: translate(-50%, -50%);
1634
- width: 800px;
1635
- height: 800px;
1636
- background: radial-gradient(circle, rgba(0,255,156,0.2), rgba(0,255,156,0.05), transparent);
1637
- }
1638
-
1639
- .hero-glow-2 {
1640
- top: 0;
1641
- right: 0;
1642
1248
  width: 600px;
1643
1249
  height: 600px;
1644
- background: radial-gradient(circle, rgba(6,182,212,0.1), transparent);
1250
+ background: radial-gradient(circle, rgba(0,255,156,0.15), transparent 70%);
1251
+ pointer-events: none;
1645
1252
  }
1646
-
1647
- .hero-glow-3 {
1648
- bottom: 0;
1649
- left: 0;
1650
- width: 400px;
1651
- height: 400px;
1652
- background: radial-gradient(circle, rgba(16,185,129,0.1), transparent);
1253
+ .hero-content {
1254
+ text-align: center;
1255
+ padding: 2rem;
1256
+ max-width: 800px;
1653
1257
  }
1654
-
1655
- .hero-grid {
1656
- position: absolute;
1657
- inset: 0;
1658
- z-index: -10;
1659
- background-image:
1660
- linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
1661
- linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
1662
- background-size: 64px 64px;
1663
- }
1664
-
1665
1258
  .hero-title {
1666
- font-size: clamp(3rem, 8vw, 5rem);
1667
- font-weight: 900;
1668
- letter-spacing: -0.02em;
1669
- margin-bottom: 2rem;
1259
+ font-size: clamp(2.5rem, 6vw, 4rem);
1260
+ font-weight: 800;
1670
1261
  line-height: 1.1;
1262
+ margin-bottom: 1.5rem;
1671
1263
  }
1672
-
1673
- .hero-gradient {
1674
- background: linear-gradient(to right, #00FF9C, #34d399, #22d3ee);
1264
+ .gradient-text {
1265
+ background: linear-gradient(90deg, var(--primary), #10b981);
1675
1266
  -webkit-background-clip: text;
1676
1267
  -webkit-text-fill-color: transparent;
1677
- background-clip: text;
1678
1268
  }
1679
-
1680
1269
  .hero-subtitle {
1681
- font-size: 1.25rem;
1682
- color: #94a3b8;
1683
- max-width: 42rem;
1684
- margin-bottom: 3rem;
1270
+ font-size: 1.125rem;
1271
+ color: var(--muted);
1685
1272
  line-height: 1.7;
1273
+ margin-bottom: 2rem;
1686
1274
  }
1687
-
1688
1275
  .hero-buttons {
1689
1276
  display: flex;
1690
- flex-wrap: wrap;
1691
- align-items: center;
1692
- justify-content: center;
1693
1277
  gap: 1rem;
1694
- margin-bottom: 5rem;
1695
- }
1696
-
1697
- /* Terminal styles */
1698
- .terminal-card {
1699
- width: 100%;
1700
- max-width: 42rem;
1278
+ justify-content: center;
1701
1279
  }
1702
1280
 
1703
- .terminal-dots {
1704
- display: flex;
1705
- align-items: center;
1706
- gap: 0.5rem;
1707
- margin-bottom: 1rem;
1281
+ /* Features */
1282
+ .features {
1283
+ padding: 6rem 1.5rem;
1284
+ max-width: 1200px;
1285
+ margin: 0 auto;
1708
1286
  }
1709
-
1710
- .dot {
1711
- width: 12px;
1712
- height: 12px;
1713
- border-radius: 50%;
1287
+ .features-title {
1288
+ font-size: 2rem;
1289
+ font-weight: 700;
1290
+ text-align: center;
1291
+ margin-bottom: 3rem;
1714
1292
  }
1715
-
1716
- .dot-red { background-color: rgba(239,68,68,0.8); }
1717
- .dot-yellow { background-color: rgba(234,179,8,0.8); }
1718
- .dot-green { background-color: rgba(34,197,94,0.8); }
1719
-
1720
- .terminal-label {
1721
- margin-left: 0.75rem;
1722
- font-size: 0.75rem;
1723
- color: #64748b;
1293
+ .features-grid {
1294
+ display: grid;
1295
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1296
+ gap: 1.5rem;
1724
1297
  }
1725
-
1726
- .terminal-code {
1727
- text-align: left;
1298
+ .feature-card {
1299
+ padding: 1.5rem;
1300
+ text-align: center;
1301
+ }
1302
+ .feature-card:hover { border-color: var(--primary); }
1303
+ .feature-icon { font-size: 2rem; margin-bottom: 1rem; }
1304
+ .feature-card h3 { font-weight: 600; margin-bottom: 0.5rem; }
1305
+ .feature-card p { color: var(--muted); font-size: 0.875rem; }
1306
+
1307
+ /* Footer */
1308
+ .footer {
1309
+ border-top: 1px solid var(--border);
1310
+ padding: 2rem 1.5rem;
1311
+ display: flex;
1312
+ justify-content: space-between;
1313
+ max-width: 1200px;
1314
+ margin: 0 auto;
1315
+ color: var(--muted);
1728
1316
  font-size: 0.875rem;
1729
- font-family: ui-monospace, monospace;
1730
1317
  }
1731
-
1732
- .dim { color: #64748b; }
1733
- .green { color: #00FF9C; }
1318
+ .footer a:hover { color: var(--primary); }
1734
1319
  `,
1735
1320
 
1736
1321
  // ============================================================================