@xihan-ui/styles 1.0.0 → 2.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 +5146 -6
- package/README.md +22 -2
- package/component-tokens.d.ts +4212 -0
- package/component-tokens.js +2 -0
- package/components.tokens.json +80116 -0
- package/css/accordion.css +131 -75
- package/css/affix.css +16 -1
- package/css/alert.css +114 -67
- package/css/anchor.css +99 -27
- package/css/approval.css +461 -0
- package/css/avatar-group.css +14 -6
- package/css/avatar.css +33 -9
- package/css/back-top.css +103 -48
- package/css/badge.css +42 -14
- package/css/bar-code.css +62 -0
- package/css/breadcrumb.css +40 -21
- package/css/button-group.css +146 -24
- package/css/button.css +116 -99
- package/css/calendar-picker.css +448 -0
- package/css/calendar-range-picker.css +517 -0
- package/css/card.css +54 -77
- package/css/carousel.css +412 -68
- package/css/cascader.css +429 -246
- package/css/checkbox-group.css +225 -77
- package/css/checkbox.css +174 -37
- package/css/clipboard.css +266 -47
- package/css/code-view.css +279 -0
- package/css/collapsible.css +108 -63
- package/css/color-field.css +158 -0
- package/css/color-picker.css +172 -184
- package/css/color-slider.css +274 -0
- package/css/color-swatch-picker.css +243 -0
- package/css/color-swatch.css +35 -0
- package/css/combobox.css +267 -273
- package/css/command.css +399 -0
- package/css/context-menu.css +183 -108
- package/css/date-field.css +94 -121
- package/css/date-picker.css +486 -249
- package/css/date-range-picker.css +559 -0
- package/css/description.css +51 -0
- package/css/descriptions.css +133 -87
- package/css/dialog.css +247 -68
- package/css/diff-view.css +428 -0
- package/css/download-trigger.css +155 -46
- package/css/drawer.css +194 -111
- package/css/editable.css +172 -152
- package/css/empty-state.css +80 -11
- package/css/field-array.css +190 -0
- package/css/field.css +84 -31
- package/css/fieldset.css +51 -18
- package/css/file-upload.css +134 -36
- package/css/flex.css +20 -1
- package/css/float-button.css +238 -57
- package/css/floating-panel.css +173 -92
- package/css/focus.css +46 -0
- package/css/forced-colors.css +93 -0
- package/css/form.css +254 -77
- package/css/gradient-text.css +34 -10
- package/css/grid.css +516 -5
- package/css/heatmap.css +87 -29
- package/css/highlight.css +20 -5
- package/css/hover-card.css +97 -47
- package/css/icon-wrapper.css +15 -3
- package/css/icon.css +74 -8
- package/css/image-cropper.css +143 -29
- package/css/image-viewer.css +150 -89
- package/css/image.css +30 -1
- package/css/infinite-scroll.css +51 -1
- package/css/input-group.css +277 -0
- package/css/json-viewer.css +102 -45
- package/css/kbd.css +72 -0
- package/css/label.css +78 -0
- package/css/layers.css +5 -0
- package/css/layout.css +175 -31
- package/css/list.css +24 -3
- package/css/listbox.css +208 -67
- package/css/loading-bar.css +52 -3
- package/css/log.css +144 -9
- package/css/markdown-stream.css +149 -0
- package/css/marquee.css +27 -1
- package/css/masonry.css +7 -0
- package/css/matrix-code.css +67 -0
- package/css/mention.css +234 -152
- package/css/menu.css +180 -83
- package/css/menubar.css +204 -136
- package/css/message-feed.css +197 -0
- package/css/navigation-menu.css +144 -90
- package/css/notification.css +178 -100
- package/css/number-animation.css +7 -0
- package/css/number-field.css +120 -277
- package/css/overlay-arrow.css +12 -7
- package/css/page-header.css +99 -14
- package/css/pagination.css +175 -135
- package/css/password-input.css +222 -219
- package/css/pin-input.css +101 -67
- package/css/pointer.css +36 -0
- package/css/popconfirm.css +185 -94
- package/css/popover.css +121 -77
- package/css/progress.css +60 -12
- package/css/prompt-input.css +224 -0
- package/css/question-flow.css +513 -0
- package/css/radio-group.css +147 -30
- package/css/rating.css +193 -43
- package/css/reasoning.css +336 -0
- package/css/reset.css +84 -6
- package/css/resizable.css +237 -0
- package/css/scroll-area.css +68 -7
- package/css/scrollbar.css +47 -13
- package/css/segmented.css +94 -29
- package/css/select.css +288 -274
- package/css/separator.css +101 -1
- package/css/side-nav.css +133 -75
- package/css/signature-pad.css +74 -54
- package/css/skeleton.css +84 -11
- package/css/slider.css +132 -39
- package/css/sortable.css +198 -0
- package/css/spinner.css +126 -12
- package/css/splitter.css +29 -8
- package/css/statistic.css +55 -0
- package/css/steps.css +206 -72
- package/css/switch.css +268 -36
- package/css/table.css +695 -118
- package/css/tabs.css +604 -42
- package/css/tag-group.css +219 -0
- package/css/tag.css +118 -28
- package/css/tags-input.css +156 -274
- package/css/text-field.css +101 -249
- package/css/time-field.css +100 -128
- package/css/time-picker.css +323 -252
- package/css/time-range-picker.css +719 -0
- package/css/timeline.css +202 -68
- package/css/timer.css +56 -52
- package/css/timestamp.css +34 -0
- package/css/toast.css +373 -144
- package/css/toggle-group.css +309 -76
- package/css/toggle.css +116 -85
- package/css/tone.css +47 -0
- package/css/tool-call.css +421 -0
- package/css/toolbar.css +181 -33
- package/css/tooltip.css +107 -36
- package/css/tour.css +183 -152
- package/css/transfer.css +351 -138
- package/css/tree-select.css +323 -216
- package/css/tree.css +294 -62
- package/css/truncate.css +65 -0
- package/css/typography.css +228 -5
- package/css/undefined.css +10 -1
- package/css/virtualizer.css +9 -10
- package/css/visually-hidden.css +7 -0
- package/css/watermark.css +7 -0
- package/family/action-control.css +487 -0
- package/family/collection-item.css +721 -0
- package/family/field-chrome.css +298 -0
- package/family/motion.css +166 -0
- package/family/swatch.css +59 -0
- package/index.css +41705 -126
- package/index.unlayered.css +33692 -17339
- package/package.json +51 -17
- package/css/calendar.css +0 -367
- package/css/code-block.css +0 -91
- package/css/composer.css +0 -134
- package/css/countdown.css +0 -26
- package/css/dynamic-input.css +0 -220
- package/css/ellipsis.css +0 -52
- package/css/hotkeys.css +0 -90
- package/css/popselect.css +0 -391
- package/css/qr-code.css +0 -55
- package/css/result.css +0 -119
- package/css/space.css +0 -117
- package/css/thread.css +0 -120
- package/css/time.css +0 -25
package/css/menu.css
CHANGED
|
@@ -1,29 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
from {
|
|
6
|
-
opacity: 0;
|
|
7
|
-
scale: var(--xh-motion-scale-enter);
|
|
8
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
9
5
|
|
|
10
|
-
|
|
11
|
-
opacity: 1;
|
|
12
|
-
scale: 1;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
@keyframes xh-pop-out {
|
|
16
|
-
from {
|
|
17
|
-
opacity: 1;
|
|
18
|
-
scale: 1;
|
|
19
|
-
}
|
|
6
|
+
/* 定义 menu 样式。 */
|
|
20
7
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,条目走 Collection Item 家族;本皮肤 @import 它们,单独引入仍成立。 */
|
|
9
|
+
@import '../family/collection-item.css';
|
|
10
|
+
@import '../family/motion.css';
|
|
27
11
|
|
|
28
12
|
@layer xihan.components {
|
|
29
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -36,12 +20,20 @@
|
|
|
36
20
|
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,content 继承它限高;
|
|
37
21
|
引擎没算(尚未落位 / 无引擎)时不额外限高 */
|
|
38
22
|
--xh-_menu-available-h: 100vh;
|
|
23
|
+
/* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,行内轴据此夹取;
|
|
24
|
+
引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
|
|
25
|
+
--xh-_menu-available-w: 100vw;
|
|
26
|
+
/* Web Components 的子菜单仍在父层 DOM 内,先清零以截断父 positioner 的方向继承。 */
|
|
27
|
+
--xh-_overlay-enter-up: 0;
|
|
28
|
+
--xh-_overlay-enter-down: 0;
|
|
29
|
+
--xh-_overlay-enter-left: 0;
|
|
30
|
+
--xh-_overlay-enter-right: 0;
|
|
39
31
|
|
|
40
32
|
/* 条目列表的自绘条浮在内容之上:轨道不上底色,实色轨道会在菜单右缘糊一条竖灰带 */
|
|
41
33
|
--xh-scrollbar-track-bg: transparent;
|
|
42
34
|
|
|
43
35
|
position: fixed;
|
|
44
|
-
z-index: var(--xh-menu-layer, var(--xh-layer-popover));
|
|
36
|
+
z-index: var(--xh-menu-layer, var(--xh-_layer, var(--xh-layer-popover)));
|
|
45
37
|
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
46
38
|
pointer-events: none;
|
|
47
39
|
}
|
|
@@ -51,22 +43,35 @@
|
|
|
51
43
|
visibility: hidden;
|
|
52
44
|
}
|
|
53
45
|
|
|
54
|
-
/*
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
46
|
+
/* 菜单从锚点一侧短移入;物理 placement 与定位引擎同一套,不随书写方向翻。 */
|
|
47
|
+
[data-scope='menu'][data-part='positioner'][data-placement^='top'] {
|
|
48
|
+
--xh-_overlay-enter-down: 1;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
[data-scope='menu'][data-part='positioner'][data-placement^='bottom'] {
|
|
52
|
+
--xh-_overlay-enter-up: 1;
|
|
59
53
|
}
|
|
60
54
|
|
|
61
|
-
|
|
62
|
-
|
|
55
|
+
[data-scope='menu'][data-part='positioner'][data-placement^='left'] {
|
|
56
|
+
--xh-_overlay-enter-right: 1;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
[data-scope='menu'][data-part='positioner'][data-placement^='right'] {
|
|
60
|
+
--xh-_overlay-enter-left: 1;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* 触发器的长相归作者,皮肤只表达展开态:展开着的那一张是打开路径,落与家族 hover 同档的中性面——
|
|
64
|
+
打开中不是选中,不用品牌色、不接语气(§7.3);哪一张开着由浮层本身说明。不加粗:加粗会推挤相邻内容 */
|
|
63
65
|
[data-scope='menu'][data-part='trigger']:not([data-disabled])[data-state='open'] {
|
|
64
|
-
background: var(--xh-menu-trigger-bg-active, var(--xh-
|
|
66
|
+
background: var(--xh-menu-trigger-bg-active, var(--xh-bg-subtle));
|
|
65
67
|
}
|
|
66
68
|
|
|
67
69
|
[data-scope='menu'][data-part='content'] {
|
|
68
|
-
/*
|
|
69
|
-
|
|
70
|
+
/* 条目外的字形(分组标题等)按档取尺,缺省 md,随 data-size 换档;条目里作者放的图标由家族随
|
|
71
|
+
data-xh-collection-size 下发(§6.5)。菜单自绘的状态字形(标记位的盒、子菜单的展开 chevron)不读这支:
|
|
72
|
+
它们是指示符,走 --xh-control-indicator-* 一族——标记位在自己身上把 --xh-icon-size 改接到盒的尺,
|
|
73
|
+
子菜单箭头走 --xh-menu-submenu-indicator-size */
|
|
74
|
+
--xh-icon-size: var(--xh-menu-icon-size, var(--xh-glyph-size-md));
|
|
70
75
|
|
|
71
76
|
/* 尺寸档只换这四个私有槽,条目从 content 继承它们,换档不必给每个部件各写一条选择器。
|
|
72
77
|
菜单没有 root 部件(浮层树的最外层就是 content),三轴属性都落在这里 */
|
|
@@ -75,30 +80,44 @@
|
|
|
75
80
|
--xh-_menu-item-gap: var(--xh-control-gap-md);
|
|
76
81
|
--xh-_menu-font-size: var(--xh-control-font-md);
|
|
77
82
|
|
|
78
|
-
|
|
79
|
-
悬停与键盘焦点恒中性灰轻档、不接语气槽——两档同色相的话打开路径就认不出来了 */
|
|
80
|
-
--xh-_menu-item-active-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
|
|
81
|
-
|
|
83
|
+
position: relative;
|
|
82
84
|
display: flex;
|
|
83
85
|
flex-direction: column;
|
|
84
86
|
gap: var(--xh-menu-content-gap, var(--xh-list-option-gap));
|
|
85
87
|
min-inline-size: var(--xh-menu-min-w, var(--xh-overlay-menu-min-w));
|
|
86
|
-
|
|
88
|
+
/* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的内容就点不到了 */
|
|
89
|
+
max-inline-size: min(var(--xh-menu-max-w, var(--xh-overlay-max-w)), var(--xh-_menu-available-w));
|
|
87
90
|
/* 两道上限取更小的那道:自己的高度上限,以及落定那一侧真正剩下的空间。
|
|
88
91
|
列表族的 16rem 对命令菜单偏矮,这里另给一档 */
|
|
89
92
|
max-block-size: min(var(--xh-menu-max-h, var(--xh-overlay-menu-max-h)), var(--xh-_menu-available-h));
|
|
90
|
-
padding-block: var(--xh-menu-py, var(--xh-
|
|
91
|
-
padding-inline: var(--xh-menu-px, var(--xh-
|
|
92
|
-
border: var(--xh-stroke-thin) solid var(--xh-menu-border, var(--xh-border
|
|
93
|
-
border-radius: var(--xh-menu-radius, var(--xh-shape-
|
|
94
|
-
background: var(--xh-menu-bg, var(--xh-bg
|
|
95
|
-
color: var(--xh-menu-fg, var(--xh-fg
|
|
96
|
-
box-shadow: var(--xh-menu-shadow, var(--xh-
|
|
97
|
-
|
|
93
|
+
padding-block: var(--xh-menu-content-py, var(--xh-surface-pad-xs));
|
|
94
|
+
padding-inline: var(--xh-menu-content-px, var(--xh-surface-pad-xs));
|
|
95
|
+
border: var(--xh-stroke-thin) solid var(--xh-menu-border, var(--xh-material-frosted-border));
|
|
96
|
+
border-radius: var(--xh-menu-content-radius, var(--xh-shape-overlay));
|
|
97
|
+
background: var(--xh-menu-content-bg, var(--xh-material-frosted-bg));
|
|
98
|
+
color: var(--xh-menu-content-fg, var(--xh-material-frosted-fg));
|
|
99
|
+
box-shadow: var(--xh-menu-content-shadow, var(--xh-material-frosted-shadow));
|
|
100
|
+
-webkit-backdrop-filter: var(--xh-menu-backdrop, var(--xh-material-frosted-backdrop));
|
|
101
|
+
backdrop-filter: var(--xh-menu-backdrop, var(--xh-material-frosted-backdrop));
|
|
102
|
+
/* 条目超过上限就在菜单内部滚。条目的焦点环是内收的,滚动容器裁在内边距缘上,环切不着。
|
|
103
|
+
浮层滚动面:到底后不把滚动链穿透给页面(§6.6) */
|
|
98
104
|
overflow-y: auto;
|
|
105
|
+
overscroll-behavior: contain;
|
|
99
106
|
pointer-events: auto;
|
|
100
107
|
}
|
|
101
108
|
|
|
109
|
+
/* 顶光是独立装饰层,不替换真实边框;高对比/强制色归零后四边轮廓仍完整。 */
|
|
110
|
+
[data-scope='menu'][data-part='content']::before {
|
|
111
|
+
content: '';
|
|
112
|
+
position: absolute;
|
|
113
|
+
inset-block-start: 0;
|
|
114
|
+
inset-inline: 0;
|
|
115
|
+
block-size: var(--xh-stroke-thin);
|
|
116
|
+
border-radius: inherit;
|
|
117
|
+
background: var(--xh-menu-highlight, var(--xh-material-frosted-highlight));
|
|
118
|
+
pointer-events: none;
|
|
119
|
+
}
|
|
120
|
+
|
|
102
121
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
103
122
|
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
104
123
|
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
@@ -110,20 +129,24 @@
|
|
|
110
129
|
outline: none;
|
|
111
130
|
}
|
|
112
131
|
|
|
132
|
+
/* 在场那一档才提前备好合成层:属性随 data-state 一起消失,收起后不长期占着 */
|
|
113
133
|
[data-scope='menu'][data-part='content'][data-state='open'] {
|
|
114
|
-
|
|
134
|
+
will-change: opacity, translate;
|
|
135
|
+
animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
115
136
|
}
|
|
116
137
|
|
|
117
138
|
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
118
139
|
免得动画结束到真收起之间闪一下原样 */
|
|
119
140
|
[data-scope='menu'][data-part='content'][data-state='closed'] {
|
|
120
|
-
|
|
141
|
+
will-change: opacity, translate;
|
|
142
|
+
animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
121
143
|
}
|
|
122
144
|
|
|
123
145
|
/* —— 尺寸 —— */
|
|
124
146
|
/* 缺省档写在 content 的基础规则里。条目高度由 padding 撑出来:
|
|
125
147
|
纵向走 space 档、行内内缩走 control-px 档(随密度轴),换档各挪一级 */
|
|
126
148
|
[data-scope='menu'][data-part='content'][data-size='sm'] {
|
|
149
|
+
--xh-icon-size: var(--xh-menu-icon-size, var(--xh-glyph-size-sm));
|
|
127
150
|
--xh-_menu-item-py: var(--xh-list-option-py-sm);
|
|
128
151
|
--xh-_menu-item-px: var(--xh-control-px-sm);
|
|
129
152
|
--xh-_menu-item-gap: var(--xh-control-gap-sm);
|
|
@@ -131,66 +154,123 @@
|
|
|
131
154
|
}
|
|
132
155
|
|
|
133
156
|
[data-scope='menu'][data-part='content'][data-size='lg'] {
|
|
157
|
+
--xh-icon-size: var(--xh-menu-icon-size, var(--xh-glyph-size-lg));
|
|
134
158
|
--xh-_menu-item-py: var(--xh-list-option-py-lg);
|
|
135
159
|
--xh-_menu-item-px: var(--xh-control-px-lg);
|
|
136
160
|
--xh-_menu-item-gap: var(--xh-control-gap-lg);
|
|
137
161
|
--xh-_menu-font-size: var(--xh-control-font-lg);
|
|
138
162
|
}
|
|
139
163
|
|
|
164
|
+
/* 条目走 Collection Item 的 overlay 语境:悬停 / 键盘锚点(data-highlighted,白底承载 100)、按下(200)、
|
|
165
|
+
子层开着的打开路径(data-in-path,与 hover 同档)与禁用面(aria-disabled)都由家族给,这里只把公开槽映射到
|
|
166
|
+
桥接槽。布局保持 flex 而不用家族网格:图标、正文、快捷键按一行排布,说明另起一行靠 flex-wrap 折下去,
|
|
167
|
+
子菜单箭头是行尾的伪元素;间距统一由行的 gap 给,家族按槽下发的外边距归零 */
|
|
140
168
|
[data-scope='menu'][data-part='item'] {
|
|
169
|
+
--xh-collection-block-padding: var(--xh-menu-item-py, var(--xh-_menu-item-py));
|
|
170
|
+
--xh-collection-inline-padding: var(--xh-menu-item-px, var(--xh-_menu-item-px));
|
|
171
|
+
--xh-collection-gap: 0;
|
|
172
|
+
--xh-collection-font-size: var(--xh-menu-item-font-size, var(--xh-_menu-font-size));
|
|
173
|
+
--xh-collection-radius: var(--xh-menu-item-radius, var(--xh-shape-control));
|
|
174
|
+
--xh-collection-fg-rest: var(--xh-menu-item-fg, var(--xh-material-frosted-fg));
|
|
175
|
+
--xh-collection-fg-hover: var(--xh-menu-item-fg, var(--xh-material-frosted-fg));
|
|
176
|
+
--xh-collection-fg-keyboard-highlight: var(--xh-menu-item-fg, var(--xh-material-frosted-fg));
|
|
177
|
+
--xh-collection-fg-pressed: var(--xh-menu-item-fg, var(--xh-material-frosted-fg));
|
|
178
|
+
--xh-collection-fg-open-path: var(--xh-menu-item-fg, var(--xh-material-frosted-fg));
|
|
179
|
+
--xh-collection-bg-hover: var(--xh-menu-item-bg-hover, var(--xh-bg-subtle));
|
|
180
|
+
--xh-collection-bg-keyboard-highlight: var(--xh-menu-item-bg-hover, var(--xh-bg-subtle));
|
|
181
|
+
--xh-collection-bg-pressed: var(--xh-menu-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
182
|
+
--xh-collection-bg-open-path: var(--xh-menu-item-bg-active, var(--xh-bg-subtle));
|
|
183
|
+
/* data-highlighted 同时覆盖指针与键盘路径:指针只换面,焦点环在 :focus-visible 下再接回 */
|
|
184
|
+
--xh-collection-outline-keyboard-highlight: transparent;
|
|
185
|
+
|
|
141
186
|
display: flex;
|
|
142
187
|
align-items: center;
|
|
143
188
|
gap: var(--xh-menu-item-gap, var(--xh-_menu-item-gap));
|
|
144
|
-
padding-block: var(--xh-menu-item-py, var(--xh-_menu-item-py));
|
|
145
|
-
padding-inline: var(--xh-menu-item-px, var(--xh-_menu-item-px));
|
|
146
|
-
border-radius: var(--xh-menu-item-radius, var(--xh-shape-control));
|
|
147
|
-
color: var(--xh-menu-item-fg, var(--xh-fg-default));
|
|
148
|
-
font-size: var(--xh-menu-item-font-size, var(--xh-_menu-font-size));
|
|
149
189
|
line-height: var(--xh-menu-item-leading, var(--xh-leading-normal));
|
|
150
190
|
white-space: nowrap;
|
|
151
|
-
cursor: pointer;
|
|
152
191
|
user-select: none;
|
|
153
|
-
transition:
|
|
154
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
155
|
-
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
156
192
|
}
|
|
157
193
|
|
|
158
|
-
/*
|
|
159
|
-
[data-scope='menu'][data-part='item']:
|
|
160
|
-
|
|
194
|
+
/* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
|
|
195
|
+
[data-scope='menu'][data-part='item']:focus-visible:not(:hover) {
|
|
196
|
+
--xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
|
|
197
|
+
|
|
198
|
+
transition: none;
|
|
161
199
|
}
|
|
162
200
|
|
|
163
|
-
/*
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
201
|
+
/* 条目里的文字载体:占满剩余宽度,长文本自己收省略号 */
|
|
202
|
+
[data-scope='menu'][data-part='item-text'] {
|
|
203
|
+
flex: 1;
|
|
204
|
+
min-inline-size: 0;
|
|
205
|
+
white-space: nowrap;
|
|
206
|
+
text-overflow: ellipsis;
|
|
207
|
+
overflow: hidden;
|
|
168
208
|
}
|
|
169
209
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
173
|
-
outline-offset: calc(-1 * var(--xh-ring-width));
|
|
210
|
+
[data-scope='menu'][data-part='item-text'][hidden] {
|
|
211
|
+
display: none;
|
|
174
212
|
}
|
|
175
213
|
|
|
176
|
-
|
|
177
|
-
|
|
214
|
+
/* 标记位(勾选符号 / 图标):定宽占位,切换内容不引起行宽抖动。盒是指示符(§6.5):按指示符档取尺,
|
|
215
|
+
与 Cascader / Select 的标记位同走 --xh-control-indicator-size,不读家族按档下发的 --xh-icon-size——
|
|
216
|
+
按图标档取的 20px 会比同一行 16px 的指示符档大一圈。盒在自己身上把 --xh-icon-size 改接到盒的尺,
|
|
217
|
+
作者塞进标记位的 XhIcon 与盒同尺;条目上那支只管作者直接放进条目里的图标 */
|
|
218
|
+
[data-scope='menu'][data-part='item-indicator'] {
|
|
219
|
+
--xh-icon-size: var(--xh-menu-item-indicator-size, var(--xh-control-indicator-size));
|
|
220
|
+
|
|
221
|
+
display: inline-flex;
|
|
222
|
+
flex: none;
|
|
223
|
+
align-items: center;
|
|
224
|
+
justify-content: center;
|
|
225
|
+
inline-size: var(--xh-menu-item-indicator-size, var(--xh-control-indicator-size));
|
|
226
|
+
block-size: var(--xh-menu-item-indicator-size, var(--xh-control-indicator-size));
|
|
227
|
+
color: var(--xh-menu-item-indicator-fg, var(--xh-_tone, var(--xh-fg-brand)));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
[data-scope='menu'][data-part='item-indicator'][hidden] {
|
|
231
|
+
display: none;
|
|
178
232
|
}
|
|
179
233
|
|
|
180
|
-
[data-scope='menu'][data-part='item'][data-disabled] {
|
|
234
|
+
[data-scope='menu'][data-part='item-indicator'][data-disabled] {
|
|
181
235
|
color: var(--xh-fg-disabled);
|
|
182
|
-
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/* 副文本另起一行:整行占满,把条目的一行内容折成两行 */
|
|
239
|
+
[data-scope='menu'][data-part='item-description'] {
|
|
240
|
+
flex: 1 0 100%;
|
|
241
|
+
order: 2;
|
|
242
|
+
min-inline-size: 0;
|
|
243
|
+
color: var(--xh-menu-item-description-fg, var(--xh-material-frosted-fg-muted));
|
|
244
|
+
font-size: var(--xh-menu-item-description-font-size, var(--xh-text-caption-size));
|
|
245
|
+
white-space: nowrap;
|
|
246
|
+
text-overflow: ellipsis;
|
|
247
|
+
overflow: hidden;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
[data-scope='menu'][data-part='item-description'][hidden] {
|
|
251
|
+
display: none;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
[data-scope='menu'][data-part='item-description'][data-disabled] {
|
|
255
|
+
color: var(--xh-fg-disabled);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* 作者的图标、正文和快捷键按一行排布;只有说明部件另起一行。 */
|
|
259
|
+
[data-scope='menu'][data-part='item']:has(> [data-scope='menu'][data-part='item-description']) {
|
|
260
|
+
flex-wrap: wrap;
|
|
183
261
|
}
|
|
184
262
|
|
|
185
263
|
/* 带子菜单的条目行尾画右向小箭头:不点开也看得出还有下一级。
|
|
186
|
-
|
|
264
|
+
箭头与作者内容同排,用自动外距推到行尾。箭头是指示符(§6.5):与标记位的盒同走
|
|
265
|
+
--xh-control-indicator-size,不读 --xh-icon-size——按图标档取的 20px 会比 16px 的标记位盒大一圈 */
|
|
187
266
|
[data-scope='menu'][data-part='item'][aria-haspopup='menu']::after {
|
|
188
267
|
content: '';
|
|
189
268
|
flex: none;
|
|
269
|
+
order: 1;
|
|
190
270
|
margin-inline-start: auto;
|
|
191
|
-
inline-size: var(--xh-
|
|
192
|
-
block-size: var(--xh-
|
|
193
|
-
background-color:
|
|
271
|
+
inline-size: var(--xh-menu-submenu-indicator-size, var(--xh-control-indicator-size));
|
|
272
|
+
block-size: var(--xh-menu-submenu-indicator-size, var(--xh-control-indicator-size));
|
|
273
|
+
background-color: var(--xh-menu-submenu-indicator-fg, var(--xh-material-frosted-fg-muted));
|
|
194
274
|
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
195
275
|
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
196
276
|
}
|
|
@@ -217,7 +297,7 @@
|
|
|
217
297
|
display: block;
|
|
218
298
|
padding-block: var(--xh-menu-group-label-py, var(--xh-space-1));
|
|
219
299
|
padding-inline: var(--xh-menu-group-label-px, var(--xh-_menu-item-px));
|
|
220
|
-
color: var(--xh-menu-group-label-fg, var(--xh-fg-
|
|
300
|
+
color: var(--xh-menu-group-label-fg, var(--xh-material-frosted-fg-muted));
|
|
221
301
|
font-size: var(--xh-menu-group-label-font-size, var(--xh-text-caption-size));
|
|
222
302
|
font-weight: var(--xh-menu-group-label-font-weight, var(--xh-font-weight-medium));
|
|
223
303
|
line-height: var(--xh-leading-none);
|
|
@@ -231,7 +311,8 @@
|
|
|
231
311
|
[data-scope='menu'][data-part='separator'] {
|
|
232
312
|
block-size: var(--xh-menu-separator-thickness, var(--xh-stroke-thin));
|
|
233
313
|
margin-block: var(--xh-menu-separator-my, var(--xh-space-0_5));
|
|
234
|
-
|
|
314
|
+
border-radius: var(--xh-menu-separator-radius, var(--xh-shape-pill));
|
|
315
|
+
background: var(--xh-menu-separator-color, var(--xh-material-frosted-separator));
|
|
235
316
|
}
|
|
236
317
|
|
|
237
318
|
/* 箭头的底色与描边色,几何在 overlay-arrow.css。
|
|
@@ -243,8 +324,8 @@
|
|
|
243
324
|
--xh-_overlay-arrow-x: var(--xh-_menu-arrow-x);
|
|
244
325
|
--xh-_overlay-arrow-y: var(--xh-_menu-arrow-y);
|
|
245
326
|
|
|
246
|
-
background: var(--xh-menu-bg, var(--xh-bg
|
|
247
|
-
border: var(--xh-stroke-thin) solid var(--xh-menu-border, var(--xh-border
|
|
327
|
+
background: var(--xh-menu-content-bg, var(--xh-material-frosted-bg));
|
|
328
|
+
border: var(--xh-stroke-thin) solid var(--xh-menu-border, var(--xh-material-frosted-border));
|
|
248
329
|
}
|
|
249
330
|
|
|
250
331
|
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
@@ -252,4 +333,20 @@
|
|
|
252
333
|
[data-scope='menu'][data-part='item'][hidden] {
|
|
253
334
|
display: none;
|
|
254
335
|
}
|
|
336
|
+
|
|
337
|
+
@media (forced-colors: active) {
|
|
338
|
+
/* 分组之间那条线画的是一块纯底色,这一档里底色被统一换成 Canvas,线整条消失,
|
|
339
|
+
几组条目就连成了一长串。换成前景色画回来 */
|
|
340
|
+
[data-scope='menu'][data-part='separator'] {
|
|
341
|
+
background: CanvasText;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
@media print {
|
|
346
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
347
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
348
|
+
[data-scope='menu'][data-part='positioner'] {
|
|
349
|
+
display: none;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
255
352
|
}
|