@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
@@ -0,0 +1,447 @@
1
+ /*
2
+ * Copyright (c) 2021-Present XiHanFun and contributors.
3
+ * Licensed under the MIT License. See LICENSE in the project root for license information.
4
+ */
5
+
6
+ /* 定义 pagination 样式。 */
7
+
8
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立;四类格子接 Action Control 配方,同理 */
9
+ @import '../family/motion.css';
10
+ @import '../family/action-control.css';
11
+ @import '../family/field-chrome.css';
12
+
13
+ @layer xihan.components {
14
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
15
+ .xh-scope-pagination {
16
+ --xh-pagination-skin: 1;
17
+ }
18
+
19
+ /* 私有槽同时声明在根与 positioner 上:摊开的页码面板被搬到 portal 落点,
20
+ 不是根的后代,继承不过去。面板里的页码格子与主区那排消费的是同一批槽 */
21
+ .xh-scope-pagination:is([data-part='root'], [data-part='positioner']) {
22
+ /* 作者塞进面板或分页行里的图标按档取字形尺;四类格子上另按家族档位取同一把尺 */
23
+ --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-glyph-size-md));
24
+
25
+ /* 尺寸档只换这几个私有槽,上一页/下一页、页码与省略号都从这两处继承它们,
26
+ 换档不必给每个部件各写一条选择器。格子的横内衬比控件尺窄一档:一位数的页码加两侧内衬
27
+ 要收得进方格的最小宽度,格子才是正方的;跳页输入框是字段,仍取控件尺的横内衬 */
28
+ --xh-_pagination-item-size: var(--xh-control-h-md);
29
+ --xh-_pagination-item-px: var(--xh-space-2);
30
+ --xh-_pagination-jumper-px: var(--xh-control-px-md);
31
+ --xh-_pagination-font-size: var(--xh-control-font-md);
32
+
33
+ /* 当前页的选中态随语气走。没写 data-tone 时这几个 --xh-_tone-* 都没被声明,
34
+ 退回原来的品牌底与其配色。聚焦环不在其列,它恒是 --xh-ring-focus */
35
+ --xh-_pagination-selected-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
36
+ --xh-_pagination-selected-bg-hover: var(--xh-_tone-subtle-hover, var(--xh-bg-brand-subtle-hover));
37
+ --xh-_pagination-selected-bg-active: var(--xh-_tone-subtle-active, var(--xh-bg-brand-subtle-active));
38
+ --xh-_pagination-selected-fg: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
39
+ --xh-_pagination-selected-border: var(--xh-_tone-border-control, var(--xh-bg-brand));
40
+ /* 当前页那一格是实心底,顶边画一条极浅的内高光把它衬出厚度(solid 面允许顶高光,经家族的 highlight 槽画) */
41
+ }
42
+
43
+ /* 根节点是 nav 地标,只负责把上一页 / 页码 / 下一页排成一行。
44
+ 页数为 0 时连接层会打 data-empty,这里不拿它做隐藏:作者常把「第 x-y 条」这类
45
+ 区间回显也写在 nav 里,整块藏掉会连那行字一起吞了,是否隐藏交给作者决定 */
46
+ .xh-scope-pagination[data-part='root'] {
47
+ display: flex;
48
+ align-items: center;
49
+ /* 页码多到一行放不下就换行,宁可折行也不要把按钮压扁或撑出横向滚动 */
50
+ flex-wrap: wrap;
51
+ gap: var(--xh-pagination-gap, var(--xh-space-1));
52
+ }
53
+
54
+ /* —— 尺寸 —— */
55
+ /* 缺省档写在上面的基础规则里。格子高度、内边距、字号三者各走控件尺的同一档;
56
+ 页码格子靠最小宽度撑等宽,内边距只在页码超出最小宽度时才起作用 */
57
+ .xh-scope-pagination:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
58
+ --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-glyph-size-sm));
59
+ --xh-_pagination-item-size: var(--xh-control-h-sm);
60
+ --xh-_pagination-item-px: var(--xh-space-1_5);
61
+ --xh-_pagination-jumper-px: var(--xh-control-px-sm);
62
+ --xh-_pagination-font-size: var(--xh-control-font-sm);
63
+ }
64
+
65
+ .xh-scope-pagination:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
66
+ --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-glyph-size-lg));
67
+ --xh-_pagination-item-size: var(--xh-control-h-lg);
68
+ --xh-_pagination-item-px: var(--xh-space-2_5);
69
+ --xh-_pagination-jumper-px: var(--xh-control-px-lg);
70
+ --xh-_pagination-font-size: var(--xh-control-font-lg);
71
+ }
72
+
73
+ .xh-scope-pagination[data-part='root'][hidden] {
74
+ display: none;
75
+ }
76
+
77
+ /* 各类格子接 Action Control 的 text 档(连接层投影 ghost 形态):盒型、三档几何、禁用面、按压与过渡都由家族给。
78
+ 分页把每一格画成描边方块:静息一道装饰边、透明底,悬停边加深一档、字转正文色,底走家族的承载面阶梯;
79
+ 省略位也占同样一格,几种格子内容盒等高,一行里对得齐。这里把使用者槽映射到桥接槽并保留分页自己的排版。
80
+ 等宽的关键:1 与 10 的内容宽度不同,靠最小宽度把它们撑到同一格,行宽才不会随当前页左右抖动 */
81
+ .xh-scope-pagination[data-part='first-trigger'],
82
+ .xh-scope-pagination[data-part='prev-trigger'],
83
+ .xh-scope-pagination[data-part='next-trigger'],
84
+ .xh-scope-pagination[data-part='last-trigger'],
85
+ .xh-scope-pagination[data-part='item'],
86
+ .xh-scope-pagination[data-part='ellipsis-trigger'] {
87
+ --xh-action-min-inline-size: var(--xh-pagination-item-min-size, var(--xh-_pagination-item-size));
88
+ --xh-action-visual-size: var(--xh-pagination-item-h, var(--xh-_pagination-item-size));
89
+ --xh-action-padding-inline: var(--xh-pagination-item-px, var(--xh-_pagination-item-px));
90
+ --xh-action-radius: var(--xh-pagination-item-radius, var(--xh-shape-surface));
91
+ --xh-action-font-size: var(--xh-pagination-font-size, var(--xh-_pagination-font-size));
92
+ --xh-action-bg-rest: var(--xh-pagination-item-bg, var(--xh-_action-variant-bg-rest));
93
+ --xh-action-bg-hover: var(--xh-pagination-item-bg-hover, var(--xh-_action-variant-bg-hover));
94
+ --xh-action-bg-pressed: var(--xh-pagination-item-bg-active, var(--xh-_action-variant-bg-pressed));
95
+ --xh-action-border-rest: var(--xh-pagination-item-border, var(--xh-border-default));
96
+ --xh-action-border-hover: var(--xh-pagination-item-border-hover, var(--xh-border-strong));
97
+ --xh-action-border-pressed: var(--xh-pagination-item-border-hover, var(--xh-border-strong));
98
+ --xh-action-border-focus-visible: var(--xh-pagination-item-border, var(--xh-border-default));
99
+ --xh-action-border-disabled: var(--xh-pagination-item-border, var(--xh-border-default));
100
+ --xh-action-fg-rest: var(--xh-pagination-item-fg, var(--xh-_action-variant-fg-rest));
101
+ --xh-action-fg-hover: var(--xh-pagination-item-fg, var(--xh-fg-default));
102
+ --xh-action-fg-pressed: var(--xh-pagination-item-fg, var(--xh-fg-default));
103
+ /* 作者塞进翻页钮的图标按档取字形尺,与皮肤画的兜底字形同一把尺 */
104
+ --xh-icon-size: var(--xh-pagination-icon-size, var(--xh-_action-profile-glyph-size));
105
+
106
+ flex: none;
107
+ font-weight: var(--xh-pagination-item-font-weight, var(--xh-text-label-weight));
108
+ /* 等宽数字:1 与 7 的字形宽度在比例字体里并不相同,不定住会让同位数页码抖一格 */
109
+ font-variant-numeric: tabular-nums;
110
+ }
111
+
112
+ .xh-scope-pagination[data-part='first-trigger'][hidden],
113
+ .xh-scope-pagination[data-part='prev-trigger'][hidden],
114
+ .xh-scope-pagination[data-part='next-trigger'][hidden],
115
+ .xh-scope-pagination[data-part='last-trigger'][hidden],
116
+ .xh-scope-pagination[data-part='item'][hidden],
117
+ .xh-scope-pagination[data-part='ellipsis-trigger'][hidden] {
118
+ display: none;
119
+ }
120
+
121
+ /* 到头那一侧的翻页钮是原生 disabled(不可聚焦、进不了 Tab 序列),连接层同时给 data-disabled,
122
+ 家族按 data-disabled 画禁用面(透明底 + --xh-fg-disabled);整组 disabled 时页码与省略位同样如此 */
123
+
124
+ /* 当前页:data-current 与 aria-current='page' 由连接层成对给出,样式挂在 data 钩子上,无障碍语义留给 aria。
125
+ 品牌描边 + 品牌淡底 + 淡底前景、不加粗——字重一变字形就变宽,页码格子会跟着长一点,正是这里要避免的抖动;
126
+ 悬停 / 按下沿淡底 12% → 20% → 28% 走,边不变,三态都经桥接槽交给家族画 */
127
+ .xh-scope-pagination[data-part='item'][data-current] {
128
+ --xh-action-bg-rest: var(--xh-pagination-item-bg-selected, var(--xh-_pagination-selected-bg));
129
+ --xh-action-bg-hover: var(--xh-pagination-item-bg-selected-hover, var(--xh-_pagination-selected-bg-hover));
130
+ --xh-action-bg-pressed: var(--xh-pagination-item-bg-selected-active, var(--xh-_pagination-selected-bg-active));
131
+ --xh-action-bg-focus-visible: var(--xh-pagination-item-bg-selected, var(--xh-_pagination-selected-bg));
132
+ --xh-action-fg-rest: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
133
+ --xh-action-fg-hover: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
134
+ --xh-action-fg-pressed: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
135
+ --xh-action-fg-focus-visible: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
136
+ --xh-action-border-rest: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-border));
137
+ --xh-action-border-hover: var(--xh-pagination-item-border-selected-hover, var(--xh-_pagination-selected-border));
138
+ --xh-action-border-pressed: var(--xh-pagination-item-border-selected-active, var(--xh-_pagination-selected-border));
139
+ --xh-action-border-focus-visible: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-border));
140
+ --xh-action-shadow-rest: var(--xh-pagination-item-shadow, none);
141
+ --xh-action-shadow-hover: var(--xh-pagination-item-shadow, none);
142
+ --xh-action-shadow-pressed: var(--xh-pagination-item-shadow, none);
143
+ --xh-action-shadow-focus-visible: var(--xh-pagination-item-shadow, none);
144
+ }
145
+
146
+ /* 整组禁用时当前页不跟着透明:品牌淡底退成中性淡底、字取禁用色,格子仍标得出位置,又一眼看得出按不动 */
147
+ .xh-scope-pagination[data-part='item'][data-current][data-disabled] {
148
+ --xh-action-bg-disabled: var(--xh-bg-subtle);
149
+ --xh-action-border-disabled: var(--xh-bg-subtle);
150
+ }
151
+
152
+ /* 省略位是可展开的按钮:折进去的那几页只有它一个入口,指针与键盘都得点得到,
153
+ 所以它与页码同一副骨架、同一条阶梯。这里只把字色压淡一档与页码区分开,三态都压——
154
+ 家族的悬停 / 按下规则比基础块特定,只映射静息那一支会在悬停时被换回缺省字色 */
155
+ .xh-scope-pagination[data-part='ellipsis-trigger'] {
156
+ --xh-action-fg-rest: var(--xh-pagination-ellipsis-trigger-fg, var(--xh-fg-subtle));
157
+ --xh-action-fg-hover: var(--xh-pagination-ellipsis-trigger-fg, var(--xh-fg-subtle));
158
+ --xh-action-fg-pressed: var(--xh-pagination-ellipsis-trigger-fg, var(--xh-fg-subtle));
159
+ }
160
+ /* 每页条数控制器的挂载点:里头装的是库里的 select,控件本身的描边、底色、聚焦环与
161
+ 浮层都归 select 那份皮肤,这一格只把它摆进分页行。
162
+ 在分页行里按内容定宽:选项是「10 条 / 页」一类短串,字段缺省宽在这一行里过宽;
163
+ 地板一并放开,盒子刚好装下回显与箭头 */
164
+ .xh-scope-pagination[data-part='page-size-select'] {
165
+ --xh-select-control-w: var(--xh-pagination-page-size-select-w, max-content);
166
+ --xh-select-control-min-w: 0px;
167
+
168
+ display: inline-flex;
169
+ flex: none;
170
+ align-items: center;
171
+ }
172
+
173
+ .xh-scope-pagination[data-part='page-size-select'][hidden] {
174
+ display: none;
175
+ }
176
+
177
+ /* 信息区:一段次要文字,与页码格子同一条基线 */
178
+ .xh-scope-pagination[data-part='summary'] {
179
+ display: inline-flex;
180
+ flex: none;
181
+ align-items: center;
182
+ block-size: var(--xh-pagination-item-h, var(--xh-_pagination-item-size));
183
+ color: var(--xh-pagination-summary-fg, var(--xh-fg-muted));
184
+ font-size: var(--xh-pagination-font-size, var(--xh-_pagination-font-size));
185
+ line-height: var(--xh-leading-none);
186
+ white-space: nowrap;
187
+ }
188
+
189
+ .xh-scope-pagination[data-part='summary'][hidden] {
190
+ display: none;
191
+ }
192
+
193
+ /* 跳页输入框自身就是字段外壳(连接层投影 data-xh-field-chrome):静息描边、悬停升控件悬停边、
194
+ 聚焦换聚焦边加环、禁用面都由字段家族给,这里只把使用者槽映到家族桥接槽,
195
+ 高度、内衬与圆角跟页码格子同一把尺,宽度按页码位数留够 */
196
+ .xh-scope-pagination[data-part='jumper'] {
197
+ --xh-field-control-height: var(--xh-pagination-item-h, var(--xh-_pagination-item-size));
198
+ --xh-field-control-padding-inline: var(--xh-pagination-item-px, var(--xh-_pagination-jumper-px));
199
+ --xh-field-control-min-inline-size: 0;
200
+ --xh-field-control-radius: var(--xh-pagination-item-radius, var(--xh-shape-control));
201
+ --xh-field-bg-rest: var(--xh-pagination-jumper-bg, var(--xh-_field-variant-bg-rest));
202
+ --xh-field-bg-hover: var(--xh-pagination-jumper-bg-hover, var(--xh-_field-variant-bg-hover));
203
+ --xh-field-bg-disabled: var(--xh-pagination-jumper-bg-disabled, var(--xh-_field-variant-bg-disabled));
204
+ --xh-field-fg-rest: var(--xh-pagination-item-fg, var(--xh-fg-default));
205
+ --xh-field-border-rest: var(--xh-pagination-jumper-border, var(--xh-_field-variant-border-rest));
206
+ --xh-field-border-hover: var(--xh-pagination-jumper-border-hover, var(--xh-_field-variant-border-hover));
207
+ --xh-field-border-focus: var(--xh-pagination-jumper-border-focus, var(--xh-_field-variant-border-focus));
208
+ --xh-field-border-invalid: var(--xh-pagination-jumper-border-invalid, var(--xh-_field-variant-border-invalid));
209
+ --xh-field-shadow-rest: none;
210
+
211
+ flex: none;
212
+ inline-size: var(--xh-pagination-jumper-w, calc(var(--xh-space-8) * 2));
213
+ /* 表单控件不继承页面字体,只给字号会让框里用 UA 默认字族 */
214
+ font-family: inherit;
215
+ font-size: var(--xh-pagination-font-size, var(--xh-_pagination-font-size));
216
+ line-height: var(--xh-leading-none);
217
+ appearance: none;
218
+ }
219
+
220
+ .xh-scope-pagination[data-part='jumper'][hidden] {
221
+ display: none;
222
+ }
223
+
224
+ /* 越界的页码(超出 1 到总页数):浏览器的约束校验在用户动过之后判失败,与字段家族的校验失败同一副边。
225
+ 家族的失败档认 data-invalid,跳页框的取值不进状态机,失败由原生约束给出 */
226
+ .xh-scope-pagination[data-part='jumper']:user-invalid {
227
+ border-color: var(--xh-field-border-invalid, var(--xh-_field-variant-border-invalid));
228
+ }
229
+
230
+ /* 摊开省略位的定位层。三处坐标系必须同为 fixed:机器交给引擎的 strategy、
231
+ 连接层的内联 position、这里 —— 差一处就会算在错的坐标系里 */
232
+ .xh-scope-pagination[data-part='positioner'] {
233
+ /* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,面板继承它限高;
234
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时不额外限高 */
235
+ --xh-_pagination-available-h: 100vh;
236
+ /* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,行内轴据此夹取;
237
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
238
+ --xh-_pagination-available-w: 100vw;
239
+
240
+ /* 页码面板的自绘条浮在内容之上:轨道不上底色,实色轨道会在面板右缘糊一条竖灰带 */
241
+ --xh-scrollbar-track-bg: transparent;
242
+
243
+ /* 面板从锚点一侧短移入,方向按实际落位只激活一支 */
244
+ --xh-_overlay-enter-up: 0;
245
+ --xh-_overlay-enter-down: 0;
246
+ --xh-_overlay-enter-left: 0;
247
+ --xh-_overlay-enter-right: 0;
248
+
249
+ position: fixed;
250
+ z-index: var(--xh-pagination-layer, var(--xh-_layer, var(--xh-layer-popover)));
251
+ /* 空壳不吃指针:省略位与面板之间那段间隙要能点得穿 */
252
+ pointer-events: none;
253
+ }
254
+
255
+ /* 物理 placement 与定位引擎同一套,不随书写方向翻 */
256
+ .xh-scope-pagination[data-part='positioner'][data-placement^='top'] {
257
+ --xh-_overlay-enter-down: 1;
258
+ }
259
+
260
+ .xh-scope-pagination[data-part='positioner'][data-placement^='bottom'] {
261
+ --xh-_overlay-enter-up: 1;
262
+ }
263
+
264
+ .xh-scope-pagination[data-part='positioner'][data-placement^='left'] {
265
+ --xh-_overlay-enter-right: 1;
266
+ }
267
+
268
+ .xh-scope-pagination[data-part='positioner'][data-placement^='right'] {
269
+ --xh-_overlay-enter-left: 1;
270
+ }
271
+
272
+ /* 锚点被滚出可视区:整个浮层随之收起 */
273
+ .xh-scope-pagination[data-part='positioner'][data-hidden] {
274
+ visibility: hidden;
275
+ }
276
+
277
+ /* 摊开的页码面板:一串页码格子,横着排、必要时折行 */
278
+ .xh-scope-pagination[data-part='content'] {
279
+ display: flex;
280
+ flex-flow: row wrap;
281
+ gap: var(--xh-pagination-gap, var(--xh-space-1));
282
+ /* 页码不可预知有多少:不限高就整块伸出视口且滚不到 */
283
+ /* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的内容就点不到了 */
284
+ max-inline-size: min(var(--xh-pagination-content-max-w, var(--xh-overlay-max-w)), var(--xh-_pagination-available-w));
285
+ max-block-size: min(
286
+ var(--xh-pagination-content-max-h, var(--xh-overlay-max-h)),
287
+ var(--xh-_pagination-available-h)
288
+ );
289
+ overflow-y: auto;
290
+ /* 浮层滚动面:滚到底不把滚动量交给页面(只给 Overlay 家族滚动面) */
291
+ overscroll-behavior: contain;
292
+ padding: var(--xh-pagination-content-p, var(--xh-space-1));
293
+ border: var(--xh-stroke-thin) solid var(--xh-pagination-content-border, var(--xh-border-default));
294
+ border-radius: var(--xh-pagination-content-radius, var(--xh-shape-overlay));
295
+ background: var(--xh-pagination-content-bg, var(--xh-bg-surface));
296
+ box-shadow: var(--xh-pagination-content-shadow, var(--xh-elevation-floating));
297
+ /* 定位层不吃指针,面板本体必须吃:里面的页码要点得到 */
298
+ pointer-events: auto;
299
+ }
300
+
301
+ /* 摊开的页码面板锚定在省略位上、从中挑一页,与菜单同属锚定列表:从锚点一侧短移淡入,不缩放 */
302
+ .xh-scope-pagination[data-part='content'][data-state='open'] {
303
+ animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
304
+ }
305
+
306
+ /* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
307
+ 免得动画结束到真收起之间闪一下原样 */
308
+ .xh-scope-pagination[data-part='content'][data-state='closed'] {
309
+ animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
310
+ }
311
+
312
+ /* 这里刻意没有 [data-part='content'][hidden] { display: none }:
313
+ 补了退场就一帧都播不出来,真正的收起由适配器落成内联 display */
314
+
315
+ /* 没写内容就由皮肤画兜底字形:上一页 / 下一页默认就是两枚箭头,首页 / 末页是两枚双箭头,
316
+ 作者往部件里塞了自己的图形或文字,这几条即不命中 */
317
+ .xh-scope-pagination[data-part='first-trigger']:empty::before,
318
+ .xh-scope-pagination[data-part='last-trigger']:empty::before {
319
+ content: '';
320
+ display: inline-block;
321
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
322
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
323
+ vertical-align: var(--xh-glyph-baseline-shift);
324
+ background-color: currentColor;
325
+ -webkit-mask: var(--xh-glyph-mark-chevrons-left) center / contain no-repeat;
326
+ mask: var(--xh-glyph-mark-chevrons-left) center / contain no-repeat;
327
+ }
328
+
329
+ .xh-scope-pagination[data-part='last-trigger']:empty::before {
330
+ -webkit-mask-image: var(--xh-glyph-mark-chevrons-right);
331
+ mask-image: var(--xh-glyph-mark-chevrons-right);
332
+ }
333
+
334
+ .xh-scope-pagination[data-part='prev-trigger']:empty::before {
335
+ content: '';
336
+ display: inline-block;
337
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
338
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
339
+ vertical-align: var(--xh-glyph-baseline-shift);
340
+ background-color: currentColor;
341
+ -webkit-mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
342
+ mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
343
+ }
344
+
345
+ .xh-scope-pagination[data-part='next-trigger']:empty::before {
346
+ content: '';
347
+ display: inline-block;
348
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
349
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
350
+ vertical-align: var(--xh-glyph-baseline-shift);
351
+ background-color: currentColor;
352
+ -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
353
+ mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
354
+ }
355
+
356
+ /* 省略位不写内容时画三点:折进去那几页的入口,空着就是一格看不出能点的空白 */
357
+ .xh-scope-pagination[data-part='ellipsis-trigger']:empty::before {
358
+ content: '';
359
+ display: inline-block;
360
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
361
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
362
+ vertical-align: var(--xh-glyph-baseline-shift);
363
+ background-color: currentColor;
364
+ -webkit-mask: var(--xh-glyph-mark-ellipsis) center / contain no-repeat;
365
+ mask: var(--xh-glyph-mark-ellipsis) center / contain no-repeat;
366
+ }
367
+
368
+ /* rtl 下页序从右往左走,箭头跟着指向行进方向 */
369
+ [dir='rtl'] .xh-scope-pagination[data-part='prev-trigger']:empty::before {
370
+ -webkit-mask-image: var(--xh-glyph-mark-chevron-right);
371
+ mask-image: var(--xh-glyph-mark-chevron-right);
372
+ }
373
+
374
+ [dir='rtl'] .xh-scope-pagination[data-part='next-trigger']:empty::before {
375
+ -webkit-mask-image: var(--xh-glyph-mark-chevron-left);
376
+ mask-image: var(--xh-glyph-mark-chevron-left);
377
+ }
378
+
379
+ [dir='rtl'] .xh-scope-pagination[data-part='first-trigger']:empty::before {
380
+ -webkit-mask-image: var(--xh-glyph-mark-chevrons-right);
381
+ mask-image: var(--xh-glyph-mark-chevrons-right);
382
+ }
383
+
384
+ [dir='rtl'] .xh-scope-pagination[data-part='last-trigger']:empty::before {
385
+ -webkit-mask-image: var(--xh-glyph-mark-chevrons-left);
386
+ mask-image: var(--xh-glyph-mark-chevrons-left);
387
+ }
388
+
389
+ /* 手指落点:命中区由绝对定位的伪元素向块轴两侧外扩,格子的盒一点不动——
390
+ 加高格子会把整条 nav 撑高,行宽也会跟着当前页抖。
391
+ 只扩块轴:格与格在行内轴上只隔一格间距,往两侧扩会与相邻格的命中区叠上。
392
+ 取 8px 是按最矮的 sm 档算的(28 + 8 × 2 = 44),md 与 lg 档更宽裕。
393
+ 用 ::after:::before 已经被两枚箭头的兜底字形占着 */
394
+ @media (pointer: coarse) {
395
+ .xh-scope-pagination[data-part='first-trigger'],
396
+ .xh-scope-pagination[data-part='prev-trigger'],
397
+ .xh-scope-pagination[data-part='next-trigger'],
398
+ .xh-scope-pagination[data-part='last-trigger'],
399
+ .xh-scope-pagination[data-part='item'] {
400
+ position: relative;
401
+ }
402
+
403
+ .xh-scope-pagination[data-part='first-trigger']::after,
404
+ .xh-scope-pagination[data-part='prev-trigger']::after,
405
+ .xh-scope-pagination[data-part='next-trigger']::after,
406
+ .xh-scope-pagination[data-part='last-trigger']::after,
407
+ .xh-scope-pagination[data-part='item']::after {
408
+ content: '';
409
+ position: absolute;
410
+ inset-block: -8px;
411
+ inset-inline: 0;
412
+ }
413
+ }
414
+
415
+ @media print {
416
+ /* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
417
+ 收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
418
+ .xh-scope-pagination[data-part='positioner'] {
419
+ display: none;
420
+ }
421
+
422
+ /* 打印默认丢背景:当前页那格的实心底印不出来,一排页码看上去完全一样。
423
+ 改用字重表达同一件事——常态之所以不加粗是怕格子变宽、行宽跟着抖,纸上没有这回事 */
424
+ .xh-scope-pagination[data-part='item'][data-current] {
425
+ font-weight: var(--xh-font-weight-semibold);
426
+ }
427
+ }
428
+
429
+ @media (forced-colors: active) {
430
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
431
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
432
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
433
+ 禁用取 GrayText */
434
+ .xh-scope-pagination:is([data-part='first-trigger'], [data-part='last-trigger'], [data-part='prev-trigger'], [data-part='next-trigger'], [data-part='ellipsis-trigger']):empty::before {
435
+ forced-color-adjust: none;
436
+ background-color: ButtonText;
437
+ }
438
+
439
+ .xh-scope-pagination:is([data-part='first-trigger'], [data-part='last-trigger'], [data-part='prev-trigger'], [data-part='next-trigger'], [data-part='ellipsis-trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
440
+ background-color: HighlightText;
441
+ }
442
+
443
+ .xh-scope-pagination:is([data-part='first-trigger'], [data-part='last-trigger'], [data-part='prev-trigger'], [data-part='next-trigger'], [data-part='ellipsis-trigger'])[data-disabled]:empty::before {
444
+ background-color: GrayText;
445
+ }
446
+ }
447
+ }