Skip to Content
⭐️ Leave a star →
Bundle SizeNew

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:

Measured with size-limit against the published dist, using its esbuild bundler.
Framework peer dependencies (react / solid-js / vue) are excluded — you already ship those.
Shared internals are counted once per import, so importing two components costs less than the sum of their rows.
The barrel row is the whole library imported at once (import * ) — the realistic ceiling, not a typical app.

Click any column header to sort. Component names link to their docs.

Per-component size

DatePicker4.78 kB4.84 kB5.50 kB
Calendar3.23 kB3.25 kB3.44 kB
Sheet3.11 kB3.14 kB3.91 kB
Combobox2.83 kB2.91 kB3.05 kB
MenuBar2.83 kB2.75 kB2.87 kB
Command2.79 kB2.64 kB2.89 kB
ContextMenu2.77 kB2.67 kB2.80 kB
ColorPicker2.58 kB2.40 kB2.96 kB
Select2.53 kB2.53 kB1.85 kB
Mention2.50 kB2.61 kB2.56 kB
ResizablePanels2.31 kB2.07 kB2.60 kB
NumberInput2.27 kB2.26 kB2.47 kB
Carousel2.24 kB2.05 kB2.35 kB
NavigationMenu2.23 kB2.06 kB2.15 kB
Dropdown2.12 kB2.05 kB2.14 kB
Popover2.09 kB2.04 kB2.33 kB
Slider2.01 kB2.19 kB1.99 kB
RichText1.97 kB2.08 kB1.75 kB
Drawer1.96 kB1.91 kB2.22 kB
Modal1.94 kB1.89 kB2.18 kB
Chat1.93 kB1.99 kB2.04 kB
Toggle1.93 kB0.98 kB1.09 kB
Pagination1.90 kB1.98 kB2.21 kB
FileUpload1.90 kB1.84 kB1.92 kB
Tabs1.84 kB1.73 kB2.02 kB
Search1.79 kB1.76 kB1.73 kB
TreeView1.75 kB1.77 kB1.78 kB
ScrollArea1.74 kB1.72 kB1.71 kB
OTP1.69 kB1.58 kB1.86 kB
Toast1.69 kB1.57 kB1.84 kB
Password1.68 kB1.72 kB1.59 kB
Toolbar1.66 kB1.44 kB1.59 kB
Timeago1.59 kB1.43 kB1.54 kB
Rating1.52 kB1.61 kB1.56 kB
Editable1.44 kB1.20 kB1.44 kB
Checkbox1.36 kB1.28 kB1.39 kB
Accordion1.35 kB1.26 kB1.38 kB
TagInput1.27 kB1.19 kB1.33 kB
CodeBlock1.24 kB1.16 kB1.64 kB
Radio1.20 kB1.27 kB1.36 kB
Stepper1.20 kB1.06 kB1.33 kB
Virtualizer1.19 kB1.19 kB1.04 kB
Typewriter1.17 kB1.04 kB1.21 kB
HoverCard1.14 kB1.08 kB1.09 kB
Tooltip1.13 kB1.02 kB1.07 kB
Citation1.12 kB1.08 kB1.10 kB
Form1.11 kB1.03 kB1.06 kB
Alert1.08 kB1.06 kB1.53 kB
Markdown1.08 kB1.13 kB0.87 kB
Diff1.03 kB0.93 kB0.97 kB
Input0.97 kB0.89 kB1.07 kB
Textarea0.96 kB0.89 kB1.07 kB
InfiniteScroll0.95 kB0.77 kB0.88 kB
Switch0.91 kB0.89 kB0.89 kB
Avatar0.81 kB0.75 kB0.72 kB
Stat0.76 kB0.68 kB0.79 kB
Tag0.73 kB0.66 kB1.16 kB
Button0.72 kB1.04 kB0.64 kB
Breadcrumb0.54 kB0.46 kB0.52 kB
Icon0.48 kB0.34 kB0.33 kB
Spinner0.43 kB0.30 kB0.27 kB
Image0.41 kB0.36 kB0.30 kB
EmptyState0.41 kB0.21 kB0.24 kB
ProgressBar0.38 kB0.23 kB0.23 kB
List0.35 kB0.16 kB0.20 kB
Skeleton0.35 kB0.19 kB0.19 kB
AspectRatio0.33 kB0.21 kB0.17 kB
Divider0.33 kB0.18 kB0.18 kB
Badge0.31 kB0.14 kB0.12 kB
Card0.30 kB0.13 kB0.12 kB
Whole library (barrel)49.74 kB54.08 kB60.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/react

If 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:update

This 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 named components (import { Button } from '@wire-ui/react') rather than re-exporting the barrel from a local module.
Make sure your bundler runs production mode with tree-shaking enabled — Vite, Next.js, and Rollup do by default.
Heavier primitives like Calendar, Chat, and Slider carry more logic by nature; reach for them deliberately.

See also Browser Support for the runtime targets these sizes are built against.

Last updated on

MIT License © 2026 wire-ui

Bundle Size – Wire UI