@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/menubar.css
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
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
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* 定义 menubar 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,条目走 Collection Item 家族;本皮肤 @import 它们,单独引入仍成立。 */
|
|
9
|
+
@import '../family/collection-item.css';
|
|
10
|
+
@import '../family/motion.css';
|
|
11
|
+
|
|
1
12
|
@layer xihan.components {
|
|
2
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
14
|
[data-scope='menubar'] {
|
|
@@ -6,23 +17,17 @@
|
|
|
6
17
|
|
|
7
18
|
/* 一排 trigger。主轴跟着 data-orientation 走:菜单栏本身可以横排也可以竖排 */
|
|
8
19
|
[data-scope='menubar'][data-part='root'] {
|
|
9
|
-
/*
|
|
10
|
-
|
|
11
|
-
|
|
20
|
+
/* 一行排不下就折行:菜单名宽度由文字决定,硬撑一行会把整条顶出容器,
|
|
21
|
+
末尾几个菜单既看不见也点不到 */
|
|
12
22
|
display: flex;
|
|
23
|
+
flex-wrap: wrap;
|
|
13
24
|
align-items: center;
|
|
14
|
-
gap: var(--xh-menubar-
|
|
15
|
-
padding-block: var(--xh-menubar-
|
|
16
|
-
padding-inline: var(--xh-menubar-
|
|
17
|
-
border-radius: var(--xh-menubar-
|
|
18
|
-
background: var(--xh-menubar-
|
|
19
|
-
color: var(--xh-menubar-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/* 浮层被搬到 portal 落点,继承不到 root 上的槽:这把尺在被搬走的那一侧再声明一次,
|
|
23
|
-
关闭钮与条目里作者塞的图标才和皮肤画的兜底字形一样大 */
|
|
24
|
-
[data-scope='menubar'][data-part='content'] {
|
|
25
|
-
--xh-icon-size: var(--xh-menubar-icon-size, var(--xh-glyph-size-text));
|
|
25
|
+
gap: var(--xh-menubar-gap, var(--xh-space-1));
|
|
26
|
+
padding-block: var(--xh-menubar-py, var(--xh-space-1));
|
|
27
|
+
padding-inline: var(--xh-menubar-px, var(--xh-space-1));
|
|
28
|
+
border-radius: var(--xh-menubar-radius, var(--xh-shape-control));
|
|
29
|
+
background: var(--xh-menubar-bg, transparent);
|
|
30
|
+
color: var(--xh-menubar-fg, var(--xh-fg-default));
|
|
26
31
|
}
|
|
27
32
|
|
|
28
33
|
[data-scope='menubar'][data-part='root'][hidden] {
|
|
@@ -32,6 +37,7 @@
|
|
|
32
37
|
[data-scope='menubar'][data-part='root'][data-orientation='vertical'] {
|
|
33
38
|
flex-direction: column;
|
|
34
39
|
align-items: stretch;
|
|
40
|
+
flex-wrap: nowrap;
|
|
35
41
|
}
|
|
36
42
|
|
|
37
43
|
/* root 只是 roving tabindex 的兜底落点,焦点转投给 trigger 之后就不再停留,不画环 */
|
|
@@ -43,63 +49,56 @@
|
|
|
43
49
|
color: var(--xh-fg-disabled);
|
|
44
50
|
}
|
|
45
51
|
|
|
52
|
+
/* 入口归 Collection Item 展开路径 / 打开中(nav 语境):几何、字号与面全经家族桥接槽。静息字色取 default
|
|
53
|
+
(菜单名不是次要文字,不取 nav 缺省的 muted),悬停走白底承载 hover 100,展开着的那一张由连接层投影
|
|
54
|
+
data-in-path,家族给与悬停同档的中性面——打开中不是选中,不用品牌色、不接语气、不加粗(§7.3);
|
|
55
|
+
按下 pressed 200 只换面不缩放(§9.2);禁用走 aria-disabled,家族给禁用字色与 not-allowed。
|
|
56
|
+
本条 (0,2,0) 压过家族基础块 (0,1,0),不能再写 background / color / cursor */
|
|
46
57
|
[data-scope='menubar'][data-part='trigger'] {
|
|
58
|
+
--xh-collection-block-padding: var(--xh-menubar-trigger-py, var(--xh-_menubar-trigger-py));
|
|
59
|
+
--xh-collection-inline-padding: var(--xh-menubar-trigger-px, var(--xh-_menubar-trigger-px));
|
|
60
|
+
--xh-collection-radius: var(--xh-menubar-trigger-radius, var(--xh-shape-control));
|
|
61
|
+
--xh-collection-font-size: var(--xh-menubar-trigger-font-size, var(--xh-_menubar-font-size));
|
|
62
|
+
--xh-collection-fg-rest: var(--xh-menubar-trigger-fg, var(--xh-fg-default));
|
|
63
|
+
--xh-collection-bg-hover: var(--xh-menubar-trigger-bg-hover, var(--xh-bg-subtle));
|
|
64
|
+
--xh-collection-bg-open-path: var(--xh-menubar-trigger-bg-active, var(--xh-bg-subtle));
|
|
65
|
+
--xh-collection-bg-pressed: var(--xh-menubar-trigger-bg-pressed, var(--xh-bg-subtle-hover));
|
|
66
|
+
|
|
47
67
|
display: inline-flex;
|
|
48
68
|
flex: none;
|
|
49
69
|
align-items: center;
|
|
50
70
|
gap: var(--xh-menubar-trigger-gap, var(--xh-control-gap-sm));
|
|
51
|
-
padding-block: var(--xh-menubar-trigger-py, var(--xh-_menubar-trigger-py));
|
|
52
|
-
padding-inline: var(--xh-menubar-trigger-px, var(--xh-_menubar-trigger-px));
|
|
53
71
|
border: none;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
color: inherit;
|
|
57
|
-
font: inherit;
|
|
58
|
-
font-size: var(--xh-menubar-trigger-font-size, var(--xh-_menubar-font-size));
|
|
72
|
+
/* 不再写 font: inherit:按钮的 UA 字体由 reset.css 抹平,这里再写一遍会把家族给的字号与字重一并盖掉。
|
|
73
|
+
行高压回 none:家族基础块给条目写了 leading-normal,入口的高度只由内缩定 */
|
|
59
74
|
line-height: var(--xh-leading-none);
|
|
60
75
|
white-space: nowrap;
|
|
61
|
-
cursor: pointer;
|
|
62
76
|
user-select: none;
|
|
63
|
-
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
64
77
|
}
|
|
65
78
|
|
|
66
79
|
[data-scope='menubar'][data-part='trigger'][hidden] {
|
|
67
80
|
display: none;
|
|
68
81
|
}
|
|
69
82
|
|
|
70
|
-
/* 指针悬停走中性灰轻档 */
|
|
71
|
-
[data-scope='menubar'][data-part='trigger']:not([data-disabled]):hover {
|
|
72
|
-
background: var(--xh-menubar-trigger-bg-hover, var(--xh-bg-subtle));
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/* 展开着的那一张是打开路径,走品牌淡底强档:菜单栏里"哪一张开着"必须一眼看得出来。
|
|
76
|
-
不加粗:横排的栏加粗会推挤相邻触发器。
|
|
77
|
-
必须排在轻档之后:指针回到它身上时同特指度靠书写顺序压过轻档 */
|
|
78
|
-
[data-scope='menubar'][data-part='trigger']:not([data-disabled])[data-state='open'] {
|
|
79
|
-
background: var(--xh-menubar-trigger-bg-active, var(--xh-_menubar-active-bg));
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/* trigger 自带 Tab 位(整条菜单栏唯一的那个),必须画得出焦点 */
|
|
83
|
-
[data-scope='menubar'][data-part='trigger']:focus-visible {
|
|
84
|
-
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
85
|
-
outline-offset: var(--xh-ring-offset);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/* 禁用走 aria-disabled 而非原生 disabled:trigger 仍要可聚焦(它还得当方向键的起点),
|
|
89
|
-
所以只能靠 data-disabled 表达,写 :disabled 永远不命中 */
|
|
90
|
-
[data-scope='menubar'][data-part='trigger'][data-disabled] {
|
|
91
|
-
color: var(--xh-fg-disabled);
|
|
92
|
-
cursor: not-allowed;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
83
|
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
96
84
|
[data-scope='menubar'][data-part='positioner'] {
|
|
97
85
|
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,content 继承它限高;
|
|
98
86
|
引擎没算(尚未落位 / 无引擎)时不额外限高 */
|
|
99
87
|
--xh-_menubar-available-h: 100vh;
|
|
88
|
+
/* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,行内轴据此夹取;
|
|
89
|
+
引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
|
|
90
|
+
--xh-_menubar-available-w: 100vw;
|
|
91
|
+
/* WC 子菜单仍可能住在父 positioner 内;先截断父层方向,避免斜向继承。 */
|
|
92
|
+
--xh-_overlay-enter-up: 0;
|
|
93
|
+
--xh-_overlay-enter-down: 0;
|
|
94
|
+
--xh-_overlay-enter-left: 0;
|
|
95
|
+
--xh-_overlay-enter-right: 0;
|
|
96
|
+
|
|
97
|
+
/* 条目列表的自绘条浮在内容之上:轨道不上底色,实色轨道会在菜单右缘糊一条竖灰带 */
|
|
98
|
+
--xh-scrollbar-track-bg: transparent;
|
|
100
99
|
|
|
101
100
|
position: fixed;
|
|
102
|
-
z-index: var(--xh-menubar-layer, var(--xh-layer-popover));
|
|
101
|
+
z-index: var(--xh-menubar-layer, var(--xh-_layer, var(--xh-layer-popover)));
|
|
103
102
|
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
104
103
|
pointer-events: none;
|
|
105
104
|
}
|
|
@@ -109,29 +108,45 @@
|
|
|
109
108
|
visibility: hidden;
|
|
110
109
|
}
|
|
111
110
|
|
|
111
|
+
/* 物理 placement 与定位引擎同口径,不随书写方向翻转。 */
|
|
112
|
+
[data-scope='menubar'][data-part='positioner'][data-placement^='top'] {
|
|
113
|
+
--xh-_overlay-enter-down: 1;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
[data-scope='menubar'][data-part='positioner'][data-placement^='bottom'] {
|
|
117
|
+
--xh-_overlay-enter-up: 1;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
[data-scope='menubar'][data-part='positioner'][data-placement^='left'] {
|
|
121
|
+
--xh-_overlay-enter-right: 1;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
[data-scope='menubar'][data-part='positioner'][data-placement^='right'] {
|
|
125
|
+
--xh-_overlay-enter-left: 1;
|
|
126
|
+
}
|
|
127
|
+
|
|
112
128
|
/* —— 尺寸 —— */
|
|
113
129
|
/* 尺寸档只换这六个私有槽,换档不必给每个部件各写一条选择器。
|
|
114
130
|
root 与 positioner 各起一头:trigger 从 root 继承,菜单里的条目从 positioner 继承——
|
|
115
131
|
浮层搬去了 portal 落点,不再是 root 的后代。
|
|
116
132
|
缺省档写在第一条:trigger 与条目的行内内缩都走 control-px 档(随密度轴)、纵向走 space 档,换档各挪一级 */
|
|
117
133
|
[data-scope='menubar']:is([data-part='root'], [data-part='positioner']) {
|
|
134
|
+
/* 条目外的字形(分组标题、入口)按档取尺,缺省 md,随 data-size 换档;同样声明在 positioner 上,被搬走的
|
|
135
|
+
浮层才拿得到;条目里作者放的图标由家族随 data-xh-collection-size 下发(§6.5)。菜单栏自绘的状态字形(标记位的盒、
|
|
136
|
+
盒里兜底的勾、子菜单的展开 chevron)不读这支:它们是指示符,走 --xh-control-indicator-* 一族——标记位在
|
|
137
|
+
自己身上把 --xh-icon-size 改接到盒的尺,子菜单箭头走 --xh-menubar-submenu-indicator-size */
|
|
138
|
+
--xh-icon-size: var(--xh-menubar-icon-size, var(--xh-glyph-size-md));
|
|
139
|
+
|
|
118
140
|
--xh-_menubar-trigger-py: var(--xh-space-1);
|
|
119
141
|
--xh-_menubar-trigger-px: var(--xh-control-px-md);
|
|
120
142
|
--xh-_menubar-item-py: var(--xh-list-option-py-md);
|
|
121
143
|
--xh-_menubar-item-px: var(--xh-control-px-md);
|
|
122
144
|
--xh-_menubar-item-gap: var(--xh-control-gap-md);
|
|
123
145
|
--xh-_menubar-font-size: var(--xh-control-font-md);
|
|
124
|
-
|
|
125
|
-
/* 展开着的那张菜单的 trigger 走品牌淡底强档,随语气换色相;没写 data-tone 时退回品牌淡底。
|
|
126
|
-
悬停与键盘焦点恒中性灰轻档、不接语气槽——两档同色相的话哪张开着就认不出来了。
|
|
127
|
-
聚焦环不在其列,它恒是 --xh-ring-focus */
|
|
128
|
-
--xh-_menubar-active-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
|
|
129
|
-
|
|
130
|
-
/* 打开子菜单的触发条目走品牌淡底强档,随语气换色相;没写 data-tone 时退回品牌淡底 */
|
|
131
|
-
--xh-_menubar-item-active-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
|
|
132
146
|
}
|
|
133
147
|
|
|
134
148
|
[data-scope='menubar'][data-size='sm']:is([data-part='root'], [data-part='positioner']) {
|
|
149
|
+
--xh-icon-size: var(--xh-menubar-icon-size, var(--xh-glyph-size-sm));
|
|
135
150
|
--xh-_menubar-trigger-py: var(--xh-space-0_5);
|
|
136
151
|
--xh-_menubar-trigger-px: var(--xh-control-px-sm);
|
|
137
152
|
--xh-_menubar-item-py: var(--xh-list-option-py-sm);
|
|
@@ -141,6 +156,7 @@
|
|
|
141
156
|
}
|
|
142
157
|
|
|
143
158
|
[data-scope='menubar'][data-size='lg']:is([data-part='root'], [data-part='positioner']) {
|
|
159
|
+
--xh-icon-size: var(--xh-menubar-icon-size, var(--xh-glyph-size-lg));
|
|
144
160
|
--xh-_menubar-trigger-py: var(--xh-space-2);
|
|
145
161
|
--xh-_menubar-trigger-px: var(--xh-control-px-lg);
|
|
146
162
|
--xh-_menubar-item-py: var(--xh-list-option-py-lg);
|
|
@@ -150,26 +166,44 @@
|
|
|
150
166
|
}
|
|
151
167
|
|
|
152
168
|
[data-scope='menubar'][data-part='content'] {
|
|
169
|
+
position: relative;
|
|
153
170
|
display: flex;
|
|
154
171
|
flex-direction: column;
|
|
155
172
|
gap: var(--xh-menubar-content-gap, var(--xh-list-option-gap));
|
|
156
173
|
min-inline-size: var(--xh-menubar-min-w, var(--xh-overlay-menu-min-w));
|
|
157
|
-
|
|
174
|
+
/* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的内容就点不到了 */
|
|
175
|
+
max-inline-size: min(var(--xh-menubar-max-w, var(--xh-overlay-max-w)), var(--xh-_menubar-available-w));
|
|
158
176
|
/* 两道上限取更小的那道:自己的高度上限,以及落定那一侧真正剩下的空间。
|
|
159
177
|
列表族的 16rem 对命令菜单偏矮,这里另给一档 */
|
|
160
178
|
max-block-size: min(var(--xh-menubar-max-h, var(--xh-overlay-menu-max-h)), var(--xh-_menubar-available-h));
|
|
161
|
-
padding-block: var(--xh-menubar-py, var(--xh-
|
|
162
|
-
padding-inline: var(--xh-menubar-px, var(--xh-
|
|
163
|
-
border: var(--xh-stroke-thin) solid var(--xh-menubar-border, var(--xh-border
|
|
164
|
-
border-radius: var(--xh-menubar-radius, var(--xh-shape-
|
|
165
|
-
background: var(--xh-menubar-bg, var(--xh-bg
|
|
166
|
-
color: var(--xh-menubar-fg, var(--xh-fg
|
|
167
|
-
box-shadow: var(--xh-menubar-shadow, var(--xh-
|
|
168
|
-
|
|
179
|
+
padding-block: var(--xh-menubar-content-py, var(--xh-surface-pad-xs));
|
|
180
|
+
padding-inline: var(--xh-menubar-content-px, var(--xh-surface-pad-xs));
|
|
181
|
+
border: var(--xh-stroke-thin) solid var(--xh-menubar-border, var(--xh-material-frosted-border));
|
|
182
|
+
border-radius: var(--xh-menubar-content-radius, var(--xh-shape-overlay));
|
|
183
|
+
background: var(--xh-menubar-content-bg, var(--xh-material-frosted-bg));
|
|
184
|
+
color: var(--xh-menubar-content-fg, var(--xh-material-frosted-fg));
|
|
185
|
+
box-shadow: var(--xh-menubar-content-shadow, var(--xh-material-frosted-shadow));
|
|
186
|
+
-webkit-backdrop-filter: var(--xh-menubar-backdrop, var(--xh-material-frosted-backdrop));
|
|
187
|
+
backdrop-filter: var(--xh-menubar-backdrop, var(--xh-material-frosted-backdrop));
|
|
188
|
+
/* 条目超过上限就在菜单内部滚。条目的焦点环是内收的,滚动容器裁在内边距缘上,环切不着。
|
|
189
|
+
浮层滚动面:到底后不把滚动链穿透给页面(§6.6) */
|
|
169
190
|
overflow-y: auto;
|
|
191
|
+
overscroll-behavior: contain;
|
|
170
192
|
pointer-events: auto;
|
|
171
193
|
}
|
|
172
194
|
|
|
195
|
+
/* 顶光叠在真实四边 border 内侧;强制色撤掉装饰后,完整轮廓仍然存在。 */
|
|
196
|
+
[data-scope='menubar'][data-part='content']::before {
|
|
197
|
+
content: '';
|
|
198
|
+
position: absolute;
|
|
199
|
+
inset-block-start: 0;
|
|
200
|
+
inset-inline: 0;
|
|
201
|
+
block-size: var(--xh-stroke-thin);
|
|
202
|
+
border-radius: inherit;
|
|
203
|
+
background: var(--xh-menubar-highlight, var(--xh-material-frosted-highlight));
|
|
204
|
+
pointer-events: none;
|
|
205
|
+
}
|
|
206
|
+
|
|
173
207
|
/* display 会盖掉 hidden 属性的 UA 规则,收起态显式让位。
|
|
174
208
|
连接层给 content 发 hidden,这一条漏了整张菜单就永远收不起来 */
|
|
175
209
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
@@ -181,19 +215,20 @@
|
|
|
181
215
|
outline: none;
|
|
182
216
|
}
|
|
183
217
|
|
|
184
|
-
/*
|
|
185
|
-
一张关一张开,动画各跑各的 */
|
|
218
|
+
/* 首开从锚点一侧淡入短移,不缩放整张菜单面。 */
|
|
186
219
|
[data-scope='menubar'][data-part='content'][data-state='open'] {
|
|
187
|
-
|
|
220
|
+
/* 在场那一档才提前备好合成层:属性随 data-state 一起消失,收起后不长期占着 */
|
|
221
|
+
will-change: opacity, translate;
|
|
222
|
+
animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
188
223
|
}
|
|
189
224
|
|
|
190
|
-
/*
|
|
225
|
+
/* 末收向锚点一侧淡出;forwards 防止动画完成到真正隐藏之间闪回原样。 */
|
|
191
226
|
[data-scope='menubar'][data-part='content'][data-state='closed'] {
|
|
192
|
-
|
|
227
|
+
will-change: opacity, translate;
|
|
228
|
+
animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
193
229
|
}
|
|
194
230
|
|
|
195
|
-
/*
|
|
196
|
-
起跳,打断未播完的进场还会亮一下。原生菜单栏的成规——首开有进场、末收有退场、
|
|
231
|
+
/* 在一排入口间换张时两侧都瞬时:交叉淡变读起来就是闪烁。原生菜单栏的成规——首开有进场、末收有退场、
|
|
197
232
|
换张不播。没有动画时退场闸门当场落定,收起即藏 */
|
|
198
233
|
[data-scope='menubar'][data-part='content'][data-instant] {
|
|
199
234
|
animation: none;
|
|
@@ -215,7 +250,7 @@
|
|
|
215
250
|
display: block;
|
|
216
251
|
padding-block: var(--xh-menubar-group-label-py, var(--xh-space-1));
|
|
217
252
|
padding-inline: var(--xh-menubar-group-label-px, var(--xh-_menubar-item-px));
|
|
218
|
-
color: var(--xh-menubar-group-label-fg, var(--xh-fg-
|
|
253
|
+
color: var(--xh-menubar-group-label-fg, var(--xh-material-frosted-fg-muted));
|
|
219
254
|
font-size: var(--xh-menubar-group-label-font-size, var(--xh-text-caption-size));
|
|
220
255
|
font-weight: var(--xh-menubar-group-label-font-weight, var(--xh-font-weight-medium));
|
|
221
256
|
line-height: var(--xh-leading-none);
|
|
@@ -226,22 +261,34 @@
|
|
|
226
261
|
display: none;
|
|
227
262
|
}
|
|
228
263
|
|
|
264
|
+
/* 条目走 Collection Item 的 overlay 语境:悬停 / 键盘锚点(data-highlighted,白底承载 100)、按下(200)、
|
|
265
|
+
子层开着的打开路径(data-in-path,与 hover 同档)与禁用面(aria-disabled)都由家族给,这里只把公开槽映射到
|
|
266
|
+
桥接槽。布局保持 flex 而不用家族网格:图标、正文、快捷键按一行排布,说明另起一行靠 flex-wrap 折下去,
|
|
267
|
+
子菜单箭头是行尾的伪元素;间距统一由行的 gap 给,家族按槽下发的外边距归零 */
|
|
229
268
|
[data-scope='menubar'][data-part='item'] {
|
|
269
|
+
--xh-collection-block-padding: var(--xh-menubar-item-py, var(--xh-_menubar-item-py));
|
|
270
|
+
--xh-collection-inline-padding: var(--xh-menubar-item-px, var(--xh-_menubar-item-px));
|
|
271
|
+
--xh-collection-gap: 0;
|
|
272
|
+
--xh-collection-font-size: var(--xh-menubar-item-font-size, var(--xh-_menubar-font-size));
|
|
273
|
+
--xh-collection-radius: var(--xh-menubar-item-radius, var(--xh-shape-control));
|
|
274
|
+
--xh-collection-fg-rest: var(--xh-menubar-item-fg, var(--xh-material-frosted-fg));
|
|
275
|
+
--xh-collection-fg-hover: var(--xh-menubar-item-fg, var(--xh-material-frosted-fg));
|
|
276
|
+
--xh-collection-fg-keyboard-highlight: var(--xh-menubar-item-fg, var(--xh-material-frosted-fg));
|
|
277
|
+
--xh-collection-fg-pressed: var(--xh-menubar-item-fg, var(--xh-material-frosted-fg));
|
|
278
|
+
--xh-collection-fg-open-path: var(--xh-menubar-item-fg, var(--xh-material-frosted-fg));
|
|
279
|
+
--xh-collection-bg-hover: var(--xh-menubar-item-bg-hover, var(--xh-bg-subtle));
|
|
280
|
+
--xh-collection-bg-keyboard-highlight: var(--xh-menubar-item-bg-hover, var(--xh-bg-subtle));
|
|
281
|
+
--xh-collection-bg-pressed: var(--xh-menubar-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
282
|
+
--xh-collection-bg-open-path: var(--xh-menubar-item-bg-active, var(--xh-bg-subtle));
|
|
283
|
+
/* data-highlighted 同时覆盖指针与键盘路径:指针只换面,焦点环在 :focus-visible 下再接回 */
|
|
284
|
+
--xh-collection-outline-keyboard-highlight: transparent;
|
|
285
|
+
|
|
230
286
|
display: flex;
|
|
231
287
|
align-items: center;
|
|
232
288
|
gap: var(--xh-menubar-item-gap, var(--xh-_menubar-item-gap));
|
|
233
|
-
padding-block: var(--xh-menubar-item-py, var(--xh-_menubar-item-py));
|
|
234
|
-
padding-inline: var(--xh-menubar-item-px, var(--xh-_menubar-item-px));
|
|
235
|
-
border-radius: var(--xh-menubar-item-radius, var(--xh-shape-control));
|
|
236
|
-
color: var(--xh-menubar-item-fg, var(--xh-fg-default));
|
|
237
|
-
font-size: var(--xh-menubar-item-font-size, var(--xh-_menubar-font-size));
|
|
238
289
|
line-height: var(--xh-menubar-item-leading, var(--xh-leading-normal));
|
|
239
290
|
white-space: nowrap;
|
|
240
|
-
cursor: pointer;
|
|
241
291
|
user-select: none;
|
|
242
|
-
transition:
|
|
243
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
244
|
-
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
245
292
|
}
|
|
246
293
|
|
|
247
294
|
/* 条目可以按需收起(按上下文过滤掉的命令),有 display 就得补这条 */
|
|
@@ -249,27 +296,25 @@
|
|
|
249
296
|
display: none;
|
|
250
297
|
}
|
|
251
298
|
|
|
252
|
-
/*
|
|
253
|
-
[data-scope='menubar'][data-part='item']:
|
|
254
|
-
|
|
255
|
-
}
|
|
299
|
+
/* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
|
|
300
|
+
[data-scope='menubar'][data-part='item']:focus-visible:not(:hover) {
|
|
301
|
+
--xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
|
|
256
302
|
|
|
257
|
-
|
|
258
|
-
必须排在轻档之后:悬停或焦点回到它身上时同特指度靠书写顺序压过轻档 */
|
|
259
|
-
[data-scope='menubar'][data-part='item']:not([data-disabled])[data-state='open'] {
|
|
260
|
-
background: var(--xh-menubar-item-bg-active, var(--xh-_menubar-item-active-bg));
|
|
261
|
-
font-weight: var(--xh-menubar-item-active-font-weight, var(--xh-font-weight-semibold));
|
|
303
|
+
transition: none;
|
|
262
304
|
}
|
|
263
305
|
|
|
264
306
|
/* 带子菜单的条目行尾画右向小箭头:不点开也看得出还有下一级。
|
|
265
|
-
|
|
307
|
+
description 按 order 独占下一行,箭头仍留在主行末端。
|
|
308
|
+
箭头是指示符(§6.5):与标记位的盒同走 --xh-control-indicator-size,不读 --xh-icon-size——
|
|
309
|
+
按图标档取的 20px 会比 16px 的标记位盒大一圈 */
|
|
266
310
|
[data-scope='menubar'][data-part='item'][aria-haspopup='menu']::after {
|
|
267
311
|
content: '';
|
|
268
312
|
flex: none;
|
|
313
|
+
order: 1;
|
|
269
314
|
margin-inline-start: auto;
|
|
270
|
-
inline-size: var(--xh-
|
|
271
|
-
block-size: var(--xh-
|
|
272
|
-
background-color:
|
|
315
|
+
inline-size: var(--xh-menubar-submenu-indicator-size, var(--xh-control-indicator-size));
|
|
316
|
+
block-size: var(--xh-menubar-submenu-indicator-size, var(--xh-control-indicator-size));
|
|
317
|
+
background-color: var(--xh-menubar-submenu-indicator-fg, var(--xh-material-frosted-fg-muted));
|
|
273
318
|
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
274
319
|
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
275
320
|
}
|
|
@@ -280,24 +325,9 @@
|
|
|
280
325
|
mask-image: var(--xh-glyph-mark-chevron-left);
|
|
281
326
|
}
|
|
282
327
|
|
|
283
|
-
/* 键盘落焦的条目画内收环;指针触发的聚焦不画 */
|
|
284
|
-
[data-scope='menubar'][data-part='item']:focus-visible {
|
|
285
|
-
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
286
|
-
outline-offset: calc(-1 * var(--xh-ring-width));
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
[data-scope='menubar'][data-part='item']:focus:not(:focus-visible) {
|
|
290
|
-
outline: none;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
[data-scope='menubar'][data-part='item'][data-disabled] {
|
|
294
|
-
color: var(--xh-fg-disabled);
|
|
295
|
-
cursor: not-allowed;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
328
|
[data-scope='menubar'][data-part='item-text'] {
|
|
299
|
-
display: block;
|
|
300
329
|
flex: 1;
|
|
330
|
+
min-inline-size: 0;
|
|
301
331
|
overflow: hidden;
|
|
302
332
|
white-space: nowrap;
|
|
303
333
|
text-overflow: ellipsis;
|
|
@@ -307,13 +337,20 @@
|
|
|
307
337
|
display: none;
|
|
308
338
|
}
|
|
309
339
|
|
|
310
|
-
/* 标记位(勾选符号 /
|
|
340
|
+
/* 标记位(勾选符号 / 图标)按作者写入的位置留在主行,不为没写的条目强制占列。盒是指示符(§6.5):按指示符档
|
|
341
|
+
取尺,与 Menu / ContextMenu 的标记位同走 --xh-control-indicator-size,不读家族按档下发的 --xh-icon-size——
|
|
342
|
+
按图标档取的 20px 会比同一行 16px 的指示符档大一圈。盒在自己身上把 --xh-icon-size 改接到盒的尺,
|
|
343
|
+
皮肤画的兜底勾与作者塞进标记位的 XhIcon 读同一把尺、与盒同边长(行尾标记不是勾选格,不取 × 0.75);
|
|
344
|
+
条目上那支只管作者直接放进条目里的图标 */
|
|
311
345
|
[data-scope='menubar'][data-part='item-indicator'] {
|
|
346
|
+
--xh-icon-size: var(--xh-menubar-item-indicator-size, var(--xh-control-indicator-size));
|
|
347
|
+
|
|
312
348
|
display: inline-flex;
|
|
313
349
|
flex: none;
|
|
314
350
|
align-items: center;
|
|
315
351
|
justify-content: center;
|
|
316
352
|
inline-size: var(--xh-menubar-item-indicator-size, var(--xh-control-indicator-size));
|
|
353
|
+
block-size: var(--xh-menubar-item-indicator-size, var(--xh-control-indicator-size));
|
|
317
354
|
color: var(--xh-menubar-item-indicator-fg, var(--xh-_tone, var(--xh-fg-brand)));
|
|
318
355
|
}
|
|
319
356
|
|
|
@@ -325,15 +362,55 @@
|
|
|
325
362
|
color: var(--xh-fg-disabled);
|
|
326
363
|
}
|
|
327
364
|
|
|
365
|
+
/* 副文本另起一行:整行占满,把条目的一行内容折成两行 */
|
|
366
|
+
[data-scope='menubar'][data-part='item-description'] {
|
|
367
|
+
flex: 1 0 100%;
|
|
368
|
+
order: 2;
|
|
369
|
+
min-inline-size: 0;
|
|
370
|
+
color: var(--xh-menubar-item-description-fg, var(--xh-material-frosted-fg-muted));
|
|
371
|
+
font-size: var(--xh-menubar-item-description-font-size, var(--xh-text-caption-size));
|
|
372
|
+
white-space: nowrap;
|
|
373
|
+
text-overflow: ellipsis;
|
|
374
|
+
overflow: hidden;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
[data-scope='menubar'][data-part='item-description'][hidden] {
|
|
378
|
+
display: none;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
[data-scope='menubar'][data-part='item-description'][data-disabled] {
|
|
382
|
+
color: var(--xh-fg-disabled);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/* 没有说明时主行不允许无意换行;有说明才开启第二行。任意图标/快捷键仍保留作者的 DOM 顺序。 */
|
|
386
|
+
[data-scope='menubar'][data-part='item']:has(> [data-scope='menubar'][data-part='item-description']) {
|
|
387
|
+
flex-wrap: wrap;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/* 箭头的底色与描边色,几何在 overlay-arrow.css。
|
|
391
|
+
交叉轴落点由定位引擎经内联自定义属性写进来,没给时退回居中 */
|
|
392
|
+
[data-scope='menubar'][data-part='arrow'] {
|
|
393
|
+
--xh-_menubar-arrow-x: 50%;
|
|
394
|
+
--xh-_menubar-arrow-y: 50%;
|
|
395
|
+
--xh-_overlay-arrow-size: var(--xh-menubar-arrow-size, var(--xh-overlay-arrow-size));
|
|
396
|
+
--xh-_overlay-arrow-x: var(--xh-_menubar-arrow-x);
|
|
397
|
+
--xh-_overlay-arrow-y: var(--xh-_menubar-arrow-y);
|
|
398
|
+
|
|
399
|
+
background: var(--xh-menubar-content-bg, var(--xh-material-frosted-bg));
|
|
400
|
+
border: var(--xh-stroke-thin) solid var(--xh-menubar-border, var(--xh-material-frosted-border));
|
|
401
|
+
}
|
|
402
|
+
|
|
328
403
|
/* 分隔线横跨菜单,与菜单栏自身的 orientation 无关:菜单永远是一列条目。
|
|
329
404
|
不给 display,因此 UA 的 [hidden]{display:none} 自己就压得住 */
|
|
330
405
|
[data-scope='menubar'][data-part='separator'] {
|
|
331
406
|
block-size: var(--xh-menubar-separator-thickness, var(--xh-stroke-thin));
|
|
332
407
|
margin-block: var(--xh-menubar-separator-my, var(--xh-space-0_5));
|
|
333
|
-
|
|
408
|
+
border-radius: var(--xh-menubar-separator-radius, var(--xh-shape-pill));
|
|
409
|
+
background: var(--xh-menubar-separator-color, var(--xh-material-frosted-separator));
|
|
334
410
|
}
|
|
335
411
|
|
|
336
|
-
/*
|
|
412
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中。
|
|
413
|
+
尺寸读标记位自己改接过的 --xh-icon-size:与盒同边长,随指示符档换档(见上面标记位那块) */
|
|
337
414
|
[data-scope='menubar'][data-part='item-indicator']:empty::before {
|
|
338
415
|
content: '';
|
|
339
416
|
display: inline-block;
|
|
@@ -346,29 +423,20 @@
|
|
|
346
423
|
}
|
|
347
424
|
}
|
|
348
425
|
|
|
349
|
-
@layer xihan.
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
to {
|
|
358
|
-
opacity: 1;
|
|
359
|
-
scale: 1;
|
|
426
|
+
@layer xihan.components {
|
|
427
|
+
@media print {
|
|
428
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
429
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
430
|
+
[data-scope='menubar'][data-part='positioner'] {
|
|
431
|
+
display: none;
|
|
360
432
|
}
|
|
361
433
|
}
|
|
362
434
|
|
|
363
|
-
@
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
to {
|
|
370
|
-
opacity: 0;
|
|
371
|
-
scale: var(--xh-motion-scale-enter);
|
|
435
|
+
@media (forced-colors: active) {
|
|
436
|
+
/* 分组之间那条线画的是一块纯底色,这一档里底色被统一换成 Canvas,线整条消失,
|
|
437
|
+
几组条目就连成了一长串。换成前景色画回来 */
|
|
438
|
+
[data-scope='menubar'][data-part='separator'] {
|
|
439
|
+
background: CanvasText;
|
|
372
440
|
}
|
|
373
441
|
}
|
|
374
442
|
}
|