@xihan-ui/styles 1.0.0-alpha.2 → 1.0.0-alpha.3

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 (118) hide show
  1. package/CHANGELOG.md +447 -0
  2. package/README.md +1 -1
  3. package/css/accordion.css +56 -5
  4. package/css/alert.css +30 -5
  5. package/css/anchor.css +7 -7
  6. package/css/avatar-group.css +3 -3
  7. package/css/avatar.css +3 -3
  8. package/css/back-top.css +16 -1
  9. package/css/badge.css +16 -2
  10. package/css/breadcrumb.css +24 -4
  11. package/css/button-group.css +14 -13
  12. package/css/button.css +42 -11
  13. package/css/calendar.css +119 -2
  14. package/css/card.css +5 -5
  15. package/css/carousel.css +36 -5
  16. package/css/cascader.css +183 -102
  17. package/css/checkbox-group.css +41 -19
  18. package/css/checkbox.css +54 -8
  19. package/css/clipboard.css +2 -1
  20. package/css/code-block.css +12 -7
  21. package/css/collapsible.css +42 -2
  22. package/css/color-picker.css +111 -45
  23. package/css/combobox.css +114 -53
  24. package/css/composer.css +5 -3
  25. package/css/context-menu.css +97 -69
  26. package/css/date-field.css +91 -14
  27. package/css/date-picker.css +276 -65
  28. package/css/descriptions.css +2 -2
  29. package/css/dialog.css +40 -13
  30. package/css/download-trigger.css +76 -0
  31. package/css/drawer.css +45 -14
  32. package/css/dynamic-input.css +68 -17
  33. package/css/editable.css +12 -10
  34. package/css/ellipsis.css +1 -1
  35. package/css/empty-state.css +7 -7
  36. package/css/field.css +9 -6
  37. package/css/fieldset.css +69 -0
  38. package/css/file-upload.css +45 -7
  39. package/css/float-button.css +16 -1
  40. package/css/floating-panel.css +310 -0
  41. package/css/form.css +4 -4
  42. package/css/heatmap.css +410 -0
  43. package/css/highlight.css +1 -1
  44. package/css/hotkeys.css +90 -0
  45. package/css/hover-card.css +40 -45
  46. package/css/image-cropper.css +231 -0
  47. package/css/image-viewer.css +137 -12
  48. package/css/image.css +2 -2
  49. package/css/infinite-scroll.css +1 -1
  50. package/css/json-viewer.css +241 -0
  51. package/css/layout.css +6 -10
  52. package/css/list.css +8 -8
  53. package/css/listbox.css +20 -4
  54. package/css/loading-bar.css +7 -1
  55. package/css/log.css +1 -1
  56. package/css/marquee.css +9 -0
  57. package/css/masonry.css +63 -0
  58. package/css/mention.css +87 -33
  59. package/css/menu.css +113 -47
  60. package/css/menubar.css +146 -60
  61. package/css/navigation-menu.css +54 -29
  62. package/css/number-animation.css +3 -3
  63. package/css/number-field.css +173 -16
  64. package/css/overlay-arrow.css +51 -0
  65. package/css/page-header.css +5 -5
  66. package/css/pagination.css +13 -13
  67. package/css/password-input.css +356 -0
  68. package/css/pin-input.css +13 -10
  69. package/css/popconfirm.css +46 -10
  70. package/css/popover.css +70 -45
  71. package/css/popselect.css +183 -53
  72. package/css/progress.css +47 -7
  73. package/css/qr-code.css +1 -1
  74. package/css/radio-group.css +14 -8
  75. package/css/rating.css +2 -2
  76. package/css/reset.css +17 -0
  77. package/css/result.css +6 -6
  78. package/css/scroll-area.css +61 -89
  79. package/css/scrollbar.css +167 -0
  80. package/css/segmented.css +215 -0
  81. package/css/select.css +274 -125
  82. package/css/separator.css +2 -2
  83. package/css/side-nav.css +111 -19
  84. package/css/signature-pad.css +144 -0
  85. package/css/skeleton.css +7 -1
  86. package/css/slider.css +10 -10
  87. package/css/space.css +117 -0
  88. package/css/spinner.css +22 -10
  89. package/css/statistic.css +9 -9
  90. package/css/steps.css +25 -8
  91. package/css/switch.css +48 -6
  92. package/css/table.css +131 -37
  93. package/css/tabs.css +4 -4
  94. package/css/tag.css +177 -0
  95. package/css/tags-input.css +78 -40
  96. package/css/text-field.css +149 -36
  97. package/css/thread.css +1 -1
  98. package/css/time-field.css +97 -16
  99. package/css/time-picker.css +259 -69
  100. package/css/timeline.css +10 -10
  101. package/css/timer.css +119 -0
  102. package/css/toast.css +34 -10
  103. package/css/toaster.css +1 -1
  104. package/css/toggle.css +6 -6
  105. package/css/tone.css +10 -5
  106. package/css/toolbar.css +1 -1
  107. package/css/tooltip.css +36 -33
  108. package/css/tour.css +103 -58
  109. package/css/transfer.css +68 -17
  110. package/css/tree-select.css +185 -84
  111. package/css/tree.css +85 -1
  112. package/css/typography.css +4 -4
  113. package/css/undefined.css +11 -1
  114. package/css/virtualizer.css +3 -1
  115. package/css/watermark.css +1 -2
  116. package/index.css +17 -0
  117. package/index.unlayered.css +8659 -2799
  118. package/package.json +19 -3
@@ -5,16 +5,25 @@
5
5
  }
6
6
 
7
7
  /* 与文本框同一套堆叠:标签一行、输入行一行。
8
- 加减钮与输入框中间那层包裹归作者,这里不碰,三者各自把高度对齐即可成一体 */
8
+ 输入框与加减钮放进 control 部件即得一体式:视觉盒画在 control 上,
9
+ 减在左、加在右、输入框居中,前后缀图标/文字可直接流式插在框内。
10
+ 不写 control 时退回旧式三件并排的观感(下方 input / 按钮的基础规则原样生效) */
9
11
  [data-scope='number-field'][data-part='root'] {
12
+ /* 作者塞进来的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准 */
13
+ --xh-icon-size: var(--xh-number-field-icon-size, var(--xh-glyph-size-md));
14
+
10
15
  /* 尺寸档只换这几个私有槽,标题、输入框与加减钮都从 root 继承它们,
11
16
  换档不必给每个部件各写一条选择器 */
12
17
  --xh-_number-field-h: var(--xh-control-h-md);
13
18
  --xh-_number-field-px: var(--xh-control-px-md);
19
+ --xh-_number-field-gap: var(--xh-control-gap-md);
14
20
  --xh-_number-field-font-size: var(--xh-text-body-size);
15
21
  --xh-_number-field-label-font-size: var(--xh-text-label-size);
16
22
  --xh-_number-field-trigger-font-size: var(--xh-text-body-size);
17
23
 
24
+ /* 盒子的圆角 */
25
+ --xh-_number-field-radius: var(--xh-number-field-input-radius, var(--xh-shape-control));
26
+
18
27
  /* 形态档只换这几个私有槽:输入框的底与描边,加减钮的底与描边 */
19
28
  --xh-_number-field-bg: var(--xh-bg-canvas);
20
29
  --xh-_number-field-border: var(--xh-border-control);
@@ -28,7 +37,7 @@
28
37
  /* 语气只落在聚焦这一处:环与聚焦态描边。框里的数字不归它管。
29
38
  没写 data-tone 时 --xh-_tone 没被声明,退回原来的聚焦环色与常态描边 */
30
39
  --xh-_number-field-ring: var(--xh-ring-focus);
31
- --xh-_number-field-border-focus: var(--xh-number-field-input-border, var(--xh-_tone, var(--xh-border-control)));
40
+ --xh-_number-field-border-focus: var(--xh-number-field-input-border, var(--xh-_tone, var(--xh-border-control-focus)));
32
41
 
33
42
  display: inline-flex;
34
43
  flex-direction: column;
@@ -43,19 +52,23 @@
43
52
  /* —— 尺寸 —— */
44
53
  /* 缺省档写在上面的基础规则里 */
45
54
  [data-scope='number-field'][data-part='root'][data-size='sm'] {
55
+ --xh-icon-size: var(--xh-number-field-icon-size, var(--xh-glyph-size-sm));
46
56
  --xh-_number-field-h: var(--xh-control-h-sm);
47
57
  --xh-_number-field-px: var(--xh-control-px-sm);
48
- --xh-_number-field-font-size: var(--xh-font-size-sm);
49
- --xh-_number-field-label-font-size: var(--xh-font-size-sm);
50
- --xh-_number-field-trigger-font-size: var(--xh-font-size-sm);
58
+ --xh-_number-field-gap: var(--xh-control-gap-sm);
59
+ --xh-_number-field-font-size: var(--xh-control-font-sm);
60
+ --xh-_number-field-label-font-size: var(--xh-control-font-sm);
61
+ --xh-_number-field-trigger-font-size: var(--xh-control-font-sm);
51
62
  }
52
63
 
53
64
  [data-scope='number-field'][data-part='root'][data-size='lg'] {
65
+ --xh-icon-size: var(--xh-number-field-icon-size, var(--xh-glyph-size-lg));
54
66
  --xh-_number-field-h: var(--xh-control-h-lg);
55
67
  --xh-_number-field-px: var(--xh-control-px-lg);
56
- --xh-_number-field-font-size: var(--xh-font-size-lg);
57
- --xh-_number-field-label-font-size: var(--xh-font-size-lg);
58
- --xh-_number-field-trigger-font-size: var(--xh-font-size-lg);
68
+ --xh-_number-field-gap: var(--xh-control-gap-lg);
69
+ --xh-_number-field-font-size: var(--xh-control-font-lg);
70
+ --xh-_number-field-label-font-size: var(--xh-control-font-lg);
71
+ --xh-_number-field-trigger-font-size: var(--xh-control-font-lg);
59
72
  }
60
73
 
61
74
  /* —— 形态 —— */
@@ -70,7 +83,7 @@
70
83
  --xh-_number-field-trigger-bg-active: var(--xh-bg-subtle-active);
71
84
  --xh-_number-field-trigger-border: var(--xh-border-control);
72
85
  --xh-_number-field-trigger-border-hover: var(--xh-border-control-hover);
73
- --xh-_number-field-border-focus: var(--xh-number-field-input-border, var(--xh-_tone, var(--xh-border-control)));
86
+ --xh-_number-field-border-focus: var(--xh-number-field-input-border, var(--xh-_tone, var(--xh-border-control-focus)));
74
87
  }
75
88
 
76
89
  /* 填充式:底色顶替描边表达边界。描边只退成透明而不去掉,1px 的位置留着,
@@ -84,10 +97,10 @@
84
97
  --xh-_number-field-trigger-bg-active: var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active));
85
98
  --xh-_number-field-trigger-border: transparent;
86
99
  --xh-_number-field-trigger-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
87
- --xh-_number-field-border-focus: var(--xh-_tone, var(--xh-border-control));
100
+ --xh-_number-field-border-focus: var(--xh-_tone, var(--xh-border-control-focus));
88
101
  }
89
102
 
90
- /* 无框:底与描边都透明,平时只看得见数字,悬停与聚焦才浮出边界 */
103
+ /* 无框:底与常态描边透明,悬停与聚焦浮出描边 */
91
104
  [data-scope='number-field'][data-part='root'][data-variant='ghost'] {
92
105
  --xh-_number-field-bg: transparent;
93
106
  --xh-_number-field-border: transparent;
@@ -97,7 +110,7 @@
97
110
  --xh-_number-field-trigger-bg-active: var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active));
98
111
  --xh-_number-field-trigger-border: transparent;
99
112
  --xh-_number-field-trigger-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
100
- --xh-_number-field-border-focus: var(--xh-_tone, var(--xh-border-control));
113
+ --xh-_number-field-border-focus: var(--xh-_tone, var(--xh-border-control-focus));
101
114
  }
102
115
 
103
116
  [data-scope='number-field'][data-part='label'] {
@@ -111,12 +124,130 @@
111
124
  color: var(--xh-number-field-label-fg-disabled, var(--xh-fg-subtle));
112
125
  }
113
126
 
127
+ /* —— 一体式 control:输入框与加减钮同框 —— */
128
+ /* control 是唯一的视觉盒:描边、底色、圆角、聚焦环全画在它身上,盒内三件都退成透明分段,
129
+ 整枚控件从头到尾只有这一道描边。减钮在前、input 居中、加钮在后(作者在模板里的顺序决定),
130
+ 前后缀内容直接流式插在框里。
131
+ focus-within 而不是 :focus 上的聚焦态:按钮也能触发聚焦环 */
132
+ [data-scope='number-field'][data-part='control'] {
133
+ position: relative;
134
+ display: inline-flex;
135
+ /* 居中而不是拉伸:作者插在框里的前后缀是一行文字,被拉满整框高度后字会贴着框顶 */
136
+ align-items: center;
137
+ gap: var(--xh-number-field-control-gap, var(--xh-_number-field-gap));
138
+ min-inline-size: var(--xh-number-field-control-min-w, var(--xh-control-min-w));
139
+ block-size: var(--xh-number-field-control-h, var(--xh-_number-field-h));
140
+ padding-inline: var(--xh-number-field-control-px, var(--xh-_number-field-px));
141
+ border: var(--xh-stroke-thin) solid var(--xh-number-field-input-border, var(--xh-_number-field-border));
142
+ border-radius: var(--xh-_number-field-radius);
143
+ background: var(--xh-number-field-input-bg, var(--xh-_number-field-bg));
144
+ transition: border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
145
+ }
146
+
147
+ [data-scope='number-field'][data-part='control']:hover:not([data-disabled], [data-invalid]) {
148
+ border-color: var(--xh-number-field-input-border-hover, var(--xh-_number-field-border-hover));
149
+ }
150
+
151
+ [data-scope='number-field'][data-part='control']:focus-within:not([data-disabled]) {
152
+ border-color: var(--xh-number-field-input-border-focus, var(--xh-_number-field-border-focus));
153
+ outline: var(--xh-ring-width) solid var(--xh-_number-field-ring);
154
+ outline-offset: var(--xh-ring-offset);
155
+ }
156
+
157
+ [data-scope='number-field'][data-part='control'][data-invalid] {
158
+ border-color: var(--xh-number-field-input-border-invalid, var(--xh-border-invalid));
159
+
160
+ /* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
161
+ --xh-_number-field-ring: var(--xh-ring-invalid);
162
+ }
163
+
164
+ [data-scope='number-field'][data-part='control'][data-readonly] {
165
+ background: var(--xh-number-field-input-bg-readonly, var(--xh-bg-subtle));
166
+ }
167
+
168
+ [data-scope='number-field'][data-part='control'][data-disabled] {
169
+ background: var(--xh-number-field-input-bg-disabled, var(--xh-bg-subtle));
170
+ color: var(--xh-fg-disabled);
171
+ cursor: not-allowed;
172
+ }
173
+
174
+ /* 盒内 input:无边框无底无圆角,观感全归 control;行内内衬也归 control,
175
+ 这里再留一份就是框内套了一圈空白。数字居中排在两个按钮之间;
176
+ 前后缀图标/文字直接流式排在 input 两侧,不用再绝对定位 */
177
+ [data-scope='number-field'][data-part='control'] [data-part='input'] {
178
+ flex: 1 1 auto;
179
+ inline-size: var(--xh-number-field-input-w, 5em);
180
+ min-inline-size: 0;
181
+ block-size: 100%;
182
+ padding-inline: 0;
183
+ border: 0;
184
+ border-radius: 0;
185
+ background: transparent;
186
+ text-align: var(--xh-number-field-input-align, center);
187
+ }
188
+
189
+ /* 盒内 input 不再自己画各态,全部交还 control。hover 这条带上与基础规则同样的
190
+ :not 条件:基础 hover 的特异度里有它们,不带就打不过 */
191
+ [data-scope='number-field'][data-part='control'] [data-part='input']:hover:not(:disabled, [data-invalid]) {
192
+ border-color: transparent;
193
+ }
194
+
195
+ [data-scope='number-field'][data-part='control'] [data-part='input']:focus-visible {
196
+ border-color: transparent;
197
+ outline: none;
198
+ }
199
+
200
+ [data-scope='number-field'][data-part='control'] [data-part='input'][data-invalid] {
201
+ border-color: transparent;
202
+ }
203
+
204
+ [data-scope='number-field'][data-part='control'] [data-part='input']:disabled,
205
+ [data-scope='number-field'][data-part='control'] [data-part='input'][readonly] {
206
+ background: transparent;
207
+ }
208
+
209
+ /* 盒内按钮:尺寸与圆角走基础规则那枚行内动作方钮,这里只把底与描边交还 control——
210
+ 按钮自带一块底色就会把一个盒子读成三块拼起来的;
211
+ 常态只剩符号,符号取次级前景,悬停与按下才浮出底色 */
212
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger'],
213
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'] {
214
+ margin: 0;
215
+ border: 0;
216
+ background: transparent;
217
+ color: var(--xh-number-field-trigger-fg, var(--xh-fg-muted));
218
+ }
219
+
220
+ /* 悬停只在分段自己身上浮出一块底色与更实的符号,盒子的描边纹丝不动 */
221
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:hover:not(:disabled),
222
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:hover:not(:disabled) {
223
+ background: var(--xh-number-field-trigger-bg-hover, var(--xh-_number-field-trigger-bg-hover));
224
+ color: var(--xh-number-field-trigger-fg-hover, var(--xh-fg-default));
225
+ }
226
+
227
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:active:not(:disabled),
228
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:active:not(:disabled) {
229
+ background: var(--xh-number-field-trigger-bg-active, var(--xh-_number-field-trigger-bg-active));
230
+ }
231
+
232
+ /* 焦点落到盒内按钮时 control 已经 focus-within 起了环,按钮自己再画一圈就是框里套框 */
233
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:focus-visible,
234
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:focus-visible {
235
+ outline: none;
236
+ }
237
+
238
+ /* 贴住 min / max 的那一侧只把符号压灰,不铺一块灰底:铺了底就又成了框上贴着的一个方块 */
239
+ [data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:disabled,
240
+ [data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:disabled {
241
+ background: transparent;
242
+ color: var(--xh-fg-disabled);
243
+ }
244
+
114
245
  [data-scope='number-field'][data-part='input'] {
115
246
  block-size: var(--xh-number-field-input-h, var(--xh-_number-field-h));
116
247
  padding-inline: var(--xh-number-field-input-px, var(--xh-_number-field-px));
117
248
  padding-block: 0;
118
249
  border: var(--xh-stroke-thin) solid var(--xh-number-field-input-border, var(--xh-_number-field-border));
119
- border-radius: var(--xh-number-field-input-radius, var(--xh-shape-control));
250
+ border-radius: var(--xh-_number-field-radius);
120
251
  background: var(--xh-number-field-input-bg, var(--xh-_number-field-bg));
121
252
  color: var(--xh-number-field-input-fg, var(--xh-fg-default));
122
253
  /* 表单控件不继承页面字体,只给字号会让输入框用 UA 默认字族 */
@@ -146,7 +277,10 @@
146
277
  }
147
278
 
148
279
  [data-scope='number-field'][data-part='input'][data-invalid] {
149
- border-color: var(--xh-number-field-input-border-invalid, var(--xh-color-danger-500));
280
+ border-color: var(--xh-number-field-input-border-invalid, var(--xh-border-invalid));
281
+
282
+ /* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
283
+ --xh-_number-field-ring: var(--xh-ring-invalid);
150
284
  }
151
285
 
152
286
  /* 只读仍可聚焦、可复制,不置灰,只把底色压下去表示"改不动" */
@@ -169,8 +303,8 @@
169
303
  flex: none;
170
304
  align-items: center;
171
305
  justify-content: center;
172
- inline-size: var(--xh-number-field-trigger-size, var(--xh-_number-field-h));
173
- block-size: var(--xh-number-field-trigger-size, var(--xh-_number-field-h));
306
+ inline-size: var(--xh-number-field-trigger-size, var(--xh-control-action-size));
307
+ block-size: var(--xh-number-field-trigger-size, var(--xh-control-action-size));
174
308
  padding: 0;
175
309
  border: var(--xh-stroke-thin) solid var(--xh-number-field-trigger-border, var(--xh-_number-field-trigger-border));
176
310
  border-radius: var(--xh-number-field-trigger-radius, var(--xh-shape-control));
@@ -221,4 +355,27 @@
221
355
  color: var(--xh-fg-disabled);
222
356
  cursor: not-allowed;
223
357
  }
358
+
359
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
360
+ [data-scope='number-field'][data-part='increment-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-plus) center / contain no-repeat;
368
+ mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
369
+ }
370
+
371
+ [data-scope='number-field'][data-part='decrement-trigger']:empty::before {
372
+ content: '';
373
+ display: inline-block;
374
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
375
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
376
+ vertical-align: var(--xh-glyph-baseline-shift);
377
+ background-color: currentColor;
378
+ -webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
379
+ mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
380
+ }
224
381
  }
@@ -0,0 +1,51 @@
1
+ /*
2
+ * 浮层箭头的几何,六份浮层皮肤共用一份,按 [data-part='arrow'] 匹配。
3
+ *
4
+ * 箭头是正方形转 45°,构成尖角的是哪两条物理边,所以贴边与摘边框都写物理属性。
5
+ * 行内轴上的中心点仍写逻辑属性:定位引擎在 RTL 下已把 arrow-x 镜像成逻辑量。
6
+ *
7
+ * 底色与描边色留在各组件皮肤,它们同时把自己的内联落点槽接到这里的统一名字上。
8
+ * 引入顺序排在六份浮层皮肤之后:摘边框那几条要压过各皮肤的 border 简写。
9
+ */
10
+ @layer xihan.components {
11
+ [data-part='arrow'] {
12
+ position: absolute;
13
+ inline-size: var(--xh-_overlay-arrow-size);
14
+ block-size: var(--xh-_overlay-arrow-size);
15
+ rotate: 45deg;
16
+ }
17
+
18
+ /* 浮层落在锚点下方:箭头贴 content 上缘,摘掉埋进 content 的下、右两条边 */
19
+ [data-part='arrow'][data-placement^='bottom'] {
20
+ top: calc(var(--xh-_overlay-arrow-size) / -2);
21
+ inset-inline-start: calc(var(--xh-_overlay-arrow-x) - var(--xh-_overlay-arrow-size) / 2);
22
+ border-right: 0;
23
+ border-bottom: 0;
24
+ }
25
+
26
+ /* 浮层落在锚点上方:箭头贴 content 下缘,摘掉上、左两条边 */
27
+ [data-part='arrow'][data-placement^='top'] {
28
+ bottom: calc(var(--xh-_overlay-arrow-size) / -2);
29
+ inset-inline-start: calc(var(--xh-_overlay-arrow-x) - var(--xh-_overlay-arrow-size) / 2);
30
+ border-top: 0;
31
+ border-left: 0;
32
+ }
33
+
34
+ /* 浮层落在锚点右侧:箭头贴 content 左缘,摘掉上、右两条边 */
35
+ [data-part='arrow'][data-placement^='right'] {
36
+ top: calc(var(--xh-_overlay-arrow-y) - var(--xh-_overlay-arrow-size) / 2);
37
+ /* stylelint-disable-next-line property-disallowed-list -- 旋转是物理的,贴边跟着物理走 */
38
+ left: calc(var(--xh-_overlay-arrow-size) / -2);
39
+ border-top: 0;
40
+ border-right: 0;
41
+ }
42
+
43
+ /* 浮层落在锚点左侧:箭头贴 content 右缘,摘掉下、左两条边 */
44
+ [data-part='arrow'][data-placement^='left'] {
45
+ top: calc(var(--xh-_overlay-arrow-y) - var(--xh-_overlay-arrow-size) / 2);
46
+ /* stylelint-disable-next-line property-disallowed-list -- 旋转是物理的,贴边跟着物理走 */
47
+ right: calc(var(--xh-_overlay-arrow-size) / -2);
48
+ border-bottom: 0;
49
+ border-left: 0;
50
+ }
51
+ }
@@ -8,7 +8,7 @@
8
8
  /* 尺寸档只换这三个私有槽,各段从根上继承它们,换档不必给每个部件各写一条选择器 */
9
9
  --xh-_page-header-py: var(--xh-space-4);
10
10
  --xh-_page-header-row-gap: var(--xh-space-2);
11
- --xh-_page-header-title-size: var(--xh-font-size-xl);
11
+ --xh-_page-header-title-size: var(--xh-text-heading-3-size);
12
12
 
13
13
  /* 一行排不下就折行;返回位、标题、副标题排在同一行,操作贴到行尾,页脚整行另起 */
14
14
  display: flex;
@@ -29,13 +29,13 @@
29
29
  [data-scope='page-header'][data-part='root'][data-size='sm'] {
30
30
  --xh-_page-header-py: var(--xh-space-3);
31
31
  --xh-_page-header-row-gap: var(--xh-space-1);
32
- --xh-_page-header-title-size: var(--xh-font-size-lg);
32
+ --xh-_page-header-title-size: var(--xh-control-font-lg);
33
33
  }
34
34
 
35
35
  [data-scope='page-header'][data-part='root'][data-size='lg'] {
36
36
  --xh-_page-header-py: var(--xh-space-6);
37
37
  --xh-_page-header-row-gap: var(--xh-space-3);
38
- --xh-_page-header-title-size: var(--xh-font-size-2xl);
38
+ --xh-_page-header-title-size: var(--xh-text-heading-2-size);
39
39
  }
40
40
 
41
41
  /* —— 分隔线 —— */
@@ -67,7 +67,7 @@
67
67
  flex: 1 1 auto;
68
68
  min-inline-size: 0;
69
69
  color: var(--xh-page-header-subtitle-fg, var(--xh-fg-muted));
70
- font-size: var(--xh-page-header-subtitle-font-size, var(--xh-font-size-sm));
70
+ font-size: var(--xh-page-header-subtitle-font-size, var(--xh-text-secondary-size));
71
71
  line-height: var(--xh-leading-normal);
72
72
  }
73
73
 
@@ -84,7 +84,7 @@
84
84
  [data-scope='page-header'][data-part='footer'] {
85
85
  flex: 1 0 100%;
86
86
  color: var(--xh-page-header-footer-fg, var(--xh-fg-muted));
87
- font-size: var(--xh-page-header-footer-font-size, var(--xh-font-size-sm));
87
+ font-size: var(--xh-page-header-footer-font-size, var(--xh-text-secondary-size));
88
88
  line-height: var(--xh-leading-normal);
89
89
  }
90
90
  }
@@ -11,7 +11,7 @@
11
11
  /* 尺寸档只换这三个私有槽,上一页/下一页、页码与省略号都从 root 继承它们,
12
12
  换档不必给每个部件各写一条选择器 */
13
13
  --xh-_pagination-item-size: var(--xh-control-h-md);
14
- --xh-_pagination-item-px: var(--xh-space-2);
14
+ --xh-_pagination-item-px: var(--xh-control-px-md);
15
15
  --xh-_pagination-font-size: var(--xh-text-label-size);
16
16
 
17
17
  /* 当前页的选中态随语气走。没写 data-tone 时这几个 --xh-_tone-* 都没被声明,
@@ -29,18 +29,18 @@
29
29
  }
30
30
 
31
31
  /* —— 尺寸 —— */
32
- /* 缺省档写在上面的基础规则里。格子高度走控件高度尺;内边距不在控件内边距那把尺上
33
- (页码格子靠最小宽度撑等宽,内边距比同高的控件窄一档),三档一律取空间尺 */
32
+ /* 缺省档写在上面的基础规则里。格子高度、内边距、字号三者各走控件尺的同一档;
33
+ 页码格子靠最小宽度撑等宽,内边距只在页码超出最小宽度时才起作用 */
34
34
  [data-scope='pagination'][data-part='root'][data-size='sm'] {
35
35
  --xh-_pagination-item-size: var(--xh-control-h-sm);
36
- --xh-_pagination-item-px: var(--xh-space-1_5);
37
- --xh-_pagination-font-size: var(--xh-font-size-sm);
36
+ --xh-_pagination-item-px: var(--xh-control-px-sm);
37
+ --xh-_pagination-font-size: var(--xh-control-font-sm);
38
38
  }
39
39
 
40
40
  [data-scope='pagination'][data-part='root'][data-size='lg'] {
41
41
  --xh-_pagination-item-size: var(--xh-control-h-lg);
42
- --xh-_pagination-item-px: var(--xh-space-3);
43
- --xh-_pagination-font-size: var(--xh-font-size-lg);
42
+ --xh-_pagination-item-px: var(--xh-control-px-lg);
43
+ --xh-_pagination-font-size: var(--xh-control-font-lg);
44
44
  }
45
45
 
46
46
  [data-scope='pagination'][data-part='root'][hidden] {
@@ -98,13 +98,13 @@
98
98
  页码条目从不禁用(连接层只给上一页/下一页发原生 disabled),故这边不必再排除 :disabled */
99
99
  [data-scope='pagination'][data-part='prev-trigger']:hover:not(:disabled),
100
100
  [data-scope='pagination'][data-part='next-trigger']:hover:not(:disabled),
101
- [data-scope='pagination'][data-part='item']:not([data-selected]):hover {
101
+ [data-scope='pagination'][data-part='item']:not([data-current]):hover {
102
102
  background: var(--xh-pagination-item-bg-hover, var(--xh-bg-subtle-hover));
103
103
  }
104
104
 
105
105
  [data-scope='pagination'][data-part='prev-trigger']:active:not(:disabled),
106
106
  [data-scope='pagination'][data-part='next-trigger']:active:not(:disabled),
107
- [data-scope='pagination'][data-part='item']:not([data-selected]):active {
107
+ [data-scope='pagination'][data-part='item']:not([data-current]):active {
108
108
  background: var(--xh-pagination-item-bg-active, var(--xh-bg-subtle-active));
109
109
  }
110
110
 
@@ -124,21 +124,21 @@
124
124
  cursor: not-allowed;
125
125
  }
126
126
 
127
- /* 当前页:data-selected 与 aria-current='page' 由连接层成对给出,
127
+ /* 当前页:data-current 与 aria-current='page' 由连接层成对给出,
128
128
  样式挂在 data 钩子上,无障碍语义留给 aria,两边各司其职。
129
129
  只换底色不加粗——字重一变字形就变宽,页码格子会跟着长一点,正是这里要避免的抖动 */
130
- [data-scope='pagination'][data-part='item'][data-selected] {
130
+ [data-scope='pagination'][data-part='item'][data-current] {
131
131
  border-color: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-bg));
132
132
  background: var(--xh-pagination-item-bg-selected, var(--xh-_pagination-selected-bg));
133
133
  color: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
134
134
  }
135
135
 
136
- [data-scope='pagination'][data-part='item'][data-selected]:hover {
136
+ [data-scope='pagination'][data-part='item'][data-current]:hover {
137
137
  border-color: var(--xh-pagination-item-border-selected-hover, var(--xh-_pagination-selected-bg-hover));
138
138
  background: var(--xh-pagination-item-bg-selected-hover, var(--xh-_pagination-selected-bg-hover));
139
139
  }
140
140
 
141
- [data-scope='pagination'][data-part='item'][data-selected]:active {
141
+ [data-scope='pagination'][data-part='item'][data-current]:active {
142
142
  border-color: var(--xh-pagination-item-border-selected-active, var(--xh-_pagination-selected-bg-active));
143
143
  background: var(--xh-pagination-item-bg-selected-active, var(--xh-_pagination-selected-bg-active));
144
144
  }