create-flexireact 1.2.2 → 1.3.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.
- package/index.js +487 -845
- 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
|
|
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="
|
|
479
|
-
<nav className="
|
|
480
|
-
<a href="/" className="
|
|
481
|
-
<div className="
|
|
482
|
-
|
|
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
|
-
|
|
490
|
-
<
|
|
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="
|
|
515
|
-
|
|
516
|
-
<div className="
|
|
517
|
-
<
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
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
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
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
|
-
|
|
566
|
-
|
|
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
|
-
|
|
599
|
-
|
|
600
|
-
|
|
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="
|
|
638
|
-
<
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
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="
|
|
670
|
-
<div className="
|
|
671
|
-
<
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
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>
|
|
@@ -727,7 +616,7 @@ interface LayoutProps {
|
|
|
727
616
|
|
|
728
617
|
export default function RootLayout({ children }: LayoutProps) {
|
|
729
618
|
return (
|
|
730
|
-
<div className="
|
|
619
|
+
<div className="app">
|
|
731
620
|
<Navbar />
|
|
732
621
|
<main>{children}</main>
|
|
733
622
|
<Footer />
|
|
@@ -754,56 +643,276 @@ export default function HomePage() {
|
|
|
754
643
|
// Styles
|
|
755
644
|
// ============================================================================
|
|
756
645
|
|
|
757
|
-
'app/styles/globals.css': () =>
|
|
758
|
-
@tailwind components;
|
|
759
|
-
@tailwind utilities;
|
|
646
|
+
'app/styles/globals.css': () => `/* FlexiReact Default Template Styles */
|
|
760
647
|
|
|
761
|
-
|
|
762
|
-
:
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
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
|
-
}
|
|
648
|
+
:root {
|
|
649
|
+
--bg: #0a0a0a;
|
|
650
|
+
--fg: #fafafa;
|
|
651
|
+
--primary: #10b981;
|
|
652
|
+
--primary-light: #34d399;
|
|
653
|
+
--accent: #06b6d4;
|
|
654
|
+
--muted: #71717a;
|
|
655
|
+
--border: #27272a;
|
|
656
|
+
--card: #18181b;
|
|
657
|
+
}
|
|
784
658
|
|
|
785
|
-
|
|
786
|
-
border-color: hsl(var(--border));
|
|
787
|
-
}
|
|
659
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
788
660
|
|
|
789
|
-
|
|
790
|
-
scroll-behavior: smooth;
|
|
791
|
-
}
|
|
661
|
+
html { scroll-behavior: smooth; }
|
|
792
662
|
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
}
|
|
663
|
+
body {
|
|
664
|
+
font-family: 'Inter', system-ui, -apple-system, sans-serif;
|
|
665
|
+
background: var(--bg);
|
|
666
|
+
color: var(--fg);
|
|
667
|
+
min-height: 100vh;
|
|
668
|
+
-webkit-font-smoothing: antialiased;
|
|
669
|
+
line-height: 1.6;
|
|
801
670
|
}
|
|
802
671
|
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
672
|
+
a { color: inherit; text-decoration: none; transition: color 0.2s; }
|
|
673
|
+
a:hover { color: var(--primary); }
|
|
674
|
+
|
|
675
|
+
/* Layout */
|
|
676
|
+
.app { min-height: 100vh; }
|
|
677
|
+
|
|
678
|
+
/* Navbar */
|
|
679
|
+
.navbar {
|
|
680
|
+
position: sticky;
|
|
681
|
+
top: 0;
|
|
682
|
+
z-index: 50;
|
|
683
|
+
border-bottom: 1px solid var(--border);
|
|
684
|
+
background: rgba(10,10,10,0.85);
|
|
685
|
+
backdrop-filter: blur(12px);
|
|
686
|
+
}
|
|
687
|
+
.navbar-inner {
|
|
688
|
+
max-width: 1200px;
|
|
689
|
+
margin: 0 auto;
|
|
690
|
+
padding: 1rem 1.5rem;
|
|
691
|
+
display: flex;
|
|
692
|
+
justify-content: space-between;
|
|
693
|
+
align-items: center;
|
|
694
|
+
}
|
|
695
|
+
.logo { display: flex; align-items: center; gap: 0.5rem; }
|
|
696
|
+
.logo-icon {
|
|
697
|
+
width: 32px;
|
|
698
|
+
height: 32px;
|
|
699
|
+
background: linear-gradient(135deg, var(--primary), var(--accent));
|
|
700
|
+
border-radius: 8px;
|
|
701
|
+
display: flex;
|
|
702
|
+
align-items: center;
|
|
703
|
+
justify-content: center;
|
|
704
|
+
font-size: 1rem;
|
|
705
|
+
}
|
|
706
|
+
.logo-text { font-weight: 700; font-size: 1.125rem; }
|
|
707
|
+
.nav-links { display: flex; gap: 2rem; }
|
|
708
|
+
.nav-links a { color: var(--muted); font-size: 0.9375rem; font-weight: 500; }
|
|
709
|
+
.nav-links a:hover { color: var(--fg); }
|
|
710
|
+
|
|
711
|
+
/* Hero */
|
|
712
|
+
.hero {
|
|
713
|
+
position: relative;
|
|
714
|
+
min-height: 90vh;
|
|
715
|
+
display: flex;
|
|
716
|
+
align-items: center;
|
|
717
|
+
justify-content: center;
|
|
718
|
+
overflow: hidden;
|
|
719
|
+
padding: 4rem 1.5rem;
|
|
720
|
+
}
|
|
721
|
+
.hero-glow {
|
|
722
|
+
position: absolute;
|
|
723
|
+
top: 50%;
|
|
724
|
+
left: 50%;
|
|
725
|
+
transform: translate(-50%, -50%);
|
|
726
|
+
width: 700px;
|
|
727
|
+
height: 700px;
|
|
728
|
+
background: radial-gradient(circle, rgba(16,185,129,0.12), transparent 70%);
|
|
729
|
+
pointer-events: none;
|
|
730
|
+
}
|
|
731
|
+
.hero-content {
|
|
732
|
+
position: relative;
|
|
733
|
+
z-index: 1;
|
|
734
|
+
text-align: center;
|
|
735
|
+
padding: 2rem;
|
|
736
|
+
max-width: 800px;
|
|
737
|
+
}
|
|
738
|
+
.hero-badge {
|
|
739
|
+
display: inline-flex;
|
|
740
|
+
align-items: center;
|
|
741
|
+
gap: 0.5rem;
|
|
742
|
+
padding: 0.5rem 1.25rem;
|
|
743
|
+
background: rgba(16,185,129,0.1);
|
|
744
|
+
border: 1px solid rgba(16,185,129,0.2);
|
|
745
|
+
border-radius: 9999px;
|
|
746
|
+
font-size: 0.875rem;
|
|
747
|
+
font-weight: 500;
|
|
748
|
+
color: var(--primary);
|
|
749
|
+
margin-bottom: 2rem;
|
|
750
|
+
}
|
|
751
|
+
.hero-title {
|
|
752
|
+
font-size: clamp(2.5rem, 7vw, 4.5rem);
|
|
753
|
+
font-weight: 800;
|
|
754
|
+
line-height: 1.1;
|
|
755
|
+
letter-spacing: -0.02em;
|
|
756
|
+
margin-bottom: 1.5rem;
|
|
757
|
+
}
|
|
758
|
+
.gradient-text {
|
|
759
|
+
background: linear-gradient(135deg, var(--primary), var(--accent));
|
|
760
|
+
-webkit-background-clip: text;
|
|
761
|
+
-webkit-text-fill-color: transparent;
|
|
762
|
+
background-clip: text;
|
|
763
|
+
}
|
|
764
|
+
.hero-subtitle {
|
|
765
|
+
font-size: 1.125rem;
|
|
766
|
+
color: var(--muted);
|
|
767
|
+
line-height: 1.7;
|
|
768
|
+
max-width: 600px;
|
|
769
|
+
margin: 0 auto 2.5rem;
|
|
770
|
+
}
|
|
771
|
+
.hero-buttons {
|
|
772
|
+
display: flex;
|
|
773
|
+
gap: 1rem;
|
|
774
|
+
justify-content: center;
|
|
775
|
+
flex-wrap: wrap;
|
|
776
|
+
margin-bottom: 3rem;
|
|
777
|
+
}
|
|
778
|
+
.btn-primary {
|
|
779
|
+
display: inline-flex;
|
|
780
|
+
align-items: center;
|
|
781
|
+
gap: 0.5rem;
|
|
782
|
+
padding: 0.875rem 2rem;
|
|
783
|
+
background: linear-gradient(135deg, var(--primary), var(--accent));
|
|
784
|
+
color: #000;
|
|
785
|
+
font-weight: 600;
|
|
786
|
+
border-radius: 10px;
|
|
787
|
+
transition: all 0.2s;
|
|
788
|
+
}
|
|
789
|
+
.btn-primary:hover {
|
|
790
|
+
transform: translateY(-2px);
|
|
791
|
+
box-shadow: 0 10px 30px rgba(16,185,129,0.3);
|
|
792
|
+
color: #000;
|
|
793
|
+
}
|
|
794
|
+
.btn-outline {
|
|
795
|
+
display: inline-flex;
|
|
796
|
+
align-items: center;
|
|
797
|
+
gap: 0.5rem;
|
|
798
|
+
padding: 0.875rem 2rem;
|
|
799
|
+
border: 1px solid var(--border);
|
|
800
|
+
border-radius: 10px;
|
|
801
|
+
font-weight: 600;
|
|
802
|
+
transition: all 0.2s;
|
|
803
|
+
}
|
|
804
|
+
.btn-outline:hover {
|
|
805
|
+
border-color: var(--primary);
|
|
806
|
+
background: rgba(16,185,129,0.1);
|
|
807
|
+
color: var(--fg);
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/* Terminal */
|
|
811
|
+
.terminal {
|
|
812
|
+
background: var(--card);
|
|
813
|
+
border: 1px solid var(--border);
|
|
814
|
+
border-radius: 12px;
|
|
815
|
+
max-width: 500px;
|
|
816
|
+
margin: 0 auto;
|
|
817
|
+
overflow: hidden;
|
|
818
|
+
text-align: left;
|
|
819
|
+
}
|
|
820
|
+
.terminal-header {
|
|
821
|
+
padding: 0.875rem 1rem;
|
|
822
|
+
border-bottom: 1px solid var(--border);
|
|
823
|
+
display: flex;
|
|
824
|
+
gap: 0.5rem;
|
|
825
|
+
background: rgba(255,255,255,0.02);
|
|
826
|
+
}
|
|
827
|
+
.dot { width: 12px; height: 12px; border-radius: 50%; }
|
|
828
|
+
.dot.red { background: #ef4444; }
|
|
829
|
+
.dot.yellow { background: #eab308; }
|
|
830
|
+
.dot.green { background: #22c55e; }
|
|
831
|
+
.terminal-body {
|
|
832
|
+
padding: 1.25rem;
|
|
833
|
+
font-family: 'JetBrains Mono', 'Fira Code', monospace;
|
|
834
|
+
font-size: 0.875rem;
|
|
835
|
+
line-height: 1.8;
|
|
836
|
+
}
|
|
837
|
+
.dim { color: var(--muted); }
|
|
838
|
+
.green { color: var(--primary); }
|
|
839
|
+
|
|
840
|
+
/* Features */
|
|
841
|
+
.features {
|
|
842
|
+
padding: 6rem 1.5rem;
|
|
843
|
+
max-width: 1200px;
|
|
844
|
+
margin: 0 auto;
|
|
845
|
+
}
|
|
846
|
+
.features-title {
|
|
847
|
+
font-size: 2rem;
|
|
848
|
+
font-weight: 700;
|
|
849
|
+
text-align: center;
|
|
850
|
+
margin-bottom: 0.75rem;
|
|
851
|
+
}
|
|
852
|
+
.features-subtitle {
|
|
853
|
+
text-align: center;
|
|
854
|
+
color: var(--muted);
|
|
855
|
+
margin-bottom: 3rem;
|
|
856
|
+
font-size: 1.0625rem;
|
|
857
|
+
}
|
|
858
|
+
.features-grid {
|
|
859
|
+
display: grid;
|
|
860
|
+
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
|
861
|
+
gap: 1.5rem;
|
|
862
|
+
}
|
|
863
|
+
.feature-card {
|
|
864
|
+
background: var(--card);
|
|
865
|
+
border: 1px solid var(--border);
|
|
866
|
+
border-radius: 16px;
|
|
867
|
+
padding: 1.75rem;
|
|
868
|
+
transition: all 0.3s;
|
|
869
|
+
}
|
|
870
|
+
.feature-card:hover {
|
|
871
|
+
border-color: var(--primary);
|
|
872
|
+
transform: translateY(-4px);
|
|
873
|
+
}
|
|
874
|
+
.feature-icon {
|
|
875
|
+
font-size: 2rem;
|
|
876
|
+
margin-bottom: 1rem;
|
|
877
|
+
display: block;
|
|
878
|
+
width: 48px;
|
|
879
|
+
height: 48px;
|
|
880
|
+
display: flex;
|
|
881
|
+
align-items: center;
|
|
882
|
+
justify-content: center;
|
|
883
|
+
background: rgba(16,185,129,0.1);
|
|
884
|
+
border-radius: 12px;
|
|
885
|
+
}
|
|
886
|
+
.feature-title { font-weight: 600; font-size: 1.0625rem; margin-bottom: 0.5rem; }
|
|
887
|
+
.feature-desc { color: var(--muted); font-size: 0.9375rem; line-height: 1.6; }
|
|
888
|
+
|
|
889
|
+
/* Footer */
|
|
890
|
+
.footer {
|
|
891
|
+
border-top: 1px solid var(--border);
|
|
892
|
+
padding: 2rem 1.5rem;
|
|
893
|
+
margin-top: 2rem;
|
|
894
|
+
}
|
|
895
|
+
.footer-inner {
|
|
896
|
+
max-width: 1200px;
|
|
897
|
+
margin: 0 auto;
|
|
898
|
+
display: flex;
|
|
899
|
+
justify-content: space-between;
|
|
900
|
+
align-items: center;
|
|
901
|
+
flex-wrap: wrap;
|
|
902
|
+
gap: 1rem;
|
|
903
|
+
font-size: 0.875rem;
|
|
904
|
+
color: var(--muted);
|
|
905
|
+
}
|
|
906
|
+
.footer-links { display: flex; gap: 1.5rem; }
|
|
907
|
+
.footer-links a:hover { color: var(--primary); }
|
|
908
|
+
|
|
909
|
+
/* Responsive */
|
|
910
|
+
@media (max-width: 768px) {
|
|
911
|
+
.nav-links { display: none; }
|
|
912
|
+
.hero { min-height: auto; padding: 6rem 1.5rem 4rem; }
|
|
913
|
+
.hero-buttons { flex-direction: column; align-items: center; }
|
|
914
|
+
.btn-primary, .btn-outline { width: 100%; justify-content: center; }
|
|
915
|
+
.footer-inner { flex-direction: column; text-align: center; }
|
|
807
916
|
}
|
|
808
917
|
`,
|
|
809
918
|
|
|
@@ -978,73 +1087,30 @@ export default {
|
|
|
978
1087
|
`,
|
|
979
1088
|
|
|
980
1089
|
// ============================================================================
|
|
981
|
-
// Components
|
|
1090
|
+
// Components - Simple Landing Page
|
|
982
1091
|
// ============================================================================
|
|
983
1092
|
|
|
984
1093
|
'components/Hero.tsx': () => `import React from 'react';
|
|
985
|
-
import { Button, Badge
|
|
986
|
-
import { Github, ArrowRight, Sparkles } from 'lucide-react';
|
|
1094
|
+
import { Button, Badge } from '@flexireact/flexi-ui';
|
|
987
1095
|
|
|
988
1096
|
export function Hero() {
|
|
989
1097
|
return (
|
|
990
|
-
<section className="hero
|
|
991
|
-
<div className="hero-
|
|
992
|
-
|
|
993
|
-
<
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
<
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
</
|
|
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>
|
|
1098
|
+
<section className="hero">
|
|
1099
|
+
<div className="hero-glow" />
|
|
1100
|
+
<div className="hero-content">
|
|
1101
|
+
<Badge variant="success" className="mb-6">
|
|
1102
|
+
⚡ Flexi UI Components
|
|
1103
|
+
</Badge>
|
|
1104
|
+
<h1 className="hero-title">
|
|
1105
|
+
Build <span className="gradient-text">beautiful</span> apps
|
|
1106
|
+
</h1>
|
|
1107
|
+
<p className="hero-subtitle">
|
|
1108
|
+
A stunning component library with neon emerald accents,
|
|
1109
|
+
dark-first design, and seamless React integration.
|
|
1110
|
+
</p>
|
|
1111
|
+
<div className="hero-buttons">
|
|
1112
|
+
<Button size="lg">Get Started</Button>
|
|
1113
|
+
<Button variant="outline" size="lg">GitHub</Button>
|
|
1048
1114
|
</div>
|
|
1049
1115
|
</div>
|
|
1050
1116
|
</section>
|
|
@@ -1053,267 +1119,27 @@ export function Hero() {
|
|
|
1053
1119
|
`,
|
|
1054
1120
|
|
|
1055
1121
|
'components/Features.tsx': () => `import React from 'react';
|
|
1056
|
-
import { Card
|
|
1057
|
-
import { Zap, Folder, Sparkles, Server, Palette, Shield } from 'lucide-react';
|
|
1122
|
+
import { Card } from '@flexireact/flexi-ui';
|
|
1058
1123
|
|
|
1059
1124
|
const features = [
|
|
1060
|
-
{
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
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
|
-
},
|
|
1125
|
+
{ icon: '⚡', title: 'Fast', desc: 'Powered by esbuild.' },
|
|
1126
|
+
{ icon: '📁', title: 'File Routing', desc: 'Automatic routes.' },
|
|
1127
|
+
{ icon: '🏝️', title: 'Islands', desc: 'Partial hydration.' },
|
|
1128
|
+
{ icon: '🎨', title: 'Beautiful', desc: 'Dark mode first.' },
|
|
1096
1129
|
];
|
|
1097
1130
|
|
|
1098
1131
|
export function Features() {
|
|
1099
1132
|
return (
|
|
1100
|
-
<section className="
|
|
1101
|
-
<
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
<
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
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>
|
|
1133
|
+
<section className="features">
|
|
1134
|
+
<h2 className="features-title">Features</h2>
|
|
1135
|
+
<div className="features-grid">
|
|
1136
|
+
{features.map((f, i) => (
|
|
1137
|
+
<Card key={i} className="feature-card">
|
|
1138
|
+
<span className="feature-icon">{f.icon}</span>
|
|
1139
|
+
<h3>{f.title}</h3>
|
|
1140
|
+
<p>{f.desc}</p>
|
|
1208
1141
|
</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>
|
|
1261
|
-
</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>
|
|
1142
|
+
))}
|
|
1317
1143
|
</div>
|
|
1318
1144
|
</section>
|
|
1319
1145
|
);
|
|
@@ -1321,51 +1147,12 @@ export function Showcase() {
|
|
|
1321
1147
|
`,
|
|
1322
1148
|
|
|
1323
1149
|
'components/Footer.tsx': () => `import React from 'react';
|
|
1324
|
-
import { Separator } from '@flexireact/flexi-ui';
|
|
1325
|
-
import { Github, Twitter, Heart } from 'lucide-react';
|
|
1326
1150
|
|
|
1327
1151
|
export function Footer() {
|
|
1328
1152
|
return (
|
|
1329
|
-
<footer className="
|
|
1330
|
-
<
|
|
1331
|
-
|
|
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>
|
|
1153
|
+
<footer className="footer">
|
|
1154
|
+
<span>Built with Flexi UI</span>
|
|
1155
|
+
<a href="https://github.com/flexireact/flexi-ui">GitHub</a>
|
|
1369
1156
|
</footer>
|
|
1370
1157
|
);
|
|
1371
1158
|
}
|
|
@@ -1373,43 +1160,20 @@ export function Footer() {
|
|
|
1373
1160
|
|
|
1374
1161
|
'components/Navbar.tsx': () => `import React from 'react';
|
|
1375
1162
|
import { Button, Badge } from '@flexireact/flexi-ui';
|
|
1376
|
-
import { Github, Menu } from 'lucide-react';
|
|
1377
1163
|
|
|
1378
1164
|
export function Navbar() {
|
|
1379
1165
|
return (
|
|
1380
|
-
<header className="
|
|
1381
|
-
<nav className="
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
<
|
|
1385
|
-
|
|
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>
|
|
1166
|
+
<header className="navbar">
|
|
1167
|
+
<nav className="navbar-inner">
|
|
1168
|
+
<a href="/" className="logo">
|
|
1169
|
+
<span className="logo-icon">F</span>
|
|
1170
|
+
<span className="logo-text">Flexi UI</span>
|
|
1171
|
+
<Badge variant="outline" className="ml-2">v1.0</Badge>
|
|
1389
1172
|
</a>
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
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>
|
|
1173
|
+
<div className="nav-links">
|
|
1174
|
+
<Button variant="ghost" size="sm">Docs</Button>
|
|
1175
|
+
<Button variant="outline" size="sm">GitHub</Button>
|
|
1407
1176
|
</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
1177
|
</nav>
|
|
1414
1178
|
</header>
|
|
1415
1179
|
);
|
|
@@ -1418,7 +1182,6 @@ export function Navbar() {
|
|
|
1418
1182
|
|
|
1419
1183
|
'components/index.ts': () => `export { Hero } from './Hero';
|
|
1420
1184
|
export { Features } from './Features';
|
|
1421
|
-
export { Showcase } from './Showcase';
|
|
1422
1185
|
export { Footer } from './Footer';
|
|
1423
1186
|
export { Navbar } from './Navbar';
|
|
1424
1187
|
`,
|
|
@@ -1452,14 +1215,12 @@ export default function RootLayout({ children }: LayoutProps) {
|
|
|
1452
1215
|
'pages/index.tsx': () => `import React from 'react';
|
|
1453
1216
|
import { Hero } from '../components/Hero';
|
|
1454
1217
|
import { Features } from '../components/Features';
|
|
1455
|
-
import { Showcase } from '../components/Showcase';
|
|
1456
1218
|
|
|
1457
1219
|
export default function HomePage() {
|
|
1458
1220
|
return (
|
|
1459
1221
|
<>
|
|
1460
1222
|
<Hero />
|
|
1461
1223
|
<Features />
|
|
1462
|
-
<Showcase />
|
|
1463
1224
|
</>
|
|
1464
1225
|
);
|
|
1465
1226
|
}
|
|
@@ -1473,264 +1234,145 @@ export default function HomePage() {
|
|
|
1473
1234
|
@tailwind components;
|
|
1474
1235
|
@tailwind utilities;
|
|
1475
1236
|
|
|
1476
|
-
|
|
1477
|
-
:
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
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
|
-
}
|
|
1508
|
-
}
|
|
1509
|
-
|
|
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; }
|
|
1237
|
+
:root {
|
|
1238
|
+
--bg: #0a0a0a;
|
|
1239
|
+
--fg: #fafafa;
|
|
1240
|
+
--primary: #00FF9C;
|
|
1241
|
+
--muted: #94a3b8;
|
|
1242
|
+
--border: #1e293b;
|
|
1243
|
+
--card: #0f0f0f;
|
|
1558
1244
|
}
|
|
1559
1245
|
|
|
1560
|
-
|
|
1561
|
-
from {
|
|
1562
|
-
opacity: 0;
|
|
1563
|
-
transform: translateY(30px);
|
|
1564
|
-
}
|
|
1565
|
-
to {
|
|
1566
|
-
opacity: 1;
|
|
1567
|
-
transform: translateY(0);
|
|
1568
|
-
}
|
|
1569
|
-
}
|
|
1246
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
1570
1247
|
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
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;
|
|
1248
|
+
body {
|
|
1249
|
+
font-family: 'Inter', system-ui, sans-serif;
|
|
1250
|
+
background: var(--bg);
|
|
1251
|
+
color: var(--fg);
|
|
1252
|
+
min-height: 100vh;
|
|
1588
1253
|
}
|
|
1589
1254
|
|
|
1590
|
-
|
|
1591
|
-
border-color: rgba(0, 255, 156, 0.5);
|
|
1592
|
-
box-shadow: 0 0 30px rgba(0, 255, 156, 0.1);
|
|
1593
|
-
}
|
|
1255
|
+
a { color: inherit; text-decoration: none; }
|
|
1594
1256
|
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1257
|
+
/* Navbar */
|
|
1258
|
+
.navbar {
|
|
1259
|
+
position: fixed;
|
|
1260
|
+
top: 0;
|
|
1261
|
+
left: 0;
|
|
1262
|
+
right: 0;
|
|
1263
|
+
z-index: 50;
|
|
1264
|
+
border-bottom: 1px solid var(--border);
|
|
1265
|
+
background: rgba(10,10,10,0.8);
|
|
1266
|
+
backdrop-filter: blur(12px);
|
|
1267
|
+
}
|
|
1268
|
+
.navbar-inner {
|
|
1269
|
+
max-width: 1200px;
|
|
1270
|
+
margin: 0 auto;
|
|
1271
|
+
padding: 1rem 1.5rem;
|
|
1272
|
+
display: flex;
|
|
1273
|
+
justify-content: space-between;
|
|
1274
|
+
align-items: center;
|
|
1601
1275
|
}
|
|
1602
|
-
|
|
1603
|
-
.
|
|
1604
|
-
|
|
1605
|
-
|
|
1276
|
+
.logo { display: flex; align-items: center; gap: 0.5rem; }
|
|
1277
|
+
.logo-icon {
|
|
1278
|
+
width: 32px;
|
|
1279
|
+
height: 32px;
|
|
1280
|
+
background: linear-gradient(135deg, var(--primary), #10b981);
|
|
1281
|
+
border-radius: 8px;
|
|
1282
|
+
display: flex;
|
|
1283
|
+
align-items: center;
|
|
1284
|
+
justify-content: center;
|
|
1285
|
+
font-weight: 900;
|
|
1286
|
+
color: #000;
|
|
1606
1287
|
}
|
|
1288
|
+
.logo-text { font-weight: 700; }
|
|
1289
|
+
.nav-links { display: flex; gap: 0.5rem; }
|
|
1607
1290
|
|
|
1608
|
-
/* Hero
|
|
1609
|
-
.hero
|
|
1291
|
+
/* Hero */
|
|
1292
|
+
.hero {
|
|
1610
1293
|
position: relative;
|
|
1611
1294
|
min-height: 100vh;
|
|
1612
1295
|
display: flex;
|
|
1613
1296
|
align-items: center;
|
|
1614
1297
|
justify-content: center;
|
|
1615
|
-
|
|
1616
|
-
}
|
|
1617
|
-
|
|
1618
|
-
.hero-bg {
|
|
1619
|
-
position: absolute;
|
|
1620
|
-
inset: 0;
|
|
1621
|
-
z-index: -10;
|
|
1298
|
+
padding-top: 4rem;
|
|
1622
1299
|
}
|
|
1623
|
-
|
|
1624
1300
|
.hero-glow {
|
|
1625
1301
|
position: absolute;
|
|
1626
|
-
border-radius: 9999px;
|
|
1627
|
-
filter: blur(64px);
|
|
1628
|
-
}
|
|
1629
|
-
|
|
1630
|
-
.hero-glow-1 {
|
|
1631
1302
|
top: 50%;
|
|
1632
1303
|
left: 50%;
|
|
1633
1304
|
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
1305
|
width: 600px;
|
|
1643
1306
|
height: 600px;
|
|
1644
|
-
background: radial-gradient(circle, rgba(
|
|
1307
|
+
background: radial-gradient(circle, rgba(0,255,156,0.15), transparent 70%);
|
|
1308
|
+
pointer-events: none;
|
|
1645
1309
|
}
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
width: 400px;
|
|
1651
|
-
height: 400px;
|
|
1652
|
-
background: radial-gradient(circle, rgba(16,185,129,0.1), transparent);
|
|
1653
|
-
}
|
|
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;
|
|
1310
|
+
.hero-content {
|
|
1311
|
+
text-align: center;
|
|
1312
|
+
padding: 2rem;
|
|
1313
|
+
max-width: 800px;
|
|
1663
1314
|
}
|
|
1664
|
-
|
|
1665
1315
|
.hero-title {
|
|
1666
|
-
font-size: clamp(
|
|
1667
|
-
font-weight:
|
|
1668
|
-
letter-spacing: -0.02em;
|
|
1669
|
-
margin-bottom: 2rem;
|
|
1316
|
+
font-size: clamp(2.5rem, 6vw, 4rem);
|
|
1317
|
+
font-weight: 800;
|
|
1670
1318
|
line-height: 1.1;
|
|
1319
|
+
margin-bottom: 1.5rem;
|
|
1671
1320
|
}
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
background: linear-gradient(to right, #00FF9C, #34d399, #22d3ee);
|
|
1321
|
+
.gradient-text {
|
|
1322
|
+
background: linear-gradient(90deg, var(--primary), #10b981);
|
|
1675
1323
|
-webkit-background-clip: text;
|
|
1676
1324
|
-webkit-text-fill-color: transparent;
|
|
1677
|
-
background-clip: text;
|
|
1678
1325
|
}
|
|
1679
|
-
|
|
1680
1326
|
.hero-subtitle {
|
|
1681
|
-
font-size: 1.
|
|
1682
|
-
color:
|
|
1683
|
-
max-width: 42rem;
|
|
1684
|
-
margin-bottom: 3rem;
|
|
1327
|
+
font-size: 1.125rem;
|
|
1328
|
+
color: var(--muted);
|
|
1685
1329
|
line-height: 1.7;
|
|
1330
|
+
margin-bottom: 2rem;
|
|
1686
1331
|
}
|
|
1687
|
-
|
|
1688
1332
|
.hero-buttons {
|
|
1689
1333
|
display: flex;
|
|
1690
|
-
flex-wrap: wrap;
|
|
1691
|
-
align-items: center;
|
|
1692
|
-
justify-content: center;
|
|
1693
1334
|
gap: 1rem;
|
|
1694
|
-
|
|
1695
|
-
}
|
|
1696
|
-
|
|
1697
|
-
/* Terminal styles */
|
|
1698
|
-
.terminal-card {
|
|
1699
|
-
width: 100%;
|
|
1700
|
-
max-width: 42rem;
|
|
1335
|
+
justify-content: center;
|
|
1701
1336
|
}
|
|
1702
1337
|
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
margin
|
|
1338
|
+
/* Features */
|
|
1339
|
+
.features {
|
|
1340
|
+
padding: 6rem 1.5rem;
|
|
1341
|
+
max-width: 1200px;
|
|
1342
|
+
margin: 0 auto;
|
|
1708
1343
|
}
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1344
|
+
.features-title {
|
|
1345
|
+
font-size: 2rem;
|
|
1346
|
+
font-weight: 700;
|
|
1347
|
+
text-align: center;
|
|
1348
|
+
margin-bottom: 3rem;
|
|
1714
1349
|
}
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
.terminal-label {
|
|
1721
|
-
margin-left: 0.75rem;
|
|
1722
|
-
font-size: 0.75rem;
|
|
1723
|
-
color: #64748b;
|
|
1350
|
+
.features-grid {
|
|
1351
|
+
display: grid;
|
|
1352
|
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
1353
|
+
gap: 1.5rem;
|
|
1724
1354
|
}
|
|
1725
|
-
|
|
1726
|
-
.
|
|
1727
|
-
text-align:
|
|
1355
|
+
.feature-card {
|
|
1356
|
+
padding: 1.5rem;
|
|
1357
|
+
text-align: center;
|
|
1358
|
+
}
|
|
1359
|
+
.feature-card:hover { border-color: var(--primary); }
|
|
1360
|
+
.feature-icon { font-size: 2rem; margin-bottom: 1rem; }
|
|
1361
|
+
.feature-card h3 { font-weight: 600; margin-bottom: 0.5rem; }
|
|
1362
|
+
.feature-card p { color: var(--muted); font-size: 0.875rem; }
|
|
1363
|
+
|
|
1364
|
+
/* Footer */
|
|
1365
|
+
.footer {
|
|
1366
|
+
border-top: 1px solid var(--border);
|
|
1367
|
+
padding: 2rem 1.5rem;
|
|
1368
|
+
display: flex;
|
|
1369
|
+
justify-content: space-between;
|
|
1370
|
+
max-width: 1200px;
|
|
1371
|
+
margin: 0 auto;
|
|
1372
|
+
color: var(--muted);
|
|
1728
1373
|
font-size: 0.875rem;
|
|
1729
|
-
font-family: ui-monospace, monospace;
|
|
1730
1374
|
}
|
|
1731
|
-
|
|
1732
|
-
.dim { color: #64748b; }
|
|
1733
|
-
.green { color: #00FF9C; }
|
|
1375
|
+
.footer a:hover { color: var(--primary); }
|
|
1734
1376
|
`,
|
|
1735
1377
|
|
|
1736
1378
|
// ============================================================================
|