// SSE — Design primitives (shared UI building blocks)
// Hexagonal icon container — echoes the logo mark
function Hex({ size = 48, stroke = 'var(--navy)', fill = 'transparent', strokeWidth = 1.5, children, style }) {
const points = [];
const r = size / 2;
for (let i = 0; i < 6; i++) {
const a = (Math.PI / 3) * i - Math.PI / 2;
points.push(`${r + r * Math.cos(a) * 0.95},${r + r * Math.sin(a) * 0.95}`);
}
return (
);
}
// Section-scoped wrapper with consistent horizontal rhythm
function Section({ id, children, background = 'transparent', color = 'inherit', style }) {
return (
);
}
// Editorial kicker — small monospace label above headlines
function Kicker({ children, color = 'var(--amber)', style }) {
return (
{children}
);
}
// Big display headline
function Display({ children, size = 88, color = 'var(--navy)', style }) {
return (
{children}
);
}
function Button({ children, variant = 'primary', href, onClick, style, ...rest }) {
const base = {
fontFamily: 'var(--font-body)',
fontSize: 15,
fontWeight: 500,
padding: '14px 24px',
borderRadius: 999,
display: 'inline-flex',
alignItems: 'center',
gap: 10,
transition: 'all 0.2s ease',
letterSpacing: '-0.01em',
cursor: 'pointer',
border: '1px solid transparent',
...style,
};
const variants = {
primary: { background: 'var(--navy)', color: 'var(--paper)' },
amber: { background: 'var(--amber)', color: 'var(--ink)' },
outline: { background: 'transparent', color: 'var(--navy)', border: '1px solid var(--line-strong)' },
outlineLight: { background: 'transparent', color: 'var(--paper)', border: '1px solid rgba(245,243,238,0.3)' },
ghost: { background: 'transparent', color: 'var(--navy)' },
};
const merged = { ...base, ...variants[variant] };
const Comp = href ? 'a' : 'button';
return (
{ e.currentTarget.style.transform = 'translateY(-1px)'; }}
onMouseLeave={e => { e.currentTarget.style.transform = 'translateY(0)'; }}>
{children}
);
}
// Arrow glyph
function Arrow({ size = 14 }) {
return (
);
}
// Grid overlay — subtle blueprint lines for backgrounds
function GridOverlay({ color = 'rgba(10,26,62,0.05)', size = 80, style }) {
return (
);
}
// Product image placeholder — labeled clearly
function ProductPlaceholder({ label, aspect = '4/3', dark = false }) {
const bg = dark ? 'linear-gradient(135deg, #172958 0%, #0A1A3E 100%)' : 'linear-gradient(135deg, #EDE9DE 0%, #DDD8CB 100%)';
const fg = dark ? 'rgba(245,243,238,0.5)' : 'rgba(10,26,62,0.4)';
const line = dark ? 'rgba(245,243,238,0.08)' : 'rgba(10,26,62,0.08)';
return (
{/* blueprint crosshair */}
{/* center hex */}
{/* corner marks */}
{[[0,0],[0,1],[1,0],[1,1]].map(([x,y],i) => (
))}
);
}
Object.assign(window, { Hex, Section, Kicker, Display, Button, Arrow, GridOverlay, ProductPlaceholder });