import { Button, EmptyState, EmptyStateActions, EmptyStateDescription, EmptyStateEyebrow, EmptyStateHeader, EmptyStateMedia, EmptyStateTitle } from "@ai-ui/ui"; import type { Meta, StoryObj } from "@storybook/react"; function EmptyStateGlyph() { return (
); } function ReleaseEmptyState({ description = "Adjust the current filters or create a new release to start routing work.", eyebrow = "No results", tone = "default", title = "No matching releases" }: { description?: string; eyebrow?: string; title?: string; tone?: "default" | "subtle" | "accent"; }) { return ( {eyebrow} {title} {description} ); } const meta = { title: "Components/EmptyState", component: ReleaseEmptyState, parameters: { docs: { description: { component: "EmptyState is the system surface for no-results, first-run, and no-content moments that should still feel intentional. It gives teams one stable composition for media, framing copy, and next-step actions instead of improvising ad hoc placeholder cards." } }, layout: "centered" }, tags: ["autodocs"] } satisfies Meta; export default meta; type Story = StoryObj; export const Playground: Story = {}; export const Scenarios: Story = { render: () => (
) }; export const Anatomy: Story = { render: () => (

Empty state anatomy

data-slot=\"media\" holds the decorative or explanatory visual.

data-slot=\"header\",{" "} data-slot=\"eyebrow\",{" "} data-slot=\"label\", and{" "} data-slot=\"description\"{" "} structure the framing copy.

data-slot=\"actions\" groups the primary next step and any secondary recovery action.

data-tone exposes whether the surface stays neutral, subtle, or accent-led.

) }; export const Accessibility: Story = { parameters: { docs: { description: { story: "Use empty states to explain what happened and what the user can do next. Keep the title concrete, the description actionable, and ensure the primary action is a real next step rather than decorative reassurance." } } }, render: () => (

Accessibility notes

Describe the absence clearly. "No matching releases" is better than "Nothing here".

Use actions that recover the user, such as clearing filters or creating the first item.

Do not hide critical instructions inside decorative media. The copy should stand on its own.

) };