AUDIT
Component inventory
Every module in the two UI layers, with how many files import it. Generated by walking the source — so dead components have nowhere to hide.
- COMPONENTS
- 52
- WEB IMPORTS
- 412
- UNUSED ON WEB
- 3
- GENERATED
- 2026-07-29
Total import sites
Zero importers in apps/web
UTC, at build time
Zero-import components
These exist in a UI directory but nothing imports them. Each is either dead code, a component consumed only by the other platform, or something wired up by a path this scan doesn't match — worth a look either way.
All components
Sorted by web import count — the load-bearing components first.
| COMPONENT | WEB | MOBILE | IMPORTS | LOC | VARIANTS |
|---|---|---|---|---|---|
| button | Web: YES | Mobile: YES | 86 | 66 | 16 |
| braille-spinner | Web: YES | Mobile: NO | 45 | 215 | 0 |
| dialog | Web: YES | Mobile: YES | 44 | 159 | 0 |
| input | Web: YES | Mobile: YES | 27 | 22 | 0 |
| page-header | Web: YES | Mobile: NO | 22 | 42 | 0 |
| label | Web: YES | Mobile: YES | 20 | 25 | 0 |
| pixel-icon | Web: YES | Mobile: NO | 17 | 272 | 0 |
| back-button | Web: YES | Mobile: NO | 16 | 27 | 0 |
| textarea | Web: YES | Mobile: YES | 13 | 19 | 0 |
| switch | Web: YES | Mobile: YES | 12 | 36 | 0 |
| badge | Web: YES | Mobile: YES | 11 | 52 | 0 |
| filter-chips | Web: YES | Mobile: YES | 9 | 85 | 0 |
| section-card | Web: YES | Mobile: YES | 9 | 23 | 0 |
| typewriter | Web: YES | Mobile: NO | 9 | 79 | 0 |
| fullscreen-modal | Web: YES | Mobile: YES | 7 | 88 | 0 |
| journey-icon | Web: YES | Mobile: NO | 6 | 22 | 0 |
| skeleton | Web: YES | Mobile: YES | 5 | 14 | 0 |
| tabs | Web: YES | Mobile: YES | 5 | 92 | 2 |
| drawer | Web: YES | Mobile: NO | 4 | 100 | 0 |
| mobile-notifications-bell | Web: YES | Mobile: NO | 4 | 28 | 0 |
| notched-card | Web: YES | Mobile: YES | 4 | 22 | 0 |
| dropdown-menu | Web: YES | Mobile: NO | 3 | 258 | 0 |
| scroll-row | Web: YES | Mobile: NO | 3 | 54 | 0 |
| section-tabs | Web: YES | Mobile: NO | 3 | 57 | 0 |
| separator | Web: YES | Mobile: YES | 3 | 29 | 0 |
| sparkle-filled | Web: YES | Mobile: NO | 3 | 22 | 0 |
| alert-dialog | Web: YES | Mobile: NO | 2 | 158 | 0 |
| animated-sparkle | Web: YES | Mobile: NO | 2 | 22 | 0 |
| hours-input | Web: YES | Mobile: NO | 2 | 59 | 0 |
| logo-mark | Web: YES | Mobile: YES | 2 | 30 | 0 |
| stepper | Web: YES | Mobile: NO | 2 | 58 | 0 |
| chart | Web: YES | Mobile: NO | 1 | 358 | 0 |
| command | Web: YES | Mobile: NO | 1 | 185 | 0 |
| onboarding-progress | Web: YES | Mobile: NO | 1 | 22 | 0 |
| popover | Web: YES | Mobile: NO | 1 | 90 | 0 |
| select | Web: YES | Mobile: YES | 1 | 186 | 0 |
| sonner | Web: YES | Mobile: NO | 1 | 39 | 0 |
| table | Web: YES | Mobile: NO | 1 | 115 | 0 |
| terminal-boot-lines | Web: YES | Mobile: NO | 1 | 62 | 0 |
| themed-input | Web: YES | Mobile: NO | 1 | 47 | 0 |
| toggle | Web: YES | Mobile: YES | 1 | 48 | 5 |
| toggle-group | Web: YES | Mobile: YES | 1 | 84 | 0 |
| tooltip | Web: YES | Mobile: NO | 1 | 58 | 0 |
| IconSymbol | Web: NO | Mobile: YES | 0 | 42 | 0 |
| TabBarBackground | Web: NO | Mobile: YES | 0 | 7 | 0 |
| app-tabs | Web: YES | Mobile: NO | 0 | 48 | 0 |
| avatar | Web: YES | Mobile: YES | 0 | 110 | 0 |
| bottom-sheet | Web: NO | Mobile: YES | 0 | 133 | 0 |
| card | Web: YES | Mobile: YES | 0 | 93 | 0 |
| form-field | Web: NO | Mobile: YES | 0 | 141 | 0 |
| text | Web: NO | Mobile: YES | 0 | 48 | 0 |
| toast | Web: NO | Mobile: YES | 0 | 136 | 0 |
Import counts match any path ending in components/ui/<name>, so aliased and relative imports both count. Components reached only through a barrel file or a dynamic import would undercount — none currently are.