From a60a7a3d1f9166110b07342f2b22b7b73fc327f3 Mon Sep 17 00:00:00 2001 From: Val Alexander Date: Wed, 1 Apr 2026 04:02:41 -0500 Subject: [PATCH 1/3] Fix marketing Vercel output config --- apps/marketing/next-env.d.ts | 2 +- apps/marketing/next.config.mjs | 3 +++ turbo.json | 4 ++++ vercel.json | 6 ++++++ 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 vercel.json diff --git a/apps/marketing/next-env.d.ts b/apps/marketing/next-env.d.ts index c4b7818fb..9edff1c7c 100644 --- a/apps/marketing/next-env.d.ts +++ b/apps/marketing/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/dev/types/routes.d.ts"; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/marketing/next.config.mjs b/apps/marketing/next.config.mjs index bd3419136..8ee7a7de9 100644 --- a/apps/marketing/next.config.mjs +++ b/apps/marketing/next.config.mjs @@ -1,5 +1,8 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + turbopack: { + root: new URL("../..", import.meta.url).pathname, + }, typescript: { ignoreBuildErrors: true, }, diff --git a/turbo.json b/turbo.json index c9471e538..040ee2c39 100644 --- a/turbo.json +++ b/turbo.json @@ -18,6 +18,10 @@ "dependsOn": ["^build"], "outputs": ["dist/**", "dist-electron/**"] }, + "@okcode/marketing#build": { + "dependsOn": ["^build"], + "outputs": [".next/**", "!.next/cache/**"] + }, "dev": { "dependsOn": ["@okcode/contracts#build"], "cache": false, diff --git a/vercel.json b/vercel.json new file mode 100644 index 000000000..dc2a991dd --- /dev/null +++ b/vercel.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "buildCommand": "bun run build:marketing", + "installCommand": "bun install", + "outputDirectory": "apps/marketing/.next" +} From 8aa0eb8239b443824df108c7b18810a396b4c9e0 Mon Sep 17 00:00:00 2001 From: Val Alexander Date: Wed, 1 Apr 2026 06:43:39 -0500 Subject: [PATCH 2/3] Refresh marketing site with warmer anime-inspired styling - Switch marketing typography to Nunito and increase corner radii - Scale up hero, feature, workflow, and CTA sections with softer motion - Update navbar, footer, and logo cloud to match the new visual direction --- apps/marketing/app/globals.css | 26 +++++++-- apps/marketing/app/layout.tsx | 8 +-- apps/marketing/components/ai-section.tsx | 28 +++++----- apps/marketing/components/cta-section.tsx | 16 +++--- .../components/feature-cards-section.tsx | 30 +++++------ apps/marketing/components/footer.tsx | 8 +-- apps/marketing/components/hero-3d-stage.tsx | 14 ++--- apps/marketing/components/logo-cloud.tsx | 12 ++--- apps/marketing/components/navbar.tsx | 8 +-- .../components/product-direction-section.tsx | 54 +++++++++---------- .../components/workflows-section.tsx | 18 ++++--- 11 files changed, 116 insertions(+), 106 deletions(-) diff --git a/apps/marketing/app/globals.css b/apps/marketing/app/globals.css index 5be67d608..a654a5921 100644 --- a/apps/marketing/app/globals.css +++ b/apps/marketing/app/globals.css @@ -56,7 +56,7 @@ --chart-3: oklch(0.398 0.07 227.392); --chart-4: oklch(0.828 0.189 84.429); --chart-5: oklch(0.769 0.188 70.08); - --radius: 0.625rem; + --radius: 1.25rem; --sidebar: oklch(0.985 0 0); --sidebar-foreground: oklch(0.145 0 0); --sidebar-primary: oklch(0.205 0 0); @@ -178,8 +178,8 @@ } @theme inline { - --font-sans: "Geist", "Geist Fallback"; - --font-mono: "Geist Mono", "Geist Mono Fallback"; + --font-sans: var(--font-nunito), "Nunito", "Nunito Fallback", system-ui, sans-serif; + --font-mono: var(--font-nunito-sans), "Nunito Sans", monospace; --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); @@ -204,10 +204,10 @@ --color-chart-3: var(--chart-3); --color-chart-4: var(--chart-4); --color-chart-5: var(--chart-5); - --radius-sm: calc(var(--radius) - 4px); + --radius-sm: calc(var(--radius) - 6px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) + 4px); + --radius-xl: calc(var(--radius) + 8px); --color-sidebar: var(--sidebar); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar-primary: var(--sidebar-primary); @@ -263,4 +263,20 @@ background-color: var(--brand); color: white; } + + /* Anime-cute warm styling */ + h1, + h2, + h3, + h4, + h5, + h6 { + letter-spacing: -0.01em; + } + + /* Soft hover glow for interactive elements */ + button, + a { + transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1); + } } diff --git a/apps/marketing/app/layout.tsx b/apps/marketing/app/layout.tsx index dd6999770..bc50ca101 100644 --- a/apps/marketing/app/layout.tsx +++ b/apps/marketing/app/layout.tsx @@ -1,11 +1,11 @@ import type React from "react"; import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; +import { Nunito, Nunito_Sans } from "next/font/google"; import { Analytics } from "@vercel/analytics/next"; import "./globals.css"; -const _geist = Geist({ subsets: ["latin"] }); -const _geistMono = Geist_Mono({ subsets: ["latin"] }); +const nunito = Nunito({ subsets: ["latin"], variable: "--font-nunito" }); +const nunitoSans = Nunito_Sans({ subsets: ["latin"], variable: "--font-nunito-sans" }); export const metadata: Metadata = { title: "Sprint - Purpose-built tool for planning and building products", @@ -59,7 +59,7 @@ export default function RootLayout({ }>) { return ( - + {children} diff --git a/apps/marketing/components/ai-section.tsx b/apps/marketing/components/ai-section.tsx index 9bd2708e3..d73c2bb10 100644 --- a/apps/marketing/components/ai-section.tsx +++ b/apps/marketing/components/ai-section.tsx @@ -14,7 +14,7 @@ const agents = [ export function AISection() { return ( -
+
-
+
{/* Section label - Use semantic tokens */} AI-assisted product development @@ -60,7 +58,7 @@ export function AISection() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.6, delay: 0.2 }} - className="text-muted-foreground max-w-md mb-8" + className="text-muted-foreground max-w-lg mb-10 text-lg" > Sprint for Agents. Choose from a variety of AI agents and start delegating work, from code generation to other technical @@ -73,7 +71,7 @@ export function AISection() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.6, delay: 0.3 }} - className="px-5 py-2.5 bg-secondary text-secondary-foreground rounded-lg border border-border hover:bg-accent transition-colors text-sm flex items-center gap-2 mb-16" + className="px-7 py-3.5 bg-secondary text-secondary-foreground rounded-2xl border border-border hover:bg-accent hover:scale-105 transition-all text-base font-semibold flex items-center gap-2 mb-16 shadow-sm" > Learn more @@ -214,16 +212,16 @@ export function AISection() {
{/* Left column - Use semantic tokens */}
-

+

Self-driving product operations

-

+

Streamline your product development workflows with AI assistance for routine, manual tasks.

{/* Triage Intelligence Card - Use semantic tokens */} -
+
-

Sprint MCP

-

+

Sprint MCP

+

Connect Sprint to your favorite tools including Cursor, Claude, ChatGPT, and more.

{/* MCP Code Snippet - Use semantic tokens for code syntax */} -
+

//mcp.sprint.app/sse

diff --git a/apps/marketing/components/cta-section.tsx b/apps/marketing/components/cta-section.tsx index 9a1a99c11..d0491edba 100644 --- a/apps/marketing/components/cta-section.tsx +++ b/apps/marketing/components/cta-section.tsx @@ -2,21 +2,21 @@ import Link from "next/link"; export function CTASection() { return ( -

-
-
-

+
+
+
+

Plan the present. Build the future.

-
- - Get started + Get started ✨
diff --git a/apps/marketing/components/feature-cards-section.tsx b/apps/marketing/components/feature-cards-section.tsx index 1a0f0fb49..e731e701f 100644 --- a/apps/marketing/components/feature-cards-section.tsx +++ b/apps/marketing/components/feature-cards-section.tsx @@ -74,7 +74,7 @@ const featureCards = [ export function FeatureCardsSection() { return ( -
+
-
+
{/* Header row */}
Made for modern product teams @@ -108,7 +106,7 @@ export function FeatureCardsSection() { transition={{ duration: 0.6, delay: 0.1 }} className="max-w-md" > -

+

Sprint is shaped by the practices and principles that distinguish world-class product teams from the rest: relentless focus, fast execution, and a commitment to the quality of craft.{" "} @@ -131,11 +129,11 @@ export function FeatureCardsSection() { whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.6, delay: 0.2 + index * 0.1 }} - className="bg-card/50 border border-border hover:border-ring transition-colors cursor-pointer group overflow-hidden relative flex flex-col justify-end" + className="bg-card/50 border border-border hover:border-ring hover:shadow-xl transition-all cursor-pointer group overflow-hidden relative flex flex-col justify-end" style={{ - aspectRatio: "336 / 360", - borderRadius: "30px", - height: "360px", + aspectRatio: "336 / 420", + borderRadius: "36px", + height: "420px", isolation: "isolate", }} > @@ -150,12 +148,10 @@ export function FeatureCardsSection() {

-

- {card.title} -

-
+

{card.title}

+
diff --git a/apps/marketing/components/footer.tsx b/apps/marketing/components/footer.tsx index ffa1fac5b..efd0d1547 100644 --- a/apps/marketing/components/footer.tsx +++ b/apps/marketing/components/footer.tsx @@ -32,8 +32,8 @@ export function Footer() { }; return ( -