feat(dashboard,cli): update-check frequency, GitHub star button, more resizable modals

Update-check frequency (end-to-end)
- Add `updateCheckFrequency: "manual" | "on-startup" | "daily" | "weekly"`
  to GlobalSettings (default: "daily").
- Backend `performUpdateCheck` honors the frequency: TTL = day/week,
  `manual` returns cache or empty without hitting npm, `on-startup`
  refreshes once per process lifetime then serves cache. `/refresh`
  route forces network regardless.
- Settings → Updates surfaces a working `<select>` for the cadence,
  disabled when auto-checks are off entirely.
- Tests: 4 new cases covering ttlForFrequency mapping, weekly window,
  manual semantics, on-startup once-per-process behavior.

TUI update notice
- Read cached update result synchronously on TUI startup. When an
  update is available, render a yellow notice line on the splash and
  a colored ● next to the version in the status bar.

Settings modal header polish
- Add "Star on GitHub" pill (icon + Star + cached star count from the
  GitHub API, 1h localStorage TTL) and "Help" button (opens project
  Discussions). Both link to the Runfusion/Fusion repo.
- Star button auto-hides after the user clicks it (intent = star),
  tracked in localStorage `fusion:github-star-clicked`.
- Settings → General gets a "Show Star on GitHub button" checkbox so
  users can hide it preemptively. New global setting
  `showGitHubStarButton: boolean` (default true) gates rendering.

More resizable modals
- Task Detail modal: 85vh default, resize: both, persisted via
  useModalResizePersist (key `fusion:task-detail-modal-size`).
- Quick Chat FAB: full 8-direction resize (4 corners + 4 edges) via
  pointer-event handlers; persisted to
  `fusion:quick-chat-size-<projectId>`. Each handle has the right
  cursor + role="separator" for accessibility.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsxdsm
2026-04-27 17:55:15 -07:00
parent c1e4c8df85
commit 61ea16e31f
16 changed files with 752 additions and 98 deletions

View File

@@ -66,32 +66,97 @@
position: absolute;
z-index: 2;
background: transparent;
/* Faint accent line appears on hover to indicate resizability */
transition: background var(--transition-fast);
}
/* Edge handles */
.quick-chat-resize-handle[data-resize-direction="n"] {
cursor: ns-resize;
cursor: n-resize;
top: 0;
left: 6px;
right: 6px;
left: 10px;
right: 10px;
height: 6px;
}
.quick-chat-resize-handle[data-resize-direction="w"] {
cursor: ew-resize;
top: 6px;
left: 0;
bottom: 6px;
.quick-chat-resize-handle[data-resize-direction="s"] {
cursor: s-resize;
bottom: 0;
left: 10px;
right: 10px;
height: 6px;
}
.quick-chat-resize-handle[data-resize-direction="e"] {
cursor: e-resize;
top: 10px;
right: 0;
bottom: 10px;
width: 6px;
}
.quick-chat-resize-handle[data-resize-direction="w"] {
cursor: w-resize;
top: 10px;
left: 0;
bottom: 10px;
width: 6px;
}
/* Corner handles */
.quick-chat-resize-handle[data-resize-direction="nw"] {
cursor: nwse-resize;
cursor: nw-resize;
top: 0;
left: 0;
width: 10px;
height: 10px;
}
.quick-chat-resize-handle[data-resize-direction="ne"] {
cursor: ne-resize;
top: 0;
right: 0;
width: 10px;
height: 10px;
}
.quick-chat-resize-handle[data-resize-direction="sw"] {
cursor: sw-resize;
bottom: 0;
left: 0;
width: 10px;
height: 10px;
}
.quick-chat-resize-handle[data-resize-direction="se"] {
cursor: se-resize;
bottom: 0;
right: 0;
width: 10px;
height: 10px;
}
/* Subtle hover accent on edge handles */
.quick-chat-resize-handle[data-resize-direction="n"]:hover,
.quick-chat-resize-handle[data-resize-direction="s"]:hover {
background: linear-gradient(
to bottom,
transparent 30%,
color-mix(in srgb, var(--border) 60%, transparent) 50%,
transparent 70%
);
}
.quick-chat-resize-handle[data-resize-direction="e"]:hover,
.quick-chat-resize-handle[data-resize-direction="w"]:hover {
background: linear-gradient(
to right,
transparent 30%,
color-mix(in srgb, var(--border) 60%, transparent) 50%,
transparent 70%
);
}
.quick-chat-panel-header {
display: flex;
align-items: center;