/* ============================================================
 * nexus-all.css —— GENERATED by build_all.py, 请勿手改
 * 事实源: css/ 下 CSS_FILES 按加载顺序的确定性拼接, 单请求直达;
 * 新增样式文件须登记 CSS_FILES 并重建
 * ============================================================ */

/* ===== nexus-tokens.css ===== */
:root {
  --app-accent: #6366f1;
  --app-accent-rgb: 99, 102, 241;
  --app-accent-hover: #818cf8;
  --app-accent-contrast: #ffffff;
  --app-name: "App";
}

:root {
  --nx-bg-base: #f8fafc;
  --nx-bg-surface: #ffffff;
  --nx-bg-elevated: #ffffff;
  --nx-bg-hover: #f1f5f9;
  --nx-bg-muted: #f1f5f9;

  --nx-border: rgba(0, 0, 0, 0.08);
  --nx-border-hover: rgba(0, 0, 0, 0.15);
  --nx-border-accent: rgba(var(--app-accent-rgb), 0.3);

  --nx-text-heading: #0f172a;
  --nx-text-body: #334155;
  --nx-text-secondary: #64748b;
  --nx-text-muted: #94a3b8;
  --nx-text-accent: var(--app-accent-strong, var(--app-accent));
  --nx-text-on-accent: var(--app-accent-contrast, #ffffff);

  --nx-primary: var(--app-accent, #6366f1);

  --nx-success: #10b981;
  --nx-warning: #f59e0b;
  --nx-danger: #ef4444;
  --nx-info: #3b82f6;

  --nx-success-rgb: 16, 185, 129;
  --nx-warning-rgb: 245, 158, 11;
  --nx-danger-rgb: 239, 68, 68;
  --nx-info-rgb: 59, 130, 246;

  --nx-overlay-bg: rgba(0, 0, 0, 0.5);

  --nx-glass-bg: rgba(255, 255, 255, 0.7);
  --nx-glass-blur: 16px;
  --nx-glass-border: rgba(0, 0, 0, 0.06);

  --nx-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);
  --nx-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.1);
  --nx-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.12);
  --nx-shadow-glow: 0 0 20px rgba(var(--app-accent-rgb), 0.15);

  /* 组件消费令牌（与暗色块同名同义，浅色取值） */
  --nx-bg-card: var(--nx-bg-surface);
  --nx-bg-page: var(--nx-bg-base);
  --nx-bg-secondary: var(--nx-bg-elevated);
  --nx-bg-tertiary: #f1f5f9;
  --nx-bg-subtle: rgba(0, 0, 0, 0.04);
  --nx-bg-code: #f1f5f9;
  --nx-surface: var(--nx-bg-surface);
  --nx-border-strong: rgba(0, 0, 0, 0.18);
  --nx-accent: var(--nx-primary);
  --nx-accent-hover: var(--app-accent-hover);
  --nx-accent-soft: rgba(var(--app-accent-rgb), 0.12);
  --nx-color-primary: var(--nx-primary);
  --nx-color-primary-strong: var(--app-accent-hover);
  --nx-color-danger: var(--nx-danger);
  --nx-primary-soft: rgba(var(--app-accent-rgb), 0.12);
  --nx-text: var(--nx-text-body);
  --nx-text-primary: var(--nx-text-heading);
  --nx-text-strong: #0f172a;
  --nx-text-tertiary: var(--nx-text-secondary);
  --nx-warning-soft: rgba(245, 158, 11, 0.12);
  --nx-warning-text: var(--nx-warning);
  --nx-chat-kb-bg: var(--nx-bg-elevated);
  --nx-switch-track: #d5dce6;
  --nx-undo-bg: #475569;
  --nx-undo-btn-bg: #ffffff;
}

:root {
  --nx-space-1: 0.25rem;
  --nx-space-2: 0.5rem;
  --nx-space-3: 0.75rem;
  --nx-space-4: 1rem;
  --nx-space-5: 1.25rem;
  --nx-space-6: 1.5rem;
  --nx-space-8: 2rem;
  --nx-space-10: 2.5rem;
  --nx-space-12: 3rem;
}

:root {
  --nx-radius-sm: 6px;
  --nx-radius-md: 10px;
  --nx-radius-lg: 16px;
  --nx-radius-xl: 24px;
  --nx-radius-full: 9999px;
}

:root {
  --nx-font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
  --nx-font-mono: "JetBrains Mono", "Fira Code", "Cascadia Code", monospace;
  --nx-text-xs: 0.75rem;
  --nx-text-sm: 0.875rem;
  --nx-text-base: 0.9375rem;
  --nx-text-lg: 1.125rem;
  --nx-text-xl: 1.25rem;
  --nx-text-2xl: 1.5rem;
  --nx-text-3xl: 1.875rem;
  --nx-leading: 1.6;
}

:root {
  --nx-ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --nx-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
  --nx-ease-in: cubic-bezier(0.4, 0, 1, 1);
  --nx-transition-fast: 150ms var(--nx-ease-out);
  --nx-transition-base: 200ms var(--nx-ease-out);
  --nx-transition-slow: 300ms var(--nx-ease-in-out);
}

:root {
  /* 布局骨架（nexus-layout.css 消费；宿主可覆盖 --nxs-header-h 调整顶栏高度） */
  --nxs-header-h: 56px;
}

/*
 * 层级阶梯（由低到高）。约束：
 * - 弹层（modal 200）之下的触发器（trigger/hamburger/popover）：模态打开时页面交互被遮罩接管；
 * - 导航抽屉（drawer 999）刻意置顶于 modal/settings——移动端导航抽屉是最高优先级交互面，
 *   且 modal/settings 的触发器都在 header（100），抽屉打开期间不可达，二者不会叠加。
 * - toast-host(1100) / unlock(1150) / topmost(1200) 永远在最上层。
 */
:root {
  --nx-z-nav: 90;
  --nx-z-fab: 99;
  --nx-z-header: 100;
  --nx-z-side-mask: 110;
  --nx-z-side-panel: 120;
  --nx-z-trigger: 150;
  --nx-z-hamburger: 150;
  --nx-z-popover: 180;
  --nx-z-modal: 200;
  --nx-z-toast: 300;
  --nx-z-settings: 400;
  --nx-z-settings-panel: 401;
  --nx-z-overlay: 998;
  --nx-z-drawer: 999;
  --nx-z-toast-host: 1100;
  --nx-z-unlock: 1150;
  --nx-z-topmost: 1200;
  --nx-z-float: 1500;
  --nx-z-float-panel: 1600;
  --nx-z-max: 2147483000;
  --nx-z-max-plus: 2147483001;
}

:root {
  --nx-safe-top: env(safe-area-inset-top, 0px);
  --nx-safe-bottom: env(safe-area-inset-bottom, 0px);
  --nx-safe-left: env(safe-area-inset-left, 0px);
  --nx-safe-right: env(safe-area-inset-right, 0px);
}

[data-theme="dark"] {
  --nx-bg-base: #1e293b;
  --nx-bg-surface: #243044;
  --nx-bg-elevated: #2a3848;
  --nx-bg-hover: #334155;
  --nx-bg-muted: #2a3848;
  --nx-border: rgba(255, 255, 255, 0.08);
  --nx-border-hover: rgba(255, 255, 255, 0.15);
  --nx-text-heading: #f1f5f9;
  --nx-text-body: #cbd5e1;
  --nx-text-secondary: #94a3b8;
  --nx-text-muted: #7a8a9e;
  --nx-text-on-accent: var(--app-accent-contrast, #ffffff);
  --nx-primary: var(--app-accent, #6366f1);
  --nx-success: #34d399;
  --nx-warning: #fbbf24;
  --nx-danger: #f87171;
  --nx-info: #60a5fa;
  --nx-success-rgb: 52, 211, 153;
  --nx-warning-rgb: 251, 191, 36;
  --nx-danger-rgb: 248, 113, 113;
  --nx-info-rgb: 96, 165, 250;
  --nx-overlay-bg: rgba(30, 41, 59, 0.75);
  --nx-glass-bg: rgba(36, 48, 68, 0.7);
  --nx-glass-border: rgba(255, 255, 255, 0.08);
  --nx-shadow-sm: 0 2px 8px rgba(30, 41, 59, 0.25);
  --nx-shadow-md: 0 4px 16px rgba(30, 41, 59, 0.35);
  --nx-shadow-lg: 0 8px 32px rgba(30, 41, 59, 0.45);
  /* 组件消费但暗色块缺失的色彩令牌补齐（fallback 为浅色，暗色下会白底割裂） */
  --nx-bg-card: var(--nx-bg-surface);
  --nx-bg-page: var(--nx-bg-base);
  --nx-bg-secondary: var(--nx-bg-elevated);
  --nx-bg-tertiary: #334155;
  --nx-bg-subtle: rgba(255, 255, 255, 0.06);
  --nx-bg-code: #16202f;
  --nx-surface: var(--nx-bg-surface);
  --nx-border-strong: rgba(255, 255, 255, 0.18);
  --nx-accent: var(--nx-primary);
  --nx-accent-hover: var(--app-accent-hover);
  --nx-accent-soft: rgba(var(--app-accent-rgb), 0.18);
  --nx-color-primary: var(--nx-primary);
  --nx-color-primary-strong: var(--nx-primary);
  --nx-color-danger: var(--nx-danger);
  --nx-primary-soft: rgba(var(--app-accent-rgb), 0.18);
  --nx-text: var(--nx-text-body);
  --nx-text-primary: var(--nx-text-heading);
  --nx-text-strong: #f8fafc;
  --nx-text-tertiary: var(--nx-text-secondary);
  --nx-text-accent: var(--app-accent-strong, var(--app-accent));
  --nx-warning-soft: rgba(251, 191, 36, 0.15);
  --nx-warning-text: var(--nx-warning);
  --nx-chat-kb-bg: var(--nx-bg-elevated);
  --nx-switch-track: #3b4a5f;
  --nx-undo-bg: #64748b;
  --nx-undo-btn-bg: #ffffff;
}

/*
 * ===== 主题派生令牌 · body 级解析层 =====
 * 下列令牌引用 --app-accent*，而主题类挂载在 body（或宿主在 :root 内联覆盖）。
 * CSS 自定义属性的 var() 在「定义该属性的元素」上完成替换：若只在 :root/[data-theme] 层定义，
 * 解析时永远取到 :root 默认靛紫，body 主题类无法传导（soft/hover/glow 会整体跑成默认色）。
 * 故统一在 body 层重定义，使其随 body 上的主题类/内联覆盖一同解析。
 * 优先级：:root body (0,1,1) > :root (0,1,0)；[data-theme="dark"] body (0,2,1) 压过暗色块。
 */
:root body {
  --nx-primary: var(--app-accent, #6366f1);
  --nx-accent: var(--nx-primary);
  --nx-accent-hover: var(--app-accent-hover);
  --nx-accent-soft: rgba(var(--app-accent-rgb), 0.12);
  --nx-primary-soft: rgba(var(--app-accent-rgb), 0.12);
  --nx-text-accent: var(--app-accent-strong, var(--app-accent));
  --nx-text-on-accent: var(--app-accent-contrast, #ffffff);
  --nx-border-accent: rgba(var(--app-accent-rgb), 0.3);
  --nx-shadow-glow: 0 0 20px rgba(var(--app-accent-rgb), 0.15);
  --nx-color-primary: var(--nx-primary);
  --nx-color-primary-strong: var(--app-accent-hover);
}
[data-theme="dark"] body {
  --nx-accent-soft: rgba(var(--app-accent-rgb), 0.18);
  --nx-primary-soft: rgba(var(--app-accent-rgb), 0.18);
}

/* ===== nexus-base.css ===== */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

html {
  font-size: 16px;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

body {
  font-family: var(--nx-font-sans);
  font-size: var(--nx-text-base);
  line-height: var(--nx-leading);
  color: var(--nx-text-body);
  background: var(--nx-bg-base);
  min-height: 100vh;
  min-height: 100dvh;
  min-height: 100dvh;
}

a { color: var(--app-accent); text-decoration: none; transition: color var(--nx-transition-fast); }
a:hover { color: var(--app-accent-hover); }

.nx-card {
  background: var(--nx-glass-bg);
  backdrop-filter: blur(var(--nx-glass-blur));
  -webkit-backdrop-filter: blur(var(--nx-glass-blur));
  border: 1px solid var(--nx-glass-border);
  border-radius: var(--nx-radius-lg);
  padding: var(--nx-space-6);
  transition: border-color var(--nx-transition-base), box-shadow var(--nx-transition-base);
}
.nx-card:hover {
  border-color: var(--nx-border-hover);
  box-shadow: var(--nx-shadow-md);
}

.nx-nav {
  position: sticky;
  top: 0;
  z-index: var(--nx-z-header);
  display: flex;
  align-items: center;
  gap: var(--nx-space-6);
  padding: 0 var(--nx-space-6);
  padding-top: var(--nx-safe-top, 0px);
  height: calc(56px + var(--nx-safe-top, 0px));
  background: var(--nx-glass-bg);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border-bottom: 1px solid var(--nx-border);
}

.nx-sidebar {
  width: 240px;
  min-height: calc(100vh - 56px);
  min-height: calc(100dvh - 56px);
  background: var(--nx-bg-surface);
  border-right: 1px solid var(--nx-border);
  padding: var(--nx-space-4) 0;
  flex-shrink: 0;
}
.nx-sidebar-item {
  display: flex;
  align-items: center;
  gap: var(--nx-space-3);
  padding: var(--nx-space-2) var(--nx-space-5);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-muted);
  cursor: pointer;
  transition: all var(--nx-transition-fast);
  border-left: 2px solid transparent;
}
.nx-sidebar-item:hover { color: var(--nx-text-body); background: var(--nx-bg-hover); }
.nx-sidebar-item.active {
  color: var(--app-accent);
  background: rgba(var(--app-accent-rgb), 0.08);
  border-left-color: var(--app-accent);
}

.nx-bg-gradient {
  position: fixed;
  inset: 0;
  z-index: -1;
  background:
    radial-gradient(ellipse at 20% 0%, rgba(var(--app-accent-rgb), 0.08) 0%, transparent 50%),
    radial-gradient(ellipse at 80% 100%, rgba(var(--app-accent-rgb), 0.04) 0%, transparent 50%),
    var(--nx-bg-base);
}@media (max-width: 768px){
  .nx-sidebar { display: none; }
  .nx-card { padding: var(--nx-space-4); }
  .nx-nav { padding: 0 var(--nx-space-4); }
}

.el-menu { background: var(--nx-bg-surface) !important; border-right: 1px solid var(--nx-border) !important; }
.el-menu-item { color: var(--nx-text-body) !important; }
.el-menu-item:hover { background: var(--nx-bg-hover) !important; color: var(--nx-text-heading) !important; }
.el-menu-item.is-active { color: var(--app-accent) !important; }
.el-card { background: var(--nx-bg-surface) !important; border-color: var(--nx-border) !important; color: var(--nx-text-body) !important; border-radius: var(--nx-radius-md) !important; }
.el-button { border-radius: var(--nx-radius-sm) !important; }
.el-button--primary { background: var(--app-accent) !important; border-color: var(--app-accent) !important; }
.el-button--primary:hover, .el-button--primary:focus { background: var(--app-accent-hover) !important; border-color: var(--app-accent-hover) !important; }
.el-button--danger { background: var(--nx-danger) !important; border-color: var(--nx-danger) !important; }
.el-input__wrapper { border-radius: var(--nx-radius-sm) !important; }
.el-input__wrapper.is-focus { box-shadow: 0 0 0 1px var(--app-accent) inset !important; }
.el-table { background: var(--nx-bg-surface) !important; --el-table-bg-color: var(--nx-bg-surface) !important; --el-table-tr-bg-color: var(--nx-bg-surface) !important; --el-table-header-bg-color: var(--nx-bg-elevated) !important; --el-table-row-hover-bg-color: var(--nx-bg-hover) !important; --el-table-border-color: var(--nx-border) !important; --el-table-text-color: var(--nx-text-body) !important; --el-table-header-text-color: var(--nx-text-secondary) !important; }
.el-dialog { background: var(--nx-bg-elevated) !important; border-radius: var(--nx-radius-lg) !important; box-shadow: var(--nx-shadow-lg) !important; }
.el-dialog__title { color: var(--nx-text-heading) !important; }
.el-overlay { background: var(--nx-overlay-bg) !important; }
.el-form-item__label { color: var(--nx-text-body) !important; }
.el-pagination { --el-pagination-bg-color: var(--nx-bg-surface) !important; --el-pagination-text-color: var(--nx-text-body) !important; --el-pagination-button-bg-color: var(--nx-bg-hover) !important; }
.el-drawer { background: var(--nx-bg-elevated) !important; }
.el-drawer__header { color: var(--nx-text-heading) !important; }

/* ===== Element Plus 反馈件与 nexus 反馈层视觉对齐（双轨制应用的零改造收口） ===== */

/* ElMessage 对齐 .nux-toast-item：同圆角/阴影/字号/语义色 */
.el-message {
  border-radius: var(--nx-radius-md) !important;
  box-shadow: var(--nx-shadow-md) !important;
  background: var(--nx-bg-elevated) !important;
  border: 1px solid var(--nx-border) !important;
  color: var(--nx-text-body) !important;
  font-size: var(--nx-text-sm) !important;
}
.el-message .el-message__content { color: var(--nx-text-body) !important; }
.el-message--success { --el-message-bg-color: var(--nx-bg-elevated); }
.el-message--success .el-message__icon, .el-message--success .el-message__content { color: var(--nx-success) !important; }
.el-message--warning .el-message__icon, .el-message--warning .el-message__content { color: var(--nx-warning) !important; }
.el-message--error .el-message__icon, .el-message--error .el-message__content { color: var(--nx-danger) !important; }
.el-message--info .el-message__icon, .el-message--info .el-message__content { color: var(--nx-text-secondary) !important; }

/* ElMessageBox / ElNotification 对齐 nux-modal 视觉 */
.el-message-box { border-radius: var(--nx-radius-lg) !important; background: var(--nx-bg-elevated) !important; border: 1px solid var(--nx-border) !important; box-shadow: var(--nx-shadow-lg) !important; }
.el-message-box__title { color: var(--nx-text-heading) !important; }
.el-message-box__message { color: var(--nx-text-secondary) !important; }
.el-notification { border-radius: var(--nx-radius-md) !important; background: var(--nx-bg-elevated) !important; border: 1px solid var(--nx-border) !important; box-shadow: var(--nx-shadow-md) !important; }
.el-notification__title { color: var(--nx-text-heading) !important; }
.el-notification__content { color: var(--nx-text-secondary) !important; }

/* v-loading spinner 用主题色 */
.el-loading-spinner .circular .path { stroke: var(--app-accent) !important; }
.el-loading-spinner .el-loading-text { color: var(--nx-text-secondary) !important; }

/* el-empty 描述文字对齐 nux-empty-state 层级 */
.el-empty__description p { color: var(--nx-text-secondary) !important; }

/* ElMessage 图标色（图标元素本身继承 type class 的场景） */
.el-message .el-message__badge, .el-message__icon { background: transparent !important; }

/* ===== 可访问性质量地板（全端生效） ===== */
:focus-visible {
  outline: 2px solid rgba(var(--app-accent-rgb, 99, 102, 241), 0.6);
  outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ===== nexus-motion.css ===== */
/* =========================================================
   nexus-motion.css — 全局交互动效层
   统一按压/抬升微交互、入场 reveal、焦点与 reduced-motion 收敛。
   遵循"增强而非覆盖"：只补充缺失动效，不改动既有设计令牌。
   ========================================================= */

/* ---- 一、统一按压微交互 ---- */
/* 通用可点元素按压反馈（克制，仅轻微） */
.nx-sidebar-item:active,
.nux-acc-head:active,
.nux-tab:active,
.nux-chip:active:not(.nux-chip--disabled) { transform: scale(0.97); }

/* ---- 二、统一卡片/可交互容器抬升 ---- */
.nx-card {
  will-change: transform;
}
.nx-card:hover {
  transform: translateY(-2px);
}

/* 列表项抬升（各应用通用 .nx-list-item / 卡片式 grid 项） */
.nx-list-item { transition: transform var(--nx-transition-fast), box-shadow var(--nx-transition-fast), background var(--nx-transition-fast); }
.nx-list-item:hover { transform: translateY(-1px); }

/* 列表进出场（配 Vue TransitionGroup 使用，替代各应用手写列表 keyframes） */
.nux-list-enter-active {
  transition: opacity var(--nx-transition-base), transform var(--nx-transition-base);
  transition-delay: var(--nx-stagger-delay, 0s);
}
.nux-list-leave-active {
  transition: opacity var(--nx-transition-fast), transform var(--nx-transition-fast);
  position: absolute;
}
.nux-list-enter-from,
.nux-list-leave-to { opacity: 0; transform: translateY(8px); }
.nux-list-move { transition: transform var(--nx-transition-base); }

/* ---- 四、统一焦点可见性（所有应用一致） ---- */
:where(.nx-sidebar-item, .nux-btn, .nux-tab, .nux-chip,
       .nux-acc-head, .nux-segmented-item, .nx-list-item):focus-visible {
  outline: 2px solid rgba(var(--app-accent-rgb), 0.6);
  outline-offset: 2px;
}

/* ---- 五、降级动效与触屏适配（全局收敛，一处管理） ---- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
}

/* 触屏/无 hover：关闭抬升类位移，避免"残留悬浮"感 */
@media (hover: none) and (pointer: coarse) {
  .nx-card:hover,
.nx-list-item:hover,
.nx-sidebar-item:hover { transform: none; }
}

/* 桌面保留过渡的平滑感 */
@media (prefers-reduced-motion: no-preference) {
  .nx-card,
.nx-sidebar-item,
.nx-list-item {
    transition: transform var(--nx-transition-fast), box-shadow var(--nx-transition-fast),
                border-color var(--nx-transition-fast), background var(--nx-transition-fast);
  }
}

/* ===== nexus-themes.css ===== */
/*
 * Nexus Design System — 应用特色色配置 v2.3
 *
 * 配色原则（参考 Linear/Vercel/Notion/Figma 2025 设计趋势 + Radix 色阶实践 + Refactoring UI 色阶方法论）：
 * 1. 每个产品必须有视觉可区分的独特主色
 * 2. AI产品避免蓝紫泛滥，用暖色/绿色/青色差异化
 * 3. 金融/数据类用冷色传达专业感
 * 4. 教育/创意类用暖色传达活力感
 * 5. 开发工具用中性冷色传达技术感
 * 6. 主色需在浅色/深色模式下都可用（WCAG 实测线，2026-10 全 27 套达标）：
 *    - 浅色用 600 档：白字对比 ≥3.0（大字/图形线），多数达 4.5（正文线）
 *    - 文字级强调一律用 --app-accent-strong（同色相 700 档，白底 ≥4.5 正文 AA）
 *    - 暗色用同色相 400 档提亮（暗底 ≥4.5），hover/strong 进到 300 档
 *    - 黄色/琥珀系提亮后白字对比不足，暗色下用深色文字（--app-accent-contrast）
 * 7. 27个主题至少20个可区分色相，消除重复
 */

/* ===== AI 产品线 ===== */

/* promptGenius — AI Prompt优化 — 深靛蓝（AI工具的专业感） */
.app-prompt { --app-accent: #4f46e5; --app-accent-rgb: 79, 70, 229; --app-accent-hover: #6366f1; --app-accent-strong: #4338ca; --app-name: "PromptGenius"; }
[data-theme="dark"] .app-prompt { --app-accent: #8192fa; --app-accent-rgb: 129, 146, 250; --app-accent-hover: #a5b4fc; --app-accent-strong: #a5b4fc; --app-accent-contrast: #0f172a; }

/* promptManager — AI Prompt管理中间件 — 专业蓝（基础设施的可靠感） */
.app-prompt-manager { --app-accent: #2563eb; --app-accent-rgb: 37, 99, 235; --app-accent-hover: #3b82f6; --app-accent-strong: #1d4ed8; --app-name: "Prompt工坊"; }
[data-theme="dark"] .app-prompt-manager { --app-accent: #60a5fa; --app-accent-rgb: 96, 165, 250; --app-accent-hover: #93c5fd; --app-accent-strong: #93c5fd; --app-accent-contrast: #0f172a; }

/* oneNote — 智能笔记 — 深青（Notion式知识管理的冷静感） */
.app-one-note { --app-accent: #0d9488; --app-accent-rgb: 13, 148, 136; --app-accent-hover: #14b8a6; --app-accent-strong: #0f766e; --app-name: "思悟笔记"; }
[data-theme="dark"] .app-one-note { --app-accent: #2dd4bf; --app-accent-rgb: 45, 212, 191; --app-accent-hover: #5eead4; --app-accent-strong: #5eead4; --app-accent-contrast: #0f172a; }

/* aiPet — AI宠物健康 — 暖橘（宠物/生命的温暖感） */
.app-ai-pet { --app-accent: #ea580c; --app-accent-rgb: 234, 88, 12; --app-accent-hover: #f97316; --app-accent-strong: #c2410c; --app-name: "宠康管家"; }
[data-theme="dark"] .app-ai-pet { --app-accent: #fb923c; --app-accent-rgb: 251, 146, 60; --app-accent-hover: #fdba74; --app-accent-strong: #fdba74; --app-accent-contrast: #0f172a; }

/* verseCraft — AI小说创作 — 深玫瑰（创意/文学的热情感） */
.app-verse-craft { --app-accent: #e11d48; --app-accent-rgb: 225, 29, 72; --app-accent-hover: #f43f5e; --app-accent-strong: #be123c; --app-name: "VerseCraft"; }
[data-theme="dark"] .app-verse-craft { --app-accent: #fb7185; --app-accent-rgb: 251, 113, 133; --app-accent-hover: #fda4af; --app-accent-strong: #fda4af; --app-accent-contrast: #0f172a; }

/* resumeAI — 智能简历 — 青蓝（求职/专业的信任感） */
.app-resume-ai { --app-accent: #0891b2; --app-accent-rgb: 8, 145, 178; --app-accent-hover: #06b6d4; --app-accent-strong: #0e7490; --app-name: "ResumeAI"; }
[data-theme="dark"] .app-resume-ai { --app-accent: #22d3ee; --app-accent-rgb: 34, 211, 238; --app-accent-hover: #67e8f9; --app-accent-strong: #67e8f9; --app-accent-contrast: #0f172a; }

/* beeMemory — AI记忆管理 — 琥珀金（记忆/蜂巢的智慧感） */
.app-bee-memory { --app-accent: #d97706; --app-accent-rgb: 217, 119, 6; --app-accent-hover: #f59e0b; --app-accent-strong: #b45309; --app-name: "BeeMemory"; }
[data-theme="dark"] .app-bee-memory { --app-accent: #fbbf24; --app-accent-rgb: 251, 191, 36; --app-accent-hover: #fcd34d; --app-accent-strong: #fcd34d; --app-accent-contrast: #0f172a; }

/* chroma — 向量存储服务 — 品红（向量/嵌入的科技感） */
.app-chroma { --app-accent: #c026d3; --app-accent-rgb: 192, 38, 211; --app-accent-hover: #d946ef; --app-accent-strong: #a21caf; --app-name: "Chroma"; }
[data-theme="dark"] .app-chroma { --app-accent: #e879f9; --app-accent-rgb: 232, 121, 249; --app-accent-hover: #f0abfc; --app-accent-strong: #f0abfc; --app-accent-contrast: #0f172a; }

/* ===== 金融/数据产品线 ===== */

/* goldenStock — 智能投资 — 深蓝（金融的权威感，区别于AI靛蓝） */
.app-golden { --app-accent: #1d4ed8; --app-accent-rgb: 29, 78, 216; --app-accent-hover: #3b82f6; --app-accent-strong: #1e40af; --app-name: "GoldenStock"; }
[data-theme="dark"] .app-golden { --app-accent: #60a5fa; --app-accent-rgb: 96, 165, 250; --app-accent-hover: #93c5fd; --app-accent-strong: #93c5fd; --app-accent-contrast: #0f172a; }

/* financialKG — 金融知识图谱 — 靛青（数据/图谱的深度感） */
.app-financial-kg { --app-accent: #0e7490; --app-accent-rgb: 14, 116, 144; --app-accent-hover: #0891b2; --app-accent-strong: #155e75; --app-name: "FinancialKG"; }
[data-theme="dark"] .app-financial-kg { --app-accent: #22d3ee; --app-accent-rgb: 34, 211, 238; --app-accent-hover: #67e8f9; --app-accent-strong: #67e8f9; --app-accent-contrast: #0f172a; }

/* adSmart — 智能广告 — 玫红（营销/广告的冲击力） */
.app-ad-smart { --app-accent: #db2777; --app-accent-rgb: 219, 39, 119; --app-accent-hover: #ec4899; --app-accent-strong: #be185d; --app-name: "AdSmart"; }
[data-theme="dark"] .app-ad-smart { --app-accent: #f472b6; --app-accent-rgb: 244, 114, 182; --app-accent-hover: #f9a8d4; --app-accent-strong: #f9a8d4; --app-accent-contrast: #0f172a; }

/* ===== 教育产品线 ===== */

/* WisePath — 高考志愿 — 金色（智慧/成就的象征，区别于AdSmart玫红） */
.app-wisepath { --app-accent: #a16207; --app-accent-rgb: 161, 98, 7; --app-accent-hover: #ca8a04; --app-accent-strong: #854d0e; --app-name: "知路"; }
[data-theme="dark"] .app-wisepath { --app-accent: #facc15; --app-accent-rgb: 250, 204, 21; --app-accent-hover: #fde047; --app-accent-strong: #fde047; --app-accent-contrast: #0f172a; }

/* codeBlock — 青少年编程 — 翡翠绿（编程/成长的活力感） */
.app-code-block { --app-accent: #059669; --app-accent-rgb: 5, 150, 105; --app-accent-hover: #10b981; --app-accent-strong: #047857; --app-name: "码趣星"; }
[data-theme="dark"] .app-code-block { --app-accent: #34d399; --app-accent-rgb: 52, 211, 153; --app-accent-hover: #6ee7b7; --app-accent-strong: #6ee7b7; --app-accent-contrast: #0f172a; }

/* geniusStudent — 天才学伴 — 琥珀（学习/探索的温暖感，区别于紫罗兰） */
.app-genius-student { --app-accent: #2F56A7; --app-accent-rgb: 47, 86, 167; --app-accent-hover: #7D9BD4; --app-accent-strong: #25478c; --app-name: "天才学伴"; }
[data-theme="dark"] .app-genius-student { --app-accent: #7D9BD4; --app-accent-rgb: 125, 155, 212; --app-accent-hover: #A3BEE3; --app-accent-strong: #A3BEE3; --app-accent-contrast: #0f172a; }

/* ===== 开发工具产品线 ===== */

/* lion — 配置中心 — 深天蓝（配置/基础设施的可靠感，区别于琥珀） */
.app-lion { --app-accent: #0369a1; --app-accent-rgb: 3, 105, 161; --app-accent-hover: #0284c7; --app-accent-strong: #075985; --app-name: "Lion"; }
[data-theme="dark"] .app-lion { --app-accent: #38bdf8; --app-accent-rgb: 56, 189, 248; --app-accent-hover: #7dd3fc; --app-accent-strong: #7dd3fc; --app-accent-contrast: #0f172a; }

/* miniDeploy — 部署平台 — 天蓝（DevOps/云的开放感） */
.app-mini-deploy { --app-accent: #0284c7; --app-accent-rgb: 2, 132, 199; --app-accent-hover: #0ea5e9; --app-accent-strong: #0369a1; --app-name: "MiniDeploy"; }
[data-theme="dark"] .app-mini-deploy { --app-accent: #38bdf8; --app-accent-rgb: 56, 189, 248; --app-accent-hover: #7dd3fc; --app-accent-strong: #7dd3fc; --app-accent-contrast: #0f172a; }

/* spider — 智能爬虫 — 深绿（爬虫/自动化的持续感） */
.app-spider { --app-accent: #047857; --app-accent-rgb: 4, 120, 87; --app-accent-hover: #059669; --app-accent-strong: #065f46; --app-name: "Spider"; }
[data-theme="dark"] .app-spider { --app-accent: #34d399; --app-accent-rgb: 52, 211, 153; --app-accent-hover: #6ee7b7; --app-accent-strong: #6ee7b7; --app-accent-contrast: #0f172a; }

/* userFeedback — 反馈中台 — 朱红（反馈/告警的紧迫感） */
.app-user-feedback { --app-accent: #dc2626; --app-accent-rgb: 220, 38, 38; --app-accent-hover: #ef4444; --app-accent-strong: #b91c1c; --app-name: "UserFeedback"; }
[data-theme="dark"] .app-user-feedback { --app-accent: #f87171; --app-accent-rgb: 248, 113, 113; --app-accent-hover: #fca5a5; --app-accent-strong: #fca5a5; --app-accent-contrast: #0f172a; }

/* ===== 基础设施 ===== */

/* usercenter — 用户中心 — 靛蓝（认证/安全的权威感，区别于紫罗兰） */
.app-usercenter { --app-accent: #6366f1; --app-accent-rgb: 99, 102, 241; --app-accent-hover: #818cf8; --app-accent-strong: #4f46e5; --app-name: "用户中心"; }
[data-theme="dark"] .app-usercenter { --app-accent: #8192fa; --app-accent-rgb: 129, 146, 250; --app-accent-hover: #a5b4fc; --app-accent-strong: #a5b4fc; --app-accent-contrast: #0f172a; }

/* goldenFish — 闲鱼助手 — 金鱼橙（品牌主色，白字对比 5.2:1，暖橙 × 石板蓝灰互补） */
.app-golden-fish { --app-accent: #c2410c; --app-accent-rgb: 194, 65, 12; --app-accent-hover: #9a3412; --app-accent-strong: #9a3412; --app-name: "GoldenFish"; }
[data-theme="dark"] .app-golden-fish { --app-accent: #fb923c; --app-accent-rgb: 251, 146, 60; --app-accent-hover: #fdba74; --app-accent-strong: #fdba74; --app-accent-contrast: #431407; }

/* ===== 通用主题 ===== */

/* nexus-ui — 设计系统 — 品牌蓝 */
.app-nexus-ui { --app-accent: #3b82f6; --app-accent-rgb: 59, 130, 246; --app-accent-hover: #60a5fa; --app-accent-strong: #2563eb; --app-name: "NexusUI"; }
[data-theme="dark"] .app-nexus-ui { --app-accent: #60a5fa; --app-accent-rgb: 96, 165, 250; --app-accent-hover: #93c5fd; --app-accent-strong: #93c5fd; --app-accent-contrast: #0f172a; }

/* admin — 管理后台 — 深石板蓝（区别于FastRPC石板蓝） */
.app-admin { --app-accent: #334155; --app-accent-rgb: 51, 65, 85; --app-accent-hover: #475569; --app-accent-strong: #1e293b; --app-name: "Admin"; }
[data-theme="dark"] .app-admin { --app-accent: #94a3b8; --app-accent-rgb: 148, 163, 184; --app-accent-hover: #cbd5e1; --app-accent-strong: #cbd5e1; --app-accent-contrast: #0f172a; }

/* docs — 文档中心 — 灰色（文档/中性，区别于FinancialKG靛青） */
.app-docs { --app-accent: #6b7280; --app-accent-rgb: 107, 114, 128; --app-accent-hover: #9ca3af; --app-accent-strong: #4b5563; --app-name: "Docs"; }
[data-theme="dark"] .app-docs { --app-accent: #9ca3af; --app-accent-rgb: 156, 163, 175; --app-accent-hover: #d1d5db; --app-accent-strong: #d1d5db; --app-accent-contrast: #0f172a; }

/* ===== 新接入应用（v2.2 补齐，消除与既有主题撞色） ===== */

/* truemirror — 照妖镜（AI 内容检测） — 品红紫（照鉴真伪的锐利感，与 chroma 品红拉开：更深更紫） */
.app-truemirror { --app-accent: #9333ea; --app-accent-rgb: 147, 51, 234; --app-accent-hover: #a855f7; --app-accent-strong: #7e22ce; --app-name: "照妖镜"; }
[data-theme="dark"] .app-truemirror { --app-accent: #c084fc; --app-accent-rgb: 192, 132, 252; --app-accent-hover: #d8b4fe; --app-accent-strong: #d8b4fe; --app-accent-contrast: #0f172a; }

/* travelMate — 旅行伴侣 — 松绿（自然/旅途的沉静感） */
.app-travel-mate { --app-accent: #2e6b4f; --app-accent-rgb: 46, 107, 79; --app-accent-hover: #3d8a66; --app-accent-strong: #24523d; --app-name: "TravelMate"; }
[data-theme="dark"] .app-travel-mate { --app-accent: #4ade80; --app-accent-rgb: 74, 222, 128; --app-accent-hover: #86efac; --app-accent-strong: #86efac; --app-accent-contrast: #0f172a; }

/* MiaoBi — 妙笔（AI 写作） — 藏蓝配琥珀（书写的沉静 + 点睛） */
.app-miaobi { --app-accent: #1E3A5F; --app-accent-rgb: 30, 58, 95; --app-accent-hover: #2F54A8; --app-accent-strong: #152C4B; --app-name: "妙笔"; }
[data-theme="dark"] .app-miaobi { --app-accent: #8FAADC; --app-accent-rgb: 143, 170, 220; --app-accent-hover: #A5C0E8; --app-accent-strong: #A5C0E8; --app-accent-contrast: #0f172a; }

/* gezhi — 格致（学习管理） — 暗钢蓝（格物致知的理性感） */
.app-gezhi { --app-accent: #1f4e79; --app-accent-rgb: 31, 78, 121; --app-accent-hover: #2a6396; --app-accent-strong: #173a5c; --app-name: "格致"; }
[data-theme="dark"] .app-gezhi { --app-accent: #649ED8; --app-accent-rgb: 100, 158, 216; --app-accent-hover: #8AB6E6; --app-accent-strong: #8AB6E6; --app-accent-contrast: #0f172a; }

/* ===== nexus-mobile.css ===== */
:root {
  --nx-vh: 1vh;
}

.nx-app {
  display: flex;
  min-height: calc(var(--nx-vh) * 100);
  min-height: 100dvh;
}

.nx-hamburger {
  display: none;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  padding: 0;
  border: none;
  background: transparent;
  cursor: pointer;
  border-radius: var(--nx-radius-md);
  transition: background var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nx-hamburger:hover { background: var(--nx-bg-hover); }
.nx-hamburger:active { background: var(--nx-border); }

.nx-hamburger-line {
  display: block;
  width: 20px;
  height: 2px;
  background: var(--nx-text-heading);
  border-radius: 1px;
  transition: all var(--nx-transition-base);
}

.nx-hamburger-inner {
  display: flex;
  flex-direction: column;
  gap: 5px;
  align-items: center;
}

.nx-hamburger.open .nx-hamburger-line:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nx-hamburger.open .nx-hamburger-line:nth-child(2) { opacity: 0; }
.nx-hamburger.open .nx-hamburger-line:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

.nx-hamburger-fixed {
  position: fixed;
  top: calc(12px + var(--nx-safe-top));
  left: 12px;
  z-index: var(--nx-z-hamburger);
  background: var(--nx-bg-surface, #fff);
  border: 1px solid var(--nx-border, #e2e8f0);
  box-shadow: 0 4px 12px rgba(15, 23, 42, 0.08);
}

.nx-drawer-overlay {
  position: fixed;
  inset: 0;
  z-index: var(--nx-z-overlay);
  background: var(--nx-overlay-bg, rgba(0, 0, 0, 0.5));
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--nx-transition-slow), visibility var(--nx-transition-slow);
  -webkit-tap-highlight-color: transparent;
}
.nx-drawer-overlay.open { opacity: 1; visibility: visible; }

.nx-drawer {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  z-index: var(--nx-z-drawer);
  width: 280px;
  max-width: 85vw;
  background: var(--nx-bg-surface);
  border-right: 1px solid var(--nx-border);
  transform: translateX(-100%);
  transition: transform var(--nx-transition-slow);
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  padding-bottom: var(--nx-safe-bottom);
}
.nx-drawer.open { transform: translateX(0); }

.nx-drawer-right {
  left: auto;
  right: 0;
  border-right: none;
  border-left: 1px solid var(--nx-border);
  transform: translateX(100%);
}
.nx-drawer-right.open { transform: translateX(0); }

.nx-table-scroll { width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }@media (max-width: 768px){
  .nx-table-scroll { margin: 0 calc(-1 * var(--nx-space-4)); padding: 0 var(--nx-space-4); }
  /* 未包 wrapper 的裸 .nx-table 移动端地板：表级横滚兜底，防撑破页面；
     语义保持（thead 不塌），首选仍是 .nx-table-scroll 包装（负边距满宽）。 */
  .nx-table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }
}@media (hover: none) and (pointer: coarse){
  /* 业务自绘控件的通用触控地板：挂 .nx-touch 即得 44px 地板+隐形热区扩展，
     替代各仓自写 44px @media 规则（oneNote/MiaoBi 存量 ~23 条的收编出口）。 */
  .nx-touch { min-height: 44px; min-width: 44px; position: relative; }
  .nx-touch::after { content: ""; position: absolute; inset: -10px; }
  a, button, [role="button"], .nx-touch { touch-action: manipulation; }
  .nux-btn { min-height: 44px; min-width: 44px; }
  .nux-btn.nux-btn--sm { min-height: 40px; min-width: 40px; }
  .nux-login-tab, .nux-login-subtab { min-width: 44px; }
  .nx-sidebar-item { min-height: 44px; }
  .nx-input, .nx-select, .nux-input { min-height: 44px; font-size: 16px; }
  .nux-btn,
.nux-acc-head,
.nux-bottom-nav-item,
.nux-layout-nav-item,
.nux-layout-collapse-btn,
.nux-tab-item,
.nux-segmented-item,
.nux-chip,
.nux-cal-nav,
.nux-cal-today-btn,
.nux-checkin-preset,
.nux-notif-panel-item,
.nux-notif-panel-page-btn,
.nux-notify-bell,
.nux-notify-item,
.nux-onboarding-btn,
.nux-uc-tab,
.nux-uc-trigger,
.nux-uc-action,
.nux-uc-close,
.nux-uc-logout,
.nux-login-tab,
.nux-login-subtab,
.nux-third-btn,
.nux-link,
.nux-undo-btn,
.nux-field-clear,
.nux-password-toggle,
.nux-sms-btn,
.nux-captcha-img,
.nux-check,
.nux-checkbox,
.nux-select-native,
.nux-app-card-cover,
.nux-backtop,
.nux-menu-user-btn,
.nux-menu-about-btn,
.nux-selection-clear,
.nc-chip,
.nc-btn,
.nxw-chip,
.nxw-choice-btn,
.nvi-btn,
.nx-conv-list-new,
.nx-ai-chat-quick-btn,
.nx-auto-act,
.nux-input-number-btn,
.nx-settings-nav-item,
.nx-ai-chat-scroll-btn,
.nx-modal-close,
.nxsp-close,
.nxsp-tab,
.nxsp-personal-item,
.nux-wallet-claim,
.nx-auto-modal-close,
.nux-notify-reload,
.nux-checkin-ghost,
.nux-checkin-mini,
.nux-ob-btn,
.nux-footer .nux-footer-link {
    min-height: 44px;
  }
  .nux-menu-user-btn,
.nux-menu-about-btn,
.nvi-btn,
.nux-backtop,
.nux-notify-bell,
.nx-modal-close,
.nxsp-close {
    min-width: 44px;
  }
  .nux-chip-remove,
.nux-notif-panel-item-delete,
.nux-onboarding-close,
.nux-cal-nav,
.nux-field-clear,
.nux-password-toggle,
.nux-notify-bell,
.nux-uc-trigger,
.nux-uc-close,
.nux-uc-logout,
.nux-menu-user-btn,
.nux-menu-about-btn,
.nux-app-card-fav,
.nux-app-card-edit,
.nux-switch-track,
.nux-check-box,
.nx-settings-close,
.nux-layout-collapse-btn,
.nx-conv-list-item-btn,
.nx-ai-chat-action-btn,
.nx-ai-chat-reasoning-toggle,
.nx-ai-chat-retry-btn,
.nxsp-search-clear,
.nxw-card-link,
.nux-ob-dismiss,
.nx-auto-switch {
    position: relative;
  }
  .nux-chip-remove::after,
.nux-notif-panel-item-delete::after,
.nux-onboarding-close::after,
.nux-cal-nav::after,
.nux-field-clear::after,
.nux-password-toggle::after,
.nux-notify-bell::after,
.nux-uc-trigger::after,
.nux-uc-close::after,
.nux-uc-logout::after,
.nux-menu-user-btn::after,
.nux-menu-about-btn::after,
.nux-app-card-fav::after,
.nux-app-card-edit::after,
.nux-switch-track::after,
.nux-check-box::after,
.nx-settings-close::after,
.nux-layout-collapse-btn::after,
.nx-conv-list-item-btn::after,
.nx-ai-chat-action-btn::after,
.nx-ai-chat-reasoning-toggle::after,
.nx-ai-chat-retry-btn::after,
.nxsp-search-clear::after,
.nxw-card-link::after,
.nux-ob-dismiss::after,
.nx-auto-switch::after {
    content: "";
    position: absolute;
    inset: -10px;
  }
}@media (max-width: 768px){
  .nx-hamburger { display: flex; }
  .nx-sidebar { display: none; }
  .nx-nav { padding: 0 var(--nx-space-4); height: 52px; }
  .nx-card { padding: var(--nx-space-4); }
  .nx-app { flex-direction: column; }
  .nx-hide-mobile { display: none !important; }
}@media (max-width: 480px){
  .nx-card { padding: var(--nx-space-3); }
  .nx-modal { padding: var(--nx-space-4); }
}

[data-theme="dark"] .nx-drawer { background: var(--nx-bg-surface); }
[data-theme="dark"] .nx-hamburger-line { background: var(--nx-text-heading); }@media (max-width: 768px){
  .el-dialog { width: 95% !important; margin-top: 5vh !important; }
  .el-drawer { width: 85% !important; }
  .el-table { font-size: 13px; }
  .el-form-item__label { float: none !important; text-align: left !important; width: auto !important; padding-bottom: 4px !important; }
  .el-form-item__content { margin-left: 0 !important; }
}@media (max-width: 480px){
  .el-dialog { width: 98% !important; margin-top: 2vh !important; }
  .el-message-box { width: 92% !important; }
}@media (max-width: 768px){
  .sidebar { position: fixed !important; top: 0; left: 0; bottom: 0; z-index: var(--nx-z-drawer); width: 260px !important; max-width: 85vw; transform: translateX(-100%); transition: transform 0.3s ease; }
  .sidebar.sidebar-open, .sidebar.open { transform: translateX(0); }
  .sidebar-overlay { position: fixed; inset: 0; background: var(--nx-overlay-bg, rgba(0,0,0,0.5)); z-index: var(--nx-z-overlay); display: none; }
  .sidebar-overlay.active { display: block; }
  .main { width: 100% !important; }
  .content { padding: 12px !important; }
  .topbar { padding: 0 12px !important; height: 48px !important; }
  .topbar-title { font-size: 13px !important; }
  .topbar-actions .btn span { display: none; }
  .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr !important; }
  .card { padding: 12px !important; margin-bottom: 10px !important; }
  .stat-value { font-size: 20px !important; }
  .stat-label { font-size: 10px !important; }
  .btn { padding: 8px 14px !important; font-size: 13px !important; min-height: 40px; }
  .btn-sm { padding: 6px 10px !important; min-height: 40px; }
  .btn-xs { min-height: 36px; }
  .form-input, .form-select, .form-textarea { font-size: 16px !important; width: 100%; }
  .form-label { font-size: 13px !important; }
  .nav-item { padding: 10px 14px !important; font-size: 13px !important; min-height: 44px; }
  .tab-bar { overflow-x: auto; -webkit-overflow-scrolling: touch; flex-wrap: nowrap; }
  .tab { white-space: nowrap; padding: 8px 12px; }
  .mobile-menu-btn { display: inline-flex !important; }
  .app { flex-direction: column !important; }
  .hide-mobile { display: none !important; }
}@media (max-width: 480px){
  .content { padding: 8px !important; }
  .card { padding: 8px !important; }
  .stat-value { font-size: 18px !important; }
  .btn { padding: 6px 10px; font-size: 12px; }
  .topbar-title { font-size: 12px !important; }
  .sidebar { width: 85vw !important; }
}@media (min-width: 769px){
  .mobile-menu-btn { display: none !important; }
  .sidebar-overlay { display: none !important; }
}@media (hover: none) and (pointer: coarse){
  .nav-item { min-height: 44px; }
  .form-input, .form-select, .form-textarea { min-height: 40px; font-size: 16px; }
  .tab { min-height: 40px; padding: 10px 14px; }
}

/* ===== 移动端基础重置（收口自各项目 mobile-base.css，可直接替代） ===== */
:root {
  --safe-top: var(--nx-safe-top);
  --safe-bottom: var(--nx-safe-bottom);
  --safe-left: var(--nx-safe-left);
  --safe-right: var(--nx-safe-right);
  --app-vh: calc(var(--nx-vh) * 100);
}

* {
  -webkit-tap-highlight-color: transparent;
}

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

/* iOS 聚焦缩放防护：触屏设备输入字号不得低于 16px（任意类名的输入框，业务仓无需再各自手写） */
@media (hover: none) and (pointer: coarse) {
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]),
  textarea, select {
    font-size: 16px !important;
  }
}

html, body {
  overscroll-behavior-y: contain;
}

body {
  padding-top: var(--safe-top);
  padding-bottom: var(--safe-bottom);
  padding-left: var(--safe-left);
  padding-right: var(--safe-right);
}

.full-height {
  height: 100vh;
  height: 100svh;
  height: 100dvh;
  min-height: 100vh;
  min-height: 100svh;
  min-height: 100dvh;
}

img, video, canvas {
  max-width: 100%;
  height: auto;
}

@supports not (padding: env(safe-area-inset-top)) {
  :root {
    --safe-top: 0px;
    --safe-bottom: 0px;
    --safe-left: 0px;
    --safe-right: 0px;
  }
}

@media (max-width: 768px) {
  .show-mobile {
    display: block !important;
  }
  .container,
  .container-fluid {
    padding-left: 16px;
    padding-right: 16px;
  }
}

@media (min-width: 769px) {
  .show-mobile {
    display: none !important;
  }
}

@media (pointer: coarse) {
  .tooltip:hover {
    display: none !important;
  }
}

@media (max-width: 768px){
  button:not([class]),
  .btn,
  [role="button"],
  a.btn {
    min-height: 44px;
    min-width: 44px;
  }
  .modal,
  .modal-overlay {
    padding: 0 !important;
  }
  .modal-card,
  .modal-content {
    max-width: 100% !important;
    max-height: 100dvh !important;
    border-radius: 0 !important;
    margin: 0 !important;
  }
  table {
    display: block;
    overflow-x: auto;
    white-space: nowrap;
    -webkit-overflow-scrolling: touch;
  }
}@media (pointer: coarse){
  button:not([class]),
  .btn,
  [role="button"],
  a.btn,
  .clickable {
    min-height: 44px;
    min-width: 44px;
  }
}

/* iOS Safari 防聚焦缩放：文本输入控件字号 <16px 时聚焦会强制放大页面（多端地板统一防御） */
@media (max-width: 768px) {
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="submit"]):not([type="button"]),
  select,
  textarea,
  .form-control,
  .form-select {
    font-size: 16px;
  }
}

/* 弹层移动端收敛：modal 转底部动作面板形态，贴合并规避误触 */
@media (max-width: 768px) {
  .nx-modal-overlay {
    align-items: flex-end;
    padding: 0;
  }
  .nx-modal {
    width: 100%;
    max-width: 100%;
    max-height: 90dvh;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    border-radius: var(--nx-radius-xl, 1rem) var(--nx-radius-xl, 1rem) 0 0;
    padding: var(--nx-space-6, 1.5rem) var(--nx-space-4, 1rem) calc(var(--nx-space-6, 1.5rem) + var(--nx-safe-bottom, 0px));
  }
}

/* 底部动作面板原语：≤768 时给弹层挂 .nx-sheet 即贴底全宽化（居中定位型自动解除居中）。
 * 键盘弹起时随 --nx-kb（nexus-utils dom.syncKeyboardHeight 注入）抬离软件键盘，输入区不被遮挡。
 * 供 JS 注入弹层与库外弹窗消费；.nx-modal 的专用块与设置抽屉已自带移动形态，不依赖此原语。 */
@media (max-width: 768px) {
  .nx-sheet {
    left: 0 !important;
    right: 0 !important;
    bottom: var(--nx-kb, 0px) !important;
    top: auto !important;
    transform: none !important;
    width: 100% !important;
    max-width: 100% !important;
    margin: 0 !important;
    max-height: calc(90dvh - var(--nx-kb, 0px)) !important;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    border-radius: var(--nx-radius-xl, 1rem) var(--nx-radius-xl, 1rem) 0 0;
    padding-bottom: calc(var(--nx-space-6, 1.5rem) + var(--nx-safe-bottom, 0px));
  }
}

/* ===== 下拉刷新原语 NexusPullRefresh（触屏，nexus-pull-refresh.js）===== */
.nx-pull-refresh {
    position: absolute;
    top: 8px;
    left: 50%;
    margin-left: -52px;
    width: 104px;
    height: 36px;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    border-radius: 18px;
    background: var(--nx-bg-elevated, #fff);
    border: 1px solid var(--nx-border, #e2e8f0);
    box-shadow: 0 4px 16px rgba(15, 23, 42, 0.12);
    color: var(--nx-text-accent, var(--app-accent, #4f46e5));
    font-size: 12px;
    opacity: 0;
    visibility: hidden;
    transform: translateY(-28px);
    transition: opacity 0.2s ease, transform 0.25s ease, visibility 0.25s;
    z-index: var(--nx-z-float, 1500);
    pointer-events: none;
}
[data-theme="dark"] .nx-pull-refresh {
    background: var(--nx-bg-elevated, #2a3848);
    border-color: var(--nx-border, #334155);
}
.nx-pull-refresh-spinner {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    transition: transform 0.1s linear;
}
.nx-pull-refresh-spinner.is-spinning {
    animation: nx-pull-spin 0.7s linear infinite;
}
.nx-pull-refresh-spinner.is-spinning svg {
    display: none;
}
.nx-pull-refresh-spinner.is-spinning::after {
    content: '';
    width: 16px;
    height: 16px;
    border: 2px solid var(--nx-accent-soft, rgba(99, 102, 241, 0.25));
    border-top-color: currentColor;
    border-radius: 50%;
}
@keyframes nx-pull-spin {
    to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
    .nx-pull-refresh { transition: opacity 0.1s ease; }
    .nx-pull-refresh-spinner { transition: none; }
    .nx-pull-refresh-spinner.is-spinning { animation-duration: 1.4s; }
}

/* ===== nexus-components-feedback.css ===== */
.nx-modal-overlay {
  position: fixed;
  inset: 0;
  z-index: var(--nx-z-modal);
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--nx-overlay-bg, rgba(0, 0, 0, 0.5));
  backdrop-filter: blur(4px);
  transition: opacity 0.2s ease;
}
.nx-modal-overlay.is-leaving {
  opacity: 0;
}
.nx-modal {
  position: relative;
  background: var(--nx-bg-elevated);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-xl);
  padding: var(--nx-space-8);
  max-width: 520px;
  width: calc(100% - 2rem);
  max-height: calc(100vh - 2rem);
  max-height: calc(100dvh - 2rem);
  overflow-y: auto;
  box-shadow: var(--nx-shadow-lg);
}
.nx-modal-title {
  font-size: var(--nx-text-xl);
  font-weight: 600;
  color: var(--nx-text-heading);
  margin-bottom: var(--nx-space-4);
  padding-right: 40px;
}
.nx-modal-close {
  position: absolute;
  top: 10px;
  right: 10px;
  width: 32px;
  height: 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: transparent;
  color: var(--nx-text-muted);
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease;
}
.nx-modal-close:hover { background: var(--nx-bg-hover, rgba(15, 23, 42, 0.06)); color: var(--nx-text-heading); }
.nx-modal-close svg { width: 18px; height: 18px; }

.nux-modal-footer {
  display: flex;
  justify-content: flex-end;
  gap: var(--nx-space-3);
  margin-top: var(--nx-space-6);
  padding-top: var(--nx-space-4);
  border-top: 1px solid var(--nx-border);
}

.nux-modal-enter-active { transition: opacity 0.2s ease; }
.nux-modal-leave-active { transition: opacity 0.15s ease; }
.nux-modal-enter-from,
.nux-modal-leave-to { opacity: 0; }

.nux-toast-container {
  position: fixed;
  top: calc(var(--nx-space-6) + var(--nx-safe-top, 0px));
  right: var(--nx-space-6);
  z-index: var(--nx-z-toast-host);
  display: flex;
  flex-direction: column;
  gap: var(--nx-space-2);
  pointer-events: none;
}

/* showToast({center:true}) 居中显示模式：屏幕正中，适合与视口操作强关联的成败反馈 */
.nux-toast-container--center {
  top: 50%;
  right: auto;
  left: 50%;
  transform: translate(-50%, -50%);
  align-items: center;
}

.nux-toast-item {
  display: flex;
  align-items: center;
  gap: var(--nx-space-3);
  padding: var(--nx-space-3) var(--nx-space-5);
  border-radius: var(--nx-radius-md);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-on-accent, #fff);
  box-shadow: var(--nx-shadow-md);
  pointer-events: auto;
  max-width: 360px;
  cursor: pointer;
  opacity: 0;
  transform: translateX(100%);
  transition: opacity var(--nx-transition-base) var(--nx-ease-out),
              transform var(--nx-transition-base) var(--nx-ease-out);
}
.nux-toast-item.is-in { opacity: 1; transform: none; }
.nux-toast-success { background: var(--nx-success); }
.nux-toast-warning { background: var(--nx-warning); }
.nux-toast-error { background: var(--nx-danger); }
.nux-toast-info { background: var(--nx-info); }

.nux-toast-icon { font-size: var(--nx-text-lg); line-height: 1; flex-shrink: 0; }
.nux-toast-msg { flex: 1; word-break: break-word; }

.nux-confirm-overlay { opacity: 0; }
.nux-confirm-overlay.is-in { opacity: 1; }
.nux-confirm-msg { color: var(--nx-text-secondary); margin: var(--nx-space-4) 0; white-space: pre-line; }

.nux-prompt-modal { max-width: 440px; }
.nux-prompt-msg { color: var(--nx-text-secondary); margin: var(--nx-space-4) 0 var(--nx-space-3); white-space: pre-line; }
.nux-prompt-input { resize: vertical; min-height: 0; font-family: inherit; }
.nux-prompt-input.is-invalid { border-color: var(--nx-danger); box-shadow: 0 0 0 3px color-mix(in srgb, var(--nx-danger) 15%, transparent); }
.nux-prompt-error { margin: var(--nx-space-2) 0 0; font-size: var(--nx-text-xs); color: var(--nx-danger); }

.nux-error-state { color: var(--nx-danger); }
.nux-error-state.nx-empty-state i { font-size: 48px; color: var(--nx-danger); }
.nux-error-state .nux-error-code {
  margin-top: var(--nx-space-2);
  font-size: var(--nx-text-xs);
  color: var(--nx-text-muted);
  opacity: 0.7;
  word-break: break-all;
}

.nx-spinner {
  display: inline-block;
  width: 20px;
  height: 20px;
  border: 2px solid var(--nx-border);
  border-top-color: var(--app-accent);
  border-radius: 50%;
  animation: nx-spin 0.6s linear infinite;
}
@keyframes nx-spin { to { transform: rotate(360deg); } }

.nux-skeleton {
  display: flex;
  gap: var(--nx-space-3);
  padding: var(--nx-space-4);
}
.nux-skeleton-avatar {
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: linear-gradient(90deg, var(--nx-bg-muted) 25%, var(--nx-bg-hover) 50%, var(--nx-bg-muted) 75%);
  background-size: 200% 100%;
  animation: nx-skeleton-pulse 1.5s ease-in-out infinite;
  flex-shrink: 0;
}
.nux-skeleton-content { flex: 1; display: flex; flex-direction: column; gap: var(--nx-space-2); }
.nux-skeleton-row {
  height: 14px;
  border-radius: var(--nx-radius-sm);
  background: linear-gradient(90deg, var(--nx-bg-muted) 25%, var(--nx-bg-hover) 50%, var(--nx-bg-muted) 75%);
  background-size: 200% 100%;
  animation: nx-skeleton-pulse 1.5s ease-in-out infinite;
}
@keyframes nx-skeleton-pulse {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* ===== 会话/建议加载骨架屏（工作区规范统一语义类） ===== */
.session-skeleton {
  display: flex;
  flex-direction: column;
  gap: var(--nx-space-2, 0.5rem);
  padding: var(--nx-space-2, 0.5rem);
}
.session-skeleton::before,
.session-skeleton::after {
  content: "";
  display: block;
  height: 14px;
  border-radius: var(--nx-radius-sm, 6px);
  background: linear-gradient(90deg, var(--nx-bg-muted) 25%, var(--nx-bg-hover) 50%, var(--nx-bg-muted) 75%);
  background-size: 200% 100%;
  animation: nx-skeleton-pulse 1.5s ease-in-out infinite;
}
.session-skeleton::after {
  width: 70%;
}

/* ===== 卡片网格骨架屏（作品/海报/列表加载） ===== */
.nux-skeleton-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: var(--nx-space-4, 1rem);
}
.nux-skeleton-card {
  border: 1px solid var(--nx-border, rgba(0, 0, 0, 0.08));
  border-radius: var(--nx-radius-lg, 16px);
  background: var(--nx-bg-surface, #fff);
  overflow: hidden;
}
.nux-skeleton-card-cover {
  height: 96px;
  background: linear-gradient(90deg, var(--nx-bg-muted, #f1f5f9) 25%, var(--nx-bg-hover, #e2e8f0) 50%, var(--nx-bg-muted, #f1f5f9) 75%);
  background-size: 200% 100%;
  animation: nx-skeleton-pulse 1.5s ease-in-out infinite;
}
.nux-skeleton-card-body {
  padding: var(--nx-space-3, 0.75rem) var(--nx-space-4, 1rem);
  display: flex;
  flex-direction: column;
  gap: var(--nx-space-2, 0.5rem);
}
.nux-skeleton-card-line {
  height: 13px;
  border-radius: var(--nx-radius-sm, 6px);
  background: linear-gradient(90deg, var(--nx-bg-muted, #f1f5f9) 25%, var(--nx-bg-hover, #e2e8f0) 50%, var(--nx-bg-muted, #f1f5f9) 75%);
  background-size: 200% 100%;
  animation: nx-skeleton-pulse 1.5s ease-in-out infinite;
}

.nux-drawer-overlay-enter-active { transition: opacity 0.3s ease; }
.nux-drawer-overlay-leave-active { transition: opacity 0.2s ease; }
.nux-drawer-overlay-enter-from,
.nux-drawer-overlay-leave-to { opacity: 0; }

.nux-drawer-left-enter-active,
.nux-drawer-left-leave-active { transition: transform 0.3s ease; }
.nux-drawer-left-enter-from,
.nux-drawer-left-leave-to { transform: translateX(-100%); }

.nux-drawer-right-enter-active,
.nux-drawer-right-leave-active { transition: transform 0.3s ease; }
.nux-drawer-right-enter-from,
.nux-drawer-right-leave-to { transform: translateX(100%); }@media (max-width: 768px){
  .nux-toast-container {
    left: var(--nx-space-4);
    right: var(--nx-space-4);
    top: calc(var(--nx-space-4) + var(--nx-safe-top));
  }
  .nux-toast-item { max-width: none; }
}

/* 通知管理面板（完整页面版） */
.nux-notif-panel-page { max-width: 720px; margin: 0 auto; padding: var(--nx-space-6); }
.nux-notif-panel-header {
  display: flex; align-items: center;
  margin-bottom: var(--nx-space-4); padding-bottom: var(--nx-space-4);
  border-bottom: 1px solid var(--nx-border);
}
.nux-notif-panel-title { font-size: var(--nx-text-xl); font-weight: 700; color: var(--nx-text-heading); margin: 0; }
.nux-notif-unread-pill {
  margin-left: var(--nx-space-3);
  font-size: var(--nx-text-xs); line-height: 1;
  padding: 4px 10px; border-radius: 999px;
  background: var(--nx-bg-muted); color: var(--nx-text-secondary);
}
.nux-notif-unread-pill.has-unread {
  background: rgba(var(--app-accent-rgb), 0.1); color: var(--nx-text-accent); font-weight: 600;
}
.nux-notif-panel-mark-all {
  margin-left: auto; border: 1px solid var(--nx-border); background: var(--nx-bg-surface);
  color: var(--nx-text-accent); font-size: var(--nx-text-sm); cursor: pointer;
  padding: var(--nx-space-2) var(--nx-space-4); min-height: 36px;
  border-radius: var(--nx-radius-sm); transition: background var(--nx-transition-fast), border-color var(--nx-transition-fast);
}
.nux-notif-panel-mark-all:hover { background: var(--nx-bg-hover); border-color: rgba(var(--app-accent-rgb), 0.4); }
.nux-notif-push-slot { margin-left: auto; }
.nux-notif-panel-header .nux-notif-panel-mark-all { margin-left: var(--nx-space-3); }
.nux-notif-panel-header .nux-notif-unread-pill { margin-left: 0; }
.nux-notif-push-pill {
  display: inline-flex; align-items: center; gap: 6px;
  border: 1px solid rgba(var(--app-accent-rgb), 0.35); background: var(--nx-bg-surface);
  color: var(--nx-text-accent); font-size: var(--nx-text-xs); font-weight: 600;
  padding: 5px 12px; min-height: 28px; border-radius: 999px; cursor: pointer;
  transition: background var(--nx-transition-fast), border-color var(--nx-transition-fast);
}
.nux-notif-push-pill:hover { background: rgba(var(--app-accent-rgb), 0.08); border-color: rgba(var(--app-accent-rgb), 0.6); }
.nux-notif-push-pill.is-on { background: rgba(var(--app-accent-rgb), 0.12); border-color: transparent; }
.nux-notif-push-pill.is-unsupported { border-color: var(--nx-border); color: var(--nx-text-tertiary, var(--nx-text-secondary)); cursor: default; }
.nux-notif-push-banner-slot:not(:empty) { margin-bottom: var(--nx-space-3); }
.nux-notif-push-banner {
  display: flex; align-items: center; gap: var(--nx-space-3);
  padding: var(--nx-space-3) var(--nx-space-4);
  border: 1px solid rgba(var(--app-accent-rgb), 0.3); border-radius: var(--nx-radius-sm);
  background: rgba(var(--app-accent-rgb), 0.06); font-size: var(--nx-text-sm); color: var(--nx-text-secondary);
}
.nux-notif-push-banner > i { color: var(--nx-text-accent); }
.nux-notif-push-banner-text { flex: 1; min-width: 0; }
.nux-notif-push-banner-cta {
  flex-shrink: 0; border: none; border-radius: var(--nx-radius-sm);
  background: var(--app-accent, var(--nx-text-accent)); color: #fff;
  font-size: var(--nx-text-sm); font-weight: 600; cursor: pointer;
  padding: var(--nx-space-2) var(--nx-space-4); min-height: 32px;
}
.nux-notif-push-banner-close {
  flex-shrink: 0; border: none; background: none; color: var(--nx-text-tertiary, var(--nx-text-secondary));
  cursor: pointer; padding: var(--nx-space-2); min-height: 28px; min-width: 28px;
}
.nux-notif-panel-mark-all:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 2px; }
.nux-notif-panel-boxes {
  display: flex; gap: 2px; margin-bottom: var(--nx-space-4);
  border-bottom: 1px solid var(--nx-border);
}
.nux-notif-box-btn {
  position: relative; border: none; background: transparent; color: var(--nx-text-secondary);
  font-size: var(--nx-text-sm); line-height: 1; padding: 10px 14px 12px;
  border-radius: 6px 6px 0 0; cursor: pointer;
  transition: color var(--nx-transition-fast);
}
.nux-notif-box-btn:hover { color: var(--nx-text-strong); }
.nux-notif-box-btn.active { color: var(--nx-text-strong); font-weight: 600; }
.nux-notif-box-btn.active::after {
  content: ''; position: absolute; left: 10px; right: 10px; bottom: -1px; height: 2px;
  background: rgb(var(--app-accent-rgb)); border-radius: 999px;
}
.nux-notif-box-btn:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: -2px; }
.nux-notif-panel-toolbar {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px;
  margin-bottom: var(--nx-space-4);
}
.nux-notif-inboxseg {
  display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px;
}
.nux-notif-inboxbox-btn {
  display: inline-flex; align-items: center; gap: 6px;
  border: 1px solid var(--nx-border); background: var(--nx-bg-surface);
  color: var(--nx-text-secondary); font-size: var(--nx-text-sm); line-height: 1;
  padding: 8px 14px; min-height: 36px; border-radius: 999px; cursor: pointer;
  transition: background var(--nx-transition-fast), color var(--nx-transition-fast), border-color var(--nx-transition-fast);
}
.nux-notif-inboxbox-btn:hover { border-color: rgba(var(--app-accent-rgb), 0.45); color: var(--nx-text-strong); }
.nux-notif-inboxbox-btn.active {
  background: rgba(var(--app-accent-rgb), 0.1);
  border-color: rgba(var(--app-accent-rgb), 0.45);
  color: var(--nx-text-accent); font-weight: 600;
}
.nux-notif-inboxbox-btn:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 1px; }
.nux-notif-inboxbox-count {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; height: 18px; padding: 0 5px;
  border-radius: 999px; background: rgb(var(--app-accent-rgb));
  color: var(--nx-text-on-accent); font-size: 11px; font-weight: 600; line-height: 1;
}
.nux-notif-seg {
  display: inline-flex; gap: 2px; padding: 2px;
  border-radius: 8px; background: var(--nx-bg-muted);
}
.nux-notif-seg-btn {
  border: none; background: transparent; color: var(--nx-text-secondary);
  font-size: var(--nx-text-sm); line-height: 1; padding: 8px 16px;
  border-radius: 6px; cursor: pointer;
  transition: background var(--nx-transition-fast), color var(--nx-transition-fast);
}
.nux-notif-seg-btn.active {
  background: var(--nx-bg-surface); color: var(--nx-text-strong); font-weight: 600;
  box-shadow: 0 1px 3px rgba(15, 23, 42, 0.12);
}
.nux-notif-seg-btn:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 1px; }
.nux-notif-chips {
  display: flex; gap: 8px; align-items: center;
  overflow-x: auto; max-width: 100%; padding: 2px;
  margin-bottom: var(--nx-space-4);
  scrollbar-width: none;
}
.nux-notif-chips::-webkit-scrollbar { display: none; }
.nux-notif-chips.is-scrollable {
  mask-image: linear-gradient(to right, #000 calc(100% - 24px), transparent);
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 24px), transparent);
}
.nux-notif-chip {
  flex-shrink: 0; display: inline-flex; align-items: center; gap: 6px;
  border: 1px solid var(--nx-border); background: var(--nx-bg-surface);
  color: var(--nx-text-secondary); font-size: var(--nx-text-xs); line-height: 1;
  padding: 8px 12px; border-radius: 999px; cursor: pointer;
  transition: background var(--nx-transition-fast), color var(--nx-transition-fast), border-color var(--nx-transition-fast);
}
.nux-notif-chip span { color: var(--nx-text-muted); font-weight: 600; }
.nux-notif-chip:hover { border-color: rgba(var(--app-accent-rgb), 0.45); color: var(--nx-text-strong); }
.nux-notif-chip.active {
  background: rgba(var(--app-accent-rgb), 0.1);
  border-color: rgba(var(--app-accent-rgb), 0.45);
  color: var(--nx-text-accent); font-weight: 600;
}
.nux-notif-chip.active span { color: var(--nx-text-accent); }
.nux-notif-chip:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 1px; }
@media (hover: none) and (pointer: coarse) {
  .nux-notif-box-btn { padding: 14px 14px 16px; }
  .nux-notif-chip { min-height: 44px; }
  .nux-notif-inboxbox-btn { min-height: 44px; padding: 10px 16px; }
}
@media (max-width: 768px) {
  .nux-notif-inboxbox-btn { min-height: 40px; }
}
.nux-notif-panel-item.is-archived .nux-notif-panel-item-icon { opacity: 0.55; }
.nux-notif-panel-item.is-archived .nux-notif-panel-item-title { font-weight: 400; color: var(--nx-text-secondary); }
.nux-notif-empty-title { font-size: var(--nx-text-sm); color: var(--nx-text-secondary); }
.nux-notif-empty-sub { font-size: var(--nx-text-xs); color: var(--nx-text-muted); }
.nux-notif-panel-list { min-height: 200px; }
.nux-notif-panel-loading, .nux-notif-panel-error, .nux-notif-panel-empty {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  padding: var(--nx-space-12); color: var(--nx-text-muted); gap: var(--nx-space-3);
}
.nux-notif-panel-loading i, .nux-notif-panel-error i, .nux-notif-panel-empty i { font-size: 2.5rem; opacity: 0.4; }
.nux-notif-panel-item {
  display: flex; gap: var(--nx-space-3); padding: var(--nx-space-4); cursor: pointer;
  transition: background var(--nx-transition-fast); position: relative;
  border-radius: var(--nx-radius-md); margin-bottom: var(--nx-space-2);
}
.nux-notif-panel-item:hover { background: var(--nx-bg-hover); }
.nux-notif-panel-item:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: -2px; }
.nux-notif-panel-item.is-unread { background: rgba(var(--app-accent-rgb), 0.06); }
.nux-notif-panel-item:hover.is-unread { background: rgba(var(--app-accent-rgb), 0.10); }
[data-theme="dark"] .nux-notif-panel-item.is-unread { background: rgba(var(--app-accent-rgb), 0.12); }
[data-theme="dark"] .nux-notif-panel-item:hover.is-unread { background: rgba(var(--app-accent-rgb), 0.18); }
.nux-notif-panel-item-icon {
  flex-shrink: 0; width: 40px; height: 40px; border-radius: var(--nx-radius-md);
  background: var(--nx-bg-muted); display: flex; align-items: center; justify-content: center;
  color: var(--nx-text-secondary); font-size: var(--nx-text-base);
}
.nux-notif-panel-item.tone-info .nux-notif-panel-item-icon { background: rgba(var(--nx-info-rgb), 0.13); color: rgb(var(--nx-info-rgb)); }
.nux-notif-panel-item.tone-success .nux-notif-panel-item-icon { background: rgba(var(--nx-success-rgb), 0.13); color: rgb(var(--nx-success-rgb)); }
.nux-notif-panel-item.tone-warning .nux-notif-panel-item-icon { background: rgba(var(--nx-warning-rgb), 0.15); color: rgb(var(--nx-warning-rgb)); }
.nux-notif-panel-item.tone-danger .nux-notif-panel-item-icon { background: rgba(var(--nx-danger-rgb), 0.12); color: rgb(var(--nx-danger-rgb)); }
.nux-notif-panel-item.tone-accent .nux-notif-panel-item-icon { background: rgba(var(--app-accent-rgb), 0.11); color: rgb(var(--app-accent-rgb)); }
.nux-notif-panel-item.tone-neutral .nux-notif-panel-item-icon { background: var(--nx-bg-muted); color: var(--nx-text-secondary); }
.nux-notif-panel-item-body { flex: 1; min-width: 0; }
.nux-notif-panel-item-title {
  font-size: var(--nx-text-sm); font-weight: 600; color: var(--nx-text-heading);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.nux-notif-panel-item-content {
  font-size: var(--nx-text-xs); color: var(--nx-text-secondary); margin-top: 2px; line-height: 1.4;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.nux-notif-panel-item-time { font-size: var(--nx-text-xs); color: var(--nx-text-muted); margin-top: 4px; }
.nux-notif-panel-item-actions { flex-shrink: 0; display: flex; align-items: center; }
.nux-notif-panel-item-delete {
  border: none; background: transparent; color: var(--nx-text-muted); cursor: pointer;
  width: 36px; height: 36px; border-radius: var(--nx-radius-sm);
  font-size: var(--nx-text-sm); opacity: 0;
  transition: opacity var(--nx-transition-fast), color var(--nx-transition-fast), background var(--nx-transition-fast);
}
@media (hover: none) and (pointer: coarse) {
  .nux-notif-panel-item-delete { width: 44px; height: 44px; }
}
.nux-notif-panel-item:hover .nux-notif-panel-item-delete { opacity: 1; }
.nux-notif-panel-item-delete:hover { color: var(--nx-danger); background: rgba(var(--nx-danger-rgb), 0.1); }
.nux-notif-panel-item-delete:focus-visible { opacity: 1; outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 1px; }
.nux-notif-panel-item-delete.is-confirm {
  opacity: 1; width: auto; min-width: 64px; padding: 0 var(--nx-space-3);
  background: var(--nx-danger); color: var(--nx-text-on-accent); font-weight: 600;
}
.nux-notif-panel-dot {
  position: absolute; top: var(--nx-space-4); right: var(--nx-space-4);
  width: 8px; height: 8px; border-radius: var(--nx-radius-full); background: var(--nx-danger);
}
.nux-notif-panel-footer { margin-top: var(--nx-space-6); text-align: center; }
.nux-notif-panel-pages { display: inline-flex; align-items: center; gap: var(--nx-space-3); }
.nux-notif-panel-page-btn {
  border: 1px solid var(--nx-border); background: var(--nx-bg-elevated); cursor: pointer;
  width: 36px; height: 36px; border-radius: var(--nx-radius-md);
  color: var(--nx-text-secondary); font-size: var(--nx-text-sm); transition: all var(--nx-transition-fast);
}
.nux-notif-panel-page-btn:hover:not(:disabled) { border-color: var(--nx-text-accent); color: var(--nx-text-accent); }
.nux-notif-panel-page-btn:disabled { opacity: 0.4; cursor: default; }
.nux-notif-panel-page-btn:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 2px; }
@media (hover: none) and (pointer: coarse) {
  .nux-notif-panel-page-btn { width: 44px; height: 44px; }
}
.nux-notif-panel-page-info { font-size: var(--nx-text-sm); color: var(--nx-text-muted); }@media (max-width: 768px){
  .nux-notif-panel-page { padding: var(--nx-space-4); }
  .nux-notif-panel-title { font-size: var(--nx-text-lg); }
  .nux-notif-panel-item { padding: var(--nx-space-3); }
  .nux-notif-panel-item-delete { opacity: 1; }
}

.nx-empty-state {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: var(--nx-space-12) var(--nx-space-6);
  text-align: center;
}
.nx-empty-state i {
  font-size: 40px;
  margin-bottom: var(--nx-space-4);
  color: var(--nx-text-muted);
}
.nx-empty-state h3 {
  font-size: var(--nx-text-base);
  color: var(--nx-text-secondary);
  margin-bottom: var(--nx-space-2);
}
.nx-empty-state p {
  font-size: var(--nx-text-sm);
  color: var(--nx-text-muted);
}
.nx-empty-state .nx-empty-hint {
  font-size: var(--nx-text-xs);
  color: var(--nx-text-muted);
  margin-top: var(--nx-space-1);
}
.nx-empty-actions {
  display: flex;
  gap: var(--nx-space-3);
  margin-top: var(--nx-space-4);
  flex-wrap: wrap;
  justify-content: center;
}

.nux-undo-toast {
  position: fixed; left: 50%; transform: translateX(-50%);
  bottom: calc(var(--nux-undo-bottom, 88px) + var(--nx-safe-bottom));
  z-index: var(--nx-z-topmost);
  display: flex; align-items: center; gap: 14px;
  padding: 10px 14px 10px 18px;
  background: var(--nx-undo-bg, #475569);
  border-radius: 999px;
  box-shadow: var(--nx-shadow-lg);
  max-width: calc(100vw - 24px);
}
.nux-undo-toast.raised {
  bottom: calc(var(--nux-undo-bottom, 88px) + 66px + var(--nx-safe-bottom));
}
.nux-undo-text {
  font-size: 13px; color: var(--nx-text-on-accent);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.nux-undo-btn {
  background: var(--nx-undo-btn-bg, #ffffff); color: var(--nx-undo-bg, #475569);
  border: none; border-radius: 999px;
  padding: 5px 16px; font-size: 13px; font-weight: 700;
  cursor: pointer; flex-shrink: 0;
}
.nux-undo-btn:active { transform: scale(0.95); }

.nux-selection-bar {
  position: fixed; left: 50%; transform: translateX(-50%);
  bottom: calc(var(--nux-undo-bottom, 88px) + var(--nx-safe-bottom));
  z-index: var(--nx-z-topmost);
  display: flex; align-items: center; gap: 12px;
  padding: 8px 12px 8px 18px;
  background: var(--nx-bg-surface, #ffffff);
  border: 1.5px solid rgba(var(--app-accent-rgb), 0.35);
  border-radius: 999px;
  box-shadow: 0 12px 32px rgba(31, 78, 121, 0.28);
  max-width: calc(100vw - 24px);
}
.nux-selection-count {
  font-size: 14px; font-weight: 700;
  color: var(--app-accent, #6366f1); white-space: nowrap;
}
.nux-selection-actions { display: flex; align-items: center; gap: 8px; }
.nux-selection-clear {
  background: none; border: none;
  color: var(--nx-text-secondary, #64748b);
  font-size: 13px; cursor: pointer; padding: 6px 8px;
  white-space: nowrap;
}

.nux-undo-enter-active, .nux-undo-leave-active { transition: opacity 0.2s ease, transform 0.2s ease; }
.nux-undo-enter-from, .nux-undo-leave-to { opacity: 0; transform: translateX(-50%) translateY(12px); }


/* ===== AI 生成标识 ===== */
.nx-ai-badge {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  vertical-align: middle;
  font-weight: 500;
  letter-spacing: 0.03em;
  line-height: 1;
  border-radius: var(--nx-radius-sm, 4px);
  white-space: nowrap;
}
.nx-ai-badge-sm { font-size: 0.6875rem; padding: 2px 6px; }
.nx-ai-badge-md { font-size: 0.75rem; padding: 3px 8px; }
.nx-ai-badge[data-tone="accent"] {
  background: var(--nx-accent-soft, rgba(79, 70, 229, 0.1));
  color: var(--nx-accent, rgb(79, 70, 229));
}
.nx-ai-badge[data-tone="slate"] {
  background: var(--nx-border, rgba(100, 116, 139, 0.14));
  color: var(--nx-text-secondary, rgb(100, 116, 139));
}
.nx-ai-badge-icon { flex: 0 0 auto; }
.nx-ai-badge-text { display: inline-block; }

/* ===== 标准应用启动加载 ===== */
.nx-app-loading-done { opacity: 0 !important; transition: opacity 0.3s ease; }

/* ===== AI 流式指示器 ===== */
.nux-ai-indicator {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 10px 16px;
  border-radius: var(--nx-radius-md, 12px);
  color: var(--nx-text-secondary, rgb(100, 116, 139));
  font-size: 0.875rem;
  background: var(--nx-bg-muted, rgb(241, 245, 249));
}
.nux-ai-indicator-dots {
  display: inline-flex;
  align-items: flex-end;
  gap: 3px;
  height: 14px;
}
.nux-ai-indicator-dots i {
  display: inline-block;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--nx-primary, rgb(14, 165, 233));
  animation: nuxAiBounce 1.2s infinite ease-in-out;
}
.nux-ai-indicator-dots i:nth-child(2) { animation-delay: 0.15s; }
.nux-ai-indicator-dots i:nth-child(3) { animation-delay: 0.3s; }
@keyframes nuxAiBounce {
  0%, 60%, 100% { transform: translateY(0); opacity: 0.45; }
  30% { transform: translateY(-4px); opacity: 1; }
}
.nux-ai-indicator-text { white-space: nowrap; }@keyframes nuxExportSpin { to { transform: rotate(360deg); } }/* ===== 骨架屏 preset（list / cards / gallery / report） ===== */
.nux-skeleton-report {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: var(--nx-space-3);
}
.nux-skeleton-report-title {
  height: 22px;
  width: 46%;
  border-radius: var(--nx-radius-sm);
  background: linear-gradient(90deg, var(--nx-bg-muted) 25%, var(--nx-bg-hover) 50%, var(--nx-bg-muted) 75%);
  background-size: 200% 100%;
  animation: nx-skeleton-pulse 1.5s ease-in-out infinite;
}
.nux-skeleton-report-sub {
  height: 12px;
  width: 28%;
  border-radius: var(--nx-radius-sm);
  background: linear-gradient(90deg, var(--nx-bg-muted) 25%, var(--nx-bg-hover) 50%, var(--nx-bg-muted) 75%);
  background-size: 200% 100%;
  animation: nx-skeleton-pulse 1.5s ease-in-out infinite;
}
.nux-skeleton-report-block {
  height: 140px;
  border-radius: var(--nx-radius-lg);
  background: linear-gradient(90deg, var(--nx-bg-muted) 25%, var(--nx-bg-hover) 50%, var(--nx-bg-muted) 75%);
  background-size: 200% 100%;
  animation: nx-skeleton-pulse 1.5s ease-in-out infinite;
}
.nux-skeleton-grid-gallery { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
.nux-skeleton-cover-tall { height: 150px; }

/* ===== AI 长任务过程态 ===== */
.nux-ai-task {
  display: flex;
  flex-direction: column;
  gap: var(--nx-space-3);
  padding: var(--nx-space-5);
  border-radius: var(--nx-radius-lg);
  background: var(--nx-bg-surface);
  border: 1px solid var(--nx-border);
  box-shadow: var(--nx-shadow-sm);
}
.nux-ai-task.is-compact {
  gap: var(--nx-space-2);
  padding: var(--nx-space-3) var(--nx-space-4);
  box-shadow: none;
}
.nux-ai-task-head { display: flex; align-items: center; gap: var(--nx-space-3); min-width: 0; }
.nux-ai-task-spinner {
  flex: none;
  width: 15px;
  height: 15px;
  border: 2px solid var(--nx-border);
  border-top-color: var(--nx-primary);
  border-radius: 50%;
  animation: nx-spin 0.7s linear infinite;
}
.nux-ai-task-title {
  flex: 1;
  min-width: 0;
  font-size: var(--nx-text-base);
  font-weight: 600;
  color: var(--nx-text-heading);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.nux-ai-task-pct {
  flex: none;
  font-size: var(--nx-text-sm);
  font-weight: 600;
  color: var(--nx-text-secondary);
  font-variant-numeric: tabular-nums;
}
.nux-ai-task-stages {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--nx-space-2) var(--nx-space-4);
}
.nux-ai-task-stage {
  display: inline-flex;
  align-items: center;
  gap: var(--nx-space-2);
  min-width: 0;
  font-size: var(--nx-text-sm);
  color: var(--nx-text-muted);
}
.nux-ai-task-dot {
  position: relative;
  flex: none;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  border: 1.5px solid var(--nx-border-hover);
  background: var(--nx-bg-muted);
  box-sizing: border-box;
}
.nux-ai-task-stage.is-active .nux-ai-task-dot {
  border-color: var(--nx-primary);
  background: var(--nx-primary);
  animation: nux-ai-task-pulse 1.4s ease-in-out infinite;
}
.nux-ai-task-stage.is-active .nux-ai-task-stage-label {
  color: var(--nx-text-heading);
  font-weight: 500;
}
.nux-ai-task-stage.is-done .nux-ai-task-dot {
  border-color: var(--nx-success);
  background: var(--nx-success);
}
.nux-ai-task-stage.is-done .nux-ai-task-dot::after {
  content: "";
  position: absolute;
  left: 4px;
  top: 1.5px;
  width: 4px;
  height: 7.5px;
  border-right: 1.6px solid var(--nx-text-on-accent, #fff);
  border-bottom: 1.6px solid var(--nx-text-on-accent, #fff);
  transform: rotate(42deg);
}
@keyframes nux-ai-task-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.55; transform: scale(0.84); }
}
.nux-ai-task-bar {
  height: 6px;
  border-radius: var(--nx-radius-full);
  background: var(--nx-bg-muted);
  overflow: hidden;
}
.nux-ai-task-bar-val {
  height: 100%;
  border-radius: inherit;
  background: var(--nx-primary);
  transition: width var(--nx-transition-slow);
}
.nux-ai-task-msg { margin: 0; font-size: var(--nx-text-sm); color: var(--nx-text-secondary); line-height: 1.5; }
.nux-ai-task-findings { margin: var(--nx-space-2) 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 4px; }
.nux-ai-task-finding { display: flex; align-items: baseline; gap: 6px; font-size: var(--nx-text-sm); color: var(--nx-text-secondary); line-height: 1.5; }
.nux-ai-task-finding.is-done { color: var(--nx-text-primary); }
.nux-ai-task-finding-mark { flex: none; color: var(--nx-success, #10b981); font-size: 12px; }
.nux-ai-task-finding.is-done .nux-ai-task-finding-mark { color: var(--nx-success, #10b981); }
.nux-ai-task-finding-text { min-width: 0; }

.nux-ai-task-foot { display: flex; align-items: center; gap: var(--nx-space-2); }@media (prefers-reduced-motion: reduce){
  .nux-ai-task-spinner { animation: none; }
  .nux-ai-task-stage.is-active .nux-ai-task-dot { animation: none; }
  .nux-ai-task-bar-val { transition: none; }
}

/* ===== AI 生成内容显式标识条 ===== */
.nux-ai-notice {
  display: flex;
  align-items: center;
  gap: var(--nx-space-3);
  flex-wrap: wrap;
  padding: var(--nx-space-2) var(--nx-space-3);
  border-radius: var(--nx-radius-md);
  background: var(--nx-bg-muted);
  border: 1px solid var(--nx-border);
  font-size: var(--nx-text-xs);
  color: var(--nx-text-secondary);
}
.nux-ai-notice[data-tone="accent"] {
  background: rgba(var(--app-accent-rgb), 0.07);
  border-color: var(--nx-border-accent);
}
.nux-ai-notice.is-sm { padding: var(--nx-space-1) var(--nx-space-2); }
.nux-ai-notice.is-lg { padding: var(--nx-space-3) var(--nx-space-4); font-size: var(--nx-text-sm); }
.nux-ai-notice-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  flex: none;
  padding: 3px 8px;
  border-radius: var(--nx-radius-sm);
  background: rgba(var(--app-accent-rgb), 0.12);
  color: var(--nx-text-accent);
  font-weight: 500;
  letter-spacing: 0.03em;
  white-space: nowrap;
}
.nux-ai-notice[data-tone="slate"] { background: var(--nx-bg-muted); border-color: var(--nx-border); }
.nux-ai-notice[data-tone="slate"] .nux-ai-notice-badge {
  background: var(--nx-border);
  color: var(--nx-text-secondary);
}
.nux-ai-notice-glyph { flex: none; }
.nux-ai-notice-note { flex: 1; min-width: 0; line-height: 1.5; }
.nux-ai-notice-actions {
  display: inline-flex;
  align-items: center;
  gap: var(--nx-space-2);
  margin-left: auto;
  flex: none;
}


/* 通知面板：时间分组 / 来源徽标 / 岗位迷你卡 / 应用静音区 */
.nux-notif-group-label {
  font-size: var(--nx-text-xs); font-weight: 600; color: var(--nx-text-muted);
  margin: var(--nx-space-4) var(--nx-space-2) var(--nx-space-2);
}
.nux-notif-panel-item-meta {
  display: flex; align-items: center; gap: var(--nx-space-2); margin-top: 4px;
}
.nux-notif-app-tag {
  font-size: 11px; line-height: 1; padding: 3px 7px; border-radius: var(--nx-radius-full);
  background: var(--nx-bg-muted); color: var(--nx-text-secondary); white-space: nowrap;
}
.nux-notif-panel-item-time { margin-top: 0; }
.nux-notif-jobs { margin-top: var(--nx-space-2); display: flex; flex-direction: column; gap: 4px; }
.nux-notif-job {
  display: flex; align-items: center; justify-content: space-between; gap: var(--nx-space-2);
  width: 100%; text-align: left; border: none; cursor: pointer;
  background: var(--nx-bg-muted); color: var(--nx-text-secondary);
  font-size: var(--nx-text-xs); padding: 6px 10px; border-radius: var(--nx-radius-sm);
  transition: background var(--nx-transition-fast), color var(--nx-transition-fast);
}
.nux-notif-job:hover { background: var(--nx-bg-hover); color: var(--nx-text-heading); }
.nux-notif-job-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nux-notif-job i, .nux-notif-more i { font-size: 10px; color: var(--nx-text-muted); flex-shrink: 0; }
.nux-notif-more {
  display: inline-flex; align-items: center; gap: 4px; align-self: flex-start;
  border: none; background: transparent; cursor: pointer;
  color: var(--nx-text-accent); font-size: var(--nx-text-xs); padding: 4px 2px;
}
.nux-notif-more:hover { text-decoration: underline; }
.nux-notif-more i { color: var(--nx-text-accent); }
.nux-notif-mute { border-top: 1px solid var(--nx-border); margin-top: var(--nx-space-4); }
.nux-notif-mute-head {
  display: flex; align-items: center; gap: var(--nx-space-2); width: 100%;
  border: none; background: transparent; cursor: pointer;
  color: var(--nx-text-muted); font-size: var(--nx-text-sm); font-weight: 600;
  padding: var(--nx-space-3) var(--nx-space-2);
}
.nux-notif-mute-head:hover { color: var(--nx-text-secondary); }
.nux-notif-mute-head i:last-child { margin-left: auto; font-size: 11px; }
.nux-notif-mute-list { display: flex; flex-direction: column; gap: 2px; padding-bottom: var(--nx-space-2); }
.nux-notif-mute-row {
  display: flex; align-items: center; justify-content: space-between;
  font-size: var(--nx-text-sm); color: var(--nx-text-secondary); padding: 2px var(--nx-space-2);
}
.nux-notif-mute-toggle {
  border: 1px solid var(--nx-border); background: var(--nx-bg-surface); cursor: pointer;
  color: var(--nx-text-accent); font-size: var(--nx-text-xs);
  padding: 5px 12px; border-radius: var(--nx-radius-full); min-height: 28px;
  transition: all var(--nx-transition-fast);
}
.nux-notif-mute-toggle.is-muted {
  color: var(--nx-text-muted); background: var(--nx-bg-muted); border-color: transparent;
}
.nux-notif-mute-hint {
  font-size: 11px; color: var(--nx-text-muted); margin: var(--nx-space-2) var(--nx-space-2) 0;
}
@media (max-width: 768px){
  .nux-notif-job { padding: 10px 12px; }
  .nux-notif-mute-toggle { padding: 8px 16px; }
}

/* ===== nexus-components-checkin.css ===== */
.nux-checkin { display: flex; flex-direction: column; gap: var(--nx-space-4); }

.nux-checkin-skeleton { display: flex; flex-direction: column; gap: var(--nx-space-3); padding: var(--nx-space-4) 0; }

.nux-checkin-error {
  display: flex; align-items: center; gap: var(--nx-space-2);
  padding: var(--nx-space-3); font-size: var(--nx-text-sm);
  color: var(--nx-danger); background: rgba(var(--nx-danger-rgb), 0.08);
  border: 1px solid rgba(var(--nx-danger-rgb), 0.2); border-radius: var(--nx-radius-md);
}

.nux-checkin-streak {
  position: relative; display: flex; align-items: center; gap: var(--nx-space-4);
  padding: var(--nx-space-5); overflow: hidden;
  background: linear-gradient(135deg, color-mix(in srgb, var(--app-accent, var(--nx-primary)) 12%, var(--nx-bg-surface)), var(--nx-bg-surface));
  border: 1px solid var(--nx-border); border-radius: var(--nx-radius-xl);
}
.nux-checkin-streak-icon {
  display: flex; align-items: center; justify-content: center;
  width: 56px; height: 56px; flex-shrink: 0;
  font-size: 30px; border-radius: var(--nx-radius-lg);
  background: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 15%, transparent);
}
.nux-checkin-streak-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.nux-checkin-streak-num { font-size: var(--nx-text-3xl); font-weight: 800; line-height: 1.1; color: var(--nx-text-heading); }
.nux-checkin-streak-num span { font-size: var(--nx-text-sm); font-weight: 500; color: var(--nx-text-secondary); margin-left: 2px; }
.nux-checkin-streak-label { display: flex; align-items: center; gap: 4px; font-size: var(--nx-text-sm); color: var(--nx-text-secondary); }
.nux-checkin-streak-label .trend { font-style: normal; font-weight: 700; }
.nux-checkin-streak-label .trend.up { color: var(--nx-success); }
.nux-checkin-streak-label .trend.down { color: var(--nx-danger); }
.nux-checkin-mile { display: inline-flex; align-items: center; gap: 4px; font-size: var(--nx-text-xs); color: var(--nx-text-muted); }
.nux-checkin-mile .medal { font-size: 14px; line-height: 1; }
.nux-checkin-streak-shields {
  position: absolute; top: var(--nx-space-3); right: var(--nx-space-3);
  display: inline-flex; align-items: center; gap: 4px;
  padding: 2px 10px; font-size: var(--nx-text-xs); font-weight: 600;
  color: var(--nx-info); background: rgba(var(--nx-info-rgb), 0.12);
  border-radius: var(--nx-radius-full);
}
.nux-checkin-streak.celebrating .nux-checkin-streak-icon { animation: nux-checkin-pop 0.6s ease; }

.nux-checkin-overview {
  display: flex; justify-content: space-around; gap: var(--nx-space-3);
  padding: var(--nx-space-4); background: var(--nx-bg-surface);
  border: 1px solid var(--nx-border); border-radius: var(--nx-radius-lg);
}
.nux-checkin-ov { display: flex; flex-direction: column; align-items: center; gap: 2px; }
.nux-checkin-ov b { font-size: var(--nx-text-xl); font-weight: 700; color: var(--app-accent, var(--nx-primary)); }
.nux-checkin-ov span { font-size: var(--nx-text-xs); color: var(--nx-text-muted); }

.nux-checkin-task { padding: var(--nx-space-5); }
.nux-checkin-task-head { margin-bottom: var(--nx-space-3); }
.nux-checkin-task-title { display: flex; align-items: center; gap: var(--nx-space-2); font-size: var(--nx-text-lg); font-weight: 600; color: var(--nx-text-heading); flex-wrap: wrap; }
.nux-checkin-badge-type {
  padding: 1px 8px; font-size: var(--nx-text-xs); font-weight: 600;
  color: var(--app-accent, var(--nx-primary));
  background: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 12%, transparent);
  border-radius: var(--nx-radius-full);
}
.nux-checkin-task-desc { margin: var(--nx-space-2) 0 0; font-size: var(--nx-text-sm); color: var(--nx-text-secondary); }

.nux-checkin-progress { margin-bottom: var(--nx-space-3); }
.nux-checkin-progress-bar { height: 8px; overflow: hidden; background: var(--nx-bg-muted); border-radius: var(--nx-radius-full); }
.nux-checkin-progress-fill { height: 100%; border-radius: var(--nx-radius-full); transition: width var(--nx-transition-base); }
.nux-checkin-progress-info { display: flex; gap: 4px; justify-content: flex-end; margin-top: 4px; font-size: var(--nx-text-sm); font-weight: 600; color: var(--nx-text-heading); }
.nux-checkin-progress-info .sep { color: var(--nx-text-muted); font-weight: 400; }

.nux-checkin-done {
  display: flex; align-items: center; gap: var(--nx-space-2);
  padding: var(--nx-space-3); font-size: var(--nx-text-sm); font-weight: 500;
  color: var(--nx-success); background: rgba(var(--nx-success-rgb), 0.1);
  border: 1px solid rgba(var(--nx-success-rgb), 0.25); border-radius: var(--nx-radius-md);
}

.nux-checkin-action { display: flex; flex-direction: column; gap: var(--nx-space-3); }
.nux-checkin-entry { display: flex; flex-direction: column; gap: var(--nx-space-3); }
.nux-checkin-picker { display: flex; align-items: center; gap: var(--nx-space-4); justify-content: center; padding: var(--nx-space-3) 0; }
.nux-checkin-step {
  width: 52px; height: 52px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: var(--nx-text-xl); font-weight: 700;
  color: var(--app-accent, var(--nx-primary)); background: var(--nx-bg-muted);
  border: none; border-radius: var(--nx-radius-lg); cursor: pointer;
  transition: background var(--nx-transition-fast), transform var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nux-checkin-step:active { transform: scale(0.94); background: var(--nx-bg-hover); }
.nux-checkin-display { min-width: 96px; text-align: center; }
.nux-checkin-display .num { font-size: var(--nx-text-3xl); font-weight: 800; color: var(--nx-text-heading); line-height: 1.1; }
.nux-checkin-display .tgt { font-size: var(--nx-text-xs); color: var(--nx-text-muted); }
.nux-checkin-presets { display: flex; gap: var(--nx-space-2); flex-wrap: wrap; justify-content: center; }
.nux-checkin-preset {
  padding: 6px 14px; font-size: var(--nx-text-sm);
  color: var(--nx-text-secondary); background: var(--nx-bg-muted);
  border: 1px solid transparent; border-radius: var(--nx-radius-full); cursor: pointer;
  transition: all var(--nx-transition-fast);
}
.nux-checkin-preset.active { color: #fff; background: var(--app-accent, var(--nx-primary)); border-color: var(--app-accent, var(--nx-primary)); }
.nux-checkin-textarea {
  width: 100%; min-height: 92px; padding: var(--nx-space-3);
  font-size: var(--nx-text-sm); line-height: var(--nx-leading); color: var(--nx-text-body);
  background: var(--nx-bg-base); border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md); outline: none; box-sizing: border-box;
  resize: vertical; transition: border-color var(--nx-transition-fast);
}
.nux-checkin-textarea:focus { border-color: var(--app-accent, var(--nx-primary)); }
.nux-checkin-text-counter { text-align: right; font-size: var(--nx-text-xs); color: var(--nx-text-muted); }
.nux-checkin-text-counter b { color: var(--app-accent, var(--nx-primary)); font-weight: 600; }

.nux-checkin-primary {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--nx-space-2);
  padding: 12px 20px; font-size: var(--nx-text-base); font-weight: 600;
  color: var(--nx-text-on-accent); background: var(--app-accent, var(--nx-primary));
  border: none; border-radius: var(--nx-radius-md); cursor: pointer;
  box-shadow: var(--nx-shadow-sm);
  transition: filter var(--nx-transition-fast), transform var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nux-checkin-primary:disabled { opacity: 0.6; cursor: not-allowed; }
.nux-checkin-primary:not(:disabled):active { transform: scale(0.98); }
.nux-checkin-primary:not(:disabled):hover { filter: brightness(1.08); }
.nux-checkin-mini {
  padding: 8px 12px; font-size: var(--nx-text-xs);
  color: var(--nx-text-muted); background: transparent;
  border: 1px dashed var(--nx-border-hover); border-radius: var(--nx-radius-md); cursor: pointer;
  transition: all var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nux-checkin-mini:disabled { opacity: 0.6; cursor: not-allowed; }
.nux-checkin-mini:not(:disabled):hover { color: var(--app-accent, var(--nx-primary)); border-color: var(--app-accent, var(--nx-primary)); }

.nux-checkin-safety {
  display: flex; align-items: center; gap: var(--nx-space-2); flex-wrap: wrap;
  padding: var(--nx-space-3) var(--nx-space-4); font-size: var(--nx-text-sm);
  color: var(--nx-text-secondary); background: var(--nx-bg-surface);
  border: 1px solid var(--nx-border); border-radius: var(--nx-radius-lg);
}
.nux-checkin-safety i { color: var(--nx-warning); }
.nux-checkin-sub {
  display: inline-flex; align-items: center; gap: 4px; margin-left: auto;
  padding: 4px 12px; font-size: var(--nx-text-xs); font-weight: 500;
  color: var(--app-accent, var(--nx-primary)); background: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 10%, transparent);
  border: 1px solid transparent; border-radius: var(--nx-radius-full); cursor: pointer;
}

.nux-checkin-calendar { padding: var(--nx-space-5); background: var(--nx-bg-surface); border: 1px solid var(--nx-border); border-radius: var(--nx-radius-xl); }
.nux-checkin-cal-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--nx-space-4); font-size: var(--nx-text-base); font-weight: 600; color: var(--nx-text-heading); }
.nux-checkin-cal-head .legend { display: flex; align-items: center; gap: 8px; font-size: var(--nx-text-xs); font-weight: 400; color: var(--nx-text-muted); }
.nux-checkin-cal-head .legend em { display: inline-block; width: 8px; height: 8px; border-radius: 50%; font-style: normal; margin-right: 3px; }
.nux-checkin-cal-head .legend em.d { background: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 30%, var(--nx-bg-muted)); }
.nux-checkin-cal-head .legend em.f { background: rgba(var(--nx-info-rgb), 0.4); }
.nux-checkin-cal-head .legend em.m { background: rgba(var(--nx-success-rgb), 0.5); }
.nux-checkin-cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
.nux-checkin-cell {
  position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px;
  height: 44px; padding: 0; font-size: var(--nx-text-xs); color: var(--nx-text-secondary);
  background: var(--nx-bg-muted); border: none; border-radius: var(--nx-radius-md);
  cursor: pointer; transition: all var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent; box-sizing: border-box;
}
.nux-checkin-cell .st { font-size: 13px; line-height: 1; }
.nux-checkin-cell:disabled { cursor: default; }
.nux-checkin-cell.done { color: var(--app-accent, var(--nx-primary)); background: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 22%, transparent); font-weight: 600; }
.nux-checkin-cell.frozen { color: var(--nx-info); background: rgba(var(--nx-info-rgb), 0.14); }
.nux-checkin-cell.mended { color: var(--nx-success); background: rgba(var(--nx-success-rgb), 0.18); }
.nux-checkin-cell.missed { color: var(--nx-text-muted); background: var(--nx-bg-muted); }
.nux-checkin-cell.future { color: var(--nx-text-muted); background: transparent; }
.nux-checkin-cell.today { box-shadow: inset 0 0 0 2px var(--app-accent, var(--nx-primary)); font-weight: 700; }
.nux-checkin-cell:not(:disabled):active { transform: scale(0.92); }
.nux-checkin-cal-actions { display: flex; gap: var(--nx-space-2); margin-top: var(--nx-space-4); flex-wrap: wrap; }
.nux-checkin-ghost {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 8px 16px; font-size: var(--nx-text-sm); font-weight: 500;
  color: var(--nx-text-secondary); background: transparent;
  border: 1px solid var(--nx-border); border-radius: var(--nx-radius-md); cursor: pointer;
  transition: all var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nux-checkin-ghost:hover { color: var(--app-accent, var(--nx-primary)); border-color: var(--app-accent, var(--nx-primary)); }
.nux-checkin-ghost.success { color: var(--nx-success); border-color: rgba(var(--nx-success-rgb), 0.4); }
.nux-checkin-ghost.success:hover { background: rgba(var(--nx-success-rgb), 0.08); }

@keyframes nux-checkin-pop {
  0% { transform: scale(1); }
  40% { transform: scale(1.25) rotate(-6deg); }
  100% { transform: scale(1); }
}

@media (max-width: 768px) {
  .nux-checkin-streak { padding: var(--nx-space-4); gap: var(--nx-space-3); }
  .nux-checkin-streak-icon { width: 48px; height: 48px; font-size: 26px; }
  .nux-checkin-streak-num { font-size: var(--nx-text-2xl); }
  .nux-checkin-task { padding: var(--nx-space-4); }
  .nux-checkin-picker { gap: var(--nx-space-3); }
  .nux-checkin-step { width: 46px; height: 46px; }
  .nux-checkin-calendar { padding: var(--nx-space-4); }
  .nux-checkin-cell { height: 40px; }
  .nux-checkin-cal-head .legend { display: none; }
  .nux-checkin-sub { margin-left: 0; }
}

/* ===== nexus-components-calendar.css ===== */
.nux-calendar {
  --cal-accent: var(--app-accent, var(--nx-primary));
  --cal-l1: color-mix(in srgb, var(--cal-accent) 14%, var(--nx-bg-muted));
  --cal-l2: color-mix(in srgb, var(--cal-accent) 36%, var(--nx-bg-muted));
  --cal-l3: color-mix(in srgb, var(--cal-accent) 62%, var(--nx-bg-muted));
  --cal-l4: color-mix(in srgb, var(--cal-accent) 86%, var(--nx-bg-muted));
  --cal-l5: var(--cal-accent);
  font-variant-numeric: tabular-nums;
  -webkit-tap-highlight-color: transparent;
}

.nux-cal-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--nx-space-3);
}

.nux-cal-title {
  display: flex;
  align-items: center;
  gap: var(--nx-space-2);
}

.nux-cal-month {
  font-size: 1.0625rem;
  font-weight: 700;
  color: var(--nx-text-heading);
  min-width: 108px;
  text-align: center;
}

.nux-cal-nav {
  width: 32px;
  height: 32px;
  border: none;
  border-radius: var(--nx-radius-full);
  background: var(--nx-bg-muted);
  color: var(--nx-text-body);
  font-size: 18px;
  line-height: 1;
  cursor: pointer;
  transition: background 0.15s, transform 0.1s;
}

.nux-cal-nav:hover { background: var(--nx-bg-hover); }
.nux-cal-nav:active { transform: scale(0.92); }

.nux-cal-today-btn {
  height: 32px;
  padding: 0 14px;
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-full);
  background: var(--nx-bg-surface);
  color: var(--cal-accent);
  font-size: var(--nx-text-sm);
  font-weight: 600;
  cursor: pointer;
  transition: border-color 0.15s, background 0.15s;
}

.nux-cal-today-btn:hover { border-color: var(--cal-accent); background: color-mix(in srgb, var(--cal-accent) 6%, var(--nx-bg-surface)); }

.nux-cal-weeks {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  margin-bottom: 4px;
}

.nux-cal-weeks span {
  text-align: center;
  font-size: var(--nx-text-xs);
  color: var(--nx-text-muted);
  font-weight: 600;
}

.nux-cal-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 4px;
}

.nux-cal-cell {
  position: relative;
  aspect-ratio: 1;
  max-height: 46px;
  border: none;
  border-radius: var(--nx-radius-md);
  background: transparent;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 1px;
  cursor: pointer;
  transition: transform 0.12s, box-shadow 0.15s;
}

.nux-cal-cell:disabled { cursor: default; }
.nux-cal-cell:not(:disabled):hover { transform: scale(1.06); z-index: 1; }
.nux-cal-cell:not(:disabled):active { transform: scale(0.94); }

.nux-cal-num {
  font-size: var(--nx-text-sm);
  font-weight: 600;
  color: var(--nx-text-body);
  line-height: 1;
}

.nux-cal-cell.empty .nux-cal-num { visibility: hidden; }

.nux-cal-cell.level-0 { background: var(--nx-bg-muted); }
.nux-cal-cell.level-0 .nux-cal-num { color: var(--nx-text-secondary); }
.nux-cal-cell.level-1 { background: var(--cal-l1); }
.nux-cal-cell.level-2 { background: var(--cal-l2); }
.nux-cal-cell.level-3 { background: var(--cal-l3); }
.nux-cal-cell.level-4 { background: var(--cal-l4); }
.nux-cal-cell.level-2 .nux-cal-num,
.nux-cal-cell.level-3 .nux-cal-num,
.nux-cal-cell.level-4 .nux-cal-num { color: var(--nx-text-heading); }

.nux-cal-cell.today {
  box-shadow: inset 0 0 0 2px var(--cal-accent);
}

.nux-cal-cell.selected {
  background: var(--cal-l5);
  box-shadow: 0 4px 12px color-mix(in srgb, var(--cal-accent) 35%, transparent);
}

.nux-cal-cell.selected .nux-cal-num { color: var(--nx-text-on-accent, #fff); }

.nux-cal-count {
  position: absolute;
  top: 3px;
  right: 3px;
  min-width: 14px;
  height: 14px;
  padding: 0 3px;
  border-radius: var(--nx-radius-full);
  background: var(--cal-accent);
  color: var(--nx-text-on-accent, #fff);
  font-size: 9px;
  font-weight: 700;
  line-height: 14px;
  text-align: center;
}

.nux-cal-cell.selected .nux-cal-count { background: rgba(255, 255, 255, 0.85); color: var(--cal-accent); }

.nux-cal-cell.seq.done { background: rgba(var(--nx-success-rgb), 0.16); }
.nux-cal-cell.seq.done .nux-cal-mark { color: var(--nx-success); }
.nux-cal-cell.seq.frozen { background: rgba(var(--nx-info-rgb), 0.14); }
.nux-cal-cell.seq.frozen .nux-cal-mark { color: var(--nx-info); }
.nux-cal-cell.seq.mended { background: rgba(var(--nx-warning-rgb), 0.18); }
.nux-cal-cell.seq.mended .nux-cal-mark { color: var(--nx-warning); }
.nux-cal-cell.seq.missed { background: var(--nx-bg-muted); }
.nux-cal-cell.seq.missed .nux-cal-mark { color: var(--nx-text-muted); }
.nux-cal-cell.seq.future .nux-cal-num { color: var(--nx-text-muted); }

.nux-cal-mark {
  font-size: 11px;
  line-height: 1;
  color: var(--nx-text-secondary);
}

.nux-cal-heat-scroll {
  overflow-x: auto;
  padding-bottom: 4px;
}

.nux-cal-heat { position: relative; width: 100%; }

.nux-cal-heat-months {
  position: relative;
  height: 18px;
  margin-left: 26px;
}

.nux-cal-heat-month {
  position: absolute;
  top: 0;
  font-size: 11px;
  color: var(--nx-text-muted);
  font-weight: 600;
  white-space: nowrap;
}

.nux-cal-heat-body {
  display: flex;
  gap: 4px;
}

.nux-cal-heat-wds {
  display: grid;
  grid-template-rows: repeat(7, var(--nux-heat-cell, 14px));
  gap: 2px;
  width: 22px;
}

.nux-cal-heat-wds span {
  font-size: 10px;
  color: var(--nx-text-muted);
  line-height: var(--nux-heat-cell, 14px);
}

.nux-cal-heat-grid {
  display: grid;
  grid-template-rows: repeat(7, var(--nux-heat-cell, 14px));
  grid-auto-flow: column;
  grid-auto-columns: var(--nux-heat-cell, 14px);
  gap: 2px;
}

.nux-cal-heat-cell {
  width: var(--nux-heat-cell, 14px);
  height: var(--nux-heat-cell, 14px);
  padding: 0;
  border: none;
  border-radius: max(3px, calc(var(--nux-heat-cell, 14px) / 5));
  cursor: pointer;
  transition: transform 0.12s;
}

.nux-cal-heat-cell:not(:disabled):hover { transform: scale(1.25); }
.nux-cal-heat-cell:disabled { cursor: default; }

.nux-cal-heat-cell.empty { background: transparent; }
.nux-cal-heat-cell.level-0 { background: var(--nx-bg-muted); }
.nux-cal-heat-cell.level-1 { background: var(--cal-l1); }
.nux-cal-heat-cell.level-2 { background: var(--cal-l2); }
.nux-cal-heat-cell.level-3 { background: var(--cal-l3); }
.nux-cal-heat-cell.level-4 { background: var(--cal-l5); }

.nux-cal-heat-empty {
  padding: var(--nx-space-6);
  text-align: center;
  color: var(--nx-text-muted);
  font-size: var(--nx-text-sm);
}

.nux-cal-legend {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 6px;
  margin-top: var(--nx-space-3);
  font-size: 11px;
  color: var(--nx-text-muted);
}

.nux-cal-legend .lg { display: inline-flex; align-items: center; gap: 4px; }

.nux-cal-legend .dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  display: inline-block;
}

.nux-cal-legend .dot.done { background: var(--nx-success); }
.nux-cal-legend .dot.frozen { background: var(--nx-info); }
.nux-cal-legend .dot.mended { background: var(--nx-warning); }
.nux-cal-legend .dot.missed { background: var(--nx-text-muted); }

.nux-cal-legend .sq {
  width: 10px;
  height: 10px;
  border-radius: 3px;
  display: inline-block;
}

.nux-cal-legend .sq.level-0 { background: var(--nx-bg-muted); }
.nux-cal-legend .sq.level-1 { background: var(--cal-l1); }
.nux-cal-legend .sq.level-2 { background: var(--cal-l2); }
.nux-cal-legend .sq.level-3 { background: var(--cal-l3); }
.nux-cal-legend .sq.level-4 { background: var(--cal-l5); }

.nux-cal-skeleton { display: grid; gap: var(--nx-space-3); }

.nux-cal-skeleton-grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 4px;
}

.nux-cal-sk-cell { aspect-ratio: 1; border-radius: var(--nx-radius-md); }

@media (prefers-reduced-motion: reduce) {
  .nux-cal-cell,
  .nux-cal-heat-cell,
  .nux-cal-nav { transition: none; }
}

@media (max-width: 768px) {
  .nux-cal-cell { max-height: 42px; border-radius: var(--nx-radius-sm); }
  .nux-cal-month { font-size: 1rem; min-width: 96px; }
  .nux-cal-count { min-width: 13px; height: 13px; font-size: 8px; line-height: 13px; top: 2px; right: 2px; }
  .nux-cal-heat-scroll { -webkit-overflow-scrolling: touch; }
  .nux-cal-legend { justify-content: center; }
}

@media (hover: none) and (pointer: coarse) {
  .nux-cal-nav { width: 44px; height: 44px; }
  .nux-cal-cell { min-height: 44px; }
}

/* ===== nexus-components-data.css ===== */
.nx-table {
  width: 100%;
  border-collapse: collapse;
}
.nx-table th {
  text-align: left;
  padding: var(--nx-space-3) var(--nx-space-4);
  font-size: var(--nx-text-xs);
  font-weight: 600;
  color: var(--nx-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  border-bottom: 1px solid var(--nx-border);
}
.nx-table td {
  padding: var(--nx-space-3) var(--nx-space-4);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-body);
  border-bottom: 1px solid var(--nx-border);
}
.nx-table tr:hover td { background: var(--nx-bg-hover); }

/* .nux-badge 是类工具（非组件）：JS 组件 <nux-badge> v2.50.0 下架（零元素消费），
   但 chroma 等应用以 class="nux-badge chip" 形式经 nexus-all.css 消费这些类。 */
.nux-badge { position: relative; display: inline-flex; }
.nux-badge-count {
  position: absolute;
  top: -6px;
  right: -6px;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  font-size: 11px;
  font-weight: 600;
  line-height: 18px;
  text-align: center;
  color: var(--nx-text-on-accent, #fff);
  background: var(--nx-danger);
  border-radius: 9px;
  box-sizing: border-box;
}
.nux-badge-dot {
  position: absolute;
  top: -2px;
  right: -2px;
  width: 8px;
  height: 8px;
  background: var(--nx-danger);
  border-radius: 50%;
}
.nux-badge-default .nux-badge-count,
.nux-badge-default .nux-badge-dot { background: var(--nx-text-secondary); }
.nux-badge-success .nux-badge-count,
.nux-badge-success .nux-badge-dot { background: var(--nx-success); }
.nux-badge-warning .nux-badge-count,
.nux-badge-warning .nux-badge-dot { background: var(--nx-warning); }
.nux-badge-info .nux-badge-count,
.nux-badge-info .nux-badge-dot { background: var(--app-accent, var(--nx-primary)); }

.nux-avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 15%, transparent);
  color: var(--app-accent, var(--nx-primary));
  font-weight: 600;
  overflow: hidden;
  flex-shrink: 0;
}
.nux-avatar-sm { width: 28px; height: 28px; font-size: 12px; }
.nux-avatar-md { width: 36px; height: 36px; font-size: 14px; }
.nux-avatar-lg { width: 48px; height: 48px; font-size: 18px; }
.nux-avatar-xl { width: 64px; height: 64px; font-size: 24px; }
.nux-avatar-square { border-radius: var(--nx-radius-md); }
.nux-avatar-img { width: 100%; height: 100%; object-fit: cover; }
.nux-avatar-icon { width: 60%; height: 60%; }
.nux-avatar-initial { user-select: none; }

.nux-stat-card {
  display: flex;
  align-items: center;
  gap: var(--nx-space-4);
  position: relative;
  overflow: hidden;
}
.nux-stat-icon { font-size: 28px; line-height: 1; flex-shrink: 0; }
.nux-stat-body { flex: 1; min-width: 0; }
.nux-stat-value {
  font-size: var(--nx-text-2xl);
  font-weight: 700;
  color: var(--nx-text-heading);
  line-height: 1.2;
  font-variant-numeric: tabular-nums;
}
.nux-stat-label { font-size: var(--nx-text-sm); color: var(--nx-text-secondary); margin-top: 2px; }
.nux-stat-sub { font-size: var(--nx-text-xs); color: var(--nx-text-muted); margin-top: 2px; }
.nux-stat-trend { font-size: var(--nx-text-sm); font-weight: 600; flex-shrink: 0; }
.nux-stat-trend-up { color: var(--nx-success); }
.nux-stat-trend-down { color: var(--nx-danger); }

.nux-tab-group {
  display: flex;
  gap: 2px;
  border-bottom: 2px solid var(--nx-border);
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.nux-tab-item {
  padding: var(--nx-space-2) var(--nx-space-4);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-secondary);
  background: none;
  border: none;
  cursor: pointer;
  white-space: nowrap;
  border-bottom: 2px solid transparent;
  margin-bottom: -2px;
  transition: color var(--nx-transition-fast), border-color var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nux-tab-item:hover { color: var(--nx-text-heading); }
.nux-tab-item.active {
  color: var(--app-accent, var(--nx-primary));
  border-bottom-color: var(--app-accent, var(--nx-primary));
  font-weight: 500;
}
.nux-tab-icon { margin-right: var(--nx-space-1); }@media (max-width: 768px){
  .nux-stat-card { padding: var(--nx-space-3); }
  .nux-stat-value { font-size: var(--nx-text-xl); }
  .nux-tab-item { padding: var(--nx-space-2) var(--nx-space-3); font-size: var(--nx-text-xs); }}

/* ===== nexus-components-insight.css ===== */
.nx-confidence {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  max-width: 100%;
  font-size: var(--nx-text-xs);
  line-height: 1.5;
  vertical-align: baseline;
}

.nx-confidence-dot {
  width: 8px;
  height: 8px;
  border-radius: var(--nx-radius-full, 9999px);
  flex-shrink: 0;
  background: var(--nx-text-muted);
}

.nx-confidence-word {
  font-weight: 700;
  white-space: nowrap;
}

.nx-confidence-pct {
  font-family: var(--nx-font-mono);
  font-size: 11px;
  opacity: 0.85;
}

.nx-confidence-note {
  color: var(--nx-text-secondary);
  font-weight: 400;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nx-confidence--badge {
  padding: 2px 9px;
  border-radius: 9999px;
  font-weight: 700;
}

.nx-confidence--danger { background: rgba(var(--nx-danger-rgb, 239, 68, 68), 0.1); color: var(--nx-danger); }
.nx-confidence--danger .nx-confidence-dot { background: var(--nx-danger); }
.nx-confidence--warning { background: rgba(var(--nx-warning-rgb, 245, 158, 11), 0.12); color: var(--nx-warning); }
.nx-confidence--warning .nx-confidence-dot { background: var(--nx-warning); }
.nx-confidence--accent { background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.1); color: var(--nx-primary); }
.nx-confidence--accent .nx-confidence-dot { background: var(--nx-primary); }
.nx-confidence--success { background: rgba(var(--nx-success-rgb, 16, 185, 129), 0.1); color: var(--nx-success); }
.nx-confidence--success .nx-confidence-dot { background: var(--nx-success); }
.nx-confidence--muted { background: var(--nx-bg-muted); color: var(--nx-text-secondary); }

.nx-confidence--warning .nx-confidence-note,
.nx-confidence--success .nx-confidence-note,
.nx-confidence--accent .nx-confidence-note {
  color: var(--nx-text-secondary);
}

.nx-confidence--band {
  width: 100%;
  padding: 8px 12px;
  border-radius: var(--nx-radius-sm, 6px);
  border-left: 3px solid var(--nx-text-muted);
  background: var(--nx-bg-muted);
  color: var(--nx-text-heading);
  font-weight: 400;
}

.nx-confidence--band .nx-confidence-word { color: inherit; }
.nx-confidence--band.nx-confidence--danger { border-left-color: var(--nx-danger); background: rgba(var(--nx-danger-rgb, 239, 68, 68), 0.08); }
.nx-confidence--band.nx-confidence--warning { border-left-color: var(--nx-warning); background: rgba(var(--nx-warning-rgb, 245, 158, 11), 0.08); }
.nx-confidence--band.nx-confidence--accent { border-left-color: var(--nx-primary); background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.06); }
.nx-confidence--band.nx-confidence--success { border-left-color: var(--nx-success); background: rgba(var(--nx-success-rgb, 16, 185, 129), 0.08); }
.nx-confidence--band .nx-confidence-note { flex: 1; min-width: 0; }

.nx-citations {
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md, 10px);
  background: var(--nx-bg-surface);
  padding: 12px 14px;
  max-width: 100%;
}

.nx-citations-head {
  font-size: var(--nx-text-xs);
  font-weight: 600;
  color: var(--nx-text-secondary);
  margin-bottom: 8px;
}

.nx-citations-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 2px;
}

.nx-citation {
  display: flex;
  gap: 10px;
  padding: 6px 8px;
  border-radius: var(--nx-radius-sm, 6px);
  align-items: flex-start;
}

.nx-citation:hover { background: var(--nx-bg-hover); }

.nx-citation-n {
  width: 20px;
  height: 20px;
  border-radius: 9999px;
  background: var(--nx-bg-muted);
  color: var(--nx-text-secondary);
  font-size: 11px;
  font-weight: 700;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  margin-top: 1px;
}

.nx-citation-body {
  display: grid;
  gap: 2px;
  min-width: 0;
  flex: 1;
}

.nx-citation-title {
  font-size: var(--nx-text-sm);
  color: var(--nx-text-heading);
  text-decoration: none;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

a.nx-citation-title { color: var(--nx-primary); font-weight: 600; }
a.nx-citation-title:hover { text-decoration: underline; }
a.nx-citation-title:focus-visible { outline: 2px solid var(--nx-primary); outline-offset: 2px; border-radius: 2px; }

.nx-citation-meta {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  font-size: 11px;
  color: var(--nx-text-muted);
}

.nx-citation-host {
  font-family: var(--nx-font-mono);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 240px;
}

.nx-citation-verdict {
  padding: 1px 7px;
  border-radius: 9999px;
  font-weight: 600;
}

.nx-citation-verdict--success { background: rgba(var(--nx-success-rgb, 16, 185, 129), 0.1); color: var(--nx-success); }
.nx-citation-verdict--warning { background: rgba(var(--nx-warning-rgb, 245, 158, 11), 0.12); color: var(--nx-warning); }
.nx-citation-verdict--danger { background: rgba(var(--nx-danger-rgb, 239, 68, 68), 0.1); color: var(--nx-danger); }

.nx-citation-note {
  font-size: var(--nx-text-xs);
  color: var(--nx-text-secondary);
  overflow-wrap: anywhere;
}

.nx-citations-more {
  margin-top: 6px;
  padding: 4px 8px;
  border: none;
  background: none;
  color: var(--nx-primary);
  font-size: var(--nx-text-xs);
  font-weight: 600;
  cursor: pointer;
  border-radius: var(--nx-radius-sm, 6px);
}

.nx-citations-more:hover { background: var(--nx-bg-hover); }
.nx-citations-more:focus-visible { outline: 2px solid var(--nx-primary); outline-offset: 2px; }

.nux-copy-btn {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 0 10px;
  height: 28px;
  border-radius: var(--nx-radius-sm, 6px);
  font-size: var(--nx-text-xs);
  font-family: inherit;
  font-weight: 500;
  cursor: pointer;
  transition: color var(--nx-duration-fast, 150ms) var(--nx-ease-out), background var(--nx-duration-fast, 150ms) var(--nx-ease-out), border-color var(--nx-duration-fast, 150ms) var(--nx-ease-out);
  color: var(--nx-text-secondary);
  background: transparent;
  border: 1px solid transparent;
  vertical-align: middle;
}

.nux-copy-btn svg { width: 13px; height: 13px; flex-shrink: 0; }

.nux-copy-btn--ghost {
  border-color: var(--nx-border);
  background: var(--nx-bg-surface);
}

.nux-copy-btn--ghost:hover { color: var(--nx-primary); border-color: rgba(var(--app-accent-rgb, 99, 102, 241), 0.4); }
.nux-copy-btn--text:hover { color: var(--nx-primary); }
.nux-copy-btn:focus-visible { outline: 2px solid var(--nx-primary); outline-offset: 2px; }

.nux-copy-btn.is-copied { color: var(--nx-success); }

@media (pointer: coarse) {
  .nux-copy-btn { height: 36px; padding: 0 12px; }
}

.nx-timeline {
  list-style: none;
  margin: 0;
  padding: 0;
  position: relative;
}

.nx-timeline::before {
  content: '';
  position: absolute;
  left: 4px;
  top: 8px;
  bottom: 8px;
  width: 2px;
  background: var(--nx-border);
  border-radius: 1px;
}

.nx-timeline-item {
  position: relative;
  padding: 0 0 16px 22px;
}

.nx-timeline-item:last-child { padding-bottom: 0; }

.nx-timeline-dot {
  position: absolute;
  left: 0;
  top: 5px;
  width: 10px;
  height: 10px;
  border-radius: 9999px;
  background: var(--nx-text-muted);
  box-shadow: 0 0 0 3px var(--nx-bg-surface);
}

.nx-timeline-item--success .nx-timeline-dot { background: var(--nx-success); }
.nx-timeline-item--warning .nx-timeline-dot { background: var(--nx-warning); }
.nx-timeline-item--danger .nx-timeline-dot { background: var(--nx-danger); }
.nx-timeline-item--accent .nx-timeline-dot { background: var(--nx-primary); }

.nx-timeline-meta {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 2px;
  flex-wrap: wrap;
}

.nx-timeline-time {
  font-family: var(--nx-font-mono);
  font-size: 11px;
  color: var(--nx-text-muted);
}

.nx-timeline-tag {
  font-size: 11px;
  padding: 0 7px;
  border-radius: 9999px;
  background: var(--nx-bg-muted);
  color: var(--nx-text-secondary);
  font-weight: 600;
}

.nx-timeline-title {
  font-size: var(--nx-text-sm);
  font-weight: 600;
  color: var(--nx-text-heading);
  line-height: 1.5;
}

.nx-timeline-desc {
  font-size: 13px;
  color: var(--nx-text-secondary);
  line-height: 1.6;
  overflow-wrap: anywhere;
}

.nx-descriptions { max-width: 100%; }

.nx-descriptions-title {
  font-size: var(--nx-text-sm);
  font-weight: 600;
  color: var(--nx-text-heading);
  margin-bottom: 8px;
}

.nx-descriptions-grid {
  display: grid;
  grid-template-columns: repeat(var(--nxd-cols, 2), minmax(0, 1fr));
  gap: 10px 20px;
  margin: 0;
}

.nx-descriptions-item { min-width: 0; }

.nx-descriptions-label {
  font-size: var(--nx-text-xs);
  color: var(--nx-text-secondary);
  margin: 0 0 2px;
}

.nx-descriptions-value {
  font-size: var(--nx-text-sm);
  color: var(--nx-text-heading);
  margin: 0;
  line-height: 1.6;
  overflow-wrap: anywhere;
}

@media (max-width: 480px) {
  .nx-descriptions-grid { grid-template-columns: 1fr; }
  .nx-descriptions-item { grid-column: auto !important; }
}

@media (prefers-reduced-motion: reduce) {
  .nux-copy-btn { transition: none; }
}

/* ---- nux-tool-call：AI 工具调用卡（running/completed/error 三态，业界 Tool 卡共识） ---- */
.nx-tool-call {
  list-style: none;
  margin: 0 0 8px;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.nx-tool-call-item {
  border: 1px solid var(--nx-border, rgba(148, 163, 184, 0.25));
  border-radius: var(--nx-radius-md, 8px);
  background: var(--nx-bg-subtle, rgba(148, 163, 184, 0.06));
  overflow: hidden;
}

.nx-tool-call-row {
  display: flex;
  align-items: center;
  gap: 7px;
  width: 100%;
  padding: 6px 9px;
  border: 0;
  background: transparent;
  font: inherit;
  font-size: var(--nx-text-xs);
  color: var(--nx-text-secondary, inherit);
  text-align: left;
  cursor: default;
}

.nx-tool-call-item.is-open .nx-tool-call-row,
.nx-tool-call-row:not(:disabled) {
  cursor: pointer;
}

.nx-tool-call-row:not(:disabled):hover {
  background: var(--nx-bg-hover, rgba(148, 163, 184, 0.1));
}

.nx-tool-call-row:focus-visible {
  outline: 2px solid var(--nx-accent, #6366f1);
  outline-offset: -2px;
}

.nx-tool-call-mark { flex: none; font-size: 11px; line-height: 1; }
.nx-tool-call-mark--done { color: var(--nx-success, #22c55e); }
.nx-tool-call-mark--error { color: var(--nx-danger, #ef4444); }

.nx-tool-call-spinner {
  flex: none;
  width: 11px;
  height: 11px;
  border-radius: 50%;
  border: 2px solid color-mix(in srgb, var(--nx-accent, #6366f1) 30%, transparent);
  border-top-color: var(--nx-accent, #6366f1);
  animation: nx-tool-call-spin 0.8s linear infinite;
}

@keyframes nx-tool-call-spin { to { transform: rotate(360deg); } }

.nx-tool-call-name {
  flex: none;
  font-weight: 600;
  color: var(--nx-text-heading, inherit);
  max-width: 45%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nx-tool-call-summary {
  min-width: 0;
  flex: 1;
  color: var(--nx-text-tertiary, inherit);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.nx-tool-call-summary.is-error { color: var(--nx-danger, #ef4444); }

.nx-tool-call-chevron { flex: none; color: var(--nx-text-tertiary, inherit); transition: transform var(--nx-transition-fast, 0.15s); }
.nx-tool-call-item.is-open .nx-tool-call-chevron { transform: rotate(180deg); }

.nx-tool-call-detail {
  padding: 2px 12px 8px 27px;
  border-top: 1px dashed var(--nx-border, rgba(148, 163, 184, 0.25));
}

.nx-tool-call-args { margin: 6px 0 0; }
.nx-tool-call-arg { display: flex; gap: 8px; padding: 1px 0; min-width: 0; }
.nx-tool-call-arg dt { flex: none; color: var(--nx-text-tertiary, inherit); min-width: 56px; }
.nx-tool-call-arg dd { margin: 0; min-width: 0; overflow-wrap: anywhere; color: var(--nx-text-secondary, inherit); font-family: var(--nx-font-mono, ui-monospace, monospace); font-size: 11px; }

.nx-tool-call-result {
  margin: 6px 0 0;
  padding: 7px 9px;
  background: var(--nx-bg-code, rgba(15, 23, 42, 0.85));
  border-radius: var(--nx-radius-sm, 6px);
  overflow: auto;
  max-height: 220px;
  font-size: 11px;
  line-height: 1.5;
}

.nx-tool-call-result code { font-family: var(--nx-font-mono, ui-monospace, monospace); white-space: pre-wrap; overflow-wrap: anywhere; }

@media (prefers-reduced-motion: reduce) {
  .nx-tool-call-spinner { animation-duration: 2.4s; }
  .nx-tool-call-chevron { transition: none; }
}

/* ===== nexus-components-form.css ===== */
.nx-input {
  width: 100%;
  padding: var(--nx-space-2) var(--nx-space-4);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-heading);
  background: var(--nx-bg-base);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md);
  outline: none;
  transition: border-color var(--nx-transition-base), box-shadow var(--nx-transition-base);
}
.nx-input:focus {
  border-color: var(--app-accent);
  box-shadow: 0 0 0 3px rgba(var(--app-accent-rgb), 0.15);
}
.nx-input::placeholder { color: var(--nx-text-muted); }

.nx-label {
  display: block;
  font-size: var(--nx-text-sm);
  font-weight: 500;
  color: var(--nx-text-body);
  margin-bottom: var(--nx-space-2);
}

.nx-select {
  width: 100%;
  padding: var(--nx-space-2) var(--nx-space-4);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-heading);
  background: var(--nx-bg-base);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md);
  outline: none;
  cursor: pointer;
  transition: border-color var(--nx-transition-base);
}
.nx-select:focus { border-color: var(--app-accent); }

.nux-form-group {
  margin-bottom: var(--nx-space-4);
}
.nux-form-label {
  display: block;
  font-size: var(--nx-text-sm);
  font-weight: 500;
  color: var(--nx-text-heading);
  margin-bottom: var(--nx-space-1);
}
.nux-form-required { color: var(--nx-danger); margin-left: 2px; }
.nux-form-error-text { font-size: var(--nx-text-xs); color: var(--nx-danger); margin-top: var(--nx-space-1); }
.nux-form-hint { font-size: var(--nx-text-xs); color: var(--nx-text-muted); margin-top: var(--nx-space-1); }
.nux-form-horizontal {
  display: flex;
  align-items: flex-start;
  gap: var(--nx-space-3);
}
.nux-form-horizontal .nux-form-label {
  width: 120px;
  flex-shrink: 0;
  text-align: right;
  padding-top: var(--nx-space-2);
  margin-bottom: 0;
}
.nux-form-horizontal .nux-form-content { flex: 1; min-width: 0; }

.nux-input {
  width: 100%;
  padding: var(--nx-space-2) var(--nx-space-3);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-heading);
  background: var(--nx-bg-base);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md);
  outline: none;
  transition: border-color var(--nx-transition-fast), box-shadow var(--nx-transition-fast);
  box-sizing: border-box;
}
.nux-input:focus {
  border-color: var(--app-accent, var(--nx-primary));
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--app-accent, var(--nx-primary)) 15%, transparent);
}
.nux-input::placeholder { color: var(--nx-text-muted); }

.nux-login-page {
  display: flex;
  width: 100%;
  flex: 1;
  min-height: 100vh;
  min-height: 100dvh;
  min-height: 100dvh;
  min-height: 100dvh;
}
.nux-login-brand {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(135deg, var(--app-accent, var(--nx-primary)), color-mix(in srgb, var(--app-accent, var(--nx-primary)) 70%, #1e293b));
  padding: var(--nx-space-8);
  position: relative;
  overflow: hidden;
}
.nux-login-brand::before {
  content: '';
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at 30% 70%, rgba(255,255,255,0.08) 0%, transparent 60%);
}
.nux-login-brand-content {
  position: relative;
  text-align: center;
  color: var(--nx-text-on-accent, #fff);
}
.nux-login-icon { font-size: 64px; display: block; margin-bottom: var(--nx-space-4); }
.nux-login-logo { width: 88px; height: 88px; object-fit: contain; display: block; margin: 0 auto var(--nx-space-4); }
.nux-login-app-name { font-size: 32px; font-weight: 700; margin: 0 0 var(--nx-space-2); }
.nux-login-slogan { font-size: var(--nx-text-lg); opacity: 0.8; margin: 0 0 var(--nx-space-4); }
.nux-login-desc { font-size: var(--nx-text-base); opacity: 0.7; margin: 0 0 var(--nx-space-6); line-height: 1.6; max-width: 360px; }
.nux-login-features { display: flex; flex-direction: column; gap: var(--nx-space-4); text-align: left; max-width: 380px; margin: 0 auto; }
.nux-login-feature { display: flex; align-items: flex-start; gap: var(--nx-space-3); }
.nux-login-feature-icon { font-size: 24px; line-height: 1; flex-shrink: 0; }
.nux-login-feature-text { display: flex; flex-direction: column; gap: 2px; }
.nux-login-feature-text strong { font-size: var(--nx-text-base); font-weight: 600; }
.nux-login-feature-text span { font-size: var(--nx-text-sm); opacity: 0.7; line-height: 1.4; }
.nux-login-stats {
  display: flex;
  gap: var(--nx-space-6);
  margin-top: var(--nx-space-6);
  padding-top: var(--nx-space-5);
  border-top: 1px solid rgba(255,255,255,0.18);
  justify-content: center;
}
.nux-login-stat { display: flex; flex-direction: column; align-items: center; gap: 2px; }
.nux-login-stat strong { font-size: 26px; font-weight: 700; line-height: 1; }
.nux-login-stat span { font-size: var(--nx-text-xs); opacity: 0.7; }
.nux-login-form-side {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--nx-space-8);
  background: var(--nx-bg-surface);
}
.nux-login-card { width: 100%; max-width: 400px; }
.nux-login-tabs {
  display: flex;
  gap: var(--nx-space-4);
  margin-bottom: var(--nx-space-6);
  border-bottom: 2px solid var(--nx-border);
}
.nux-login-tab {
  padding: var(--nx-space-2) 0;
  font-size: var(--nx-text-lg);
  font-weight: 500;
  color: var(--nx-text-secondary);
  background: none;
  border: none;
  cursor: pointer;
  border-bottom: 2px solid transparent;
  margin-bottom: -2px;
  transition: all var(--nx-transition-fast);
}
.nux-login-tab:hover { color: var(--nx-text-heading); }
.nux-login-tab.active {
  color: var(--app-accent, var(--nx-primary));
  border-bottom-color: var(--app-accent, var(--nx-primary));
}
.nux-login-error {
  padding: var(--nx-space-2) var(--nx-space-3);
  background: color-mix(in srgb, var(--nx-danger) 10%, transparent);
  color: var(--nx-danger);
  border-radius: var(--nx-radius-md);
  font-size: var(--nx-text-sm);
  margin-bottom: var(--nx-space-4);
}
.nux-live-hint {
  margin-top: var(--nx-space-1);
  font-size: var(--nx-text-sm);
  color: var(--nx-danger, #ef4444);
}
.nux-login-submit {
  width: 100%;
  padding: var(--nx-space-3);
  font-size: var(--nx-text-base);
  font-weight: 600;
  color: var(--nx-text-on-accent, #fff);
  background: var(--app-accent, var(--nx-primary));
  border: none;
  border-radius: var(--nx-radius-md);
  cursor: pointer;
  transition: opacity var(--nx-transition-fast);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--nx-space-2);
  margin-top: var(--nx-space-4);
}
.nux-login-submit:hover { opacity: 0.9; }
.nux-login-submit:disabled { opacity: 0.5; cursor: not-allowed; }
.nux-terms-hint {
  margin-top: var(--nx-space-2);
  font-size: var(--nx-text-sm);
  color: var(--nx-danger, #ef4444);
  text-align: center;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--nx-space-1);
  font-weight: 500;
}
.nux-terms-warn {
  border-radius: var(--nx-radius-sm);
  padding: var(--nx-space-2) var(--nx-space-2);
  outline: 1px dashed color-mix(in srgb, var(--nx-danger, #ef4444) 55%, transparent);
  background: color-mix(in srgb, var(--nx-danger, #ef4444) 6%, transparent);
}
.nux-login-footer {
  margin-top: var(--nx-space-4);
  text-align: center;
  font-size: var(--nx-text-sm);
  color: var(--nx-text-muted);
}
.nux-login-subtabs {
  display: flex;
  gap: var(--nx-space-2);
  margin-bottom: var(--nx-space-4);
}
.nux-login-subtab {
  flex: 1;
  padding: var(--nx-space-2);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-muted);
  background: var(--nx-bg-hover);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md);
  cursor: pointer;
  transition: all var(--nx-transition-fast);
}
.nux-login-subtab.active {
  color: var(--nx-text-on-accent, #fff);
  background: var(--app-accent, var(--nx-primary));
  border-color: var(--app-accent, var(--nx-primary));
}
.nux-password-wrap { position: relative; }
.nux-password-wrap .nux-input { padding-right: 44px; }
.nux-password-toggle {
  position: absolute;
  right: 4px;
  top: 50%;
  transform: translateY(-50%);
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: none;
  border: none;
  color: var(--nx-text-muted);
  cursor: pointer;
  border-radius: var(--nx-radius-sm);
  transition: color var(--nx-transition-fast);
}
.nux-password-toggle:hover { color: var(--nx-text-heading); }
.nux-sms-row { display: flex; gap: var(--nx-space-2); }
.nux-sms-row .nux-input { flex: 1; }
.nux-captcha-row { display: flex; gap: var(--nx-space-2); }
.nux-captcha-row .nux-input { flex: 1; }
.nux-captcha-img {
  flex-shrink: 0;
  width: 130px;
  height: 44px;
  padding: 0;
  overflow: hidden;
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md);
  background: var(--nx-bg-surface);
  cursor: pointer;
  transition: border-color var(--nx-transition-fast);
}
.nux-captcha-img:hover { border-color: var(--app-accent, var(--nx-primary)); }
.nux-captcha-img img { display: block; width: 100%; height: 100%; object-fit: cover; }
.nux-captcha-loading { display: flex; align-items: center; justify-content: center; height: 100%; font-size: var(--nx-text-sm); color: var(--nx-text-muted); }
.nux-sms-btn {
  flex-shrink: 0;
  padding: 0 var(--nx-space-3);
  font-size: var(--nx-text-sm);
  font-weight: 500;
  color: var(--app-accent, var(--nx-primary));
  background: var(--nx-bg-hover);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md);
  cursor: pointer;
  white-space: nowrap;
  transition: opacity var(--nx-transition-fast);
}
.nux-sms-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.nux-login-options {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: var(--nx-space-2);
}
.nux-checkbox {
  display: inline-flex;
  align-items: center;
  gap: var(--nx-space-2);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-secondary);
  cursor: pointer;
  user-select: none;
}
.nux-checkbox input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  margin: 0;
  border: 1.5px solid var(--nx-border-hover);
  border-radius: 5px;
  background: var(--nx-bg-surface);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: background var(--nx-transition-fast), border-color var(--nx-transition-fast);
}
.nux-checkbox input[type="checkbox"]::before {
  content: '';
  width: 10px;
  height: 10px;
  background: var(--nx-text-on-accent, #fff);
  clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
  transform: scale(0);
  transition: transform 120ms ease;
}
.nux-checkbox input[type="checkbox"]:checked {
  background: var(--app-accent, var(--nx-primary));
  border-color: var(--app-accent, var(--nx-primary));
}
.nux-checkbox input[type="checkbox"]:checked::before { transform: scale(1); }
.nux-link {
  background: none;
  border: none;
  padding: 0;
  font-size: var(--nx-text-sm);
  color: var(--app-accent, var(--nx-primary));
  cursor: pointer;
  transition: opacity var(--nx-transition-fast);
}
.nux-link:hover { opacity: 0.8; }
.nux-terms { line-height: 1.5; color: var(--nx-text-body); }
.nux-terms a { color: var(--app-accent, var(--nx-primary)); text-decoration: underline; font-weight: 500; }
.nux-age-slider { -webkit-appearance: none; appearance: none; width: 100%; height: 6px; border-radius: 999px; background: var(--nx-border-strong, #d1d5db); outline: none; padding: 0; }
.nux-age-slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 18px; height: 18px; border-radius: 50%; background: var(--app-accent, var(--nx-primary)); border: 2px solid var(--nx-bg-surface, #fff); box-shadow: 0 1px 4px rgba(0,0,0,0.25); cursor: pointer; }
.nux-age-slider::-moz-range-thumb { width: 18px; height: 18px; border-radius: 50%; background: var(--app-accent, var(--nx-primary)); border: 2px solid var(--nx-bg-surface, #fff); cursor: pointer; }
.nux-age-notice { font-size: var(--nx-text-sm, 12px); color: var(--nx-text-muted); line-height: 1.5; margin-top: 6px; }
.nux-login-divider {
  display: flex;
  align-items: center;
  gap: var(--nx-space-3);
  margin: var(--nx-space-5) 0 var(--nx-space-3);
  color: var(--nx-text-muted);
  font-size: var(--nx-text-sm);
}
.nux-login-divider::before,
.nux-login-divider::after {
  content: '';
  flex: 1;
  height: 1px;
  background: var(--nx-border);
}
.nux-login-third {
  display: flex;
  justify-content: center;
  gap: var(--nx-space-3);
}
.nux-third-btn {
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--nx-text-lg);
  color: var(--nx-text-secondary);
  background: var(--nx-bg-hover);
  border: 1px solid var(--nx-border);
  border-radius: 50%;
  cursor: pointer;
  transition: all var(--nx-transition-fast);
}
.nux-third-btn:hover { color: var(--app-accent, var(--nx-primary)); border-color: var(--app-accent, var(--nx-primary)); }
.nux-third-btn svg { width: 20px; height: 20px; }

.nux-login-page.nux-login--card,
.nux-login-page.nux-login--topbar,
.nux-login-page.nux-login--minimal {
  flex-direction: column;
  --nux-login-grad-mid: #e3e9f1;
  --nux-login-grad-end: #d6dfea;
  background: linear-gradient(165deg, var(--nx-bg-page, #eef2f7) 0%, var(--nux-login-grad-mid) 55%, var(--nux-login-grad-end) 100%);
}
.nux-login-page.nux-login--card .nux-login-brand,
.nux-login-page.nux-login--topbar .nux-login-brand {
  order: 1; flex: none; overflow: visible;
}
.nux-login-page.nux-login--card .nux-login-brand::before,
.nux-login-page.nux-login--topbar .nux-login-brand::before { content: none; }
.nux-login-page.nux-login--card .nux-login-form-side,
.nux-login-page.nux-login--topbar .nux-login-form-side,
.nux-login-page.nux-login--minimal .nux-login-form-side {
  order: 2; flex: none; background: transparent;
}
.nux-login-page.nux-login--card .nux-login-card,
.nux-login-page.nux-login--topbar .nux-login-card,
.nux-login-page.nux-login--minimal .nux-login-card {
  background: var(--nx-bg-card, #fff); box-sizing: border-box;
}
.nux-login-page.nux-login--card .nux-login-card { border-radius: 18px; padding: 32px 30px; box-shadow: 0 12px 40px rgba(30, 41, 59, .10), 0 2px 6px rgba(30, 41, 59, .06); }
.nux-login-page.nux-login--topbar .nux-login-card { border-radius: 16px; padding: 32px 30px; box-shadow: 0 10px 32px rgba(30, 41, 59, .09); }
.nux-login-page.nux-login--minimal .nux-login-card { border-radius: 16px; padding: 32px 30px; box-shadow: 0 8px 28px rgba(30, 41, 59, .06); }

.nux-login-page.nux-login--card .nux-login-brand { background: none; padding: 56px 24px 0; }
.nux-login-page.nux-login--card .nux-login-brand-content { color: var(--nx-text-heading); }
.nux-login-page.nux-login--card .nux-login-desc,
.nux-login-page.nux-login--card .nux-login-features,
.nux-login-page.nux-login--card .nux-login-stats { display: none; }
.nux-login-page.nux-login--card .nux-login-icon { font-size: 44px; margin-bottom: var(--nx-space-2); }
.nux-login-page.nux-login--card .nux-login-logo { width: 60px; height: 60px; margin-bottom: var(--nx-space-2); }
.nux-login-page.nux-login--card .nux-login-app-name { font-size: 26px; margin-bottom: 4px; color: var(--nx-text-heading); }
.nux-login-page.nux-login--card .nux-login-slogan { font-size: var(--nx-text-base); color: var(--nx-text-secondary); }
.nux-login-page.nux-login--card .nux-login-form-side { padding: 20px 16px 56px; }

.nux-login-page.nux-login--topbar { background: linear-gradient(180deg, var(--nx-bg-base, #f1f5f9) 0%, var(--nux-login-grad-end, #e2e8f0) 100%); }
.nux-login-page.nux-login--topbar .nux-login-brand { background: var(--nx-bg-surface, #fff); padding: 14px 24px; box-shadow: 0 1px 0 var(--nx-border); }
.nux-login-page.nux-login--topbar .nux-login-brand-content { display: flex; align-items: center; justify-content: center; gap: 12px; text-align: left; color: var(--nx-text-heading); }
.nux-login-page.nux-login--topbar .nux-login-icon { margin: 0; font-size: 28px; line-height: 1; }
.nux-login-page.nux-login--topbar .nux-login-app-name { font-size: 20px; margin: 0; color: var(--nx-text-heading); }
.nux-login-page.nux-login--topbar .nux-login-slogan { font-size: var(--nx-text-sm); margin: 0; color: var(--nx-text-secondary); }
.nux-login-page.nux-login--topbar .nux-login-desc,
.nux-login-page.nux-login--topbar .nux-login-features,
.nux-login-page.nux-login--topbar .nux-login-stats { display: none; }
.nux-login-page.nux-login--topbar .nux-login-form-side { padding: 40px 16px 64px; }

.nux-login-page.nux-login--minimal { background: var(--nx-bg-surface, #f8fafc); }
.nux-login-page.nux-login--minimal .nux-login-brand { display: none; }
.nux-login-page.nux-login--minimal .nux-login-form-side { padding: 24px 16px; }
@media (max-width: 768px){
  .nux-login-page { flex-direction: column; }
  .nux-login-brand { min-height: 0; flex: none; padding: var(--nx-space-6); order: -1; }
  .nux-login-brand-content { text-align: center; }
  .nux-login-desc,
  .nux-login-features,
  .nux-login-stats { display: none; }
  .nux-login-icon { font-size: 36px; margin-bottom: var(--nx-space-2); }
  .nux-login-app-name { font-size: 22px; margin-bottom: var(--nx-space-1); }
  .nux-login-slogan { font-size: var(--nx-text-base); margin-bottom: 0; }
  .nux-login-form-side { padding: var(--nx-space-4); }
  .nux-form-horizontal { flex-direction: column; }
  .nux-form-horizontal .nux-form-label { width: auto; text-align: left; padding-top: 0; }
  .nux-password-toggle { width: 44px; height: 44px; right: 0; }
  .nux-sms-btn { min-height: 44px; }
  .nux-third-btn { width: 52px; height: 52px; }
}

.nx-switch {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nx-space-3);
  padding: var(--nx-space-3) 0;
  cursor: pointer;
  font-size: var(--nx-text-sm);
  color: var(--nx-text-secondary);
}
.nx-switch-input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}
.nx-switch-slider {
  position: relative;
  width: 42px;
  height: 24px;
  flex-shrink: 0;
  background: var(--nx-border-hover, #cbd5e1);
  border-radius: var(--nx-radius-full);
  transition: background var(--nx-transition-fast);
}
.nx-switch-slider::after {
  content: '';
  position: absolute;
  top: 3px;
  left: 3px;
  width: 18px;
  height: 18px;
  background: var(--nx-bg-surface, #fff);
  border-radius: 50%;
  transition: transform var(--nx-transition-fast);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
}
.nx-switch-input:checked + .nx-switch-slider {
  background: var(--nx-primary, #3b82f6);
}
.nx-switch-input:checked + .nx-switch-slider::after {
  transform: translateX(18px);
}

/* === nux-forgot-password === */
.nux-forgot { width: 100%; }
.nux-forgot-head {
  display: flex;
  align-items: center;
  gap: var(--nx-space-3);
  margin-bottom: var(--nx-space-4);
}
.nux-forgot-title {
  margin: 0;
  font-size: var(--nx-text-lg);
  color: var(--nx-text-primary);
}
.nux-forgot-tabs { margin-bottom: var(--nx-space-4); }
.nux-forgot-hint {
  font-size: var(--nx-text-sm, 13px);
  color: var(--nx-text-secondary, #64748b);
  background: var(--nx-bg-secondary, #f1f5f9);
  border-radius: var(--nx-radius-md, 8px);
  padding: var(--nx-space-2, 8px) var(--nx-space-3, 12px);
  margin-bottom: var(--nx-space-4, 16px);
  line-height: 1.6;
}
.nux-forgot-done { text-align: center; padding: var(--nx-space-8) 0; }
.nux-forgot-done-icon {
  width: 56px;
  height: 56px;
  margin: 0 auto var(--nx-space-4);
  border-radius: 50%;
  background: var(--nx-success, #22c55e);
  color: var(--nx-text-on-accent, #fff);
  font-size: 28px;
  line-height: 56px;
}
.nux-forgot-done-text { color: var(--nx-text-secondary); margin-bottom: var(--nx-space-5); }

/* === nux-uc-* 用户菜单族（nux-menu-user 消费；nux-user-center 组件已下架 r56）=== */
.nux-user-center { display: inline-flex; }
.nux-uc-trigger {
  background: none;
  border: none;
  padding: 4px;
  cursor: pointer;
  border-radius: var(--nx-radius-full);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: opacity var(--nx-transition-fast);
}
.nux-uc-trigger:hover { opacity: 0.85; }
.nux-uc-trigger.nux-uc-labeled {
  width: auto;
  max-width: 100%;
  height: 38px;
  gap: 8px;
  padding: 0 12px 0 4px;
  color: var(--nx-text-secondary, #64748b);
}
.nux-uc-trigger.nux-uc-labeled:hover {
  opacity: 1;
  background: var(--nx-bg-hover, #f1f5f9);
  color: var(--app-accent, var(--nx-primary));
}
.nux-uc-trigger.nux-uc-labeled .nux-uc-label {
  font-size: 13px;
  font-weight: 500;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}@keyframes nux-uc-shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}
.nux-uc-body {
  display: flex;
  flex-direction: column;
  height: 100%;
  background: var(--nx-surface, #fff);
}
.nux-uc-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--nx-space-5) var(--nx-space-5) var(--nx-space-4);
  border-bottom: 1px solid var(--nx-border, #e2e8f0);
}
.nux-uc-user {
  display: flex;
  align-items: center;
  gap: var(--nx-space-3);
  min-width: 0;
}
.nux-uc-user-meta {
  display: flex;
  flex-direction: column;
  min-width: 0;
}
.nux-uc-user-meta strong { font-size: var(--nx-text-base); color: var(--nx-text-primary); }
.nux-uc-user-meta span {
  font-size: var(--nx-text-sm);
  color: var(--nx-text-secondary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.nux-uc-close {
  background: none;
  border: none;
  font-size: 24px;
  line-height: 1;
  color: var(--nx-text-secondary);
  cursor: pointer;
  padding: 4px 8px;
}
.nux-uc-tabs {
  display: flex;
  gap: var(--nx-space-1);
  padding: var(--nx-space-3) var(--nx-space-5);
  border-bottom: 1px solid var(--nx-border, #e2e8f0);
}
.nux-uc-tab {
  flex: 1;
  padding: var(--nx-space-2) var(--nx-space-1);
  border: none;
  background: none;
  border-radius: var(--nx-radius-md);
  font-size: var(--nx-text-xs);
  color: var(--nx-text-secondary);
  cursor: pointer;
  white-space: nowrap;
}
.nux-uc-tab.active {
  background: var(--nx-primary-soft, rgba(59, 130, 246, 0.1));
  color: var(--nx-primary, #3b82f6);
  font-weight: 600;
}
.nux-uc-pane {
  padding: var(--nx-space-5);
  overflow-y: auto;
  flex: 1;
}
.nux-uc-info { margin-bottom: var(--nx-space-6); }
.nux-uc-info-row {
  display: flex;
  justify-content: space-between;
  padding: var(--nx-space-3) 0;
  border-bottom: 1px dashed var(--nx-border, #e2e8f0);
  font-size: var(--nx-text-sm);
}
.nux-uc-info-row span { color: var(--nx-text-secondary); }
.nux-uc-info-row b { color: var(--nx-text-primary); }
.nux-uc-logout {
  width: 100%;
  padding: var(--nx-space-3);
  border: 1px solid var(--nx-danger, #ef4444);
  border-radius: var(--nx-radius-md);
  background: none;
  color: var(--nx-danger, #ef4444);
  cursor: pointer;
  font-size: var(--nx-text-sm);
}
.nux-uc-logout:hover { background: rgba(239, 68, 68, 0.08); }
.nux-uc-divider { height: 1px; background: var(--nx-border, #e2e8f0); margin: var(--nx-space-4) 0; }
.nux-uc-action {
  width: 100%;
  padding: var(--nx-space-3);
  border: 1px solid var(--nx-primary, #3b82f6);
  border-radius: var(--nx-radius-md);
  background: none;
  color: var(--nx-primary, #3b82f6);
  cursor: pointer;
  font-size: var(--nx-text-sm);
}
.nux-uc-action:hover { background: rgba(59, 130, 246, 0.08); }
.nux-uc-tip { color: var(--nx-text-secondary); font-size: var(--nx-text-sm); margin-top: var(--nx-space-3); }
.nux-uc-sessions-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--nx-space-3);
  font-size: var(--nx-text-sm);
  color: var(--nx-text-secondary);
}
.nux-uc-empty { text-align: center; color: var(--nx-text-secondary); padding: var(--nx-space-8) 0; font-size: var(--nx-text-sm); }
.nux-uc-session-list { display: flex; flex-direction: column; gap: var(--nx-space-2); }
.nux-uc-session {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nx-space-3);
  padding: var(--nx-space-3);
  border: 1px solid var(--nx-border, #e2e8f0);
  border-radius: var(--nx-radius-md);
}
.nux-uc-session-meta {
  display: flex;
  flex-direction: column;
  min-width: 0;
  font-size: var(--nx-text-sm);
}
.nux-uc-session-meta b { color: var(--nx-text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nux-uc-session-meta span { color: var(--nx-text-secondary); font-size: var(--nx-text-xs); }

/* 登录页三变体暗色：渐变中末段与卡片阴影翻转（起段走 --nx-bg-page 已随块；页底/topbar/minimal 背景规则随令牌自动翻转，无需单独覆写） */
[data-theme="dark"] .nux-login-page.nux-login--card,
[data-theme="dark"] .nux-login-page.nux-login--topbar,
[data-theme="dark"] .nux-login-page.nux-login--minimal {
  --nux-login-grad-mid: #1b2534;
  --nux-login-grad-end: #16202f;
}
[data-theme="dark"] .nux-login-page.nux-login--card .nux-login-card { box-shadow: 0 12px 40px rgba(0, 0, 0, .45), 0 2px 6px rgba(0, 0, 0, .3); border: 1px solid var(--nx-border); }
[data-theme="dark"] .nux-login-page.nux-login--topbar .nux-login-card { box-shadow: 0 10px 32px rgba(0, 0, 0, .4); border: 1px solid var(--nx-border); }
[data-theme="dark"] .nux-login-page.nux-login--minimal .nux-login-card { box-shadow: 0 8px 28px rgba(0, 0, 0, .35); border: 1px solid var(--nx-border); }

/* ===== nux-input-number ===== */
.nux-input-number {
  display: inline-flex;
  align-items: stretch;
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-sm, 8px);
  background: var(--nx-bg-surface);
  overflow: hidden;
  transition: border-color var(--nx-transition-fast), box-shadow var(--nx-transition-fast);
}
.nux-input-number:focus-within {
  border-color: rgba(var(--app-accent-rgb), 0.55);
  box-shadow: 0 0 0 3px rgba(var(--app-accent-rgb), 0.12);
}
.nux-input-number--disabled { opacity: 0.6; }
.nux-input-number-btn {
  width: 36px;
  flex-shrink: 0;
  border: none;
  background: var(--nx-bg-muted);
  color: var(--nx-text-body);
  font-size: var(--nx-text-lg);
  line-height: 1;
  cursor: pointer;
  transition: background var(--nx-transition-fast), color var(--nx-transition-fast);
  font-family: inherit;
}
.nux-input-number-btn:hover:not(:disabled) { background: var(--nx-bg-hover); color: var(--nx-text-accent); }
.nux-input-number-btn:disabled { cursor: not-allowed; opacity: 0.45; }
.nux-input-number-btn:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.55); outline-offset: -2px; }
.nux-input-number-native {
  width: 88px;
  text-align: center;
  border: none;
  border-radius: 0;
  background: transparent;
  flex: 1;
  min-width: 0;
}
.nux-input-number-native:focus { border: none; box-shadow: none; }
.nux-input-number-native::-webkit-outer-spin-button,
.nux-input-number-native::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.nux-input-number-native[type="number"] { -moz-appearance: textfield; appearance: textfield; }
.nux-input-number-unit {
  display: flex;
  align-items: center;
  padding: 0 var(--nx-space-2);
  color: var(--nx-text-muted);
  font-size: var(--nx-text-sm);
  background: var(--nx-bg-muted);
}
@media (max-width: 768px) {
  .nux-input-number-btn { width: 42px; }
  .nux-input-number-native { height: 40px; }
}

/* ===== nexus-components-controls.css ===== */
.nux-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--nx-space-2);
  padding: 9px var(--nx-space-5);
  min-height: 38px;
  font-size: var(--nx-text-sm);
  font-weight: 500;
  line-height: 1.5;
  border-radius: var(--nx-radius-md);
  border: 1px solid transparent;
  cursor: pointer;
  transition: background var(--nx-transition-fast), border-color var(--nx-transition-fast), box-shadow var(--nx-transition-fast), transform var(--nx-transition-fast);
  white-space: nowrap;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
}
.nux-btn:active:not(:disabled) { transform: scale(0.97); }
.nux-btn:disabled { opacity: 0.5; cursor: not-allowed; }
.nux-btn:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.5); outline-offset: 2px; }

.nux-btn--primary { background: var(--app-accent); color: var(--nx-text-on-accent); border-color: var(--app-accent); }
.nux-btn--primary:hover:not(:disabled) { background: var(--app-accent-hover); border-color: var(--app-accent-hover); box-shadow: var(--nx-shadow-glow); }
.nux-btn--ghost { background: var(--nx-bg-surface); color: var(--nx-text-body); border-color: var(--nx-border); }
.nux-btn--ghost:hover:not(:disabled) { background: var(--nx-bg-hover); border-color: var(--nx-border-hover); color: var(--nx-text-heading); }
.nux-btn--danger { background: var(--nx-danger); color: var(--nx-text-on-accent); border-color: var(--nx-danger); }
.nux-btn--danger:hover:not(:disabled) { opacity: 0.9; }
.nux-btn--success { background: var(--nx-success); color: var(--nx-text-on-accent); border-color: var(--nx-success); }
.nux-btn--success:hover:not(:disabled) { opacity: 0.9; }
.nux-btn--text { background: transparent; color: var(--app-accent); padding-left: var(--nx-space-2); padding-right: var(--nx-space-2); }
.nux-btn--text:hover:not(:disabled) { background: rgba(var(--app-accent-rgb), 0.08); }

.nux-btn--sm { padding: 4px var(--nx-space-3); min-height: 30px; font-size: var(--nx-text-xs); }
.nux-btn--lg { padding: 12px var(--nx-space-6); min-height: 46px; font-size: var(--nx-text-base); }
.nux-btn--block { display: flex; width: 100%; }

.nux-btn-spinner {
  width: 14px;
  height: 14px;
  flex-shrink: 0;
  border: 2px solid color-mix(in srgb, currentColor 30%, transparent);
  border-top-color: currentColor;
  border-radius: 50%;
  animation: nux-spin 0.7s linear infinite;
}
@keyframes nux-spin { to { transform: rotate(360deg); } }

.nux-field { margin-bottom: var(--nx-space-4); }
.nux-field-label {
  display: block;
  font-size: var(--nx-text-sm);
  font-weight: 500;
  color: var(--nx-text-heading);
  margin-bottom: var(--nx-space-2);
}
.nux-field-required { color: var(--nx-danger); margin-left: 3px; }
.nux-field-control { position: relative; display: flex; align-items: center; }
.nux-field-control .nux-input { flex: 1; min-width: 0; }
.nux-field-prefix { display: flex; align-items: center; color: var(--nx-text-muted); margin-right: var(--nx-space-2); }
.nux-field-suffix { display: flex; align-items: center; color: var(--nx-text-muted); margin-left: var(--nx-space-2); }
.nux-field-clear {
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  margin-right: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  background: var(--nx-bg-muted);
  color: var(--nx-text-secondary);
  border-radius: 50%;
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  transition: background var(--nx-transition-fast), color var(--nx-transition-fast);
}
.nux-field-clear:hover { background: var(--nx-bg-hover); color: var(--nx-text-heading); }
.nux-field-foot { display: flex; justify-content: space-between; gap: var(--nx-space-3); margin-top: var(--nx-space-1); }
.nux-field-hint { font-size: var(--nx-text-xs); color: var(--nx-text-muted); }
.nux-field-error { font-size: var(--nx-text-xs); color: var(--nx-danger); }
.nux-field-count { font-size: var(--nx-text-xs); color: var(--nx-text-muted); margin-left: auto; flex-shrink: 0; }
.nux-field--error .nux-input { border-color: var(--nx-danger); }
.nux-field--error .nux-input:focus { box-shadow: 0 0 0 3px rgba(var(--nx-danger-rgb), 0.15); }

.nux-input {
  width: 100%;
  padding: 9px var(--nx-space-3);
  font-size: var(--nx-text-sm);
  font-family: inherit;
  color: var(--nx-text-heading);
  background: var(--nx-bg-surface);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md);
  outline: none;
  transition: border-color var(--nx-transition-fast), box-shadow var(--nx-transition-fast);
  box-sizing: border-box;
}
.nux-input:focus {
  border-color: var(--app-accent);
  box-shadow: 0 0 0 3px rgba(var(--app-accent-rgb), 0.15);
}
.nux-input::placeholder { color: var(--nx-text-muted); }
.nux-input:disabled { background: var(--nx-bg-muted); cursor: not-allowed; }

.nux-textarea { resize: vertical; line-height: 1.6; min-height: 72px; }

.nux-select-wrap { position: relative; }
.nux-select-native {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 36px;
  cursor: pointer;
}
.nux-select-arrow {
  position: absolute;
  right: 12px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--nx-text-muted);
  font-size: 12px;
  pointer-events: none;
}

.nux-switch-field {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nx-space-4);
  padding: var(--nx-space-2) 0;
  cursor: pointer;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
}
.nux-switch-field--disabled { cursor: not-allowed; opacity: 0.55; }
.nux-switch-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.nux-switch-label { font-size: var(--nx-text-sm); font-weight: 500; color: var(--nx-text-heading); }
.nux-switch-desc { font-size: var(--nx-text-xs); color: var(--nx-text-muted); }
.nux-switch-track {
  position: relative;
  width: 44px;
  height: 26px;
  flex-shrink: 0;
  background: var(--nx-border-hover);
  border-radius: var(--nx-radius-full);
  transition: background var(--nx-transition-fast);
}
.nux-switch-track--on { background: var(--app-accent); }
.nux-switch-thumb {
  position: absolute;
  top: 3px;
  left: 3px;
  width: 20px;
  height: 20px;
  background: var(--nx-bg-surface, #fff);
  border-radius: 50%;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
  transition: transform var(--nx-transition-base);
}
.nux-switch-track--on .nux-switch-thumb { transform: translateX(18px); }

.nux-check {
  display: inline-flex;
  align-items: center;
  gap: var(--nx-space-2);
  cursor: pointer;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
}
.nux-check--disabled { cursor: not-allowed; opacity: 0.55; }
.nux-check-native { position: absolute; opacity: 0; pointer-events: none; }
.nux-check-box {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--nx-bg-surface);
  border: 1.5px solid var(--nx-border-hover);
  border-radius: 5px;
  transition: background var(--nx-transition-fast), border-color var(--nx-transition-fast);
}
.nux-check-box--on { background: var(--app-accent); border-color: var(--app-accent); }
.nux-check-box svg { animation: nux-check-pop 0.25s cubic-bezier(0.34, 1.56, 0.64, 1); }
@keyframes nux-check-pop { 0% { transform: scale(0); } 60% { transform: scale(1.15); } 100% { transform: scale(1); } }
.nux-check-label { font-size: var(--nx-text-sm); color: var(--nx-text-body); }
.nux-switch-field:focus-visible,
.nux-check:focus-within .nux-check-box,
.nux-chip:focus-visible,
.nux-tab-item:focus-visible {
  outline: 2px solid rgba(var(--app-accent-rgb, 99, 102, 241), 0.5);
  outline-offset: 2px;
}

.nux-search-box {
  display: flex;
  align-items: center;
  gap: var(--nx-space-2);
  padding: 0 var(--nx-space-3);
  background: var(--nx-bg-surface);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-full);
  transition: border-color var(--nx-transition-fast), box-shadow var(--nx-transition-fast);
}
.nux-search-box:focus-within {
  border-color: var(--app-accent);
  box-shadow: 0 0 0 3px rgba(var(--app-accent-rgb), 0.12);
}
.nux-search-icon { display: flex; color: var(--nx-text-muted); flex-shrink: 0; }
.nux-search-input {
  flex: 1;
  min-width: 0;
  border: none;
  background: transparent;
  outline: none;
  padding: 9px 0;
  font-size: var(--nx-text-sm);
  font-family: inherit;
  color: var(--nx-text-heading);
}
.nux-search-input::placeholder { color: var(--nx-text-muted); }
.nux-search-input::-webkit-search-cancel-button { display: none; }

.nux-segmented {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 2px;
  padding: 3px;
  background: var(--nx-bg-muted);
  border-radius: var(--nx-radius-full);
  max-width: 100%;
  overflow-x: auto;
  scrollbar-width: none;
}
.nux-segmented::-webkit-scrollbar { display: none; }
.nux-segmented--disabled { opacity: 0.55; pointer-events: none; }
.nux-segmented-indicator {
  position: absolute;
  top: 3px;
  bottom: 3px;
  left: 3px;
  width: 40px;
  background: var(--nx-bg-surface);
  border-radius: var(--nx-radius-full);
  box-shadow: var(--nx-shadow-sm);
  transition: transform 0.25s cubic-bezier(0.34, 1.3, 0.64, 1), width 0.2s ease, left 0.2s ease;
  pointer-events: none;
}
.nux-segmented-item {
  position: relative;
  z-index: 1;
  padding: 7px var(--nx-space-4);
  min-height: 34px;
  font-size: var(--nx-text-sm);
  font-family: inherit;
  font-weight: 500;
  color: var(--nx-text-secondary);
  background: transparent;
  border: none;
  border-radius: var(--nx-radius-full);
  cursor: pointer;
  white-space: nowrap;
  transition: color var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nux-segmented-item--on { color: var(--nx-text-heading); }
.nux-segmented-item--disabled { opacity: 0.45; cursor: not-allowed; }

.nux-chip-group {
  display: flex;
  flex-wrap: wrap;
  gap: var(--nx-space-2);
}
.nux-chip-group--disabled { opacity: 0.55; pointer-events: none; }
.nux-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 5px var(--nx-space-3);
  min-height: 32px;
  font-size: var(--nx-text-sm);
  color: var(--nx-text-secondary);
  background: var(--nx-bg-surface);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-full);
  cursor: pointer;
  user-select: none;
  transition: all var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nux-chip:hover { border-color: var(--nx-border-hover); color: var(--nx-text-heading); }
.nux-chip--on {
  color: var(--app-accent);
  border-color: var(--app-accent);
  background: rgba(var(--app-accent-rgb), 0.08);
  font-weight: 500;
}
.nux-chip--disabled { opacity: 0.45; cursor: not-allowed; }
.nux-chip-remove {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  margin-right: -4px;
  border: none;
  border-radius: 50%;
  background: var(--nx-bg-muted);
  color: var(--nx-text-muted);
  font-size: 12px;
  line-height: 1;
  cursor: pointer;
  transition: all var(--nx-transition-fast);
}
.nux-chip-remove:hover { background: rgba(var(--nx-danger-rgb), 0.15); color: var(--nx-danger); }

.nux-loading { display: flex; align-items: center; justify-content: center; gap: var(--nx-space-2); color: var(--nx-text-muted); }
.nux-loading--block { padding: var(--nx-space-8) 0; }
.nux-loading--inline { padding: 0; }
.nux-loading-spinner {
  flex-shrink: 0;
  border: 2px solid var(--nx-border);
  border-top-color: var(--app-accent);
  border-radius: 50%;
  animation: nux-spin 0.7s linear infinite;
}
.nux-loading--sm .nux-loading-spinner { width: 14px; height: 14px; }
.nux-loading--md .nux-loading-spinner { width: 20px; height: 20px; }
.nux-loading--lg .nux-loading-spinner { width: 28px; height: 28px; border-width: 3px; }
.nux-loading-text { font-size: var(--nx-text-sm); }

.nux-pagination { display: flex; align-items: center; justify-content: center; gap: var(--nx-space-2); flex-wrap: wrap; }
.nux-pagination-info { font-size: var(--nx-text-sm); color: var(--nx-text-muted); min-width: 3.5em; text-align: center; }

@media (max-width: 768px){
  .nux-btn { padding: 8px var(--nx-space-4); min-height: 40px; }
  .nux-field { margin-bottom: var(--nx-space-3); }
  .nux-segmented { width: 100%; }
  .nux-segmented-item { flex: 1; padding: 7px var(--nx-space-3); }
}@media (hover: none) and (pointer: coarse){
  .nux-btn { min-height: 44px; }
  .nux-btn--sm { min-height: 40px; }
  .nux-input, .nux-search-input { font-size: 16px; }
  .nux-search-box { padding: 0 var(--nx-space-3); }
  .nux-search-box .nux-field-clear { width: 40px; height: 40px; }
  .nux-chip { min-height: 40px; }
  .nux-segmented-item { min-height: 40px; }
  .nux-switch-track { width: 48px; height: 28px; }
  .nux-switch-track--on .nux-switch-thumb { transform: translateX(20px); }
  .nux-check-box { width: 20px; height: 20px; }
  .nux-field-clear { width: 40px; height: 40px; }
}

.nux-swipe { position: relative; overflow: hidden; touch-action: pan-y; -webkit-user-select: none; user-select: none; }
.nux-swipe__side { position: absolute; top: 0; bottom: 0; display: flex; z-index: 0; }
.nux-swipe__side--left { left: 0; }
.nux-swipe__side--right { right: 0; }
.nux-swipe__content { position: relative; z-index: 1; touch-action: pan-y; }
.nux-swipe__content--settled { transition: transform var(--nx-transition-base, 200ms) var(--nx-ease-out, ease-out); }
.nux-swipe--disabled .nux-swipe__content { pointer-events: auto; }
.nux-swipe__action { width: 76px; min-height: 44px; border: 0; padding: 0 var(--nx-space-2); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; color: #fff; font-size: var(--nx-text-xs); font-weight: 600; font-family: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent; }
.nux-swipe__action:active { filter: brightness(0.92); }
.nux-swipe__action-icon { font-size: 18px; line-height: 1; display: inline-flex; align-items: center; justify-content: center; }
.nux-swipe__action-icon svg { width: 18px; height: 18px; }
.nux-swipe__action--accent { background: var(--app-accent, var(--nx-info)); }
.nux-swipe__action--danger { background: var(--nx-danger); }
.nux-swipe__action--success { background: var(--nx-success); }
.nux-swipe__action--warning { background: var(--nx-warning); }
.nux-swipe__action--neutral { background: var(--nx-text-secondary); }
@media (prefers-reduced-motion: reduce){
  .nux-swipe__content--settled { transition: none; }
}

/* ===== nexus-components-display.css ===== */
.nux-progress-line {
  height: 8px;
  background: var(--nx-bg-muted);
  border-radius: var(--nx-radius-full);
  overflow: hidden;
}
.nux-progress-line-val {
  height: 100%;
  background: var(--app-accent);
  border-radius: var(--nx-radius-full);
  transition: width var(--nx-transition-slow);
}
.nux-progress-head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--nx-space-3); margin-bottom: var(--nx-space-2); }
.nux-progress-label { font-size: var(--nx-text-sm); color: var(--nx-text-body); }
.nux-progress-percent { font-size: var(--nx-text-sm); font-weight: 600; color: var(--nx-text-heading); font-variant-numeric: tabular-nums; }
.nux-progress-circle { position: relative; display: inline-flex; align-items: center; justify-content: center; }
.nux-progress-circle-bg { stroke: var(--nx-bg-muted); }
.nux-progress-circle-val {
  stroke: var(--app-accent);
  transform: rotate(-90deg);
  transform-origin: center;
  transition: stroke-dashoffset var(--nx-transition-slow);
}
.nux-progress-circle-text {
  position: absolute;
  font-size: var(--nx-text-base);
  font-weight: 600;
  color: var(--nx-text-heading);
  font-variant-numeric: tabular-nums;
}
.nux-progress--success .nux-progress-line-val,
.nux-progress--success .nux-progress-circle-val { background: var(--nx-success); stroke: var(--nx-success); }
.nux-progress--danger .nux-progress-line-val,
.nux-progress--danger .nux-progress-circle-val { background: var(--nx-danger); stroke: var(--nx-danger); }
.nux-progress--warning .nux-progress-line-val,
.nux-progress--warning .nux-progress-circle-val { background: var(--nx-warning); stroke: var(--nx-warning); }

.nux-accordion {
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-lg);
  background: var(--nx-bg-surface);
  overflow: hidden;
}
.nux-acc-item + .nux-acc-item { border-top: 1px solid var(--nx-border); }
.nux-acc-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nx-space-3);
  width: 100%;
  padding: var(--nx-space-4);
  font-size: var(--nx-text-base);
  font-weight: 500;
  font-family: inherit;
  color: var(--nx-text-heading);
  background: transparent;
  border: none;
  cursor: pointer;
  text-align: left;
  transition: background var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nux-acc-head:hover { background: var(--nx-bg-hover); }
.nux-acc-arrow { color: var(--nx-text-muted); font-size: 14px; transition: transform var(--nx-transition-base); flex-shrink: 0; }
.nux-acc-item--open .nux-acc-arrow { transform: rotate(180deg); }
.nux-acc-body {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows var(--nx-transition-base);
}
.nux-acc-item--open .nux-acc-body { grid-template-rows: 1fr; }
.nux-acc-content { overflow: hidden; }
.nux-acc-content > :first-child { padding: 0 var(--nx-space-4) var(--nx-space-4); margin: 0; font-size: var(--nx-text-sm); color: var(--nx-text-body); line-height: 1.7; }

.nux-section {
  background: var(--nx-bg-surface);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-lg);
  padding: var(--nx-space-5) var(--nx-space-6);
  margin-bottom: var(--nx-space-5);
}
.nux-section--flat { background: transparent; border: none; padding: 0; border-radius: 0; }
.nux-section-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--nx-space-4);
  margin-bottom: var(--nx-space-4);
}
.nux-section-title {
  font-size: var(--nx-text-lg);
  font-weight: 600;
  color: var(--nx-text-heading);
  margin: 0;
  line-height: 1.4;
}
.nux-section-desc { font-size: var(--nx-text-sm); color: var(--nx-text-muted); margin: var(--nx-space-1) 0 0; }
.nux-section-actions { display: flex; align-items: center; gap: var(--nx-space-2); flex-shrink: 0; flex-wrap: wrap; }
.nux-section-body { min-width: 0; }

.nux-backtop {
  position: fixed;
  right: 24px;
  bottom: calc(24px + var(--nx-safe-bottom));
  z-index: var(--nx-z-nav);
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--nx-text-secondary);
  background: var(--nx-bg-surface);
  border: 1px solid var(--nx-border);
  border-radius: 50%;
  box-shadow: var(--nx-shadow-md);
  cursor: pointer;
  transition: all var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}
.nux-backtop:hover { color: var(--app-accent); border-color: var(--app-accent); transform: translateY(-2px); }
.nux-backtop-fade-enter-active,
.nux-backtop-fade-leave-active { transition: opacity var(--nx-transition-base), transform var(--nx-transition-base); }
.nux-backtop-fade-enter-from,
.nux-backtop-fade-leave-to { opacity: 0; transform: translateY(8px); }@media (min-width: 1024px){
  .nux-section { padding: var(--nx-space-6); }
}@media (max-width: 768px){
  .nux-section { padding: var(--nx-space-4); margin-bottom: var(--nx-space-4); }
  .nux-section--flat { padding: 0; }
  .nux-section-head { flex-direction: column; }
}@media (max-width: 480px){
  .nux-section { padding: var(--nx-space-3); }
  .nux-section-title { font-size: var(--nx-text-base); }
}@media (hover: none) and (pointer: coarse){
  .nux-acc-head { min-height: 48px; }
  .nux-backtop { right: 16px; }
}

.nux-footer {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--nx-space-2);
  padding: var(--nx-space-5) var(--nx-space-4);
  color: var(--nx-text-muted);
  font-size: 12px;
  line-height: 1.7;
  text-align: center;
}
.nux-footer-brand {
  font-size: 13px;
  font-weight: 600;
  color: var(--nx-text-secondary);
  margin-bottom: var(--nx-space-1);
}
.nux-footer-disclaimer {
  max-width: 720px;
  margin: 0 auto var(--nx-space-2);
  font-size: 12px;
  line-height: 1.6;
  color: var(--nx-text-secondary);
}
.nux-footer-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--nx-space-1) var(--nx-space-3);
}
.nux-footer-copy { color: var(--nx-text-secondary); }
.nux-footer-sep { color: var(--nx-text-secondary); opacity: .7; }
.nux-footer .nux-footer-link {
  color: var(--nx-text-secondary);
  text-decoration: none;
  padding: 5px 2px;
  transition: color .2s;
}
.nux-footer .nux-footer-link:hover {
  color: var(--nx-text-accent);
  text-decoration: underline;
}


.nux-app-card{
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 18px;
  background: var(--nx-bg-card, #fff);
  border: 1px solid var(--nx-border, rgba(15,23,42,0.08));
  border-radius: var(--nx-radius-lg, 18px);
  text-decoration: none;
  overflow: hidden;
  min-width: 0;
  word-break: break-word;
  box-shadow: var(--nx-shadow-sm, 0 1px 3px rgba(15,23,42,0.05));
  transition: transform .3s cubic-bezier(0.4,0,0.2,1), box-shadow .3s cubic-bezier(0.4,0,0.2,1), border-color .3s;
  color: inherit;
}
.nux-app-card-cover{
  position: absolute;
  inset: 0;
  z-index: 1;
  cursor: pointer;
  border-radius: inherit;
  text-decoration: none;
}
.nux-app-card-glow,
.nux-app-card-top,
.nux-app-card-body,
.nux-app-card-enter{ position: relative; }
.nux-app-card-fav,
.nux-app-card-edit{ position: relative; z-index: 2; }
.nux-app-card:hover{
  transform: translateY(-4px);
  box-shadow: 0 18px 40px -14px var(--app-accent-glow, rgba(79,70,229,0.22));
  border-color: var(--app-accent, rgba(79,70,229,0.4));
}
.nux-app-card:hover .nux-app-card-name{ color: var(--nx-text-heading, #0f172a); }
.nux-app-card-glow{
  position: absolute;
  top: -40%;
  right: -30%;
  width: 180px;
  height: 180px;
  border-radius: 50%;
  background: radial-gradient(circle, var(--app-accent-soft, rgba(79,70,229,0.08)), transparent 70%);
  pointer-events: none;
}
.nux-app-card-badge{
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 11px;
  font-weight: 700;
  color: var(--app-accent, #4f46e5);
  background: var(--app-accent-soft, rgba(79,70,229,0.08));
  border: 1px solid currentColor;
  padding: 3px 8px;
  border-radius: 999px;
  white-space: nowrap;
  flex-shrink: 0;
}
.nux-app-card-badge i{ font-size: 10px; }
.nux-app-card-badge-recent{ background: rgba(var(--nx-success-rgb), 0.10); border-color: rgba(var(--nx-success-rgb), 0.22); color: var(--nx-success); }
.nux-app-card-badge-fav{ background: rgba(var(--nx-warning-rgb), 0.12); border-color: rgba(var(--nx-warning-rgb), 0.28); color: var(--nx-warning); }
.nux-app-card-badge-featured{ background: rgba(var(--nx-warning-rgb), 0.12); border-color: rgba(var(--nx-warning-rgb), 0.28); color: var(--nx-warning); }
.nux-app-card-fav{
  position: relative;
  width: 30px;
  height: 30px;
  min-width: 30px;
  min-height: 30px;
  border-radius: 999px;
  border: 1px solid var(--nx-border, rgba(15,23,42,0.18));
  background: var(--nx-bg-card, rgba(255,255,255,0.9));
  color: var(--nx-text-secondary, #64748b);
  font-size: 13px;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: color .3s, background .3s, border-color .3s, transform .3s;
  font-family: inherit;
  flex-shrink: 0;
}
.nux-app-card-fav::before{
  content: '';
  position: absolute;
  inset: -8px;
  -webkit-tap-highlight-color: transparent;
}
.nux-app-card:hover .nux-app-card-fav{ color: var(--nx-text-body, #334155); border-color: var(--nx-border-strong, rgba(15,23,42,0.3)); }
.nux-app-card-fav:hover{ transform: scale(1.1); background: var(--nx-bg-card, rgba(255,255,255,0.95)); }
.nux-app-card-fav.on{
  color: var(--nx-warning-text, #d97706);
  background: rgba(var(--nx-warning-rgb, 217, 119, 6), 0.12);
  border-color: rgba(var(--nx-warning-rgb, 217, 119, 6), 0.35);
}
.nux-app-card-edit{
  position: relative;
  width: 30px;
  height: 30px;
  min-width: 30px;
  min-height: 30px;
  border: none;
  border-radius: 9px;
  background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.08);
  border: 1px solid rgba(var(--app-accent-rgb, 99, 102, 241), 0.18);
  color: var(--app-accent, var(--nx-primary, #4f46e5));
  font-size: 13px;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: all .3s;
  flex-shrink: 0;
}
.nux-app-card-edit::before{
  content: '';
  position: absolute;
  inset: -8px;
  -webkit-tap-highlight-color: transparent;
}
.nux-app-card-edit:hover{ background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.16); border-color: rgba(var(--app-accent-rgb, 99, 102, 241), 0.4); transform: scale(1.06); }
.nux-app-card-top{ display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.nux-app-card-actions{ display: flex; align-items: center; gap: 6px; min-width: 0; }
.nux-app-card-icon{
  width: 46px;
  height: 46px;
  border-radius: 13px;
  object-fit: cover;
  background: var(--nx-bg-muted, #f7f8fc);
}
.nux-app-card-icon-fallback{
  width: 46px;
  height: 46px;
  border-radius: 13px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 20px;
  color: var(--app-accent, #6366f1);
  background: var(--app-accent-soft, rgba(79,70,229,0.08));
}
.nux-app-card-body{ position: relative; min-width: 0; }
.nux-app-card-name{
  font-size: 16px;
  font-weight: 700;
  color: var(--nx-text-heading, #0f172a);
  margin-bottom: 4px;
  transition: color .3s;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.nux-app-card-desc{
  font-size: 12.5px;
  color: var(--nx-text-muted, #475569);
  line-height: 1.55;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.nux-app-card-enter{
  position: relative;
  margin-top: 2px;
  font-size: 12.5px;
  color: var(--nx-text-secondary, #64748b);
  font-weight: 600;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  transition: gap .3s, color .3s;
}
.nux-app-card-enter i{ transition: transform .3s; }
.nux-app-card:hover .nux-app-card-enter{ color: var(--nx-text-heading, #0f172a); gap: 9px; }
.nux-app-card:hover .nux-app-card-enter i{ transform: translateX(3px); }@media (max-width: 768px){
  .nux-app-card{ padding: 14px; gap: 8px; }
  .nux-app-card-top{ gap: 8px; }
  .nux-app-card-actions{ gap: 4px; }
  .nux-app-card-icon, .nux-app-card-icon-fallback{ width: 40px; height: 40px; font-size: 18px; }
  .nux-app-card-name{ font-size: 14.5px; }
  .nux-app-card-desc{ font-size: 12px; line-height: 1.55; }
  .nux-app-card-badge{ font-size: 10px; padding: 2px 6px; }
  .nux-app-card-fav, .nux-app-card-edit{ width: 40px; height: 40px; min-width: 40px; min-height: 40px; }
}

.nux-notify { position: relative; display: inline-block; }
.nux-notify-bell {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border: none;
  border-radius: 50%;
  background: transparent;
  color: var(--nx-text-strong);
  font-size: 17px;
  cursor: pointer;
  transition: background 0.2s;
}
@media (hover: none) and (pointer: coarse) {
  .nux-notify-bell { width: 44px; height: 44px; }
}
.nux-notify-bell:hover { background: var(--nx-bg-hover); }
.nux-notify-bell:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 2px; }
.nux-notify-dot {
  position: absolute;
  top: 2px;
  right: 0;
  min-width: 17px;
  height: 17px;
  padding: 0 4px;
  border-radius: 999px;
  background: var(--nx-danger);
  color: var(--nx-text-on-accent);
  font-size: 10px;
  line-height: 17px;
  text-align: center;
  font-weight: 600;
  box-shadow: 0 0 0 2px var(--nx-bg-surface);
}
.nux-notify-live { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
.nux-notify-panel {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: var(--nx-z-popover);
  display: flex;
  flex-direction: column;
  width: 360px;
  max-width: calc(100vw - 24px);
  max-height: min(520px, calc(100dvh - 140px));
  background: var(--nx-bg-surface);
  border: 1px solid var(--nx-border);
  border-radius: var(--nx-radius-md);
  box-shadow: 0 12px 36px rgba(15, 23, 42, 0.14);
  overflow: hidden;
  animation: nuxNotifyIn 0.16s ease;
}
@keyframes nuxNotifyIn {
  from { opacity: 0; transform: translateY(-4px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .nux-notify-panel { animation: none; }
  .nux-notify-item, .nux-notify-bell { transition: none; }
}
.nux-notify-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 16px 8px;
}
.nux-notify-title { font-size: 14px; font-weight: 600; color: var(--nx-text-strong); }
.nux-notify-push {
  display: inline-flex; align-items: center; gap: 5px;
  border: 1px solid rgba(var(--app-accent-rgb), 0.35); border-radius: 999px;
  background: var(--nx-bg-surface, transparent); color: var(--nx-text-accent);
  font-size: 12px; font-weight: 600; cursor: pointer; padding: 4px 10px;
}
.nux-notify-push:hover { background: rgba(var(--app-accent-rgb), 0.08); }
.nux-notify-push.is-on { background: rgba(var(--app-accent-rgb), 0.12); border-color: transparent; }
.nux-notify-push.is-unsupported { border-color: var(--nx-border); color: var(--nx-text-tertiary, var(--nx-text-secondary)); cursor: default; }
.nux-notify-push[disabled] { opacity: 0.6; cursor: wait; }
.nux-notify-allread {
  border: none;
  background: transparent;
  color: var(--nx-text-accent);
  font-size: 12.5px;
  cursor: pointer;
  padding: 6px 8px;
  border-radius: 6px;
}
.nux-notify-allread:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 1px; }
.nux-notify-toolbar { padding: 0 16px 10px; }
.nux-notify-seg {
  display: inline-flex;
  gap: 2px;
  padding: 2px;
  border-radius: 8px;
  background: var(--nx-bg-muted);
}
.nux-notify-seg-btn {
  border: none;
  background: transparent;
  color: var(--nx-text-secondary);
  font-size: 12px;
  line-height: 1;
  padding: 6px 12px;
  border-radius: 6px;
  cursor: pointer;
}
.nux-notify-seg-btn.active {
  background: var(--nx-bg-surface);
  color: var(--nx-text-strong);
  font-weight: 600;
  box-shadow: 0 1px 3px rgba(15, 23, 42, 0.12);
}
.nux-notify-seg-btn:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 1px; }
.nux-notify-scroll { flex: 1; overflow-y: auto; overscroll-behavior: contain; min-height: 0; }
.nux-notify-group-label {
  display: flex; align-items: baseline; gap: 6px;
  font-size: 11px;
  color: var(--nx-text-muted);
  padding: 8px 16px 4px;
}
.nux-notify-group-unread { color: var(--nx-text-accent); font-weight: 600; }
.nux-notify-list { list-style: none; margin: 0; padding: 0; }
.nux-notify-item {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 10px 16px;
  cursor: pointer;
  transition: background 0.15s;
}
.nux-notify-item:hover { background: var(--nx-bg-hover); }
.nux-notify-item:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: -2px; }
@media (hover: none) and (pointer: coarse) {
  .nux-notify-item { padding: 12px 16px; }
}
.nux-notify-item-ic {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 8px;
  font-size: 14px;
  margin-top: 1px;
}
.nux-notify-item.tone-info .nux-notify-item-ic { background: rgba(var(--nx-info-rgb), 0.13); color: rgb(var(--nx-info-rgb)); }
.nux-notify-item.tone-success .nux-notify-item-ic { background: rgba(var(--nx-success-rgb), 0.13); color: rgb(var(--nx-success-rgb)); }
.nux-notify-item.tone-warning .nux-notify-item-ic { background: rgba(var(--nx-warning-rgb), 0.15); color: rgb(var(--nx-warning-rgb)); }
.nux-notify-item.tone-danger .nux-notify-item-ic { background: rgba(var(--nx-danger-rgb), 0.12); color: rgb(var(--nx-danger-rgb)); }
.nux-notify-item.tone-accent .nux-notify-item-ic { background: rgba(var(--app-accent-rgb), 0.11); color: rgb(var(--app-accent-rgb)); }
.nux-notify-item.tone-neutral .nux-notify-item-ic { background: var(--nx-bg-muted); color: var(--nx-text-secondary); }
.nux-notify-item-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.nux-notify-item-title {
  font-size: 13px;
  color: var(--nx-text-strong);
  line-height: 1.5;
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 1;
  -webkit-box-orient: vertical;
}
.nux-notify-item-unread .nux-notify-item-title { font-weight: 600; }
.nux-notify-item-summary {
  margin-top: 2px; font-size: 12px; color: var(--nx-text-secondary); line-height: 1.45;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.nux-notify-item-meta { display: flex; align-items: center; gap: 6px; margin-top: 4px; }
.nux-notify-item-app {
  font-size: 10px; line-height: 1; padding: 2px 6px; border-radius: 999px;
  background: var(--nx-bg-muted); color: var(--nx-text-secondary);
}
.nux-notify-item-time { margin-top: 0; font-size: 11px; color: var(--nx-text-muted); }
.nux-notify-item-dot {
  flex-shrink: 0;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--nx-danger);
  margin-top: 6px;
}
.nux-notify-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding: 32px 16px;
  text-align: center;
  font-size: 12.5px;
  color: var(--nx-text-muted);
}
.nux-notify-empty-ic { font-size: 26px; opacity: 0.45; }
.nux-notify-reload {
  border: 1px solid var(--nx-border);
  background: transparent;
  color: var(--nx-text-accent);
  font-size: 12.5px;
  padding: 8px 16px;
  min-height: 36px;
  border-radius: 8px;
  cursor: pointer;
}
@media (hover: none) and (pointer: coarse) {
  .nux-notify-reload { min-height: 44px; }
}
.nux-notify-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 16px; border-top: 1px solid var(--nx-border); font-size: 11.5px; color: var(--nx-text-muted); }
.nux-notify-center {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--nx-text-accent);
  text-decoration: none;
  font-size: 12.5px;
  font-weight: 500;
  padding: 4px 0;
}
.nux-notify-center i { font-size: 10px; }
.nux-notify-center:focus-visible { outline: 2px solid rgba(var(--app-accent-rgb), 0.7); outline-offset: 2px; border-radius: 4px; }
.nux-notify-foot-hint { color: var(--nx-text-muted); }
@media (max-width: 768px){
  .nux-notify-panel {
    position: fixed;
    top: calc(var(--nxs-header-h, 56px) + var(--nx-safe-top, 0px) + 8px);
    right: 10px;
    left: 10px;
    width: auto;
    max-height: calc(100dvh - var(--nxs-header-h, 56px) - var(--nx-safe-top, 0px) - var(--nx-safe-bottom, 0px) - 24px);
  }
}

.nux-onboarding-mask {
  position: fixed;
  inset: 0;
  z-index: var(--nx-z-topmost);
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(15, 23, 42, 0.45);
  backdrop-filter: blur(2px);
  padding: 16px calc(16px + var(--nx-safe-right, 0px)) calc(16px + var(--nx-safe-bottom, 0px)) calc(16px + var(--nx-safe-left, 0px));
  padding-top: calc(16px + var(--nx-safe-top, 0px));
}
.nux-onboarding-card {
  position: relative;
  width: 420px;
  max-width: 100%;
  padding: 32px 24px 24px;
  border-radius: 16px;
  background: var(--nx-bg-surface, #fff);
  box-shadow: 0 16px 50px rgba(15, 23, 42, 0.2);
  text-align: center;
}
.nux-onboarding-close {
  position: absolute;
  top: 10px;
  right: 10px;
  border: none;
  background: transparent;
  color: var(--nx-text-muted);
  font-size: 14px;
  cursor: pointer;
}
.nux-onboarding-step-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  margin-bottom: 14px;
  border-radius: 16px;
  background: rgba(79, 70, 229, 0.1);
  color: var(--nx-color-primary, #4f46e5);
  font-size: 24px;
  font-weight: 700;
}
.nux-onboarding-title { margin: 0 0 8px; font-size: 20px; font-weight: 700; color: var(--nx-text-strong); }
.nux-onboarding-desc { margin: 0; font-size: 14px; line-height: 1.7; color: var(--nx-text-muted); }
.nux-onboarding-links { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin-top: 16px; }
.nux-onboarding-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 14px;
  border-radius: 999px;
  background: var(--nx-bg-subtle, rgba(0,0,0,0.04));
  color: var(--nx-text-strong);
  font-size: 13px;
  text-decoration: none;
  transition: background 0.15s;
}
.nux-onboarding-link:hover { background: rgba(79, 70, 229, 0.08); }
.nux-onboarding-link-primary { background: var(--nx-color-primary, #4f46e5); color: var(--nx-text-on-accent); }
.nux-onboarding-link-primary:hover { background: var(--nx-color-primary-strong, #4338ca); color: var(--nx-text-on-accent); }
.nux-onboarding-dots { display: flex; gap: 6px; justify-content: center; margin-top: 18px; }
.nux-onboarding-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--nx-border, rgba(0,0,0,0.12)); }
.nux-onboarding-dot.active { background: var(--nx-color-primary, #4f46e5); width: 20px; border-radius: 999px; }
.nux-onboarding-actions { display: flex; gap: 10px; justify-content: center; margin-top: 18px; }
.nux-onboarding-btn {
  padding: 8px 20px;
  border: none;
  border-radius: 999px;
  font-size: 14px;
  font-weight: 600;
  font-family: inherit;
  cursor: pointer;
  transition: opacity 0.15s;
}
.nux-onboarding-btn-primary { background: var(--nx-color-primary, #4f46e5); color: var(--nx-text-on-accent); }

/* ===== 就绪度引导条 ===== */
.nux-ob-strip {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 12px 16px;
  border-radius: 16px;
  margin-bottom: 14px;
  color: var(--nx-text-on-accent);
  background: linear-gradient(135deg, color-mix(in srgb, var(--app-accent, #155e75) 82%, #0f172a), var(--app-accent, #155e75));
}
.nux-ob-strip .nux-ob-main { display: flex; align-items: center; gap: 12px; min-width: 0; }
.nux-ob-strip .nux-ob-ico {
  width: 42px;
  height: 42px;
  border-radius: 12px;
  background: rgba(255, 255, 255, 0.16);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 20px;
  flex-shrink: 0;
}
.nux-ob-strip .nux-ob-title { font-size: 15px; font-weight: 700; }
.nux-ob-strip .nux-ob-desc { font-size: 12px; color: rgba(255, 255, 255, 0.78); margin-top: 2px; line-height: 1.5; }
.nux-ob-strip .nux-ob-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.nux-ob-strip .nux-ob-btn {
  border: none;
  background: var(--nx-text-on-accent);
  color: var(--app-accent-deep, var(--app-accent, #155e75));
  border-radius: 999px;
  padding: 8px 18px;
  font-size: 13px;
  font-weight: 700;
  cursor: pointer;
  transition: transform 0.15s, box-shadow 0.15s;
}
.nux-ob-strip .nux-ob-btn:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(15, 23, 42, 0.18); }
.nux-ob-strip .nux-ob-dismiss {
  border: none;
  background: transparent;
  color: rgba(255, 255, 255, 0.7);
  font-size: 14px;
  line-height: 1;
  cursor: pointer;
  padding: 4px 6px;
}
.nux-ob-strip .nux-ob-dismiss:hover { color: var(--nx-text-on-accent); }@media (max-width: 480px){
  .nux-ob-strip { flex-direction: column; align-items: stretch; gap: 10px; }
  .nux-ob-strip .nux-ob-actions { justify-content: stretch; }
  .nux-ob-strip .nux-ob-btn { flex: 1; text-align: center; }
}

/* ===== 统一线性图标 ===== */
.nux-icon {
  display: inline-block;
  vertical-align: -0.125em;
  flex: none;
}

/* ===== 标签 nux-tag ===== */
.nux-tag {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 10px;
  border-radius: var(--nx-radius-full);
  font-size: var(--nx-text-xs);
  font-weight: 500;
  line-height: 20px;
  white-space: nowrap;
  border: 1px solid transparent;
  color: var(--nx-text-secondary);
  background: var(--nx-bg-muted);
}
.nux-tag--sm { padding: 0 8px; font-size: 11px; line-height: 18px; }
.nux-tag--primary { color: var(--app-accent); background: rgba(var(--app-accent-rgb), 0.12); }
.nux-tag--success { color: var(--nx-success); background: rgba(var(--nx-success-rgb), 0.12); }
.nux-tag--warning { color: var(--nx-warning); background: rgba(var(--nx-warning-rgb), 0.12); }
.nux-tag--danger { color: var(--nx-danger); background: rgba(var(--nx-danger-rgb), 0.12); }
.nux-tag--info { color: var(--nx-info); background: rgba(var(--nx-info-rgb), 0.12); }
.nux-tag--plain { background: transparent; border-color: var(--nx-border); }
.nux-tag--plain.nux-tag--primary { border-color: rgba(var(--app-accent-rgb), 0.4); }
.nux-tag--plain.nux-tag--success { border-color: rgba(var(--nx-success-rgb), 0.4); }
.nux-tag--plain.nux-tag--warning { border-color: rgba(var(--nx-warning-rgb), 0.4); }
.nux-tag--plain.nux-tag--danger { border-color: rgba(var(--nx-danger-rgb), 0.4); }
.nux-tag--plain.nux-tag--info { border-color: rgba(var(--nx-info-rgb), 0.4); }

/* ===== nexus-components-conversation.css ===== */
.nx-conv-list {
  display: flex;
  flex-direction: column;
  height: 100%;
  min-height: 0;
  font-size: var(--nx-text-sm, 0.875rem);
}

.nx-conv-list-header {
  display: flex;
  flex-direction: column;
  gap: var(--nx-space-2, 0.5rem);
  padding: var(--nx-space-3, 0.75rem) var(--nx-space-3, 0.75rem) var(--nx-space-2, 0.5rem);
}

.nx-conv-list-search {
  position: relative;
  display: flex;
  align-items: center;
}

.nx-conv-list-search > svg {
  position: absolute;
  left: 10px;
  color: var(--nx-text-muted, #94a3b8);
  pointer-events: none;
}

.nx-conv-list-search-input {
  width: 100%;
  padding: 0.4375rem 0.75rem 0.4375rem 2rem;
  font-size: inherit;
  font-family: inherit;
  color: var(--nx-text-body, #334155);
  background: var(--nx-bg-muted, #f1f5f9);
  border: 1px solid transparent;
  border-radius: var(--nx-radius-md, 10px);
  outline: none;
  transition: background var(--nx-transition-fast), border-color var(--nx-transition-fast), box-shadow var(--nx-transition-fast);
}

.nx-conv-list-search-input::placeholder { color: var(--nx-text-muted, #94a3b8); }

.nx-conv-list-search-input:focus {
  background: var(--nx-bg-surface, #ffffff);
  border-color: var(--nx-border-accent, rgba(99, 102, 241, 0.3));
  box-shadow: 0 0 0 3px var(--nx-accent-soft, rgba(99, 102, 241, 0.12));
}

.nx-conv-list-new {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 0.5rem 0.875rem;
  font-size: var(--nx-text-sm, 0.875rem);
  font-weight: 500;
  font-family: inherit;
  color: var(--nx-text-on-accent, #ffffff);
  background: var(--nx-accent, var(--nx-primary, #6366f1));
  border: none;
  border-radius: var(--nx-radius-md, 10px);
  cursor: pointer;
  transition: background var(--nx-transition-fast), transform var(--nx-transition-fast), opacity var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}

.nx-conv-list-new:hover { background: var(--nx-accent-hover, var(--app-accent-hover, #818cf8)); }
.nx-conv-list-new:active { transform: scale(0.98); }
.nx-conv-list-new:disabled { opacity: 0.6; cursor: default; }
.nx-conv-list-new:focus-visible { outline: 2px solid var(--nx-accent, var(--nx-primary, #6366f1)); outline-offset: 2px; }

.nx-conv-list-error {
  display: flex;
  align-items: center;
  gap: var(--nx-space-2, 0.5rem);
  margin: 0 var(--nx-space-3, 0.75rem) var(--nx-space-2, 0.5rem);
  padding: var(--nx-space-2, 0.5rem) var(--nx-space-3, 0.75rem);
  font-size: var(--nx-text-xs, 0.75rem);
  color: var(--nx-danger, #ef4444);
  background: rgba(var(--nx-danger-rgb, 239, 68, 68), 0.08);
  border: 1px solid rgba(var(--nx-danger-rgb, 239, 68, 68), 0.3);
  border-radius: var(--nx-radius-sm, 6px);
}

.nx-conv-list-error span { flex: 1; word-break: break-word; }

.nx-conv-list-error button {
  flex-shrink: 0;
  padding: 0.25rem 0.625rem;
  font-size: var(--nx-text-xs, 0.75rem);
  font-family: inherit;
  color: var(--nx-danger, #ef4444);
  background: rgba(var(--nx-danger-rgb, 239, 68, 68), 0.1);
  border: 1px solid rgba(var(--nx-danger-rgb, 239, 68, 68), 0.35);
  border-radius: var(--nx-radius-sm, 6px);
  cursor: pointer;
  transition: background var(--nx-transition-fast);
}

.nx-conv-list-error button:hover { background: rgba(var(--nx-danger-rgb, 239, 68, 68), 0.16); }

.nx-conv-list-skeleton {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: var(--nx-space-1, 0.25rem) var(--nx-space-3, 0.75rem) var(--nx-space-3, 0.75rem);
}

.nx-conv-list-skeleton-item {
  height: 52px;
  border-radius: var(--nx-radius-md, 10px);
  background: linear-gradient(90deg, var(--nx-bg-muted, #f1f5f9) 25%, var(--nx-bg-hover, #e2e8f0) 50%, var(--nx-bg-muted, #f1f5f9) 75%);
  background-size: 200% 100%;
  animation: nx-conv-shimmer 1.2s infinite;
}

@keyframes nx-conv-shimmer {
  0% { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

.nx-conv-list-empty {
  padding: var(--nx-space-8, 2rem) var(--nx-space-4, 1rem);
  font-size: var(--nx-text-xs, 0.75rem);
  text-align: center;
  color: var(--nx-text-muted, #94a3b8);
}

.nx-conv-list-items {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  margin: 0;
  padding: 0 var(--nx-space-2, 0.5rem) var(--nx-space-3, 0.75rem);
  list-style: none;
}

.nx-conv-list-item {
  position: relative;
  padding: var(--nx-space-2, 0.5rem) var(--nx-space-2, 0.5rem) var(--nx-space-2, 0.5rem) var(--nx-space-3, 0.75rem);
  border-radius: var(--nx-radius-md, 10px);
  cursor: pointer;
  transition: background var(--nx-transition-fast), opacity var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}

.nx-conv-list-item + .nx-conv-list-item { margin-top: 2px; }
.nx-conv-list-item:hover { background: var(--nx-bg-hover, #f1f5f9); }
.nx-conv-list-item:focus-visible { outline: 2px solid var(--nx-accent, var(--nx-primary, #6366f1)); outline-offset: -2px; }

.nx-conv-list-item.is-active { background: var(--nx-accent-soft, rgba(99, 102, 241, 0.12)); }

.nx-conv-list-item.is-active::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  width: 3px;
  height: 56%;
  transform: translateY(-50%);
  border-radius: var(--nx-radius-full, 9999px);
  background: var(--nx-accent, var(--nx-primary, #6366f1));
}

.nx-conv-list-item.is-archived { opacity: 0.55; cursor: default; }

.nx-conv-list-item-main {
  display: flex;
  align-items: center;
  gap: var(--nx-space-2, 0.5rem);
}

.nx-conv-list-item-title {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-weight: 500;
  color: var(--nx-text-heading, #0f172a);
}

.nx-conv-list-item.is-active .nx-conv-list-item-title { color: var(--nx-text-accent, var(--nx-primary, #6366f1)); }

.nx-conv-list-item-badge {
  flex-shrink: 0;
  padding: 1px 6px;
  font-size: 11px;
  line-height: 1.4;
  color: var(--nx-warning-text, var(--nx-warning, #f59e0b));
  background: var(--nx-warning-soft, rgba(245, 158, 11, 0.12));
  border-radius: var(--nx-radius-full, 9999px);
}

.nx-conv-list-item-sub {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--nx-space-2, 0.5rem);
  margin-top: 2px;
}

.nx-conv-list-item-time {
  flex-shrink: 0;
  font-size: var(--nx-text-xs, 0.75rem);
  color: var(--nx-text-muted, #94a3b8);
}

.nx-conv-list-item-actions {
  display: flex;
  align-items: center;
  gap: 2px;
  opacity: 0;
  transition: opacity var(--nx-transition-fast);
}

.nx-conv-list-item:hover .nx-conv-list-item-actions,
.nx-conv-list-item:focus-within .nx-conv-list-item-actions,
.nx-conv-list-item.is-active .nx-conv-list-item-actions { opacity: 1; }

@media (hover: none) {
  .nx-conv-list-item-actions { opacity: 1; }
}

.nx-conv-list-item-btn {
  padding: 0.1875rem 0.375rem;
  font-size: var(--nx-text-xs, 0.75rem);
  font-family: inherit;
  color: var(--nx-text-secondary, #64748b);
  background: transparent;
  border: none;
  border-radius: var(--nx-radius-sm, 6px);
  cursor: pointer;
  transition: background var(--nx-transition-fast), color var(--nx-transition-fast);
  -webkit-tap-highlight-color: transparent;
}

.nx-conv-list-item-btn:hover { color: var(--nx-text-heading, #0f172a); background: var(--nx-bg-subtle, rgba(0, 0, 0, 0.04)); }
.nx-conv-list-item-btn:focus-visible { outline: 2px solid var(--nx-accent, var(--nx-primary, #6366f1)); outline-offset: 1px; }

.nx-conv-list-item-btn.is-danger:hover {
  color: var(--nx-danger, #ef4444);
  background: rgba(var(--nx-danger-rgb, 239, 68, 68), 0.1);
}

@media (hover: none) and (pointer: coarse) {
  .nx-conv-list-search-input { font-size: 16px; }
}

/* ===== nexus-components-settings.css ===== */
/* 设置中心（nux-settings-drawer）与自动化管理（nux-automation）共享样式 */
.nx-settings-overlay {
  position: fixed; inset: 0; z-index: var(--nx-z-settings); background: var(--nx-overlay-bg, rgba(15, 32, 50, 0.42));
  backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px);
}
.nx-settings-drawer {
  position: fixed; z-index: var(--nx-z-settings-panel); inset: 0; display: flex; align-items: center; justify-content: center;
  outline: none;
}
.nx-settings-wrap {
  display: flex; width: min(880px, calc(100vw - 32px)); height: min(600px, calc(100vh - 64px)); height: min(600px, calc(100dvh - 64px));
  border-radius: 18px; overflow: hidden; background: var(--nx-bg-surface, #fff);
  box-shadow: 0 24px 64px rgba(15, 32, 50, 0.22);
}
.nx-settings-rail {
  width: 232px; flex: none; display: flex; flex-direction: column; background: var(--nx-bg-secondary, #f3f6fa);
  border-right: 1px solid var(--nx-border, #e4e9f0);
}
.nx-settings-brand {
  display: flex; align-items: center; gap: 10px; padding: 18px 16px 16px;
}
.nx-settings-brand-icon {
  width: 36px; height: 36px; border-radius: 11px; display: flex; align-items: center; justify-content: center;
  background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.12); font-size: 18px;
}
.nx-settings-brand-text { flex: 1; min-width: 0; }
.nx-settings-brand-text strong { display: block; font-size: 14px; color: var(--nx-text-heading, #1f2937); }
.nx-settings-brand-text em { font-style: normal; font-size: 11px; color: var(--nx-text-tertiary, #9aa5b5); }
.nx-settings-close {
  border: none; background: none; font-size: 13px; color: var(--nx-text-tertiary, #9aa5b5);
  width: 28px; height: 28px; border-radius: 8px; cursor: pointer;
}
.nx-settings-close:hover { background: var(--nx-bg-hover, rgba(0, 0, 0, 0.05)); color: var(--nx-text-body, #475569); }
.nx-settings-nav { flex: 1; overflow-y: auto; padding: 4px 10px; }
.nx-settings-nav-item {
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
  border: none; background: none; border-radius: 12px; padding: 10px 10px; margin-bottom: 2px; cursor: pointer;
}
.nx-settings-nav-ico {
  width: 34px; height: 34px; flex: none; border-radius: 10px; display: flex; align-items: center; justify-content: center;
  font-size: 16px; background: var(--nx-bg-surface, #fff); border: 1px solid var(--nx-border, #e4e9f0);
}
.nx-settings-nav-item.active .nx-settings-nav-ico { background: var(--app-accent, #6366f1); border-color: var(--app-accent, #6366f1); }
.nx-settings-nav-main { min-width: 0; }
.nx-settings-nav-label { display: block; font-size: 13px; font-weight: 600; color: var(--nx-text-heading, #1f2937); }
.nx-settings-nav-desc { display: block; font-size: 11px; color: var(--nx-text-tertiary, #9aa5b5); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nx-settings-nav-item.active .nx-settings-nav-label { color: var(--app-accent, #6366f1); }
.nx-settings-nav-item.active { background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.08); }
.nx-settings-rail-foot { padding: 12px 16px; font-size: 11px; color: var(--nx-text-tertiary, #9aa5b5); }
.nx-settings-body { flex: 1; min-width: 0; display: flex; flex-direction: column; background: var(--nx-bg-surface, #fff); }
.nx-settings-page-head { padding: 20px 24px 0; }
.nx-settings-page-title { margin: 0; font-size: 17px; color: var(--nx-text-heading, #1f2937); }
.nx-settings-page-desc { margin: 4px 0 0; font-size: 12px; color: var(--nx-text-tertiary, #9aa5b5); }
.nx-settings-page { flex: 1; overflow-y: auto; padding: 14px 24px 24px; }
@media (max-width: 768px) {
  .nx-settings-drawer { align-items: flex-end; }
  .nx-settings-wrap { width: 100vw; height: min(640px, 92dvh); border-radius: 18px 18px 0 0; flex-direction: column; padding-bottom: var(--nx-safe-bottom); }
  .nx-settings-rail { width: 100%; flex-direction: column; border-right: none; border-bottom: 1px solid var(--nx-border, #e4e9f0); flex: none; }
  .nx-settings-brand { padding: 14px 16px 8px; }
  .nx-settings-nav { display: flex; overflow-x: auto; padding: 0 12px 10px; gap: 8px; }
  .nx-settings-nav-item { flex: none; padding: 8px 12px; border-radius: 999px; background: var(--nx-bg-surface, #fff); border: 1px solid var(--nx-border, #e4e9f0); }
  .nx-settings-nav-ico { width: 26px; height: 26px; font-size: 14px; border: none; border-radius: 8px; }
  .nx-settings-nav-desc { display: none; }
  .nx-settings-nav-item.active { background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.1); border-color: rgba(var(--app-accent-rgb, 99, 102, 241), 0.3); }
  .nx-settings-rail-foot { display: none; }
  .nx-settings-page { padding: 12px 16px 24px; }
}
.nx-settings-fade-enter-active, .nx-settings-fade-leave-active { transition: opacity 0.18s; }
.nx-settings-fade-enter-from, .nx-settings-fade-leave-to { opacity: 0; }
.nx-settings-pop-enter-active, .nx-settings-pop-leave-active { transition: transform 0.22s cubic-bezier(0.2, 0.9, 0.3, 1), opacity 0.2s; }
.nx-settings-pop-enter-from, .nx-settings-pop-leave-to { transform: translateY(14px) scale(0.985); opacity: 0; }

/* 自动化管理 */
.nx-auto { max-width: 560px; margin: 0 auto; }
.nx-auto-loading { display: grid; gap: 12px; }
.nx-auto-skeleton { height: 108px; border-radius: 14px; background: var(--nx-bg-tertiary, #e5eaf1); position: relative; overflow: hidden; }
.nx-auto-skeleton::after {
  content: ''; position: absolute; inset: 0; transform: translateX(-100%);
  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.55), transparent);
  animation: nx-auto-shimmer 1.4s infinite;
}
@keyframes nx-auto-shimmer { 100% { transform: translateX(100%); } }
.nx-auto-list { display: grid; gap: 12px; }
.nx-auto-card {
  background: var(--nx-bg-surface, #fff); border: 1px solid var(--nx-border, #e4e9f0);
  border-radius: 14px; padding: 14px 16px;
}
.nx-auto-card-head { display: flex; align-items: center; gap: 10px; }
.nx-auto-ico {
  width: 38px; height: 38px; flex: none; border-radius: 11px; display: flex; align-items: center; justify-content: center;
  font-size: 18px; background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.1);
}
.nx-auto-card-name { flex: 1; min-width: 0; display: flex; align-items: center; gap: 8px; }
.nx-auto-card-name strong { font-size: 14px; color: var(--nx-text-heading, #1f2937); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nx-auto-card-status { font-size: 11px; padding: 2px 8px; border-radius: 999px; flex: none; }
.nx-auto-card-status.on { background: rgba(16, 185, 129, 0.12); color: var(--nx-success, #0f9d6e); }
.nx-auto-card-status.off { background: var(--nx-bg-tertiary, #eef1f6); color: var(--nx-text-tertiary, #9aa5b5); }
.nx-auto-switch { position: relative; width: 42px; height: 24px; flex: none; }
.nx-auto-switch input { position: absolute; inset: 0; opacity: 0; cursor: pointer; }
.nx-auto-switch span { position: absolute; inset: 0; border-radius: 999px; background: var(--nx-switch-track, #d5dce6); transition: background 0.18s; }
.nx-auto-switch span::after {
  content: ''; position: absolute; top: 3px; left: 3px; width: 18px; height: 18px; border-radius: 50%;
  background: var(--nx-text-on-accent, #fff); box-shadow: 0 1px 3px rgba(15, 32, 50, 0.25); transition: transform 0.18s;
}
.nx-auto-switch input:checked + span { background: var(--app-accent, #6366f1); }
.nx-auto-switch input:checked + span::after { transform: translateX(18px); }
.nx-auto-flow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 12px 0 8px; }
.nx-auto-flow-node { font-size: 12px; padding: 4px 10px; border-radius: 999px; }
.nx-auto-trigger { background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.07); color: var(--app-accent, #6366f1); border: 1px dashed rgba(var(--app-accent-rgb, 99, 102, 241), 0.35); }
.nx-auto-action { background: var(--nx-bg-tertiary, #eef1f6); color: var(--nx-text-body, #475569); border: 1px solid var(--nx-border, #e4e9f0); }
.nx-auto-flow-arrow { color: var(--nx-text-tertiary, #9aa5b5); font-size: 13px; }
.nx-auto-card-meta { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--nx-text-tertiary, #9aa5b5); }
.nx-auto-dot { width: 6px; height: 6px; border-radius: 50%; }
.nx-auto-dot.ok { background: var(--nx-success, #10b981); }
.nx-auto-dot.err { background: var(--nx-danger, #ef4444); }
.nx-auto-card-actions { display: flex; gap: 8px; margin-top: 10px; }
.nx-auto-act { border: 1px solid var(--nx-border, #e4e9f0); background: var(--nx-bg-surface, #fff); border-radius: 9px; padding: 6px 12px; font-size: 12px; color: var(--nx-text-secondary, #64748b); cursor: pointer; }
.nx-auto-act:hover { border-color: rgba(var(--app-accent-rgb, 99, 102, 241), 0.4); color: var(--app-accent, #6366f1); }
.nx-auto-act.danger { color: var(--nx-danger, #dc2626); }
.nx-auto-act.danger:hover { border-color: rgba(220, 38, 38, 0.4); color: var(--nx-danger, #dc2626); }
.nx-auto-empty { text-align: center; padding: 40px 20px; }
.nx-auto-empty-icon { font-size: 40px; }
.nx-auto-empty h3 { margin: 12px 0 6px; font-size: 16px; color: var(--nx-text-heading, #1f2937); }
.nx-auto-empty p { margin: 0; font-size: 13px; color: var(--nx-text-tertiary, #9aa5b5); }
.nx-auto-add {
  width: 100%; margin-top: 14px; border: 1px dashed rgba(var(--app-accent-rgb, 99, 102, 241), 0.45);
  background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.05); color: var(--app-accent, #6366f1);
  border-radius: 12px; padding: 12px; font-size: 14px; font-weight: 600; cursor: pointer;
}
.nx-auto-add:hover { background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.1); }
.nx-auto-modal-mask { position: fixed; inset: 0; z-index: var(--nx-z-settings); background: var(--nx-overlay-bg, rgba(15, 32, 50, 0.42)); }
.nx-auto-modal {
  position: fixed; z-index: var(--nx-z-settings-panel); left: 50%; top: 50%; transform: translate(-50%, -50%);
  width: min(460px, calc(100vw - 30px)); max-height: min(620px, 88vh); max-height: min(620px, 88dvh); display: flex; flex-direction: column;
  background: var(--nx-bg-surface, #fff); border-radius: 16px; box-shadow: 0 24px 60px rgba(15, 32, 50, 0.25);
}
.nx-auto-modal-head { display: flex; align-items: center; justify-content: space-between; padding: 16px 18px 0; }
.nx-auto-modal-head h3 { margin: 0; font-size: 16px; color: var(--nx-text-heading, #1f2937); }
.nx-auto-modal-close { border: none; background: none; font-size: 14px; color: var(--nx-text-tertiary, #9aa5b5); cursor: pointer; padding: 6px; border-radius: 8px; }
.nx-auto-modal-close:hover { background: var(--nx-bg-hover, #eef1f6); }
.nx-auto-modal-body { flex: 1; overflow-y: auto; padding: 14px 18px 4px; }
.nx-auto-step-label { margin: 0 0 10px; font-size: 13px; font-weight: 600; color: var(--nx-text-body, #475569); }
.nx-auto-tpl-grid { display: grid; gap: 10px; }
.nx-auto-tpl {
  display: flex; align-items: center; gap: 12px; text-align: left; padding: 12px;
  border: 1px solid var(--nx-border, #e4e9f0); border-radius: 12px; background: var(--nx-bg-surface, #fff); cursor: pointer;
}
.nx-auto-tpl:hover { border-color: rgba(var(--app-accent-rgb, 99, 102, 241), 0.45); background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.04); }
.nx-auto-tpl-ico { width: 40px; height: 40px; flex: none; border-radius: 11px; display: flex; align-items: center; justify-content: center; font-size: 19px; background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.1); }
.nx-auto-tpl strong { display: block; font-size: 14px; color: var(--nx-text-heading, #1f2937); }
.nx-auto-tpl em { font-style: normal; font-size: 12px; color: var(--nx-text-tertiary, #9aa5b5); line-height: 1.5; }
.nx-auto-form-field { margin-bottom: 14px; }
.nx-auto-form-field > label { display: block; font-size: 12px; font-weight: 600; color: var(--nx-text-secondary, #64748b); margin-bottom: 6px; }
.nx-auto-form-field input, .nx-auto-form-field select {
  border: 1px solid var(--nx-border, #e4e9f0); border-radius: 10px; padding: 9px 12px;
  font-size: 13px; font-family: inherit; color: var(--nx-text-heading, #1f2937); outline: none; width: 100%; background: var(--nx-bg-surface, #fff);
}
.nx-auto-form-field input:focus, .nx-auto-form-field select:focus { border-color: rgba(var(--app-accent-rgb, 99, 102, 241), 0.45); box-shadow: 0 0 0 3px rgba(var(--app-accent-rgb, 99, 102, 241), 0.08); }
.nx-auto-presets { display: flex; flex-wrap: wrap; gap: 8px; }
.nx-auto-preset { border: 1px solid var(--nx-border, #e4e9f0); background: var(--nx-bg-surface, #fff); border-radius: 999px; padding: 6px 12px; font-size: 12px; color: var(--nx-text-secondary, #64748b); cursor: pointer; }
.nx-auto-preset.active { border-color: rgba(var(--app-accent-rgb, 99, 102, 241), 0.5); background: rgba(var(--app-accent-rgb, 99, 102, 241), 0.08); color: var(--app-accent, #6366f1); font-weight: 600; }
.nx-auto-custom-trigger { display: flex; align-items: center; gap: 8px; margin-top: 10px; }
.nx-auto-custom-unit { font-size: 12px; color: var(--nx-text-secondary, #64748b); }
.nx-auto-modal-foot { display: flex; justify-content: flex-end; gap: 10px; padding: 12px 18px 16px; }
.nx-auto-btn { border: none; border-radius: 10px; padding: 9px 20px; font-size: 13px; font-weight: 600; cursor: pointer; font-family: inherit; }
.nx-auto-btn.primary { background: var(--app-accent, #6366f1); color: #fff; }
.nx-auto-btn.primary:hover { filter: brightness(1.06); }
.nx-auto-btn.ghost { background: var(--nx-bg-tertiary, #eef1f6); color: var(--nx-text-secondary, #64748b); }
.nx-auto-fade-enter-active, .nx-auto-fade-leave-active { transition: opacity 0.16s; }
.nx-auto-fade-enter-from, .nx-auto-fade-leave-to { opacity: 0; }
.nx-auto-pop-enter-active, .nx-auto-pop-leave-active { transition: transform 0.2s cubic-bezier(0.2, 0.9, 0.3, 1), opacity 0.18s; }
.nx-auto-pop-enter-from, .nx-auto-pop-leave-to { transform: translate(-50%, -46%) scale(0.97); opacity: 0; }
@media (prefers-reduced-motion: reduce) {
  .nx-settings-pop-enter-active, .nx-settings-pop-leave-active,
  .nx-auto-pop-enter-active, .nx-auto-pop-leave-active { transition: none; }
  .nx-auto-skeleton::after { animation: none; }
}

/* 开关轨令牌 --nx-switch-track 已收归 nexus-tokens.css（浅色/暗色双份） */
[data-theme="dark"] .nx-auto-skeleton::after {
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.08), transparent);
}

/* ===== nexus-layout.css ===== */
/* ========== Layout Base ========== */
.nux-layout-sidebar,
.nux-layout-topnav {
    min-height: 100vh;
    min-height: 100dvh;
    min-height: 100dvh;
    min-height: 100dvh;
}

/* ========== Header ========== */
.nux-layout-header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    height: calc(var(--nxs-header-h, 56px) + var(--nx-safe-top, 0px));
    padding-top: var(--nx-safe-top, 0px);
    display: flex;
    align-items: center;
    gap: var(--nx-space-3);
    padding-left: var(--nx-space-4);
    padding-right: var(--nx-space-4);
    background: var(--nx-bg-surface);
    border-bottom: 1px solid var(--nx-border);
    z-index: var(--nx-z-header);
    backdrop-filter: blur(12px);
}

.nux-layout-brand {
    display: flex;
    align-items: center;
    gap: var(--nx-space-2);
    font-weight: 600;
    font-size: var(--nx-text-lg);
    color: var(--nx-text-heading);
}

.nux-layout-brand-icon {
    font-size: 24px;
    line-height: 1;
}

.nux-layout-brand-name {
    white-space: nowrap;
}

.nux-layout-header-actions {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: var(--nx-space-2);
}

/* ========== Sidebar Layout ========== */
.nux-layout-sidebar .nux-layout-aside {
    position: fixed;
    top: calc(var(--nxs-header-h, 56px) + var(--nx-safe-top, 0px));
    left: 0;
    bottom: 0;
    width: var(--nxs-w, 240px);
    display: flex;
    flex-direction: column;
    background: var(--nx-bg-surface);
    border-right: 1px solid var(--nx-border);
    z-index: var(--nx-z-nav);
    transition: transform 0.3s ease;
}

.nux-layout-sidebar .nux-layout-nav {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
}

.nux-layout-sidebar .nux-layout-main {
    margin-left: var(--nxs-w, 240px);
    margin-top: calc(var(--nxs-header-h, 56px) + var(--nx-safe-top, 0px));
    padding: var(--nx-space-6);
    min-height: calc(100vh - var(--nxs-header-h, 56px) - var(--nx-safe-top, 0px));
    min-height: calc(100dvh - var(--nxs-header-h, 56px) - var(--nx-safe-top, 0px));
    min-height: calc(100dvh - var(--nxs-header-h, 56px) - var(--nx-safe-top, 0px));
}

/* ========== TopNav Layout ========== */
.nux-layout-topnav .nux-layout-topnav-nav {
    display: flex;
    align-items: center;
    gap: 2px;
    margin-left: var(--nx-space-4);
}

.nux-layout-topnav-item {
    padding: var(--nx-space-2) var(--nx-space-3);
    font-size: var(--nx-text-sm);
    color: var(--nx-text-secondary);
    text-decoration: none;
    border-radius: var(--nx-radius-md);
    transition: all var(--nx-transition-fast);
    white-space: nowrap;
}

.nux-layout-topnav-item:hover {
    color: var(--nx-text-heading);
    background: var(--nx-bg-hover);
}

.nux-layout-topnav-item.active {
    color: var(--app-accent, var(--nx-primary));
    background: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 10%, transparent);
    font-weight: 500;
}

.nux-layout-topnav-drawer {
    display: none;
    position: fixed;
    top: calc(var(--nxs-header-h, 56px) + var(--nx-safe-top, 0px));
    left: 0;
    bottom: 0;
    width: 280px;
    max-width: 85vw;
    background: var(--nx-bg-surface);
    border-right: 1px solid var(--nx-border);
    z-index: var(--nx-z-nav);
    padding: var(--nx-space-4);
    overflow-y: auto;
    transform: translateX(-100%);
    transition: transform 0.3s ease;
}

.nux-layout-topnav-drawer.open {
    transform: translateX(0);
    z-index: var(--nx-z-drawer);
}

/* ========== Nav Items ========== */
.nux-layout-nav {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: var(--nx-space-2);
}

.nux-layout-nav-group {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.nux-layout-nav-group + .nux-layout-nav-group {
    margin-top: var(--nx-space-2);
    padding-top: var(--nx-space-3);
    border-top: 1px solid var(--nx-border);
}

.nux-layout-nav-group-title {
    display: flex;
    align-items: center;
    gap: var(--nx-space-2);
    padding: var(--nx-space-1) var(--nx-space-3) var(--nx-space-2);
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 0.02em;
    color: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 55%, var(--nx-text-secondary));
}

.nux-layout-nav-group-title::before {
    content: "";
    width: 3px;
    height: 12px;
    border-radius: 2px;
    flex-shrink: 0;
    background: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 50%, transparent);
}

.nux-layout-nav-item {
    position: relative;
    display: flex;
    align-items: center;
    gap: var(--nx-space-3);
    padding: var(--nx-space-2) var(--nx-space-3);
    font-size: var(--nx-text-sm);
    color: var(--nx-text-secondary);
    text-decoration: none;
    border-radius: var(--nx-radius-md);
    transition: all var(--nx-transition-fast);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
}

.nux-layout-nav-item:hover {
    color: var(--nx-text-heading);
    background: var(--nx-bg-hover);
}

.nux-layout-nav-item.active {
    color: var(--app-accent, var(--nx-primary));
    background: color-mix(in srgb, var(--app-accent, var(--nx-primary)) 10%, transparent);
    font-weight: 500;
}

.nux-layout-nav-item.active::before {
    content: "";
    position: absolute;
    left: 0;
    top: 50%;
    transform: translateY(-50%);
    width: 3px;
    height: 16px;
    border-radius: 2px;
    background: var(--app-accent, var(--nx-primary));
}

.nux-layout-nav-item.active .nux-layout-nav-icon {
    color: var(--app-accent, var(--nx-primary));
}

.nux-layout-nav-icon {
    font-size: 18px;
    line-height: 1;
    width: 24px;
    text-align: center;
    flex-shrink: 0;
}

.nux-layout-nav-icon svg {
    display: block;
    margin: 0 auto;
}

.nux-layout-nav-badge {
    position: absolute;
    top: 10px;
    left: 100%;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    margin-left: -12px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 10px;
    line-height: 1;
    color: var(--nx-text-on-accent);
    background: var(--nx-danger, #ef4444);
    border-radius: 999px;
    pointer-events: none;
}

/* ========== Headerless (全高侧边栏，应用自带顶栏) ========== */
.nux-layout-sidebar.headerless .nux-layout-aside {
    top: 0;
}

.nux-layout-sidebar.headerless .nux-layout-main {
    margin-top: 0;
    min-height: 100vh;
    min-height: 100dvh;
    min-height: 100dvh;
    min-height: 100dvh;
}

.nux-layout-aside-brand {
    display: flex;
    align-items: center;
    gap: var(--nx-space-2);
    padding: var(--nx-space-4) var(--nx-space-3);
    font-weight: 600;
    font-size: var(--nx-text-lg);
    color: var(--nx-text-heading);
}

/* ========== Responsive ========== */
@media (max-width: 768px) {
    .nux-layout-sidebar .nux-layout-aside {
        transform: translateX(-100%);
    }

    .nux-layout-sidebar .nux-layout-aside.mobile-open {
        transform: translateX(0);
        z-index: var(--nx-z-drawer);
    }

    .nux-layout-sidebar .nux-layout-main {
        margin-left: 0;
        padding: var(--nx-space-4);
    }

    .nux-layout-topnav-drawer {
        display: block;
    }

    .nux-layout-header {
        padding: 0 var(--nx-space-3);
    }

    .nux-layout-brand-name {
        font-size: var(--nx-text-base);
    }
}

/* ========== Mobile topbar overflow containment (S9) ==========
   375 视口顶栏溢出收敛（gezhi 前3 判例平台化）：actions 溢出会让汉堡钮
   被推出视口（移动端导航断链）。契约：brand/label/应用钮依次让位，
   汉堡永不收缩。label 标签让位在 nux-menu-user 组件内。 */
@media (max-width: 480px) {
    .nux-layout-header {
        padding-left: 8px;
        padding-right: 5px;
        gap: var(--nx-space-1);
    }

    .nux-layout-header-actions {
        gap: 2px;
        min-width: 0;
        flex-shrink: 1;
    }

    .nux-layout-header-actions > * {
        min-width: 0;
        flex-shrink: 1;
    }

    .nux-layout-brand {
        min-width: 0;
        flex-shrink: 1;
    }

    .nux-layout-brand-name {
        max-width: 4em;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

    .nux-layout-header-actions .nux-btn {
        white-space: nowrap;
    }

    .nux-layout-header > .nx-hamburger {
        flex-shrink: 0;
    }
}

/* ========== Utility Classes ========== */
/* nx-show-mobile 移动端强制 flex 是有意设计：.nx-hamburger 基础态 display:none，
   依赖此 !important 翻转显示并让其 align/justify 居中生效（全工作区消费者均为汉堡钮）。 */
.nx-show-mobile { display: none !important; }
@media (max-width: 768px) {
    .nx-hide-mobile { display: none !important; }
    .nx-show-mobile { display: flex !important; }
}

/* ========== Sidebar Extras ========== */
.nux-layout-aside.collapsed .nux-layout-nav-item {
    justify-content: center;
    padding-left: var(--nx-space-2);
    padding-right: var(--nx-space-2);
}

.nux-layout-aside.collapsed .nux-layout-nav-group-title {
    display: none;
}

.nux-layout-aside.collapsed .nux-layout-nav-label {
    display: none;
}

.nux-layout-aside-footer {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: var(--nx-space-2);
    border-top: 1px solid var(--nx-border);
}

.nux-layout-collapse-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 36px;
    border: none;
    border-radius: var(--nx-radius-md);
    background: transparent;
    color: var(--nx-text-secondary);
    cursor: pointer;
    transition: all var(--nx-transition-fast);
}

.nux-layout-collapse-btn:hover {
    color: var(--nx-text-heading);
    background: var(--nx-bg-hover);
}

.nux-layout-bottom-nav {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: var(--nx-z-header);
    display: flex;
    background: var(--nx-bg-surface);
    border-top: 1px solid var(--nx-border);
    padding-bottom: var(--nx-safe-bottom);
}

.nux-layout-bottom-nav-item {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2px;
    padding: 6px 0 8px;
    min-height: 52px;
    font-size: 11px;
    color: var(--nx-text-muted);
    text-decoration: none;
    -webkit-tap-highlight-color: transparent;
}

.nux-layout-bottom-nav-item .nux-layout-nav-icon {
    font-size: 20px;
    width: auto;
}

.nux-layout-bottom-nav-item.active {
    color: var(--app-accent, var(--nx-primary));
    font-weight: 500;
}

@media (max-width: 768px) {
    .nx-bottom-nav-mode .nux-layout-aside {
        display: none;
    }

    .nx-bottom-nav-mode .nux-layout-aside.mobile-open {
        display: flex;
        transform: translateX(0);
        z-index: var(--nx-z-drawer);
    }

    .nx-bottom-nav-mode .nux-layout-main {
        padding-bottom: calc(64px + var(--nx-safe-bottom));
    }
}

/* ========== Bottom Nav (独立底栏组件) ========== */
.nux-bottom-nav {
    display: none;
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: var(--nx-z-header);
    align-items: stretch;
    justify-content: space-around;
    background: var(--nx-glass-bg, var(--nx-bg-surface));
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    border-top: 1px solid var(--nx-border);
    padding-bottom: var(--nx-safe-bottom);
    box-shadow: 0 -4px 16px rgba(15, 23, 42, 0.04);
}

.nux-bottom-nav-item {
    position: relative;
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2px;
    min-width: 48px;
    min-height: 48px;
    padding: 6px 0 8px;
    font-size: 10px;
    line-height: 1.2;
    color: var(--nx-text-secondary);
    background: none;
    border: none;
    cursor: pointer;
    text-decoration: none;
    transition: color var(--nx-transition-fast);
    -webkit-tap-highlight-color: transparent;
}

.nux-bottom-nav-item:active { color: var(--app-accent, var(--nx-primary)); }

.nux-bottom-nav-item.active {
    color: var(--app-accent, var(--nx-primary));
    font-weight: 500;
}

.nux-bottom-nav-icon {
    font-size: 20px;
    line-height: 1;
}

.nux-bottom-nav-icon svg {
    display: block;
    margin: 0 auto;
}

.nux-bottom-nav-label {
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.nux-bottom-nav-badge {
    position: absolute;
    top: 4px;
    left: 50%;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    margin-left: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 10px;
    line-height: 1;
    color: var(--nx-text-on-accent);
    background: var(--nx-danger, #ef4444);
    border-radius: 999px;
    pointer-events: none;
}

@media (max-width: 768px) {
    .nux-bottom-nav { display: flex; }
}

/* 独立底栏内容避让：nux-layout 体系自动生效，自绘主容器挂 .nx-bottom-nav-safe 显式生效 */
@media (max-width: 768px) {
    body:has(.nux-bottom-nav) .nux-layout-main,
    body:has(.nux-bottom-nav) .nx-bottom-nav-safe {
        padding-bottom: calc(64px + var(--nx-safe-bottom));
    }
}

/* ===== nexus-side-panel.css ===== */
/* ========== nux-side-panel 统一侧栏（工作台/会话列表 + 个性化） ==========
   可覆写变量: --nxsp-accent(品牌色) --nxsp-bg(底色) --nxsp-border --nxsp-w(宽)
   --nxsp-dw(抽屉宽) --nxsp-text --nxsp-text-muted --nxsp-brand-grad(品牌字渐变) */
.nxsp {
    --nxsp-accent: var(--app-accent, var(--nx-primary, #4f6bed));
    --nxsp-bg: var(--nx-bg-surface, #fff);
    --nxsp-border: var(--nx-border, #e6ebf5);
    --nxsp-text: var(--nx-text, #1b2550);
    --nxsp-text-muted: var(--nx-text-secondary, #7d8aa3);
    --nxsp-surface: color-mix(in srgb, var(--nxsp-text) 4%, var(--nxsp-bg));
    --nxsp-tint: color-mix(in srgb, var(--nxsp-accent) 10%, transparent);
    --nxsp-tint-strong: color-mix(in srgb, var(--nxsp-accent) 17%, transparent);
    --nxsp-risk: var(--nx-danger, #d5455c);
    position: relative;
    flex: 0 0 auto;
    width: var(--nxsp-w, 264px);
    color: var(--nxsp-text);
}

.nxsp[data-layout="sticky"] { position: sticky; top: 0; height: 100vh; height: 100dvh; }
.nxsp[data-layout="fill"] { height: 100%; min-height: 0; }

.nxsp-aside {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
    background: var(--nxsp-bg);
    border-right: 1px solid var(--nxsp-border);
}

.nxsp-head { display: flex; align-items: center; gap: 8px; padding: 18px 14px 10px; }
.nxsp-brand {
    display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0;
    padding: 0; border: none; background: none; cursor: pointer; font: inherit; text-align: left;
}
.nxsp-brand-img { width: 30px; height: 30px; border-radius: 9px; flex-shrink: 0; }
.nxsp-brand-ico { font-size: 22px; line-height: 1; flex-shrink: 0; }
.nxsp-brand-name {
    font-size: 18px; font-weight: 800; letter-spacing: .3px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    background: var(--nxsp-brand-grad, var(--nxsp-text));
    -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent;
}
.nxsp-close {
    width: 34px; height: 34px; flex-shrink: 0; margin-left: auto; border: none; border-radius: 10px;
    background: transparent; color: var(--nxsp-text-muted); font-size: 16px; cursor: pointer;
}
.nxsp-close:hover { background: var(--nxsp-surface); color: var(--nxsp-text); }

.nxsp-action { padding: 14px 12px 10px; }
.nxsp-head + .nxsp-action { padding-top: 2px; }
.nxsp-action-btn {
    display: flex; align-items: center; justify-content: center; gap: 7px;
    width: 100%; min-height: 42px; padding: 0 14px; border-radius: 12px;
    border: 1px solid var(--nxsp-tint-strong); background: var(--nxsp-tint); color: var(--nxsp-accent);
    font-size: 14px; font-weight: 600; font-family: inherit; cursor: pointer;
    transition: background .16s ease, border-color .16s ease;
}
.nxsp-action-btn:hover:not(:disabled) { background: var(--nxsp-tint-strong); }
.nxsp-action-btn:disabled { opacity: .5; cursor: not-allowed; }
.nxsp-action-ico { font-size: 15px; line-height: 1; }

.nxsp-tabs {
    display: flex; flex-wrap: nowrap; gap: 4px; padding: 0 12px 10px;
    overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: none;
}
.nxsp-tabs::-webkit-scrollbar { display: none; }
.nxsp-tab {
    flex: 0 0 auto;
    padding: 6px 10px; border: none; border-radius: 9px; background: transparent;
    color: var(--nxsp-text-muted); font-size: 12.5px; font-family: inherit; cursor: pointer;
    transition: background .15s ease, color .15s ease;
}
.nxsp-tab:hover { background: var(--nxsp-tint); color: var(--nxsp-accent); }
.nxsp-tab.active { background: var(--nxsp-tint-strong); color: var(--nxsp-accent); font-weight: 600; }

.nxsp-tools { padding: 0 12px 8px; }
.nxsp-tools-actions { display: flex; justify-content: flex-end; }
.nxsp-search {
    display: flex; align-items: center; gap: 7px; padding: 0 10px;
    border: 1px solid var(--nxsp-border); border-radius: 10px; background: var(--nxsp-bg);
    color: var(--nxsp-text-muted);
}
.nxsp-search:focus-within { border-color: var(--nxsp-accent); }
.nxsp-search-input {
    flex: 1; min-width: 0; height: 36px; border: none; outline: none; background: transparent;
    color: var(--nxsp-text); font-size: 13px; font-family: inherit;
}
.nxsp-search-input::-webkit-search-cancel-button { display: none; }
.nxsp-search-clear {
    width: 22px; height: 22px; border: none; border-radius: 6px; background: transparent;
    color: var(--nxsp-text-muted); font-size: 12px; cursor: pointer;
}
.nxsp-search-clear:hover { background: var(--nxsp-surface); color: var(--nxsp-text); }

.nxsp-list { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 2px 10px 8px; }
.nxsp-list::-webkit-scrollbar { width: 4px; }
.nxsp-list::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--nxsp-text) 14%, transparent); border-radius: 2px; }
.nxsp-group-label {
    padding: 8px 8px 4px; font-size: 11px; font-weight: 600; letter-spacing: .4px;
    color: var(--nxsp-text-muted);
}
.nxsp-item {
    display: flex; align-items: center; gap: 10px; width: 100%;
    padding: 9px 10px; margin-bottom: 2px; border: none; border-radius: 10px;
    background: transparent; cursor: pointer; text-align: left; font: inherit; color: inherit;
    transition: background .15s ease;
}
.nxsp-item:hover { background: var(--nxsp-surface); }
.nxsp-item.active { background: var(--nxsp-tint); }
.nxsp-item-ico {
    width: 34px; height: 34px; flex-shrink: 0; border-radius: 9px;
    display: inline-flex; align-items: center; justify-content: center;
    font-size: 16px; color: var(--nx-text-on-accent); background: var(--nxsp-tint-strong);
}
.nxsp-item-ico.is-grad { color: var(--nx-text-on-accent); }
.nxsp-item-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.nxsp-item-title {
    font-size: 13.5px; color: var(--nxsp-text);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.nxsp-item-meta {
    font-size: 11.5px; color: var(--nxsp-text-muted);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.nxsp-item.active .nxsp-item-title { color: var(--nxsp-accent); font-weight: 600; }
.nxsp-spin {
    width: 13px; height: 13px; flex-shrink: 0; border-radius: 50%;
    border: 2px solid var(--nxsp-border); border-top-color: var(--nxsp-accent);
    animation: nxsp-spin .8s linear infinite;
}
@keyframes nxsp-spin { to { transform: rotate(360deg); } }
.nxsp-badge {
    flex-shrink: 0; padding: 1px 8px; border-radius: 7px; font-size: 11.5px; font-weight: 600;
    color: var(--nxsp-risk); background: color-mix(in srgb, var(--nxsp-risk) 12%, transparent);
}
.nxsp-del {
    width: 26px; height: 26px; flex-shrink: 0; border-radius: 7px;
    display: inline-flex; align-items: center; justify-content: center;
    color: var(--nxsp-text-muted); font-size: 12px; opacity: 0;
    transition: opacity .15s ease, background .15s ease, color .15s ease;
}
.nxsp-item:hover .nxsp-del { opacity: 1; }
.nxsp-del:hover { background: color-mix(in srgb, var(--nxsp-risk) 12%, transparent); color: var(--nxsp-risk); }
/* 触屏无 hover：删除按钮常显，避免不可达（照 feedback.css 通知删除按钮的已验证模式） */
@media (hover: none) and (pointer: coarse) {
    .nxsp-del { opacity: 1; }
}

.nxsp-empty {
    display: flex; flex-direction: column; align-items: center; gap: 6px;
    padding: 30px 18px; text-align: center;
}
.nxsp-empty-ico { font-size: 22px; color: var(--nxsp-text-muted); opacity: .7; }
.nxsp-empty-title { font-size: 12.5px; color: var(--nxsp-text-muted); }
.nxsp-empty-text { font-size: 12px; color: var(--nxsp-text-muted); opacity: .85; line-height: 1.6; }

.nxsp-skeleton { padding: 4px 2px; }
.nxsp-skeleton-line {
    height: 44px; margin-bottom: 6px; border-radius: 10px;
    background: linear-gradient(90deg, var(--nxsp-surface) 25%, color-mix(in srgb, var(--nxsp-text) 7%, transparent) 37%, var(--nxsp-surface) 63%);
    background-size: 400% 100%;
    animation: nxsp-shimmer 1.4s ease infinite;
}
@keyframes nxsp-shimmer { 0% { background-position: 100% 0; } 100% { background-position: 0 0; } }

.nxsp-personal {
    margin: 6px 12px 0; padding: 10px 10px 8px; border-radius: 14px;
    background: linear-gradient(180deg, var(--nxsp-tint), transparent 92%), var(--nxsp-bg);
    border: 1px solid var(--nxsp-tint-strong);
}
.nxsp-personal-head { display: flex; align-items: center; gap: 6px; padding: 0 4px 6px; }
.nxsp-personal:last-child { margin-bottom: calc(12px + var(--nx-safe-bottom)); }
.nxsp-personal-dot {
    width: 6px; height: 6px; border-radius: 50%;
    background: var(--nxsp-accent); box-shadow: 0 0 0 3px var(--nxsp-tint);
}
.nxsp-personal-title { font-size: 12px; font-weight: 700; letter-spacing: .5px; color: var(--nxsp-accent); }
.nxsp-personal-item {
    display: flex; align-items: center; gap: 9px; width: 100%;
    padding: 8px; border: none; border-radius: 10px; background: transparent;
    cursor: pointer; text-align: left; font: inherit; color: inherit;
    transition: background .15s ease;
}
.nxsp-personal-item:hover { background: var(--nxsp-tint); }
.nxsp-personal-ico {
    width: 30px; height: 30px; flex-shrink: 0; border-radius: 9px;
    display: inline-flex; align-items: center; justify-content: center; font-size: 15px;
    background: color-mix(in srgb, var(--nxsp-accent) 12%, var(--nxsp-bg));
}
.nxsp-personal-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.nxsp-personal-name {
    display: flex; align-items: center; gap: 6px;
    font-size: 13px; font-weight: 600; color: var(--nxsp-text);
}
.nxsp-personal-badge {
    flex-shrink: 0; padding: 1px 7px; border-radius: 999px; font-size: 12px; font-weight: 600;
    font-style: normal; color: var(--nx-text-on-accent); background: var(--nxsp-accent);
}
.nxsp-personal-desc {
    font-size: 12px; color: var(--nxsp-text-muted);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.nxsp-personal-arrow { flex-shrink: 0; color: var(--nxsp-text-muted); font-size: 15px; line-height: 1; }

.nxsp-foot {
    display: flex; align-items: center; gap: 8px;
    margin-top: 8px; padding: 12px 14px calc(12px + var(--nx-safe-bottom));
    border-top: 1px solid var(--nxsp-border);
}
.nxsp-user-name {
    flex: 1; min-width: 0; font-size: 13px; color: var(--nxsp-text);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.nxsp-foot-actions { display: flex; align-items: center; gap: 2px; flex-shrink: 0; }

.nxsp-mask {
    position: fixed; inset: 0; z-index: var(--nx-z-side-mask);
    background: rgba(15, 23, 42, .42);
    opacity: 0; pointer-events: none; transition: opacity .26s ease;
}
.nxsp-mask.open { opacity: 1; pointer-events: auto; }

.nxsp.is-compact { width: 0; }
.nxsp.is-compact[data-layout="sticky"], .nxsp.is-compact[data-layout="fill"] { position: static; height: auto; }
.nxsp.is-compact .nxsp-aside {
    position: fixed; top: 0; left: 0; z-index: var(--nx-z-side-panel);
    width: min(var(--nxsp-dw, 288px), 86vw);
    height: var(--nxsp-h, 100dvh); min-height: 0;
    border-right: 1px solid var(--nxsp-border);
    box-shadow: 0 18px 44px rgba(15, 23, 42, .18);
    transform: translateX(-101%); visibility: hidden;
    transition: transform .26s cubic-bezier(.4, 0, .2, 1), visibility .26s;
}
.nxsp.is-compact .nxsp-aside.open { transform: translateX(0); visibility: visible; }
.nxsp.is-compact .nxsp-head { padding-top: calc(16px + var(--nx-safe-top)); }
.nxsp.is-compact .nxsp-list { -webkit-overflow-scrolling: touch; }
.nxsp.is-compact .nxsp-del { opacity: 1; }


.nxsp button:focus-visible, .nxsp input:focus-visible, .nxsp [role="button"]:focus-visible {
    outline: 2px solid var(--nxsp-accent); outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
    .nxsp-aside, .nxsp-item, .nxsp-tab, .nxsp-personal-item, .nxsp-action-btn, .nxsp-mask { transition: none; }
    .nxsp-skeleton-line, .nxsp-spin { animation: none; }
}

/* ===== nexus-markdown.css ===== */
.nx-md,
.nx-chat-content {
    line-height: 1.7;
    color: var(--nx-text-body, rgb(30, 41, 59));
    word-wrap: break-word;
    overflow-wrap: break-word;
    font-size: var(--nx-text-base, 0.95rem);
}

.nx-md p,
.nx-chat-content p {
    margin: 0 0 var(--nx-space-3, 0.75rem) 0;
}

.nx-md p:last-child,
.nx-chat-content p:last-child {
    margin-bottom: 0;
}

/* 流式分块渲染（nexus-streamdown）接缝补偿：稳定区尾块被上方的
   last-child 规则归零了下边距，恢复块间距使其与单容器渲染一致。 */
.nx-md .nx-md-stream-stable:not(:empty) > :last-child {
    margin-bottom: var(--nx-space-3, 0.75rem);
}

.nx-md h1, .nx-md h2, .nx-md h3, .nx-md h4, .nx-md h5, .nx-md h6,
.nx-chat-content h1, .nx-chat-content h2, .nx-chat-content h3,
.nx-chat-content h4, .nx-chat-content h5, .nx-chat-content h6 {
    margin: var(--nx-space-4, 1rem) 0 var(--nx-space-2, 0.5rem) 0;
    font-weight: 600;
    color: var(--nx-text-heading, rgb(15, 23, 42));
    line-height: 1.4;
}

.nx-md h1, .nx-chat-content h1 { font-size: 1.5rem; }
.nx-md h2, .nx-chat-content h2 { font-size: 1.3rem; }
.nx-md h3, .nx-chat-content h3 { font-size: 1.15rem; }
.nx-md h4, .nx-chat-content h4 { font-size: 1.05rem; }
.nx-md h5, .nx-chat-content h5 { font-size: 0.95rem; }
.nx-md h6, .nx-chat-content h6 { font-size: 0.9rem; }

.nx-md ul, .nx-md ol,
.nx-chat-content ul, .nx-chat-content ol {
    margin: 0 0 var(--nx-space-3, 0.75rem) 0;
    padding-left: 1.5rem;
}

.nx-md li,
.nx-chat-content li {
    margin: 0.25rem 0;
}

.nx-md li > p,
.nx-chat-content li > p {
    margin: 0;
}

.nx-md a,
.nx-chat-content a {
    color: var(--nx-accent, rgb(79, 70, 229));
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 2px;
    transition: color 0.15s;
}

.nx-md a:hover,
.nx-chat-content a:hover {
    color: var(--nx-accent-hover, rgb(67, 56, 202));
    text-decoration-thickness: 2px;
}

.nx-md blockquote,
.nx-chat-content blockquote {
    margin: var(--nx-space-3, 0.75rem) 0;
    padding: var(--nx-space-2, 0.5rem) var(--nx-space-4, 1rem);
    border-left: 3px solid var(--nx-border-strong, rgb(148, 163, 184));
    background: var(--nx-bg-subtle, rgb(241, 245, 249));
    color: var(--nx-text-muted, rgb(71, 85, 105));
    border-radius: 0 var(--nx-radius-sm, 0.375rem) var(--nx-radius-sm, 0.375rem) 0;
}

.nx-md blockquote p,
.nx-chat-content blockquote p {
    margin: 0;
}

.nx-md code,
.nx-chat-content code {
    padding: 0.125rem 0.375rem;
    background: var(--nx-bg-subtle, rgb(241, 245, 249));
    color: var(--nx-danger, rgb(190, 18, 60));
    border-radius: var(--nx-radius-sm, 0.375rem);
    font-family: var(--nx-font-mono, 'SF Mono', Monaco, monospace);
    font-size: 0.875em;
    word-break: break-word;
}

.nx-md pre,
.nx-chat-content pre {
    margin: var(--nx-space-3, 0.75rem) 0;
    padding: var(--nx-space-4, 1rem);
    background: var(--nx-bg-code, rgb(30, 41, 59));
    border-radius: var(--nx-radius-md, 0.5rem);
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    position: relative;
}

.nx-md pre code,
.nx-chat-content pre code {
    padding: 0;
    background: transparent;
    color: rgb(226, 232, 240);
    font-size: 0.875rem;
    line-height: 1.5;
    word-break: normal;
    white-space: pre;
}

.nx-md table,
.nx-chat-content table {
    width: 100%;
    margin: var(--nx-space-3, 0.75rem) 0;
    border-collapse: collapse;
    display: block;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    border: 1px solid var(--nx-border, rgb(226, 232, 240));
    border-radius: var(--nx-radius-sm, 0.375rem);
}

.nx-md th, .nx-md td,
.nx-chat-content th, .nx-chat-content td {
    padding: var(--nx-space-2, 0.5rem) var(--nx-space-3, 0.75rem);
    border: 1px solid var(--nx-border, rgb(226, 232, 240));
    text-align: left;
    white-space: nowrap;
}

.nx-md th,
.nx-chat-content th {
    background: var(--nx-bg-subtle, rgb(241, 245, 249));
    font-weight: 600;
    color: var(--nx-text-heading, rgb(15, 23, 42));
}

.nx-md td,
.nx-chat-content td {
    color: var(--nx-text-body, rgb(30, 41, 59));
}

.nx-md hr,
.nx-chat-content hr {
    margin: var(--nx-space-4, 1rem) 0;
    border: none;
    border-top: 1px solid var(--nx-border, rgb(226, 232, 240));
}

.nx-md img,
.nx-chat-content img {
    max-width: 100%;
    border-radius: var(--nx-radius-sm, 0.375rem);
    margin: var(--nx-space-2, 0.5rem) 0;
}

.nx-md del,
.nx-chat-content del {
    color: var(--nx-text-muted, rgb(148, 163, 184));
}

.nx-md kbd,
.nx-chat-content kbd {
    padding: 0.125rem 0.375rem;
    background: var(--nx-bg-subtle, rgb(241, 245, 249));
    border: 1px solid var(--nx-border, rgb(203, 213, 225));
    border-bottom-width: 2px;
    border-radius: var(--nx-radius-sm, 0.375rem);
    font-family: var(--nx-font-mono, 'SF Mono', Monaco, monospace);
    font-size: 0.85em;
    color: var(--nx-text-heading, rgb(15, 23, 42));
}

.nx-md mark,
.nx-chat-content mark {
    background: rgba(250, 204, 21, 0.3);
    color: inherit;
    padding: 0.05rem 0.2rem;
    border-radius: 2px;
}

.nx-md details,
.nx-chat-content details {
    margin: var(--nx-space-3, 0.75rem) 0;
    padding: var(--nx-space-2, 0.5rem) var(--nx-space-3, 0.75rem);
    border: 1px solid var(--nx-border, rgb(226, 232, 240));
    border-radius: var(--nx-radius-sm, 0.375rem);
    background: var(--nx-bg-subtle, rgb(241, 245, 249));
}

.nx-md summary,
.nx-chat-content summary {
    cursor: pointer;
    font-weight: 500;
    color: var(--nx-text-heading, rgb(15, 23, 42));
    user-select: none;
}

.nx-md input[type="checkbox"],
.nx-chat-content input[type="checkbox"] {
    margin-right: 0.375rem;
    vertical-align: middle;
}

.nx-md-copy {
    position: absolute;
    top: 0.5rem;
    right: 0.5rem;
    padding: 0.25rem 0.625rem;
    background: rgba(255, 255, 255, 0.1);
    border: 1px solid rgba(255, 255, 255, 0.2);
    color: rgb(226, 232, 240);
    border-radius: var(--nx-radius-sm, 0.375rem);
    font-size: 0.75rem;
    cursor: pointer;
    opacity: 0;
    transition: opacity 0.15s, background 0.15s;
    font-family: inherit;
}

.nx-md pre:hover .nx-md-copy,
.nx-chat-content pre:hover .nx-md-copy {
    opacity: 1;
}

.nx-md-copy:hover {
    background: rgba(255, 255, 255, 0.2);
}

.nx-md-lang {
    position: absolute;
    top: 0.5rem;
    left: 0.75rem;
    font-size: 0.7rem;
    color: rgba(148, 163, 184, 0.7);
    text-transform: uppercase;
    letter-spacing: 0.5px;
    font-family: var(--nx-font-mono, 'SF Mono', Monaco, monospace);
    pointer-events: none;
}

@media (max-width: 768px) {
    .nx-md, .nx-chat-content { font-size: 0.9rem; }
    .nx-md pre, .nx-chat-content pre { padding: var(--nx-space-3, 0.75rem); font-size: 0.8rem; }
    .nx-md pre code, .nx-chat-content pre code { font-size: 0.8rem; }
    .nx-md table, .nx-chat-content table { font-size: 0.85rem; }
    .nx-md h1, .nx-chat-content h1 { font-size: 1.3rem; }
    .nx-md h2, .nx-chat-content h2 { font-size: 1.15rem; }
    .nx-md h3, .nx-chat-content h3 { font-size: 1.05rem; }
    .nx-md-copy { opacity: 1; }
}

[data-theme="dark"] .nx-md,
[data-theme="dark"] .nx-chat-content {
    color: var(--nx-text-body);
}

[data-theme="dark"] .nx-md h1, [data-theme="dark"] .nx-md h2, [data-theme="dark"] .nx-md h3,
[data-theme="dark"] .nx-md h4, [data-theme="dark"] .nx-md h5, [data-theme="dark"] .nx-md h6,
[data-theme="dark"] .nx-chat-content h1, [data-theme="dark"] .nx-chat-content h2,
[data-theme="dark"] .nx-chat-content h3, [data-theme="dark"] .nx-chat-content h4,
[data-theme="dark"] .nx-chat-content h5, [data-theme="dark"] .nx-chat-content h6 {
    color: var(--nx-text-heading);
}

[data-theme="dark"] .nx-md code,
[data-theme="dark"] .nx-chat-content code {
    background: rgba(148, 163, 184, 0.18);
    color: rgb(252, 165, 165);
}

[data-theme="dark"] .nx-md blockquote,
[data-theme="dark"] .nx-chat-content blockquote {
    background: rgba(148, 163, 184, 0.1);
    color: var(--nx-text-muted);
    border-left-color: rgb(100, 116, 139);
}

[data-theme="dark"] .nx-md th,
[data-theme="dark"] .nx-chat-content th {
    background: rgba(148, 163, 184, 0.15);
    color: var(--nx-text-heading);
}

[data-theme="dark"] .nx-md td,
[data-theme="dark"] .nx-chat-content td {
    color: var(--nx-text-body);
}

@media (prefers-color-scheme: dark) {
    /* 无 data-theme（跟随系统）时令牌层仍是浅色值：作用域内补暗色覆盖，令下方标准令牌引用成立 */
    :root:not([data-theme="light"]) .nx-md,
    :root:not([data-theme="light"]) .nx-chat-content {
        --nx-text-body: #cbd5e1;
        --nx-text-heading: #f1f5f9;
        --nx-text-muted: #7a8a9e;
        color: var(--nx-text-body);
    }
    :root:not([data-theme="light"]) .nx-md h1,
    :root:not([data-theme="light"]) .nx-md h2,
    :root:not([data-theme="light"]) .nx-md h3,
    :root:not([data-theme="light"]) .nx-md h4,
    :root:not([data-theme="light"]) .nx-md h5,
    :root:not([data-theme="light"]) .nx-md h6,
    :root:not([data-theme="light"]) .nx-chat-content h1,
    :root:not([data-theme="light"]) .nx-chat-content h2,
    :root:not([data-theme="light"]) .nx-chat-content h3,
    :root:not([data-theme="light"]) .nx-chat-content h4,
    :root:not([data-theme="light"]) .nx-chat-content h5,
    :root:not([data-theme="light"]) .nx-chat-content h6 {
        color: var(--nx-text-heading);
    }
    :root:not([data-theme="light"]) .nx-md code,
    :root:not([data-theme="light"]) .nx-chat-content code {
        background: rgba(148, 163, 184, 0.18);
        color: rgb(252, 165, 165);
    }
}

/* ===== nexus-chat.css ===== */
.nx-chat-error {
    display: flex;
    align-items: center;
    gap: var(--nx-space-2, 0.5rem);
    padding: var(--nx-space-3, 0.75rem) var(--nx-space-4, 1rem);
    background: rgba(239, 68, 68, 0.08);
    border: 1px solid rgba(239, 68, 68, 0.3);
    color: var(--nx-danger, rgb(190, 18, 60));
    border-radius: var(--nx-radius-md, 0.5rem);
    font-size: var(--nx-text-sm, 0.875rem);
    line-height: 1.5;
}

.nx-chat-error svg {
    flex-shrink: 0;
    color: var(--nx-danger, rgb(190, 18, 60));
}

.nx-chat-error span {
    flex: 1;
    word-break: break-word;
}

.nx-chat-retry {
    flex-shrink: 0;
    padding: 0.25rem 0.75rem;
    background: rgba(190, 18, 60, 0.1);
    border: 1px solid rgba(190, 18, 60, 0.4);
    color: var(--nx-danger, rgb(190, 18, 60));
    border-radius: var(--nx-radius-sm, 0.375rem);
    font-size: var(--nx-text-xs, 0.75rem);
    font-weight: 500;
    cursor: pointer;
    transition: all 0.15s ease;
}

.nx-chat-retry:hover {
    background: rgba(190, 18, 60, 0.18);
    border-color: rgba(190, 18, 60, 0.6);
}

.nx-chat-retry:active {
    transform: scale(0.96);
}

@media (hover: none) and (pointer: coarse) {
    .nx-chat-retry {
        min-height: 44px;
        font-size: var(--nx-text-sm, 0.875rem);
    }
}

.nx-chat-streaming {
    background: rgba(190, 18, 60, 0.08) !important;
    border-color: rgba(190, 18, 60, 0.4) !important;
    color: var(--nx-danger, rgb(190, 18, 60)) !important;
}

.nx-chat-typing-cursor {
    display: inline-block;
    width: 7px;
    height: 1em;
    background: var(--nx-accent, rgb(79, 70, 229));
    margin-left: 2px;
    vertical-align: text-bottom;
    border-radius: 1px;
    animation: nx-chat-blink 1s steps(2) infinite;
}

@keyframes nx-chat-blink {
    0%, 50% { opacity: 1; }
    51%, 100% { opacity: 0; }
}

/* ===== nexus-ai-chat.css ===== */
.nx-ai-chat {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 400px;
    background: var(--nx-bg-page, transparent);
    position: relative;
}

.nx-ai-chat-messages {
    flex: 1;
    overflow-y: auto;
    overflow-x: hidden;
    padding: var(--nx-space-4, 1rem);
    scroll-behavior: auto;
    -webkit-overflow-scrolling: touch;
}

.nx-ai-chat-list {
    max-width: 880px;
    margin: 0 auto;
    display: flex;
    flex-direction: column;
    gap: var(--nx-space-4, 1rem);
}

.nx-ai-chat-welcome {
    text-align: center;
    padding: var(--nx-space-12, 3rem) var(--nx-space-4, 1rem);
    max-width: 560px;
    margin: 0 auto;
}

.nx-ai-chat-welcome-icon {
    font-size: 2.25rem;
    line-height: 1;
    width: 72px;
    height: 72px;
    margin: 0 auto var(--nx-space-3, 0.75rem);
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--nx-accent-soft, rgba(79, 70, 229, 0.08));
    border-radius: 1.5rem;
    border: 1px solid var(--nx-accent-soft, rgba(79, 70, 229, 0.16));
}

.nx-ai-chat-welcome-title {
    font-size: var(--nx-text-xl, 1.25rem);
    font-weight: 600;
    color: var(--nx-text-heading, rgb(15, 23, 42));
    margin: 0 0 var(--nx-space-2, 0.5rem);
}

.nx-ai-chat-welcome-desc {
    font-size: var(--nx-text-base, 0.95rem);
    color: var(--nx-text-secondary, rgb(100, 116, 139));
    margin: 0 0 var(--nx-space-6, 1.5rem);
    line-height: 1.6;
}

.nx-ai-chat-quick {
    display: flex;
    flex-wrap: wrap;
    gap: var(--nx-space-2, 0.5rem);
    justify-content: center;
}

.nx-ai-chat-quick-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    padding: 0.5rem 0.875rem;
    background: var(--nx-bg-secondary, rgb(241, 245, 249));
    border: 1px solid var(--nx-border, rgb(226, 232, 240));
    color: var(--nx-text-body, rgb(30, 41, 59));
    border-radius: var(--nx-radius-lg, 0.75rem);
    font-size: var(--nx-text-sm, 0.875rem);
    cursor: pointer;
    transition: all 0.15s;
    line-height: 1.4;
}

.nx-ai-chat-quick-btn:hover {
    background: var(--nx-accent-soft, rgba(79, 70, 229, 0.08));
    border-color: var(--nx-accent, rgb(79, 70, 229));
    color: var(--nx-accent, rgb(79, 70, 229));
}

.nx-ai-chat-quick-btn:focus-visible,
.nx-ai-chat-btn:focus-visible,
.nx-ai-chat-action-btn:focus-visible,
.nx-ai-chat-retry-btn:focus-visible,
.nx-ai-chat-reasoning-toggle:focus-visible {
    outline: 2px solid var(--nx-accent, rgb(79, 70, 229));
    outline-offset: 2px;
}

.nx-ai-chat-quick-btn:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}

.nx-ai-chat-quick-icon {
    font-size: 1rem;
    line-height: 1;
}

.nx-ai-chat-msg {
    display: flex;
    gap: var(--nx-space-3, 0.75rem);
    align-items: flex-start;
}

.nx-ai-chat-avatar {
    flex-shrink: 0;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.25rem;
    background: var(--nx-bg-secondary, rgb(241, 245, 249));
    line-height: 1;
}

.nx-ai-chat-user .nx-ai-chat-avatar {
    background: var(--nx-accent-soft, rgba(79, 70, 229, 0.1));
}

.nx-ai-chat-main {
    flex: 1;
    min-width: 0;
    max-width: calc(100% - 48px);
}

.nx-ai-chat-meta {
    display: flex;
    align-items: center;
    gap: var(--nx-space-2, 0.5rem);
    margin-bottom: 0.25rem;
}

.nx-ai-chat-name {
    font-size: var(--nx-text-xs, 0.75rem);
    font-weight: 500;
    color: var(--nx-text-secondary, rgb(100, 116, 139));
}

.nx-ai-chat-aitag {
    font-size: 0.625rem;
    padding: 1px 6px;
    background: var(--nx-accent-soft, rgba(79, 70, 229, 0.1));
    color: var(--nx-accent, rgb(79, 70, 229));
    border-radius: var(--nx-radius-sm, 0.25rem);
    font-weight: 500;
    letter-spacing: 0.025em;
}

.nx-ai-chat-bubble {
    display: inline-block;
    max-width: 100%;
    padding: var(--nx-space-3, 0.75rem) var(--nx-space-4, 1rem);
    border-radius: var(--nx-radius-lg, 0.75rem);
    line-height: 1.6;
    word-wrap: break-word;
    overflow-wrap: break-word;
    position: relative;
}

.nx-ai-chat-user .nx-ai-chat-bubble {
    background: var(--nx-accent, rgb(79, 70, 229));
    color: var(--nx-text-on-accent, #ffffff);
    border-bottom-right-radius: var(--nx-radius-sm, 0.25rem);
}

.nx-ai-chat-assistant .nx-ai-chat-bubble {
    background: var(--nx-bg-secondary, rgb(241, 245, 249));
    color: var(--nx-text-body, rgb(30, 41, 59));
    border: 1px solid var(--nx-border, rgb(226, 232, 240));
    border-bottom-left-radius: var(--nx-radius-sm, 0.25rem);
}

.nx-ai-chat-content {
    font-size: var(--nx-text-base, 0.95rem);
}

.nx-ai-chat-content :first-child {
    margin-top: 0;
}

.nx-ai-chat-content :last-child {
    margin-bottom: 0;
}

.nx-ai-chat-user .nx-ai-chat-bubble .nx-ai-chat-content {
    color: var(--nx-text-on-accent, #ffffff);
}

.nx-ai-chat-user .nx-ai-chat-bubble .nx-ai-chat-content a {
    color: var(--nx-text-on-accent, #ffffff);
    text-decoration: underline;
}

.nx-ai-chat-cursor {
    display: inline-block;
    width: 7px;
    height: 1em;
    background: var(--nx-accent, rgb(79, 70, 229));
    margin-left: 2px;
    vertical-align: text-bottom;
    border-radius: 1px;
    animation: nx-ai-chat-blink 1s steps(2) infinite;
}

@keyframes nx-ai-chat-blink {
    0%, 50% { opacity: 1; }
    51%, 100% { opacity: 0; }
}

.nx-ai-chat-typing {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 0;
}

.nx-ai-chat-thinking {
    font-style: normal;
    font-size: var(--nx-text-sm, 0.875rem);
    color: var(--nx-text-muted, rgb(148, 163, 184));
    letter-spacing: 0.02em;
}

.nx-ai-chat-typing span {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--nx-text-muted, rgb(148, 163, 184));
    animation: nx-ai-chat-typing 1.4s infinite;
}

.nx-ai-chat-typing span:nth-child(2) { animation-delay: 0.2s; }
.nx-ai-chat-typing span:nth-child(3) { animation-delay: 0.4s; }

@keyframes nx-ai-chat-typing {
    0%, 60%, 100% { transform: translateY(0); opacity: 0.4; }
    30% { transform: translateY(-6px); opacity: 1; }
}

.nx-ai-chat-error-bar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--nx-space-2, 0.5rem);
    margin-top: var(--nx-space-2, 0.5rem);
    padding: 0.5rem 0.75rem;
    background: rgba(239, 68, 68, 0.08);
    border: 1px solid rgba(239, 68, 68, 0.3);
    border-radius: var(--nx-radius-md, 0.5rem);
    color: var(--nx-danger, rgb(190, 18, 60));
    font-size: var(--nx-text-sm, 0.875rem);
}

.nx-ai-chat-retry-btn {
    background: transparent;
    border: 1px solid currentColor;
    color: inherit;
    padding: 0.25rem 0.625rem;
    border-radius: var(--nx-radius-sm, 0.25rem);
    font-size: var(--nx-text-xs, 0.75rem);
    cursor: pointer;
    transition: opacity 0.15s;
}

.nx-ai-chat-retry-btn:hover {
    opacity: 0.8;
}

.nx-ai-chat-actions {
    display: flex;
    gap: var(--nx-space-2, 0.5rem);
    margin-top: 0.375rem;
    opacity: 0;
    transition: opacity 0.15s;
}

.nx-ai-chat-msg:hover .nx-ai-chat-actions,
.nx-ai-chat-msg:focus-within .nx-ai-chat-actions {
    opacity: 1;
}

@media (hover: none) {
    .nx-ai-chat-actions {
        opacity: 1;
    }
}

.nx-ai-chat-action-btn {
    background: transparent;
    border: none;
    color: var(--nx-text-muted, rgb(148, 163, 184));
    font-size: var(--nx-text-xs, 0.75rem);
    cursor: pointer;
    padding: 2px 6px;
    border-radius: var(--nx-radius-sm, 0.25rem);
    transition: all 0.15s;
}

.nx-ai-chat-action-btn:hover {
    color: var(--nx-text-body, rgb(30, 41, 59));
    background: var(--nx-bg-tertiary, rgba(0, 0, 0, 0.04));
}

.nx-ai-chat-scroll-btn {
    position: absolute;
    right: var(--nx-space-4, 1rem);
    bottom: 120px;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background: var(--nx-bg-elevated, rgb(255, 255, 255));
    border: 1px solid var(--nx-border, rgb(226, 232, 240));
    box-shadow: var(--nx-shadow-md, 0 4px 12px rgba(0, 0, 0, 0.1));
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    color: var(--nx-text-secondary, rgb(100, 116, 139));
    z-index: 10;
    transition: all 0.15s;
}

.nx-ai-chat-scroll-btn:hover {
    color: var(--nx-accent, rgb(79, 70, 229));
    border-color: var(--nx-accent, rgb(79, 70, 229));
}

.nx-ai-chat-scroll-badge {
    position: absolute;
    top: -4px;
    right: -4px;
    min-width: 18px;
    height: 18px;
    padding: 0 5px;
    background: var(--nx-accent, rgb(79, 70, 229));
    color: rgb(255, 255, 255);
    border-radius: 9px;
    font-size: 0.6875rem;
    font-weight: 600;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
}

.nx-ai-chat-fab-enter-active, .nx-ai-chat-fab-leave-active {
    transition: all 0.2s;
}

.nx-ai-chat-fab-enter-from, .nx-ai-chat-fab-leave-to {
    opacity: 0;
    transform: translateY(8px) scale(0.8);
}

.nx-ai-chat-input-wrap {
    flex-shrink: 0;
    padding: var(--nx-space-3, 0.75rem) var(--nx-space-4, 1rem);
    background: var(--nx-bg-elevated, rgb(255, 255, 255));
    border-top: 1px solid var(--nx-border, rgb(226, 232, 240));
    max-width: 880px;
    margin: 0 auto;
    width: 100%;
    box-sizing: border-box;
}

.nx-ai-chat-input-row {
    display: flex;
    gap: var(--nx-space-2, 0.5rem);
    align-items: flex-end;
    max-width: 100%;
}

.nx-ai-chat-status {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.375rem 0.25rem 0.5rem;
    color: var(--nx-text-muted, rgb(148, 163, 184));
    font-size: var(--nx-text-sm, 0.8125rem);
}

.nx-ai-chat-status-spinner {
    width: 14px;
    height: 14px;
    flex-shrink: 0;
    border: 2px solid var(--nx-accent-soft, rgba(79, 70, 229, 0.3));
    border-top-color: var(--nx-accent, rgb(79, 70, 229));
    border-radius: 50%;
    animation: nx-ai-chat-spin 0.8s linear infinite;
}

@keyframes nx-ai-chat-spin {
    to { transform: rotate(360deg); }
}

.nx-ai-chat-input {
    flex: 1;
    min-height: 44px;
    max-height: 144px;
    padding: 0.625rem 0.875rem;
    background: var(--nx-bg-page, rgb(248, 250, 252));
    border: 1px solid var(--nx-border, rgb(226, 232, 240));
    border-radius: var(--nx-radius-lg, 0.75rem);
    font-size: 16px;
    font-family: inherit;
    line-height: 1.5;
    color: var(--nx-text-body, rgb(30, 41, 59));
    resize: none;
    outline: none;
    transition: border-color 0.15s, box-shadow 0.15s;
    box-sizing: border-box;
}

.nx-ai-chat-input:focus {
    border-color: var(--nx-accent, rgb(79, 70, 229));
    box-shadow: 0 0 0 3px var(--nx-accent-soft, rgba(79, 70, 229, 0.1));
}

.nx-ai-chat-input:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}

.nx-ai-chat-input::placeholder {
    color: var(--nx-text-muted, rgb(148, 163, 184));
}

.nx-ai-chat-btn {
    flex-shrink: 0;
    width: 44px;
    height: 44px;
    border-radius: var(--nx-radius-lg, 0.75rem);
    border: none;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: all 0.15s;
    padding: 0;
}

.nx-ai-chat-send {
    background: var(--nx-accent, rgb(79, 70, 229));
    color: rgb(255, 255, 255);
}

.nx-ai-chat-send:hover:not(:disabled) {
    filter: brightness(1.1);
}

.nx-ai-chat-send:disabled {
    background: var(--nx-bg-tertiary, rgb(203, 213, 225));
    cursor: not-allowed;
}

.nx-ai-chat-send.is-empty {
    background: var(--nx-bg-tertiary, rgb(203, 213, 225));
    cursor: not-allowed;
}

.nx-ai-chat-stop {
    background: var(--nx-danger, rgb(220, 38, 38));
    color: rgb(255, 255, 255);
}

.nx-ai-chat-stop:hover {
    filter: brightness(1.1);
}

[data-theme="dark"] .nx-ai-chat-assistant .nx-ai-chat-bubble {
    background: var(--nx-bg-secondary, rgb(30, 41, 59));
    color: var(--nx-text-body, rgb(226, 232, 240));
    border-color: var(--nx-border, rgb(51, 65, 85));
}

[data-theme="dark"] .nx-ai-chat-input {
    background: var(--nx-bg-secondary, rgb(30, 41, 59));
    color: var(--nx-text-body, rgb(226, 232, 240));
    border-color: var(--nx-border, rgb(51, 65, 85));
}

[data-theme="dark"] .nx-ai-chat-input-wrap {
    background: var(--nx-bg-elevated, rgb(15, 23, 42));
    border-color: var(--nx-border, rgb(51, 65, 85));
}

[data-theme="dark"] .nx-ai-chat-scroll-btn {
    background: var(--nx-bg-elevated, rgb(30, 41, 59));
    border-color: var(--nx-border, rgb(51, 65, 85));
    color: var(--nx-text-secondary, rgb(148, 163, 184));
}

[data-theme="dark"] .nx-ai-chat-avatar {
    background: var(--nx-bg-secondary, rgb(30, 41, 59));
}

[data-theme="dark"] .nx-ai-chat-quick-btn {
    background: var(--nx-bg-secondary, rgb(30, 41, 59));
    border-color: var(--nx-border, rgb(51, 65, 85));
    color: var(--nx-text-body, rgb(226, 232, 240));
}

@media (max-width: 768px) {
    .nx-ai-chat {
        min-height: 0;
        height: 100%;
    }

    .nx-ai-chat-messages {
        padding: var(--nx-space-3, 0.75rem);
    }

    .nx-ai-chat-input-wrap {
        padding: var(--nx-space-2, 0.5rem) var(--nx-space-3, 0.75rem);
        padding-bottom: calc(var(--nx-space-2, 0.5rem) + var(--nx-safe-bottom, 0px));
    }

    .nx-ai-chat-welcome {
        padding: var(--nx-space-8, 2rem) var(--nx-space-3, 0.75rem);
    }

    .nx-ai-chat-avatar {
        width: 32px;
        height: 32px;
        font-size: 1.125rem;
    }

    .nx-ai-chat-main {
        max-width: calc(100% - 40px);
    }

    .nx-ai-chat-bubble {
        padding: var(--nx-space-2, 0.5rem) var(--nx-space-3, 0.75rem);
    }

    .nx-ai-chat-scroll-btn {
        right: var(--nx-space-3, 0.75rem);
        bottom: calc(100px + var(--nx-safe-bottom, 0px));
    }

    .nx-ai-chat-action-btn {
        min-height: 40px;
        min-width: 40px;
    }

    .nx-ai-chat-retry-btn {
        min-height: 40px;
        padding: 0.25rem 0.875rem;
    }

    .nx-ai-chat-quick-btn {
        padding: 0.625rem 1rem;
    }
}

/* 移动端安全区（非移动媒体查询也会兜底注入） */
.nx-ai-chat-input-wrap {
    padding-bottom: calc(var(--nx-space-3, 0.75rem) + var(--nx-safe-bottom, 0px));
}

/* 键盘避让：视觉视口高度收缩时抬升输入区 */
.nx-ai-chat.keyboard-open .nx-ai-chat-input-wrap {
    padding-bottom: calc(var(--nx-space-2, 0.5rem) + var(--nx-chat-kb, 0px) + var(--nx-safe-bottom, 0px));
    transition: padding-bottom 0.12s ease-out;
}

/* ===== 富事件渲染：思考过程 / 工具调用 / 引用来源 ===== */
.nx-ai-chat-reasoning {
    margin-bottom: var(--nx-space-2, 0.5rem);
    border: 1px solid var(--nx-border, rgb(226, 232, 240));
    background: var(--nx-bg-page, rgb(248, 250, 252));
    border-radius: var(--nx-radius-md, 0.5rem);
    overflow: hidden;
}

.nx-ai-chat-reasoning-toggle {
    width: 100%;
    display: flex;
    align-items: center;
    gap: 0.375rem;
    padding: 0.375rem 0.625rem;
    background: transparent;
    border: none;
    cursor: pointer;
    font-size: var(--nx-text-xs, 0.75rem);
    color: var(--nx-text-secondary, rgb(100, 116, 139));
    border-radius: var(--nx-radius-md, 0.5rem);
}

.nx-ai-chat-reasoning-body {
    padding: 0 0.625rem 0.5rem;
    font-size: var(--nx-text-xs, 0.75rem);
    line-height: 1.55;
    color: var(--nx-text-secondary, rgb(100, 116, 139));
    white-space: pre-wrap;
    word-break: break-word;
}

.nx-ai-chat-tools {
    display: flex;
    flex-wrap: wrap;
    gap: 0.375rem;
    margin-bottom: var(--nx-space-2, 0.5rem);
}

.nx-ai-chat-tool-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.2rem 0.5rem;
    font-size: 0.6875rem;
    background: var(--nx-accent-soft, rgba(79, 70, 229, 0.08));
    color: var(--nx-accent, rgb(79, 70, 229));
    border: 1px solid var(--nx-accent-soft, rgba(79, 70, 229, 0.2));
    border-radius: var(--nx-radius-sm, 0.25rem);
}

.nx-ai-chat-references {
    margin-top: var(--nx-space-2, 0.5rem);
    padding-top: var(--nx-space-2, 0.5rem);
    border-top: 1px dashed var(--nx-border, rgb(226, 232, 240));
}

.nx-ai-chat-ref-title {
    font-size: var(--nx-text-xs, 0.75rem);
    font-weight: 600;
    color: var(--nx-text-muted, rgb(148, 163, 184));
    margin: 0 0 0.375rem;
}

.nx-ai-chat-ref-item {
    display: block;
    font-size: var(--nx-text-xs, 0.75rem);
    color: var(--nx-accent, rgb(79, 70, 229));
    text-decoration: none;
    line-height: 1.5;
    padding: 2px 0;
    word-break: break-all;
}

.nx-ai-chat-warnings {
    margin-top: var(--nx-space-2, 0.5rem);
    display: grid;
    gap: var(--nx-space-1, 0.25rem);
}

.nx-ai-chat-warning {
    display: flex;
    align-items: flex-start;
    gap: var(--nx-space-2, 0.5rem);
    font-size: var(--nx-text-xs, 0.75rem);
    line-height: 1.6;
    color: var(--nx-warning-text, rgb(146, 64, 14));
    background: var(--nx-warning-soft, rgba(251, 191, 36, 0.12));
    border: 1px solid rgba(217, 119, 6, 0.25);
    border-radius: var(--nx-radius-sm, 0.25rem);
    padding: var(--nx-space-2, 0.5rem) var(--nx-space-2, 0.5rem);
}

.nx-ai-chat-warning svg {
    flex: none;
    margin-top: 2px;
    color: rgb(217, 119, 6);
}

.nx-ai-chat-assistant .nx-ai-chat-content a { color: var(--nx-accent, rgb(79, 70, 229)); }

[data-theme="dark"] .nx-ai-chat-reasoning { background: var(--nx-bg-tertiary, rgba(0, 0, 0, 0.2)); border-color: var(--nx-border, rgb(51, 65, 85)); }
