@xihan-ui/styles 1.0.0-alpha.2 → 1.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 +2177 -0
- package/README.md +1 -1
- package/css/accordion.css +80 -6
- package/css/alert.css +43 -14
- package/css/anchor.css +8 -8
- package/css/avatar-group.css +7 -3
- package/css/avatar.css +9 -3
- package/css/back-top.css +22 -1
- package/css/badge.css +104 -32
- package/css/breadcrumb.css +25 -5
- package/css/button-group.css +18 -13
- package/css/button.css +48 -11
- package/css/calendar.css +150 -7
- package/css/card.css +20 -11
- package/css/carousel.css +36 -5
- package/css/cascader.css +211 -124
- package/css/checkbox-group.css +72 -22
- package/css/checkbox.css +70 -13
- package/css/clipboard.css +2 -1
- package/css/code-block.css +12 -7
- package/css/collapsible.css +49 -3
- package/css/color-picker.css +132 -46
- package/css/combobox.css +132 -60
- package/css/composer.css +5 -3
- package/css/context-menu.css +113 -74
- package/css/date-field.css +93 -16
- package/css/date-picker.css +293 -72
- package/css/descriptions.css +11 -5
- package/css/dialog.css +47 -14
- package/css/download-trigger.css +76 -0
- package/css/drawer.css +57 -16
- package/css/dynamic-input.css +75 -17
- package/css/editable.css +12 -10
- package/css/ellipsis.css +7 -1
- package/css/empty-state.css +22 -12
- package/css/field.css +16 -6
- package/css/fieldset.css +69 -0
- package/css/file-upload.css +46 -8
- package/css/flex.css +13 -7
- package/css/float-button.css +23 -1
- package/css/floating-panel.css +316 -0
- package/css/form.css +4 -4
- package/css/grid.css +11 -5
- package/css/heatmap.css +411 -0
- package/css/highlight.css +2 -2
- package/css/hotkeys.css +90 -0
- package/css/hover-card.css +43 -45
- package/css/image-cropper.css +233 -0
- package/css/image-viewer.css +155 -17
- package/css/image.css +2 -2
- package/css/infinite-scroll.css +1 -1
- package/css/json-viewer.css +274 -0
- package/css/layout.css +19 -15
- package/css/list.css +22 -13
- package/css/listbox.css +24 -6
- package/css/loading-bar.css +12 -5
- package/css/log.css +7 -3
- package/css/marquee.css +9 -0
- package/css/masonry.css +63 -0
- package/css/mention.css +100 -36
- package/css/menu.css +127 -50
- package/css/menubar.css +155 -61
- package/css/navigation-menu.css +56 -31
- package/css/notification.css +377 -0
- package/css/number-animation.css +3 -3
- package/css/number-field.css +182 -19
- package/css/overlay-arrow.css +51 -0
- package/css/page-header.css +12 -5
- package/css/pagination.css +171 -14
- package/css/password-input.css +356 -0
- package/css/pin-input.css +15 -12
- package/css/popconfirm.css +55 -12
- package/css/popover.css +73 -45
- package/css/popselect.css +207 -57
- package/css/progress.css +54 -8
- package/css/qr-code.css +1 -1
- package/css/radio-group.css +27 -10
- package/css/rating.css +4 -4
- package/css/reset.css +17 -0
- package/css/result.css +21 -11
- package/css/scroll-area.css +61 -89
- package/css/scrollbar.css +170 -0
- package/css/segmented.css +215 -0
- package/css/select.css +298 -131
- package/css/separator.css +2 -2
- package/css/side-nav.css +127 -24
- package/css/signature-pad.css +144 -0
- package/css/skeleton.css +7 -1
- package/css/slider.css +14 -12
- package/css/space.css +117 -0
- package/css/spinner.css +22 -10
- package/css/statistic.css +9 -9
- package/css/steps.css +29 -12
- package/css/switch.css +57 -8
- package/css/table.css +146 -44
- package/css/tabs.css +13 -5
- package/css/tag.css +179 -0
- package/css/tags-input.css +80 -42
- package/css/text-field.css +151 -38
- package/css/thread.css +11 -3
- package/css/time-field.css +99 -18
- package/css/time-picker.css +261 -71
- package/css/timeline.css +15 -15
- package/css/timer.css +119 -0
- package/css/toast.css +129 -55
- package/css/toggle-group.css +30 -4
- package/css/toggle.css +12 -6
- package/css/tone.css +57 -22
- package/css/toolbar.css +1 -1
- package/css/tooltip.css +40 -31
- package/css/tour.css +112 -61
- package/css/transfer.css +98 -21
- package/css/tree-select.css +215 -89
- package/css/tree.css +131 -5
- package/css/typography.css +5 -5
- package/css/undefined.css +12 -1
- package/css/virtualizer.css +3 -1
- package/css/watermark.css +1 -2
- package/index.css +18 -1
- package/index.unlayered.css +10356 -3255
- package/package.json +20 -4
- package/css/toaster.css +0 -74
package/css/cascader.css
CHANGED
|
@@ -4,16 +4,35 @@
|
|
|
4
4
|
--xh-cascader-skin: 1;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
/*
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
8
|
+
[data-scope='cascader'][data-part='positioner'] {
|
|
9
|
+
/* 列区的自绘条浮在内容之上:轨道不上底色,实色轨道会在列区下缘糊出一条灰带 */
|
|
10
|
+
--xh-scrollbar-track-bg: transparent;
|
|
11
|
+
|
|
12
|
+
position: fixed;
|
|
13
|
+
z-index: var(--xh-cascader-layer, var(--xh-layer-popover));
|
|
14
|
+
/* 空壳不吃指针,交互只发生在 content 里 */
|
|
15
|
+
pointer-events: none;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
19
|
+
[data-scope='cascader'][data-part='positioner'][data-hidden] {
|
|
20
|
+
visibility: hidden;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
|
|
24
|
+
[data-scope='cascader']:is([data-part='root'], [data-part='positioner']) {
|
|
25
|
+
/* 作者塞进指示符槽的图标跟着尺寸档走,与皮肤画的兜底字形同一把尺 */
|
|
26
|
+
--xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-md));
|
|
27
|
+
|
|
28
|
+
/* 尺寸档只换这几个私有槽,盒与列里的条目都从这两处继承它们,换档不必给每个部件各写一条选择器 */
|
|
12
29
|
--xh-_cascader-h: var(--xh-control-h-md);
|
|
13
30
|
--xh-_cascader-px: var(--xh-control-px-md);
|
|
31
|
+
--xh-_cascader-row-py: var(--xh-list-option-py-md);
|
|
32
|
+
--xh-_cascader-row-px: var(--xh-control-px-md);
|
|
14
33
|
--xh-_cascader-gap: var(--xh-control-gap-md);
|
|
15
|
-
--xh-_cascader-font-size: var(--xh-
|
|
16
|
-
--xh-_cascader-label-font-size: var(--xh-
|
|
34
|
+
--xh-_cascader-font-size: var(--xh-control-font-md);
|
|
35
|
+
--xh-_cascader-label-font-size: var(--xh-control-font-md);
|
|
17
36
|
|
|
18
37
|
/* 形态档只换触发框的描边与底色这三个槽,浮层与列不跟着变:
|
|
19
38
|
变的是「这是个输入位」的表达方式,不是弹出内容的表达方式 */
|
|
@@ -27,9 +46,14 @@
|
|
|
27
46
|
/* 展开路径的底色:随语气走淡底,没写 data-tone 时退回品牌淡底 */
|
|
28
47
|
--xh-_cascader-active-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
|
|
29
48
|
|
|
49
|
+
/* 聚焦环恒用固定环色;校验失败时换成告警环色 */
|
|
50
|
+
--xh-_cascader-ring: var(--xh-ring-focus);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* 标签一行、盒一行的两行堆叠 */
|
|
54
|
+
[data-scope='cascader'][data-part='root'] {
|
|
30
55
|
display: inline-flex;
|
|
31
|
-
flex-
|
|
32
|
-
align-items: center;
|
|
56
|
+
flex-direction: column;
|
|
33
57
|
gap: var(--xh-cascader-gap, var(--xh-space-1));
|
|
34
58
|
}
|
|
35
59
|
|
|
@@ -41,48 +65,52 @@
|
|
|
41
65
|
/* —— 形态 —— */
|
|
42
66
|
/* 形态只决定描边与底色怎么用;用哪族颜色由 data-tone 决定,没写 tone 就沿用原来的中性配色 */
|
|
43
67
|
/* outline 就是缺省那一身:描边加画布底,写出来只为让三档并列可读 */
|
|
44
|
-
[data-scope='cascader'][data-part='root'][data-variant='outline'] {
|
|
68
|
+
[data-scope='cascader']:is([data-part='root'], [data-part='positioner'])[data-variant='outline'] {
|
|
45
69
|
--xh-_cascader-border: var(--xh-border-control);
|
|
46
70
|
--xh-_cascader-border-hover: var(--xh-border-control-hover);
|
|
47
71
|
--xh-_cascader-bg: var(--xh-bg-canvas);
|
|
48
72
|
}
|
|
49
73
|
|
|
50
74
|
/* subtle 是填充式:底色接过「这里能点」的表达,描边随之让位 */
|
|
51
|
-
[data-scope='cascader'][data-part='root'][data-variant='subtle'] {
|
|
75
|
+
[data-scope='cascader']:is([data-part='root'], [data-part='positioner'])[data-variant='subtle'] {
|
|
52
76
|
--xh-_cascader-border: transparent;
|
|
53
77
|
--xh-_cascader-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
54
78
|
--xh-_cascader-bg: var(--xh-_tone-subtle, var(--xh-bg-subtle));
|
|
55
79
|
}
|
|
56
80
|
|
|
57
|
-
/*
|
|
58
|
-
[data-scope='cascader'][data-part='root'][data-variant='ghost'] {
|
|
81
|
+
/* 无框:底与常态描边透明,悬停浮出描边,聚焦由焦点环表达 */
|
|
82
|
+
[data-scope='cascader']:is([data-part='root'], [data-part='positioner'])[data-variant='ghost'] {
|
|
59
83
|
--xh-_cascader-border: transparent;
|
|
60
|
-
--xh-_cascader-border-hover:
|
|
84
|
+
--xh-_cascader-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
61
85
|
--xh-_cascader-bg: transparent;
|
|
62
86
|
}
|
|
63
87
|
|
|
64
88
|
/* —— 尺寸 —— */
|
|
65
89
|
/* 缺省档写在上面的基础规则里 */
|
|
66
|
-
[data-scope='cascader'][data-part='root'][data-size='sm'] {
|
|
90
|
+
[data-scope='cascader']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
|
|
91
|
+
--xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-sm));
|
|
67
92
|
--xh-_cascader-h: var(--xh-control-h-sm);
|
|
68
93
|
--xh-_cascader-px: var(--xh-control-px-sm);
|
|
94
|
+
--xh-_cascader-row-py: var(--xh-list-option-py-sm);
|
|
95
|
+
--xh-_cascader-row-px: var(--xh-control-px-sm);
|
|
69
96
|
--xh-_cascader-gap: var(--xh-control-gap-sm);
|
|
70
|
-
--xh-_cascader-font-size: var(--xh-font-
|
|
71
|
-
--xh-_cascader-label-font-size: var(--xh-font-
|
|
97
|
+
--xh-_cascader-font-size: var(--xh-control-font-sm);
|
|
98
|
+
--xh-_cascader-label-font-size: var(--xh-control-font-sm);
|
|
72
99
|
}
|
|
73
100
|
|
|
74
|
-
[data-scope='cascader'][data-part='root'][data-size='lg'] {
|
|
101
|
+
[data-scope='cascader']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
|
|
102
|
+
--xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-lg));
|
|
75
103
|
--xh-_cascader-h: var(--xh-control-h-lg);
|
|
76
104
|
--xh-_cascader-px: var(--xh-control-px-lg);
|
|
105
|
+
--xh-_cascader-row-py: var(--xh-list-option-py-lg);
|
|
106
|
+
--xh-_cascader-row-px: var(--xh-control-px-lg);
|
|
77
107
|
--xh-_cascader-gap: var(--xh-control-gap-lg);
|
|
78
|
-
--xh-_cascader-font-size: var(--xh-font-
|
|
79
|
-
--xh-_cascader-label-font-size: var(--xh-font-
|
|
108
|
+
--xh-_cascader-font-size: var(--xh-control-font-lg);
|
|
109
|
+
--xh-_cascader-label-font-size: var(--xh-control-font-lg);
|
|
80
110
|
}
|
|
81
111
|
|
|
82
112
|
[data-scope='cascader'][data-part='label'] {
|
|
83
|
-
|
|
84
|
-
flex-basis: 100%;
|
|
85
|
-
color: var(--xh-cascader-label-fg, var(--xh-fg-muted));
|
|
113
|
+
color: var(--xh-cascader-label-fg, var(--xh-fg-default));
|
|
86
114
|
font-size: var(--xh-cascader-label-font-size, var(--xh-_cascader-label-font-size));
|
|
87
115
|
font-weight: var(--xh-cascader-label-font-weight, var(--xh-text-label-weight));
|
|
88
116
|
line-height: var(--xh-leading-none);
|
|
@@ -93,64 +121,88 @@
|
|
|
93
121
|
color: var(--xh-fg-subtle);
|
|
94
122
|
}
|
|
95
123
|
|
|
96
|
-
/*
|
|
97
|
-
|
|
98
|
-
[data-scope='cascader'][data-part='trigger'] {
|
|
124
|
+
/* 盒:描边、底色、控件高度与行内内衬都落在这一层,触发按钮与清空按钮在里面并排 */
|
|
125
|
+
[data-scope='cascader'][data-part='control'] {
|
|
99
126
|
display: inline-flex;
|
|
100
|
-
flex: 1;
|
|
101
127
|
align-items: center;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
border: var(--xh-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
color: var(--xh-cascader-trigger-fg, var(--xh-fg-default));
|
|
111
|
-
font-family: inherit;
|
|
112
|
-
font-size: var(--xh-cascader-trigger-font-size, var(--xh-_cascader-font-size));
|
|
113
|
-
line-height: var(--xh-leading-none);
|
|
114
|
-
text-align: start;
|
|
128
|
+
gap: var(--xh-cascader-control-gap, var(--xh-_cascader-gap));
|
|
129
|
+
min-inline-size: var(--xh-cascader-control-min-w, var(--xh-control-min-w));
|
|
130
|
+
block-size: var(--xh-cascader-control-h, var(--xh-_cascader-h));
|
|
131
|
+
padding-inline: var(--xh-cascader-control-px, var(--xh-_cascader-px));
|
|
132
|
+
border: var(--xh-stroke-thin) solid var(--xh-cascader-control-border, var(--xh-_cascader-border));
|
|
133
|
+
border-radius: var(--xh-cascader-control-radius, var(--xh-shape-control));
|
|
134
|
+
background: var(--xh-cascader-control-bg, var(--xh-_cascader-bg));
|
|
135
|
+
color: var(--xh-cascader-control-fg, var(--xh-fg-default));
|
|
115
136
|
cursor: pointer;
|
|
116
137
|
transition: border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
117
138
|
}
|
|
118
139
|
|
|
119
|
-
[data-scope='cascader'][data-part='
|
|
140
|
+
[data-scope='cascader'][data-part='control'][hidden] {
|
|
120
141
|
display: none;
|
|
121
142
|
}
|
|
122
143
|
|
|
123
144
|
/* hover 只在中性态换描边:invalid 正拿边框颜色说事,被 hover 盖掉那条信息就没了 */
|
|
124
|
-
[data-scope='cascader'][data-part='
|
|
125
|
-
border-color: var(--xh-cascader-
|
|
145
|
+
[data-scope='cascader'][data-part='control']:hover:not([data-disabled], [data-invalid]) {
|
|
146
|
+
border-color: var(--xh-cascader-control-border-hover, var(--xh-_cascader-border-hover));
|
|
126
147
|
}
|
|
127
148
|
|
|
128
|
-
/*
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
outline: var(--xh-ring-width) solid var(--xh-ring
|
|
149
|
+
/* Tab 停靠点是盒里的 trigger(展开后才移进列里),环画在盒上 */
|
|
150
|
+
[data-scope='cascader'][data-part='control']:focus-within:not([data-disabled]) {
|
|
151
|
+
border-color: var(--xh-cascader-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
|
|
152
|
+
outline: var(--xh-ring-width) solid var(--xh-_cascader-ring);
|
|
132
153
|
outline-offset: var(--xh-ring-offset);
|
|
133
154
|
}
|
|
134
155
|
|
|
135
|
-
[data-scope='cascader'][data-part='
|
|
136
|
-
border-color: var(--xh-cascader-
|
|
156
|
+
[data-scope='cascader'][data-part='control'][data-invalid] {
|
|
157
|
+
border-color: var(--xh-cascader-control-border-invalid, var(--xh-border-invalid));
|
|
158
|
+
|
|
159
|
+
/* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
|
|
160
|
+
--xh-_cascader-ring: var(--xh-ring-invalid);
|
|
137
161
|
}
|
|
138
162
|
|
|
139
163
|
/* 只读仍可聚焦、浮层仍展得开、列仍能浏览,所以不置灰,只把底色压下去表示「改不动」 */
|
|
140
|
-
[data-scope='cascader'][data-part='
|
|
141
|
-
background: var(--xh-cascader-
|
|
164
|
+
[data-scope='cascader'][data-part='control'][data-readonly] {
|
|
165
|
+
background: var(--xh-cascader-control-bg-readonly, var(--xh-bg-subtle));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
[data-scope='cascader'][data-part='control'][data-disabled] {
|
|
169
|
+
background: var(--xh-cascader-control-bg-disabled, var(--xh-bg-subtle));
|
|
170
|
+
color: var(--xh-fg-disabled);
|
|
171
|
+
cursor: not-allowed;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* 盒内那颗可聚焦的按钮:不画描边不铺底也不自带高度,只占满剩余宽度、排布回显与箭头 */
|
|
175
|
+
[data-scope='cascader'][data-part='trigger'] {
|
|
176
|
+
display: inline-flex;
|
|
177
|
+
flex: 1 1 auto;
|
|
178
|
+
align-items: center;
|
|
179
|
+
justify-content: space-between;
|
|
180
|
+
gap: var(--xh-cascader-trigger-gap, var(--xh-_cascader-gap));
|
|
181
|
+
min-inline-size: 0;
|
|
182
|
+
padding: 0;
|
|
183
|
+
border: 0;
|
|
184
|
+
background: transparent;
|
|
185
|
+
color: var(--xh-cascader-trigger-fg, var(--xh-fg-default));
|
|
186
|
+
font-family: inherit;
|
|
187
|
+
font-size: var(--xh-cascader-trigger-font-size, var(--xh-_cascader-font-size));
|
|
188
|
+
line-height: var(--xh-leading-none);
|
|
189
|
+
text-align: start;
|
|
190
|
+
cursor: pointer;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
[data-scope='cascader'][data-part='trigger'][hidden] {
|
|
194
|
+
display: none;
|
|
142
195
|
}
|
|
143
196
|
|
|
144
197
|
/* trigger 是单体控件,用原生 disabled(列里的集合条目一律 aria-disabled,写 :disabled 永不命中) */
|
|
145
198
|
[data-scope='cascader'][data-part='trigger']:disabled {
|
|
146
|
-
background: var(--xh-cascader-trigger-bg-disabled, var(--xh-bg-subtle));
|
|
147
199
|
color: var(--xh-fg-disabled);
|
|
148
200
|
cursor: not-allowed;
|
|
149
201
|
}
|
|
150
202
|
|
|
151
|
-
/*
|
|
203
|
+
/* 路径连起来会很长,必须能截断;框宽由盒定,这里得允许自己被压缩 */
|
|
152
204
|
[data-scope='cascader'][data-part='value-text'] {
|
|
153
|
-
flex: 1;
|
|
205
|
+
flex: 1 1 auto;
|
|
154
206
|
min-inline-size: 0;
|
|
155
207
|
overflow: hidden;
|
|
156
208
|
white-space: nowrap;
|
|
@@ -166,6 +218,12 @@
|
|
|
166
218
|
color: var(--xh-fg-disabled);
|
|
167
219
|
}
|
|
168
220
|
|
|
221
|
+
/* 有值时清空钮顶上来,箭头让位:两个图标并排堆着,用户分不清点哪个。
|
|
222
|
+
让位而不是禁用——禁用的图标还占着位置,看着像坏了 */
|
|
223
|
+
[data-scope='cascader'][data-part='indicator'][data-clearable] {
|
|
224
|
+
display: none;
|
|
225
|
+
}
|
|
226
|
+
|
|
169
227
|
[data-scope='cascader'][data-part='indicator'] {
|
|
170
228
|
display: inline-flex;
|
|
171
229
|
flex: none;
|
|
@@ -181,7 +239,14 @@
|
|
|
181
239
|
|
|
182
240
|
/* 没写内容就由皮肤画箭头;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
183
241
|
[data-scope='cascader'][data-part='indicator']:empty::before {
|
|
184
|
-
content: '
|
|
242
|
+
content: '';
|
|
243
|
+
display: inline-block;
|
|
244
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
245
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
246
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
247
|
+
background-color: currentColor;
|
|
248
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
249
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
185
250
|
}
|
|
186
251
|
|
|
187
252
|
[data-scope='cascader'][data-part='indicator'][data-state='open'] {
|
|
@@ -192,7 +257,7 @@
|
|
|
192
257
|
color: var(--xh-fg-disabled);
|
|
193
258
|
}
|
|
194
259
|
|
|
195
|
-
/*
|
|
260
|
+
/* 盒内靠右的小方钮,不撑高那一行 */
|
|
196
261
|
[data-scope='cascader'][data-part='clear-trigger'] {
|
|
197
262
|
display: inline-flex;
|
|
198
263
|
flex: none;
|
|
@@ -206,24 +271,25 @@
|
|
|
206
271
|
background: var(--xh-cascader-action-bg, transparent);
|
|
207
272
|
color: var(--xh-cascader-action-fg, var(--xh-fg-muted));
|
|
208
273
|
font-family: inherit;
|
|
209
|
-
font-size: var(--xh-cascader-action-font-size, var(--xh-
|
|
274
|
+
font-size: var(--xh-cascader-action-font-size, var(--xh-text-secondary-size));
|
|
210
275
|
line-height: var(--xh-leading-none);
|
|
211
276
|
cursor: pointer;
|
|
212
277
|
user-select: none;
|
|
213
|
-
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
278
|
+
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter), scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
214
279
|
}
|
|
215
280
|
|
|
216
281
|
[data-scope='cascader'][data-part='clear-trigger'][hidden] {
|
|
217
282
|
display: none;
|
|
218
283
|
}
|
|
219
284
|
|
|
220
|
-
[data-scope='cascader'][data-part='clear-trigger']:hover
|
|
285
|
+
[data-scope='cascader'][data-part='clear-trigger']:hover {
|
|
221
286
|
background: var(--xh-cascader-action-bg-hover, var(--xh-bg-subtle-hover));
|
|
222
287
|
color: var(--xh-cascader-action-fg-hover, var(--xh-fg-default));
|
|
223
288
|
}
|
|
224
289
|
|
|
225
|
-
[data-scope='cascader'][data-part='clear-trigger']:active
|
|
290
|
+
[data-scope='cascader'][data-part='clear-trigger']:active {
|
|
226
291
|
background: var(--xh-cascader-action-bg-active, var(--xh-bg-subtle-active));
|
|
292
|
+
scale: var(--xh-motion-scale-press);
|
|
227
293
|
}
|
|
228
294
|
|
|
229
295
|
/* 清空按钮退出了 Tab 序列(tabindex=-1),正常操作走不到这里;
|
|
@@ -233,47 +299,28 @@
|
|
|
233
299
|
outline-offset: var(--xh-ring-offset);
|
|
234
300
|
}
|
|
235
301
|
|
|
236
|
-
/* 无选中、只读、整控件禁用三种情况下都按不动,用的是原生 disabled */
|
|
237
|
-
[data-scope='cascader'][data-part='clear-trigger']:disabled {
|
|
238
|
-
background: var(--xh-cascader-action-bg, transparent);
|
|
239
|
-
color: var(--xh-fg-disabled);
|
|
240
|
-
cursor: not-allowed;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
244
|
-
[data-scope='cascader'][data-part='positioner'] {
|
|
245
|
-
position: fixed;
|
|
246
|
-
z-index: var(--xh-layer-popover);
|
|
247
|
-
/* 空壳不吃指针,交互只发生在 content 里 */
|
|
248
|
-
pointer-events: none;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
252
|
-
[data-scope='cascader'][data-part='positioner'][data-hidden] {
|
|
253
|
-
visibility: hidden;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
302
|
/* 级联的骨架就在这一条上:列沿书写方向并排,一层一列。
|
|
257
303
|
横向随列数增减,因此不设固定宽度,只给每列自己的宽度 */
|
|
258
304
|
[data-scope='cascader'][data-part='content'] {
|
|
259
305
|
display: flex;
|
|
260
306
|
flex-direction: row;
|
|
261
307
|
align-items: stretch;
|
|
262
|
-
max-inline-size: var(--xh-cascader-content-max-w,
|
|
308
|
+
max-inline-size: var(--xh-cascader-content-max-w, var(--xh-overlay-max-w-xl));
|
|
263
309
|
border: var(--xh-stroke-thin) solid var(--xh-cascader-content-border, var(--xh-border-default));
|
|
264
310
|
border-radius: var(--xh-cascader-content-radius, var(--xh-shape-surface));
|
|
265
311
|
background: var(--xh-cascader-content-bg, var(--xh-bg-surface));
|
|
266
312
|
color: var(--xh-cascader-content-fg, var(--xh-fg-default));
|
|
267
|
-
box-shadow: var(--xh-cascader-content-shadow, var(--xh-elevation-
|
|
313
|
+
box-shadow: var(--xh-cascader-content-shadow, var(--xh-elevation-floating));
|
|
268
314
|
/* 列多到放不下时整体横向滚动;纵向溢出归每一列自己 */
|
|
269
315
|
overflow-x: auto;
|
|
270
316
|
pointer-events: auto;
|
|
271
317
|
}
|
|
272
318
|
|
|
273
|
-
/*
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
319
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
320
|
+
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
321
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
322
|
+
真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
|
|
323
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
277
324
|
|
|
278
325
|
/* 容器只是焦点域的兜底落点,落焦不画环:高亮永远长在条目上 */
|
|
279
326
|
[data-scope='cascader'][data-part='content']:focus-visible {
|
|
@@ -281,14 +328,13 @@
|
|
|
281
328
|
}
|
|
282
329
|
|
|
283
330
|
[data-scope='cascader'][data-part='content'][data-state='open'] {
|
|
284
|
-
|
|
285
|
-
--xh-_cascader-slide: calc(-1 * var(--xh-motion-distance-sm));
|
|
286
|
-
|
|
287
|
-
animation: xh-cascader-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
331
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
288
332
|
}
|
|
289
333
|
|
|
290
|
-
|
|
291
|
-
|
|
334
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
335
|
+
免得动画结束到真收起之间闪一下原样 */
|
|
336
|
+
[data-scope='cascader'][data-part='content'][data-state='closed'] {
|
|
337
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
292
338
|
}
|
|
293
339
|
|
|
294
340
|
/* 一列:宽度由内容撑出、设下限防塌,高度定死——切换展开路径时浮层不上下跳动,
|
|
@@ -297,8 +343,9 @@
|
|
|
297
343
|
display: flex;
|
|
298
344
|
flex: none;
|
|
299
345
|
flex-direction: column;
|
|
346
|
+
gap: var(--xh-cascader-column-gap, var(--xh-list-option-gap));
|
|
300
347
|
min-inline-size: var(--xh-cascader-column-min-w, 7rem);
|
|
301
|
-
block-size: var(--xh-cascader-column-h,
|
|
348
|
+
block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
|
|
302
349
|
padding-block: var(--xh-cascader-column-py, var(--xh-space-1));
|
|
303
350
|
padding-inline: var(--xh-cascader-column-px, var(--xh-space-1));
|
|
304
351
|
overflow-y: auto;
|
|
@@ -331,9 +378,9 @@
|
|
|
331
378
|
display: flex;
|
|
332
379
|
align-items: center;
|
|
333
380
|
gap: var(--xh-cascader-row-gap, var(--xh-_cascader-gap));
|
|
334
|
-
max-inline-size: var(--xh-cascader-row-max-w,
|
|
335
|
-
padding-block: var(--xh-cascader-row-py, var(--xh-
|
|
336
|
-
padding-inline: var(--xh-cascader-row-px, var(--xh-
|
|
381
|
+
max-inline-size: var(--xh-cascader-row-max-w, var(--xh-overlay-max-w));
|
|
382
|
+
padding-block: var(--xh-cascader-row-py, var(--xh-_cascader-row-py));
|
|
383
|
+
padding-inline: var(--xh-cascader-row-px, var(--xh-_cascader-row-px));
|
|
337
384
|
border-radius: var(--xh-cascader-row-radius, var(--xh-shape-control));
|
|
338
385
|
color: var(--xh-cascader-row-fg, var(--xh-fg-default));
|
|
339
386
|
font-size: var(--xh-cascader-row-font-size, var(--xh-_cascader-font-size));
|
|
@@ -361,14 +408,14 @@
|
|
|
361
408
|
}
|
|
362
409
|
|
|
363
410
|
/* 必须排在轻档之后:锚点走到路径上时同特指度靠书写顺序压过轻档 */
|
|
364
|
-
[data-scope='cascader'][data-part='item']:not([data-disabled])[data-
|
|
411
|
+
[data-scope='cascader'][data-part='item']:not([data-disabled])[data-in-path] {
|
|
365
412
|
background: var(--xh-cascader-row-bg-active, var(--xh-_cascader-active-bg));
|
|
366
413
|
font-weight: var(--xh-cascader-row-active-font-weight, var(--xh-font-weight-semibold));
|
|
367
414
|
}
|
|
368
415
|
|
|
369
416
|
/* 选中只换文字色与字重,配合行尾的 ✓ 标记;底色强档归展开路径、轻档归悬停,
|
|
370
417
|
三者因此能同时看见 */
|
|
371
|
-
[data-scope='cascader'][data-part='item'][data-
|
|
418
|
+
[data-scope='cascader']:is([data-part='item'], [data-part='search-item'])[data-state='checked'] {
|
|
372
419
|
color: var(--xh-cascader-row-fg-selected, var(--xh-_cascader-selected-fg));
|
|
373
420
|
font-weight: var(--xh-cascader-row-selected-font-weight, var(--xh-font-weight-medium));
|
|
374
421
|
}
|
|
@@ -386,22 +433,17 @@
|
|
|
386
433
|
cursor: not-allowed;
|
|
387
434
|
}
|
|
388
435
|
|
|
389
|
-
/*
|
|
390
|
-
|
|
436
|
+
/* 分支条目行尾画右向小箭头:不点开也看得出还有下一级。位置由 item-text 的 flex:1 顶到行尾。
|
|
437
|
+
与菜单族的子菜单箭头同走字形令牌——此前这里是「描全边框再抹掉两条、把剩下的直角旋 45 度」,
|
|
438
|
+
作者换掉标记时换不动它,RTL 还得再翻一次旋转角 */
|
|
391
439
|
[data-scope='cascader'][data-part='item'][data-branch]::after {
|
|
392
440
|
content: '';
|
|
393
441
|
flex: none;
|
|
394
|
-
inline-size: var(--xh-cascader-branch-arrow-size, var(--xh-
|
|
395
|
-
block-size: var(--xh-cascader-branch-arrow-size, var(--xh-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
rotate: 45deg;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
/* rtl 下剩下的是块首与行末(物理左上)两边,反向旋 45 度才指向行进方向 */
|
|
403
|
-
[dir='rtl'] [data-scope='cascader'][data-part='item'][data-branch]::after {
|
|
404
|
-
rotate: -45deg;
|
|
442
|
+
inline-size: var(--xh-cascader-branch-arrow-size, var(--xh-icon-size, var(--xh-glyph-size-text)));
|
|
443
|
+
block-size: var(--xh-cascader-branch-arrow-size, var(--xh-icon-size, var(--xh-glyph-size-text)));
|
|
444
|
+
background-color: var(--xh-cascader-branch-arrow-fg, var(--xh-fg-subtle));
|
|
445
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
446
|
+
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
405
447
|
}
|
|
406
448
|
|
|
407
449
|
[data-scope='cascader'][data-part='item'][data-branch][data-disabled]::after {
|
|
@@ -423,7 +465,7 @@
|
|
|
423
465
|
align-items: center;
|
|
424
466
|
justify-content: center;
|
|
425
467
|
inline-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
|
|
426
|
-
color: var(--xh-cascader-item-indicator-fg, var(--xh-_tone, var(--xh-
|
|
468
|
+
color: var(--xh-cascader-item-indicator-fg, var(--xh-_tone, var(--xh-fg-brand)));
|
|
427
469
|
visibility: hidden;
|
|
428
470
|
}
|
|
429
471
|
|
|
@@ -433,21 +475,35 @@
|
|
|
433
475
|
|
|
434
476
|
/* 没写内容就由皮肤画勾;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
435
477
|
[data-scope='cascader'][data-part='item-indicator']:empty::before {
|
|
436
|
-
content: '
|
|
478
|
+
content: '';
|
|
479
|
+
display: inline-block;
|
|
480
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
481
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
482
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
483
|
+
background-color: currentColor;
|
|
484
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
485
|
+
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
437
486
|
}
|
|
438
487
|
|
|
439
|
-
[data-scope='cascader'][data-part='item-indicator'][data-
|
|
488
|
+
[data-scope='cascader'][data-part='item-indicator'][data-state='checked'] {
|
|
440
489
|
visibility: visible;
|
|
441
490
|
}
|
|
442
491
|
|
|
443
492
|
/* 级联勾选的半选态只在皮肤自绘(:empty)时露面画横杠:
|
|
444
493
|
作者塞了自己的选中图形时,半选放出来会顶着一个语义相反的勾,表达交还作者 */
|
|
445
|
-
[data-scope='cascader'][data-part='item-indicator'][data-indeterminate]:empty {
|
|
494
|
+
[data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty {
|
|
446
495
|
visibility: visible;
|
|
447
496
|
}
|
|
448
497
|
|
|
449
|
-
[data-scope='cascader'][data-part='item-indicator'][data-indeterminate]:
|
|
450
|
-
content: '
|
|
498
|
+
[data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty::before {
|
|
499
|
+
content: '';
|
|
500
|
+
display: inline-block;
|
|
501
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
502
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
503
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
504
|
+
background-color: currentColor;
|
|
505
|
+
-webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
506
|
+
mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
451
507
|
font-weight: var(--xh-font-weight-semibold);
|
|
452
508
|
}
|
|
453
509
|
|
|
@@ -466,7 +522,7 @@
|
|
|
466
522
|
padding-block: var(--xh-cascader-input-py, var(--xh-space-2));
|
|
467
523
|
padding-inline: var(--xh-cascader-input-px, var(--xh-control-px-md));
|
|
468
524
|
border: none;
|
|
469
|
-
border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-
|
|
525
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-border-subtle));
|
|
470
526
|
border-start-start-radius: inherit;
|
|
471
527
|
border-start-end-radius: inherit;
|
|
472
528
|
background: none;
|
|
@@ -484,11 +540,13 @@
|
|
|
484
540
|
display: none;
|
|
485
541
|
}
|
|
486
542
|
|
|
543
|
+
/* 与列同高:搜索视图与浏览视图互换时浮层不改高度,候选多了在列表内自己滚 */
|
|
487
544
|
[data-scope='cascader'][data-part='search-list'] {
|
|
488
545
|
display: flex;
|
|
489
546
|
flex-basis: 100%;
|
|
490
547
|
flex-direction: column;
|
|
491
|
-
|
|
548
|
+
gap: var(--xh-cascader-search-list-gap, var(--xh-list-option-gap));
|
|
549
|
+
block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
|
|
492
550
|
padding: var(--xh-cascader-search-p, var(--xh-space-1));
|
|
493
551
|
overflow-y: auto;
|
|
494
552
|
}
|
|
@@ -509,8 +567,8 @@
|
|
|
509
567
|
|
|
510
568
|
/* 候选与列内条目同一套行度量,虚拟高亮与悬停同用轻档 */
|
|
511
569
|
[data-scope='cascader'][data-part='search-item'] {
|
|
512
|
-
padding-block: var(--xh-cascader-row-py, var(--xh-
|
|
513
|
-
padding-inline: var(--xh-cascader-row-px, var(--xh-
|
|
570
|
+
padding-block: var(--xh-cascader-row-py, var(--xh-_cascader-row-py));
|
|
571
|
+
padding-inline: var(--xh-cascader-row-px, var(--xh-_cascader-row-px));
|
|
514
572
|
overflow: hidden;
|
|
515
573
|
border-radius: var(--xh-cascader-row-radius, var(--xh-shape-control));
|
|
516
574
|
color: var(--xh-cascader-row-fg, var(--xh-fg-default));
|
|
@@ -527,6 +585,12 @@
|
|
|
527
585
|
background: var(--xh-cascader-row-bg-hover, var(--xh-bg-subtle));
|
|
528
586
|
}
|
|
529
587
|
|
|
588
|
+
/* 焦点恒在输入框,环只跟虚拟高亮走,悬停不画;往内收,行是撑满列宽的,环画在外沿会被裁掉 */
|
|
589
|
+
[data-scope='cascader'][data-part='search-item']:not([data-disabled])[data-highlighted] {
|
|
590
|
+
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
591
|
+
outline-offset: calc(-1 * var(--xh-ring-width));
|
|
592
|
+
}
|
|
593
|
+
|
|
530
594
|
[data-scope='cascader'][data-part='search-item'][data-disabled] {
|
|
531
595
|
color: var(--xh-fg-disabled);
|
|
532
596
|
cursor: not-allowed;
|
|
@@ -557,21 +621,44 @@
|
|
|
557
621
|
[data-scope='cascader'][data-part='empty'][hidden] {
|
|
558
622
|
display: none;
|
|
559
623
|
}
|
|
624
|
+
|
|
625
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
626
|
+
[data-scope='cascader'][data-part='clear-trigger']:empty::before {
|
|
627
|
+
content: '';
|
|
628
|
+
display: inline-block;
|
|
629
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
630
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
631
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
632
|
+
background-color: currentColor;
|
|
633
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
634
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
635
|
+
}
|
|
560
636
|
}
|
|
561
637
|
|
|
562
638
|
@layer xihan.motion {
|
|
563
639
|
/* 浮层是横向长出来的:淡入之外再沿书写方向起始缘推一小段,观感上像列被「拉开」。
|
|
564
640
|
位移量从 content 上的私有槽取,rtl 侧翻符号后同一份关键帧两个方向都对。
|
|
565
641
|
关键帧写在本文件里、名字带组件前缀,不动公共的那一份 */
|
|
566
|
-
@keyframes xh-
|
|
642
|
+
@keyframes xh-pop-in {
|
|
567
643
|
from {
|
|
568
644
|
opacity: 0;
|
|
569
|
-
|
|
645
|
+
scale: var(--xh-motion-scale-enter);
|
|
570
646
|
}
|
|
571
647
|
|
|
572
648
|
to {
|
|
573
649
|
opacity: 1;
|
|
574
|
-
|
|
650
|
+
scale: 1;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
@keyframes xh-pop-out {
|
|
654
|
+
from {
|
|
655
|
+
opacity: 1;
|
|
656
|
+
scale: 1;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
to {
|
|
660
|
+
opacity: 0;
|
|
661
|
+
scale: var(--xh-motion-scale-enter);
|
|
575
662
|
}
|
|
576
663
|
}
|
|
577
664
|
}
|