@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/tree-select.css
CHANGED
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
@layer xihan.motion {
|
|
2
2
|
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
3
|
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
-
@keyframes xh-
|
|
4
|
+
@keyframes xh-pop-in {
|
|
5
5
|
from {
|
|
6
6
|
opacity: 0;
|
|
7
|
+
scale: var(--xh-motion-scale-enter);
|
|
7
8
|
}
|
|
8
9
|
|
|
9
10
|
to {
|
|
10
11
|
opacity: 1;
|
|
12
|
+
scale: 1;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
@keyframes xh-pop-out {
|
|
16
|
+
from {
|
|
17
|
+
opacity: 1;
|
|
18
|
+
scale: 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
to {
|
|
22
|
+
opacity: 0;
|
|
23
|
+
scale: var(--xh-motion-scale-enter);
|
|
11
24
|
}
|
|
12
25
|
}
|
|
13
26
|
}
|
|
@@ -18,16 +31,39 @@
|
|
|
18
31
|
--xh-tree-select-skin: 1;
|
|
19
32
|
}
|
|
20
33
|
|
|
21
|
-
/*
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
34
|
+
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
35
|
+
[data-scope='tree-select'][data-part='positioner'] {
|
|
36
|
+
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
|
|
37
|
+
引擎没算(尚未落位 / 无引擎)时不额外限高 */
|
|
38
|
+
--xh-_tree-select-available-h: 100vh;
|
|
39
|
+
|
|
40
|
+
/* 树的自绘条浮在内容之上:轨道不上底色,实色轨道会沿内容边缘糊出一条灰带 */
|
|
41
|
+
--xh-scrollbar-track-bg: transparent;
|
|
42
|
+
|
|
43
|
+
position: fixed;
|
|
44
|
+
z-index: var(--xh-tree-select-layer, var(--xh-layer-popover));
|
|
45
|
+
/* 空壳不吃指针,交互只发生在 content 里 */
|
|
46
|
+
pointer-events: none;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
50
|
+
[data-scope='tree-select'][data-part='positioner'][data-hidden] {
|
|
51
|
+
visibility: hidden;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
|
|
55
|
+
[data-scope='tree-select']:is([data-part='root'], [data-part='positioner']) {
|
|
56
|
+
/* 作者塞进指示符槽的图标跟着尺寸档走,与皮肤画的兜底字形同一把尺 */
|
|
57
|
+
--xh-icon-size: var(--xh-tree-select-icon-size, var(--xh-glyph-size-md));
|
|
58
|
+
|
|
59
|
+
/* 尺寸档只换这几个私有槽,盒与树里的行都从这两处继承它们,换档不必给每个部件各写一条选择器 */
|
|
26
60
|
--xh-_tree-select-h: var(--xh-control-h-md);
|
|
27
61
|
--xh-_tree-select-px: var(--xh-control-px-md);
|
|
62
|
+
--xh-_tree-select-row-py: var(--xh-list-option-py-md);
|
|
63
|
+
--xh-_tree-select-row-px: var(--xh-control-px-md);
|
|
28
64
|
--xh-_tree-select-gap: var(--xh-control-gap-md);
|
|
29
|
-
--xh-_tree-select-font-size: var(--xh-
|
|
30
|
-
--xh-_tree-select-label-font-size: var(--xh-
|
|
65
|
+
--xh-_tree-select-font-size: var(--xh-control-font-md);
|
|
66
|
+
--xh-_tree-select-label-font-size: var(--xh-control-font-md);
|
|
31
67
|
|
|
32
68
|
/* 形态档只换触发框的描边与底色这三个槽,浮层与树不跟着变:
|
|
33
69
|
变的是「这是个输入位」的表达方式,不是弹出内容的表达方式 */
|
|
@@ -38,9 +74,14 @@
|
|
|
38
74
|
/* 选中行的文字色随语气走,没写 data-tone 时退回品牌强调色 */
|
|
39
75
|
--xh-_tree-select-selected-fg: var(--xh-_tone-fg, var(--xh-fg-brand-strong));
|
|
40
76
|
|
|
77
|
+
/* 聚焦环恒用固定环色;校验失败时换成告警环色 */
|
|
78
|
+
--xh-_tree-select-ring: var(--xh-ring-focus);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* 标签一行、盒一行的两行堆叠 */
|
|
82
|
+
[data-scope='tree-select'][data-part='root'] {
|
|
41
83
|
display: inline-flex;
|
|
42
|
-
flex-
|
|
43
|
-
align-items: center;
|
|
84
|
+
flex-direction: column;
|
|
44
85
|
gap: var(--xh-tree-select-gap, var(--xh-space-1));
|
|
45
86
|
}
|
|
46
87
|
|
|
@@ -52,48 +93,52 @@
|
|
|
52
93
|
/* —— 形态 —— */
|
|
53
94
|
/* 形态只决定描边与底色怎么用;用哪族颜色由 data-tone 决定,没写 tone 就沿用原来的中性配色 */
|
|
54
95
|
/* outline 就是缺省那一身:描边加画布底,写出来只为让三档并列可读 */
|
|
55
|
-
[data-scope='tree-select'][data-part='root'][data-variant='outline'] {
|
|
96
|
+
[data-scope='tree-select']:is([data-part='root'], [data-part='positioner'])[data-variant='outline'] {
|
|
56
97
|
--xh-_tree-select-border: var(--xh-border-control);
|
|
57
98
|
--xh-_tree-select-border-hover: var(--xh-border-control-hover);
|
|
58
99
|
--xh-_tree-select-bg: var(--xh-bg-canvas);
|
|
59
100
|
}
|
|
60
101
|
|
|
61
102
|
/* subtle 是填充式:底色接过「这里能点」的表达,描边随之让位 */
|
|
62
|
-
[data-scope='tree-select'][data-part='root'][data-variant='subtle'] {
|
|
103
|
+
[data-scope='tree-select']:is([data-part='root'], [data-part='positioner'])[data-variant='subtle'] {
|
|
63
104
|
--xh-_tree-select-border: transparent;
|
|
64
105
|
--xh-_tree-select-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
65
106
|
--xh-_tree-select-bg: var(--xh-_tone-subtle, var(--xh-bg-subtle));
|
|
66
107
|
}
|
|
67
108
|
|
|
68
|
-
/*
|
|
69
|
-
[data-scope='tree-select'][data-part='root'][data-variant='ghost'] {
|
|
109
|
+
/* 无框:底与常态描边透明,悬停浮出描边,聚焦由焦点环表达 */
|
|
110
|
+
[data-scope='tree-select']:is([data-part='root'], [data-part='positioner'])[data-variant='ghost'] {
|
|
70
111
|
--xh-_tree-select-border: transparent;
|
|
71
|
-
--xh-_tree-select-border-hover:
|
|
112
|
+
--xh-_tree-select-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
|
|
72
113
|
--xh-_tree-select-bg: transparent;
|
|
73
114
|
}
|
|
74
115
|
|
|
75
116
|
/* —— 尺寸 —— */
|
|
76
117
|
/* 缺省档写在上面的基础规则里 */
|
|
77
|
-
[data-scope='tree-select'][data-part='root'][data-size='sm'] {
|
|
118
|
+
[data-scope='tree-select']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
|
|
119
|
+
--xh-icon-size: var(--xh-tree-select-icon-size, var(--xh-glyph-size-sm));
|
|
78
120
|
--xh-_tree-select-h: var(--xh-control-h-sm);
|
|
79
121
|
--xh-_tree-select-px: var(--xh-control-px-sm);
|
|
122
|
+
--xh-_tree-select-row-py: var(--xh-list-option-py-sm);
|
|
123
|
+
--xh-_tree-select-row-px: var(--xh-control-px-sm);
|
|
80
124
|
--xh-_tree-select-gap: var(--xh-control-gap-sm);
|
|
81
|
-
--xh-_tree-select-font-size: var(--xh-font-
|
|
82
|
-
--xh-_tree-select-label-font-size: var(--xh-font-
|
|
125
|
+
--xh-_tree-select-font-size: var(--xh-control-font-sm);
|
|
126
|
+
--xh-_tree-select-label-font-size: var(--xh-control-font-sm);
|
|
83
127
|
}
|
|
84
128
|
|
|
85
|
-
[data-scope='tree-select'][data-part='root'][data-size='lg'] {
|
|
129
|
+
[data-scope='tree-select']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
|
|
130
|
+
--xh-icon-size: var(--xh-tree-select-icon-size, var(--xh-glyph-size-lg));
|
|
86
131
|
--xh-_tree-select-h: var(--xh-control-h-lg);
|
|
87
132
|
--xh-_tree-select-px: var(--xh-control-px-lg);
|
|
133
|
+
--xh-_tree-select-row-py: var(--xh-list-option-py-lg);
|
|
134
|
+
--xh-_tree-select-row-px: var(--xh-control-px-lg);
|
|
88
135
|
--xh-_tree-select-gap: var(--xh-control-gap-lg);
|
|
89
|
-
--xh-_tree-select-font-size: var(--xh-font-
|
|
90
|
-
--xh-_tree-select-label-font-size: var(--xh-font-
|
|
136
|
+
--xh-_tree-select-font-size: var(--xh-control-font-lg);
|
|
137
|
+
--xh-_tree-select-label-font-size: var(--xh-control-font-lg);
|
|
91
138
|
}
|
|
92
139
|
|
|
93
140
|
[data-scope='tree-select'][data-part='label'] {
|
|
94
|
-
|
|
95
|
-
flex-basis: 100%;
|
|
96
|
-
color: var(--xh-tree-select-label-fg, var(--xh-fg-muted));
|
|
141
|
+
color: var(--xh-tree-select-label-fg, var(--xh-fg-default));
|
|
97
142
|
font-size: var(--xh-tree-select-label-font-size, var(--xh-_tree-select-label-font-size));
|
|
98
143
|
font-weight: var(--xh-tree-select-label-font-weight, var(--xh-text-label-weight));
|
|
99
144
|
line-height: var(--xh-leading-none);
|
|
@@ -104,63 +149,88 @@
|
|
|
104
149
|
color: var(--xh-fg-subtle);
|
|
105
150
|
}
|
|
106
151
|
|
|
107
|
-
/*
|
|
108
|
-
|
|
109
|
-
[data-scope='tree-select'][data-part='trigger'] {
|
|
152
|
+
/* 盒:描边、底色、控件高度与行内内衬都落在这一层,触发按钮与清空按钮在里面并排 */
|
|
153
|
+
[data-scope='tree-select'][data-part='control'] {
|
|
110
154
|
display: inline-flex;
|
|
111
|
-
flex: 1;
|
|
112
155
|
align-items: center;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
border: var(--xh-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
color: var(--xh-tree-select-trigger-fg, var(--xh-fg-default));
|
|
122
|
-
font-family: inherit;
|
|
123
|
-
font-size: var(--xh-tree-select-trigger-font-size, var(--xh-_tree-select-font-size));
|
|
124
|
-
line-height: var(--xh-leading-none);
|
|
125
|
-
text-align: start;
|
|
156
|
+
gap: var(--xh-tree-select-control-gap, var(--xh-_tree-select-gap));
|
|
157
|
+
min-inline-size: var(--xh-tree-select-control-min-w, var(--xh-control-min-w));
|
|
158
|
+
block-size: var(--xh-tree-select-control-h, var(--xh-_tree-select-h));
|
|
159
|
+
padding-inline: var(--xh-tree-select-control-px, var(--xh-_tree-select-px));
|
|
160
|
+
border: var(--xh-stroke-thin) solid var(--xh-tree-select-control-border, var(--xh-_tree-select-border));
|
|
161
|
+
border-radius: var(--xh-tree-select-control-radius, var(--xh-shape-control));
|
|
162
|
+
background: var(--xh-tree-select-control-bg, var(--xh-_tree-select-bg));
|
|
163
|
+
color: var(--xh-tree-select-control-fg, var(--xh-fg-default));
|
|
126
164
|
cursor: pointer;
|
|
127
165
|
transition: border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
128
166
|
}
|
|
129
167
|
|
|
130
|
-
[data-scope='tree-select'][data-part='
|
|
168
|
+
[data-scope='tree-select'][data-part='control'][hidden] {
|
|
131
169
|
display: none;
|
|
132
170
|
}
|
|
133
171
|
|
|
134
172
|
/* hover 只在中性态换描边:invalid 正拿边框颜色说事,被 hover 盖掉那条信息就没了 */
|
|
135
|
-
[data-scope='tree-select'][data-part='
|
|
136
|
-
border-color: var(--xh-tree-select-
|
|
173
|
+
[data-scope='tree-select'][data-part='control']:hover:not([data-disabled], [data-invalid]) {
|
|
174
|
+
border-color: var(--xh-tree-select-control-border-hover, var(--xh-_tree-select-border-hover));
|
|
137
175
|
}
|
|
138
176
|
|
|
139
|
-
/*
|
|
140
|
-
[data-scope='tree-select'][data-part='
|
|
141
|
-
|
|
177
|
+
/* Tab 停靠点是盒里的 trigger(展开后才移进树里),环画在盒上 */
|
|
178
|
+
[data-scope='tree-select'][data-part='control']:focus-within:not([data-disabled]) {
|
|
179
|
+
border-color: var(--xh-tree-select-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
|
|
180
|
+
outline: var(--xh-ring-width) solid var(--xh-_tree-select-ring);
|
|
142
181
|
outline-offset: var(--xh-ring-offset);
|
|
143
182
|
}
|
|
144
183
|
|
|
145
|
-
[data-scope='tree-select'][data-part='
|
|
146
|
-
border-color: var(--xh-tree-select-
|
|
184
|
+
[data-scope='tree-select'][data-part='control'][data-invalid] {
|
|
185
|
+
border-color: var(--xh-tree-select-control-border-invalid, var(--xh-border-invalid));
|
|
186
|
+
|
|
187
|
+
/* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
|
|
188
|
+
--xh-_tree-select-ring: var(--xh-ring-invalid);
|
|
147
189
|
}
|
|
148
190
|
|
|
149
191
|
/* 只读仍可聚焦、浮层仍展得开、树仍能浏览,所以不置灰,只把底色压下去表示「改不动」 */
|
|
150
|
-
[data-scope='tree-select'][data-part='
|
|
151
|
-
background: var(--xh-tree-select-
|
|
192
|
+
[data-scope='tree-select'][data-part='control'][data-readonly] {
|
|
193
|
+
background: var(--xh-tree-select-control-bg-readonly, var(--xh-bg-subtle));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
[data-scope='tree-select'][data-part='control'][data-disabled] {
|
|
197
|
+
background: var(--xh-tree-select-control-bg-disabled, var(--xh-bg-subtle));
|
|
198
|
+
color: var(--xh-fg-disabled);
|
|
199
|
+
cursor: not-allowed;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* 盒内那颗可聚焦的按钮:不画描边不铺底也不自带高度,只占满剩余宽度、排布回显与箭头 */
|
|
203
|
+
[data-scope='tree-select'][data-part='trigger'] {
|
|
204
|
+
display: inline-flex;
|
|
205
|
+
flex: 1 1 auto;
|
|
206
|
+
align-items: center;
|
|
207
|
+
justify-content: space-between;
|
|
208
|
+
gap: var(--xh-tree-select-trigger-gap, var(--xh-_tree-select-gap));
|
|
209
|
+
min-inline-size: 0;
|
|
210
|
+
padding: 0;
|
|
211
|
+
border: 0;
|
|
212
|
+
background: transparent;
|
|
213
|
+
color: var(--xh-tree-select-trigger-fg, var(--xh-fg-default));
|
|
214
|
+
font-family: inherit;
|
|
215
|
+
font-size: var(--xh-tree-select-trigger-font-size, var(--xh-_tree-select-font-size));
|
|
216
|
+
line-height: var(--xh-leading-none);
|
|
217
|
+
text-align: start;
|
|
218
|
+
cursor: pointer;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
[data-scope='tree-select'][data-part='trigger'][hidden] {
|
|
222
|
+
display: none;
|
|
152
223
|
}
|
|
153
224
|
|
|
154
225
|
/* trigger 是单体控件,用原生 disabled(树里的集合条目一律 aria-disabled,写 :disabled 永不命中) */
|
|
155
226
|
[data-scope='tree-select'][data-part='trigger']:disabled {
|
|
156
|
-
background: var(--xh-tree-select-trigger-bg-disabled, var(--xh-bg-subtle));
|
|
157
227
|
color: var(--xh-fg-disabled);
|
|
158
228
|
cursor: not-allowed;
|
|
159
229
|
}
|
|
160
230
|
|
|
161
|
-
/*
|
|
231
|
+
/* 多选时值会连成很长一串,必须能截断;框宽由盒定,这里得允许自己被压缩 */
|
|
162
232
|
[data-scope='tree-select'][data-part='value-text'] {
|
|
163
|
-
flex: 1;
|
|
233
|
+
flex: 1 1 auto;
|
|
164
234
|
min-inline-size: 0;
|
|
165
235
|
overflow: hidden;
|
|
166
236
|
/* 行高留出文字的上下伸展空间,本行那层 overflow:hidden 才不会把字削掉;
|
|
@@ -179,6 +249,12 @@
|
|
|
179
249
|
color: var(--xh-fg-disabled);
|
|
180
250
|
}
|
|
181
251
|
|
|
252
|
+
/* 有值时清空钮顶上来,箭头让位:两个图标并排堆着,用户分不清点哪个。
|
|
253
|
+
让位而不是禁用——禁用的图标还占着位置,看着像坏了 */
|
|
254
|
+
[data-scope='tree-select'][data-part='indicator'][data-clearable] {
|
|
255
|
+
display: none;
|
|
256
|
+
}
|
|
257
|
+
|
|
182
258
|
[data-scope='tree-select'][data-part='indicator'] {
|
|
183
259
|
display: inline-flex;
|
|
184
260
|
flex: none;
|
|
@@ -200,7 +276,7 @@
|
|
|
200
276
|
color: var(--xh-fg-disabled);
|
|
201
277
|
}
|
|
202
278
|
|
|
203
|
-
/*
|
|
279
|
+
/* 盒内靠右的小方钮,不撑高那一行 */
|
|
204
280
|
[data-scope='tree-select'][data-part='clear-trigger'] {
|
|
205
281
|
display: inline-flex;
|
|
206
282
|
flex: none;
|
|
@@ -214,24 +290,25 @@
|
|
|
214
290
|
background: var(--xh-tree-select-action-bg, transparent);
|
|
215
291
|
color: var(--xh-tree-select-action-fg, var(--xh-fg-muted));
|
|
216
292
|
font-family: inherit;
|
|
217
|
-
font-size: var(--xh-tree-select-action-font-size, var(--xh-
|
|
293
|
+
font-size: var(--xh-tree-select-action-font-size, var(--xh-text-secondary-size));
|
|
218
294
|
line-height: var(--xh-leading-none);
|
|
219
295
|
cursor: pointer;
|
|
220
296
|
user-select: none;
|
|
221
|
-
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
297
|
+
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter), scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
222
298
|
}
|
|
223
299
|
|
|
224
300
|
[data-scope='tree-select'][data-part='clear-trigger'][hidden] {
|
|
225
301
|
display: none;
|
|
226
302
|
}
|
|
227
303
|
|
|
228
|
-
[data-scope='tree-select'][data-part='clear-trigger']:hover
|
|
304
|
+
[data-scope='tree-select'][data-part='clear-trigger']:hover {
|
|
229
305
|
background: var(--xh-tree-select-action-bg-hover, var(--xh-bg-subtle-hover));
|
|
230
306
|
color: var(--xh-tree-select-action-fg-hover, var(--xh-fg-default));
|
|
231
307
|
}
|
|
232
308
|
|
|
233
|
-
[data-scope='tree-select'][data-part='clear-trigger']:active
|
|
309
|
+
[data-scope='tree-select'][data-part='clear-trigger']:active {
|
|
234
310
|
background: var(--xh-tree-select-action-bg-active, var(--xh-bg-subtle-active));
|
|
311
|
+
scale: var(--xh-motion-scale-press);
|
|
235
312
|
}
|
|
236
313
|
|
|
237
314
|
/* 清空按钮退出了 Tab 序列(tabindex=-1),正常操作走不到这里;
|
|
@@ -241,48 +318,29 @@
|
|
|
241
318
|
outline-offset: var(--xh-ring-offset);
|
|
242
319
|
}
|
|
243
320
|
|
|
244
|
-
/* 无选中、只读、整控件禁用三种情况下都按不动,用的是原生 disabled */
|
|
245
|
-
[data-scope='tree-select'][data-part='clear-trigger']:disabled {
|
|
246
|
-
background: var(--xh-tree-select-action-bg, transparent);
|
|
247
|
-
color: var(--xh-fg-disabled);
|
|
248
|
-
cursor: not-allowed;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
252
|
-
[data-scope='tree-select'][data-part='positioner'] {
|
|
253
|
-
position: fixed;
|
|
254
|
-
z-index: var(--xh-layer-popover);
|
|
255
|
-
/* 空壳不吃指针,交互只发生在 content 里 */
|
|
256
|
-
pointer-events: none;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
260
|
-
[data-scope='tree-select'][data-part='positioner'][data-hidden] {
|
|
261
|
-
visibility: hidden;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
321
|
[data-scope='tree-select'][data-part='content'] {
|
|
265
322
|
display: flex;
|
|
266
323
|
flex-direction: column;
|
|
267
324
|
min-inline-size: var(--xh-tree-select-content-min-w, var(--xh-overlay-min-w));
|
|
268
325
|
max-inline-size: var(--xh-tree-select-content-max-w, var(--xh-overlay-max-w));
|
|
269
|
-
max-block-size: var(--xh-tree-select-content-max-h, var(--xh-overlay-max-h));
|
|
326
|
+
max-block-size: min(var(--xh-tree-select-content-max-h, var(--xh-overlay-max-h)), var(--xh-_tree-select-available-h));
|
|
270
327
|
padding-block: var(--xh-tree-select-content-py, var(--xh-space-1));
|
|
271
328
|
padding-inline: var(--xh-tree-select-content-px, var(--xh-space-1));
|
|
272
329
|
border: var(--xh-stroke-thin) solid var(--xh-tree-select-content-border, var(--xh-border-default));
|
|
273
330
|
border-radius: var(--xh-tree-select-content-radius, var(--xh-shape-surface));
|
|
274
331
|
background: var(--xh-tree-select-content-bg, var(--xh-bg-surface));
|
|
275
332
|
color: var(--xh-tree-select-content-fg, var(--xh-fg-default));
|
|
276
|
-
box-shadow: var(--xh-tree-select-content-shadow, var(--xh-elevation-
|
|
333
|
+
box-shadow: var(--xh-tree-select-content-shadow, var(--xh-elevation-floating));
|
|
277
334
|
/* 两轴一起给:深层节点靠缩进往行末推,横向溢出是常态,得够得着 */
|
|
278
335
|
overflow: auto;
|
|
279
336
|
pointer-events: auto;
|
|
280
337
|
}
|
|
281
338
|
|
|
282
|
-
/*
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
339
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
340
|
+
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
341
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
342
|
+
真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
|
|
343
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
286
344
|
|
|
287
345
|
/* 容器只是焦点域的兜底落点,落焦不画环:高亮永远长在行上 */
|
|
288
346
|
[data-scope='tree-select'][data-part='content']:focus-visible {
|
|
@@ -290,13 +348,20 @@
|
|
|
290
348
|
}
|
|
291
349
|
|
|
292
350
|
[data-scope='tree-select'][data-part='content'][data-state='open'] {
|
|
293
|
-
animation: xh-
|
|
351
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
355
|
+
免得动画结束到真收起之间闪一下原样 */
|
|
356
|
+
[data-scope='tree-select'][data-part='content'][data-state='closed'] {
|
|
357
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
294
358
|
}
|
|
295
359
|
|
|
296
360
|
/* 边框、底色与滚动都归 content,树本身只把行竖着排开 */
|
|
297
361
|
[data-scope='tree-select'][data-part='tree'] {
|
|
298
362
|
display: flex;
|
|
299
363
|
flex-direction: column;
|
|
364
|
+
gap: var(--xh-tree-select-tree-gap, var(--xh-list-option-gap));
|
|
300
365
|
}
|
|
301
366
|
|
|
302
367
|
[data-scope='tree-select'][data-part='tree'][hidden] {
|
|
@@ -314,6 +379,20 @@
|
|
|
314
379
|
outline: none;
|
|
315
380
|
}
|
|
316
381
|
|
|
382
|
+
/* 分支是"这一行 + 它的子层"的外壳,不自带内边距:真正长成一行的是 branch-control,
|
|
383
|
+
子层缩进归 branch-content。行距由这里出:分支自己那一行与它展开的子层之间,
|
|
384
|
+
同样按条目间距断开 */
|
|
385
|
+
[data-scope='tree-select'][data-part='branch'] {
|
|
386
|
+
display: flex;
|
|
387
|
+
flex-direction: column;
|
|
388
|
+
gap: var(--xh-tree-select-branch-gap, var(--xh-list-option-gap));
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/* display 盖掉了 UA 的 [hidden]{display:none},收起时要显式让位 */
|
|
392
|
+
[data-scope='tree-select'][data-part='branch'][hidden] {
|
|
393
|
+
display: none;
|
|
394
|
+
}
|
|
395
|
+
|
|
317
396
|
/* 焦点落在 branch 上(它才是 treeitem),但环画在它自己那一行上:
|
|
318
397
|
整棵子树套一圈描边会把展开的层级全框进去 */
|
|
319
398
|
[data-scope='tree-select'][data-part='branch']:focus-visible {
|
|
@@ -332,8 +411,8 @@
|
|
|
332
411
|
display: flex;
|
|
333
412
|
align-items: center;
|
|
334
413
|
gap: var(--xh-tree-select-row-gap, var(--xh-_tree-select-gap));
|
|
335
|
-
padding-block: var(--xh-tree-select-row-py, var(--xh-
|
|
336
|
-
padding-inline: var(--xh-tree-select-row-px, var(--xh-
|
|
414
|
+
padding-block: var(--xh-tree-select-row-py, var(--xh-_tree-select-row-py));
|
|
415
|
+
padding-inline: var(--xh-tree-select-row-px, var(--xh-_tree-select-row-px));
|
|
337
416
|
border-radius: var(--xh-tree-select-row-radius, var(--xh-shape-control));
|
|
338
417
|
color: var(--xh-tree-select-row-fg, var(--xh-fg-default));
|
|
339
418
|
font-size: var(--xh-tree-select-row-font-size, var(--xh-_tree-select-font-size));
|
|
@@ -397,7 +476,7 @@
|
|
|
397
476
|
align-items: center;
|
|
398
477
|
justify-content: center;
|
|
399
478
|
inline-size: var(--xh-tree-select-indicator-size, var(--xh-control-indicator-size));
|
|
400
|
-
color: var(--xh-tree-select-item-indicator-fg, var(--xh-_tone, var(--xh-
|
|
479
|
+
color: var(--xh-tree-select-item-indicator-fg, var(--xh-_tone, var(--xh-fg-brand)));
|
|
401
480
|
visibility: hidden;
|
|
402
481
|
}
|
|
403
482
|
|
|
@@ -458,6 +537,7 @@
|
|
|
458
537
|
[data-scope='tree-select'][data-part='branch-content'] {
|
|
459
538
|
display: flex;
|
|
460
539
|
flex-direction: column;
|
|
540
|
+
gap: var(--xh-tree-select-branch-content-gap, var(--xh-list-option-gap));
|
|
461
541
|
padding-inline-start: var(--xh-tree-select-indent, var(--xh-space-4));
|
|
462
542
|
}
|
|
463
543
|
|
|
@@ -465,4 +545,50 @@
|
|
|
465
545
|
[data-scope='tree-select'][data-part='branch-content'][hidden] {
|
|
466
546
|
display: none;
|
|
467
547
|
}
|
|
548
|
+
|
|
549
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
550
|
+
[data-scope='tree-select'][data-part='indicator']:empty::before {
|
|
551
|
+
content: '';
|
|
552
|
+
display: inline-block;
|
|
553
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
554
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
555
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
556
|
+
background-color: currentColor;
|
|
557
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
558
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
[data-scope='tree-select'][data-part='item-indicator']:empty::before {
|
|
562
|
+
content: '';
|
|
563
|
+
display: inline-block;
|
|
564
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
565
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
566
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
567
|
+
background-color: currentColor;
|
|
568
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
569
|
+
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
[data-scope='tree-select'][data-part='branch-trigger']:empty::before,
|
|
573
|
+
[data-scope='tree-select'][data-part='branch-indicator']:empty::before {
|
|
574
|
+
content: '';
|
|
575
|
+
display: inline-block;
|
|
576
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
577
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
578
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
579
|
+
background-color: currentColor;
|
|
580
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
581
|
+
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
[data-scope='tree-select'][data-part='clear-trigger']:empty::before {
|
|
585
|
+
content: '';
|
|
586
|
+
display: inline-block;
|
|
587
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
588
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
589
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
590
|
+
background-color: currentColor;
|
|
591
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
592
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
593
|
+
}
|
|
468
594
|
}
|