create-lacspace-app 1.17.1 → 2.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.
package/dist/index.js CHANGED
@@ -17,15 +17,15 @@ var C = {
17
17
  };
18
18
  var c = (k, s) => `${C[k]}${s}${C.reset}`;
19
19
  var TEMPLATES = [
20
- { key: "personal", label: "Personal portfolio", description: "A sleek personal / developer portfolio with projects and contact.", accent: ["#6366f1", "#a855f7"], siteName: "Your Name", siteDescription: "Developer, designer & maker. Selected work and writing." },
21
- { key: "business", label: "Business site", description: "A professional company / agency site with services and a CTA.", accent: ["#2563eb", "#06b6d4"], siteName: "Acme Studio", siteDescription: "We design and build digital products that grow businesses." },
22
- { key: "ecommerce", label: "E-commerce storefront", description: "A modern product storefront home with a featured grid.", accent: ["#0d9488", "#84cc16"], siteName: "Acme Store", siteDescription: "Beautiful things, thoughtfully made. Free shipping worldwide." },
23
- { key: "saas", label: "SaaS landing", description: "A high-converting SaaS landing page with features and pricing.", accent: ["#7c3aed", "#ec4899"], siteName: "Acme Cloud", siteDescription: "The all-in-one platform your team will love. Ship faster." },
24
- { key: "blog", label: "Blog / magazine", description: "A clean editorial blog home with a featured post and a grid.", accent: ["#f97316", "#ef4444"], siteName: "The Journal", siteDescription: "Essays, notes and stories on building things that matter." },
25
- { key: "docs", label: "Documentation", description: "A docs landing with quick-start and feature cards.", accent: ["#0ea5e9", "#6366f1"], siteName: "Acme Docs", siteDescription: "Everything you need to build with Acme \u2014 guides, API and examples." },
26
- { key: "dashboard", label: "Admin dashboard", description: "An app dashboard shell with stat cards and a table.", accent: ["#10b981", "#14b8a6"], siteName: "Acme Admin", siteDescription: "Your control center \u2014 metrics, activity and management in one place." },
27
- { key: "restaurant", label: "Restaurant / cafe", description: "A warm restaurant home with menu highlights and reservations.", accent: ["#e11d48", "#f59e0b"], siteName: "Olive & Ember", siteDescription: "Seasonal plates, natural wine and a warm room. Book a table." },
28
- { key: "marketplace", label: "Marketplace / commerce", description: "A real storefront wired to the Lacspace commerce packages \u2014 cart, checkout, tax, shipping, orders, invoices and Nepal payments.", accent: ["#0d9488", "#6366f1"], siteName: "Bazaar", siteDescription: "A modern storefront \u2014 cart to checkout, wired end to end." }
20
+ { key: "personal", label: "Personal portfolio", description: "A sleek personal / developer portfolio with projects and contact.", accent: ["#6366f1", "#a855f7"], siteName: "LSFolio", siteDescription: "Developer, designer & maker. Selected work and writing." },
21
+ { key: "business", label: "Business site", description: "A professional company / agency site with services and a CTA.", accent: ["#2563eb", "#06b6d4"], siteName: "LSStudio", siteDescription: "We design and build digital products that grow businesses." },
22
+ { key: "ecommerce", label: "E-commerce storefront", description: "A modern product storefront home with a featured grid.", accent: ["#0d9488", "#84cc16"], siteName: "LSStore", siteDescription: "Beautiful things, thoughtfully made. Free shipping worldwide." },
23
+ { key: "saas", label: "SaaS landing", description: "A high-converting SaaS landing page with features and pricing.", accent: ["#7c3aed", "#ec4899"], siteName: "LSCloud", siteDescription: "The all-in-one platform your team will love. Ship faster." },
24
+ { key: "blog", label: "Blog / magazine", description: "A clean editorial blog home with a featured post and a grid.", accent: ["#f97316", "#ef4444"], siteName: "LSBlogs", siteDescription: "Essays, notes and stories on building things that matter." },
25
+ { key: "docs", label: "Documentation", description: "A docs landing with quick-start and feature cards.", accent: ["#0ea5e9", "#6366f1"], siteName: "LSDocs", siteDescription: "Everything you need to build with LSDocs \u2014 guides, API and examples." },
26
+ { key: "dashboard", label: "Admin dashboard", description: "An app dashboard shell with stat cards and a table.", accent: ["#10b981", "#14b8a6"], siteName: "LSAdmin", siteDescription: "Your control center \u2014 metrics, activity and management in one place." },
27
+ { key: "restaurant", label: "Restaurant / cafe", description: "A warm restaurant home with menu highlights and reservations.", accent: ["#e11d48", "#f59e0b"], siteName: "LSResto", siteDescription: "Seasonal plates, natural wine and a warm room. Book a table." },
28
+ { key: "marketplace", label: "Marketplace / commerce", description: "A real storefront wired to the Lacspace commerce packages \u2014 cart, checkout, tax, shipping, orders, invoices and Nepal payments.", accent: ["#0d9488", "#6366f1"], siteName: "LSBazaar", siteDescription: "A modern storefront \u2014 cart to checkout, wired end to end." }
29
29
  ];
30
30
  var pkgJson = (ctx) => JSON.stringify({
31
31
  name: ctx.name,
@@ -142,30 +142,47 @@ var globalsCss = (ctx) => `@import "tailwindcss";
142
142
  --color-surface: var(--surface);
143
143
  --color-panel: var(--panel);
144
144
  --color-hairline: var(--hairline);
145
+ --color-accent: var(--accent-to);
146
+ --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif;
147
+ --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
145
148
  }
146
149
 
147
150
  :root {
148
151
  --accent-from: ${ctx.template.accent[0]};
149
152
  --accent-to: ${ctx.template.accent[1]};
150
- /* Light theme */
151
- --bg: #ffffff;
153
+ /* on-accent text \u2014 accent gradients are saturated, so black reads cleanest */
154
+ --on-accent: #0a0a0f;
155
+ /* Light theme \u2014 warm off-white ground, near-black ink */
156
+ --bg: #fbfbfd;
152
157
  --fg: #0a0a0f;
153
- --muted: #3f3f46;
154
- --faint: #71717a;
155
- --surface: rgb(0 0 0 / 0.03);
156
- --panel: rgb(0 0 0 / 0.06);
157
- --hairline: rgb(0 0 0 / 0.10);
158
+ --muted: #52525b;
159
+ --faint: #8a8a94;
160
+ --surface: rgb(0 0 0 / 0.025);
161
+ --panel: rgb(0 0 0 / 0.05);
162
+ --hairline: rgb(0 0 0 / 0.08);
163
+ /* soft, layered shadows (never harsh) */
164
+ --shadow-sm: 0 1px 2px rgb(15 15 25 / 0.05), 0 1px 1px rgb(15 15 25 / 0.03);
165
+ --shadow: 0 4px 12px -2px rgb(15 15 25 / 0.08), 0 2px 6px -2px rgb(15 15 25 / 0.05);
166
+ --shadow-lg: 0 24px 48px -12px rgb(15 15 25 / 0.14), 0 8px 20px -8px rgb(15 15 25 / 0.08);
167
+ --glow: 0 0 0 1px rgb(0 0 0 / 0.04);
168
+ --radius: 1rem;
169
+ --radius-lg: 1.5rem;
158
170
  }
159
171
 
160
172
  .dark {
161
- /* Dark theme (default) */
162
- --bg: #0a0a0f;
173
+ /* Dark theme (default) \u2014 deep near-black with a hint of indigo */
174
+ --on-accent: #0a0a0f;
175
+ --bg: #08080c;
163
176
  --fg: #f5f5f7;
164
- --muted: rgb(255 255 255 / 0.62);
165
- --faint: rgb(255 255 255 / 0.42);
166
- --surface: rgb(255 255 255 / 0.04);
167
- --panel: rgb(255 255 255 / 0.08);
168
- --hairline: rgb(255 255 255 / 0.10);
177
+ --muted: rgb(235 235 245 / 0.66);
178
+ --faint: rgb(235 235 245 / 0.42);
179
+ --surface: rgb(255 255 255 / 0.035);
180
+ --panel: rgb(255 255 255 / 0.07);
181
+ --hairline: rgb(255 255 255 / 0.09);
182
+ --shadow-sm: 0 1px 2px rgb(0 0 0 / 0.4);
183
+ --shadow: 0 8px 24px -6px rgb(0 0 0 / 0.5);
184
+ --shadow-lg: 0 32px 64px -16px rgb(0 0 0 / 0.65), 0 12px 28px -12px rgb(0 0 0 / 0.5);
185
+ --glow: 0 0 0 1px rgb(255 255 255 / 0.06);
169
186
  }
170
187
 
171
188
  * { border-color: var(--hairline); }
@@ -175,49 +192,129 @@ body {
175
192
  color: var(--fg);
176
193
  -webkit-font-smoothing: antialiased;
177
194
  text-rendering: optimizeLegibility;
195
+ font-feature-settings: "cv02", "cv03", "cv04", "cv11";
178
196
  transition: background-color 0.3s ease, color 0.3s ease;
179
197
  }
180
198
 
199
+ /* Confident, tight display type \u2014 a fluid clamp() scale + negative tracking. */
200
+ h1, h2, h3, .display { letter-spacing: -0.02em; text-wrap: balance; }
201
+ h1, .display { letter-spacing: -0.035em; line-height: 1.02; }
202
+ .text-display { font-size: clamp(2.6rem, 6.5vw, 4.75rem); line-height: 1; letter-spacing: -0.04em; font-weight: 800; text-wrap: balance; }
203
+ .text-hero { font-size: clamp(2.2rem, 5.5vw, 3.75rem); line-height: 1.03; letter-spacing: -0.035em; font-weight: 800; text-wrap: balance; }
204
+ .lead { font-size: clamp(1.05rem, 1.6vw, 1.25rem); line-height: 1.6; color: var(--muted); text-wrap: pretty; }
205
+
181
206
  ::selection { background: var(--accent-to); color: #fff; }
182
207
  ::-webkit-scrollbar { width: 10px; height: 10px; }
183
- ::-webkit-scrollbar-thumb { background: var(--panel); border-radius: 8px; }
184
- :focus-visible { outline: 2px solid var(--accent-to); outline-offset: 2px; border-radius: 4px; }
208
+ ::-webkit-scrollbar-thumb { background: var(--panel); border-radius: 8px; border: 2px solid transparent; background-clip: padding-box; }
209
+ ::-webkit-scrollbar-thumb:hover { background: var(--hairline); }
210
+ :focus-visible { outline: 2px solid var(--accent-to); outline-offset: 2px; border-radius: 6px; }
185
211
 
186
212
  .gradient-text {
187
- background: linear-gradient(120deg, var(--accent-from), var(--accent-to));
213
+ background: linear-gradient(115deg, var(--accent-from), var(--accent-to));
188
214
  -webkit-background-clip: text; background-clip: text; color: transparent;
189
215
  }
190
- .gradient-bg { background: linear-gradient(120deg, var(--accent-from), var(--accent-to)); }
216
+ .gradient-bg { background: linear-gradient(115deg, var(--accent-from), var(--accent-to)); }
217
+ .on-accent { color: var(--on-accent); }
218
+
219
+ /* soft accent halo used behind hero type & badges */
220
+ .accent-glow { box-shadow: 0 8px 32px -8px color-mix(in oklab, var(--accent-to) 55%, transparent); }
191
221
 
192
222
  /* opaque theme background (for sticky chrome & chips) */
193
223
  .bg-app { background: var(--bg); }
194
224
 
225
+ /* frosted glass \u2014 translucent surface + blur + hairline */
226
+ .glass {
227
+ background: color-mix(in oklab, var(--bg) 72%, transparent);
228
+ backdrop-filter: blur(14px) saturate(1.4);
229
+ -webkit-backdrop-filter: blur(14px) saturate(1.4);
230
+ border: 1px solid var(--hairline);
231
+ }
232
+
233
+ /* the workhorse surface card \u2014 rounded, hairline, soft shadow, hover lift + glow */
234
+ .card {
235
+ border-radius: var(--radius-lg);
236
+ border: 1px solid var(--hairline);
237
+ background: var(--surface);
238
+ box-shadow: var(--shadow-sm);
239
+ transition: transform 0.4s var(--ease-out-expo), box-shadow 0.4s var(--ease-out-expo), border-color 0.4s var(--ease-out-expo);
240
+ }
241
+ .card:hover {
242
+ transform: translateY(-4px);
243
+ box-shadow: var(--shadow-lg);
244
+ border-color: color-mix(in oklab, var(--accent-to) 40%, var(--hairline));
245
+ }
246
+
247
+ /* subtle gradient hairline border (draws focus without shouting) */
248
+ .gradient-border { position: relative; }
249
+ .gradient-border::after {
250
+ content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 1px;
251
+ background: linear-gradient(140deg, color-mix(in oklab, var(--accent-from) 60%, transparent), transparent 45%);
252
+ -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
253
+ mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
254
+ -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none;
255
+ }
256
+
257
+ /* subtle background patterns for section grounds */
258
+ .grid-bg {
259
+ background-image: linear-gradient(var(--hairline) 1px, transparent 1px), linear-gradient(90deg, var(--hairline) 1px, transparent 1px);
260
+ background-size: 56px 56px;
261
+ -webkit-mask-image: radial-gradient(ellipse 70% 60% at 50% 0%, #000 30%, transparent 75%);
262
+ mask-image: radial-gradient(ellipse 70% 60% at 50% 0%, #000 30%, transparent 75%);
263
+ }
264
+ .dot-bg {
265
+ background-image: radial-gradient(var(--hairline) 1px, transparent 1px);
266
+ background-size: 22px 22px;
267
+ -webkit-mask-image: radial-gradient(ellipse 60% 50% at 50% 40%, #000 20%, transparent 70%);
268
+ mask-image: radial-gradient(ellipse 60% 50% at 50% 40%, #000 20%, transparent 70%);
269
+ }
270
+
195
271
  /* indeterminate progress bar (used by the "under development" pages) */
196
272
  @keyframes loadbar { 0% { transform: translateX(-120%); } 100% { transform: translateX(340%); } }
197
273
 
198
274
  /* ambient motion for illustrations & the aurora background */
199
- @keyframes floaty { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-16px); } }
275
+ @keyframes floaty { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-18px); } }
276
+ @keyframes drift { 0%, 100% { transform: translate3d(0, 0, 0) scale(1); } 33% { transform: translate3d(4%, -3%, 0) scale(1.06); } 66% { transform: translate3d(-3%, 3%, 0) scale(0.96); } }
200
277
  @keyframes spin-slow { to { transform: rotate(360deg); } }
201
278
  @keyframes gradient-pan { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }
202
279
  @keyframes marquee-x { from { transform: translateX(0); } to { transform: translateX(-50%); } }
280
+ @keyframes shimmer-sweep { 0% { transform: translateX(-120%) skewX(-16deg); } 60%, 100% { transform: translateX(320%) skewX(-16deg); } }
203
281
  .animate-floaty { animation: floaty 6s ease-in-out infinite; }
204
282
  .animate-floaty-slow { animation: floaty 9s ease-in-out infinite; }
205
- .animate-spin-slow { animation: spin-slow 26s linear infinite; }
283
+ .animate-drift { animation: drift 22s ease-in-out infinite; }
284
+ .animate-drift-slow { animation: drift 30s ease-in-out infinite; }
285
+ .animate-spin-slow { animation: spin-slow 30s linear infinite; }
206
286
  .gradient-text-animated {
207
- background: linear-gradient(120deg, var(--accent-from), var(--accent-to), var(--accent-from));
287
+ background: linear-gradient(115deg, var(--accent-from), var(--accent-to), var(--accent-from));
208
288
  background-size: 200% 200%;
209
289
  -webkit-background-clip: text; background-clip: text; color: transparent;
210
290
  animation: gradient-pan 6s ease infinite;
211
291
  }
212
- .marquee-track { display: flex; width: max-content; animation: marquee-x 32s linear infinite; }
292
+ .marquee-track { display: flex; width: max-content; animation: marquee-x 40s linear infinite; }
293
+ .marquee-track:hover { animation-play-state: paused; }
213
294
  @keyframes draw { to { stroke-dashoffset: 0; } }
214
- .animate-draw { stroke-dasharray: 2000; stroke-dashoffset: 2000; animation: draw 1.8s ease forwards; }
295
+ .animate-draw { stroke-dasharray: 2000; stroke-dashoffset: 2000; animation: draw 1.8s var(--ease-out-expo) forwards; }
215
296
  .marquee-mask { -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); }
216
297
 
217
- /* soft entrance for content */
218
- @keyframes rise { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
219
- main > section, main > * { animation: rise 0.6s cubic-bezier(0.22, 1, 0.36, 1) both; }
220
- @media (prefers-reduced-motion: reduce) { *, ::before, ::after { animation: none !important; scroll-behavior: auto; } }
298
+ /* a slow gradient light-sweep for primary CTAs */
299
+ .shimmer { position: relative; overflow: hidden; }
300
+ .shimmer::after {
301
+ content: ""; position: absolute; top: 0; bottom: 0; left: 0; width: 40%;
302
+ background: linear-gradient(90deg, transparent, rgb(255 255 255 / 0.45), transparent);
303
+ animation: shimmer-sweep 4.5s var(--ease-out-expo) infinite; pointer-events: none;
304
+ }
305
+
306
+ /* soft, staggered entrance for content \u2014 nicer easing */
307
+ @keyframes rise { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: none; } }
308
+ main > section { animation: rise 0.7s var(--ease-out-expo) both; }
309
+ main > section:nth-of-type(2) { animation-delay: 0.06s; }
310
+ main > section:nth-of-type(3) { animation-delay: 0.12s; }
311
+ main > section:nth-of-type(4) { animation-delay: 0.16s; }
312
+
313
+ /* respect reduced motion \u2014 kill animation AND transition-driven transforms */
314
+ @media (prefers-reduced-motion: reduce) {
315
+ *, ::before, ::after { animation: none !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; }
316
+ .shimmer::after { display: none; }
317
+ }
221
318
  ${ctx.template.key === "blog" || ctx.template.key === "docs" ? BLOG_PROSE_CSS : ""}`;
222
319
  var BLOG_PROSE_CSS = `
223
320
  /* article typography for Markdown posts */
@@ -268,13 +365,13 @@ import { site } from "@/lib/site";
268
365
  import { CommandMenu } from "@/components/command-menu";
269
366
  ${imports}import "./globals.css";
270
367
 
271
- const inter = Inter({ subsets: ["latin"], display: "swap" });
368
+ const inter = Inter({ subsets: ["latin"], display: "swap", variable: "--font-inter" });
272
369
 
273
370
  export const metadata: Metadata = site.meta({ title: ${JSON.stringify(ctx.template.siteName)} });
274
371
 
275
372
  export default function RootLayout({ children }: { children: React.ReactNode }) {
276
373
  return (
277
- <html lang="en" className={inter.className} suppressHydrationWarning>
374
+ <html lang="en" className={\`\${inter.variable} \${inter.className}\`} suppressHydrationWarning>
278
375
  <body className="antialiased">
279
376
  {/* \u2728 Dark / light / system theming with a built-in no-flash script \u2014 @lacspace/theme */}
280
377
  <ThemeProvider defaultTheme="dark">
@@ -324,10 +421,11 @@ var notFound = () => `import Link from "next/link";
324
421
 
325
422
  export default function NotFound() {
326
423
  return (
327
- <main className="flex min-h-screen flex-col items-center justify-center gap-6 px-6 text-center">
328
- <div className="text-8xl font-black gradient-text">404</div>
329
- <p className="text-lg text-muted">This page wandered off.</p>
330
- <Link href="/" className="gradient-bg rounded-full px-6 py-3 font-semibold text-black">Back home</Link>
424
+ <main className="relative flex min-h-screen flex-col items-center justify-center gap-6 overflow-hidden px-6 text-center">
425
+ <div aria-hidden className="pointer-events-none absolute h-96 w-96 rounded-full gradient-bg opacity-20 blur-3xl animate-drift-slow" />
426
+ <div className="relative text-[9rem] font-black leading-none gradient-text-animated">404</div>
427
+ <p className="relative text-lg text-muted">This page wandered off. Let's get you home.</p>
428
+ <Link href="/" className="shimmer relative rounded-full gradient-bg px-7 py-3.5 font-semibold on-accent transition hover:-translate-y-0.5">Back home</Link>
331
429
  </main>
332
430
  );
333
431
  }
@@ -446,11 +544,22 @@ function homePage(ctx) {
446
544
  const n = ctx.template.siteName;
447
545
  if (ctx.template.key === "dashboard") return dashboardHome(ctx);
448
546
  if (ctx.template.key === "marketplace") return marketplaceHome(ctx);
449
- const shell = (inner) => `import { site } from "@/lib/site";
547
+ const shell = (inner) => {
548
+ const ctaCopy = {
549
+ personal: { t: "Have something in mind?", s: "I'm taking on a couple of projects this quarter \u2014 let's talk.", l: "Start a conversation", h: "/contact" },
550
+ business: { t: "Let's build something that ships", s: "Tell us the outcome you're after and we'll map the path.", l: "Start a project", h: "/contact" },
551
+ ecommerce: { t: "Find your next favourite thing", s: "Free shipping over $50 and 30-day easy returns, always.", l: "Shop the collection", h: "/shop" },
552
+ saas: { t: "Ready to ship faster?", s: "Start free in minutes \u2014 no credit card, no lock-in.", l: "Get started free", h: "/pricing" },
553
+ blog: { t: "Never miss a piece", s: "Get new essays in your inbox \u2014 no spam, unsubscribe anytime.", l: "Join the newsletter", h: "/newsletter" },
554
+ docs: { t: "Start building today", s: "Go from install to your first request in five minutes.", l: "Read the quickstart", h: "/docs" },
555
+ restaurant: { t: "Join us for dinner", s: "We fill up fast on weekends \u2014 book your table ahead.", l: "Reserve a table", h: "/reservations" }
556
+ };
557
+ const cc = ctaCopy[ctx.template.key] ?? ctaCopy.business;
558
+ return `import { site } from "@/lib/site";
450
559
  import { LiveStats } from "@/components/live-stats";
451
560
  import { Aurora } from "@/components/aurora";
452
561
  import { HeroArt } from "@/components/hero-art";
453
- import { StatBand, Steps, Testimonial } from "@/components/ui";
562
+ import { StatBand, Steps, Testimonial, CTABand } from "@/components/ui";
454
563
 
455
564
  // \u2728 Self-canonical home page \u2014 one line, full SEO (title, canonical, OG, Twitter).
456
565
  export const metadata = site.meta({ title: ${JSON.stringify(n)}, path: "/" });
@@ -458,202 +567,229 @@ export const metadata = site.meta({ title: ${JSON.stringify(n)}, path: "/" });
458
567
  export default function Home() {
459
568
  return (
460
569
  <main className="relative min-h-screen overflow-hidden">
461
- {/* \u2728 Animated, theme-aware gradient backdrop */}
570
+ {/* \u2728 Soft, theme-aware gradient-mesh backdrop */}
462
571
  <Aurora />
463
572
  ${inner}
464
- ${showcaseSection(ctx)}
465
573
  ${marqueeSection(ctx)}
574
+ ${showcaseSection(ctx)}
466
575
  ${extraHomeSections(ctx)}
576
+ <CTABand title=${JSON.stringify(cc.t)} subtitle=${JSON.stringify(cc.s)} ctaLabel=${JSON.stringify(cc.l)} ctaHref=${JSON.stringify(cc.h)} />
467
577
  ${faqSection(ctx)}
468
578
  ${builtWithSection(ctx)}
469
579
  </main>
470
580
  );
471
581
  }
472
582
  `;
583
+ };
473
584
  if (ctx.template.key === "personal") {
474
- return shell(`<section className="mx-auto max-w-3xl px-6 py-28 text-center">
475
- <p className="mb-4 text-sm font-semibold uppercase tracking-widest text-faint">Portfolio</p>
476
- <h1 className="text-5xl font-black leading-tight sm:text-7xl">Hi, I'm <span className="gradient-text">${n}</span>.</h1>
477
- <p className="mx-auto mt-6 max-w-xl text-lg text-muted">${ctx.template.siteDescription}</p>
478
- <div className="mt-10 flex justify-center gap-4">
479
- <a href="#work" className="gradient-bg rounded-full px-6 py-3 font-semibold text-black">View my work</a>
480
- <a href="#contact" className="rounded-full border border-hairline px-6 py-3 font-semibold hover:bg-surface">Get in touch</a>
585
+ return shell(`<section className="relative mx-auto max-w-3xl px-6 py-32 text-center sm:py-40">
586
+ <span className="glass inline-flex items-center gap-2 rounded-full px-4 py-1.5 text-xs font-semibold text-muted"><span className="relative flex h-2 w-2"><span className="absolute inline-flex h-full w-full animate-ping rounded-full bg-emerald-400 opacity-75" /><span className="relative inline-flex h-2 w-2 rounded-full bg-emerald-400" /></span> Available for select projects</span>
587
+ <h1 className="text-display mt-7">Hi, I'm <span className="gradient-text">${n}</span></h1>
588
+ <p className="lead mx-auto mt-6 max-w-xl">${ctx.template.siteDescription}</p>
589
+ <div className="mt-10 flex flex-wrap justify-center gap-3">
590
+ <a href="#work" className="shimmer rounded-full gradient-bg px-7 py-3.5 font-semibold on-accent transition hover:-translate-y-0.5">View my work</a>
591
+ <a href="/contact" className="rounded-full border border-hairline px-7 py-3.5 font-semibold transition hover:bg-surface">Get in touch</a>
481
592
  </div>
482
593
  </section>
483
- <section id="work" className="mx-auto max-w-6xl px-6 py-16">
484
- <h2 className="mb-10 text-3xl font-bold">Selected work</h2>
594
+ <section id="work" className="mx-auto max-w-6xl px-6 py-20">
595
+ <div className="mb-12 flex items-end justify-between">
596
+ <div><p className="text-sm font-semibold uppercase tracking-widest gradient-text">Selected work</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">Things I've shipped</h2></div>
597
+ <a href="/work" className="hidden text-sm text-muted underline-offset-4 transition hover:text-fg hover:underline sm:block">All projects \u2192</a>
598
+ </div>
485
599
  <div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
486
- {[1, 2, 3, 4, 5, 6].map((i) => (
487
- <div key={i} className="group rounded-2xl border border-hairline bg-surface p-6 transition hover:-translate-y-1 hover:border-hairline">
488
- <div className="mb-4 h-32 rounded-xl gradient-bg opacity-80" />
489
- <h3 className="font-semibold">Project {i}</h3>
490
- <p className="mt-1 text-sm text-muted">A short description of what you built and the impact it had.</p>
491
- </div>
600
+ {[
601
+ { t: "Aurora Design System", d: "A themeable component library and tokens powering 40+ product screens.", tag: "Design + Code", e: "\u{1F3A8}" },
602
+ { t: "Northwind Analytics", d: "A real-time dashboard that cut reporting time from hours to seconds.", tag: "Product", e: "\u{1F4CA}" },
603
+ { t: "Lumen Mobile", d: "A 4.9\u2605 React Native app rebuilt from the ground up for speed.", tag: "Mobile", e: "\u{1F4F1}" },
604
+ { t: "Harbor Commerce", d: "A headless storefront with a checkout that converts 38% better.", tag: "E-commerce", e: "\u{1F6CD}\uFE0F" },
605
+ { t: "Cadence Marketing", d: "A brand and site refresh that doubled qualified inbound leads.", tag: "Brand", e: "\u2728" },
606
+ { t: "Meadow Docs", d: "A fast, searchable docs platform teams actually enjoy reading.", tag: "Web", e: "\u{1F4DA}" },
607
+ ].map((p) => (
608
+ <a key={p.t} href="/work" className="card group flex flex-col p-6">
609
+ <div className="mb-5 flex aspect-[16/10] items-center justify-center overflow-hidden rounded-xl gradient-bg text-5xl on-accent">{p.e}</div>
610
+ <span className="text-xs font-semibold uppercase tracking-widest gradient-text">{p.tag}</span>
611
+ <h3 className="mt-1.5 font-semibold tracking-tight">{p.t}</h3>
612
+ <p className="mt-1.5 text-sm leading-relaxed text-muted">{p.d}</p>
613
+ </a>
492
614
  ))}
493
615
  </div>
494
616
  </section>`);
495
617
  }
496
618
  if (ctx.template.key === "business") {
497
- return shell(`<section className="mx-auto max-w-4xl px-6 py-28 text-center">
498
- <h1 className="text-5xl font-black leading-tight sm:text-6xl">We build products <span className="gradient-text">that grow businesses</span>.</h1>
499
- <p className="mx-auto mt-6 max-w-2xl text-lg text-muted">${ctx.template.siteDescription}</p>
500
- <a href="#contact" className="mt-10 inline-block gradient-bg rounded-full px-8 py-3 font-semibold text-black">Start a project</a>
619
+ return shell(`<section className="relative mx-auto max-w-4xl px-6 py-32 text-center sm:py-40">
620
+ <span className="glass inline-flex items-center gap-2 rounded-full px-4 py-1.5 text-xs font-semibold text-muted"><span aria-hidden className="h-1.5 w-1.5 rounded-full gradient-bg" /> A senior product studio</span>
621
+ <h1 className="text-display mt-7">We build products <span className="gradient-text">that grow businesses</span></h1>
622
+ <p className="lead mx-auto mt-6 max-w-2xl">${ctx.template.siteDescription}</p>
623
+ <div className="mt-10 flex flex-wrap justify-center gap-3">
624
+ <a href="/contact" className="shimmer rounded-full gradient-bg px-7 py-3.5 font-semibold on-accent transition hover:-translate-y-0.5">Start a project</a>
625
+ <a href="/work" className="rounded-full border border-hairline px-7 py-3.5 font-semibold transition hover:bg-surface">See our work</a>
626
+ </div>
501
627
  </section>
502
- <section id="services" className="mx-auto max-w-6xl px-6 py-16">
503
- <h2 className="mb-10 text-center text-3xl font-bold">What we do</h2>
628
+ <section id="services" className="mx-auto max-w-6xl px-6 py-20">
629
+ <div className="mb-12 text-center"><p className="text-sm font-semibold uppercase tracking-widest gradient-text">What we do</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">One team, from strategy to launch</h2></div>
504
630
  <div className="grid gap-6 md:grid-cols-3">
505
631
  {[
506
- { t: "Strategy", d: "Positioning, research and a roadmap that ships." },
507
- { t: "Design", d: "Brand and product design that people remember." },
508
- { t: "Engineering", d: "Fast, reliable software built to last." },
632
+ { t: "Strategy", d: "Positioning, research and a roadmap that ships \u2014 grounded in evidence, not opinions.", e: "\u{1F9ED}" },
633
+ { t: "Design", d: "Brand and product design people remember, with a system that scales past launch day.", e: "\u{1F3A8}" },
634
+ { t: "Engineering", d: "Fast, reliable software built to last \u2014 typed, tested and observable from day one.", e: "\u2699\uFE0F" },
509
635
  ].map((s) => (
510
- <div key={s.t} className="rounded-2xl border border-hairline bg-surface p-8">
511
- <h3 className="text-xl font-bold gradient-text">{s.t}</h3>
512
- <p className="mt-2 text-muted">{s.d}</p>
636
+ <div key={s.t} className="card p-8">
637
+ <div className="mb-5 inline-flex h-12 w-12 items-center justify-center rounded-2xl gradient-bg text-2xl accent-glow">{s.e}</div>
638
+ <h3 className="text-xl font-bold tracking-tight">{s.t}</h3>
639
+ <p className="mt-2 leading-relaxed text-muted">{s.d}</p>
513
640
  </div>
514
641
  ))}
515
642
  </div>
516
- </section>
517
- <section id="contact" className="mx-auto max-w-3xl px-6 py-24 text-center">
518
- <h2 className="text-3xl font-bold">Let's work together</h2>
519
- <p className="mt-3 text-muted">Tell us about your project and we'll get back within a day.</p>
520
- <a href="mailto:hello@example.com" className="mt-8 inline-block rounded-full border border-hairline px-8 py-3 font-semibold hover:bg-surface">hello@example.com</a>
521
643
  </section>`);
522
644
  }
523
645
  if (ctx.template.key === "ecommerce") {
524
- return shell(`<section className="mx-auto max-w-5xl px-6 py-24 text-center">
525
- <h1 className="text-5xl font-black leading-tight sm:text-6xl"><span className="gradient-text">${n}</span></h1>
526
- <p className="mx-auto mt-6 max-w-xl text-lg text-muted">${ctx.template.siteDescription}</p>
527
- <a href="#shop" className="mt-10 inline-block gradient-bg rounded-full px-8 py-3 font-semibold text-black">Shop the collection</a>
646
+ return shell(`<section className="relative mx-auto max-w-5xl px-6 py-32 text-center sm:py-40">
647
+ <span className="glass inline-flex items-center gap-2 rounded-full px-4 py-1.5 text-xs font-semibold text-muted">\u{1F69A} Free worldwide shipping over $50</span>
648
+ <h1 className="text-display mt-7"><span className="gradient-text">${n}</span></h1>
649
+ <p className="lead mx-auto mt-6 max-w-xl">${ctx.template.siteDescription}</p>
650
+ <div className="mt-10 flex flex-wrap justify-center gap-3">
651
+ <a href="/shop" className="shimmer rounded-full gradient-bg px-8 py-3.5 font-semibold on-accent transition hover:-translate-y-0.5">Shop the collection</a>
652
+ <a href="/collections" className="rounded-full border border-hairline px-8 py-3.5 font-semibold transition hover:bg-surface">Browse collections</a>
653
+ </div>
528
654
  </section>
529
- <section id="shop" className="mx-auto max-w-6xl px-6 py-16">
530
- <h2 className="mb-10 text-3xl font-bold">Featured</h2>
655
+ <section id="shop" className="mx-auto max-w-6xl px-6 py-20">
656
+ <div className="mb-12 flex items-end justify-between">
657
+ <div><p className="text-sm font-semibold uppercase tracking-widest gradient-text">Featured</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">This week's edit</h2></div>
658
+ <a href="/shop" className="hidden text-sm text-muted underline-offset-4 transition hover:text-fg hover:underline sm:block">Shop all \u2192</a>
659
+ </div>
531
660
  <div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-4">
532
661
  {[
533
- { n: "Aurora Lamp", p: "$89" }, { n: "Terra Mug", p: "$24" },
534
- { n: "Linen Throw", p: "$65" }, { n: "Oak Stand", p: "$120" },
662
+ { n: "Aurora Table Lamp", p: "$89", e: "\u{1F4A1}" }, { n: "Terra Stoneware Mug", p: "$24", e: "\u2615" },
663
+ { n: "Linen Waffle Throw", p: "$65", e: "\u{1F9FA}" }, { n: "Oak Monitor Stand", p: "$120", e: "\u{1FAB5}" },
535
664
  ].map((prod) => (
536
- <div key={prod.n} className="group rounded-2xl border border-hairline bg-surface p-4 transition hover:-translate-y-1">
537
- <div className="mb-4 aspect-square rounded-xl gradient-bg opacity-80" />
538
- <div className="flex items-center justify-between">
539
- <h3 className="font-semibold">{prod.n}</h3>
540
- <span className="text-muted">{prod.p}</span>
665
+ <div key={prod.n} className="card group flex flex-col p-4">
666
+ <a href="/shop" className="mb-4 flex aspect-square items-center justify-center overflow-hidden rounded-xl gradient-bg text-6xl on-accent transition group-hover:scale-[1.03]">{prod.e}</a>
667
+ <div className="flex items-start justify-between gap-2">
668
+ <h3 className="font-semibold tracking-tight">{prod.n}</h3>
669
+ <span className="shrink-0 font-semibold text-muted">{prod.p}</span>
541
670
  </div>
542
- <a href="/shop" className="mt-3 block w-full rounded-lg border border-hairline py-2 text-center text-sm font-medium hover:bg-surface">Add to cart</a>
671
+ <a href="/shop" className="mt-4 block w-full rounded-full gradient-bg py-2.5 text-center text-sm font-semibold on-accent transition hover:-translate-y-0.5">Add to cart</a>
543
672
  </div>
544
673
  ))}
545
674
  </div>
546
675
  </section>`);
547
676
  }
548
677
  if (ctx.template.key === "blog") {
549
- return shell(`<section className="mx-auto max-w-3xl px-6 py-24">
550
- <p className="mb-3 text-sm font-semibold uppercase tracking-widest text-faint">The Journal</p>
551
- <h1 className="text-5xl font-black leading-tight sm:text-6xl gradient-text">${n}</h1>
552
- <p className="mt-6 text-lg text-muted">${ctx.template.siteDescription}</p>
678
+ return shell(`<section className="mx-auto max-w-3xl px-6 py-28 sm:py-32">
679
+ <p className="text-sm font-semibold uppercase tracking-widest gradient-text">The Journal</p>
680
+ <h1 className="text-display mt-4"><span className="gradient-text">${n}</span></h1>
681
+ <p className="lead mt-6 max-w-2xl">${ctx.template.siteDescription}</p>
682
+ <a href="/blog" className="mt-8 inline-flex items-center gap-2 text-sm font-semibold text-fg underline-offset-4 hover:underline">Read the archive \u2192</a>
553
683
  </section>
554
684
  <section id="latest" className="mx-auto max-w-5xl px-6 pb-8">
555
- <a href="#" className="group block rounded-3xl border border-hairline bg-surface p-8 transition hover:border-hairline">
556
- <div className="mb-6 h-56 rounded-2xl gradient-bg opacity-80" />
557
- <span className="text-xs font-semibold uppercase tracking-wider text-faint">Featured</span>
558
- <h2 className="mt-2 text-3xl font-bold group-hover:opacity-90">The one thing every product needs before launch</h2>
559
- <p className="mt-2 text-muted">A short, punchy dek that pulls the reader into the piece and makes them want more.</p>
685
+ <a href="/blog" className="card group grid gap-6 overflow-hidden p-6 sm:grid-cols-[1.2fr_1fr] sm:p-8">
686
+ <div className="flex aspect-[16/10] items-center justify-center overflow-hidden rounded-2xl gradient-bg text-6xl on-accent transition group-hover:scale-[1.02]">\u{1F4EE}</div>
687
+ <div className="flex flex-col justify-center">
688
+ <span className="text-xs font-semibold uppercase tracking-widest gradient-text">Featured</span>
689
+ <h2 className="mt-3 text-2xl font-bold tracking-tight sm:text-3xl">The one thing every product needs before launch</h2>
690
+ <p className="mt-3 leading-relaxed text-muted">Most teams polish the wrong things. Here's the single unglamorous check that separates a launch that lands from one that limps.</p>
691
+ <span className="mt-5 text-sm text-faint">8 min read \xB7 Product</span>
692
+ </div>
560
693
  </a>
561
694
  </section>
562
- <section className="mx-auto max-w-5xl px-6 py-12">
695
+ <section className="mx-auto max-w-5xl px-6 py-16">
563
696
  <div className="grid gap-8 sm:grid-cols-2">
564
- {[1, 2, 3, 4].map((i) => (
565
- <a key={i} href="#" className="group">
566
- <div className="mb-4 h-40 rounded-xl gradient-bg opacity-70" />
567
- <span className="text-xs uppercase tracking-wider text-faint">Essay</span>
568
- <h3 className="mt-1 text-xl font-semibold group-hover:opacity-90">A thoughtful headline for post {i}</h3>
569
- <p className="mt-1 text-sm text-muted">Two lines of supporting copy to set the scene for the reader.</p>
697
+ {[
698
+ { t: "Writing that survives the scroll", d: "Editing tricks that keep readers past the first paragraph.", tag: "Craft", e: "\u270D\uFE0F" },
699
+ { t: "The cost of a fast 'yes'", d: "Why the cheapest decisions are often the most expensive.", tag: "Product", e: "\u2696\uFE0F" },
700
+ { t: "Building in the open, one year in", d: "What we learned shipping every week where anyone could watch.", tag: "Culture", e: "\u{1F331}" },
701
+ { t: "Design systems for teams of one", d: "You don't need a committee to move fast and stay consistent.", tag: "Design", e: "\u{1F3A8}" },
702
+ ].map((p) => (
703
+ <a key={p.t} href="/blog" className="group">
704
+ <div className="mb-4 flex aspect-[16/9] items-center justify-center overflow-hidden rounded-2xl gradient-bg text-5xl on-accent transition group-hover:scale-[1.02]">{p.e}</div>
705
+ <span className="text-xs font-semibold uppercase tracking-widest gradient-text">{p.tag}</span>
706
+ <h3 className="mt-1.5 text-xl font-semibold tracking-tight transition group-hover:text-[color:var(--accent-to)]">{p.t}</h3>
707
+ <p className="mt-1.5 text-sm leading-relaxed text-muted">{p.d}</p>
570
708
  </a>
571
709
  ))}
572
710
  </div>
573
711
  </section>`);
574
712
  }
575
713
  if (ctx.template.key === "docs") {
576
- return shell(`<section className="mx-auto max-w-4xl px-6 py-28 text-center">
577
- <h1 className="text-5xl font-black leading-tight sm:text-6xl"><span className="gradient-text">${n}</span></h1>
578
- <p className="mx-auto mt-6 max-w-2xl text-lg text-muted">${ctx.template.siteDescription}</p>
579
- <div className="mt-8 inline-flex items-center gap-3 rounded-lg border border-hairline bg-panel px-4 py-3 font-mono text-sm text-muted">
580
- <span className="text-faint">$</span> npm install @acme/sdk
714
+ const pkg = "@" + n.toLowerCase() + "/sdk";
715
+ return shell(`<section className="relative mx-auto max-w-4xl px-6 py-32 text-center sm:py-40">
716
+ <span className="glass inline-flex items-center gap-2 rounded-full px-4 py-1.5 text-xs font-semibold text-muted">\u{1F4D8} Docs \xB7 v1.0</span>
717
+ <h1 className="text-display mt-7">Build with <span className="gradient-text">${n}</span></h1>
718
+ <p className="lead mx-auto mt-6 max-w-2xl">Guides, API references and copy-paste examples \u2014 everything you need, in one fast, searchable place.</p>
719
+ <div className="mt-9 flex flex-wrap items-center justify-center gap-3">
720
+ <a href="/docs" className="shimmer rounded-full gradient-bg px-7 py-3.5 font-semibold on-accent transition hover:-translate-y-0.5">Read the docs</a>
721
+ <div className="glass inline-flex items-center gap-3 rounded-full px-5 py-3 font-mono text-sm text-muted"><span className="gradient-text font-bold">$</span> npm i ${pkg}</div>
581
722
  </div>
582
723
  </section>
583
- <section id="guides" className="mx-auto max-w-6xl px-6 py-12">
724
+ <section id="guides" className="mx-auto max-w-6xl px-6 py-16">
584
725
  <div className="grid gap-6 md:grid-cols-3">
585
726
  {[
586
- { t: "Quick start", d: "Go from zero to your first request in five minutes." },
587
- { t: "Guides", d: "Task-focused walkthroughs for the common paths." },
588
- { t: "API reference", d: "Every endpoint, typed, with copy-paste examples." },
727
+ { t: "Quick start", d: "Go from zero to your first successful request in under five minutes.", e: "\u{1F680}", href: "/docs" },
728
+ { t: "Guides", d: "Task-focused walkthroughs for the paths you'll actually take.", e: "\u{1F9ED}", href: "/guides" },
729
+ { t: "API reference", d: "Every endpoint, fully typed, with copy-paste examples in each language.", e: "\u{1F50C}", href: "/api-reference" },
589
730
  ].map((c) => (
590
- <a key={c.t} href="#" className="rounded-2xl border border-hairline bg-surface p-8 transition hover:border-hairline">
591
- <h3 className="text-xl font-bold gradient-text">{c.t}</h3>
592
- <p className="mt-2 text-muted">{c.d}</p>
731
+ <a key={c.t} href={c.href} className="card group p-8">
732
+ <div className="mb-5 inline-flex h-12 w-12 items-center justify-center rounded-2xl gradient-bg text-2xl accent-glow">{c.e}</div>
733
+ <h3 className="text-xl font-bold tracking-tight">{c.t} <span className="inline-block transition group-hover:translate-x-1">\u2192</span></h3>
734
+ <p className="mt-2 leading-relaxed text-muted">{c.d}</p>
593
735
  </a>
594
736
  ))}
595
737
  </div>
596
738
  </section>`);
597
739
  }
598
740
  if (ctx.template.key === "restaurant") {
599
- return shell(`<section className="mx-auto max-w-4xl px-6 py-28 text-center">
600
- <p className="mb-4 text-sm font-semibold uppercase tracking-widest text-faint">Est. 2026</p>
601
- <h1 className="text-5xl font-black leading-tight sm:text-7xl gradient-text">${n}</h1>
602
- <p className="mx-auto mt-6 max-w-xl text-lg text-muted">${ctx.template.siteDescription}</p>
603
- <a href="#reserve" className="mt-10 inline-block gradient-bg rounded-full px-8 py-3 font-semibold text-black">Reserve a table</a>
741
+ return shell(`<section className="relative mx-auto max-w-4xl px-6 py-32 text-center sm:py-40">
742
+ <p className="text-sm font-semibold uppercase tracking-[0.35em] text-faint">Est. 2026 \xB7 Natural wine bar & kitchen</p>
743
+ <h1 className="text-display mt-5"><span className="gradient-text">${n}</span></h1>
744
+ <p className="lead mx-auto mt-6 max-w-xl">${ctx.template.siteDescription}</p>
745
+ <div className="mt-10 flex flex-wrap justify-center gap-3">
746
+ <a href="/reservations" className="shimmer rounded-full gradient-bg px-8 py-3.5 font-semibold on-accent transition hover:-translate-y-0.5">Reserve a table</a>
747
+ <a href="/menu" className="rounded-full border border-hairline px-8 py-3.5 font-semibold transition hover:bg-surface">View the menu</a>
748
+ </div>
604
749
  </section>
605
- <section id="menu" className="mx-auto max-w-4xl px-6 py-16">
606
- <h2 className="mb-10 text-center text-3xl font-bold">Tonight's plates</h2>
607
- <div className="grid gap-6 sm:grid-cols-2">
750
+ <section id="menu" className="mx-auto max-w-4xl px-6 py-20">
751
+ <div className="mb-12 text-center"><p className="text-sm font-semibold uppercase tracking-widest gradient-text">From the pass</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">Tonight's plates</h2></div>
752
+ <div className="grid gap-x-12 gap-y-6 sm:grid-cols-2">
608
753
  {[
609
- { n: "Charred leeks", p: "$14" }, { n: "Handmade tagliatelle", p: "$22" },
610
- { n: "Wood-fired trout", p: "$28" }, { n: "Olive oil cake", p: "$11" },
754
+ { n: "Charred leeks, hazelnut & aged pecorino", p: "$14" }, { n: "Handmade tagliatelle, brown butter & sage", p: "$22" },
755
+ { n: "Wood-fired trout, fennel & burnt lemon", p: "$28" }, { n: "Dry-aged sirloin, bone marrow butter", p: "$34" },
756
+ { n: "Roasted heritage carrots, dukkah & yoghurt", p: "$13" }, { n: "Olive oil & almond cake, cr\xE8me fra\xEEche", p: "$11" },
611
757
  ].map((d) => (
612
- <div key={d.n} className="flex items-baseline justify-between gap-4 border-b border-hairline pb-4">
613
- <div>
614
- <h3 className="text-lg font-semibold">{d.n}</h3>
615
- <p className="text-sm text-muted">A short, mouth-watering description of the dish.</p>
616
- </div>
617
- <span className="shrink-0 gradient-text font-bold">{d.p}</span>
758
+ <div key={d.n} className="flex items-baseline gap-3 border-b border-dashed border-hairline pb-4">
759
+ <h3 className="font-semibold tracking-tight">{d.n}</h3>
760
+ <span className="flex-1" />
761
+ <span className="shrink-0 gradient-text font-bold tabular-nums">{d.p}</span>
618
762
  </div>
619
763
  ))}
620
764
  </div>
621
- </section>
622
- <section id="reserve" className="mx-auto max-w-2xl px-6 py-24 text-center">
623
- <h2 className="text-3xl font-bold">Join us</h2>
624
- <p className="mt-3 text-muted">Open Wed\u2013Sun, 5pm till late. Walk-ins welcome; bookings recommended.</p>
625
- <a href="tel:+10000000000" className="mt-8 inline-block rounded-full border border-hairline px-8 py-3 font-semibold hover:bg-surface">Call to book</a>
765
+ <p className="mt-10 text-center text-sm text-muted">Menu changes with the seasons \xB7 ask us about tonight's natural wine pairings.</p>
626
766
  </section>`);
627
767
  }
628
- return shell(`<section className="mx-auto max-w-4xl px-6 py-28 text-center">
629
- <p className="mb-4 inline-block rounded-full border border-hairline px-4 py-1 text-xs font-semibold text-muted">New \xB7 v1.0</p>
630
- <h1 className="text-5xl font-black leading-tight sm:text-6xl">Ship faster with <span className="gradient-text">${n}</span></h1>
631
- <p className="mx-auto mt-6 max-w-2xl text-lg text-muted">${ctx.template.siteDescription}</p>
632
- <div className="mt-10 flex justify-center gap-4">
633
- <a href="#pricing" className="gradient-bg rounded-full px-8 py-3 font-semibold text-black">Start free</a>
634
- <a href="#features" className="rounded-full border border-hairline px-8 py-3 font-semibold hover:bg-surface">See features</a>
768
+ return shell(`<section className="relative mx-auto max-w-4xl px-6 py-32 text-center sm:py-40">
769
+ <span className="glass inline-flex items-center gap-2 rounded-full px-4 py-1.5 text-xs font-semibold text-muted"><span aria-hidden className="h-1.5 w-1.5 rounded-full gradient-bg" /> New \xB7 Realtime dashboards are live</span>
770
+ <h1 className="text-display mt-7">Ship faster with <span className="gradient-text">${n}</span></h1>
771
+ <p className="lead mx-auto mt-6 max-w-2xl">${ctx.template.siteDescription}</p>
772
+ <div className="mt-10 flex flex-wrap justify-center gap-3">
773
+ <a href="/pricing" className="shimmer rounded-full gradient-bg px-8 py-3.5 font-semibold on-accent transition hover:-translate-y-0.5">Start free</a>
774
+ <a href="/features" className="rounded-full border border-hairline px-8 py-3.5 font-semibold transition hover:bg-surface">See features</a>
635
775
  </div>
776
+ <p className="mt-5 text-sm text-faint">No credit card \xB7 Free forever plan \xB7 SOC 2-ready</p>
636
777
  </section>
637
- <section id="features" className="mx-auto max-w-6xl px-6 py-16">
778
+ <section id="features" className="mx-auto max-w-6xl px-6 py-20">
779
+ <div className="mb-12 text-center"><p className="text-sm font-semibold uppercase tracking-widest gradient-text">Why teams switch</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">Everything in one fast place</h2></div>
638
780
  <div className="grid gap-6 md:grid-cols-3">
639
781
  {[
640
- { t: "Fast", d: "Built on the edge \u2014 global by default." },
641
- { t: "Secure", d: "Hardened headers and auth out of the box." },
642
- { t: "Scalable", d: "From your first user to your millionth." },
782
+ { t: "Realtime analytics", d: "Live dashboards on the edge \u2014 global by default, no waiting for pipelines.", e: "\u26A1" },
783
+ { t: "Secure by default", d: "Hardened headers, SSO and audit logs out of the box. SOC 2-ready.", e: "\u{1F512}" },
784
+ { t: "Scales with you", d: "From your first user to your millionth, with usage-based billing built in.", e: "\u{1F4C8}" },
643
785
  ].map((f) => (
644
- <div key={f.t} className="rounded-2xl border border-hairline bg-surface p-8">
645
- <h3 className="text-xl font-bold gradient-text">{f.t}</h3>
646
- <p className="mt-2 text-muted">{f.d}</p>
786
+ <div key={f.t} className="card p-8">
787
+ <div className="mb-5 inline-flex h-12 w-12 items-center justify-center rounded-2xl gradient-bg text-2xl accent-glow">{f.e}</div>
788
+ <h3 className="text-xl font-bold tracking-tight">{f.t}</h3>
789
+ <p className="mt-2 leading-relaxed text-muted">{f.d}</p>
647
790
  </div>
648
791
  ))}
649
792
  </div>
650
- </section>
651
- <section id="pricing" className="mx-auto max-w-md px-6 py-24 text-center">
652
- <div className="rounded-3xl border border-hairline bg-surface p-10">
653
- <h2 className="text-3xl font-bold">Pro</h2>
654
- <p className="mt-2 text-5xl font-black gradient-text">$29<span className="text-lg text-faint">/mo</span></p>
655
- <a href="#" className="mt-8 inline-block w-full gradient-bg rounded-full px-8 py-3 font-semibold text-black">Get started</a>
656
- </div>
657
793
  </section>`);
658
794
  }
659
795
  var glyph = (ctx) => (ctx.template.siteName.trim()[0] ?? "A").toUpperCase();
@@ -879,7 +1015,7 @@ var careersPage = (ctx) => {
879
1015
  ].map((j) => (
880
1016
  <div key={j.role} className="flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-hairline bg-surface p-5">
881
1017
  <div><h3 className="font-semibold">{j.role}</h3><p className="text-sm text-muted">{j.team}</p></div>
882
- <div className="flex items-center gap-3"><Badge>{j.type}</Badge><a href="/contact" className="rounded-full gradient-bg px-4 py-2 text-sm font-semibold text-black">Apply</a></div>
1018
+ <div className="flex items-center gap-3"><Badge>{j.type}</Badge><a href="/contact" className="rounded-full gradient-bg px-4 py-2 text-sm font-semibold on-accent">Apply</a></div>
883
1019
  </div>
884
1020
  ))}
885
1021
  </div>
@@ -976,7 +1112,7 @@ var reservationsPage = (ctx) => {
976
1112
  <div className="mx-auto max-w-2xl rounded-3xl border border-hairline bg-surface p-8 text-center">
977
1113
  <h2 className="text-2xl font-bold">Book by phone or online</h2>
978
1114
  <p className="mt-3 text-muted">Call us on <span className="font-semibold text-fg">+1 (555) 012-3456</span> or reserve online in seconds.</p>
979
- <a href="/contact" className="mt-6 inline-block rounded-full gradient-bg px-8 py-3 font-semibold text-black">Reserve a table</a>
1115
+ <a href="/contact" className="mt-6 inline-block rounded-full gradient-bg px-8 py-3 font-semibold on-accent">Reserve a table</a>
980
1116
  </div>
981
1117
  </Section>`,
982
1118
  cta: { title: "Planning something special?", subtitle: "Ask us about private dining and set menus.", label: "Enquire now", href: "/contact" }
@@ -1154,7 +1290,7 @@ export function ContactForm() {
1154
1290
  {err("_form") && <p className={errCls}>{err("_form")}</p>}
1155
1291
  <button
1156
1292
  disabled={pending}
1157
- className="gradient-bg rounded-full px-8 py-3 font-semibold text-black disabled:opacity-60"
1293
+ className="gradient-bg rounded-full px-8 py-3 font-semibold on-accent disabled:opacity-60"
1158
1294
  >
1159
1295
  {pending ? "Sending\u2026" : "Send message"}
1160
1296
  </button>
@@ -1284,7 +1420,7 @@ export function DocsSidebar({ nav }: { nav: { group: string; items: DocMeta[] }[
1284
1420
  <li key={d.slug}>
1285
1421
  <Link
1286
1422
  href={href}
1287
- className={\`block rounded-lg px-3 py-1.5 transition \${active ? "gradient-bg font-semibold text-black" : "text-muted hover:bg-surface hover:text-fg"}\`}
1423
+ className={\`block rounded-lg px-3 py-1.5 transition \${active ? "gradient-bg font-semibold on-accent" : "text-muted hover:bg-surface hover:text-fg"}\`}
1288
1424
  >
1289
1425
  {d.title}
1290
1426
  </Link>
@@ -1903,12 +2039,14 @@ import { useIsMounted } from "@lacspace/hooks";` : "";
1903
2039
  <Link href="/cart" aria-label="Cart" className="relative inline-flex h-9 w-9 items-center justify-center rounded-full border border-hairline text-muted transition hover:text-fg">
1904
2040
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden><circle cx="9" cy="21" r="1" /><circle cx="20" cy="21" r="1" /><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6" /></svg>
1905
2041
  {mounted() && count > 0 ? (
1906
- <span className="absolute -right-1 -top-1 inline-flex h-4 min-w-4 items-center justify-center rounded-full gradient-bg px-1 text-[10px] font-bold text-black">{count}</span>
2042
+ <span className="absolute -right-1 -top-1 inline-flex h-4 min-w-4 items-center justify-center rounded-full gradient-bg px-1 text-[10px] font-bold on-accent">{count}</span>
1907
2043
  ) : null}
1908
2044
  </Link>` : "";
1909
2045
  return `"use client";
1910
2046
 
2047
+ import { useEffect, useState } from "react";
1911
2048
  import Link from "next/link";
2049
+ import { usePathname } from "next/navigation";
1912
2050
  import { useUI } from "@/lib/store";
1913
2051
  import { ThemeToggle } from "./theme-toggle";${cartImport}
1914
2052
 
@@ -1917,16 +2055,28 @@ const LINKS = [${linkLiteral(pagesFor(ctx).filter((p) => p.nav))}];
1917
2055
  export function SiteHeader() {
1918
2056
  const open = useUI((s) => s.navOpen);
1919
2057
  const toggle = useUI((s) => s.toggleNav);
1920
- const setOpen = useUI((s) => s.setNavOpen);${cartHook}
2058
+ const setOpen = useUI((s) => s.setNavOpen);
2059
+ const pathname = usePathname();${cartHook}
2060
+ // Sticky glass header that tightens and gains a hairline once you scroll.
2061
+ const [scrolled, setScrolled] = useState(false);
2062
+ useEffect(() => {
2063
+ const onScroll = () => setScrolled(window.scrollY > 8);
2064
+ onScroll();
2065
+ window.addEventListener("scroll", onScroll, { passive: true });
2066
+ return () => window.removeEventListener("scroll", onScroll);
2067
+ }, []);
1921
2068
  return (
1922
- <header className="sticky top-0 z-40 border-b border-hairline bg-app/90 backdrop-blur">
1923
- <nav className="mx-auto flex max-w-6xl items-center justify-between px-6 py-4">
1924
- <Link href="/" className="text-lg font-black gradient-text">${ctx.template.siteName}</Link>
1925
- <div className="hidden items-center gap-6 md:flex">
1926
- {LINKS.map((l) => (
1927
- <Link key={l.href} href={l.href} className="text-sm text-muted transition hover:text-fg">{l.label}</Link>
1928
- ))}
1929
- <ThemeToggle />${cartBtn}
2069
+ <header className={"sticky top-0 z-40 transition-all duration-300 " + (scrolled ? "glass shadow-sm" : "border-b border-transparent bg-transparent")}>
2070
+ <nav className={"mx-auto flex max-w-6xl items-center justify-between px-6 transition-all duration-300 " + (scrolled ? "py-3" : "py-5")}>
2071
+ <Link href="/" className="text-lg font-black tracking-tight gradient-text">${ctx.template.siteName}</Link>
2072
+ <div className="hidden items-center gap-1 md:flex">
2073
+ {LINKS.map((l) => {
2074
+ const active = pathname === l.href;
2075
+ return (
2076
+ <Link key={l.href} href={l.href} className={"rounded-full px-3.5 py-1.5 text-sm font-medium transition " + (active ? "bg-surface text-fg" : "text-muted hover:bg-surface hover:text-fg")}>{l.label}</Link>
2077
+ );
2078
+ })}
2079
+ <div className="ml-2 flex items-center gap-2"><ThemeToggle />${cartBtn}</div>
1930
2080
  </div>
1931
2081
  <div className="flex items-center gap-2 md:hidden">
1932
2082
  <ThemeToggle />${cartBtn}
@@ -1936,10 +2086,10 @@ export function SiteHeader() {
1936
2086
  </div>
1937
2087
  </nav>
1938
2088
  {open ? (
1939
- <div className="border-t border-hairline md:hidden">
2089
+ <div className="glass border-t border-hairline md:hidden">
1940
2090
  <div className="mx-auto flex max-w-6xl flex-col gap-1 px-6 py-3">
1941
2091
  {LINKS.map((l) => (
1942
- <Link key={l.href} href={l.href} onClick={() => setOpen(false)} className="rounded-lg px-3 py-2 text-muted transition hover:bg-surface hover:text-fg">{l.label}</Link>
2092
+ <Link key={l.href} href={l.href} onClick={() => setOpen(false)} className="rounded-xl px-3 py-2 text-muted transition hover:bg-surface hover:text-fg">{l.label}</Link>
1943
2093
  ))}
1944
2094
  </div>
1945
2095
  </div>
@@ -1954,22 +2104,32 @@ var siteFooter = (ctx) => {
1954
2104
  const groups = ["Product", "Company", "Resources"].map((title) => ({ title, items: pages.filter((p) => p.group === title) })).filter((g) => g.items.length > 0);
1955
2105
  const groupsLiteral = groups.map((g) => `{ title: ${JSON.stringify(g.title)}, links: [${linkLiteral(g.items)}] }`).join(", ");
1956
2106
  return `import Link from "next/link";
2107
+ import { Newsletter } from "@/components/ui";
1957
2108
 
1958
2109
  const GROUPS = [${groupsLiteral}];
1959
2110
 
1960
2111
  export function SiteFooter() {
1961
2112
  return (
1962
- <footer className="border-t border-hairline">
1963
- <div className="mx-auto max-w-6xl px-6 py-14">
1964
- <div className="grid gap-10 md:grid-cols-4">
2113
+ <footer className="relative mt-24 border-t border-hairline">
2114
+ <div className="mx-auto max-w-6xl px-6">
2115
+ {/* newsletter island \u2014 floats over the fold between page and footer */}
2116
+ <div className="-mt-16 mb-16">
2117
+ <Newsletter title="Stay in the loop" subtitle="Occasional updates from ${ctx.template.siteName}. No spam \u2014 unsubscribe anytime." />
2118
+ </div>
2119
+ <div className="grid gap-10 pb-4 md:grid-cols-[1.4fr_1fr_1fr_1fr]">
1965
2120
  <div>
1966
- <div className="text-lg font-black gradient-text">${ctx.template.siteName}</div>
1967
- <p className="mt-3 max-w-xs text-sm text-muted">${ctx.template.siteDescription}</p>
2121
+ <div className="text-lg font-black tracking-tight gradient-text">${ctx.template.siteName}</div>
2122
+ <p className="mt-3 max-w-xs text-sm leading-relaxed text-muted">${ctx.template.siteDescription}</p>
2123
+ <div className="mt-5 flex gap-2">
2124
+ {["\u{1D54F}", "in", "gh"].map((s) => (
2125
+ <span key={s} className="inline-flex h-9 w-9 items-center justify-center rounded-full border border-hairline text-xs font-semibold text-muted transition hover:border-[color:var(--accent-to)] hover:text-fg">{s}</span>
2126
+ ))}
2127
+ </div>
1968
2128
  </div>
1969
2129
  {GROUPS.map((g) => (
1970
2130
  <div key={g.title}>
1971
- <div className="text-sm font-semibold">{g.title}</div>
1972
- <ul className="mt-3 space-y-2 text-sm text-muted">
2131
+ <div className="text-xs font-semibold uppercase tracking-widest text-faint">{g.title}</div>
2132
+ <ul className="mt-4 space-y-2.5 text-sm text-muted">
1973
2133
  {g.links.map((l) => (
1974
2134
  <li key={l.href}><Link href={l.href} className="transition hover:text-fg">{l.label}</Link></li>
1975
2135
  ))}
@@ -1977,7 +2137,7 @@ export function SiteFooter() {
1977
2137
  </div>
1978
2138
  ))}
1979
2139
  </div>
1980
- <div className="mt-12 flex flex-col gap-3 border-t border-hairline pt-6 text-sm text-faint sm:flex-row sm:items-center sm:justify-between">
2140
+ <div className="mt-12 flex flex-col gap-3 border-t border-hairline py-8 text-sm text-faint sm:flex-row sm:items-center sm:justify-between">
1981
2141
  <span>\xA9 {new Date().getFullYear()} ${ctx.template.siteName}. All rights reserved.</span>
1982
2142
  <span>Built with <a href="https://lacspace.com/packages" className="text-muted transition hover:text-fg">the Lacspace React Kit</a>.</span>
1983
2143
  </div>
@@ -2001,10 +2161,10 @@ export function AnnouncementBar() {
2001
2161
  if (!mounted() || dismissed) return null;
2002
2162
 
2003
2163
  return (
2004
- <div className="relative gradient-bg px-10 py-2 text-center text-sm font-medium text-black">
2164
+ <div className="relative gradient-bg px-10 py-2 text-center text-sm font-medium on-accent">
2005
2165
  \u2728 Built with the Lacspace React Kit \u2014{" "}
2006
2166
  <a href="https://lacspace.com/packages" className="underline underline-offset-2">explore the packages</a>
2007
- <button type="button" aria-label="Dismiss" onClick={dismiss} className="absolute right-3 top-1/2 -translate-y-1/2 text-lg leading-none text-black/60 hover:text-black">\xD7</button>
2167
+ <button type="button" aria-label="Dismiss" onClick={dismiss} className="absolute right-3 top-1/2 -translate-y-1/2 text-lg leading-none on-accent/60 hover:on-accent">\xD7</button>
2008
2168
  </div>
2009
2169
  );
2010
2170
  }
@@ -2025,7 +2185,7 @@ export function UnderDevelopment({ title = "This page", path }: { title?: string
2025
2185
  <div className="h-full w-1/3 gradient-bg" style={{ animation: "loadbar 1.8s ease-in-out infinite" }} />
2026
2186
  </div>
2027
2187
  <div className="mt-10 flex flex-wrap items-center justify-center gap-3">
2028
- <Link href="/" className="gradient-bg rounded-full px-6 py-3 font-semibold text-black">Back home</Link>
2188
+ <Link href="/" className="gradient-bg rounded-full px-6 py-3 font-semibold on-accent">Back home</Link>
2029
2189
  <Link href="/contact" className="rounded-full border border-hairline px-6 py-3 font-semibold transition hover:bg-surface">Get in touch</Link>
2030
2190
  </div>
2031
2191
  {path ? (
@@ -2187,29 +2347,48 @@ var builtWithSection = (ctx) => {
2187
2347
  };
2188
2348
  var dashboardShell = (ctx) => {
2189
2349
  const nav = [{ path: "/", label: "Overview" }, ...pagesFor(ctx).filter((p) => p.nav)];
2190
- return `import Link from "next/link";
2350
+ return `"use client";
2351
+ import Link from "next/link";
2352
+ import { usePathname } from "next/navigation";
2191
2353
  import type { ReactNode } from "react";
2192
2354
  import { ThemeToggle } from "./theme-toggle";
2193
2355
 
2194
2356
  const NAV = [${linkLiteral(nav)}];
2195
2357
 
2196
2358
  export function DashboardShell({ title, subtitle, children }: { title: string; subtitle?: string; children: ReactNode }) {
2359
+ const pathname = usePathname();
2197
2360
  return (
2198
2361
  <div className="flex min-h-screen">
2199
- <aside className="hidden w-56 shrink-0 border-r border-hairline p-6 md:block">
2200
- <div className="mb-8 flex items-center justify-between">
2201
- <Link href="/" className="text-lg font-black gradient-text">${ctx.template.siteName}</Link>
2362
+ <aside className="sticky top-0 hidden h-screen w-60 shrink-0 flex-col border-r border-hairline bg-surface/40 p-5 md:flex">
2363
+ <div className="mb-8 flex items-center justify-between px-2">
2364
+ <Link href="/" className="text-lg font-black tracking-tight gradient-text">${ctx.template.siteName}</Link>
2202
2365
  <ThemeToggle />
2203
2366
  </div>
2204
- <nav className="space-y-1 text-sm text-muted">
2205
- {NAV.map((l) => (
2206
- <Link key={l.href} href={l.href} className="block rounded-lg px-3 py-2 transition hover:bg-surface hover:text-fg">{l.label}</Link>
2207
- ))}
2367
+ <nav className="flex-1 space-y-1 text-sm">
2368
+ {NAV.map((l) => {
2369
+ const active = pathname === l.href;
2370
+ return (
2371
+ <Link key={l.href} href={l.href} className={"flex items-center gap-2 rounded-xl px-3 py-2 font-medium transition " + (active ? "gradient-bg on-accent shadow-sm" : "text-muted hover:bg-surface hover:text-fg")}>
2372
+ <span aria-hidden className={"h-1.5 w-1.5 rounded-full " + (active ? "bg-[color:var(--on-accent)]" : "bg-current opacity-40")} />
2373
+ {l.label}
2374
+ </Link>
2375
+ );
2376
+ })}
2208
2377
  </nav>
2378
+ <div className="mt-4 rounded-2xl border border-hairline p-4 text-xs text-muted">
2379
+ <p className="font-semibold text-fg">Need a hand?</p>
2380
+ <p className="mt-1">Read the docs or reach the team.</p>
2381
+ <Link href="/help" className="mt-3 inline-block rounded-full gradient-bg px-3 py-1.5 font-semibold on-accent">Get help</Link>
2382
+ </div>
2209
2383
  </aside>
2210
- <main className="flex-1 p-6 md:p-10">
2211
- <h1 className="text-2xl font-bold">{title}</h1>
2212
- {subtitle ? <p className="mt-1 text-muted">{subtitle}</p> : null}
2384
+ <main className="min-w-0 flex-1 p-6 md:p-10">
2385
+ <div className="flex flex-wrap items-end justify-between gap-4">
2386
+ <div>
2387
+ <h1 className="text-2xl font-bold tracking-tight sm:text-3xl">{title}</h1>
2388
+ {subtitle ? <p className="mt-1.5 text-muted">{subtitle}</p> : null}
2389
+ </div>
2390
+ <div className="md:hidden"><ThemeToggle /></div>
2391
+ </div>
2213
2392
  <div className="mt-8">{children}</div>
2214
2393
  </main>
2215
2394
  </div>
@@ -2234,19 +2413,25 @@ export default function Home() {
2234
2413
  </div>
2235
2414
  <div className="mt-6 grid gap-6 lg:grid-cols-3">
2236
2415
  <div className="rounded-2xl border border-hairline bg-surface p-6 lg:col-span-2">
2237
- <div className="mb-4 flex items-center justify-between">
2238
- <h2 className="font-semibold">Revenue</h2>
2239
- <span className="text-sm font-medium text-emerald-400">+12.4%</span>
2416
+ <div className="mb-5 flex items-center justify-between">
2417
+ <div><h2 className="font-semibold tracking-tight">Revenue</h2><p className="text-sm text-muted">Last 12 months</p></div>
2418
+ <span className="rounded-full bg-emerald-500/10 px-2.5 py-1 text-xs font-semibold text-emerald-400">\u25B2 12.4%</span>
2240
2419
  </div>
2241
2420
  <AreaChart data={[12, 18, 15, 22, 20, 28, 26, 34, 30, 38, 42, 48]} />
2242
2421
  </div>
2243
2422
  <div className="rounded-2xl border border-hairline bg-surface p-6">
2244
- <div className="mb-4 font-semibold">Recent activity</div>
2245
- <div className="space-y-3">
2246
- {[1, 2, 3, 4].map((i) => (
2247
- <div key={i} className="flex items-center justify-between border-b border-hairline pb-3 text-sm">
2248
- <span className="text-muted">Event #{i}</span>
2249
- <span className="text-faint">just now</span>
2423
+ <div className="mb-5 font-semibold tracking-tight">Recent activity</div>
2424
+ <div className="space-y-4">
2425
+ {[
2426
+ { who: "Ava Chen", what: "upgraded to Pro", when: "2m ago" },
2427
+ { who: "Order #4821", what: "was paid", when: "18m ago" },
2428
+ { who: "Liam Patel", what: "started a trial", when: "1h ago" },
2429
+ { who: "Refund #204", what: "was issued", when: "3h ago" },
2430
+ ].map((e) => (
2431
+ <div key={e.who} className="flex items-center gap-3 text-sm">
2432
+ <span className="inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full gradient-bg text-xs font-bold on-accent">{e.who.slice(0, 1)}</span>
2433
+ <span className="min-w-0 flex-1 truncate text-muted"><span className="font-medium text-fg">{e.who}</span> {e.what}</span>
2434
+ <span className="shrink-0 text-faint">{e.when}</span>
2250
2435
  </div>
2251
2436
  ))}
2252
2437
  </div>
@@ -2293,7 +2478,7 @@ var pricingPage = (ctx) => pageFile({
2293
2478
  { name: "Scale", price: "Custom", period: "", tagline: "For organizations", features: ["SSO & SAML", "Dedicated support", "SLA & audit logs", "Guided onboarding"], cta: "Contact sales", highlight: false },
2294
2479
  ].map((tier) => (
2295
2480
  <div key={tier.name} className={"flex flex-col rounded-3xl border p-8 " + (tier.highlight ? "border-transparent bg-surface ring-2 ring-[color:var(--accent-to)]" : "border-hairline bg-surface")}>
2296
- {tier.highlight ? <span className="mb-4 inline-block w-fit rounded-full gradient-bg px-3 py-1 text-xs font-bold text-black">Most popular</span> : null}
2481
+ {tier.highlight ? <span className="mb-4 inline-block w-fit rounded-full gradient-bg px-3 py-1 text-xs font-bold on-accent">Most popular</span> : null}
2297
2482
  <h2 className="text-lg font-semibold">{tier.name}</h2>
2298
2483
  <p className="mt-1 text-sm text-muted">{tier.tagline}</p>
2299
2484
  <div className="mt-6 flex items-baseline gap-1">
@@ -2305,7 +2490,7 @@ var pricingPage = (ctx) => pageFile({
2305
2490
  <li key={f} className="flex items-center gap-2 text-muted"><span className="text-[color:var(--accent-to)]">\u2713</span> {f}</li>
2306
2491
  ))}
2307
2492
  </ul>
2308
- <Link href="/contact" className={"mt-8 rounded-full px-6 py-3 text-center font-semibold transition " + (tier.highlight ? "gradient-bg text-black" : "border border-hairline hover:bg-app")}>{tier.cta}</Link>
2493
+ <Link href="/contact" className={"mt-8 rounded-full px-6 py-3 text-center font-semibold transition " + (tier.highlight ? "gradient-bg on-accent" : "border border-hairline hover:bg-app")}>{tier.cta}</Link>
2309
2494
  </div>
2310
2495
  ))}
2311
2496
  </div>
@@ -2602,7 +2787,7 @@ export function ProductGrid() {
2602
2787
  <div className="mb-4 flex aspect-square items-center justify-center rounded-xl gradient-bg text-5xl">{p.emoji}</div>
2603
2788
  <h3 className="font-semibold">{p.name}</h3>
2604
2789
  <div className="mt-1 text-muted">{"$" + p.price.toFixed(2)}</div>
2605
- <button type="button" onClick={() => add({ id: p.id, name: p.name, price: p.price })} className="mt-4 rounded-full gradient-bg px-4 py-2 text-sm font-semibold text-black transition hover:opacity-90">Add to bag</button>
2790
+ <button type="button" onClick={() => add({ id: p.id, name: p.name, price: p.price })} className="mt-4 rounded-full gradient-bg px-4 py-2 text-sm font-semibold on-accent transition hover:opacity-90">Add to bag</button>
2606
2791
  </div>
2607
2792
  ))}
2608
2793
  </div>
@@ -2627,7 +2812,7 @@ export function CartView() {
2627
2812
  return (
2628
2813
  <div className="mx-auto max-w-md py-16 text-center">
2629
2814
  <p className="text-lg text-muted">Your bag is empty.</p>
2630
- <Link href="/shop" className="mt-6 inline-block rounded-full gradient-bg px-6 py-3 font-semibold text-black">Browse the shop</Link>
2815
+ <Link href="/shop" className="mt-6 inline-block rounded-full gradient-bg px-6 py-3 font-semibold on-accent">Browse the shop</Link>
2631
2816
  </div>
2632
2817
  );
2633
2818
  }
@@ -2651,7 +2836,7 @@ export function CartView() {
2651
2836
  <button type="button" onClick={clear} className="text-sm text-muted transition hover:text-fg">Clear bag</button>
2652
2837
  <span className="text-lg font-bold">Total {"$" + total.toFixed(2)}</span>
2653
2838
  </div>
2654
- <button type="button" className="mt-8 w-full rounded-full gradient-bg px-6 py-3 font-semibold text-black">Checkout</button>
2839
+ <button type="button" className="mt-8 w-full rounded-full gradient-bg px-6 py-3 font-semibold on-accent">Checkout</button>
2655
2840
  </div>
2656
2841
  );
2657
2842
  }
@@ -2878,7 +3063,7 @@ export function CartButton() {
2878
3063
  <Link href="/cart" aria-label="Cart" className="relative inline-flex h-9 w-9 items-center justify-center rounded-full border border-hairline text-muted transition hover:text-fg">
2879
3064
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden><circle cx="9" cy="21" r="1" /><circle cx="20" cy="21" r="1" /><path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6" /></svg>
2880
3065
  {mounted() && count > 0 ? (
2881
- <span className="absolute -right-1 -top-1 inline-flex h-4 min-w-4 items-center justify-center rounded-full gradient-bg px-1 text-[10px] font-bold text-black">{count}</span>
3066
+ <span className="absolute -right-1 -top-1 inline-flex h-4 min-w-4 items-center justify-center rounded-full gradient-bg px-1 text-[10px] font-bold on-accent">{count}</span>
2882
3067
  ) : null}
2883
3068
  </Link>
2884
3069
  );
@@ -2914,7 +3099,7 @@ export function AddToCart({ product, className = "" }: { product: AddToCartProdu
2914
3099
  setAdded(true);
2915
3100
  window.setTimeout(() => setAdded(false), 1200);
2916
3101
  }}
2917
- className={"rounded-full gradient-bg px-4 py-2 text-sm font-semibold text-black transition hover:opacity-90 " + className}
3102
+ className={"rounded-full gradient-bg px-4 py-2.5 text-sm font-semibold on-accent transition hover:-translate-y-0.5 " + className}
2918
3103
  >
2919
3104
  {added ? "Added \\u2713" : "Add to cart"}
2920
3105
  </button>
@@ -2923,7 +3108,9 @@ export function AddToCart({ product, className = "" }: { product: AddToCartProdu
2923
3108
  `;
2924
3109
  var marketHeader = (ctx) => `"use client";
2925
3110
 
3111
+ import { useEffect, useState } from "react";
2926
3112
  import Link from "next/link";
3113
+ import { usePathname } from "next/navigation";
2927
3114
  import { useUI } from "@/lib/store";
2928
3115
  import { ThemeToggle } from "./theme-toggle";
2929
3116
  import { CartButton } from "./cart-button";
@@ -2934,16 +3121,26 @@ export function SiteHeader() {
2934
3121
  const open = useUI((s) => s.navOpen);
2935
3122
  const toggle = useUI((s) => s.toggleNav);
2936
3123
  const setOpen = useUI((s) => s.setNavOpen);
3124
+ const pathname = usePathname();
3125
+ const [scrolled, setScrolled] = useState(false);
3126
+ useEffect(() => {
3127
+ const onScroll = () => setScrolled(window.scrollY > 8);
3128
+ onScroll();
3129
+ window.addEventListener("scroll", onScroll, { passive: true });
3130
+ return () => window.removeEventListener("scroll", onScroll);
3131
+ }, []);
2937
3132
  return (
2938
- <header className="sticky top-0 z-40 border-b border-hairline bg-app/90 backdrop-blur">
2939
- <nav className="mx-auto flex max-w-6xl items-center justify-between px-6 py-4">
2940
- <Link href="/" className="text-lg font-black gradient-text">${ctx.template.siteName}</Link>
2941
- <div className="hidden items-center gap-6 md:flex">
2942
- {LINKS.map((l) => (
2943
- <Link key={l.href} href={l.href} className="text-sm text-muted transition hover:text-fg">{l.label}</Link>
2944
- ))}
2945
- <ThemeToggle />
2946
- <CartButton />
3133
+ <header className={"sticky top-0 z-40 transition-all duration-300 " + (scrolled ? "glass shadow-sm" : "border-b border-transparent bg-transparent")}>
3134
+ <nav className={"mx-auto flex max-w-6xl items-center justify-between px-6 transition-all duration-300 " + (scrolled ? "py-3" : "py-5")}>
3135
+ <Link href="/" className="text-lg font-black tracking-tight gradient-text">${ctx.template.siteName}</Link>
3136
+ <div className="hidden items-center gap-1 md:flex">
3137
+ {LINKS.map((l) => {
3138
+ const active = pathname === l.href;
3139
+ return (
3140
+ <Link key={l.href} href={l.href} className={"rounded-full px-3.5 py-1.5 text-sm font-medium transition " + (active ? "bg-surface text-fg" : "text-muted hover:bg-surface hover:text-fg")}>{l.label}</Link>
3141
+ );
3142
+ })}
3143
+ <div className="ml-2 flex items-center gap-2"><ThemeToggle /><CartButton /></div>
2947
3144
  </div>
2948
3145
  <div className="flex items-center gap-2 md:hidden">
2949
3146
  <ThemeToggle />
@@ -2954,10 +3151,10 @@ export function SiteHeader() {
2954
3151
  </div>
2955
3152
  </nav>
2956
3153
  {open ? (
2957
- <div className="border-t border-hairline md:hidden">
3154
+ <div className="glass border-t border-hairline md:hidden">
2958
3155
  <div className="mx-auto flex max-w-6xl flex-col gap-1 px-6 py-3">
2959
3156
  {LINKS.map((l) => (
2960
- <Link key={l.href} href={l.href} onClick={() => setOpen(false)} className="rounded-lg px-3 py-2 text-muted transition hover:bg-surface hover:text-fg">{l.label}</Link>
3157
+ <Link key={l.href} href={l.href} onClick={() => setOpen(false)} className="rounded-xl px-3 py-2 text-muted transition hover:bg-surface hover:text-fg">{l.label}</Link>
2961
3158
  ))}
2962
3159
  </div>
2963
3160
  </div>
@@ -2984,30 +3181,30 @@ export default function Home() {
2984
3181
  return (
2985
3182
  <main className="relative min-h-screen overflow-hidden">
2986
3183
  <Aurora />
2987
- <section className="mx-auto grid max-w-6xl items-center gap-12 px-6 py-24 md:grid-cols-2">
3184
+ <section className="mx-auto grid max-w-6xl items-center gap-12 px-6 py-28 md:grid-cols-2">
2988
3185
  <div>
2989
- <p className="mb-4 text-sm font-semibold uppercase tracking-widest text-faint">Storefront</p>
2990
- <h1 className="text-5xl font-black leading-tight sm:text-6xl">Shop <span className="gradient-text">${n}</span></h1>
2991
- <p className="mt-6 max-w-md text-lg text-muted">${ctx.template.siteDescription}</p>
2992
- <div className="mt-10 flex gap-4">
2993
- <Link href="/shop" className="gradient-bg rounded-full px-8 py-3 font-semibold text-black">Shop the collection</Link>
2994
- <Link href="/cart" className="rounded-full border border-hairline px-8 py-3 font-semibold hover:bg-surface">View cart</Link>
3186
+ <span className="glass inline-flex items-center gap-2 rounded-full px-4 py-1.5 text-xs font-semibold text-muted">\u{1F6D2} Cart to checkout, wired end to end</span>
3187
+ <h1 className="text-display mt-6">Shop <span className="gradient-text">${n}</span></h1>
3188
+ <p className="lead mt-6 max-w-md">${ctx.template.siteDescription}</p>
3189
+ <div className="mt-9 flex flex-wrap gap-3">
3190
+ <Link href="/shop" className="shimmer rounded-full gradient-bg px-8 py-3.5 font-semibold on-accent transition hover:-translate-y-0.5">Shop the collection</Link>
3191
+ <Link href="/cart" className="rounded-full border border-hairline px-8 py-3.5 font-semibold transition hover:bg-surface">View cart</Link>
2995
3192
  </div>
2996
- <p className="mt-6 text-sm text-muted">Free standard shipping over {formatMoney(500000)}.</p>
3193
+ <p className="mt-6 text-sm text-muted">Free standard shipping over {formatMoney(500000)} \xB7 eSewa &amp; Khalti at checkout.</p>
2997
3194
  </div>
2998
3195
  <HeroArt />
2999
3196
  </section>
3000
3197
  <section className="mx-auto max-w-6xl px-6 py-16">
3001
- <div className="mb-10 flex items-end justify-between">
3002
- <h2 className="text-3xl font-bold">Featured</h2>
3003
- <Link href="/shop" className="text-sm text-muted underline underline-offset-4 hover:text-fg">See all</Link>
3198
+ <div className="mb-12 flex items-end justify-between">
3199
+ <div><p className="text-sm font-semibold uppercase tracking-widest gradient-text">Featured</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">Fresh in the store</h2></div>
3200
+ <Link href="/shop" className="hidden text-sm text-muted underline-offset-4 transition hover:text-fg hover:underline sm:block">See all \u2192</Link>
3004
3201
  </div>
3005
3202
  <div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
3006
3203
  {featured.map((p) => (
3007
- <div key={p.slug} className="group flex flex-col rounded-2xl border border-hairline bg-surface p-5 transition hover:-translate-y-1">
3008
- <Link href={"/product/" + p.slug} className="mb-4 flex aspect-square items-center justify-center rounded-xl gradient-bg text-6xl">{p.emoji}</Link>
3009
- <Link href={"/product/" + p.slug} className="font-semibold group-hover:opacity-90">{p.name}</Link>
3010
- <div className="mt-1 text-muted">{formatMoney(p.price)}</div>
3204
+ <div key={p.slug} className="card group flex flex-col p-5">
3205
+ <Link href={"/product/" + p.slug} className="mb-5 flex aspect-square items-center justify-center overflow-hidden rounded-xl gradient-bg text-7xl on-accent transition group-hover:scale-[1.03]">{p.emoji}</Link>
3206
+ <Link href={"/product/" + p.slug} className="font-semibold tracking-tight transition group-hover:text-[color:var(--accent-to)]">{p.name}</Link>
3207
+ <div className="mt-1 font-semibold text-muted">{formatMoney(p.price)}</div>
3011
3208
  <div className="mt-4">
3012
3209
  <AddToCart product={{ id: p.slug, name: p.name, unitPrice: p.price, weight: p.weight, emoji: p.emoji }} className="w-full" />
3013
3210
  </div>
@@ -3119,7 +3316,7 @@ export default function Page() {
3119
3316
  <main className="mx-auto min-h-screen max-w-3xl px-6 py-24 text-center">
3120
3317
  <h1 className="text-4xl font-bold">Your <span className="gradient-text">cart</span></h1>
3121
3318
  <p className="mt-4 text-lg text-muted">It's empty for now.</p>
3122
- <Link href="/shop" className="mt-8 inline-block rounded-full gradient-bg px-6 py-3 font-semibold text-black">Browse the shop</Link>
3319
+ <Link href="/shop" className="mt-8 inline-block rounded-full gradient-bg px-6 py-3 font-semibold on-accent">Browse the shop</Link>
3123
3320
  </main>
3124
3321
  );
3125
3322
  }
@@ -3178,7 +3375,7 @@ export default function Page() {
3178
3375
  {q.freeShippingRemaining > 0 ? (
3179
3376
  <p className="mt-4 text-xs text-muted">Add {formatMoney(q.freeShippingRemaining)} more for free shipping.</p>
3180
3377
  ) : null}
3181
- <Link href="/checkout" className="mt-6 block w-full rounded-full gradient-bg px-6 py-3 text-center font-semibold text-black">Checkout</Link>
3378
+ <Link href="/checkout" className="mt-6 block w-full rounded-full gradient-bg px-6 py-3 text-center font-semibold on-accent">Checkout</Link>
3182
3379
  <button type="button" onClick={clear} className="mt-3 block w-full text-center text-sm text-muted transition hover:text-fg">Clear cart</button>
3183
3380
  </aside>
3184
3381
  </div>
@@ -3218,7 +3415,7 @@ export default function Page() {
3218
3415
  <main className="mx-auto min-h-screen max-w-3xl px-6 py-24 text-center">
3219
3416
  <h1 className="text-4xl font-bold">Checkout</h1>
3220
3417
  <p className="mt-4 text-lg text-muted">Your cart is empty.</p>
3221
- <Link href="/shop" className="mt-8 inline-block rounded-full gradient-bg px-6 py-3 font-semibold text-black">Browse the shop</Link>
3418
+ <Link href="/shop" className="mt-8 inline-block rounded-full gradient-bg px-6 py-3 font-semibold on-accent">Browse the shop</Link>
3222
3419
  </main>
3223
3420
  );
3224
3421
  }
@@ -3341,7 +3538,7 @@ export default function Page() {
3341
3538
  <div className="flex justify-between text-muted"><dt>Shipping</dt><dd className="tabular-nums">{q.shipping === 0 ? "Free" : formatMoney(q.shipping)}</dd></div>
3342
3539
  <div className="flex justify-between border-t border-hairline pt-2 text-base font-bold"><dt>Total</dt><dd className="tabular-nums">{formatMoney(q.total)}</dd></div>
3343
3540
  </dl>
3344
- <button type="submit" disabled={busy} className="mt-6 block w-full rounded-full gradient-bg px-6 py-3 text-center font-semibold text-black transition hover:opacity-90 disabled:opacity-60">
3541
+ <button type="submit" disabled={busy} className="mt-6 block w-full rounded-full gradient-bg px-6 py-3 text-center font-semibold on-accent transition hover:opacity-90 disabled:opacity-60">
3345
3542
  {busy ? "Placing order\\u2026" : "Pay " + formatMoney(q.total)}
3346
3543
  </button>
3347
3544
  </aside>
@@ -3363,7 +3560,7 @@ export default async function Page({ searchParams }: { searchParams: Promise<{ o
3363
3560
  const mock = sp.mock === "1";
3364
3561
  return (
3365
3562
  <main className="mx-auto flex min-h-screen max-w-2xl flex-col items-center justify-center px-6 py-24 text-center">
3366
- <div className="flex h-20 w-20 items-center justify-center rounded-full gradient-bg text-4xl text-black">\u2713</div>
3563
+ <div className="flex h-20 w-20 items-center justify-center rounded-full gradient-bg text-4xl on-accent">\u2713</div>
3367
3564
  <h1 className="mt-8 text-4xl font-bold">Thank you!</h1>
3368
3565
  <p className="mt-4 text-lg text-muted">Your order with ${ctx.template.siteName} is confirmed.</p>
3369
3566
  {order ? (
@@ -3371,7 +3568,7 @@ export default async function Page({ searchParams }: { searchParams: Promise<{ o
3371
3568
  ) : null}
3372
3569
  {method ? <p className="mt-3 text-sm text-muted">Payment method: {method}</p> : null}
3373
3570
  {mock ? <p className="mt-3 max-w-md text-sm text-muted">This Khalti payment ran in mock mode. Set KHALTI_SECRET in your environment to hit the real gateway.</p> : null}
3374
- <Link href="/shop" className="mt-10 inline-block rounded-full gradient-bg px-6 py-3 font-semibold text-black">Continue shopping</Link>
3571
+ <Link href="/shop" className="mt-10 inline-block rounded-full gradient-bg px-6 py-3 font-semibold on-accent">Continue shopping</Link>
3375
3572
  </main>
3376
3573
  );
3377
3574
  }
@@ -3543,7 +3740,7 @@ export function SettingsPanel() {
3543
3740
  <p className="mt-1 text-sm text-muted">Theme via @lacspace/theme.</p>
3544
3741
  <div className="mt-4 inline-flex rounded-full border border-hairline p-1">
3545
3742
  {["light", "dark", "system"].map((t) => (
3546
- <button key={t} type="button" onClick={() => setTheme(t)} className={"rounded-full px-4 py-1.5 text-sm capitalize transition " + (theme === t ? "gradient-bg font-semibold text-black" : "text-muted hover:text-fg")}>{t}</button>
3743
+ <button key={t} type="button" onClick={() => setTheme(t)} className={"rounded-full px-4 py-1.5 text-sm capitalize transition " + (theme === t ? "gradient-bg font-semibold on-accent" : "text-muted hover:text-fg")}>{t}</button>
3547
3744
  ))}
3548
3745
  </div>
3549
3746
  </section>
@@ -3556,11 +3753,11 @@ var uiKitFiles = () => ({
3556
3753
 
3557
3754
  export function Section({ eyebrow, title, lead, children, className = "" }: { eyebrow?: string; title?: string; lead?: string; children?: ReactNode; className?: string }) {
3558
3755
  return (
3559
- <section className={"mx-auto max-w-6xl px-6 py-16 " + className}>
3560
- {eyebrow ? <p className="text-sm font-semibold uppercase tracking-widest text-faint">{eyebrow}</p> : null}
3756
+ <section className={"mx-auto max-w-6xl px-6 py-20 sm:py-24 " + className}>
3757
+ {eyebrow ? <p className="text-sm font-semibold uppercase tracking-widest gradient-text">{eyebrow}</p> : null}
3561
3758
  {title ? <h2 className="mt-3 text-3xl font-bold sm:text-4xl">{title}</h2> : null}
3562
3759
  {lead ? <p className="mt-4 max-w-2xl text-lg text-muted">{lead}</p> : null}
3563
- {children ? <div className="mt-10">{children}</div> : null}
3760
+ {children ? <div className="mt-12">{children}</div> : null}
3564
3761
  </section>
3565
3762
  );
3566
3763
  }
@@ -3568,15 +3765,16 @@ export function Section({ eyebrow, title, lead, children, className = "" }: { ey
3568
3765
  "components/ui/pill.tsx": `import type { ReactNode } from "react";
3569
3766
 
3570
3767
  export function Pill({ children, className = "" }: { children: ReactNode; className?: string }) {
3571
- return <span className={"inline-flex items-center gap-1 rounded-full border border-hairline bg-surface px-3 py-1 text-xs font-semibold uppercase tracking-widest text-muted " + className}>{children}</span>;
3768
+ return <span className={"glass inline-flex items-center gap-1.5 rounded-full px-3.5 py-1.5 text-xs font-semibold uppercase tracking-widest text-muted " + className}><span aria-hidden className="h-1.5 w-1.5 rounded-full gradient-bg" />{children}</span>;
3572
3769
  }
3573
3770
  `,
3574
3771
  "components/ui/stat-card.tsx": `export function StatCard({ label, value, delta }: { label: string; value: string; delta?: string }) {
3772
+ const down = delta?.trim().startsWith("-");
3575
3773
  return (
3576
- <div className="rounded-2xl border border-hairline bg-surface p-6 transition hover:-translate-y-1">
3577
- <div className="text-3xl font-bold tabular-nums">{value}</div>
3774
+ <div className="card p-6">
3775
+ <div className="text-3xl font-bold tabular-nums tracking-tight">{value}</div>
3578
3776
  <div className="mt-1 text-sm text-muted">{label}</div>
3579
- {delta ? <div className="mt-2 text-xs font-medium text-emerald-400">{delta}</div> : null}
3777
+ {delta ? <div className={"mt-3 inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-semibold " + (down ? "bg-red-500/10 text-red-400" : "bg-emerald-500/10 text-emerald-400")}>{down ? "\u25BC" : "\u25B2"} {delta}</div> : null}
3580
3778
  </div>
3581
3779
  );
3582
3780
  }
@@ -3585,20 +3783,24 @@ export function Pill({ children, className = "" }: { children: ReactNode; classN
3585
3783
 
3586
3784
  export function FeatureCard({ icon, title, desc }: { icon?: ReactNode; title: string; desc: string }) {
3587
3785
  return (
3588
- <div className="rounded-2xl border border-hairline bg-surface p-6 transition hover:-translate-y-1 hover:border-[color:var(--accent-to)]">
3589
- {icon ? <div className="mb-4 inline-flex h-12 w-12 items-center justify-center rounded-xl gradient-bg text-2xl">{icon}</div> : null}
3590
- <h3 className="font-semibold">{title}</h3>
3591
- <p className="mt-1 text-sm leading-relaxed text-muted">{desc}</p>
3786
+ <div className="card group p-7">
3787
+ {icon ? <div className="mb-5 inline-flex h-12 w-12 items-center justify-center rounded-2xl gradient-bg text-2xl accent-glow transition group-hover:scale-105">{icon}</div> : null}
3788
+ <h3 className="font-semibold tracking-tight">{title}</h3>
3789
+ <p className="mt-1.5 text-sm leading-relaxed text-muted">{desc}</p>
3592
3790
  </div>
3593
3791
  );
3594
3792
  }
3595
3793
  `,
3596
3794
  "components/ui/testimonial.tsx": `export function Testimonial({ quote, author, role }: { quote: string; author: string; role?: string }) {
3795
+ const initials = author.split(" ").map((x) => x[0]).join("").slice(0, 2).toUpperCase();
3597
3796
  return (
3598
- <figure className="mx-auto max-w-2xl rounded-3xl border border-hairline bg-surface p-8 text-center">
3599
- <div className="text-4xl leading-none gradient-text">&ldquo;</div>
3600
- <blockquote className="mt-2 text-lg font-medium leading-relaxed">{quote}</blockquote>
3601
- <figcaption className="mt-4 text-sm text-muted">\u2014 {author}{role ? ", " + role : ""}</figcaption>
3797
+ <figure className="card flex h-full flex-col p-7">
3798
+ <div aria-hidden className="text-3xl leading-none gradient-text">&ldquo;</div>
3799
+ <blockquote className="mt-1 flex-1 text-[15px] font-medium leading-relaxed text-fg/90">{quote}</blockquote>
3800
+ <figcaption className="mt-6 flex items-center gap-3 border-t border-hairline pt-5">
3801
+ <span className="inline-flex h-10 w-10 items-center justify-center rounded-full gradient-bg text-sm font-bold on-accent">{initials}</span>
3802
+ <span className="text-sm"><span className="block font-semibold text-fg">{author}</span>{role ? <span className="block text-muted">{role}</span> : null}</span>
3803
+ </figcaption>
3602
3804
  </figure>
3603
3805
  );
3604
3806
  }
@@ -3607,10 +3809,10 @@ export function FeatureCard({ icon, title, desc }: { icon?: ReactNode; title: st
3607
3809
  return (
3608
3810
  <ol className="grid gap-6 sm:grid-cols-3">
3609
3811
  {items.map((s, i) => (
3610
- <li key={s.title} className="rounded-2xl border border-hairline bg-surface p-6">
3611
- <div className="mb-3 inline-flex h-8 w-8 items-center justify-center rounded-full gradient-bg text-sm font-bold text-black">{i + 1}</div>
3612
- <h3 className="font-semibold">{s.title}</h3>
3613
- <p className="mt-1 text-sm text-muted">{s.desc}</p>
3812
+ <li key={s.title} className="card p-7">
3813
+ <div className="mb-4 inline-flex h-9 w-9 items-center justify-center rounded-xl gradient-bg text-sm font-bold on-accent">{String(i + 1).padStart(2, "0")}</div>
3814
+ <h3 className="font-semibold tracking-tight">{s.title}</h3>
3815
+ <p className="mt-1.5 text-sm leading-relaxed text-muted">{s.desc}</p>
3614
3816
  </li>
3615
3817
  ))}
3616
3818
  </ol>
@@ -3621,13 +3823,14 @@ export function FeatureCard({ icon, title, desc }: { icon?: ReactNode; title: st
3621
3823
 
3622
3824
  export function CTABand({ title, subtitle, ctaLabel = "Get started", ctaHref = "/contact" }: { title: string; subtitle?: string; ctaLabel?: string; ctaHref?: string }) {
3623
3825
  return (
3624
- <section className="mx-auto max-w-6xl px-6 py-20">
3625
- <div className="relative overflow-hidden rounded-3xl border border-hairline bg-surface p-10 text-center sm:p-16">
3626
- <div aria-hidden className="pointer-events-none absolute -right-16 -top-16 h-56 w-56 rounded-full gradient-bg opacity-40 blur-3xl animate-floaty" />
3627
- <div aria-hidden className="pointer-events-none absolute -bottom-16 -left-16 h-56 w-56 rounded-full gradient-bg opacity-30 blur-3xl animate-floaty-slow" />
3628
- <h2 className="relative text-3xl font-bold sm:text-4xl">{title}</h2>
3629
- {subtitle ? <p className="relative mx-auto mt-3 max-w-xl text-muted">{subtitle}</p> : null}
3630
- <Link href={ctaHref} className="relative mt-8 inline-block rounded-full gradient-bg px-8 py-3 font-semibold text-black transition hover:opacity-90">{ctaLabel}</Link>
3826
+ <section className="mx-auto max-w-6xl px-6 py-24">
3827
+ <div className="relative overflow-hidden rounded-[2rem] border border-hairline bg-surface p-12 text-center shadow-lg sm:p-20">
3828
+ <div aria-hidden className="pointer-events-none absolute -right-16 -top-16 h-64 w-64 rounded-full gradient-bg opacity-30 blur-3xl animate-drift" />
3829
+ <div aria-hidden className="pointer-events-none absolute -bottom-20 -left-16 h-64 w-64 rounded-full gradient-bg opacity-25 blur-3xl animate-drift-slow" />
3830
+ <div aria-hidden className="dot-bg pointer-events-none absolute inset-0 opacity-40" />
3831
+ <h2 className="relative text-3xl font-bold tracking-tight sm:text-5xl">{title}</h2>
3832
+ {subtitle ? <p className="relative mx-auto mt-4 max-w-xl text-lg text-muted">{subtitle}</p> : null}
3833
+ <Link href={ctaHref} className="shimmer relative mt-9 inline-block rounded-full gradient-bg px-8 py-3.5 font-semibold on-accent shadow-lg transition hover:-translate-y-0.5">{ctaLabel}</Link>
3631
3834
  </div>
3632
3835
  </section>
3633
3836
  );
@@ -3689,20 +3892,21 @@ export function Newsletter({ title = "Stay in the loop", subtitle = "Occasional
3689
3892
  const err = state && !state.ok ? (state.errors.email ?? state.errors._form) : undefined;
3690
3893
 
3691
3894
  return (
3692
- <div className="mx-auto max-w-xl rounded-3xl border border-hairline bg-surface p-8 text-center">
3693
- <h2 className="text-2xl font-bold">{title}</h2>
3694
- <p className="mt-2 text-sm text-muted">{subtitle}</p>
3895
+ <div className="gradient-border relative mx-auto max-w-3xl overflow-hidden rounded-[1.75rem] border border-transparent bg-surface p-8 text-center shadow-lg sm:p-12">
3896
+ <div aria-hidden className="pointer-events-none absolute -right-16 -top-16 h-48 w-48 rounded-full gradient-bg opacity-20 blur-3xl" />
3897
+ <h2 className="relative text-2xl font-bold tracking-tight sm:text-3xl">{title}</h2>
3898
+ <p className="relative mx-auto mt-2 max-w-md text-sm text-muted">{subtitle}</p>
3695
3899
  {state?.ok ? (
3696
- <p className="mt-6 rounded-xl border border-hairline bg-app p-4 text-sm">You&rsquo;re subscribed \u2014 thanks! \u2705</p>
3900
+ <p className="relative mx-auto mt-6 max-w-md rounded-xl border border-hairline bg-app p-4 text-sm">You&rsquo;re subscribed \u2014 thanks! \u2705</p>
3697
3901
  ) : (
3698
- <form action={action} className="mt-6 flex flex-col gap-3 sm:flex-row">
3699
- <input name="email" type="email" placeholder="you@example.com" aria-label="Email" className="w-full flex-1 rounded-full border border-hairline bg-app px-5 py-3 outline-none focus:border-[color:var(--accent-to)]" />
3902
+ <form action={action} className="relative mx-auto mt-7 flex max-w-md flex-col gap-3 sm:flex-row">
3903
+ <input name="email" type="email" placeholder="you@example.com" aria-label="Email" className="w-full flex-1 rounded-full border border-hairline bg-app px-5 py-3 outline-none transition focus:border-[color:var(--accent-to)]" />
3700
3904
  <input {...honeypotProps("website")} />
3701
3905
  <input type="hidden" name="_ts" defaultValue={timestampValue()} />
3702
- <button disabled={pending} className="rounded-full gradient-bg px-6 py-3 font-semibold text-black transition hover:opacity-90 disabled:opacity-60">{pending ? "Joining\u2026" : "Subscribe"}</button>
3906
+ <button disabled={pending} className="rounded-full gradient-bg px-6 py-3 font-semibold on-accent transition hover:-translate-y-0.5 disabled:opacity-60">{pending ? "Joining\u2026" : "Subscribe"}</button>
3703
3907
  </form>
3704
3908
  )}
3705
- {err ? <p className="mt-3 text-sm text-red-400">{err}</p> : null}
3909
+ {err ? <p className="relative mt-3 text-sm text-red-400">{err}</p> : null}
3706
3910
  </div>
3707
3911
  );
3708
3912
  }
@@ -3711,7 +3915,7 @@ export function Newsletter({ title = "Stay in the loop", subtitle = "Occasional
3711
3915
 
3712
3916
  const tones = {
3713
3917
  default: "border-hairline bg-surface text-muted",
3714
- accent: "border-transparent gradient-bg text-black",
3918
+ accent: "border-transparent gradient-bg on-accent",
3715
3919
  success: "border-emerald-500/30 bg-emerald-500/10 text-emerald-400",
3716
3920
  warning: "border-amber-500/30 bg-amber-500/10 text-amber-400",
3717
3921
  danger: "border-red-500/30 bg-red-500/10 text-red-400",
@@ -3785,7 +3989,7 @@ export function Tabs({ tabs }: { tabs: { label: string; content: ReactNode }[] }
3785
3989
  <div>
3786
3990
  <div className="inline-flex flex-wrap gap-1 rounded-full border border-hairline bg-surface p-1">
3787
3991
  {tabs.map((t, idx) => (
3788
- <button key={t.label} onClick={() => setI(idx)} className={"rounded-full px-4 py-2 text-sm font-medium transition " + (i === idx ? "gradient-bg text-black" : "text-muted hover:text-fg")}>{t.label}</button>
3992
+ <button key={t.label} onClick={() => setI(idx)} className={"rounded-full px-4 py-2 text-sm font-medium transition " + (i === idx ? "gradient-bg on-accent" : "text-muted hover:text-fg")}>{t.label}</button>
3789
3993
  ))}
3790
3994
  </div>
3791
3995
  <div className="mt-6">{tabs[i]?.content}</div>
@@ -3814,16 +4018,16 @@ interface Tier { name: string; price: string; period?: string; features: string[
3814
4018
 
3815
4019
  export function PricingTable({ tiers }: { tiers: Tier[] }) {
3816
4020
  return (
3817
- <div className="grid gap-6 md:grid-cols-3">
4021
+ <div className="grid items-center gap-6 md:grid-cols-3">
3818
4022
  {tiers.map((t) => (
3819
- <div key={t.name} className={"relative flex flex-col rounded-3xl border p-8 " + (t.featured ? "border-[color:var(--accent-to)] bg-surface shadow-lg" : "border-hairline bg-surface")}>
3820
- {t.featured ? <span className="absolute -top-3 left-8 rounded-full gradient-bg px-3 py-1 text-xs font-bold text-black">Most popular</span> : null}
3821
- <h3 className="font-semibold">{t.name}</h3>
3822
- <div className="mt-3 flex items-end gap-1"><span className="text-4xl font-bold">{t.price}</span>{t.period ? <span className="mb-1 text-sm text-muted">/{t.period}</span> : null}</div>
3823
- <ul className="mt-6 flex-1 space-y-2 text-sm text-muted">
3824
- {t.features.map((f) => <li key={f} className="flex gap-2"><span className="gradient-text">\u2713</span>{f}</li>)}
4023
+ <div key={t.name} className={"relative flex flex-col rounded-[1.5rem] border p-8 transition " + (t.featured ? "gradient-border border-transparent bg-surface shadow-lg md:scale-[1.04]" : "border-hairline bg-surface hover:border-[color:var(--accent-to)]")}>
4024
+ {t.featured ? <span className="absolute -top-3 left-8 rounded-full gradient-bg px-3 py-1 text-xs font-bold on-accent shadow-sm">Most popular</span> : null}
4025
+ <h3 className="font-semibold tracking-tight">{t.name}</h3>
4026
+ <div className="mt-4 flex items-end gap-1"><span className="text-5xl font-bold tracking-tight">{t.price}</span>{t.period ? <span className="mb-1.5 text-sm text-muted">/{t.period}</span> : null}</div>
4027
+ <ul className="mt-7 flex-1 space-y-3 text-sm text-muted">
4028
+ {t.features.map((f) => <li key={f} className="flex gap-2.5"><span className="mt-0.5 gradient-text font-bold">\u2713</span>{f}</li>)}
3825
4029
  </ul>
3826
- <Link href={t.ctaHref ?? "/contact"} className={"mt-8 rounded-full px-6 py-3 text-center font-semibold transition " + (t.featured ? "gradient-bg text-black hover:opacity-90" : "border border-hairline hover:bg-app")}>{t.ctaLabel ?? "Choose " + t.name}</Link>
4030
+ <Link href={t.ctaHref ?? "/contact"} className={"mt-8 rounded-full px-6 py-3 text-center font-semibold transition " + (t.featured ? "shimmer gradient-bg on-accent hover:-translate-y-0.5" : "border border-hairline hover:bg-app")}>{t.ctaLabel ?? "Choose " + t.name}</Link>
3827
4031
  </div>
3828
4032
  ))}
3829
4033
  </div>
@@ -3833,9 +4037,9 @@ export function PricingTable({ tiers }: { tiers: Tier[] }) {
3833
4037
  "components/ui/logo-cloud.tsx": `export function LogoCloud({ names, label }: { names: string[]; label?: string }) {
3834
4038
  return (
3835
4039
  <div className="text-center">
3836
- {label ? <p className="text-sm font-semibold uppercase tracking-widest text-faint">{label}</p> : null}
3837
- <div className="mt-6 flex flex-wrap items-center justify-center gap-x-10 gap-y-4">
3838
- {names.map((n) => <span key={n} className="text-lg font-bold text-muted opacity-70 transition hover:opacity-100">{n}</span>)}
4040
+ {label ? <p className="text-xs font-semibold uppercase tracking-widest text-faint">{label}</p> : null}
4041
+ <div className="mt-7 flex flex-wrap items-center justify-center gap-x-12 gap-y-5">
4042
+ {names.map((n) => <span key={n} className="text-lg font-bold tracking-tight text-muted opacity-60 grayscale transition hover:opacity-100 hover:grayscale-0">{n}</span>)}
3839
4043
  </div>
3840
4044
  </div>
3841
4045
  );
@@ -3843,11 +4047,11 @@ export function PricingTable({ tiers }: { tiers: Tier[] }) {
3843
4047
  `,
3844
4048
  "components/ui/stat-band.tsx": `export function StatBand({ stats }: { stats: { value: string; label: string }[] }) {
3845
4049
  return (
3846
- <div className="grid gap-6 rounded-3xl border border-hairline bg-surface p-8 sm:grid-cols-2 lg:grid-cols-4">
4050
+ <div className="grid gap-px overflow-hidden rounded-[1.5rem] border border-hairline bg-hairline sm:grid-cols-2 lg:grid-cols-4">
3847
4051
  {stats.map((s) => (
3848
- <div key={s.label} className="text-center">
3849
- <div className="gradient-text text-4xl font-bold tabular-nums">{s.value}</div>
3850
- <div className="mt-1 text-sm text-muted">{s.label}</div>
4052
+ <div key={s.label} className="bg-surface px-6 py-10 text-center transition hover:bg-panel">
4053
+ <div className="gradient-text text-4xl font-bold tabular-nums tracking-tight sm:text-5xl">{s.value}</div>
4054
+ <div className="mt-2 text-sm text-muted">{s.label}</div>
3851
4055
  </div>
3852
4056
  ))}
3853
4057
  </div>
@@ -3858,11 +4062,11 @@ export function PricingTable({ tiers }: { tiers: Tier[] }) {
3858
4062
  return (
3859
4063
  <div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
3860
4064
  {members.map((m) => (
3861
- <div key={m.name} className="rounded-2xl border border-hairline bg-surface p-6 text-center transition hover:-translate-y-1">
3862
- <div className="mx-auto flex h-16 w-16 items-center justify-center rounded-full gradient-bg text-xl font-bold text-black">{m.name.split(" ").map((x) => x[0]).join("").slice(0, 2)}</div>
3863
- <h3 className="mt-4 font-semibold">{m.name}</h3>
3864
- <p className="gradient-text text-sm">{m.role}</p>
3865
- {m.bio ? <p className="mt-2 text-sm text-muted">{m.bio}</p> : null}
4065
+ <div key={m.name} className="card p-7 text-center">
4066
+ <div className="mx-auto flex h-16 w-16 items-center justify-center rounded-2xl gradient-bg text-xl font-bold on-accent accent-glow">{m.name.split(" ").map((x) => x[0]).join("").slice(0, 2)}</div>
4067
+ <h3 className="mt-4 font-semibold tracking-tight">{m.name}</h3>
4068
+ <p className="gradient-text text-sm font-medium">{m.role}</p>
4069
+ {m.bio ? <p className="mt-2 text-sm leading-relaxed text-muted">{m.bio}</p> : null}
3866
4070
  </div>
3867
4071
  ))}
3868
4072
  </div>
@@ -3938,7 +4142,7 @@ export function Breadcrumbs({ items }: { items: { label: string; href?: string }
3938
4142
  `,
3939
4143
  "components/ui/avatar.tsx": `export function Avatar({ name, size = 40 }: { name: string; size?: number }) {
3940
4144
  const initials = name.split(" ").map((x) => x[0]).join("").slice(0, 2).toUpperCase();
3941
- return <span className="inline-flex items-center justify-center rounded-full gradient-bg font-bold text-black" style={{ width: size, height: size, fontSize: size * 0.4 }}>{initials}</span>;
4145
+ return <span className="inline-flex items-center justify-center rounded-full gradient-bg font-bold on-accent" style={{ width: size, height: size, fontSize: size * 0.4 }}>{initials}</span>;
3942
4146
  }
3943
4147
 
3944
4148
  export function AvatarGroup({ names }: { names: string[] }) {
@@ -4159,10 +4363,15 @@ function creativeData(ctx) {
4159
4363
  }
4160
4364
  var aurora = () => `export function Aurora() {
4161
4365
  return (
4162
- <div aria-hidden className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-[720px] overflow-hidden">
4163
- <div className="absolute -left-20 -top-16 h-96 w-96 rounded-full opacity-30 blur-3xl animate-floaty" style={{ background: "radial-gradient(circle, var(--accent-from), transparent 70%)" }} />
4164
- <div className="absolute -right-10 top-40 h-80 w-80 rounded-full opacity-25 blur-3xl animate-floaty-slow" style={{ background: "radial-gradient(circle, var(--accent-to), transparent 70%)" }} />
4165
- <div className="absolute left-1/3 top-72 h-72 w-72 rounded-full opacity-20 blur-3xl animate-floaty" style={{ background: "radial-gradient(circle, var(--accent-to), transparent 70%)" }} />
4366
+ <div aria-hidden className="pointer-events-none absolute inset-x-0 top-0 -z-10 h-[820px] overflow-hidden">
4367
+ {/* soft gradient-mesh \u2014 blurred orbs keyed to the accent, drifting slowly */}
4368
+ <div className="absolute -left-32 -top-24 h-[32rem] w-[32rem] rounded-full opacity-25 blur-[90px] animate-drift" style={{ background: "radial-gradient(circle at 50% 50%, var(--accent-from), transparent 68%)" }} />
4369
+ <div className="absolute -right-24 top-24 h-[30rem] w-[30rem] rounded-full opacity-20 blur-[90px] animate-drift-slow" style={{ background: "radial-gradient(circle at 50% 50%, var(--accent-to), transparent 68%)" }} />
4370
+ <div className="absolute left-1/3 top-64 h-96 w-96 rounded-full opacity-[0.14] blur-[80px] animate-floaty" style={{ background: "radial-gradient(circle at 50% 50%, var(--accent-to), transparent 70%)" }} />
4371
+ {/* faint dotted texture, fading out toward the fold */}
4372
+ <div className="dot-bg absolute inset-0 opacity-60" />
4373
+ {/* seam that melts the aurora into the page */}
4374
+ <div className="absolute inset-x-0 bottom-0 h-40 bg-gradient-to-b from-transparent to-[var(--bg)]" />
4166
4375
  </div>
4167
4376
  );
4168
4377
  }
@@ -4173,22 +4382,25 @@ var heroArt = (ctx) => {
4173
4382
  return `export function HeroArt() {
4174
4383
  return (
4175
4384
  <div className="relative mx-auto aspect-square w-full max-w-sm select-none">
4385
+ {/* ambient accent glow behind the whole piece */}
4386
+ <div aria-hidden className="absolute inset-6 rounded-full opacity-30 blur-3xl gradient-bg animate-drift-slow" />
4176
4387
  {/* orbiting rings */}
4177
4388
  <div className="absolute inset-0 rounded-full border border-hairline animate-spin-slow" />
4178
- <div className="absolute inset-10 rounded-full border border-hairline animate-spin-slow" style={{ animationDirection: "reverse" }} />
4179
- <div className="absolute inset-0 rounded-full opacity-40 blur-2xl gradient-bg" />
4389
+ <div className="absolute inset-10 rounded-full border border-dashed border-hairline animate-spin-slow" style={{ animationDirection: "reverse" }} />
4390
+ {/* orbit node */}
4391
+ <div className="absolute left-1/2 top-0 h-2.5 w-2.5 -translate-x-1/2 rounded-full gradient-bg animate-spin-slow" style={{ transformOrigin: "50% 190px" }} />
4180
4392
  {/* center badge with the platform initials */}
4181
- <div className="absolute left-1/2 top-1/2 flex h-28 w-28 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-3xl gradient-bg text-4xl font-black text-black shadow-2xl animate-floaty">
4393
+ <div className="absolute left-1/2 top-1/2 flex h-32 w-32 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-[1.75rem] gradient-bg text-4xl font-black on-accent shadow-lg accent-glow animate-floaty" style={{ animationDuration: "7s" }}>
4182
4394
  ${JSON.stringify(initials)}
4183
4395
  </div>
4184
- {/* floating labels */}
4185
- <div className="absolute left-0 top-10 flex items-center gap-2 rounded-xl border border-hairline bg-app px-3 py-2 text-xs font-medium shadow-lg animate-floaty">
4186
- <span>${d.emoji}</span> ${JSON.stringify(d.chips[0])}
4396
+ {/* floating glass chips */}
4397
+ <div className="glass absolute left-0 top-10 flex items-center gap-2 rounded-2xl px-3.5 py-2 text-xs font-semibold shadow-lg animate-floaty">
4398
+ <span className="text-sm">${d.emoji}</span> ${JSON.stringify(d.chips[0])}
4187
4399
  </div>
4188
- <div className="absolute right-0 top-28 rounded-xl border border-hairline bg-app px-3 py-2 text-xs font-medium shadow-lg animate-floaty-slow">
4189
- ${JSON.stringify(d.chips[1])}
4400
+ <div className="glass absolute right-0 top-28 flex items-center gap-1.5 rounded-2xl px-3.5 py-2 text-xs font-semibold shadow-lg animate-floaty-slow">
4401
+ <span className="h-1.5 w-1.5 rounded-full gradient-bg" /> ${JSON.stringify(d.chips[1])}
4190
4402
  </div>
4191
- <div className="absolute bottom-8 left-6 rounded-xl border border-hairline bg-app px-3 py-2 text-xs font-medium shadow-lg animate-floaty" style={{ animationDelay: "1.2s" }}>
4403
+ <div className="glass absolute bottom-8 left-6 rounded-2xl px-3.5 py-2 text-xs font-semibold shadow-lg animate-floaty" style={{ animationDelay: "1.2s" }}>
4192
4404
  ${JSON.stringify(d.chips[2])}
4193
4405
  </div>
4194
4406
  </div>
@@ -4270,30 +4482,29 @@ var extraHomeSections = (ctx) => {
4270
4482
  const r = richContent(ctx);
4271
4483
  const tst = r.testimonials.map((t) => `<Testimonial quote={${JSON.stringify(t.quote)}} author={${JSON.stringify(t.author)}} role={${JSON.stringify(t.role ?? "")}} />`).join("\n ");
4272
4484
  return `<section className="mx-auto max-w-6xl px-6 py-16">
4273
- <p className="text-center text-sm font-semibold uppercase tracking-widest text-faint">By the numbers</p>
4274
- <div className="mt-8"><StatBand stats={${JSON.stringify(r.stats)}} /></div>
4485
+ <div className="mb-10 text-center"><p className="text-sm font-semibold uppercase tracking-widest gradient-text">By the numbers</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">Built to perform</h2></div>
4486
+ <StatBand stats={${JSON.stringify(r.stats)}} />
4275
4487
  </section>
4276
4488
  <section className="mx-auto max-w-6xl px-6 py-16">
4277
- <h2 className="text-center text-3xl font-bold sm:text-4xl">How it works</h2>
4278
- <p className="mx-auto mt-3 max-w-xl text-center text-muted">A simple, proven path from first hello to launch day.</p>
4279
- <div className="mt-10"><Steps items={${JSON.stringify(r.process)}} /></div>
4489
+ <div className="mb-12 text-center"><p className="text-sm font-semibold uppercase tracking-widest gradient-text">How it works</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">A simple, proven path</h2><p className="mx-auto mt-3 max-w-xl text-muted">From first hello to launch day \u2014 no surprises.</p></div>
4490
+ <Steps items={${JSON.stringify(r.process)}} />
4280
4491
  </section>
4281
4492
  <section className="mx-auto max-w-6xl px-6 py-16">
4282
- <h2 className="text-center text-3xl font-bold sm:text-4xl">Loved by teams</h2>
4283
- <div className="mt-10 grid gap-6 md:grid-cols-3">
4493
+ <div className="mb-12 text-center"><p className="text-sm font-semibold uppercase tracking-widest gradient-text">Loved by teams</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">Don't just take our word for it</h2></div>
4494
+ <div className="grid items-stretch gap-6 md:grid-cols-3">
4284
4495
  ${tst}
4285
4496
  </div>
4286
4497
  </section>`;
4287
4498
  };
4288
4499
  var showcaseSection = (ctx) => {
4289
4500
  const d = creativeData(ctx);
4290
- const bullets = d.bullets.map((b) => `<li className="flex items-center gap-2 text-muted"><span className="text-[color:var(--accent-to)]">\u2713</span> ${b}</li>`).join("\n ");
4291
- return `<section className="mx-auto grid max-w-6xl items-center gap-12 px-6 py-20 md:grid-cols-2">
4501
+ const bullets = d.bullets.map((b) => `<li className="flex items-center gap-3 text-muted"><span className="inline-flex h-5 w-5 shrink-0 items-center justify-center rounded-full gradient-bg text-[11px] on-accent">\u2713</span> ${b}</li>`).join("\n ");
4502
+ return `<section className="mx-auto grid max-w-6xl items-center gap-12 px-6 py-24 md:grid-cols-2">
4292
4503
  <div>
4293
- <p className="text-sm font-semibold uppercase tracking-widest text-faint">${ctx.template.siteName}</p>
4504
+ <p className="text-sm font-semibold uppercase tracking-widest gradient-text">${ctx.template.siteName}</p>
4294
4505
  <h2 className="mt-3 text-3xl font-bold sm:text-4xl">${d.showcaseTitle}</h2>
4295
4506
  <p className="mt-4 max-w-md text-lg text-muted">${d.showcaseLead}</p>
4296
- <ul className="mt-6 space-y-3 text-sm">
4507
+ <ul className="mt-7 space-y-3.5 text-sm font-medium">
4297
4508
  ${bullets}
4298
4509
  </ul>
4299
4510
  </div>
@@ -4302,10 +4513,10 @@ var showcaseSection = (ctx) => {
4302
4513
  };
4303
4514
  var marqueeSection = (ctx) => {
4304
4515
  const d = creativeData(ctx);
4305
- const chip = (t) => `<span className="rounded-full border border-hairline bg-surface px-5 py-2 text-sm font-medium text-muted">${t}</span>`;
4516
+ const chip = (t) => `<span className="whitespace-nowrap rounded-full border border-hairline bg-surface px-5 py-2 text-sm font-semibold text-muted">${t}</span>`;
4306
4517
  const track = d.marquee.map(chip).join("\n ");
4307
- return `<section className="border-y border-hairline py-10">
4308
- <p className="mb-6 text-center text-xs font-semibold uppercase tracking-widest text-faint">${d.marqueeLabel}</p>
4518
+ return `<section className="py-14">
4519
+ <p className="mb-8 text-center text-xs font-semibold uppercase tracking-widest text-faint">${d.marqueeLabel}</p>
4309
4520
  <div className="marquee-mask overflow-hidden">
4310
4521
  <div className="marquee-track gap-4">
4311
4522
  ${track}
@@ -4316,16 +4527,16 @@ var marqueeSection = (ctx) => {
4316
4527
  };
4317
4528
  var faqSection = (ctx) => {
4318
4529
  const d = creativeData(ctx);
4319
- const items = d.faq.map((f) => `<details className="group rounded-2xl border border-hairline bg-surface p-5">
4320
- <summary className="flex cursor-pointer list-none items-center justify-between gap-4 font-medium">
4530
+ const items = d.faq.map((f) => `<details className="group rounded-2xl border border-hairline bg-surface p-5 transition hover:border-[color:var(--accent-to)]">
4531
+ <summary className="flex cursor-pointer list-none items-center justify-between gap-4 font-semibold">
4321
4532
  ${f.q}
4322
- <span className="text-muted transition group-open:rotate-45">+</span>
4533
+ <span className="text-lg text-muted transition group-open:rotate-45">+</span>
4323
4534
  </summary>
4324
4535
  <p className="mt-3 text-sm leading-relaxed text-muted">${f.a}</p>
4325
4536
  </details>`).join("\n ");
4326
- return `<section className="mx-auto max-w-3xl px-6 py-20">
4327
- <h2 className="text-center text-3xl font-bold">Frequently asked</h2>
4328
- <div className="mt-10 space-y-3">
4537
+ return `<section className="mx-auto max-w-3xl px-6 py-24">
4538
+ <div className="mb-10 text-center"><p className="text-sm font-semibold uppercase tracking-widest gradient-text">FAQ</p><h2 className="mt-3 text-3xl font-bold sm:text-4xl">Frequently asked</h2></div>
4539
+ <div className="space-y-3">
4329
4540
  ${items}
4330
4541
  </div>
4331
4542
  </section>`;
@@ -4460,13 +4671,13 @@ import { Pill } from "@/components/ui";
4460
4671
 
4461
4672
  export function HeroSection() {
4462
4673
  return (
4463
- <section className="mx-auto max-w-4xl px-6 py-28 text-center">
4674
+ <section className="mx-auto max-w-4xl px-6 py-32 text-center">
4464
4675
  <Pill>New</Pill>
4465
- <h1 className="mt-5 text-5xl font-bold sm:text-6xl">Build something <span className="gradient-text">people love</span></h1>
4466
- <p className="mx-auto mt-5 max-w-xl text-lg text-muted">A confident headline and one sentence that sells the outcome \u2014 edit me.</p>
4467
- <div className="mt-8 flex flex-wrap justify-center gap-3">
4468
- <Link href="/contact" className="rounded-full gradient-bg px-7 py-3 font-semibold text-black transition hover:opacity-90">Get started</Link>
4469
- <Link href="/about" className="rounded-full border border-hairline px-7 py-3 font-semibold transition hover:bg-surface">Learn more</Link>
4676
+ <h1 className="text-display mt-6">Build something <span className="gradient-text">people love</span></h1>
4677
+ <p className="lead mx-auto mt-6 max-w-xl">A confident headline and one sentence that sells the outcome \u2014 edit me.</p>
4678
+ <div className="mt-9 flex flex-wrap justify-center gap-3">
4679
+ <Link href="/contact" className="shimmer rounded-full gradient-bg px-7 py-3.5 font-semibold on-accent transition hover:-translate-y-0.5">Get started</Link>
4680
+ <Link href="/about" className="rounded-full border border-hairline px-7 py-3.5 font-semibold transition hover:bg-surface">Learn more</Link>
4470
4681
  </div>
4471
4682
  </section>
4472
4683
  );
@@ -4628,6 +4839,53 @@ export function BentoSection() {
4628
4839
  </Section>
4629
4840
  );
4630
4841
  }
4842
+ `,
4843
+ steps: `import { Section, Steps } from "@/components/ui";
4844
+
4845
+ export function StepsSection() {
4846
+ return (
4847
+ <Section eyebrow="How it works" title="Up and running in three steps">
4848
+ <Steps items={[
4849
+ { title: "Create your account", desc: "Sign up free in seconds \u2014 no credit card required." },
4850
+ { title: "Connect your data", desc: "Import in one click or use the API. Your call." },
4851
+ { title: "Ship something great", desc: "Go live and watch it work, from day one." },
4852
+ ]} />
4853
+ </Section>
4854
+ );
4855
+ }
4856
+ `,
4857
+ "feature-split": `import { Section, FeatureSplit } from "@/components/ui";
4858
+
4859
+ export function FeatureSplitSection() {
4860
+ return (
4861
+ <Section eyebrow="Why teams switch" title="Built for the way you actually work">
4862
+ <FeatureSplit
4863
+ eyebrow="Focus"
4864
+ title="Less busywork, more momentum"
4865
+ desc="Everything in one place, so your team spends time on the work that matters \u2014 not on wiring tools together."
4866
+ bullets={["Set up in minutes, not weeks", "Real-time, always in sync", "Scales from one to a thousand"]}
4867
+ media={<div className="grid h-52 place-items-center text-7xl">\u{1F680}</div>}
4868
+ />
4869
+ </Section>
4870
+ );
4871
+ }
4872
+ `,
4873
+ banner: `import Link from "next/link";
4874
+
4875
+ export function BannerSection() {
4876
+ return (
4877
+ <section className="mx-auto max-w-6xl px-6 py-12">
4878
+ <div className="relative flex flex-col items-center gap-6 overflow-hidden rounded-[1.75rem] gradient-bg px-8 py-10 text-center on-accent shadow-lg sm:flex-row sm:justify-between sm:text-left">
4879
+ <div aria-hidden className="dot-bg pointer-events-none absolute inset-0 opacity-20" />
4880
+ <div className="relative">
4881
+ <h2 className="text-2xl font-bold tracking-tight sm:text-3xl">Ready to see it in action?</h2>
4882
+ <p className="mt-1.5 text-sm opacity-80">Start free today \u2014 it takes less than a minute.</p>
4883
+ </div>
4884
+ <Link href="/contact" className="relative shrink-0 rounded-full bg-[var(--bg)] px-7 py-3 font-semibold text-fg transition hover:-translate-y-0.5">Get started</Link>
4885
+ </div>
4886
+ </section>
4887
+ );
4888
+ }
4631
4889
  `
4632
4890
  };
4633
4891
  function ensureUiKit(root) {