Bundle Size
Wire UI is built to disappear into your bundle. Every component is a headless primitive with zero CSS and zero runtime dependencies, so the only thing you ship is the behavior you actually import. Because the packages are fully tree-shakeable ("sideEffects": false), importing one component pulls in that component — not the library.
The table below publishes the measured cost of each component, and every number here is enforced as a budget in CI: a pull request that pushes a component past its budget fails the build.
How we measure
Each number is the minified + gzipped size of a single tree-shaken import — what import { Button } from '@wire-ui/react' adds to a production bundle:
size-limit against the published dist, using its esbuild bundler.react / solid-js / vue) are excluded — you already ship those.import * ) — the realistic ceiling, not a typical app.Click any column header to sort. Component names link to their docs.
Per-component size
| DatePicker | 4.78 kB | 4.84 kB | 5.50 kB |
| Calendar | 3.23 kB | 3.25 kB | 3.44 kB |
| Sheet | 3.11 kB | 3.14 kB | 3.91 kB |
| Combobox | 2.83 kB | 2.91 kB | 3.05 kB |
| MenuBar | 2.83 kB | 2.75 kB | 2.87 kB |
| Command | 2.79 kB | 2.64 kB | 2.89 kB |
| ContextMenu | 2.77 kB | 2.67 kB | 2.80 kB |
| ColorPicker | 2.58 kB | 2.40 kB | 2.96 kB |
| Select | 2.53 kB | 2.53 kB | 1.85 kB |
| Mention | 2.50 kB | 2.61 kB | 2.56 kB |
| ResizablePanels | 2.31 kB | 2.07 kB | 2.60 kB |
| NumberInput | 2.27 kB | 2.26 kB | 2.47 kB |
| Carousel | 2.24 kB | 2.05 kB | 2.35 kB |
| NavigationMenu | 2.23 kB | 2.06 kB | 2.15 kB |
| Dropdown | 2.12 kB | 2.05 kB | 2.14 kB |
| Popover | 2.09 kB | 2.04 kB | 2.33 kB |
| Slider | 2.01 kB | 2.19 kB | 1.99 kB |
| RichText | 1.97 kB | 2.08 kB | 1.75 kB |
| Drawer | 1.96 kB | 1.91 kB | 2.22 kB |
| Modal | 1.94 kB | 1.89 kB | 2.18 kB |
| Chat | 1.93 kB | 1.99 kB | 2.04 kB |
| Toggle | 1.93 kB | 0.98 kB | 1.09 kB |
| Pagination | 1.90 kB | 1.98 kB | 2.21 kB |
| FileUpload | 1.90 kB | 1.84 kB | 1.92 kB |
| Tabs | 1.84 kB | 1.73 kB | 2.02 kB |
| Search | 1.79 kB | 1.76 kB | 1.73 kB |
| TreeView | 1.75 kB | 1.77 kB | 1.78 kB |
| ScrollArea | 1.74 kB | 1.72 kB | 1.71 kB |
| OTP | 1.69 kB | 1.58 kB | 1.86 kB |
| Toast | 1.69 kB | 1.57 kB | 1.84 kB |
| Password | 1.68 kB | 1.72 kB | 1.59 kB |
| Toolbar | 1.66 kB | 1.44 kB | 1.59 kB |
| Timeago | 1.59 kB | 1.43 kB | 1.54 kB |
| Rating | 1.52 kB | 1.61 kB | 1.56 kB |
| Editable | 1.44 kB | 1.20 kB | 1.44 kB |
| Checkbox | 1.36 kB | 1.28 kB | 1.39 kB |
| Accordion | 1.35 kB | 1.26 kB | 1.38 kB |
| TagInput | 1.27 kB | 1.19 kB | 1.33 kB |
| CodeBlock | 1.24 kB | 1.16 kB | 1.64 kB |
| Radio | 1.20 kB | 1.27 kB | 1.36 kB |
| Stepper | 1.20 kB | 1.06 kB | 1.33 kB |
| Virtualizer | 1.19 kB | 1.19 kB | 1.04 kB |
| Typewriter | 1.17 kB | 1.04 kB | 1.21 kB |
| HoverCard | 1.14 kB | 1.08 kB | 1.09 kB |
| Tooltip | 1.13 kB | 1.02 kB | 1.07 kB |
| Citation | 1.12 kB | 1.08 kB | 1.10 kB |
| Form | 1.11 kB | 1.03 kB | 1.06 kB |
| Alert | 1.08 kB | 1.06 kB | 1.53 kB |
| Markdown | 1.08 kB | 1.13 kB | 0.87 kB |
| Diff | 1.03 kB | 0.93 kB | 0.97 kB |
| Input | 0.97 kB | 0.89 kB | 1.07 kB |
| Textarea | 0.96 kB | 0.89 kB | 1.07 kB |
| InfiniteScroll | 0.95 kB | 0.77 kB | 0.88 kB |
| Switch | 0.91 kB | 0.89 kB | 0.89 kB |
| Avatar | 0.81 kB | 0.75 kB | 0.72 kB |
| Stat | 0.76 kB | 0.68 kB | 0.79 kB |
| Tag | 0.73 kB | 0.66 kB | 1.16 kB |
| Button | 0.72 kB | 1.04 kB | 0.64 kB |
| Breadcrumb | 0.54 kB | 0.46 kB | 0.52 kB |
| Icon | 0.48 kB | 0.34 kB | 0.33 kB |
| Spinner | 0.43 kB | 0.30 kB | 0.27 kB |
| Image | 0.41 kB | 0.36 kB | 0.30 kB |
| EmptyState | 0.41 kB | 0.21 kB | 0.24 kB |
| ProgressBar | 0.38 kB | 0.23 kB | 0.23 kB |
| List | 0.35 kB | 0.16 kB | 0.20 kB |
| Skeleton | 0.35 kB | 0.19 kB | 0.19 kB |
| AspectRatio | 0.33 kB | 0.21 kB | 0.17 kB |
| Divider | 0.33 kB | 0.18 kB | 0.18 kB |
| Badge | 0.31 kB | 0.14 kB | 0.12 kB |
| Card | 0.30 kB | 0.13 kB | 0.12 kB |
| Whole library (barrel) | 49.74 kB | 54.08 kB | 60.04 kB |
Sizes vary slightly by framework because each implementation is idiomatic to its renderer — Solid compiles reactivity inline, Vue ships its own render helpers, React leans on hooks. None of the three depends on the others.
Budgets & CI enforcement
Every row above has a committed budget in each package’s .size-limit.json. The budget is the measured size plus headroom (~35% for components, rounded up), which absorbs normal build-to-build noise while still catching real regressions. CI runs size-limit for each package on every pull request:
npm run size --workspace @wire-ui/reactIf a change makes a component exceed its budget, the per-component bundle budgets CI job fails — the regression is caught before merge, not after a user files a “why did my bundle grow” issue.
Re-baselining after an intentional change
When a component legitimately grows (a new feature, not an accident), re-baseline the budgets and refresh this table in one step from the repo root:
npm run size:updateThis re-measures every component across all three packages, rewrites each .size-limit.json, and regenerates the data behind the table on this page. The diff is reviewable, so an intentional size increase is an explicit, visible change in the PR rather than a silent one.
Keeping your own bundle small
import { Button } from '@wire-ui/react') rather than re-exporting the barrel from a local module.See also Browser Support for the runtime targets these sizes are built against.