All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 10s
Build & Deploy / 🏗️ Build (push) Successful in 23m32s
Build & Deploy / 🚀 Deploy (push) Successful in 2m25s
Build & Deploy / 🧪 QA (push) Successful in 3m50s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 4m49s
Build & Deploy / 🔔 Notify (push) Successful in 3s
136 lines
4.5 KiB
TypeScript
136 lines
4.5 KiB
TypeScript
import * as React from "react";
|
|
import { Reveal } from "./Reveal";
|
|
import { Label } from "./Typography";
|
|
import { cn } from "../utils/cn";
|
|
|
|
interface SectionProps {
|
|
number?: string;
|
|
title?: string;
|
|
children: React.ReactNode;
|
|
className?: string;
|
|
delay?: number;
|
|
variant?: "white" | "gray" | "glass";
|
|
borderTop?: boolean;
|
|
borderBottom?: boolean;
|
|
containerVariant?: "narrow" | "normal" | "wide";
|
|
illustration?: React.ReactNode;
|
|
effects?: React.ReactNode;
|
|
}
|
|
|
|
export const Section: React.FC<SectionProps> = ({
|
|
number,
|
|
title,
|
|
children,
|
|
className = "",
|
|
delay = 0,
|
|
variant = "white",
|
|
borderTop = false,
|
|
borderBottom = false,
|
|
containerVariant = "narrow",
|
|
illustration,
|
|
effects,
|
|
}) => {
|
|
const hasSidebar = !!(number || title || illustration);
|
|
const bgClass = {
|
|
white: "bg-white",
|
|
gray: "bg-slate-50/50",
|
|
glass: "glass-subtle",
|
|
}[variant];
|
|
|
|
const borderTopClass = borderTop ? "border-t border-slate-100" : "";
|
|
const borderBottomClass = borderBottom ? "border-b border-slate-100" : "";
|
|
const containerClass =
|
|
containerVariant === "wide"
|
|
? "wide-container"
|
|
: containerVariant === "normal"
|
|
? "container"
|
|
: "narrow-container";
|
|
|
|
return (
|
|
<section
|
|
className={cn(
|
|
"relative py-8 md:py-16 group overflow-hidden",
|
|
bgClass,
|
|
borderTopClass,
|
|
borderBottomClass,
|
|
className,
|
|
)}
|
|
>
|
|
{/* Tech divider with binary accent */}
|
|
{borderTop && (
|
|
<div className="absolute top-0 left-0 right-0 overflow-hidden">
|
|
<div
|
|
className="h-px w-full"
|
|
style={{
|
|
background:
|
|
"linear-gradient(90deg, transparent 0%, rgba(148, 163, 184, 0.2) 20%, rgba(191, 206, 228, 0.15) 50%, rgba(148, 163, 184, 0.2) 80%, transparent 100%)",
|
|
}}
|
|
/>
|
|
<div className="flex justify-center mt-2">
|
|
<span
|
|
className="text-[7px] font-mono tracking-[0.5em] text-slate-200 select-none"
|
|
aria-hidden="true"
|
|
>
|
|
01001101 01001001 01001110
|
|
</span>
|
|
</div>
|
|
</div>
|
|
)}
|
|
|
|
{/* Optional effects layer */}
|
|
{effects}
|
|
|
|
<div className={cn("relative z-10", containerClass)}>
|
|
{hasSidebar ? (
|
|
<div className="grid grid-cols-1 md:grid-cols-12 gap-4 md:gap-12 lg:gap-24">
|
|
{/* Sidebar: Number & Title */}
|
|
<div className="md:col-span-4 lg:col-span-3">
|
|
<div className="md:sticky md:top-40 flex flex-col gap-4 md:gap-8">
|
|
<div className="flex items-end md:flex-col md:items-start gap-6 md:gap-8">
|
|
{number && (
|
|
<Reveal delay={delay}>
|
|
<span className="block text-4xl md:text-8xl font-bold text-slate-100 leading-none select-none tracking-tighter relative">
|
|
{number}
|
|
<span
|
|
className="absolute -top-1 md:top-1 left-0 text-[7px] md:text-[8px] font-mono text-slate-200/30 tracking-wider leading-none select-none pointer-events-none"
|
|
aria-hidden="true"
|
|
>
|
|
{parseInt(number || "0")
|
|
.toString(2)
|
|
.padStart(8, "0")}
|
|
</span>
|
|
</span>
|
|
</Reveal>
|
|
)}
|
|
{title && (
|
|
<Reveal delay={delay + 0.1}>
|
|
<div className="flex items-center gap-3 md:gap-4 mb-2 md:mb-0">
|
|
<div className="w-1.5 h-1.5 rounded-full bg-slate-300 animate-circuit-pulse shrink-0" />
|
|
<Label className="text-slate-900 text-[9px] md:text-[10px] tracking-[0.3em] md:tracking-[0.4em]">
|
|
{title}
|
|
</Label>
|
|
</div>
|
|
</Reveal>
|
|
)}
|
|
</div>
|
|
{illustration && (
|
|
<Reveal delay={delay + 0.2}>
|
|
<div className="pt-2 md:pt-8 opacity-100 group-hover:scale-105 transition-transform duration-1000 ease-out origin-left grayscale hover:grayscale-0">
|
|
{illustration}
|
|
</div>
|
|
</Reveal>
|
|
)}
|
|
</div>
|
|
</div>
|
|
|
|
{/* Main Content */}
|
|
<div className="md:col-span-8 lg:col-span-9">{children}</div>
|
|
</div>
|
|
) : (
|
|
<div className="w-full">{children}</div>
|
|
)}
|
|
</div>
|
|
</section>
|
|
);
|
|
};
|