);
}
// ─── Eyebrow ─────────────────────────────────────────
function BlogEyebrow({ children, color = BS.green }) {
return (
{children}
);
}
// ─── Reveal ───────────────────────────────────────────
// Pass-through wrapper. Content is always visible — entrance motion is
// optional and applied via a CSS keyframe class that only enhances; if the
// animation engine doesn't run, the content stays readable.
function Reveal({ children, delay = 0, as = 'div', style = {}, ...rest }) {
const Tag = as;
return (
{children}
);
}
// ─── Image placeholder ───────────────────────────────
// Wraps with editorial styling. Drop a file onto it and the
// placeholder swaps for the real photo (persisted across reloads).
function EditorialImage({
id, ratio = '4 / 3', src = null,
direction = 'Drop an image, or describe the shot',
radius = 16, kicker = null, // optional badge top-left
style = {}, className = '',
}) {
return (
{/* Dotted pattern — only visible when slot is empty (image-slot covers it once filled) */}
{src ? (
) : (
)}
{kicker && (