@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/combobox.css
CHANGED
|
@@ -1,13 +1,66 @@
|
|
|
1
|
+
@layer xihan.motion {
|
|
2
|
+
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
|
+
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
+
@keyframes xh-pop-in {
|
|
5
|
+
from {
|
|
6
|
+
opacity: 0;
|
|
7
|
+
scale: var(--xh-motion-scale-enter);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
to {
|
|
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);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
1
28
|
@layer xihan.components {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
29
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
30
|
+
[data-scope='combobox'] {
|
|
31
|
+
--xh-combobox-skin: 1;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
35
|
+
[data-scope='combobox'][data-part='positioner'] {
|
|
36
|
+
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
|
|
37
|
+
引擎没算(尚未落位 / 无引擎)时不额外限高 */
|
|
38
|
+
--xh-_combobox-available-h: 100vh;
|
|
39
|
+
|
|
40
|
+
position: fixed;
|
|
41
|
+
z-index: var(--xh-combobox-layer, var(--xh-layer-popover));
|
|
42
|
+
/* 空壳不吃指针,交互只发生在 content 与 empty 上 */
|
|
43
|
+
pointer-events: none;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
47
|
+
[data-scope='combobox'][data-part='positioner'][data-hidden] {
|
|
48
|
+
visibility: hidden;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
|
|
52
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner']) {
|
|
53
|
+
/* 尺寸档只换这五个私有槽,输入行、标题与候选都从这两处继承它们,
|
|
54
|
+
换档不必给每个部件各写一条选择器 */
|
|
5
55
|
--xh-_combobox-h: var(--xh-control-h-md);
|
|
6
56
|
--xh-_combobox-px: var(--xh-control-px-md);
|
|
7
57
|
--xh-_combobox-gap: var(--xh-control-gap-md);
|
|
8
58
|
--xh-_combobox-font-size: var(--xh-text-body-size);
|
|
9
59
|
--xh-_combobox-label-font-size: var(--xh-text-label-size);
|
|
10
60
|
|
|
61
|
+
/* 作者塞进指示符槽的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准 */
|
|
62
|
+
--xh-icon-size: var(--xh-combobox-icon-size, var(--xh-glyph-size-md));
|
|
63
|
+
|
|
11
64
|
/* 形态档只换这三个槽:缺省即 outline(描边 + 画布底) */
|
|
12
65
|
--xh-_combobox-control-bg: var(--xh-bg-canvas);
|
|
13
66
|
--xh-_combobox-control-border: var(--xh-border-control);
|
|
@@ -18,10 +71,12 @@
|
|
|
18
71
|
--xh-_combobox-ring: var(--xh-ring-focus);
|
|
19
72
|
--xh-_combobox-accent: var(--xh-_tone, var(--xh-bg-brand));
|
|
20
73
|
--xh-_combobox-item-selected-fg: var(--xh-_tone-fg, var(--xh-fg-brand-strong));
|
|
74
|
+
}
|
|
21
75
|
|
|
76
|
+
[data-scope='combobox'][data-part='root'] {
|
|
22
77
|
display: inline-flex;
|
|
23
78
|
flex-direction: column;
|
|
24
|
-
gap: var(--xh-combobox-gap, var(--xh-
|
|
79
|
+
gap: var(--xh-combobox-gap, var(--xh-space-1));
|
|
25
80
|
}
|
|
26
81
|
|
|
27
82
|
/* 只要声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
|
|
@@ -31,46 +86,51 @@
|
|
|
31
86
|
|
|
32
87
|
/* —— 尺寸 —— */
|
|
33
88
|
/* 缺省档写在上面的基础规则里 */
|
|
34
|
-
[data-scope='combobox'][data-part='root'][data-size='sm'] {
|
|
89
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
|
|
35
90
|
--xh-_combobox-h: var(--xh-control-h-sm);
|
|
36
91
|
--xh-_combobox-px: var(--xh-control-px-sm);
|
|
37
92
|
--xh-_combobox-gap: var(--xh-control-gap-sm);
|
|
38
|
-
--xh-_combobox-font-size: var(--xh-font-
|
|
39
|
-
--xh-_combobox-label-font-size: var(--xh-font-
|
|
93
|
+
--xh-_combobox-font-size: var(--xh-control-font-sm);
|
|
94
|
+
--xh-_combobox-label-font-size: var(--xh-control-font-sm);
|
|
95
|
+
|
|
96
|
+
--xh-icon-size: var(--xh-combobox-icon-size, var(--xh-glyph-size-sm));
|
|
40
97
|
}
|
|
41
98
|
|
|
42
|
-
[data-scope='combobox'][data-part='root'][data-size='lg'] {
|
|
99
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
|
|
43
100
|
--xh-_combobox-h: var(--xh-control-h-lg);
|
|
44
101
|
--xh-_combobox-px: var(--xh-control-px-lg);
|
|
45
102
|
--xh-_combobox-gap: var(--xh-control-gap-lg);
|
|
46
|
-
--xh-_combobox-font-size: var(--xh-font-
|
|
47
|
-
--xh-_combobox-label-font-size: var(--xh-font-
|
|
103
|
+
--xh-_combobox-font-size: var(--xh-control-font-lg);
|
|
104
|
+
--xh-_combobox-label-font-size: var(--xh-control-font-lg);
|
|
105
|
+
|
|
106
|
+
--xh-icon-size: var(--xh-combobox-icon-size, var(--xh-glyph-size-lg));
|
|
48
107
|
}
|
|
49
108
|
|
|
50
109
|
/* —— 形态 —— */
|
|
51
110
|
/* 输入类不做 solid:实心底压着可编辑的文字,读起来像块不可点的色板。
|
|
52
111
|
形态只决定描边与底色怎么用,用哪族颜色由 data-tone 决定 */
|
|
53
|
-
[data-scope='combobox'][data-part='root'][data-variant='outline'] {
|
|
112
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-variant='outline'] {
|
|
54
113
|
--xh-_combobox-control-bg: var(--xh-bg-canvas);
|
|
55
114
|
--xh-_combobox-control-border: var(--xh-border-control);
|
|
56
115
|
--xh-_combobox-control-border-hover: var(--xh-border-control-hover);
|
|
57
116
|
}
|
|
58
117
|
|
|
59
118
|
/* 填充式:底色顶替描边,悬停时才浮出一道淡边 */
|
|
60
|
-
[data-scope='combobox'][data-part='root'][data-variant='subtle'] {
|
|
119
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-variant='subtle'] {
|
|
61
120
|
--xh-_combobox-control-bg: var(--xh-_tone-subtle, var(--xh-bg-subtle));
|
|
62
121
|
--xh-_combobox-control-border: transparent;
|
|
63
122
|
--xh-_combobox-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
64
123
|
}
|
|
65
124
|
|
|
66
|
-
|
|
125
|
+
/* 无框:底与常态描边透明,悬停与聚焦浮出描边 */
|
|
126
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-variant='ghost'] {
|
|
67
127
|
--xh-_combobox-control-bg: transparent;
|
|
68
128
|
--xh-_combobox-control-border: transparent;
|
|
69
129
|
--xh-_combobox-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
70
130
|
}
|
|
71
131
|
|
|
72
132
|
[data-scope='combobox'][data-part='label'] {
|
|
73
|
-
color: var(--xh-combobox-label-fg, var(--xh-fg-
|
|
133
|
+
color: var(--xh-combobox-label-fg, var(--xh-fg-default));
|
|
74
134
|
font-size: var(--xh-combobox-label-font-size, var(--xh-_combobox-label-font-size));
|
|
75
135
|
font-weight: var(--xh-combobox-label-font-weight, var(--xh-text-label-weight));
|
|
76
136
|
line-height: var(--xh-leading-none);
|
|
@@ -86,7 +146,7 @@
|
|
|
86
146
|
display: inline-flex;
|
|
87
147
|
align-items: center;
|
|
88
148
|
gap: var(--xh-combobox-control-gap, var(--xh-_combobox-gap));
|
|
89
|
-
min-inline-size: var(--xh-combobox-control-min-w, var(--xh-
|
|
149
|
+
min-inline-size: var(--xh-combobox-control-min-w, var(--xh-control-min-w));
|
|
90
150
|
block-size: var(--xh-combobox-control-h, var(--xh-_combobox-h));
|
|
91
151
|
padding-inline: var(--xh-combobox-control-px, var(--xh-_combobox-px));
|
|
92
152
|
border: var(--xh-stroke-thin) solid var(--xh-combobox-control-border, var(--xh-_combobox-control-border));
|
|
@@ -108,14 +168,17 @@
|
|
|
108
168
|
/* 焦点环画在 control 上而不是 input 上:视觉上的「框」是 control,
|
|
109
169
|
环若长在里面那个透明的 input 身上,就会缩在文字区里、与框错开一圈。
|
|
110
170
|
input 是这里唯一可聚焦的常规节点,:focus-within 与它的 :focus-visible 等价 */
|
|
111
|
-
[data-scope='combobox'][data-part='control']:focus-within {
|
|
112
|
-
border-color: var(--xh-combobox-control-border-focus, var(--xh-
|
|
171
|
+
[data-scope='combobox'][data-part='control']:focus-within:not([data-disabled]) {
|
|
172
|
+
border-color: var(--xh-combobox-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
|
|
113
173
|
outline: var(--xh-ring-width) solid var(--xh-_combobox-ring);
|
|
114
174
|
outline-offset: var(--xh-ring-offset);
|
|
115
175
|
}
|
|
116
176
|
|
|
117
177
|
[data-scope='combobox'][data-part='control'][data-invalid] {
|
|
118
|
-
border-color: var(--xh-combobox-control-border-invalid, var(--xh-
|
|
178
|
+
border-color: var(--xh-combobox-control-border-invalid, var(--xh-border-invalid));
|
|
179
|
+
|
|
180
|
+
/* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
|
|
181
|
+
--xh-_combobox-ring: var(--xh-ring-invalid);
|
|
119
182
|
}
|
|
120
183
|
|
|
121
184
|
/* 只读仍可聚焦、可复制,所以不置灰,只把底色压下去表示"改不动" */
|
|
@@ -192,13 +255,14 @@
|
|
|
192
255
|
background: var(--xh-combobox-action-bg, transparent);
|
|
193
256
|
color: var(--xh-combobox-action-fg, var(--xh-fg-muted));
|
|
194
257
|
font-family: inherit;
|
|
195
|
-
font-size: var(--xh-combobox-action-font-size, var(--xh-
|
|
258
|
+
font-size: var(--xh-combobox-action-font-size, var(--xh-text-secondary-size));
|
|
196
259
|
line-height: var(--xh-leading-none);
|
|
197
260
|
cursor: pointer;
|
|
198
261
|
user-select: none;
|
|
199
|
-
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
262
|
+
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter), scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
200
263
|
}
|
|
201
264
|
|
|
265
|
+
|
|
202
266
|
[data-scope='combobox'][data-part='trigger'][hidden],
|
|
203
267
|
[data-scope='combobox'][data-part='clear-trigger'][hidden] {
|
|
204
268
|
display: none;
|
|
@@ -213,12 +277,26 @@
|
|
|
213
277
|
|
|
214
278
|
/* 没写内容就由皮肤画箭头;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
215
279
|
[data-scope='combobox'][data-part='trigger']:empty::before {
|
|
216
|
-
content: '
|
|
280
|
+
content: '';
|
|
281
|
+
display: inline-block;
|
|
282
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
283
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
284
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
285
|
+
background-color: currentColor;
|
|
286
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
287
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
217
288
|
}
|
|
218
289
|
|
|
219
290
|
/* 同上:没写内容就由皮肤画叉 */
|
|
220
291
|
[data-scope='combobox'][data-part='clear-trigger']:empty::before {
|
|
221
|
-
content: '
|
|
292
|
+
content: '';
|
|
293
|
+
display: inline-block;
|
|
294
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
295
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
296
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
297
|
+
background-color: currentColor;
|
|
298
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
299
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
222
300
|
}
|
|
223
301
|
|
|
224
302
|
[data-scope='combobox'][data-part='trigger'][data-state='open']:empty::before,
|
|
@@ -235,57 +313,43 @@
|
|
|
235
313
|
[data-scope='combobox'][data-part='trigger']:active:not(:disabled),
|
|
236
314
|
[data-scope='combobox'][data-part='clear-trigger']:active:not(:disabled) {
|
|
237
315
|
background: var(--xh-combobox-action-bg-active, var(--xh-bg-subtle-active));
|
|
316
|
+
scale: var(--xh-motion-scale-press);
|
|
238
317
|
}
|
|
239
318
|
|
|
240
|
-
/*
|
|
241
|
-
留着是给程序化聚焦兜底,落焦时得看得见 */
|
|
319
|
+
/* 两个按钮都在盒里,盒的 :focus-within 已经画了一圈;这里再画一圈就是框里套框 */
|
|
242
320
|
[data-scope='combobox'][data-part='trigger']:focus-visible,
|
|
243
321
|
[data-scope='combobox'][data-part='clear-trigger']:focus-visible {
|
|
244
|
-
outline:
|
|
245
|
-
outline-offset: var(--xh-ring-offset);
|
|
322
|
+
outline: none;
|
|
246
323
|
}
|
|
247
324
|
|
|
248
|
-
[data-scope='combobox'][data-part='trigger']:disabled
|
|
249
|
-
[data-scope='combobox'][data-part='clear-trigger']:disabled {
|
|
325
|
+
[data-scope='combobox'][data-part='trigger']:disabled {
|
|
250
326
|
background: var(--xh-combobox-action-bg, transparent);
|
|
251
327
|
color: var(--xh-fg-disabled);
|
|
252
328
|
cursor: not-allowed;
|
|
253
329
|
}
|
|
254
330
|
|
|
255
|
-
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
256
|
-
[data-scope='combobox'][data-part='positioner'] {
|
|
257
|
-
position: fixed;
|
|
258
|
-
z-index: var(--xh-layer-popover);
|
|
259
|
-
/* 空壳不吃指针,交互只发生在 content 与 empty 上 */
|
|
260
|
-
pointer-events: none;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
264
|
-
[data-scope='combobox'][data-part='positioner'][data-hidden] {
|
|
265
|
-
visibility: hidden;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
331
|
[data-scope='combobox'][data-part='content'] {
|
|
269
332
|
display: flex;
|
|
270
333
|
flex-direction: column;
|
|
271
334
|
min-inline-size: var(--xh-combobox-content-min-w, var(--xh-overlay-min-w));
|
|
272
|
-
max-inline-size: var(--xh-combobox-content-max-w,
|
|
273
|
-
max-block-size: var(--xh-combobox-content-max-h, var(--xh-overlay-max-h));
|
|
335
|
+
max-inline-size: var(--xh-combobox-content-max-w, var(--xh-overlay-max-w));
|
|
336
|
+
max-block-size: min(var(--xh-combobox-content-max-h, var(--xh-overlay-max-h)), var(--xh-_combobox-available-h));
|
|
274
337
|
padding-block: var(--xh-combobox-content-py, var(--xh-space-1));
|
|
275
338
|
padding-inline: var(--xh-combobox-content-px, var(--xh-space-1));
|
|
276
339
|
border: var(--xh-stroke-thin) solid var(--xh-combobox-content-border, var(--xh-border-default));
|
|
277
340
|
border-radius: var(--xh-combobox-content-radius, var(--xh-shape-surface));
|
|
278
341
|
background: var(--xh-combobox-content-bg, var(--xh-bg-surface));
|
|
279
342
|
color: var(--xh-combobox-content-fg, var(--xh-fg-default));
|
|
280
|
-
box-shadow: var(--xh-combobox-content-shadow, var(--xh-elevation-
|
|
343
|
+
box-shadow: var(--xh-combobox-content-shadow, var(--xh-elevation-floating));
|
|
281
344
|
overflow-y: auto;
|
|
282
345
|
pointer-events: auto;
|
|
283
346
|
}
|
|
284
347
|
|
|
285
|
-
/*
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
348
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
349
|
+
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
350
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
351
|
+
真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
|
|
352
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
289
353
|
|
|
290
354
|
/* 列表从不承载焦点(焦点恒在输入框,高亮走 aria-activedescendant),
|
|
291
355
|
可滚动容器在某些浏览器里会被自动塞进 Tab 序列,落焦时不画环 */
|
|
@@ -294,7 +358,13 @@
|
|
|
294
358
|
}
|
|
295
359
|
|
|
296
360
|
[data-scope='combobox'][data-part='content'][data-state='open'] {
|
|
297
|
-
animation: xh-
|
|
361
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
365
|
+
免得动画结束到真收起之间闪一下原样 */
|
|
366
|
+
[data-scope='combobox'][data-part='content'][data-state='closed'] {
|
|
367
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
298
368
|
}
|
|
299
369
|
|
|
300
370
|
[data-scope='combobox'][data-part='item-group'] {
|
|
@@ -317,7 +387,7 @@
|
|
|
317
387
|
padding-block: var(--xh-combobox-group-label-py, var(--xh-space-1));
|
|
318
388
|
padding-inline: var(--xh-combobox-group-label-px, var(--xh-control-px-md));
|
|
319
389
|
color: var(--xh-combobox-group-label-fg, var(--xh-fg-subtle));
|
|
320
|
-
font-size: var(--xh-combobox-group-label-font-size, var(--xh-
|
|
390
|
+
font-size: var(--xh-combobox-group-label-font-size, var(--xh-text-caption-size));
|
|
321
391
|
font-weight: var(--xh-combobox-group-label-font-weight, var(--xh-font-weight-medium));
|
|
322
392
|
line-height: var(--xh-leading-none);
|
|
323
393
|
user-select: none;
|
|
@@ -355,6 +425,9 @@
|
|
|
355
425
|
两套底色各画各的会出现"鼠标停在 A 上、回车提交的却是 B" */
|
|
356
426
|
[data-scope='combobox'][data-part='item'][data-highlighted]:not([data-disabled]) {
|
|
357
427
|
background: var(--xh-combobox-item-bg-hover, var(--xh-bg-subtle));
|
|
428
|
+
/* 焦点恒在输入框,高亮条目自带内收环;列表是滚动容器,环画在外沿会被裁掉 */
|
|
429
|
+
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
430
|
+
outline-offset: calc(-1 * var(--xh-ring-width));
|
|
358
431
|
}
|
|
359
432
|
|
|
360
433
|
/* 选中只换文字色与字重,配合行尾的 ✓ 标记;底色整条通道留给高亮,
|
|
@@ -401,7 +474,14 @@
|
|
|
401
474
|
|
|
402
475
|
/* 同上:没写内容就由皮肤画勾 */
|
|
403
476
|
[data-scope='combobox'][data-part='item-indicator']:empty::before {
|
|
404
|
-
content: '
|
|
477
|
+
content: '';
|
|
478
|
+
display: inline-block;
|
|
479
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
480
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
481
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
482
|
+
background-color: currentColor;
|
|
483
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
484
|
+
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
405
485
|
}
|
|
406
486
|
|
|
407
487
|
[data-scope='combobox'][data-part='item-indicator'][data-state='checked'] {
|
|
@@ -424,7 +504,7 @@
|
|
|
424
504
|
color: var(--xh-combobox-empty-fg, var(--xh-fg-subtle));
|
|
425
505
|
font-size: var(--xh-combobox-empty-font-size, var(--xh-_combobox-font-size));
|
|
426
506
|
line-height: var(--xh-leading-none);
|
|
427
|
-
box-shadow: var(--xh-combobox-empty-shadow, var(--xh-elevation-
|
|
507
|
+
box-shadow: var(--xh-combobox-empty-shadow, var(--xh-elevation-floating));
|
|
428
508
|
text-align: center;
|
|
429
509
|
pointer-events: auto;
|
|
430
510
|
}
|
package/css/composer.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='composer'] {
|
|
4
|
+
--xh-composer-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 边框画在 root 上,内部 textarea 无边框;align-items: flex-end 让按钮随输入框长高贴着底边 */
|
|
3
8
|
[data-scope='composer'][data-part='root'] {
|
|
4
9
|
/* 输入与发送按钮共用的控件高度 */
|
|
@@ -7,7 +12,8 @@
|
|
|
7
12
|
display: flex;
|
|
8
13
|
align-items: flex-end;
|
|
9
14
|
gap: var(--xh-composer-gap, var(--xh-control-gap-md));
|
|
10
|
-
|
|
15
|
+
/* 整框的内衬走控件内边距尺的小档,密度收紧时随之收窄 */
|
|
16
|
+
padding: var(--xh-composer-p, var(--xh-control-px-sm));
|
|
11
17
|
border: var(--xh-stroke-thin) solid var(--xh-composer-border, var(--xh-border-control));
|
|
12
18
|
border-radius: var(--xh-composer-radius, var(--xh-shape-surface));
|
|
13
19
|
background: var(--xh-composer-bg, var(--xh-bg-surface));
|
|
@@ -20,14 +26,15 @@
|
|
|
20
26
|
|
|
21
27
|
/* 焦点环画在整个框上;用 focus-within 使焦点落在发送按钮时同样点亮 */
|
|
22
28
|
[data-scope='composer'][data-part='root']:focus-within {
|
|
29
|
+
border-color: var(--xh-composer-root-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
|
|
23
30
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
24
31
|
outline-offset: var(--xh-ring-offset);
|
|
25
32
|
}
|
|
26
33
|
|
|
27
|
-
/*
|
|
34
|
+
/* 禁用态只换光标与底色;文字由 textarea 与按钮各自走 fg-disabled,整框不再压 opacity,两者叠起来会压到读不出 */
|
|
28
35
|
[data-scope='composer'][data-part='root'][data-disabled] {
|
|
29
36
|
cursor: not-allowed;
|
|
30
|
-
|
|
37
|
+
background: var(--xh-composer-bg-disabled, var(--xh-bg-subtle));
|
|
31
38
|
}
|
|
32
39
|
|
|
33
40
|
/* 无边框透明底,融进 root 的框里;min-inline-size: 0 防止长内容把弹性子项撑出容器 */
|