@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,379 @@
|
|
|
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
|
+
/* 定义 layout 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 独立皮肤传递引入折叠把手的动作控件配方,full bundle 递归去重。 */
|
|
9
|
+
@import '../family/action-control.css';
|
|
10
|
+
|
|
11
|
+
@layer xihan.components {
|
|
12
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
13
|
+
.xh-scope-layout {
|
|
14
|
+
--xh-layout-skin: 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* 页面骨架排成三行两列:头与脚各横贯一整行,侧栏与内容并排占中间那一行。
|
|
18
|
+
缺哪一段,对应的行/列就没有条目,宽高自动收成 0,不必为"少写一段"另立规则。
|
|
19
|
+
|
|
20
|
+
侧栏两档宽度与头的高度声明在根上:各段自己读这些槽,换档只改这里。
|
|
21
|
+
宽度槽用 -w 缩写,与同处的 --xh-layout-header-h 一致;两档宽度的缺省取侧栏令牌 --xh-sider-w / --xh-sider-collapsed-w。
|
|
22
|
+
头的高度之所以也归到根上:头吸顶时头这一行的轨道要按同一个值定高,两处必须同源。 */
|
|
23
|
+
.xh-scope-layout[data-part='root'] {
|
|
24
|
+
display: grid;
|
|
25
|
+
grid-template-areas:
|
|
26
|
+
'header header'
|
|
27
|
+
'sider content'
|
|
28
|
+
'footer footer';
|
|
29
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
30
|
+
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
31
|
+
background: var(--xh-layout-bg, var(--xh-bg-page));
|
|
32
|
+
color: var(--xh-layout-fg, var(--xh-fg-default));
|
|
33
|
+
--xh-_layout-sider-expanded-w: var(--xh-layout-sider-w, var(--xh-sider-w));
|
|
34
|
+
--xh-_layout-sider-w: var(--xh-_layout-sider-expanded-w);
|
|
35
|
+
--xh-_layout-sider-collapsed-w: var(--xh-layout-sider-collapsed-w, var(--xh-sider-collapsed-w));
|
|
36
|
+
--xh-_layout-header-h: var(--xh-layout-header-h, var(--xh-app-header-h));
|
|
37
|
+
/* 侧栏吸附时钉在哪条线上:缺省贴滚动容器上沿,头也吸顶时改成让开头的高度 */
|
|
38
|
+
--xh-_layout-sider-offset: 0px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* —— 侧栏断点 —— */
|
|
42
|
+
/* 写了断点档就先按窄屏排(折叠宽),视口宽到那一档再还原成展开宽。
|
|
43
|
+
移动优先、四档只用 min-width:媒体查询不改选择器权重,同时命中好几档时由源码序决定谁生效。
|
|
44
|
+
宽度写字面量:自定义属性在 @media 条件里不参与求值,令牌变量写在这里等于没写条件。
|
|
45
|
+
换的只是宽度,折叠态不动——那条通道归 siderCollapsed。 */
|
|
46
|
+
.xh-scope-layout[data-part='root'][data-sider-breakpoint] {
|
|
47
|
+
--xh-_layout-sider-w: var(--xh-_layout-sider-collapsed-w);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@media (min-width: 640px) {
|
|
51
|
+
.xh-scope-layout[data-part='root'][data-sider-breakpoint='sm'] {
|
|
52
|
+
--xh-_layout-sider-w: var(--xh-_layout-sider-expanded-w);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@media (min-width: 768px) {
|
|
57
|
+
.xh-scope-layout[data-part='root'][data-sider-breakpoint='md'] {
|
|
58
|
+
--xh-_layout-sider-w: var(--xh-_layout-sider-expanded-w);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@media (min-width: 1024px) {
|
|
63
|
+
.xh-scope-layout[data-part='root'][data-sider-breakpoint='lg'] {
|
|
64
|
+
--xh-_layout-sider-w: var(--xh-_layout-sider-expanded-w);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@media (min-width: 1280px) {
|
|
69
|
+
.xh-scope-layout[data-part='root'][data-sider-breakpoint='xl'] {
|
|
70
|
+
--xh-_layout-sider-w: var(--xh-_layout-sider-expanded-w);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* 侧栏挂到行尾:两列对调,内容在前 */
|
|
75
|
+
.xh-scope-layout[data-part='root'][data-sider-placement='end'] {
|
|
76
|
+
grid-template-areas:
|
|
77
|
+
'header header'
|
|
78
|
+
'content sider'
|
|
79
|
+
'footer footer';
|
|
80
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* —— 各段 —— */
|
|
84
|
+
.xh-scope-layout[data-part='header'] {
|
|
85
|
+
display: flex;
|
|
86
|
+
grid-area: header;
|
|
87
|
+
align-items: center;
|
|
88
|
+
gap: var(--xh-layout-header-gap, var(--xh-space-3));
|
|
89
|
+
block-size: var(--xh-_layout-header-h);
|
|
90
|
+
padding-inline: var(--xh-layout-header-px, var(--xh-space-4));
|
|
91
|
+
background: var(--xh-layout-header-bg, var(--xh-bg-surface));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* 宽度过渡在这里声明一次,展开与折叠两档、以及 props 直接写进内联的宽度,走的都是这一条。
|
|
95
|
+
侧栏与头同是白底承载面,坐在灰的页面底上:把手摆进来走白底阶梯 hover 100 → pressed 200 */
|
|
96
|
+
.xh-scope-layout[data-part='sider'] {
|
|
97
|
+
/* 内衬缺省一档,装了 SideNav 的侧栏在下面归零;覆盖档与安全区取大时读的也是这一支 */
|
|
98
|
+
--xh-_layout-sider-padding: var(--xh-space-3);
|
|
99
|
+
|
|
100
|
+
grid-area: sider;
|
|
101
|
+
inline-size: var(--xh-_layout-sider-w);
|
|
102
|
+
overflow: hidden;
|
|
103
|
+
padding: var(--xh-layout-sider-padding, var(--xh-_layout-sider-padding));
|
|
104
|
+
background: var(--xh-layout-sider-bg, var(--xh-bg-surface));
|
|
105
|
+
transition: inline-size var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* 折起来时不换行:窄到放不下的那几个字直接被 overflow 裁掉,不会挤成一列竖排 */
|
|
109
|
+
.xh-scope-layout[data-part='sider'][data-collapsed] {
|
|
110
|
+
inline-size: var(--xh-_layout-sider-collapsed-w);
|
|
111
|
+
white-space: nowrap;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* 侧栏里装着 SideNav 时内衬缺省归零:SideNav 自带一圈内衬,宽度又与侧栏同取侧栏令牌,
|
|
115
|
+
再叠一圈侧栏内衬,导航就比侧栏的内容盒宽出两侧内衬、右缘被裁掉。
|
|
116
|
+
认后代而不是子代:Web Components 在侧栏与导航根之间隔着 <xh-side-nav> 宿主。
|
|
117
|
+
不认 :has() 的引擎(Firefox 121 以前)照旧留内衬,导航右缘被裁,与改动前一致 */
|
|
118
|
+
.xh-scope-layout[data-part='sider']:has(.xh-scope-side-nav[data-part='root']) {
|
|
119
|
+
--xh-_layout-sider-padding: 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* 侧栏里的 SideNav 跟着侧栏收放:侧栏这一次开合直接落位(首帧、跨过断点)时,导航的宽度同样直接落位 */
|
|
123
|
+
.xh-scope-layout[data-part='sider'][data-instant] .xh-scope-side-nav[data-part='root'] {
|
|
124
|
+
transition: none;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.xh-scope-layout[data-part='content'] {
|
|
128
|
+
grid-area: content;
|
|
129
|
+
/* 内容列已是 minmax(0, 1fr),这里再声明一次,宽表格与长串文本才撑不破列 */
|
|
130
|
+
min-inline-size: 0;
|
|
131
|
+
padding: var(--xh-layout-content-padding, var(--xh-space-4));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.xh-scope-layout[data-part='footer'] {
|
|
135
|
+
grid-area: footer;
|
|
136
|
+
padding: var(--xh-layout-footer-padding, var(--xh-space-3) var(--xh-space-4));
|
|
137
|
+
background: var(--xh-layout-footer-bg, var(--xh-bg-surface));
|
|
138
|
+
color: var(--xh-fg-muted);
|
|
139
|
+
font-size: var(--xh-text-secondary-size);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* —— 折叠把手 —— */
|
|
143
|
+
/* 一枚小档文字按钮:盒型、悬停 / 按下面与按压缩放由 Action Control 的 text 档给(ghost 形态,sm 档:
|
|
144
|
+
摆在顶栏等白底上按画布承载 hover 100 → pressed 200,摆进占位档侧栏时由侧栏下发 host 槽 200 → 300,
|
|
145
|
+
覆盖档侧栏是 elevated 白底、仍是 100 → 200);
|
|
146
|
+
这里只把使用者槽映射到桥接槽(-gap / -px / -radius / -bg / -bg-hover / -bg-active / -fg 保留为第一参数) */
|
|
147
|
+
.xh-scope-layout[data-part='sider-trigger'] {
|
|
148
|
+
--xh-action-gap: var(--xh-layout-sider-trigger-gap, var(--xh-_action-profile-gap));
|
|
149
|
+
--xh-action-padding-inline: var(--xh-layout-sider-trigger-px, var(--xh-_action-profile-padding-inline));
|
|
150
|
+
--xh-action-radius: var(--xh-layout-sider-trigger-radius, var(--xh-_action-profile-radius));
|
|
151
|
+
--xh-action-bg-rest: var(--xh-layout-sider-trigger-bg, var(--xh-_action-variant-bg-rest));
|
|
152
|
+
--xh-action-bg-hover: var(--xh-layout-sider-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
153
|
+
--xh-action-bg-pressed: var(--xh-layout-sider-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
154
|
+
--xh-action-fg-rest: var(--xh-layout-sider-trigger-fg, var(--xh-_action-variant-fg-rest));
|
|
155
|
+
--xh-action-fg-hover: var(--xh-layout-sider-trigger-fg, var(--xh-_action-variant-fg-hover));
|
|
156
|
+
--xh-action-fg-pressed: var(--xh-layout-sider-trigger-fg, var(--xh-_action-variant-fg-pressed));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* —— 分隔线 —— */
|
|
160
|
+
/* 头与侧栏都是白底:头的下沿与侧栏挨着内容的那一边缺省画一条内部分隔,两块白面才分得开;
|
|
161
|
+
作者开了 split 再换成 border-default,并把内容与尾也隔开 */
|
|
162
|
+
.xh-scope-layout[data-part='header'] {
|
|
163
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-subtle));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.xh-scope-layout[data-part='sider'][data-placement='start'] {
|
|
167
|
+
border-inline-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-subtle));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.xh-scope-layout[data-part='sider'][data-placement='end'] {
|
|
171
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-subtle));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* 后代选择器带上 data-scope:骨架里装着整页内容,光凭 data-part 会连里面别的组件同名段一起画上线 */
|
|
175
|
+
.xh-scope-layout[data-part='root'][data-split] .xh-scope-layout[data-part='header'] {
|
|
176
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-default));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.xh-scope-layout[data-part='root'][data-split] .xh-scope-layout[data-part='footer'] {
|
|
180
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-default));
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* 侧栏只在挨着内容的那一边画线,另一边贴着骨架外沿,画了就是一条多出来的边框 */
|
|
184
|
+
.xh-scope-layout[data-part='root'][data-split] .xh-scope-layout[data-part='sider'][data-placement='start'] {
|
|
185
|
+
border-inline-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-default));
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.xh-scope-layout[data-part='root'][data-split] .xh-scope-layout[data-part='sider'][data-placement='end'] {
|
|
189
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-default));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* —— 固定定位 —— */
|
|
193
|
+
/* 滚动容器的分工:滚动发生在骨架外面——root 的高度跟着内容长,页面(或作者套在外层的
|
|
194
|
+
那个定高盒子)才是滚动容器;content 不改成滚动容器。
|
|
195
|
+
两条理由:一是 content 自己滚的话头与侧栏本来就不会动,两个开关也就没有区别了;
|
|
196
|
+
二是 sticky 的行程被自己的包含块框住,root 一旦定高,行里的轨道就不再跟着内容长,
|
|
197
|
+
钉住的那一段滚过一屏后会被包含块拽走。
|
|
198
|
+
由此还有一条:给 root 写 overflow(比如为了圆角裁剪)会让它自己变成一个永远滚不动的
|
|
199
|
+
滚动容器,里面的 sticky 随之成为空操作——要固定就把 overflow 挪到 root 外面那层。 */
|
|
200
|
+
|
|
201
|
+
/* 头这一行改成定高:下面那条让头跨满所有行,行 1 就没有条目撑着它了 */
|
|
202
|
+
.xh-scope-layout[data-part='root'][data-header-fixed] {
|
|
203
|
+
grid-template-rows: var(--xh-_layout-header-h) minmax(0, 1fr) auto;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* 跨满所有行只为把包含块撑到整副骨架那么高:头若只占行 1,包含块与它自己一样高,
|
|
207
|
+
sticky 的行程就是 0,钉住与不钉住看不出区别。
|
|
208
|
+
起始缘对齐把它按回行 1 的位置,视觉上与不固定时一样;高度被作者改成 auto 时也不会被拉满整块区域。
|
|
209
|
+
头的背景(--xh-layout-header-bg)要留实色,否则滚过去的正文会从头底下透出来。 */
|
|
210
|
+
.xh-scope-layout[data-part='header'][data-fixed] {
|
|
211
|
+
position: sticky;
|
|
212
|
+
z-index: var(--xh-layout-header-layer, var(--xh-layer-sticky));
|
|
213
|
+
grid-row: 1 / -1;
|
|
214
|
+
align-self: start;
|
|
215
|
+
inset-block-start: 0;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* liquid 档:吸顶的顶栏是内容从下面滚过的导航层,换成液态面。贴边铺满的栏不取圆角,
|
|
219
|
+
边界由下沿那条墨色细线承担。液态面是墨色域,前景在这里按域重取,子孙跟着继承。
|
|
220
|
+
滚过深浅分界时色调翻转:底色、字色、细线与投影一起淡变,不在同一帧跳 */
|
|
221
|
+
:where([data-material='liquid']) .xh-scope-layout[data-part='header'][data-fixed][data-xh-liquid] {
|
|
222
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-material-liquid-border));
|
|
223
|
+
background: var(--xh-layout-header-bg, var(--xh-_liquid-bg));
|
|
224
|
+
color: var(--xh-material-liquid-fg);
|
|
225
|
+
box-shadow: var(--xh-_liquid-shadow);
|
|
226
|
+
-webkit-backdrop-filter: var(--xh-material-liquid-backdrop);
|
|
227
|
+
backdrop-filter: var(--xh-material-liquid-backdrop);
|
|
228
|
+
transition:
|
|
229
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
230
|
+
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
231
|
+
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
232
|
+
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* 头也吸顶时侧栏钉在头的下沿,两段不叠在一起 */
|
|
236
|
+
.xh-scope-layout[data-part='root'][data-header-fixed][data-sider-fixed] {
|
|
237
|
+
--xh-_layout-sider-offset: var(--xh-_layout-header-h);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* 侧栏保持默认的拉伸对齐,只加一道高度上限:内容短时它照旧填满整列,内容长过一屏时它收成
|
|
241
|
+
可视区那么高,短出来的那一段就是 sticky 的行程。
|
|
242
|
+
上限量的是滚动容器可视区的高度,缺省按视口算;滚动容器不是视口时由作者把那个高度写进
|
|
243
|
+
--xh-layout-scrollport-h。视口取 dvh:移动端地址栏收放会改变可视高度,dvh 跟着变;
|
|
244
|
+
不认 dvh 的引擎由级联回落到前一条的 vh。
|
|
245
|
+
侧栏自己的条目多到装不下时在内部滚,横轴仍归上面那条 overflow: hidden 裁,
|
|
246
|
+
折叠态靠它把放不下的字裁掉;逻辑属性 overflow-block 尚无可用实现,写物理轴。 */
|
|
247
|
+
.xh-scope-layout[data-part='sider'][data-fixed] {
|
|
248
|
+
position: sticky;
|
|
249
|
+
inset-block-start: var(--xh-_layout-sider-offset);
|
|
250
|
+
max-block-size: calc(var(--xh-layout-scrollport-h, 100vh) - var(--xh-_layout-sider-offset));
|
|
251
|
+
max-block-size: calc(var(--xh-layout-scrollport-h, 100dvh) - var(--xh-_layout-sider-offset));
|
|
252
|
+
overflow-y: auto;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* —— 侧栏覆盖档 —— */
|
|
256
|
+
/* 侧栏移出画外、盖在内容之上:面板脱离网格,侧栏那一列于是收成零宽,内容占满整行。
|
|
257
|
+
排在固定定位那一节之后:两处特指度相同,覆盖档要盖住 sticky 那一档。
|
|
258
|
+
参照的是视口,与上面 sticky 那条同一个注意事项:整副骨架装进带 transform / filter 的祖先里时,
|
|
259
|
+
固定定位的包含块会换成那个祖先,面板跟着一起滚。 */
|
|
260
|
+
.xh-scope-layout[data-part='sider'][data-presentation='sheet'] {
|
|
261
|
+
/* 位移方向的私有槽位:默认按行首 + LTR,行尾与 RTL 在下面翻符号。幅度取整幅位移令牌,
|
|
262
|
+
减弱动效下归零。写成槽位而不是写死物理方向:贴边用的是逻辑 inset,RTL 下行首落在物理右边,
|
|
263
|
+
位移若写死物理方向就会出现「贴在右边、却从左边滑进来」 */
|
|
264
|
+
--xh-_layout-sheet-shift: calc(-1 * var(--xh-motion-travel));
|
|
265
|
+
|
|
266
|
+
position: fixed;
|
|
267
|
+
z-index: var(--xh-layout-sider-layer, var(--xh-layer-drawer));
|
|
268
|
+
inset-block: 0;
|
|
269
|
+
inset-inline-start: 0;
|
|
270
|
+
inset-inline-end: auto;
|
|
271
|
+
inline-size: var(--xh-_layout-sider-expanded-w);
|
|
272
|
+
/* 面板贴死上下两条边,高度上限就是滚动容器可视区那么高——上面 sticky 那一档的
|
|
273
|
+
「减去顶栏偏移」在这一档不作数:覆盖档从视口顶铺到底。
|
|
274
|
+
不认 dvh 的引擎由级联回落到前一条的 vh */
|
|
275
|
+
max-block-size: var(--xh-layout-scrollport-h, 100vh);
|
|
276
|
+
max-block-size: var(--xh-layout-scrollport-h, 100dvh);
|
|
277
|
+
/* 贴死视口的那一档,内衬与安全区取大的一头:刘海、圆角与底部横条压住的那一段由系统给出。
|
|
278
|
+
桌面上 env() 恒为 0,取值与内衬槽完全一致。安全区只有物理方向的四个名字,
|
|
279
|
+
行内轴上两侧同取较宽的那一段,RTL 下不会翻错边 */
|
|
280
|
+
padding-block-start: max(var(--xh-layout-sider-padding, var(--xh-_layout-sider-padding)), env(safe-area-inset-top));
|
|
281
|
+
padding-block-end: max(var(--xh-layout-sider-padding, var(--xh-_layout-sider-padding)), env(safe-area-inset-bottom));
|
|
282
|
+
padding-inline: max(
|
|
283
|
+
var(--xh-layout-sider-padding, var(--xh-_layout-sider-padding)),
|
|
284
|
+
env(safe-area-inset-left),
|
|
285
|
+
env(safe-area-inset-right)
|
|
286
|
+
);
|
|
287
|
+
/* 盖在内容之上、带遮罩的一面走 sheet 三件套(--xh-material-elevated-bg / -border / -shadow),
|
|
288
|
+
贴着内容那一侧描一条边;占位档的侧栏不画投影 */
|
|
289
|
+
border-inline-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-material-elevated-border));
|
|
290
|
+
background: var(--xh-layout-sider-bg, var(--xh-material-elevated-bg));
|
|
291
|
+
box-shadow: var(--xh-layout-sider-shadow, var(--xh-material-elevated-shadow));
|
|
292
|
+
translate: 0 0;
|
|
293
|
+
visibility: visible;
|
|
294
|
+
/* 条目多到装不下时在面板内部滚:这一档的高度就是视口那么高。
|
|
295
|
+
overscroll 不在这里写 contain:这一面与占位档共用同一个部件,scroll-surface-registry 把侧栏整体登记为
|
|
296
|
+
页内结构容器(overscroll=false),门禁按整个部件核,不按档分 */
|
|
297
|
+
overflow-y: auto;
|
|
298
|
+
/* 推出来走 slide 档:视口尺度的位移。并列的不透明度取淡变档:
|
|
299
|
+
缺省两端都是不透明、看不出来,减弱动效下整幅位移归零、由它表达进出。
|
|
300
|
+
visibility 展开那一路立刻露出来 */
|
|
301
|
+
opacity: 1;
|
|
302
|
+
transition:
|
|
303
|
+
translate var(--xh-motion-duration-slide) var(--xh-motion-ease-slide),
|
|
304
|
+
opacity var(--xh-motion-duration-enter) var(--xh-motion-ease-enter),
|
|
305
|
+
visibility var(--xh-motion-duration-slide) var(--xh-motion-ease-slide);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* 挂在行尾:贴另一条边,位移随之反向,描边也换到贴着内容的那一侧 */
|
|
309
|
+
.xh-scope-layout[data-part='sider'][data-presentation='sheet'][data-placement='end'] {
|
|
310
|
+
--xh-_layout-sheet-shift: var(--xh-motion-travel);
|
|
311
|
+
|
|
312
|
+
inset-inline-start: auto;
|
|
313
|
+
inset-inline-end: 0;
|
|
314
|
+
border-inline-end: 0;
|
|
315
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-material-elevated-border));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
.xh-scope-layout[data-part='sider'][data-presentation='sheet']:dir(rtl) {
|
|
319
|
+
--xh-_layout-sheet-shift: var(--xh-motion-travel);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.xh-scope-layout[data-part='sider'][data-presentation='sheet'][data-placement='end']:dir(rtl) {
|
|
323
|
+
--xh-_layout-sheet-shift: calc(-1 * var(--xh-motion-travel));
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/* 收起:推出画外并让出无障碍树与 Tab 序列。位移量按面板自身宽度的百分比算,
|
|
327
|
+
宽度换成任何一档都正好推到画外。收进去是退场,位移与淡出同走退场档,
|
|
328
|
+
visibility 等这一段播完才真正藏起来;减弱动效下位移归零,只剩淡出 */
|
|
329
|
+
.xh-scope-layout[data-part='sider'][data-presentation='sheet'][data-collapsed] {
|
|
330
|
+
translate: var(--xh-_layout-sheet-shift) 0;
|
|
331
|
+
opacity: var(--xh-motion-travel-opacity);
|
|
332
|
+
visibility: hidden;
|
|
333
|
+
transition:
|
|
334
|
+
translate var(--xh-motion-duration-exit) var(--xh-motion-ease-exit),
|
|
335
|
+
opacity var(--xh-motion-duration-exit) var(--xh-motion-ease-exit),
|
|
336
|
+
visibility var(--xh-motion-duration-exit) var(--xh-motion-ease-exit);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/* 覆盖档的遮罩:与面板同一个层号,谁盖谁看文档序——遮罩写在侧栏之前。
|
|
340
|
+
占位档下连接层给它打 hidden,这里不必再管 */
|
|
341
|
+
.xh-scope-layout[data-part='sider-backdrop'] {
|
|
342
|
+
position: fixed;
|
|
343
|
+
z-index: var(--xh-layout-sider-backdrop-layer, var(--xh-layer-drawer));
|
|
344
|
+
inset: 0;
|
|
345
|
+
background: var(--xh-layout-sider-backdrop-bg, var(--xh-bg-overlay));
|
|
346
|
+
opacity: 1;
|
|
347
|
+
transition: opacity var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* 收起态:淡出并让开指针,底下的内容照常点得到;淡出走退场档 */
|
|
351
|
+
.xh-scope-layout[data-part='sider-backdrop'][data-collapsed] {
|
|
352
|
+
opacity: 0;
|
|
353
|
+
pointer-events: none;
|
|
354
|
+
transition: opacity var(--xh-motion-duration-exit) var(--xh-motion-ease-exit);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/* 侧栏与遮罩的过渡只给用户的开合:首帧与跨过断点这类环境引起的开合,连接层投影 data-instant,
|
|
358
|
+
直接落位。三条各压过同一部件上带过渡的那一档(占位 / 覆盖展开、覆盖收起、遮罩收起) */
|
|
359
|
+
.xh-scope-layout:is([data-part='sider'], [data-part='sider-backdrop'])[data-instant],
|
|
360
|
+
.xh-scope-layout[data-part='sider'][data-presentation='sheet'][data-collapsed][data-instant],
|
|
361
|
+
.xh-scope-layout[data-part='sider-backdrop'][data-collapsed][data-instant] {
|
|
362
|
+
transition: none;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/* 纸上没有覆盖这回事:遮罩印出来就是盖住正文的一片灰 */
|
|
366
|
+
@media print {
|
|
367
|
+
.xh-scope-layout[data-part='sider-backdrop'] {
|
|
368
|
+
display: none;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
373
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
374
|
+
.xh-scope-layout[data-part='root'][hidden],
|
|
375
|
+
.xh-scope-layout[data-part='header'][hidden],
|
|
376
|
+
.xh-scope-layout[data-part='sider-trigger'][hidden] {
|
|
377
|
+
display: none;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
@@ -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
|
+
/*
|
|
7
|
+
* 液态材质层:与组件无关,全库共用一份。
|
|
8
|
+
*
|
|
9
|
+
* data-material="liquid" 下,连接层投影了 data-xh-liquid 的导航层部件(浮动钮、回到顶部等浮在内容之上的控制面)
|
|
10
|
+
* 换成液态面。这里只声明私有槽,各组件皮肤在自己的部件上把 Action Control 的桥接槽指过来;standard 档下
|
|
11
|
+
* 这些槽没人读,部件保持原材质。
|
|
12
|
+
*
|
|
13
|
+
* 静态形态(服务端、挂载前,或液态面还没判定下层):色调随主题极性,不透明度取可读下限,这一档对任何
|
|
14
|
+
* 下层都保证标签 4.5:1。组件的状态机把部件挂进 core 的液态面,由它按下层在部件上写:
|
|
15
|
+
* data-xh-ink dark / light:部件成为黑墨或白墨域。墨色域本身是浅色 / 深色主题边界,
|
|
16
|
+
* 按主题取值的液态通道随之落到那一种色调
|
|
17
|
+
* data-xh-liquid-clarity clear:下层均匀且色调已知,换通透档
|
|
18
|
+
* --xh-_liquid-light-x / -y 光源方向的单位向量,决定 1px 亮边落在哪一侧
|
|
19
|
+
* --xh-_liquid-deform 按住时的形变(transform 串),松手弹回后撤掉
|
|
20
|
+
*
|
|
21
|
+
* 同一宿主里的几块可以结成液态组(core 的 trackLiquidGoo):宿主带 data-xh-liquid-goo,最前面多一层
|
|
22
|
+
* [data-xh-liquid-goo-layer] 色块层,沿整组的外形画底色、墨色细线、亮边与投影;组件皮肤在这一档把块自己的
|
|
23
|
+
* 面、细线、亮边与投影撤掉,只留磨砂。
|
|
24
|
+
*/
|
|
25
|
+
@layer xihan.components {
|
|
26
|
+
:where([data-material='liquid']) [data-xh-liquid] {
|
|
27
|
+
/* 光源缺省在左上方 */
|
|
28
|
+
--xh-_liquid-light-x: -0.71;
|
|
29
|
+
--xh-_liquid-light-y: -0.71;
|
|
30
|
+
--xh-_liquid-bg: var(--xh-material-liquid-bg);
|
|
31
|
+
/* 1px 亮边是两层零模糊内阴影:阴影形状朝背光方向偏移,露出的一弯落在朝光源的一侧,
|
|
32
|
+
另一层反过来偏移,在背光一侧留一道弱亮边。面内不加高光 */
|
|
33
|
+
--xh-_liquid-rim:
|
|
34
|
+
inset calc(var(--xh-_liquid-light-x) * var(--xh-stroke-thin) * -1) calc(var(--xh-_liquid-light-y) * var(--xh-stroke-thin) * -1) 0 0 var(--xh-material-liquid-highlight),
|
|
35
|
+
inset calc(var(--xh-_liquid-light-x) * var(--xh-stroke-thin)) calc(var(--xh-_liquid-light-y) * var(--xh-stroke-thin)) 0 0 var(--xh-material-liquid-rim-far);
|
|
36
|
+
--xh-_liquid-shadow: var(--xh-_liquid-rim), var(--xh-material-liquid-shadow);
|
|
37
|
+
/* 交互阶梯往部件自己的前景色兑:浅色调变深、深色调变浅 */
|
|
38
|
+
--xh-_liquid-bg-hover: color-mix(in oklab, var(--xh-_liquid-bg), var(--xh-material-liquid-fg) 8%);
|
|
39
|
+
--xh-_liquid-bg-pressed: color-mix(in oklab, var(--xh-_liquid-bg), var(--xh-material-liquid-fg) 14%);
|
|
40
|
+
/* 按住时的黏滞形变:液态面在手指按住期间逐帧写进来(朝手指鼓出、沿指向拉长、另一个方向压扁),
|
|
41
|
+
松手由弹簧带回后撤掉;组件皮肤拿它当 transform。没按住时为 none */
|
|
42
|
+
--xh-_liquid-deform: none;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* 通透档:下层均匀且色调已知时由液态面写上,着色按主题取值,已随墨色域落到对应色调 */
|
|
46
|
+
:where([data-material='liquid']) [data-xh-liquid][data-xh-liquid-clarity='clear'] {
|
|
47
|
+
--xh-_liquid-bg: color-mix(in oklab, var(--xh-material-liquid-tint) calc(var(--xh-material-liquid-alpha-clear) * 100%), transparent);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* 液态组的色块层:core 在宿主最前面生成(aria-hidden、不接指针),压在各块之下,每块一个色块,
|
|
51
|
+
跟着块的盒子、圆角与变换走。色块层套 core 放在它旁边的粘连滤镜(行内 filter),滤镜只取色块的轮廓,
|
|
52
|
+
把靠得够近的连成一片,再沿整体外形画液态面:投影、底色、墨色细线、朝光亮边与背光弱亮边,颜色都在下面
|
|
53
|
+
按段取液态令牌,投影由色块自己带着、滤镜只留外形之外的那部分。色调(墨色域)与通透档由 core 按源块的
|
|
54
|
+
读数同步到色块层与装滤镜的 <svg> 上。
|
|
55
|
+
色块层不设层号,靠排在宿主最前压在各块之下:宿主须是定位元素,组里的块须是定位元素(或装在定位容器里)。
|
|
56
|
+
层往外多铺一圈,给模糊与投影留出余地。组件可以在自己的宿主上改写投影槽,把使用者的投影槽接进来 */
|
|
57
|
+
[data-xh-liquid-goo-layer] {
|
|
58
|
+
--xh-_liquid-goo-shadow: var(--xh-material-liquid-shadow);
|
|
59
|
+
|
|
60
|
+
position: absolute;
|
|
61
|
+
inset: calc(-1 * var(--xh-space-8));
|
|
62
|
+
pointer-events: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* 色块提供轮廓与投影,底色由滤镜铺 */
|
|
66
|
+
[data-xh-liquid-goo-layer] > span {
|
|
67
|
+
position: absolute;
|
|
68
|
+
box-sizing: border-box;
|
|
69
|
+
background-color: var(--xh-material-liquid-tint);
|
|
70
|
+
box-shadow: var(--xh-_liquid-goo-shadow);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
[data-xh-liquid-goo-filter] [data-xh-goo-paint='fill'] {
|
|
74
|
+
flood-color: var(--xh-material-liquid-tint);
|
|
75
|
+
flood-opacity: var(--xh-material-liquid-alpha-floor);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
[data-xh-liquid-goo-filter][data-xh-liquid-clarity='clear'] [data-xh-goo-paint='fill'] {
|
|
79
|
+
flood-opacity: var(--xh-material-liquid-alpha-clear);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
[data-xh-liquid-goo-filter] [data-xh-goo-paint='edge'] {
|
|
83
|
+
flood-color: var(--xh-material-liquid-border);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
[data-xh-liquid-goo-filter] [data-xh-goo-paint='near'] {
|
|
87
|
+
flood-color: var(--xh-material-liquid-highlight);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
[data-xh-liquid-goo-filter] [data-xh-goo-paint='far'] {
|
|
91
|
+
flood-color: var(--xh-material-liquid-rim-far);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* 强制色:系统配色下只留块自己的边,装饰色块撤掉 */
|
|
95
|
+
@media (forced-colors: active) {
|
|
96
|
+
[data-xh-liquid-goo-layer] {
|
|
97
|
+
display: none;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* 从右往左排版时光源缺省在右上方 */
|
|
102
|
+
:where([dir='rtl']) :where([data-material='liquid']) [data-xh-liquid],
|
|
103
|
+
:where([data-material='liquid']) :where([dir='rtl']) [data-xh-liquid] {
|
|
104
|
+
--xh-_liquid-light-x: 0.71;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
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
|
+
/* 定义 list 样式。 */
|
|
7
|
+
|
|
8
|
+
@layer xihan.components {
|
|
9
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
10
|
+
.xh-scope-list {
|
|
11
|
+
--xh-list-skin: 1;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.xh-scope-list[data-part='root'] {
|
|
15
|
+
/* 一个尺寸档只换这几个私有槽,条目与两行文字都从根上继承它们,
|
|
16
|
+
换档不必给每个部件各写一条选择器 */
|
|
17
|
+
--xh-_list-item-py: var(--xh-list-item-py-md);
|
|
18
|
+
--xh-_list-item-px: var(--xh-list-item-px-md);
|
|
19
|
+
--xh-_list-item-gap: var(--xh-space-4);
|
|
20
|
+
--xh-_list-title-size: var(--xh-control-font-md);
|
|
21
|
+
--xh-_list-description-size: var(--xh-control-font-md);
|
|
22
|
+
/* 条目悬停换到的面:坐在白底上是 100,淡底档的根把它抬到 200(按承载面的阶梯) */
|
|
23
|
+
--xh-_list-item-bg-hover: var(--xh-bg-subtle);
|
|
24
|
+
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
/* 根可能写成 ul/ol,UA 的项目符号与左缩进在这里清掉:换哪个标签都排成同一个样子 */
|
|
28
|
+
margin: 0;
|
|
29
|
+
padding: 0;
|
|
30
|
+
list-style: none;
|
|
31
|
+
color: var(--xh-list-fg, var(--xh-fg-default));
|
|
32
|
+
font-size: var(--xh-text-body-size);
|
|
33
|
+
line-height: var(--xh-text-body-leading);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* 上面声明了 display,会盖掉 UA 的 [hidden] 规则,收起态要在这里接回来 */
|
|
37
|
+
.xh-scope-list[data-part='root'][hidden] {
|
|
38
|
+
display: none;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* —— 尺寸 —— */
|
|
42
|
+
.xh-scope-list[data-part='root'][data-size='sm'] {
|
|
43
|
+
--xh-_list-item-py: var(--xh-list-item-py-sm);
|
|
44
|
+
--xh-_list-item-px: var(--xh-list-item-px-sm);
|
|
45
|
+
--xh-_list-item-gap: var(--xh-space-3);
|
|
46
|
+
--xh-_list-title-size: var(--xh-control-font-sm);
|
|
47
|
+
--xh-_list-description-size: var(--xh-control-font-sm);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.xh-scope-list[data-part='root'][data-size='lg'] {
|
|
51
|
+
--xh-_list-item-py: var(--xh-list-item-py-lg);
|
|
52
|
+
--xh-_list-item-px: var(--xh-list-item-px-lg);
|
|
53
|
+
--xh-_list-item-gap: var(--xh-space-5);
|
|
54
|
+
--xh-_list-title-size: var(--xh-control-font-lg);
|
|
55
|
+
--xh-_list-description-size: var(--xh-control-font-lg);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* —— 形态:ghost 即基础规则,不画壳 —— */
|
|
59
|
+
.xh-scope-list[data-part='root'][data-variant='outline'] {
|
|
60
|
+
border: var(--xh-stroke-thin) solid var(--xh-list-border, var(--xh-border-default));
|
|
61
|
+
border-radius: var(--xh-list-radius, var(--xh-shape-surface));
|
|
62
|
+
background: var(--xh-list-bg, var(--xh-bg-surface));
|
|
63
|
+
/* 首尾条目的悬停底色要被圆角裁住 */
|
|
64
|
+
overflow: hidden;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* 淡底档:底换成 subtle,描边留一圈透明边位,与 outline 同一几何;
|
|
68
|
+
条目坐在淡底上,悬停面抬一档 */
|
|
69
|
+
.xh-scope-list[data-part='root'][data-variant='subtle'] {
|
|
70
|
+
--xh-_list-item-bg-hover: var(--xh-bg-subtle-hover);
|
|
71
|
+
|
|
72
|
+
border: var(--xh-stroke-thin) solid transparent;
|
|
73
|
+
border-radius: var(--xh-list-radius, var(--xh-shape-surface));
|
|
74
|
+
background: var(--xh-list-bg, var(--xh-bg-subtle));
|
|
75
|
+
overflow: hidden;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* —— 条目 —— */
|
|
79
|
+
.xh-scope-list[data-part='item'] {
|
|
80
|
+
display: flex;
|
|
81
|
+
align-items: center;
|
|
82
|
+
gap: var(--xh-list-item-gap, var(--xh-_list-item-gap));
|
|
83
|
+
padding-block: var(--xh-list-item-py, var(--xh-_list-item-py));
|
|
84
|
+
padding-inline: var(--xh-list-item-px, var(--xh-_list-item-px));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* 分隔线画在后一条的上边,条与条之间才只有一条;第一条没有上邻居。
|
|
88
|
+
只认自己的直接子条目,套在条目里的另一份列表由它自己的根管 */
|
|
89
|
+
.xh-scope-list[data-part='root'][data-split]
|
|
90
|
+
> .xh-scope-list[data-part='item']
|
|
91
|
+
+ .xh-scope-list[data-part='item'] {
|
|
92
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-list-divider, var(--xh-border-default));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.xh-scope-list[data-part='root'][data-hoverable] > .xh-scope-list[data-part='item'] {
|
|
96
|
+
transition: background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* 悬停换底色:只在能用指针的设备上生效,触摸端不留一个按不掉的悬停态 */
|
|
100
|
+
@media (hover: hover) {
|
|
101
|
+
.xh-scope-list[data-part='root'][data-hoverable] > .xh-scope-list[data-part='item']:hover {
|
|
102
|
+
background: var(--xh-list-item-bg-hover, var(--xh-_list-item-bg-hover));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* —— 条目内的四个位 —— */
|
|
107
|
+
/* 媒体位不参与伸缩,宽度收到内容 */
|
|
108
|
+
.xh-scope-list[data-part='item-media'] {
|
|
109
|
+
display: flex;
|
|
110
|
+
flex: none;
|
|
111
|
+
align-items: center;
|
|
112
|
+
justify-content: center;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.xh-scope-list[data-part='item-content'] {
|
|
116
|
+
display: flex;
|
|
117
|
+
flex: 1 1 auto;
|
|
118
|
+
flex-direction: column;
|
|
119
|
+
gap: var(--xh-list-content-gap, var(--xh-space-0_5));
|
|
120
|
+
/* 标题与说明两行再上下各让出 4px,两行条目与单行条目的高度差拉开,扫读时一条一块 */
|
|
121
|
+
padding-block: var(--xh-list-item-content-py, var(--xh-space-1));
|
|
122
|
+
/* flex 项默认不肯收到内容以下,这行让长文本能被压窄 */
|
|
123
|
+
min-inline-size: 0;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.xh-scope-list[data-part='item-title'] {
|
|
127
|
+
color: var(--xh-list-title-fg, var(--xh-fg-default));
|
|
128
|
+
font-size: var(--xh-list-title-font-size, var(--xh-_list-title-size));
|
|
129
|
+
font-weight: var(--xh-list-title-font-weight, var(--xh-font-weight-medium));
|
|
130
|
+
line-height: var(--xh-leading-normal);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.xh-scope-list[data-part='item-description'] {
|
|
134
|
+
color: var(--xh-list-description-fg, var(--xh-fg-muted));
|
|
135
|
+
font-size: var(--xh-list-description-font-size, var(--xh-_list-description-size));
|
|
136
|
+
line-height: var(--xh-leading-normal);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* 操作位推到条目末尾,宽度收到内容 */
|
|
140
|
+
.xh-scope-list[data-part='item-action'] {
|
|
141
|
+
display: flex;
|
|
142
|
+
flex: none;
|
|
143
|
+
align-items: center;
|
|
144
|
+
gap: var(--xh-list-action-gap, var(--xh-space-2));
|
|
145
|
+
margin-inline-start: auto;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
149
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
150
|
+
.xh-scope-list[data-part='item'][hidden],
|
|
151
|
+
.xh-scope-list[data-part='item-media'][hidden],
|
|
152
|
+
.xh-scope-list[data-part='item-content'][hidden],
|
|
153
|
+
.xh-scope-list[data-part='item-action'][hidden] {
|
|
154
|
+
display: none;
|
|
155
|
+
}
|
|
156
|
+
}
|