/* ============================================
   东微智能 · 企业AI运营平台
   设计语言：一线大厂企业级控制台风格
   浅灰工作区 + 深色侧边导航 + 科技蓝主色
   ============================================ */

:root {
  --primary: #1664ff;
  --primary-hover: #0e4fd1;
  --primary-light: #e8f0ff;
  --sidebar-bg: #151b26;
  --sidebar-hover: #1f2734;
  --sidebar-active: #2a3548;
  --body-bg: #f2f4f7;
  --card-bg: #ffffff;
  --text-primary: #1a2233;
  --text-secondary: #5e6b85;
  --text-muted: #9aa5b8;
  --border: #e4e8ef;
  --success: #00a870;
  --success-bg: #e3f9f0;
  --warning: #ff9800;
  --warning-bg: #fff5e6;
  --danger: #e34d59;
  --danger-bg: #fdecee;
  --radius: 6px;
  --shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.05);
  --shadow-md: 0 4px 12px rgba(16, 24, 40, 0.08);
  --shadow-lg: 0 8px 24px rgba(16, 24, 40, 0.12);
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', 'Segoe UI', sans-serif;
  background: var(--body-bg);
  color: var(--text-primary);
  font-size: 14px;
  -webkit-font-smoothing: antialiased;
}

.hidden { display: none !important; }

svg.icon {
  width: 18px;
  height: 18px;
  stroke: currentColor;
  stroke-width: 2;
  fill: none;
  stroke-linecap: round;
  stroke-linejoin: round;
  flex-shrink: 0;
  vertical-align: middle;
}

/* ============ 登录页 ============ */
.login-body {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  background:
    radial-gradient(ellipse 80% 60% at 70% -10%, rgba(22, 100, 255, 0.28), transparent),
    radial-gradient(ellipse 60% 50% at 10% 110%, rgba(22, 100, 255, 0.15), transparent),
    #0d1420;
  position: relative;
  overflow: hidden;
}

.login-body::before {
  content: '';
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255, 255, 255, 0.025) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, 0.025) 1px, transparent 1px);
  background-size: 48px 48px;
  pointer-events: none;
}

.login-card {
  position: relative;
  width: 420px;
  background: rgba(255, 255, 255, 0.98);
  border-radius: 12px;
  box-shadow: var(--shadow-lg);
  padding: 48px 44px 40px;
}

.login-brand {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 11px;
  margin-bottom: 24px;
}

.login-brand .product-mark {
  display: block;
  width: 38px;
  height: 38px;
}

.login-brand .brand-product-name {
  color: var(--text-primary);
  font-size: 22px;
  font-weight: 600;
  letter-spacing: 2px;
  line-height: 38px;
}

.form-group { margin-bottom: 18px; }

.form-group label {
  display: block;
  font-size: 13px;
  color: var(--text-secondary);
  margin-bottom: 7px;
}

.form-group input,
.form-group select,
.form-group textarea {
  width: 100%;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  font-size: 14px;
  color: var(--text-primary);
  outline: none;
  transition: border-color 0.15s, box-shadow 0.15s;
  font-family: inherit;
  background: #fff;
}

.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(22, 100, 255, 0.12);
}

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 9px 18px;
  border: 1px solid transparent;
  border-radius: var(--radius);
  font-size: 14px;
  cursor: pointer;
  transition: all 0.15s;
  font-family: inherit;
  white-space: nowrap;
}

.btn svg.icon { width: 15px; height: 15px; }

.btn-primary {
  background: var(--primary);
  color: #fff;
}
.btn-primary:hover { background: var(--primary-hover); }

.btn-secondary {
  background: #fff;
  color: var(--text-primary);
  border-color: var(--border);
}
.btn-secondary:hover { border-color: var(--primary); color: var(--primary); }

.btn-danger-ghost {
  background: transparent;
  color: var(--danger);
  border-color: transparent;
}
.btn-danger-ghost:hover { background: var(--danger-bg); }

.btn-block { width: 100%; padding: 11px; font-size: 15px; }

.btn:disabled { opacity: 0.55; cursor: not-allowed; }

.login-error {
  color: var(--danger);
  font-size: 13px;
  margin-bottom: 14px;
  min-height: 18px;
}

.login-footer {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  margin-top: 22px;
  padding-top: 18px;
  border-top: 1px solid var(--border);
  font-size: 10.5px;
  color: var(--text-muted);
}

.login-footer .brand-logo {
  display: block;
  width: 108px;
  height: auto;
  opacity: 0.82;
}

.login-footer .company-name {
  line-height: 1.45;
  white-space: nowrap;
}

.login-footer .company-name span {
  display: block;
  font-size: 9px;
  color: #b4bdcc;
}

/* ============ 工作台框架 ============ */
.app-layout {
  display: flex;
  height: 100vh;
  overflow: hidden;
}

.sidebar {
  width: 220px;
  background: var(--sidebar-bg);
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
}

.sidebar-brand {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 9px;
  min-height: 64px;
  padding: 14px 18px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.07);
}

.sidebar-brand .brand-product-name {
  color: rgba(255, 255, 255, 0.88);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 1.4px;
}

.sidebar-brand .product-mark {
  display: block;
  width: 32px;
  height: 32px;
  flex-shrink: 0;
}

.sidebar-nav {
  flex: 1;
  padding: 14px 10px;
  overflow-y: auto;
}

.nav-group-title {
  font-size: 11px;
  color: rgba(255, 255, 255, 0.35);
  padding: 14px 12px 6px;
  letter-spacing: 1px;
}

.nav-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  margin-bottom: 2px;
  border-radius: var(--radius);
  color: rgba(255, 255, 255, 0.72);
  cursor: pointer;
  transition: all 0.15s;
  position: relative;
  user-select: none;
}

.nav-item:hover {
  background: var(--sidebar-hover);
  color: #fff;
}

.nav-item.active {
  background: var(--sidebar-active);
  color: #fff;
}

.nav-item.active::before {
  content: '';
  position: absolute;
  left: -10px;
  top: 8px;
  bottom: 8px;
  width: 3px;
  border-radius: 2px;
  background: var(--primary);
}

.sidebar-footer {
  padding: 16px 14px;
  border-top: 1px solid rgba(255, 255, 255, 0.07);
  text-align: center;
  font-size: 9px;
  color: rgba(255, 255, 255, 0.3);
  line-height: 1.45;
}

.sidebar-footer .brand-logo {
  display: block;
  width: 108px;
  height: auto;
  margin: 0 auto 8px;
  opacity: 0.78;
}

.main-area {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.topbar {
  height: 56px;
  background: var(--card-bg);
  border-bottom: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 24px;
  flex-shrink: 0;
}

.topbar-title {
  font-size: 16px;
  font-weight: 600;
}

.topbar-right {
  display: flex;
  align-items: center;
  gap: 18px;
}

.topbar-user {
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--text-secondary);
  font-size: 13px;
}

.topbar-user .avatar {
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: var(--primary-light);
  color: var(--primary);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 13px;
  font-weight: 600;
}

.topbar-logout {
  display: flex;
  align-items: center;
  gap: 5px;
  color: var(--text-secondary);
  cursor: pointer;
  font-size: 13px;
  padding: 6px 10px;
  border-radius: var(--radius);
  transition: all 0.15s;
}

.topbar-logout:hover { background: var(--danger-bg); color: var(--danger); }

.content {
  flex: 1;
  overflow-y: auto;
  padding: 24px;
}

.content.no-padding { padding: 0; overflow: hidden; }

/* ============ 工作台页 ============ */
.welcome-banner {
  background: linear-gradient(120deg, #16233d 0%, #1c3a6e 55%, #1664ff 130%);
  border-radius: 10px;
  padding: 28px 32px;
  color: #fff;
  margin-bottom: 24px;
  position: relative;
  overflow: hidden;
}

.welcome-banner::after {
  content: '';
  position: absolute;
  right: -60px;
  top: -80px;
  width: 280px;
  height: 280px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 255, 255, 0.09), transparent 65%);
}

.welcome-banner h2 { font-size: 20px; font-weight: 600; margin-bottom: 8px; }
.welcome-banner p { font-size: 13px; color: rgba(255, 255, 255, 0.72); }

.stat-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 16px;
  margin-bottom: 24px;
}

.stat-card {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 18px 20px;
  display: flex;
  align-items: center;
  gap: 14px;
  box-shadow: var(--shadow-sm);
}

.stat-card .stat-icon {
  width: 42px;
  height: 42px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--primary-light);
  color: var(--primary);
}

.stat-card .stat-icon.green { background: var(--success-bg); color: var(--success); }
.stat-card .stat-icon.orange { background: var(--warning-bg); color: var(--warning); }

.stat-card .stat-value { font-size: 22px; font-weight: 700; line-height: 1.2; }
.stat-card .stat-label { font-size: 12px; color: var(--text-muted); margin-top: 2px; }

.section-title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 15px;
  font-weight: 600;
  margin: 4px 0 14px;
}

.section-title svg.icon { color: var(--primary); }

.module-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 16px;
}

.module-card {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 20px;
  cursor: pointer;
  transition: all 0.18s;
  box-shadow: var(--shadow-sm);
  position: relative;
}

.module-card:hover {
  border-color: var(--primary);
  box-shadow: var(--shadow-md);
  transform: translateY(-2px);
}

.module-card .module-head {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 12px;
}

.module-card .module-icon {
  width: 44px;
  height: 44px;
  border-radius: 9px;
  background: var(--primary-light);
  color: var(--primary);
  display: flex;
  align-items: center;
  justify-content: center;
}

.module-card .module-icon svg.icon { width: 22px; height: 22px; }

.module-card .module-name { font-size: 15px; font-weight: 600; }

.module-card .module-desc {
  font-size: 12.5px;
  color: var(--text-secondary);
  line-height: 1.6;
  min-height: 40px;
}

.module-card .module-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid var(--border);
}

.module-card.disabled { opacity: 0.55; cursor: not-allowed; }
.module-card.disabled:hover { transform: none; border-color: var(--border); box-shadow: var(--shadow-sm); }

.module-card.placeholder {
  border-style: dashed;
  cursor: default;
  background: transparent;
  box-shadow: none;
}
.module-card.placeholder:hover { transform: none; border-color: var(--text-muted); box-shadow: none; }
.module-card.placeholder .module-icon { background: #eceff4; color: var(--text-muted); }

.badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 11.5px;
  padding: 2px 9px;
  border-radius: 20px;
  white-space: nowrap;
}

.badge-success { background: var(--success-bg); color: var(--success); }
.badge-warning { background: var(--warning-bg); color: var(--warning); }
.badge-muted { background: #eceff4; color: var(--text-muted); }
.badge-danger { background: var(--danger-bg); color: var(--danger); }
.badge-primary { background: var(--primary-light); color: var(--primary); }

/* ============ 规划中模块（路线图预留位置） ============ */
/* 侧栏阶段徽章 */
.nav-item .nav-phase {
  margin-left: auto;
  font-size: 10px;
  line-height: 1;
  padding: 2px 6px;
  border-radius: 4px;
  background: rgba(255, 152, 0, 0.16);
  color: #ffb454;
  font-weight: 500;
}
.nav-item .nav-phase.far {
  background: rgba(255, 255, 255, 0.08);
  color: rgba(255, 255, 255, 0.4);
}

/* 规划中占位卡片可点击进入说明页 */
.module-card.placeholder { cursor: pointer; }
.module-card.placeholder:hover {
  transform: translateY(-2px);
  border-color: var(--warning);
  box-shadow: var(--shadow-sm);
}

/* 规划中说明页 */
.planned-hero {
  display: flex;
  align-items: flex-start;
  gap: 16px;
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-left: 3px solid var(--warning);
  border-radius: var(--radius);
  padding: 20px 22px;
  margin-bottom: 16px;
}
.planned-hero-icon {
  width: 48px;
  height: 48px;
  flex-shrink: 0;
  border-radius: 10px;
  background: var(--warning-bg);
  color: var(--warning);
  display: flex;
  align-items: center;
  justify-content: center;
}
.planned-hero-icon svg.icon { width: 24px; height: 24px; }
.planned-hero-titles {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 8px;
}
.planned-hero-titles h2 { font-size: 19px; font-weight: 600; }
.planned-hero-main p { font-size: 13px; color: var(--text-secondary); line-height: 1.6; }

.planned-panel { padding-bottom: 4px; }
.planned-features {
  list-style: none;
  padding: 4px 20px 8px;
}
.planned-feature {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 0;
  border-bottom: 1px solid var(--border);
}
.planned-feature:last-child { border-bottom: none; }
.planned-feature .badge { flex-shrink: 0; min-width: 54px; justify-content: center; }
.planned-feature-text { font-size: 13.5px; color: var(--text-primary); }
.planned-note {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 6px 20px 16px;
  padding: 10px 14px;
  background: var(--warning-bg);
  color: #9a6a00;
  border-radius: var(--radius);
  font-size: 12.5px;
  line-height: 1.5;
}
.planned-note svg.icon { flex-shrink: 0; color: var(--warning); }

.link-text {
  font-size: 12.5px;
  color: var(--primary);
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

/* ============ 模块运行视图（iframe 容器） ============ */
.module-view {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.module-view-bar {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 20px;
  background: var(--card-bg);
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}

.module-view-bar .mv-title {
  font-size: 14px;
  font-weight: 600;
  display: flex;
  align-items: center;
  gap: 8px;
}

.module-view-bar .spacer { flex: 1; }

.module-view iframe {
  flex: 1;
  width: 100%;
  border: none;
  background: #fff;
}

/* ============ 数据中心 ============ */
.source-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 16px;
}

.source-card {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 20px;
  box-shadow: var(--shadow-sm);
}

.source-card .source-head {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 10px;
}

.source-card .source-icon {
  width: 40px;
  height: 40px;
  border-radius: 8px;
  background: #eef1f6;
  color: var(--text-secondary);
  display: flex;
  align-items: center;
  justify-content: center;
}

.source-card.connected .source-icon { background: var(--success-bg); color: var(--success); }

.source-card .source-name { font-size: 14.5px; font-weight: 600; flex: 1; }

.source-card .source-desc {
  font-size: 12.5px;
  color: var(--text-secondary);
  line-height: 1.6;
  min-height: 38px;
}

.source-card .source-meta {
  margin-top: 10px;
  font-size: 11.5px;
  color: var(--text-muted);
}

.crm-sync-status {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 30px;
}

.crm-status-text {
  font-size: 12.5px;
  color: var(--text-secondary);
}

/* ============ AI 助手中心 ============ */
.btn-ghost {
  background: transparent;
  border: 1px solid transparent;
  color: var(--text-secondary);
  font-weight: 500;
}
.btn-ghost:hover { background: #f4f6fa; color: var(--text-primary); }

.ai-hub { max-width: 1080px; margin: 0 auto; }
.ai-hub-header { margin-bottom: 20px; }
.ai-hub-title {
  display: flex; align-items: center; gap: 8px;
  font-size: 20px; color: var(--text-primary); font-weight: 600;
}
.ai-hub-title svg.icon { width: 22px; height: 22px; color: var(--primary); }
.ai-hub-sub { font-size: 13px; color: var(--text-muted); margin-top: 6px; line-height: 1.6; }

.ai-hub-categories { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
.ai-hub-cat {
  padding: 6px 14px;
  font-size: 13px;
  color: var(--text-secondary);
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: 18px;
  cursor: pointer;
  transition: all 0.15s;
}
.ai-hub-cat:hover { border-color: var(--primary); color: var(--primary); }
.ai-hub-cat.active { background: var(--primary); border-color: var(--primary); color: #fff; }

.ai-hub-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 14px;
}
.ai-assistant-card {
  position: relative;
  display: flex; gap: 14px;
  padding: 18px;
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: 10px;
  cursor: pointer;
  transition: all 0.15s;
}
.ai-assistant-card:hover {
  border-color: var(--primary);
  box-shadow: 0 4px 14px rgba(22, 100, 255, 0.1);
  transform: translateY(-1px);
}
.ai-assistant-icon {
  width: 44px; height: 44px; flex-shrink: 0;
  border-radius: 10px;
  background: linear-gradient(135deg, #1664ff, #0e4fd1);
  color: #fff;
  display: flex; align-items: center; justify-content: center;
}
.ai-assistant-icon svg.icon { width: 22px; height: 22px; }
.ai-assistant-body { flex: 1; min-width: 0; }
.ai-assistant-name { font-size: 15px; font-weight: 600; color: var(--text-primary); margin-bottom: 4px; }
.ai-assistant-desc {
  font-size: 12.5px; color: var(--text-secondary); line-height: 1.5;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.ai-assistant-cat {
  position: absolute; top: 10px; right: 12px;
  font-size: 11px; color: var(--text-muted);
  background: #f4f6fa;
  padding: 2px 8px; border-radius: 10px;
}
.ai-hub-empty {
  grid-column: 1 / -1;
  text-align: center; padding: 50px 20px;
  color: var(--text-muted); font-size: 14px;
}
.ai-hub-empty svg.icon { width: 36px; height: 36px; display: block; margin: 0 auto 10px; opacity: 0.5; }

.ai-chat { height: 100%; display: flex; flex-direction: column; max-width: 920px; margin: 0 auto; width: 100%; }
.ai-chat-head {
  display: flex; align-items: center; gap: 16px;
  padding-bottom: 14px; margin-bottom: 4px;
  border-bottom: 1px solid var(--border);
}
.ai-chat-assistant {
  display: flex; align-items: center; gap: 8px;
  font-size: 15px; font-weight: 600; color: var(--text-primary);
}
.ai-chat-assistant svg.icon { width: 20px; height: 20px; color: var(--primary); }
.ai-chat .ai-layout { flex: 1; min-height: 0; }

/* ============ AI 助手 ============ */
.ai-layout {
  height: 100%;
  display: flex;
  flex-direction: column;
  max-width: 860px;
  margin: 0 auto;
  width: 100%;
}

.ai-messages {
  flex: 1;
  overflow-y: auto;
  padding: 8px 4px 16px;
}

.ai-msg {
  display: flex;
  gap: 12px;
  margin-bottom: 20px;
}

.ai-msg .msg-avatar {
  width: 34px;
  height: 34px;
  border-radius: 8px;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}

.ai-msg.user .msg-avatar { background: #eceff4; color: var(--text-secondary); }
.ai-msg.assistant .msg-avatar { background: linear-gradient(135deg, #1664ff, #0e4fd1); color: #fff; }

.ai-msg .msg-body {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 12px 16px;
  font-size: 14px;
  line-height: 1.7;
  white-space: pre-wrap;
  word-break: break-word;
  max-width: calc(100% - 60px);
  box-shadow: var(--shadow-sm);
}

.ai-msg.user .msg-body { background: var(--primary-light); border-color: transparent; }

.ai-empty {
  text-align: center;
  padding: 60px 20px 40px;
  color: var(--text-muted);
}

.ai-empty .ai-empty-icon {
  width: 64px;
  height: 64px;
  margin: 0 auto 16px;
  border-radius: 16px;
  background: linear-gradient(135deg, #1664ff, #0e4fd1);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
}

.ai-empty .ai-empty-icon svg.icon { width: 32px; height: 32px; }

.ai-empty h3 { color: var(--text-primary); font-size: 17px; margin-bottom: 8px; }
.ai-empty p { font-size: 13px; line-height: 1.7; }

.ai-suggestions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  justify-content: center;
  margin-top: 20px;
}

.ai-suggestion {
  padding: 8px 16px;
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: 20px;
  font-size: 13px;
  color: var(--text-secondary);
  cursor: pointer;
  transition: all 0.15s;
}

.ai-suggestion:hover { border-color: var(--primary); color: var(--primary); }

.ai-input-bar {
  display: flex;
  gap: 10px;
  padding: 14px 0 4px;
  flex-shrink: 0;
}

.ai-input-bar textarea {
  flex: 1;
  resize: none;
  padding: 11px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  font-size: 14px;
  font-family: inherit;
  outline: none;
  height: 46px;
  line-height: 1.5;
  transition: border-color 0.15s, box-shadow 0.15s;
}

.ai-input-bar textarea:focus {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(22, 100, 255, 0.12);
}

.typing-dots { display: inline-flex; gap: 4px; align-items: center; }
.typing-dots i {
  width: 6px; height: 6px; border-radius: 50%;
  background: var(--text-muted);
  animation: typing 1.2s infinite;
}
.typing-dots i:nth-child(2) { animation-delay: 0.2s; }
.typing-dots i:nth-child(3) { animation-delay: 0.4s; }
@keyframes typing { 0%, 60%, 100% { opacity: 0.3; } 30% { opacity: 1; } }

/* AI 工具调用指示器 */
.tk-ai-tool-indicator {
  display: flex; align-items: center; gap: 6px;
  font-size: 11px; color: var(--text-muted);
  padding: 4px 8px; margin-bottom: 8px;
  background: var(--bg-hover); border-radius: 4px;
}
.tk-ai-tool-indicator svg { width: 12px; height: 12px; opacity: 0.6; }

/* AI 回复 Markdown 渲染 */
.ai-msg.assistant .msg-body b { font-weight: 600; color: var(--text-primary); }
.ai-msg.assistant .msg-body ul { margin: 6px 0 6px 4px; padding-left: 16px; list-style: none; }
.ai-msg.assistant .msg-body li { position: relative; padding: 2px 0; line-height: 1.5; }
.ai-msg.assistant .msg-body li::before { content: ''; position: absolute; left: -12px; top: 10px; width: 4px; height: 4px; border-radius: 50%; background: var(--primary); }

/* ============ 系统管理 ============ */
.tabs {
  display: flex;
  gap: 4px;
  border-bottom: 1px solid var(--border);
  margin-bottom: 20px;
}

.tab {
  padding: 10px 18px;
  font-size: 14px;
  color: var(--text-secondary);
  cursor: pointer;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  transition: all 0.15s;
  display: flex;
  align-items: center;
  gap: 6px;
}

.tab:hover { color: var(--primary); }
.tab.active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 600; }

/* 审计日志筛选栏与分页 */
.audit-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 12px 20px;
  border-bottom: 1px solid var(--border);
}
.audit-filters select,
.audit-filters input {
  height: 34px;
  padding: 0 10px;
  border: 1px solid var(--border);
  border-radius: 6px;
  font-size: 13px;
  background: var(--card-bg);
  color: var(--text-primary);
}
.audit-filters input[type="text"] { flex: 1; min-width: 160px; }
.audit-pager {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 12px;
  padding: 12px 20px;
  font-size: 13px;
  color: var(--text-secondary);
}
.audit-detail { max-width: 360px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.panel {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  overflow-x: auto;
}

.panel-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 20px;
  border-bottom: 1px solid var(--border);
}

.panel-header h3 { font-size: 14.5px; font-weight: 600; }

.panel-body { padding: 20px; }

table.data-table {
  width: 100%;
  border-collapse: collapse;
}

table.data-table th {
  text-align: left;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--text-secondary);
  background: #f7f9fb;
  padding: 10px 16px;
  border-bottom: 1px solid var(--border);
  white-space: nowrap;
}

table.data-table td {
  padding: 12px 16px;
  border-bottom: 1px solid var(--border);
  font-size: 13.5px;
  vertical-align: middle;
}

table.data-table tr:last-child td { border-bottom: none; }
table.data-table tr:hover td { background: #f9fafc; }

.table-actions { display: flex; gap: 4px; }

.icon-btn {
  width: 30px;
  height: 30px;
  border: none;
  background: transparent;
  border-radius: var(--radius);
  color: var(--text-secondary);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: all 0.15s;
}

.icon-btn svg.icon { width: 15px; height: 15px; }
.icon-btn:hover { background: var(--primary-light); color: var(--primary); }
.icon-btn.danger:hover { background: var(--danger-bg); color: var(--danger); }

.form-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0 20px;
}

.form-grid .full { grid-column: 1 / -1; }

.form-hint { font-size: 12px; color: var(--text-muted); margin-top: 5px; line-height: 1.5; }

/* ============ 弹窗 ============ */
.modal-mask {
  position: fixed;
  inset: 0;
  background: rgba(13, 20, 32, 0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
}

.modal {
  background: #fff;
  border-radius: 10px;
  width: 480px;
  max-width: calc(100vw - 40px);
  max-height: calc(100vh - 80px);
  display: flex;
  flex-direction: column;
  box-shadow: var(--shadow-lg);
  animation: modalIn 0.18s ease;
}

@keyframes modalIn {
  from { opacity: 0; transform: translateY(12px) scale(0.98); }
  to { opacity: 1; transform: none; }
}

.modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 22px;
  border-bottom: 1px solid var(--border);
}

.modal-header h3 { font-size: 15px; font-weight: 600; }

.modal-close {
  border: none;
  background: transparent;
  cursor: pointer;
  color: var(--text-muted);
  font-size: 20px;
  line-height: 1;
  padding: 2px 6px;
  border-radius: 4px;
}
.modal-close:hover { background: #f0f2f5; color: var(--text-primary); }

.modal-body { padding: 22px; overflow-y: auto; }

.modal-footer {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  padding: 14px 22px;
  border-top: 1px solid var(--border);
}

/* ============ Toast ============ */
.toast {
  position: fixed;
  top: 24px;
  left: 50%;
  transform: translateX(-50%);
  background: #fff;
  border: 1px solid var(--border);
  box-shadow: var(--shadow-md);
  border-radius: var(--radius);
  padding: 10px 20px;
  font-size: 13.5px;
  z-index: 2000;
  display: flex;
  align-items: center;
  gap: 8px;
  animation: toastIn 0.2s ease;
}

@keyframes toastIn {
  from { opacity: 0; transform: translate(-50%, -8px); }
  to { opacity: 1; transform: translate(-50%, 0); }
}

.toast.success { border-left: 3px solid var(--success); }
.toast.error { border-left: 3px solid var(--danger); }
.toast.info { border-left: 3px solid var(--primary); }

/* ============ 空状态 ============ */
.empty-state {
  text-align: center;
  padding: 48px 20px;
  color: var(--text-muted);
  font-size: 13px;
}

/* 滚动条 */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-thumb { background: #cdd4de; border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: #b3bcc9; }
::-webkit-scrollbar-track { background: transparent; }

/* ============ 智能工单 AI 看板 ============ */
.tk-layout {
  display: flex;
  height: 100%;
  overflow: hidden;
}

.tk-main {
  flex: 1;
  min-width: 0;
  overflow-y: auto;
  padding: 20px 24px 32px;
}

.tk-toolbar {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 16px;
}
.tk-toolbar .spacer { flex: 1; }

.tk-toolbar-title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 16px;
  font-weight: 600;
  white-space: nowrap;
}
@media (max-width: 1360px) {
  .tk-toolbar-title .tk-subtitle { display: none; }
}
.tk-toolbar-title svg.icon { color: var(--primary); }
.tk-toolbar-title .tk-subtitle {
  font-size: 12px;
  font-weight: 400;
  color: var(--text-muted);
  margin-left: 6px;
}

.tk-range {
  display: inline-flex;
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
}
.tk-range button {
  border: none;
  background: transparent;
  padding: 7px 14px;
  font-size: 12.5px;
  color: var(--text-secondary);
  cursor: pointer;
  border-right: 1px solid var(--border);
  white-space: nowrap;
}
.tk-range button:last-child { border-right: none; }
.tk-range button:hover { color: var(--primary); }
.tk-range button.active {
  background: var(--primary-light);
  color: var(--primary);
  font-weight: 600;
}

.tk-loading {
  grid-column: 1 / -1;
  padding: 40px;
  text-align: center;
  color: var(--text-muted);
  font-size: 13px;
}

/* KPI 下方预计算顾问诊断（区别于右侧 AI 对话顾问） */
.tk-diagnosis {
  border: 1px solid var(--border);
  border-top: 4px solid #17375e;
  border-radius: var(--radius);
  background: var(--card-bg);
  padding: 16px;
  margin-bottom: 14px;
  box-shadow: var(--shadow-sm);
}
.tk-diagnosis-head { display: flex; gap: 12px; align-items: flex-start; padding-bottom: 12px; border-bottom: 1px solid var(--border); }
.tk-diagnosis-head > span { display: inline-flex; width: 30px; height: 30px; align-items: center; justify-content: center; background: #17375e; color: #fff; }
.tk-diagnosis-head svg { width: 17px; height: 17px; }
.tk-diagnosis-head b { font-size: 16px; }
.tk-diagnosis-head p { margin: 5px 0 0; color: var(--text-muted); font-size: 12.5px; }
.tk-diagnosis-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 12px; }
.tk-diagnosis-card { border: 1px solid var(--border); border-left: 4px solid #4d7fc1; padding: 13px 15px; background: var(--card-bg); }
.tk-diagnosis-card.level-danger { border-left-color: #cf202b; }
.tk-diagnosis-card.level-high { border-left-color: #aa7a00; }
.tk-diagnosis-card.level-medium { border-left-color: #3f76bd; }
.tk-diagnosis-card-head { display: flex; justify-content: space-between; gap: 10px; align-items: flex-start; }
.tk-diagnosis-card-head b { font-size: 13.5px; }
.tk-diagnosis-card-head span { color: #fff; background: #3f76bd; border-radius: 3px; padding: 2px 9px; font-size: 11px; flex-shrink: 0; }
.level-danger .tk-diagnosis-card-head span { background: #cf202b; }
.level-high .tk-diagnosis-card-head span { background: #aa7a00; }
.tk-diagnosis-card p { color: var(--text-secondary); line-height: 1.65; font-size: 12.5px; margin: 9px 0; }
.tk-diagnosis-advice { border-top: 1px dashed var(--border); padding-top: 8px; color: var(--text-secondary); font-size: 12px; line-height: 1.6; }
.tk-diagnosis-advice b { color: #17375e; }
@media (max-width: 1100px) { .tk-diagnosis-grid { grid-template-columns: 1fr; } }

/* 经营健康诊断 */
.tk-health {
  display: grid;
  grid-template-columns: repeat(5, minmax(150px, 1fr));
  gap: 10px;
  margin: 10px 0 16px;
}
.tk-health-card {
  display: flex;
  gap: 10px;
  padding: 13px;
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-top: 3px solid var(--text-muted);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
}
.tk-health-card.tone-good { border-top-color: #1baf7a; }
.tk-health-card.tone-warn { border-top-color: #eda100; }
.tk-health-card.tone-risk { border-top-color: #e34d59; }
.tk-health-icon { color: var(--primary); padding-top: 2px; }
.tk-health-icon svg { width: 18px; height: 18px; }
.tk-health-card span, .tk-health-card small { display: block; color: var(--text-muted); font-size: 11px; }
.tk-health-card b { display: block; font-size: 21px; line-height: 1.35; color: var(--text-primary); }
.tk-health-card small { line-height: 1.4; }
@media (max-width: 1400px) { .tk-health { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 900px) { .tk-health { grid-template-columns: 1fr 1fr; } }

/* 业务线专题页签 */
.tk-analysis-tabs { display: flex; gap: 6px; margin: 4px 0 14px; border-bottom: 1px solid var(--border); }
.tk-analysis-tabs button { display: inline-flex; align-items: center; gap: 6px; border: none; border-bottom: 2px solid transparent; background: transparent; padding: 9px 15px; color: var(--text-secondary); cursor: pointer; font-size: 13px; }
.tk-analysis-tabs button svg { width: 15px; height: 15px; }
.tk-analysis-tabs button.active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 600; }
.tk-segment { margin-bottom: 18px; padding: 16px; background: linear-gradient(180deg, var(--primary-light), transparent 180px); border: 1px solid var(--border); border-radius: var(--radius); }
.tk-segment-title { display: flex; align-items: center; gap: 9px; margin-bottom: 12px; }
.tk-segment-title i { width: 4px; height: 18px; border-radius: 2px; }
.tk-segment-title span { color: var(--text-muted); font-size: 11.5px; }
.tk-segment-hero { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 12px; }
.tk-segment-hero > div { padding: 13px 15px; background: var(--card-bg); border: 1px solid var(--border); border-radius: var(--radius); }
.tk-segment-hero span, .tk-segment-hero small { display: block; font-size: 11.5px; color: var(--text-muted); }
.tk-segment-hero b { display: block; font-size: 20px; line-height: 1.45; }
.tk-segment-hero b.danger { color: var(--danger); }
.tk-segment-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.tk-mini-rank { display: grid; grid-template-columns: 135px 1fr 70px; gap: 10px; align-items: center; min-height: 30px; font-size: 12px; }
.tk-mini-rank > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tk-mini-rank > div { height: 10px; background: #edf0f5; border-radius: 3px; overflow: hidden; }
.tk-mini-rank i { display: block; height: 100%; border-radius: 3px; min-width: 2px; }
.tk-mini-rank b { text-align: right; }
.tk-keywords { display: flex; flex-wrap: wrap; gap: 8px; }
.tk-keywords > span { padding: 6px 10px; background: var(--primary-light); color: var(--primary); border-radius: 16px; font-size: 12px; }
.tk-keywords > span b { margin-left: 4px; }
.tk-eff-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 10px; }
.tk-eff-panel .panel-header { align-items: flex-start; }
.tk-sample-rule { font-size: 10.5px; color: var(--text-muted); }
.tk-eff-block { padding: 0 12px 12px; }
.tk-eff-block + .tk-eff-block { border-top: 1px dashed var(--border); padding-top: 10px; }
.tk-eff-block h4 { margin: 0 0 8px; font-size: 12px; color: var(--text-secondary); }
.tk-eff-table { font-size: 11.5px; }
.tk-eff-table th, .tk-eff-table td { padding: 7px 8px; white-space: nowrap; }
.tk-eff-table td:first-child { min-width: 105px; }
.tk-eff-table small { color: var(--text-muted); }
.tk-rank-no { display: inline-flex; width: 18px; height: 18px; align-items: center; justify-content: center; border-radius: 50%; margin-right: 6px; font-size: 10px; }
.tk-rank-no.top { background: #e3f9f0; color: #087a58; }
.tk-rank-no.bottom { background: #fff0f1; color: #c7333e; }
@media (max-width: 1100px) { .tk-segment-hero { grid-template-columns: 1fr 1fr; } .tk-segment-grid { grid-template-columns: 1fr; } }
@media (max-width: 1400px) { .tk-eff-grid { grid-template-columns: 1fr; } }

/* 三大资源效率分析 */
.tk-resource-stack { display: flex; flex-direction: column; gap: 16px; }
.tk-resource-section { background: var(--card-bg); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px; box-shadow: var(--shadow-sm); }
.tk-resource-section-head { display: flex; justify-content: space-between; gap: 16px; align-items: flex-start; margin-bottom: 12px; }
.tk-resource-section-head h3 { margin: 0; font-size: 16px; color: var(--text-primary); }
.tk-resource-section-head p { margin: 5px 0 0; color: var(--text-muted); font-size: 12px; line-height: 1.5; }
.tk-resource-tabs { display: inline-flex; border: 1px solid var(--border); border-radius: 5px; overflow: hidden; flex-shrink: 0; }
.tk-resource-tab { border: none; border-right: 1px solid var(--border); padding: 6px 13px; background: var(--card-bg); color: var(--text-secondary); cursor: pointer; font-size: 12px; }
.tk-resource-tab:last-child { border-right: none; }
.tk-resource-tab.active { background: var(--primary); color: #fff; }
.tk-resource-summary { display: flex; align-items: center; flex-wrap: wrap; gap: 18px; padding: 10px 12px; background: var(--body-bg); border-radius: 5px; color: var(--text-secondary); font-size: 12px; }
.tk-resource-summary b { color: var(--text-primary); margin-left: 4px; }
.tk-resource-summary small { color: var(--text-muted); margin-left: auto; }
.tk-resource-diagnosis { margin: 10px 0; padding: 12px; border-left: 4px solid #aa7a00; background: #fffbef; }
.tk-resource-diagnosis h4 { margin: 0 0 8px; color: #7e5a00; font-size: 13px; }
.tk-resource-alert { display: inline-flex; gap: 7px; margin: 3px 7px 3px 0; padding: 5px 8px; background: #fff; border: 1px solid #ead9a0; border-radius: 4px; font-size: 11.5px; }
.tk-resource-alert span { color: var(--text-muted); }
.tk-resource-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.tk-resource-table-panel { min-width: 0; }
.tk-resource-table { font-size: 11px; }
.tk-resource-table th, .tk-resource-table td { padding: 7px 8px; white-space: nowrap; }
.tk-resource-table td:first-child { min-width: 115px; }
.tk-resource-table td:first-child small { display: block; color: var(--text-muted); margin-top: 3px; max-width: 240px; overflow: hidden; text-overflow: ellipsis; }
.tk-audit-section { border-top: 4px solid #17375e; }
.tk-audit-note { padding: 9px 11px; margin-bottom: 10px; background: var(--primary-light); color: var(--text-secondary); font-size: 12px; border-radius: 4px; }
@media (max-width: 1450px) { .tk-resource-grid { grid-template-columns: 1fr; } }
@media (max-width: 900px) { .tk-resource-section-head { flex-direction: column; } .tk-resource-summary small { margin-left: 0; width: 100%; } }

/* 售前商机、调试/售后产品问题关联分析 */
.tk-linked-analysis { margin-top: 12px; padding: 16px; background: var(--card-bg); border: 1px solid var(--border); border-top: 4px solid #17375e; border-radius: var(--radius); box-shadow: var(--shadow-sm); }
.tk-linked-head { display: flex; justify-content: space-between; gap: 16px; align-items: flex-start; margin-bottom: 12px; }
.tk-linked-head h3 { margin: 0; font-size: 16px; }
.tk-linked-head p { margin: 5px 0 0; color: var(--text-muted); font-size: 12px; }
.tk-linked-head > span { padding: 4px 9px; background: var(--primary-light); color: var(--primary); border-radius: 4px; font-size: 11.5px; white-space: nowrap; }
.tk-linked-kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 10px; }
.tk-linked-kpis > div { padding: 12px 14px; background: var(--body-bg); border: 1px solid var(--border); border-radius: 5px; }
.tk-linked-kpis span, .tk-linked-kpis small { display: block; color: var(--text-muted); font-size: 11.5px; }
.tk-linked-kpis b { display: block; font-size: 20px; line-height: 1.45; }
.tk-linked-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.tk-linked-grid > :first-child { grid-row: span 2; }
.tk-linked-grid-2 > :first-child { grid-row: auto; }
.tk-linked-table { font-size: 11.5px; }
.tk-linked-table th, .tk-linked-table td { padding: 7px 8px; white-space: nowrap; }
.tk-linked-table td:first-child small, .tk-linked-table td:nth-child(2) small { display: block; color: var(--text-muted); max-width: 280px; overflow: hidden; text-overflow: ellipsis; }
@media (max-width: 1300px) { .tk-linked-grid { grid-template-columns: 1fr; } .tk-linked-grid > :first-child { grid-row: auto; } }
@media (max-width: 900px) { .tk-linked-kpis { grid-template-columns: 1fr 1fr; } .tk-linked-head { flex-direction: column; } }

/* 区域业务结构 */
.tk-region-head, .tk-region-row {
  display: grid;
  grid-template-columns: 120px minmax(240px, 1fr) 90px;
  gap: 12px;
  align-items: center;
}
.tk-region-head { color: var(--text-muted); font-size: 11px; padding-bottom: 8px; border-bottom: 1px solid var(--border); }
.tk-region-head span:last-child { text-align: right; }
.tk-region-row { min-height: 32px; font-size: 12.5px; }
.tk-region-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tk-region-scale { display: flex; height: 13px; border-radius: 4px; overflow: hidden; min-width: 8px; }
.tk-region-scale i { display: block; height: 100%; }
.tk-region-row > b { text-align: right; font-size: 12px; }

/* KPI 行 */
.tk-kpis {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 12px;
  margin-bottom: 16px;
}
.tk-kpi { padding: 16px; }
.tk-kpi .stat-icon.red { background: var(--danger-bg); color: var(--danger); }
.tk-kpi-sub { font-size: 11.5px; color: var(--text-muted); margin-top: 4px; }

/* 图表面板 */
.tk-grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-bottom: 12px;
}
@media (max-width: 1200px) {
  .tk-grid-2 { grid-template-columns: 1fr; }
}
.tk-panel .panel-header h3 {
  display: flex;
  align-items: center;
  gap: 7px;
}
.tk-panel .panel-header h3 svg.icon { width: 16px; height: 16px; color: var(--primary); }

.tk-chart { padding: 12px 16px 16px; }
.tk-chart svg { width: 100%; height: auto; display: block; }
.tk-chart text.tk-axis { font-size: 11px; fill: var(--text-muted); }
.tk-chart text.tk-bar-label { font-size: 10.5px; fill: var(--text-secondary); }
.tk-chart svg rect, .tk-chart svg path { cursor: default; }
.tk-chart svg rect:hover, .tk-donut path:hover { opacity: 0.85; }

.tk-legend {
  display: flex;
  gap: 16px;
  margin-bottom: 6px;
  flex-wrap: wrap;
}
.tk-legend-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--text-secondary);
}
.tk-legend-item i {
  width: 10px;
  height: 10px;
  border-radius: 3px;
  display: inline-block;
}

/* 类型结构 */
.tk-type-layout {
  display: flex;
  gap: 20px;
  align-items: center;
}
.tk-donut { width: 190px; flex-shrink: 0; }
.tk-donut-num { font-size: 26px; font-weight: 700; fill: var(--text-primary); }
.tk-donut-sub { font-size: 12px; fill: var(--text-muted); }
.tk-type-detail { flex: 1; min-width: 0; }
.tk-type-head { font-size: 11.5px; color: var(--text-muted); margin-bottom: 10px; }
.tk-type-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 0;
  border-bottom: 1px dashed var(--border);
  font-size: 13px;
}
.tk-type-row:last-child { border-bottom: none; }
.tk-type-row .tk-legend-item { width: 92px; flex-shrink: 0; }
.tk-type-row b { min-width: 44px; text-align: right; }
.tk-type-meta { color: var(--text-muted); font-size: 12px; min-width: 64px; }
.tk-mini-bar {
  flex: 1;
  height: 6px;
  background: #eceff4;
  border-radius: 3px;
  overflow: hidden;
}
.tk-mini-bar i { display: block; height: 100%; border-radius: 3px; }

/* 横向条形列表（部门 / 项目） */
.tk-hbar-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 7px 0;
}
.tk-hbar-name {
  width: 170px;
  flex-shrink: 0;
  font-size: 12.5px;
  color: var(--text-secondary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.tk-hbar-track {
  flex: 1;
  height: 14px;
  background: #f0f2f6;
  border-radius: 4px;
  overflow: hidden;
}
.tk-hbar-track i {
  display: block;
  height: 100%;
  border-radius: 4px;
  background: #2a78d6;
  min-width: 3px;
}
.tk-hbar-val {
  width: 130px;
  flex-shrink: 0;
  font-size: 12.5px;
  font-weight: 600;
  display: flex;
  align-items: center;
  gap: 6px;
}
.tk-hbar-val span { color: var(--text-muted); font-weight: 400; }
.tk-overdue-flag {
  font-size: 11px;
  color: var(--danger);
  background: var(--danger-bg);
  padding: 1px 6px;
  border-radius: 3px;
  font-weight: 500;
}

/* 顾问洞察 */
.tk-risks {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
  gap: 12px;
}
.tk-risk-card {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-left: 4px solid var(--text-muted);
  border-radius: var(--radius);
  padding: 14px 16px;
  box-shadow: var(--shadow-sm);
}
.tk-risk-card.sev-high { border-left-color: #d03b3b; }
.tk-risk-card.sev-mid { border-left-color: #ec835a; }
.tk-risk-card.sev-low { border-left-color: #fab219; }
.tk-risk-head {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13.5px;
  margin-bottom: 8px;
}
.tk-risk-sev {
  font-size: 11px;
  font-weight: 700;
  padding: 1px 7px;
  border-radius: 3px;
  color: #fff;
  background: var(--text-muted);
  flex-shrink: 0;
}
.sev-high .tk-risk-sev { background: #d03b3b; }
.sev-mid .tk-risk-sev { background: #ec835a; }
.sev-low .tk-risk-sev { background: #d99a00; }
.tk-risk-cat {
  font-size: 11px;
  color: var(--primary);
  background: var(--primary-light);
  padding: 1px 7px;
  border-radius: 3px;
  flex-shrink: 0;
}
.tk-risk-detail {
  font-size: 12.5px;
  color: var(--text-secondary);
  line-height: 1.7;
}
.tk-risk-ask {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  margin-top: 10px;
  font-size: 12px;
  color: var(--primary);
  cursor: pointer;
}
.tk-risk-ask svg.icon { width: 13px; height: 13px; }
.tk-risk-ask:hover { text-decoration: underline; }

/* 人员贡献表 */
.tk-people-count { font-size: 12px; font-weight: 400; color: var(--text-muted); margin-left: 6px; }

.tk-role-tabs {
  display: inline-flex;
  gap: 4px;
}
.tk-role-tabs button {
  border: 1px solid var(--border);
  background: var(--card-bg);
  border-radius: 20px;
  padding: 4px 14px;
  font-size: 12px;
  color: var(--text-secondary);
  cursor: pointer;
}
.tk-role-tabs button:hover { color: var(--primary); border-color: var(--primary); }
.tk-role-tabs button.active {
  background: var(--primary);
  border-color: var(--primary);
  color: #fff;
}
.tk-table-wrap { overflow-x: auto; }
#tkPeopleTable th.sortable { cursor: pointer; user-select: none; white-space: nowrap; }
#tkPeopleTable th.sortable:hover { color: var(--primary); }
#tkPeopleTable th.sorted { color: var(--primary); }
#tkPeopleTable td { white-space: nowrap; }
.tk-dept { max-width: 180px; overflow: hidden; text-overflow: ellipsis; }
.tk-zero { color: var(--text-muted); }
.tk-ok { color: var(--text-muted); }
.tk-flags .badge { margin-right: 4px; cursor: help; }
.tk-role {
  font-size: 11.5px;
  padding: 2px 8px;
  border-radius: 3px;
  white-space: nowrap;
}
.tk-role-sales { background: var(--primary-light); color: var(--primary); }
.tk-role-presales { background: #e3f9f0; color: #0a8f66; }
.tk-role-tech { background: #fff5e6; color: #b26a00; }
.tk-table-hint {
  padding: 10px 16px;
  font-size: 11.5px;
  color: var(--text-muted);
  border-top: 1px solid var(--border);
}

/* 悬浮提示 */
.tk-tooltip {
  position: fixed;
  z-index: 9999;
  display: none;
  background: rgba(21, 27, 38, 0.94);
  color: #fff;
  font-size: 12px;
  line-height: 1.6;
  padding: 8px 11px;
  border-radius: 6px;
  max-width: 320px;
  pointer-events: none;
  box-shadow: var(--shadow-lg);
}
.tk-tooltip b { color: #fff; }

/* AI 数据顾问侧栏 */
.tk-ai {
  width: 340px;
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  background: var(--card-bg);
  border-left: 1px solid var(--border);
  transition: width 0.25s ease;
  overflow: hidden;
}
.tk-ai.collapsed { width: 46px; }
.tk-ai.collapsed .tk-ai-body,
.tk-ai.collapsed .tk-ai-title { display: none; }
.tk-ai.collapsed .tk-ai-header { padding: 12px 6px; justify-content: center; }
.tk-ai-header {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px 14px;
  border-bottom: 1px solid var(--border);
  font-size: 14px;
  font-weight: 600;
  min-height: 47px;
}
.tk-ai-title { display: inline-flex; align-items: center; gap: 8px; white-space: nowrap; }
.tk-ai-header svg.icon { color: var(--primary); }
.tk-ai-header .icon-btn svg.icon { color: var(--text-secondary); }
.tk-ai-header .spacer { flex: 1; }
.tk-ai-body {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 0;
}
.tk-ai-messages {
  flex: 1;
  overflow-y: auto;
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.tk-ai-messages .ai-msg .msg-body { font-size: 12.5px; }
.tk-ai-empty {
  text-align: center;
  padding: 24px 10px;
  color: var(--text-secondary);
  font-size: 12.5px;
  line-height: 1.7;
}
.tk-ai-empty .ai-empty-icon { margin: 0 auto 12px; }
.tk-ai-suggestions {
  margin-top: 14px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.tk-ai-suggestion {
  border: 1px solid var(--border);
  border-radius: 6px;
  padding: 8px 10px;
  font-size: 12px;
  color: var(--text-secondary);
  cursor: pointer;
  text-align: left;
  background: var(--body-bg);
}
.tk-ai-suggestion:hover {
  border-color: var(--primary);
  color: var(--primary);
  background: var(--primary-light);
}
.tk-ai-input {
  display: flex;
  gap: 8px;
  padding: 12px;
  border-top: 1px solid var(--border);
  align-items: flex-end;
}
.tk-ai-input textarea {
  flex: 1;
  resize: none;
  height: 60px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 8px 10px;
  font-size: 12.5px;
  font-family: inherit;
  outline: none;
}
.tk-ai-input textarea:focus { border-color: var(--primary); }
.tk-ai-input .btn { padding: 8px 12px; }

@media (max-width: 1000px) {
  .tk-ai { position: absolute; right: 0; top: 0; bottom: 0; box-shadow: var(--shadow-lg); z-index: 20; }
  .tk-layout { position: relative; }
}

/* ============ 商务助理 · 项目报备查重 ============ */
.bs-data-asof { font-size: 12px; color: var(--text-muted); }
.stat-card .bs-stat-time { font-size: 18px; white-space: nowrap; }

/* 查重结论卡 */
.bs-conclusion {
  display: flex;
  gap: 14px;
  align-items: flex-start;
  padding: 16px 20px;
  margin-top: 16px;
  border-radius: var(--radius);
  border: 1px solid var(--border);
  background: var(--card-bg);
  box-shadow: var(--shadow-sm);
}
.bs-conclusion b { font-size: 15px; }
.bs-conclusion p { margin: 5px 0 0; font-size: 13px; color: var(--text-secondary); line-height: 1.7; }
.bs-conclusion-icon {
  display: inline-flex;
  width: 36px;
  height: 36px;
  border-radius: 8px;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.bs-conclusion-icon svg { width: 19px; height: 19px; }
.bs-conclusion.duplicate { border-color: #f3c2c8; }
.bs-conclusion.duplicate .bs-conclusion-icon { background: var(--danger-bg); color: var(--danger); }
.bs-conclusion.duplicate b { color: var(--danger); }
.bs-conclusion.suspect { border-color: #f5ddb0; }
.bs-conclusion.suspect .bs-conclusion-icon { background: var(--warning-bg); color: var(--warning); }
.bs-conclusion.suspect b { color: #b26a00; }
.bs-conclusion.clear .bs-conclusion-icon { background: var(--success-bg); color: var(--success); }
.bs-conclusion.clear b { color: var(--success); }

.bs-ai-note {
  margin-top: 10px;
  padding: 9px 14px;
  font-size: 12.5px;
  color: #8a6d1a;
  background: var(--warning-bg);
  border-radius: var(--radius);
}

/* 候选对比卡 */
.bs-candidate {
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-left: 4px solid var(--border);
  border-radius: var(--radius);
  padding: 14px 18px;
  margin-bottom: 10px;
  box-shadow: var(--shadow-sm);
}
.bs-candidate.duplicate { border-left-color: var(--danger); }
.bs-candidate.suspect { border-left-color: var(--warning); }
.bs-candidate.distinct { border-left-color: var(--success); }
.bs-candidate-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.bs-candidate-head b { font-size: 14px; }
.bs-candidate-head .spacer { flex: 1; }
.bs-candidate-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 18px;
  margin-top: 9px;
  font-size: 12.5px;
  color: var(--text-secondary);
}
.bs-candidate-meta i { font-style: normal; color: var(--text-muted); margin-right: 5px; }
.bs-candidate-reason {
  display: flex;
  gap: 8px;
  align-items: flex-start;
  margin-top: 10px;
  padding: 9px 12px;
  font-size: 12.5px;
  line-height: 1.7;
  color: var(--text-primary);
  background: var(--primary-light);
  border-radius: var(--radius);
}
.bs-candidate-reason svg.icon { width: 14px; height: 14px; color: var(--primary); flex-shrink: 0; margin-top: 3px; }
.bs-candidate-flags { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 9px; }

/* 待审报备清单 */
.bs-pending-bar { display: flex; align-items: center; gap: 10px; margin: 4px 0 14px; flex-wrap: wrap; }
.bs-pending-filters { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.bs-seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.bs-seg button { border: none; background: var(--card-bg); padding: 6px 14px; font-size: 12.5px; color: var(--text-secondary); cursor: pointer; }
.bs-seg button.active { background: var(--primary); color: #fff; }
.bs-chip { display: inline-flex; align-items: center; gap: 5px; border: 1px solid var(--border); background: var(--card-bg); border-radius: 16px; padding: 5px 12px; font-size: 12.5px; color: var(--text-secondary); cursor: pointer; }
.bs-chip b { font-weight: 700; color: var(--text-primary); }
.bs-chip.active { border-color: var(--primary); color: var(--primary); background: var(--primary-light); }
.bs-chip.danger.active { border-color: var(--danger); color: var(--danger); background: var(--danger-bg); }
.bs-chip.warning.active { border-color: #d18b12; color: #b26a00; background: var(--warning-bg); }
.bs-chip.success.active { border-color: var(--success); color: var(--success); background: var(--success-bg); }
.bs-warming-tag { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--text-muted); }
.bs-warming-tag svg { width: 13px; height: 13px; animation: bs-spin 1.1s linear infinite; }
@keyframes bs-spin { to { transform: rotate(360deg); } }

.bs-pending-card { background: var(--card-bg); border: 1px solid var(--border); border-left: 4px solid var(--border); border-radius: var(--radius); padding: 14px 18px; margin-bottom: 10px; box-shadow: var(--shadow-sm); }
.bs-pending-card.clear { border-left-color: var(--success); }
.bs-pending-card.suspect { border-left-color: var(--warning); }
.bs-pending-card.duplicate { border-left-color: var(--danger); }
.bs-pending-main { display: flex; gap: 12px; align-items: flex-start; }
.bs-pending-icon { display: inline-flex; width: 30px; height: 30px; border-radius: 7px; align-items: center; justify-content: center; flex-shrink: 0; background: var(--body-bg); color: var(--text-muted); }
.bs-pending-card.clear .bs-pending-icon { background: var(--success-bg); color: var(--success); }
.bs-pending-card.suspect .bs-pending-icon { background: var(--warning-bg); color: #b26a00; }
.bs-pending-card.duplicate .bs-pending-icon { background: var(--danger-bg); color: var(--danger); }
.bs-pending-icon svg { width: 17px; height: 17px; }
.bs-pending-body { flex: 1; min-width: 0; }
.bs-pending-title { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.bs-pending-title b { font-size: 14.5px; }
.bs-pending-meta { display: flex; flex-wrap: wrap; gap: 3px 16px; margin-top: 6px; font-size: 12.5px; color: var(--text-secondary); }
.bs-pending-hint { margin-top: 8px; font-size: 13px; color: var(--text-primary); line-height: 1.6; }
.bs-pending-contacts { margin-top: 8px; font-size: 12.5px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.bs-pending-contacts i { font-style: normal; color: var(--text-muted); }
.bs-contact { display: inline-flex; align-items: center; gap: 4px; padding: 3px 9px; border-radius: 14px; background: var(--warning-bg); color: #8a5a00; }
.bs-contact svg { width: 12px; height: 12px; }
.bs-contact i { font-style: normal; opacity: .7; margin-left: 2px; }
.bs-pending-foot { display: flex; align-items: center; gap: 12px; margin-top: 12px; padding-top: 10px; border-top: 1px dashed var(--border); flex-wrap: wrap; }
.bs-pending-foot .spacer { flex: 1; }
.bs-pending-nocand { font-size: 12px; color: var(--text-muted); }
.bs-pending-cands { margin-top: 12px; }
.bs-mark-done { display: inline-flex; align-items: center; gap: 5px; font-size: 12.5px; color: var(--success); }
.bs-mark-done svg { width: 14px; height: 14px; }
.btn-link { border: none; background: transparent; cursor: pointer; font-size: 12.5px; color: var(--primary); display: inline-flex; align-items: center; gap: 4px; padding: 2px 4px; }
.btn-link svg { width: 14px; height: 14px; }
.btn-link.ok { color: var(--success); }
.btn-link.danger { color: var(--danger); }
.bs-pending-empty { display: flex; align-items: center; gap: 8px; justify-content: center; padding: 40px; color: var(--text-muted); font-size: 13px; }
.bs-pending-empty svg { width: 18px; height: 18px; color: var(--success); }
.bs-pending-pager { display: flex; align-items: center; justify-content: center; gap: 14px; margin-top: 14px; font-size: 12.5px; color: var(--text-secondary); }

/* ============ 用户模块权限 ============ */
.perm-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px 14px;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--body-bg);
}
.perm-item {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 13px;
  color: var(--text-primary);
  cursor: pointer;
  user-select: none;
}
.perm-item input { width: 15px; height: 15px; cursor: pointer; }
.user-perms { font-size: 11.5px; color: var(--text-muted); margin-top: 4px; line-height: 1.5; max-width: 260px; }
.user-perms-none { color: var(--warning); }

/* ============ 商务助理 · 数据同步状态 ============ */
.bs-sync { font-size: 12.5px; color: var(--text-secondary); margin-right: 4px; white-space: nowrap; }
.bs-sync-info b { color: var(--text-primary); font-weight: 600; }
.bs-sync-badge { padding: 1px 7px; border-radius: 10px; font-size: 11px; margin-left: 3px; }
.bs-sync-badge.ok { background: var(--success-bg); color: var(--success); }
.bs-sync-badge.fail { background: var(--danger-bg); color: var(--danger); }
.bs-sync-running { display: inline-flex; align-items: center; gap: 5px; color: var(--primary); font-weight: 500; }
.bs-sync-running svg.icon { width: 13px; height: 13px; animation: bs-spin 1s linear infinite; }
@keyframes bs-spin { to { transform: rotate(360deg); } }

/* ============ 产品数据 · 平台内置模块 ============ */
.pd-page {
  height: 100%;
  overflow-y: auto;
  padding: 20px 24px 32px;
}
.pd-toolbar { margin-bottom: 12px; }
.pd-warehouse-state .badge svg { width: 13px; height: 13px; }
.pd-warehouse-state .badge-warning svg { animation: bs-spin 1s linear infinite; }
.pd-kpis { grid-template-columns: repeat(4, minmax(180px, 1fr)); margin-bottom: 14px; }
.pd-kpis .stat-card { min-height: 82px; }
.stat-icon.purple { background: #f3e8ff; color: #7c3aed; }
.pd-sync-value { font-size: 18px !important; }
.pd-view-tabs { margin-top: 0; }
.pd-panel { padding: 0; overflow: hidden; }
.pd-panel > .tab-bar { padding: 0 18px; }
.pd-panel > .action-bar,
.pd-panel > .search-bar { margin-left: 18px; margin-right: 18px; }

.pd-search-bar {
  display: grid;
  grid-template-columns: repeat(5, minmax(130px, 1fr)) auto;
  gap: 10px;
  align-items: end;
  padding: 14px;
  margin-bottom: 12px;
  background: var(--body-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
}
.pd-search-field label {
  display: block;
  margin-bottom: 5px;
  color: var(--text-muted);
  font-size: 11.5px;
}
.pd-search-field input,
.pd-search-field select {
  width: 100%;
  height: 34px;
  padding: 0 10px;
  color: var(--text-primary);
  background: var(--card-bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  outline: none;
}
.pd-search-field input:focus,
.pd-search-field select:focus { border-color: var(--primary); box-shadow: 0 0 0 2px rgba(22,100,255,.08); }

.tab-bar {
  display: flex;
  gap: 4px;
  overflow-x: auto;
  border-bottom: 1px solid var(--border);
  margin-bottom: 14px;
}
.tab-item {
  flex-shrink: 0;
  padding: 11px 14px 9px;
  color: var(--text-secondary);
  font-size: 12.5px;
  border-bottom: 2px solid transparent;
  cursor: pointer;
}
.tab-item:hover { color: var(--primary); }
.tab-item.active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 600; }

.pd-action-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 12px;
}
.pd-action-bar .spacer { flex: 1; }
.pd-action-divider { width: 1px; height: 22px; background: var(--border); margin: 0 2px; }
.sync-time { margin-left: auto; color: var(--text-muted); font-size: 11.5px; }
.edit-mode-badge { padding: 4px 9px; color: var(--warning); background: var(--warning-bg); border-radius: var(--radius); font-size: 11.5px; }

.pd-table-wrap { width: 100%; max-height: calc(100vh - 360px); overflow: auto; border-top: 1px solid var(--border); }
.pd-data-table { min-width: 1760px; font-size: 12px; }
.pd-data-table th { position: sticky; top: 0; z-index: 5; background: #f7f9fc; }
.pd-data-table th,
.pd-data-table td { padding: 8px 10px; word-break: break-word; vertical-align: middle; }
.pd-data-table .product-img { width: 52px; height: 52px; object-fit: contain; border: 1px solid var(--border); border-radius: var(--radius); cursor: pointer; background: #fff; }

.tree-node-row { background: #f7f9fc; font-weight: 600; cursor: pointer; user-select: none; }
.tree-node-row:hover { background: #eef3fb !important; }
.tree-node-row.tab-group-row { background: #f3f6ff; border-left: 3px solid var(--primary); }
.tree-node-row.selected { background: var(--primary-light) !important; box-shadow: inset 3px 0 var(--primary); }
.tree-node-cell { color: var(--text-primary); border-bottom: 1px solid var(--border) !important; }
.tree-node-cell .tree-toggle { display: inline-flex; width: 20px; color: var(--text-muted); vertical-align: middle; }
.tree-node-cell .tree-name { color: #24436f; font-size: 13px; }
.tree-node-cell .tree-badge { display: inline-block; margin-left: 7px; padding: 1px 7px; color: var(--primary); background: var(--primary-light); border-radius: 10px; font-size: 10.5px; }
.tree-icon { width: 14px !important; height: 14px !important; }
.tree-product-row { background: #fff; }
.tree-bundle-row { background: #eff6ff; }
.tree-bundle-row td { color: #2563eb; border-top: 1px dashed #bfdbfe; }
.tree-node-row.dragging { opacity: .45; }
.tree-node-row.drag-over-above { box-shadow: inset 0 3px var(--primary); }
.tree-node-row.drag-over-below { box-shadow: inset 0 -3px var(--primary); }
body.edit-order-mode .tree-node-cell[draggable="true"] { cursor: move; }

.modal-overlay {
  position: fixed;
  inset: 0;
  z-index: 2200;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(13,20,32,.55);
  backdrop-filter: blur(2px);
}
.pd-image-modal { width: auto; max-width: 86vw; }
.pd-image-modal #previewImage { display: block; max-width: 80vw; max-height: 72vh; object-fit: contain; }
.pd-column-modal { width: 560px; }
.pd-small-modal { width: 440px; }
.pd-add-path-modal { width: 600px; }
.modal-tip { margin-bottom: 14px; color: var(--text-muted); font-size: 12.5px; }
.column-list { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 16px; }
.column-list.pd-single-column { grid-template-columns: 1fr; }
.column-item { display: flex; align-items: center; gap: 8px; padding: 7px 9px; border-radius: var(--radius); cursor: pointer; }
.column-item:hover { background: var(--body-bg); }
.category-path-tree { max-height: 360px; overflow: auto; padding: 12px; background: var(--body-bg); border: 1px solid var(--border); border-radius: var(--radius); }
.category-path-tree ul { list-style: none; }
.category-path-tree ul ul { margin-left: 9px; padding-left: 14px; border-left: 1px dashed var(--border); }
.category-path-tree li { margin: 4px 0; }
.pd-selected-path { margin-top: 10px; padding: 9px 12px; color: var(--primary); background: var(--primary-light); border-radius: var(--radius); }

.loading-mask { position: fixed; inset: 0; z-index: 3000; display: flex; align-items: center; justify-content: center; background: rgba(13,20,32,.45); }
.loading-box { display: flex; align-items: center; gap: 12px; min-width: 260px; padding: 20px 24px; background: var(--card-bg); border-radius: var(--radius); box-shadow: var(--shadow-lg); }
.loading-spinner,
.loading { display: inline-block; width: 18px; height: 18px; border: 2px solid var(--border); border-top-color: var(--primary); border-radius: 50%; animation: bs-spin .8s linear infinite; }
.loading-text { color: var(--text-primary); font-size: 13px; }

@media (max-width: 1250px) {
  .pd-search-bar { grid-template-columns: repeat(3, minmax(130px, 1fr)); }
  .pd-kpis { grid-template-columns: repeat(2, 1fr); }
}
