Files
fusion/packages/dashboard/app/components/RightDock.css
gsxdsm 32455363d0 FN-6845: add resizable right dock for More views
Add a tablet and desktop right dock for overflow dashboard views while preserving mobile navigation behavior.

- Route the non-mobile More views affordance into a resizable right dock with expand-to-modal support.
- Add an overflow view registry and controller to render auxiliary dashboard views in the dock.
- Make the right dock default-on in settings alongside the default left sidebar, with explicit opt-outs for legacy tests.
- Cover right dock behavior, navigation fallbacks, and overflow registry entries with focused tests and docs.

Files changed:
 docs/dashboard-guide.md                            |  10 +
 packages/dashboard/app/App.tsx                     |  15 +-
 .../mobile-feature-access-regression.test.tsx      |  78 +++++
 packages/dashboard/app/components/Header.tsx       |  66 ++++-
 packages/dashboard/app/components/RightDock.css    | 165 +++++++++++
 packages/dashboard/app/components/RightDock.tsx    | 234 +++++++++++++++
 .../app/components/RightDockExpandModal.tsx        |  70 +++++
 .../dashboard/app/components/SettingsModal.tsx     |  17 +-
 .../app/components/__tests__/Header.test.tsx       |  70 +++++
 .../app/components/__tests__/RightDock.test.tsx    | 202 +++++++++++++
 .../__tests__/navigation-history.test.tsx          |   2 +-
 .../__tests__/overflowViewRegistry.test.tsx        |  67 +++++
 .../app/components/overflowViewRegistry.tsx        | 314 +++++++++++++++++++++
 .../app/components/useRightDockController.tsx      | 126 +++++++++
 14 files changed, 1408 insertions(+), 28 deletions(-)

Fusion-Task-Id: FN-6845

Fusion-Task-Lineage: 3cb04264-cf7a-43e1-b774-678ff3cb325b
2026-06-21 13:52:12 -07:00

166 lines
3.4 KiB
CSS

/*
FNXC:Navigation 2026-06-21-00:00:
The right dock CSS uses a mobile media query as a belt-and-suspenders guard only. The authoritative mobile gate is the JS `rightDockActive` value from `useViewportMode`, which also covers phone classes that a width-only query cannot classify reliably.
*/
.right-dock {
position: relative;
display: flex;
flex: 0 0 auto;
flex-direction: column;
min-width: min(100%, var(--right-dock-min-width, calc(var(--space-2xl) * 8)));
max-width: min(100%, var(--right-dock-max-width, calc(var(--space-2xl) * 22)));
min-height: 0;
background: var(--surface);
border-left: thin solid var(--border);
color: var(--text);
box-shadow: var(--shadow-lg);
}
.right-dock--with-footer {
padding-bottom: var(--executor-footer-height);
}
.right-dock__resize-handle {
position: absolute;
inset-block: 0;
inset-inline-start: calc(var(--space-xs) * -1);
z-index: 2;
width: var(--space-sm);
cursor: col-resize;
touch-action: none;
}
.right-dock__resize-handle::before {
position: absolute;
inset-block: 0;
inset-inline-start: calc(var(--space-xs) - var(--btn-border-width));
width: var(--btn-border-width);
background: transparent;
content: "";
transition: background var(--transition-fast);
}
.right-dock__resize-handle:hover::before,
.right-dock__resize-handle:focus-visible::before {
background: var(--todo);
}
.right-dock__resize-handle:focus-visible {
outline: none;
}
.right-dock__toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-sm);
padding: var(--space-sm);
border-bottom: thin solid var(--border);
}
.right-dock__tabs,
.right-dock__actions {
display: flex;
align-items: center;
gap: var(--space-xs);
min-width: 0;
}
.right-dock__tabs {
flex: 1;
overflow-x: auto;
scrollbar-width: thin;
}
.right-dock__tab {
flex-shrink: 0;
color: var(--text-muted);
}
.right-dock__tab--active,
.right-dock__tab[aria-selected="true"] {
background: var(--status-todo-bg);
color: var(--todo);
}
.right-dock__header {
display: flex;
flex-shrink: 0;
align-items: center;
gap: var(--space-sm);
padding: var(--space-sm) var(--space-md);
border-bottom: thin solid var(--border);
color: var(--text);
}
.right-dock__title {
min-width: 0;
margin: 0;
overflow: hidden;
color: inherit;
font: inherit;
font-weight: 600;
text-overflow: ellipsis;
white-space: nowrap;
}
.right-dock__body {
display: flex;
flex: 1;
min-height: 0;
min-width: 0;
overflow: auto;
}
.right-dock__body > * {
flex: 1;
min-width: 0;
}
.right-dock-expand-modal {
display: flex;
flex-direction: column;
width: min(90vw, calc(var(--space-2xl) * 36));
height: min(85vh, calc(var(--space-2xl) * 24));
min-width: min(90vw, calc(var(--space-2xl) * 12));
min-height: min(85vh, calc(var(--space-2xl) * 10));
max-width: 95vw;
max-height: 90vh;
resize: both;
overflow: hidden;
}
.right-dock-expand-modal__header,
.right-dock-expand-modal__title {
display: flex;
align-items: center;
gap: var(--space-sm);
min-width: 0;
}
.right-dock-expand-modal__title {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.right-dock-expand-modal__body {
display: flex;
flex: 1;
min-height: 0;
min-width: 0;
overflow: auto;
}
.right-dock-expand-modal__body > * {
flex: 1;
min-width: 0;
}
@media (max-width: 768px) {
.right-dock {
display: none;
}
}