@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
@@ -149,7 +149,7 @@
149
149
  }
150
150
 
151
151
  [data-scope='page-header'][data-part='root']:has(> [data-part='description'])
152
- > :is([data-part='back-trigger'], [data-part='media'], [data-part='extra']) {
152
+ > :is([data-part='back-trigger'], [data-part='media'], [data-part='extra']):where([data-scope='page-header']) {
153
153
  grid-row: span 2;
154
154
  }
155
155
 
@@ -166,7 +166,7 @@
166
166
  grid-column: 2;
167
167
  }
168
168
 
169
- [data-scope='page-header'][data-part='root'] > [data-part='extra'] {
169
+ [data-scope='page-header'][data-part='root'] > [data-part='extra']:where([data-scope='page-header']) {
170
170
  grid-column: 1 / -1;
171
171
  grid-row: auto;
172
172
  margin-inline-start: 0;
@@ -202,7 +202,7 @@
202
202
  分不出焦点在框里还是在钮上,所以钮上再画一圈自己的环(家族只对不占 Tab 位的内嵌钮关环)。
203
203
  环往内收,压在按钮自己的方框里,不与盒子外面那一圈叠在一起。
204
204
  指示焦点只能用环不能用底色:可用的几档底色压在盒底上都到不了 3:1,换了色也等于没画 */
205
- [data-scope='password-input'][data-part='control'] [data-part='visibility-trigger']:focus-visible {
205
+ [data-scope='password-input'][data-part='control'] [data-part='visibility-trigger']:where([data-scope='password-input']):focus-visible {
206
206
  outline: var(--xh-ring-width) solid var(--xh-_password-input-ring);
207
207
  outline-offset: var(--xh-ring-offset);
208
208
  }
@@ -357,7 +357,7 @@
357
357
 
358
358
  /* 关掉强制换色后,上面那圈自留的 :focus-visible 环与家族普通态的焦点底/字都会按作者色落地;
359
359
  家族高对比块的特指度压不过它们,这里用同一选择器把环、底、字改回系统色 */
360
- [data-scope='password-input'][data-part='control'] [data-part='visibility-trigger']:focus-visible {
360
+ [data-scope='password-input'][data-part='control'] [data-part='visibility-trigger']:where([data-scope='password-input']):focus-visible {
361
361
  outline-color: Highlight;
362
362
  background-color: ButtonFace;
363
363
  color: ButtonText;
@@ -145,7 +145,7 @@
145
145
  }
146
146
 
147
147
  /* 箭头绝对定位挂在 content 上,不占格:吃到栅格位的话它的贴边就从格线起算,被内衬推进面里 */
148
- [data-scope='popconfirm'][data-part='content'] > [data-part='arrow'] {
148
+ [data-scope='popconfirm'][data-part='content'] > [data-part='arrow']:where([data-scope='popconfirm']) {
149
149
  grid-column: auto;
150
150
  }
151
151
 
@@ -234,11 +234,11 @@
234
234
  }
235
235
 
236
236
  /* 并排落在最后一行的右侧两格;取消在左、确认在右 */
237
- [data-scope='popconfirm'][data-part='content'] > [data-part='cancel-trigger'] {
237
+ [data-scope='popconfirm'][data-part='content'] > [data-part='cancel-trigger']:where([data-scope='popconfirm']) {
238
238
  grid-column: 2;
239
239
  }
240
240
 
241
- [data-scope='popconfirm'][data-part='content'] > [data-part='confirm-trigger'] {
241
+ [data-scope='popconfirm'][data-part='content'] > [data-part='confirm-trigger']:where([data-scope='popconfirm']) {
242
242
  grid-column: 3;
243
243
  }
244
244
 
@@ -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
 
@@ -504,7 +504,7 @@
504
504
  }
505
505
 
506
506
  /* 落定结果弹出;落在首帧就在的列表条目里(历史消息)时直接呈现,不跟着整屏一起入场 */
507
- [data-scope='question-flow'][data-part='result']:not([data-scope][data-part='item'][data-instant] *) {
507
+ [data-scope='question-flow'][data-part='result']:not([data-scope][data-part='item'][data-instant] :where([data-scope='question-flow'])) {
508
508
  animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
509
509
  }
510
510
 
@@ -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
  }
package/css/rating.css CHANGED
@@ -78,7 +78,7 @@
78
78
  justify-content: start;
79
79
  }
80
80
 
81
- [data-scope='rating'][data-part='root']:has(> [data-part='value-text']) > [data-part='label'] {
81
+ [data-scope='rating'][data-part='root']:has(> [data-part='value-text']) > [data-part='label']:where([data-scope='rating']) {
82
82
  grid-column: 1 / -1;
83
83
  }
84
84
 
package/css/select.css CHANGED
@@ -224,7 +224,7 @@
224
224
 
225
225
  /* 标签行露面时 value-text 让位:两者是触发器里的同一格,占位文字与标签不同屏。
226
226
  value-text 留在 DOM 里,trigger 的可及名仍从它取到完整的选中项文本 */
227
- [data-scope='select'][data-part='trigger']:has([data-part='tag-list']:not([hidden])) [data-part='value-text'] {
227
+ [data-scope='select'][data-part='trigger']:has([data-part='tag-list']:not([hidden])) [data-part='value-text']:where([data-scope='select']) {
228
228
  display: none;
229
229
  }
230
230
 
@@ -256,7 +256,7 @@
256
256
  /* 有值时清空钮顶上来,箭头让位:两个图标并排堆着,用户分不清点哪个。
257
257
  判据查的是盒里此刻真有一颗没收起的清空钮,不是「有没有值」——
258
258
  作者没摆清空钮时箭头照常留着,不然让了位没人接,指示符整个消失 */
259
- [data-scope='select'][data-part='control']:has([data-part='clear-trigger']:not([hidden])) [data-part='indicator'] {
259
+ [data-scope='select'][data-part='control']:has([data-part='clear-trigger']:not([hidden])) [data-part='indicator']:where([data-scope='select']) {
260
260
  display: none;
261
261
  }
262
262
 
package/css/separator.css CHANGED
@@ -109,8 +109,8 @@
109
109
  }
110
110
 
111
111
  /* 文字靠边:靠哪边就把那一侧的线收成一小截,另一侧照旧等分 */
112
- [data-scope='separator'][data-part='root'][data-align='start'] > [data-part='line']:first-child,
113
- [data-scope='separator'][data-part='root'][data-align='end'] > [data-part='line']:last-child {
112
+ [data-scope='separator'][data-part='root'][data-align='start'] > [data-part='line']:where([data-scope='separator']):first-child,
113
+ [data-scope='separator'][data-part='root'][data-align='end'] > [data-part='line']:where([data-scope='separator']):last-child {
114
114
  flex: 0 0 var(--xh-separator-align-length, var(--xh-space-6));
115
115
  }
116
116
 
package/css/side-nav.css CHANGED
@@ -112,11 +112,11 @@
112
112
 
113
113
  /* 折叠一开始搜索框就与行文字一起淡出,展开等整栏宽度落定才淡入;落成图标栏之后让位:
114
114
  留着高度、不可见也不可聚焦(过滤此时暂停),下面的行不上下跳 */
115
- [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='input'] {
115
+ [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='input']:where([data-scope='side-nav']) {
116
116
  opacity: 0;
117
117
  }
118
118
 
119
- [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='input'] {
119
+ [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='input']:where([data-scope='side-nav']) {
120
120
  visibility: hidden;
121
121
  }
122
122
 
@@ -171,13 +171,13 @@
171
171
 
172
172
  /* 图标栏里分组标题没有落点:字淡成透明、仍参与播报,标题留着自己的高度,下面的行不上下跳;
173
173
  折叠一开始就淡出,展开等整栏宽度落定才淡入。落成图标栏之后在这一格里画一道细分隔,分组仍看得出来 */
174
- [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='group-label'] {
174
+ [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='group-label']:where([data-scope='side-nav']) {
175
175
  overflow: hidden;
176
176
  color: transparent;
177
177
  white-space: nowrap;
178
178
  }
179
179
 
180
- [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='group-label']::after {
180
+ [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='group-label']:where([data-scope='side-nav'])::after {
181
181
  content: '';
182
182
  position: absolute;
183
183
  inset-inline: var(--xh-_side-nav-row-px);
@@ -275,9 +275,9 @@
275
275
 
276
276
  /* 行文字与展开箭头的淡变:折叠一开始就淡出,此时仍在行里、由收窄的行宽裁着;展开时等整栏宽度落定才淡入。
277
277
  弹出面板里的行不在此列 */
278
- [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='branch-text']:not([data-popout] *),
279
- [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='link-text']:not([data-popout] *),
280
- [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='branch-indicator']:not([data-popout] *) {
278
+ [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='branch-text']:where([data-scope='side-nav']):not([data-popout] :where([data-scope='side-nav'])),
279
+ [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='link-text']:where([data-scope='side-nav']):not([data-popout] :where([data-scope='side-nav'])),
280
+ [data-scope='side-nav'][data-part='root']:is([data-collapsed], [data-animating]) [data-part='branch-indicator']:where([data-scope='side-nav']):not([data-popout] :where([data-scope='side-nav'])) {
281
281
  opacity: 0;
282
282
  }
283
283
 
@@ -286,8 +286,8 @@
286
286
  藏成 display:none 它们就一个名字都没有了。
287
287
  white-space: nowrap 防止 1px 宽把文本挤成竖排。
288
288
  弹出面板里的行不在此列——面板是正常宽度的浮层,文字照常显示 */
289
- [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='branch-text']:not([data-popout] *),
290
- [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='link-text']:not([data-popout] *) {
289
+ [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='branch-text']:where([data-scope='side-nav']):not([data-popout] :where([data-scope='side-nav'])),
290
+ [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='link-text']:where([data-scope='side-nav']):not([data-popout] :where([data-scope='side-nav'])) {
291
291
  position: absolute;
292
292
  inline-size: 1px;
293
293
  block-size: 1px;
@@ -300,12 +300,12 @@
300
300
  }
301
301
 
302
302
  /* 展开指示是纯装饰(aria-hidden),落成图标栏之后整个不占位 */
303
- [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='branch-indicator']:not([data-popout] *) {
303
+ [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='branch-indicator']:where([data-scope='side-nav']):not([data-popout] :where([data-scope='side-nav'])) {
304
304
  display: none;
305
305
  }
306
306
 
307
- [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='branch-trigger']:not([data-popout] *),
308
- [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='link']:not([data-popout] *) {
307
+ [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='branch-trigger']:where([data-scope='side-nav']):not([data-popout] :where([data-scope='side-nav'])),
308
+ [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='link']:where([data-scope='side-nav']):not([data-popout] :where([data-scope='side-nav'])) {
309
309
  --xh-collection-inline-padding: 0;
310
310
 
311
311
  justify-content: center;
@@ -441,7 +441,7 @@
441
441
 
442
442
  @media (forced-colors: active) {
443
443
  /* 图标栏里分组之间那道细分隔画的是一块底色,这一档里底色被统一换成 Canvas、整道消失;换成 GrayText 画回来 */
444
- [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='group-label']::after {
444
+ [data-scope='side-nav'][data-part='root'][data-collapsed]:not([data-animating]) [data-part='group-label']:where([data-scope='side-nav'])::after {
445
445
  background: GrayText;
446
446
  }
447
447
  }
package/css/skeleton.css CHANGED
@@ -90,13 +90,13 @@
90
90
  * 微光扫的是一道亮带,呼吸改的是整根的浓淡——两者都表达"还在等",
91
91
  * 换哪一档由作者定,缺省仍是微光。
92
92
  */
93
- [data-scope='skeleton'][data-part='root'][data-animation='pulse'] [data-part='item'] {
93
+ [data-scope='skeleton'][data-part='root'][data-animation='pulse'] [data-part='item']:where([data-scope='skeleton']) {
94
94
  background-image: none;
95
95
  animation: xh-skeleton-pulse var(--xh-skeleton-pulse-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-sweep) infinite alternate;
96
96
  }
97
97
 
98
98
  /* 静止档:底色留着,两层动效都撤掉 */
99
- [data-scope='skeleton'][data-part='root'][data-animation='none'] [data-part='item'] {
99
+ [data-scope='skeleton'][data-part='root'][data-animation='none'] [data-part='item']:where([data-scope='skeleton']) {
100
100
  background-image: none;
101
101
  animation: none;
102
102
  }
@@ -104,17 +104,17 @@
104
104
  /* 呼吸档自带一条动画,压不住下面基础降级里的 animation: none,这一档各自再写一份。
105
105
  两组规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
106
106
  @media (prefers-reduced-motion: reduce) {
107
- [data-scope='skeleton'][data-part='root'][data-animation='pulse'] [data-part='item'] {
107
+ [data-scope='skeleton'][data-part='root'][data-animation='pulse'] [data-part='item']:where([data-scope='skeleton']) {
108
108
  animation: none;
109
109
  }
110
110
  }
111
111
 
112
- :where([data-motion='reduce']) [data-scope='skeleton'][data-part='root'][data-animation='pulse'] [data-part='item'] {
112
+ :where([data-motion='reduce']) [data-scope='skeleton'][data-part='root'][data-animation='pulse'] [data-part='item']:where([data-scope='skeleton']) {
113
113
  animation: none;
114
114
  }
115
115
 
116
116
  @media print {
117
- [data-scope='skeleton'][data-part='root'][data-animation='pulse'] [data-part='item'] {
117
+ [data-scope='skeleton'][data-part='root'][data-animation='pulse'] [data-part='item']:where([data-scope='skeleton']) {
118
118
  animation: none;
119
119
  }
120
120
  }
package/css/slider.css CHANGED
@@ -64,7 +64,7 @@
64
64
  排了刻度文案的横轨两侧各让出一段,那半个文案落进让出来的这一段里。
65
65
  让在控件上而不是根上:轨道、刻度、拇指的坐标都以控件为基准,一起让开才不会彼此错位。 */
66
66
  [data-scope='slider'][data-part='root']:has([data-part='tick-label'])
67
- [data-part='control'][data-orientation='horizontal'] {
67
+ [data-part='control'][data-orientation='horizontal']:where([data-scope='slider']) {
68
68
  margin-inline: var(--xh-slider-control-gutter, var(--xh-space-6));
69
69
  }
70
70
 
@@ -335,27 +335,27 @@
335
335
 
336
336
  /* 禁用:刻度点与文案由 tick-group 上的 data-disabled 下发(连接层不给每个刻度单发),
337
337
  已过的刻度点与区间同色,文案换禁用前景,点它跳档的手型收掉 */
338
- [data-scope='slider'][data-part='tick-group'][data-disabled] [data-part='tick'] {
338
+ [data-scope='slider'][data-part='tick-group'][data-disabled] [data-part='tick']:where([data-scope='slider']) {
339
339
  background: var(--xh-slider-tick-bg-disabled, var(--xh-border-default));
340
340
  }
341
341
 
342
- [data-scope='slider'][data-part='tick-group'][data-disabled] [data-part='tick'][data-passed] {
342
+ [data-scope='slider'][data-part='tick-group'][data-disabled] [data-part='tick'][data-passed]:where([data-scope='slider']) {
343
343
  background: var(--xh-slider-tick-bg-active-disabled, var(--xh-fg-disabled));
344
344
  }
345
345
 
346
- [data-scope='slider'][data-part='tick-group'][data-disabled] [data-part='tick-label'] {
346
+ [data-scope='slider'][data-part='tick-group'][data-disabled] [data-part='tick-label']:where([data-scope='slider']) {
347
347
  color: var(--xh-slider-tick-label-fg-disabled, var(--xh-fg-disabled));
348
348
  cursor: not-allowed;
349
349
  }
350
350
 
351
351
  /* 竖直轨道:点与文案换轴,坐标由连接层写在 block 轴上 */
352
- [data-scope='slider'][data-part='root'][data-orientation='vertical'] [data-part='tick'] {
352
+ [data-scope='slider'][data-part='root'][data-orientation='vertical'] [data-part='tick']:where([data-scope='slider']) {
353
353
  inset-block-start: auto;
354
354
  inset-inline-start: 50%;
355
355
  translate: calc(-50% * var(--xh-direction-sign)) 50%;
356
356
  }
357
357
 
358
- [data-scope='slider'][data-part='root'][data-orientation='vertical'] [data-part='tick-label'] {
358
+ [data-scope='slider'][data-part='root'][data-orientation='vertical'] [data-part='tick-label']:where([data-scope='slider']) {
359
359
  inset-block-start: auto;
360
360
  inset-inline-start: 100%;
361
361
  margin-block-start: 0;
package/css/sortable.css CHANGED
@@ -50,7 +50,7 @@
50
50
  其余项反过来要过渡:它们是被让开的,瞬移会看不出发生了什么。
51
51
  键盘拖动时被拖那一项不跟手、逐格挪,与让位的邻项同一段一起滑;抓起时的抬升照常淡变。
52
52
  同组别的列表的一项悬在这里(data-drop='inside')时,插入点及其后的项同样是被让开的 */
53
- [data-scope='sortable'][data-part='root']:is([data-dragging], [data-drop='inside']) [data-part='item']:not([data-dragging]) {
53
+ [data-scope='sortable'][data-part='root']:is([data-dragging], [data-drop='inside']) [data-part='item']:where([data-scope='sortable']):not([data-dragging]) {
54
54
  transition: translate var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous);
55
55
  }
56
56
 
@@ -62,7 +62,7 @@
62
62
  flex: 0 0 var(--xh-_sortable-incoming-size);
63
63
  }
64
64
 
65
- [data-scope='sortable'][data-part='root'][data-drag-mode='keyboard'] [data-part='item'][data-dragging] {
65
+ [data-scope='sortable'][data-part='root'][data-drag-mode='keyboard'] [data-part='item'][data-dragging]:where([data-scope='sortable']) {
66
66
  transition:
67
67
  translate var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous),
68
68
  box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
package/css/table.css CHANGED
@@ -307,6 +307,23 @@
307
307
  user-select: none;
308
308
  }
309
309
 
310
+ /* 列对齐:data-align 控制列头与数据格的文本与内容对齐方向;
311
+ 显式写出三档以便 start 能重置自定义皮肤里可能存在的非默认对齐 */
312
+ [data-scope='table']:is([data-part='column-header'], [data-part='cell'])[data-align='start'] {
313
+ text-align: start;
314
+ justify-content: start;
315
+ }
316
+
317
+ [data-scope='table']:is([data-part='column-header'], [data-part='cell'])[data-align='center'] {
318
+ text-align: center;
319
+ justify-content: center;
320
+ }
321
+
322
+ [data-scope='table']:is([data-part='column-header'], [data-part='cell'])[data-align='end'] {
323
+ text-align: end;
324
+ justify-content: end;
325
+ }
326
+
310
327
  /* 列名是列头里唯一可收窄的一格:flex: 1 吃掉余量、把排序钮 / 列宽把手推到行尾,min-inline-size: 0 让它在
311
328
  窄列上收得下去并出省略号。列名不能裸写成文本节点:flex 行里的裸文本是匿名 flex item,min-inline-size 取 auto
312
329
  (nowrap 文本的 min-content)缩不下去,96px 的列配一串长列名时定尺的把手连同 auto 外边距一起被挤出列头盒、
@@ -402,8 +419,8 @@
402
419
  }
403
420
 
404
421
  /* root 恒报两端(没有冻结列时两端都算贴着);虚拟滚动的行隔着视口,按后代认 */
405
- [data-scope='table'][data-part='root']:not([data-at-min-horizontal]) :is([data-part='column-header'], [data-part='cell'])[data-frozen-edge][data-frozen='start']::after,
406
- [data-scope='table'][data-part='root']:not([data-at-max-horizontal]) :is([data-part='column-header'], [data-part='cell'])[data-frozen-edge][data-frozen='end']::after {
422
+ [data-scope='table'][data-part='root']:not([data-at-min-horizontal]) :is([data-part='column-header'], [data-part='cell']):where([data-scope='table'])[data-frozen-edge][data-frozen='start']::after,
423
+ [data-scope='table'][data-part='root']:not([data-at-max-horizontal]) :is([data-part='column-header'], [data-part='cell']):where([data-scope='table'])[data-frozen-edge][data-frozen='end']::after {
407
424
  opacity: 1;
408
425
  }
409
426
 
@@ -161,7 +161,7 @@
161
161
 
162
162
  /* 新落下的标签原地弹出,同一批按到达顺序错开;首帧就在的直接呈现(自己或 control 带 data-instant)。
163
163
  横排胶囊不用竖向上浮:与来源方向不符,还会探出字段外壳的底边 */
164
- [data-scope='tags-input'][data-part='item']:not([data-instant], [data-instant] > *) {
164
+ [data-scope='tags-input'][data-part='item']:not([data-instant], [data-instant] > :where([data-scope='tags-input'])) {
165
165
  animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
166
166
  animation-delay: calc(var(--xh-_stagger-index, 0) * var(--xh-motion-stagger-step));
167
167
  }
@@ -12,6 +12,7 @@
12
12
 
13
13
  /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
14
14
  @import '../family/motion.css';
15
+ @import '../family/tag-list.css';
15
16
 
16
17
  @layer xihan.components {
17
18
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
@@ -176,6 +177,27 @@
176
177
  display: none;
177
178
  }
178
179
 
180
+ /* 多选的标签行:段位让位,选中的时刻在盒里排成标签,超过 maxTagCount 的折进 +N。
181
+ 行里每一枚都是 tag(data-scope="tag"),样子归 tag.css;行怎么排、标签怎么进出归标签行家族配方。
182
+ 基准取 0:只吃两颗钮剩下的宽度、在自己里面折行;按内容宽算基准的话,盒子会先在钮前面折行,把钮挤到最后一行 */
183
+ [data-scope='time-picker'][data-part='tag-list'] {
184
+ --xh-tag-list-gap: var(--xh-time-picker-tag-list-gap, var(--xh-space-1));
185
+
186
+ flex: 1 1 0;
187
+ flex-wrap: wrap;
188
+ }
189
+
190
+ /* 时刻标签是定长文字,截短了就读不出是几点:不收缩,排不下就折到下一行(与标签输入同一种排法),
191
+ 盒随行数长高(字段家族的 multi-tag 布局给),到上限后在盒内滚动 */
192
+ [data-scope='time-picker'][data-part='tag-list'] > [data-scope='tag'][data-part='root'] {
193
+ flex: none;
194
+ }
195
+
196
+ [data-scope='time-picker'][data-part='control'][data-xh-field-layout='multi-tag'] {
197
+ max-block-size: var(--xh-time-picker-control-max-h, var(--xh-viewport-h-sm));
198
+ overflow-y: auto;
199
+ }
200
+
179
201
  [data-scope='time-picker'][data-part='segment-group'] > :not([data-scope]) {
180
202
  color: var(--xh-time-picker-literal-fg, var(--xh-fg-subtle));
181
203
  }
@@ -281,10 +303,11 @@
281
303
  --xh-action-fg-rest: var(--xh-time-picker-action-fg-hover, var(--xh-fg-default));
282
304
  }
283
305
 
284
- /* 有值时清空钮顶上来,展开钮让位:两颗并排堆着用户分不清点哪个 */
306
+ /* 有值时清空钮顶上来,展开钮让位:两颗并排堆着用户分不清点哪个。
307
+ 多选不让位:段位收起后展开钮是唯一的键盘入口(退格摘标签也在它身上),藏了键盘就进不来 */
285
308
  [data-scope='time-picker'][data-part='control']:has(
286
309
  > [data-scope='time-picker'][data-part='clear-trigger']:not([hidden])
287
- )
310
+ ):not(:has(> [data-scope='time-picker'][data-part='tag-list']:not([hidden])))
288
311
  > [data-scope='time-picker'][data-part='trigger'] {
289
312
  display: none;
290
313
  }
@@ -334,6 +357,40 @@
334
357
  animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
335
358
  }
336
359
 
360
+ /* 「添加」沉到各列的右下角:它是多选时整块面板的出口,不跟列顶对齐 */
361
+ [data-scope='time-picker'][data-part='content'] > [data-scope='time-picker'][data-part='confirm-trigger'] {
362
+ flex: none;
363
+ align-self: flex-end;
364
+ margin-inline-start: var(--xh-time-picker-confirm-trigger-gap, var(--xh-space-1));
365
+ }
366
+
367
+ /* 「添加」是面板里唯一的主要动作:品牌实心、悬停 / 按下与 0.97 按压、焦点环全由 Action Control 的
368
+ text solid 档给;槽名统一按部件取 --xh-time-picker-confirm-trigger-*,只映射到家族桥接槽 */
369
+ [data-scope='time-picker'][data-part='confirm-trigger'] {
370
+ --xh-action-visual-size: var(--xh-time-picker-confirm-trigger-h, var(--xh-_action-profile-visual-size));
371
+ --xh-action-padding-inline: var(--xh-time-picker-confirm-trigger-px, var(--xh-_action-profile-padding-inline));
372
+ --xh-action-radius: var(--xh-time-picker-confirm-trigger-radius, var(--xh-shape-control));
373
+ --xh-action-bg-rest: var(--xh-time-picker-confirm-trigger-bg, var(--xh-_action-variant-bg-rest));
374
+ --xh-action-bg-hover: var(--xh-time-picker-confirm-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
375
+ --xh-action-bg-pressed: var(--xh-time-picker-confirm-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
376
+ --xh-action-fg-rest: var(--xh-time-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-rest));
377
+ --xh-action-fg-hover: var(--xh-time-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-hover));
378
+ --xh-action-fg-pressed: var(--xh-time-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-pressed));
379
+ --xh-action-border-rest: transparent;
380
+ --xh-action-highlight-rest: transparent;
381
+ --xh-action-shadow-rest: var(--xh-time-picker-confirm-trigger-shadow, none);
382
+ --xh-action-shadow-hover: var(--xh-time-picker-confirm-trigger-shadow, none);
383
+ --xh-action-shadow-pressed: var(--xh-time-picker-confirm-trigger-shadow, none);
384
+ --xh-action-font-size: var(--xh-text-secondary-size);
385
+
386
+ border-width: 0;
387
+ }
388
+
389
+ /* 单选时连接层给的是 hidden 属性;家族那条 display 会把 UA 规则盖掉 */
390
+ [data-scope='time-picker'][data-part='confirm-trigger'][hidden] {
391
+ display: none;
392
+ }
393
+
337
394
  /* 快捷选项也是一列,与时分秒那几列并排,排在行内起始一侧 */
338
395
  [data-scope='time-picker'][data-part='preset-group'] {
339
396
  display: flex;
package/css/tool-call.css CHANGED
@@ -41,7 +41,7 @@
41
41
  }
42
42
 
43
43
  /* 卡片出现时滑入;落在首帧就在的列表条目里(历史消息)时直接呈现,不跟着整屏一起入场 */
44
- [data-scope='tool-call'][data-part='root']:not([data-scope][data-part='item'][data-instant] *) {
44
+ [data-scope='tool-call'][data-part='root']:not([data-scope][data-part='item'][data-instant] :where([data-scope='tool-call'])) {
45
45
  animation: xh-item-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) both;
46
46
  }
47
47
 
@@ -174,7 +174,7 @@
174
174
  }
175
175
 
176
176
  /* 有摘要时把剩余宽度让给它:工具名只要放得下自己,摘要才是这一行里最想读到的东西 */
177
- [data-scope='tool-call'][data-part='trigger']:has([data-part='summary']) [data-part='label'] {
177
+ [data-scope='tool-call'][data-part='trigger']:has([data-part='summary']) [data-part='label']:where([data-scope='tool-call']) {
178
178
  flex: 0 1 auto;
179
179
  }
180
180
 
@@ -241,7 +241,7 @@
241
241
  /* 在跑的时候状态文字自己扫一道光:data-loading 此前在皮肤里没有任何表达,
242
242
  参数在传与参数齐了两档在屏幕上一模一样。
243
243
  渐变画在背景上再裁进字形,前景与 WebKit 的字形填充色都要透明才透得出底下那道光 */
244
- [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status'] {
244
+ [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status']:where([data-scope='tool-call']) {
245
245
  background-image: linear-gradient(
246
246
  90deg,
247
247
  var(--xh-tool-call-status-shimmer-base, var(--xh-fg-subtle)) 35%,
@@ -259,7 +259,7 @@
259
259
  /* 减少动效:整道光撤掉换回平色,"在跑"仍由状态文字本身表达——只停动画的话,
260
260
  字形里会留着一段冻住的渐变。两条规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
261
261
  @media (prefers-reduced-motion: reduce) {
262
- [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status'] {
262
+ [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status']:where([data-scope='tool-call']) {
263
263
  background-image: none;
264
264
  color: var(--xh-tool-call-status-fg, var(--xh-fg-muted));
265
265
  -webkit-text-fill-color: currentColor;
@@ -267,7 +267,7 @@
267
267
  }
268
268
  }
269
269
 
270
- :where([data-motion='reduce']) [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status'] {
270
+ :where([data-motion='reduce']) [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status']:where([data-scope='tool-call']) {
271
271
  background-image: none;
272
272
  color: var(--xh-tool-call-status-fg, var(--xh-fg-muted));
273
273
  -webkit-text-fill-color: currentColor;
@@ -404,7 +404,7 @@
404
404
  取值与减弱动效那一档相同。两档各写一块、不并进一条媒体查询列表:减弱动效另有一份
405
405
  :where([data-motion='reduce']) 的钩子版本与它成对,打印没有对应的钩子可配,
406
406
  并成一条之后这层配对关系在文本上就断了。 */
407
- [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status'] {
407
+ [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status']:where([data-scope='tool-call']) {
408
408
  background-image: none;
409
409
  color: var(--xh-tool-call-status-fg, var(--xh-fg-muted));
410
410
  -webkit-text-fill-color: currentColor;
@@ -417,7 +417,7 @@
417
417
  * 把两处填充都还回去,在跑这件事仍由状态文字本身表出。
418
418
  */
419
419
  @media (forced-colors: active) {
420
- [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status'] {
420
+ [data-scope='tool-call'][data-part='root'][data-loading] [data-part='status']:where([data-scope='tool-call']) {
421
421
  background-image: none;
422
422
  -webkit-background-clip: border-box;
423
423
  background-clip: border-box;
package/css/tooltip.css CHANGED
@@ -181,7 +181,7 @@
181
181
  }
182
182
 
183
183
  /* 高对比仍保持反白语义:compact 配方已把 tint / blur / shadow 换成实体档,此处只加强同色边界。 */
184
- :is([data-contrast='more'] *, [data-contrast='more'])[data-scope='tooltip'][data-part='content'] {
184
+ :is([data-contrast='more'] :where([data-scope='tooltip']), [data-contrast='more'])[data-scope='tooltip'][data-part='content'] {
185
185
  --xh-_tooltip-border: var(--xh-_tooltip-on);
186
186
  }
187
187
 
@@ -227,14 +227,14 @@
227
227
 
228
228
  /* 标签行露面时 value-text 让位:两者是触发器里的同一格,占位文字与标签不同屏。
229
229
  value-text 留在 DOM 里,trigger 的可及名仍从它取到完整的选中项文本 */
230
- [data-scope='tree-select'][data-part='trigger']:has([data-part='tag-list']:not([hidden])) [data-part='value-text'] {
230
+ [data-scope='tree-select'][data-part='trigger']:has([data-part='tag-list']:not([hidden])) [data-part='value-text']:where([data-scope='tree-select']) {
231
231
  display: none;
232
232
  }
233
233
 
234
234
  /* 有值时清空钮顶上来,箭头让位:两个图标并排堆着,用户分不清点哪个。
235
235
  判据查的是盒里此刻真有一颗没收起的清空钮,不是「有没有值」——
236
236
  作者没摆清空钮时箭头照常留着,不然让了位没人接,指示符整个消失 */
237
- [data-scope='tree-select'][data-part='control']:has([data-part='clear-trigger']:not([hidden])) [data-part='indicator'] {
237
+ [data-scope='tree-select'][data-part='control']:has([data-part='clear-trigger']:not([hidden])) [data-part='indicator']:where([data-scope='tree-select']) {
238
238
  display: none;
239
239
  }
240
240