dsh-mega-chat-nav 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/LICENSE +201 -0
  2. package/README.en.md +149 -0
  3. package/README.md +149 -0
  4. package/cordis.patch.yml +4 -0
  5. package/lib/client/NavOverlay.js +35 -0
  6. package/lib/client/NavRail.js +12 -0
  7. package/lib/client/QuestionNavSettingsTab.js +26 -0
  8. package/lib/client/QuestionNavStrip.js +555 -0
  9. package/lib/client/components/ConfigPanel.js +14 -0
  10. package/lib/client/components/DotRail.js +62 -0
  11. package/lib/client/components/NavOverlay.js +121 -0
  12. package/lib/client/components/NavRail.js +97 -0
  13. package/lib/client/components/RailDispatch.js +22 -0
  14. package/lib/client/components/RailHost.js +79 -0
  15. package/lib/client/components/SearchBox.js +66 -0
  16. package/lib/client/components/SettingsPage.js +46 -0
  17. package/lib/client/components/StandaloneSettings.js +16 -0
  18. package/lib/client/components/codex/CodexRail.js +139 -0
  19. package/lib/client/components/deepseek/DeepseekRail.js +264 -0
  20. package/lib/client/components/minimal/MinimalRail.js +135 -0
  21. package/lib/client/components/minimal/cards.js +32 -0
  22. package/lib/client/components/minimal/dot.js +11 -0
  23. package/lib/client/components/minimal/hint.js +30 -0
  24. package/lib/client/components/minimal/paging.js +5 -0
  25. package/lib/client/components/minimal/quick-settings.js +28 -0
  26. package/lib/client/components/minimal/search.js +67 -0
  27. package/lib/client/components/minimal/useRail.js +716 -0
  28. package/lib/client/components/rail/cards.js +32 -0
  29. package/lib/client/components/rail/hint.js +30 -0
  30. package/lib/client/components/rail/paging.js +5 -0
  31. package/lib/client/components/rail/quick-settings.js +28 -0
  32. package/lib/client/components/rail/search.js +76 -0
  33. package/lib/client/components/rail/useRail.js +845 -0
  34. package/lib/client/components/settings/SettingsPage.js +46 -0
  35. package/lib/client/components/settings/SettingsTab.js +17 -0
  36. package/lib/client/components/settings/StandaloneSettings.js +16 -0
  37. package/lib/client/components/shared/Cascade.js +26 -0
  38. package/lib/client/components/shared/ConfigPanel.js +27 -0
  39. package/lib/client/components/shared/Dot.js +8 -0
  40. package/lib/client/components/shared/Hint.js +5 -0
  41. package/lib/client/components/shared/PagingButton.js +5 -0
  42. package/lib/client/components/shared/RailShell.js +78 -0
  43. package/lib/client/components/shared/SearchBox.js +63 -0
  44. package/lib/client/components/shared/hooks.js +427 -0
  45. package/lib/client/components/shared/types.js +1 -0
  46. package/lib/client/config.js +1 -0
  47. package/lib/client/engines/jump.js +34 -0
  48. package/lib/client/engines/useAtBottom.js +25 -0
  49. package/lib/client/engines/useJump.js +40 -0
  50. package/lib/client/engines/useScrollSpy.js +88 -0
  51. package/lib/client/hooks.js +11 -0
  52. package/lib/client/index.js +312 -0
  53. package/lib/client/jump.js +255 -0
  54. package/lib/client/locales.js +142 -0
  55. package/lib/client/pure.js +61 -0
  56. package/lib/client/settings.js +369 -0
  57. package/lib/client/virtual/VirtualList.js +21 -0
  58. package/lib/client.js +3213 -0
  59. package/lib/compat.js +145 -0
  60. package/lib/config.js +37 -0
  61. package/lib/core/active-dot.js +17 -0
  62. package/lib/core/align.js +9 -0
  63. package/lib/core/config.js +37 -0
  64. package/lib/core/focus.js +38 -0
  65. package/lib/core/jump.js +98 -0
  66. package/lib/core/logic/active-dot.js +16 -0
  67. package/lib/core/logic/focus.js +34 -0
  68. package/lib/core/logic/jump.js +188 -0
  69. package/lib/core/logic/nodes.js +59 -0
  70. package/lib/core/model/nav-item.js +1 -0
  71. package/lib/core/model/turns.js +73 -0
  72. package/lib/core/nav-item.js +1 -0
  73. package/lib/core/nodes.js +57 -0
  74. package/lib/core/page-size.js +7 -0
  75. package/lib/core/question-entry.js +1 -0
  76. package/lib/core/time.js +23 -0
  77. package/lib/core/turn-dots.js +85 -0
  78. package/lib/core/utils/measure.js +24 -0
  79. package/lib/core/utils/time.js +26 -0
  80. package/lib/index.js +64 -0
  81. package/lib/nav-item.js +1 -0
  82. package/lib/nodes.js +59 -0
  83. package/lib/projection.js +126 -0
  84. package/lib/schema.js +26 -0
  85. package/lib/search.js +285 -0
  86. package/lib/settings.js +89 -0
  87. package/lib/types/client/NavOverlay.d.ts +18 -0
  88. package/lib/types/client/NavRail.d.ts +7 -0
  89. package/lib/types/client/QuestionNavSettingsTab.d.ts +16 -0
  90. package/lib/types/client/QuestionNavStrip.d.ts +48 -0
  91. package/lib/types/client/components/ConfigPanel.d.ts +14 -0
  92. package/lib/types/client/components/DotRail.d.ts +15 -0
  93. package/lib/types/client/components/NavOverlay.d.ts +30 -0
  94. package/lib/types/client/components/NavRail.d.ts +16 -0
  95. package/lib/types/client/components/RailDispatch.d.ts +8 -0
  96. package/lib/types/client/components/RailHost.d.ts +27 -0
  97. package/lib/types/client/components/SearchBox.d.ts +9 -0
  98. package/lib/types/client/components/SettingsPage.d.ts +9 -0
  99. package/lib/types/client/components/StandaloneSettings.d.ts +13 -0
  100. package/lib/types/client/components/codex/CodexRail.d.ts +3 -0
  101. package/lib/types/client/components/deepseek/DeepseekRail.d.ts +3 -0
  102. package/lib/types/client/components/minimal/MinimalRail.d.ts +8 -0
  103. package/lib/types/client/components/minimal/cards.d.ts +19 -0
  104. package/lib/types/client/components/minimal/dot.d.ts +14 -0
  105. package/lib/types/client/components/minimal/hint.d.ts +11 -0
  106. package/lib/types/client/components/minimal/paging.d.ts +10 -0
  107. package/lib/types/client/components/minimal/quick-settings.d.ts +8 -0
  108. package/lib/types/client/components/minimal/search.d.ts +27 -0
  109. package/lib/types/client/components/minimal/useRail.d.ts +90 -0
  110. package/lib/types/client/components/rail/cards.d.ts +19 -0
  111. package/lib/types/client/components/rail/hint.d.ts +11 -0
  112. package/lib/types/client/components/rail/paging.d.ts +10 -0
  113. package/lib/types/client/components/rail/quick-settings.d.ts +8 -0
  114. package/lib/types/client/components/rail/search.d.ts +34 -0
  115. package/lib/types/client/components/rail/useRail.d.ts +132 -0
  116. package/lib/types/client/components/settings/SettingsPage.d.ts +9 -0
  117. package/lib/types/client/components/settings/SettingsTab.d.ts +6 -0
  118. package/lib/types/client/components/settings/StandaloneSettings.d.ts +13 -0
  119. package/lib/types/client/components/shared/Cascade.d.ts +14 -0
  120. package/lib/types/client/components/shared/ConfigPanel.d.ts +8 -0
  121. package/lib/types/client/components/shared/Dot.d.ts +17 -0
  122. package/lib/types/client/components/shared/Hint.d.ts +6 -0
  123. package/lib/types/client/components/shared/PagingButton.d.ts +10 -0
  124. package/lib/types/client/components/shared/RailShell.d.ts +43 -0
  125. package/lib/types/client/components/shared/SearchBox.d.ts +18 -0
  126. package/lib/types/client/components/shared/hooks.d.ts +64 -0
  127. package/lib/types/client/components/shared/types.d.ts +101 -0
  128. package/lib/types/client/config.d.ts +9 -0
  129. package/lib/types/client/engines/jump.d.ts +17 -0
  130. package/lib/types/client/engines/useAtBottom.d.ts +1 -0
  131. package/lib/types/client/engines/useJump.d.ts +16 -0
  132. package/lib/types/client/engines/useScrollSpy.d.ts +12 -0
  133. package/lib/types/client/hooks.d.ts +7 -0
  134. package/lib/types/client/index.d.ts +31 -0
  135. package/lib/types/client/jump.d.ts +47 -0
  136. package/lib/types/client/locales.d.ts +142 -0
  137. package/lib/types/client/pure.d.ts +21 -0
  138. package/lib/types/client/settings.d.ts +173 -0
  139. package/lib/types/client/virtual/VirtualList.d.ts +15 -0
  140. package/lib/types/compat.d.ts +44 -0
  141. package/lib/types/config.d.ts +44 -0
  142. package/lib/types/core/active-dot.d.ts +15 -0
  143. package/lib/types/core/align.d.ts +10 -0
  144. package/lib/types/core/config.d.ts +44 -0
  145. package/lib/types/core/focus.d.ts +24 -0
  146. package/lib/types/core/jump.d.ts +39 -0
  147. package/lib/types/core/logic/active-dot.d.ts +15 -0
  148. package/lib/types/core/logic/focus.d.ts +22 -0
  149. package/lib/types/core/logic/jump.d.ts +39 -0
  150. package/lib/types/core/logic/nodes.d.ts +48 -0
  151. package/lib/types/core/model/nav-item.d.ts +12 -0
  152. package/lib/types/core/model/turns.d.ts +30 -0
  153. package/lib/types/core/nav-item.d.ts +12 -0
  154. package/lib/types/core/nodes.d.ts +43 -0
  155. package/lib/types/core/page-size.d.ts +8 -0
  156. package/lib/types/core/question-entry.d.ts +12 -0
  157. package/lib/types/core/time.d.ts +4 -0
  158. package/lib/types/core/turn-dots.d.ts +29 -0
  159. package/lib/types/core/utils/measure.d.ts +12 -0
  160. package/lib/types/core/utils/time.d.ts +4 -0
  161. package/lib/types/index.d.ts +4 -0
  162. package/lib/types/nav-item.d.ts +12 -0
  163. package/lib/types/nodes.d.ts +48 -0
  164. package/lib/types/projection.d.ts +71 -0
  165. package/lib/types/schema.d.ts +37 -0
  166. package/lib/types/search.d.ts +42 -0
  167. package/lib/types/settings.d.ts +99 -0
  168. package/package.json +71 -0
  169. package/src/client/components/RailDispatch.tsx +27 -0
  170. package/src/client/components/codex/CodexRail.tsx +348 -0
  171. package/src/client/components/deepseek/DeepseekRail.tsx +522 -0
  172. package/src/client/components/minimal/MinimalRail.tsx +324 -0
  173. package/src/client/components/minimal/dot.tsx +32 -0
  174. package/src/client/components/rail/cards.tsx +102 -0
  175. package/src/client/components/rail/hint.tsx +50 -0
  176. package/src/client/components/rail/paging.tsx +26 -0
  177. package/src/client/components/rail/quick-settings.tsx +130 -0
  178. package/src/client/components/rail/search.tsx +147 -0
  179. package/src/client/components/rail/useRail.ts +906 -0
  180. package/src/client/components/settings/SettingsPage.tsx +198 -0
  181. package/src/client/components/settings/StandaloneSettings.tsx +28 -0
  182. package/src/client/components/shared/types.ts +99 -0
  183. package/src/client/index.ts +388 -0
  184. package/src/client/jump.ts +293 -0
  185. package/src/client/locales.ts +143 -0
  186. package/src/client/settings.ts +482 -0
  187. package/src/client/styles.css +1580 -0
  188. package/src/compat.ts +161 -0
  189. package/src/index.ts +66 -0
  190. package/src/projection.ts +174 -0
  191. package/src/search.ts +291 -0
  192. package/src/settings.ts +169 -0
@@ -0,0 +1,1580 @@
1
+ .mgcn-rail {
2
+ position: absolute;
3
+ top: 0;
4
+ bottom: 0;
5
+ left: 0;
6
+ z-index: 1;
7
+ width: 44px;
8
+ display: flex;
9
+ flex-direction: column;
10
+ align-items: center;
11
+ box-sizing: border-box;
12
+ background: transparent;
13
+ /* Overlay: let pointer events pass through to the conversation beyond the
14
+ dots, so the embedded minimap never blocks the chat. */
15
+ pointer-events: none;
16
+ }
17
+
18
+ /* Right-anchored rail: release the CSS `left: 0` so the inline `right`
19
+ (written by the layout-correction loop) owns the position. */
20
+ .mgcn-railRight {
21
+ left: auto;
22
+ }
23
+
24
+ /* The paging queue: holds a single .mgcn-list (the dot band plus the floating
25
+ action controls as its children). Clamped to 60% of the conversation height
26
+ and vertically centered (auto margins). The band re-enables pointer events;
27
+ the wrapper stays pass-through. All action controls (search/settings/count
28
+ + ▲/▼) float relative to the list via .mgcn-actions/.mgcn-pageUp/
29
+ .mgcn-pageDown — never mixed into the dot flow. */
30
+ .mgcn-queue {
31
+ flex: 0 1 auto;
32
+ min-height: 0;
33
+ max-height: 60%;
34
+ margin: auto 0;
35
+ width: 100%;
36
+ display: flex;
37
+ flex-direction: column;
38
+ align-items: center;
39
+ box-sizing: border-box;
40
+ pointer-events: none;
41
+ }
42
+
43
+ /* The middle dot band: the only scrollable part of the queue. Scrolls from the
44
+ top (overflow collapses the auto margins to 0). The native scrollbar is
45
+ always hidden: this is a minimap paged by the ▲/▼ buttons and by
46
+ wheel/trackpad, and overflow is signalled by the ▲/▼ triangles themselves
47
+ (each appears only while its direction has more dots to reveal). */
48
+ .mgcn-list {
49
+ flex: 1 1 auto;
50
+ min-height: 0;
51
+ width: 100%;
52
+ position: relative; /* 操作区定位上下文;无 overflow,悬浮件不被裁剪 */
53
+ max-height: min(var(--mgcn-band-height, 210px), 60vh);
54
+ display: flex;
55
+ flex-direction: column;
56
+ align-items: center;
57
+ pointer-events: auto;
58
+ }
59
+
60
+ /* ---- 操作区:.mgcn-list 子级,相对条带悬浮(列表上方外侧竖排,不占列表高度) ---- */
61
+ .mgcn-actions {
62
+ position: absolute;
63
+ bottom: calc(100% + 22px); /* 操作区:条带上缘外侧 22px(紧凑让位 ▲ 翻页位) */
64
+ left: 50%;
65
+ transform: translateX(-50%);
66
+ z-index: 60;
67
+ display: flex;
68
+ flex-direction: column;
69
+ align-items: center;
70
+ gap: 4px;
71
+ pointer-events: none; /* 容器穿透:事件只落在按钮层(隐藏态不挡 rail) */
72
+ }
73
+ .mgcn-actions .mgcn-gear-wrap {
74
+ pointer-events: auto;
75
+ }
76
+ .mgcn-actions .mgcn-config-panel,
77
+ .mgcn-actions .mgcn-search {
78
+ pointer-events: auto; /* 浮层面板仍需接收 */
79
+ }
80
+ /* 翻页标记隐藏(配置 hide)或不可滚动时,▲/▼ 完全不渲染:
81
+ 操作区不再预留翻页空位,改为紧贴条带上缘(6px 间隙) */
82
+ .mgcn-listNoPage .mgcn-actions {
83
+ bottom: calc(100% + 6px);
84
+ }
85
+
86
+ /* ▲/▼ 翻页:贴列表上下边缘外侧 */
87
+ .mgcn-pageUp {
88
+ position: absolute;
89
+ top: -18px;
90
+ left: 50%;
91
+ transform: translateX(-50%);
92
+ z-index: 60;
93
+ pointer-events: auto;
94
+ }
95
+ .mgcn-pageDown {
96
+ position: absolute;
97
+ bottom: -18px;
98
+ left: 50%;
99
+ transform: translateX(-50%);
100
+ z-index: 60;
101
+ pointer-events: auto;
102
+ }
103
+
104
+ /* 圆点:默认实心灰点;被 hover 时变空心(品牌描边 + 透明底);聚焦/激活为实心品牌圆 */
105
+ .mgcn-dot {
106
+ flex: none;
107
+ pointer-events: auto;
108
+ width: 8px;
109
+ height: 8px;
110
+ border-radius: 50%;
111
+ padding: 0;
112
+ background: var(--dsw-alias-border-l3, var(--dsw-alias-label-tertiary)); /* 实心 */
113
+ border: 1.5px solid transparent;
114
+ cursor: pointer;
115
+ transition: transform 120ms ease, background 120ms ease, border-color 120ms ease;
116
+ }
117
+ /* 被 hover / 聚焦(级联选中):空心(品牌描边),配合 1.5 倍放大 */
118
+ .mgcn-dot:hover,
119
+ .mgcn-dot.mgcn-focused {
120
+ background: transparent;
121
+ border-color: var(--dsw-alias-brand-primary);
122
+ }
123
+ .mgcn-dot.mgcn-active {
124
+ background: var(--dsw-alias-brand-primary);
125
+ border-color: var(--dsw-alias-brand-primary);
126
+ }
127
+ /* 激活(阅读位置)节点:实心品牌圆 */
128
+ .mgcn-dot.mgcn-current {
129
+ background: var(--dsw-alias-brand-primary);
130
+ border-color: var(--dsw-alias-brand-primary);
131
+ }
132
+
133
+ /* Click-paging feedback: dots revealed by a ▲/▼ click pop in with a staggered
134
+ fade + rise/drop (per-dot animation-delay is set inline, stagger order *
135
+ 35ms), traveling in the paging direction so the newly revealed batch reads
136
+ as "the click brought these in". `both` fill holds the hidden `from` state
137
+ during each dot's delay. */
138
+ @keyframes mgcn-dotEnterFromBottom {
139
+ from {
140
+ opacity: 0;
141
+ transform: translateY(7px) scale(0.4);
142
+ }
143
+ 60% {
144
+ opacity: 1;
145
+ }
146
+ to {
147
+ opacity: 1;
148
+ transform: translateY(0) scale(1);
149
+ }
150
+ }
151
+ @keyframes mgcn-dotEnterFromTop {
152
+ from {
153
+ opacity: 0;
154
+ transform: translateY(-7px) scale(0.4);
155
+ }
156
+ 60% {
157
+ opacity: 1;
158
+ }
159
+ to {
160
+ opacity: 1;
161
+ transform: translateY(0) scale(1);
162
+ }
163
+ }
164
+ .mgcn-dotEnterFromBottom {
165
+ animation: mgcn-dotEnterFromBottom 320ms cubic-bezier(0.2, 0.9, 0.3, 1.2) both;
166
+ }
167
+ .mgcn-dotEnterFromTop {
168
+ animation: mgcn-dotEnterFromTop 320ms cubic-bezier(0.2, 0.9, 0.3, 1.2) both;
169
+ }
170
+ @media (prefers-reduced-motion: reduce) {
171
+ .mgcn-dotEnterFromBottom,
172
+ .mgcn-dotEnterFromTop {
173
+ animation: none;
174
+ }
175
+ }
176
+
177
+ /* Question count, rendered just above the first dot (sits in the list gap). */
178
+ .mgcn-count {
179
+ flex: none;
180
+ font-size: 10px;
181
+ line-height: 1;
182
+ font-weight: 600;
183
+ color: var(--dsw-alias-label-tertiary);
184
+ user-select: none;
185
+ }
186
+
187
+ /* The centered group: dot column, centered together (the list's auto
188
+ margins center it when short; it scrolls as a unit when tall). */
189
+ /* 滚动容器:圆点列在此滚动(.mgcn-list 只负责条带几何与操作区锚定) */
190
+ .mgcn-dots {
191
+ flex: 1 1 auto;
192
+ min-height: 0;
193
+ width: 100%;
194
+ overflow-y: auto;
195
+ overflow-x: hidden;
196
+ scrollbar-width: none;
197
+ display: flex;
198
+ flex-direction: column;
199
+ align-items: center;
200
+ gap: 6px;
201
+ padding: 8px 0;
202
+ pointer-events: auto;
203
+ }
204
+ .mgcn-dots::-webkit-scrollbar {
205
+ width: 0;
206
+ height: 0;
207
+ display: none;
208
+ }
209
+
210
+ /* Paging triangles (▲ above the dot queue, ▼ below), styled like the dots:
211
+ a plain triangle in the dot's quiet border color that lights up brand on
212
+ hover. Clicking pages the band by DOT_PAGE_ROWS dots. The triangle is a
213
+ pure CSS border triangle so it stays crisp at any DPI; the button box is a
214
+ slightly larger transparent hit target. */
215
+ .mgcn-navBtn {
216
+ flex: none;
217
+ pointer-events: auto;
218
+ width: 14px;
219
+ height: 12px;
220
+ padding: 0;
221
+ border: none;
222
+ background: transparent;
223
+ cursor: pointer;
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ }
228
+ .mgcn-navBtn::before {
229
+ content: '';
230
+ display: block;
231
+ width: 0;
232
+ height: 0;
233
+ border-left: 5px solid transparent;
234
+ border-right: 5px solid transparent;
235
+ transition: border-color 120ms ease;
236
+ }
237
+ .mgcn-navUp::before {
238
+ border-bottom: 7px solid var(--dsw-alias-border-l3);
239
+ }
240
+ .mgcn-navDown::before {
241
+ border-top: 7px solid var(--dsw-alias-border-l3);
242
+ }
243
+ .mgcn-navUp:hover::before {
244
+ border-bottom-color: var(--dsw-alias-brand-primary);
245
+ }
246
+ .mgcn-navDown:hover::before {
247
+ border-top-color: var(--dsw-alias-brand-primary);
248
+ }
249
+
250
+ .mgcn-empty {
251
+ padding: 10px 4px;
252
+ font-size: 11px;
253
+ color: var(--dsw-alias-label-tertiary);
254
+ text-align: center;
255
+ word-break: break-word;
256
+ }
257
+
258
+ /* Transient jump-failure hint (portal-rendered near the rail top, so it never
259
+ pushes the centered dot band or clips in the 44px-wide rail). */
260
+ .mgcn-hint {
261
+ position: fixed;
262
+ z-index: 30;
263
+ max-width: 260px;
264
+ background: var(--dsw-alias-bg-layer-3);
265
+ border: 1px solid var(--dsw-alias-border-l1);
266
+ border-radius: 6px;
267
+ padding: 6px 10px;
268
+ font-size: 12px;
269
+ line-height: 16px;
270
+ color: var(--dsw-alias-label-secondary);
271
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.18);
272
+ pointer-events: none;
273
+ }
274
+ .mgcn-hint--bottom {
275
+ top: auto;
276
+ bottom: 150px; /* 对话输入框上方 */
277
+ display: flex;
278
+ align-items: center;
279
+ gap: 8px;
280
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.18);
281
+ }
282
+ /* 加载点动画 */
283
+ .mgcn-hint-dots {
284
+ display: inline-flex;
285
+ gap: 3px;
286
+ flex-shrink: 0;
287
+ }
288
+ .mgcn-hint-dots i {
289
+ width: 5px;
290
+ height: 5px;
291
+ border-radius: 50%;
292
+ background: var(--dsw-alias-brand-primary);
293
+ opacity: 0.35;
294
+ animation: mgcnHintDot 900ms ease-in-out infinite;
295
+ }
296
+ .mgcn-hint-dots i:nth-child(2) { animation-delay: 150ms; }
297
+ .mgcn-hint-dots i:nth-child(3) { animation-delay: 300ms; }
298
+ @keyframes mgcnHintDot {
299
+ 0%, 100% { opacity: 0.25; transform: translateY(0); }
300
+ 50% { opacity: 1; transform: translateY(-2px); }
301
+ }
302
+
303
+ /* The vertical focus cascade: one crisp question card per window dot, stacked
304
+ top-to-bottom without overlap, centered on the selected dot. The container
305
+ stays pass-through; only the cards are interactive. */
306
+ .mgcn-cascade {
307
+ position: fixed;
308
+ z-index: 20;
309
+ display: flex;
310
+ flex-direction: column;
311
+ align-items: flex-start;
312
+ gap: 6px;
313
+ pointer-events: none;
314
+ }
315
+
316
+ /* Right-aligned rail: the cascade opens to the LEFT of the rail, so the
317
+ column hugs the rail by stacking its cards against the right edge. */
318
+ .mgcn-cascadeRight {
319
+ align-items: flex-end;
320
+ }
321
+
322
+ /* One focus question card (portal-rendered in the cascade). The four context
323
+ cards use the base style: a clean solid surface, a quiet neutral border and
324
+ a low shadow — crisp and readable, one visual step behind the focus card.
325
+ The surface is the theme's TOP elevation layer (bg-layer-3, the same token
326
+ DSH menus and popups use): these cards float above the conversation, and in
327
+ dark themes the layer ramp gives them the raised-surface tint. Clicking
328
+ jumps to the question, like the dot; hover raises the border to signal the
329
+ card is interactive. */
330
+ .mgcn-card {
331
+ width: 380px;
332
+ background: var(--dsw-alias-bg-layer-3);
333
+ border: 1px solid var(--dsw-alias-border-l2);
334
+ border-radius: 10px;
335
+ padding: 8px 12px 10px;
336
+ font-size: 13px;
337
+ line-height: 18px;
338
+ color: var(--dsw-alias-label-secondary);
339
+ box-shadow: 0 1px 6px rgba(0, 0, 0, 0.10);
340
+ white-space: normal;
341
+ word-break: break-word;
342
+ pointer-events: auto;
343
+ cursor: pointer;
344
+ transition: border-color 120ms ease, box-shadow 120ms ease;
345
+ }
346
+ .mgcn-card:hover {
347
+ border-color: var(--dsw-alias-brand-primary);
348
+ box-shadow: 0 3px 12px rgba(0, 0, 0, 0.18);
349
+ color: var(--dsw-alias-label-primary);
350
+ }
351
+
352
+ /* The selected (center) card — the focus of the cascade: full-contrast text,
353
+ a brand left accent bar (inset, so it follows the rounded corners) and a
354
+ raised shadow lift it above the four context cards. */
355
+ .mgcn-cardSelected {
356
+ border-color: var(--dsw-alias-border-l1); /* 四边统一淡边框(原方案) */
357
+ color: var(--dsw-alias-label-primary);
358
+ box-shadow:
359
+ inset 3px 0 0 0 var(--dsw-alias-brand-primary),
360
+ 0 6px 20px rgba(0, 0, 0, 0.22);
361
+ }
362
+ .mgcn-cardSelected:hover {
363
+ border-color: var(--dsw-alias-brand-primary);
364
+ box-shadow:
365
+ inset 3px 0 0 0 var(--dsw-alias-brand-primary),
366
+ 0 6px 22px rgba(0, 0, 0, 0.26);
367
+ }
368
+
369
+ /* Right-aligned rail: the focus card's accent bar mirrors to the right edge
370
+ (the side facing the rail). Declared after .mgcn-cardSelected:hover so the
371
+ mirrored bar wins at equal specificity. */
372
+ .mgcn-cardSelectedRight {
373
+ border-color: var(--dsw-alias-border-l1); /* 镜像同:四边统一淡边框 */
374
+ box-shadow:
375
+ inset -3px 0 0 0 var(--dsw-alias-brand-primary),
376
+ 0 6px 20px rgba(0, 0, 0, 0.22);
377
+ }
378
+ .mgcn-cardSelectedRight:hover {
379
+ border-color: var(--dsw-alias-brand-primary);
380
+ box-shadow:
381
+ inset -3px 0 0 0 var(--dsw-alias-brand-primary),
382
+ 0 6px 22px rgba(0, 0, 0, 0.26);
383
+ }
384
+
385
+ /* Turn label line at the top of the card ("Turn 32"). */
386
+ .mgcn-cardHead {
387
+ display: flex;
388
+ align-items: center;
389
+ gap: 8px;
390
+ }
391
+ .mgcn-cardFav {
392
+ flex: none;
393
+ border: none;
394
+ background: transparent;
395
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
396
+ cursor: pointer;
397
+ padding: 0;
398
+ line-height: 1;
399
+ transition: color 120ms ease;
400
+ }
401
+ .mgcn-cardFav:hover { color: var(--dsw-alias-brand-primary); }
402
+ .mgcn-cardFavOn { color: var(--dsw-alias-brand-primary); }
403
+ .mgcn-cardMetrics {
404
+ font-size: 11px;
405
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
406
+ margin-bottom: 4px;
407
+ }
408
+ .mgcn-cardTitle {
409
+ font-size: 11px;
410
+ font-weight: 600;
411
+ color: var(--dsw-alias-label-tertiary);
412
+ margin: 0;
413
+ }
414
+
415
+ /* Question body; long multi-question turns scroll inside the card. The
416
+ scrollbar stays themed: NO `scrollbar-width` here — a non-auto value makes
417
+ Chromium/Safari drop the GUI's `::-webkit-scrollbar*` skin for this element
418
+ (see ui-theme styles/scrollbar.mgcn-css). Firefox still gets a thin themed bar
419
+ from the theme's `body *` rule, which reads the rebound tokens below. */
420
+ .mgcn-cardBody {
421
+ max-height: 96px;
422
+ overflow-y: auto;
423
+ /* Elevated surface (bg-layer-3): the scrollbar thumb takes the l2 elevation
424
+ tokens, matching DSH menus/popovers. */
425
+ --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);
426
+ --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);
427
+ /* 悬浮卡滚动条细一倍(8px → 4px):只覆盖 webkit 宽度,保留全局 thumb 皮肤;
428
+ 不可设 scrollbar-width(非 auto 会使 Chromium/Safari 丢弃 ::-webkit-scrollbar 皮肤) */
429
+ }
430
+ .mgcn-cardBody::-webkit-scrollbar {
431
+ width: 4px;
432
+ height: 4px;
433
+ }
434
+ .mgcn-cardBody::-webkit-scrollbar-thumb {
435
+ border-radius: 2px;
436
+ }
437
+
438
+ /* Clamped cascade-card text (the two neighbors on each side): N lines with
439
+ ellipsis via -webkit-line-clamp (set inline). Inherits the card's text
440
+ color (secondary on context cards, primary on the focus card). */
441
+ .mgcn-cardClamp {
442
+ font-size: 13px;
443
+ line-height: 18px;
444
+ display: -webkit-box;
445
+ -webkit-box-orient: vertical;
446
+ overflow: hidden;
447
+ word-break: break-word;
448
+ }
449
+
450
+ /* Question sent-time line (HH:MM / MM-DD HH:MM / YYYY-MM-DD HH:MM). */
451
+ .mgcn-cardTime {
452
+ margin: 0;
453
+ font-size: 11px;
454
+ color: var(--dsw-alias-label-tertiary);
455
+ }
456
+
457
+ /* Settings page (settings.mgcn-plugins.mgcn-tab). */
458
+ .mgcn-settings {
459
+ display: flex;
460
+ flex-direction: column;
461
+ gap: 10px;
462
+ padding: 4px 0;
463
+ }
464
+ /* 配置项行:左右结构——左(名称+说明,左对齐)右(控件,垂直居中、右对齐) */
465
+ .mgcn-settingsRow {
466
+ display: flex;
467
+ align-items: center;
468
+ justify-content: space-between;
469
+ gap: 16px;
470
+ width: 100%;
471
+ }
472
+ .mgcn-settingsLabel {
473
+ flex: 1 1 auto;
474
+ min-width: 0;
475
+ display: flex;
476
+ flex-direction: column;
477
+ align-items: flex-start; /* 左侧文本左对齐 */
478
+ gap: 2px;
479
+ text-align: left;
480
+ }
481
+ .mgcn-settingsTitle {
482
+ font-size: 13px;
483
+ font-weight: 600;
484
+ color: var(--dsw-alias-label-primary);
485
+ margin: 0;
486
+ }
487
+ .mgcn-settingsDesc {
488
+ font-size: 12px;
489
+ line-height: 18px;
490
+ color: var(--dsw-alias-label-secondary);
491
+ margin: 0;
492
+ }
493
+ /* 右侧控件区:垂直居中、贴右 */
494
+ .mgcn-settingsControl {
495
+ flex: none;
496
+ display: flex;
497
+ align-items: center;
498
+ justify-content: flex-end;
499
+ }
500
+ .mgcn-settingsControl .mgcn-segmented {
501
+ align-self: center; /* 覆盖全局 flex-start,保证垂直居中 */
502
+ }
503
+ .mgcn-segmented {
504
+ display: inline-flex;
505
+ border: 1px solid var(--dsw-alias-border-l1);
506
+ border-radius: 8px;
507
+ overflow: hidden;
508
+ align-self: flex-start;
509
+ }
510
+ .mgcn-segment {
511
+ border: none;
512
+ background: transparent;
513
+ color: var(--dsw-alias-label-secondary);
514
+ font-size: 13px;
515
+ line-height: 1;
516
+ padding: 8px 16px;
517
+ cursor: pointer;
518
+ transition: background 120ms ease, color 120ms ease;
519
+ }
520
+ .mgcn-segment + .mgcn-segment {
521
+ border-left: 1px solid var(--dsw-alias-border-l1);
522
+ }
523
+ .mgcn-segment:hover {
524
+ background: var(--dsw-alias-bg-layer-1);
525
+ color: var(--dsw-alias-label-primary);
526
+ }
527
+ .mgcn-segmentActive,
528
+ .mgcn-segmentActive:hover {
529
+ background: var(--dsw-alias-brand-primary);
530
+ color: var(--dsw-alias-label-primary-inverted);
531
+ }
532
+
533
+ /* ---- ⚙ 组件内面板(高频配置) ---- */
534
+ .mgcn-config-gear {
535
+ pointer-events: auto;
536
+ border: none;
537
+ background: transparent;
538
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
539
+ cursor: pointer;
540
+ font-size: 12px;
541
+ line-height: 1;
542
+ padding: 2px 4px;
543
+ border-radius: 6px;
544
+ transition: color 120ms ease, background 120ms ease;
545
+ }
546
+ .mgcn-config-gear:hover {
547
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
548
+ background: var(--mgcn-hover-bg, var(--dsw-alias-interactive-bg-hover));
549
+ }
550
+ .mgcn-gear-wrap {
551
+ position: relative;
552
+ display: inline-flex;
553
+ }
554
+ /* 面板打开方向随停靠侧:右对齐向左弹,左对齐向右弹 */
555
+ .mgcn-gear-wrap--right .mgcn-config-panel {
556
+ right: calc(100% + 8px);
557
+ left: auto;
558
+ }
559
+ .mgcn-gear-wrap--left .mgcn-config-panel {
560
+ left: calc(100% + 8px);
561
+ right: auto;
562
+ }
563
+ .mgcn-config-panel {
564
+ position: absolute;
565
+ top: 0; /* 顶边与齿轮按钮对齐 */
566
+ z-index: 62;
567
+ width: max-content; /* 自适应宽度 */
568
+ min-width: 200px;
569
+ max-width: 320px;
570
+ white-space: nowrap;
571
+ display: flex;
572
+ flex-direction: column;
573
+ gap: 8px;
574
+ padding: 12px;
575
+ border-radius: 12px;
576
+ border: 1px solid var(--mgcn-border, var(--dsw-alias-border-l2));
577
+ background: var(--mgcn-bg-raised, var(--dsw-alias-bg-layer-3));
578
+ box-shadow: var(--mgcn-shadow, var(--dsw-shadow-lv2));
579
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
580
+ font-size: 12px;
581
+ pointer-events: auto;
582
+ }
583
+ .mgcn-config-head {
584
+ display: flex;
585
+ align-items: center;
586
+ justify-content: space-between;
587
+ }
588
+ .mgcn-config-title {
589
+ font-weight: 600;
590
+ }
591
+ .mgcn-config-close {
592
+ border: none;
593
+ background: transparent;
594
+ color: var(--mgcn-fg-secondary, var(--dsw-alias-label-secondary));
595
+ cursor: pointer;
596
+ padding: 2px 4px;
597
+ border-radius: 6px;
598
+ font-size: 12px;
599
+ }
600
+ .mgcn-config-close:hover {
601
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
602
+ background: var(--mgcn-hover-bg, var(--dsw-alias-interactive-bg-hover));
603
+ }
604
+ .mgcn-config-row {
605
+ display: flex;
606
+ align-items: center;
607
+ justify-content: space-between;
608
+ gap: 8px;
609
+ }
610
+ .mgcn-config-label {
611
+ color: var(--mgcn-fg-secondary, var(--dsw-alias-label-secondary));
612
+ flex-shrink: 0;
613
+ }
614
+ /* ---- 快捷设置面板:mini 设计(紧凑尺寸) ---- */
615
+ .mgcn-config-panel {
616
+ min-width: 180px;
617
+ max-width: 280px;
618
+ gap: 6px;
619
+ padding: 8px;
620
+ border-radius: 10px;
621
+ font-size: 11px;
622
+ }
623
+ .mgcn-config-panel .mgcn-config-title {
624
+ font-size: 11px;
625
+ }
626
+ .mgcn-config-panel .mgcn-config-close {
627
+ font-size: 10px;
628
+ padding: 1px 3px;
629
+ border-radius: 4px;
630
+ }
631
+ .mgcn-config-panel .mgcn-config-row {
632
+ gap: 6px;
633
+ }
634
+ .mgcn-config-panel .mgcn-config-label {
635
+ font-size: 11px;
636
+ }
637
+ .mgcn-config-panel .mgcn-segmented {
638
+ border-radius: 6px;
639
+ }
640
+ .mgcn-config-panel .mgcn-segment {
641
+ font-size: 11px;
642
+ line-height: 1;
643
+ padding: 4px 8px;
644
+ }
645
+ .mgcn-config-panel .mgcn-config-sep {
646
+ margin: 1px 0;
647
+ }
648
+
649
+ /* ---- 浮现态(JS 状态驱动:进入 rail 立即显示、移出后延迟 1s 隐藏) ----
650
+ 过渡设计:浮现时立即可见再淡入(基类 visibility 0s 即时切换);
651
+ 隐藏时先淡出、160ms 后才 visibility:hidden(.mgcn-peek 侧延迟切换)。
652
+ 元素仍占布局位(absolute/inline-flex),隐藏期间不可交互(visibility) */
653
+ .mgcn-gear-wrap,
654
+ .mgcn-count,
655
+ .mgcn-pageUp,
656
+ .mgcn-pageDown {
657
+ transition: opacity 160ms ease, visibility 0s;
658
+ }
659
+ .mgcn-peek {
660
+ opacity: 0;
661
+ visibility: hidden;
662
+ pointer-events: none;
663
+ transition: opacity 160ms ease, visibility 0s linear 160ms;
664
+ }
665
+ @media (prefers-reduced-motion: reduce) {
666
+ .mgcn-gear-wrap,
667
+ .mgcn-count,
668
+ .mgcn-pageUp,
669
+ .mgcn-pageDown {
670
+ transition: none;
671
+ }
672
+ }
673
+
674
+ /* ---- 搜索浮层 ---- */
675
+ .mgcn-search {
676
+ position: absolute;
677
+ top: -18px; /* 面板与触发按钮垂直居中对齐 */
678
+ z-index: 62;
679
+ width: 300px;
680
+ box-sizing: border-box; /* padding 计入宽度 */
681
+
682
+ display: flex;
683
+ flex-direction: column;
684
+ gap: 6px;
685
+ padding: 10px;
686
+ border-radius: 12px;
687
+ border: 1px solid var(--mgcn-border, var(--dsw-alias-border-l2));
688
+ background: var(--mgcn-bg-raised, var(--dsw-alias-bg-layer-3));
689
+ box-shadow: var(--mgcn-shadow, var(--dsw-shadow-lv2));
690
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
691
+ font-size: 12px;
692
+ pointer-events: auto;
693
+ white-space: nowrap;
694
+ }
695
+ .mgcn-gear-wrap--right .mgcn-search {
696
+ right: calc(100% + 8px);
697
+ left: auto;
698
+ }
699
+ .mgcn-gear-wrap--left .mgcn-search {
700
+ left: calc(100% + 8px);
701
+ right: auto;
702
+ }
703
+ .mgcn-search-input {
704
+ width: 100%;
705
+ box-sizing: border-box; /* 100% + padding/border 不再溢出面板 */
706
+ padding: 6px 8px;
707
+ border-radius: 8px;
708
+ border: 1px solid var(--mgcn-border, var(--dsw-alias-border-l2));
709
+ background: var(--mgcn-bg, var(--dsw-alias-bg-layer-2));
710
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
711
+ font-size: 12px;
712
+ outline: none;
713
+ }
714
+ .mgcn-search-input:focus {
715
+ border-color: var(--mgcn-highlight, var(--dsw-alias-brand-primary));
716
+ }
717
+ .mgcn-search-busy {
718
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
719
+ font-size: 11px;
720
+ }
721
+ .mgcn-search-results {
722
+ display: flex;
723
+ flex-direction: column;
724
+ gap: 2px;
725
+ max-height: 280px;
726
+ overflow-y: auto;
727
+ }
728
+ .mgcn-search-hit {
729
+ display: flex;
730
+ flex-direction: column;
731
+ gap: 3px;
732
+ width: 100%;
733
+ padding: 6px 8px;
734
+ border: none;
735
+ border-radius: 8px;
736
+ background: transparent;
737
+ color: var(--mgcn-fg-secondary, var(--dsw-alias-label-secondary));
738
+ text-align: left;
739
+ font-size: 12px;
740
+ cursor: pointer;
741
+ }
742
+ .mgcn-search-hit:hover {
743
+ background: var(--mgcn-hover-bg, var(--dsw-alias-interactive-bg-hover));
744
+ }
745
+ /* 标题行:轮次 + 时间 */
746
+ .mgcn-search-title {
747
+ display: flex;
748
+ align-items: center;
749
+ justify-content: space-between;
750
+ gap: 8px;
751
+ font-size: 11px;
752
+ font-weight: 600;
753
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
754
+ }
755
+ .mgcn-search-titleLeft {
756
+ display: flex;
757
+ align-items: center;
758
+ gap: 6px;
759
+ min-width: 0;
760
+ }
761
+ .mgcn-search-turn {
762
+ flex-shrink: 0;
763
+ }
764
+ .mgcn-search-titleTime {
765
+ font-weight: 400;
766
+ }
767
+ /* 正文行:角色 tag + 两行预览 */
768
+ .mgcn-search-body {
769
+ display: flex;
770
+ align-items: flex-start;
771
+ gap: 6px;
772
+ min-width: 0;
773
+ }
774
+ .mgcn-search-tag {
775
+ flex-shrink: 0;
776
+ margin-top: 1px;
777
+ padding: 0 5px;
778
+ border-radius: 4px;
779
+ font-size: 10px;
780
+ line-height: 16px;
781
+ font-weight: 600;
782
+ background: var(--mgcn-hover-bg, var(--dsw-alias-interactive-bg-hover));
783
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
784
+ }
785
+ .mgcn-search-tag--user { background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 22%, transparent); color: var(--dsw-alias-state-business-primary); }
786
+ .mgcn-search-tag--assistant { background: color-mix(in srgb, var(--dsw-alias-brand-primary) 18%, transparent); color: var(--dsw-alias-brand-primary); }
787
+ .mgcn-search-tag--tool { background: color-mix(in srgb, var(--dsw-alias-state-warning) 20%, transparent); color: var(--dsw-alias-state-warning); }
788
+ .mgcn-search-text {
789
+ flex: 1;
790
+ min-width: 0;
791
+ display: -webkit-box;
792
+ -webkit-line-clamp: 2;
793
+ -webkit-box-orient: vertical;
794
+ overflow: hidden;
795
+ white-space: normal;
796
+ line-height: 17px;
797
+ }
798
+ .mgcn-search-mark {
799
+ background: color-mix(in srgb, var(--mgcn-highlight, var(--dsw-alias-brand-primary)) 30%, transparent);
800
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
801
+ border-radius: 2px;
802
+ padding: 0 1px;
803
+ }
804
+ /* 更早历史命中提示 */
805
+ .mgcn-search-historic {
806
+ padding: 4px 4px 0;
807
+ font-size: 11px;
808
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
809
+ }
810
+ /* 按钮图标(currentColor 随主题) */
811
+ .mgcn-btn-icon {
812
+ display: block;
813
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
814
+ }
815
+ .mgcn-config-gear:hover .mgcn-btn-icon {
816
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
817
+ }
818
+ /* 配置面板分隔 */
819
+ .mgcn-config-sep {
820
+ height: 1px;
821
+ background: var(--mgcn-border, var(--dsw-alias-border-l2));
822
+ margin: 2px 0;
823
+ }
824
+ /* 多选组(悬浮卡功能) */
825
+ .mgcn-checkGroup {
826
+ display: flex;
827
+ gap: 10px;
828
+ }
829
+ .mgcn-checkItem {
830
+ display: inline-flex;
831
+ align-items: center;
832
+ gap: 4px;
833
+ font-size: 12px;
834
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
835
+ cursor: pointer;
836
+ user-select: none;
837
+ }
838
+ .mgcn-checkItem input {
839
+ accent-color: var(--dsw-alias-brand-primary);
840
+ }
841
+ .mgcn-favFilterOn {
842
+ color: var(--dsw-alias-brand-primary) !important;
843
+ }
844
+ /* 滑块行(导航栏偏移) */
845
+ .mgcn-sliderRow {
846
+ display: flex;
847
+ align-items: center;
848
+ gap: 8px;
849
+ }
850
+ .mgcn-sliderRow input[type="range"] {
851
+ width: 120px;
852
+ accent-color: var(--dsw-alias-brand-primary);
853
+ }
854
+ .mgcn-sliderValue {
855
+ font-size: 11px;
856
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
857
+ min-width: 28px;
858
+ }
859
+ /* ---- 手机模式:底部半宽搜索抽屉 ---- */
860
+ .mgcn-drawerMask {
861
+ position: fixed;
862
+ inset: 0;
863
+ background: rgba(0, 0, 0, 0.35);
864
+ z-index: 90;
865
+ }
866
+ .mgcn-searchDrawer {
867
+ position: fixed;
868
+ left: 0;
869
+ bottom: 0;
870
+ width: 100%;
871
+ height: 70vh;
872
+ background: var(--mgcn-bg-raised, var(--dsw-alias-bg-layer-3));
873
+ border-radius: 14px 14px 0 0;
874
+ box-shadow: 0 -6px 24px rgba(0, 0, 0, 0.18);
875
+ padding: 12px;
876
+ box-sizing: border-box;
877
+ display: flex;
878
+ flex-direction: column;
879
+ z-index: 91;
880
+ animation: mgcnDrawerUp 240ms ease-out;
881
+ }
882
+ /* 全部轮次列表(不搜索时显示) */
883
+ .mgcn-drawerList {
884
+ flex: 1 1 auto;
885
+ min-height: 0;
886
+ overflow-y: auto;
887
+ display: flex;
888
+ flex-direction: column;
889
+ gap: 2px;
890
+ margin-top: 8px;
891
+ }
892
+ /* 抽屉 item:结构与样式对齐桌面搜索面板 item(.mgcn-search-hit) */
893
+ .mgcn-drawerItem {
894
+ display: flex;
895
+ flex-direction: column;
896
+ gap: 3px;
897
+ width: 100%;
898
+ padding: 6px 8px;
899
+ border: none;
900
+ border-radius: 8px;
901
+ background: transparent;
902
+ color: var(--mgcn-fg-secondary, var(--dsw-alias-label-secondary));
903
+ text-align: left;
904
+ font-size: 12px;
905
+ cursor: pointer;
906
+ }
907
+ .mgcn-drawerItem:hover {
908
+ background: var(--mgcn-hover-bg, var(--dsw-alias-interactive-bg-hover));
909
+ }
910
+ .mgcn-drawerItemTitle {
911
+ display: flex;
912
+ align-items: center;
913
+ justify-content: space-between;
914
+ gap: 8px;
915
+ font-size: 11px;
916
+ font-weight: 600;
917
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
918
+ }
919
+ .mgcn-drawerItemTurn {
920
+ flex-shrink: 0;
921
+ }
922
+ .mgcn-drawerItemTime {
923
+ font-weight: 400;
924
+ }
925
+ .mgcn-drawerItemText {
926
+ min-width: 0;
927
+ display: -webkit-box;
928
+ -webkit-line-clamp: 2;
929
+ -webkit-box-orient: vertical;
930
+ overflow: hidden;
931
+ white-space: normal;
932
+ line-height: 17px;
933
+ }
934
+ @keyframes mgcnDrawerUp {
935
+ from { transform: translateY(100%); }
936
+ to { transform: translateY(0); }
937
+ }
938
+ .mgcn-searchDrawer .mgcn-search {
939
+ position: static;
940
+ width: 100%;
941
+ padding: 0;
942
+ border: none;
943
+ background: transparent;
944
+ box-shadow: none;
945
+ flex: 1 1 auto; /* 撑满抽屉,形成受限高度链 */
946
+ min-height: 0;
947
+ display: flex;
948
+ flex-direction: column;
949
+ }
950
+ .mgcn-searchDrawer .mgcn-search-results {
951
+ flex: 1 1 auto;
952
+ min-height: 0;
953
+ overflow-y: auto;
954
+ margin-top: 4px;
955
+ }
956
+ /* ---- 手机模式:搜索按钮(注入滚动容器,inline sticky 定位;无 padding、带边框) ---- */
957
+ .mgcn-mobileSearch {
958
+ padding: 3px;
959
+ border: 1px solid var(--mgcn-border, var(--dsw-alias-border-l2));
960
+ border-radius: 6px;
961
+ background: var(--mgcn-bg, var(--dsw-alias-bg-layer-2));
962
+ z-index: 60;
963
+ pointer-events: auto;
964
+ }
965
+
966
+ /* ==================== codex 风格:刻度轨(时间线式) ====================
967
+ 轨道语言:每轮一个短横刻度(mark),锚定在轨道外侧(远离对话的一侧)
968
+ 并朝对话方向展开;刻度静止短灰、hover 波纹本尊展开为长亮条、
969
+ 向两侧逐级收短(±1/±2/±3);阅读位置常亮、跳转目标品牌脉冲。
970
+ 刻度色调 data-tone:soft=柔和(低对比)/ deep=深邃(高对比,默认)。
971
+ 命名/变量全为 mgcn 体系内化。 */
972
+ .mgcn-cxRail {
973
+ width: 46px; /* 略宽于圆点轨:容纳刻度波纹展开 */
974
+ }
975
+ .mgcn-cxList {
976
+ flex: 1 1 auto;
977
+ min-height: 0;
978
+ width: 100%;
979
+ overflow-y: auto;
980
+ overflow-x: hidden;
981
+ scrollbar-width: none;
982
+ position: relative;
983
+ padding: 8px 0;
984
+ pointer-events: auto;
985
+ }
986
+ .mgcn-cxList::-webkit-scrollbar { width: 0; height: 0; display: none; }
987
+
988
+ /* ---- 操作区与翻页提示对齐刻度列(刻度常态在 rail 外侧缘,锚点距边 7px + 半条 ≈ 13px;
989
+ 操作按钮若居中于 rail 中轴会与短横刻度脱节、显得突兀——整体平移到刻度列中心。
990
+ 左 rail:rail 中心 23px → 目标 13px(左移 10px);右 rail 镜像 → 33px(右移 10px) ---- */
991
+ .mgcn-cxRail .mgcn-actions,
992
+ .mgcn-cxRail .mgcn-pageUp,
993
+ .mgcn-cxRail .mgcn-pageDown {
994
+ margin-left: -10px;
995
+ }
996
+ .mgcn-cxRail.mgcn-railRight .mgcn-actions,
997
+ .mgcn-cxRail.mgcn-railRight .mgcn-pageUp,
998
+ .mgcn-cxRail.mgcn-railRight .mgcn-pageDown {
999
+ margin-left: 10px;
1000
+ }
1001
+ .mgcn-cxRail .mgcn-config-gear {
1002
+ display: flex;
1003
+ align-items: center;
1004
+ justify-content: center;
1005
+ width: 18px;
1006
+ height: 18px;
1007
+ padding: 0;
1008
+ }
1009
+
1010
+
1011
+ /* 刻度槽:整行可点(14px 行高,与圆点轨行距一致——翻页/跟读共用几何) */
1012
+ .mgcn-cxSlot {
1013
+ display: block;
1014
+ position: relative;
1015
+ width: 100%;
1016
+ height: 14px;
1017
+ padding: 0;
1018
+ border: none;
1019
+ background: transparent;
1020
+ cursor: pointer;
1021
+ pointer-events: auto;
1022
+ border-radius: 3px;
1023
+ }
1024
+ .mgcn-cxSlot:focus-visible {
1025
+ outline: 2px solid var(--dsw-alias-brand-primary);
1026
+ outline-offset: -2px;
1027
+ }
1028
+
1029
+ /* 刻度几何(公共层,与色调无关):静止 12px / 阅读位 18px / hover 波纹 38px */
1030
+ .mgcn-cxRail {
1031
+ --mgcn-cx-width-idle: 12px;
1032
+ --mgcn-cx-width-current: 18px;
1033
+ --mgcn-cx-width-hover: 38px;
1034
+ }
1035
+ /* 色调变量:仅颜色与不透明度按 data-tone 切换(deep 高对比,为默认) */
1036
+ .mgcn-cxRail[data-tone='soft'] {
1037
+ --mgcn-cx-mark-bg: var(--dsw-alias-label-tertiary);
1038
+ --mgcn-cx-mark-idle-op: 0.4;
1039
+ --mgcn-cx-current-bg: var(--dsw-alias-label-primary);
1040
+ --mgcn-cx-current-op: 0.7;
1041
+ --mgcn-cx-ripple-bg: var(--dsw-alias-label-secondary);
1042
+ --mgcn-cx-ripple-op: 0.75;
1043
+ }
1044
+ .mgcn-cxRail[data-tone='deep'] {
1045
+ --mgcn-cx-mark-bg: var(--dsw-alias-label-secondary);
1046
+ --mgcn-cx-mark-idle-op: 0.62;
1047
+ --mgcn-cx-current-bg: var(--dsw-alias-brand-primary);
1048
+ --mgcn-cx-current-op: 0.92;
1049
+ --mgcn-cx-ripple-bg: var(--dsw-alias-label-primary);
1050
+ --mgcn-cx-ripple-op: 0.88;
1051
+ }
1052
+ /* 兼容缺省(未设置 data-tone):走深邃档 */
1053
+ .mgcn-cxRail:not([data-tone='soft']) {
1054
+ --mgcn-cx-mark-bg: var(--dsw-alias-label-secondary);
1055
+ --mgcn-cx-mark-idle-op: 0.62;
1056
+ --mgcn-cx-current-bg: var(--dsw-alias-brand-primary);
1057
+ --mgcn-cx-current-op: 0.92;
1058
+ --mgcn-cx-ripple-bg: var(--dsw-alias-label-primary);
1059
+ --mgcn-cx-ripple-op: 0.88;
1060
+ }
1061
+
1062
+ /* 刻度条:锚定在外侧缘(rail 在对话左→锚左缘;右→锚右缘),朝对话方向展开 */
1063
+ .mgcn-cxMark {
1064
+ position: absolute;
1065
+ top: 50%;
1066
+ width: var(--mgcn-cx-mark-w, var(--mgcn-cx-width-idle, 12px));
1067
+ height: 3px;
1068
+ margin-top: -1.5px;
1069
+ border-radius: 2px;
1070
+ background: var(--mgcn-cx-mark-bg, var(--dsw-alias-label-secondary));
1071
+ opacity: var(--mgcn-cx-mark-o, var(--mgcn-cx-mark-idle-op, 0.62));
1072
+ transition: width 160ms cubic-bezier(0.22, 0.75, 0.18, 1), opacity 90ms ease-out, background 120ms ease-out;
1073
+ }
1074
+ .mgcn-rail:not(.mgcn-railRight) .mgcn-cxMark {
1075
+ left: 7px; /* rail 在对话左侧:刻度从左侧缘向右展开(朝对话) */
1076
+ transform-origin: left center;
1077
+ }
1078
+ .mgcn-railRight .mgcn-cxMark {
1079
+ right: 7px; /* rail 在对话右侧:刻度从右侧缘向左展开(朝对话) */
1080
+ transform-origin: right center;
1081
+ }
1082
+ /* 波纹邻居:较本尊淡一档(hover 级联为纯 CSS,JS 不再逐槽驱动) */
1083
+ .mgcn-cxSlot .mgcn-cxMark {
1084
+ background: var(--mgcn-cx-mark-bg, var(--dsw-alias-label-secondary));
1085
+ }
1086
+ /* 阅读位置(current):常亮品牌色、略长 */
1087
+ .mgcn-cxSlot.mgcn-cxCurrent .mgcn-cxMark {
1088
+ width: var(--mgcn-cx-width-current, 18px);
1089
+ background: var(--mgcn-cx-current-bg, var(--dsw-alias-brand-primary));
1090
+ opacity: var(--mgcn-cx-current-op, 0.92);
1091
+ }
1092
+ /* hover/focus 波纹:本尊 38px 品牌实色;邻居逐级收短 30/21/15px——
1093
+ 纯 CSS 级联(:has 现代浏览器),hover 零 React 状态更新 */
1094
+ .mgcn-cxSlot:hover .mgcn-cxMark,
1095
+ .mgcn-cxSlot:focus-visible .mgcn-cxMark {
1096
+ width: 38px;
1097
+ background: var(--dsw-alias-brand-primary);
1098
+ opacity: 1;
1099
+ }
1100
+ .mgcn-cxSlot:has(+ .mgcn-cxSlot:hover) .mgcn-cxMark,
1101
+ .mgcn-cxSlot:hover + .mgcn-cxSlot .mgcn-cxMark {
1102
+ width: 30px;
1103
+ }
1104
+ .mgcn-cxSlot:has(+ .mgcn-cxSlot + .mgcn-cxSlot:hover) .mgcn-cxMark,
1105
+ .mgcn-cxSlot:hover + .mgcn-cxSlot + .mgcn-cxSlot .mgcn-cxMark {
1106
+ width: 21px;
1107
+ }
1108
+ .mgcn-cxSlot:has(+ .mgcn-cxSlot + .mgcn-cxSlot + .mgcn-cxSlot:hover) .mgcn-cxMark,
1109
+ .mgcn-cxSlot:hover + .mgcn-cxSlot + .mgcn-cxSlot + .mgcn-cxSlot .mgcn-cxMark {
1110
+ width: 15px;
1111
+ }
1112
+ /* 悬浮卡聚焦中的目标槽(JS focus 保活):不随鼠标离开收回 */
1113
+ .mgcn-cxSlot.mgcn-cxFocused .mgcn-cxMark {
1114
+ width: 38px;
1115
+ background: var(--dsw-alias-brand-primary);
1116
+ opacity: 1;
1117
+ }
1118
+ /* 跳转目标:品牌色脉冲闪光(600ms 后还原为阅读高亮) */
1119
+ .mgcn-cxSlot.mgcn-cxJump .mgcn-cxMark {
1120
+ background: var(--dsw-alias-brand-primary);
1121
+ opacity: 1;
1122
+ animation: mgcn-cxPulse 600ms ease-in-out;
1123
+ }
1124
+ @keyframes mgcn-cxPulse {
1125
+ 0%, 100% { opacity: 1; }
1126
+ 50% { opacity: 0.45; }
1127
+ }
1128
+
1129
+ /* 翻页入场的错峰滑入(与圆点轨同节奏,key 内联 delay 由列表组件给) */
1130
+ @keyframes mgcn-cxEnterFromBottom {
1131
+ from {
1132
+ opacity: 0;
1133
+ transform: translateY(7px);
1134
+ }
1135
+ 60% { opacity: 1; }
1136
+ to {
1137
+ opacity: 1;
1138
+ transform: translateY(0);
1139
+ }
1140
+ }
1141
+ @keyframes mgcn-cxEnterFromTop {
1142
+ from {
1143
+ opacity: 0;
1144
+ transform: translateY(-7px);
1145
+ }
1146
+ 60% { opacity: 1; }
1147
+ to {
1148
+ opacity: 1;
1149
+ transform: translateY(0);
1150
+ }
1151
+ }
1152
+ .mgcn-cxEnterFromBottom { animation: mgcn-cxEnterFromBottom 320ms cubic-bezier(0.2, 0.9, 0.3, 1.2) both; }
1153
+ .mgcn-cxEnterFromTop { animation: mgcn-cxEnterFromTop 320ms cubic-bezier(0.2, 0.9, 0.3, 1.2) both; }
1154
+ @media (prefers-reduced-motion: reduce) {
1155
+ .mgcn-cxEnterFromBottom,
1156
+ .mgcn-cxEnterFromTop {
1157
+ animation: none;
1158
+ }
1159
+ }
1160
+
1161
+ /* ==================== deepseek 风格:用户消息面板(JS 驱动展开) ====================
1162
+ 形态:常态 30px 窄轨(每轮行首 8×2 短横把手);mouseenter/leave 由 JS 切换
1163
+ .mgcn-dsOpen → rail 加宽到 280px 并浮现面板外观(不再用 CSS :hover)。
1164
+ 面板高度 = band 高度(queue 60% 居中 / band 档),不铺满 rail 全高。
1165
+ 面板头操作区独立一行;行 hover(JS)横线变收藏按钮。
1166
+ 交互守则:搜索就地态/设置浮层开启时,移出**不收起**——只有点击外部才关闭;
1167
+ ⚙ 点击 → rail 收起窄轨(.mgcn-dsSnap 无过渡)并弹通用设置浮层(band 角锚点)。 */
1168
+ .mgcn-dsRail {
1169
+ width: 30px; /* 常态:窄把手轨 */
1170
+ background: transparent;
1171
+ border: 1px solid transparent;
1172
+ border-radius: 12px;
1173
+ box-shadow: none;
1174
+ /* 收拢方向延迟 140ms:先等面板头淡出完毕再收窄,窄轨布局变化不可见 */
1175
+ transition: width 200ms cubic-bezier(0.22, 0.75, 0.18, 1) 140ms;
1176
+ }
1177
+ /* 展开方向不延迟:宽度先到位,面板头在其后(200ms 处)淡入 */
1178
+ .mgcn-dsRail.mgcn-dsOpen {
1179
+ transition: width 200ms cubic-bezier(0.22, 0.75, 0.18, 1);
1180
+ }
1181
+ /* JS 展开态:宽度 280 + 层级抬升(背景画在 band 面板,避免整高背景) */
1182
+ .mgcn-dsRail.mgcn-dsOpen {
1183
+ width: 280px;
1184
+ z-index: 20;
1185
+ /* (transition 见上方展开规则:不延迟宽度动画) */
1186
+ }
1187
+ /* band 布局:queue 60% 居中、list band 高 */
1188
+ .mgcn-dsRail .mgcn-queue {
1189
+ max-height: 60%;
1190
+ margin: auto 0;
1191
+ width: 100%;
1192
+ }
1193
+ .mgcn-dsRail .mgcn-list {
1194
+ max-height: min(var(--mgcn-band-height, 220px), 60vh);
1195
+ width: 100%;
1196
+ }
1197
+
1198
+ /* ---- 面板容器:head(操作区行)+ body 纵向排列 ---- */
1199
+ .mgcn-dsPanel {
1200
+ flex: 1 1 auto;
1201
+ min-height: 0;
1202
+ width: 100%;
1203
+ display: flex;
1204
+ flex-direction: column;
1205
+ align-items: stretch;
1206
+ pointer-events: auto;
1207
+ background: transparent !important; /* 折叠底子:防主题覆盖 */
1208
+ border: 1px solid transparent !important;
1209
+ border-radius: 12px;
1210
+ box-shadow: none !important;
1211
+ transition: background 160ms ease-out, border-color 160ms ease-out, box-shadow 160ms ease-out;
1212
+ }
1213
+ .mgcn-dsOpen .mgcn-dsPanel {
1214
+ background: var(--mgcn-bg-raised, var(--dsw-alias-bg-layer-3)) !important;
1215
+ border-color: var(--mgcn-border, var(--dsw-alias-border-l2)) !important;
1216
+ box-shadow: var(--mgcn-shadow, var(--dsw-shadow-lv2)) !important;
1217
+ }
1218
+
1219
+ /* ---- 面板头:操作区独立一行(搜索 → 设置 → 收藏 → 计数) ---- */
1220
+ .mgcn-dsHead {
1221
+ flex: none;
1222
+ display: flex;
1223
+ align-items: center;
1224
+ gap: 2px;
1225
+ padding: 6px 8px;
1226
+ border-bottom: 1px solid var(--mgcn-border, var(--dsw-alias-border-l2));
1227
+ opacity: 0;
1228
+ visibility: hidden;
1229
+ transition: opacity 140ms ease-out, visibility 0s linear 140ms;
1230
+ }
1231
+ .mgcn-dsOpen .mgcn-dsHead {
1232
+ opacity: 1;
1233
+ visibility: visible;
1234
+ /* 等 rail 宽度动画(200ms)完成后再淡入:窄轨展开初期 flex 无自由空间,
1235
+ 计数/操作钮被压向左侧;若立即显现会随宽度增长从左飞向右 */
1236
+ transition: opacity 140ms ease-out 200ms, visibility 0s 200ms;
1237
+ }
1238
+ .mgcn-dsHead .mgcn-config-gear {
1239
+ display: flex;
1240
+ align-items: center;
1241
+ justify-content: center;
1242
+ width: 20px;
1243
+ height: 20px;
1244
+ padding: 0;
1245
+ border-radius: 6px;
1246
+ }
1247
+ .mgcn-dsHead .mgcn-count {
1248
+ margin-left: auto;
1249
+ font-size: 12px;
1250
+ }
1251
+ .mgcn-dsHead .mgcn-dsModeOn {
1252
+ color: var(--dsw-alias-brand-primary);
1253
+ }
1254
+ .mgcn-dsHead .mgcn-dsModeOn .mgcn-btn-icon {
1255
+ color: var(--dsw-alias-brand-primary);
1256
+ }
1257
+ /* 搜索态:头部输入框占满操作区剩余空间 */
1258
+ .mgcn-dsSearchInput {
1259
+ flex: 1 1 auto;
1260
+ min-width: 0;
1261
+ box-sizing: border-box;
1262
+ height: 22px;
1263
+ padding: 0 8px;
1264
+ border-radius: 6px;
1265
+ border: 1px solid var(--mgcn-border, var(--dsw-alias-border-l2));
1266
+ background: var(--mgcn-bg, var(--dsw-alias-bg-layer-2));
1267
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
1268
+ font-size: 12px;
1269
+ outline: none;
1270
+ }
1271
+ .mgcn-dsSearchInput:focus {
1272
+ border-color: var(--dsw-alias-brand-primary);
1273
+ }
1274
+
1275
+ /* ---- 就地搜索模式容器:纵向 flex 约束(min-height:0 + overflow:hidden),
1276
+ 列表超长只在内层 .mgcn-dsList 就地滚动,不外溢 band ---- */
1277
+ .mgcn-dsMode {
1278
+ flex: 1 1 auto;
1279
+ min-height: 0;
1280
+ width: 100%;
1281
+ display: flex;
1282
+ flex-direction: column;
1283
+ overflow: hidden;
1284
+ }
1285
+
1286
+ /* ---- 面板体:消息列表(行高 30px / 文字 14px) ---- */
1287
+ .mgcn-dsList {
1288
+ flex: 1 1 auto;
1289
+ min-height: 0;
1290
+ width: 100%;
1291
+ overflow-y: auto;
1292
+ overflow-x: hidden;
1293
+ scrollbar-width: none;
1294
+ padding: 4px 0 8px;
1295
+ pointer-events: auto;
1296
+ }
1297
+ .mgcn-dsList::-webkit-scrollbar { width: 0; height: 0; display: none; }
1298
+ .mgcn-dsRow {
1299
+ display: flex;
1300
+ align-items: center;
1301
+ gap: 10px;
1302
+ width: 100%;
1303
+ height: 30px;
1304
+ padding: 0;
1305
+ border: none;
1306
+ background: transparent;
1307
+ cursor: pointer;
1308
+ pointer-events: auto;
1309
+ border-radius: 6px;
1310
+ white-space: nowrap;
1311
+ overflow: hidden;
1312
+ }
1313
+ /* 折叠态(rail 未展开):行内仅 mark,居中于窄轨 */
1314
+ .mgcn-dsRail:not(.mgcn-dsOpen) .mgcn-dsRow {
1315
+ justify-content: center;
1316
+ padding: 0;
1317
+ }
1318
+ /* JS 行 hover 高亮 */
1319
+ .mgcn-dsOpen .mgcn-dsRow.mgcn-dsRowHover {
1320
+ background: var(--mgcn-hover-bg, var(--dsw-alias-interactive-bg-hover));
1321
+ }
1322
+ .mgcn-dsMark {
1323
+ flex: none;
1324
+ width: 8px;
1325
+ height: 2px;
1326
+ margin-left: 8px;
1327
+ margin-right: 4px;
1328
+ border-radius: 1px;
1329
+ background: var(--dsw-alias-label-tertiary);
1330
+ opacity: 0.9;
1331
+ transition: background 120ms ease-out, opacity 120ms ease-out, width 120ms ease-out;
1332
+ }
1333
+ /* 行首收藏按钮(hover 行出现,替换 mark) */
1334
+ .mgcn-dsFav {
1335
+ flex: none;
1336
+ display: flex;
1337
+ align-items: center;
1338
+ justify-content: center;
1339
+ width: 16px;
1340
+ height: 16px;
1341
+ margin-left: 4px;
1342
+ padding: 0;
1343
+ border: none;
1344
+ border-radius: 4px;
1345
+ background: transparent;
1346
+ color: var(--dsw-alias-label-tertiary);
1347
+ cursor: pointer;
1348
+ transition: color 120ms ease-out, background 120ms ease-out;
1349
+ }
1350
+ .mgcn-dsFav:hover {
1351
+ color: var(--dsw-alias-brand-primary);
1352
+ background: var(--mgcn-hover-bg, var(--dsw-alias-interactive-bg-hover));
1353
+ }
1354
+ .mgcn-dsFavOn {
1355
+ color: var(--dsw-alias-state-warn-primary, var(--dsw-alias-brand-primary));
1356
+ }
1357
+ /* 行文本按钮:占满剩余、可跳转 */
1358
+ .mgcn-dsText {
1359
+ flex: 1 1 auto;
1360
+ min-width: 0;
1361
+ height: 100%;
1362
+ padding: 0;
1363
+ border: none;
1364
+ background: transparent;
1365
+ cursor: pointer;
1366
+ text-align: left;
1367
+ white-space: nowrap;
1368
+ overflow: hidden;
1369
+ }
1370
+ .mgcn-dsText:focus-visible {
1371
+ outline: 2px solid var(--dsw-alias-brand-primary);
1372
+ outline-offset: -2px;
1373
+ border-radius: 6px;
1374
+ }
1375
+ .mgcn-dsTextInner {
1376
+ display: block;
1377
+ overflow: hidden;
1378
+ text-overflow: ellipsis;
1379
+ font-size: 14px;
1380
+ line-height: 30px;
1381
+ margin-right: 8px;
1382
+ color: var(--mgcn-fg-secondary, var(--dsw-alias-label-secondary));
1383
+ opacity: 0;
1384
+ visibility: hidden;
1385
+ transition: opacity 140ms ease-out, visibility 0s linear 140ms;
1386
+ }
1387
+ .mgcn-dsOpen .mgcn-dsTextInner {
1388
+ opacity: 1;
1389
+ visibility: visible;
1390
+ transition: opacity 140ms ease-out, visibility 0s;
1391
+ }
1392
+ .mgcn-dsOpen .mgcn-dsRow.mgcn-dsRowHover .mgcn-dsTextInner {
1393
+ color: var(--mgcn-fg, var(--dsw-alias-label-primary));
1394
+ }
1395
+ /* 阅读位置行:短横业务蓝且略长(deepseek 用户消息语义色)
1396
+ 长横线去掉靠文本一侧的 margin-right(外缘 ml 沿用短横线 8px),
1397
+ 加长方向贴近文本、文本列位置不额外偏移 */
1398
+ .mgcn-dsRow.mgcn-dsCurrent .mgcn-dsMark {
1399
+ background: var(--dsw-alias-state-business-primary);
1400
+ opacity: 1;
1401
+ width: 12px;
1402
+ margin-right: 0;
1403
+ }
1404
+ /* 跳转目标:短横品牌脉冲 */
1405
+ .mgcn-dsRow.mgcn-dsJump .mgcn-dsMark {
1406
+ background: var(--dsw-alias-brand-primary);
1407
+ opacity: 1;
1408
+ animation: mgcn-dsPulse 600ms ease-in-out;
1409
+ }
1410
+ @keyframes mgcn-dsPulse {
1411
+ 0%, 100% { opacity: 1; }
1412
+ 50% { opacity: 0.4; }
1413
+ }
1414
+
1415
+ /* ---- 就地搜索结果行 ---- */
1416
+ .mgcn-dsHit {
1417
+ display: flex;
1418
+ align-items: flex-start;
1419
+ gap: 10px;
1420
+ width: 100%;
1421
+ min-height: 30px;
1422
+ padding: 6px 10px;
1423
+ border: none;
1424
+ background: transparent;
1425
+ cursor: pointer;
1426
+ text-align: left;
1427
+ border-radius: 6px;
1428
+ }
1429
+ .mgcn-dsHit:hover {
1430
+ background: var(--mgcn-hover-bg, var(--dsw-alias-interactive-bg-hover));
1431
+ }
1432
+ .mgcn-dsHit .mgcn-dsMark {
1433
+ margin-top: 9px;
1434
+ }
1435
+ .mgcn-dsHitBody {
1436
+ flex: 1 1 auto;
1437
+ min-width: 0;
1438
+ display: flex;
1439
+ flex-direction: column;
1440
+ gap: 2px;
1441
+ }
1442
+ .mgcn-dsHitMeta {
1443
+ display: flex;
1444
+ align-items: center;
1445
+ gap: 6px;
1446
+ font-size: 11px;
1447
+ font-weight: 600;
1448
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
1449
+ }
1450
+ .mgcn-dsHitTag {
1451
+ padding: 0 5px;
1452
+ border-radius: 4px;
1453
+ font-size: 10px;
1454
+ line-height: 16px;
1455
+ font-weight: 600;
1456
+ background: var(--mgcn-hover-bg, var(--dsw-alias-interactive-bg-hover));
1457
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
1458
+ }
1459
+ .mgcn-dsHitTag--user { background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 22%, transparent); color: var(--dsw-alias-state-business-primary); }
1460
+ .mgcn-dsHitTag--assistant { background: color-mix(in srgb, var(--dsw-alias-brand-primary) 18%, transparent); color: var(--dsw-alias-brand-primary); }
1461
+ .mgcn-dsHitTag--tool { background: color-mix(in srgb, var(--dsw-alias-state-warning) 20%, transparent); color: var(--dsw-alias-state-warning); }
1462
+ .mgcn-dsHitText {
1463
+ display: -webkit-box;
1464
+ -webkit-line-clamp: 2;
1465
+ -webkit-box-orient: vertical;
1466
+ overflow: hidden;
1467
+ white-space: normal;
1468
+ font-size: 13px;
1469
+ line-height: 18px;
1470
+ color: var(--mgcn-fg-secondary, var(--dsw-alias-label-secondary));
1471
+ }
1472
+ .mgcn-dsNoHit {
1473
+ padding: 14px 10px;
1474
+ font-size: 12px;
1475
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
1476
+ text-align: center;
1477
+ }
1478
+
1479
+ /* ---- 搜索进行中:列表 loading 态(三点点动) ---- */
1480
+ .mgcn-dsLoadingRow {
1481
+ flex: 1 1 auto;
1482
+ min-height: 0;
1483
+ display: flex;
1484
+ align-items: center;
1485
+ justify-content: center;
1486
+ gap: 6px;
1487
+ font-size: 12px;
1488
+ color: var(--mgcn-fg-dim, var(--dsw-alias-label-tertiary));
1489
+ }
1490
+ .mgcn-dsLoadingRow .mgcn-dsLoadingDots {
1491
+ display: inline-flex;
1492
+ gap: 3px;
1493
+ }
1494
+ .mgcn-dsLoadingRow .mgcn-dsLoadingDots i {
1495
+ width: 5px;
1496
+ height: 5px;
1497
+ border-radius: 50%;
1498
+ background: var(--dsw-alias-brand-primary);
1499
+ opacity: 0.35;
1500
+ animation: mgcnHintDot 900ms ease-in-out infinite;
1501
+ }
1502
+ .mgcn-dsLoadingRow .mgcn-dsLoadingDots i:nth-child(2) { animation-delay: 150ms; }
1503
+ .mgcn-dsLoadingRow .mgcn-dsLoadingDots i:nth-child(3) { animation-delay: 300ms; }
1504
+
1505
+ /* ---- 右停靠镜像:rail 在对话右侧 → 短横把手贴面板右缘、操作区镜像 ----
1506
+ 左停靠常态:行 = [短横 | 文本],操作区靠面板左缘(与 rail 同侧);
1507
+ 右停靠镜像:行 = [文本 | 短横](flex-direction 反转),操作区靠右缘。 */
1508
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsRow,
1509
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsHit {
1510
+ flex-direction: row-reverse;
1511
+ }
1512
+ /* 把手/收藏钮由 margin-left 改 margin-right(反转后贴右缘) */
1513
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsMark {
1514
+ margin-left: 4px;
1515
+ margin-right: 8px;
1516
+ }
1517
+ /* 右停靠长横线(当前行):去掉靠文本一侧的 margin-left,外缘 mr8 沿用 */
1518
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsRow.mgcn-dsCurrent .mgcn-dsMark {
1519
+ margin-left: 0;
1520
+ }
1521
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsFav {
1522
+ margin-left: 0;
1523
+ margin-right: 4px;
1524
+ }
1525
+ /* 文本呼吸边同步镜像:文本内容区左缘内缩(原 margin-right 反转) */
1526
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsTextInner {
1527
+ margin-right: 0;
1528
+ margin-left: 8px;
1529
+ }
1530
+ /* 命中行 mark 垂直偏移保留(行首 mark 现居右,对齐仍按行高) */
1531
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsHit .mgcn-dsMark {
1532
+ margin-top: 9px;
1533
+ }
1534
+ /* 面板头操作区镜像:搜索 → ⚙ → ⭐ 序列贴右缘,计数贴左缘 */
1535
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsHead {
1536
+ flex-direction: row-reverse;
1537
+ }
1538
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsHead .mgcn-count {
1539
+ margin-left: 0;
1540
+ margin-right: auto;
1541
+ }
1542
+
1543
+ /* ---- 设置浮层(通用快捷设置面板,与 minimal/codex 同一实现) ----
1544
+ 点 ⚙ → rail 立即收起窄轨(.mgcn-dsSnap 关过渡、抬层级),设置面板挂在 band 盒
1545
+ 角上的 0×0 锚点(.mgcn-dsFloat),按停靠侧向对话区弹出;开启期间 hover 不展开,
1546
+ 只有点击外部 / 面板 ✕ 才关闭。 */
1547
+ .mgcn-dsRail.mgcn-dsSnap {
1548
+ transition: none;
1549
+ z-index: 30;
1550
+ }
1551
+ .mgcn-dsRail .mgcn-dsFloat {
1552
+ position: absolute; /* 0×0 锚点:.mgcn-dsPanel 同盒(band 顶角) */
1553
+ top: 0;
1554
+ width: 0;
1555
+ height: 0;
1556
+ pointer-events: none; /* 锚点本身不接事件;面板内按钮照常 */
1557
+ }
1558
+ /* 停靠侧:右停靠 → 面板向左(对话侧)弹;左停靠 → 向右弹 */
1559
+ .mgcn-dsRail.mgcn-railRight .mgcn-dsFloat {
1560
+ left: 0;
1561
+ right: auto;
1562
+ }
1563
+ .mgcn-dsRail:not(.mgcn-railRight) .mgcn-dsFloat {
1564
+ left: 100%;
1565
+ right: auto;
1566
+ }
1567
+ .mgcn-dsFloat .mgcn-config-panel {
1568
+ pointer-events: auto;
1569
+ }
1570
+
1571
+ /* 手机抽屉顶部输入行 */
1572
+ .mgcn-drawerInput {
1573
+ flex: none;
1574
+ padding: 0 0 6px;
1575
+ }
1576
+ @media (prefers-reduced-motion: reduce) {
1577
+ .mgcn-dsRail {
1578
+ transition: none;
1579
+ }
1580
+ }