From aa116ebb60cfdbd9fc2b086b43f887de02eae672 Mon Sep 17 00:00:00 2001 From: Mao Nakamoto <41178744+maonakamoto@users.noreply.github.com> Date: Thu, 25 Jun 2026 19:28:09 +0200 Subject: [PATCH] =?UTF-8?q?design(landing):=20identity-first=20reskin=20?= =?UTF-8?q?=E2=80=94=20token=20SSOT,=20serif=20voice,=20monogram=20avatars?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Botsmann had no identity of its own: a generic 2021-era AI-SaaS skin with the brand fragmented across three disagreeing sources (config OpenAI-green, globals.css black/white, page blue/purple/cyan gradients). Derive Botsmann's OWN voice — serious, credible counsel: warm editorial ink + a single authoritative ochre accent, carried by a serif display face, not gradient tricks. - globals.css is now the single SSOT for design tokens (semantic colors for brand/action/surface/text + radii + shadows, two-tier primitive→semantic). - tailwind.config wired to the CSS vars; literal colors removed. Ripped out the OpenAI-borrowed tokens (openai-green #10a37f / openai-gray) and migrated every consumer to the semantic `action` / `brand` tokens. - Killed the generic "AI gradient" skin: removed the blue→purple→cyan gradient wordmark, the blurred gradient hero blobs, gradient buttons, and glassmorphism. Replaced with one confident ochre accent + ink, hairline editorial surfaces. - Real typeface via next/font: Fraunces (serif display, headings + wordmark) + Inter (UI/body), bound to --font-serif / --font-sans. Retires system-ui. - Replaced emoji professional avatars (⚖️🩺🔬🇨🇭🎨♛) with a ProfessionalAvatar monogram badge built on the existing accentColor SSOT. - One headline value prop: tab title, hero H1 and footer now all agree on "Your Private AI Professionals" (was a split tagline vs H1). Design only — all content and functionality preserved. Lint clean; no new tsc errors (the pre-existing embeddings.test.ts error is unchanged from main); production CSS resolves the full token chain. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/blog/page.tsx | 7 +- app/contact/page.tsx | 18 ++-- app/globals.css | 66 ++++++++++-- app/layout.tsx | 24 ++++- app/page.tsx | 131 ++++++++++------------- app/projects/credit/page.tsx | 8 +- app/projects/page.tsx | 2 +- app/projects/shopping/page.tsx | 16 +-- app/projects/techno-capital/page.tsx | 38 +++---- app/solutions/page.tsx | 16 +-- components/ConsultationForm.tsx | 12 +-- components/Footer.tsx | 22 ++-- components/Header.tsx | 2 +- components/TableOfContents.tsx | 2 +- components/blog/MDXComponents.tsx | 4 +- components/blog/ServerMDXContent.tsx | 4 +- components/navigation/MobileNav.tsx | 12 +-- components/navigation/NavItem.tsx | 2 +- components/navigation/NextSection.tsx | 2 +- components/shared/EnterpriseSection.tsx | 26 ++--- components/shared/HowItWorks.tsx | 27 ++--- components/shared/Logo.tsx | 17 ++- components/shared/PrivacySection.tsx | 48 +++------ components/shared/ProfessionalAvatar.tsx | 36 +++++++ components/shared/ProfessionalCard.tsx | 28 ++--- lib/site.ts | 3 +- tailwind.config.js | 26 ++++- 27 files changed, 325 insertions(+), 274 deletions(-) create mode 100644 components/shared/ProfessionalAvatar.tsx diff --git a/app/blog/page.tsx b/app/blog/page.tsx index f680fadd7..783ab7ffe 100644 --- a/app/blog/page.tsx +++ b/app/blog/page.tsx @@ -65,10 +65,7 @@ export default async function Blog() {

- + {post.title}

@@ -90,7 +87,7 @@ export default async function Blog() { Read more

Email

- + info@botsmann.com

@@ -87,7 +87,7 @@ export default function ContactPage() { solutions in action.

diff --git a/app/globals.css b/app/globals.css index fa791113b..07b31944f 100644 --- a/app/globals.css +++ b/app/globals.css @@ -2,14 +2,57 @@ @tailwind components; @tailwind utilities; +/* + * ============================================================================ + * BOTSMANN DESIGN TOKENS — SINGLE SOURCE OF TRUTH + * ============================================================================ + * Identity: serious, credible AI professionals — counsel you'd trust, not a + * toy chatbot. Editorial ink + one authoritative warm accent (notarial ochre). + * No generic "AI gradient" blue/purple. Typography (serif display) carries it. + * + * Every color/radius/shadow used in the product is defined HERE. tailwind.config + * maps utilities to these vars; components consume semantic classes only. + * Retheme = edit this block. Nothing else. + */ :root { - --foreground-rgb: 0, 0, 0; - --background-rgb: 255, 255, 255; + /* Tier 1 — Primitive palette (raw values; never used directly by components) */ + --primitive-ink-950: #1a1714; /* near-black warm ink — text & wordmark */ + --primitive-ink-700: #4a423b; + --primitive-ink-500: #6f655c; /* muted body copy */ + --primitive-ochre-600: #b45309; /* authoritative warm accent */ + --primitive-ochre-700: #92400e; /* accent hover / pressed */ + --primitive-ochre-50: #fdf6ec; /* accent tint surface */ + --primitive-paper: #faf8f4; /* warm off-white page */ + --primitive-surface: #ffffff; + --primitive-border: #e8e2d8; /* warm hairline */ + + /* Tier 2 — Semantic tokens (what things MEAN — always use these) */ + --color-brand: var(--primitive-ink-950); /* the Botsmann mark / authority */ + --color-action: var(--primitive-ochre-600); /* primary CTAs, links, accents */ + --color-action-hover: var(--primitive-ochre-700); + --color-action-tint: var(--primitive-ochre-50); + --color-bg: var(--primitive-paper); + --color-surface: var(--primitive-surface); + --color-border: var(--primitive-border); + --color-text: var(--primitive-ink-950); + --color-text-muted: var(--primitive-ink-500); + + /* Radii — restrained, editorial (not bubbly) */ + --radius-card: 12px; + --radius-btn: 8px; + + /* Shadows — subtle, paper-like (no glassmorphism glow) */ + --shadow-card: 0 1px 2px rgb(26 23 20 / 0.04), 0 1px 3px rgb(26 23 20 / 0.06); + --shadow-card-hover: 0 4px 12px rgb(26 23 20 / 0.08), 0 2px 4px rgb(26 23 20 / 0.06); + + /* Back-compat for any legacy rgb() consumers */ + --foreground-rgb: 26, 23, 20; + --background-rgb: 250, 248, 244; } body { - color: rgb(var(--foreground-rgb)); - background: rgb(var(--background-rgb)); + color: var(--color-text); + background: var(--color-bg); } /* Smooth scrolling for anchor links */ @@ -24,29 +67,30 @@ html { } @layer base { + /* Serif display carries the editorial identity for headings & wordmark */ h1 { - @apply text-4xl font-semibold tracking-tight; + @apply font-serif text-4xl font-semibold tracking-tight text-ink; } h2 { - @apply text-3xl font-medium tracking-tight; + @apply font-serif text-3xl font-semibold tracking-tight text-ink; } h3 { - @apply text-2xl font-medium; + @apply text-2xl font-semibold text-ink; } p { - @apply text-gray-600; + @apply text-ink-muted; } } @layer components { .btn-primary { - @apply rounded-md bg-green-600 px-4 py-2 text-sm md:text-base font-medium text-white hover:bg-opacity-90 transition-all shadow-sm hover:shadow md:px-5 md:py-2.5 focus:outline-none focus:ring-2 focus:ring-green-500 focus:ring-opacity-50; + @apply rounded-btn bg-action px-4 py-2 text-sm md:text-base font-medium text-white hover:bg-action-hover transition-colors shadow-card hover:shadow-card-hover md:px-5 md:py-2.5 focus:outline-none focus:ring-2 focus:ring-action focus:ring-opacity-40; } .btn-secondary { - @apply rounded-md border border-gray-200 px-4 py-2 text-sm md:text-base font-medium text-gray-600 hover:bg-gray-50 transition-all shadow-sm hover:shadow-md md:px-5 md:py-2.5 focus:outline-none focus:ring-2 focus:ring-gray-200 focus:ring-opacity-50; + @apply rounded-btn border border-edge px-4 py-2 text-sm md:text-base font-medium text-ink hover:bg-action-tint transition-colors shadow-card hover:shadow-card-hover md:px-5 md:py-2.5 focus:outline-none focus:ring-2 focus:ring-action focus:ring-opacity-20; } .input-primary { - @apply w-full rounded-xl border-2 border-gray-200 bg-transparent px-4 py-3 text-gray-900 outline-none transition-colors focus:border-green-600 focus:ring-2 focus:ring-green-100; + @apply w-full rounded-btn border border-edge bg-surface px-4 py-3 text-ink outline-none transition-colors focus:border-action focus:ring-2 focus:ring-action focus:ring-opacity-20; } } diff --git a/app/layout.tsx b/app/layout.tsx index 83e73b445..5af72959b 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,16 +5,34 @@ import { site } from '@/lib/site'; import './globals.css'; import { Toaster } from 'sonner'; import { Analytics } from '@vercel/analytics/react'; +import { Inter, Fraunces } from 'next/font/google'; + +// Brand typeface: a serif display (Fraunces) carries the editorial / "real +// counsel" identity for headings & wordmark; Inter handles UI/body copy. +// Bound to CSS vars consumed by tailwind.config (font-serif / font-sans). +const sans = Inter({ + subsets: ['latin'], + variable: '--font-sans', + display: 'swap', +}); + +const serif = Fraunces({ + subsets: ['latin'], + weight: ['400', '500', '600', '700'], + style: ['normal', 'italic'], + variable: '--font-serif', + display: 'swap', +}); export const metadata = { - title: `${site.name} - ${site.tagline}`, + title: `${site.name} — ${site.tagline}`, description: site.description, }; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( - - + +
{children}
diff --git a/app/page.tsx b/app/page.tsx index 9feaecf93..cd15df2c5 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -7,99 +7,82 @@ import { EnterpriseSection } from '@/components/shared/EnterpriseSection'; export default function HomePage() { return ( -
- {/* Background Effects */} -
-
-
-
- +
{/* Hero Section */} -
-
- - Free to try - No credit card required +
+
+ + Free to try — no credit card required
-

- - Your Private - +

+ Your Private
- - AI Professionals - + AI Professionals

-

- Expert advice from AI doctors, lawyers, and advisors. - - Available 24/7. Completely private. A fraction of the cost. +

+ Considered counsel from AI specialists in law, health, research and more. + + Available around the clock. Wholly private. At a fraction of the cost.

- - Try Now - Free - - - - + Try Now — Free + + + - - Meet Your Professionals - - - - + Meet Your Professionals + + +
{/* Key Benefits */} -
-
-
🔒
-
Complete Privacy
-
Your data never leaves your control
+
+
+
Complete privacy
+
Your data never leaves your control.
-
-
-
24/7 Access
-
Expert guidance whenever you need it
+
+
Always available
+
Expert guidance whenever you need it.
-
-
📄
-
Personalized
-
Upload documents for tailored advice
+
+
Personalised
+
Upload documents for tailored advice.
@@ -107,12 +90,10 @@ export default function HomePage() { {/* Professionals Grid - THE MAIN PRODUCT */}
-

- - Meet Your AI Professionals - +

+ Meet Your AI Professionals

-

+

Choose the expert advisor that matches your needs. Each professional brings specialized knowledge and a unique approach.

@@ -127,7 +108,7 @@ export default function HomePage() {
View All Professionals diff --git a/app/projects/credit/page.tsx b/app/projects/credit/page.tsx index 19b26bd0a..07823bba7 100644 --- a/app/projects/credit/page.tsx +++ b/app/projects/credit/page.tsx @@ -46,7 +46,7 @@ export default function Credit() {
-
+
1
@@ -59,7 +59,7 @@ export default function Credit() {
-
+
2
@@ -73,7 +73,7 @@ export default function Credit() {
-
+
3
@@ -94,7 +94,7 @@ export default function Credit() {

Contact Us diff --git a/app/projects/page.tsx b/app/projects/page.tsx index 02c0c453f..7e5e4ed1f 100644 --- a/app/projects/page.tsx +++ b/app/projects/page.tsx @@ -71,7 +71,7 @@ export default function Projects() {

{project.title}

{project.description}

-
+
Learn more
@@ -213,14 +213,14 @@ export default function RecurringFulfillment() {
-
-
+
+
POPULAR

Business

@@ -237,7 +237,7 @@ export default function RecurringFulfillment() { @@ -257,7 +257,7 @@ export default function RecurringFulfillment() { @@ -297,7 +297,7 @@ export default function RecurringFulfillment() {

Contact Us diff --git a/app/projects/techno-capital/page.tsx b/app/projects/techno-capital/page.tsx index 17ea95be3..c91ec6c6b 100644 --- a/app/projects/techno-capital/page.tsx +++ b/app/projects/techno-capital/page.tsx @@ -30,7 +30,7 @@ export default function TechnoCapital() { {/* Title and Overview */}
- + Coming Soon Investment fund launching 2026 @@ -51,7 +51,7 @@ export default function TechnoCapital() {
  • SubSpace Capital
    -
    +
    1. -
      +
      1
      @@ -314,7 +314,7 @@ export default function TechnoCapital() {
    2. -
      +
      2
      @@ -326,7 +326,7 @@ export default function TechnoCapital() {
    3. -
      +
      3
      @@ -347,7 +347,7 @@ export default function TechnoCapital() {
      • {submitting ? 'Submitting...' : 'Join Waitlist'} diff --git a/app/solutions/page.tsx b/app/solutions/page.tsx index 8d88fbc22..2b2e52513 100644 --- a/app/solutions/page.tsx +++ b/app/solutions/page.tsx @@ -38,7 +38,7 @@ export default function SolutionsPage() {

        Learn more @@ -55,7 +55,7 @@ export default function SolutionsPage() { {/* Businesses */}
        - + Coming Soon
        @@ -71,7 +71,7 @@ export default function SolutionsPage() {

        Learn more @@ -88,7 +88,7 @@ export default function SolutionsPage() { {/* Governments */}
        - + Coming Soon
        @@ -104,7 +104,7 @@ export default function SolutionsPage() {

        Learn more @@ -131,7 +131,7 @@ export default function SolutionsPage() { className="group flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-sm transition-shadow hover:shadow-md relative" > {solution.slug !== 'swiss-german-teacher' && ( - + Coming Soon )} @@ -139,7 +139,7 @@ export default function SolutionsPage() {

        {solution.title}

        {solution.overview}

        - + Learn more → @@ -158,7 +158,7 @@ export default function SolutionsPage() {

        Get in Touch diff --git a/components/ConsultationForm.tsx b/components/ConsultationForm.tsx index fbcc00ef5..c26daa037 100644 --- a/components/ConsultationForm.tsx +++ b/components/ConsultationForm.tsx @@ -81,7 +81,7 @@ export default function ConsultationForm() {

        @@ -103,7 +103,7 @@ export default function ConsultationForm() { {...register('name', { required: 'Name is required' })} type="text" id="name" - className="mt-1 block w-full rounded-md border-gray-200 bg-white px-3 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-200 placeholder:text-gray-400 focus:ring-2 focus:ring-openai-green sm:text-sm" + className="mt-1 block w-full rounded-md border-gray-200 bg-white px-3 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-200 placeholder:text-gray-400 focus:ring-2 focus:ring-action sm:text-sm" /> {errors.name &&

        {errors.name.message}

        }
        @@ -122,7 +122,7 @@ export default function ConsultationForm() { })} type="email" id="email" - className="mt-1 block w-full rounded-md border-gray-200 bg-white px-3 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-200 placeholder:text-gray-400 focus:ring-2 focus:ring-openai-green sm:text-sm" + className="mt-1 block w-full rounded-md border-gray-200 bg-white px-3 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-200 placeholder:text-gray-400 focus:ring-2 focus:ring-action sm:text-sm" /> {errors.email &&

        {errors.email.message}

        }
        @@ -135,7 +135,7 @@ export default function ConsultationForm() {