From fb6730813fbc7bb17e454da55d5a327341529225 Mon Sep 17 00:00:00 2001 From: Tyler Date: Fri, 19 Jun 2026 19:35:59 -0600 Subject: [PATCH] feat(frontend): add EmptyState primitive --- src/components/ui/empty-state.tsx | 63 +++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/components/ui/empty-state.tsx diff --git a/src/components/ui/empty-state.tsx b/src/components/ui/empty-state.tsx new file mode 100644 index 0000000..1847a63 --- /dev/null +++ b/src/components/ui/empty-state.tsx @@ -0,0 +1,63 @@ +import * as React from "react"; +import { Inbox } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { cn } from "@/lib/utils"; + +type EmptyStateProps = { + /** All-caps instrument label, e.g. "Claims ยท inbox idle". */ + eyebrow?: string; + /** One-line plain-language message. No apologetic language. */ + message: string; + /** Optional action surfaced as a small outline button. */ + action?: { label: string; onClick: () => void }; + /** Override the default inbox icon. */ + icon?: React.ReactNode; + className?: string; +}; + +/** + * Empty surface state. + * Voice: instrument-label eyebrow + a one-line message + optional action. + * Quiet. Hairline. No apology copy. + */ +export function EmptyState({ + eyebrow, + message, + action, + icon, + className, +}: EmptyStateProps) { + return ( +
+
+ {icon ?? } +
+ {eyebrow ? ( +
+ {eyebrow} +
+ ) : null} +
+ {message} +
+ {action ? ( + + ) : null} +
+ ); +}