42.1 kB
to ship the page
shadcn-vue ships 2.6× as much, Nuxt UI 4.3×.
Ermine UI 0.6.1
143 accessible Vue components and 14 blocks, written in plain CSS. No Tailwind. No runtime dependencies beyond Vue. Copied into your project, so every line is yours to change.
npx ermineui init
Money taken and money given back, by month.
| Month | Revenue | Refunds |
|---|---|---|
| Jan | $18,400 | $620 |
| Feb | $19,750 | $540 |
| Mar | $22,300 | $810 |
| Apr | $21,100 | $700 |
| May | $24,900 | $660 |
| Jun | $27,600 | $930 |
| Jul | $26,200 | $720 |
| Aug | $29,800 | $880 |
| Sep | $31,450 | $760 |
Units sold this quarter.
Press a column heading to sort by it.
| #4821 | Tomás Ortega | Paid | Sep 28 | $184.50 |
| #4820 | Priya Nair | Pending | Sep 28 | $62.00 |
| #4819 | Jonas Weber | Paid | Sep 27 | $310.25 |
| #4818 | Aiko Tanaka | Refunded | Sep 27 | $48.00 |
| #4817 | Lucía Fernández | Paid | Sep 26 | $129.90 |
These are the real blocks, running on their sample data. See all 14
Performance
We built the same page with Ermine, shadcn-vue and Nuxt UI, then measured what reached the browser and how fast it drew.
42.1 kB
shadcn-vue ships 2.6× as much, Nuxt UI 4.3×.
120 ms
shadcn-vue takes 3.3× as long, Nuxt UI 7.0×.
18.5 MB
shadcn-vue uses 3.8× as much, Nuxt UI 8.8×.
One settings page using 13 components, built with Vite and run in Chromium on one machine. Shipped size is JavaScript and CSS, gzipped. Your results will differ.
How it works
Run npx ermineui init in a Vue, Nuxt or Astro project. It finds the framework, suggests where the files go and copies in one stylesheet that holds the theme.
npx ermineui add dialog copies the dialog's source into your project, with the helpers it needs. Add a block such as dashboard and you get a whole page section, built from the same parts.
Choose a base for the greys and an accent for the primary colour, or set the CSS variables yourself. Every pairing is checked for contrast in light and dark. Try one from the palette at the top of this page, or see the themes.
The card beside this is real: the same components, running on this page. In your project they are plain .vue files, so change the markup, the styles or the behaviour, and nothing is overwritten on your next update. Read the installation guide.
Components
Everything below is live. Open the dialog, drag a card, press Tab. Then switch your system to dark and watch it follow.
Native inputs underneath, so they are small, fast and work in a plain form.
Plain SVG. Read values with the pointer or the arrow keys, or switch to a table.
| Week starting | Requests | Served from cache |
|---|---|---|
| Aug 3 | 41,200 | 28,100 |
| Aug 10 | 43,800 | 30,400 |
| Aug 17 | 47,100 | 31,900 |
| Aug 24 | 45,300 | 33,800 |
| Aug 31 | 52,600 | 37,200 |
| Sep 7 | 58,900 | 43,100 |
| Sep 14 | 61,400 | 46,800 |
| Sep 21 | 59,200 | 47,900 |
| Sep 28 | 66,800 | 52,300 |
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|---|---|---|---|---|---|
Focus is trapped and returned, Escape closes, and the page behind does not scroll.
Drag cards between columns, or focus one and hold Alt with an arrow key.
To move a card, focus it, hold Alt and press an arrow key.
3 deployments this week, all healthy. Median build time 48 s.
Ownership
The command line copies each component's source into your project, with the helpers it needs. Nothing is imported from node_modules, so there is no version to wait for and nothing you cannot change.
npx ermineui init
npx ermineui add button dialog select
npx ermineui add dashboard<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<Button variant="outline">Save</Button>
</template>Every colour, radius and shadow is a CSS variable in one stylesheet. Change a value and the whole library follows. There is no styling framework to configure, and it sits happily beside Tailwind if you use it.
771 browser tests drive every component by keyboard and mouse in Chromium, Firefox and WebKit, with axe scans in both themes and a simulated screen reader checking what would be spoken.
Every component and block has been installed into a fresh project in each, then type-checked, built and run. Server rendering and hydration included.
Dark mode follows the system through light-dark(). Force a theme on the page, or on any element to theme only what is inside it. The black band above is done that way.
Directory
Each component has its own page with the command to add it, the files it copies and its source.
Add a button. Read its source. Decide from there.
npx ermineui add button