@xihan-ui/styles 3.1.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +470 -0
- package/component-tokens.d.ts +230 -60
- package/components.tokens.json +5156 -1557
- package/css/accordion.css +47 -20
- package/css/alert.css +16 -17
- package/css/anchor.css +2 -2
- package/css/approval.css +41 -17
- package/css/avatar-group.css +9 -12
- package/css/avatar.css +20 -18
- package/css/back-top.css +21 -7
- package/css/badge.css +5 -5
- package/css/breadcrumb.css +18 -16
- package/css/button-group.css +4 -6
- package/css/button.css +13 -12
- package/css/calendar-picker.css +178 -95
- package/css/calendar-range-picker.css +207 -122
- package/css/card.css +34 -6
- package/css/carousel.css +94 -46
- package/css/cartesian-chart.css +11 -11
- package/css/cascader.css +51 -39
- package/css/checkbox-group.css +9 -6
- package/css/checkbox.css +5 -4
- package/css/citation.css +9 -4
- package/css/clipboard.css +20 -4
- package/css/code-view.css +6 -6
- package/css/collapsible.css +29 -14
- package/css/color-field.css +4 -4
- package/css/color-picker.css +77 -23
- package/css/color-slider.css +10 -8
- package/css/color-swatch-picker.css +14 -9
- package/css/combobox.css +26 -14
- package/css/command.css +14 -9
- package/css/context-menu.css +10 -5
- package/css/date-field.css +12 -6
- package/css/date-picker.css +178 -109
- package/css/date-range-picker.css +199 -130
- package/css/description.css +10 -6
- package/css/descriptions.css +47 -19
- package/css/dialog.css +50 -35
- package/css/diff-view.css +8 -8
- package/css/drawer.css +75 -21
- package/css/editable.css +15 -41
- package/css/empty-state.css +21 -3
- package/css/field-array.css +5 -2
- package/css/field.css +17 -18
- package/css/fieldset.css +33 -13
- package/css/file-upload.css +66 -33
- package/css/float-button.css +60 -35
- package/css/floating-panel.css +1 -1
- package/css/form.css +30 -16
- package/css/graph-chart.css +2 -2
- package/css/grid-list.css +1 -1
- package/css/highlight.css +5 -5
- package/css/hover-card.css +19 -12
- package/css/image-viewer.css +77 -27
- package/css/image.css +13 -5
- package/css/infinite-scroll.css +8 -4
- package/css/input-group.css +74 -26
- package/css/kbd.css +1 -1
- package/css/label.css +27 -11
- package/css/layout.css +17 -10
- package/css/list.css +13 -9
- package/css/listbox.css +12 -7
- package/css/loading-bar.css +3 -0
- package/css/mention.css +11 -9
- package/css/menu.css +10 -5
- package/css/menubar.css +13 -8
- package/css/message-feed.css +1 -1
- package/css/navigation-menu.css +2 -2
- package/css/notification.css +132 -49
- package/css/number-animation.css +2 -2
- package/css/number-field.css +75 -52
- package/css/page-header.css +64 -27
- package/css/pagination.css +35 -38
- package/css/password-input.css +12 -68
- package/css/pin-input.css +18 -26
- package/css/popconfirm.css +23 -14
- package/css/popover.css +18 -12
- package/css/progress.css +14 -13
- package/css/prompt-input.css +3 -3
- package/css/question-flow.css +41 -15
- package/css/radar-chart.css +6 -6
- package/css/radio-group.css +120 -55
- package/css/rating.css +32 -15
- package/css/select.css +16 -12
- package/css/separator.css +24 -6
- package/css/side-nav.css +29 -24
- package/css/signature-pad.css +23 -9
- package/css/skeleton.css +12 -12
- package/css/slider.css +77 -48
- package/css/sortable.css +2 -2
- package/css/sparkline.css +8 -2
- package/css/spinner.css +40 -20
- package/css/statistic.css +14 -14
- package/css/steps.css +115 -84
- package/css/switch.css +9 -7
- package/css/table.css +29 -12
- package/css/tabs.css +35 -12
- package/css/tag-group.css +17 -6
- package/css/tag.css +54 -29
- package/css/tags-input.css +39 -20
- package/css/text-field.css +5 -5
- package/css/time-field.css +4 -4
- package/css/time-picker.css +150 -64
- package/css/time-range-picker.css +91 -62
- package/css/timeline.css +37 -20
- package/css/timer.css +3 -3
- package/css/toggle-group.css +4 -4
- package/css/tool-call.css +13 -11
- package/css/toolbar.css +6 -5
- package/css/tooltip.css +16 -17
- package/css/tour.css +14 -7
- package/css/transfer.css +22 -16
- package/css/tree-select.css +12 -12
- package/css/tree.css +26 -25
- package/css/typography.css +28 -25
- package/dist/css/accordion.css +296 -0
- package/dist/css/affix.css +47 -0
- package/dist/css/alert.css +246 -0
- package/dist/css/anchor.css +252 -0
- package/dist/css/approval.css +525 -0
- package/dist/css/avatar-group.css +96 -0
- package/dist/css/avatar.css +100 -0
- package/dist/css/back-top.css +175 -0
- package/dist/css/badge.css +205 -0
- package/dist/css/bar-code.css +62 -0
- package/dist/css/breadcrumb.css +232 -0
- package/dist/css/button-group.css +261 -0
- package/dist/css/button.css +216 -0
- package/dist/css/calendar-picker.css +550 -0
- package/dist/css/calendar-range-picker.css +639 -0
- package/dist/css/card.css +249 -0
- package/dist/css/carousel.css +726 -0
- package/dist/css/cartesian-chart.css +830 -0
- package/dist/css/cascader.css +973 -0
- package/dist/css/checkbox-group.css +361 -0
- package/dist/css/checkbox.css +258 -0
- package/dist/css/citation.css +475 -0
- package/dist/css/clipboard.css +331 -0
- package/dist/css/code-view.css +374 -0
- package/dist/css/collapsible.css +200 -0
- package/dist/css/color-field.css +176 -0
- package/dist/css/color-picker.css +649 -0
- package/dist/css/color-slider.css +283 -0
- package/dist/css/color-swatch-picker.css +250 -0
- package/dist/css/color-swatch.css +35 -0
- package/dist/css/combobox.css +578 -0
- package/dist/css/command.css +404 -0
- package/dist/css/context-menu.css +425 -0
- package/dist/css/date-field.css +317 -0
- package/dist/css/date-picker.css +931 -0
- package/dist/css/date-range-picker.css +949 -0
- package/dist/css/description.css +71 -0
- package/dist/css/descriptions.css +327 -0
- package/dist/css/dialog.css +470 -0
- package/dist/css/diff-view.css +513 -0
- package/dist/css/download-trigger.css +151 -0
- package/dist/css/drawer.css +606 -0
- package/dist/css/editable.css +269 -0
- package/dist/css/empty-state.css +181 -0
- package/dist/css/field-array.css +229 -0
- package/dist/css/field.css +165 -0
- package/dist/css/fieldset.css +122 -0
- package/dist/css/file-upload.css +462 -0
- package/dist/css/flex.css +441 -0
- package/dist/css/float-button.css +579 -0
- package/dist/css/floating-panel.css +429 -0
- package/dist/css/focus.css +46 -0
- package/dist/css/forced-colors.css +93 -0
- package/dist/css/form.css +407 -0
- package/dist/css/funnel-chart.css +106 -0
- package/dist/css/graph-chart.css +205 -0
- package/dist/css/grid-list.css +235 -0
- package/dist/css/grid.css +1201 -0
- package/dist/css/heatmap.css +552 -0
- package/dist/css/hierarchy-chart.css +298 -0
- package/dist/css/highlight.css +41 -0
- package/dist/css/hover-card.css +233 -0
- package/dist/css/icon.css +225 -0
- package/dist/css/image-cropper.css +373 -0
- package/dist/css/image-viewer.css +588 -0
- package/dist/css/image.css +106 -0
- package/dist/css/infinite-scroll.css +81 -0
- package/dist/css/input-group.css +323 -0
- package/dist/css/json-viewer.css +379 -0
- package/dist/css/kbd.css +72 -0
- package/dist/css/label.css +94 -0
- package/dist/css/layers.css +7 -0
- package/dist/css/layout.css +379 -0
- package/dist/css/liquid.css +106 -0
- package/dist/css/list.css +156 -0
- package/dist/css/listbox.css +395 -0
- package/dist/css/loading-bar.css +144 -0
- package/dist/css/log.css +306 -0
- package/dist/css/markdown-stream.css +149 -0
- package/dist/css/marquee.css +378 -0
- package/dist/css/masonry.css +70 -0
- package/dist/css/matrix-code.css +67 -0
- package/dist/css/mention.css +395 -0
- package/dist/css/menu.css +369 -0
- package/dist/css/menubar.css +461 -0
- package/dist/css/message-feed.css +318 -0
- package/dist/css/navigation-menu.css +513 -0
- package/dist/css/notification.css +865 -0
- package/dist/css/number-animation.css +44 -0
- package/dist/css/number-field.css +275 -0
- package/dist/css/overlay-arrow.css +56 -0
- package/dist/css/page-header.css +221 -0
- package/dist/css/pagination.css +447 -0
- package/dist/css/password-input.css +335 -0
- package/dist/css/pie-chart.css +247 -0
- package/dist/css/pin-input.css +191 -0
- package/dist/css/pointer.css +36 -0
- package/dist/css/popconfirm.css +329 -0
- package/dist/css/popover.css +285 -0
- package/dist/css/progress.css +502 -0
- package/dist/css/prompt-input.css +260 -0
- package/dist/css/question-flow.css +579 -0
- package/dist/css/radar-chart.css +233 -0
- package/dist/css/radio-group.css +663 -0
- package/dist/css/rating.css +311 -0
- package/dist/css/reasoning.css +343 -0
- package/dist/css/reset.css +117 -0
- package/dist/css/resizable.css +242 -0
- package/dist/css/sankey-chart.css +174 -0
- package/dist/css/scroll-area.css +240 -0
- package/dist/css/scrollbar.css +204 -0
- package/dist/css/select.css +616 -0
- package/dist/css/separator.css +140 -0
- package/dist/css/side-nav.css +481 -0
- package/dist/css/signature-pad.css +193 -0
- package/dist/css/skeleton.css +161 -0
- package/dist/css/slider.css +403 -0
- package/dist/css/sortable.css +228 -0
- package/dist/css/sparkline.css +170 -0
- package/dist/css/spinner.css +256 -0
- package/dist/css/splitter.css +159 -0
- package/dist/css/statistic.css +137 -0
- package/dist/css/steps.css +658 -0
- package/dist/css/switch.css +353 -0
- package/dist/css/table.css +1162 -0
- package/dist/css/tabs.css +967 -0
- package/dist/css/tag-group.css +258 -0
- package/dist/css/tag.css +335 -0
- package/dist/css/tags-input.css +341 -0
- package/dist/css/text-field.css +197 -0
- package/dist/css/time-field.css +277 -0
- package/dist/css/time-picker.css +793 -0
- package/dist/css/time-range-picker.css +775 -0
- package/dist/css/timeline.css +440 -0
- package/dist/css/timer.css +123 -0
- package/dist/css/timestamp.css +34 -0
- package/dist/css/toggle-group.css +424 -0
- package/dist/css/toggle.css +146 -0
- package/dist/css/tone.css +189 -0
- package/dist/css/tool-call.css +431 -0
- package/dist/css/toolbar.css +366 -0
- package/dist/css/tooltip.css +217 -0
- package/dist/css/tour.css +446 -0
- package/dist/css/transfer.css +644 -0
- package/dist/css/tree-select.css +878 -0
- package/dist/css/tree.css +734 -0
- package/dist/css/truncate.css +108 -0
- package/dist/css/typography.css +475 -0
- package/dist/css/undefined.css +58 -0
- package/dist/css/virtualizer.css +166 -0
- package/dist/css/visually-hidden.css +20 -0
- package/dist/css/watermark.css +82 -0
- package/dist/family/action-control.css +493 -0
- package/dist/family/chart.css +537 -0
- package/dist/family/check-mark.css +94 -0
- package/dist/family/choice-card.css +97 -0
- package/dist/family/collection-item.css +768 -0
- package/dist/family/field-chrome.css +296 -0
- package/dist/family/loading-ring.css +102 -0
- package/dist/family/material.css +72 -0
- package/dist/family/menu-choice.css +56 -0
- package/dist/family/motion.css +363 -0
- package/dist/family/swatch.css +59 -0
- package/dist/family/tag-list.css +65 -0
- package/family/action-control.css +33 -36
- package/family/chart.css +57 -0
- package/family/collection-item.css +12 -8
- package/family/field-chrome.css +28 -19
- package/family/loading-ring.css +20 -13
- package/family/swatch.css +4 -4
- package/family/tag-list.css +6 -0
- package/index.css +10349 -8756
- package/index.unlayered.css +10350 -8758
- package/package.json +165 -164
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* 定义 field 样式。 */
|
|
7
|
+
|
|
8
|
+
/* Field 独立皮肤同时传递引入字段视觉盒;full bundle 递归去重。 */
|
|
9
|
+
@import '../family/field-chrome.css';
|
|
10
|
+
|
|
11
|
+
@layer xihan.components {
|
|
12
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
13
|
+
.xh-scope-field {
|
|
14
|
+
--xh-field-skin: 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.xh-scope-field[data-part='root'] {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
/* 说明与错误文案紧贴控件:那一行辅助行自己有最小高(description.css),在表单里就是项距 */
|
|
21
|
+
gap: var(--xh-field-gap, var(--xh-space-0));
|
|
22
|
+
/* 字段族控件放进字段即铺满字段宽:字段的宽由表单的列给,控件跟着列走,
|
|
23
|
+
不必逐个组件在根上写 inline-size: 100%。单独摆放的控件仍是 16rem 缺省宽;
|
|
24
|
+
单类钉宽(--xh-<组件>-control-w)照旧压过这一条 */
|
|
25
|
+
--xh-control-w: 100%;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* 表单横排(标签左置):字段转两列网格,标签列宽由表单的 --xh-form-label-w 统一给,
|
|
29
|
+
整表据此对齐;描述与错误文案跟着控件走第二列 */
|
|
30
|
+
.xh-scope-form[data-part='root'][data-layout='horizontal'] .xh-scope-field[data-part='root'] {
|
|
31
|
+
display: grid;
|
|
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));
|
|
34
|
+
align-items: start;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.xh-scope-form[data-part='root'][data-layout='horizontal'] .xh-scope-field[data-part='label'] {
|
|
38
|
+
grid-column: 1;
|
|
39
|
+
justify-self: end;
|
|
40
|
+
/* 横排下标签与控件是左右两列,间距归 --xh-field-label-gap 管,竖排那段补白在这儿清零 */
|
|
41
|
+
margin-block-end: 0;
|
|
42
|
+
/* 与控件的首行文字对齐:行高保持正文行距(标签折行时每行不会撑成一个控件高),
|
|
43
|
+
上下留白把单行文本盒撑到控件高度;配的是哪一档控件由 --xh-field-control-h 告诉它 */
|
|
44
|
+
line-height: var(--xh-field-label-leading, var(--xh-leading-normal));
|
|
45
|
+
/* 级联兜底:先写一行的高度算式(标签字号 × 标签行距),再写 1lh。
|
|
46
|
+
1lh 晚于本库声明的浏览器地板,取不到时旧引擎丢掉后一条、留下前一条。
|
|
47
|
+
两条取的是同一组槽——字号来自本文件里标签那条 font-size、行距来自紧邻上一行,
|
|
48
|
+
所以算出来是同一个数,使用者覆盖任一槽两条一起跟着走。 */
|
|
49
|
+
padding-block: calc((var(--xh-field-control-h, var(--xh-control-h-md)) - var(--xh-field-label-font-size, var(--xh-text-label-size)) * var(--xh-field-label-leading, var(--xh-leading-normal))) / 2);
|
|
50
|
+
padding-block: calc((var(--xh-field-control-h, var(--xh-control-h-md)) - 1lh) / 2);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.xh-scope-form[data-part='root'][data-layout='horizontal'][data-label-align='start'] .xh-scope-field[data-part='label'] {
|
|
54
|
+
justify-self: start;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.xh-scope-form[data-part='root'][data-layout='horizontal'] .xh-scope-field[data-part='root'] > :not([data-part='label']) {
|
|
58
|
+
grid-column: 2;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.xh-scope-field[data-part='label'] {
|
|
62
|
+
/* 一段不带空格的长标识(字段名、英文标识符)在窄处从词内断开:
|
|
63
|
+
横排表单里标签列是一段比例宽度,这行让标签在那一列里折行,而不是从列的左边顶出去 */
|
|
64
|
+
overflow-wrap: anywhere;
|
|
65
|
+
/* 竖排时标签与控件之间的距离:容器的 gap 之上补一段差值,
|
|
66
|
+
--xh-field-label-gap-block 给多少最终就是多少,与描述、错误文案那两段(归 --xh-field-gap)各管各的 */
|
|
67
|
+
margin-block-end: calc(
|
|
68
|
+
var(--xh-field-label-gap-block, var(--xh-space-2)) - var(--xh-field-gap, var(--xh-space-0))
|
|
69
|
+
);
|
|
70
|
+
color: var(--xh-field-label-fg, var(--xh-fg-muted));
|
|
71
|
+
font-size: var(--xh-field-label-font-size, var(--xh-text-label-size));
|
|
72
|
+
font-weight: var(--xh-field-label-font-weight, var(--xh-text-label-weight));
|
|
73
|
+
/* 转无效或转禁用时标签换色,两档之间接一段过渡(与字段集组标题同一档) */
|
|
74
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.xh-scope-field[data-part='label'][data-disabled] {
|
|
78
|
+
color: var(--xh-field-label-fg-disabled, var(--xh-fg-muted));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* 必填星号的字形、字号、间距与默认色在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
82
|
+
.xh-scope-field[data-part='label'][data-required]::before {
|
|
83
|
+
color: var(--xh-field-label-star, var(--xh-fg-danger));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* control 是作者自己的输入控件,它自身就是视觉盒:描边、底、影、圆角与悬停 / 聚焦 / 无效 /
|
|
87
|
+
只读 / 禁用各态由 Field Chrome 家族配方按连接层投影的 data-xh-field-chrome 画,
|
|
88
|
+
这里只把既有使用者槽映射到家族桥接槽。Field 没有 size 轴,尺寸私有槽按连接层固定投的 md 档取值。
|
|
89
|
+
使用者槽与桥接槽同在 --xh-field- 前缀下:圆角那一位(--xh-field-control-radius)与家族读的桥接槽同名,
|
|
90
|
+
使用者写它即被家族直接读到,无法再经映射中转,圆角在这里按同一槽同一缺省直接声明(与家族算出的值一致,
|
|
91
|
+
只为把这一位使用者槽留在皮肤的消费位上);其余各位逐条对齐,不与桥接槽撞名 */
|
|
92
|
+
.xh-scope-field[data-part='control'] {
|
|
93
|
+
--xh-field-control-height: var(--xh-field-control-h, var(--xh-_field-size-control-height));
|
|
94
|
+
--xh-field-control-padding-inline: var(--xh-field-control-px, var(--xh-_field-size-padding-inline));
|
|
95
|
+
--xh-field-bg-rest: var(--xh-field-control-bg, var(--xh-_field-variant-bg-rest));
|
|
96
|
+
--xh-field-bg-hover: var(--xh-field-control-bg-hover, var(--xh-_field-variant-bg-hover));
|
|
97
|
+
--xh-field-bg-read-only: var(--xh-field-control-bg-readonly, var(--xh-_field-variant-bg-read-only));
|
|
98
|
+
--xh-field-bg-disabled: var(--xh-field-control-bg-disabled, var(--xh-_field-variant-bg-disabled));
|
|
99
|
+
--xh-field-fg-rest: var(--xh-field-control-fg, var(--xh-fg-default));
|
|
100
|
+
--xh-field-border-rest: var(--xh-field-control-border, var(--xh-_field-variant-border-rest));
|
|
101
|
+
--xh-field-border-hover: var(--xh-field-control-border-hover, var(--xh-_field-variant-border-hover));
|
|
102
|
+
--xh-field-border-focus: var(--xh-field-control-border-focus, var(--xh-_field-variant-border-focus));
|
|
103
|
+
--xh-field-border-invalid: var(--xh-field-control-border-invalid, var(--xh-_field-variant-border-invalid));
|
|
104
|
+
/* 焦点环与家族同一支公共环,不再留逐组件的环色槽(焦点边与环一律公共) */
|
|
105
|
+
--xh-field-shadow-rest: var(--xh-field-control-shadow, none);
|
|
106
|
+
|
|
107
|
+
inline-size: 100%;
|
|
108
|
+
border-radius: var(--xh-field-control-radius, var(--xh-shape-control));
|
|
109
|
+
/* 家族 chrome 不设字号:控件自身就是盒,正文字号由这里给 */
|
|
110
|
+
font-size: var(--xh-field-control-font-size, var(--xh-text-body-size));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* 无效标签色的默认在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
114
|
+
.xh-scope-field[data-part='label'][data-invalid] {
|
|
115
|
+
color: var(--xh-field-label-fg-invalid, var(--xh-fg-danger));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* 说明与错误文案的角色(外边距、行距、默认字号与字色)在 description.css 公共层;
|
|
119
|
+
这里只把字色与字号接到本组件的覆盖槽上 */
|
|
120
|
+
.xh-scope-field[data-part='description'] {
|
|
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));
|
|
123
|
+
/* 与标签同一档过渡:整个字段转禁用时两处一起变淡 */
|
|
124
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.xh-scope-field[data-part='description'][data-disabled] {
|
|
128
|
+
color: var(--xh-field-description-fg-disabled, var(--xh-fg-subtle));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.xh-scope-field[data-part='error-text'] {
|
|
132
|
+
color: var(--xh-field-error-fg, var(--xh-fg-danger));
|
|
133
|
+
font-size: var(--xh-field-error-font-size, var(--xh-text-caption-size));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* 辅助文字那一行的占位:字段渲染了错误文案、当前又没在报错时,收起的错误文案自己留在流里占住一行
|
|
137
|
+
(不可见、不进可及树),与报错时的错误文案等高。字段的外框高度前后一样,表单不会因为一段错误文字
|
|
138
|
+
重新排版,定高或限高的父级里也不会把控件挤出去;退场就在这一行里淡出,播完才藏起。
|
|
139
|
+
|
|
140
|
+
没有在场的 description 才这样占:描述已经占着这一行了,报错时由描述让位给错误文案(见 description.css),
|
|
141
|
+
收起的错误文案按公共层不占位。没渲染错误文案的字段本来就没有这一行。
|
|
142
|
+
|
|
143
|
+
高度取辅助行的最小高与错误文案一行(字号乘行距)里大的那个,得到的正是它报错时的高度。
|
|
144
|
+
不写 1lh:那个单位晚于本库声明的浏览器地板,取不到时整条声明被丢弃、占位高退回 0,
|
|
145
|
+
字段又会随报错撑高一次,而这种失效不报错。
|
|
146
|
+
与前一块的距离由根的 gap 给,和错误文案顶上来时是同一段;横排表单里它与别的子块一样落在控件那一列。 */
|
|
147
|
+
.xh-scope-field[data-part='root']:not(:has(> .xh-scope-field[data-part='description']:not([hidden])))
|
|
148
|
+
> .xh-scope-field[data-part='error-text'][hidden] {
|
|
149
|
+
position: static;
|
|
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))
|
|
153
|
+
);
|
|
154
|
+
transition:
|
|
155
|
+
opacity var(--xh-motion-duration-exit) var(--xh-motion-ease-exit),
|
|
156
|
+
visibility 0s var(--xh-motion-duration-exit);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
160
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
161
|
+
.xh-scope-field[data-part='root'][hidden],
|
|
162
|
+
.xh-scope-form[data-part='root'][hidden] {
|
|
163
|
+
display: none;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* 定义 fieldset 样式。 */
|
|
7
|
+
|
|
8
|
+
@layer xihan.components {
|
|
9
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
10
|
+
.xh-scope-fieldset {
|
|
11
|
+
--xh-fieldset-skin: 1;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* 抹掉 UA 给 <fieldset> 的边框、内外边距与 min-content 下限,间距全部改由令牌给。
|
|
15
|
+
display 落在 fieldset 的匿名内容盒上:首个 <legend> 不在这个盒子里,
|
|
16
|
+
legend 与内容之间的留白由 legend 自己的下外边距给。
|
|
17
|
+
组内项距与 Form 同一套,不走 gap:字段带辅助行(说明,或给错误文案留的那一行)时那一行就是项距,
|
|
18
|
+
没有辅助行的块才在下方补一段项距(见下面两条) */
|
|
19
|
+
.xh-scope-fieldset[data-part='root'] {
|
|
20
|
+
--xh-_fieldset-item-gap: var(--xh-fieldset-gap, var(--xh-space-5));
|
|
21
|
+
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
row-gap: 0;
|
|
25
|
+
margin: 0;
|
|
26
|
+
border: 0;
|
|
27
|
+
padding: 0;
|
|
28
|
+
min-inline-size: 0;
|
|
29
|
+
}
|
|
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
|
+
|
|
46
|
+
.xh-scope-fieldset[data-part='root'][hidden] {
|
|
47
|
+
display: none;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.xh-scope-fieldset[data-part='legend'] {
|
|
51
|
+
padding: 0;
|
|
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));
|
|
58
|
+
line-height: var(--xh-leading-tight);
|
|
59
|
+
/* 整组转无效或转禁用时组标题换色,两档之间接一段过渡 */
|
|
60
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* 整组无效时组标题转警示色:没渲染错误文案的字段集上,这是屏幕上唯一变化的东西。
|
|
64
|
+
默认色在 label.css 公共层,这里只把颜色接到本组件的覆盖槽上 */
|
|
65
|
+
.xh-scope-fieldset[data-part='legend'][data-invalid] {
|
|
66
|
+
color: var(--xh-fieldset-legend-fg-invalid, var(--xh-fg-danger));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* 整组禁用时组标题跟着变淡;组内组件库的控件经作用域配置拿到 disabled,按各自的禁用面画。
|
|
70
|
+
选择器权重高于上一条且排在后面,禁用与无效同时为真时以禁用为准。 */
|
|
71
|
+
.xh-scope-fieldset[data-part='root'] > .xh-scope-fieldset[data-part='legend'][data-disabled] {
|
|
72
|
+
color: var(--xh-fieldset-legend-fg-disabled, var(--xh-fg-subtle));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* 必填星号的字形、字号、间距与默认色在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
76
|
+
.xh-scope-fieldset[data-part='legend'][data-required]::before {
|
|
77
|
+
color: var(--xh-fieldset-legend-star, var(--xh-fg-danger));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* 说明与错误文案的角色(外边距、行距、默认字号与字色)在 description.css 公共层;
|
|
81
|
+
这里只把字色与字号接到本组件的覆盖槽上 */
|
|
82
|
+
.xh-scope-fieldset[data-part='description'] {
|
|
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));
|
|
85
|
+
/* 与组标题同一档过渡:整组转禁用时两处一起变淡 */
|
|
86
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.xh-scope-fieldset[data-part='description'][data-disabled] {
|
|
90
|
+
color: var(--xh-fieldset-description-fg-disabled, var(--xh-fg-subtle));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* 并排字段的一段:窄屏一列,够宽了按列宽自动分栏。列宽下限由槽给,作者按字段类型改 */
|
|
94
|
+
.xh-scope-fieldset[data-part='field-group'] {
|
|
95
|
+
display: grid;
|
|
96
|
+
grid-template-columns: repeat(auto-fit, minmax(var(--xh-fieldset-field-group-col-w, var(--xh-layout-col-min-sm)), 1fr));
|
|
97
|
+
gap: var(--xh-fieldset-field-group-gap, var(--xh-space-3));
|
|
98
|
+
align-items: start;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.xh-scope-fieldset[data-part='field-group'][hidden] {
|
|
102
|
+
display: none;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* 组末尾那一行按钮:靠尾端排,窄屏换行 */
|
|
106
|
+
.xh-scope-fieldset[data-part='actions'] {
|
|
107
|
+
display: flex;
|
|
108
|
+
flex-wrap: wrap;
|
|
109
|
+
align-items: center;
|
|
110
|
+
justify-content: flex-end;
|
|
111
|
+
gap: var(--xh-fieldset-actions-gap, var(--xh-space-2));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.xh-scope-fieldset[data-part='actions'][hidden] {
|
|
115
|
+
display: none;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.xh-scope-fieldset[data-part='error-text'] {
|
|
119
|
+
color: var(--xh-fieldset-error-fg, var(--xh-fg-danger));
|
|
120
|
+
font-size: var(--xh-fieldset-error-font-size, var(--xh-text-caption-size));
|
|
121
|
+
}
|
|
122
|
+
}
|