import type { HTMLAttributes, ReactNode, AnchorHTMLAttributes, ElementType } from "react"; import { cx } from "./utils"; import { Icon, type IconName } from "./Icon"; import { IconBlock, type IconBlockProps } from "./IconBlock"; import { Pictogram, type PictogramName } from "./Pictogram"; /* — Container ————————————————————————————— */ export type ContainerProps = HTMLAttributes & { variant?: "default" | "narrow" | "wide" | "fluid"; as?: ElementType; }; export function Container({ variant = "default", as: As = "div", className, children, ...rest }: ContainerProps) { const Tag = As as ElementType; return ( {children} ); } /* — Section ————————————————————————————— */ export type SectionProps = HTMLAttributes & { size?: "sm" | "md" | "lg"; variant?: "default" | "surface" | "muted" | "brand-soft"; }; export function Section({ size = "md", variant = "default", className, children, ...rest }: SectionProps) { return (
{children}
); } /* — Stack & Inline ————————————————————————————— */ export function Stack({ gap = "md", className, children, ...rest }: HTMLAttributes & { gap?: "xs" | "sm" | "md" | "lg" | "xl" }) { return (
{children}
); } export function Inline({ align, className, children, ...rest }: HTMLAttributes & { align?: "end" | "between" | "center" }) { return (
{children}
); } /* — Card ————————————————————————————— */ export function Card({ raised, flat, noPadding, className, children, ...rest }: HTMLAttributes & { raised?: boolean; flat?: boolean; noPadding?: boolean; }) { return (
{children}
); } Card.Header = function CardHeader({ children, className, ...rest }: HTMLAttributes) { return
{children}
; }; Card.Title = function CardTitle({ children, className, ...rest }: HTMLAttributes) { return

{children}

; }; Card.Desc = function CardDesc({ children, className, ...rest }: HTMLAttributes) { return

{children}

; }; Card.Footer = function CardFooter({ children, className, ...rest }: HTMLAttributes) { return
{children}
; }; /* — Tile ————————————————————————————— */ export type TileProps = AnchorHTMLAttributes & { title: ReactNode; desc?: ReactNode; /** Petite icône carrée (style basique, 48×48). */ icon?: IconName; /** IconBlock — pattern recommandé : icône fill colorée sur fond rond. */ iconBlock?: IconName; /** Couleur sémantique de l'IconBlock. */ iconColor?: IconBlockProps["color"]; /** Variante visuelle de l'IconBlock. */ iconVariant?: IconBlockProps["variant"]; /** Pictogramme illustré (legacy v0.2). */ pictogram?: PictogramName; /** Disposition horizontale (icône à gauche). */ horizontal?: boolean; /** Cache la flèche d'invitation. */ noArrow?: boolean; /** Taille — sm (compact), md (défaut), lg (hero). */ size?: "sm" | "md" | "lg"; }; export function Tile({ title, desc, icon, iconBlock, iconColor = "brand", iconVariant = "soft", pictogram, horizontal, noArrow, size = "md", className, children, ...rest }: TileProps) { const blockSize = size === "sm" ? "sm" : size === "lg" ? "lg" : "md"; return ( {iconBlock ? ( ) : pictogram ? ( ) : icon ? ( ) : null}
{title} {!noArrow && ( )} {desc && {desc}} {children}
); } /* — Hero ————————————————————————————— */ export function Hero({ title, lead, actions, className, ...rest }: HTMLAttributes & { title: ReactNode; lead?: ReactNode; actions?: ReactNode; }) { return (

{title}

{lead &&

{lead}

} {actions &&
{actions}
}
); }