@xihan-ui/styles 1.0.0-alpha.2 → 1.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.
- package/CHANGELOG.md +2177 -0
- package/README.md +1 -1
- package/css/accordion.css +80 -6
- package/css/alert.css +43 -14
- package/css/anchor.css +8 -8
- package/css/avatar-group.css +7 -3
- package/css/avatar.css +9 -3
- package/css/back-top.css +22 -1
- package/css/badge.css +104 -32
- package/css/breadcrumb.css +25 -5
- package/css/button-group.css +18 -13
- package/css/button.css +48 -11
- package/css/calendar.css +150 -7
- package/css/card.css +20 -11
- package/css/carousel.css +36 -5
- package/css/cascader.css +211 -124
- package/css/checkbox-group.css +72 -22
- package/css/checkbox.css +70 -13
- package/css/clipboard.css +2 -1
- package/css/code-block.css +12 -7
- package/css/collapsible.css +49 -3
- package/css/color-picker.css +132 -46
- package/css/combobox.css +132 -60
- package/css/composer.css +5 -3
- package/css/context-menu.css +113 -74
- package/css/date-field.css +93 -16
- package/css/date-picker.css +293 -72
- package/css/descriptions.css +11 -5
- package/css/dialog.css +47 -14
- package/css/download-trigger.css +76 -0
- package/css/drawer.css +57 -16
- package/css/dynamic-input.css +75 -17
- package/css/editable.css +12 -10
- package/css/ellipsis.css +7 -1
- package/css/empty-state.css +22 -12
- package/css/field.css +16 -6
- package/css/fieldset.css +69 -0
- package/css/file-upload.css +46 -8
- package/css/flex.css +13 -7
- package/css/float-button.css +23 -1
- package/css/floating-panel.css +316 -0
- package/css/form.css +4 -4
- package/css/grid.css +11 -5
- package/css/heatmap.css +411 -0
- package/css/highlight.css +2 -2
- package/css/hotkeys.css +90 -0
- package/css/hover-card.css +43 -45
- package/css/image-cropper.css +233 -0
- package/css/image-viewer.css +155 -17
- package/css/image.css +2 -2
- package/css/infinite-scroll.css +1 -1
- package/css/json-viewer.css +274 -0
- package/css/layout.css +19 -15
- package/css/list.css +22 -13
- package/css/listbox.css +24 -6
- package/css/loading-bar.css +12 -5
- package/css/log.css +7 -3
- package/css/marquee.css +9 -0
- package/css/masonry.css +63 -0
- package/css/mention.css +100 -36
- package/css/menu.css +127 -50
- package/css/menubar.css +155 -61
- package/css/navigation-menu.css +56 -31
- package/css/notification.css +377 -0
- package/css/number-animation.css +3 -3
- package/css/number-field.css +182 -19
- package/css/overlay-arrow.css +51 -0
- package/css/page-header.css +12 -5
- package/css/pagination.css +171 -14
- package/css/password-input.css +356 -0
- package/css/pin-input.css +15 -12
- package/css/popconfirm.css +55 -12
- package/css/popover.css +73 -45
- package/css/popselect.css +207 -57
- package/css/progress.css +54 -8
- package/css/qr-code.css +1 -1
- package/css/radio-group.css +27 -10
- package/css/rating.css +4 -4
- package/css/reset.css +17 -0
- package/css/result.css +21 -11
- package/css/scroll-area.css +61 -89
- package/css/scrollbar.css +170 -0
- package/css/segmented.css +215 -0
- package/css/select.css +298 -131
- package/css/separator.css +2 -2
- package/css/side-nav.css +127 -24
- package/css/signature-pad.css +144 -0
- package/css/skeleton.css +7 -1
- package/css/slider.css +14 -12
- package/css/space.css +117 -0
- package/css/spinner.css +22 -10
- package/css/statistic.css +9 -9
- package/css/steps.css +29 -12
- package/css/switch.css +57 -8
- package/css/table.css +146 -44
- package/css/tabs.css +13 -5
- package/css/tag.css +179 -0
- package/css/tags-input.css +80 -42
- package/css/text-field.css +151 -38
- package/css/thread.css +11 -3
- package/css/time-field.css +99 -18
- package/css/time-picker.css +261 -71
- package/css/timeline.css +15 -15
- package/css/timer.css +119 -0
- package/css/toast.css +129 -55
- package/css/toggle-group.css +30 -4
- package/css/toggle.css +12 -6
- package/css/tone.css +57 -22
- package/css/toolbar.css +1 -1
- package/css/tooltip.css +40 -31
- package/css/tour.css +112 -61
- package/css/transfer.css +98 -21
- package/css/tree-select.css +215 -89
- package/css/tree.css +131 -5
- package/css/typography.css +5 -5
- package/css/undefined.css +12 -1
- package/css/virtualizer.css +3 -1
- package/css/watermark.css +1 -2
- package/index.css +18 -1
- package/index.unlayered.css +10356 -3255
- package/package.json +20 -4
- package/css/toaster.css +0 -74
package/css/select.css
CHANGED
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
@layer xihan.motion {
|
|
2
2
|
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
3
|
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
-
@keyframes xh-
|
|
4
|
+
@keyframes xh-pop-in {
|
|
5
5
|
from {
|
|
6
6
|
opacity: 0;
|
|
7
|
+
scale: var(--xh-motion-scale-enter);
|
|
7
8
|
}
|
|
8
9
|
|
|
9
10
|
to {
|
|
10
11
|
opacity: 1;
|
|
12
|
+
scale: 1;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
@keyframes xh-pop-out {
|
|
16
|
+
from {
|
|
17
|
+
opacity: 1;
|
|
18
|
+
scale: 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
to {
|
|
22
|
+
opacity: 0;
|
|
23
|
+
scale: var(--xh-motion-scale-enter);
|
|
11
24
|
}
|
|
12
25
|
}
|
|
13
26
|
}
|
|
@@ -18,75 +31,114 @@
|
|
|
18
31
|
--xh-select-skin: 1;
|
|
19
32
|
}
|
|
20
33
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
34
|
+
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
35
|
+
[data-scope='select'][data-part='positioner'] {
|
|
36
|
+
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
|
|
37
|
+
引擎没算(尚未落位 / 无引擎)时不额外限高 */
|
|
38
|
+
--xh-_select-available-h: 100vh;
|
|
39
|
+
|
|
40
|
+
position: fixed;
|
|
41
|
+
z-index: var(--xh-select-layer, var(--xh-layer-popover));
|
|
42
|
+
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
43
|
+
pointer-events: none;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
47
|
+
[data-scope='select'][data-part='positioner'][data-hidden] {
|
|
48
|
+
visibility: hidden;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
|
|
52
|
+
[data-scope='select']:is([data-part='root'], [data-part='positioner']) {
|
|
53
|
+
/* 尺寸档只换这五个私有槽,触发器、标题与条目都从这两处继承它们,
|
|
54
|
+
换档不必给每个部件各写一条选择器 */
|
|
24
55
|
--xh-_select-h: var(--xh-control-h-md);
|
|
25
56
|
--xh-_select-px: var(--xh-control-px-md);
|
|
57
|
+
--xh-_select-item-py: var(--xh-list-option-py-md);
|
|
58
|
+
--xh-_select-item-px: var(--xh-control-px-md);
|
|
26
59
|
--xh-_select-gap: var(--xh-control-gap-md);
|
|
27
|
-
--xh-_select-font-size: var(--xh-
|
|
28
|
-
--xh-_select-label-font-size: var(--xh-
|
|
60
|
+
--xh-_select-font-size: var(--xh-control-font-md);
|
|
61
|
+
--xh-_select-label-font-size: var(--xh-control-font-md);
|
|
29
62
|
|
|
30
63
|
/* 形态档只换这三个槽:缺省即 outline(描边 + 画布底) */
|
|
31
|
-
--xh-_select-
|
|
32
|
-
--xh-_select-
|
|
33
|
-
--xh-_select-
|
|
64
|
+
--xh-_select-control-bg: var(--xh-bg-canvas);
|
|
65
|
+
--xh-_select-control-border: var(--xh-border-control);
|
|
66
|
+
--xh-_select-control-border-hover: var(--xh-border-control-hover);
|
|
34
67
|
|
|
35
68
|
/* 聚焦环恒用固定环色;强调色随语气走,只落在勾选标记与选中文字上,正文文字色不动。
|
|
36
69
|
没写 data-tone 时 --xh-_tone 没被声明,两处都退回原来的取值 */
|
|
37
70
|
--xh-_select-ring: var(--xh-ring-focus);
|
|
38
|
-
--xh-_select-accent: var(--xh-_tone, var(--xh-
|
|
71
|
+
--xh-_select-accent: var(--xh-_tone, var(--xh-fg-brand));
|
|
39
72
|
--xh-_select-item-selected-fg: var(--xh-_tone-fg, var(--xh-fg-brand-strong));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
[data-scope='select'][data-part='root'] {
|
|
76
|
+
/* 作者塞进指示符槽的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准 */
|
|
77
|
+
--xh-icon-size: var(--xh-select-icon-size, var(--xh-glyph-size-md));
|
|
40
78
|
|
|
41
79
|
display: inline-flex;
|
|
42
80
|
flex-direction: column;
|
|
43
|
-
gap: var(--xh-select-gap, var(--xh-
|
|
81
|
+
gap: var(--xh-select-gap, var(--xh-space-1));
|
|
44
82
|
/* 隐藏 select 以此为定位基准:它必须留在布局里,原生校验提示要有处可贴 */
|
|
45
83
|
position: relative;
|
|
46
84
|
}
|
|
47
85
|
|
|
48
86
|
/* —— 尺寸 —— */
|
|
49
87
|
/* 缺省档写在上面的基础规则里 */
|
|
50
|
-
[data-scope='select'][data-part='root'][data-size='sm'] {
|
|
88
|
+
[data-scope='select']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
|
|
51
89
|
--xh-_select-h: var(--xh-control-h-sm);
|
|
52
90
|
--xh-_select-px: var(--xh-control-px-sm);
|
|
91
|
+
--xh-_select-item-py: var(--xh-list-option-py-sm);
|
|
92
|
+
--xh-_select-item-px: var(--xh-control-px-sm);
|
|
53
93
|
--xh-_select-gap: var(--xh-control-gap-sm);
|
|
54
|
-
--xh-_select-font-size: var(--xh-font-
|
|
55
|
-
--xh-_select-label-font-size: var(--xh-font-
|
|
94
|
+
--xh-_select-font-size: var(--xh-control-font-sm);
|
|
95
|
+
--xh-_select-label-font-size: var(--xh-control-font-sm);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* 图标只跟着盒那一侧换档:浮层里的勾选标记有自己的指示符盒,换成整档图标会撑破它 */
|
|
99
|
+
[data-scope='select'][data-part='root'][data-size='sm'] {
|
|
100
|
+
--xh-icon-size: var(--xh-select-icon-size, var(--xh-glyph-size-sm));
|
|
56
101
|
}
|
|
57
102
|
|
|
58
103
|
[data-scope='select'][data-part='root'][data-size='lg'] {
|
|
104
|
+
--xh-icon-size: var(--xh-select-icon-size, var(--xh-glyph-size-lg));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
[data-scope='select']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
|
|
59
108
|
--xh-_select-h: var(--xh-control-h-lg);
|
|
60
109
|
--xh-_select-px: var(--xh-control-px-lg);
|
|
110
|
+
--xh-_select-item-py: var(--xh-list-option-py-lg);
|
|
111
|
+
--xh-_select-item-px: var(--xh-control-px-lg);
|
|
61
112
|
--xh-_select-gap: var(--xh-control-gap-lg);
|
|
62
|
-
--xh-_select-font-size: var(--xh-font-
|
|
63
|
-
--xh-_select-label-font-size: var(--xh-font-
|
|
113
|
+
--xh-_select-font-size: var(--xh-control-font-lg);
|
|
114
|
+
--xh-_select-label-font-size: var(--xh-control-font-lg);
|
|
64
115
|
}
|
|
65
116
|
|
|
66
117
|
/* —— 形态 —— */
|
|
67
118
|
/* 输入类不做 solid:实心底压着可编辑的值,读起来像块不可点的色板。
|
|
68
119
|
形态只决定描边与底色怎么用,用哪族颜色由 data-tone 决定 */
|
|
69
|
-
[data-scope='select'][data-part='root'][data-variant='outline'] {
|
|
70
|
-
--xh-_select-
|
|
71
|
-
--xh-_select-
|
|
72
|
-
--xh-_select-
|
|
120
|
+
[data-scope='select']:is([data-part='root'], [data-part='positioner'])[data-variant='outline'] {
|
|
121
|
+
--xh-_select-control-bg: var(--xh-bg-canvas);
|
|
122
|
+
--xh-_select-control-border: var(--xh-border-control);
|
|
123
|
+
--xh-_select-control-border-hover: var(--xh-border-control-hover);
|
|
73
124
|
}
|
|
74
125
|
|
|
75
126
|
/* 填充式:底色顶替描边,悬停时才浮出一道淡边 */
|
|
76
|
-
[data-scope='select'][data-part='root'][data-variant='subtle'] {
|
|
77
|
-
--xh-_select-
|
|
78
|
-
--xh-_select-
|
|
79
|
-
--xh-_select-
|
|
127
|
+
[data-scope='select']:is([data-part='root'], [data-part='positioner'])[data-variant='subtle'] {
|
|
128
|
+
--xh-_select-control-bg: var(--xh-_tone-subtle, var(--xh-bg-subtle));
|
|
129
|
+
--xh-_select-control-border: transparent;
|
|
130
|
+
--xh-_select-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
80
131
|
}
|
|
81
132
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
--xh-_select-
|
|
85
|
-
--xh-_select-
|
|
133
|
+
/* 无框:底与常态描边透明,悬停浮出描边,聚焦由焦点环表达 */
|
|
134
|
+
[data-scope='select']:is([data-part='root'], [data-part='positioner'])[data-variant='ghost'] {
|
|
135
|
+
--xh-_select-control-bg: transparent;
|
|
136
|
+
--xh-_select-control-border: transparent;
|
|
137
|
+
--xh-_select-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
86
138
|
}
|
|
87
139
|
|
|
88
140
|
[data-scope='select'][data-part='label'] {
|
|
89
|
-
color: var(--xh-select-label-fg, var(--xh-fg-
|
|
141
|
+
color: var(--xh-select-label-fg, var(--xh-fg-default));
|
|
90
142
|
font-size: var(--xh-select-label-font-size, var(--xh-_select-label-font-size));
|
|
91
143
|
font-weight: var(--xh-select-label-font-weight, var(--xh-text-label-weight));
|
|
92
144
|
line-height: var(--xh-leading-none);
|
|
@@ -96,102 +148,117 @@
|
|
|
96
148
|
color: var(--xh-fg-subtle);
|
|
97
149
|
}
|
|
98
150
|
|
|
99
|
-
|
|
151
|
+
/* 盒:描边、底色、圆角、控件高度与行内内衬都长在这一层,触发器与清空按钮在里面并排。
|
|
152
|
+
聚焦环也画在它上面,焦点落在哪颗按钮上,看到的都是同一个框亮起来 */
|
|
153
|
+
[data-scope='select'][data-part='control'] {
|
|
100
154
|
display: inline-flex;
|
|
101
155
|
align-items: center;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
border: var(--xh-stroke-thin) solid var(--xh-select-trigger-border, var(--xh-_select-trigger-border));
|
|
110
|
-
border-radius: var(--xh-select-trigger-radius, var(--xh-shape-control));
|
|
111
|
-
background: var(--xh-select-trigger-bg, var(--xh-_select-trigger-bg));
|
|
112
|
-
color: var(--xh-select-trigger-fg, var(--xh-fg-default));
|
|
113
|
-
font-size: var(--xh-select-trigger-font-size, var(--xh-_select-font-size));
|
|
114
|
-
line-height: var(--xh-leading-none);
|
|
115
|
-
text-align: start;
|
|
116
|
-
cursor: pointer;
|
|
156
|
+
gap: var(--xh-select-control-gap, var(--xh-_select-gap));
|
|
157
|
+
block-size: var(--xh-select-control-h, var(--xh-_select-h));
|
|
158
|
+
padding-inline: var(--xh-select-control-px, var(--xh-_select-px));
|
|
159
|
+
min-inline-size: var(--xh-select-control-min-w, var(--xh-control-min-w));
|
|
160
|
+
border: var(--xh-stroke-thin) solid var(--xh-select-control-border, var(--xh-_select-control-border));
|
|
161
|
+
border-radius: var(--xh-select-control-radius, var(--xh-shape-control));
|
|
162
|
+
background: var(--xh-select-control-bg, var(--xh-_select-control-bg));
|
|
117
163
|
}
|
|
118
164
|
|
|
119
165
|
/* hover 只在中性态换描边:invalid 正拿边框颜色说事,被 hover 盖掉那条信息就没了 */
|
|
120
|
-
[data-scope='select'][data-part='
|
|
121
|
-
border-color: var(--xh-select-
|
|
166
|
+
[data-scope='select'][data-part='control']:hover:not([data-disabled], [data-invalid]) {
|
|
167
|
+
border-color: var(--xh-select-control-border-hover, var(--xh-_select-control-border-hover));
|
|
122
168
|
}
|
|
123
169
|
|
|
124
|
-
[data-scope='select'][data-part='
|
|
125
|
-
border-color: var(--xh-select-
|
|
170
|
+
[data-scope='select'][data-part='control'][data-invalid] {
|
|
171
|
+
border-color: var(--xh-select-control-border-invalid, var(--xh-border-invalid));
|
|
172
|
+
|
|
173
|
+
/* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
|
|
174
|
+
--xh-_select-ring: var(--xh-ring-invalid);
|
|
126
175
|
}
|
|
127
176
|
|
|
128
|
-
/*
|
|
129
|
-
[data-scope='select'][data-part='control'] {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
align-items: center;
|
|
177
|
+
/* 焦点落在盒内任一颗按钮上都画同一圈环;禁用时按钮不可聚焦,守卫只是把这条说死 */
|
|
178
|
+
[data-scope='select'][data-part='control']:focus-within:not([data-disabled]) {
|
|
179
|
+
outline: var(--xh-ring-width) solid var(--xh-_select-ring);
|
|
180
|
+
outline-offset: var(--xh-ring-offset);
|
|
133
181
|
}
|
|
134
182
|
|
|
135
|
-
|
|
136
|
-
|
|
183
|
+
/* 聚焦态描边色与环共用一族语气色。校验失败时要显式让开,描边保持红色 */
|
|
184
|
+
[data-scope='select'][data-part='control']:focus-within:not([data-invalid]) {
|
|
185
|
+
border-color: var(--xh-select-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
|
|
137
186
|
}
|
|
138
187
|
|
|
139
|
-
/*
|
|
140
|
-
[data-scope='select'][data-part='
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
inline-size: var(--xh-select-clear-size, var(--xh-control-indicator-size));
|
|
144
|
-
block-size: var(--xh-select-clear-size, var(--xh-control-indicator-size));
|
|
145
|
-
padding: 0;
|
|
146
|
-
border: none;
|
|
147
|
-
border-radius: var(--xh-shape-pill);
|
|
148
|
-
background: none;
|
|
149
|
-
color: var(--xh-select-clear-fg, var(--xh-fg-subtle));
|
|
188
|
+
/* 只读仍可聚焦、浮层仍展得开、条目仍能浏览,所以不置灰,只把底色压下去表示「改不动」 */
|
|
189
|
+
[data-scope='select'][data-part='control'][data-readonly] {
|
|
190
|
+
background: var(--xh-select-control-bg-readonly, var(--xh-bg-subtle));
|
|
191
|
+
}
|
|
150
192
|
|
|
151
|
-
|
|
152
|
-
|
|
193
|
+
[data-scope='select'][data-part='control'][data-disabled] {
|
|
194
|
+
background: var(--xh-select-control-bg-disabled, var(--xh-bg-subtle));
|
|
195
|
+
color: var(--xh-fg-disabled);
|
|
196
|
+
cursor: not-allowed;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/* 触发器退化成盒里那颗可聚焦的按钮:描边、底色与内衬归盒,它只占满剩余一行 */
|
|
200
|
+
[data-scope='select'][data-part='trigger'] {
|
|
201
|
+
display: inline-flex;
|
|
202
|
+
flex: 1 1 auto;
|
|
203
|
+
align-items: center;
|
|
204
|
+
justify-content: space-between;
|
|
205
|
+
gap: var(--xh-select-trigger-gap, var(--xh-_select-gap));
|
|
206
|
+
/* 弹性子项默认最小尺寸是内容尺寸,不归零则长值把盒撑破、省略号永远轮不到 */
|
|
207
|
+
min-inline-size: 0;
|
|
208
|
+
padding: 0;
|
|
209
|
+
border: 0;
|
|
210
|
+
background: transparent;
|
|
211
|
+
color: var(--xh-select-trigger-fg, var(--xh-fg-default));
|
|
212
|
+
font-size: var(--xh-select-trigger-font-size, var(--xh-_select-font-size));
|
|
153
213
|
line-height: var(--xh-leading-none);
|
|
214
|
+
text-align: start;
|
|
154
215
|
cursor: pointer;
|
|
155
216
|
}
|
|
156
217
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
218
|
+
/* 清空按钮:盒里 trigger 的兄弟节点,排在触发器之后,与展开箭头一样宽;清不了时连接层给 hidden */
|
|
219
|
+
[data-scope='select'][data-part='clear-trigger'] {
|
|
220
|
+
display: inline-flex;
|
|
221
|
+
flex: none;
|
|
222
|
+
align-items: center;
|
|
223
|
+
justify-content: center;
|
|
224
|
+
inline-size: var(--xh-select-action-size, var(--xh-control-action-size));
|
|
225
|
+
block-size: var(--xh-select-action-size, var(--xh-control-action-size));
|
|
226
|
+
padding: 0;
|
|
227
|
+
border: 0;
|
|
228
|
+
border-radius: var(--xh-select-action-radius, var(--xh-shape-control));
|
|
229
|
+
background: var(--xh-select-action-bg, transparent);
|
|
230
|
+
color: var(--xh-select-action-fg, var(--xh-fg-muted));
|
|
231
|
+
font-family: inherit;
|
|
161
232
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
233
|
+
/* 字号行高钉死:继承页面字号会让行框高过按钮,字形被基线顶离正中 */
|
|
234
|
+
font-size: var(--xh-select-action-font-size, var(--xh-text-secondary-size));
|
|
235
|
+
line-height: var(--xh-leading-none);
|
|
236
|
+
cursor: pointer;
|
|
237
|
+
user-select: none;
|
|
238
|
+
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter), scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
165
239
|
}
|
|
166
240
|
|
|
167
241
|
[data-scope='select'][data-part='clear-trigger'][hidden] {
|
|
168
242
|
display: none;
|
|
169
243
|
}
|
|
170
244
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
inset-block-start: 50%;
|
|
175
|
-
inset-inline-end: var(--xh-select-trigger-px, var(--xh-_select-px));
|
|
176
|
-
translate: 0 -50%;
|
|
177
|
-
opacity: 0;
|
|
178
|
-
pointer-events: none;
|
|
245
|
+
[data-scope='select'][data-part='clear-trigger']:hover {
|
|
246
|
+
background: var(--xh-select-action-bg-hover, var(--xh-bg-subtle-hover));
|
|
247
|
+
color: var(--xh-select-action-fg-hover, var(--xh-fg-default));
|
|
179
248
|
}
|
|
180
249
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
opacity: 1;
|
|
185
|
-
pointer-events: auto;
|
|
250
|
+
[data-scope='select'][data-part='clear-trigger']:active {
|
|
251
|
+
background: var(--xh-select-action-bg-active, var(--xh-bg-subtle-active));
|
|
252
|
+
scale: var(--xh-motion-scale-press);
|
|
186
253
|
}
|
|
187
254
|
|
|
188
|
-
/*
|
|
189
|
-
[data-scope='select'][data-part='
|
|
190
|
-
|
|
191
|
-
|
|
255
|
+
/* 清空按钮退出了 Tab 序列(tabindex=-1),正常操作走不到这里;留着是给程序化聚焦兜底,落焦时得看得见 */
|
|
256
|
+
[data-scope='select'][data-part='clear-trigger']:focus-visible {
|
|
257
|
+
outline: var(--xh-ring-width) solid var(--xh-_select-ring);
|
|
258
|
+
outline-offset: var(--xh-ring-offset);
|
|
192
259
|
}
|
|
193
260
|
|
|
194
|
-
/* 多选标签:淡底小药丸;放触发器里是纯展示,放外面配
|
|
261
|
+
/* 多选标签:淡底小药丸;放触发器里是纯展示,放外面配 item-delete-trigger 可删 */
|
|
195
262
|
[data-scope='select'][data-part='tag'] {
|
|
196
263
|
display: inline-flex;
|
|
197
264
|
align-items: center;
|
|
@@ -201,7 +268,7 @@
|
|
|
201
268
|
border-radius: var(--xh-select-tag-radius, var(--xh-shape-pill));
|
|
202
269
|
background: var(--xh-select-tag-bg, var(--xh-bg-subtle));
|
|
203
270
|
color: var(--xh-select-tag-fg, var(--xh-fg-default));
|
|
204
|
-
font-size: var(--xh-select-tag-font-size, var(--xh-
|
|
271
|
+
font-size: var(--xh-select-tag-font-size, var(--xh-text-caption-size));
|
|
205
272
|
line-height: var(--xh-leading-normal);
|
|
206
273
|
white-space: nowrap;
|
|
207
274
|
}
|
|
@@ -210,35 +277,49 @@
|
|
|
210
277
|
color: var(--xh-fg-disabled);
|
|
211
278
|
}
|
|
212
279
|
|
|
213
|
-
|
|
280
|
+
/* 标签内的删除钮:与指示符同尺寸的小钮,贴着标签文字 */
|
|
281
|
+
[data-scope='select'][data-part='item-delete-trigger'] {
|
|
214
282
|
display: inline-grid;
|
|
215
283
|
place-items: center;
|
|
284
|
+
inline-size: var(--xh-select-item-delete-size, var(--xh-control-indicator-size));
|
|
285
|
+
block-size: var(--xh-select-item-delete-size, var(--xh-control-indicator-size));
|
|
216
286
|
padding: 0;
|
|
217
287
|
border: none;
|
|
218
|
-
border-radius: var(--xh-shape-
|
|
288
|
+
border-radius: var(--xh-select-item-delete-radius, var(--xh-shape-inset));
|
|
219
289
|
background: none;
|
|
220
|
-
color: var(--xh-select-
|
|
290
|
+
color: var(--xh-select-item-delete-fg, var(--xh-fg-subtle));
|
|
221
291
|
font-size: inherit;
|
|
222
292
|
cursor: pointer;
|
|
293
|
+
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter), scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
223
294
|
}
|
|
224
295
|
|
|
225
|
-
[data-scope='select'][data-part='
|
|
226
|
-
|
|
296
|
+
[data-scope='select'][data-part='item-delete-trigger'][hidden] {
|
|
297
|
+
display: none;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
[data-scope='select'][data-part='item-delete-trigger']:hover {
|
|
301
|
+
background: var(--xh-select-item-delete-bg-hover, var(--xh-bg-subtle-hover));
|
|
302
|
+
color: var(--xh-select-item-delete-fg-hover, var(--xh-fg-default));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
[data-scope='select'][data-part='item-delete-trigger']:active {
|
|
306
|
+
background: var(--xh-select-item-delete-bg-active, var(--xh-bg-subtle-active));
|
|
307
|
+
scale: var(--xh-motion-scale-press);
|
|
227
308
|
}
|
|
228
309
|
|
|
229
|
-
[data-scope='select'][data-part='
|
|
310
|
+
[data-scope='select'][data-part='item-delete-trigger']:focus-visible {
|
|
230
311
|
outline: var(--xh-ring-width) solid var(--xh-_select-ring);
|
|
231
312
|
outline-offset: var(--xh-ring-offset);
|
|
232
313
|
}
|
|
233
314
|
|
|
234
|
-
[data-scope='select'][data-part='
|
|
315
|
+
[data-scope='select'][data-part='item-delete-trigger'][data-disabled] {
|
|
235
316
|
color: var(--xh-fg-disabled);
|
|
236
317
|
cursor: not-allowed;
|
|
237
318
|
}
|
|
238
319
|
|
|
320
|
+
/* 环画在盒上,按钮自己不再画:两圈套着的环读起来像两个控件 */
|
|
239
321
|
[data-scope='select'][data-part='trigger']:focus-visible {
|
|
240
|
-
outline:
|
|
241
|
-
outline-offset: var(--xh-ring-offset);
|
|
322
|
+
outline: none;
|
|
242
323
|
}
|
|
243
324
|
|
|
244
325
|
/* trigger 是单体控件,用原生 disabled(条目那边一律 aria-disabled) */
|
|
@@ -247,7 +328,7 @@
|
|
|
247
328
|
cursor: not-allowed;
|
|
248
329
|
}
|
|
249
330
|
|
|
250
|
-
/*
|
|
331
|
+
/* 盒宽由 control 定,这里得允许自己被压缩:弹性子项默认最小尺寸是内容尺寸,
|
|
251
332
|
不归零则长值把行撑破、省略号永远轮不到 */
|
|
252
333
|
[data-scope='select'][data-part='value-text'] {
|
|
253
334
|
flex: 1;
|
|
@@ -262,80 +343,123 @@
|
|
|
262
343
|
color: var(--xh-select-placeholder-fg, var(--xh-fg-subtle));
|
|
263
344
|
}
|
|
264
345
|
|
|
346
|
+
/* 有值时清空钮顶上来,箭头让位:两个图标并排堆着,用户分不清点哪个 */
|
|
347
|
+
[data-scope='select'][data-part='indicator'][data-clearable] {
|
|
348
|
+
display: none;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/* 展开箭头与清空钮同一把尺:两者互斥显示,换来换去不该让盒里的宽度跳一下 */
|
|
265
352
|
[data-scope='select'][data-part='indicator'] {
|
|
266
353
|
display: inline-flex;
|
|
267
354
|
flex: none;
|
|
268
355
|
align-items: center;
|
|
269
356
|
justify-content: center;
|
|
357
|
+
inline-size: var(--xh-select-action-size, var(--xh-control-action-size));
|
|
358
|
+
block-size: var(--xh-select-action-size, var(--xh-control-action-size));
|
|
270
359
|
color: var(--xh-select-indicator-fg, var(--xh-fg-muted));
|
|
271
360
|
transition: rotate var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
272
361
|
}
|
|
273
362
|
|
|
274
363
|
/* 没写内容就由皮肤画箭头;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
275
364
|
[data-scope='select'][data-part='indicator']:empty::before {
|
|
276
|
-
content: '
|
|
365
|
+
content: '';
|
|
366
|
+
display: inline-block;
|
|
367
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
368
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
369
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
370
|
+
background-color: currentColor;
|
|
371
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
372
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
277
373
|
}
|
|
278
374
|
|
|
279
375
|
[data-scope='select'][data-part='indicator'][data-state='open'] {
|
|
280
376
|
rotate: 180deg;
|
|
281
377
|
}
|
|
282
378
|
|
|
283
|
-
/*
|
|
284
|
-
|
|
285
|
-
position: fixed;
|
|
286
|
-
z-index: var(--xh-layer-popover);
|
|
287
|
-
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
288
|
-
pointer-events: none;
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
292
|
-
[data-scope='select'][data-part='positioner'][data-hidden] {
|
|
293
|
-
visibility: hidden;
|
|
294
|
-
}
|
|
295
|
-
|
|
379
|
+
/* 浮层外壳:描边、底色、阴影与整体尺寸归它。它自己不滚——滚的是里面的 list,
|
|
380
|
+
底部操作区因此留在视口里,不随条目滚走 */
|
|
296
381
|
[data-scope='select'][data-part='content'] {
|
|
297
382
|
display: flex;
|
|
298
383
|
flex-direction: column;
|
|
299
|
-
min-inline-size: var(--xh-select-content-min-w, var(--xh-overlay-min-w));
|
|
384
|
+
min-inline-size: var(--xh-select-content-min-w, var(--xh-overlay-menu-min-w));
|
|
300
385
|
max-inline-size: var(--xh-select-content-max-w, var(--xh-overlay-max-w));
|
|
301
|
-
max-block-size: var(--xh-select-content-max-h, var(--xh-overlay-max-h));
|
|
386
|
+
max-block-size: min(var(--xh-select-content-max-h, var(--xh-overlay-menu-max-h)), var(--xh-_select-available-h));
|
|
302
387
|
padding-block: var(--xh-select-content-py, var(--xh-space-1));
|
|
303
388
|
padding-inline: var(--xh-select-content-px, var(--xh-space-1));
|
|
304
389
|
border: var(--xh-stroke-thin) solid var(--xh-select-content-border, var(--xh-border-default));
|
|
305
390
|
border-radius: var(--xh-select-content-radius, var(--xh-shape-surface));
|
|
306
391
|
background: var(--xh-select-content-bg, var(--xh-bg-surface));
|
|
307
392
|
color: var(--xh-select-content-fg, var(--xh-fg-default));
|
|
308
|
-
box-shadow: var(--xh-select-content-shadow, var(--xh-elevation-
|
|
309
|
-
|
|
393
|
+
box-shadow: var(--xh-select-content-shadow, var(--xh-elevation-floating));
|
|
394
|
+
/* 条目的悬停底色是方角,滚到两端时会探出外壳的圆角 */
|
|
395
|
+
overflow: hidden;
|
|
310
396
|
pointer-events: auto;
|
|
311
397
|
}
|
|
312
398
|
|
|
313
|
-
/*
|
|
314
|
-
|
|
399
|
+
/* 列表框本体:只管滚动,留白归外壳。
|
|
400
|
+
min-block-size: 0 是 flex 子项能真正滚动的前提——不给的话它按内容撑高,
|
|
401
|
+
外壳的 max-block-size 就只会把溢出的部分裁掉而不是交给它滚 */
|
|
402
|
+
[data-scope='select'][data-part='list'] {
|
|
403
|
+
display: flex;
|
|
404
|
+
flex: 1 1 auto;
|
|
405
|
+
flex-direction: column;
|
|
406
|
+
gap: var(--xh-select-list-gap, var(--xh-list-option-gap));
|
|
407
|
+
min-block-size: 0;
|
|
408
|
+
overflow-y: auto;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/* 底部操作区:贴在列表下沿,用一道分隔线与条目断开。
|
|
412
|
+
作者往里放什么由作者定,这里只管位置、留白与那条线 */
|
|
413
|
+
[data-scope='select'][data-part='footer'] {
|
|
414
|
+
display: flex;
|
|
415
|
+
flex: none;
|
|
416
|
+
align-items: center;
|
|
417
|
+
gap: var(--xh-select-footer-gap, var(--xh-space-2));
|
|
418
|
+
padding-block: var(--xh-select-footer-py, var(--xh-space-2));
|
|
419
|
+
padding-inline: var(--xh-select-footer-px, var(--xh-space-2));
|
|
420
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-select-footer-border, var(--xh-border-subtle));
|
|
421
|
+
color: var(--xh-select-footer-fg, var(--xh-fg-muted));
|
|
422
|
+
font-size: var(--xh-select-footer-font-size, var(--xh-text-secondary-size));
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/* 上面给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
|
|
426
|
+
[data-scope='select'][data-part='footer'][hidden] {
|
|
315
427
|
display: none;
|
|
316
428
|
}
|
|
317
429
|
|
|
430
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
431
|
+
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
432
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
433
|
+
真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
|
|
434
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
435
|
+
|
|
318
436
|
/* 焦点落在容器上只有一种情形:指针打开、无选中值、还没有任何条目当锚点。
|
|
319
437
|
那一刻它认领着 Tab 位,环画在浮层内沿;有锚点时环长在条目上,容器不再画 */
|
|
320
|
-
[data-scope='select'][data-part='
|
|
438
|
+
[data-scope='select'][data-part='list'][tabindex='0']:focus-visible {
|
|
321
439
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
322
440
|
outline-offset: calc(-1 * var(--xh-ring-width));
|
|
323
441
|
}
|
|
324
442
|
|
|
325
|
-
[data-scope='select'][data-part='
|
|
443
|
+
[data-scope='select'][data-part='list']:not([tabindex='0']):focus-visible {
|
|
326
444
|
outline: none;
|
|
327
445
|
}
|
|
328
446
|
|
|
329
447
|
[data-scope='select'][data-part='content'][data-state='open'] {
|
|
330
|
-
animation: xh-
|
|
448
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
452
|
+
免得动画结束到真收起之间闪一下原样 */
|
|
453
|
+
[data-scope='select'][data-part='content'][data-state='closed'] {
|
|
454
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
331
455
|
}
|
|
332
456
|
|
|
333
457
|
[data-scope='select'][data-part='item'] {
|
|
334
458
|
display: flex;
|
|
335
459
|
align-items: center;
|
|
336
460
|
gap: var(--xh-select-item-gap, var(--xh-_select-gap));
|
|
337
|
-
padding-block: var(--xh-select-item-py, var(--xh-
|
|
338
|
-
padding-inline: var(--xh-select-item-px, var(--xh-
|
|
461
|
+
padding-block: var(--xh-select-item-py, var(--xh-_select-item-py));
|
|
462
|
+
padding-inline: var(--xh-select-item-px, var(--xh-_select-item-px));
|
|
339
463
|
border-radius: var(--xh-select-item-radius, var(--xh-shape-control));
|
|
340
464
|
color: var(--xh-select-item-fg, var(--xh-fg-default));
|
|
341
465
|
font-size: var(--xh-select-item-font-size, var(--xh-_select-font-size));
|
|
@@ -400,7 +524,14 @@
|
|
|
400
524
|
|
|
401
525
|
/* 同上:没写内容就由皮肤画勾 */
|
|
402
526
|
[data-scope='select'][data-part='item-indicator']:empty::before {
|
|
403
|
-
content: '
|
|
527
|
+
content: '';
|
|
528
|
+
display: inline-block;
|
|
529
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
530
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
531
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
532
|
+
background-color: currentColor;
|
|
533
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
534
|
+
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
404
535
|
}
|
|
405
536
|
|
|
406
537
|
[data-scope='select'][data-part='item-indicator'][data-state='checked'] {
|
|
@@ -411,4 +542,40 @@
|
|
|
411
542
|
[data-scope='select'][data-part='hidden-select'] {
|
|
412
543
|
pointer-events: none;
|
|
413
544
|
}
|
|
545
|
+
|
|
546
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
547
|
+
[data-scope='select'][data-part='clear-trigger']:empty::before {
|
|
548
|
+
content: '';
|
|
549
|
+
display: inline-block;
|
|
550
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
551
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
552
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
553
|
+
background-color: currentColor;
|
|
554
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
555
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
[data-scope='select'][data-part='item-delete-trigger']:empty::before {
|
|
559
|
+
content: '';
|
|
560
|
+
display: inline-block;
|
|
561
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
562
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
563
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
564
|
+
background-color: currentColor;
|
|
565
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
566
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
570
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
571
|
+
[data-scope='select'][data-part='root'][hidden],
|
|
572
|
+
[data-scope='select'][data-part='control'][hidden],
|
|
573
|
+
[data-scope='select'][data-part='trigger'][hidden],
|
|
574
|
+
[data-scope='select'][data-part='tag'][hidden],
|
|
575
|
+
[data-scope='select'][data-part='indicator'][hidden],
|
|
576
|
+
[data-scope='select'][data-part='list'][hidden],
|
|
577
|
+
[data-scope='select'][data-part='item'][hidden],
|
|
578
|
+
[data-scope='select'][data-part='item-indicator'][hidden] {
|
|
579
|
+
display: none;
|
|
580
|
+
}
|
|
414
581
|
}
|
package/css/separator.css
CHANGED
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
|
|
12
12
|
[data-scope='separator'][data-part='root'][data-orientation='horizontal'] {
|
|
13
13
|
inline-size: 100%;
|
|
14
|
-
block-size: var(--xh-separator-thickness,
|
|
14
|
+
block-size: var(--xh-separator-thickness, var(--xh-stroke-thin));
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
[data-scope='separator'][data-part='root'][data-orientation='vertical'] {
|
|
18
18
|
align-self: stretch;
|
|
19
|
-
inline-size: var(--xh-separator-thickness,
|
|
19
|
+
inline-size: var(--xh-separator-thickness, var(--xh-stroke-thin));
|
|
20
20
|
block-size: 100%;
|
|
21
21
|
}
|
|
22
22
|
}
|