From 822990363e0ddd15f0647835044f50305faf2b44 Mon Sep 17 00:00:00 2001 From: Val Alexander Date: Tue, 31 Mar 2026 23:02:12 -0500 Subject: [PATCH 1/4] Refresh marketing hero background and glow effects - Add layered gradient mesh and grid textures - Increase star density and highlight brighter stars - Emphasize the AI wordmark and add button shimmer --- .../marketing/src/components/Background.astro | 63 +++++++++++++++- apps/marketing/src/components/Hero.astro | 73 ++++++++++++++++++- 2 files changed, 132 insertions(+), 4 deletions(-) diff --git a/apps/marketing/src/components/Background.astro b/apps/marketing/src/components/Background.astro index f75309175..21c1bbbed 100644 --- a/apps/marketing/src/components/Background.astro +++ b/apps/marketing/src/components/Background.astro @@ -1,5 +1,5 @@ --- -const starCount = 160; +const starCount = 220; let seed = 42; const rand = () => { seed = (seed * 16807) % 2147483647; @@ -8,18 +8,31 @@ const rand = () => { const stars = Array.from({ length: starCount }, (_, i) => { const twinkle = rand() < 0.3; + const bright = rand() < 0.05; return { id: i, x: (rand() * 100).toFixed(3), y: (rand() * 100).toFixed(3), - r: rand() < 0.85 ? (0.4 + rand() * 0.5).toFixed(3) : (0.8 + rand() * 0.6).toFixed(3), - opacity: (0.15 + rand() * 0.45).toFixed(3), + r: bright + ? (1.2 + rand() * 0.6).toFixed(3) + : rand() < 0.85 + ? (0.4 + rand() * 0.5).toFixed(3) + : (0.8 + rand() * 0.6).toFixed(3), + opacity: bright + ? (0.6 + rand() * 0.3).toFixed(3) + : (0.15 + rand() * 0.45).toFixed(3), delay: (rand() * 8).toFixed(3), twinkle, }; }); --- + + + + diff --git a/apps/marketing/src/components/Hero.astro b/apps/marketing/src/components/Hero.astro index 3af5d136a..3e6ae0b3f 100644 --- a/apps/marketing/src/components/Hero.astro +++ b/apps/marketing/src/components/Hero.astro @@ -5,6 +5,12 @@ ---
+ + -

The beautiful workspace for shipping with AI.

+

The beautiful workspace for shipping with AI.

Chat, diffs, preview, PR review, and release actions in one glassy desktop + web @@ -31,6 +37,7 @@

+ Download OK Code @@ -55,4 +62,68 @@
+ +
+ + From b5c52834456cd167d580ac5e8a165973b77c2294 Mon Sep 17 00:00:00 2001 From: Val Alexander Date: Tue, 31 Mar 2026 23:04:18 -0500 Subject: [PATCH 2/4] Overhaul the marketing landing page - Add logo cloud and stats bar - Refresh feature, FAQ, workflow, and CTA sections - Improve layout, navigation, and reveal animations --- .../marketing/src/components/FaqSection.astro | 41 +- .../src/components/FeatureGrid.astro | 36 +- apps/marketing/src/components/FinalCta.astro | 105 +++- apps/marketing/src/components/LogoCloud.astro | 96 ++++ apps/marketing/src/components/StatsBar.astro | 89 +++ .../marketing/src/components/TrustStrip.astro | 82 ++- .../src/components/WorkflowSection.astro | 50 +- apps/marketing/src/layouts/Layout.astro | 515 ++++++++++++++++-- apps/marketing/src/pages/index.astro | 9 + 9 files changed, 937 insertions(+), 86 deletions(-) create mode 100644 apps/marketing/src/components/LogoCloud.astro create mode 100644 apps/marketing/src/components/StatsBar.astro diff --git a/apps/marketing/src/components/FaqSection.astro b/apps/marketing/src/components/FaqSection.astro index 2699d5ae2..7aad77b0e 100644 --- a/apps/marketing/src/components/FaqSection.astro +++ b/apps/marketing/src/components/FaqSection.astro @@ -24,8 +24,13 @@ const { faqs } = Astro.props; aria-controls={`${id}-panel`} data-faq-trigger > - {item.question} - + + {String(index + 1).padStart(2, '0')} + {item.question} + +
+ + diff --git a/apps/marketing/src/components/FeatureGrid.astro b/apps/marketing/src/components/FeatureGrid.astro index a67cccde7..90b0345a3 100644 --- a/apps/marketing/src/components/FeatureGrid.astro +++ b/apps/marketing/src/components/FeatureGrid.astro @@ -11,7 +11,7 @@ const icons = [ ] as const; --- -
+
{pillars.map((pillar, index) => (
@@ -25,3 +25,37 @@ const icons = [
))}
+ + diff --git a/apps/marketing/src/components/FinalCta.astro b/apps/marketing/src/components/FinalCta.astro index 752dd9fc7..d99bae0c4 100644 --- a/apps/marketing/src/components/FinalCta.astro +++ b/apps/marketing/src/components/FinalCta.astro @@ -5,24 +5,91 @@ ---
-

Ready

-

Stop building through tab chaos.

-

- Bring chat, code review, preview, and release flow into one calm workspace built for serious - AI-assisted work. -

-
- - - Download OK Code - - - Explore on GitHub - + +
+

Ready

+

Stop building through tab chaos.

+

+ Bring chat, code review, preview, and release flow into one calm workspace built for serious + AI-assisted work. +

+
+ + diff --git a/apps/marketing/src/components/LogoCloud.astro b/apps/marketing/src/components/LogoCloud.astro new file mode 100644 index 000000000..b74f2caa4 --- /dev/null +++ b/apps/marketing/src/components/LogoCloud.astro @@ -0,0 +1,96 @@ +--- +/** + * Logo cloud — social proof showing compatible tools and integrations. + */ +--- + +
+

Works with the tools you already use

+
+
+ + GitHub +
+
+ + VS Code +
+
+ + Claude +
+
+ + OpenAI +
+
+ + Vercel +
+
+ + Terminal +
+
+
+ + diff --git a/apps/marketing/src/components/StatsBar.astro b/apps/marketing/src/components/StatsBar.astro new file mode 100644 index 000000000..fc4357fef --- /dev/null +++ b/apps/marketing/src/components/StatsBar.astro @@ -0,0 +1,89 @@ +--- +/** + * Stats bar — metrics section for visual credibility. + */ +interface Props { + metrics: ReadonlyArray<{ value: string; label: string }>; +} + +const { metrics } = Astro.props; +--- + +
+ {metrics.map((metric) => ( +
+ {metric.value} + {metric.label} +
+ ))} +
+ + diff --git a/apps/marketing/src/components/TrustStrip.astro b/apps/marketing/src/components/TrustStrip.astro index 55fcb6f7a..ed11e8227 100644 --- a/apps/marketing/src/components/TrustStrip.astro +++ b/apps/marketing/src/components/TrustStrip.astro @@ -2,19 +2,75 @@ /** * Trust strip — three trust signals below the hero. */ +const items = [ + { + icon: ``, + label: "Made for builders", + text: "Designed around real AI coding workflows", + }, + { + icon: ``, + label: "Calm by default", + text: "Less context switching, more legible work", + }, + { + icon: ``, + label: "Close to the metal", + text: "Open source, desktop-aware, release-friendly", + }, +]; --- -
-
- Made for builders - Designed around real AI coding workflows -
-
- Calm by default - Less context switching, more legible work -
-
- Close to the metal - Open source, desktop-aware, release-friendly -
+
+ {items.map((item) => ( +
+ + {item.label} + {item.text} +
+ ))}
+ + diff --git a/apps/marketing/src/components/WorkflowSection.astro b/apps/marketing/src/components/WorkflowSection.astro index ece7d88f5..d4ece7d81 100644 --- a/apps/marketing/src/components/WorkflowSection.astro +++ b/apps/marketing/src/components/WorkflowSection.astro @@ -16,13 +16,59 @@ const { steps } = Astro.props;

-
- {steps.map((item) => ( +
+ {steps.map((item, index) => (
+ {item.step}

{item.title}

{item.body}

+ {index < steps.length - 1 &&
))}
+ + diff --git a/apps/marketing/src/layouts/Layout.astro b/apps/marketing/src/layouts/Layout.astro index debfbb4d1..562ed7d47 100644 --- a/apps/marketing/src/layouts/Layout.astro +++ b/apps/marketing/src/layouts/Layout.astro @@ -52,6 +52,12 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; OK Code + + @@ -126,6 +241,7 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; --kn-landing-border: rgba(192, 200, 212, 0.08); --kn-landing-border-hover: rgba(192, 200, 212, 0.16); --kn-landing-card-bg: rgba(192, 200, 212, 0.02); + --kn-landing-card-bg-hover: rgba(192, 200, 212, 0.04); --kn-landing-glow-1: rgba(192, 200, 212, 0.07); --kn-landing-glow-2: rgba(202, 58, 41, 0.06); --kn-landing-star-color: #c0c8d4; @@ -140,6 +256,9 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; --kn-landing-footer-link-hover: #ff4e41; --kn-landing-ico-bg: rgba(192, 200, 212, 0.04); --kn-landing-status-green: #00d4aa; + --kn-landing-section-gap: clamp(5rem, 8vw, 8rem); + --kn-landing-ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1); + --kn-landing-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); } * { @@ -151,6 +270,7 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; html { color-scheme: dark; scroll-behavior: smooth; + scroll-padding-top: 5rem; } body { @@ -168,7 +288,7 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; position: fixed; inset: 0; pointer-events: none; - opacity: 0.05; + opacity: 0.03; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); z-index: 1; } @@ -224,6 +344,41 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; min-width: 0; } + /* ── Keyframe Animations ── */ + + @keyframes kn-star-twinkle { + 0%, 100% { opacity: 0.12; } + 50% { opacity: 0.6; } + } + + @keyframes gradient-shift { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } + } + + @keyframes shimmer { + 0% { transform: translateX(-100%); } + 100% { transform: translateX(100%); } + } + + @keyframes pulse-glow { + 0%, 100% { opacity: 0.4; } + 50% { opacity: 1; } + } + + @keyframes float { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-12px); } + } + + @keyframes fade-in-up { + from { opacity: 0; transform: translateY(20px); } + to { opacity: 1; transform: translateY(0); } + } + + /* ── Header ── */ + .site-header { position: sticky; top: 0; @@ -264,6 +419,44 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; box-shadow: 0 0 18px rgba(167, 139, 250, 0.12); } + /* ── Mobile hamburger toggle ── */ + + .kn-nav-toggle { + display: none; + flex-direction: column; + justify-content: center; + gap: 5px; + width: 36px; + height: 36px; + padding: 6px; + background: none; + border: none; + cursor: pointer; + z-index: 25; + } + + .kn-nav-toggle-bar { + display: block; + width: 100%; + height: 2px; + border-radius: 2px; + background: var(--kn-landing-text-secondary); + transition: transform 0.3s var(--kn-landing-ease-out-expo), opacity 0.3s ease; + transform-origin: center; + } + + .kn-nav-toggle.is-open .kn-nav-toggle-bar:nth-child(1) { + transform: translateY(7px) rotate(45deg); + } + .kn-nav-toggle.is-open .kn-nav-toggle-bar:nth-child(2) { + opacity: 0; + } + .kn-nav-toggle.is-open .kn-nav-toggle-bar:nth-child(3) { + transform: translateY(-7px) rotate(-45deg); + } + + /* ── Nav Links ── */ + .kn-nav-links { display: flex; align-items: center; @@ -272,6 +465,7 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; } .kn-nav-link { + position: relative; color: var(--kn-landing-nav-link); font-size: 0.84rem; transition: color 0.2s ease; @@ -281,6 +475,22 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; color: var(--kn-landing-text-secondary); } + .kn-nav-link.is-active { + color: var(--kn-landing-accent-bright); + } + + .kn-nav-link.is-active::after { + content: ""; + position: absolute; + bottom: -6px; + left: 50%; + transform: translateX(-50%); + width: 4px; + height: 4px; + border-radius: 50%; + background: var(--kn-landing-accent-bright); + } + .kn-nav-signin, .hero-button, .secondary-button, @@ -322,6 +532,8 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; box-shadow: 0 12px 36px rgba(0, 0, 0, 0.24), 0 0 24px rgba(202, 58, 41, 0.08); } + /* ── Sections ── */ + .hero, .trust-strip, .feature-grid, @@ -353,11 +565,6 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; height: 100%; } - @keyframes kn-star-twinkle { - 0%, 100% { opacity: 0.12; } - 50% { opacity: 0.6; } - } - .kn-star-twinkle { animation: kn-star-twinkle 5s ease-in-out infinite; } @@ -377,12 +584,14 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; .kn-dot { fill: var(--kn-landing-text-secondary); opacity: 0.25; } .kn-glow { fill: var(--kn-landing-accent); opacity: 0.06; } + /* ── Reveal Animations ── */ + [data-reveal] { opacity: 0; transform: translateY(16px); transition: - opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), - transform 0.8s cubic-bezier(0.16, 1, 0.3, 1); + opacity 0.8s var(--kn-landing-ease-out-expo), + transform 0.8s var(--kn-landing-ease-out-expo); will-change: opacity, transform; } @@ -391,12 +600,26 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; transform: translateY(0); } + [data-reveal-children] > * { + opacity: 0; + transform: translateY(16px); + transition: opacity 0.6s var(--kn-landing-ease-out-expo), transform 0.6s var(--kn-landing-ease-out-expo); + transition-delay: calc(var(--reveal-index, 0) * 80ms); + } + + [data-reveal-children].revealed > * { + opacity: 1; + transform: translateY(0); + } + + /* ── Tab Panels ── */ + [data-tab-panel] { opacity: 0; transform: translateY(8px); transition: - opacity 0.35s cubic-bezier(0.16, 1, 0.3, 1), - transform 0.35s cubic-bezier(0.16, 1, 0.3, 1); + opacity 0.35s var(--kn-landing-ease-out-expo), + transform 0.35s var(--kn-landing-ease-out-expo); position: absolute; inset: 0 auto auto 0; width: 100%; @@ -412,6 +635,8 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; visibility: visible; } + /* ── Card System ── */ + .kn-card, .feature-card, .workflow-card, @@ -425,12 +650,15 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; .panel, .rail, .final-cta { + position: relative; + overflow: hidden; background: var(--kn-landing-card-bg); border: 1px solid var(--kn-landing-border); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 24px 80px rgba(0, 0, 0, 0.34); backdrop-filter: blur(18px); + transition: border-color 0.3s ease, box-shadow 0.4s ease, transform 0.3s var(--kn-landing-ease-out-expo); } .kn-card:hover, @@ -441,9 +669,16 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; .theme-preview-card:hover, .faq-card:hover, .trust-item:hover { + transform: translateY(-2px); border-color: var(--kn-landing-border-hover); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.04), + 0 28px 90px rgba(0, 0, 0, 0.38), + 0 0 24px rgba(202, 58, 41, 0.06); } + /* ── Typography ── */ + .eyebrow, .hero-pills span, .tab-chip, @@ -496,6 +731,59 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; line-height: 1.7; } + /* ── Gradient Text Utility ── */ + + .gradient-text { + background: linear-gradient(135deg, var(--kn-landing-text), var(--kn-landing-accent-bright)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + } + + /* ── Pill Badge ── */ + + .kn-pill { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.4rem 0.85rem 0.4rem 0.45rem; + border-radius: 999px; + border: 1px solid rgba(192, 200, 212, 0.12); + background: rgba(192, 200, 212, 0.04); + backdrop-filter: blur(18px); + font-size: 0.84rem; + color: var(--kn-landing-text-secondary); + transition: border-color 0.3s ease, background 0.3s ease; + } + + .kn-pill:hover { + border-color: rgba(192, 200, 212, 0.2); + background: rgba(192, 200, 212, 0.06); + } + + .kn-pill-badge { + padding: 0.2rem 0.55rem; + border-radius: 999px; + background: linear-gradient(135deg, var(--kn-landing-accent), var(--kn-landing-accent-bright)); + color: #fff; + font-size: 0.7rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + } + + .kn-pill-arrow { + opacity: 0.5; + transition: transform 0.2s ease, opacity 0.2s ease; + } + + .kn-pill:hover .kn-pill-arrow { + transform: translateX(2px); + opacity: 0.8; + } + + /* ── Hero Button ── */ + .hero-button { position: relative; display: inline-flex; @@ -539,14 +827,7 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; transform: rotate(24deg) translateX(1.4rem); } - .kn-footer { - position: relative; - z-index: 1; - border-top: 1px solid var(--kn-landing-border); - margin-top: 2rem; - background: linear-gradient(180deg, rgba(255,255,255,0.01), rgba(255,255,255,0.02)); - backdrop-filter: blur(18px); - } + /* ── Section Divider ── */ .section-divider { position: relative; @@ -555,7 +836,7 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; justify-content: center; gap: 1rem; width: 100%; - margin: 0 auto 4rem; + margin: 0 auto var(--kn-landing-section-gap); color: rgba(192, 200, 212, 0.34); } @@ -575,62 +856,196 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; filter: drop-shadow(0 0 16px rgba(202, 58, 41, 0.12)); } + /* ── Footer ── */ + + .kn-footer { + position: relative; + z-index: 1; + margin-top: 2rem; + background: linear-gradient(180deg, rgba(255,255,255,0.01), rgba(255,255,255,0.02)); + backdrop-filter: blur(18px); + } + + .kn-footer-gradient-line { + height: 1px; + width: 100%; + background: linear-gradient(90deg, transparent, var(--kn-landing-accent), transparent); + } + .kn-footer-inner { + padding: 4rem var(--marketing-pad-x) 2rem; + } + + .kn-footer-grid { + display: grid; + grid-template-columns: 2fr repeat(3, 1fr); + gap: 3rem; + } + + .kn-footer-brand { display: flex; - align-items: center; - justify-content: space-between; + flex-direction: column; gap: 1rem; - padding: 2rem var(--marketing-pad-x); } .kn-footer-mark { display: inline-flex; align-items: center; - gap: 0.55rem; + gap: 0.65rem; + color: var(--kn-landing-text); + font-size: 1rem; + font-weight: 600; + letter-spacing: -0.02em; + } + + .kn-footer-tagline { + font-size: 0.84rem; color: var(--kn-landing-text-muted); - font-size: 0.78rem; - font-weight: 500; + line-height: 1.6; + } + + .kn-footer-col { + display: flex; + flex-direction: column; + gap: 0.85rem; + } + + .kn-footer-heading { + text-transform: uppercase; + font-size: 0.7rem; + font-weight: 600; + letter-spacing: 0.14em; + color: var(--kn-landing-text-muted); + margin-bottom: 0.25rem; } - .kn-footer-links { + .kn-footer-list { + list-style: none; + display: flex; + flex-direction: column; + gap: 0.6rem; + } + + .kn-footer-list a { + position: relative; + display: inline-block; + font-size: 0.84rem; + color: var(--kn-landing-text-dim); + transition: color 0.2s ease; + } + + .kn-footer-list a::after { + content: ""; + position: absolute; + bottom: -1px; + left: 0; + width: 0; + height: 1px; + background: var(--kn-landing-accent-bright); + transition: width 0.3s var(--kn-landing-ease-out-expo); + } + + .kn-footer-list a:hover { + color: var(--kn-landing-text-secondary); + } + + .kn-footer-list a:hover::after { + width: 100%; + } + + .kn-footer-bottom { display: flex; align-items: center; - gap: 1rem; - flex-wrap: wrap; - font-size: 0.82rem; + justify-content: space-between; + margin-top: 3rem; + padding-top: 1.5rem; + border-top: 1px solid var(--kn-landing-border); + } + + .kn-footer-copyright { + font-size: 0.78rem; color: var(--kn-landing-text-dim); } - .kn-footer-links a { - color: var(--kn-landing-footer-link); + .kn-footer-top-link { + font-size: 0.78rem; + color: var(--kn-landing-text-muted); transition: color 0.2s ease; } - .kn-footer-links a:hover { - color: var(--kn-landing-footer-link-hover); + .kn-footer-top-link:hover { + color: var(--kn-landing-accent-bright); } + /* ── Mobile ── */ + @media (max-width: 720px) { - .kn-nav-inner, - .kn-footer-inner { + .kn-nav-toggle { + display: flex; + } + + .kn-nav-links { + position: fixed; + inset: 0; + z-index: 22; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 2rem; + background: rgba(5, 5, 7, 0.96); + backdrop-filter: blur(24px); + opacity: 0; + visibility: hidden; + transition: opacity 0.3s var(--kn-landing-ease-out-expo), visibility 0.3s; + } + + .kn-nav-links.is-open { + opacity: 1; + visibility: visible; + } + + .kn-nav-links a { + font-size: 1.5rem; + opacity: 0; + transform: translateY(16px); + transition: opacity 0.4s var(--kn-landing-ease-out-expo), transform 0.4s var(--kn-landing-ease-out-expo), color 0.2s ease; + } + + .kn-nav-links.is-open a:nth-child(1) { opacity: 1; transform: translateY(0); transition-delay: 0.08s; } + .kn-nav-links.is-open a:nth-child(2) { opacity: 1; transform: translateY(0); transition-delay: 0.14s; } + .kn-nav-links.is-open a:nth-child(3) { opacity: 1; transform: translateY(0); transition-delay: 0.20s; } + .kn-nav-links.is-open a:nth-child(4) { opacity: 1; transform: translateY(0); transition-delay: 0.26s; } + + .kn-nav-inner { padding-inline: var(--marketing-pad-x); } - .kn-nav-inner, - .kn-footer-inner { + .kn-footer-grid { + grid-template-columns: 1fr 1fr; + gap: 2.5rem; + } + + .kn-footer-brand { + grid-column: 1 / -1; + } + + .kn-footer-bottom { flex-direction: column; align-items: flex-start; + gap: 0.75rem; } + } - .kn-nav-links, - .kn-footer-links { - width: 100%; + @media (max-width: 480px) { + .kn-footer-grid { + grid-template-columns: 1fr; } } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } [data-reveal], + [data-reveal-children] > *, [data-tab-panel], .hero-button, .secondary-button, @@ -638,7 +1053,9 @@ const ogImage = Astro.site ? new URL(ogImagePath, Astro.site).href : null; .spotlight-item, .faq-trigger, .hero-button-shine, - .kn-star-twinkle { + .kn-star-twinkle, + .kn-nav-toggle-bar, + .kn-nav-links a { transition: none !important; animation: none !important; transform: none !important; diff --git a/apps/marketing/src/pages/index.astro b/apps/marketing/src/pages/index.astro index 28436e5c2..db9a83c98 100644 --- a/apps/marketing/src/pages/index.astro +++ b/apps/marketing/src/pages/index.astro @@ -1,7 +1,9 @@ --- import Layout from "../layouts/Layout.astro"; import Hero from "../components/Hero.astro"; +import LogoCloud from "../components/LogoCloud.astro"; import TrustStrip from "../components/TrustStrip.astro"; +import StatsBar from "../components/StatsBar.astro"; import FeatureGrid from "../components/FeatureGrid.astro"; import WorkflowSection from "../components/WorkflowSection.astro"; import CoreSurfaces from "../components/CoreSurfaces.astro"; @@ -9,6 +11,13 @@ import ThemeShowcase from "../components/ThemeShowcase.astro"; import FaqSection from "../components/FaqSection.astro"; import FinalCta from "../components/FinalCta.astro"; +const metrics = [ + { value: "100%", label: "Open Source" }, + { value: "5", label: "Core Surfaces" }, + { value: "3", label: "Premium Themes" }, + { value: "<1s", label: "Thread Restore" }, +] as const; + const description = "OK Code is the premium dark workspace for AI coding flows — persistent threads, diffs, preview, PR review, and release actions in one calm desktop + web product."; From d081f4494c586a5caec1aa0720c0379320c0fc44 Mon Sep 17 00:00:00 2001 From: Val Alexander Date: Tue, 31 Mar 2026 23:05:46 -0500 Subject: [PATCH 3/4] Refine landing page spacing and section order - Add logo cloud and stats bar to the homepage flow - Increase vertical spacing between landing sections - Remove the decorative divider between FAQ and CTA --- apps/marketing/src/pages/index.astro | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/apps/marketing/src/pages/index.astro b/apps/marketing/src/pages/index.astro index db9a83c98..958744556 100644 --- a/apps/marketing/src/pages/index.astro +++ b/apps/marketing/src/pages/index.astro @@ -179,21 +179,15 @@ const faqs = [ + + - +``` + +### 8.2 Open Graph Enhancements + +**Current:** OG image defaults to `/icon.png` (a small app icon). Not ideal for social sharing. + +**Recommendation:** + +- Create a dedicated 1200x630px OG image showing the product UI +- Add `og:site_name`, `og:locale` +- Add Twitter-specific card size (`twitter:card: summary_large_image` -- already present, good) + +### 8.3 Sitemap + +**Problem:** No sitemap generated. + +**Recommendation:** Install `@astrojs/sitemap`: + +```js +// astro.config.mjs +import sitemap from "@astrojs/sitemap"; +export default defineConfig({ + integrations: [sitemap()], + site: process.env.PUBLIC_SITE_URL, +}); +``` + +### 8.4 Canonical URLs + +**Current:** Canonical URL only set when `Astro.site` is available (requires `PUBLIC_SITE_URL` env var). In development, no canonical is set. + +**Recommendation:** Always set a canonical, even in dev: + +```js +const canonical = Astro.site + ? new URL(Astro.url.pathname, Astro.site).href + : `https://okcode.dev${Astro.url.pathname}`; +``` + +### 8.5 Heading Hierarchy + +**Problem:** Multiple pages may have inconsistent heading levels since components define their own `

`, `

` tags independently. + +**Recommendation:** Audit heading hierarchy per page: + +- `

`: Only the hero tagline (one per page) +- `

`: Section titles (Features, Workflow, Surfaces, Themes, FAQ, CTA) +- `

`: Within sections (feature card titles, workflow step titles, FAQ questions) + +--- + +## 9. Content & Copy + +### 9.1 Hero Tagline A/B Testing Opportunities + +**Current:** "The beautiful workspace for shipping with AI." + +**Alternative test candidates:** + +- "Ship with AI. Stay in flow." (shorter, more action-oriented) +- "One workspace for the entire AI coding loop." (benefit-focused) +- "Chat. Diff. Preview. Ship." (feature-list cadence, like Vercel's style) + +### 9.2 Social Proof + +**Current:** LogoCloud shows "Works with the tools you already use" with generic tool icons. This is weak social proof compared to what premium sites show. + +**Stronger alternatives:** + +- GitHub star count (dynamic, auto-updating) +- "Used by X developers" (if metrics available) +- Testimonial quotes from real users +- "Featured in" press/blog logos +- Community size (Discord member count) + +### 9.3 Comparison Section + +**What competitors show:** A "Why OK Code vs. X" comparison table is a high-conversion element. + +**Recommendation:** Add a comparison section after the workflow section: + +``` +| Feature | OK Code | Terminal AI | IDE Plugins | +|---------------------|---------|-------------|-------------| +| Persistent threads | Yes | No | Partial | +| Built-in diffs | Yes | No | No | +| Local preview | Yes | No | Partial | +| PR review surface | Yes | No | No | +| Open source | Yes | Varies | No | +``` + +### 9.4 CTA Copy Refinement + +**Current CTAs:** "Download OK Code" / "View on GitHub" / "Explore on GitHub" + +**Recommendations:** + +- Primary: "Get OK Code Free" (emphasizes free, reduces friction) +- Secondary: "Star on GitHub" (more specific action) +- Bottom CTA: "Start shipping calmer" (emotional, benefit-oriented) + +### 9.5 FAQ Expansion + +**Current:** 4 FAQ items. Premium sites typically show 6-10. + +**Suggested additions:** + +- "How does it compare to Cursor / Windsurf / Copilot?" +- "What AI models does it support?" +- "Can I self-host it?" +- "Is my code sent to a server?" +- "How does the desktop app work offline?" +- "What's on the roadmap?" + +--- + +## 10. Architecture & Code Quality + +### 10.1 Style Architecture Consolidation + +**Problem:** Styles are split across Layout.astro (global), index.astro (global via `:global()`), and component scoped `