@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
package/css/cascader.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 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -62,7 +65,7 @@
|
|
|
62
65
|
/* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
|
|
63
66
|
[data-scope='cascader']:is([data-part='root'], [data-part='positioner']) {
|
|
64
67
|
/* 作者塞进触发器指示符槽的图标跟着尺寸档走,与皮肤画的兜底字形同一把尺;列里条目的由家族随
|
|
65
|
-
data-xh-collection-size
|
|
68
|
+
data-xh-collection-size 下发。级联选择器自绘的状态字形(标记盒里的勾与半选杠、分支箭头)
|
|
66
69
|
不读这支:它们是指示符,走 --xh-control-indicator-* 一族——标记盒在自己身上把 --xh-icon-size 改接到
|
|
67
70
|
盒的尺,分支箭头走 --xh-cascader-branch-arrow-size */
|
|
68
71
|
--xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-md));
|
|
@@ -208,6 +211,18 @@
|
|
|
208
211
|
color: var(--xh-fg-disabled);
|
|
209
212
|
}
|
|
210
213
|
|
|
214
|
+
/* 标签行:触发器里收着可见标签与 +N 那一枚的一行,行里每一枚都是 tag(data-scope="tag"),样子归 tag.css;
|
|
215
|
+
行怎么排、标签怎么进出归标签行家族配方(family/tag-list.css),这里只把使用者的间距槽接进去 */
|
|
216
|
+
[data-scope='cascader'][data-part='tag-list'] {
|
|
217
|
+
--xh-tag-list-gap: var(--xh-cascader-tag-list-gap, var(--xh-space-1));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* 标签行露面时 value-text 让位:两者是触发器里的同一格,占位文字与标签不同屏。
|
|
221
|
+
value-text 留在 DOM 里,trigger 的可及名仍从它取到完整的选中路径文本 */
|
|
222
|
+
[data-scope='cascader'][data-part='trigger']:has([data-part='tag-list']:not([hidden])) [data-part='value-text'] {
|
|
223
|
+
display: none;
|
|
224
|
+
}
|
|
225
|
+
|
|
211
226
|
/* 有值时清空钮顶上来,箭头让位:两个图标并排堆着,用户分不清点哪个。
|
|
212
227
|
判据查的是盒里此刻真有一颗没收起的清空钮,不是「有没有值」——
|
|
213
228
|
作者没摆清空钮时箭头照常留着,不然让了位没人接,指示符整个消失 */
|
|
@@ -221,7 +236,7 @@
|
|
|
221
236
|
align-items: center;
|
|
222
237
|
justify-content: center;
|
|
223
238
|
color: var(--xh-cascader-indicator-fg, var(--xh-fg-muted));
|
|
224
|
-
transition: rotate var(--xh-motion-duration-
|
|
239
|
+
transition: rotate var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
|
|
225
240
|
}
|
|
226
241
|
|
|
227
242
|
[data-scope='cascader'][data-part='indicator'][hidden] {
|
|
@@ -279,22 +294,24 @@
|
|
|
279
294
|
}
|
|
280
295
|
|
|
281
296
|
/* 级联的骨架就在这一条上:列沿书写方向并排,一层一列。
|
|
282
|
-
|
|
297
|
+
面板型浮层:每一列按条目的自然宽度,不随字段盒拉伸,面板随列数伸展。
|
|
298
|
+
面板含多列,材质取 floating:实体底 + border-default 描边 + 浮起投影,不透景 */
|
|
283
299
|
[data-scope='cascader'][data-part='content'] {
|
|
284
300
|
position: relative;
|
|
285
301
|
display: flex;
|
|
286
302
|
flex-direction: row;
|
|
287
303
|
align-items: stretch;
|
|
288
|
-
/*
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
304
|
+
/* 面板的下界:搜索视图与两个占位没有列托底,靠这一条不缩成一小块;可用区比它还窄时让位。
|
|
305
|
+
可用宽写在定位层上、沿继承流下来 */
|
|
306
|
+
min-inline-size: min(var(--xh-cascader-content-min-w, var(--xh-overlay-menu-min-w)), var(--xh-_cascader-available-w));
|
|
307
|
+
/* 列多起来时外框宽过可用区就收成可用宽度,溢出的列交给下面那条 overflow-x;
|
|
308
|
+
缺省不封顶,作者要封顶写 --xh-cascader-content-max-w */
|
|
309
|
+
max-inline-size: min(var(--xh-cascader-content-max-w, var(--xh-_cascader-available-w)), var(--xh-_cascader-available-w));
|
|
310
|
+
border: var(--xh-stroke-thin) solid var(--xh-cascader-content-border, var(--xh-border-default));
|
|
292
311
|
border-radius: var(--xh-cascader-content-radius, var(--xh-shape-overlay));
|
|
293
|
-
background: var(--xh-cascader-content-bg, var(--xh-
|
|
294
|
-
color: var(--xh-cascader-content-fg, var(--xh-
|
|
295
|
-
box-shadow: var(--xh-cascader-content-shadow, var(--xh-
|
|
296
|
-
-webkit-backdrop-filter: var(--xh-cascader-content-backdrop, var(--xh-material-frosted-backdrop));
|
|
297
|
-
backdrop-filter: var(--xh-cascader-content-backdrop, var(--xh-material-frosted-backdrop));
|
|
312
|
+
background: var(--xh-cascader-content-bg, var(--xh-bg-surface));
|
|
313
|
+
color: var(--xh-cascader-content-fg, var(--xh-fg-default));
|
|
314
|
+
box-shadow: var(--xh-cascader-content-shadow, var(--xh-elevation-floating));
|
|
298
315
|
/* 列多到放不下时整体横向滚动;纵向溢出归每一列自己 */
|
|
299
316
|
overflow-x: auto;
|
|
300
317
|
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
@@ -305,18 +322,6 @@
|
|
|
305
322
|
--xh-scrollbar-track-bg: transparent;
|
|
306
323
|
}
|
|
307
324
|
|
|
308
|
-
/* 唯一外壳的内侧顶光;列和状态部件不另画材质面。 */
|
|
309
|
-
[data-scope='cascader'][data-part='content']::before {
|
|
310
|
-
content: '';
|
|
311
|
-
position: absolute;
|
|
312
|
-
inset-block-start: 0;
|
|
313
|
-
inset-inline: 0;
|
|
314
|
-
block-size: var(--xh-stroke-thin);
|
|
315
|
-
border-radius: inherit;
|
|
316
|
-
background: var(--xh-cascader-content-highlight, var(--xh-material-frosted-highlight));
|
|
317
|
-
pointer-events: none;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
325
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
321
326
|
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
322
327
|
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
@@ -328,10 +333,9 @@
|
|
|
328
333
|
outline: none;
|
|
329
334
|
}
|
|
330
335
|
|
|
331
|
-
|
|
336
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
337
|
+
[data-scope='cascader'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
332
338
|
animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
333
|
-
/* 只在开着的这一档挂:合成层随 data-state 一起收走,收起后不再占着 */
|
|
334
|
-
will-change: opacity, translate;
|
|
335
339
|
}
|
|
336
340
|
|
|
337
341
|
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
@@ -347,13 +351,21 @@
|
|
|
347
351
|
flex: none;
|
|
348
352
|
flex-direction: column;
|
|
349
353
|
gap: var(--xh-cascader-column-gap, var(--xh-list-option-gap));
|
|
350
|
-
|
|
354
|
+
/* 每一列按条目的自然宽度,受菜单的下界托底;长选项撑到条目的上限为止,余下的在条目里截断 */
|
|
355
|
+
min-inline-size: var(--xh-cascader-column-min-w, var(--xh-overlay-menu-min-w));
|
|
351
356
|
block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
|
|
352
357
|
padding-block: var(--xh-cascader-column-py, var(--xh-space-1));
|
|
353
358
|
padding-inline: var(--xh-cascader-column-px, var(--xh-space-1));
|
|
354
359
|
overflow-y: auto;
|
|
355
360
|
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
356
361
|
overscroll-behavior: contain;
|
|
362
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/* 刷新:已有候选时后台在取,保留上一帧,列与候选列表按 micro 淡下,数据到了再淡回;在途占位此时让位。
|
|
366
|
+
淡的是列不是面:content 是整块浮起面,整块淡下去面就透了 */
|
|
367
|
+
[data-scope='cascader'][data-part='content'][aria-busy='true'] > [data-scope='cascader']:is([data-part='column'], [data-part='search-list']) {
|
|
368
|
+
opacity: var(--xh-state-disabled-opacity);
|
|
357
369
|
}
|
|
358
370
|
|
|
359
371
|
/* 展开路径砍短了这一列就收起来。display 盖掉了 UA 的 [hidden]{display:none},
|
|
@@ -366,7 +378,7 @@
|
|
|
366
378
|
用逻辑属性,rtl 下自动跑到另一侧。每列后面紧跟着它自己的竖条节点,相邻选择器接不到下一列,
|
|
367
379
|
按「前面有过列」取后续的列 */
|
|
368
380
|
[data-scope='cascader'][data-part='column'] ~ [data-scope='cascader'][data-part='column'] {
|
|
369
|
-
border-inline-start: var(--xh-stroke-thin) solid var(--xh-cascader-column-divider, var(--xh-material-
|
|
381
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-cascader-column-divider, var(--xh-material-solid-separator));
|
|
370
382
|
}
|
|
371
383
|
|
|
372
384
|
[data-scope='cascader'][data-part='column']:not([tabindex='0']):focus-visible {
|
|
@@ -395,7 +407,7 @@
|
|
|
395
407
|
display: block;
|
|
396
408
|
padding-block: var(--xh-cascader-group-label-py, var(--xh-space-1));
|
|
397
409
|
padding-inline: var(--xh-cascader-group-label-px, var(--xh-_cascader-row-px));
|
|
398
|
-
color: var(--xh-cascader-group-label-fg, var(--xh-
|
|
410
|
+
color: var(--xh-cascader-group-label-fg, var(--xh-fg-muted));
|
|
399
411
|
font-size: var(--xh-cascader-group-label-font-size, var(--xh-text-caption-size));
|
|
400
412
|
font-weight: var(--xh-cascader-group-label-font-weight, var(--xh-font-weight-medium));
|
|
401
413
|
line-height: var(--xh-leading-none);
|
|
@@ -419,7 +431,7 @@
|
|
|
419
431
|
--xh-collection-inline-padding: var(--xh-cascader-item-px, var(--xh-_cascader-row-px));
|
|
420
432
|
--xh-collection-gap: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
|
|
421
433
|
--xh-collection-font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
|
|
422
|
-
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-
|
|
434
|
+
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-inset));
|
|
423
435
|
--xh-collection-glyph-size: var(--xh-cascader-icon-size, var(--xh-_collection-glyph-size));
|
|
424
436
|
--xh-collection-fg-rest: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
425
437
|
--xh-collection-fg-hover: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
@@ -465,9 +477,33 @@
|
|
|
465
477
|
display: none;
|
|
466
478
|
}
|
|
467
479
|
|
|
468
|
-
/*
|
|
469
|
-
|
|
470
|
-
[data-scope='cascader'][data-part='
|
|
480
|
+
/* 懒分支取数失败不预设错误面:失败由那一列里的提示与重试钮说明,父条目仍是一条可激活的普通条目,
|
|
481
|
+
与树选择同一口径。家族按 data-error 给的告警面(危险色字压在危险色淡底上,对比不到 4.5:1)在这里映射回常态 */
|
|
482
|
+
[data-scope='cascader'][data-part='item'][data-error] {
|
|
483
|
+
--xh-collection-bg-error: transparent;
|
|
484
|
+
--xh-collection-fg-error: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
485
|
+
--xh-collection-description-fg-error: var(--xh-material-frosted-fg-muted);
|
|
486
|
+
--xh-collection-indicator-fg-error: var(--xh-_cascader-accent);
|
|
487
|
+
--xh-collection-outline-error: transparent;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/* 取数失败的条目仍可激活(点行或 Enter 重试),而家族的悬停、高亮、展开路径与按下几段都排除了 [data-error]:
|
|
491
|
+
在家族解算点上把同一阶梯接回——悬停、键盘高亮与展开路径 100 档,按下 200 档并走按下时长 */
|
|
492
|
+
[data-scope='cascader'][data-part='item'][data-error]:not([data-disabled]):is(:hover, [data-highlighted], [data-in-path]) {
|
|
493
|
+
--xh-_collection-bg: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
[data-scope='cascader'][data-part='item'][data-error]:not([data-disabled]):is(:active, [data-pressed]) {
|
|
497
|
+
--xh-_collection-bg: var(--xh-cascader-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
498
|
+
|
|
499
|
+
transition-duration: var(--xh-motion-duration-press);
|
|
500
|
+
transition-timing-function: var(--xh-motion-ease-press);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/* 一列开幕:条目自上而下逐条淡入。只在列头一次出现时播(浮层展开、此前收着的子列铺出来);
|
|
504
|
+
列此前就在、展开路径换到同列另一个父项时(悬停扫过),连接层给露面的条目标 data-instant,
|
|
505
|
+
换内容不重播。backwards 让每条在自己那份延迟里保持起始帧 */
|
|
506
|
+
[data-scope='cascader'][data-part='column'] [data-part='item']:not([data-instant]) {
|
|
471
507
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) backwards;
|
|
472
508
|
}
|
|
473
509
|
|
|
@@ -504,7 +540,7 @@
|
|
|
504
540
|
/* 分支条目行尾画右向小箭头:不点开也看得出还有下一级。落在家族网格的 suffix 列、跨两行居中。
|
|
505
541
|
与菜单族的子菜单箭头同走字形令牌——此前这里是「描全边框再抹掉两条、把剩下的直角旋 45 度」,
|
|
506
542
|
作者换掉标记时换不动它,RTL 还得再翻一次旋转角。
|
|
507
|
-
|
|
543
|
+
箭头是指示符:与同一行的标记盒同走 --xh-control-indicator-size,不读家族按档下发的
|
|
508
544
|
--xh-icon-size——按图标档取的 20px 会比 16px 的标记盒大一圈 */
|
|
509
545
|
[data-scope='cascader'][data-part='item'][data-branch]::after {
|
|
510
546
|
content: '';
|
|
@@ -537,7 +573,7 @@
|
|
|
537
573
|
|
|
538
574
|
/* 勾选标记落在家族网格的 indicator 列,只在选中项上显形(家族按 aria-selected / data-state=checked 给);
|
|
539
575
|
未选中时占位不塌,切换选中不引起行宽抖动。
|
|
540
|
-
|
|
576
|
+
盒里的勾与半选杠是指示符:盒在自己身上把 --xh-icon-size 改接到盒的尺,皮肤画的兜底字形与作者
|
|
541
577
|
塞进盒里的 XhIcon 读同一把尺、与盒同边长(行尾标记不是勾选格,不取 × 0.75,与搜索候选行尾的勾同尺);
|
|
542
578
|
不读家族按档下发到行的 --xh-icon-size——那支只管作者放进条目里的图标,按图标档取的 20px 会比 16 / 14 的盒还大 */
|
|
543
579
|
[data-scope='cascader'][data-part='item-indicator'] {
|
|
@@ -555,7 +591,9 @@
|
|
|
555
591
|
}
|
|
556
592
|
|
|
557
593
|
/* 没写内容就由皮肤画勾;作者往部件里塞了自己的图形,这条规则即不命中。
|
|
558
|
-
尺寸读标记盒自己改接过的 --xh-icon-size
|
|
594
|
+
尺寸读标记盒自己改接过的 --xh-icon-size:与盒同边长,随指示符档换档(见上面标记盒那块)。
|
|
595
|
+
勾与半选杠叠成两层遮罩,按状态只换两层的尺寸:离开半选淡出的那一段里横杠留着,
|
|
596
|
+
淡出播完才换回勾——不在淡出途中闪出一枚勾 */
|
|
559
597
|
[data-scope='cascader'][data-part='item-indicator']:empty::before {
|
|
560
598
|
content: '';
|
|
561
599
|
display: inline-block;
|
|
@@ -563,25 +601,27 @@
|
|
|
563
601
|
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
564
602
|
vertical-align: var(--xh-glyph-baseline-shift);
|
|
565
603
|
background-color: currentColor;
|
|
566
|
-
-webkit-mask: var(--xh-glyph-mark-check) center /
|
|
567
|
-
mask: var(--xh-glyph-mark-check) center /
|
|
604
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
|
|
605
|
+
mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
|
|
606
|
+
transition:
|
|
607
|
+
-webkit-mask-size 0s var(--xh-motion-duration-micro),
|
|
608
|
+
mask-size 0s var(--xh-motion-duration-micro);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
[data-scope='cascader'][data-part='item-indicator'][data-state='checked']:empty::before {
|
|
612
|
+
transition-delay: 0s;
|
|
568
613
|
}
|
|
569
614
|
|
|
570
615
|
/* 级联勾选的半选态只在皮肤自绘(:empty)时露面画横杠:
|
|
571
616
|
作者塞了自己的选中图形时,半选放出来会顶着一个语义相反的勾,表达交还作者 */
|
|
572
617
|
[data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty {
|
|
573
|
-
|
|
618
|
+
opacity: 1;
|
|
574
619
|
}
|
|
575
620
|
|
|
576
621
|
[data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty::before {
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
581
|
-
vertical-align: var(--xh-glyph-baseline-shift);
|
|
582
|
-
background-color: currentColor;
|
|
583
|
-
-webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
584
|
-
mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
622
|
+
-webkit-mask-size: 0 0, 100% 100%;
|
|
623
|
+
mask-size: 0 0, 100% 100%;
|
|
624
|
+
transition-delay: 0s;
|
|
585
625
|
}
|
|
586
626
|
|
|
587
627
|
/* 家族按行的禁用降级标记色;半选横线也一并跟着 */
|
|
@@ -594,13 +634,24 @@
|
|
|
594
634
|
flex-wrap: wrap;
|
|
595
635
|
}
|
|
596
636
|
|
|
637
|
+
/* 面板内嵌的搜索框:通栏一行,控件高与字号随尺寸档,只画一道面内分隔的下划线(取面材质的分隔令牌);
|
|
638
|
+
重置与占位前景由字段家族按 data-xh-field-input 给,占位与值文本的占位同一支组件槽 */
|
|
597
639
|
[data-scope='cascader'][data-part='input'] {
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
640
|
+
--xh-field-placeholder-fg: var(--xh-cascader-placeholder-fg, var(--xh-fg-subtle));
|
|
641
|
+
|
|
642
|
+
/* 搜索框不参与定宽,面板宽度只由列(搜索视图里是候选列表)撑出:换行的 flex 容器按内容定宽时
|
|
643
|
+
把各项的固有宽度相加,原生输入框自带约 20 个字符的固有宽,内衬也算在里面。
|
|
644
|
+
内容宽取 0,落位后由 min-inline-size 铺满整行;内衬由等量的负外边距在宽度贡献里抵掉,
|
|
645
|
+
盒子本身仍铺满整行,下一项照样折到下一行 */
|
|
646
|
+
flex: none;
|
|
647
|
+
inline-size: 0;
|
|
648
|
+
min-inline-size: 100%;
|
|
649
|
+
margin-inline-end: calc(-2 * var(--xh-cascader-input-px, var(--xh-_cascader-px)));
|
|
650
|
+
block-size: var(--xh-cascader-input-h, var(--xh-_cascader-h));
|
|
651
|
+
padding-block: 0;
|
|
652
|
+
padding-inline: var(--xh-cascader-input-px, var(--xh-_cascader-px));
|
|
602
653
|
border: none;
|
|
603
|
-
border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-material-
|
|
654
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-material-solid-separator));
|
|
604
655
|
border-start-start-radius: inherit;
|
|
605
656
|
border-start-end-radius: inherit;
|
|
606
657
|
background: none;
|
|
@@ -610,6 +661,11 @@
|
|
|
610
661
|
line-height: var(--xh-leading-normal);
|
|
611
662
|
}
|
|
612
663
|
|
|
664
|
+
/* 聚焦不画环:插入符就是焦点指示。框没有外壳,全局那圈键盘焦点环只会压在通栏一行上 */
|
|
665
|
+
[data-scope='cascader'][data-part='input']:focus-visible {
|
|
666
|
+
outline: none;
|
|
667
|
+
}
|
|
668
|
+
|
|
613
669
|
[data-scope='cascader'][data-part='input'][hidden] {
|
|
614
670
|
display: none;
|
|
615
671
|
}
|
|
@@ -641,6 +697,7 @@
|
|
|
641
697
|
overflow-y: auto;
|
|
642
698
|
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
643
699
|
overscroll-behavior: contain;
|
|
700
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
644
701
|
}
|
|
645
702
|
|
|
646
703
|
[data-scope='cascader'][data-part='search-list'][hidden] {
|
|
@@ -665,7 +722,7 @@
|
|
|
665
722
|
--xh-collection-inline-padding: var(--xh-cascader-item-px, var(--xh-_cascader-row-px));
|
|
666
723
|
--xh-collection-gap: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
|
|
667
724
|
--xh-collection-font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
|
|
668
|
-
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-
|
|
725
|
+
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-inset));
|
|
669
726
|
--xh-collection-fg-rest: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
670
727
|
--xh-collection-fg-hover: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
671
728
|
--xh-collection-fg-keyboard-highlight: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
@@ -720,19 +777,26 @@
|
|
|
720
777
|
block-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
|
|
721
778
|
translate: 0 -50%;
|
|
722
779
|
background-color: var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent));
|
|
723
|
-
|
|
724
|
-
-webkit-mask: var(--xh-glyph-mark-check) center /
|
|
725
|
-
mask: var(--xh-glyph-mark-check) center /
|
|
780
|
+
opacity: 0;
|
|
781
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
|
|
782
|
+
mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
|
|
783
|
+
/* 与列里的对号同一条淡变;离开半选时横杠留到淡出播完再换回勾 */
|
|
784
|
+
transition:
|
|
785
|
+
opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
786
|
+
-webkit-mask-size 0s var(--xh-motion-duration-micro),
|
|
787
|
+
mask-size 0s var(--xh-motion-duration-micro);
|
|
726
788
|
}
|
|
727
789
|
|
|
728
790
|
[data-scope='cascader'][data-part='search-item'][data-state='checked']::after {
|
|
729
|
-
|
|
791
|
+
opacity: 1;
|
|
792
|
+
transition-delay: 0s;
|
|
730
793
|
}
|
|
731
794
|
|
|
732
795
|
[data-scope='cascader'][data-part='search-item'][data-state='indeterminate']::after {
|
|
733
|
-
|
|
734
|
-
-webkit-mask-
|
|
735
|
-
mask-
|
|
796
|
+
opacity: 1;
|
|
797
|
+
-webkit-mask-size: 0 0, 100% 100%;
|
|
798
|
+
mask-size: 0 0, 100% 100%;
|
|
799
|
+
transition-delay: 0s;
|
|
736
800
|
}
|
|
737
801
|
|
|
738
802
|
[data-scope='cascader'][data-part='search-item'][data-disabled]::after {
|
|
@@ -754,10 +818,8 @@
|
|
|
754
818
|
flex: 1 1 100%;
|
|
755
819
|
align-items: center;
|
|
756
820
|
justify-content: center;
|
|
757
|
-
min-inline-size: var(--xh-cascader-column-min-w, 7rem);
|
|
758
|
-
min-block-size: var(--xh-cascader-empty-min-h, 5rem);
|
|
759
821
|
padding: var(--xh-cascader-empty-p, var(--xh-space-3));
|
|
760
|
-
color: var(--xh-cascader-empty-fg, var(--xh-
|
|
822
|
+
color: var(--xh-cascader-empty-fg, var(--xh-fg-muted));
|
|
761
823
|
font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
|
|
762
824
|
}
|
|
763
825
|
|
|
@@ -771,10 +833,9 @@
|
|
|
771
833
|
flex: 0 0 100%;
|
|
772
834
|
align-items: center;
|
|
773
835
|
justify-content: center;
|
|
774
|
-
|
|
775
|
-
min-block-size: var(--xh-cascader-loading-min-h, 5rem);
|
|
836
|
+
gap: var(--xh-_cascader-gap);
|
|
776
837
|
padding: var(--xh-cascader-loading-p, var(--xh-space-3));
|
|
777
|
-
color: var(--xh-cascader-loading-fg, var(--xh-
|
|
838
|
+
color: var(--xh-cascader-loading-fg, var(--xh-fg-muted));
|
|
778
839
|
font-size: var(--xh-cascader-loading-font-size, var(--xh-_cascader-font-size));
|
|
779
840
|
}
|
|
780
841
|
|
|
@@ -782,6 +843,41 @@
|
|
|
782
843
|
display: none;
|
|
783
844
|
}
|
|
784
845
|
|
|
846
|
+
/* 懒分支那一列:条目还没取回时列里只有一句次要文字(在途或失败),失败时下面跟一颗重试钮;
|
|
847
|
+
三块同一时刻至多露一种,露哪一块归连接层。文字的观感与整浮层的在途占位同一档 */
|
|
848
|
+
[data-scope='cascader'][data-part='branch-loading'],
|
|
849
|
+
[data-scope='cascader'][data-part='branch-error'] {
|
|
850
|
+
display: flex;
|
|
851
|
+
flex: none;
|
|
852
|
+
align-items: center;
|
|
853
|
+
justify-content: center;
|
|
854
|
+
padding-block: var(--xh-cascader-branch-status-py, var(--xh-space-3));
|
|
855
|
+
padding-inline: var(--xh-cascader-branch-status-px, var(--xh-_cascader-row-px));
|
|
856
|
+
color: var(--xh-cascader-branch-status-fg, var(--xh-material-frosted-fg-muted));
|
|
857
|
+
font-size: var(--xh-cascader-branch-status-font-size, var(--xh-_cascader-font-size));
|
|
858
|
+
text-align: center;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
/* 重试钮是 Action Control 家族的 text ghost 档,盒与按压都归家族;这里只让它在列里居中 */
|
|
862
|
+
[data-scope='cascader'][data-part='branch-retry-trigger'] {
|
|
863
|
+
align-self: center;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
[data-scope='cascader'][data-part='branch-loading'][hidden],
|
|
867
|
+
[data-scope='cascader'][data-part='branch-error'][hidden],
|
|
868
|
+
[data-scope='cascader'][data-part='branch-retry-trigger'][hidden] {
|
|
869
|
+
display: none;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
/* 首次加载:文案前一枚加载环,由加载环配方画(连接层投影 data-xh-loading-ring 与 data-loading),
|
|
873
|
+
直径取所在尺寸档的图标档 */
|
|
874
|
+
[data-scope='cascader'][data-part='loading']::before {
|
|
875
|
+
content: '';
|
|
876
|
+
flex: none;
|
|
877
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
878
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
879
|
+
}
|
|
880
|
+
|
|
785
881
|
/* 底栏在场时浮层壳允许换行:列照旧并排在第一行,底栏占满一整行落在列下面。
|
|
786
882
|
没写底栏的浮层不命中这条,列多到放不下时仍是整体横向滚动 */
|
|
787
883
|
[data-scope='cascader'][data-part='content']:has(> [data-part='footer']) {
|
|
@@ -820,17 +916,35 @@
|
|
|
820
916
|
}
|
|
821
917
|
|
|
822
918
|
@media (forced-colors: active) {
|
|
823
|
-
/* 蒙版底色会被系统改成 Canvas 而消失;明确用系统前景保住箭头、对号与半选横线。
|
|
919
|
+
/* 蒙版底色会被系统改成 Canvas 而消失;明确用系统前景保住箭头、对号与半选横线。
|
|
920
|
+
按下与没被高亮时的悬停,家族把条目涂成 Highlight,字形跟着换 HighlightText。
|
|
921
|
+
触发器里的下拉箭头落在字段面上取 CanvasText,字段禁用时取 GrayText;
|
|
922
|
+
清除钮是按钮面,取 ButtonText,悬停与按下换 HighlightText,禁用取 GrayText */
|
|
824
923
|
[data-scope='cascader'][data-part='item'][data-branch]::after,
|
|
825
924
|
[data-scope='cascader'][data-part='item-indicator']:empty::before,
|
|
826
|
-
[data-scope='cascader'][data-part='search-item']::after
|
|
925
|
+
[data-scope='cascader'][data-part='search-item']::after,
|
|
926
|
+
[data-scope='cascader'][data-part='indicator']:empty::before {
|
|
827
927
|
forced-color-adjust: none;
|
|
828
928
|
background-color: CanvasText;
|
|
829
929
|
}
|
|
830
930
|
|
|
931
|
+
[data-scope='cascader'][data-part='clear-trigger']:empty::before {
|
|
932
|
+
forced-color-adjust: none;
|
|
933
|
+
background-color: ButtonText;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
[data-scope='cascader'][data-part='item'][data-branch]:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted]))::after,
|
|
937
|
+
[data-scope='cascader'][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='cascader'][data-part='item-indicator']:empty::before,
|
|
938
|
+
[data-scope='cascader'][data-part='search-item']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted]))::after,
|
|
939
|
+
[data-scope='cascader'][data-part='clear-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
940
|
+
background-color: HighlightText;
|
|
941
|
+
}
|
|
942
|
+
|
|
831
943
|
[data-scope='cascader'][data-part='item'][data-branch][data-disabled]::after,
|
|
832
944
|
[data-scope='cascader'][data-part='item-indicator'][data-disabled]:empty::before,
|
|
833
|
-
[data-scope='cascader'][data-part='search-item'][data-disabled]::after
|
|
945
|
+
[data-scope='cascader'][data-part='search-item'][data-disabled]::after,
|
|
946
|
+
[data-scope='cascader'][data-part='control'][data-disabled] [data-scope='cascader'][data-part='indicator']:empty::before,
|
|
947
|
+
[data-scope='cascader'][data-part='clear-trigger'][data-disabled]:empty::before {
|
|
834
948
|
background-color: GrayText;
|
|
835
949
|
}
|
|
836
950
|
}
|