/* ============================================================================
   fisher · 软质拟物风（Soft Neumorphism）— 亮色主题覆盖层
   ----------------------------------------------------------------------------
   - 加载在现有 index CSS 之后，全部规则 scoped 到亮色态：
     :root:not([data-theme=dark])  （即无属性或 data-theme="light"）
   - 暗色主题（data-theme=dark）保持现有样式完全不变
   - 纯 CSS 覆盖：不动 JS / DOM / API
   - 调色板：哑光底色 #E9ECF2，阴影从底色派生（凸 / 凹 / 浮层三级）
   ============================================================================ */

/* ---------- 1. 调色板 & 阴影变量（覆盖现有 :root 亮色变量族） ---------- */
:root:not([data-theme=dark]) {
  /* 表面（拟物风：统一哑光底色，靠阴影表达层次） */
  --bg-primary: #e9ecf2 !important;
  --bg-secondary: #e9ecf2 !important;
  --bg-tertiary: #e4e8f0 !important;
  --bg-card: #e9ecf2 !important;
  --bg-hover: #e2e6ef !important;
  /* --bg-sidebar 保持 #1e293b 深色侧栏 */
  /* 文字（加深一档，保证低对比表面的可读性） */
  --text-primary: #3d4459 !important;
  --text-secondary: #6e7488 !important;
  --text-tertiary: #98a0b3 !important;
  --text-inverse: #ffffff !important;
  /* 边框（低存在感，同色系） */
  --border-primary: #dfe3ec !important;
  --border-secondary: #d4d9e4 !important;
  --border-light: #e6eaf1 !important;
  /* 主题色：保留品牌绿，语义色与 antd token 亮色分支对齐 */
  --accent-primary: #2db368 !important;
  --accent-success: #30b08f !important;
  --accent-warning: #f5a94e !important;
  --accent-danger: #c03639 !important;

  /* 阴影派生变量 */
  --neu-bg: #e9ecf2;
  --neu-edge: #dfe3ec;
  --neu-shadow-dark: #c6cbd8;
  /* 高光侧必须是半透明白：纯白 #fff 在 #e9ecf2 画布上会糊出一块亮斑，
     卡片靠近深色侧栏时尤其明显，看起来像多出来一个白方块。 */
  --neu-shadow-light: rgba(255, 255, 255, .55);
  --neu-raise: 6px 6px 14px var(--neu-shadow-dark), -6px -6px 14px var(--neu-shadow-light);
  --neu-raise-sm: 4px 4px 10px var(--neu-shadow-dark), -4px -4px 10px var(--neu-shadow-light);
  --neu-raise-mini: 2px 2px 5px rgba(198, 203, 216, .9), -2px -2px 5px rgba(255, 255, 255, .95);
  --neu-inset: inset 3px 3px 7px rgba(183, 189, 203, .8), inset -3px -3px 7px rgba(255, 255, 255, .95);
  --neu-inset-active: inset 3px 3px 8px rgba(163, 170, 186, .85), inset -2px -2px 6px rgba(255, 255, 255, .7);
  --neu-modal: 14px 14px 30px rgba(168, 174, 190, .72), -12px -12px 26px rgba(255, 255, 255, .95);
  /* 彩色按钮的彩色投影 */
  --neu-raise-primary: 5px 5px 12px rgba(30, 107, 69, .32), -4px -4px 10px rgba(255, 255, 255, .85);
  --neu-inset-primary: inset 3px 3px 8px rgba(21, 86, 51, .5), inset -2px -2px 6px rgba(120, 235, 168, .3);
  --neu-raise-success: 5px 5px 12px rgba(38, 154, 128, .3), -4px -4px 10px rgba(255, 255, 255, .85);
  --neu-inset-success: inset 3px 3px 8px rgba(20, 105, 87, .45), inset -2px -2px 6px rgba(140, 235, 215, .3);
  --neu-raise-warning: 5px 5px 12px rgba(190, 120, 30, .28), -4px -4px 10px rgba(255, 255, 255, .85);
  --neu-inset-warning: inset 3px 3px 8px rgba(150, 90, 20, .4), inset -2px -2px 6px rgba(255, 225, 170, .45);
  --neu-raise-danger: 5px 5px 12px rgba(150, 40, 43, .3), -4px -4px 10px rgba(255, 255, 255, .85);
  --neu-inset-danger: inset 3px 3px 8px rgba(110, 25, 28, .45), inset -2px -2px 6px rgba(240, 160, 160, .35);
  --neu-raise-purple: 5px 5px 12px rgba(114, 46, 209, .32), -4px -4px 10px rgba(255, 255, 255, .85);
  --neu-inset-purple: inset 3px 3px 8px rgba(80, 30, 150, .45), inset -2px -2px 6px rgba(200, 160, 255, .35);
  --neu-raise-cyan: 5px 5px 12px rgba(32, 178, 170, .32), -4px -4px 10px rgba(255, 255, 255, .85);
  --neu-inset-cyan: inset 3px 3px 8px rgba(20, 130, 124, .45), inset -2px -2px 6px rgba(140, 235, 230, .35);
}

/* ---------- 2. 基础布局 ---------- */
/* 基础主题把 html/body/#root 都刷成侧栏深色，侧栏改浅后要把这几层也一起改掉，
   否则窄屏或滚动时会露出深色底 */
:root:not([data-theme=dark]),
:root:not([data-theme=dark]) #root,
:root:not([data-theme=dark]) body {
  background: var(--neu-bg) !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-layout,
:root:not([data-theme=dark]) .ant-layout-has-sider,
:root:not([data-theme=dark]) .ant-layout-content,
:root:not([data-theme=dark]) .ant-layout-footer {
  background: var(--neu-bg) !important;
}
/* 基础主题在内容区上盖了一层 rgba(15,23,42,.45) 的深色遮罩，用来压暗背景照片；
   拟物风把照片换成了纯色画布后这层遮罩必须去掉，否则整块画布会被压成灰板，
   凸起阴影也失去对比。暗色主题不走这条，保持原样。 */
:root:not([data-theme=dark]) .ant-layout-content::before {
  display: none !important;
}
/* 侧栏改成浅色画布：原来是 #1e293b 深色抽屉，和亮色内容区对比过强。
   改浅之后，原先按深底设计的浅色文字/图标必须跟着加深，否则整栏看不见。 */
:root:not([data-theme=dark]) .ant-layout-sider,
:root:not([data-theme=dark]) .ant-layout-sider-children,
:root:not([data-theme=dark]) .ant-menu-dark,
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-sub {
  background: var(--neu-bg) !important;
}
:root:not([data-theme=dark]) .ant-layout-sider {
  border-right: 1px solid var(--neu-edge) !important;
}
/* 卡片内的横向排列允许换行：栅格列宽固定，行内容超宽时 nowrap 会把
   按钮/输入框顶到卡片外面（如"随机"按钮、"应用名称+启用按钮"一行） */
:root:not([data-theme=dark]) .ant-card .ant-card-body :where(.ant-space, div) {
  flex-wrap: wrap !important;
}
/* 顶栏同样是深底 + 浅字，一并改成浅色画布 */
:root:not([data-theme=dark]) .ant-layout-header {
  background: var(--neu-bg) !important;
  border-bottom: 1px solid var(--neu-edge) !important;
  color: var(--text-primary) !important;
}
/* 顶栏里的标题/时钟/在线设备是内联浅色，逐个压回深色；
   徽标数字要单独保住白色，否则红底上的数字会糊掉 */
:root:not([data-theme=dark]) .ant-layout-header :where(div, span) {
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-layout-header .ant-badge-count,
:root:not([data-theme=dark]) .ant-layout-header .ant-badge-count span {
  color: #fff !important;
}
/* 菜单下方的自定义分组面板不继承菜单样式，文字仍是深底用的浅灰，单独压深 */
:root:not([data-theme=dark]) .ant-layout-sider-children > div:not(:first-child) :where(div, span, i) {
  color: var(--text-secondary) !important;
}
/* 品牌区文字是内联白色，必须 !important 才压得过 */
:root:not([data-theme=dark]) .ant-layout-sider-children > div:first-child,
:root:not([data-theme=dark]) .ant-layout-sider-children > div:first-child * {
  color: var(--text-primary) !important;
}
/* 菜单项：未选中用次级文字色，图标跟随 */
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item,
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item .anticon,
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item .ant-menu-title-content,
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-submenu-title,
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-submenu-title .anticon {
  color: var(--text-secondary) !important;
}
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item:hover,
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item:hover .anticon,
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item:hover .ant-menu-title-content {
  background: var(--bg-hover) !important;
  color: var(--text-primary) !important;
}
/* 选中项保留品牌绿底，文字维持白色 */
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item-selected,
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item-selected .anticon,
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item-selected .ant-menu-title-content {
  color: #fff !important;
}
/* 分组面板的浅色文字/分割线一并加深 */
:root:not([data-theme=dark]) .ant-layout-sider-children .ant-divider {
  border-color: var(--neu-edge) !important;
}
:root:not([data-theme=dark]) .ant-layout-sider-children .ant-typography,
:root:not([data-theme=dark]) .ant-layout-sider-children .ant-space-item {
  color: var(--text-secondary) !important;
}

/* ---------- 3. 卡片 / 面板 / 统计区 ---------- */
:root:not([data-theme=dark]) .ant-card {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 16px !important;
  /* 卡片常贴着滚动容器/栅格边缘，向外的白色高光会被 overflow 裁掉，
     只剩一条硬直的白边（看起来像卡片角上多了个白方块）。
     所以卡片不画外发光，改用内侧 1px 高光 + 右下投影表达"凸起"。 */
  box-shadow: 6px 6px 14px var(--neu-shadow-dark),
              inset 1px 1px 0 rgba(255, 255, 255, .85) !important;
}
:root:not([data-theme=dark]) .ant-card-head {
  background: transparent !important;
  border-bottom: 1px solid var(--neu-edge) !important;
  min-height: auto !important;
}
:root:not([data-theme=dark]) .ant-card-head-title {
  color: var(--text-primary) !important;
  font-weight: 600 !important;
}
:root:not([data-theme=dark]) .ant-card-body {
  background: transparent !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .stats-section {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 16px !important;
  box-shadow: var(--neu-raise) !important;
}
:root:not([data-theme=dark]) .sidebar-panel {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 16px !important;
  box-shadow: var(--neu-raise-sm) !important;
}
:root:not([data-theme=dark]) .empty-state {
  background: var(--neu-bg) !important;
  color: var(--text-tertiary) !important;
  border-radius: 12px !important;
}
:root:not([data-theme=dark]) .warning-box {
  background: rgba(245, 169, 78, .1) !important;
  border: 1px solid rgba(245, 169, 78, .35) !important;
  border-radius: 12px !important;
  box-shadow: var(--neu-inset) !important;
}
:root:not([data-theme=dark]) .error-box {
  background: rgba(192, 54, 57, .08) !important;
  border: 1px solid rgba(192, 54, 57, .3) !important;
  border-radius: 12px !important;
  box-shadow: var(--neu-inset) !important;
}

/* ---------- 4. 表格 ---------- */
:root:not([data-theme=dark]) .ant-table {
  background: transparent !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-table-thead > tr > th {
  background: #e0e4ed !important;
  color: var(--text-secondary) !important;
  font-weight: 600 !important;
  font-size: 12px !important;
  letter-spacing: .4px !important;
  border-radius: 0 !important;
  border-bottom: 1px solid var(--neu-edge) !important;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .5) !important;
}
:root:not([data-theme=dark]) .ant-table-tbody > tr > td {
  border-bottom: 1px solid var(--neu-edge) !important;
  background: transparent !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-table-tbody > tr:hover > td {
  background: rgba(45, 179, 104, .05) !important;
}
:root:not([data-theme=dark]) .ant-table-cell {
  background: transparent !important;
}
:root:not([data-theme=dark]) .ant-table-placeholder {
  background: transparent !important;
}

/* ---------- 5. 侧边菜单（浅色侧栏 + 拟物选中态） ---------- */
/* 侧栏本体已在第 2 节改成浅色画布，这里不能再把菜单刷回深色 */
:root:not([data-theme=dark]) .ant-menu-dark {
  background: transparent !important;
}
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item-selected {
  background: linear-gradient(135deg, #2db368, #239a58) !important;
  box-shadow: 0 2px 10px rgba(45, 179, 104, .45), inset 0 1px 0 rgba(255, 255, 255, .25) !important;
  border-radius: 8px !important;
}
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-item:hover {
  background: var(--bg-hover) !important;
}
:root:not([data-theme=dark]) .ant-menu-dark .ant-menu-submenu-title:hover {
  background: var(--bg-hover) !important;
}

/* ---------- 6. 按钮 ---------- */
:root:not([data-theme=dark]) .ant-btn {
  border-radius: 10px !important;
  font-weight: 500 !important;
  letter-spacing: .3px;
  transition: box-shadow .15s ease, transform .15s ease, background .15s ease, color .15s ease !important;
}
:root:not([data-theme=dark]) .ant-btn:active {
  transform: translateY(1px);
}
/* 默认按钮：凸起中性面 */
:root:not([data-theme=dark]) .ant-btn-default {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  color: var(--text-primary) !important;
  box-shadow: var(--neu-raise-sm) !important;
}
:root:not([data-theme=dark]) .ant-btn-default:hover {
  color: var(--accent-primary) !important;
  border-color: rgba(45, 179, 104, .45) !important;
  box-shadow: 6px 6px 14px rgba(198, 203, 216, .9), -4px -4px 10px rgba(255, 255, 255, .95) !important;
}
:root:not([data-theme=dark]) .ant-btn-default:active {
  box-shadow: var(--neu-inset-active) !important;
}
/* 主按钮：绿色凸起 + 按压内凹 */
:root:not([data-theme=dark]) .ant-btn-primary {
  background: linear-gradient(145deg, #38c977, #24a55d) !important;
  border: none !important;
  box-shadow: var(--neu-raise-primary) !important;
}
:root:not([data-theme=dark]) .ant-btn-primary:hover {
  background: linear-gradient(145deg, #45d985, #29b265) !important;
  box-shadow: 7px 7px 16px rgba(30, 107, 69, .4), -4px -4px 10px rgba(255, 255, 255, .9) !important;
}
:root:not([data-theme=dark]) .ant-btn-primary:active {
  background: linear-gradient(145deg, #28b567, #1e9454) !important;
  box-shadow: var(--neu-inset-primary) !important;
}
/* 危险按钮 */
:root:not([data-theme=dark]) .ant-btn-dangerous,
:root:not([data-theme=dark]) .ant-btn-danger {
  background: linear-gradient(145deg, #e05a5d, #b02a2d) !important;
  border-color: transparent !important;
  box-shadow: var(--neu-raise-danger) !important;
}
:root:not([data-theme=dark]) .ant-btn-dangerous:hover,
:root:not([data-theme=dark]) .ant-btn-danger:hover {
  background: linear-gradient(145deg, #e86a6d, #c03336) !important;
  box-shadow: 7px 7px 16px rgba(150, 40, 43, .4), -4px -4px 10px rgba(255, 255, 255, .9) !important;
}
:root:not([data-theme=dark]) .ant-btn-dangerous:active,
:root:not([data-theme=dark]) .ant-btn-danger:active {
  box-shadow: var(--neu-inset-danger) !important;
}
/* 语义色自定义按钮类 */
:root:not([data-theme=dark]) .ant-btn-success,
:root:not([data-theme=dark]) .ant-btn[type=button].btn-success {
  background: linear-gradient(145deg, #3fc7a2, #269a80) !important;
  border-color: transparent !important;
  box-shadow: var(--neu-raise-success) !important;
}
:root:not([data-theme=dark]) .ant-btn-success:hover,
:root:not([data-theme=dark]) .ant-btn[type=button].btn-success:hover {
  box-shadow: 7px 7px 16px rgba(38, 154, 128, .4), -4px -4px 10px rgba(255, 255, 255, .9) !important;
}
:root:not([data-theme=dark]) .ant-btn-success:active,
:root:not([data-theme=dark]) .ant-btn[type=button].btn-success:active {
  box-shadow: var(--neu-inset-success) !important;
}
:root:not([data-theme=dark]) .ant-btn-warning,
:root:not([data-theme=dark]) .ant-btn[type=button].btn-warning {
  background: linear-gradient(145deg, #ffd08a, #f5a94e) !important;
  border-color: transparent !important;
  color: #6b4a12 !important; /* 橙底改深字，保证对比度 */
  box-shadow: var(--neu-raise-warning) !important;
}
:root:not([data-theme=dark]) .ant-btn-warning:active,
:root:not([data-theme=dark]) .ant-btn[type=button].btn-warning:active {
  box-shadow: var(--neu-inset-warning) !important;
}
:root:not([data-theme=dark]) .btn-custom-purple {
  background: linear-gradient(145deg, #9257e8, #5f23b4) !important;
  border-color: transparent !important;
  box-shadow: var(--neu-raise-purple) !important;
}
:root:not([data-theme=dark]) .btn-custom-purple:active {
  box-shadow: var(--neu-inset-purple) !important;
}
:root:not([data-theme=dark]) .btn-custom-cyan {
  background: linear-gradient(145deg, #3fd8ce, #179e96) !important;
  border-color: transparent !important;
  box-shadow: var(--neu-raise-cyan) !important;
}
:root:not([data-theme=dark]) .btn-custom-cyan:active {
  box-shadow: var(--neu-inset-cyan) !important;
}
/* 幽灵 / 链接 / 文本按钮保持轻处理 */
:root:not([data-theme=dark]) .ant-btn-ghost {
  background: transparent !important;
  box-shadow: none !important;
}
:root:not([data-theme=dark]) .ant-btn-link,
:root:not([data-theme=dark]) .ant-btn-text {
  box-shadow: none !important;
}
/* 状态：禁用 / 加载中 / 焦点 */
:root:not([data-theme=dark]) .ant-btn[disabled] {
  background: #dde1ea !important;
  border-color: transparent !important;
  color: #9aa1b5 !important;
  box-shadow: 2px 2px 6px rgba(198, 203, 216, .7), -2px -2px 6px rgba(255, 255, 255, .8) !important;
  opacity: 1;
}
:root:not([data-theme=dark]) .ant-btn-loading {
  opacity: .85;
}
:root:not([data-theme=dark]) .ant-btn:focus,
:root:not([data-theme=dark]) .ant-btn:focus-visible {
  outline: none !important;
}
:root:not([data-theme=dark]) .ant-btn-primary:focus,
:root:not([data-theme=dark]) .ant-btn-primary:focus-visible {
  box-shadow: 5px 5px 12px rgba(30, 107, 69, .32), -4px -4px 10px rgba(255, 255, 255, .85), 0 0 0 3px rgba(45, 179, 104, .22) !important;
}
:root:not([data-theme=dark]) .ant-btn-default:focus,
:root:not([data-theme=dark]) .ant-btn-default:focus-visible {
  box-shadow: 4px 4px 10px rgba(198, 203, 216, .9), -4px -4px 10px rgba(255, 255, 255, .95), 0 0 0 3px rgba(45, 179, 104, .18) !important;
}
:root:not([data-theme=dark]) .ant-btn-group .ant-btn {
  box-shadow: none !important;
}
/* 尺寸微调：大按钮更"厚" */
:root:not([data-theme=dark]) .ant-btn-lg {
  border-radius: 12px !important;
}
:root:not([data-theme=dark]) .ant-btn-sm {
  border-radius: 8px !important;
}
:root:not([data-theme=dark]) .ant-btn-sm.ant-btn-primary { box-shadow: 3px 3px 8px rgba(30, 107, 69, .3), -3px -3px 7px rgba(255, 255, 255, .85) !important; }
:root:not([data-theme=dark]) .ant-btn-sm.ant-btn-default { box-shadow: 3px 3px 7px rgba(198, 203, 216, .8), -3px -3px 7px rgba(255, 255, 255, .9) !important; }

/* ---------- 7. 输入框 / 搜索 / 选择器（内凹风格） ---------- */
:root:not([data-theme=dark]) .ant-input,
:root:not([data-theme=dark]) .ant-input-affix-wrapper,
:root:not([data-theme=dark]) .ant-input-number,
:root:not([data-theme=dark]) .ant-input-textarea,
:root:not([data-theme=dark]) .ant-input-search .ant-input-group .ant-input {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 10px !important;
  color: var(--text-primary) !important;
  box-shadow: var(--neu-inset) !important;
}
:root:not([data-theme=dark]) .ant-input-affix-wrapper .ant-input {
  box-shadow: none !important;
}
/* 组合输入框（前后缀标签）：标签与输入框必须拼成一块，
   原来标签自带白底+圆角、输入框又各画边框，看起来像浮在输入框上的白块 */
:root:not([data-theme=dark]) .ant-input-group .ant-input-group-addon {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-right: 0 !important;
  border-radius: 10px 0 0 10px !important;
  color: var(--text-secondary) !important;
  box-shadow: none !important;
  padding: 0 11px !important;
}
/* 输入框至少留出可用宽度，否则窄容器下会被前后缀挤到只剩一个字 */
:root:not([data-theme=dark]) .ant-input-group > .ant-input,
:root:not([data-theme=dark]) .ant-input-group > .ant-input-affix-wrapper {
  border-radius: 0 10px 10px 0 !important;
  box-shadow: none !important;
  min-width: 64px !important;
}
/* 按钮组：只保留首尾圆角，中间不画半径也不画投影，
   否则相邻按钮的投影会互相压出一条深色缝 */
:root:not([data-theme=dark]) .ant-btn-group > .ant-btn {
  border-radius: 0 !important;
  box-shadow: none !important;
}
:root:not([data-theme=dark]) .ant-btn-group > .ant-btn:first-child {
  border-radius: 10px 0 0 10px !important;
}
:root:not([data-theme=dark]) .ant-btn-group > .ant-btn:last-child {
  border-radius: 0 10px 10px 0 !important;
}
:root:not([data-theme=dark]) .ant-btn-group > .ant-btn + .ant-btn {
  margin-left: 0 !important;
}
:root:not([data-theme=dark]) .ant-input::placeholder,
:root:not([data-theme=dark]) .ant-input-affix-wrapper .ant-input::placeholder {
  color: var(--text-tertiary) !important;
}
/* 焦点：保留内凹 + 柔和主色环（替代 antd 光晕） */
:root:not([data-theme=dark]) .ant-input:focus,
:root:not([data-theme=dark]) .ant-input-focused,
:root:not([data-theme=dark]) .ant-input-affix-wrapper-focused,
:root:not([data-theme=dark]) .ant-input-search .ant-input:focus {
  border-color: transparent !important;
  box-shadow: inset 3px 3px 7px rgba(183, 189, 203, .8), inset -3px -3px 7px rgba(255, 255, 255, .95), 0 0 0 2px rgba(45, 179, 104, .55), 0 0 0 6px rgba(45, 179, 104, .1) !important;
  transition: none !important;
}
:root:not([data-theme=dark]) .ant-input-status-error .ant-input,
:root:not([data-theme=dark]) .ant-input-status-error.ant-input {
  border-color: rgba(192, 54, 57, .55) !important;
  box-shadow: var(--neu-inset), 0 0 0 3px rgba(192, 54, 57, .18) !important;
}
:root:not([data-theme=dark]) .ant-input-status-validating .ant-input {
  border-color: rgba(245, 169, 78, .6) !important;
}
/* 搜索按钮：绿色凸起 */
:root:not([data-theme=dark]) .ant-input-search-button {
  background: linear-gradient(145deg, #38c977, #24a55d) !important;
  border: none !important;
  border-radius: 0 10px 10px 0 !important;
  color: #fff !important;
  box-shadow: 4px 4px 10px rgba(30, 107, 69, .3), -3px -3px 8px rgba(255, 255, 255, .9) !important;
  height: 100% !important;
}
:root:not([data-theme=dark]) .ant-input-search-button:active {
  box-shadow: var(--neu-inset-primary) !important;
}
:root:not([data-theme=dark]) .ant-input-search .ant-input-group .ant-input {
  border-radius: 10px 0 0 10px !important;
}
/* 组合输入（affix-wrapper 内层 input）：只由外层负责边框与阴影，内层完全透明，避免双边框 */
:root:not([data-theme=dark]) .ant-input-affix-wrapper .ant-input,
:root:not([data-theme=dark]) .ant-input-affix-wrapper .ant-input:hover,
:root:not([data-theme=dark]) .ant-input-affix-wrapper .ant-input:focus,
:root:not([data-theme=dark]) .ant-input-affix-wrapper .ant-input-focused {
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  border-radius: 0 !important;
}

/* Select */
:root:not([data-theme=dark]) .ant-select:not(.ant-select-borderless) .ant-select-selector {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 10px !important;
  box-shadow: var(--neu-inset) !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-borderless) .ant-select-selector {
  border-color: rgba(45, 179, 104, .65) !important;
  box-shadow: inset 3px 3px 7px rgba(183, 189, 203, .8), inset -3px -3px 7px rgba(255, 255, 255, .95), 0 0 0 3px rgba(45, 179, 104, .3) !important;
}
:root:not([data-theme=dark]) .ant-select-arrow {
  color: var(--text-tertiary);
}
:root:not([data-theme=dark]) .ant-select-dropdown {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 14px !important;
  box-shadow: var(--neu-raise) !important;
  padding: 6px !important;
}
:root:not([data-theme=dark]) .ant-select-item {
  border-radius: 8px !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-select-item-option-selected {
  background: rgba(45, 179, 104, .12) !important;
  font-weight: 600 !important;
  color: #1e6b45 !important;
}
/* 下拉菜单（右键菜单 / 更多按钮） */
:root:not([data-theme=dark]) .ant-dropdown-menu {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 12px !important;
  box-shadow: var(--neu-raise) !important;
  padding: 6px !important;
}
:root:not([data-theme=dark]) .ant-dropdown-menu-item,
:root:not([data-theme=dark]) .ant-dropdown-menu-submenu-title {
  border-radius: 8px !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-dropdown-menu-item:active,
:root:not([data-theme=dark]) .ant-dropdown-menu-item-selected {
  background: rgba(45, 179, 104, .12) !important;
}

/* ---------- 8. 弹窗（柔化遮罩 + 大圆角双层投影） ---------- */
:root:not([data-theme=dark]) .ant-modal-mask {
  background: rgba(233, 236, 242, .55) !important;
  -webkit-backdrop-filter: blur(7px);
  backdrop-filter: blur(7px);
}
@supports not (backdrop-filter: blur(1px)) {
  :root:not([data-theme=dark]) .ant-modal-mask {
    background: rgba(233, 236, 242, .8) !important;
  }
}
:root:not([data-theme=dark]) .ant-modal-content {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 22px !important;
  box-shadow: var(--neu-modal) !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-modal-header {
  background: transparent !important;
}
:root:not([data-theme=dark]) .ant-modal-title {
  color: var(--text-primary) !important;
  font-weight: 700 !important;
}
:root:not([data-theme=dark]) .ant-modal-body {
  background: transparent !important;
  color: var(--text-secondary) !important;
}
:root:not([data-theme=dark]) .ant-modal-footer {
  background: transparent !important;
}
:root:not([data-theme=dark]) .ant-modal .ant-modal-close {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 50% !important;
  box-shadow: var(--neu-raise-mini) !important;
}
:root:not([data-theme=dark]) .ant-modal .ant-modal-close:active {
  box-shadow: var(--neu-inset-active) !important;
}
/* 确认对话框图标区 */
:root:not([data-theme=dark]) .ant-modal-confirm-body > .anticon {
  color: var(--accent-primary);
}

/* ---------- 9. 抽屉 ---------- */
:root:not([data-theme=dark]) .ant-drawer-content {
  background: var(--neu-bg) !important;
}
:root:not([data-theme=dark]) .ant-drawer-header {
  background: transparent !important;
  border-bottom: 1px solid var(--neu-edge) !important;
}
:root:not([data-theme=dark]) .ant-drawer-title {
  color: var(--text-primary) !important;
}

/* ---------- 10. 选项卡 ---------- */
:root:not([data-theme=dark]) .ant-tabs-ink-bar {
  background: var(--accent-primary) !important;
  height: 3px !important;
  border-radius: 3px !important;
}
:root:not([data-theme=dark]) .ant-tabs-tab-active .ant-tabs-tab-btn {
  color: var(--accent-primary) !important;
  font-weight: 600 !important;
}
:root:not([data-theme=dark]) .ant-tabs-tab {
  color: var(--text-secondary) !important;
}
/* 自定义 pill 选项卡：拟物化 */
:root:not([data-theme=dark]) .custom-tabs .ant-tabs-tab {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  color: var(--text-secondary) !important;
  border-radius: 10px !important;
  box-shadow: var(--neu-raise-mini) !important;
}
:root:not([data-theme=dark]) .custom-tabs .ant-tabs-tab:hover,
:root:not([data-theme=dark]) .custom-tabs .ant-tabs-tab-active {
  background: var(--neu-bg) !important;
  border-color: rgba(45, 179, 104, .5) !important;
  color: #1e6b45 !important;
  box-shadow: var(--neu-inset) !important;
}
:root:not([data-theme=dark]) .custom-tabs .ant-tabs-tab-active .ant-tabs-tab-btn {
  color: #1e6b45 !important;
  font-weight: 600 !important;
}

/* ---------- 11. 分页 ---------- */
:root:not([data-theme=dark]) .ant-pagination-item {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 9px !important;
  box-shadow: var(--neu-raise-mini) !important;
}
:root:not([data-theme=dark]) .ant-pagination-item a {
  color: var(--text-secondary) !important;
}
:root:not([data-theme=dark]) .ant-pagination-item-active {
  background: linear-gradient(145deg, #38c977, #24a55d) !important;
  border-color: transparent !important;
  box-shadow: var(--neu-raise-primary) !important;
}
:root:not([data-theme=dark]) .ant-pagination-item-active a {
  color: #fff !important;
  font-weight: 600 !important;
}
:root:not([data-theme=dark]) .ant-pagination-prev,
:root:not([data-theme=dark]) .ant-pagination-next {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 9px !important;
  box-shadow: var(--neu-raise-mini) !important;
}

/* ---------- 12. 开关 / 复选 / 单选 ---------- */
:root:not([data-theme=dark]) .ant-switch {
  background: #c9ced9 !important;
  border-radius: 99px !important;
  box-shadow: var(--neu-inset) !important;
}
:root:not([data-theme=dark]) .ant-switch-checked {
  background: linear-gradient(145deg, #38c977, #24a55d) !important;
  box-shadow: inset 2px 2px 5px rgba(21, 86, 51, .45) !important;
}
:root:not([data-theme=dark]) .ant-switch-handle::before {
  background: #fff !important;
}
:root:not([data-theme=dark]) .ant-switch .ant-switch-handle {
  box-shadow: 1px 1px 3px rgba(0, 0, 0, .25) !important;
}
:root:not([data-theme=dark]) .ant-checkbox-checked .ant-checkbox-inner {
  background: linear-gradient(145deg, #38c977, #24a55d) !important;
  border-color: transparent !important;
  box-shadow: inset 1px 1px 3px rgba(21, 86, 51, .5) !important;
}
/* 勾选框 / 单选框只有 16px，套用面板级的 7px 内阴影会被阴影糊满，
   看不出边界也看不出状态，这里换成 1~2px 的紧凑凹陷。 */
:root:not([data-theme=dark]) .ant-checkbox-inner {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  box-shadow: inset 1px 1px 2px rgba(183, 189, 203, .75),
              inset -1px -1px 2px rgba(255, 255, 255, .95) !important;
}
:root:not([data-theme=dark]) .ant-radio-inner {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  box-shadow: inset 1px 1px 2px rgba(183, 189, 203, .75),
              inset -1px -1px 2px rgba(255, 255, 255, .95) !important;
}
:root:not([data-theme=dark]) .ant-radio-checked .ant-radio-inner {
  border-color: #2db368 !important;
  box-shadow: none !important;
}
:root:not([data-theme=dark]) .ant-radio-checked .ant-radio-inner::after {
  background: #1e6b45 !important;
}

/* ---------- 13. 标签 / 提示 / 消息 / 进度 ---------- */
:root:not([data-theme=dark]) .ant-tag {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 8px !important;
  box-shadow: var(--neu-raise-mini) !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-alert {
  border-radius: 12px !important;
  box-shadow: var(--neu-raise-mini) !important;
}
:root:not([data-theme=dark]) .ant-message-notice-content,
:root:not([data-theme=dark]) .ant-notification-notice {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 14px !important;
  box-shadow: var(--neu-raise) !important;
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-progress-outer {
  background: #dde2eb !important;
  box-shadow: inset 1px 1px 3px rgba(163, 170, 186, .6) !important;
  border-radius: 99px !important;
}
:root:not([data-theme=dark]) .ant-progress-bg {
  border-radius: 99px !important;
}

/* ---------- 14. 自定义类协调 ---------- */
/* 设备列表项：凸起卡片，选中 = 主色高亮凸起 */
:root:not([data-theme=dark]) .device-list-item {
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 12px !important;
  box-shadow: var(--neu-raise-sm) !important;
}
:root:not([data-theme=dark]) .device-list-item:hover {
  box-shadow: 5px 5px 12px rgba(198, 203, 216, .95), -4px -4px 10px rgba(255, 255, 255, .95) !important;
}
:root:not([data-theme=dark]) .device-list-item.selected {
  background: var(--neu-bg) !important;
  border-color: rgba(45, 179, 104, .55) !important;
  box-shadow: var(--neu-raise-primary) !important;
}
/* 主题切换按钮（深色顶栏语境，仅协调圆角） */
:root:not([data-theme=dark]) .theme-switch-btn {
  border-radius: 10px;
}
/* 页面容器 */
:root:not([data-theme=dark]) .page-container {
  background: var(--neu-bg) !important;
}
:root:not([data-theme=dark]) .control-tabs-wrapper {
  border-radius: 14px;
}
