import { cn } from '@/lib/utils' /** * Register-detail document grammar (customers, suppliers, articles). * * A detail page is one flowing document, not a pile of cards: each group of * facts is introduced by an uppercase hairline kicker and set as aligned * label/value rows. The kicker's hairline is the only rule; groups are * separated by whitespace, never borders (Living Paper, design.md). */ export function DetailSection({ kicker, help, aside, children, className, }: { kicker: string /** Section help behind a "?" right after the kicker (convention 7). Pass a . */ help?: React.ReactNode /** Optional right-aligned element on the kicker line: a count, a quiet action. */ aside?: React.ReactNode children: React.ReactNode className?: string }) { return (
{/* data-ph-unmask: kickers are static i18n chrome in session replays. */}

{kicker} {help}

{aside}
{children}
) } export function DefRow({ label, children, className, }: { label: string children: React.ReactNode className?: string }) { return (
{/* data-ph-unmask on the label only: values (children) are user data and stay masked in session replays. */}
{label}
{children}
) } /** * Muted placeholder for a value that matters but is not filled in. The en dash * is the literal rendered value (same vocabulary as the orders list), which is * why it is allowed to be a dash at all. */ export function DefEmpty() { return {'–'} }