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