@xihan-ui/styles 3.0.0 → 3.2.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 (221) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +1 -1
  3. package/component-tokens.d.ts +29 -0
  4. package/components.tokens.json +683 -27
  5. package/css/alert.css +2 -2
  6. package/css/approval.css +4 -4
  7. package/css/button.css +9 -5
  8. package/css/calendar-picker.css +3 -3
  9. package/css/calendar-range-picker.css +7 -7
  10. package/css/carousel.css +45 -13
  11. package/css/cartesian-chart.css +11 -11
  12. package/css/cascader.css +10 -10
  13. package/css/citation.css +2 -2
  14. package/css/code-view.css +6 -6
  15. package/css/color-picker.css +81 -0
  16. package/css/color-swatch-picker.css +9 -4
  17. package/css/combobox.css +12 -4
  18. package/css/command.css +1 -1
  19. package/css/date-field.css +39 -0
  20. package/css/date-picker.css +86 -9
  21. package/css/date-range-picker.css +47 -7
  22. package/css/diff-view.css +8 -8
  23. package/css/field-array.css +1 -1
  24. package/css/field.css +4 -0
  25. package/css/file-upload.css +1 -1
  26. package/css/float-button.css +140 -27
  27. package/css/form.css +14 -6
  28. package/css/graph-chart.css +2 -2
  29. package/css/highlight.css +1 -1
  30. package/css/image.css +1 -1
  31. package/css/mention.css +1 -1
  32. package/css/message-feed.css +1 -1
  33. package/css/notification.css +26 -20
  34. package/css/number-field.css +18 -18
  35. package/css/page-header.css +2 -2
  36. package/css/password-input.css +2 -2
  37. package/css/popconfirm.css +3 -3
  38. package/css/question-flow.css +8 -8
  39. package/css/radar-chart.css +6 -6
  40. package/css/rating.css +1 -1
  41. package/css/select.css +2 -2
  42. package/css/separator.css +2 -2
  43. package/css/side-nav.css +13 -13
  44. package/css/skeleton.css +5 -5
  45. package/css/slider.css +6 -6
  46. package/css/sortable.css +2 -2
  47. package/css/table.css +19 -2
  48. package/css/tags-input.css +1 -1
  49. package/css/time-picker.css +59 -2
  50. package/css/tool-call.css +7 -7
  51. package/css/tooltip.css +1 -1
  52. package/css/tree-select.css +2 -2
  53. package/css/tree.css +81 -11
  54. package/dist/css/accordion.css +269 -0
  55. package/dist/css/affix.css +47 -0
  56. package/dist/css/alert.css +247 -0
  57. package/dist/css/anchor.css +252 -0
  58. package/dist/css/approval.css +501 -0
  59. package/dist/css/avatar-group.css +99 -0
  60. package/dist/css/avatar.css +98 -0
  61. package/dist/css/back-top.css +161 -0
  62. package/dist/css/badge.css +205 -0
  63. package/dist/css/bar-code.css +62 -0
  64. package/dist/css/breadcrumb.css +230 -0
  65. package/dist/css/button-group.css +263 -0
  66. package/dist/css/button.css +219 -0
  67. package/dist/css/calendar-picker.css +467 -0
  68. package/dist/css/calendar-range-picker.css +554 -0
  69. package/dist/css/card.css +221 -0
  70. package/dist/css/carousel.css +710 -0
  71. package/dist/css/cartesian-chart.css +830 -0
  72. package/dist/css/cascader.css +961 -0
  73. package/dist/css/checkbox-group.css +358 -0
  74. package/dist/css/checkbox.css +257 -0
  75. package/dist/css/citation.css +470 -0
  76. package/dist/css/clipboard.css +315 -0
  77. package/dist/css/code-view.css +374 -0
  78. package/dist/css/collapsible.css +185 -0
  79. package/dist/css/color-field.css +176 -0
  80. package/dist/css/color-picker.css +595 -0
  81. package/dist/css/color-slider.css +281 -0
  82. package/dist/css/color-swatch-picker.css +250 -0
  83. package/dist/css/color-swatch.css +35 -0
  84. package/dist/css/combobox.css +574 -0
  85. package/dist/css/command.css +399 -0
  86. package/dist/css/context-menu.css +420 -0
  87. package/dist/css/date-field.css +317 -0
  88. package/dist/css/date-picker.css +868 -0
  89. package/dist/css/date-range-picker.css +886 -0
  90. package/dist/css/description.css +67 -0
  91. package/dist/css/descriptions.css +299 -0
  92. package/dist/css/dialog.css +455 -0
  93. package/dist/css/diff-view.css +513 -0
  94. package/dist/css/download-trigger.css +151 -0
  95. package/dist/css/drawer.css +552 -0
  96. package/dist/css/editable.css +295 -0
  97. package/dist/css/empty-state.css +163 -0
  98. package/dist/css/field-array.css +226 -0
  99. package/dist/css/field.css +166 -0
  100. package/dist/css/fieldset.css +102 -0
  101. package/dist/css/file-upload.css +429 -0
  102. package/dist/css/flex.css +441 -0
  103. package/dist/css/float-button.css +569 -0
  104. package/dist/css/floating-panel.css +429 -0
  105. package/dist/css/focus.css +46 -0
  106. package/dist/css/forced-colors.css +93 -0
  107. package/dist/css/form.css +393 -0
  108. package/dist/css/funnel-chart.css +106 -0
  109. package/dist/css/graph-chart.css +205 -0
  110. package/dist/css/grid-list.css +235 -0
  111. package/dist/css/grid.css +1201 -0
  112. package/dist/css/heatmap.css +552 -0
  113. package/dist/css/hierarchy-chart.css +298 -0
  114. package/dist/css/highlight.css +41 -0
  115. package/dist/css/hover-card.css +226 -0
  116. package/dist/css/icon.css +225 -0
  117. package/dist/css/image-cropper.css +373 -0
  118. package/dist/css/image-viewer.css +538 -0
  119. package/dist/css/image.css +98 -0
  120. package/dist/css/infinite-scroll.css +77 -0
  121. package/dist/css/input-group.css +275 -0
  122. package/dist/css/json-viewer.css +379 -0
  123. package/dist/css/kbd.css +72 -0
  124. package/dist/css/label.css +78 -0
  125. package/dist/css/layers.css +7 -0
  126. package/dist/css/layout.css +372 -0
  127. package/dist/css/liquid.css +106 -0
  128. package/dist/css/list.css +152 -0
  129. package/dist/css/listbox.css +390 -0
  130. package/dist/css/loading-bar.css +141 -0
  131. package/dist/css/log.css +306 -0
  132. package/dist/css/markdown-stream.css +149 -0
  133. package/dist/css/marquee.css +378 -0
  134. package/dist/css/masonry.css +70 -0
  135. package/dist/css/matrix-code.css +67 -0
  136. package/dist/css/mention.css +393 -0
  137. package/dist/css/menu.css +364 -0
  138. package/dist/css/menubar.css +456 -0
  139. package/dist/css/message-feed.css +318 -0
  140. package/dist/css/navigation-menu.css +513 -0
  141. package/dist/css/notification.css +782 -0
  142. package/dist/css/number-animation.css +44 -0
  143. package/dist/css/number-field.css +252 -0
  144. package/dist/css/overlay-arrow.css +56 -0
  145. package/dist/css/page-header.css +184 -0
  146. package/dist/css/pagination.css +450 -0
  147. package/dist/css/password-input.css +391 -0
  148. package/dist/css/pie-chart.css +247 -0
  149. package/dist/css/pin-input.css +199 -0
  150. package/dist/css/pointer.css +36 -0
  151. package/dist/css/popconfirm.css +320 -0
  152. package/dist/css/popover.css +279 -0
  153. package/dist/css/progress.css +501 -0
  154. package/dist/css/prompt-input.css +260 -0
  155. package/dist/css/question-flow.css +553 -0
  156. package/dist/css/radar-chart.css +233 -0
  157. package/dist/css/radio-group.css +598 -0
  158. package/dist/css/rating.css +294 -0
  159. package/dist/css/reasoning.css +343 -0
  160. package/dist/css/reset.css +117 -0
  161. package/dist/css/resizable.css +242 -0
  162. package/dist/css/sankey-chart.css +174 -0
  163. package/dist/css/scroll-area.css +240 -0
  164. package/dist/css/scrollbar.css +204 -0
  165. package/dist/css/select.css +612 -0
  166. package/dist/css/separator.css +122 -0
  167. package/dist/css/side-nav.css +476 -0
  168. package/dist/css/signature-pad.css +179 -0
  169. package/dist/css/skeleton.css +161 -0
  170. package/dist/css/slider.css +374 -0
  171. package/dist/css/sortable.css +228 -0
  172. package/dist/css/sparkline.css +164 -0
  173. package/dist/css/spinner.css +236 -0
  174. package/dist/css/splitter.css +159 -0
  175. package/dist/css/statistic.css +137 -0
  176. package/dist/css/steps.css +627 -0
  177. package/dist/css/switch.css +351 -0
  178. package/dist/css/table.css +1145 -0
  179. package/dist/css/tabs.css +944 -0
  180. package/dist/css/tag-group.css +247 -0
  181. package/dist/css/tag.css +310 -0
  182. package/dist/css/tags-input.css +322 -0
  183. package/dist/css/text-field.css +197 -0
  184. package/dist/css/time-field.css +277 -0
  185. package/dist/css/time-picker.css +707 -0
  186. package/dist/css/time-range-picker.css +746 -0
  187. package/dist/css/timeline.css +423 -0
  188. package/dist/css/timer.css +123 -0
  189. package/dist/css/timestamp.css +34 -0
  190. package/dist/css/toggle-group.css +424 -0
  191. package/dist/css/toggle.css +146 -0
  192. package/dist/css/tone.css +189 -0
  193. package/dist/css/tool-call.css +429 -0
  194. package/dist/css/toolbar.css +365 -0
  195. package/dist/css/tooltip.css +218 -0
  196. package/dist/css/tour.css +439 -0
  197. package/dist/css/transfer.css +638 -0
  198. package/dist/css/tree-select.css +878 -0
  199. package/dist/css/tree.css +733 -0
  200. package/dist/css/truncate.css +108 -0
  201. package/dist/css/typography.css +472 -0
  202. package/dist/css/undefined.css +58 -0
  203. package/dist/css/virtualizer.css +166 -0
  204. package/dist/css/visually-hidden.css +20 -0
  205. package/dist/css/watermark.css +82 -0
  206. package/dist/family/action-control.css +487 -0
  207. package/dist/family/chart.css +480 -0
  208. package/dist/family/check-mark.css +94 -0
  209. package/dist/family/choice-card.css +97 -0
  210. package/dist/family/collection-item.css +764 -0
  211. package/dist/family/field-chrome.css +287 -0
  212. package/dist/family/loading-ring.css +95 -0
  213. package/dist/family/material.css +72 -0
  214. package/dist/family/menu-choice.css +56 -0
  215. package/dist/family/motion.css +363 -0
  216. package/dist/family/swatch.css +59 -0
  217. package/dist/family/tag-list.css +59 -0
  218. package/family/action-control.css +3 -12
  219. package/index.css +7307 -6759
  220. package/index.unlayered.css +7309 -6761
  221. package/package.json +165 -164
@@ -25,10 +25,10 @@
25
25
  [data-scope='float-button'][data-part='root'] {
26
26
  --xh-_float-button-offset: var(--xh-space-6);
27
27
  /* 展开列表里原生动作项的身量与字形尺:触发器自己走 Action Control floating 档
28
- (sm = box-md / md = box-lg / lg = box-lg + space-2,字形 md / lg / xl),
28
+ (sm = box-sm / md = box-md / lg = box-lg,字形 sm / md / lg),
29
29
  原生动作项不是 Headless 部件、配方打不到它,这两支私有槽按同一张表镜像,换档只改这里 */
30
- --xh-_float-button-size: var(--xh-control-box-lg);
31
- --xh-_float-button-glyph-size: var(--xh-glyph-size-lg);
30
+ --xh-_float-button-size: var(--xh-control-box-md);
31
+ --xh-_float-button-glyph-size: var(--xh-glyph-size-md);
32
32
  /* 作者塞进指示符槽的图标跟着尺寸档走,与皮肤画的兜底字形同一把尺 */
33
33
  --xh-icon-size: var(--xh-float-button-icon-size, var(--xh-_float-button-glyph-size));
34
34
 
@@ -66,20 +66,118 @@
66
66
  inset-inline-end: max(var(--xh-_float-button-offset), env(safe-area-inset-left), env(safe-area-inset-right));
67
67
  }
68
68
 
69
+ /* —— 位置 ——
70
+ 拖到别处、或作者给了位置时,角落那两条贴边里有一条换掉:data-placement 由连接层按位置推出
71
+ (离触发器最近的恒是视口的那条边、展开组朝页面中间长),这里只换沿边的那一条。
72
+ 百分比按固定定位的包含块(视口去掉滚动条)量,与连接层量的视口同一块;
73
+ 夹取的上下界与四角同样和安全区取大的一头,比例再怎么写,钮也不会压进刘海与横条。
74
+ 触发器边长取它自己那一档(使用者槽在前):沿边的比例量的是触发器中心 */
75
+ [data-scope='float-button'][data-part='root'] {
76
+ --xh-_float-button-span: var(--xh-float-button-size, var(--xh-_float-button-size));
77
+ }
78
+
79
+ /* 贴左右边:上下按比例,锚在离触发器近的那一头 */
80
+ [data-scope='float-button'][data-part='root'][data-edge^='inline'][data-placement^='top'] {
81
+ inset-block-start: clamp(
82
+ max(var(--xh-_float-button-offset), env(safe-area-inset-top)),
83
+ calc(var(--xh-_float-button-ratio) * 100% - var(--xh-_float-button-span) / 2),
84
+ calc(100% - var(--xh-_float-button-span) - max(var(--xh-_float-button-offset), env(safe-area-inset-bottom)))
85
+ );
86
+ }
87
+
88
+ [data-scope='float-button'][data-part='root'][data-edge^='inline'][data-placement^='bottom'] {
89
+ inset-block-end: clamp(
90
+ max(var(--xh-_float-button-offset), env(safe-area-inset-bottom)),
91
+ calc((1 - var(--xh-_float-button-ratio)) * 100% - var(--xh-_float-button-span) / 2),
92
+ calc(100% - var(--xh-_float-button-span) - max(var(--xh-_float-button-offset), env(safe-area-inset-top)))
93
+ );
94
+ }
95
+
96
+ /* 贴上下边:行内方向按比例,从行首量起 */
97
+ [data-scope='float-button'][data-part='root'][data-edge^='block'][data-placement$='-start'] {
98
+ inset-inline-start: clamp(
99
+ max(var(--xh-_float-button-offset), env(safe-area-inset-left), env(safe-area-inset-right)),
100
+ calc(var(--xh-_float-button-ratio) * 100% - var(--xh-_float-button-span) / 2),
101
+ calc(100% - var(--xh-_float-button-span) - max(var(--xh-_float-button-offset), env(safe-area-inset-left), env(safe-area-inset-right)))
102
+ );
103
+ }
104
+
105
+ [data-scope='float-button'][data-part='root'][data-edge^='block'][data-placement$='-end'] {
106
+ inset-inline-end: clamp(
107
+ max(var(--xh-_float-button-offset), env(safe-area-inset-left), env(safe-area-inset-right)),
108
+ calc((1 - var(--xh-_float-button-ratio)) * 100% - var(--xh-_float-button-span) / 2),
109
+ calc(100% - var(--xh-_float-button-span) - max(var(--xh-_float-button-offset), env(safe-area-inset-left), env(safe-area-inset-right)))
110
+ );
111
+ }
112
+
113
+ /* 停在一点、或正跟着指针走:坐标是触发器左上角的物理像素,横向一律从左边量,不随书写方向翻。
114
+ 竖向锚在离触发器近的那一头:朝下长的锚上沿,朝上长的锚下沿,展开组冒出来时触发器不挪窝。
115
+ 停着的点仍夹在视口里(视口变小时不跑出去);跟手的坐标由连接层夹好,这里原样用 */
116
+ [data-scope='float-button'][data-part='root'][data-point][data-placement] {
117
+ inset-inline: auto;
118
+ /* stylelint-disable-next-line property-disallowed-list -- 停点由连接层按指针的物理坐标写成 x,横向从左边量、不随书写方向翻 */
119
+ left: clamp(
120
+ max(var(--xh-_float-button-offset), env(safe-area-inset-left)),
121
+ var(--xh-_float-button-x),
122
+ calc(100% - var(--xh-_float-button-span) - max(var(--xh-_float-button-offset), env(safe-area-inset-right)))
123
+ );
124
+ }
125
+
126
+ [data-scope='float-button'][data-part='root'][data-point][data-placement^='top'] {
127
+ top: clamp(
128
+ max(var(--xh-_float-button-offset), env(safe-area-inset-top)),
129
+ var(--xh-_float-button-y),
130
+ calc(100% - var(--xh-_float-button-span) - max(var(--xh-_float-button-offset), env(safe-area-inset-bottom)))
131
+ );
132
+ }
133
+
134
+ [data-scope='float-button'][data-part='root'][data-point][data-placement^='bottom'] {
135
+ bottom: clamp(
136
+ max(var(--xh-_float-button-offset), env(safe-area-inset-bottom)),
137
+ calc(100% - var(--xh-_float-button-y) - var(--xh-_float-button-span)),
138
+ calc(100% - var(--xh-_float-button-span) - max(var(--xh-_float-button-offset), env(safe-area-inset-top)))
139
+ );
140
+ }
141
+
142
+ /* 跟手排在贴边与停点之后:拖动与落定途中压过提交了的位置 */
143
+ [data-scope='float-button'][data-part='root'][data-moving][data-placement] {
144
+ inset-inline: auto;
145
+ /* stylelint-disable-next-line property-disallowed-list -- 同上:跟手坐标是指针的物理 x */
146
+ left: var(--xh-_float-button-x);
147
+ }
148
+
149
+ [data-scope='float-button'][data-part='root'][data-moving][data-placement^='top'] {
150
+ top: var(--xh-_float-button-y);
151
+ }
152
+
153
+ [data-scope='float-button'][data-part='root'][data-moving][data-placement^='bottom'] {
154
+ bottom: calc(100% - var(--xh-_float-button-y) - var(--xh-_float-button-span));
155
+ }
156
+
157
+ /* 能拖时触屏手指在触发器上的移动归拖动,不让浏览器拿去滚页面;光标提示能抓、正抓着 */
158
+ [data-scope='float-button'][data-part='root'][data-draggable] [data-scope='float-button'][data-part='trigger'] {
159
+ touch-action: none;
160
+ cursor: grab;
161
+ }
162
+
163
+ [data-scope='float-button'][data-part='root'][data-dragging] [data-scope='float-button'][data-part='trigger'] {
164
+ cursor: grabbing;
165
+ }
166
+
69
167
  /* —— 尺寸:原生动作项与触发器的 floating 档逐档同表 —— */
70
168
  [data-scope='float-button'][data-part='root'][data-size='sm'] {
71
- --xh-_float-button-size: var(--xh-control-box-md);
72
- --xh-_float-button-glyph-size: var(--xh-glyph-size-md);
169
+ --xh-_float-button-size: var(--xh-control-box-sm);
170
+ --xh-_float-button-glyph-size: var(--xh-glyph-size-sm);
73
171
  }
74
172
 
75
173
  [data-scope='float-button'][data-part='root'][data-size='md'] {
76
- --xh-_float-button-size: var(--xh-control-box-lg);
77
- --xh-_float-button-glyph-size: var(--xh-glyph-size-lg);
174
+ --xh-_float-button-size: var(--xh-control-box-md);
175
+ --xh-_float-button-glyph-size: var(--xh-glyph-size-md);
78
176
  }
79
177
 
80
178
  [data-scope='float-button'][data-part='root'][data-size='lg'] {
81
- --xh-_float-button-size: calc(var(--xh-control-box-lg) + var(--xh-space-2));
82
- --xh-_float-button-glyph-size: var(--xh-glyph-size-xl);
179
+ --xh-_float-button-size: var(--xh-control-box-lg);
180
+ --xh-_float-button-glyph-size: var(--xh-glyph-size-lg);
83
181
  }
84
182
 
85
183
  /* —— 形态:给展开列表里原生动作项用的面 ——
@@ -304,10 +402,12 @@
304
402
  }
305
403
 
306
404
  /* 逐条依次冒出来,离触发器最近的那条先到。backwards 让每条在自己那份延迟里保持起始帧。
307
- 挂载时就展开着的那一段(data-instant)属于首帧,直接呈现。守卫包在 :where 里不加特异性:
308
- 后面的交错延迟、液态分离块与收起那几条要照旧压得过这一条 */
309
- [data-scope='float-button'][data-part='list']:where(:not([data-instant])) > * {
310
- animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
405
+ 挂载时就展开着的那一段(data-instant)属于首帧,直接呈现。
406
+ 动作项是作者放进来的任意节点,规则主体没有可认的特征:冒出、缩回与交错写成 list 自己的私有槽,
407
+ 动作项只读槽。主体无特征的规则挂在 data-instant / data-state 后面,页面上任何元素翻转这两个属性
408
+ 都会让它整棵子树重算 */
409
+ [data-scope='float-button'][data-part='list']:where(:not([data-instant])) {
410
+ --xh-_float-button-item-enter: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
311
411
  }
312
412
 
313
413
  /* 原生按钮直接作为动作项时,沿用触发器的视觉面(同一组公开槽、同一张形态表);XhButton 保留自己的皮肤。 */
@@ -364,42 +464,55 @@
364
464
  /* 交错的间隔:第二条起逐级往后推,第五条起统一钉在第四级——与收起、与列表动效同一个封顶,
365
465
  动作再多也不会拖出一条越来越慢的尾巴 */
366
466
  [data-scope='float-button'][data-part='list'] > *:nth-child(2) {
367
- animation-delay: var(--xh-motion-stagger-step);
467
+ --xh-_float-button-item-rank: 1;
368
468
  }
369
469
 
370
470
  [data-scope='float-button'][data-part='list'] > *:nth-child(3) {
371
- animation-delay: calc(2 * var(--xh-motion-stagger-step));
471
+ --xh-_float-button-item-rank: 2;
372
472
  }
373
473
 
374
474
  [data-scope='float-button'][data-part='list'] > *:nth-child(4) {
375
- animation-delay: calc(3 * var(--xh-motion-stagger-step));
475
+ --xh-_float-button-item-rank: 3;
376
476
  }
377
477
 
378
478
  [data-scope='float-button'][data-part='list'] > *:nth-child(n + 5) {
379
- animation-delay: calc(4 * var(--xh-motion-stagger-step));
479
+ --xh-_float-button-item-rank: 4;
380
480
  }
381
481
 
382
482
  /* 收起:逆着冒出的次序逐条缩回,离触发器最远的先走、最近的最后收,连接层等它们播完才藏起展开组。
383
483
  液态档里从触发器拆出来的那几块由液态组融回,不挂这段 */
384
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]) {
484
+ [data-scope='float-button'][data-part='list'][data-state='closed'] {
485
+ --xh-_float-button-item-exit: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
486
+ --xh-_float-button-item-exiting: 1;
385
487
  pointer-events: none;
386
- animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
387
488
  }
388
489
 
389
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]):nth-last-child(2) {
390
- animation-delay: var(--xh-motion-stagger-step);
490
+ /* 动作项只读槽:收起档压过进场档;延迟展开按正序名次、收起按倒序名次(收起标记为 1 时取后者) */
491
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]) {
492
+ animation: var(--xh-_float-button-item-exit, var(--xh-_float-button-item-enter, none));
493
+ animation-delay: calc(
494
+ var(--xh-motion-stagger-step) *
495
+ (
496
+ var(--xh-_float-button-item-rank, 0) * (1 - var(--xh-_float-button-item-exiting, 0)) +
497
+ var(--xh-_float-button-item-rank-back, 0) * var(--xh-_float-button-item-exiting, 0)
498
+ )
499
+ );
500
+ }
501
+
502
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]):nth-last-child(2) {
503
+ --xh-_float-button-item-rank-back: 1;
391
504
  }
392
505
 
393
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]):nth-last-child(3) {
394
- animation-delay: calc(2 * var(--xh-motion-stagger-step));
506
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]):nth-last-child(3) {
507
+ --xh-_float-button-item-rank-back: 2;
395
508
  }
396
509
 
397
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]):nth-last-child(4) {
398
- animation-delay: calc(3 * var(--xh-motion-stagger-step));
510
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]):nth-last-child(4) {
511
+ --xh-_float-button-item-rank-back: 3;
399
512
  }
400
513
 
401
- [data-scope='float-button'][data-part='list'][data-state='closed'] > :not([data-xh-liquid-goo-split]):nth-last-child(n + 5) {
402
- animation-delay: calc(4 * var(--xh-motion-stagger-step));
514
+ [data-scope='float-button'][data-part='list'] > :not([data-xh-liquid-goo-split]):nth-last-child(n + 5) {
515
+ --xh-_float-button-item-rank-back: 4;
403
516
  }
404
517
 
405
518
  /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中。
package/css/form.css CHANGED
@@ -44,6 +44,14 @@
44
44
  flex-flow: row wrap;
45
45
  align-items: start;
46
46
  column-gap: var(--xh-form-inline-gap, var(--xh-space-4));
47
+ /* 一行流里字段按内容收,没有列宽可铺:在表单根上取下此处的字段缺省宽,交给下面的字段还原 */
48
+ --xh-_form-inline-control-w: var(--xh-control-w);
49
+ }
50
+
51
+ /* 字段会把里面的控件铺满字段宽,而一行流的字段宽正是由控件撑出来的,两者互相指望就塌成内容宽;
52
+ 这一档的字段还原成表单根上的缺省宽 */
53
+ [data-scope='form'][data-part='root'][data-layout='inline'] [data-scope='field'][data-part='root'] {
54
+ --xh-control-w: var(--xh-_form-inline-control-w);
47
55
  }
48
56
 
49
57
  /* 一列是网格档的缺省,这里从两列起逐档写 */
@@ -239,7 +247,7 @@
239
247
 
240
248
  /* 摘要显出时条目逐条入场,越靠后起步越晚。
241
249
  backwards 让还没轮到的条目停在首帧,不是先显出再重播 */
242
- [data-scope='form'][data-part='error-summary'][data-state='invalid'] [data-part='error-summary-item'] {
250
+ [data-scope='form'][data-part='error-summary'][data-state='invalid'] [data-part='error-summary-item']:where([data-scope='form']) {
243
251
  animation: xh-drop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
244
252
  }
245
253
 
@@ -248,14 +256,14 @@
248
256
  每多一节 ~ 就多要求前面多一条露面的条目,链越长的规则排得越后、赢过短链 */
249
257
  [data-scope='form'][data-part='error-summary'][data-state='invalid']
250
258
  [data-part='error-summary-item']:not([hidden])
251
- ~ [data-part='error-summary-item']:not([hidden]) {
259
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
252
260
  animation-delay: var(--xh-motion-stagger-step);
253
261
  }
254
262
 
255
263
  [data-scope='form'][data-part='error-summary'][data-state='invalid']
256
264
  [data-part='error-summary-item']:not([hidden])
257
265
  ~ [data-part='error-summary-item']:not([hidden])
258
- ~ [data-part='error-summary-item']:not([hidden]) {
266
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
259
267
  animation-delay: calc(var(--xh-motion-stagger-step) * 2);
260
268
  }
261
269
 
@@ -263,7 +271,7 @@
263
271
  [data-part='error-summary-item']:not([hidden])
264
272
  ~ [data-part='error-summary-item']:not([hidden])
265
273
  ~ [data-part='error-summary-item']:not([hidden])
266
- ~ [data-part='error-summary-item']:not([hidden]) {
274
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
267
275
  animation-delay: calc(var(--xh-motion-stagger-step) * 3);
268
276
  }
269
277
 
@@ -272,7 +280,7 @@
272
280
  ~ [data-part='error-summary-item']:not([hidden])
273
281
  ~ [data-part='error-summary-item']:not([hidden])
274
282
  ~ [data-part='error-summary-item']:not([hidden])
275
- ~ [data-part='error-summary-item']:not([hidden]) {
283
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
276
284
  animation-delay: calc(var(--xh-motion-stagger-step) * 4);
277
285
  }
278
286
 
@@ -284,7 +292,7 @@
284
292
  ~ [data-part='error-summary-item']:not([hidden])
285
293
  ~ [data-part='error-summary-item']:not([hidden])
286
294
  ~ [data-part='error-summary-item']:not([hidden])
287
- ~ [data-part='error-summary-item']:not([hidden]) {
295
+ ~ [data-part='error-summary-item']:where([data-scope='form']):not([hidden]) {
288
296
  animation-delay: calc(var(--xh-motion-stagger-step) * 5);
289
297
  }
290
298
 
@@ -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/highlight.css CHANGED
@@ -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
  }
package/css/image.css CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
  /* 占位层还在(正淡出)时图片不再自己淡入:它在占位层底下直接落位,由占位层的淡出揭开,
46
46
  模糊小图与图片交叉,不先透出一拍底色 */
47
- [data-scope='image'][data-part='root']:has(> [data-part='placeholder']:not([hidden])) > [data-part='image'] {
47
+ [data-scope='image'][data-part='root']:has(> [data-part='placeholder']:not([hidden])) > [data-part='image']:where([data-scope='image']) {
48
48
  animation: none;
49
49
  }
50
50
 
package/css/mention.css CHANGED
@@ -294,7 +294,7 @@
294
294
  标记读定位层那一份:候选被搬到 portal 落点,根上的只读标记够不着它们。
295
295
  排掉禁用条目是因为这条选择器权重高过上面那条,不排就会把 not-allowed 覆盖回 default */
296
296
  [data-scope='mention'][data-part='positioner'][data-readonly]
297
- [data-part='item']:not([data-disabled]) {
297
+ [data-part='item']:where([data-scope='mention']):not([data-disabled]) {
298
298
  cursor: default;
299
299
  }
300
300
 
@@ -112,7 +112,7 @@
112
112
 
113
113
  /* 新到的消息进场,同一批按到达顺序错开;首帧就在的历史消息直接呈现(自己或 list 带 data-instant)。
114
114
  进场只动 opacity 与 translate:改高度会扰动粘底补偿量到的 scrollHeight */
115
- [data-scope='message-feed'][data-part='item']:not([data-instant], [data-instant] > *) {
115
+ [data-scope='message-feed'][data-part='item']:not([data-instant], [data-instant] > :where([data-scope='message-feed'])) {
116
116
  animation: xh-item-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
117
117
  animation-delay: calc(var(--xh-_stagger-index, 0) * var(--xh-motion-stagger-step));
118
118
  }
@@ -153,7 +153,7 @@
153
153
  }
154
154
 
155
155
  [data-scope='notification'][data-part='group'][data-stacked][data-preset='toast'] {
156
- inline-size: min(var(--xh-notification-item-w, 28.75rem), calc(100vw - var(--xh-space-8)));
156
+ inline-size: min(var(--xh-notification-item-w, var(--xh-overlay-toast-w)), calc(100vw - var(--xh-space-8)));
157
157
  }
158
158
 
159
159
  [data-scope='notification'][data-part='group'][data-stacked][data-placement^='bottom'] {
@@ -262,7 +262,7 @@
262
262
  display: flex;
263
263
  align-items: flex-start;
264
264
  column-gap: var(--xh-notification-item-gap, var(--xh-space-2));
265
- inline-size: var(--xh-notification-item-w, 28.75rem);
265
+ inline-size: var(--xh-notification-item-w, var(--xh-overlay-toast-w));
266
266
  padding-block: var(--xh-notification-item-py, var(--xh-space-3));
267
267
  padding-inline: var(--xh-notification-item-px, var(--xh-space-4));
268
268
  font-size: var(--xh-notification-item-font-size, var(--xh-text-label-size));
@@ -447,7 +447,7 @@
447
447
  }
448
448
 
449
449
  /* 轻提示:方盒自带一圈内衬,与间距合起来让出字形到正文的那段距离 */
450
- [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-indicator'] {
450
+ [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-indicator']:where([data-scope='notification']) {
451
451
  flex: none;
452
452
  box-sizing: content-box;
453
453
  inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
@@ -484,17 +484,17 @@
484
484
  transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
485
485
  }
486
486
 
487
- [data-scope='notification'][data-part='item'][data-tone='success'] [data-part='item-indicator']:empty::after {
487
+ [data-scope='notification'][data-part='item'][data-tone='success'] [data-part='item-indicator']:where([data-scope='notification']):empty::after {
488
488
  -webkit-mask-image: var(--xh-glyph-mark-check);
489
489
  mask-image: var(--xh-glyph-mark-check);
490
490
  }
491
491
 
492
- [data-scope='notification'][data-part='item'][data-tone='warning'] [data-part='item-indicator']:empty::after {
492
+ [data-scope='notification'][data-part='item'][data-tone='warning'] [data-part='item-indicator']:where([data-scope='notification']):empty::after {
493
493
  -webkit-mask-image: var(--xh-glyph-mark-warning);
494
494
  mask-image: var(--xh-glyph-mark-warning);
495
495
  }
496
496
 
497
- [data-scope='notification'][data-part='item'][data-tone='danger'] [data-part='item-indicator']:empty::after {
497
+ [data-scope='notification'][data-part='item'][data-tone='danger'] [data-part='item-indicator']:where([data-scope='notification']):empty::after {
498
498
  -webkit-mask-image: var(--xh-glyph-mark-close);
499
499
  mask-image: var(--xh-glyph-mark-close);
500
500
  }
@@ -513,7 +513,7 @@
513
513
  min-inline-size: 0;
514
514
  }
515
515
 
516
- [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-content'] {
516
+ [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-content']:where([data-scope='notification']) {
517
517
  flex: 1 1 auto;
518
518
  align-self: center;
519
519
  row-gap: 0;
@@ -533,28 +533,34 @@
533
533
  }
534
534
 
535
535
  /* 轻提示的语气落到标题与行首字形:一句话的结果,颜色本身就是信息 */
536
- [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-title'] {
536
+ [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-title']:where([data-scope='notification']) {
537
537
  min-inline-size: 0;
538
538
  color: var(--xh-notification-title-fg, var(--xh-_tone-fg));
539
539
  }
540
540
 
541
541
  /* 卡片的叉钉在右上角,标题得给它让位;说明与操作在第二行往下,不受影响。
542
542
  让位量与叉的贴边取同一个值,作者改了贴边槽,标题让出的那段跟着走 */
543
- [data-scope='notification'][data-part='item'][data-preset='card']:has([data-part='item-close-trigger']) [data-part='item-title'] {
543
+ [data-scope='notification'][data-part='item'][data-preset='card']:has([data-part='item-close-trigger']) [data-part='item-title']:where([data-scope='notification']) {
544
544
  padding-inline-end: calc(
545
545
  var(--xh-notification-close-size, var(--xh-control-h-sm)) +
546
546
  var(--xh-notification-close-inset, var(--xh-surface-action-inset))
547
547
  );
548
548
  }
549
549
 
550
+ /* 正文有上限:推一段长文(公告全文)进来时卡片不被撑到整屏高——摞是整面视口的定位面、不吃指针也不裁切,
551
+ 撑出视口的那截既看不到也滚不到。超出的部分在正文自己里面滚,标题与操作钮留在卡片上;
552
+ 滚到头不把滚动量传给页面 */
550
553
  [data-scope='notification'][data-part='item-description'] {
551
554
  margin: 0;
555
+ max-block-size: var(--xh-notification-description-max-h, var(--xh-viewport-h-md));
556
+ overflow-y: auto;
557
+ overscroll-behavior: contain;
552
558
  color: var(--xh-notification-description-fg, var(--xh-fg-muted));
553
559
  font-size: var(--xh-notification-description-font-size, var(--xh-text-secondary-size));
554
560
  }
555
561
 
556
562
  /* 轻提示的说明只是一行短上下文,行高收紧到正文之下 */
557
- [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-description'] {
563
+ [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-description']:where([data-scope='notification']) {
558
564
  min-inline-size: 0;
559
565
  line-height: var(--xh-notification-description-leading, var(--xh-leading-normal));
560
566
  }
@@ -589,7 +595,7 @@
589
595
  }
590
596
 
591
597
  /* 卡片:横跨整张卡片的一行,它不是正文的一部分,不跟着第二列走;两端取胶囊 */
592
- [data-scope='notification'][data-part='item'][data-preset='card'] [data-part='item-progress'] {
598
+ [data-scope='notification'][data-part='item'][data-preset='card'] [data-part='item-progress']:where([data-scope='notification']) {
593
599
  --xh-_countdown-radius: var(--xh-notification-progress-radius, var(--xh-shape-pill));
594
600
 
595
601
  grid-column: 1 / -1;
@@ -597,7 +603,7 @@
597
603
  }
598
604
 
599
605
  /* 轻提示:贴着卡片底边走 */
600
- [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-progress'] {
606
+ [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-progress']:where([data-scope='notification']) {
601
607
  position: absolute;
602
608
  inset-block-end: 0;
603
609
  inset-inline-start: 0;
@@ -615,7 +621,7 @@
615
621
  animation-timing-function: steps(var(--xh-_notification-progress-steps, 1), end);
616
622
  }
617
623
 
618
- [data-scope='notification'][data-part='item'][data-paused] [data-part='item-progress'] {
624
+ [data-scope='notification'][data-part='item'][data-paused] [data-part='item-progress']:where([data-scope='notification']) {
619
625
  animation-play-state: paused;
620
626
  }
621
627
 
@@ -653,7 +659,7 @@
653
659
  }
654
660
 
655
661
  /* 轻提示是单行 flex,按钮不参与伸缩:文案长了该换行的是文字 */
656
- [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-action-trigger'] {
662
+ [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-action-trigger']:where([data-scope='notification']) {
657
663
  flex: none;
658
664
  align-self: center;
659
665
  }
@@ -686,14 +692,14 @@
686
692
  }
687
693
 
688
694
  /* 卡片:钉在右上角的内衬处,不参与网格排布——留在流里它会变成正文下面的第三行 */
689
- [data-scope='notification'][data-part='item'][data-preset='card'] [data-part='item-close-trigger'] {
695
+ [data-scope='notification'][data-part='item'][data-preset='card'] [data-part='item-close-trigger']:where([data-scope='notification']) {
690
696
  position: absolute;
691
697
  inset-block-start: var(--xh-notification-close-inset, var(--xh-surface-action-inset));
692
698
  inset-inline-end: var(--xh-notification-close-inset, var(--xh-surface-action-inset));
693
699
  }
694
700
 
695
701
  /* 轻提示:排在一行短消息的行尾,与文本列一起垂直居中 */
696
- [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-close-trigger'] {
702
+ [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-close-trigger']:where([data-scope='notification']) {
697
703
  flex: none;
698
704
  align-self: center;
699
705
  }
@@ -702,13 +708,13 @@
702
708
  hover-focus 显示策略:那一档用 visibility 收起,这颗叉占 Tab 位,收成 visibility: hidden
703
709
  后键盘就够不到它了;这里只压 opacity 与 pointer-events,焦点仍能落进来 */
704
710
  @media (hover: hover) {
705
- [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-close-trigger'] {
711
+ [data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-close-trigger']:where([data-scope='notification']) {
706
712
  opacity: 0;
707
713
  pointer-events: none;
708
714
  }
709
715
 
710
- [data-scope='notification'][data-part='item'][data-preset='toast']:hover [data-part='item-close-trigger'],
711
- [data-scope='notification'][data-part='item'][data-preset='toast']:focus-within [data-part='item-close-trigger'] {
716
+ [data-scope='notification'][data-part='item'][data-preset='toast']:hover [data-part='item-close-trigger']:where([data-scope='notification']),
717
+ [data-scope='notification'][data-part='item'][data-preset='toast']:focus-within [data-part='item-close-trigger']:where([data-scope='notification']) {
712
718
  opacity: 1;
713
719
  pointer-events: auto;
714
720
  }
@@ -716,7 +722,7 @@
716
722
 
717
723
  /* 收拢的后层只允许最前一条露出关闭入口;触屏没有 hover,必须显式收起后层的叉 */
718
724
  [data-scope='notification'][data-part='group'][data-stacked] [data-scope='notification'][data-part='item'][data-stack-index]:not([data-frontmost]):not([data-expanded])
719
- [data-part='item-close-trigger'] {
725
+ [data-part='item-close-trigger']:where([data-scope='notification']) {
720
726
  opacity: 0;
721
727
  pointer-events: none;
722
728
  }
@@ -121,7 +121,7 @@
121
121
  /* 盒内 input:无边框无底无圆角无落影由家族重置,观感全归 control。
122
122
  数字居中排在两个按钮之间,行内内衬留给它自己(control 不给内衬);
123
123
  前后缀图标/文字直接流式排在 input 两侧,不用再绝对定位 */
124
- [data-scope='number-field'][data-part='control'] [data-part='input'] {
124
+ [data-scope='number-field'][data-part='control'] [data-part='input']:where([data-scope='number-field']) {
125
125
  --xh-field-input-fg: var(--xh-number-field-input-fg, var(--xh-fg-default));
126
126
  --xh-field-input-font-size: var(--xh-number-field-input-font-size, var(--xh-_number-field-font-size));
127
127
  --xh-field-placeholder-fg: var(--xh-number-field-placeholder-fg, var(--xh-fg-subtle));
@@ -137,8 +137,8 @@
137
137
  /* 盒内按钮:正方视觉盒、inset 圆角、悬停 100 / 按下 200 与 0.97 按压、粗指针热区与
138
138
  :focus-visible 关环全由 Action Control 的 field-inset ghost 档给,组件只映射既有覆盖槽。
139
139
  常态只剩符号,符号取默认前景,悬停与按下才浮出底色 */
140
- [data-scope='number-field'][data-part='control'] [data-part='increment-trigger'],
141
- [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'] {
140
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']),
141
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']) {
142
142
  --xh-action-visual-size: var(--xh-number-field-trigger-size, var(--xh-_action-profile-visual-size));
143
143
  --xh-action-min-inline-size: var(--xh-number-field-trigger-size, var(--xh-_action-profile-visual-size));
144
144
  --xh-action-radius: var(--xh-number-field-trigger-radius, var(--xh-shape-inset));
@@ -159,16 +159,16 @@
159
159
  }
160
160
 
161
161
  /* DOM 顺序不承担视觉位置:既有用法即使把减钮写在 input 前面,默认仍统一收进右侧动作组。 */
162
- [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'] {
162
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']) {
163
163
  order: 1;
164
164
  }
165
165
 
166
- [data-scope='number-field'][data-part='control'] [data-part='increment-trigger'] {
166
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']) {
167
167
  order: 2;
168
168
  }
169
169
 
170
- [data-scope='number-field'][data-part='control'] [data-part='increment-trigger'][hidden],
171
- [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'][hidden] {
170
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger'][hidden]:where([data-scope='number-field']),
171
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'][hidden]:where([data-scope='number-field']) {
172
172
  display: none;
173
173
  }
174
174
 
@@ -177,7 +177,7 @@
177
177
  ::before 已被兜底字形占着,::after 在粗指针下是家族给的 44px 热区,几何只能落在
178
178
  background-image 上:一条 1px × 半高的渐变贴在逻辑起始侧,底色换态时它仍叠在上层。
179
179
  线只画在动作组第一颗减钮的逻辑起始侧;background-position 是物理轴,RTL 另给一条换边。 */
180
- [data-scope='number-field'][data-part='control']:has([data-part='input']) [data-part='decrement-trigger'] {
180
+ [data-scope='number-field'][data-part='control']:has([data-part='input']) [data-part='decrement-trigger']:where([data-scope='number-field']) {
181
181
  background-image: linear-gradient(
182
182
  var(--xh-number-field-trigger-divider, var(--xh-material-soft-separator)),
183
183
  var(--xh-number-field-trigger-divider, var(--xh-material-soft-separator))
@@ -187,12 +187,12 @@
187
187
  background-size: var(--xh-stroke-thin) var(--xh-number-field-trigger-divider-h, var(--xh-_number-field-divider-h));
188
188
  }
189
189
 
190
- [dir='rtl'] [data-scope='number-field'][data-part='control']:has([data-part='input']) [data-part='decrement-trigger'] {
190
+ [dir='rtl'] [data-scope='number-field'][data-part='control']:has([data-part='input']) [data-part='decrement-trigger']:where([data-scope='number-field']) {
191
191
  background-position: 100% 50%;
192
192
  }
193
193
 
194
194
  /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
195
- [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:empty::before {
195
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']):empty::before {
196
196
  content: '';
197
197
  display: inline-block;
198
198
  inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
@@ -203,7 +203,7 @@
203
203
  mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
204
204
  }
205
205
 
206
- [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:empty::before {
206
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']):empty::before {
207
207
  content: '';
208
208
  display: inline-block;
209
209
  inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
@@ -216,7 +216,7 @@
216
216
 
217
217
  /* 高对比档整层丢弃 background-image,分隔线改用系统色重画,并关掉这一颗钮的强制换色 */
218
218
  @media (forced-colors: active) {
219
- [data-scope='number-field'][data-part='control']:has([data-part='input']) [data-part='decrement-trigger'] {
219
+ [data-scope='number-field'][data-part='control']:has([data-part='input']) [data-part='decrement-trigger']:where([data-scope='number-field']) {
220
220
  background-image: linear-gradient(ButtonText, ButtonText);
221
221
  forced-color-adjust: none;
222
222
  }
@@ -233,19 +233,19 @@
233
233
  字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
234
234
  按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
235
235
  禁用取 GrayText */
236
- [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:empty::before,
237
- [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:empty::before {
236
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']):empty::before,
237
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']):empty::before {
238
238
  forced-color-adjust: none;
239
239
  background-color: ButtonText;
240
240
  }
241
241
 
242
- [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before,
243
- [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
242
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before,
243
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
244
244
  background-color: HighlightText;
245
245
  }
246
246
 
247
- [data-scope='number-field'][data-part='control'] [data-part='increment-trigger'][data-disabled]:empty::before,
248
- [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'][data-disabled]:empty::before {
247
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger'][data-disabled]:where([data-scope='number-field']):empty::before,
248
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'][data-disabled]:where([data-scope='number-field']):empty::before {
249
249
  background-color: GrayText;
250
250
  }
251
251
  }