@xihan-ui/styles 2.0.0 → 3.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 +1328 -0
- package/README.md +6 -1
- package/component-tokens.d.ts +505 -111
- package/components.tokens.json +34750 -26291
- package/css/accordion.css +39 -13
- package/css/alert.css +61 -3
- package/css/anchor.css +49 -11
- package/css/approval.css +124 -84
- package/css/avatar-group.css +1 -1
- package/css/avatar.css +13 -5
- package/css/back-top.css +63 -44
- package/css/badge.css +63 -13
- package/css/bar-code.css +1 -1
- package/css/breadcrumb.css +63 -4
- package/css/button-group.css +5 -5
- package/css/button.css +69 -21
- package/css/calendar-picker.css +27 -8
- package/css/calendar-range-picker.css +48 -11
- package/css/card.css +116 -2
- package/css/carousel.css +153 -48
- package/css/cartesian-chart.css +830 -0
- package/css/cascader.css +184 -70
- package/css/checkbox-group.css +69 -99
- package/css/checkbox.css +21 -54
- package/css/citation.css +470 -0
- package/css/clipboard.css +23 -66
- package/css/code-view.css +103 -8
- package/css/collapsible.css +37 -11
- package/css/color-field.css +18 -0
- package/css/color-picker.css +57 -62
- package/css/color-slider.css +26 -19
- package/css/color-swatch-picker.css +8 -6
- package/css/combobox.css +82 -37
- package/css/command.css +48 -48
- package/css/context-menu.css +43 -28
- package/css/date-field.css +23 -0
- package/css/date-picker.css +57 -24
- package/css/date-range-picker.css +301 -14
- package/css/description.css +17 -1
- package/css/descriptions.css +43 -1
- package/css/dialog.css +99 -43
- package/css/diff-view.css +101 -16
- package/css/download-trigger.css +46 -80
- package/css/drawer.css +168 -133
- package/css/editable.css +19 -0
- package/css/empty-state.css +8 -7
- package/css/field-array.css +36 -0
- package/css/field.css +17 -19
- package/css/fieldset.css +1 -1
- package/css/file-upload.css +126 -136
- package/css/flex.css +324 -8
- package/css/float-button.css +168 -41
- package/css/floating-panel.css +59 -27
- package/css/form.css +26 -20
- package/css/funnel-chart.css +106 -0
- package/css/graph-chart.css +205 -0
- package/css/grid-list.css +235 -0
- package/css/grid.css +252 -1
- package/css/heatmap.css +119 -36
- package/css/hierarchy-chart.css +298 -0
- package/css/hover-card.css +33 -18
- package/css/icon.css +100 -0
- package/css/image-cropper.css +34 -8
- package/css/image-viewer.css +169 -26
- package/css/image.css +23 -4
- package/css/infinite-scroll.css +2 -2
- package/css/input-group.css +13 -15
- package/css/json-viewer.css +55 -7
- package/css/kbd.css +1 -1
- package/css/layout.css +71 -21
- package/css/liquid.css +106 -0
- package/css/list.css +2 -2
- package/css/listbox.css +72 -23
- package/css/loading-bar.css +27 -13
- package/css/log.css +131 -35
- package/css/markdown-stream.css +1 -1
- package/css/marquee.css +163 -7
- package/css/matrix-code.css +1 -1
- package/css/mention.css +35 -21
- package/css/menu.css +40 -28
- package/css/menubar.css +42 -28
- package/css/message-feed.css +174 -53
- package/css/navigation-menu.css +177 -18
- package/css/notification.css +431 -110
- package/css/number-field.css +22 -0
- package/css/page-header.css +4 -2
- package/css/pagination.css +129 -29
- package/css/password-input.css +40 -8
- package/css/pie-chart.css +247 -0
- package/css/popconfirm.css +50 -58
- package/css/popover.css +55 -21
- package/css/progress.css +308 -10
- package/css/prompt-input.css +37 -1
- package/css/question-flow.css +104 -64
- package/css/radar-chart.css +233 -0
- package/css/radio-group.css +372 -14
- package/css/rating.css +25 -27
- package/css/reasoning.css +62 -55
- package/css/reset.css +1 -1
- package/css/resizable.css +6 -1
- package/css/sankey-chart.css +174 -0
- package/css/scroll-area.css +32 -0
- package/css/scrollbar.css +1 -1
- package/css/select.css +76 -59
- package/css/side-nav.css +177 -30
- package/css/signature-pad.css +23 -8
- package/css/skeleton.css +13 -14
- package/css/slider.css +39 -17
- package/css/sortable.css +38 -8
- package/css/sparkline.css +164 -0
- package/css/spinner.css +50 -22
- package/css/splitter.css +8 -2
- package/css/statistic.css +10 -0
- package/css/steps.css +257 -38
- package/css/switch.css +30 -55
- package/css/table.css +168 -128
- package/css/tabs.css +243 -31
- package/css/tag-group.css +65 -37
- package/css/tag.css +55 -14
- package/css/tags-input.css +40 -3
- package/css/text-field.css +19 -0
- package/css/time-field.css +20 -1
- package/css/time-picker.css +44 -17
- package/css/time-range-picker.css +45 -18
- package/css/timeline.css +1 -1
- package/css/toggle-group.css +8 -8
- package/css/toggle.css +6 -5
- package/css/tool-call.css +64 -56
- package/css/toolbar.css +105 -7
- package/css/tooltip.css +18 -7
- package/css/tour.css +49 -21
- package/css/transfer.css +104 -81
- package/css/tree-select.css +235 -58
- package/css/tree.css +240 -147
- package/css/truncate.css +55 -12
- package/css/typography.css +93 -0
- package/css/virtualizer.css +57 -1
- package/css/watermark.css +23 -0
- package/family/action-control.css +14 -5
- package/family/chart.css +480 -0
- package/family/check-mark.css +94 -0
- package/family/choice-card.css +97 -0
- package/family/collection-item.css +70 -27
- package/family/field-chrome.css +1 -12
- package/family/loading-ring.css +95 -0
- package/family/material.css +72 -0
- package/family/menu-choice.css +56 -0
- package/family/motion.css +208 -11
- package/family/tag-list.css +59 -0
- package/index.css +23363 -14091
- package/index.unlayered.css +23198 -13922
- package/package.json +20 -8
- package/css/gradient-text.css +0 -91
- package/css/icon-wrapper.css +0 -81
- package/css/segmented.css +0 -280
- package/css/toast.css +0 -499
package/css/drawer.css
CHANGED
|
@@ -9,95 +9,6 @@
|
|
|
9
9
|
@import '../family/motion.css';
|
|
10
10
|
@import '../family/action-control.css';
|
|
11
11
|
|
|
12
|
-
@layer xihan.motion {
|
|
13
|
-
/* 四条边各一对滑入/滑出。位移量用 translate 的百分比,参照的是面板自己的边框盒,
|
|
14
|
-
所以不管 --xh-drawer-size 被改成多少,"正好推到视口外"这件事都成立。
|
|
15
|
-
|
|
16
|
-
位移写成两个私有槽位而不是写死 ±100%:贴边用的是逻辑 inset(inset-inline-start 等),
|
|
17
|
-
RTL 下 inline-end 落在物理左边;transform 没有逻辑等价物,若这里写死物理方向,
|
|
18
|
-
就会出现"面板贴在左边、却从右边滑进来"。槽位在 RTL 下翻符号,两者才始终同向。
|
|
19
|
-
竖排书写模式下 block 轴不再是 Y 轴,位移会退化为纵向,但贴边本身仍由逻辑 inset 保证。 */
|
|
20
|
-
@keyframes xh-drawer-in-right {
|
|
21
|
-
from {
|
|
22
|
-
translate: var(--xh-_drawer-shift-inline, 100%) 0;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
to {
|
|
26
|
-
translate: 0 0;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
@keyframes xh-drawer-out-right {
|
|
31
|
-
from {
|
|
32
|
-
translate: 0 0;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
to {
|
|
36
|
-
translate: var(--xh-_drawer-shift-inline, 100%) 0;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
@keyframes xh-drawer-in-left {
|
|
41
|
-
from {
|
|
42
|
-
translate: calc(-1 * var(--xh-_drawer-shift-inline, 100%)) 0;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
to {
|
|
46
|
-
translate: 0 0;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
@keyframes xh-drawer-out-left {
|
|
51
|
-
from {
|
|
52
|
-
translate: 0 0;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
to {
|
|
56
|
-
translate: calc(-1 * var(--xh-_drawer-shift-inline, 100%)) 0;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
@keyframes xh-drawer-in-top {
|
|
61
|
-
from {
|
|
62
|
-
translate: 0 calc(-1 * var(--xh-_drawer-shift-block, 100%));
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
to {
|
|
66
|
-
translate: 0 0;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
@keyframes xh-drawer-out-top {
|
|
71
|
-
from {
|
|
72
|
-
translate: 0 0;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
to {
|
|
76
|
-
translate: 0 calc(-1 * var(--xh-_drawer-shift-block, 100%));
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
@keyframes xh-drawer-in-bottom {
|
|
81
|
-
from {
|
|
82
|
-
translate: 0 var(--xh-_drawer-shift-block, 100%);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
to {
|
|
86
|
-
translate: 0 0;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
@keyframes xh-drawer-out-bottom {
|
|
91
|
-
from {
|
|
92
|
-
translate: 0 0;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
to {
|
|
96
|
-
translate: 0 var(--xh-_drawer-shift-block, 100%);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
12
|
@layer xihan.components {
|
|
102
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
103
14
|
[data-scope='drawer'] {
|
|
@@ -107,7 +18,7 @@
|
|
|
107
18
|
/* root 留在页面原地,只是 data-side / data-state 的落点,不该凭空多出一层盒子把
|
|
108
19
|
trigger 从作者的 flex / grid 行里挤出去,故 display: contents。 */
|
|
109
20
|
[data-scope='drawer'][data-part='root'] {
|
|
110
|
-
/*
|
|
21
|
+
/* 作者塞进面板里的图标按控件档取;触发器与关闭钮另由家族配方按各自的档下发字形尺 */
|
|
111
22
|
--xh-icon-size: var(--xh-drawer-icon-size, var(--xh-glyph-size-md));
|
|
112
23
|
|
|
113
24
|
display: contents;
|
|
@@ -125,7 +36,7 @@
|
|
|
125
36
|
}
|
|
126
37
|
|
|
127
38
|
/*
|
|
128
|
-
*
|
|
39
|
+
* 触发器是页面上的独立文字按钮:盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
|
|
129
40
|
* 由家族配方按连接层投影的 data-xh-action-variant / -size 给出(此前自写描边盒型,hover 落 200 / active 落 300)。
|
|
130
41
|
* 这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射。
|
|
131
42
|
*/
|
|
@@ -159,7 +70,7 @@
|
|
|
159
70
|
}
|
|
160
71
|
|
|
161
72
|
/* 抽屉展开期间触发按钮压住不弹起:面板贴在视口边上,它和按钮往往离得很远,
|
|
162
|
-
按钮自己得说明"这一扇是我开的"。open 与家族 hover
|
|
73
|
+
按钮自己得说明"这一扇是我开的"。open 与家族 hover 同档中性:
|
|
163
74
|
白底承载的 --xh-bg-subtle(100)+ 悬停描边,聚焦时这块面留着 */
|
|
164
75
|
[data-scope='drawer'][data-part='trigger'][data-state='open'] {
|
|
165
76
|
--xh-action-bg-rest: var(--xh-drawer-trigger-bg-open, var(--xh-bg-subtle));
|
|
@@ -209,7 +120,8 @@
|
|
|
209
120
|
background: transparent;
|
|
210
121
|
}
|
|
211
122
|
|
|
212
|
-
|
|
123
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,遮罩与面板都直接呈现 */
|
|
124
|
+
[data-scope='drawer'][data-part='backdrop'][data-state='open']:not([data-instant]) {
|
|
213
125
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
214
126
|
}
|
|
215
127
|
|
|
@@ -235,9 +147,9 @@
|
|
|
235
147
|
不构成固定定位的包含块,两种结构下参照的都是视口,位置一致;
|
|
236
148
|
contained 时上面那条把它一并换成 absolute,参照的就是作者那个容器。 */
|
|
237
149
|
[data-scope='drawer'][data-part='content'] {
|
|
238
|
-
/* 位移方向的私有槽位:默认按 LTR,RTL
|
|
239
|
-
--xh-_drawer-shift-inline:
|
|
240
|
-
--xh-_drawer-shift-block:
|
|
150
|
+
/* 位移方向的私有槽位:默认按 LTR,RTL 在下面整体翻符号。幅度取整幅位移令牌,减弱动效下归零 */
|
|
151
|
+
--xh-_drawer-shift-inline: var(--xh-motion-travel);
|
|
152
|
+
--xh-_drawer-shift-block: var(--xh-motion-travel);
|
|
241
153
|
/* 尺寸档只换这一个私有槽:左右放置时它是面板宽度、上下放置时是面板高度,
|
|
242
154
|
两种取法都在下面「四条边」那两条规则里。声明在 content 而不是 root:
|
|
243
155
|
content 会被 portal 到 body,root 上的槽位继承不过来(data-side 也是同一个道理) */
|
|
@@ -259,13 +171,13 @@
|
|
|
259
171
|
env(safe-area-inset-left),
|
|
260
172
|
env(safe-area-inset-right)
|
|
261
173
|
);
|
|
262
|
-
/* M4 sheet
|
|
174
|
+
/* M4 sheet 三件套:任何浮层不得只靠 box-shadow 分层,亮色下面板与页面同色,
|
|
263
175
|
1px 描边才是它的边界;影只是加成 */
|
|
264
176
|
border: var(--xh-stroke-thin) solid var(--xh-drawer-border, var(--xh-material-elevated-border));
|
|
265
177
|
background: var(--xh-drawer-bg, var(--xh-material-elevated-bg));
|
|
266
178
|
color: var(--xh-drawer-fg, var(--xh-material-elevated-fg));
|
|
267
179
|
box-shadow: var(--xh-drawer-shadow, var(--xh-material-elevated-shadow));
|
|
268
|
-
/* 作者不用 header / body / footer
|
|
180
|
+
/* 作者不用 header / body / footer 三段时它是唯一的滚动层:模态面滚到头不把页面一起带走 */
|
|
269
181
|
overflow: auto;
|
|
270
182
|
overscroll-behavior: contain;
|
|
271
183
|
/* 尺寸是照视口那条边算出来的,padding 再往外顶就会把面板挤出屏幕、
|
|
@@ -276,7 +188,7 @@
|
|
|
276
188
|
}
|
|
277
189
|
|
|
278
190
|
[data-scope='drawer'][data-part='content']:dir(rtl) {
|
|
279
|
-
--xh-_drawer-shift-inline: -
|
|
191
|
+
--xh-_drawer-shift-inline: calc(-1 * var(--xh-motion-travel));
|
|
280
192
|
}
|
|
281
193
|
|
|
282
194
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致。
|
|
@@ -312,7 +224,8 @@
|
|
|
312
224
|
[data-scope='drawer'][data-part='content'][data-side='left'],
|
|
313
225
|
[data-scope='drawer'][data-part='content'][data-side='right'] {
|
|
314
226
|
inset-block: 0;
|
|
315
|
-
|
|
227
|
+
/* 调过厚度就按连接层写进私有槽的像素走,压过 size 档与使用者槽 */
|
|
228
|
+
inline-size: var(--xh-_drawer-panel-size, var(--xh-drawer-size, var(--xh-_drawer-size)));
|
|
316
229
|
/* 视口比抽屉还窄时让位,否则面板会顶出一条横向滚动条 */
|
|
317
230
|
max-inline-size: 100%;
|
|
318
231
|
}
|
|
@@ -334,7 +247,7 @@
|
|
|
334
247
|
[data-scope='drawer'][data-part='content'][data-side='top'],
|
|
335
248
|
[data-scope='drawer'][data-part='content'][data-side='bottom'] {
|
|
336
249
|
inset-inline: 0;
|
|
337
|
-
block-size: var(--xh-drawer-size, var(--xh-_drawer-size));
|
|
250
|
+
block-size: var(--xh-_drawer-panel-size, var(--xh-drawer-size, var(--xh-_drawer-size)));
|
|
338
251
|
max-block-size: 100%;
|
|
339
252
|
}
|
|
340
253
|
|
|
@@ -350,45 +263,44 @@
|
|
|
350
263
|
border-start-end-radius: var(--xh-drawer-radius, var(--xh-shape-overlay));
|
|
351
264
|
}
|
|
352
265
|
|
|
353
|
-
/*
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
will-change: translate;
|
|
357
|
-
}
|
|
266
|
+
/* 滑入/滑出共用整幅滑入关键帧,四条边只在两个方向槽里写起点。位移取整幅位移令牌,
|
|
267
|
+
translate 的百分比参照面板自己的边框盒,所以不管 --xh-drawer-size 被改成多少,
|
|
268
|
+
"正好推到视口外"这件事都成立。
|
|
358
269
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
[data-scope='drawer'][data-part='content'][data-side='right'][data-state='closed'] {
|
|
367
|
-
animation: xh-drawer-out-right var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
[data-scope='drawer'][data-part='content'][data-side='left'][data-state='open'] {
|
|
371
|
-
animation: xh-drawer-in-left var(--xh-motion-duration-slide) var(--xh-motion-ease-slide);
|
|
270
|
+
方向槽由上面的 --xh-_drawer-shift-* 换算而不是写死物理方向:贴边用的是逻辑 inset
|
|
271
|
+
(inset-inline-start 等),RTL 下 inline-end 落在物理左边;translate 没有逻辑等价物,
|
|
272
|
+
若这里写死物理方向,就会出现"面板贴在左边、却从右边滑进来"。shift 槽在 RTL 下翻符号,
|
|
273
|
+
两者才始终同向。竖排书写模式下 block 轴不再是 Y 轴,位移会退化为纵向,但贴边本身仍由逻辑 inset 保证。 */
|
|
274
|
+
[data-scope='drawer'][data-part='content'][data-side='right'] {
|
|
275
|
+
--xh-_slide-from-x: var(--xh-_drawer-shift-inline);
|
|
372
276
|
}
|
|
373
277
|
|
|
374
|
-
[data-scope='drawer'][data-part='content'][data-side='left']
|
|
375
|
-
|
|
278
|
+
[data-scope='drawer'][data-part='content'][data-side='left'] {
|
|
279
|
+
--xh-_slide-from-x: calc(-1 * var(--xh-_drawer-shift-inline));
|
|
376
280
|
}
|
|
377
281
|
|
|
378
|
-
[data-scope='drawer'][data-part='content'][data-side='top']
|
|
379
|
-
|
|
282
|
+
[data-scope='drawer'][data-part='content'][data-side='top'] {
|
|
283
|
+
--xh-_slide-from-y: calc(-1 * var(--xh-_drawer-shift-block));
|
|
380
284
|
}
|
|
381
285
|
|
|
382
|
-
[data-scope='drawer'][data-part='content'][data-side='
|
|
383
|
-
|
|
286
|
+
[data-scope='drawer'][data-part='content'][data-side='bottom'] {
|
|
287
|
+
--xh-_slide-from-y: var(--xh-_drawer-shift-block);
|
|
384
288
|
}
|
|
385
289
|
|
|
386
|
-
|
|
387
|
-
|
|
290
|
+
/* 入场是整面板从画外推入的大尺度位移:走 --xh-motion-duration-slide 与 --xh-motion-ease-slide;
|
|
291
|
+
退场仍走 exit 档。并列的一段淡变取淡变档:缺省起止都是不透明、看不出来,减弱动效下
|
|
292
|
+
整幅位移归零、进出场由它表达。退场一律 forwards:presence 要等 animationend 才卸载,
|
|
293
|
+
不定住终态,面板会在最后一帧弹回原位再消失。 */
|
|
294
|
+
[data-scope='drawer'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
295
|
+
animation:
|
|
296
|
+
xh-slide-in var(--xh-motion-duration-slide) var(--xh-motion-ease-slide),
|
|
297
|
+
xh-slide-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
388
298
|
}
|
|
389
299
|
|
|
390
|
-
[data-scope='drawer'][data-part='content'][data-
|
|
391
|
-
animation:
|
|
300
|
+
[data-scope='drawer'][data-part='content'][data-state='closed'] {
|
|
301
|
+
animation:
|
|
302
|
+
xh-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards,
|
|
303
|
+
xh-slide-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
392
304
|
}
|
|
393
305
|
|
|
394
306
|
/* —— 面板三段 —— */
|
|
@@ -413,7 +325,7 @@
|
|
|
413
325
|
|
|
414
326
|
/* 正文段:面板里唯一会滚的一段。最小高度归零,
|
|
415
327
|
否则弹性项按内容撑高,容器再矮也不产生溢出,滚动条永远出不来。
|
|
416
|
-
模态 body
|
|
328
|
+
模态 body 是原生细条滚动面:细条由 reset 层统一给,滚到头不把页面一起带走 */
|
|
417
329
|
[data-scope='drawer'][data-part='body'] {
|
|
418
330
|
flex: 1 1 auto;
|
|
419
331
|
min-block-size: 0;
|
|
@@ -451,7 +363,7 @@
|
|
|
451
363
|
color: var(--xh-drawer-title-fg, var(--xh-fg-default));
|
|
452
364
|
}
|
|
453
365
|
|
|
454
|
-
/*
|
|
366
|
+
/* 说明文字走说明档:13px + fg-muted */
|
|
455
367
|
[data-scope='drawer'][data-part='description'] {
|
|
456
368
|
margin: 0;
|
|
457
369
|
font-size: var(--xh-drawer-description-font-size, var(--xh-text-secondary-size));
|
|
@@ -466,7 +378,7 @@
|
|
|
466
378
|
}
|
|
467
379
|
|
|
468
380
|
/*
|
|
469
|
-
*
|
|
381
|
+
* 关闭钮是面板角落的单图标钮:正方盒、sm 档几何、ghost 四态面、0.97 按压并换底与粗指针命中区
|
|
470
382
|
* 由家族配方给出——白面上走画布承载阶梯悬停 --xh-bg-subtle(100)→ 按下 --xh-bg-subtle-hover(200),
|
|
471
383
|
* 焦点面透明吃库环。这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与摆放,
|
|
472
384
|
* 聚焦档的 -bg-focus / -fg-focus 两槽同样桥到配方的 focus-visible 面(与 dialog 一致),缺省仍是透明底与悬停字色;
|
|
@@ -506,12 +418,135 @@
|
|
|
506
418
|
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
507
419
|
}
|
|
508
420
|
|
|
421
|
+
/* —— 改尺 ——
|
|
422
|
+
把手是一条透明的命中区,贴在朝向页面的那条边上,中间一段指示条标出这里能推:
|
|
423
|
+
左右放置时是竖条、上下放置时是横条。贴边用逻辑属性:right 贴的是行尾侧,把手落在行首那条边,
|
|
424
|
+
与机器按书写方向翻转推动方向同源。厚度跟手,不挂过渡 */
|
|
425
|
+
[data-scope='drawer'][data-part='content'][data-resizing] {
|
|
426
|
+
user-select: none;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
[data-scope='drawer'][data-part='resize-trigger'] {
|
|
430
|
+
--xh-_drawer-resize-indicator: var(--xh-drawer-resize-trigger-bg, var(--xh-border-control));
|
|
431
|
+
|
|
432
|
+
position: absolute;
|
|
433
|
+
display: block;
|
|
434
|
+
border: 0;
|
|
435
|
+
padding: 0;
|
|
436
|
+
background: transparent;
|
|
437
|
+
touch-action: none;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
[data-scope='drawer'][data-part='resize-trigger']::after {
|
|
441
|
+
content: '';
|
|
442
|
+
position: absolute;
|
|
443
|
+
inset-block-start: 50%;
|
|
444
|
+
inset-inline-start: 50%;
|
|
445
|
+
border-radius: var(--xh-drawer-resize-trigger-radius, var(--xh-shape-pill));
|
|
446
|
+
background: var(--xh-_drawer-resize-indicator);
|
|
447
|
+
pointer-events: none;
|
|
448
|
+
/* 起点是逻辑属性、平移是物理通道:行内分量乘方向符号,RTL 下指示条才落回把手正中 */
|
|
449
|
+
translate: calc(-50% * var(--xh-direction-sign)) -50%;
|
|
450
|
+
transition: background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
[data-scope='drawer'][data-part='resize-trigger']:hover {
|
|
454
|
+
--xh-_drawer-resize-indicator: var(--xh-drawer-resize-trigger-bg-hover, var(--xh-border-control-hover));
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
[data-scope='drawer'][data-part='resize-trigger'][data-resizing] {
|
|
458
|
+
--xh-_drawer-resize-indicator: var(--xh-drawer-resize-trigger-bg-active, var(--xh-bg-brand));
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/* 键盘落在把手上时指示条换成焦点色:命中区贴着面板边,外扩的环会压到页面上 */
|
|
462
|
+
[data-scope='drawer'][data-part='resize-trigger']:focus-visible {
|
|
463
|
+
--xh-_drawer-resize-indicator: var(--xh-ring-focus);
|
|
464
|
+
|
|
465
|
+
outline: none;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
[data-scope='drawer'][data-part='resize-trigger'][data-side='left'],
|
|
469
|
+
[data-scope='drawer'][data-part='resize-trigger'][data-side='right'] {
|
|
470
|
+
inset-block: 0;
|
|
471
|
+
inline-size: var(--xh-drawer-resize-trigger-size, var(--xh-space-2));
|
|
472
|
+
cursor: ew-resize;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
[data-scope='drawer'][data-part='resize-trigger'][data-side='right'] {
|
|
476
|
+
inset-inline-start: 0;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
[data-scope='drawer'][data-part='resize-trigger'][data-side='left'] {
|
|
480
|
+
inset-inline-end: 0;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
[data-scope='drawer'][data-part='resize-trigger'][data-side='top'],
|
|
484
|
+
[data-scope='drawer'][data-part='resize-trigger'][data-side='bottom'] {
|
|
485
|
+
inset-inline: 0;
|
|
486
|
+
block-size: var(--xh-drawer-resize-trigger-size, var(--xh-space-2));
|
|
487
|
+
cursor: ns-resize;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
[data-scope='drawer'][data-part='resize-trigger'][data-side='top'] {
|
|
491
|
+
inset-block-end: 0;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
[data-scope='drawer'][data-part='resize-trigger'][data-side='bottom'] {
|
|
495
|
+
inset-block-start: 0;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
[data-scope='drawer'][data-part='resize-trigger']:is([data-side='left'], [data-side='right'])::after {
|
|
499
|
+
inline-size: var(--xh-drawer-resize-indicator-thickness, var(--xh-stroke-strong));
|
|
500
|
+
block-size: var(--xh-drawer-resize-indicator-length, var(--xh-space-8));
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
[data-scope='drawer'][data-part='resize-trigger']:is([data-side='top'], [data-side='bottom'])::after {
|
|
504
|
+
inline-size: var(--xh-drawer-resize-indicator-length, var(--xh-space-8));
|
|
505
|
+
block-size: var(--xh-drawer-resize-indicator-thickness, var(--xh-stroke-strong));
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
[data-scope='drawer'][data-part='resize-trigger'][hidden] {
|
|
509
|
+
display: none;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
/* 强制色下指示条的底色会被系统色吃掉:改画成正文色,调整中与聚焦时取高亮色 */
|
|
513
|
+
@media (forced-colors: active) {
|
|
514
|
+
[data-scope='drawer'][data-part='resize-trigger']::after {
|
|
515
|
+
forced-color-adjust: none;
|
|
516
|
+
background: CanvasText;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
[data-scope='drawer'][data-part='resize-trigger']:is([data-resizing], :focus-visible)::after {
|
|
520
|
+
background: Highlight;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
509
524
|
@media print {
|
|
510
525
|
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
511
526
|
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
512
527
|
[data-scope='drawer'][data-part='backdrop'],
|
|
513
|
-
[data-scope='drawer'][data-part='positioner']
|
|
528
|
+
[data-scope='drawer'][data-part='positioner'],
|
|
529
|
+
[data-scope='drawer'][data-part='resize-trigger'] {
|
|
514
530
|
display: none;
|
|
515
531
|
}
|
|
516
532
|
}
|
|
533
|
+
|
|
534
|
+
@media (forced-colors: active) {
|
|
535
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
536
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
537
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
538
|
+
禁用取 GrayText */
|
|
539
|
+
[data-scope='drawer'][data-part='close-trigger']:empty::before {
|
|
540
|
+
forced-color-adjust: none;
|
|
541
|
+
background-color: ButtonText;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
[data-scope='drawer'][data-part='close-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
545
|
+
background-color: HighlightText;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
[data-scope='drawer'][data-part='close-trigger'][data-disabled]:empty::before {
|
|
549
|
+
background-color: GrayText;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
517
552
|
}
|
package/css/editable.css
CHANGED
|
@@ -273,4 +273,23 @@
|
|
|
273
273
|
forced-color-adjust: none;
|
|
274
274
|
}
|
|
275
275
|
}
|
|
276
|
+
|
|
277
|
+
@media (forced-colors: active) {
|
|
278
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
279
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
280
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
281
|
+
禁用取 GrayText */
|
|
282
|
+
[data-scope='editable']:is([data-part='edit-trigger'], [data-part='submit-trigger'], [data-part='cancel-trigger']):empty::before {
|
|
283
|
+
forced-color-adjust: none;
|
|
284
|
+
background-color: ButtonText;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
[data-scope='editable']:is([data-part='edit-trigger'], [data-part='submit-trigger'], [data-part='cancel-trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
288
|
+
background-color: HighlightText;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
[data-scope='editable']:is([data-part='edit-trigger'], [data-part='submit-trigger'], [data-part='cancel-trigger'])[data-disabled]:empty::before {
|
|
292
|
+
background-color: GrayText;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
276
295
|
}
|
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
|
-
/* 标题走 Surface / Feedback 标题档 14/600
|
|
23
|
+
/* 标题走 Surface / Feedback 标题档 14/600;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);
|
|
@@ -131,12 +131,13 @@
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
/* 图标、标题、说明、动作按次序开幕,间隔由交错步长派生。
|
|
134
|
-
backwards
|
|
135
|
-
|
|
136
|
-
[data-scope='empty-state'][data-part='
|
|
137
|
-
[data-scope='empty-state'][data-part='
|
|
138
|
-
[data-scope='empty-state'][data-part='
|
|
139
|
-
[data-scope='empty-state'][data-part='
|
|
134
|
+
backwards 不能省:等待期间起帧不生效的话,后三段会先露一下再跳回去。
|
|
135
|
+
随页面首屏就在的空状态带 data-instant 直接呈现,之后每一次出现才开幕 */
|
|
136
|
+
[data-scope='empty-state'][data-part='media']:not([data-instant]),
|
|
137
|
+
[data-scope='empty-state'][data-part='indicator']:not([data-instant]),
|
|
138
|
+
[data-scope='empty-state'][data-part='title']:not([data-instant]),
|
|
139
|
+
[data-scope='empty-state'][data-part='description']:not([data-instant]),
|
|
140
|
+
[data-scope='empty-state'][data-part='action']:not([data-instant]) {
|
|
140
141
|
animation: xh-rise-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
|
|
141
142
|
}
|
|
142
143
|
|
package/css/field-array.css
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
/* FieldArray 独立皮肤同时传递引入把手的动作控件配方;full bundle 递归去重。 */
|
|
9
9
|
@import '../family/action-control.css';
|
|
10
|
+
/* 行的进场与退场取共享关键帧。 */
|
|
11
|
+
@import '../family/motion.css';
|
|
10
12
|
|
|
11
13
|
@layer xihan.components {
|
|
12
14
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -19,6 +21,8 @@
|
|
|
19
21
|
display: flex;
|
|
20
22
|
flex-direction: column;
|
|
21
23
|
gap: var(--xh-field-array-gap, var(--xh-space-2));
|
|
24
|
+
/* 删掉的行由替身绝对定位在原处播完退场,定位基准是根节点 */
|
|
25
|
+
position: relative;
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
/* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
|
|
@@ -33,6 +37,19 @@
|
|
|
33
37
|
gap: var(--xh-field-array-item-gap, var(--xh-space-2));
|
|
34
38
|
padding: var(--xh-field-array-item-padding, var(--xh-space-0));
|
|
35
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
|
+
[data-scope='field-array'][data-part='item']:not([data-instant], [data-instant] > *) {
|
|
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
|
+
[data-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;
|
|
36
53
|
}
|
|
37
54
|
|
|
38
55
|
[data-scope='field-array'][data-part='item'][hidden] {
|
|
@@ -187,4 +204,23 @@
|
|
|
187
204
|
[data-scope='field-array'][data-part='item-action'][hidden] {
|
|
188
205
|
display: none;
|
|
189
206
|
}
|
|
207
|
+
|
|
208
|
+
@media (forced-colors: active) {
|
|
209
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
210
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
211
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
212
|
+
禁用取 GrayText */
|
|
213
|
+
[data-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
|
+
[data-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
|
+
[data-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
|
+
}
|
|
190
226
|
}
|
package/css/field.css
CHANGED
|
@@ -53,11 +53,6 @@
|
|
|
53
53
|
grid-column: 2;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
/* 横排下这一列是网格的自动流,占位块跟着控件走第二列(选择器不匹配伪元素,单列一条) */
|
|
57
|
-
[data-scope='form'][data-part='root'][data-layout='horizontal'] [data-scope='field'][data-part='root']::after {
|
|
58
|
-
grid-column: 2;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
56
|
[data-scope='field'][data-part='label'] {
|
|
62
57
|
/* 一段不带空格的长标识(字段名、英文标识符)在窄处从词内断开:
|
|
63
58
|
横排表单里标签列是一段比例宽度,这行让标签在那一列里折行,而不是从列的左边顶出去 */
|
|
@@ -71,6 +66,8 @@
|
|
|
71
66
|
color: var(--xh-field-label-fg, var(--xh-fg-default));
|
|
72
67
|
font-size: var(--xh-field-label-font-size, var(--xh-text-label-size));
|
|
73
68
|
font-weight: var(--xh-field-label-font-weight, var(--xh-text-label-weight));
|
|
69
|
+
/* 转无效或转禁用时标签换色,两档之间接一段过渡(与字段集组标题同一档) */
|
|
70
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
74
71
|
}
|
|
75
72
|
|
|
76
73
|
[data-scope='field'][data-part='label'][data-disabled] {
|
|
@@ -100,7 +97,7 @@
|
|
|
100
97
|
--xh-field-border-hover: var(--xh-field-control-border-hover, var(--xh-_field-variant-border-hover));
|
|
101
98
|
--xh-field-border-focus: var(--xh-field-control-border-focus, var(--xh-_field-variant-border-focus));
|
|
102
99
|
--xh-field-border-invalid: var(--xh-field-control-border-invalid, var(--xh-_field-variant-border-invalid));
|
|
103
|
-
/*
|
|
100
|
+
/* 焦点环与家族同一支公共环,不再留逐组件的环色槽(焦点边与环一律公共) */
|
|
104
101
|
--xh-field-ring-focus: var(--xh-ring-focus);
|
|
105
102
|
--xh-field-ring-invalid: var(--xh-ring-invalid);
|
|
106
103
|
--xh-field-shadow-rest: var(--xh-field-control-shadow, none);
|
|
@@ -121,6 +118,8 @@
|
|
|
121
118
|
[data-scope='field'][data-part='description'] {
|
|
122
119
|
color: var(--xh-field-description-fg, var(--xh-fg-muted));
|
|
123
120
|
font-size: var(--xh-field-description-font-size, var(--xh-text-secondary-size));
|
|
121
|
+
/* 与标签同一档过渡:整个字段转禁用时两处一起变淡 */
|
|
122
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
124
123
|
}
|
|
125
124
|
|
|
126
125
|
[data-scope='field'][data-part='description'][data-disabled] {
|
|
@@ -132,27 +131,26 @@
|
|
|
132
131
|
font-size: var(--xh-field-error-font-size, var(--xh-text-secondary-size));
|
|
133
132
|
}
|
|
134
133
|
|
|
135
|
-
/*
|
|
136
|
-
|
|
137
|
-
|
|
134
|
+
/* 辅助文字那一行的占位:字段渲染了错误文案、当前又没在报错时,收起的错误文案自己留在流里占住一行
|
|
135
|
+
(不可见、不进可及树),与报错时的错误文案等高。字段的外框高度前后一样,表单不会因为一段错误文字
|
|
136
|
+
重新排版,定高或限高的父级里也不会把控件挤出去;退场就在这一行里淡出,播完才藏起。
|
|
138
137
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
没有在场的 description——描述已经占着这一行了,报错时由描述让位给错误文案(见 description.css)。
|
|
138
|
+
没有在场的 description 才这样占:描述已经占着这一行了,报错时由描述让位给错误文案(见 description.css),
|
|
139
|
+
收起的错误文案按公共层不占位。没渲染错误文案的字段本来就没有这一行。
|
|
142
140
|
|
|
143
141
|
高度按错误文案那一档的字号乘行距算,得到的正是它一行的高度。
|
|
144
142
|
不写 1lh:那个单位晚于本库声明的浏览器地板,取不到时整条声明被丢弃、占位高退回 0,
|
|
145
143
|
字段又会随报错撑高一次,而这种失效不报错。
|
|
146
|
-
与前一块的距离由根的 gap
|
|
147
|
-
[data-scope='field'][data-part='root']:has(> [data-scope='field'][data-part='
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
content: '';
|
|
144
|
+
与前一块的距离由根的 gap 给,和错误文案顶上来时是同一段;横排表单里它与别的子块一样落在控件那一列。 */
|
|
145
|
+
[data-scope='field'][data-part='root']:not(:has(> [data-scope='field'][data-part='description']:not([hidden])))
|
|
146
|
+
> [data-scope='field'][data-part='error-text'][hidden] {
|
|
147
|
+
position: static;
|
|
151
148
|
block-size: calc(
|
|
152
149
|
var(--xh-field-error-font-size, var(--xh-text-secondary-size)) * var(--xh-leading-normal)
|
|
153
150
|
);
|
|
154
|
-
|
|
155
|
-
|
|
151
|
+
transition:
|
|
152
|
+
opacity var(--xh-motion-duration-exit) var(--xh-motion-ease-exit),
|
|
153
|
+
visibility 0s var(--xh-motion-duration-exit);
|
|
156
154
|
}
|
|
157
155
|
|
|
158
156
|
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
package/css/fieldset.css
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
[data-scope='fieldset'][data-part='legend'] {
|
|
32
32
|
padding: 0;
|
|
33
33
|
margin-block-end: var(--xh-fieldset-legend-gap, var(--xh-space-2));
|
|
34
|
-
/*
|
|
34
|
+
/* 组标题是「一组字段的标题」,归集合标题角色:fg-muted,与组 --xh-space-2,字号字重同字段标签 */
|
|
35
35
|
color: var(--xh-fieldset-legend-fg, var(--xh-fg-muted));
|
|
36
36
|
font-size: var(--xh-fieldset-legend-font-size, var(--xh-text-label-size));
|
|
37
37
|
font-weight: var(--xh-fieldset-legend-font-weight, var(--xh-text-label-weight));
|