qwen-code/packages/web-shell/client/components/dialogs/DialogPrimitives.module.css
ytahdn c61006b978
feat(web-shell): daemon web-shell improvements — token usage, settings, retry, streaming metrics, hidden commands (#5066)
* feat(web-shell): daemon web-shell improvements

- Align daemon token usage with structured DaemonTokenUsage type
- Optimize settings panel with i18n, theme/language pickers, compact mode
- Handle missing session recovery (404/410) with configurable behavior
- Restore settings event signal bump for workspace changes
- Prevent queued prompt loss on useEffect dependency change
- Align streaming loading indicator with CLI metrics logic
- Add Ctrl+Y retry for turn_error with daemon support
- Hide non-essential UI elements on narrow screens (≤700px)
- Prevent loading indicator flicker on page refresh
- Hydrate displayName from persisted session title on load

* fix(web-shell): harden retry affordance

* fix(web-shell): gate retry handling

---------

Co-authored-by: ytahdn <ytahdn@gmail.com>
2026-06-13 02:58:08 +00:00

441 lines
7.7 KiB
CSS

/* Shared dialog and picker primitives reused by dialog components. */
/* ===== Dialog Overlay & Panel ===== */
/* ===== CLI-style Picker (Model, Mode, Resume) ===== */
.resume-picker {
display: flex;
flex-direction: column;
height: 100%;
border: 1px solid var(--border-color);
border-radius: var(--radius);
overflow: hidden;
margin: 24px;
}
.resume-picker-header {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
}
.resume-picker-close {
margin-left: auto;
display: inline-flex;
align-items: center;
justify-content: center;
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-secondary);
color: var(--text-secondary);
cursor: pointer;
font-family: var(--font-mono);
font-size: 12px;
padding: 2px 8px;
flex-shrink: 0;
}
.resume-picker-close:hover {
color: var(--text-primary);
border-color: var(--accent-color);
}
.resume-picker-title {
font-weight: 700;
color: var(--text-primary);
font-size: 14px;
}
.resume-picker-count {
font-size: 12px;
color: var(--text-secondary);
}
.resume-picker-search {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 12px;
font-size: 13px;
min-height: 24px;
}
.resume-picker-search-label {
color: var(--text-secondary);
}
.resume-picker-search-input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: var(--text-primary);
font-family: var(--font-mono);
font-size: 13px;
}
.resume-picker-search-value {
color: var(--text-primary);
}
.resume-picker-search-hint {
color: var(--text-dimmed);
}
.resume-picker-sep {
height: 1px;
background: var(--border-color);
}
.resume-picker-list {
flex: 1;
overflow-y: auto;
padding: 4px 0;
}
.resume-picker-empty {
padding: 16px 12px;
color: var(--text-dimmed);
font-size: 13px;
}
.resume-picker-item {
display: flex;
align-items: baseline;
padding: 0px 12px;
cursor: pointer;
}
.resume-picker-session-item {
align-items: stretch;
flex-direction: column;
padding-top: 2px;
padding-bottom: 6px;
}
.resume-picker-item.selected {
background: var(--bg-tertiary);
}
.resume-picker-item:hover {
background: var(--bg-tertiary);
}
.resume-picker-keyboard-only .resume-picker-item:hover {
background: transparent;
}
.resume-picker-keyboard-only .resume-picker-item.selected:hover {
background: var(--bg-tertiary);
}
.resume-picker-item.disabled {
cursor: default;
opacity: 0.55;
}
.resume-picker-item-row {
display: flex;
align-items: baseline;
flex: 1;
gap: 4px;
min-width: 0;
width: 100%;
}
.resume-picker-item-prefix {
min-width: 14px;
flex-shrink: 0;
color: var(--accent-color);
font-weight: 700;
font-size: 20px;
margin-right: 8px;
white-space: pre;
}
.resume-picker-item-title {
flex: 1 1 auto;
min-width: 0;
color: var(--text-primary);
flex: 1 1 auto;
font-size: 13px;
font-weight: 500;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.resume-picker-item-checkbox {
color: var(--text-secondary);
flex-shrink: 0;
font-size: 13px;
white-space: pre;
}
.resume-picker-item.selected .resume-picker-item-checkbox {
color: var(--accent-color);
font-weight: 700;
}
.resume-picker-item-number {
flex-shrink: 0;
min-width: 28px;
color: var(--text-secondary);
font-size: 13px;
text-align: right;
}
.resume-picker-item-provider {
flex-shrink: 0;
color: var(--accent-color);
font-size: 13px;
font-weight: 700;
white-space: nowrap;
}
.resume-picker-item.selected .resume-picker-item-title {
color: var(--accent-color);
font-weight: 700;
}
.resume-picker-item-meta {
display: flex;
align-items: center;
gap: 8px;
padding-left: 26px;
font-size: 12px;
color: var(--text-secondary);
}
.resume-picker-item-detail {
color: var(--text-dimmed);
}
.resume-picker-item-detail::before {
content: '·';
margin-right: 8px;
color: var(--text-dimmed);
}
.resume-picker-item-check {
color: var(--accent-color, #4a9eff);
font-weight: bold;
margin-left: 4px;
}
.resume-picker-item-badge {
flex-shrink: 0;
margin-left: 8px;
font-size: 11px;
color: var(--accent-color, #4a9eff);
opacity: 0.8;
white-space: nowrap;
}
.mcp-status {
font-weight: 700;
}
.mcp-status-connected {
color: var(--success-color);
}
.mcp-status-connecting {
color: var(--warning-color);
}
.mcp-status-disconnected {
color: var(--error-color);
}
.mcp-status-disabled,
.mcp-status-unknown {
color: var(--text-dimmed);
}
.resume-picker-item-current {
border-left: 2px solid var(--accent-color, #4a9eff);
padding-left: 10px;
}
.resume-picker-footer {
padding: 6px 12px;
font-size: 12px;
color: var(--text-dimmed);
}
.resume-picker-detail-panel {
display: flex;
flex-direction: column;
gap: 4px;
padding: 8px 12px;
padding-left: 32px;
font-size: 13px;
flex-shrink: 0;
}
.resume-picker-detail-row {
display: grid;
grid-template-columns: 128px minmax(0, 1fr);
gap: 8px;
align-items: start;
}
.resume-picker-detail-label {
color: var(--text-secondary);
white-space: nowrap;
}
.resume-picker-detail-value {
color: var(--text-primary);
overflow-wrap: anywhere;
}
.dialog-inline-button,
.dialog-primary-button,
.dialog-danger-button {
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-secondary);
color: var(--text-primary);
font-family: var(--font-mono);
font-size: 12px;
padding: 4px 8px;
cursor: pointer;
}
.dialog-inline-button:hover,
.dialog-primary-button:hover {
border-color: var(--accent-color);
}
.dialog-inline-button:disabled,
.dialog-primary-button:disabled,
.dialog-danger-button:disabled {
cursor: default;
opacity: 0.5;
}
.dialog-inline-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.dialog-primary-button {
align-self: flex-start;
color: var(--accent-color);
}
.dialog-danger-button {
align-self: flex-start;
color: var(--error-color);
}
.dialog-form {
display: flex;
flex-direction: column;
gap: 10px;
padding: 12px;
overflow-y: auto;
}
.dialog-form label {
display: flex;
flex-direction: column;
gap: 4px;
color: var(--text-secondary);
font-size: 12px;
}
.dialog-form input,
.dialog-form select,
.dialog-form textarea {
border: 1px solid var(--border-color);
border-radius: 4px;
background: var(--bg-primary);
color: var(--text-primary);
font-family: var(--font-mono);
font-size: 13px;
padding: 6px 8px;
}
.dialog-form-row {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(120px, 180px);
gap: 10px;
}
.dialog-textarea {
min-height: 120px;
resize: vertical;
}
.dialog-split {
flex: 1;
min-height: 0;
display: grid;
grid-template-columns: minmax(220px, 38%) minmax(0, 1fr);
}
.dialog-split-list {
border-right: 1px solid var(--border-color);
}
.tools-desc-expanded {
display: flex;
flex-direction: column;
gap: 4px;
margin-left: 26px;
margin-top: 4px;
padding: 6px 8px;
border-left: 2px solid var(--accent-color);
background: var(--bg-secondary);
border-radius: 0 4px 4px 0;
}
.tools-desc-body {
color: var(--text-secondary);
font-size: 12px;
white-space: pre-wrap;
line-height: 1.5;
}
.dialog-detail {
padding: 12px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 8px;
}
.dialog-detail-title {
display: flex;
align-items: center;
justify-content: space-between;
color: var(--text-primary);
font-weight: 700;
}
.dialog-detail-shortcut {
font-size: 11px;
font-weight: 400;
color: var(--error-color);
opacity: 0.8;
}
.dialog-detail-meta {
color: var(--text-secondary);
font-size: 12px;
}
.dialog-detail-body {
color: var(--text-primary);
font-size: 12px;
white-space: pre-wrap;
line-height: 1.5;
border: 1px solid var(--border-color);
border-radius: 4px;
padding: 8px;
background: var(--bg-secondary);
}