create-frootkit 1.2.12 → 1.2.14

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/package.json +2 -1
  3. package/templates/auth/src/app/dashboard/layout.tsx +8 -11
  4. package/templates/auth/src/app/dashboard/page.tsx +31 -27
  5. package/templates/auth/src/app/layout.tsx +5 -5
  6. package/templates/auth/src/app/login/page.tsx +11 -4
  7. package/templates/auth/src/app/page.tsx +278 -120
  8. package/templates/auth/src/app/signup/page.tsx +12 -6
  9. package/templates/auth/src/components/AuthForm.tsx +27 -34
  10. package/templates/auth/src/components/DashboardNav.tsx +41 -61
  11. package/templates/auth/src/components/MetricCard.tsx +12 -22
  12. package/templates/auth/src/components/Navbar.tsx +18 -21
  13. package/templates/auth/src/styles.css +157 -27
  14. package/templates/blog/package.json +2 -1
  15. package/templates/blog/src/app/blog/[slug]/page.tsx +85 -46
  16. package/templates/blog/src/app/layout.tsx +5 -5
  17. package/templates/blog/src/app/page.tsx +39 -26
  18. package/templates/blog/src/components/Footer.tsx +11 -9
  19. package/templates/blog/src/components/Navbar.tsx +21 -26
  20. package/templates/blog/src/components/Newsletter.tsx +11 -33
  21. package/templates/blog/src/components/PostCard.tsx +43 -76
  22. package/templates/blog/src/styles.css +113 -25
  23. package/templates/ecommerce/package.json +2 -1
  24. package/templates/ecommerce/src/app/cart/page.tsx +12 -4
  25. package/templates/ecommerce/src/app/layout.tsx +5 -5
  26. package/templates/ecommerce/src/app/page.tsx +92 -37
  27. package/templates/ecommerce/src/app/products/[id]/page.tsx +39 -31
  28. package/templates/ecommerce/src/components/CartDrawer.tsx +113 -45
  29. package/templates/ecommerce/src/components/Footer.tsx +11 -9
  30. package/templates/ecommerce/src/components/Navbar.tsx +32 -34
  31. package/templates/ecommerce/src/components/ProductCard.tsx +27 -38
  32. package/templates/ecommerce/src/styles.css +155 -36
  33. package/templates/empty/package.json +2 -1
  34. package/templates/starter/package.json +2 -1
  35. package/templates/starter/src/app/layout.tsx +5 -5
  36. package/templates/starter/src/app/page.tsx +114 -107
  37. package/templates/starter/src/components/FeatureCard.tsx +9 -15
  38. package/templates/starter/src/components/Footer.tsx +11 -9
  39. package/templates/starter/src/components/Header.tsx +15 -38
  40. package/templates/starter/src/styles.css +102 -27
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-frootkit",
3
- "version": "1.2.12",
3
+ "version": "1.2.14",
4
4
  "description": "Interactive CLI for scaffolding high-performance FrootKit (Next.js Alternative) applications",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,7 +8,8 @@
8
8
  "start": "frootkit start"
9
9
  },
10
10
  "dependencies": {
11
- "frootkit": "npm:froot-kit@^1.3.4",
11
+ "frootkit": "npm:froot-kit@^1.3.6",
12
+ "frootui": "^1.0.4",
12
13
  "frootjs": "^1.0.6",
13
14
  "preact": "^11.1.0",
14
15
  "preact-render-to-string": "^6.8.2"
@@ -3,16 +3,16 @@ import { DashboardNav } from '../../components/DashboardNav.js';
3
3
 
4
4
  export default function DashboardLayout({ children }: { children: ComponentChildren }) {
5
5
  return (
6
- <div class="min-h-screen flex bg-[#08090a] text-zinc-100 selection:bg-indigo-500/20 selection:text-indigo-300">
6
+ <div class="min-h-screen flex bg-[#f6f9fc] text-[#425466]">
7
7
  <DashboardNav />
8
8
  <div class="flex-1 flex flex-col min-w-0">
9
- <header class="h-14 border-b border-white/[0.08] px-6 flex items-center justify-between bg-[#08090a]/80 backdrop-blur-md sticky top-0 z-40">
9
+ <header class="h-14 border-b border-[#e6ebf1] px-6 flex items-center justify-between bg-white/90 backdrop-blur-md sticky top-0 z-40">
10
10
  <div class="flex items-center gap-3">
11
- <span class="text-xs text-zinc-500">Workspace</span>
12
- <span class="text-zinc-600 text-xs">/</span>
13
- <h1 class="text-xs font-semibold text-zinc-200">Production Cluster</h1>
14
- <span class="inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-emerald-500/10 text-emerald-400 text-[10px] font-medium border border-emerald-500/20 ml-1">
15
- <span class="w-1.5 h-1.5 rounded-full bg-emerald-400" />
11
+ <span class="text-xs text-[#425466]">Workspace</span>
12
+ <span class="text-[#e6ebf1] text-xs">/</span>
13
+ <h1 class="text-xs font-semibold text-[#0a2540]">Production Cluster</h1>
14
+ <span class="inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-[#24b47e]/15 text-[#0e6245] text-[11px] font-medium ml-1">
15
+ <span class="w-1.5 h-1.5 rounded-full bg-[#24b47e]" />
16
16
  99.99% Uptime
17
17
  </span>
18
18
  </div>
@@ -20,13 +20,10 @@ export default function DashboardLayout({ children }: { children: ComponentChild
20
20
  <div class="flex items-center gap-3 text-xs">
21
21
  <a
22
22
  href="/api/auth"
23
- class="px-2.5 py-1 rounded-md bg-white/[0.04] border border-white/[0.08] text-zinc-400 hover:text-zinc-200 transition-colors font-mono text-[11px]"
23
+ class="px-2.5 py-1 rounded-md bg-[#f6f9fc] border border-[#e6ebf1] text-[#425466] hover:text-[#0a2540] transition-colors font-mono text-[11px]"
24
24
  >
25
25
  /api/auth
26
26
  </a>
27
- <div class="hidden sm:flex items-center gap-1 text-[11px] text-zinc-500 border border-white/[0.06] bg-white/[0.02] px-2 py-0.5 rounded">
28
- <span>⌘</span><span>K</span>
29
- </div>
30
27
  </div>
31
28
  </header>
32
29
 
@@ -13,22 +13,22 @@ export default function DashboardOverviewPage() {
13
13
  ];
14
14
 
15
15
  const recentUsers = [
16
- { name: 'Sarah Connor', email: 'sarah@frootkit.dev', role: 'Owner', date: 'Just now', status: 'online' },
17
- { name: 'Marcus Chen', email: 'marcus@infra.org', role: 'Developer', date: '2 hours ago', status: 'offline' },
18
- { name: 'Elena Rostova', email: 'elena@design.io', role: 'Staff Eng', date: '1 day ago', status: 'offline' },
19
- { name: 'Alex Rivera', email: 'alex@systems.net', role: 'Admin', date: '3 days ago', status: 'offline' },
16
+ { name: 'Sarah Connor', email: 'sarah@frootkit.dev', role: 'Owner', date: 'Just now', color: '#635bff' },
17
+ { name: 'Marcus Chen', email: 'marcus@infra.org', role: 'Developer', date: '2 hours ago', color: '#0a2540' },
18
+ { name: 'Elena Rostova', email: 'elena@design.io', role: 'Staff Eng', date: '1 day ago', color: '#00d4ff' },
19
+ { name: 'Alex Rivera', email: 'alex@systems.net', role: 'Admin', date: '3 days ago', color: '#24b47e' },
20
20
  ];
21
21
 
22
22
  return (
23
23
  <div class="space-y-8 max-w-6xl">
24
24
  <div class="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
25
25
  <div>
26
- <h2 class="text-xl sm:text-2xl font-semibold text-white tracking-tight">Metrics & Telemetry</h2>
27
- <p class="text-xs sm:text-sm text-zinc-400 mt-1">Real-time throughput and workspace subscriber analytics.</p>
26
+ <h2 class="text-2xl font-light text-[#0a2540] tracking-tight">Metrics & Telemetry</h2>
27
+ <p class="text-sm text-[#425466] mt-1">Real-time throughput and workspace subscriber analytics.</p>
28
28
  </div>
29
29
  <div class="flex items-center gap-2">
30
- <button class="px-3 py-1.5 rounded-lg bg-white/[0.04] border border-white/[0.08] text-xs font-medium text-zinc-300 hover:text-white hover:bg-white/[0.08] transition-colors flex items-center gap-1.5">
31
- <svg style="width: 12px; height: 12px;" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
30
+ <button class="btn btn-s text-xs py-1.5 px-3">
31
+ <svg class="h-3.5 w-3.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
32
32
  <path stroke-linecap="round" stroke-linejoin="round" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" />
33
33
  </svg>
34
34
  <span>Refresh</span>
@@ -48,50 +48,54 @@ export default function DashboardOverviewPage() {
48
48
  ))}
49
49
  </div>
50
50
 
51
- <div class="rounded-xl border border-white/[0.08] bg-[#0f1117] shadow-[inset_0_1px_0_0_rgba(255,255,255,0.05)] overflow-hidden">
52
- <div class="p-5 border-b border-white/[0.06] flex items-center justify-between">
51
+ <div class="rounded-lg border border-[#e6ebf1] bg-white shadow-[0_2px_5px_-1px_rgba(50,50,93,0.25),0_1px_3px_-1px_rgba(0,0,0,0.3)] overflow-hidden">
52
+ <div class="p-5 border-b border-[#e6ebf1] flex items-center justify-between">
53
53
  <div>
54
- <h3 class="text-sm font-semibold text-white">Recent Workspace Activity</h3>
55
- <p class="text-xs text-zinc-500 mt-0.5">Active team member sessions and authentication audits</p>
54
+ <h3 class="text-base font-medium text-[#0a2540]">Recent Workspace Activity</h3>
55
+ <p class="text-xs text-[#425466] mt-0.5">Active team member sessions and authentication audits</p>
56
56
  </div>
57
- <span class="text-xs text-zinc-400 bg-white/[0.04] px-2.5 py-1 rounded-md border border-white/[0.06]">
57
+ <span class="bd bg-[#f6f9fc] text-[#425466] border border-[#e6ebf1]">
58
58
  {recentUsers.length} active sessions
59
59
  </span>
60
60
  </div>
61
61
 
62
62
  <div class="overflow-x-auto">
63
63
  <table class="w-full text-left text-xs">
64
- <thead>
65
- <tr class="border-b border-white/[0.06] text-zinc-400 font-medium bg-white/[0.01]">
64
+ <thead class="bg-[#f6f9fc] border-b border-[#e6ebf1] text-[#425466]">
65
+ <tr>
66
66
  <th class="py-3 px-5 font-medium">User</th>
67
67
  <th class="py-3 px-5 font-medium">Email</th>
68
68
  <th class="py-3 px-5 font-medium">Role</th>
69
- <th class="py-3 px-5 font-medium text-right">Last Active</th>
69
+ <th class="py-3 px-5 font-medium text-right">Timestamp</th>
70
70
  </tr>
71
71
  </thead>
72
- <tbody class="divide-y divide-white/[0.04]">
72
+ <tbody class="divide-y divide-[#e6ebf1]">
73
73
  {recentUsers.map((u) => (
74
- <tr key={u.email} class="hover:bg-white/[0.02] transition-colors group">
74
+ <tr key={u.email} class="hover:bg-[#f6f9fc] transition-colors">
75
75
  <td class="py-3.5 px-5">
76
76
  <div class="flex items-center gap-2.5">
77
- <div class="w-6 h-6 rounded-full bg-white/[0.06] border border-white/[0.08] flex items-center justify-center text-[10px] font-medium text-zinc-300">
78
- {u.name.charAt(0)}
77
+ <div
78
+ class="w-7 h-7 rounded-full text-white flex items-center justify-center text-xs font-medium shrink-0"
79
+ style={`background-color: ${u.color}`}
80
+ >
81
+ {u.name.split(' ').map((n) => n[0]).join('')}
79
82
  </div>
80
- <span class="font-medium text-zinc-200 group-hover:text-white transition-colors">{u.name}</span>
83
+ <span class="font-medium text-[#0a2540]">{u.name}</span>
81
84
  </div>
82
85
  </td>
83
- <td class="py-3.5 px-5 text-zinc-400">{u.email}</td>
86
+ <td class="py-3.5 px-5 font-mono text-[#425466]">{u.email}</td>
84
87
  <td class="py-3.5 px-5">
85
- <span class={`inline-flex items-center gap-1.5 px-2 py-0.5 rounded-md text-[11px] font-medium border ${
88
+ <span class={`bd ${
86
89
  u.role === 'Owner'
87
- ? 'bg-indigo-500/10 text-indigo-400 border-indigo-500/20'
88
- : 'bg-white/[0.04] text-zinc-300 border-white/[0.08]'
90
+ ? 'bg-[#635bff]/10 text-[#635bff]'
91
+ : u.role === 'Admin'
92
+ ? 'bg-[#24b47e]/15 text-[#0e6245]'
93
+ : 'bg-[#f6f9fc] text-[#425466] border border-[#e6ebf1]'
89
94
  }`}>
90
- {u.role === 'Owner' && <span class="w-1.5 h-1.5 rounded-full bg-indigo-400" />}
91
95
  {u.role}
92
96
  </span>
93
97
  </td>
94
- <td class="py-3.5 px-5 text-zinc-500 text-right tabular-nums">{u.date}</td>
98
+ <td class="py-3.5 px-5 text-[#425466] text-right font-mono">{u.date}</td>
95
99
  </tr>
96
100
  ))}
97
101
  </tbody>
@@ -9,13 +9,13 @@ export interface RootLayoutProps {
9
9
  }
10
10
 
11
11
  export default function RootLayout({ children, metadata }: RootLayoutProps) {
12
- const title = metadata?.title || 'FrootAuth — Modern Cloud Platform';
12
+ const title = metadata?.title || 'FrootAuth — Authentication & Revenue Infrastructure';
13
13
  const description =
14
14
  metadata?.description ||
15
- 'Fullstack SaaS application with authentication and real-time dashboard powered by Preact and FrootKit.';
15
+ 'Fullstack SaaS authentication, subscription billing, and real-time telemetry powered by FrootKit.';
16
16
 
17
17
  return (
18
- <html lang="en" class="dark scroll-smooth">
18
+ <html lang="en" class="scroll-smooth">
19
19
  <head>
20
20
  <meta charSet="UTF-8" />
21
21
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@@ -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&family=JetBrains+Mono:wght@400;500&display=swap"
27
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&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-[#08090a] text-zinc-100 min-h-screen antialiased selection:bg-indigo-500/20 selection:text-indigo-300 font-sans">
32
+ <body class="bg-white font-sans text-[#425466] antialiased">
33
33
  {children}
34
34
  </body>
35
35
  </html>
@@ -7,15 +7,22 @@ export const metadata = {
7
7
 
8
8
  export default function LoginPage() {
9
9
  return (
10
- <div class="min-h-screen bg-[#08090a] text-zinc-100 flex flex-col justify-between selection:bg-indigo-500/20 selection:text-indigo-300">
11
- <Navbar />
10
+ <div class="min-h-screen bg-[#f6f9fc] text-[#425466] flex flex-col justify-between">
11
+ <header class="border-b border-[#e6ebf1] bg-white py-4 px-6 flex items-center justify-between">
12
+ <a href="/" class="text-[20px] font-semibold tracking-tight text-[#635bff]">
13
+ frootauth
14
+ </a>
15
+ <a href="/" class="text-xs text-[#425466] hover:text-[#0a2540]">
16
+ ← Back to home
17
+ </a>
18
+ </header>
12
19
 
13
20
  <main class="max-w-md mx-auto px-6 py-16 flex-1 w-full flex flex-col justify-center">
14
21
  <AuthForm mode="login" />
15
22
  </main>
16
23
 
17
- <footer class="py-6 text-center text-xs text-zinc-600">
18
- FrootAuth • Web Crypto PBKDF2 Authentication
24
+ <footer class="py-6 text-center text-xs text-[#425466]">
25
+ FrootAuth · Web Crypto PBKDF2 Authentication
19
26
  </footer>
20
27
  </div>
21
28
  );