@xihan-ui/styles 3.2.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 (232) hide show
  1. package/CHANGELOG.md +441 -0
  2. package/component-tokens.d.ts +229 -60
  3. package/components.tokens.json +5124 -1555
  4. package/css/accordion.css +47 -20
  5. package/css/alert.css +14 -15
  6. package/css/anchor.css +2 -2
  7. package/css/approval.css +37 -13
  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 +4 -7
  15. package/css/calendar-picker.css +177 -94
  16. package/css/calendar-range-picker.css +206 -121
  17. package/css/card.css +34 -6
  18. package/css/carousel.css +65 -49
  19. package/css/cascader.css +41 -29
  20. package/css/checkbox-group.css +9 -6
  21. package/css/checkbox.css +5 -4
  22. package/css/citation.css +7 -2
  23. package/css/clipboard.css +20 -4
  24. package/css/collapsible.css +29 -14
  25. package/css/color-field.css +4 -4
  26. package/css/color-picker.css +77 -23
  27. package/css/color-slider.css +10 -8
  28. package/css/color-swatch-picker.css +5 -5
  29. package/css/combobox.css +14 -10
  30. package/css/command.css +13 -8
  31. package/css/context-menu.css +10 -5
  32. package/css/date-field.css +4 -4
  33. package/css/date-picker.css +165 -102
  34. package/css/date-range-picker.css +186 -123
  35. package/css/description.css +10 -6
  36. package/css/descriptions.css +47 -19
  37. package/css/dialog.css +50 -35
  38. package/css/drawer.css +75 -21
  39. package/css/editable.css +15 -41
  40. package/css/empty-state.css +21 -3
  41. package/css/field-array.css +4 -1
  42. package/css/field.css +17 -18
  43. package/css/fieldset.css +33 -13
  44. package/css/file-upload.css +65 -32
  45. package/css/float-button.css +25 -15
  46. package/css/floating-panel.css +1 -1
  47. package/css/form.css +24 -10
  48. package/css/grid-list.css +1 -1
  49. package/css/highlight.css +4 -4
  50. package/css/hover-card.css +19 -12
  51. package/css/image-viewer.css +77 -27
  52. package/css/image.css +12 -4
  53. package/css/infinite-scroll.css +8 -4
  54. package/css/input-group.css +74 -26
  55. package/css/kbd.css +1 -1
  56. package/css/label.css +27 -11
  57. package/css/layout.css +17 -10
  58. package/css/list.css +13 -9
  59. package/css/listbox.css +12 -7
  60. package/css/loading-bar.css +3 -0
  61. package/css/mention.css +10 -8
  62. package/css/menu.css +10 -5
  63. package/css/menubar.css +13 -8
  64. package/css/navigation-menu.css +2 -2
  65. package/css/notification.css +114 -31
  66. package/css/number-animation.css +2 -2
  67. package/css/number-field.css +60 -37
  68. package/css/page-header.css +63 -26
  69. package/css/pagination.css +35 -38
  70. package/css/password-input.css +10 -66
  71. package/css/pin-input.css +18 -26
  72. package/css/popconfirm.css +20 -11
  73. package/css/popover.css +18 -12
  74. package/css/progress.css +14 -13
  75. package/css/prompt-input.css +3 -3
  76. package/css/question-flow.css +33 -7
  77. package/css/radio-group.css +120 -55
  78. package/css/rating.css +31 -14
  79. package/css/select.css +14 -10
  80. package/css/separator.css +22 -4
  81. package/css/side-nav.css +16 -11
  82. package/css/signature-pad.css +23 -9
  83. package/css/skeleton.css +7 -7
  84. package/css/slider.css +71 -42
  85. package/css/sparkline.css +8 -2
  86. package/css/spinner.css +40 -20
  87. package/css/statistic.css +14 -14
  88. package/css/steps.css +115 -84
  89. package/css/switch.css +9 -7
  90. package/css/table.css +27 -10
  91. package/css/tabs.css +35 -12
  92. package/css/tag-group.css +17 -6
  93. package/css/tag.css +54 -29
  94. package/css/tags-input.css +38 -19
  95. package/css/text-field.css +5 -5
  96. package/css/time-field.css +4 -4
  97. package/css/time-picker.css +150 -64
  98. package/css/time-range-picker.css +91 -62
  99. package/css/timeline.css +37 -20
  100. package/css/timer.css +3 -3
  101. package/css/toggle-group.css +4 -4
  102. package/css/tool-call.css +6 -4
  103. package/css/toolbar.css +6 -5
  104. package/css/tooltip.css +15 -16
  105. package/css/tour.css +14 -7
  106. package/css/transfer.css +22 -16
  107. package/css/tree-select.css +10 -10
  108. package/css/tree.css +26 -25
  109. package/css/typography.css +28 -25
  110. package/dist/css/accordion.css +47 -20
  111. package/dist/css/alert.css +14 -15
  112. package/dist/css/anchor.css +2 -2
  113. package/dist/css/approval.css +37 -13
  114. package/dist/css/avatar-group.css +9 -12
  115. package/dist/css/avatar.css +20 -18
  116. package/dist/css/back-top.css +21 -7
  117. package/dist/css/badge.css +5 -5
  118. package/dist/css/breadcrumb.css +18 -16
  119. package/dist/css/button-group.css +4 -6
  120. package/dist/css/button.css +4 -7
  121. package/dist/css/calendar-picker.css +177 -94
  122. package/dist/css/calendar-range-picker.css +206 -121
  123. package/dist/css/card.css +34 -6
  124. package/dist/css/carousel.css +65 -49
  125. package/dist/css/cascader.css +41 -29
  126. package/dist/css/checkbox-group.css +9 -6
  127. package/dist/css/checkbox.css +5 -4
  128. package/dist/css/citation.css +7 -2
  129. package/dist/css/clipboard.css +20 -4
  130. package/dist/css/collapsible.css +29 -14
  131. package/dist/css/color-field.css +4 -4
  132. package/dist/css/color-picker.css +77 -23
  133. package/dist/css/color-slider.css +10 -8
  134. package/dist/css/color-swatch-picker.css +5 -5
  135. package/dist/css/combobox.css +14 -10
  136. package/dist/css/command.css +13 -8
  137. package/dist/css/context-menu.css +10 -5
  138. package/dist/css/date-field.css +4 -4
  139. package/dist/css/date-picker.css +165 -102
  140. package/dist/css/date-range-picker.css +186 -123
  141. package/dist/css/description.css +10 -6
  142. package/dist/css/descriptions.css +47 -19
  143. package/dist/css/dialog.css +50 -35
  144. package/dist/css/drawer.css +75 -21
  145. package/dist/css/editable.css +15 -41
  146. package/dist/css/empty-state.css +21 -3
  147. package/dist/css/field-array.css +4 -1
  148. package/dist/css/field.css +17 -18
  149. package/dist/css/fieldset.css +33 -13
  150. package/dist/css/file-upload.css +65 -32
  151. package/dist/css/float-button.css +25 -15
  152. package/dist/css/floating-panel.css +1 -1
  153. package/dist/css/form.css +24 -10
  154. package/dist/css/grid-list.css +1 -1
  155. package/dist/css/highlight.css +4 -4
  156. package/dist/css/hover-card.css +19 -12
  157. package/dist/css/image-viewer.css +77 -27
  158. package/dist/css/image.css +12 -4
  159. package/dist/css/infinite-scroll.css +8 -4
  160. package/dist/css/input-group.css +74 -26
  161. package/dist/css/kbd.css +1 -1
  162. package/dist/css/label.css +27 -11
  163. package/dist/css/layout.css +17 -10
  164. package/dist/css/list.css +13 -9
  165. package/dist/css/listbox.css +12 -7
  166. package/dist/css/loading-bar.css +3 -0
  167. package/dist/css/mention.css +10 -8
  168. package/dist/css/menu.css +10 -5
  169. package/dist/css/menubar.css +13 -8
  170. package/dist/css/navigation-menu.css +2 -2
  171. package/dist/css/notification.css +114 -31
  172. package/dist/css/number-animation.css +2 -2
  173. package/dist/css/number-field.css +60 -37
  174. package/dist/css/page-header.css +63 -26
  175. package/dist/css/pagination.css +35 -38
  176. package/dist/css/password-input.css +10 -66
  177. package/dist/css/pin-input.css +18 -26
  178. package/dist/css/popconfirm.css +20 -11
  179. package/dist/css/popover.css +18 -12
  180. package/dist/css/progress.css +14 -13
  181. package/dist/css/prompt-input.css +3 -3
  182. package/dist/css/question-flow.css +33 -7
  183. package/dist/css/radio-group.css +120 -55
  184. package/dist/css/rating.css +31 -14
  185. package/dist/css/select.css +14 -10
  186. package/dist/css/separator.css +22 -4
  187. package/dist/css/side-nav.css +16 -11
  188. package/dist/css/signature-pad.css +23 -9
  189. package/dist/css/skeleton.css +7 -7
  190. package/dist/css/slider.css +71 -42
  191. package/dist/css/sparkline.css +8 -2
  192. package/dist/css/spinner.css +40 -20
  193. package/dist/css/statistic.css +14 -14
  194. package/dist/css/steps.css +115 -84
  195. package/dist/css/switch.css +9 -7
  196. package/dist/css/table.css +27 -10
  197. package/dist/css/tabs.css +35 -12
  198. package/dist/css/tag-group.css +17 -6
  199. package/dist/css/tag.css +54 -29
  200. package/dist/css/tags-input.css +38 -19
  201. package/dist/css/text-field.css +5 -5
  202. package/dist/css/time-field.css +4 -4
  203. package/dist/css/time-picker.css +150 -64
  204. package/dist/css/time-range-picker.css +91 -62
  205. package/dist/css/timeline.css +37 -20
  206. package/dist/css/timer.css +3 -3
  207. package/dist/css/toggle-group.css +4 -4
  208. package/dist/css/tool-call.css +6 -4
  209. package/dist/css/toolbar.css +6 -5
  210. package/dist/css/tooltip.css +15 -16
  211. package/dist/css/tour.css +14 -7
  212. package/dist/css/transfer.css +22 -16
  213. package/dist/css/tree-select.css +10 -10
  214. package/dist/css/tree.css +26 -25
  215. package/dist/css/typography.css +28 -25
  216. package/dist/family/action-control.css +30 -24
  217. package/dist/family/chart.css +57 -0
  218. package/dist/family/collection-item.css +12 -8
  219. package/dist/family/field-chrome.css +28 -19
  220. package/dist/family/loading-ring.css +20 -13
  221. package/dist/family/swatch.css +4 -4
  222. package/dist/family/tag-list.css +6 -0
  223. package/family/action-control.css +30 -24
  224. package/family/chart.css +57 -0
  225. package/family/collection-item.css +12 -8
  226. package/family/field-chrome.css +28 -19
  227. package/family/loading-ring.css +20 -13
  228. package/family/swatch.css +4 -4
  229. package/family/tag-list.css +6 -0
  230. package/index.css +3580 -2060
  231. package/index.unlayered.css +3579 -2060
  232. package/package.json +2 -2
@@ -19,8 +19,9 @@
19
19
  .xh-scope-carousel[data-part='root'] {
20
20
  /* 自动播放开启时由 Headless 写入真实间隔;0ms 只用于未接入运行时的静态标记。 */
21
21
  --xh-_carousel-autoplay-duration: 0ms;
22
- --xh-_carousel-progress-from: 0 1;
23
- --xh-_carousel-progress-to: 1 1;
22
+ /* 进度条起步时裁掉的四边(inset 的上 右 下 左):横轨从行尾那一侧整条裁掉。
23
+ clip-path 只认物理方向,行内轴两侧取书写方向的位置,rtl 下改从左往右收 */
24
+ --xh-_carousel-progress-cut: 0 var(--xh-direction-end) 0 var(--xh-direction-start);
24
25
 
25
26
  position: relative;
26
27
  display: block;
@@ -32,9 +33,9 @@
32
33
  display: none;
33
34
  }
34
35
 
36
+ /* 纵轨:从下沿整条裁掉,进度条从上往下长 */
35
37
  .xh-scope-carousel[data-part='root'][data-orientation='vertical'] {
36
- --xh-_carousel-progress-from: 1 0;
37
- --xh-_carousel-progress-to: 1 1;
38
+ --xh-_carousel-progress-cut: 0 0 100% 0;
38
39
  }
39
40
 
40
41
  /* 视口是裁切窗口:轨道比它宽(高),露在外面的那些张全靠它切掉。
@@ -131,7 +132,10 @@
131
132
  }
132
133
 
133
134
  /* 两端按钮与播放开关:浮在媒体之上的单图标圆钮,接 Action Control floating 档:
134
- 盒型(md = box-lg 48px,圆形)、四态面、0.97 按压与 44px 命中区由家族配方给出,组件没有 size 轴、固定 md。
135
+ 圆形、四态面、按压与 44px 命中区由家族配方给出;视觉盒比 floating 档小,不压画面:
136
+ sm / md / lg 取 24 / 24 / 28px、字形 12 / 16 / 20px(sm 不低于 24px 的最小目标,只把字形收小)。
137
+ sm / md 直接取细指针最小目标 --xh-control-target-min,不随密度收:floating 档在细指针下不外扩命中区,
138
+ 视觉盒就是命中区,紧凑档再收到 20px 就够不着 24px。
135
139
  连接层不投影 variant:面由这里桥接到磨砂缺省(使用者槽 → 磨砂面),悬停 / 按下的底走画布承载的阶梯
136
140
  (100 → 200,取不透明档:钮压在图上,半透明的墨色盖不住画面),边缘与投影不动;这里只留定位、桥接槽与图标尺 */
137
141
  .xh-scope-carousel[data-part='prev-trigger'],
@@ -167,14 +171,26 @@
167
171
  --xh-action-bg-pressed: var(--xh-carousel-trigger-bg-active, var(--xh-bg-subtle-hover-opaque));
168
172
  /* M2 顶光走配方的高光通道 */
169
173
  --xh-action-radius: var(--xh-carousel-trigger-radius, var(--xh-_action-profile-radius));
170
- --xh-action-visual-size: var(--xh-carousel-trigger-size, var(--xh-_action-profile-visual-size));
171
- /* 作者塞进来的图标跟着 floating 档走(md 24px),与皮肤画的兜底字形同一把尺 */
172
- --xh-icon-size: var(--xh-carousel-icon-size, var(--xh-_action-profile-glyph-size));
174
+ --xh-_carousel-trigger-size: var(--xh-control-target-min);
175
+ --xh-_carousel-trigger-glyph: var(--xh-glyph-size-sm);
176
+ --xh-action-visual-size: var(--xh-carousel-trigger-size, var(--xh-_carousel-trigger-size));
177
+ --xh-action-min-inline-size: var(--xh-carousel-trigger-size, var(--xh-_carousel-trigger-size));
178
+ /* 作者塞进来的图标与皮肤画的兜底字形同一把尺 */
179
+ --xh-icon-size: var(--xh-carousel-icon-size, var(--xh-_carousel-trigger-glyph));
173
180
 
174
181
  position: absolute;
175
182
  z-index: 1;
176
183
  }
177
184
 
185
+ .xh-scope-carousel:is([data-part='prev-trigger'], [data-part='next-trigger'], [data-part='autoplay-trigger'])[data-xh-action-size='sm'] {
186
+ --xh-_carousel-trigger-glyph: var(--xh-control-indicator-sm);
187
+ }
188
+
189
+ .xh-scope-carousel:is([data-part='prev-trigger'], [data-part='next-trigger'], [data-part='autoplay-trigger'])[data-xh-action-size='lg'] {
190
+ --xh-_carousel-trigger-size: var(--xh-control-h-sm);
191
+ --xh-_carousel-trigger-glyph: var(--xh-glyph-size-md);
192
+ }
193
+
178
194
  .xh-scope-carousel[data-part='prev-trigger'],
179
195
  .xh-scope-carousel[data-part='next-trigger'] {
180
196
  inset-block-start: 50%;
@@ -224,7 +240,7 @@
224
240
  flex-wrap: nowrap;
225
241
  align-items: center;
226
242
  justify-content: center;
227
- gap: var(--xh-carousel-indicator-gap, var(--xh-space-1));
243
+ gap: var(--xh-carousel-indicator-gap, var(--xh-space-2));
228
244
  }
229
245
 
230
246
  .xh-scope-carousel[data-part='indicator-group'][hidden] {
@@ -267,7 +283,7 @@
267
283
  box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
268
284
  }
269
285
 
270
- /* 分页点与 Tour 的步骤点同一种语言:8px 圆点,当前页拉长成 20px 胶囊并换品牌色。
286
+ /* 分页点与 Tour 的步骤点同一种语言:圆点(压在媒体上的这一排 6px、点距 8px),当前页拉长成 20px 胶囊并换品牌色。
271
287
  本体就是那颗点:没有文字(页码交给作者,默认不显示),底色即标记。
272
288
  悬停 / 按下的回执落在点的颜色上:中性标记按前景阶梯加深一档、再加深一档;当前页按品牌阶梯压一档。
273
289
  沿轨道的长度取 indicator-size(当前页 indicator-size-current),垂直于轨道的粗细取 indicator-thickness,
@@ -278,15 +294,15 @@
278
294
  flex: none;
279
295
  align-items: center;
280
296
  justify-content: center;
281
- inline-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
282
- block-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-2)));
297
+ inline-size: var(--xh-carousel-indicator-size, var(--xh-space-1_5));
298
+ block-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
283
299
  padding: 0;
284
300
  border: 0;
285
301
  border-radius: var(--xh-carousel-indicator-radius, var(--xh-shape-circle));
286
302
  background: var(--xh-carousel-indicator-bg, var(--xh-bg-subtle-hover-opaque));
287
303
  font-size: 0;
288
- /* 自动播放的进度条画在点里,超出胶囊的那截裁掉 */
289
- overflow: hidden;
304
+ /* 不裁切:细指针下 ::after 把命中区外扩到点外,overflow 一裁命中区就缩回 6px 的点里;
305
+ 自动播放的进度条自己带圆角、由 clip-path 裁出来,不靠点来裁 */
290
306
  cursor: pointer;
291
307
  transition:
292
308
  inline-size var(--xh-motion-duration-move) var(--xh-motion-ease-continuous),
@@ -299,15 +315,19 @@
299
315
  display: none;
300
316
  }
301
317
 
302
- /* 细指针的命中区外扩到 24×24(8px 点四面各扩 8px);粗指针下这颗伪元素改画点,盒子自己承担命中。
303
- 点调细了,垂直于轨道那一向多扩一些,命中区不低于 24px 的最小目标 */
318
+ /* 细指针的命中区外扩到不低于 24×24:两向都取「外扩 8px」与「补足到最小目标 --xh-control-target-min」
319
+ 中大的一头(6px 点四面各扩 9px);粗指针下这颗伪元素改画点,盒子自己承担命中。点调细了,垂直于轨道那一向照样补足。
320
+ 相邻两点节距 14px,命中区沿轨道互相叠一截:后一颗画在上层,叠住的那段归它,每颗点自己的盒子仍只命中自己 */
304
321
  .xh-scope-carousel[data-part='indicator']::after {
305
322
  content: '';
306
323
  position: absolute;
307
- inset-inline: calc(-1 * var(--xh-space-2));
324
+ inset-inline: min(
325
+ calc(-1 * var(--xh-space-2)),
326
+ calc((var(--xh-carousel-indicator-size, var(--xh-space-1_5)) - var(--xh-control-target-min)) / 2)
327
+ );
308
328
  inset-block: min(
309
329
  calc(-1 * var(--xh-space-2)),
310
- calc((var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-2))) - var(--xh-space-6)) / 2)
330
+ calc((var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5))) - var(--xh-control-target-min)) / 2)
311
331
  );
312
332
  }
313
333
 
@@ -315,9 +335,12 @@
315
335
  > .xh-scope-carousel[data-part='indicator']::after {
316
336
  inset-inline: min(
317
337
  calc(-1 * var(--xh-space-2)),
318
- calc((var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-2))) - var(--xh-space-6)) / 2)
338
+ calc((var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5))) - var(--xh-control-target-min)) / 2)
339
+ );
340
+ inset-block: min(
341
+ calc(-1 * var(--xh-space-2)),
342
+ calc((var(--xh-carousel-indicator-size, var(--xh-space-1_5)) - var(--xh-control-target-min)) / 2)
319
343
  );
320
- inset-block: calc(-1 * var(--xh-space-2));
321
344
  }
322
345
 
323
346
  .xh-scope-carousel[data-part='indicator']:hover:not([data-current]) {
@@ -371,7 +394,9 @@
371
394
 
372
395
  /* 自动播放的进度:胶囊是品牌淡底当轨道(仍是「当前」语义;淡底上公共环够对比,不灌环色),
373
396
  品牌填充条从起点沿轨道方向长满这一页的时长。计时器每次恢复都重计一整个间隔,
374
- 进度条跟它同一口径:暂停时回到起点,恢复时从头走 */
397
+ 进度条跟它同一口径:暂停时回到起点,恢复时从头走。
398
+ 填充条铺满胶囊、自己带同一副圆角,未走的那一截由 clip-path 从行尾(纵轨从下沿)裁掉,裁口也取圆角:
399
+ 不缩放就不会把圆头压扁,也不用点的盒子来裁——盒子一裁,细指针外扩的命中区跟着被裁掉 */
375
400
  .xh-scope-carousel[data-part='root'][data-autoplay]
376
401
  .xh-scope-carousel[data-part='indicator'][data-current],
377
402
  .xh-scope-carousel[data-part='root'][data-paused]
@@ -383,44 +408,35 @@
383
408
  .xh-scope-carousel[data-part='indicator'][data-current]::before,
384
409
  .xh-scope-carousel[data-part='root'][data-paused]
385
410
  .xh-scope-carousel[data-part='indicator'][data-current]::before {
411
+ --xh-_carousel-progress-radius: var(--xh-carousel-indicator-radius-current, var(--xh-shape-pill));
412
+
386
413
  content: '';
387
414
  position: absolute;
388
415
  inset: 0;
389
- border-radius: inherit;
416
+ border-radius: var(--xh-_carousel-progress-radius);
390
417
  background: var(--xh-carousel-indicator-bg-selected, var(--xh-bg-brand));
391
- transform-origin: left center;
392
418
  animation: xh-carousel-indicator-progress var(--xh-_carousel-autoplay-duration) var(--xh-motion-ease-loop) both;
393
419
  }
394
420
 
395
421
  .xh-scope-carousel[data-part='root'][data-paused]
396
422
  .xh-scope-carousel[data-part='indicator'][data-current]::before {
397
423
  animation: none;
398
- scale: var(--xh-_carousel-progress-from);
424
+ clip-path: inset(var(--xh-_carousel-progress-cut) round var(--xh-_carousel-progress-radius));
399
425
  }
400
426
 
401
427
  /* 纵轨:胶囊沿块轴拉长,进度条从上往下长 */
402
428
  .xh-scope-carousel[data-part='indicator-group'][data-orientation='vertical']
403
429
  > .xh-scope-carousel[data-part='indicator'] {
404
- inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-2)));
405
- block-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
430
+ inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
431
+ block-size: var(--xh-carousel-indicator-size, var(--xh-space-1_5));
406
432
  }
407
433
 
408
434
  .xh-scope-carousel[data-part='indicator-group'][data-orientation='vertical']
409
435
  > .xh-scope-carousel[data-part='indicator'][data-current] {
410
- inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-2)));
436
+ inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
411
437
  block-size: var(--xh-carousel-indicator-size-current, var(--xh-space-5));
412
438
  }
413
439
 
414
- .xh-scope-carousel[data-part='indicator-group'][data-orientation='vertical']
415
- > .xh-scope-carousel[data-part='indicator'][data-current]::before {
416
- transform-origin: center top;
417
- }
418
-
419
- [dir='rtl'] .xh-scope-carousel[data-part='indicator-group'][data-orientation='horizontal']
420
- > .xh-scope-carousel[data-part='indicator']::before {
421
- transform-origin: right center;
422
- }
423
-
424
440
  .xh-scope-carousel[data-part='root'][data-orientation='vertical']
425
441
  > :is([data-part='prev-trigger'], [data-part='next-trigger']):where(.xh-scope-carousel) {
426
442
  inset-inline-start: 50%;
@@ -460,7 +476,7 @@
460
476
 
461
477
  .xh-scope-carousel[data-part='indicator'][data-current]::before {
462
478
  animation: none;
463
- scale: var(--xh-_carousel-progress-to);
479
+ clip-path: none;
464
480
  }
465
481
  }
466
482
 
@@ -470,7 +486,7 @@
470
486
 
471
487
  :where([data-motion='reduce']) .xh-scope-carousel[data-part='indicator'][data-current]::before {
472
488
  animation: none;
473
- scale: var(--xh-_carousel-progress-to);
489
+ clip-path: none;
474
490
  }
475
491
 
476
492
  @media (forced-colors: active) {
@@ -555,7 +571,7 @@
555
571
  }
556
572
 
557
573
  /* 手指落点:三颗钮的 44px 命中区由配方的 ::after 给(floating 档)。
558
- 分页点的视觉仍是 8 / 20px,按钮盒改成首尾相接的 44px 分区:直接用负 inset 外扩会让相邻页的命中区重叠,
574
+ 分页点的视觉仍是 6 / 20px,按钮盒改成首尾相接的 44px 分区:直接用负 inset 外扩会让相邻页的命中区重叠,
559
575
  落点归属取决于绘制顺序;这里让真实按钮盒承担命中,点与进度条改由伪元素画在盒子中央 */
560
576
  @media (pointer: coarse) {
561
577
  .xh-scope-carousel[data-part='indicator-group'] {
@@ -578,15 +594,14 @@
578
594
  min-block-size: var(--xh-carousel-indicator-target-size, 44px);
579
595
  border-radius: 0;
580
596
  background: transparent;
581
- overflow: visible;
582
597
  }
583
598
 
584
599
  .xh-scope-carousel[data-part='indicator']::after {
585
600
  inset: auto;
586
601
  inset-block-start: 50%;
587
602
  inset-inline-start: 50%;
588
- inline-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
589
- block-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-2)));
603
+ inline-size: var(--xh-carousel-indicator-size, var(--xh-space-1_5));
604
+ block-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
590
605
  border-radius: var(--xh-carousel-indicator-radius, var(--xh-shape-circle));
591
606
  background: var(--xh-carousel-indicator-bg, var(--xh-bg-subtle-hover-opaque));
592
607
  translate: -50% -50%;
@@ -636,7 +651,7 @@
636
651
  inset-inline-start: 50%;
637
652
  z-index: 1;
638
653
  inline-size: var(--xh-carousel-indicator-size-current, var(--xh-space-5));
639
- block-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-2)));
654
+ block-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
640
655
  border-radius: var(--xh-carousel-indicator-radius-current, var(--xh-shape-pill));
641
656
  translate: -50% -50%;
642
657
  }
@@ -654,8 +669,8 @@
654
669
  inset: auto;
655
670
  inset-block-start: 50%;
656
671
  inset-inline-start: 50%;
657
- inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-2)));
658
- block-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
672
+ inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
673
+ block-size: var(--xh-carousel-indicator-size, var(--xh-space-1_5));
659
674
  }
660
675
 
661
676
  .xh-scope-carousel[data-part='indicator-group'][data-orientation='vertical']
@@ -666,7 +681,7 @@
666
681
  .xh-scope-carousel[data-part='root'][data-paused]
667
682
  .xh-scope-carousel[data-part='indicator-group'][data-orientation='vertical']
668
683
  > .xh-scope-carousel[data-part='indicator'][data-current]::before {
669
- inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-2)));
684
+ inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
670
685
  block-size: var(--xh-carousel-indicator-size-current, var(--xh-space-5));
671
686
  }
672
687
  }
@@ -698,13 +713,14 @@
698
713
  }
699
714
 
700
715
  @layer xihan.motion {
716
+ /* 进度条从整条裁掉长到整条露出:只重绘、不重排,裁口取填充条自己的圆角 */
701
717
  @keyframes xh-carousel-indicator-progress {
702
718
  from {
703
- scale: var(--xh-_carousel-progress-from);
719
+ clip-path: inset(var(--xh-_carousel-progress-cut) round var(--xh-_carousel-progress-radius));
704
720
  }
705
721
 
706
722
  to {
707
- scale: var(--xh-_carousel-progress-to);
723
+ clip-path: inset(0 round var(--xh-_carousel-progress-radius));
708
724
  }
709
725
  }
710
726
  }
@@ -75,6 +75,7 @@
75
75
  --xh-_cascader-h: var(--xh-control-h-md);
76
76
  --xh-_cascader-px: var(--xh-control-px-md);
77
77
  --xh-_cascader-row-py: var(--xh-list-option-py-md);
78
+ --xh-_cascader-row-h: var(--xh-list-option-h-md);
78
79
  --xh-_cascader-row-px: var(--xh-control-px-md);
79
80
  --xh-_cascader-gap: var(--xh-control-gap-md);
80
81
  --xh-_cascader-font-size: var(--xh-control-font-md);
@@ -108,6 +109,7 @@
108
109
  --xh-_cascader-h: var(--xh-control-h-sm);
109
110
  --xh-_cascader-px: var(--xh-control-px-sm);
110
111
  --xh-_cascader-row-py: var(--xh-list-option-py-sm);
112
+ --xh-_cascader-row-h: var(--xh-list-option-h-sm);
111
113
  --xh-_cascader-row-px: var(--xh-control-px-sm);
112
114
  --xh-_cascader-gap: var(--xh-control-gap-sm);
113
115
  --xh-_cascader-font-size: var(--xh-control-font-sm);
@@ -118,13 +120,16 @@
118
120
  --xh-_cascader-h: var(--xh-control-h-lg);
119
121
  --xh-_cascader-px: var(--xh-control-px-lg);
120
122
  --xh-_cascader-row-py: var(--xh-list-option-py-lg);
123
+ --xh-_cascader-row-h: var(--xh-list-option-h-lg);
121
124
  --xh-_cascader-row-px: var(--xh-control-px-lg);
122
125
  --xh-_cascader-gap: var(--xh-control-gap-lg);
123
126
  --xh-_cascader-font-size: var(--xh-control-font-lg);
124
127
  }
125
128
 
126
129
  .xh-scope-cascader[data-part='label'] {
127
- color: var(--xh-cascader-label-fg, var(--xh-fg-default));
130
+ /* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-cascader-label-gap 给多少最终就是多少 */
131
+ margin-block-end: calc(var(--xh-cascader-label-gap, var(--xh-space-2)) - var(--xh-cascader-gap, var(--xh-space-1)));
132
+ color: var(--xh-cascader-label-fg, var(--xh-fg-muted));
128
133
  font-size: var(--xh-cascader-label-font-size, var(--xh-text-label-size));
129
134
  font-weight: var(--xh-cascader-label-font-weight, var(--xh-text-label-weight));
130
135
  line-height: var(--xh-leading-none);
@@ -132,7 +137,7 @@
132
137
 
133
138
  /* 整个控件禁用会把 data-disabled 一路打到 label / value-text / indicator 上,各处观感保持一致 */
134
139
  .xh-scope-cascader[data-part='label'][data-disabled] {
135
- color: var(--xh-cascader-label-fg-disabled, var(--xh-fg-subtle));
140
+ color: var(--xh-cascader-label-fg-disabled, var(--xh-fg-muted));
136
141
  }
137
142
 
138
143
  /* 盒:描边、底色、圆角、控件高度、行内内衬、聚焦环、五态与悬停由 Field Chrome 家族画在这一层,
@@ -153,8 +158,6 @@
153
158
  --xh-field-border-hover: var(--xh-cascader-control-border-hover, var(--xh-_field-variant-border-hover));
154
159
  --xh-field-border-focus: var(--xh-cascader-control-border-focus, var(--xh-_field-variant-border-focus));
155
160
  --xh-field-border-invalid: var(--xh-cascader-control-border-invalid, var(--xh-_field-variant-border-invalid));
156
- --xh-field-ring-focus: var(--xh-ring-focus);
157
- --xh-field-ring-invalid: var(--xh-ring-invalid);
158
161
  --xh-field-shadow-rest: var(--xh-cascader-control-shadow, none);
159
162
  --xh-field-cursor-rest: pointer;
160
163
  /* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
@@ -303,7 +306,7 @@
303
306
  align-items: stretch;
304
307
  /* 面板的下界:搜索视图与两个占位没有列托底,靠这一条不缩成一小块;可用区比它还窄时让位。
305
308
  可用宽写在定位层上、沿继承流下来 */
306
- min-inline-size: min(var(--xh-cascader-content-min-w, var(--xh-overlay-menu-min-w)), var(--xh-_cascader-available-w));
309
+ min-inline-size: min(var(--xh-cascader-content-min-w, var(--xh-overlay-cascade-min-w)), var(--xh-_cascader-available-w));
307
310
  /* 列多起来时外框宽过可用区就收成可用宽度,溢出的列交给下面那条 overflow-x;
308
311
  缺省不封顶,作者要封顶写 --xh-cascader-content-max-w */
309
312
  max-inline-size: min(var(--xh-cascader-content-max-w, var(--xh-_cascader-available-w)), var(--xh-_cascader-available-w));
@@ -352,10 +355,10 @@
352
355
  flex-direction: column;
353
356
  gap: var(--xh-cascader-column-gap, var(--xh-list-option-gap));
354
357
  /* 每一列按条目的自然宽度,受菜单的下界托底;长选项撑到条目的上限为止,余下的在条目里截断 */
355
- min-inline-size: var(--xh-cascader-column-min-w, var(--xh-overlay-menu-min-w));
358
+ min-inline-size: var(--xh-cascader-column-min-w, var(--xh-overlay-cascade-min-w));
356
359
  block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
357
360
  padding-block: var(--xh-cascader-column-py, var(--xh-space-1));
358
- padding-inline: var(--xh-cascader-column-px, var(--xh-space-1));
361
+ padding-inline: var(--xh-cascader-column-px, 0);
359
362
  overflow-y: auto;
360
363
  /* 浮层滚动面:滚到头不把页面一起带走 */
361
364
  overscroll-behavior: contain;
@@ -378,7 +381,7 @@
378
381
  用逻辑属性,rtl 下自动跑到另一侧。每列后面紧跟着它自己的竖条节点,相邻选择器接不到下一列,
379
382
  按「前面有过列」取后续的列 */
380
383
  .xh-scope-cascader[data-part='column'] ~ .xh-scope-cascader[data-part='column'] {
381
- border-inline-start: var(--xh-stroke-thin) solid var(--xh-cascader-column-divider, var(--xh-material-solid-separator));
384
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-cascader-column-divider, var(--xh-material-solid-border));
382
385
  }
383
386
 
384
387
  .xh-scope-cascader[data-part='column']:not([tabindex='0']):focus-visible {
@@ -407,9 +410,9 @@
407
410
  display: block;
408
411
  padding-block: var(--xh-cascader-group-label-py, var(--xh-space-1));
409
412
  padding-inline: var(--xh-cascader-group-label-px, var(--xh-_cascader-row-px));
410
- color: var(--xh-cascader-group-label-fg, var(--xh-fg-muted));
413
+ color: var(--xh-cascader-group-label-fg, var(--xh-fg-subtle));
411
414
  font-size: var(--xh-cascader-group-label-font-size, var(--xh-text-caption-size));
412
- font-weight: var(--xh-cascader-group-label-font-weight, var(--xh-font-weight-medium));
415
+ font-weight: var(--xh-cascader-group-label-font-weight, var(--xh-font-weight-regular));
413
416
  line-height: var(--xh-leading-none);
414
417
  user-select: none;
415
418
  }
@@ -428,10 +431,11 @@
428
431
  环只在真正的键盘焦点上接回,见下 */
429
432
  .xh-scope-cascader[data-part='item'] {
430
433
  --xh-collection-block-padding: var(--xh-cascader-item-py, var(--xh-_cascader-row-py));
434
+ --xh-collection-row-h: var(--xh-cascader-item-h, var(--xh-_cascader-row-h));
431
435
  --xh-collection-inline-padding: var(--xh-cascader-item-px, var(--xh-_cascader-row-px));
432
436
  --xh-collection-gap: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
433
437
  --xh-collection-font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
434
- --xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-inset));
438
+ --xh-collection-radius: var(--xh-cascader-item-radius, 0);
435
439
  --xh-collection-glyph-size: var(--xh-cascader-icon-size, var(--xh-_collection-glyph-size));
436
440
  --xh-collection-fg-rest: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
437
441
  --xh-collection-fg-hover: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
@@ -443,10 +447,10 @@
443
447
  --xh-collection-fg-selected-pressed: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
444
448
  --xh-collection-fg-pressed: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
445
449
  --xh-collection-font-weight-open-path: var(--xh-cascader-item-active-font-weight, var(--xh-font-weight-regular));
446
- --xh-collection-font-weight-selected: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
447
- --xh-collection-font-weight-selected-highlight: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
448
- --xh-collection-font-weight-selected-hover: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
449
- --xh-collection-font-weight-selected-pressed: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
450
+ --xh-collection-font-weight-selected: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-medium));
451
+ --xh-collection-font-weight-selected-highlight: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-medium));
452
+ --xh-collection-font-weight-selected-hover: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-medium));
453
+ --xh-collection-font-weight-selected-pressed: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-medium));
450
454
  --xh-collection-bg-hover: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
451
455
  --xh-collection-bg-keyboard-highlight: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
452
456
  --xh-collection-bg-open-path: var(--xh-cascader-item-bg-active, var(--xh-bg-subtle));
@@ -549,9 +553,10 @@
549
553
  inline-size: var(--xh-cascader-branch-arrow-size, var(--xh-control-indicator-size));
550
554
  block-size: var(--xh-cascader-branch-arrow-size, var(--xh-control-indicator-size));
551
555
  margin-inline-start: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
552
- background-color: var(--xh-cascader-branch-arrow-fg, var(--xh-fg-subtle));
553
- -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
554
- mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
556
+ /* 盒与标记盒同为 16px,字形只画四分之三(12px),比行里的文字轻一档 */
557
+ background-color: var(--xh-cascader-branch-arrow-fg, var(--xh-fg-muted));
558
+ -webkit-mask: var(--xh-glyph-mark-chevron-right) center / 75% no-repeat;
559
+ mask: var(--xh-glyph-mark-chevron-right) center / 75% no-repeat;
555
560
  }
556
561
 
557
562
  .xh-scope-cascader[data-part='item'][data-branch][data-disabled]::after {
@@ -651,7 +656,7 @@
651
656
  padding-block: 0;
652
657
  padding-inline: var(--xh-cascader-input-px, var(--xh-_cascader-px));
653
658
  border: none;
654
- border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-material-solid-separator));
659
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-material-solid-border));
655
660
  border-start-start-radius: inherit;
656
661
  border-start-end-radius: inherit;
657
662
  background: none;
@@ -719,10 +724,11 @@
719
724
  末端为同一枚皮肤对号预留固定轨 */
720
725
  .xh-scope-cascader[data-part='search-item'] {
721
726
  --xh-collection-block-padding: var(--xh-cascader-item-py, var(--xh-_cascader-row-py));
727
+ --xh-collection-row-h: var(--xh-cascader-item-h, var(--xh-_cascader-row-h));
722
728
  --xh-collection-inline-padding: var(--xh-cascader-item-px, var(--xh-_cascader-row-px));
723
729
  --xh-collection-gap: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
724
730
  --xh-collection-font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
725
- --xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-inset));
731
+ --xh-collection-radius: var(--xh-cascader-item-radius, 0);
726
732
  --xh-collection-fg-rest: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
727
733
  --xh-collection-fg-hover: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
728
734
  --xh-collection-fg-keyboard-highlight: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
@@ -731,10 +737,10 @@
731
737
  --xh-collection-fg-selected-hover: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
732
738
  --xh-collection-fg-selected-pressed: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
733
739
  --xh-collection-fg-pressed: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
734
- --xh-collection-font-weight-selected: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
735
- --xh-collection-font-weight-selected-highlight: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
736
- --xh-collection-font-weight-selected-hover: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
737
- --xh-collection-font-weight-selected-pressed: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
740
+ --xh-collection-font-weight-selected: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-medium));
741
+ --xh-collection-font-weight-selected-highlight: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-medium));
742
+ --xh-collection-font-weight-selected-hover: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-medium));
743
+ --xh-collection-font-weight-selected-pressed: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-medium));
738
744
  --xh-collection-bg-hover: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
739
745
  --xh-collection-bg-keyboard-highlight: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
740
746
  --xh-collection-bg-selected-highlight: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
@@ -818,8 +824,10 @@
818
824
  flex: 1 1 100%;
819
825
  align-items: center;
820
826
  justify-content: center;
827
+ /* 空态与在途占位撑到一列的高度,居中落在面板里,不缩成一条窄条 */
828
+ min-block-size: var(--xh-cascader-empty-min-h, var(--xh-viewport-h-sm));
821
829
  padding: var(--xh-cascader-empty-p, var(--xh-space-3));
822
- color: var(--xh-cascader-empty-fg, var(--xh-fg-muted));
830
+ color: var(--xh-cascader-empty-fg, var(--xh-fg-subtle));
823
831
  font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
824
832
  }
825
833
 
@@ -829,13 +837,17 @@
829
837
 
830
838
  /* 在途占位:与空态占位同一个位置、同一副观感,两者不同屏 */
831
839
  .xh-scope-cascader[data-part='loading'] {
840
+ /* 加载环取品牌色,文案仍是弱一档的前景 */
841
+ --xh-_loading-ring-fg: var(--xh-cascader-loading-ring-fg, var(--xh-fg-brand));
842
+
832
843
  display: flex;
833
844
  flex: 0 0 100%;
834
845
  align-items: center;
835
846
  justify-content: center;
836
847
  gap: var(--xh-_cascader-gap);
848
+ min-block-size: var(--xh-cascader-loading-min-h, var(--xh-viewport-h-sm));
837
849
  padding: var(--xh-cascader-loading-p, var(--xh-space-3));
838
- color: var(--xh-cascader-loading-fg, var(--xh-fg-muted));
850
+ color: var(--xh-cascader-loading-fg, var(--xh-fg-subtle));
839
851
  font-size: var(--xh-cascader-loading-font-size, var(--xh-_cascader-font-size));
840
852
  }
841
853
 
@@ -892,10 +904,10 @@
892
904
  align-items: center;
893
905
  gap: var(--xh-cascader-footer-gap, var(--xh-space-2));
894
906
  padding-block: var(--xh-cascader-footer-py, var(--xh-space-2));
895
- padding-inline: var(--xh-cascader-footer-px, var(--xh-space-2));
896
- border-block-start: var(--xh-stroke-thin) solid var(--xh-cascader-footer-border, var(--xh-border-subtle));
907
+ padding-inline: var(--xh-cascader-footer-px, var(--xh-_cascader-row-px));
908
+ border-block-start: var(--xh-stroke-thin) solid var(--xh-cascader-footer-border, var(--xh-material-solid-border));
897
909
  color: var(--xh-cascader-footer-fg, var(--xh-fg-muted));
898
- font-size: var(--xh-cascader-footer-font-size, var(--xh-text-secondary-size));
910
+ font-size: var(--xh-cascader-footer-font-size, var(--xh-_cascader-font-size));
899
911
  }
900
912
 
901
913
  /* 上面给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
@@ -32,7 +32,7 @@
32
32
  没写 data-tone 时退回品牌色 */
33
33
  --xh-_checkbox-group-accent: var(--xh-_tone-border-control, var(--xh-bg-brand));
34
34
  --xh-_checkbox-group-on-accent: var(--xh-_tone-on, var(--xh-fg-on-brand));
35
- /* 方框是字段家族的控制盒(字段静息形态):透明底 + --xh-border-control 描边 + 无影,不消费海拔与顶光 */
35
+ /* 方框是控件盒:透明底 + --xh-border-strong 描边(与 Checkbox 同一重量)+ 无影,不消费海拔与顶光 */
36
36
  --xh-_checkbox-group-bg: var(--xh-checkbox-group-indicator-bg, transparent);
37
37
  /* 条目与全选格是方框的承载面:行自己坐画布走 100 → 200,行面上的方框按淡底容器阶梯再上一档(200 → 300)。
38
38
  两支私有槽是这一档的唯一来源——宿主拿它们给 --xh-action-host-bg-* 赋值(桥接槽只写不读),
@@ -125,13 +125,17 @@
125
125
  --xh-action-host-bg-pressed: var(--xh-_checkbox-group-host-bg-pressed);
126
126
 
127
127
  position: relative;
128
- /* row 档铺满容器(inline-size: 100%)会把竖排的命中区拉到整行空白处、横排 wrap 也塌:
129
- 沿用「条目按内容收宽」的既有决定 */
130
- inline-size: auto;
131
128
  /* ghost 的 1px 透明边位会把方框列相对组标题错开 1px:边归零,几何保持不变 */
132
129
  border-width: 0;
133
130
  }
134
131
 
132
+ /* 条目与全选格按内容收宽,盖掉 row 档的 inline-size: 100%(竖排时命中区拉到整行空白处,横排时每格独占一行)。
133
+ 从根往下写,特指度高过 row 档,有层与无层两份产物里都生效 */
134
+ .xh-scope-checkbox-group[data-part='root'] .xh-scope-checkbox-group[data-part='item'],
135
+ .xh-scope-checkbox-group[data-part='root'] .xh-scope-checkbox-group[data-part='select-all-trigger'] {
136
+ inline-size: auto;
137
+ }
138
+
135
139
  /* 只读整组都改不动,但不是禁用:颜色照常,把整行的悬停 / 按下面与"可点"这个暗示一起收回来。
136
140
  家族的 :hover / 按压块不排 readonly,只能从槽上收回;排掉禁用项是因为这条选择器权重高过家族的禁用块,
137
141
  不排就会把 not-allowed 覆盖回 default */
@@ -156,7 +160,7 @@
156
160
  justify-content: center;
157
161
  inline-size: var(--xh-checkbox-group-indicator-size, var(--xh-_checkbox-group-box));
158
162
  block-size: var(--xh-checkbox-group-indicator-size, var(--xh-_checkbox-group-box));
159
- border: var(--xh-stroke-thin) solid var(--xh-checkbox-group-indicator-border, var(--xh-border-control));
163
+ border: var(--xh-stroke-thin) solid var(--xh-checkbox-group-indicator-border, var(--xh-border-strong));
160
164
  border-radius: var(--xh-checkbox-group-indicator-radius, var(--xh-shape-inset));
161
165
  background-color: var(--xh-_checkbox-group-bg);
162
166
  color: var(--xh-checkbox-group-indicator-fg, var(--xh-_checkbox-group-on-accent));
@@ -301,7 +305,6 @@
301
305
  --xh-check-mark-fg: var(--xh-checkbox-group-indicator-fg, var(--xh-_checkbox-group-on-accent));
302
306
 
303
307
  position: relative;
304
- inline-size: auto;
305
308
  border-width: 0;
306
309
  font-weight: var(--xh-checkbox-group-select-all-trigger-font-weight, var(--xh-font-weight-medium));
307
310
  }
@@ -28,14 +28,15 @@
28
28
  /* 实心底上的勾与横杠,同样没写 data-tone 时退回原来的品牌底前景色 */
29
29
  --xh-_checkbox-on-accent: var(--xh-_tone-on, var(--xh-fg-on-brand));
30
30
 
31
- /* 方框接 Action Control icon 档(定尺方框):盒型、悬停 / 按下 / 禁用面、0.97 缩放与换底、粗指针热区、
32
- 焦点环由家族配方给,这里只把使用者槽映射到桥接槽。面按字段静息形态取值:透明底 +
33
- --xh-border-control 描边 + 无影,不消费海拔与顶光;悬停只把描边升一档,底不动;按下换到 200 档中性面
31
+ /* 方框接 Action Control icon 档(定尺方框):盒型、悬停 / 按下 / 禁用面、按压与换底、粗指针热区、
32
+ 焦点环由家族配方给,这里只把使用者槽映射到桥接槽。面取控件盒的静息形态:透明底 +
33
+ --xh-border-strong 描边(比字段边重一档,小方框要一眼认得出)+ 无影,不消费海拔与顶光;
34
+ 悬停只把描边升一档,底不动;按下换到 200 档中性面
34
35
  (白底承载);边长随 --xh-control-indicator-* 走,不取家族的 profile 尺寸。
35
36
  常态 / 勾中 / 校验失败 / 只读只换下面四支私有槽,桥接槽的映射写一次 */
36
37
  --xh-_checkbox-bg: var(--xh-checkbox-bg, transparent);
37
38
  --xh-_checkbox-bg-pressed: var(--xh-checkbox-bg-pressed, var(--xh-bg-subtle-hover));
38
- --xh-_checkbox-border: var(--xh-checkbox-border, var(--xh-border-control));
39
+ --xh-_checkbox-border: var(--xh-checkbox-border, var(--xh-border-strong));
39
40
  --xh-_checkbox-border-hover: var(--xh-checkbox-border-hover, var(--xh-border-control-hover));
40
41
 
41
42
  --xh-action-visual-size: var(--xh-_checkbox-box);
@@ -274,7 +274,7 @@
274
274
  overflow: hidden;
275
275
  color: var(--xh-citation-title-fg, var(--xh-fg-default));
276
276
  font-size: var(--xh-citation-title-font-size, var(--xh-text-label-size));
277
- font-weight: var(--xh-citation-title-font-weight, var(--xh-font-weight-semibold));
277
+ font-weight: var(--xh-citation-title-font-weight, var(--xh-font-weight-medium));
278
278
  text-overflow: ellipsis;
279
279
  white-space: nowrap;
280
280
  }
@@ -355,12 +355,17 @@
355
355
  --xh-action-radius: var(--xh-citation-source-radius, var(--xh-shape-control));
356
356
  --xh-action-fg-rest: var(--xh-citation-source-fg, var(--xh-fg-default));
357
357
 
358
- display: grid;
359
358
  grid-template-columns: auto minmax(0, 1fr);
360
359
  align-items: start;
361
360
  text-align: start;
362
361
  }
363
362
 
363
+ /* 排成「序号 | 标题 / 来源」两列,盖掉 row 档的 display: flex。选择器点名 row 档,
364
+ 有层与无层两份产物里都压得住它;收起的来源行留给 [hidden] 那条 */
365
+ .xh-scope-citation[data-part='source-link'][data-xh-action-profile='row']:not([hidden]) {
366
+ display: grid;
367
+ }
368
+
364
369
  .xh-scope-citation[data-part='source-link'][data-current] {
365
370
  --xh-action-bg-rest: var(--xh-bg-brand-subtle);
366
371
  --xh-action-bg-hover: var(--xh-bg-brand-subtle);