Files
Agent-Tools/apps/desktop/src/styles/global.css
T

2524 lines
49 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================
* AgentDock 全局样式(Wave 0.5
* 全部颜色/辉光/动效时长来自 tokens/(视觉规范 v1.3),
* 本文件不出现任何魔法色值;布局尺寸来自规范 §3.0/§6。
* ============================================================ */
/* ---------- 重置与基础 ---------- */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
}
#root {
min-height: 100%;
}
body {
font-family: var(--ad-font-ui);
font-size: var(--ad-text-m-size);
line-height: var(--ad-text-m-height);
color: var(--ad-text-1);
background: var(--ad-bg-gradient); /* v1.3 §3.0:静态深空渐变,网格已移除 */
overflow-y: auto; /* v1.3 §3.0:主滚动容器 = 窗口,滚动条贴右缘 */
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
}
button {
font-family: inherit;
}
/* ---------- 自定义滚动条(v1.3 §2.7:10px、灰蓝滑块、透明轨道、不发光) ---------- */
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: var(--ad-scrollbar-thumb);
border-radius: 5px;
border: 2px solid transparent;
background-clip: padding-box;
min-height: 32px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--ad-scrollbar-thumb-hover);
background-clip: padding-box;
}
/* 标准属性兜底(Firefox 等) */
* {
scrollbar-width: thin;
scrollbar-color: var(--ad-scrollbar-thumb) transparent;
}
/* ---------- 应用外壳 ---------- */
.app-shell {
position: relative;
display: flex;
min-height: 100vh;
z-index: 1;
}
.app-main {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
}
/* 内容区与顶栏内区共用同一宽度体系(v1.3 §3.0:顶栏与内容区右缘对齐) */
.app-content,
.header-inner {
width: 100%;
max-width: var(--ad-frame-max);
margin-left: auto;
margin-right: auto;
padding-left: var(--ad-frame-pad-x);
padding-right: var(--ad-frame-pad-x);
}
.app-content {
flex: 1;
padding-top: var(--ad-space-6);
padding-bottom: var(--ad-space-6);
}
/* ---------- 侧边栏(§3.0:232px 贴左,窗口滚动时保持固定) ---------- */
.sidebar {
position: sticky;
top: 0;
align-self: flex-start;
height: 100vh;
width: 232px;
flex-shrink: 0;
display: flex;
flex-direction: column;
background: var(--ad-bg-1);
border-right: 1px solid var(--ad-border);
padding: var(--ad-space-3) 0 0;
}
.sidebar-nav {
flex: 1;
display: flex;
flex-direction: column;
gap: 2px;
padding: 0 var(--ad-space-2);
}
/* 导航项:圆角背景块,选中态为「左缘生长光晕 + 内描边」,无独立指示条(v1.2) */
.nav-item {
display: flex;
align-items: center;
gap: var(--ad-space-3);
width: 100%;
height: 40px;
padding: 0 var(--ad-space-3);
border: none;
border-radius: var(--ad-radius-m);
background: transparent;
color: var(--ad-text-2);
font-size: var(--ad-text-m-size);
cursor: pointer;
user-select: none;
transition: background var(--ad-dur-fast) var(--ad-ease-out),
color var(--ad-dur-fast) var(--ad-ease-out);
}
.nav-item:hover {
background: var(--ad-bg-3);
color: var(--ad-text-1);
}
.nav-item.active {
background: var(--ad-nav-selected-bg);
box-shadow: var(--ad-nav-selected-border);
color: var(--ad-primary);
}
.nav-icon {
flex-shrink: 0;
}
/* 底部引擎状态区(§3.0:48px + 顶部分隔线) */
.sidebar-engine {
height: 48px;
flex-shrink: 0;
display: flex;
align-items: center;
gap: var(--ad-space-2);
padding: 0 var(--ad-space-4);
border-top: 1px solid var(--ad-border);
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
white-space: nowrap;
overflow: hidden;
}
.engine-version {
margin-left: auto;
}
/* ---------- 顶栏(§3.0:通栏 56px,内区与内容区同一宽度体系,滚动时吸顶) ---------- */
.header {
position: sticky;
top: 0;
z-index: 10;
height: 56px;
flex-shrink: 0;
background: var(--ad-bg-0);
border-bottom: 1px solid var(--ad-border);
}
.header-inner {
height: 100%;
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--ad-space-4);
}
.header-title {
font-size: var(--ad-text-xl-size);
font-weight: var(--ad-text-xl-weight);
white-space: nowrap;
}
.header-actions {
display: flex;
align-items: center;
gap: var(--ad-space-3);
}
/* 搜索框(§3.0:限宽 320px,聚焦青边框 + 主辉光) */
.search-box {
position: relative;
width: 320px;
}
.search-box input {
width: 100%;
height: 36px;
padding: 0 var(--ad-space-3) 0 36px;
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
background: var(--ad-bg-1);
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
outline: none;
transition: border-color var(--ad-dur-micro) var(--ad-ease-out),
box-shadow var(--ad-dur-micro) var(--ad-ease-out);
}
.search-box input::placeholder {
color: var(--ad-text-3);
}
.search-box input:focus {
border-color: var(--ad-primary);
box-shadow: var(--ad-glow-primary);
}
.search-icon {
position: absolute;
left: var(--ad-space-3);
top: 50%;
transform: translateY(-50%);
color: var(--ad-text-3);
pointer-events: none;
}
/* 环境警告 chip(§3.0:黄描边 + 黄点 + chevron,悬浮带辉光) */
.env-chip {
display: inline-flex;
align-items: center;
gap: var(--ad-space-2);
height: 28px;
padding: 0 var(--ad-space-3);
border: 1px solid var(--ad-warning-chip-border);
border-radius: var(--ad-radius-s);
background: var(--ad-warning-dim);
color: var(--ad-warning);
font-size: var(--ad-text-s-size);
cursor: pointer;
transition: border-color var(--ad-dur-fast) var(--ad-ease-out),
box-shadow var(--ad-dur-fast) var(--ad-ease-out);
}
.env-chip:hover {
border-color: var(--ad-warning);
box-shadow: var(--ad-glow-warning);
}
/* ---------- 按钮 ---------- */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--ad-space-2);
height: 36px;
min-width: 96px; /* v1.3 §2.6.1 */
max-width: 360px; /* v1.3 §2.6.1:禁止通栏 */
padding: 0 var(--ad-space-4);
border: 1px solid transparent;
border-radius: var(--ad-radius-s);
font-size: var(--ad-text-m-size);
font-weight: 500;
cursor: pointer;
transition: filter var(--ad-dur-fast) var(--ad-ease-out),
box-shadow var(--ad-dur-fast) var(--ad-ease-out),
border-color var(--ad-dur-fast) var(--ad-ease-out);
}
.btn:disabled {
opacity: 0.4; /* v1.3 §3.7:无意义操作置灰 */
cursor: not-allowed;
}
/* 主按钮(§2.6 v1.2:内渐变 + 内高光 + 常驻弱辉光,hover 双层扩散辉光) */
.btn-primary {
background: var(--ad-btn-primary-bg);
box-shadow: var(--ad-btn-primary-inner), var(--ad-btn-primary-glow);
color: var(--ad-btn-primary-text);
}
.btn-primary:hover:not(:disabled) {
filter: brightness(1.08);
box-shadow: var(--ad-btn-primary-inner), var(--ad-btn-primary-glow-hover);
}
.btn-primary:active:not(:disabled) {
filter: brightness(0.94);
box-shadow: var(--ad-btn-primary-inner);
}
/* 次按钮(§3.6 */
.btn-secondary {
background: transparent;
border-color: var(--ad-border-bright);
color: var(--ad-text-1);
}
.btn-secondary:hover:not(:disabled) {
border-color: var(--ad-primary);
}
/* 链接式按钮 */
.link-btn {
display: inline-flex;
align-items: center;
gap: var(--ad-space-1);
border: none;
background: none;
color: var(--ad-primary);
font-size: var(--ad-text-s-size);
cursor: pointer;
transition: color var(--ad-dur-fast) var(--ad-ease-out);
}
.link-btn:hover {
color: var(--ad-primary-hover);
}
.link-btn svg {
transition: transform var(--ad-dur-fast) var(--ad-ease-out);
}
.link-btn:hover svg {
transform: translateX(2px);
}
/* ---------- 通用小组件 ---------- */
/* Mono chip(§2.2 */
.mono-chip {
display: inline-block;
font-family: var(--ad-mono-chip-font);
font-size: var(--ad-mono-chip-size);
line-height: 1.5;
background: var(--ad-mono-chip-bg);
border: var(--ad-mono-chip-border);
border-radius: var(--ad-mono-chip-radius);
padding: var(--ad-mono-chip-padding);
color: var(--ad-mono-chip-color);
white-space: nowrap;
}
/* CLI 单色字母头像(§3.1.4 / §7) */
.monogram {
display: inline-flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
background: var(--ad-bg-2);
color: var(--ad-text-2);
font-weight: 600;
letter-spacing: 0.02em;
}
/* 状态角标(§3.1.4 / §3.2 */
.badge {
display: inline-flex;
align-items: center;
height: 22px;
padding: 0 var(--ad-space-2);
border: 1px solid transparent;
border-radius: var(--ad-radius-s);
font-size: var(--ad-text-xs-size);
white-space: nowrap;
}
.badge-installed {
color: var(--ad-primary);
border-color: var(--ad-primary-border);
background: var(--ad-primary-dim);
}
.badge-update {
color: var(--ad-accent);
border-color: var(--ad-accent-border);
background: var(--ad-accent-dim);
box-shadow: var(--ad-glow-accent);
}
.badge-auth {
color: var(--ad-attention);
border-color: var(--ad-attention-border);
background: var(--ad-attention-dim);
}
.badge-uninstalled {
color: var(--ad-text-3);
border-color: var(--ad-border);
background: var(--ad-bg-1);
}
/* 状态点(§4.5:绿静态;警告/错误可呼吸;紫/灰静态) */
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.status-dot.ok {
background: var(--ad-success);
}
.status-dot.warn {
background: var(--ad-warning);
}
.status-dot.error {
background: var(--ad-danger);
}
.status-dot.unknown {
background: var(--ad-text-3);
}
.status-dot.breathe {
animation: ad-breathe var(--ad-breathe-duration) var(--ad-ease-inout) infinite;
}
/* ---------- 面板 ---------- */
.panel {
background: var(--ad-bg-1);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-l);
padding: var(--ad-space-5);
}
.panel-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--ad-space-4);
margin-bottom: var(--ad-space-4);
}
.panel-title {
font-size: var(--ad-text-l-size);
font-weight: var(--ad-text-l-weight);
}
.panel-hint {
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
.panel-empty {
padding: var(--ad-space-5);
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
/* ---------- 总览:KPI 卡(§3.1.1 ---------- */
.kpi-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: var(--ad-space-4);
margin-bottom: var(--ad-space-6);
}
.kpi-card {
position: relative;
overflow: hidden;
padding: var(--ad-space-4) var(--ad-space-5) var(--ad-space-5);
border-radius: var(--ad-radius-l);
background: var(--ad-surface-card);
box-shadow: var(--ad-card-highlight), var(--ad-shadow-panel);
transition: transform var(--ad-dur-fast) var(--ad-ease-out);
}
.kpi-card:hover {
transform: translateY(-2px);
}
.kpi-bar {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
}
.kpi-value {
font-size: var(--ad-text-num-size);
line-height: var(--ad-text-num-height);
font-weight: var(--ad-text-num-weight);
}
.kpi-label {
margin-top: 2px;
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.kpi-subtitle {
margin-top: var(--ad-space-2);
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
/* ---------- 总览:中段(诊断 + 快速操作) ---------- */
.overview-mid {
display: grid;
grid-template-columns: 2fr 1fr;
gap: var(--ad-space-4);
margin-bottom: var(--ad-space-6);
}
.diag-row {
display: flex;
align-items: center;
gap: var(--ad-space-3);
min-height: 48px;
padding: 0 var(--ad-space-2);
border-bottom: 1px solid var(--ad-border);
}
.diag-row:last-child {
border-bottom: none;
}
.diag-cli {
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
white-space: nowrap;
}
.diag-text {
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.diag-time {
margin-left: auto;
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
white-space: nowrap;
}
.quick-card {
display: flex;
flex-direction: column;
gap: var(--ad-space-3);
}
/* v1.3 §2.6.1:快速操作组定宽(组宽 = min(内容宽, 360px)),左对齐,不通栏 */
.quick-card .btn {
width: min(100%, 360px);
justify-content: flex-start;
padding-left: var(--ad-space-4);
padding-right: var(--ad-space-4);
}
.recent-installs {
margin-top: var(--ad-space-2);
}
.group-label {
color: var(--ad-text-3);
font-size: var(--ad-text-xs-size);
}
.group-empty {
padding: var(--ad-space-2) 0;
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.safety-note {
display: flex;
align-items: center;
gap: var(--ad-space-2);
margin-top: auto;
padding-top: var(--ad-space-3);
border-top: 1px solid var(--ad-border);
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
/* ---------- 总览:CLI 状态网格(§3.1.4 ---------- */
.cli-status-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: var(--ad-space-4);
}
.cli-block {
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
padding: var(--ad-space-4);
background: var(--ad-bg-1);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
transition: border-color var(--ad-dur-fast) var(--ad-ease-out);
}
.cli-block:hover {
border-color: var(--ad-border-bright);
}
.cli-block-top {
display: flex;
align-items: center;
gap: var(--ad-space-3);
}
.cli-block-name {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: var(--ad-text-m-size);
color: var(--ad-text-1);
}
.cli-block-auth {
display: flex;
align-items: center;
gap: var(--ad-space-2);
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
/* 未安装卡版本位(v1.3 §3.1.4:废止「—」chip,改灰字「未安装」) */
.cli-block-version .version-missing {
color: var(--ad-text-3);
font-size: var(--ad-text-s-size);
}
/* 首跑精简块:安装入口(v1.3 §3.1.5) */
.cli-block-install {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: var(--ad-space-1);
}
/* ---------- 总览:首跑空态引导区(v1.3 §3.1.5 ---------- */
.onboarding {
display: grid;
grid-template-columns: auto 1fr;
gap: var(--ad-space-6);
align-items: center;
padding: var(--ad-space-6);
background: var(--ad-bg-1);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-l);
}
.onboarding-art {
display: flex;
align-items: center;
justify-content: center;
color: var(--ad-border-bright);
}
.onboarding-copy {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: var(--ad-space-3);
}
.onboarding-title {
font-size: var(--ad-text-xl-size);
font-weight: var(--ad-text-xl-weight);
color: var(--ad-text-1);
}
.onboarding-desc {
max-width: 480px;
color: var(--ad-text-2);
font-size: var(--ad-text-m-size);
line-height: 1.6;
}
.onboarding-actions {
display: flex;
align-items: center;
gap: var(--ad-space-3);
margin-top: var(--ad-space-2);
}
/* 诊断空态(v1.3 §3.1.2 / §3.7:无记录不渲染占位行) */
.diag-empty {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: var(--ad-space-3);
padding: var(--ad-space-5) var(--ad-space-2);
}
.diag-empty-text {
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
/* ---------- 总览:本机环境 ---------- */
.env-panel {
margin-top: var(--ad-space-6);
}
.env-grid {
display: grid;
grid-template-columns: 1.1fr 1fr;
gap: var(--ad-space-6);
}
.env-basic {
display: flex;
flex-direction: column;
gap: var(--ad-space-3);
}
.env-row {
display: flex;
align-items: baseline;
gap: var(--ad-space-3);
}
.env-key {
flex-shrink: 0;
width: 64px;
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.env-val {
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
word-break: break-all;
}
/* 本机环境运行时项(v1.3 §3.1.6:四元组同构,点—名称—版本—行动,行高 28px) */
.runtime-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: var(--ad-space-4);
align-content: start;
}
.runtime-item {
display: flex;
align-items: center;
gap: var(--ad-space-2);
min-height: 28px;
min-width: 0;
}
.runtime-name {
color: var(--ad-text-1);
font-size: var(--ad-text-s-size);
white-space: nowrap;
}
.runtime-version {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
min-width: 0;
}
.runtime-missing {
color: var(--ad-text-3);
font-size: var(--ad-text-xs-size);
white-space: nowrap;
}
.runtime-action {
margin-left: auto;
white-space: nowrap;
}
.path-block {
margin-top: var(--ad-space-5);
padding-top: var(--ad-space-4);
border-top: 1px solid var(--ad-border);
}
.path-head {
display: flex;
align-items: center;
gap: var(--ad-space-3);
margin-bottom: var(--ad-space-2);
}
.path-title {
display: flex;
align-items: center;
gap: var(--ad-space-2);
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.path-entry {
padding: var(--ad-space-1) 0;
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
font-family: var(--ad-font-mono);
word-break: break-all;
}
/* ---------- CLI 目录(§3.2 ---------- */
.catalog-toolbar {
display: flex;
align-items: center;
gap: var(--ad-space-4);
flex-wrap: wrap;
margin-bottom: var(--ad-space-5);
}
.filter-group {
display: flex;
align-items: center;
gap: var(--ad-space-2);
}
.pill {
height: 32px;
padding: 0 var(--ad-space-3);
border: 1px solid var(--ad-border);
border-radius: 16px;
background: transparent;
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
cursor: pointer;
transition: border-color var(--ad-dur-fast) var(--ad-ease-out),
color var(--ad-dur-fast) var(--ad-ease-out);
}
.pill:hover {
border-color: var(--ad-border-bright);
color: var(--ad-text-1);
}
.pill.active {
border-color: var(--ad-primary);
color: var(--ad-primary);
background: var(--ad-primary-dim);
}
.catalog-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: var(--ad-space-4);
}
.catalog-card {
display: flex;
flex-direction: column;
gap: var(--ad-space-3);
padding: var(--ad-space-5);
background: var(--ad-bg-1);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
transition: border-color var(--ad-dur-fast) var(--ad-ease-out),
box-shadow var(--ad-dur-fast) var(--ad-ease-out);
}
.catalog-card:hover {
border-color: var(--ad-primary);
box-shadow: var(--ad-glow-primary);
}
.catalog-card-top {
display: flex;
align-items: center;
gap: var(--ad-space-3);
}
.catalog-card-head {
min-width: 0;
}
.catalog-card-name {
font-size: var(--ad-text-l-size);
font-weight: var(--ad-text-l-weight);
color: var(--ad-text-1);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.catalog-card-vendor {
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.catalog-card-desc {
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
line-height: 1.5;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.catalog-card-bottom {
display: flex;
align-items: center;
gap: var(--ad-space-3);
margin-top: auto;
}
.catalog-platforms {
margin-left: auto;
color: var(--ad-text-3);
font-size: var(--ad-text-xs-size);
white-space: nowrap;
}
.catalog-empty {
grid-column: 1 / -1;
}
/* ---------- 占位页(Wave 0 页面) ---------- */
.placeholder-page {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--ad-space-4);
min-height: 60vh;
text-align: center;
}
.placeholder-icon {
color: var(--ad-text-3);
}
.placeholder-title {
font-size: var(--ad-text-xl-size);
font-weight: var(--ad-text-xl-weight);
}
.placeholder-desc {
max-width: 480px;
color: var(--ad-text-2);
font-size: var(--ad-text-m-size);
}
/* ---------- 设置页 ---------- */
.settings-page {
max-width: 720px;
}
.settings-group {
margin-top: var(--ad-space-4);
background: var(--ad-bg-1);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-l);
}
.setting-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--ad-space-4);
padding: var(--ad-space-4) var(--ad-space-5);
border-bottom: 1px solid var(--ad-border);
}
.setting-row:last-child {
border-bottom: none;
}
.setting-label {
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
}
.setting-hint {
margin-top: 2px;
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
.setting-value {
flex-shrink: 0;
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.settings-page-foot {
display: flex;
align-items: center;
gap: var(--ad-space-2);
margin-top: var(--ad-space-5);
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
/* ---------- 页面切换动效(§4.2 ---------- */
.page-enter {
animation: page-in var(--ad-dur-med) var(--ad-ease-out);
}
@keyframes page-in {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: none;
}
}
/* ---------- 响应式(v1.3 §6 四断点) ---------- */
/* 紧凑 9601199px:导航收起 64pxKPI 2×2,中段上下堆叠 */
@media (max-width: 1199px) {
.sidebar {
width: 64px;
padding: var(--ad-space-3) 0 0;
}
.sidebar-nav {
padding: 0 var(--ad-space-2);
}
.nav-item {
justify-content: center;
padding: 0;
}
.nav-label {
display: none;
}
.sidebar-engine {
justify-content: center;
padding: 0;
}
.engine-text,
.engine-version {
display: none;
}
.kpi-grid {
grid-template-columns: repeat(2, 1fr);
}
.overview-mid {
grid-template-columns: 1fr;
}
.runtime-grid {
grid-template-columns: repeat(2, 1fr);
}
.env-grid {
grid-template-columns: 1fr;
}
}
/* 紧凑断点搜索框收缩为 36px 图标按钮 */
@media (max-width: 1199px) {
.search-box {
width: 36px;
}
.search-box input {
padding: 0;
border-color: transparent;
background: transparent;
cursor: pointer;
}
.search-box input::placeholder {
color: transparent;
}
.search-box:focus-within {
width: 240px;
}
.search-box:focus-within input {
padding: 0 var(--ad-space-3) 0 36px;
border-color: var(--ad-border);
background: var(--ad-bg-1);
}
.search-icon {
left: 10px;
}
}
/* 标准 12001919px:默认(完整导航、KPI 一排 4、诊断+快速 2:1、内容区 max 1440 居中)
* 宽阔 19202559px:内容区 max 1760 居中(v1.3 §6
* 超宽 ≥2560px:取消居中锁宽,内容区全宽、边距 48px(v1.3 §6 */
@media (min-width: 1920px) and (max-width: 2559px) {
:root {
--ad-frame-max: 1760px;
}
}
@media (min-width: 2560px) {
:root {
--ad-frame-max: none;
--ad-frame-pad-x: var(--ad-space-12);
}
}
/* 超宽 ≥2560px:中段三栏(诊断 1/2 + 快速操作 1/4 + 本机环境 1/4),本机环境上提 */
@media (min-width: 2560px) {
.overview {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
column-gap: var(--ad-space-4);
row-gap: var(--ad-space-6);
}
.overview .kpi-grid {
grid-column: 1 / -1;
margin-bottom: 0;
}
.overview .overview-mid {
grid-column: 1 / 3;
grid-row: 2;
margin-bottom: 0;
}
.overview .cli-status-panel {
grid-column: 1 / -1;
}
.overview .env-panel {
grid-column: 3;
grid-row: 2;
margin-top: 0;
}
}
/* 窗口高度 < 700px:顶栏 44pxKPI 大数字缩小 */
@media (max-height: 699px) {
.header {
height: 44px;
}
.kpi-value {
font-size: 22px;
line-height: 28px;
}
}
/* 低档/减弱动效下呼吸灯停用(tiers.css 已兜底 animation,此处补充过渡抑制) */
[data-fx-tier="low"] .kpi-card:hover {
transform: none;
}
/* ============================================================
* Wave 2CLI 详情页 / 安装确认弹窗 / 配置表单 / 诊断结果
* 全部颜色/辉光/时长来自 tokens/(视觉规范 v1.2 §3.33.5 + v1.3
* ============================================================ */
/* 授权状态点(未授权 = 紫,静态,不发光不呼吸,§3.3) */
.status-dot.auth {
background: var(--ad-attention);
}
/* ---------- CLI 详情页 ---------- */
.cli-detail {
max-width: var(--ad-frame-max);
margin: 0 auto;
}
.detail-back {
margin-bottom: var(--ad-space-4);
}
.cli-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--ad-space-6);
padding: var(--ad-space-6);
margin-bottom: var(--ad-space-5);
}
.cli-head-main {
display: flex;
align-items: flex-start;
gap: var(--ad-space-4);
min-width: 0;
}
.cli-head-info {
min-width: 0;
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
}
.cli-head-name {
font-size: var(--ad-text-xl-size);
font-weight: var(--ad-text-xl-weight);
}
.cli-head-vendor {
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.cli-head-license {
color: var(--ad-text-3);
}
.cli-head-meta {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--ad-space-2);
margin-top: var(--ad-space-1);
}
.status-badge-mini {
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
.cli-head-path {
max-width: 420px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cli-head-unconfirmed {
color: var(--ad-text-3);
font-size: var(--ad-text-xs-size);
}
.cli-head-side {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: var(--ad-space-3);
flex-shrink: 0;
}
.auth-light {
display: inline-flex;
align-items: center;
gap: var(--ad-space-2);
}
.auth-light-text {
color: var(--ad-text-1);
font-size: var(--ad-text-s-size);
}
.cli-head-actions {
display: flex;
align-items: center;
gap: var(--ad-space-3);
}
/* 危险文字按钮(§3.3:卸载 = 文字按钮,悬停变红) */
.btn-text-danger {
display: inline-flex;
align-items: center;
gap: var(--ad-space-2);
height: 36px;
padding: 0 var(--ad-space-2);
border: none;
background: none;
color: var(--ad-text-2);
font-size: var(--ad-text-m-size);
cursor: pointer;
transition: color var(--ad-dur-fast) var(--ad-ease-out);
}
.btn-text-danger:hover:not(:disabled) {
color: var(--ad-danger);
}
.btn-text-danger:disabled {
opacity: 0.4;
cursor: not-allowed;
}
/* ---------- 标签页(§3.3:底部 2px 青条 + 青色文字) ---------- */
.tabs {
display: flex;
align-items: center;
gap: var(--ad-space-5);
border-bottom: 1px solid var(--ad-border);
margin-bottom: var(--ad-space-5);
}
.tab {
position: relative;
height: 40px;
padding: 0 var(--ad-space-2);
border: none;
background: none;
color: var(--ad-text-2);
font-size: var(--ad-text-m-size);
cursor: pointer;
transition: color var(--ad-dur-fast) var(--ad-ease-out);
}
.tab:hover {
color: var(--ad-text-1);
}
.tab.active {
color: var(--ad-primary);
}
.tab.active::after {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: -1px;
height: 2px;
background: var(--ad-primary);
}
.cli-detail-body {
max-width: 720px;
}
/* ---------- 概览 / 文档块 ---------- */
.detail-block {
margin-bottom: var(--ad-space-5);
}
.detail-block-title {
display: flex;
align-items: center;
gap: var(--ad-space-2);
font-size: var(--ad-text-l-size);
font-weight: var(--ad-text-l-weight);
margin-bottom: var(--ad-space-3);
}
.detail-block-text {
color: var(--ad-text-2);
font-size: var(--ad-text-m-size);
line-height: 1.6;
}
.detail-channels {
list-style: none;
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
}
.detail-channel {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--ad-space-2);
}
.detail-channel-pkg {
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
.detail-note {
display: flex;
align-items: flex-start;
gap: var(--ad-space-2);
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
padding: var(--ad-space-4);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
background: var(--ad-bg-1);
}
.detail-commands {
list-style: none;
display: flex;
flex-direction: column;
gap: var(--ad-space-3);
}
.detail-command {
display: flex;
align-items: center;
gap: var(--ad-space-3);
}
.detail-command-desc {
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
/* ---------- 诊断结果(§3.5 ---------- */
.diag-summary {
display: flex;
align-items: center;
gap: var(--ad-space-3);
padding: var(--ad-space-4);
margin-bottom: var(--ad-space-4);
background: var(--ad-bg-1);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
font-size: var(--ad-text-m-size);
}
.diag-finding {
display: flex;
align-items: stretch;
margin-bottom: var(--ad-space-3);
background: var(--ad-bg-1);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
overflow: hidden;
}
.diag-sev-bar {
width: 3px;
flex-shrink: 0;
}
.diag-sev-bar.diag-sev-info,
.diag-sev-tag.diag-sev-info {
background: var(--ad-attention);
color: var(--ad-attention);
}
.diag-sev-bar.diag-sev-warn,
.diag-sev-tag.diag-sev-warn {
background: var(--ad-warning);
color: var(--ad-warning);
}
.diag-sev-bar.diag-sev-error,
.diag-sev-tag.diag-sev-error {
background: var(--ad-danger);
color: var(--ad-danger);
}
.diag-finding-body {
flex: 1;
padding: var(--ad-space-4);
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
}
.diag-finding-head {
display: flex;
align-items: center;
gap: var(--ad-space-2);
}
.diag-sev-tag {
display: inline-flex;
align-items: center;
height: 20px;
padding: 0 var(--ad-space-2);
border-radius: var(--ad-radius-s);
font-size: var(--ad-text-xs-size);
background: transparent;
}
.diag-finding-rule {
color: var(--ad-text-3);
font-family: var(--ad-font-mono);
font-size: var(--ad-text-xs-size);
}
.diag-finding-msg {
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
line-height: 1.5;
}
.diag-evidence-toggle {
align-self: flex-start;
}
.diag-evidence {
padding: var(--ad-space-3);
background: var(--ad-bg-0);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-s);
font-family: var(--ad-font-mono);
font-size: var(--ad-text-xs-size);
color: var(--ad-text-2);
white-space: pre-wrap;
word-break: break-all;
}
/* ---------- 弹窗(§3.6 ---------- */
.modal-mask {
position: fixed;
inset: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: center;
background: var(--ad-modal-mask);
}
.modal {
width: min(560px, calc(100vw - 48px));
max-height: calc(100vh - 96px);
display: flex;
flex-direction: column;
background: var(--ad-bg-2);
border-radius: var(--ad-radius-l);
box-shadow: var(--ad-shadow-pop);
border: 1px solid var(--ad-border);
}
.modal-head {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--ad-space-4) var(--ad-space-5);
border-bottom: 1px solid var(--ad-border);
}
.modal-title {
font-size: var(--ad-text-l-size);
font-weight: var(--ad-text-l-weight);
}
.modal-close {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: none;
background: none;
color: var(--ad-text-2);
cursor: pointer;
border-radius: var(--ad-radius-s);
}
.modal-close:hover {
color: var(--ad-text-1);
background: var(--ad-bg-3);
}
.modal-body {
padding: var(--ad-space-5);
overflow-y: auto;
}
.modal-foot {
display: flex;
align-items: center;
justify-content: flex-end;
gap: var(--ad-space-3);
padding: var(--ad-space-4) var(--ad-space-5);
border-top: 1px solid var(--ad-border);
}
/* ---------- 确认弹窗内容 ---------- */
.confirm-body {
display: flex;
flex-direction: column;
gap: var(--ad-space-4);
}
.confirm-section {
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
}
.confirm-label {
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
.confirm-text {
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
}
.confirm-empty {
color: var(--ad-text-3);
font-size: var(--ad-text-s-size);
}
.confirm-cmd {
padding: var(--ad-space-3);
background: var(--ad-bg-0);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-s);
overflow-x: auto;
}
.confirm-files {
display: flex;
flex-wrap: wrap;
gap: var(--ad-space-2);
}
.confirm-note {
color: var(--ad-warning);
font-size: var(--ad-text-xs-size);
}
/* ---------- 流式执行日志 ---------- */
.run-log {
display: flex;
flex-direction: column;
gap: var(--ad-space-1);
max-height: 320px;
overflow-y: auto;
font-family: var(--ad-font-mono);
font-size: var(--ad-text-xs-size);
}
.run-log-wait {
display: flex;
align-items: center;
gap: var(--ad-space-2);
color: var(--ad-text-2);
}
.run-log-line {
display: flex;
align-items: flex-start;
gap: var(--ad-space-2);
color: var(--ad-text-2);
word-break: break-all;
white-space: pre-wrap;
}
.run-log-line.step {
color: var(--ad-primary);
}
.run-log-line.stderr {
color: var(--ad-warning);
}
.run-log-line.error {
color: var(--ad-danger);
}
.spin {
animation: ad-spin 1.2s linear infinite;
}
@keyframes ad-spin {
to {
transform: rotate(360deg);
}
}
/* ---------- 配置表单(§3.4 ---------- */
.config-form {
display: flex;
flex-direction: column;
gap: var(--ad-space-5);
max-width: 640px;
}
.field {
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
}
.field-label {
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.field-required {
color: var(--ad-primary);
}
.field-control {
position: relative;
display: flex;
align-items: center;
}
.field-control input {
width: 100%;
height: 36px;
padding: 0 var(--ad-space-3);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
background: var(--ad-bg-0);
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
outline: none;
transition: border-color var(--ad-dur-micro) var(--ad-ease-out),
box-shadow var(--ad-dur-micro) var(--ad-ease-out);
}
.field-control input::placeholder {
color: var(--ad-text-3);
}
.field-control input:focus {
border-color: var(--ad-primary);
box-shadow: var(--ad-glow-primary);
}
.field-control input[type="password"] {
padding-right: 40px;
}
.field-lock {
position: absolute;
left: var(--ad-space-3);
color: var(--ad-text-2);
pointer-events: none;
}
.field-control .field-lock + input {
padding-left: 32px;
}
.field-eye {
position: absolute;
right: var(--ad-space-2);
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border: none;
background: none;
color: var(--ad-text-2);
cursor: pointer;
}
.field-eye:hover {
color: var(--ad-text-1);
}
.field-help {
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
.field-keyring-note {
color: var(--ad-attention);
}
.config-file-info {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--ad-space-2);
padding-top: var(--ad-space-4);
border-top: 1px solid var(--ad-border);
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
.config-savebar {
position: sticky;
bottom: 0;
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--ad-space-4);
padding: var(--ad-space-4) 0;
background: linear-gradient(180deg, transparent, var(--ad-bg-0) 40%);
}
.config-save-msg {
display: flex;
flex-direction: column;
gap: var(--ad-space-1);
font-size: var(--ad-text-xs-size);
}
.save-ok {
display: inline-flex;
align-items: center;
gap: var(--ad-space-1);
color: var(--ad-success);
}
.save-detail {
color: var(--ad-text-2);
}
.save-error {
color: var(--ad-danger);
}
/* ============================================================
* Wave 2.1:安装进度 / 配置校验 / 详情信息 / 目录真机状态 / 我的 CLI
* 全部颜色来自 tokens/
* ============================================================ */
/* ---------- 执行进度三阶段(安装弹窗) ---------- */
.run-body {
display: flex;
flex-direction: column;
gap: var(--ad-space-4);
}
.run-phases {
display: flex;
align-items: center;
gap: var(--ad-space-2);
}
.run-phase {
display: flex;
align-items: center;
gap: var(--ad-space-2);
color: var(--ad-text-3);
font-size: var(--ad-text-s-size);
}
.run-phase-dot {
display: inline-flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
border-radius: 50%;
border: 1px solid var(--ad-border);
font-size: var(--ad-text-xs-size);
}
.run-phase.done {
color: var(--ad-success);
}
.run-phase.done .run-phase-dot {
border-color: var(--ad-success);
color: var(--ad-success);
}
.run-phase.active {
color: var(--ad-primary);
}
.run-phase.active .run-phase-dot {
border-color: var(--ad-primary);
color: var(--ad-primary);
box-shadow: var(--ad-glow-primary);
}
.run-result {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--ad-space-2);
padding: var(--ad-space-3) var(--ad-space-4);
border-radius: var(--ad-radius-m);
font-size: var(--ad-text-s-size);
}
.run-result.success {
color: var(--ad-success);
border: 1px solid var(--ad-border);
background: var(--ad-bg-1);
}
.run-result.failed {
color: var(--ad-danger);
border: 1px solid var(--ad-border);
background: var(--ad-bg-1);
}
.run-result-version {
color: var(--ad-text-2);
font-family: var(--ad-font-mono);
font-size: var(--ad-text-xs-size);
word-break: break-all;
}
/* ---------- 详情概览:基本信息表 + 官方链接 ---------- */
.detail-meta {
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
}
.detail-meta-row {
display: flex;
align-items: center;
gap: var(--ad-space-3);
}
.detail-meta-label {
width: 88px;
flex-shrink: 0;
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.detail-meta-value {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: var(--ad-space-2);
min-width: 0;
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
}
.detail-links {
display: flex;
gap: var(--ad-space-4);
}
.detail-link {
color: var(--ad-primary);
font-size: var(--ad-text-m-size);
text-decoration: none;
}
.detail-link:hover {
text-decoration: underline;
}
.detail-doc-footer {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: var(--ad-space-3);
padding-top: var(--ad-space-4);
border-top: 1px solid var(--ad-border);
}
.detail-doc-meta {
color: var(--ad-text-3);
font-size: var(--ad-text-xs-size);
}
/* ---------- 配置表单:下拉 + 官方链接 + 校验结果 ---------- */
.field-select {
width: 100%;
height: 36px;
padding: 0 var(--ad-space-3);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
background: var(--ad-bg-0);
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
outline: none;
}
.field-select:focus {
border-color: var(--ad-primary);
box-shadow: var(--ad-glow-primary);
}
.field-docs-link {
display: inline-flex;
align-items: center;
gap: 2px;
margin-left: var(--ad-space-2);
color: var(--ad-primary);
text-decoration: none;
}
.field-docs-link:hover {
text-decoration: underline;
}
.verify-ok {
display: inline-flex;
align-items: flex-start;
gap: var(--ad-space-1);
color: var(--ad-success);
font-size: var(--ad-text-xs-size);
}
.verify-fail {
display: inline-flex;
align-items: flex-start;
gap: var(--ad-space-1);
color: var(--ad-danger);
font-size: var(--ad-text-xs-size);
}
/* ---------- 目录真机版本位 ---------- */
.catalog-version {
display: inline-flex;
align-items: center;
gap: var(--ad-space-2);
}
/* ---------- 我的 CLI 列表 ---------- */
.mycli {
max-width: var(--ad-frame-max);
margin: 0 auto;
}
.mycli-list {
padding: var(--ad-space-4);
}
.mycli-row {
display: flex;
align-items: center;
gap: var(--ad-space-3);
width: 100%;
padding: var(--ad-space-3) var(--ad-space-2);
border: none;
border-bottom: 1px solid var(--ad-border);
background: none;
cursor: pointer;
text-align: left;
}
.mycli-row:last-child {
border-bottom: none;
}
.mycli-row:hover {
background: var(--ad-bg-3);
}
.mycli-row-main {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.mycli-row-name {
color: var(--ad-text-1);
font-size: var(--ad-text-m-size);
}
.mycli-row-version {
display: inline-flex;
align-items: center;
gap: var(--ad-space-2);
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
}
.mycli-row-path {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.mycli-auth {
display: inline-flex;
align-items: center;
gap: var(--ad-space-2);
color: var(--ad-text-2);
font-size: var(--ad-text-xs-size);
white-space: nowrap;
}
.mycli-row-arrow {
color: var(--ad-text-3);
}
/* ---------- 错误边界(防黑屏) ---------- */
.crash-screen {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: var(--ad-space-4);
padding: var(--ad-space-8);
}
.crash-title {
font-size: var(--ad-text-xl-size);
font-weight: var(--ad-text-xl-weight);
}
.crash-desc {
color: var(--ad-text-2);
font-size: var(--ad-text-m-size);
}
.crash-detail {
color: var(--ad-text-3);
font-family: var(--ad-font-mono);
font-size: var(--ad-text-xs-size);
word-break: break-all;
}
/* ---------- 配置表单三层分组(授权/常用/高级) ---------- */
.config-section {
display: flex;
flex-direction: column;
gap: var(--ad-space-3);
}
.config-section-title {
font-size: var(--ad-text-m-size);
font-weight: var(--ad-text-m-weight);
color: var(--ad-text-1);
}
.auth-modes {
list-style: none;
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
padding: var(--ad-space-3);
margin: 0;
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
background: var(--ad-bg-1);
}
.auth-mode {
display: flex;
align-items: flex-start;
flex-wrap: wrap;
gap: var(--ad-space-2);
}
.auth-mode-name {
color: var(--ad-primary);
font-size: var(--ad-text-s-size);
white-space: nowrap;
}
.auth-mode-note {
flex: 1;
min-width: 0;
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.auth-mode-cmd {
color: var(--ad-text-3);
}
.config-advanced-toggle {
display: flex;
align-items: center;
gap: var(--ad-space-2);
padding: 0;
border: none;
background: none;
cursor: pointer;
text-align: left;
}
.advanced-badge {
display: inline-flex;
align-items: center;
height: 18px;
padding: 0 var(--ad-space-2);
border-radius: var(--ad-radius-s);
background: var(--ad-attention);
color: var(--ad-bg-0);
font-size: var(--ad-text-xs-size);
}
.advanced-chevron {
color: var(--ad-text-2);
transition: transform var(--ad-dur-fast) var(--ad-ease-out);
}
.advanced-chevron.open {
transform: rotate(180deg);
}
.advanced-hint {
color: var(--ad-text-3);
font-size: var(--ad-text-xs-size);
}
.advanced-fields {
display: flex;
flex-direction: column;
gap: var(--ad-space-5);
}
/* ============================================================
* Wave 2.2ʵʱ / Ȩ / һװ / عǼ
* ȫɫ tokens/
* ============================================================ */
/* ---------- ʧ̬˻װ/жص ---------- */
.run-failure {
flex-direction: column;
align-items: flex-start;
}
.run-failure-head {
display: flex;
align-items: flex-start;
gap: var(--ad-space-2);
}
.run-failure-action {
margin-top: var(--ad-space-2);
}
.run-failure-toggle {
align-self: flex-start;
}
.run-failure-raw {
width: 100%;
padding: var(--ad-space-3);
background: var(--ad-bg-0);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-s);
font-family: var(--ad-font-mono);
font-size: var(--ad-text-xs-size);
color: var(--ad-text-2);
white-space: pre-wrap;
word-break: break-all;
}
/* ---------- ȨAuthPanel ---------- */
.auth-mode-action {
height: 28px;
min-width: 0;
padding: 0 var(--ad-space-3);
margin-left: auto;
flex-shrink: 0;
}
.auth-flow {
display: flex;
flex-direction: column;
gap: var(--ad-space-4);
}
.auth-device {
display: flex;
flex-direction: column;
align-items: center;
gap: var(--ad-space-3);
padding: var(--ad-space-5);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
background: var(--ad-bg-1);
}
.auth-device-label {
color: var(--ad-text-2);
font-size: var(--ad-text-s-size);
}
.auth-device-code {
display: flex;
align-items: center;
gap: var(--ad-space-3);
}
.auth-device-code-text {
font-family: var(--ad-font-mono);
font-size: var(--ad-text-num-size);
letter-spacing: 0.12em;
color: var(--ad-primary);
}
.auth-copy {
height: 32px;
min-width: 0;
}
.auth-open {
text-decoration: none;
}
.auth-device-hint {
color: var(--ad-text-3);
font-size: var(--ad-text-xs-size);
}
.auth-status {
display: flex;
align-items: center;
gap: var(--ad-space-2);
font-size: var(--ad-text-s-size);
}
.auth-waiting {
display: inline-flex;
align-items: center;
gap: var(--ad-space-2);
color: var(--ad-attention);
}
.auth-done {
display: inline-flex;
align-items: center;
gap: var(--ad-space-2);
color: var(--ad-success);
}
.auth-failed {
display: inline-flex;
align-items: center;
gap: var(--ad-space-2);
color: var(--ad-danger);
}
.auth-log {
display: flex;
flex-direction: column;
gap: var(--ad-space-1);
max-height: 200px;
overflow-y: auto;
padding: var(--ad-space-3);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-s);
background: var(--ad-bg-0);
font-family: var(--ad-font-mono);
font-size: var(--ad-text-xs-size);
}
.auth-log-line {
color: var(--ad-text-2);
word-break: break-all;
white-space: pre-wrap;
}
.auth-log-line.waiting {
color: var(--ad-attention);
}
/* ---------- һװRuntimeInstallModal ---------- */
.runtime-install {
display: flex;
flex-direction: column;
gap: var(--ad-space-4);
}
.runtime-source,
.runtime-meta {
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
}
.runtime-url {
display: flex;
flex-direction: column;
gap: var(--ad-space-1);
}
.runtime-url-text {
font-family: var(--ad-font-mono);
font-size: var(--ad-text-xs-size);
color: var(--ad-text-2);
word-break: break-all;
}
.runtime-progress {
display: flex;
align-items: center;
}
.runtime-error {
display: flex;
align-items: flex-start;
gap: var(--ad-space-2);
padding: var(--ad-space-3);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
color: var(--ad-danger);
font-size: var(--ad-text-s-size);
}
.runtime-note {
color: var(--ad-text-3);
font-size: var(--ad-text-xs-size);
}
/* ---------- عǼWave 2.2 Req 4 ---------- */
.overview-skeleton {
padding: var(--ad-space-5);
background: var(--ad-bg-1);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-l);
}
.skeleton-notice {
display: flex;
align-items: center;
gap: var(--ad-space-2);
margin-bottom: var(--ad-space-4);
color: var(--ad-text-2);
font-size: var(--ad-text-m-size);
}
.skeleton-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: var(--ad-space-4);
}
.skeleton-card {
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
padding: var(--ad-space-4);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
}
.skeleton-rows {
display: flex;
flex-direction: column;
gap: var(--ad-space-3);
}
.skeleton-line {
height: 14px;
border-radius: 4px;
background: var(--ad-bg-3);
animation: ad-skeleton 1.4s var(--ad-ease-inout) infinite;
}
.skeleton-line.short {
width: 60%;
}
.skeleton-line.avatar {
width: 32px;
height: 32px;
border-radius: var(--ad-radius-m);
}
@keyframes ad-skeleton {
0%,
100% {
opacity: 0.4;
}
50% {
opacity: 0.9;
}
}
/* ---------- ȫϻ ---------- */
.diag-summary-all {
display: flex;
flex-direction: column;
gap: var(--ad-space-3);
}
.diag-report-group {
display: flex;
flex-direction: column;
gap: var(--ad-space-2);
padding: var(--ad-space-3);
border: 1px solid var(--ad-border);
border-radius: var(--ad-radius-m);
}
.diag-report-cli {
color: var(--ad-primary);
font-family: var(--ad-font-mono);
font-size: var(--ad-text-s-size);
}
.diag-finding-row {
display: flex;
align-items: flex-start;
gap: var(--ad-space-2);
}
.diag-finding-row-msg {
flex: 1;
min-width: 0;
color: var(--ad-text-1);
font-size: var(--ad-text-s-size);
line-height: 1.5;
}
/* ȫϻļֱǩɫ diag-sev-tag ɫ̵ֱ */
.diag-sev-label {
flex-shrink: 0;
font-size: var(--ad-text-xs-size);
}
.diag-sev-label.error {
color: var(--ad-danger);
}
.diag-sev-label.warn {
color: var(--ad-warning);
}
.diag-sev-label.info {
color: var(--ad-attention);
}