create-nara 0.1.0

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 (50) hide show
  1. package/README.md +17 -0
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.js +50 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.js +3 -0
  6. package/dist/template.d.ts +8 -0
  7. package/dist/template.js +68 -0
  8. package/package.json +28 -0
  9. package/templates/base/.env.example +3 -0
  10. package/templates/base/tsconfig.json +14 -0
  11. package/templates/minimal/routes/web.ts +11 -0
  12. package/templates/minimal/server.ts +10 -0
  13. package/templates/svelte/resources/js/app.ts +12 -0
  14. package/templates/svelte/resources/js/components/DarkModeToggle.svelte +67 -0
  15. package/templates/svelte/resources/js/components/Header.svelte +240 -0
  16. package/templates/svelte/resources/js/components/NaraIcon.svelte +3 -0
  17. package/templates/svelte/resources/js/components/Pagination.svelte +55 -0
  18. package/templates/svelte/resources/js/components/UserModal.svelte +234 -0
  19. package/templates/svelte/resources/js/components/helper.ts +300 -0
  20. package/templates/svelte/resources/js/pages/auth/forgot-password.svelte +97 -0
  21. package/templates/svelte/resources/js/pages/auth/login.svelte +138 -0
  22. package/templates/svelte/resources/js/pages/auth/register.svelte +176 -0
  23. package/templates/svelte/resources/js/pages/auth/reset-password.svelte +106 -0
  24. package/templates/svelte/resources/js/pages/dashboard.svelte +224 -0
  25. package/templates/svelte/resources/js/pages/landing.svelte +446 -0
  26. package/templates/svelte/resources/js/pages/profile.svelte +368 -0
  27. package/templates/svelte/resources/js/pages/users.svelte +260 -0
  28. package/templates/svelte/resources/views/inertia.html +12 -0
  29. package/templates/svelte/routes/web.ts +17 -0
  30. package/templates/svelte/server.ts +12 -0
  31. package/templates/svelte/vite.config.ts +19 -0
  32. package/templates/vue/resources/js/app.ts +14 -0
  33. package/templates/vue/resources/js/components/DarkModeToggle.vue +81 -0
  34. package/templates/vue/resources/js/components/Header.vue +251 -0
  35. package/templates/vue/resources/js/components/NaraIcon.vue +5 -0
  36. package/templates/vue/resources/js/components/Pagination.vue +71 -0
  37. package/templates/vue/resources/js/components/UserModal.vue +276 -0
  38. package/templates/vue/resources/js/components/index.ts +5 -0
  39. package/templates/vue/resources/js/pages/auth/forgot-password.vue +105 -0
  40. package/templates/vue/resources/js/pages/auth/login.vue +142 -0
  41. package/templates/vue/resources/js/pages/auth/register.vue +183 -0
  42. package/templates/vue/resources/js/pages/auth/reset-password.vue +115 -0
  43. package/templates/vue/resources/js/pages/dashboard.vue +233 -0
  44. package/templates/vue/resources/js/pages/landing.vue +358 -0
  45. package/templates/vue/resources/js/pages/profile.vue +370 -0
  46. package/templates/vue/resources/js/pages/users.vue +264 -0
  47. package/templates/vue/resources/views/inertia.html +12 -0
  48. package/templates/vue/routes/web.ts +17 -0
  49. package/templates/vue/server.ts +12 -0
  50. package/templates/vue/vite.config.ts +19 -0
@@ -0,0 +1,446 @@
1
+ <script lang="ts">
2
+ import { inertia, page } from '@inertiajs/svelte'
3
+ import { fade, fly } from 'svelte/transition'
4
+ import { onMount } from 'svelte'
5
+ import DarkModeToggle from '../Components/DarkModeToggle.svelte'
6
+
7
+ interface User {
8
+ id: string;
9
+ name: string;
10
+ email: string;
11
+ is_admin: boolean;
12
+ is_verified: boolean;
13
+ }
14
+
15
+ let user = $page.props.user as User | undefined
16
+ let scrollY = 0;
17
+ let innerHeight = 0;
18
+
19
+ // Simple intersection observer alternative using scroll position for parallax/reveal effects
20
+ $: scrolled = scrollY > 50;
21
+ </script>
22
+
23
+ <svelte:window bind:scrollY bind:innerHeight />
24
+
25
+ <div class="min-h-screen bg-surface-light dark:bg-surface-dark text-slate-900 dark:text-slate-100 transition-colors duration-500 overflow-x-hidden selection:bg-primary-400 selection:text-black">
26
+
27
+ <!-- Floating Navigation -->
28
+ <nav
29
+ class="fixed top-0 left-0 right-0 z-50 px-6 py-6 flex justify-between items-start transition-all duration-500 {scrolled ? 'bg-white/80 dark:bg-black/80 backdrop-blur-md border-b border-slate-200 dark:border-white/10 py-4' : 'mix-blend-difference text-white'}"
30
+ >
31
+ <div class="flex flex-col relative z-10">
32
+ <a href="/" class="text-xl font-bold tracking-tighter hover:opacity-70 transition-opacity">NARA.</a>
33
+ </div>
34
+
35
+ <div class="flex items-center gap-6 text-sm font-medium relative z-10">
36
+ <a href="https://github.com/MasRama/nara" target="_blank" class="hidden sm:block hover:underline decoration-1 underline-offset-4">GitHub</a>
37
+ <a href="https://github.com/MasRama/nara#readme" target="_blank" class="hidden sm:block hover:underline decoration-1 underline-offset-4">Docs</a>
38
+
39
+ <div class="h-4 w-px bg-current opacity-30 hidden sm:block"></div>
40
+
41
+ {#if user}
42
+ <a href="/dashboard" use:inertia class="hover:underline decoration-1 underline-offset-4">Dashboard</a>
43
+ {:else}
44
+ <a href="/login" use:inertia class="hover:underline decoration-1 underline-offset-4">Login</a>
45
+ {/if}
46
+
47
+ <div class="pl-2">
48
+ <DarkModeToggle />
49
+ </div>
50
+ </div>
51
+ </nav>
52
+
53
+ <!-- Hero Section -->
54
+ <header class="relative min-h-screen flex flex-col justify-center px-6 sm:px-12 lg:px-24 pt-20">
55
+ <div class="max-w-[90rem] mx-auto w-full">
56
+ <div in:fly={{ y: 50, duration: 1000, delay: 200 }} class="flex flex-col gap-2">
57
+ <h1 class="text-[13vw] leading-[0.8] font-bold tracking-tighter -ml-[0.05em]">
58
+ PURE
59
+ <span class="block text-transparent bg-clip-text bg-gradient-to-r from-primary-500 to-primary-300 dark:from-primary-400 dark:to-info-300">
60
+ SPEED
61
+ </span>
62
+ </h1>
63
+ </div>
64
+
65
+ <div class="mt-12 sm:mt-24 grid grid-cols-1 lg:grid-cols-12 gap-12 items-end">
66
+ <div class="lg:col-span-5 text-lg sm:text-xl leading-relaxed font-serif italic text-slate-600 dark:text-slate-400">
67
+ <p in:fly={{ y: 20, duration: 1000, delay: 600 }}>
68
+ "Complexity is the enemy of execution. Nara strips away the layers to reveal the raw power of the metal."
69
+ </p>
70
+ </div>
71
+ <div class="lg:col-span-7 flex flex-col items-start lg:items-end gap-6">
72
+ <div class="flex items-center gap-4" in:fly={{ y: 20, duration: 1000, delay: 800 }}>
73
+ <span class="text-xs uppercase tracking-widest opacity-50">Benchmarks</span>
74
+ <div class="h-px w-12 bg-current opacity-20"></div>
75
+ <span class="font-mono text-primary-600 dark:text-primary-400">258k req/s</span>
76
+ </div>
77
+
78
+ <div in:fly={{ y: 20, duration: 1000, delay: 1000 }}>
79
+ {#if !user}
80
+ <a
81
+ href="/register"
82
+ use:inertia
83
+ class="group relative inline-flex items-center justify-center px-8 py-4 bg-slate-900 dark:bg-slate-100 text-white dark:text-black rounded-full overflow-hidden transition-transform hover:scale-105 active:scale-95"
84
+ >
85
+ <span class="relative z-10 font-bold tracking-wide">START BUILDING</span>
86
+ <div class="absolute inset-0 bg-primary-500 transform translate-y-full transition-transform duration-300 group-hover:translate-y-0"></div>
87
+ </a>
88
+ {/if}
89
+ </div>
90
+ </div>
91
+ </div>
92
+ </div>
93
+
94
+ <!-- Scroll Indicator -->
95
+ <div class="absolute bottom-12 left-6 sm:left-12 animate-bounce opacity-50">
96
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
97
+ <path d="M7 13l5 5 5-5M7 6l5 5 5-5"/>
98
+ </svg>
99
+ </div>
100
+ </header>
101
+
102
+ <!-- Narrative Section -->
103
+ <section class="py-32 px-6 sm:px-12 lg:px-24 bg-white dark:bg-surface-card-dark">
104
+ <div class="max-w-6xl mx-auto">
105
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-20">
106
+ <div>
107
+ <span class="block text-xs font-bold uppercase tracking-[0.2em] text-primary-600 dark:text-primary-400 mb-8">The Manifesto</span>
108
+ <h2 class="text-5xl sm:text-6xl font-bold tracking-tighter leading-none mb-12">
109
+ Return to <br/>
110
+ <span class="font-serif italic font-normal text-slate-400">Craftsmanship.</span>
111
+ </h2>
112
+ </div>
113
+ <div class="space-y-8 text-lg sm:text-xl leading-relaxed text-slate-600 dark:text-slate-300">
114
+ <p>
115
+ We built Nara because we were tired. Tired of configuration files that are longer than the business logic. Tired of "optimizing" things that shouldn't be slow in the first place.
116
+ </p>
117
+ <p>
118
+ Nara is <strong class="text-slate-900 dark:text-white">opinionated</strong>. It chooses the best tools—HyperExpress for the server, SQLite for the data, Svelte for the interface—and tunes them to sing in perfect harmony.
119
+ </p>
120
+ </div>
121
+ </div>
122
+ </div>
123
+ </section>
124
+
125
+ <!-- Feature Showcase (Stack) -->
126
+ <section class="py-24 sm:py-32 border-y border-slate-200 dark:border-white/5 relative overflow-hidden">
127
+ <div class="px-6 sm:px-12 lg:px-24 mb-16 flex flex-col md:flex-row md:items-end justify-between gap-8">
128
+ <div>
129
+ <span class="block text-xs font-bold uppercase tracking-[0.2em] text-primary-600 dark:text-primary-400 mb-4">The Powerhouse</span>
130
+ <h3 class="text-5xl sm:text-7xl font-bold tracking-tighter text-slate-900 dark:text-white">
131
+ ARSENAL
132
+ </h3>
133
+ </div>
134
+ <p class="text-slate-600 dark:text-slate-400 max-w-md text-sm sm:text-base leading-relaxed">
135
+ Precision tools for digital artisans. <br class="hidden sm:block" />
136
+ Forged for speed, honed for control.
137
+ </p>
138
+ </div>
139
+
140
+ <div class="px-6 sm:px-12 lg:px-24">
141
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
142
+
143
+ <!-- Card 1: HyperExpress -->
144
+ <div class="group relative h-64 bg-surface-card-light dark:bg-surface-card-dark border border-slate-200 dark:border-white/5 hover:border-primary-500/50 dark:hover:border-primary-500/30 p-6 flex flex-col justify-between transition-all duration-500 overflow-hidden rounded-2xl">
145
+ <div class="absolute top-0 right-0 p-32 bg-primary-500/5 rounded-full blur-3xl -mr-16 -mt-16 group-hover:bg-primary-500/10 transition-colors duration-500"></div>
146
+
147
+ <div class="relative z-10 flex justify-between items-start">
148
+ <div class="p-2 bg-white dark:bg-white/5 rounded-lg border border-slate-200 dark:border-white/10 group-hover:scale-110 transition-transform duration-300">
149
+ <!-- Icon: Lightning -->
150
+ <svg class="w-6 h-6 text-primary-600 dark:text-primary-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
151
+ <path d="M13 2L3 14H12L11 22L21 10H12L13 2Z" stroke-linecap="round" stroke-linejoin="round"/>
152
+ </svg>
153
+ </div>
154
+ <span class="text-[10px] font-mono opacity-40">BACKEND</span>
155
+ </div>
156
+
157
+ <div class="relative z-10">
158
+ <div class="flex items-baseline gap-2 mb-2">
159
+ <h4 class="text-xl font-bold">HyperExpress</h4>
160
+ <span class="text-[10px] bg-slate-200 dark:bg-white/10 px-1.5 py-0.5 rounded text-slate-600 dark:text-slate-300">v6.x</span>
161
+ </div>
162
+ <p class="text-xs text-slate-500 dark:text-slate-400 leading-relaxed mb-4">
163
+ The engine. Raw metal performance, zero compromise.
164
+ </p>
165
+ <div class="w-full h-1 bg-slate-200 dark:bg-white/10 rounded-full overflow-hidden">
166
+ <div class="h-full bg-primary-500 w-[98%]"></div>
167
+ </div>
168
+ <div class="flex justify-between text-[9px] font-mono mt-2 opacity-60">
169
+ <span>BENCHMARK</span>
170
+ <span>250K REQ/S</span>
171
+ </div>
172
+ </div>
173
+ </div>
174
+
175
+ <!-- Card 2: Inertia -->
176
+ <div class="group relative h-64 bg-surface-card-light dark:bg-surface-card-dark border border-slate-200 dark:border-white/5 hover:border-accent-500/50 dark:hover:border-accent-500/30 p-6 flex flex-col justify-between transition-all duration-500 overflow-hidden rounded-2xl">
177
+ <div class="absolute top-0 right-0 p-32 bg-accent-500/5 rounded-full blur-3xl -mr-16 -mt-16 group-hover:bg-accent-500/10 transition-colors duration-500"></div>
178
+
179
+ <div class="relative z-10 flex justify-between items-start">
180
+ <div class="p-2 bg-white dark:bg-white/5 rounded-lg border border-slate-200 dark:border-white/10 group-hover:scale-110 transition-transform duration-300">
181
+ <!-- Icon: Layers -->
182
+ <svg class="w-6 h-6 text-accent-600 dark:text-accent-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
183
+ <path d="M12 2L2 7L12 12L22 7L12 2Z" stroke-linecap="round" stroke-linejoin="round"/>
184
+ <path d="M2 17L12 22L22 17" stroke-linecap="round" stroke-linejoin="round"/>
185
+ <path d="M2 12L12 17L22 12" stroke-linecap="round" stroke-linejoin="round"/>
186
+ </svg>
187
+ </div>
188
+ <span class="text-[10px] font-mono opacity-40">PROTOCOL</span>
189
+ </div>
190
+
191
+ <div class="relative z-10">
192
+ <h4 class="text-xl font-bold mb-2">Inertia.js</h4>
193
+ <p class="text-xs text-slate-500 dark:text-slate-400 leading-relaxed">
194
+ The bridge. Monolith simplicity, SPA fluidity.
195
+ </p>
196
+ <div class="mt-4 flex gap-2">
197
+ <span class="text-[10px] border border-accent-500/20 text-accent-600 dark:text-accent-400 px-2 py-1 rounded">No API</span>
198
+ <span class="text-[10px] border border-accent-500/20 text-accent-600 dark:text-accent-400 px-2 py-1 rounded">Shared Data</span>
199
+ </div>
200
+ </div>
201
+ </div>
202
+
203
+ <!-- Card 3: Svelte -->
204
+ <div class="group relative h-64 bg-surface-card-light dark:bg-surface-card-dark border border-slate-200 dark:border-white/5 hover:border-warning-500/50 dark:hover:border-warning-500/30 p-6 flex flex-col justify-between transition-all duration-500 overflow-hidden rounded-2xl">
205
+ <div class="absolute top-0 right-0 p-32 bg-warning-500/5 rounded-full blur-3xl -mr-16 -mt-16 group-hover:bg-warning-500/10 transition-colors duration-500"></div>
206
+
207
+ <div class="relative z-10 flex justify-between items-start">
208
+ <div class="p-2 bg-white dark:bg-white/5 rounded-lg border border-slate-200 dark:border-white/10 group-hover:scale-110 transition-transform duration-300">
209
+ <!-- Icon: Code -->
210
+ <svg class="w-6 h-6 text-warning-600 dark:text-warning-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
211
+ <path d="M16 18L22 12L16 6" stroke-linecap="round" stroke-linejoin="round"/>
212
+ <path d="M8 6L2 12L8 18" stroke-linecap="round" stroke-linejoin="round"/>
213
+ </svg>
214
+ </div>
215
+ <span class="text-[10px] font-mono opacity-40">FRONTEND</span>
216
+ </div>
217
+
218
+ <div class="relative z-10">
219
+ <h4 class="text-xl font-bold mb-2">Svelte</h4>
220
+ <p class="text-xs text-slate-500 dark:text-slate-400 leading-relaxed">
221
+ The canvas. Pure reactivity, no virtual DOM overhead.
222
+ </p>
223
+ <div class="mt-4 grid grid-cols-2 gap-2 text-[10px] font-mono opacity-60">
224
+ <div class="flex items-center gap-1">
225
+ <div class="w-1.5 h-1.5 rounded-full bg-warning-500"></div>
226
+ <span>Reactive</span>
227
+ </div>
228
+ <div class="flex items-center gap-1">
229
+ <div class="w-1.5 h-1.5 rounded-full bg-warning-500"></div>
230
+ <span>Tiny Bundle</span>
231
+ </div>
232
+ </div>
233
+ </div>
234
+ </div>
235
+
236
+ <!-- Card 4: Knex -->
237
+ <div class="group relative h-64 bg-surface-card-light dark:bg-surface-card-dark border border-slate-200 dark:border-white/5 hover:border-danger-500/50 dark:hover:border-danger-500/30 p-6 flex flex-col justify-between transition-all duration-500 overflow-hidden rounded-2xl">
238
+ <div class="absolute top-0 right-0 p-32 bg-danger-500/5 rounded-full blur-3xl -mr-16 -mt-16 group-hover:bg-danger-500/10 transition-colors duration-500"></div>
239
+
240
+ <div class="relative z-10 flex justify-between items-start">
241
+ <div class="p-2 bg-white dark:bg-white/5 rounded-lg border border-slate-200 dark:border-white/10 group-hover:scale-110 transition-transform duration-300">
242
+ <!-- Icon: Database Cog -->
243
+ <svg class="w-6 h-6 text-danger-600 dark:text-danger-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
244
+ <path d="M21 12V7C21 6.46957 20.7893 5.96086 20.4142 5.58579C20.0391 5.21071 19.5304 5 19 5H5C4.46957 5 3.96086 5.21071 3.58579 5.58579C3.21071 5.96086 3 6.46957 3 7V17C3 17.5304 3.21071 18.0391 3.58579 18.4142C3.96086 18.7893 4.46957 19 5 19H12" stroke-linecap="round" stroke-linejoin="round"/>
245
+ <path d="M21 5H3" stroke-linecap="round" stroke-linejoin="round"/>
246
+ <path d="M7 19V5" stroke-linecap="round" stroke-linejoin="round"/>
247
+ <circle cx="18" cy="18" r="3" stroke-linecap="round" stroke-linejoin="round"/>
248
+ <path d="M20.2 20.2L22 22" stroke-linecap="round" stroke-linejoin="round"/>
249
+ </svg>
250
+ </div>
251
+ <span class="text-[10px] font-mono opacity-40">ORM</span>
252
+ </div>
253
+
254
+ <div class="relative z-10">
255
+ <h4 class="text-xl font-bold mb-2">Knex.js</h4>
256
+ <p class="text-xs text-slate-500 dark:text-slate-400 leading-relaxed">
257
+ The architect. SQL control with TypeScript precision.
258
+ </p>
259
+ <div class="mt-auto pt-4 space-y-1">
260
+ <div class="h-1 w-3/4 bg-slate-200 dark:bg-white/10 rounded-full"></div>
261
+ <div class="h-1 w-1/2 bg-slate-200 dark:bg-white/10 rounded-full"></div>
262
+ </div>
263
+ </div>
264
+ </div>
265
+
266
+ <!-- Card 5: SQLite -->
267
+ <div class="group relative h-64 bg-surface-card-light dark:bg-surface-card-dark border border-slate-200 dark:border-white/5 hover:border-info-500/50 dark:hover:border-info-500/30 p-6 flex flex-col justify-between transition-all duration-500 overflow-hidden rounded-2xl">
268
+ <div class="absolute top-0 right-0 p-32 bg-info-500/5 rounded-full blur-3xl -mr-16 -mt-16 group-hover:bg-info-500/10 transition-colors duration-500"></div>
269
+
270
+ <div class="relative z-10 flex justify-between items-start">
271
+ <div class="p-2 bg-white dark:bg-white/5 rounded-lg border border-slate-200 dark:border-white/10 group-hover:scale-110 transition-transform duration-300">
272
+ <!-- Icon: Storage -->
273
+ <svg class="w-6 h-6 text-info-600 dark:text-info-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
274
+ <path d="M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H5C4.46957 17 3.96086 16.7893 3.58579 16.4142C3.21071 16.0391 3 15.5304 3 15M21 15V9C21 8.46957 20.7893 7.96086 20.4142 7.58579C20.0391 7.21071 19.5304 7 19 7H5C4.46957 7 3.96086 7.21071 3.58579 7.58579C3.21071 7.96086 3 8.46957 3 9V15M21 15C21 14.4696 20.7893 13.9609 20.4142 13.5858C20.0391 13.2107 19.5304 13 19 13H5C4.46957 13 3.96086 13.2107 3.58579 13.5858C3.21071 13.9609 3 14.4696 3 15" stroke-linecap="round" stroke-linejoin="round"/>
275
+ </svg>
276
+ </div>
277
+ <span class="text-[10px] font-mono opacity-40">DATA</span>
278
+ </div>
279
+
280
+ <div class="relative z-10">
281
+ <h4 class="text-xl font-bold mb-2">SQLite</h4>
282
+ <p class="text-xs text-slate-500 dark:text-slate-400 leading-relaxed">
283
+ The vault. Zero latency, WAL mode enabled by default.
284
+ </p>
285
+ <div class="mt-4 flex items-center gap-2">
286
+ <span class="text-[10px] font-mono bg-info-500/10 text-info-600 dark:text-info-400 px-2 py-1 rounded">WAL MODE</span>
287
+ <span class="text-[10px] font-mono opacity-50">Local file</span>
288
+ </div>
289
+ </div>
290
+ </div>
291
+
292
+ <!-- Card 6: Nara CLI -->
293
+ <div class="group relative h-64 bg-slate-900 dark:bg-slate-100 text-white dark:text-slate-900 p-6 flex flex-col justify-between transition-all duration-500 overflow-hidden rounded-2xl">
294
+ <!-- Distinct styling for the CLI card -->
295
+ <div class="absolute inset-0 bg-[url('https://grainy-gradients.vercel.app/noise.svg')] opacity-20"></div>
296
+
297
+ <div class="relative z-10 flex justify-between items-start">
298
+ <div class="p-2 bg-white/10 dark:bg-black/5 rounded-lg border border-white/10 dark:border-black/5 group-hover:scale-110 transition-transform duration-300">
299
+ <!-- Icon: Terminal -->
300
+ <svg class="w-6 h-6" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
301
+ <path d="M4 17L10 11L4 5" stroke-linecap="round" stroke-linejoin="round"/>
302
+ <path d="M12 19H20" stroke-linecap="round" stroke-linejoin="round"/>
303
+ </svg>
304
+ </div>
305
+ <span class="text-[10px] font-mono opacity-60">TOOLING</span>
306
+ </div>
307
+
308
+ <div class="relative z-10">
309
+ <h4 class="text-xl font-bold mb-2">Nara CLI</h4>
310
+ <p class="text-xs opacity-80 leading-relaxed">
311
+ The command. Orchestrate your entire stack instantly.
312
+ </p>
313
+ <div class="mt-4 font-mono text-[10px] bg-black/20 dark:bg-white/20 p-2 rounded">
314
+ <span class="opacity-50">$</span> nara new my-app
315
+ </div>
316
+ </div>
317
+ </div>
318
+ </div>
319
+ </div>
320
+ </section>
321
+
322
+
323
+
324
+ <!-- Section: The Complete Toolkit (Battery Pack) -->
325
+ <section class="py-32 px-6 sm:px-12 lg:px-24 bg-white dark:bg-surface-dark border-t border-slate-200 dark:border-white/5">
326
+ <div class="mb-20">
327
+ <h3 class="text-4xl sm:text-6xl font-bold tracking-tighter mb-6">
328
+ BATTERIES INCLUDED.<br/>
329
+ <span class="text-slate-400">WEAPONIZED.</span>
330
+ </h3>
331
+ <p class="text-lg text-slate-600 dark:text-slate-400 max-w-2xl">
332
+ Not a skeleton. A nervous system. Wired for speed. Ready for war.
333
+ </p>
334
+ </div>
335
+
336
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-16 max-w-5xl mx-auto">
337
+ <!-- Feature 1: Auth -->
338
+ <div class="group p-8 border border-slate-200 dark:border-white/5 rounded-3xl hover:bg-slate-50 dark:hover:bg-white/5 transition-all duration-300">
339
+ <div class="h-12 w-12 bg-slate-900 dark:bg-white text-white dark:text-black rounded-full flex items-center justify-center mb-6">
340
+ <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
341
+ <path d="M16 7C16 9.20914 14.2091 11 12 11C9.79086 11 8 9.20914 8 7C8 4.79086 9.79086 3 12 3C14.2091 3 16 4.79086 16 7Z" stroke-linecap="round" stroke-linejoin="round"/>
342
+ <path d="M12 14C8.13401 14 5 17.134 5 21H19C19 17.134 15.866 14 12 14Z" stroke-linecap="round" stroke-linejoin="round"/>
343
+ </svg>
344
+ </div>
345
+ <h4 class="text-2xl font-bold mb-3">Authentication</h4>
346
+ <p class="text-base text-slate-500 dark:text-slate-400 leading-relaxed">
347
+ Session-based auth tailored for Inertia. No JWT headaches. Secure, HTTP-only cookies out of the box.
348
+ </p>
349
+ </div>
350
+
351
+ <!-- Feature 2: Real-time -->
352
+ <div class="group p-8 border border-slate-200 dark:border-white/5 rounded-3xl hover:bg-slate-50 dark:hover:bg-white/5 transition-all duration-300">
353
+ <div class="h-12 w-12 bg-slate-900 dark:bg-white text-white dark:text-black rounded-full flex items-center justify-center mb-6">
354
+ <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
355
+ <path d="M13 2L3 14H12L11 22L21 10H12L13 2Z" stroke-linecap="round" stroke-linejoin="round"/>
356
+ </svg>
357
+ </div>
358
+ <h4 class="text-2xl font-bold mb-3">Real-time</h4>
359
+ <p class="text-base text-slate-500 dark:text-slate-400 leading-relaxed">
360
+ Built on uWebSockets.js. Broadcast events to thousands of clients with microsecond latency.
361
+ </p>
362
+ </div>
363
+
364
+ <!-- Feature 3: Security -->
365
+ <div class="group p-8 border border-slate-200 dark:border-white/5 rounded-3xl hover:bg-slate-50 dark:hover:bg-white/5 transition-all duration-300">
366
+ <div class="h-12 w-12 bg-slate-900 dark:bg-white text-white dark:text-black rounded-full flex items-center justify-center mb-6">
367
+ <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
368
+ <path d="M12 22C12 22 20 18 20 12V5L12 2L4 5V12C4 18 12 22 12 22Z" stroke-linecap="round" stroke-linejoin="round"/>
369
+ </svg>
370
+ </div>
371
+ <h4 class="text-2xl font-bold mb-3">Ironclad Security</h4>
372
+ <p class="text-base text-slate-500 dark:text-slate-400 leading-relaxed">
373
+ CSRF protection, rate limiting, and parameter pollution sanitization enabled by default.
374
+ </p>
375
+ </div>
376
+
377
+ <!-- Feature 4: Queues -->
378
+ <div class="group p-8 border border-slate-200 dark:border-white/5 rounded-3xl hover:bg-slate-50 dark:hover:bg-white/5 transition-all duration-300">
379
+ <div class="h-12 w-12 bg-slate-900 dark:bg-white text-white dark:text-black rounded-full flex items-center justify-center mb-6">
380
+ <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
381
+ <path d="M19 11H5M19 11C20.1046 11 21 11.8954 21 13V19C21 20.1046 20.1046 21 19 21H5C3.89543 21 3 20.1046 3 19V13C3 11.8954 3.89543 11 5 11M19 11V9C19 7.89543 18.1046 7 17 7M5 11V9C5 7.89543 5.89543 7 7 7M7 7V5C7 3.89543 7.89543 3 9 3H15C16.1046 3 17 3.89543 17 5V7M7 7H17" stroke-linecap="round" stroke-linejoin="round"/>
382
+ </svg>
383
+ </div>
384
+ <h4 class="text-2xl font-bold mb-3">Job Queues</h4>
385
+ <p class="text-base text-slate-500 dark:text-slate-400 leading-relaxed">
386
+ Asynchronous job processing backed by Redis or simple in-memory drivers.
387
+ </p>
388
+ </div>
389
+ </div>
390
+ </section>
391
+
392
+ <!-- Giant Kinetic CTA & Footer -->
393
+ <section class="relative bg-white dark:bg-black text-slate-900 dark:text-white overflow-hidden flex flex-col transition-colors duration-500">
394
+ <!-- Background Effects -->
395
+ <div class="absolute inset-0 bg-[radial-gradient(circle_at_50%_50%,_rgba(var(--color-primary-rgb,16,185,129),0.15),_transparent_70%)]"></div>
396
+
397
+ <!-- Light Mode Grid -->
398
+ <div class="absolute inset-0 opacity-20 dark:opacity-0 bg-[linear-gradient(rgba(0,0,0,0.05)_1px,transparent_1px),linear-gradient(90deg,rgba(0,0,0,0.05)_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_60%_60%_at_50%_50%,#000_70%,transparent_100%)]"></div>
399
+
400
+ <!-- Dark Mode Grid -->
401
+ <div class="absolute inset-0 opacity-0 dark:opacity-20 bg-[linear-gradient(rgba(255,255,255,0.05)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,0.05)_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_60%_60%_at_50%_50%,#000_70%,transparent_100%)]"></div>
402
+
403
+ <!-- CTA Content -->
404
+ <div class="relative z-10 pt-32 pb-20 px-6 sm:px-12 lg:px-24 flex flex-col items-center text-center">
405
+ <h2 class="text-[12vw] sm:text-[14vw] leading-[0.8] font-bold tracking-tighter select-none animate-pulse text-slate-900 dark:text-white">
406
+ UNLEASH
407
+ </h2>
408
+
409
+ <div class="mt-16 flex flex-col items-center gap-10">
410
+ <p class="text-xl sm:text-2xl font-serif italic text-slate-500 dark:text-slate-400 max-w-lg">
411
+ The metal is cold. The code is hot. <br/>
412
+ Your turn to strike.
413
+ </p>
414
+
415
+ <div class="flex flex-col sm:flex-row items-center gap-6">
416
+ <a href="/docs" class="group relative px-10 py-5 bg-slate-900 dark:bg-white text-white dark:text-black font-bold text-lg tracking-tight overflow-hidden rounded-full hover:scale-105 transition-transform duration-300">
417
+ <span class="relative z-10 group-hover:text-white transition-colors duration-300">START BUILDING</span>
418
+ <div class="absolute inset-0 bg-primary-600 transform scale-y-0 group-hover:scale-y-100 transition-transform duration-300 origin-bottom"></div>
419
+ </a>
420
+
421
+ <button type="button" class="flex items-center gap-3 px-6 py-4 rounded-full border border-slate-200 dark:border-white/10 bg-slate-100 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-200 dark:hover:bg-white/10 transition-colors cursor-copy group/cmd" on:click={() => navigator.clipboard.writeText('npm create nara-app@latest')}>
422
+ <span class="font-mono text-sm text-primary-600 dark:text-primary-400">$ npm create nara-app@latest</span>
423
+ <svg class="w-4 h-4 text-slate-400 dark:text-white/50 group-hover/cmd:text-slate-600 dark:group-hover/cmd:text-white transition-colors" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M8 17.9291C8 17.9291 9.77123 18.061 11.0264 16.5985C12.2815 15.1361 11.2314 13.9142 11.2314 13.9142C11.2314 13.9142 10.1558 13.4544 11.2314 11.7275C12.3071 10.0007 14.1534 10.0007 14.1534 10.0007M8 17.9291C8 17.9291 6.57703 16.9234 6.57703 14.9234C6.57703 13.3308 7.37873 12.3925 8 11.9649M8 17.9291C8 18.8465 7.15197 19.3465 6.57703 19.3465C5.71453 19.3465 5 18.632 5 17.7695V6.23047C5 5.36797 5.71453 4.65345 6.57703 4.65345C7.15197 4.65345 8 5.15345 8 6.07085M8 6.07085V11.9649M8 6.07085C8 6.07085 9.77123 5.93895 11.0264 7.4014C12.2815 8.86386 11.2314 10.0858 11.2314 10.0858M14.1534 10.0007L16.2305 13.9142M14.1534 10.0007H19V6.23047C19 5.36797 18.2855 4.65345 17.423 4.65345H14.1534" stroke-linecap="round" stroke-linejoin="round"/></svg>
424
+ </button>
425
+ </div>
426
+ </div>
427
+ </div>
428
+
429
+ <!-- Footer Navigation -->
430
+ <div class="relative z-10 border-t border-slate-200 dark:border-white/10 bg-white/50 dark:bg-black/50 backdrop-blur-md">
431
+
432
+
433
+ <div class="px-6 sm:px-12 lg:px-24 py-6 border-t border-slate-100 dark:border-white/5 flex justify-between items-center text-[10px] uppercase tracking-widest text-slate-500 dark:text-slate-400">
434
+ <span>&copy; 2025 MasRama</span>
435
+ <span>v1.0.0</span>
436
+ </div>
437
+ </div>
438
+ </section>
439
+ </div>
440
+
441
+ <style>
442
+ /* Custom scrollbar hiding for cleaner look if needed, though mostly standard tailwind used */
443
+ :global(html) {
444
+ scroll-behavior: smooth;
445
+ }
446
+ </style>