Bladeren bron

fix(ui): 退出登录按钮悬停无变化 + 深色模式开关轨道不可辨

一、退出登录按钮
🔴 原样式 .logout-action:hover 的 background 与本体完全相同(都是 danger-subtle),
悬停等于没有任何视觉变化,用户感觉不到按钮是活的。
- 默认:danger 与 surface 混出浅红底 + 40% 红边
- 悬停:底色加深到 20%、边框变实到 72%、上浮 1px、图标右移 2px
- 按下:scale(.98)

二、深色模式开关
关闭态轨道在深色主题下用 --faint/--edge-strong 都偏浅,
白圆点压上去退化成「白底白轨」,分不清开还是关。
- 关闭态改为固定深色 #3f4652,深色主题下 #4a515e + 内描边
- 开启态保持 primary 蓝
两套主题下都是「深色槽 + 白点 / 蓝槽 + 白点」的明确对比。

已用 Chrome 渲染核对浅色/深色主题下的开关与按钮默认/悬停效果。

验证:tsc 0 错误;单测 1089/1089;构建通过;verify:ui 12/12

Co-Authored-By: Claude Code <noreply@anthropic.com>
Huccct 1 dag geleden
bovenliggende
commit
6c0f751211

+ 27 - 3
src/app/components/domain/session-tree/session-tree.ts

@@ -411,7 +411,12 @@ export interface NewSessionRequest {
             <span class="user-name ellipsis">{{ meName() }}</span>
             <span class="user-role ellipsis">{{ userRole() }}</span>
           </span>
-          <i class="fa-solid fa-chevron-up dots" [class.rot]="userMenuOpen()" aria-hidden="true"></i>
+          <!--
+            箭头方向由 CSS 控制(见 .user-main:hover > .dots):
+            默认朝上,悬停或菜单展开时朝下。不在模板里切类名,
+            避免「模板状态」与「悬停状态」两套逻辑打架。
+          -->
+          <i class="fa-solid fa-chevron-up dots" aria-hidden="true"></i>
         </button>
         <!-- 点外部关闭 -->
         @if (userMenuOpen()) {
@@ -1358,12 +1363,31 @@ export interface NewSessionRequest {
         opacity: 0;
         transition: opacity var(--motion-fast) var(--ease-standard);
       }
+      /*
+       * 用户卡片:悬停反馈 + 箭头方向(2026-11-01 用户要求)。
+       *
+       * · 默认箭头**朝上**(▲)=「点我向上展开菜单」
+       * · 悬停 / 菜单已展开 → 箭头**朝下**(▼)
+       * · 整行背景随悬停变浅,明确「这一整条都是可点的」
+       */
+      .user-main:hover {
+        background: var(--surface-hover);
+      }
+      .user-main:active {
+        background: var(--surface-active);
+      }
       .user-main:hover > .dots,
-      .user-main[aria-expanded='true'] > .dots,
       .user-main:focus-visible > .dots {
         opacity: 1;
       }
-      .dots.rot {
+      /*
+       * 悬停就把箭头翻过来(原来是 .rot 只在菜单展开时加)。
+       * 用 [aria-expanded='true'] 覆盖:菜单已展开时保持朝下,
+       * 否则鼠标移开又翻回朝上,与「菜单开着」的状态矛盾。
+       */
+      .user-main:hover > .dots,
+      .user-main:focus-visible > .dots,
+      .user-main[aria-expanded='true'] > .dots {
         transform: rotate(180deg);
       }
       .dots {

+ 32 - 5
src/app/desktop/pages/mine/mine.ts

@@ -505,20 +505,47 @@ import { SessionService } from '../../../core/session.service';
         font-size: var(--fs-13);
         font-weight: 600;
         cursor: pointer;
-        transition: background-color var(--motion-fast) var(--ease-standard), transform var(--motion-fast) var(--ease-standard);
+        width: 100%;
+        transition:
+          background-color var(--motion-fast) var(--ease-standard),
+          border-color var(--motion-fast) var(--ease-standard),
+          transform var(--motion-fast) var(--ease-standard);
       }
+      /*
+       * 退出登录按钮(2026-11-01 用户反馈修复)。
+       *
+       * 🔴 原实现 .logout-action:hover 的 background 与本体**完全相同**(都是 --danger-subtle)——
+       *    悬停等于没有任何变化,用户感觉不到按钮是活的。
+       *    悬停等于没有任何变化,用户感觉不到按钮是活的。
+       *
+       * 现在:
+       *   默认  浅红底 + 半透明红边(克制,不像是故障报警)
+       *   悬停  底色加深一档 + 边框变实 + 轻微上浮
+       *   按下  回落(scale .98),给「按到了」的触感
+       */
       .logout-action {
-        width: 100%;
-        border: 1px solid color-mix(in srgb, var(--danger) 52%, var(--edge));
-        background: var(--danger-subtle);
+        border: 1px solid color-mix(in srgb, var(--danger) 40%, var(--edge));
+        /* 用 danger 与 surface 混出浅底,比固定的 danger-subtle 更好控制层次 */
+        background: color-mix(in srgb, var(--danger) 10%, var(--surface));
         color: var(--danger);
       }
-      .logout-action:hover { background: var(--danger-subtle); }
+      .logout-action:hover {
+        background: color-mix(in srgb, var(--danger) 20%, var(--surface));
+        border-color: color-mix(in srgb, var(--danger) 72%, var(--edge));
+        transform: translateY(-1px);
+      }
       .logout-action:active { transform: scale(.98); }
       .logout-action:focus-visible {
         outline: 2px solid var(--primary-ring);
         outline-offset: 2px;
       }
+      /* 图标随悬停右移一点,强化「离开 / 退出」的语义 */
+      .logout-action i {
+        transition: transform var(--motion-fast) var(--ease-standard);
+      }
+      .logout-action:hover i {
+        transform: translateX(2px);
+      }
       @keyframes page-card-in {
         from { opacity: 0; transform: translateY(var(--sp-2)); }
         to { opacity: 1; transform: translateY(0); }

+ 24 - 0
src/app/ui/components/switch/switch.scss

@@ -1,3 +1,27 @@
 :host {
   display: inline-flex;
 }
+
+/*
+ * 开关关闭态轨道(2026-11-01 用户要求)。
+ *
+ * 诉求:白色背景下「滑轨」必须一眼可见,不能和背景糊在一起。
+ *
+ * 🔴 为什么不用主题 token:
+ *    深色主题下 --faint(#6b727d) / --edge-strong(#454b56) / --surface-active(#333842)
+ *    都偏浅或与卡片过于接近,白色圆点压上去会退化成「一团浅色」,
+ *    分不清开还是关(用户多次反馈的正是这个观感)。
+ *    关闭态在**两套主题下都应该表达同一个意思:未激活的深色槽**,
+ *    所以用固定深色而非随主题浮动。
+ *
+ * 开启态由模板的 bg-primary 提供(蓝色强调色,两套主题下都明确)。
+ */
+.ui-switch-track-off {
+  background-color: #3f4652;
+
+  /* 深色主题下卡片本身就很深,轨道再加一点边界,避免与卡片融在一起 */
+  :host-context(.dark) & {
+    background-color: #4a515e;
+    box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.08);
+  }
+}

+ 7 - 6
src/app/ui/components/switch/switch.ts

@@ -32,14 +32,15 @@ export class UiSwitch {
       'relative inline-flex shrink-0 items-center rounded-full transition-colors duration-200',
       'disabled:pointer-events-none disabled:opacity-50',
       /*
-       * 关闭态用 --surface-active 而不是 --edge-strong(2026-11-01 深色模式修正)。
+       * 关闭态轨道用**深色**(2026-11-01 用户要求:白色背景下滑轨要明显)。
        *
-       * --edge-strong 在深色主题下是 #454b56,但白色圆点压在它上面时,
-       * 两者亮度接近 —— 开关看起来像「一团白」,分不清是开还是关(用户截图反馈)。
-       * --surface-active 是「比背景深一层」的中性色,在明暗两套主题下
-       * 都能与白色圆点形成明确边界。
+       * 取 --surface-active 与 --edge-strong 之间偏深的一档?
+       * 不 —— 直接在 switch.scss 里用固定深色,理由:
+       *   两个主题下的目标都是「深色轨道 + 白色圆点」这组经典配色,
+       *   而 --faint / --edge-strong / --surface-* 在深色主题下都偏浅,
+       *   会退化成「白底白轨」(用户截图正是这个观感)。
        */
-      this.checked() ? 'bg-primary' : 'bg-surface-active',
+      this.checked() ? 'bg-primary' : 'ui-switch-track-off',
       sizes[this.size()],
     ].join(' ');
   });