@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/command.css
ADDED
|
@@ -0,0 +1,399 @@
|
|
|
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
|
+
/* 定义 command 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,命令走 Collection Item 家族;本皮肤 @import 它们,单独引入仍成立。 */
|
|
9
|
+
@import '../family/collection-item.css';
|
|
10
|
+
@import '../family/motion.css';
|
|
11
|
+
|
|
12
|
+
@layer xihan.components {
|
|
13
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
14
|
+
[data-scope='command'] {
|
|
15
|
+
--xh-command-skin: 1;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* 私有槽同时声明在定位层与面板上:面板被搬到 portal 落点,两处各自带一份 data-size,
|
|
19
|
+
谁先命中谁给出这一档的取值;条目、检索框与提示条都从面板继承下去 */
|
|
20
|
+
[data-scope='command']:is([data-part='positioner'], [data-part='content']) {
|
|
21
|
+
/* 条目外的字形(分组标题、底部提示条)按档取尺,缺省 md,随 data-size 换档;命令里的图标由家族随
|
|
22
|
+
data-xh-collection-size 下发(§6.5) */
|
|
23
|
+
--xh-icon-size: var(--xh-command-icon-size, var(--xh-glyph-size-md));
|
|
24
|
+
|
|
25
|
+
/* 尺寸档只换这六个私有槽,换档不必给每个部件各写一条选择器 */
|
|
26
|
+
--xh-_command-max-w: var(--xh-overlay-sheet-w-md);
|
|
27
|
+
--xh-_command-input-h: var(--xh-control-h-md);
|
|
28
|
+
--xh-_command-px: var(--xh-control-px-md);
|
|
29
|
+
--xh-_command-item-py: var(--xh-list-option-py-md);
|
|
30
|
+
--xh-_command-gap: var(--xh-control-gap-md);
|
|
31
|
+
--xh-_command-font-size: var(--xh-control-font-md);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* 面板从上方落下来一小段:方向槽写在定位层上,面板继承过去喂给进场那支动画 */
|
|
35
|
+
[data-scope='command'][data-part='positioner'] {
|
|
36
|
+
--xh-_overlay-enter-down: 1;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* —— 尺寸 —— */
|
|
40
|
+
/* 缺省档写在上面的基础规则里 */
|
|
41
|
+
[data-scope='command']:is([data-part='positioner'], [data-part='content'])[data-size='sm'] {
|
|
42
|
+
--xh-icon-size: var(--xh-command-icon-size, var(--xh-glyph-size-sm));
|
|
43
|
+
--xh-_command-max-w: var(--xh-overlay-sheet-w-sm);
|
|
44
|
+
--xh-_command-input-h: var(--xh-control-h-sm);
|
|
45
|
+
--xh-_command-px: var(--xh-control-px-sm);
|
|
46
|
+
--xh-_command-item-py: var(--xh-list-option-py-sm);
|
|
47
|
+
--xh-_command-gap: var(--xh-control-gap-sm);
|
|
48
|
+
--xh-_command-font-size: var(--xh-control-font-sm);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
[data-scope='command']:is([data-part='positioner'], [data-part='content'])[data-size='lg'] {
|
|
52
|
+
--xh-icon-size: var(--xh-command-icon-size, var(--xh-glyph-size-lg));
|
|
53
|
+
--xh-_command-max-w: var(--xh-overlay-sheet-w-lg);
|
|
54
|
+
--xh-_command-input-h: var(--xh-control-h-lg);
|
|
55
|
+
--xh-_command-px: var(--xh-control-px-lg);
|
|
56
|
+
--xh-_command-item-py: var(--xh-list-option-py-lg);
|
|
57
|
+
--xh-_command-gap: var(--xh-control-gap-lg);
|
|
58
|
+
--xh-_command-font-size: var(--xh-control-font-lg);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* —— 遮罩 —— */
|
|
62
|
+
[data-scope='command'][data-part='backdrop'] {
|
|
63
|
+
position: fixed;
|
|
64
|
+
inset: 0;
|
|
65
|
+
z-index: var(--xh-command-backdrop-layer, var(--xh-_layer, var(--xh-layer-modal)));
|
|
66
|
+
background: var(--xh-command-backdrop-bg, var(--xh-bg-overlay));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* 同一层底色之上再糊背后的页面 */
|
|
70
|
+
[data-scope='command'][data-part='backdrop'][data-variant='blur'] {
|
|
71
|
+
backdrop-filter: blur(var(--xh-command-backdrop-blur, var(--xh-overlay-backdrop-blur)));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* 去掉底色,只留下这一层吃指针:交互外关闭与滚动锁定照旧 */
|
|
75
|
+
[data-scope='command'][data-part='backdrop'][data-variant='transparent'] {
|
|
76
|
+
background: transparent;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
[data-scope='command'][data-part='backdrop'][data-state='open'] {
|
|
80
|
+
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* 退场补 forwards:动画播完到宿主真正卸载之间还有一帧,不定住终态遮罩会闪回全黑 */
|
|
84
|
+
[data-scope='command'][data-part='backdrop'][data-state='closed'] {
|
|
85
|
+
animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* —— 定位层 —— */
|
|
89
|
+
/* 面板不居中,贴着上沿放:下方留出来的空间全归结果列表,条目多的时候面板往下长,
|
|
90
|
+
不像居中那样两头一起挪、每敲一个字整块面板都在动 */
|
|
91
|
+
[data-scope='command'][data-part='positioner'] {
|
|
92
|
+
position: fixed;
|
|
93
|
+
inset: 0;
|
|
94
|
+
z-index: var(--xh-command-layer, var(--xh-_layer, var(--xh-layer-modal)));
|
|
95
|
+
display: flex;
|
|
96
|
+
align-items: flex-start;
|
|
97
|
+
justify-content: center;
|
|
98
|
+
/* 全屏定位层只负责排版,不截获页面指针;模态拦截由 backdrop 承担。 */
|
|
99
|
+
pointer-events: none;
|
|
100
|
+
padding-block-start: max(var(--xh-command-inset-block-start, var(--xh-space-8)), env(safe-area-inset-top));
|
|
101
|
+
padding-block-end: max(var(--xh-command-positioner-pb, var(--xh-space-4)), env(safe-area-inset-bottom));
|
|
102
|
+
padding-inline: max(
|
|
103
|
+
var(--xh-command-positioner-px, var(--xh-space-4)),
|
|
104
|
+
env(safe-area-inset-left),
|
|
105
|
+
env(safe-area-inset-right)
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* —— 面板 —— */
|
|
110
|
+
[data-scope='command'][data-part='content'] {
|
|
111
|
+
/* 结果列表的自绘条浮在内容之上:轨道不上底色,实色轨道会在面板右缘糊一条竖灰带 */
|
|
112
|
+
--xh-scrollbar-track-bg: transparent;
|
|
113
|
+
|
|
114
|
+
position: relative;
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
inline-size: 100%;
|
|
118
|
+
max-inline-size: var(--xh-command-max-w, var(--xh-_command-max-w));
|
|
119
|
+
/* 封顶才有可滚的余量:不封顶结果列表会一路撑到视口外,滚动条永远出不来 */
|
|
120
|
+
max-block-size: var(--xh-command-max-h, var(--xh-overlay-max-h));
|
|
121
|
+
/* 模态命令面板与 Dialog 同档:overlay 圆角 + sheet 三件套(material-elevated 的边 / 底 / 影,§8.4),
|
|
122
|
+
边界由描边承担,不再只靠落影 */
|
|
123
|
+
border: var(--xh-stroke-thin) solid var(--xh-command-border, var(--xh-material-elevated-border));
|
|
124
|
+
border-radius: var(--xh-command-radius, var(--xh-shape-overlay));
|
|
125
|
+
background: var(--xh-command-bg, var(--xh-material-elevated-bg));
|
|
126
|
+
color: var(--xh-command-fg, var(--xh-material-elevated-fg));
|
|
127
|
+
box-shadow: var(--xh-command-shadow, var(--xh-material-elevated-shadow));
|
|
128
|
+
/* 条目的高亮底色是方角,滚到两端时会探出面板的圆角 */
|
|
129
|
+
overflow: hidden;
|
|
130
|
+
/* positioner 不吃指针,面板自身恢复交互。 */
|
|
131
|
+
pointer-events: auto;
|
|
132
|
+
/* 进退场的缩放锚在面板顶缘:它是从上方落下来的 */
|
|
133
|
+
transform-origin: var(--xh-_overlay-origin-x, 50%) var(--xh-_overlay-origin-y, 0);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
137
|
+
收起态连接层会给 content 打 hidden,而上面那条 display: flex 正是要盖掉 UA 的
|
|
138
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
139
|
+
读到才申领租约、等 animationend 才卸载;一旦 display: none,元素不生成盒子、
|
|
140
|
+
动画根本不启动,探测器直接放弃租约,退场动画一帧都播不出来。
|
|
141
|
+
真正的收起由适配器兜住:Vue 卸载整棵,WC 写内联 style.display。
|
|
142
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
143
|
+
|
|
144
|
+
/* 面板本身只承接程序化聚焦(开场那一刻还没轮到检索框),不画环 */
|
|
145
|
+
[data-scope='command'][data-part='content']:focus-visible {
|
|
146
|
+
outline: none;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
[data-scope='command'][data-part='content'][data-state='open'] {
|
|
150
|
+
animation: xh-overlay-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
151
|
+
/* 只在开着的这一档挂:合成层随 data-state 一起收走,收起后不再占着 */
|
|
152
|
+
will-change: opacity, scale, translate;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
156
|
+
免得动画结束到真收起之间闪一下原样 */
|
|
157
|
+
[data-scope='command'][data-part='content'][data-state='closed'] {
|
|
158
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* —— 检索框 —— */
|
|
162
|
+
/* 通栏一行,底下一道线把它与结果分开;框自己不画边不画底,边界归面板 */
|
|
163
|
+
[data-scope='command'][data-part='input'] {
|
|
164
|
+
flex: none;
|
|
165
|
+
inline-size: 100%;
|
|
166
|
+
block-size: var(--xh-command-input-h, var(--xh-_command-input-h));
|
|
167
|
+
padding-block: 0;
|
|
168
|
+
padding-inline: var(--xh-command-input-px, var(--xh-_command-px));
|
|
169
|
+
border: 0;
|
|
170
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-command-input-border, var(--xh-border-subtle));
|
|
171
|
+
border-radius: 0;
|
|
172
|
+
background: transparent;
|
|
173
|
+
color: var(--xh-command-input-fg, var(--xh-fg-default));
|
|
174
|
+
font-family: inherit;
|
|
175
|
+
font-size: var(--xh-command-input-font-size, var(--xh-text-body-size));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
[data-scope='command'][data-part='input']::placeholder {
|
|
179
|
+
color: var(--xh-command-placeholder-fg, var(--xh-fg-subtle));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* 自动填充态:浏览器给填过的框强加一套系统色(多数引擎是黄底黑字),
|
|
183
|
+
优先级高到 background / color 改不动,也不跟主题走。
|
|
184
|
+
底用 box-shadow 的 inset 扩散铺满内容盒,字用 -webkit-text-fill-color 接回令牌。
|
|
185
|
+
两个选择器名分写两条:一条选择器列表里只要有一个名字不被认识,整条规则就被丢弃。
|
|
186
|
+
底取不透明的面令牌而不是 transparent:检索框自己不画底,铺透明等于没铺 */
|
|
187
|
+
[data-scope='command'][data-part='input']:autofill {
|
|
188
|
+
box-shadow: inset 0 0 0 100vmax var(--xh-command-input-autofill-bg, var(--xh-bg-surface));
|
|
189
|
+
-webkit-text-fill-color: var(--xh-command-input-autofill-fg, var(--xh-fg-default));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
[data-scope='command'][data-part='input']:-webkit-autofill {
|
|
193
|
+
box-shadow: inset 0 0 0 100vmax var(--xh-command-input-autofill-bg, var(--xh-bg-surface));
|
|
194
|
+
-webkit-text-fill-color: var(--xh-command-input-autofill-fg, var(--xh-fg-default));
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/* —— 结果列表 —— */
|
|
198
|
+
/* 只管滚动,留白归条目。min-block-size: 0 是弹性子项能真正滚动的前提——
|
|
199
|
+
不给的话它按内容撑高,面板的 max-block-size 就只会把溢出的部分裁掉而不是交给它滚 */
|
|
200
|
+
[data-scope='command'][data-part='list'] {
|
|
201
|
+
display: flex;
|
|
202
|
+
flex: 1 1 auto;
|
|
203
|
+
flex-direction: column;
|
|
204
|
+
gap: var(--xh-command-list-gap, var(--xh-list-option-gap));
|
|
205
|
+
min-block-size: 0;
|
|
206
|
+
padding-block: var(--xh-command-list-py, var(--xh-space-2));
|
|
207
|
+
padding-inline: var(--xh-command-list-px, var(--xh-space-2));
|
|
208
|
+
/* 模态面板里的滚动面:到底后不把滚动链穿透给页面(§6.6) */
|
|
209
|
+
overflow-y: auto;
|
|
210
|
+
overscroll-behavior: contain;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/* 没有可见命令时不保留列表的上下内距;只排除列表内部 hidden 祖先,退场中的外壳不影响判断。 */
|
|
214
|
+
[data-scope='command'][data-part='list']:not(:has(
|
|
215
|
+
[data-scope='command'][data-part='item']:not([hidden]):not(
|
|
216
|
+
[data-scope='command'][data-part='list'] [hidden] *
|
|
217
|
+
)
|
|
218
|
+
)) {
|
|
219
|
+
display: none;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* 列表从不承载焦点(焦点恒在检索框,锚点走 aria-activedescendant),
|
|
223
|
+
可滚动容器在某些浏览器里会被自动塞进 Tab 序列,落焦时不画环 */
|
|
224
|
+
[data-scope='command'][data-part='list']:focus-visible {
|
|
225
|
+
outline: none;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* —— 分组 —— */
|
|
229
|
+
[data-scope='command'][data-part='group'] {
|
|
230
|
+
display: flex;
|
|
231
|
+
flex-direction: column;
|
|
232
|
+
gap: var(--xh-command-group-gap, var(--xh-list-option-gap));
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* 组间留白只加在后继分组上:首组顶上已经有列表的内边距,再加一层会显得头重 */
|
|
236
|
+
[data-scope='command'][data-part='group'] + [data-scope='command'][data-part='group'] {
|
|
237
|
+
margin-block-start: var(--xh-command-group-spacing, var(--xh-space-1_5));
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* 分组标题不是命令、进不了导航,画成小号次要文字,内缩与条目对齐 */
|
|
241
|
+
[data-scope='command'][data-part='group-label'] {
|
|
242
|
+
display: block;
|
|
243
|
+
padding-block: var(--xh-command-group-label-py, var(--xh-space-1));
|
|
244
|
+
padding-inline: var(--xh-command-group-label-px, var(--xh-_command-px));
|
|
245
|
+
color: var(--xh-command-group-label-fg, var(--xh-fg-subtle));
|
|
246
|
+
font-size: var(--xh-command-group-label-font-size, var(--xh-text-caption-size));
|
|
247
|
+
font-weight: var(--xh-command-group-label-font-weight, var(--xh-font-weight-medium));
|
|
248
|
+
line-height: var(--xh-leading-none);
|
|
249
|
+
user-select: none;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* —— 命令 —— */
|
|
253
|
+
/* 命令走 Collection Item 的 overlay 语境:悬停 / 键盘锚点(data-highlighted,白底承载 100)、按下(200)与禁用面
|
|
254
|
+
(aria-disabled)都由家族给,这里只把公开槽映射到桥接槽。aria-selected 跟着活动候选走(selection-follows-focus),
|
|
255
|
+
家族的浮层选中面缺省透明:这里把选中各态映射到与悬停 / 按下同一档,活动候选与指针悬停看上去是同一副面,
|
|
256
|
+
命令面板里没有第二档,选中即执行、不留状态。命令从不承载焦点(焦点恒在检索框),高亮不画环。
|
|
257
|
+
布局保持 flex:图标、正文、快捷键按作者顺序排成一行,不用家族网格;间距由行的 gap 给 */
|
|
258
|
+
[data-scope='command'][data-part='item'] {
|
|
259
|
+
--xh-collection-block-padding: var(--xh-command-item-py, var(--xh-_command-item-py));
|
|
260
|
+
--xh-collection-inline-padding: var(--xh-command-item-px, var(--xh-_command-px));
|
|
261
|
+
--xh-collection-gap: 0;
|
|
262
|
+
--xh-collection-font-size: var(--xh-command-item-font-size, var(--xh-_command-font-size));
|
|
263
|
+
--xh-collection-radius: var(--xh-command-item-radius, var(--xh-shape-control));
|
|
264
|
+
--xh-collection-fg-rest: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
265
|
+
--xh-collection-fg-hover: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
266
|
+
--xh-collection-fg-keyboard-highlight: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
267
|
+
--xh-collection-fg-pressed: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
268
|
+
--xh-collection-fg-selected: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
269
|
+
--xh-collection-fg-selected-hover: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
270
|
+
--xh-collection-fg-selected-highlight: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
271
|
+
--xh-collection-fg-selected-pressed: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
272
|
+
--xh-collection-bg-hover: var(--xh-command-item-bg-hover, var(--xh-bg-subtle));
|
|
273
|
+
--xh-collection-bg-keyboard-highlight: var(--xh-command-item-bg-hover, var(--xh-bg-subtle));
|
|
274
|
+
--xh-collection-bg-selected: var(--xh-command-item-bg-hover, var(--xh-bg-subtle));
|
|
275
|
+
--xh-collection-bg-selected-hover: var(--xh-command-item-bg-hover, var(--xh-bg-subtle));
|
|
276
|
+
--xh-collection-bg-selected-highlight: var(--xh-command-item-bg-hover, var(--xh-bg-subtle));
|
|
277
|
+
--xh-collection-bg-pressed: var(--xh-command-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
278
|
+
--xh-collection-bg-selected-pressed: var(--xh-command-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
279
|
+
--xh-collection-outline-keyboard-highlight: transparent;
|
|
280
|
+
--xh-collection-outline-selected-highlight: transparent;
|
|
281
|
+
|
|
282
|
+
display: flex;
|
|
283
|
+
align-items: center;
|
|
284
|
+
gap: var(--xh-command-item-gap, var(--xh-_command-gap));
|
|
285
|
+
/* 行高留出文字的上下伸展空间,行内那层 overflow:hidden 才不会把字削掉 */
|
|
286
|
+
line-height: var(--xh-command-item-leading, var(--xh-leading-normal));
|
|
287
|
+
user-select: none;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* 开幕:结果自上而下逐条冒出来。筛掉的条目带 hidden 不生成盒子,重新露面时这段动画重新起跑,
|
|
291
|
+
所以每改一次检索串都会重播一遍。backwards 让每条在自己那份延迟里保持起始帧 */
|
|
292
|
+
[data-scope='command'][data-part='list'] [data-part='item'] {
|
|
293
|
+
animation: xh-rise-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* 交错的间隔:第二条起逐级往后推,第六条起统一钉在第五级,命令再多也不会拖出一条越来越慢的尾巴。
|
|
297
|
+
列表里同时挂着被筛掉的条目(收起态),计数把它们排掉,序号才对得上看得见的那几条 */
|
|
298
|
+
[data-scope='command'][data-part='list'] [data-part='item']:nth-child(2 of :not([hidden])) {
|
|
299
|
+
animation-delay: var(--xh-motion-stagger-step);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
[data-scope='command'][data-part='list'] [data-part='item']:nth-child(3 of :not([hidden])) {
|
|
303
|
+
animation-delay: calc(2 * var(--xh-motion-stagger-step));
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
[data-scope='command'][data-part='list'] [data-part='item']:nth-child(4 of :not([hidden])) {
|
|
307
|
+
animation-delay: calc(3 * var(--xh-motion-stagger-step));
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
[data-scope='command'][data-part='list'] [data-part='item']:nth-child(5 of :not([hidden])) {
|
|
311
|
+
animation-delay: calc(4 * var(--xh-motion-stagger-step));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
[data-scope='command'][data-part='list'] [data-part='item']:nth-child(n + 6 of :not([hidden])) {
|
|
315
|
+
animation-delay: calc(5 * var(--xh-motion-stagger-step));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
[data-scope='command'][data-part='item-text'] {
|
|
319
|
+
flex: 1;
|
|
320
|
+
/* 弹性子项默认最小尺寸是内容尺寸,不归零则长文本把行撑破、省略号轮不上 */
|
|
321
|
+
min-inline-size: 0;
|
|
322
|
+
overflow: hidden;
|
|
323
|
+
white-space: nowrap;
|
|
324
|
+
text-overflow: ellipsis;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/* —— 两个占位 —— */
|
|
328
|
+
/* 空态占位:待在面板里、列表的兄弟;盒与阴影归面板,这里只画一句居中的次要文字 */
|
|
329
|
+
[data-scope='command'][data-part='empty'] {
|
|
330
|
+
display: block;
|
|
331
|
+
flex: none;
|
|
332
|
+
padding-block: var(--xh-command-empty-py, var(--xh-space-6));
|
|
333
|
+
padding-inline: var(--xh-command-empty-px, var(--xh-_command-px));
|
|
334
|
+
color: var(--xh-command-empty-fg, var(--xh-fg-subtle));
|
|
335
|
+
font-size: var(--xh-command-empty-font-size, var(--xh-_command-font-size));
|
|
336
|
+
line-height: var(--xh-leading-none);
|
|
337
|
+
text-align: center;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/* 在途占位:与空态占位同一个位置、同一副观感,两者不同屏 */
|
|
341
|
+
[data-scope='command'][data-part='loading'] {
|
|
342
|
+
display: block;
|
|
343
|
+
flex: none;
|
|
344
|
+
padding-block: var(--xh-command-loading-py, var(--xh-space-6));
|
|
345
|
+
padding-inline: var(--xh-command-loading-px, var(--xh-_command-px));
|
|
346
|
+
color: var(--xh-command-loading-fg, var(--xh-fg-subtle));
|
|
347
|
+
font-size: var(--xh-command-loading-font-size, var(--xh-_command-font-size));
|
|
348
|
+
line-height: var(--xh-leading-none);
|
|
349
|
+
text-align: center;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/* 未提供状态内容时不渲染一块纯留白,提示文案仍由作者明确提供。 */
|
|
353
|
+
[data-scope='command'][data-part='empty']:empty,
|
|
354
|
+
[data-scope='command'][data-part='loading']:empty {
|
|
355
|
+
display: none;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/* 取数在途:列表压暗一档,与在途占位一起说明这块正在变 */
|
|
359
|
+
[data-scope='command'][data-part='list'][aria-busy='true'] {
|
|
360
|
+
opacity: var(--xh-command-list-busy-opacity, var(--xh-state-disabled-opacity));
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/* —— 底部提示条 —— */
|
|
364
|
+
/* 贴在列表下沿,用一道分隔线与命令断开;作者往里放什么由作者定 */
|
|
365
|
+
[data-scope='command'][data-part='footer'] {
|
|
366
|
+
display: flex;
|
|
367
|
+
flex: none;
|
|
368
|
+
align-items: center;
|
|
369
|
+
gap: var(--xh-command-footer-gap, var(--xh-space-2));
|
|
370
|
+
padding-block: var(--xh-command-footer-py, var(--xh-space-2));
|
|
371
|
+
padding-inline: var(--xh-command-footer-px, var(--xh-_command-px));
|
|
372
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-command-footer-border, var(--xh-border-subtle));
|
|
373
|
+
color: var(--xh-command-footer-fg, var(--xh-fg-muted));
|
|
374
|
+
font-size: var(--xh-command-footer-font-size, var(--xh-text-caption-size));
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
378
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
379
|
+
[data-scope='command'][data-part='positioner'][hidden],
|
|
380
|
+
[data-scope='command'][data-part='list'][hidden],
|
|
381
|
+
[data-scope='command'][data-part='group'][hidden],
|
|
382
|
+
[data-scope='command'][data-part='group-label'][hidden],
|
|
383
|
+
[data-scope='command'][data-part='item'][hidden],
|
|
384
|
+
[data-scope='command'][data-part='item-text'][hidden],
|
|
385
|
+
[data-scope='command'][data-part='empty'][hidden],
|
|
386
|
+
[data-scope='command'][data-part='loading'][hidden],
|
|
387
|
+
[data-scope='command'][data-part='footer'][hidden] {
|
|
388
|
+
display: none;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
@media print {
|
|
392
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
393
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
394
|
+
[data-scope='command'][data-part='backdrop'],
|
|
395
|
+
[data-scope='command'][data-part='positioner'] {
|
|
396
|
+
display: none;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|