pcbjam/site/src/components/Pillar.astro
Viktor Vaczi 7f9dbdd068 feat(site): 🛬 PCBJam landing page — waitlist, sections, Tailwind
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>
2026-06-07 14:59:13 +02:00

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>