Files
fusion/packages/dashboard/app/components/TaskPlannerChatTab.css
gsxdsm 2f5e15ac43 FN-7324: Focus task details on planner chat
Task details now prioritize the planner Chat experience while preserving Activity links and done-task summaries.

- Default active task details to Chat and render it before Activity without breaking legacy Activity tab ids.
- Add focused planner Chat expansion, pinned composer, mobile row hiding, and in-view expand/collapse controls.
- Update responsive coverage, planner-chat tests, dashboard docs, and the release changeset.

Files changed:
 .changeset/fn-7324-chat-focused-task-detail.md     |  7 ++
 docs/dashboard-guide.md                            | 11 +--
 .../dashboard/app/components/TaskDetailModal.css   | 47 ++++++++++-
 .../dashboard/app/components/TaskDetailModal.tsx   | 36 +++++----
 .../app/components/TaskPlannerChatTab.css          | 36 ++++++++-
 .../app/components/TaskPlannerChatTab.tsx          | 37 ++++++---
 ...etailModal.responsive-and-dependencies.test.tsx | 14 +++-
 .../components/__tests__/TaskDetailModal.test.tsx  | 93 +++++++++++++++++++---
 .../__tests__/TaskPlannerChatTab.test.tsx          | 18 +++++
 9 files changed, 255 insertions(+), 44 deletions(-)

Fusion-Task-Id: FN-7324
Fusion-Task-Lineage: 0699d224-7280-4959-8086-b0ea985937a2
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 23:45:00 -07:00

271 lines
6.1 KiB
CSS

.task-planner-chat {
display: flex;
flex: 1 1 auto;
flex-direction: column;
gap: var(--space-md);
min-height: 0;
}
.task-planner-chat-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-md);
}
.task-planner-chat-header-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: var(--space-sm);
flex-wrap: wrap;
}
.task-planner-chat-expand-toggle {
flex: 0 0 auto;
min-inline-size: var(--space-2xl);
min-block-size: var(--space-2xl);
padding: 0;
}
.task-planner-chat-header h4 {
margin: 0;
color: var(--text);
}
.task-planner-chat-header p {
margin: var(--space-xs) 0 0;
color: var(--text-muted);
}
.task-planner-chat-model {
flex: 0 0 auto;
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-pill);
padding: var(--space-xs) var(--space-sm);
color: var(--text-muted);
background: var(--surface-subtle);
font-size: var(--font-size-xs);
}
.task-planner-chat-error {
border: var(--btn-border-width) solid var(--color-error);
border-radius: var(--radius-md);
padding: var(--space-sm) var(--space-md);
color: var(--color-error);
background: var(--surface-subtle);
}
.task-planner-chat-transcript {
flex: 1 1 auto;
min-height: 0;
overflow: auto;
display: flex;
flex-direction: column;
gap: var(--space-md);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-lg);
padding: var(--space-md);
background: var(--surface);
}
.task-planner-chat-state,
.task-planner-chat-empty {
margin: auto;
display: flex;
align-items: center;
gap: var(--space-sm);
color: var(--text-muted);
text-align: center;
}
.task-planner-chat-empty {
flex-direction: column;
width: 100%;
max-width: 42rem;
gap: var(--space-lg);
}
.task-planner-chat-empty-copy {
display: flex;
flex-direction: column;
gap: var(--space-xs);
}
.task-planner-chat-empty-copy h5,
.task-planner-chat-empty-copy p {
margin: 0;
}
.task-planner-chat-empty-copy h5 {
color: var(--text);
font-size: var(--font-size-lg);
}
.task-planner-chat-starters {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--space-sm);
width: 100%;
}
.task-planner-chat-starter {
align-items: flex-start;
justify-content: flex-start;
min-width: 0;
height: auto;
white-space: normal;
text-align: left;
}
.task-planner-chat-starter-label,
.task-planner-chat-starter-description {
display: block;
}
.task-planner-chat-starter-label {
color: var(--text);
font-weight: 600;
}
.task-planner-chat-starter-description {
margin-top: var(--space-xs);
color: var(--text-muted);
font-size: var(--font-size-xs);
line-height: var(--line-height-tight);
}
.task-planner-chat-message {
max-width: min(42rem, 92%);
border: var(--btn-border-width) solid var(--border);
border-radius: var(--radius-lg);
padding: var(--space-sm) var(--space-md);
background: var(--surface-subtle);
}
.task-planner-chat-message--user {
align-self: flex-end;
background: var(--surface-hover);
}
.task-planner-chat-message--assistant,
.task-planner-chat-message--system {
align-self: flex-start;
}
.task-planner-chat-message-role {
margin-bottom: var(--space-xs);
color: var(--text-muted);
font-size: var(--font-size-xs);
font-weight: 600;
}
.task-planner-chat-message-content > :first-child {
margin-top: 0;
}
.task-planner-chat-message-content > :last-child {
margin-bottom: 0;
}
.task-planner-chat-steering-confirmation {
margin-top: var(--space-sm);
border: var(--btn-border-width) solid var(--color-success);
border-radius: var(--radius-md);
padding: var(--space-sm);
color: var(--text);
background: var(--surface);
}
.task-planner-chat-steering-confirmation--pending {
border-color: var(--color-warning);
}
.task-planner-chat-steering-confirmation--error {
border-color: var(--color-error);
color: var(--color-error);
}
.task-planner-chat-steering-confirmation strong,
.task-planner-chat-steering-confirmation p {
margin: 0;
}
.task-planner-chat-steering-confirmation p {
margin-top: var(--space-xs);
color: var(--text-muted);
}
.task-planner-chat-message .chat-question-response {
max-width: 100%;
overflow-wrap: anywhere;
}
/*
FNXC:TaskDetailPlannerChat 2026-06-30-00:00:
The Planner Chat composer should behave like a compact input/button row on desktop: match the textarea's default height to the Send button and let flex wrapping, not a forced column, decide when the controls no longer fit inline.
FNXC:TaskDetailPlannerChat 2026-06-30-23:58:
Keep the composer outside the transcript scroller and make the panel fill the modal body. Loading, errors, starters, history, and streaming content scroll inside `.task-planner-chat-transcript`, while the input row remains pinned and reachable in normal and mobile-expanded detail layouts.
*/
.task-planner-chat-composer {
display: flex;
flex: 0 0 auto;
flex-wrap: wrap;
align-items: stretch;
gap: var(--space-sm);
}
.task-planner-chat-input {
box-sizing: border-box;
flex: 1 1 calc(var(--space-2xl) * 8);
min-width: min(100%, calc(var(--space-2xl) * 8));
height: calc(var(--space-lg) + (var(--space-sm) * 2) + (var(--btn-border-width) * 2));
min-height: calc(var(--space-lg) + (var(--space-sm) * 2) + (var(--btn-border-width) * 2));
padding: var(--btn-padding);
resize: vertical;
}
.task-planner-chat-send {
flex: 0 0 auto;
}
@media (max-width: 768px) {
.task-planner-chat {
min-height: 0;
}
.task-planner-chat-header,
.task-planner-chat-composer {
flex-direction: column;
align-items: stretch;
}
.task-planner-chat-header-actions {
justify-content: space-between;
}
.task-planner-chat-expand-toggle {
align-self: flex-end;
min-inline-size: calc(var(--space-2xl) + var(--space-sm));
min-block-size: calc(var(--space-2xl) + var(--space-sm));
}
.task-planner-chat-starters {
grid-template-columns: 1fr;
}
.task-planner-chat-send {
justify-content: center;
width: 100%;
}
.task-planner-chat-message {
max-width: 100%;
}
.task-planner-chat-message .chat-question-response {
margin-inline: 0;
}
}