UI polish, journals UX, and integration wiring
2026-02-19
Product & UI polish
- Added dark mode with a ThemeProvider and a three-way toggle (light/dark/system), and realigned header/content widths so everything snaps to the same 960px grid (commit).
- Reworked the header: bigger brand sizing and an avatar dropdown for Settings/theme/Sign out; simplified top-nav items.
- Introduced a proper footer, then iterated: expanded to 4 columns + bottom bar, added the ink-drop logo, unified borders, and made it sticky to the bottom on short pages. Final pass aligned borders/content and polished logo sizing/baseline.
- Unified page widths with a shared
.page-containerso all screens line up with the header/footer grid.
Journals UX
- Brought in Markdown rendering (unified/remark/rehype) with a
useMarkdownhook, cleaned up loading states (spinner), and refreshed card/list styling with tag links and plaintext excerpts. - Shipped a tag-filtered journals page at
/journals/tag/[tag]with cursor-based pagination and comprehensive tests (commit). - Added a journals sidebar: sticky month tree + tag list for faster navigation on desktop, stacked on mobile; followed up with layout fixes to keep the sidebar within content width (commit).
Integrations & settings
- Built the OAuth callback page and aligned a bunch of API paths/IDs with the backend (startOAuth, disconnect via connectionId, source-config endpoints).
- Implemented the GitHub integration detail page: sync status, repo selection, source data transparency, actions, i18n (commit).
- Reworked the integrations list so connected cards link to “Details” instead of showing a disconnect button; disconnection lives on the detail page.
- Synced frontend types/forms with backend reality (OAuth field names, sync status shape, GitHub repos response, source config schema with
author?,include_commits?,include_pull_requests?). - Redesigned the Settings page: sidebar nav with sticky behavior, card layout, form fixes (generation time select, timezone datalist), and better disabled states; cleaned up redundant CSS.
Auth & pipeline plumbing
- Fixed auth flow edge cases: added
authenticate()to update state post-callback, replaced a Suspense race with an effect, added a 401 interceptor with auto-refresh + sign-out on refresh failure, and updated tests accordingly. - Switched journal regeneration to
POST /users/me/journals/generate { date }and implemented triggerId-based polling (3s, up to 2min) for pipeline status; added a test for the click + polling behavior. - Filled in missing disabled styles for secondary/ghost/danger buttons so disabled actually looks disabled.
- Added a safe fallback around
getConnectionsfor when the backend isn’t present.
CI
- Integrated Codecov via Vitest V8 coverage, CI upload, and thresholds/PR comments. Requires
CODECOV_TOKENin repo secrets (commit).
Overall: a big sweep that tightened the visual system, upgraded journals navigation/reading, solidified integrations/auth plumbing, and added coverage reporting. Feels cohesive.