@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/menubar.css
CHANGED
|
@@ -6,27 +6,17 @@
|
|
|
6
6
|
|
|
7
7
|
/* 一排 trigger。主轴跟着 data-orientation 走:菜单栏本身可以横排也可以竖排 */
|
|
8
8
|
[data-scope='menubar'][data-part='root'] {
|
|
9
|
-
/*
|
|
10
|
-
|
|
11
|
-
--xh-_menubar-trigger-py: var(--xh-space-1);
|
|
12
|
-
--xh-_menubar-trigger-px: var(--xh-control-px-sm);
|
|
13
|
-
--xh-_menubar-item-py: var(--xh-space-1_5);
|
|
14
|
-
--xh-_menubar-item-px: var(--xh-control-px-md);
|
|
15
|
-
--xh-_menubar-font-size: var(--xh-text-body-size);
|
|
16
|
-
|
|
17
|
-
/* 展开着的那张菜单的 trigger 走品牌淡底强档,随语气换色相;没写 data-tone 时退回品牌淡底。
|
|
18
|
-
悬停与键盘焦点恒中性灰轻档、不接语气槽——两档同色相的话哪张开着就认不出来了。
|
|
19
|
-
聚焦环不在其列,它恒是 --xh-ring-focus */
|
|
20
|
-
--xh-_menubar-active-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
|
|
9
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
10
|
+
--xh-icon-size: var(--xh-menubar-icon-size, var(--xh-glyph-size-text));
|
|
21
11
|
|
|
22
12
|
display: flex;
|
|
23
13
|
align-items: center;
|
|
24
|
-
gap: var(--xh-menubar-gap, var(--xh-space-1));
|
|
25
|
-
padding-block: var(--xh-menubar-py, var(--xh-space-1));
|
|
26
|
-
padding-inline: var(--xh-menubar-px, var(--xh-space-1));
|
|
27
|
-
border-radius: var(--xh-menubar-radius, var(--xh-shape-control));
|
|
28
|
-
background: var(--xh-menubar-bg, transparent);
|
|
29
|
-
color: var(--xh-menubar-fg, var(--xh-fg-default));
|
|
14
|
+
gap: var(--xh-menubar-root-gap, var(--xh-space-1));
|
|
15
|
+
padding-block: var(--xh-menubar-root-py, var(--xh-space-1));
|
|
16
|
+
padding-inline: var(--xh-menubar-root-px, var(--xh-space-1));
|
|
17
|
+
border-radius: var(--xh-menubar-root-radius, var(--xh-shape-control));
|
|
18
|
+
background: var(--xh-menubar-root-bg, transparent);
|
|
19
|
+
color: var(--xh-menubar-root-fg, var(--xh-fg-default));
|
|
30
20
|
}
|
|
31
21
|
|
|
32
22
|
[data-scope='menubar'][data-part='root'][hidden] {
|
|
@@ -38,25 +28,6 @@
|
|
|
38
28
|
align-items: stretch;
|
|
39
29
|
}
|
|
40
30
|
|
|
41
|
-
/* —— 尺寸 —— */
|
|
42
|
-
/* 缺省档写在上面的基础规则里。trigger 的行内内缩缺省落在控件尺 sm 档、再往下取空间尺;
|
|
43
|
-
条目纵向走 space 档、行内内缩走 control-px 档(随密度轴),换档各挪一级 */
|
|
44
|
-
[data-scope='menubar'][data-part='root'][data-size='sm'] {
|
|
45
|
-
--xh-_menubar-trigger-py: var(--xh-space-0_5);
|
|
46
|
-
--xh-_menubar-trigger-px: var(--xh-space-1_5);
|
|
47
|
-
--xh-_menubar-item-py: var(--xh-space-1);
|
|
48
|
-
--xh-_menubar-item-px: var(--xh-control-px-sm);
|
|
49
|
-
--xh-_menubar-font-size: var(--xh-font-size-sm);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
[data-scope='menubar'][data-part='root'][data-size='lg'] {
|
|
53
|
-
--xh-_menubar-trigger-py: var(--xh-space-2);
|
|
54
|
-
--xh-_menubar-trigger-px: var(--xh-control-px-md);
|
|
55
|
-
--xh-_menubar-item-py: var(--xh-space-2);
|
|
56
|
-
--xh-_menubar-item-px: var(--xh-control-px-lg);
|
|
57
|
-
--xh-_menubar-font-size: var(--xh-font-size-lg);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
31
|
/* root 只是 roving tabindex 的兜底落点,焦点转投给 trigger 之后就不再停留,不画环 */
|
|
61
32
|
[data-scope='menubar'][data-part='root']:focus-visible {
|
|
62
33
|
outline: none;
|
|
@@ -117,8 +88,12 @@
|
|
|
117
88
|
|
|
118
89
|
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
119
90
|
[data-scope='menubar'][data-part='positioner'] {
|
|
91
|
+
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,content 继承它限高;
|
|
92
|
+
引擎没算(尚未落位 / 无引擎)时不额外限高 */
|
|
93
|
+
--xh-_menubar-available-h: 100vh;
|
|
94
|
+
|
|
120
95
|
position: fixed;
|
|
121
|
-
z-index: var(--xh-layer-popover);
|
|
96
|
+
z-index: var(--xh-menubar-layer, var(--xh-layer-popover));
|
|
122
97
|
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
123
98
|
pointer-events: none;
|
|
124
99
|
}
|
|
@@ -128,26 +103,71 @@
|
|
|
128
103
|
visibility: hidden;
|
|
129
104
|
}
|
|
130
105
|
|
|
106
|
+
/* —— 尺寸 —— */
|
|
107
|
+
/* 尺寸档只换这六个私有槽,换档不必给每个部件各写一条选择器。
|
|
108
|
+
root 与 positioner 各起一头:trigger 从 root 继承,菜单里的条目从 positioner 继承——
|
|
109
|
+
浮层搬去了 portal 落点,不再是 root 的后代。
|
|
110
|
+
缺省档写在第一条:trigger 与条目的行内内缩都走 control-px 档(随密度轴)、纵向走 space 档,换档各挪一级 */
|
|
111
|
+
[data-scope='menubar']:is([data-part='root'], [data-part='positioner']) {
|
|
112
|
+
--xh-_menubar-trigger-py: var(--xh-space-1);
|
|
113
|
+
--xh-_menubar-trigger-px: var(--xh-control-px-md);
|
|
114
|
+
--xh-_menubar-item-py: var(--xh-space-1_5);
|
|
115
|
+
--xh-_menubar-item-px: var(--xh-control-px-md);
|
|
116
|
+
--xh-_menubar-item-gap: var(--xh-control-gap-md);
|
|
117
|
+
--xh-_menubar-font-size: var(--xh-text-body-size);
|
|
118
|
+
|
|
119
|
+
/* 展开着的那张菜单的 trigger 走品牌淡底强档,随语气换色相;没写 data-tone 时退回品牌淡底。
|
|
120
|
+
悬停与键盘焦点恒中性灰轻档、不接语气槽——两档同色相的话哪张开着就认不出来了。
|
|
121
|
+
聚焦环不在其列,它恒是 --xh-ring-focus */
|
|
122
|
+
--xh-_menubar-active-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
|
|
123
|
+
|
|
124
|
+
/* 打开子菜单的触发条目走品牌淡底强档,随语气换色相;没写 data-tone 时退回品牌淡底 */
|
|
125
|
+
--xh-_menubar-item-active-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
[data-scope='menubar'][data-size='sm']:is([data-part='root'], [data-part='positioner']) {
|
|
129
|
+
--xh-_menubar-trigger-py: var(--xh-space-0_5);
|
|
130
|
+
--xh-_menubar-trigger-px: var(--xh-control-px-sm);
|
|
131
|
+
--xh-_menubar-item-py: var(--xh-space-1);
|
|
132
|
+
--xh-_menubar-item-px: var(--xh-control-px-sm);
|
|
133
|
+
--xh-_menubar-item-gap: var(--xh-control-gap-sm);
|
|
134
|
+
--xh-_menubar-font-size: var(--xh-control-font-sm);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
[data-scope='menubar'][data-size='lg']:is([data-part='root'], [data-part='positioner']) {
|
|
138
|
+
--xh-_menubar-trigger-py: var(--xh-space-2);
|
|
139
|
+
--xh-_menubar-trigger-px: var(--xh-control-px-lg);
|
|
140
|
+
--xh-_menubar-item-py: var(--xh-space-2);
|
|
141
|
+
--xh-_menubar-item-px: var(--xh-control-px-lg);
|
|
142
|
+
--xh-_menubar-item-gap: var(--xh-control-gap-lg);
|
|
143
|
+
--xh-_menubar-font-size: var(--xh-control-font-lg);
|
|
144
|
+
}
|
|
145
|
+
|
|
131
146
|
[data-scope='menubar'][data-part='content'] {
|
|
132
147
|
display: flex;
|
|
133
148
|
flex-direction: column;
|
|
134
|
-
min-inline-size: var(--xh-menubar-
|
|
135
|
-
max-inline-size: var(--xh-menubar-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
149
|
+
min-inline-size: var(--xh-menubar-min-w, var(--xh-overlay-menu-min-w));
|
|
150
|
+
max-inline-size: var(--xh-menubar-max-w, var(--xh-overlay-max-w));
|
|
151
|
+
/* 两道上限取更小的那道:自己的高度上限,以及落定那一侧真正剩下的空间。
|
|
152
|
+
列表族的 16rem 对命令菜单偏矮,这里另给一档 */
|
|
153
|
+
max-block-size: min(var(--xh-menubar-max-h, var(--xh-overlay-menu-max-h)), var(--xh-_menubar-available-h));
|
|
154
|
+
padding-block: var(--xh-menubar-py, var(--xh-space-1));
|
|
155
|
+
padding-inline: var(--xh-menubar-px, var(--xh-space-1));
|
|
156
|
+
border: var(--xh-stroke-thin) solid var(--xh-menubar-border, var(--xh-border-default));
|
|
157
|
+
border-radius: var(--xh-menubar-radius, var(--xh-shape-surface));
|
|
158
|
+
background: var(--xh-menubar-bg, var(--xh-bg-surface));
|
|
159
|
+
color: var(--xh-menubar-fg, var(--xh-fg-default));
|
|
160
|
+
box-shadow: var(--xh-menubar-shadow, var(--xh-elevation-floating));
|
|
161
|
+
/* 条目超过上限就在菜单内部滚。条目的焦点环是内收的,滚动容器裁在内边距缘上,环切不着 */
|
|
162
|
+
overflow-y: auto;
|
|
143
163
|
pointer-events: auto;
|
|
144
164
|
}
|
|
145
165
|
|
|
146
166
|
/* display 会盖掉 hidden 属性的 UA 规则,收起态显式让位。
|
|
147
167
|
连接层给 content 发 hidden,这一条漏了整张菜单就永远收不起来 */
|
|
148
|
-
[data-
|
|
149
|
-
|
|
150
|
-
|
|
168
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
169
|
+
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
170
|
+
[hidden]{display:none}——退场动画得先能播。真正的收起由宿主在退场结束后落成内联 display。 */
|
|
151
171
|
|
|
152
172
|
/* 容器只是"没有条目锚点时"的 Tab 兜底落点,落焦不画环:高亮永远长在条目上 */
|
|
153
173
|
[data-scope='menubar'][data-part='content']:focus-visible {
|
|
@@ -157,7 +177,19 @@
|
|
|
157
177
|
/* 展开时轻微涨开。只在切换到别张菜单时不重播——那由 data-state 的翻转天然保证:
|
|
158
178
|
一张关一张开,动画各跑各的 */
|
|
159
179
|
[data-scope='menubar'][data-part='content'][data-state='open'] {
|
|
160
|
-
animation: xh-
|
|
180
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来 */
|
|
184
|
+
[data-scope='menubar'][data-part='content'][data-state='closed'] {
|
|
185
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* 在一排入口间换张时两侧都瞬时:交叉淡变读起来就是闪烁,且退场关键帧从不透明度 1
|
|
189
|
+
起跳,打断未播完的进场还会亮一下。原生菜单栏的成规——首开有进场、末收有退场、
|
|
190
|
+
换张不播。没有动画时退场闸门当场落定,收起即藏 */
|
|
191
|
+
[data-scope='menubar'][data-part='content'][data-instant] {
|
|
192
|
+
animation: none;
|
|
161
193
|
}
|
|
162
194
|
|
|
163
195
|
[data-scope='menubar'][data-part='group'] {
|
|
@@ -176,7 +208,7 @@
|
|
|
176
208
|
padding-block: var(--xh-menubar-group-label-py, var(--xh-space-1));
|
|
177
209
|
padding-inline: var(--xh-menubar-group-label-px, var(--xh-_menubar-item-px));
|
|
178
210
|
color: var(--xh-menubar-group-label-fg, var(--xh-fg-subtle));
|
|
179
|
-
font-size: var(--xh-menubar-group-label-font-size, var(--xh-
|
|
211
|
+
font-size: var(--xh-menubar-group-label-font-size, var(--xh-text-caption-size));
|
|
180
212
|
font-weight: var(--xh-menubar-group-label-font-weight, var(--xh-font-weight-medium));
|
|
181
213
|
line-height: var(--xh-leading-none);
|
|
182
214
|
user-select: none;
|
|
@@ -189,7 +221,7 @@
|
|
|
189
221
|
[data-scope='menubar'][data-part='item'] {
|
|
190
222
|
display: flex;
|
|
191
223
|
align-items: center;
|
|
192
|
-
gap: var(--xh-menubar-item-gap, var(--xh-
|
|
224
|
+
gap: var(--xh-menubar-item-gap, var(--xh-_menubar-item-gap));
|
|
193
225
|
padding-block: var(--xh-menubar-item-py, var(--xh-_menubar-item-py));
|
|
194
226
|
padding-inline: var(--xh-menubar-item-px, var(--xh-_menubar-item-px));
|
|
195
227
|
border-radius: var(--xh-menubar-item-radius, var(--xh-shape-control));
|
|
@@ -209,14 +241,44 @@
|
|
|
209
241
|
display: none;
|
|
210
242
|
}
|
|
211
243
|
|
|
212
|
-
/*
|
|
213
|
-
|
|
214
|
-
子部件够不着那个伪类,只能读这个标记 */
|
|
215
|
-
[data-scope='menubar'][data-part='item']:not([data-disabled]):is(:hover, :focus, [data-highlighted]) {
|
|
244
|
+
/* 悬停与键盘锚点共用中性灰轻档:锚点只认连接层打的 data-highlighted,不读 :focus */
|
|
245
|
+
[data-scope='menubar'][data-part='item']:not([data-disabled]):is(:hover, [data-highlighted]) {
|
|
216
246
|
background: var(--xh-menubar-item-bg-hover, var(--xh-bg-subtle));
|
|
217
247
|
}
|
|
218
248
|
|
|
219
|
-
|
|
249
|
+
/* 打开子菜单的触发条目是展开路径,走品牌淡底加粗强档。
|
|
250
|
+
必须排在轻档之后:悬停或焦点回到它身上时同特指度靠书写顺序压过轻档 */
|
|
251
|
+
[data-scope='menubar'][data-part='item']:not([data-disabled])[data-state='open'] {
|
|
252
|
+
background: var(--xh-menubar-item-bg-active, var(--xh-_menubar-item-active-bg));
|
|
253
|
+
font-weight: var(--xh-menubar-item-active-font-weight, var(--xh-font-weight-semibold));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/* 带子菜单的条目行尾画右向小箭头:不点开也看得出还有下一级。
|
|
257
|
+
位置靠 margin 顶到行尾,图形取兜底字形令牌 */
|
|
258
|
+
[data-scope='menubar'][data-part='item'][aria-haspopup='menu']::after {
|
|
259
|
+
content: '';
|
|
260
|
+
flex: none;
|
|
261
|
+
margin-inline-start: auto;
|
|
262
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
263
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
264
|
+
background-color: currentColor;
|
|
265
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
266
|
+
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/* rtl 下子菜单开在左侧,箭头跟着指向行进方向 */
|
|
270
|
+
[dir='rtl'] [data-scope='menubar'][data-part='item'][aria-haspopup='menu']::after {
|
|
271
|
+
-webkit-mask-image: var(--xh-glyph-mark-chevron-left);
|
|
272
|
+
mask-image: var(--xh-glyph-mark-chevron-left);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/* 键盘落焦的条目画内收环;指针触发的聚焦不画 */
|
|
276
|
+
[data-scope='menubar'][data-part='item']:focus-visible {
|
|
277
|
+
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
278
|
+
outline-offset: calc(-1 * var(--xh-ring-width));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
[data-scope='menubar'][data-part='item']:focus:not(:focus-visible) {
|
|
220
282
|
outline: none;
|
|
221
283
|
}
|
|
222
284
|
|
|
@@ -244,7 +306,7 @@
|
|
|
244
306
|
align-items: center;
|
|
245
307
|
justify-content: center;
|
|
246
308
|
inline-size: var(--xh-menubar-item-indicator-size, var(--xh-control-indicator-size));
|
|
247
|
-
color: var(--xh-menubar-item-indicator-fg, var(--xh-fg-
|
|
309
|
+
color: var(--xh-menubar-item-indicator-fg, var(--xh-fg-brand));
|
|
248
310
|
}
|
|
249
311
|
|
|
250
312
|
[data-scope='menubar'][data-part='item-indicator'][hidden] {
|
|
@@ -262,11 +324,23 @@
|
|
|
262
324
|
margin-block: var(--xh-menubar-separator-my, var(--xh-space-1));
|
|
263
325
|
background: var(--xh-menubar-separator-color, var(--xh-border-default));
|
|
264
326
|
}
|
|
327
|
+
|
|
328
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
329
|
+
[data-scope='menubar'][data-part='item-indicator']:empty::before {
|
|
330
|
+
content: '';
|
|
331
|
+
display: inline-block;
|
|
332
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
333
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
334
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
335
|
+
background-color: currentColor;
|
|
336
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
337
|
+
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
338
|
+
}
|
|
265
339
|
}
|
|
266
340
|
|
|
267
341
|
@layer xihan.motion {
|
|
268
342
|
/* 自带前缀独占一个名字,不动公共的那份关键帧 */
|
|
269
|
-
@keyframes xh-
|
|
343
|
+
@keyframes xh-pop-in {
|
|
270
344
|
from {
|
|
271
345
|
opacity: 0;
|
|
272
346
|
scale: var(--xh-motion-scale-enter);
|
|
@@ -277,4 +351,16 @@
|
|
|
277
351
|
scale: 1;
|
|
278
352
|
}
|
|
279
353
|
}
|
|
354
|
+
|
|
355
|
+
@keyframes xh-pop-out {
|
|
356
|
+
from {
|
|
357
|
+
opacity: 1;
|
|
358
|
+
scale: 1;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
to {
|
|
362
|
+
opacity: 0;
|
|
363
|
+
scale: var(--xh-motion-scale-enter);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
280
366
|
}
|
package/css/navigation-menu.css
CHANGED
|
@@ -1,14 +1,26 @@
|
|
|
1
1
|
@layer xihan.motion {
|
|
2
2
|
/* 面板往下探一小截再落位:纯淡入看不出它是从哪条 trigger 长出来的 */
|
|
3
|
-
@keyframes xh-
|
|
3
|
+
@keyframes xh-pop-in {
|
|
4
4
|
from {
|
|
5
5
|
opacity: 0;
|
|
6
|
-
|
|
6
|
+
scale: var(--xh-motion-scale-enter);
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
to {
|
|
10
10
|
opacity: 1;
|
|
11
|
-
|
|
11
|
+
scale: 1;
|
|
12
|
+
}
|
|
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);
|
|
12
24
|
}
|
|
13
25
|
}
|
|
14
26
|
}
|
|
@@ -29,14 +41,17 @@
|
|
|
29
41
|
--xh-_navigation-menu-trigger-h: var(--xh-control-h-md);
|
|
30
42
|
--xh-_navigation-menu-trigger-px: var(--xh-control-px-md);
|
|
31
43
|
--xh-_navigation-menu-trigger-gap: var(--xh-control-gap-md);
|
|
32
|
-
--xh-_navigation-menu-link-
|
|
44
|
+
--xh-_navigation-menu-link-py: var(--xh-space-1_5);
|
|
45
|
+
--xh-_navigation-menu-link-px: var(--xh-control-px-md);
|
|
33
46
|
--xh-_navigation-menu-link-font-size: var(--xh-text-body-size);
|
|
34
47
|
|
|
35
|
-
/*
|
|
36
|
-
|
|
48
|
+
/* 悬停与键盘锚点恒中性灰轻档、不接语气槽——两档同色相的话打开路径就认不出来了 */
|
|
49
|
+
--xh-_navigation-menu-highlight-bg: var(--xh-bg-subtle);
|
|
50
|
+
|
|
51
|
+
/* 语气落在三处:展开着的 trigger 的底色、当前链接的文字色、指示条。
|
|
52
|
+
没写 data-tone 时这几个 --xh-_tone-* 都没被声明,各自退回品牌色。
|
|
37
53
|
聚焦环不在其列,它恒是 --xh-ring-focus */
|
|
38
|
-
--xh-_navigation-menu-
|
|
39
|
-
--xh-_navigation-menu-open-fg: var(--xh-_tone-fg, var(--xh-fg-default));
|
|
54
|
+
--xh-_navigation-menu-active-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
|
|
40
55
|
--xh-_navigation-menu-current-fg: var(--xh-_tone-fg, var(--xh-fg-brand));
|
|
41
56
|
--xh-_navigation-menu-accent: var(--xh-_tone, var(--xh-fg-brand));
|
|
42
57
|
|
|
@@ -49,21 +64,23 @@
|
|
|
49
64
|
/* 缺省档写在上面的基础规则里。链接的内边距不在控件内边距那把尺上(它比控件矮一档),
|
|
50
65
|
三档一律取空间尺,缺省档的取值原样保留 */
|
|
51
66
|
[data-scope='navigation-menu'][data-part='root'][data-size='sm'] {
|
|
52
|
-
--xh-_navigation-menu-font-size: var(--xh-font-
|
|
67
|
+
--xh-_navigation-menu-font-size: var(--xh-control-font-sm);
|
|
53
68
|
--xh-_navigation-menu-trigger-h: var(--xh-control-h-sm);
|
|
54
69
|
--xh-_navigation-menu-trigger-px: var(--xh-control-px-sm);
|
|
55
70
|
--xh-_navigation-menu-trigger-gap: var(--xh-control-gap-sm);
|
|
56
|
-
--xh-_navigation-menu-link-
|
|
57
|
-
--xh-_navigation-menu-link-
|
|
71
|
+
--xh-_navigation-menu-link-py: var(--xh-space-1);
|
|
72
|
+
--xh-_navigation-menu-link-px: var(--xh-control-px-sm);
|
|
73
|
+
--xh-_navigation-menu-link-font-size: var(--xh-control-font-sm);
|
|
58
74
|
}
|
|
59
75
|
|
|
60
76
|
[data-scope='navigation-menu'][data-part='root'][data-size='lg'] {
|
|
61
|
-
--xh-_navigation-menu-font-size: var(--xh-font-
|
|
77
|
+
--xh-_navigation-menu-font-size: var(--xh-control-font-lg);
|
|
62
78
|
--xh-_navigation-menu-trigger-h: var(--xh-control-h-lg);
|
|
63
79
|
--xh-_navigation-menu-trigger-px: var(--xh-control-px-lg);
|
|
64
80
|
--xh-_navigation-menu-trigger-gap: var(--xh-control-gap-lg);
|
|
65
|
-
--xh-_navigation-menu-link-
|
|
66
|
-
--xh-_navigation-menu-link-
|
|
81
|
+
--xh-_navigation-menu-link-py: var(--xh-space-2);
|
|
82
|
+
--xh-_navigation-menu-link-px: var(--xh-control-px-lg);
|
|
83
|
+
--xh-_navigation-menu-link-font-size: var(--xh-control-font-lg);
|
|
67
84
|
}
|
|
68
85
|
|
|
69
86
|
/* 指示条的定位参照系(它是 absolute,量出来的偏移就是相对这里的)。
|
|
@@ -114,7 +131,7 @@
|
|
|
114
131
|
line-height: var(--xh-leading-none);
|
|
115
132
|
white-space: nowrap;
|
|
116
133
|
cursor: pointer;
|
|
117
|
-
transition:
|
|
134
|
+
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
118
135
|
}
|
|
119
136
|
|
|
120
137
|
[data-scope='navigation-menu'][data-part='trigger'][hidden] {
|
|
@@ -130,8 +147,11 @@
|
|
|
130
147
|
outline-offset: var(--xh-ring-offset);
|
|
131
148
|
}
|
|
132
149
|
|
|
150
|
+
/* 展开着的那一张是打开路径,走品牌淡底强档:哪一张开着必须一眼看得出来。
|
|
151
|
+
不加粗:横排的栏加粗会推挤相邻触发器。
|
|
152
|
+
必须排在轻档之后:指针回到它身上时同特指度靠书写顺序压过轻档 */
|
|
133
153
|
[data-scope='navigation-menu'][data-part='trigger'][data-state='open'] {
|
|
134
|
-
|
|
154
|
+
background: var(--xh-navigation-menu-trigger-bg-active, var(--xh-_navigation-menu-active-bg));
|
|
135
155
|
}
|
|
136
156
|
|
|
137
157
|
/* 集合条目用 data-disabled,不用 :disabled:它带的是 aria-disabled,
|
|
@@ -149,24 +169,24 @@
|
|
|
149
169
|
/* 面板贴着自己那一项落位:横排从 trigger 底下长出来 */
|
|
150
170
|
[data-scope='navigation-menu'][data-part='content'] {
|
|
151
171
|
position: absolute;
|
|
152
|
-
z-index: var(--xh-layer-popover);
|
|
172
|
+
z-index: var(--xh-navigation-menu-layer, var(--xh-layer-popover));
|
|
153
173
|
inset-block-start: calc(100% + var(--xh-navigation-menu-content-offset, var(--xh-space-1)));
|
|
154
174
|
inset-inline-start: 0;
|
|
155
175
|
display: flex;
|
|
156
176
|
flex-direction: column;
|
|
157
177
|
gap: var(--xh-navigation-menu-content-gap, var(--xh-space-1));
|
|
158
|
-
min-inline-size: var(--xh-navigation-menu-content-min-w, var(--xh-overlay-min-w));
|
|
159
|
-
padding: var(--xh-navigation-menu-content-p, var(--xh-space-
|
|
178
|
+
min-inline-size: var(--xh-navigation-menu-content-min-w, var(--xh-overlay-menu-min-w));
|
|
179
|
+
padding: var(--xh-navigation-menu-content-p, var(--xh-space-1));
|
|
160
180
|
border: var(--xh-stroke-thin) solid var(--xh-navigation-menu-content-border, var(--xh-border-default));
|
|
161
181
|
border-radius: var(--xh-navigation-menu-content-radius, var(--xh-shape-surface));
|
|
162
182
|
background: var(--xh-navigation-menu-content-bg, var(--xh-bg-surface));
|
|
163
|
-
box-shadow: var(--xh-navigation-menu-content-shadow, var(--xh-elevation-
|
|
183
|
+
box-shadow: var(--xh-navigation-menu-content-shadow, var(--xh-elevation-floating));
|
|
164
184
|
}
|
|
165
185
|
|
|
166
186
|
/* display 会盖掉 hidden 属性的 UA 规则,收起态显式让位 */
|
|
167
|
-
[data-
|
|
168
|
-
|
|
169
|
-
|
|
187
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
188
|
+
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
189
|
+
[hidden]{display:none}——退场动画得先能播。真正的收起由宿主在退场结束后落成内联 display。 */
|
|
170
190
|
|
|
171
191
|
/* 竖排导航:面板改从侧边长出来 */
|
|
172
192
|
[data-scope='navigation-menu'][data-part='content'][data-orientation='vertical'] {
|
|
@@ -175,7 +195,12 @@
|
|
|
175
195
|
}
|
|
176
196
|
|
|
177
197
|
[data-scope='navigation-menu'][data-part='content'][data-state='open'] {
|
|
178
|
-
animation: xh-
|
|
198
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来 */
|
|
202
|
+
[data-scope='navigation-menu'][data-part='content'][data-state='closed'] {
|
|
203
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
179
204
|
}
|
|
180
205
|
|
|
181
206
|
/* 面板整批塞进共享外壳时,落位归外壳管,面板自己回到静态流里——
|
|
@@ -191,8 +216,8 @@
|
|
|
191
216
|
[data-scope='navigation-menu'][data-part='link'] {
|
|
192
217
|
display: flex;
|
|
193
218
|
align-items: center;
|
|
194
|
-
padding-block: var(--xh-navigation-menu-link-py, var(--xh-_navigation-menu-link-
|
|
195
|
-
padding-inline: var(--xh-navigation-menu-link-px, var(--xh-_navigation-menu-link-
|
|
219
|
+
padding-block: var(--xh-navigation-menu-link-py, var(--xh-_navigation-menu-link-py));
|
|
220
|
+
padding-inline: var(--xh-navigation-menu-link-px, var(--xh-_navigation-menu-link-px));
|
|
196
221
|
border-radius: var(--xh-navigation-menu-link-radius, var(--xh-shape-control));
|
|
197
222
|
color: var(--xh-navigation-menu-link-fg, var(--xh-fg-default));
|
|
198
223
|
font-size: var(--xh-navigation-menu-link-font-size, var(--xh-_navigation-menu-link-font-size));
|
|
@@ -227,7 +252,7 @@
|
|
|
227
252
|
margin: 0;
|
|
228
253
|
inset-block-end: calc(var(--xh-navigation-menu-indicator-thickness, var(--xh-stroke-thick)) * -1);
|
|
229
254
|
block-size: var(--xh-navigation-menu-indicator-thickness, var(--xh-stroke-thick));
|
|
230
|
-
border-radius: var(--xh-navigation-menu-indicator-radius, var(--xh-
|
|
255
|
+
border-radius: var(--xh-navigation-menu-indicator-radius, var(--xh-shape-pill));
|
|
231
256
|
background: var(--xh-navigation-menu-indicator-color, var(--xh-_navigation-menu-accent));
|
|
232
257
|
transition:
|
|
233
258
|
inset-inline-start var(--xh-motion-duration-enter) var(--xh-motion-ease-enter),
|
|
@@ -252,7 +277,7 @@
|
|
|
252
277
|
/* 共享面板外壳:只管落位与统一的面板外观,里面装哪一份内容归 content */
|
|
253
278
|
[data-scope='navigation-menu'][data-part='viewport'] {
|
|
254
279
|
position: absolute;
|
|
255
|
-
z-index: var(--xh-layer-popover);
|
|
280
|
+
z-index: var(--xh-navigation-menu-layer, var(--xh-layer-popover));
|
|
256
281
|
inset-block-start: calc(100% + var(--xh-navigation-menu-content-offset, var(--xh-space-1)));
|
|
257
282
|
inset-inline-start: 0;
|
|
258
283
|
display: block;
|
|
@@ -260,7 +285,7 @@
|
|
|
260
285
|
border: var(--xh-stroke-thin) solid var(--xh-navigation-menu-content-border, var(--xh-border-default));
|
|
261
286
|
border-radius: var(--xh-navigation-menu-content-radius, var(--xh-shape-surface));
|
|
262
287
|
background: var(--xh-navigation-menu-content-bg, var(--xh-bg-surface));
|
|
263
|
-
box-shadow: var(--xh-navigation-menu-content-shadow, var(--xh-elevation-
|
|
288
|
+
box-shadow: var(--xh-navigation-menu-content-shadow, var(--xh-elevation-floating));
|
|
264
289
|
}
|
|
265
290
|
|
|
266
291
|
[data-scope='navigation-menu'][data-part='viewport'][hidden] {
|
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
|
}
|