# Design — web-ui-rework > Phase: **design**. Technical design (not implementation) for finishing the > MUI v9 → shadcn/ui + Tailwind v4 + lucide-react migration and reconciling the > Manage information architecture to a single, coherent, thin-dashboard UI. > > Grounded in `exploration.md` (verified inventory), `proposal.md`, and > `spec.md` (locked decisions). No source changes in this phase. ## 0. Locked design constraints (do not re-litigate) These are settled by the spec and bound every decision below: - **Single design system:** shadcn/ui + Tailwind v4 `@theme` tokens + lucide-react only. Zero `@mui/*` / `@emotion/*` / `recharts` / `d3` at the end; `theme.ts` deleted in slice 1. - **IA:** Backups becomes a top-level nav item; the Media/Applications surface is named **"Media"** at canonical route **`/media`**; **`/applications` → redirect (replace) to `/media`**, mirroring the existing `/monitoring` → `/observability` redirect in `App.tsx`. Auth (`auth.ts`, `react-oidc-context`) and `react-router-dom` structure otherwise unchanged. - **TanStack Table:** **visibility-only** parity — pagination, row selection, row click, column visibility. **No sorting, no resizing.** - **Palette:** primary stays `#4f8cff`; `chart-1..5` tokens **repurposed** as status/Grafana-link semantic cues (not dropped). - **Density:** comfortable everywhere (`p-4 md:p-6`, `gap-4`); **no compact mode**. - **Test harness:** Vitest + `@testing-library/react` introduced in slice 1. - **Delivery:** force-chained PRs, ≤400 changed lines/slice; ~8 slices per exploration §9. - **Observability model:** thin dashboard, **no in-app charting**, Grafana deep-links preserved. ## 1. MUI → shadcn/ui + Tailwind component mapping table Authoritative destination for every MUI component present across the 22 `@mui/material` consumers (see exploration §2a for per-file frequency). The 22 files follow this table verbatim; deviation requires a design-note in the slice's tasks file. | MUI component | Destination | shadcn primitive / Tailwind pattern | Status | |---|---|---|---| | `Typography` | semantic element + text utilities | `

`–`

`/`

`/`` + `text-* font-*` per the §2 ramp | none needed | | `Box` | `

` + utilities | `
` with flex/grid utilities | none needed | | `Stack` | `
` flex stack | `
` (or `flex-row gap-*`) | none needed | | `Grid` | CSS grid `
` | `
` w/ responsive `md:`/`lg:` | none needed | | `Paper` | bordered surface `
` or `Card` | `
`; prefer `Card` where it already wraps a titled section | none needed | | `Card` / `CardContent` | shadcn `Card` / `CardContent` | `@/components/ui/card` (Card, CardHeader, CardTitle, CardDescription, CardAction, CardContent, CardFooter) | **present** | | `Chip` | `Badge` | `@/components/ui/badge` (variants incl. new `success` — §2) | **present** | | `Button` | `Button` | `@/components/ui/button` (`variant`, `size`) | **present** | | `IconButton` | `Button size="icon"` | `