create-frootkit 1.2.8 → 1.2.9

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 (40) hide show
  1. package/package.json +1 -1
  2. package/templates/auth/src/app/dashboard/layout.tsx +14 -9
  3. package/templates/auth/src/app/dashboard/page.tsx +55 -24
  4. package/templates/auth/src/app/layout.tsx +3 -3
  5. package/templates/auth/src/app/login/page.tsx +5 -1
  6. package/templates/auth/src/app/page.tsx +103 -45
  7. package/templates/auth/src/app/signup/page.tsx +5 -1
  8. package/templates/auth/src/components/AuthForm.tsx +34 -19
  9. package/templates/auth/src/components/DashboardNav.tsx +97 -56
  10. package/templates/auth/src/components/MetricCard.tsx +13 -6
  11. package/templates/auth/src/components/Navbar.tsx +13 -12
  12. package/templates/auth/src/styles.css +27 -5
  13. package/templates/blog/src/app/blog/[slug]/page.tsx +19 -18
  14. package/templates/blog/src/app/layout.tsx +4 -4
  15. package/templates/blog/src/app/page.tsx +15 -14
  16. package/templates/blog/src/components/Footer.tsx +6 -6
  17. package/templates/blog/src/components/Navbar.tsx +17 -15
  18. package/templates/blog/src/components/Newsletter.tsx +11 -9
  19. package/templates/blog/src/components/PostCard.tsx +29 -27
  20. package/templates/blog/src/styles.css +14 -5
  21. package/templates/ecommerce/src/app/cart/page.tsx +3 -3
  22. package/templates/ecommerce/src/app/layout.tsx +2 -2
  23. package/templates/ecommerce/src/app/page.tsx +37 -15
  24. package/templates/ecommerce/src/app/products/[id]/page.tsx +34 -25
  25. package/templates/ecommerce/src/components/CartDrawer.tsx +20 -17
  26. package/templates/ecommerce/src/components/Footer.tsx +6 -6
  27. package/templates/ecommerce/src/components/Navbar.tsx +21 -14
  28. package/templates/ecommerce/src/components/ProductCard.tsx +22 -15
  29. package/templates/ecommerce/src/data/products.ts +17 -11
  30. package/templates/ecommerce/src/styles.css +29 -5
  31. package/templates/empty/src/app/layout.tsx +5 -5
  32. package/templates/empty/src/app/page.tsx +10 -9
  33. package/templates/empty/src/styles.css +13 -15
  34. package/templates/starter/src/app/layout.tsx +4 -4
  35. package/templates/starter/src/app/page.tsx +41 -33
  36. package/templates/starter/src/components/FeatureCard.tsx +5 -5
  37. package/templates/starter/src/components/Footer.tsx +6 -6
  38. package/templates/starter/src/components/Header.tsx +18 -14
  39. package/templates/starter/src/components/TerminalPreview.tsx +30 -30
  40. package/templates/starter/src/styles.css +14 -5
@@ -2,49 +2,56 @@ import type { Product } from '../data/products.js';
2
2
 
3
3
  export function ProductCard({ product }: { product: Product }) {
4
4
  return (
5
- <div class="rounded-xl border border-[#1a2333] bg-[#0a0f18] overflow-hidden hover:border-slate-700 transition-colors flex flex-col justify-between">
6
- <a href={`/products/${product.id}`} class="block relative aspect-[4/3] overflow-hidden bg-[#06090f]">
5
+ <div class="group rounded-xl border border-white/[0.08] bg-[#0f1117] overflow-hidden hover:border-white/[0.18] transition-all duration-200 flex flex-col justify-between shadow-[inset_0_1px_0_0_rgba(255,255,255,0.05)]">
6
+ {/* Product Image Frame */}
7
+ <a href={`/products/${product.id}`} class="block relative aspect-[4/3] overflow-hidden bg-zinc-950/60">
7
8
  <img
8
9
  src={product.image}
9
10
  alt={product.name}
10
- class="w-full h-full object-cover transition-transform duration-200"
11
+ class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500 ease-out"
11
12
  loading="lazy"
12
13
  />
13
- <span class="absolute top-3 right-3 px-2 py-0.5 rounded bg-[#06090f]/90 text-[11px] font-mono text-slate-300 border border-[#1a2333]">
14
+ <div class="absolute inset-0 bg-gradient-to-t from-black/40 via-transparent to-transparent pointer-events-none" />
15
+ <span class="absolute top-3 left-3 px-2.5 py-0.5 rounded-full bg-[#090a0f]/85 backdrop-blur-md text-[10px] uppercase tracking-wider font-semibold text-zinc-300 border border-white/[0.08]">
14
16
  {product.category}
15
17
  </span>
16
18
  </a>
17
19
 
20
+ {/* Product Details */}
18
21
  <div class="p-5 flex-1 flex flex-col justify-between">
19
22
  <div>
20
- <div class="flex items-center gap-1.5 mb-2 text-xs font-mono text-slate-400">
21
- <span class="text-emerald-400 font-bold">{product.rating.toFixed(1)}</span>
22
- <span>/ 5.0</span>
23
- <span class="text-slate-500">({product.reviewsCount} reviews)</span>
23
+ {/* Subtle star & reviews */}
24
+ <div class="flex items-center gap-1.5 mb-2 text-xs text-zinc-400 font-medium">
25
+ <span class="text-amber-400 text-xs">★</span>
26
+ <span class="text-zinc-200 tabular-nums">{product.rating.toFixed(1)}</span>
27
+ <span class="text-zinc-600">•</span>
28
+ <span class="text-zinc-500 tabular-nums">{product.reviewsCount} reviews</span>
24
29
  </div>
25
30
 
26
- <h3 class="font-bold text-white text-base mb-2 hover:text-emerald-400 transition-colors line-clamp-1">
31
+ <h3 class="font-semibold text-zinc-100 text-sm mb-2 group-hover:text-white transition-colors line-clamp-1">
27
32
  <a href={`/products/${product.id}`}>
28
33
  {product.name}
29
34
  </a>
30
35
  </h3>
31
36
 
32
- <p class="text-slate-400 text-xs leading-relaxed mb-4 line-clamp-2">
37
+ <p class="text-zinc-400 text-xs leading-relaxed mb-4 line-clamp-2">
33
38
  {product.description}
34
39
  </p>
35
40
  </div>
36
41
 
37
- <div class="pt-4 border-t border-[#1a2333] flex items-center justify-between">
42
+ {/* Price & Action Row */}
43
+ <div class="pt-4 border-t border-white/[0.06] flex items-center justify-between">
38
44
  <div>
39
- <span class="text-[11px] font-mono text-slate-500 block">Price</span>
40
- <span class="text-lg font-bold text-white font-mono">${product.price.toFixed(2)}</span>
45
+ <span class="text-[10px] text-zinc-500 block uppercase tracking-wider font-medium">Price</span>
46
+ <span class="text-base font-semibold text-white tabular-nums">${product.price.toFixed(2)}</span>
41
47
  </div>
42
48
 
43
49
  <a
44
50
  href={`/products/${product.id}`}
45
- class="px-3.5 py-1.5 rounded-lg bg-emerald-500 text-slate-950 font-semibold text-xs hover:bg-emerald-400 transition-colors"
51
+ class="px-3.5 py-1.5 rounded-lg bg-white text-zinc-950 font-medium text-xs hover:bg-zinc-200 transition-all shadow-sm flex items-center gap-1.5 group-hover:shadow"
46
52
  >
47
- Details
53
+ <span>View</span>
54
+ <span class="text-zinc-500">→</span>
48
55
  </a>
49
56
  </div>
50
57
  </div>
@@ -19,9 +19,10 @@ export const PRODUCTS: Product[] = [
19
19
  category: 'Keyboards',
20
20
  rating: 4.9,
21
21
  reviewsCount: 128,
22
- image: 'https://images.unsplash.com/photo-1587829741301-dc798b83add3?w=600&h=450&fit=crop',
23
- description: 'Aircraft-grade anodized aluminum body with custom hot-swappable linear switches and sound-dampening silicone base.',
24
- features: ['Hot-swappable switches', 'Bluetooth 5.3 & 2.4GHz', 'CNC Aluminum Chassis', 'PBT Dye-Sub Keycaps'],
22
+ // Clean minimal anodized aluminum keyboard
23
+ image: 'https://images.unsplash.com/photo-1587829741301-dc798b83add3?w=800&auto=format&fit=crop&q=80',
24
+ description: 'Aircraft-grade CNC anodized aluminum chassis with custom factory-lubed linear switches and sound-dampening silicone base.',
25
+ features: ['Hot-swappable switches', 'Bluetooth 5.3 & 2.4GHz wireless', 'CNC Aluminum Unibody', 'PBT Dye-Sub Keycaps'],
25
26
  inStock: true,
26
27
  },
27
28
  {
@@ -31,9 +32,10 @@ export const PRODUCTS: Product[] = [
31
32
  category: 'Audio',
32
33
  rating: 4.8,
33
34
  reviewsCount: 94,
34
- image: 'https://images.unsplash.com/photo-1505740420928-5e560c06d30e?w=600&h=450&fit=crop',
35
+ // Clean matte dark studio headphones on neutral background (no bright yellow!)
36
+ image: 'https://images.unsplash.com/photo-1546435770-a3e426bf472b?w=800&auto=format&fit=crop&q=80',
35
37
  description: 'Precision 50mm dynamic drivers engineered for ultra-flat frequency response, critical mixing, and executive focus.',
36
- features: ['Planar Magnetic Sound', 'Memory Foam Cushions', 'Detachable Silver Cable', 'Hard Travel Case'],
38
+ features: ['Planar Magnetic Drivers', 'Memory Foam Cushions', 'Detachable Braided Cable', 'Hard Travel Case'],
37
39
  inStock: true,
38
40
  },
39
41
  {
@@ -43,9 +45,10 @@ export const PRODUCTS: Product[] = [
43
45
  category: 'Peripherals',
44
46
  rating: 4.7,
45
47
  reviewsCount: 210,
46
- image: 'https://images.unsplash.com/photo-1527864550417-7fd91fc51a46?w=600&h=450&fit=crop',
48
+ // Matte dark ergonomic mouse on neutral slate background
49
+ image: 'https://images.unsplash.com/photo-1615663245857-ac93bb7c39e7?w=800&auto=format&fit=crop&q=80',
47
50
  description: 'Sculpted ergonomic contour designed to eliminate wrist fatigue during extended development sessions.',
48
- features: ['26,000 DPI Optical Sensor', '70-day Battery Life', 'Infinite Scroll Wheel', 'Quiet Click Switches'],
51
+ features: ['26,000 DPI Optical Sensor', '70-day Battery Life', 'Infinite Magnetic Scroll Wheel', 'Silent Click Switches'],
49
52
  inStock: true,
50
53
  },
51
54
  {
@@ -55,8 +58,9 @@ export const PRODUCTS: Product[] = [
55
58
  category: 'Desk Setup',
56
59
  rating: 5.0,
57
60
  reviewsCount: 62,
58
- image: 'https://images.unsplash.com/photo-1526738549149-8e07eca6c147?w=600&h=450&fit=crop',
59
- description: 'Handcrafted from single-origin American walnut with cork feet and an integrated aluminum tray for accessories.',
61
+ // Clean handcrafted wooden desk setup
62
+ image: 'https://images.unsplash.com/photo-1593062096033-9a26b09da705?w=800&auto=format&fit=crop&q=80',
63
+ description: 'Handcrafted from single-origin American walnut with cork feet and an integrated aluminum tray for desk accessories.',
60
64
  features: ['Sustainable American Walnut', 'Holds up to 60 lbs', 'Integrated Cable Troughs', 'Hand-finished Matte Oil'],
61
65
  inStock: true,
62
66
  },
@@ -67,7 +71,8 @@ export const PRODUCTS: Product[] = [
67
71
  category: 'Desk Setup',
68
72
  rating: 4.6,
69
73
  reviewsCount: 175,
70
- image: 'https://images.unsplash.com/photo-1544816155-12df9643f363?w=600&h=450&fit=crop',
74
+ // Clean desk surface mat
75
+ image: 'https://images.unsplash.com/photo-1527443224154-c4a3942d3acf?w=800&auto=format&fit=crop&q=80',
71
76
  description: 'Water-resistant, stain-proof premium desk surface that provides effortless mouse tracking and protects your workspace.',
72
77
  features: ['Water-resistant PU Leather', 'Anti-slip Suede Backing', '90cm x 45cm Large Size', 'Easy to Clean'],
73
78
  inStock: true,
@@ -79,7 +84,8 @@ export const PRODUCTS: Product[] = [
79
84
  category: 'Accessories',
80
85
  rating: 4.9,
81
86
  reviewsCount: 340,
82
- image: 'https://images.unsplash.com/photo-1583863788434-e58a36330cf0?w=600&h=450&fit=crop',
87
+ // Minimalist braided cable / tech accessory
88
+ image: 'https://images.unsplash.com/photo-1622434641406-a158123450f9?w=800&auto=format&fit=crop&q=80',
83
89
  description: 'Ultra-durable Kevlar-reinforced charging cable supporting up to 240W Power Delivery and 40Gbps Thunderbolt data transfer.',
84
90
  features: ['240W Power Delivery', 'E-Marker Smart Chip', 'Braided Kevlar Weave', '2-meter Length'],
85
91
  inStock: true,
@@ -4,28 +4,52 @@
4
4
  --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5
5
  --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
6
6
 
7
- --color-brand-primary: #10b981;
8
- --color-brand-hover: #34d399;
7
+ --color-brand-primary: #f4f4f5;
8
+ --color-brand-hover: #ffffff;
9
9
  }
10
10
 
11
11
  :root {
12
12
  color-scheme: dark;
13
+ --bg-canvas: #090a0f;
14
+ --bg-surface: #0f1117;
15
+ --bg-elevated: #151822;
16
+ --border-subtle: rgba(255, 255, 255, 0.08);
17
+ --border-strong: rgba(255, 255, 255, 0.16);
18
+ --text-primary: #f4f4f5;
19
+ --text-secondary: #9496a1;
20
+ --text-muted: #5c6370;
13
21
  }
14
22
 
15
23
  html {
16
- background-color: #06090f;
17
- color: #f8fafc;
24
+ background-color: var(--bg-canvas);
25
+ color: var(--text-primary);
18
26
  font-family: var(--font-sans);
19
27
  scroll-behavior: smooth;
20
28
  -webkit-font-smoothing: antialiased;
29
+ -moz-osx-font-smoothing: grayscale;
21
30
  }
22
31
 
23
- /* SVG safety: prevents flex ballooning across all browsers */
32
+ /* Strict SVG safety to prevent flex ballooning */
24
33
  svg {
25
34
  flex-shrink: 0;
26
35
  max-width: 100%;
27
36
  }
28
37
 
38
+ /* Stripe/Linear refined product card */
39
+ .product-card {
40
+ background-color: var(--bg-surface);
41
+ border: 1px solid var(--border-subtle);
42
+ border-radius: 0.75rem;
43
+ box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.04);
44
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
45
+ }
46
+
47
+ .product-card:hover {
48
+ border-color: var(--border-strong);
49
+ transform: translateY(-2px);
50
+ box-shadow: 0 12px 24px -10px rgba(0, 0, 0, 0.5), inset 0 1px 0 0 rgba(255, 255, 255, 0.08);
51
+ }
52
+
29
53
  /* Accessibility: Mandatory Reduced Motion */
30
54
  @media (prefers-reduced-motion: reduce) {
31
55
  *, *::before, *::after {
@@ -9,11 +9,11 @@ export interface RootLayoutProps {
9
9
  }
10
10
 
11
11
  export default function RootLayout({ children, metadata }: RootLayoutProps) {
12
- const title = metadata?.title || 'FrootKit App';
13
- const description = metadata?.description || 'Built with FrootKit & Preact';
12
+ const title = metadata?.title || 'FrootKit Project';
13
+ const description = metadata?.description || 'Built with Preact and FrootKit.';
14
14
 
15
15
  return (
16
- <html lang="en" class="dark">
16
+ <html lang="en" class="dark scroll-smooth">
17
17
  <head>
18
18
  <meta charSet="UTF-8" />
19
19
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@@ -22,12 +22,12 @@ export default function RootLayout({ children, metadata }: RootLayoutProps) {
22
22
  <link rel="preconnect" href="https://fonts.googleapis.com" />
23
23
  <link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
24
24
  <link
25
- href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap"
25
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
26
26
  rel="stylesheet"
27
27
  />
28
28
  <link rel="stylesheet" href="/styles.css" />
29
29
  </head>
30
- <body class="bg-slate-950 text-slate-100 min-h-screen antialiased">
30
+ <body class="bg-[#08090a] text-zinc-100 min-h-screen antialiased selection:bg-indigo-500/20 selection:text-indigo-300 font-sans">
31
31
  {children}
32
32
  </body>
33
33
  </html>
@@ -5,21 +5,22 @@ export const metadata = {
5
5
 
6
6
  export default function HomePage() {
7
7
  return (
8
- <main class="min-h-screen bg-[#06090f] text-slate-100 flex items-center justify-center p-6">
9
- <div class="max-w-md w-full text-center border border-[#1a2333] bg-[#0a0f18] rounded-xl p-8">
10
- <div class="w-10 h-10 rounded-lg bg-emerald-500/10 border border-emerald-500/30 flex items-center justify-center mx-auto mb-4 text-emerald-400 font-bold text-lg font-mono">
8
+ <main class="min-h-screen bg-[#08090a] text-zinc-100 flex items-center justify-center p-6 selection:bg-indigo-500/20 selection:text-indigo-300">
9
+ <div class="max-w-md w-full text-center border border-white/[0.08] bg-[#0f1117] rounded-xl p-8 shadow-2xl shadow-black/40 relative overflow-hidden">
10
+ <div class="absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-indigo-500/30 to-transparent" />
11
+ <div class="w-10 h-10 rounded-lg bg-indigo-500/10 border border-indigo-500/25 flex items-center justify-center mx-auto mb-4 text-indigo-400 font-medium text-sm">
11
12
  F
12
13
  </div>
13
- <h1 class="text-2xl font-bold text-white mb-2">Blank Canvas</h1>
14
- <p class="text-slate-400 text-sm mb-6 leading-relaxed">
15
- Start building by editing <code class="font-mono text-emerald-400 bg-[#06090f] border border-[#1a2333] px-1.5 py-0.5 rounded">src/app/page.tsx</code>.
14
+ <h1 class="text-xl font-semibold text-white tracking-tight mb-2">Blank Canvas</h1>
15
+ <p class="text-zinc-400 text-xs mb-6 leading-relaxed">
16
+ Start building by editing <code class="font-mono text-indigo-400 bg-white/[0.04] border border-white/[0.08] px-1.5 py-0.5 rounded">src/app/page.tsx</code>.
16
17
  </p>
17
- <div class="flex justify-center gap-3 text-xs font-medium">
18
+ <div class="flex justify-center gap-2.5 text-xs font-medium">
18
19
  <a
19
20
  href="https://frootjs.org"
20
21
  target="_blank"
21
22
  rel="noreferrer"
22
- class="px-4 py-2 rounded-lg bg-emerald-500 text-slate-950 font-semibold hover:bg-emerald-400 transition-colors"
23
+ class="px-3.5 py-1.5 rounded-lg bg-white text-zinc-950 font-medium hover:bg-zinc-200 transition-all shadow-sm"
23
24
  >
24
25
  Documentation
25
26
  </a>
@@ -27,7 +28,7 @@ export default function HomePage() {
27
28
  href="https://github.com/orbitnorth/frootkit"
28
29
  target="_blank"
29
30
  rel="noreferrer"
30
- class="px-4 py-2 rounded-lg bg-[#06090f] border border-[#1a2333] text-slate-300 hover:text-white transition-colors"
31
+ class="px-3.5 py-1.5 rounded-lg bg-white/[0.04] border border-white/[0.08] text-zinc-300 hover:text-white hover:bg-white/[0.08] transition-all"
31
32
  >
32
33
  GitHub
33
34
  </a>
@@ -4,34 +4,32 @@
4
4
  --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
5
5
  --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
6
6
 
7
- --color-brand-primary: #10b981;
8
- --color-brand-hover: #34d399;
7
+ --color-brand-primary: #6366f1;
8
+ --color-brand-hover: #4f46e5;
9
9
  }
10
10
 
11
11
  :root {
12
12
  color-scheme: dark;
13
+ --bg-canvas: #08090a;
14
+ --bg-surface: #0f1117;
15
+ --bg-elevated: #151822;
16
+ --border-subtle: rgba(255, 255, 255, 0.08);
17
+ --border-strong: rgba(255, 255, 255, 0.16);
18
+ --text-primary: #f4f4f5;
19
+ --text-secondary: #9496a1;
20
+ --text-muted: #5c6370;
13
21
  }
14
22
 
15
23
  html {
16
- background-color: #06090f;
17
- color: #f8fafc;
24
+ background-color: var(--bg-canvas);
25
+ color: var(--text-primary);
18
26
  font-family: var(--font-sans);
19
27
  scroll-behavior: smooth;
20
28
  -webkit-font-smoothing: antialiased;
29
+ -moz-osx-font-smoothing: grayscale;
21
30
  }
22
31
 
23
- /* SVG safety: prevents flex ballooning across all browsers */
24
32
  svg {
25
33
  flex-shrink: 0;
26
34
  max-width: 100%;
27
35
  }
28
-
29
- /* Accessibility: Mandatory Reduced Motion */
30
- @media (prefers-reduced-motion: reduce) {
31
- *, *::before, *::after {
32
- animation-duration: 0.01ms !important;
33
- animation-iteration-count: 1 !important;
34
- transition-duration: 0.01ms !important;
35
- scroll-behavior: auto !important;
36
- }
37
- }
@@ -9,10 +9,10 @@ export interface RootLayoutProps {
9
9
  }
10
10
 
11
11
  export default function RootLayout({ children, metadata }: RootLayoutProps) {
12
- const title = metadata?.title || 'FrootKit — The Next.js Alternative for Preact';
12
+ const title = metadata?.title || 'FrootKit — Next.js Alternative for Preact';
13
13
  const description =
14
14
  metadata?.description ||
15
- 'High-performance fullstack web application powered by Preact SSR, nested layouts, Tailwind CSS v4, and dynamic API routes.';
15
+ 'Sub-millisecond Preact SSR, nested file-based layouts, native Tailwind CSS v4, and dynamic API routes.';
16
16
 
17
17
  return (
18
18
  <html lang="en" class="dark scroll-smooth">
@@ -24,12 +24,12 @@ export default function RootLayout({ children, metadata }: RootLayoutProps) {
24
24
  <link rel="preconnect" href="https://fonts.googleapis.com" />
25
25
  <link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
26
26
  <link
27
- href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap"
27
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
28
28
  rel="stylesheet"
29
29
  />
30
30
  <link rel="stylesheet" href="/styles.css" />
31
31
  </head>
32
- <body class="bg-[#030712] text-slate-100 min-h-screen antialiased selection:bg-emerald-500/20 selection:text-emerald-300 font-sans">
32
+ <body class="bg-[#08090a] text-zinc-100 min-h-screen antialiased selection:bg-indigo-500/20 selection:text-indigo-300 font-sans">
33
33
  {children}
34
34
  </body>
35
35
  </html>
@@ -10,58 +10,60 @@ export const metadata = {
10
10
 
11
11
  export default function HomePage() {
12
12
  return (
13
- <div class="min-h-screen bg-[#06090f] text-slate-100 flex flex-col justify-between">
13
+ <div class="min-h-screen bg-[#08090a] text-zinc-100 flex flex-col justify-between selection:bg-indigo-500/20 selection:text-indigo-300">
14
14
  <Header />
15
15
 
16
- <main class="max-w-6xl mx-auto px-6 py-16 flex-1 flex flex-col justify-center">
16
+ <main class="max-w-6xl mx-auto px-6 py-16 sm:py-24 flex-1 flex flex-col justify-center">
17
17
  {/* Hero Section */}
18
18
  <div class="max-w-3xl mb-16">
19
- <div class="text-xs font-mono font-medium text-emerald-400 mb-3 tracking-wide uppercase">
20
- Next.js App Router Conventions • Zero Overhead
19
+ <div class="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-indigo-500/10 border border-indigo-500/20 text-indigo-400 text-xs font-medium mb-6">
20
+ <span class="w-1.5 h-1.5 rounded-full bg-indigo-400 animate-pulse" />
21
+ <span>Next.js App Router Conventions • Zero Overhead</span>
21
22
  </div>
22
23
 
23
- <h1 class="text-4xl sm:text-5xl lg:text-6xl font-extrabold text-white tracking-tight leading-tight mb-6">
24
+ <h1 class="text-4xl sm:text-5xl lg:text-6xl font-semibold text-white tracking-[-0.03em] leading-[1.1] mb-6">
24
25
  The Next.js Alternative Built for Speed & Simplicity.
25
26
  </h1>
26
27
 
27
- <p class="text-base sm:text-lg text-slate-300 leading-relaxed mb-8 max-w-2xl">
28
+ <p class="text-base sm:text-lg text-zinc-400 leading-relaxed mb-8 max-w-2xl">
28
29
  Sub-millisecond Preact SSR, nested file-based layouts, native Tailwind CSS v4, dynamic API routes, and instant static site generation.
29
30
  </p>
30
31
 
31
- <div class="flex flex-wrap items-center gap-4">
32
+ <div class="flex flex-wrap items-center gap-3.5">
32
33
  <a
33
34
  href="https://frootjs.org"
34
35
  target="_blank"
35
36
  rel="noreferrer"
36
- class="px-5 py-2.5 rounded-lg bg-emerald-500 text-slate-950 font-semibold hover:bg-emerald-400 transition-colors text-sm"
37
+ class="px-4 py-2.5 rounded-lg bg-white text-zinc-950 font-medium hover:bg-zinc-200 transition-all text-sm shadow-sm flex items-center gap-2 group"
37
38
  >
38
- Explore Documentation →
39
+ <span>Explore Documentation</span>
40
+ <span class="text-zinc-500 group-hover:translate-x-0.5 transition-transform">→</span>
39
41
  </a>
40
42
  <a
41
43
  href="https://github.com/orbitnorth/frootkit"
42
44
  target="_blank"
43
45
  rel="noreferrer"
44
- class="px-5 py-2.5 rounded-lg bg-[#0a0f18] border border-[#1a2333] text-slate-200 font-semibold hover:border-slate-700 hover:text-white transition-colors text-sm flex items-center gap-2"
46
+ class="px-4 py-2.5 rounded-lg bg-white/[0.04] border border-white/[0.08] text-zinc-300 font-medium hover:bg-white/[0.08] hover:text-white transition-all text-sm flex items-center gap-2"
45
47
  >
46
- <svg width="16" height="16" class="w-4 h-4 fill-current shrink-0" viewBox="0 0 24 24">
48
+ <svg style="width: 14px; height: 14px;" class="fill-current shrink-0" viewBox="0 0 24 24">
47
49
  <path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
48
50
  </svg>
49
- Star on GitHub
51
+ <span>Star on GitHub</span>
50
52
  </a>
51
53
  </div>
52
54
  </div>
53
55
 
54
56
  <TerminalPreview />
55
57
 
56
- {/* Feature Grid with Real SVG Icons */}
57
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
58
+ {/* Feature Grid with Precision 16px SVG Icons */}
59
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5">
58
60
  <FeatureCard
59
61
  badge="0.1ms render"
60
62
  title="Sub-Millisecond SSR"
61
63
  description="Preact VNode streaming and monomorphic rendering ensure blistering response times with near-zero memory footprint."
62
64
  >
63
- <svg width="20" height="20" class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
64
- <path stroke-linecap="round" stroke-linejoin="round" d="M13 10V3L4 14h7v7l9-11h-7z" />
65
+ <svg style="width: 16px; height: 16px;" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
66
+ <polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2" />
65
67
  </svg>
66
68
  </FeatureCard>
67
69
 
@@ -70,8 +72,8 @@ export default function HomePage() {
70
72
  title="Native CSS Pipeline"
71
73
  description="Zero postcss or tailwind config files required. Native Tailwind CSS v4 compiles in single-digit milliseconds."
72
74
  >
73
- <svg width="20" height="20" class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
74
- <path stroke-linecap="round" stroke-linejoin="round" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01" />
75
+ <svg style="width: 16px; height: 16px;" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
76
+ <path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" />
75
77
  </svg>
76
78
  </FeatureCard>
77
79
 
@@ -80,38 +82,44 @@ export default function HomePage() {
80
82
  title="Nested File Layouts"
81
83
  description="Intuitive file-based routing with layout.tsx, page.tsx, and loading.tsx mirroring modern Next.js conventions."
82
84
  >
83
- <svg width="20" height="20" class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
84
- <path stroke-linecap="round" stroke-linejoin="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" />
85
+ <svg style="width: 16px; height: 16px;" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
86
+ <rect x="3" y="3" width="18" height="18" rx="2" ry="2" />
87
+ <line x1="9" y1="3" x2="9" y2="21" />
85
88
  </svg>
86
89
  </FeatureCard>
87
90
 
88
91
  <FeatureCard
89
92
  badge="Fullstack API"
90
93
  title="Dynamic Route Handlers"
91
- description="Build backend endpoints in src/app/api/**/route.ts handling GET, POST, PUT, DELETE with standard Web Fetch APIs."
94
+ description="First-class Web Standard Request/Response handlers inside src/app/api/**/route.ts with JSON and SSE streaming."
92
95
  >
93
- <svg width="20" height="20" class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
94
- <path stroke-linecap="round" stroke-linejoin="round" d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
96
+ <svg style="width: 16px; height: 16px;" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
97
+ <polyline points="16 18 22 12 16 6" />
98
+ <polyline points="8 6 2 12 8 18" />
95
99
  </svg>
96
100
  </FeatureCard>
97
101
 
98
102
  <FeatureCard
99
- badge="Static Export"
100
- title="SSG & Edge Ready"
101
- description="Run frootkit build to pre-render static HTML and bundle dynamic endpoints for serverless and edge clouds in seconds."
103
+ badge="Pure Web Standards"
104
+ title="Zero C++ Dependencies"
105
+ description="Built entirely on pure ECMAScript and Web Crypto. Clean deployments to Node.js, Bun, and Edge runners."
102
106
  >
103
- <svg width="20" height="20" class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
104
- <path stroke-linecap="round" stroke-linejoin="round" d="M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" />
107
+ <svg style="width: 16px; height: 16px;" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
108
+ <circle cx="12" cy="12" r="10" />
109
+ <line x1="2" y1="12" x2="22" y2="12" />
110
+ <path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" />
105
111
  </svg>
106
112
  </FeatureCard>
107
113
 
108
114
  <FeatureCard
109
- badge="AI Native"
110
- title="Agent Guidelines"
111
- description="Comes with pre-configured AGENT.md guidelines, strict TypeScript, and biome/eslint support for agentic development."
115
+ badge="Instant SSG"
116
+ title="Static Site Export"
117
+ description="Deterministic pre-rendering of static paths into deployable HTML assets with zero configuration."
112
118
  >
113
- <svg width="20" height="20" class="w-5 h-5 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2">
114
- <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" />
119
+ <svg style="width: 16px; height: 16px;" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
120
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
121
+ <polyline points="7 10 12 15 17 10" />
122
+ <line x1="12" y1="15" x2="12" y2="3" />
115
123
  </svg>
116
124
  </FeatureCard>
117
125
  </div>
@@ -9,19 +9,19 @@ export interface FeatureCardProps {
9
9
 
10
10
  export function FeatureCard({ badge, title, description, children }: FeatureCardProps) {
11
11
  return (
12
- <div class="rounded-xl border border-[#1a2333] bg-[#0a0f18] p-6 hover:border-slate-700 transition-colors">
12
+ <div class="rounded-xl border border-white/[0.08] bg-[#0f1117] p-5 hover:border-white/[0.18] transition-all shadow-[inset_0_1px_0_0_rgba(255,255,255,0.05)]">
13
13
  <div class="flex items-center justify-between mb-4">
14
- <div class="w-9 h-9 rounded-lg bg-[#0f1624] border border-[#1a2333] flex items-center justify-center text-emerald-400">
14
+ <div class="w-8 h-8 rounded-lg bg-indigo-500/10 border border-indigo-500/25 flex items-center justify-center text-indigo-400">
15
15
  {children}
16
16
  </div>
17
- <span class="text-xs font-mono font-medium px-2 py-0.5 rounded bg-[#0f1624] text-slate-300 border border-[#1a2333]">
17
+ <span class="text-[11px] font-medium px-2 py-0.5 rounded-full bg-white/[0.04] text-zinc-300 border border-white/[0.06]">
18
18
  {badge}
19
19
  </span>
20
20
  </div>
21
- <h3 class="text-base font-bold text-white mb-2">
21
+ <h3 class="text-sm font-semibold text-white mb-1.5">
22
22
  {title}
23
23
  </h3>
24
- <p class="text-slate-400 text-sm leading-relaxed">
24
+ <p class="text-zinc-400 text-xs leading-relaxed">
25
25
  {description}
26
26
  </p>
27
27
  </div>
@@ -1,14 +1,14 @@
1
1
  export function Footer() {
2
2
  return (
3
- <footer class="border-t border-[#1a2333] bg-[#06090f] py-8 text-xs text-slate-400">
4
- <div class="max-w-6xl mx-auto px-6 flex flex-col sm:flex-row items-center justify-between gap-4 font-mono">
3
+ <footer class="border-t border-white/[0.08] bg-[#08090a] py-8 text-xs text-zinc-500">
4
+ <div class="max-w-6xl mx-auto px-6 flex flex-col sm:flex-row items-center justify-between gap-4">
5
5
  <div>
6
- FrootKit © {new Date().getFullYear()} OrbitNorth LLC. MIT Licensed.
6
+ FrootKit © {new Date().getFullYear()} OrbitNorth LLC. Built for high performance.
7
7
  </div>
8
8
  <div class="flex items-center gap-6">
9
- <a href="https://github.com/orbitnorth/frootkit" class="hover:text-white transition-colors">GitHub</a>
10
- <a href="https://frootjs.org" class="hover:text-white transition-colors">Documentation</a>
11
- <a href="/api/health" class="hover:text-white transition-colors">Health API</a>
9
+ <a href="https://github.com/orbitnorth/frootkit" class="hover:text-zinc-300 transition-colors">GitHub</a>
10
+ <a href="https://frootjs.org" class="hover:text-zinc-300 transition-colors">Documentation</a>
11
+ <a href="/api/health" class="hover:text-zinc-300 transition-colors font-mono text-[11px]">/api/health</a>
12
12
  </div>
13
13
  </div>
14
14
  </footer>