@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
@@ -24,11 +24,11 @@
24
24
  所以别往覆盖钩子里加这几个属性。 */
25
25
  [data-scope='float-button'][data-part='root'] {
26
26
  --xh-_float-button-offset: var(--xh-space-6);
27
- /* 展开列表里原生动作项的身量与字形尺:触发器自己走 Action Control floating 档
28
- (sm = box-md / md = box-lg / lg = box-lg + space-2,字形 md / lg / xl),
29
- 原生动作项不是 Headless 部件、配方打不到它,这两支私有槽按同一张表镜像,换档只改这里 */
30
- --xh-_float-button-size: var(--xh-control-box-lg);
31
- --xh-_float-button-glyph-size: var(--xh-glyph-size-lg);
27
+ /* 触发器与展开列表里原生动作项的身量与字形尺,同一张表:md 取独立浮钮的直径(40px),
28
+ sm / lg 取方格档;字形比控件内图标低一档(sm / md 16px、lg 20px)。
29
+ 原生动作项不是 Headless 部件、配方打不到它,触发器也读这两支私有槽,换档只改这里 */
30
+ --xh-_float-button-size: var(--xh-control-float-md);
31
+ --xh-_float-button-glyph-size: var(--xh-glyph-size-sm);
32
32
  /* 作者塞进指示符槽的图标跟着尺寸档走,与皮肤画的兜底字形同一把尺 */
33
33
  --xh-icon-size: var(--xh-float-button-icon-size, var(--xh-_float-button-glyph-size));
34
34
 
@@ -166,18 +166,16 @@
166
166
 
167
167
  /* —— 尺寸:原生动作项与触发器的 floating 档逐档同表 —— */
168
168
  [data-scope='float-button'][data-part='root'][data-size='sm'] {
169
- --xh-_float-button-size: var(--xh-control-box-md);
170
- --xh-_float-button-glyph-size: var(--xh-glyph-size-md);
169
+ --xh-_float-button-size: var(--xh-control-box-sm);
171
170
  }
172
171
 
173
172
  [data-scope='float-button'][data-part='root'][data-size='md'] {
174
- --xh-_float-button-size: var(--xh-control-box-lg);
175
- --xh-_float-button-glyph-size: var(--xh-glyph-size-lg);
173
+ --xh-_float-button-size: var(--xh-control-float-md);
176
174
  }
177
175
 
178
176
  [data-scope='float-button'][data-part='root'][data-size='lg'] {
179
- --xh-_float-button-size: calc(var(--xh-control-box-lg) + var(--xh-space-2));
180
- --xh-_float-button-glyph-size: var(--xh-glyph-size-xl);
177
+ --xh-_float-button-size: var(--xh-control-box-lg);
178
+ --xh-_float-button-glyph-size: var(--xh-glyph-size-md);
181
179
  }
182
180
 
183
181
  /* —— 形态:给展开列表里原生动作项用的面 ——
@@ -201,7 +199,8 @@
201
199
  --xh-_float-button-bg: var(--xh-_tone-subtle, var(--xh-bg-subtle-opaque));
202
200
  --xh-_float-button-bg-hover: var(--xh-_tone-subtle-hover, var(--xh-bg-subtle-hover-opaque));
203
201
  --xh-_float-button-bg-active: var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active-opaque));
204
- --xh-_float-button-fg: var(--xh-_tone-fg, var(--xh-fg-default));
202
+ /* 与形态矩阵 subtle 档的中性字同一支(次要字色),触发器与动作项一致 */
203
+ --xh-_float-button-fg: var(--xh-_tone-fg, var(--xh-fg-muted));
205
204
  --xh-_float-button-border: transparent;
206
205
  --xh-_float-button-border-hover: transparent;
207
206
  --xh-_float-button-shadow: none;
@@ -228,8 +227,8 @@
228
227
  }
229
228
 
230
229
  /* —— 触发器 ——
231
- 浮在内容之上的单图标圆钮,接 Action Control floating 档:盒型(md = box-lg 48px,圆形)、
232
- 四态面、0.97 按压与 44px 命中区由家族配方按 data-xh-action-variant / -size 给出。
230
+ 浮在内容之上的单图标圆钮,接 Action Control floating 档:圆形、四态面、按压与 44px 命中区
231
+ 由家族配方按 data-xh-action-variant / -size 给出;视觉盒与字形取根上按档给的尺(与动作项同一张表)。
233
232
  这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射 */
234
233
  [data-scope='float-button'][data-part='trigger'] {
235
234
  --xh-action-bg-rest: var(--xh-float-button-bg, var(--xh-_action-variant-bg-rest));
@@ -253,9 +252,20 @@
253
252
  --xh-action-shadow-focus-visible: var(--xh-float-button-shadow, none);
254
253
  --xh-action-shadow-disabled: var(--xh-float-button-shadow, none);
255
254
  --xh-action-radius: var(--xh-float-button-radius, var(--xh-_action-profile-radius));
256
- --xh-action-visual-size: var(--xh-float-button-size, var(--xh-_action-profile-visual-size));
257
- /* 作者塞进来的图标跟着 floating 档走(md 24px),与皮肤画的兜底字形同一把尺 */
258
- --xh-icon-size: var(--xh-float-button-icon-size, var(--xh-_action-profile-glyph-size));
255
+ --xh-action-visual-size: var(--xh-float-button-size, var(--xh-_float-button-size));
256
+ --xh-action-min-inline-size: var(--xh-float-button-size, var(--xh-_float-button-size));
257
+ /* 作者塞进来的图标与皮肤画的兜底字形同一把尺 */
258
+ --xh-icon-size: var(--xh-float-button-icon-size, var(--xh-_float-button-glyph-size));
259
+ }
260
+
261
+ /* subtle 档:形态矩阵的淡底是半透明的墨色,钮钉在内容之上盖不住底下的字;触发器改读上面
262
+ 不透明的那组淡底(与展开组里的原生动作项同一块面),写了语气仍是语气淡底 */
263
+ [data-scope='float-button'][data-part='root'][data-variant='subtle']
264
+ [data-scope='float-button'][data-part='trigger'] {
265
+ --xh-action-bg-rest: var(--xh-float-button-bg, var(--xh-_float-button-bg));
266
+ --xh-action-bg-hover: var(--xh-float-button-bg-hover, var(--xh-_float-button-bg-hover));
267
+ --xh-action-bg-pressed: var(--xh-float-button-bg-active, var(--xh-_float-button-bg-active));
268
+ --xh-action-bg-focus-visible: var(--xh-float-button-bg, var(--xh-_float-button-bg));
259
269
  }
260
270
 
261
271
  /* 缺省 outline 是 frosted 材质面:连接层只在这一档投影 data-xh-material,面由材质家族配方给——
@@ -402,10 +412,12 @@
402
412
  }
403
413
 
404
414
  /* 逐条依次冒出来,离触发器最近的那条先到。backwards 让每条在自己那份延迟里保持起始帧。
405
- 挂载时就展开着的那一段(data-instant)属于首帧,直接呈现。守卫包在 :where 里不加特异性:
406
- 后面的交错延迟、液态分离块与收起那几条要照旧压得过这一条 */
407
- [data-scope='float-button'][data-part='list']:where(:not([data-instant])) > * {
408
- animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
415
+ 挂载时就展开着的那一段(data-instant)属于首帧,直接呈现。
416
+ 动作项是作者放进来的任意节点,规则主体没有可认的特征:冒出、缩回与交错写成 list 自己的私有槽,
417
+ 动作项只读槽。主体无特征的规则挂在 data-instant / data-state 后面,页面上任何元素翻转这两个属性
418
+ 都会让它整棵子树重算 */
419
+ [data-scope='float-button'][data-part='list']:where(:not([data-instant])) {
420
+ --xh-_float-button-item-enter: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
409
421
  }
410
422
 
411
423
  /* 原生按钮直接作为动作项时,沿用触发器的视觉面(同一组公开槽、同一张形态表);XhButton 保留自己的皮肤。 */
@@ -462,42 +474,55 @@
462
474
  /* 交错的间隔:第二条起逐级往后推,第五条起统一钉在第四级——与收起、与列表动效同一个封顶,
463
475
  动作再多也不会拖出一条越来越慢的尾巴 */
464
476
  [data-scope='float-button'][data-part='list'] > *:nth-child(2) {
465
- animation-delay: var(--xh-motion-stagger-step);
477
+ --xh-_float-button-item-rank: 1;
466
478
  }
467
479
 
468
480
  [data-scope='float-button'][data-part='list'] > *:nth-child(3) {
469
- animation-delay: calc(2 * var(--xh-motion-stagger-step));
481
+ --xh-_float-button-item-rank: 2;
470
482
  }
471
483
 
472
484
  [data-scope='float-button'][data-part='list'] > *:nth-child(4) {
473
- animation-delay: calc(3 * var(--xh-motion-stagger-step));
485
+ --xh-_float-button-item-rank: 3;
474
486
  }
475
487
 
476
488
  [data-scope='float-button'][data-part='list'] > *:nth-child(n + 5) {
477
- animation-delay: calc(4 * var(--xh-motion-stagger-step));
489
+ --xh-_float-button-item-rank: 4;
478
490
  }
479
491
 
480
492
  /* 收起:逆着冒出的次序逐条缩回,离触发器最远的先走、最近的最后收,连接层等它们播完才藏起展开组。
481
493
  液态档里从触发器拆出来的那几块由液态组融回,不挂这段 */
482
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]) {
494
+ [data-scope='float-button'][data-part='list'][data-state='closed'] {
495
+ --xh-_float-button-item-exit: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
496
+ --xh-_float-button-item-exiting: 1;
483
497
  pointer-events: none;
484
- animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
485
498
  }
486
499
 
487
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]):nth-last-child(2) {
488
- animation-delay: var(--xh-motion-stagger-step);
500
+ /* 动作项只读槽:收起档压过进场档;延迟展开按正序名次、收起按倒序名次(收起标记为 1 时取后者) */
501
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]) {
502
+ animation: var(--xh-_float-button-item-exit, var(--xh-_float-button-item-enter, none));
503
+ animation-delay: calc(
504
+ var(--xh-motion-stagger-step) *
505
+ (
506
+ var(--xh-_float-button-item-rank, 0) * (1 - var(--xh-_float-button-item-exiting, 0)) +
507
+ var(--xh-_float-button-item-rank-back, 0) * var(--xh-_float-button-item-exiting, 0)
508
+ )
509
+ );
510
+ }
511
+
512
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]):nth-last-child(2) {
513
+ --xh-_float-button-item-rank-back: 1;
489
514
  }
490
515
 
491
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]):nth-last-child(3) {
492
- animation-delay: calc(2 * var(--xh-motion-stagger-step));
516
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]):nth-last-child(3) {
517
+ --xh-_float-button-item-rank-back: 2;
493
518
  }
494
519
 
495
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]):nth-last-child(4) {
496
- animation-delay: calc(3 * var(--xh-motion-stagger-step));
520
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]):nth-last-child(4) {
521
+ --xh-_float-button-item-rank-back: 3;
497
522
  }
498
523
 
499
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]):nth-last-child(n + 5) {
500
- animation-delay: calc(4 * var(--xh-motion-stagger-step));
524
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]):nth-last-child(n + 5) {
525
+ --xh-_float-button-item-rank-back: 4;
501
526
  }
502
527
 
503
528
  /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中。
@@ -178,7 +178,7 @@
178
178
  flex: 1 1 auto;
179
179
  overflow: hidden;
180
180
  font-size: var(--xh-floating-panel-title-font-size, var(--xh-text-label-size));
181
- font-weight: var(--xh-floating-panel-title-font-weight, var(--xh-font-weight-semibold));
181
+ font-weight: var(--xh-floating-panel-title-font-weight, var(--xh-font-weight-medium));
182
182
  line-height: var(--xh-leading-tight);
183
183
  white-space: nowrap;
184
184
  text-overflow: ellipsis;
package/css/form.css CHANGED
@@ -17,19 +17,38 @@
17
17
  --xh-form-skin: 1;
18
18
  }
19
19
 
20
- /* 表单是一列字段:竖排、字段之间留一档间距。root 就是那个原生 <form> */
20
+ /* 表单是一列字段,root 就是那个原生 <form>。项距不走 gap:字段带辅助行(说明,或给错误文案留的那一行)时
21
+ 那一行就是项距,没有辅助行的项才在下方补一段项距(见下面两条)。一行流档的项距另取一档 */
21
22
  [data-scope='form'][data-part='root'] {
23
+ --xh-_form-item-gap: var(--xh-form-gap, var(--xh-space-5));
24
+
22
25
  display: flex;
23
26
  flex-direction: column;
24
- gap: var(--xh-form-gap, var(--xh-stack-gap-md));
27
+ row-gap: 0;
25
28
  margin: 0;
26
29
  }
27
30
 
31
+ /* 每一项在下方留一段项距,最后一项不留。:where() 不计特指度,作者给自己的节点写外边距照样压得过 */
32
+ :where([data-scope='form'][data-part='root']) > :where(:not(:last-child)) {
33
+ margin-block-end: var(--xh-_form-item-gap);
34
+ }
35
+
36
+ /* 字段带辅助行:辅助行(最小高 --xh-space-5)紧贴控件、自己就是项距,这一项不再另留;
37
+ 说明收起、只留错误文案占位的那一行同样算。字段无效时它的直接子说明被收起(见 description.css),
38
+ 不占那一行,不算辅助行:没渲染错误文案的无效字段照常留项距 */
39
+ [data-scope='form'][data-part='field-group']:has(
40
+ [data-scope='field'][data-part='error-text'],
41
+ [data-scope='field'][data-part='description']:not([hidden], [data-scope='field'][data-part='root'][data-invalid] > *)
42
+ ) {
43
+ margin-block-end: 0;
44
+ }
45
+
28
46
  /* 网格:字段排进等宽列,各列下限写 0,一段长文本不会把自己那列撑宽。
29
47
  列数由 data-columns 逐档给,换档只改 --xh-_form-cols 这一个槽 */
30
48
  [data-scope='form'][data-part='root'][data-layout='grid'] {
31
49
  display: grid;
32
50
  grid-template-columns: repeat(var(--xh-_form-cols), minmax(0, 1fr));
51
+ column-gap: var(--xh-form-gap, var(--xh-space-5));
33
52
 
34
53
  --xh-_form-cols: 1;
35
54
  }
@@ -41,9 +60,11 @@
41
60
 
42
61
  /* 横排一行流:字段并肩排,放不下自动折行 */
43
62
  [data-scope='form'][data-part='root'][data-layout='inline'] {
63
+ --xh-_form-item-gap: var(--xh-form-inline-row-gap, var(--xh-space-2));
64
+
44
65
  flex-flow: row wrap;
45
66
  align-items: start;
46
- column-gap: var(--xh-form-inline-gap, var(--xh-space-4));
67
+ column-gap: var(--xh-form-inline-gap, var(--xh-space-6));
47
68
  /* 一行流里字段按内容收,没有列宽可铺:在表单根上取下此处的字段缺省宽,交给下面的字段还原 */
48
69
  --xh-_form-inline-control-w: var(--xh-control-w);
49
70
  }
@@ -178,13 +199,6 @@
178
199
  --xh-_form-span: 1 / -1;
179
200
  }
180
201
 
181
- /* 出错的字段在起始缘竖一条色带:读屏之外还得有一眼看得见的定位标记。
182
- 用逻辑属性,RTL 下自动换到右侧 */
183
- [data-scope='form'][data-part='field-group'][data-invalid] {
184
- padding-inline-start: var(--xh-form-field-invalid-px, var(--xh-space-2));
185
- border-inline-start: var(--xh-stroke-thick) solid var(--xh-form-field-invalid-border, var(--xh-border-invalid));
186
- }
187
-
188
202
  /* 提交失败后的错误汇总。role=alert 常挂,靠 hidden 显隐 */
189
203
  [data-scope='form'][data-part='error-summary'] {
190
204
  display: flex;
@@ -247,7 +261,7 @@
247
261
 
248
262
  /* 摘要显出时条目逐条入场,越靠后起步越晚。
249
263
  backwards 让还没轮到的条目停在首帧,不是先显出再重播 */
250
- [data-scope='form'][data-part='error-summary'][data-state='invalid'] [data-part='error-summary-item'] {
264
+ [data-scope='form'][data-part='error-summary'][data-state='invalid'] [data-part='error-summary-item']:where([data-scope='form']) {
251
265
  animation: xh-drop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
252
266
  }
253
267
 
@@ -256,14 +270,14 @@
256
270
  每多一节 ~ 就多要求前面多一条露面的条目,链越长的规则排得越后、赢过短链 */
257
271
  [data-scope='form'][data-part='error-summary'][data-state='invalid']
258
272
  [data-part='error-summary-item']:not([hidden])
259
- ~ [data-part='error-summary-item']:not([hidden]) {
273
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
260
274
  animation-delay: var(--xh-motion-stagger-step);
261
275
  }
262
276
 
263
277
  [data-scope='form'][data-part='error-summary'][data-state='invalid']
264
278
  [data-part='error-summary-item']:not([hidden])
265
279
  ~ [data-part='error-summary-item']:not([hidden])
266
- ~ [data-part='error-summary-item']:not([hidden]) {
280
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
267
281
  animation-delay: calc(var(--xh-motion-stagger-step) * 2);
268
282
  }
269
283
 
@@ -271,7 +285,7 @@
271
285
  [data-part='error-summary-item']:not([hidden])
272
286
  ~ [data-part='error-summary-item']:not([hidden])
273
287
  ~ [data-part='error-summary-item']:not([hidden])
274
- ~ [data-part='error-summary-item']:not([hidden]) {
288
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
275
289
  animation-delay: calc(var(--xh-motion-stagger-step) * 3);
276
290
  }
277
291
 
@@ -280,7 +294,7 @@
280
294
  ~ [data-part='error-summary-item']:not([hidden])
281
295
  ~ [data-part='error-summary-item']:not([hidden])
282
296
  ~ [data-part='error-summary-item']:not([hidden])
283
- ~ [data-part='error-summary-item']:not([hidden]) {
297
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
284
298
  animation-delay: calc(var(--xh-motion-stagger-step) * 4);
285
299
  }
286
300
 
@@ -292,7 +306,7 @@
292
306
  ~ [data-part='error-summary-item']:not([hidden])
293
307
  ~ [data-part='error-summary-item']:not([hidden])
294
308
  ~ [data-part='error-summary-item']:not([hidden])
295
- ~ [data-part='error-summary-item']:not([hidden]) {
309
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
296
310
  animation-delay: calc(var(--xh-motion-stagger-step) * 5);
297
311
  }
298
312
 
@@ -162,7 +162,7 @@
162
162
 
163
163
  /* —— 直接操纵:能拖的节点给抓手,拖着时整张图是抓紧的手;放大后空白处也能拖着平移。
164
164
  触屏在节点上的拖动归图,其余地方照常滚动页面 —— */
165
- [data-scope='graph-chart'][data-part='plot'][data-draggable] [data-part='node'] {
165
+ [data-scope='graph-chart'][data-part='plot'][data-draggable] [data-part='node']:where([data-scope='graph-chart']) {
166
166
  cursor: grab;
167
167
  touch-action: none;
168
168
  }
@@ -173,7 +173,7 @@
173
173
  }
174
174
 
175
175
  [data-scope='graph-chart'][data-part='plot'][data-dragging],
176
- [data-scope='graph-chart'][data-part='plot'][data-dragging] [data-part='node'] {
176
+ [data-scope='graph-chart'][data-part='plot'][data-dragging] [data-part='node']:where([data-scope='graph-chart']) {
177
177
  cursor: grabbing;
178
178
  }
179
179
 
package/css/grid-list.css CHANGED
@@ -74,7 +74,7 @@
74
74
  padding-inline: var(--xh-grid-list-label-px, var(--xh-control-px-md));
75
75
  color: var(--xh-grid-list-label-fg, var(--xh-fg-default));
76
76
  font-size: var(--xh-grid-list-label-font-size, var(--xh-text-label-size));
77
- font-weight: var(--xh-grid-list-label-font-weight, var(--xh-font-weight-semibold));
77
+ font-weight: var(--xh-grid-list-label-font-weight, var(--xh-font-weight-medium));
78
78
  line-height: var(--xh-leading-normal);
79
79
  }
80
80
 
package/css/highlight.css CHANGED
@@ -18,13 +18,13 @@
18
18
  }
19
19
 
20
20
  /* 浏览器给 mark 的默认底色是一个固定的亮黄,暗色主题下压在深底上刺眼、
21
- 配的黑字也不随主题走;这里整份换成随主题走的品牌淡底。
22
- 槽名带 mark 段与部件对上 */
21
+ 配的黑字也不随主题走;这里换成随主题走的标记底(亮色浅黄、暗色深黄),字仍取正文色。
22
+ 不用品牌淡底:那一支专属选中 / 当前。槽名带 mark 段与部件对上 */
23
23
  [data-scope='highlight'][data-part='mark'] {
24
24
  padding-inline: var(--xh-highlight-mark-px, var(--xh-space-0_5));
25
25
  border-radius: var(--xh-highlight-mark-radius, var(--xh-shape-inset));
26
- background: var(--xh-highlight-mark-bg, var(--xh-bg-brand-subtle));
27
- color: var(--xh-highlight-mark-fg, var(--xh-fg-brand-strong));
26
+ background: var(--xh-highlight-mark-bg, var(--xh-bg-mark));
27
+ color: var(--xh-highlight-mark-fg, var(--xh-fg-default));
28
28
  font-weight: var(--xh-highlight-mark-font-weight, var(--xh-font-weight-medium));
29
29
  /* 命中片段跨行时两半各自收边,否则圆角与内边距只画在整段的首尾。
30
30
  两条都写:WebKit 只认带前缀那条 */
@@ -34,7 +34,7 @@
34
34
 
35
35
  /* 语气落在根上而不是每个 mark 上:命中片段有好几个,用哪族颜色是整段的属性。
36
36
  使用者槽排在语气之前:写死了 mark 的底与字色,六族语气一并让位 */
37
- [data-scope='highlight'][data-part='root'][data-tone] [data-part='mark'] {
37
+ [data-scope='highlight'][data-part='root'][data-tone] [data-part='mark']:where([data-scope='highlight']) {
38
38
  background: var(--xh-highlight-mark-bg, var(--xh-_tone-subtle));
39
39
  color: var(--xh-highlight-mark-fg, var(--xh-_tone-fg));
40
40
  }
@@ -124,15 +124,18 @@
124
124
  --xh-frosted-shadow: var(--xh-hover-card-shadow, var(--xh-_material-shadow));
125
125
  --xh-frosted-backdrop: var(--xh-hover-card-backdrop, var(--xh-_material-backdrop));
126
126
 
127
- /* 尺寸档只换这两个私有槽。size 落在 content 上而非 root:root 是可选部件,
128
- 面板几何也长在 content 上。语气不接:卡片是内容容器,语气该由里面的内容表达 */
129
- --xh-_hover-card-pad: var(--xh-surface-pad-md);
127
+ /* 尺寸档只换这三个私有槽。size 落在 content 上而非 root:root 是可选部件,
128
+ 面板几何也长在 content 上。横向内衬比纵向高一档(缺省纵 12 横 16),与 popover 同一套。
129
+ 语气不接:卡片是内容容器,语气该由里面的内容表达 */
130
+ --xh-_hover-card-py: var(--xh-surface-pad-md);
131
+ --xh-_hover-card-px: var(--xh-surface-pad-lg);
130
132
  --xh-_hover-card-max-w: var(--xh-overlay-max-w);
131
133
 
132
134
  position: relative;
133
135
  display: flex;
134
136
  flex-direction: column;
135
- gap: var(--xh-hover-card-gap, var(--xh-space-2));
137
+ /* 标题与正文贴着排:两行之间只留 4px */
138
+ gap: var(--xh-hover-card-gap, var(--xh-space-1));
136
139
  inline-size: max-content;
137
140
  /* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的内容就点不到了 */
138
141
  max-inline-size: min(var(--xh-hover-card-max-w, var(--xh-_hover-card-max-w)), var(--xh-_hover-card-available-w));
@@ -141,8 +144,8 @@
141
144
  overflow-y: auto;
142
145
  /* 浮在页面之上的 Overlay 滚动面:滚到头不把页面一起带走 */
143
146
  overscroll-behavior: contain;
144
- padding-block: var(--xh-hover-card-py, var(--xh-_hover-card-pad));
145
- padding-inline: var(--xh-hover-card-px, var(--xh-_hover-card-pad));
147
+ padding-block: var(--xh-hover-card-py, var(--xh-_hover-card-py));
148
+ padding-inline: var(--xh-hover-card-px, var(--xh-_hover-card-px));
146
149
  border-radius: var(--xh-hover-card-radius, var(--xh-shape-overlay));
147
150
  pointer-events: auto;
148
151
  /* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
@@ -172,28 +175,32 @@
172
175
  }
173
176
 
174
177
  /* —— 尺寸 —— */
175
- /* 缺省档写在 content 的基础规则里;四边等宽的面板内衬三档取 surface-pad 那把尺 */
178
+ /* 缺省档写在 content 的基础规则里;内衬三档取 surface-pad 那把尺,横向始终比纵向高一档 */
176
179
  [data-scope='hover-card'][data-part='content'][data-size='sm'] {
177
- --xh-_hover-card-pad: var(--xh-surface-pad-sm);
180
+ --xh-_hover-card-py: var(--xh-surface-pad-sm);
181
+ --xh-_hover-card-px: var(--xh-surface-pad-md);
178
182
  --xh-_hover-card-max-w: var(--xh-overlay-max-w-sm);
179
183
  }
180
184
 
181
185
  [data-scope='hover-card'][data-part='content'][data-size='lg'] {
182
- --xh-_hover-card-pad: var(--xh-surface-pad-lg);
186
+ --xh-_hover-card-py: var(--xh-surface-pad-lg);
187
+ --xh-_hover-card-px: var(--xh-surface-pad-xl);
183
188
  --xh-_hover-card-max-w: var(--xh-overlay-max-w-lg);
184
189
  }
185
190
 
191
+ /* 气泡标题:14px / medium / 正文色 */
186
192
  [data-scope='hover-card'][data-part='title'] {
187
193
  margin: 0;
188
194
  font-size: var(--xh-hover-card-title-font-size, var(--xh-text-label-size));
189
- font-weight: var(--xh-hover-card-title-font-weight, var(--xh-font-weight-semibold));
195
+ font-weight: var(--xh-hover-card-title-font-weight, var(--xh-font-weight-medium));
190
196
  color: var(--xh-hover-card-title-fg, var(--xh-fg-default));
191
197
  }
192
198
 
193
- /* 说明文字走说明档:13px + fg-muted */
199
+ /* 说明就是卡片的正文:14px 正文字号 + fg-muted 次级色 */
194
200
  [data-scope='hover-card'][data-part='description'] {
195
201
  margin: 0;
196
- font-size: var(--xh-hover-card-description-font-size, var(--xh-text-secondary-size));
202
+ font-size: var(--xh-hover-card-description-font-size, var(--xh-text-body-size));
203
+ line-height: var(--xh-leading-normal);
197
204
  color: var(--xh-hover-card-description-fg, var(--xh-fg-muted));
198
205
  }
199
206