@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.
- package/CHANGELOG.md +447 -0
- package/README.md +1 -1
- package/css/accordion.css +56 -5
- package/css/alert.css +30 -5
- package/css/anchor.css +7 -7
- package/css/avatar-group.css +3 -3
- package/css/avatar.css +3 -3
- package/css/back-top.css +16 -1
- package/css/badge.css +16 -2
- package/css/breadcrumb.css +24 -4
- package/css/button-group.css +14 -13
- package/css/button.css +42 -11
- package/css/calendar.css +119 -2
- package/css/card.css +5 -5
- package/css/carousel.css +36 -5
- package/css/cascader.css +183 -102
- package/css/checkbox-group.css +41 -19
- package/css/checkbox.css +54 -8
- package/css/clipboard.css +2 -1
- package/css/code-block.css +12 -7
- package/css/collapsible.css +42 -2
- package/css/color-picker.css +111 -45
- package/css/combobox.css +114 -53
- package/css/composer.css +5 -3
- package/css/context-menu.css +97 -69
- package/css/date-field.css +91 -14
- package/css/date-picker.css +276 -65
- package/css/descriptions.css +2 -2
- package/css/dialog.css +40 -13
- package/css/download-trigger.css +76 -0
- package/css/drawer.css +45 -14
- package/css/dynamic-input.css +68 -17
- package/css/editable.css +12 -10
- package/css/ellipsis.css +1 -1
- package/css/empty-state.css +7 -7
- package/css/field.css +9 -6
- package/css/fieldset.css +69 -0
- package/css/file-upload.css +45 -7
- package/css/float-button.css +16 -1
- package/css/floating-panel.css +310 -0
- package/css/form.css +4 -4
- package/css/heatmap.css +410 -0
- package/css/highlight.css +1 -1
- package/css/hotkeys.css +90 -0
- package/css/hover-card.css +40 -45
- package/css/image-cropper.css +231 -0
- package/css/image-viewer.css +137 -12
- package/css/image.css +2 -2
- package/css/infinite-scroll.css +1 -1
- package/css/json-viewer.css +241 -0
- package/css/layout.css +6 -10
- package/css/list.css +8 -8
- package/css/listbox.css +20 -4
- package/css/loading-bar.css +7 -1
- package/css/log.css +1 -1
- package/css/marquee.css +9 -0
- package/css/masonry.css +63 -0
- package/css/mention.css +87 -33
- package/css/menu.css +113 -47
- package/css/menubar.css +146 -60
- package/css/navigation-menu.css +54 -29
- package/css/number-animation.css +3 -3
- package/css/number-field.css +173 -16
- package/css/overlay-arrow.css +51 -0
- package/css/page-header.css +5 -5
- package/css/pagination.css +13 -13
- package/css/password-input.css +356 -0
- package/css/pin-input.css +13 -10
- package/css/popconfirm.css +46 -10
- package/css/popover.css +70 -45
- package/css/popselect.css +183 -53
- package/css/progress.css +47 -7
- package/css/qr-code.css +1 -1
- package/css/radio-group.css +14 -8
- package/css/rating.css +2 -2
- package/css/reset.css +17 -0
- package/css/result.css +6 -6
- package/css/scroll-area.css +61 -89
- package/css/scrollbar.css +167 -0
- package/css/segmented.css +215 -0
- package/css/select.css +274 -125
- package/css/separator.css +2 -2
- package/css/side-nav.css +111 -19
- package/css/signature-pad.css +144 -0
- package/css/skeleton.css +7 -1
- package/css/slider.css +10 -10
- package/css/space.css +117 -0
- package/css/spinner.css +22 -10
- package/css/statistic.css +9 -9
- package/css/steps.css +25 -8
- package/css/switch.css +48 -6
- package/css/table.css +131 -37
- package/css/tabs.css +4 -4
- package/css/tag.css +177 -0
- package/css/tags-input.css +78 -40
- package/css/text-field.css +149 -36
- package/css/thread.css +1 -1
- package/css/time-field.css +97 -16
- package/css/time-picker.css +259 -69
- package/css/timeline.css +10 -10
- package/css/timer.css +119 -0
- package/css/toast.css +34 -10
- package/css/toaster.css +1 -1
- package/css/toggle.css +6 -6
- package/css/tone.css +10 -5
- package/css/toolbar.css +1 -1
- package/css/tooltip.css +36 -33
- package/css/tour.css +103 -58
- package/css/transfer.css +68 -17
- package/css/tree-select.css +185 -84
- package/css/tree.css +85 -1
- package/css/typography.css +4 -4
- package/css/undefined.css +11 -1
- package/css/virtualizer.css +3 -1
- package/css/watermark.css +1 -2
- package/index.css +17 -0
- package/index.unlayered.css +8659 -2799
- package/package.json +19 -3
package/css/combobox.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,15 +31,36 @@
|
|
|
18
31
|
--xh-combobox-skin: 1;
|
|
19
32
|
}
|
|
20
33
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
+
换档不必给每个部件各写一条选择器 */
|
|
24
55
|
--xh-_combobox-h: var(--xh-control-h-md);
|
|
25
56
|
--xh-_combobox-px: var(--xh-control-px-md);
|
|
26
57
|
--xh-_combobox-gap: var(--xh-control-gap-md);
|
|
27
58
|
--xh-_combobox-font-size: var(--xh-text-body-size);
|
|
28
59
|
--xh-_combobox-label-font-size: var(--xh-text-label-size);
|
|
29
60
|
|
|
61
|
+
/* 作者塞进指示符槽的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准 */
|
|
62
|
+
--xh-icon-size: var(--xh-combobox-icon-size, var(--xh-glyph-size-md));
|
|
63
|
+
|
|
30
64
|
/* 形态档只换这三个槽:缺省即 outline(描边 + 画布底) */
|
|
31
65
|
--xh-_combobox-control-bg: var(--xh-bg-canvas);
|
|
32
66
|
--xh-_combobox-control-border: var(--xh-border-control);
|
|
@@ -37,10 +71,12 @@
|
|
|
37
71
|
--xh-_combobox-ring: var(--xh-ring-focus);
|
|
38
72
|
--xh-_combobox-accent: var(--xh-_tone, var(--xh-bg-brand));
|
|
39
73
|
--xh-_combobox-item-selected-fg: var(--xh-_tone-fg, var(--xh-fg-brand-strong));
|
|
74
|
+
}
|
|
40
75
|
|
|
76
|
+
[data-scope='combobox'][data-part='root'] {
|
|
41
77
|
display: inline-flex;
|
|
42
78
|
flex-direction: column;
|
|
43
|
-
gap: var(--xh-combobox-gap, var(--xh-
|
|
79
|
+
gap: var(--xh-combobox-gap, var(--xh-space-1));
|
|
44
80
|
}
|
|
45
81
|
|
|
46
82
|
/* 只要声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
|
|
@@ -50,46 +86,51 @@
|
|
|
50
86
|
|
|
51
87
|
/* —— 尺寸 —— */
|
|
52
88
|
/* 缺省档写在上面的基础规则里 */
|
|
53
|
-
[data-scope='combobox'][data-part='root'][data-size='sm'] {
|
|
89
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
|
|
54
90
|
--xh-_combobox-h: var(--xh-control-h-sm);
|
|
55
91
|
--xh-_combobox-px: var(--xh-control-px-sm);
|
|
56
92
|
--xh-_combobox-gap: var(--xh-control-gap-sm);
|
|
57
|
-
--xh-_combobox-font-size: var(--xh-font-
|
|
58
|
-
--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));
|
|
59
97
|
}
|
|
60
98
|
|
|
61
|
-
[data-scope='combobox'][data-part='root'][data-size='lg'] {
|
|
99
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
|
|
62
100
|
--xh-_combobox-h: var(--xh-control-h-lg);
|
|
63
101
|
--xh-_combobox-px: var(--xh-control-px-lg);
|
|
64
102
|
--xh-_combobox-gap: var(--xh-control-gap-lg);
|
|
65
|
-
--xh-_combobox-font-size: var(--xh-font-
|
|
66
|
-
--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));
|
|
67
107
|
}
|
|
68
108
|
|
|
69
109
|
/* —— 形态 —— */
|
|
70
110
|
/* 输入类不做 solid:实心底压着可编辑的文字,读起来像块不可点的色板。
|
|
71
111
|
形态只决定描边与底色怎么用,用哪族颜色由 data-tone 决定 */
|
|
72
|
-
[data-scope='combobox'][data-part='root'][data-variant='outline'] {
|
|
112
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-variant='outline'] {
|
|
73
113
|
--xh-_combobox-control-bg: var(--xh-bg-canvas);
|
|
74
114
|
--xh-_combobox-control-border: var(--xh-border-control);
|
|
75
115
|
--xh-_combobox-control-border-hover: var(--xh-border-control-hover);
|
|
76
116
|
}
|
|
77
117
|
|
|
78
118
|
/* 填充式:底色顶替描边,悬停时才浮出一道淡边 */
|
|
79
|
-
[data-scope='combobox'][data-part='root'][data-variant='subtle'] {
|
|
119
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-variant='subtle'] {
|
|
80
120
|
--xh-_combobox-control-bg: var(--xh-_tone-subtle, var(--xh-bg-subtle));
|
|
81
121
|
--xh-_combobox-control-border: transparent;
|
|
82
122
|
--xh-_combobox-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
83
123
|
}
|
|
84
124
|
|
|
85
|
-
|
|
125
|
+
/* 无框:底与常态描边透明,悬停与聚焦浮出描边 */
|
|
126
|
+
[data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-variant='ghost'] {
|
|
86
127
|
--xh-_combobox-control-bg: transparent;
|
|
87
128
|
--xh-_combobox-control-border: transparent;
|
|
88
129
|
--xh-_combobox-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
89
130
|
}
|
|
90
131
|
|
|
91
132
|
[data-scope='combobox'][data-part='label'] {
|
|
92
|
-
color: var(--xh-combobox-label-fg, var(--xh-fg-
|
|
133
|
+
color: var(--xh-combobox-label-fg, var(--xh-fg-default));
|
|
93
134
|
font-size: var(--xh-combobox-label-font-size, var(--xh-_combobox-label-font-size));
|
|
94
135
|
font-weight: var(--xh-combobox-label-font-weight, var(--xh-text-label-weight));
|
|
95
136
|
line-height: var(--xh-leading-none);
|
|
@@ -105,7 +146,7 @@
|
|
|
105
146
|
display: inline-flex;
|
|
106
147
|
align-items: center;
|
|
107
148
|
gap: var(--xh-combobox-control-gap, var(--xh-_combobox-gap));
|
|
108
|
-
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));
|
|
109
150
|
block-size: var(--xh-combobox-control-h, var(--xh-_combobox-h));
|
|
110
151
|
padding-inline: var(--xh-combobox-control-px, var(--xh-_combobox-px));
|
|
111
152
|
border: var(--xh-stroke-thin) solid var(--xh-combobox-control-border, var(--xh-_combobox-control-border));
|
|
@@ -127,14 +168,17 @@
|
|
|
127
168
|
/* 焦点环画在 control 上而不是 input 上:视觉上的「框」是 control,
|
|
128
169
|
环若长在里面那个透明的 input 身上,就会缩在文字区里、与框错开一圈。
|
|
129
170
|
input 是这里唯一可聚焦的常规节点,:focus-within 与它的 :focus-visible 等价 */
|
|
130
|
-
[data-scope='combobox'][data-part='control']:focus-within {
|
|
131
|
-
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)));
|
|
132
173
|
outline: var(--xh-ring-width) solid var(--xh-_combobox-ring);
|
|
133
174
|
outline-offset: var(--xh-ring-offset);
|
|
134
175
|
}
|
|
135
176
|
|
|
136
177
|
[data-scope='combobox'][data-part='control'][data-invalid] {
|
|
137
|
-
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);
|
|
138
182
|
}
|
|
139
183
|
|
|
140
184
|
/* 只读仍可聚焦、可复制,所以不置灰,只把底色压下去表示"改不动" */
|
|
@@ -211,13 +255,14 @@
|
|
|
211
255
|
background: var(--xh-combobox-action-bg, transparent);
|
|
212
256
|
color: var(--xh-combobox-action-fg, var(--xh-fg-muted));
|
|
213
257
|
font-family: inherit;
|
|
214
|
-
font-size: var(--xh-combobox-action-font-size, var(--xh-
|
|
258
|
+
font-size: var(--xh-combobox-action-font-size, var(--xh-text-secondary-size));
|
|
215
259
|
line-height: var(--xh-leading-none);
|
|
216
260
|
cursor: pointer;
|
|
217
261
|
user-select: none;
|
|
218
|
-
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);
|
|
219
263
|
}
|
|
220
264
|
|
|
265
|
+
|
|
221
266
|
[data-scope='combobox'][data-part='trigger'][hidden],
|
|
222
267
|
[data-scope='combobox'][data-part='clear-trigger'][hidden] {
|
|
223
268
|
display: none;
|
|
@@ -232,12 +277,26 @@
|
|
|
232
277
|
|
|
233
278
|
/* 没写内容就由皮肤画箭头;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
234
279
|
[data-scope='combobox'][data-part='trigger']:empty::before {
|
|
235
|
-
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;
|
|
236
288
|
}
|
|
237
289
|
|
|
238
290
|
/* 同上:没写内容就由皮肤画叉 */
|
|
239
291
|
[data-scope='combobox'][data-part='clear-trigger']:empty::before {
|
|
240
|
-
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;
|
|
241
300
|
}
|
|
242
301
|
|
|
243
302
|
[data-scope='combobox'][data-part='trigger'][data-state='open']:empty::before,
|
|
@@ -254,57 +313,43 @@
|
|
|
254
313
|
[data-scope='combobox'][data-part='trigger']:active:not(:disabled),
|
|
255
314
|
[data-scope='combobox'][data-part='clear-trigger']:active:not(:disabled) {
|
|
256
315
|
background: var(--xh-combobox-action-bg-active, var(--xh-bg-subtle-active));
|
|
316
|
+
scale: var(--xh-motion-scale-press);
|
|
257
317
|
}
|
|
258
318
|
|
|
259
|
-
/*
|
|
260
|
-
留着是给程序化聚焦兜底,落焦时得看得见 */
|
|
319
|
+
/* 两个按钮都在盒里,盒的 :focus-within 已经画了一圈;这里再画一圈就是框里套框 */
|
|
261
320
|
[data-scope='combobox'][data-part='trigger']:focus-visible,
|
|
262
321
|
[data-scope='combobox'][data-part='clear-trigger']:focus-visible {
|
|
263
|
-
outline:
|
|
264
|
-
outline-offset: var(--xh-ring-offset);
|
|
322
|
+
outline: none;
|
|
265
323
|
}
|
|
266
324
|
|
|
267
|
-
[data-scope='combobox'][data-part='trigger']:disabled
|
|
268
|
-
[data-scope='combobox'][data-part='clear-trigger']:disabled {
|
|
325
|
+
[data-scope='combobox'][data-part='trigger']:disabled {
|
|
269
326
|
background: var(--xh-combobox-action-bg, transparent);
|
|
270
327
|
color: var(--xh-fg-disabled);
|
|
271
328
|
cursor: not-allowed;
|
|
272
329
|
}
|
|
273
330
|
|
|
274
|
-
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
275
|
-
[data-scope='combobox'][data-part='positioner'] {
|
|
276
|
-
position: fixed;
|
|
277
|
-
z-index: var(--xh-layer-popover);
|
|
278
|
-
/* 空壳不吃指针,交互只发生在 content 与 empty 上 */
|
|
279
|
-
pointer-events: none;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
283
|
-
[data-scope='combobox'][data-part='positioner'][data-hidden] {
|
|
284
|
-
visibility: hidden;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
331
|
[data-scope='combobox'][data-part='content'] {
|
|
288
332
|
display: flex;
|
|
289
333
|
flex-direction: column;
|
|
290
334
|
min-inline-size: var(--xh-combobox-content-min-w, var(--xh-overlay-min-w));
|
|
291
|
-
max-inline-size: var(--xh-combobox-content-max-w,
|
|
292
|
-
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));
|
|
293
337
|
padding-block: var(--xh-combobox-content-py, var(--xh-space-1));
|
|
294
338
|
padding-inline: var(--xh-combobox-content-px, var(--xh-space-1));
|
|
295
339
|
border: var(--xh-stroke-thin) solid var(--xh-combobox-content-border, var(--xh-border-default));
|
|
296
340
|
border-radius: var(--xh-combobox-content-radius, var(--xh-shape-surface));
|
|
297
341
|
background: var(--xh-combobox-content-bg, var(--xh-bg-surface));
|
|
298
342
|
color: var(--xh-combobox-content-fg, var(--xh-fg-default));
|
|
299
|
-
box-shadow: var(--xh-combobox-content-shadow, var(--xh-elevation-
|
|
343
|
+
box-shadow: var(--xh-combobox-content-shadow, var(--xh-elevation-floating));
|
|
300
344
|
overflow-y: auto;
|
|
301
345
|
pointer-events: auto;
|
|
302
346
|
}
|
|
303
347
|
|
|
304
|
-
/*
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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],那几处没有退场动画。 */
|
|
308
353
|
|
|
309
354
|
/* 列表从不承载焦点(焦点恒在输入框,高亮走 aria-activedescendant),
|
|
310
355
|
可滚动容器在某些浏览器里会被自动塞进 Tab 序列,落焦时不画环 */
|
|
@@ -313,7 +358,13 @@
|
|
|
313
358
|
}
|
|
314
359
|
|
|
315
360
|
[data-scope='combobox'][data-part='content'][data-state='open'] {
|
|
316
|
-
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;
|
|
317
368
|
}
|
|
318
369
|
|
|
319
370
|
[data-scope='combobox'][data-part='item-group'] {
|
|
@@ -336,7 +387,7 @@
|
|
|
336
387
|
padding-block: var(--xh-combobox-group-label-py, var(--xh-space-1));
|
|
337
388
|
padding-inline: var(--xh-combobox-group-label-px, var(--xh-control-px-md));
|
|
338
389
|
color: var(--xh-combobox-group-label-fg, var(--xh-fg-subtle));
|
|
339
|
-
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));
|
|
340
391
|
font-weight: var(--xh-combobox-group-label-font-weight, var(--xh-font-weight-medium));
|
|
341
392
|
line-height: var(--xh-leading-none);
|
|
342
393
|
user-select: none;
|
|
@@ -374,6 +425,9 @@
|
|
|
374
425
|
两套底色各画各的会出现"鼠标停在 A 上、回车提交的却是 B" */
|
|
375
426
|
[data-scope='combobox'][data-part='item'][data-highlighted]:not([data-disabled]) {
|
|
376
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));
|
|
377
431
|
}
|
|
378
432
|
|
|
379
433
|
/* 选中只换文字色与字重,配合行尾的 ✓ 标记;底色整条通道留给高亮,
|
|
@@ -420,7 +474,14 @@
|
|
|
420
474
|
|
|
421
475
|
/* 同上:没写内容就由皮肤画勾 */
|
|
422
476
|
[data-scope='combobox'][data-part='item-indicator']:empty::before {
|
|
423
|
-
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;
|
|
424
485
|
}
|
|
425
486
|
|
|
426
487
|
[data-scope='combobox'][data-part='item-indicator'][data-state='checked'] {
|
|
@@ -443,7 +504,7 @@
|
|
|
443
504
|
color: var(--xh-combobox-empty-fg, var(--xh-fg-subtle));
|
|
444
505
|
font-size: var(--xh-combobox-empty-font-size, var(--xh-_combobox-font-size));
|
|
445
506
|
line-height: var(--xh-leading-none);
|
|
446
|
-
box-shadow: var(--xh-combobox-empty-shadow, var(--xh-elevation-
|
|
507
|
+
box-shadow: var(--xh-combobox-empty-shadow, var(--xh-elevation-floating));
|
|
447
508
|
text-align: center;
|
|
448
509
|
pointer-events: auto;
|
|
449
510
|
}
|
package/css/composer.css
CHANGED
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
display: flex;
|
|
13
13
|
align-items: flex-end;
|
|
14
14
|
gap: var(--xh-composer-gap, var(--xh-control-gap-md));
|
|
15
|
-
|
|
15
|
+
/* 整框的内衬走控件内边距尺的小档,密度收紧时随之收窄 */
|
|
16
|
+
padding: var(--xh-composer-p, var(--xh-control-px-sm));
|
|
16
17
|
border: var(--xh-stroke-thin) solid var(--xh-composer-border, var(--xh-border-control));
|
|
17
18
|
border-radius: var(--xh-composer-radius, var(--xh-shape-surface));
|
|
18
19
|
background: var(--xh-composer-bg, var(--xh-bg-surface));
|
|
@@ -25,14 +26,15 @@
|
|
|
25
26
|
|
|
26
27
|
/* 焦点环画在整个框上;用 focus-within 使焦点落在发送按钮时同样点亮 */
|
|
27
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)));
|
|
28
30
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
29
31
|
outline-offset: var(--xh-ring-offset);
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
/*
|
|
34
|
+
/* 禁用态只换光标与底色;文字由 textarea 与按钮各自走 fg-disabled,整框不再压 opacity,两者叠起来会压到读不出 */
|
|
33
35
|
[data-scope='composer'][data-part='root'][data-disabled] {
|
|
34
36
|
cursor: not-allowed;
|
|
35
|
-
|
|
37
|
+
background: var(--xh-composer-bg-disabled, var(--xh-bg-subtle));
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
/* 无边框透明底,融进 root 的框里;min-inline-size: 0 防止长内容把弹性子项撑出容器 */
|
package/css/context-menu.css
CHANGED
|
@@ -4,11 +4,27 @@
|
|
|
4
4
|
--xh-context-menu-skin: 1;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
/*
|
|
8
|
-
[data-scope='context-menu'][data-part='
|
|
9
|
-
/*
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
8
|
+
[data-scope='context-menu'][data-part='positioner'] {
|
|
9
|
+
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,content 继承它限高;
|
|
10
|
+
引擎没算(尚未落位 / 无引擎)时不额外限高 */
|
|
11
|
+
--xh-_context-menu-available-h: 100vh;
|
|
12
|
+
|
|
13
|
+
position: fixed;
|
|
14
|
+
z-index: var(--xh-context-menu-layer, var(--xh-layer-popover));
|
|
15
|
+
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
16
|
+
pointer-events: none;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
20
|
+
[data-scope='context-menu'][data-part='positioner'][data-hidden] {
|
|
21
|
+
visibility: hidden;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
|
|
25
|
+
[data-scope='context-menu']:is([data-part='root'], [data-part='positioner']) {
|
|
26
|
+
/* 尺寸档只换这四个私有槽,条目与分组标题都从这两处继承它们,
|
|
27
|
+
换档不必给每个部件各写一条选择器 */
|
|
12
28
|
--xh-_context-menu-item-py: var(--xh-space-1_5);
|
|
13
29
|
--xh-_context-menu-item-px: var(--xh-control-px-md);
|
|
14
30
|
--xh-_context-menu-item-gap: var(--xh-control-gap-md);
|
|
@@ -17,9 +33,12 @@
|
|
|
17
33
|
/* 打开子菜单的触发条目走品牌淡底强档,随语气换色相;没写 data-tone 时退回品牌淡底。
|
|
18
34
|
悬停与键盘焦点恒中性灰轻档、不接语气槽——两档同色相的话打开路径就认不出来了 */
|
|
19
35
|
--xh-_context-menu-item-active-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
|
|
36
|
+
}
|
|
20
37
|
|
|
21
|
-
|
|
22
|
-
|
|
38
|
+
/* 根只是把触发区与浮层圈在一起做作用域,不该在作者布局里多插一层盒子 */
|
|
39
|
+
[data-scope='context-menu'][data-part='root'] {
|
|
40
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
41
|
+
--xh-icon-size: var(--xh-context-menu-icon-size, var(--xh-glyph-size-text));
|
|
23
42
|
|
|
24
43
|
display: contents;
|
|
25
44
|
}
|
|
@@ -31,18 +50,18 @@
|
|
|
31
50
|
/* —— 尺寸 —— */
|
|
32
51
|
/* 缺省档写在上面的基础规则里。条目高度由 padding 撑出来:
|
|
33
52
|
纵向走 space 档、行内内缩走 control-px 档(随密度轴),换档各挪一级 */
|
|
34
|
-
[data-scope='context-menu'][data-part='root'][data-size='sm'] {
|
|
53
|
+
[data-scope='context-menu']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
|
|
35
54
|
--xh-_context-menu-item-py: var(--xh-space-1);
|
|
36
55
|
--xh-_context-menu-item-px: var(--xh-control-px-sm);
|
|
37
56
|
--xh-_context-menu-item-gap: var(--xh-control-gap-sm);
|
|
38
|
-
--xh-_context-menu-font-size: var(--xh-font-
|
|
57
|
+
--xh-_context-menu-font-size: var(--xh-control-font-sm);
|
|
39
58
|
}
|
|
40
59
|
|
|
41
|
-
[data-scope='context-menu'][data-part='root'][data-size='lg'] {
|
|
60
|
+
[data-scope='context-menu']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
|
|
42
61
|
--xh-_context-menu-item-py: var(--xh-space-2);
|
|
43
62
|
--xh-_context-menu-item-px: var(--xh-control-px-lg);
|
|
44
63
|
--xh-_context-menu-item-gap: var(--xh-control-gap-lg);
|
|
45
|
-
--xh-_context-menu-font-size: var(--xh-font-
|
|
64
|
+
--xh-_context-menu-font-size: var(--xh-control-font-lg);
|
|
46
65
|
}
|
|
47
66
|
|
|
48
67
|
/* 触发区是作者自己的一块内容,尺寸与排布归他;这里只管交互观感:
|
|
@@ -57,38 +76,31 @@
|
|
|
57
76
|
outline-offset: var(--xh-ring-offset);
|
|
58
77
|
}
|
|
59
78
|
|
|
60
|
-
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
61
|
-
[data-scope='context-menu'][data-part='positioner'] {
|
|
62
|
-
position: fixed;
|
|
63
|
-
z-index: var(--xh-layer-popover);
|
|
64
|
-
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
65
|
-
pointer-events: none;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
69
|
-
[data-scope='context-menu'][data-part='positioner'][data-hidden] {
|
|
70
|
-
visibility: hidden;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
79
|
[data-scope='context-menu'][data-part='content'] {
|
|
74
80
|
display: flex;
|
|
75
81
|
flex-direction: column;
|
|
76
82
|
min-inline-size: var(--xh-context-menu-min-w, var(--xh-overlay-menu-min-w));
|
|
77
83
|
max-inline-size: var(--xh-context-menu-max-w, var(--xh-overlay-max-w));
|
|
84
|
+
/* 两道上限取更小的那道:自己的高度上限,以及落定那一侧真正剩下的空间。
|
|
85
|
+
列表族的 16rem 对命令菜单偏矮,这里另给一档 */
|
|
86
|
+
max-block-size: min(var(--xh-context-menu-max-h, var(--xh-overlay-menu-max-h)), var(--xh-_context-menu-available-h));
|
|
78
87
|
padding-block: var(--xh-context-menu-py, var(--xh-space-1));
|
|
79
88
|
padding-inline: var(--xh-context-menu-px, var(--xh-space-1));
|
|
80
89
|
border: var(--xh-stroke-thin) solid var(--xh-context-menu-border, var(--xh-border-default));
|
|
81
90
|
border-radius: var(--xh-context-menu-radius, var(--xh-shape-surface));
|
|
82
91
|
background: var(--xh-context-menu-bg, var(--xh-bg-surface));
|
|
83
92
|
color: var(--xh-context-menu-fg, var(--xh-fg-default));
|
|
84
|
-
box-shadow: var(--xh-context-menu-shadow, var(--xh-elevation-
|
|
93
|
+
box-shadow: var(--xh-context-menu-shadow, var(--xh-elevation-floating));
|
|
94
|
+
/* 条目超过上限就在菜单内部滚。条目的焦点环是内收的,滚动容器裁在内边距缘上,环切不着 */
|
|
95
|
+
overflow-y: auto;
|
|
85
96
|
pointer-events: auto;
|
|
86
97
|
}
|
|
87
98
|
|
|
88
|
-
/*
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
99
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
100
|
+
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
101
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
102
|
+
真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
|
|
103
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
92
104
|
|
|
93
105
|
/* 焦点落在容器上只有一种情形:指针打开、还没有任何条目当锚点。那一刻它认领着 Tab 位,
|
|
94
106
|
环画在浮层内沿,用户才看得出键盘此刻在哪儿;有锚点时环长在条目上,容器不再画 */
|
|
@@ -104,7 +116,13 @@
|
|
|
104
116
|
/* 展开时轻微涨开:菜单是被光标"点出来"的,纯淡入显得它一直都在
|
|
105
117
|
(不设 transform-origin:那个属性没有逻辑关键字,写死方向会在 RTL 下反着涨) */
|
|
106
118
|
[data-scope='context-menu'][data-part='content'][data-state='open'] {
|
|
107
|
-
animation: xh-
|
|
119
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
123
|
+
免得动画结束到真收起之间闪一下原样 */
|
|
124
|
+
[data-scope='context-menu'][data-part='content'][data-state='closed'] {
|
|
125
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
108
126
|
}
|
|
109
127
|
|
|
110
128
|
[data-scope='context-menu'][data-part='group'] {
|
|
@@ -123,7 +141,7 @@
|
|
|
123
141
|
padding-block: var(--xh-context-menu-group-label-py, var(--xh-space-1));
|
|
124
142
|
padding-inline: var(--xh-context-menu-group-label-px, var(--xh-_context-menu-item-px));
|
|
125
143
|
color: var(--xh-context-menu-group-label-fg, var(--xh-fg-subtle));
|
|
126
|
-
font-size: var(--xh-context-menu-group-label-font-size, var(--xh-
|
|
144
|
+
font-size: var(--xh-context-menu-group-label-font-size, var(--xh-text-caption-size));
|
|
127
145
|
font-weight: var(--xh-context-menu-group-label-font-weight, var(--xh-font-weight-medium));
|
|
128
146
|
line-height: var(--xh-leading-none);
|
|
129
147
|
user-select: none;
|
|
@@ -156,10 +174,8 @@
|
|
|
156
174
|
display: none;
|
|
157
175
|
}
|
|
158
176
|
|
|
159
|
-
/*
|
|
160
|
-
|
|
161
|
-
子部件够不着那个伪类,只能读这个标记 */
|
|
162
|
-
[data-scope='context-menu'][data-part='item']:not([data-disabled]):is(:hover, :focus, [data-highlighted]) {
|
|
177
|
+
/* 悬停与键盘锚点共用中性灰轻档:锚点只认连接层打的 data-highlighted,不读 :focus */
|
|
178
|
+
[data-scope='context-menu'][data-part='item']:not([data-disabled]):is(:hover, [data-highlighted]) {
|
|
163
179
|
background: var(--xh-context-menu-item-bg-hover, var(--xh-bg-subtle));
|
|
164
180
|
}
|
|
165
181
|
|
|
@@ -170,6 +186,25 @@
|
|
|
170
186
|
font-weight: var(--xh-context-menu-item-active-font-weight, var(--xh-font-weight-semibold));
|
|
171
187
|
}
|
|
172
188
|
|
|
189
|
+
/* 带子菜单的条目行尾画右向小箭头:不点开也看得出还有下一级。
|
|
190
|
+
位置靠 margin 顶到行尾,图形取兜底字形令牌 */
|
|
191
|
+
[data-scope='context-menu'][data-part='item'][aria-haspopup='menu']::after {
|
|
192
|
+
content: '';
|
|
193
|
+
flex: none;
|
|
194
|
+
margin-inline-start: auto;
|
|
195
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
196
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
197
|
+
background-color: currentColor;
|
|
198
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
199
|
+
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* rtl 下子菜单开在左侧,箭头跟着指向行进方向 */
|
|
203
|
+
[dir='rtl'] [data-scope='context-menu'][data-part='item'][aria-haspopup='menu']::after {
|
|
204
|
+
-webkit-mask-image: var(--xh-glyph-mark-chevron-left);
|
|
205
|
+
mask-image: var(--xh-glyph-mark-chevron-left);
|
|
206
|
+
}
|
|
207
|
+
|
|
173
208
|
/* 键盘走到条目上要画环:轻档底色只有 1.1:1,够不上焦点指示器的对比度要求。
|
|
174
209
|
指针悬停走的是程序化聚焦,鼠标模态下 :focus-visible 不匹配,不会误画 */
|
|
175
210
|
[data-scope='context-menu'][data-part='item']:focus-visible {
|
|
@@ -206,7 +241,7 @@
|
|
|
206
241
|
align-items: center;
|
|
207
242
|
justify-content: center;
|
|
208
243
|
inline-size: var(--xh-context-menu-item-indicator-size, var(--xh-control-indicator-size));
|
|
209
|
-
color: var(--xh-context-menu-item-indicator-fg, var(--xh-
|
|
244
|
+
color: var(--xh-context-menu-item-indicator-fg, var(--xh-fg-brand));
|
|
210
245
|
}
|
|
211
246
|
|
|
212
247
|
[data-scope='context-menu'][data-part='item-indicator'][hidden] {
|
|
@@ -227,57 +262,39 @@
|
|
|
227
262
|
display: none;
|
|
228
263
|
}
|
|
229
264
|
|
|
230
|
-
/*
|
|
265
|
+
/* 箭头的底色与描边色,几何在 overlay-arrow.css。
|
|
231
266
|
交叉轴落点由定位引擎经内联自定义属性写进来,没给时退回居中 */
|
|
232
267
|
[data-scope='context-menu'][data-part='arrow'] {
|
|
233
|
-
--xh-_context-menu-arrow-size: var(--xh-context-menu-arrow-size, var(--xh-overlay-arrow-size));
|
|
234
268
|
--xh-_context-menu-arrow-x: 50%;
|
|
235
269
|
--xh-_context-menu-arrow-y: 50%;
|
|
270
|
+
--xh-_overlay-arrow-size: var(--xh-context-menu-arrow-size, var(--xh-overlay-arrow-size));
|
|
271
|
+
--xh-_overlay-arrow-x: var(--xh-_context-menu-arrow-x);
|
|
272
|
+
--xh-_overlay-arrow-y: var(--xh-_context-menu-arrow-y);
|
|
236
273
|
|
|
237
|
-
position: absolute;
|
|
238
|
-
inline-size: var(--xh-_context-menu-arrow-size);
|
|
239
|
-
block-size: var(--xh-_context-menu-arrow-size);
|
|
240
274
|
background: var(--xh-context-menu-bg, var(--xh-bg-surface));
|
|
241
275
|
border: var(--xh-stroke-thin) solid var(--xh-context-menu-border, var(--xh-border-default));
|
|
242
|
-
rotate: 45deg;
|
|
243
276
|
}
|
|
244
277
|
|
|
245
278
|
[data-scope='context-menu'][data-part='arrow'][hidden] {
|
|
246
279
|
display: none;
|
|
247
280
|
}
|
|
248
281
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
border-block-start: 0;
|
|
260
|
-
border-inline-start: 0;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
[data-scope='context-menu'][data-part='arrow'][data-placement^='right'] {
|
|
264
|
-
inset-inline-start: calc(var(--xh-_context-menu-arrow-size) / -2);
|
|
265
|
-
inset-block-start: calc(var(--xh-_context-menu-arrow-y) - var(--xh-_context-menu-arrow-size) / 2);
|
|
266
|
-
border-block-start: 0;
|
|
267
|
-
border-inline-end: 0;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
[data-scope='context-menu'][data-part='arrow'][data-placement^='left'] {
|
|
271
|
-
inset-inline-end: calc(var(--xh-_context-menu-arrow-size) / -2);
|
|
272
|
-
inset-block-start: calc(var(--xh-_context-menu-arrow-y) - var(--xh-_context-menu-arrow-size) / 2);
|
|
273
|
-
border-block-end: 0;
|
|
274
|
-
border-inline-start: 0;
|
|
282
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
283
|
+
[data-scope='context-menu'][data-part='item-indicator']:empty::before {
|
|
284
|
+
content: '';
|
|
285
|
+
display: inline-block;
|
|
286
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
287
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
288
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
289
|
+
background-color: currentColor;
|
|
290
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
291
|
+
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
275
292
|
}
|
|
276
293
|
}
|
|
277
294
|
|
|
278
295
|
@layer xihan.motion {
|
|
279
296
|
/* 自带前缀独占一个名字,不动公共的那份关键帧 */
|
|
280
|
-
@keyframes xh-
|
|
297
|
+
@keyframes xh-pop-in {
|
|
281
298
|
from {
|
|
282
299
|
opacity: 0;
|
|
283
300
|
scale: var(--xh-motion-scale-enter);
|
|
@@ -288,4 +305,15 @@
|
|
|
288
305
|
scale: 1;
|
|
289
306
|
}
|
|
290
307
|
}
|
|
308
|
+
@keyframes xh-pop-out {
|
|
309
|
+
from {
|
|
310
|
+
opacity: 1;
|
|
311
|
+
scale: 1;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
to {
|
|
315
|
+
opacity: 0;
|
|
316
|
+
scale: var(--xh-motion-scale-enter);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
291
319
|
}
|