@xihan-ui/styles 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/CHANGELOG.md +470 -0
  2. package/component-tokens.d.ts +230 -60
  3. package/components.tokens.json +5156 -1557
  4. package/css/accordion.css +47 -20
  5. package/css/alert.css +16 -17
  6. package/css/anchor.css +2 -2
  7. package/css/approval.css +41 -17
  8. package/css/avatar-group.css +9 -12
  9. package/css/avatar.css +20 -18
  10. package/css/back-top.css +21 -7
  11. package/css/badge.css +5 -5
  12. package/css/breadcrumb.css +18 -16
  13. package/css/button-group.css +4 -6
  14. package/css/button.css +13 -12
  15. package/css/calendar-picker.css +178 -95
  16. package/css/calendar-range-picker.css +207 -122
  17. package/css/card.css +34 -6
  18. package/css/carousel.css +94 -46
  19. package/css/cartesian-chart.css +11 -11
  20. package/css/cascader.css +51 -39
  21. package/css/checkbox-group.css +9 -6
  22. package/css/checkbox.css +5 -4
  23. package/css/citation.css +9 -4
  24. package/css/clipboard.css +20 -4
  25. package/css/code-view.css +6 -6
  26. package/css/collapsible.css +29 -14
  27. package/css/color-field.css +4 -4
  28. package/css/color-picker.css +77 -23
  29. package/css/color-slider.css +10 -8
  30. package/css/color-swatch-picker.css +14 -9
  31. package/css/combobox.css +26 -14
  32. package/css/command.css +14 -9
  33. package/css/context-menu.css +10 -5
  34. package/css/date-field.css +12 -6
  35. package/css/date-picker.css +178 -109
  36. package/css/date-range-picker.css +199 -130
  37. package/css/description.css +10 -6
  38. package/css/descriptions.css +47 -19
  39. package/css/dialog.css +50 -35
  40. package/css/diff-view.css +8 -8
  41. package/css/drawer.css +75 -21
  42. package/css/editable.css +15 -41
  43. package/css/empty-state.css +21 -3
  44. package/css/field-array.css +5 -2
  45. package/css/field.css +17 -18
  46. package/css/fieldset.css +33 -13
  47. package/css/file-upload.css +66 -33
  48. package/css/float-button.css +60 -35
  49. package/css/floating-panel.css +1 -1
  50. package/css/form.css +30 -16
  51. package/css/graph-chart.css +2 -2
  52. package/css/grid-list.css +1 -1
  53. package/css/highlight.css +5 -5
  54. package/css/hover-card.css +19 -12
  55. package/css/image-viewer.css +77 -27
  56. package/css/image.css +13 -5
  57. package/css/infinite-scroll.css +8 -4
  58. package/css/input-group.css +74 -26
  59. package/css/kbd.css +1 -1
  60. package/css/label.css +27 -11
  61. package/css/layout.css +17 -10
  62. package/css/list.css +13 -9
  63. package/css/listbox.css +12 -7
  64. package/css/loading-bar.css +3 -0
  65. package/css/mention.css +11 -9
  66. package/css/menu.css +10 -5
  67. package/css/menubar.css +13 -8
  68. package/css/message-feed.css +1 -1
  69. package/css/navigation-menu.css +2 -2
  70. package/css/notification.css +132 -49
  71. package/css/number-animation.css +2 -2
  72. package/css/number-field.css +75 -52
  73. package/css/page-header.css +64 -27
  74. package/css/pagination.css +35 -38
  75. package/css/password-input.css +12 -68
  76. package/css/pin-input.css +18 -26
  77. package/css/popconfirm.css +23 -14
  78. package/css/popover.css +18 -12
  79. package/css/progress.css +14 -13
  80. package/css/prompt-input.css +3 -3
  81. package/css/question-flow.css +41 -15
  82. package/css/radar-chart.css +6 -6
  83. package/css/radio-group.css +120 -55
  84. package/css/rating.css +32 -15
  85. package/css/select.css +16 -12
  86. package/css/separator.css +24 -6
  87. package/css/side-nav.css +29 -24
  88. package/css/signature-pad.css +23 -9
  89. package/css/skeleton.css +12 -12
  90. package/css/slider.css +77 -48
  91. package/css/sortable.css +2 -2
  92. package/css/sparkline.css +8 -2
  93. package/css/spinner.css +40 -20
  94. package/css/statistic.css +14 -14
  95. package/css/steps.css +115 -84
  96. package/css/switch.css +9 -7
  97. package/css/table.css +29 -12
  98. package/css/tabs.css +35 -12
  99. package/css/tag-group.css +17 -6
  100. package/css/tag.css +54 -29
  101. package/css/tags-input.css +39 -20
  102. package/css/text-field.css +5 -5
  103. package/css/time-field.css +4 -4
  104. package/css/time-picker.css +150 -64
  105. package/css/time-range-picker.css +91 -62
  106. package/css/timeline.css +37 -20
  107. package/css/timer.css +3 -3
  108. package/css/toggle-group.css +4 -4
  109. package/css/tool-call.css +13 -11
  110. package/css/toolbar.css +6 -5
  111. package/css/tooltip.css +16 -17
  112. package/css/tour.css +14 -7
  113. package/css/transfer.css +22 -16
  114. package/css/tree-select.css +12 -12
  115. package/css/tree.css +26 -25
  116. package/css/typography.css +28 -25
  117. package/dist/css/accordion.css +296 -0
  118. package/dist/css/affix.css +47 -0
  119. package/dist/css/alert.css +246 -0
  120. package/dist/css/anchor.css +252 -0
  121. package/dist/css/approval.css +525 -0
  122. package/dist/css/avatar-group.css +96 -0
  123. package/dist/css/avatar.css +100 -0
  124. package/dist/css/back-top.css +175 -0
  125. package/dist/css/badge.css +205 -0
  126. package/dist/css/bar-code.css +62 -0
  127. package/dist/css/breadcrumb.css +232 -0
  128. package/dist/css/button-group.css +261 -0
  129. package/dist/css/button.css +216 -0
  130. package/dist/css/calendar-picker.css +550 -0
  131. package/dist/css/calendar-range-picker.css +639 -0
  132. package/dist/css/card.css +249 -0
  133. package/dist/css/carousel.css +726 -0
  134. package/dist/css/cartesian-chart.css +830 -0
  135. package/dist/css/cascader.css +973 -0
  136. package/dist/css/checkbox-group.css +361 -0
  137. package/dist/css/checkbox.css +258 -0
  138. package/dist/css/citation.css +475 -0
  139. package/dist/css/clipboard.css +331 -0
  140. package/dist/css/code-view.css +374 -0
  141. package/dist/css/collapsible.css +200 -0
  142. package/dist/css/color-field.css +176 -0
  143. package/dist/css/color-picker.css +649 -0
  144. package/dist/css/color-slider.css +283 -0
  145. package/dist/css/color-swatch-picker.css +250 -0
  146. package/dist/css/color-swatch.css +35 -0
  147. package/dist/css/combobox.css +578 -0
  148. package/dist/css/command.css +404 -0
  149. package/dist/css/context-menu.css +425 -0
  150. package/dist/css/date-field.css +317 -0
  151. package/dist/css/date-picker.css +931 -0
  152. package/dist/css/date-range-picker.css +949 -0
  153. package/dist/css/description.css +71 -0
  154. package/dist/css/descriptions.css +327 -0
  155. package/dist/css/dialog.css +470 -0
  156. package/dist/css/diff-view.css +513 -0
  157. package/dist/css/download-trigger.css +151 -0
  158. package/dist/css/drawer.css +606 -0
  159. package/dist/css/editable.css +269 -0
  160. package/dist/css/empty-state.css +181 -0
  161. package/dist/css/field-array.css +229 -0
  162. package/dist/css/field.css +165 -0
  163. package/dist/css/fieldset.css +122 -0
  164. package/dist/css/file-upload.css +462 -0
  165. package/dist/css/flex.css +441 -0
  166. package/dist/css/float-button.css +579 -0
  167. package/dist/css/floating-panel.css +429 -0
  168. package/dist/css/focus.css +46 -0
  169. package/dist/css/forced-colors.css +93 -0
  170. package/dist/css/form.css +407 -0
  171. package/dist/css/funnel-chart.css +106 -0
  172. package/dist/css/graph-chart.css +205 -0
  173. package/dist/css/grid-list.css +235 -0
  174. package/dist/css/grid.css +1201 -0
  175. package/dist/css/heatmap.css +552 -0
  176. package/dist/css/hierarchy-chart.css +298 -0
  177. package/dist/css/highlight.css +41 -0
  178. package/dist/css/hover-card.css +233 -0
  179. package/dist/css/icon.css +225 -0
  180. package/dist/css/image-cropper.css +373 -0
  181. package/dist/css/image-viewer.css +588 -0
  182. package/dist/css/image.css +106 -0
  183. package/dist/css/infinite-scroll.css +81 -0
  184. package/dist/css/input-group.css +323 -0
  185. package/dist/css/json-viewer.css +379 -0
  186. package/dist/css/kbd.css +72 -0
  187. package/dist/css/label.css +94 -0
  188. package/dist/css/layers.css +7 -0
  189. package/dist/css/layout.css +379 -0
  190. package/dist/css/liquid.css +106 -0
  191. package/dist/css/list.css +156 -0
  192. package/dist/css/listbox.css +395 -0
  193. package/dist/css/loading-bar.css +144 -0
  194. package/dist/css/log.css +306 -0
  195. package/dist/css/markdown-stream.css +149 -0
  196. package/dist/css/marquee.css +378 -0
  197. package/dist/css/masonry.css +70 -0
  198. package/dist/css/matrix-code.css +67 -0
  199. package/dist/css/mention.css +395 -0
  200. package/dist/css/menu.css +369 -0
  201. package/dist/css/menubar.css +461 -0
  202. package/dist/css/message-feed.css +318 -0
  203. package/dist/css/navigation-menu.css +513 -0
  204. package/dist/css/notification.css +865 -0
  205. package/dist/css/number-animation.css +44 -0
  206. package/dist/css/number-field.css +275 -0
  207. package/dist/css/overlay-arrow.css +56 -0
  208. package/dist/css/page-header.css +221 -0
  209. package/dist/css/pagination.css +447 -0
  210. package/dist/css/password-input.css +335 -0
  211. package/dist/css/pie-chart.css +247 -0
  212. package/dist/css/pin-input.css +191 -0
  213. package/dist/css/pointer.css +36 -0
  214. package/dist/css/popconfirm.css +329 -0
  215. package/dist/css/popover.css +285 -0
  216. package/dist/css/progress.css +502 -0
  217. package/dist/css/prompt-input.css +260 -0
  218. package/dist/css/question-flow.css +579 -0
  219. package/dist/css/radar-chart.css +233 -0
  220. package/dist/css/radio-group.css +663 -0
  221. package/dist/css/rating.css +311 -0
  222. package/dist/css/reasoning.css +343 -0
  223. package/dist/css/reset.css +117 -0
  224. package/dist/css/resizable.css +242 -0
  225. package/dist/css/sankey-chart.css +174 -0
  226. package/dist/css/scroll-area.css +240 -0
  227. package/dist/css/scrollbar.css +204 -0
  228. package/dist/css/select.css +616 -0
  229. package/dist/css/separator.css +140 -0
  230. package/dist/css/side-nav.css +481 -0
  231. package/dist/css/signature-pad.css +193 -0
  232. package/dist/css/skeleton.css +161 -0
  233. package/dist/css/slider.css +403 -0
  234. package/dist/css/sortable.css +228 -0
  235. package/dist/css/sparkline.css +170 -0
  236. package/dist/css/spinner.css +256 -0
  237. package/dist/css/splitter.css +159 -0
  238. package/dist/css/statistic.css +137 -0
  239. package/dist/css/steps.css +658 -0
  240. package/dist/css/switch.css +353 -0
  241. package/dist/css/table.css +1162 -0
  242. package/dist/css/tabs.css +967 -0
  243. package/dist/css/tag-group.css +258 -0
  244. package/dist/css/tag.css +335 -0
  245. package/dist/css/tags-input.css +341 -0
  246. package/dist/css/text-field.css +197 -0
  247. package/dist/css/time-field.css +277 -0
  248. package/dist/css/time-picker.css +793 -0
  249. package/dist/css/time-range-picker.css +775 -0
  250. package/dist/css/timeline.css +440 -0
  251. package/dist/css/timer.css +123 -0
  252. package/dist/css/timestamp.css +34 -0
  253. package/dist/css/toggle-group.css +424 -0
  254. package/dist/css/toggle.css +146 -0
  255. package/dist/css/tone.css +189 -0
  256. package/dist/css/tool-call.css +431 -0
  257. package/dist/css/toolbar.css +366 -0
  258. package/dist/css/tooltip.css +217 -0
  259. package/dist/css/tour.css +446 -0
  260. package/dist/css/transfer.css +644 -0
  261. package/dist/css/tree-select.css +878 -0
  262. package/dist/css/tree.css +734 -0
  263. package/dist/css/truncate.css +108 -0
  264. package/dist/css/typography.css +475 -0
  265. package/dist/css/undefined.css +58 -0
  266. package/dist/css/virtualizer.css +166 -0
  267. package/dist/css/visually-hidden.css +20 -0
  268. package/dist/css/watermark.css +82 -0
  269. package/dist/family/action-control.css +493 -0
  270. package/dist/family/chart.css +537 -0
  271. package/dist/family/check-mark.css +94 -0
  272. package/dist/family/choice-card.css +97 -0
  273. package/dist/family/collection-item.css +768 -0
  274. package/dist/family/field-chrome.css +296 -0
  275. package/dist/family/loading-ring.css +102 -0
  276. package/dist/family/material.css +72 -0
  277. package/dist/family/menu-choice.css +56 -0
  278. package/dist/family/motion.css +363 -0
  279. package/dist/family/swatch.css +59 -0
  280. package/dist/family/tag-list.css +65 -0
  281. package/family/action-control.css +33 -36
  282. package/family/chart.css +57 -0
  283. package/family/collection-item.css +12 -8
  284. package/family/field-chrome.css +28 -19
  285. package/family/loading-ring.css +20 -13
  286. package/family/swatch.css +4 -4
  287. package/family/tag-list.css +6 -0
  288. package/index.css +10349 -8756
  289. package/index.unlayered.css +10350 -8758
  290. package/package.json +165 -164
@@ -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 写进私有槽 */
@@ -145,7 +149,7 @@
145
149
  }
146
150
 
147
151
  /* 箭头绝对定位挂在 content 上,不占格:吃到栅格位的话它的贴边就从格线起算,被内衬推进面里 */
148
- [data-scope='popconfirm'][data-part='content'] > [data-part='arrow'] {
152
+ [data-scope='popconfirm'][data-part='content'] > [data-part='arrow']:where([data-scope='popconfirm']) {
149
153
  grid-column: auto;
150
154
  }
151
155
 
@@ -171,32 +175,35 @@
171
175
  }
172
176
 
173
177
  /* —— 尺寸 —— */
174
- /* 缺省档写在 content 的基础规则里;四边等宽的面板内衬三档取 surface-pad 那把尺 */
178
+ /* 缺省档写在 content 的基础规则里;内衬三档取 surface-pad 那把尺,横向始终比纵向高一档 */
175
179
  [data-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
  [data-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
  [data-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
  [data-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,14 +238,16 @@
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
  /* 并排落在最后一行的右侧两格;取消在左、确认在右 */
237
- [data-scope='popconfirm'][data-part='content'] > [data-part='cancel-trigger'] {
246
+ [data-scope='popconfirm'][data-part='content'] > [data-part='cancel-trigger']:where([data-scope='popconfirm']) {
238
247
  grid-column: 2;
239
248
  }
240
249
 
241
- [data-scope='popconfirm'][data-part='content'] > [data-part='confirm-trigger'] {
250
+ [data-scope='popconfirm'][data-part='content'] > [data-part='confirm-trigger']:where([data-scope='popconfirm']) {
242
251
  grid-column: 3;
243
252
  }
244
253
 
package/css/popover.css CHANGED
@@ -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
  [data-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
  [data-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
  [data-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
  [data-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
 
package/css/progress.css CHANGED
@@ -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
  [data-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
  [data-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
  [data-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
  [data-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
  [data-scope='progress'][data-part='track'][data-variant='circle'],
190
191
  [data-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
  [data-scope='progress'][data-part='range'][data-variant='circle'],
@@ -204,16 +205,16 @@
204
205
  /* 子弹图:有分段时轨道加厚一档,填充收窄成中间一条压在色带上,色带在填充两侧照样读得出。
205
206
  三档厚度各比普通线形高一档,阶梯次序不变 */
206
207
  [data-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
  [data-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
  [data-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
  [data-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);
@@ -41,7 +41,7 @@
41
41
  }
42
42
 
43
43
  /* 卡片出现时滑入;落在首帧就在的列表条目里(历史消息)时直接呈现,不跟着整屏一起入场 */
44
- [data-scope='question-flow'][data-part='root']:not([data-scope][data-part='item'][data-instant] *) {
44
+ [data-scope='question-flow'][data-part='root']:not([data-scope][data-part='item'][data-instant] :where([data-scope='question-flow'])) {
45
45
  animation: xh-item-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
46
46
  }
47
47
 
@@ -201,27 +201,27 @@
201
201
  位次就是到达顺序。落在首帧就在的列表条目里(历史消息)时直接呈现。
202
202
  backwards 不能省:等待期间起帧不生效的话,后面几条会先露一下再跳回去。
203
203
  第 6 条起并到同一拍上 */
204
- [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:not([data-scope][data-part='item'][data-instant] *) {
204
+ [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:where([data-scope='question-flow']):not([data-scope][data-part='item'][data-instant] :where([data-scope='question-flow'])) {
205
205
  animation: xh-rise-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
206
206
  }
207
207
 
208
- [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:nth-child(2):not([data-scope][data-part='item'][data-instant] *) {
208
+ [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:where([data-scope='question-flow']):nth-child(2):not([data-scope][data-part='item'][data-instant] :where([data-scope='question-flow'])) {
209
209
  animation-delay: calc(var(--xh-motion-stagger-step) * 1);
210
210
  }
211
211
 
212
- [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:nth-child(3):not([data-scope][data-part='item'][data-instant] *) {
212
+ [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:where([data-scope='question-flow']):nth-child(3):not([data-scope][data-part='item'][data-instant] :where([data-scope='question-flow'])) {
213
213
  animation-delay: calc(var(--xh-motion-stagger-step) * 2);
214
214
  }
215
215
 
216
- [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:nth-child(4):not([data-scope][data-part='item'][data-instant] *) {
216
+ [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:where([data-scope='question-flow']):nth-child(4):not([data-scope][data-part='item'][data-instant] :where([data-scope='question-flow'])) {
217
217
  animation-delay: calc(var(--xh-motion-stagger-step) * 3);
218
218
  }
219
219
 
220
- [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:nth-child(5):not([data-scope][data-part='item'][data-instant] *) {
220
+ [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:where([data-scope='question-flow']):nth-child(5):not([data-scope][data-part='item'][data-instant] :where([data-scope='question-flow'])) {
221
221
  animation-delay: calc(var(--xh-motion-stagger-step) * 4);
222
222
  }
223
223
 
224
- [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:nth-child(n + 6):not([data-scope][data-part='item'][data-instant] *) {
224
+ [data-scope='question-flow'][data-part='question'][data-current] [data-part='item']:where([data-scope='question-flow']):nth-child(n + 6):not([data-scope][data-part='item'][data-instant] :where([data-scope='question-flow'])) {
225
225
  animation-delay: calc(var(--xh-motion-stagger-step) * 5);
226
226
  }
227
227
 
@@ -243,7 +243,7 @@
243
243
  flex: none;
244
244
  align-items: center;
245
245
  justify-content: center;
246
- border: var(--xh-stroke-thin) solid var(--xh-question-flow-indicator-border, var(--xh-border-control));
246
+ border: var(--xh-stroke-thin) solid var(--xh-question-flow-indicator-border, var(--xh-border-strong));
247
247
  border-radius: var(--xh-question-flow-indicator-radius, var(--xh-shape-inset));
248
248
  background: var(--xh-question-flow-indicator-bg, transparent);
249
249
  color: var(--xh-question-flow-indicator-fg, var(--xh-_tone-on, var(--xh-fg-on-brand)));
@@ -335,7 +335,7 @@
335
335
  display: none;
336
336
  }
337
337
 
338
- /* 自由文本:与选项同等算数的一条答案,占满整行 */
338
+ /* 自由文本:与选项同等算数的一条答案,占满整行。框照字段外壳:字段淡底 + 控件描边,悬停描边升一档 */
339
339
  [data-scope='question-flow'][data-part='note'] {
340
340
  display: block;
341
341
  inline-size: 100%;
@@ -343,11 +343,13 @@
343
343
  padding-block: var(--xh-question-flow-note-py, var(--xh-space-1_5));
344
344
  border: var(--xh-stroke-thin) solid var(--xh-question-flow-note-border, var(--xh-border-control));
345
345
  border-radius: var(--xh-question-flow-note-radius, var(--xh-shape-control));
346
- background: var(--xh-question-flow-note-bg, var(--xh-bg-surface));
346
+ background: var(--xh-question-flow-note-bg, var(--xh-bg-field));
347
347
  color: var(--xh-question-flow-note-fg, var(--xh-fg-default));
348
348
  font-family: inherit;
349
349
  font-size: var(--xh-question-flow-note-font-size, var(--xh-_question-flow-font-size));
350
- transition: border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
350
+ transition:
351
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
352
+ border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
351
353
  }
352
354
 
353
355
  [data-scope='question-flow'][data-part='note'][hidden] {
@@ -358,7 +360,23 @@
358
360
  color: var(--xh-question-flow-placeholder-fg, var(--xh-fg-subtle));
359
361
  }
360
362
 
363
+ [data-scope='question-flow'][data-part='note']:hover:not(:disabled, :focus, [data-invalid]) {
364
+ border-color: var(--xh-question-flow-note-border-hover, var(--xh-border-strong));
365
+ }
366
+
367
+ /* 聚焦换承载面底 + 品牌描边,不画环:焦点由描边换色与底色差标出,强制色档补一圈 Highlight 环 */
368
+ [data-scope='question-flow'][data-part='note']:focus-within {
369
+ border-color: var(--xh-question-flow-note-border-focus, var(--xh-border-control-focus));
370
+ background: var(--xh-question-flow-note-bg-focus, var(--xh-bg-surface));
371
+ }
372
+
373
+ [data-scope='question-flow'][data-part='note']:focus-visible {
374
+ outline: none;
375
+ }
376
+
361
377
  [data-scope='question-flow'][data-part='note']:disabled {
378
+ border-color: var(--xh-question-flow-note-border-disabled, var(--xh-border-default));
379
+ background: var(--xh-question-flow-note-bg-disabled, var(--xh-bg-subtle));
362
380
  color: var(--xh-fg-disabled);
363
381
  }
364
382
 
@@ -486,16 +504,18 @@
486
504
  --xh-action-ring-color-focus-visible: currentColor;
487
505
  }
488
506
 
489
- /* 交卷之后才露出的那一格 */
507
+ /* 交卷之后才露出的那一格:与 Tag 的 sm 档同一副方签——control 圆角、块尺寸取 chip 档、竖向内衬为 0 */
490
508
  [data-scope='question-flow'][data-part='result'] {
491
509
  display: inline-flex;
492
510
  align-self: flex-start;
493
511
  align-items: center;
512
+ box-sizing: border-box;
494
513
  gap: var(--xh-question-flow-result-gap, var(--xh-space-1));
514
+ min-block-size: var(--xh-question-flow-result-h, var(--xh-chip-h-sm));
495
515
  padding-inline: var(--xh-question-flow-result-px, var(--xh-space-1_5));
496
- padding-block: var(--xh-question-flow-result-py, var(--xh-space-0_5));
516
+ padding-block: var(--xh-question-flow-result-py, 0);
497
517
  border: var(--xh-stroke-thin) solid transparent;
498
- border-radius: var(--xh-question-flow-result-radius, var(--xh-shape-pill));
518
+ border-radius: var(--xh-question-flow-result-radius, var(--xh-shape-control));
499
519
  background: var(--xh-question-flow-result-bg, var(--xh-_tone-subtle));
500
520
  color: var(--xh-question-flow-result-fg, var(--xh-_tone-fg));
501
521
  font-size: var(--xh-question-flow-result-font-size, var(--xh-text-caption-size));
@@ -504,7 +524,7 @@
504
524
  }
505
525
 
506
526
  /* 落定结果弹出;落在首帧就在的列表条目里(历史消息)时直接呈现,不跟着整屏一起入场 */
507
- [data-scope='question-flow'][data-part='result']:not([data-scope][data-part='item'][data-instant] *) {
527
+ [data-scope='question-flow'][data-part='result']:not([data-scope][data-part='item'][data-instant] :where([data-scope='question-flow'])) {
508
528
  animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
509
529
  }
510
530
 
@@ -536,6 +556,12 @@
536
556
  background-color: CanvasText;
537
557
  }
538
558
 
559
+ /* 备注框聚焦不画环、描边又被换成系统色,补一圈 Highlight 环 */
560
+ [data-scope='question-flow'][data-part='note']:focus {
561
+ outline: var(--xh-ring-width) solid Highlight;
562
+ outline-offset: var(--xh-ring-offset);
563
+ }
564
+
539
565
  [data-scope='question-flow']:is([data-part='prev-trigger'], [data-part='next-trigger']):empty::before {
540
566
  forced-color-adjust: none;
541
567
  background-color: ButtonText;
@@ -167,12 +167,12 @@
167
167
 
168
168
  /* —— 纹理:颜色不可用或不可靠时(强制色、打印、祖先写了 data-xh-chart-patterns),面积改用本系列在 defs 里的
169
169
  纹理填充、描出轮廓,轮廓换线型。色标的纹理在配方里 —— */
170
- :where([data-xh-chart-patterns]) [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='area-fill'] {
170
+ :where([data-xh-chart-patterns]) [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='area-fill']:where([data-scope='radar-chart']) {
171
171
  fill: var(--xh-_chart-pattern);
172
172
  fill-opacity: 1;
173
173
  }
174
174
 
175
- :where([data-xh-chart-patterns]) [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='line'] {
175
+ :where([data-xh-chart-patterns]) [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='line']:where([data-scope='radar-chart']) {
176
176
  stroke-dasharray: var(--xh-_chart-dash);
177
177
  }
178
178
 
@@ -204,13 +204,13 @@
204
204
  stroke: Canvas;
205
205
  }
206
206
 
207
- [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='area-fill'] {
207
+ [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='area-fill']:where([data-scope='radar-chart']) {
208
208
  forced-color-adjust: none;
209
209
  fill: var(--xh-_chart-pattern);
210
210
  fill-opacity: 1;
211
211
  }
212
212
 
213
- [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='line'] {
213
+ [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='line']:where([data-scope='radar-chart']) {
214
214
  stroke-dasharray: var(--xh-_chart-dash);
215
215
  }
216
216
  }
@@ -221,12 +221,12 @@
221
221
  display: none;
222
222
  }
223
223
 
224
- [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='area-fill'] {
224
+ [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='area-fill']:where([data-scope='radar-chart']) {
225
225
  fill: var(--xh-_chart-pattern);
226
226
  fill-opacity: 1;
227
227
  }
228
228
 
229
- [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='line'] {
229
+ [data-scope='radar-chart'][data-xh-chart-pattern] > [data-part='line']:where([data-scope='radar-chart']) {
230
230
  stroke-dasharray: var(--xh-_chart-dash);
231
231
  }
232
232
  }