Replace the placeholder homepage with the PCBJam waitlist conversion page (13 sections from the copy spec), shared chrome, and a real email-capture backend, keeping the site zero-runtime-JS / zero-web-font. - Tailwind v4 via @tailwindcss/postcss (the Vite plugin breaks on Astro 6 rolldown-vite); Preflight skipped; brand tokens in :root + @theme inline. - Waitlist: /api/waitlist serverless route (prerender=false) + Resend, with dual JSON/303 responses; WaitlistForm progressive enhancement bound on astro:page-load (survives ClientRouter swaps); honeypot + validation. - New components (Icon, Placeholder, DemoVideo, SectionBand, Chip, EECredit, StatBar, Pillar, Step, CheckItem, WaitlistForm) + 13 section components. - Redesigned Header (sticky, mobile menu, CTA) + 4-col Footer (KiCad attribution); BaseLayout gains full-bleed mode + OG/canonical meta. - Assets scaffolded with marked placeholders; EE/generic/client SVGs copied. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
35 lines
690 B
Text
35 lines
690 B
Text
---
|
|
/** Pillar — one value-pillar card (§10). Body via default slot. */
|
|
import Icon from './Icon.astro';
|
|
interface Props {
|
|
title: string;
|
|
icon?: string;
|
|
iconMode?: 'mask' | 'img';
|
|
}
|
|
const { title, icon, iconMode = 'mask' } = Astro.props;
|
|
---
|
|
|
|
<div class="card pillar">
|
|
{icon && <Icon name={icon} mode={iconMode} size="2.25rem" alt="" class="pillar-icon" />}
|
|
<h3>{title}</h3>
|
|
<p class="muted"><slot /></p>
|
|
</div>
|
|
|
|
<style>
|
|
.pillar {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
.pillar-icon {
|
|
color: var(--accent);
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
.pillar h3 {
|
|
margin: 0;
|
|
}
|
|
.pillar p {
|
|
margin: 0;
|
|
line-height: 1.55;
|
|
}
|
|
</style>
|