create-frootkit 1.2.12 → 1.2.13
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/package.json +1 -1
- package/templates/auth/src/app/dashboard/layout.tsx +8 -11
- package/templates/auth/src/app/dashboard/page.tsx +31 -27
- package/templates/auth/src/app/layout.tsx +5 -5
- package/templates/auth/src/app/login/page.tsx +11 -4
- package/templates/auth/src/app/page.tsx +278 -120
- package/templates/auth/src/app/signup/page.tsx +12 -6
- package/templates/auth/src/components/AuthForm.tsx +27 -34
- package/templates/auth/src/components/DashboardNav.tsx +41 -61
- package/templates/auth/src/components/MetricCard.tsx +12 -22
- package/templates/auth/src/components/Navbar.tsx +18 -21
- package/templates/auth/src/styles.css +157 -27
- package/templates/blog/src/app/blog/[slug]/page.tsx +85 -46
- package/templates/blog/src/app/layout.tsx +5 -5
- package/templates/blog/src/app/page.tsx +39 -26
- package/templates/blog/src/components/Footer.tsx +11 -9
- package/templates/blog/src/components/Navbar.tsx +21 -26
- package/templates/blog/src/components/Newsletter.tsx +11 -33
- package/templates/blog/src/components/PostCard.tsx +43 -76
- package/templates/blog/src/styles.css +113 -25
- package/templates/ecommerce/src/app/cart/page.tsx +12 -4
- package/templates/ecommerce/src/app/layout.tsx +5 -5
- package/templates/ecommerce/src/app/page.tsx +92 -37
- package/templates/ecommerce/src/app/products/[id]/page.tsx +39 -31
- package/templates/ecommerce/src/components/CartDrawer.tsx +113 -45
- package/templates/ecommerce/src/components/Footer.tsx +11 -9
- package/templates/ecommerce/src/components/Navbar.tsx +32 -34
- package/templates/ecommerce/src/components/ProductCard.tsx +27 -38
- package/templates/ecommerce/src/styles.css +155 -36
- package/templates/starter/src/app/layout.tsx +5 -5
- package/templates/starter/src/app/page.tsx +114 -107
- package/templates/starter/src/components/FeatureCard.tsx +9 -15
- package/templates/starter/src/components/Footer.tsx +11 -9
- package/templates/starter/src/components/Header.tsx +15 -38
- package/templates/starter/src/styles.css +102 -27
package/package.json
CHANGED
|
@@ -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-[#
|
|
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-
|
|
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-
|
|
12
|
-
<span class="text-
|
|
13
|
-
<h1 class="text-xs font-semibold text-
|
|
14
|
-
<span class="inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-
|
|
15
|
-
<span class="w-1.5 h-1.5 rounded-full bg-
|
|
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-
|
|
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',
|
|
17
|
-
{ name: 'Marcus Chen', email: 'marcus@infra.org', role: 'Developer', date: '2 hours ago',
|
|
18
|
-
{ name: 'Elena Rostova', email: 'elena@design.io', role: 'Staff Eng', date: '1 day ago',
|
|
19
|
-
{ name: 'Alex Rivera', email: 'alex@systems.net', role: 'Admin', date: '3 days ago',
|
|
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-
|
|
27
|
-
<p class="text-
|
|
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="
|
|
31
|
-
<svg
|
|
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-
|
|
52
|
-
<div class="p-5 border-b border-
|
|
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-
|
|
55
|
-
<p class="text-xs text-
|
|
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="
|
|
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
|
|
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">
|
|
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-
|
|
72
|
+
<tbody class="divide-y divide-[#e6ebf1]">
|
|
73
73
|
{recentUsers.map((u) => (
|
|
74
|
-
<tr key={u.email} class="hover:bg-
|
|
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
|
|
78
|
-
|
|
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-
|
|
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-
|
|
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={`
|
|
88
|
+
<span class={`bd ${
|
|
86
89
|
u.role === 'Owner'
|
|
87
|
-
? 'bg-
|
|
88
|
-
:
|
|
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-
|
|
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 —
|
|
12
|
+
const title = metadata?.title || 'FrootAuth — Authentication & Revenue Infrastructure';
|
|
13
13
|
const description =
|
|
14
14
|
metadata?.description ||
|
|
15
|
-
'Fullstack SaaS
|
|
15
|
+
'Fullstack SaaS authentication, subscription billing, and real-time telemetry powered by FrootKit.';
|
|
16
16
|
|
|
17
17
|
return (
|
|
18
|
-
<html lang="en" class="
|
|
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
|
|
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-
|
|
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-[#
|
|
11
|
-
<
|
|
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-
|
|
18
|
-
FrootAuth
|
|
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
|
);
|