Accessibility
EmptyState from @prepared911/ui-core composes an icon, heading, description, and optional actions. The component renders readable copy and delegates interactive behavior to its actions; your job is to name the region, prioritize actions correctly, and let the live region announce the state when it appears asynchronously.
title renders as a heading at an appropriate level.description renders as body text.primaryAction and secondaryAction render in a predictable order and keep focus flow linear.icon is rendered aria-hidden by default.<section aria-labelledby="..."> or role="status" when it appears asynchronously after a filter change) so assistive tech can route to it.role="status" with aria-live="polite" so the rotor announces the result without stealing focus.Button keyboard behavior (see Button accessibility).tabIndex to the region.role="status" when the empty state results from an async filter or search change.aria-hidden="true") with meaning conveyed by the heading and description.prefers-reduced-motion: reduce; a static appearance is sufficient to communicate the new state.EmptyState for zero-data and filtered states. For failures ("couldn't load incidents"), use an error state with a retry action and a different tone—don't reuse EmptyState copy.