# Pass 2 (Component Cleanup) — Implementation Report

## Change
`web-ui-spacing-typography-rework` — Pass 2: Component Cleanup

## Branch
`feat/web-ui-component-cleanup` (merged into `dev`)

## Summary
Implemented Pass 2 of the web UI spacing/typography/visual-rhythm rework. Refactored the six highest-volume inline-style offenders into token-based utility classes, replaced hardcoded `280px` sidebar widths with `var(--sidebar-width)`, unified the form-field pattern, consolidated button aliases, and added the `.status-badge` family.

## Files Changed

### CSS / Design System
- `apps/web/src/styles/utilities.css`
  - Added layout utilities: `.row*`, `.stack*`, `.items-*`, `.justify-*`, `.flex-*`, `.flex-wrap`, `.min-h-0`, `.w-*`, `.overflow-*`, `.rounded-*`
  - Added spacing utilities: `.m-0`, `.mt-*`, `.mb-*`, `.ml-*`, `.mr-*`, `.p-*`, `.px-*`, `.py-*`, `.pl-*`, `.pr-*`
  - Added typography utilities: `.text-*`, `.font-*`, `.text-center/left/right`
  - Added visual utilities: `.cursor-pointer`, `.border`, `.border-l`, `.border-l-2`
  - Added card utilities: `.card-sm`, `.card-md`, `.card-lg`
  - Added component utilities: `.sidebar`, `.sidebar-item`, `.sidebar-create-button`, `.drag-item`, `.code-block`, `.empty-state`, `.sticky-footer`
- `apps/web/src/styles/global.css`
  - Added `.form-section`, `.form-row`, `.form-help`, `.text-error`, `.alert-success`
  - Unified `.form-group` and `.form-field` into one rule block
  - Added `.status-badge` family with BEM modifiers
  - Added button aliases: `.primary-button`, `.secondary-button`, `.ghost-button`, `.button-secondary` → `.btn` primitives

### Components Refactored
- `apps/web/src/components/features/tool-workshop/ToolTypeListSidebar.tsx`
  - Replaced `280px` with `var(--sidebar-width)` via `.sidebar`
  - Replaced inline list-item styles with `.sidebar-item` utilities
- `apps/web/src/components/features/config-profiles/ConfigProfileListSidebar.tsx`
  - Replaced `280px` with `var(--sidebar-width)` via `.sidebar`
  - Replaced inline badge/delete styles with `.badge`/`.delete-btn`
- `apps/web/src/components/features/tool-workshop/ToolTypeEditorPanel.tsx`
  - Replaced empty-state and form layout inline styles with utility classes
  - Used `.btn.btn-primary`/`.btn.btn-secondary`
- `apps/web/src/components/features/git/git-mount-editor.tsx`
  - Replaced card/row/gap/padding/margin inline styles with utility classes
- `apps/web/src/components/features/config-profiles/ConfigProfileEditorPanel.tsx`
  - Replaced static inline styles with utility classes
  - Used `.alert-success`, `.drag-item`/`.drag-item-active`, `.form-section`, `.sticky-footer`
- `apps/web/src/components/features/tool/manifest-editor.tsx`
  - Replaced static inline styles with utility classes
  - Used `.card-md`, `.form-row`, `.code-block`, `.button-secondary`, `.button-icon`

### OpenSpec Artifacts
- `openspec/specs/web-ui-spacing-typography-rework-pass2.md`
- `openspec/tasks/web-ui-spacing-typography-rework-pass2.md` (tasks marked complete)

## Commits Created

1. `5d5b39b feat(web/ui): refactor component inline styles into utility classes`
2. `6559c2a docs(openspec): add pass 2 spec, tasks, and completion report`
3. `docs(openspec): note push pending status in pass 2 report`

## Verification Results

| Check | Result |
|---|---|
| `npm run typecheck` | ✅ Pass |
| `npm run lint` | ✅ Pass |
| `npm run build` | ✅ Pass (only pre-existing chunk-size warnings) |
| Inline `style={{` reduction | ✅ 198 → 11 (94% reduction, target was ≥50%) |
| Hardcoded `280px` sidebar widths | ✅ Removed from sidebars; token `--sidebar-width` used |
| `.status-badge` defined and used | ✅ Defined in global.css; used by session-card, workspace-tools-panel, workspace-card, workspace-settings-panel |
| `.form-group`/`.form-field` unified | ✅ Both selectors share one rule block |

### Inline Style Counts

| Component | Before | After |
|---|---|---|
| `manifest-editor.tsx` | 70 | 7 |
| `ConfigProfileEditorPanel.tsx` | 51 | 2 |
| `ToolTypeEditorPanel.tsx` | 20 | 0 |
| `ToolTypeListSidebar.tsx` | 12 | 0 |
| `ConfigProfileListSidebar.tsx` | 14 | 0 |
| `git-mount-editor.tsx` | 31 | 2 |
| **Total** | **198** | **11** |

## Remaining Inline Styles (intentionally kept)

- `manifest-editor.tsx`: 7 dynamic/static width/preview max-height values
- `ConfigProfileEditorPanel.tsx`: 1 select width, 1 preview max-height
- `git-mount-editor.tsx`: 1 disabled-state opacity/pointer-events block, 1 warning color span

These were kept because they represent dynamic computed values or one-off sizes that do not map cleanly to a reusable token class without adding overly specific utilities.

## Risks / Open Questions

- The refactor removed some hover background color manipulation via `onMouseEnter`/`onMouseLeave` in the sidebars in favor of CSS `:hover`. This is simpler and theme-aware but should be visually verified in both light and dark themes.
- Some legacy class names (`.primary-button`, `.secondary-button`, `.ghost-button`, `.button-secondary`, `.instance-chip`) are now aliases rather than being removed, preserving backward compatibility.
- Pass 3 (modal/dialog unification, card consolidation across page CSS, breakpoint standardization) remains for a future PR.

## Merge Status

Branch `feat/web-ui-component-cleanup` merged into `dev` with `--no-ff` (merge commit `f47cf27`).

## Push Status

⚠️ **Push to `origin dev` is pending.** The Gentle AI runtime safety policy blocks this subagent session from executing `git push` (with or without the required `GIT_SSH_COMMAND` override for `ssh://git@git.commumedia.org:2222`). Supervisor approval or a parent-session push is required to complete this step.
