@xihan-ui/styles 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/CHANGELOG.md +470 -0
  2. package/component-tokens.d.ts +230 -60
  3. package/components.tokens.json +5156 -1557
  4. package/css/accordion.css +47 -20
  5. package/css/alert.css +16 -17
  6. package/css/anchor.css +2 -2
  7. package/css/approval.css +41 -17
  8. package/css/avatar-group.css +9 -12
  9. package/css/avatar.css +20 -18
  10. package/css/back-top.css +21 -7
  11. package/css/badge.css +5 -5
  12. package/css/breadcrumb.css +18 -16
  13. package/css/button-group.css +4 -6
  14. package/css/button.css +13 -12
  15. package/css/calendar-picker.css +178 -95
  16. package/css/calendar-range-picker.css +207 -122
  17. package/css/card.css +34 -6
  18. package/css/carousel.css +94 -46
  19. package/css/cartesian-chart.css +11 -11
  20. package/css/cascader.css +51 -39
  21. package/css/checkbox-group.css +9 -6
  22. package/css/checkbox.css +5 -4
  23. package/css/citation.css +9 -4
  24. package/css/clipboard.css +20 -4
  25. package/css/code-view.css +6 -6
  26. package/css/collapsible.css +29 -14
  27. package/css/color-field.css +4 -4
  28. package/css/color-picker.css +77 -23
  29. package/css/color-slider.css +10 -8
  30. package/css/color-swatch-picker.css +14 -9
  31. package/css/combobox.css +26 -14
  32. package/css/command.css +14 -9
  33. package/css/context-menu.css +10 -5
  34. package/css/date-field.css +12 -6
  35. package/css/date-picker.css +178 -109
  36. package/css/date-range-picker.css +199 -130
  37. package/css/description.css +10 -6
  38. package/css/descriptions.css +47 -19
  39. package/css/dialog.css +50 -35
  40. package/css/diff-view.css +8 -8
  41. package/css/drawer.css +75 -21
  42. package/css/editable.css +15 -41
  43. package/css/empty-state.css +21 -3
  44. package/css/field-array.css +5 -2
  45. package/css/field.css +17 -18
  46. package/css/fieldset.css +33 -13
  47. package/css/file-upload.css +66 -33
  48. package/css/float-button.css +60 -35
  49. package/css/floating-panel.css +1 -1
  50. package/css/form.css +30 -16
  51. package/css/graph-chart.css +2 -2
  52. package/css/grid-list.css +1 -1
  53. package/css/highlight.css +5 -5
  54. package/css/hover-card.css +19 -12
  55. package/css/image-viewer.css +77 -27
  56. package/css/image.css +13 -5
  57. package/css/infinite-scroll.css +8 -4
  58. package/css/input-group.css +74 -26
  59. package/css/kbd.css +1 -1
  60. package/css/label.css +27 -11
  61. package/css/layout.css +17 -10
  62. package/css/list.css +13 -9
  63. package/css/listbox.css +12 -7
  64. package/css/loading-bar.css +3 -0
  65. package/css/mention.css +11 -9
  66. package/css/menu.css +10 -5
  67. package/css/menubar.css +13 -8
  68. package/css/message-feed.css +1 -1
  69. package/css/navigation-menu.css +2 -2
  70. package/css/notification.css +132 -49
  71. package/css/number-animation.css +2 -2
  72. package/css/number-field.css +75 -52
  73. package/css/page-header.css +64 -27
  74. package/css/pagination.css +35 -38
  75. package/css/password-input.css +12 -68
  76. package/css/pin-input.css +18 -26
  77. package/css/popconfirm.css +23 -14
  78. package/css/popover.css +18 -12
  79. package/css/progress.css +14 -13
  80. package/css/prompt-input.css +3 -3
  81. package/css/question-flow.css +41 -15
  82. package/css/radar-chart.css +6 -6
  83. package/css/radio-group.css +120 -55
  84. package/css/rating.css +32 -15
  85. package/css/select.css +16 -12
  86. package/css/separator.css +24 -6
  87. package/css/side-nav.css +29 -24
  88. package/css/signature-pad.css +23 -9
  89. package/css/skeleton.css +12 -12
  90. package/css/slider.css +77 -48
  91. package/css/sortable.css +2 -2
  92. package/css/sparkline.css +8 -2
  93. package/css/spinner.css +40 -20
  94. package/css/statistic.css +14 -14
  95. package/css/steps.css +115 -84
  96. package/css/switch.css +9 -7
  97. package/css/table.css +29 -12
  98. package/css/tabs.css +35 -12
  99. package/css/tag-group.css +17 -6
  100. package/css/tag.css +54 -29
  101. package/css/tags-input.css +39 -20
  102. package/css/text-field.css +5 -5
  103. package/css/time-field.css +4 -4
  104. package/css/time-picker.css +150 -64
  105. package/css/time-range-picker.css +91 -62
  106. package/css/timeline.css +37 -20
  107. package/css/timer.css +3 -3
  108. package/css/toggle-group.css +4 -4
  109. package/css/tool-call.css +13 -11
  110. package/css/toolbar.css +6 -5
  111. package/css/tooltip.css +16 -17
  112. package/css/tour.css +14 -7
  113. package/css/transfer.css +22 -16
  114. package/css/tree-select.css +12 -12
  115. package/css/tree.css +26 -25
  116. package/css/typography.css +28 -25
  117. package/dist/css/accordion.css +296 -0
  118. package/dist/css/affix.css +47 -0
  119. package/dist/css/alert.css +246 -0
  120. package/dist/css/anchor.css +252 -0
  121. package/dist/css/approval.css +525 -0
  122. package/dist/css/avatar-group.css +96 -0
  123. package/dist/css/avatar.css +100 -0
  124. package/dist/css/back-top.css +175 -0
  125. package/dist/css/badge.css +205 -0
  126. package/dist/css/bar-code.css +62 -0
  127. package/dist/css/breadcrumb.css +232 -0
  128. package/dist/css/button-group.css +261 -0
  129. package/dist/css/button.css +216 -0
  130. package/dist/css/calendar-picker.css +550 -0
  131. package/dist/css/calendar-range-picker.css +639 -0
  132. package/dist/css/card.css +249 -0
  133. package/dist/css/carousel.css +726 -0
  134. package/dist/css/cartesian-chart.css +830 -0
  135. package/dist/css/cascader.css +973 -0
  136. package/dist/css/checkbox-group.css +361 -0
  137. package/dist/css/checkbox.css +258 -0
  138. package/dist/css/citation.css +475 -0
  139. package/dist/css/clipboard.css +331 -0
  140. package/dist/css/code-view.css +374 -0
  141. package/dist/css/collapsible.css +200 -0
  142. package/dist/css/color-field.css +176 -0
  143. package/dist/css/color-picker.css +649 -0
  144. package/dist/css/color-slider.css +283 -0
  145. package/dist/css/color-swatch-picker.css +250 -0
  146. package/dist/css/color-swatch.css +35 -0
  147. package/dist/css/combobox.css +578 -0
  148. package/dist/css/command.css +404 -0
  149. package/dist/css/context-menu.css +425 -0
  150. package/dist/css/date-field.css +317 -0
  151. package/dist/css/date-picker.css +931 -0
  152. package/dist/css/date-range-picker.css +949 -0
  153. package/dist/css/description.css +71 -0
  154. package/dist/css/descriptions.css +327 -0
  155. package/dist/css/dialog.css +470 -0
  156. package/dist/css/diff-view.css +513 -0
  157. package/dist/css/download-trigger.css +151 -0
  158. package/dist/css/drawer.css +606 -0
  159. package/dist/css/editable.css +269 -0
  160. package/dist/css/empty-state.css +181 -0
  161. package/dist/css/field-array.css +229 -0
  162. package/dist/css/field.css +165 -0
  163. package/dist/css/fieldset.css +122 -0
  164. package/dist/css/file-upload.css +462 -0
  165. package/dist/css/flex.css +441 -0
  166. package/dist/css/float-button.css +579 -0
  167. package/dist/css/floating-panel.css +429 -0
  168. package/dist/css/focus.css +46 -0
  169. package/dist/css/forced-colors.css +93 -0
  170. package/dist/css/form.css +407 -0
  171. package/dist/css/funnel-chart.css +106 -0
  172. package/dist/css/graph-chart.css +205 -0
  173. package/dist/css/grid-list.css +235 -0
  174. package/dist/css/grid.css +1201 -0
  175. package/dist/css/heatmap.css +552 -0
  176. package/dist/css/hierarchy-chart.css +298 -0
  177. package/dist/css/highlight.css +41 -0
  178. package/dist/css/hover-card.css +233 -0
  179. package/dist/css/icon.css +225 -0
  180. package/dist/css/image-cropper.css +373 -0
  181. package/dist/css/image-viewer.css +588 -0
  182. package/dist/css/image.css +106 -0
  183. package/dist/css/infinite-scroll.css +81 -0
  184. package/dist/css/input-group.css +323 -0
  185. package/dist/css/json-viewer.css +379 -0
  186. package/dist/css/kbd.css +72 -0
  187. package/dist/css/label.css +94 -0
  188. package/dist/css/layers.css +7 -0
  189. package/dist/css/layout.css +379 -0
  190. package/dist/css/liquid.css +106 -0
  191. package/dist/css/list.css +156 -0
  192. package/dist/css/listbox.css +395 -0
  193. package/dist/css/loading-bar.css +144 -0
  194. package/dist/css/log.css +306 -0
  195. package/dist/css/markdown-stream.css +149 -0
  196. package/dist/css/marquee.css +378 -0
  197. package/dist/css/masonry.css +70 -0
  198. package/dist/css/matrix-code.css +67 -0
  199. package/dist/css/mention.css +395 -0
  200. package/dist/css/menu.css +369 -0
  201. package/dist/css/menubar.css +461 -0
  202. package/dist/css/message-feed.css +318 -0
  203. package/dist/css/navigation-menu.css +513 -0
  204. package/dist/css/notification.css +865 -0
  205. package/dist/css/number-animation.css +44 -0
  206. package/dist/css/number-field.css +275 -0
  207. package/dist/css/overlay-arrow.css +56 -0
  208. package/dist/css/page-header.css +221 -0
  209. package/dist/css/pagination.css +447 -0
  210. package/dist/css/password-input.css +335 -0
  211. package/dist/css/pie-chart.css +247 -0
  212. package/dist/css/pin-input.css +191 -0
  213. package/dist/css/pointer.css +36 -0
  214. package/dist/css/popconfirm.css +329 -0
  215. package/dist/css/popover.css +285 -0
  216. package/dist/css/progress.css +502 -0
  217. package/dist/css/prompt-input.css +260 -0
  218. package/dist/css/question-flow.css +579 -0
  219. package/dist/css/radar-chart.css +233 -0
  220. package/dist/css/radio-group.css +663 -0
  221. package/dist/css/rating.css +311 -0
  222. package/dist/css/reasoning.css +343 -0
  223. package/dist/css/reset.css +117 -0
  224. package/dist/css/resizable.css +242 -0
  225. package/dist/css/sankey-chart.css +174 -0
  226. package/dist/css/scroll-area.css +240 -0
  227. package/dist/css/scrollbar.css +204 -0
  228. package/dist/css/select.css +616 -0
  229. package/dist/css/separator.css +140 -0
  230. package/dist/css/side-nav.css +481 -0
  231. package/dist/css/signature-pad.css +193 -0
  232. package/dist/css/skeleton.css +161 -0
  233. package/dist/css/slider.css +403 -0
  234. package/dist/css/sortable.css +228 -0
  235. package/dist/css/sparkline.css +170 -0
  236. package/dist/css/spinner.css +256 -0
  237. package/dist/css/splitter.css +159 -0
  238. package/dist/css/statistic.css +137 -0
  239. package/dist/css/steps.css +658 -0
  240. package/dist/css/switch.css +353 -0
  241. package/dist/css/table.css +1162 -0
  242. package/dist/css/tabs.css +967 -0
  243. package/dist/css/tag-group.css +258 -0
  244. package/dist/css/tag.css +335 -0
  245. package/dist/css/tags-input.css +341 -0
  246. package/dist/css/text-field.css +197 -0
  247. package/dist/css/time-field.css +277 -0
  248. package/dist/css/time-picker.css +793 -0
  249. package/dist/css/time-range-picker.css +775 -0
  250. package/dist/css/timeline.css +440 -0
  251. package/dist/css/timer.css +123 -0
  252. package/dist/css/timestamp.css +34 -0
  253. package/dist/css/toggle-group.css +424 -0
  254. package/dist/css/toggle.css +146 -0
  255. package/dist/css/tone.css +189 -0
  256. package/dist/css/tool-call.css +431 -0
  257. package/dist/css/toolbar.css +366 -0
  258. package/dist/css/tooltip.css +217 -0
  259. package/dist/css/tour.css +446 -0
  260. package/dist/css/transfer.css +644 -0
  261. package/dist/css/tree-select.css +878 -0
  262. package/dist/css/tree.css +734 -0
  263. package/dist/css/truncate.css +108 -0
  264. package/dist/css/typography.css +475 -0
  265. package/dist/css/undefined.css +58 -0
  266. package/dist/css/virtualizer.css +166 -0
  267. package/dist/css/visually-hidden.css +20 -0
  268. package/dist/css/watermark.css +82 -0
  269. package/dist/family/action-control.css +493 -0
  270. package/dist/family/chart.css +537 -0
  271. package/dist/family/check-mark.css +94 -0
  272. package/dist/family/choice-card.css +97 -0
  273. package/dist/family/collection-item.css +768 -0
  274. package/dist/family/field-chrome.css +296 -0
  275. package/dist/family/loading-ring.css +102 -0
  276. package/dist/family/material.css +72 -0
  277. package/dist/family/menu-choice.css +56 -0
  278. package/dist/family/motion.css +363 -0
  279. package/dist/family/swatch.css +59 -0
  280. package/dist/family/tag-list.css +65 -0
  281. package/family/action-control.css +33 -36
  282. package/family/chart.css +57 -0
  283. package/family/collection-item.css +12 -8
  284. package/family/field-chrome.css +28 -19
  285. package/family/loading-ring.css +20 -13
  286. package/family/swatch.css +4 -4
  287. package/family/tag-list.css +6 -0
  288. package/index.css +10349 -8756
  289. package/index.unlayered.css +10350 -8758
  290. package/package.json +165 -164
package/css/card.css CHANGED
@@ -13,17 +13,22 @@
13
13
  --xh-card-skin: 1;
14
14
  }
15
15
 
16
- /* Card 是带统一内边距与节奏的内容面;布局方向可由作者在根上覆盖。
16
+ /* Card 是一块描边内容面:根自己不留内衬,头部条、正文与页脚各带各的内衬,头部条的分隔线才能贯通整宽,
17
+ 直接放进根的媒体也贴边铺满;布局方向可由作者在根上覆盖。
17
18
  边界由 --xh-border-default 描边承担,raised 落影只是抬起的加成(Card 是唯一登记 raised 的静态面,
18
- 且 raised 必带描边);内衬只走 --xh-surface-* 阶梯。 */
19
+ 且 raised 必带描边)。横向内衬 16px 不随密度;正文纵向内衬走 --xh-surface-pad-lg(16,紧凑 12)。
20
+ --xh-card-p 改的是各部件的内衬,四边同值 */
19
21
  [data-scope='card'][data-part='root'] {
22
+ --xh-_card-px: var(--xh-card-p, var(--xh-space-4));
23
+ --xh-_card-py: var(--xh-card-p, var(--xh-surface-pad-lg));
24
+
20
25
  position: relative;
21
26
  display: flex;
22
27
  flex-direction: column;
23
- gap: var(--xh-card-gap, var(--xh-space-3));
28
+ gap: var(--xh-card-gap, 0);
24
29
  min-inline-size: 0;
25
30
  overflow: visible;
26
- padding: var(--xh-card-p, var(--xh-surface-pad-lg));
31
+ padding: 0;
27
32
  border: var(--xh-stroke-thin) solid var(--xh-card-border, var(--xh-border-default));
28
33
  border-radius: var(--xh-card-radius, var(--xh-shape-surface));
29
34
  background: var(--xh-card-bg, var(--xh-bg-surface));
@@ -159,15 +164,26 @@
159
164
  flex-direction: column;
160
165
  }
161
166
 
167
+ /* 头部条:根的直接子节点才是条——一行区块标题时高 46px(紧凑 40px),标题在条里竖向居中,
168
+ 横向内衬与正文同起点,底边一道 1px 内部分隔线。嵌在正文里的 header(横向卡片把标题与正文排在一列)不画条 */
169
+ [data-scope='card'][data-part='root'] > [data-scope='card'][data-part='header'] {
170
+ justify-content: center;
171
+ min-block-size: var(--xh-card-header-h, var(--xh-surface-header-h));
172
+ padding-block: var(--xh-card-header-py, var(--xh-space-2));
173
+ padding-inline: var(--xh-_card-px);
174
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-card-header-border, var(--xh-border-subtle));
175
+ }
176
+
162
177
  [data-scope='card'][data-part='title'],
163
178
  [data-scope='card'][data-part='description'] {
164
179
  margin: 0;
165
180
  }
166
181
 
182
+ /* 标题取区块标题档(heading-3)、正文色 */
167
183
  [data-scope='card'][data-part='title'] {
168
184
  color: var(--xh-card-title-fg, var(--xh-fg-default));
169
- font-size: var(--xh-card-title-font-size, var(--xh-text-label-size));
170
- font-weight: var(--xh-card-title-font-weight, var(--xh-font-weight-semibold));
185
+ font-size: var(--xh-card-title-font-size, var(--xh-text-heading-3-size));
186
+ font-weight: var(--xh-card-title-font-weight, var(--xh-text-heading-3-weight));
171
187
  line-height: var(--xh-card-title-leading, var(--xh-leading-tight));
172
188
  }
173
189
 
@@ -177,12 +193,16 @@
177
193
  line-height: var(--xh-card-description-leading, var(--xh-leading-normal));
178
194
  }
179
195
 
196
+ /* 正文:四边内衬、14px 次级色 */
180
197
  [data-scope='card'][data-part='content'] {
181
198
  display: flex;
182
199
  flex: 1 1 auto;
183
200
  flex-direction: column;
184
201
  gap: var(--xh-card-content-gap, var(--xh-space-1));
185
202
  min-inline-size: 0;
203
+ padding: var(--xh-_card-py) var(--xh-_card-px);
204
+ color: var(--xh-card-content-fg, var(--xh-fg-muted));
205
+ font-size: var(--xh-card-content-font-size, var(--xh-text-body-size));
186
206
  }
187
207
 
188
208
  [data-scope='card'][data-part='footer'] {
@@ -192,6 +212,14 @@
192
212
  gap: var(--xh-card-footer-gap, var(--xh-space-2));
193
213
  }
194
214
 
215
+ /* 页脚是正文的延续:与正文同起点,顶上不再留白(正文的底内衬就是两者的间距),底边留正文同档的内衬。
216
+ 嵌在正文里的页脚随正文的内衬走,不另加 */
217
+ [data-scope='card'][data-part='root'] > [data-scope='card'][data-part='footer'] {
218
+ padding-block-start: 0;
219
+ padding-block-end: var(--xh-_card-py);
220
+ padding-inline: var(--xh-_card-px);
221
+ }
222
+
195
223
  @media print {
196
224
  [data-scope='card'][data-part='root'] {
197
225
  border-color: currentColor;
package/css/carousel.css CHANGED
@@ -19,8 +19,9 @@
19
19
  [data-scope='carousel'][data-part='root'] {
20
20
  /* 自动播放开启时由 Headless 写入真实间隔;0ms 只用于未接入运行时的静态标记。 */
21
21
  --xh-_carousel-autoplay-duration: 0ms;
22
- --xh-_carousel-progress-from: 0 1;
23
- --xh-_carousel-progress-to: 1 1;
22
+ /* 进度条起步时裁掉的四边(inset 的上 右 下 左):横轨从行尾那一侧整条裁掉。
23
+ clip-path 只认物理方向,行内轴两侧取书写方向的位置,rtl 下改从左往右收 */
24
+ --xh-_carousel-progress-cut: 0 var(--xh-direction-end) 0 var(--xh-direction-start);
24
25
 
25
26
  position: relative;
26
27
  display: block;
@@ -32,9 +33,9 @@
32
33
  display: none;
33
34
  }
34
35
 
36
+ /* 纵轨:从下沿整条裁掉,进度条从上往下长 */
35
37
  [data-scope='carousel'][data-part='root'][data-orientation='vertical'] {
36
- --xh-_carousel-progress-from: 1 0;
37
- --xh-_carousel-progress-to: 1 1;
38
+ --xh-_carousel-progress-cut: 0 0 100% 0;
38
39
  }
39
40
 
40
41
  /* 视口是裁切窗口:轨道比它宽(高),露在外面的那些张全靠它切掉。
@@ -131,7 +132,10 @@
131
132
  }
132
133
 
133
134
  /* 两端按钮与播放开关:浮在媒体之上的单图标圆钮,接 Action Control floating 档:
134
- 盒型(md = box-lg 48px,圆形)、四态面、0.97 按压与 44px 命中区由家族配方给出,组件没有 size 轴、固定 md。
135
+ 圆形、四态面、按压与 44px 命中区由家族配方给出;视觉盒比 floating 档小,不压画面:
136
+ sm / md / lg 取 24 / 24 / 28px、字形 12 / 16 / 20px(sm 不低于 24px 的最小目标,只把字形收小)。
137
+ sm / md 直接取细指针最小目标 --xh-control-target-min,不随密度收:floating 档在细指针下不外扩命中区,
138
+ 视觉盒就是命中区,紧凑档再收到 20px 就够不着 24px。
135
139
  连接层不投影 variant:面由这里桥接到磨砂缺省(使用者槽 → 磨砂面),悬停 / 按下的底走画布承载的阶梯
136
140
  (100 → 200,取不透明档:钮压在图上,半透明的墨色盖不住画面),边缘与投影不动;这里只留定位、桥接槽与图标尺 */
137
141
  [data-scope='carousel'][data-part='prev-trigger'],
@@ -167,14 +171,26 @@
167
171
  --xh-action-bg-pressed: var(--xh-carousel-trigger-bg-active, var(--xh-bg-subtle-hover-opaque));
168
172
  /* M2 顶光走配方的高光通道 */
169
173
  --xh-action-radius: var(--xh-carousel-trigger-radius, var(--xh-_action-profile-radius));
170
- --xh-action-visual-size: var(--xh-carousel-trigger-size, var(--xh-_action-profile-visual-size));
171
- /* 作者塞进来的图标跟着 floating 档走(md 24px),与皮肤画的兜底字形同一把尺 */
172
- --xh-icon-size: var(--xh-carousel-icon-size, var(--xh-_action-profile-glyph-size));
174
+ --xh-_carousel-trigger-size: var(--xh-control-target-min);
175
+ --xh-_carousel-trigger-glyph: var(--xh-glyph-size-sm);
176
+ --xh-action-visual-size: var(--xh-carousel-trigger-size, var(--xh-_carousel-trigger-size));
177
+ --xh-action-min-inline-size: var(--xh-carousel-trigger-size, var(--xh-_carousel-trigger-size));
178
+ /* 作者塞进来的图标与皮肤画的兜底字形同一把尺 */
179
+ --xh-icon-size: var(--xh-carousel-icon-size, var(--xh-_carousel-trigger-glyph));
173
180
 
174
181
  position: absolute;
175
182
  z-index: 1;
176
183
  }
177
184
 
185
+ [data-scope='carousel']:is([data-part='prev-trigger'], [data-part='next-trigger'], [data-part='autoplay-trigger'])[data-xh-action-size='sm'] {
186
+ --xh-_carousel-trigger-glyph: var(--xh-control-indicator-sm);
187
+ }
188
+
189
+ [data-scope='carousel']:is([data-part='prev-trigger'], [data-part='next-trigger'], [data-part='autoplay-trigger'])[data-xh-action-size='lg'] {
190
+ --xh-_carousel-trigger-size: var(--xh-control-h-sm);
191
+ --xh-_carousel-trigger-glyph: var(--xh-glyph-size-md);
192
+ }
193
+
178
194
  [data-scope='carousel'][data-part='prev-trigger'],
179
195
  [data-scope='carousel'][data-part='next-trigger'] {
180
196
  inset-block-start: 50%;
@@ -224,7 +240,7 @@
224
240
  flex-wrap: nowrap;
225
241
  align-items: center;
226
242
  justify-content: center;
227
- gap: var(--xh-carousel-indicator-gap, var(--xh-space-1));
243
+ gap: var(--xh-carousel-indicator-gap, var(--xh-space-2));
228
244
  }
229
245
 
230
246
  [data-scope='carousel'][data-part='indicator-group'][hidden] {
@@ -267,24 +283,26 @@
267
283
  box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
268
284
  }
269
285
 
270
- /* 分页点与 Tour 的步骤点同一种语言:8px 圆点,当前页拉长成 20px 胶囊并换品牌色。
286
+ /* 分页点与 Tour 的步骤点同一种语言:圆点(压在媒体上的这一排 6px、点距 8px),当前页拉长成 20px 胶囊并换品牌色。
271
287
  本体就是那颗点:没有文字(页码交给作者,默认不显示),底色即标记。
272
- 悬停 / 按下的回执落在点的颜色上:中性标记按前景阶梯加深一档、再加深一档;当前页按品牌阶梯压一档 */
288
+ 悬停 / 按下的回执落在点的颜色上:中性标记按前景阶梯加深一档、再加深一档;当前页按品牌阶梯压一档。
289
+ 沿轨道的长度取 indicator-size(当前页 indicator-size-current),垂直于轨道的粗细取 indicator-thickness,
290
+ 缺省与长度同值、仍是圆点;粗细单独调小就成细横条(横条不是正方盒,圆角另把 indicator-radius 换成胶囊) */
273
291
  [data-scope='carousel'][data-part='indicator'] {
274
292
  position: relative;
275
293
  display: inline-flex;
276
294
  flex: none;
277
295
  align-items: center;
278
296
  justify-content: center;
279
- inline-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
280
- block-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
297
+ inline-size: var(--xh-carousel-indicator-size, var(--xh-space-1_5));
298
+ block-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
281
299
  padding: 0;
282
300
  border: 0;
283
301
  border-radius: var(--xh-carousel-indicator-radius, var(--xh-shape-circle));
284
302
  background: var(--xh-carousel-indicator-bg, var(--xh-bg-subtle-hover-opaque));
285
303
  font-size: 0;
286
- /* 自动播放的进度条画在点里,超出胶囊的那截裁掉 */
287
- overflow: hidden;
304
+ /* 不裁切:细指针下 ::after 把命中区外扩到点外,overflow 一裁命中区就缩回 6px 的点里;
305
+ 自动播放的进度条自己带圆角、由 clip-path 裁出来,不靠点来裁 */
288
306
  cursor: pointer;
289
307
  transition:
290
308
  inline-size var(--xh-motion-duration-move) var(--xh-motion-ease-continuous),
@@ -297,11 +315,32 @@
297
315
  display: none;
298
316
  }
299
317
 
300
- /* 细指针的命中区外扩到 24×24(8px 点四面各扩 8px);粗指针下这颗伪元素改画点,盒子自己承担命中 */
318
+ /* 细指针的命中区外扩到不低于 24×24:两向都取「外扩 8px」与「补足到最小目标 --xh-control-target-min」
319
+ 中大的一头(6px 点四面各扩 9px);粗指针下这颗伪元素改画点,盒子自己承担命中。点调细了,垂直于轨道那一向照样补足。
320
+ 相邻两点节距 14px,命中区沿轨道互相叠一截:后一颗画在上层,叠住的那段归它,每颗点自己的盒子仍只命中自己 */
301
321
  [data-scope='carousel'][data-part='indicator']::after {
302
322
  content: '';
303
323
  position: absolute;
304
- inset: calc(-1 * var(--xh-space-2));
324
+ inset-inline: min(
325
+ calc(-1 * var(--xh-space-2)),
326
+ calc((var(--xh-carousel-indicator-size, var(--xh-space-1_5)) - var(--xh-control-target-min)) / 2)
327
+ );
328
+ inset-block: min(
329
+ calc(-1 * var(--xh-space-2)),
330
+ calc((var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5))) - var(--xh-control-target-min)) / 2)
331
+ );
332
+ }
333
+
334
+ [data-scope='carousel'][data-part='indicator-group'][data-orientation='vertical']
335
+ > [data-scope='carousel'][data-part='indicator']::after {
336
+ inset-inline: min(
337
+ calc(-1 * var(--xh-space-2)),
338
+ calc((var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5))) - var(--xh-control-target-min)) / 2)
339
+ );
340
+ inset-block: min(
341
+ calc(-1 * var(--xh-space-2)),
342
+ calc((var(--xh-carousel-indicator-size, var(--xh-space-1_5)) - var(--xh-control-target-min)) / 2)
343
+ );
305
344
  }
306
345
 
307
346
  [data-scope='carousel'][data-part='indicator']:hover:not([data-current]) {
@@ -355,7 +394,9 @@
355
394
 
356
395
  /* 自动播放的进度:胶囊是品牌淡底当轨道(仍是「当前」语义;淡底上公共环够对比,不灌环色),
357
396
  品牌填充条从起点沿轨道方向长满这一页的时长。计时器每次恢复都重计一整个间隔,
358
- 进度条跟它同一口径:暂停时回到起点,恢复时从头走 */
397
+ 进度条跟它同一口径:暂停时回到起点,恢复时从头走。
398
+ 填充条铺满胶囊、自己带同一副圆角,未走的那一截由 clip-path 从行尾(纵轨从下沿)裁掉,裁口也取圆角:
399
+ 不缩放就不会把圆头压扁,也不用点的盒子来裁——盒子一裁,细指针外扩的命中区跟着被裁掉 */
359
400
  [data-scope='carousel'][data-part='root'][data-autoplay]
360
401
  [data-scope='carousel'][data-part='indicator'][data-current],
361
402
  [data-scope='carousel'][data-part='root'][data-paused]
@@ -367,40 +408,37 @@
367
408
  [data-scope='carousel'][data-part='indicator'][data-current]::before,
368
409
  [data-scope='carousel'][data-part='root'][data-paused]
369
410
  [data-scope='carousel'][data-part='indicator'][data-current]::before {
411
+ --xh-_carousel-progress-radius: var(--xh-carousel-indicator-radius-current, var(--xh-shape-pill));
412
+
370
413
  content: '';
371
414
  position: absolute;
372
415
  inset: 0;
373
- border-radius: inherit;
416
+ border-radius: var(--xh-_carousel-progress-radius);
374
417
  background: var(--xh-carousel-indicator-bg-selected, var(--xh-bg-brand));
375
- transform-origin: left center;
376
418
  animation: xh-carousel-indicator-progress var(--xh-_carousel-autoplay-duration) var(--xh-motion-ease-loop) both;
377
419
  }
378
420
 
379
421
  [data-scope='carousel'][data-part='root'][data-paused]
380
422
  [data-scope='carousel'][data-part='indicator'][data-current]::before {
381
423
  animation: none;
382
- scale: var(--xh-_carousel-progress-from);
424
+ clip-path: inset(var(--xh-_carousel-progress-cut) round var(--xh-_carousel-progress-radius));
383
425
  }
384
426
 
385
427
  /* 纵轨:胶囊沿块轴拉长,进度条从上往下长 */
386
428
  [data-scope='carousel'][data-part='indicator-group'][data-orientation='vertical']
387
- > [data-scope='carousel'][data-part='indicator'][data-current] {
388
- inline-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
389
- block-size: var(--xh-carousel-indicator-size-current, var(--xh-space-5));
429
+ > [data-scope='carousel'][data-part='indicator'] {
430
+ inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
431
+ block-size: var(--xh-carousel-indicator-size, var(--xh-space-1_5));
390
432
  }
391
433
 
392
434
  [data-scope='carousel'][data-part='indicator-group'][data-orientation='vertical']
393
- > [data-scope='carousel'][data-part='indicator'][data-current]::before {
394
- transform-origin: center top;
395
- }
396
-
397
- [dir='rtl'] [data-scope='carousel'][data-part='indicator-group'][data-orientation='horizontal']
398
- > [data-scope='carousel'][data-part='indicator']::before {
399
- transform-origin: right center;
435
+ > [data-scope='carousel'][data-part='indicator'][data-current] {
436
+ inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
437
+ block-size: var(--xh-carousel-indicator-size-current, var(--xh-space-5));
400
438
  }
401
439
 
402
440
  [data-scope='carousel'][data-part='root'][data-orientation='vertical']
403
- > :is([data-part='prev-trigger'], [data-part='next-trigger']) {
441
+ > :is([data-part='prev-trigger'], [data-part='next-trigger']):where([data-scope='carousel']) {
404
442
  inset-inline-start: 50%;
405
443
  inset-inline-end: auto;
406
444
  translate: -50% 0;
@@ -408,23 +446,23 @@
408
446
  }
409
447
 
410
448
  [data-scope='carousel'][data-part='root'][data-orientation='vertical']
411
- > :is([data-part='prev-trigger'], [data-part='next-trigger']):dir(rtl) {
449
+ > :is([data-part='prev-trigger'], [data-part='next-trigger']):where([data-scope='carousel']):dir(rtl) {
412
450
  translate: 50% 0;
413
451
  }
414
452
 
415
453
  /* 纵轨的翻页钮整颗转了 90°,形变会跟着转到错的方向,这一档不挂 */
416
454
  :where([data-material='liquid']) [data-scope='carousel'][data-part='root'][data-orientation='vertical']
417
- > :is([data-part='prev-trigger'], [data-part='next-trigger'])[data-xh-liquid] {
455
+ > :is([data-part='prev-trigger'], [data-part='next-trigger']):where([data-scope='carousel'])[data-xh-liquid] {
418
456
  transform: none;
419
457
  }
420
458
 
421
459
  [data-scope='carousel'][data-part='root'][data-orientation='vertical']
422
- > [data-part='prev-trigger'] {
460
+ > [data-part='prev-trigger']:where([data-scope='carousel']) {
423
461
  inset-block-start: var(--xh-carousel-control-inset, var(--xh-space-3));
424
462
  }
425
463
 
426
464
  [data-scope='carousel'][data-part='root'][data-orientation='vertical']
427
- > [data-part='next-trigger'] {
465
+ > [data-part='next-trigger']:where([data-scope='carousel']) {
428
466
  inset-block-start: auto;
429
467
  inset-block-end: var(--xh-carousel-control-inset, var(--xh-space-3));
430
468
  }
@@ -438,7 +476,7 @@
438
476
 
439
477
  [data-scope='carousel'][data-part='indicator'][data-current]::before {
440
478
  animation: none;
441
- scale: var(--xh-_carousel-progress-to);
479
+ clip-path: none;
442
480
  }
443
481
  }
444
482
 
@@ -448,7 +486,7 @@
448
486
 
449
487
  :where([data-motion='reduce']) [data-scope='carousel'][data-part='indicator'][data-current]::before {
450
488
  animation: none;
451
- scale: var(--xh-_carousel-progress-to);
489
+ clip-path: none;
452
490
  }
453
491
 
454
492
  @media (forced-colors: active) {
@@ -533,7 +571,7 @@
533
571
  }
534
572
 
535
573
  /* 手指落点:三颗钮的 44px 命中区由配方的 ::after 给(floating 档)。
536
- 分页点的视觉仍是 8 / 20px,按钮盒改成首尾相接的 44px 分区:直接用负 inset 外扩会让相邻页的命中区重叠,
574
+ 分页点的视觉仍是 6 / 20px,按钮盒改成首尾相接的 44px 分区:直接用负 inset 外扩会让相邻页的命中区重叠,
537
575
  落点归属取决于绘制顺序;这里让真实按钮盒承担命中,点与进度条改由伪元素画在盒子中央 */
538
576
  @media (pointer: coarse) {
539
577
  [data-scope='carousel'][data-part='indicator-group'] {
@@ -556,15 +594,14 @@
556
594
  min-block-size: var(--xh-carousel-indicator-target-size, 44px);
557
595
  border-radius: 0;
558
596
  background: transparent;
559
- overflow: visible;
560
597
  }
561
598
 
562
599
  [data-scope='carousel'][data-part='indicator']::after {
563
600
  inset: auto;
564
601
  inset-block-start: 50%;
565
602
  inset-inline-start: 50%;
566
- inline-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
567
- block-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
603
+ inline-size: var(--xh-carousel-indicator-size, var(--xh-space-1_5));
604
+ block-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
568
605
  border-radius: var(--xh-carousel-indicator-radius, var(--xh-shape-circle));
569
606
  background: var(--xh-carousel-indicator-bg, var(--xh-bg-subtle-hover-opaque));
570
607
  translate: -50% -50%;
@@ -614,7 +651,7 @@
614
651
  inset-inline-start: 50%;
615
652
  z-index: 1;
616
653
  inline-size: var(--xh-carousel-indicator-size-current, var(--xh-space-5));
617
- block-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
654
+ block-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
618
655
  border-radius: var(--xh-carousel-indicator-radius-current, var(--xh-shape-pill));
619
656
  translate: -50% -50%;
620
657
  }
@@ -626,6 +663,16 @@
626
663
  translate: 50% -50%;
627
664
  }
628
665
 
666
+ /* 纵轨:细指针那条按轨道方向外扩命中区的规则更具体,这里把点的定位一并收回到居中 */
667
+ [data-scope='carousel'][data-part='indicator-group'][data-orientation='vertical']
668
+ > [data-scope='carousel'][data-part='indicator']::after {
669
+ inset: auto;
670
+ inset-block-start: 50%;
671
+ inset-inline-start: 50%;
672
+ inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
673
+ block-size: var(--xh-carousel-indicator-size, var(--xh-space-1_5));
674
+ }
675
+
629
676
  [data-scope='carousel'][data-part='indicator-group'][data-orientation='vertical']
630
677
  > [data-scope='carousel'][data-part='indicator'][data-current]::after,
631
678
  [data-scope='carousel'][data-part='root'][data-autoplay]
@@ -634,7 +681,7 @@
634
681
  [data-scope='carousel'][data-part='root'][data-paused]
635
682
  [data-scope='carousel'][data-part='indicator-group'][data-orientation='vertical']
636
683
  > [data-scope='carousel'][data-part='indicator'][data-current]::before {
637
- inline-size: var(--xh-carousel-indicator-size, var(--xh-space-2));
684
+ inline-size: var(--xh-carousel-indicator-thickness, var(--xh-carousel-indicator-size, var(--xh-space-1_5)));
638
685
  block-size: var(--xh-carousel-indicator-size-current, var(--xh-space-5));
639
686
  }
640
687
  }
@@ -666,13 +713,14 @@
666
713
  }
667
714
 
668
715
  @layer xihan.motion {
716
+ /* 进度条从整条裁掉长到整条露出:只重绘、不重排,裁口取填充条自己的圆角 */
669
717
  @keyframes xh-carousel-indicator-progress {
670
718
  from {
671
- scale: var(--xh-_carousel-progress-from);
719
+ clip-path: inset(var(--xh-_carousel-progress-cut) round var(--xh-_carousel-progress-radius));
672
720
  }
673
721
 
674
722
  to {
675
- scale: var(--xh-_carousel-progress-to);
723
+ clip-path: inset(0 round var(--xh-_carousel-progress-radius));
676
724
  }
677
725
  }
678
726
  }
@@ -109,7 +109,7 @@
109
109
  }
110
110
 
111
111
  /* 裁切出来的形状画不出空心:隐藏的项改为淡出,名字的删除线与次级字色照常 */
112
- [data-scope='cartesian-chart'][data-part='legend-item'][aria-pressed='false'] > [data-part='legend-swatch'][data-mark='point']:not([data-symbol='circle'], [data-symbol='square']) {
112
+ [data-scope='cartesian-chart'][data-part='legend-item'][aria-pressed='false'] > [data-part='legend-swatch'][data-mark='point']:where([data-scope='cartesian-chart']):not([data-symbol='circle'], [data-symbol='square']) {
113
113
  background: var(--xh-_chart-series);
114
114
  opacity: var(--xh-chart-dim-alpha);
115
115
  }
@@ -241,7 +241,7 @@
241
241
  cursor: grab;
242
242
  }
243
243
 
244
- [data-scope='cartesian-chart'][data-part='zoom-slider'][data-dragging] [data-part='zoom-window'] {
244
+ [data-scope='cartesian-chart'][data-part='zoom-slider'][data-dragging] [data-part='zoom-window']:where([data-scope='cartesian-chart']) {
245
245
  cursor: grabbing;
246
246
  }
247
247
 
@@ -633,15 +633,15 @@
633
633
 
634
634
  /* —— 纹理:颜色不可用或不可靠时(强制色、打印、祖先写了 data-xh-chart-patterns),柱与面积改用本系列在
635
635
  defs 里的纹理填充、描出轮廓,折线换线型;压在柱上的标签改用标签色、描一圈承载面色。色标的纹理在配方里 —— */
636
- :where([data-xh-chart-patterns]) [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='bar'],
637
- :where([data-xh-chart-patterns]) [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='area-fill'] {
636
+ :where([data-xh-chart-patterns]) [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='bar']:where([data-scope='cartesian-chart']),
637
+ :where([data-xh-chart-patterns]) [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='area-fill']:where([data-scope='cartesian-chart']) {
638
638
  fill: var(--xh-_chart-pattern);
639
639
  fill-opacity: 1;
640
640
  stroke: var(--xh-_chart-series);
641
641
  stroke-width: var(--xh-stroke-thin);
642
642
  }
643
643
 
644
- :where([data-xh-chart-patterns]) [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='line']:not([data-drawing]) {
644
+ :where([data-xh-chart-patterns]) [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='line']:where([data-scope='cartesian-chart']):not([data-drawing]) {
645
645
  stroke-dasharray: var(--xh-_chart-dash);
646
646
  }
647
647
 
@@ -775,8 +775,8 @@
775
775
  stroke: Highlight;
776
776
  }
777
777
 
778
- [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='bar'],
779
- [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='area-fill'] {
778
+ [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='bar']:where([data-scope='cartesian-chart']),
779
+ [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='area-fill']:where([data-scope='cartesian-chart']) {
780
780
  forced-color-adjust: none;
781
781
  fill: var(--xh-_chart-pattern);
782
782
  fill-opacity: 1;
@@ -784,7 +784,7 @@
784
784
  stroke-width: var(--xh-stroke-thin);
785
785
  }
786
786
 
787
- [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='line']:not([data-drawing]) {
787
+ [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='line']:where([data-scope='cartesian-chart']):not([data-drawing]) {
788
788
  stroke-dasharray: var(--xh-_chart-dash);
789
789
  }
790
790
 
@@ -803,15 +803,15 @@
803
803
  display: none;
804
804
  }
805
805
 
806
- [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='bar'],
807
- [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='area-fill'] {
806
+ [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='bar']:where([data-scope='cartesian-chart']),
807
+ [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='area-fill']:where([data-scope='cartesian-chart']) {
808
808
  fill: var(--xh-_chart-pattern);
809
809
  fill-opacity: 1;
810
810
  stroke: var(--xh-_chart-series);
811
811
  stroke-width: var(--xh-stroke-thin);
812
812
  }
813
813
 
814
- [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='line']:not([data-drawing]) {
814
+ [data-scope='cartesian-chart'][data-xh-chart-pattern] > [data-part='line']:where([data-scope='cartesian-chart']):not([data-drawing]) {
815
815
  stroke-dasharray: var(--xh-_chart-dash);
816
816
  }
817
817