import type { ButtonHTMLAttributes, ReactNode } from 'react';
import { cx } from '@/lib/cx';
// Primitives visuelles du design « Bénévoles Festival » : bordures franches,
// ombres portées dures, libellés capitales. Aucun texte en dur ici — les
// libellés sont passés par les écrans (via i18n).
export function Panel({
children,
className,
shadow = 'md',
}: {
children: ReactNode;
className?: string;
shadow?: 'none' | 'md' | 'lg';
}) {
return (
{children}
);
}
export function PanelHeader({
children,
hatched = false,
className,
}: {
children: ReactNode;
hatched?: boolean;
className?: string;
}) {
return (
{children}
);
}
type BtnVariant = 'solid' | 'ghost' | 'danger' | 'dark';
export function Btn({
variant = 'solid',
className,
type = 'button',
...props
}: ButtonHTMLAttributes & { variant?: BtnVariant }) {
return (
);
}
export function Chip({
active,
children,
onClick,
}: {
active: boolean;
children: ReactNode;
onClick: () => void;
}) {
return (
);
}
type BadgeTone = 'success' | 'info' | 'warn' | 'danger' | 'neutral';
export function Badge({ tone, children }: { tone: BadgeTone; children: ReactNode }) {
return (
{children}
);
}
export function Stepper({
value,
onDecrement,
onIncrement,
suffix,
}: {
value: ReactNode;
onDecrement: () => void;
onIncrement: () => void;
suffix?: string;
}) {
return (
{value}
{suffix ? ` ${suffix}` : null}
);
}
export function StatCard({
value,
label,
tone = 'paper',
}: {
value: ReactNode;
label: string;
tone?: 'paper' | 'yellow' | 'green';
}) {
return (
);
}
/**
* Petit repère « ? » : au survol (ou au focus clavier/tactile), affiche
* `text` dans une bulle. Sert à sortir les indications d'usage du flux de la
* page plutôt que de les y afficher en permanence.
*/
export function HelpTip({
text,
side = 'top',
className,
}: {
text: string;
side?: 'top' | 'bottom';
className?: string;
}) {
return (
{text}
);
}
export function FieldLabel({ children }: { children: ReactNode }) {
return (
{children}
);
}
export function TextInput({
value,
onChange,
mono = false,
className,
}: {
value: string;
onChange: (value: string) => void;
mono?: boolean;
className?: string;
}) {
return (
onChange(e.target.value)}
className={cx(
'w-full border-2 border-ink bg-cream p-[9px] text-[13px]',
mono ? 'font-mono' : 'font-display font-bold',
className,
)}
/>
);
}