@xihan-ui/styles 1.0.0-alpha.1 → 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.
- package/CHANGELOG.md +527 -0
- package/README.md +1 -1
- package/css/accordion.css +61 -5
- package/css/affix.css +5 -0
- package/css/alert.css +35 -5
- package/css/anchor.css +12 -7
- package/css/avatar-group.css +8 -3
- package/css/avatar.css +8 -3
- package/css/back-top.css +21 -1
- package/css/badge.css +21 -2
- package/css/breadcrumb.css +29 -4
- package/css/button-group.css +19 -13
- package/css/button.css +57 -11
- package/css/calendar.css +124 -2
- package/css/card.css +10 -5
- package/css/carousel.css +41 -5
- package/css/cascader.css +188 -102
- package/css/checkbox-group.css +46 -19
- package/css/checkbox.css +59 -8
- package/css/clipboard.css +7 -1
- package/css/code-block.css +17 -7
- package/css/collapsible.css +47 -2
- package/css/color-picker.css +117 -46
- package/css/combobox.css +132 -52
- package/css/composer.css +10 -3
- package/css/context-menu.css +101 -75
- package/css/countdown.css +5 -0
- package/css/date-field.css +96 -14
- package/css/date-picker.css +281 -65
- package/css/descriptions.css +7 -2
- package/css/dialog.css +109 -22
- package/css/download-trigger.css +76 -0
- package/css/drawer.css +75 -23
- package/css/dynamic-input.css +73 -17
- package/css/editable.css +17 -10
- package/css/ellipsis.css +6 -1
- package/css/empty-state.css +12 -7
- package/css/field.css +14 -6
- package/css/fieldset.css +69 -0
- package/css/file-upload.css +50 -7
- package/css/flex.css +5 -0
- package/css/float-button.css +21 -1
- package/css/floating-panel.css +310 -0
- package/css/form.css +10 -5
- package/css/gradient-text.css +5 -0
- package/css/grid.css +5 -0
- package/css/heatmap.css +410 -0
- package/css/highlight.css +6 -1
- package/css/hotkeys.css +90 -0
- package/css/hover-card.css +58 -50
- package/css/icon-wrapper.css +5 -0
- package/css/icon.css +5 -0
- package/css/image-cropper.css +231 -0
- package/css/image-viewer.css +167 -22
- package/css/image.css +7 -2
- package/css/infinite-scroll.css +6 -1
- package/css/json-viewer.css +241 -0
- package/css/layout.css +11 -10
- package/css/list.css +13 -8
- package/css/listbox.css +25 -4
- package/css/loading-bar.css +12 -1
- package/css/log.css +6 -1
- package/css/marquee.css +14 -0
- package/css/masonry.css +63 -0
- package/css/mention.css +105 -32
- package/css/menu.css +131 -46
- package/css/menubar.css +150 -66
- package/css/navigation-menu.css +59 -29
- package/css/number-animation.css +8 -3
- package/css/number-field.css +178 -16
- package/css/overlay-arrow.css +51 -0
- package/css/page-header.css +10 -5
- package/css/pagination.css +18 -13
- package/css/password-input.css +356 -0
- package/css/pin-input.css +18 -10
- package/css/popconfirm.css +73 -16
- package/css/popover.css +88 -44
- package/css/popselect.css +201 -52
- package/css/progress.css +52 -7
- package/css/qr-code.css +6 -1
- package/css/radio-group.css +19 -8
- package/css/rating.css +7 -2
- package/css/reset.css +17 -0
- package/css/result.css +11 -6
- package/css/scroll-area.css +65 -94
- package/css/scrollbar.css +167 -0
- package/css/segmented.css +215 -0
- package/css/select.css +292 -124
- package/css/separator.css +7 -2
- package/css/side-nav.css +116 -19
- package/css/signature-pad.css +144 -0
- package/css/skeleton.css +12 -1
- package/css/slider.css +15 -10
- package/css/space.css +117 -0
- package/css/spinner.css +31 -11
- package/css/splitter.css +5 -0
- package/css/statistic.css +14 -9
- package/css/steps.css +30 -8
- package/css/switch.css +62 -13
- package/css/table.css +136 -37
- package/css/tabs.css +9 -4
- package/css/tag.css +177 -0
- package/css/tags-input.css +83 -40
- package/css/text-field.css +154 -36
- package/css/thread.css +6 -1
- package/css/time-field.css +102 -16
- package/css/time-picker.css +264 -69
- package/css/time.css +5 -0
- package/css/timeline.css +15 -10
- package/css/timer.css +119 -0
- package/css/toast.css +46 -21
- package/css/toaster.css +6 -1
- package/css/toggle-group.css +5 -0
- package/css/toggle.css +11 -6
- package/css/tone.css +10 -5
- package/css/toolbar.css +6 -1
- package/css/tooltip.css +54 -38
- package/css/tour.css +128 -63
- package/css/transfer.css +73 -17
- package/css/tree-select.css +203 -83
- package/css/tree.css +90 -1
- package/css/typography.css +9 -4
- package/css/undefined.css +11 -1
- package/css/virtualizer.css +8 -1
- package/css/watermark.css +6 -2
- package/index.css +17 -1
- package/index.unlayered.css +9394 -2883
- package/package.json +19 -4
- package/css/motion.css +0 -58
package/css/number-field.css
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='number-field'] {
|
|
4
|
+
--xh-number-field-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 与文本框同一套堆叠:标签一行、输入行一行。
|
|
3
|
-
|
|
8
|
+
输入框与加减钮放进 control 部件即得一体式:视觉盒画在 control 上,
|
|
9
|
+
减在左、加在右、输入框居中,前后缀图标/文字可直接流式插在框内。
|
|
10
|
+
不写 control 时退回旧式三件并排的观感(下方 input / 按钮的基础规则原样生效) */
|
|
4
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
|
+
|
|
5
15
|
/* 尺寸档只换这几个私有槽,标题、输入框与加减钮都从 root 继承它们,
|
|
6
16
|
换档不必给每个部件各写一条选择器 */
|
|
7
17
|
--xh-_number-field-h: var(--xh-control-h-md);
|
|
8
18
|
--xh-_number-field-px: var(--xh-control-px-md);
|
|
19
|
+
--xh-_number-field-gap: var(--xh-control-gap-md);
|
|
9
20
|
--xh-_number-field-font-size: var(--xh-text-body-size);
|
|
10
21
|
--xh-_number-field-label-font-size: var(--xh-text-label-size);
|
|
11
22
|
--xh-_number-field-trigger-font-size: var(--xh-text-body-size);
|
|
12
23
|
|
|
24
|
+
/* 盒子的圆角 */
|
|
25
|
+
--xh-_number-field-radius: var(--xh-number-field-input-radius, var(--xh-shape-control));
|
|
26
|
+
|
|
13
27
|
/* 形态档只换这几个私有槽:输入框的底与描边,加减钮的底与描边 */
|
|
14
28
|
--xh-_number-field-bg: var(--xh-bg-canvas);
|
|
15
29
|
--xh-_number-field-border: var(--xh-border-control);
|
|
@@ -23,7 +37,7 @@
|
|
|
23
37
|
/* 语气只落在聚焦这一处:环与聚焦态描边。框里的数字不归它管。
|
|
24
38
|
没写 data-tone 时 --xh-_tone 没被声明,退回原来的聚焦环色与常态描边 */
|
|
25
39
|
--xh-_number-field-ring: var(--xh-ring-focus);
|
|
26
|
-
--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)));
|
|
27
41
|
|
|
28
42
|
display: inline-flex;
|
|
29
43
|
flex-direction: column;
|
|
@@ -38,19 +52,23 @@
|
|
|
38
52
|
/* —— 尺寸 —— */
|
|
39
53
|
/* 缺省档写在上面的基础规则里 */
|
|
40
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));
|
|
41
56
|
--xh-_number-field-h: var(--xh-control-h-sm);
|
|
42
57
|
--xh-_number-field-px: var(--xh-control-px-sm);
|
|
43
|
-
--xh-_number-field-
|
|
44
|
-
--xh-_number-field-
|
|
45
|
-
--xh-_number-field-
|
|
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);
|
|
46
62
|
}
|
|
47
63
|
|
|
48
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));
|
|
49
66
|
--xh-_number-field-h: var(--xh-control-h-lg);
|
|
50
67
|
--xh-_number-field-px: var(--xh-control-px-lg);
|
|
51
|
-
--xh-_number-field-
|
|
52
|
-
--xh-_number-field-
|
|
53
|
-
--xh-_number-field-
|
|
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);
|
|
54
72
|
}
|
|
55
73
|
|
|
56
74
|
/* —— 形态 —— */
|
|
@@ -65,7 +83,7 @@
|
|
|
65
83
|
--xh-_number-field-trigger-bg-active: var(--xh-bg-subtle-active);
|
|
66
84
|
--xh-_number-field-trigger-border: var(--xh-border-control);
|
|
67
85
|
--xh-_number-field-trigger-border-hover: var(--xh-border-control-hover);
|
|
68
|
-
--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)));
|
|
69
87
|
}
|
|
70
88
|
|
|
71
89
|
/* 填充式:底色顶替描边表达边界。描边只退成透明而不去掉,1px 的位置留着,
|
|
@@ -79,10 +97,10 @@
|
|
|
79
97
|
--xh-_number-field-trigger-bg-active: var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active));
|
|
80
98
|
--xh-_number-field-trigger-border: transparent;
|
|
81
99
|
--xh-_number-field-trigger-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
82
|
-
--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));
|
|
83
101
|
}
|
|
84
102
|
|
|
85
|
-
/*
|
|
103
|
+
/* 无框:底与常态描边透明,悬停与聚焦浮出描边 */
|
|
86
104
|
[data-scope='number-field'][data-part='root'][data-variant='ghost'] {
|
|
87
105
|
--xh-_number-field-bg: transparent;
|
|
88
106
|
--xh-_number-field-border: transparent;
|
|
@@ -92,7 +110,7 @@
|
|
|
92
110
|
--xh-_number-field-trigger-bg-active: var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active));
|
|
93
111
|
--xh-_number-field-trigger-border: transparent;
|
|
94
112
|
--xh-_number-field-trigger-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
95
|
-
--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));
|
|
96
114
|
}
|
|
97
115
|
|
|
98
116
|
[data-scope='number-field'][data-part='label'] {
|
|
@@ -106,12 +124,130 @@
|
|
|
106
124
|
color: var(--xh-number-field-label-fg-disabled, var(--xh-fg-subtle));
|
|
107
125
|
}
|
|
108
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
|
+
|
|
109
245
|
[data-scope='number-field'][data-part='input'] {
|
|
110
246
|
block-size: var(--xh-number-field-input-h, var(--xh-_number-field-h));
|
|
111
247
|
padding-inline: var(--xh-number-field-input-px, var(--xh-_number-field-px));
|
|
112
248
|
padding-block: 0;
|
|
113
249
|
border: var(--xh-stroke-thin) solid var(--xh-number-field-input-border, var(--xh-_number-field-border));
|
|
114
|
-
border-radius: var(--xh-
|
|
250
|
+
border-radius: var(--xh-_number-field-radius);
|
|
115
251
|
background: var(--xh-number-field-input-bg, var(--xh-_number-field-bg));
|
|
116
252
|
color: var(--xh-number-field-input-fg, var(--xh-fg-default));
|
|
117
253
|
/* 表单控件不继承页面字体,只给字号会让输入框用 UA 默认字族 */
|
|
@@ -141,7 +277,10 @@
|
|
|
141
277
|
}
|
|
142
278
|
|
|
143
279
|
[data-scope='number-field'][data-part='input'][data-invalid] {
|
|
144
|
-
border-color: var(--xh-number-field-input-border-invalid, var(--xh-
|
|
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);
|
|
145
284
|
}
|
|
146
285
|
|
|
147
286
|
/* 只读仍可聚焦、可复制,不置灰,只把底色压下去表示"改不动" */
|
|
@@ -164,8 +303,8 @@
|
|
|
164
303
|
flex: none;
|
|
165
304
|
align-items: center;
|
|
166
305
|
justify-content: center;
|
|
167
|
-
inline-size: var(--xh-number-field-trigger-size, var(--xh-
|
|
168
|
-
block-size: var(--xh-number-field-trigger-size, var(--xh-
|
|
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));
|
|
169
308
|
padding: 0;
|
|
170
309
|
border: var(--xh-stroke-thin) solid var(--xh-number-field-trigger-border, var(--xh-_number-field-trigger-border));
|
|
171
310
|
border-radius: var(--xh-number-field-trigger-radius, var(--xh-shape-control));
|
|
@@ -216,4 +355,27 @@
|
|
|
216
355
|
color: var(--xh-fg-disabled);
|
|
217
356
|
cursor: not-allowed;
|
|
218
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
|
+
}
|
|
219
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
|
+
}
|
package/css/page-header.css
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='page-header'] {
|
|
4
|
+
--xh-page-header-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
[data-scope='page-header'][data-part='root'] {
|
|
3
8
|
/* 尺寸档只换这三个私有槽,各段从根上继承它们,换档不必给每个部件各写一条选择器 */
|
|
4
9
|
--xh-_page-header-py: var(--xh-space-4);
|
|
5
10
|
--xh-_page-header-row-gap: var(--xh-space-2);
|
|
6
|
-
--xh-_page-header-title-size: var(--xh-
|
|
11
|
+
--xh-_page-header-title-size: var(--xh-text-heading-3-size);
|
|
7
12
|
|
|
8
13
|
/* 一行排不下就折行;返回位、标题、副标题排在同一行,操作贴到行尾,页脚整行另起 */
|
|
9
14
|
display: flex;
|
|
@@ -24,13 +29,13 @@
|
|
|
24
29
|
[data-scope='page-header'][data-part='root'][data-size='sm'] {
|
|
25
30
|
--xh-_page-header-py: var(--xh-space-3);
|
|
26
31
|
--xh-_page-header-row-gap: var(--xh-space-1);
|
|
27
|
-
--xh-_page-header-title-size: var(--xh-font-
|
|
32
|
+
--xh-_page-header-title-size: var(--xh-control-font-lg);
|
|
28
33
|
}
|
|
29
34
|
|
|
30
35
|
[data-scope='page-header'][data-part='root'][data-size='lg'] {
|
|
31
36
|
--xh-_page-header-py: var(--xh-space-6);
|
|
32
37
|
--xh-_page-header-row-gap: var(--xh-space-3);
|
|
33
|
-
--xh-_page-header-title-size: var(--xh-
|
|
38
|
+
--xh-_page-header-title-size: var(--xh-text-heading-2-size);
|
|
34
39
|
}
|
|
35
40
|
|
|
36
41
|
/* —— 分隔线 —— */
|
|
@@ -62,7 +67,7 @@
|
|
|
62
67
|
flex: 1 1 auto;
|
|
63
68
|
min-inline-size: 0;
|
|
64
69
|
color: var(--xh-page-header-subtitle-fg, var(--xh-fg-muted));
|
|
65
|
-
font-size: var(--xh-page-header-subtitle-font-size, var(--xh-
|
|
70
|
+
font-size: var(--xh-page-header-subtitle-font-size, var(--xh-text-secondary-size));
|
|
66
71
|
line-height: var(--xh-leading-normal);
|
|
67
72
|
}
|
|
68
73
|
|
|
@@ -79,7 +84,7 @@
|
|
|
79
84
|
[data-scope='page-header'][data-part='footer'] {
|
|
80
85
|
flex: 1 0 100%;
|
|
81
86
|
color: var(--xh-page-header-footer-fg, var(--xh-fg-muted));
|
|
82
|
-
font-size: var(--xh-page-header-footer-font-size, var(--xh-
|
|
87
|
+
font-size: var(--xh-page-header-footer-font-size, var(--xh-text-secondary-size));
|
|
83
88
|
line-height: var(--xh-leading-normal);
|
|
84
89
|
}
|
|
85
90
|
}
|
package/css/pagination.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='pagination'] {
|
|
4
|
+
--xh-pagination-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 根节点是 nav 地标,只负责把上一页 / 页码 / 下一页排成一行。
|
|
3
8
|
页数为 0 时连接层会打 data-empty,这里不拿它做隐藏:作者常把「第 x-y 条」这类
|
|
4
9
|
区间回显也写在 nav 里,整块藏掉会连那行字一起吞了,是否隐藏交给作者决定 */
|
|
@@ -6,7 +11,7 @@
|
|
|
6
11
|
/* 尺寸档只换这三个私有槽,上一页/下一页、页码与省略号都从 root 继承它们,
|
|
7
12
|
换档不必给每个部件各写一条选择器 */
|
|
8
13
|
--xh-_pagination-item-size: var(--xh-control-h-md);
|
|
9
|
-
--xh-_pagination-item-px: var(--xh-
|
|
14
|
+
--xh-_pagination-item-px: var(--xh-control-px-md);
|
|
10
15
|
--xh-_pagination-font-size: var(--xh-text-label-size);
|
|
11
16
|
|
|
12
17
|
/* 当前页的选中态随语气走。没写 data-tone 时这几个 --xh-_tone-* 都没被声明,
|
|
@@ -24,18 +29,18 @@
|
|
|
24
29
|
}
|
|
25
30
|
|
|
26
31
|
/* —— 尺寸 —— */
|
|
27
|
-
/*
|
|
28
|
-
|
|
32
|
+
/* 缺省档写在上面的基础规则里。格子高度、内边距、字号三者各走控件尺的同一档;
|
|
33
|
+
页码格子靠最小宽度撑等宽,内边距只在页码超出最小宽度时才起作用 */
|
|
29
34
|
[data-scope='pagination'][data-part='root'][data-size='sm'] {
|
|
30
35
|
--xh-_pagination-item-size: var(--xh-control-h-sm);
|
|
31
|
-
--xh-_pagination-item-px: var(--xh-
|
|
32
|
-
--xh-_pagination-font-size: var(--xh-font-
|
|
36
|
+
--xh-_pagination-item-px: var(--xh-control-px-sm);
|
|
37
|
+
--xh-_pagination-font-size: var(--xh-control-font-sm);
|
|
33
38
|
}
|
|
34
39
|
|
|
35
40
|
[data-scope='pagination'][data-part='root'][data-size='lg'] {
|
|
36
41
|
--xh-_pagination-item-size: var(--xh-control-h-lg);
|
|
37
|
-
--xh-_pagination-item-px: var(--xh-
|
|
38
|
-
--xh-_pagination-font-size: var(--xh-font-
|
|
42
|
+
--xh-_pagination-item-px: var(--xh-control-px-lg);
|
|
43
|
+
--xh-_pagination-font-size: var(--xh-control-font-lg);
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
[data-scope='pagination'][data-part='root'][hidden] {
|
|
@@ -93,13 +98,13 @@
|
|
|
93
98
|
页码条目从不禁用(连接层只给上一页/下一页发原生 disabled),故这边不必再排除 :disabled */
|
|
94
99
|
[data-scope='pagination'][data-part='prev-trigger']:hover:not(:disabled),
|
|
95
100
|
[data-scope='pagination'][data-part='next-trigger']:hover:not(:disabled),
|
|
96
|
-
[data-scope='pagination'][data-part='item']:not([data-
|
|
101
|
+
[data-scope='pagination'][data-part='item']:not([data-current]):hover {
|
|
97
102
|
background: var(--xh-pagination-item-bg-hover, var(--xh-bg-subtle-hover));
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
[data-scope='pagination'][data-part='prev-trigger']:active:not(:disabled),
|
|
101
106
|
[data-scope='pagination'][data-part='next-trigger']:active:not(:disabled),
|
|
102
|
-
[data-scope='pagination'][data-part='item']:not([data-
|
|
107
|
+
[data-scope='pagination'][data-part='item']:not([data-current]):active {
|
|
103
108
|
background: var(--xh-pagination-item-bg-active, var(--xh-bg-subtle-active));
|
|
104
109
|
}
|
|
105
110
|
|
|
@@ -119,21 +124,21 @@
|
|
|
119
124
|
cursor: not-allowed;
|
|
120
125
|
}
|
|
121
126
|
|
|
122
|
-
/* 当前页:data-
|
|
127
|
+
/* 当前页:data-current 与 aria-current='page' 由连接层成对给出,
|
|
123
128
|
样式挂在 data 钩子上,无障碍语义留给 aria,两边各司其职。
|
|
124
129
|
只换底色不加粗——字重一变字形就变宽,页码格子会跟着长一点,正是这里要避免的抖动 */
|
|
125
|
-
[data-scope='pagination'][data-part='item'][data-
|
|
130
|
+
[data-scope='pagination'][data-part='item'][data-current] {
|
|
126
131
|
border-color: var(--xh-pagination-item-border-selected, var(--xh-_pagination-selected-bg));
|
|
127
132
|
background: var(--xh-pagination-item-bg-selected, var(--xh-_pagination-selected-bg));
|
|
128
133
|
color: var(--xh-pagination-item-fg-selected, var(--xh-_pagination-selected-fg));
|
|
129
134
|
}
|
|
130
135
|
|
|
131
|
-
[data-scope='pagination'][data-part='item'][data-
|
|
136
|
+
[data-scope='pagination'][data-part='item'][data-current]:hover {
|
|
132
137
|
border-color: var(--xh-pagination-item-border-selected-hover, var(--xh-_pagination-selected-bg-hover));
|
|
133
138
|
background: var(--xh-pagination-item-bg-selected-hover, var(--xh-_pagination-selected-bg-hover));
|
|
134
139
|
}
|
|
135
140
|
|
|
136
|
-
[data-scope='pagination'][data-part='item'][data-
|
|
141
|
+
[data-scope='pagination'][data-part='item'][data-current]:active {
|
|
137
142
|
border-color: var(--xh-pagination-item-border-selected-active, var(--xh-_pagination-selected-bg-active));
|
|
138
143
|
background: var(--xh-pagination-item-bg-selected-active, var(--xh-_pagination-selected-bg-active));
|
|
139
144
|
}
|