@xihan-ui/styles 1.0.0 → 2.0.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 (171) hide show
  1. package/CHANGELOG.md +5146 -6
  2. package/README.md +22 -2
  3. package/component-tokens.d.ts +4212 -0
  4. package/component-tokens.js +2 -0
  5. package/components.tokens.json +80116 -0
  6. package/css/accordion.css +131 -75
  7. package/css/affix.css +16 -1
  8. package/css/alert.css +114 -67
  9. package/css/anchor.css +99 -27
  10. package/css/approval.css +461 -0
  11. package/css/avatar-group.css +14 -6
  12. package/css/avatar.css +33 -9
  13. package/css/back-top.css +103 -48
  14. package/css/badge.css +42 -14
  15. package/css/bar-code.css +62 -0
  16. package/css/breadcrumb.css +40 -21
  17. package/css/button-group.css +146 -24
  18. package/css/button.css +116 -99
  19. package/css/calendar-picker.css +448 -0
  20. package/css/calendar-range-picker.css +517 -0
  21. package/css/card.css +54 -77
  22. package/css/carousel.css +412 -68
  23. package/css/cascader.css +429 -246
  24. package/css/checkbox-group.css +225 -77
  25. package/css/checkbox.css +174 -37
  26. package/css/clipboard.css +266 -47
  27. package/css/code-view.css +279 -0
  28. package/css/collapsible.css +108 -63
  29. package/css/color-field.css +158 -0
  30. package/css/color-picker.css +172 -184
  31. package/css/color-slider.css +274 -0
  32. package/css/color-swatch-picker.css +243 -0
  33. package/css/color-swatch.css +35 -0
  34. package/css/combobox.css +267 -273
  35. package/css/command.css +399 -0
  36. package/css/context-menu.css +183 -108
  37. package/css/date-field.css +94 -121
  38. package/css/date-picker.css +486 -249
  39. package/css/date-range-picker.css +559 -0
  40. package/css/description.css +51 -0
  41. package/css/descriptions.css +133 -87
  42. package/css/dialog.css +247 -68
  43. package/css/diff-view.css +428 -0
  44. package/css/download-trigger.css +155 -46
  45. package/css/drawer.css +194 -111
  46. package/css/editable.css +172 -152
  47. package/css/empty-state.css +80 -11
  48. package/css/field-array.css +190 -0
  49. package/css/field.css +84 -31
  50. package/css/fieldset.css +51 -18
  51. package/css/file-upload.css +134 -36
  52. package/css/flex.css +20 -1
  53. package/css/float-button.css +238 -57
  54. package/css/floating-panel.css +173 -92
  55. package/css/focus.css +46 -0
  56. package/css/forced-colors.css +93 -0
  57. package/css/form.css +254 -77
  58. package/css/gradient-text.css +34 -10
  59. package/css/grid.css +516 -5
  60. package/css/heatmap.css +87 -29
  61. package/css/highlight.css +20 -5
  62. package/css/hover-card.css +97 -47
  63. package/css/icon-wrapper.css +15 -3
  64. package/css/icon.css +74 -8
  65. package/css/image-cropper.css +143 -29
  66. package/css/image-viewer.css +150 -89
  67. package/css/image.css +30 -1
  68. package/css/infinite-scroll.css +51 -1
  69. package/css/input-group.css +277 -0
  70. package/css/json-viewer.css +102 -45
  71. package/css/kbd.css +72 -0
  72. package/css/label.css +78 -0
  73. package/css/layers.css +5 -0
  74. package/css/layout.css +175 -31
  75. package/css/list.css +24 -3
  76. package/css/listbox.css +208 -67
  77. package/css/loading-bar.css +52 -3
  78. package/css/log.css +144 -9
  79. package/css/markdown-stream.css +149 -0
  80. package/css/marquee.css +27 -1
  81. package/css/masonry.css +7 -0
  82. package/css/matrix-code.css +67 -0
  83. package/css/mention.css +234 -152
  84. package/css/menu.css +180 -83
  85. package/css/menubar.css +204 -136
  86. package/css/message-feed.css +197 -0
  87. package/css/navigation-menu.css +144 -90
  88. package/css/notification.css +178 -100
  89. package/css/number-animation.css +7 -0
  90. package/css/number-field.css +120 -277
  91. package/css/overlay-arrow.css +12 -7
  92. package/css/page-header.css +99 -14
  93. package/css/pagination.css +175 -135
  94. package/css/password-input.css +222 -219
  95. package/css/pin-input.css +101 -67
  96. package/css/pointer.css +36 -0
  97. package/css/popconfirm.css +185 -94
  98. package/css/popover.css +121 -77
  99. package/css/progress.css +60 -12
  100. package/css/prompt-input.css +224 -0
  101. package/css/question-flow.css +513 -0
  102. package/css/radio-group.css +147 -30
  103. package/css/rating.css +193 -43
  104. package/css/reasoning.css +336 -0
  105. package/css/reset.css +84 -6
  106. package/css/resizable.css +237 -0
  107. package/css/scroll-area.css +68 -7
  108. package/css/scrollbar.css +47 -13
  109. package/css/segmented.css +94 -29
  110. package/css/select.css +288 -274
  111. package/css/separator.css +101 -1
  112. package/css/side-nav.css +133 -75
  113. package/css/signature-pad.css +74 -54
  114. package/css/skeleton.css +84 -11
  115. package/css/slider.css +132 -39
  116. package/css/sortable.css +198 -0
  117. package/css/spinner.css +126 -12
  118. package/css/splitter.css +29 -8
  119. package/css/statistic.css +55 -0
  120. package/css/steps.css +206 -72
  121. package/css/switch.css +268 -36
  122. package/css/table.css +695 -118
  123. package/css/tabs.css +604 -42
  124. package/css/tag-group.css +219 -0
  125. package/css/tag.css +118 -28
  126. package/css/tags-input.css +156 -274
  127. package/css/text-field.css +101 -249
  128. package/css/time-field.css +100 -128
  129. package/css/time-picker.css +323 -252
  130. package/css/time-range-picker.css +719 -0
  131. package/css/timeline.css +202 -68
  132. package/css/timer.css +56 -52
  133. package/css/timestamp.css +34 -0
  134. package/css/toast.css +373 -144
  135. package/css/toggle-group.css +309 -76
  136. package/css/toggle.css +116 -85
  137. package/css/tone.css +47 -0
  138. package/css/tool-call.css +421 -0
  139. package/css/toolbar.css +181 -33
  140. package/css/tooltip.css +107 -36
  141. package/css/tour.css +183 -152
  142. package/css/transfer.css +351 -138
  143. package/css/tree-select.css +323 -216
  144. package/css/tree.css +294 -62
  145. package/css/truncate.css +65 -0
  146. package/css/typography.css +228 -5
  147. package/css/undefined.css +10 -1
  148. package/css/virtualizer.css +9 -10
  149. package/css/visually-hidden.css +7 -0
  150. package/css/watermark.css +7 -0
  151. package/family/action-control.css +487 -0
  152. package/family/collection-item.css +721 -0
  153. package/family/field-chrome.css +298 -0
  154. package/family/motion.css +166 -0
  155. package/family/swatch.css +59 -0
  156. package/index.css +41705 -126
  157. package/index.unlayered.css +33692 -17339
  158. package/package.json +51 -17
  159. package/css/calendar.css +0 -367
  160. package/css/code-block.css +0 -91
  161. package/css/composer.css +0 -134
  162. package/css/countdown.css +0 -26
  163. package/css/dynamic-input.css +0 -220
  164. package/css/ellipsis.css +0 -52
  165. package/css/hotkeys.css +0 -90
  166. package/css/popselect.css +0 -391
  167. package/css/qr-code.css +0 -55
  168. package/css/result.css +0 -119
  169. package/css/space.css +0 -117
  170. package/css/thread.css +0 -120
  171. package/css/time.css +0 -25
@@ -1,3 +1,10 @@
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
+ /* 定义 file upload 样式。 */
7
+
1
8
  @layer xihan.components {
2
9
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
10
  [data-scope='file-upload'] {
@@ -5,7 +12,9 @@
5
12
  }
6
13
 
7
14
  [data-scope='file-upload'][data-part='root'] {
8
- /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
15
+ /* 作者放进缩略图槽、删除钮与清空钮里的图标跟着字号走,与皮肤画的兜底叉同一把尺。
16
+ 条目行首自绘的状态标记(传完的勾、失败的警示)不读这支:它们是指示符,与同一行里 icon 档的
17
+ 删除钮并排、走 --xh-control-indicator-* 一族(§6.5),尺寸由 --xh-file-upload-item-mark-size 单独控 */
9
18
  --xh-icon-size: var(--xh-file-upload-icon-size, var(--xh-glyph-size-text));
10
19
 
11
20
  display: flex;
@@ -22,7 +31,6 @@
22
31
  color: var(--xh-file-upload-label-fg, var(--xh-fg-default));
23
32
  font-size: var(--xh-file-upload-label-font-size, var(--xh-text-label-size));
24
33
  font-weight: var(--xh-file-upload-label-font-weight, var(--xh-text-label-weight));
25
- line-height: var(--xh-leading-none);
26
34
  }
27
35
 
28
36
  [data-scope='file-upload'][data-part='label'][data-disabled] {
@@ -42,7 +50,7 @@
42
50
  padding-inline: var(--xh-file-upload-dropzone-px, var(--xh-space-4));
43
51
  border: var(--xh-stroke-thick) dashed var(--xh-file-upload-dropzone-border, var(--xh-border-control));
44
52
  border-radius: var(--xh-file-upload-dropzone-radius, var(--xh-shape-surface));
45
- background: var(--xh-file-upload-dropzone-bg, var(--xh-bg-canvas));
53
+ background: var(--xh-file-upload-dropzone-bg, transparent);
46
54
  color: var(--xh-file-upload-dropzone-fg, var(--xh-fg-muted));
47
55
  font-size: var(--xh-file-upload-dropzone-font-size, var(--xh-text-body-size));
48
56
  text-align: center;
@@ -57,15 +65,17 @@
57
65
  display: none;
58
66
  }
59
67
 
60
- /* hover 只在中性态换描边:invalid 与 dragging 正拿边框颜色说事,被 hover 盖掉那条信息就没了 */
68
+ /* hover 只在中性态命中:invalid 与 dragging 正拿边框颜色说事,被 hover 盖掉那条信息就没了。
69
+ 描边与底一起换:这块面有整整八行高,只挪一圈 1px 的描边在这个面积上几乎读不出来 */
61
70
  [data-scope='file-upload'][data-part='dropzone']:hover:not([data-disabled], [data-invalid], [data-dragging]) {
62
71
  border-color: var(--xh-file-upload-dropzone-border-hover, var(--xh-border-control-hover));
72
+ background: var(--xh-file-upload-dropzone-bg-hover, var(--xh-bg-subtle));
63
73
  }
64
74
 
65
- /* 投放区自己承载焦点(它就是那个大按钮),所以画环而不是 outline:none */
66
- [data-scope='file-upload'][data-part='dropzone']:focus-visible {
67
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
68
- outline-offset: var(--xh-ring-offset);
75
+ /* 键盘落焦时描边跟着语气走,与聚焦环同族;环由 focus.css 统一画。
76
+ 摘掉的三档与 hover 那条一致:它们各自正拿边框颜色说事 */
77
+ [data-scope='file-upload'][data-part='dropzone']:focus-visible:not([data-disabled], [data-invalid], [data-dragging]) {
78
+ border-color: var(--xh-file-upload-dropzone-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
69
79
  }
70
80
 
71
81
  /* 悬停在上方:整块换成品牌色描边加浅底,比只换边框显眼得多 */
@@ -80,10 +90,9 @@
80
90
 
81
91
  /* 投放区是 div,没有原生 disabled 可用,禁用态只能靠 data-disabled 表达,写 :disabled 永远不命中 */
82
92
  [data-scope='file-upload'][data-part='dropzone'][data-disabled] {
83
- border-color: var(--xh-border-subtle);
93
+ border-color: var(--xh-border-default);
84
94
  background: var(--xh-file-upload-dropzone-bg-disabled, var(--xh-bg-subtle));
85
95
  color: var(--xh-fg-disabled);
86
- cursor: not-allowed;
87
96
  }
88
97
 
89
98
  [data-scope='file-upload'][data-part='trigger'] {
@@ -103,26 +112,35 @@
103
112
  font-size: var(--xh-file-upload-trigger-font-size, var(--xh-text-body-size));
104
113
  line-height: var(--xh-leading-none);
105
114
  cursor: pointer;
115
+ transition:
116
+ background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
117
+ box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
118
+ scale var(--xh-motion-duration-release) var(--xh-motion-ease-release);
106
119
  }
107
120
 
108
121
  [data-scope='file-upload'][data-part='trigger'][hidden] {
109
122
  display: none;
110
123
  }
111
124
 
125
+ /* 悬停换底色的同时把这块面抬起一档:只换底色的回执在一颗按钮上太轻 */
112
126
  [data-scope='file-upload'][data-part='trigger']:hover:not(:disabled) {
113
127
  background: var(--xh-file-upload-trigger-bg-hover, var(--xh-bg-subtle-hover));
128
+ box-shadow: var(--xh-file-upload-trigger-shadow-hover, var(--xh-elevation-raised));
114
129
  }
115
130
 
116
- [data-scope='file-upload'][data-part='trigger']:focus-visible {
117
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
118
- outline-offset: var(--xh-ring-offset);
131
+ /* 按下:换到按压档底色并轻微下压,抬起的那一档同时落回,松手弹回;禁用钮不压 */
132
+ [data-scope='file-upload'][data-part='trigger']:not(:disabled):is(:active, [data-pressed]) {
133
+ background: var(--xh-file-upload-trigger-bg-active, var(--xh-bg-subtle-active));
134
+ box-shadow: none;
135
+ scale: var(--xh-motion-scale-press);
136
+ transition-duration: var(--xh-motion-duration-press);
137
+ transition-timing-function: var(--xh-motion-ease-press);
119
138
  }
120
139
 
121
140
  /* 单体控件走原生 disabled(与集合条目的 aria-disabled 相反),因此用 :disabled */
122
141
  [data-scope='file-upload'][data-part='trigger']:disabled {
123
142
  background: var(--xh-bg-subtle);
124
143
  color: var(--xh-fg-disabled);
125
- cursor: not-allowed;
126
144
  }
127
145
 
128
146
  /* 连接层已经把这一套视觉隐藏写进了内联 style,这里是给元素升级前那一瞬兜底
@@ -140,23 +158,34 @@
140
158
  white-space: nowrap;
141
159
  }
142
160
 
143
- [data-scope='file-upload'][data-part='item-group'] {
161
+ /* 文件条数由用户一次选进来多少给,行数没有尽头:
162
+ 列表到这个高度就不再长,剩下的行在列表内滚出来,投放区与触发钮不会被推出视野 */
163
+ [data-scope='file-upload'][data-part='list'] {
144
164
  display: flex;
165
+ max-block-size: var(--xh-file-upload-list-max-h, var(--xh-viewport-h-md));
166
+ overflow-y: auto;
145
167
  flex-direction: column;
146
168
  gap: var(--xh-file-upload-item-gap, var(--xh-space-2));
147
169
  }
148
170
 
149
- [data-scope='file-upload'][data-part='item-group'][hidden] {
171
+ [data-scope='file-upload'][data-part='list'][hidden] {
150
172
  display: none;
151
173
  }
152
174
 
175
+ /* 私有槽一个:传输进度的 0..1 比例,由连接层写进进度条的内联样式,
176
+ 这里给个 0 的缺省——没接上传器时进度条根本不露面,也就没有宽度可算。 */
153
177
  [data-scope='file-upload'][data-part='item'] {
178
+ --xh-_file-upload-progress: 0;
179
+
154
180
  display: flex;
181
+ /* 一行排不下就换行:文件名有自己的下限,挤到那个下限之后由后面的部件另起一行,
182
+ 而不是把文件名继续压到零宽 */
183
+ flex-wrap: wrap;
155
184
  align-items: center;
156
185
  gap: var(--xh-file-upload-item-inner-gap, var(--xh-control-gap-md));
157
186
  padding-block: var(--xh-file-upload-item-py, var(--xh-space-2));
158
187
  padding-inline: var(--xh-file-upload-item-px, var(--xh-space-3));
159
- border: var(--xh-stroke-thin) solid var(--xh-file-upload-item-border, var(--xh-border-subtle));
188
+ border: var(--xh-stroke-thin) solid var(--xh-file-upload-item-border, var(--xh-border-default));
160
189
  border-radius: var(--xh-file-upload-item-radius, var(--xh-shape-control));
161
190
  background: var(--xh-file-upload-item-bg, var(--xh-bg-surface));
162
191
  color: var(--xh-file-upload-item-fg, var(--xh-fg-default));
@@ -171,6 +200,69 @@
171
200
  color: var(--xh-fg-disabled);
172
201
  }
173
202
 
203
+ /* 上传失败的那一行必须一眼认出来:不标出来的话它跟传完的行渲染完全一致,
204
+ 用户不知道该按哪一条的重试。红边之外再补一枚警示字形——只靠颜色的话,
205
+ 色觉障碍用户与灰度打印下这一档等于没有。
206
+ 警示与下面的勾都是固定状态标记(不是 :empty 兜底,作者塞进条目的部件顶不掉):按指示符档取尺
207
+ (comfortable 16 / compact 14,随密度换档),不读只管作者图标的 --xh-icon-size——随文 1em 落在
208
+ 14 上下,comfortable 下比同一行里的指示符档小一圈、compact 下又不换档 */
209
+ [data-scope='file-upload'][data-part='item'][data-state='error'] {
210
+ border-color: var(--xh-file-upload-item-border-error, var(--xh-border-invalid));
211
+ color: var(--xh-file-upload-item-fg-error, var(--xh-fg-danger));
212
+ }
213
+
214
+ [data-scope='file-upload'][data-part='item'][data-state='error']::before {
215
+ content: '';
216
+ flex: none;
217
+ inline-size: var(--xh-file-upload-item-mark-size, var(--xh-control-indicator-size));
218
+ block-size: var(--xh-file-upload-item-mark-size, var(--xh-control-indicator-size));
219
+ background-color: currentColor;
220
+ -webkit-mask: var(--xh-glyph-mark-warning) center / contain no-repeat;
221
+ mask: var(--xh-glyph-mark-warning) center / contain no-repeat;
222
+ }
223
+
224
+ /* 传完的那一行补一枚对勾,与失败那一枚警示字形对称:
225
+ 不标出来的话「传完了」与「还没开始」在这一行上看不出分别 */
226
+ [data-scope='file-upload'][data-part='item'][data-state='done']::before {
227
+ content: '';
228
+ flex: none;
229
+ inline-size: var(--xh-file-upload-item-mark-size, var(--xh-control-indicator-size));
230
+ block-size: var(--xh-file-upload-item-mark-size, var(--xh-control-indicator-size));
231
+ background-color: var(--xh-file-upload-item-fg-done, var(--xh-fg-success));
232
+ -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
233
+ mask: var(--xh-glyph-mark-check) center / contain no-repeat;
234
+ }
235
+
236
+ /* 传输进度条:只在传输中露面,宽度按连接层写下的比例走。
237
+ 进度是连续量,走 continuous 曲线,不是入场曲线 */
238
+ [data-scope='file-upload'][data-part='item-progress'] {
239
+ display: none;
240
+ overflow: hidden;
241
+ flex: none;
242
+ inline-size: var(--xh-file-upload-item-progress-w, calc(var(--xh-control-h-md) * 2));
243
+ block-size: var(--xh-file-upload-item-progress-h, var(--xh-stroke-thick));
244
+ border-radius: var(--xh-file-upload-item-progress-radius, var(--xh-shape-pill));
245
+ background: var(--xh-file-upload-item-progress-track, var(--xh-bg-subtle));
246
+ }
247
+
248
+ [data-scope='file-upload'][data-part='item-progress'][data-state='uploading'] {
249
+ display: block;
250
+ }
251
+
252
+ [data-scope='file-upload'][data-part='item-progress'][data-state='uploading']::before {
253
+ content: '';
254
+ display: block;
255
+ block-size: 100%;
256
+ border-radius: inherit;
257
+ background: var(--xh-file-upload-item-progress-fill, var(--xh-bg-brand));
258
+ inline-size: calc(var(--xh-_file-upload-progress, 0) * 100%);
259
+ transition: inline-size var(--xh-motion-duration-micro) var(--xh-motion-ease-continuous);
260
+ }
261
+
262
+ [data-scope='file-upload'][data-part='item-progress'][hidden] {
263
+ display: none;
264
+ }
265
+
174
266
  /* 缩略图占位:作者往里塞图标或真缩略图,尺寸由这里定死,一行行的图标才对得齐 */
175
267
  [data-scope='file-upload'][data-part='item-preview'] {
176
268
  display: inline-flex;
@@ -203,11 +295,12 @@
203
295
  object-fit: cover;
204
296
  }
205
297
 
206
- /* 文件名占满中间那段并用省略号收口:不写 min-inline-size 的话,
207
- flex 项的最小尺寸是内容宽度,长文件名会把整行顶宽而不是被截断 */
298
+ /* 文件名占满中间那段并用省略号收口。
299
+ 下限是这一行的换行点:名字缩到这个宽度还不够,后面的部件就被推去下一行;
300
+ 再用 100% 收一次口——容器比这个下限还窄时,名字只占满容器,不把整行顶宽 */
208
301
  [data-scope='file-upload'][data-part='item-name'] {
209
302
  flex: 1;
210
- min-inline-size: 0;
303
+ min-inline-size: min(var(--xh-file-upload-item-name-min-w, var(--xh-control-min-w)), 100%);
211
304
  overflow: hidden;
212
305
  white-space: nowrap;
213
306
  text-overflow: ellipsis;
@@ -245,7 +338,7 @@
245
338
  cursor: pointer;
246
339
  transition:
247
340
  background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
248
- scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
341
+ scale var(--xh-motion-duration-release) var(--xh-motion-ease-release);
249
342
  }
250
343
 
251
344
  [data-scope='file-upload'][data-part='item-delete-trigger'][hidden] {
@@ -258,19 +351,15 @@
258
351
  }
259
352
 
260
353
  /* 按下:换到按压档底色并轻微下压,松手弹回;禁用钮不压 */
261
- [data-scope='file-upload'][data-part='item-delete-trigger']:not(:disabled):active {
354
+ [data-scope='file-upload'][data-part='item-delete-trigger']:not(:disabled):is(:active, [data-pressed]) {
262
355
  background: var(--xh-file-upload-delete-bg-active, var(--xh-bg-subtle-active));
263
356
  scale: var(--xh-motion-scale-press);
264
- }
265
-
266
- [data-scope='file-upload'][data-part='item-delete-trigger']:focus-visible {
267
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
268
- outline-offset: var(--xh-ring-offset);
357
+ transition-duration: var(--xh-motion-duration-press);
358
+ transition-timing-function: var(--xh-motion-ease-press);
269
359
  }
270
360
 
271
361
  [data-scope='file-upload'][data-part='item-delete-trigger']:disabled {
272
362
  color: var(--xh-fg-disabled);
273
- cursor: not-allowed;
274
363
  }
275
364
 
276
365
  /* 清空是收尾动作,画成不带底色的文字按钮:它比"选择文件"次要 */
@@ -293,7 +382,7 @@
293
382
  cursor: pointer;
294
383
  transition:
295
384
  background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
296
- scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
385
+ scale var(--xh-motion-duration-release) var(--xh-motion-ease-release);
297
386
  }
298
387
 
299
388
  [data-scope='file-upload'][data-part='clear-trigger'][hidden] {
@@ -306,14 +395,11 @@
306
395
  }
307
396
 
308
397
  /* 按下:换到按压档底色并轻微下压,松手弹回;禁用钮不压 */
309
- [data-scope='file-upload'][data-part='clear-trigger']:not(:disabled):active {
398
+ [data-scope='file-upload'][data-part='clear-trigger']:not(:disabled):is(:active, [data-pressed]) {
310
399
  background: var(--xh-file-upload-clear-bg-active, var(--xh-bg-subtle-active));
311
400
  scale: var(--xh-motion-scale-press);
312
- }
313
-
314
- [data-scope='file-upload'][data-part='clear-trigger']:focus-visible {
315
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
316
- outline-offset: var(--xh-ring-offset);
401
+ transition-duration: var(--xh-motion-duration-press);
402
+ transition-timing-function: var(--xh-motion-ease-press);
317
403
  }
318
404
 
319
405
  /* 空列表时按钮照常可按(收起它会让焦点掉回 body),只把前景压淡一档 */
@@ -323,7 +409,19 @@
323
409
 
324
410
  [data-scope='file-upload'][data-part='clear-trigger']:disabled {
325
411
  color: var(--xh-fg-disabled);
326
- cursor: not-allowed;
412
+ }
413
+
414
+ /*
415
+ * 高对比档:三颗钮的按压面常态靠换底表出,这一档里底色被统一换成 Canvas,按住那一下与静息塌成同一个样子;
416
+ * 用系统高亮反色画回来,兜底字形读 currentColor、自己跟着换
417
+ */
418
+ @media (forced-colors: active) {
419
+ [data-scope='file-upload'][data-part='trigger']:not(:disabled):is(:active, [data-pressed]),
420
+ [data-scope='file-upload'][data-part='item-delete-trigger']:not(:disabled):is(:active, [data-pressed]),
421
+ [data-scope='file-upload'][data-part='clear-trigger']:not(:disabled):is(:active, [data-pressed]) {
422
+ background: Highlight;
423
+ color: HighlightText;
424
+ }
327
425
  }
328
426
 
329
427
  /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
package/css/flex.css CHANGED
@@ -1,3 +1,10 @@
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
+ /* 定义 flex 样式。 */
7
+
1
8
  @layer xihan.components {
2
9
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
10
  [data-scope='flex'] {
@@ -16,13 +23,24 @@
16
23
  display: inline-flex;
17
24
  }
18
25
 
19
- /* —— 方向 —— */
26
+ /* 分隔符:夹在两个子项之间的装饰件,样子由放进去的内容决定。
27
+ 这里只兜住两件事——不被主轴挤扁(一条 1px 的竖线会被弹性收缩吃没),
28
+ 交叉轴上不单独发话,跟着容器的对齐走:横排随中线、竖排随拉伸 */
29
+ [data-scope='flex'][data-part='split'] {
30
+ flex: none;
31
+ }
32
+
33
+ /* —— 方向与缺省对齐 —— */
34
+ /* 横排时按中线对齐:一排里混着文字、按钮、标签,高度本就不齐,居中最不容易看出错位 */
20
35
  [data-scope='flex'][data-part='root'][data-orientation='horizontal'] {
21
36
  flex-direction: row;
37
+ align-items: center;
22
38
  }
23
39
 
40
+ /* 竖排时拉伸:一列里的块级子项该占满容器宽度 */
24
41
  [data-scope='flex'][data-part='root'][data-orientation='vertical'] {
25
42
  flex-direction: column;
43
+ align-items: stretch;
26
44
  }
27
45
 
28
46
  /* —— 折行 —— */
@@ -31,6 +49,7 @@
31
49
  }
32
50
 
33
51
  /* —— 交叉轴对齐 —— */
52
+ /* 排在方向之后:两者特指度相同,写了 align 就该压过随方向来的那份缺省 */
34
53
  [data-scope='flex'][data-part='root'][data-align='start'] {
35
54
  align-items: flex-start;
36
55
  }