@xihan-ui/styles 3.1.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 (216) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/component-tokens.d.ts +1 -0
  3. package/components.tokens.json +32 -2
  4. package/css/alert.css +2 -2
  5. package/css/approval.css +4 -4
  6. package/css/button.css +9 -5
  7. package/css/calendar-picker.css +3 -3
  8. package/css/calendar-range-picker.css +7 -7
  9. package/css/carousel.css +45 -13
  10. package/css/cartesian-chart.css +11 -11
  11. package/css/cascader.css +10 -10
  12. package/css/citation.css +2 -2
  13. package/css/code-view.css +6 -6
  14. package/css/color-swatch-picker.css +9 -4
  15. package/css/combobox.css +12 -4
  16. package/css/command.css +1 -1
  17. package/css/date-field.css +8 -2
  18. package/css/date-picker.css +13 -7
  19. package/css/date-range-picker.css +13 -7
  20. package/css/diff-view.css +8 -8
  21. package/css/field-array.css +1 -1
  22. package/css/file-upload.css +1 -1
  23. package/css/float-button.css +42 -27
  24. package/css/form.css +6 -6
  25. package/css/graph-chart.css +2 -2
  26. package/css/highlight.css +1 -1
  27. package/css/image.css +1 -1
  28. package/css/mention.css +1 -1
  29. package/css/message-feed.css +1 -1
  30. package/css/notification.css +18 -18
  31. package/css/number-field.css +18 -18
  32. package/css/page-header.css +2 -2
  33. package/css/password-input.css +2 -2
  34. package/css/popconfirm.css +3 -3
  35. package/css/question-flow.css +8 -8
  36. package/css/radar-chart.css +6 -6
  37. package/css/rating.css +1 -1
  38. package/css/select.css +2 -2
  39. package/css/separator.css +2 -2
  40. package/css/side-nav.css +13 -13
  41. package/css/skeleton.css +5 -5
  42. package/css/slider.css +6 -6
  43. package/css/sortable.css +2 -2
  44. package/css/table.css +2 -2
  45. package/css/tags-input.css +1 -1
  46. package/css/tool-call.css +7 -7
  47. package/css/tooltip.css +1 -1
  48. package/css/tree-select.css +2 -2
  49. package/dist/css/accordion.css +269 -0
  50. package/dist/css/affix.css +47 -0
  51. package/dist/css/alert.css +247 -0
  52. package/dist/css/anchor.css +252 -0
  53. package/dist/css/approval.css +501 -0
  54. package/dist/css/avatar-group.css +99 -0
  55. package/dist/css/avatar.css +98 -0
  56. package/dist/css/back-top.css +161 -0
  57. package/dist/css/badge.css +205 -0
  58. package/dist/css/bar-code.css +62 -0
  59. package/dist/css/breadcrumb.css +230 -0
  60. package/dist/css/button-group.css +263 -0
  61. package/dist/css/button.css +219 -0
  62. package/dist/css/calendar-picker.css +467 -0
  63. package/dist/css/calendar-range-picker.css +554 -0
  64. package/dist/css/card.css +221 -0
  65. package/dist/css/carousel.css +710 -0
  66. package/dist/css/cartesian-chart.css +830 -0
  67. package/dist/css/cascader.css +961 -0
  68. package/dist/css/checkbox-group.css +358 -0
  69. package/dist/css/checkbox.css +257 -0
  70. package/dist/css/citation.css +470 -0
  71. package/dist/css/clipboard.css +315 -0
  72. package/dist/css/code-view.css +374 -0
  73. package/dist/css/collapsible.css +185 -0
  74. package/dist/css/color-field.css +176 -0
  75. package/dist/css/color-picker.css +595 -0
  76. package/dist/css/color-slider.css +281 -0
  77. package/dist/css/color-swatch-picker.css +250 -0
  78. package/dist/css/color-swatch.css +35 -0
  79. package/dist/css/combobox.css +574 -0
  80. package/dist/css/command.css +399 -0
  81. package/dist/css/context-menu.css +420 -0
  82. package/dist/css/date-field.css +317 -0
  83. package/dist/css/date-picker.css +868 -0
  84. package/dist/css/date-range-picker.css +886 -0
  85. package/dist/css/description.css +67 -0
  86. package/dist/css/descriptions.css +299 -0
  87. package/dist/css/dialog.css +455 -0
  88. package/dist/css/diff-view.css +513 -0
  89. package/dist/css/download-trigger.css +151 -0
  90. package/dist/css/drawer.css +552 -0
  91. package/dist/css/editable.css +295 -0
  92. package/dist/css/empty-state.css +163 -0
  93. package/dist/css/field-array.css +226 -0
  94. package/dist/css/field.css +166 -0
  95. package/dist/css/fieldset.css +102 -0
  96. package/dist/css/file-upload.css +429 -0
  97. package/dist/css/flex.css +441 -0
  98. package/dist/css/float-button.css +569 -0
  99. package/dist/css/floating-panel.css +429 -0
  100. package/dist/css/focus.css +46 -0
  101. package/dist/css/forced-colors.css +93 -0
  102. package/dist/css/form.css +393 -0
  103. package/dist/css/funnel-chart.css +106 -0
  104. package/dist/css/graph-chart.css +205 -0
  105. package/dist/css/grid-list.css +235 -0
  106. package/dist/css/grid.css +1201 -0
  107. package/dist/css/heatmap.css +552 -0
  108. package/dist/css/hierarchy-chart.css +298 -0
  109. package/dist/css/highlight.css +41 -0
  110. package/dist/css/hover-card.css +226 -0
  111. package/dist/css/icon.css +225 -0
  112. package/dist/css/image-cropper.css +373 -0
  113. package/dist/css/image-viewer.css +538 -0
  114. package/dist/css/image.css +98 -0
  115. package/dist/css/infinite-scroll.css +77 -0
  116. package/dist/css/input-group.css +275 -0
  117. package/dist/css/json-viewer.css +379 -0
  118. package/dist/css/kbd.css +72 -0
  119. package/dist/css/label.css +78 -0
  120. package/dist/css/layers.css +7 -0
  121. package/dist/css/layout.css +372 -0
  122. package/dist/css/liquid.css +106 -0
  123. package/dist/css/list.css +152 -0
  124. package/dist/css/listbox.css +390 -0
  125. package/dist/css/loading-bar.css +141 -0
  126. package/dist/css/log.css +306 -0
  127. package/dist/css/markdown-stream.css +149 -0
  128. package/dist/css/marquee.css +378 -0
  129. package/dist/css/masonry.css +70 -0
  130. package/dist/css/matrix-code.css +67 -0
  131. package/dist/css/mention.css +393 -0
  132. package/dist/css/menu.css +364 -0
  133. package/dist/css/menubar.css +456 -0
  134. package/dist/css/message-feed.css +318 -0
  135. package/dist/css/navigation-menu.css +513 -0
  136. package/dist/css/notification.css +782 -0
  137. package/dist/css/number-animation.css +44 -0
  138. package/dist/css/number-field.css +252 -0
  139. package/dist/css/overlay-arrow.css +56 -0
  140. package/dist/css/page-header.css +184 -0
  141. package/dist/css/pagination.css +450 -0
  142. package/dist/css/password-input.css +391 -0
  143. package/dist/css/pie-chart.css +247 -0
  144. package/dist/css/pin-input.css +199 -0
  145. package/dist/css/pointer.css +36 -0
  146. package/dist/css/popconfirm.css +320 -0
  147. package/dist/css/popover.css +279 -0
  148. package/dist/css/progress.css +501 -0
  149. package/dist/css/prompt-input.css +260 -0
  150. package/dist/css/question-flow.css +553 -0
  151. package/dist/css/radar-chart.css +233 -0
  152. package/dist/css/radio-group.css +598 -0
  153. package/dist/css/rating.css +294 -0
  154. package/dist/css/reasoning.css +343 -0
  155. package/dist/css/reset.css +117 -0
  156. package/dist/css/resizable.css +242 -0
  157. package/dist/css/sankey-chart.css +174 -0
  158. package/dist/css/scroll-area.css +240 -0
  159. package/dist/css/scrollbar.css +204 -0
  160. package/dist/css/select.css +612 -0
  161. package/dist/css/separator.css +122 -0
  162. package/dist/css/side-nav.css +476 -0
  163. package/dist/css/signature-pad.css +179 -0
  164. package/dist/css/skeleton.css +161 -0
  165. package/dist/css/slider.css +374 -0
  166. package/dist/css/sortable.css +228 -0
  167. package/dist/css/sparkline.css +164 -0
  168. package/dist/css/spinner.css +236 -0
  169. package/dist/css/splitter.css +159 -0
  170. package/dist/css/statistic.css +137 -0
  171. package/dist/css/steps.css +627 -0
  172. package/dist/css/switch.css +351 -0
  173. package/dist/css/table.css +1145 -0
  174. package/dist/css/tabs.css +944 -0
  175. package/dist/css/tag-group.css +247 -0
  176. package/dist/css/tag.css +310 -0
  177. package/dist/css/tags-input.css +322 -0
  178. package/dist/css/text-field.css +197 -0
  179. package/dist/css/time-field.css +277 -0
  180. package/dist/css/time-picker.css +707 -0
  181. package/dist/css/time-range-picker.css +746 -0
  182. package/dist/css/timeline.css +423 -0
  183. package/dist/css/timer.css +123 -0
  184. package/dist/css/timestamp.css +34 -0
  185. package/dist/css/toggle-group.css +424 -0
  186. package/dist/css/toggle.css +146 -0
  187. package/dist/css/tone.css +189 -0
  188. package/dist/css/tool-call.css +429 -0
  189. package/dist/css/toolbar.css +365 -0
  190. package/dist/css/tooltip.css +218 -0
  191. package/dist/css/tour.css +439 -0
  192. package/dist/css/transfer.css +638 -0
  193. package/dist/css/tree-select.css +878 -0
  194. package/dist/css/tree.css +733 -0
  195. package/dist/css/truncate.css +108 -0
  196. package/dist/css/typography.css +472 -0
  197. package/dist/css/undefined.css +58 -0
  198. package/dist/css/virtualizer.css +166 -0
  199. package/dist/css/visually-hidden.css +20 -0
  200. package/dist/css/watermark.css +82 -0
  201. package/dist/family/action-control.css +487 -0
  202. package/dist/family/chart.css +480 -0
  203. package/dist/family/check-mark.css +94 -0
  204. package/dist/family/choice-card.css +97 -0
  205. package/dist/family/collection-item.css +764 -0
  206. package/dist/family/field-chrome.css +287 -0
  207. package/dist/family/loading-ring.css +95 -0
  208. package/dist/family/material.css +72 -0
  209. package/dist/family/menu-choice.css +56 -0
  210. package/dist/family/motion.css +363 -0
  211. package/dist/family/swatch.css +59 -0
  212. package/dist/family/tag-list.css +59 -0
  213. package/family/action-control.css +3 -12
  214. package/index.css +6882 -6809
  215. package/index.unlayered.css +6884 -6811
  216. package/package.json +165 -164
@@ -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,14 +533,14 @@
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))
@@ -560,7 +560,7 @@
560
560
  }
561
561
 
562
562
  /* 轻提示的说明只是一行短上下文,行高收紧到正文之下 */
563
- [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']) {
564
564
  min-inline-size: 0;
565
565
  line-height: var(--xh-notification-description-leading, var(--xh-leading-normal));
566
566
  }
@@ -595,7 +595,7 @@
595
595
  }
596
596
 
597
597
  /* 卡片:横跨整张卡片的一行,它不是正文的一部分,不跟着第二列走;两端取胶囊 */
598
- [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']) {
599
599
  --xh-_countdown-radius: var(--xh-notification-progress-radius, var(--xh-shape-pill));
600
600
 
601
601
  grid-column: 1 / -1;
@@ -603,7 +603,7 @@
603
603
  }
604
604
 
605
605
  /* 轻提示:贴着卡片底边走 */
606
- [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']) {
607
607
  position: absolute;
608
608
  inset-block-end: 0;
609
609
  inset-inline-start: 0;
@@ -621,7 +621,7 @@
621
621
  animation-timing-function: steps(var(--xh-_notification-progress-steps, 1), end);
622
622
  }
623
623
 
624
- [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']) {
625
625
  animation-play-state: paused;
626
626
  }
627
627
 
@@ -659,7 +659,7 @@
659
659
  }
660
660
 
661
661
  /* 轻提示是单行 flex,按钮不参与伸缩:文案长了该换行的是文字 */
662
- [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']) {
663
663
  flex: none;
664
664
  align-self: center;
665
665
  }
@@ -692,14 +692,14 @@
692
692
  }
693
693
 
694
694
  /* 卡片:钉在右上角的内衬处,不参与网格排布——留在流里它会变成正文下面的第三行 */
695
- [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']) {
696
696
  position: absolute;
697
697
  inset-block-start: var(--xh-notification-close-inset, var(--xh-surface-action-inset));
698
698
  inset-inline-end: var(--xh-notification-close-inset, var(--xh-surface-action-inset));
699
699
  }
700
700
 
701
701
  /* 轻提示:排在一行短消息的行尾,与文本列一起垂直居中 */
702
- [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']) {
703
703
  flex: none;
704
704
  align-self: center;
705
705
  }
@@ -708,13 +708,13 @@
708
708
  hover-focus 显示策略:那一档用 visibility 收起,这颗叉占 Tab 位,收成 visibility: hidden
709
709
  后键盘就够不到它了;这里只压 opacity 与 pointer-events,焦点仍能落进来 */
710
710
  @media (hover: hover) {
711
- [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']) {
712
712
  opacity: 0;
713
713
  pointer-events: none;
714
714
  }
715
715
 
716
- [data-scope='notification'][data-part='item'][data-preset='toast']:hover [data-part='item-close-trigger'],
717
- [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']) {
718
718
  opacity: 1;
719
719
  pointer-events: auto;
720
720
  }
@@ -722,7 +722,7 @@
722
722
 
723
723
  /* 收拢的后层只允许最前一条露出关闭入口;触屏没有 hover,必须显式收起后层的叉 */
724
724
  [data-scope='notification'][data-part='group'][data-stacked] [data-scope='notification'][data-part='item'][data-stack-index]:not([data-frontmost]):not([data-expanded])
725
- [data-part='item-close-trigger'] {
725
+ [data-part='item-close-trigger']:where([data-scope='notification']) {
726
726
  opacity: 0;
727
727
  pointer-events: none;
728
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
  }
@@ -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;