Keep the experimental left sidebar Settings control clear of the fixed executor footer while preserving readable project selector fallbacks.
- Share the executor footer visibility state with the left sidebar and project content.
- Reserve executor-footer height on the sidebar when the status footer is visible so Settings stays clickable in expanded and collapsed modes.
- Add project-selector translation fallbacks for incomplete locale fixtures.
- Cover footer-clearance behavior in left sidebar tests and add a patch changeset.
Files changed:
.changeset/fn-6819-sidebar-footer-clearance.md | 5 +++
packages/dashboard/app/App.tsx | 8 +++--
.../dashboard/app/components/LeftSidebarNav.css | 9 ++++++
.../dashboard/app/components/LeftSidebarNav.tsx | 4 ++-
.../dashboard/app/components/ProjectSelector.css | 2 +-
.../dashboard/app/components/ProjectSelector.tsx | 11 +++++--
.../components/__tests__/LeftSidebarNav.test.tsx | 36 ++++++++++++++++++++++
7 files changed, 67 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-6819
Fusion-Task-Lineage: 950da852-8dcf-4379-a91b-0188b12d1a6c
Keep workflow editing usable on mobile while preserving related dashboard controls.
- allow the standalone project selector to expose a Manage Projects action in single-project layouts
- improve the mailbox resize handle contrast for better visibility
- make the workflow editor canvas and React Flow surface shrink and fill correctly without mobile horizontal overflow
- add CSS contract coverage for desktop and mobile workflow editor width behavior
Files changed:
packages/dashboard/app/components/Header.tsx | 4 +++-
packages/dashboard/app/components/MailboxModal.css | 2 +-
.../dashboard/app/components/ProjectSelector.tsx | 15 +++--
.../app/components/WorkflowNodeEditor.css | 28 +++++++++
.../__tests__/WorkflowNodeEditor.css.test.ts | 66 ++++++++++++++++++++++
5 files changed, 109 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-6034
Fusion-Task-Lineage: e7a784ff-188a-4538-a2be-f75484f10aa4
- guard optional project selection callbacks and keep bookmarked search matches visible
- use structured timeout/rate-limit handling in retry backoff
- add focused regressions for selector and retry behavior
Note: pnpm test passed the merge gate but hit pre-existing non-blocking engine mock failures in changed-package tests.
- Make onSelect optional in ProjectSelectorProps to match Header usage
where onSelectProject may be undefined (fixes runtime crash)
- Exclude currentProject from exact match detection so typing the
current project name doesn't show misleading exact-match banner
- Addresses Gemini Code Assist review findings
- Fix: ProjectSelector dropdown now scrolls (max-height + overflow-y)
when project list exceeds visible area, with scrollIntoView on
keyboard navigation
- Feat: Always-visible search input with type-ahead filtering,
HighlightMatch text highlighting, exact match detection + auto-select
on Enter
- Feat: Project bookmarking via localStorage (useProjectBookmarks hook),
star toggle on each item, bookmarked section shown at top of dropdown
- Refactor: Header.tsx now imports standalone ProjectSelector instead
of using an inline copy that lacked these features
- Tests: 131 tests passing across ProjectSelector + useProjectBookmarks
Migration (multi-agent sweep over 216 files, 60 batches):
- Every user-visible dashboard + TUI string moved to t() with the exact
English inline default (en rendering byte-identical)
- Catalogs merged from per-batch fragments: en/zh-CN/zh-TW/fr/es now
carry ~5,930 keys each across common/app/errors/cli namespaces;
CLI bundles regenerated (6 locales incl. ko)
Integration fixes:
- 18 type errors: reserved {{count}} interpolations renamed, malformed
plural call, hand-rolled t-param types replaced with TFunction<"app">
- 23 lint errors: superseded label constants/helpers removed
- ExecutorStatusBar hook-order violation (keyboard-open early return
moved below hooks)
- TUI tests wrapped in I18nextProvider (uninitialized fallback renders
literal {{placeholders}}); dashboard vitest.setup boots a minimal en
i18next instance for the same reason
Known WIP (next commits): ~457 residual strings across 50 batches,
Korean drafts for swept keys, and a dashboard test-suite pass that is
still being stabilized (~283 failures under investigation — fake-timer
waitFor interaction, likely stale node_modules vs merged lockfile).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Split app/styles.css from ~40k lines down to ~4.5k. Created 56 co-located
component CSS files in app/components/, each imported by its owning .tsx.
The remainder of styles.css holds genuinely global rules (design tokens,
.btn/.card/.modal/.form-input primitives, cross-component @media overrides).
- Lazy-load 13 heavy views (AgentsView, RoadmapsView, NodesView, etc.) via
React.lazy + Suspense; prefetch all chunks on idle so first navigation is
instant. Initial JS bundle: 1.58 MB → 1.16 MB (-26%). Initial CSS bundle:
635 kB → 471 kB (-26%); the rest splits into 13 per-view chunks.
- Add app/test/cssFixture.ts exposing loadAllAppCss() + loadAllAppCssBaseOnly()
so CSS regression tests load the full per-component bundle (mirroring Vite
source order). Migrate 30+ tests off direct readFileSync('../styles.css').
- Enable test.css: { include: [/.+/] } in vitest.config.ts so component CSS
imports actually inject styles in jsdom (fixes getComputedStyle assertions).
- Add ESLint rule (no-restricted-syntax) banning direct styles.css reads in
dashboard test files; points at loadAllAppCss() instead.
- Restore lost utility classes (.text-muted, .text-secondary, .text-dim,
.form-input) and rescue dropped chat tool-call rules into QuickChatFAB.css.
- Mobile fixes along the way: scroll containment for view containers
(min-height:0 + -webkit-overflow-scrolling), QuickChatFAB full-screen on
mobile (with safe-area-inset for iOS home bar), AgentsView single-row
header layout, ActivityLogModal close button on right, model-combobox
z-index above the mobile quick-chat panel.
- Bug fix: SkillsView toggle was display:none which hid the input from the
accessibility tree; replaced with the visually-hidden pattern so screen
readers + getByRole still find the checkbox.
- Bug fix: standalone Delete button in TaskDetailModal for triage-column
tasks (Actions dropdown is hidden in triage state, so previously no way
to delete a freshly-created task without status change first).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Fix incorrect CSS token var(--error) → var(--color-error) in ProjectCard, ProjectHealthBadge, and ProjectSelector
- Add regression test suite (ProjectThemeTokens.test.tsx) covering all project components for correct token usage
- Ensures consistency with the design system's CSS custom property naming convention
- Add Project Overview page with responsive grid and health status cards
- Add Project Selector dropdown in header for quick project switching
- Add Setup Wizard for registering new projects with auto-detection
- Implement project drill-down: click project to view its tasks
- Add global activity feed with cross-project activity log
- Add project health monitoring with real-time status polling
- Add deep linking support for tasks via ?task= URL parameter
- Add useTasks hook with project context filtering
- Add ntfy notification deep link to open tasks in dashboard
- Fix terminal error message formatting for agent failures
- Unify comment style across codebase (// instead of /** */)
- Add comprehensive tests for multi-project components