Files
fusion/packages/dashboard/app/components/InsightsView.css
gsxdsm 10208ecd63 FN-6764: make research and insights tablet layouts full width
Research and Insights now reflow at tablet widths to avoid cut-off content while preserving mobile and desktop behavior.

- Add tablet-specific full-width Research layout rules with shrink-safe reader/history containers.
- Add tablet-specific Insights layout rules that stack the category rail above the detail pane.
- Cover Research and Insights responsive CSS contracts across desktop, mobile, and tablet tiers.

Files changed:
 packages/dashboard/app/components/InsightsView.css | 67 ++++++++++++++++++++++
 packages/dashboard/app/components/ResearchView.css | 47 +++++++++++++++
 .../app/components/__tests__/InsightsView.test.tsx | 20 +++++++
 .../app/components/__tests__/ResearchView.test.tsx | 13 +++++
 4 files changed, 147 insertions(+)

Fusion-Task-Id: FN-6764

Fusion-Task-Lineage: ed528038-e69b-4794-9885-fb3b5f47b3ed
2026-06-20 01:27:54 -07:00

683 lines
14 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* === InsightsView === */
.insights-view {
display: flex;
flex-direction: column;
height: 100%;
min-height: 0;
overflow: hidden;
}
.insights-view-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-lg);
border-bottom: 1px solid var(--border);
background: var(--surface);
flex-shrink: 0;
}
.insights-view-title {
display: flex;
align-items: center;
gap: var(--space-sm);
}
.insights-view-title h2 {
margin: 0;
font-size: 1.125rem;
font-weight: 600;
display: flex;
align-items: center;
gap: var(--space-sm);
}
.insights-view-count {
font-size: 0.8125rem;
color: var(--text-muted);
font-weight: normal;
}
.insights-view-actions {
display: flex;
align-items: center;
gap: var(--space-sm);
}
/* Model configuration row — collapsible, below the action bar */
.insights-model-config {
display: flex;
align-items: center;
gap: var(--space-sm);
padding: var(--space-sm) var(--space-lg);
border-bottom: 1px solid var(--border);
background: var(--surface-subtle);
}
.insights-model-label {
font-size: 0.8125rem;
color: var(--text-muted);
white-space: nowrap;
flex-shrink: 0;
}
.insights-model-config .model-combobox {
max-width: 320px;
}
/* Gear toggle with active indicator */
.insights-model-toggle {
position: relative;
}
.insights-model-indicator {
position: absolute;
top: 2px;
right: 2px;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--todo, #f59e0b);
}
.insights-view-close {
color: var(--text-muted);
}
.insights-view-close:hover {
color: var(--text);
}
/* Status region */
.insights-status-region {
padding: var(--space-md) var(--space-lg);
flex-shrink: 0;
}
.insights-status-region:empty {
padding: 0;
}
.insights-status-message {
display: flex;
align-items: center;
gap: var(--space-sm);
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-md);
font-size: 0.8125rem;
}
.insights-status-message--success {
background: color-mix(in srgb, var(--color-success) 10%, transparent);
color: var(--color-success);
}
.insights-status-message--error {
background: color-mix(in srgb, var(--color-error) 10%, transparent);
color: var(--color-error);
}
.insights-status-message--info {
background: color-mix(in srgb, var(--accent) 10%, transparent);
color: var(--accent);
}
/* Error callout */
.insights-error-callout {
display: flex;
align-items: center;
gap: var(--space-sm);
margin: 0 var(--space-lg) var(--space-md);
padding: var(--space-md);
background: color-mix(in srgb, var(--color-error) 10%, transparent);
border: 1px solid color-mix(in srgb, var(--color-error) 30%, transparent);
border-radius: var(--radius-md);
color: var(--color-error);
font-size: 0.8125rem;
flex-shrink: 0;
}
/* Run info */
.insights-run-info {
padding: 0 var(--space-lg) var(--space-md);
flex-shrink: 0;
}
.insights-run-status {
font-size: 0.75rem;
color: var(--text-muted);
}
/* Loading state */
.insights-loading {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--space-md);
padding: var(--space-2xl);
color: var(--text-muted);
}
/* Error state */
.insights-error {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--space-md);
padding: var(--space-2xl);
text-align: center;
}
.insights-error p {
color: var(--text-muted);
margin: 0;
}
/* Empty state */
.insights-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--space-md);
padding: var(--space-2xl);
text-align: center;
flex: 1;
}
.insights-empty h3 {
margin: 0;
font-size: 1.125rem;
color: var(--text);
}
.insights-empty p {
color: var(--text-muted);
margin: 0;
max-width: calc(var(--space-2xl) * 12 + var(--space-lg));
}
/* Two-pane body */
.insights-body {
flex: 1;
min-height: 0;
display: flex;
overflow: hidden;
}
/* Sidebar (categories) */
.insights-sidebar {
width: calc(var(--space-2xl) * 7 + var(--space-lg));
flex-shrink: 0;
border-right: 1px solid var(--border);
background: var(--surface);
overflow-y: auto;
min-height: 0;
}
.insights-category-list {
list-style: none;
margin: 0;
padding: var(--space-sm);
display: flex;
flex-direction: column;
gap: var(--space-xs);
}
.insights-category-item {
width: 100%;
display: flex;
align-items: center;
gap: var(--space-sm);
padding: var(--space-sm) var(--space-md);
background: transparent;
border: 1px solid transparent;
border-radius: var(--radius-md);
color: var(--text);
font: inherit;
font-size: 0.8125rem;
text-align: left;
cursor: pointer;
transition: background var(--transition-fast), border-color var(--transition-fast);
}
.insights-category-item:hover {
background: var(--surface-1);
}
.insights-category-item--active {
background: color-mix(in srgb, var(--accent) 12%, transparent);
border-color: color-mix(in srgb, var(--accent) 35%, transparent);
color: var(--accent);
}
.insights-category-icon {
flex-shrink: 0;
color: var(--accent);
}
.insights-category-label {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: 500;
}
.insights-category-count {
flex-shrink: 0;
font-size: 0.75rem;
color: var(--text-muted);
background: var(--surface-1);
padding: var(--space-xs) var(--space-sm);
border-radius: var(--radius-pill);
border: 1px solid var(--border);
}
.insights-category-item--active .insights-category-count {
background: var(--surface);
color: var(--accent);
border-color: color-mix(in srgb, var(--accent) 30%, transparent);
}
/* Detail pane */
.insights-detail {
flex: 1;
min-width: 0;
min-height: 0;
overflow-y: auto;
padding: var(--space-lg);
}
/* Section (single, in detail pane) */
.insights-section {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
overflow: hidden;
}
.insights-section-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-md) var(--space-lg);
background: var(--surface);
border-bottom: 1px solid var(--border);
}
.insights-section-title {
display: flex;
align-items: center;
gap: var(--space-sm);
}
.insights-section-title h3 {
margin: 0;
font-size: 0.9375rem;
font-weight: 600;
}
.insights-section-icon {
color: var(--accent);
}
.insights-section-count {
font-size: 0.75rem;
color: var(--text-muted);
background: var(--surface-1);
padding: var(--space-xs) var(--space-sm);
border-radius: var(--radius-pill);
border: 1px solid var(--border);
}
.insights-section-content {
padding: var(--space-md);
}
/* Insights list */
.insights-list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: var(--space-md);
}
/* Individual insight item */
.insight-item {
padding: var(--space-md);
background: var(--surface);
border: 1px solid var(--border);
border-left: var(--space-xs) solid var(--accent);
border-radius: var(--radius-md);
transition: border-color var(--transition-fast);
}
.insight-item:hover {
border-color: var(--accent);
}
.insight-item-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-sm);
}
.insight-item-title {
margin: 0;
font-size: 0.875rem;
font-weight: 600;
color: var(--text);
line-height: 1.4;
}
.insight-item-actions {
display: flex;
align-items: center;
gap: var(--space-xs);
flex-shrink: 0;
}
/* Borderless icon-prominent action buttons inside insight items */
.insight-item-action-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: calc(var(--space-lg) * 2);
height: calc(var(--space-lg) * 2);
padding: 0;
background: transparent;
border: none;
border-radius: var(--radius-md);
color: var(--text-muted);
cursor: pointer;
transition: background var(--transition-fast), color var(--transition-fast);
}
.insight-item-action-btn:hover:not(:disabled) {
background: var(--surface-1);
color: var(--accent);
}
.insight-item-action-btn:focus-visible {
outline: none;
box-shadow: var(--focus-ring-strong);
}
.insight-item-action-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.insight-item-content {
margin: var(--space-sm) 0 0;
font-size: 0.8125rem;
color: var(--text-muted);
line-height: 1.5;
white-space: pre-wrap;
word-break: break-word;
}
.insight-item-meta {
display: flex;
align-items: center;
gap: var(--space-md);
margin-top: var(--space-sm);
font-size: 0.75rem;
color: var(--text-muted);
}
.insight-item-status {
padding: var(--space-xs) var(--space-sm);
border-radius: var(--radius-sm);
text-transform: capitalize;
font-weight: 500;
}
.insight-item-status--generated {
background: color-mix(in srgb, var(--accent) 15%, transparent);
color: var(--accent);
}
.insight-item-status--confirmed {
background: color-mix(in srgb, var(--color-success) 15%, transparent);
color: var(--color-success);
}
.insight-item-status--stale {
background: color-mix(in srgb, var(--color-warning) 15%, transparent);
color: var(--color-warning);
}
.insight-item-status--dismissed {
background: color-mix(in srgb, var(--text-dim) 15%, transparent);
color: var(--text-dim);
}
.insight-item-status--archived {
background: color-mix(in srgb, var(--text-dim) 15%, transparent);
color: var(--text-dim);
}
.insight-item--archived {
opacity: 0.6;
border-left-color: var(--text-dim);
}
.insight-item--archived .insight-item-title {
text-decoration: line-through;
color: var(--text-muted);
}
.insight-item--archived .insight-item-content {
text-decoration: line-through;
}
.insight-item-date {
display: flex;
align-items: center;
gap: var(--space-xs);
}
/* Mobile responsive: stack panes vertically; sidebar becomes a horizontal scroller */
@media (max-width: 768px) {
.insights-view-header {
flex-wrap: nowrap;
gap: var(--space-sm);
padding: var(--space-md);
}
.insights-view-title {
min-width: 0;
flex: 1 1 auto;
}
.insights-view-title h2 {
font-size: 1rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.insights-view-actions {
flex-shrink: 0;
justify-content: flex-end;
flex-wrap: nowrap;
gap: var(--space-xs);
}
.insights-body {
flex-direction: column;
}
.insights-sidebar {
width: 100%;
border-right: none;
border-bottom: 1px solid var(--border);
overflow-x: auto;
overflow-y: hidden;
flex-shrink: 0;
}
.insights-category-list {
flex-direction: row;
flex-wrap: nowrap;
padding: var(--space-sm);
gap: var(--space-xs);
}
.insights-category-list > li {
flex-shrink: 0;
}
.insights-category-item {
white-space: nowrap;
padding: var(--space-xs) var(--space-sm);
}
.insights-category-label {
overflow: visible;
text-overflow: clip;
}
.insights-detail {
padding: var(--space-md);
}
.insights-section-header {
padding: var(--space-sm) var(--space-md);
}
.insights-section-content {
padding: var(--space-sm);
}
.insight-item {
padding: var(--space-sm);
}
.insight-item-title {
word-break: break-word;
}
.insight-item-header {
flex-direction: column;
gap: var(--space-sm);
}
.insight-item-meta {
flex-wrap: wrap;
gap: var(--space-sm);
}
.insight-item-actions {
align-self: flex-end;
}
.insight-item-action-btn {
width: calc(var(--space-2xl) + var(--space-sm));
height: calc(var(--space-2xl) + var(--space-sm));
}
.insights-view-actions .btn {
min-height: calc(var(--space-2xl) + var(--space-xs));
}
.insights-show-archived-toggle {
max-width: calc(var(--space-2xl) * 5 + var(--space-md));
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.insights-view-close {
min-height: calc(var(--space-2xl) + var(--space-xs));
min-width: calc(var(--space-2xl) + var(--space-xs));
}
.insights-view-count {
font-size: 0.75rem;
}
.insights-model-config {
padding: var(--space-xs) var(--space-md);
}
.insights-model-config .model-combobox {
max-width: 200px;
}
}
/*
FNXC:InsightsView 2026-06-20-00:34:
Insights tablets at 769px–1024px were inheriting the desktop fixed category sidebar, which squeezed the detail pane inside the .project-content flex chain. Stack the category rail above the detail pane and keep both panes shrinkable so long insight content cannot force horizontal cut-off.
*/
@media (min-width: 769px) and (max-width: 1024px) {
.insights-view {
flex: 1;
inline-size: 100%;
min-inline-size: 0;
min-block-size: 0;
overflow: hidden;
}
.insights-view-header {
min-inline-size: 0;
}
.insights-view-title {
flex: 1 1 auto;
min-inline-size: 0;
}
.insights-view-actions {
flex-shrink: 0;
}
.insights-body {
flex-direction: column;
inline-size: 100%;
min-width: 0;
min-inline-size: 0;
min-block-size: 0;
overflow: hidden;
}
.insights-sidebar {
width: 100%;
min-width: 0;
min-inline-size: 0;
border-right: none;
border-bottom: var(--btn-border-width) solid var(--border);
overflow-x: auto;
overflow-y: hidden;
}
.insights-category-list {
flex-direction: row;
flex-wrap: nowrap;
}
.insights-category-list > li {
flex-shrink: 0;
}
.insights-category-item {
white-space: nowrap;
}
.insights-detail {
flex: 1 1 0;
min-width: 0;
min-inline-size: 0;
min-block-size: 0;
overflow-y: auto;
}
}