@xihan-ui/styles 3.0.0 → 3.2.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 +63 -0
- package/README.md +1 -1
- package/component-tokens.d.ts +29 -0
- package/components.tokens.json +683 -27
- package/css/alert.css +2 -2
- package/css/approval.css +4 -4
- package/css/button.css +9 -5
- package/css/calendar-picker.css +3 -3
- package/css/calendar-range-picker.css +7 -7
- package/css/carousel.css +45 -13
- package/css/cartesian-chart.css +11 -11
- package/css/cascader.css +10 -10
- package/css/citation.css +2 -2
- package/css/code-view.css +6 -6
- package/css/color-picker.css +81 -0
- package/css/color-swatch-picker.css +9 -4
- package/css/combobox.css +12 -4
- package/css/command.css +1 -1
- package/css/date-field.css +39 -0
- package/css/date-picker.css +86 -9
- package/css/date-range-picker.css +47 -7
- package/css/diff-view.css +8 -8
- package/css/field-array.css +1 -1
- package/css/field.css +4 -0
- package/css/file-upload.css +1 -1
- package/css/float-button.css +140 -27
- package/css/form.css +14 -6
- package/css/graph-chart.css +2 -2
- package/css/highlight.css +1 -1
- package/css/image.css +1 -1
- package/css/mention.css +1 -1
- package/css/message-feed.css +1 -1
- package/css/notification.css +26 -20
- package/css/number-field.css +18 -18
- package/css/page-header.css +2 -2
- package/css/password-input.css +2 -2
- package/css/popconfirm.css +3 -3
- package/css/question-flow.css +8 -8
- package/css/radar-chart.css +6 -6
- package/css/rating.css +1 -1
- package/css/select.css +2 -2
- package/css/separator.css +2 -2
- package/css/side-nav.css +13 -13
- package/css/skeleton.css +5 -5
- package/css/slider.css +6 -6
- package/css/sortable.css +2 -2
- package/css/table.css +19 -2
- package/css/tags-input.css +1 -1
- package/css/time-picker.css +59 -2
- package/css/tool-call.css +7 -7
- package/css/tooltip.css +1 -1
- package/css/tree-select.css +2 -2
- package/css/tree.css +81 -11
- package/dist/css/accordion.css +269 -0
- package/dist/css/affix.css +47 -0
- package/dist/css/alert.css +247 -0
- package/dist/css/anchor.css +252 -0
- package/dist/css/approval.css +501 -0
- package/dist/css/avatar-group.css +99 -0
- package/dist/css/avatar.css +98 -0
- package/dist/css/back-top.css +161 -0
- package/dist/css/badge.css +205 -0
- package/dist/css/bar-code.css +62 -0
- package/dist/css/breadcrumb.css +230 -0
- package/dist/css/button-group.css +263 -0
- package/dist/css/button.css +219 -0
- package/dist/css/calendar-picker.css +467 -0
- package/dist/css/calendar-range-picker.css +554 -0
- package/dist/css/card.css +221 -0
- package/dist/css/carousel.css +710 -0
- package/dist/css/cartesian-chart.css +830 -0
- package/dist/css/cascader.css +961 -0
- package/dist/css/checkbox-group.css +358 -0
- package/dist/css/checkbox.css +257 -0
- package/dist/css/citation.css +470 -0
- package/dist/css/clipboard.css +315 -0
- package/dist/css/code-view.css +374 -0
- package/dist/css/collapsible.css +185 -0
- package/dist/css/color-field.css +176 -0
- package/dist/css/color-picker.css +595 -0
- package/dist/css/color-slider.css +281 -0
- package/dist/css/color-swatch-picker.css +250 -0
- package/dist/css/color-swatch.css +35 -0
- package/dist/css/combobox.css +574 -0
- package/dist/css/command.css +399 -0
- package/dist/css/context-menu.css +420 -0
- package/dist/css/date-field.css +317 -0
- package/dist/css/date-picker.css +868 -0
- package/dist/css/date-range-picker.css +886 -0
- package/dist/css/description.css +67 -0
- package/dist/css/descriptions.css +299 -0
- package/dist/css/dialog.css +455 -0
- package/dist/css/diff-view.css +513 -0
- package/dist/css/download-trigger.css +151 -0
- package/dist/css/drawer.css +552 -0
- package/dist/css/editable.css +295 -0
- package/dist/css/empty-state.css +163 -0
- package/dist/css/field-array.css +226 -0
- package/dist/css/field.css +166 -0
- package/dist/css/fieldset.css +102 -0
- package/dist/css/file-upload.css +429 -0
- package/dist/css/flex.css +441 -0
- package/dist/css/float-button.css +569 -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 +393 -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 +226 -0
- package/dist/css/icon.css +225 -0
- package/dist/css/image-cropper.css +373 -0
- package/dist/css/image-viewer.css +538 -0
- package/dist/css/image.css +98 -0
- package/dist/css/infinite-scroll.css +77 -0
- package/dist/css/input-group.css +275 -0
- package/dist/css/json-viewer.css +379 -0
- package/dist/css/kbd.css +72 -0
- package/dist/css/label.css +78 -0
- package/dist/css/layers.css +7 -0
- package/dist/css/layout.css +372 -0
- package/dist/css/liquid.css +106 -0
- package/dist/css/list.css +152 -0
- package/dist/css/listbox.css +390 -0
- package/dist/css/loading-bar.css +141 -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 +393 -0
- package/dist/css/menu.css +364 -0
- package/dist/css/menubar.css +456 -0
- package/dist/css/message-feed.css +318 -0
- package/dist/css/navigation-menu.css +513 -0
- package/dist/css/notification.css +782 -0
- package/dist/css/number-animation.css +44 -0
- package/dist/css/number-field.css +252 -0
- package/dist/css/overlay-arrow.css +56 -0
- package/dist/css/page-header.css +184 -0
- package/dist/css/pagination.css +450 -0
- package/dist/css/password-input.css +391 -0
- package/dist/css/pie-chart.css +247 -0
- package/dist/css/pin-input.css +199 -0
- package/dist/css/pointer.css +36 -0
- package/dist/css/popconfirm.css +320 -0
- package/dist/css/popover.css +279 -0
- package/dist/css/progress.css +501 -0
- package/dist/css/prompt-input.css +260 -0
- package/dist/css/question-flow.css +553 -0
- package/dist/css/radar-chart.css +233 -0
- package/dist/css/radio-group.css +598 -0
- package/dist/css/rating.css +294 -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 +612 -0
- package/dist/css/separator.css +122 -0
- package/dist/css/side-nav.css +476 -0
- package/dist/css/signature-pad.css +179 -0
- package/dist/css/skeleton.css +161 -0
- package/dist/css/slider.css +374 -0
- package/dist/css/sortable.css +228 -0
- package/dist/css/sparkline.css +164 -0
- package/dist/css/spinner.css +236 -0
- package/dist/css/splitter.css +159 -0
- package/dist/css/statistic.css +137 -0
- package/dist/css/steps.css +627 -0
- package/dist/css/switch.css +351 -0
- package/dist/css/table.css +1145 -0
- package/dist/css/tabs.css +944 -0
- package/dist/css/tag-group.css +247 -0
- package/dist/css/tag.css +310 -0
- package/dist/css/tags-input.css +322 -0
- package/dist/css/text-field.css +197 -0
- package/dist/css/time-field.css +277 -0
- package/dist/css/time-picker.css +707 -0
- package/dist/css/time-range-picker.css +746 -0
- package/dist/css/timeline.css +423 -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 +429 -0
- package/dist/css/toolbar.css +365 -0
- package/dist/css/tooltip.css +218 -0
- package/dist/css/tour.css +439 -0
- package/dist/css/transfer.css +638 -0
- package/dist/css/tree-select.css +878 -0
- package/dist/css/tree.css +733 -0
- package/dist/css/truncate.css +108 -0
- package/dist/css/typography.css +472 -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 +487 -0
- package/dist/family/chart.css +480 -0
- package/dist/family/check-mark.css +94 -0
- package/dist/family/choice-card.css +97 -0
- package/dist/family/collection-item.css +764 -0
- package/dist/family/field-chrome.css +287 -0
- package/dist/family/loading-ring.css +95 -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 +59 -0
- package/family/action-control.css +3 -12
- package/index.css +7307 -6759
- package/index.unlayered.css +7309 -6761
- package/package.json +165 -164
|
@@ -0,0 +1,226 @@
|
|
|
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 array 样式。 */
|
|
7
|
+
|
|
8
|
+
/* FieldArray 独立皮肤同时传递引入把手的动作控件配方;full bundle 递归去重。 */
|
|
9
|
+
@import '../family/action-control.css';
|
|
10
|
+
/* 行的进场与退场取共享关键帧。 */
|
|
11
|
+
@import '../family/motion.css';
|
|
12
|
+
|
|
13
|
+
@layer xihan.components {
|
|
14
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
15
|
+
.xh-scope-field-array {
|
|
16
|
+
--xh-field-array-skin: 1;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* 一行一条,纵向堆叠;新增把手跟在最后一行下面 */
|
|
20
|
+
.xh-scope-field-array[data-part='root'] {
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
gap: var(--xh-field-array-gap, var(--xh-space-2));
|
|
24
|
+
/* 删掉的行由替身绝对定位在原处播完退场,定位基准是根节点 */
|
|
25
|
+
position: relative;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
|
|
29
|
+
.xh-scope-field-array[data-part='root'][hidden] {
|
|
30
|
+
display: none;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* 内容在左、把手在右,把手那一列不随内容伸缩 */
|
|
34
|
+
.xh-scope-field-array[data-part='item'] {
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: center;
|
|
37
|
+
gap: var(--xh-field-array-item-gap, var(--xh-space-2));
|
|
38
|
+
padding: var(--xh-field-array-item-padding, var(--xh-space-0));
|
|
39
|
+
border-radius: var(--xh-field-array-item-radius, var(--xh-shape-surface));
|
|
40
|
+
/* 增删与上移下移带来的换位:由列表动效先反向补偿、再沿这条过渡滑到新位置 */
|
|
41
|
+
transition: translate var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* 新增的行进场,同一批按到达顺序错开;首帧就在的直接呈现(自己或根节点带 data-instant) */
|
|
45
|
+
.xh-scope-field-array[data-part='item']:not([data-instant], [data-instant] > :where(.xh-scope-field-array)) {
|
|
46
|
+
animation: xh-item-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
|
|
47
|
+
animation-delay: calc(var(--xh-_stagger-index, 0) * var(--xh-motion-stagger-step));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* 删掉的行:替身留在原处淡出,播完即移除 */
|
|
51
|
+
.xh-scope-field-array[data-part='item'][data-state='closed'] {
|
|
52
|
+
animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.xh-scope-field-array[data-part='item'][hidden] {
|
|
56
|
+
display: none;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* 行前的行号或名目:不参与分宽,弱一档前景把它与行里的内容分开 */
|
|
60
|
+
.xh-scope-field-array[data-part='item-label'] {
|
|
61
|
+
display: inline-flex;
|
|
62
|
+
flex: none;
|
|
63
|
+
align-items: center;
|
|
64
|
+
color: var(--xh-field-array-item-label-fg, var(--xh-fg-muted));
|
|
65
|
+
font-size: var(--xh-field-array-item-label-font-size, var(--xh-text-secondary-size));
|
|
66
|
+
line-height: var(--xh-leading-none);
|
|
67
|
+
white-space: nowrap;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.xh-scope-field-array[data-part='item-label'][hidden] {
|
|
71
|
+
display: none;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* 行里放什么控件归作者,这里只给它一条能撑开也能收窄的轨道。
|
|
75
|
+
min-inline-size 归零:不写的话里面的输入框按 UA 默认宽度顶住,长内容会把整行撑破 */
|
|
76
|
+
.xh-scope-field-array[data-part='item-content'] {
|
|
77
|
+
display: flex;
|
|
78
|
+
flex: 1 1 auto;
|
|
79
|
+
align-items: center;
|
|
80
|
+
gap: var(--xh-field-array-content-gap, var(--xh-space-2));
|
|
81
|
+
min-inline-size: 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.xh-scope-field-array[data-part='item-action'] {
|
|
85
|
+
display: inline-flex;
|
|
86
|
+
flex: none;
|
|
87
|
+
align-items: center;
|
|
88
|
+
gap: var(--xh-field-array-action-gap, var(--xh-space-1));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* —— 行内三个把手 ——
|
|
92
|
+
只有字形的离散动作钮:盒几何、悬停 / 按下与 0.97 按压、粗指针热区、焦点环、禁用面全由 Action Control 的
|
|
93
|
+
icon ghost 档给(连接层投 xs:24px 正方盒,行级把手贴着一个控件高的行,取行内动作钮那一档),
|
|
94
|
+
组件只映射既有使用者槽。静息透明,白底承载 hover 100 → pressed 200。
|
|
95
|
+
按不动的把手由连接层同时打 aria-disabled 与 data-disabled,家族按后者收掉悬停与按下反馈 */
|
|
96
|
+
.xh-scope-field-array[data-part='item-delete-trigger'],
|
|
97
|
+
.xh-scope-field-array[data-part='move-up-trigger'],
|
|
98
|
+
.xh-scope-field-array[data-part='move-down-trigger'] {
|
|
99
|
+
--xh-action-visual-size: var(--xh-field-array-trigger-size, var(--xh-_action-profile-visual-size));
|
|
100
|
+
--xh-action-min-inline-size: var(--xh-field-array-trigger-size, var(--xh-_action-profile-visual-size));
|
|
101
|
+
--xh-action-radius: var(--xh-field-array-trigger-radius, var(--xh-shape-control));
|
|
102
|
+
--xh-action-bg-rest: var(--xh-field-array-trigger-bg, var(--xh-_action-variant-bg-rest));
|
|
103
|
+
--xh-action-bg-hover: var(--xh-field-array-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
104
|
+
--xh-action-bg-pressed: var(--xh-field-array-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
105
|
+
--xh-action-fg-rest: var(--xh-field-array-trigger-fg, var(--xh-fg-muted));
|
|
106
|
+
--xh-action-fg-hover: var(--xh-field-array-trigger-fg-hover, var(--xh-fg-default));
|
|
107
|
+
--xh-action-fg-pressed: var(--xh-field-array-trigger-fg-hover, var(--xh-fg-default));
|
|
108
|
+
--xh-action-border-rest: transparent;
|
|
109
|
+
--xh-action-highlight-rest: transparent;
|
|
110
|
+
--xh-action-shadow-rest: none;
|
|
111
|
+
--xh-action-shadow-hover: none;
|
|
112
|
+
--xh-action-shadow-pressed: none;
|
|
113
|
+
--xh-action-font-size: var(--xh-field-array-trigger-font-size, var(--xh-text-secondary-size));
|
|
114
|
+
/* 作者塞进把手的图标与皮肤画的兜底字形同一把尺:按档取字形尺寸。
|
|
115
|
+
配方尚未把 profile 字形档灌进 --xh-icon-size,钮内字形先按 icon 档逐钮取值 */
|
|
116
|
+
--xh-icon-size: var(--xh-field-array-icon-size, var(--xh-_action-profile-glyph-size));
|
|
117
|
+
|
|
118
|
+
border-width: 0;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* 不换序时连接层给换序把手写 hidden;家族那条 display 会把 UA 的 [hidden]{display:none}
|
|
122
|
+
盖掉,少了这条把手还留在原地。删除把手同样声明了 display,作者自己收起它时要的是同一条 */
|
|
123
|
+
.xh-scope-field-array[data-part='item-delete-trigger'][hidden],
|
|
124
|
+
.xh-scope-field-array[data-part='move-up-trigger'][hidden],
|
|
125
|
+
.xh-scope-field-array[data-part='move-down-trigger'][hidden] {
|
|
126
|
+
display: none;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* 删除把手悬停转危险色:它是这一行里唯一不可撤销的动作 */
|
|
130
|
+
.xh-scope-field-array[data-part='item-delete-trigger'] {
|
|
131
|
+
--xh-action-fg-hover: var(--xh-field-array-item-delete-fg-hover, var(--xh-fg-danger-hover));
|
|
132
|
+
--xh-action-fg-pressed: var(--xh-field-array-item-delete-fg-hover, var(--xh-fg-danger-hover));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* —— 新增把手 ——
|
|
136
|
+
带文案的离散动作钮,走 text outline 档(中性描边、透明底,hover 100 → pressed 200),高一个控件;
|
|
137
|
+
虚线描边把它和行里的实心控件区分开:它加的是行,不是行里的值——家族只写 border-color,线型由这里给 */
|
|
138
|
+
.xh-scope-field-array[data-part='add-trigger'] {
|
|
139
|
+
--xh-action-visual-size: var(--xh-field-array-add-height, var(--xh-_action-profile-visual-size));
|
|
140
|
+
--xh-action-padding-inline: var(--xh-field-array-add-px, var(--xh-_action-profile-padding-inline));
|
|
141
|
+
--xh-action-gap: var(--xh-field-array-action-gap, var(--xh-space-1));
|
|
142
|
+
--xh-action-radius: var(--xh-field-array-add-radius, var(--xh-shape-control));
|
|
143
|
+
--xh-action-bg-rest: var(--xh-field-array-add-bg, var(--xh-_action-variant-bg-rest));
|
|
144
|
+
--xh-action-bg-hover: var(--xh-field-array-add-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
145
|
+
--xh-action-bg-pressed: var(--xh-field-array-add-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
146
|
+
--xh-action-fg-rest: var(--xh-field-array-add-fg, var(--xh-fg-brand));
|
|
147
|
+
--xh-action-fg-hover: var(--xh-field-array-add-fg, var(--xh-fg-brand));
|
|
148
|
+
--xh-action-fg-pressed: var(--xh-field-array-add-fg, var(--xh-fg-brand));
|
|
149
|
+
--xh-action-border-rest: var(--xh-field-array-add-border, var(--xh-_action-variant-border-rest));
|
|
150
|
+
--xh-action-border-hover: var(--xh-field-array-add-border-hover, var(--xh-_action-variant-border-hover));
|
|
151
|
+
--xh-action-border-disabled: var(--xh-field-array-add-border-disabled, var(--xh-_action-variant-border-disabled));
|
|
152
|
+
--xh-action-highlight-rest: transparent;
|
|
153
|
+
--xh-action-shadow-rest: none;
|
|
154
|
+
--xh-action-shadow-hover: none;
|
|
155
|
+
--xh-action-shadow-pressed: none;
|
|
156
|
+
--xh-action-font-size: var(--xh-field-array-add-font-size, var(--xh-text-label-size));
|
|
157
|
+
--xh-icon-size: var(--xh-field-array-icon-size, var(--xh-_action-profile-glyph-size));
|
|
158
|
+
|
|
159
|
+
align-self: flex-start;
|
|
160
|
+
border-style: dashed;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.xh-scope-field-array[data-part='add-trigger'][hidden] {
|
|
164
|
+
display: none;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
168
|
+
.xh-scope-field-array[data-part='move-up-trigger']:empty::before {
|
|
169
|
+
content: '';
|
|
170
|
+
display: inline-block;
|
|
171
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
172
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
173
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
174
|
+
background-color: currentColor;
|
|
175
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
|
|
176
|
+
mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.xh-scope-field-array[data-part='move-down-trigger']:empty::before {
|
|
180
|
+
content: '';
|
|
181
|
+
display: inline-block;
|
|
182
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
183
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
184
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
185
|
+
background-color: currentColor;
|
|
186
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
187
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.xh-scope-field-array[data-part='item-delete-trigger']:empty::before {
|
|
191
|
+
content: '';
|
|
192
|
+
display: inline-block;
|
|
193
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
194
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
195
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
196
|
+
background-color: currentColor;
|
|
197
|
+
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
198
|
+
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
202
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
203
|
+
.xh-scope-field-array[data-part='item-content'][hidden],
|
|
204
|
+
.xh-scope-field-array[data-part='item-action'][hidden] {
|
|
205
|
+
display: none;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
@media (forced-colors: active) {
|
|
209
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
210
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
211
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
212
|
+
禁用取 GrayText */
|
|
213
|
+
.xh-scope-field-array:is([data-part='move-up-trigger'], [data-part='move-down-trigger'], [data-part='item-delete-trigger']):empty::before {
|
|
214
|
+
forced-color-adjust: none;
|
|
215
|
+
background-color: ButtonText;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.xh-scope-field-array:is([data-part='move-up-trigger'], [data-part='move-down-trigger'], [data-part='item-delete-trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
219
|
+
background-color: HighlightText;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.xh-scope-field-array:is([data-part='move-up-trigger'], [data-part='move-down-trigger'], [data-part='item-delete-trigger'])[data-disabled]:empty::before {
|
|
223
|
+
background-color: GrayText;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
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
|
+
gap: var(--xh-field-gap, var(--xh-space-1));
|
|
21
|
+
/* 字段族控件放进字段即铺满字段宽:字段的宽由表单的列给,控件跟着列走,
|
|
22
|
+
不必逐个组件在根上写 inline-size: 100%。单独摆放的控件仍是 16rem 缺省宽;
|
|
23
|
+
单类钉宽(--xh-<组件>-control-w)照旧压过这一条 */
|
|
24
|
+
--xh-control-w: 100%;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* 表单横排(标签左置):字段转两列网格,标签列宽由表单的 --xh-form-label-w 统一给,
|
|
28
|
+
整表据此对齐;描述与错误文案跟着控件走第二列 */
|
|
29
|
+
.xh-scope-form[data-part='root'][data-layout='horizontal'] .xh-scope-field[data-part='root'] {
|
|
30
|
+
display: grid;
|
|
31
|
+
grid-template-columns: var(--xh-form-label-w, 30%) minmax(0, 1fr);
|
|
32
|
+
column-gap: var(--xh-field-label-gap, var(--xh-space-3));
|
|
33
|
+
align-items: start;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.xh-scope-form[data-part='root'][data-layout='horizontal'] .xh-scope-field[data-part='label'] {
|
|
37
|
+
grid-column: 1;
|
|
38
|
+
justify-self: end;
|
|
39
|
+
/* 横排下标签与控件是左右两列,间距归 --xh-field-label-gap 管,竖排那段补白在这儿清零 */
|
|
40
|
+
margin-block-end: 0;
|
|
41
|
+
/* 与控件的首行文字对齐:行高保持正文行距(标签折行时每行不会撑成一个控件高),
|
|
42
|
+
上下留白把单行文本盒撑到控件高度;配的是哪一档控件由 --xh-field-control-h 告诉它 */
|
|
43
|
+
line-height: var(--xh-field-label-leading, var(--xh-leading-normal));
|
|
44
|
+
/* 级联兜底:先写一行的高度算式(标签字号 × 标签行距),再写 1lh。
|
|
45
|
+
1lh 晚于本库声明的浏览器地板,取不到时旧引擎丢掉后一条、留下前一条。
|
|
46
|
+
两条取的是同一组槽——字号来自本文件里标签那条 font-size、行距来自紧邻上一行,
|
|
47
|
+
所以算出来是同一个数,使用者覆盖任一槽两条一起跟着走。 */
|
|
48
|
+
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);
|
|
49
|
+
padding-block: calc((var(--xh-field-control-h, var(--xh-control-h-md)) - 1lh) / 2);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.xh-scope-form[data-part='root'][data-layout='horizontal'][data-label-align='start'] .xh-scope-field[data-part='label'] {
|
|
53
|
+
justify-self: start;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.xh-scope-form[data-part='root'][data-layout='horizontal'] .xh-scope-field[data-part='root'] > :not([data-part='label']) {
|
|
57
|
+
grid-column: 2;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.xh-scope-field[data-part='label'] {
|
|
61
|
+
/* 一段不带空格的长标识(字段名、英文标识符)在窄处从词内断开:
|
|
62
|
+
横排表单里标签列是一段比例宽度,这行让标签在那一列里折行,而不是从列的左边顶出去 */
|
|
63
|
+
overflow-wrap: anywhere;
|
|
64
|
+
/* 竖排时标签与控件之间的距离:容器的 gap 之上补一段差值,
|
|
65
|
+
--xh-field-label-gap-block 给多少最终就是多少;不给时差值算成 0,
|
|
66
|
+
这段距离仍由 --xh-field-gap 与描述、错误文案那两段同宽。 */
|
|
67
|
+
margin-block-end: calc(
|
|
68
|
+
var(--xh-field-label-gap-block, var(--xh-field-gap, var(--xh-space-1))) - var(--xh-field-gap, var(--xh-space-1))
|
|
69
|
+
);
|
|
70
|
+
color: var(--xh-field-label-fg, var(--xh-fg-default));
|
|
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-subtle));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* 必填星号的字形、间距与默认色在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
82
|
+
.xh-scope-field[data-part='label'][data-required]::after {
|
|
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-ring-focus: var(--xh-ring-focus);
|
|
106
|
+
--xh-field-ring-invalid: var(--xh-ring-invalid);
|
|
107
|
+
--xh-field-shadow-rest: var(--xh-field-control-shadow, none);
|
|
108
|
+
|
|
109
|
+
inline-size: 100%;
|
|
110
|
+
border-radius: var(--xh-field-control-radius, var(--xh-shape-control));
|
|
111
|
+
/* 家族 chrome 不设字号:控件自身就是盒,正文字号由这里给 */
|
|
112
|
+
font-size: var(--xh-field-control-font-size, var(--xh-text-body-size));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* 无效标签色的默认在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
116
|
+
.xh-scope-field[data-part='label'][data-invalid] {
|
|
117
|
+
color: var(--xh-field-label-fg-invalid, var(--xh-fg-danger));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* 说明与错误文案的角色(外边距、行距、默认字号与字色)在 description.css 公共层;
|
|
121
|
+
这里只把字色与字号接到本组件的覆盖槽上 */
|
|
122
|
+
.xh-scope-field[data-part='description'] {
|
|
123
|
+
color: var(--xh-field-description-fg, var(--xh-fg-muted));
|
|
124
|
+
font-size: var(--xh-field-description-font-size, var(--xh-text-secondary-size));
|
|
125
|
+
/* 与标签同一档过渡:整个字段转禁用时两处一起变淡 */
|
|
126
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.xh-scope-field[data-part='description'][data-disabled] {
|
|
130
|
+
color: var(--xh-field-description-fg-disabled, var(--xh-fg-subtle));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.xh-scope-field[data-part='error-text'] {
|
|
134
|
+
color: var(--xh-field-error-fg, var(--xh-fg-danger));
|
|
135
|
+
font-size: var(--xh-field-error-font-size, var(--xh-text-secondary-size));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* 辅助文字那一行的占位:字段渲染了错误文案、当前又没在报错时,收起的错误文案自己留在流里占住一行
|
|
139
|
+
(不可见、不进可及树),与报错时的错误文案等高。字段的外框高度前后一样,表单不会因为一段错误文字
|
|
140
|
+
重新排版,定高或限高的父级里也不会把控件挤出去;退场就在这一行里淡出,播完才藏起。
|
|
141
|
+
|
|
142
|
+
没有在场的 description 才这样占:描述已经占着这一行了,报错时由描述让位给错误文案(见 description.css),
|
|
143
|
+
收起的错误文案按公共层不占位。没渲染错误文案的字段本来就没有这一行。
|
|
144
|
+
|
|
145
|
+
高度按错误文案那一档的字号乘行距算,得到的正是它一行的高度。
|
|
146
|
+
不写 1lh:那个单位晚于本库声明的浏览器地板,取不到时整条声明被丢弃、占位高退回 0,
|
|
147
|
+
字段又会随报错撑高一次,而这种失效不报错。
|
|
148
|
+
与前一块的距离由根的 gap 给,和错误文案顶上来时是同一段;横排表单里它与别的子块一样落在控件那一列。 */
|
|
149
|
+
.xh-scope-field[data-part='root']:not(:has(> .xh-scope-field[data-part='description']:not([hidden])))
|
|
150
|
+
> .xh-scope-field[data-part='error-text'][hidden] {
|
|
151
|
+
position: static;
|
|
152
|
+
block-size: calc(
|
|
153
|
+
var(--xh-field-error-font-size, var(--xh-text-secondary-size)) * var(--xh-leading-normal)
|
|
154
|
+
);
|
|
155
|
+
transition:
|
|
156
|
+
opacity var(--xh-motion-duration-exit) var(--xh-motion-ease-exit),
|
|
157
|
+
visibility 0s var(--xh-motion-duration-exit);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
161
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
162
|
+
.xh-scope-field[data-part='root'][hidden],
|
|
163
|
+
.xh-scope-form[data-part='root'][hidden] {
|
|
164
|
+
display: none;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
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
|
+
所以 gap 只作用于组内各块,legend 与内容之间的留白由 legend 自己的下外边距给。 */
|
|
17
|
+
.xh-scope-fieldset[data-part='root'] {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
gap: var(--xh-fieldset-gap, var(--xh-space-4));
|
|
21
|
+
margin: 0;
|
|
22
|
+
border: 0;
|
|
23
|
+
padding: 0;
|
|
24
|
+
min-inline-size: 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.xh-scope-fieldset[data-part='root'][hidden] {
|
|
28
|
+
display: none;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.xh-scope-fieldset[data-part='legend'] {
|
|
32
|
+
padding: 0;
|
|
33
|
+
margin-block-end: var(--xh-fieldset-legend-gap, var(--xh-space-2));
|
|
34
|
+
/* 组标题是「一组字段的标题」,归集合标题角色:fg-muted,与组 --xh-space-2,字号字重同字段标签 */
|
|
35
|
+
color: var(--xh-fieldset-legend-fg, var(--xh-fg-muted));
|
|
36
|
+
font-size: var(--xh-fieldset-legend-font-size, var(--xh-text-label-size));
|
|
37
|
+
font-weight: var(--xh-fieldset-legend-font-weight, var(--xh-text-label-weight));
|
|
38
|
+
line-height: var(--xh-leading-tight);
|
|
39
|
+
/* 整组转无效或转禁用时组标题换色,两档之间接一段过渡 */
|
|
40
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* 整组无效时组标题转警示色:没渲染错误文案的字段集上,这是屏幕上唯一变化的东西。
|
|
44
|
+
默认色在 label.css 公共层,这里只把颜色接到本组件的覆盖槽上 */
|
|
45
|
+
.xh-scope-fieldset[data-part='legend'][data-invalid] {
|
|
46
|
+
color: var(--xh-fieldset-legend-fg-invalid, var(--xh-fg-danger));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* 整组禁用时组标题跟着变淡;组内控件由原生 fieldset[disabled] 各自呈现禁用态。
|
|
50
|
+
选择器权重高于上一条且排在后面,禁用与无效同时为真时以禁用为准。 */
|
|
51
|
+
.xh-scope-fieldset[data-part='root'] > .xh-scope-fieldset[data-part='legend'][data-disabled] {
|
|
52
|
+
color: var(--xh-fieldset-legend-fg-disabled, var(--xh-fg-subtle));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* 必填星号的字形、间距与默认色在 label.css 公共层;这里只把颜色接到本组件的覆盖槽上 */
|
|
56
|
+
.xh-scope-fieldset[data-part='legend'][data-required]::after {
|
|
57
|
+
color: var(--xh-fieldset-legend-star, var(--xh-fg-danger));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* 说明与错误文案的角色(外边距、行距、默认字号与字色)在 description.css 公共层;
|
|
61
|
+
这里只把字色与字号接到本组件的覆盖槽上 */
|
|
62
|
+
.xh-scope-fieldset[data-part='description'] {
|
|
63
|
+
color: var(--xh-fieldset-description-fg, var(--xh-fg-muted));
|
|
64
|
+
font-size: var(--xh-fieldset-description-font-size, var(--xh-text-secondary-size));
|
|
65
|
+
/* 与组标题同一档过渡:整组转禁用时两处一起变淡 */
|
|
66
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.xh-scope-fieldset[data-part='description'][data-disabled] {
|
|
70
|
+
color: var(--xh-fieldset-description-fg-disabled, var(--xh-fg-subtle));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* 并排字段的一段:窄屏一列,够宽了按列宽自动分栏。列宽下限由槽给,作者按字段类型改 */
|
|
74
|
+
.xh-scope-fieldset[data-part='field-group'] {
|
|
75
|
+
display: grid;
|
|
76
|
+
grid-template-columns: repeat(auto-fit, minmax(var(--xh-fieldset-field-group-col-w, var(--xh-layout-col-min-sm)), 1fr));
|
|
77
|
+
gap: var(--xh-fieldset-field-group-gap, var(--xh-space-3));
|
|
78
|
+
align-items: start;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.xh-scope-fieldset[data-part='field-group'][hidden] {
|
|
82
|
+
display: none;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* 组末尾那一行按钮:靠尾端排,窄屏换行 */
|
|
86
|
+
.xh-scope-fieldset[data-part='actions'] {
|
|
87
|
+
display: flex;
|
|
88
|
+
flex-wrap: wrap;
|
|
89
|
+
align-items: center;
|
|
90
|
+
justify-content: flex-end;
|
|
91
|
+
gap: var(--xh-fieldset-actions-gap, var(--xh-space-2));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.xh-scope-fieldset[data-part='actions'][hidden] {
|
|
95
|
+
display: none;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.xh-scope-fieldset[data-part='error-text'] {
|
|
99
|
+
color: var(--xh-fieldset-error-fg, var(--xh-fg-danger));
|
|
100
|
+
font-size: var(--xh-fieldset-error-font-size, var(--xh-text-secondary-size));
|
|
101
|
+
}
|
|
102
|
+
}
|