@kuckit/landing-module 1.0.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/client/index.d.ts +16 -0
- package/dist/client/index.js +1548 -0
- package/dist/client/index.js.map +1 -0
- package/dist/server/module.d.ts +8 -0
- package/dist/server/module.js +116 -0
- package/dist/server/module.js.map +1 -0
- package/package.json +66 -0
- package/src/server/module.ts +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["colorMap: Record<string, { bg: string; border: string; text: string }>","colorMap: Record<string, { bg: string; border: string; text: string; glow: string }>","faqItems: FAQItem[]"],"sources":["../../src/client/components/hero.tsx","../../src/client/components/value-props.tsx","../../src/client/components/code-quality.tsx","../../src/client/components/module-showcase.tsx","../../src/client/components/how-it-works.tsx","../../src/client/components/architecture-preview.tsx","../../src/client/components/cli-demo.tsx","../../src/client/components/faq.tsx","../../src/client/components/WaitlistForm.tsx","../../src/client/components/cta-section.tsx","../../src/client/components/LandingPage.tsx","../../src/client/index.ts"],"sourcesContent":["import { useState } from 'react'\n\nexport function Hero() {\n\tconst [copied, setCopied] = useState(false)\n\n\tconst copyCommand = () => {\n\t\tnavigator.clipboard.writeText('bunx create-kuckit-app my-app')\n\t\tsetCopied(true)\n\t\tsetTimeout(() => setCopied(false), 2000)\n\t}\n\n\treturn (\n\t\t<section className=\"relative min-h-[90vh] flex flex-col items-center justify-center px-6 pt-20\">\n\t\t\t{/* Floating module blocks - decorative */}\n\t\t\t<div className=\"absolute inset-0 overflow-hidden pointer-events-none\">\n\t\t\t\t<ModuleBlock className=\"absolute top-[15%] left-[10%] animate-float\" label=\"auth\" />\n\t\t\t\t<ModuleBlock\n\t\t\t\t\tclassName=\"absolute top-[25%] right-[15%] animate-float-delayed\"\n\t\t\t\t\tlabel=\"billing\"\n\t\t\t\t/>\n\t\t\t\t<ModuleBlock\n\t\t\t\t\tclassName=\"absolute bottom-[30%] left-[8%] animate-float-slow\"\n\t\t\t\t\tlabel=\"analytics\"\n\t\t\t\t/>\n\t\t\t\t<ModuleBlock className=\"absolute bottom-[20%] right-[10%] animate-float\" label=\"email\" />\n\t\t\t\t<ModuleBlock\n\t\t\t\t\tclassName=\"absolute top-[40%] left-[20%] animate-float-delayed opacity-50\"\n\t\t\t\t\tlabel=\"storage\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t/>\n\t\t\t\t<ModuleBlock\n\t\t\t\t\tclassName=\"absolute bottom-[40%] right-[20%] animate-float-slow opacity-50\"\n\t\t\t\t\tlabel=\"ai\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"relative z-10 max-w-4xl mx-auto text-center\">\n\t\t\t\t{/* Badge */}\n\t\t\t\t<div className=\"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/5 border border-white/10 text-sm text-white/70 mb-8 backdrop-blur-sm\">\n\t\t\t\t\t<span className=\"w-2 h-2 rounded-full bg-emerald-400 animate-pulse\" />\n\t\t\t\t\t<span>Marketplace coming soon</span>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Main headline */}\n\t\t\t\t<h1 className=\"text-5xl md:text-7xl font-bold tracking-tight mb-6\">\n\t\t\t\t\t<span className=\"block text-white\">Build Modules.</span>\n\t\t\t\t\t<span className=\"block bg-gradient-to-r from-emerald-400 via-teal-400 to-cyan-400 bg-clip-text text-transparent\">\n\t\t\t\t\t\tEarn Revenue.\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"block text-white\">Ship Faster.</span>\n\t\t\t\t</h1>\n\n\t\t\t\t{/* Subheadline */}\n\t\t\t\t<p className=\"text-xl md:text-2xl text-white/60 max-w-2xl mx-auto mb-12 leading-relaxed\">\n\t\t\t\t\tThe TypeScript ecosystem where developers build once and sell forever, while builders ship\n\t\t\t\t\tin hours instead of months.\n\t\t\t\t</p>\n\n\t\t\t\t{/* CTAs */}\n\t\t\t\t<div className=\"flex flex-col sm:flex-row items-center justify-center gap-4 mb-12\">\n\t\t\t\t\t<button className=\"group relative px-8 py-4 bg-gradient-to-r from-emerald-500 to-teal-500 rounded-xl font-semibold text-black transition-all hover:scale-105 hover:shadow-lg hover:shadow-emerald-500/25\">\n\t\t\t\t\t\tGet Started\n\t\t\t\t\t\t<span className=\"absolute inset-0 rounded-xl bg-gradient-to-r from-emerald-400 to-teal-400 opacity-0 group-hover:opacity-100 transition-opacity blur-xl -z-10\" />\n\t\t\t\t\t</button>\n\t\t\t\t\t<button className=\"px-8 py-4 rounded-xl font-semibold text-white border border-white/20 bg-white/5 backdrop-blur-sm hover:bg-white/10 hover:border-white/30 transition-all\">\n\t\t\t\t\t\tJoin Marketplace Waitlist\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Quick start command */}\n\t\t\t\t<div\n\t\t\t\t\tonClick={copyCommand}\n\t\t\t\t\tclassName=\"inline-flex items-center gap-3 px-5 py-3 rounded-xl bg-black/50 border border-white/10 cursor-pointer hover:border-emerald-500/50 transition-colors group\"\n\t\t\t\t>\n\t\t\t\t\t<span className=\"text-emerald-400 font-mono\">$</span>\n\t\t\t\t\t<code className=\"text-white/80 font-mono text-sm\">bunx create-kuckit-app my-app</code>\n\t\t\t\t\t<span className=\"text-white/40 group-hover:text-emerald-400 transition-colors\">\n\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t<svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\td=\"M5 13l4 4L19 7\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\td=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Scroll indicator */}\n\t\t\t<div className=\"absolute bottom-8 left-1/2 -translate-x-1/2 animate-bounce\">\n\t\t\t\t<svg\n\t\t\t\t\tclassName=\"w-6 h-6 text-white/30\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\td=\"M19 14l-7 7m0 0l-7-7m7 7V3\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</div>\n\n\t\t\t<style>{`\n\t\t\t\t@keyframes float {\n\t\t\t\t\t0%, 100% { transform: translateY(0px) rotate(0deg); }\n\t\t\t\t\t50% { transform: translateY(-20px) rotate(3deg); }\n\t\t\t\t}\n\t\t\t\t@keyframes float-delayed {\n\t\t\t\t\t0%, 100% { transform: translateY(0px) rotate(0deg); }\n\t\t\t\t\t50% { transform: translateY(-15px) rotate(-2deg); }\n\t\t\t\t}\n\t\t\t\t@keyframes float-slow {\n\t\t\t\t\t0%, 100% { transform: translateY(0px) rotate(0deg); }\n\t\t\t\t\t50% { transform: translateY(-10px) rotate(1deg); }\n\t\t\t\t}\n\t\t\t\t.animate-float { animation: float 6s ease-in-out infinite; }\n\t\t\t\t.animate-float-delayed { animation: float-delayed 7s ease-in-out infinite; animation-delay: 1s; }\n\t\t\t\t.animate-float-slow { animation: float-slow 8s ease-in-out infinite; animation-delay: 2s; }\n\t\t\t`}</style>\n\t\t</section>\n\t)\n}\n\nfunction ModuleBlock({\n\tclassName = '',\n\tlabel,\n\tsize = 'md',\n}: {\n\tclassName?: string\n\tlabel: string\n\tsize?: 'sm' | 'md'\n}) {\n\tconst sizeClasses = size === 'sm' ? 'w-16 h-16 text-[10px]' : 'w-24 h-24 text-xs'\n\n\treturn (\n\t\t<div className={`${sizeClasses} ${className}`}>\n\t\t\t<div className=\"w-full h-full rounded-2xl bg-gradient-to-br from-white/10 to-white/5 border border-white/10 backdrop-blur-sm flex items-center justify-center\">\n\t\t\t\t<span className=\"font-mono text-white/50\">{label}</span>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","export function ValueProps() {\n\tconst columns = [\n\t\t{\n\t\t\ttitle: 'For Builders',\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M13 10V3L4 14h7v7l9-11h-7z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tcolor: 'emerald',\n\t\t\titems: [\n\t\t\t\t{ label: 'Ship in hours', desc: 'Not weeks or months' },\n\t\t\t\t{ label: 'One command install', desc: 'kuckit add @vendor/module' },\n\t\t\t\t{ label: 'Focus on your product', desc: 'Not boilerplate' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\ttitle: 'For Sellers',\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tcolor: 'teal',\n\t\t\titems: [\n\t\t\t\t{ label: 'Build once, sell forever', desc: 'Passive revenue stream' },\n\t\t\t\t{ label: 'Growing marketplace', desc: 'Reach thousands of builders' },\n\t\t\t\t{ label: 'Your code, your pricing', desc: 'Set your own terms' },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\ttitle: 'For Everyone',\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tcolor: 'cyan',\n\t\t\titems: [\n\t\t\t\t{ label: 'Battle-tested code', desc: 'Community validated' },\n\t\t\t\t{ label: 'Guardrailed quality', desc: 'Enforced standards' },\n\t\t\t\t{ label: 'Type-safe modules', desc: 'End-to-end TypeScript' },\n\t\t\t],\n\t\t},\n\t]\n\n\tconst colorMap = {\n\t\temerald: {\n\t\t\tbg: 'bg-emerald-500/10',\n\t\t\tborder: 'border-emerald-500/20',\n\t\t\ttext: 'text-emerald-400',\n\t\t\tglow: 'group-hover:shadow-emerald-500/10',\n\t\t},\n\t\tteal: {\n\t\t\tbg: 'bg-teal-500/10',\n\t\t\tborder: 'border-teal-500/20',\n\t\t\ttext: 'text-teal-400',\n\t\t\tglow: 'group-hover:shadow-teal-500/10',\n\t\t},\n\t\tcyan: {\n\t\t\tbg: 'bg-cyan-500/10',\n\t\t\tborder: 'border-cyan-500/20',\n\t\t\ttext: 'text-cyan-400',\n\t\t\tglow: 'group-hover:shadow-cyan-500/10',\n\t\t},\n\t}\n\n\treturn (\n\t\t<section className=\"py-24 px-6\">\n\t\t\t<div className=\"max-w-6xl mx-auto\">\n\t\t\t\t<div className=\"grid md:grid-cols-3 gap-6\">\n\t\t\t\t\t{columns.map((col) => {\n\t\t\t\t\t\tconst colors = colorMap[col.color as keyof typeof colorMap]\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={col.title}\n\t\t\t\t\t\t\t\tclassName={`group relative rounded-2xl border ${colors.border} bg-white/[0.02] p-8 hover:bg-white/[0.04] transition-all hover:shadow-xl ${colors.glow}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* Header */}\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-3 mb-8\">\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={`w-12 h-12 rounded-xl ${colors.bg} ${colors.text} flex items-center justify-center`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{col.icon}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<h3 className=\"text-xl font-semibold text-white\">{col.title}</h3>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{/* Items */}\n\t\t\t\t\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t\t\t\t\t{col.items.map((item) => (\n\t\t\t\t\t\t\t\t\t\t<div key={item.label}>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-white font-medium mb-1\">{item.label}</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-white/50 text-sm\">{item.desc}</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n","export function CodeQuality() {\n\tconst features = [\n\t\t{\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\ttitle: 'AGENTS.md in Every Package',\n\t\t\tdesc: 'AI and humans follow the same rules. Clear instructions ensure consistent, maintainable code.',\n\t\t},\n\t\t{\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\ttitle: 'Pre-commit Hooks',\n\t\t\tdesc: \"Bad code can't even be committed. Husky runs checks before every commit.\",\n\t\t},\n\t\t{\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\ttitle: 'CI/CD Validation',\n\t\t\tdesc: 'Nothing merges without passing architecture checks. Every PR is verified.',\n\t\t},\n\t\t{\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\ttitle: 'Clean Architecture Layers',\n\t\t\tdesc: 'Domain, Application, Infrastructure stay separated. Always.',\n\t\t},\n\t]\n\n\treturn (\n\t\t<section className=\"py-24 px-6 relative overflow-hidden\">\n\t\t\t{/* Background accent */}\n\t\t\t<div className=\"absolute inset-0 bg-gradient-to-b from-emerald-500/5 via-transparent to-transparent pointer-events-none\" />\n\n\t\t\t<div className=\"max-w-6xl mx-auto relative\">\n\t\t\t\t{/* Section header */}\n\t\t\t\t<div className=\"max-w-2xl mb-16\">\n\t\t\t\t\t<div className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-emerald-500/10 border border-emerald-500/20 text-xs text-emerald-400 font-medium mb-6\">\n\t\t\t\t\t\t<svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\td=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\tQuality Guaranteed\n\t\t\t\t\t</div>\n\t\t\t\t\t<h2 className=\"text-4xl md:text-5xl font-bold text-white mb-6\">Code That Stays Clean</h2>\n\t\t\t\t\t<p className=\"text-xl text-white/60 leading-relaxed\">\n\t\t\t\t\t\tCodebases rot. AI generates spaghetti. Developers cut corners.\n\t\t\t\t\t\t<span className=\"text-white\"> Kuckit enforces structure automatically.</span>\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Two column layout */}\n\t\t\t\t<div className=\"grid lg:grid-cols-2 gap-12 items-center\">\n\t\t\t\t\t{/* Features list */}\n\t\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t\t{features.map((feature) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={feature.title}\n\t\t\t\t\t\t\t\tclassName=\"group flex gap-4 p-4 rounded-xl hover:bg-white/[0.03] transition-colors\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"w-10 h-10 rounded-lg bg-emerald-500/10 border border-emerald-500/20 flex items-center justify-center text-emerald-400 shrink-0 group-hover:scale-110 transition-transform\">\n\t\t\t\t\t\t\t\t\t{feature.icon}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<h3 className=\"text-white font-semibold mb-1\">{feature.title}</h3>\n\t\t\t\t\t\t\t\t\t<p className=\"text-white/50 text-sm leading-relaxed\">{feature.desc}</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Visual comparison */}\n\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t{/* Shield graphic */}\n\t\t\t\t\t\t<div className=\"relative aspect-square max-w-md mx-auto\">\n\t\t\t\t\t\t\t{/* Outer glow */}\n\t\t\t\t\t\t\t<div className=\"absolute inset-0 bg-gradient-to-br from-emerald-500/20 to-teal-500/20 rounded-3xl blur-2xl\" />\n\n\t\t\t\t\t\t\t{/* Shield container */}\n\t\t\t\t\t\t\t<div className=\"relative h-full rounded-3xl border border-white/10 bg-black/50 backdrop-blur-sm p-8 flex flex-col items-center justify-center\">\n\t\t\t\t\t\t\t\t{/* Shield icon */}\n\t\t\t\t\t\t\t\t<div className=\"w-24 h-24 mb-6 relative\">\n\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-full h-full text-emerald-400\"\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\t\t\t\t\t\t\td=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 bg-emerald-400/20 rounded-full blur-xl\" />\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{/* Stats */}\n\t\t\t\t\t\t\t\t<div className=\"text-center mb-6\">\n\t\t\t\t\t\t\t\t\t<div className=\"text-3xl font-bold text-white mb-1\">100%</div>\n\t\t\t\t\t\t\t\t\t<div className=\"text-white/50 text-sm\">Architecture Compliance</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{/* Blocked items */}\n\t\t\t\t\t\t\t\t<div className=\"w-full space-y-2\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-red-500/10 border border-red-500/20\">\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-4 h-4 text-red-400\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M6 18L18 6M6 6l12 12\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-red-400/80 font-mono\">Circular dependencies</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-red-500/10 border border-red-500/20\">\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-4 h-4 text-red-400\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M6 18L18 6M6 6l12 12\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-red-400/80 font-mono\">Layer violations</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-red-500/10 border border-red-500/20\">\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-4 h-4 text-red-400\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M6 18L18 6M6 6l12 12\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-red-400/80 font-mono\">Untyped exports</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n","export function ModuleShowcase() {\n\tconst modules = [\n\t\t{\n\t\t\tname: 'Auth',\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tdesc: 'OAuth, MFA, sessions',\n\t\t\tcolor: 'emerald',\n\t\t},\n\t\t{\n\t\t\tname: 'Billing',\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tdesc: 'Stripe, subscriptions',\n\t\t\tcolor: 'teal',\n\t\t},\n\t\t{\n\t\t\tname: 'Analytics',\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tdesc: 'Events, dashboards',\n\t\t\tcolor: 'cyan',\n\t\t},\n\t\t{\n\t\t\tname: 'Email',\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tdesc: 'Transactional, templates',\n\t\t\tcolor: 'violet',\n\t\t},\n\t\t{\n\t\t\tname: 'Storage',\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tdesc: 'S3, uploads, CDN',\n\t\t\tcolor: 'amber',\n\t\t},\n\t\t{\n\t\t\tname: 'AI',\n\t\t\ticon: (\n\t\t\t\t<svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path\n\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth={1.5}\n\t\t\t\t\t\td=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t),\n\t\t\tdesc: 'Chat, embeddings',\n\t\t\tcolor: 'pink',\n\t\t},\n\t]\n\n\tconst colorMap: Record<string, { bg: string; border: string; text: string }> = {\n\t\temerald: { bg: 'bg-emerald-500/10', border: 'border-emerald-500/30', text: 'text-emerald-400' },\n\t\tteal: { bg: 'bg-teal-500/10', border: 'border-teal-500/30', text: 'text-teal-400' },\n\t\tcyan: { bg: 'bg-cyan-500/10', border: 'border-cyan-500/30', text: 'text-cyan-400' },\n\t\tviolet: { bg: 'bg-violet-500/10', border: 'border-violet-500/30', text: 'text-violet-400' },\n\t\tamber: { bg: 'bg-amber-500/10', border: 'border-amber-500/30', text: 'text-amber-400' },\n\t\tpink: { bg: 'bg-pink-500/10', border: 'border-pink-500/30', text: 'text-pink-400' },\n\t}\n\n\treturn (\n\t\t<section className=\"py-24 px-6\">\n\t\t\t<div className=\"max-w-6xl mx-auto\">\n\t\t\t\t{/* Section header */}\n\t\t\t\t<div className=\"text-center mb-16\">\n\t\t\t\t\t<h2 className=\"text-4xl md:text-5xl font-bold text-white mb-6\">Modules for Everything</h2>\n\t\t\t\t\t<p className=\"text-xl text-white/60 max-w-2xl mx-auto\">\n\t\t\t\t\t\tSkip weeks of development. Install battle-tested modules and focus on what makes your\n\t\t\t\t\t\tproduct unique.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Module grid */}\n\t\t\t\t<div className=\"grid grid-cols-2 md:grid-cols-3 gap-4\">\n\t\t\t\t\t{modules.map((mod) => {\n\t\t\t\t\t\tconst colors = colorMap[mod.color]\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={mod.name}\n\t\t\t\t\t\t\t\tclassName=\"group relative rounded-2xl border border-white/10 bg-white/[0.02] p-6 hover:border-white/20 hover:bg-white/[0.04] transition-all cursor-pointer\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{/* Coming soon badge */}\n\t\t\t\t\t\t\t\t<div className=\"absolute top-3 right-3 px-2 py-0.5 rounded text-[10px] font-medium bg-white/10 text-white/50\">\n\t\t\t\t\t\t\t\t\tSoon\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{/* Icon */}\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={`w-12 h-12 rounded-xl ${colors.bg} ${colors.text} flex items-center justify-center mb-4 group-hover:scale-110 transition-transform`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{mod.icon}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{/* Content */}\n\t\t\t\t\t\t\t\t<h3 className=\"text-lg font-semibold text-white mb-1\">{mod.name}</h3>\n\t\t\t\t\t\t\t\t<p className=\"text-sm text-white/50\">{mod.desc}</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\n\t\t\t\t{/* CTA */}\n\t\t\t\t<div className=\"mt-12 text-center\">\n\t\t\t\t\t<button className=\"inline-flex items-center gap-2 px-6 py-3 rounded-xl border border-white/20 text-white/80 hover:bg-white/5 hover:border-white/30 transition-all\">\n\t\t\t\t\t\t<span>Join waitlist for marketplace access</span>\n\t\t\t\t\t\t<svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\td=\"M17 8l4 4m0 0l-4 4m4-4H3\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n","import { useState } from 'react'\n\nexport function HowItWorks() {\n\tconst [activeTab, setActiveTab] = useState<'builders' | 'sellers'>('builders')\n\n\tconst builderSteps = [\n\t\t{\n\t\t\tstep: '01',\n\t\t\tcommand: 'bunx create-kuckit-app my-app',\n\t\t\ttitle: 'Scaffold your app',\n\t\t\tdesc: 'Get a production-ready TypeScript app with Clean Architecture baked in.',\n\t\t},\n\t\t{\n\t\t\tstep: '02',\n\t\t\tcommand: 'kuckit add @vendor/billing',\n\t\t\ttitle: 'Install modules',\n\t\t\tdesc: 'One command adds both server and client code, wired and ready.',\n\t\t},\n\t\t{\n\t\t\tstep: '03',\n\t\t\tcommand: 'bun run dev',\n\t\t\ttitle: 'Ship it',\n\t\t\tdesc: 'Your app is ready. Maintainable, type-safe, and battle-tested.',\n\t\t},\n\t]\n\n\tconst sellerSteps = [\n\t\t{\n\t\t\tstep: '01',\n\t\t\tcommand: 'kuckit generate module billing',\n\t\t\ttitle: 'Scaffold with AGENTS.md',\n\t\t\tdesc: 'Generated structure includes documentation for AI and human developers.',\n\t\t},\n\t\t{\n\t\t\tstep: '02',\n\t\t\tcommand: 'git commit && git push',\n\t\t\ttitle: 'Build & test',\n\t\t\tdesc: 'Guardrails ensure your module meets quality standards before it ships.',\n\t\t},\n\t\t{\n\t\t\tstep: '03',\n\t\t\tcommand: 'kuckit publish',\n\t\t\ttitle: 'Earn revenue',\n\t\t\tdesc: 'Set your price, publish to the marketplace, and start earning.',\n\t\t},\n\t]\n\n\tconst steps = activeTab === 'builders' ? builderSteps : sellerSteps\n\n\treturn (\n\t\t<section className=\"py-24 px-6 relative\">\n\t\t\t{/* Background */}\n\t\t\t<div className=\"absolute inset-0 bg-gradient-to-b from-transparent via-teal-500/5 to-transparent pointer-events-none\" />\n\n\t\t\t<div className=\"max-w-5xl mx-auto relative\">\n\t\t\t\t{/* Section header */}\n\t\t\t\t<div className=\"text-center mb-12\">\n\t\t\t\t\t<h2 className=\"text-4xl md:text-5xl font-bold text-white mb-6\">How It Works</h2>\n\t\t\t\t\t<p className=\"text-xl text-white/60\">Three steps to shipping or selling.</p>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Tab switcher */}\n\t\t\t\t<div className=\"flex justify-center mb-12\">\n\t\t\t\t\t<div className=\"inline-flex rounded-xl bg-white/5 p-1\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={() => setActiveTab('builders')}\n\t\t\t\t\t\t\tclassName={`px-6 py-2.5 rounded-lg text-sm font-medium transition-all ${\n\t\t\t\t\t\t\t\tactiveTab === 'builders'\n\t\t\t\t\t\t\t\t\t? 'bg-white/10 text-white'\n\t\t\t\t\t\t\t\t\t: 'text-white/50 hover:text-white/80'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tFor Builders\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tonClick={() => setActiveTab('sellers')}\n\t\t\t\t\t\t\tclassName={`px-6 py-2.5 rounded-lg text-sm font-medium transition-all ${\n\t\t\t\t\t\t\t\tactiveTab === 'sellers'\n\t\t\t\t\t\t\t\t\t? 'bg-white/10 text-white'\n\t\t\t\t\t\t\t\t\t: 'text-white/50 hover:text-white/80'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tFor Sellers\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Steps */}\n\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t{steps.map((step, index) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={step.step}\n\t\t\t\t\t\t\tclassName=\"group relative flex gap-6 md:gap-10 items-start p-6 rounded-2xl hover:bg-white/[0.02] transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{/* Step number */}\n\t\t\t\t\t\t\t<div className=\"shrink-0\">\n\t\t\t\t\t\t\t\t<div className=\"w-14 h-14 rounded-2xl bg-gradient-to-br from-emerald-500/20 to-teal-500/20 border border-emerald-500/20 flex items-center justify-center\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-emerald-400 font-bold text-lg\">{step.step}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/* Connector line */}\n\t\t\t\t\t\t\t\t{index < steps.length - 1 && (\n\t\t\t\t\t\t\t\t\t<div className=\"w-px h-12 bg-gradient-to-b from-emerald-500/30 to-transparent mx-auto mt-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Content */}\n\t\t\t\t\t\t\t<div className=\"flex-1 pt-1\">\n\t\t\t\t\t\t\t\t<h3 className=\"text-xl font-semibold text-white mb-2\">{step.title}</h3>\n\t\t\t\t\t\t\t\t<p className=\"text-white/50 mb-4\">{step.desc}</p>\n\n\t\t\t\t\t\t\t\t{/* Command */}\n\t\t\t\t\t\t\t\t<div className=\"inline-flex items-center gap-3 px-4 py-2.5 rounded-xl bg-black/50 border border-white/10 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\t<span className=\"text-emerald-400\">$</span>\n\t\t\t\t\t\t\t\t\t<span className=\"text-white/80\">{step.command}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n","export function ArchitecturePreview() {\n\tconst layers = [\n\t\t{\n\t\t\tname: 'Interface Layer',\n\t\t\titems: ['apps/web', 'apps/server'],\n\t\t\tcolor: 'emerald',\n\t\t\tdesc: 'React UI + Express API',\n\t\t},\n\t\t{\n\t\t\tname: 'SDK Layer',\n\t\t\titems: ['sdk', 'sdk-react'],\n\t\t\tcolor: 'teal',\n\t\t\tdesc: 'Module system + DI container',\n\t\t},\n\t\t{\n\t\t\tname: 'Application Layer',\n\t\t\titems: ['application', 'api'],\n\t\t\tcolor: 'cyan',\n\t\t\tdesc: 'Use cases + oRPC procedures',\n\t\t},\n\t\t{\n\t\t\tname: 'Domain Layer',\n\t\t\titems: ['domain', 'contracts'],\n\t\t\tcolor: 'violet',\n\t\t\tdesc: 'Entities + Zod schemas',\n\t\t},\n\t\t{\n\t\t\tname: 'Infrastructure Layer',\n\t\t\titems: ['infrastructure', 'db', 'auth'],\n\t\t\tcolor: 'pink',\n\t\t\tdesc: 'Repositories + Drizzle ORM',\n\t\t},\n\t]\n\n\tconst colorMap: Record<string, { bg: string; border: string; text: string; glow: string }> = {\n\t\temerald: {\n\t\t\tbg: 'bg-emerald-500/10',\n\t\t\tborder: 'border-emerald-500/30',\n\t\t\ttext: 'text-emerald-400',\n\t\t\tglow: 'shadow-emerald-500/20',\n\t\t},\n\t\tteal: {\n\t\t\tbg: 'bg-teal-500/10',\n\t\t\tborder: 'border-teal-500/30',\n\t\t\ttext: 'text-teal-400',\n\t\t\tglow: 'shadow-teal-500/20',\n\t\t},\n\t\tcyan: {\n\t\t\tbg: 'bg-cyan-500/10',\n\t\t\tborder: 'border-cyan-500/30',\n\t\t\ttext: 'text-cyan-400',\n\t\t\tglow: 'shadow-cyan-500/20',\n\t\t},\n\t\tviolet: {\n\t\t\tbg: 'bg-violet-500/10',\n\t\t\tborder: 'border-violet-500/30',\n\t\t\ttext: 'text-violet-400',\n\t\t\tglow: 'shadow-violet-500/20',\n\t\t},\n\t\tpink: {\n\t\t\tbg: 'bg-pink-500/10',\n\t\t\tborder: 'border-pink-500/30',\n\t\t\ttext: 'text-pink-400',\n\t\t\tglow: 'shadow-pink-500/20',\n\t\t},\n\t}\n\n\treturn (\n\t\t<section className=\"py-24 px-6\">\n\t\t\t<div className=\"max-w-6xl mx-auto\">\n\t\t\t\t{/* Section header */}\n\t\t\t\t<div className=\"text-center mb-16\">\n\t\t\t\t\t<div className=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-full bg-violet-500/10 border border-violet-500/20 text-xs text-violet-400 font-medium mb-6\">\n\t\t\t\t\t\t<svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\td=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\tClean Architecture\n\t\t\t\t\t</div>\n\t\t\t\t\t<h2 className=\"text-4xl md:text-5xl font-bold text-white mb-6\">\n\t\t\t\t\t\tEvery Module, Same Structure\n\t\t\t\t\t</h2>\n\t\t\t\t\t<p className=\"text-xl text-white/60 max-w-2xl mx-auto\">\n\t\t\t\t\t\tClear boundaries between layers. AGENTS.md in every package ensures AI and humans build\n\t\t\t\t\t\tconsistently.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Architecture diagram */}\n\t\t\t\t<div className=\"max-w-3xl mx-auto space-y-3\">\n\t\t\t\t\t{layers.map((layer, index) => {\n\t\t\t\t\t\tconst colors = colorMap[layer.color]\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div key={layer.name} className=\"relative group\">\n\t\t\t\t\t\t\t\t{/* Connection line */}\n\t\t\t\t\t\t\t\t{index < layers.length - 1 && (\n\t\t\t\t\t\t\t\t\t<div className=\"absolute left-1/2 -bottom-3 w-px h-3 bg-white/10\" />\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Layer card */}\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={`relative rounded-xl border ${colors.border} ${colors.bg} p-5 hover:shadow-lg ${colors.glow} transition-all`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col md:flex-row md:items-center gap-4\">\n\t\t\t\t\t\t\t\t\t\t{/* Layer name */}\n\t\t\t\t\t\t\t\t\t\t<div className=\"md:w-48 shrink-0\">\n\t\t\t\t\t\t\t\t\t\t\t<h3 className={`font-semibold ${colors.text}`}>{layer.name}</h3>\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-white/40 text-sm\">{layer.desc}</p>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t{/* Packages */}\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2 flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t{layer.items.map((item) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={item}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-2 px-3 py-1.5 rounded-lg bg-black/30 border border-white/10\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"w-2 h-2 rounded-full bg-white/30\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm font-mono text-white/70\">{item}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t{/* AGENTS.md indicator */}\n\t\t\t\t\t\t\t\t\t\t<div className=\"shrink-0 flex items-center gap-1.5 px-2.5 py-1 rounded-md bg-emerald-500/10 border border-emerald-500/20\">\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-3.5 h-3.5 text-emerald-400\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs font-mono text-emerald-400\">AGENTS.md</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Direction arrows */}\n\t\t\t\t<div className=\"mt-8 flex justify-center\">\n\t\t\t\t\t<div className=\"flex items-center gap-2 text-sm text-white/40\">\n\t\t\t\t\t\t<svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\td=\"M19 14l-7 7m0 0l-7-7m7 7V3\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<span>Dependencies flow down only</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n","import { useState, useEffect } from 'react'\n\nexport function CliDemo() {\n\tconst commands = [\n\t\t{\n\t\t\tinput: 'kuckit generate module billing',\n\t\t\toutput: [\n\t\t\t\t'Creating module: @myapp/billing-module',\n\t\t\t\t' Directory: ./packages/billing-module',\n\t\t\t\t'',\n\t\t\t\t'✓ Created src/server/module.ts',\n\t\t\t\t'✓ Created src/client/index.ts',\n\t\t\t\t'✓ Created AGENTS.md',\n\t\t\t\t'✓ Created package.json',\n\t\t\t\t'',\n\t\t\t\t'Module created successfully!',\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tinput: 'kuckit add @vendor/auth-module',\n\t\t\toutput: [\n\t\t\t\t'Installing @vendor/auth-module...',\n\t\t\t\t'',\n\t\t\t\t'✓ Package installed',\n\t\t\t\t'✓ Server module wired in modules.ts',\n\t\t\t\t'✓ Client module wired in modules.client.ts',\n\t\t\t\t'✓ TypeScript types available',\n\t\t\t\t'',\n\t\t\t\t'Module ready to use!',\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tinput: 'kuckit doctor',\n\t\t\toutput: [\n\t\t\t\t'Checking project setup...',\n\t\t\t\t'',\n\t\t\t\t'✓ kuckit.config.ts found',\n\t\t\t\t'✓ All modules registered',\n\t\t\t\t'✓ No circular dependencies',\n\t\t\t\t'✓ AGENTS.md in all packages',\n\t\t\t\t'✓ Pre-commit hooks configured',\n\t\t\t\t'',\n\t\t\t\t'All checks passed!',\n\t\t\t],\n\t\t},\n\t]\n\n\tconst [activeCommand, setActiveCommand] = useState(0)\n\tconst [displayedLines, setDisplayedLines] = useState<string[]>([])\n\tconst [isTyping, setIsTyping] = useState(true)\n\tconst [typedInput, setTypedInput] = useState('')\n\n\tuseEffect(() => {\n\t\tconst command = commands[activeCommand]\n\t\tlet inputIndex = 0\n\t\tlet outputIndex = 0\n\t\tsetDisplayedLines([])\n\t\tsetTypedInput('')\n\t\tsetIsTyping(true)\n\n\t\t// Type the input command\n\t\tconst inputInterval = setInterval(() => {\n\t\t\tif (inputIndex <= command.input.length) {\n\t\t\t\tsetTypedInput(command.input.slice(0, inputIndex))\n\t\t\t\tinputIndex++\n\t\t\t} else {\n\t\t\t\tclearInterval(inputInterval)\n\t\t\t\tsetIsTyping(false)\n\n\t\t\t\t// Then show output lines\n\t\t\t\tconst outputInterval = setInterval(() => {\n\t\t\t\t\tif (outputIndex < command.output.length) {\n\t\t\t\t\t\tsetDisplayedLines((prev) => [...prev, command.output[outputIndex]])\n\t\t\t\t\t\toutputIndex++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclearInterval(outputInterval)\n\n\t\t\t\t\t\t// Move to next command after delay\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\tsetActiveCommand((prev) => (prev + 1) % commands.length)\n\t\t\t\t\t\t}, 3000)\n\t\t\t\t\t}\n\t\t\t\t}, 100)\n\t\t\t}\n\t\t}, 50)\n\n\t\treturn () => {\n\t\t\tclearInterval(inputInterval)\n\t\t}\n\t}, [activeCommand])\n\n\treturn (\n\t\t<section className=\"py-24 px-6 relative\">\n\t\t\t{/* Background */}\n\t\t\t<div className=\"absolute inset-0 bg-gradient-to-b from-transparent via-emerald-500/5 to-transparent pointer-events-none\" />\n\n\t\t\t<div className=\"max-w-4xl mx-auto relative\">\n\t\t\t\t{/* Section header */}\n\t\t\t\t<div className=\"text-center mb-12\">\n\t\t\t\t\t<h2 className=\"text-4xl md:text-5xl font-bold text-white mb-6\">Powerful CLI</h2>\n\t\t\t\t\t<p className=\"text-xl text-white/60\">\n\t\t\t\t\t\tGenerate, add, search, and validate modules from the command line.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Terminal */}\n\t\t\t\t<div className=\"rounded-2xl border border-white/10 bg-black/80 backdrop-blur-sm overflow-hidden shadow-2xl\">\n\t\t\t\t\t{/* Terminal header */}\n\t\t\t\t\t<div className=\"flex items-center gap-2 px-4 py-3 bg-white/5 border-b border-white/10\">\n\t\t\t\t\t\t<div className=\"flex gap-1.5\">\n\t\t\t\t\t\t\t<div className=\"w-3 h-3 rounded-full bg-red-500/80\" />\n\t\t\t\t\t\t\t<div className=\"w-3 h-3 rounded-full bg-yellow-500/80\" />\n\t\t\t\t\t\t\t<div className=\"w-3 h-3 rounded-full bg-green-500/80\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span className=\"text-white/40 text-sm font-mono ml-2\">terminal</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Terminal body */}\n\t\t\t\t\t<div className=\"p-6 font-mono text-sm min-h-[320px]\">\n\t\t\t\t\t\t{/* Input line */}\n\t\t\t\t\t\t<div className=\"flex items-center gap-2 mb-4\">\n\t\t\t\t\t\t\t<span className=\"text-emerald-400\">$</span>\n\t\t\t\t\t\t\t<span className=\"text-white\">{typedInput}</span>\n\t\t\t\t\t\t\t{isTyping && <span className=\"w-2 h-5 bg-white/80 animate-pulse\" />}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Output lines */}\n\t\t\t\t\t\t<div className=\"space-y-0.5\">\n\t\t\t\t\t\t\t{displayedLines.map((line, index) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\t\tclassName={`${\n\t\t\t\t\t\t\t\t\t\tline?.startsWith('✓')\n\t\t\t\t\t\t\t\t\t\t\t? 'text-emerald-400'\n\t\t\t\t\t\t\t\t\t\t\t: line?.includes('!')\n\t\t\t\t\t\t\t\t\t\t\t\t? 'text-white'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'text-white/60'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{line || '\\u00A0'}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Command tabs */}\n\t\t\t\t<div className=\"flex justify-center gap-2 mt-6\">\n\t\t\t\t\t{commands.map((_, index) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tonClick={() => setActiveCommand(index)}\n\t\t\t\t\t\t\tclassName={`w-2 h-2 rounded-full transition-all ${\n\t\t\t\t\t\t\t\tindex === activeCommand ? 'bg-emerald-400 w-6' : 'bg-white/20 hover:bg-white/40'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n","import { useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\n\ninterface FAQItem {\n\tid: string\n\tquestion: string\n\tanswer: string\n\tcategory: 'seller' | 'general'\n}\n\nconst faqItems: FAQItem[] = [\n\t{\n\t\tid: 'seller-1',\n\t\tcategory: 'seller',\n\t\tquestion: 'Can I develop and sell my own Kuckit modules?',\n\t\tanswer:\n\t\t\t'Yes. You can develop complete, production-ready modules extending Kuckit functionality. Set your own pricing and publish them to the Kuckit marketplace.',\n\t},\n\t{\n\t\tid: 'seller-2',\n\t\tcategory: 'seller',\n\t\tquestion: 'What pricing models are available for my module?',\n\t\tanswer:\n\t\t\t'You have full control over your pricing strategy. Choose between one-time payments (pay once, own forever) or subscription models (recurring billing). Each module can use a different model.',\n\t},\n\t{\n\t\tid: 'seller-3',\n\t\tcategory: 'seller',\n\t\tquestion: 'How does the partnership program work?',\n\t\tanswer:\n\t\t\t\"If you want to partner with Kuckit, your module can be integrated into the core platform. As a partner, you receive revenue share benefits whenever Kuckit generates sales, giving you passive income from the platform's growth.\",\n\t},\n\t{\n\t\tid: 'seller-4',\n\t\tcategory: 'seller',\n\t\tquestion: 'What are the requirements for marketplace publishing?',\n\t\tanswer:\n\t\t\t\"Modules must follow Kuckit's Clean Architecture patterns, include proper documentation, and pass quality checks. Review our module development guide for detailed requirements.\",\n\t},\n\t{\n\t\tid: 'seller-5',\n\t\tcategory: 'seller',\n\t\tquestion: 'Can I update my module after publishing?',\n\t\tanswer:\n\t\t\t'Absolutely. You can release new versions anytime. Existing customers are notified of updates, and you control version management and backwards compatibility.',\n\t},\n\t{\n\t\tid: 'general-1',\n\t\tcategory: 'general',\n\t\tquestion: 'What is Kuckit?',\n\t\tanswer:\n\t\t\t'Kuckit is a full-stack, modular platform built on Clean Architecture and Dependency Injection. It provides a professional foundation for building scalable applications with a plugin-based module system.',\n\t},\n\t{\n\t\tid: 'general-2',\n\t\tcategory: 'general',\n\t\tquestion: 'What is the Kuckit business model?',\n\t\tanswer:\n\t\t\t'Kuckit provides a foundation platform for building applications. Module creators can publish to the marketplace with flexible pricing (one-time or subscription), and partners can integrate modules into core for revenue sharing benefits.',\n\t},\n\t{\n\t\tid: 'general-3',\n\t\tcategory: 'general',\n\t\tquestion: 'What technology stack does Kuckit use?',\n\t\tanswer:\n\t\t\t'Kuckit is built with TypeScript, React (frontend), Express (backend), Drizzle ORM, and features comprehensive tooling. The modular architecture lets you swap implementations as needed.',\n\t},\n]\n\nexport function FAQ() {\n\tconst [expandedId, setExpandedId] = useState<string | null>(null)\n\n\tconst sellerFaqs = faqItems.filter((item) => item.category === 'seller')\n\tconst generalFaqs = faqItems.filter((item) => item.category === 'general')\n\n\treturn (\n\t\t<section className=\"relative py-20 px-6\">\n\t\t\t<div className=\"max-w-4xl mx-auto\">\n\t\t\t\t{/* Header */}\n\t\t\t\t<div className=\"text-center mb-16\">\n\t\t\t\t\t<h2 className=\"text-4xl md:text-5xl font-bold mb-4 bg-gradient-to-r from-emerald-400 via-teal-400 to-cyan-400 bg-clip-text text-transparent\">\n\t\t\t\t\t\tFrequently Asked Questions\n\t\t\t\t\t</h2>\n\t\t\t\t\t<p className=\"text-white/60 text-lg\">\n\t\t\t\t\t\tEverything you need to know about developing, selling, and partnering with Kuckit\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t{/* For Sellers Section */}\n\t\t\t\t<div className=\"mb-16\">\n\t\t\t\t\t<h3 className=\"text-2xl font-bold text-emerald-400 mb-8 flex items-center gap-2\">\n\t\t\t\t\t\t<div className=\"w-1 h-8 bg-gradient-to-b from-emerald-400 to-teal-500 rounded-full\" />\n\t\t\t\t\t\tFor Module Sellers\n\t\t\t\t\t</h3>\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t{sellerFaqs.map((item) => (\n\t\t\t\t\t\t\t<FAQItem\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\tisExpanded={expandedId === item.id}\n\t\t\t\t\t\t\t\tonToggle={() => setExpandedId(expandedId === item.id ? null : item.id)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* General Section */}\n\t\t\t\t<div>\n\t\t\t\t\t<h3 className=\"text-2xl font-bold text-teal-400 mb-8 flex items-center gap-2\">\n\t\t\t\t\t\t<div className=\"w-1 h-8 bg-gradient-to-b from-teal-400 to-cyan-500 rounded-full\" />\n\t\t\t\t\t\tGeneral\n\t\t\t\t\t</h3>\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t{generalFaqs.map((item) => (\n\t\t\t\t\t\t\t<FAQItem\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\titem={item}\n\t\t\t\t\t\t\t\tisExpanded={expandedId === item.id}\n\t\t\t\t\t\t\t\tonToggle={() => setExpandedId(expandedId === item.id ? null : item.id)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n\ninterface FAQItemProps {\n\titem: FAQItem\n\tisExpanded: boolean\n\tonToggle: () => void\n}\n\nfunction FAQItem({ item, isExpanded, onToggle }: FAQItemProps) {\n\treturn (\n\t\t<button\n\t\t\tonClick={onToggle}\n\t\t\tclassName=\"w-full text-left bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg p-5 transition-all duration-200\"\n\t\t>\n\t\t\t<div className=\"flex items-start justify-between gap-4\">\n\t\t\t\t<span className=\"text-base md:text-lg font-semibold text-white pr-4\">{item.question}</span>\n\t\t\t\t<ChevronDown\n\t\t\t\t\tsize={20}\n\t\t\t\t\tclassName={`flex-shrink-0 text-emerald-400 transition-transform duration-300 ${\n\t\t\t\t\t\tisExpanded ? 'rotate-180' : ''\n\t\t\t\t\t}`}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{isExpanded && (\n\t\t\t\t<p className=\"text-white/70 mt-4 text-sm md:text-base leading-relaxed\">{item.answer}</p>\n\t\t\t)}\n\t\t</button>\n\t)\n}\n","'use client'\n\nimport { useState, type FormEvent } from 'react'\nimport { toast } from 'sonner'\nimport { useRpc } from '@kuckit/sdk-react'\n\ntype FormState = 'idle' | 'loading'\n\ninterface WaitlistRouter {\n\twaitlist: {\n\t\tjoin: (input: {\n\t\t\temail: string\n\t\t\tsource?: string\n\t\t}) => Promise<{ success: boolean; message: string }>\n\t}\n}\n\ninterface WaitlistFormProps {\n\tsource?: string\n\tclassName?: string\n}\n\nexport function WaitlistForm({ source = 'landing', className }: WaitlistFormProps) {\n\tconst rpc = useRpc<WaitlistRouter>()\n\tconst [email, setEmail] = useState('')\n\tconst [state, setState] = useState<FormState>('idle')\n\n\tconst handleSubmit = async (e: FormEvent) => {\n\t\te.preventDefault()\n\t\tsetState('loading')\n\n\t\ttry {\n\t\t\tconst result = await rpc.waitlist.join({ email, source })\n\n\t\t\tif (result.success) {\n\t\t\t\ttoast.success(result.message)\n\t\t\t\tsetEmail('')\n\t\t\t} else {\n\t\t\t\ttoast.error(result.message || 'Something went wrong. Please try again.')\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Waitlist submission error:', error)\n\t\t\ttoast.error('Network error. Please try again.')\n\t\t} finally {\n\t\t\tsetState('idle')\n\t\t}\n\t}\n\n\treturn (\n\t\t<form onSubmit={handleSubmit} className={`flex flex-col sm:flex-row gap-3 ${className}`}>\n\t\t\t<input\n\t\t\t\ttype=\"email\"\n\t\t\t\tvalue={email}\n\t\t\t\tonChange={(e) => setEmail(e.target.value)}\n\t\t\t\tplaceholder=\"Enter your email\"\n\t\t\t\trequired\n\t\t\t\tdisabled={state === 'loading'}\n\t\t\t\tclassName=\"flex-1 px-5 py-3 rounded-xl bg-white/5 border border-white/10 text-white placeholder:text-white/40 focus:outline-none focus:border-emerald-500/50 focus:ring-2 focus:ring-emerald-500/20 transition-all disabled:opacity-50\"\n\t\t\t/>\n\t\t\t<button\n\t\t\t\ttype=\"submit\"\n\t\t\t\tdisabled={state === 'loading'}\n\t\t\t\tclassName=\"px-6 py-3 rounded-xl bg-white/10 border border-white/20 font-medium text-white hover:bg-white/15 transition-colors shrink-0 disabled:opacity-50 disabled:cursor-not-allowed\"\n\t\t\t>\n\t\t\t\t{state === 'loading' ? 'Joining...' : 'Join Waitlist'}\n\t\t\t</button>\n\t\t</form>\n\t)\n}\n","import { WaitlistForm } from './WaitlistForm'\n\nexport function CtaSection() {\n\treturn (\n\t\t<section className=\"py-32 px-6 relative overflow-hidden\">\n\t\t\t{/* Background effects */}\n\t\t\t<div className=\"absolute inset-0 pointer-events-none\">\n\t\t\t\t<div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[800px] h-[800px] bg-gradient-to-br from-emerald-500/20 via-teal-500/10 to-transparent rounded-full blur-3xl\" />\n\t\t\t</div>\n\n\t\t\t<div className=\"max-w-4xl mx-auto relative\">\n\t\t\t\t{/* Main CTA card */}\n\t\t\t\t<div className=\"relative rounded-3xl border border-white/10 bg-white/[0.02] backdrop-blur-sm p-12 md:p-16 text-center\">\n\t\t\t\t\t{/* Decorative corners */}\n\t\t\t\t\t<div className=\"absolute top-0 left-0 w-24 h-24 border-l-2 border-t-2 border-emerald-500/30 rounded-tl-3xl\" />\n\t\t\t\t\t<div className=\"absolute bottom-0 right-0 w-24 h-24 border-r-2 border-b-2 border-teal-500/30 rounded-br-3xl\" />\n\n\t\t\t\t\t<h2 className=\"text-4xl md:text-5xl font-bold text-white mb-6\">Ready to Build?</h2>\n\t\t\t\t\t<p className=\"text-xl text-white/60 mb-10 max-w-xl mx-auto\">\n\t\t\t\t\t\tJoin thousands of developers building modular TypeScript applications.\n\t\t\t\t\t</p>\n\n\t\t\t\t\t{/* Buttons */}\n\t\t\t\t\t<div className=\"flex flex-col sm:flex-row items-center justify-center gap-4 mb-12\">\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"/docs\"\n\t\t\t\t\t\t\tclassName=\"group relative px-8 py-4 bg-gradient-to-r from-emerald-500 to-teal-500 rounded-xl font-semibold text-black transition-all hover:scale-105 hover:shadow-lg hover:shadow-emerald-500/25\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRead the Docs\n\t\t\t\t\t\t\t<span className=\"absolute inset-0 rounded-xl bg-gradient-to-r from-emerald-400 to-teal-400 opacity-0 group-hover:opacity-100 transition-opacity blur-xl -z-10\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://github.com/kuckit\"\n\t\t\t\t\t\t\tclassName=\"px-8 py-4 rounded-xl font-semibold text-white border border-white/20 bg-white/5 hover:bg-white/10 hover:border-white/30 transition-all flex items-center gap-2\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg className=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\t\t\t\t\td=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\tView on GitHub\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Divider */}\n\t\t\t\t\t<div className=\"flex items-center gap-4 mb-10\">\n\t\t\t\t\t\t<div className=\"flex-1 h-px bg-white/10\" />\n\t\t\t\t\t\t<span className=\"text-white/40 text-sm\">or join the marketplace waitlist</span>\n\t\t\t\t\t\t<div className=\"flex-1 h-px bg-white/10\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Waitlist form */}\n\t\t\t\t\t<WaitlistForm source=\"cta-section\" className=\"max-w-md mx-auto\" />\n\t\t\t\t</div>\n\n\t\t\t\t{/* Stats */}\n\t\t\t\t<div className=\"grid grid-cols-3 gap-6 mt-12\">\n\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t<div className=\"text-3xl md:text-4xl font-bold text-white mb-1\">100%</div>\n\t\t\t\t\t\t<div className=\"text-white/50 text-sm\">TypeScript</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t<div className=\"text-3xl md:text-4xl font-bold text-white mb-1\">5 min</div>\n\t\t\t\t\t\t<div className=\"text-white/50 text-sm\">To first module</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t<div className=\"text-3xl md:text-4xl font-bold text-white mb-1\">∞</div>\n\t\t\t\t\t\t<div className=\"text-white/50 text-sm\">Modules possible</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</section>\n\t)\n}\n","import { Hero } from './hero'\nimport { ValueProps } from './value-props'\nimport { CodeQuality } from './code-quality'\nimport { ModuleShowcase } from './module-showcase'\nimport { HowItWorks } from './how-it-works'\nimport { ArchitecturePreview } from './architecture-preview'\nimport { CliDemo } from './cli-demo'\nimport { FAQ } from './faq'\nimport { CtaSection } from './cta-section'\n\nexport function LandingPage() {\n\treturn (\n\t\t<div className=\"min-h-screen bg-[#0a0a0b] text-white overflow-x-hidden\">\n\t\t\t{/* Ambient background */}\n\t\t\t<div className=\"fixed inset-0 pointer-events-none\">\n\t\t\t\t<div className=\"absolute top-0 left-1/4 w-[600px] h-[600px] bg-emerald-500/10 rounded-full blur-[120px] animate-pulse\" />\n\t\t\t\t<div className=\"absolute bottom-1/4 right-1/4 w-[400px] h-[400px] bg-teal-500/8 rounded-full blur-[100px] animate-pulse delay-1000\" />\n\t\t\t</div>\n\n\t\t\t<div className=\"relative z-10\">\n\t\t\t\t<Hero />\n\t\t\t\t<ValueProps />\n\t\t\t\t<CodeQuality />\n\t\t\t\t<ModuleShowcase />\n\t\t\t\t<HowItWorks />\n\t\t\t\t<ArchitecturePreview />\n\t\t\t\t<CliDemo />\n\t\t\t\t<FAQ />\n\t\t\t\t<CtaSection />\n\t\t\t</div>\n\n\t\t\t{/* Footer */}\n\t\t\t<footer className=\"relative z-10 border-t border-white/5 py-12\">\n\t\t\t\t<div className=\"max-w-6xl mx-auto px-6 flex flex-col md:flex-row justify-between items-center gap-6\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<div className=\"w-8 h-8 rounded-lg bg-gradient-to-br from-emerald-400 to-teal-500 flex items-center justify-center\">\n\t\t\t\t\t\t\t<span className=\"text-black font-bold text-sm\">K</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span className=\"text-white/60 text-sm\">Kuckit © {new Date().getFullYear()}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex gap-8 text-sm text-white/40\">\n\t\t\t\t\t\t<a href=\"/docs\" className=\"hover:text-white transition-colors\">\n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a href=\"https://github.com/kuckit\" className=\"hover:text-white transition-colors\">\n\t\t\t\t\t\t\tGitHub\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a href=\"/discord\" className=\"hover:text-white transition-colors\">\n\t\t\t\t\t\t\tDiscord\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</footer>\n\t\t</div>\n\t)\n}\n","import { defineKuckitClientModule, type KuckitClientModuleContext } from '@kuckit/sdk-react'\nimport { LandingPage } from './components/LandingPage'\n\nexport const kuckitClientModule = defineKuckitClientModule({\n\tid: 'kuckit.landing',\n\tdisplayName: 'Landing',\n\tversion: '0.1.0',\n\n\tregister(ctx: KuckitClientModuleContext) {\n\t\tctx.registerComponent('LandingPage', LandingPage)\n\n\t\tctx.addRoute({\n\t\t\tid: 'landing',\n\t\t\tpath: '/',\n\t\t\tcomponent: LandingPage,\n\t\t\tmeta: {\n\t\t\t\ttitle: 'Kuckit - Build Modules. Earn Revenue. Ship Faster.',\n\t\t\t\trequiresAuth: false,\n\t\t\t},\n\t\t})\n\t},\n})\n\nexport { LandingPage } from './components/LandingPage'\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as _kuckit_sdk0 from "@kuckit/sdk";
|
|
2
|
+
|
|
3
|
+
//#region src/server/module.d.ts
|
|
4
|
+
type LandingModuleConfig = Record<string, never>;
|
|
5
|
+
declare const kuckitModule: _kuckit_sdk0.KuckitModuleDefinition<LandingModuleConfig>;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { LandingModuleConfig, kuckitModule };
|
|
8
|
+
//# sourceMappingURL=module.d.ts.map
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { asFunction, defineKuckitModule } from "@kuckit/sdk";
|
|
2
|
+
import { jsonb, pgTable, text, timestamp } from "drizzle-orm/pg-core";
|
|
3
|
+
import { count, eq } from "drizzle-orm";
|
|
4
|
+
import { publicProcedure } from "@kuckit/api";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
|
|
7
|
+
//#region src/server/schema/waitlist.ts
|
|
8
|
+
const waitlistTable = pgTable("landing_waitlist", {
|
|
9
|
+
id: text("id").primaryKey(),
|
|
10
|
+
email: text("email").notNull().unique(),
|
|
11
|
+
source: text("source"),
|
|
12
|
+
metadata: jsonb("metadata"),
|
|
13
|
+
createdAt: timestamp("created_at").notNull().defaultNow()
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/server/repository/waitlist.repository.ts
|
|
18
|
+
const makeWaitlistRepository = (db) => ({
|
|
19
|
+
async findByEmail(email) {
|
|
20
|
+
return (await db.select().from(waitlistTable).where(eq(waitlistTable.email, email)).limit(1))[0] ?? null;
|
|
21
|
+
},
|
|
22
|
+
async create(entry) {
|
|
23
|
+
const [created] = await db.insert(waitlistTable).values(entry).returning();
|
|
24
|
+
if (!created) throw new Error("Failed to create waitlist entry");
|
|
25
|
+
return created;
|
|
26
|
+
},
|
|
27
|
+
async count() {
|
|
28
|
+
const [result] = await db.select({ count: count() }).from(waitlistTable);
|
|
29
|
+
return result?.count ?? 0;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/server/use-cases/join-waitlist.ts
|
|
35
|
+
const makeJoinWaitlistUseCase = (deps) => {
|
|
36
|
+
return async (input) => {
|
|
37
|
+
const { waitlistRepository, logger } = deps;
|
|
38
|
+
const email = input.email.toLowerCase().trim();
|
|
39
|
+
if (await waitlistRepository.findByEmail(email)) {
|
|
40
|
+
logger.info("Waitlist duplicate signup attempt", { email });
|
|
41
|
+
return {
|
|
42
|
+
success: true,
|
|
43
|
+
message: "You're already on the waitlist! We'll be in touch soon."
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const id = crypto.randomUUID();
|
|
47
|
+
await waitlistRepository.create({
|
|
48
|
+
id,
|
|
49
|
+
email,
|
|
50
|
+
source: input.source ?? null,
|
|
51
|
+
metadata: null
|
|
52
|
+
});
|
|
53
|
+
logger.info("New waitlist signup", {
|
|
54
|
+
email,
|
|
55
|
+
source: input.source
|
|
56
|
+
});
|
|
57
|
+
return {
|
|
58
|
+
success: true,
|
|
59
|
+
message: "You're on the list! We'll be in touch."
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/server/router/waitlist.router.ts
|
|
66
|
+
const joinWaitlistInputSchema = z.object({
|
|
67
|
+
email: z.string().email("Please enter a valid email address"),
|
|
68
|
+
source: z.string().optional()
|
|
69
|
+
});
|
|
70
|
+
const joinWaitlistOutputSchema = z.object({
|
|
71
|
+
success: z.boolean(),
|
|
72
|
+
message: z.string()
|
|
73
|
+
});
|
|
74
|
+
const waitlistRouter = { join: publicProcedure.input(joinWaitlistInputSchema).output(joinWaitlistOutputSchema).handler(async ({ input, context }) => {
|
|
75
|
+
const { joinWaitlist } = context.di.cradle;
|
|
76
|
+
return joinWaitlist(input);
|
|
77
|
+
}) };
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/server/module.ts
|
|
81
|
+
const kuckitModule = defineKuckitModule({
|
|
82
|
+
id: "kuckit.landing",
|
|
83
|
+
displayName: "Landing",
|
|
84
|
+
description: "Landing module for Kuckit",
|
|
85
|
+
version: "0.1.0",
|
|
86
|
+
async register(ctx) {
|
|
87
|
+
const { container } = ctx;
|
|
88
|
+
ctx.registerSchema("landing_waitlist", waitlistTable);
|
|
89
|
+
container.register({
|
|
90
|
+
waitlistRepository: asFunction(({ db }) => makeWaitlistRepository(db)).scoped(),
|
|
91
|
+
joinWaitlist: asFunction(({ waitlistRepository, logger }) => makeJoinWaitlistUseCase({
|
|
92
|
+
waitlistRepository,
|
|
93
|
+
logger
|
|
94
|
+
})).scoped()
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
registerApi(ctx) {
|
|
98
|
+
ctx.addApiRegistration({
|
|
99
|
+
type: "rpc-router",
|
|
100
|
+
name: "waitlist",
|
|
101
|
+
router: waitlistRouter
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
async onBootstrap(ctx) {
|
|
105
|
+
const { container } = ctx;
|
|
106
|
+
container.resolve("logger").info("Landing module initialized");
|
|
107
|
+
},
|
|
108
|
+
async onShutdown(ctx) {
|
|
109
|
+
const { container } = ctx;
|
|
110
|
+
container.resolve("logger").info("Landing module shutting down");
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
//#endregion
|
|
115
|
+
export { kuckitModule };
|
|
116
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","names":[],"sources":["../../src/server/schema/waitlist.ts","../../src/server/repository/waitlist.repository.ts","../../src/server/use-cases/join-waitlist.ts","../../src/server/router/waitlist.router.ts","../../src/server/module.ts"],"sourcesContent":["import { pgTable, text, timestamp, jsonb } from 'drizzle-orm/pg-core'\n\nexport const waitlistTable = pgTable('landing_waitlist', {\n\tid: text('id').primaryKey(),\n\temail: text('email').notNull().unique(),\n\tsource: text('source'),\n\tmetadata: jsonb('metadata'),\n\tcreatedAt: timestamp('created_at').notNull().defaultNow(),\n})\n\nexport type WaitlistEntry = typeof waitlistTable.$inferSelect\nexport type NewWaitlistEntry = typeof waitlistTable.$inferInsert\n","import type { NodePgDatabase } from 'drizzle-orm/node-postgres'\nimport { eq, count } from 'drizzle-orm'\nimport { waitlistTable, type WaitlistEntry, type NewWaitlistEntry } from '../schema'\n\nexport interface WaitlistRepository {\n\tfindByEmail(email: string): Promise<WaitlistEntry | null>\n\tcreate(entry: NewWaitlistEntry): Promise<WaitlistEntry>\n\tcount(): Promise<number>\n}\n\nexport const makeWaitlistRepository = (db: NodePgDatabase): WaitlistRepository => ({\n\tasync findByEmail(email: string): Promise<WaitlistEntry | null> {\n\t\tconst rows = await db\n\t\t\t.select()\n\t\t\t.from(waitlistTable)\n\t\t\t.where(eq(waitlistTable.email, email))\n\t\t\t.limit(1)\n\n\t\treturn rows[0] ?? null\n\t},\n\n\tasync create(entry: NewWaitlistEntry): Promise<WaitlistEntry> {\n\t\tconst [created] = await db.insert(waitlistTable).values(entry).returning()\n\t\tif (!created) {\n\t\t\tthrow new Error('Failed to create waitlist entry')\n\t\t}\n\t\treturn created\n\t},\n\n\tasync count(): Promise<number> {\n\t\tconst [result] = await db.select({ count: count() }).from(waitlistTable)\n\t\treturn result?.count ?? 0\n\t},\n})\n","import type { Logger } from '@kuckit/domain'\nimport type { WaitlistRepository } from '../repository/waitlist.repository'\n\nexport interface JoinWaitlistDeps {\n\treadonly waitlistRepository: WaitlistRepository\n\treadonly logger: Logger\n}\n\nexport interface JoinWaitlistInput {\n\treadonly email: string\n\treadonly source?: string\n}\n\nexport interface JoinWaitlistOutput {\n\treadonly success: boolean\n\treadonly message: string\n}\n\nexport const makeJoinWaitlistUseCase = (deps: JoinWaitlistDeps) => {\n\treturn async (input: JoinWaitlistInput): Promise<JoinWaitlistOutput> => {\n\t\tconst { waitlistRepository, logger } = deps\n\t\tconst email = input.email.toLowerCase().trim()\n\n\t\tconst existing = await waitlistRepository.findByEmail(email)\n\t\tif (existing) {\n\t\t\tlogger.info('Waitlist duplicate signup attempt', { email })\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tmessage: \"You're already on the waitlist! We'll be in touch soon.\",\n\t\t\t}\n\t\t}\n\n\t\tconst id = crypto.randomUUID()\n\t\tawait waitlistRepository.create({\n\t\t\tid,\n\t\t\temail,\n\t\t\tsource: input.source ?? null,\n\t\t\tmetadata: null,\n\t\t})\n\n\t\tlogger.info('New waitlist signup', { email, source: input.source })\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tmessage: \"You're on the list! We'll be in touch.\",\n\t\t}\n\t}\n}\n","import { publicProcedure } from '@kuckit/api'\nimport { z } from 'zod'\nimport type { JoinWaitlistInput, JoinWaitlistOutput } from '../use-cases/join-waitlist'\n\nconst joinWaitlistInputSchema = z.object({\n\temail: z.string().email('Please enter a valid email address'),\n\tsource: z.string().optional(),\n})\n\nconst joinWaitlistOutputSchema = z.object({\n\tsuccess: z.boolean(),\n\tmessage: z.string(),\n})\n\ninterface WaitlistCradle {\n\tjoinWaitlist: (input: JoinWaitlistInput) => Promise<JoinWaitlistOutput>\n}\n\nexport const waitlistRouter = {\n\tjoin: publicProcedure\n\t\t.input(joinWaitlistInputSchema)\n\t\t.output(joinWaitlistOutputSchema)\n\t\t.handler(async ({ input, context }): Promise<JoinWaitlistOutput> => {\n\t\t\tconst { joinWaitlist } = context.di.cradle as WaitlistCradle\n\t\t\treturn joinWaitlist(input)\n\t\t}),\n}\n","import { defineKuckitModule, asFunction, type KuckitModuleContext } from '@kuckit/sdk'\nimport { waitlistTable } from './schema'\nimport { makeWaitlistRepository } from './repository/waitlist.repository'\nimport { makeJoinWaitlistUseCase } from './use-cases/join-waitlist'\nimport { waitlistRouter } from './router/waitlist.router'\n\nexport type LandingModuleConfig = Record<string, never>\n\nexport const kuckitModule = defineKuckitModule<LandingModuleConfig>({\n\tid: 'kuckit.landing',\n\tdisplayName: 'Landing',\n\tdescription: 'Landing module for Kuckit',\n\tversion: '0.1.0',\n\n\tasync register(ctx: KuckitModuleContext<LandingModuleConfig>) {\n\t\tconst { container } = ctx\n\n\t\tctx.registerSchema('landing_waitlist', waitlistTable)\n\n\t\tcontainer.register({\n\t\t\twaitlistRepository: asFunction(({ db }) => makeWaitlistRepository(db)).scoped(),\n\t\t\tjoinWaitlist: asFunction(({ waitlistRepository, logger }) =>\n\t\t\t\tmakeJoinWaitlistUseCase({ waitlistRepository, logger })\n\t\t\t).scoped(),\n\t\t})\n\t},\n\n\tregisterApi(ctx) {\n\t\tctx.addApiRegistration({\n\t\t\ttype: 'rpc-router',\n\t\t\tname: 'waitlist',\n\t\t\trouter: waitlistRouter,\n\t\t})\n\t},\n\n\tasync onBootstrap(ctx: KuckitModuleContext<LandingModuleConfig>) {\n\t\tconst { container } = ctx\n\t\tconst logger = container.resolve('logger')\n\t\tlogger.info('Landing module initialized')\n\t},\n\n\tasync onShutdown(ctx: KuckitModuleContext<LandingModuleConfig>) {\n\t\tconst { container } = ctx\n\t\tconst logger = container.resolve('logger')\n\t\tlogger.info('Landing module shutting down')\n\t},\n})\n"],"mappings":";;;;;;;AAEA,MAAa,gBAAgB,QAAQ,oBAAoB;CACxD,IAAI,KAAK,KAAK,CAAC,YAAY;CAC3B,OAAO,KAAK,QAAQ,CAAC,SAAS,CAAC,QAAQ;CACvC,QAAQ,KAAK,SAAS;CACtB,UAAU,MAAM,WAAW;CAC3B,WAAW,UAAU,aAAa,CAAC,SAAS,CAAC,YAAY;CACzD,CAAC;;;;ACEF,MAAa,0BAA0B,QAA4C;CAClF,MAAM,YAAY,OAA8C;AAO/D,UANa,MAAM,GACjB,QAAQ,CACR,KAAK,cAAc,CACnB,MAAM,GAAG,cAAc,OAAO,MAAM,CAAC,CACrC,MAAM,EAAE,EAEE,MAAM;;CAGnB,MAAM,OAAO,OAAiD;EAC7D,MAAM,CAAC,WAAW,MAAM,GAAG,OAAO,cAAc,CAAC,OAAO,MAAM,CAAC,WAAW;AAC1E,MAAI,CAAC,QACJ,OAAM,IAAI,MAAM,kCAAkC;AAEnD,SAAO;;CAGR,MAAM,QAAyB;EAC9B,MAAM,CAAC,UAAU,MAAM,GAAG,OAAO,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,KAAK,cAAc;AACxE,SAAO,QAAQ,SAAS;;CAEzB;;;;ACfD,MAAa,2BAA2B,SAA2B;AAClE,QAAO,OAAO,UAA0D;EACvE,MAAM,EAAE,oBAAoB,WAAW;EACvC,MAAM,QAAQ,MAAM,MAAM,aAAa,CAAC,MAAM;AAG9C,MADiB,MAAM,mBAAmB,YAAY,MAAM,EAC9C;AACb,UAAO,KAAK,qCAAqC,EAAE,OAAO,CAAC;AAC3D,UAAO;IACN,SAAS;IACT,SAAS;IACT;;EAGF,MAAM,KAAK,OAAO,YAAY;AAC9B,QAAM,mBAAmB,OAAO;GAC/B;GACA;GACA,QAAQ,MAAM,UAAU;GACxB,UAAU;GACV,CAAC;AAEF,SAAO,KAAK,uBAAuB;GAAE;GAAO,QAAQ,MAAM;GAAQ,CAAC;AAEnE,SAAO;GACN,SAAS;GACT,SAAS;GACT;;;;;;ACzCH,MAAM,0BAA0B,EAAE,OAAO;CACxC,OAAO,EAAE,QAAQ,CAAC,MAAM,qCAAqC;CAC7D,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,CAAC;AAEF,MAAM,2BAA2B,EAAE,OAAO;CACzC,SAAS,EAAE,SAAS;CACpB,SAAS,EAAE,QAAQ;CACnB,CAAC;AAMF,MAAa,iBAAiB,EAC7B,MAAM,gBACJ,MAAM,wBAAwB,CAC9B,OAAO,yBAAyB,CAChC,QAAQ,OAAO,EAAE,OAAO,cAA2C;CACnE,MAAM,EAAE,iBAAiB,QAAQ,GAAG;AACpC,QAAO,aAAa,MAAM;EACzB,EACH;;;;AClBD,MAAa,eAAe,mBAAwC;CACnE,IAAI;CACJ,aAAa;CACb,aAAa;CACb,SAAS;CAET,MAAM,SAAS,KAA+C;EAC7D,MAAM,EAAE,cAAc;AAEtB,MAAI,eAAe,oBAAoB,cAAc;AAErD,YAAU,SAAS;GAClB,oBAAoB,YAAY,EAAE,SAAS,uBAAuB,GAAG,CAAC,CAAC,QAAQ;GAC/E,cAAc,YAAY,EAAE,oBAAoB,aAC/C,wBAAwB;IAAE;IAAoB;IAAQ,CAAC,CACvD,CAAC,QAAQ;GACV,CAAC;;CAGH,YAAY,KAAK;AAChB,MAAI,mBAAmB;GACtB,MAAM;GACN,MAAM;GACN,QAAQ;GACR,CAAC;;CAGH,MAAM,YAAY,KAA+C;EAChE,MAAM,EAAE,cAAc;AAEtB,EADe,UAAU,QAAQ,SAAS,CACnC,KAAK,6BAA6B;;CAG1C,MAAM,WAAW,KAA+C;EAC/D,MAAM,EAAE,cAAc;AAEtB,EADe,UAAU,QAAQ,SAAS,CACnC,KAAK,+BAA+B;;CAE5C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kuckit/landing-module",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Landing module for Kuckit",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "src/server/module.ts",
|
|
7
|
+
"types": "src/server/module.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./src/server/module.ts",
|
|
14
|
+
"default": "./src/server/module.ts"
|
|
15
|
+
},
|
|
16
|
+
"./client": {
|
|
17
|
+
"types": "./src/client/index.ts",
|
|
18
|
+
"default": "./src/client/index.ts"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"main": "dist/server/module.js",
|
|
23
|
+
"types": "dist/server/module.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/server/module.d.ts",
|
|
27
|
+
"default": "./dist/server/module.js"
|
|
28
|
+
},
|
|
29
|
+
"./client": {
|
|
30
|
+
"types": "./dist/client/index.d.ts",
|
|
31
|
+
"default": "./dist/client/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./server/router": {
|
|
34
|
+
"types": "./src/server/router/waitlist.router.ts",
|
|
35
|
+
"default": "./src/server/router/waitlist.router.ts"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"kuckit": {
|
|
40
|
+
"id": "kuckit.landing",
|
|
41
|
+
"server": ".",
|
|
42
|
+
"client": "./client"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsdown"
|
|
46
|
+
},
|
|
47
|
+
"peerDependencies": {
|
|
48
|
+
"@kuckit/sdk": "workspace:*",
|
|
49
|
+
"@kuckit/sdk-react": "workspace:*",
|
|
50
|
+
"react": "^18 || ^19",
|
|
51
|
+
"sonner": "^2.0.0",
|
|
52
|
+
"typescript": "^5"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@kuckit/api": "workspace:*",
|
|
56
|
+
"@kuckit/domain": "workspace:*",
|
|
57
|
+
"drizzle-orm": "^0.44.2",
|
|
58
|
+
"lucide-react": "^0.379.0",
|
|
59
|
+
"zod": "catalog:"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@types/react": "^19.0.0",
|
|
63
|
+
"sonner": "^2.0.0",
|
|
64
|
+
"tsdown": "catalog:"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { defineKuckitModule, asFunction, type KuckitModuleContext } from '@kuckit/sdk'
|
|
2
|
+
import { waitlistTable } from './schema'
|
|
3
|
+
import { makeWaitlistRepository } from './repository/waitlist.repository'
|
|
4
|
+
import { makeJoinWaitlistUseCase } from './use-cases/join-waitlist'
|
|
5
|
+
import { waitlistRouter } from './router/waitlist.router'
|
|
6
|
+
|
|
7
|
+
export type LandingModuleConfig = Record<string, never>
|
|
8
|
+
|
|
9
|
+
export const kuckitModule = defineKuckitModule<LandingModuleConfig>({
|
|
10
|
+
id: 'kuckit.landing',
|
|
11
|
+
displayName: 'Landing',
|
|
12
|
+
description: 'Landing module for Kuckit',
|
|
13
|
+
version: '0.1.0',
|
|
14
|
+
|
|
15
|
+
async register(ctx: KuckitModuleContext<LandingModuleConfig>) {
|
|
16
|
+
const { container } = ctx
|
|
17
|
+
|
|
18
|
+
ctx.registerSchema('landing_waitlist', waitlistTable)
|
|
19
|
+
|
|
20
|
+
container.register({
|
|
21
|
+
waitlistRepository: asFunction(({ db }) => makeWaitlistRepository(db)).scoped(),
|
|
22
|
+
joinWaitlist: asFunction(({ waitlistRepository, logger }) =>
|
|
23
|
+
makeJoinWaitlistUseCase({ waitlistRepository, logger })
|
|
24
|
+
).scoped(),
|
|
25
|
+
})
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
registerApi(ctx) {
|
|
29
|
+
ctx.addApiRegistration({
|
|
30
|
+
type: 'rpc-router',
|
|
31
|
+
name: 'waitlist',
|
|
32
|
+
router: waitlistRouter,
|
|
33
|
+
})
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
async onBootstrap(ctx: KuckitModuleContext<LandingModuleConfig>) {
|
|
37
|
+
const { container } = ctx
|
|
38
|
+
const logger = container.resolve('logger')
|
|
39
|
+
logger.info('Landing module initialized')
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
async onShutdown(ctx: KuckitModuleContext<LandingModuleConfig>) {
|
|
43
|
+
const { container } = ctx
|
|
44
|
+
const logger = container.resolve('logger')
|
|
45
|
+
logger.info('Landing module shutting down')
|
|
46
|
+
},
|
|
47
|
+
})
|