### T-19 · Move `DashboardFilterProvider` — page-scoped provider in wrong directory **Where found:** `frontend/src/providers/DashboardFilterProvider.tsx` — instantiated only inside `DashboardPage.tsx` **Why this is needed:** The `providers/` directory implies app-wide providers (alongside `AuthProvider`, `ThemeProvider`, `TimezoneProvider`). `DashboardFilterProvider` wraps only `DashboardPageContent` and is not used anywhere else. Its placement implies reuse that doesn't exist, misleading future contributors about its scope. **Goal:** Co-located with its only consumer. **What to do:** 1. Move `DashboardFilterProvider.tsx` to `frontend/src/pages/` (alongside `DashboardPage.tsx`) or to `frontend/src/pages/dashboard/` if the page is split into a subdirectory. 2. Update imports in `DashboardPage.tsx` and any tests. **Possible traps and issues:** Only `DashboardPage.tsx` imports it — confirm with grep before moving. **Docs changes needed:** `Docs/Web-Development.md` — document what belongs in `providers/` (app-wide) vs co-located. **Doc references:** `Docs/Web-Development.md` --- ### T-20 · Replace inline `style={{}}` objects with `makeStyles` classes **Where found:** `frontend/src/pages/map/MapBansTable.tsx` (multiple), `pages/JailDetailPage.tsx`, `pages/HistoryPage.tsx`, `pages/history/IpDetailView.tsx`, `components/WorldMap.tsx`, `components/TopCountriesPieChart.tsx`, `components/TopCountriesBarChart.tsx` **Why this is needed:** The project uses Fluent UI's `makeStyles` with atomic CSS caching. Inline `style={{}}` objects are allocated on every render, bypass the atomic CSS cache, and are inconsistent with the established pattern. Exceptions are acceptable only for truly dynamic values (e.g. tooltip `left`/`top` that change on mouse move) — static layout values must use `makeStyles`. **Goal:** All static layout properties moved to `makeStyles`. Inline styles only for genuinely dynamic values. **What to do:** 1. Audit each file listed above. 2. For static `display: flex`, `gap`, `margin`, `padding` — move to `makeStyles` in that component's style block. 3. Keep inline `style` only where the value is truly dynamic at runtime (e.g. `WorldMap` tooltip position, `TopCountriesBarChart` chart height). **Possible traps and issues:** - `MapBansTable.tsx` has several consecutive inline `style` objects for its pagination row — these can be collapsed into one named class. - Some components use both `tokens.*` values and inline styles — ensure `makeStyles` is imported where it isn't already. **Docs changes needed:** `Docs/Web-Development.md` — add styling rule: use `makeStyles` for all static styles; inline `style` only for runtime-dynamic values. **Doc references:** `Docs/Web-Development.md`, Fluent UI v9 docs on `makeStyles` --- ### T-21 · `Fail2BanMetadataService` has inline socket timeout hardcoded **Where found:** `backend/app/services/fail2ban_metadata_service.py:64` — `socket_timeout: float = 5.0` **Why this is needed:** Part of the same constant duplication as T-08. This file doesn't use `_SOCKET_TIMEOUT` as a module constant — it hardcodes `5.0` inline as a local variable. Should use the constant from `constants.py` once T-08 is done. **Goal:** After T-08, replace with `FAIL2BAN_SOCKET_TIMEOUT_FAST` import. **What to do:** Covered by T-08 sweep. **Possible traps and issues:** None — dependent on T-08. **Docs changes needed:** None. **Doc references:** `backend/app/services/fail2ban_metadata_service.py`