@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/accordion.css
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='accordion'] {
|
|
4
|
+
--xh-accordion-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
[data-scope='accordion'][data-part='root'] {
|
|
8
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
9
|
+
--xh-icon-size: var(--xh-accordion-icon-size, var(--xh-glyph-size-text));
|
|
10
|
+
|
|
3
11
|
/* 尺寸档只换这四个私有槽,标题栏从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
4
12
|
--xh-_accordion-trigger-h: var(--xh-control-h-md);
|
|
5
13
|
--xh-_accordion-trigger-px: var(--xh-control-px-md);
|
|
@@ -26,18 +34,18 @@
|
|
|
26
34
|
--xh-_accordion-trigger-h: var(--xh-control-h-sm);
|
|
27
35
|
--xh-_accordion-trigger-px: var(--xh-control-px-sm);
|
|
28
36
|
--xh-_accordion-trigger-gap: var(--xh-control-gap-sm);
|
|
29
|
-
--xh-_accordion-trigger-font-size: var(--xh-font-
|
|
37
|
+
--xh-_accordion-trigger-font-size: var(--xh-control-font-sm);
|
|
30
38
|
}
|
|
31
39
|
|
|
32
40
|
[data-scope='accordion'][data-part='root'][data-size='lg'] {
|
|
33
41
|
--xh-_accordion-trigger-h: var(--xh-control-h-lg);
|
|
34
42
|
--xh-_accordion-trigger-px: var(--xh-control-px-lg);
|
|
35
43
|
--xh-_accordion-trigger-gap: var(--xh-control-gap-lg);
|
|
36
|
-
--xh-_accordion-trigger-font-size: var(--xh-font-
|
|
44
|
+
--xh-_accordion-trigger-font-size: var(--xh-control-font-lg);
|
|
37
45
|
}
|
|
38
46
|
|
|
39
47
|
[data-scope='accordion'][data-part='item'] {
|
|
40
|
-
border-block-end:
|
|
48
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-accordion-item-border, var(--xh-border-default));
|
|
41
49
|
min-inline-size: 0;
|
|
42
50
|
}
|
|
43
51
|
|
|
@@ -92,17 +100,65 @@
|
|
|
92
100
|
transition: rotate var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
93
101
|
}
|
|
94
102
|
|
|
95
|
-
|
|
96
|
-
|
|
103
|
+
/* 没写内容就由皮肤画;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
104
|
+
[data-scope='accordion'][data-part='indicator']:empty::before {
|
|
105
|
+
content: '';
|
|
106
|
+
display: inline-block;
|
|
107
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
108
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
109
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
110
|
+
background-color: currentColor;
|
|
111
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
112
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
97
113
|
}
|
|
98
114
|
|
|
99
115
|
[data-scope='accordion'][data-part='indicator'][data-state='open'] {
|
|
100
116
|
rotate: 180deg;
|
|
101
117
|
}
|
|
102
118
|
|
|
119
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none }:补了动画一帧都播不出来。
|
|
120
|
+
收起由适配器在退场结束后写内联 display 落成,退场窗口内靠 connect 发的 inert 挡住焦点 */
|
|
103
121
|
[data-scope='accordion'][data-part='content'] {
|
|
122
|
+
display: grid;
|
|
123
|
+
grid-template-rows: 1fr;
|
|
124
|
+
overflow: clip;
|
|
104
125
|
padding-block: var(--xh-accordion-content-py, var(--xh-stack-gap-md));
|
|
105
126
|
padding-inline: var(--xh-accordion-content-px, var(--xh-control-px-md));
|
|
106
127
|
color: var(--xh-accordion-content-fg, var(--xh-fg-default));
|
|
107
128
|
}
|
|
129
|
+
|
|
130
|
+
[data-scope='accordion'][data-part='content'][data-state='open'] {
|
|
131
|
+
animation: xh-accordion-expand var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
[data-scope='accordion'][data-part='content'][data-state='closed'] {
|
|
135
|
+
animation: xh-accordion-collapse var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@layer xihan.motion {
|
|
140
|
+
/* 行高与内缩同帧动:内缩不归零的话,border-box 会把盒子钳在上下内缩之和上,收不干净 */
|
|
141
|
+
@keyframes xh-accordion-expand {
|
|
142
|
+
from {
|
|
143
|
+
grid-template-rows: 0fr;
|
|
144
|
+
padding-block: 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
to {
|
|
148
|
+
grid-template-rows: 1fr;
|
|
149
|
+
padding-block: var(--xh-accordion-content-py, var(--xh-stack-gap-md));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@keyframes xh-accordion-collapse {
|
|
154
|
+
from {
|
|
155
|
+
grid-template-rows: 1fr;
|
|
156
|
+
padding-block: var(--xh-accordion-content-py, var(--xh-stack-gap-md));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
to {
|
|
160
|
+
grid-template-rows: 0fr;
|
|
161
|
+
padding-block: 0;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
108
164
|
}
|
package/css/affix.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='affix'] {
|
|
4
|
+
--xh-affix-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 占位盒就是 content 在常规流里占的那块地方。
|
|
3
8
|
这里不声明 display,也不写高度:吸住时冻结的高度由连接层量好写进内联样式(它量得到,样式表量不到),
|
|
4
9
|
没吸住时高度就该跟着内容走。不给 display,UA 的 [hidden]{display:none} 也仍然压得住 */
|
package/css/alert.css
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='alert'] {
|
|
4
|
+
--xh-alert-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
[data-scope='alert'][data-part='root'] {
|
|
8
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
9
|
+
--xh-icon-size: var(--xh-alert-icon-size, var(--xh-glyph-size-text));
|
|
10
|
+
|
|
3
11
|
/* 强调色随语气走,底色/描边/图标色都由它推导出来,换语气不必逐条属性各写一遍。
|
|
4
12
|
没写 data-tone 时 --xh-_tone 没被声明,退回原来的 info 蓝 */
|
|
5
13
|
--xh-_alert-accent: var(--xh-_tone-soft, var(--xh-color-info-500));
|
|
@@ -19,7 +27,7 @@
|
|
|
19
27
|
border-radius: var(--xh-alert-radius, var(--xh-shape-surface));
|
|
20
28
|
background: var(--xh-alert-bg, var(--xh-_alert-tint));
|
|
21
29
|
color: var(--xh-alert-fg, var(--xh-fg-default));
|
|
22
|
-
font-size: var(--xh-alert-font-size, var(--xh-
|
|
30
|
+
font-size: var(--xh-alert-font-size, var(--xh-text-body-size));
|
|
23
31
|
line-height: var(--xh-alert-leading, var(--xh-leading-normal));
|
|
24
32
|
}
|
|
25
33
|
|
|
@@ -35,7 +43,7 @@
|
|
|
35
43
|
justify-content: center;
|
|
36
44
|
flex: none;
|
|
37
45
|
/* 与首行文字对齐:图标框高取一行正文的行高 */
|
|
38
|
-
block-size: calc(var(--xh-
|
|
46
|
+
block-size: calc(var(--xh-text-body-size) * var(--xh-leading-normal));
|
|
39
47
|
inline-size: var(--xh-alert-icon-size, var(--xh-control-indicator-size));
|
|
40
48
|
color: var(--xh-alert-icon-fg, var(--xh-_alert-accent));
|
|
41
49
|
}
|
|
@@ -51,7 +59,7 @@
|
|
|
51
59
|
[data-scope='alert'][data-part='title'] {
|
|
52
60
|
flex: 1 1 auto;
|
|
53
61
|
color: var(--xh-alert-title-fg, var(--xh-fg-default));
|
|
54
|
-
font-size: var(--xh-alert-title-font-size, var(--xh-
|
|
62
|
+
font-size: var(--xh-alert-title-font-size, var(--xh-text-label-size));
|
|
55
63
|
font-weight: var(--xh-alert-title-font-weight, var(--xh-font-weight-semibold));
|
|
56
64
|
line-height: var(--xh-alert-title-leading, var(--xh-leading-tight));
|
|
57
65
|
}
|
|
@@ -59,7 +67,7 @@
|
|
|
59
67
|
[data-scope='alert'][data-part='description'] {
|
|
60
68
|
flex: 1 1 100%;
|
|
61
69
|
color: var(--xh-alert-description-fg, var(--xh-fg-muted));
|
|
62
|
-
font-size: var(--xh-alert-description-font-size, var(--xh-
|
|
70
|
+
font-size: var(--xh-alert-description-font-size, var(--xh-text-secondary-size));
|
|
63
71
|
}
|
|
64
72
|
|
|
65
73
|
/* 没写标题时说明自己占满这一行,否则它会挤在标题旁边 */
|
|
@@ -84,6 +92,10 @@
|
|
|
84
92
|
font: inherit;
|
|
85
93
|
line-height: var(--xh-leading-none);
|
|
86
94
|
cursor: pointer;
|
|
95
|
+
transition:
|
|
96
|
+
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
97
|
+
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
98
|
+
scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
87
99
|
}
|
|
88
100
|
|
|
89
101
|
/* closable=false 时连接层同时给了 hidden 与 disabled,这条是它真正收起的那一半 */
|
|
@@ -91,11 +103,17 @@
|
|
|
91
103
|
display: none;
|
|
92
104
|
}
|
|
93
105
|
|
|
106
|
+
/* 悬停与按下的底色跟着语气走:提示本体已是该语气的淡底,叉的底色在同一色系里再深两档 */
|
|
94
107
|
[data-scope='alert'][data-part='close-trigger']:hover:not(:disabled) {
|
|
95
|
-
background:
|
|
108
|
+
background: var(--xh-alert-close-bg-hover, var(--xh-_tone-subtle-hover, var(--xh-bg-subtle-hover)));
|
|
96
109
|
color: var(--xh-alert-close-fg-hover, var(--xh-fg-default));
|
|
97
110
|
}
|
|
98
111
|
|
|
112
|
+
[data-scope='alert'][data-part='close-trigger']:active {
|
|
113
|
+
background: var(--xh-alert-close-bg-active, var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active)));
|
|
114
|
+
scale: var(--xh-motion-scale-press);
|
|
115
|
+
}
|
|
116
|
+
|
|
99
117
|
[data-scope='alert'][data-part='close-trigger']:disabled {
|
|
100
118
|
color: var(--xh-fg-disabled);
|
|
101
119
|
cursor: not-allowed;
|
|
@@ -105,4 +123,16 @@
|
|
|
105
123
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
106
124
|
outline-offset: var(--xh-ring-offset);
|
|
107
125
|
}
|
|
126
|
+
|
|
127
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
128
|
+
[data-scope='alert'][data-part='close-trigger']:empty::before {
|
|
129
|
+
content: '';
|
|
130
|
+
display: inline-block;
|
|
131
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
132
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
133
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
134
|
+
background-color: currentColor;
|
|
135
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
136
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
137
|
+
}
|
|
108
138
|
}
|
package/css/anchor.css
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='anchor'] {
|
|
4
|
+
--xh-anchor-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 根节点是 nav 地标,不参与排版:整条目录的布局全在 list 上,
|
|
3
8
|
这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
|
|
4
9
|
[data-scope='anchor'][data-part='root'] {
|
|
5
10
|
/* 尺寸档只换这两个私有槽,链接从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
6
11
|
--xh-_anchor-font-size: var(--xh-text-label-size);
|
|
7
|
-
--xh-_anchor-link-px: var(--xh-
|
|
12
|
+
--xh-_anchor-link-px: var(--xh-control-px-md);
|
|
8
13
|
/* 当前那一节的指示条与文字随语气走。没写 data-tone 时这两个槽都没被声明,退回原来的品牌色。
|
|
9
14
|
指示条是装饰性的色条,取柔和档;文字要压在普通背景上读,取语气的文字档。
|
|
10
15
|
聚焦环不在其列,它恒是 --xh-ring-focus */
|
|
@@ -17,14 +22,14 @@
|
|
|
17
22
|
}
|
|
18
23
|
|
|
19
24
|
/* —— 尺寸 —— */
|
|
20
|
-
/*
|
|
25
|
+
/* 缺省档写在上面的基础规则里;链接的内边距三档都走控件内边距那把尺 */
|
|
21
26
|
[data-scope='anchor'][data-part='root'][data-size='sm'] {
|
|
22
|
-
--xh-_anchor-font-size: var(--xh-font-
|
|
27
|
+
--xh-_anchor-font-size: var(--xh-control-font-sm);
|
|
23
28
|
--xh-_anchor-link-px: var(--xh-control-px-sm);
|
|
24
29
|
}
|
|
25
30
|
|
|
26
31
|
[data-scope='anchor'][data-part='root'][data-size='lg'] {
|
|
27
|
-
--xh-_anchor-font-size: var(--xh-font-
|
|
32
|
+
--xh-_anchor-font-size: var(--xh-control-font-lg);
|
|
28
33
|
--xh-_anchor-link-px: var(--xh-control-px-lg);
|
|
29
34
|
}
|
|
30
35
|
|
|
@@ -71,7 +76,7 @@
|
|
|
71
76
|
display: inline-flex;
|
|
72
77
|
align-items: center;
|
|
73
78
|
/* 一节的标题可能很长,压不住会把整列撑开 */
|
|
74
|
-
max-inline-size: var(--xh-anchor-link-max-w,
|
|
79
|
+
max-inline-size: var(--xh-anchor-link-max-w, var(--xh-nav-link-max-w));
|
|
75
80
|
padding-block: var(--xh-anchor-link-py, var(--xh-space-1));
|
|
76
81
|
padding-inline: var(--xh-anchor-link-px, var(--xh-_anchor-link-px));
|
|
77
82
|
border-radius: var(--xh-anchor-link-radius, var(--xh-shape-control));
|
|
@@ -98,7 +103,7 @@
|
|
|
98
103
|
|
|
99
104
|
/* 当前那一节:颜色与字重都跟着变,不只靠指示条——
|
|
100
105
|
指示条是可选部件,作者不渲染它时"当前在哪"仍然要看得出来 */
|
|
101
|
-
[data-scope='anchor'][data-part='link'][data-
|
|
106
|
+
[data-scope='anchor'][data-part='link'][data-current] {
|
|
102
107
|
color: var(--xh-anchor-link-fg-active, var(--xh-_anchor-accent-text));
|
|
103
108
|
font-weight: var(--xh-anchor-link-font-weight-active, var(--xh-font-weight-medium));
|
|
104
109
|
}
|
|
@@ -112,7 +117,7 @@
|
|
|
112
117
|
margin: 0;
|
|
113
118
|
inset-inline-start: calc(var(--xh-anchor-indicator-thickness, var(--xh-stroke-thick)) * -1);
|
|
114
119
|
inline-size: var(--xh-anchor-indicator-thickness, var(--xh-stroke-thick));
|
|
115
|
-
border-radius: var(--xh-anchor-indicator-radius, var(--xh-
|
|
120
|
+
border-radius: var(--xh-anchor-indicator-radius, var(--xh-shape-pill));
|
|
116
121
|
background: var(--xh-anchor-indicator-color, var(--xh-_anchor-accent));
|
|
117
122
|
transition:
|
|
118
123
|
inset-block-start var(--xh-motion-duration-enter) var(--xh-motion-ease-enter),
|
package/css/avatar-group.css
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='avatar-group'] {
|
|
4
|
+
--xh-avatar-group-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 一排叠放的头像:后一枚压在前一枚上。
|
|
3
8
|
组内共用的直径与字号在容器上写一次,沿继承流给每一枚;自己写了档位的那一枚仍按自己的档走 */
|
|
4
9
|
[data-scope='avatar-group'][data-part='root'] {
|
|
5
10
|
/* 私有槽位:整组共用的直径、字号与叠放量,换档只改这三个 */
|
|
6
11
|
--xh-_avatar-group-size: var(--xh-avatar-group-size, var(--xh-control-h-md));
|
|
7
|
-
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-
|
|
12
|
+
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-text-secondary-size));
|
|
8
13
|
--xh-_avatar-group-overlap: var(--xh-avatar-group-overlap, var(--xh-space-2_5));
|
|
9
14
|
|
|
10
15
|
/* 流给组内每一枚 */
|
|
@@ -26,13 +31,13 @@
|
|
|
26
31
|
字号与叠放量跟着直径一起缩放,小头像里回退字放得下、大头像里压住的那段也按比例长 */
|
|
27
32
|
[data-scope='avatar-group'][data-part='root'][data-size='sm'] {
|
|
28
33
|
--xh-_avatar-group-size: var(--xh-avatar-group-size, var(--xh-control-h-sm));
|
|
29
|
-
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-
|
|
34
|
+
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-control-caption-sm));
|
|
30
35
|
--xh-_avatar-group-overlap: var(--xh-avatar-group-overlap, var(--xh-space-2));
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
[data-scope='avatar-group'][data-part='root'][data-size='lg'] {
|
|
34
39
|
--xh-_avatar-group-size: var(--xh-avatar-group-size, var(--xh-control-h-lg));
|
|
35
|
-
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-
|
|
40
|
+
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-control-caption-lg));
|
|
36
41
|
--xh-_avatar-group-overlap: var(--xh-avatar-group-overlap, var(--xh-space-3));
|
|
37
42
|
}
|
|
38
43
|
|
package/css/avatar.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='avatar'] {
|
|
4
|
+
--xh-avatar-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
[data-scope='avatar'][data-part='root'] {
|
|
3
8
|
position: relative;
|
|
4
9
|
display: inline-flex;
|
|
@@ -11,7 +16,7 @@
|
|
|
11
16
|
border-radius: var(--xh-avatar-radius, var(--xh-shape-pill));
|
|
12
17
|
background: var(--xh-avatar-bg, var(--xh-bg-subtle));
|
|
13
18
|
color: var(--xh-avatar-fg, var(--xh-fg-muted));
|
|
14
|
-
font-size: var(--xh-avatar-font-size, var(--xh-
|
|
19
|
+
font-size: var(--xh-avatar-font-size, var(--xh-text-secondary-size));
|
|
15
20
|
font-weight: var(--xh-avatar-font-weight, var(--xh-font-weight-medium));
|
|
16
21
|
line-height: var(--xh-leading-none);
|
|
17
22
|
user-select: none;
|
|
@@ -22,13 +27,13 @@
|
|
|
22
27
|
[data-scope='avatar'][data-part='root'][data-size='sm'] {
|
|
23
28
|
inline-size: var(--xh-control-h-sm);
|
|
24
29
|
block-size: var(--xh-control-h-sm);
|
|
25
|
-
font-size: var(--xh-
|
|
30
|
+
font-size: var(--xh-control-caption-sm);
|
|
26
31
|
}
|
|
27
32
|
|
|
28
33
|
[data-scope='avatar'][data-part='root'][data-size='lg'] {
|
|
29
34
|
inline-size: var(--xh-control-h-lg);
|
|
30
35
|
block-size: var(--xh-control-h-lg);
|
|
31
|
-
font-size: var(--xh-
|
|
36
|
+
font-size: var(--xh-control-caption-lg);
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
/* 不声明 display,加载完成前的 hidden 直接交给浏览器的 [hidden] 规则收起 */
|
package/css/back-top.css
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='back-top'] {
|
|
4
|
+
--xh-back-top-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 定位壳:钉在视口的尾下角,用逻辑属性,RTL 下自动换到另一侧。
|
|
3
8
|
不声明 display —— 收起态由连接层写 hidden,UA 的 [hidden]{display:none} 得压得住 */
|
|
4
9
|
[data-scope='back-top'][data-part='root'] {
|
|
10
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
11
|
+
--xh-icon-size: var(--xh-back-top-icon-size, var(--xh-glyph-size-text));
|
|
12
|
+
|
|
5
13
|
/* 尺寸档只换这一个私有槽,按钮从壳继承,换档不必给每个部件各写一条选择器 */
|
|
6
14
|
--xh-_back-top-size: var(--xh-control-h-md);
|
|
7
15
|
|
|
@@ -34,7 +42,7 @@
|
|
|
34
42
|
background: var(--xh-back-top-bg, var(--xh-bg-surface-raised));
|
|
35
43
|
color: var(--xh-back-top-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
|
|
36
44
|
/* 浮在内容之上,靠投影与页面拉开层次 */
|
|
37
|
-
box-shadow: var(--xh-elevation-
|
|
45
|
+
box-shadow: var(--xh-back-top-shadow, var(--xh-elevation-sheet));
|
|
38
46
|
cursor: pointer;
|
|
39
47
|
transition:
|
|
40
48
|
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
@@ -58,4 +66,16 @@
|
|
|
58
66
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
59
67
|
outline-offset: var(--xh-ring-offset);
|
|
60
68
|
}
|
|
69
|
+
|
|
70
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
71
|
+
[data-scope='back-top'][data-part='trigger']:empty::before {
|
|
72
|
+
content: '';
|
|
73
|
+
display: inline-block;
|
|
74
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
75
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
76
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
77
|
+
background-color: currentColor;
|
|
78
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
|
|
79
|
+
mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
|
|
80
|
+
}
|
|
61
81
|
}
|
package/css/badge.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='badge'] {
|
|
4
|
+
--xh-badge-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
[data-scope='badge'][data-part='root'] {
|
|
3
8
|
display: inline-flex;
|
|
4
9
|
align-items: center;
|
|
@@ -9,12 +14,26 @@
|
|
|
9
14
|
border-radius: var(--xh-shape-pill);
|
|
10
15
|
background: var(--xh-badge-bg, var(--xh-bg-subtle));
|
|
11
16
|
color: var(--xh-badge-fg, var(--xh-fg-default));
|
|
12
|
-
font-size: var(--xh-badge-font-size, var(--xh-
|
|
17
|
+
font-size: var(--xh-badge-font-size, var(--xh-text-caption-size));
|
|
13
18
|
font-weight: var(--xh-badge-font-weight, var(--xh-font-weight-medium));
|
|
14
19
|
line-height: var(--xh-leading-none);
|
|
15
20
|
white-space: nowrap;
|
|
16
21
|
}
|
|
17
22
|
|
|
23
|
+
/* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
24
|
+
计数为 0 且没开 showZero 时连接层会发 hidden */
|
|
25
|
+
[data-scope='badge'][data-part='root'][hidden] {
|
|
26
|
+
display: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* 圆点形态:只表示「有」,不表示「有几个」——收掉内边距与文字盒 */
|
|
30
|
+
[data-scope='badge'][data-part='root'][data-dot] {
|
|
31
|
+
inline-size: var(--xh-badge-dot-size, var(--xh-space-2));
|
|
32
|
+
block-size: var(--xh-badge-dot-size, var(--xh-space-2));
|
|
33
|
+
padding: 0;
|
|
34
|
+
font-size: 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
18
37
|
/* —— 变体 —— */
|
|
19
38
|
/* 形态只决定颜色怎么用;用哪族颜色由 data-tone 决定,没写 tone 就沿用原来的品牌/中性配色 */
|
|
20
39
|
[data-scope='badge'][data-part='root'][data-variant='solid'] {
|
|
@@ -45,6 +64,6 @@
|
|
|
45
64
|
gap: var(--xh-space-1_5);
|
|
46
65
|
padding-inline: var(--xh-space-3);
|
|
47
66
|
padding-block: var(--xh-space-1);
|
|
48
|
-
font-size: var(--xh-
|
|
67
|
+
font-size: var(--xh-text-secondary-size);
|
|
49
68
|
}
|
|
50
69
|
}
|
package/css/breadcrumb.css
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='breadcrumb'] {
|
|
4
|
+
--xh-breadcrumb-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 根节点是 nav 地标,不参与排版:整条路径的行为全在 list 上,
|
|
3
8
|
这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
|
|
4
9
|
[data-scope='breadcrumb'][data-part='root'] {
|
|
10
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
11
|
+
--xh-icon-size: var(--xh-breadcrumb-icon-size, var(--xh-glyph-size-text));
|
|
12
|
+
|
|
5
13
|
/* 尺寸档只换这两个私有槽,列表与链接都从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
6
14
|
--xh-_breadcrumb-font-size: var(--xh-text-label-size);
|
|
7
15
|
--xh-_breadcrumb-gap: var(--xh-space-2);
|
|
@@ -18,12 +26,12 @@
|
|
|
18
26
|
/* 缺省档写在上面的基础规则里。间距量的是路径里文字与分隔符之间的距离,
|
|
19
27
|
不在控件间距那把尺上(那把尺的大档与中档同值),三档一律取空间尺 */
|
|
20
28
|
[data-scope='breadcrumb'][data-part='root'][data-size='sm'] {
|
|
21
|
-
--xh-_breadcrumb-font-size: var(--xh-font-
|
|
29
|
+
--xh-_breadcrumb-font-size: var(--xh-control-font-sm);
|
|
22
30
|
--xh-_breadcrumb-gap: var(--xh-space-1_5);
|
|
23
31
|
}
|
|
24
32
|
|
|
25
33
|
[data-scope='breadcrumb'][data-part='root'][data-size='lg'] {
|
|
26
|
-
--xh-_breadcrumb-font-size: var(--xh-font-
|
|
34
|
+
--xh-_breadcrumb-font-size: var(--xh-control-font-lg);
|
|
27
35
|
--xh-_breadcrumb-gap: var(--xh-space-3);
|
|
28
36
|
}
|
|
29
37
|
|
|
@@ -61,7 +69,7 @@
|
|
|
61
69
|
align-items: center;
|
|
62
70
|
gap: var(--xh-breadcrumb-link-gap, var(--xh-space-1));
|
|
63
71
|
/* 一层的名字可能很长(文档标题、订单号),压不住会把整条路径撑开 */
|
|
64
|
-
max-inline-size: var(--xh-breadcrumb-link-max-w,
|
|
72
|
+
max-inline-size: var(--xh-breadcrumb-link-max-w, var(--xh-nav-link-max-w));
|
|
65
73
|
padding-inline: var(--xh-breadcrumb-link-px, var(--xh-space-1));
|
|
66
74
|
border-radius: var(--xh-breadcrumb-link-radius, var(--xh-shape-control));
|
|
67
75
|
color: inherit;
|
|
@@ -117,11 +125,28 @@
|
|
|
117
125
|
|
|
118
126
|
/* 分隔符常常是个图标:给一个跟着字号走的方框,斜杠与图标混用时基线才不跳 */
|
|
119
127
|
[data-scope='breadcrumb'][data-part='separator'] {
|
|
120
|
-
inline-size: var(--xh-breadcrumb-separator-size,
|
|
128
|
+
inline-size: var(--xh-breadcrumb-separator-size, var(--xh-glyph-size-text));
|
|
121
129
|
}
|
|
122
130
|
|
|
123
131
|
[data-scope='breadcrumb'][data-part='ellipsis'] {
|
|
124
132
|
inline-size: var(--xh-breadcrumb-ellipsis-size, var(--xh-space-5));
|
|
125
133
|
cursor: default;
|
|
126
134
|
}
|
|
135
|
+
|
|
136
|
+
/* 没写内容就由皮肤画兜底字形(向前的尖角);作者写了斜杠或自己的图形,这条即不命中 */
|
|
137
|
+
[data-scope='breadcrumb'][data-part='separator']:empty::before {
|
|
138
|
+
content: '';
|
|
139
|
+
display: inline-block;
|
|
140
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
141
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
142
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
143
|
+
background-color: currentColor;
|
|
144
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
145
|
+
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* 从右往左排版时「向前」在左边 */
|
|
149
|
+
[dir='rtl'] [data-scope='breadcrumb'][data-part='separator']:empty::before {
|
|
150
|
+
rotate: 180deg;
|
|
151
|
+
}
|
|
127
152
|
}
|
package/css/button-group.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='button-group'] {
|
|
4
|
+
--xh-button-group-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 一组按钮连成一条:段与段之间不留缝,靠共边接上,所以不设 gap。
|
|
3
8
|
排布只能读 data-orientation——role=group 不收 aria-orientation,连接层根本不输出它。
|
|
4
9
|
圆角槽位在容器上先收成 0,组内每段都取得到,两端的圆角再逐段补回来 */
|
|
@@ -25,26 +30,27 @@
|
|
|
25
30
|
|
|
26
31
|
/* —— 尺寸 —— */
|
|
27
32
|
/* 高度、内边距、间距、字号在容器上写一次,沿继承流给组内每一段。
|
|
28
|
-
|
|
33
|
+
三档都写出来:自定义属性会一路继承,组里再套一组时内层不写就会沿用外层的档。
|
|
34
|
+
写私有槽而非 --xh-button-*:后者是使用者的入口,组内某一枚自己写了档位时要压得住容器 */
|
|
29
35
|
[data-scope='button-group'][data-part='root'][data-size='sm'] {
|
|
30
|
-
--xh-
|
|
31
|
-
--xh-
|
|
32
|
-
--xh-
|
|
33
|
-
--xh-
|
|
36
|
+
--xh-_button-group-h: var(--xh-control-h-sm);
|
|
37
|
+
--xh-_button-group-px: var(--xh-control-px-sm);
|
|
38
|
+
--xh-_button-group-gap: var(--xh-control-gap-sm);
|
|
39
|
+
--xh-_button-group-font-size: var(--xh-control-font-sm);
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
[data-scope='button-group'][data-part='root'][data-size='md'] {
|
|
37
|
-
--xh-
|
|
38
|
-
--xh-
|
|
39
|
-
--xh-
|
|
40
|
-
--xh-
|
|
43
|
+
--xh-_button-group-h: var(--xh-control-h-md);
|
|
44
|
+
--xh-_button-group-px: var(--xh-control-px-md);
|
|
45
|
+
--xh-_button-group-gap: var(--xh-control-gap-md);
|
|
46
|
+
--xh-_button-group-font-size: var(--xh-control-font-md);
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
[data-scope='button-group'][data-part='root'][data-size='lg'] {
|
|
44
|
-
--xh-
|
|
45
|
-
--xh-
|
|
46
|
-
--xh-
|
|
47
|
-
--xh-
|
|
50
|
+
--xh-_button-group-h: var(--xh-control-h-lg);
|
|
51
|
+
--xh-_button-group-px: var(--xh-control-px-lg);
|
|
52
|
+
--xh-_button-group-gap: var(--xh-control-gap-lg);
|
|
53
|
+
--xh-_button-group-font-size: var(--xh-control-font-lg);
|
|
48
54
|
}
|
|
49
55
|
|
|
50
56
|
/* —— 形态 —— */
|
package/css/button.css
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
|
+
@layer xihan.motion {
|
|
2
|
+
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
|
+
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
+
@keyframes xh-spin {
|
|
5
|
+
to {
|
|
6
|
+
transform: rotate(360deg);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
1
11
|
@layer xihan.components {
|
|
12
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
13
|
+
[data-scope='button'] {
|
|
14
|
+
--xh-button-skin: 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
2
17
|
[data-scope='button'][data-part='root'] {
|
|
3
18
|
/* 私有槽位:组件令牌 → 语义令牌两级回退,变体只改这几个槽位 */
|
|
4
19
|
--xh-_bg: var(--xh-button-bg, var(--xh-bg-subtle));
|
|
@@ -6,17 +21,21 @@
|
|
|
6
21
|
--xh-_bg-active: var(--xh-button-bg-active, var(--xh-bg-subtle-active));
|
|
7
22
|
--xh-_fg: var(--xh-button-fg, var(--xh-fg-default));
|
|
8
23
|
|
|
24
|
+
/* 作者塞进来的图标跟着按钮的尺寸档走:xh-icon 的直径读的就是这个继承槽,
|
|
25
|
+
它自己显式写了 size 时特异性更高,仍以作者写的为准 */
|
|
26
|
+
--xh-icon-size: var(--xh-button-icon-size, var(--xh-glyph-size-md));
|
|
27
|
+
|
|
9
28
|
display: inline-flex;
|
|
10
29
|
align-items: center;
|
|
11
30
|
justify-content: center;
|
|
12
|
-
gap: var(--xh-button-gap, var(--xh-control-gap-md));
|
|
13
|
-
block-size: var(--xh-button-h, var(--xh-control-h-md));
|
|
14
|
-
padding-inline: var(--xh-button-px, var(--xh-control-px-md));
|
|
31
|
+
gap: var(--xh-button-gap, var(--xh-_button-group-gap, var(--xh-control-gap-md)));
|
|
32
|
+
block-size: var(--xh-button-h, var(--xh-_button-group-h, var(--xh-control-h-md)));
|
|
33
|
+
padding-inline: var(--xh-button-px, var(--xh-_button-group-px, var(--xh-control-px-md)));
|
|
15
34
|
border: var(--xh-stroke-thin) solid transparent;
|
|
16
35
|
border-radius: var(--xh-button-radius, var(--xh-shape-control));
|
|
17
36
|
background: var(--xh-_bg);
|
|
18
37
|
color: var(--xh-_fg);
|
|
19
|
-
font-size: var(--xh-button-font-size, var(--xh-text-label-size));
|
|
38
|
+
font-size: var(--xh-button-font-size, var(--xh-_button-group-font-size, var(--xh-text-label-size)));
|
|
20
39
|
font-weight: var(--xh-button-font-weight, var(--xh-text-label-weight));
|
|
21
40
|
line-height: var(--xh-leading-none);
|
|
22
41
|
white-space: nowrap;
|
|
@@ -80,19 +99,46 @@
|
|
|
80
99
|
|
|
81
100
|
/* —— 尺寸 —— */
|
|
82
101
|
[data-scope='button'][data-part='root'][data-size='sm'] {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
102
|
+
--xh-icon-size: var(--xh-button-icon-size, var(--xh-glyph-size-sm));
|
|
103
|
+
|
|
104
|
+
block-size: var(--xh-button-h, var(--xh-control-h-sm));
|
|
105
|
+
padding-inline: var(--xh-button-px, var(--xh-control-px-sm));
|
|
106
|
+
font-size: var(--xh-button-font-size, var(--xh-control-font-sm));
|
|
86
107
|
}
|
|
87
108
|
|
|
88
109
|
[data-scope='button'][data-part='root'][data-size='lg'] {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
110
|
+
--xh-icon-size: var(--xh-button-icon-size, var(--xh-glyph-size-lg));
|
|
111
|
+
|
|
112
|
+
block-size: var(--xh-button-h, var(--xh-control-h-lg));
|
|
113
|
+
padding-inline: var(--xh-button-px, var(--xh-control-px-lg));
|
|
114
|
+
font-size: var(--xh-button-font-size, var(--xh-control-font-lg));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* 只有图标:左右内距清零,宽度靠比例跟住当前档的高度——换尺寸档时仍是正方形,
|
|
118
|
+
不必把档位抄进行内样式。写在尺寸档之后,压得住三档各自的 padding-inline */
|
|
119
|
+
[data-scope='button'][data-part='root'][data-icon-only] {
|
|
120
|
+
padding-inline: 0;
|
|
121
|
+
aspect-ratio: 1;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
[data-scope='button'][data-part='root'][data-full-width] {
|
|
125
|
+
inline-size: 100%;
|
|
92
126
|
}
|
|
93
127
|
|
|
94
128
|
[data-scope='button'][data-part='indicator'] {
|
|
95
129
|
display: inline-flex;
|
|
96
|
-
animation: xh-spin
|
|
130
|
+
animation: xh-spin var(--xh-button-spin-duration, var(--xh-spin-duration)) linear infinite;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* 减少动效:指示器停转,"还在忙"由按钮自身的挂起样式与指示器图标继续表达。
|
|
134
|
+
两条规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
|
|
135
|
+
@media (prefers-reduced-motion: reduce) {
|
|
136
|
+
[data-scope='button'][data-part='indicator'] {
|
|
137
|
+
animation: none;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
:where([data-motion='reduce']) [data-scope='button'][data-part='indicator'] {
|
|
142
|
+
animation: none;
|
|
97
143
|
}
|
|
98
144
|
}
|