@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,191 @@
|
|
|
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
|
+
/* PinInput 独立皮肤传递引入字段视觉盒:每一格 input 自身就是 Field Chrome 的 chrome 节点;full bundle 递归去重。 */
|
|
7
|
+
@import '../family/field-chrome.css';
|
|
8
|
+
|
|
9
|
+
@layer xihan.components {
|
|
10
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
11
|
+
.xh-scope-pin-input {
|
|
12
|
+
--xh-pin-input-skin: 1;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* 与文本框、数字框同一套堆叠:标签一行、格子一行。
|
|
16
|
+
格子的描边、底、圆角、五态与悬停由 Field Chrome 家族按格子上的 data-variant 生成,皮肤不再声明形态三档 */
|
|
17
|
+
.xh-scope-pin-input[data-part='root'] {
|
|
18
|
+
/* 尺寸档只换这两个私有槽,格子与分隔都从 root 继承它们,换档不必给每个部件各写一条选择器。
|
|
19
|
+
格子边长取控件高档,与同一行里的字段等高;字号取控件字号档;格间距三档同为 --xh-space-1 */
|
|
20
|
+
--xh-_pin-input-box-size: var(--xh-control-h-md);
|
|
21
|
+
--xh-_pin-input-box-gap: var(--xh-space-1);
|
|
22
|
+
--xh-_pin-input-box-font-size: var(--xh-control-font-md);
|
|
23
|
+
/* 填满态的强调色随语气走。没写 data-tone 时 --xh-_tone 没被声明,退回品牌色 */
|
|
24
|
+
--xh-_pin-input-accent: var(--xh-_tone, var(--xh-bg-brand));
|
|
25
|
+
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
gap: var(--xh-pin-input-gap, var(--xh-space-1));
|
|
29
|
+
/* 每格都有定宽,一行格子的最小宽度就是这些定宽之和,收缩到边框盒之内不再有余地:
|
|
30
|
+
不封顶的话整块控件按这个和撑开,比容器宽多少就顶出多少。
|
|
31
|
+
封到容器那么宽,格子那条收缩才有得可收 */
|
|
32
|
+
max-inline-size: 100%;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
|
|
36
|
+
.xh-scope-pin-input[data-part='root'][hidden] {
|
|
37
|
+
display: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* —— 尺寸 —— */
|
|
41
|
+
.xh-scope-pin-input[data-part='root'][data-size='sm'] {
|
|
42
|
+
--xh-_pin-input-box-size: var(--xh-control-h-sm);
|
|
43
|
+
--xh-_pin-input-box-font-size: var(--xh-control-font-sm);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.xh-scope-pin-input[data-part='root'][data-size='lg'] {
|
|
47
|
+
--xh-_pin-input-box-size: var(--xh-control-h-lg);
|
|
48
|
+
--xh-_pin-input-box-font-size: var(--xh-control-font-lg);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.xh-scope-pin-input[data-part='label'] {
|
|
52
|
+
/* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-pin-input-label-gap 给多少最终就是多少 */
|
|
53
|
+
margin-block-end: calc(var(--xh-pin-input-label-gap, var(--xh-space-2)) - var(--xh-pin-input-gap, var(--xh-space-1)));
|
|
54
|
+
color: var(--xh-pin-input-label-fg, var(--xh-fg-muted));
|
|
55
|
+
font-size: var(--xh-pin-input-label-font-size, var(--xh-text-label-size));
|
|
56
|
+
font-weight: var(--xh-pin-input-label-font-weight, var(--xh-text-label-weight));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.xh-scope-pin-input[data-part='label'][data-disabled] {
|
|
60
|
+
color: var(--xh-pin-input-label-fg-disabled, var(--xh-fg-muted));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* 分段:连着的几格圈成一段。它只排版,格间距仍由格子自己的相邻兄弟规则给 */
|
|
64
|
+
.xh-scope-pin-input[data-part='group'] {
|
|
65
|
+
display: inline-flex;
|
|
66
|
+
align-items: center;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.xh-scope-pin-input[data-part='group'][hidden] {
|
|
70
|
+
display: none;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* 段间分隔:两段之间的一道短横或圆点,两侧各留一格间距 */
|
|
74
|
+
.xh-scope-pin-input[data-part='separator'] {
|
|
75
|
+
display: inline-flex;
|
|
76
|
+
flex: none;
|
|
77
|
+
align-items: center;
|
|
78
|
+
justify-content: center;
|
|
79
|
+
margin-inline: var(--xh-pin-input-separator-gap, var(--xh-_pin-input-box-gap));
|
|
80
|
+
color: var(--xh-pin-input-separator-fg, var(--xh-fg-muted));
|
|
81
|
+
font-size: var(--xh-pin-input-separator-font-size, var(--xh-_pin-input-box-font-size));
|
|
82
|
+
line-height: var(--xh-leading-none);
|
|
83
|
+
user-select: none;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.xh-scope-pin-input[data-part='separator'][hidden] {
|
|
87
|
+
display: none;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.xh-scope-pin-input[data-part='separator'][data-disabled] {
|
|
91
|
+
color: var(--xh-pin-input-separator-fg-disabled, var(--xh-fg-disabled));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* 每格是等宽方框:它自身就是 Field Chrome 的 chrome 节点,宽高同取一个尺寸,内边距归零。
|
|
95
|
+
留了内边距,单字符居中后可用宽度不足,中文与全角字符会被挤出框外。
|
|
96
|
+
组件层只把既有公开槽映射到家族合同;不投影 data-xh-field-input,否则家族会把格子的边框重置掉 */
|
|
97
|
+
.xh-scope-pin-input[data-part='input'] {
|
|
98
|
+
--xh-field-control-height: var(--xh-pin-input-box-size, var(--xh-_pin-input-box-size));
|
|
99
|
+
--xh-field-control-padding-inline: 0;
|
|
100
|
+
--xh-field-control-gap: 0;
|
|
101
|
+
--xh-field-control-min-inline-size: 0;
|
|
102
|
+
--xh-field-control-radius: var(--xh-pin-input-box-radius, var(--xh-shape-control));
|
|
103
|
+
--xh-field-bg-rest: var(--xh-pin-input-box-bg, var(--xh-_field-variant-bg-rest));
|
|
104
|
+
--xh-field-bg-hover: var(--xh-pin-input-box-bg-hover, var(--xh-_field-variant-bg-hover));
|
|
105
|
+
--xh-field-bg-read-only: var(--xh-pin-input-box-bg-readonly, var(--xh-_field-variant-bg-read-only));
|
|
106
|
+
--xh-field-bg-disabled: var(--xh-pin-input-box-bg-disabled, var(--xh-_field-variant-bg-disabled));
|
|
107
|
+
--xh-field-fg-rest: var(--xh-pin-input-box-fg, var(--xh-fg-default));
|
|
108
|
+
--xh-field-border-rest: var(--xh-pin-input-box-border, var(--xh-_field-variant-border-rest));
|
|
109
|
+
--xh-field-border-hover: var(--xh-pin-input-box-border-hover, var(--xh-_field-variant-border-hover));
|
|
110
|
+
--xh-field-border-focus: var(--xh-pin-input-box-border-focus, var(--xh-_field-variant-border-focus));
|
|
111
|
+
--xh-field-border-invalid: var(--xh-pin-input-box-border-invalid, var(--xh-_field-variant-border-invalid));
|
|
112
|
+
--xh-field-shadow-rest: var(--xh-pin-input-box-shadow, none);
|
|
113
|
+
|
|
114
|
+
/* 一行放不下时逐格收窄,收不动就整行顶出屏幕。
|
|
115
|
+
min-inline-size 归零解开表单控件那份按字符数算出来的自动最小宽度。
|
|
116
|
+
高度不跟着收:它取自控件高度尺,与同一行里别的控件对齐靠的就是这个数。
|
|
117
|
+
宽度放得下时收窄量为零,格子仍是尺寸档给的那个正方形。 */
|
|
118
|
+
flex: 0 1 auto;
|
|
119
|
+
min-inline-size: 0;
|
|
120
|
+
inline-size: var(--xh-pin-input-box-size, var(--xh-_pin-input-box-size));
|
|
121
|
+
padding: 0;
|
|
122
|
+
/* 表单控件不继承页面字体,只给字号会让格子用 UA 默认字族 */
|
|
123
|
+
font-family: inherit;
|
|
124
|
+
font-size: var(--xh-pin-input-box-font-size, var(--xh-_pin-input-box-font-size));
|
|
125
|
+
/* 等宽数字:各位字宽不一时逐格填入会让每格里的字符左右跳 */
|
|
126
|
+
font-variant-numeric: tabular-nums;
|
|
127
|
+
line-height: var(--xh-leading-none);
|
|
128
|
+
text-align: center;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* 格间距只能长在格子自己身上:包住这一行的容器是作者写的,不在角色表里,
|
|
132
|
+
指望它给 gap 就等于把间距交给了皮肤管不着的地方。
|
|
133
|
+
用相邻兄弟而不是给每格加外边距,是为了不在首尾多出两段空白 */
|
|
134
|
+
.xh-scope-pin-input[data-part='input'] + .xh-scope-pin-input[data-part='input'] {
|
|
135
|
+
margin-inline-start: var(--xh-pin-input-box-gap, var(--xh-_pin-input-box-gap));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.xh-scope-pin-input[data-part='input']::placeholder {
|
|
139
|
+
color: var(--xh-pin-input-placeholder-fg, var(--xh-fg-subtle));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* 一行格子长得一模一样,光标那道竖线太细,看不出正在填哪一格:当前格与字段外壳的聚焦态同一副面——
|
|
143
|
+
换承载面 + 聚焦描边,压在别的格子的字段淡底之间一眼分得出,不另画环(强制色档由家族补系统色环)。
|
|
144
|
+
data-focus 由机器给(它知道谁是当前格),家族的 :focus-within 兜住机器状态还没回流的那一帧,
|
|
145
|
+
两条同时写不冲突。焦点边一律家族的 --xh-border-control-focus,不随 tone */
|
|
146
|
+
.xh-scope-pin-input[data-part='input'][data-focus] {
|
|
147
|
+
border-color: var(--xh-pin-input-box-border-focus, var(--xh-_field-variant-border-focus));
|
|
148
|
+
background-color: var(--xh-_field-variant-bg-focus);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* 填满只代表"格子都有字",不代表"验证码对",所以用品牌色而不是成功色收个尾。
|
|
152
|
+
已经标了 invalid 的不在此列——那是明确说了不对 */
|
|
153
|
+
.xh-scope-pin-input[data-part='root'][data-complete]
|
|
154
|
+
.xh-scope-pin-input[data-part='input']:not([data-invalid], :disabled) {
|
|
155
|
+
border-color: var(--xh-pin-input-box-border-complete, var(--xh-_pin-input-accent));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* 自动填充:一次性验证码由平台直接灌进这一行格子,引擎顺手给每格强加一套系统色
|
|
159
|
+
(多数是黄底黑字),盖得过 background 与 color,深色档下就剩一行不跟主题走的黄方块。
|
|
160
|
+
格子没投影 data-xh-field-input,家族那两条 autofill 命不中,这里自写一份:
|
|
161
|
+
底改用 inset 阴影铺回来,扩散量 100vmax 填满内容盒;字改用 -webkit-text-fill-color
|
|
162
|
+
接回来,那是这个态下唯一还听样式表的前景通道。
|
|
163
|
+
不去拉长 transition 把系统底推迟显现:那只是把它藏起来,减弱动效通道一关过渡就当场露出。
|
|
164
|
+
两个选择器名分写两条:一条选择器列表里只要有一个名字不被认识,整条规则就被丢弃。
|
|
165
|
+
底取一支不透明的面令牌而不是家族的形态底:后者在 ghost 档下是透明的,铺一层透明等于没铺。 */
|
|
166
|
+
.xh-scope-pin-input[data-part='input']:autofill {
|
|
167
|
+
box-shadow: inset 0 0 0 100vmax var(--xh-pin-input-box-autofill-bg, var(--xh-bg-canvas));
|
|
168
|
+
-webkit-text-fill-color: var(--xh-pin-input-box-autofill-fg, var(--xh-fg-default));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.xh-scope-pin-input[data-part='input']:-webkit-autofill {
|
|
172
|
+
box-shadow: inset 0 0 0 100vmax var(--xh-pin-input-box-autofill-bg, var(--xh-bg-canvas));
|
|
173
|
+
-webkit-text-fill-color: var(--xh-pin-input-box-autofill-fg, var(--xh-fg-default));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* 连接层把它写成 type=hidden,UA 自己就不渲染;这里的视觉隐藏是给元素升级前那一瞬兜底
|
|
177
|
+
(作者手写的是一个普通 input,升级完成前它是可见的文本框)。
|
|
178
|
+
刻意不写 display:写了反而会盖掉 UA 对 type=hidden 的收起,把它显出来 */
|
|
179
|
+
.xh-scope-pin-input[data-part='hidden-input'] {
|
|
180
|
+
position: absolute;
|
|
181
|
+
inline-size: 1px;
|
|
182
|
+
block-size: 1px;
|
|
183
|
+
padding: 0;
|
|
184
|
+
margin: -1px;
|
|
185
|
+
border: 0;
|
|
186
|
+
overflow: hidden;
|
|
187
|
+
clip-path: inset(50%);
|
|
188
|
+
white-space: nowrap;
|
|
189
|
+
pointer-events: none;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
/*
|
|
7
|
+
* 指针反馈的公共层:全库共用一份。
|
|
8
|
+
*
|
|
9
|
+
* 两件事写在这里。
|
|
10
|
+
*
|
|
11
|
+
* 一、触摸点按时浏览器画的那层高亮方块。它是继承属性,一条规则打在 [data-scope] 上就覆盖
|
|
12
|
+
* 库里的每一个节点与它们的后代,不必逐个组件登记。
|
|
13
|
+
*
|
|
14
|
+
* 二、禁用态的光标。「这个控件不可用」在库里有三种条件拼写:解剖打出来的 data-disabled、
|
|
15
|
+
* 原生表单控件的 :disabled、集合条目用的 aria-disabled——三者说的是同一件事,光标也是同一个。
|
|
16
|
+
* 选择器停在两个属性加一个条件(0,3,0):与组件皮肤里
|
|
17
|
+
* [data-scope='x'][data-part='y'][data-disabled] 同级,本份排在全部组件皮肤之前,
|
|
18
|
+
* 要另画的组件照写即可压过。
|
|
19
|
+
*
|
|
20
|
+
* 「在途」不在这里:它是另一件事,光标是 progress,挂在哪个部件上逐个组件不同,
|
|
21
|
+
* 写成通配会盖到作者自己的内容上(列表外壳、快捷键展示、可调容器都带 data-loading / data-disabled,
|
|
22
|
+
* 而它们身上的这两个标记说的是「这项行为关掉了」,不是「这个控件不可用」)。
|
|
23
|
+
*
|
|
24
|
+
* 排在全部组件皮肤之前:组件不必为了换一个光标把整条规则重写一遍。
|
|
25
|
+
*/
|
|
26
|
+
@layer xihan.components {
|
|
27
|
+
[data-scope] {
|
|
28
|
+
-webkit-tap-highlight-color: transparent;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
[data-scope][data-part][data-disabled],
|
|
32
|
+
[data-scope][data-part]:disabled,
|
|
33
|
+
[data-scope][data-part][aria-disabled='true'] {
|
|
34
|
+
cursor: not-allowed;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,329 @@
|
|
|
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
|
+
/* 定义 popconfirm 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
10
|
+
@import '../family/action-control.css';
|
|
11
|
+
@import '../family/loading-ring.css';
|
|
12
|
+
@import '../family/material.css';
|
|
13
|
+
|
|
14
|
+
@layer xihan.components {
|
|
15
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
16
|
+
.xh-scope-popconfirm {
|
|
17
|
+
--xh-popconfirm-skin: 1;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* 根只框住触发器:浮层树靠 positioner 的固定定位飞出去,不占根的盒子 */
|
|
21
|
+
.xh-scope-popconfirm[data-part='root'] {
|
|
22
|
+
display: inline-block;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
* 触发器是页面上的独立文字按钮:盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
|
|
27
|
+
* 由家族配方按连接层投影的 data-xh-action-variant / -size 给出。皮肤没有自己的外观规则,
|
|
28
|
+
* 只把作者塞进按钮的图标接到随档字形尺(md = 20px)。
|
|
29
|
+
*/
|
|
30
|
+
.xh-scope-popconfirm[data-part='trigger'] {
|
|
31
|
+
--xh-icon-size: var(--xh-popconfirm-icon-size, var(--xh-_action-profile-glyph-size));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* 家族配方给了 display,作者手写 hidden 时得把 UA 的 [hidden]{display:none} 还回去 */
|
|
35
|
+
.xh-scope-popconfirm[data-part='trigger'][hidden] {
|
|
36
|
+
display: none;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
40
|
+
.xh-scope-popconfirm[data-part='positioner'] {
|
|
41
|
+
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,面板继承它限高;
|
|
42
|
+
引擎没算(尚未落位 / 无引擎 / 贴边归零)时不额外限高 */
|
|
43
|
+
--xh-_popconfirm-available-h: 100vh;
|
|
44
|
+
/* 落定那一侧的可用宽度,同一路由定位引擎写进来,行内轴据此夹取;
|
|
45
|
+
引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
|
|
46
|
+
--xh-_popconfirm-available-w: 100vw;
|
|
47
|
+
|
|
48
|
+
/* 面板内容的自绘条浮在内容之上:轨道不上底色,实色轨道会在面板右缘糊一条竖灰带 */
|
|
49
|
+
--xh-scrollbar-track-bg: transparent;
|
|
50
|
+
|
|
51
|
+
position: fixed;
|
|
52
|
+
z-index: var(--xh-popconfirm-layer, var(--xh-_layer, var(--xh-layer-popover)));
|
|
53
|
+
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
54
|
+
pointer-events: none;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
58
|
+
.xh-scope-popconfirm[data-part='positioner'][data-hidden] {
|
|
59
|
+
visibility: hidden;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* 缩放原点与进场位移按落定的那一侧给:面板从贴着锚点的那条边涨开、沿主轴退让一小段。
|
|
63
|
+
两个槽由 content 继承。placement 是物理方向(引擎按 top / right / bottom / left 出值),
|
|
64
|
+
origin 与 translate 也是物理量,两边同轴,不随书写方向翻 */
|
|
65
|
+
.xh-scope-popconfirm[data-part='positioner'][data-placement^='top'] {
|
|
66
|
+
--xh-_overlay-origin-y: 100%;
|
|
67
|
+
--xh-_overlay-enter-down: 1;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.xh-scope-popconfirm[data-part='positioner'][data-placement^='bottom'] {
|
|
71
|
+
--xh-_overlay-origin-y: 0;
|
|
72
|
+
--xh-_overlay-enter-up: 1;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.xh-scope-popconfirm[data-part='positioner'][data-placement^='left'] {
|
|
76
|
+
--xh-_overlay-origin-x: 100%;
|
|
77
|
+
--xh-_overlay-enter-right: 1;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.xh-scope-popconfirm[data-part='positioner'][data-placement^='right'] {
|
|
81
|
+
--xh-_overlay-origin-x: 0;
|
|
82
|
+
--xh-_overlay-enter-left: 1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* 交叉轴原点按对齐取:start / end 对齐时面板与锚点在那一端齐平,缩放从那一端涨开,贴着小触发器的面板
|
|
86
|
+
才像是从触发器里长出来;居中对齐留在中线。上下两侧的 start / end 是行内轴上的逻辑对齐,RTL 下起始缘在右;
|
|
87
|
+
左右两侧的 start / end 落在块轴上,不随书写方向翻 */
|
|
88
|
+
/* 起始缘与末尾缘按就近的书写方向取:LTR 起始在左,RTL 起始在右 */
|
|
89
|
+
.xh-scope-popconfirm[data-part='positioner']:is([data-placement='top-start'], [data-placement='bottom-start']) {
|
|
90
|
+
--xh-_overlay-origin-x: var(--xh-direction-start);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.xh-scope-popconfirm[data-part='positioner']:is([data-placement='top-end'], [data-placement='bottom-end']) {
|
|
94
|
+
--xh-_overlay-origin-x: var(--xh-direction-end);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.xh-scope-popconfirm[data-part='positioner']:is([data-placement='left-start'], [data-placement='right-start']) {
|
|
98
|
+
--xh-_overlay-origin-y: 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.xh-scope-popconfirm[data-part='positioner']:is([data-placement='left-end'], [data-placement='right-end']) {
|
|
102
|
+
--xh-_overlay-origin-y: 100%;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* 面板排成三列:左列吃掉剩余宽度,右两列各摆一颗按钮。
|
|
106
|
+
标题、说明与作者塞进来的内容各占一整行,两颗按钮因此并排落在最后一行的右侧。 */
|
|
107
|
+
.xh-scope-popconfirm[data-part='content'] {
|
|
108
|
+
/* 材质由家族配方画(family/material.css 的 frosted 面:描边、底、1px 顶光、前景、投影与背景滤镜),
|
|
109
|
+
这里只把使用者槽接进来 */
|
|
110
|
+
--xh-frosted-bg: var(--xh-popconfirm-bg, var(--xh-_material-bg));
|
|
111
|
+
--xh-frosted-border: var(--xh-popconfirm-border, var(--xh-_material-border));
|
|
112
|
+
--xh-frosted-fg: var(--xh-popconfirm-fg, var(--xh-_material-fg));
|
|
113
|
+
--xh-frosted-shadow: var(--xh-popconfirm-shadow, var(--xh-_material-shadow));
|
|
114
|
+
--xh-frosted-backdrop: var(--xh-popconfirm-backdrop, var(--xh-_material-backdrop));
|
|
115
|
+
|
|
116
|
+
/* 作者塞进面板里的图标按控件档取;两颗动作钮另由家族配方按 sm 档下发字形尺 */
|
|
117
|
+
--xh-icon-size: var(--xh-popconfirm-icon-size, var(--xh-glyph-size-md));
|
|
118
|
+
/* 尺寸档只换这三个私有槽:横向内衬比纵向高一档(缺省纵 12 横 16),与 popover 同一套 */
|
|
119
|
+
--xh-_popconfirm-py: var(--xh-surface-pad-md);
|
|
120
|
+
--xh-_popconfirm-px: var(--xh-surface-pad-lg);
|
|
121
|
+
--xh-_popconfirm-max-w: var(--xh-overlay-max-w);
|
|
122
|
+
|
|
123
|
+
position: relative;
|
|
124
|
+
display: grid;
|
|
125
|
+
grid-template-columns: 1fr auto auto;
|
|
126
|
+
align-items: center;
|
|
127
|
+
/* 行距与气泡族同一档:标题与说明之间只留 4px;两颗钮之间的列距另由 column-gap 放宽。
|
|
128
|
+
column-gap 写在 gap 之后,先回落到 gap 槽再取缺省:作者只写 --xh-popconfirm-gap 时行列一起跟着它走 */
|
|
129
|
+
gap: var(--xh-popconfirm-gap, var(--xh-space-1));
|
|
130
|
+
column-gap: var(--xh-popconfirm-column-gap, var(--xh-popconfirm-gap, var(--xh-space-2)));
|
|
131
|
+
inline-size: max-content;
|
|
132
|
+
/* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的两颗钮就点不到了 */
|
|
133
|
+
max-inline-size: min(var(--xh-popconfirm-max-w, var(--xh-_popconfirm-max-w)), var(--xh-_popconfirm-available-w));
|
|
134
|
+
/* 说明文案长度由作者给,矮视口下不限高面板会整块伸出视口且滚不到 */
|
|
135
|
+
max-block-size: min(var(--xh-popconfirm-max-h, var(--xh-overlay-max-h)), var(--xh-_popconfirm-available-h));
|
|
136
|
+
overflow-y: auto;
|
|
137
|
+
/* 浮在页面之上的 Overlay 滚动面:滚到头不把页面一起带走 */
|
|
138
|
+
overscroll-behavior: contain;
|
|
139
|
+
padding-block: var(--xh-popconfirm-py, var(--xh-_popconfirm-py));
|
|
140
|
+
padding-inline: var(--xh-popconfirm-px, var(--xh-_popconfirm-px));
|
|
141
|
+
border-radius: var(--xh-popconfirm-radius, var(--xh-shape-overlay));
|
|
142
|
+
pointer-events: auto;
|
|
143
|
+
/* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
|
|
144
|
+
transform-origin: var(--xh-_overlay-origin-x, 50%) var(--xh-_overlay-origin-y, 50%);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.xh-scope-popconfirm[data-part='content'] > * {
|
|
148
|
+
grid-column: 1 / -1;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* 箭头绝对定位挂在 content 上,不占格:吃到栅格位的话它的贴边就从格线起算,被内衬推进面里 */
|
|
152
|
+
.xh-scope-popconfirm[data-part='content'] > [data-part='arrow']:where(.xh-scope-popconfirm) {
|
|
153
|
+
grid-column: auto;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
157
|
+
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
158
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
159
|
+
真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
|
|
160
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
161
|
+
|
|
162
|
+
.xh-scope-popconfirm[data-part='content']:focus-visible {
|
|
163
|
+
outline: none;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
167
|
+
.xh-scope-popconfirm[data-part='content'][data-state='open']:not([data-instant]) {
|
|
168
|
+
animation: xh-overlay-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
172
|
+
免得动画结束到真收起之间闪一下原样 */
|
|
173
|
+
.xh-scope-popconfirm[data-part='content'][data-state='closed'] {
|
|
174
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* —— 尺寸 —— */
|
|
178
|
+
/* 缺省档写在 content 的基础规则里;内衬三档取 surface-pad 那把尺,横向始终比纵向高一档 */
|
|
179
|
+
.xh-scope-popconfirm[data-part='content'][data-size='sm'] {
|
|
180
|
+
--xh-_popconfirm-py: var(--xh-surface-pad-sm);
|
|
181
|
+
--xh-_popconfirm-px: var(--xh-surface-pad-md);
|
|
182
|
+
--xh-_popconfirm-max-w: var(--xh-overlay-max-w-sm);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.xh-scope-popconfirm[data-part='content'][data-size='lg'] {
|
|
186
|
+
--xh-_popconfirm-py: var(--xh-surface-pad-lg);
|
|
187
|
+
--xh-_popconfirm-px: var(--xh-surface-pad-xl);
|
|
188
|
+
--xh-_popconfirm-max-w: var(--xh-overlay-max-w-lg);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* 气泡标题:14px / medium / 正文色 */
|
|
192
|
+
.xh-scope-popconfirm[data-part='title'] {
|
|
193
|
+
margin: 0;
|
|
194
|
+
min-inline-size: 0;
|
|
195
|
+
font-size: var(--xh-popconfirm-title-font-size, var(--xh-text-label-size));
|
|
196
|
+
font-weight: var(--xh-popconfirm-title-font-weight, var(--xh-font-weight-medium));
|
|
197
|
+
line-height: var(--xh-leading-tight);
|
|
198
|
+
overflow-wrap: anywhere;
|
|
199
|
+
color: var(--xh-popconfirm-title-fg, var(--xh-material-frosted-fg));
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* 说明就是气泡的正文:14px 正文字号 + fg-muted 次级色 */
|
|
203
|
+
.xh-scope-popconfirm[data-part='description'] {
|
|
204
|
+
margin: 0;
|
|
205
|
+
min-inline-size: 0;
|
|
206
|
+
font-size: var(--xh-popconfirm-description-font-size, var(--xh-text-body-size));
|
|
207
|
+
line-height: var(--xh-leading-normal);
|
|
208
|
+
overflow-wrap: anywhere;
|
|
209
|
+
color: var(--xh-popconfirm-description-fg, var(--xh-fg-muted));
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* 箭头的底色与描边色,几何在 overlay-arrow.css。
|
|
213
|
+
交叉轴落点由定位引擎经内联自定义属性写进来,没给时退回居中 */
|
|
214
|
+
.xh-scope-popconfirm[data-part='arrow'] {
|
|
215
|
+
--xh-_popconfirm-arrow-x: 50%;
|
|
216
|
+
--xh-_popconfirm-arrow-y: 50%;
|
|
217
|
+
--xh-_overlay-arrow-size: var(--xh-popconfirm-arrow-size, var(--xh-overlay-arrow-size));
|
|
218
|
+
--xh-_overlay-arrow-x: var(--xh-_popconfirm-arrow-x);
|
|
219
|
+
--xh-_overlay-arrow-y: var(--xh-_popconfirm-arrow-y);
|
|
220
|
+
|
|
221
|
+
background: var(--xh-popconfirm-bg, var(--xh-material-frosted-bg));
|
|
222
|
+
border: var(--xh-stroke-thin) solid var(--xh-popconfirm-border, var(--xh-material-frosted-border));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/*
|
|
226
|
+
* —— 两颗按钮 ——
|
|
227
|
+
* 确认与取消都是浮层末行的文字按钮:盒型、sm 档几何、四态面、0.97 按压并换底、粗指针命中区与
|
|
228
|
+
* 强制色由家族配方按连接层投影的 data-xh-action-variant / -size 给出。这里只把公开槽桥接到矩阵之前
|
|
229
|
+
* (使用者槽 → 形态矩阵 → 家族缺省)与几何映射;内衬与圆角槽取两颗共用的 action 段。
|
|
230
|
+
*/
|
|
231
|
+
.xh-scope-popconfirm[data-part='confirm-trigger'],
|
|
232
|
+
.xh-scope-popconfirm[data-part='cancel-trigger'] {
|
|
233
|
+
--xh-action-padding-inline: var(--xh-popconfirm-action-px, var(--xh-_action-profile-padding-inline));
|
|
234
|
+
--xh-action-radius: var(--xh-popconfirm-action-radius, var(--xh-shape-control));
|
|
235
|
+
--xh-action-shadow-rest: var(--xh-popconfirm-action-shadow, none);
|
|
236
|
+
/* 作者塞进按钮的图标随档取字形尺(sm = 16px) */
|
|
237
|
+
--xh-icon-size: var(--xh-popconfirm-icon-size, var(--xh-_action-profile-glyph-size));
|
|
238
|
+
|
|
239
|
+
/* 动作钮的文字与 Button 同一字重(家族配方不管字重) */
|
|
240
|
+
font-weight: var(--xh-popconfirm-action-font-weight, var(--xh-text-label-weight));
|
|
241
|
+
/* 末行与上面的文字隔开:栅格行距只有标题与说明之间那 4px,钮再往下让 12px,文字与钮之间共 16px */
|
|
242
|
+
margin-block-start: var(--xh-popconfirm-action-mt, var(--xh-space-3));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* 并排落在最后一行的右侧两格;取消在左、确认在右 */
|
|
246
|
+
.xh-scope-popconfirm[data-part='content'] > [data-part='cancel-trigger']:where(.xh-scope-popconfirm) {
|
|
247
|
+
grid-column: 2;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.xh-scope-popconfirm[data-part='content'] > [data-part='confirm-trigger']:where(.xh-scope-popconfirm) {
|
|
251
|
+
grid-column: 3;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/* 确认是实心的主操作。底色走共享语气槽:作者在 content 上写 data-tone="danger"
|
|
255
|
+
就整体换成危险色,不写则用品牌色——配方 solid 列本就读 --xh-_tone,这里只桥接使用者槽 */
|
|
256
|
+
.xh-scope-popconfirm[data-part='confirm-trigger'] {
|
|
257
|
+
--xh-action-bg-rest: var(--xh-popconfirm-confirm-bg, var(--xh-_action-variant-bg-rest));
|
|
258
|
+
--xh-action-bg-focus-visible: var(--xh-popconfirm-confirm-bg, var(--xh-_action-variant-bg-focus-visible));
|
|
259
|
+
--xh-action-bg-loading: var(--xh-popconfirm-confirm-bg, var(--xh-_action-variant-bg-loading));
|
|
260
|
+
--xh-action-fg-rest: var(--xh-popconfirm-confirm-fg, var(--xh-_action-variant-fg-rest));
|
|
261
|
+
--xh-action-fg-hover: var(--xh-popconfirm-confirm-fg, var(--xh-_action-variant-fg-hover));
|
|
262
|
+
--xh-action-fg-pressed: var(--xh-popconfirm-confirm-fg, var(--xh-_action-variant-fg-pressed));
|
|
263
|
+
--xh-action-fg-focus-visible: var(--xh-popconfirm-confirm-fg, var(--xh-_action-variant-fg-focus-visible));
|
|
264
|
+
--xh-action-fg-loading: var(--xh-popconfirm-confirm-fg, var(--xh-_action-variant-fg-loading));
|
|
265
|
+
--xh-action-shadow-rest: var(--xh-popconfirm-confirm-shadow, var(--xh-popconfirm-action-shadow, none));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
|
|
269
|
+
那一族色本来就要在这块面上把字读清楚,与面的对比是按可读性定的 */
|
|
270
|
+
.xh-scope-popconfirm[data-part='confirm-trigger'][data-xh-action-variant='solid']:focus-visible {
|
|
271
|
+
--xh-action-ring-color-focus-visible: currentColor;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/* 异步确认挂起:环由加载环配方压在确认钮正中(连接层投影 data-xh-loading-ring="overlay"),直径取钮的图标档,
|
|
275
|
+
起始边取钮的真实前景、转速认使用者槽。不是禁用,焦点与对比度都保持,在途指针由家族 loading 面给。
|
|
276
|
+
确认文案随前景淡到透明留位:进入挂起等一个 micro 才起淡(快速落定什么都不闪),落定时不等、按 micro 淡回 */
|
|
277
|
+
.xh-scope-popconfirm[data-part='confirm-trigger'] {
|
|
278
|
+
--xh-_loading-ring-fg: var(--xh-popconfirm-confirm-fg, var(--xh-_action-variant-fg-loading));
|
|
279
|
+
--xh-_loading-ring-duration: var(--xh-popconfirm-loading-duration, var(--xh-motion-loop-spin));
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.xh-scope-popconfirm[data-part='confirm-trigger'][data-loading] {
|
|
283
|
+
--xh-action-fg-loading: transparent;
|
|
284
|
+
|
|
285
|
+
transition-delay: var(--xh-motion-duration-micro);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/* 取消是中性的次要出口,不参与语气:content 上的 data-tone 会把 --xh-_tone-* 一路继承下来,
|
|
289
|
+
配方 outline 列的面、字与边都先读它,这里逐档钉回中性令牌——白底 / 磨砂面上走画布承载阶梯
|
|
290
|
+
悬停 --xh-bg-subtle(100)→ 按下 --xh-bg-subtle-hover(200);聚焦档 -bg-focus / -fg-focus 两槽
|
|
291
|
+
桥到配方的 focus-visible 面,缺省透明底 + 静息字色吃库环 */
|
|
292
|
+
.xh-scope-popconfirm[data-part='cancel-trigger'] {
|
|
293
|
+
--xh-action-bg-rest: var(--xh-popconfirm-cancel-bg, transparent);
|
|
294
|
+
--xh-action-bg-hover: var(--xh-popconfirm-cancel-bg-hover, var(--xh-bg-subtle));
|
|
295
|
+
--xh-action-bg-pressed: var(--xh-popconfirm-cancel-bg-active, var(--xh-bg-subtle-hover));
|
|
296
|
+
--xh-action-bg-focus-visible: var(--xh-popconfirm-cancel-bg-focus, var(--xh-popconfirm-cancel-bg, transparent));
|
|
297
|
+
--xh-action-fg-rest: var(--xh-popconfirm-cancel-fg, var(--xh-fg-default));
|
|
298
|
+
--xh-action-fg-hover: var(--xh-popconfirm-cancel-fg, var(--xh-fg-default));
|
|
299
|
+
--xh-action-fg-pressed: var(--xh-popconfirm-cancel-fg, var(--xh-fg-default));
|
|
300
|
+
--xh-action-fg-focus-visible: var(--xh-popconfirm-cancel-fg-focus, var(--xh-popconfirm-cancel-fg, var(--xh-fg-default)));
|
|
301
|
+
--xh-action-border-rest: var(--xh-popconfirm-cancel-border, var(--xh-border-control));
|
|
302
|
+
--xh-action-border-hover: var(--xh-popconfirm-cancel-border-hover, var(--xh-border-control-hover));
|
|
303
|
+
--xh-action-border-pressed: var(--xh-popconfirm-cancel-border-hover, var(--xh-border-control-hover));
|
|
304
|
+
--xh-action-border-focus-visible: var(--xh-popconfirm-cancel-border, var(--xh-border-control));
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
@media (forced-colors: active) {
|
|
308
|
+
/* 系统色接管内容边界;装饰顶光在这一档没有额外信息。两颗按钮的强制色由家族配方给 */
|
|
309
|
+
.xh-scope-popconfirm[data-part='content'] {
|
|
310
|
+
background-image: none;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
315
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
316
|
+
.xh-scope-popconfirm[data-part='root'][hidden],
|
|
317
|
+
.xh-scope-popconfirm[data-part='confirm-trigger'][hidden],
|
|
318
|
+
.xh-scope-popconfirm[data-part='cancel-trigger'][hidden] {
|
|
319
|
+
display: none;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
@media print {
|
|
323
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
324
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
325
|
+
.xh-scope-popconfirm[data-part='positioner'] {
|
|
326
|
+
display: none;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|