qwen-code/packages/web-shell/client/components/artifacts/TurnOutputs.module.css
ytahdn 1e2932a637
feat(web-shell): add artifact downloads (#8234)
* feat(web-shell): add artifact downloads

* fix(web-shell): scope review download state per file and cancel on unmount (#8234)

* fix(web-shell): restore mount ref under StrictMode and test review MIME mapping (#8234)

Reset mountedRef in the effect setup so React StrictMode's dev-time
double-mount no longer leaves it false and silently cancels artifact and
review downloads. Move getReviewDownloadMimeType into artifactUtils and
cover the extension-to-MIME mapping with a unit test.

* test(web-shell): cover ReviewChanges cancellation-on-unmount path (#8234)

* test(web-shell): assert artifact download MIME type (#8234)

---------

Co-authored-by: 钉萁 <dingqi.jww@alibaba-inc.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
2026-08-01 00:40:57 +00:00

206 lines
3 KiB
CSS

.root {
margin: 8px 0 12px;
display: grid;
gap: 8px;
}
.card {
border: 1px solid var(--border);
border-radius: 8px;
background: var(--background);
overflow: hidden;
}
.summary {
display: grid;
grid-template-columns: 36px minmax(0, 1fr) auto;
gap: 12px;
align-items: center;
padding: 12px;
}
.icon {
width: 36px;
height: 36px;
border-radius: 6px;
background: var(--accent);
color: var(--muted-foreground);
display: inline-flex;
align-items: center;
justify-content: center;
}
.iconSvg {
width: 24px;
height: 24px;
display: block;
}
.title {
min-width: 0;
color: var(--foreground);
font-size: 14px;
font-weight: 400;
}
.reviewSummary {
min-width: 0;
display: flex;
align-items: center;
gap: 8px;
}
.reviewSummaryWithStats {
display: grid;
gap: 0;
}
.reviewMeta {
min-width: 0;
display: flex;
align-items: center;
gap: 8px;
}
.linkButton,
.reviewButton,
.showMoreButton {
appearance: none;
border: 0;
background: transparent;
color: var(--foreground);
font: inherit;
cursor: pointer;
}
.linkButton {
padding: 0;
color: var(--muted-foreground);
font-size: 13px;
opacity: 0;
pointer-events: none;
transition: opacity 120ms ease;
}
.card:hover .linkButton,
.linkButton:focus-visible {
opacity: 1;
pointer-events: auto;
}
.linkButton:hover,
.showMoreButton:hover {
color: var(--foreground);
}
.actions {
display: inline-flex;
align-items: center;
gap: 8px;
}
.reviewButton {
border: 1px solid var(--border);
border-radius: 8px;
padding: 4px 10px;
font-size: 14px;
font-weight: 400;
display: inline-flex;
align-items: center;
gap: 6px;
}
.reviewButton:hover {
background: var(--accent);
}
.reviewButton:disabled {
cursor: default;
opacity: 0.6;
}
.list {
display: grid;
gap: 0;
border-top: 1px solid var(--border);
padding: 0;
}
.fileRow {
appearance: none;
border: 0;
background: transparent;
color: var(--foreground);
font: inherit;
cursor: pointer;
min-width: 0;
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 10px;
align-items: center;
padding: 7px 14px;
text-align: left;
}
.fileRow:hover {
background: var(--accent);
}
.path {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--foreground);
font-size: 13px;
}
.lineStats {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 13px;
font-weight: 600;
white-space: nowrap;
}
.additions {
color: #16a34a;
}
.deletions {
color: #dc2626;
}
.showMoreButton {
justify-self: start;
padding: 7px 14px;
color: var(--foreground);
font-weight: 400;
display: inline-flex;
align-items: center;
gap: 6px;
}
.chevronIcon {
width: 14px;
height: 14px;
display: block;
color: var(--muted-foreground);
transition: transform 120ms ease;
}
.chevronIconOpen {
transform: rotate(180deg);
}
.artifactInfo {
min-width: 0;
display: grid;
}
.artifactMeta {
color: var(--muted-foreground);
font-size: 13px;
white-space: nowrap;
}