# OpenSpec Tasks: Web UI Foundations — Spacing, Typography & Visual Rhythm ## Change `web-ui-spacing-typography-rework` — Pass 1: Foundations ## Parent Spec `openspec/specs/web-ui-spacing-typography-rework.md` ## Status tasks --- ## Implementation Tasks - [x] 1. Expand token scale in `apps/web/src/styles/tokens.css` - Add `--space-7`, `--space-9`, `--space-12` - Add `--radius-sm`, `--radius-md`, `--radius-lg`, `--radius-xl`, `--radius-full` - Add `--line-height-tight`, `--line-height-normal`, `--line-height-relaxed` - Add `--shadow-sm`, `--shadow-md`, `--shadow-lg`, `--shadow-xl` - Add `--touch-target`, `--sidebar-width`, `--mobile-nav-height` - Add a documentation header comment explaining the token naming convention - [x] 2. Add button primitives to `apps/web/src/styles/global.css` - `.btn`, `.btn-primary`, `.btn-secondary`, `.btn-sm` - Include `:focus-visible`, `:hover`, and `:disabled` states - [x] 3. Add link-button primitive to `apps/web/src/styles/global.css` - [x] 4. Add form primitives to `apps/web/src/styles/global.css` - `.form-input`, `.form-textarea` - `.checkbox-label` - `.hint` - `.form-error`, `.error-message` - [x] 5. Add alert primitives to `apps/web/src/styles/global.css` - `.alert`, `.alert-error`, `.alert-warning`, `.alert-info` - [x] 6. Add loading-state primitive to `apps/web/src/styles/global.css` - [x] 7. Add badge primitives to `apps/web/src/styles/global.css` - `.badge`, `.badge-success`, `.badge-secondary` - [x] 8. Add text utility primitives - `.text-muted` in `global.css` - [x] 9. Add mobile detail view styles to `apps/web/src/styles/utilities.css` - `.mobile-detail-view` - `.mobile-detail-header` - `.mobile-detail-header-content` - `.mobile-detail-title` - `.mobile-detail-subtitle` - `.mobile-detail-actions` - `.mobile-detail-fields` - `.mobile-detail-field` - `.mobile-detail-field-label` - `.mobile-detail-field-value` - `.mobile-detail-code` - [x] 10. Add mobile list search styles to `apps/web/src/styles/utilities.css` - `.mobile-list-search` - `.mobile-list-search-input` - [x] 11. Fix mobile nav / FAB / bottom-sheet collisions - Update `--mobile-nav-height` usage in `utilities.css` and `global.css` - `.start-tool-fab` uses `calc(var(--mobile-nav-height) + var(--space-3))` - `.shell-content.mobile` uses `calc(var(--mobile-nav-height) + var(--space-3))` - `.mobile-edit-actions` uses `var(--mobile-nav-height)` - [x] 12. Add visible focus states - Add `:focus-visible` rings for `.nav-item`, `.mobile-nav-item`, `.tab`, `.tree-entry`, `.btn`, `.form-input`, `.form-textarea`, `.link-button` - [x] 13. Replace critical inline font-size violations - Replace `fontSize: "0.7rem"` in `ConfigProfileListSidebar.tsx` with token-based class - Audit for other `0.7rem` / `10px` / `11px` inline styles and fix - [x] 14. Add SSH key page signing/verification styles - `.key-signing`, `.key-verification`, `.signature-result`, `.verify-result` in `utilities.css` - [x] 15. Add profile page avatar styles - `.profile-avatar-section`, `.avatar-preview`, `.avatar-image`, `.avatar-placeholder` in `utilities.css` - [x] 16. Verification - Run `cd apps/web && npm run typecheck` - Run `cd apps/web && npm run lint` - Search for each previously undefined class and confirm it now has a rule - Spot-check mobile detail view, SSH keys page, and profile page --- ## Acceptance Criteria - All tasks above are completed. - `npm run typecheck` passes. - `npm run lint` passes. - No referenced class from the audit remains undefined. - Mobile nav/FAB/edit-actions no longer collide on devices with safe-area insets. - All interactive controls have visible `:focus-visible` states. - Inline `0.7rem` font sizes are replaced with token-based classes. --- ## Notes - Do not rename or remove existing tokens; only add new ones. - Do not refactor inline styles in editor components in this pass (Pass 2). - Do not unify modals/dialogs in this pass (Pass 3). - Keep each commit focused; prefer one commit per task group.