@xihan-ui/styles 3.2.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 +441 -0
- package/component-tokens.d.ts +229 -60
- package/components.tokens.json +5124 -1555
- package/css/accordion.css +47 -20
- package/css/alert.css +14 -15
- package/css/anchor.css +2 -2
- package/css/approval.css +37 -13
- 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 +4 -7
- package/css/calendar-picker.css +177 -94
- package/css/calendar-range-picker.css +206 -121
- package/css/card.css +34 -6
- package/css/carousel.css +65 -49
- package/css/cascader.css +41 -29
- package/css/checkbox-group.css +9 -6
- package/css/checkbox.css +5 -4
- package/css/citation.css +7 -2
- package/css/clipboard.css +20 -4
- 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 +5 -5
- package/css/combobox.css +14 -10
- package/css/command.css +13 -8
- package/css/context-menu.css +10 -5
- package/css/date-field.css +4 -4
- package/css/date-picker.css +165 -102
- package/css/date-range-picker.css +186 -123
- package/css/description.css +10 -6
- package/css/descriptions.css +47 -19
- package/css/dialog.css +50 -35
- package/css/drawer.css +75 -21
- package/css/editable.css +15 -41
- package/css/empty-state.css +21 -3
- package/css/field-array.css +4 -1
- package/css/field.css +17 -18
- package/css/fieldset.css +33 -13
- package/css/file-upload.css +65 -32
- package/css/float-button.css +25 -15
- package/css/floating-panel.css +1 -1
- package/css/form.css +24 -10
- package/css/grid-list.css +1 -1
- package/css/highlight.css +4 -4
- package/css/hover-card.css +19 -12
- package/css/image-viewer.css +77 -27
- package/css/image.css +12 -4
- 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 +10 -8
- package/css/menu.css +10 -5
- package/css/menubar.css +13 -8
- package/css/navigation-menu.css +2 -2
- package/css/notification.css +114 -31
- package/css/number-animation.css +2 -2
- package/css/number-field.css +60 -37
- package/css/page-header.css +63 -26
- package/css/pagination.css +35 -38
- package/css/password-input.css +10 -66
- package/css/pin-input.css +18 -26
- package/css/popconfirm.css +20 -11
- package/css/popover.css +18 -12
- package/css/progress.css +14 -13
- package/css/prompt-input.css +3 -3
- package/css/question-flow.css +33 -7
- package/css/radio-group.css +120 -55
- package/css/rating.css +31 -14
- package/css/select.css +14 -10
- package/css/separator.css +22 -4
- package/css/side-nav.css +16 -11
- package/css/signature-pad.css +23 -9
- package/css/skeleton.css +7 -7
- package/css/slider.css +71 -42
- 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 +27 -10
- package/css/tabs.css +35 -12
- package/css/tag-group.css +17 -6
- package/css/tag.css +54 -29
- package/css/tags-input.css +38 -19
- 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 +6 -4
- package/css/toolbar.css +6 -5
- package/css/tooltip.css +15 -16
- package/css/tour.css +14 -7
- package/css/transfer.css +22 -16
- package/css/tree-select.css +10 -10
- package/css/tree.css +26 -25
- package/css/typography.css +28 -25
- package/dist/css/accordion.css +47 -20
- package/dist/css/alert.css +14 -15
- package/dist/css/anchor.css +2 -2
- package/dist/css/approval.css +37 -13
- package/dist/css/avatar-group.css +9 -12
- package/dist/css/avatar.css +20 -18
- package/dist/css/back-top.css +21 -7
- package/dist/css/badge.css +5 -5
- package/dist/css/breadcrumb.css +18 -16
- package/dist/css/button-group.css +4 -6
- package/dist/css/button.css +4 -7
- package/dist/css/calendar-picker.css +177 -94
- package/dist/css/calendar-range-picker.css +206 -121
- package/dist/css/card.css +34 -6
- package/dist/css/carousel.css +65 -49
- package/dist/css/cascader.css +41 -29
- package/dist/css/checkbox-group.css +9 -6
- package/dist/css/checkbox.css +5 -4
- package/dist/css/citation.css +7 -2
- package/dist/css/clipboard.css +20 -4
- package/dist/css/collapsible.css +29 -14
- package/dist/css/color-field.css +4 -4
- package/dist/css/color-picker.css +77 -23
- package/dist/css/color-slider.css +10 -8
- package/dist/css/color-swatch-picker.css +5 -5
- package/dist/css/combobox.css +14 -10
- package/dist/css/command.css +13 -8
- package/dist/css/context-menu.css +10 -5
- package/dist/css/date-field.css +4 -4
- package/dist/css/date-picker.css +165 -102
- package/dist/css/date-range-picker.css +186 -123
- package/dist/css/description.css +10 -6
- package/dist/css/descriptions.css +47 -19
- package/dist/css/dialog.css +50 -35
- package/dist/css/drawer.css +75 -21
- package/dist/css/editable.css +15 -41
- package/dist/css/empty-state.css +21 -3
- package/dist/css/field-array.css +4 -1
- package/dist/css/field.css +17 -18
- package/dist/css/fieldset.css +33 -13
- package/dist/css/file-upload.css +65 -32
- package/dist/css/float-button.css +25 -15
- package/dist/css/floating-panel.css +1 -1
- package/dist/css/form.css +24 -10
- package/dist/css/grid-list.css +1 -1
- package/dist/css/highlight.css +4 -4
- package/dist/css/hover-card.css +19 -12
- package/dist/css/image-viewer.css +77 -27
- package/dist/css/image.css +12 -4
- package/dist/css/infinite-scroll.css +8 -4
- package/dist/css/input-group.css +74 -26
- package/dist/css/kbd.css +1 -1
- package/dist/css/label.css +27 -11
- package/dist/css/layout.css +17 -10
- package/dist/css/list.css +13 -9
- package/dist/css/listbox.css +12 -7
- package/dist/css/loading-bar.css +3 -0
- package/dist/css/mention.css +10 -8
- package/dist/css/menu.css +10 -5
- package/dist/css/menubar.css +13 -8
- package/dist/css/navigation-menu.css +2 -2
- package/dist/css/notification.css +114 -31
- package/dist/css/number-animation.css +2 -2
- package/dist/css/number-field.css +60 -37
- package/dist/css/page-header.css +63 -26
- package/dist/css/pagination.css +35 -38
- package/dist/css/password-input.css +10 -66
- package/dist/css/pin-input.css +18 -26
- package/dist/css/popconfirm.css +20 -11
- package/dist/css/popover.css +18 -12
- package/dist/css/progress.css +14 -13
- package/dist/css/prompt-input.css +3 -3
- package/dist/css/question-flow.css +33 -7
- package/dist/css/radio-group.css +120 -55
- package/dist/css/rating.css +31 -14
- package/dist/css/select.css +14 -10
- package/dist/css/separator.css +22 -4
- package/dist/css/side-nav.css +16 -11
- package/dist/css/signature-pad.css +23 -9
- package/dist/css/skeleton.css +7 -7
- package/dist/css/slider.css +71 -42
- package/dist/css/sparkline.css +8 -2
- package/dist/css/spinner.css +40 -20
- package/dist/css/statistic.css +14 -14
- package/dist/css/steps.css +115 -84
- package/dist/css/switch.css +9 -7
- package/dist/css/table.css +27 -10
- package/dist/css/tabs.css +35 -12
- package/dist/css/tag-group.css +17 -6
- package/dist/css/tag.css +54 -29
- package/dist/css/tags-input.css +38 -19
- package/dist/css/text-field.css +5 -5
- package/dist/css/time-field.css +4 -4
- package/dist/css/time-picker.css +150 -64
- package/dist/css/time-range-picker.css +91 -62
- package/dist/css/timeline.css +37 -20
- package/dist/css/timer.css +3 -3
- package/dist/css/toggle-group.css +4 -4
- package/dist/css/tool-call.css +6 -4
- package/dist/css/toolbar.css +6 -5
- package/dist/css/tooltip.css +15 -16
- package/dist/css/tour.css +14 -7
- package/dist/css/transfer.css +22 -16
- package/dist/css/tree-select.css +10 -10
- package/dist/css/tree.css +26 -25
- package/dist/css/typography.css +28 -25
- package/dist/family/action-control.css +30 -24
- package/dist/family/chart.css +57 -0
- package/dist/family/collection-item.css +12 -8
- package/dist/family/field-chrome.css +28 -19
- package/dist/family/loading-ring.css +20 -13
- package/dist/family/swatch.css +4 -4
- package/dist/family/tag-list.css +6 -0
- package/family/action-control.css +30 -24
- 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 +3580 -2060
- package/index.unlayered.css +3579 -2060
- package/package.json +2 -2
package/dist/css/empty-state.css
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
--xh-_empty-state-gap: var(--xh-stack-gap-md);
|
|
21
21
|
--xh-_empty-state-py: var(--xh-section-py-md);
|
|
22
22
|
--xh-_empty-state-icon-size: var(--xh-glyph-size-2xl);
|
|
23
|
-
/*
|
|
23
|
+
/* 标题走小面标题档 14/500;sm 同档只缩图形与留白,lg 升到区块标题 heading-3 */
|
|
24
24
|
--xh-_empty-state-title-size: var(--xh-text-label-size);
|
|
25
25
|
/* 图标区的强调色:由 data-status(状态码)或 data-tone(语气)换掉;两样都没写就退成中性 */
|
|
26
26
|
--xh-_empty-state-accent: var(--xh-fg-subtle);
|
|
@@ -76,6 +76,17 @@
|
|
|
76
76
|
--xh-_empty-state-accent: var(--xh-_tone-fg);
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
/* 结果页(写了语气):图标坐进一枚 44px 语气淡底圆,字形收到 20px;淡底由语气层按 data-tone 给 */
|
|
80
|
+
.xh-scope-empty-state[data-part='root'][data-tone] .xh-scope-empty-state[data-part='indicator'] {
|
|
81
|
+
--xh-icon-size: var(--xh-empty-state-icon-size, var(--xh-glyph-size-md));
|
|
82
|
+
|
|
83
|
+
inline-size: var(--xh-empty-state-indicator-box, var(--xh-control-box-lg));
|
|
84
|
+
block-size: var(--xh-empty-state-indicator-box, var(--xh-control-box-lg));
|
|
85
|
+
border-radius: var(--xh-empty-state-indicator-radius, var(--xh-shape-circle));
|
|
86
|
+
background: var(--xh-empty-state-indicator-bg, var(--xh-_tone-subtle));
|
|
87
|
+
font-size: var(--xh-empty-state-icon-size, var(--xh-glyph-size-md));
|
|
88
|
+
}
|
|
89
|
+
|
|
79
90
|
/*
|
|
80
91
|
* 插画槽。它与图标槽二选一,尺寸另走一档:插画塞进按字形量的图标槽会被压到 40px 以下,
|
|
81
92
|
* 而空状态的插画通常是这个尺度的两倍。默认由图标档翻一倍派生,跟着三个尺寸档一起走。
|
|
@@ -110,8 +121,13 @@
|
|
|
110
121
|
margin: 0;
|
|
111
122
|
color: var(--xh-empty-state-title-fg, var(--xh-fg-default));
|
|
112
123
|
font-size: var(--xh-empty-state-title-font-size, var(--xh-_empty-state-title-size));
|
|
113
|
-
font-weight: var(--xh-empty-state-title-font-weight, var(--xh-font-weight-
|
|
114
|
-
line-height: var(--xh-empty-state-title-leading, var(--xh-leading-
|
|
124
|
+
font-weight: var(--xh-empty-state-title-font-weight, var(--xh-font-weight-medium));
|
|
125
|
+
line-height: var(--xh-empty-state-title-leading, var(--xh-leading-normal));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* 标题与说明是一组:两者之间只留 4px,图形与它们、它们与动作之间才是整档间距 */
|
|
129
|
+
.xh-scope-empty-state[data-part='title'] + .xh-scope-empty-state[data-part='description'] {
|
|
130
|
+
margin-block-start: calc(var(--xh-space-1) - var(--xh-empty-state-gap, var(--xh-_empty-state-gap)));
|
|
115
131
|
}
|
|
116
132
|
|
|
117
133
|
.xh-scope-empty-state[data-part='description'] {
|
|
@@ -128,6 +144,8 @@
|
|
|
128
144
|
align-items: center;
|
|
129
145
|
justify-content: center;
|
|
130
146
|
gap: var(--xh-empty-state-action-gap, var(--xh-space-2));
|
|
147
|
+
/* 动作区比图文之间多让出 4px,操作与说明分得开 */
|
|
148
|
+
margin-block-start: var(--xh-space-1);
|
|
131
149
|
}
|
|
132
150
|
|
|
133
151
|
/* 图标、标题、说明、动作按次序开幕,间隔由交错步长派生。
|
package/dist/css/field-array.css
CHANGED
|
@@ -72,8 +72,11 @@
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
/* 行里放什么控件归作者,这里只给它一条能撑开也能收窄的轨道。
|
|
75
|
-
min-inline-size 归零:不写的话里面的输入框按 UA
|
|
75
|
+
min-inline-size 归零:不写的话里面的输入框按 UA 默认宽度顶住,长内容会把整行撑破。
|
|
76
|
+
字段族控件放进来铺满这条轨道,与放进 Field 时一样;并排几个就平分,各自的压缩底线照旧 */
|
|
76
77
|
.xh-scope-field-array[data-part='item-content'] {
|
|
78
|
+
--xh-control-w: 100%;
|
|
79
|
+
|
|
77
80
|
display: flex;
|
|
78
81
|
flex: 1 1 auto;
|
|
79
82
|
align-items: center;
|
package/dist/css/field.css
CHANGED
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
.xh-scope-field[data-part='root'] {
|
|
18
18
|
display: flex;
|
|
19
19
|
flex-direction: column;
|
|
20
|
-
|
|
20
|
+
/* 说明与错误文案紧贴控件:那一行辅助行自己有最小高(description.css),在表单里就是项距 */
|
|
21
|
+
gap: var(--xh-field-gap, var(--xh-space-0));
|
|
21
22
|
/* 字段族控件放进字段即铺满字段宽:字段的宽由表单的列给,控件跟着列走,
|
|
22
23
|
不必逐个组件在根上写 inline-size: 100%。单独摆放的控件仍是 16rem 缺省宽;
|
|
23
24
|
单类钉宽(--xh-<组件>-control-w)照旧压过这一条 */
|
|
@@ -28,8 +29,8 @@
|
|
|
28
29
|
整表据此对齐;描述与错误文案跟着控件走第二列 */
|
|
29
30
|
.xh-scope-form[data-part='root'][data-layout='horizontal'] .xh-scope-field[data-part='root'] {
|
|
30
31
|
display: grid;
|
|
31
|
-
grid-template-columns: var(--xh-form-label-w,
|
|
32
|
-
column-gap: var(--xh-field-label-gap, var(--xh-space-
|
|
32
|
+
grid-template-columns: var(--xh-form-label-w, calc(100% * 5 / 24)) minmax(0, 1fr);
|
|
33
|
+
column-gap: var(--xh-field-label-gap, var(--xh-space-4));
|
|
33
34
|
align-items: start;
|
|
34
35
|
}
|
|
35
36
|
|
|
@@ -62,12 +63,11 @@
|
|
|
62
63
|
横排表单里标签列是一段比例宽度,这行让标签在那一列里折行,而不是从列的左边顶出去 */
|
|
63
64
|
overflow-wrap: anywhere;
|
|
64
65
|
/* 竖排时标签与控件之间的距离:容器的 gap 之上补一段差值,
|
|
65
|
-
--xh-field-label-gap-block
|
|
66
|
-
这段距离仍由 --xh-field-gap 与描述、错误文案那两段同宽。 */
|
|
66
|
+
--xh-field-label-gap-block 给多少最终就是多少,与描述、错误文案那两段(归 --xh-field-gap)各管各的 */
|
|
67
67
|
margin-block-end: calc(
|
|
68
|
-
var(--xh-field-label-gap-block, var(--xh-
|
|
68
|
+
var(--xh-field-label-gap-block, var(--xh-space-2)) - var(--xh-field-gap, var(--xh-space-0))
|
|
69
69
|
);
|
|
70
|
-
color: var(--xh-field-label-fg, var(--xh-fg-
|
|
70
|
+
color: var(--xh-field-label-fg, var(--xh-fg-muted));
|
|
71
71
|
font-size: var(--xh-field-label-font-size, var(--xh-text-label-size));
|
|
72
72
|
font-weight: var(--xh-field-label-font-weight, var(--xh-text-label-weight));
|
|
73
73
|
/* 转无效或转禁用时标签换色,两档之间接一段过渡(与字段集组标题同一档) */
|
|
@@ -75,11 +75,11 @@
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
.xh-scope-field[data-part='label'][data-disabled] {
|
|
78
|
-
color: var(--xh-field-label-fg-disabled, var(--xh-fg-
|
|
78
|
+
color: var(--xh-field-label-fg-disabled, var(--xh-fg-muted));
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
/*
|
|
82
|
-
.xh-scope-field[data-part='label'][data-required]::
|
|
81
|
+
/* 必填星号的字形、字号、间距与默认色在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
82
|
+
.xh-scope-field[data-part='label'][data-required]::before {
|
|
83
83
|
color: var(--xh-field-label-star, var(--xh-fg-danger));
|
|
84
84
|
}
|
|
85
85
|
|
|
@@ -102,8 +102,6 @@
|
|
|
102
102
|
--xh-field-border-focus: var(--xh-field-control-border-focus, var(--xh-_field-variant-border-focus));
|
|
103
103
|
--xh-field-border-invalid: var(--xh-field-control-border-invalid, var(--xh-_field-variant-border-invalid));
|
|
104
104
|
/* 焦点环与家族同一支公共环,不再留逐组件的环色槽(焦点边与环一律公共) */
|
|
105
|
-
--xh-field-ring-focus: var(--xh-ring-focus);
|
|
106
|
-
--xh-field-ring-invalid: var(--xh-ring-invalid);
|
|
107
105
|
--xh-field-shadow-rest: var(--xh-field-control-shadow, none);
|
|
108
106
|
|
|
109
107
|
inline-size: 100%;
|
|
@@ -120,8 +118,8 @@
|
|
|
120
118
|
/* 说明与错误文案的角色(外边距、行距、默认字号与字色)在 description.css 公共层;
|
|
121
119
|
这里只把字色与字号接到本组件的覆盖槽上 */
|
|
122
120
|
.xh-scope-field[data-part='description'] {
|
|
123
|
-
color: var(--xh-field-description-fg, var(--xh-fg-
|
|
124
|
-
font-size: var(--xh-field-description-font-size, var(--xh-text-
|
|
121
|
+
color: var(--xh-field-description-fg, var(--xh-fg-subtle));
|
|
122
|
+
font-size: var(--xh-field-description-font-size, var(--xh-text-caption-size));
|
|
125
123
|
/* 与标签同一档过渡:整个字段转禁用时两处一起变淡 */
|
|
126
124
|
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
127
125
|
}
|
|
@@ -132,7 +130,7 @@
|
|
|
132
130
|
|
|
133
131
|
.xh-scope-field[data-part='error-text'] {
|
|
134
132
|
color: var(--xh-field-error-fg, var(--xh-fg-danger));
|
|
135
|
-
font-size: var(--xh-field-error-font-size, var(--xh-text-
|
|
133
|
+
font-size: var(--xh-field-error-font-size, var(--xh-text-caption-size));
|
|
136
134
|
}
|
|
137
135
|
|
|
138
136
|
/* 辅助文字那一行的占位:字段渲染了错误文案、当前又没在报错时,收起的错误文案自己留在流里占住一行
|
|
@@ -142,15 +140,16 @@
|
|
|
142
140
|
没有在场的 description 才这样占:描述已经占着这一行了,报错时由描述让位给错误文案(见 description.css),
|
|
143
141
|
收起的错误文案按公共层不占位。没渲染错误文案的字段本来就没有这一行。
|
|
144
142
|
|
|
145
|
-
|
|
143
|
+
高度取辅助行的最小高与错误文案一行(字号乘行距)里大的那个,得到的正是它报错时的高度。
|
|
146
144
|
不写 1lh:那个单位晚于本库声明的浏览器地板,取不到时整条声明被丢弃、占位高退回 0,
|
|
147
145
|
字段又会随报错撑高一次,而这种失效不报错。
|
|
148
146
|
与前一块的距离由根的 gap 给,和错误文案顶上来时是同一段;横排表单里它与别的子块一样落在控件那一列。 */
|
|
149
147
|
.xh-scope-field[data-part='root']:not(:has(> .xh-scope-field[data-part='description']:not([hidden])))
|
|
150
148
|
> .xh-scope-field[data-part='error-text'][hidden] {
|
|
151
149
|
position: static;
|
|
152
|
-
block-size:
|
|
153
|
-
var(--xh-
|
|
150
|
+
block-size: max(
|
|
151
|
+
var(--xh-space-5),
|
|
152
|
+
calc(var(--xh-field-error-font-size, var(--xh-text-caption-size)) * var(--xh-leading-normal))
|
|
154
153
|
);
|
|
155
154
|
transition:
|
|
156
155
|
opacity var(--xh-motion-duration-exit) var(--xh-motion-ease-exit),
|
package/dist/css/fieldset.css
CHANGED
|
@@ -13,28 +13,48 @@
|
|
|
13
13
|
|
|
14
14
|
/* 抹掉 UA 给 <fieldset> 的边框、内外边距与 min-content 下限,间距全部改由令牌给。
|
|
15
15
|
display 落在 fieldset 的匿名内容盒上:首个 <legend> 不在这个盒子里,
|
|
16
|
-
|
|
16
|
+
legend 与内容之间的留白由 legend 自己的下外边距给。
|
|
17
|
+
组内项距与 Form 同一套,不走 gap:字段带辅助行(说明,或给错误文案留的那一行)时那一行就是项距,
|
|
18
|
+
没有辅助行的块才在下方补一段项距(见下面两条) */
|
|
17
19
|
.xh-scope-fieldset[data-part='root'] {
|
|
20
|
+
--xh-_fieldset-item-gap: var(--xh-fieldset-gap, var(--xh-space-5));
|
|
21
|
+
|
|
18
22
|
display: flex;
|
|
19
23
|
flex-direction: column;
|
|
20
|
-
gap:
|
|
24
|
+
row-gap: 0;
|
|
21
25
|
margin: 0;
|
|
22
26
|
border: 0;
|
|
23
27
|
padding: 0;
|
|
24
28
|
min-inline-size: 0;
|
|
25
29
|
}
|
|
26
30
|
|
|
31
|
+
/* 每一块在下方留一段项距,最后一块不留。:where() 不计特指度:legend 的下外边距、组说明与错误文案
|
|
32
|
+
归零的外边距(description.css)和作者给自己节点写的外边距都压得过它 */
|
|
33
|
+
:where(.xh-scope-fieldset[data-part='root']) > :where(:not(:last-child)) {
|
|
34
|
+
margin-block-end: var(--xh-_fieldset-item-gap);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* 字段或并排的一段里有字段带辅助行:辅助行(最小高 --xh-space-5)紧贴控件、自己就是项距,不再另留;
|
|
38
|
+
只留错误文案占位的那一行同样算,无效时被收起的说明不算(判据与 Form 的项同一条) */
|
|
39
|
+
.xh-scope-fieldset[data-part='root'] > :is(.xh-scope-field[data-part='root'], .xh-scope-fieldset[data-part='field-group']):has(
|
|
40
|
+
.xh-scope-field[data-part='error-text'],
|
|
41
|
+
.xh-scope-field[data-part='description']:not([hidden], .xh-scope-field[data-part='root'][data-invalid] > *)
|
|
42
|
+
) {
|
|
43
|
+
margin-block-end: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
27
46
|
.xh-scope-fieldset[data-part='root'][hidden] {
|
|
28
47
|
display: none;
|
|
29
48
|
}
|
|
30
49
|
|
|
31
50
|
.xh-scope-fieldset[data-part='legend'] {
|
|
32
51
|
padding: 0;
|
|
33
|
-
margin-block-end: var(--xh-fieldset-legend-gap, var(--xh-space-
|
|
34
|
-
/*
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
font-
|
|
52
|
+
margin-block-end: var(--xh-fieldset-legend-gap, var(--xh-space-4));
|
|
53
|
+
/* 组标题是表单里一段的标题,与区块标题同一档:heading-3 + 正文色,与组内首项隔 --xh-space-4;
|
|
54
|
+
组里每个字段自己的标签是 muted,组标题压在它们上面要高一级 */
|
|
55
|
+
color: var(--xh-fieldset-legend-fg, var(--xh-fg-default));
|
|
56
|
+
font-size: var(--xh-fieldset-legend-font-size, var(--xh-text-heading-3-size));
|
|
57
|
+
font-weight: var(--xh-fieldset-legend-font-weight, var(--xh-text-heading-3-weight));
|
|
38
58
|
line-height: var(--xh-leading-tight);
|
|
39
59
|
/* 整组转无效或转禁用时组标题换色,两档之间接一段过渡 */
|
|
40
60
|
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
@@ -46,22 +66,22 @@
|
|
|
46
66
|
color: var(--xh-fieldset-legend-fg-invalid, var(--xh-fg-danger));
|
|
47
67
|
}
|
|
48
68
|
|
|
49
|
-
/*
|
|
69
|
+
/* 整组禁用时组标题跟着变淡;组内组件库的控件经作用域配置拿到 disabled,按各自的禁用面画。
|
|
50
70
|
选择器权重高于上一条且排在后面,禁用与无效同时为真时以禁用为准。 */
|
|
51
71
|
.xh-scope-fieldset[data-part='root'] > .xh-scope-fieldset[data-part='legend'][data-disabled] {
|
|
52
72
|
color: var(--xh-fieldset-legend-fg-disabled, var(--xh-fg-subtle));
|
|
53
73
|
}
|
|
54
74
|
|
|
55
|
-
/*
|
|
56
|
-
.xh-scope-fieldset[data-part='legend'][data-required]::
|
|
75
|
+
/* 必填星号的字形、字号、间距与默认色在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
76
|
+
.xh-scope-fieldset[data-part='legend'][data-required]::before {
|
|
57
77
|
color: var(--xh-fieldset-legend-star, var(--xh-fg-danger));
|
|
58
78
|
}
|
|
59
79
|
|
|
60
80
|
/* 说明与错误文案的角色(外边距、行距、默认字号与字色)在 description.css 公共层;
|
|
61
81
|
这里只把字色与字号接到本组件的覆盖槽上 */
|
|
62
82
|
.xh-scope-fieldset[data-part='description'] {
|
|
63
|
-
color: var(--xh-fieldset-description-fg, var(--xh-fg-
|
|
64
|
-
font-size: var(--xh-fieldset-description-font-size, var(--xh-text-
|
|
83
|
+
color: var(--xh-fieldset-description-fg, var(--xh-fg-subtle));
|
|
84
|
+
font-size: var(--xh-fieldset-description-font-size, var(--xh-text-caption-size));
|
|
65
85
|
/* 与组标题同一档过渡:整组转禁用时两处一起变淡 */
|
|
66
86
|
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
67
87
|
}
|
|
@@ -97,6 +117,6 @@
|
|
|
97
117
|
|
|
98
118
|
.xh-scope-fieldset[data-part='error-text'] {
|
|
99
119
|
color: var(--xh-fieldset-error-fg, var(--xh-fg-danger));
|
|
100
|
-
font-size: var(--xh-fieldset-error-font-size, var(--xh-text-
|
|
120
|
+
font-size: var(--xh-fieldset-error-font-size, var(--xh-text-caption-size));
|
|
101
121
|
}
|
|
102
122
|
}
|
package/dist/css/file-upload.css
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
.xh-scope-file-upload[data-part='root'] {
|
|
19
|
-
/*
|
|
19
|
+
/* 作者放进删除钮与清空钮里的图标跟着字号走(缩略图位另取 16px 图标尺)。
|
|
20
20
|
条目行首自绘的状态标记(传完的勾、失败的警示)不读这支:它们是指示符,与同一行里 icon 档的
|
|
21
21
|
删除钮并排、走 --xh-control-indicator-* 一族,尺寸由 --xh-file-upload-item-mark-size 单独控 */
|
|
22
22
|
--xh-icon-size: var(--xh-file-upload-icon-size, var(--xh-glyph-size-text));
|
|
@@ -32,30 +32,33 @@
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
.xh-scope-file-upload[data-part='label'] {
|
|
35
|
-
|
|
35
|
+
/* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-file-upload-label-gap 给多少最终就是多少 */
|
|
36
|
+
margin-block-end: calc(var(--xh-file-upload-label-gap, var(--xh-space-2)) - var(--xh-file-upload-gap, var(--xh-space-3)));
|
|
37
|
+
color: var(--xh-file-upload-label-fg, var(--xh-fg-muted));
|
|
36
38
|
font-size: var(--xh-file-upload-label-font-size, var(--xh-text-label-size));
|
|
37
39
|
font-weight: var(--xh-file-upload-label-font-weight, var(--xh-text-label-weight));
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
.xh-scope-file-upload[data-part='label'][data-disabled] {
|
|
41
|
-
color: var(--xh-file-upload-label-fg-disabled, var(--xh-fg-
|
|
43
|
+
color: var(--xh-file-upload-label-fg-disabled, var(--xh-fg-muted));
|
|
42
44
|
}
|
|
43
45
|
|
|
44
|
-
/* 虚线框是"这里能放东西"
|
|
45
|
-
|
|
46
|
+
/* 虚线框是"这里能放东西"的通用说法,实线框看起来只是一个普通面板;铺一层淡底,
|
|
47
|
+
整块在页面上读得出是一块可放置的面。整块可点、可聚焦(连接层给了 role=button 与 tabindex),
|
|
48
|
+
所以指针形状用 pointer */
|
|
46
49
|
.xh-scope-file-upload[data-part='dropzone'] {
|
|
47
50
|
display: flex;
|
|
48
51
|
flex-direction: column;
|
|
49
52
|
align-items: center;
|
|
50
53
|
justify-content: center;
|
|
51
54
|
gap: var(--xh-file-upload-dropzone-gap, var(--xh-space-2));
|
|
52
|
-
min-block-size: var(--xh-file-upload-dropzone-min-h,
|
|
55
|
+
min-block-size: var(--xh-file-upload-dropzone-min-h, var(--xh-dropzone-min-h));
|
|
53
56
|
padding-block: var(--xh-file-upload-dropzone-py, var(--xh-space-5));
|
|
54
57
|
padding-inline: var(--xh-file-upload-dropzone-px, var(--xh-space-4));
|
|
55
|
-
border: var(--xh-stroke-
|
|
56
|
-
border-radius: var(--xh-file-upload-dropzone-radius, var(--xh-shape-
|
|
57
|
-
background: var(--xh-file-upload-dropzone-bg,
|
|
58
|
-
color: var(--xh-file-upload-dropzone-fg, var(--xh-fg-
|
|
58
|
+
border: var(--xh-stroke-thin) dashed var(--xh-file-upload-dropzone-border, var(--xh-border-control));
|
|
59
|
+
border-radius: var(--xh-file-upload-dropzone-radius, var(--xh-shape-control));
|
|
60
|
+
background: var(--xh-file-upload-dropzone-bg, var(--xh-bg-subtle));
|
|
61
|
+
color: var(--xh-file-upload-dropzone-fg, var(--xh-fg-default));
|
|
59
62
|
font-size: var(--xh-file-upload-dropzone-font-size, var(--xh-text-body-size));
|
|
60
63
|
text-align: center;
|
|
61
64
|
cursor: pointer;
|
|
@@ -70,10 +73,10 @@
|
|
|
70
73
|
}
|
|
71
74
|
|
|
72
75
|
/* hover 只在中性态命中:invalid 与 dragging 正拿边框颜色说事,被 hover 盖掉那条信息就没了。
|
|
73
|
-
|
|
76
|
+
描边与底一起换(淡底承载的阶梯升一档):这块面有十来行高,只挪一圈 1px 的描边在这个面积上几乎读不出来 */
|
|
74
77
|
.xh-scope-file-upload[data-part='dropzone']:hover:not([data-disabled], [data-invalid], [data-dragging]) {
|
|
75
|
-
border-color: var(--xh-file-upload-dropzone-border-hover, var(--xh-border-
|
|
76
|
-
background: var(--xh-file-upload-dropzone-bg-hover, var(--xh-bg-subtle));
|
|
78
|
+
border-color: var(--xh-file-upload-dropzone-border-hover, var(--xh-border-strong));
|
|
79
|
+
background: var(--xh-file-upload-dropzone-bg-hover, var(--xh-bg-subtle-hover));
|
|
77
80
|
}
|
|
78
81
|
|
|
79
82
|
/* 键盘落焦时描边跟着语气走,与聚焦环同族;环由 focus.css 统一画。
|
|
@@ -82,10 +85,11 @@
|
|
|
82
85
|
border-color: var(--xh-file-upload-dropzone-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
/*
|
|
88
|
+
/* 拖着文件悬在上方:描边换品牌色、底升一档,比只换边框显眼得多。
|
|
89
|
+
底仍是中性淡底:品牌淡底专属选中 / 当前,拖入不是选中 */
|
|
86
90
|
.xh-scope-file-upload[data-part='dropzone'][data-dragging] {
|
|
87
91
|
border-color: var(--xh-file-upload-dropzone-border-dragging, var(--xh-bg-brand));
|
|
88
|
-
background: var(--xh-file-upload-dropzone-bg-dragging, var(--xh-bg-subtle));
|
|
92
|
+
background: var(--xh-file-upload-dropzone-bg-dragging, var(--xh-bg-subtle-hover));
|
|
89
93
|
}
|
|
90
94
|
|
|
91
95
|
.xh-scope-file-upload[data-part='dropzone'][data-invalid] {
|
|
@@ -151,7 +155,7 @@
|
|
|
151
155
|
max-block-size: var(--xh-file-upload-list-max-h, var(--xh-viewport-h-md));
|
|
152
156
|
overflow-y: auto;
|
|
153
157
|
flex-direction: column;
|
|
154
|
-
gap: var(--xh-file-upload-item-gap, var(--xh-space-
|
|
158
|
+
gap: var(--xh-file-upload-item-gap, var(--xh-space-3));
|
|
155
159
|
}
|
|
156
160
|
|
|
157
161
|
.xh-scope-file-upload[data-part='list'][hidden] {
|
|
@@ -159,21 +163,24 @@
|
|
|
159
163
|
}
|
|
160
164
|
|
|
161
165
|
/* 私有槽一个:传输进度的 0..1 比例,由连接层写进进度条的内联样式,
|
|
162
|
-
这里给个 0 的缺省——没接上传器时进度条根本不露面,也就没有宽度可算。
|
|
166
|
+
这里给个 0 的缺省——没接上传器时进度条根本不露面,也就没有宽度可算。
|
|
167
|
+
文件行是一条无描边的淡底行(描边位留着、透明);行里的删除钮坐在淡底上,承载阶梯按淡底取(200 → 300) */
|
|
163
168
|
.xh-scope-file-upload[data-part='item'] {
|
|
164
169
|
--xh-_file-upload-progress: 0;
|
|
170
|
+
--xh-action-host-bg-hover: var(--xh-bg-subtle-hover);
|
|
171
|
+
--xh-action-host-bg-pressed: var(--xh-bg-subtle-active);
|
|
165
172
|
|
|
166
173
|
display: flex;
|
|
167
174
|
/* 一行排不下就换行:文件名有自己的下限,挤到那个下限之后由后面的部件另起一行,
|
|
168
175
|
而不是把文件名继续压到零宽 */
|
|
169
176
|
flex-wrap: wrap;
|
|
170
177
|
align-items: center;
|
|
171
|
-
gap: var(--xh-file-upload-item-inner-gap, var(--xh-
|
|
178
|
+
gap: var(--xh-file-upload-item-inner-gap, var(--xh-space-3));
|
|
172
179
|
padding-block: var(--xh-file-upload-item-py, var(--xh-space-2));
|
|
173
180
|
padding-inline: var(--xh-file-upload-item-px, var(--xh-space-3));
|
|
174
|
-
border: var(--xh-stroke-thin) solid var(--xh-file-upload-item-border,
|
|
181
|
+
border: var(--xh-stroke-thin) solid var(--xh-file-upload-item-border, transparent);
|
|
175
182
|
border-radius: var(--xh-file-upload-item-radius, var(--xh-shape-control));
|
|
176
|
-
background: var(--xh-file-upload-item-bg, var(--xh-bg-
|
|
183
|
+
background: var(--xh-file-upload-item-bg, var(--xh-bg-subtle));
|
|
177
184
|
color: var(--xh-file-upload-item-fg, var(--xh-fg-default));
|
|
178
185
|
font-size: var(--xh-file-upload-item-font-size, var(--xh-text-body-size));
|
|
179
186
|
}
|
|
@@ -204,14 +211,23 @@
|
|
|
204
211
|
}
|
|
205
212
|
|
|
206
213
|
/* 上传失败的那一行必须一眼认出来:不标出来的话它跟传完的行渲染完全一致,
|
|
207
|
-
|
|
208
|
-
|
|
214
|
+
用户不知道该按哪一条的重试。文件名标红之外再补一枚警示字形——只靠颜色的话,
|
|
215
|
+
色觉障碍用户与灰度打印下这一档等于没有。行底换回承载面:危险色字压在淡底(暗色下连字段淡底)上到不了 4.5:1,
|
|
216
|
+
描边位仍透明。行里的删除钮跟着换回白底承载阶梯(100 → 200):留在淡底阶梯上,悬停就一步跳到 200。
|
|
209
217
|
警示与下面的勾都是固定状态标记(不是 :empty 兜底,作者塞进条目的部件顶不掉):按指示符档取尺
|
|
210
218
|
(comfortable 16 / compact 14,随密度换档),不读只管作者图标的 --xh-icon-size——随文 1em 落在
|
|
211
219
|
14 上下,comfortable 下比同一行里的指示符档小一圈、compact 下又不换档 */
|
|
212
220
|
.xh-scope-file-upload[data-part='item'][data-state='error'],
|
|
213
221
|
.xh-scope-file-upload[data-part='item'][data-state='closed']:has(> [data-part='item-progress'][data-state='error']) {
|
|
214
|
-
|
|
222
|
+
--xh-action-host-bg-hover: var(--xh-bg-subtle);
|
|
223
|
+
--xh-action-host-bg-pressed: var(--xh-bg-subtle-hover);
|
|
224
|
+
|
|
225
|
+
border-color: var(--xh-file-upload-item-border-error, transparent);
|
|
226
|
+
background: var(--xh-file-upload-item-bg-error, var(--xh-bg-surface));
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.xh-scope-file-upload[data-part='item'][data-state='error'] > [data-part='item-name']:where(.xh-scope-file-upload),
|
|
230
|
+
.xh-scope-file-upload[data-part='item'][data-state='closed']:has(> [data-part='item-progress'][data-state='error']) > [data-part='item-name']:where(.xh-scope-file-upload) {
|
|
215
231
|
color: var(--xh-file-upload-item-fg-error, var(--xh-fg-danger));
|
|
216
232
|
}
|
|
217
233
|
|
|
@@ -221,7 +237,7 @@
|
|
|
221
237
|
flex: none;
|
|
222
238
|
inline-size: var(--xh-file-upload-item-mark-size, var(--xh-control-indicator-size));
|
|
223
239
|
block-size: var(--xh-file-upload-item-mark-size, var(--xh-control-indicator-size));
|
|
224
|
-
background-color:
|
|
240
|
+
background-color: var(--xh-file-upload-item-fg-error, var(--xh-fg-danger));
|
|
225
241
|
-webkit-mask: var(--xh-glyph-mark-warning) center / contain no-repeat;
|
|
226
242
|
mask: var(--xh-glyph-mark-warning) center / contain no-repeat;
|
|
227
243
|
}
|
|
@@ -281,20 +297,32 @@
|
|
|
281
297
|
display: none;
|
|
282
298
|
}
|
|
283
299
|
|
|
284
|
-
/*
|
|
300
|
+
/* 缩略图位:缺省是 16px 的品牌色图标位、不带底,作者往里塞图标或真缩略图(要大图把尺寸槽调大),
|
|
301
|
+
尺寸由这里定死,一行行的图标才对得齐;放进来的图标与空着时画的那枚文件字形同一把尺 */
|
|
285
302
|
.xh-scope-file-upload[data-part='item-preview'] {
|
|
303
|
+
--xh-icon-size: var(--xh-glyph-size-sm);
|
|
304
|
+
|
|
286
305
|
display: inline-flex;
|
|
287
306
|
flex: none;
|
|
288
307
|
align-items: center;
|
|
289
308
|
justify-content: center;
|
|
290
|
-
inline-size: var(--xh-file-upload-preview-size, var(--xh-
|
|
291
|
-
block-size: var(--xh-file-upload-preview-size, var(--xh-
|
|
309
|
+
inline-size: var(--xh-file-upload-preview-size, var(--xh-glyph-size-sm));
|
|
310
|
+
block-size: var(--xh-file-upload-preview-size, var(--xh-glyph-size-sm));
|
|
292
311
|
border-radius: var(--xh-file-upload-preview-radius, var(--xh-shape-control));
|
|
293
|
-
background: var(--xh-file-upload-preview-bg,
|
|
294
|
-
color: var(--xh-file-upload-preview-fg, var(--xh-fg-
|
|
312
|
+
background: var(--xh-file-upload-preview-bg, transparent);
|
|
313
|
+
color: var(--xh-file-upload-preview-fg, var(--xh-fg-brand));
|
|
295
314
|
overflow: hidden;
|
|
296
315
|
}
|
|
297
316
|
|
|
317
|
+
.xh-scope-file-upload[data-part='item-preview']:empty::before {
|
|
318
|
+
content: '';
|
|
319
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
320
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
321
|
+
background-color: currentColor;
|
|
322
|
+
-webkit-mask: var(--xh-glyph-mark-file) center / contain no-repeat;
|
|
323
|
+
mask: var(--xh-glyph-mark-file) center / contain no-repeat;
|
|
324
|
+
}
|
|
325
|
+
|
|
298
326
|
.xh-scope-file-upload[data-part='item-preview'][hidden] {
|
|
299
327
|
display: none;
|
|
300
328
|
}
|
|
@@ -338,8 +366,8 @@
|
|
|
338
366
|
color: var(--xh-fg-disabled);
|
|
339
367
|
}
|
|
340
368
|
|
|
341
|
-
/* 删除是一行里的小图标钮:Action Control icon 档 ghost、xs
|
|
342
|
-
|
|
369
|
+
/* 删除是一行里的小图标钮:Action Control icon 档 ghost、xs 视觉盒,坐在淡底行上按淡底承载阶梯换面(行上声明),
|
|
370
|
+
按压由家族给;悬停与按下时字换危险色,说明这一下会删掉。钮里的叉取指示符小档(12px),不抢文件名 */
|
|
343
371
|
.xh-scope-file-upload[data-part='item-delete-trigger'] {
|
|
344
372
|
--xh-action-bg-hover: var(--xh-file-upload-delete-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
345
373
|
--xh-action-bg-pressed: var(--xh-file-upload-delete-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
@@ -348,7 +376,7 @@
|
|
|
348
376
|
--xh-action-fg-pressed: var(--xh-file-upload-delete-fg-hover, var(--xh-fg-danger-hover));
|
|
349
377
|
--xh-action-radius: var(--xh-file-upload-delete-radius, var(--xh-shape-control));
|
|
350
378
|
--xh-action-visual-size: var(--xh-file-upload-delete-size, var(--xh-_action-profile-visual-size));
|
|
351
|
-
--xh-icon-size: var(--xh-
|
|
379
|
+
--xh-icon-size: var(--xh-control-indicator-sm);
|
|
352
380
|
|
|
353
381
|
flex: none;
|
|
354
382
|
}
|
|
@@ -418,6 +446,11 @@
|
|
|
418
446
|
background-color: ButtonText;
|
|
419
447
|
}
|
|
420
448
|
|
|
449
|
+
.xh-scope-file-upload[data-part='item-preview']:empty::before {
|
|
450
|
+
forced-color-adjust: none;
|
|
451
|
+
background-color: CanvasText;
|
|
452
|
+
}
|
|
453
|
+
|
|
421
454
|
.xh-scope-file-upload:is([data-part='item-delete-trigger'], [data-part='clear-trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
422
455
|
background-color: HighlightText;
|
|
423
456
|
}
|
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
所以别往覆盖钩子里加这几个属性。 */
|
|
25
25
|
.xh-scope-float-button[data-part='root'] {
|
|
26
26
|
--xh-_float-button-offset: var(--xh-space-6);
|
|
27
|
-
/*
|
|
28
|
-
|
|
29
|
-
原生动作项不是 Headless
|
|
30
|
-
--xh-_float-button-size: var(--xh-control-
|
|
31
|
-
--xh-_float-button-glyph-size: var(--xh-glyph-size-
|
|
27
|
+
/* 触发器与展开列表里原生动作项的身量与字形尺,同一张表:md 取独立浮钮的直径(40px),
|
|
28
|
+
sm / lg 取方格档;字形比控件内图标低一档(sm / md 16px、lg 20px)。
|
|
29
|
+
原生动作项不是 Headless 部件、配方打不到它,触发器也读这两支私有槽,换档只改这里 */
|
|
30
|
+
--xh-_float-button-size: var(--xh-control-float-md);
|
|
31
|
+
--xh-_float-button-glyph-size: var(--xh-glyph-size-sm);
|
|
32
32
|
/* 作者塞进指示符槽的图标跟着尺寸档走,与皮肤画的兜底字形同一把尺 */
|
|
33
33
|
--xh-icon-size: var(--xh-float-button-icon-size, var(--xh-_float-button-glyph-size));
|
|
34
34
|
|
|
@@ -167,17 +167,15 @@
|
|
|
167
167
|
/* —— 尺寸:原生动作项与触发器的 floating 档逐档同表 —— */
|
|
168
168
|
.xh-scope-float-button[data-part='root'][data-size='sm'] {
|
|
169
169
|
--xh-_float-button-size: var(--xh-control-box-sm);
|
|
170
|
-
--xh-_float-button-glyph-size: var(--xh-glyph-size-sm);
|
|
171
170
|
}
|
|
172
171
|
|
|
173
172
|
.xh-scope-float-button[data-part='root'][data-size='md'] {
|
|
174
|
-
--xh-_float-button-size: var(--xh-control-
|
|
175
|
-
--xh-_float-button-glyph-size: var(--xh-glyph-size-md);
|
|
173
|
+
--xh-_float-button-size: var(--xh-control-float-md);
|
|
176
174
|
}
|
|
177
175
|
|
|
178
176
|
.xh-scope-float-button[data-part='root'][data-size='lg'] {
|
|
179
177
|
--xh-_float-button-size: var(--xh-control-box-lg);
|
|
180
|
-
--xh-_float-button-glyph-size: var(--xh-glyph-size-
|
|
178
|
+
--xh-_float-button-glyph-size: var(--xh-glyph-size-md);
|
|
181
179
|
}
|
|
182
180
|
|
|
183
181
|
/* —— 形态:给展开列表里原生动作项用的面 ——
|
|
@@ -201,7 +199,8 @@
|
|
|
201
199
|
--xh-_float-button-bg: var(--xh-_tone-subtle, var(--xh-bg-subtle-opaque));
|
|
202
200
|
--xh-_float-button-bg-hover: var(--xh-_tone-subtle-hover, var(--xh-bg-subtle-hover-opaque));
|
|
203
201
|
--xh-_float-button-bg-active: var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active-opaque));
|
|
204
|
-
|
|
202
|
+
/* 与形态矩阵 subtle 档的中性字同一支(次要字色),触发器与动作项一致 */
|
|
203
|
+
--xh-_float-button-fg: var(--xh-_tone-fg, var(--xh-fg-muted));
|
|
205
204
|
--xh-_float-button-border: transparent;
|
|
206
205
|
--xh-_float-button-border-hover: transparent;
|
|
207
206
|
--xh-_float-button-shadow: none;
|
|
@@ -228,8 +227,8 @@
|
|
|
228
227
|
}
|
|
229
228
|
|
|
230
229
|
/* —— 触发器 ——
|
|
231
|
-
浮在内容之上的单图标圆钮,接 Action Control floating
|
|
232
|
-
|
|
230
|
+
浮在内容之上的单图标圆钮,接 Action Control floating 档:圆形、四态面、按压与 44px 命中区
|
|
231
|
+
由家族配方按 data-xh-action-variant / -size 给出;视觉盒与字形取根上按档给的尺(与动作项同一张表)。
|
|
233
232
|
这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射 */
|
|
234
233
|
.xh-scope-float-button[data-part='trigger'] {
|
|
235
234
|
--xh-action-bg-rest: var(--xh-float-button-bg, var(--xh-_action-variant-bg-rest));
|
|
@@ -253,9 +252,20 @@
|
|
|
253
252
|
--xh-action-shadow-focus-visible: var(--xh-float-button-shadow, none);
|
|
254
253
|
--xh-action-shadow-disabled: var(--xh-float-button-shadow, none);
|
|
255
254
|
--xh-action-radius: var(--xh-float-button-radius, var(--xh-_action-profile-radius));
|
|
256
|
-
--xh-action-visual-size: var(--xh-float-button-size, var(--xh-
|
|
257
|
-
|
|
258
|
-
|
|
255
|
+
--xh-action-visual-size: var(--xh-float-button-size, var(--xh-_float-button-size));
|
|
256
|
+
--xh-action-min-inline-size: var(--xh-float-button-size, var(--xh-_float-button-size));
|
|
257
|
+
/* 作者塞进来的图标与皮肤画的兜底字形同一把尺 */
|
|
258
|
+
--xh-icon-size: var(--xh-float-button-icon-size, var(--xh-_float-button-glyph-size));
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* subtle 档:形态矩阵的淡底是半透明的墨色,钮钉在内容之上盖不住底下的字;触发器改读上面
|
|
262
|
+
不透明的那组淡底(与展开组里的原生动作项同一块面),写了语气仍是语气淡底 */
|
|
263
|
+
.xh-scope-float-button[data-part='root'][data-variant='subtle']
|
|
264
|
+
.xh-scope-float-button[data-part='trigger'] {
|
|
265
|
+
--xh-action-bg-rest: var(--xh-float-button-bg, var(--xh-_float-button-bg));
|
|
266
|
+
--xh-action-bg-hover: var(--xh-float-button-bg-hover, var(--xh-_float-button-bg-hover));
|
|
267
|
+
--xh-action-bg-pressed: var(--xh-float-button-bg-active, var(--xh-_float-button-bg-active));
|
|
268
|
+
--xh-action-bg-focus-visible: var(--xh-float-button-bg, var(--xh-_float-button-bg));
|
|
259
269
|
}
|
|
260
270
|
|
|
261
271
|
/* 缺省 outline 是 frosted 材质面:连接层只在这一档投影 data-xh-material,面由材质家族配方给——
|
|
@@ -178,7 +178,7 @@
|
|
|
178
178
|
flex: 1 1 auto;
|
|
179
179
|
overflow: hidden;
|
|
180
180
|
font-size: var(--xh-floating-panel-title-font-size, var(--xh-text-label-size));
|
|
181
|
-
font-weight: var(--xh-floating-panel-title-font-weight, var(--xh-font-weight-
|
|
181
|
+
font-weight: var(--xh-floating-panel-title-font-weight, var(--xh-font-weight-medium));
|
|
182
182
|
line-height: var(--xh-leading-tight);
|
|
183
183
|
white-space: nowrap;
|
|
184
184
|
text-overflow: ellipsis;
|
package/dist/css/form.css
CHANGED
|
@@ -17,19 +17,38 @@
|
|
|
17
17
|
--xh-form-skin: 1;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
/*
|
|
20
|
+
/* 表单是一列字段,root 就是那个原生 <form>。项距不走 gap:字段带辅助行(说明,或给错误文案留的那一行)时
|
|
21
|
+
那一行就是项距,没有辅助行的项才在下方补一段项距(见下面两条)。一行流档的项距另取一档 */
|
|
21
22
|
.xh-scope-form[data-part='root'] {
|
|
23
|
+
--xh-_form-item-gap: var(--xh-form-gap, var(--xh-space-5));
|
|
24
|
+
|
|
22
25
|
display: flex;
|
|
23
26
|
flex-direction: column;
|
|
24
|
-
gap:
|
|
27
|
+
row-gap: 0;
|
|
25
28
|
margin: 0;
|
|
26
29
|
}
|
|
27
30
|
|
|
31
|
+
/* 每一项在下方留一段项距,最后一项不留。:where() 不计特指度,作者给自己的节点写外边距照样压得过 */
|
|
32
|
+
:where(.xh-scope-form[data-part='root']) > :where(:not(:last-child)) {
|
|
33
|
+
margin-block-end: var(--xh-_form-item-gap);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* 字段带辅助行:辅助行(最小高 --xh-space-5)紧贴控件、自己就是项距,这一项不再另留;
|
|
37
|
+
说明收起、只留错误文案占位的那一行同样算。字段无效时它的直接子说明被收起(见 description.css),
|
|
38
|
+
不占那一行,不算辅助行:没渲染错误文案的无效字段照常留项距 */
|
|
39
|
+
.xh-scope-form[data-part='field-group']:has(
|
|
40
|
+
.xh-scope-field[data-part='error-text'],
|
|
41
|
+
.xh-scope-field[data-part='description']:not([hidden], .xh-scope-field[data-part='root'][data-invalid] > *)
|
|
42
|
+
) {
|
|
43
|
+
margin-block-end: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
28
46
|
/* 网格:字段排进等宽列,各列下限写 0,一段长文本不会把自己那列撑宽。
|
|
29
47
|
列数由 data-columns 逐档给,换档只改 --xh-_form-cols 这一个槽 */
|
|
30
48
|
.xh-scope-form[data-part='root'][data-layout='grid'] {
|
|
31
49
|
display: grid;
|
|
32
50
|
grid-template-columns: repeat(var(--xh-_form-cols), minmax(0, 1fr));
|
|
51
|
+
column-gap: var(--xh-form-gap, var(--xh-space-5));
|
|
33
52
|
|
|
34
53
|
--xh-_form-cols: 1;
|
|
35
54
|
}
|
|
@@ -41,9 +60,11 @@
|
|
|
41
60
|
|
|
42
61
|
/* 横排一行流:字段并肩排,放不下自动折行 */
|
|
43
62
|
.xh-scope-form[data-part='root'][data-layout='inline'] {
|
|
63
|
+
--xh-_form-item-gap: var(--xh-form-inline-row-gap, var(--xh-space-2));
|
|
64
|
+
|
|
44
65
|
flex-flow: row wrap;
|
|
45
66
|
align-items: start;
|
|
46
|
-
column-gap: var(--xh-form-inline-gap, var(--xh-space-
|
|
67
|
+
column-gap: var(--xh-form-inline-gap, var(--xh-space-6));
|
|
47
68
|
/* 一行流里字段按内容收,没有列宽可铺:在表单根上取下此处的字段缺省宽,交给下面的字段还原 */
|
|
48
69
|
--xh-_form-inline-control-w: var(--xh-control-w);
|
|
49
70
|
}
|
|
@@ -178,13 +199,6 @@
|
|
|
178
199
|
--xh-_form-span: 1 / -1;
|
|
179
200
|
}
|
|
180
201
|
|
|
181
|
-
/* 出错的字段在起始缘竖一条色带:读屏之外还得有一眼看得见的定位标记。
|
|
182
|
-
用逻辑属性,RTL 下自动换到右侧 */
|
|
183
|
-
.xh-scope-form[data-part='field-group'][data-invalid] {
|
|
184
|
-
padding-inline-start: var(--xh-form-field-invalid-px, var(--xh-space-2));
|
|
185
|
-
border-inline-start: var(--xh-stroke-thick) solid var(--xh-form-field-invalid-border, var(--xh-border-invalid));
|
|
186
|
-
}
|
|
187
|
-
|
|
188
202
|
/* 提交失败后的错误汇总。role=alert 常挂,靠 hidden 显隐 */
|
|
189
203
|
.xh-scope-form[data-part='error-summary'] {
|
|
190
204
|
display: flex;
|