@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,106 @@
|
|
|
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
|
+
/* 定义 image 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
10
|
+
|
|
11
|
+
@layer xihan.components {
|
|
12
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
13
|
+
.xh-scope-image {
|
|
14
|
+
--xh-image-skin: 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* 尺寸交给三个变量而不是写死:这个组件既要能当封面图,也要能当头图与缩略图。
|
|
18
|
+
给了 --xh-image-ratio 才有确定高度,回退内容与图片在同一个盒子里换人时不会跳。 */
|
|
19
|
+
.xh-scope-image[data-part='root'] {
|
|
20
|
+
position: relative;
|
|
21
|
+
display: block;
|
|
22
|
+
overflow: hidden;
|
|
23
|
+
inline-size: var(--xh-image-w, 100%);
|
|
24
|
+
block-size: var(--xh-image-h, auto);
|
|
25
|
+
aspect-ratio: var(--xh-image-ratio, auto);
|
|
26
|
+
border-radius: var(--xh-image-radius, var(--xh-shape-control));
|
|
27
|
+
background: var(--xh-image-bg, var(--xh-bg-subtle));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
|
|
31
|
+
.xh-scope-image[data-part='root'][hidden] {
|
|
32
|
+
display: none;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* 不声明 display:加载完成前的 hidden 直接交给浏览器的 [hidden] 规则收起。
|
|
36
|
+
载完那一刻 hidden 撤掉、这个节点从不显示变为显示,淡入在那一刻起跑,
|
|
37
|
+
图片不是硬切上来盖掉占位层 */
|
|
38
|
+
.xh-scope-image[data-part='image'] {
|
|
39
|
+
inline-size: 100%;
|
|
40
|
+
block-size: 100%;
|
|
41
|
+
object-fit: var(--xh-image-fit, cover);
|
|
42
|
+
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* 占位层还在(正淡出)时图片不再自己淡入:它在占位层底下直接落位,由占位层的淡出揭开,
|
|
46
|
+
模糊小图与图片交叉,不先透出一拍底色 */
|
|
47
|
+
.xh-scope-image[data-part='root']:has(> [data-part='placeholder']:not([hidden])) > [data-part='image']:where(.xh-scope-image) {
|
|
48
|
+
animation: none;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* 铺满图位的占位层:加载期间占住画面,作者往里放骨架屏或模糊小图。它叠在图位自己的淡底上,
|
|
52
|
+
取不透明档,不与底下那层叠深 */
|
|
53
|
+
.xh-scope-image[data-part='placeholder'] {
|
|
54
|
+
position: absolute;
|
|
55
|
+
inset: 0;
|
|
56
|
+
display: flex;
|
|
57
|
+
align-items: center;
|
|
58
|
+
justify-content: center;
|
|
59
|
+
background: var(--xh-image-placeholder-bg, var(--xh-bg-subtle-opaque));
|
|
60
|
+
color: var(--xh-image-placeholder-fg, var(--xh-fg-subtle));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* 图片落位或失败:占位层原地淡出(它盖在图位之上),播完连接层才写 hidden */
|
|
64
|
+
.xh-scope-image[data-part='placeholder']:is([data-state='loaded'], [data-state='error']) {
|
|
65
|
+
animation: xh-fade-out var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) forwards;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* display 会盖掉 hidden 属性的 UA 规则:淡出播完之后靠这条收起 */
|
|
69
|
+
.xh-scope-image[data-part='placeholder'][hidden] {
|
|
70
|
+
display: none;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* 回退内容:图标在上、说明在下竖排居中。自带不透明淡底,说明字的对比只看这一层,
|
|
74
|
+
不透出页底(次要字色压在半透明淡底上透出页底时到不了 4.5:1) */
|
|
75
|
+
.xh-scope-image[data-part='fallback'] {
|
|
76
|
+
box-sizing: border-box;
|
|
77
|
+
display: flex;
|
|
78
|
+
flex-direction: column;
|
|
79
|
+
align-items: center;
|
|
80
|
+
justify-content: center;
|
|
81
|
+
inline-size: 100%;
|
|
82
|
+
block-size: 100%;
|
|
83
|
+
/* 没给 ratio 时根盒子高度是 auto,回退内容自己撑出一个不塌的高度 */
|
|
84
|
+
min-block-size: var(--xh-image-fallback-min-h, var(--xh-control-h-lg));
|
|
85
|
+
padding-block: var(--xh-image-fallback-py, var(--xh-space-2));
|
|
86
|
+
padding-inline: var(--xh-image-fallback-px, var(--xh-space-4));
|
|
87
|
+
background: var(--xh-image-fallback-bg, var(--xh-bg-subtle-opaque));
|
|
88
|
+
color: var(--xh-image-fallback-fg, var(--xh-fg-subtle));
|
|
89
|
+
font-size: var(--xh-image-fallback-font-size, var(--xh-text-caption-size));
|
|
90
|
+
line-height: var(--xh-leading-relaxed);
|
|
91
|
+
text-align: center;
|
|
92
|
+
user-select: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* 图片载好:回退内容浮到图片之上原地淡出,与图片的淡入交叉;播完连接层才写 hidden */
|
|
96
|
+
.xh-scope-image[data-part='fallback'][data-state='loaded'] {
|
|
97
|
+
position: absolute;
|
|
98
|
+
inset: 0;
|
|
99
|
+
animation: xh-fade-out var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) forwards;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* display 会盖掉 hidden 属性的 UA 规则:延迟窗口内与淡出播完之后靠这条收起 */
|
|
103
|
+
.xh-scope-image[data-part='fallback'][hidden] {
|
|
104
|
+
display: none;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
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
|
+
/* 定义 infinite scroll 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 独立皮肤同时传递引入取下一页按钮的动作控件配方,full bundle 递归去重。 */
|
|
9
|
+
@import '../family/action-control.css';
|
|
10
|
+
|
|
11
|
+
@layer xihan.components {
|
|
12
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
13
|
+
.xh-scope-infinite-scroll {
|
|
14
|
+
--xh-infinite-scroll-skin: 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* 这里的 data-disabled 关掉的是「还取不取下一页」,列表本身照常可读可点:
|
|
18
|
+
光标交回给作者,不摆共享层那个「不可用」的样子 */
|
|
19
|
+
.xh-scope-infinite-scroll[data-part='root'][data-disabled] {
|
|
20
|
+
cursor: inherit;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* 列表外壳这一层刻意不给盒模型:滚的是页面还是作者自己的 overflow 容器、列表长什么样,
|
|
25
|
+
* 都归作者的布局管,组件只往它身上挂 data-loading / data-disabled 供作者取用。
|
|
26
|
+
* 一旦声明 display,UA 的 [hidden]{display:none} 就压不住了,故连 display 也不写。
|
|
27
|
+
*
|
|
28
|
+
* 哨兵是纯机制,不是可见元素:给它一条最细的高度让它有个能被观察到的盒子,
|
|
29
|
+
* 高度为 0 的元素在部分实现里交叠比恒为 0,永远等不到进入。
|
|
30
|
+
* 不吃指针:它紧贴在列表末尾,吃了指针就会挡住最后一条的点击。
|
|
31
|
+
*/
|
|
32
|
+
.xh-scope-infinite-scroll[data-part='sentinel'] {
|
|
33
|
+
display: block;
|
|
34
|
+
inline-size: 100%;
|
|
35
|
+
block-size: var(--xh-infinite-scroll-sentinel-size, var(--xh-stroke-thin));
|
|
36
|
+
pointer-events: none;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/*
|
|
40
|
+
* 取下一页的按钮:与哨兵同一条通路的键盘入口,摆在列表末尾自成一行——铺满一行的独立动作条目,
|
|
41
|
+
* 接 Action Control 的 row 档、outline 形态:宽度由容器给、高度随内容、按下只换面不缩放;
|
|
42
|
+
* 盒几何、中性描边与透明底、悬停 / 按下 / 禁用面、焦点环与粗指针热区全由家族给,
|
|
43
|
+
* 白底承载 hover 100 → pressed 200。这里只把使用者槽映射到桥接槽,文案居中写在下一条。
|
|
44
|
+
* 行高不吃家族的单行档:row 档允许换行、高度随内容,折行的文案走正文行高
|
|
45
|
+
*/
|
|
46
|
+
.xh-scope-infinite-scroll[data-part='load-more-trigger'] {
|
|
47
|
+
--xh-action-gap: var(--xh-infinite-scroll-load-more-gap, var(--xh-_action-profile-gap));
|
|
48
|
+
--xh-action-visual-size: var(--xh-infinite-scroll-load-more-h, var(--xh-_action-profile-visual-size));
|
|
49
|
+
--xh-action-padding-inline: var(--xh-infinite-scroll-load-more-px, var(--xh-_action-profile-padding-inline));
|
|
50
|
+
--xh-action-radius: var(--xh-infinite-scroll-load-more-radius, var(--xh-_action-profile-radius));
|
|
51
|
+
--xh-action-border-rest: var(--xh-infinite-scroll-load-more-border, var(--xh-_action-variant-border-rest));
|
|
52
|
+
--xh-action-border-hover: var(--xh-infinite-scroll-load-more-border-hover, var(--xh-_action-variant-border-hover));
|
|
53
|
+
--xh-action-border-pressed: var(--xh-infinite-scroll-load-more-border-hover, var(--xh-_action-variant-border-pressed));
|
|
54
|
+
--xh-action-bg-rest: var(--xh-infinite-scroll-load-more-bg, var(--xh-_action-variant-bg-rest));
|
|
55
|
+
--xh-action-bg-hover: var(--xh-infinite-scroll-load-more-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
56
|
+
--xh-action-bg-pressed: var(--xh-infinite-scroll-load-more-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
57
|
+
--xh-action-fg-rest: var(--xh-infinite-scroll-load-more-fg, var(--xh-_action-variant-fg-rest));
|
|
58
|
+
--xh-action-fg-hover: var(--xh-infinite-scroll-load-more-fg, var(--xh-_action-variant-fg-hover));
|
|
59
|
+
--xh-action-fg-pressed: var(--xh-infinite-scroll-load-more-fg, var(--xh-_action-variant-fg-pressed));
|
|
60
|
+
--xh-action-font-size: var(--xh-infinite-scroll-load-more-font-size, var(--xh-text-body-size));
|
|
61
|
+
/* 作者塞进钮里的图标按档取字形尺寸,与文案同一把尺 */
|
|
62
|
+
--xh-icon-size: var(--xh-infinite-scroll-load-more-icon-size, var(--xh-_action-profile-glyph-size));
|
|
63
|
+
|
|
64
|
+
line-height: var(--xh-leading-normal);
|
|
65
|
+
/* 到底了连点是常态,触屏上默认会当成双击缩放 */
|
|
66
|
+
touch-action: manipulation;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* 文案居中(单行整段居中,折行逐行居中),盖掉 row 档的靠起始缘排布:它是一行里唯一的东西,
|
|
70
|
+
靠起始缘会像一条没对齐的列表项。选择器点名 row 档,有层与无层两份产物里都压得住它 */
|
|
71
|
+
.xh-scope-infinite-scroll[data-part='load-more-trigger'][data-xh-action-profile='row'] {
|
|
72
|
+
justify-content: center;
|
|
73
|
+
text-align: center;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* 声明过 display 就盖掉了 UA 的 [hidden]{display:none},作者要藏哨兵时得自己补回来 */
|
|
77
|
+
.xh-scope-infinite-scroll[data-part='sentinel'][hidden],
|
|
78
|
+
.xh-scope-infinite-scroll[data-part='load-more-trigger'][hidden] {
|
|
79
|
+
display: none;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,323 @@
|
|
|
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
|
+
/* 定义 input group 样式。 */
|
|
7
|
+
|
|
8
|
+
@layer xihan.components {
|
|
9
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
10
|
+
.xh-scope-input-group {
|
|
11
|
+
--xh-input-group-skin: 1;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* 输入框、前后缀和动作共用一个输入表面。组只统一材质与外轮廓,语义仍归各子控件。 */
|
|
15
|
+
.xh-scope-input-group[data-part='root'] {
|
|
16
|
+
/* 段之间那几档层号只在自己人之间排序:建一个层叠上下文把它们关起来,
|
|
17
|
+
既不让页面上的层号插进来,也不让它们漏出去压住别人 */
|
|
18
|
+
isolation: isolate;
|
|
19
|
+
|
|
20
|
+
/* 缺省档。item 的高度、内衬与字号从这三个槽取,换档只改这里 */
|
|
21
|
+
--xh-_input-group-h: var(--xh-control-h-md);
|
|
22
|
+
--xh-_input-group-px: var(--xh-control-px-md);
|
|
23
|
+
--xh-_input-group-font-size: var(--xh-control-font-md);
|
|
24
|
+
/* 组壳与字段外壳同形:静息字段淡底 + --xh-border-control;悬停底不变、描边升 --xh-border-strong;
|
|
25
|
+
聚焦换承载面 + --xh-border-control-focus,不画聚焦环(强制色档补一圈 Highlight 环);无影 */
|
|
26
|
+
--xh-_input-group-bg: var(--xh-bg-field);
|
|
27
|
+
--xh-_input-group-bg-hover: var(--xh-bg-field);
|
|
28
|
+
--xh-_input-group-bg-focus: var(--xh-bg-surface);
|
|
29
|
+
--xh-_input-group-border: var(--xh-border-control);
|
|
30
|
+
--xh-_input-group-border-hover: var(--xh-border-strong);
|
|
31
|
+
--xh-_input-group-border-focus: var(--xh-border-control-focus);
|
|
32
|
+
--xh-_input-group-shadow: none;
|
|
33
|
+
|
|
34
|
+
position: relative;
|
|
35
|
+
display: inline-flex;
|
|
36
|
+
box-sizing: border-box;
|
|
37
|
+
align-items: stretch;
|
|
38
|
+
/* 整组是一个字段:不传尺寸时与单个字段同宽,组里的字段让位占满前后缀之外的那段 */
|
|
39
|
+
inline-size: var(--xh-input-group-w, var(--xh-control-w));
|
|
40
|
+
border-radius: var(--xh-input-group-radius, var(--xh-shape-control));
|
|
41
|
+
/* 面只在这一处画:各状态只换 --xh-_input-group-face 这一个槽,静息、悬停、失效、只读、禁用与聚焦
|
|
42
|
+
顺着同一条声明换色,过渡也只认这一处 */
|
|
43
|
+
--xh-_input-group-face: var(--xh-input-group-bg, var(--xh-_input-group-bg));
|
|
44
|
+
background: var(--xh-_input-group-face);
|
|
45
|
+
box-shadow: var(--xh-input-group-shadow, var(--xh-_input-group-shadow));
|
|
46
|
+
|
|
47
|
+
/* 父容器给不出这么宽时整组跟着收,不越出父容器 */
|
|
48
|
+
max-inline-size: 100%;
|
|
49
|
+
transition:
|
|
50
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
51
|
+
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* 外轮廓不占盒尺寸,组内控件仍保持与独立使用时相同的高度。 */
|
|
55
|
+
.xh-scope-input-group[data-part='root']::before {
|
|
56
|
+
content: '';
|
|
57
|
+
position: absolute;
|
|
58
|
+
z-index: 2;
|
|
59
|
+
inset: 0;
|
|
60
|
+
border: var(--xh-stroke-thin) solid var(--xh-input-group-border, var(--xh-_input-group-border));
|
|
61
|
+
border-radius: inherit;
|
|
62
|
+
pointer-events: none;
|
|
63
|
+
transition: border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* subtle:淡底顶替描边表达边界,描边只退成透明而不去掉;悬停浮出 --xh-border-control */
|
|
67
|
+
.xh-scope-input-group[data-part='root'][data-variant='subtle'] {
|
|
68
|
+
--xh-_input-group-bg: var(--xh-bg-subtle);
|
|
69
|
+
--xh-_input-group-bg-hover: var(--xh-bg-subtle-hover);
|
|
70
|
+
--xh-_input-group-bg-focus: var(--xh-bg-subtle);
|
|
71
|
+
--xh-_input-group-border: transparent;
|
|
72
|
+
--xh-_input-group-border-hover: var(--xh-border-control);
|
|
73
|
+
--xh-_input-group-shadow: none;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* ghost:静息不画壳,悬停与聚焦沿用下面的 hover / focus 规则浮出 --xh-border-control 与底 */
|
|
77
|
+
.xh-scope-input-group[data-part='root'][data-variant='ghost'] {
|
|
78
|
+
--xh-_input-group-bg: transparent;
|
|
79
|
+
--xh-_input-group-bg-hover: color-mix(in oklab, var(--xh-bg-subtle) 45%, transparent);
|
|
80
|
+
--xh-_input-group-bg-focus: transparent;
|
|
81
|
+
--xh-_input-group-border: transparent;
|
|
82
|
+
--xh-_input-group-border-hover: var(--xh-border-control);
|
|
83
|
+
--xh-_input-group-shadow: none;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* 悬停浮出描边与底:组里的字段只读、禁用或失效时不浮。只读与禁用和下面的禁用面一样只认带字段外壳的那一段,
|
|
87
|
+
组里单独禁用一颗按钮不让整组失去悬停 */
|
|
88
|
+
.xh-scope-input-group[data-part='root']:not(:has([data-xh-field-chrome]:is([data-disabled], [data-readonly]), [data-invalid], [aria-invalid='true'])):not(:focus-within):hover {
|
|
89
|
+
--xh-_input-group-face: var(--xh-input-group-bg-hover, var(--xh-_input-group-bg-hover));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.xh-scope-input-group[data-part='root']:not(:has([data-xh-field-chrome]:is([data-disabled], [data-readonly]), [data-invalid], [aria-invalid='true'])):not(:focus-within):hover::before {
|
|
93
|
+
border-color: var(--xh-input-group-border-hover, var(--xh-_input-group-border-hover));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* 组里的字段校验失败:失效描边 + 4% 失效色淡底,与字段外壳的失效档同一副面 */
|
|
97
|
+
.xh-scope-input-group[data-part='root']:has([data-invalid], [aria-invalid='true']) {
|
|
98
|
+
--xh-_input-group-face: var(--xh-input-group-bg-invalid, var(--xh-bg-field-invalid));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.xh-scope-input-group[data-part='root']:has([data-invalid], [aria-invalid='true'])::before {
|
|
102
|
+
border-color: var(--xh-input-group-border-invalid, var(--xh-border-invalid));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* 组里的字段只读 / 禁用:组壳换淡底,禁用另把描边退到 --xh-border-default;
|
|
106
|
+
只认带字段外壳的那一段,组里单独禁用一颗按钮不让整组变灰。
|
|
107
|
+
只读用 :where() 压低特指度,拿到焦点时与字段外壳一样让位给聚焦态 */
|
|
108
|
+
.xh-scope-input-group[data-part='root']:has(:where([data-xh-field-chrome][data-readonly])) {
|
|
109
|
+
--xh-_input-group-face: var(--xh-input-group-bg-read-only, var(--xh-bg-subtle));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.xh-scope-input-group[data-part='root']:has([data-xh-field-chrome][data-disabled]) {
|
|
113
|
+
--xh-_input-group-face: var(--xh-input-group-bg-disabled, var(--xh-bg-subtle));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.xh-scope-input-group[data-part='root']:has([data-xh-field-chrome][data-disabled])::before {
|
|
117
|
+
border-color: var(--xh-input-group-border-disabled, var(--xh-border-default));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* 聚焦排在失效之后:校验失败的字段拿到焦点时让位给聚焦态。
|
|
121
|
+
焦点由描边换色与承载面的底色差标出,不画聚焦环 */
|
|
122
|
+
.xh-scope-input-group[data-part='root']:focus-within {
|
|
123
|
+
--xh-_input-group-face: var(--xh-input-group-bg-focus, var(--xh-_input-group-bg-focus));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.xh-scope-input-group[data-part='root']:focus-within::before {
|
|
127
|
+
border-color: var(--xh-input-group-border-focus, var(--xh-_input-group-border-focus));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* 给了 display 的角色节点必须补这条:display 声明会盖掉 UA 的 [hidden]{display:none},
|
|
131
|
+
不补的话作者给节点加 hidden 后它照样显示 */
|
|
132
|
+
.xh-scope-input-group[data-part='root'][hidden] {
|
|
133
|
+
display: none;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* —— 尺寸 —— */
|
|
137
|
+
/* 档位跟着组内控件走:控件的档位就写在它自己的根上,组读得到,
|
|
138
|
+
于是前后缀块与邻座同高,作者不必把同一档在组上再写一遍。
|
|
139
|
+
缺省档写在上面的基础规则里 */
|
|
140
|
+
.xh-scope-input-group[data-part='root']:has([data-size='sm']) {
|
|
141
|
+
--xh-_input-group-h: var(--xh-control-h-sm);
|
|
142
|
+
--xh-_input-group-px: var(--xh-control-px-sm);
|
|
143
|
+
--xh-_input-group-font-size: var(--xh-control-font-sm);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.xh-scope-input-group[data-part='root']:has([data-size='lg']) {
|
|
147
|
+
--xh-_input-group-h: var(--xh-control-h-lg);
|
|
148
|
+
--xh-_input-group-px: var(--xh-control-px-lg);
|
|
149
|
+
--xh-_input-group-font-size: var(--xh-control-font-lg);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* 组上写了档位时以它为准:排在自动档后面,同特指度下压得住 */
|
|
153
|
+
.xh-scope-input-group[data-part='root'][data-size='sm'] {
|
|
154
|
+
--xh-_input-group-h: var(--xh-control-h-sm);
|
|
155
|
+
--xh-_input-group-px: var(--xh-control-px-sm);
|
|
156
|
+
--xh-_input-group-font-size: var(--xh-control-font-sm);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.xh-scope-input-group[data-part='root'][data-size='md'] {
|
|
160
|
+
--xh-_input-group-h: var(--xh-control-h-md);
|
|
161
|
+
--xh-_input-group-px: var(--xh-control-px-md);
|
|
162
|
+
--xh-_input-group-font-size: var(--xh-control-font-md);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.xh-scope-input-group[data-part='root'][data-size='lg'] {
|
|
166
|
+
--xh-_input-group-h: var(--xh-control-h-lg);
|
|
167
|
+
--xh-_input-group-px: var(--xh-control-px-lg);
|
|
168
|
+
--xh-_input-group-font-size: var(--xh-control-font-lg);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* 子控件不再各画一层输入表面,悬停与聚焦统一落在组的外轮廓。 */
|
|
172
|
+
.xh-scope-input-group[data-part='root'] [data-xh-field-chrome] {
|
|
173
|
+
--xh-field-bg-rest: transparent;
|
|
174
|
+
--xh-field-bg-hover: transparent;
|
|
175
|
+
--xh-field-bg-read-only: transparent;
|
|
176
|
+
--xh-field-bg-disabled: transparent;
|
|
177
|
+
--xh-field-border-rest: transparent;
|
|
178
|
+
--xh-field-border-hover: transparent;
|
|
179
|
+
--xh-field-border-focus: transparent;
|
|
180
|
+
--xh-field-border-invalid: transparent;
|
|
181
|
+
--xh-field-shadow-rest: none;
|
|
182
|
+
--xh-field-shadow-read-only: none;
|
|
183
|
+
--xh-field-shadow-disabled: none;
|
|
184
|
+
|
|
185
|
+
border-color: transparent;
|
|
186
|
+
background-color: transparent;
|
|
187
|
+
box-shadow: none;
|
|
188
|
+
/* 内层表面始终透明,不播放字段自身的边框/背景过渡,避免失焦时短暂闪回。 */
|
|
189
|
+
transition: none;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* 聚焦换色由组的外表面承担(强制色档的系统色环也画在组壳上),子输入保留焦点语义但不再自己画一圈。 */
|
|
193
|
+
.xh-scope-input-group[data-part='root'] [data-xh-field-chrome]:focus-within {
|
|
194
|
+
outline: none;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.xh-scope-input-group[data-part='root'] [data-xh-field-chrome]:hover,
|
|
198
|
+
.xh-scope-input-group[data-part='root'] [data-xh-field-chrome]:focus-within,
|
|
199
|
+
.xh-scope-input-group[data-part='root'] [data-xh-field-chrome][data-invalid],
|
|
200
|
+
.xh-scope-input-group[data-part='root'] [data-xh-field-chrome][data-readonly],
|
|
201
|
+
.xh-scope-input-group[data-part='root'] [data-xh-field-chrome][data-disabled] {
|
|
202
|
+
border-color: transparent;
|
|
203
|
+
background-color: transparent;
|
|
204
|
+
box-shadow: none;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* 组里的字段(带字段外壳的控件)占满前后缀与动作之外的剩余宽度,自己的缺省宽让位;
|
|
208
|
+
前后缀、按钮这些段按内容宽,不跟着撑开 */
|
|
209
|
+
.xh-scope-input-group[data-part='root'] > :is([data-xh-field-chrome], :has([data-xh-field-chrome])) {
|
|
210
|
+
flex: 1 1 0%;
|
|
211
|
+
min-inline-size: 0;
|
|
212
|
+
inline-size: auto;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* 每一段都是定位元素,动作控件的悬停面可以浮到外轮廓之上。 */
|
|
216
|
+
.xh-scope-input-group[data-part='root'] > * {
|
|
217
|
+
position: relative;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* 悬停或拿到焦点的动作段抬到外轮廓同层,自己的反馈不会被邻座覆盖。 */
|
|
221
|
+
.xh-scope-input-group[data-part='root'] > *:hover,
|
|
222
|
+
.xh-scope-input-group[data-part='root'] > *:focus-within {
|
|
223
|
+
z-index: 2;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/* —— 两端圆角 —— */
|
|
227
|
+
/* 画着描边的那个盒子有三种落点:段本身、段就是控件盒、控件盒在段里一层。
|
|
228
|
+
:is() 取其中最特指的一支算特指度,三种落点因此都压得住控件自己那条圆角规则。
|
|
229
|
+
只认直接子节点与它下面那一层:更深的节点是控件的内部结构,圆错了位置比直角更糟 */
|
|
230
|
+
.xh-scope-input-group[data-part='root'] > :is(*, [data-part='control'], [data-part='root']),
|
|
231
|
+
.xh-scope-input-group[data-part='root'] > * :is([data-part='control'], [data-part='root']) {
|
|
232
|
+
border-start-start-radius: 0;
|
|
233
|
+
border-start-end-radius: 0;
|
|
234
|
+
border-end-start-radius: 0;
|
|
235
|
+
border-end-end-radius: 0;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/* 逻辑角属性写,rtl 跟着换边,不必另写一套 */
|
|
239
|
+
.xh-scope-input-group[data-part='root'] > :is(*, [data-part='control'], [data-part='root']):first-child,
|
|
240
|
+
.xh-scope-input-group[data-part='root'] > *:first-child :is([data-part='control'], [data-part='root']) {
|
|
241
|
+
border-start-start-radius: var(--xh-input-group-radius, var(--xh-shape-control));
|
|
242
|
+
border-end-start-radius: var(--xh-input-group-radius, var(--xh-shape-control));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.xh-scope-input-group[data-part='root'] > :is(*, [data-part='control'], [data-part='root']):last-child,
|
|
246
|
+
.xh-scope-input-group[data-part='root'] > *:last-child :is([data-part='control'], [data-part='root']) {
|
|
247
|
+
border-start-end-radius: var(--xh-input-group-radius, var(--xh-shape-control));
|
|
248
|
+
border-end-end-radius: var(--xh-input-group-radius, var(--xh-shape-control));
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* —— 前后缀块 —— */
|
|
252
|
+
/* 前后缀是输入表面里的静态内容:铺一层淡底与可输入的那一段分开、取正文色,两侧内距对称;
|
|
253
|
+
不单独绘制外框或焦点状态,外轮廓与聚焦换色归组壳 */
|
|
254
|
+
.xh-scope-input-group[data-part='item'] {
|
|
255
|
+
display: inline-flex;
|
|
256
|
+
box-sizing: border-box;
|
|
257
|
+
flex: none;
|
|
258
|
+
align-items: center;
|
|
259
|
+
block-size: var(--xh-input-group-item-h, var(--xh-_input-group-h));
|
|
260
|
+
padding-inline: var(--xh-input-group-item-px, var(--xh-_input-group-px));
|
|
261
|
+
background-color: var(--xh-input-group-item-bg, var(--xh-bg-subtle));
|
|
262
|
+
color: var(--xh-input-group-item-fg, var(--xh-fg-default));
|
|
263
|
+
font-size: var(--xh-input-group-item-font-size, var(--xh-_input-group-font-size));
|
|
264
|
+
line-height: var(--xh-leading-none);
|
|
265
|
+
white-space: nowrap;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/* 与相邻段之间一道满高的缺省描边,只画在朝里的那一侧,外侧交给组壳的外轮廓。
|
|
269
|
+
两块前后缀挨着时只由后一块画:半透明描边两道相叠会叠深 */
|
|
270
|
+
.xh-scope-input-group[data-part='root'] > .xh-scope-input-group[data-part='item']:not(:first-child) {
|
|
271
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-input-group-item-divider, var(--xh-border-default));
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.xh-scope-input-group[data-part='root'] > .xh-scope-input-group[data-part='item']:not(:last-child):not(:has(+ .xh-scope-input-group[data-part='item'])) {
|
|
275
|
+
border-inline-end: var(--xh-stroke-thin) solid var(--xh-input-group-item-divider, var(--xh-border-default));
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.xh-scope-input-group[data-part='item'][hidden] {
|
|
279
|
+
display: none;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* 组里的字段禁用:前后缀块的字随字段禁用面换 --xh-fg-disabled,与组壳的禁用面同一个判据 */
|
|
283
|
+
.xh-scope-input-group[data-part='root']:has([data-xh-field-chrome][data-disabled]) > .xh-scope-input-group[data-part='item'] {
|
|
284
|
+
color: var(--xh-fg-disabled);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
@media (forced-colors: active) {
|
|
288
|
+
.xh-scope-input-group[data-part='root'] {
|
|
289
|
+
background: Canvas;
|
|
290
|
+
box-shadow: none;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.xh-scope-input-group[data-part='root']::before {
|
|
294
|
+
border-color: ButtonText;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/* 常规档不画环、只换描边色;这一档里描边换色未必分得出来,补一圈系统色环 */
|
|
298
|
+
.xh-scope-input-group[data-part='root']:focus-within {
|
|
299
|
+
outline: var(--xh-ring-width) solid Highlight;
|
|
300
|
+
outline-offset: var(--xh-ring-offset);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.xh-scope-input-group[data-part='root']:focus-within::before,
|
|
304
|
+
.xh-scope-input-group[data-part='root']:has([data-invalid], [aria-invalid='true'])::before {
|
|
305
|
+
border-color: Highlight;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.xh-scope-input-group[data-part='root']:has([data-xh-field-chrome][data-disabled])::before {
|
|
309
|
+
border-color: GrayText;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/* 淡底在这一档被抹成 Canvas,前后缀与输入段只剩分隔线分得开:线换系统色 */
|
|
313
|
+
.xh-scope-input-group[data-part='item'] {
|
|
314
|
+
background-color: Canvas;
|
|
315
|
+
color: CanvasText;
|
|
316
|
+
border-color: ButtonText;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.xh-scope-input-group[data-part='root']:has([data-xh-field-chrome][data-disabled]) > .xh-scope-input-group[data-part='item'] {
|
|
320
|
+
color: GrayText;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|