@xihan-ui/styles 1.1.0 → 2.1.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 +5055 -6
- package/README.md +22 -2
- package/component-tokens.d.ts +4197 -0
- package/component-tokens.js +2 -0
- package/components.tokens.json +79785 -0
- package/css/accordion.css +131 -75
- package/css/affix.css +16 -1
- package/css/alert.css +114 -67
- package/css/anchor.css +99 -27
- package/css/approval.css +461 -0
- package/css/avatar-group.css +14 -6
- package/css/avatar.css +33 -9
- package/css/back-top.css +103 -48
- package/css/badge.css +42 -14
- package/css/bar-code.css +62 -0
- package/css/breadcrumb.css +40 -21
- package/css/button-group.css +146 -24
- package/css/button.css +116 -99
- package/css/calendar-picker.css +448 -0
- package/css/calendar-range-picker.css +517 -0
- package/css/card.css +54 -77
- package/css/carousel.css +412 -68
- package/css/cascader.css +427 -246
- package/css/checkbox-group.css +225 -77
- package/css/checkbox.css +174 -37
- package/css/clipboard.css +266 -47
- package/css/code-view.css +279 -0
- package/css/collapsible.css +108 -63
- package/css/color-field.css +158 -0
- package/css/color-picker.css +170 -184
- package/css/color-slider.css +274 -0
- package/css/color-swatch-picker.css +243 -0
- package/css/color-swatch.css +35 -0
- package/css/combobox.css +265 -273
- package/css/command.css +397 -0
- package/css/context-menu.css +181 -108
- package/css/date-field.css +94 -121
- package/css/date-picker.css +484 -249
- package/css/date-range-picker.css +557 -0
- package/css/description.css +51 -0
- package/css/descriptions.css +133 -87
- package/css/dialog.css +245 -68
- package/css/diff-view.css +428 -0
- package/css/download-trigger.css +155 -46
- package/css/drawer.css +188 -111
- package/css/editable.css +172 -152
- package/css/empty-state.css +80 -11
- package/css/field-array.css +190 -0
- package/css/field.css +84 -31
- package/css/fieldset.css +51 -18
- package/css/file-upload.css +134 -36
- package/css/flex.css +20 -1
- package/css/float-button.css +238 -57
- package/css/floating-panel.css +171 -92
- package/css/focus.css +46 -0
- package/css/forced-colors.css +93 -0
- package/css/form.css +254 -77
- package/css/gradient-text.css +34 -10
- package/css/grid.css +516 -5
- package/css/heatmap.css +87 -29
- package/css/highlight.css +20 -5
- package/css/hover-card.css +95 -47
- package/css/icon-wrapper.css +15 -3
- package/css/icon.css +74 -8
- package/css/image-cropper.css +143 -29
- package/css/image-viewer.css +148 -89
- package/css/image.css +30 -1
- package/css/infinite-scroll.css +51 -1
- package/css/input-group.css +277 -0
- package/css/json-viewer.css +102 -45
- package/css/kbd.css +72 -0
- package/css/label.css +78 -0
- package/css/layers.css +5 -0
- package/css/layout.css +175 -31
- package/css/list.css +24 -3
- package/css/listbox.css +215 -65
- package/css/loading-bar.css +52 -3
- package/css/log.css +144 -9
- package/css/markdown-stream.css +149 -0
- package/css/marquee.css +27 -1
- package/css/masonry.css +7 -0
- package/css/matrix-code.css +67 -0
- package/css/mention.css +232 -152
- package/css/menu.css +178 -83
- package/css/menubar.css +202 -136
- package/css/message-feed.css +197 -0
- package/css/navigation-menu.css +142 -90
- package/css/notification.css +178 -100
- package/css/number-animation.css +7 -0
- package/css/number-field.css +120 -277
- package/css/overlay-arrow.css +12 -7
- package/css/page-header.css +99 -14
- package/css/pagination.css +173 -135
- package/css/password-input.css +222 -219
- package/css/pin-input.css +101 -67
- package/css/pointer.css +36 -0
- package/css/popconfirm.css +182 -93
- package/css/popover.css +119 -77
- package/css/progress.css +60 -12
- package/css/prompt-input.css +224 -0
- package/css/question-flow.css +513 -0
- package/css/radio-group.css +147 -30
- package/css/rating.css +193 -43
- package/css/reasoning.css +336 -0
- package/css/reset.css +84 -6
- package/css/resizable.css +143 -19
- package/css/scroll-area.css +68 -7
- package/css/scrollbar.css +47 -13
- package/css/segmented.css +94 -29
- package/css/select.css +286 -274
- package/css/separator.css +101 -1
- package/css/side-nav.css +131 -75
- package/css/signature-pad.css +74 -54
- package/css/skeleton.css +84 -11
- package/css/slider.css +132 -39
- package/css/sortable.css +123 -28
- package/css/spinner.css +126 -12
- package/css/splitter.css +29 -8
- package/css/statistic.css +55 -0
- package/css/steps.css +206 -72
- package/css/switch.css +268 -36
- package/css/table.css +429 -143
- package/css/tabs.css +475 -52
- package/css/tag-group.css +223 -0
- package/css/tag.css +118 -28
- package/css/tags-input.css +156 -274
- package/css/text-field.css +101 -249
- package/css/time-field.css +100 -128
- package/css/time-picker.css +321 -252
- package/css/time-range-picker.css +717 -0
- package/css/timeline.css +202 -68
- package/css/timer.css +56 -52
- package/css/timestamp.css +34 -0
- package/css/toast.css +373 -144
- package/css/toggle-group.css +309 -76
- package/css/toggle.css +116 -85
- package/css/tone.css +47 -0
- package/css/tool-call.css +421 -0
- package/css/toolbar.css +181 -33
- package/css/tooltip.css +105 -36
- package/css/tour.css +181 -152
- package/css/transfer.css +351 -138
- package/css/tree-select.css +321 -216
- package/css/tree.css +172 -122
- package/css/truncate.css +65 -0
- package/css/typography.css +228 -5
- package/css/undefined.css +10 -1
- package/css/virtualizer.css +9 -10
- package/css/visually-hidden.css +7 -0
- package/css/watermark.css +7 -0
- package/family/action-control.css +487 -0
- package/family/collection-item.css +770 -0
- package/family/field-chrome.css +298 -0
- package/family/motion.css +166 -0
- package/family/swatch.css +59 -0
- package/index.css +41658 -128
- package/index.unlayered.css +33356 -17825
- package/package.json +49 -17
- package/css/calendar.css +0 -367
- package/css/code-block.css +0 -91
- package/css/composer.css +0 -134
- package/css/countdown.css +0 -26
- package/css/dynamic-input.css +0 -220
- package/css/ellipsis.css +0 -52
- package/css/hotkeys.css +0 -90
- package/css/popselect.css +0 -391
- package/css/qr-code.css +0 -55
- package/css/result.css +0 -119
- package/css/space.css +0 -117
- package/css/thread.css +0 -120
- package/css/time.css +0 -25
package/css/drawer.css
CHANGED
|
@@ -1,26 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
from {
|
|
6
|
-
opacity: 0;
|
|
7
|
-
}
|
|
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
|
+
*/
|
|
8
5
|
|
|
9
|
-
|
|
10
|
-
opacity: 1;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
6
|
+
/* 定义 drawer 样式。 */
|
|
13
7
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
to {
|
|
20
|
-
opacity: 0;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
10
|
+
@import '../family/action-control.css';
|
|
23
11
|
|
|
12
|
+
@layer xihan.motion {
|
|
24
13
|
/* 四条边各一对滑入/滑出。位移量用 translate 的百分比,参照的是面板自己的边框盒,
|
|
25
14
|
所以不管 --xh-drawer-size 被改成多少,"正好推到视口外"这件事都成立。
|
|
26
15
|
|
|
@@ -118,16 +107,16 @@
|
|
|
118
107
|
/* root 留在页面原地,只是 data-side / data-state 的落点,不该凭空多出一层盒子把
|
|
119
108
|
trigger 从作者的 flex / grid 行里挤出去,故 display: contents。 */
|
|
120
109
|
[data-scope='drawer'][data-part='root'] {
|
|
121
|
-
/*
|
|
122
|
-
--xh-icon-size: var(--xh-drawer-icon-size, var(--xh-glyph-size-
|
|
110
|
+
/* 作者塞进面板里的图标按控件档取;触发器与关闭钮另由家族配方按各自的档下发字形尺 */
|
|
111
|
+
--xh-icon-size: var(--xh-drawer-icon-size, var(--xh-glyph-size-md));
|
|
123
112
|
|
|
124
113
|
display: contents;
|
|
125
114
|
}
|
|
126
115
|
|
|
127
116
|
/* 浮层被搬到 portal 落点,继承不到 root 上的槽:这把尺在被搬走的那一侧再声明一次,
|
|
128
|
-
|
|
117
|
+
作者塞进面板里的图标才和皮肤画的兜底字形一样大 */
|
|
129
118
|
[data-scope='drawer'][data-part='content'] {
|
|
130
|
-
--xh-icon-size: var(--xh-drawer-icon-size, var(--xh-glyph-size-
|
|
119
|
+
--xh-icon-size: var(--xh-drawer-icon-size, var(--xh-glyph-size-md));
|
|
131
120
|
}
|
|
132
121
|
|
|
133
122
|
/* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},作者手写 hidden 时得还回去 */
|
|
@@ -135,58 +124,59 @@
|
|
|
135
124
|
display: none;
|
|
136
125
|
}
|
|
137
126
|
|
|
127
|
+
/*
|
|
128
|
+
* 触发器是页面上的独立文字按钮:盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
|
|
129
|
+
* 由家族配方按连接层投影的 data-xh-action-variant / -size 给出(此前自写描边盒型,hover 落 200 / active 落 300)。
|
|
130
|
+
* 这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射。
|
|
131
|
+
*/
|
|
138
132
|
[data-scope='drawer'][data-part='trigger'] {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
133
|
+
--xh-action-gap: var(--xh-drawer-trigger-gap, var(--xh-_action-profile-gap));
|
|
134
|
+
--xh-action-visual-size: var(--xh-drawer-trigger-h, var(--xh-_action-profile-visual-size));
|
|
135
|
+
--xh-action-padding-inline: var(--xh-drawer-trigger-px, var(--xh-_action-profile-padding-inline));
|
|
136
|
+
--xh-action-radius: var(--xh-drawer-trigger-radius, var(--xh-shape-control));
|
|
137
|
+
--xh-action-font-size: var(--xh-drawer-trigger-font-size, var(--xh-_action-profile-font-size));
|
|
138
|
+
--xh-action-bg-rest: var(--xh-drawer-trigger-bg, var(--xh-_action-variant-bg-rest));
|
|
139
|
+
--xh-action-bg-hover: var(--xh-drawer-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
140
|
+
--xh-action-bg-pressed: var(--xh-drawer-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
141
|
+
--xh-action-bg-focus-visible: var(--xh-drawer-trigger-bg, var(--xh-_action-variant-bg-focus-visible));
|
|
142
|
+
--xh-action-fg-rest: var(--xh-drawer-trigger-fg, var(--xh-_action-variant-fg-rest));
|
|
143
|
+
--xh-action-fg-hover: var(--xh-drawer-trigger-fg, var(--xh-_action-variant-fg-hover));
|
|
144
|
+
--xh-action-fg-pressed: var(--xh-drawer-trigger-fg, var(--xh-_action-variant-fg-pressed));
|
|
145
|
+
--xh-action-fg-focus-visible: var(--xh-drawer-trigger-fg, var(--xh-_action-variant-fg-focus-visible));
|
|
146
|
+
--xh-action-border-rest: var(--xh-drawer-trigger-border, var(--xh-_action-variant-border-rest));
|
|
147
|
+
--xh-action-border-hover: var(--xh-drawer-trigger-border-hover, var(--xh-_action-variant-border-hover));
|
|
148
|
+
--xh-action-border-pressed: var(--xh-drawer-trigger-border-hover, var(--xh-_action-variant-border-pressed));
|
|
149
|
+
--xh-action-border-focus-visible: var(--xh-drawer-trigger-border, var(--xh-_action-variant-border-focus-visible));
|
|
150
|
+
/* 作者塞进按钮的图标随档取字形尺(md = 20px) */
|
|
151
|
+
--xh-icon-size: var(--xh-drawer-icon-size, var(--xh-_action-profile-glyph-size));
|
|
152
|
+
|
|
153
|
+
/* 触发器的文字与 Button 同一字重(家族配方不管字重) */
|
|
150
154
|
font-weight: var(--xh-drawer-trigger-font-weight, var(--xh-text-label-weight));
|
|
151
|
-
line-height: var(--xh-leading-none);
|
|
152
|
-
white-space: nowrap;
|
|
153
|
-
cursor: pointer;
|
|
154
|
-
transition:
|
|
155
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
156
|
-
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
157
155
|
}
|
|
158
156
|
|
|
159
157
|
[data-scope='drawer'][data-part='trigger'][hidden] {
|
|
160
158
|
display: none;
|
|
161
159
|
}
|
|
162
160
|
|
|
163
|
-
[data-scope='drawer'][data-part='trigger']:hover:not(:disabled) {
|
|
164
|
-
background: var(--xh-drawer-trigger-bg-hover, var(--xh-bg-subtle-hover));
|
|
165
|
-
border-color: var(--xh-drawer-trigger-border-hover, var(--xh-border-control-hover));
|
|
166
|
-
}
|
|
167
|
-
|
|
168
161
|
/* 抽屉展开期间触发按钮压住不弹起:面板贴在视口边上,它和按钮往往离得很远,
|
|
169
|
-
按钮自己得说明"这一扇是我开的"。
|
|
162
|
+
按钮自己得说明"这一扇是我开的"。open 与家族 hover 同档中性:
|
|
163
|
+
白底承载的 --xh-bg-subtle(100)+ 悬停描边,聚焦时这块面留着 */
|
|
170
164
|
[data-scope='drawer'][data-part='trigger'][data-state='open'] {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
[data-scope='drawer'][data-part='trigger']:focus-visible {
|
|
176
|
-
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
177
|
-
outline-offset: var(--xh-ring-offset);
|
|
165
|
+
--xh-action-bg-rest: var(--xh-drawer-trigger-bg-open, var(--xh-bg-subtle));
|
|
166
|
+
--xh-action-bg-focus-visible: var(--xh-drawer-trigger-bg-open, var(--xh-bg-subtle));
|
|
167
|
+
--xh-action-border-rest: var(--xh-drawer-trigger-border-open, var(--xh-border-control-hover));
|
|
168
|
+
--xh-action-border-focus-visible: var(--xh-drawer-trigger-border-open, var(--xh-border-control-hover));
|
|
178
169
|
}
|
|
179
170
|
|
|
180
|
-
/*
|
|
181
|
-
[data-scope='drawer'][data-part='trigger']:
|
|
182
|
-
|
|
183
|
-
cursor: not-allowed;
|
|
171
|
+
/* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色 */
|
|
172
|
+
[data-scope='drawer'][data-part='trigger'][data-xh-action-variant='solid']:focus-visible {
|
|
173
|
+
--xh-action-ring-color-focus-visible: currentColor;
|
|
184
174
|
}
|
|
185
175
|
|
|
186
176
|
[data-scope='drawer'][data-part='backdrop'] {
|
|
187
177
|
position: fixed;
|
|
188
178
|
inset: 0;
|
|
189
|
-
z-index: var(--xh-drawer-backdrop-layer, var(--xh-layer-drawer));
|
|
179
|
+
z-index: var(--xh-drawer-backdrop-layer, var(--xh-_layer, var(--xh-layer-drawer)));
|
|
190
180
|
background: var(--xh-drawer-backdrop-bg, var(--xh-bg-overlay));
|
|
191
181
|
}
|
|
192
182
|
|
|
@@ -201,6 +191,24 @@
|
|
|
201
191
|
position: absolute;
|
|
202
192
|
}
|
|
203
193
|
|
|
194
|
+
/* 挂在局部容器里的面板碰不到屏幕边,安全区那一段让位收回去:留着会在容器内白让出一条。 */
|
|
195
|
+
[data-scope='drawer'][data-part='content'][data-contained] {
|
|
196
|
+
padding-block-start: var(--xh-drawer-py, var(--xh-surface-py-md));
|
|
197
|
+
padding-block-end: var(--xh-drawer-py, var(--xh-surface-py-md));
|
|
198
|
+
padding-inline: var(--xh-drawer-px, var(--xh-surface-px-md));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* 同一层底色之上再糊背后的页面;与 dialog 同写法,两个前缀都写 */
|
|
202
|
+
[data-scope='drawer'][data-part='backdrop'][data-variant='blur'] {
|
|
203
|
+
-webkit-backdrop-filter: blur(var(--xh-drawer-backdrop-blur, var(--xh-overlay-backdrop-blur)));
|
|
204
|
+
backdrop-filter: blur(var(--xh-drawer-backdrop-blur, var(--xh-overlay-backdrop-blur)));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* 去掉底色,只留下这一层吃指针:交互外关闭与滚动锁定照旧 */
|
|
208
|
+
[data-scope='drawer'][data-part='backdrop'][data-variant='transparent'] {
|
|
209
|
+
background: transparent;
|
|
210
|
+
}
|
|
211
|
+
|
|
204
212
|
[data-scope='drawer'][data-part='backdrop'][data-state='open'] {
|
|
205
213
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
206
214
|
}
|
|
@@ -216,7 +224,7 @@
|
|
|
216
224
|
[data-scope='drawer'][data-part='positioner'] {
|
|
217
225
|
position: fixed;
|
|
218
226
|
inset: 0;
|
|
219
|
-
z-index: var(--xh-drawer-layer, var(--xh-layer-drawer));
|
|
227
|
+
z-index: var(--xh-drawer-layer, var(--xh-_layer, var(--xh-layer-drawer)));
|
|
220
228
|
pointer-events: none;
|
|
221
229
|
}
|
|
222
230
|
|
|
@@ -236,16 +244,30 @@
|
|
|
236
244
|
--xh-_drawer-size: var(--xh-overlay-drawer-w-md);
|
|
237
245
|
|
|
238
246
|
position: fixed;
|
|
239
|
-
z-index: var(--xh-drawer-layer, var(--xh-layer-drawer));
|
|
247
|
+
z-index: var(--xh-drawer-layer, var(--xh-_layer, var(--xh-layer-drawer)));
|
|
240
248
|
display: flex;
|
|
241
249
|
flex-direction: column;
|
|
242
250
|
gap: var(--xh-drawer-gap, var(--xh-stack-gap-md));
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
251
|
+
/* 面板贴死视口的某一条边、另一向满铺,内衬与安全区取大的一头:
|
|
252
|
+
刘海、圆角与底部横条压住的那一段由系统给出,内衬比它窄时首尾两行会被切掉。
|
|
253
|
+
桌面上 env() 恒为 0,取值与内衬槽完全一致。安全区只有物理方向的四个名字,
|
|
254
|
+
行内轴上两侧同取较宽的那一段,RTL 下不会翻错边。 */
|
|
255
|
+
padding-block-start: max(var(--xh-drawer-py, var(--xh-surface-py-md)), env(safe-area-inset-top));
|
|
256
|
+
padding-block-end: max(var(--xh-drawer-py, var(--xh-surface-py-md)), env(safe-area-inset-bottom));
|
|
257
|
+
padding-inline: max(
|
|
258
|
+
var(--xh-drawer-px, var(--xh-surface-px-md)),
|
|
259
|
+
env(safe-area-inset-left),
|
|
260
|
+
env(safe-area-inset-right)
|
|
261
|
+
);
|
|
262
|
+
/* M4 sheet 三件套:任何浮层不得只靠 box-shadow 分层,亮色下面板与页面同色,
|
|
263
|
+
1px 描边才是它的边界;影只是加成 */
|
|
264
|
+
border: var(--xh-stroke-thin) solid var(--xh-drawer-border, var(--xh-material-elevated-border));
|
|
265
|
+
background: var(--xh-drawer-bg, var(--xh-material-elevated-bg));
|
|
266
|
+
color: var(--xh-drawer-fg, var(--xh-material-elevated-fg));
|
|
267
|
+
box-shadow: var(--xh-drawer-shadow, var(--xh-material-elevated-shadow));
|
|
268
|
+
/* 作者不用 header / body / footer 三段时它是唯一的滚动层:模态面滚到头不把页面一起带走 */
|
|
248
269
|
overflow: auto;
|
|
270
|
+
overscroll-behavior: contain;
|
|
249
271
|
/* 尺寸是照视口那条边算出来的,padding 再往外顶就会把面板挤出屏幕、
|
|
250
272
|
逼出一条横向滚动条。reset 层已有同款兜底,这里显式写一遍表明尺寸算法依赖它 */
|
|
251
273
|
box-sizing: border-box;
|
|
@@ -298,14 +320,14 @@
|
|
|
298
320
|
/* 只圆朝向页面那两个角:贴住视口的那条边圆角是看不见的,圆了反而露出底下的页面 */
|
|
299
321
|
[data-scope='drawer'][data-part='content'][data-side='left'] {
|
|
300
322
|
inset-inline-start: 0;
|
|
301
|
-
border-start-end-radius: var(--xh-drawer-radius, var(--xh-shape-
|
|
302
|
-
border-end-end-radius: var(--xh-drawer-radius, var(--xh-shape-
|
|
323
|
+
border-start-end-radius: var(--xh-drawer-radius, var(--xh-shape-overlay));
|
|
324
|
+
border-end-end-radius: var(--xh-drawer-radius, var(--xh-shape-overlay));
|
|
303
325
|
}
|
|
304
326
|
|
|
305
327
|
[data-scope='drawer'][data-part='content'][data-side='right'] {
|
|
306
328
|
inset-inline-end: 0;
|
|
307
|
-
border-start-start-radius: var(--xh-drawer-radius, var(--xh-shape-
|
|
308
|
-
border-end-start-radius: var(--xh-drawer-radius, var(--xh-shape-
|
|
329
|
+
border-start-start-radius: var(--xh-drawer-radius, var(--xh-shape-overlay));
|
|
330
|
+
border-end-start-radius: var(--xh-drawer-radius, var(--xh-shape-overlay));
|
|
309
331
|
}
|
|
310
332
|
|
|
311
333
|
/* 上下:满宽、定高 */
|
|
@@ -318,20 +340,21 @@
|
|
|
318
340
|
|
|
319
341
|
[data-scope='drawer'][data-part='content'][data-side='top'] {
|
|
320
342
|
inset-block-start: 0;
|
|
321
|
-
border-end-start-radius: var(--xh-drawer-radius, var(--xh-shape-
|
|
322
|
-
border-end-end-radius: var(--xh-drawer-radius, var(--xh-shape-
|
|
343
|
+
border-end-start-radius: var(--xh-drawer-radius, var(--xh-shape-overlay));
|
|
344
|
+
border-end-end-radius: var(--xh-drawer-radius, var(--xh-shape-overlay));
|
|
323
345
|
}
|
|
324
346
|
|
|
325
347
|
[data-scope='drawer'][data-part='content'][data-side='bottom'] {
|
|
326
348
|
inset-block-end: 0;
|
|
327
|
-
border-start-start-radius: var(--xh-drawer-radius, var(--xh-shape-
|
|
328
|
-
border-start-end-radius: var(--xh-drawer-radius, var(--xh-shape-
|
|
349
|
+
border-start-start-radius: var(--xh-drawer-radius, var(--xh-shape-overlay));
|
|
350
|
+
border-start-end-radius: var(--xh-drawer-radius, var(--xh-shape-overlay));
|
|
329
351
|
}
|
|
330
352
|
|
|
331
|
-
/*
|
|
353
|
+
/* 滑入/滑出按边配对。入场是整面板从画外推入的大尺度位移:走 --xh-motion-duration-slide
|
|
354
|
+
与 --xh-motion-ease-slide;退场仍走 exit 档。退场一律 forwards:presence 要等 animationend 才卸载,
|
|
332
355
|
不定住终态,面板会在最后一帧弹回原位再消失。 */
|
|
333
356
|
[data-scope='drawer'][data-part='content'][data-side='right'][data-state='open'] {
|
|
334
|
-
animation: xh-drawer-in-right var(--xh-motion-duration-
|
|
357
|
+
animation: xh-drawer-in-right var(--xh-motion-duration-slide) var(--xh-motion-ease-slide);
|
|
335
358
|
}
|
|
336
359
|
|
|
337
360
|
[data-scope='drawer'][data-part='content'][data-side='right'][data-state='closed'] {
|
|
@@ -339,7 +362,7 @@
|
|
|
339
362
|
}
|
|
340
363
|
|
|
341
364
|
[data-scope='drawer'][data-part='content'][data-side='left'][data-state='open'] {
|
|
342
|
-
animation: xh-drawer-in-left var(--xh-motion-duration-
|
|
365
|
+
animation: xh-drawer-in-left var(--xh-motion-duration-slide) var(--xh-motion-ease-slide);
|
|
343
366
|
}
|
|
344
367
|
|
|
345
368
|
[data-scope='drawer'][data-part='content'][data-side='left'][data-state='closed'] {
|
|
@@ -347,7 +370,7 @@
|
|
|
347
370
|
}
|
|
348
371
|
|
|
349
372
|
[data-scope='drawer'][data-part='content'][data-side='top'][data-state='open'] {
|
|
350
|
-
animation: xh-drawer-in-top var(--xh-motion-duration-
|
|
373
|
+
animation: xh-drawer-in-top var(--xh-motion-duration-slide) var(--xh-motion-ease-slide);
|
|
351
374
|
}
|
|
352
375
|
|
|
353
376
|
[data-scope='drawer'][data-part='content'][data-side='top'][data-state='closed'] {
|
|
@@ -355,13 +378,66 @@
|
|
|
355
378
|
}
|
|
356
379
|
|
|
357
380
|
[data-scope='drawer'][data-part='content'][data-side='bottom'][data-state='open'] {
|
|
358
|
-
animation: xh-drawer-in-bottom var(--xh-motion-duration-
|
|
381
|
+
animation: xh-drawer-in-bottom var(--xh-motion-duration-slide) var(--xh-motion-ease-slide);
|
|
359
382
|
}
|
|
360
383
|
|
|
361
384
|
[data-scope='drawer'][data-part='content'][data-side='bottom'][data-state='closed'] {
|
|
362
385
|
animation: xh-drawer-out-bottom var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
363
386
|
}
|
|
364
387
|
|
|
388
|
+
/* —— 面板三段 —— */
|
|
389
|
+
/* header / body / footer 把面板切成「头尾定在原处、正文自己滚」三段,
|
|
390
|
+
与弹窗、浮动面板同一套角色划分:头尾不参与压缩,正文吃掉剩下的高度并自己滚。
|
|
391
|
+
面板的内衬与安全区让位仍由 content 一层给出,三段只接手段与段之间那道缝;
|
|
392
|
+
整块的滚动交还给正文段——两层都能滚时滚轮落在哪一层要看指针停在哪,
|
|
393
|
+
贴边的头尾会跟着一起走。 */
|
|
394
|
+
[data-scope='drawer'][data-part='content']:has([data-scope='drawer'][data-part='body']) {
|
|
395
|
+
gap: 0;
|
|
396
|
+
overflow: hidden;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/* 头段:标题与说明纵向堆叠;不参与压缩,正文再长也压不扁它 */
|
|
400
|
+
[data-scope='drawer'][data-part='header'] {
|
|
401
|
+
flex: none;
|
|
402
|
+
display: flex;
|
|
403
|
+
flex-direction: column;
|
|
404
|
+
gap: var(--xh-drawer-header-gap, var(--xh-stack-gap-sm));
|
|
405
|
+
padding-block-end: var(--xh-drawer-header-pb, var(--xh-space-2));
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/* 正文段:面板里唯一会滚的一段。最小高度归零,
|
|
409
|
+
否则弹性项按内容撑高,容器再矮也不产生溢出,滚动条永远出不来。
|
|
410
|
+
模态 body 是原生细条滚动面:细条由 reset 层统一给,滚到头不把页面一起带走 */
|
|
411
|
+
[data-scope='drawer'][data-part='body'] {
|
|
412
|
+
flex: 1 1 auto;
|
|
413
|
+
min-block-size: 0;
|
|
414
|
+
overflow: auto;
|
|
415
|
+
overscroll-behavior: contain;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/* 正文高度随交互变化(表单校验、展开段落):还在用原生滚动条的正文留一条稳定空道,
|
|
419
|
+
滚动条出现与消失时不推动文字。带 data-xh-scrollbar 的容器已经把原生条藏成零宽,排除掉 */
|
|
420
|
+
[data-scope='drawer'][data-part='body']:not([data-xh-scrollbar]) {
|
|
421
|
+
scrollbar-gutter: stable;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/* 尾段:动作按钮排一行靠尾;同样不参与压缩 */
|
|
425
|
+
[data-scope='drawer'][data-part='footer'] {
|
|
426
|
+
flex: none;
|
|
427
|
+
display: flex;
|
|
428
|
+
align-items: center;
|
|
429
|
+
justify-content: flex-end;
|
|
430
|
+
gap: var(--xh-drawer-footer-gap, var(--xh-control-gap-md));
|
|
431
|
+
padding-block-start: var(--xh-drawer-footer-pt, var(--xh-space-2));
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/* 声明过 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
|
|
435
|
+
[data-scope='drawer'][data-part='header'][hidden],
|
|
436
|
+
[data-scope='drawer'][data-part='body'][hidden],
|
|
437
|
+
[data-scope='drawer'][data-part='footer'][hidden] {
|
|
438
|
+
display: none;
|
|
439
|
+
}
|
|
440
|
+
|
|
365
441
|
[data-scope='drawer'][data-part='title'] {
|
|
366
442
|
margin: 0;
|
|
367
443
|
font-size: var(--xh-drawer-title-font-size, var(--xh-text-heading-3-size));
|
|
@@ -369,9 +445,10 @@
|
|
|
369
445
|
color: var(--xh-drawer-title-fg, var(--xh-fg-default));
|
|
370
446
|
}
|
|
371
447
|
|
|
448
|
+
/* 说明文字走说明档:13px + fg-muted */
|
|
372
449
|
[data-scope='drawer'][data-part='description'] {
|
|
373
450
|
margin: 0;
|
|
374
|
-
font-size: var(--xh-text-
|
|
451
|
+
font-size: var(--xh-drawer-description-font-size, var(--xh-text-secondary-size));
|
|
375
452
|
color: var(--xh-drawer-description-fg, var(--xh-fg-muted));
|
|
376
453
|
}
|
|
377
454
|
|
|
@@ -379,47 +456,38 @@
|
|
|
379
456
|
否则长标题会直接钻到按钮底下。只在真有关闭按钮时让位。 */
|
|
380
457
|
[data-scope='drawer'][data-part='content']:has([data-scope='drawer'][data-part='close-trigger'])
|
|
381
458
|
[data-scope='drawer'][data-part='title'] {
|
|
382
|
-
padding-inline-end: calc(var(--xh-drawer-close-size, var(--xh-control-h-sm)) + var(--xh-
|
|
459
|
+
padding-inline-end: calc(var(--xh-drawer-close-size, var(--xh-control-h-sm)) + var(--xh-surface-action-inset));
|
|
383
460
|
}
|
|
384
461
|
|
|
462
|
+
/*
|
|
463
|
+
* 关闭钮是面板角落的单图标钮:正方盒、sm 档几何、ghost 四态面、0.97 按压并换底与粗指针命中区
|
|
464
|
+
* 由家族配方给出——白面上走画布承载阶梯悬停 --xh-bg-subtle(100)→ 按下 --xh-bg-subtle-hover(200),
|
|
465
|
+
* 焦点面透明吃库环。这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与摆放,
|
|
466
|
+
* 聚焦档的 -bg-focus / -fg-focus 两槽同样桥到配方的 focus-visible 面(与 dialog 一致),缺省仍是透明底与悬停字色;
|
|
467
|
+
* 静息前景取 muted 字色,悬停 / 按下回到 fg-default。
|
|
468
|
+
*/
|
|
385
469
|
[data-scope='drawer'][data-part='close-trigger'] {
|
|
470
|
+
--xh-action-visual-size: var(--xh-drawer-close-size, var(--xh-_action-profile-visual-size));
|
|
471
|
+
--xh-action-radius: var(--xh-drawer-close-radius, var(--xh-shape-control));
|
|
472
|
+
--xh-action-bg-hover: var(--xh-drawer-close-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
473
|
+
--xh-action-bg-pressed: var(--xh-drawer-close-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
474
|
+
--xh-action-bg-focus-visible: var(--xh-drawer-close-bg-focus, var(--xh-_action-variant-bg-focus-visible));
|
|
475
|
+
--xh-action-fg-rest: var(--xh-drawer-close-fg, var(--xh-fg-muted));
|
|
476
|
+
--xh-action-fg-hover: var(--xh-drawer-close-fg-hover, var(--xh-_action-variant-fg-hover));
|
|
477
|
+
--xh-action-fg-pressed: var(--xh-drawer-close-fg-hover, var(--xh-_action-variant-fg-pressed));
|
|
478
|
+
--xh-action-fg-focus-visible: var(--xh-drawer-close-fg-focus, var(--xh-drawer-close-fg-hover, var(--xh-_action-variant-fg-focus-visible)));
|
|
479
|
+
/* 作者塞进按钮的图标随档取字形尺(sm = 16px),与皮肤画的兜底字形同一把尺 */
|
|
480
|
+
--xh-icon-size: var(--xh-drawer-icon-size, var(--xh-_action-profile-glyph-size));
|
|
481
|
+
|
|
386
482
|
position: absolute;
|
|
387
|
-
inset-block-start: var(--xh-
|
|
388
|
-
inset-inline-end: var(--xh-
|
|
389
|
-
display: inline-flex;
|
|
390
|
-
align-items: center;
|
|
391
|
-
justify-content: center;
|
|
392
|
-
block-size: var(--xh-drawer-close-size, var(--xh-control-h-sm));
|
|
393
|
-
inline-size: var(--xh-drawer-close-size, var(--xh-control-h-sm));
|
|
394
|
-
border: 0;
|
|
395
|
-
border-radius: var(--xh-drawer-close-radius, var(--xh-shape-control));
|
|
396
|
-
background: transparent;
|
|
397
|
-
color: var(--xh-fg-muted);
|
|
398
|
-
cursor: pointer;
|
|
399
|
-
transition:
|
|
400
|
-
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
401
|
-
scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
483
|
+
inset-block-start: var(--xh-surface-action-inset);
|
|
484
|
+
inset-inline-end: var(--xh-surface-action-inset);
|
|
402
485
|
}
|
|
403
486
|
|
|
404
487
|
[data-scope='drawer'][data-part='close-trigger'][hidden] {
|
|
405
488
|
display: none;
|
|
406
489
|
}
|
|
407
490
|
|
|
408
|
-
[data-scope='drawer'][data-part='close-trigger']:hover {
|
|
409
|
-
background: var(--xh-drawer-close-bg-hover, var(--xh-bg-subtle-hover));
|
|
410
|
-
color: var(--xh-fg-default);
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
[data-scope='drawer'][data-part='close-trigger']:active {
|
|
414
|
-
background: var(--xh-drawer-close-bg-active, var(--xh-bg-subtle-active));
|
|
415
|
-
scale: var(--xh-motion-scale-press);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
[data-scope='drawer'][data-part='close-trigger']:focus-visible {
|
|
419
|
-
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
420
|
-
outline-offset: var(--xh-ring-offset);
|
|
421
|
-
}
|
|
422
|
-
|
|
423
491
|
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
424
492
|
[data-scope='drawer'][data-part='close-trigger']:empty::before {
|
|
425
493
|
content: '';
|
|
@@ -431,4 +499,13 @@
|
|
|
431
499
|
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
432
500
|
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
433
501
|
}
|
|
502
|
+
|
|
503
|
+
@media print {
|
|
504
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
505
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
506
|
+
[data-scope='drawer'][data-part='backdrop'],
|
|
507
|
+
[data-scope='drawer'][data-part='positioner'] {
|
|
508
|
+
display: none;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
434
511
|
}
|