import type { LucideIcon } from 'lucide-react'; import type { ReactNode } from 'react'; import { Loader2, TriangleAlert } from 'lucide-react'; import { cn } from 'helpers/cn'; import { useTranslation } from '@/components/locales'; // Loading, failed, empty. See docs/design-language-interface.md § 6. // // These are the states a new user meets FIRST — before a single record exists, before a token is // pasted, when something is misconfigured. Treating them as filler is how an app ends up saying "No // results" to someone who cannot tell whether that means "nothing here" or "it is broken". // // One implementation, so all three agree on size, spacing and centring across every app. They fill // their container rather than sitting at the top, because a half-empty pane with a line of grey text // stuck to the ceiling reads as a rendering bug. const Shell = ({ children, className }: { children: ReactNode; className?: string }) => (
{label ?? t('state.loading')}
{title}
{message &&{message}
}{title}
{hint &&{hint}
}