@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
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
@layer xihan.motion {
|
|
2
|
+
/*
|
|
3
|
+
* 九个位共用同一条进出场,位移不跟着落位走:要按位置分方向,就得从 group 的
|
|
4
|
+
* data-placement 反向选到卡片上,落位一改名整条动效静默失效。
|
|
5
|
+
* 竖向一小段位移在九个位上都说得通。
|
|
6
|
+
*/
|
|
7
|
+
@keyframes xh-notification-in {
|
|
8
|
+
from {
|
|
9
|
+
opacity: 0;
|
|
10
|
+
translate: 0 var(--xh-motion-distance-md);
|
|
11
|
+
scale: var(--xh-motion-scale-enter);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
to {
|
|
15
|
+
opacity: 1;
|
|
16
|
+
translate: 0 0;
|
|
17
|
+
scale: 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* loading 那枚字形自己转。逐皮肤自带一份:跨皮肤共用动画名,
|
|
22
|
+
引用方那份皮肤不在场时动画就静默不跑 */
|
|
23
|
+
@keyframes xh-notification-spin {
|
|
24
|
+
to {
|
|
25
|
+
rotate: 360deg;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@keyframes xh-notification-out {
|
|
30
|
+
from {
|
|
31
|
+
opacity: 1;
|
|
32
|
+
translate: 0 0;
|
|
33
|
+
scale: 1;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
to {
|
|
37
|
+
opacity: 0;
|
|
38
|
+
translate: 0 var(--xh-motion-distance-md);
|
|
39
|
+
scale: var(--xh-motion-scale-enter);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@layer xihan.components {
|
|
45
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
46
|
+
[data-scope='notification'] {
|
|
47
|
+
--xh-notification-skin: 1;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* 作用域包装不占布局:通知落在哪儿由九个 group 各自的 fixed 说了算,
|
|
51
|
+
root 只是把队列的作用域圈起来(地标挂在那一摞上,不在这里)。
|
|
52
|
+
它若留下一个块盒,写在页面中段的用法(按钮和队列摆在一起)就会凭空多出一行空白。
|
|
53
|
+
另一件必须提防的事:fixed 认的是视口,祖先上一旦出现
|
|
54
|
+
transform / filter / backdrop-filter / contain,包含块就被抢走,整摞通知立刻贴错位置——
|
|
55
|
+
所以这里连 position 都不碰,也别往覆盖钩子里加这几个属性。 */
|
|
56
|
+
[data-scope='notification'][data-part='root'] {
|
|
57
|
+
display: contents;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* 只要声明过 display,就盖掉了 UA 的 [hidden]{display:none},收起态得自己补回来 */
|
|
61
|
+
[data-scope='notification'][data-part='root'][hidden] {
|
|
62
|
+
display: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/*
|
|
66
|
+
* 一摞 = 一整面视口大小的定位面:贴边靠 padding,九个位靠 justify/align 表达。
|
|
67
|
+
* 不用四角 inset 逐个摆,是因为 column flex 的 align-items 走的是行内轴,
|
|
68
|
+
* RTL 下 start/end 自动跟着翻;写死 inset-inline-start 的话居中那三个位
|
|
69
|
+
* 还得再配一次 translate,方向一变就错。
|
|
70
|
+
* 条目次序按队列原样(旧的在前):贴底那三个位于是新的离屏幕边最近,符合直觉。
|
|
71
|
+
*/
|
|
72
|
+
[data-scope='notification'][data-part='group'] {
|
|
73
|
+
position: fixed;
|
|
74
|
+
inset-block: 0;
|
|
75
|
+
inset-inline: 0;
|
|
76
|
+
z-index: var(--xh-notification-layer, var(--xh-layer-toast));
|
|
77
|
+
display: flex;
|
|
78
|
+
flex-direction: column;
|
|
79
|
+
/* 基线按默认落位 bottom-end 写,下面只覆盖跟它不同的那几个位 */
|
|
80
|
+
justify-content: flex-end;
|
|
81
|
+
align-items: center;
|
|
82
|
+
padding-block: var(--xh-notification-inset, var(--xh-space-6));
|
|
83
|
+
padding-inline: var(--xh-notification-inset, var(--xh-space-6));
|
|
84
|
+
/* 摞内间距由连接层写进内联 style(两个适配器共用同一份),这里绝不重复写:
|
|
85
|
+
写了也会被内联盖掉,只会让人误以为间距归样式层管 */
|
|
86
|
+
/* 整面铺开就等于罩住了整块视口。面本身不吃指针,只有卡片吃(见下),
|
|
87
|
+
否则九个位一叠,底下的页面就再也点不动了 */
|
|
88
|
+
pointer-events: none;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
[data-scope='notification'][data-part='group'][hidden] {
|
|
92
|
+
display: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* 空摞直接撤掉:九个位同时挂九张全屏定位面,白白多九个合成层 */
|
|
96
|
+
[data-scope='notification'][data-part='group'][data-empty] {
|
|
97
|
+
display: none;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* 块轴落位:^= 一次吃掉某一行的三个位(top / top-start / top-end) */
|
|
101
|
+
[data-scope='notification'][data-part='group'][data-placement^='top'] {
|
|
102
|
+
justify-content: flex-start;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
[data-scope='notification'][data-part='group'][data-placement^='middle'] {
|
|
106
|
+
justify-content: center;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* 行内轴落位:不带后缀的 top / middle / bottom 用基线的居中 */
|
|
110
|
+
[data-scope='notification'][data-part='group'][data-placement$='-start'] {
|
|
111
|
+
align-items: flex-start;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
[data-scope='notification'][data-part='group'][data-placement$='-end'] {
|
|
115
|
+
align-items: flex-end;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/*
|
|
119
|
+
* 一张通知卡:左列一枚类型字形,右列「标题 + 说明 + 操作」竖着排,叉钉在右上角。
|
|
120
|
+
* 用网格而不是竖排 flex:叉要脱离文档流钉到角上,正文要在字形右边成一列——
|
|
121
|
+
* 竖排 flex 里这两件事都做不到(叉会变成第三行)。
|
|
122
|
+
* 底与描边一律中性,语气只由左列那枚字形承载:整片兑色是轻提示那条的做法,
|
|
123
|
+
* 一张有标题有正文的卡片全片染色会把两层文字都压在同一片语气色上。
|
|
124
|
+
*/
|
|
125
|
+
[data-scope='notification'][data-part='item'] {
|
|
126
|
+
/* 叉与操作钮的兜底字形按控件指示符那一档走;左列那枚类型字形另有自己的尺寸 */
|
|
127
|
+
--xh-icon-size: var(--xh-notification-icon-size, var(--xh-control-indicator-size));
|
|
128
|
+
|
|
129
|
+
position: relative;
|
|
130
|
+
display: grid;
|
|
131
|
+
/* 左列宽度由字形自己决定,作者不放指示符时它就是 0,正文自然贴到左内衬 */
|
|
132
|
+
grid-template-columns: auto 1fr;
|
|
133
|
+
align-items: start;
|
|
134
|
+
column-gap: var(--xh-notification-gap, var(--xh-space-3));
|
|
135
|
+
row-gap: var(--xh-notification-row-gap, var(--xh-space-2));
|
|
136
|
+
inline-size: var(--xh-notification-w, var(--xh-overlay-max-w-lg));
|
|
137
|
+
/* 摞是整面视口宽的定位面且带内边距,取 100% 就等于自动让出两侧留白,
|
|
138
|
+
窄屏上不必再算一遍 viewport 减法 */
|
|
139
|
+
max-inline-size: 100%;
|
|
140
|
+
padding-block: var(--xh-notification-py, var(--xh-space-4));
|
|
141
|
+
padding-inline: var(--xh-notification-px, var(--xh-space-4));
|
|
142
|
+
border: var(--xh-stroke-thin) solid var(--xh-notification-border, var(--xh-border-default));
|
|
143
|
+
border-radius: var(--xh-notification-radius, var(--xh-shape-surface));
|
|
144
|
+
background: var(--xh-notification-bg, var(--xh-bg-surface-raised));
|
|
145
|
+
color: var(--xh-notification-fg, var(--xh-fg-default));
|
|
146
|
+
box-shadow: var(--xh-notification-shadow, var(--xh-elevation-sheet));
|
|
147
|
+
font-size: var(--xh-notification-font-size, var(--xh-text-body-size));
|
|
148
|
+
line-height: var(--xh-notification-leading, var(--xh-text-body-leading));
|
|
149
|
+
/* 摞的定位面整面铺开且不吃指针,卡片必须自己吃回来:
|
|
150
|
+
悬停按住计时、按钮可点、焦点进出,全指着这一条 */
|
|
151
|
+
pointer-events: auto;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* 除指示符外一律落第二列:作者往卡片里塞的任何东西都跟着正文走 */
|
|
155
|
+
[data-scope='notification'][data-part='item'] > *:not([data-part='item-indicator']) {
|
|
156
|
+
grid-column: 2;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* 退场窗口走完连接层给的是 hidden 属性,而上面声明了 display——
|
|
160
|
+
漏掉这条,已经"卸载"的通知会一直杵在屏幕上,且再也没人来收 */
|
|
161
|
+
[data-scope='notification'][data-part='item'][hidden] {
|
|
162
|
+
display: none;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* 生命周期只有三段,unmounted 那段由上面的 [hidden] 收走,这里只管前两段 */
|
|
166
|
+
[data-scope='notification'][data-part='item'][data-state='visible'] {
|
|
167
|
+
animation: xh-notification-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* forwards 不能省:退场窗口(removeDelay 默认 200ms)比退场动画长,
|
|
171
|
+
不定住末帧的话动画跑完会弹回全不透明,卡片在被收起前先闪一下 */
|
|
172
|
+
[data-scope='notification'][data-part='item'][data-state='dismissing'] {
|
|
173
|
+
animation: xh-notification-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* 独占第一列第一行,并与标题首行顶对齐:盒高取一行标题的行高,
|
|
177
|
+
字形在盒里居中,标题字号改了也不会错位 */
|
|
178
|
+
[data-scope='notification'][data-part='item-indicator'] {
|
|
179
|
+
--xh-icon-size: var(--xh-notification-indicator-size, var(--xh-glyph-size-md));
|
|
180
|
+
|
|
181
|
+
grid-column: 1;
|
|
182
|
+
grid-row: 1;
|
|
183
|
+
display: inline-flex;
|
|
184
|
+
align-items: center;
|
|
185
|
+
justify-content: center;
|
|
186
|
+
block-size: calc(var(--xh-notification-title-font-size, var(--xh-text-label-size)) * var(--xh-leading-tight));
|
|
187
|
+
inline-size: var(--xh-notification-indicator-size, var(--xh-glyph-size-md));
|
|
188
|
+
color: var(--xh-notification-indicator-fg, var(--xh-_tone-fg));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
[data-scope='notification'][data-part='item-indicator'][hidden] {
|
|
192
|
+
display: none;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* 作者没往指示符里写内容就由皮肤画兜底字形,按语气各画一枚;
|
|
196
|
+
塞了自己的图形这几条即不命中 */
|
|
197
|
+
[data-scope='notification'][data-part='item-indicator']:empty::before {
|
|
198
|
+
content: '';
|
|
199
|
+
display: inline-block;
|
|
200
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
201
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
202
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
203
|
+
background-color: currentColor;
|
|
204
|
+
-webkit-mask: var(--xh-glyph-mark-info) center / contain no-repeat;
|
|
205
|
+
mask: var(--xh-glyph-mark-info) center / contain no-repeat;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
[data-scope='notification'][data-part='item'][data-type='success'] [data-part='item-indicator']:empty::before {
|
|
209
|
+
-webkit-mask-image: var(--xh-glyph-mark-check);
|
|
210
|
+
mask-image: var(--xh-glyph-mark-check);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
[data-scope='notification'][data-part='item'][data-type='warning'] [data-part='item-indicator']:empty::before {
|
|
214
|
+
-webkit-mask-image: var(--xh-glyph-mark-warning);
|
|
215
|
+
mask-image: var(--xh-glyph-mark-warning);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
[data-scope='notification'][data-part='item'][data-type='error'] [data-part='item-indicator']:empty::before {
|
|
219
|
+
-webkit-mask-image: var(--xh-glyph-mark-close);
|
|
220
|
+
mask-image: var(--xh-glyph-mark-close);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/* loading 说的是「事情还没完」,不是好消息也不是坏消息:走中性前景档而不是语气色 */
|
|
224
|
+
[data-scope='notification'][data-part='item'][data-type='loading'] [data-part='item-indicator'] {
|
|
225
|
+
color: var(--xh-notification-indicator-fg, var(--xh-fg-muted));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
[data-scope='notification'][data-part='item'][data-type='loading'] [data-part='item-indicator']:empty::before {
|
|
229
|
+
-webkit-mask-image: var(--xh-glyph-mark-rotate-right);
|
|
230
|
+
mask-image: var(--xh-glyph-mark-rotate-right);
|
|
231
|
+
animation: xh-notification-spin var(--xh-spin-duration) linear infinite;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* 减少动效:转圈停下,静止的箭头仍然读得出「还没好」;
|
|
235
|
+
"在等什么"由卡片上的 role=status 与可见文案继续承担。
|
|
236
|
+
两组规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
|
|
237
|
+
@media (prefers-reduced-motion: reduce) {
|
|
238
|
+
[data-scope='notification'][data-part='item'][data-type='loading'] [data-part='item-indicator']:empty::before {
|
|
239
|
+
animation: none;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
:where([data-motion='reduce']) [data-scope='notification'][data-part='item'][data-type='loading'] [data-part='item-indicator']:empty::before {
|
|
244
|
+
animation: none;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
[data-scope='notification'][data-part='item-title'] {
|
|
248
|
+
/* 作者可能把它写成 h2/p,外边距得先归零,否则卡片内的行距对不上 */
|
|
249
|
+
margin: 0;
|
|
250
|
+
color: var(--xh-notification-title-fg, var(--xh-fg-default));
|
|
251
|
+
font-size: var(--xh-notification-title-font-size, var(--xh-text-label-size));
|
|
252
|
+
font-weight: var(--xh-notification-title-font-weight, var(--xh-font-weight-semibold));
|
|
253
|
+
line-height: var(--xh-notification-title-leading, var(--xh-leading-tight));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/* 叉钉在右上角,标题得给它让位;说明与操作在第二行往下,不受影响 */
|
|
257
|
+
[data-scope='notification'][data-part='item']:has([data-part='item-close-trigger']) [data-part='item-title'] {
|
|
258
|
+
padding-inline-end: calc(var(--xh-notification-close-size, var(--xh-control-h-sm)) + var(--xh-space-2));
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
[data-scope='notification'][data-part='item-description'] {
|
|
262
|
+
margin: 0;
|
|
263
|
+
color: var(--xh-notification-description-fg, var(--xh-fg-muted));
|
|
264
|
+
font-size: var(--xh-notification-description-font-size, var(--xh-text-secondary-size));
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/* 没给文案的那一个仍然要留在 DOM 里(aria-labelledby / aria-describedby 指着它),
|
|
268
|
+
但空盒子会照吃一份 gap,卡片看着就多出一截莫名的留白 */
|
|
269
|
+
[data-scope='notification'][data-part='item-title']:empty,
|
|
270
|
+
[data-scope='notification'][data-part='item-description']:empty {
|
|
271
|
+
display: none;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
[data-scope='notification'][data-part='item-title'][hidden],
|
|
275
|
+
[data-scope='notification'][data-part='item-description'][hidden] {
|
|
276
|
+
display: none;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
[data-scope='notification'][data-part='item-action-trigger'] {
|
|
280
|
+
/* 网格列默认拉满,按钮要贴着起始侧收成自己的宽度 */
|
|
281
|
+
justify-self: start;
|
|
282
|
+
display: inline-flex;
|
|
283
|
+
align-items: center;
|
|
284
|
+
justify-content: center;
|
|
285
|
+
block-size: var(--xh-notification-action-h, var(--xh-control-h-sm));
|
|
286
|
+
padding-inline: var(--xh-notification-action-px, var(--xh-control-px-sm));
|
|
287
|
+
border: var(--xh-stroke-thin) solid var(--xh-notification-action-border, var(--xh-border-default));
|
|
288
|
+
border-radius: var(--xh-notification-action-radius, var(--xh-shape-control));
|
|
289
|
+
background: var(--xh-notification-action-bg, var(--xh-bg-subtle));
|
|
290
|
+
color: var(--xh-notification-action-fg, var(--xh-fg-default));
|
|
291
|
+
/* 按钮不继承字族字号,不接回来的话卡片里会突然冒出一段系统 UI 字体 */
|
|
292
|
+
font: inherit;
|
|
293
|
+
font-weight: var(--xh-notification-action-font-weight, var(--xh-font-weight-medium));
|
|
294
|
+
line-height: var(--xh-leading-none);
|
|
295
|
+
cursor: pointer;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
[data-scope='notification'][data-part='item-action-trigger'][hidden] {
|
|
299
|
+
display: none;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
[data-scope='notification'][data-part='item-action-trigger']:hover:not(:disabled) {
|
|
303
|
+
background: var(--xh-notification-action-bg-hover, var(--xh-bg-subtle-hover));
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
[data-scope='notification'][data-part='item-action-trigger']:active:not(:disabled) {
|
|
307
|
+
background: var(--xh-notification-action-bg-active, var(--xh-bg-subtle-active));
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
[data-scope='notification'][data-part='item-action-trigger']:focus-visible {
|
|
311
|
+
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
312
|
+
outline-offset: var(--xh-ring-offset);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/* 钉在右上角的内衬处,不参与网格排布——留在流里它会变成正文下面的第三行 */
|
|
316
|
+
[data-scope='notification'][data-part='item-close-trigger'] {
|
|
317
|
+
position: absolute;
|
|
318
|
+
inset-block-start: var(--xh-notification-close-inset, var(--xh-space-3));
|
|
319
|
+
inset-inline-end: var(--xh-notification-close-inset, var(--xh-space-3));
|
|
320
|
+
display: inline-flex;
|
|
321
|
+
align-items: center;
|
|
322
|
+
justify-content: center;
|
|
323
|
+
block-size: var(--xh-notification-close-size, var(--xh-control-h-sm));
|
|
324
|
+
inline-size: var(--xh-notification-close-size, var(--xh-control-h-sm));
|
|
325
|
+
border: 0;
|
|
326
|
+
border-radius: var(--xh-notification-close-radius, var(--xh-shape-control));
|
|
327
|
+
background: transparent;
|
|
328
|
+
color: var(--xh-notification-close-fg, var(--xh-fg-muted));
|
|
329
|
+
font: inherit;
|
|
330
|
+
line-height: var(--xh-leading-none);
|
|
331
|
+
cursor: pointer;
|
|
332
|
+
transition:
|
|
333
|
+
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
334
|
+
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
335
|
+
scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/* closable=false 时连接层同时给了 hidden 与 disabled,这条是它真正收起的那一半:
|
|
339
|
+
上面声明了 display,不补回来就会留下一个按不动的叉,比压根没有叉更让人困惑 */
|
|
340
|
+
[data-scope='notification'][data-part='item-close-trigger'][hidden] {
|
|
341
|
+
display: none;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
[data-scope='notification'][data-part='item-close-trigger']:hover:not(:disabled) {
|
|
345
|
+
background: var(--xh-notification-close-bg-hover, var(--xh-bg-subtle-hover));
|
|
346
|
+
color: var(--xh-notification-close-fg-hover, var(--xh-fg-default));
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
[data-scope='notification'][data-part='item-close-trigger']:active {
|
|
350
|
+
background: var(--xh-notification-close-bg-active, var(--xh-bg-subtle-active));
|
|
351
|
+
scale: var(--xh-motion-scale-press);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/* 单体控件用原生 disabled。常规路径下它与 hidden 同时出现看不见,
|
|
355
|
+
但作者若在覆盖层把收起改了回来,至少还能看出这颗叉是按不动的 */
|
|
356
|
+
[data-scope='notification'][data-part='item-close-trigger']:disabled {
|
|
357
|
+
color: var(--xh-fg-disabled);
|
|
358
|
+
cursor: not-allowed;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
[data-scope='notification'][data-part='item-close-trigger']:focus-visible {
|
|
362
|
+
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
363
|
+
outline-offset: var(--xh-ring-offset);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
367
|
+
[data-scope='notification'][data-part='item-close-trigger']:empty::before {
|
|
368
|
+
content: '';
|
|
369
|
+
display: inline-block;
|
|
370
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
371
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
372
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
373
|
+
background-color: currentColor;
|
|
374
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
375
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
376
|
+
}
|
|
377
|
+
}
|
package/css/number-animation.css
CHANGED
|
@@ -24,14 +24,14 @@
|
|
|
24
24
|
|
|
25
25
|
/* —— 尺寸 —— */
|
|
26
26
|
[data-scope='number-animation'][data-part='root'][data-size='sm'] {
|
|
27
|
-
--xh-_number-animation-size: var(--xh-font-
|
|
27
|
+
--xh-_number-animation-size: var(--xh-control-font-lg);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
[data-scope='number-animation'][data-part='root'][data-size='md'] {
|
|
31
|
-
--xh-_number-animation-size: var(--xh-
|
|
31
|
+
--xh-_number-animation-size: var(--xh-text-heading-2-size);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
[data-scope='number-animation'][data-part='root'][data-size='lg'] {
|
|
35
|
-
--xh-_number-animation-size: var(--xh-
|
|
35
|
+
--xh-_number-animation-size: var(--xh-text-heading-1-size);
|
|
36
36
|
}
|
|
37
37
|
}
|