@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/steps.css
CHANGED
|
@@ -6,6 +6,16 @@
|
|
|
6
6
|
/* 定义 steps 样式。 */
|
|
7
7
|
|
|
8
8
|
@import '../family/action-control.css';
|
|
9
|
+
/* 走过那一步时对号的淡入取共享关键帧。 */
|
|
10
|
+
@import '../family/motion.css';
|
|
11
|
+
|
|
12
|
+
/* 当前步的完成比例(0–1)由连接层写进圆点的内联样式。登记成数值,进度环的弧才能沿过渡走到新比例;
|
|
13
|
+
要继承:画弧的是圆点的 ::after。不认 @property 的引擎把它当普通自定义属性,弧照旧落到新比例,只是没有过渡 */
|
|
14
|
+
@property --xh-_steps-progress {
|
|
15
|
+
syntax: '<number>';
|
|
16
|
+
inherits: true;
|
|
17
|
+
initial-value: 0;
|
|
18
|
+
}
|
|
9
19
|
|
|
10
20
|
@layer xihan.components {
|
|
11
21
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -14,16 +24,26 @@
|
|
|
14
24
|
}
|
|
15
25
|
|
|
16
26
|
[data-scope='steps'][data-part='root'] {
|
|
17
|
-
/* 作者放进标题 /
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
/* 作者放进标题 / 说明里的图标是控件内图标,随尺寸档取 glyph-size-sm / md / lg,缺省 md;
|
|
28
|
+
每一档都把 --xh-steps-icon-size 排在档值前面,外层统一改尺的通道不被档值挡住。
|
|
29
|
+
走过的步里皮肤画的兜底对号不读这支:它是指示符,与序号圆点同走 --xh-control-indicator-* 一族——
|
|
30
|
+
圆点在自己身上把 --xh-icon-size 改接到 --xh-steps-indicator-mark-size,兜底对号与作者塞进圆点里的
|
|
31
|
+
XhIcon 读同一把尺 */
|
|
32
|
+
--xh-icon-size: var(--xh-steps-icon-size, var(--xh-glyph-size-md));
|
|
21
33
|
|
|
22
34
|
/* 尺寸档只换这三个私有槽,序号圆点、标题与圆点里的序号都从 root 继承它们,
|
|
23
|
-
换档不必给每个部件各写一条选择器;说明走说明角色(13px
|
|
24
|
-
|
|
35
|
+
换档不必给每个部件各写一条选择器;说明走说明角色(13px),不随档。
|
|
36
|
+
圆点与 Avatar、带框 Icon 同一把尺:control-h 的 sm / md / lg,随密度换档 */
|
|
37
|
+
--xh-_steps-indicator-size: var(--xh-control-h-md);
|
|
25
38
|
--xh-_steps-title-font-size: var(--xh-control-font-md);
|
|
26
39
|
--xh-_steps-caption-font-size: var(--xh-text-caption-size);
|
|
40
|
+
/* 圆点一圈边的宽:序号圆点是细边(多数状态透明占位),点状形态的空心圈要粗一档才读得出是个圈 */
|
|
41
|
+
--xh-_steps-indicator-border-width: var(--xh-stroke-thin);
|
|
42
|
+
/* 圆点四周给当前步那圈环留的位置:序号圆点不留,点状形态留出环的宽度,换步不挪版面 */
|
|
43
|
+
--xh-_steps-indicator-margin: var(--xh-space-0);
|
|
44
|
+
/* 当前步那圈环:离圆点边一道缝,环本身一道粗描边宽 */
|
|
45
|
+
--xh-_steps-ring-gap: var(--xh-space-0_5);
|
|
46
|
+
--xh-_steps-ring-thickness: var(--xh-stroke-thick);
|
|
27
47
|
|
|
28
48
|
/* 语气落在当前步的标记、走过那几步的对号与连接线上:强调色画描边与填充,
|
|
29
49
|
accent-text 是普通底上的强调文字(走过与当前步的标题),on-accent 是实心底上的前景。
|
|
@@ -64,20 +84,38 @@
|
|
|
64
84
|
}
|
|
65
85
|
|
|
66
86
|
/* —— 尺寸 —— */
|
|
67
|
-
/*
|
|
68
|
-
两侧改从 space 档取,缺省档才留得住 */
|
|
87
|
+
/* 缺省档写在上面的基础规则里 */
|
|
69
88
|
[data-scope='steps'][data-part='root'][data-size='sm'] {
|
|
70
|
-
--xh-
|
|
89
|
+
--xh-icon-size: var(--xh-steps-icon-size, var(--xh-glyph-size-sm));
|
|
90
|
+
--xh-_steps-indicator-size: var(--xh-control-h-sm);
|
|
71
91
|
--xh-_steps-title-font-size: var(--xh-control-font-sm);
|
|
72
92
|
/* 字号档最小就是 xs,序号不再往下走,故不重声明 caption */
|
|
73
93
|
}
|
|
74
94
|
|
|
75
95
|
[data-scope='steps'][data-part='root'][data-size='lg'] {
|
|
96
|
+
--xh-icon-size: var(--xh-steps-icon-size, var(--xh-glyph-size-lg));
|
|
76
97
|
--xh-_steps-indicator-size: var(--xh-control-h-lg);
|
|
77
98
|
--xh-_steps-title-font-size: var(--xh-control-font-lg);
|
|
78
99
|
--xh-_steps-caption-font-size: var(--xh-text-secondary-size);
|
|
79
100
|
}
|
|
80
101
|
|
|
102
|
+
/* —— 点状形态 —— */
|
|
103
|
+
/* 圆点不盛内容,是纯位置标记:直径不在控件高度那把尺上,与 Timeline 圆点同走空间尺相邻的三格,
|
|
104
|
+
不随密度换档;描边粗一档,四周留出当前步那圈环的宽度 */
|
|
105
|
+
[data-scope='steps'][data-part='root'][data-variant='dot'] {
|
|
106
|
+
--xh-_steps-indicator-size: var(--xh-space-2_5);
|
|
107
|
+
--xh-_steps-indicator-border-width: var(--xh-stroke-thick);
|
|
108
|
+
--xh-_steps-indicator-margin: calc(var(--xh-_steps-ring-gap) + var(--xh-_steps-ring-thickness));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
[data-scope='steps'][data-part='root'][data-variant='dot'][data-size='sm'] {
|
|
112
|
+
--xh-_steps-indicator-size: var(--xh-space-2);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
[data-scope='steps'][data-part='root'][data-variant='dot'][data-size='lg'] {
|
|
116
|
+
--xh-_steps-indicator-size: var(--xh-space-3);
|
|
117
|
+
}
|
|
118
|
+
|
|
81
119
|
/* 步骤与连接线必须保持在同一条流程轴上,空间不足时由标题省略而不是拆成两行。 */
|
|
82
120
|
[data-scope='steps'][data-part='list'] {
|
|
83
121
|
display: flex;
|
|
@@ -174,6 +212,13 @@
|
|
|
174
212
|
text-align: start;
|
|
175
213
|
}
|
|
176
214
|
|
|
215
|
+
/* 只读展示:trigger 不投影 Action Control,只是「序号 + 标题 + 说明」的排版容器——内距与可操作时同一把尺,
|
|
216
|
+
在两种形态间切换版面不跳;没有悬停、按压与焦点环,标题与说明不置灰 */
|
|
217
|
+
[data-scope='steps'][data-part='trigger'][data-readonly] {
|
|
218
|
+
padding-block: var(--xh-steps-trigger-p, var(--xh-space-1));
|
|
219
|
+
padding-inline: var(--xh-steps-trigger-p, var(--xh-control-px-sm));
|
|
220
|
+
}
|
|
221
|
+
|
|
177
222
|
[data-scope='steps'][data-part='trigger'][hidden] {
|
|
178
223
|
display: none;
|
|
179
224
|
}
|
|
@@ -187,9 +232,11 @@
|
|
|
187
232
|
[data-scope='steps'][data-part='indicator'] {
|
|
188
233
|
/* 圆点里的字形是指示符:对号按指示符档取尺、随密度换档(comfortable 16 / compact 14),
|
|
189
234
|
不读 root 上只管作者标题 / 说明图标的 --xh-steps-icon-size;作者塞进圆点的 XhIcon 与兜底对号同一把尺。
|
|
190
|
-
圆点自己走
|
|
235
|
+
圆点自己走 control-h 的尺(最小 compact sm 的 28px),两档字形在三档圆点里都留得出边距 */
|
|
191
236
|
--xh-icon-size: var(--xh-steps-indicator-mark-size, var(--xh-control-indicator-size));
|
|
192
237
|
|
|
238
|
+
/* 当前步那圈环(::after)以圆点为准绳定位 */
|
|
239
|
+
position: relative;
|
|
193
240
|
display: inline-flex;
|
|
194
241
|
grid-row: 1 / span 2;
|
|
195
242
|
flex: none;
|
|
@@ -197,7 +244,7 @@
|
|
|
197
244
|
justify-content: center;
|
|
198
245
|
inline-size: var(--xh-steps-indicator-size, var(--xh-_steps-indicator-size));
|
|
199
246
|
block-size: var(--xh-steps-indicator-size, var(--xh-_steps-indicator-size));
|
|
200
|
-
border: var(--xh-
|
|
247
|
+
border: var(--xh-_steps-indicator-border-width) solid var(--xh-steps-indicator-border, transparent);
|
|
201
248
|
border-radius: var(--xh-steps-indicator-radius, var(--xh-shape-circle));
|
|
202
249
|
background: var(--xh-steps-indicator-bg, var(--xh-bg-subtle));
|
|
203
250
|
color: var(--xh-steps-indicator-fg, var(--xh-fg-muted));
|
|
@@ -207,7 +254,7 @@
|
|
|
207
254
|
font-variant-numeric: tabular-nums;
|
|
208
255
|
line-height: var(--xh-leading-none);
|
|
209
256
|
transition:
|
|
210
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
257
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
211
258
|
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
212
259
|
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
213
260
|
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
@@ -221,26 +268,27 @@
|
|
|
221
268
|
:hover / :is(:active, [data-pressed]) 下读宿主 host 槽的同一来源换面,同一时间线,不缩放——
|
|
222
269
|
圆点自己是 100 的淡底,坐在触发器的 hover 面(100)上,再上一档到 200 才与承载面分得开,按下到 300;
|
|
223
270
|
当前步的实心面按下换语气 active 档 */
|
|
224
|
-
[data-scope='steps'][data-part='trigger']:hover:not([data-disabled])
|
|
271
|
+
[data-scope='steps'][data-part='trigger']:hover:not([data-disabled], [data-readonly])
|
|
225
272
|
[data-scope='steps'][data-part='indicator'][data-state='incomplete'] {
|
|
226
273
|
background: var(--xh-steps-indicator-bg-hover, var(--xh-_steps-host-bg-hover));
|
|
227
274
|
color: var(--xh-steps-indicator-fg-hover, var(--xh-fg-default));
|
|
228
275
|
}
|
|
229
276
|
|
|
230
|
-
|
|
231
|
-
|
|
277
|
+
/* 点状形态里走过的点是实心标记色,悬停不换成中性面:承载它的行换面即是悬停反馈 */
|
|
278
|
+
[data-scope='steps'][data-part='trigger']:hover:not([data-disabled], [data-readonly])
|
|
279
|
+
[data-scope='steps'][data-part='indicator'][data-state='completed']:not([data-variant='dot']) {
|
|
232
280
|
background: var(--xh-steps-indicator-bg-completed-hover, var(--xh-_steps-host-bg-hover));
|
|
233
281
|
}
|
|
234
282
|
|
|
235
|
-
[data-scope='steps'][data-part='trigger']:not([data-disabled]):is(:active, [data-pressed])
|
|
236
|
-
[data-scope='steps'][data-part='indicator']:is([data-state='incomplete'], [data-state='completed']) {
|
|
283
|
+
[data-scope='steps'][data-part='trigger']:not([data-disabled], [data-readonly]):is(:active, [data-pressed])
|
|
284
|
+
[data-scope='steps'][data-part='indicator']:is([data-state='incomplete'], [data-state='completed']:not([data-variant='dot'])) {
|
|
237
285
|
background: var(--xh-steps-indicator-bg-pressed, var(--xh-_steps-host-bg-pressed));
|
|
238
286
|
transition-duration: var(--xh-motion-duration-press);
|
|
239
287
|
transition-timing-function: var(--xh-motion-ease-press);
|
|
240
288
|
}
|
|
241
289
|
|
|
242
|
-
[data-scope='steps'][data-part='trigger']:not([data-disabled]):is(:active, [data-pressed])
|
|
243
|
-
[data-scope='steps'][data-part='indicator'][data-state='current'] {
|
|
290
|
+
[data-scope='steps'][data-part='trigger']:not([data-disabled], [data-readonly]):is(:active, [data-pressed])
|
|
291
|
+
[data-scope='steps'][data-part='indicator'][data-state='current']:not([data-variant='dot']) {
|
|
244
292
|
background: var(--xh-steps-indicator-bg-current-pressed, var(--xh-_tone-active, var(--xh-bg-brand-active)));
|
|
245
293
|
transition-duration: var(--xh-motion-duration-press);
|
|
246
294
|
transition-timing-function: var(--xh-motion-ease-press);
|
|
@@ -260,6 +308,88 @@
|
|
|
260
308
|
color: var(--xh-steps-indicator-fg-completed, var(--xh-_steps-accent-mark));
|
|
261
309
|
}
|
|
262
310
|
|
|
311
|
+
/* 点状形态的三态:没走到的空心粗圈(墨色与序号形态的序号同一支),走过的实心标记色(序号形态里那枚对号的颜色),
|
|
312
|
+
当前步实心品牌(格状当前)外加一圈同色环。空心 / 实心 / 带环是形状通道,不只靠颜色分三态;
|
|
313
|
+
四周留出环的宽度,换步时版面不挪 */
|
|
314
|
+
[data-scope='steps'][data-part='indicator'][data-variant='dot'] {
|
|
315
|
+
margin: var(--xh-_steps-indicator-margin);
|
|
316
|
+
border-color: var(--xh-steps-indicator-border, var(--xh-fg-muted));
|
|
317
|
+
background: var(--xh-steps-indicator-bg, transparent);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/* 实心的点底与圈同一色,取自 --xh-_steps-dot:走过的标记色、当前步品牌,按下换语气 active 档
|
|
321
|
+
(与序号圆点当前步按下同一档),动不了的禁用墨色。小圆点上画不下实心那档的内高光 */
|
|
322
|
+
[data-scope='steps'][data-part='indicator'][data-variant='dot'][data-state='completed'] {
|
|
323
|
+
--xh-_steps-dot: var(--xh-steps-indicator-bg-completed, var(--xh-_steps-accent-mark));
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
[data-scope='steps'][data-part='indicator'][data-variant='dot'][data-state='current'] {
|
|
327
|
+
--xh-_steps-dot: var(--xh-steps-indicator-bg-current, var(--xh-_steps-accent));
|
|
328
|
+
|
|
329
|
+
box-shadow: none;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
[data-scope='steps'][data-part='trigger']:not([data-disabled], [data-readonly]):is(:active, [data-pressed])
|
|
333
|
+
[data-scope='steps'][data-part='indicator'][data-variant='dot'] {
|
|
334
|
+
--xh-_steps-dot: var(--xh-steps-indicator-bg-current-pressed, var(--xh-_tone-active, var(--xh-bg-brand-active)));
|
|
335
|
+
|
|
336
|
+
transition-duration: var(--xh-motion-duration-press);
|
|
337
|
+
transition-timing-function: var(--xh-motion-ease-press);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/* 动不了的那几步形状不变、墨色退到禁用档:空心的仍是空心。排在单步语气之前、与它同特指度:
|
|
341
|
+
标了语气又被锁住的那一步与序号形态一样按语气画 */
|
|
342
|
+
[data-scope='steps'][data-part='item'][data-disabled] [data-scope='steps'][data-part='indicator'][data-variant='dot'] {
|
|
343
|
+
--xh-_steps-dot: var(--xh-steps-indicator-bg-disabled, var(--xh-fg-disabled));
|
|
344
|
+
|
|
345
|
+
border-color: var(--xh-steps-indicator-border-disabled, var(--xh-fg-disabled));
|
|
346
|
+
background: transparent;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/* 带上触发器这一层祖先:特指度才压得过上面与下面两条禁用块铺的底 */
|
|
350
|
+
[data-scope='steps'][data-part='trigger'] [data-scope='steps'][data-part='indicator'][data-variant='dot']:not([data-state='incomplete']) {
|
|
351
|
+
border-color: var(--xh-_steps-dot);
|
|
352
|
+
background: var(--xh-_steps-dot);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/* 当前步那圈环:离圆点边一道缝、一道粗描边宽,叠在圆点外面、不接指针;环面由一圈角向渐变经环形遮罩挖空中心得来。
|
|
356
|
+
弧(arc)从 12 点顺时针走到完成比例,其余是轨道(track):点状形态不带比例,轨道与弧同色,就是整圈实心环;
|
|
357
|
+
序号圆点带了比例(data-progress),轨道取连接线的底色,弧就是这一步走了多少。时钟式的走向是稳定身份,不随书写方向镜像。
|
|
358
|
+
静息收着,点状形态的当前步与带比例的当前步才亮出来,走到 / 离开这一步时按状态角色淡入淡出;
|
|
359
|
+
比例变化时弧按数值角色走(move / continuous),首帧直接落位 */
|
|
360
|
+
[data-scope='steps'][data-part='indicator']::after {
|
|
361
|
+
--xh-_steps-ring-arc: var(--xh-steps-indicator-ring-bg, var(--xh-_steps-accent));
|
|
362
|
+
--xh-_steps-ring-track: var(--xh-_steps-ring-arc);
|
|
363
|
+
|
|
364
|
+
content: '';
|
|
365
|
+
position: absolute;
|
|
366
|
+
inset: calc(-1 * (var(--xh-_steps-indicator-border-width) + var(--xh-_steps-ring-gap) + var(--xh-_steps-ring-thickness)));
|
|
367
|
+
border-radius: inherit;
|
|
368
|
+
background: conic-gradient(
|
|
369
|
+
var(--xh-_steps-ring-arc) calc(var(--xh-_steps-progress) * 100%),
|
|
370
|
+
var(--xh-_steps-ring-track) 0%
|
|
371
|
+
);
|
|
372
|
+
-webkit-mask: radial-gradient(farthest-side, transparent calc(100% - var(--xh-_steps-ring-thickness)), currentColor 0);
|
|
373
|
+
mask: radial-gradient(farthest-side, transparent calc(100% - var(--xh-_steps-ring-thickness)), currentColor 0);
|
|
374
|
+
opacity: 0;
|
|
375
|
+
pointer-events: none;
|
|
376
|
+
transition:
|
|
377
|
+
opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
378
|
+
--xh-_steps-progress var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
[data-scope='steps'][data-part='indicator'][data-state='current']:is([data-variant='dot'], [data-progress])::after {
|
|
382
|
+
opacity: 1;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
[data-scope='steps'][data-part='indicator'][data-progress]::after {
|
|
386
|
+
--xh-_steps-ring-track: var(--xh-steps-indicator-ring-track, var(--xh-border-default));
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
[data-scope='steps'][data-part='item'][data-disabled] [data-scope='steps'][data-part='indicator']::after {
|
|
390
|
+
--xh-_steps-ring-arc: var(--xh-steps-indicator-ring-bg-disabled, var(--xh-fg-disabled));
|
|
391
|
+
}
|
|
392
|
+
|
|
263
393
|
/* 单步语气:tones / collection 给某一步标了 data-tone,四个强调槽在这一步重新从语气层取值,
|
|
264
394
|
它的标记、标题与连接线照旧从祖先继承——只有这一步换色,状态那一档照算 */
|
|
265
395
|
[data-scope='steps'][data-part='item'][data-tone] {
|
|
@@ -296,6 +426,8 @@
|
|
|
296
426
|
overflow: hidden;
|
|
297
427
|
white-space: nowrap;
|
|
298
428
|
text-overflow: ellipsis;
|
|
429
|
+
/* 走到这一步、走过这一步时标题换色,与圆点的换面同一段淡变 */
|
|
430
|
+
transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
299
431
|
}
|
|
300
432
|
|
|
301
433
|
[data-scope='steps'][data-part='title']:is([data-state='current'], [data-state='completed']) {
|
|
@@ -318,22 +450,34 @@
|
|
|
318
450
|
text-overflow: ellipsis;
|
|
319
451
|
}
|
|
320
452
|
|
|
321
|
-
/*
|
|
453
|
+
/* 连接线属于它前面那一步:那一步走过了就点亮,进度因此是连续的一条线。点亮的那一层叠在底线上,
|
|
454
|
+
沿行向从这一步填到下一步(数值角色:move / continuous,只动 clip-path),回退时反向收回 */
|
|
322
455
|
[data-scope='steps'][data-part='separator'] {
|
|
456
|
+
position: relative;
|
|
323
457
|
flex: 1;
|
|
324
458
|
min-inline-size: var(--xh-steps-separator-min-length, var(--xh-space-4));
|
|
325
459
|
block-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thick));
|
|
326
460
|
border-radius: var(--xh-steps-separator-radius, var(--xh-shape-pill));
|
|
327
461
|
background: var(--xh-steps-separator-bg, var(--xh-border-default));
|
|
328
|
-
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/* 没走过时把行尾那一侧整段裁掉:inset 的左右两侧乘书写方向符号,ltr 裁右侧、rtl 裁左侧 */
|
|
465
|
+
[data-scope='steps'][data-part='separator']::after {
|
|
466
|
+
content: '';
|
|
467
|
+
position: absolute;
|
|
468
|
+
inset: 0;
|
|
469
|
+
border-radius: inherit;
|
|
470
|
+
background: var(--xh-steps-separator-bg-completed, var(--xh-_steps-accent));
|
|
471
|
+
clip-path: inset(0 calc(50% + 50% * var(--xh-direction-sign)) 0 calc(50% - 50% * var(--xh-direction-sign)));
|
|
472
|
+
transition: clip-path var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
329
473
|
}
|
|
330
474
|
|
|
331
475
|
[data-scope='steps'][data-part='separator'][hidden] {
|
|
332
476
|
display: none;
|
|
333
477
|
}
|
|
334
478
|
|
|
335
|
-
[data-scope='steps'][data-part='separator'][data-state='completed'] {
|
|
336
|
-
|
|
479
|
+
[data-scope='steps'][data-part='separator'][data-state='completed']::after {
|
|
480
|
+
clip-path: inset(0);
|
|
337
481
|
}
|
|
338
482
|
|
|
339
483
|
/* 纵向时连接线转成竖的一条,缩进到与序号圆点同一条竖线上 */
|
|
@@ -342,14 +486,24 @@
|
|
|
342
486
|
inline-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thick));
|
|
343
487
|
min-inline-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thick));
|
|
344
488
|
block-size: var(--xh-steps-separator-min-length, var(--xh-space-7));
|
|
345
|
-
/*
|
|
489
|
+
/* 圆点半径加上它四周留给环的位置,减去线宽的一半:calc 里的除法要写成乘 0.5,除号在这儿是无效语法 */
|
|
346
490
|
margin-inline-start: calc(
|
|
347
491
|
var(--xh-steps-indicator-size, var(--xh-_steps-indicator-size)) * 0.5
|
|
492
|
+
+ var(--xh-_steps-indicator-margin)
|
|
348
493
|
+ var(--xh-steps-trigger-p, var(--xh-control-px-sm))
|
|
349
494
|
- var(--xh-steps-separator-thickness, var(--xh-stroke-thick)) * 0.5
|
|
350
495
|
);
|
|
351
496
|
}
|
|
352
497
|
|
|
498
|
+
/* 纵向时从上往下填:没走过时裁掉下端 */
|
|
499
|
+
[data-scope='steps'][data-part='separator'][data-orientation='vertical']::after {
|
|
500
|
+
clip-path: inset(0 0 100% 0);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
[data-scope='steps'][data-part='separator'][data-orientation='vertical'][data-state='completed']::after {
|
|
504
|
+
clip-path: inset(0);
|
|
505
|
+
}
|
|
506
|
+
|
|
353
507
|
/* 面板刻意不给 display:连接层用 hidden 收起,UA 的 [hidden]{display:none} 压得住,
|
|
354
508
|
不必再拿内联样式去盖 */
|
|
355
509
|
[data-scope='steps'][data-part='content'] {
|
|
@@ -358,8 +512,9 @@
|
|
|
358
512
|
}
|
|
359
513
|
|
|
360
514
|
/* 没写内容就由皮肤画兜底对号;作者往部件里塞了自己的图形,这几条即不命中。
|
|
361
|
-
尺寸读圆点自己改接过的 --xh-icon-size
|
|
362
|
-
|
|
515
|
+
尺寸读圆点自己改接过的 --xh-icon-size:指示符档,随密度换档(见圆点块)。
|
|
516
|
+
点状形态不盛内容,走过的点本身就是标记,不画对号 */
|
|
517
|
+
[data-scope='steps'][data-part='indicator'][data-state='completed']:not([data-variant='dot']):empty::before {
|
|
363
518
|
content: '';
|
|
364
519
|
display: inline-block;
|
|
365
520
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
@@ -370,6 +525,11 @@
|
|
|
370
525
|
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
371
526
|
}
|
|
372
527
|
|
|
528
|
+
/* 走过这一步那一刻:序号撤下、对号淡入,与圆点的换面同一段淡变;首帧就走过的(data-instant)直接呈现 */
|
|
529
|
+
[data-scope='steps'][data-part='indicator'][data-state='completed']:not([data-instant]):empty::before {
|
|
530
|
+
animation: xh-fade-in var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
531
|
+
}
|
|
532
|
+
|
|
373
533
|
@media (forced-colors: active) {
|
|
374
534
|
/* 触发器的悬停 / 按下由家族 forced-colors 块涂成 Highlight / HighlightText;标题与说明各自写了颜色,
|
|
375
535
|
这一档里会被换成 CanvasText 压在高亮底上,悬停与按住时一起跟到反色 */
|
|
@@ -378,8 +538,8 @@
|
|
|
378
538
|
color: HighlightText;
|
|
379
539
|
}
|
|
380
540
|
|
|
381
|
-
[data-scope='steps'][data-part='trigger']:hover:not([data-disabled])
|
|
382
|
-
[data-scope='steps'][data-part='indicator'][data-state='incomplete'] {
|
|
541
|
+
[data-scope='steps'][data-part='trigger']:hover:not([data-disabled], [data-readonly])
|
|
542
|
+
[data-scope='steps'][data-part='indicator'][data-state='incomplete']:not([data-variant='dot']) {
|
|
383
543
|
border-color: Highlight;
|
|
384
544
|
}
|
|
385
545
|
|
|
@@ -389,9 +549,47 @@
|
|
|
389
549
|
background: CanvasText;
|
|
390
550
|
}
|
|
391
551
|
|
|
392
|
-
[data-scope='steps'][data-part='separator']
|
|
552
|
+
[data-scope='steps'][data-part='separator']::after {
|
|
393
553
|
background: Highlight;
|
|
394
554
|
}
|
|
555
|
+
|
|
556
|
+
/* 点状形态的点靠底色画实心,这一档里底色被换成 Canvas,走过与当前步的点会与空心的圈混成一样。
|
|
557
|
+
实心的点与当前步那圈环换成 CanvasText:整行悬停涂成 Highlight 时照样看得见,走过与当前步靠那圈环分开;
|
|
558
|
+
动不了的取 GrayText */
|
|
559
|
+
[data-scope='steps'][data-part='trigger'] [data-scope='steps'][data-part='indicator'][data-variant='dot']:not([data-state='incomplete']) {
|
|
560
|
+
border-color: CanvasText;
|
|
561
|
+
background: CanvasText;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
[data-scope='steps'][data-part='item'][data-disabled] [data-scope='steps'][data-part='indicator'][data-variant='dot'] {
|
|
565
|
+
border-color: GrayText;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
[data-scope='steps'][data-part='item'][data-disabled]
|
|
569
|
+
[data-scope='steps'][data-part='trigger'] [data-scope='steps'][data-part='indicator'][data-variant='dot']:not([data-state='incomplete']) {
|
|
570
|
+
background: GrayText;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
/* 环是一层角向渐变,这一档里渐变会被当作背景图丢掉:环自己不让系统接管配色,弧与轨道改取系统色——
|
|
574
|
+
弧 CanvasText、进度环的轨道 GrayText(两者分得开,才读得出走了多少);动不了的弧 GrayText,
|
|
575
|
+
轨道退到 Canvas,免得与弧同色读不出比例 */
|
|
576
|
+
[data-scope='steps'][data-part='indicator']::after {
|
|
577
|
+
--xh-_steps-ring-arc: CanvasText;
|
|
578
|
+
|
|
579
|
+
forced-color-adjust: none;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
[data-scope='steps'][data-part='indicator'][data-progress]::after {
|
|
583
|
+
--xh-_steps-ring-track: GrayText;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
[data-scope='steps'][data-part='item'][data-disabled] [data-scope='steps'][data-part='indicator']::after {
|
|
587
|
+
--xh-_steps-ring-arc: GrayText;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
[data-scope='steps'][data-part='item'][data-disabled] [data-scope='steps'][data-part='indicator'][data-progress]::after {
|
|
591
|
+
--xh-_steps-ring-track: Canvas;
|
|
592
|
+
}
|
|
395
593
|
}
|
|
396
594
|
|
|
397
595
|
@media print {
|
|
@@ -404,5 +602,26 @@
|
|
|
404
602
|
[data-scope='steps'][data-part='title'][data-state='current'] {
|
|
405
603
|
font-weight: var(--xh-font-weight-semibold);
|
|
406
604
|
}
|
|
605
|
+
|
|
606
|
+
/* 点状形态的点与当前步那圈环都是底色画的,丢了底色走过与当前步就只剩空心圈:这两样照原色印 */
|
|
607
|
+
[data-scope='steps'][data-part='indicator'][data-variant='dot'],
|
|
608
|
+
[data-scope='steps'][data-part='indicator']::after {
|
|
609
|
+
print-color-adjust: exact;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
@media (forced-colors: active) {
|
|
614
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
615
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
616
|
+
落在勾选盒自己的实心面上(这一档里是 Canvas),整行悬停不换面,取 CanvasText;
|
|
617
|
+
禁用取 GrayText */
|
|
618
|
+
[data-scope='steps'][data-part='indicator'][data-state='completed']:not([data-variant='dot']):empty::before {
|
|
619
|
+
forced-color-adjust: none;
|
|
620
|
+
background-color: CanvasText;
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
[data-scope='steps'][data-part='item'][data-disabled] [data-scope='steps'][data-part='indicator'][data-state='completed']:not([data-variant='dot']):empty::before {
|
|
624
|
+
background-color: GrayText;
|
|
625
|
+
}
|
|
407
626
|
}
|
|
408
627
|
}
|
package/css/switch.css
CHANGED
|
@@ -5,16 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
/* 定义 switch 样式。 */
|
|
7
7
|
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
8
10
|
@import '../family/action-control.css';
|
|
9
|
-
|
|
10
|
-
@layer xihan.motion {
|
|
11
|
-
/* 转圈的关键帧定义在本文件里:引用别处文件的动画名时那份文件不一定在场,动画会静默不跑 */
|
|
12
|
-
@keyframes xh-switch-rotate {
|
|
13
|
-
to {
|
|
14
|
-
transform: rotate(1turn);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
11
|
+
@import '../family/loading-ring.css';
|
|
18
12
|
|
|
19
13
|
@layer xihan.components {
|
|
20
14
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -180,18 +174,22 @@
|
|
|
180
174
|
line-height: 0;
|
|
181
175
|
/* 状态切换只动位移与表面,按压拉伸另走 inline-size;不使用 transition-all。 */
|
|
182
176
|
transition:
|
|
183
|
-
translate var(--xh-motion-duration-
|
|
184
|
-
inline-size var(--xh-motion-duration-
|
|
177
|
+
translate var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous),
|
|
178
|
+
inline-size var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous),
|
|
185
179
|
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
186
180
|
}
|
|
187
181
|
|
|
182
|
+
/* flex 的 inline-start 随书写方向翻转,物理 translate 乘方向符号跟着反向,checked 才始终走到 inline-end;
|
|
183
|
+
符号按就近的 dir 继承,rtl 页面里局部写回 ltr 的开关照 ltr 走 */
|
|
188
184
|
[data-scope='switch'][data-part='thumb'][data-state='checked'] {
|
|
189
|
-
translate: var(--xh-_switch-thumb-size) 0;
|
|
185
|
+
translate: calc(var(--xh-direction-sign) * var(--xh-_switch-thumb-size)) 0;
|
|
190
186
|
}
|
|
191
187
|
|
|
192
|
-
/*
|
|
193
|
-
[
|
|
194
|
-
|
|
188
|
+
/* 拖动与松手落定期间位移由连接层逐帧写进内联 translate,位移不能再叠一层过渡;按住拉长与投影照常过渡 */
|
|
189
|
+
[data-scope='switch'][data-part='thumb']:is([data-dragging], [data-animating]) {
|
|
190
|
+
transition:
|
|
191
|
+
inline-size var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous),
|
|
192
|
+
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
195
193
|
}
|
|
196
194
|
|
|
197
195
|
/* Naive 同类的橡皮带回执:按住时向行进方向拉长并压平投影,已选中端同步回退同一段,外缘不越出轨道。 */
|
|
@@ -203,13 +201,7 @@
|
|
|
203
201
|
|
|
204
202
|
[data-scope='switch'][data-part='root'][data-state='checked']:not([data-disabled]):not([data-readonly]):not([data-loading]):is(:active, [data-pressed])
|
|
205
203
|
[data-scope='switch'][data-part='thumb'] {
|
|
206
|
-
translate: calc(var(--xh-_switch-thumb-size) - var(--xh-_switch-thumb-press-stretch)) 0;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
[dir='rtl']
|
|
210
|
-
[data-scope='switch'][data-part='root'][data-state='checked']:not([data-disabled]):not([data-readonly]):not([data-loading]):is(:active, [data-pressed])
|
|
211
|
-
[data-scope='switch'][data-part='thumb'] {
|
|
212
|
-
translate: calc(-1 * (var(--xh-_switch-thumb-size) - var(--xh-_switch-thumb-press-stretch))) 0;
|
|
204
|
+
translate: calc(var(--xh-direction-sign) * (var(--xh-_switch-thumb-size) - var(--xh-_switch-thumb-press-stretch))) 0;
|
|
213
205
|
}
|
|
214
206
|
|
|
215
207
|
/* 禁用滑块收掉抬起影、前景置灰;描边与底保持,滑块仍是一块读得出位置的实体 */
|
|
@@ -227,15 +219,18 @@
|
|
|
227
219
|
--xh-action-cursor-focus-visible: progress;
|
|
228
220
|
}
|
|
229
221
|
|
|
230
|
-
|
|
222
|
+
/* 滑块里那枚环由加载环配方画在 ::before 上(连接层投影 data-xh-loading-ring),随 data-loading 淡入淡出、
|
|
223
|
+
转与停;起始边取强调色、转速认使用者槽。环叠在滑块正中那一格,不挤开作者放进滑块的图形 */
|
|
224
|
+
[data-scope='switch'][data-part='thumb'] {
|
|
225
|
+
--xh-_loading-ring-fg: var(--xh-switch-loading-fg, var(--xh-_switch-accent));
|
|
226
|
+
--xh-_loading-ring-duration: var(--xh-switch-loading-duration, var(--xh-motion-loop-spin));
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
[data-scope='switch'][data-part='thumb']::before {
|
|
231
230
|
content: '';
|
|
231
|
+
grid-area: 1 / 1;
|
|
232
232
|
inline-size: 60%;
|
|
233
233
|
block-size: 60%;
|
|
234
|
-
border: var(--xh-stroke-thin) solid transparent;
|
|
235
|
-
border-block-start-color: var(--xh-switch-loading-fg, var(--xh-_switch-accent));
|
|
236
|
-
/* 加载环是等宽高的圆(全部加载环取 circle) */
|
|
237
|
-
border-radius: var(--xh-shape-circle);
|
|
238
|
-
animation: xh-switch-rotate var(--xh-switch-loading-duration, var(--xh-spin-duration)) var(--xh-motion-ease-loop) infinite;
|
|
239
234
|
}
|
|
240
235
|
|
|
241
236
|
/* —— 带文字的整行:<label> 包住控件与文字,与 checkbox 的标签、checkbox-group 的条目同一副样子 ——
|
|
@@ -291,23 +286,12 @@
|
|
|
291
286
|
[data-scope='switch'][data-part='root'] {
|
|
292
287
|
--xh-_switch-thumb-press-stretch: var(--xh-motion-distance-sm);
|
|
293
288
|
}
|
|
294
|
-
|
|
295
|
-
[data-scope='switch'][data-part='thumb'][data-loading]::after {
|
|
296
|
-
border-style: dotted;
|
|
297
|
-
border-color: var(--xh-switch-loading-fg, var(--xh-_switch-accent));
|
|
298
|
-
animation: none;
|
|
299
|
-
}
|
|
300
289
|
}
|
|
301
290
|
|
|
302
291
|
:where([data-motion='reduce']) [data-scope='switch'][data-part='root'] {
|
|
303
292
|
--xh-_switch-thumb-press-stretch: var(--xh-motion-distance-sm);
|
|
304
293
|
}
|
|
305
294
|
|
|
306
|
-
:where([data-motion='reduce']) [data-scope='switch'][data-part='thumb'][data-loading]::after {
|
|
307
|
-
border-style: dotted;
|
|
308
|
-
border-color: var(--xh-switch-loading-fg, var(--xh-_switch-accent));
|
|
309
|
-
animation: none;
|
|
310
|
-
}
|
|
311
295
|
|
|
312
296
|
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
313
297
|
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
@@ -363,14 +347,5 @@
|
|
|
363
347
|
box-shadow: none;
|
|
364
348
|
}
|
|
365
349
|
|
|
366
|
-
/* 打印:动画会被定格在任意一帧——转了一半的圈、扫到一半的微光。这里换成静止的表达,
|
|
367
|
-
取值与减弱动效那一档相同。两档各写一块、不并进一条媒体查询列表:减弱动效另有一份
|
|
368
|
-
:where([data-motion='reduce']) 的钩子版本与它成对,打印没有对应的钩子可配,
|
|
369
|
-
并成一条之后这层配对关系在文本上就断了。 */
|
|
370
|
-
[data-scope='switch'][data-part='thumb'][data-loading]::after {
|
|
371
|
-
border-style: dotted;
|
|
372
|
-
border-color: var(--xh-switch-loading-fg, var(--xh-_switch-accent));
|
|
373
|
-
animation: none;
|
|
374
|
-
}
|
|
375
350
|
}
|
|
376
351
|
}
|