@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
@@ -22,20 +22,22 @@
22
22
  /* 作者塞进面板或分页行里的图标按档取字形尺;四类格子上另按家族档位取同一把尺 */
23
23
  --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-glyph-size-md));
24
24
 
25
- /* 尺寸档只换这三个私有槽,上一页/下一页、页码与省略号都从这两处继承它们,
26
- 换档不必给每个部件各写一条选择器 */
25
+ /* 尺寸档只换这几个私有槽,上一页/下一页、页码与省略号都从这两处继承它们,
26
+ 换档不必给每个部件各写一条选择器。格子的横内衬比控件尺窄一档:一位数的页码加两侧内衬
27
+ 要收得进方格的最小宽度,格子才是正方的;跳页输入框是字段,仍取控件尺的横内衬 */
27
28
  --xh-_pagination-item-size: var(--xh-control-h-md);
28
- --xh-_pagination-item-px: var(--xh-control-px-md);
29
+ --xh-_pagination-item-px: var(--xh-space-2);
30
+ --xh-_pagination-jumper-px: var(--xh-control-px-md);
29
31
  --xh-_pagination-font-size: var(--xh-control-font-md);
30
32
 
31
33
  /* 当前页的选中态随语气走。没写 data-tone 时这几个 --xh-_tone-* 都没被声明,
32
34
  退回原来的品牌底与其配色。聚焦环不在其列,它恒是 --xh-ring-focus */
33
- --xh-_pagination-selected-bg: var(--xh-_tone, var(--xh-bg-brand));
34
- --xh-_pagination-selected-bg-hover: var(--xh-_tone-hover, var(--xh-bg-brand-hover));
35
- --xh-_pagination-selected-bg-active: var(--xh-_tone-active, var(--xh-bg-brand-active));
36
- --xh-_pagination-selected-fg: var(--xh-_tone-on, var(--xh-fg-on-brand));
35
+ --xh-_pagination-selected-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
36
+ --xh-_pagination-selected-bg-hover: var(--xh-_tone-subtle-hover, var(--xh-bg-brand-subtle-hover));
37
+ --xh-_pagination-selected-bg-active: var(--xh-_tone-subtle-active, var(--xh-bg-brand-subtle-active));
38
+ --xh-_pagination-selected-fg: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
39
+ --xh-_pagination-selected-border: var(--xh-_tone-border-control, var(--xh-bg-brand));
37
40
  /* 当前页那一格是实心底,顶边画一条极浅的内高光把它衬出厚度(solid 面允许顶高光,经家族的 highlight 槽画) */
38
- --xh-_pagination-highlight: var(--xh-_highlight-tone);
39
41
  }
40
42
 
41
43
  /* 根节点是 nav 地标,只负责把上一页 / 页码 / 下一页排成一行。
@@ -55,14 +57,16 @@
55
57
  .xh-scope-pagination:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
56
58
  --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-glyph-size-sm));
57
59
  --xh-_pagination-item-size: var(--xh-control-h-sm);
58
- --xh-_pagination-item-px: var(--xh-control-px-sm);
60
+ --xh-_pagination-item-px: var(--xh-space-1_5);
61
+ --xh-_pagination-jumper-px: var(--xh-control-px-sm);
59
62
  --xh-_pagination-font-size: var(--xh-control-font-sm);
60
63
  }
61
64
 
62
65
  .xh-scope-pagination:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
63
66
  --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-glyph-size-lg));
64
67
  --xh-_pagination-item-size: var(--xh-control-h-lg);
65
- --xh-_pagination-item-px: var(--xh-control-px-lg);
68
+ --xh-_pagination-item-px: var(--xh-space-2_5);
69
+ --xh-_pagination-jumper-px: var(--xh-control-px-lg);
66
70
  --xh-_pagination-font-size: var(--xh-control-font-lg);
67
71
  }
68
72
 
@@ -70,9 +74,9 @@
70
74
  display: none;
71
75
  }
72
76
 
73
- /* 各类格子接 Action Control 的 text 档,缺省中性的 ghost 形态(只有 Button 品牌实心):盒型、三档几何、
74
- 透明描边(省略号也占一条,两者内容盒等高,一行里对得齐)、悬停 100 → 按下 200(画布承载)、禁用面、按压缩放与
75
- 过渡都由家族给;这里只把使用者槽映射到桥接槽并保留分页自己的排版。
77
+ /* 各类格子接 Action Control 的 text 档(连接层投影 ghost 形态):盒型、三档几何、禁用面、按压与过渡都由家族给。
78
+ 分页把每一格画成描边方块:静息一道装饰边、透明底,悬停边加深一档、字转正文色,底走家族的承载面阶梯;
79
+ 省略位也占同样一格,几种格子内容盒等高,一行里对得齐。这里把使用者槽映射到桥接槽并保留分页自己的排版。
76
80
  等宽的关键:1 与 10 的内容宽度不同,靠最小宽度把它们撑到同一格,行宽才不会随当前页左右抖动 */
77
81
  .xh-scope-pagination[data-part='first-trigger'],
78
82
  .xh-scope-pagination[data-part='prev-trigger'],
@@ -83,14 +87,19 @@
83
87
  --xh-action-min-inline-size: var(--xh-pagination-item-min-size, var(--xh-_pagination-item-size));
84
88
  --xh-action-visual-size: var(--xh-pagination-item-h, var(--xh-_pagination-item-size));
85
89
  --xh-action-padding-inline: var(--xh-pagination-item-px, var(--xh-_pagination-item-px));
86
- --xh-action-radius: var(--xh-pagination-item-radius, var(--xh-shape-control));
90
+ --xh-action-radius: var(--xh-pagination-item-radius, var(--xh-shape-surface));
87
91
  --xh-action-font-size: var(--xh-pagination-font-size, var(--xh-_pagination-font-size));
88
92
  --xh-action-bg-rest: var(--xh-pagination-item-bg, var(--xh-_action-variant-bg-rest));
89
93
  --xh-action-bg-hover: var(--xh-pagination-item-bg-hover, var(--xh-_action-variant-bg-hover));
90
94
  --xh-action-bg-pressed: var(--xh-pagination-item-bg-active, var(--xh-_action-variant-bg-pressed));
95
+ --xh-action-border-rest: var(--xh-pagination-item-border, var(--xh-border-default));
96
+ --xh-action-border-hover: var(--xh-pagination-item-border-hover, var(--xh-border-strong));
97
+ --xh-action-border-pressed: var(--xh-pagination-item-border-hover, var(--xh-border-strong));
98
+ --xh-action-border-focus-visible: var(--xh-pagination-item-border, var(--xh-border-default));
99
+ --xh-action-border-disabled: var(--xh-pagination-item-border, var(--xh-border-default));
91
100
  --xh-action-fg-rest: var(--xh-pagination-item-fg, var(--xh-_action-variant-fg-rest));
92
- --xh-action-fg-hover: var(--xh-pagination-item-fg, var(--xh-_action-variant-fg-hover));
93
- --xh-action-fg-pressed: var(--xh-pagination-item-fg, var(--xh-_action-variant-fg-pressed));
101
+ --xh-action-fg-hover: var(--xh-pagination-item-fg, var(--xh-fg-default));
102
+ --xh-action-fg-pressed: var(--xh-pagination-item-fg, var(--xh-fg-default));
94
103
  /* 作者塞进翻页钮的图标按档取字形尺,与皮肤画的兜底字形同一把尺 */
95
104
  --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-_action-profile-glyph-size));
96
105
 
@@ -112,10 +121,9 @@
112
121
  /* 到头那一侧的翻页钮是原生 disabled(不可聚焦、进不了 Tab 序列),连接层同时给 data-disabled,
113
122
  家族按 data-disabled 画禁用面(透明底 + --xh-fg-disabled);整组 disabled 时页码与省略位同样如此 */
114
123
 
115
- /* 当前页(格状当前):data-current 与 aria-current='page' 由连接层成对给出,样式挂在 data 钩子上,
116
- 无障碍语义留给 aria。实心品牌面 + 配对前景、不加粗——字重一变字形就变宽,页码格子会跟着长一点,
117
- 正是这里要避免的抖动;悬停 / 按下沿 brand → brand-hover → brand-active 走,三态都经桥接槽交给家族画,
118
- solid 面允许一条顶高光,环色改取面自己的前景 */
124
+ /* 当前页:data-current 与 aria-current='page' 由连接层成对给出,样式挂在 data 钩子上,无障碍语义留给 aria。
125
+ 品牌描边 + 品牌淡底 + 淡底前景、不加粗——字重一变字形就变宽,页码格子会跟着长一点,正是这里要避免的抖动;
126
+ 悬停 / 按下沿淡底 12% → 20% → 28% 走,边不变,三态都经桥接槽交给家族画 */
119
127
  .xh-scope-pagination[data-part='item'][data-current] {
120
128
  --xh-action-bg-rest: var(--xh-pagination-item-bg-selected, var(--xh-_pagination-selected-bg));
121
129
  --xh-action-bg-hover: var(--xh-pagination-item-bg-selected-hover, var(--xh-_pagination-selected-bg-hover));
@@ -125,22 +133,17 @@
125
133
  --xh-action-fg-hover: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
126
134
  --xh-action-fg-pressed: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
127
135
  --xh-action-fg-focus-visible: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
128
- --xh-action-border-rest: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-bg));
129
- --xh-action-border-hover: var(--xh-pagination-item-border-selected-hover, var(--xh-_pagination-selected-bg-hover));
130
- --xh-action-border-pressed: var(--xh-pagination-item-border-selected-active, var(--xh-_pagination-selected-bg-active));
131
- --xh-action-border-focus-visible: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-bg));
132
- --xh-action-highlight-rest: var(--xh-_pagination-highlight);
133
- --xh-action-highlight-hover: var(--xh-_pagination-highlight);
134
- --xh-action-highlight-pressed: var(--xh-_pagination-highlight);
135
- --xh-action-highlight-focus-visible: var(--xh-_pagination-highlight);
136
+ --xh-action-border-rest: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-border));
137
+ --xh-action-border-hover: var(--xh-pagination-item-border-selected-hover, var(--xh-_pagination-selected-border));
138
+ --xh-action-border-pressed: var(--xh-pagination-item-border-selected-active, var(--xh-_pagination-selected-border));
139
+ --xh-action-border-focus-visible: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-border));
136
140
  --xh-action-shadow-rest: var(--xh-pagination-item-shadow, none);
137
141
  --xh-action-shadow-hover: var(--xh-pagination-item-shadow, none);
138
142
  --xh-action-shadow-pressed: var(--xh-pagination-item-shadow, none);
139
143
  --xh-action-shadow-focus-visible: var(--xh-pagination-item-shadow, none);
140
- --xh-action-ring-color-focus-visible: currentColor;
141
144
  }
142
145
 
143
- /* 整组禁用时当前页不跟着透明:实心品牌面退成淡底、字取禁用色,格子仍标得出位置,又一眼看得出按不动 */
146
+ /* 整组禁用时当前页不跟着透明:品牌淡底退成中性淡底、字取禁用色,格子仍标得出位置,又一眼看得出按不动 */
144
147
  .xh-scope-pagination[data-part='item'][data-current][data-disabled] {
145
148
  --xh-action-bg-disabled: var(--xh-bg-subtle);
146
149
  --xh-action-border-disabled: var(--xh-bg-subtle);
@@ -192,7 +195,7 @@
192
195
  高度、内衬与圆角跟页码格子同一把尺,宽度按页码位数留够 */
193
196
  .xh-scope-pagination[data-part='jumper'] {
194
197
  --xh-field-control-height: var(--xh-pagination-item-h, var(--xh-_pagination-item-size));
195
- --xh-field-control-padding-inline: var(--xh-pagination-item-px, var(--xh-_pagination-item-px));
198
+ --xh-field-control-padding-inline: var(--xh-pagination-item-px, var(--xh-_pagination-jumper-px));
196
199
  --xh-field-control-min-inline-size: 0;
197
200
  --xh-field-control-radius: var(--xh-pagination-item-radius, var(--xh-shape-control));
198
201
  --xh-field-bg-rest: var(--xh-pagination-jumper-bg, var(--xh-_field-variant-bg-rest));
@@ -203,8 +206,6 @@
203
206
  --xh-field-border-hover: var(--xh-pagination-jumper-border-hover, var(--xh-_field-variant-border-hover));
204
207
  --xh-field-border-focus: var(--xh-pagination-jumper-border-focus, var(--xh-_field-variant-border-focus));
205
208
  --xh-field-border-invalid: var(--xh-pagination-jumper-border-invalid, var(--xh-_field-variant-border-invalid));
206
- --xh-field-ring-focus: var(--xh-ring-focus);
207
- --xh-field-ring-invalid: var(--xh-ring-invalid);
208
209
  --xh-field-shadow-rest: none;
209
210
 
210
211
  flex: none;
@@ -220,16 +221,12 @@
220
221
  display: none;
221
222
  }
222
223
 
223
- /* 越界的页码(超出 1 到总页数):浏览器的约束校验在用户动过之后判失败,与字段家族的校验失败同一副边与环。
224
+ /* 越界的页码(超出 1 到总页数):浏览器的约束校验在用户动过之后判失败,与字段家族的校验失败同一副边。
224
225
  家族的失败档认 data-invalid,跳页框的取值不进状态机,失败由原生约束给出 */
225
226
  .xh-scope-pagination[data-part='jumper']:user-invalid {
226
227
  border-color: var(--xh-field-border-invalid, var(--xh-_field-variant-border-invalid));
227
228
  }
228
229
 
229
- .xh-scope-pagination[data-part='jumper']:user-invalid:focus-within {
230
- outline-color: var(--xh-field-ring-invalid, var(--xh-ring-invalid));
231
- }
232
-
233
230
  /* 摊开省略位的定位层。三处坐标系必须同为 fixed:机器交给引擎的 strategy、
234
231
  连接层的内联 position、这里 —— 差一处就会算在错的坐标系里 */
235
232
  .xh-scope-pagination[data-part='positioner'] {
@@ -31,8 +31,6 @@
31
31
  /* 提示与切换钮里的字形都比正文小一档,三个尺寸档各自换过,不是一个恒等的中转 */
32
32
  --xh-_password-input-caps-lock-font-size: var(--xh-control-caption-md);
33
33
  --xh-_password-input-trigger-font-size: var(--xh-control-caption-md);
34
- /* 切换钮与输入之间那道线的长度:取钮高的一半,线的上下各留一截空白 */
35
- --xh-_password-input-divider-h: 50%;
36
34
 
37
35
  /* 盒里有两个 Tab 停靠点,切换钮上再画一圈自己的环;环恒用 --xh-ring-focus,校验失败时随盒换红 */
38
36
  --xh-_password-input-ring: var(--xh-ring-focus);
@@ -77,13 +75,15 @@
77
75
 
78
76
  /* —— 标题 —— */
79
77
  .xh-scope-password-input[data-part='label'] {
80
- color: var(--xh-password-input-label-fg, var(--xh-fg-default));
78
+ /* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-password-input-label-gap 给多少最终就是多少 */
79
+ margin-block-end: calc(var(--xh-password-input-label-gap, var(--xh-space-2)) - var(--xh-password-input-gap, var(--xh-space-1)));
80
+ color: var(--xh-password-input-label-fg, var(--xh-fg-muted));
81
81
  font-size: var(--xh-password-input-label-font-size, var(--xh-text-label-size));
82
82
  font-weight: var(--xh-password-input-label-font-weight, var(--xh-text-label-weight));
83
83
  }
84
84
 
85
85
  .xh-scope-password-input[data-part='label'][data-disabled] {
86
- color: var(--xh-password-input-label-fg-disabled, var(--xh-fg-subtle));
86
+ color: var(--xh-password-input-label-fg-disabled, var(--xh-fg-muted));
87
87
  }
88
88
 
89
89
  /* —— 一体式 control:输入框、切换钮与提示同框 —— */
@@ -104,8 +104,6 @@
104
104
  --xh-field-border-hover: var(--xh-password-input-control-border-hover, var(--xh-_field-variant-border-hover));
105
105
  --xh-field-border-focus: var(--xh-password-input-control-border-focus, var(--xh-_field-variant-border-focus));
106
106
  --xh-field-border-invalid: var(--xh-password-input-control-border-invalid, var(--xh-_field-variant-border-invalid));
107
- --xh-field-ring-focus: var(--xh-ring-focus);
108
- --xh-field-ring-invalid: var(--xh-ring-invalid);
109
107
  --xh-field-shadow-rest: var(--xh-password-input-control-shadow, none);
110
108
  /* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
111
109
  --xh-field-glyph-size: var(--xh-password-input-icon-size, var(--xh-_field-size-glyph-size));
@@ -131,8 +129,10 @@
131
129
  }
132
130
 
133
131
  /* —— 明暗切换钮 —— */
134
- /* 正方视觉盒、inset 圆角、悬停 100 / 按下 200 与 0.97 按压、粗指针热区全由 Action Control 的
135
- field-inset ghost 档给,组件只映射既有覆盖槽;常态只剩符号,符号取次级前景 */
132
+ /* inset 圆角、按承载面取的悬停 / 按下阶梯、粗指针热区全由 Action Control 的 field-inset ghost 档给,
133
+ 组件只映射既有覆盖槽;常态只剩符号,符号取次级前景。
134
+ 视觉盒按字段内钮尺寸表随字段档(sm 取控件内动作档、md 取 control-h-sm、lg 取 control-h-md),
135
+ 由 field-inset 档按 data-xh-action-size 给:比字段矮一档,是框里的辅助动作、不与输入抢 */
136
136
  .xh-scope-password-input[data-part='visibility-trigger'] {
137
137
  --xh-action-visual-size: var(--xh-password-input-trigger-size, var(--xh-_action-profile-visual-size));
138
138
  --xh-action-min-inline-size: var(--xh-password-input-trigger-size, var(--xh-_action-profile-visual-size));
@@ -161,44 +161,7 @@
161
161
  display: none;
162
162
  }
163
163
 
164
- /* 显隐动作与输入/状态区之间留一道半高分隔。::before 是兜底字形、::after 在粗指针下是家族给的
165
- 44px 热区,线只能落在 background-image 上:一条 1px × 半高的渐变贴在靠输入的那一侧,
166
- 不随按钮悬停底或圆角变化。background-position 是物理轴,RTL 另给两条换边。 */
167
- .xh-scope-password-input[data-part='control']
168
- > .xh-scope-password-input[data-part='visibility-trigger']:has(~ .xh-scope-password-input[data-part='input']),
169
- .xh-scope-password-input[data-part='control']
170
- > .xh-scope-password-input[data-part='input'] ~ .xh-scope-password-input[data-part='visibility-trigger'] {
171
- background-image: linear-gradient(
172
- var(--xh-password-input-visibility-trigger-separator-color, var(--xh-border-subtle)),
173
- var(--xh-password-input-visibility-trigger-separator-color, var(--xh-border-subtle))
174
- );
175
- background-repeat: no-repeat;
176
- background-size: var(--xh-stroke-thin) var(--xh-password-input-visibility-trigger-separator-h, var(--xh-_password-input-divider-h));
177
- }
178
-
179
- /* 钮排在输入之前:线贴在钮的逻辑末端 */
180
- .xh-scope-password-input[data-part='control']
181
- > .xh-scope-password-input[data-part='visibility-trigger']:has(~ .xh-scope-password-input[data-part='input']) {
182
- background-position: 100% 50%;
183
- }
184
-
185
- [dir='rtl'] .xh-scope-password-input[data-part='control']
186
- > .xh-scope-password-input[data-part='visibility-trigger']:has(~ .xh-scope-password-input[data-part='input']) {
187
- background-position: 0 50%;
188
- }
189
-
190
- /* 钮排在输入之后:线贴在钮的逻辑起始侧 */
191
- .xh-scope-password-input[data-part='control']
192
- > .xh-scope-password-input[data-part='input'] ~ .xh-scope-password-input[data-part='visibility-trigger'] {
193
- background-position: 0 50%;
194
- }
195
-
196
- [dir='rtl'] .xh-scope-password-input[data-part='control']
197
- > .xh-scope-password-input[data-part='input'] ~ .xh-scope-password-input[data-part='visibility-trigger'] {
198
- background-position: 100% 50%;
199
- }
200
-
201
- /* 盒里有两个 Tab 停靠点,盒子在 :focus-within 上画的那一圈两者完全一样,
164
+ /* 盒里有两个 Tab 停靠点,盒子在 :focus-within 上换的聚焦描边两者完全一样,
202
165
  分不出焦点在框里还是在钮上,所以钮上再画一圈自己的环(家族只对不占 Tab 位的内嵌钮关环)。
203
166
  环往内收,压在按钮自己的方框里,不与盒子外面那一圈叠在一起。
204
167
  指示焦点只能用环不能用底色:可用的几档底色压在盒底上都到不了 3:1,换了色也等于没画 */
@@ -338,29 +301,10 @@
338
301
  --xh-_password-input-strength-fg: var(--xh-fg-disabled);
339
302
  }
340
303
 
341
- /* 高对比档整层丢弃 background-image,分隔线改用系统色重画,并关掉这一颗钮的强制换色 */
342
304
  @media (forced-colors: active) {
343
- .xh-scope-password-input[data-part='control']
344
- > .xh-scope-password-input[data-part='visibility-trigger']:has(~ .xh-scope-password-input[data-part='input']),
345
- .xh-scope-password-input[data-part='control']
346
- > .xh-scope-password-input[data-part='input'] ~ .xh-scope-password-input[data-part='visibility-trigger'] {
347
- background-image: linear-gradient(CanvasText, CanvasText);
348
- forced-color-adjust: none;
349
- }
350
-
351
- .xh-scope-password-input[data-part='control'][data-disabled]
352
- > .xh-scope-password-input[data-part='visibility-trigger']:has(~ .xh-scope-password-input[data-part='input']),
353
- .xh-scope-password-input[data-part='control'][data-disabled]
354
- > .xh-scope-password-input[data-part='input'] ~ .xh-scope-password-input[data-part='visibility-trigger'] {
355
- background-image: linear-gradient(GrayText, GrayText);
356
- }
357
-
358
- /* 关掉强制换色后,上面那圈自留的 :focus-visible 环与家族普通态的焦点底/字都会按作者色落地;
359
- 家族高对比块的特指度压不过它们,这里用同一选择器把环、底、字改回系统色 */
305
+ /* 钮上那圈自留的 :focus-visible 环取系统高亮色:家族高对比块的特指度压不过上面那条环规则 */
360
306
  .xh-scope-password-input[data-part='control'] [data-part='visibility-trigger']:where(.xh-scope-password-input):focus-visible {
361
307
  outline-color: Highlight;
362
- background-color: ButtonFace;
363
- color: ButtonText;
364
308
  }
365
309
  }
366
310
 
@@ -15,10 +15,11 @@
15
15
  /* 与文本框、数字框同一套堆叠:标签一行、格子一行。
16
16
  格子的描边、底、圆角、五态与悬停由 Field Chrome 家族按格子上的 data-variant 生成,皮肤不再声明形态三档 */
17
17
  .xh-scope-pin-input[data-part='root'] {
18
- /* 尺寸档只换这三个私有槽,格子与分隔都从 root 继承它们,换档不必给每个部件各写一条选择器 */
19
- --xh-_pin-input-box-size: var(--xh-control-box-md);
20
- --xh-_pin-input-box-gap: var(--xh-control-gap-md);
21
- --xh-_pin-input-box-font-size: var(--xh-text-heading-3-size);
18
+ /* 尺寸档只换这两个私有槽,格子与分隔都从 root 继承它们,换档不必给每个部件各写一条选择器。
19
+ 格子边长取控件高档,与同一行里的字段等高;字号取控件字号档;格间距三档同为 --xh-space-1 */
20
+ --xh-_pin-input-box-size: var(--xh-control-h-md);
21
+ --xh-_pin-input-box-gap: var(--xh-space-1);
22
+ --xh-_pin-input-box-font-size: var(--xh-control-font-md);
22
23
  /* 填满态的强调色随语气走。没写 data-tone 时 --xh-_tone 没被声明,退回品牌色 */
23
24
  --xh-_pin-input-accent: var(--xh-_tone, var(--xh-bg-brand));
24
25
 
@@ -38,26 +39,25 @@
38
39
 
39
40
  /* —— 尺寸 —— */
40
41
  .xh-scope-pin-input[data-part='root'][data-size='sm'] {
41
- --xh-_pin-input-box-size: var(--xh-control-box-sm);
42
- --xh-_pin-input-box-gap: var(--xh-control-gap-sm);
43
- --xh-_pin-input-box-font-size: var(--xh-control-font-lg);
42
+ --xh-_pin-input-box-size: var(--xh-control-h-sm);
43
+ --xh-_pin-input-box-font-size: var(--xh-control-font-sm);
44
44
  }
45
45
 
46
- /* 格子是正方形,缺省档已经占到控件高度表的顶档,lg 档由顶档加一格间距合成,不另立数值 */
47
46
  .xh-scope-pin-input[data-part='root'][data-size='lg'] {
48
- --xh-_pin-input-box-size: var(--xh-control-box-lg);
49
- --xh-_pin-input-box-gap: var(--xh-control-gap-lg);
50
- --xh-_pin-input-box-font-size: var(--xh-text-heading-2-size);
47
+ --xh-_pin-input-box-size: var(--xh-control-h-lg);
48
+ --xh-_pin-input-box-font-size: var(--xh-control-font-lg);
51
49
  }
52
50
 
53
51
  .xh-scope-pin-input[data-part='label'] {
54
- color: var(--xh-pin-input-label-fg, var(--xh-fg-default));
52
+ /* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-pin-input-label-gap 给多少最终就是多少 */
53
+ margin-block-end: calc(var(--xh-pin-input-label-gap, var(--xh-space-2)) - var(--xh-pin-input-gap, var(--xh-space-1)));
54
+ color: var(--xh-pin-input-label-fg, var(--xh-fg-muted));
55
55
  font-size: var(--xh-pin-input-label-font-size, var(--xh-text-label-size));
56
56
  font-weight: var(--xh-pin-input-label-font-weight, var(--xh-text-label-weight));
57
57
  }
58
58
 
59
59
  .xh-scope-pin-input[data-part='label'][data-disabled] {
60
- color: var(--xh-pin-input-label-fg-disabled, var(--xh-fg-subtle));
60
+ color: var(--xh-pin-input-label-fg-disabled, var(--xh-fg-muted));
61
61
  }
62
62
 
63
63
  /* 分段:连着的几格圈成一段。它只排版,格间距仍由格子自己的相邻兄弟规则给 */
@@ -109,8 +109,6 @@
109
109
  --xh-field-border-hover: var(--xh-pin-input-box-border-hover, var(--xh-_field-variant-border-hover));
110
110
  --xh-field-border-focus: var(--xh-pin-input-box-border-focus, var(--xh-_field-variant-border-focus));
111
111
  --xh-field-border-invalid: var(--xh-pin-input-box-border-invalid, var(--xh-_field-variant-border-invalid));
112
- --xh-field-ring-focus: var(--xh-ring-focus);
113
- --xh-field-ring-invalid: var(--xh-ring-invalid);
114
112
  --xh-field-shadow-rest: var(--xh-pin-input-box-shadow, none);
115
113
 
116
114
  /* 一行放不下时逐格收窄,收不动就整行顶出屏幕。
@@ -141,19 +139,13 @@
141
139
  color: var(--xh-pin-input-placeholder-fg, var(--xh-fg-subtle));
142
140
  }
143
141
 
144
- /* 一行格子长得一模一样,光标那道竖线太细,看不出正在填哪一格:
145
- 当前格必须有明显的环。data-focus 由机器给(它知道谁是当前格),
146
- 家族的 :focus-within 兜住机器状态还没回流的那一帧,两条同时写不冲突。
147
- 焦点边一律家族的 --xh-border-control-focus,不随 tone */
142
+ /* 一行格子长得一模一样,光标那道竖线太细,看不出正在填哪一格:当前格与字段外壳的聚焦态同一副面——
143
+ 换承载面 + 聚焦描边,压在别的格子的字段淡底之间一眼分得出,不另画环(强制色档由家族补系统色环)。
144
+ data-focus 由机器给(它知道谁是当前格),家族的 :focus-within 兜住机器状态还没回流的那一帧,
145
+ 两条同时写不冲突。焦点边一律家族的 --xh-border-control-focus,不随 tone */
148
146
  .xh-scope-pin-input[data-part='input'][data-focus] {
149
147
  border-color: var(--xh-pin-input-box-border-focus, var(--xh-_field-variant-border-focus));
150
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
151
- outline-offset: var(--xh-ring-offset);
152
- }
153
-
154
- /* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
155
- .xh-scope-pin-input[data-part='input'][data-invalid][data-focus] {
156
- outline-color: var(--xh-ring-invalid);
148
+ background-color: var(--xh-_field-variant-bg-focus);
157
149
  }
158
150
 
159
151
  /* 填满只代表"格子都有字",不代表"验证码对",所以用品牌色而不是成功色收个尾。
@@ -115,15 +115,19 @@
115
115
 
116
116
  /* 作者塞进面板里的图标按控件档取;两颗动作钮另由家族配方按 sm 档下发字形尺 */
117
117
  --xh-icon-size: var(--xh-popconfirm-icon-size, var(--xh-glyph-size-md));
118
- /* 尺寸档只换这两个私有槽 */
119
- --xh-_popconfirm-pad: var(--xh-surface-pad-md);
118
+ /* 尺寸档只换这三个私有槽:横向内衬比纵向高一档(缺省纵 12 横 16),与 popover 同一套 */
119
+ --xh-_popconfirm-py: var(--xh-surface-pad-md);
120
+ --xh-_popconfirm-px: var(--xh-surface-pad-lg);
120
121
  --xh-_popconfirm-max-w: var(--xh-overlay-max-w);
121
122
 
122
123
  position: relative;
123
124
  display: grid;
124
125
  grid-template-columns: 1fr auto auto;
125
126
  align-items: center;
126
- gap: var(--xh-popconfirm-gap, var(--xh-space-2));
127
+ /* 行距与气泡族同一档:标题与说明之间只留 4px;两颗钮之间的列距另由 column-gap 放宽。
128
+ column-gap 写在 gap 之后,先回落到 gap 槽再取缺省:作者只写 --xh-popconfirm-gap 时行列一起跟着它走 */
129
+ gap: var(--xh-popconfirm-gap, var(--xh-space-1));
130
+ column-gap: var(--xh-popconfirm-column-gap, var(--xh-popconfirm-gap, var(--xh-space-2)));
127
131
  inline-size: max-content;
128
132
  /* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的两颗钮就点不到了 */
129
133
  max-inline-size: min(var(--xh-popconfirm-max-w, var(--xh-_popconfirm-max-w)), var(--xh-_popconfirm-available-w));
@@ -132,8 +136,8 @@
132
136
  overflow-y: auto;
133
137
  /* 浮在页面之上的 Overlay 滚动面:滚到头不把页面一起带走 */
134
138
  overscroll-behavior: contain;
135
- padding-block: var(--xh-popconfirm-py, var(--xh-_popconfirm-pad));
136
- padding-inline: var(--xh-popconfirm-px, var(--xh-_popconfirm-pad));
139
+ padding-block: var(--xh-popconfirm-py, var(--xh-_popconfirm-py));
140
+ padding-inline: var(--xh-popconfirm-px, var(--xh-_popconfirm-px));
137
141
  border-radius: var(--xh-popconfirm-radius, var(--xh-shape-overlay));
138
142
  pointer-events: auto;
139
143
  /* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
@@ -171,32 +175,35 @@
171
175
  }
172
176
 
173
177
  /* —— 尺寸 —— */
174
- /* 缺省档写在 content 的基础规则里;四边等宽的面板内衬三档取 surface-pad 那把尺 */
178
+ /* 缺省档写在 content 的基础规则里;内衬三档取 surface-pad 那把尺,横向始终比纵向高一档 */
175
179
  .xh-scope-popconfirm[data-part='content'][data-size='sm'] {
176
- --xh-_popconfirm-pad: var(--xh-surface-pad-sm);
180
+ --xh-_popconfirm-py: var(--xh-surface-pad-sm);
181
+ --xh-_popconfirm-px: var(--xh-surface-pad-md);
177
182
  --xh-_popconfirm-max-w: var(--xh-overlay-max-w-sm);
178
183
  }
179
184
 
180
185
  .xh-scope-popconfirm[data-part='content'][data-size='lg'] {
181
- --xh-_popconfirm-pad: var(--xh-surface-pad-lg);
186
+ --xh-_popconfirm-py: var(--xh-surface-pad-lg);
187
+ --xh-_popconfirm-px: var(--xh-surface-pad-xl);
182
188
  --xh-_popconfirm-max-w: var(--xh-overlay-max-w-lg);
183
189
  }
184
190
 
191
+ /* 气泡标题:14px / medium / 正文色 */
185
192
  .xh-scope-popconfirm[data-part='title'] {
186
193
  margin: 0;
187
194
  min-inline-size: 0;
188
195
  font-size: var(--xh-popconfirm-title-font-size, var(--xh-text-label-size));
189
- font-weight: var(--xh-popconfirm-title-font-weight, var(--xh-font-weight-semibold));
196
+ font-weight: var(--xh-popconfirm-title-font-weight, var(--xh-font-weight-medium));
190
197
  line-height: var(--xh-leading-tight);
191
198
  overflow-wrap: anywhere;
192
199
  color: var(--xh-popconfirm-title-fg, var(--xh-material-frosted-fg));
193
200
  }
194
201
 
195
- /* 说明文字走说明档:13px + fg-muted */
202
+ /* 说明就是气泡的正文:14px 正文字号 + fg-muted 次级色 */
196
203
  .xh-scope-popconfirm[data-part='description'] {
197
204
  margin: 0;
198
205
  min-inline-size: 0;
199
- font-size: var(--xh-popconfirm-description-font-size, var(--xh-text-secondary-size));
206
+ font-size: var(--xh-popconfirm-description-font-size, var(--xh-text-body-size));
200
207
  line-height: var(--xh-leading-normal);
201
208
  overflow-wrap: anywhere;
202
209
  color: var(--xh-popconfirm-description-fg, var(--xh-fg-muted));
@@ -231,6 +238,8 @@
231
238
 
232
239
  /* 动作钮的文字与 Button 同一字重(家族配方不管字重) */
233
240
  font-weight: var(--xh-popconfirm-action-font-weight, var(--xh-text-label-weight));
241
+ /* 末行与上面的文字隔开:栅格行距只有标题与说明之间那 4px,钮再往下让 12px,文字与钮之间共 16px */
242
+ margin-block-start: var(--xh-popconfirm-action-mt, var(--xh-space-3));
234
243
  }
235
244
 
236
245
  /* 并排落在最后一行的右侧两格;取消在左、确认在右 */
@@ -108,15 +108,17 @@
108
108
  /* 作者塞进面板里的图标按控件档取;关闭钮另由家族配方按 sm 档下发字形尺 */
109
109
  --xh-icon-size: var(--xh-popover-icon-size, var(--xh-glyph-size-md));
110
110
 
111
- /* 尺寸档只换这两个私有槽。popover 没有 root 部件,size 落在浮层树最外层的 content 上。
112
- 语气不接:面板是内容容器,语气该由里面的内容表达 */
113
- --xh-_popover-pad: var(--xh-surface-pad-md);
111
+ /* 尺寸档只换这三个私有槽。popover 没有 root 部件,size 落在浮层树最外层的 content 上。
112
+ 横向内衬比纵向高一档(缺省纵 12 横 16)。语气不接:面板是内容容器,语气该由里面的内容表达 */
113
+ --xh-_popover-py: var(--xh-surface-pad-md);
114
+ --xh-_popover-px: var(--xh-surface-pad-lg);
114
115
  --xh-_popover-max-w: var(--xh-overlay-max-w);
115
116
 
116
117
  position: relative;
117
118
  display: flex;
118
119
  flex-direction: column;
119
- gap: var(--xh-popover-gap, var(--xh-space-2));
120
+ /* 标题与正文贴着排:两行之间只留 4px */
121
+ gap: var(--xh-popover-gap, var(--xh-space-1));
120
122
  inline-size: max-content;
121
123
  /* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的内容就点不到了 */
122
124
  max-inline-size: min(var(--xh-popover-max-w, var(--xh-_popover-max-w)), var(--xh-_popover-available-w));
@@ -125,8 +127,8 @@
125
127
  overflow-y: auto;
126
128
  /* 浮在页面之上的 Overlay 滚动面:滚到头不把页面一起带走 */
127
129
  overscroll-behavior: contain;
128
- padding-block: var(--xh-popover-py, var(--xh-_popover-pad));
129
- padding-inline: var(--xh-popover-px, var(--xh-_popover-pad));
130
+ padding-block: var(--xh-popover-py, var(--xh-_popover-py));
131
+ padding-inline: var(--xh-popover-px, var(--xh-_popover-px));
130
132
  border-radius: var(--xh-popover-radius, var(--xh-shape-overlay));
131
133
  pointer-events: auto;
132
134
  /* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
@@ -155,28 +157,32 @@
155
157
  }
156
158
 
157
159
  /* —— 尺寸 —— */
158
- /* 缺省档写在 content 的基础规则里;四边等宽的面板内衬三档取 surface-pad 那把尺 */
160
+ /* 缺省档写在 content 的基础规则里;内衬三档取 surface-pad 那把尺,横向始终比纵向高一档 */
159
161
  .xh-scope-popover[data-part='content'][data-size='sm'] {
160
- --xh-_popover-pad: var(--xh-surface-pad-sm);
162
+ --xh-_popover-py: var(--xh-surface-pad-sm);
163
+ --xh-_popover-px: var(--xh-surface-pad-md);
161
164
  --xh-_popover-max-w: var(--xh-overlay-max-w-sm);
162
165
  }
163
166
 
164
167
  .xh-scope-popover[data-part='content'][data-size='lg'] {
165
- --xh-_popover-pad: var(--xh-surface-pad-lg);
168
+ --xh-_popover-py: var(--xh-surface-pad-lg);
169
+ --xh-_popover-px: var(--xh-surface-pad-xl);
166
170
  --xh-_popover-max-w: var(--xh-overlay-max-w-lg);
167
171
  }
168
172
 
173
+ /* 气泡标题:14px / medium / 正文色 */
169
174
  .xh-scope-popover[data-part='title'] {
170
175
  margin: 0;
171
176
  font-size: var(--xh-popover-title-font-size, var(--xh-text-label-size));
172
- font-weight: var(--xh-popover-title-font-weight, var(--xh-font-weight-semibold));
177
+ font-weight: var(--xh-popover-title-font-weight, var(--xh-font-weight-medium));
173
178
  color: var(--xh-popover-title-fg, var(--xh-material-frosted-fg));
174
179
  }
175
180
 
176
- /* 说明文字走说明档:13px + fg-muted */
181
+ /* 说明就是气泡的正文:14px 正文字号 + fg-muted 次级色 */
177
182
  .xh-scope-popover[data-part='description'] {
178
183
  margin: 0;
179
- font-size: var(--xh-popover-description-font-size, var(--xh-text-secondary-size));
184
+ font-size: var(--xh-popover-description-font-size, var(--xh-text-body-size));
185
+ line-height: var(--xh-leading-normal);
180
186
  color: var(--xh-popover-description-fg, var(--xh-fg-muted));
181
187
  }
182
188
 
@@ -38,10 +38,10 @@
38
38
  --xh-progress-skin: 1;
39
39
  }
40
40
 
41
- /* 私有槽位:组件令牌 → 中档字面量两级回退。厚度写在 root 上而不是 track 上,
42
- 尺寸档才改得动一处就够,track 靠继承拿到值。 */
41
+ /* 私有槽位:组件令牌 → 中档两级回退。厚度写在 root 上而不是 track 上,
42
+ 尺寸档才改得动一处就够,track 靠继承拿到值。线形是一条细轨,按轨道厚度三档取 sm / md / lg = 3 / 4 / 8px */
43
43
  .xh-scope-progress[data-part='root'] {
44
- --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-track-thickness));
44
+ --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-track-thickness-md));
45
45
 
46
46
  /* 目标刻度与环形的刻度值按根落位 */
47
47
  position: relative;
@@ -58,7 +58,8 @@
58
58
  inline-size: 100%;
59
59
  block-size: var(--xh-_progress-thickness);
60
60
  border-radius: var(--xh-progress-track-radius, var(--xh-shape-pill));
61
- background: var(--xh-progress-track, var(--xh-bg-subtle-active));
61
+ /* 底槽取淡底阶梯的 200 档(--xh-bg-subtle-hover),环形的底槽同一支 */
62
+ background: var(--xh-progress-track, var(--xh-bg-subtle-hover));
62
63
  }
63
64
 
64
65
  /* 语气槽由 root 上的 data-tone 声明、经继承发下来;没写 data-tone 时退回原来的品牌色。
@@ -136,11 +137,11 @@
136
137
  /* —— 尺寸 —— */
137
138
  /* 线形只有厚度分档;中间档不写规则,缺省即中档 */
138
139
  .xh-scope-progress[data-part='root'][data-size='sm'] {
139
- --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-1));
140
+ --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-track-thickness-sm));
140
141
  }
141
142
 
142
143
  .xh-scope-progress[data-part='root'][data-size='lg'] {
143
- --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-2));
144
+ --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-track-thickness-lg));
144
145
  }
145
146
 
146
147
  /* —— 环形 —— */
@@ -176,10 +177,10 @@
176
177
  block-size: 100%;
177
178
  }
178
179
 
179
- /* 环心文字:占位不撑格子,长内容自己换行由作者定 */
180
+ /* 环心文字:12px 次级色,占位不撑格子,长内容自己换行由作者定 */
180
181
  .xh-scope-progress[data-part='label'] {
181
- color: var(--xh-progress-label-fg, var(--xh-fg-default));
182
- font-size: var(--xh-progress-label-font-size, var(--xh-text-body-size));
182
+ color: var(--xh-progress-label-fg, var(--xh-fg-muted));
183
+ font-size: var(--xh-progress-label-font-size, var(--xh-text-caption-size));
183
184
  line-height: var(--xh-leading-none);
184
185
  text-align: center;
185
186
  }
@@ -188,7 +189,7 @@
188
189
  底槽不跟着语气换族:只有已完成的那段换色,才读得出"完成了多少" */
189
190
  .xh-scope-progress[data-part='track'][data-variant='circle'],
190
191
  .xh-scope-progress[data-part='track'][data-variant='dashboard'] {
191
- stroke: var(--xh-progress-track, var(--xh-bg-subtle-active));
192
+ stroke: var(--xh-progress-track, var(--xh-bg-subtle-hover));
192
193
  }
193
194
 
194
195
  .xh-scope-progress[data-part='range'][data-variant='circle'],
@@ -204,16 +205,16 @@
204
205
  /* 子弹图:有分段时轨道加厚一档,填充收窄成中间一条压在色带上,色带在填充两侧照样读得出。
205
206
  三档厚度各比普通线形高一档,阶梯次序不变 */
206
207
  .xh-scope-progress[data-part='root'][data-variant='line'][data-banded] {
207
- --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-3));
208
+ --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-track-band-thickness-md));
208
209
  --xh-_progress-range-size: 50%;
209
210
  }
210
211
 
211
212
  .xh-scope-progress[data-part='root'][data-variant='line'][data-banded][data-size='sm'] {
212
- --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-2));
213
+ --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-track-band-thickness-sm));
213
214
  }
214
215
 
215
216
  .xh-scope-progress[data-part='root'][data-variant='line'][data-banded][data-size='lg'] {
216
- --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-4));
217
+ --xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-track-band-thickness-lg));
217
218
  }
218
219
 
219
220
  /* 色带取本段语气的淡色:同一族颜色里填充是实色、色带浅一档,读得出填充落在哪一段 */
@@ -15,12 +15,12 @@
15
15
  --xh-prompt-input-skin: 1;
16
16
  }
17
17
 
18
- /* root 就是视觉盒:描边、底色、圆角、聚焦环、悬停与禁用面由 Field Chrome 家族画在它身上(静息描边式:
19
- canvas 底 + --xh-border-control 描边 + 无影,不用 soft,登记的例外只在 8px surface 圆角),内部 textarea
18
+ /* root 就是视觉盒:描边、底色、圆角、聚焦面、悬停与禁用面由 Field Chrome 家族画在它身上(静息描边式:
19
+ 字段淡底 + --xh-border-control 描边 + 无影,聚焦换承载面底 + 品牌描边、不画环;登记的例外只在 surface 圆角),内部 textarea
20
20
  无边框;align-items: flex-end 让按钮随输入框长高贴着底边。
21
21
  三个视觉轴都落在 root 上:形态三档由家族按 data-variant 生成,语气管用哪族颜色,尺寸管高度与字号 */
22
22
  .xh-scope-prompt-input[data-part='root'] {
23
- /* 圆角可由使用者槽切换,家族只过渡底、描边、影与环 */
23
+ /* 圆角可由使用者槽切换,家族只过渡底、描边与影 */
24
24
  transition: border-radius var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
25
25
  /* 尺寸缺省档:不写 data-size 时按中档走 */
26
26
  --xh-_prompt-input-h: var(--xh-control-h-md);