@getjack/jack 0.1.32 → 0.1.34

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 (196) hide show
  1. package/package.json +1 -1
  2. package/src/commands/deploys.ts +95 -0
  3. package/src/commands/link.ts +8 -0
  4. package/src/commands/mcp.ts +179 -4
  5. package/src/commands/rollback.ts +53 -0
  6. package/src/commands/secrets.ts +3 -1
  7. package/src/commands/services.ts +11 -1
  8. package/src/commands/ship.ts +3 -1
  9. package/src/commands/tokens.ts +16 -1
  10. package/src/commands/whoami.ts +43 -8
  11. package/src/index.ts +16 -0
  12. package/src/lib/agent-files.ts +54 -4
  13. package/src/lib/agent-integration.ts +4 -166
  14. package/src/lib/claude-hooks-installer.ts +55 -0
  15. package/src/lib/control-plane.ts +78 -40
  16. package/src/lib/crypto.ts +84 -0
  17. package/src/lib/debug.ts +2 -1
  18. package/src/lib/deploy-upload.ts +13 -3
  19. package/src/lib/hooks.ts +4 -3
  20. package/src/lib/managed-deploy.ts +12 -9
  21. package/src/lib/project-link.ts +6 -0
  22. package/src/lib/project-operations.ts +92 -30
  23. package/src/lib/prompts.ts +2 -2
  24. package/src/lib/telemetry.ts +2 -0
  25. package/src/mcp/README.md +1 -1
  26. package/src/mcp/resources/index.ts +1 -16
  27. package/src/mcp/server.ts +23 -0
  28. package/src/mcp/tools/index.ts +133 -17
  29. package/src/mcp/types.ts +1 -0
  30. package/src/mcp/utils.ts +2 -1
  31. package/src/templates/index.ts +25 -73
  32. package/templates/CLAUDE.md +62 -0
  33. package/templates/ai-chat/.jack.json +10 -5
  34. package/templates/ai-chat/bun.lock +50 -1
  35. package/templates/ai-chat/package.json +5 -0
  36. package/templates/ai-chat/public/app.js +73 -0
  37. package/templates/ai-chat/public/index.html +14 -197
  38. package/templates/ai-chat/schema.sql +14 -0
  39. package/templates/ai-chat/src/index.ts +86 -102
  40. package/templates/ai-chat/wrangler.jsonc +8 -1
  41. package/templates/cron/.jack.json +66 -0
  42. package/templates/cron/bun.lock +23 -0
  43. package/templates/cron/package.json +16 -0
  44. package/templates/cron/schema.sql +24 -0
  45. package/templates/cron/src/index.ts +117 -0
  46. package/templates/cron/src/jobs.ts +139 -0
  47. package/templates/cron/src/webhooks.ts +95 -0
  48. package/templates/cron/tsconfig.json +17 -0
  49. package/templates/cron/wrangler.jsonc +11 -0
  50. package/templates/miniapp/.jack.json +1 -1
  51. package/templates/nextjs/.jack.json +1 -1
  52. package/templates/nextjs-auth/.jack.json +44 -0
  53. package/templates/nextjs-auth/app/api/auth/[...all]/route.ts +11 -0
  54. package/templates/nextjs-auth/app/dashboard/loading.tsx +53 -0
  55. package/templates/nextjs-auth/app/dashboard/page.tsx +73 -0
  56. package/templates/nextjs-auth/app/error.tsx +44 -0
  57. package/templates/nextjs-auth/app/globals.css +1 -0
  58. package/templates/nextjs-auth/app/health/route.ts +3 -0
  59. package/templates/nextjs-auth/app/layout.tsx +24 -0
  60. package/templates/nextjs-auth/app/login/page.tsx +10 -0
  61. package/templates/nextjs-auth/app/page.tsx +86 -0
  62. package/templates/nextjs-auth/app/signup/page.tsx +10 -0
  63. package/templates/nextjs-auth/bun.lock +1065 -0
  64. package/templates/nextjs-auth/cloudflare-env.d.ts +8 -0
  65. package/templates/nextjs-auth/components/auth-form.tsx +191 -0
  66. package/templates/nextjs-auth/components/header.tsx +50 -0
  67. package/templates/nextjs-auth/components/user-menu.tsx +23 -0
  68. package/templates/nextjs-auth/lib/auth-client.ts +3 -0
  69. package/templates/nextjs-auth/lib/auth.ts +43 -0
  70. package/templates/nextjs-auth/lib/utils.ts +6 -0
  71. package/templates/nextjs-auth/middleware.ts +33 -0
  72. package/templates/nextjs-auth/next.config.ts +8 -0
  73. package/templates/nextjs-auth/open-next.config.ts +6 -0
  74. package/templates/nextjs-auth/package.json +33 -0
  75. package/templates/nextjs-auth/postcss.config.mjs +8 -0
  76. package/templates/nextjs-auth/schema.sql +49 -0
  77. package/templates/nextjs-auth/tsconfig.json +28 -0
  78. package/templates/nextjs-auth/wrangler.jsonc +23 -0
  79. package/templates/nextjs-clerk/.jack.json +54 -0
  80. package/templates/nextjs-clerk/app/dashboard/page.tsx +69 -0
  81. package/templates/nextjs-clerk/app/globals.css +1 -0
  82. package/templates/nextjs-clerk/app/health/route.ts +3 -0
  83. package/templates/nextjs-clerk/app/layout.tsx +28 -0
  84. package/templates/nextjs-clerk/app/page.tsx +86 -0
  85. package/templates/nextjs-clerk/app/sign-in/[[...sign-in]]/page.tsx +9 -0
  86. package/templates/nextjs-clerk/app/sign-up/[[...sign-up]]/page.tsx +9 -0
  87. package/templates/nextjs-clerk/bun.lock +1055 -0
  88. package/templates/nextjs-clerk/cloudflare-env.d.ts +3 -0
  89. package/templates/nextjs-clerk/components/header.tsx +40 -0
  90. package/templates/nextjs-clerk/lib/utils.ts +6 -0
  91. package/templates/nextjs-clerk/middleware.ts +18 -0
  92. package/templates/nextjs-clerk/next.config.ts +8 -0
  93. package/templates/nextjs-clerk/open-next.config.ts +6 -0
  94. package/templates/nextjs-clerk/package.json +31 -0
  95. package/templates/nextjs-clerk/postcss.config.mjs +8 -0
  96. package/templates/nextjs-clerk/tsconfig.json +28 -0
  97. package/templates/nextjs-clerk/wrangler.jsonc +17 -0
  98. package/templates/nextjs-shadcn/.jack.json +34 -0
  99. package/templates/nextjs-shadcn/app/dashboard/data.json +614 -0
  100. package/templates/nextjs-shadcn/app/dashboard/page.tsx +55 -0
  101. package/templates/nextjs-shadcn/app/globals.css +126 -0
  102. package/templates/nextjs-shadcn/app/health/route.ts +3 -0
  103. package/templates/nextjs-shadcn/app/layout.tsx +24 -0
  104. package/templates/nextjs-shadcn/app/login/page.tsx +19 -0
  105. package/templates/nextjs-shadcn/app/page.tsx +180 -0
  106. package/templates/nextjs-shadcn/app/showcase.tsx +1262 -0
  107. package/templates/nextjs-shadcn/bun.lock +1789 -0
  108. package/templates/nextjs-shadcn/cloudflare-env.d.ts +4 -0
  109. package/templates/nextjs-shadcn/components/app-sidebar.tsx +175 -0
  110. package/templates/nextjs-shadcn/components/chart-area-interactive.tsx +291 -0
  111. package/templates/nextjs-shadcn/components/data-table.tsx +807 -0
  112. package/templates/nextjs-shadcn/components/login-form.tsx +95 -0
  113. package/templates/nextjs-shadcn/components/nav-documents.tsx +92 -0
  114. package/templates/nextjs-shadcn/components/nav-main.tsx +73 -0
  115. package/templates/nextjs-shadcn/components/nav-projects.tsx +89 -0
  116. package/templates/nextjs-shadcn/components/nav-secondary.tsx +42 -0
  117. package/templates/nextjs-shadcn/components/nav-user.tsx +114 -0
  118. package/templates/nextjs-shadcn/components/section-cards.tsx +102 -0
  119. package/templates/nextjs-shadcn/components/site-header.tsx +30 -0
  120. package/templates/nextjs-shadcn/components/team-switcher.tsx +91 -0
  121. package/templates/nextjs-shadcn/components/ui/accordion.tsx +66 -0
  122. package/templates/nextjs-shadcn/components/ui/alert-dialog.tsx +196 -0
  123. package/templates/nextjs-shadcn/components/ui/alert.tsx +66 -0
  124. package/templates/nextjs-shadcn/components/ui/aspect-ratio.tsx +11 -0
  125. package/templates/nextjs-shadcn/components/ui/avatar.tsx +109 -0
  126. package/templates/nextjs-shadcn/components/ui/badge.tsx +48 -0
  127. package/templates/nextjs-shadcn/components/ui/breadcrumb.tsx +109 -0
  128. package/templates/nextjs-shadcn/components/ui/button-group.tsx +83 -0
  129. package/templates/nextjs-shadcn/components/ui/button.tsx +64 -0
  130. package/templates/nextjs-shadcn/components/ui/calendar.tsx +220 -0
  131. package/templates/nextjs-shadcn/components/ui/card.tsx +92 -0
  132. package/templates/nextjs-shadcn/components/ui/carousel.tsx +241 -0
  133. package/templates/nextjs-shadcn/components/ui/chart.tsx +357 -0
  134. package/templates/nextjs-shadcn/components/ui/checkbox.tsx +32 -0
  135. package/templates/nextjs-shadcn/components/ui/collapsible.tsx +33 -0
  136. package/templates/nextjs-shadcn/components/ui/combobox.tsx +310 -0
  137. package/templates/nextjs-shadcn/components/ui/command.tsx +184 -0
  138. package/templates/nextjs-shadcn/components/ui/context-menu.tsx +252 -0
  139. package/templates/nextjs-shadcn/components/ui/dialog.tsx +158 -0
  140. package/templates/nextjs-shadcn/components/ui/direction.tsx +22 -0
  141. package/templates/nextjs-shadcn/components/ui/drawer.tsx +135 -0
  142. package/templates/nextjs-shadcn/components/ui/dropdown-menu.tsx +257 -0
  143. package/templates/nextjs-shadcn/components/ui/empty.tsx +104 -0
  144. package/templates/nextjs-shadcn/components/ui/field.tsx +248 -0
  145. package/templates/nextjs-shadcn/components/ui/form.tsx +167 -0
  146. package/templates/nextjs-shadcn/components/ui/hover-card.tsx +44 -0
  147. package/templates/nextjs-shadcn/components/ui/input-group.tsx +170 -0
  148. package/templates/nextjs-shadcn/components/ui/input-otp.tsx +77 -0
  149. package/templates/nextjs-shadcn/components/ui/input.tsx +21 -0
  150. package/templates/nextjs-shadcn/components/ui/item.tsx +193 -0
  151. package/templates/nextjs-shadcn/components/ui/kbd.tsx +28 -0
  152. package/templates/nextjs-shadcn/components/ui/label.tsx +24 -0
  153. package/templates/nextjs-shadcn/components/ui/menubar.tsx +276 -0
  154. package/templates/nextjs-shadcn/components/ui/native-select.tsx +53 -0
  155. package/templates/nextjs-shadcn/components/ui/navigation-menu.tsx +168 -0
  156. package/templates/nextjs-shadcn/components/ui/pagination.tsx +127 -0
  157. package/templates/nextjs-shadcn/components/ui/popover.tsx +89 -0
  158. package/templates/nextjs-shadcn/components/ui/progress.tsx +31 -0
  159. package/templates/nextjs-shadcn/components/ui/radio-group.tsx +45 -0
  160. package/templates/nextjs-shadcn/components/ui/resizable.tsx +53 -0
  161. package/templates/nextjs-shadcn/components/ui/scroll-area.tsx +58 -0
  162. package/templates/nextjs-shadcn/components/ui/select.tsx +190 -0
  163. package/templates/nextjs-shadcn/components/ui/separator.tsx +28 -0
  164. package/templates/nextjs-shadcn/components/ui/sheet.tsx +143 -0
  165. package/templates/nextjs-shadcn/components/ui/sidebar.tsx +726 -0
  166. package/templates/nextjs-shadcn/components/ui/skeleton.tsx +13 -0
  167. package/templates/nextjs-shadcn/components/ui/slider.tsx +63 -0
  168. package/templates/nextjs-shadcn/components/ui/sonner.tsx +40 -0
  169. package/templates/nextjs-shadcn/components/ui/spinner.tsx +16 -0
  170. package/templates/nextjs-shadcn/components/ui/switch.tsx +35 -0
  171. package/templates/nextjs-shadcn/components/ui/table.tsx +116 -0
  172. package/templates/nextjs-shadcn/components/ui/tabs.tsx +91 -0
  173. package/templates/nextjs-shadcn/components/ui/textarea.tsx +18 -0
  174. package/templates/nextjs-shadcn/components/ui/toggle-group.tsx +83 -0
  175. package/templates/nextjs-shadcn/components/ui/toggle.tsx +47 -0
  176. package/templates/nextjs-shadcn/components/ui/tooltip.tsx +57 -0
  177. package/templates/nextjs-shadcn/components.json +23 -0
  178. package/templates/nextjs-shadcn/hooks/use-mobile.ts +19 -0
  179. package/templates/nextjs-shadcn/lib/utils.ts +6 -0
  180. package/templates/nextjs-shadcn/next-env.d.ts +6 -0
  181. package/templates/nextjs-shadcn/next.config.ts +8 -0
  182. package/templates/nextjs-shadcn/open-next.config.ts +6 -0
  183. package/templates/nextjs-shadcn/package.json +55 -0
  184. package/templates/nextjs-shadcn/postcss.config.mjs +8 -0
  185. package/templates/nextjs-shadcn/tsconfig.json +28 -0
  186. package/templates/nextjs-shadcn/wrangler.jsonc +23 -0
  187. package/templates/resend/.jack.json +64 -0
  188. package/templates/resend/bun.lock +23 -0
  189. package/templates/resend/package.json +16 -0
  190. package/templates/resend/schema.sql +13 -0
  191. package/templates/resend/src/email.ts +165 -0
  192. package/templates/resend/src/index.ts +108 -0
  193. package/templates/resend/tsconfig.json +17 -0
  194. package/templates/resend/wrangler.jsonc +11 -0
  195. package/templates/saas/.jack.json +1 -1
  196. package/templates/ai-chat/public/chat.js +0 -149
@@ -0,0 +1,126 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+ @import "shadcn/tailwind.css";
4
+
5
+ @custom-variant dark (&:is(.dark *));
6
+
7
+ @theme inline {
8
+ --font-sans: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
9
+ --font-mono: var(--font-geist-mono), ui-monospace, monospace;
10
+ --radius-sm: calc(var(--radius) - 4px);
11
+ --radius-md: calc(var(--radius) - 2px);
12
+ --radius-lg: var(--radius);
13
+ --radius-xl: calc(var(--radius) + 4px);
14
+ --radius-2xl: calc(var(--radius) + 8px);
15
+ --radius-3xl: calc(var(--radius) + 12px);
16
+ --radius-4xl: calc(var(--radius) + 16px);
17
+ --color-background: var(--background);
18
+ --color-foreground: var(--foreground);
19
+ --color-card: var(--card);
20
+ --color-card-foreground: var(--card-foreground);
21
+ --color-popover: var(--popover);
22
+ --color-popover-foreground: var(--popover-foreground);
23
+ --color-primary: var(--primary);
24
+ --color-primary-foreground: var(--primary-foreground);
25
+ --color-secondary: var(--secondary);
26
+ --color-secondary-foreground: var(--secondary-foreground);
27
+ --color-muted: var(--muted);
28
+ --color-muted-foreground: var(--muted-foreground);
29
+ --color-accent: var(--accent);
30
+ --color-accent-foreground: var(--accent-foreground);
31
+ --color-destructive: var(--destructive);
32
+ --color-border: var(--border);
33
+ --color-input: var(--input);
34
+ --color-ring: var(--ring);
35
+ --color-chart-1: var(--chart-1);
36
+ --color-chart-2: var(--chart-2);
37
+ --color-chart-3: var(--chart-3);
38
+ --color-chart-4: var(--chart-4);
39
+ --color-chart-5: var(--chart-5);
40
+ --color-sidebar: var(--sidebar);
41
+ --color-sidebar-foreground: var(--sidebar-foreground);
42
+ --color-sidebar-primary: var(--sidebar-primary);
43
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
44
+ --color-sidebar-accent: var(--sidebar-accent);
45
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
46
+ --color-sidebar-border: var(--sidebar-border);
47
+ --color-sidebar-ring: var(--sidebar-ring);
48
+ }
49
+
50
+ :root {
51
+ --radius: 0.625rem;
52
+ --background: oklch(1 0 0);
53
+ --foreground: oklch(0.141 0.005 285.823);
54
+ --card: oklch(1 0 0);
55
+ --card-foreground: oklch(0.141 0.005 285.823);
56
+ --popover: oklch(1 0 0);
57
+ --popover-foreground: oklch(0.141 0.005 285.823);
58
+ --primary: oklch(0.21 0.006 285.885);
59
+ --primary-foreground: oklch(0.985 0 0);
60
+ --secondary: oklch(0.967 0.001 286.375);
61
+ --secondary-foreground: oklch(0.21 0.006 285.885);
62
+ --muted: oklch(0.967 0.001 286.375);
63
+ --muted-foreground: oklch(0.552 0.016 285.938);
64
+ --accent: oklch(0.967 0.001 286.375);
65
+ --accent-foreground: oklch(0.21 0.006 285.885);
66
+ --destructive: oklch(0.577 0.245 27.325);
67
+ --border: oklch(0.92 0.004 286.32);
68
+ --input: oklch(0.92 0.004 286.32);
69
+ --ring: oklch(0.705 0.015 286.067);
70
+ --chart-1: oklch(0.646 0.222 41.116);
71
+ --chart-2: oklch(0.6 0.118 184.704);
72
+ --chart-3: oklch(0.398 0.07 227.392);
73
+ --chart-4: oklch(0.828 0.189 84.429);
74
+ --chart-5: oklch(0.769 0.188 70.08);
75
+ --sidebar: oklch(0.985 0 0);
76
+ --sidebar-foreground: oklch(0.141 0.005 285.823);
77
+ --sidebar-primary: oklch(0.21 0.006 285.885);
78
+ --sidebar-primary-foreground: oklch(0.985 0 0);
79
+ --sidebar-accent: oklch(0.967 0.001 286.375);
80
+ --sidebar-accent-foreground: oklch(0.21 0.006 285.885);
81
+ --sidebar-border: oklch(0.92 0.004 286.32);
82
+ --sidebar-ring: oklch(0.705 0.015 286.067);
83
+ }
84
+
85
+ .dark {
86
+ --background: oklch(0.141 0.005 285.823);
87
+ --foreground: oklch(0.985 0 0);
88
+ --card: oklch(0.21 0.006 285.885);
89
+ --card-foreground: oklch(0.985 0 0);
90
+ --popover: oklch(0.21 0.006 285.885);
91
+ --popover-foreground: oklch(0.985 0 0);
92
+ --primary: oklch(0.92 0.004 286.32);
93
+ --primary-foreground: oklch(0.21 0.006 285.885);
94
+ --secondary: oklch(0.274 0.006 286.033);
95
+ --secondary-foreground: oklch(0.985 0 0);
96
+ --muted: oklch(0.274 0.006 286.033);
97
+ --muted-foreground: oklch(0.705 0.015 286.067);
98
+ --accent: oklch(0.274 0.006 286.033);
99
+ --accent-foreground: oklch(0.985 0 0);
100
+ --destructive: oklch(0.704 0.191 22.216);
101
+ --border: oklch(1 0 0 / 10%);
102
+ --input: oklch(1 0 0 / 15%);
103
+ --ring: oklch(0.552 0.016 285.938);
104
+ --chart-1: oklch(0.488 0.243 264.376);
105
+ --chart-2: oklch(0.696 0.17 162.48);
106
+ --chart-3: oklch(0.769 0.188 70.08);
107
+ --chart-4: oklch(0.627 0.265 303.9);
108
+ --chart-5: oklch(0.645 0.246 16.439);
109
+ --sidebar: oklch(0.21 0.006 285.885);
110
+ --sidebar-foreground: oklch(0.985 0 0);
111
+ --sidebar-primary: oklch(0.488 0.243 264.376);
112
+ --sidebar-primary-foreground: oklch(0.985 0 0);
113
+ --sidebar-accent: oklch(0.274 0.006 286.033);
114
+ --sidebar-accent-foreground: oklch(0.985 0 0);
115
+ --sidebar-border: oklch(1 0 0 / 10%);
116
+ --sidebar-ring: oklch(0.552 0.016 285.938);
117
+ }
118
+
119
+ @layer base {
120
+ * {
121
+ @apply border-border outline-ring/50;
122
+ }
123
+ body {
124
+ @apply bg-background text-foreground;
125
+ }
126
+ }
@@ -0,0 +1,3 @@
1
+ export function GET() {
2
+ return Response.json({ status: "ok", timestamp: Date.now() });
3
+ }
@@ -0,0 +1,24 @@
1
+ import { TooltipProvider } from "@/components/ui/tooltip";
2
+ import { GeistMono } from "geist/font/mono";
3
+ import { GeistSans } from "geist/font/sans";
4
+ import type { Metadata } from "next";
5
+ import "./globals.css";
6
+
7
+ export const metadata: Metadata = {
8
+ title: "jack-template",
9
+ description: "Next.js + shadcn/ui app built with jack",
10
+ };
11
+
12
+ export default function RootLayout({
13
+ children,
14
+ }: {
15
+ children: React.ReactNode;
16
+ }) {
17
+ return (
18
+ <html lang="en" className={`${GeistSans.variable} ${GeistMono.variable}`}>
19
+ <body className="font-sans antialiased">
20
+ <TooltipProvider>{children}</TooltipProvider>
21
+ </body>
22
+ </html>
23
+ );
24
+ }
@@ -0,0 +1,19 @@
1
+ import { GalleryVerticalEnd } from "lucide-react"
2
+
3
+ import { LoginForm } from "@/components/login-form"
4
+
5
+ export default function LoginPage() {
6
+ return (
7
+ <div className="bg-muted flex min-h-svh flex-col items-center justify-center gap-6 p-6 md:p-10">
8
+ <div className="flex w-full max-w-sm flex-col gap-6">
9
+ <a href="#" className="flex items-center gap-2 self-center font-medium">
10
+ <div className="bg-primary text-primary-foreground flex size-6 items-center justify-center rounded-md">
11
+ <GalleryVerticalEnd className="size-4" />
12
+ </div>
13
+ Acme Inc.
14
+ </a>
15
+ <LoginForm />
16
+ </div>
17
+ </div>
18
+ )
19
+ }
@@ -0,0 +1,180 @@
1
+ import { Badge } from "@/components/ui/badge";
2
+ import { Button } from "@/components/ui/button";
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
4
+ import { Separator } from "@/components/ui/separator";
5
+ import {
6
+ ArrowRight,
7
+ Database,
8
+ LayoutDashboard,
9
+ LogIn,
10
+ Palette,
11
+ PanelLeft,
12
+ Zap,
13
+ } from "lucide-react";
14
+ import Link from "next/link";
15
+ import { ComponentShowcase } from "./showcase";
16
+
17
+ export default function Home() {
18
+ return (
19
+ <div className="min-h-screen bg-background">
20
+ <header className="border-b">
21
+ <div className="container mx-auto flex h-14 items-center justify-between px-6">
22
+ <div className="flex items-center gap-2 font-semibold">
23
+ <div className="flex size-7 items-center justify-center rounded-md bg-primary text-primary-foreground text-xs">
24
+ J
25
+ </div>
26
+ jack-template
27
+ </div>
28
+ <nav className="flex items-center gap-1">
29
+ <Button variant="ghost" size="sm" asChild>
30
+ <Link href="/dashboard">Dashboard</Link>
31
+ </Button>
32
+ <Button variant="ghost" size="sm" asChild>
33
+ <Link href="/login">Login</Link>
34
+ </Button>
35
+ </nav>
36
+ </div>
37
+ </header>
38
+
39
+ <main className="container mx-auto px-6 py-16">
40
+ <section className="mx-auto max-w-2xl text-center">
41
+ <Badge variant="secondary" className="mb-4">
42
+ Next.js + shadcn/ui + D1
43
+ </Badge>
44
+ <h1 className="text-4xl font-bold tracking-tight sm:text-5xl">
45
+ Start building with
46
+ <br />
47
+ <span className="text-muted-foreground">57 components</span> ready to go
48
+ </h1>
49
+ <p className="mt-4 text-lg text-muted-foreground">
50
+ All shadcn/ui components pre-installed. D1 database included. Just ship it.
51
+ </p>
52
+ <div className="mt-8 flex items-center justify-center gap-3">
53
+ <Button size="lg" asChild>
54
+ <Link href="/dashboard">
55
+ View Dashboard
56
+ <ArrowRight className="ml-2 size-4" />
57
+ </Link>
58
+ </Button>
59
+ <Button size="lg" variant="outline" asChild>
60
+ <Link href="/login">Login Page</Link>
61
+ </Button>
62
+ </div>
63
+ </section>
64
+
65
+ <Separator className="my-16" />
66
+
67
+ <section className="grid gap-4 md:grid-cols-3">
68
+ <Link href="/dashboard" className="group">
69
+ <Card className="h-full transition-shadow group-hover:shadow-lg">
70
+ <CardHeader>
71
+ <div className="flex items-center gap-3">
72
+ <div className="flex size-10 items-center justify-center rounded-lg bg-primary/10">
73
+ <LayoutDashboard className="size-5 text-primary" />
74
+ </div>
75
+ <div>
76
+ <CardTitle className="text-base">Dashboard</CardTitle>
77
+ <CardDescription>Sidebar, charts, data table</CardDescription>
78
+ </div>
79
+ </div>
80
+ </CardHeader>
81
+ <CardContent>
82
+ <p className="text-sm text-muted-foreground">
83
+ Full dashboard layout with collapsible sidebar, interactive charts, and sortable
84
+ data table.
85
+ </p>
86
+ </CardContent>
87
+ </Card>
88
+ </Link>
89
+
90
+ <Link href="/login" className="group">
91
+ <Card className="h-full transition-shadow group-hover:shadow-lg">
92
+ <CardHeader>
93
+ <div className="flex items-center gap-3">
94
+ <div className="flex size-10 items-center justify-center rounded-lg bg-primary/10">
95
+ <LogIn className="size-5 text-primary" />
96
+ </div>
97
+ <div>
98
+ <CardTitle className="text-base">Login</CardTitle>
99
+ <CardDescription>Auth form with socials</CardDescription>
100
+ </div>
101
+ </div>
102
+ </CardHeader>
103
+ <CardContent>
104
+ <p className="text-sm text-muted-foreground">
105
+ Login form with email/password, social providers, and responsive layout.
106
+ </p>
107
+ </CardContent>
108
+ </Card>
109
+ </Link>
110
+
111
+ <Card className="h-full">
112
+ <CardHeader>
113
+ <div className="flex items-center gap-3">
114
+ <div className="flex size-10 items-center justify-center rounded-lg bg-primary/10">
115
+ <PanelLeft className="size-5 text-primary" />
116
+ </div>
117
+ <div>
118
+ <CardTitle className="text-base">Sidebar</CardTitle>
119
+ <CardDescription>Collapsible navigation</CardDescription>
120
+ </div>
121
+ </div>
122
+ </CardHeader>
123
+ <CardContent>
124
+ <p className="text-sm text-muted-foreground">
125
+ Multi-level sidebar with team switcher, project nav, and user menu.
126
+ </p>
127
+ </CardContent>
128
+ </Card>
129
+ </section>
130
+
131
+ <Separator className="my-16" />
132
+
133
+ <section>
134
+ <h2 className="mb-8 text-center text-2xl font-semibold">Component Preview</h2>
135
+ <ComponentShowcase />
136
+ </section>
137
+
138
+ <Separator className="my-16" />
139
+
140
+ <section className="mx-auto max-w-2xl">
141
+ <h2 className="mb-8 text-center text-2xl font-semibold">What&apos;s Included</h2>
142
+ <div className="grid gap-4 sm:grid-cols-3">
143
+ <div className="flex flex-col items-center gap-2 text-center">
144
+ <div className="flex size-12 items-center justify-center rounded-xl bg-primary/10">
145
+ <Palette className="size-6 text-primary" />
146
+ </div>
147
+ <h3 className="font-medium">57 Components</h3>
148
+ <p className="text-sm text-muted-foreground">
149
+ Every shadcn/ui component, ready to import
150
+ </p>
151
+ </div>
152
+ <div className="flex flex-col items-center gap-2 text-center">
153
+ <div className="flex size-12 items-center justify-center rounded-xl bg-primary/10">
154
+ <Database className="size-6 text-primary" />
155
+ </div>
156
+ <h3 className="font-medium">D1 Database</h3>
157
+ <p className="text-sm text-muted-foreground">
158
+ SQLite database with global replication
159
+ </p>
160
+ </div>
161
+ <div className="flex flex-col items-center gap-2 text-center">
162
+ <div className="flex size-12 items-center justify-center rounded-xl bg-primary/10">
163
+ <Zap className="size-6 text-primary" />
164
+ </div>
165
+ <h3 className="font-medium">Edge SSR</h3>
166
+ <p className="text-sm text-muted-foreground">Server-rendered globally via OpenNext</p>
167
+ </div>
168
+ </div>
169
+ </section>
170
+ </main>
171
+
172
+ <footer className="border-t py-6">
173
+ <p className="text-center text-sm text-muted-foreground">
174
+ Built with jack. Ship it with{" "}
175
+ <code className="rounded bg-muted px-1 py-0.5">jack ship</code>
176
+ </p>
177
+ </footer>
178
+ </div>
179
+ );
180
+ }