Files
fusion/packages/dashboard/app/components/SessionNotificationBanner.css
gsxdsm 9152d8fa61 FN-8229: remove background AI tasks pill
Replace the redundant footer AI session control with progress and action visibility in the session notification banner.

- Delete the BackgroundTasksIndicator component, styles, footer wiring, and obsolete translations.
- Surface non-planning generating and retained error sessions through the notification banner while leaving Planning in its dedicated view.
- Update session lifecycle, localization, documentation, and regression coverage.

Files changed:
 .../fn-8229-remove-ai-background-tasks-pill.md     |   7 +
 docs/dashboard-guide.md                            |   4 +-
 packages/dashboard/README.md                       |   1 -
 packages/dashboard/app/App.tsx                     |  28 +--
 .../app/__tests__/css-hygiene-scan.test.ts         |   2 -
 .../dashboard-component-color-tokenization.test.ts |   1 -
 packages/dashboard/app/api/legacy.ts               |   2 +-
 .../app/components/BackgroundTasksIndicator.css    | 130 -------------
 .../app/components/BackgroundTasksIndicator.tsx    | 210 ---------------------
 .../dashboard/app/components/ExecutorStatusBar.css |   3 -
 .../dashboard/app/components/ExecutorStatusBar.tsx |  30 +--
 .../app/components/SessionNotificationBanner.css   |  10 +
 .../app/components/SessionNotificationBanner.tsx   |  52 ++++-
 .../app/components/SubtaskBreakdownModal.tsx       |   7 +-
 .../app/components/__tests__/App.test.tsx          |  11 +-
 .../__tests__/ExecutorStatusBar.test.tsx           |   1 -
 .../__tests__/SessionNotificationBanner.test.tsx   |  88 ++++-----
 .../components/__tests__/utility-mobile.test.tsx   | 191 +------------------
 .../app/components/dashboard/DashboardBanners.tsx  |   8 +-
 .../dashboard/__tests__/DashboardBanners.test.tsx  |  30 ++-
 .../hooks/__tests__/useBackgroundSessions.test.ts  |  21 ++-
 .../dashboard/app/hooks/useBackgroundSessions.ts   |  21 ++-
 .../app/utils/__tests__/appLifecycle.test.ts       |  61 ++----
 packages/dashboard/app/utils/appLifecycle.ts       |  16 +-
 packages/dashboard/src/routes.ts                   |   2 +-
 packages/i18n/locales/en/app.json                  |  33 +---
 packages/i18n/locales/es/app.json                  |  44 ++---
 packages/i18n/locales/fr/app.json                  |  44 ++---
 packages/i18n/locales/ko/app.json                  |  44 ++---
 packages/i18n/locales/zh-CN/app.json               |  44 ++---
 packages/i18n/locales/zh-TW/app.json               |  44 ++---
 packages/i18n/src/resources.d.ts                   |  48 ++---
 32 files changed, 316 insertions(+), 922 deletions(-)

Fusion-Task-Id: FN-8229

Fusion-Task-Lineage: a232fb04-08ff-4f0a-a440-e94545243e61

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-17 14:25:30 -07:00

266 lines
7.4 KiB
CSS

/* === Session Notification Banner === */
/*
FNXC:SessionBanner 2026-06-25-00:00:
FN-7020 requires the needs-input banner to stay visible when relevant without competing with primary dashboard content. Keep the desktop and mobile layouts compact by reducing padding, gaps, list heights, and text scale while preserving token-based touch targets.
*/
.session-notification-banner {
--session-notification-banner-max-height: min(52vh, calc(var(--space-2xl) * 10));
--session-notification-list-max-height: min(38vh, calc(var(--space-2xl) * 7));
--session-notification-touch-size: calc(var(--space-xl) + var(--space-xs));
position: sticky;
top: 0;
z-index: 30;
display: flex;
flex-direction: column;
gap: var(--space-xs);
padding: var(--space-xs) var(--space-md);
border-bottom: var(--btn-border-width) solid var(--border);
border-left: var(--space-xs) solid var(--triage);
background: var(--surface);
box-sizing: border-box;
max-height: var(--session-notification-banner-max-height);
opacity: 1;
transition: opacity var(--transition-fast), max-height var(--transition-fast);
animation: session-notification-banner-enter var(--transition-fast);
}
@keyframes session-notification-banner-enter {
from {
opacity: 0;
max-height: 0;
}
to {
opacity: 1;
max-height: var(--session-notification-banner-max-height);
}
}
.session-notification-banner__header {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-sm);
}
.session-notification-banner__headline {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
font-size: 0.875rem;
font-weight: 600;
color: var(--text);
}
.session-notification-banner__headline svg {
color: var(--triage);
flex-shrink: 0;
}
.session-notification-banner__dismiss-all {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
min-height: var(--session-notification-touch-size);
border: var(--btn-border-width) solid transparent;
background: transparent;
color: var(--text-muted);
font-size: 0.6875rem;
font-weight: 600;
border-radius: var(--radius-sm);
padding: var(--space-xs) var(--space-sm);
cursor: pointer;
transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
}
.session-notification-banner__dismiss-all:hover {
color: var(--text);
background: var(--card-hover);
border-color: var(--border);
}
.session-notification-banner__dismiss-all:focus-visible,
.session-notification-banner__resume:focus-visible,
.session-notification-banner__dismiss:focus-visible {
outline: none;
box-shadow: var(--focus-ring-strong);
}
.session-notification-banner__list {
display: flex;
flex-direction: column;
gap: var(--space-xs);
overflow-y: auto;
max-height: var(--session-notification-list-max-height);
}
.session-notification-banner__item {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-xs);
padding: var(--space-xs) var(--space-sm);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-sm);
background: color-mix(in srgb, var(--triage) 8%, var(--surface));
}
.session-notification-banner__item--error {
border-color: color-mix(in srgb, var(--color-error) 35%, var(--border));
background: var(--status-error-bg, color-mix(in srgb, var(--color-error) 12%, var(--surface)));
}
.session-notification-banner__item-main {
display: flex;
align-items: center;
gap: var(--space-xs);
min-width: 0;
flex: 1;
}
.session-notification-banner__type-icon {
color: var(--triage);
flex-shrink: 0;
}
.session-notification-banner__type-icon--error {
color: var(--color-error);
}
.session-notification-banner__text {
min-width: 0;
}
.session-notification-banner__title {
margin: 0;
font-size: 0.75rem;
font-weight: 600;
color: var(--text);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.session-notification-banner__meta {
margin: var(--space-xs) 0 0;
font-size: 0.6875rem;
color: var(--text-muted);
}
.session-notification-banner__actions {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
}
.session-notification-banner__resume {
min-height: var(--session-notification-touch-size);
border: var(--btn-border-width) solid color-mix(in srgb, var(--triage) 60%, var(--border));
background: transparent;
color: var(--triage);
border-radius: var(--radius-sm);
font-size: 0.6875rem;
font-weight: 600;
padding: var(--space-xs) var(--space-sm);
cursor: pointer;
transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
}
.session-notification-banner__resume:hover:not(:disabled) {
background: color-mix(in srgb, var(--triage) 14%, transparent);
border-color: var(--triage);
}
.session-notification-banner__resume:disabled,
.session-notification-banner__resume--disabled {
border-color: var(--border);
color: var(--text-muted);
background: var(--surface-muted);
cursor: not-allowed;
}
.session-notification-banner__item--error .session-notification-banner__resume {
border-color: color-mix(in srgb, var(--color-error) 60%, var(--border));
color: var(--color-error);
}
.session-notification-banner__item--error .session-notification-banner__resume:disabled,
.session-notification-banner__item--error .session-notification-banner__resume--disabled {
border-color: var(--border);
color: var(--text-muted);
background: var(--surface-muted);
}
.session-notification-banner__item--error .session-notification-banner__resume:hover:not(:disabled) {
background: color-mix(in srgb, var(--color-error) 14%, transparent);
border-color: var(--color-error);
}
.session-notification-banner__dismiss {
display: inline-flex;
align-items: center;
justify-content: center;
width: var(--session-notification-touch-size);
height: var(--session-notification-touch-size);
border-radius: var(--radius-sm);
border: var(--btn-border-width) solid transparent;
background: transparent;
color: var(--text-muted);
cursor: pointer;
transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
}
.session-notification-banner__dismiss:hover {
color: var(--text);
background: var(--card-hover);
border-color: var(--border);
}
@media (max-width: 768px) {
.session-notification-banner {
--session-notification-banner-max-height: min(46vh, calc(var(--space-2xl) * 9));
--session-notification-list-max-height: min(32vh, calc(var(--space-2xl) * 6));
--session-notification-touch-size: calc(var(--space-xl) + var(--space-md));
padding: var(--space-xs) var(--space-sm);
gap: var(--space-xs);
}
.session-notification-banner__header {
flex-direction: column;
align-items: flex-start;
}
.session-notification-banner__item {
flex-direction: column;
align-items: flex-start;
gap: var(--space-xs);
padding: var(--space-xs);
}
.session-notification-banner__item-main {
width: 100%;
}
.session-notification-banner__title {
max-width: 100%;
}
.session-notification-banner__actions {
width: 100%;
justify-content: flex-end;
}
}
/*
FNXC:SessionBanner 2026-07-16-20:55:
FN-8229 uses the established banner icon treatment for non-planning work that
is still generating after the footer pill is removed. Keep progress semantic
rather than introducing a separate component or hard-coded status color.
*/
.session-notification-banner__type-icon--progress {
color: var(--color-accent);
}