@xihan-ui/styles 3.0.0 → 3.2.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 +63 -0
- package/README.md +1 -1
- package/component-tokens.d.ts +29 -0
- package/components.tokens.json +683 -27
- package/css/alert.css +2 -2
- package/css/approval.css +4 -4
- package/css/button.css +9 -5
- package/css/calendar-picker.css +3 -3
- package/css/calendar-range-picker.css +7 -7
- package/css/carousel.css +45 -13
- package/css/cartesian-chart.css +11 -11
- package/css/cascader.css +10 -10
- package/css/citation.css +2 -2
- package/css/code-view.css +6 -6
- package/css/color-picker.css +81 -0
- package/css/color-swatch-picker.css +9 -4
- package/css/combobox.css +12 -4
- package/css/command.css +1 -1
- package/css/date-field.css +39 -0
- package/css/date-picker.css +86 -9
- package/css/date-range-picker.css +47 -7
- package/css/diff-view.css +8 -8
- package/css/field-array.css +1 -1
- package/css/field.css +4 -0
- package/css/file-upload.css +1 -1
- package/css/float-button.css +140 -27
- package/css/form.css +14 -6
- package/css/graph-chart.css +2 -2
- package/css/highlight.css +1 -1
- package/css/image.css +1 -1
- package/css/mention.css +1 -1
- package/css/message-feed.css +1 -1
- package/css/notification.css +26 -20
- package/css/number-field.css +18 -18
- package/css/page-header.css +2 -2
- package/css/password-input.css +2 -2
- package/css/popconfirm.css +3 -3
- package/css/question-flow.css +8 -8
- package/css/radar-chart.css +6 -6
- package/css/rating.css +1 -1
- package/css/select.css +2 -2
- package/css/separator.css +2 -2
- package/css/side-nav.css +13 -13
- package/css/skeleton.css +5 -5
- package/css/slider.css +6 -6
- package/css/sortable.css +2 -2
- package/css/table.css +19 -2
- package/css/tags-input.css +1 -1
- package/css/time-picker.css +59 -2
- package/css/tool-call.css +7 -7
- package/css/tooltip.css +1 -1
- package/css/tree-select.css +2 -2
- package/css/tree.css +81 -11
- package/dist/css/accordion.css +269 -0
- package/dist/css/affix.css +47 -0
- package/dist/css/alert.css +247 -0
- package/dist/css/anchor.css +252 -0
- package/dist/css/approval.css +501 -0
- package/dist/css/avatar-group.css +99 -0
- package/dist/css/avatar.css +98 -0
- package/dist/css/back-top.css +161 -0
- package/dist/css/badge.css +205 -0
- package/dist/css/bar-code.css +62 -0
- package/dist/css/breadcrumb.css +230 -0
- package/dist/css/button-group.css +263 -0
- package/dist/css/button.css +219 -0
- package/dist/css/calendar-picker.css +467 -0
- package/dist/css/calendar-range-picker.css +554 -0
- package/dist/css/card.css +221 -0
- package/dist/css/carousel.css +710 -0
- package/dist/css/cartesian-chart.css +830 -0
- package/dist/css/cascader.css +961 -0
- package/dist/css/checkbox-group.css +358 -0
- package/dist/css/checkbox.css +257 -0
- package/dist/css/citation.css +470 -0
- package/dist/css/clipboard.css +315 -0
- package/dist/css/code-view.css +374 -0
- package/dist/css/collapsible.css +185 -0
- package/dist/css/color-field.css +176 -0
- package/dist/css/color-picker.css +595 -0
- package/dist/css/color-slider.css +281 -0
- package/dist/css/color-swatch-picker.css +250 -0
- package/dist/css/color-swatch.css +35 -0
- package/dist/css/combobox.css +574 -0
- package/dist/css/command.css +399 -0
- package/dist/css/context-menu.css +420 -0
- package/dist/css/date-field.css +317 -0
- package/dist/css/date-picker.css +868 -0
- package/dist/css/date-range-picker.css +886 -0
- package/dist/css/description.css +67 -0
- package/dist/css/descriptions.css +299 -0
- package/dist/css/dialog.css +455 -0
- package/dist/css/diff-view.css +513 -0
- package/dist/css/download-trigger.css +151 -0
- package/dist/css/drawer.css +552 -0
- package/dist/css/editable.css +295 -0
- package/dist/css/empty-state.css +163 -0
- package/dist/css/field-array.css +226 -0
- package/dist/css/field.css +166 -0
- package/dist/css/fieldset.css +102 -0
- package/dist/css/file-upload.css +429 -0
- package/dist/css/flex.css +441 -0
- package/dist/css/float-button.css +569 -0
- package/dist/css/floating-panel.css +429 -0
- package/dist/css/focus.css +46 -0
- package/dist/css/forced-colors.css +93 -0
- package/dist/css/form.css +393 -0
- package/dist/css/funnel-chart.css +106 -0
- package/dist/css/graph-chart.css +205 -0
- package/dist/css/grid-list.css +235 -0
- package/dist/css/grid.css +1201 -0
- package/dist/css/heatmap.css +552 -0
- package/dist/css/hierarchy-chart.css +298 -0
- package/dist/css/highlight.css +41 -0
- package/dist/css/hover-card.css +226 -0
- package/dist/css/icon.css +225 -0
- package/dist/css/image-cropper.css +373 -0
- package/dist/css/image-viewer.css +538 -0
- package/dist/css/image.css +98 -0
- package/dist/css/infinite-scroll.css +77 -0
- package/dist/css/input-group.css +275 -0
- package/dist/css/json-viewer.css +379 -0
- package/dist/css/kbd.css +72 -0
- package/dist/css/label.css +78 -0
- package/dist/css/layers.css +7 -0
- package/dist/css/layout.css +372 -0
- package/dist/css/liquid.css +106 -0
- package/dist/css/list.css +152 -0
- package/dist/css/listbox.css +390 -0
- package/dist/css/loading-bar.css +141 -0
- package/dist/css/log.css +306 -0
- package/dist/css/markdown-stream.css +149 -0
- package/dist/css/marquee.css +378 -0
- package/dist/css/masonry.css +70 -0
- package/dist/css/matrix-code.css +67 -0
- package/dist/css/mention.css +393 -0
- package/dist/css/menu.css +364 -0
- package/dist/css/menubar.css +456 -0
- package/dist/css/message-feed.css +318 -0
- package/dist/css/navigation-menu.css +513 -0
- package/dist/css/notification.css +782 -0
- package/dist/css/number-animation.css +44 -0
- package/dist/css/number-field.css +252 -0
- package/dist/css/overlay-arrow.css +56 -0
- package/dist/css/page-header.css +184 -0
- package/dist/css/pagination.css +450 -0
- package/dist/css/password-input.css +391 -0
- package/dist/css/pie-chart.css +247 -0
- package/dist/css/pin-input.css +199 -0
- package/dist/css/pointer.css +36 -0
- package/dist/css/popconfirm.css +320 -0
- package/dist/css/popover.css +279 -0
- package/dist/css/progress.css +501 -0
- package/dist/css/prompt-input.css +260 -0
- package/dist/css/question-flow.css +553 -0
- package/dist/css/radar-chart.css +233 -0
- package/dist/css/radio-group.css +598 -0
- package/dist/css/rating.css +294 -0
- package/dist/css/reasoning.css +343 -0
- package/dist/css/reset.css +117 -0
- package/dist/css/resizable.css +242 -0
- package/dist/css/sankey-chart.css +174 -0
- package/dist/css/scroll-area.css +240 -0
- package/dist/css/scrollbar.css +204 -0
- package/dist/css/select.css +612 -0
- package/dist/css/separator.css +122 -0
- package/dist/css/side-nav.css +476 -0
- package/dist/css/signature-pad.css +179 -0
- package/dist/css/skeleton.css +161 -0
- package/dist/css/slider.css +374 -0
- package/dist/css/sortable.css +228 -0
- package/dist/css/sparkline.css +164 -0
- package/dist/css/spinner.css +236 -0
- package/dist/css/splitter.css +159 -0
- package/dist/css/statistic.css +137 -0
- package/dist/css/steps.css +627 -0
- package/dist/css/switch.css +351 -0
- package/dist/css/table.css +1145 -0
- package/dist/css/tabs.css +944 -0
- package/dist/css/tag-group.css +247 -0
- package/dist/css/tag.css +310 -0
- package/dist/css/tags-input.css +322 -0
- package/dist/css/text-field.css +197 -0
- package/dist/css/time-field.css +277 -0
- package/dist/css/time-picker.css +707 -0
- package/dist/css/time-range-picker.css +746 -0
- package/dist/css/timeline.css +423 -0
- package/dist/css/timer.css +123 -0
- package/dist/css/timestamp.css +34 -0
- package/dist/css/toggle-group.css +424 -0
- package/dist/css/toggle.css +146 -0
- package/dist/css/tone.css +189 -0
- package/dist/css/tool-call.css +429 -0
- package/dist/css/toolbar.css +365 -0
- package/dist/css/tooltip.css +218 -0
- package/dist/css/tour.css +439 -0
- package/dist/css/transfer.css +638 -0
- package/dist/css/tree-select.css +878 -0
- package/dist/css/tree.css +733 -0
- package/dist/css/truncate.css +108 -0
- package/dist/css/typography.css +472 -0
- package/dist/css/undefined.css +58 -0
- package/dist/css/virtualizer.css +166 -0
- package/dist/css/visually-hidden.css +20 -0
- package/dist/css/watermark.css +82 -0
- package/dist/family/action-control.css +487 -0
- package/dist/family/chart.css +480 -0
- package/dist/family/check-mark.css +94 -0
- package/dist/family/choice-card.css +97 -0
- package/dist/family/collection-item.css +764 -0
- package/dist/family/field-chrome.css +287 -0
- package/dist/family/loading-ring.css +95 -0
- package/dist/family/material.css +72 -0
- package/dist/family/menu-choice.css +56 -0
- package/dist/family/motion.css +363 -0
- package/dist/family/swatch.css +59 -0
- package/dist/family/tag-list.css +59 -0
- package/family/action-control.css +3 -12
- package/index.css +7307 -6759
- package/index.unlayered.css +7309 -6761
- package/package.json +165 -164
|
@@ -0,0 +1,961 @@
|
|
|
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
|
+
/* Cascader 独立皮肤同时传递引入字段视觉盒、字段内动作与浮层集合行;full bundle 递归去重。 */
|
|
7
|
+
@import '../family/field-chrome.css';
|
|
8
|
+
@import '../family/action-control.css';
|
|
9
|
+
@import '../family/collection-item.css';
|
|
10
|
+
@import '../family/loading-ring.css';
|
|
11
|
+
|
|
12
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
13
|
+
@import '../family/motion.css';
|
|
14
|
+
@import '../family/material.css';
|
|
15
|
+
@import '../family/tag-list.css';
|
|
16
|
+
|
|
17
|
+
@layer xihan.components {
|
|
18
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
19
|
+
.xh-scope-cascader {
|
|
20
|
+
--xh-cascader-skin: 1;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
24
|
+
.xh-scope-cascader[data-part='positioner'] {
|
|
25
|
+
/* 落定那一侧的可用宽度,由定位引擎经内联自定义属性写进来,列区据此夹住行内轴;
|
|
26
|
+
引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
|
|
27
|
+
--xh-_cascader-available-w: 100vw;
|
|
28
|
+
/* 当前浮层只接受自己的落位方向,不叠加祖先的位移。 */
|
|
29
|
+
--xh-_overlay-enter-up: 0;
|
|
30
|
+
--xh-_overlay-enter-down: 0;
|
|
31
|
+
--xh-_overlay-enter-left: 0;
|
|
32
|
+
--xh-_overlay-enter-right: 0;
|
|
33
|
+
|
|
34
|
+
/* 列区的自绘条浮在内容之上:轨道不上底色,实色轨道会在列区下缘糊出一条灰带 */
|
|
35
|
+
--xh-scrollbar-track-bg: transparent;
|
|
36
|
+
|
|
37
|
+
position: fixed;
|
|
38
|
+
z-index: var(--xh-cascader-layer, var(--xh-_layer, var(--xh-layer-popover)));
|
|
39
|
+
/* 空壳不吃指针,交互只发生在 content 里 */
|
|
40
|
+
pointer-events: none;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
44
|
+
.xh-scope-cascader[data-part='positioner'][data-hidden] {
|
|
45
|
+
visibility: hidden;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* 位移遵循实际落位的物理方向,不随书写方向翻转。 */
|
|
49
|
+
.xh-scope-cascader[data-part='positioner'][data-placement^='top'] {
|
|
50
|
+
--xh-_overlay-enter-down: 1;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.xh-scope-cascader[data-part='positioner'][data-placement^='bottom'] {
|
|
54
|
+
--xh-_overlay-enter-up: 1;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.xh-scope-cascader[data-part='positioner'][data-placement^='left'] {
|
|
58
|
+
--xh-_overlay-enter-right: 1;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.xh-scope-cascader[data-part='positioner'][data-placement^='right'] {
|
|
62
|
+
--xh-_overlay-enter-left: 1;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
|
|
66
|
+
.xh-scope-cascader:is([data-part='root'], [data-part='positioner']) {
|
|
67
|
+
/* 作者塞进触发器指示符槽的图标跟着尺寸档走,与皮肤画的兜底字形同一把尺;列里条目的由家族随
|
|
68
|
+
data-xh-collection-size 下发。级联选择器自绘的状态字形(标记盒里的勾与半选杠、分支箭头)
|
|
69
|
+
不读这支:它们是指示符,走 --xh-control-indicator-* 一族——标记盒在自己身上把 --xh-icon-size 改接到
|
|
70
|
+
盒的尺,分支箭头走 --xh-cascader-branch-arrow-size */
|
|
71
|
+
--xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-md));
|
|
72
|
+
|
|
73
|
+
/* 尺寸档只换这几个私有槽,盒与列里的条目都从这两处继承它们,换档不必给每个部件各写一条选择器;
|
|
74
|
+
形态三档由家族按 control 上的 data-variant 生成,浮层与列不跟着变,皮肤不再声明 */
|
|
75
|
+
--xh-_cascader-h: var(--xh-control-h-md);
|
|
76
|
+
--xh-_cascader-px: var(--xh-control-px-md);
|
|
77
|
+
--xh-_cascader-row-py: var(--xh-list-option-py-md);
|
|
78
|
+
--xh-_cascader-row-px: var(--xh-control-px-md);
|
|
79
|
+
--xh-_cascader-gap: var(--xh-control-gap-md);
|
|
80
|
+
--xh-_cascader-font-size: var(--xh-control-font-md);
|
|
81
|
+
|
|
82
|
+
/* 强调色随语气走,只落在勾选标记上;没写 data-tone 时退回品牌色 */
|
|
83
|
+
--xh-_cascader-accent: var(--xh-_tone, var(--xh-fg-brand));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* 标签一行、盒一行的两行堆叠 */
|
|
87
|
+
.xh-scope-cascader[data-part='root'] {
|
|
88
|
+
display: inline-flex;
|
|
89
|
+
flex-direction: column;
|
|
90
|
+
gap: var(--xh-cascader-gap, var(--xh-space-1));
|
|
91
|
+
|
|
92
|
+
/* 不传尺寸时一律这么宽,宽度不随内容走;父容器给不出这么宽时整件跟着收,地板同步让步,不越出父容器。
|
|
93
|
+
地板不高过缺省宽:使用者把缺省宽钉到底线以下时不必再放开底线 */
|
|
94
|
+
inline-size: var(--xh-cascader-control-w, var(--xh-control-w));
|
|
95
|
+
min-inline-size: min(var(--xh-cascader-control-w, var(--xh-control-w)), var(--xh-cascader-control-min-w, var(--xh-control-min-w)), 100%);
|
|
96
|
+
max-inline-size: 100%;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* 只要声明了 display 就盖掉了 UA 的 [hidden]{display:none},作者手动收起时要自己还回去 */
|
|
100
|
+
.xh-scope-cascader[data-part='root'][hidden] {
|
|
101
|
+
display: none;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* —— 尺寸 —— */
|
|
105
|
+
/* 缺省档写在上面的基础规则里 */
|
|
106
|
+
.xh-scope-cascader:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
|
|
107
|
+
--xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-sm));
|
|
108
|
+
--xh-_cascader-h: var(--xh-control-h-sm);
|
|
109
|
+
--xh-_cascader-px: var(--xh-control-px-sm);
|
|
110
|
+
--xh-_cascader-row-py: var(--xh-list-option-py-sm);
|
|
111
|
+
--xh-_cascader-row-px: var(--xh-control-px-sm);
|
|
112
|
+
--xh-_cascader-gap: var(--xh-control-gap-sm);
|
|
113
|
+
--xh-_cascader-font-size: var(--xh-control-font-sm);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.xh-scope-cascader:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
|
|
117
|
+
--xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-lg));
|
|
118
|
+
--xh-_cascader-h: var(--xh-control-h-lg);
|
|
119
|
+
--xh-_cascader-px: var(--xh-control-px-lg);
|
|
120
|
+
--xh-_cascader-row-py: var(--xh-list-option-py-lg);
|
|
121
|
+
--xh-_cascader-row-px: var(--xh-control-px-lg);
|
|
122
|
+
--xh-_cascader-gap: var(--xh-control-gap-lg);
|
|
123
|
+
--xh-_cascader-font-size: var(--xh-control-font-lg);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.xh-scope-cascader[data-part='label'] {
|
|
127
|
+
color: var(--xh-cascader-label-fg, var(--xh-fg-default));
|
|
128
|
+
font-size: var(--xh-cascader-label-font-size, var(--xh-text-label-size));
|
|
129
|
+
font-weight: var(--xh-cascader-label-font-weight, var(--xh-text-label-weight));
|
|
130
|
+
line-height: var(--xh-leading-none);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* 整个控件禁用会把 data-disabled 一路打到 label / value-text / indicator 上,各处观感保持一致 */
|
|
134
|
+
.xh-scope-cascader[data-part='label'][data-disabled] {
|
|
135
|
+
color: var(--xh-cascader-label-fg-disabled, var(--xh-fg-subtle));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* 盒:描边、底色、圆角、控件高度、行内内衬、聚焦环、五态与悬停由 Field Chrome 家族画在这一层,
|
|
139
|
+
触发按钮与清空按钮在里面并排;Tab 停靠点是盒里的 trigger(展开后才移进列里),环由家族的
|
|
140
|
+
:focus-within 画在盒上。组件只映射既有公开槽(shadow 缺省 none:字段静息描边式、无影);盒里是按钮 */
|
|
141
|
+
.xh-scope-cascader[data-part='control'] {
|
|
142
|
+
--xh-field-control-height: var(--xh-cascader-control-h, var(--xh-_cascader-h));
|
|
143
|
+
--xh-field-control-padding-inline: var(--xh-cascader-control-px, var(--xh-_cascader-px));
|
|
144
|
+
--xh-field-control-gap: var(--xh-cascader-control-gap, var(--xh-_cascader-gap));
|
|
145
|
+
--xh-field-control-min-inline-size: var(--xh-cascader-control-min-w, var(--xh-control-min-w));
|
|
146
|
+
--xh-field-control-radius: var(--xh-cascader-control-radius, var(--xh-shape-control));
|
|
147
|
+
--xh-field-bg-rest: var(--xh-cascader-control-bg, var(--xh-_field-variant-bg-rest));
|
|
148
|
+
--xh-field-bg-hover: var(--xh-cascader-control-bg-hover, var(--xh-_field-variant-bg-hover));
|
|
149
|
+
--xh-field-bg-read-only: var(--xh-cascader-control-bg-readonly, var(--xh-_field-variant-bg-read-only));
|
|
150
|
+
--xh-field-bg-disabled: var(--xh-cascader-control-bg-disabled, var(--xh-_field-variant-bg-disabled));
|
|
151
|
+
--xh-field-fg-rest: var(--xh-cascader-control-fg, var(--xh-fg-default));
|
|
152
|
+
--xh-field-border-rest: var(--xh-cascader-control-border, var(--xh-_field-variant-border-rest));
|
|
153
|
+
--xh-field-border-hover: var(--xh-cascader-control-border-hover, var(--xh-_field-variant-border-hover));
|
|
154
|
+
--xh-field-border-focus: var(--xh-cascader-control-border-focus, var(--xh-_field-variant-border-focus));
|
|
155
|
+
--xh-field-border-invalid: var(--xh-cascader-control-border-invalid, var(--xh-_field-variant-border-invalid));
|
|
156
|
+
--xh-field-ring-focus: var(--xh-ring-focus);
|
|
157
|
+
--xh-field-ring-invalid: var(--xh-ring-invalid);
|
|
158
|
+
--xh-field-shadow-rest: var(--xh-cascader-control-shadow, none);
|
|
159
|
+
--xh-field-cursor-rest: pointer;
|
|
160
|
+
/* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
|
|
161
|
+
--xh-field-glyph-size: var(--xh-cascader-icon-size, var(--xh-_field-size-glyph-size));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.xh-scope-cascader[data-part='control'][hidden] {
|
|
165
|
+
display: none;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* 盒内那颗可聚焦的按钮:不画描边不铺底也不自带高度,只占满剩余宽度、排布回显与箭头 */
|
|
169
|
+
.xh-scope-cascader[data-part='trigger'] {
|
|
170
|
+
display: inline-flex;
|
|
171
|
+
flex: 1 1 auto;
|
|
172
|
+
align-items: center;
|
|
173
|
+
justify-content: space-between;
|
|
174
|
+
gap: var(--xh-cascader-trigger-gap, var(--xh-_cascader-gap));
|
|
175
|
+
min-inline-size: 0;
|
|
176
|
+
padding: 0;
|
|
177
|
+
border: 0;
|
|
178
|
+
background: transparent;
|
|
179
|
+
color: var(--xh-cascader-trigger-fg, var(--xh-fg-default));
|
|
180
|
+
font-family: inherit;
|
|
181
|
+
font-size: var(--xh-cascader-trigger-font-size, var(--xh-_cascader-font-size));
|
|
182
|
+
line-height: var(--xh-leading-none);
|
|
183
|
+
text-align: start;
|
|
184
|
+
cursor: pointer;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.xh-scope-cascader[data-part='trigger'][hidden] {
|
|
188
|
+
display: none;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* trigger 是单体控件,用原生 disabled(列里的集合条目一律 aria-disabled,写 :disabled 永不命中) */
|
|
192
|
+
.xh-scope-cascader[data-part='trigger']:disabled {
|
|
193
|
+
color: var(--xh-fg-disabled);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* 路径连起来会很长,必须能截断;框宽由盒定,这里得允许自己被压缩 */
|
|
197
|
+
.xh-scope-cascader[data-part='value-text'] {
|
|
198
|
+
flex: 1 1 auto;
|
|
199
|
+
min-inline-size: 0;
|
|
200
|
+
overflow: hidden;
|
|
201
|
+
white-space: nowrap;
|
|
202
|
+
text-overflow: ellipsis;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/* 无选中:显示的是 placeholder,画淡一档 */
|
|
206
|
+
.xh-scope-cascader[data-part='value-text'][data-placeholder] {
|
|
207
|
+
color: var(--xh-cascader-placeholder-fg, var(--xh-fg-subtle));
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.xh-scope-cascader[data-part='value-text'][data-disabled] {
|
|
211
|
+
color: var(--xh-fg-disabled);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/* 标签行:触发器里收着可见标签与 +N 那一枚的一行,行里每一枚都是 tag(data-scope="tag"),样子归 tag.css;
|
|
215
|
+
行怎么排、标签怎么进出归标签行家族配方(family/tag-list.css),这里只把使用者的间距槽接进去 */
|
|
216
|
+
.xh-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
|
+
.xh-scope-cascader[data-part='trigger']:has([data-part='tag-list']:not([hidden])) [data-part='value-text']:where(.xh-scope-cascader) {
|
|
223
|
+
display: none;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/* 有值时清空钮顶上来,箭头让位:两个图标并排堆着,用户分不清点哪个。
|
|
227
|
+
判据查的是盒里此刻真有一颗没收起的清空钮,不是「有没有值」——
|
|
228
|
+
作者没摆清空钮时箭头照常留着,不然让了位没人接,指示符整个消失 */
|
|
229
|
+
.xh-scope-cascader[data-part='control']:has([data-part='clear-trigger']:not([hidden])) [data-part='indicator']:where(.xh-scope-cascader) {
|
|
230
|
+
display: none;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.xh-scope-cascader[data-part='indicator'] {
|
|
234
|
+
display: inline-flex;
|
|
235
|
+
flex: none;
|
|
236
|
+
align-items: center;
|
|
237
|
+
justify-content: center;
|
|
238
|
+
color: var(--xh-cascader-indicator-fg, var(--xh-fg-muted));
|
|
239
|
+
transition: rotate var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.xh-scope-cascader[data-part='indicator'][hidden] {
|
|
243
|
+
display: none;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/* 没写内容就由皮肤画箭头;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
247
|
+
.xh-scope-cascader[data-part='indicator']:empty::before {
|
|
248
|
+
content: '';
|
|
249
|
+
display: inline-block;
|
|
250
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
251
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
252
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
253
|
+
background-color: currentColor;
|
|
254
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
255
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.xh-scope-cascader[data-part='indicator'][data-state='open'] {
|
|
259
|
+
rotate: 180deg;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.xh-scope-cascader[data-part='indicator'][data-disabled] {
|
|
263
|
+
color: var(--xh-fg-disabled);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* 盒内靠右的小方钮,不撑高那一行:正方视觉盒、inset 圆角、悬停 100 / 按下 200 与 0.97 按压、粗指针热区与
|
|
267
|
+
:focus-visible 关环(盒的 :focus-within 已画了一圈)全由 Action Control 的 field-inset ghost 档给,
|
|
268
|
+
组件只映射既有覆盖槽 */
|
|
269
|
+
.xh-scope-cascader[data-part='clear-trigger'] {
|
|
270
|
+
--xh-action-visual-size: var(--xh-cascader-action-size, var(--xh-_action-profile-visual-size));
|
|
271
|
+
--xh-action-min-inline-size: var(--xh-cascader-action-size, var(--xh-_action-profile-visual-size));
|
|
272
|
+
--xh-action-radius: var(--xh-cascader-action-radius, var(--xh-shape-inset));
|
|
273
|
+
/* 底色阶梯由 ghost 档给(透明 → 100 → 200),使用者槽只作覆盖入口 */
|
|
274
|
+
--xh-action-bg-rest: var(--xh-cascader-action-bg, var(--xh-_action-variant-bg-rest));
|
|
275
|
+
--xh-action-bg-hover: var(--xh-cascader-action-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
276
|
+
--xh-action-bg-pressed: var(--xh-cascader-action-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
277
|
+
--xh-action-fg-rest: var(--xh-cascader-action-fg, var(--xh-fg-muted));
|
|
278
|
+
--xh-action-fg-hover: var(--xh-cascader-action-fg-hover, var(--xh-fg-default));
|
|
279
|
+
--xh-action-border-rest: transparent;
|
|
280
|
+
--xh-action-highlight-rest: transparent;
|
|
281
|
+
--xh-action-shadow-rest: none;
|
|
282
|
+
--xh-action-shadow-hover: none;
|
|
283
|
+
--xh-action-shadow-pressed: none;
|
|
284
|
+
--xh-action-font-size: var(--xh-cascader-action-font-size, var(--xh-text-secondary-size));
|
|
285
|
+
/* 配方尚未把 profile 字形档灌进 --xh-icon-size,钮内字形先按 field-inset 档逐钮取值 */
|
|
286
|
+
--xh-icon-size: var(--xh-_action-profile-glyph-size);
|
|
287
|
+
|
|
288
|
+
border-width: 0;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/* 没值时连接层给的是 hidden 属性;家族那条 display 会把 UA 规则盖掉 */
|
|
292
|
+
.xh-scope-cascader[data-part='clear-trigger'][hidden] {
|
|
293
|
+
display: none;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* 级联的骨架就在这一条上:列沿书写方向并排,一层一列。
|
|
297
|
+
面板型浮层:每一列按条目的自然宽度,不随字段盒拉伸,面板随列数伸展。
|
|
298
|
+
面板含多列,材质取 floating:实体底 + border-default 描边 + 浮起投影,不透景 */
|
|
299
|
+
.xh-scope-cascader[data-part='content'] {
|
|
300
|
+
position: relative;
|
|
301
|
+
display: flex;
|
|
302
|
+
flex-direction: row;
|
|
303
|
+
align-items: stretch;
|
|
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));
|
|
311
|
+
border-radius: var(--xh-cascader-content-radius, var(--xh-shape-overlay));
|
|
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));
|
|
315
|
+
/* 列多到放不下时整体横向滚动;纵向溢出归每一列自己 */
|
|
316
|
+
overflow-x: auto;
|
|
317
|
+
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
318
|
+
overscroll-behavior: contain;
|
|
319
|
+
pointer-events: auto;
|
|
320
|
+
/* 各列与搜索列表的竖条贴在自己的盒子上、挂在这一层里(它已是定位盒):轨道不画底,
|
|
321
|
+
条子随列一起横滚,列与列之间才不会各多出一道灰带 */
|
|
322
|
+
--xh-scrollbar-track-bg: transparent;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
326
|
+
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
327
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
328
|
+
真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
|
|
329
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
330
|
+
|
|
331
|
+
/* 容器只是焦点域的兜底落点,落焦不画环:高亮永远长在条目上 */
|
|
332
|
+
.xh-scope-cascader[data-part='content']:focus-visible {
|
|
333
|
+
outline: none;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
337
|
+
.xh-scope-cascader[data-part='content'][data-state='open']:not([data-instant]) {
|
|
338
|
+
animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
342
|
+
免得动画结束到真收起之间闪一下原样 */
|
|
343
|
+
.xh-scope-cascader[data-part='content'][data-state='closed'] {
|
|
344
|
+
animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/* 一列:宽度由内容撑出、设下限防塌,高度定死——切换展开路径时浮层不上下跳动,
|
|
348
|
+
溢出的条目在列内自己滚。列与列之间用一条分隔线,比留白更能说明「这是下一级」 */
|
|
349
|
+
.xh-scope-cascader[data-part='column'] {
|
|
350
|
+
display: flex;
|
|
351
|
+
flex: none;
|
|
352
|
+
flex-direction: column;
|
|
353
|
+
gap: var(--xh-cascader-column-gap, var(--xh-list-option-gap));
|
|
354
|
+
/* 每一列按条目的自然宽度,受菜单的下界托底;长选项撑到条目的上限为止,余下的在条目里截断 */
|
|
355
|
+
min-inline-size: var(--xh-cascader-column-min-w, var(--xh-overlay-menu-min-w));
|
|
356
|
+
block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
|
|
357
|
+
padding-block: var(--xh-cascader-column-py, var(--xh-space-1));
|
|
358
|
+
padding-inline: var(--xh-cascader-column-px, var(--xh-space-1));
|
|
359
|
+
overflow-y: auto;
|
|
360
|
+
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
361
|
+
overscroll-behavior: contain;
|
|
362
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/* 刷新:已有候选时后台在取,保留上一帧,列与候选列表按 micro 淡下,数据到了再淡回;在途占位此时让位。
|
|
366
|
+
淡的是列不是面:content 是整块浮起面,整块淡下去面就透了 */
|
|
367
|
+
.xh-scope-cascader[data-part='content'][aria-busy='true'] > .xh-scope-cascader:is([data-part='column'], [data-part='search-list']) {
|
|
368
|
+
opacity: var(--xh-state-disabled-opacity);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/* 展开路径砍短了这一列就收起来。display 盖掉了 UA 的 [hidden]{display:none},
|
|
372
|
+
漏了这条「选了靠左的一列就把右边的列砍掉」在视觉上根本不会发生 */
|
|
373
|
+
.xh-scope-cascader[data-part='column'][hidden] {
|
|
374
|
+
display: none;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/* 分隔线画在列的起始缘,且第一列不画:这样列数增减时线永远只出现在列与列之间。
|
|
378
|
+
用逻辑属性,rtl 下自动跑到另一侧。每列后面紧跟着它自己的竖条节点,相邻选择器接不到下一列,
|
|
379
|
+
按「前面有过列」取后续的列 */
|
|
380
|
+
.xh-scope-cascader[data-part='column'] ~ .xh-scope-cascader[data-part='column'] {
|
|
381
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-cascader-column-divider, var(--xh-material-solid-separator));
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
.xh-scope-cascader[data-part='column']:not([tabindex='0']):focus-visible {
|
|
385
|
+
outline: none;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
.xh-scope-cascader[data-part='group'] {
|
|
389
|
+
display: flex;
|
|
390
|
+
flex: none;
|
|
391
|
+
flex-direction: column;
|
|
392
|
+
gap: var(--xh-cascader-group-gap, var(--xh-list-option-gap));
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.xh-scope-cascader[data-part='group'][hidden] {
|
|
396
|
+
display: none;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/* 组间留白只加在后继分组上:首组顶上已经有列的内边距,再加一层会显得头重 */
|
|
400
|
+
.xh-scope-cascader[data-part='group'] + .xh-scope-cascader[data-part='group'] {
|
|
401
|
+
margin-block-start: var(--xh-cascader-group-spacing, var(--xh-space-1_5));
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/* 分组标题不是条目、进不了导航,画成小号次要文字,
|
|
405
|
+
内缩与条目对齐(同一个 padding-inline),标题与条目文字才在一条竖线上 */
|
|
406
|
+
.xh-scope-cascader[data-part='group-label'] {
|
|
407
|
+
display: block;
|
|
408
|
+
padding-block: var(--xh-cascader-group-label-py, var(--xh-space-1));
|
|
409
|
+
padding-inline: var(--xh-cascader-group-label-px, var(--xh-_cascader-row-px));
|
|
410
|
+
color: var(--xh-cascader-group-label-fg, var(--xh-fg-muted));
|
|
411
|
+
font-size: var(--xh-cascader-group-label-font-size, var(--xh-text-caption-size));
|
|
412
|
+
font-weight: var(--xh-cascader-group-label-font-weight, var(--xh-font-weight-medium));
|
|
413
|
+
line-height: var(--xh-leading-none);
|
|
414
|
+
user-select: none;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.xh-scope-cascader[data-part='group-label'][hidden] {
|
|
418
|
+
display: none;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
.xh-scope-cascader[data-part='group-label'][data-disabled] {
|
|
422
|
+
color: var(--xh-fg-disabled);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/* 列内条目:网格、尺寸档、悬停 / 高亮 100、按下 200、展开路径的中性面(与悬停同档)、禁用面与选中标记
|
|
426
|
+
由 Collection Item 家族按 overlay 语境给(选中 = 透明底 + 行尾对号,正文保持 rest 色与常规字重),
|
|
427
|
+
公开 Cascader 槽只映射到家族合同。data-highlighted 跟的是连接层记的焦点行(指针与键盘共用),
|
|
428
|
+
环只在真正的键盘焦点上接回,见下 */
|
|
429
|
+
.xh-scope-cascader[data-part='item'] {
|
|
430
|
+
--xh-collection-block-padding: var(--xh-cascader-item-py, var(--xh-_cascader-row-py));
|
|
431
|
+
--xh-collection-inline-padding: var(--xh-cascader-item-px, var(--xh-_cascader-row-px));
|
|
432
|
+
--xh-collection-gap: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
|
|
433
|
+
--xh-collection-font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
|
|
434
|
+
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-inset));
|
|
435
|
+
--xh-collection-glyph-size: var(--xh-cascader-icon-size, var(--xh-_collection-glyph-size));
|
|
436
|
+
--xh-collection-fg-rest: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
437
|
+
--xh-collection-fg-hover: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
438
|
+
--xh-collection-fg-keyboard-highlight: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
439
|
+
--xh-collection-fg-open-path: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
440
|
+
--xh-collection-fg-selected: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
|
|
441
|
+
--xh-collection-fg-selected-highlight: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
|
|
442
|
+
--xh-collection-fg-selected-hover: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
|
|
443
|
+
--xh-collection-fg-selected-pressed: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
|
|
444
|
+
--xh-collection-fg-pressed: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
445
|
+
--xh-collection-font-weight-open-path: var(--xh-cascader-item-active-font-weight, var(--xh-font-weight-regular));
|
|
446
|
+
--xh-collection-font-weight-selected: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
|
|
447
|
+
--xh-collection-font-weight-selected-highlight: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
|
|
448
|
+
--xh-collection-font-weight-selected-hover: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
|
|
449
|
+
--xh-collection-font-weight-selected-pressed: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
|
|
450
|
+
--xh-collection-bg-hover: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
451
|
+
--xh-collection-bg-keyboard-highlight: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
452
|
+
--xh-collection-bg-open-path: var(--xh-cascader-item-bg-active, var(--xh-bg-subtle));
|
|
453
|
+
--xh-collection-bg-selected-highlight: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
454
|
+
--xh-collection-bg-selected-hover: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
455
|
+
--xh-collection-bg-pressed: var(--xh-cascader-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
456
|
+
--xh-collection-bg-selected-pressed: var(--xh-cascader-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
457
|
+
--xh-collection-outline-keyboard-highlight: transparent;
|
|
458
|
+
--xh-collection-outline-selected-highlight: transparent;
|
|
459
|
+
--xh-collection-indicator-fg-rest: var(--xh-cascader-item-check-fg, var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent)));
|
|
460
|
+
--xh-collection-indicator-fg-checked: var(--xh-cascader-item-check-fg, var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent)));
|
|
461
|
+
--xh-collection-indicator-fg-selected: var(--xh-cascader-item-check-fg, var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent)));
|
|
462
|
+
--xh-collection-indicator-fg-selected-hover: var(--xh-cascader-item-check-fg, var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent)));
|
|
463
|
+
--xh-collection-indicator-fg-selected-highlight: var(--xh-cascader-item-check-fg, var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent)));
|
|
464
|
+
--xh-collection-indicator-fg-selected-pressed: var(--xh-cascader-item-check-fg, var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent)));
|
|
465
|
+
--xh-collection-indicator-fg-open-path: var(--xh-cascader-item-check-fg, var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent)));
|
|
466
|
+
|
|
467
|
+
max-inline-size: var(--xh-cascader-item-max-w, var(--xh-overlay-max-w));
|
|
468
|
+
/* 行高留出文字的上下伸展空间,行内那层 overflow:hidden 才不会把字削掉 */
|
|
469
|
+
line-height: var(--xh-cascader-item-leading, var(--xh-leading-normal));
|
|
470
|
+
white-space: nowrap;
|
|
471
|
+
user-select: none;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/* 条目常挂不卸载:不属于当前这一列的那些靠 hidden 收起。
|
|
475
|
+
display 盖掉了 UA 的 [hidden]{display:none},漏了这条列换了内容旧条目还留在那儿 */
|
|
476
|
+
.xh-scope-cascader[data-part='item'][hidden] {
|
|
477
|
+
display: none;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/* 懒分支取数失败不预设错误面:失败由那一列里的提示与重试钮说明,父条目仍是一条可激活的普通条目,
|
|
481
|
+
与树选择同一口径。家族按 data-error 给的告警面(危险色字压在危险色淡底上,对比不到 4.5:1)在这里映射回常态 */
|
|
482
|
+
.xh-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
|
+
.xh-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
|
+
.xh-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
|
+
.xh-scope-cascader[data-part='column'] [data-part='item']:where(.xh-scope-cascader):not([data-instant]) {
|
|
507
|
+
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) backwards;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
/* 交错的间隔:第二条起逐级往后推,第六条起统一钉在第五级,条目再多也不会拖出一条越来越慢的尾巴。
|
|
511
|
+
列里同时挂着别的父节点下的条目(收起态),计数把它们排掉,序号才对得上看得见的那几条 */
|
|
512
|
+
.xh-scope-cascader[data-part='column'] [data-part='item']:where(.xh-scope-cascader):nth-child(2 of :not([hidden])) {
|
|
513
|
+
animation-delay: var(--xh-motion-stagger-step);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
.xh-scope-cascader[data-part='column'] [data-part='item']:where(.xh-scope-cascader):nth-child(3 of :not([hidden])) {
|
|
517
|
+
animation-delay: calc(2 * var(--xh-motion-stagger-step));
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
.xh-scope-cascader[data-part='column'] [data-part='item']:where(.xh-scope-cascader):nth-child(4 of :not([hidden])) {
|
|
521
|
+
animation-delay: calc(3 * var(--xh-motion-stagger-step));
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
.xh-scope-cascader[data-part='column'] [data-part='item']:where(.xh-scope-cascader):nth-child(5 of :not([hidden])) {
|
|
525
|
+
animation-delay: calc(4 * var(--xh-motion-stagger-step));
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
.xh-scope-cascader[data-part='column'] [data-part='item']:where(.xh-scope-cascader):nth-child(n + 6 of :not([hidden])) {
|
|
529
|
+
animation-delay: calc(5 * var(--xh-motion-stagger-step));
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
|
|
533
|
+
.xh-scope-cascader[data-part='item']:focus-visible:not(:hover) {
|
|
534
|
+
--xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
|
|
535
|
+
--xh-collection-outline-selected-highlight: var(--xh-ring-focus);
|
|
536
|
+
|
|
537
|
+
transition: none;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/* 分支条目行尾画右向小箭头:不点开也看得出还有下一级。落在家族网格的 suffix 列、跨两行居中。
|
|
541
|
+
与菜单族的子菜单箭头同走字形令牌——此前这里是「描全边框再抹掉两条、把剩下的直角旋 45 度」,
|
|
542
|
+
作者换掉标记时换不动它,RTL 还得再翻一次旋转角。
|
|
543
|
+
箭头是指示符:与同一行的标记盒同走 --xh-control-indicator-size,不读家族按档下发的
|
|
544
|
+
--xh-icon-size——按图标档取的 20px 会比 16px 的标记盒大一圈 */
|
|
545
|
+
.xh-scope-cascader[data-part='item'][data-branch]::after {
|
|
546
|
+
content: '';
|
|
547
|
+
grid-column: suffix;
|
|
548
|
+
grid-row: 1 / span 2;
|
|
549
|
+
inline-size: var(--xh-cascader-branch-arrow-size, var(--xh-control-indicator-size));
|
|
550
|
+
block-size: var(--xh-cascader-branch-arrow-size, var(--xh-control-indicator-size));
|
|
551
|
+
margin-inline-start: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
|
|
552
|
+
background-color: var(--xh-cascader-branch-arrow-fg, var(--xh-fg-subtle));
|
|
553
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
554
|
+
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
.xh-scope-cascader[data-part='item'][data-branch][data-disabled]::after {
|
|
558
|
+
background-color: var(--xh-fg-disabled);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
.xh-scope-cascader[data-part='item'][data-branch]:dir(rtl)::after {
|
|
562
|
+
-webkit-mask-image: var(--xh-glyph-mark-chevron-left);
|
|
563
|
+
mask-image: var(--xh-glyph-mark-chevron-left);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/* 正文落在家族网格的 text 列;网格项默认最小尺寸是内容尺寸,不归零则长文本把行撑破、省略号轮不上 */
|
|
567
|
+
.xh-scope-cascader[data-part='item-text'] {
|
|
568
|
+
min-inline-size: 0;
|
|
569
|
+
overflow: hidden;
|
|
570
|
+
white-space: nowrap;
|
|
571
|
+
text-overflow: ellipsis;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/* 勾选标记落在家族网格的 indicator 列,只在选中项上显形(家族按 aria-selected / data-state=checked 给);
|
|
575
|
+
未选中时占位不塌,切换选中不引起行宽抖动。
|
|
576
|
+
盒里的勾与半选杠是指示符:盒在自己身上把 --xh-icon-size 改接到盒的尺,皮肤画的兜底字形与作者
|
|
577
|
+
塞进盒里的 XhIcon 读同一把尺、与盒同边长(行尾标记不是勾选格,不取 × 0.75,与搜索候选行尾的勾同尺);
|
|
578
|
+
不读家族按档下发到行的 --xh-icon-size——那支只管作者放进条目里的图标,按图标档取的 20px 会比 16 / 14 的盒还大 */
|
|
579
|
+
.xh-scope-cascader[data-part='item-indicator'] {
|
|
580
|
+
--xh-icon-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
|
|
581
|
+
|
|
582
|
+
display: inline-flex;
|
|
583
|
+
align-items: center;
|
|
584
|
+
justify-content: center;
|
|
585
|
+
inline-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
|
|
586
|
+
block-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
.xh-scope-cascader[data-part='item-indicator'][hidden] {
|
|
590
|
+
display: none;
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/* 没写内容就由皮肤画勾;作者往部件里塞了自己的图形,这条规则即不命中。
|
|
594
|
+
尺寸读标记盒自己改接过的 --xh-icon-size:与盒同边长,随指示符档换档(见上面标记盒那块)。
|
|
595
|
+
勾与半选杠叠成两层遮罩,按状态只换两层的尺寸:离开半选淡出的那一段里横杠留着,
|
|
596
|
+
淡出播完才换回勾——不在淡出途中闪出一枚勾 */
|
|
597
|
+
.xh-scope-cascader[data-part='item-indicator']:empty::before {
|
|
598
|
+
content: '';
|
|
599
|
+
display: inline-block;
|
|
600
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
601
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
602
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
603
|
+
background-color: currentColor;
|
|
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
|
+
.xh-scope-cascader[data-part='item-indicator'][data-state='checked']:empty::before {
|
|
612
|
+
transition-delay: 0s;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/* 级联勾选的半选态只在皮肤自绘(:empty)时露面画横杠:
|
|
616
|
+
作者塞了自己的选中图形时,半选放出来会顶着一个语义相反的勾,表达交还作者 */
|
|
617
|
+
.xh-scope-cascader[data-part='item-indicator'][data-state='indeterminate']:empty {
|
|
618
|
+
opacity: 1;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
.xh-scope-cascader[data-part='item-indicator'][data-state='indeterminate']:empty::before {
|
|
622
|
+
-webkit-mask-size: 0 0, 100% 100%;
|
|
623
|
+
mask-size: 0 0, 100% 100%;
|
|
624
|
+
transition-delay: 0s;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
/* 家族按行的禁用降级标记色;半选横线也一并跟着 */
|
|
628
|
+
.xh-scope-cascader[data-part='item-indicator'][data-disabled] {
|
|
629
|
+
color: var(--xh-fg-disabled);
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/* —— 搜索视图:输入框横占整行排在列上方,候选列表替换列视图 —— */
|
|
633
|
+
.xh-scope-cascader[data-part='content']:has([data-part='input']:not([hidden])) {
|
|
634
|
+
flex-wrap: wrap;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/* 面板内嵌的搜索框:通栏一行,控件高与字号随尺寸档,只画一道面内分隔的下划线(取面材质的分隔令牌);
|
|
638
|
+
重置与占位前景由字段家族按 data-xh-field-input 给,占位与值文本的占位同一支组件槽 */
|
|
639
|
+
.xh-scope-cascader[data-part='input'] {
|
|
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));
|
|
653
|
+
border: none;
|
|
654
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-material-solid-separator));
|
|
655
|
+
border-start-start-radius: inherit;
|
|
656
|
+
border-start-end-radius: inherit;
|
|
657
|
+
background: none;
|
|
658
|
+
color: inherit;
|
|
659
|
+
font-family: inherit;
|
|
660
|
+
font-size: var(--xh-cascader-input-font-size, var(--xh-_cascader-font-size));
|
|
661
|
+
line-height: var(--xh-leading-normal);
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
/* 聚焦不画环:插入符就是焦点指示。框没有外壳,全局那圈键盘焦点环只会压在通栏一行上 */
|
|
665
|
+
.xh-scope-cascader[data-part='input']:focus-visible {
|
|
666
|
+
outline: none;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
.xh-scope-cascader[data-part='input'][hidden] {
|
|
670
|
+
display: none;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
/* 自动填充:引擎给填过的框强加一套系统色(多数是黄底黑字),盖得过 background 与 color,
|
|
674
|
+
深色档下就剩一条不跟主题走的黄带。底改用 inset 阴影铺回来,扩散量 100vmax 填满内容盒;
|
|
675
|
+
字改用 -webkit-text-fill-color 接回来,那是这个态下唯一还听样式表的前景通道。
|
|
676
|
+
不去拉长 transition 把系统底推迟显现:那只是把它藏起来,减弱动效通道一关过渡就当场露出。
|
|
677
|
+
两个选择器名分写两条:一条选择器列表里只要有一个名字不被认识,整条规则就被丢弃。
|
|
678
|
+
搜索框排在浮层面里,铺的底取浮起面而不是页面底,不然框内会比周围亮出一块。 */
|
|
679
|
+
.xh-scope-cascader[data-part='input']:autofill {
|
|
680
|
+
box-shadow: inset 0 0 0 100vmax var(--xh-cascader-input-autofill-bg, var(--xh-bg-surface));
|
|
681
|
+
-webkit-text-fill-color: var(--xh-cascader-input-autofill-fg, var(--xh-fg-default));
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
.xh-scope-cascader[data-part='input']:-webkit-autofill {
|
|
685
|
+
box-shadow: inset 0 0 0 100vmax var(--xh-cascader-input-autofill-bg, var(--xh-bg-surface));
|
|
686
|
+
-webkit-text-fill-color: var(--xh-cascader-input-autofill-fg, var(--xh-fg-default));
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/* 与列同高:搜索视图与浏览视图互换时浮层不改高度,候选多了在列表内自己滚 */
|
|
690
|
+
.xh-scope-cascader[data-part='search-list'] {
|
|
691
|
+
display: flex;
|
|
692
|
+
flex-basis: 100%;
|
|
693
|
+
flex-direction: column;
|
|
694
|
+
gap: var(--xh-cascader-search-list-gap, var(--xh-list-option-gap));
|
|
695
|
+
block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
|
|
696
|
+
padding: var(--xh-cascader-search-p, var(--xh-space-1));
|
|
697
|
+
overflow-y: auto;
|
|
698
|
+
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
699
|
+
overscroll-behavior: contain;
|
|
700
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
.xh-scope-cascader[data-part='search-list'][hidden] {
|
|
704
|
+
display: none;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
/* 无候选时列表自身不占位,空态交给 empty 部件出面 */
|
|
708
|
+
.xh-scope-cascader[data-part='search-list'][data-empty] {
|
|
709
|
+
padding: 0;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
/* 搜索视图里列整体让位 */
|
|
713
|
+
.xh-scope-cascader[data-part='content'][data-searching] [data-part='column']:where(.xh-scope-cascader) {
|
|
714
|
+
display: none;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/* 候选与列内条目同一套行度量与家族状态面(悬停 / 高亮 100、按下 200、禁用面由 Collection Item 给)。
|
|
718
|
+
搜索结果没有独立的正文部件,匿名文本进不了家族网格的 text 列,行保持块级排版,
|
|
719
|
+
末端为同一枚皮肤对号预留固定轨 */
|
|
720
|
+
.xh-scope-cascader[data-part='search-item'] {
|
|
721
|
+
--xh-collection-block-padding: var(--xh-cascader-item-py, var(--xh-_cascader-row-py));
|
|
722
|
+
--xh-collection-inline-padding: var(--xh-cascader-item-px, var(--xh-_cascader-row-px));
|
|
723
|
+
--xh-collection-gap: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
|
|
724
|
+
--xh-collection-font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
|
|
725
|
+
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-inset));
|
|
726
|
+
--xh-collection-fg-rest: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
727
|
+
--xh-collection-fg-hover: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
728
|
+
--xh-collection-fg-keyboard-highlight: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
729
|
+
--xh-collection-fg-selected: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
|
|
730
|
+
--xh-collection-fg-selected-highlight: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
|
|
731
|
+
--xh-collection-fg-selected-hover: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
|
|
732
|
+
--xh-collection-fg-selected-pressed: var(--xh-cascader-item-fg-selected, var(--xh-cascader-item-fg, var(--xh-material-frosted-fg)));
|
|
733
|
+
--xh-collection-fg-pressed: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
734
|
+
--xh-collection-font-weight-selected: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
|
|
735
|
+
--xh-collection-font-weight-selected-highlight: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
|
|
736
|
+
--xh-collection-font-weight-selected-hover: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
|
|
737
|
+
--xh-collection-font-weight-selected-pressed: var(--xh-cascader-item-font-weight-selected, var(--xh-font-weight-regular));
|
|
738
|
+
--xh-collection-bg-hover: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
739
|
+
--xh-collection-bg-keyboard-highlight: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
740
|
+
--xh-collection-bg-selected-highlight: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
741
|
+
--xh-collection-bg-selected-hover: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
742
|
+
--xh-collection-bg-pressed: var(--xh-cascader-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
743
|
+
--xh-collection-bg-selected-pressed: var(--xh-cascader-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
744
|
+
--xh-collection-outline-keyboard-highlight: transparent;
|
|
745
|
+
--xh-collection-outline-selected-highlight: transparent;
|
|
746
|
+
|
|
747
|
+
position: relative;
|
|
748
|
+
display: block;
|
|
749
|
+
/* 末端为对号预留固定轨:对号绝对定位,不进内容流 */
|
|
750
|
+
padding-inline-end: calc(
|
|
751
|
+
var(--xh-cascader-item-px, var(--xh-_cascader-row-px)) +
|
|
752
|
+
var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size)) +
|
|
753
|
+
var(--xh-cascader-item-gap, var(--xh-_cascader-gap))
|
|
754
|
+
);
|
|
755
|
+
overflow: hidden;
|
|
756
|
+
line-height: var(--xh-cascader-item-leading, var(--xh-leading-normal));
|
|
757
|
+
text-overflow: ellipsis;
|
|
758
|
+
white-space: nowrap;
|
|
759
|
+
user-select: none;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
|
|
763
|
+
.xh-scope-cascader[data-part='search-item']:focus-visible:not(:hover) {
|
|
764
|
+
--xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
|
|
765
|
+
--xh-collection-outline-selected-highlight: var(--xh-ring-focus);
|
|
766
|
+
|
|
767
|
+
transition: none;
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
/* 自动生成的搜索结果复用 item-indicator 的尺寸、颜色和对号字形,不新增第二套作者槽。 */
|
|
771
|
+
.xh-scope-cascader[data-part='search-item']::after {
|
|
772
|
+
content: '';
|
|
773
|
+
position: absolute;
|
|
774
|
+
inset-block-start: 50%;
|
|
775
|
+
inset-inline-end: var(--xh-cascader-item-px, var(--xh-_cascader-row-px));
|
|
776
|
+
inline-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
|
|
777
|
+
block-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
|
|
778
|
+
translate: 0 -50%;
|
|
779
|
+
background-color: var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent));
|
|
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);
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
.xh-scope-cascader[data-part='search-item'][data-state='checked']::after {
|
|
791
|
+
opacity: 1;
|
|
792
|
+
transition-delay: 0s;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
.xh-scope-cascader[data-part='search-item'][data-state='indeterminate']::after {
|
|
796
|
+
opacity: 1;
|
|
797
|
+
-webkit-mask-size: 0 0, 100% 100%;
|
|
798
|
+
mask-size: 0 0, 100% 100%;
|
|
799
|
+
transition-delay: 0s;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
.xh-scope-cascader[data-part='search-item'][data-disabled]::after {
|
|
803
|
+
background-color: var(--xh-fg-disabled);
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
.xh-scope-cascader[data-part='search-item'][hidden] {
|
|
807
|
+
display: none;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/* —— 空态:当前视图没有条目时由 empty 部件出面,文案由适配器或作者供给,皮肤只管排版 —— */
|
|
811
|
+
/* 根列没有条目时那条空列让位,占位面接管整个浮层 */
|
|
812
|
+
.xh-scope-cascader[data-part='content'][data-empty] [data-part='column']:where(.xh-scope-cascader) {
|
|
813
|
+
display: none;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
.xh-scope-cascader[data-part='empty'] {
|
|
817
|
+
display: flex;
|
|
818
|
+
flex: 1 1 100%;
|
|
819
|
+
align-items: center;
|
|
820
|
+
justify-content: center;
|
|
821
|
+
padding: var(--xh-cascader-empty-p, var(--xh-space-3));
|
|
822
|
+
color: var(--xh-cascader-empty-fg, var(--xh-fg-muted));
|
|
823
|
+
font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
.xh-scope-cascader[data-part='empty'][hidden] {
|
|
827
|
+
display: none;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
/* 在途占位:与空态占位同一个位置、同一副观感,两者不同屏 */
|
|
831
|
+
.xh-scope-cascader[data-part='loading'] {
|
|
832
|
+
display: flex;
|
|
833
|
+
flex: 0 0 100%;
|
|
834
|
+
align-items: center;
|
|
835
|
+
justify-content: center;
|
|
836
|
+
gap: var(--xh-_cascader-gap);
|
|
837
|
+
padding: var(--xh-cascader-loading-p, var(--xh-space-3));
|
|
838
|
+
color: var(--xh-cascader-loading-fg, var(--xh-fg-muted));
|
|
839
|
+
font-size: var(--xh-cascader-loading-font-size, var(--xh-_cascader-font-size));
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
.xh-scope-cascader[data-part='loading'][hidden] {
|
|
843
|
+
display: none;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
/* 懒分支那一列:条目还没取回时列里只有一句次要文字(在途或失败),失败时下面跟一颗重试钮;
|
|
847
|
+
三块同一时刻至多露一种,露哪一块归连接层。文字的观感与整浮层的在途占位同一档 */
|
|
848
|
+
.xh-scope-cascader[data-part='branch-loading'],
|
|
849
|
+
.xh-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
|
+
.xh-scope-cascader[data-part='branch-retry-trigger'] {
|
|
863
|
+
align-self: center;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
.xh-scope-cascader[data-part='branch-loading'][hidden],
|
|
867
|
+
.xh-scope-cascader[data-part='branch-error'][hidden],
|
|
868
|
+
.xh-scope-cascader[data-part='branch-retry-trigger'][hidden] {
|
|
869
|
+
display: none;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
/* 首次加载:文案前一枚加载环,由加载环配方画(连接层投影 data-xh-loading-ring 与 data-loading),
|
|
873
|
+
直径取所在尺寸档的图标档 */
|
|
874
|
+
.xh-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
|
+
|
|
881
|
+
/* 底栏在场时浮层壳允许换行:列照旧并排在第一行,底栏占满一整行落在列下面。
|
|
882
|
+
没写底栏的浮层不命中这条,列多到放不下时仍是整体横向滚动 */
|
|
883
|
+
.xh-scope-cascader[data-part='content']:has(> [data-part='footer']) {
|
|
884
|
+
flex-wrap: wrap;
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
/* 浮层底部的操作区:横跨全部列,与列之间用一条分隔线断开 */
|
|
888
|
+
.xh-scope-cascader[data-part='footer'] {
|
|
889
|
+
display: flex;
|
|
890
|
+
/* 基准就是一整行:换行容器里它因此自己独占一行,落在全部列的下面 */
|
|
891
|
+
flex-basis: 100%;
|
|
892
|
+
align-items: center;
|
|
893
|
+
gap: var(--xh-cascader-footer-gap, var(--xh-space-2));
|
|
894
|
+
padding-block: var(--xh-cascader-footer-py, var(--xh-space-2));
|
|
895
|
+
padding-inline: var(--xh-cascader-footer-px, var(--xh-space-2));
|
|
896
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-cascader-footer-border, var(--xh-border-subtle));
|
|
897
|
+
color: var(--xh-cascader-footer-fg, var(--xh-fg-muted));
|
|
898
|
+
font-size: var(--xh-cascader-footer-font-size, var(--xh-text-secondary-size));
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
/* 上面给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
|
|
902
|
+
.xh-scope-cascader[data-part='footer'][hidden] {
|
|
903
|
+
display: none;
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
907
|
+
.xh-scope-cascader[data-part='clear-trigger']:empty::before {
|
|
908
|
+
content: '';
|
|
909
|
+
display: inline-block;
|
|
910
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
911
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
912
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
913
|
+
background-color: currentColor;
|
|
914
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
915
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
@media (forced-colors: active) {
|
|
919
|
+
/* 蒙版底色会被系统改成 Canvas 而消失;明确用系统前景保住箭头、对号与半选横线。
|
|
920
|
+
按下与没被高亮时的悬停,家族把条目涂成 Highlight,字形跟着换 HighlightText。
|
|
921
|
+
触发器里的下拉箭头落在字段面上取 CanvasText,字段禁用时取 GrayText;
|
|
922
|
+
清除钮是按钮面,取 ButtonText,悬停与按下换 HighlightText,禁用取 GrayText */
|
|
923
|
+
.xh-scope-cascader[data-part='item'][data-branch]::after,
|
|
924
|
+
.xh-scope-cascader[data-part='item-indicator']:empty::before,
|
|
925
|
+
.xh-scope-cascader[data-part='search-item']::after,
|
|
926
|
+
.xh-scope-cascader[data-part='indicator']:empty::before {
|
|
927
|
+
forced-color-adjust: none;
|
|
928
|
+
background-color: CanvasText;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
.xh-scope-cascader[data-part='clear-trigger']:empty::before {
|
|
932
|
+
forced-color-adjust: none;
|
|
933
|
+
background-color: ButtonText;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
.xh-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
|
+
.xh-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])) .xh-scope-cascader[data-part='item-indicator']:empty::before,
|
|
938
|
+
.xh-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
|
+
.xh-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
|
+
|
|
943
|
+
.xh-scope-cascader[data-part='item'][data-branch][data-disabled]::after,
|
|
944
|
+
.xh-scope-cascader[data-part='item-indicator'][data-disabled]:empty::before,
|
|
945
|
+
.xh-scope-cascader[data-part='search-item'][data-disabled]::after,
|
|
946
|
+
.xh-scope-cascader[data-part='control'][data-disabled] .xh-scope-cascader[data-part='indicator']:empty::before,
|
|
947
|
+
.xh-scope-cascader[data-part='clear-trigger'][data-disabled]:empty::before {
|
|
948
|
+
background-color: GrayText;
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
@layer xihan.motion {
|
|
954
|
+
@media print {
|
|
955
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
956
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
957
|
+
.xh-scope-cascader[data-part='positioner'] {
|
|
958
|
+
display: none;
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
}
|