@xihan-ui/styles 1.0.0 → 2.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 +5146 -6
- package/README.md +22 -2
- package/component-tokens.d.ts +4212 -0
- package/component-tokens.js +2 -0
- package/components.tokens.json +80116 -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 +429 -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 +172 -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 +267 -273
- package/css/command.css +399 -0
- package/css/context-menu.css +183 -108
- package/css/date-field.css +94 -121
- package/css/date-picker.css +486 -249
- package/css/date-range-picker.css +559 -0
- package/css/description.css +51 -0
- package/css/descriptions.css +133 -87
- package/css/dialog.css +247 -68
- package/css/diff-view.css +428 -0
- package/css/download-trigger.css +155 -46
- package/css/drawer.css +194 -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 +173 -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 +97 -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 +150 -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 +208 -67
- 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 +234 -152
- package/css/menu.css +180 -83
- package/css/menubar.css +204 -136
- package/css/message-feed.css +197 -0
- package/css/navigation-menu.css +144 -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 +175 -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 +185 -94
- package/css/popover.css +121 -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 +237 -0
- package/css/scroll-area.css +68 -7
- package/css/scrollbar.css +47 -13
- package/css/segmented.css +94 -29
- package/css/select.css +288 -274
- package/css/separator.css +101 -1
- package/css/side-nav.css +133 -75
- package/css/signature-pad.css +74 -54
- package/css/skeleton.css +84 -11
- package/css/slider.css +132 -39
- package/css/sortable.css +198 -0
- 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 +695 -118
- package/css/tabs.css +604 -42
- package/css/tag-group.css +219 -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 +323 -252
- package/css/time-range-picker.css +719 -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 +107 -36
- package/css/tour.css +183 -152
- package/css/transfer.css +351 -138
- package/css/tree-select.css +323 -216
- package/css/tree.css +294 -62
- 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 +721 -0
- package/family/field-chrome.css +298 -0
- package/family/motion.css +166 -0
- package/family/swatch.css +59 -0
- package/index.css +41705 -126
- package/index.unlayered.css +33692 -17339
- package/package.json +51 -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/dialog.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
|
-
}
|
|
13
|
-
|
|
14
|
-
@keyframes xh-fade-out {
|
|
15
|
-
from {
|
|
16
|
-
opacity: 1;
|
|
17
|
-
}
|
|
6
|
+
/* 定义 dialog 样式。 */
|
|
18
7
|
|
|
19
|
-
|
|
20
|
-
|
|
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
|
/* 幅度走令牌,减弱动效时由令牌层归零;位移与缩放用独立属性而非 transform 简写,
|
|
25
14
|
两者互不覆盖,手势期间写 translate 也不会把 scale 抹掉 */
|
|
26
15
|
@keyframes xh-dialog-in {
|
|
@@ -47,7 +36,7 @@
|
|
|
47
36
|
to {
|
|
48
37
|
opacity: 0;
|
|
49
38
|
translate: 0 var(--xh-motion-distance-md);
|
|
50
|
-
scale: var(--xh-motion-scale-
|
|
39
|
+
scale: var(--xh-motion-scale-exit);
|
|
51
40
|
}
|
|
52
41
|
}
|
|
53
42
|
}
|
|
@@ -58,13 +47,39 @@
|
|
|
58
47
|
--xh-dialog-skin: 1;
|
|
59
48
|
}
|
|
60
49
|
|
|
50
|
+
/*
|
|
51
|
+
* 触发器是页面上的独立文字按钮(§9.1):盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
|
|
52
|
+
* 由家族配方按连接层投影的 data-xh-action-variant / -size 给出。皮肤没有自己的外观规则,
|
|
53
|
+
* 只把作者塞进按钮的图标接到随档字形尺(md = 20px)。
|
|
54
|
+
*/
|
|
55
|
+
[data-scope='dialog'][data-part='trigger'] {
|
|
56
|
+
--xh-icon-size: var(--xh-dialog-icon-size, var(--xh-_action-profile-glyph-size));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* 家族配方给了 display,作者手写 hidden 时得把 UA 的 [hidden]{display:none} 还回去 */
|
|
60
|
+
[data-scope='dialog'][data-part='trigger'][hidden] {
|
|
61
|
+
display: none;
|
|
62
|
+
}
|
|
63
|
+
|
|
61
64
|
[data-scope='dialog'][data-part='backdrop'] {
|
|
62
65
|
position: fixed;
|
|
63
66
|
inset: 0;
|
|
64
|
-
z-index: var(--xh-dialog-backdrop-layer, var(--xh-layer-modal));
|
|
67
|
+
z-index: var(--xh-dialog-backdrop-layer, var(--xh-_layer, var(--xh-layer-modal)));
|
|
65
68
|
background: var(--xh-dialog-backdrop-bg, var(--xh-bg-overlay));
|
|
66
69
|
}
|
|
67
70
|
|
|
71
|
+
/* 同一层 dim 之上再做一层短半径采样。默认 opaque 的语义不变;只有作者显式选 blur
|
|
72
|
+
才会启用。保留既有 blur 槽,新的完整 filter 槽可覆盖整个表达。 */
|
|
73
|
+
[data-scope='dialog'][data-part='backdrop'][data-variant='blur'] {
|
|
74
|
+
-webkit-backdrop-filter: var(--xh-dialog-backdrop-filter, blur(var(--xh-dialog-backdrop-blur, var(--xh-overlay-backdrop-blur))));
|
|
75
|
+
backdrop-filter: var(--xh-dialog-backdrop-filter, blur(var(--xh-dialog-backdrop-blur, var(--xh-overlay-backdrop-blur))));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* 去掉底色,只留下这一层吃指针:交互外关闭与滚动锁定照旧 */
|
|
79
|
+
[data-scope='dialog'][data-part='backdrop'][data-variant='transparent'] {
|
|
80
|
+
background: transparent;
|
|
81
|
+
}
|
|
82
|
+
|
|
68
83
|
[data-scope='dialog'][data-part='backdrop'][data-state='open'] {
|
|
69
84
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
70
85
|
}
|
|
@@ -77,26 +92,37 @@
|
|
|
77
92
|
[data-scope='dialog'][data-part='positioner'] {
|
|
78
93
|
position: fixed;
|
|
79
94
|
inset: 0;
|
|
80
|
-
z-index: var(--xh-dialog-layer, var(--xh-layer-modal));
|
|
95
|
+
z-index: var(--xh-dialog-layer, var(--xh-_layer, var(--xh-layer-modal)));
|
|
81
96
|
display: flex;
|
|
82
97
|
align-items: center;
|
|
83
98
|
justify-content: center;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
99
|
+
/* 全屏定位层只负责排版,不截获页面指针;模态拦截由 backdrop 承担。 */
|
|
100
|
+
pointer-events: none;
|
|
101
|
+
/* 这段内衬是面板与视口边之间的全部距离,与安全区取大的一头:
|
|
102
|
+
刘海、圆角与底部横条压住的那一段由系统给出,内衬比它窄时面板的一角会被切掉。
|
|
103
|
+
桌面上 env() 恒为 0,取值与内衬槽完全一致。安全区只有物理方向的四个名字,
|
|
104
|
+
行内轴上两侧同取较宽的那一段,RTL 下不会翻错边。 */
|
|
105
|
+
padding-block-start: max(var(--xh-dialog-positioner-padding, var(--xh-space-4)), env(safe-area-inset-top));
|
|
106
|
+
padding-block-end: max(var(--xh-dialog-positioner-padding, var(--xh-space-4)), env(safe-area-inset-bottom));
|
|
107
|
+
padding-inline: max(
|
|
108
|
+
var(--xh-dialog-positioner-padding, var(--xh-space-4)),
|
|
109
|
+
env(safe-area-inset-left),
|
|
110
|
+
env(safe-area-inset-right)
|
|
111
|
+
);
|
|
89
112
|
}
|
|
90
113
|
|
|
91
114
|
[data-scope='dialog'][data-part='content'] {
|
|
92
|
-
/*
|
|
93
|
-
--xh-icon-size: var(--xh-dialog-icon-size, var(--xh-glyph-size-
|
|
115
|
+
/* 作者塞进面板里的图标按控件档取(§6.5);语气徽记与关闭钮另有各自的尺 */
|
|
116
|
+
--xh-icon-size: var(--xh-dialog-icon-size, var(--xh-glyph-size-md));
|
|
94
117
|
|
|
95
118
|
/* 尺寸档只换这一个私有槽。它声明在 content 而不是别处:dialog 的解剖里没有 root,
|
|
96
119
|
positioner 又不是必需部件,content 才是这层浮层恒在的最外层,且它会被 portal 到 body,
|
|
97
120
|
选择器只认得它自己身上那一份 data-size。 */
|
|
98
121
|
--xh-_dialog-max-w: var(--xh-overlay-sheet-w-md);
|
|
99
122
|
|
|
123
|
+
/* positioner 不吃指针,面板自身恢复交互。 */
|
|
124
|
+
pointer-events: auto;
|
|
125
|
+
|
|
100
126
|
position: relative;
|
|
101
127
|
inline-size: 100%;
|
|
102
128
|
max-inline-size: var(--xh-dialog-max-w, var(--xh-_dialog-max-w));
|
|
@@ -105,10 +131,28 @@
|
|
|
105
131
|
gap: var(--xh-dialog-gap, var(--xh-stack-gap-md));
|
|
106
132
|
padding-block: var(--xh-dialog-py, var(--xh-surface-py-md));
|
|
107
133
|
padding-inline: var(--xh-dialog-px, var(--xh-surface-px-md));
|
|
108
|
-
border
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
134
|
+
border: var(--xh-stroke-thin) solid var(--xh-dialog-border, var(--xh-material-elevated-border));
|
|
135
|
+
border-radius: var(--xh-dialog-radius, var(--xh-shape-overlay));
|
|
136
|
+
/* M4 是不透明的 sheet 实体面;顶部 lens 与正文同一实体面,作者可用 --xh-dialog-header-bg 单独换头部底色,
|
|
137
|
+
让标题保留空间感而不把长正文也放进透明区。两层都先留组件公开槽。 */
|
|
138
|
+
background:
|
|
139
|
+
linear-gradient(
|
|
140
|
+
to bottom,
|
|
141
|
+
var(--xh-dialog-highlight, var(--xh-material-elevated-highlight)) 0 var(--xh-stroke-thin),
|
|
142
|
+
transparent var(--xh-stroke-thin)
|
|
143
|
+
),
|
|
144
|
+
linear-gradient(
|
|
145
|
+
to bottom,
|
|
146
|
+
var(--xh-dialog-content-lens-bg, var(--xh-dialog-header-bg, var(--xh-material-elevated-bg))),
|
|
147
|
+
var(
|
|
148
|
+
--xh-dialog-bg,
|
|
149
|
+
var(--xh-material-elevated-bg)
|
|
150
|
+
) var(--xh-dialog-content-lens-depth, var(--xh-dialog-header-lens-depth, calc(var(--xh-dialog-py, var(--xh-surface-py-md)) + var(--xh-control-h-md))))
|
|
151
|
+
);
|
|
152
|
+
color: var(--xh-dialog-fg, var(--xh-material-elevated-fg));
|
|
153
|
+
box-shadow: var(--xh-dialog-shadow, var(--xh-material-elevated-shadow));
|
|
154
|
+
-webkit-backdrop-filter: var(--xh-dialog-content-backdrop-filter, var(--xh-dialog-backdrop-filter, var(--xh-material-elevated-backdrop)));
|
|
155
|
+
backdrop-filter: var(--xh-dialog-content-backdrop-filter, var(--xh-dialog-backdrop-filter, var(--xh-material-elevated-backdrop)));
|
|
112
156
|
}
|
|
113
157
|
|
|
114
158
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 drawer 一致:
|
|
@@ -135,13 +179,125 @@
|
|
|
135
179
|
}
|
|
136
180
|
|
|
137
181
|
[data-scope='dialog'][data-part='content'][data-state='open'] {
|
|
138
|
-
animation: xh-dialog-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
182
|
+
animation: xh-dialog-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
183
|
+
/* 只在开着的这一档挂:合成层随 data-state 一起收走,收起后不再占着 */
|
|
184
|
+
will-change: opacity, scale, translate;
|
|
139
185
|
}
|
|
140
186
|
|
|
141
187
|
[data-scope='dialog'][data-part='content'][data-state='closed'] {
|
|
142
188
|
animation: xh-dialog-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
143
189
|
}
|
|
144
190
|
|
|
191
|
+
/* —— 面板三段 —— */
|
|
192
|
+
/* header / body / footer 把面板切成「头尾定在原处、正文自己滚」三段,
|
|
193
|
+
与抽屉、浮动面板同一套角色划分:头尾不参与压缩,正文吃掉剩下的高度并自己滚。
|
|
194
|
+
面板的内衬仍由 content 一层给出,三段只接手段与段之间那道缝——
|
|
195
|
+
内衬换成三段各留一份,安全区与局部容器两档就要在三处各算一遍。
|
|
196
|
+
写了正文段的这一档同时封顶:不封顶正文永远没有可滚的余量,滚动条出不来。 */
|
|
197
|
+
[data-scope='dialog'][data-part='content']:has([data-scope='dialog'][data-part='body']) {
|
|
198
|
+
max-block-size: 100%;
|
|
199
|
+
gap: 0;
|
|
200
|
+
overflow: hidden;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* 头段:标题与说明纵向堆叠;不参与压缩,正文再长也压不扁它 */
|
|
204
|
+
[data-scope='dialog'][data-part='header'] {
|
|
205
|
+
flex: none;
|
|
206
|
+
display: flex;
|
|
207
|
+
flex-direction: column;
|
|
208
|
+
gap: var(--xh-dialog-header-gap, var(--xh-stack-gap-sm));
|
|
209
|
+
padding-block-end: var(--xh-dialog-header-pb, var(--xh-space-2));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* 三段结构出现时,分隔线走 M4 令牌;无 body / footer 的轻量对话框不会凭空多一条线。 */
|
|
213
|
+
[data-scope='dialog'][data-part='content']:has([data-scope='dialog'][data-part='body'])
|
|
214
|
+
[data-scope='dialog'][data-part='header'] {
|
|
215
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-dialog-separator, var(--xh-material-elevated-separator));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* 语气徽记:圆底与字形两层。圆底是这个节点自己(底色、直径、圆角),字形走下面那条
|
|
219
|
+
:empty::before;作者往里塞了节点,兜底那几条即不命中,整枚换成他的图形。
|
|
220
|
+
底与前景取语气层派生好的槽,不在这儿另兑一遍——兑法差一档,字形压上去的对比度
|
|
221
|
+
就跟着差一档。节点自己带 data-tone 时那一族的槽就声明在它身上。 */
|
|
222
|
+
[data-scope='dialog'][data-part='indicator'] {
|
|
223
|
+
/* 圆底里的图形四边各收一个 space-1,不顶到圆边上;
|
|
224
|
+
这把尺同时给作者塞进来的图标,换成 XhIcon 也不会撑破圆底 */
|
|
225
|
+
--xh-icon-size: var(--xh-dialog-indicator-mark-size, calc(var(--xh-dialog-indicator-size, var(--xh-glyph-size-md)) - 2 * var(--xh-space-1)));
|
|
226
|
+
|
|
227
|
+
flex: none;
|
|
228
|
+
display: grid;
|
|
229
|
+
place-items: center;
|
|
230
|
+
inline-size: var(--xh-dialog-indicator-size, var(--xh-glyph-size-md));
|
|
231
|
+
block-size: var(--xh-dialog-indicator-size, var(--xh-glyph-size-md));
|
|
232
|
+
border-radius: var(--xh-dialog-indicator-radius, var(--xh-shape-circle));
|
|
233
|
+
background: var(--xh-dialog-indicator-bg, var(--xh-_tone-subtle, var(--xh-bg-muted)));
|
|
234
|
+
color: var(--xh-dialog-indicator-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
[data-scope='dialog'][data-part='indicator']:empty::before {
|
|
238
|
+
content: '';
|
|
239
|
+
display: inline-block;
|
|
240
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
241
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
242
|
+
background-color: currentColor;
|
|
243
|
+
-webkit-mask: var(--xh-glyph-mark-info) center / contain no-repeat;
|
|
244
|
+
mask: var(--xh-glyph-mark-info) center / contain no-repeat;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/* 画哪枚字形跟着语气走,与命令式服务弹出来的那一枚同一套映射 */
|
|
248
|
+
[data-scope='dialog'][data-part='indicator'][data-tone='success']:empty::before {
|
|
249
|
+
-webkit-mask-image: var(--xh-glyph-mark-check);
|
|
250
|
+
mask-image: var(--xh-glyph-mark-check);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
[data-scope='dialog'][data-part='indicator'][data-tone='warning']:empty::before {
|
|
254
|
+
-webkit-mask-image: var(--xh-glyph-mark-warning);
|
|
255
|
+
mask-image: var(--xh-glyph-mark-warning);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
[data-scope='dialog'][data-part='indicator'][data-tone='danger']:empty::before {
|
|
259
|
+
-webkit-mask-image: var(--xh-glyph-mark-close);
|
|
260
|
+
mask-image: var(--xh-glyph-mark-close);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/* 正文段:面板里唯一会滚的一段。最小高度归零,
|
|
264
|
+
否则弹性项按内容撑高,容器再矮也不产生溢出,滚动条永远出不来。
|
|
265
|
+
模态 body 是原生细条滚动面(§6.6):细条由 reset 层统一给,滚到头不把页面一起带走 */
|
|
266
|
+
[data-scope='dialog'][data-part='body'] {
|
|
267
|
+
flex: 1 1 auto;
|
|
268
|
+
min-block-size: 0;
|
|
269
|
+
overflow: auto;
|
|
270
|
+
overscroll-behavior: contain;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/* 正文高度随交互变化(表单校验、展开段落):还在用原生滚动条的正文留一条稳定空道,
|
|
274
|
+
滚动条出现与消失时不推动文字。带 data-xh-scrollbar 的容器已经把原生条藏成零宽,排除掉 */
|
|
275
|
+
[data-scope='dialog'][data-part='body']:not([data-xh-scrollbar]) {
|
|
276
|
+
scrollbar-gutter: stable;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* 尾段:动作按钮排一行靠尾;同样不参与压缩 */
|
|
280
|
+
[data-scope='dialog'][data-part='footer'] {
|
|
281
|
+
flex: none;
|
|
282
|
+
display: flex;
|
|
283
|
+
align-items: center;
|
|
284
|
+
justify-content: flex-end;
|
|
285
|
+
gap: var(--xh-dialog-footer-gap, var(--xh-control-gap-md));
|
|
286
|
+
padding-block-start: var(--xh-dialog-footer-pt, var(--xh-space-2));
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
[data-scope='dialog'][data-part='content']:has([data-scope='dialog'][data-part='footer'])
|
|
290
|
+
[data-scope='dialog'][data-part='footer'] {
|
|
291
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-dialog-separator, var(--xh-material-elevated-separator));
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* 声明过 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
|
|
295
|
+
[data-scope='dialog'][data-part='header'][hidden],
|
|
296
|
+
[data-scope='dialog'][data-part='body'][hidden],
|
|
297
|
+
[data-scope='dialog'][data-part='footer'][hidden] {
|
|
298
|
+
display: none;
|
|
299
|
+
}
|
|
300
|
+
|
|
145
301
|
[data-scope='dialog'][data-part='title'] {
|
|
146
302
|
margin: 0;
|
|
147
303
|
font-size: var(--xh-dialog-title-font-size, var(--xh-text-heading-3-size));
|
|
@@ -149,9 +305,10 @@
|
|
|
149
305
|
color: var(--xh-dialog-title-fg, var(--xh-fg-default));
|
|
150
306
|
}
|
|
151
307
|
|
|
308
|
+
/* 说明文字走说明档(§6.4):13px + fg-muted */
|
|
152
309
|
[data-scope='dialog'][data-part='description'] {
|
|
153
310
|
margin: 0;
|
|
154
|
-
font-size: var(--xh-text-
|
|
311
|
+
font-size: var(--xh-dialog-description-font-size, var(--xh-text-secondary-size));
|
|
155
312
|
color: var(--xh-dialog-description-fg, var(--xh-fg-muted));
|
|
156
313
|
}
|
|
157
314
|
|
|
@@ -159,47 +316,38 @@
|
|
|
159
316
|
否则长标题会直接钻到按钮底下。只在真有关闭按钮时让位。 */
|
|
160
317
|
[data-scope='dialog'][data-part='content']:has([data-scope='dialog'][data-part='close-trigger'])
|
|
161
318
|
[data-scope='dialog'][data-part='title'] {
|
|
162
|
-
padding-inline-end: calc(var(--xh-dialog-close-size, var(--xh-control-h-sm)) + var(--xh-
|
|
319
|
+
padding-inline-end: calc(var(--xh-dialog-close-size, var(--xh-control-h-sm)) + var(--xh-surface-action-inset));
|
|
163
320
|
}
|
|
164
321
|
|
|
322
|
+
/*
|
|
323
|
+
* 关闭钮是面板角落的单图标钮(§9.1):正方盒、sm 档几何、ghost 四态面、0.97 按压并换底与粗指针命中区
|
|
324
|
+
* 由家族配方给出——白面上走画布承载阶梯悬停 --xh-bg-subtle(100)→ 按下 --xh-bg-subtle-hover(200),
|
|
325
|
+
* 焦点面透明吃库环。这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与摆放,
|
|
326
|
+
* 聚焦档的 -bg-focus / -fg-focus 两槽同样桥到配方的 focus-visible 面,缺省仍是透明底与悬停字色;
|
|
327
|
+
* 静息前景取 muted 字色,悬停 / 按下回到 fg-default。
|
|
328
|
+
*/
|
|
165
329
|
[data-scope='dialog'][data-part='close-trigger'] {
|
|
330
|
+
--xh-action-visual-size: var(--xh-dialog-close-size, var(--xh-_action-profile-visual-size));
|
|
331
|
+
--xh-action-radius: var(--xh-dialog-close-radius, var(--xh-shape-control));
|
|
332
|
+
--xh-action-bg-hover: var(--xh-dialog-close-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
333
|
+
--xh-action-bg-pressed: var(--xh-dialog-close-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
334
|
+
--xh-action-bg-focus-visible: var(--xh-dialog-close-bg-focus, var(--xh-_action-variant-bg-focus-visible));
|
|
335
|
+
--xh-action-fg-rest: var(--xh-dialog-close-fg, var(--xh-fg-muted));
|
|
336
|
+
--xh-action-fg-hover: var(--xh-dialog-close-fg-hover, var(--xh-_action-variant-fg-hover));
|
|
337
|
+
--xh-action-fg-pressed: var(--xh-dialog-close-fg-hover, var(--xh-_action-variant-fg-pressed));
|
|
338
|
+
--xh-action-fg-focus-visible: var(--xh-dialog-close-fg-focus, var(--xh-dialog-close-fg-hover, var(--xh-_action-variant-fg-focus-visible)));
|
|
339
|
+
/* 作者塞进按钮的图标随档取字形尺(sm = 16px),与皮肤画的兜底字形同一把尺 */
|
|
340
|
+
--xh-icon-size: var(--xh-dialog-icon-size, var(--xh-_action-profile-glyph-size));
|
|
341
|
+
|
|
166
342
|
position: absolute;
|
|
167
|
-
inset-block-start: var(--xh-
|
|
168
|
-
inset-inline-end: var(--xh-
|
|
169
|
-
display: inline-flex;
|
|
170
|
-
align-items: center;
|
|
171
|
-
justify-content: center;
|
|
172
|
-
block-size: var(--xh-dialog-close-size, var(--xh-control-h-sm));
|
|
173
|
-
inline-size: var(--xh-dialog-close-size, var(--xh-control-h-sm));
|
|
174
|
-
border: 0;
|
|
175
|
-
border-radius: var(--xh-dialog-close-radius, var(--xh-shape-control));
|
|
176
|
-
background: transparent;
|
|
177
|
-
color: var(--xh-fg-muted);
|
|
178
|
-
cursor: pointer;
|
|
179
|
-
transition:
|
|
180
|
-
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
181
|
-
scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
343
|
+
inset-block-start: var(--xh-surface-action-inset);
|
|
344
|
+
inset-inline-end: var(--xh-surface-action-inset);
|
|
182
345
|
}
|
|
183
346
|
|
|
184
347
|
[data-scope='dialog'][data-part='close-trigger'][hidden] {
|
|
185
348
|
display: none;
|
|
186
349
|
}
|
|
187
350
|
|
|
188
|
-
[data-scope='dialog'][data-part='close-trigger']:hover {
|
|
189
|
-
background: var(--xh-dialog-close-bg-hover, var(--xh-bg-subtle-hover));
|
|
190
|
-
color: var(--xh-fg-default);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
[data-scope='dialog'][data-part='close-trigger']:active {
|
|
194
|
-
background: var(--xh-dialog-close-bg-active, var(--xh-bg-subtle-active));
|
|
195
|
-
scale: var(--xh-motion-scale-press);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
[data-scope='dialog'][data-part='close-trigger']:focus-visible {
|
|
199
|
-
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
200
|
-
outline-offset: var(--xh-ring-offset);
|
|
201
|
-
}
|
|
202
|
-
|
|
203
351
|
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
204
352
|
[data-scope='dialog'][data-part='close-trigger']:empty::before {
|
|
205
353
|
content: '';
|
|
@@ -214,7 +362,38 @@
|
|
|
214
362
|
|
|
215
363
|
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
216
364
|
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
217
|
-
[data-scope='dialog'][data-part='positioner'][hidden]
|
|
365
|
+
[data-scope='dialog'][data-part='positioner'][hidden],
|
|
366
|
+
[data-scope='dialog'][data-part='indicator'][hidden] {
|
|
218
367
|
display: none;
|
|
219
368
|
}
|
|
369
|
+
|
|
370
|
+
/* 光学效果只在常规档存在:高对比、显式/系统减少透明度与强制色均把 blur 的遮罩原位实体化。 */
|
|
371
|
+
:where([data-contrast='more']) [data-scope='dialog'][data-part='backdrop'][data-variant='blur'],
|
|
372
|
+
:where([data-transparency='reduce']) [data-scope='dialog'][data-part='backdrop'][data-variant='blur'] {
|
|
373
|
+
-webkit-backdrop-filter: none;
|
|
374
|
+
backdrop-filter: none;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
@media (prefers-contrast: more), (prefers-reduced-transparency: reduce), (forced-colors: active) {
|
|
378
|
+
[data-scope='dialog'][data-part='backdrop'][data-variant='blur'] {
|
|
379
|
+
-webkit-backdrop-filter: none;
|
|
380
|
+
backdrop-filter: none;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
@media (forced-colors: active) {
|
|
385
|
+
/* 强制色会接管渐变;改回同名实体 M4 底,保留 Canvas / CanvasText 的轮廓与正文。 */
|
|
386
|
+
[data-scope='dialog'][data-part='content'] {
|
|
387
|
+
background: var(--xh-dialog-bg, var(--xh-material-elevated-bg));
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
@media print {
|
|
392
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
393
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
394
|
+
[data-scope='dialog'][data-part='backdrop'],
|
|
395
|
+
[data-scope='dialog'][data-part='positioner'] {
|
|
396
|
+
display: none;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
220
399
|
}
|