@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
package/css/editable.css
CHANGED
|
@@ -26,9 +26,6 @@
|
|
|
26
26
|
--xh-_editable-font-size: var(--xh-control-font-md);
|
|
27
27
|
--xh-_editable-control-gap: 0;
|
|
28
28
|
|
|
29
|
-
/* 盒内那道分隔线的长度:取钮高的一半,线的上下各留一截空白,不与钮等高 */
|
|
30
|
-
--xh-_editable-divider-h: 50%;
|
|
31
|
-
|
|
32
29
|
display: inline-flex;
|
|
33
30
|
flex-direction: column;
|
|
34
31
|
gap: var(--xh-editable-gap, var(--xh-space-1));
|
|
@@ -61,7 +58,9 @@
|
|
|
61
58
|
}
|
|
62
59
|
|
|
63
60
|
[data-scope='editable'][data-part='label'] {
|
|
64
|
-
|
|
61
|
+
/* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-editable-label-gap 给多少最终就是多少 */
|
|
62
|
+
margin-block-end: calc(var(--xh-editable-label-gap, var(--xh-space-2)) - var(--xh-editable-gap, var(--xh-space-1)));
|
|
63
|
+
color: var(--xh-editable-label-fg, var(--xh-fg-muted));
|
|
65
64
|
font-size: var(--xh-editable-label-font-size, var(--xh-text-label-size));
|
|
66
65
|
font-weight: var(--xh-editable-label-font-weight, var(--xh-text-label-weight));
|
|
67
66
|
/* 点标题会把人送进编辑态(预览态下 for 指着的输入框是收起的,点了没反应),
|
|
@@ -70,7 +69,7 @@
|
|
|
70
69
|
}
|
|
71
70
|
|
|
72
71
|
[data-scope='editable'][data-part='label'][data-disabled] {
|
|
73
|
-
color: var(--xh-editable-label-fg-disabled, var(--xh-fg-
|
|
72
|
+
color: var(--xh-editable-label-fg-disabled, var(--xh-fg-muted));
|
|
74
73
|
}
|
|
75
74
|
|
|
76
75
|
/* 预览区只是 control 里的内容段,不再自成一只带圆角的盒子。 */
|
|
@@ -165,8 +164,6 @@
|
|
|
165
164
|
--xh-field-border-focus: var(--xh-editable-control-border-focus, var(--xh-_field-variant-border-focus));
|
|
166
165
|
--xh-field-border-invalid: var(--xh-editable-control-border-invalid, var(--xh-_field-variant-border-invalid));
|
|
167
166
|
--xh-field-border-disabled: var(--xh-editable-control-border-disabled, var(--xh-_field-variant-border-disabled));
|
|
168
|
-
--xh-field-ring-focus: var(--xh-ring-focus);
|
|
169
|
-
--xh-field-ring-invalid: var(--xh-ring-invalid);
|
|
170
167
|
--xh-field-shadow-rest: var(--xh-editable-control-shadow, none);
|
|
171
168
|
/* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
|
|
172
169
|
--xh-field-glyph-size: var(--xh-editable-icon-size, var(--xh-_field-size-glyph-size));
|
|
@@ -179,9 +176,10 @@
|
|
|
179
176
|
display: none;
|
|
180
177
|
}
|
|
181
178
|
|
|
182
|
-
/*
|
|
183
|
-
|
|
184
|
-
|
|
179
|
+
/* 三颗动作是 control 内部的分段:inset 圆角、按承载面取的悬停 / 按下阶梯、粗指针热区、
|
|
180
|
+
:focus-visible 关环与禁用面全由 Action Control 的 field-inset ghost 档给,组件只映射既有覆盖槽。
|
|
181
|
+
视觉盒按字段内钮尺寸表随字段档(sm 取控件内动作档、md 取 control-h-sm、lg 取 control-h-md),
|
|
182
|
+
由 field-inset 档按 data-xh-action-size 给;常态只剩符号、取次要前景,悬停与按下才浮出底色 */
|
|
185
183
|
[data-scope='editable'][data-part='edit-trigger'],
|
|
186
184
|
[data-scope='editable'][data-part='submit-trigger'],
|
|
187
185
|
[data-scope='editable'][data-part='cancel-trigger'] {
|
|
@@ -193,7 +191,7 @@
|
|
|
193
191
|
--xh-action-bg-hover: var(--xh-editable-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
194
192
|
--xh-action-bg-pressed: var(--xh-editable-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
195
193
|
--xh-action-bg-disabled: var(--xh-editable-trigger-bg-disabled, var(--xh-_action-variant-bg-disabled));
|
|
196
|
-
--xh-action-fg-rest: var(--xh-editable-trigger-fg, var(--xh-fg-
|
|
194
|
+
--xh-action-fg-rest: var(--xh-editable-trigger-fg, var(--xh-fg-muted));
|
|
197
195
|
--xh-action-fg-hover: var(--xh-editable-trigger-fg-hover, var(--xh-fg-default));
|
|
198
196
|
--xh-action-border-rest: transparent;
|
|
199
197
|
--xh-action-highlight-rest: transparent;
|
|
@@ -213,6 +211,12 @@
|
|
|
213
211
|
margin-inline-start: auto;
|
|
214
212
|
}
|
|
215
213
|
|
|
214
|
+
/* 确认与取消两颗挨着:紧凑 sm 档钮只有 20px,两钮中心距凑不够 24px 就落不进 SC 2.5.8 的间距例外,
|
|
215
|
+
两颗之间隔一格 --xh-space-1;其余档钮不低于 24px,这一格只把两块悬停面分开 */
|
|
216
|
+
[data-scope='editable'][data-part='cancel-trigger'] {
|
|
217
|
+
margin-inline-start: var(--xh-space-1);
|
|
218
|
+
}
|
|
219
|
+
|
|
216
220
|
/* 三颗动作默认是纯图标按钮;作者放了自己的图标后 :empty 不命中,不会叠两层。 */
|
|
217
221
|
[data-scope='editable']:is([data-part='edit-trigger'], [data-part='submit-trigger'], [data-part='cancel-trigger']):empty::before {
|
|
218
222
|
content: '';
|
|
@@ -236,27 +240,6 @@
|
|
|
236
240
|
--xh-_editable-trigger-glyph: var(--xh-glyph-mark-close);
|
|
237
241
|
}
|
|
238
242
|
|
|
239
|
-
/* 动作组第一颗与内容段之间只有一道短分隔线;确认与取消之间不再拼第二个按钮框。
|
|
240
|
-
线不画在钮的边框上:边框会跟着钮的圆角与悬停底走,而这道线要独立于钮的各态,长度也短于钮自己。
|
|
241
|
-
::before 已被兜底字形占着,::after 在粗指针下是家族给的 44px 热区,几何只能落在
|
|
242
|
-
background-image 上:一条 1px × 半高的渐变贴在逻辑起始侧,底色换态时它仍叠在上层。
|
|
243
|
-
background-position 是物理轴,RTL 另给一条换边 */
|
|
244
|
-
[data-scope='editable'][data-part='edit-trigger'],
|
|
245
|
-
[data-scope='editable'][data-part='submit-trigger'] {
|
|
246
|
-
background-image: linear-gradient(
|
|
247
|
-
var(--xh-editable-trigger-divider, var(--xh-material-soft-separator)),
|
|
248
|
-
var(--xh-editable-trigger-divider, var(--xh-material-soft-separator))
|
|
249
|
-
);
|
|
250
|
-
background-repeat: no-repeat;
|
|
251
|
-
background-position: 0 50%;
|
|
252
|
-
background-size: var(--xh-stroke-thin) var(--xh-editable-trigger-divider-h, var(--xh-_editable-divider-h));
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
[dir='rtl'] [data-scope='editable'][data-part='edit-trigger'],
|
|
256
|
-
[dir='rtl'] [data-scope='editable'][data-part='submit-trigger'] {
|
|
257
|
-
background-position: 100% 50%;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
243
|
/* 三颗按钮按形态轮流收起,连接层给的是 hidden 属性;
|
|
261
244
|
家族那条 display 已把 UA 规则盖掉,少了这里三条按钮就一直杵着 */
|
|
262
245
|
[data-scope='editable'][data-part='edit-trigger'][hidden],
|
|
@@ -265,15 +248,6 @@
|
|
|
265
248
|
display: none;
|
|
266
249
|
}
|
|
267
250
|
|
|
268
|
-
/* 高对比档整层丢弃 background-image,分隔线改用系统色重画,并关掉这两颗钮的强制换色 */
|
|
269
|
-
@media (forced-colors: active) {
|
|
270
|
-
[data-scope='editable'][data-part='edit-trigger'],
|
|
271
|
-
[data-scope='editable'][data-part='submit-trigger'] {
|
|
272
|
-
background-image: linear-gradient(ButtonText, ButtonText);
|
|
273
|
-
forced-color-adjust: none;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
251
|
@media (forced-colors: active) {
|
|
278
252
|
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
279
253
|
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
package/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
|
+
[data-scope='empty-state'][data-part='root'][data-tone] [data-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
|
+
[data-scope='empty-state'][data-part='title'] + [data-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
|
[data-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/css/field-array.css
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/* 新增的行进场,同一批按到达顺序错开;首帧就在的直接呈现(自己或根节点带 data-instant) */
|
|
45
|
-
[data-scope='field-array'][data-part='item']:not([data-instant], [data-instant] >
|
|
45
|
+
[data-scope='field-array'][data-part='item']:not([data-instant], [data-instant] > :where([data-scope='field-array'])) {
|
|
46
46
|
animation: xh-item-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
|
|
47
47
|
animation-delay: calc(var(--xh-_stagger-index, 0) * var(--xh-motion-stagger-step));
|
|
48
48
|
}
|
|
@@ -72,8 +72,11 @@
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
/* 行里放什么控件归作者,这里只给它一条能撑开也能收窄的轨道。
|
|
75
|
-
min-inline-size 归零:不写的话里面的输入框按 UA
|
|
75
|
+
min-inline-size 归零:不写的话里面的输入框按 UA 默认宽度顶住,长内容会把整行撑破。
|
|
76
|
+
字段族控件放进来铺满这条轨道,与放进 Field 时一样;并排几个就平分,各自的压缩底线照旧 */
|
|
76
77
|
[data-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/css/field.css
CHANGED
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
[data-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
|
[data-scope='form'][data-part='root'][data-layout='horizontal'] [data-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
|
[data-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
|
-
[data-scope='field'][data-part='label'][data-required]::
|
|
81
|
+
/* 必填星号的字形、字号、间距与默认色在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
82
|
+
[data-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
|
[data-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
|
[data-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
|
[data-scope='field'][data-part='root']:not(:has(> [data-scope='field'][data-part='description']:not([hidden])))
|
|
150
148
|
> [data-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/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
|
[data-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([data-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
|
+
[data-scope='fieldset'][data-part='root'] > :is([data-scope='field'][data-part='root'], [data-scope='fieldset'][data-part='field-group']):has(
|
|
40
|
+
[data-scope='field'][data-part='error-text'],
|
|
41
|
+
[data-scope='field'][data-part='description']:not([hidden], [data-scope='field'][data-part='root'][data-invalid] > *)
|
|
42
|
+
) {
|
|
43
|
+
margin-block-end: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
27
46
|
[data-scope='fieldset'][data-part='root'][hidden] {
|
|
28
47
|
display: none;
|
|
29
48
|
}
|
|
30
49
|
|
|
31
50
|
[data-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
|
[data-scope='fieldset'][data-part='root'] > [data-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
|
-
[data-scope='fieldset'][data-part='legend'][data-required]::
|
|
75
|
+
/* 必填星号的字形、字号、间距与默认色在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
76
|
+
[data-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
|
[data-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
|
[data-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/css/file-upload.css
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
[data-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
|
[data-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
|
[data-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
|
[data-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
|
[data-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
|
[data-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
|
[data-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
|
[data-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
|
[data-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
|
}
|
|
@@ -184,7 +191,7 @@
|
|
|
184
191
|
transition: translate var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
185
192
|
}
|
|
186
193
|
|
|
187
|
-
[data-scope='file-upload'][data-part='item']:not([data-instant], [data-instant] >
|
|
194
|
+
[data-scope='file-upload'][data-part='item']:not([data-instant], [data-instant] > :where([data-scope='file-upload'])) {
|
|
188
195
|
animation: xh-item-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
|
|
189
196
|
animation-delay: calc(var(--xh-_stagger-index, 0) * var(--xh-motion-stagger-step));
|
|
190
197
|
}
|
|
@@ -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
|
[data-scope='file-upload'][data-part='item'][data-state='error'],
|
|
213
221
|
[data-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
|
+
[data-scope='file-upload'][data-part='item'][data-state='error'] > [data-part='item-name']:where([data-scope='file-upload']),
|
|
230
|
+
[data-scope='file-upload'][data-part='item'][data-state='closed']:has(> [data-part='item-progress'][data-state='error']) > [data-part='item-name']:where([data-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
|
[data-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
|
+
[data-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
|
[data-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
|
[data-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
|
+
[data-scope='file-upload'][data-part='item-preview']:empty::before {
|
|
450
|
+
forced-color-adjust: none;
|
|
451
|
+
background-color: CanvasText;
|
|
452
|
+
}
|
|
453
|
+
|
|
421
454
|
[data-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
|
}
|