From cd16f8b883663248bacc93db95e2758e9cf9a66d Mon Sep 17 00:00:00 2001 From: "Zeko (Hermes)" Date: Fri, 5 Jun 2026 06:32:39 +0700 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20landing=20page=20cleanup=20=E2=80=94?= =?UTF-8?q?=20adopt=20uteke=20design=20system=20layout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rewrite +page.svelte using uteke template structure - All sections centered with max-w-4xl mx-auto text-center - Clean navbar with sticky backdrop-blur (uteke pattern) - Footer with proper links (uteke pattern) - Simplified CSS: removed 1000+ lines of unused styles - Added FAQ section with accordion - Added comparison table vs CodeRabbit/Copilot/SonarQube - Terminal demo with cycling commands - Proper separator-gradient between sections - Consistent animation classes (animate-fade-in with delays) --- website/src/app.css | 1179 ++++------------------------- website/src/routes/+layout.svelte | 43 +- website/src/routes/+page.svelte | 591 ++++++--------- 3 files changed, 377 insertions(+), 1436 deletions(-) diff --git a/website/src/app.css b/website/src/app.css index 25df3bf6..fb707c41 100644 --- a/website/src/app.css +++ b/website/src/app.css @@ -2,1139 +2,248 @@ /* ============================================ DESIGN SYSTEM โ€” cora CLI - 8px grid ยท Linear-inspired dark theme - Spacing reference: Linear, Supabase, Vercel + Based on uteke pattern, oklch color space ============================================ */ -/* ---- CSS Custom Properties (oklch color space) ---- */ :root { - --background: oklch(0.13 0.01 270); - --foreground: oklch(0.92 0.01 270); - --card: oklch(0.17 0.01 270); - --card-foreground: oklch(0.92 0.01 270); - --muted: oklch(0.22 0.01 270); - --muted-foreground: oklch(0.65 0.01 270); - --accent: oklch(0.65 0.22 270); - --accent-bright: oklch(0.72 0.2 270); - --accent-foreground: oklch(0.98 0 0); - --accent-dim: oklch(0.45 0.12 270); - --success: oklch(0.72 0.19 145); - --warning: oklch(0.78 0.15 85); - --destructive: oklch(0.55 0.22 25); - --border: oklch(0.27 0.01 270); - --border-subtle: oklch(0.22 0.01 270); - --ring: oklch(0.65 0.22 270); - --shadow-card: 0 1px 3px oklch(0 0 0 / 0.3); - --shadow-card-hover: 0 4px 12px oklch(0 0 0 / 0.4); - - /* Font families */ - --font-sans: 'Inter', system-ui, -apple-system, sans-serif; - --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace; - - /* ---- 8px Spacing Scale ---- */ - --space-0: 0; - --space-1: 0.25rem; /* 4px */ - --space-2: 0.5rem; /* 8px */ - --space-3: 0.75rem; /* 12px */ - --space-4: 1rem; /* 16px */ - --space-5: 1.25rem; /* 20px */ - --space-6: 1.5rem; /* 24px */ - --space-8: 2rem; /* 32px */ - --space-10: 2.5rem; /* 40px */ - --space-12: 3rem; /* 48px */ - --space-16: 4rem; /* 64px */ - --space-20: 5rem; /* 80px */ - --space-24: 6rem; /* 96px */ - --space-32: 8rem; /* 128px */ -} - -/* ---- Tailwind v4 Theme Tokens ---- */ -@theme { - --color-background: oklch(0.13 0.01 270); - --color-foreground: oklch(0.92 0.01 270); - --color-card: oklch(0.17 0.01 270); - --color-card-foreground: oklch(0.92 0.01 270); - --color-muted: oklch(0.22 0.01 270); - --color-muted-muted-foreground: oklch(0.65 0.01 270); - --color-accent: oklch(0.65 0.22 270); - --color-accent-foreground: oklch(0.98 0 0); - --color-success: oklch(0.72 0.19 145); - --color-warning: oklch(0.78 0.15 85); - --color-destructive: oklch(0.55 0.22 25); - --color-border: oklch(0.27 0.01 270); - --color-ring: oklch(0.65 0.22 270); - --font-family-sans: 'Inter', system-ui, -apple-system, sans-serif; - --font-family-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace; -} - -/* ---- Base Reset ---- */ -*, -*::before, -*::after { - margin: 0; - padding: 0; - box-sizing: border-box; + --background: oklch(0.13 0.01 270); + --foreground: oklch(0.92 0.01 270); + --card: oklch(0.17 0.01 270); + --muted: oklch(0.22 0.01 270); + --muted-foreground: oklch(0.65 0.01 270); + --accent: oklch(0.65 0.22 270); + --accent-bright: oklch(0.72 0.2 270); + --accent-foreground: oklch(0.98 0 0); + --accent-dim: oklch(0.45 0.12 270); + --success: oklch(0.72 0.19 145); + --border: oklch(0.27 0.01 270); + --border-subtle: oklch(0.22 0.01 270); } html { - background-color: var(--background); - color: var(--foreground); - font-family: var(--font-sans); - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizeLegibility; - scroll-behavior: smooth; + background-color: var(--background); + color: var(--foreground); + font-family: 'Inter', system-ui, -apple-system, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + scroll-behavior: smooth; } body { - min-height: 100vh; - line-height: 1.5; - overflow-x: hidden; + min-height: 100vh; + line-height: 1.5; } -/* ---- Selection ---- */ ::selection { - background: oklch(0.65 0.22 270 / 0.3); - color: var(--accent-foreground); -} - -/* ---- Scrollbar ---- */ -::-webkit-scrollbar { - width: 6px; - height: 6px; -} - -::-webkit-scrollbar-track { - background: var(--muted); + background: oklch(0.65 0.22 270 / 0.3); + color: var(--accent-foreground); } -::-webkit-scrollbar-thumb { - background: var(--muted-foreground); - border-radius: 3px; +code, .font-mono { + font-family: 'JetBrains Mono', ui-monospace, monospace; } -::-webkit-scrollbar-thumb:hover { - background: oklch(0.75 0.01 270); -} +/* ---- Scrollbar ---- */ +::-webkit-scrollbar { width: 6px; height: 6px; } +::-webkit-scrollbar-track { background: var(--muted); } +::-webkit-scrollbar-thumb { background: var(--muted-foreground); border-radius: 3px; } +::-webkit-scrollbar-thumb:hover { background: oklch(0.75 0.01 270); } /* ============================================ - ANIMATIONS (motion OK) + ANIMATIONS ============================================ */ @media (prefers-reduced-motion: no-preference) { - @keyframes fade-in-up { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } - } - - @keyframes fade-in { - from { opacity: 0; } - to { opacity: 1; } - } - - @keyframes typing-cursor { - 0%, 100% { opacity: 1; } - 50% { opacity: 0; } - } - - @keyframes subtle-float { - 0%, 100% { transform: translateY(0); } - 50% { transform: translateY(-6px); } - } + @keyframes fade-in-up { + from { opacity: 0; transform: translateY(20px); } + to { opacity: 1; transform: translateY(0); } + } - @keyframes glow { - 0%, 100% { - box-shadow: 0 0 8px oklch(0.65 0.22 270 / 0.15), - 0 0 20px oklch(0.65 0.22 270 / 0.05); - } - 50% { - box-shadow: 0 0 12px oklch(0.65 0.22 270 / 0.25), - 0 0 30px oklch(0.65 0.22 270 / 0.1); - } - } + @keyframes blink { + 0%, 50% { opacity: 1; } + 51%, 100% { opacity: 0; } + } - @keyframes blink { - 0%, 50% { opacity: 1; } - 51%, 100% { opacity: 0; } - } + .animate-fade-in { animation: fade-in-up 0.6s ease-out forwards; } + .animate-fade-in-delay-1 { animation: fade-in-up 0.6s ease-out 0.1s forwards; opacity: 0; } + .animate-fade-in-delay-2 { animation: fade-in-up 0.6s ease-out 0.2s forwards; opacity: 0; } + .animate-fade-in-delay-3 { animation: fade-in-up 0.6s ease-out 0.3s forwards; opacity: 0; } + .animate-fade-in-delay-4 { animation: fade-in-up 0.6s ease-out 0.4s forwards; opacity: 0; } - .animate-fade-in-up { - animation: fade-in-up 0.6s ease-out forwards; - } - - .animate-fade-in { - animation: fade-in-up 0.6s ease-out forwards; - } - - .animate-fade-in-delay-1 { - animation: fade-in-up 0.6s ease-out 0.1s forwards; - opacity: 0; - } - - .animate-fade-in-delay-2 { - animation: fade-in-up 0.6s ease-out 0.2s forwards; - opacity: 0; - } - - .animate-fade-in-delay-3 { - animation: fade-in-up 0.6s ease-out 0.3s forwards; - opacity: 0; - } - - .animate-fade-in-delay-4 { - animation: fade-in-up 0.6s ease-out 0.4s forwards; - opacity: 0; - } - - .delay-100 { animation-delay: 100ms; opacity: 0; } - .delay-200 { animation-delay: 200ms; opacity: 0; } - .delay-300 { animation-delay: 300ms; opacity: 0; } - .delay-400 { animation-delay: 400ms; opacity: 0; } - .delay-500 { animation-delay: 500ms; opacity: 0; } + .cursor-blink { animation: blink 1s step-end infinite; } } -/* ---- Reduced Motion: disable ALL ---- */ @media (prefers-reduced-motion: reduce) { - *, - *::before, - *::after { - animation-duration: 0.01ms !important; - animation-iteration-count: 1 !important; - transition-duration: 0.01ms !important; - transform: none !important; - } - html { - scroll-behavior: auto; - } - .scroll-reveal { - opacity: 1 !important; - transform: none !important; - } - .animate-fade-in-up, - .animate-fade-in, - .animate-fade-in-delay-1, - .animate-fade-in-delay-2, - .animate-fade-in-delay-3, - .animate-fade-in-delay-4 { - opacity: 1 !important; - transform: none !important; - } - .delay-100, .delay-200, .delay-300, .delay-400, .delay-500 { - opacity: 1 !important; - } -} - -/* ---- Scroll Reveal ---- */ -.scroll-reveal { - opacity: 0; - transform: translateY(12px); - transition: opacity 0.5s ease-out, transform 0.5s ease-out; -} - -.scroll-reveal.revealed { - opacity: 1; - transform: translateY(0); + *, *::before, *::after { + animation-duration: 0.01ms !important; + transition-duration: 0.01ms !important; + } + html { scroll-behavior: auto; } + .animate-fade-in, .animate-fade-in-delay-1, .animate-fade-in-delay-2, + .animate-fade-in-delay-3, .animate-fade-in-delay-4 { opacity: 1 !important; } } /* ============================================ - HERO EFFECTS (from uteke pattern) + HERO EFFECTS (uteke pattern) ============================================ */ - -/* Hero gradient text */ .hero-gradient { - background: linear-gradient(135deg, oklch(0.72 0.2 270), oklch(0.65 0.22 270), oklch(0.6 0.18 240)); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; + background: linear-gradient(135deg, oklch(0.72 0.2 270), oklch(0.65 0.22 270), oklch(0.6 0.18 240)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; } -/* Subtle glow effect */ .glow-purple { - box-shadow: 0 0 60px -12px oklch(0.65 0.22 270 / 0.2); + box-shadow: 0 0 60px -12px oklch(0.65 0.22 270 / 0.2); } .glow-text { - text-shadow: 0 0 40px oklch(0.65 0.22 270 / 0.25); + text-shadow: 0 0 40px oklch(0.65 0.22 270 / 0.25); } -/* Grid background pattern */ .grid-bg { - background-image: - linear-gradient(oklch(0.65 0.22 270 / 0.03) 1px, transparent 1px), - linear-gradient(90deg, oklch(0.65 0.22 270 / 0.03) 1px, transparent 1px); - background-size: 64px 64px; + background-image: + linear-gradient(oklch(0.65 0.22 270 / 0.03) 1px, transparent 1px), + linear-gradient(90deg, oklch(0.65 0.22 270 / 0.03) 1px, transparent 1px); + background-size: 64px 64px; } /* ============================================ - TERMINAL BLOCK (from uteke pattern) + TERMINAL BLOCK (uteke pattern) ============================================ */ - -/* Terminal code block with top accent line */ .terminal-block { - background: linear-gradient(135deg, var(--card), var(--muted)); - border: 1px solid var(--border); - position: relative; + background: linear-gradient(135deg, var(--card), var(--muted)); + border: 1px solid var(--border); + position: relative; } .terminal-block::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - height: 1px; - background: linear-gradient(90deg, transparent, var(--accent), transparent); - opacity: 0.4; + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 1px; + background: linear-gradient(90deg, transparent, var(--accent), transparent); + opacity: 0.4; } /* ============================================ - FEATURE CARD (from uteke pattern) + FEATURE CARD (uteke pattern) ============================================ */ - .feature-card { - transition: all 200ms ease-out; + transition: all 200ms ease-out; } .feature-card:hover { - transform: translateY(-2px); - border-color: var(--accent-dim); - background-color: var(--muted); + transform: translateY(-2px); + border-color: var(--accent-dim); + background-color: var(--muted); } /* ============================================ - CTA BUTTONS (from uteke pattern) + CTA BUTTONS (uteke pattern) ============================================ */ - .cta-primary { - display: inline-flex; - align-items: center; - justify-content: center; - gap: var(--space-2); - background: var(--accent); - color: var(--accent-foreground); - border-radius: var(--space-2); - padding: var(--space-2) var(--space-5); - font-weight: 600; - font-size: 14px; - font-family: var(--font-sans); - min-height: 44px; - border: none; - cursor: pointer; - text-decoration: none; - transition: all 200ms ease-out; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + background: var(--accent); + color: var(--accent-foreground); + border-radius: 0.5rem; + padding: 0.5rem 1.25rem; + font-weight: 600; + font-size: 14px; + font-family: 'Inter', system-ui, sans-serif; + min-height: 44px; + border: none; + cursor: pointer; + text-decoration: none; + transition: all 200ms ease-out; } .cta-primary:hover { - transform: translateY(-1px); - box-shadow: 0 0 24px oklch(0.65 0.22 270 / 0.35); + transform: translateY(-1px); + box-shadow: 0 0 24px oklch(0.65 0.22 270 / 0.35); } .cta-primary:active { - transform: translateY(0); + transform: translateY(0); } .cta-secondary { - display: inline-flex; - align-items: center; - justify-content: center; - gap: var(--space-2); - background: transparent; - color: var(--muted-foreground); - border: 1px solid var(--border); - border-radius: var(--space-2); - padding: var(--space-2) var(--space-5); - font-weight: 500; - font-size: 14px; - font-family: var(--font-sans); - min-height: 44px; - cursor: pointer; - text-decoration: none; - transition: all 200ms ease-out; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + background: transparent; + color: var(--muted-foreground); + border: 1px solid var(--border); + border-radius: 0.5rem; + padding: 0.5rem 1.25rem; + font-weight: 500; + font-size: 14px; + font-family: 'Inter', system-ui, sans-serif; + min-height: 44px; + cursor: pointer; + text-decoration: none; + transition: all 200ms ease-out; } .cta-secondary:hover { - border-color: var(--accent); - color: var(--accent); -} - -/* ============================================ - CURSOR & FLOAT ANIMATION (from uteke) - ============================================ */ - -.cursor-blink { - animation: blink 1s step-end infinite; -} - -.float-animation { - animation: subtle-float 3s ease-in-out infinite; + border-color: var(--accent); + color: var(--accent); } /* ============================================ - COMMAND SYNTAX HIGHLIGHTING (from uteke) + COMMAND SYNTAX HIGHLIGHTING (uteke) ============================================ */ - -.cmd-highlight { - color: var(--accent-bright); -} - -.cmd-flag { - color: oklch(0.75 0.15 240); -} - -.cmd-string { - color: oklch(0.78 0.16 155); -} - -.cmd-comment { - color: var(--muted-foreground); -} +.cmd-highlight { color: var(--accent-bright); } +.cmd-flag { color: oklch(0.75 0.15 240); } +.cmd-string { color: oklch(0.78 0.16 155); } +.cmd-comment { color: var(--muted-foreground); } /* ============================================ - SEPARATOR GRADIENT (from uteke) + SEPARATOR & TABLE (uteke) ============================================ */ - .separator-gradient { - height: 1px; - background: linear-gradient(90deg, transparent, var(--border), transparent); - max-width: 1152px; - margin-left: auto; - margin-right: auto; + height: 1px; + background: linear-gradient(90deg, transparent, var(--border), transparent); + max-width: 896px; + margin-left: auto; + margin-right: auto; } -/* ============================================ - COMPARISON TABLE (from uteke pattern) - ============================================ */ - .compare-table { - width: 100%; - border-collapse: collapse; + width: 100%; + border-collapse: collapse; } .compare-table th, .compare-table td { - padding: var(--space-3) var(--space-5); - border-bottom: 1px solid oklch(0.27 0.01 270 / 0.5); - text-align: left; - font-size: 14px; - color: var(--foreground); + padding: 0.75rem 1rem; + border-bottom: 1px solid oklch(0.27 0.01 270 / 0.5); + text-align: left; + font-size: 14px; } .compare-table thead th { - color: var(--muted-foreground); - font-weight: 500; - font-size: 12px; - text-transform: uppercase; - letter-spacing: 0.05em; - padding-bottom: var(--space-3); + color: var(--muted-foreground); + font-weight: 500; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 0.05em; } .compare-table tbody tr:last-child td { - border-bottom: none; -} - -.compare-table .cora-col { - background: oklch(0.65 0.22 270 / 0.05); - font-weight: 500; + border-bottom: none; } -.compare-table thead .cora-col { - background: oklch(0.65 0.22 270 / 0.1); - color: var(--accent); -} - -/* Highlight column (uteke pattern) */ .compare-table th.highlight-col { - background-color: var(--muted); - border-bottom: 2px solid var(--accent); + background-color: var(--muted); + border-bottom: 2px solid var(--accent); } .compare-table td.highlight-col { - background-color: var(--card); -} - -/* ============================================ - GLASS CARD (cora original) - ============================================ */ - -.glass-card { - background: var(--card); - border-radius: var(--space-4); - padding: var(--space-6); - box-shadow: var(--shadow-card); - border: 1px solid oklch(0.27 0.01 270 / 0.5); - transition: box-shadow 0.3s ease-out, transform 0.3s ease-out, border-color 0.3s ease-out; -} - -.glass-card:hover { - box-shadow: var(--shadow-card-hover); - transform: translateY(-2px); - border-color: var(--accent-dim); -} - -/* ============================================ - TERMINAL (cora original) - ============================================ */ - -.terminal { - background: oklch(0.10 0 0); - border-radius: var(--space-3); - border: 1px solid var(--border); - overflow: hidden; - font-family: var(--font-mono); -} - -.terminal-header { - display: flex; - align-items: center; - gap: var(--space-2); - padding: var(--space-3) var(--space-4); - border-bottom: 1px solid oklch(0.27 0.01 270 / 0.5); - position: relative; -} - -.terminal-dot { - width: var(--space-3); - height: var(--space-3); - border-radius: 9999px; - flex-shrink: 0; -} - -.terminal-dot-red { background: var(--destructive); } -.terminal-dot-yellow { background: var(--warning); } -.terminal-dot-green { background: var(--success); } - -.terminal-title { - font-family: var(--font-mono); - font-size: 12px; - color: var(--muted-foreground); - margin-left: var(--space-2); -} - -.terminal-body { - padding: var(--space-5); - font-family: var(--font-mono); - font-size: 14px; - line-height: 1.625; - color: var(--foreground); -} - -/* ============================================ - BUTTONS (cora original โ€” kept for compatibility) - ============================================ */ - -.btn-primary { - display: inline-flex; - align-items: center; - justify-content: center; - gap: var(--space-2); - background: var(--accent); - color: var(--accent-foreground); - border-radius: var(--space-2); - padding: var(--space-2) var(--space-5); - font-weight: 500; - font-size: 14px; - font-family: var(--font-sans); - min-height: 44px; - border: none; - cursor: pointer; - text-decoration: none; - transition: opacity 0.2s ease; -} - -.btn-primary:hover { - opacity: 0.9; -} - -.btn-primary:active { - opacity: 0.8; -} - -.btn-ghost { - display: inline-flex; - align-items: center; - justify-content: center; - gap: var(--space-2); - background: transparent; - color: var(--foreground); - border: 1px solid var(--border); - border-radius: var(--space-2); - padding: var(--space-2) var(--space-5); - font-weight: 500; - font-size: 14px; - font-family: var(--font-sans); - min-height: 44px; - cursor: pointer; - text-decoration: none; - transition: background-color 0.2s ease, border-color 0.2s ease; -} - -.btn-ghost:hover { - background: var(--muted); - border-color: oklch(0.35 0.01 270); -} - -.btn-ghost:active { - background: oklch(0.25 0.01 270); -} - -/* ============================================ - SECTION CONTAINER (8px grid based) - ============================================ */ - -.section { - max-width: 1152px; - margin-left: auto; - margin-right: auto; - padding-left: var(--space-6); - padding-right: var(--space-6); -} - -@media (min-width: 768px) { - .section { - padding-left: var(--space-8); - padding-right: var(--space-8); - } -} - -@media (min-width: 1280px) { - .section { - padding-left: var(--space-10); - padding-right: var(--space-10); - } -} - -.section-hero { - padding-top: var(--space-20); - padding-bottom: var(--space-16); -} - -.section-tall { - padding-top: var(--space-16); - padding-bottom: var(--space-16); -} - -.section-compact { - padding-top: var(--space-12); - padding-bottom: var(--space-12); -} - -@media (min-width: 768px) { - .section-hero { - padding-top: var(--space-24); - padding-bottom: var(--space-20); - } - .section-tall { - padding-top: var(--space-24); - padding-bottom: var(--space-24); - } - .section-compact { - padding-top: var(--space-16); - padding-bottom: var(--space-16); - } -} - -@media (min-width: 1280px) { - .section-hero { - padding-top: var(--space-32); - padding-bottom: var(--space-24); - } - .section-tall { - padding-top: var(--space-32); - padding-bottom: var(--space-32); - } -} - -/* ============================================ - BADGE - ============================================ */ - -.badge { - display: inline-flex; - align-items: center; - gap: var(--space-1); - font-size: 12px; - font-weight: 500; - background: var(--muted); - color: var(--muted-foreground); - border-radius: 9999px; - padding: var(--space-1) var(--space-2); - line-height: 1.5; - letter-spacing: 0.01em; -} - -.badge-dot { - width: 6px; - height: 6px; - border-radius: 9999px; - background: var(--success); -} - -.accent-badge { - display: inline-flex; - align-items: center; - gap: var(--space-1); - font-size: 12px; - font-weight: 500; - background: oklch(0.65 0.22 270 / 0.15); - color: var(--accent); - border-radius: 9999px; - padding: var(--space-1) var(--space-2); - line-height: 1.5; - letter-spacing: 0.01em; -} - -/* ============================================ - TYPING CURSOR - ============================================ */ - -.typing-cursor { - display: inline-block; - width: 8px; - height: 1.1em; - background: var(--accent); - margin-left: 2px; - vertical-align: text-bottom; - animation: typing-cursor 1s step-end infinite; -} - -/* ============================================ - COPY BUTTON - ============================================ */ - -.copy-btn { - position: absolute; - top: var(--space-3); - right: var(--space-3); - display: flex; - align-items: center; - gap: var(--space-1); - padding: var(--space-1) var(--space-2); - background: var(--muted); - border: 1px solid var(--border); - border-radius: var(--space-1); - color: var(--muted-foreground); - font-size: 12px; - font-family: var(--font-sans); - cursor: pointer; - transition: background-color 0.2s ease, color 0.2s ease; - min-height: 44px; - min-width: 44px; - justify-content: center; -} - -.copy-btn:hover { - background: oklch(0.28 0.01 270); - color: var(--foreground); -} - -.copy-btn.copied { - color: var(--success); - border-color: oklch(0.72 0.19 145 / 0.3); -} - -/* ============================================ - SYNTAX HIGHLIGHTING (cora original) - ============================================ */ - -.syntax-cmd { color: var(--muted-foreground); } -.syntax-flag { color: oklch(0.75 0.15 240); } -.syntax-string { color: var(--success); } -.syntax-comment { color: var(--muted-foreground); } -.syntax-highlight { color: var(--accent); } -.syntax-success { color: var(--success); } -.syntax-warning { color: var(--warning); } -.syntax-error { color: var(--destructive); } - -/* ============================================ - CHECK/X SYMBOLS - ============================================ */ - -.symbol-check { - color: var(--success); - font-weight: 600; -} - -.symbol-cross { - color: var(--muted-foreground); - font-weight: 600; -} - -/* ============================================ - CONNECT LINE (How It Works) - ============================================ */ - -.connect-line { - position: relative; - flex: 1; - display: flex; - align-items: center; - justify-content: center; - min-width: var(--space-10); -} - -.connect-line::after { - content: ''; - display: block; - width: 100%; - max-width: var(--space-10); - height: 1px; - background: linear-gradient( - 90deg, - transparent, - oklch(0.65 0.22 270 / 0.4), - transparent - ); -} - -/* ============================================ - FEATURE ICON - ============================================ */ - -.feature-icon { - width: var(--space-12); - height: var(--space-12); - display: flex; - align-items: center; - justify-content: center; - border-radius: var(--space-3); - background: oklch(0.65 0.22 270 / 0.1); -} - -.feature-icon svg { - width: var(--space-6); - height: var(--space-6); - color: var(--accent); -} - -/* ============================================ - TIMELINE STEP - ============================================ */ - -.timeline-step { - display: flex; - gap: var(--space-5); - align-items: flex-start; -} - -.timeline-number { - width: var(--space-10); - height: var(--space-10); - display: flex; - align-items: center; - justify-content: center; - border-radius: 9999px; - background: oklch(0.65 0.22 270 / 0.15); - color: var(--accent); - font-weight: 700; - font-size: 14px; - flex-shrink: 0; -} - -/* ============================================ - DOCS LAYOUT (preserved for docs pages) - ============================================ */ - -.docs-sidebar { - position: sticky; - top: 3.5rem; - height: calc(100vh - 3.5rem); - overflow-y: auto; - width: 16rem; - flex-shrink: 0; - padding-top: var(--space-8); - border-right: 1px solid var(--border); -} - -.docs-sidebar-link { - display: flex; - align-items: center; - gap: var(--space-2); - padding: var(--space-2) var(--space-3); - border-radius: var(--space-2); - color: var(--muted-foreground); - font-size: 14px; - text-decoration: none; - transition: background-color 0.15s ease, color 0.15s ease; - min-height: 44px; -} - -.docs-sidebar-link:hover { - background: var(--muted); - color: var(--foreground); -} - -.docs-sidebar-link.active { - background: oklch(0.65 0.22 270 / 0.1); - color: var(--accent); -} - -.docs-content { - flex: 1; - min-width: 0; - padding: var(--space-8) var(--space-8) var(--space-16); -} - -.docs-content h1 { - font-size: 2rem; - font-weight: 700; - letter-spacing: -0.025em; - line-height: 1.2; - margin-bottom: var(--space-4); - color: var(--foreground); -} - -.docs-content h2 { - font-size: 1.375rem; - font-weight: 600; - letter-spacing: -0.025em; - line-height: 1.3; - margin-top: var(--space-10); - margin-bottom: var(--space-4); - color: var(--foreground); -} - -.docs-content h3 { - font-size: 1.125rem; - font-weight: 600; - letter-spacing: -0.025em; - line-height: 1.4; - margin-top: var(--space-8); - margin-bottom: var(--space-3); - color: var(--foreground); -} - -.docs-content p { - color: var(--muted-foreground); - font-size: 0.9375rem; - line-height: 1.7; - margin-bottom: var(--space-4); -} - -.docs-content ul, .docs-content ol { - color: var(--muted-foreground); - font-size: 0.9375rem; - line-height: 1.7; - padding-left: var(--space-6); - margin-bottom: var(--space-4); -} - -.docs-content li { - margin-bottom: var(--space-2); -} - -.docs-content code:not(pre code) { - background: var(--muted); - color: var(--accent); - padding: 0.125rem 0.375rem; - border-radius: 0.25rem; - font-size: 0.8125rem; -} - -.docs-content pre { - background: oklch(0.10 0 0); - border: 1px solid var(--border); - border-radius: var(--space-3); - padding: var(--space-5); - overflow-x: auto; - margin-bottom: var(--space-6); -} - -.docs-content pre code { - font-family: var(--font-mono); - font-size: 0.8125rem; - line-height: 1.625; - color: var(--foreground); -} - -.docs-content a { - color: var(--accent); - text-decoration: none; - transition: opacity 0.2s ease; -} - -.docs-content a:hover { - opacity: 0.8; - text-decoration: underline; -} - -/* ---- Docs Section ---- */ -.docs-section { - margin-top: var(--space-12); -} - -.docs-section h2 { - font-size: 1.375rem; - font-weight: 600; - letter-spacing: -0.025em; - line-height: 1.3; - margin-bottom: var(--space-3); - color: var(--foreground); -} - -.docs-section p { - color: var(--muted-foreground); - font-size: 0.9375rem; - line-height: 1.7; - margin-bottom: var(--space-4); -} - -/* ---- Docs Card ---- */ -.docs-card { - display: flex; - align-items: center; - gap: var(--space-4); - padding: var(--space-4); - background: var(--card); - border-radius: var(--space-3); - border: 1px solid var(--border); -} - -.docs-card-number { - width: var(--space-8); - height: var(--space-8); - display: flex; - align-items: center; - justify-content: center; - border-radius: 9999px; - background: oklch(0.65 0.22 270 / 0.1); - color: var(--accent); - font-weight: 700; - font-size: 14px; - flex-shrink: 0; -} - -.docs-card-number.primary { - background: oklch(0.65 0.22 270 / 0.15); - color: var(--accent); -} - -.docs-card-number.muted { - background: var(--muted); - color: var(--muted-foreground); -} - -/* ---- Docs Terminal ---- */ -.docs-terminal { - background: oklch(0.10 0 0); - border-radius: var(--space-3); - border: 1px solid var(--border); - overflow: hidden; - margin-bottom: var(--space-6); -} - -.terminal-bar { - display: flex; - align-items: center; - gap: var(--space-2); - padding: var(--space-3) var(--space-4); - border-bottom: 1px solid oklch(0.27 0.01 270 / 0.5); - background: oklch(0.10 0 0); -} - -.terminal-bar span { - width: var(--space-2); - height: var(--space-2); - border-radius: 9999px; -} - -.terminal-bar .terminal-dot-red { background: var(--destructive); } -.terminal-bar .terminal-dot-yellow { background: var(--warning); } -.terminal-bar .terminal-dot-green { background: var(--success); } - -/* ---- Docs utility classes ---- */ -.docs-term-list { - display: flex; - flex-direction: column; - gap: var(--space-2); - margin-bottom: var(--space-4); -} - -.docs-term-item { - display: flex; - gap: var(--space-2); - font-size: 14px; - color: var(--muted-foreground); -} - -.docs-term-key { - color: var(--accent); - font-family: var(--font-mono); - flex-shrink: 0; -} - -.docs-term-value { - color: var(--muted-foreground); - font-size: 14px; -} - -.docs-link-list { - display: flex; - flex-direction: column; - gap: var(--space-2); -} - -.docs-link-list a { - font-size: 14px; - color: var(--accent); - text-decoration: none; -} - -.docs-link-list a:hover { - text-decoration: underline; -} - -/* ---- Mobile docs nav ---- */ -.mobile-docs-nav { - display: none; - position: sticky; - top: 3.5rem; - z-index: 20; - background: var(--background); - border-bottom: 1px solid var(--border); - padding: var(--space-2) var(--space-4); - overflow-x: auto; - white-space: nowrap; -} - -.mobile-docs-nav a { - display: inline-block; - padding: var(--space-2) var(--space-3); - border-radius: var(--space-2); - color: var(--muted-foreground); - font-size: 14px; - text-decoration: none; - min-height: 44px; - line-height: 1.25; - transition: background-color 0.15s ease, color 0.15s ease; -} - -.mobile-docs-nav a:hover { - background: var(--muted); - color: var(--foreground); -} - -.mobile-docs-nav a.active { - background: oklch(0.65 0.22 270 / 0.1); - color: var(--accent); -} - -@media (min-width: 768px) { - .mobile-docs-nav { - display: none; - } -} - -/* ---- Mobile: collapse docs sidebar ---- */ -@media (max-width: 767px) { - .docs-sidebar { - display: none; - } - .docs-content { - padding: var(--space-6) var(--space-4) var(--space-12); - } + background-color: var(--card); } diff --git a/website/src/routes/+layout.svelte b/website/src/routes/+layout.svelte index 6445718e..43d67712 100644 --- a/website/src/routes/+layout.svelte +++ b/website/src/routes/+layout.svelte @@ -7,34 +7,35 @@ const isDocs = $derived($page.url.pathname.startsWith('/docs')); -
- - + -
+
{@render children()}
+ +
+
+ ยฉ 2026 cora โ€” AI code review CLI ยท MIT License +
+ GitHub + Docs + MIT +
+
+
diff --git a/website/src/routes/+page.svelte b/website/src/routes/+page.svelte index 64fead44..4ecde11c 100644 --- a/website/src/routes/+page.svelte +++ b/website/src/routes/+page.svelte @@ -1,239 +1,114 @@ - - - + + + + + + + + + - +
- -
+
-
+
v0.4 released - โ€” - release notes โ†’ + โ€” + release notes โ†’

- Ship with Confidence.
- AI Code Review, Before You Commit. + Ship with
+ Confidence.

- CLI-first AI code review. BYOK any LLM, zero telemetry, open source. + AI code review, before you commit. + CLI-first, BYOK any LLM, deterministic rules, fully open source.

$ - - curl -fsSL .../install.sh | sh + curl -fsSL https://cora.dev/install.sh | sh
-
+
+ MIT License + ยท + No account + ยท + No telemetry +
+ +
- - -

- - MIT License - ยท - No account - ยท - No telemetry - ยท - Rust & WebAssembly - -

- -
+ +
@@ -341,23 +211,23 @@
- cora v0.4 โ€” AI code review engine + cora โ€” AI code review engine
-
+
{#each commands as c, i} -
+
{#if i === visibleCmd}
โฏ
{c.cmd.split(' ')[0]} - {c.cmd.split(' ').slice(1).join(' ')} + {c.cmd.split(' ').slice(1).join(' ')}
-

# {c.desc}

-
{c.output}
+

# {c.desc}

+
{c.output}
{:else}
โฏ @@ -370,9 +240,9 @@
- -
-
+ +
+
๐Ÿฆ€ Built with Rust @@ -402,56 +272,63 @@
- -
+ +

The Problem

- Code review shouldn't be
slow or expensive + Code review shouldn't be
+ slow or expensive

- Stop waiting hours for feedback. cora catches issues in seconds โ€” before you commit. + Stop waiting hours for feedback. cora catches issues in seconds โ€” before you commit.

-
- {#each comparisons as comp, i} -
- -
-
- โœ• - {comp.problem} -
+
+
+ +
+

โŒ Without cora

+
+

> Waiting for PR review...

+

Still waiting (4 hours)

+

> Reviewer missed the SQL injection

+

Merged to production with bug

+

> Now paying $12/mo per reviewer seat

- -
-
- โœ“ - {comp.solution} -
+
+ + +
+

โœ… With cora

+
+

> git commit -m "feat: auth"

+

cora review: 2 issues found (0.8s)

+

> Fixed both issues, committed

+

Zero cost. Zero waiting. Zero bugs shipped.

- {/each} +
- -
+ +
-

Features

-

Everything you need.
Nothing you don't.

+

Features

+

Everything you need.
Nothing you don't.

- {#each features as feat, i} -
+ {#each features as feat} +
{feat.icon}

{feat.title}

-

{feat.tag}

-

{@html feat.description}

+

{feat.desc}

+

{feat.detail}

{/each}
@@ -459,80 +336,61 @@
- -
-
-
-

Get Started

-

Three steps to
confident commits

-
+ +
+
+

Get Started

+

Three steps to
confident commits

+
-
-
-
1
-
-

Install

- - curl -fsSL .../install.sh | sh - -
+
+
+
1
+
+

Install

+ + curl -fsSL https://cora.dev/install.sh | sh +
-
-
2
-
-

Configure

- - cora init - -
-
-
-
3
-
-

Review

- - cora review --staged - -
+
+
+
2
+
+

Configure your LLM

+ + cora init +
-
-
โœ“
-
-

That's it. No account. No server. No lock-in.

-

Works out of the box with sensible defaults. Customize with .cora.yaml when you need more control.

-
+
+
+
3
+
+

Review your code

+ + cora review --staged +
-
-
- -
- - -
-

- Trusted across 13 repositories -

-
- {#each repos as repo, i} -
-
{repo.name}
-
{repo.desc}
+
+
โœ“
+
+

That's it. No account. No server. No lock-in.

+

Works out of the box with sensible defaults. Customize with .cora.yaml when you need more control.

- {/each} +
- -
+ +
-

Compare

-

Why developers choose cora

+

Compare

+

Why developers choose cora

-
+
@@ -544,13 +402,13 @@ - {#each competitors as row} + {#each comparisons as row} - - - - + + + + {/each} @@ -560,82 +418,55 @@
- -
-
-
-

FAQ

-

Frequently asked questions

-
+ +
+
+

FAQ

+

Frequently asked questions

+
-
- {#each faqs as faq, index} -
-
- - {#if openFAQIndex === index} -
-
{@html faq.a}
-
- {/if} -
+
+ {#each faqs as faq, i} +
+ {#if openFaq === i} +

{faq.a}

+ {/if} + + {/each}
- -
-

- Start Shipping
- Better Code + +
+

+ Ready to ship
+ better code?

-

Free forever ยท No account required ยท Open source MIT

-
+

Free forever ยท No account required ยท Start in 30 seconds

+
- - -
-
-
-
-
- cora - v0.4 ยท MIT License -
-
- GitHub - Docs - FAQ -
-
-
-
From 9490b7e27774765c38f102ca28fadeb0a1c38749 Mon Sep 17 00:00:00 2001 From: "Zeko (Hermes)" Date: Fri, 5 Jun 2026 07:24:17 +0700 Subject: [PATCH 2/2] fix: restore docs CSS + fix FAQ invalid HTML MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Restore all docs layout styles (docs-sidebar, docs-content, docs-card, docs-terminal, mobile-docs-nav) accidentally removed - Restore CSS custom properties needed by docs (--space-*, --font-*, --destructive, --warning, @theme tokens) - Fix FAQ accordion: +

{/each}
{row.feature}{@html row.cora}{row.cora}