@xihan-ui/styles 3.1.0 → 4.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 (290) hide show
  1. package/CHANGELOG.md +470 -0
  2. package/component-tokens.d.ts +230 -60
  3. package/components.tokens.json +5156 -1557
  4. package/css/accordion.css +47 -20
  5. package/css/alert.css +16 -17
  6. package/css/anchor.css +2 -2
  7. package/css/approval.css +41 -17
  8. package/css/avatar-group.css +9 -12
  9. package/css/avatar.css +20 -18
  10. package/css/back-top.css +21 -7
  11. package/css/badge.css +5 -5
  12. package/css/breadcrumb.css +18 -16
  13. package/css/button-group.css +4 -6
  14. package/css/button.css +13 -12
  15. package/css/calendar-picker.css +178 -95
  16. package/css/calendar-range-picker.css +207 -122
  17. package/css/card.css +34 -6
  18. package/css/carousel.css +94 -46
  19. package/css/cartesian-chart.css +11 -11
  20. package/css/cascader.css +51 -39
  21. package/css/checkbox-group.css +9 -6
  22. package/css/checkbox.css +5 -4
  23. package/css/citation.css +9 -4
  24. package/css/clipboard.css +20 -4
  25. package/css/code-view.css +6 -6
  26. package/css/collapsible.css +29 -14
  27. package/css/color-field.css +4 -4
  28. package/css/color-picker.css +77 -23
  29. package/css/color-slider.css +10 -8
  30. package/css/color-swatch-picker.css +14 -9
  31. package/css/combobox.css +26 -14
  32. package/css/command.css +14 -9
  33. package/css/context-menu.css +10 -5
  34. package/css/date-field.css +12 -6
  35. package/css/date-picker.css +178 -109
  36. package/css/date-range-picker.css +199 -130
  37. package/css/description.css +10 -6
  38. package/css/descriptions.css +47 -19
  39. package/css/dialog.css +50 -35
  40. package/css/diff-view.css +8 -8
  41. package/css/drawer.css +75 -21
  42. package/css/editable.css +15 -41
  43. package/css/empty-state.css +21 -3
  44. package/css/field-array.css +5 -2
  45. package/css/field.css +17 -18
  46. package/css/fieldset.css +33 -13
  47. package/css/file-upload.css +66 -33
  48. package/css/float-button.css +60 -35
  49. package/css/floating-panel.css +1 -1
  50. package/css/form.css +30 -16
  51. package/css/graph-chart.css +2 -2
  52. package/css/grid-list.css +1 -1
  53. package/css/highlight.css +5 -5
  54. package/css/hover-card.css +19 -12
  55. package/css/image-viewer.css +77 -27
  56. package/css/image.css +13 -5
  57. package/css/infinite-scroll.css +8 -4
  58. package/css/input-group.css +74 -26
  59. package/css/kbd.css +1 -1
  60. package/css/label.css +27 -11
  61. package/css/layout.css +17 -10
  62. package/css/list.css +13 -9
  63. package/css/listbox.css +12 -7
  64. package/css/loading-bar.css +3 -0
  65. package/css/mention.css +11 -9
  66. package/css/menu.css +10 -5
  67. package/css/menubar.css +13 -8
  68. package/css/message-feed.css +1 -1
  69. package/css/navigation-menu.css +2 -2
  70. package/css/notification.css +132 -49
  71. package/css/number-animation.css +2 -2
  72. package/css/number-field.css +75 -52
  73. package/css/page-header.css +64 -27
  74. package/css/pagination.css +35 -38
  75. package/css/password-input.css +12 -68
  76. package/css/pin-input.css +18 -26
  77. package/css/popconfirm.css +23 -14
  78. package/css/popover.css +18 -12
  79. package/css/progress.css +14 -13
  80. package/css/prompt-input.css +3 -3
  81. package/css/question-flow.css +41 -15
  82. package/css/radar-chart.css +6 -6
  83. package/css/radio-group.css +120 -55
  84. package/css/rating.css +32 -15
  85. package/css/select.css +16 -12
  86. package/css/separator.css +24 -6
  87. package/css/side-nav.css +29 -24
  88. package/css/signature-pad.css +23 -9
  89. package/css/skeleton.css +12 -12
  90. package/css/slider.css +77 -48
  91. package/css/sortable.css +2 -2
  92. package/css/sparkline.css +8 -2
  93. package/css/spinner.css +40 -20
  94. package/css/statistic.css +14 -14
  95. package/css/steps.css +115 -84
  96. package/css/switch.css +9 -7
  97. package/css/table.css +29 -12
  98. package/css/tabs.css +35 -12
  99. package/css/tag-group.css +17 -6
  100. package/css/tag.css +54 -29
  101. package/css/tags-input.css +39 -20
  102. package/css/text-field.css +5 -5
  103. package/css/time-field.css +4 -4
  104. package/css/time-picker.css +150 -64
  105. package/css/time-range-picker.css +91 -62
  106. package/css/timeline.css +37 -20
  107. package/css/timer.css +3 -3
  108. package/css/toggle-group.css +4 -4
  109. package/css/tool-call.css +13 -11
  110. package/css/toolbar.css +6 -5
  111. package/css/tooltip.css +16 -17
  112. package/css/tour.css +14 -7
  113. package/css/transfer.css +22 -16
  114. package/css/tree-select.css +12 -12
  115. package/css/tree.css +26 -25
  116. package/css/typography.css +28 -25
  117. package/dist/css/accordion.css +296 -0
  118. package/dist/css/affix.css +47 -0
  119. package/dist/css/alert.css +246 -0
  120. package/dist/css/anchor.css +252 -0
  121. package/dist/css/approval.css +525 -0
  122. package/dist/css/avatar-group.css +96 -0
  123. package/dist/css/avatar.css +100 -0
  124. package/dist/css/back-top.css +175 -0
  125. package/dist/css/badge.css +205 -0
  126. package/dist/css/bar-code.css +62 -0
  127. package/dist/css/breadcrumb.css +232 -0
  128. package/dist/css/button-group.css +261 -0
  129. package/dist/css/button.css +216 -0
  130. package/dist/css/calendar-picker.css +550 -0
  131. package/dist/css/calendar-range-picker.css +639 -0
  132. package/dist/css/card.css +249 -0
  133. package/dist/css/carousel.css +726 -0
  134. package/dist/css/cartesian-chart.css +830 -0
  135. package/dist/css/cascader.css +973 -0
  136. package/dist/css/checkbox-group.css +361 -0
  137. package/dist/css/checkbox.css +258 -0
  138. package/dist/css/citation.css +475 -0
  139. package/dist/css/clipboard.css +331 -0
  140. package/dist/css/code-view.css +374 -0
  141. package/dist/css/collapsible.css +200 -0
  142. package/dist/css/color-field.css +176 -0
  143. package/dist/css/color-picker.css +649 -0
  144. package/dist/css/color-slider.css +283 -0
  145. package/dist/css/color-swatch-picker.css +250 -0
  146. package/dist/css/color-swatch.css +35 -0
  147. package/dist/css/combobox.css +578 -0
  148. package/dist/css/command.css +404 -0
  149. package/dist/css/context-menu.css +425 -0
  150. package/dist/css/date-field.css +317 -0
  151. package/dist/css/date-picker.css +931 -0
  152. package/dist/css/date-range-picker.css +949 -0
  153. package/dist/css/description.css +71 -0
  154. package/dist/css/descriptions.css +327 -0
  155. package/dist/css/dialog.css +470 -0
  156. package/dist/css/diff-view.css +513 -0
  157. package/dist/css/download-trigger.css +151 -0
  158. package/dist/css/drawer.css +606 -0
  159. package/dist/css/editable.css +269 -0
  160. package/dist/css/empty-state.css +181 -0
  161. package/dist/css/field-array.css +229 -0
  162. package/dist/css/field.css +165 -0
  163. package/dist/css/fieldset.css +122 -0
  164. package/dist/css/file-upload.css +462 -0
  165. package/dist/css/flex.css +441 -0
  166. package/dist/css/float-button.css +579 -0
  167. package/dist/css/floating-panel.css +429 -0
  168. package/dist/css/focus.css +46 -0
  169. package/dist/css/forced-colors.css +93 -0
  170. package/dist/css/form.css +407 -0
  171. package/dist/css/funnel-chart.css +106 -0
  172. package/dist/css/graph-chart.css +205 -0
  173. package/dist/css/grid-list.css +235 -0
  174. package/dist/css/grid.css +1201 -0
  175. package/dist/css/heatmap.css +552 -0
  176. package/dist/css/hierarchy-chart.css +298 -0
  177. package/dist/css/highlight.css +41 -0
  178. package/dist/css/hover-card.css +233 -0
  179. package/dist/css/icon.css +225 -0
  180. package/dist/css/image-cropper.css +373 -0
  181. package/dist/css/image-viewer.css +588 -0
  182. package/dist/css/image.css +106 -0
  183. package/dist/css/infinite-scroll.css +81 -0
  184. package/dist/css/input-group.css +323 -0
  185. package/dist/css/json-viewer.css +379 -0
  186. package/dist/css/kbd.css +72 -0
  187. package/dist/css/label.css +94 -0
  188. package/dist/css/layers.css +7 -0
  189. package/dist/css/layout.css +379 -0
  190. package/dist/css/liquid.css +106 -0
  191. package/dist/css/list.css +156 -0
  192. package/dist/css/listbox.css +395 -0
  193. package/dist/css/loading-bar.css +144 -0
  194. package/dist/css/log.css +306 -0
  195. package/dist/css/markdown-stream.css +149 -0
  196. package/dist/css/marquee.css +378 -0
  197. package/dist/css/masonry.css +70 -0
  198. package/dist/css/matrix-code.css +67 -0
  199. package/dist/css/mention.css +395 -0
  200. package/dist/css/menu.css +369 -0
  201. package/dist/css/menubar.css +461 -0
  202. package/dist/css/message-feed.css +318 -0
  203. package/dist/css/navigation-menu.css +513 -0
  204. package/dist/css/notification.css +865 -0
  205. package/dist/css/number-animation.css +44 -0
  206. package/dist/css/number-field.css +275 -0
  207. package/dist/css/overlay-arrow.css +56 -0
  208. package/dist/css/page-header.css +221 -0
  209. package/dist/css/pagination.css +447 -0
  210. package/dist/css/password-input.css +335 -0
  211. package/dist/css/pie-chart.css +247 -0
  212. package/dist/css/pin-input.css +191 -0
  213. package/dist/css/pointer.css +36 -0
  214. package/dist/css/popconfirm.css +329 -0
  215. package/dist/css/popover.css +285 -0
  216. package/dist/css/progress.css +502 -0
  217. package/dist/css/prompt-input.css +260 -0
  218. package/dist/css/question-flow.css +579 -0
  219. package/dist/css/radar-chart.css +233 -0
  220. package/dist/css/radio-group.css +663 -0
  221. package/dist/css/rating.css +311 -0
  222. package/dist/css/reasoning.css +343 -0
  223. package/dist/css/reset.css +117 -0
  224. package/dist/css/resizable.css +242 -0
  225. package/dist/css/sankey-chart.css +174 -0
  226. package/dist/css/scroll-area.css +240 -0
  227. package/dist/css/scrollbar.css +204 -0
  228. package/dist/css/select.css +616 -0
  229. package/dist/css/separator.css +140 -0
  230. package/dist/css/side-nav.css +481 -0
  231. package/dist/css/signature-pad.css +193 -0
  232. package/dist/css/skeleton.css +161 -0
  233. package/dist/css/slider.css +403 -0
  234. package/dist/css/sortable.css +228 -0
  235. package/dist/css/sparkline.css +170 -0
  236. package/dist/css/spinner.css +256 -0
  237. package/dist/css/splitter.css +159 -0
  238. package/dist/css/statistic.css +137 -0
  239. package/dist/css/steps.css +658 -0
  240. package/dist/css/switch.css +353 -0
  241. package/dist/css/table.css +1162 -0
  242. package/dist/css/tabs.css +967 -0
  243. package/dist/css/tag-group.css +258 -0
  244. package/dist/css/tag.css +335 -0
  245. package/dist/css/tags-input.css +341 -0
  246. package/dist/css/text-field.css +197 -0
  247. package/dist/css/time-field.css +277 -0
  248. package/dist/css/time-picker.css +793 -0
  249. package/dist/css/time-range-picker.css +775 -0
  250. package/dist/css/timeline.css +440 -0
  251. package/dist/css/timer.css +123 -0
  252. package/dist/css/timestamp.css +34 -0
  253. package/dist/css/toggle-group.css +424 -0
  254. package/dist/css/toggle.css +146 -0
  255. package/dist/css/tone.css +189 -0
  256. package/dist/css/tool-call.css +431 -0
  257. package/dist/css/toolbar.css +366 -0
  258. package/dist/css/tooltip.css +217 -0
  259. package/dist/css/tour.css +446 -0
  260. package/dist/css/transfer.css +644 -0
  261. package/dist/css/tree-select.css +878 -0
  262. package/dist/css/tree.css +734 -0
  263. package/dist/css/truncate.css +108 -0
  264. package/dist/css/typography.css +475 -0
  265. package/dist/css/undefined.css +58 -0
  266. package/dist/css/virtualizer.css +166 -0
  267. package/dist/css/visually-hidden.css +20 -0
  268. package/dist/css/watermark.css +82 -0
  269. package/dist/family/action-control.css +493 -0
  270. package/dist/family/chart.css +537 -0
  271. package/dist/family/check-mark.css +94 -0
  272. package/dist/family/choice-card.css +97 -0
  273. package/dist/family/collection-item.css +768 -0
  274. package/dist/family/field-chrome.css +296 -0
  275. package/dist/family/loading-ring.css +102 -0
  276. package/dist/family/material.css +72 -0
  277. package/dist/family/menu-choice.css +56 -0
  278. package/dist/family/motion.css +363 -0
  279. package/dist/family/swatch.css +59 -0
  280. package/dist/family/tag-list.css +65 -0
  281. package/family/action-control.css +33 -36
  282. package/family/chart.css +57 -0
  283. package/family/collection-item.css +12 -8
  284. package/family/field-chrome.css +28 -19
  285. package/family/loading-ring.css +20 -13
  286. package/family/swatch.css +4 -4
  287. package/family/tag-list.css +6 -0
  288. package/index.css +10349 -8756
  289. package/index.unlayered.css +10350 -8758
  290. package/package.json +165 -164
package/css/spinner.css CHANGED
@@ -40,6 +40,12 @@
40
40
  vertical-align: middle;
41
41
  }
42
42
 
43
+ /* 竖排:转圈在上、配文在下居中,整块区域的等待用它 */
44
+ [data-scope='spinner'][data-part='root'][data-orientation='vertical'] {
45
+ flex-direction: column;
46
+ gap: var(--xh-spinner-gap, var(--xh-space-1_5));
47
+ }
48
+
43
49
  /* 露面前的等待:整块藏起、位置照留,露面那一刻布局不跳;visibility 同时把它从读屏里摘掉 */
44
50
  [data-scope='spinner'][data-part='root'][data-state='hidden'] {
45
51
  visibility: hidden;
@@ -53,10 +59,10 @@
53
59
  flex: none;
54
60
  inline-size: var(--xh-spinner-size, var(--xh-glyph-size-md));
55
61
  block-size: var(--xh-spinner-size, var(--xh-glyph-size-md));
56
- border: var(--xh-spinner-thickness, var(--xh-stroke-thick)) solid var(--xh-spinner-track, var(--xh-border-default));
62
+ border: var(--xh-spinner-thickness, var(--xh-stroke-thick)) solid var(--xh-spinner-fg, var(--xh-fg-brand));
57
63
 
58
- /* 一整圈是轨道色,只有起始边换成前景色,转起来才看得出方向 */
59
- border-block-start-color: var(--xh-spinner-fg, currentColor);
64
+ /* 一段 270° 的品牌色弧:起始边那一段是缺口(不画轨道,缺省透明),缺口转起来就看得出方向 */
65
+ border-block-start-color: var(--xh-spinner-track, transparent);
60
66
  border-radius: var(--xh-spinner-radius, var(--xh-shape-circle));
61
67
  animation: xh-spin var(--xh-spinner-duration, var(--xh-motion-loop-spin)) var(--xh-motion-ease-loop) infinite;
62
68
  }
@@ -73,12 +79,12 @@
73
79
  block-size: var(--xh-glyph-size-lg);
74
80
  }
75
81
 
76
- /* 语气只换起始边那一段,轨道留在中性描边上:轨道与起始边的反差就是转向的读法,
77
- 两者同时换成同一族颜色,转到哪儿就看不出来了。
82
+ /* 语气只换弧那三段,缺口照旧:弧与缺口的反差就是转向的读法。
78
83
  选择器上带 [data-tone] 是必需的:语气槽会沿继承流下来,不限定在写了语气的
79
84
  那个节点上,放在语气容器里的转圈会跟着一起改色 */
80
85
  [data-scope='spinner'][data-part='root'][data-tone]::before {
81
- border-block-start-color: var(--xh-spinner-fg, var(--xh-_tone));
86
+ border-color: var(--xh-spinner-fg, var(--xh-_tone));
87
+ border-block-start-color: var(--xh-spinner-track, transparent);
82
88
  }
83
89
 
84
90
  /*
@@ -88,7 +94,7 @@
88
94
  */
89
95
  [data-scope='spinner'][data-part='root'][data-variant='arc']::before {
90
96
  border: 0;
91
- background: conic-gradient(transparent, var(--xh-spinner-fg, currentColor));
97
+ background: conic-gradient(transparent, var(--xh-spinner-fg, var(--xh-fg-brand)));
92
98
  -webkit-mask: radial-gradient(
93
99
  farthest-side,
94
100
  transparent calc(100% - var(--xh-spinner-thickness, var(--xh-stroke-thick))),
@@ -107,7 +113,7 @@
107
113
 
108
114
  /*
109
115
  * 三点:一行三枚圆点,依次亮起成一道波。它不转,因此圆角与描边都撤掉,
110
- * 图形改由三层径向渐变画;点的颜色走 currentColor,语气档只换这一处。
116
+ * 图形改由三层径向渐变画;点取品牌色,语气档只换这一处。
111
117
  * 明暗不靠整组的不透明度(那样三点同步明灭,读起来像整体在闪),而是一层三倍宽的遮罩:
112
118
  * 两端压在禁用档的不透明度,正中一道满不透明度的亮带,遮罩位置从行首外扫到行尾外,
113
119
  * 亮带依次掠过三枚点。
@@ -118,9 +124,9 @@
118
124
  border: 0;
119
125
  border-radius: 0;
120
126
  background:
121
- radial-gradient(circle closest-side, var(--xh-spinner-fg, currentColor) 100%, transparent) 0 50% / 25% 25% no-repeat,
122
- radial-gradient(circle closest-side, var(--xh-spinner-fg, currentColor) 100%, transparent) 50% 50% / 25% 25% no-repeat,
123
- radial-gradient(circle closest-side, var(--xh-spinner-fg, currentColor) 100%, transparent) 100% 50% / 25% 25% no-repeat;
127
+ radial-gradient(circle closest-side, var(--xh-spinner-fg, var(--xh-fg-brand)) 100%, transparent) 0 50% / 25% 25% no-repeat,
128
+ radial-gradient(circle closest-side, var(--xh-spinner-fg, var(--xh-fg-brand)) 100%, transparent) 50% 50% / 25% 25% no-repeat,
129
+ radial-gradient(circle closest-side, var(--xh-spinner-fg, var(--xh-fg-brand)) 100%, transparent) 100% 50% / 25% 25% no-repeat;
124
130
  -webkit-mask: linear-gradient(90deg, var(--xh-_spinner-dot-dim) 40%, currentColor 50%, var(--xh-_spinner-dot-dim) 60%) 100% 0 / 300% 100% no-repeat;
125
131
  mask: linear-gradient(90deg, var(--xh-_spinner-dot-dim) 40%, currentColor 50%, var(--xh-_spinner-dot-dim) 60%) 100% 0 / 300% 100% no-repeat;
126
132
  animation: xh-spinner-dots var(--xh-spinner-duration, var(--xh-motion-loop-spin)) var(--xh-motion-ease-loop) infinite;
@@ -159,9 +165,11 @@
159
165
  }
160
166
  }
161
167
 
168
+ /* 配文与转圈同一族颜色:品牌色、正文字号、中等字重 */
162
169
  [data-scope='spinner'][data-part='label'] {
163
- color: var(--xh-spinner-label-fg, var(--xh-fg-muted));
164
- font-size: var(--xh-spinner-label-size, var(--xh-text-secondary-size));
170
+ color: var(--xh-spinner-label-fg, var(--xh-fg-brand));
171
+ font-size: var(--xh-spinner-label-size, var(--xh-text-body-size));
172
+ font-weight: var(--xh-spinner-label-weight, var(--xh-font-weight-medium));
165
173
  line-height: var(--xh-leading-none);
166
174
  }
167
175
 
@@ -171,7 +179,7 @@
171
179
  @media (prefers-reduced-motion: reduce) {
172
180
  [data-scope='spinner'][data-part='root']::before {
173
181
  border-style: dotted;
174
- border-color: var(--xh-spinner-fg, currentColor);
182
+ border-color: var(--xh-spinner-fg, var(--xh-fg-brand));
175
183
  animation: none;
176
184
  }
177
185
 
@@ -183,7 +191,7 @@
183
191
 
184
192
  :where([data-motion='reduce']) [data-scope='spinner'][data-part='root']::before {
185
193
  border-style: dotted;
186
- border-color: var(--xh-spinner-fg, currentColor);
194
+ border-color: var(--xh-spinner-fg, var(--xh-fg-brand));
187
195
  animation: none;
188
196
  }
189
197
 
@@ -204,7 +212,7 @@
204
212
  并成一条之后这层配对关系在文本上就断了。 */
205
213
  [data-scope='spinner'][data-part='root']::before {
206
214
  border-style: dotted;
207
- border-color: var(--xh-spinner-fg, currentColor);
215
+ border-color: var(--xh-spinner-fg, var(--xh-fg-brand));
208
216
  animation: none;
209
217
  }
210
218
 
@@ -215,13 +223,25 @@
215
223
 
216
224
  /*
217
225
  * 高对比档:这一档把整层背景图丢掉,而渐隐弧与三点都画在背景上——屏幕上会一片空白。
218
- * 两档一并退回描边画法:一圈系统轨道色加一段高亮的起始边,转的还是同一条动画。
226
+ * 三档一并退回环档的画法:高亮色的弧加一段画布色的缺口,转的还是同一条动画。
227
+ * 伪元素退出强制换色、直接写系统色,缺口不被换成别的颜色。
228
+ * 带语气的那几条([data-tone]、[data-variant][data-tone])特指度更高,这里逐条写上同样的限定:
229
+ * 退出了强制换色的伪元素不会再被系统改色,少一条语气色的弧或渐变就原样画出来
219
230
  */
220
231
  @media (forced-colors: active) {
232
+ [data-scope='spinner'][data-part='root']::before,
233
+ [data-scope='spinner'][data-part='root'][data-tone]::before {
234
+ forced-color-adjust: none;
235
+ border-color: Highlight;
236
+ border-block-start-color: Canvas;
237
+ }
238
+
221
239
  [data-scope='spinner'][data-part='root'][data-variant='arc']::before,
222
- [data-scope='spinner'][data-part='root'][data-variant='dots']::before {
223
- border: var(--xh-spinner-thickness, var(--xh-stroke-thick)) solid CanvasText;
224
- border-block-start-color: Highlight;
240
+ [data-scope='spinner'][data-part='root'][data-variant='arc'][data-tone]::before,
241
+ [data-scope='spinner'][data-part='root'][data-variant='dots']::before,
242
+ [data-scope='spinner'][data-part='root'][data-variant='dots'][data-tone]::before {
243
+ border: var(--xh-spinner-thickness, var(--xh-stroke-thick)) solid Highlight;
244
+ border-block-start-color: Canvas;
225
245
  border-radius: var(--xh-spinner-radius, var(--xh-shape-circle));
226
246
  background-image: none;
227
247
  }
package/css/statistic.css CHANGED
@@ -13,10 +13,10 @@
13
13
 
14
14
  /* 三个尺寸档只换这几个私有槽,各段从 root 继承它们,换档不必给每个部件各写一条选择器 */
15
15
  [data-scope='statistic'][data-part='root'] {
16
- --xh-_statistic-label-size: var(--xh-control-caption-md);
17
- --xh-_statistic-value-size: var(--xh-text-heading-2-size);
16
+ --xh-_statistic-label-size: var(--xh-control-font-md);
17
+ --xh-_statistic-value-size: var(--xh-text-heading-1-size);
18
18
  --xh-_statistic-affix-size: var(--xh-control-font-md);
19
- --xh-_statistic-row-gap: var(--xh-space-1);
19
+ --xh-_statistic-row-gap: var(--xh-space-2);
20
20
  /* 涨跌箭头与作者塞进来的图标同一把尺:跟着前后缀那一档字(14px)走,取 sm 字形 16px,大档抬到 md */
21
21
  --xh-_statistic-icon-size: var(--xh-glyph-size-sm);
22
22
  --xh-icon-size: var(--xh-statistic-icon-size, var(--xh-_statistic-icon-size));
@@ -38,17 +38,17 @@
38
38
 
39
39
  /* —— 尺寸 —— */
40
40
  [data-scope='statistic'][data-part='root'][data-size='sm'] {
41
- --xh-_statistic-label-size: var(--xh-control-caption-sm);
42
- --xh-_statistic-value-size: var(--xh-text-heading-3-size);
41
+ --xh-_statistic-label-size: var(--xh-control-font-sm);
42
+ --xh-_statistic-value-size: var(--xh-text-heading-2-size);
43
43
  --xh-_statistic-affix-size: var(--xh-control-font-sm);
44
- --xh-_statistic-row-gap: var(--xh-space-0_5);
44
+ --xh-_statistic-row-gap: var(--xh-space-1);
45
45
  }
46
46
 
47
47
  [data-scope='statistic'][data-part='root'][data-size='lg'] {
48
- --xh-_statistic-label-size: var(--xh-control-caption-lg);
49
- --xh-_statistic-value-size: var(--xh-text-heading-1-size);
48
+ --xh-_statistic-label-size: var(--xh-control-font-lg);
49
+ --xh-_statistic-value-size: var(--xh-text-display-size);
50
50
  --xh-_statistic-affix-size: var(--xh-control-font-lg);
51
- --xh-_statistic-row-gap: var(--xh-space-1_5);
51
+ --xh-_statistic-row-gap: var(--xh-space-3);
52
52
  --xh-_statistic-icon-size: var(--xh-glyph-size-md);
53
53
  }
54
54
 
@@ -67,17 +67,17 @@
67
67
  color: var(--xh-statistic-value-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
68
68
  font-size: var(--xh-statistic-value-font-size, var(--xh-_statistic-value-size));
69
69
  font-variant-numeric: tabular-nums;
70
- font-weight: var(--xh-font-weight-semibold);
71
- line-height: var(--xh-leading-tight);
70
+ font-weight: var(--xh-font-weight-medium);
71
+ line-height: var(--xh-leading-normal);
72
72
  }
73
73
 
74
- /* 前后缀比数值小一档、跟着数值的语气走;没写语气时退成弱前景 */
74
+ /* 前后缀比数值小一档,颜色与字重同数值:它们是这个数的一部分(货币符号、单位),不是旁注 */
75
75
  [data-scope='statistic'][data-part='prefix'],
76
76
  [data-scope='statistic'][data-part='suffix'] {
77
- color: var(--xh-statistic-affix-fg, var(--xh-_tone-fg, var(--xh-fg-muted)));
77
+ color: var(--xh-statistic-affix-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
78
78
  font-size: var(--xh-statistic-affix-font-size, var(--xh-_statistic-affix-size));
79
79
  font-variant-numeric: tabular-nums;
80
- font-weight: var(--xh-font-weight-regular);
80
+ font-weight: var(--xh-font-weight-medium);
81
81
  line-height: var(--xh-leading-tight);
82
82
  }
83
83
 
package/css/steps.css CHANGED
@@ -32,36 +32,35 @@
32
32
  --xh-icon-size: var(--xh-steps-icon-size, var(--xh-glyph-size-md));
33
33
 
34
34
  /* 尺寸档只换这三个私有槽,序号圆点、标题与圆点里的序号都从 root 继承它们,
35
- 换档不必给每个部件各写一条选择器;说明走说明角色(13px),不随档。
36
- 圆点与 Avatar、带框 Icon 同一把尺:control-h 的 sm / md / lg,随密度换档 */
37
- --xh-_steps-indicator-size: var(--xh-control-h-md);
38
- --xh-_steps-title-font-size: var(--xh-control-font-md);
39
- --xh-_steps-caption-font-size: var(--xh-text-caption-size);
35
+ 换档不必给每个部件各写一条选择器;说明走次级标注(12px),不随档。
36
+ 圆点取状态圆那把尺:marker-size 的 sm / md / lg(24 / 28 / 32),比同档控件矮一档,随密度换档;
37
+ 圆里的序号比同档控件字大一档(sm 14、md / lg 16);标题取区块标题档 heading-3(sm 收回正文字号) */
38
+ --xh-_steps-indicator-size: var(--xh-marker-size-md);
39
+ --xh-_steps-title-font-size: var(--xh-text-heading-3-size);
40
+ --xh-_steps-indicator-font-size: var(--xh-control-font-lg);
40
41
  /* 圆点一圈边的宽:序号圆点是细边(多数状态透明占位),点状形态的空心圈要粗一档才读得出是个圈 */
41
42
  --xh-_steps-indicator-border-width: var(--xh-stroke-thin);
42
- /* 圆点四周给当前步那圈环留的位置:序号圆点不留,点状形态留出环的宽度,换步不挪版面 */
43
+ /* 圆点四周的留位:序号圆点不留;点状形态按当前步放大后的直径给每个点留位,换步不挪版面 */
43
44
  --xh-_steps-indicator-margin: var(--xh-space-0);
44
- /* 当前步那圈环:离圆点边一道缝,环本身一道粗描边宽 */
45
+ /* 当前步的进度环:离圆点边一道缝,环本身一道粗描边宽 */
45
46
  --xh-_steps-ring-gap: var(--xh-space-0_5);
46
47
  --xh-_steps-ring-thickness: var(--xh-stroke-thick);
47
48
 
48
- /* 语气落在当前步的标记、走过那几步的对号与连接线上:强调色画描边与填充,
49
- accent-text 是普通底上的强调文字(走过与当前步的标题),on-accent 是实心底上的前景。
50
- 没写 data-tone 时 --xh-_tone 一族没被声明,三个槽都退回原来的品牌配色。
51
- 走过的步不再用品牌淡底(brand-subtle 退出 completed 语义),淡底那两支私有槽随之撤掉 */
49
+ /* 语气落在当前步的标记、走过那几步的淡底与对号、连接线上:强调色画描边与填充,
50
+ accent-subtle 一族是走过那几步的淡底三档(静息 / 悬停 / 按下),on-accent 是实心底上的前景。
51
+ 没写 data-tone 时 --xh-_tone 一族没被声明,这几个槽都退回品牌配色 */
52
52
  --xh-_steps-accent: var(--xh-_tone, var(--xh-bg-brand));
53
- --xh-_steps-accent-text: var(--xh-_tone-fg, var(--xh-fg-brand-strong));
54
- /* 走过的步里那枚对号:中性淡底上的品牌色标记,不用标题那档更深的字色 */
53
+ --xh-_steps-accent-subtle: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
54
+ --xh-_steps-accent-subtle-hover: var(--xh-_tone-subtle-hover, var(--xh-bg-brand-subtle-hover));
55
+ --xh-_steps-accent-subtle-active: var(--xh-_tone-subtle-active, var(--xh-bg-brand-subtle-active));
56
+ /* 走过的步里那枚对号:淡底上的强调色标记 */
55
57
  --xh-_steps-accent-mark: var(--xh-_tone-fg, var(--xh-fg-brand));
56
58
  --xh-_steps-on-accent: var(--xh-_tone-on, var(--xh-fg-on-brand));
57
- /* 触发器是序号圆点的承载面:圆点静息就坐在 --xh-bg-subtle(100)的淡底上,阶梯按淡底容器走
59
+ /* 触发器是序号圆点的承载面:没走到的圆点静息就坐在 --xh-bg-subtle(100)的淡底上,阶梯按淡底容器走
58
60
  (hover 200 → pressed 300)。两支私有槽是这一档的唯一来源——触发器拿它们给
59
61
  --xh-action-host-bg-* 赋值(桥接槽只写不读),圆点悬停 / 按下读同一支私有槽,即与宿主的 host 槽同源 */
60
62
  --xh-_steps-host-bg-hover: var(--xh-bg-subtle-hover);
61
63
  --xh-_steps-host-bg-pressed: var(--xh-bg-subtle-active);
62
- /* 走过的那几步是实心圆,顶边画一条极浅的内高光把它衬出厚度 */
63
- --xh-_steps-highlight: inset 0 var(--xh-stroke-thin) 0 0
64
- color-mix(in oklab, var(--xh-_steps-on-accent) 14%, transparent);
65
64
 
66
65
  display: flex;
67
66
  flex-direction: column;
@@ -87,33 +86,36 @@
87
86
  /* 缺省档写在上面的基础规则里 */
88
87
  [data-scope='steps'][data-part='root'][data-size='sm'] {
89
88
  --xh-icon-size: var(--xh-steps-icon-size, var(--xh-glyph-size-sm));
90
- --xh-_steps-indicator-size: var(--xh-control-h-sm);
91
- --xh-_steps-title-font-size: var(--xh-control-font-sm);
92
- /* 字号档最小就是 xs,序号不再往下走,故不重声明 caption */
89
+ --xh-_steps-indicator-size: var(--xh-marker-size-sm);
90
+ --xh-_steps-title-font-size: var(--xh-text-body-size);
91
+ --xh-_steps-indicator-font-size: var(--xh-control-font-md);
93
92
  }
94
93
 
94
+ /* 大档的序号与标题都与中档同档:圆只大一档,字再放大就顶到圆边;标题已是区块标题档 */
95
95
  [data-scope='steps'][data-part='root'][data-size='lg'] {
96
96
  --xh-icon-size: var(--xh-steps-icon-size, var(--xh-glyph-size-lg));
97
- --xh-_steps-indicator-size: var(--xh-control-h-lg);
98
- --xh-_steps-title-font-size: var(--xh-control-font-lg);
99
- --xh-_steps-caption-font-size: var(--xh-text-secondary-size);
97
+ --xh-_steps-indicator-size: var(--xh-marker-size-lg);
100
98
  }
101
99
 
102
100
  /* —— 点状形态 —— */
103
- /* 圆点不盛内容,是纯位置标记:直径不在控件高度那把尺上,与 Timeline 圆点同走空间尺相邻的三格,
104
- 不随密度换档;描边粗一档,四周留出当前步那圈环的宽度 */
101
+ /* 圆点不盛内容,是纯位置标记:直径不在控件高度那把尺上,走空间尺,不随密度换档;描边粗一档。
102
+ 走过与没走到的点 8px,当前步放大一档到 10px(sm 6 / 8、lg 10 / 12):大小是当前步与走过的步之间的形状通道。
103
+ 每个点都按当前步的直径占位,小一档的点四周补半档留位,换步时版面不挪、点心仍在同一条线上 */
105
104
  [data-scope='steps'][data-part='root'][data-variant='dot'] {
106
- --xh-_steps-indicator-size: var(--xh-space-2_5);
105
+ --xh-_steps-indicator-size: var(--xh-space-2);
106
+ --xh-_steps-indicator-current-size: var(--xh-space-2_5);
107
107
  --xh-_steps-indicator-border-width: var(--xh-stroke-thick);
108
- --xh-_steps-indicator-margin: calc(var(--xh-_steps-ring-gap) + var(--xh-_steps-ring-thickness));
108
+ --xh-_steps-indicator-margin: calc((var(--xh-_steps-indicator-current-size) - var(--xh-_steps-indicator-size)) * 0.5);
109
109
  }
110
110
 
111
111
  [data-scope='steps'][data-part='root'][data-variant='dot'][data-size='sm'] {
112
- --xh-_steps-indicator-size: var(--xh-space-2);
112
+ --xh-_steps-indicator-size: var(--xh-space-1_5);
113
+ --xh-_steps-indicator-current-size: var(--xh-space-2);
113
114
  }
114
115
 
115
116
  [data-scope='steps'][data-part='root'][data-variant='dot'][data-size='lg'] {
116
- --xh-_steps-indicator-size: var(--xh-space-3);
117
+ --xh-_steps-indicator-size: var(--xh-space-2_5);
118
+ --xh-_steps-indicator-current-size: var(--xh-space-3);
117
119
  }
118
120
 
119
121
  /* 步骤与连接线必须保持在同一条流程轴上,空间不足时由标题省略而不是拆成两行。 */
@@ -199,19 +201,22 @@
199
201
  --xh-action-host-bg-hover: var(--xh-_steps-host-bg-hover);
200
202
  --xh-action-host-bg-pressed: var(--xh-_steps-host-bg-pressed);
201
203
 
202
- /* 皮肤规则排在 @import 之后,同特指度盖过 row 档的 display: flex */
203
- display: grid;
204
204
  grid-template-columns: auto minmax(0, 1fr);
205
205
  align-items: center;
206
206
  column-gap: var(--xh-steps-trigger-gap, var(--xh-control-gap-md));
207
- /* row 档铺满容器(inline-size: 100%)会把横排的连接线压到最小长度 */
208
- inline-size: auto;
209
207
  /* 纵向连接线的 margin-inline-start 按圆点半径 + trigger-p 对齐圆心,ghost 的 1px 透明边位会让它错 1px */
210
208
  border-width: 0;
211
209
  font: inherit;
212
210
  text-align: start;
213
211
  }
214
212
 
213
+ /* 两列排版、按内容收宽,盖掉 row 档的 display: flex 与 inline-size: 100%(横排的连接线会被压到最小长度)。
214
+ 从条目往下写,特指度高过 row 档,有层与无层两份产物里都生效;收起的触发器留给下面 [hidden] 那条 */
215
+ [data-scope='steps'][data-part='item'] [data-scope='steps'][data-part='trigger']:not([hidden]) {
216
+ display: grid;
217
+ inline-size: auto;
218
+ }
219
+
215
220
  /* 只读展示:trigger 不投影 Action Control,只是「序号 + 标题 + 说明」的排版容器——内距与可操作时同一把尺,
216
221
  在两种形态间切换版面不跳;没有悬停、按压与焦点环,标题与说明不置灰 */
217
222
  [data-scope='steps'][data-part='trigger'][data-readonly] {
@@ -228,14 +233,14 @@
228
233
  color: var(--xh-fg-disabled);
229
234
  }
230
235
 
231
- /* 序号圆点:未开始使用中性面,当前步骤实心强调,已完成步骤中性面上画品牌对号。 */
236
+ /* 序号圆点:没走到的中性淡底配次级字色,当前步品牌实心配反白字,走过的步品牌淡底配品牌对号;三态都无边无影 */
232
237
  [data-scope='steps'][data-part='indicator'] {
233
238
  /* 圆点里的字形是指示符:对号按指示符档取尺、随密度换档(comfortable 16 / compact 14),
234
239
  不读 root 上只管作者标题 / 说明图标的 --xh-steps-icon-size;作者塞进圆点的 XhIcon 与兜底对号同一把尺。
235
- 圆点自己走 control-h 的尺(最小 compact sm 的 28px),两档字形在三档圆点里都留得出边距 */
240
+ 圆点自己走 marker-size 的尺(最小 compact sm 的 20px),两档字形在三档圆点里都留得出边距 */
236
241
  --xh-icon-size: var(--xh-steps-indicator-mark-size, var(--xh-control-indicator-size));
237
242
 
238
- /* 当前步那圈环(::after)以圆点为准绳定位 */
243
+ /* 当前步的进度环(::after)以圆点为准绳定位 */
239
244
  position: relative;
240
245
  display: inline-flex;
241
246
  grid-row: 1 / span 2;
@@ -248,7 +253,7 @@
248
253
  border-radius: var(--xh-steps-indicator-radius, var(--xh-shape-circle));
249
254
  background: var(--xh-steps-indicator-bg, var(--xh-bg-subtle));
250
255
  color: var(--xh-steps-indicator-fg, var(--xh-fg-muted));
251
- font-size: var(--xh-steps-indicator-font-size, var(--xh-_steps-caption-font-size));
256
+ font-size: var(--xh-steps-indicator-font-size, var(--xh-_steps-indicator-font-size));
252
257
  font-weight: var(--xh-font-weight-medium);
253
258
  /* 等宽数字:1 与 7 的字形宽度在比例字体里并不相同,不定住会让序号左右抖一格 */
254
259
  font-variant-numeric: tabular-nums;
@@ -266,27 +271,34 @@
266
271
 
267
272
  /* 圆点是格状当前的标记,但不是激活宿主:宿主是投影了 row 档的触发器;圆点在宿主的
268
273
  :hover / :is(:active, [data-pressed]) 下读宿主 host 槽的同一来源换面,同一时间线,不缩放——
269
- 圆点自己是 100 的淡底,坐在触发器的 hover 面(100)上,再上一档到 200 才与承载面分得开,按下到 300;
270
- 当前步的实心面按下换语气 active 档 */
274
+ 没走到的圆点自己是 100 的淡底,坐在触发器的 hover 面(100)上,再上一档到 200 才与承载面分得开,按下到 300;
275
+ 走过的圆点走品牌淡底的阶梯(12% → 悬停 20% → 按下 28%);当前步的实心面按下换语气 active 档 */
271
276
  [data-scope='steps'][data-part='trigger']:hover:not([data-disabled], [data-readonly])
272
277
  [data-scope='steps'][data-part='indicator'][data-state='incomplete'] {
273
278
  background: var(--xh-steps-indicator-bg-hover, var(--xh-_steps-host-bg-hover));
274
279
  color: var(--xh-steps-indicator-fg-hover, var(--xh-fg-default));
275
280
  }
276
281
 
277
- /* 点状形态里走过的点是实心标记色,悬停不换成中性面:承载它的行换面即是悬停反馈 */
282
+ /* 点状形态里走过的点是实心标记色,悬停不换面:承载它的行换面即是悬停反馈 */
278
283
  [data-scope='steps'][data-part='trigger']:hover:not([data-disabled], [data-readonly])
279
284
  [data-scope='steps'][data-part='indicator'][data-state='completed']:not([data-variant='dot']) {
280
- background: var(--xh-steps-indicator-bg-completed-hover, var(--xh-_steps-host-bg-hover));
285
+ background: var(--xh-steps-indicator-bg-completed-hover, var(--xh-_steps-accent-subtle-hover));
281
286
  }
282
287
 
283
288
  [data-scope='steps'][data-part='trigger']:not([data-disabled], [data-readonly]):is(:active, [data-pressed])
284
- [data-scope='steps'][data-part='indicator']:is([data-state='incomplete'], [data-state='completed']:not([data-variant='dot'])) {
289
+ [data-scope='steps'][data-part='indicator'][data-state='incomplete'] {
285
290
  background: var(--xh-steps-indicator-bg-pressed, var(--xh-_steps-host-bg-pressed));
286
291
  transition-duration: var(--xh-motion-duration-press);
287
292
  transition-timing-function: var(--xh-motion-ease-press);
288
293
  }
289
294
 
295
+ [data-scope='steps'][data-part='trigger']:not([data-disabled], [data-readonly]):is(:active, [data-pressed])
296
+ [data-scope='steps'][data-part='indicator'][data-state='completed']:not([data-variant='dot']) {
297
+ background: var(--xh-steps-indicator-bg-completed-pressed, var(--xh-_steps-accent-subtle-active));
298
+ transition-duration: var(--xh-motion-duration-press);
299
+ transition-timing-function: var(--xh-motion-ease-press);
300
+ }
301
+
290
302
  [data-scope='steps'][data-part='trigger']:not([data-disabled], [data-readonly]):is(:active, [data-pressed])
291
303
  [data-scope='steps'][data-part='indicator'][data-state='current']:not([data-variant='dot']) {
292
304
  background: var(--xh-steps-indicator-bg-current-pressed, var(--xh-_tone-active, var(--xh-bg-brand-active)));
@@ -298,19 +310,19 @@
298
310
  border-color: var(--xh-steps-indicator-border-current, var(--xh-_steps-accent));
299
311
  background: var(--xh-steps-indicator-bg-current, var(--xh-_steps-accent));
300
312
  color: var(--xh-steps-indicator-fg-current, var(--xh-_steps-on-accent));
301
- box-shadow: var(--xh-steps-indicator-shadow, var(--xh-_steps-highlight));
313
+ box-shadow: var(--xh-steps-indicator-shadow, none);
302
314
  }
303
315
 
304
- /* 走过的步:中性淡底(透明边位)承一枚品牌色对号;标了语气的步对号跟语气的前景走 */
316
+ /* 走过的步:品牌淡底(透明边位)承一枚品牌色对号;标了语气的步淡底与对号跟语气走 */
305
317
  [data-scope='steps'][data-part='indicator'][data-state='completed'] {
306
318
  border-color: var(--xh-steps-indicator-border-completed, transparent);
307
- background: var(--xh-steps-indicator-bg-completed, var(--xh-bg-subtle));
319
+ background: var(--xh-steps-indicator-bg-completed, var(--xh-_steps-accent-subtle));
308
320
  color: var(--xh-steps-indicator-fg-completed, var(--xh-_steps-accent-mark));
309
321
  }
310
322
 
311
323
  /* 点状形态的三态:没走到的空心粗圈(墨色与序号形态的序号同一支),走过的实心标记色(序号形态里那枚对号的颜色),
312
- 当前步实心品牌(格状当前)外加一圈同色环。空心 / 实心 / 带环是形状通道,不只靠颜色分三态;
313
- 四周留出环的宽度,换步时版面不挪 */
324
+ 当前步实心品牌(格状当前)并放大一档。空心 / 实心 / 放大是形状通道,不只靠颜色分三态;
325
+ 每个点都按当前步的直径占位,换步时版面不挪 */
314
326
  [data-scope='steps'][data-part='indicator'][data-variant='dot'] {
315
327
  margin: var(--xh-_steps-indicator-margin);
316
328
  border-color: var(--xh-steps-indicator-border, var(--xh-fg-muted));
@@ -318,15 +330,16 @@
318
330
  }
319
331
 
320
332
  /* 实心的点底与圈同一色,取自 --xh-_steps-dot:走过的标记色、当前步品牌,按下换语气 active 档
321
- (与序号圆点当前步按下同一档),动不了的禁用墨色。小圆点上画不下实心那档的内高光 */
333
+ (与序号圆点当前步按下同一档),动不了的禁用墨色 */
322
334
  [data-scope='steps'][data-part='indicator'][data-variant='dot'][data-state='completed'] {
323
335
  --xh-_steps-dot: var(--xh-steps-indicator-bg-completed, var(--xh-_steps-accent-mark));
324
336
  }
325
337
 
338
+ /* 当前步的点放大一档、收掉补位:占的位置与别的点一样大 */
326
339
  [data-scope='steps'][data-part='indicator'][data-variant='dot'][data-state='current'] {
327
340
  --xh-_steps-dot: var(--xh-steps-indicator-bg-current, var(--xh-_steps-accent));
328
-
329
- box-shadow: none;
341
+ --xh-_steps-indicator-size: var(--xh-_steps-indicator-current-size);
342
+ --xh-_steps-indicator-margin: var(--xh-space-0);
330
343
  }
331
344
 
332
345
  [data-scope='steps'][data-part='trigger']:not([data-disabled], [data-readonly]):is(:active, [data-pressed])
@@ -352,11 +365,10 @@
352
365
  background: var(--xh-_steps-dot);
353
366
  }
354
367
 
355
- /* 当前步那圈环:离圆点边一道缝、一道粗描边宽,叠在圆点外面、不接指针;环面由一圈角向渐变经环形遮罩挖空中心得来。
356
- 弧(arc)从 12 点顺时针走到完成比例,其余是轨道(track):点状形态不带比例,轨道与弧同色,就是整圈实心环;
357
- 序号圆点带了比例(data-progress),轨道取连接线的底色,弧就是这一步走了多少。时钟式的走向是稳定身份,不随书写方向镜像。
358
- 静息收着,点状形态的当前步与带比例的当前步才亮出来,走到 / 离开这一步时按状态角色淡入淡出;
359
- 比例变化时弧按数值角色走(move / continuous),首帧直接落位 */
368
+ /* 当前步的进度环:离圆点边一道缝、一道粗描边宽,叠在圆点外面、不接指针;环面由一圈角向渐变经环形遮罩挖空中心得来。
369
+ 弧(arc)从 12 点顺时针走到完成比例,其余是轨道(track),取连接线的底色:弧就是这一步走了多少。
370
+ 时钟式的走向是稳定身份,不随书写方向镜像。静息收着,序号圆点带了比例(data-progress)的当前步才亮出来,
371
+ 走到 / 离开这一步时按状态角色淡入淡出;比例变化时弧按数值角色走(move / continuous),首帧直接落位 */
360
372
  [data-scope='steps'][data-part='indicator']::after {
361
373
  --xh-_steps-ring-arc: var(--xh-steps-indicator-ring-bg, var(--xh-_steps-accent));
362
374
  --xh-_steps-ring-track: var(--xh-_steps-ring-arc);
@@ -378,7 +390,7 @@
378
390
  --xh-_steps-progress var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
379
391
  }
380
392
 
381
- [data-scope='steps'][data-part='indicator'][data-state='current']:is([data-variant='dot'], [data-progress])::after {
393
+ [data-scope='steps'][data-part='indicator'][data-state='current'][data-progress]::after {
382
394
  opacity: 1;
383
395
  }
384
396
 
@@ -390,28 +402,46 @@
390
402
  --xh-_steps-ring-arc: var(--xh-steps-indicator-ring-bg-disabled, var(--xh-fg-disabled));
391
403
  }
392
404
 
393
- /* 单步语气:tones / collection 给某一步标了 data-tone,四个强调槽在这一步重新从语气层取值,
394
- 它的标记、标题与连接线照旧从祖先继承——只有这一步换色,状态那一档照算 */
405
+ /* 单步语气:tones / collection 给某一步标了 data-tone,强调槽在这一步重新从语气层取值,
406
+ 它的标记与连接线照旧从祖先继承——只有这一步换色,状态那一档照算 */
395
407
  [data-scope='steps'][data-part='item'][data-tone] {
396
408
  --xh-_steps-accent: var(--xh-_tone);
397
- --xh-_steps-accent-text: var(--xh-_tone-fg);
409
+ --xh-_steps-accent-subtle: var(--xh-_tone-subtle);
410
+ --xh-_steps-accent-subtle-hover: var(--xh-_tone-subtle-hover);
411
+ --xh-_steps-accent-subtle-active: var(--xh-_tone-subtle-active);
398
412
  --xh-_steps-accent-mark: var(--xh-_tone-fg);
399
413
  --xh-_steps-on-accent: var(--xh-_tone-on);
400
414
  }
401
415
 
402
- /* 标了语气的那一步还没走到也得被看见:空心描边加同色数字,不动实心那档的内高光 */
416
+ /* 标了语气的那一步还没走到也得被看见:与当前步同一副语气实心面配反白字(出错的那一步是危险色实心)。
417
+ 带上触发器这一层祖先,特指度才压得过没走到的圆点的悬停与按下面:悬停不换中性面,按下换语气 active 档 */
418
+ [data-scope='steps'][data-part='item'][data-tone] [data-scope='steps'][data-part='trigger']
419
+ [data-scope='steps'][data-part='indicator'][data-state='incomplete']:not([data-variant='dot']) {
420
+ border-color: var(--xh-steps-indicator-border-toned, var(--xh-_steps-accent));
421
+ background: var(--xh-steps-indicator-bg-toned, var(--xh-_steps-accent));
422
+ color: var(--xh-steps-indicator-fg-toned, var(--xh-_steps-on-accent));
423
+ }
424
+
403
425
  [data-scope='steps'][data-part='item'][data-tone]
404
- [data-scope='steps'][data-part='indicator'][data-state='incomplete'] {
426
+ [data-scope='steps'][data-part='trigger']:not([data-disabled], [data-readonly]):is(:active, [data-pressed])
427
+ [data-scope='steps'][data-part='indicator'][data-state='incomplete']:not([data-variant='dot']) {
428
+ background: var(--xh-steps-indicator-bg-current-pressed, var(--xh-_tone-active));
429
+ transition-duration: var(--xh-motion-duration-press);
430
+ transition-timing-function: var(--xh-motion-ease-press);
431
+ }
432
+
433
+ /* 点状形态里放不下实心面上的字,标了语气又没走到的点仍是空心圈:圈换语气色、心里只铺语气淡底 */
434
+ [data-scope='steps'][data-part='item'][data-tone]
435
+ [data-scope='steps'][data-part='indicator'][data-state='incomplete'][data-variant='dot'] {
405
436
  border-color: var(--xh-steps-indicator-border-toned, var(--xh-_steps-accent));
406
437
  background: var(--xh-steps-indicator-bg-toned, var(--xh-_tone-subtle));
407
- color: var(--xh-steps-indicator-fg-toned, var(--xh-_steps-accent-text));
408
438
  }
409
439
 
410
440
  [data-scope='steps'][data-part='item'][data-disabled] [data-scope='steps'][data-part='indicator'] {
411
441
  border-color: var(--xh-steps-indicator-border-disabled, var(--xh-border-default));
412
442
  background: var(--xh-steps-indicator-bg-disabled, var(--xh-bg-muted));
413
443
  color: var(--xh-steps-indicator-fg-disabled, var(--xh-fg-disabled));
414
- /* 这一步动不了,实心那档的内高光跟着收掉 */
444
+ /* 这一步动不了,作者给圆点加的影跟着收掉 */
415
445
  box-shadow: none;
416
446
  }
417
447
 
@@ -430,20 +460,25 @@
430
460
  transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
431
461
  }
432
462
 
463
+ /* 走到与走过的步标题取正文色,没走到的留在次级色;当前步再取区块标题的字重 */
433
464
  [data-scope='steps'][data-part='title']:is([data-state='current'], [data-state='completed']) {
434
- color: var(--xh-steps-title-fg-active, var(--xh-_steps-accent-text));
465
+ color: var(--xh-steps-title-fg-active, var(--xh-fg-default));
466
+ }
467
+
468
+ [data-scope='steps'][data-part='title'][data-state='current'] {
469
+ font-weight: var(--xh-steps-title-font-weight-current, var(--xh-text-heading-3-weight));
435
470
  }
436
471
 
437
- /* 标了语气的那一步标题跟着换色,不论走到没走到 */
472
+ /* 标了语气的那一步标题取正文色,不论走到没走到:语气由圆点的语气面表达,标题不染色 */
438
473
  [data-scope='steps'][data-part='item'][data-tone] [data-scope='steps'][data-part='title'] {
439
- color: var(--xh-steps-title-fg-toned, var(--xh-_steps-accent-text));
474
+ color: var(--xh-steps-title-fg-toned, var(--xh-fg-default));
440
475
  }
441
476
 
442
- /* 说明走说明角色:13 / fg-muted / leading-normal,不随 size 档 */
477
+ /* 说明走次级标注:12 / fg-subtle / leading-normal,不随 size 档 */
443
478
  [data-scope='steps'][data-part='description'] {
444
479
  grid-column: 2;
445
- color: var(--xh-steps-description-fg, var(--xh-fg-muted));
446
- font-size: var(--xh-steps-description-font-size, var(--xh-text-secondary-size));
480
+ color: var(--xh-steps-description-fg, var(--xh-fg-subtle));
481
+ font-size: var(--xh-steps-description-font-size, var(--xh-text-caption-size));
447
482
  line-height: var(--xh-leading-normal);
448
483
  overflow: hidden;
449
484
  white-space: nowrap;
@@ -456,7 +491,7 @@
456
491
  position: relative;
457
492
  flex: 1;
458
493
  min-inline-size: var(--xh-steps-separator-min-length, var(--xh-space-4));
459
- block-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thick));
494
+ block-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thin));
460
495
  border-radius: var(--xh-steps-separator-radius, var(--xh-shape-pill));
461
496
  background: var(--xh-steps-separator-bg, var(--xh-border-default));
462
497
  }
@@ -483,15 +518,15 @@
483
518
  /* 纵向时连接线转成竖的一条,缩进到与序号圆点同一条竖线上 */
484
519
  [data-scope='steps'][data-part='separator'][data-orientation='vertical'] {
485
520
  flex: none;
486
- inline-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thick));
487
- min-inline-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thick));
521
+ inline-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thin));
522
+ min-inline-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thin));
488
523
  block-size: var(--xh-steps-separator-min-length, var(--xh-space-7));
489
524
  /* 圆点半径加上它四周留给环的位置,减去线宽的一半:calc 里的除法要写成乘 0.5,除号在这儿是无效语法 */
490
525
  margin-inline-start: calc(
491
526
  var(--xh-steps-indicator-size, var(--xh-_steps-indicator-size)) * 0.5
492
527
  + var(--xh-_steps-indicator-margin)
493
528
  + var(--xh-steps-trigger-p, var(--xh-control-px-sm))
494
- - var(--xh-steps-separator-thickness, var(--xh-stroke-thick)) * 0.5
529
+ - var(--xh-steps-separator-thickness, var(--xh-stroke-thin)) * 0.5
495
530
  );
496
531
  }
497
532
 
@@ -554,7 +589,7 @@
554
589
  }
555
590
 
556
591
  /* 点状形态的点靠底色画实心,这一档里底色被换成 Canvas,走过与当前步的点会与空心的圈混成一样。
557
- 实心的点与当前步那圈环换成 CanvasText:整行悬停涂成 Highlight 时照样看得见,走过与当前步靠那圈环分开;
592
+ 实心的点换成 CanvasText:整行悬停涂成 Highlight 时照样看得见,走过与当前步靠当前步放大的那一档分开;
558
593
  动不了的取 GrayText */
559
594
  [data-scope='steps'][data-part='trigger'] [data-scope='steps'][data-part='indicator'][data-variant='dot']:not([data-state='incomplete']) {
560
595
  border-color: CanvasText;
@@ -593,21 +628,17 @@
593
628
  }
594
629
 
595
630
  @media print {
596
- /* 打印默认丢背景:走过那几步的实心底与里面那枚勾都印不出来,
597
- 当前步与走过的步只剩一模一样的一圈细描边。改用描边的粗细与字重表达同一件事 */
598
- [data-scope='steps'][data-part='indicator']:is([data-state='current'], [data-state='completed']) {
599
- border-width: var(--xh-stroke-thick);
631
+ /* 打印默认丢背景:当前步的实心底、走过那几步的淡底与里面那枚勾(mask 挖出的一块底色)都印不出来,
632
+ 走过的步还是透明边位,连圈都不剩。圆点、兜底对号与进度环照原色印,当前步标题再加粗一档 */
633
+ [data-scope='steps'][data-part='indicator'],
634
+ [data-scope='steps'][data-part='indicator']::before,
635
+ [data-scope='steps'][data-part='indicator']::after {
636
+ print-color-adjust: exact;
600
637
  }
601
638
 
602
639
  [data-scope='steps'][data-part='title'][data-state='current'] {
603
640
  font-weight: var(--xh-font-weight-semibold);
604
641
  }
605
-
606
- /* 点状形态的点与当前步那圈环都是底色画的,丢了底色走过与当前步就只剩空心圈:这两样照原色印 */
607
- [data-scope='steps'][data-part='indicator'][data-variant='dot'],
608
- [data-scope='steps'][data-part='indicator']::after {
609
- print-color-adjust: exact;
610
- }
611
642
  }
612
643
 
613
644
  @media (forced-colors: active) {