@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/message-feed.css
CHANGED
|
@@ -5,37 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
/* 定义 message feed 样式。 */
|
|
7
7
|
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
8
10
|
/* 独立皮肤同时传递引入回底钮的动作控件配方,full bundle 递归去重。 */
|
|
9
11
|
@import '../family/action-control.css';
|
|
10
|
-
|
|
11
|
-
@layer xihan.motion {
|
|
12
|
-
/* 关键帧写在本文件里:动画名的查找只认「文档里有没有这个名字」,
|
|
13
|
-
引用别处文件里的名字时那份文件不一定在场,动画会静默地整个不跑。
|
|
14
|
-
幅度与缩放走令牌,减弱动效时由令牌层归零 */
|
|
15
|
-
@keyframes xh-message-feed-item-in {
|
|
16
|
-
from {
|
|
17
|
-
opacity: 0;
|
|
18
|
-
translate: 0 var(--xh-motion-distance-md);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
to {
|
|
22
|
-
opacity: 1;
|
|
23
|
-
translate: 0 0;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
@keyframes xh-message-feed-button-in {
|
|
28
|
-
from {
|
|
29
|
-
opacity: 0;
|
|
30
|
-
scale: var(--xh-motion-scale-enter);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
to {
|
|
34
|
-
opacity: 1;
|
|
35
|
-
scale: 1;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
12
|
+
@import '../family/material.css';
|
|
39
13
|
|
|
40
14
|
@layer xihan.components {
|
|
41
15
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -68,7 +42,7 @@
|
|
|
68
42
|
overscroll-behavior: contain;
|
|
69
43
|
}
|
|
70
44
|
|
|
71
|
-
/*
|
|
45
|
+
/* 流式视口的内容高度一直在变,还在用原生滚动条的视口留一条空道,滚动条出现与消失时不推动文字。
|
|
72
46
|
带 data-xh-scrollbar 的容器已经把原生条藏成零宽,这条空道对它没有布局作用,排除掉 */
|
|
73
47
|
[data-scope='message-feed'][data-part='viewport']:not([data-xh-scrollbar]) {
|
|
74
48
|
scrollbar-gutter: stable;
|
|
@@ -85,14 +59,62 @@
|
|
|
85
59
|
display: none;
|
|
86
60
|
}
|
|
87
61
|
|
|
88
|
-
/*
|
|
89
|
-
|
|
62
|
+
/* 已发送、等首个片段:列表之后一颗呼吸的圆点,行首与消息内容对齐。
|
|
63
|
+
呼吸只表达「正在进行、给不出进度」:明暗与缩放的起伏持续到首个片段到来,外扩光环同周期播 3 轮后停下。
|
|
64
|
+
连接层只在 submitted 时撤掉 hidden */
|
|
65
|
+
[data-scope='message-feed'][data-part='pending-indicator'] {
|
|
66
|
+
position: relative;
|
|
67
|
+
display: block;
|
|
68
|
+
inline-size: var(--xh-message-feed-pending-indicator-size, var(--xh-space-2));
|
|
69
|
+
block-size: var(--xh-message-feed-pending-indicator-size, var(--xh-space-2));
|
|
70
|
+
margin-block-end: var(--xh-message-feed-p, var(--xh-_message-feed-p));
|
|
71
|
+
margin-inline-start: var(--xh-message-feed-p, var(--xh-_message-feed-p));
|
|
72
|
+
border-radius: var(--xh-message-feed-pending-indicator-radius, var(--xh-shape-circle));
|
|
73
|
+
background: var(--xh-message-feed-pending-indicator-color, var(--xh-fg-muted));
|
|
74
|
+
animation: xh-breathe var(--xh-motion-loop-breathe) var(--xh-motion-ease-breathe) infinite;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
[data-scope='message-feed'][data-part='pending-indicator']::after {
|
|
78
|
+
content: '';
|
|
79
|
+
position: absolute;
|
|
80
|
+
inset: 0;
|
|
81
|
+
border-radius: inherit;
|
|
82
|
+
background: inherit;
|
|
83
|
+
opacity: 0;
|
|
84
|
+
pointer-events: none;
|
|
85
|
+
animation: xh-breathe-halo var(--xh-motion-loop-breathe) var(--xh-motion-ease-breathe) 3;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* 减弱动效:两者都停,圆点停在满不透明度,光环不出现 */
|
|
89
|
+
@media (prefers-reduced-motion: reduce) {
|
|
90
|
+
[data-scope='message-feed'][data-part='pending-indicator'],
|
|
91
|
+
[data-scope='message-feed'][data-part='pending-indicator']::after {
|
|
92
|
+
animation: none;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
:where([data-motion='reduce']) [data-scope='message-feed'][data-part='pending-indicator'],
|
|
97
|
+
:where([data-motion='reduce']) [data-scope='message-feed'][data-part='pending-indicator']::after {
|
|
98
|
+
animation: none;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
[data-scope='message-feed'][data-part='pending-indicator'][hidden] {
|
|
102
|
+
display: none;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* 一条消息。默认整行铺开,左右分侧由使用者按 data-role 自己写 */
|
|
90
106
|
[data-scope='message-feed'][data-part='item'] {
|
|
91
107
|
display: flex;
|
|
92
108
|
flex-direction: column;
|
|
93
109
|
gap: var(--xh-message-feed-item-gap, var(--xh-space-1));
|
|
94
110
|
border-radius: var(--xh-message-feed-item-radius, var(--xh-shape-surface));
|
|
95
|
-
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* 新到的消息进场,同一批按到达顺序错开;首帧就在的历史消息直接呈现(自己或 list 带 data-instant)。
|
|
114
|
+
进场只动 opacity 与 translate:改高度会扰动粘底补偿量到的 scrollHeight */
|
|
115
|
+
[data-scope='message-feed'][data-part='item']:not([data-instant], [data-instant] > *) {
|
|
116
|
+
animation: xh-item-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
|
|
117
|
+
animation-delay: calc(var(--xh-_stagger-index, 0) * var(--xh-motion-stagger-step));
|
|
96
118
|
}
|
|
97
119
|
|
|
98
120
|
[data-scope='message-feed'][data-part='item'][hidden] {
|
|
@@ -112,29 +134,42 @@
|
|
|
112
134
|
|
|
113
135
|
/* 回到底部:浮在滚动区右下角,收起时不卸载只隐藏。盒型、悬停 / 按下面与缩放由 Action Control 的
|
|
114
136
|
floating 档给(circle 正方盒、ghost 形态:白底承载 hover 100 → pressed 200);材质随角落浮钮族走
|
|
115
|
-
frosted 四件套(底 + 边 + 影 +
|
|
137
|
+
frosted 四件套(底 + 边 + 影 + 磨砂),这里只把使用者槽映射到桥接槽:
|
|
116
138
|
字形按 xs 档取 --xh-_action-profile-glyph-size(16px),与 log / back-top 同一把尺 */
|
|
117
139
|
[data-scope='message-feed'][data-part='scroll-to-end-trigger'] {
|
|
118
|
-
|
|
140
|
+
/* 面走材质家族配方(family/material.css):frosted 档的底、交互阶梯、描边、投影、1px 顶光与背景滤镜,
|
|
141
|
+
liquid 档由配方换成液态面;这里把使用者槽接到 Action Control 的桥接槽 */
|
|
142
|
+
--xh-action-bg-rest: var(--xh-message-feed-scroll-to-end-trigger-bg, var(--xh-_material-bg));
|
|
143
|
+
--xh-action-bg-hover: var(--xh-message-feed-scroll-to-end-trigger-bg-hover, var(--xh-_material-bg-hover));
|
|
144
|
+
--xh-action-bg-pressed: var(--xh-_material-bg-pressed);
|
|
145
|
+
--xh-action-bg-focus-visible: var(--xh-message-feed-scroll-to-end-trigger-bg, var(--xh-_material-bg-focus));
|
|
146
|
+
--xh-action-bg-disabled: var(--xh-message-feed-scroll-to-end-trigger-bg, var(--xh-_material-bg));
|
|
147
|
+
--xh-action-fg-rest: var(--xh-message-feed-scroll-to-end-trigger-fg, var(--xh-_material-fg));
|
|
148
|
+
--xh-action-fg-hover: var(--xh-message-feed-scroll-to-end-trigger-fg, var(--xh-_material-fg));
|
|
149
|
+
--xh-action-fg-pressed: var(--xh-message-feed-scroll-to-end-trigger-fg, var(--xh-_material-fg));
|
|
150
|
+
--xh-action-fg-focus-visible: var(--xh-message-feed-scroll-to-end-trigger-fg, var(--xh-_material-fg));
|
|
151
|
+
--xh-action-border-rest: var(--xh-message-feed-scroll-to-end-trigger-border, var(--xh-_material-border));
|
|
152
|
+
--xh-action-border-hover: var(--xh-message-feed-scroll-to-end-trigger-border, var(--xh-_material-border));
|
|
153
|
+
--xh-action-border-pressed: var(--xh-message-feed-scroll-to-end-trigger-border, var(--xh-_material-border));
|
|
154
|
+
--xh-action-border-focus-visible: var(--xh-message-feed-scroll-to-end-trigger-border, var(--xh-_material-border));
|
|
155
|
+
--xh-action-border-disabled: var(--xh-message-feed-scroll-to-end-trigger-border, var(--xh-_material-border));
|
|
156
|
+
--xh-action-shadow-rest: var(--xh-message-feed-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
|
|
157
|
+
--xh-action-shadow-hover: var(--xh-message-feed-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
|
|
158
|
+
--xh-action-shadow-pressed: var(--xh-message-feed-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
|
|
159
|
+
--xh-action-shadow-focus-visible: var(--xh-message-feed-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
|
|
160
|
+
--xh-action-shadow-disabled: var(--xh-message-feed-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
|
|
161
|
+
--xh-action-highlight-rest: var(--xh-_material-highlight);
|
|
162
|
+
--xh-action-highlight-hover: var(--xh-_material-highlight);
|
|
163
|
+
--xh-action-highlight-pressed: var(--xh-_material-highlight);
|
|
164
|
+
--xh-action-highlight-focus-visible: var(--xh-_material-highlight);
|
|
165
|
+
--xh-action-highlight-disabled: var(--xh-_material-highlight);
|
|
119
166
|
--xh-action-visual-size: var(--xh-message-feed-scroll-to-end-trigger-size, var(--xh-_action-profile-visual-size));
|
|
120
167
|
--xh-action-radius: var(--xh-message-feed-scroll-to-end-trigger-radius, var(--xh-shape-circle));
|
|
121
|
-
--xh-action-bg-rest: var(--xh-message-feed-scroll-to-end-trigger-bg, var(--xh-material-frosted-bg));
|
|
122
|
-
--xh-action-bg-hover: var(--xh-message-feed-scroll-to-end-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
123
|
-
--xh-action-border-rest: var(--xh-message-feed-scroll-to-end-trigger-border, var(--xh-material-frosted-border));
|
|
124
|
-
--xh-action-border-hover: var(--xh-message-feed-scroll-to-end-trigger-border, var(--xh-material-frosted-border));
|
|
125
|
-
--xh-action-border-pressed: var(--xh-message-feed-scroll-to-end-trigger-border, var(--xh-material-frosted-border));
|
|
126
|
-
--xh-action-border-focus-visible: var(--xh-message-feed-scroll-to-end-trigger-border, var(--xh-material-frosted-border));
|
|
127
|
-
--xh-action-shadow-rest: var(--xh-_message-feed-scroll-to-end-trigger-shadow);
|
|
128
|
-
--xh-action-shadow-hover: var(--xh-_message-feed-scroll-to-end-trigger-shadow);
|
|
129
|
-
--xh-action-shadow-pressed: var(--xh-_message-feed-scroll-to-end-trigger-shadow);
|
|
130
|
-
--xh-action-fg-rest: var(--xh-message-feed-scroll-to-end-trigger-fg, var(--xh-material-frosted-fg));
|
|
131
168
|
--xh-icon-size: var(--xh-message-feed-icon-size, var(--xh-_action-profile-glyph-size));
|
|
132
169
|
|
|
133
170
|
position: absolute;
|
|
134
171
|
inset-block-end: var(--xh-message-feed-scroll-to-end-trigger-inset, var(--xh-space-4));
|
|
135
172
|
inset-inline-end: var(--xh-message-feed-scroll-to-end-trigger-inset, var(--xh-space-4));
|
|
136
|
-
-webkit-backdrop-filter: var(--xh-material-frosted-backdrop);
|
|
137
|
-
backdrop-filter: var(--xh-material-frosted-backdrop);
|
|
138
173
|
}
|
|
139
174
|
|
|
140
175
|
/* 连接层收起按钮时写 hidden 属性,家族那条 display 会盖掉 UA 规则,这里补回 */
|
|
@@ -142,13 +177,20 @@
|
|
|
142
177
|
display: none;
|
|
143
178
|
}
|
|
144
179
|
|
|
145
|
-
/*
|
|
180
|
+
/* 收起不卸载:离底时冒出来播进场,回底时先播完退场、连接层才写 hidden 藏起。
|
|
181
|
+
不写 display,可见性归上面那条 [hidden] 管;退场途中不再接指针 */
|
|
146
182
|
[data-scope='message-feed'][data-part='scroll-to-end-trigger'][data-state='visible'] {
|
|
147
|
-
animation: xh-
|
|
183
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger'][data-state='hidden']:not([hidden]) {
|
|
187
|
+
pointer-events: none;
|
|
188
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
148
189
|
}
|
|
149
190
|
|
|
150
|
-
/*
|
|
151
|
-
[data-scope='message-feed'][data-part='scroll-to-end-trigger']:empty::before
|
|
191
|
+
/* 没写内容(或只放了未读数角标)就由皮肤画一枚向下的字形;作者往按钮里塞了自己的图形,这条规则即不命中 */
|
|
192
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger']:empty::before,
|
|
193
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger']:has(> [data-part='unread-count']:only-child)::before {
|
|
152
194
|
content: '';
|
|
153
195
|
display: inline-block;
|
|
154
196
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
@@ -188,10 +230,89 @@
|
|
|
188
230
|
white-space: nowrap;
|
|
189
231
|
}
|
|
190
232
|
|
|
233
|
+
/* 消息之间的分隔(按日期分组):一行次级标注居中,两侧各一道内部分隔线 */
|
|
234
|
+
[data-scope='message-feed'][data-part='separator'] {
|
|
235
|
+
display: flex;
|
|
236
|
+
align-items: center;
|
|
237
|
+
gap: var(--xh-message-feed-separator-gap, var(--xh-space-3));
|
|
238
|
+
color: var(--xh-message-feed-separator-fg, var(--xh-fg-subtle));
|
|
239
|
+
font-size: var(--xh-message-feed-separator-font-size, var(--xh-text-caption-size));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
[data-scope='message-feed'][data-part='separator']::before,
|
|
243
|
+
[data-scope='message-feed'][data-part='separator']::after {
|
|
244
|
+
flex: 1;
|
|
245
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-message-feed-separator-line, var(--xh-border-subtle));
|
|
246
|
+
content: '';
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
[data-scope='message-feed'][data-part='separator'][hidden] {
|
|
250
|
+
display: none;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/* 回到底部上的未读数:状态 chip,钉在按钮行尾上角外侧,不改按钮盒 */
|
|
254
|
+
[data-scope='message-feed'][data-part='unread-count'] {
|
|
255
|
+
position: absolute;
|
|
256
|
+
inset-block-start: calc(-1 * var(--xh-space-1));
|
|
257
|
+
inset-inline-end: calc(-1 * var(--xh-space-1));
|
|
258
|
+
box-sizing: border-box;
|
|
259
|
+
min-inline-size: var(--xh-message-feed-unread-count-size, var(--xh-space-4));
|
|
260
|
+
block-size: var(--xh-message-feed-unread-count-size, var(--xh-space-4));
|
|
261
|
+
padding-inline: var(--xh-message-feed-unread-count-px, var(--xh-space-1));
|
|
262
|
+
border-radius: var(--xh-message-feed-unread-count-radius, var(--xh-shape-pill));
|
|
263
|
+
background: var(--xh-message-feed-unread-count-bg, var(--xh-bg-brand));
|
|
264
|
+
color: var(--xh-message-feed-unread-count-fg, var(--xh-fg-on-brand));
|
|
265
|
+
font-size: var(--xh-message-feed-unread-count-font-size, var(--xh-text-caption-size));
|
|
266
|
+
font-variant-numeric: tabular-nums;
|
|
267
|
+
line-height: var(--xh-message-feed-unread-count-size, var(--xh-space-4));
|
|
268
|
+
text-align: center;
|
|
269
|
+
pointer-events: none;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
[data-scope='message-feed'][data-part='unread-count'][hidden] {
|
|
273
|
+
display: none;
|
|
274
|
+
}
|
|
275
|
+
|
|
191
276
|
@media print {
|
|
192
|
-
/*
|
|
193
|
-
|
|
277
|
+
/* 打印:回到底部这颗钮只有在能滚的地方才成立,落到纸上是一颗按不动的按钮;
|
|
278
|
+
等首个片段的呼吸点是一瞬间的状态,纸上没有「正在进行」。 */
|
|
279
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger'],
|
|
280
|
+
[data-scope='message-feed'][data-part='pending-indicator'] {
|
|
194
281
|
display: none;
|
|
195
282
|
}
|
|
196
283
|
}
|
|
284
|
+
|
|
285
|
+
/* 强制色:底色会被系统背景吃掉,圆点改用系统前景色 */
|
|
286
|
+
@media (forced-colors: active) {
|
|
287
|
+
[data-scope='message-feed'][data-part='pending-indicator'] {
|
|
288
|
+
background: CanvasText;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
[data-scope='message-feed'][data-part='unread-count'] {
|
|
292
|
+
background: Highlight;
|
|
293
|
+
color: HighlightText;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
@media (forced-colors: active) {
|
|
298
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
299
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
300
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
301
|
+
禁用取 GrayText */
|
|
302
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger']:empty::before,
|
|
303
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger']:has(> [data-part='unread-count']:only-child)::before {
|
|
304
|
+
forced-color-adjust: none;
|
|
305
|
+
background-color: ButtonText;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before,
|
|
309
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):has(> [data-part='unread-count']:only-child)::before {
|
|
310
|
+
background-color: HighlightText;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger'][data-disabled]:empty::before,
|
|
314
|
+
[data-scope='message-feed'][data-part='scroll-to-end-trigger'][data-disabled]:has(> [data-part='unread-count']:only-child)::before {
|
|
315
|
+
background-color: GrayText;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
197
318
|
}
|
package/css/navigation-menu.css
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
换档不必给每个部件各写一条选择器。面板与共享外壳都是 root 的后代,一并继承。
|
|
24
24
|
trigger 的字号经家族桥接槽接回 root 这一档,不另立私有槽 */
|
|
25
25
|
/* 入口里的方向标记按档取尺,缺省 md,随 data-size 换档;面板里链接内的字形由家族随
|
|
26
|
-
data-xh-collection-size
|
|
26
|
+
data-xh-collection-size 下发 */
|
|
27
27
|
--xh-icon-size: var(--xh-navigation-menu-icon-size, var(--xh-glyph-size-md));
|
|
28
28
|
|
|
29
29
|
--xh-_navigation-menu-font-size: var(--xh-control-font-md);
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
--xh-_navigation-menu-link-px: var(--xh-control-px-md);
|
|
35
35
|
--xh-_navigation-menu-link-font-size: var(--xh-control-font-md);
|
|
36
36
|
|
|
37
|
-
/*
|
|
37
|
+
/* 悬停、键盘锚点与展开着的入口同走中性灰轻档、不接语气槽:打开中不是选中,不用品牌色 */
|
|
38
38
|
--xh-_navigation-menu-highlight-bg: var(--xh-bg-subtle);
|
|
39
39
|
|
|
40
40
|
/* 语气只落在指示条上;没写 data-tone 时 --xh-_tone 没被声明,退回品牌色。
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
/* 入口归 Collection Item 展开路径 / 打开中(nav 语境):几何、字号、面与字重全经家族桥接槽。静息 muted /
|
|
112
112
|
regular,悬停走白底承载 hover 100 + default 字;展开着的那一张由连接层投影 data-in-path,家族给与悬停同档的
|
|
113
113
|
中性面——打开中不是选中,不用品牌色、不加粗(横排的栏加粗会推挤相邻触发器),哪一张开着由指示条与转向的
|
|
114
|
-
箭头说明;按下 pressed 200
|
|
114
|
+
箭头说明;按下 pressed 200 只换面不缩放;禁用走 aria-disabled,家族给禁用字色与 not-allowed。
|
|
115
115
|
高度由 block-size 定,块向内边距归零。本条 (0,2,0) 压过家族基础块 (0,1,0),不能再写 background / color /
|
|
116
116
|
font-weight / cursor;也不写 font: inherit(reset.css 已抹平按钮 UA 字体,再写会把家族给的字号字重一并盖掉) */
|
|
117
117
|
[data-scope='navigation-menu'][data-part='trigger'] {
|
|
@@ -144,7 +144,9 @@
|
|
|
144
144
|
flex: 1;
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
/* 面板贴着自己那一项落位:横排从 trigger
|
|
147
|
+
/* 面板贴着自己那一项落位:横排从 trigger 底下长出来。面板型浮层按内容的自然宽度排开:
|
|
148
|
+
它绝对定位在入口那一项(一个窄 li)里,收缩适配的可用宽就是那一项的宽,不给宽度只剩最小宽、
|
|
149
|
+
一行放得下的文字也折行;超过浮层最大宽才折 */
|
|
148
150
|
[data-scope='navigation-menu'][data-part='content'] {
|
|
149
151
|
position: absolute;
|
|
150
152
|
z-index: var(--xh-navigation-menu-layer, var(--xh-_layer, var(--xh-layer-popover)));
|
|
@@ -153,7 +155,9 @@
|
|
|
153
155
|
display: flex;
|
|
154
156
|
flex-direction: column;
|
|
155
157
|
gap: var(--xh-navigation-menu-content-gap, var(--xh-space-1));
|
|
158
|
+
inline-size: max-content;
|
|
156
159
|
min-inline-size: var(--xh-navigation-menu-content-min-w, var(--xh-overlay-menu-min-w));
|
|
160
|
+
max-inline-size: var(--xh-navigation-menu-content-max-w, var(--xh-overlay-max-w-xl));
|
|
157
161
|
padding: var(--xh-navigation-menu-content-p, var(--xh-surface-pad-xs));
|
|
158
162
|
border: var(--xh-stroke-thin) solid var(--xh-navigation-menu-content-border, var(--xh-border-default));
|
|
159
163
|
border-radius: var(--xh-navigation-menu-content-radius, var(--xh-shape-overlay));
|
|
@@ -172,14 +176,14 @@
|
|
|
172
176
|
inset-inline-start: calc(100% + var(--xh-navigation-menu-content-offset, var(--xh-space-1)));
|
|
173
177
|
}
|
|
174
178
|
|
|
175
|
-
/*
|
|
176
|
-
|
|
177
|
-
|
|
179
|
+
/* 首开弹出、末收收回;在两张之间换张时两侧都带 data-instant,瞬时换张——与菜单栏同一条成规,
|
|
180
|
+
交叉的进退场读起来就是闪烁。挂载时就展开着的那一项同样带它,直接呈现 */
|
|
181
|
+
[data-scope='navigation-menu'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
178
182
|
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
179
183
|
}
|
|
180
184
|
|
|
181
185
|
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来 */
|
|
182
|
-
[data-scope='navigation-menu'][data-part='content'][data-state='closed'] {
|
|
186
|
+
[data-scope='navigation-menu'][data-part='content'][data-state='closed']:not([data-instant]) {
|
|
183
187
|
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
184
188
|
}
|
|
185
189
|
|
|
@@ -193,9 +197,19 @@
|
|
|
193
197
|
box-shadow: none;
|
|
194
198
|
}
|
|
195
199
|
|
|
200
|
+
/* 外壳里的面板不自己弹出:弹出与收回归外壳,面板只随之淡入淡出,时长与外壳同档——
|
|
201
|
+
末收时面板的淡出与外壳的收回同时播完,外壳等它播完才藏起 */
|
|
202
|
+
[data-scope='navigation-menu'][data-part='viewport'] [data-scope='navigation-menu'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
203
|
+
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
[data-scope='navigation-menu'][data-part='viewport'] [data-scope='navigation-menu'][data-part='content'][data-state='closed']:not([data-instant]) {
|
|
207
|
+
animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
208
|
+
}
|
|
209
|
+
|
|
196
210
|
/* 面板里的链接归 Collection Item 导航当前(nav 语境):悬停 / 键盘高亮(白底承载 100)与按下(200)面由家族
|
|
197
211
|
按 :hover / :focus-visible / :active 给出,指向当前页面的那一条(data-current)取 strong 档品牌字色 +
|
|
198
|
-
medium
|
|
212
|
+
medium 字重,字色不随语气、不加下划线(下划线是"可点"的信号,它已经在这儿了);这里只把公开槽
|
|
199
213
|
映射到桥接槽。面板是实色 floating 面,常态字色取 --xh-fg-default 而非 nav 缺省的 muted。
|
|
200
214
|
布局保持 flex:链接是一行文字,不用家族网格。position: relative 是当前链接静态线的定位参照 */
|
|
201
215
|
[data-scope='navigation-menu'][data-part='link'] {
|
|
@@ -223,6 +237,68 @@
|
|
|
223
237
|
display: none;
|
|
224
238
|
}
|
|
225
239
|
|
|
240
|
+
/* 面板里一枝子级的开关与链接同一种行,读链接那一组槽,两种行才等高、左缘才齐。
|
|
241
|
+
展开不换面、不算打开中:由转向的箭头与露出的子级说明;按下只换面不缩放 */
|
|
242
|
+
[data-scope='navigation-menu'][data-part='branch-trigger'] {
|
|
243
|
+
--xh-collection-block-padding: var(--xh-navigation-menu-link-py, var(--xh-_navigation-menu-link-py));
|
|
244
|
+
--xh-collection-inline-padding: var(--xh-navigation-menu-link-px, var(--xh-_navigation-menu-link-px));
|
|
245
|
+
--xh-collection-radius: var(--xh-navigation-menu-link-radius, var(--xh-shape-control));
|
|
246
|
+
--xh-collection-font-size: var(--xh-navigation-menu-link-font-size, var(--xh-_navigation-menu-link-font-size));
|
|
247
|
+
--xh-collection-fg-rest: var(--xh-navigation-menu-link-fg, var(--xh-fg-default));
|
|
248
|
+
--xh-collection-fg-hover: var(--xh-navigation-menu-link-fg, var(--xh-fg-default));
|
|
249
|
+
--xh-collection-fg-keyboard-highlight: var(--xh-navigation-menu-link-fg, var(--xh-fg-default));
|
|
250
|
+
--xh-collection-fg-pressed: var(--xh-navigation-menu-link-fg, var(--xh-fg-default));
|
|
251
|
+
--xh-collection-bg-hover: var(--xh-navigation-menu-link-bg-hover, var(--xh-_navigation-menu-highlight-bg));
|
|
252
|
+
--xh-collection-bg-keyboard-highlight: var(--xh-navigation-menu-link-bg-hover, var(--xh-_navigation-menu-highlight-bg));
|
|
253
|
+
--xh-collection-bg-pressed: var(--xh-navigation-menu-link-bg-pressed, var(--xh-bg-subtle-hover));
|
|
254
|
+
|
|
255
|
+
display: flex;
|
|
256
|
+
align-items: center;
|
|
257
|
+
gap: var(--xh-navigation-menu-branch-trigger-gap, var(--xh-_navigation-menu-trigger-gap));
|
|
258
|
+
border: 0;
|
|
259
|
+
text-align: start;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/* 行尾的展开方向标记,与 SideNav / Tree 的分支箭头同一种:盒按指示符档定尺,兜底字形与作者的图标读盒的尺。
|
|
263
|
+
收着时指向行尾(旋转角乘书写方向的符号,rtl 转半圈),展开时转向下方 */
|
|
264
|
+
[data-scope='navigation-menu'][data-part='branch-indicator'] {
|
|
265
|
+
--xh-icon-size: var(--xh-navigation-menu-branch-indicator-size, var(--xh-control-indicator-size));
|
|
266
|
+
|
|
267
|
+
margin-inline-start: auto;
|
|
268
|
+
display: inline-flex;
|
|
269
|
+
flex: none;
|
|
270
|
+
align-items: center;
|
|
271
|
+
justify-content: center;
|
|
272
|
+
inline-size: var(--xh-navigation-menu-branch-indicator-size, var(--xh-control-indicator-size));
|
|
273
|
+
block-size: var(--xh-navigation-menu-branch-indicator-size, var(--xh-control-indicator-size));
|
|
274
|
+
rotate: calc(90deg - 90deg * var(--xh-direction-sign));
|
|
275
|
+
transition: rotate var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
[data-scope='navigation-menu'][data-part='branch-indicator'][data-state='open'] {
|
|
279
|
+
rotate: 90deg;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
283
|
+
[data-scope='navigation-menu'][data-part='branch-indicator']:empty::before {
|
|
284
|
+
content: '';
|
|
285
|
+
display: inline-block;
|
|
286
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
287
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
288
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
289
|
+
background-color: currentColor;
|
|
290
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
291
|
+
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* 子级紧跟在开关之后,靠缩进表出层级、行距同面板;密集披露,不动高度、刻意瞬时 */
|
|
295
|
+
[data-scope='navigation-menu'][data-part='branch-content'] {
|
|
296
|
+
display: flex;
|
|
297
|
+
flex-direction: column;
|
|
298
|
+
gap: var(--xh-navigation-menu-content-gap, var(--xh-space-1));
|
|
299
|
+
padding-inline-start: var(--xh-navigation-menu-branch-content-indent, var(--xh-space-4));
|
|
300
|
+
}
|
|
301
|
+
|
|
226
302
|
/* 入口里表示"底下还有一张面板"的标记,排在入口文字之后,展开时转向 */
|
|
227
303
|
[data-scope='navigation-menu'][data-part='trigger-indicator'] {
|
|
228
304
|
display: inline-flex;
|
|
@@ -230,7 +306,7 @@
|
|
|
230
306
|
align-items: center;
|
|
231
307
|
justify-content: center;
|
|
232
308
|
line-height: var(--xh-leading-none);
|
|
233
|
-
transition: rotate var(--xh-motion-duration-
|
|
309
|
+
transition: rotate var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
|
|
234
310
|
}
|
|
235
311
|
|
|
236
312
|
[data-scope='navigation-menu'][data-part='trigger-indicator'][hidden] {
|
|
@@ -257,7 +333,7 @@
|
|
|
257
333
|
color: var(--xh-fg-disabled);
|
|
258
334
|
}
|
|
259
335
|
|
|
260
|
-
/*
|
|
336
|
+
/* 指向当前页面的链接自画一条静态指示线(导航当前页):与 Tabs line / Anchor 同一取法,作者不必为了
|
|
261
337
|
这条线多放一个部件。下面的 indicator 部件表达的是「哪张面板开着」而不是当前页,所以这条线不随部件收起,
|
|
262
338
|
两者各说各的:部件亮着时开着的入口下有一条、当前页链接上另有一条。
|
|
263
339
|
线画在当前链接的 ::after 上,以链接盒为定位参照(上面已给 position: relative),
|
|
@@ -285,21 +361,37 @@
|
|
|
285
361
|
block-size: var(--xh-navigation-menu-indicator-thickness, var(--xh-stroke-thick));
|
|
286
362
|
}
|
|
287
363
|
|
|
288
|
-
/*
|
|
289
|
-
|
|
364
|
+
/* 展开入口的四个几何量由机器量好、连接层写成私有槽 --xh-_navigation-menu-indicator-x / -y / -w / -h
|
|
365
|
+
(它量得到,样式表量不到);这里按排布取主轴那两支,落点交给 translate(只走合成),
|
|
366
|
+
另管交叉轴的贴边与粗细,以及长什么样。它指的是开着的面板:无面板开着时隐藏,
|
|
290
367
|
当前页由上面链接自画的静态线表达 */
|
|
291
368
|
[data-scope='navigation-menu'][data-part='indicator'] {
|
|
369
|
+
/* 还没量到时的落点,量到即被机器写的私有槽盖过 */
|
|
370
|
+
--xh-_navigation-menu-indicator-x: 0;
|
|
371
|
+
--xh-_navigation-menu-indicator-y: 0;
|
|
372
|
+
--xh-_navigation-menu-indicator-w: 0;
|
|
373
|
+
--xh-_navigation-menu-indicator-h: 0;
|
|
374
|
+
--xh-_navigation-menu-indicator-stretch: 0;
|
|
375
|
+
|
|
292
376
|
position: absolute;
|
|
293
377
|
display: block;
|
|
294
378
|
/* 指示条也是列表项,宿主给 li 的外边距会把绝对定位的它推离入口 */
|
|
295
379
|
margin: 0;
|
|
380
|
+
inset-inline-start: 0;
|
|
296
381
|
inset-block-end: calc(var(--xh-navigation-menu-indicator-thickness, var(--xh-stroke-thick)) * -1);
|
|
382
|
+
inline-size: var(--xh-_navigation-menu-indicator-w);
|
|
297
383
|
block-size: var(--xh-navigation-menu-indicator-thickness, var(--xh-stroke-thick));
|
|
298
384
|
border-radius: var(--xh-navigation-menu-indicator-radius, var(--xh-shape-pill));
|
|
299
385
|
background: var(--xh-navigation-menu-indicator-color, var(--xh-_navigation-menu-accent));
|
|
386
|
+
translate: var(--xh-_navigation-menu-indicator-x) 0;
|
|
300
387
|
transition:
|
|
301
|
-
|
|
302
|
-
inline-size var(--xh-motion-duration-
|
|
388
|
+
translate var(--xh-motion-duration-move) var(--xh-motion-ease-continuous),
|
|
389
|
+
inline-size var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/* translate 只认物理方向:RTL 下行首在右边,起始缘量出的距离往左推 */
|
|
393
|
+
[data-scope='navigation-menu'][data-part='indicator']:dir(rtl) {
|
|
394
|
+
translate: calc(-1 * var(--xh-_navigation-menu-indicator-x)) 0;
|
|
303
395
|
}
|
|
304
396
|
|
|
305
397
|
[data-scope='navigation-menu'][data-part='indicator'][hidden] {
|
|
@@ -308,13 +400,35 @@
|
|
|
308
400
|
|
|
309
401
|
/* 竖排:指示条改贴在起始缘,交叉轴换成内联轴 */
|
|
310
402
|
[data-scope='navigation-menu'][data-part='indicator'][data-orientation='vertical'] {
|
|
403
|
+
inset-block-start: 0;
|
|
311
404
|
inset-block-end: auto;
|
|
312
405
|
inset-inline-start: 0;
|
|
313
406
|
inline-size: var(--xh-navigation-menu-indicator-thickness, var(--xh-stroke-thick));
|
|
314
|
-
block-size:
|
|
407
|
+
block-size: var(--xh-_navigation-menu-indicator-h);
|
|
408
|
+
translate: 0 var(--xh-_navigation-menu-indicator-y);
|
|
315
409
|
transition:
|
|
316
|
-
|
|
317
|
-
block-size var(--xh-motion-duration-
|
|
410
|
+
translate var(--xh-motion-duration-move) var(--xh-motion-ease-continuous),
|
|
411
|
+
block-size var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/* 首次落位与同一项的重量(窗口缩放、换上正式字体)直接到位,只有换项才滑:连接层在这一落点投影
|
|
415
|
+
data-instant。写在排布那几条之后,同一特异性按先后压过它们单写的过渡 */
|
|
416
|
+
[data-scope='navigation-menu'][data-part='indicator'][data-instant] {
|
|
417
|
+
transition: none;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/* 液态档:两沿由弹簧逐帧推着走(连接层每一帧写好盒子),几何量不再补过渡;
|
|
421
|
+
被拉长时在另一个方向上压扁(横排缺省压块向,竖排压行向),表达体积守恒,拉长到目标的两倍时压到 --xh-motion-scale-squash */
|
|
422
|
+
:where([data-material='liquid']) [data-scope='navigation-menu'][data-part='indicator'] {
|
|
423
|
+
--xh-_navigation-menu-indicator-squash: max(var(--xh-motion-scale-squash), calc(1 - var(--xh-_navigation-menu-indicator-stretch) * (1 - var(--xh-motion-scale-squash))));
|
|
424
|
+
|
|
425
|
+
scale: 1 var(--xh-_navigation-menu-indicator-squash);
|
|
426
|
+
transition: none;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
:where([data-material='liquid']) [data-scope='navigation-menu'][data-part='indicator'][data-orientation='vertical'] {
|
|
430
|
+
scale: var(--xh-_navigation-menu-indicator-squash) 1;
|
|
431
|
+
transition: none;
|
|
318
432
|
}
|
|
319
433
|
|
|
320
434
|
/* 共享面板外壳:只管落位与统一的面板外观,里面装哪一份内容归 content。
|
|
@@ -326,6 +440,9 @@
|
|
|
326
440
|
inset-block-start: calc(100% + var(--xh-navigation-menu-content-offset, var(--xh-space-1)));
|
|
327
441
|
inset-inline-start: 0;
|
|
328
442
|
display: block;
|
|
443
|
+
/* 外壳同样按装进来的那一张的自然宽度排开,道理同 content */
|
|
444
|
+
inline-size: max-content;
|
|
445
|
+
max-inline-size: var(--xh-navigation-menu-content-max-w, var(--xh-overlay-max-w-xl));
|
|
329
446
|
padding: var(--xh-navigation-menu-viewport-p, var(--xh-space-2));
|
|
330
447
|
border: var(--xh-stroke-thin) solid var(--xh-navigation-menu-content-border, var(--xh-border-default));
|
|
331
448
|
border-radius: var(--xh-navigation-menu-content-radius, var(--xh-shape-overlay));
|
|
@@ -337,12 +454,29 @@
|
|
|
337
454
|
display: none;
|
|
338
455
|
}
|
|
339
456
|
|
|
457
|
+
/* 共享外壳是面板那一面:首开弹出、末收收回,换张时外壳留在原处、高度即刻换成新的一张。
|
|
458
|
+
挂载时就展开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
459
|
+
[data-scope='navigation-menu'][data-part='viewport'][data-state='open']:not([data-instant]) {
|
|
460
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
[data-scope='navigation-menu'][data-part='viewport'][data-state='closed'] {
|
|
464
|
+
animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
465
|
+
}
|
|
466
|
+
|
|
340
467
|
/* 竖排导航:共享外壳跟着面板改从侧边长出来 */
|
|
341
468
|
[data-scope='navigation-menu'][data-part='viewport'][data-orientation='vertical'] {
|
|
342
469
|
inset-block-start: 0;
|
|
343
470
|
inset-inline-start: calc(100% + var(--xh-navigation-menu-content-offset, var(--xh-space-1)));
|
|
344
471
|
}
|
|
345
472
|
|
|
473
|
+
/* 声明过 display 就盖掉了 UA 的 [hidden]{display:none},兜底排在这几个部件所有 display 声明之后 */
|
|
474
|
+
[data-scope='navigation-menu'][data-part='branch-trigger'][hidden],
|
|
475
|
+
[data-scope='navigation-menu'][data-part='branch-indicator'][hidden],
|
|
476
|
+
[data-scope='navigation-menu'][data-part='branch-content'][hidden] {
|
|
477
|
+
display: none;
|
|
478
|
+
}
|
|
479
|
+
|
|
346
480
|
@media (forced-colors: active) {
|
|
347
481
|
/* 两条指示线画的都是一块纯底色,这一档里底色被统一换成 Canvas,线整根消失:
|
|
348
482
|
开着的入口只剩转向的箭头、当前页只剩字重。换成系统高亮色画回来 */
|
|
@@ -350,5 +484,30 @@
|
|
|
350
484
|
[data-scope='navigation-menu'][data-part='link'][data-current]::after {
|
|
351
485
|
background: Highlight;
|
|
352
486
|
}
|
|
487
|
+
|
|
488
|
+
/* 顶层入口与子级开关的箭头都是 mask 挖出来的一块底色,这一档里底色换成 Canvas、箭头跟着消失,
|
|
489
|
+
开合只剩读屏听得到。直接写系统前景(不能取 currentColor:退出强制色的伪元素读到的是被系统换掉之前的作者色):
|
|
490
|
+
子级开关取按钮前景 ButtonText,顶层入口落在条目面上取 CanvasText;
|
|
491
|
+
两者都是集合条目,按下与没被高亮时的悬停,家族把条目涂成 Highlight,箭头跟着换 HighlightText;
|
|
492
|
+
禁用的取 GrayText,与公共补救层给禁用行的字色一致 */
|
|
493
|
+
[data-scope='navigation-menu'][data-part='branch-indicator']:empty::before {
|
|
494
|
+
background-color: ButtonText;
|
|
495
|
+
forced-color-adjust: none;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
[data-scope='navigation-menu'][data-part='trigger-indicator']:empty::before {
|
|
499
|
+
background-color: CanvasText;
|
|
500
|
+
forced-color-adjust: none;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
[data-scope='navigation-menu'][data-part='branch-trigger']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted])) [data-scope='navigation-menu'][data-part='branch-indicator']:empty::before,
|
|
504
|
+
[data-scope='navigation-menu'][data-part='trigger']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted])) [data-scope='navigation-menu'][data-part='trigger-indicator']:empty::before {
|
|
505
|
+
background-color: HighlightText;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
[data-scope='navigation-menu'][data-part='branch-trigger'][data-disabled] [data-scope='navigation-menu'][data-part='branch-indicator']:empty::before,
|
|
509
|
+
[data-scope='navigation-menu'][data-part='trigger']:is([aria-disabled='true'], [data-disabled]) [data-scope='navigation-menu'][data-part='trigger-indicator']:empty::before {
|
|
510
|
+
background-color: GrayText;
|
|
511
|
+
}
|
|
353
512
|
}
|
|
354
513
|
}
|