Ember component library
Accessible by construction, typed all the way into your templates with TypeScript and Glint, and styled with Tailwind Variants.
Workspace members
Team plan ยท 5 of 20 seats used
| Worker ID | Actions | ||||
|---|---|---|---|---|---|
|
#4586936
|
AT
Alex Turner alex@acme.com |
Product Manager |
Contractor
|
|
|
|
#4586937
|
ED
Emma Davis emma@acme.com |
Senior Designer |
Contractor
|
|
|
|
#4586933
|
JS
John Smith john@acme.com |
Chief Technology Officer |
Employee
|
|
|
|
#4586932
|
KM
Kate Moore kate@acme.com |
Chief Executive Officer |
Employee
|
|
|
|
#4586935
|
MW
Mike Wilson mike@acme.com |
VP of Engineering |
Employee
|
|
2 of 5 selected
Drag the seam. Both sides are the same markup. Nothing was restyled, duplicated, or patched up for dark mode.
The library
Every tile below is the real component, rendered by the library, and a link straight into its documentation.
Overlays
Overlays are where component libraries usually leak: focus escapes, the background scrolls, Escape does nothing. Every layer here shares one focus trap, one scroll lock, and one portal.
Popover
Modal
Tab to the end โ focus wraps instead of escaping.
Drawer
Scroll the page behind it. It will not move.
Dropdown
Arrow keys move, typeahead jumps, Escape restores focus.
Theming
Frontile's colors are semantic roles at named levels, not a numbered scale. Swap the ramp and every component follows, in both themes, with no rebuild.
Your theme
Inverted
One ramp per scheme, in a plain CommonJS file that Frontile compiles
to custom properties, generating the matching
on-primary-*
contrast colors for you. Wire it up with
@plugin
"./frontile.js"
in your stylesheet.
Built in
Keyboard behaviour, ARIA state, and template types arrive with the components. Both of these are running right now, so try them rather than take our word for it.
Tab into the list and use the arrow keys, Home, End, or type a letter.
What just happened
Selected:
Glint type checking. The
list manages
aria-activedescendant, roving focus, typeahead, and
aria-selected
itself. None of that is wired up on this page.
Glint checks component arguments inside the template, so a mismatched collection is a build error rather than a blank cell.
Every component
Everything Frontile documents today, with the deprecated legacy packages left out. Every name is a link.
Labelling, validation, and state handled by the control itself, not by the page.
Small primitives the rest of the library is built out of.
Focus trapping, scroll locking, and portalling, shared by every layer.
Typed, keyboard-navigable lists and tables that infer against your data.
Start here
Every component's documentation is built around live, interactive demos of the component itself: the same ones running on this page, with the source beside each of them. Start wherever your interface is thinnest.
Frontile publishes
llms.txt
and
llms-full.txt
to the llms.txt standard, mirrors every page as plain Markdown at
the same URL plus
.md,
and puts a one-click handoff to ChatGPT or Claude on each one.
Point your coding agent at a component's real documentation
instead of hoping it guessed the API.
Two packages, a Tailwind v4 stylesheet, and one
@source
line so Tailwind stops purging Frontile's classes. The
installation guide
has the exact paths.