mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-08-03 21:34:40 +00:00
* 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>
206 lines
3 KiB
CSS
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;
|
|
}
|