# OpenSpec Tasks: Web UI Component Cleanup — Inline Styles, Forms, Badges

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

## Parent Spec
`openspec/specs/web-ui-spacing-typography-rework-pass2.md`

## Status
tasks

---

## Implementation Tasks

- [x] 1. Add utility classes to `apps/web/src/styles/utilities.css`
  - Layout: `.row`, `.row-sm`, `.row-md`, `.row-lg`, `.stack`, `.stack-sm`, `.stack-md`, `.stack-lg`, `.stack-xl`, `.items-start`, `.items-center`, `.items-end`, `.justify-between`, `.justify-center`, `.justify-end`, `.flex-1`, `.flex-none`, `.w-full`, `.min-w-0`, `.max-w-prose`, `.max-w-form`
  - Spacing: `.m-0`, `.mt-1` through `.mt-6`, `.mb-0` through `.mb-6`, `.ml-auto`, `.mr-auto`, `.p-1` through `.p-5`, `.px-2` through `.px-4`, `.py-1` through `.py-4`
  - Typography: `.text-xs`, `.text-sm`, `.text-base`, `.text-lg`, `.text-xl`, `.font-mono`, `.font-medium`, `.font-semibold`, `.text-center`, `.text-left`, `.text-right`
  - Visual: `.cursor-pointer`, `.overflow-auto`, `.overflow-hidden`, `.rounded-sm`, `.rounded-md`, `.rounded-lg`, `.rounded-xl`, `.rounded-full`
  - Cards: `.card-sm`, `.card-md`, `.card-lg`

- [x] 2. Add form utilities to `apps/web/src/styles/global.css`
  - `.form-section`
  - `.form-row`
  - `.form-help`
  - `.text-error`
  - Unify `.form-group` and `.form-field` into one rule block

- [x] 3. Add button aliases in `apps/web/src/styles/global.css`
  - `.primary-button` → alias to `.btn.btn-primary`
  - `.secondary-button` / `.button-secondary` → alias to `.btn.btn-secondary`
  - `.ghost-button` → explicit style or alias to `.btn.btn-secondary`
  - `.btn-icon` modifier

- [x] 4. Add status badge family to `apps/web/src/styles/global.css`
  - `.status-badge`
  - `.status-badge--running`, `.status-badge--success`
  - `.status-badge--error`, `.status-badge--failed`
  - `.status-badge--warning`
  - `.status-badge--info`, `.status-badge--pending`, `.status-badge--idle`
  - Keep `.instance-chip` as deprecated alias if widely used

- [x] 5. Refactor `apps/web/src/components/features/tool/manifest-editor.tsx`
  - Replace static inline styles with utility classes
  - Keep dynamic values inline (e.g. drag-over background, preview content)
  - Target ≥50% reduction in inline style blocks

- [x] 6. Refactor `apps/web/src/components/features/config-profiles/ConfigProfileEditorPanel.tsx`
  - Replace static inline styles with utility classes
  - Use `.alert-success` for save success banner
  - Use `.drag-item` / `.drag-item-active` for include list items
  - Use `.dialog-actions` for sticky footer

- [x] 7. Refactor `apps/web/src/components/features/tool-workshop/ToolTypeEditorPanel.tsx`
  - Replace static inline styles with utility classes
  - Use shared empty-state and form header patterns

- [x] 8. Refactor `apps/web/src/components/features/tool-workshop/ToolTypeListSidebar.tsx`
  - Replace `280px` with `var(--sidebar-width)`
  - Replace list-item inline spacing with utility classes

- [x] 9. Refactor `apps/web/src/components/features/config-profiles/ConfigProfileListSidebar.tsx`
  - Replace `280px` with `var(--sidebar-width)`
  - Replace remaining inline badge styles with `.badge`/`.badge-secondary`
  - Replace inline delete button with `.btn-icon` or `.ghost-button.small`

- [x] 10. Refactor `apps/web/src/components/features/git/git-mount-editor.tsx`
  - Replace static inline styles with utility classes
  - Use `.stack`, `.row`, `.card-*`, `.gap-*`, `.p-*`, `.mb-*`

- [x] 11. Verification
  - Run `cd apps/web && npm run typecheck`
  - Run `cd apps/web && npm run lint`
  - Count inline style blocks in target components; confirm ≥50% reduction overall
  - Search for `280px` in `apps/web/src`; confirm zero matches
  - Spot-check Tool Workshop and Config Profiles pages

---

## Acceptance Criteria

- All tasks above are completed.
- `npm run typecheck` passes.
- `npm run lint` passes.
- Inline style blocks in the six target components reduced by at least 50% overall.
- No hardcoded `280px` sidebar widths remain in source.
- `.status-badge` family is defined and used by at least one caller.
- `.form-group` and `.form-field` share a single CSS rule block.
- Button aliases work visually.

---

## Notes

- Do not rename or remove existing classes without aliases; backward compatibility matters.
- Keep dynamic inline styles (computed values) in JS.
- Do not unify modals or cards across page CSS files in this pass (Pass 3).
- Prefer one commit per major component or utility group.
