Files
warmbly/site/src/components/UseCasePage.astro
T
Matthew Meszaros 676850e778 site: redesign all pages with sky-themed system
Full site redesign:
- pricing: HeroAtmosphere hero, animated toggle with sliding indicator,
  slide-up price digits, refined plan cards (no dark gradient on featured),
  feature matrix trimmed of unverified claims, lighter Warmbly-deep-sky CTA
- learn index: sky atmosphere band with floating cards + deep-sky glossary panel
- learn/deliverability: rebuilt as a magazine-essay layout with drop-cap,
  numbered chapter index, single 820px reading column, ornamental dividers,
  closing pull-quote. Original prose preserved, em dashes removed
- product, warmup, sending, inbox, campaigns, analytics, crm, workers,
  about, contact, brand, trust, changelog, roadmap, faq, 404, integrations,
  developers, deliverability, security, use-cases: each page got its own
  distinct shape on top of the shared theme tokens
- shared components: PageHero, Section, SectionHead, Card, CTA, Button,
  UseCasePage, Learn layout, Legal layout themed for the sky/serious style
2026-05-26 12:15:49 +00:00

109 lines
4.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
import Layout from '../layouts/Layout.astro';
import Cloud from './Cloud.astro';
import Icon from './Icon.astro';
import CTA from './CTA.astro';
interface Props {
title: string;
description: string;
pageTitle: string;
intro: string;
challenges: { title: string; body: string }[];
recipe: { title: string; body: string }[];
caps: { value: string; label: string }[];
eyebrow?: string;
}
const { title, description, pageTitle, intro, challenges, recipe, caps, eyebrow = 'Use case' } = Astro.props;
---
<Layout title={pageTitle} description={description}>
<!-- HERO with playbook caps inline -->
<section class="relative isolate overflow-hidden text-white" style="background: radial-gradient(ellipse 130% 140% at 72% 28%, #0284c7 0%, #0369a1 25%, #075985 50%, #0c4a6e 80%, #0a3d5c 100%);">
<div class="absolute top-0 right-0 w-[420px] opacity-30 pointer-events-none cloud-drift cloud-1" style="mix-blend-mode: screen;">
<Cloud variant={5} opacity={1} />
</div>
<div class="container-page relative pt-16 md:pt-20 pb-20">
<a href="/use-cases/" class="inline-flex items-center gap-1.5 text-[12px] text-white/65 hover:text-white">
<Icon name="arrowRight" size={12} class="rotate-180" />
{eyebrow}
</a>
<h1 class="mt-4 text-[36px] sm:text-[48px] md:text-[60px] font-semibold tracking-[-0.03em] leading-[1.02] text-white max-w-3xl">
{title}
</h1>
<p class="mt-5 text-[15.5px] md:text-[17px] text-white/75 max-w-2xl leading-relaxed">
{intro}
</p>
</div>
</section>
<!-- CAPS ROW: overlapping into white -->
<section class="relative -mt-10 pb-16">
<div class="container-page">
<div class="grid grid-cols-2 md:grid-cols-4 gap-px bg-[color:var(--border)] rounded-[14px] overflow-hidden ring-1 ring-[color:var(--border)]" style="box-shadow: 0 30px 60px -30px rgba(2,32,71,0.3), var(--shadow-sm);">
{caps.map((c) => (
<div class="bg-white p-5 md:p-6">
<div class="text-[10.5px] uppercase tracking-[0.16em] font-mono text-muted-foreground">{c.label}</div>
<div class="mt-2 text-[24px] md:text-[28px] font-semibold tracking-[-0.025em] text-heading leading-none">{c.value}</div>
</div>
))}
</div>
</div>
</section>
<!-- CHALLENGES: split layout, sticky title -->
<section class="bg-[color:var(--surface-1)] border-y border-[color:var(--border)] py-16 md:py-20">
<div class="container-page grid lg:grid-cols-[1fr_2fr] gap-12 lg:gap-20">
<div class="lg:sticky lg:top-24 self-start">
<div class="text-[11px] uppercase tracking-[0.18em] text-muted-foreground font-mono mb-3">The pattern</div>
<h2 class="text-[26px] md:text-[32px] font-semibold tracking-[-0.025em] text-heading leading-[1.1]">
What usually goes wrong.
</h2>
</div>
<div class="divide-y divide-[color:var(--border)]">
{challenges.map((c, i) => (
<div class="py-5 grid grid-cols-[40px_1fr] gap-4 first:pt-0">
<div class="text-[11px] font-mono text-rose-500 pt-1">×{String(i + 1).padStart(2, '0')}</div>
<div>
<div class="text-[15.5px] font-semibold text-heading">{c.title}</div>
<p class="mt-1.5 text-[14px] text-foreground/75 leading-relaxed">{c.body}</p>
</div>
</div>
))}
</div>
</div>
</section>
<!-- RECIPE: numbered steps in a clean stepper -->
<section class="py-16 md:py-20">
<div class="container-page">
<div class="text-[11px] uppercase tracking-[0.18em] text-muted-foreground font-mono mb-3">Recipe</div>
<h2 class="text-[26px] md:text-[34px] font-semibold tracking-[-0.025em] text-heading max-w-2xl">
How to set this up in Warmbly.
</h2>
<div class="mt-12 relative">
<div class="absolute left-[18px] md:left-[20px] top-2 bottom-2 w-px bg-[color:var(--border)]"></div>
<div class="space-y-4">
{recipe.map((r, i) => (
<div class="grid grid-cols-[44px_1fr] gap-4 items-start">
<div class="relative">
<div class="w-9 h-9 rounded-full bg-white ring-1 ring-[color:var(--sky-2)] text-[12px] font-mono text-[color:var(--sky-7)] inline-flex items-center justify-center font-semibold">
{String(i + 1).padStart(2, '0')}
</div>
</div>
<div class="rounded-[12px] bg-white ring-1 ring-[color:var(--border)] p-5" style="box-shadow: var(--shadow-sm);">
<div class="text-[15px] font-semibold text-heading">{r.title}</div>
<p class="mt-1.5 text-[13.5px] text-foreground/75 leading-relaxed">{r.body}</p>
</div>
</div>
))}
</div>
</div>
</div>
</section>
<CTA />
</Layout>