Restores the GitHub star count pill on mobile Settings, which had been hidden by a prior mobile CSS override, and updates related tests to match.
- Remove the <=768px `display:none` on `.settings-github-star-btn__count` in SettingsModal.css so the count stays visible; only the redundant "Star" label text stays collapsed on mobile to save space (relies on `.settings-modal-heading` min-width: 0 to truncate the title before the pill wraps)
- Add a changeset (`@runfusion/fusion` patch) documenting the fix
- Update settings-mobile.test.tsx with a new regression test asserting the star count stays visible and formatted (e.g. "1.2k") in both the modal and embedded SettingsView on mobile, plus a helper to scan mobile-only CSS media blocks for the absence of the display:none rule, and align existing mobile CSS assertions (section-heading padding, settings-navigation base rule) with current styles
- Update SettingsModal.models-auth.test.tsx version-label assertions ("Version 1.2.3" -> "v1.2.3") and seed `fusion:settings:show-advanced` in localStorage to match current UI
Files changed:
.changeset/mobile-settings-star-count.md | 7 +++
.../dashboard/app/components/SettingsModal.css | 9 ++-
.../__tests__/SettingsModal.models-auth.test.tsx | 12 ++--
.../components/__tests__/settings-mobile.test.tsx | 66 +++++++++++++++++++++-
4 files changed, 82 insertions(+), 12 deletions(-)
Fusion-Task-Id: FN-7848
Fusion-Task-Lineage: 0bbd0e81-6edb-4e9a-884d-b48fcf41f202
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Removes the hard divider between the Settings navigation rail and content, keeps section rows single-line with ellipsis overflow, and adds a draggable/keyboard-resizable handle that persists the rail's width in localStorage across the standalone modal and embedded Settings page.
- Add a resize handle (.settings-nav-resize-handle) between .settings-navigation and .settings-content, draggable via pointer events and resizable with ArrowLeft/ArrowRight when focused
- Persist chosen width to localStorage (fusion:settings-nav-width), clamped between 200px and 420px, defaulting to 248px; restore on mount
- Make .settings-navigation the sole owner of rail width via a --settings-nav-width CSS custom property instead of a fixed width, and drop the border-right divider
- Keep nav section labels on one line with white-space: nowrap + text-overflow: ellipsis in both the modal (SettingsModal.css) and embedded (styles.css) nav item styles
- Hide the resize handle on mobile; mobile keeps the stacked section picker unaffected
- Update docs/dashboard-guide.md to describe the new divider-less rail and resize behavior
- Add SettingsModal.navResize.test.tsx covering drag-resize, keyboard-resize, and width persistence
- Add changeset .changeset/fn-7825-settings-nav-resizable.md (minor)
Files changed:
.changeset/fn-7825-settings-nav-resizable.md | 7 +
docs/dashboard-guide.md | 3 +
packages/dashboard/app/components/SettingsModal.css | 56 ++++-
packages/dashboard/app/components/SettingsModal.tsx | 124 +++++++++-
packages/dashboard/app/components/__tests__/SettingsModal.navResize.test.tsx | 268 +++++++++++++++++++++
packages/dashboard/app/styles.css | 27 ++-
6 files changed, 467 insertions(+), 18 deletions(-)
Fusion-Task-Id: FN-7825
Fusion-Task-Lineage: 34b940b4-2698-46a4-b47c-cda0b0cac564
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
The GitLab Configuration disclosure was the only .settings-content
child without the form-group horizontal gutter, so its bordered box and
right-flushed checkbox leaked to the pane edge. The footer action rail
was a no-wrap flex with zero slack, clipping Save whenever extra footer
content appeared; it now wraps on desktop (mobile scroll rail intact).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tightens the mobile Settings modal footer rail so Version/Help, Import/Export/Reset, and Save no longer overlap or crowd on small viewports.
- Split modal-header and modal-actions padding rules so the mobile footer uses tighter --space-xs block padding independently of the header
- Center-align modal-actions-left/right, footer version, update-check, and version-check-button on the mobile footer rail
- Make the version text and version-check button non-wrapping inline elements with normalized line-height so they stop overlapping neighboring controls
- Add a settings-modal-version rule as a non-wrapping inline-flex box
- Extend settings-mobile.test.tsx with regression coverage for the tightened mobile footer layout
- Add a patch changeset documenting the fix
Files changed:
.changeset/fn-7773-mobile-settings-footer.md | 7 +++
packages/dashboard/app/components/SettingsModal.css | 55 +++++++++++++++----
packages/dashboard/app/components/__tests__/settings-mobile.test.tsx | 62 +++++++++++++++++-----
3 files changed, 103 insertions(+), 21 deletions(-)
Fusion-Task-Id: FN-7773
Fusion-Task-Lineage: ea45e7bb-2560-4d17-89dd-9dbc7a307351
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Squashes FN-7752, improving the mobile Settings modal layout to reduce chrome and simplify section navigation on small screens.
- Replace the mobile section-picker button row with a compact dropdown-only selector, keeping an accessible aria-label
- Slim down the header and footer, collapsing footer actions to a single row on mobile
- Tighten SettingsModal.css breakpoint rules (≤768px) for header/footer sizing and spacing
- Update settings-mobile tests to cover the new dropdown-only picker and single-row footer behavior
- Add changeset documenting the mobile layout fix
Files changed:
.changeset/fn-7752-mobile-settings-layout.md | 7 +++
.../dashboard/app/components/SettingsModal.css | 62 ++++++++++++++++------
.../dashboard/app/components/SettingsModal.tsx | 19 +++++--
.../components/__tests__/settings-mobile.test.tsx | 26 +++++++--
4 files changed, 90 insertions(+), 24 deletions(-)
Fusion-Task-Id: FN-7752
Fusion-Task-Lineage: 5dea597c-19f7-49c4-979a-7528d84fa6c5
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Relocates the mobile-only settings search icon toggle so it sits inline next to the section dropdown instead of its own row above it, tightening the mobile Settings header.
- Move the settings-search-toggle button out of the standalone .settings-search row into a new .settings-mobile-section-picker-control-row alongside the mobile section <select>.
- Preserve FN-7713 expand/hide toggle behavior and active-query preservation; desktop/tablet layout unaffected.
- Add CSS for .settings-mobile-section-picker-control-row to lay out the select and toggle button inline.
- Update settings-mobile tests to assert the toggle renders next to the section picker.
- Add changeset (patch) documenting the fix.
Files changed:
.../fn-7751-mobile-settings-search-inline.md | 7 ++
docs/dashboard-guide.md | 4 +-
.../dashboard/app/components/SettingsModal.css | 23 ++++--
.../dashboard/app/components/SettingsModal.tsx | 89 +++++++++++-----------
.../components/__tests__/settings-mobile.test.tsx | 38 ++++++++-
5 files changed, 105 insertions(+), 56 deletions(-)
Fusion-Task-Id: FN-7751
Fusion-Task-Lineage: 8bb9a32b-80f4-4b73-a366-d23e97106b73
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Adds a close affordance to the embedded Settings header on mobile, since only a bottom nav bar (no sidebar) is available to exit there.
- Render a mobile-only `modal-close` button in the embedded Settings header when `isEmbedded && viewportMode === "mobile"`, wired to the existing `onClose` prop.
- Leave desktop/tablet embedded and the standalone modal presentation unchanged.
- Add regression tests covering the new mobile close button.
- Add a patch changeset documenting the fix.
Files changed:
.changeset/fn-7627-mobile-settings-close.md | 7 ++
.../dashboard/app/components/SettingsModal.css | 16 +++
.../dashboard/app/components/SettingsModal.tsx | 17 +++
.../__tests__/SettingsModal.mobileClose.test.tsx | 125 +++++++++++++++++++++
4 files changed, 165 insertions(+)
Fusion-Task-Id: FN-7627
Fusion-Task-Lineage: b39c7172-bce3-4fb2-9095-58ae376c43ef
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fixes overlapping Record and Clear buttons on the Keyboard Shortcuts settings rows by replacing the icon-only button class with a text button class and locking layout with flex-shrink.
- Swap ShortcutCaptureInput Record/Clear buttons off the icon-only `btn-icon` class (which forced line-height:0 and a 36px mobile square, clipping labels) onto a text-button class
- Add `.shortcut-capture` row CSS with `flex-shrink:0` on controls so the input and buttons never overlap and stack cleanly on mobile
- Add regression tests covering the Keyboard Shortcuts section layout
- Add changeset documenting the fix
Files changed:
.changeset/fn-7602-shortcut-row-layout.md | 7 ++
.../dashboard/app/components/SettingsModal.css | 17 ++++
.../settings/sections/ShortcutCaptureInput.tsx | 14 +++-
.../__tests__/KeyboardShortcutsSection.test.tsx | 95 ++++++++++++++++++++++
4 files changed, 131 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-7602
Fusion-Task-Lineage: 50cf6975-f0fb-42dd-87b0-50578977a0f4
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Add a "Global Max Concurrent" slider to the footer engine menu and the
Command Center Concurrency card, and group the Scheduling settings by
Global vs Project scope so the global cap isn't mistaken for a per-project
setting (clearer on mobile).
Both sliders are backed by a single shared `useGlobalConcurrency` hook
(module-level store) so they read/write one source of truth and revalidate
after every PUT /api/global-concurrency — fixing the last-writer-wins and
stale-clobber races a per-component cache would cause. The hook treats a
fetch error as non-interactive (slider disabled, not stuck at 1), surfaces
a save-state indicator, and flushes a pending edit on menu close / unmount
so a quick drag-then-dismiss is never silently dropped.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Let ntfy test notifications use the current Settings form values before they are saved.
- Send unsaved ntfy enabled/topic/server/token values from all Settings ntfy test buttons.
- Resolve request-scoped ntfy config on the backend for general, message, and room test notifications.
- Publish message and room ntfy tests directly with the resolved config instead of the active persisted notification service.
- Cover unsaved ntfy test behavior across Settings UI and API routes.
Files changed:
.changeset/fn-6953-ntfy-test-unsaved-config.md | 5 +
.../dashboard/app/components/SettingsModal.css | 5 +-
.../dashboard/app/components/SettingsModal.tsx | 21 +-
.../components/__tests__/SettingsModal.test.tsx | 60 +++-
.../src/__tests__/routes-settings.test.ts | 181 ++++++++---
.../src/routes/register-settings-memory-routes.ts | 355 +++++++++------------
6 files changed, 380 insertions(+), 247 deletions(-)
Fusion-Task-Id: FN-6953
Fusion-Task-Lineage: 90557168-3b11-4ab4-b5c1-4261225600ba
Embedded Settings header now uses the canonical treatment (min-height var(--view-header-min-height), space-lg/space-xl padding, surface bg, 1px divider, var(--todo) icon, 1.125rem/600 title, actions pinned right) — was a transparent no-divider bespoke header. Also trim the embedded footer's padding-bottom so the gap below the Save/Help/Version/Import-Export row matches the gap above it.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Scope each converted modal's mobile full-screen/viewport-takeover rules to :not(--embedded) (Settings, GitHub import, Git Manager, Workflows) so the embedded main-content variant fills only the content pane and the app Header + MobileNavBar stay visible on mobile. Modal presentation unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a 'settings' main-content task view: SettingsModal gains a presentation=embedded mode (no overlay/close, modal-only behaviors disabled, CC-style padded header) and a thin SettingsView wrapper. App renders it in renderMainContent (before the overview gate so the gear works with no project); settings entry points navigate to the view (carrying the deep-link section via setSettingsSection) while the modal mount stays for bootstrap callers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Expose default workflow model lane overrides directly in project settings.
- load and persist default workflow model lane overrides from the active project workflow
- add inline workflow lane status, reset, save, and advanced policy actions in project model settings
- add CSS contract and modal coverage for the workflow model action row spacing and placement
Files changed:
.../dashboard/app/components/SettingsModal.css | 20 ++
.../components/__tests__/SettingsModal.test.tsx | 20 +-
.../SettingsModal.workflow-model-lane-css.test.ts | 24 ++
.../settings/sections/ProjectModelsSection.tsx | 245 ++++++++++++++++++++-
4 files changed, 298 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-6027
Fusion-Task-Lineage: 981a5f01-f4b7-467e-9e2f-4ac8e4ed40fb
Keep research settings controls inside their containment wrappers so inputs stay onscreen across breakpoints.
- wrap advanced provider controls in a dedicated research settings body container
- tighten research grid and field min-width behavior in desktop and mobile styles
- add regression coverage for global and project research sections on desktop and mobile
Files changed:
packages/dashboard/app/components/SettingsModal.css | 37 +++++++-
packages/dashboard/app/components/SettingsModal.tsx | 104 +++++++++++----------
packages/dashboard/app/components/__tests__/SettingsModal.test.tsx | 65 +++++++++++++
packages/dashboard/app/components/__tests__/settings-mobile.test.tsx | 48 ++++++++++
4 files changed, 201 insertions(+), 53 deletions(-)
Fusion-Task-Id: FN-5932
Fusion-Task-Lineage: 22dff41f-b563-40d0-97ea-1ca6d1e09466
Relocate the Settings Help/discussions action from the header controls to the footer version area for clearer placement.
- Remove the Help button from the settings header action group and keep Star/Discord there.
- Add the Help link beside the footer version/update-check section with the same hardened external-link attributes.
- Update Settings modal styling for the new footer help placement and spacing behavior.
- Adjust Settings modal and mobile CSS tests to assert the new Help location and height contract selectors.
Files changed:
.../dashboard/app/components/SettingsModal.css | 12 ++++++++----
.../dashboard/app/components/SettingsModal.tsx | 22 +++++++++++-----------
.../components/__tests__/SettingsModal.test.tsx | 12 +++++++++++-
.../components/__tests__/settings-mobile.test.tsx | 4 ++--
4 files changed, 32 insertions(+), 18 deletions(-)
Fusion-Task-Id: FN-5781
Fusion-Task-Lineage: 90fe2f30-c2fe-438b-b486-3b6ef14e21a6
Restore the Settings header GitHub star CTA while removing its configurability.
- keep the Star on GitHub link in Settings header with refreshed split-pill styling and alignment
- reintroduce GitHub star count fetching/caching and click-tracking helpers used by the header control
- update Settings modal header-action test expectations to include the GitHub star link
- revise the changeset note to reflect removing only the showGitHubStarButton setting/toggle
Files changed:
.changeset/FN-5777-removal.md | 4 +-
packages/dashboard/app/components/SettingsModal.css | 51 ++++++++-
packages/dashboard/app/components/SettingsModal.tsx | 118 ++++++++++++++++++++-
packages/dashboard/app/components/__tests__/SettingsModal.test.tsx | 4 +-
4 files changed, 170 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-5779
Fusion-Task-Lineage: f485a062-6110-4a79-b42d-70710e3ce5da
Remove the dashboard setting and UI entry points for the GitHub star prompt.
- Remove the Star on GitHub option from settings state types and schema definitions.
- Delete SettingsModal UI, handlers, and styles tied to the star button and related layout.
- Update SettingsModal tests and add a changeset documenting the patch release impact.
Files changed:
.changeset/FN-5777-removal.md | 7 ++
packages/core/src/settings-schema.ts | 1 -
packages/core/src/types.ts | 4 -
.../dashboard/app/components/SettingsModal.css | 51 +-------
.../dashboard/app/components/SettingsModal.tsx | 137 +--------------------
.../components/__tests__/SettingsModal.test.tsx | 5 +-
6 files changed, 13 insertions(+), 192 deletions(-)
Fusion-Task-Id: FN-5777
Fusion-Task-Lineage: 16367ba6-ad22-4ba0-a033-005ccc420c19
Relocate Settings version/update UI into the modal footer to reduce header crowding.
- Remove the version/update-check control block from the Settings modal header.
- Add a dedicated footer version container and keep the update-check action/result rendering there.
- Update Settings modal CSS for the new footer layout and mobile wrapping behavior.
- Extend mobile tests to verify footer placement and update-check button clickability.
Files changed:
packages/dashboard/app/components/SettingsModal.css | 25 +++++++--
packages/dashboard/app/components/SettingsModal.tsx | 64 +++++++++++-----------
packages/dashboard/app/components/__tests__/settings-mobile.test.tsx | 27 ++++++++-
3 files changed, 77 insertions(+), 39 deletions(-)
Fusion-Task-Id: FN-5765
Fusion-Task-Lineage: 97923f08-e787-4274-a4ce-8b615b909468
Add a Discord CTA in the Settings header alongside the existing GitHub star action.
- Add a Discord header action/link in SettingsModal next to the GitHub star button
- Update SettingsModal styles to support the additional header action
- Extend SettingsModal tests to cover rendering and behavior of the new Discord link
Files changed:
packages/dashboard/app/components/SettingsModal.css | 2 ++
packages/dashboard/app/components/SettingsModal.tsx | 13 ++++++++++++-
.../app/components/__tests__/SettingsModal.test.tsx | 14 +++++++++++++-
3 files changed, 27 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5763
Fusion-Task-Lineage: 758eddf8-246c-41be-9742-a9d5b4b0eb17
Prevent mobile settings prose from splitting words mid-token while keeping long code snippets overflow-safe.
- add a CSS regression test that inspects the mobile media-query rules in SettingsModal.css
- switch mobile backup code wrapping to overflow-wrap:anywhere with normal word-break
- update mobile settings helper text to keep break-word wrapping with normal word-break
Files changed:
.../app/__tests__/settings-mobile-wrap.test.ts | 46 ++++++++++++++++++++++
.../dashboard/app/components/SettingsModal.css | 5 ++-
2 files changed, 49 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5668
Fusion-Task-Lineage: eb66376e-a535-4d07-adfe-4a2d048b93a7
Replaces the plain text input with a <select> that lists the project's
local branches (loaded via fetchGitBranches when the Merge section
becomes visible) plus an (auto-detect) default and a Custom… option for
branches that don't exist locally yet.
Branch list is deduped + sorted with common integration names (main,
master, trunk, develop) pinned to the top so the typical case is one
click. Choosing Custom… swaps in a text input with a "Use dropdown"
link to revert.
A previously-saved value not in the loaded list (branch deleted
locally, or initial render before fetch resolves) falls through to the
custom input automatically so the operator can still see + edit it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Broaden mobile media query to include (max-height: 480px) so landscape
phones (which exceed 768 CSS px wide) still render the bottom nav and
mobile board layout instead of desktop horizontally-scrollable columns.
- Guard useMobileKeyboard against pinch-zoom (vv.scale > 1) — Android
Chrome ignores user-scalable=no, and a focused textarea + zoom was
false-positiving keyboard-open and hiding MobileNavBar.
- Read documentElement.clientHeight instead of stale window.innerHeight
when computing keyboard overlap (Android multi-window can leave
innerHeight cached at a wildly different value than the actual layout
viewport — observed 2848 while html was 797).
- Add interactive-widget=resizes-content to the viewport meta so Android
Chrome shrinks the layout viewport with the soft keyboard, matching iOS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Completes the mobile settings header refactor by consolidating the header into a single row on small viewports, trimming CSS complexity with test coverage for the responsive layout contract.
Fusion-Task-Id: FN-4375