diff --git a/landing/components/sections/bento.tsx b/landing/components/sections/bento.tsx index 97025b98..9aa5006a 100644 --- a/landing/components/sections/bento.tsx +++ b/landing/components/sections/bento.tsx @@ -5,6 +5,7 @@ import { Container } from "../ui/container"; import { Reveal } from "../ui/reveal"; import { Eyebrow } from "../ui/eyebrow"; import { SectionHeading } from "../ui/section-heading"; +import { ArtStage } from "../ui/art-stage"; import { featureSections, type FeatureSection } from "../../lib/landing-content"; // Explicit order + column spans so the cells pack into full 12-column rows. @@ -39,17 +40,13 @@ function BentoCard({ feature, span }: { feature: FeatureSection; span: string })

{feature.title}

{feature.description}

-
- {feature.imageAlt} -
+ ); } diff --git a/landing/components/sections/hero.tsx b/landing/components/sections/hero.tsx index 94fe9dec..f1e86cee 100644 --- a/landing/components/sections/hero.tsx +++ b/landing/components/sections/hero.tsx @@ -1,7 +1,7 @@ import { Container } from "../ui/container"; import { Badge } from "../ui/badge"; import { Button } from "../ui/button"; -import { MediaFrame } from "../ui/media-frame"; +import { ArtStage } from "../ui/art-stage"; import { landingHeroNarrative } from "../../lib/product-narrative"; export function Hero() { @@ -52,25 +52,13 @@ export function Hero() {

-
- diff --git a/landing/components/ui/art-stage.tsx b/landing/components/ui/art-stage.tsx new file mode 100644 index 00000000..01d13093 --- /dev/null +++ b/landing/components/ui/art-stage.tsx @@ -0,0 +1,68 @@ +// Fractal-noise film grain (inline data URI, allowed by img-src 'self' data:). +const GRAIN = + "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)'/%3E%3C/svg%3E\")"; + +const AURORA_WASH = + "radial-gradient(60% 55% at 26% 16%, var(--aurora-mint) 0%, transparent 62%)," + + "radial-gradient(52% 52% at 84% 84%, var(--aurora-teal) 0%, transparent 60%)," + + "radial-gradient(46% 48% at 60% 50%, var(--aurora-lime) 0%, transparent 66%)"; + +/** Ambient color wash derived from `ambientSrc`, given the src's own path. */ +export function ambientFor(src: string): string { + return src.replace("/images/", "/images/ambient/"); +} + +/** + * A product screenshot floating over an atmospheric wash painted from its own + * colours (a heavily blurred thumbnail), plus the aurora and a fine film grain. + */ +export function ArtStage({ + src, + alt, + priority = false, + className = "", + stageClassName = "p-5 sm:p-8 md:p-10", + contentClassName = "w-full", +}: { + src: string; + alt: string; + priority?: boolean; + className?: string; + stageClassName?: string; + contentClassName?: string; +}) { + return ( +
+ +