@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
@@ -16,7 +16,7 @@
16
16
  * 各自取用:换档只改槽,画在哪个节点上互不影响。
17
17
  */
18
18
  .xh-scope-separator[data-part='root'] {
19
- --xh-_separator-color: var(--xh-separator-color, var(--xh-material-frosted-separator));
19
+ --xh-_separator-color: var(--xh-separator-color, var(--xh-border-default));
20
20
  --xh-_separator-dash: var(--xh-separator-dash-length, var(--xh-space-1_5));
21
21
  --xh-_separator-dash-gap: var(--xh-separator-dash-gap, var(--xh-space-1_5));
22
22
  --xh-_separator-paint: var(--xh-_separator-color);
@@ -26,15 +26,20 @@
26
26
  background: var(--xh-_separator-paint);
27
27
  }
28
28
 
29
+ /* 分隔线自带上下(竖向为左右)留白:横向上下各 20px,竖向左右各 12px,放进内容里不必另包一层加边距 */
29
30
  .xh-scope-separator[data-part='root'][data-orientation='horizontal'] {
30
31
  inline-size: 100%;
31
32
  block-size: var(--xh-separator-thickness, var(--xh-stroke-thin));
33
+ margin-block: var(--xh-separator-my, var(--xh-space-5));
32
34
  }
33
35
 
34
36
  .xh-scope-separator[data-part='root'][data-orientation='vertical'] {
35
37
  align-self: stretch;
36
38
  inline-size: var(--xh-separator-thickness, var(--xh-stroke-thin));
37
39
  block-size: 100%;
40
+ /* 父容器没有高度时也留一截与文字等高的线 */
41
+ min-block-size: var(--xh-glyph-size-text);
42
+ margin-inline: var(--xh-separator-mx, var(--xh-space-3));
38
43
  }
39
44
 
40
45
  /* —— 形态 ——
@@ -74,7 +79,9 @@
74
79
  align-items: center;
75
80
  inline-size: 100%;
76
81
  block-size: auto;
77
- gap: var(--xh-separator-gap, var(--xh-space-3));
82
+ gap: var(--xh-separator-gap, var(--xh-space-4));
83
+ /* 文字自带一行行高,上下留白收一半,整段占的高度与单线时相当 */
84
+ margin-block: var(--xh-separator-my, var(--xh-space-2_5));
78
85
  background: none;
79
86
  }
80
87
 
@@ -102,8 +109,9 @@
102
109
  /* 分节文字:不参与等分,也不折行 */
103
110
  .xh-scope-separator[data-part='content'] {
104
111
  flex: none;
105
- color: var(--xh-separator-content-fg, var(--xh-fg-muted));
106
- font-size: var(--xh-separator-content-font-size, var(--xh-text-secondary-size));
112
+ color: var(--xh-separator-content-fg, var(--xh-fg-default));
113
+ font-size: var(--xh-separator-content-font-size, var(--xh-text-body-size));
114
+ font-weight: var(--xh-separator-content-font-weight, var(--xh-font-weight-medium));
107
115
  line-height: var(--xh-leading-normal);
108
116
  white-space: nowrap;
109
117
  }
@@ -114,6 +122,16 @@
114
122
  flex: 0 0 var(--xh-separator-align-length, var(--xh-space-6));
115
123
  }
116
124
 
125
+ /* 强制色:线是底色(与虚线的渐变)画的,系统会把底色换成 Canvas,线就此消失。
126
+ 线退出强制换色、颜色直接取 CanvasText,实线与虚线同一条槽 */
127
+ @media (forced-colors: active) {
128
+ .xh-scope-separator:is([data-part='root'], [data-part='line']) {
129
+ --xh-_separator-color: CanvasText;
130
+
131
+ forced-color-adjust: none;
132
+ }
133
+ }
134
+
117
135
  /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
118
136
  写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
119
137
  .xh-scope-separator[data-part='root'][hidden] {
@@ -30,8 +30,11 @@
30
30
  把 --xh-icon-size 改接到 --xh-control-indicator-* 一族的盒尺 */
31
31
  --xh-icon-size: var(--xh-side-nav-icon-size, var(--xh-glyph-size-md));
32
32
 
33
- /* 尺寸档只换这三个私有槽,行从这两处继承它们,换档不必给每个部件各写一条选择器 */
34
- --xh-_side-nav-row-h: var(--xh-control-h-md);
33
+ /* 尺寸档只换这三个私有槽,行从这两处继承它们,换档不必给每个部件各写一条选择器。
34
+ 行高取导航行的尺(比同档控件高一截) */
35
+ --xh-_side-nav-row-h: var(--xh-nav-row-h-md);
36
+ /* 面板内的搜索框是字段,高度仍走控件尺 */
37
+ --xh-_side-nav-input-h: var(--xh-control-h-md);
35
38
  --xh-_side-nav-row-px: var(--xh-control-px-md);
36
39
  --xh-_side-nav-row-gap: var(--xh-control-gap-md);
37
40
  --xh-_side-nav-row-font-size: var(--xh-control-font-md);
@@ -41,7 +44,8 @@
41
44
  /* 缺省档写在上面那条里 */
42
45
  .xh-scope-side-nav:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
43
46
  --xh-icon-size: var(--xh-side-nav-icon-size, var(--xh-glyph-size-sm));
44
- --xh-_side-nav-row-h: var(--xh-control-h-sm);
47
+ --xh-_side-nav-row-h: var(--xh-nav-row-h-sm);
48
+ --xh-_side-nav-input-h: var(--xh-control-h-sm);
45
49
  --xh-_side-nav-row-px: var(--xh-control-px-sm);
46
50
  --xh-_side-nav-row-gap: var(--xh-control-gap-sm);
47
51
  --xh-_side-nav-row-font-size: var(--xh-control-font-sm);
@@ -49,7 +53,8 @@
49
53
 
50
54
  .xh-scope-side-nav:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
51
55
  --xh-icon-size: var(--xh-side-nav-icon-size, var(--xh-glyph-size-lg));
52
- --xh-_side-nav-row-h: var(--xh-control-h-lg);
56
+ --xh-_side-nav-row-h: var(--xh-nav-row-h-lg);
57
+ --xh-_side-nav-input-h: var(--xh-control-h-lg);
53
58
  --xh-_side-nav-row-px: var(--xh-control-px-lg);
54
59
  --xh-_side-nav-row-gap: var(--xh-control-gap-lg);
55
60
  --xh-_side-nav-row-font-size: var(--xh-control-font-lg);
@@ -79,7 +84,7 @@
79
84
 
80
85
  flex: none;
81
86
  min-inline-size: 0;
82
- block-size: var(--xh-side-nav-input-h, var(--xh-_side-nav-row-h));
87
+ block-size: var(--xh-side-nav-input-h, var(--xh-_side-nav-input-h));
83
88
  padding-block: 0;
84
89
  padding-inline: var(--xh-side-nav-input-px, var(--xh-_side-nav-row-px));
85
90
  border: none;
@@ -213,7 +218,7 @@
213
218
  --xh-collection-inline-padding: var(--xh-side-nav-link-px, var(--xh-_side-nav-row-px));
214
219
  --xh-collection-gap: 0;
215
220
  --xh-collection-font-size: var(--xh-side-nav-link-font-size, var(--xh-_side-nav-row-font-size));
216
- --xh-collection-radius: var(--xh-side-nav-link-radius, var(--xh-shape-control));
221
+ --xh-collection-radius: var(--xh-side-nav-link-radius, var(--xh-shape-surface));
217
222
  /* 作者的图标尺槽经桥接槽下发到行,家族缺省按 data-xh-collection-size 取档 */
218
223
  --xh-collection-glyph-size: var(--xh-side-nav-icon-size, var(--xh-_collection-glyph-size));
219
224
  --xh-collection-fg-rest: var(--xh-side-nav-row-fg, currentColor);
@@ -223,16 +228,16 @@
223
228
  --xh-collection-bg-hover: var(--xh-side-nav-row-bg-hover, var(--xh-bg-subtle));
224
229
  --xh-collection-bg-keyboard-highlight: var(--xh-side-nav-row-bg-hover, var(--xh-bg-subtle));
225
230
  --xh-collection-bg-pressed: var(--xh-side-nav-row-bg-pressed, var(--xh-bg-subtle-hover));
226
- /* 当前页:页内持久集合的唯一标记是品牌淡底行面 + 淡底前景,字重不变(与静息同为 regular) */
231
+ /* 当前页:页内持久集合的标记是品牌淡底行面 + 淡底前景;侧栏另把字重提到 semibold,整列扫读时当前项一眼可见 */
227
232
  --xh-collection-bg-current: var(--xh-side-nav-row-bg-active, var(--xh-bg-brand-subtle));
228
233
  --xh-collection-fg-current: var(--xh-side-nav-row-fg-active, var(--xh-fg-on-brand-subtle));
229
234
  --xh-collection-fg-current-hover: var(--xh-side-nav-row-fg-active, var(--xh-fg-on-brand-subtle));
230
235
  --xh-collection-fg-current-highlight: var(--xh-side-nav-row-fg-active, var(--xh-fg-on-brand-subtle));
231
236
  --xh-collection-fg-current-pressed: var(--xh-side-nav-row-fg-active, var(--xh-fg-on-brand-subtle));
232
- --xh-collection-font-weight-current: var(--xh-side-nav-row-font-weight-active, var(--xh-font-weight-regular));
233
- --xh-collection-font-weight-current-hover: var(--xh-side-nav-row-font-weight-active, var(--xh-font-weight-regular));
234
- --xh-collection-font-weight-current-highlight: var(--xh-side-nav-row-font-weight-active, var(--xh-font-weight-regular));
235
- --xh-collection-font-weight-current-pressed: var(--xh-side-nav-row-font-weight-active, var(--xh-font-weight-regular));
237
+ --xh-collection-font-weight-current: var(--xh-side-nav-row-font-weight-active, var(--xh-font-weight-semibold));
238
+ --xh-collection-font-weight-current-hover: var(--xh-side-nav-row-font-weight-active, var(--xh-font-weight-semibold));
239
+ --xh-collection-font-weight-current-highlight: var(--xh-side-nav-row-font-weight-active, var(--xh-font-weight-semibold));
240
+ --xh-collection-font-weight-current-pressed: var(--xh-side-nav-row-font-weight-active, var(--xh-font-weight-semibold));
236
241
  --xh-collection-indicator-fg-current: var(--xh-side-nav-indicator-color, var(--xh-fg-brand));
237
242
  --xh-collection-indicator-fg-current-hover: var(--xh-side-nav-indicator-color, var(--xh-fg-brand));
238
243
  --xh-collection-indicator-fg-current-highlight: var(--xh-side-nav-indicator-color, var(--xh-fg-brand));
@@ -23,34 +23,34 @@
23
23
  gap: var(--xh-signature-pad-gap, var(--xh-space-2));
24
24
  }
25
25
 
26
- /* 复合单字段的标签:14 / 500 / fg-default,不随档;贴画布 space-1——
26
+ /* 复合单字段的标签:14 / 400 / fg-muted,不随档;与画布隔 space-2——
27
27
  容器的 gap 归画布之后的部件,标签在它之上补一段差值把距离收成目标值 */
28
28
  .xh-scope-signature-pad[data-part='label'] {
29
29
  margin-block-end: calc(
30
- var(--xh-signature-pad-label-gap, var(--xh-space-1))
30
+ var(--xh-signature-pad-label-gap, var(--xh-space-2))
31
31
  - var(--xh-signature-pad-gap, var(--xh-space-2))
32
32
  );
33
- color: var(--xh-signature-pad-label-fg, var(--xh-fg-default));
33
+ color: var(--xh-signature-pad-label-fg, var(--xh-fg-muted));
34
34
  font-size: var(--xh-signature-pad-label-font-size, var(--xh-text-label-size));
35
35
  font-weight: var(--xh-signature-pad-label-font-weight, var(--xh-text-label-weight));
36
36
  }
37
37
 
38
38
  .xh-scope-signature-pad[data-part='label'][data-disabled] {
39
- color: var(--xh-signature-pad-label-fg-disabled, var(--xh-fg-subtle));
39
+ color: var(--xh-signature-pad-label-fg-disabled, var(--xh-fg-muted));
40
40
  }
41
41
 
42
42
  /* 画布是块状的写字区:宽度铺满外层,高度由宽高比决定。
43
43
  控件行高那把尺量的是一行控件,一块要写字的面积用不上它。
44
44
  touch-action 由连接层内联写死,触摸落笔才不会被页面滚动抢走。
45
45
  外壳按字段规则自绘(登记的画布型字段例外:字段家族配方钉死控件行高,画布按宽高比撑高吃不下它):
46
- 静息透明底 + border-control 描边 + control 圆角 + 无影 */
46
+ 静息字段淡底 + border-control 描边 + control 圆角 + 无影,与字段外壳同一副面 */
47
47
  .xh-scope-signature-pad[data-part='control'] {
48
48
  display: block;
49
49
  inline-size: 100%;
50
50
  aspect-ratio: var(--xh-signature-pad-aspect-ratio, 5 / 2);
51
51
  border: var(--xh-stroke-thin) solid var(--xh-signature-pad-border, var(--xh-border-control));
52
52
  border-radius: var(--xh-signature-pad-radius, var(--xh-shape-control));
53
- background: var(--xh-signature-pad-bg, transparent);
53
+ background: var(--xh-signature-pad-bg, var(--xh-bg-field));
54
54
  cursor: crosshair;
55
55
  /* 一划就会把画布连同旁边的文字一起刷成选中态 */
56
56
  user-select: none;
@@ -60,14 +60,21 @@
60
60
  background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
61
61
  }
62
62
 
63
+ /* 悬停:底不变、描边升 border-strong,与字段外壳的悬停同一档 */
64
+ .xh-scope-signature-pad[data-part='control']:not([data-disabled]):not([data-readonly]):not([data-invalid]):not([data-drawing]):hover {
65
+ border-color: var(--xh-signature-pad-border-hover, var(--xh-border-strong));
66
+ }
67
+
68
+ /* 校验失败:失效描边 + 4% 失效色淡底,与字段外壳的失效档同一副面 */
63
69
  .xh-scope-signature-pad[data-part='control'][data-invalid] {
64
70
  border-color: var(--xh-signature-pad-control-border-invalid, var(--xh-border-invalid));
71
+ background: var(--xh-signature-pad-bg-invalid, var(--xh-bg-field-invalid));
65
72
  }
66
73
 
67
- /* 落笔期间把描边压深一档。border-strong 是装饰梯度里的一档,比 border-control 更淡,
68
- 用在这儿会让描边在落笔时反而变弱 */
74
+ /* 落笔期间与字段聚焦同一副面:换承载面 + 聚焦描边。排在失效之后,落笔时失效档让位 */
69
75
  .xh-scope-signature-pad[data-part='control'][data-drawing] {
70
- border-color: var(--xh-signature-pad-border-drawing, var(--xh-border-control-hover));
76
+ border-color: var(--xh-signature-pad-border-drawing, var(--xh-border-control-focus));
77
+ background: var(--xh-signature-pad-bg-drawing, var(--xh-bg-surface));
71
78
  }
72
79
 
73
80
  /* 只读仍看得见签名,只是改不动:收掉手型,别暗示"在这儿能写";
@@ -176,4 +183,11 @@
176
183
  .xh-scope-signature-pad[data-part='clear-trigger'][hidden] {
177
184
  display: none;
178
185
  }
186
+
187
+ /* 高对比档底色被系统换掉,落笔与失效只剩描边分得开:换系统高亮色 */
188
+ @media (forced-colors: active) {
189
+ .xh-scope-signature-pad[data-part='control']:is([data-drawing], [data-invalid]) {
190
+ border-color: Highlight;
191
+ }
192
+ }
179
193
  }
@@ -27,7 +27,7 @@
27
27
  .xh-scope-skeleton[data-part='root'] {
28
28
  display: flex;
29
29
  flex-direction: column;
30
- gap: var(--xh-skeleton-gap, var(--xh-space-3));
30
+ gap: var(--xh-skeleton-gap, var(--xh-space-4));
31
31
  }
32
32
 
33
33
  /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},补这条兜住加载结束后的收起态 */
@@ -45,8 +45,8 @@
45
45
  /*
46
46
  * 单根骨架条。底色与微光两层叠在一起:
47
47
  * background-color 是静止时看到的那层,background-image 是扫过去的那道光。
48
- * 微光取比底亮一档的那支面色:浅色下比 bg-subtle 亮、深色下同样比它亮,
49
- * 两个主题里扫过去的都是一道亮带,而不是浅色下反倒扫出一道暗带。
48
+ * 微光取淡底一档叠在条底上:浅色下黑墨叠深、扫过去是一道比条底深的暗带,
49
+ * 深色下白墨叠亮、是一道亮带;两个主题里都是条底往前景方向再进一档。
50
50
  */
51
51
  .xh-scope-skeleton[data-part='item'] {
52
52
  inline-size: 100%;
@@ -56,7 +56,7 @@
56
56
  background-image: linear-gradient(
57
57
  90deg,
58
58
  transparent 20%,
59
- var(--xh-skeleton-sheen, var(--xh-bg-surface-raised)) 50%,
59
+ var(--xh-skeleton-sheen, var(--xh-bg-subtle)) 50%,
60
60
  transparent 80%
61
61
  );
62
62
  background-repeat: no-repeat;
@@ -65,10 +65,10 @@
65
65
  animation: xh-shimmer var(--xh-skeleton-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-loop) infinite;
66
66
  }
67
67
 
68
- /* 一行文字的高度取正文字号,圆角拉满,看起来就是一行还没排出来的字 */
68
+ /* 一行文字的高度取一行正文的行框,小圆角的方条,看起来就是一行还没排出来的字 */
69
69
  .xh-scope-skeleton[data-part='item'][data-shape='text'] {
70
- block-size: var(--xh-skeleton-text-block-size, var(--xh-text-caption-size));
71
- border-radius: var(--xh-skeleton-text-radius, var(--xh-shape-pill));
70
+ block-size: var(--xh-skeleton-text-block-size, var(--xh-text-body-line-h));
71
+ border-radius: var(--xh-skeleton-text-radius, var(--xh-shape-inset));
72
72
  }
73
73
 
74
74
  /* 头像位:正方形加满圆角。宽度定死不跟着容器拉长,高度也不许被主轴压扁 */
@@ -17,11 +17,12 @@
17
17
  切换 orientation 的那一帧还会跟连接层清空另一轴的动作抢位置,把拇指钉在两轴都被约束的地方。
18
18
  皮肤只管另一条轴(交叉轴)的尺寸、颜色、圆角与状态表现。 */
19
19
 
20
- /* 私有槽位:组件令牌 → 中档字面量两级回退。轨道厚度与拇指直径同时被 control / track / thumb
21
- 三个角色节点用到,收成两个槽位挂在 root 上,尺寸档只改这两处,靠继承发到子部件。 */
20
+ /* 私有槽位:组件令牌 → 中档两级回退。轨道厚度与拇指直径同时被 control / track / thumb
21
+ 三个角色节点用到,收成两个槽位挂在 root 上,尺寸档只改这两处,靠继承发到子部件。
22
+ 中档是一条 2px 的细轨(描边粗档)配 12px 的拇指(轨道拇指的 md 档) */
22
23
  .xh-scope-slider[data-part='root'] {
23
- --xh-_thumb-size: var(--xh-slider-thumb-size, var(--xh-track-thumb-size));
24
- --xh-_track-thickness: var(--xh-slider-track-thickness, var(--xh-track-thickness));
24
+ --xh-_thumb-size: var(--xh-slider-thumb-size, var(--xh-track-thumb-size-md));
25
+ --xh-_track-thickness: var(--xh-slider-track-thickness, var(--xh-stroke-thick));
25
26
 
26
27
  display: flex;
27
28
  flex-direction: column;
@@ -38,15 +39,17 @@
38
39
  /* 禁用不整体压暗:前景与表面各自降级——连接层把 data-disabled 发到每个角色节点上,
39
40
  轨道、区间、拇指、刻度与标签就近消费,写在各自的规则里 */
40
41
 
41
- /* 字段标签:14 / 500 / fg-default,禁用换到 --xh-fg-subtle */
42
+ /* 字段标签:14 / 400 / fg-muted,与控件隔 space-2,禁用不另变色 */
42
43
  .xh-scope-slider[data-part='label'] {
43
- color: var(--xh-slider-label-fg, var(--xh-fg-default));
44
+ /* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-slider-label-gap 给多少最终就是多少 */
45
+ margin-block-end: calc(var(--xh-slider-label-gap, var(--xh-space-2)) - var(--xh-slider-gap, var(--xh-space-1)));
46
+ color: var(--xh-slider-label-fg, var(--xh-fg-muted));
44
47
  font-size: var(--xh-slider-label-font-size, var(--xh-text-label-size));
45
48
  font-weight: var(--xh-slider-label-font-weight, var(--xh-text-label-weight));
46
49
  }
47
50
 
48
51
  .xh-scope-slider[data-part='label'][data-disabled] {
49
- color: var(--xh-slider-label-fg-disabled, var(--xh-fg-subtle));
52
+ color: var(--xh-slider-label-fg-disabled, var(--xh-fg-muted));
50
53
  }
51
54
 
52
55
  /* 拇指以它为定位上下文(拇指常常浮出轨道,挂在 track 上会被轨道的盒子束住)。
@@ -88,12 +91,40 @@
88
91
  cursor: not-allowed;
89
92
  }
90
93
 
94
+ /* 粗指针:控件只有拇指那么厚,命中区沿交叉轴外扩,补足到粗指针命中下限(--xh-control-hit-coarse)。
95
+ 外扩总量是「下限 − 拇指直径」,按拇指算而不是写死一格,sm 档 10px 的拇指也补得到下限。
96
+ 横排时块首朝着标签:那一侧只扩半个余量、且不越过标签与控件之间的间距,点在标签上仍归标签、不直接跳值;
97
+ 少扩的那一截挪到块尾补齐。竖排时标签不在行内轴上,两侧对称各扩一半。
98
+ 落指在轨道上下这一截也能按下即跳、接着拖;伪元素排在刻度之前,刻度文案仍压在它上面接得到点按 */
99
+ @media (pointer: coarse) {
100
+ .xh-scope-slider[data-part='control'][data-orientation='horizontal']::before {
101
+ --xh-_slider-hit-start: min(
102
+ var(--xh-slider-label-gap, var(--xh-space-2)),
103
+ (var(--xh-control-hit-coarse) - var(--xh-_thumb-size)) / 2
104
+ );
105
+
106
+ content: '';
107
+ position: absolute;
108
+ inset-block-start: calc(-1 * var(--xh-_slider-hit-start));
109
+ inset-block-end: calc(var(--xh-_slider-hit-start) + var(--xh-_thumb-size) - var(--xh-control-hit-coarse));
110
+ inset-inline: 0;
111
+ }
112
+
113
+ .xh-scope-slider[data-part='control'][data-orientation='vertical']::before {
114
+ content: '';
115
+ position: absolute;
116
+ inset-block: 0;
117
+ inset-inline: calc((var(--xh-_thumb-size) - var(--xh-control-hit-coarse)) / 2);
118
+ }
119
+ }
120
+
91
121
  /* 已选区间以它为定位上下文。不写 overflow: hidden:作者把拇指写进轨道里也是合法结构,
92
122
  一裁就把拇指切掉半个;区间的圆角由它自己那条 border-radius 兜住,本就不靠轨道来裁。 */
93
123
  .xh-scope-slider[data-part='track'] {
94
124
  position: relative;
95
125
  border-radius: var(--xh-slider-track-radius, var(--xh-shape-pill));
96
- background: var(--xh-slider-track-bg, var(--xh-bg-subtle-active));
126
+ /* 底槽取淡底阶梯的 200 档(--xh-bg-subtle-hover) */
127
+ background: var(--xh-slider-track-bg, var(--xh-bg-subtle-hover));
97
128
  }
98
129
 
99
130
  .xh-scope-slider[data-part='track'][data-orientation='horizontal'] {
@@ -106,7 +137,7 @@
106
137
  inline-size: var(--xh-_track-thickness);
107
138
  }
108
139
 
109
- /* 禁用:底槽退到 100 档淡底,已选区间换成禁用前景——两者仍分得开,值还读得出,只是没了品牌色 */
140
+ /* 禁用:底槽退到 100 档淡底,已选区间退到 200 档——两者仍分得开,值还读得出,只是没了品牌色 */
110
141
  .xh-scope-slider[data-part='track'][data-disabled] {
111
142
  background: var(--xh-slider-track-bg-disabled, var(--xh-bg-subtle));
112
143
  }
@@ -146,39 +177,35 @@
146
177
  background: var(--xh-slider-range-bg-invalid, var(--xh-border-invalid));
147
178
  }
148
179
 
180
+ /* 区间叠在底槽上:取不透明档,半透明的墨色压在半透明的底槽上会再叠深一层 */
149
181
  .xh-scope-slider[data-part='range'][data-disabled] {
150
- background: var(--xh-slider-range-bg-disabled, var(--xh-fg-disabled));
182
+ background: var(--xh-slider-range-bg-disabled, var(--xh-bg-subtle-hover-opaque));
151
183
  }
152
184
 
153
185
  /* 圆点浮在轨道之上:轨道是流内的,拇指是绝对定位的,天然后来居上,不必再堆 z-index。
154
186
  box-sizing 必须显式写:描边要吃进直径里,否则实际盒子比 --xh-_thumb-size 宽两条边,
155
187
  下面按半个直径回拉的负外边距就对不上圆心。
156
- 拇指是可拖起的 raised 面:描边取装饰边(不透明档),raised 影只是加成、不作边界 */
188
+ 拇指是平面的白底圆:2px 强调色描边就是它的边界,静止不投影;跟着手走时才抬起(见拖动那档) */
157
189
  .xh-scope-slider[data-part='thumb'] {
158
190
  position: absolute;
159
191
  box-sizing: border-box;
160
192
  inline-size: var(--xh-_thumb-size);
161
193
  block-size: var(--xh-_thumb-size);
162
- /* 描边取装饰边的不透明档:墨色描边半透明,压在圆点自己的底上只会是底色的深一档,框不住圆点,
163
- 拇指就与同色的已选区间糊成一片 */
164
- border: var(--xh-stroke-thick) solid var(--xh-slider-thumb-border, var(--xh-border-default-opaque));
194
+ border: var(--xh-stroke-thick) solid var(--xh-slider-thumb-border, var(--xh-_tone, var(--xh-bg-brand)));
165
195
  border-radius: var(--xh-slider-thumb-radius, var(--xh-shape-circle));
166
- background: var(--xh-slider-thumb-bg, var(--xh-_tone, var(--xh-bg-brand)));
167
- /* 圆点上没有字,这一支是给环用的:环灌 currentColor 时取到的是与这块底配对的前景色,
168
- 不写就取到从页面继承下来的正文色 */
169
- color: var(--xh-_tone-on, var(--xh-fg-on-brand));
170
- box-shadow: var(--xh-slider-thumb-shadow, var(--xh-elevation-raised));
196
+ background: var(--xh-slider-thumb-bg, var(--xh-bg-surface));
197
+ box-shadow: var(--xh-slider-thumb-shadow, none);
171
198
  cursor: grab;
172
199
  transition:
173
200
  scale var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong),
174
201
  box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
175
202
  }
176
203
 
177
- /* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
178
- 那一族色本来就要在这块面上把字读清楚,与面的对比是按可读性定的。
179
- 禁用的拇指退成白面,不在这一档里,吃库环 */
180
- .xh-scope-slider[data-part='thumb']:not([data-disabled]):focus-visible {
181
- --xh-_ring-color: currentColor;
204
+ /* 可悬停设备上指针落到拇指即放大一档,与拖动中同一比例:提示它抓得起来 */
205
+ @media (hover: hover) {
206
+ .xh-scope-slider[data-part='thumb']:hover:not([data-disabled], [data-readonly]) {
207
+ scale: var(--xh-slider-thumb-scale-dragging, var(--xh-motion-scale-drag));
208
+ }
182
209
  }
183
210
 
184
211
  /* 内联样式把 inset-inline-start 定在值所在的比例上,那是拇指的**起始边**不是圆心;
@@ -201,7 +228,7 @@
201
228
 
202
229
  /* 多拇指时只有手真正推着的那一个带 data-dragging,放大与光标因此不会全组一起变。
203
230
  放大用 scale 而不是改尺寸:变换绕自身中心发生,圆心不动,负外边距的算式也不用跟着改。
204
- 海拔从静态的 raised 换到 lifted:跟着手走的东西比贴在页面上的抬得高一档,
231
+ 静止时不投影,拖动中才抬起到 lifted:跟着手走的东西离开页面一档,
205
232
  又不到锚定浮层那一层——用 floating 会让拇指和下拉面板一样重。 */
206
233
  .xh-scope-slider[data-part='thumb'][data-dragging] {
207
234
  /* 放大比例落进私有槽:挂在拇指里的值气泡读同一支反向缩回原尺寸 */
@@ -213,16 +240,16 @@
213
240
  }
214
241
 
215
242
  .xh-scope-slider[data-part='thumb'][data-invalid] {
216
- background: var(--xh-slider-thumb-bg-invalid, var(--xh-border-invalid));
243
+ border-color: var(--xh-slider-thumb-border-invalid, var(--xh-border-invalid));
217
244
  }
218
245
 
219
246
  .xh-scope-slider[data-part='thumb'][data-readonly]:not([data-disabled]) {
220
247
  cursor: default;
221
248
  }
222
249
 
223
- /* 禁用:面退到实体白面、描边留着、影收掉——拖不起来的东西不该看着像浮在轨道上。
224
- 不写 color:圆点上没有字,禁用拇指不进 Tab 序列也不会聚焦,环的前景在这里没有消费者 */
250
+ /* 禁用:白面留着、描边退到 200 档(不透明档:描边压在拇指自己的白底上,半透明的墨色要先兑实)、影收掉 */
225
251
  .xh-scope-slider[data-part='thumb'][data-disabled] {
252
+ border-color: var(--xh-slider-thumb-border-disabled, var(--xh-bg-subtle-hover-opaque));
226
253
  background: var(--xh-slider-thumb-bg-disabled, var(--xh-bg-surface));
227
254
  box-shadow: var(--xh-slider-thumb-shadow-disabled, none);
228
255
  cursor: not-allowed;
@@ -280,15 +307,14 @@
280
307
 
281
308
  /* —— 尺寸 —— */
282
309
  /* 尺寸只改 root 上那两个槽位,control / track / thumb 跟着一起走;中间档不写规则,缺省即中档。
283
- 两档都保持"拇指是轨道的三倍厚"这个比例,换档时圆点与底槽的关系看着不变。 */
310
+ 拇指按轨道拇指的三档取 10 / 12 / 16px;轨道小档沿用中档的 2px(再细就读不出是条轨道),大档加到 3px */
284
311
  .xh-scope-slider[data-part='root'][data-size='sm'] {
285
- --xh-_thumb-size: var(--xh-slider-thumb-size, var(--xh-space-3));
286
- --xh-_track-thickness: var(--xh-slider-track-thickness, var(--xh-space-1));
312
+ --xh-_thumb-size: var(--xh-slider-thumb-size, var(--xh-track-thumb-size-sm));
287
313
  }
288
314
 
289
315
  .xh-scope-slider[data-part='root'][data-size='lg'] {
290
- --xh-_thumb-size: var(--xh-slider-thumb-size, var(--xh-space-6));
291
- --xh-_track-thickness: var(--xh-slider-track-thickness, var(--xh-space-2));
316
+ --xh-_thumb-size: var(--xh-slider-thumb-size, var(--xh-track-thumb-size-lg));
317
+ --xh-_track-thickness: var(--xh-slider-track-thickness, var(--xh-stroke-strong));
292
318
  }
293
319
 
294
320
  /* —— 刻度:圆点钉在轨道上、文案排在轨道外侧,坐标由连接层按百分比内联给出 —— */
@@ -298,21 +324,24 @@
298
324
  pointer-events: none;
299
325
  }
300
326
 
301
- /* 刻度点是正方盒,取 circle(正方盒不得用 pill 冒充圆) */
327
+ /* 刻度点是 8px 的白底小圆,2px 描边取轨道色;正方盒取 circle(正方盒不得用 pill 冒充圆)。
328
+ box-sizing 显式写:描边吃进直径里,平移回中才落在比例点上 */
302
329
  .xh-scope-slider[data-part='tick'] {
303
330
  position: absolute;
304
331
  inset-block-start: 50%;
305
- inline-size: var(--xh-slider-tick-size, var(--xh-space-1));
306
- block-size: var(--xh-slider-tick-size, var(--xh-space-1));
332
+ box-sizing: border-box;
333
+ inline-size: var(--xh-slider-tick-size, var(--xh-space-2));
334
+ block-size: var(--xh-slider-tick-size, var(--xh-space-2));
335
+ border: var(--xh-stroke-thick) solid var(--xh-slider-tick-border, var(--xh-bg-subtle-hover));
307
336
  border-radius: var(--xh-slider-tick-radius, var(--xh-shape-circle));
308
- background: var(--xh-slider-tick-bg, var(--xh-border-strong));
337
+ background: var(--xh-slider-tick-bg, var(--xh-bg-surface));
309
338
  /* 连接层把比例点写在 inset-inline-start 上:平移的行内分量乘书写方向的符号,rtl 下掉头,刻度点才以比例点为中心 */
310
339
  translate: calc(-50% * var(--xh-direction-sign)) -50%;
311
340
  }
312
341
 
313
- /* 落进已选区间的刻度点跟 range 同色 */
342
+ /* 落进已选区间的刻度点描边跟 range 同色 */
314
343
  .xh-scope-slider[data-part='tick'][data-passed] {
315
- background: var(--xh-slider-tick-bg-active, var(--xh-_tone, var(--xh-bg-brand)));
344
+ border-color: var(--xh-slider-tick-border-active, var(--xh-_tone, var(--xh-bg-brand)));
316
345
  }
317
346
 
318
347
  .xh-scope-slider[data-part='tick-label'] {
@@ -334,13 +363,13 @@
334
363
  }
335
364
 
336
365
  /* 禁用:刻度点与文案由 tick-group 上的 data-disabled 下发(连接层不给每个刻度单发),
337
- 已过的刻度点与区间同色,文案换禁用前景,点它跳档的手型收掉 */
366
+ 刻度点描边与底槽同退到 100 档、已过的与区间同退到 200 档,文案换禁用前景,点它跳档的手型收掉 */
338
367
  .xh-scope-slider[data-part='tick-group'][data-disabled] [data-part='tick']:where(.xh-scope-slider) {
339
- background: var(--xh-slider-tick-bg-disabled, var(--xh-border-default));
368
+ border-color: var(--xh-slider-tick-border-disabled, var(--xh-bg-subtle));
340
369
  }
341
370
 
342
371
  .xh-scope-slider[data-part='tick-group'][data-disabled] [data-part='tick'][data-passed]:where(.xh-scope-slider) {
343
- background: var(--xh-slider-tick-bg-active-disabled, var(--xh-fg-disabled));
372
+ border-color: var(--xh-slider-tick-border-active-disabled, var(--xh-bg-subtle-hover-opaque));
344
373
  }
345
374
 
346
375
  .xh-scope-slider[data-part='tick-group'][data-disabled] [data-part='tick-label']:where(.xh-scope-slider) {
@@ -23,6 +23,12 @@
23
23
  --xh-_chart-metric-gap: var(--xh-chart-gap);
24
24
  --xh-_chart-metric-bar-max: var(--xh-sparkline-bar-max, var(--xh-chart-bar-max));
25
25
  --xh-_chart-metric-radius: var(--xh-sparkline-bar-radius, var(--xh-shape-inset));
26
+ /* 迷你图不画轴、标签与命中区,这几项照样写全:度量槽登记成了长度,不写的那项读到的是初始值 0,不是缺省 */
27
+ --xh-_chart-metric-hit-min: var(--xh-chart-hit-min);
28
+ --xh-_chart-metric-tick-length: var(--xh-chart-tick-length);
29
+ --xh-_chart-metric-label-gap: var(--xh-chart-label-gap);
30
+ --xh-_chart-metric-font-size: var(--xh-text-caption-size);
31
+ --xh-_chart-metric-leading: var(--xh-leading-tight);
26
32
 
27
33
  /* 缺省中性:线与柱退到弱化色,只让标记点取品牌色相的色槽 1,读者先看到「现在在哪」 */
28
34
  --xh-_sparkline-color: var(--xh-sparkline-color, var(--xh-chart-deemphasis));
@@ -30,9 +36,9 @@
30
36
 
31
37
  display: inline-block;
32
38
  inline-size: var(--xh-sparkline-width, 6rem);
33
- /* 级联兜底:先写一行的高度算式(正文字号 × 正文行距),再写 1lh。
39
+ /* 级联兜底:先写一行正文的行框令牌(正文字号 × 正文行距),再写 1lh。
34
40
  1lh 晚于本库声明的浏览器地板,取不到时旧引擎丢掉后一条、留下前一条。 */
35
- block-size: var(--xh-sparkline-height, calc(var(--xh-text-body-size) * var(--xh-text-body-leading)));
41
+ block-size: var(--xh-sparkline-height, var(--xh-text-body-line-h));
36
42
  block-size: var(--xh-sparkline-height, 1lh);
37
43
  /* 高度正好是一个行盒:顶边贴行盒顶边,行高不被撑开;居中对齐会按字的 x 高度再挪半格,行盒就多出一截 */
38
44
  vertical-align: top;