Rebuild navbar, hero, and feature sections in adaline style
- navbar: sticky, transparent to blur-on-scroll, wordmark + mono nav links + theme toggle + Download CTA, Reicon Menu/Xmark icons (components/layout) - theme-toggle: Reicon Sun/Moon icons - hero: meadow badge, tight Instrument Sans headline, Download + How-it-works CTAs, availability line, framed dashboard shot (components/sections) - features: five stacked heading-over-panel sections mapping the org chart, office, messages, connectors and cost-control screens - ui/media-frame: shared framed product-shot panel - reveal: progressive enhancement — content is visible without JS and only hidden once the js class is present, then revealed on scroll - remove the superseded flat navbar/hero/features components Verified: next build green; desktop + mobile screenshots reviewed.
This commit is contained in:
1 parent
b1e2374c7b
commit
c0f677ccc9
12 files changed
+261
-487
No files matched your search
@@ -0,0 +1,18 @@
|
||||
import { Reveal } from "../ui/reveal";
|
||||
import { SectionHeading } from "../ui/section-heading";
|
||||
import { MediaFrame } from "../ui/media-frame";
|
||||
import type { FeatureSection as FeatureSectionData } from "../../lib/landing-content";
|
||||
|
||||
/** One feature: heading + subhead above a full-width product panel (adaline rhythm). */
|
||||
export function FeatureSection({ feature }: { feature: FeatureSectionData }) {
|
||||
return (
|
||||
<div id={feature.id} className="flex scroll-mt-24 flex-col gap-8 md:gap-10">
|
||||
<Reveal>
|
||||
<SectionHeading eyebrow={feature.eyebrow} title={feature.title} description={feature.description} />
|
||||
</Reveal>
|
||||
<Reveal delay={90}>
|
||||
<MediaFrame src={feature.image} alt={feature.imageAlt} />
|
||||
</Reveal>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import { Container } from "../ui/container";
|
||||
import { FeatureSection } from "./feature-section";
|
||||
import { featureSections } from "../../lib/landing-content";
|
||||
|
||||
export function Features() {
|
||||
return (
|
||||
<section id="features" className="scroll-mt-20 py-20 md:py-28 lg:py-32">
|
||||
<Container className="flex flex-col gap-24 md:gap-32">
|
||||
{featureSections.map((feature) => (
|
||||
<FeatureSection key={feature.id} feature={feature} />
|
||||
))}
|
||||
</Container>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
import { Container } from "../ui/container";
|
||||
import { Badge } from "../ui/badge";
|
||||
import { Button } from "../ui/button";
|
||||
import { MediaFrame } from "../ui/media-frame";
|
||||
import { landingHeroNarrative } from "../../lib/product-narrative";
|
||||
|
||||
export function Hero() {
|
||||
return (
|
||||
<section className="relative overflow-hidden">
|
||||
<div
|
||||
aria-hidden="true"
|
||||
className="pointer-events-none absolute inset-0"
|
||||
style={{
|
||||
background:
|
||||
"radial-gradient(ellipse 70% 50% at 50% -5%, var(--glow-warm) 0%, transparent 70%), radial-gradient(ellipse 50% 40% at 50% 10%, var(--glow-accent) 0%, transparent 60%)",
|
||||
}}
|
||||
/>
|
||||
|
||||
<Container className="relative pb-16 pt-20 md:pb-24 md:pt-28 lg:pt-36">
|
||||
<div className="flex flex-col items-center text-center">
|
||||
<Badge className="enter-rise">{landingHeroNarrative.eyebrow}</Badge>
|
||||
|
||||
<h1
|
||||
className="enter-rise mt-7 max-w-[17ch] text-balance text-[40px] font-medium leading-[1.04] tracking-[-0.03em] text-[var(--text)] md:text-[54px] lg:text-[64px]"
|
||||
style={{ animationDelay: "0.06s" }}
|
||||
>
|
||||
{landingHeroNarrative.titleLine1} {landingHeroNarrative.titleLine2}
|
||||
</h1>
|
||||
|
||||
<p
|
||||
className="enter-rise mt-6 max-w-[60ch] text-lg leading-relaxed text-[var(--muted)] md:text-xl"
|
||||
style={{ animationDelay: "0.12s" }}
|
||||
>
|
||||
{landingHeroNarrative.description}
|
||||
</p>
|
||||
|
||||
<div
|
||||
className="enter-rise mt-9 flex flex-wrap items-center justify-center gap-3"
|
||||
style={{ animationDelay: "0.18s" }}
|
||||
>
|
||||
<Button href="#download">Download</Button>
|
||||
<Button href="#how-it-works" variant="ghost">
|
||||
How it works
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
<p
|
||||
className="eyebrow enter-rise mt-6 text-sm text-[var(--muted)]"
|
||||
style={{ animationDelay: "0.24s" }}
|
||||
>
|
||||
{landingHeroNarrative.availability}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="enter-rise mt-14 md:mt-20" style={{ animationDelay: "0.3s" }}>
|
||||
<MediaFrame
|
||||
src="/images/dashboard.webp"
|
||||
alt="AgentCompany desktop dashboard showing the quarter goal, budget, agent workload, and recent runs"
|
||||
priority
|
||||
/>
|
||||
</div>
|
||||
</Container>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user