@xihan-ui/styles 3.1.0 → 4.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 +470 -0
- package/component-tokens.d.ts +230 -60
- package/components.tokens.json +5156 -1557
- package/css/accordion.css +47 -20
- package/css/alert.css +16 -17
- package/css/anchor.css +2 -2
- package/css/approval.css +41 -17
- package/css/avatar-group.css +9 -12
- package/css/avatar.css +20 -18
- package/css/back-top.css +21 -7
- package/css/badge.css +5 -5
- package/css/breadcrumb.css +18 -16
- package/css/button-group.css +4 -6
- package/css/button.css +13 -12
- package/css/calendar-picker.css +178 -95
- package/css/calendar-range-picker.css +207 -122
- package/css/card.css +34 -6
- package/css/carousel.css +94 -46
- package/css/cartesian-chart.css +11 -11
- package/css/cascader.css +51 -39
- package/css/checkbox-group.css +9 -6
- package/css/checkbox.css +5 -4
- package/css/citation.css +9 -4
- package/css/clipboard.css +20 -4
- package/css/code-view.css +6 -6
- package/css/collapsible.css +29 -14
- package/css/color-field.css +4 -4
- package/css/color-picker.css +77 -23
- package/css/color-slider.css +10 -8
- package/css/color-swatch-picker.css +14 -9
- package/css/combobox.css +26 -14
- package/css/command.css +14 -9
- package/css/context-menu.css +10 -5
- package/css/date-field.css +12 -6
- package/css/date-picker.css +178 -109
- package/css/date-range-picker.css +199 -130
- package/css/description.css +10 -6
- package/css/descriptions.css +47 -19
- package/css/dialog.css +50 -35
- package/css/diff-view.css +8 -8
- package/css/drawer.css +75 -21
- package/css/editable.css +15 -41
- package/css/empty-state.css +21 -3
- package/css/field-array.css +5 -2
- package/css/field.css +17 -18
- package/css/fieldset.css +33 -13
- package/css/file-upload.css +66 -33
- package/css/float-button.css +60 -35
- package/css/floating-panel.css +1 -1
- package/css/form.css +30 -16
- package/css/graph-chart.css +2 -2
- package/css/grid-list.css +1 -1
- package/css/highlight.css +5 -5
- package/css/hover-card.css +19 -12
- package/css/image-viewer.css +77 -27
- package/css/image.css +13 -5
- package/css/infinite-scroll.css +8 -4
- package/css/input-group.css +74 -26
- package/css/kbd.css +1 -1
- package/css/label.css +27 -11
- package/css/layout.css +17 -10
- package/css/list.css +13 -9
- package/css/listbox.css +12 -7
- package/css/loading-bar.css +3 -0
- package/css/mention.css +11 -9
- package/css/menu.css +10 -5
- package/css/menubar.css +13 -8
- package/css/message-feed.css +1 -1
- package/css/navigation-menu.css +2 -2
- package/css/notification.css +132 -49
- package/css/number-animation.css +2 -2
- package/css/number-field.css +75 -52
- package/css/page-header.css +64 -27
- package/css/pagination.css +35 -38
- package/css/password-input.css +12 -68
- package/css/pin-input.css +18 -26
- package/css/popconfirm.css +23 -14
- package/css/popover.css +18 -12
- package/css/progress.css +14 -13
- package/css/prompt-input.css +3 -3
- package/css/question-flow.css +41 -15
- package/css/radar-chart.css +6 -6
- package/css/radio-group.css +120 -55
- package/css/rating.css +32 -15
- package/css/select.css +16 -12
- package/css/separator.css +24 -6
- package/css/side-nav.css +29 -24
- package/css/signature-pad.css +23 -9
- package/css/skeleton.css +12 -12
- package/css/slider.css +77 -48
- package/css/sortable.css +2 -2
- package/css/sparkline.css +8 -2
- package/css/spinner.css +40 -20
- package/css/statistic.css +14 -14
- package/css/steps.css +115 -84
- package/css/switch.css +9 -7
- package/css/table.css +29 -12
- package/css/tabs.css +35 -12
- package/css/tag-group.css +17 -6
- package/css/tag.css +54 -29
- package/css/tags-input.css +39 -20
- package/css/text-field.css +5 -5
- package/css/time-field.css +4 -4
- package/css/time-picker.css +150 -64
- package/css/time-range-picker.css +91 -62
- package/css/timeline.css +37 -20
- package/css/timer.css +3 -3
- package/css/toggle-group.css +4 -4
- package/css/tool-call.css +13 -11
- package/css/toolbar.css +6 -5
- package/css/tooltip.css +16 -17
- package/css/tour.css +14 -7
- package/css/transfer.css +22 -16
- package/css/tree-select.css +12 -12
- package/css/tree.css +26 -25
- package/css/typography.css +28 -25
- package/dist/css/accordion.css +296 -0
- package/dist/css/affix.css +47 -0
- package/dist/css/alert.css +246 -0
- package/dist/css/anchor.css +252 -0
- package/dist/css/approval.css +525 -0
- package/dist/css/avatar-group.css +96 -0
- package/dist/css/avatar.css +100 -0
- package/dist/css/back-top.css +175 -0
- package/dist/css/badge.css +205 -0
- package/dist/css/bar-code.css +62 -0
- package/dist/css/breadcrumb.css +232 -0
- package/dist/css/button-group.css +261 -0
- package/dist/css/button.css +216 -0
- package/dist/css/calendar-picker.css +550 -0
- package/dist/css/calendar-range-picker.css +639 -0
- package/dist/css/card.css +249 -0
- package/dist/css/carousel.css +726 -0
- package/dist/css/cartesian-chart.css +830 -0
- package/dist/css/cascader.css +973 -0
- package/dist/css/checkbox-group.css +361 -0
- package/dist/css/checkbox.css +258 -0
- package/dist/css/citation.css +475 -0
- package/dist/css/clipboard.css +331 -0
- package/dist/css/code-view.css +374 -0
- package/dist/css/collapsible.css +200 -0
- package/dist/css/color-field.css +176 -0
- package/dist/css/color-picker.css +649 -0
- package/dist/css/color-slider.css +283 -0
- package/dist/css/color-swatch-picker.css +250 -0
- package/dist/css/color-swatch.css +35 -0
- package/dist/css/combobox.css +578 -0
- package/dist/css/command.css +404 -0
- package/dist/css/context-menu.css +425 -0
- package/dist/css/date-field.css +317 -0
- package/dist/css/date-picker.css +931 -0
- package/dist/css/date-range-picker.css +949 -0
- package/dist/css/description.css +71 -0
- package/dist/css/descriptions.css +327 -0
- package/dist/css/dialog.css +470 -0
- package/dist/css/diff-view.css +513 -0
- package/dist/css/download-trigger.css +151 -0
- package/dist/css/drawer.css +606 -0
- package/dist/css/editable.css +269 -0
- package/dist/css/empty-state.css +181 -0
- package/dist/css/field-array.css +229 -0
- package/dist/css/field.css +165 -0
- package/dist/css/fieldset.css +122 -0
- package/dist/css/file-upload.css +462 -0
- package/dist/css/flex.css +441 -0
- package/dist/css/float-button.css +579 -0
- package/dist/css/floating-panel.css +429 -0
- package/dist/css/focus.css +46 -0
- package/dist/css/forced-colors.css +93 -0
- package/dist/css/form.css +407 -0
- package/dist/css/funnel-chart.css +106 -0
- package/dist/css/graph-chart.css +205 -0
- package/dist/css/grid-list.css +235 -0
- package/dist/css/grid.css +1201 -0
- package/dist/css/heatmap.css +552 -0
- package/dist/css/hierarchy-chart.css +298 -0
- package/dist/css/highlight.css +41 -0
- package/dist/css/hover-card.css +233 -0
- package/dist/css/icon.css +225 -0
- package/dist/css/image-cropper.css +373 -0
- package/dist/css/image-viewer.css +588 -0
- package/dist/css/image.css +106 -0
- package/dist/css/infinite-scroll.css +81 -0
- package/dist/css/input-group.css +323 -0
- package/dist/css/json-viewer.css +379 -0
- package/dist/css/kbd.css +72 -0
- package/dist/css/label.css +94 -0
- package/dist/css/layers.css +7 -0
- package/dist/css/layout.css +379 -0
- package/dist/css/liquid.css +106 -0
- package/dist/css/list.css +156 -0
- package/dist/css/listbox.css +395 -0
- package/dist/css/loading-bar.css +144 -0
- package/dist/css/log.css +306 -0
- package/dist/css/markdown-stream.css +149 -0
- package/dist/css/marquee.css +378 -0
- package/dist/css/masonry.css +70 -0
- package/dist/css/matrix-code.css +67 -0
- package/dist/css/mention.css +395 -0
- package/dist/css/menu.css +369 -0
- package/dist/css/menubar.css +461 -0
- package/dist/css/message-feed.css +318 -0
- package/dist/css/navigation-menu.css +513 -0
- package/dist/css/notification.css +865 -0
- package/dist/css/number-animation.css +44 -0
- package/dist/css/number-field.css +275 -0
- package/dist/css/overlay-arrow.css +56 -0
- package/dist/css/page-header.css +221 -0
- package/dist/css/pagination.css +447 -0
- package/dist/css/password-input.css +335 -0
- package/dist/css/pie-chart.css +247 -0
- package/dist/css/pin-input.css +191 -0
- package/dist/css/pointer.css +36 -0
- package/dist/css/popconfirm.css +329 -0
- package/dist/css/popover.css +285 -0
- package/dist/css/progress.css +502 -0
- package/dist/css/prompt-input.css +260 -0
- package/dist/css/question-flow.css +579 -0
- package/dist/css/radar-chart.css +233 -0
- package/dist/css/radio-group.css +663 -0
- package/dist/css/rating.css +311 -0
- package/dist/css/reasoning.css +343 -0
- package/dist/css/reset.css +117 -0
- package/dist/css/resizable.css +242 -0
- package/dist/css/sankey-chart.css +174 -0
- package/dist/css/scroll-area.css +240 -0
- package/dist/css/scrollbar.css +204 -0
- package/dist/css/select.css +616 -0
- package/dist/css/separator.css +140 -0
- package/dist/css/side-nav.css +481 -0
- package/dist/css/signature-pad.css +193 -0
- package/dist/css/skeleton.css +161 -0
- package/dist/css/slider.css +403 -0
- package/dist/css/sortable.css +228 -0
- package/dist/css/sparkline.css +170 -0
- package/dist/css/spinner.css +256 -0
- package/dist/css/splitter.css +159 -0
- package/dist/css/statistic.css +137 -0
- package/dist/css/steps.css +658 -0
- package/dist/css/switch.css +353 -0
- package/dist/css/table.css +1162 -0
- package/dist/css/tabs.css +967 -0
- package/dist/css/tag-group.css +258 -0
- package/dist/css/tag.css +335 -0
- package/dist/css/tags-input.css +341 -0
- package/dist/css/text-field.css +197 -0
- package/dist/css/time-field.css +277 -0
- package/dist/css/time-picker.css +793 -0
- package/dist/css/time-range-picker.css +775 -0
- package/dist/css/timeline.css +440 -0
- package/dist/css/timer.css +123 -0
- package/dist/css/timestamp.css +34 -0
- package/dist/css/toggle-group.css +424 -0
- package/dist/css/toggle.css +146 -0
- package/dist/css/tone.css +189 -0
- package/dist/css/tool-call.css +431 -0
- package/dist/css/toolbar.css +366 -0
- package/dist/css/tooltip.css +217 -0
- package/dist/css/tour.css +446 -0
- package/dist/css/transfer.css +644 -0
- package/dist/css/tree-select.css +878 -0
- package/dist/css/tree.css +734 -0
- package/dist/css/truncate.css +108 -0
- package/dist/css/typography.css +475 -0
- package/dist/css/undefined.css +58 -0
- package/dist/css/virtualizer.css +166 -0
- package/dist/css/visually-hidden.css +20 -0
- package/dist/css/watermark.css +82 -0
- package/dist/family/action-control.css +493 -0
- package/dist/family/chart.css +537 -0
- package/dist/family/check-mark.css +94 -0
- package/dist/family/choice-card.css +97 -0
- package/dist/family/collection-item.css +768 -0
- package/dist/family/field-chrome.css +296 -0
- package/dist/family/loading-ring.css +102 -0
- package/dist/family/material.css +72 -0
- package/dist/family/menu-choice.css +56 -0
- package/dist/family/motion.css +363 -0
- package/dist/family/swatch.css +59 -0
- package/dist/family/tag-list.css +65 -0
- package/family/action-control.css +33 -36
- package/family/chart.css +57 -0
- package/family/collection-item.css +12 -8
- package/family/field-chrome.css +28 -19
- package/family/loading-ring.css +20 -13
- package/family/swatch.css +4 -4
- package/family/tag-list.css +6 -0
- package/index.css +10349 -8756
- package/index.unlayered.css +10350 -8758
- package/package.json +165 -164
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* 定义 dialog 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
10
|
+
@import '../family/action-control.css';
|
|
11
|
+
|
|
12
|
+
@layer xihan.components {
|
|
13
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
14
|
+
.xh-scope-dialog {
|
|
15
|
+
--xh-dialog-skin: 1;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/*
|
|
19
|
+
* 触发器是页面上的独立文字按钮:盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
|
|
20
|
+
* 由家族配方按连接层投影的 data-xh-action-variant / -size 给出。皮肤没有自己的外观规则,
|
|
21
|
+
* 只把作者塞进按钮的图标接到随档字形尺(md = 20px)。
|
|
22
|
+
*/
|
|
23
|
+
.xh-scope-dialog[data-part='trigger'] {
|
|
24
|
+
--xh-icon-size: var(--xh-dialog-icon-size, var(--xh-_action-profile-glyph-size));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* 家族配方给了 display,作者手写 hidden 时得把 UA 的 [hidden]{display:none} 还回去 */
|
|
28
|
+
.xh-scope-dialog[data-part='trigger'][hidden] {
|
|
29
|
+
display: none;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.xh-scope-dialog[data-part='backdrop'] {
|
|
33
|
+
position: fixed;
|
|
34
|
+
inset: 0;
|
|
35
|
+
z-index: var(--xh-dialog-backdrop-layer, var(--xh-_layer, var(--xh-layer-modal)));
|
|
36
|
+
background: var(--xh-dialog-backdrop-bg, var(--xh-bg-overlay));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* 同一层 dim 之上再做一层短半径采样。默认 opaque 的语义不变;只有作者显式选 blur
|
|
40
|
+
才会启用。保留既有 blur 槽,新的完整 filter 槽可覆盖整个表达。 */
|
|
41
|
+
.xh-scope-dialog[data-part='backdrop'][data-variant='blur'] {
|
|
42
|
+
-webkit-backdrop-filter: var(--xh-dialog-backdrop-filter, blur(var(--xh-dialog-backdrop-blur, var(--xh-overlay-backdrop-blur))));
|
|
43
|
+
backdrop-filter: var(--xh-dialog-backdrop-filter, blur(var(--xh-dialog-backdrop-blur, var(--xh-overlay-backdrop-blur))));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* 去掉底色,只留下这一层吃指针:交互外关闭与滚动锁定照旧 */
|
|
47
|
+
.xh-scope-dialog[data-part='backdrop'][data-variant='transparent'] {
|
|
48
|
+
background: transparent;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.xh-scope-dialog[data-part='backdrop'][data-state='open']:not([data-instant]) {
|
|
52
|
+
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* 退场补 forwards:动画播完到宿主真正卸载之间还有一帧,不定住终态遮罩会闪回全黑 */
|
|
56
|
+
.xh-scope-dialog[data-part='backdrop'][data-state='closed'] {
|
|
57
|
+
animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.xh-scope-dialog[data-part='positioner'] {
|
|
61
|
+
position: fixed;
|
|
62
|
+
inset: 0;
|
|
63
|
+
z-index: var(--xh-dialog-layer, var(--xh-_layer, var(--xh-layer-modal)));
|
|
64
|
+
display: flex;
|
|
65
|
+
align-items: center;
|
|
66
|
+
justify-content: center;
|
|
67
|
+
/* 全屏定位层只负责排版,不截获页面指针;模态拦截由 backdrop 承担。 */
|
|
68
|
+
pointer-events: none;
|
|
69
|
+
/* 这段内衬是面板与视口边之间的全部距离,与安全区取大的一头:
|
|
70
|
+
刘海、圆角与底部横条压住的那一段由系统给出,内衬比它窄时面板的一角会被切掉。
|
|
71
|
+
桌面上 env() 恒为 0,取值与内衬槽完全一致。安全区只有物理方向的四个名字,
|
|
72
|
+
行内轴上两侧同取较宽的那一段,RTL 下不会翻错边。 */
|
|
73
|
+
padding-block-start: max(var(--xh-dialog-positioner-padding, var(--xh-space-4)), env(safe-area-inset-top));
|
|
74
|
+
padding-block-end: max(var(--xh-dialog-positioner-padding, var(--xh-space-4)), env(safe-area-inset-bottom));
|
|
75
|
+
padding-inline: max(
|
|
76
|
+
var(--xh-dialog-positioner-padding, var(--xh-space-4)),
|
|
77
|
+
env(safe-area-inset-left),
|
|
78
|
+
env(safe-area-inset-right)
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.xh-scope-dialog[data-part='content'] {
|
|
83
|
+
/* 作者塞进面板里的图标按控件档取;语气徽记与关闭钮另有各自的尺 */
|
|
84
|
+
--xh-icon-size: var(--xh-dialog-icon-size, var(--xh-glyph-size-md));
|
|
85
|
+
|
|
86
|
+
/* 尺寸档只换这一个私有槽。它声明在 content 而不是别处:dialog 的解剖里没有 root,
|
|
87
|
+
positioner 又不是必需部件,content 才是这层浮层恒在的最外层,且它会被 portal 到 body,
|
|
88
|
+
选择器只认得它自己身上那一份 data-size。 */
|
|
89
|
+
--xh-_dialog-max-w: var(--xh-overlay-sheet-w-md);
|
|
90
|
+
|
|
91
|
+
/* 头部带:标题首行与角上的关闭钮都落在这条带的中线上。分三段时它就是 header,
|
|
92
|
+
不分三段时它是面板顶上那一截——两种写法的标题行与叉落在同一处。
|
|
93
|
+
带的上沿就是面板内沿(安全区由 positioner 让出),与抽屉同一组槽,抽屉在这里补安全区 */
|
|
94
|
+
--xh-_dialog-header-top: var(--xh-space-0);
|
|
95
|
+
/* 关闭钮行向让出的安全区:对话框不贴屏幕边(安全区同样由 positioner 让出),与抽屉同一组槽,抽屉在这里补安全区 */
|
|
96
|
+
--xh-_dialog-safe-inline: var(--xh-space-0);
|
|
97
|
+
--xh-_dialog-header-h: var(--xh-overlay-header-h);
|
|
98
|
+
/* 标题首行在带里居中要让出的上内衬:带高减标题行高再对半 */
|
|
99
|
+
--xh-_dialog-header-pt: calc((var(--xh-_dialog-header-h) - var(--xh-text-heading-3-size) * var(--xh-leading-normal)) / 2);
|
|
100
|
+
/* 分三段时头的下内衬扣掉分隔线那 1px,只有标题时整条带恰好是带高 */
|
|
101
|
+
--xh-_dialog-header-pb: calc(var(--xh-_dialog-header-pt) - var(--xh-stroke-thin));
|
|
102
|
+
|
|
103
|
+
/* positioner 不吃指针,面板自身恢复交互。 */
|
|
104
|
+
pointer-events: auto;
|
|
105
|
+
|
|
106
|
+
position: relative;
|
|
107
|
+
inline-size: 100%;
|
|
108
|
+
max-inline-size: var(--xh-dialog-max-w, var(--xh-_dialog-max-w));
|
|
109
|
+
display: flex;
|
|
110
|
+
flex-direction: column;
|
|
111
|
+
gap: var(--xh-dialog-gap, var(--xh-stack-gap-md));
|
|
112
|
+
/* 不分三段时内衬由面板一层给:上沿让标题行落在头部带中线,横向与三段同一档 */
|
|
113
|
+
padding-block-start: var(--xh-dialog-py, var(--xh-_dialog-header-pt));
|
|
114
|
+
padding-block-end: var(--xh-dialog-py, var(--xh-overlay-sheet-body-py));
|
|
115
|
+
padding-inline: var(--xh-dialog-px, var(--xh-overlay-sheet-px));
|
|
116
|
+
border: var(--xh-stroke-thin) solid var(--xh-dialog-border, var(--xh-material-elevated-border));
|
|
117
|
+
border-radius: var(--xh-dialog-radius, var(--xh-shape-overlay));
|
|
118
|
+
/* sheet 实体面:1px 描边 + 不透明底 + 单层投影,不叠渐变与顶光 */
|
|
119
|
+
background: var(--xh-dialog-bg, var(--xh-material-elevated-bg));
|
|
120
|
+
color: var(--xh-dialog-fg, var(--xh-material-elevated-fg));
|
|
121
|
+
box-shadow: var(--xh-dialog-shadow, var(--xh-material-elevated-shadow));
|
|
122
|
+
-webkit-backdrop-filter: var(--xh-dialog-content-backdrop-filter, var(--xh-dialog-backdrop-filter, var(--xh-material-elevated-backdrop)));
|
|
123
|
+
backdrop-filter: var(--xh-dialog-content-backdrop-filter, var(--xh-dialog-backdrop-filter, var(--xh-material-elevated-backdrop)));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 drawer 一致:
|
|
127
|
+
收起态连接层会给 content 打 hidden,而上面那条 display: flex 正是要盖掉 UA 的
|
|
128
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
129
|
+
读到才申领租约、等 animationend 才卸载;一旦 display: none,元素不生成盒子、
|
|
130
|
+
动画根本不启动,探测器直接放弃租约,退场动画一帧都播不出来。
|
|
131
|
+
真正的收起由适配器兜住:Vue 卸载整棵,WC 写内联 style.display。
|
|
132
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
133
|
+
|
|
134
|
+
/* —— 尺寸 —— */
|
|
135
|
+
/* 只有最大宽度分档;中间档不写规则,缺省即中档。
|
|
136
|
+
宽度上限之外的一切(内边距、字号、圆角)都不随档位动:弹层的语气归里面的内容表达。 */
|
|
137
|
+
.xh-scope-dialog[data-part='content'][data-size='sm'] {
|
|
138
|
+
--xh-_dialog-max-w: var(--xh-overlay-sheet-w-sm);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.xh-scope-dialog[data-part='content'][data-size='lg'] {
|
|
142
|
+
--xh-_dialog-max-w: var(--xh-overlay-sheet-w-lg);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.xh-scope-dialog[data-part='content']:focus-visible {
|
|
146
|
+
outline: none;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
150
|
+
.xh-scope-dialog[data-part='content'][data-state='open']:not([data-instant]) {
|
|
151
|
+
animation: xh-sheet-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.xh-scope-dialog[data-part='content'][data-state='closed'] {
|
|
155
|
+
animation: xh-sheet-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* —— 拖动 ——
|
|
159
|
+
位移由连接层写进两个私有槽,是屏幕坐标:跟着指针与方向键走,RTL 下不翻。
|
|
160
|
+
进出场关键帧占着 translate 与 scale 两个独立属性,位移只能走 transform:它排在独立属性之后合成,
|
|
161
|
+
与进出场叠在一起。写进 translate 的话,拖过的面板一收起就先被关键帧拽回居中再退场。
|
|
162
|
+
位移跟手,不挂过渡 */
|
|
163
|
+
.xh-scope-dialog[data-part='content'][data-draggable] {
|
|
164
|
+
transform: translate(var(--xh-_dialog-drag-x, 0px), var(--xh-_dialog-drag-y, 0px));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* 跟手期间才备合成层;拖动中不选中文字 */
|
|
168
|
+
.xh-scope-dialog[data-part='content'][data-dragging] {
|
|
169
|
+
will-change: transform;
|
|
170
|
+
user-select: none;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* 标题栏是拖动区(没写 header 时是标题):指针按下即跟手,触屏不让浏览器抢走这段手势 */
|
|
174
|
+
.xh-scope-dialog[data-part='header'][data-draggable],
|
|
175
|
+
.xh-scope-dialog[data-part='title'][data-draggable] {
|
|
176
|
+
cursor: grab;
|
|
177
|
+
touch-action: none;
|
|
178
|
+
user-select: none;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.xh-scope-dialog[data-part='content'][data-dragging] .xh-scope-dialog[data-part='header'],
|
|
182
|
+
.xh-scope-dialog[data-part='content'][data-dragging] .xh-scope-dialog[data-part='title'] {
|
|
183
|
+
cursor: grabbing;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/* 拖动把手:一块透明的命中区,给键盘一个挪动面板的落脚点。放在标题栏里时铺满标题栏,
|
|
187
|
+
焦点环沿标题栏画;单独摆放时是一条满宽的细条 */
|
|
188
|
+
.xh-scope-dialog[data-part='drag-trigger'] {
|
|
189
|
+
display: block;
|
|
190
|
+
inline-size: 100%;
|
|
191
|
+
min-block-size: var(--xh-dialog-drag-trigger-min-h, var(--xh-space-6));
|
|
192
|
+
border: 0;
|
|
193
|
+
border-radius: var(--xh-dialog-drag-trigger-radius, var(--xh-shape-control));
|
|
194
|
+
padding: 0;
|
|
195
|
+
background: transparent;
|
|
196
|
+
cursor: grab;
|
|
197
|
+
touch-action: none;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.xh-scope-dialog[data-part='header']:has(> .xh-scope-dialog[data-part='drag-trigger']) {
|
|
201
|
+
position: relative;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.xh-scope-dialog[data-part='header'] > .xh-scope-dialog[data-part='drag-trigger'] {
|
|
205
|
+
position: absolute;
|
|
206
|
+
inset: 0;
|
|
207
|
+
min-block-size: 0;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.xh-scope-dialog[data-part='drag-trigger'][data-dragging] {
|
|
211
|
+
cursor: grabbing;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.xh-scope-dialog[data-part='drag-trigger'][data-disabled] {
|
|
215
|
+
cursor: default;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.xh-scope-dialog[data-part='drag-trigger'][hidden] {
|
|
219
|
+
display: none;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* —— 面板三段 —— */
|
|
223
|
+
/* header / body / footer 把面板切成「头尾定在原处、正文自己滚」三段,
|
|
224
|
+
与抽屉、浮动面板同一套角色划分:头尾不参与压缩,正文吃掉剩下的高度并自己滚。
|
|
225
|
+
分三段时内衬由三段各自给,面板一层归零:头下、尾上的分隔线才能贴着面板两侧的边。
|
|
226
|
+
安全区由 positioner 让出,面板自己不碰视口边,三段不用各算一遍。
|
|
227
|
+
写了正文段的这一档同时封顶:不封顶正文永远没有可滚的余量,滚动条出不来。 */
|
|
228
|
+
.xh-scope-dialog[data-part='content']:has(.xh-scope-dialog[data-part='body']) {
|
|
229
|
+
max-block-size: 100%;
|
|
230
|
+
gap: 0;
|
|
231
|
+
padding: 0;
|
|
232
|
+
overflow: hidden;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* 头段:标题与说明纵向堆叠;不参与压缩,正文再长也压不扁它 */
|
|
236
|
+
.xh-scope-dialog[data-part='header'] {
|
|
237
|
+
flex: none;
|
|
238
|
+
display: flex;
|
|
239
|
+
flex-direction: column;
|
|
240
|
+
gap: var(--xh-dialog-header-gap, var(--xh-stack-gap-sm));
|
|
241
|
+
padding-block-end: var(--xh-dialog-header-pb, var(--xh-space-2));
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* 三段结构的头:一条 48px 的头部带,标题首行落在带的中线上(说明在下面接着排,带随之长高),
|
|
245
|
+
横向内衬 20px;下沿一条 1px 的内部分隔线走 sheet 分隔令牌,贴着面板两侧的边。
|
|
246
|
+
下内衬扣掉分隔线那 1px,只有标题时整条带恰好是带高。无 body 的轻量对话框不会凭空多一条线 */
|
|
247
|
+
.xh-scope-dialog[data-part='content']:has(.xh-scope-dialog[data-part='body'])
|
|
248
|
+
.xh-scope-dialog[data-part='header'] {
|
|
249
|
+
justify-content: center;
|
|
250
|
+
min-block-size: var(--xh-_dialog-header-h);
|
|
251
|
+
padding-block-start: var(--xh-dialog-header-pt, var(--xh-_dialog-header-pt));
|
|
252
|
+
padding-block-end: var(--xh-dialog-header-pb, var(--xh-_dialog-header-pb));
|
|
253
|
+
padding-inline: var(--xh-dialog-header-px, var(--xh-overlay-sheet-px));
|
|
254
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-dialog-separator, var(--xh-material-elevated-separator));
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* 语气徽记:圆底与字形两层。圆底是这个节点自己(底色、直径、圆角),字形走下面那条
|
|
258
|
+
:empty::before;作者往里塞了节点,兜底那几条即不命中,整枚换成他的图形。
|
|
259
|
+
底与前景取语气层派生好的槽,不在这儿另兑一遍——兑法差一档,字形压上去的对比度
|
|
260
|
+
就跟着差一档。节点自己带 data-tone 时那一族的槽就声明在它身上。 */
|
|
261
|
+
.xh-scope-dialog[data-part='indicator'] {
|
|
262
|
+
/* 圆底里的图形四边各收一个 space-1,不顶到圆边上;
|
|
263
|
+
这把尺同时给作者塞进来的图标,换成 XhIcon 也不会撑破圆底 */
|
|
264
|
+
--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)));
|
|
265
|
+
|
|
266
|
+
flex: none;
|
|
267
|
+
display: grid;
|
|
268
|
+
place-items: center;
|
|
269
|
+
inline-size: var(--xh-dialog-indicator-size, var(--xh-glyph-size-md));
|
|
270
|
+
block-size: var(--xh-dialog-indicator-size, var(--xh-glyph-size-md));
|
|
271
|
+
border-radius: var(--xh-dialog-indicator-radius, var(--xh-shape-circle));
|
|
272
|
+
background: var(--xh-dialog-indicator-bg, var(--xh-_tone-subtle, var(--xh-bg-muted)));
|
|
273
|
+
color: var(--xh-dialog-indicator-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.xh-scope-dialog[data-part='indicator']:empty::before {
|
|
277
|
+
content: '';
|
|
278
|
+
display: inline-block;
|
|
279
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
280
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
281
|
+
background-color: currentColor;
|
|
282
|
+
-webkit-mask: var(--xh-glyph-mark-info) center / contain no-repeat;
|
|
283
|
+
mask: var(--xh-glyph-mark-info) center / contain no-repeat;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* 画哪枚字形跟着语气走,与命令式服务弹出来的那一枚同一套映射 */
|
|
287
|
+
.xh-scope-dialog[data-part='indicator'][data-tone='success']:empty::before {
|
|
288
|
+
-webkit-mask-image: var(--xh-glyph-mark-check);
|
|
289
|
+
mask-image: var(--xh-glyph-mark-check);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.xh-scope-dialog[data-part='indicator'][data-tone='warning']:empty::before {
|
|
293
|
+
-webkit-mask-image: var(--xh-glyph-mark-warning);
|
|
294
|
+
mask-image: var(--xh-glyph-mark-warning);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.xh-scope-dialog[data-part='indicator'][data-tone='danger']:empty::before {
|
|
298
|
+
-webkit-mask-image: var(--xh-glyph-mark-close);
|
|
299
|
+
mask-image: var(--xh-glyph-mark-close);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/* 正文段:面板里唯一会滚的一段。最小高度归零,
|
|
303
|
+
否则弹性项按内容撑高,容器再矮也不产生溢出,滚动条永远出不来。
|
|
304
|
+
模态 body 是原生细条滚动面:细条由 reset 层统一给,滚到头不把页面一起带走。
|
|
305
|
+
内衬纵 24 横 20 */
|
|
306
|
+
.xh-scope-dialog[data-part='body'] {
|
|
307
|
+
flex: 1 1 auto;
|
|
308
|
+
min-block-size: 0;
|
|
309
|
+
overflow: auto;
|
|
310
|
+
overscroll-behavior: contain;
|
|
311
|
+
padding-block: var(--xh-dialog-body-py, var(--xh-overlay-sheet-body-py));
|
|
312
|
+
padding-inline: var(--xh-dialog-body-px, var(--xh-overlay-sheet-px));
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/* 正文高度随交互变化(表单校验、展开段落):还在用原生滚动条的正文留一条稳定空道,
|
|
316
|
+
滚动条出现与消失时不推动文字。带 data-xh-scrollbar 的容器已经把原生条藏成零宽,排除掉 */
|
|
317
|
+
.xh-scope-dialog[data-part='body']:not([data-xh-scrollbar]) {
|
|
318
|
+
scrollbar-gutter: stable;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/* 尾段:动作按钮排一行靠尾;同样不参与压缩 */
|
|
322
|
+
.xh-scope-dialog[data-part='footer'] {
|
|
323
|
+
flex: none;
|
|
324
|
+
display: flex;
|
|
325
|
+
align-items: center;
|
|
326
|
+
justify-content: flex-end;
|
|
327
|
+
gap: var(--xh-dialog-footer-gap, var(--xh-control-gap-md));
|
|
328
|
+
padding-block-start: var(--xh-dialog-footer-pt, var(--xh-space-2));
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.xh-scope-dialog[data-part='content']:has(.xh-scope-dialog[data-part='footer'])
|
|
332
|
+
.xh-scope-dialog[data-part='footer'] {
|
|
333
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-dialog-separator, var(--xh-material-elevated-separator));
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* 三段结构的尾:纵 16 横 20,上沿的分隔线随尾段铺满面板宽 */
|
|
337
|
+
.xh-scope-dialog[data-part='content']:has(.xh-scope-dialog[data-part='body'])
|
|
338
|
+
.xh-scope-dialog[data-part='footer'] {
|
|
339
|
+
padding-block: var(--xh-dialog-footer-py, var(--xh-overlay-sheet-footer-py));
|
|
340
|
+
padding-inline: var(--xh-dialog-footer-px, var(--xh-overlay-sheet-px));
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/* 声明过 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
|
|
344
|
+
.xh-scope-dialog[data-part='header'][hidden],
|
|
345
|
+
.xh-scope-dialog[data-part='body'][hidden],
|
|
346
|
+
.xh-scope-dialog[data-part='footer'][hidden] {
|
|
347
|
+
display: none;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* 面板标题:页面级面板标题档、正文色;行高钉在 normal,头部带按它算标题行居中 */
|
|
351
|
+
.xh-scope-dialog[data-part='title'] {
|
|
352
|
+
margin: 0;
|
|
353
|
+
font-size: var(--xh-dialog-title-font-size, var(--xh-text-heading-3-size));
|
|
354
|
+
font-weight: var(--xh-dialog-title-font-weight, var(--xh-text-heading-3-weight));
|
|
355
|
+
line-height: var(--xh-leading-normal);
|
|
356
|
+
color: var(--xh-dialog-title-fg, var(--xh-fg-default));
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* 说明文字走说明档:13px + fg-muted */
|
|
360
|
+
.xh-scope-dialog[data-part='description'] {
|
|
361
|
+
margin: 0;
|
|
362
|
+
font-size: var(--xh-dialog-description-font-size, var(--xh-text-secondary-size));
|
|
363
|
+
color: var(--xh-dialog-description-fg, var(--xh-fg-muted));
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/* 关闭按钮是绝对定位的,不占流内宽度:标题得自己让出右上角那块,
|
|
367
|
+
否则长标题会直接钻到按钮底下。只在真有关闭按钮时让位。 */
|
|
368
|
+
.xh-scope-dialog[data-part='content']:has(.xh-scope-dialog[data-part='close-trigger'])
|
|
369
|
+
.xh-scope-dialog[data-part='title'] {
|
|
370
|
+
padding-inline-end: calc(var(--xh-dialog-close-size, var(--xh-control-h-sm)) + var(--xh-space-4));
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/*
|
|
374
|
+
* 关闭钮是面板角落的单图标钮:正方盒、sm 档几何、ghost 四态面、按压换底与粗指针命中区
|
|
375
|
+
* 由家族配方给出——白面上走画布承载阶梯悬停 --xh-bg-subtle(100)→ 按下 --xh-bg-subtle-hover(200),
|
|
376
|
+
* 焦点面透明吃库环。这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与摆放,
|
|
377
|
+
* 聚焦档的 -bg-focus / -fg-focus 两槽同样桥到配方的 focus-visible 面,缺省仍是透明底与悬停字色;
|
|
378
|
+
* 静息前景取 muted 字色,悬停 / 按下回到 fg-default。
|
|
379
|
+
* 叉取 12px(--xh-glyph-size-xs),比钮的随档字形低一档;钮距右 16px,竖向落在头部带的中线上。
|
|
380
|
+
*/
|
|
381
|
+
.xh-scope-dialog[data-part='close-trigger'] {
|
|
382
|
+
--xh-action-visual-size: var(--xh-dialog-close-size, var(--xh-_action-profile-visual-size));
|
|
383
|
+
--xh-action-radius: var(--xh-dialog-close-radius, var(--xh-shape-control));
|
|
384
|
+
--xh-action-bg-hover: var(--xh-dialog-close-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
385
|
+
--xh-action-bg-pressed: var(--xh-dialog-close-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
386
|
+
--xh-action-bg-focus-visible: var(--xh-dialog-close-bg-focus, var(--xh-_action-variant-bg-focus-visible));
|
|
387
|
+
--xh-action-fg-rest: var(--xh-dialog-close-fg, var(--xh-fg-muted));
|
|
388
|
+
--xh-action-fg-hover: var(--xh-dialog-close-fg-hover, var(--xh-_action-variant-fg-hover));
|
|
389
|
+
--xh-action-fg-pressed: var(--xh-dialog-close-fg-hover, var(--xh-_action-variant-fg-pressed));
|
|
390
|
+
--xh-action-fg-focus-visible: var(--xh-dialog-close-fg-focus, var(--xh-dialog-close-fg-hover, var(--xh-_action-variant-fg-focus-visible)));
|
|
391
|
+
/* 作者塞进按钮的图标与皮肤画的兜底叉同一把尺 */
|
|
392
|
+
--xh-icon-size: var(--xh-dialog-icon-size, var(--xh-glyph-size-xs));
|
|
393
|
+
|
|
394
|
+
position: absolute;
|
|
395
|
+
/* 钮的视觉盒在头部带里竖向居中:按钮自己的边长从带高里扣掉再对半 */
|
|
396
|
+
inset-block-start: calc(var(--xh-_dialog-header-top) + (var(--xh-_dialog-header-h) - var(--xh-dialog-close-size, var(--xh-_action-profile-visual-size))) / 2);
|
|
397
|
+
inset-inline-end: calc(var(--xh-_dialog-safe-inline) + var(--xh-space-4));
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
.xh-scope-dialog[data-part='close-trigger'][hidden] {
|
|
401
|
+
display: none;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
405
|
+
.xh-scope-dialog[data-part='close-trigger']:empty::before {
|
|
406
|
+
content: '';
|
|
407
|
+
display: inline-block;
|
|
408
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
409
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
410
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
411
|
+
background-color: currentColor;
|
|
412
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
413
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
417
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
418
|
+
.xh-scope-dialog[data-part='positioner'][hidden],
|
|
419
|
+
.xh-scope-dialog[data-part='indicator'][hidden] {
|
|
420
|
+
display: none;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/* 光学效果只在常规档存在:高对比、显式/系统减少透明度与强制色均把 blur 的遮罩原位实体化。 */
|
|
424
|
+
:where([data-contrast='more']) .xh-scope-dialog[data-part='backdrop'][data-variant='blur'],
|
|
425
|
+
:where([data-transparency='reduce']) .xh-scope-dialog[data-part='backdrop'][data-variant='blur'] {
|
|
426
|
+
-webkit-backdrop-filter: none;
|
|
427
|
+
backdrop-filter: none;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
@media (prefers-contrast: more), (prefers-reduced-transparency: reduce), (forced-colors: active) {
|
|
431
|
+
.xh-scope-dialog[data-part='backdrop'][data-variant='blur'] {
|
|
432
|
+
-webkit-backdrop-filter: none;
|
|
433
|
+
backdrop-filter: none;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
@media print {
|
|
438
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
439
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
440
|
+
.xh-scope-dialog[data-part='backdrop'],
|
|
441
|
+
.xh-scope-dialog[data-part='positioner'] {
|
|
442
|
+
display: none;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
@media (forced-colors: active) {
|
|
447
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
448
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
449
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
450
|
+
落在 Canvas 面上的取 CanvasText;
|
|
451
|
+
禁用取 GrayText */
|
|
452
|
+
.xh-scope-dialog[data-part='indicator']:empty::before {
|
|
453
|
+
forced-color-adjust: none;
|
|
454
|
+
background-color: CanvasText;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.xh-scope-dialog[data-part='close-trigger']:empty::before {
|
|
458
|
+
forced-color-adjust: none;
|
|
459
|
+
background-color: ButtonText;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
.xh-scope-dialog[data-part='close-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
463
|
+
background-color: HighlightText;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.xh-scope-dialog[data-part='close-trigger'][data-disabled]:empty::before {
|
|
467
|
+
background-color: GrayText;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|