# Phase 3 record — `~/src/utils/web_ui` (`@kuhyx/web-ui`) The web counterpart to Phase 1's Dart `design_system`. Companion to `nielsen-audit.md`, which holds the grid and the deferred clusters. Shipped as `web_ui-v0.3.1`, consumed by **dufs-cloud** and **awesome-mcp-explorer**. Gated like Phase 1: `web_ui/.pre-commit-config.yaml` + `.github/workflows/web-ui-tests.yml` run lint, the 100% coverage bar, the ramp proof, and a **dist/-is-fresh check** — that last one caught a stale build on its very first run, which is the one failure mode a committed `dist/` introduces. ## What shipped | Item | Notes | | --- | --- | | `tokens.css` | Full palette, spacing, radius, type, shadow tiers, focus ring, and the global `:focus-visible` rule. | | `RangeSlider` | Reconciled from the two drifted copies; keyboard-operable. | | `quantile.ts` | `nth`, `clamp01`, `quantileValue`, `valueQuantile`, `fractionFromPointer`. | | `fuzzyMatch` | Was `fuzzyMatch` in dufs-cloud and `matchesFuzzy` in amx. | | Categorical ramp | `--cat-1…6`; see `tokens.md`. New token group, see below. | ## FilterBar was NOT extracted — and should not be The phase brief listed `FilterBar` + `filter-sort.ts` as the third component, to be "reconciled" between dufs-cloud (174 lines) and awesome-mcp-explorer (225). Inspection says they are a **name collision, not a duplicate** — exactly the Phase 1 trap the brief itself warns about, one level deeper than the three `FilterSheet`s. They share a name and nothing else: | | dufs-cloud | awesome-mcp-explorer | | --- | --- | --- | | Shape | horizontal `
` strip | vertical `