import type { ReactNode } from 'react';
/** Editorial section: kicker, serif title, optional description and right-aligned actions. */
export function Section({
id,
kicker,
title,
description,
actions,
children,
className = '',
level = 2,
}: {
id?: string;
kicker?: string;
title: ReactNode;
description?: ReactNode;
actions?: ReactNode;
children: ReactNode;
className?: string;
level?: 2 | 3;
}) {
const H = level === 3 ? 'h3' : 'h2';
return (
{kicker ?
{kicker}
: null}
{title}
{description ?
{description}
: null}
{actions ?
{actions}
: null}
{children}
);
}
export function PageHeader({ kicker, title, lede, children, className = '' }: { kicker?: string; title: ReactNode; lede?: ReactNode; children?: ReactNode; className?: string }) {
return (
{kicker ? {kicker}
: null}
{title}
{lede ? {lede}
: null}
{children}
);
}
/** Definition list in two columns, dense. */
export function KV({ items, className = '' }: { items: Array<{ k: ReactNode; v: ReactNode }>; className?: string }) {
const rows = items.filter((i) => i.v !== null && i.v !== undefined && i.v !== '');
if (rows.length === 0) return null;
return (
{rows.map((r, i) => (
- {r.k}
- {r.v}
))}
);
}
export function Note({ children, tone = 'neutral' }: { children: ReactNode; tone?: 'neutral' | 'warn' }) {
return {children}
;
}