mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-11-07 06:19:43 -10:00
* feat(web-shell): show tool arguments and result in expanded cards Cards outside the built-in detail renderers expanded to the same 80-character result summary shown while collapsed, so the chevron promised details it never delivered. Render the call's arguments and result instead, pretty-printing a JSON object or array and falling back to plain text, with the trajectory inspector's 4000/40 000 caps and a Show more action. Fixes #15280 * fix(web-shell): address tool card details review findings * test(web-shell): cover tool card review findings * fix(web-shell): preserve tool card JSON payload fidelity * fix(web-shell): sanitize tool payloads and cancelled results * fix(web-shell): bound tool payloads by render mode * fix(web-shell): memoize tool card payload formatting * fix(web-shell): size tool card JSON by render cap and scope its rules * fix(web-templates): raise document export budget for tool cards * fix(web-shell): address round 3 tool card review suggestions * fix(web-shell): gate Show more on escaped payload length * fix(web-shell): stop rendering the cancelled input dump as a result A cancelled call that recorded no output carries the daemon's redacted input dump in rawOutput.text, written there as the same string as reason. cancelledOutputText accepted it as output, so the expanded card showed the call's own arguments twice, once as Result. Skip a text candidate that equals reason while keeping output/stdout. * test(web-shell): pin the arguments escape guard and the inline cap Both behaviours were unpinned: replacing the arguments-side sanitized-length comparison with the raw length, or lowering MAX_TOOL_PAYLOAD_LENGTH to 400, left the suites green. JSON.stringify escapes C0 bytes but not the bidi controls, so an object argument carrying U+202E is the reachable shape where escaping moves the payload past the cap. --------- Co-authored-by: Shaojin Wen <[email protected]>
872 lines
16 KiB
CSS
872 lines
16 KiB
CSS
.group {
|
|
margin: 5px 0;
|
|
padding: 8px 14px;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius);
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
min-width: 0;
|
|
max-width: 100%;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.chatSummaryGroup {
|
|
margin: 4px 0 0;
|
|
padding: 0;
|
|
border: none;
|
|
border-radius: 0;
|
|
gap: 2px;
|
|
}
|
|
|
|
.chatSummaryParallelAgents {
|
|
padding: 2px 0;
|
|
}
|
|
|
|
/* Completed thinking folded into the merged tool summary: a clickable line
|
|
like a tool row, expanding to the thought content on click. */
|
|
.chatSummaryThought {
|
|
padding: 2px 0;
|
|
min-width: 0;
|
|
}
|
|
|
|
.chatSummaryThoughtHeader {
|
|
display: flex;
|
|
align-items: center;
|
|
margin: 0;
|
|
padding: 0;
|
|
border: none;
|
|
border-radius: 0;
|
|
background: transparent;
|
|
color: var(--muted-foreground);
|
|
cursor: pointer;
|
|
text-align: left;
|
|
font: inherit;
|
|
}
|
|
|
|
.chatSummaryThoughtHeader:hover,
|
|
.chatSummaryThoughtSummary:focus-visible {
|
|
color: var(--primary);
|
|
}
|
|
|
|
.chatSummaryThoughtSummary {
|
|
flex: 0 1 auto;
|
|
margin: 0;
|
|
padding: 0;
|
|
border: none;
|
|
border-radius: 0;
|
|
background: transparent;
|
|
color: inherit;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 7px;
|
|
min-width: 0;
|
|
cursor: pointer;
|
|
text-align: left;
|
|
font: inherit;
|
|
}
|
|
|
|
.chatSummaryThoughtSummary:focus-visible {
|
|
outline: 2px solid color-mix(in srgb, var(--primary) 45%, transparent);
|
|
outline-offset: 2px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.chatSummaryThoughtIcon {
|
|
width: 14px;
|
|
height: 14px;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
flex-shrink: 0;
|
|
line-height: 1;
|
|
}
|
|
|
|
.chatSummaryThoughtIcon svg {
|
|
display: block;
|
|
}
|
|
|
|
/* The chevron is hover-only and hugs the content, like the thinking block. */
|
|
.chatSummaryThoughtChevronRight,
|
|
.chatSummaryThoughtChevronDown {
|
|
margin-left: 7px;
|
|
width: 14px;
|
|
height: 14px;
|
|
position: relative;
|
|
flex-shrink: 0;
|
|
opacity: 0;
|
|
transition: opacity 120ms ease;
|
|
}
|
|
|
|
.chatSummaryThoughtHeader:hover .chatSummaryThoughtChevronRight,
|
|
.chatSummaryThoughtHeader:hover .chatSummaryThoughtChevronDown,
|
|
.chatSummaryThoughtSummary:focus-visible ~ .chatSummaryThoughtChevronRight,
|
|
.chatSummaryThoughtSummary:focus-visible ~ .chatSummaryThoughtChevronDown {
|
|
opacity: 1;
|
|
}
|
|
|
|
.chatSummaryThoughtLabelActive {
|
|
background-image: linear-gradient(
|
|
105deg,
|
|
var(--muted-foreground) 0%,
|
|
var(--muted-foreground) 46%,
|
|
rgba(255, 255, 255, 0.92) 50%,
|
|
var(--muted-foreground) 54%,
|
|
var(--muted-foreground) 100%
|
|
);
|
|
background-size: 300% 100%;
|
|
background-position: 150% 0;
|
|
background-clip: text;
|
|
-webkit-background-clip: text;
|
|
-webkit-text-fill-color: transparent;
|
|
animation: chat-summary-thinking-shine 5s linear infinite;
|
|
}
|
|
|
|
@keyframes chat-summary-thinking-shine {
|
|
0% {
|
|
background-position: 150% 0;
|
|
}
|
|
100% {
|
|
background-position: -150% 0;
|
|
}
|
|
}
|
|
|
|
.chatSummaryThoughtLabel {
|
|
font-size: 13px;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
.chatSummaryThoughtTranslate {
|
|
flex-shrink: 0;
|
|
margin-left: 7px;
|
|
padding: 0;
|
|
border: none;
|
|
border-radius: 0;
|
|
background: transparent;
|
|
color: var(--muted-foreground);
|
|
cursor: pointer;
|
|
font: inherit;
|
|
font-size: 12px;
|
|
line-height: inherit;
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
transition: opacity 120ms ease;
|
|
}
|
|
|
|
.chatSummaryThoughtTranslate:hover,
|
|
.chatSummaryThoughtTranslate:focus-visible {
|
|
color: var(--primary);
|
|
}
|
|
|
|
.chatSummaryThoughtHeader:hover .chatSummaryThoughtTranslate,
|
|
.chatSummaryThoughtHeaderExpanded .chatSummaryThoughtTranslate,
|
|
.chatSummaryThoughtTranslate:focus-visible,
|
|
.chatSummaryThoughtTranslate[data-state='open'] {
|
|
opacity: 1;
|
|
pointer-events: auto;
|
|
}
|
|
|
|
/* The expanded-state chevron stays visible, like the thinking block. */
|
|
.chatSummaryThoughtChevronDown {
|
|
opacity: 1;
|
|
}
|
|
|
|
.chatSummaryThoughtChevronRight::before,
|
|
.chatSummaryThoughtChevronRight::after,
|
|
.chatSummaryThoughtChevronDown::before,
|
|
.chatSummaryThoughtChevronDown::after {
|
|
content: '';
|
|
position: absolute;
|
|
width: 6px;
|
|
height: 1px;
|
|
background: currentColor;
|
|
border-radius: 1px;
|
|
}
|
|
|
|
.chatSummaryThoughtChevronRight::before {
|
|
top: calc(50% - 2px);
|
|
left: calc(50% - 3px);
|
|
transform: rotate(45deg);
|
|
}
|
|
|
|
.chatSummaryThoughtChevronRight::after {
|
|
top: calc(50% + 2px);
|
|
left: calc(50% - 3px);
|
|
transform: rotate(-45deg);
|
|
}
|
|
|
|
.chatSummaryThoughtChevronDown::before {
|
|
top: 50%;
|
|
left: calc(50% - 5px);
|
|
transform: rotate(45deg);
|
|
}
|
|
|
|
.chatSummaryThoughtChevronDown::after {
|
|
top: 50%;
|
|
left: calc(50% - 1px);
|
|
transform: rotate(-45deg);
|
|
}
|
|
|
|
.chatSummaryThoughtContent {
|
|
margin-top: 4px;
|
|
padding-left: 21px;
|
|
color: var(--muted-foreground);
|
|
font-size: 13px;
|
|
line-height: 1.5;
|
|
opacity: 0.9;
|
|
}
|
|
|
|
.chatSummaryThoughtContent p,
|
|
.chatSummaryThoughtContent ul,
|
|
.chatSummaryThoughtContent ol {
|
|
margin-top: 0;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.chatSummaryThoughtContent :last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.line {
|
|
padding: 2px 0;
|
|
min-width: 0;
|
|
}
|
|
|
|
.workflowLineDetail {
|
|
padding: 8px 0 2px;
|
|
}
|
|
|
|
.workflowFallback {
|
|
padding: 10px 12px;
|
|
color: var(--muted-foreground);
|
|
font-size: 12px;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
.chatSummary {
|
|
width: 100%;
|
|
margin: 0;
|
|
border: none;
|
|
border-radius: 0;
|
|
background: transparent;
|
|
color: var(--muted-foreground);
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 7px;
|
|
min-width: 0;
|
|
cursor: pointer;
|
|
text-align: left;
|
|
font: inherit;
|
|
}
|
|
|
|
.chatSummary[aria-disabled='true'],
|
|
.lineExpandable[aria-disabled='true'] {
|
|
cursor: default;
|
|
opacity: 0.55;
|
|
}
|
|
|
|
.chatSummary[aria-disabled='true']:focus-visible,
|
|
.lineExpandable[aria-disabled='true']:focus-visible {
|
|
outline: 2px solid var(--agent-blue-500);
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
.chatSummary:not([aria-disabled='true']):hover,
|
|
.chatSummary:focus-visible,
|
|
.chatSummary[aria-expanded='true'] {
|
|
color: var(--primary);
|
|
outline: none;
|
|
}
|
|
|
|
.chatSummary:not([aria-disabled='true']):hover .chatSummaryTextActive,
|
|
.chatSummary:focus-visible .chatSummaryTextActive,
|
|
.chatSummary[aria-expanded='true'] .chatSummaryTextActive {
|
|
background-image: none;
|
|
color: inherit;
|
|
-webkit-text-fill-color: currentColor;
|
|
}
|
|
|
|
.chatSummaryIcon {
|
|
width: 14px;
|
|
height: 14px;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
flex-shrink: 0;
|
|
line-height: 1;
|
|
}
|
|
|
|
.chatSummaryIcon svg {
|
|
display: block;
|
|
}
|
|
|
|
/* Marks the row's only active work as a detached agent. The tint is not
|
|
motion, so it stays on under reduced motion — otherwise such a card would
|
|
remain indistinguishable from a finished one. */
|
|
.chatSummaryIconDetached {
|
|
color: var(--agent-blue-500);
|
|
}
|
|
|
|
@media (prefers-reduced-motion: no-preference) {
|
|
.chatSummaryIconDetached {
|
|
animation: chat-summary-agent-pulse 2.4s ease-in-out infinite;
|
|
}
|
|
|
|
@keyframes chat-summary-agent-pulse {
|
|
0%,
|
|
100% {
|
|
opacity: 1;
|
|
}
|
|
50% {
|
|
opacity: 0.35;
|
|
}
|
|
}
|
|
}
|
|
|
|
.chatSummaryToolIcon {
|
|
width: 14px;
|
|
height: 14px;
|
|
display: block;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.chatSummaryText {
|
|
min-width: 0;
|
|
flex: 0 1 auto;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
font-size: 13px;
|
|
font-weight: 400;
|
|
}
|
|
|
|
.chatSummaryInline {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
min-width: 0;
|
|
max-width: 100%;
|
|
color: inherit;
|
|
vertical-align: bottom;
|
|
}
|
|
|
|
.chatSummaryTextActive {
|
|
color: var(--muted-foreground);
|
|
background-image: linear-gradient(
|
|
105deg,
|
|
var(--muted-foreground) 0%,
|
|
var(--muted-foreground) 46%,
|
|
rgba(255, 255, 255, 0.92) 50%,
|
|
var(--muted-foreground) 54%,
|
|
var(--muted-foreground) 100%
|
|
);
|
|
background-size: 300% 100%;
|
|
background-position: 150% 0;
|
|
background-clip: text;
|
|
-webkit-background-clip: text;
|
|
-webkit-text-fill-color: transparent;
|
|
animation: chat-summary-shine 5s linear infinite;
|
|
}
|
|
|
|
@keyframes chat-summary-shine {
|
|
0% {
|
|
background-position: 150% 0;
|
|
}
|
|
100% {
|
|
background-position: -150% 0;
|
|
}
|
|
}
|
|
|
|
.chatChevronRight,
|
|
.chatChevronDown {
|
|
width: 14px;
|
|
height: 14px;
|
|
position: relative;
|
|
flex-shrink: 0;
|
|
opacity: 0;
|
|
transition: opacity 120ms ease;
|
|
}
|
|
|
|
.chatChevronRight::before,
|
|
.chatChevronRight::after,
|
|
.chatChevronDown::before,
|
|
.chatChevronDown::after {
|
|
content: '';
|
|
position: absolute;
|
|
width: 6px;
|
|
height: 1px;
|
|
background: currentColor;
|
|
border-radius: 1px;
|
|
}
|
|
|
|
.chatSummary:not([aria-disabled='true']):hover .chatChevronRight,
|
|
.chatSummary:not([aria-disabled='true']):hover .chatChevronDown,
|
|
.chatSummary:focus-visible .chatChevronRight,
|
|
.chatSummary:focus-visible .chatChevronDown {
|
|
opacity: 1;
|
|
}
|
|
|
|
.chatChevronRight {
|
|
transform: none;
|
|
}
|
|
|
|
.chatChevronRight::before {
|
|
top: calc(50% - 2px);
|
|
left: calc(50% - 3px);
|
|
transform: rotate(45deg);
|
|
}
|
|
|
|
.chatChevronRight::after {
|
|
top: calc(50% + 2px);
|
|
left: calc(50% - 3px);
|
|
transform: rotate(-45deg);
|
|
}
|
|
|
|
.chatChevronDown {
|
|
transform: none;
|
|
opacity: 1;
|
|
}
|
|
|
|
.chatChevronDown::before {
|
|
top: 50%;
|
|
left: calc(50% - 5px);
|
|
transform: rotate(45deg);
|
|
}
|
|
|
|
.chatChevronDown::after {
|
|
top: 50%;
|
|
left: calc(50% - 1px);
|
|
transform: rotate(-45deg);
|
|
}
|
|
|
|
.chatSummaryContentClip {
|
|
display: grid;
|
|
grid-template-rows: 1fr;
|
|
min-height: 0;
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* Collapsed groups that stay mounted (workflow details keep their live state)
|
|
collapse the grid row instead of unmounting via `display: none`. */
|
|
.chatSummaryContentCollapsed {
|
|
grid-template-rows: 0fr;
|
|
}
|
|
|
|
.chatSummaryContentInner {
|
|
min-height: 0;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.lineMain {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
min-width: 0;
|
|
color: var(--muted-foreground);
|
|
font-size: 13px;
|
|
font-weight: 400;
|
|
}
|
|
|
|
.icon {
|
|
flex-shrink: 0;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.iconError {
|
|
color: var(--error-color);
|
|
font-size: 13px;
|
|
}
|
|
|
|
.lineName {
|
|
flex-shrink: 0;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.lineArg {
|
|
font-size: 13px;
|
|
min-width: 0;
|
|
flex: 1;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.lineElapsed {
|
|
margin-left: auto;
|
|
font-size: 12px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.lineExpandable {
|
|
cursor: pointer;
|
|
margin: -2px 0;
|
|
padding: 2px 0;
|
|
user-select: none;
|
|
}
|
|
|
|
.lineButton {
|
|
width: 100%;
|
|
border: 0;
|
|
background: transparent;
|
|
font: inherit;
|
|
text-align: left;
|
|
}
|
|
|
|
.lineExpandable * {
|
|
cursor: inherit;
|
|
}
|
|
|
|
.lineExpandable .lineArg {
|
|
flex: 0 1 auto;
|
|
}
|
|
|
|
.lineExpandable:not([aria-disabled='true']):hover,
|
|
.lineExpandable:focus-visible {
|
|
color: var(--foreground);
|
|
}
|
|
|
|
.lineChevronRight,
|
|
.lineChevronDown {
|
|
width: 12px;
|
|
height: 12px;
|
|
display: inline-block;
|
|
flex-shrink: 0;
|
|
opacity: 0;
|
|
transition: opacity 120ms ease;
|
|
}
|
|
|
|
.lineChevronRight::before,
|
|
.lineChevronDown::before {
|
|
content: '';
|
|
display: block;
|
|
width: 5px;
|
|
height: 5px;
|
|
border-right: 1.25px solid currentColor;
|
|
border-bottom: 1.25px solid currentColor;
|
|
border-radius: 0.5px;
|
|
margin: 3px 0 0 2px;
|
|
}
|
|
|
|
.lineChevronRight::before {
|
|
transform: rotate(-45deg);
|
|
}
|
|
|
|
.lineChevronDown::before {
|
|
margin: 2px 0 0 3px;
|
|
transform: rotate(45deg);
|
|
}
|
|
|
|
.lineExpandable:not([aria-disabled='true']):hover .lineChevronRight,
|
|
.lineExpandable:not([aria-disabled='true']):hover .lineChevronDown,
|
|
.lineExpandable:focus-visible .lineChevronRight,
|
|
.lineExpandable:focus-visible .lineChevronDown {
|
|
opacity: 1;
|
|
}
|
|
|
|
.lineOutput {
|
|
margin-left: 16px;
|
|
font-size: 12px;
|
|
color: var(--muted-foreground);
|
|
white-space: pre-wrap;
|
|
overflow-wrap: anywhere;
|
|
line-height: 1.4;
|
|
}
|
|
|
|
.expandedCard {
|
|
margin: 5px 0;
|
|
min-width: 0;
|
|
max-width: 100%;
|
|
overflow: hidden;
|
|
border: 0.5px solid var(--border);
|
|
border-radius: var(--radius);
|
|
background: var(--secondary);
|
|
}
|
|
|
|
.expandedCardHeader {
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-width: 0;
|
|
align-items: stretch;
|
|
gap: 3px;
|
|
padding: 8px 12px 8px;
|
|
}
|
|
|
|
.expandedCardTitleRow {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
min-width: 0;
|
|
}
|
|
|
|
.expandedCardTitle {
|
|
flex-shrink: 0;
|
|
min-width: 0;
|
|
max-width: 100%;
|
|
overflow-wrap: anywhere;
|
|
color: var(--foreground);
|
|
font-size: 12px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.expandedCardDetail {
|
|
min-width: 0;
|
|
color: var(--muted-foreground);
|
|
font-family: var(--font-mono);
|
|
font-size: 12px;
|
|
line-height: 1.4;
|
|
overflow-wrap: anywhere;
|
|
white-space: pre-wrap;
|
|
}
|
|
|
|
.expandedCardBody {
|
|
padding: 6px 12px 8px;
|
|
min-width: 0;
|
|
}
|
|
|
|
.payloadSections {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 10px;
|
|
min-width: 0;
|
|
}
|
|
|
|
.payloadSection {
|
|
min-width: 0;
|
|
}
|
|
|
|
.payloadLabel {
|
|
margin-bottom: 4px;
|
|
color: var(--muted-foreground);
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
letter-spacing: 0.02em;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.payloadJson {
|
|
max-height: 240px;
|
|
overflow: auto;
|
|
}
|
|
|
|
.payloadText {
|
|
margin: 0;
|
|
padding: 8px 10px;
|
|
max-height: 240px;
|
|
overflow: auto;
|
|
border-radius: 5px;
|
|
background: var(--muted);
|
|
font-family: var(--font-mono);
|
|
font-size: 12px;
|
|
line-height: 1.6;
|
|
white-space: pre-wrap;
|
|
overflow-wrap: anywhere;
|
|
}
|
|
|
|
:global([data-transcript-render-mode='document']) .payloadJson,
|
|
:global([data-transcript-render-mode='document']) .payloadText {
|
|
max-height: none;
|
|
overflow: visible;
|
|
}
|
|
|
|
.payloadEmpty,
|
|
.payloadTruncated {
|
|
margin: 0;
|
|
color: var(--muted-foreground);
|
|
font-size: 12px;
|
|
}
|
|
|
|
.payloadTruncated {
|
|
margin-top: 4px;
|
|
}
|
|
|
|
.payloadMore {
|
|
align-self: flex-start;
|
|
margin-top: 2px;
|
|
padding: 4px 10px;
|
|
border: 1px solid var(--border);
|
|
border-radius: 6px;
|
|
background: var(--background);
|
|
color: var(--foreground);
|
|
font-size: 12px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.payloadMore:hover {
|
|
background: var(--muted);
|
|
}
|
|
|
|
.expandedAgentCard {
|
|
background: var(--secondary);
|
|
border: 0.5px solid var(--border);
|
|
border-radius: var(--radius);
|
|
padding: 8px 12px;
|
|
margin: 5px 0;
|
|
min-width: 0;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.expandedLineOutput {
|
|
margin-left: 0;
|
|
}
|
|
|
|
.lineDetail {
|
|
margin: 5px 0;
|
|
min-width: 0;
|
|
overflow: visible;
|
|
}
|
|
|
|
.markdownLineDetail {
|
|
background: transparent;
|
|
border: 0;
|
|
border-radius: 0;
|
|
padding: 0;
|
|
overflow: visible;
|
|
}
|
|
|
|
.expandedRead {
|
|
overflow: hidden;
|
|
}
|
|
|
|
.expandedOutput {
|
|
margin: 0;
|
|
padding: 0;
|
|
font-size: 12px;
|
|
line-height: 1.5;
|
|
color: var(--muted-foreground);
|
|
font-family: var(--font-mono);
|
|
white-space: pre-wrap;
|
|
word-break: break-word;
|
|
overflow-x: auto;
|
|
max-height: 400px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
:global([data-transcript-render-mode='document']) .expandedOutput {
|
|
max-height: none;
|
|
overflow-y: visible;
|
|
}
|
|
|
|
.expandedEdit {
|
|
margin: 0;
|
|
}
|
|
|
|
.expandedWrite {
|
|
border: 1px solid var(--border);
|
|
border-radius: 4px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.writeAdd {
|
|
color: var(--success-color);
|
|
}
|
|
|
|
.todoProgress {
|
|
color: var(--muted-foreground);
|
|
font-size: 12px;
|
|
flex-shrink: 0;
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
.todoBody {
|
|
padding: 4px 0 2px 14px;
|
|
}
|
|
|
|
.expandedCardBody .todoBody {
|
|
padding: 0;
|
|
}
|
|
|
|
.shellHeading {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 12px;
|
|
}
|
|
|
|
.shellStatus {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
color: var(--muted-foreground);
|
|
font-size: 12px;
|
|
}
|
|
|
|
.shellBody {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 16px;
|
|
}
|
|
|
|
.shellOutput {
|
|
color: var(--foreground);
|
|
max-height: 200px;
|
|
}
|
|
|
|
.shellOutput,
|
|
.shellDetails dl {
|
|
background: color-mix(in srgb, var(--background) 70%, transparent);
|
|
border-radius: 6px;
|
|
padding: 8px 10px;
|
|
}
|
|
|
|
.shellFailure {
|
|
margin: 0;
|
|
color: var(--destructive);
|
|
font-size: 12px;
|
|
white-space: pre-wrap;
|
|
overflow-wrap: anywhere;
|
|
}
|
|
|
|
.shellSection {
|
|
position: relative;
|
|
}
|
|
|
|
.shellSection > button {
|
|
position: absolute;
|
|
top: 0;
|
|
right: 0;
|
|
}
|
|
|
|
.shellSection summary {
|
|
min-height: 24px;
|
|
padding-right: 32px;
|
|
}
|
|
|
|
.shellSection summary,
|
|
.shellDetails summary {
|
|
color: color-mix(in srgb, var(--foreground) 75%, var(--muted-foreground));
|
|
font-size: 12px;
|
|
font-weight: 500;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.shellSection pre,
|
|
.shellDetails pre,
|
|
.shellDetails dl {
|
|
margin-top: 8px;
|
|
}
|
|
|
|
.shellDetails dl {
|
|
max-height: 200px;
|
|
overflow: auto;
|
|
display: grid;
|
|
grid-template-columns: auto minmax(0, 1fr);
|
|
gap: 4px 12px;
|
|
margin-bottom: 0;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.shellDetails dt {
|
|
color: var(--muted-foreground);
|
|
}
|
|
|
|
.shellDetails dd {
|
|
margin: 0;
|
|
color: var(--foreground);
|
|
overflow-wrap: anywhere;
|
|
}
|
|
|
|
:global([data-transcript-render-mode='document']) .shellDetails dl {
|
|
max-height: none;
|
|
overflow: visible;
|
|
}
|