Feedback
Feedback components inherit from BaseFeedback. They appear, deliver a message, and (usually) disappear. Key decisions: auto-dismiss timing, dismiss gestures, stacking behavior, and screen reader announcements.
Notification
Base: BaseFeedback
States: entering, visible, exiting, dismissed
Dev-fill slots:
announce.entering— screen reader announcement (required)stacking.maxVisible— how many notifications visible at oncestacking.onOverflow— queue, replace oldest, or collapse- Auto-dismiss timing, dismiss gesture (swipe, click X)
Key behavior: Appears with enter animation, optionally auto-dismisses after a timeout. Screen reader announces the message via ARIA live region. Stacking manager controls z-order and overflow behavior.
import { Notification } from './kevlar';
<Notification
title="File uploaded"
announce={{ entering: 'File uploaded successfully' }}
>
Your document has been saved.
</Notification>Alert
Base: BaseFeedback
States: entering, visible, exiting, dismissed
Dev-fill slots:
announce.entering— screen reader announcement (required)variant— info, success, warning, error- Dismiss behavior (closable or persistent)
Key behavior: Persistent by default (does not auto-dismiss). role="alert" for error/warning variants, role="status" for info/success. Closable alerts have a close button that follows ActionIcon behavior.
import { Alert } from './kevlar';
<Alert
title="Warning"
variant="warning"
announce={{ entering: 'Warning: your session will expire in 5 minutes' }}
>
Your session will expire in 5 minutes. Save your work.
</Alert>Progress
Base: BaseFeedback
States: idle, active, completed
Dev-fill slots:
announce.active— screen reader announcement for progress updatesaria-label— describes what is being measured
Key behavior: Linear progress bar. Supports determinate (with value) and indeterminate (animated) modes. Screen reader announces progress percentage at configurable intervals (not on every frame).
import { Progress } from './kevlar';
<Progress
value={65}
aria-label="Upload progress"
announce={{ active: 'Upload 65% complete' }}
/>RingProgress
Base: BaseFeedback
States: idle, active, completed
Dev-fill slots:
announce.active— screen reader announcementaria-label— describes what is being measured
Key behavior: Circular progress indicator. Supports multiple sections with different colors. Center can contain custom content (label, icon, percentage).
import { RingProgress } from './kevlar';
<RingProgress
sections={[{ value: 40, color: 'blue' }]}
aria-label="Storage usage"
announce={{ active: '40% storage used' }}
/>SemiCircleProgress
Base: BaseFeedback
States: idle, active, completed
Dev-fill slots:
announce.active— screen reader announcementaria-label— describes what is being measured
Key behavior: Half-circle progress indicator. Useful for gauge-style displays. Same ARIA pattern as Progress.
import { SemiCircleProgress } from './kevlar';
<SemiCircleProgress
value={75}
aria-label="Performance score"
announce={{ active: 'Performance score: 75 out of 100' }}
/>Loader
Base: BaseFeedback
States: visible
Dev-fill slots:
aria-label— describes what is loading (defaults to “Loading”)
Key behavior: Indeterminate loading indicator (spinner, dots, bars). Always announces “Loading” to screen readers when it appears. Animation respects prefers-reduced-motion (simplified or paused animation).
import { Loader } from './kevlar';
<Loader aria-label="Loading search results" />Skeleton
Base: BaseFeedback
States: loading, loaded
Dev-fill slots:
aria-label— describes the content being loaded
Key behavior: Placeholder skeleton that shows while content is loading. Shimmer animation respects prefers-reduced-motion. Transitions to actual content with a configurable reveal animation. aria-busy="true" while loading.
import { Skeleton } from './kevlar';
<Skeleton visible={isLoading} aria-label="Loading article content">
<Text>This content appears after loading</Text>
</Skeleton>