/* ============================================================================
   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 把上下留白压没了，标题/操作按钮会贴住上下边框 */
  min-height: 46px !important;
  padding: 0 16px !important;
}
/* 卡片头右侧操作区（刷新/添加/清除…）：统一垂直居中 + 间距 */
:root:not([data-theme=dark]) .ant-card-head .ant-card-head-wrapper {
  align-items: center !important;
  gap: 12px;
}
:root:not([data-theme=dark]) .ant-card-extra {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-inline-start: auto;
}
:root:not([data-theme=dark]) .ant-card-small > .ant-card-head {
  min-height: 40px !important;
  padding: 0 12px !important;
}
/* 原生 <select>（如封禁页的「禁用 / 杀进程」）统一成皮肤输入框风格，
   否则会保留浏览器默认边框/高度，和旁边的 antd 输入框、按钮对不齐 */
:root:not([data-theme=dark]) select {
  height: 28px !important;
  padding: 0 8px !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 8px !important;
  background: var(--neu-bg) !important;
  color: var(--text-primary) !important;
  font-size: 12px !important;
  line-height: 26px !important;
  box-shadow: none !important;
  outline: none !important;
  appearance: auto;
}
: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;
}
/* 危险按钮：红底必须配浅色字（否则会被 .ant-btn-default 的深色字盖住，红底黑字不可读） */
: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;
  color: #fff !important;
  font-weight: 600 !important;
  text-shadow: 0 1px 2px rgba(0, 0, 0, .22);
  box-shadow: var(--neu-raise-danger) !important;
}
/* 悬停时 .ant-btn-default:hover 会把字改成强调绿，这里必须显式盖回白色 */
: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;
  color: #fff !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 {
  color: #fff !important;
  box-shadow: var(--neu-inset-danger) !important;
}
/* 危险按钮的图标/文字在禁用态沿用全局灰底，避免白字落在浅灰上 */
:root:not([data-theme=dark]) .ant-btn-dangerous[disabled],
:root:not([data-theme=dark]) .ant-btn-danger[disabled] {
  color: #9aa1b5 !important;
  text-shadow: none;
}
/* 文字/链接型危险按钮：透明底 + 红字，不做拟物红块（表格里的删除图标按钮就属于这一类） */
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-text,
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-link,
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-variant-text,
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-variant-link,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-text,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-link,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-variant-text,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-variant-link {
  background: transparent !important;
  border-color: transparent !important;
  color: var(--accent-danger) !important;
  font-weight: 500 !important;
  text-shadow: none;
  box-shadow: none !important;
}
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-text:hover,
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-link:hover,
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-variant-text:hover,
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-variant-link:hover,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-text:hover,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-link:hover,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-variant-text:hover,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-variant-link:hover {
  background: rgba(192, 54, 57, .08) !important;
  color: #a92c2f !important;
  box-shadow: none !important;
}
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-text:active,
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-link:active,
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-variant-text:active,
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-variant-link:active,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-text:active,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-link:active,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-variant-text:active,
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-variant-link:active {
  background: rgba(192, 54, 57, .14) !important;
  color: #a92c2f !important;
  box-shadow: none !important;
}
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-text[disabled],
:root:not([data-theme=dark]) .ant-btn-dangerous.ant-btn-link[disabled],
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-text[disabled],
:root:not([data-theme=dark]) .ant-btn-danger.ant-btn-link[disabled] {
  background: transparent !important;
  color: #9aa1b5 !important;
  box-shadow: none !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;
  /* 关键：`.dark-modal` 的 header/body 会把背景设为 inherit（应用层 !important），
     不裁切就会用方角盖住 content 的圆角，表现为「上圆下方」或四角白块 */
  overflow: hidden !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 {
  top: 18px !important;
  right: 18px !important;
  width: 26px !important;
  height: 26px !important;
  padding: 0 !important;
  display: flex !important;
  align-items: center;
  justify-content: center;
  background: var(--neu-bg) !important;
  border: 1px solid var(--neu-edge) !important;
  border-radius: 50% !important;
  box-shadow: var(--neu-raise-mini) !important;
  color: var(--text-secondary) !important;
}
:root:not([data-theme=dark]) .ant-modal .ant-modal-close:hover {
  color: var(--text-primary) !important;
}
:root:not([data-theme=dark]) .ant-modal .ant-modal-close .ant-modal-close-x {
  width: auto !important;
  height: auto !important;
  line-height: 1 !important;
  font-size: 12px !important;
  display: flex;
  align-items: center;
  justify-content: center;
}
: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;
}

/* ===== 启动 / 初始化画面（登录态检查期间，对应 bundle 里的 className="fisher-boot"） ===== */
/* 浅色版：与拟物风亮色皮肤一致（软灰蓝底 + 白色图标 + 品牌绿指示器），不再用深紫 */
.fisher-boot {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 22px;
  background:
    radial-gradient(900px 520px at 16% 10%, rgba(255, 255, 255, .95), transparent 60%),
    radial-gradient(760px 440px at 88% 92%, rgba(45, 179, 104, .12), transparent 55%),
    linear-gradient(135deg, #f4f7fb 0%, #e9eef6 55%, #eef2f8 100%);
  color: #4a5568;
  animation: fisher-boot-in .35s ease-out both;
}

.fisher-boot::before {
  content: "";
  width: 88px;
  height: 88px;
  border-radius: 24px;
  background: #fff url(/assets/png/logo.webp) center / 58% no-repeat;
  border: 1px solid rgba(255, 255, 255, .9);
  box-shadow: 0 14px 34px rgba(31, 45, 61, .14), inset 0 1px 0 rgba(255, 255, 255, .95);
}

.fisher-boot::after {
  content: none;
  font: 600 13px/1 system-ui, -apple-system, "Segoe UI", "PingFang SC", sans-serif;
  letter-spacing: .18em;
  text-indent: .18em;
  color: #5b6472;
}

.fisher-boot .ant-spin { color: #2DB368; }
.fisher-boot .ant-spin-dot-item { background-color: #2DB368; }

/* 暗色主题：保持低亮度，避免启动瞬间刺眼闪白 */
[data-theme=dark] .fisher-boot {
  background:
    radial-gradient(900px 520px at 16% 10%, rgba(255, 255, 255, .04), transparent 60%),
    radial-gradient(760px 440px at 88% 92%, rgba(45, 179, 104, .10), transparent 55%),
    linear-gradient(135deg, #161b22 0%, #1b232d 55%, #131a22 100%);
  color: #e6edf3;
}
[data-theme=dark] .fisher-boot::before {
  border-color: rgba(255, 255, 255, .08);
  box-shadow: 0 14px 34px rgba(0, 0, 0, .5), inset 0 1px 0 rgba(255, 255, 255, .06);
}
[data-theme=dark] .fisher-boot::after {
  color: rgba(230, 237, 243, .8);
}

@keyframes fisher-boot-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
  .fisher-boot { animation: none; }
}
