Showcase index
Actions
Forms
Feedback
Content
Feedback
Alerts in eight tones, native modals and the two ways of saying something is on its way.
Alerts
Notices in eight tones, the same palette as the intents: the four semantic status ones and the four named tonal ones.
Modals
The native dialog on an opaque theme surface: trapped focus, Esc closes, the page behind locks and the background blurs into illegibility so the modal is the only focus; clicking outside does not close. The modal takes the same intents as the buttons: the edge wedge, like the alerts, and the primary action follow the tone.
.es-dialog
.es-dialog--sm … .es-dialog--xxl
.es-dialog + .es-i--*
Account modals
Sign in, create account, recover and change the password, and the locked session: five ready compositions over the same echo-modal. None of them talks to the network — each emits submit with the data and expects the pending and error props from the caller.
<auth-login-modal> · <auth-register-modal> · <auth-forgot-password-modal>
The three talk to each other: the links inside each one switch modals without closing the flow.
<auth-update-password-modal> · <auth-lock-modal>
The lock has no close button and refuses Escape; in this sample, any 8-character password unlocks it.
Blocking and skeletons
The two ways of saying something is on its way: the veil covering a ready region and the smear standing in for what has not arrived.
<echo-block>
Click the button to see the region covered. While the veil is up the content is inert: Tab does not enter it.
.es-skeleton
Toasts
The notice that floats over the page, queued by a global composable. The announcement region stays mounted even when empty: one that only appears with the message often goes unread.
useToast().push()
position + align
The position lives in global state, so anywhere in the app can ask where the notice shows up.
timeout: 0
With a zero timeout the notice stays until someone closes it; the default fades after 4.5 seconds.
Spinners
Always aria-hidden: what announces loading is the region aria-busy, and a spinner announced on its own does not say what is happening.
.es-spinner
.es-spinner + .es-i--*