import type { ElementType, ReactNode, HTMLAttributes } from "react"; import "@shared/components/Stack.css"; export type StackGap = | "0" | "0_5" | "1" | "1_5" | "2" | "3" | "4" | "5" | "6" | "8"; export type StackAlign = "stretch" | "start" | "center" | "end" | "baseline"; export type StackJustify = | "start" | "center" | "end" | "between" | "around" | "evenly"; export interface StackProps extends HTMLAttributes { /** Token-aligned gap between children (maps to `--space-*`). */ gap?: StackGap; align?: StackAlign; justify?: StackJustify; /** Stretch to fill parent height. */ fill?: boolean; /** Render as a custom element (defaults to div). */ as?: ElementType; children?: ReactNode; } /** * Vertical flex column with token-aligned gap. Replaces inline * `style={{ display: 'flex', flexDirection: 'column', gap: ... }}` everywhere. */ export function Stack({ gap = "2", align, justify, fill, as, className, children, ...rest }: StackProps) { const Tag: ElementType = as ?? "div"; const classes = [ "sui-stack", `sui-stack--gap-${gap}`, align ? `sui-stack--align-${align}` : "", justify ? `sui-stack--justify-${justify}` : "", fill ? "sui-stack--fill" : "", className ?? "", ] .filter(Boolean) .join(" "); return ( {children} ); }