@xihan-ui/styles 3.0.0 → 3.2.0

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