Simple card
Title and subtitle
Actions
Forms
Feedback
Content
Avatars, file upload with a gallery, tables and lists.
The portrait frame in two shapes, circle and rounded. Without an image it shows the initials over the intent ink; the stack overlaps them with the theme ring.
.es-avatar--circle, .es-avatar--rounded
.es-avatar--xs … --xl
.es-avatar-stack
The pattern for every image a reader uploads: pick the usage, frame it, rotate, flip and apply a filter. It's how the profile photo gets changed.
<echo-image-cropper>
JPEG, PNG, WEBP, GIF or SVG.
The usage becomes the usage field of POST /api/v1/images; "other" takes a free name and sends it in snake_case. SVG isn't cropped — the modal becomes a viewer and the file goes whole.
Button and drop zone over the same label plus native input pair: click and keyboard already work, and dragging comes on top as an enhancement.
<echo-file-button>
.es-dropzone
.es-gallery




The system's reference table, listing the classes of the components on this very page.
| Component | Class | Note |
|---|---|---|
| Button | .es-btn | The shape; emphasis comes with the --primary modifier. |
| Alert | .es-alert | Modifiers --info, --success, --warn and --danger. |
| Modal | .es-dialog | Applied to the native dialog; the backdrop dims on its own. |
| Collapse | .es-collapse | Applied to the native details; the chevron rotates when open. |
| Input | .es-input | Works for input and textarea; focus comes from the global rule. |
| Select | .es-select | The same ink as the input, with a click cursor. |
| Table | .es-table | Wide content scrolls in the container, never the page. |
| List | .es-card | A flat card with divide utilities; no class of its own. |
The same columns with stripes, row hover, density and a pinned header. There is no dark variant: the theme already owns that.
.es-table--striped + .es-table--hover
| Person | Role | Status |
|---|---|---|
| Ada Lovelace | Engineering | Active |
| Grace Hopper | Platform | Active |
| Alan Turing | Research | Away |
| Edsger Dijkstra | Architecture | Inactive |
.es-table--dense
| Person | Role | Status |
|---|---|---|
| Ada Lovelace | Engineering | Active |
| Grace Hopper | Platform | Active |
| Alan Turing | Research | Away |
| Edsger Dijkstra | Architecture | Inactive |
.es-table--scroll + --table-h
The body scrolls and the header stays; the height comes from the --table-h token, set by the caller.
| Person | Role | Status |
|---|---|---|
| Ada Lovelace | Engineering | Active |
| Grace Hopper | Platform | Active |
| Alan Turing | Research | Away |
| Edsger Dijkstra | Architecture | Inactive |
| Ada Lovelace | Engineering | Active |
| Grace Hopper | Platform | Active |
| Alan Turing | Research | Away |
| Edsger Dijkstra | Architecture | Inactive |
| Ada Lovelace | Engineering | Active |
| Grace Hopper | Platform | Active |
| Alan Turing | Research | Away |
| Edsger Dijkstra | Architecture | Inactive |
| Ada Lovelace | Engineering | Active |
| Grace Hopper | Platform | Active |
| Alan Turing | Research | Away |
| Edsger Dijkstra | Architecture | Inactive |
Search, column sorting, pagination and selection over the same .es-table. Cells are drawn by slot, so an avatar or a badge fits in without the component knowing what they are.
| Situação | ||||
|---|---|---|---|---|
| Engenharia | 12 | Active | ||
| Plataforma | 8 | Active | ||
| Pesquisa | 5 | Away | ||
| Arquitetura | 3 | Inactive | ||
| Engenharia | 15 | Active |
5 of 7 rows
0 row(s) selected.
Header with actions on the right, body and optional footer. No fixed height: what stretches side-by-side cards is the grid.
Title and subtitle

Three axes, not eleven variations: density, divider and navigation item. The rest (icon, two lines, trailing action) is composition, not a new prop.
.es-list
.es-list--compact
.es-list + to
Collapse, refresh, expand and remove. The first two keep their state in the card itself, because that is its own behaviour; refresh and remove are events, because the data belongs to the caller.
Dashboard cards are not a new component: they are composition. Card, plus stat, bar, ring, list and badge, the same pieces in different arrangements.
8.52k visitors
Average 70% complete
By workstream

Plyr over the native elements. It is the template first runtime dependency, and it pays for itself through Vimeo and YouTube: each has its own embed API, and Plyr delivers all three behind a single interface.
provider="video"
provider="youtube"
provider="audio"
Two shapes over the flat card: the simple divided list and the rich one, with title, description and chip.
Brand tokens
Four hex values and one gradient derive all the CSS.
Glass surfaces
Focal glass, flat card and lens for controls.
Native components
The browser's dialog, details and selects, dressed by the system.