@xihan-ui/styles 1.0.0-alpha.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2177 -0
- package/README.md +1 -1
- package/css/accordion.css +80 -6
- package/css/alert.css +43 -14
- package/css/anchor.css +8 -8
- package/css/avatar-group.css +7 -3
- package/css/avatar.css +9 -3
- package/css/back-top.css +22 -1
- package/css/badge.css +104 -32
- package/css/breadcrumb.css +25 -5
- package/css/button-group.css +18 -13
- package/css/button.css +48 -11
- package/css/calendar.css +150 -7
- package/css/card.css +20 -11
- package/css/carousel.css +36 -5
- package/css/cascader.css +211 -124
- package/css/checkbox-group.css +72 -22
- package/css/checkbox.css +70 -13
- package/css/clipboard.css +2 -1
- package/css/code-block.css +12 -7
- package/css/collapsible.css +49 -3
- package/css/color-picker.css +132 -46
- package/css/combobox.css +132 -60
- package/css/composer.css +5 -3
- package/css/context-menu.css +113 -74
- package/css/date-field.css +93 -16
- package/css/date-picker.css +293 -72
- package/css/descriptions.css +11 -5
- package/css/dialog.css +47 -14
- package/css/download-trigger.css +76 -0
- package/css/drawer.css +57 -16
- package/css/dynamic-input.css +75 -17
- package/css/editable.css +12 -10
- package/css/ellipsis.css +7 -1
- package/css/empty-state.css +22 -12
- package/css/field.css +16 -6
- package/css/fieldset.css +69 -0
- package/css/file-upload.css +46 -8
- package/css/flex.css +13 -7
- package/css/float-button.css +23 -1
- package/css/floating-panel.css +316 -0
- package/css/form.css +4 -4
- package/css/grid.css +11 -5
- package/css/heatmap.css +411 -0
- package/css/highlight.css +2 -2
- package/css/hotkeys.css +90 -0
- package/css/hover-card.css +43 -45
- package/css/image-cropper.css +233 -0
- package/css/image-viewer.css +155 -17
- package/css/image.css +2 -2
- package/css/infinite-scroll.css +1 -1
- package/css/json-viewer.css +274 -0
- package/css/layout.css +19 -15
- package/css/list.css +22 -13
- package/css/listbox.css +24 -6
- package/css/loading-bar.css +12 -5
- package/css/log.css +7 -3
- package/css/marquee.css +9 -0
- package/css/masonry.css +63 -0
- package/css/mention.css +100 -36
- package/css/menu.css +127 -50
- package/css/menubar.css +155 -61
- package/css/navigation-menu.css +56 -31
- package/css/notification.css +377 -0
- package/css/number-animation.css +3 -3
- package/css/number-field.css +182 -19
- package/css/overlay-arrow.css +51 -0
- package/css/page-header.css +12 -5
- package/css/pagination.css +171 -14
- package/css/password-input.css +356 -0
- package/css/pin-input.css +15 -12
- package/css/popconfirm.css +55 -12
- package/css/popover.css +73 -45
- package/css/popselect.css +207 -57
- package/css/progress.css +54 -8
- package/css/qr-code.css +1 -1
- package/css/radio-group.css +27 -10
- package/css/rating.css +4 -4
- package/css/reset.css +17 -0
- package/css/result.css +21 -11
- package/css/scroll-area.css +61 -89
- package/css/scrollbar.css +170 -0
- package/css/segmented.css +215 -0
- package/css/select.css +298 -131
- package/css/separator.css +2 -2
- package/css/side-nav.css +127 -24
- package/css/signature-pad.css +144 -0
- package/css/skeleton.css +7 -1
- package/css/slider.css +14 -12
- package/css/space.css +117 -0
- package/css/spinner.css +22 -10
- package/css/statistic.css +9 -9
- package/css/steps.css +29 -12
- package/css/switch.css +57 -8
- package/css/table.css +146 -44
- package/css/tabs.css +13 -5
- package/css/tag.css +179 -0
- package/css/tags-input.css +80 -42
- package/css/text-field.css +151 -38
- package/css/thread.css +11 -3
- package/css/time-field.css +99 -18
- package/css/time-picker.css +261 -71
- package/css/timeline.css +15 -15
- package/css/timer.css +119 -0
- package/css/toast.css +129 -55
- package/css/toggle-group.css +30 -4
- package/css/toggle.css +12 -6
- package/css/tone.css +57 -22
- package/css/toolbar.css +1 -1
- package/css/tooltip.css +40 -31
- package/css/tour.css +112 -61
- package/css/transfer.css +98 -21
- package/css/tree-select.css +215 -89
- package/css/tree.css +131 -5
- package/css/typography.css +5 -5
- package/css/undefined.css +12 -1
- package/css/virtualizer.css +3 -1
- package/css/watermark.css +1 -2
- package/index.css +18 -1
- package/index.unlayered.css +10356 -3255
- package/package.json +20 -4
- package/css/toaster.css +0 -74
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @xihan-ui/styles
|
|
2
2
|
|
|
3
|
-
默认皮肤:
|
|
3
|
+
默认皮肤:125 份纯 CSS,零 JS。只按 `[data-scope][data-part]` 与 `data-*` 选中,不匹配标签名也不匹配 class——所以整套换掉它不影响任何行为。
|
|
4
4
|
|
|
5
5
|
**谁会装它**:不想自己写样式的人装它。要做自己的设计语言,就不装,照解剖文档写一套自己的。
|
|
6
6
|
|
package/css/accordion.css
CHANGED
|
@@ -5,11 +5,14 @@
|
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
[data-scope='accordion'][data-part='root'] {
|
|
8
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
9
|
+
--xh-icon-size: var(--xh-accordion-icon-size, var(--xh-glyph-size-text));
|
|
10
|
+
|
|
8
11
|
/* 尺寸档只换这四个私有槽,标题栏从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
9
12
|
--xh-_accordion-trigger-h: var(--xh-control-h-md);
|
|
10
13
|
--xh-_accordion-trigger-px: var(--xh-control-px-md);
|
|
11
14
|
--xh-_accordion-trigger-gap: var(--xh-control-gap-md);
|
|
12
|
-
--xh-_accordion-trigger-font-size: var(--xh-
|
|
15
|
+
--xh-_accordion-trigger-font-size: var(--xh-control-font-md);
|
|
13
16
|
|
|
14
17
|
/* 语气落在展开着的标题上,指示器写在标题里、跟着继承这个色,不另立规则。
|
|
15
18
|
没写 data-tone 时 --xh-_tone-fg 没被声明,退回原来的前景色。
|
|
@@ -31,21 +34,36 @@
|
|
|
31
34
|
--xh-_accordion-trigger-h: var(--xh-control-h-sm);
|
|
32
35
|
--xh-_accordion-trigger-px: var(--xh-control-px-sm);
|
|
33
36
|
--xh-_accordion-trigger-gap: var(--xh-control-gap-sm);
|
|
34
|
-
--xh-_accordion-trigger-font-size: var(--xh-font-
|
|
37
|
+
--xh-_accordion-trigger-font-size: var(--xh-control-font-sm);
|
|
35
38
|
}
|
|
36
39
|
|
|
37
40
|
[data-scope='accordion'][data-part='root'][data-size='lg'] {
|
|
38
41
|
--xh-_accordion-trigger-h: var(--xh-control-h-lg);
|
|
39
42
|
--xh-_accordion-trigger-px: var(--xh-control-px-lg);
|
|
40
43
|
--xh-_accordion-trigger-gap: var(--xh-control-gap-lg);
|
|
41
|
-
--xh-_accordion-trigger-font-size: var(--xh-font-
|
|
44
|
+
--xh-_accordion-trigger-font-size: var(--xh-control-font-lg);
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
[data-scope='accordion'][data-part='item'] {
|
|
45
|
-
border-block-end: 1px solid var(--xh-accordion-item-border, var(--xh-border-default));
|
|
46
48
|
min-inline-size: 0;
|
|
47
49
|
}
|
|
48
50
|
|
|
51
|
+
/* 分隔线画在后一条的起始边,条与条之间才只有一条,末条也不会留一条悬空线
|
|
52
|
+
(根没有外框接住它)。只认自己的直接子条目:套在条目里的另一份手风琴由它自己的根管。
|
|
53
|
+
横排时换成行内轴那一侧 */
|
|
54
|
+
[data-scope='accordion'][data-part='root']
|
|
55
|
+
> [data-scope='accordion'][data-part='item']
|
|
56
|
+
+ [data-scope='accordion'][data-part='item'] {
|
|
57
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-accordion-item-border, var(--xh-border-subtle));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[data-scope='accordion'][data-part='root'][data-orientation='horizontal']
|
|
61
|
+
> [data-scope='accordion'][data-part='item']
|
|
62
|
+
+ [data-scope='accordion'][data-part='item'] {
|
|
63
|
+
border-block-start: 0;
|
|
64
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-accordion-item-border, var(--xh-border-subtle));
|
|
65
|
+
}
|
|
66
|
+
|
|
49
67
|
[data-scope='accordion'][data-part='header'] {
|
|
50
68
|
margin: 0;
|
|
51
69
|
font: inherit;
|
|
@@ -97,17 +115,73 @@
|
|
|
97
115
|
transition: rotate var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
98
116
|
}
|
|
99
117
|
|
|
100
|
-
|
|
101
|
-
|
|
118
|
+
/* 没写内容就由皮肤画;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
119
|
+
[data-scope='accordion'][data-part='indicator']:empty::before {
|
|
120
|
+
content: '';
|
|
121
|
+
display: inline-block;
|
|
122
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
123
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
124
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
125
|
+
background-color: currentColor;
|
|
126
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
127
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
102
128
|
}
|
|
103
129
|
|
|
104
130
|
[data-scope='accordion'][data-part='indicator'][data-state='open'] {
|
|
105
131
|
rotate: 180deg;
|
|
106
132
|
}
|
|
107
133
|
|
|
134
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none }:补了动画一帧都播不出来。
|
|
135
|
+
收起由适配器在退场结束后写内联 display 落成,退场窗口内靠 connect 发的 inert 挡住焦点 */
|
|
108
136
|
[data-scope='accordion'][data-part='content'] {
|
|
137
|
+
display: grid;
|
|
138
|
+
grid-template-rows: 1fr;
|
|
139
|
+
overflow: clip;
|
|
109
140
|
padding-block: var(--xh-accordion-content-py, var(--xh-stack-gap-md));
|
|
110
141
|
padding-inline: var(--xh-accordion-content-px, var(--xh-control-px-md));
|
|
111
142
|
color: var(--xh-accordion-content-fg, var(--xh-fg-default));
|
|
112
143
|
}
|
|
144
|
+
|
|
145
|
+
[data-scope='accordion'][data-part='content'][data-state='open'] {
|
|
146
|
+
animation: xh-accordion-expand var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
[data-scope='accordion'][data-part='content'][data-state='closed'] {
|
|
150
|
+
animation: xh-accordion-collapse var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@layer xihan.motion {
|
|
155
|
+
/* 行高与内缩同帧动:内缩不归零的话,border-box 会把盒子钳在上下内缩之和上,收不干净 */
|
|
156
|
+
@keyframes xh-accordion-expand {
|
|
157
|
+
from {
|
|
158
|
+
grid-template-rows: 0fr;
|
|
159
|
+
padding-block: 0;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
to {
|
|
163
|
+
grid-template-rows: 1fr;
|
|
164
|
+
padding-block: var(--xh-accordion-content-py, var(--xh-stack-gap-md));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@keyframes xh-accordion-collapse {
|
|
169
|
+
from {
|
|
170
|
+
grid-template-rows: 1fr;
|
|
171
|
+
padding-block: var(--xh-accordion-content-py, var(--xh-stack-gap-md));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
to {
|
|
175
|
+
grid-template-rows: 0fr;
|
|
176
|
+
padding-block: 0;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
181
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
182
|
+
[data-scope='accordion'][data-part='root'][hidden],
|
|
183
|
+
[data-scope='accordion'][data-part='trigger'][hidden],
|
|
184
|
+
[data-scope='accordion'][data-part='indicator'][hidden] {
|
|
185
|
+
display: none;
|
|
186
|
+
}
|
|
113
187
|
}
|
package/css/alert.css
CHANGED
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
[data-scope='alert'][data-part='root'] {
|
|
8
|
-
/*
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
/*
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
--xh-_alert-
|
|
8
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
9
|
+
--xh-icon-size: var(--xh-alert-icon-size, var(--xh-glyph-size-text));
|
|
10
|
+
|
|
11
|
+
/* 底色、描边、图标色一律取语气层派生好的槽:连接层给 alert 兜了 tone=info 的缺省,
|
|
12
|
+
data-tone 恒在,语气层的槽也就恒被声明。此前这里自己又兑了一遍(12% / 32%),
|
|
13
|
+
与语气层的公式差一档,图标压上去只有 1.79–2.47 */
|
|
14
|
+
--xh-_alert-tint: var(--xh-_tone-subtle);
|
|
15
|
+
--xh-_alert-edge: var(--xh-_tone-border);
|
|
15
16
|
|
|
16
17
|
display: flex;
|
|
17
18
|
/* 说明用 flex: 1 1 100% 独占一行,容器不换行的话它只会挤在标题旁边 */
|
|
@@ -24,7 +25,7 @@
|
|
|
24
25
|
border-radius: var(--xh-alert-radius, var(--xh-shape-surface));
|
|
25
26
|
background: var(--xh-alert-bg, var(--xh-_alert-tint));
|
|
26
27
|
color: var(--xh-alert-fg, var(--xh-fg-default));
|
|
27
|
-
font-size: var(--xh-alert-font-size, var(--xh-
|
|
28
|
+
font-size: var(--xh-alert-font-size, var(--xh-text-body-size));
|
|
28
29
|
line-height: var(--xh-alert-leading, var(--xh-leading-normal));
|
|
29
30
|
}
|
|
30
31
|
|
|
@@ -40,9 +41,9 @@
|
|
|
40
41
|
justify-content: center;
|
|
41
42
|
flex: none;
|
|
42
43
|
/* 与首行文字对齐:图标框高取一行正文的行高 */
|
|
43
|
-
block-size: calc(var(--xh-
|
|
44
|
-
inline-size: var(--xh-alert-icon-
|
|
45
|
-
color: var(--xh-alert-icon-fg, var(--xh-
|
|
44
|
+
block-size: calc(var(--xh-text-body-size) * var(--xh-leading-normal));
|
|
45
|
+
inline-size: var(--xh-alert-icon-box, var(--xh-control-indicator-size));
|
|
46
|
+
color: var(--xh-alert-icon-fg, var(--xh-_tone-fg));
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
/* 标题与说明摞成一列,占满 root 剩下的横向空间,
|
|
@@ -56,7 +57,7 @@
|
|
|
56
57
|
[data-scope='alert'][data-part='title'] {
|
|
57
58
|
flex: 1 1 auto;
|
|
58
59
|
color: var(--xh-alert-title-fg, var(--xh-fg-default));
|
|
59
|
-
font-size: var(--xh-alert-title-font-size, var(--xh-
|
|
60
|
+
font-size: var(--xh-alert-title-font-size, var(--xh-text-label-size));
|
|
60
61
|
font-weight: var(--xh-alert-title-font-weight, var(--xh-font-weight-semibold));
|
|
61
62
|
line-height: var(--xh-alert-title-leading, var(--xh-leading-tight));
|
|
62
63
|
}
|
|
@@ -64,7 +65,7 @@
|
|
|
64
65
|
[data-scope='alert'][data-part='description'] {
|
|
65
66
|
flex: 1 1 100%;
|
|
66
67
|
color: var(--xh-alert-description-fg, var(--xh-fg-muted));
|
|
67
|
-
font-size: var(--xh-alert-description-font-size, var(--xh-
|
|
68
|
+
font-size: var(--xh-alert-description-font-size, var(--xh-text-secondary-size));
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
/* 没写标题时说明自己占满这一行,否则它会挤在标题旁边 */
|
|
@@ -89,6 +90,10 @@
|
|
|
89
90
|
font: inherit;
|
|
90
91
|
line-height: var(--xh-leading-none);
|
|
91
92
|
cursor: pointer;
|
|
93
|
+
transition:
|
|
94
|
+
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
95
|
+
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
96
|
+
scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
92
97
|
}
|
|
93
98
|
|
|
94
99
|
/* closable=false 时连接层同时给了 hidden 与 disabled,这条是它真正收起的那一半 */
|
|
@@ -96,11 +101,17 @@
|
|
|
96
101
|
display: none;
|
|
97
102
|
}
|
|
98
103
|
|
|
104
|
+
/* 悬停与按下的底色跟着语气走:提示本体已是该语气的淡底,叉的底色在同一色系里再深两档 */
|
|
99
105
|
[data-scope='alert'][data-part='close-trigger']:hover:not(:disabled) {
|
|
100
|
-
background:
|
|
106
|
+
background: var(--xh-alert-close-bg-hover, var(--xh-_tone-subtle-hover, var(--xh-bg-subtle-hover)));
|
|
101
107
|
color: var(--xh-alert-close-fg-hover, var(--xh-fg-default));
|
|
102
108
|
}
|
|
103
109
|
|
|
110
|
+
[data-scope='alert'][data-part='close-trigger']:active {
|
|
111
|
+
background: var(--xh-alert-close-bg-active, var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active)));
|
|
112
|
+
scale: var(--xh-motion-scale-press);
|
|
113
|
+
}
|
|
114
|
+
|
|
104
115
|
[data-scope='alert'][data-part='close-trigger']:disabled {
|
|
105
116
|
color: var(--xh-fg-disabled);
|
|
106
117
|
cursor: not-allowed;
|
|
@@ -110,4 +121,22 @@
|
|
|
110
121
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
111
122
|
outline-offset: var(--xh-ring-offset);
|
|
112
123
|
}
|
|
124
|
+
|
|
125
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
126
|
+
[data-scope='alert'][data-part='close-trigger']:empty::before {
|
|
127
|
+
content: '';
|
|
128
|
+
display: inline-block;
|
|
129
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
130
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
131
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
132
|
+
background-color: currentColor;
|
|
133
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
134
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
138
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
139
|
+
[data-scope='alert'][data-part='icon'][hidden] {
|
|
140
|
+
display: none;
|
|
141
|
+
}
|
|
113
142
|
}
|
package/css/anchor.css
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
|
|
9
9
|
[data-scope='anchor'][data-part='root'] {
|
|
10
10
|
/* 尺寸档只换这两个私有槽,链接从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
11
|
-
--xh-_anchor-font-size: var(--xh-
|
|
12
|
-
--xh-_anchor-link-px: var(--xh-
|
|
11
|
+
--xh-_anchor-font-size: var(--xh-control-font-md);
|
|
12
|
+
--xh-_anchor-link-px: var(--xh-control-px-md);
|
|
13
13
|
/* 当前那一节的指示条与文字随语气走。没写 data-tone 时这两个槽都没被声明,退回原来的品牌色。
|
|
14
14
|
指示条是装饰性的色条,取柔和档;文字要压在普通背景上读,取语气的文字档。
|
|
15
15
|
聚焦环不在其列,它恒是 --xh-ring-focus */
|
|
@@ -22,14 +22,14 @@
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/* —— 尺寸 —— */
|
|
25
|
-
/*
|
|
25
|
+
/* 缺省档写在上面的基础规则里;链接的内边距三档都走控件内边距那把尺 */
|
|
26
26
|
[data-scope='anchor'][data-part='root'][data-size='sm'] {
|
|
27
|
-
--xh-_anchor-font-size: var(--xh-font-
|
|
27
|
+
--xh-_anchor-font-size: var(--xh-control-font-sm);
|
|
28
28
|
--xh-_anchor-link-px: var(--xh-control-px-sm);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
[data-scope='anchor'][data-part='root'][data-size='lg'] {
|
|
32
|
-
--xh-_anchor-font-size: var(--xh-font-
|
|
32
|
+
--xh-_anchor-font-size: var(--xh-control-font-lg);
|
|
33
33
|
--xh-_anchor-link-px: var(--xh-control-px-lg);
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
display: inline-flex;
|
|
77
77
|
align-items: center;
|
|
78
78
|
/* 一节的标题可能很长,压不住会把整列撑开 */
|
|
79
|
-
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));
|
|
80
80
|
padding-block: var(--xh-anchor-link-py, var(--xh-space-1));
|
|
81
81
|
padding-inline: var(--xh-anchor-link-px, var(--xh-_anchor-link-px));
|
|
82
82
|
border-radius: var(--xh-anchor-link-radius, var(--xh-shape-control));
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
|
|
104
104
|
/* 当前那一节:颜色与字重都跟着变,不只靠指示条——
|
|
105
105
|
指示条是可选部件,作者不渲染它时"当前在哪"仍然要看得出来 */
|
|
106
|
-
[data-scope='anchor'][data-part='link'][data-
|
|
106
|
+
[data-scope='anchor'][data-part='link'][data-current] {
|
|
107
107
|
color: var(--xh-anchor-link-fg-active, var(--xh-_anchor-accent-text));
|
|
108
108
|
font-weight: var(--xh-anchor-link-font-weight-active, var(--xh-font-weight-medium));
|
|
109
109
|
}
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
margin: 0;
|
|
118
118
|
inset-inline-start: calc(var(--xh-anchor-indicator-thickness, var(--xh-stroke-thick)) * -1);
|
|
119
119
|
inline-size: var(--xh-anchor-indicator-thickness, var(--xh-stroke-thick));
|
|
120
|
-
border-radius: var(--xh-anchor-indicator-radius, var(--xh-
|
|
120
|
+
border-radius: var(--xh-anchor-indicator-radius, var(--xh-shape-pill));
|
|
121
121
|
background: var(--xh-anchor-indicator-color, var(--xh-_anchor-accent));
|
|
122
122
|
transition:
|
|
123
123
|
inset-block-start var(--xh-motion-duration-enter) var(--xh-motion-ease-enter),
|
package/css/avatar-group.css
CHANGED
|
@@ -7,9 +7,13 @@
|
|
|
7
7
|
/* 一排叠放的头像:后一枚压在前一枚上。
|
|
8
8
|
组内共用的直径与字号在容器上写一次,沿继承流给每一枚;自己写了档位的那一枚仍按自己的档走 */
|
|
9
9
|
[data-scope='avatar-group'][data-part='root'] {
|
|
10
|
+
/* 组件内那几档层号只在自己人之间排序:建一个层叠上下文把它们关起来,
|
|
11
|
+
既不让页面上的层号插进来,也不让它们漏出去压住别人 */
|
|
12
|
+
isolation: isolate;
|
|
13
|
+
|
|
10
14
|
/* 私有槽位:整组共用的直径、字号与叠放量,换档只改这三个 */
|
|
11
15
|
--xh-_avatar-group-size: var(--xh-avatar-group-size, var(--xh-control-h-md));
|
|
12
|
-
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-
|
|
16
|
+
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-control-caption-md));
|
|
13
17
|
--xh-_avatar-group-overlap: var(--xh-avatar-group-overlap, var(--xh-space-2_5));
|
|
14
18
|
|
|
15
19
|
/* 流给组内每一枚 */
|
|
@@ -31,13 +35,13 @@
|
|
|
31
35
|
字号与叠放量跟着直径一起缩放,小头像里回退字放得下、大头像里压住的那段也按比例长 */
|
|
32
36
|
[data-scope='avatar-group'][data-part='root'][data-size='sm'] {
|
|
33
37
|
--xh-_avatar-group-size: var(--xh-avatar-group-size, var(--xh-control-h-sm));
|
|
34
|
-
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-
|
|
38
|
+
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-control-caption-sm));
|
|
35
39
|
--xh-_avatar-group-overlap: var(--xh-avatar-group-overlap, var(--xh-space-2));
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
[data-scope='avatar-group'][data-part='root'][data-size='lg'] {
|
|
39
43
|
--xh-_avatar-group-size: var(--xh-avatar-group-size, var(--xh-control-h-lg));
|
|
40
|
-
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-
|
|
44
|
+
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-control-caption-lg));
|
|
41
45
|
--xh-_avatar-group-overlap: var(--xh-avatar-group-overlap, var(--xh-space-3));
|
|
42
46
|
}
|
|
43
47
|
|
package/css/avatar.css
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
border-radius: var(--xh-avatar-radius, var(--xh-shape-pill));
|
|
17
17
|
background: var(--xh-avatar-bg, var(--xh-bg-subtle));
|
|
18
18
|
color: var(--xh-avatar-fg, var(--xh-fg-muted));
|
|
19
|
-
font-size: var(--xh-avatar-font-size, var(--xh-
|
|
19
|
+
font-size: var(--xh-avatar-font-size, var(--xh-text-secondary-size));
|
|
20
20
|
font-weight: var(--xh-avatar-font-weight, var(--xh-font-weight-medium));
|
|
21
21
|
line-height: var(--xh-leading-none);
|
|
22
22
|
user-select: none;
|
|
@@ -27,13 +27,13 @@
|
|
|
27
27
|
[data-scope='avatar'][data-part='root'][data-size='sm'] {
|
|
28
28
|
inline-size: var(--xh-control-h-sm);
|
|
29
29
|
block-size: var(--xh-control-h-sm);
|
|
30
|
-
font-size: var(--xh-
|
|
30
|
+
font-size: var(--xh-control-caption-sm);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
[data-scope='avatar'][data-part='root'][data-size='lg'] {
|
|
34
34
|
inline-size: var(--xh-control-h-lg);
|
|
35
35
|
block-size: var(--xh-control-h-lg);
|
|
36
|
-
font-size: var(--xh-
|
|
36
|
+
font-size: var(--xh-control-caption-lg);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/* 不声明 display,加载完成前的 hidden 直接交给浏览器的 [hidden] 规则收起 */
|
|
@@ -57,4 +57,10 @@
|
|
|
57
57
|
[data-scope='avatar'][data-part='fallback'][hidden] {
|
|
58
58
|
display: none;
|
|
59
59
|
}
|
|
60
|
+
|
|
61
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
62
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
63
|
+
[data-scope='avatar'][data-part='root'][hidden] {
|
|
64
|
+
display: none;
|
|
65
|
+
}
|
|
60
66
|
}
|
package/css/back-top.css
CHANGED
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
/* 定位壳:钉在视口的尾下角,用逻辑属性,RTL 下自动换到另一侧。
|
|
8
8
|
不声明 display —— 收起态由连接层写 hidden,UA 的 [hidden]{display:none} 得压得住 */
|
|
9
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
|
+
|
|
10
13
|
/* 尺寸档只换这一个私有槽,按钮从壳继承,换档不必给每个部件各写一条选择器 */
|
|
11
14
|
--xh-_back-top-size: var(--xh-control-h-md);
|
|
12
15
|
|
|
@@ -39,7 +42,7 @@
|
|
|
39
42
|
background: var(--xh-back-top-bg, var(--xh-bg-surface-raised));
|
|
40
43
|
color: var(--xh-back-top-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
|
|
41
44
|
/* 浮在内容之上,靠投影与页面拉开层次 */
|
|
42
|
-
box-shadow: var(--xh-elevation-
|
|
45
|
+
box-shadow: var(--xh-back-top-shadow, var(--xh-elevation-sheet));
|
|
43
46
|
cursor: pointer;
|
|
44
47
|
transition:
|
|
45
48
|
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
@@ -63,4 +66,22 @@
|
|
|
63
66
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
64
67
|
outline-offset: var(--xh-ring-offset);
|
|
65
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
|
+
}
|
|
81
|
+
|
|
82
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
83
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
84
|
+
[data-scope='back-top'][data-part='trigger'][hidden] {
|
|
85
|
+
display: none;
|
|
86
|
+
}
|
|
66
87
|
}
|
package/css/badge.css
CHANGED
|
@@ -4,52 +4,124 @@
|
|
|
4
4
|
--xh-badge-skin: 1;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
+
/* 锚点:被标记的那个东西(按钮、头像、标签页)放进它里面。
|
|
8
|
+
角标绝对定位在它的角上,所以这一层必须建定位上下文,且不能自己撑出尺寸 */
|
|
7
9
|
[data-scope='badge'][data-part='root'] {
|
|
10
|
+
position: relative;
|
|
11
|
+
display: inline-flex;
|
|
12
|
+
/* 角标探出宿主边界是常态,不能被裁掉 */
|
|
13
|
+
overflow: visible;
|
|
14
|
+
vertical-align: middle;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* 锚点也可能被作者整块收起 */
|
|
18
|
+
[data-scope='badge'][data-part='root'][hidden] {
|
|
19
|
+
display: none;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* 角标本身。档位换的是圆点直径、两位数时的最小宽度与字号——
|
|
23
|
+
不是药丸那套内衬与行高:那是 tag 的活 */
|
|
24
|
+
[data-scope='badge'][data-part='indicator'] {
|
|
25
|
+
/* 每一档的盒都要大于字号:两位数在等高的盒里会被撑破。
|
|
26
|
+
字号刻度最小就是 12px,所以往上抬盒子而不是往下压字 */
|
|
27
|
+
--xh-_badge-dot: var(--xh-space-2);
|
|
28
|
+
--xh-_badge-min: var(--xh-space-5);
|
|
29
|
+
--xh-_badge-px: var(--xh-space-1);
|
|
30
|
+
--xh-_badge-font: var(--xh-text-secondary-size);
|
|
31
|
+
|
|
32
|
+
/* 不设 z-index:角标在 DOM 序里排在宿主之后,本来就压在上面 */
|
|
33
|
+
position: absolute;
|
|
8
34
|
display: inline-flex;
|
|
9
35
|
align-items: center;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
36
|
+
justify-content: center;
|
|
37
|
+
box-sizing: border-box;
|
|
38
|
+
min-inline-size: var(--xh-badge-min-size, var(--xh-_badge-min));
|
|
39
|
+
block-size: var(--xh-badge-min-size, var(--xh-_badge-min));
|
|
40
|
+
padding-inline: var(--xh-badge-px, var(--xh-_badge-px));
|
|
41
|
+
border: var(--xh-stroke-thin) solid var(--xh-badge-ring, var(--xh-bg-surface));
|
|
42
|
+
border-radius: var(--xh-badge-radius, var(--xh-shape-pill));
|
|
43
|
+
/* 角标默认就是实心的:贴在别的东西上,淡底与描边都看不清 */
|
|
44
|
+
background: var(--xh-badge-bg, var(--xh-_tone, var(--xh-bg-brand)));
|
|
45
|
+
color: var(--xh-badge-fg, var(--xh-_tone-on, var(--xh-fg-on-brand)));
|
|
46
|
+
font-size: var(--xh-badge-font-size, var(--xh-_badge-font));
|
|
18
47
|
font-weight: var(--xh-badge-font-weight, var(--xh-font-weight-medium));
|
|
19
48
|
line-height: var(--xh-leading-none);
|
|
49
|
+
/* 出的是计数,数字必须等宽:不然 9 跳到 10 时角标的宽度会抖一下 */
|
|
50
|
+
font-variant-numeric: tabular-nums;
|
|
20
51
|
white-space: nowrap;
|
|
52
|
+
pointer-events: none;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
56
|
+
计数为 0 且没开 showZero 时连接层会发 hidden */
|
|
57
|
+
[data-scope='badge'][data-part='indicator'][hidden] {
|
|
58
|
+
display: none;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* 圆点形态:只表示「有」,不表示「有几个」——收掉内边距与文字盒 */
|
|
62
|
+
[data-scope='badge'][data-part='indicator'][data-dot] {
|
|
63
|
+
min-inline-size: var(--xh-badge-dot-size, var(--xh-_badge-dot));
|
|
64
|
+
inline-size: var(--xh-badge-dot-size, var(--xh-_badge-dot));
|
|
65
|
+
block-size: var(--xh-badge-dot-size, var(--xh-_badge-dot));
|
|
66
|
+
padding: 0;
|
|
67
|
+
font-size: 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* —— 落点 —— */
|
|
71
|
+
/* 用 inset 的逻辑属性写,rtl 下 end 自动落到左边;translate 让角标压住宿主的角 */
|
|
72
|
+
[data-scope='badge'][data-part='indicator'][data-placement='top-end'] {
|
|
73
|
+
inset-block-start: 0;
|
|
74
|
+
inset-inline-end: 0;
|
|
75
|
+
translate: 50% -50%;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
[data-scope='badge'][data-part='indicator'][data-placement='top-start'] {
|
|
79
|
+
inset-block-start: 0;
|
|
80
|
+
inset-inline-start: 0;
|
|
81
|
+
translate: -50% -50%;
|
|
21
82
|
}
|
|
22
83
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
color: var(--xh-_tone-on, var(--xh-fg-on-brand));
|
|
84
|
+
[data-scope='badge'][data-part='indicator'][data-placement='bottom-end'] {
|
|
85
|
+
inset-block-end: 0;
|
|
86
|
+
inset-inline-end: 0;
|
|
87
|
+
translate: 50% 50%;
|
|
28
88
|
}
|
|
29
89
|
|
|
30
|
-
[data-scope='badge'][data-part='
|
|
31
|
-
|
|
32
|
-
|
|
90
|
+
[data-scope='badge'][data-part='indicator'][data-placement='bottom-start'] {
|
|
91
|
+
inset-block-end: 0;
|
|
92
|
+
inset-inline-start: 0;
|
|
93
|
+
translate: -50% 50%;
|
|
33
94
|
}
|
|
34
95
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
96
|
+
/* rtl 下 translate 的行内轴要跟着翻,否则角标会往宿主外面跑 */
|
|
97
|
+
[dir='rtl'] [data-scope='badge'][data-part='indicator'][data-placement='top-end'] {
|
|
98
|
+
translate: -50% -50%;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
[dir='rtl'] [data-scope='badge'][data-part='indicator'][data-placement='top-start'] {
|
|
102
|
+
translate: 50% -50%;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
[dir='rtl'] [data-scope='badge'][data-part='indicator'][data-placement='bottom-end'] {
|
|
106
|
+
translate: -50% 50%;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
[dir='rtl'] [data-scope='badge'][data-part='indicator'][data-placement='bottom-start'] {
|
|
110
|
+
translate: 50% 50%;
|
|
39
111
|
}
|
|
40
112
|
|
|
41
113
|
/* —— 尺寸 —— */
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
[data-scope='badge'][data-part='
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
font
|
|
114
|
+
[data-scope='badge'][data-part='indicator'][data-size='sm'] {
|
|
115
|
+
--xh-_badge-dot: var(--xh-space-1_5);
|
|
116
|
+
--xh-_badge-min: var(--xh-space-4);
|
|
117
|
+
--xh-_badge-px: var(--xh-space-0_5);
|
|
118
|
+
--xh-_badge-font: var(--xh-text-caption-size);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
[data-scope='badge'][data-part='indicator'][data-size='lg'] {
|
|
122
|
+
--xh-_badge-dot: var(--xh-space-2_5);
|
|
123
|
+
--xh-_badge-min: var(--xh-space-6);
|
|
124
|
+
--xh-_badge-px: var(--xh-space-1_5);
|
|
125
|
+
--xh-_badge-font: var(--xh-text-body-size);
|
|
54
126
|
}
|
|
55
127
|
}
|
package/css/breadcrumb.css
CHANGED
|
@@ -7,8 +7,11 @@
|
|
|
7
7
|
/* 根节点是 nav 地标,不参与排版:整条路径的行为全在 list 上,
|
|
8
8
|
这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
|
|
9
9
|
[data-scope='breadcrumb'][data-part='root'] {
|
|
10
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
11
|
+
--xh-icon-size: var(--xh-breadcrumb-icon-size, var(--xh-glyph-size-text));
|
|
12
|
+
|
|
10
13
|
/* 尺寸档只换这两个私有槽,列表与链接都从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
11
|
-
--xh-_breadcrumb-font-size: var(--xh-
|
|
14
|
+
--xh-_breadcrumb-font-size: var(--xh-control-font-md);
|
|
12
15
|
--xh-_breadcrumb-gap: var(--xh-space-2);
|
|
13
16
|
/* 当前项与链接悬停的强调色随语气走。没写 data-tone 时 --xh-_tone-fg 没被声明,
|
|
14
17
|
退回原来的前景色。聚焦环不在其列,它恒是 --xh-ring-focus */
|
|
@@ -23,12 +26,12 @@
|
|
|
23
26
|
/* 缺省档写在上面的基础规则里。间距量的是路径里文字与分隔符之间的距离,
|
|
24
27
|
不在控件间距那把尺上(那把尺的大档与中档同值),三档一律取空间尺 */
|
|
25
28
|
[data-scope='breadcrumb'][data-part='root'][data-size='sm'] {
|
|
26
|
-
--xh-_breadcrumb-font-size: var(--xh-font-
|
|
29
|
+
--xh-_breadcrumb-font-size: var(--xh-control-font-sm);
|
|
27
30
|
--xh-_breadcrumb-gap: var(--xh-space-1_5);
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
[data-scope='breadcrumb'][data-part='root'][data-size='lg'] {
|
|
31
|
-
--xh-_breadcrumb-font-size: var(--xh-font-
|
|
34
|
+
--xh-_breadcrumb-font-size: var(--xh-control-font-lg);
|
|
32
35
|
--xh-_breadcrumb-gap: var(--xh-space-3);
|
|
33
36
|
}
|
|
34
37
|
|
|
@@ -66,7 +69,7 @@
|
|
|
66
69
|
align-items: center;
|
|
67
70
|
gap: var(--xh-breadcrumb-link-gap, var(--xh-space-1));
|
|
68
71
|
/* 一层的名字可能很长(文档标题、订单号),压不住会把整条路径撑开 */
|
|
69
|
-
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));
|
|
70
73
|
padding-inline: var(--xh-breadcrumb-link-px, var(--xh-space-1));
|
|
71
74
|
border-radius: var(--xh-breadcrumb-link-radius, var(--xh-shape-control));
|
|
72
75
|
color: inherit;
|
|
@@ -122,11 +125,28 @@
|
|
|
122
125
|
|
|
123
126
|
/* 分隔符常常是个图标:给一个跟着字号走的方框,斜杠与图标混用时基线才不跳 */
|
|
124
127
|
[data-scope='breadcrumb'][data-part='separator'] {
|
|
125
|
-
inline-size: var(--xh-breadcrumb-separator-size,
|
|
128
|
+
inline-size: var(--xh-breadcrumb-separator-size, var(--xh-glyph-size-text));
|
|
126
129
|
}
|
|
127
130
|
|
|
128
131
|
[data-scope='breadcrumb'][data-part='ellipsis'] {
|
|
129
132
|
inline-size: var(--xh-breadcrumb-ellipsis-size, var(--xh-space-5));
|
|
130
133
|
cursor: default;
|
|
131
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
|
+
}
|
|
132
152
|
}
|