@xihan-ui/styles 1.0.0-alpha.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2177 -0
- package/README.md +1 -1
- package/css/accordion.css +80 -6
- package/css/alert.css +43 -14
- package/css/anchor.css +8 -8
- package/css/avatar-group.css +7 -3
- package/css/avatar.css +9 -3
- package/css/back-top.css +22 -1
- package/css/badge.css +104 -32
- package/css/breadcrumb.css +25 -5
- package/css/button-group.css +18 -13
- package/css/button.css +48 -11
- package/css/calendar.css +150 -7
- package/css/card.css +20 -11
- package/css/carousel.css +36 -5
- package/css/cascader.css +211 -124
- package/css/checkbox-group.css +72 -22
- package/css/checkbox.css +70 -13
- package/css/clipboard.css +2 -1
- package/css/code-block.css +12 -7
- package/css/collapsible.css +49 -3
- package/css/color-picker.css +132 -46
- package/css/combobox.css +132 -60
- package/css/composer.css +5 -3
- package/css/context-menu.css +113 -74
- package/css/date-field.css +93 -16
- package/css/date-picker.css +293 -72
- package/css/descriptions.css +11 -5
- package/css/dialog.css +47 -14
- package/css/download-trigger.css +76 -0
- package/css/drawer.css +57 -16
- package/css/dynamic-input.css +75 -17
- package/css/editable.css +12 -10
- package/css/ellipsis.css +7 -1
- package/css/empty-state.css +22 -12
- package/css/field.css +16 -6
- package/css/fieldset.css +69 -0
- package/css/file-upload.css +46 -8
- package/css/flex.css +13 -7
- package/css/float-button.css +23 -1
- package/css/floating-panel.css +316 -0
- package/css/form.css +4 -4
- package/css/grid.css +11 -5
- package/css/heatmap.css +411 -0
- package/css/highlight.css +2 -2
- package/css/hotkeys.css +90 -0
- package/css/hover-card.css +43 -45
- package/css/image-cropper.css +233 -0
- package/css/image-viewer.css +155 -17
- package/css/image.css +2 -2
- package/css/infinite-scroll.css +1 -1
- package/css/json-viewer.css +274 -0
- package/css/layout.css +19 -15
- package/css/list.css +22 -13
- package/css/listbox.css +24 -6
- package/css/loading-bar.css +12 -5
- package/css/log.css +7 -3
- package/css/marquee.css +9 -0
- package/css/masonry.css +63 -0
- package/css/mention.css +100 -36
- package/css/menu.css +127 -50
- package/css/menubar.css +155 -61
- package/css/navigation-menu.css +56 -31
- package/css/notification.css +377 -0
- package/css/number-animation.css +3 -3
- package/css/number-field.css +182 -19
- package/css/overlay-arrow.css +51 -0
- package/css/page-header.css +12 -5
- package/css/pagination.css +171 -14
- package/css/password-input.css +356 -0
- package/css/pin-input.css +15 -12
- package/css/popconfirm.css +55 -12
- package/css/popover.css +73 -45
- package/css/popselect.css +207 -57
- package/css/progress.css +54 -8
- package/css/qr-code.css +1 -1
- package/css/radio-group.css +27 -10
- package/css/rating.css +4 -4
- package/css/reset.css +17 -0
- package/css/result.css +21 -11
- package/css/scroll-area.css +61 -89
- package/css/scrollbar.css +170 -0
- package/css/segmented.css +215 -0
- package/css/select.css +298 -131
- package/css/separator.css +2 -2
- package/css/side-nav.css +127 -24
- package/css/signature-pad.css +144 -0
- package/css/skeleton.css +7 -1
- package/css/slider.css +14 -12
- package/css/space.css +117 -0
- package/css/spinner.css +22 -10
- package/css/statistic.css +9 -9
- package/css/steps.css +29 -12
- package/css/switch.css +57 -8
- package/css/table.css +146 -44
- package/css/tabs.css +13 -5
- package/css/tag.css +179 -0
- package/css/tags-input.css +80 -42
- package/css/text-field.css +151 -38
- package/css/thread.css +11 -3
- package/css/time-field.css +99 -18
- package/css/time-picker.css +261 -71
- package/css/timeline.css +15 -15
- package/css/timer.css +119 -0
- package/css/toast.css +129 -55
- package/css/toggle-group.css +30 -4
- package/css/toggle.css +12 -6
- package/css/tone.css +57 -22
- package/css/toolbar.css +1 -1
- package/css/tooltip.css +40 -31
- package/css/tour.css +112 -61
- package/css/transfer.css +98 -21
- package/css/tree-select.css +215 -89
- package/css/tree.css +131 -5
- package/css/typography.css +5 -5
- package/css/undefined.css +12 -1
- package/css/virtualizer.css +3 -1
- package/css/watermark.css +1 -2
- package/index.css +18 -1
- package/index.unlayered.css +10356 -3255
- package/package.json +20 -4
- package/css/toaster.css +0 -74
package/css/empty-state.css
CHANGED
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
/* 三个尺寸档只换这几个私有槽,图标与标题都从 root 继承它们,
|
|
9
9
|
换档不必给每个部件各写一条选择器 */
|
|
10
10
|
--xh-_empty-state-gap: var(--xh-stack-gap-md);
|
|
11
|
-
--xh-_empty-state-py: var(--xh-section-py);
|
|
12
|
-
--xh-_empty-state-icon-size:
|
|
13
|
-
--xh-_empty-state-title-size: var(--xh-font-
|
|
11
|
+
--xh-_empty-state-py: var(--xh-section-py-md);
|
|
12
|
+
--xh-_empty-state-icon-size: var(--xh-glyph-size-2xl);
|
|
13
|
+
--xh-_empty-state-title-size: var(--xh-control-font-lg);
|
|
14
14
|
/* 说明的读行宽度:整句话不收窄就会拉成一条难读的长行 */
|
|
15
15
|
--xh-_empty-state-measure: 32rem;
|
|
16
16
|
|
|
@@ -31,17 +31,17 @@
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
[data-scope='empty-state'][data-part='root'][data-size='sm'] {
|
|
34
|
-
--xh-_empty-state-gap: var(--xh-
|
|
35
|
-
--xh-_empty-state-py: var(--xh-
|
|
36
|
-
--xh-_empty-state-icon-size:
|
|
37
|
-
--xh-_empty-state-title-size: var(--xh-font-
|
|
34
|
+
--xh-_empty-state-gap: var(--xh-stack-gap-sm);
|
|
35
|
+
--xh-_empty-state-py: var(--xh-section-py-sm);
|
|
36
|
+
--xh-_empty-state-icon-size: var(--xh-glyph-size-xl);
|
|
37
|
+
--xh-_empty-state-title-size: var(--xh-control-font-md);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
[data-scope='empty-state'][data-part='root'][data-size='lg'] {
|
|
41
|
-
--xh-_empty-state-gap: var(--xh-
|
|
42
|
-
--xh-_empty-state-py: var(--xh-
|
|
43
|
-
--xh-_empty-state-icon-size:
|
|
44
|
-
--xh-_empty-state-title-size: var(--xh-
|
|
41
|
+
--xh-_empty-state-gap: var(--xh-stack-gap-lg);
|
|
42
|
+
--xh-_empty-state-py: var(--xh-section-py-lg);
|
|
43
|
+
--xh-_empty-state-icon-size: var(--xh-glyph-size-3xl);
|
|
44
|
+
--xh-_empty-state-title-size: var(--xh-text-heading-3-size);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
[data-scope='empty-state'][data-part='icon'] {
|
|
@@ -49,11 +49,14 @@
|
|
|
49
49
|
align-items: center;
|
|
50
50
|
justify-content: center;
|
|
51
51
|
flex: none;
|
|
52
|
+
/* 作者塞进图标槽的 XhIcon 与皮肤画的字形同一把尺,都按展示档的图标框量 */
|
|
53
|
+
--xh-icon-size: var(--xh-empty-state-icon-size, var(--xh-_empty-state-icon-size));
|
|
54
|
+
|
|
52
55
|
block-size: var(--xh-empty-state-icon-size, var(--xh-_empty-state-icon-size));
|
|
53
56
|
inline-size: var(--xh-empty-state-icon-size, var(--xh-_empty-state-icon-size));
|
|
54
57
|
color: var(--xh-empty-state-icon-fg, var(--xh-fg-subtle));
|
|
55
58
|
/* 图标常是一个字形,字号跟着图标框走,line-height 不再另占高度 */
|
|
56
|
-
font-size: var(--xh-empty-state-icon-font-size, var(--xh-
|
|
59
|
+
font-size: var(--xh-empty-state-icon-font-size, var(--xh-_empty-state-icon-size));
|
|
57
60
|
line-height: var(--xh-leading-none);
|
|
58
61
|
}
|
|
59
62
|
|
|
@@ -80,4 +83,11 @@
|
|
|
80
83
|
justify-content: center;
|
|
81
84
|
gap: var(--xh-empty-state-action-gap, var(--xh-space-2));
|
|
82
85
|
}
|
|
86
|
+
|
|
87
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
88
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
89
|
+
[data-scope='empty-state'][data-part='icon'][hidden],
|
|
90
|
+
[data-scope='empty-state'][data-part='action'][hidden] {
|
|
91
|
+
display: none;
|
|
92
|
+
}
|
|
83
93
|
}
|
package/css/field.css
CHANGED
|
@@ -22,8 +22,10 @@
|
|
|
22
22
|
[data-scope='form'][data-part='root'][data-layout='horizontal'] [data-scope='field'][data-part='label'] {
|
|
23
23
|
grid-column: 1;
|
|
24
24
|
justify-self: end;
|
|
25
|
-
/*
|
|
26
|
-
|
|
25
|
+
/* 与控件的首行文字对齐:行高保持正文行距(标签折行时每行不会撑成一个控件高),
|
|
26
|
+
上下留白把单行文本盒撑到控件高度;配的是哪一档控件由 --xh-field-control-h 告诉它 */
|
|
27
|
+
line-height: var(--xh-field-label-leading, var(--xh-leading-normal));
|
|
28
|
+
padding-block: calc((var(--xh-field-control-h, var(--xh-control-h-md)) - 1lh) / 2);
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
[data-scope='form'][data-part='root'][data-layout='horizontal'][data-label-align='start'] [data-scope='field'][data-part='label'] {
|
|
@@ -47,7 +49,7 @@
|
|
|
47
49
|
|
|
48
50
|
/* 必填星号:跟着根上的 data-required 亮,选填不标 */
|
|
49
51
|
[data-scope='field'][data-part='root'][data-required] [data-part='label']::after {
|
|
50
|
-
content:
|
|
52
|
+
content: var(--xh-glyph-mark-required);
|
|
51
53
|
margin-inline-start: var(--xh-space-1);
|
|
52
54
|
color: var(--xh-field-label-star, var(--xh-fg-danger));
|
|
53
55
|
}
|
|
@@ -65,12 +67,13 @@
|
|
|
65
67
|
}
|
|
66
68
|
|
|
67
69
|
[data-scope='field'][data-part='control']:focus-visible {
|
|
70
|
+
border-color: var(--xh-field-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
|
|
68
71
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
69
72
|
outline-offset: var(--xh-ring-offset);
|
|
70
73
|
}
|
|
71
74
|
|
|
72
75
|
[data-scope='field'][data-part='control'][data-invalid] {
|
|
73
|
-
border-color: var(--xh-field-control-border-invalid, var(--xh-
|
|
76
|
+
border-color: var(--xh-field-control-border-invalid, var(--xh-border-invalid));
|
|
74
77
|
}
|
|
75
78
|
|
|
76
79
|
/* 禁用由作者在控件上落原生 disabled,样式统一走 data-disabled */
|
|
@@ -83,7 +86,7 @@
|
|
|
83
86
|
[data-scope='field'][data-part='description'] {
|
|
84
87
|
margin: 0;
|
|
85
88
|
color: var(--xh-field-description-fg, var(--xh-fg-muted));
|
|
86
|
-
font-size: var(--xh-field-description-font-size, var(--xh-
|
|
89
|
+
font-size: var(--xh-field-description-font-size, var(--xh-text-secondary-size));
|
|
87
90
|
line-height: var(--xh-leading-normal);
|
|
88
91
|
}
|
|
89
92
|
|
|
@@ -95,7 +98,14 @@
|
|
|
95
98
|
[data-scope='field'][data-part='error-text'] {
|
|
96
99
|
margin: 0;
|
|
97
100
|
color: var(--xh-field-error-fg, var(--xh-fg-danger));
|
|
98
|
-
font-size: var(--xh-field-error-font-size, var(--xh-
|
|
101
|
+
font-size: var(--xh-field-error-font-size, var(--xh-text-secondary-size));
|
|
99
102
|
line-height: var(--xh-leading-normal);
|
|
100
103
|
}
|
|
104
|
+
|
|
105
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
106
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
107
|
+
[data-scope='field'][data-part='root'][hidden],
|
|
108
|
+
[data-scope='form'][data-part='root'][hidden] {
|
|
109
|
+
display: none;
|
|
110
|
+
}
|
|
101
111
|
}
|
package/css/fieldset.css
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='fieldset'] {
|
|
4
|
+
--xh-fieldset-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/* 抹掉 UA 给 <fieldset> 的边框、内外边距与 min-content 下限,间距全部改由令牌给。
|
|
8
|
+
display 落在 fieldset 的匿名内容盒上:首个 <legend> 不在这个盒子里,
|
|
9
|
+
所以 gap 只作用于组内各块,legend 与内容之间的留白由 legend 自己的下外边距给。 */
|
|
10
|
+
[data-scope='fieldset'][data-part='root'] {
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
gap: var(--xh-fieldset-gap, var(--xh-space-4));
|
|
14
|
+
margin: 0;
|
|
15
|
+
border: 0;
|
|
16
|
+
padding: 0;
|
|
17
|
+
min-inline-size: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
[data-scope='fieldset'][data-part='root'][hidden] {
|
|
21
|
+
display: none;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
[data-scope='fieldset'][data-part='legend'] {
|
|
25
|
+
padding: 0;
|
|
26
|
+
margin-block-end: var(--xh-fieldset-legend-gap, var(--xh-space-2));
|
|
27
|
+
color: var(--xh-fieldset-legend-fg, var(--xh-fg-default));
|
|
28
|
+
font-size: var(--xh-fieldset-legend-font-size, var(--xh-text-label-size));
|
|
29
|
+
font-weight: var(--xh-fieldset-legend-font-weight, var(--xh-text-label-weight));
|
|
30
|
+
line-height: var(--xh-leading-tight);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* 整组无效时组标题转警示色:没渲染错误文案的字段集上,这是屏幕上唯一变化的东西 */
|
|
34
|
+
[data-scope='fieldset'][data-part='root'][data-invalid] > [data-scope='fieldset'][data-part='legend'] {
|
|
35
|
+
color: var(--xh-fieldset-legend-fg-invalid, var(--xh-fg-danger));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* 整组禁用时组标题跟着变淡;组内控件由原生 fieldset[disabled] 各自呈现禁用态。
|
|
39
|
+
选择器与上一条同权重且排在后面,禁用与无效同时为真时以禁用为准。 */
|
|
40
|
+
[data-scope='fieldset'][data-part='root'] > [data-scope='fieldset'][data-part='legend'][data-disabled] {
|
|
41
|
+
color: var(--xh-fieldset-legend-fg-disabled, var(--xh-fg-subtle));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* 必填星号:跟着根上的 data-required 亮,选填不标 */
|
|
45
|
+
[data-scope='fieldset'][data-part='root'][data-required] > [data-scope='fieldset'][data-part='legend']::after {
|
|
46
|
+
content: var(--xh-glyph-mark-required);
|
|
47
|
+
margin-inline-start: var(--xh-space-1);
|
|
48
|
+
color: var(--xh-fieldset-legend-star, var(--xh-fg-danger));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
[data-scope='fieldset'][data-part='helper-text'] {
|
|
52
|
+
margin: 0;
|
|
53
|
+
color: var(--xh-fieldset-helper-fg, var(--xh-fg-muted));
|
|
54
|
+
font-size: var(--xh-fieldset-helper-font-size, var(--xh-text-secondary-size));
|
|
55
|
+
line-height: var(--xh-leading-normal);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
[data-scope='fieldset'][data-part='helper-text'][data-disabled] {
|
|
59
|
+
color: var(--xh-fieldset-helper-fg-disabled, var(--xh-fg-subtle));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* 不 invalid 时节点带 hidden:此处不声明 display,交给浏览器的 [hidden] 规则收起 */
|
|
63
|
+
[data-scope='fieldset'][data-part='error-text'] {
|
|
64
|
+
margin: 0;
|
|
65
|
+
color: var(--xh-fieldset-error-fg, var(--xh-fg-danger));
|
|
66
|
+
font-size: var(--xh-fieldset-error-font-size, var(--xh-text-secondary-size));
|
|
67
|
+
line-height: var(--xh-leading-normal);
|
|
68
|
+
}
|
|
69
|
+
}
|
package/css/file-upload.css
CHANGED
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
}
|
|
6
6
|
|
|
7
7
|
[data-scope='file-upload'][data-part='root'] {
|
|
8
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
9
|
+
--xh-icon-size: var(--xh-file-upload-icon-size, var(--xh-glyph-size-text));
|
|
10
|
+
|
|
8
11
|
display: flex;
|
|
9
12
|
flex-direction: column;
|
|
10
13
|
gap: var(--xh-file-upload-gap, var(--xh-space-3));
|
|
@@ -72,7 +75,7 @@
|
|
|
72
75
|
}
|
|
73
76
|
|
|
74
77
|
[data-scope='file-upload'][data-part='dropzone'][data-invalid] {
|
|
75
|
-
border-color: var(--xh-file-upload-dropzone-border-invalid, var(--xh-
|
|
78
|
+
border-color: var(--xh-file-upload-dropzone-border-invalid, var(--xh-border-invalid));
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
/* 投放区是 div,没有原生 disabled 可用,禁用态只能靠 data-disabled 表达,写 :disabled 永远不命中 */
|
|
@@ -190,7 +193,7 @@
|
|
|
190
193
|
只挑图标色不换底色:底色一换,一列文件里图片那几行会跳出来抢戏。
|
|
191
194
|
取语义 token 而不是品牌色阶原值,深色主题才跟着走 */
|
|
192
195
|
[data-scope='file-upload'][data-part='item-preview'][data-file-type^='image/'] {
|
|
193
|
-
color: var(--xh-file-upload-preview-fg-image, var(--xh-
|
|
196
|
+
color: var(--xh-file-upload-preview-fg-image, var(--xh-fg-brand));
|
|
194
197
|
}
|
|
195
198
|
|
|
196
199
|
/* 塞进来的真缩略图撑满这个方框,长宽比不对就裁掉,不许把格子顶变形 */
|
|
@@ -215,7 +218,7 @@
|
|
|
215
218
|
[data-scope='file-upload'][data-part='item-size-text'] {
|
|
216
219
|
flex: none;
|
|
217
220
|
color: var(--xh-file-upload-size-fg, var(--xh-fg-subtle));
|
|
218
|
-
font-size: var(--xh-file-upload-size-font-size, var(--xh-
|
|
221
|
+
font-size: var(--xh-file-upload-size-font-size, var(--xh-text-caption-size));
|
|
219
222
|
font-variant-numeric: tabular-nums;
|
|
220
223
|
white-space: nowrap;
|
|
221
224
|
}
|
|
@@ -230,8 +233,8 @@
|
|
|
230
233
|
flex: none;
|
|
231
234
|
align-items: center;
|
|
232
235
|
justify-content: center;
|
|
233
|
-
inline-size: var(--xh-file-upload-delete-size, var(--xh-control-
|
|
234
|
-
block-size: var(--xh-file-upload-delete-size, var(--xh-control-
|
|
236
|
+
inline-size: var(--xh-file-upload-delete-size, var(--xh-control-action-size));
|
|
237
|
+
block-size: var(--xh-file-upload-delete-size, var(--xh-control-action-size));
|
|
235
238
|
padding: 0;
|
|
236
239
|
border: 0;
|
|
237
240
|
border-radius: var(--xh-file-upload-delete-radius, var(--xh-shape-control));
|
|
@@ -240,6 +243,9 @@
|
|
|
240
243
|
font-family: inherit;
|
|
241
244
|
line-height: var(--xh-leading-none);
|
|
242
245
|
cursor: pointer;
|
|
246
|
+
transition:
|
|
247
|
+
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
248
|
+
scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
243
249
|
}
|
|
244
250
|
|
|
245
251
|
[data-scope='file-upload'][data-part='item-delete-trigger'][hidden] {
|
|
@@ -251,6 +257,12 @@
|
|
|
251
257
|
color: var(--xh-file-upload-delete-fg-hover, var(--xh-fg-danger-hover));
|
|
252
258
|
}
|
|
253
259
|
|
|
260
|
+
/* 按下:换到按压档底色并轻微下压,松手弹回;禁用钮不压 */
|
|
261
|
+
[data-scope='file-upload'][data-part='item-delete-trigger']:not(:disabled):active {
|
|
262
|
+
background: var(--xh-file-upload-delete-bg-active, var(--xh-bg-subtle-active));
|
|
263
|
+
scale: var(--xh-motion-scale-press);
|
|
264
|
+
}
|
|
265
|
+
|
|
254
266
|
[data-scope='file-upload'][data-part='item-delete-trigger']:focus-visible {
|
|
255
267
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
256
268
|
outline-offset: var(--xh-ring-offset);
|
|
@@ -261,8 +273,7 @@
|
|
|
261
273
|
cursor: not-allowed;
|
|
262
274
|
}
|
|
263
275
|
|
|
264
|
-
/* 清空是收尾动作,画成不带底色的文字按钮:它比"选择文件"
|
|
265
|
-
且列表为空时连接层会给原生 disabled,那时它本就该看着点不动 */
|
|
276
|
+
/* 清空是收尾动作,画成不带底色的文字按钮:它比"选择文件"次要 */
|
|
266
277
|
[data-scope='file-upload'][data-part='clear-trigger'] {
|
|
267
278
|
display: inline-flex;
|
|
268
279
|
flex: none;
|
|
@@ -277,9 +288,12 @@
|
|
|
277
288
|
background: transparent;
|
|
278
289
|
color: var(--xh-file-upload-clear-fg, var(--xh-fg-muted));
|
|
279
290
|
font-family: inherit;
|
|
280
|
-
font-size: var(--xh-file-upload-clear-font-size, var(--xh-
|
|
291
|
+
font-size: var(--xh-file-upload-clear-font-size, var(--xh-text-caption-size));
|
|
281
292
|
line-height: var(--xh-leading-none);
|
|
282
293
|
cursor: pointer;
|
|
294
|
+
transition:
|
|
295
|
+
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
296
|
+
scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
283
297
|
}
|
|
284
298
|
|
|
285
299
|
[data-scope='file-upload'][data-part='clear-trigger'][hidden] {
|
|
@@ -291,13 +305,37 @@
|
|
|
291
305
|
color: var(--xh-file-upload-clear-fg-hover, var(--xh-fg-default));
|
|
292
306
|
}
|
|
293
307
|
|
|
308
|
+
/* 按下:换到按压档底色并轻微下压,松手弹回;禁用钮不压 */
|
|
309
|
+
[data-scope='file-upload'][data-part='clear-trigger']:not(:disabled):active {
|
|
310
|
+
background: var(--xh-file-upload-clear-bg-active, var(--xh-bg-subtle-active));
|
|
311
|
+
scale: var(--xh-motion-scale-press);
|
|
312
|
+
}
|
|
313
|
+
|
|
294
314
|
[data-scope='file-upload'][data-part='clear-trigger']:focus-visible {
|
|
295
315
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
296
316
|
outline-offset: var(--xh-ring-offset);
|
|
297
317
|
}
|
|
298
318
|
|
|
319
|
+
/* 空列表时按钮照常可按(收起它会让焦点掉回 body),只把前景压淡一档 */
|
|
320
|
+
[data-scope='file-upload'][data-part='clear-trigger'][data-empty] {
|
|
321
|
+
color: var(--xh-fg-subtle);
|
|
322
|
+
}
|
|
323
|
+
|
|
299
324
|
[data-scope='file-upload'][data-part='clear-trigger']:disabled {
|
|
300
325
|
color: var(--xh-fg-disabled);
|
|
301
326
|
cursor: not-allowed;
|
|
302
327
|
}
|
|
328
|
+
|
|
329
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
330
|
+
[data-scope='file-upload'][data-part='item-delete-trigger']:empty::before,
|
|
331
|
+
[data-scope='file-upload'][data-part='clear-trigger']:empty::before {
|
|
332
|
+
content: '';
|
|
333
|
+
display: inline-block;
|
|
334
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
335
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
336
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
337
|
+
background-color: currentColor;
|
|
338
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
339
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
340
|
+
}
|
|
303
341
|
}
|
package/css/flex.css
CHANGED
|
@@ -17,11 +17,11 @@
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/* —— 方向 —— */
|
|
20
|
-
[data-scope='flex'][data-part='root'][data-
|
|
20
|
+
[data-scope='flex'][data-part='root'][data-orientation='horizontal'] {
|
|
21
21
|
flex-direction: row;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
[data-scope='flex'][data-part='root'][data-
|
|
24
|
+
[data-scope='flex'][data-part='root'][data-orientation='vertical'] {
|
|
25
25
|
flex-direction: column;
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -79,22 +79,28 @@
|
|
|
79
79
|
/* —— 间距档位 —— */
|
|
80
80
|
/* 每一档指向一个间距令牌,折行时行与行之间也吃这份间距 */
|
|
81
81
|
[data-scope='flex'][data-part='root'][data-gap='xs'] {
|
|
82
|
-
gap: var(--xh-flex-gap, var(--xh-
|
|
82
|
+
gap: var(--xh-flex-gap, var(--xh-layout-gap-xs));
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
[data-scope='flex'][data-part='root'][data-gap='sm'] {
|
|
86
|
-
gap: var(--xh-flex-gap, var(--xh-
|
|
86
|
+
gap: var(--xh-flex-gap, var(--xh-layout-gap-sm));
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
[data-scope='flex'][data-part='root'][data-gap='md'] {
|
|
90
|
-
gap: var(--xh-flex-gap, var(--xh-
|
|
90
|
+
gap: var(--xh-flex-gap, var(--xh-layout-gap-md));
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
[data-scope='flex'][data-part='root'][data-gap='lg'] {
|
|
94
|
-
gap: var(--xh-flex-gap, var(--xh-
|
|
94
|
+
gap: var(--xh-flex-gap, var(--xh-layout-gap-lg));
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
[data-scope='flex'][data-part='root'][data-gap='xl'] {
|
|
98
|
-
gap: var(--xh-flex-gap, var(--xh-
|
|
98
|
+
gap: var(--xh-flex-gap, var(--xh-layout-gap-xl));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
102
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
103
|
+
[data-scope='flex'][data-part='root'][hidden] {
|
|
104
|
+
display: none;
|
|
99
105
|
}
|
|
100
106
|
}
|
package/css/float-button.css
CHANGED
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
transform / filter / backdrop-filter / contain,包含块就被抢走,整组立刻贴错位置——
|
|
11
11
|
所以别往覆盖钩子里加这几个属性。 */
|
|
12
12
|
[data-scope='float-button'][data-part='root'] {
|
|
13
|
+
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
14
|
+
--xh-icon-size: var(--xh-float-button-icon-size, var(--xh-glyph-size-text));
|
|
15
|
+
|
|
13
16
|
--xh-_float-button-offset: var(--xh-space-6);
|
|
14
17
|
/* 触发器与展开的每一条动作共用这两个私有槽,换档只改这里 */
|
|
15
18
|
--xh-_float-button-size: var(--xh-float-button-size, var(--xh-control-h-lg));
|
|
@@ -67,7 +70,7 @@
|
|
|
67
70
|
background: var(--xh-float-button-bg, var(--xh-bg-surface-raised));
|
|
68
71
|
color: var(--xh-float-button-fg, var(--xh-fg-default));
|
|
69
72
|
/* 浮在内容之上,靠投影与页面拉开层次 */
|
|
70
|
-
box-shadow: var(--xh-elevation-
|
|
73
|
+
box-shadow: var(--xh-float-button-shadow, var(--xh-elevation-sheet));
|
|
71
74
|
cursor: pointer;
|
|
72
75
|
transition:
|
|
73
76
|
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
@@ -123,4 +126,23 @@
|
|
|
123
126
|
block-size: var(--xh-_float-button-size);
|
|
124
127
|
border-radius: var(--xh-_float-button-radius);
|
|
125
128
|
}
|
|
129
|
+
|
|
130
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
131
|
+
[data-scope='float-button'][data-part='trigger']:empty::before {
|
|
132
|
+
content: '';
|
|
133
|
+
display: inline-block;
|
|
134
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
135
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
136
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
137
|
+
background-color: currentColor;
|
|
138
|
+
-webkit-mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
|
|
139
|
+
mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
143
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
144
|
+
[data-scope='float-button'][data-part='root'][hidden],
|
|
145
|
+
[data-scope='float-button'][data-part='trigger'][hidden] {
|
|
146
|
+
display: none;
|
|
147
|
+
}
|
|
126
148
|
}
|