@xihan-ui/styles 3.0.0 → 3.2.0

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 (221) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +1 -1
  3. package/component-tokens.d.ts +29 -0
  4. package/components.tokens.json +683 -27
  5. package/css/alert.css +2 -2
  6. package/css/approval.css +4 -4
  7. package/css/button.css +9 -5
  8. package/css/calendar-picker.css +3 -3
  9. package/css/calendar-range-picker.css +7 -7
  10. package/css/carousel.css +45 -13
  11. package/css/cartesian-chart.css +11 -11
  12. package/css/cascader.css +10 -10
  13. package/css/citation.css +2 -2
  14. package/css/code-view.css +6 -6
  15. package/css/color-picker.css +81 -0
  16. package/css/color-swatch-picker.css +9 -4
  17. package/css/combobox.css +12 -4
  18. package/css/command.css +1 -1
  19. package/css/date-field.css +39 -0
  20. package/css/date-picker.css +86 -9
  21. package/css/date-range-picker.css +47 -7
  22. package/css/diff-view.css +8 -8
  23. package/css/field-array.css +1 -1
  24. package/css/field.css +4 -0
  25. package/css/file-upload.css +1 -1
  26. package/css/float-button.css +140 -27
  27. package/css/form.css +14 -6
  28. package/css/graph-chart.css +2 -2
  29. package/css/highlight.css +1 -1
  30. package/css/image.css +1 -1
  31. package/css/mention.css +1 -1
  32. package/css/message-feed.css +1 -1
  33. package/css/notification.css +26 -20
  34. package/css/number-field.css +18 -18
  35. package/css/page-header.css +2 -2
  36. package/css/password-input.css +2 -2
  37. package/css/popconfirm.css +3 -3
  38. package/css/question-flow.css +8 -8
  39. package/css/radar-chart.css +6 -6
  40. package/css/rating.css +1 -1
  41. package/css/select.css +2 -2
  42. package/css/separator.css +2 -2
  43. package/css/side-nav.css +13 -13
  44. package/css/skeleton.css +5 -5
  45. package/css/slider.css +6 -6
  46. package/css/sortable.css +2 -2
  47. package/css/table.css +19 -2
  48. package/css/tags-input.css +1 -1
  49. package/css/time-picker.css +59 -2
  50. package/css/tool-call.css +7 -7
  51. package/css/tooltip.css +1 -1
  52. package/css/tree-select.css +2 -2
  53. package/css/tree.css +81 -11
  54. package/dist/css/accordion.css +269 -0
  55. package/dist/css/affix.css +47 -0
  56. package/dist/css/alert.css +247 -0
  57. package/dist/css/anchor.css +252 -0
  58. package/dist/css/approval.css +501 -0
  59. package/dist/css/avatar-group.css +99 -0
  60. package/dist/css/avatar.css +98 -0
  61. package/dist/css/back-top.css +161 -0
  62. package/dist/css/badge.css +205 -0
  63. package/dist/css/bar-code.css +62 -0
  64. package/dist/css/breadcrumb.css +230 -0
  65. package/dist/css/button-group.css +263 -0
  66. package/dist/css/button.css +219 -0
  67. package/dist/css/calendar-picker.css +467 -0
  68. package/dist/css/calendar-range-picker.css +554 -0
  69. package/dist/css/card.css +221 -0
  70. package/dist/css/carousel.css +710 -0
  71. package/dist/css/cartesian-chart.css +830 -0
  72. package/dist/css/cascader.css +961 -0
  73. package/dist/css/checkbox-group.css +358 -0
  74. package/dist/css/checkbox.css +257 -0
  75. package/dist/css/citation.css +470 -0
  76. package/dist/css/clipboard.css +315 -0
  77. package/dist/css/code-view.css +374 -0
  78. package/dist/css/collapsible.css +185 -0
  79. package/dist/css/color-field.css +176 -0
  80. package/dist/css/color-picker.css +595 -0
  81. package/dist/css/color-slider.css +281 -0
  82. package/dist/css/color-swatch-picker.css +250 -0
  83. package/dist/css/color-swatch.css +35 -0
  84. package/dist/css/combobox.css +574 -0
  85. package/dist/css/command.css +399 -0
  86. package/dist/css/context-menu.css +420 -0
  87. package/dist/css/date-field.css +317 -0
  88. package/dist/css/date-picker.css +868 -0
  89. package/dist/css/date-range-picker.css +886 -0
  90. package/dist/css/description.css +67 -0
  91. package/dist/css/descriptions.css +299 -0
  92. package/dist/css/dialog.css +455 -0
  93. package/dist/css/diff-view.css +513 -0
  94. package/dist/css/download-trigger.css +151 -0
  95. package/dist/css/drawer.css +552 -0
  96. package/dist/css/editable.css +295 -0
  97. package/dist/css/empty-state.css +163 -0
  98. package/dist/css/field-array.css +226 -0
  99. package/dist/css/field.css +166 -0
  100. package/dist/css/fieldset.css +102 -0
  101. package/dist/css/file-upload.css +429 -0
  102. package/dist/css/flex.css +441 -0
  103. package/dist/css/float-button.css +569 -0
  104. package/dist/css/floating-panel.css +429 -0
  105. package/dist/css/focus.css +46 -0
  106. package/dist/css/forced-colors.css +93 -0
  107. package/dist/css/form.css +393 -0
  108. package/dist/css/funnel-chart.css +106 -0
  109. package/dist/css/graph-chart.css +205 -0
  110. package/dist/css/grid-list.css +235 -0
  111. package/dist/css/grid.css +1201 -0
  112. package/dist/css/heatmap.css +552 -0
  113. package/dist/css/hierarchy-chart.css +298 -0
  114. package/dist/css/highlight.css +41 -0
  115. package/dist/css/hover-card.css +226 -0
  116. package/dist/css/icon.css +225 -0
  117. package/dist/css/image-cropper.css +373 -0
  118. package/dist/css/image-viewer.css +538 -0
  119. package/dist/css/image.css +98 -0
  120. package/dist/css/infinite-scroll.css +77 -0
  121. package/dist/css/input-group.css +275 -0
  122. package/dist/css/json-viewer.css +379 -0
  123. package/dist/css/kbd.css +72 -0
  124. package/dist/css/label.css +78 -0
  125. package/dist/css/layers.css +7 -0
  126. package/dist/css/layout.css +372 -0
  127. package/dist/css/liquid.css +106 -0
  128. package/dist/css/list.css +152 -0
  129. package/dist/css/listbox.css +390 -0
  130. package/dist/css/loading-bar.css +141 -0
  131. package/dist/css/log.css +306 -0
  132. package/dist/css/markdown-stream.css +149 -0
  133. package/dist/css/marquee.css +378 -0
  134. package/dist/css/masonry.css +70 -0
  135. package/dist/css/matrix-code.css +67 -0
  136. package/dist/css/mention.css +393 -0
  137. package/dist/css/menu.css +364 -0
  138. package/dist/css/menubar.css +456 -0
  139. package/dist/css/message-feed.css +318 -0
  140. package/dist/css/navigation-menu.css +513 -0
  141. package/dist/css/notification.css +782 -0
  142. package/dist/css/number-animation.css +44 -0
  143. package/dist/css/number-field.css +252 -0
  144. package/dist/css/overlay-arrow.css +56 -0
  145. package/dist/css/page-header.css +184 -0
  146. package/dist/css/pagination.css +450 -0
  147. package/dist/css/password-input.css +391 -0
  148. package/dist/css/pie-chart.css +247 -0
  149. package/dist/css/pin-input.css +199 -0
  150. package/dist/css/pointer.css +36 -0
  151. package/dist/css/popconfirm.css +320 -0
  152. package/dist/css/popover.css +279 -0
  153. package/dist/css/progress.css +501 -0
  154. package/dist/css/prompt-input.css +260 -0
  155. package/dist/css/question-flow.css +553 -0
  156. package/dist/css/radar-chart.css +233 -0
  157. package/dist/css/radio-group.css +598 -0
  158. package/dist/css/rating.css +294 -0
  159. package/dist/css/reasoning.css +343 -0
  160. package/dist/css/reset.css +117 -0
  161. package/dist/css/resizable.css +242 -0
  162. package/dist/css/sankey-chart.css +174 -0
  163. package/dist/css/scroll-area.css +240 -0
  164. package/dist/css/scrollbar.css +204 -0
  165. package/dist/css/select.css +612 -0
  166. package/dist/css/separator.css +122 -0
  167. package/dist/css/side-nav.css +476 -0
  168. package/dist/css/signature-pad.css +179 -0
  169. package/dist/css/skeleton.css +161 -0
  170. package/dist/css/slider.css +374 -0
  171. package/dist/css/sortable.css +228 -0
  172. package/dist/css/sparkline.css +164 -0
  173. package/dist/css/spinner.css +236 -0
  174. package/dist/css/splitter.css +159 -0
  175. package/dist/css/statistic.css +137 -0
  176. package/dist/css/steps.css +627 -0
  177. package/dist/css/switch.css +351 -0
  178. package/dist/css/table.css +1145 -0
  179. package/dist/css/tabs.css +944 -0
  180. package/dist/css/tag-group.css +247 -0
  181. package/dist/css/tag.css +310 -0
  182. package/dist/css/tags-input.css +322 -0
  183. package/dist/css/text-field.css +197 -0
  184. package/dist/css/time-field.css +277 -0
  185. package/dist/css/time-picker.css +707 -0
  186. package/dist/css/time-range-picker.css +746 -0
  187. package/dist/css/timeline.css +423 -0
  188. package/dist/css/timer.css +123 -0
  189. package/dist/css/timestamp.css +34 -0
  190. package/dist/css/toggle-group.css +424 -0
  191. package/dist/css/toggle.css +146 -0
  192. package/dist/css/tone.css +189 -0
  193. package/dist/css/tool-call.css +429 -0
  194. package/dist/css/toolbar.css +365 -0
  195. package/dist/css/tooltip.css +218 -0
  196. package/dist/css/tour.css +439 -0
  197. package/dist/css/transfer.css +638 -0
  198. package/dist/css/tree-select.css +878 -0
  199. package/dist/css/tree.css +733 -0
  200. package/dist/css/truncate.css +108 -0
  201. package/dist/css/typography.css +472 -0
  202. package/dist/css/undefined.css +58 -0
  203. package/dist/css/virtualizer.css +166 -0
  204. package/dist/css/visually-hidden.css +20 -0
  205. package/dist/css/watermark.css +82 -0
  206. package/dist/family/action-control.css +487 -0
  207. package/dist/family/chart.css +480 -0
  208. package/dist/family/check-mark.css +94 -0
  209. package/dist/family/choice-card.css +97 -0
  210. package/dist/family/collection-item.css +764 -0
  211. package/dist/family/field-chrome.css +287 -0
  212. package/dist/family/loading-ring.css +95 -0
  213. package/dist/family/material.css +72 -0
  214. package/dist/family/menu-choice.css +56 -0
  215. package/dist/family/motion.css +363 -0
  216. package/dist/family/swatch.css +59 -0
  217. package/dist/family/tag-list.css +59 -0
  218. package/family/action-control.css +3 -12
  219. package/index.css +7307 -6759
  220. package/index.unlayered.css +7309 -6761
  221. package/package.json +165 -164
@@ -0,0 +1,513 @@
1
+ /*
2
+ * Copyright (c) 2021-Present XiHanFun and contributors.
3
+ * Licensed under the MIT License. See LICENSE in the project root for license information.
4
+ */
5
+
6
+ /* 定义 diff view 样式。 */
7
+
8
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
9
+ @import '../family/motion.css';
10
+ /* 独立皮肤同时传递引入折叠格按钮的动作控件配方;full bundle 递归去重。 */
11
+ @import '../family/action-control.css';
12
+
13
+ @layer xihan.components {
14
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
15
+ .xh-scope-diff-view {
16
+ --xh-diff-view-skin: 1;
17
+ }
18
+
19
+ /* 一张静态内容面:--xh-border-default 描边 + surface 底 + 无影(边界只由描边承担);
20
+ 头部、行号列与并排接缝的内部分隔线走另一支 --xh-diff-view-divider(subtle) */
21
+ .xh-scope-diff-view[data-part='root'] {
22
+ /* 作者塞进部件里的图标与皮肤画的兜底字形同一把尺:md 档,随 data-size 换档 */
23
+ --xh-icon-size: var(--xh-diff-view-icon-size, var(--xh-glyph-size-md));
24
+
25
+ /* 尺寸缺省档:不写 data-size 时的取值。三档都只写这三个私有槽,
26
+ 公开槽留在读处当首选,作者在祖先上设的覆盖才赢得过档位声明 */
27
+ --xh-_diff-view-font-size: var(--xh-control-font-md);
28
+ --xh-_diff-view-px: var(--xh-space-3);
29
+ --xh-_diff-view-py: var(--xh-space-2);
30
+
31
+ display: block;
32
+ overflow: hidden;
33
+ border: var(--xh-stroke-thin) solid var(--xh-diff-view-border, var(--xh-border-default));
34
+ border-radius: var(--xh-diff-view-radius, var(--xh-shape-surface));
35
+ background: var(--xh-diff-view-bg, var(--xh-bg-surface));
36
+ box-shadow: var(--xh-diff-view-shadow, none);
37
+ }
38
+
39
+ /* 上面声明的 display 会盖掉 UA 的 [hidden]{display:none},这里补回 */
40
+ .xh-scope-diff-view[data-part='root'][hidden] {
41
+ display: none;
42
+ }
43
+
44
+ .xh-scope-diff-view[data-part='header'] {
45
+ display: flex;
46
+ align-items: center;
47
+ gap: var(--xh-diff-view-header-gap, var(--xh-space-2));
48
+ padding-inline: var(--xh-diff-view-px, var(--xh-_diff-view-px));
49
+ padding-block: var(--xh-diff-view-py, var(--xh-_diff-view-py));
50
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-diff-view-divider, var(--xh-border-subtle));
51
+ color: var(--xh-diff-view-header-fg, var(--xh-fg-muted));
52
+ font-family: var(--xh-diff-view-font, var(--xh-font-family-mono));
53
+ font-size: var(--xh-diff-view-header-font-size, var(--xh-text-secondary-size));
54
+ }
55
+
56
+ .xh-scope-diff-view[data-part='header'][hidden] {
57
+ display: none;
58
+ }
59
+
60
+ /* 增删统计整组顶到右侧:头部是 flex,自动外边距吃掉中间的空当。
61
+ 第二个之后的不再顶,与前一个之间只留头部本来的间隙 */
62
+ .xh-scope-diff-view[data-part='summary'] {
63
+ margin-inline-start: auto;
64
+ }
65
+
66
+ .xh-scope-diff-view[data-part='summary'] ~ .xh-scope-diff-view[data-part='summary'] {
67
+ margin-inline-start: 0;
68
+ }
69
+
70
+ .xh-scope-diff-view[data-part='summary'][data-change='added'] {
71
+ color: var(--xh-diff-view-added-fg, var(--xh-diff-added-fg));
72
+ }
73
+
74
+ .xh-scope-diff-view[data-part='summary'][data-change='removed'] {
75
+ color: var(--xh-diff-view-removed-fg, var(--xh-diff-removed-fg));
76
+ }
77
+
78
+ /* 唯一的 Tab 停靠点;两轴都可能溢出 */
79
+ .xh-scope-diff-view[data-part='viewport'] {
80
+ overflow: auto;
81
+ max-block-size: var(--xh-diff-view-max-h, var(--xh-viewport-max-h));
82
+ }
83
+
84
+ .xh-scope-diff-view[data-part='body'] {
85
+ display: block;
86
+ font-family: var(--xh-diff-view-font, var(--xh-font-family-mono));
87
+ font-size: var(--xh-diff-view-font-size, var(--xh-_diff-view-font-size));
88
+ line-height: var(--xh-diff-view-line-height, var(--xh-text-code-leading));
89
+ min-inline-size: max-content;
90
+ }
91
+
92
+ .xh-scope-diff-view[data-part='body'][hidden] {
93
+ display: none;
94
+ }
95
+
96
+ /* 一行:行号与内容并排 */
97
+ .xh-scope-diff-view[data-part='row'],
98
+ .xh-scope-diff-view[data-part='gap'] {
99
+ display: flex;
100
+ min-block-size: var(--xh-diff-view-line-height, var(--xh-text-code-leading));
101
+ }
102
+
103
+ .xh-scope-diff-view[data-part='row'][hidden],
104
+ .xh-scope-diff-view[data-part='gap'][hidden] {
105
+ display: none;
106
+ }
107
+
108
+ /* 变更类型不只靠颜色:新增行画一条实心色条 */
109
+ .xh-scope-diff-view[data-part='row'][data-change='added'] {
110
+ background: var(--xh-diff-view-added-bg, var(--xh-diff-added-bg));
111
+ box-shadow: inset var(--xh-diff-view-change-bar, var(--xh-stroke-thick)) 0 0 0 var(--xh-diff-view-added-fg, var(--xh-diff-added-fg));
112
+ }
113
+
114
+ /* 删除行的色条改画斜纹:与新增行的实心条在灰度与高对比度下也分得开。
115
+ 45 度、1.5px 实 1.5px 空是纹理几何,不是设计尺度上的档位 */
116
+ .xh-scope-diff-view[data-part='row'][data-change='removed'] {
117
+ background:
118
+ repeating-linear-gradient(
119
+ 45deg,
120
+ var(--xh-diff-view-removed-fg, var(--xh-diff-removed-fg)) 0,
121
+ var(--xh-diff-view-removed-fg, var(--xh-diff-removed-fg)) 1.5px,
122
+ transparent 1.5px,
123
+ transparent 3px
124
+ )
125
+ left / var(--xh-diff-view-change-bar, var(--xh-stroke-thick)) 100% no-repeat,
126
+ var(--xh-diff-view-removed-bg, var(--xh-diff-removed-bg));
127
+ }
128
+
129
+ /* 点开折叠格才露出来的那几行播一次入场;收起是硬切,不占一段退场窗口 */
130
+ .xh-scope-diff-view[data-part='row'][data-revealed] {
131
+ animation: xh-drop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
132
+ }
133
+
134
+ /* 行号是画上去的不是写上去的:复制差异不带它,读屏也不逐行念数字 */
135
+ .xh-scope-diff-view[data-part='line-number'] {
136
+ display: block;
137
+ box-sizing: content-box;
138
+ flex: 0 0 auto;
139
+ padding-inline: var(--xh-diff-view-px, var(--xh-_diff-view-px));
140
+ border-inline-end: var(--xh-stroke-thin) solid var(--xh-diff-view-divider, var(--xh-border-subtle));
141
+ color: var(--xh-diff-view-number-fg, var(--xh-fg-subtle));
142
+ inline-size: var(--xh-diff-view-gutter, 4ch);
143
+ text-align: end;
144
+ user-select: none;
145
+ }
146
+
147
+ .xh-scope-diff-view[data-part='line-number']::before {
148
+ content: attr(data-line-number);
149
+ }
150
+
151
+ .xh-scope-diff-view[data-part='line-number'][hidden] {
152
+ display: none;
153
+ }
154
+
155
+ /* 行号跟着行的变更类型走:一眼扫下来数字本身就分出了增删 */
156
+ .xh-scope-diff-view[data-part='line-number'][data-change='added'] {
157
+ color: var(--xh-diff-view-added-fg, var(--xh-diff-added-fg));
158
+ }
159
+
160
+ .xh-scope-diff-view[data-part='line-number'][data-change='removed'] {
161
+ color: var(--xh-diff-view-removed-fg, var(--xh-diff-removed-fg));
162
+ }
163
+
164
+ /* 窄档的并排视图:一行的两侧改成上下两段,旧行在上、新行在下。
165
+ 行由横排 flex 换成两列栅格——行号一列、正文一列,一行里的四个格按 DOM 次序
166
+ 自然落成两行,正文列因此只按单侧的最长行撑宽,不再是两侧之和 */
167
+ .xh-scope-diff-view[data-part='root'][data-view='split'] [data-part='row']:where(.xh-scope-diff-view):not([hidden]) {
168
+ display: grid;
169
+ grid-template-columns: auto minmax(0, 1fr);
170
+ }
171
+
172
+ /* white-space: pre 保留缩进;每一侧各占一半宽 */
173
+ .xh-scope-diff-view[data-part='line-content'] {
174
+ display: block;
175
+ flex: 1 1 0;
176
+ min-inline-size: 0;
177
+ padding-inline-end: var(--xh-diff-view-px, var(--xh-_diff-view-px));
178
+ white-space: pre;
179
+ }
180
+
181
+ .xh-scope-diff-view[data-part='line-content'][hidden] {
182
+ display: none;
183
+ }
184
+
185
+ .xh-scope-diff-view[data-part='line-content'][data-change='added'] {
186
+ color: var(--xh-diff-view-added-fg, var(--xh-diff-added-fg));
187
+ }
188
+
189
+ .xh-scope-diff-view[data-part='line-content'][data-change='removed'] {
190
+ color: var(--xh-diff-view-removed-fg, var(--xh-diff-removed-fg));
191
+ }
192
+
193
+ /* 并排视图里空的那一侧只有底色,没有内容 */
194
+ .xh-scope-diff-view[data-part='line-content'][data-empty] {
195
+ background: var(--xh-diff-view-empty-bg, var(--xh-bg-subtle));
196
+ }
197
+
198
+ /* 开了换行:pre-wrap 仍保留缩进与连续空白,只是允许行尾折下来;
199
+ anywhere 让没有空格的长串(url、base64)也能断 */
200
+ .xh-scope-diff-view[data-part='root'][data-wrap] [data-part='line-content']:where(.xh-scope-diff-view) {
201
+ white-space: pre-wrap;
202
+ overflow-wrap: anywhere;
203
+ }
204
+
205
+ /* 正文原本按最长行撑宽,不解除就折不下来 */
206
+ .xh-scope-diff-view[data-part='root'][data-wrap] [data-part='body']:where(.xh-scope-diff-view) {
207
+ min-inline-size: 0;
208
+ }
209
+
210
+ /* 变更类型的读屏文字:视觉隐藏,不能 display:none——那样读屏就取不到它了。
211
+ 变更不该只靠颜色传达 */
212
+ .xh-scope-diff-view[data-part='change-label'] {
213
+ position: absolute;
214
+ inline-size: 1px;
215
+ block-size: 1px;
216
+ padding: 0;
217
+ margin: -1px;
218
+ border: 0;
219
+ overflow: hidden;
220
+ clip-path: inset(50%);
221
+ white-space: nowrap;
222
+ }
223
+
224
+ /* 词级片段:只有真正动过的那几段上底色,其余段落是纯包裹。
225
+ 不给内衬——等宽列要逐字对齐,多一像素整份差异就错位 */
226
+ .xh-scope-diff-view[data-part='inline-change'][data-change] {
227
+ border-radius: var(--xh-diff-view-inline-change-radius, var(--xh-shape-inset));
228
+ /* 片段跨行时两半各自收边,否则圆角只画在整段的首尾。两条都写:WebKit 只认带前缀那条 */
229
+ -webkit-box-decoration-break: clone;
230
+ box-decoration-break: clone;
231
+ }
232
+
233
+ .xh-scope-diff-view[data-part='inline-change'][data-change='added'] {
234
+ background: color-mix(in oklab, var(--xh-diff-view-added-fg, var(--xh-diff-added-fg)) 18%, transparent);
235
+ }
236
+
237
+ .xh-scope-diff-view[data-part='inline-change'][data-change='removed'] {
238
+ background: color-mix(in oklab, var(--xh-diff-view-removed-fg, var(--xh-diff-removed-fg)) 18%, transparent);
239
+ }
240
+
241
+ .xh-scope-diff-view[data-part='token'][data-kind='comment'] {
242
+ color: var(--xh-diff-view-comment-fg, var(--xh-fg-muted));
243
+ font-style: italic;
244
+ }
245
+
246
+ .xh-scope-diff-view[data-part='token'][data-kind='string'] {
247
+ color: var(--xh-diff-view-string-fg, var(--xh-syntax-string));
248
+ }
249
+
250
+ .xh-scope-diff-view[data-part='token'][data-kind='number'] {
251
+ color: var(--xh-diff-view-number-token-fg, var(--xh-syntax-number));
252
+ }
253
+
254
+ .xh-scope-diff-view[data-part='token'][data-kind='keyword'] {
255
+ color: var(--xh-diff-view-keyword-fg, var(--xh-syntax-keyword));
256
+ font-weight: var(--xh-diff-view-keyword-weight, var(--xh-font-weight-semibold));
257
+ }
258
+
259
+ .xh-scope-diff-view[data-part='token'][data-kind='punctuation'] {
260
+ color: var(--xh-diff-view-punctuation-fg, var(--xh-fg-subtle));
261
+ }
262
+
263
+ /* 折起来的那一行:整行都是展开按钮。行是淡底承载面,向按钮下发 hover 200 → pressed 300 */
264
+ .xh-scope-diff-view[data-part='gap'] {
265
+ --xh-action-host-bg-hover: var(--xh-bg-subtle-hover);
266
+ --xh-action-host-bg-pressed: var(--xh-bg-subtle-active);
267
+
268
+ background: var(--xh-diff-view-gap-bg, var(--xh-bg-subtle));
269
+ }
270
+
271
+ .xh-scope-diff-view[data-part='gap-cell'] {
272
+ display: block;
273
+ flex: 1 1 auto;
274
+ }
275
+
276
+ .xh-scope-diff-view[data-part='gap-cell'][hidden] {
277
+ display: none;
278
+ }
279
+
280
+ /* 展开按钮铺满折叠格,盒型、悬停与按下面由 Action Control 的 disclosure-trigger 档给(ghost 形态,
281
+ 按下只换面不缩放);这里只把使用者槽映射到桥接槽:圆角归零贴住格边、纵向内衬归零、
282
+ 高度锚在代码行高上让折叠格与相邻代码行同高,字号跟着正文走 */
283
+ .xh-scope-diff-view[data-part='gap-trigger'] {
284
+ --xh-action-radius: 0;
285
+ --xh-action-visual-size: var(--xh-diff-view-line-height, var(--xh-text-code-leading));
286
+ --xh-action-padding-inline: var(--xh-diff-view-px, var(--xh-_diff-view-px));
287
+ --xh-action-padding-block: 0;
288
+ --xh-action-font-size: var(--xh-diff-view-font-size, var(--xh-_diff-view-font-size));
289
+ --xh-action-fg-rest: var(--xh-diff-view-gap-fg, var(--xh-fg-muted));
290
+ --xh-action-bg-hover: var(--xh-diff-view-gap-bg-hover, var(--xh-_action-variant-bg-hover));
291
+
292
+ border-width: 0;
293
+ }
294
+
295
+ .xh-scope-diff-view[data-part='gap-trigger'][hidden] {
296
+ display: none;
297
+ }
298
+
299
+ .xh-scope-diff-view[data-part='empty'] {
300
+ display: block;
301
+ padding-inline: var(--xh-diff-view-px, var(--xh-_diff-view-px));
302
+ padding-block: var(--xh-diff-view-py, var(--xh-_diff-view-py));
303
+ color: var(--xh-diff-view-empty-fg, var(--xh-fg-muted));
304
+ font-size: var(--xh-diff-view-header-font-size, var(--xh-text-secondary-size));
305
+ }
306
+
307
+ .xh-scope-diff-view[data-part='empty'][hidden] {
308
+ display: none;
309
+ }
310
+
311
+ /* 截断提示条:这份差异不完整。它比 empty 显眼一档——空差异只是没东西可看,
312
+ 被砍过的差异看着像完整的,读的人不主动往这儿看就不会知道 */
313
+ .xh-scope-diff-view[data-part='truncation'] {
314
+ display: flex;
315
+ align-items: center;
316
+ gap: var(--xh-diff-view-truncation-gap, var(--xh-space-2));
317
+ padding-inline: var(--xh-diff-view-px, var(--xh-_diff-view-px));
318
+ padding-block: var(--xh-diff-view-py, var(--xh-_diff-view-py));
319
+ border-block-start: var(--xh-stroke-thin) solid
320
+ var(--xh-diff-view-truncation-border, var(--xh-border-subtle));
321
+ background: var(--xh-diff-view-truncation-bg,
322
+ color-mix(in oklab, var(--xh-fg-warning) 12%, var(--xh-bg-surface)));
323
+ color: var(--xh-diff-view-truncation-fg,
324
+ color-mix(in oklab, var(--xh-fg-warning) 60%, var(--xh-fg-default)));
325
+ font-size: var(--xh-diff-view-header-font-size, var(--xh-text-secondary-size));
326
+ }
327
+
328
+ .xh-scope-diff-view[data-part='truncation'][hidden] {
329
+ display: none;
330
+ }
331
+
332
+ /* 提示条的文字由适配器填,所以字形不走 :empty 那条兜底路径,恒画一枚;
333
+ 不要它就把 --xh-glyph-mark-warning 在子树上置 none */
334
+ .xh-scope-diff-view[data-part='truncation']::before {
335
+ content: '';
336
+ flex: none;
337
+ display: inline-block;
338
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
339
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
340
+ vertical-align: var(--xh-glyph-baseline-shift);
341
+ background-color: currentColor;
342
+ -webkit-mask: var(--xh-glyph-mark-warning) center / contain no-repeat;
343
+ mask: var(--xh-glyph-mark-warning) center / contain no-repeat;
344
+ }
345
+
346
+ /* 行评论:每格正文让出一列(一行高的正方格)给评论钮,没有钮的空侧也让,两侧代码才对得齐 */
347
+ .xh-scope-diff-view[data-part='root'][data-commentable] {
348
+ --xh-_diff-view-comment-col: var(--xh-diff-view-comment-col, var(--xh-diff-view-line-height, var(--xh-text-code-leading)));
349
+ }
350
+
351
+ .xh-scope-diff-view[data-part='root'][data-commentable] [data-part='line-content']:where(.xh-scope-diff-view) {
352
+ position: relative;
353
+ padding-inline-start: var(--xh-_diff-view-comment-col);
354
+ }
355
+
356
+ /* 评论钮接 Action Control icon 档、ghost 形态,边长压到一行高 */
357
+ .xh-scope-diff-view[data-part='comment-trigger'] {
358
+ --xh-action-visual-size: var(--xh-_diff-view-comment-col);
359
+ --xh-action-min-inline-size: var(--xh-_diff-view-comment-col);
360
+ --xh-action-radius: var(--xh-diff-view-comment-trigger-radius, var(--xh-shape-control));
361
+ --xh-action-fg-rest: var(--xh-diff-view-comment-trigger-fg, var(--xh-fg-muted));
362
+ --xh-icon-size: var(--xh-diff-view-comment-trigger-icon-size, var(--xh-glyph-size-sm));
363
+
364
+ position: absolute;
365
+ inset-block-start: 0;
366
+ inset-inline-start: 0;
367
+ block-size: var(--xh-_diff-view-comment-col);
368
+ }
369
+
370
+ .xh-scope-diff-view[data-part='comment-trigger'][hidden] {
371
+ display: none;
372
+ }
373
+
374
+ .xh-scope-diff-view[data-part='comment-trigger']::before {
375
+ content: '';
376
+ display: block;
377
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
378
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
379
+ background-color: currentColor;
380
+ -webkit-mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
381
+ mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
382
+ }
383
+
384
+ /* 指针设备上平时透明(仍可聚焦),悬停到这一行或焦点进了视口才显出来;触屏上常显 */
385
+ @media (hover: hover) and (pointer: fine) {
386
+ .xh-scope-diff-view[data-part='comment-trigger'] {
387
+ --xh-action-opacity-rest: 0;
388
+ }
389
+
390
+ .xh-scope-diff-view[data-part='row']:hover [data-part='comment-trigger']:where(.xh-scope-diff-view),
391
+ .xh-scope-diff-view[data-part='viewport']:focus-within [data-part='comment-trigger']:where(.xh-scope-diff-view) {
392
+ --xh-action-opacity-rest: 1;
393
+ }
394
+ }
395
+
396
+ /* 挂在正文格里、代码下方的评论:一张静态内容面,文字按正文排,不随代码的变更色 */
397
+ .xh-scope-diff-view[data-part='comment-thread'] {
398
+ display: block;
399
+ box-sizing: border-box;
400
+ max-inline-size: var(--xh-diff-view-comment-thread-max-w, var(--xh-measure-prose));
401
+ margin-block: var(--xh-diff-view-comment-thread-my, var(--xh-space-2));
402
+ padding: var(--xh-diff-view-comment-thread-p, var(--xh-space-3));
403
+ border: var(--xh-stroke-thin) solid var(--xh-diff-view-comment-thread-border, var(--xh-border-default));
404
+ border-radius: var(--xh-diff-view-comment-thread-radius, var(--xh-shape-surface));
405
+ background: var(--xh-diff-view-comment-thread-bg, var(--xh-bg-surface));
406
+ color: var(--xh-diff-view-comment-thread-fg, var(--xh-fg-default));
407
+ white-space: normal;
408
+ }
409
+
410
+ .xh-scope-diff-view[data-part='comment-thread'][hidden] {
411
+ display: none;
412
+ }
413
+
414
+ /* 尺寸档改字号、内衬与图标档 */
415
+ .xh-scope-diff-view[data-part='root'][data-size='sm'] {
416
+ --xh-icon-size: var(--xh-diff-view-icon-size, var(--xh-glyph-size-sm));
417
+ --xh-_diff-view-font-size: var(--xh-control-font-sm);
418
+ --xh-_diff-view-px: var(--xh-space-2);
419
+ --xh-_diff-view-py: var(--xh-space-1);
420
+ }
421
+
422
+ .xh-scope-diff-view[data-part='root'][data-size='md'] {
423
+ --xh-_diff-view-font-size: var(--xh-control-font-md);
424
+ --xh-_diff-view-px: var(--xh-space-3);
425
+ --xh-_diff-view-py: var(--xh-space-2);
426
+ }
427
+
428
+ .xh-scope-diff-view[data-part='root'][data-size='lg'] {
429
+ --xh-icon-size: var(--xh-diff-view-icon-size, var(--xh-glyph-size-lg));
430
+ --xh-_diff-view-font-size: var(--xh-control-font-lg);
431
+ --xh-_diff-view-px: var(--xh-space-4);
432
+ --xh-_diff-view-py: var(--xh-space-3);
433
+ }
434
+
435
+ /* 宽档:视口放得下两列,并排视图回到一行两侧 */
436
+ @media (min-width: 1024px) {
437
+ .xh-scope-diff-view[data-part='root'][data-view='split'] [data-part='row']:where(.xh-scope-diff-view):not([hidden]) {
438
+ display: flex;
439
+ }
440
+
441
+ /* 两列之间的接缝:新侧的行号槽再补一条左边线。只在并排时是接缝,
442
+ 堆叠时它落在段首,成了一条与任何东西都不相接的竖线 */
443
+ .xh-scope-diff-view[data-part='root'][data-view='split'] [data-part='line-number'][data-side='new']:where(.xh-scope-diff-view) {
444
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-diff-view-divider, var(--xh-border-subtle));
445
+ }
446
+ }
447
+
448
+ /*
449
+ * 高对比档:新增行那条实心色条写在 box-shadow 上、删除行那条斜纹写在渐变上,
450
+ * 这一档里两者一起被丢弃,只剩两个被系统换成同色的底。
451
+ * 改画两圈内收的环,实线对新增、虚线对删除,两档在纯系统色下仍分得开。
452
+ * 用 outline 不用 border:行是横排 flex,加边会把行号与内容一起往里推,
453
+ * 没有变更的行不加边,同一屏上的行首就对不齐了。
454
+ */
455
+ @media (forced-colors: active) {
456
+ .xh-scope-diff-view[data-part='row'][data-change='added'] {
457
+ outline: var(--xh-stroke-thick) solid CanvasText;
458
+ outline-offset: calc(-1 * var(--xh-stroke-thick));
459
+ }
460
+
461
+ .xh-scope-diff-view[data-part='row'][data-change='removed'] {
462
+ outline: var(--xh-stroke-thick) dashed CanvasText;
463
+ outline-offset: calc(-1 * var(--xh-stroke-thick));
464
+ }
465
+ }
466
+
467
+ /*
468
+ * 打印:底色与背景图一起被丢掉,新增行那条实心色条写在 box-shadow 上、
469
+ * 删除行那条斜纹写在渐变上,两者在纸上都不出现,两种变更就此糊成一样。
470
+ * 与高对比档同一套办法:实线环对新增、虚线环对删除,都是印得出来的通道。
471
+ */
472
+ @media print {
473
+ .xh-scope-diff-view[data-part='row'][data-change='added'] {
474
+ outline: var(--xh-stroke-thick) solid currentColor;
475
+ outline-offset: calc(-1 * var(--xh-stroke-thick));
476
+ }
477
+
478
+ .xh-scope-diff-view[data-part='row'][data-change='removed'] {
479
+ outline: var(--xh-stroke-thick) dashed currentColor;
480
+ outline-offset: calc(-1 * var(--xh-stroke-thick));
481
+ }
482
+
483
+ /* 纸上按不了评论钮 */
484
+ .xh-scope-diff-view[data-part='comment-trigger'] {
485
+ display: none;
486
+ }
487
+ }
488
+
489
+ @media (forced-colors: active) {
490
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
491
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
492
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
493
+ 落在 Canvas 面上的取 CanvasText;
494
+ 禁用取 GrayText */
495
+ .xh-scope-diff-view[data-part='truncation']::before {
496
+ forced-color-adjust: none;
497
+ background-color: CanvasText;
498
+ }
499
+
500
+ .xh-scope-diff-view[data-part='comment-trigger']::before {
501
+ forced-color-adjust: none;
502
+ background-color: ButtonText;
503
+ }
504
+
505
+ .xh-scope-diff-view[data-part='comment-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed])::before {
506
+ background-color: HighlightText;
507
+ }
508
+
509
+ .xh-scope-diff-view[data-part='comment-trigger'][data-disabled]::before {
510
+ background-color: GrayText;
511
+ }
512
+ }
513
+ }
@@ -0,0 +1,151 @@
1
+ /*
2
+ * Copyright (c) 2021-Present XiHanFun and contributors.
3
+ * Licensed under the MIT License. See LICENSE in the project root for license information.
4
+ */
5
+
6
+ /* 定义 download trigger 样式。 */
7
+
8
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
9
+ @import '../family/motion.css';
10
+ @import '../family/action-control.css';
11
+ @import '../family/loading-ring.css';
12
+
13
+ @layer xihan.components {
14
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
15
+ .xh-scope-download-trigger {
16
+ --xh-download-trigger-skin: 1;
17
+ }
18
+
19
+ /*
20
+ * 触发器就是这一个原生按钮,是定尺的独立动作按钮:盒型、三档几何、四态面、0.97 按压与粗指针
21
+ * 命中区由家族配方按 data-xh-action-variant / -size 给出(缺省 subtle 由连接层显式投影,只有 solid 才品牌实心)。
22
+ * 这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射;
23
+ * 要换成品牌样式的作者改 --xh-download-trigger-* 这一族槽位,或直接写自己的类名。
24
+ */
25
+ .xh-scope-download-trigger[data-part='root'] {
26
+ --xh-action-bg-rest: var(--xh-download-trigger-bg, var(--xh-_action-variant-bg-rest));
27
+ --xh-action-bg-hover: var(--xh-download-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
28
+ --xh-action-bg-pressed: var(--xh-download-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
29
+ --xh-action-bg-focus-visible: var(--xh-download-trigger-bg, var(--xh-_action-variant-bg-focus-visible));
30
+ --xh-action-bg-loading: var(--xh-download-trigger-bg, var(--xh-_action-variant-bg-loading));
31
+ --xh-action-bg-disabled: var(--xh-download-trigger-bg-disabled, var(--xh-_action-variant-bg-disabled));
32
+ --xh-action-fg-rest: var(--xh-download-trigger-fg, var(--xh-_action-variant-fg-rest));
33
+ --xh-action-fg-hover: var(--xh-download-trigger-fg, var(--xh-_action-variant-fg-hover));
34
+ --xh-action-fg-pressed: var(--xh-download-trigger-fg, var(--xh-_action-variant-fg-pressed));
35
+ --xh-action-fg-focus-visible: var(--xh-download-trigger-fg, var(--xh-_action-variant-fg-focus-visible));
36
+ --xh-action-fg-loading: var(--xh-download-trigger-fg, var(--xh-_action-variant-fg-loading));
37
+ --xh-action-border-rest: var(--xh-download-trigger-border, var(--xh-_action-variant-border-rest));
38
+ --xh-action-border-hover: var(--xh-download-trigger-border-hover, var(--xh-_action-variant-border-hover));
39
+ --xh-action-border-pressed: var(--xh-download-trigger-border-hover, var(--xh-_action-variant-border-pressed));
40
+ --xh-action-border-focus-visible: var(--xh-download-trigger-border, var(--xh-_action-variant-border-focus-visible));
41
+ --xh-action-border-disabled: var(--xh-download-trigger-border-disabled, var(--xh-_action-variant-border-disabled));
42
+ /* 矩阵各态无影(淡底与阴影互斥):solid 也不再悬停抬影,使用者槽仍可自行加 */
43
+ --xh-action-shadow-hover: var(--xh-download-trigger-shadow-hover, none);
44
+ --xh-action-radius: var(--xh-download-trigger-radius, var(--xh-shape-control));
45
+ --xh-action-visual-size: var(--xh-download-trigger-h, var(--xh-_action-profile-visual-size));
46
+ --xh-action-padding-inline: var(--xh-download-trigger-px, var(--xh-_action-profile-padding-inline));
47
+ --xh-action-gap: var(--xh-download-trigger-gap, var(--xh-_action-profile-gap));
48
+ --xh-action-font-size: var(--xh-download-trigger-font-size, var(--xh-_action-profile-font-size));
49
+ /* 作者塞进来的图标跟着尺寸档走,与皮肤画的兜底字形同一把尺 */
50
+ --xh-icon-size: var(--xh-download-trigger-icon-size, var(--xh-_action-profile-glyph-size));
51
+ /* 取数在途那枚圆环的颜色:字被 content-hide 关键帧压成透明,环不能跟着 currentColor 走,取加载态的前景 */
52
+ --xh-_download-trigger-loading-fg: var(--xh-download-trigger-loading-fg, var(--xh-download-trigger-fg, var(--xh-_action-variant-fg-loading)));
53
+ /* 取数在途的环由加载环配方压在钮正中(连接层投影 data-xh-loading-ring="overlay"),直径取钮的图标档;
54
+ 起始边取钮在途时的真实前景,转速认使用者槽 */
55
+ --xh-_loading-ring-fg: var(--xh-_download-trigger-loading-fg);
56
+ --xh-_loading-ring-duration: var(--xh-download-trigger-loading-duration, var(--xh-motion-loop-spin));
57
+
58
+ /* safe:文案放不下时居中改成靠行首排,裁掉的是末尾那截,开头仍然读得到 */
59
+ justify-content: safe center;
60
+ font-weight: var(--xh-download-trigger-font-weight, var(--xh-text-label-weight));
61
+ /* 文案比所在那一栏还长时,按钮的盒收到栏宽为止,多出来的字在行内一轴裁掉,
62
+ 整颗按钮不再撑破侧栏。块轴留 visible:粗指针那一档的命中区是往块轴外扩的伪元素 */
63
+ max-inline-size: 100%;
64
+ overflow-x: clip;
65
+ /* 导出键常被连点,触屏上默认会当成双击缩放 */
66
+ touch-action: manipulation;
67
+ }
68
+
69
+ /* 上面声明了 display,会盖掉 UA 的 [hidden] 规则,收起态要在这里接回来 */
70
+ .xh-scope-download-trigger[data-part='root'][hidden] {
71
+ display: none;
72
+ }
73
+
74
+ /* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
75
+ 那一族色本来就要在这块面上把字读清楚,与面的对比是按可读性定的 */
76
+ .xh-scope-download-trigger[data-part='root'][data-xh-action-variant='solid']:focus-visible {
77
+ --xh-action-ring-color-focus-visible: currentColor;
78
+ }
79
+
80
+ /* 没写内容就由皮肤画兜底字形;作者往按钮里塞了文字或自己的图形,这几条即不命中。
81
+ 字形另起一颗 ::after:::before 是加载环,mask 会把描边裁成字形轮廓、环就此消失。
82
+ 字形取前景色:取数在途时随前景一起淡到透明,把位置让给环 */
83
+ .xh-scope-download-trigger[data-part='root']:empty::after {
84
+ content: '';
85
+ display: inline-block;
86
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
87
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
88
+ vertical-align: var(--xh-glyph-baseline-shift);
89
+ background-color: currentColor;
90
+ -webkit-mask: var(--xh-glyph-mark-download) center / contain no-repeat;
91
+ mask: var(--xh-glyph-mark-download) center / contain no-repeat;
92
+ }
93
+
94
+ /* 取数在途:钮里原有的文字与字形随前景淡到透明留位,进入在途等一个 micro 才起淡(快速取数什么都不闪),
95
+ 与环同一段等待;退出在途不等,按 micro 淡回。环的前景另由私有槽给,不跟着透明 */
96
+ .xh-scope-download-trigger[data-part='root'][data-loading] {
97
+ --xh-action-fg-loading: transparent;
98
+
99
+ transition-delay: var(--xh-motion-duration-micro);
100
+ }
101
+
102
+ /* 手指落点:配方 text 档用 ::after 把块轴命中区扩到 44px;没写内容的按钮 ::after 已被兜底字形占着,
103
+ 这一档改用不在途时的 ::before 扩——取数在途时 ::before 是加载环,钮也按不动,不再需要热区。字形那条只写了尺寸与 mask,配方的定位、44px 下限与 -50% 平移会从同一个
104
+ ::after 漏进来:字形被拎出行内流、盒撑到 44px 高,按钮随之收窄一格字形——这里逐项钉回 */
105
+ @media (pointer: coarse) {
106
+ .xh-scope-download-trigger[data-part='root']:empty::after {
107
+ position: static;
108
+ min-block-size: 0;
109
+ translate: none;
110
+ }
111
+
112
+ /* 热区收下加载环的几何:环的描边不画、指针照接;退出在途时环在这一档直接收起,不留一圈放大的环淡出 */
113
+ .xh-scope-download-trigger[data-part='root']:empty:not([data-loading])::before {
114
+ content: '';
115
+ position: absolute;
116
+ border-color: transparent;
117
+ margin: 0;
118
+ pointer-events: auto;
119
+ inset-block: 50% auto;
120
+ inset-inline: 50% auto;
121
+ min-block-size: 44px;
122
+ inline-size: 100%;
123
+ block-size: 100%;
124
+ translate: -50% -50%;
125
+ }
126
+
127
+ /* 与家族同一笔:起点是逻辑属性、平移是物理通道,rtl 下行内分量掉头,热区才落回按钮中心 */
128
+ .xh-scope-download-trigger[data-part='root']:empty:not([data-loading]):dir(rtl)::before {
129
+ translate: 50% -50%;
130
+ }
131
+ }
132
+
133
+ @media (forced-colors: active) {
134
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
135
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
136
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
137
+ 禁用取 GrayText */
138
+ .xh-scope-download-trigger[data-part='root']:empty::after {
139
+ forced-color-adjust: none;
140
+ background-color: ButtonText;
141
+ }
142
+
143
+ .xh-scope-download-trigger[data-part='root']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::after {
144
+ background-color: HighlightText;
145
+ }
146
+
147
+ .xh-scope-download-trigger[data-part='root'][data-disabled]:empty::after {
148
+ background-color: GrayText;
149
+ }
150
+ }
151
+ }