v3.2.3 4 February 2026 Feature Fix Improvement

Settings Audit & Logs Page

New Features

  • Standalone Logs page: API request log promoted from the Developer settings tab to its own top-level page at /logs. Full-page master-detail split: scrollable request list on the left (40%), detail pane on the right (60%). Fills the viewport height — no more fixed-height card. Clicking a row loads full request detail including headers, request body, and response body with copy buttons. Deselecting returns the list to full width.

  • Logs sidebar nav item: New terminal-style icon in the sidebar between Reports and Settings. Works in both expanded and collapsed sidebar states.

Fixes

  • Sticky save bar overlap (OrganisationSettingsPage): Changed from fixed bottom-0 left-0 right-0 to sticky bottom-0. Save bar no longer spans under the sidebar in the v3.2.2 document-flow layout.

  • Duplicated helper text (OrganisationSettingsPage): Flat Rate Scheme percentage field showed “Defaults to 14.5%…” twice. Now reads “Your sector rate. Defaults to 14.5% (IT/computer services) if left blank.”

  • Dark mode flash on theme toggle: Status badges across Dashboard, Invoices, Quotes, and Transactions used raw bg-gray-100 text-gray-700 classes without dark: counterparts. Replaced with semantic tokens (bg-surface-tertiary text-content-secondary) in utils.ts and format.ts. All coloured status variants (sent, paid, partial, overdue) and account type badges now have explicit dark: pairs. Theme toggle is now instant with no repaint flash.

  • Raw colour class in curl block (DeveloperSettingsPage): bg-gray-900 replaced with bg-slate-900 text-slate-100 for consistency with the SpeyBooks dark palette.

Improvements

  • Developer settings decluttered: Removed the request log section, reducing the page from 965 to 790 lines. Now contains only API Keys, Webhooks, and Quick Start — pure configuration, no debugging.

  • RequestLogDetailPanel rewritten: Adapted from inline table expansion to a proper side-panel component. Added copy buttons on all JSON blocks, skeleton loading state, and error handling with close action. All badge colours use dark: pairs.

Architecture

  • New route /logs added to App.tsx inside the protected layout.
  • LogsPage.tsx uses negative margins (-m-4 lg:-m-8) to break out of <main> padding and fill the viewport.
  • getStatusColor() and getAccountTypeColor() in lib/utils.ts now return semantic token classes for neutral states and explicit dark: pairs for coloured states.
  • getStatusColor() in lib/format.ts updated with semantic tokens for bg, text, and border properties.
  • No database migrations, API changes, or new dependencies.