@xihan-ui/styles 2.1.0 → 3.1.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 +1261 -0
- package/README.md +6 -1
- package/component-tokens.d.ts +533 -96
- package/components.tokens.json +35461 -26045
- package/css/accordion.css +34 -8
- package/css/alert.css +59 -1
- package/css/anchor.css +46 -8
- package/css/approval.css +116 -76
- package/css/avatar-group.css +1 -1
- package/css/avatar.css +13 -5
- package/css/back-top.css +61 -42
- package/css/badge.css +62 -12
- package/css/bar-code.css +1 -1
- package/css/breadcrumb.css +62 -3
- package/css/button-group.css +4 -4
- package/css/button.css +67 -19
- package/css/calendar-picker.css +19 -0
- package/css/calendar-range-picker.css +39 -2
- package/css/card.css +115 -1
- package/css/carousel.css +148 -43
- package/css/cartesian-chart.css +830 -0
- package/css/cascader.css +181 -65
- package/css/checkbox-group.css +59 -89
- package/css/checkbox.css +16 -49
- package/css/citation.css +470 -0
- package/css/clipboard.css +20 -63
- package/css/code-view.css +101 -6
- package/css/collapsible.css +34 -8
- package/css/color-field.css +18 -0
- package/css/color-picker.css +128 -50
- package/css/color-slider.css +22 -15
- package/css/color-swatch-picker.css +3 -1
- package/css/combobox.css +80 -33
- package/css/command.css +45 -43
- package/css/context-menu.css +39 -22
- package/css/date-field.css +56 -0
- package/css/date-picker.css +132 -26
- package/css/date-range-picker.css +337 -14
- package/css/description.css +17 -1
- package/css/descriptions.css +42 -0
- package/css/dialog.css +94 -36
- package/css/diff-view.css +97 -12
- package/css/download-trigger.css +44 -78
- package/css/drawer.css +160 -119
- package/css/editable.css +19 -0
- package/css/empty-state.css +7 -6
- package/css/field-array.css +36 -0
- package/css/field.css +20 -18
- package/css/file-upload.css +125 -135
- package/css/flex.css +324 -8
- package/css/float-button.css +263 -38
- package/css/floating-panel.css +53 -19
- package/css/form.css +31 -17
- 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 +31 -14
- package/css/icon.css +100 -0
- package/css/image-cropper.css +33 -7
- package/css/image-viewer.css +167 -22
- package/css/image.css +23 -4
- package/css/input-group.css +11 -13
- package/css/json-viewer.css +50 -2
- package/css/layout.css +68 -18
- package/css/liquid.css +106 -0
- package/css/list.css +1 -1
- package/css/listbox.css +46 -6
- package/css/loading-bar.css +27 -13
- package/css/log.css +129 -33
- 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 -19
- package/css/menu.css +35 -21
- package/css/menubar.css +36 -20
- package/css/message-feed.css +172 -51
- package/css/navigation-menu.css +172 -11
- package/css/notification.css +435 -108
- package/css/number-field.css +22 -0
- package/css/page-header.css +3 -1
- package/css/pagination.css +126 -24
- package/css/password-input.css +40 -8
- package/css/pie-chart.css +247 -0
- package/css/popconfirm.css +44 -50
- package/css/popover.css +50 -14
- package/css/progress.css +308 -10
- package/css/prompt-input.css +36 -0
- package/css/question-flow.css +97 -57
- package/css/radar-chart.css +233 -0
- package/css/radio-group.css +363 -5
- package/css/rating.css +21 -23
- package/css/reasoning.css +61 -54
- 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 +74 -55
- package/css/side-nav.css +173 -24
- package/css/signature-pad.css +16 -1
- package/css/skeleton.css +13 -14
- package/css/slider.css +35 -13
- package/css/sortable.css +37 -7
- package/css/sparkline.css +164 -0
- package/css/spinner.css +50 -22
- package/css/splitter.css +7 -1
- package/css/statistic.css +10 -0
- package/css/steps.css +248 -29
- package/css/switch.css +23 -48
- package/css/table.css +175 -118
- package/css/tabs.css +231 -19
- package/css/tag-group.css +27 -3
- package/css/tag.css +53 -12
- 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 +103 -17
- package/css/time-range-picker.css +45 -16
- package/css/timeline.css +1 -1
- package/css/toggle-group.css +4 -4
- package/css/toggle.css +4 -3
- package/css/tool-call.css +59 -51
- package/css/toolbar.css +101 -3
- package/css/tooltip.css +15 -2
- package/css/tour.css +42 -12
- package/css/transfer.css +98 -75
- package/css/tree-select.css +232 -53
- package/css/tree.css +271 -55
- package/css/truncate.css +55 -12
- package/css/typography.css +93 -0
- package/css/virtualizer.css +56 -0
- 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 +9 -15
- 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 +207 -10
- package/family/tag-list.css +59 -0
- package/index.css +13824 -4030
- package/index.unlayered.css +13403 -3605
- 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/tool-call.css
CHANGED
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
[data-scope='tool-call'][data-part='root'] {
|
|
23
23
|
/* 尺寸缺省档:不写 data-size 时的取值。三档都只写这三个私有槽,
|
|
24
24
|
公开槽留在读处当首选,作者在祖先上设的覆盖才赢得过档位声明 */
|
|
25
|
-
--xh-_tool-call-px: var(--xh-space-
|
|
26
|
-
--xh-_tool-call-py: var(--xh-space-
|
|
25
|
+
--xh-_tool-call-px: var(--xh-space-4);
|
|
26
|
+
--xh-_tool-call-py: var(--xh-space-4);
|
|
27
27
|
--xh-_tool-call-font-size: var(--xh-control-font-md);
|
|
28
28
|
|
|
29
29
|
/* 影另落一份进私有槽给语气档:它要把影与左侧色条叠成一条 box-shadow,缺省无影写成零影占位 */
|
|
@@ -38,7 +38,11 @@
|
|
|
38
38
|
border-radius: var(--xh-tool-call-radius, var(--xh-shape-surface));
|
|
39
39
|
background: var(--xh-tool-call-bg, var(--xh-bg-surface));
|
|
40
40
|
box-shadow: var(--xh-tool-call-shadow, none);
|
|
41
|
-
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* 卡片出现时滑入;落在首帧就在的列表条目里(历史消息)时直接呈现,不跟着整屏一起入场 */
|
|
44
|
+
[data-scope='tool-call'][data-part='root']:not([data-scope][data-part='item'][data-instant] *) {
|
|
45
|
+
animation: xh-item-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) both;
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
/* 上面声明的 display 会盖掉 UA 的 [hidden]{display:none},这里补回 */
|
|
@@ -111,8 +115,12 @@
|
|
|
111
115
|
align-items: center;
|
|
112
116
|
justify-content: center;
|
|
113
117
|
color: var(--xh-tool-call-indicator-fg, var(--xh-fg-subtle));
|
|
114
|
-
|
|
115
|
-
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* 与详情开合同时长:箭头先转完、内容后到位会像是两件事。收起取 collapse 档,展开(下面的打开态)取 expand 档。
|
|
121
|
+
首帧就在的朝向直接呈现(data-instant),第一次开合起才转 */
|
|
122
|
+
[data-scope='tool-call'][data-part='indicator']:not([data-instant]) {
|
|
123
|
+
transition: rotate var(--xh-motion-duration-collapse) var(--xh-motion-ease-enter-strong);
|
|
116
124
|
}
|
|
117
125
|
|
|
118
126
|
/* 没写内容就由皮肤画;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
@@ -137,6 +145,10 @@
|
|
|
137
145
|
rotate: 90deg;
|
|
138
146
|
}
|
|
139
147
|
|
|
148
|
+
[data-scope='tool-call'][data-part='indicator'][data-state='open']:not([data-instant]) {
|
|
149
|
+
transition: rotate var(--xh-motion-duration-expand) var(--xh-motion-ease-enter-strong);
|
|
150
|
+
}
|
|
151
|
+
|
|
140
152
|
[dir='rtl'] [data-scope='tool-call'][data-part='indicator'] {
|
|
141
153
|
rotate: 180deg;
|
|
142
154
|
}
|
|
@@ -151,6 +163,8 @@
|
|
|
151
163
|
overflow: hidden;
|
|
152
164
|
flex: 1 1 auto;
|
|
153
165
|
font-family: var(--xh-tool-call-label-font, var(--xh-font-family-mono));
|
|
166
|
+
/* 面级披露的触发条文字取标签角色,与 Accordion、Collapsible、Reasoning 同一档字重 */
|
|
167
|
+
font-weight: var(--xh-tool-call-label-font-weight, var(--xh-text-label-weight));
|
|
154
168
|
text-overflow: ellipsis;
|
|
155
169
|
white-space: nowrap;
|
|
156
170
|
}
|
|
@@ -197,29 +211,31 @@
|
|
|
197
211
|
display: none;
|
|
198
212
|
}
|
|
199
213
|
|
|
200
|
-
/*
|
|
201
|
-
|
|
202
|
-
[data-scope='tool-call'][data-part='status'][data-
|
|
203
|
-
[data-scope='tool-call'][data-part='status'][data-state='output-error'] {
|
|
214
|
+
/* 三档落定的阶段收成状态 chip:几何与 Tag 的 sm 档同一把尺,淡底 + 同族可读字取连接层投影的语气。
|
|
215
|
+
在跑的两档不带底,让扫光自己说话 */
|
|
216
|
+
[data-scope='tool-call'][data-part='status'][data-tone] {
|
|
204
217
|
padding-block: var(--xh-tool-call-status-py, var(--xh-space-0_5));
|
|
205
|
-
padding-inline: var(--xh-tool-call-status-px, var(--xh-space-
|
|
218
|
+
padding-inline: var(--xh-tool-call-status-px, var(--xh-space-1_5));
|
|
219
|
+
border: var(--xh-stroke-thin) solid transparent;
|
|
206
220
|
border-radius: var(--xh-tool-call-status-radius, var(--xh-shape-pill));
|
|
221
|
+
font-weight: var(--xh-font-weight-medium);
|
|
222
|
+
line-height: var(--xh-control-indicator-md);
|
|
207
223
|
}
|
|
208
224
|
|
|
209
|
-
/*
|
|
225
|
+
/* 各阶段的覆盖槽仍按阶段给:作者可以单独改某一档 */
|
|
210
226
|
[data-scope='tool-call'][data-part='status'][data-state='awaiting-approval'] {
|
|
211
|
-
background: var(--xh-tool-call-status-bg-approval,
|
|
212
|
-
color: var(--xh-tool-call-status-fg-approval,
|
|
227
|
+
background: var(--xh-tool-call-status-bg-approval, var(--xh-_tone-subtle));
|
|
228
|
+
color: var(--xh-tool-call-status-fg-approval, var(--xh-_tone-fg));
|
|
213
229
|
}
|
|
214
230
|
|
|
215
231
|
[data-scope='tool-call'][data-part='status'][data-state='output-available'] {
|
|
216
|
-
background: var(--xh-tool-call-status-bg-done,
|
|
217
|
-
color: var(--xh-tool-call-status-fg-done,
|
|
232
|
+
background: var(--xh-tool-call-status-bg-done, var(--xh-_tone-subtle));
|
|
233
|
+
color: var(--xh-tool-call-status-fg-done, var(--xh-_tone-fg));
|
|
218
234
|
}
|
|
219
235
|
|
|
220
236
|
[data-scope='tool-call'][data-part='status'][data-state='output-error'] {
|
|
221
|
-
background: var(--xh-tool-call-status-bg-error,
|
|
222
|
-
color: var(--xh-tool-call-status-fg-error,
|
|
237
|
+
background: var(--xh-tool-call-status-bg-error, var(--xh-_tone-subtle));
|
|
238
|
+
color: var(--xh-tool-call-status-fg-error, var(--xh-_tone-fg));
|
|
223
239
|
}
|
|
224
240
|
|
|
225
241
|
/* 在跑的时候状态文字自己扫一道光:data-loading 此前在皮肤里没有任何表达,
|
|
@@ -237,7 +253,7 @@
|
|
|
237
253
|
background-clip: text;
|
|
238
254
|
color: transparent;
|
|
239
255
|
-webkit-text-fill-color: transparent;
|
|
240
|
-
animation: xh-
|
|
256
|
+
animation: xh-shimmer var(--xh-tool-call-shimmer-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-loop) infinite;
|
|
241
257
|
}
|
|
242
258
|
|
|
243
259
|
/* 减少动效:整道光撤掉换回平色,"在跑"仍由状态文字本身表达——只停动画的话,
|
|
@@ -303,15 +319,14 @@
|
|
|
303
319
|
border-block-start: var(--xh-stroke-thin) solid var(--xh-tool-call-divider, var(--xh-border-subtle));
|
|
304
320
|
}
|
|
305
321
|
|
|
306
|
-
/*
|
|
307
|
-
[data-scope='tool-call'][data-part='content'][data-state='open'] {
|
|
308
|
-
|
|
309
|
-
animation: xh-disclosure-expand var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
322
|
+
/* 展开与收起只在开合时播:首帧就在的展开 / 收起直接呈现(data-instant) */
|
|
323
|
+
[data-scope='tool-call'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
324
|
+
animation: xh-disclosure-expand var(--xh-motion-duration-expand) var(--xh-motion-ease-enter-strong);
|
|
310
325
|
}
|
|
311
326
|
|
|
312
327
|
/* 退场走 exit 档曲线 */
|
|
313
|
-
[data-scope='tool-call'][data-part='content'][data-state='closed'] {
|
|
314
|
-
animation: xh-disclosure-collapse var(--xh-motion-duration-
|
|
328
|
+
[data-scope='tool-call'][data-part='content'][data-state='closed']:not([data-instant]) {
|
|
329
|
+
animation: xh-disclosure-collapse var(--xh-motion-duration-collapse) var(--xh-motion-ease-exit) forwards;
|
|
315
330
|
}
|
|
316
331
|
|
|
317
332
|
[data-scope='tool-call'][data-part='input'],
|
|
@@ -338,20 +353,20 @@
|
|
|
338
353
|
|
|
339
354
|
/* 尺寸档只改内衬与字号 */
|
|
340
355
|
[data-scope='tool-call'][data-part='root'][data-size='sm'] {
|
|
341
|
-
--xh-_tool-call-px: var(--xh-space-
|
|
342
|
-
--xh-_tool-call-py: var(--xh-space-
|
|
356
|
+
--xh-_tool-call-px: var(--xh-space-3);
|
|
357
|
+
--xh-_tool-call-py: var(--xh-space-3);
|
|
343
358
|
--xh-_tool-call-font-size: var(--xh-control-font-sm);
|
|
344
359
|
}
|
|
345
360
|
|
|
346
361
|
[data-scope='tool-call'][data-part='root'][data-size='md'] {
|
|
347
|
-
--xh-_tool-call-px: var(--xh-space-
|
|
348
|
-
--xh-_tool-call-py: var(--xh-space-
|
|
362
|
+
--xh-_tool-call-px: var(--xh-space-4);
|
|
363
|
+
--xh-_tool-call-py: var(--xh-space-4);
|
|
349
364
|
--xh-_tool-call-font-size: var(--xh-control-font-md);
|
|
350
365
|
}
|
|
351
366
|
|
|
352
367
|
[data-scope='tool-call'][data-part='root'][data-size='lg'] {
|
|
353
|
-
--xh-_tool-call-px: var(--xh-space-
|
|
354
|
-
--xh-_tool-call-py: var(--xh-space-
|
|
368
|
+
--xh-_tool-call-px: var(--xh-space-5);
|
|
369
|
+
--xh-_tool-call-py: var(--xh-space-5);
|
|
355
370
|
--xh-_tool-call-font-size: var(--xh-control-font-lg);
|
|
356
371
|
}
|
|
357
372
|
|
|
@@ -362,35 +377,28 @@
|
|
|
362
377
|
inset var(--xh-tool-call-tone-bar, var(--xh-stroke-thick)) 0 0 0 var(--xh-tool-call-tone-fg, var(--xh-_tone-soft, var(--xh-bg-brand))),
|
|
363
378
|
var(--xh-_tool-call-shadow);
|
|
364
379
|
}
|
|
365
|
-
}
|
|
366
380
|
|
|
367
|
-
@
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
to {
|
|
377
|
-
opacity: 1;
|
|
378
|
-
translate: 0 0;
|
|
381
|
+
@media (forced-colors: active) {
|
|
382
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
383
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
384
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
385
|
+
禁用取 GrayText */
|
|
386
|
+
[data-scope='tool-call'][data-part='indicator']:empty::before {
|
|
387
|
+
forced-color-adjust: none;
|
|
388
|
+
background-color: ButtonText;
|
|
379
389
|
}
|
|
380
|
-
}
|
|
381
390
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
@keyframes xh-tool-call-shimmer {
|
|
385
|
-
from {
|
|
386
|
-
background-position: 150% center;
|
|
391
|
+
[data-scope='tool-call'][data-part='trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]) [data-scope='tool-call'][data-part='indicator']:empty::before {
|
|
392
|
+
background-color: HighlightText;
|
|
387
393
|
}
|
|
388
394
|
|
|
389
|
-
|
|
390
|
-
background-
|
|
395
|
+
[data-scope='tool-call'][data-part='trigger'][data-disabled] [data-scope='tool-call'][data-part='indicator']:empty::before {
|
|
396
|
+
background-color: GrayText;
|
|
391
397
|
}
|
|
392
398
|
}
|
|
399
|
+
}
|
|
393
400
|
|
|
401
|
+
@layer xihan.motion {
|
|
394
402
|
@media print {
|
|
395
403
|
/* 打印:动画会被定格在任意一帧——转了一半的圈、扫到一半的微光。这里换成静止的表达,
|
|
396
404
|
取值与减弱动效那一档相同。两档各写一块、不并进一条媒体查询列表:减弱动效另有一份
|
package/css/toolbar.css
CHANGED
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
--xh-_toolbar-root-bg: transparent;
|
|
32
32
|
--xh-_toolbar-root-bg-disabled: transparent;
|
|
33
33
|
|
|
34
|
-
/*
|
|
34
|
+
/* 一行排不下就折行:条目宽度由各自的控件决定,硬撑一行会把整条顶出容器。
|
|
35
|
+
放了「更多」钮时改为收纳,见下方收纳一节 */
|
|
35
36
|
display: flex;
|
|
36
37
|
flex-wrap: wrap;
|
|
37
38
|
align-items: center;
|
|
@@ -44,7 +45,7 @@
|
|
|
44
45
|
color: var(--xh-toolbar-fg, var(--xh-fg-default));
|
|
45
46
|
/* 整条置灰与恢复是一次状态切换,底色与字色淡着换,不硬切 */
|
|
46
47
|
transition:
|
|
47
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
48
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
48
49
|
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
49
50
|
}
|
|
50
51
|
|
|
@@ -181,12 +182,16 @@
|
|
|
181
182
|
}
|
|
182
183
|
|
|
183
184
|
/* 组内分段使用同一块中性操作面(淡底承载:hover 200 → pressed 300 由 host 槽下发);
|
|
184
|
-
中间段保持直角,只给整组两端补回控件圆角。按下态 /
|
|
185
|
+
中间段保持直角,只给整组两端补回控件圆角。按下态 / 禁用面与散落条目同一套规则。
|
|
186
|
+
分段零间距直角相接,按下只换面不缩放:缩放任一段都会把两侧接缝撕开 */
|
|
185
187
|
[data-scope='toolbar'][data-part='group'] > [data-scope='toolbar'][data-part='item'] {
|
|
186
188
|
--xh-action-host-bg-hover: var(--xh-bg-subtle-hover);
|
|
187
189
|
--xh-action-host-bg-pressed: var(--xh-bg-subtle-active);
|
|
188
190
|
--xh-action-radius: 0;
|
|
191
|
+
--xh-action-scale-pressed: none;
|
|
189
192
|
--xh-action-bg-disabled: var(--xh-toolbar-item-bg-disabled, var(--xh-bg-subtle));
|
|
193
|
+
/* 组末端补回的控件圆角:尾部几段收进「更多」菜单后,由留下的最后一段接过去 */
|
|
194
|
+
--xh-_toolbar-segment-end-radius: var(--xh-toolbar-item-radius, var(--xh-shape-control));
|
|
190
195
|
|
|
191
196
|
position: relative;
|
|
192
197
|
}
|
|
@@ -257,6 +262,80 @@
|
|
|
257
262
|
margin-block-start: calc(-1 * var(--xh-toolbar-separator-thickness, var(--xh-stroke-thin)));
|
|
258
263
|
}
|
|
259
264
|
|
|
265
|
+
/* —— 收纳 —— */
|
|
266
|
+
/* 放了「更多」钮就不折行:放不下的条目按次序收进它弹出的菜单。条目与分组不压缩——压缩了,
|
|
267
|
+
量到的就不是自然长度;root 在 flex 父容器里可以被压到比内容窄,可用长度由外面给 */
|
|
268
|
+
[data-scope='toolbar'][data-part='root']:has(> [data-scope='toolbar'][data-part='overflow-trigger']) {
|
|
269
|
+
flex-wrap: nowrap;
|
|
270
|
+
min-inline-size: 0;
|
|
271
|
+
min-block-size: 0;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
[data-scope='toolbar'][data-part='root']:has(> [data-scope='toolbar'][data-part='overflow-trigger'])
|
|
275
|
+
> :is([data-scope='toolbar'][data-part='item'], [data-scope='toolbar'][data-part='group']) {
|
|
276
|
+
flex-shrink: 0;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* 收起的条目之前的分隔线与整组收空的分组一并让开:它们分隔的那一侧已经没有露着的条目,
|
|
280
|
+
留着会在「更多」钮前多出一道线、多出一截间距 */
|
|
281
|
+
[data-scope='toolbar'][data-part='root']:has(> [data-scope='toolbar'][data-part='overflow-trigger']:not([hidden]))
|
|
282
|
+
> [data-scope='toolbar'][data-part='separator']:not(
|
|
283
|
+
:has(
|
|
284
|
+
~ [data-scope='toolbar'][data-part='item']:not([hidden]),
|
|
285
|
+
~ [data-scope='toolbar'][data-part='group'] > [data-scope='toolbar'][data-part='item']:not([hidden])
|
|
286
|
+
)
|
|
287
|
+
),
|
|
288
|
+
[data-scope='toolbar'][data-part='root']:has(> [data-scope='toolbar'][data-part='overflow-trigger']:not([hidden]))
|
|
289
|
+
> [data-scope='toolbar'][data-part='group']:not(:has(> [data-scope='toolbar'][data-part='item']:not([hidden]))),
|
|
290
|
+
[data-scope='toolbar'][data-part='root']:has(> [data-scope='toolbar'][data-part='overflow-trigger']:not([hidden]))
|
|
291
|
+
> [data-scope='toolbar'][data-part='group']
|
|
292
|
+
> [data-scope='toolbar'][data-part='separator']:not(:has(~ [data-scope='toolbar'][data-part='item']:not([hidden]))) {
|
|
293
|
+
display: none;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* 组的尾部几段收进菜单后,留下的最后一段补回末端圆角 */
|
|
297
|
+
[data-scope='toolbar'][data-part='group'][data-orientation='horizontal']
|
|
298
|
+
> [data-scope='toolbar'][data-part='item']:not([hidden]):not(:has(~ [data-scope='toolbar'][data-part='item']:not([hidden]))) {
|
|
299
|
+
border-start-end-radius: var(--xh-_toolbar-segment-end-radius);
|
|
300
|
+
border-end-end-radius: var(--xh-_toolbar-segment-end-radius);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
[data-scope='toolbar'][data-part='group'][data-orientation='vertical']
|
|
304
|
+
> [data-scope='toolbar'][data-part='item']:not([hidden]):not(:has(~ [data-scope='toolbar'][data-part='item']:not([hidden]))) {
|
|
305
|
+
border-end-start-radius: var(--xh-_toolbar-segment-end-radius);
|
|
306
|
+
border-end-end-radius: var(--xh-_toolbar-segment-end-radius);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/* 「更多」钮:行尾一枚单图标钮,接 Action Control icon 档 ghost 面,与条目同档(连接层投影 profile /
|
|
310
|
+
variant / size)。盒取条目同高的正方形,四态面、0.97 按压、焦点环与粗指针 44px 命中区由家族配方给;
|
|
311
|
+
承载面的阶梯随根的 variant 经 host 槽下发(ghost 根白底 100 → 200,subtle 根淡底 200 → 300) */
|
|
312
|
+
[data-scope='toolbar'][data-part='overflow-trigger'] {
|
|
313
|
+
touch-action: manipulation;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/* 菜单开着:与悬停同档的中性面,不用品牌色、不另画环;收起的是哪几条由菜单本身说明 */
|
|
317
|
+
[data-scope='toolbar'][data-part='overflow-trigger'][data-state='open'] {
|
|
318
|
+
--xh-action-bg-rest: var(--xh-_action-variant-bg-hover);
|
|
319
|
+
--xh-action-bg-focus-visible: var(--xh-_action-variant-bg-hover);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/* 没写内容就由皮肤画兜底字形:横排三点。作者塞了自己的图标这条即不命中;
|
|
323
|
+
字形与条目里的图标同一把尺(根按尺寸档下发的 --xh-icon-size) */
|
|
324
|
+
[data-scope='toolbar'][data-part='overflow-trigger']:empty::before {
|
|
325
|
+
content: '';
|
|
326
|
+
display: inline-block;
|
|
327
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
328
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
329
|
+
background-color: currentColor;
|
|
330
|
+
-webkit-mask: var(--xh-glyph-mark-ellipsis) center / contain no-repeat;
|
|
331
|
+
mask: var(--xh-glyph-mark-ellipsis) center / contain no-repeat;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/* 全部放得下时连接层给的是 hidden 属性;家族那条 display 会把 UA 规则盖掉 */
|
|
335
|
+
[data-scope='toolbar'][data-part='overflow-trigger'][hidden] {
|
|
336
|
+
display: none;
|
|
337
|
+
}
|
|
338
|
+
|
|
260
339
|
@media (forced-colors: active) {
|
|
261
340
|
/* 分段之间那条线画的是一块纯底色,这一档里底色被统一换成 Canvas,线整条消失,
|
|
262
341
|
几段控件就连成了一长串。换成前景色画回来 */
|
|
@@ -264,4 +343,23 @@
|
|
|
264
343
|
background: CanvasText;
|
|
265
344
|
}
|
|
266
345
|
}
|
|
346
|
+
|
|
347
|
+
@media (forced-colors: active) {
|
|
348
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
349
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
350
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
351
|
+
禁用取 GrayText */
|
|
352
|
+
[data-scope='toolbar'][data-part='overflow-trigger']:empty::before {
|
|
353
|
+
forced-color-adjust: none;
|
|
354
|
+
background-color: ButtonText;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
[data-scope='toolbar'][data-part='overflow-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
358
|
+
background-color: HighlightText;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
[data-scope='toolbar'][data-part='overflow-trigger'][data-disabled]:empty::before {
|
|
362
|
+
background-color: GrayText;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
267
365
|
}
|
package/css/tooltip.css
CHANGED
|
@@ -114,6 +114,18 @@
|
|
|
114
114
|
backdrop-filter: var(--xh-tooltip-backdrop, var(--xh-material-frosted-compact-backdrop));
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
+
/* 跟随鼠标的提示压在指针旁边、随指针挪:它接了指针就会挡住 trigger 上的移动,指针一滑进去便算离开了 trigger。
|
|
118
|
+
这一档浮层本体同样让指针穿过去,停留细看交给 trigger 本身 */
|
|
119
|
+
[data-scope='tooltip'][data-part='positioner'][data-follow-cursor] [data-scope='tooltip'][data-part='content'] {
|
|
120
|
+
pointer-events: none;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* 反白面是一块彩色面(连接层打 data-xh-ink-surface):面内的作者内容按这块底取墨色。
|
|
124
|
+
底色取自被墨色域改写的令牌,所以域只落在面内的子元素上,这里的取值仍按外层主题解析 */
|
|
125
|
+
[data-scope='tooltip'][data-part='content'][data-xh-ink-surface] {
|
|
126
|
+
--xh-ink-surface: var(--xh-tooltip-bg, var(--xh-_tooltip-solid));
|
|
127
|
+
}
|
|
128
|
+
|
|
117
129
|
/* 光学层单独承载 tint 与透明度;backdrop-filter 只采样元素背后,不处理正文。 */
|
|
118
130
|
[data-scope='tooltip'][data-part='content']::before {
|
|
119
131
|
content: '';
|
|
@@ -126,8 +138,9 @@
|
|
|
126
138
|
pointer-events: none;
|
|
127
139
|
}
|
|
128
140
|
|
|
129
|
-
/* 入场走 enter 档(锚定列表族的 tooltip 入场 --xh-motion-duration-enter),退场仍是 exit
|
|
130
|
-
|
|
141
|
+
/* 入场走 enter 档(锚定列表族的 tooltip 入场 --xh-motion-duration-enter),退场仍是 exit。
|
|
142
|
+
接替上一个提示打开的(data-instant)直接呈现:横扫一排钮时提示一个个跟上,不再一个个滑入 */
|
|
143
|
+
[data-scope='tooltip'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
131
144
|
animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
132
145
|
}
|
|
133
146
|
|
package/css/tour.css
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
/* 高亮框落定时那一下呼吸:换步时视线要跟着它走,纯位移太容易被漏看 */
|
|
14
14
|
@keyframes xh-tour-spotlight-in {
|
|
15
15
|
from {
|
|
16
|
-
opacity: 0;
|
|
16
|
+
opacity: var(--xh-_enter-from-opacity, 0);
|
|
17
17
|
scale: calc(2 - var(--xh-motion-scale-enter));
|
|
18
18
|
}
|
|
19
19
|
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
display: none;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
[data-scope='tour'][data-part='backdrop'][data-state='open'] {
|
|
73
|
+
[data-scope='tour'][data-part='backdrop'][data-state='open']:not([data-instant]) {
|
|
74
74
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
75
75
|
}
|
|
76
76
|
|
|
@@ -94,13 +94,23 @@
|
|
|
94
94
|
box-shadow:
|
|
95
95
|
0 0 0 var(--xh-stroke-thick) var(--xh-tour-spotlight-ring, var(--xh-ring-focus)),
|
|
96
96
|
0 0 0 100vmax var(--xh-_tour-spotlight-shroud);
|
|
97
|
-
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* 换步那一段(data-animating):聚光框与气泡同一段时长、同一条曲线一起滑到下一个目标,视线跟得上;
|
|
100
|
+
页面滚动与视口缩放时不挂,两者跟手、不拖尾。坐标由连接层按物理 left / top 写进内联,过渡跟着写物理轴 */
|
|
101
|
+
[data-scope='tour'][data-part='spotlight'][data-animating] {
|
|
98
102
|
transition:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
inline-size var(--xh-motion-duration-
|
|
102
|
-
block-size var(--xh-motion-duration-
|
|
103
|
-
border-radius var(--xh-motion-duration-
|
|
103
|
+
left var(--xh-motion-duration-move) var(--xh-motion-ease-continuous),
|
|
104
|
+
top var(--xh-motion-duration-move) var(--xh-motion-ease-continuous),
|
|
105
|
+
inline-size var(--xh-motion-duration-move) var(--xh-motion-ease-continuous),
|
|
106
|
+
block-size var(--xh-motion-duration-move) var(--xh-motion-ease-continuous),
|
|
107
|
+
border-radius var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
[data-scope='tour'][data-part='positioner'][data-animating] {
|
|
111
|
+
transition:
|
|
112
|
+
left var(--xh-motion-duration-move) var(--xh-motion-ease-continuous),
|
|
113
|
+
top var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
104
114
|
}
|
|
105
115
|
|
|
106
116
|
[data-scope='tour'][data-part='spotlight'][data-dimmed] {
|
|
@@ -111,7 +121,7 @@
|
|
|
111
121
|
display: none;
|
|
112
122
|
}
|
|
113
123
|
|
|
114
|
-
[data-scope='tour'][data-part='spotlight'][data-state='open'] {
|
|
124
|
+
[data-scope='tour'][data-part='spotlight'][data-state='open']:not([data-instant]) {
|
|
115
125
|
animation: xh-tour-spotlight-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
116
126
|
}
|
|
117
127
|
|
|
@@ -209,7 +219,8 @@
|
|
|
209
219
|
/* 焦点落在气泡本身,Enter / Space 落在它身上推进下一步:它是可操作目标,
|
|
210
220
|
环由 focus.css 的默认内收环画,这里不另写 */
|
|
211
221
|
|
|
212
|
-
|
|
222
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
223
|
+
[data-scope='tour'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
213
224
|
animation: xh-overlay-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
214
225
|
}
|
|
215
226
|
|
|
@@ -236,7 +247,7 @@
|
|
|
236
247
|
/* 说明文字走说明档:13px + fg-muted */
|
|
237
248
|
[data-scope='tour'][data-part='description'] {
|
|
238
249
|
margin: 0;
|
|
239
|
-
font-size: var(--xh-text-secondary-size);
|
|
250
|
+
font-size: var(--xh-tour-description-font-size, var(--xh-text-secondary-size));
|
|
240
251
|
line-height: var(--xh-leading-normal);
|
|
241
252
|
color: var(--xh-tour-description-fg, var(--xh-fg-muted));
|
|
242
253
|
}
|
|
@@ -266,7 +277,7 @@
|
|
|
266
277
|
border-radius: var(--xh-shape-circle);
|
|
267
278
|
background: var(--xh-tour-progress-dot-bg, var(--xh-border-default));
|
|
268
279
|
transition:
|
|
269
|
-
inline-size var(--xh-motion-duration-
|
|
280
|
+
inline-size var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous),
|
|
270
281
|
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
271
282
|
}
|
|
272
283
|
|
|
@@ -406,4 +417,23 @@
|
|
|
406
417
|
display: none;
|
|
407
418
|
}
|
|
408
419
|
}
|
|
420
|
+
|
|
421
|
+
@media (forced-colors: active) {
|
|
422
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
423
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
424
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
425
|
+
禁用取 GrayText */
|
|
426
|
+
[data-scope='tour'][data-part='close-trigger']:empty::before {
|
|
427
|
+
forced-color-adjust: none;
|
|
428
|
+
background-color: ButtonText;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
[data-scope='tour'][data-part='close-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
432
|
+
background-color: HighlightText;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
[data-scope='tour'][data-part='close-trigger'][data-disabled]:empty::before {
|
|
436
|
+
background-color: GrayText;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
409
439
|
}
|