@xihan-ui/styles 2.0.0 → 3.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 +1328 -0
- package/README.md +6 -1
- package/component-tokens.d.ts +505 -111
- package/components.tokens.json +34750 -26291
- package/css/accordion.css +39 -13
- package/css/alert.css +61 -3
- package/css/anchor.css +49 -11
- package/css/approval.css +124 -84
- package/css/avatar-group.css +1 -1
- package/css/avatar.css +13 -5
- package/css/back-top.css +63 -44
- package/css/badge.css +63 -13
- package/css/bar-code.css +1 -1
- package/css/breadcrumb.css +63 -4
- package/css/button-group.css +5 -5
- package/css/button.css +69 -21
- package/css/calendar-picker.css +27 -8
- package/css/calendar-range-picker.css +48 -11
- package/css/card.css +116 -2
- package/css/carousel.css +153 -48
- package/css/cartesian-chart.css +830 -0
- package/css/cascader.css +184 -70
- package/css/checkbox-group.css +69 -99
- package/css/checkbox.css +21 -54
- package/css/citation.css +470 -0
- package/css/clipboard.css +23 -66
- package/css/code-view.css +103 -8
- package/css/collapsible.css +37 -11
- package/css/color-field.css +18 -0
- package/css/color-picker.css +57 -62
- package/css/color-slider.css +26 -19
- package/css/color-swatch-picker.css +8 -6
- package/css/combobox.css +82 -37
- package/css/command.css +48 -48
- package/css/context-menu.css +43 -28
- package/css/date-field.css +23 -0
- package/css/date-picker.css +57 -24
- package/css/date-range-picker.css +301 -14
- package/css/description.css +17 -1
- package/css/descriptions.css +43 -1
- package/css/dialog.css +99 -43
- package/css/diff-view.css +101 -16
- package/css/download-trigger.css +46 -80
- package/css/drawer.css +168 -133
- package/css/editable.css +19 -0
- package/css/empty-state.css +8 -7
- package/css/field-array.css +36 -0
- package/css/field.css +17 -19
- package/css/fieldset.css +1 -1
- package/css/file-upload.css +126 -136
- package/css/flex.css +324 -8
- package/css/float-button.css +168 -41
- package/css/floating-panel.css +59 -27
- package/css/form.css +26 -20
- package/css/funnel-chart.css +106 -0
- package/css/graph-chart.css +205 -0
- package/css/grid-list.css +235 -0
- package/css/grid.css +252 -1
- package/css/heatmap.css +119 -36
- package/css/hierarchy-chart.css +298 -0
- package/css/hover-card.css +33 -18
- package/css/icon.css +100 -0
- package/css/image-cropper.css +34 -8
- package/css/image-viewer.css +169 -26
- package/css/image.css +23 -4
- package/css/infinite-scroll.css +2 -2
- package/css/input-group.css +13 -15
- package/css/json-viewer.css +55 -7
- package/css/kbd.css +1 -1
- package/css/layout.css +71 -21
- package/css/liquid.css +106 -0
- package/css/list.css +2 -2
- package/css/listbox.css +72 -23
- package/css/loading-bar.css +27 -13
- package/css/log.css +131 -35
- package/css/markdown-stream.css +1 -1
- package/css/marquee.css +163 -7
- package/css/matrix-code.css +1 -1
- package/css/mention.css +35 -21
- package/css/menu.css +40 -28
- package/css/menubar.css +42 -28
- package/css/message-feed.css +174 -53
- package/css/navigation-menu.css +177 -18
- package/css/notification.css +431 -110
- package/css/number-field.css +22 -0
- package/css/page-header.css +4 -2
- package/css/pagination.css +129 -29
- package/css/password-input.css +40 -8
- package/css/pie-chart.css +247 -0
- package/css/popconfirm.css +50 -58
- package/css/popover.css +55 -21
- package/css/progress.css +308 -10
- package/css/prompt-input.css +37 -1
- package/css/question-flow.css +104 -64
- package/css/radar-chart.css +233 -0
- package/css/radio-group.css +372 -14
- package/css/rating.css +25 -27
- package/css/reasoning.css +62 -55
- package/css/reset.css +1 -1
- package/css/resizable.css +6 -1
- package/css/sankey-chart.css +174 -0
- package/css/scroll-area.css +32 -0
- package/css/scrollbar.css +1 -1
- package/css/select.css +76 -59
- package/css/side-nav.css +177 -30
- package/css/signature-pad.css +23 -8
- package/css/skeleton.css +13 -14
- package/css/slider.css +39 -17
- package/css/sortable.css +38 -8
- package/css/sparkline.css +164 -0
- package/css/spinner.css +50 -22
- package/css/splitter.css +8 -2
- package/css/statistic.css +10 -0
- package/css/steps.css +257 -38
- package/css/switch.css +30 -55
- package/css/table.css +168 -128
- package/css/tabs.css +243 -31
- package/css/tag-group.css +65 -37
- package/css/tag.css +55 -14
- package/css/tags-input.css +40 -3
- package/css/text-field.css +19 -0
- package/css/time-field.css +20 -1
- package/css/time-picker.css +44 -17
- package/css/time-range-picker.css +45 -18
- package/css/timeline.css +1 -1
- package/css/toggle-group.css +8 -8
- package/css/toggle.css +6 -5
- package/css/tool-call.css +64 -56
- package/css/toolbar.css +105 -7
- package/css/tooltip.css +18 -7
- package/css/tour.css +49 -21
- package/css/transfer.css +104 -81
- package/css/tree-select.css +235 -58
- package/css/tree.css +240 -147
- package/css/truncate.css +55 -12
- package/css/typography.css +93 -0
- package/css/virtualizer.css +57 -1
- package/css/watermark.css +23 -0
- package/family/action-control.css +14 -5
- package/family/chart.css +480 -0
- package/family/check-mark.css +94 -0
- package/family/choice-card.css +97 -0
- package/family/collection-item.css +70 -27
- package/family/field-chrome.css +1 -12
- package/family/loading-ring.css +95 -0
- package/family/material.css +72 -0
- package/family/menu-choice.css +56 -0
- package/family/motion.css +208 -11
- package/family/tag-list.css +59 -0
- package/index.css +23363 -14091
- package/index.unlayered.css +23198 -13922
- package/package.json +20 -8
- package/css/gradient-text.css +0 -91
- package/css/icon-wrapper.css +0 -81
- package/css/segmented.css +0 -280
- package/css/toast.css +0 -499
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
--xh-_color-swatch-picker-indicator: var(--xh-control-indicator-lg);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/*
|
|
54
|
+
/* 标题独占一行,格子从下一行起排。复合单字段的标签:14 / 500 / fg-default,不随档;
|
|
55
55
|
与格子的距离贴控件 space-1——容器的 gap 归格子之间,标签在它之上补一段差值把距离收成目标值 */
|
|
56
56
|
[data-scope='color-swatch-picker'][data-part='label'] {
|
|
57
57
|
flex-basis: 100%;
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
flex: none;
|
|
81
81
|
inline-size: var(--xh-color-swatch-picker-item-size, var(--xh-_color-swatch-picker-cell));
|
|
82
82
|
block-size: var(--xh-color-swatch-picker-item-size, var(--xh-_color-swatch-picker-cell));
|
|
83
|
-
/* 色块 item 的身份是 inset
|
|
83
|
+
/* 色块 item 的身份是 inset(嵌在 control 内的小块) */
|
|
84
84
|
border-radius: var(--xh-color-swatch-picker-item-radius, var(--xh-shape-inset));
|
|
85
85
|
outline: none;
|
|
86
86
|
cursor: pointer;
|
|
@@ -88,12 +88,12 @@
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
/* 指到哪一格:描边换到控件的悬停边(border-strong 只留给 contrast-more 与登记的强调边);
|
|
91
|
-
|
|
91
|
+
选中的那一格保留自己的品牌描边(选中身份不被悬停盖掉) */
|
|
92
92
|
[data-scope='color-swatch-picker'][data-part='item']:not([data-disabled], [data-readonly], [data-state='checked']):hover {
|
|
93
93
|
--xh-_color-swatch-picker-edge: var(--xh-color-swatch-picker-swatch-border-hover, var(--xh-border-control-hover));
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
/*
|
|
96
|
+
/* 这一格的底色就是它要展示的那个颜色,换底等于把展示物盖掉(的「同时换底」在这里落不下去),
|
|
97
97
|
交互回执只能落在别处:按下去看下压,描边同时换到品牌色作第二通道(按住即将选中的那一格)。
|
|
98
98
|
置灰与只读的都不压;指针 :active 与 Headless 投影的 data-pressed 看见同一副按压面 */
|
|
99
99
|
[data-scope='color-swatch-picker'][data-part='item']:not([data-disabled], [data-readonly]):is(:active, [data-pressed]) {
|
|
@@ -162,14 +162,14 @@
|
|
|
162
162
|
inline-size: var(--xh-color-swatch-picker-indicator-size, var(--xh-_color-swatch-picker-indicator));
|
|
163
163
|
block-size: var(--xh-color-swatch-picker-indicator-size, var(--xh-_color-swatch-picker-indicator));
|
|
164
164
|
border: var(--xh-stroke-thin) solid var(--xh-color-swatch-picker-indicator-border, var(--xh-bg-canvas));
|
|
165
|
-
/* 正方盒取 circle
|
|
165
|
+
/* 正方盒取 circle(宽高同槽的盒不得用 pill 冒充圆) */
|
|
166
166
|
border-radius: var(--xh-shape-circle);
|
|
167
167
|
background: var(--xh-color-swatch-picker-indicator-bg, var(--xh-_color-swatch-picker-accent));
|
|
168
168
|
opacity: 0;
|
|
169
169
|
scale: 0;
|
|
170
170
|
transition:
|
|
171
171
|
opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
172
|
-
scale var(--xh-motion-duration-
|
|
172
|
+
scale var(--xh-motion-duration-nudge) var(--xh-motion-ease-settle);
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
/* 没写内容就由皮肤画勾;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
@@ -236,7 +236,9 @@
|
|
|
236
236
|
background: Highlight;
|
|
237
237
|
}
|
|
238
238
|
|
|
239
|
+
/* 勾是 mask 挖出来的一块底色:退出强制换色、直接写系统色,否则底色被换成 Canvas、勾跟着消失 */
|
|
239
240
|
[data-scope='color-swatch-picker'][data-part='indicator']:empty::after {
|
|
241
|
+
forced-color-adjust: none;
|
|
240
242
|
background-color: HighlightText;
|
|
241
243
|
}
|
|
242
244
|
}
|
package/css/combobox.css
CHANGED
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
@import '../family/field-chrome.css';
|
|
8
8
|
@import '../family/action-control.css';
|
|
9
9
|
@import '../family/collection-item.css';
|
|
10
|
+
@import '../family/loading-ring.css';
|
|
10
11
|
|
|
11
12
|
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
12
13
|
@import '../family/motion.css';
|
|
14
|
+
@import '../family/material.css';
|
|
15
|
+
@import '../family/tag-list.css';
|
|
13
16
|
|
|
14
17
|
@layer xihan.components {
|
|
15
18
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -25,8 +28,8 @@
|
|
|
25
28
|
/* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,行内轴据此夹取;
|
|
26
29
|
引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
|
|
27
30
|
--xh-_combobox-available-w: 100vw;
|
|
28
|
-
/*
|
|
29
|
-
引擎没算(尚未落位 / 无引擎)时为 0
|
|
31
|
+
/* 字段盒实测宽度,由定位引擎经内联自定义属性写进来,内容层与它等宽;
|
|
32
|
+
引擎没算(尚未落位 / 无引擎)时为 0,面板取下界 */
|
|
30
33
|
--xh-_combobox-anchor-w: 0px;
|
|
31
34
|
/* 每层使用自身落位方向,不继承外层弹窗留下的方向。 */
|
|
32
35
|
--xh-_overlay-enter-up: 0;
|
|
@@ -85,7 +88,7 @@
|
|
|
85
88
|
|
|
86
89
|
/* 作者塞进指示符槽的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准。
|
|
87
90
|
浮层条目里自绘的状态字形(勾选标记所在的标记盒与盒里的勾)不读这支:它们是指示符,走
|
|
88
|
-
--xh-control-indicator-* 一族——标记盒在自己身上把 --xh-icon-size
|
|
91
|
+
--xh-control-indicator-* 一族——标记盒在自己身上把 --xh-icon-size 改接到盒的尺 */
|
|
89
92
|
--xh-icon-size: var(--xh-combobox-icon-size, var(--xh-glyph-size-md));
|
|
90
93
|
|
|
91
94
|
/* 语气只落在勾选标记上,单选与多选正文使用同一颜色。 */
|
|
@@ -183,6 +186,15 @@
|
|
|
183
186
|
--xh-field-placeholder-fg: var(--xh-combobox-placeholder-fg, var(--xh-fg-subtle));
|
|
184
187
|
--xh-field-autofill-bg: var(--xh-combobox-input-autofill-bg, var(--xh-bg-canvas));
|
|
185
188
|
--xh-field-autofill-fg: var(--xh-combobox-input-autofill-fg, var(--xh-fg-default));
|
|
189
|
+
|
|
190
|
+
/* 多选的标签排在它前面:标签再多也给打字留出这一截,挤不下时标签先截断、再折进 +N */
|
|
191
|
+
min-inline-size: var(--xh-combobox-input-min-w, var(--xh-control-input-min-w));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* 标签行:盒里、输入框之前收着已选值标签与 +N 那一枚的一行,行里每一枚都是 tag(data-scope="tag"),
|
|
195
|
+
样子归 tag.css;行怎么排、标签怎么进出归标签行家族配方(family/tag-list.css),这里只把使用者的间距槽接进去 */
|
|
196
|
+
[data-scope='combobox'][data-part='tag-list'] {
|
|
197
|
+
--xh-tag-list-gap: var(--xh-combobox-tag-list-gap, var(--xh-space-1));
|
|
186
198
|
}
|
|
187
199
|
|
|
188
200
|
[data-scope='combobox'][data-part='input'][hidden] {
|
|
@@ -232,7 +244,7 @@
|
|
|
232
244
|
按钮自带悬停底色,整个按钮转会带着底色一起转;家族按压缩放的是整钮,不影响这里的转向 */
|
|
233
245
|
[data-scope='combobox'][data-part='trigger']:empty::before,
|
|
234
246
|
[data-scope='combobox'][data-part='trigger'] > * {
|
|
235
|
-
transition: rotate var(--xh-motion-duration-
|
|
247
|
+
transition: rotate var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
|
|
236
248
|
}
|
|
237
249
|
|
|
238
250
|
/* 没写内容就由皮肤画箭头;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
@@ -266,49 +278,39 @@
|
|
|
266
278
|
}
|
|
267
279
|
|
|
268
280
|
[data-scope='combobox'][data-part='content'] {
|
|
281
|
+
/* 材质由家族配方画(family/material.css 的 frosted 面:描边、底、1px 顶光、前景、投影与背景滤镜),
|
|
282
|
+
这里只把使用者槽接进来 */
|
|
283
|
+
--xh-frosted-bg: var(--xh-combobox-content-bg, var(--xh-_material-bg));
|
|
284
|
+
--xh-frosted-border: var(--xh-combobox-content-border, var(--xh-_material-border));
|
|
285
|
+
--xh-frosted-fg: var(--xh-combobox-content-fg, var(--xh-_material-fg));
|
|
286
|
+
--xh-frosted-shadow: var(--xh-combobox-content-shadow, var(--xh-_material-shadow));
|
|
287
|
+
--xh-frosted-backdrop: var(--xh-combobox-content-backdrop, var(--xh-_material-backdrop));
|
|
288
|
+
--xh-frosted-highlight: var(--xh-combobox-content-highlight, var(--xh-_material-highlight));
|
|
289
|
+
|
|
269
290
|
position: relative;
|
|
270
291
|
display: flex;
|
|
271
292
|
flex-direction: column;
|
|
272
293
|
gap: var(--xh-combobox-content-gap, var(--xh-list-option-gap));
|
|
273
294
|
grid-area: 1 / 1;
|
|
274
|
-
/*
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
max(var(--xh-combobox-content-min-w, var(--xh-overlay-min-w)), var(--xh-_combobox-anchor-w)),
|
|
295
|
+
/* 列表型浮层与字段盒等宽:长选项在条目里截断,面板不随最长的一条变宽。锚点比下界还窄时取下界,
|
|
296
|
+
比可用区还宽时收成可用宽度;要封顶由作者另写上界槽 */
|
|
297
|
+
inline-size: min(
|
|
298
|
+
max(var(--xh-combobox-content-min-w, var(--xh-overlay-menu-min-w)), var(--xh-_combobox-anchor-w)),
|
|
278
299
|
var(--xh-_combobox-available-w)
|
|
279
300
|
);
|
|
280
|
-
|
|
281
|
-
max-inline-size: min(var(--xh-combobox-content-max-w, var(--xh-overlay-max-w)), var(--xh-_combobox-available-w));
|
|
301
|
+
max-inline-size: var(--xh-combobox-content-max-w, none);
|
|
282
302
|
/* 空列表也保留完整状态面的高度;empty/loading 先隐藏时,Presence 退场不会塌成细边条。 */
|
|
283
303
|
min-block-size: var(--xh-combobox-content-min-h, var(--xh-_combobox-h));
|
|
284
|
-
max-block-size: min(var(--xh-combobox-content-max-h, var(--xh-overlay-max-h)), var(--xh-_combobox-available-h));
|
|
304
|
+
max-block-size: min(var(--xh-combobox-content-max-h, var(--xh-overlay-menu-max-h)), var(--xh-_combobox-available-h));
|
|
285
305
|
padding-block: var(--xh-combobox-content-py, var(--xh-space-1));
|
|
286
306
|
padding-inline: var(--xh-combobox-content-px, var(--xh-space-1));
|
|
287
|
-
border: var(--xh-stroke-thin) solid var(--xh-combobox-content-border, var(--xh-material-frosted-border));
|
|
288
307
|
border-radius: var(--xh-combobox-content-radius, var(--xh-shape-overlay));
|
|
289
|
-
background: var(--xh-combobox-content-bg, var(--xh-material-frosted-bg));
|
|
290
|
-
color: var(--xh-combobox-content-fg, var(--xh-material-frosted-fg));
|
|
291
|
-
box-shadow: var(--xh-combobox-content-shadow, var(--xh-material-frosted-shadow));
|
|
292
|
-
-webkit-backdrop-filter: var(--xh-combobox-content-backdrop, var(--xh-material-frosted-backdrop));
|
|
293
|
-
backdrop-filter: var(--xh-combobox-content-backdrop, var(--xh-material-frosted-backdrop));
|
|
294
308
|
overflow-y: auto;
|
|
295
309
|
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
296
310
|
overscroll-behavior: contain;
|
|
297
311
|
pointer-events: auto;
|
|
298
312
|
}
|
|
299
313
|
|
|
300
|
-
/* 顶光只沿表面上边缘绘制,不参与列表布局、不拦截候选交互。 */
|
|
301
|
-
[data-scope='combobox'][data-part='content']::before {
|
|
302
|
-
content: '';
|
|
303
|
-
position: absolute;
|
|
304
|
-
inset-block-start: 0;
|
|
305
|
-
inset-inline: 0;
|
|
306
|
-
block-size: var(--xh-stroke-thin);
|
|
307
|
-
border-radius: inherit;
|
|
308
|
-
background: var(--xh-combobox-content-highlight, var(--xh-material-frosted-highlight));
|
|
309
|
-
pointer-events: none;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
314
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
313
315
|
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
314
316
|
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
@@ -321,10 +323,9 @@
|
|
|
321
323
|
outline: none;
|
|
322
324
|
}
|
|
323
325
|
|
|
324
|
-
|
|
326
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
327
|
+
[data-scope='combobox'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
325
328
|
animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
326
|
-
/* 只在开着的这一档挂:合成层随 data-state 一起收走,收起后不再占着 */
|
|
327
|
-
will-change: opacity, translate;
|
|
328
329
|
}
|
|
329
330
|
|
|
330
331
|
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
@@ -352,12 +353,19 @@
|
|
|
352
353
|
[data-scope='combobox'][data-part='group-label'] {
|
|
353
354
|
display: block;
|
|
354
355
|
padding-block: var(--xh-combobox-group-label-py, var(--xh-space-1));
|
|
355
|
-
padding-inline: var(--xh-combobox-group-label-px, var(--xh-
|
|
356
|
+
padding-inline: var(--xh-combobox-group-label-px, var(--xh-_combobox-item-px));
|
|
356
357
|
color: var(--xh-combobox-group-label-fg, var(--xh-material-frosted-fg-muted));
|
|
357
358
|
font-size: var(--xh-combobox-group-label-font-size, var(--xh-text-caption-size));
|
|
358
359
|
font-weight: var(--xh-combobox-group-label-font-weight, var(--xh-font-weight-medium));
|
|
359
360
|
line-height: var(--xh-leading-none);
|
|
360
361
|
user-select: none;
|
|
362
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/* 刷新:已有候选时后台在取,保留上一帧,条目与分组标题按 micro 淡下,数据到了再淡回;在途占位此时让位。
|
|
366
|
+
淡的是内容不是面:content 是整块磨砂面,整块淡下去面就透了 */
|
|
367
|
+
[data-scope='combobox'][data-part='content'][aria-busy='true'] [data-scope='combobox']:is([data-part='item'], [data-part='group-label']) {
|
|
368
|
+
opacity: var(--xh-state-disabled-opacity);
|
|
361
369
|
}
|
|
362
370
|
|
|
363
371
|
[data-scope='combobox'][data-part='group-label'][hidden] {
|
|
@@ -371,7 +379,7 @@
|
|
|
371
379
|
--xh-collection-inline-padding: var(--xh-combobox-item-px, var(--xh-_combobox-item-px));
|
|
372
380
|
--xh-collection-gap: var(--xh-combobox-item-gap, var(--xh-_combobox-gap));
|
|
373
381
|
--xh-collection-font-size: var(--xh-combobox-item-font-size, var(--xh-_combobox-font-size));
|
|
374
|
-
--xh-collection-radius: var(--xh-combobox-item-radius, var(--xh-shape-
|
|
382
|
+
--xh-collection-radius: var(--xh-combobox-item-radius, var(--xh-shape-inset));
|
|
375
383
|
--xh-collection-fg-rest: var(--xh-combobox-item-fg, var(--xh-material-frosted-fg));
|
|
376
384
|
--xh-collection-fg-hover: var(--xh-combobox-item-fg, var(--xh-material-frosted-fg));
|
|
377
385
|
--xh-collection-fg-keyboard-highlight: var(--xh-combobox-item-fg, var(--xh-material-frosted-fg));
|
|
@@ -425,7 +433,7 @@
|
|
|
425
433
|
|
|
426
434
|
/* 勾选标记落在家族网格的 indicator 列,只在选中项上显形(家族按 aria-selected / data-state=checked 给);
|
|
427
435
|
未选中时占位不塌,切换选中不引起行宽抖动。
|
|
428
|
-
|
|
436
|
+
盒与盒里的勾是指示符:盒按指示符档取尺,并在自己身上把 --xh-icon-size 改接到盒的尺,皮肤画的
|
|
429
437
|
兜底勾与作者塞进盒里的 XhIcon 读同一把尺、与盒同边长(勾选标记不是勾选格,不取 × 0.75,与 Select /
|
|
430
438
|
Listbox / Menu 族同口径);不读 root / positioner 按档下发的 --xh-icon-size——那支只管作者放进条目里的
|
|
431
439
|
图标,按图标档取的 20px 比 16 / 14 的指示符档大一圈 */
|
|
@@ -464,7 +472,7 @@
|
|
|
464
472
|
justify-content: center;
|
|
465
473
|
grid-area: 1 / 1;
|
|
466
474
|
padding-block: var(--xh-combobox-empty-py, var(--xh-space-3));
|
|
467
|
-
padding-inline: var(--xh-combobox-empty-px, var(--xh-
|
|
475
|
+
padding-inline: var(--xh-combobox-empty-px, var(--xh-_combobox-item-px));
|
|
468
476
|
color: var(--xh-combobox-empty-fg, var(--xh-material-frosted-fg-muted));
|
|
469
477
|
font-size: var(--xh-combobox-empty-font-size, var(--xh-_combobox-font-size));
|
|
470
478
|
line-height: var(--xh-leading-none);
|
|
@@ -483,9 +491,10 @@
|
|
|
483
491
|
display: flex;
|
|
484
492
|
align-items: center;
|
|
485
493
|
justify-content: center;
|
|
494
|
+
gap: var(--xh-_combobox-gap);
|
|
486
495
|
grid-area: 1 / 1;
|
|
487
496
|
padding-block: var(--xh-combobox-loading-py, var(--xh-space-3));
|
|
488
|
-
padding-inline: var(--xh-combobox-loading-px, var(--xh-
|
|
497
|
+
padding-inline: var(--xh-combobox-loading-px, var(--xh-_combobox-item-px));
|
|
489
498
|
color: var(--xh-combobox-loading-fg, var(--xh-material-frosted-fg-muted));
|
|
490
499
|
font-size: var(--xh-combobox-loading-font-size, var(--xh-_combobox-font-size));
|
|
491
500
|
line-height: var(--xh-leading-none);
|
|
@@ -497,6 +506,15 @@
|
|
|
497
506
|
display: none;
|
|
498
507
|
}
|
|
499
508
|
|
|
509
|
+
/* 首次加载:文案前一枚加载环,由加载环配方画(连接层投影 data-xh-loading-ring 与 data-loading),
|
|
510
|
+
直径取所在尺寸档的图标档 */
|
|
511
|
+
[data-scope='combobox'][data-part='loading']::before {
|
|
512
|
+
content: '';
|
|
513
|
+
flex: none;
|
|
514
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
515
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
516
|
+
}
|
|
517
|
+
|
|
500
518
|
/* 自动结构没收到状态文案时,空 status 不生成盒;打开着的空 listbox 也不画无意义表面。
|
|
501
519
|
closed 不命中:有文案的空态刚关闭时,content 仍要作为 Presence 宿主完成退场。 */
|
|
502
520
|
[data-scope='combobox'][data-part='empty']:empty,
|
|
@@ -518,4 +536,31 @@
|
|
|
518
536
|
display: none;
|
|
519
537
|
}
|
|
520
538
|
}
|
|
539
|
+
|
|
540
|
+
@media (forced-colors: active) {
|
|
541
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
542
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
543
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
544
|
+
条目面上取 CanvasText;按下与没被高亮时的悬停,家族把条目涂成 Highlight,字形换 HighlightText;
|
|
545
|
+
禁用取 GrayText */
|
|
546
|
+
[data-scope='combobox']:is([data-part='trigger'], [data-part='clear-trigger']):empty::before {
|
|
547
|
+
forced-color-adjust: none;
|
|
548
|
+
background-color: ButtonText;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
[data-scope='combobox'][data-part='item-indicator']:empty::before {
|
|
552
|
+
forced-color-adjust: none;
|
|
553
|
+
background-color: CanvasText;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
[data-scope='combobox']:is([data-part='trigger'], [data-part='clear-trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before,
|
|
557
|
+
[data-scope='combobox'][data-part='item']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted])) [data-scope='combobox'][data-part='item-indicator']:empty::before {
|
|
558
|
+
background-color: HighlightText;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
[data-scope='combobox']:is([data-part='trigger'], [data-part='clear-trigger'])[data-disabled]:empty::before,
|
|
562
|
+
[data-scope='combobox'][data-part='item']:is([aria-disabled='true'], [data-disabled]) [data-scope='combobox'][data-part='item-indicator']:empty::before {
|
|
563
|
+
background-color: GrayText;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
521
566
|
}
|
package/css/command.css
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
/* 共享关键帧由 family/motion.css 提供,命令走 Collection Item 家族;本皮肤 @import 它们,单独引入仍成立。 */
|
|
9
9
|
@import '../family/collection-item.css';
|
|
10
|
+
@import '../family/field-chrome.css';
|
|
11
|
+
@import '../family/loading-ring.css';
|
|
10
12
|
@import '../family/motion.css';
|
|
11
13
|
|
|
12
14
|
@layer xihan.components {
|
|
@@ -19,7 +21,7 @@
|
|
|
19
21
|
谁先命中谁给出这一档的取值;条目、检索框与提示条都从面板继承下去 */
|
|
20
22
|
[data-scope='command']:is([data-part='positioner'], [data-part='content']) {
|
|
21
23
|
/* 条目外的字形(分组标题、底部提示条)按档取尺,缺省 md,随 data-size 换档;命令里的图标由家族随
|
|
22
|
-
data-xh-collection-size
|
|
24
|
+
data-xh-collection-size 下发 */
|
|
23
25
|
--xh-icon-size: var(--xh-command-icon-size, var(--xh-glyph-size-md));
|
|
24
26
|
|
|
25
27
|
/* 尺寸档只换这六个私有槽,换档不必给每个部件各写一条选择器 */
|
|
@@ -31,9 +33,10 @@
|
|
|
31
33
|
--xh-_command-font-size: var(--xh-control-font-md);
|
|
32
34
|
}
|
|
33
35
|
|
|
34
|
-
/*
|
|
36
|
+
/* 面板从上方落下来一小段:起点在终点之上(up 一侧写 1),与锚在顶缘的缩放同向。
|
|
37
|
+
方向槽写在定位层上,面板继承过去喂给进场那支动画 */
|
|
35
38
|
[data-scope='command'][data-part='positioner'] {
|
|
36
|
-
--xh-_overlay-enter-
|
|
39
|
+
--xh-_overlay-enter-up: 1;
|
|
37
40
|
}
|
|
38
41
|
|
|
39
42
|
/* —— 尺寸 —— */
|
|
@@ -76,7 +79,7 @@
|
|
|
76
79
|
background: transparent;
|
|
77
80
|
}
|
|
78
81
|
|
|
79
|
-
[data-scope='command'][data-part='backdrop'][data-state='open'] {
|
|
82
|
+
[data-scope='command'][data-part='backdrop'][data-state='open']:not([data-instant]) {
|
|
80
83
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
81
84
|
}
|
|
82
85
|
|
|
@@ -118,7 +121,7 @@
|
|
|
118
121
|
max-inline-size: var(--xh-command-max-w, var(--xh-_command-max-w));
|
|
119
122
|
/* 封顶才有可滚的余量:不封顶结果列表会一路撑到视口外,滚动条永远出不来 */
|
|
120
123
|
max-block-size: var(--xh-command-max-h, var(--xh-overlay-max-h));
|
|
121
|
-
/* 模态命令面板与 Dialog 同档:overlay 圆角 + sheet 三件套(material-elevated 的边 / 底 /
|
|
124
|
+
/* 模态命令面板与 Dialog 同档:overlay 圆角 + sheet 三件套(material-elevated 的边 / 底 / 影),
|
|
122
125
|
边界由描边承担,不再只靠落影 */
|
|
123
126
|
border: var(--xh-stroke-thin) solid var(--xh-command-border, var(--xh-material-elevated-border));
|
|
124
127
|
border-radius: var(--xh-command-radius, var(--xh-shape-overlay));
|
|
@@ -146,10 +149,9 @@
|
|
|
146
149
|
outline: none;
|
|
147
150
|
}
|
|
148
151
|
|
|
149
|
-
|
|
152
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
153
|
+
[data-scope='command'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
150
154
|
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
155
|
}
|
|
154
156
|
|
|
155
157
|
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
@@ -159,24 +161,28 @@
|
|
|
159
161
|
}
|
|
160
162
|
|
|
161
163
|
/* —— 检索框 —— */
|
|
162
|
-
/*
|
|
164
|
+
/* 面板内嵌的搜索框:通栏一行,控件高与字号随尺寸档,底下一道面内分隔(sheet 面的分隔令牌)把它与结果分开;
|
|
165
|
+
框自己不画边不画底,边界归面板。重置与占位前景由字段家族按 data-xh-field-input 给 */
|
|
163
166
|
[data-scope='command'][data-part='input'] {
|
|
167
|
+
--xh-field-placeholder-fg: var(--xh-command-placeholder-fg, var(--xh-fg-subtle));
|
|
168
|
+
|
|
164
169
|
flex: none;
|
|
165
170
|
inline-size: 100%;
|
|
166
171
|
block-size: var(--xh-command-input-h, var(--xh-_command-input-h));
|
|
167
172
|
padding-block: 0;
|
|
168
173
|
padding-inline: var(--xh-command-input-px, var(--xh-_command-px));
|
|
169
174
|
border: 0;
|
|
170
|
-
border-block-end: var(--xh-stroke-thin) solid var(--xh-command-input-border, var(--xh-
|
|
175
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-command-input-border, var(--xh-material-elevated-separator));
|
|
171
176
|
border-radius: 0;
|
|
172
177
|
background: transparent;
|
|
173
178
|
color: var(--xh-command-input-fg, var(--xh-fg-default));
|
|
174
179
|
font-family: inherit;
|
|
175
|
-
font-size: var(--xh-command-input-font-size, var(--xh-
|
|
180
|
+
font-size: var(--xh-command-input-font-size, var(--xh-_command-font-size));
|
|
176
181
|
}
|
|
177
182
|
|
|
178
|
-
|
|
179
|
-
|
|
183
|
+
/* 聚焦不画环:插入符就是焦点指示。框没有外壳,全局那圈键盘焦点环只会压在通栏一行上 */
|
|
184
|
+
[data-scope='command'][data-part='input']:focus-visible {
|
|
185
|
+
outline: none;
|
|
180
186
|
}
|
|
181
187
|
|
|
182
188
|
/* 自动填充态:浏览器给填过的框强加一套系统色(多数引擎是黄底黑字),
|
|
@@ -205,9 +211,10 @@
|
|
|
205
211
|
min-block-size: 0;
|
|
206
212
|
padding-block: var(--xh-command-list-py, var(--xh-space-2));
|
|
207
213
|
padding-inline: var(--xh-command-list-px, var(--xh-space-2));
|
|
208
|
-
/*
|
|
214
|
+
/* 模态面板里的滚动面:到底后不把滚动链穿透给页面 */
|
|
209
215
|
overflow-y: auto;
|
|
210
216
|
overscroll-behavior: contain;
|
|
217
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
211
218
|
}
|
|
212
219
|
|
|
213
220
|
/* 没有可见命令时不保留列表的上下内距;只排除列表内部 hidden 祖先,退场中的外壳不影响判断。 */
|
|
@@ -242,7 +249,7 @@
|
|
|
242
249
|
display: block;
|
|
243
250
|
padding-block: var(--xh-command-group-label-py, var(--xh-space-1));
|
|
244
251
|
padding-inline: var(--xh-command-group-label-px, var(--xh-_command-px));
|
|
245
|
-
color: var(--xh-command-group-label-fg, var(--xh-fg-
|
|
252
|
+
color: var(--xh-command-group-label-fg, var(--xh-fg-muted));
|
|
246
253
|
font-size: var(--xh-command-group-label-font-size, var(--xh-text-caption-size));
|
|
247
254
|
font-weight: var(--xh-command-group-label-font-weight, var(--xh-font-weight-medium));
|
|
248
255
|
line-height: var(--xh-leading-none);
|
|
@@ -260,7 +267,7 @@
|
|
|
260
267
|
--xh-collection-inline-padding: var(--xh-command-item-px, var(--xh-_command-px));
|
|
261
268
|
--xh-collection-gap: 0;
|
|
262
269
|
--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-
|
|
270
|
+
--xh-collection-radius: var(--xh-command-item-radius, var(--xh-shape-inset));
|
|
264
271
|
--xh-collection-fg-rest: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
265
272
|
--xh-collection-fg-hover: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
266
273
|
--xh-collection-fg-keyboard-highlight: var(--xh-command-item-fg, var(--xh-fg-default));
|
|
@@ -287,32 +294,13 @@
|
|
|
287
294
|
user-select: none;
|
|
288
295
|
}
|
|
289
296
|
|
|
290
|
-
/*
|
|
291
|
-
|
|
292
|
-
|
|
297
|
+
/* 新插进列表的命令(宿主追加、异步取回的一批)自上而下逐条冒出来,同一批按到达顺序错开(序号封顶,命令再多也
|
|
298
|
+
不会拖出一条越来越慢的尾巴)。打开时已有的结果直接呈现:自己或本列表带 data-instant。
|
|
299
|
+
检索过滤筛掉的条目带 hidden 不生成盒子,重新露面只是换一批已有结果,机器给它打上 data-instant 直接呈现。
|
|
300
|
+
backwards 让每条在自己那份延迟里保持起始帧 */
|
|
301
|
+
[data-scope='command'][data-part='list'] [data-part='item']:not([data-instant], [data-scope='command'][data-part='list'][data-instant] *) {
|
|
293
302
|
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));
|
|
303
|
+
animation-delay: calc(var(--xh-_stagger-index, 0) * var(--xh-motion-stagger-step));
|
|
316
304
|
}
|
|
317
305
|
|
|
318
306
|
[data-scope='command'][data-part='item-text'] {
|
|
@@ -329,9 +317,9 @@
|
|
|
329
317
|
[data-scope='command'][data-part='empty'] {
|
|
330
318
|
display: block;
|
|
331
319
|
flex: none;
|
|
332
|
-
padding-block: var(--xh-command-empty-py, var(--xh-space-
|
|
320
|
+
padding-block: var(--xh-command-empty-py, var(--xh-space-3));
|
|
333
321
|
padding-inline: var(--xh-command-empty-px, var(--xh-_command-px));
|
|
334
|
-
color: var(--xh-command-empty-fg, var(--xh-fg-
|
|
322
|
+
color: var(--xh-command-empty-fg, var(--xh-fg-muted));
|
|
335
323
|
font-size: var(--xh-command-empty-font-size, var(--xh-_command-font-size));
|
|
336
324
|
line-height: var(--xh-leading-none);
|
|
337
325
|
text-align: center;
|
|
@@ -339,23 +327,35 @@
|
|
|
339
327
|
|
|
340
328
|
/* 在途占位:与空态占位同一个位置、同一副观感,两者不同屏 */
|
|
341
329
|
[data-scope='command'][data-part='loading'] {
|
|
342
|
-
display:
|
|
330
|
+
display: flex;
|
|
331
|
+
align-items: center;
|
|
332
|
+
justify-content: center;
|
|
333
|
+
gap: var(--xh-_command-gap);
|
|
343
334
|
flex: none;
|
|
344
|
-
padding-block: var(--xh-command-loading-py, var(--xh-space-
|
|
335
|
+
padding-block: var(--xh-command-loading-py, var(--xh-space-3));
|
|
345
336
|
padding-inline: var(--xh-command-loading-px, var(--xh-_command-px));
|
|
346
|
-
color: var(--xh-command-loading-fg, var(--xh-fg-
|
|
337
|
+
color: var(--xh-command-loading-fg, var(--xh-fg-muted));
|
|
347
338
|
font-size: var(--xh-command-loading-font-size, var(--xh-_command-font-size));
|
|
348
339
|
line-height: var(--xh-leading-none);
|
|
349
340
|
text-align: center;
|
|
350
341
|
}
|
|
351
342
|
|
|
343
|
+
/* 首次加载:文案前一枚加载环,由加载环配方画(连接层投影 data-xh-loading-ring 与 data-loading),
|
|
344
|
+
直径取所在尺寸档的图标档 */
|
|
345
|
+
[data-scope='command'][data-part='loading']::before {
|
|
346
|
+
content: '';
|
|
347
|
+
flex: none;
|
|
348
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
349
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
350
|
+
}
|
|
351
|
+
|
|
352
352
|
/* 未提供状态内容时不渲染一块纯留白,提示文案仍由作者明确提供。 */
|
|
353
353
|
[data-scope='command'][data-part='empty']:empty,
|
|
354
354
|
[data-scope='command'][data-part='loading']:empty {
|
|
355
355
|
display: none;
|
|
356
356
|
}
|
|
357
357
|
|
|
358
|
-
/*
|
|
358
|
+
/* 刷新:已有命令时后台在取,保留上一帧,列表按 micro 淡下,数据到了再淡回;在途占位此时让位 */
|
|
359
359
|
[data-scope='command'][data-part='list'][aria-busy='true'] {
|
|
360
360
|
opacity: var(--xh-command-list-busy-opacity, var(--xh-state-disabled-opacity));
|
|
361
361
|
}
|
|
@@ -369,7 +369,7 @@
|
|
|
369
369
|
gap: var(--xh-command-footer-gap, var(--xh-space-2));
|
|
370
370
|
padding-block: var(--xh-command-footer-py, var(--xh-space-2));
|
|
371
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-
|
|
372
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-command-footer-border, var(--xh-material-elevated-separator));
|
|
373
373
|
color: var(--xh-command-footer-fg, var(--xh-fg-muted));
|
|
374
374
|
font-size: var(--xh-command-footer-font-size, var(--xh-text-caption-size));
|
|
375
375
|
}
|