@xihan-ui/styles 3.1.0 → 3.2.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 +29 -0
- package/component-tokens.d.ts +1 -0
- package/components.tokens.json +32 -2
- package/css/alert.css +2 -2
- package/css/approval.css +4 -4
- package/css/button.css +9 -5
- package/css/calendar-picker.css +3 -3
- package/css/calendar-range-picker.css +7 -7
- package/css/carousel.css +45 -13
- package/css/cartesian-chart.css +11 -11
- package/css/cascader.css +10 -10
- package/css/citation.css +2 -2
- package/css/code-view.css +6 -6
- package/css/color-swatch-picker.css +9 -4
- package/css/combobox.css +12 -4
- package/css/command.css +1 -1
- package/css/date-field.css +8 -2
- package/css/date-picker.css +13 -7
- package/css/date-range-picker.css +13 -7
- package/css/diff-view.css +8 -8
- package/css/field-array.css +1 -1
- package/css/file-upload.css +1 -1
- package/css/float-button.css +42 -27
- package/css/form.css +6 -6
- package/css/graph-chart.css +2 -2
- package/css/highlight.css +1 -1
- package/css/image.css +1 -1
- package/css/mention.css +1 -1
- package/css/message-feed.css +1 -1
- package/css/notification.css +18 -18
- package/css/number-field.css +18 -18
- package/css/page-header.css +2 -2
- package/css/password-input.css +2 -2
- package/css/popconfirm.css +3 -3
- package/css/question-flow.css +8 -8
- package/css/radar-chart.css +6 -6
- package/css/rating.css +1 -1
- package/css/select.css +2 -2
- package/css/separator.css +2 -2
- package/css/side-nav.css +13 -13
- package/css/skeleton.css +5 -5
- package/css/slider.css +6 -6
- package/css/sortable.css +2 -2
- package/css/table.css +2 -2
- package/css/tags-input.css +1 -1
- package/css/tool-call.css +7 -7
- package/css/tooltip.css +1 -1
- package/css/tree-select.css +2 -2
- package/dist/css/accordion.css +269 -0
- package/dist/css/affix.css +47 -0
- package/dist/css/alert.css +247 -0
- package/dist/css/anchor.css +252 -0
- package/dist/css/approval.css +501 -0
- package/dist/css/avatar-group.css +99 -0
- package/dist/css/avatar.css +98 -0
- package/dist/css/back-top.css +161 -0
- package/dist/css/badge.css +205 -0
- package/dist/css/bar-code.css +62 -0
- package/dist/css/breadcrumb.css +230 -0
- package/dist/css/button-group.css +263 -0
- package/dist/css/button.css +219 -0
- package/dist/css/calendar-picker.css +467 -0
- package/dist/css/calendar-range-picker.css +554 -0
- package/dist/css/card.css +221 -0
- package/dist/css/carousel.css +710 -0
- package/dist/css/cartesian-chart.css +830 -0
- package/dist/css/cascader.css +961 -0
- package/dist/css/checkbox-group.css +358 -0
- package/dist/css/checkbox.css +257 -0
- package/dist/css/citation.css +470 -0
- package/dist/css/clipboard.css +315 -0
- package/dist/css/code-view.css +374 -0
- package/dist/css/collapsible.css +185 -0
- package/dist/css/color-field.css +176 -0
- package/dist/css/color-picker.css +595 -0
- package/dist/css/color-slider.css +281 -0
- package/dist/css/color-swatch-picker.css +250 -0
- package/dist/css/color-swatch.css +35 -0
- package/dist/css/combobox.css +574 -0
- package/dist/css/command.css +399 -0
- package/dist/css/context-menu.css +420 -0
- package/dist/css/date-field.css +317 -0
- package/dist/css/date-picker.css +868 -0
- package/dist/css/date-range-picker.css +886 -0
- package/dist/css/description.css +67 -0
- package/dist/css/descriptions.css +299 -0
- package/dist/css/dialog.css +455 -0
- package/dist/css/diff-view.css +513 -0
- package/dist/css/download-trigger.css +151 -0
- package/dist/css/drawer.css +552 -0
- package/dist/css/editable.css +295 -0
- package/dist/css/empty-state.css +163 -0
- package/dist/css/field-array.css +226 -0
- package/dist/css/field.css +166 -0
- package/dist/css/fieldset.css +102 -0
- package/dist/css/file-upload.css +429 -0
- package/dist/css/flex.css +441 -0
- package/dist/css/float-button.css +569 -0
- package/dist/css/floating-panel.css +429 -0
- package/dist/css/focus.css +46 -0
- package/dist/css/forced-colors.css +93 -0
- package/dist/css/form.css +393 -0
- package/dist/css/funnel-chart.css +106 -0
- package/dist/css/graph-chart.css +205 -0
- package/dist/css/grid-list.css +235 -0
- package/dist/css/grid.css +1201 -0
- package/dist/css/heatmap.css +552 -0
- package/dist/css/hierarchy-chart.css +298 -0
- package/dist/css/highlight.css +41 -0
- package/dist/css/hover-card.css +226 -0
- package/dist/css/icon.css +225 -0
- package/dist/css/image-cropper.css +373 -0
- package/dist/css/image-viewer.css +538 -0
- package/dist/css/image.css +98 -0
- package/dist/css/infinite-scroll.css +77 -0
- package/dist/css/input-group.css +275 -0
- package/dist/css/json-viewer.css +379 -0
- package/dist/css/kbd.css +72 -0
- package/dist/css/label.css +78 -0
- package/dist/css/layers.css +7 -0
- package/dist/css/layout.css +372 -0
- package/dist/css/liquid.css +106 -0
- package/dist/css/list.css +152 -0
- package/dist/css/listbox.css +390 -0
- package/dist/css/loading-bar.css +141 -0
- package/dist/css/log.css +306 -0
- package/dist/css/markdown-stream.css +149 -0
- package/dist/css/marquee.css +378 -0
- package/dist/css/masonry.css +70 -0
- package/dist/css/matrix-code.css +67 -0
- package/dist/css/mention.css +393 -0
- package/dist/css/menu.css +364 -0
- package/dist/css/menubar.css +456 -0
- package/dist/css/message-feed.css +318 -0
- package/dist/css/navigation-menu.css +513 -0
- package/dist/css/notification.css +782 -0
- package/dist/css/number-animation.css +44 -0
- package/dist/css/number-field.css +252 -0
- package/dist/css/overlay-arrow.css +56 -0
- package/dist/css/page-header.css +184 -0
- package/dist/css/pagination.css +450 -0
- package/dist/css/password-input.css +391 -0
- package/dist/css/pie-chart.css +247 -0
- package/dist/css/pin-input.css +199 -0
- package/dist/css/pointer.css +36 -0
- package/dist/css/popconfirm.css +320 -0
- package/dist/css/popover.css +279 -0
- package/dist/css/progress.css +501 -0
- package/dist/css/prompt-input.css +260 -0
- package/dist/css/question-flow.css +553 -0
- package/dist/css/radar-chart.css +233 -0
- package/dist/css/radio-group.css +598 -0
- package/dist/css/rating.css +294 -0
- package/dist/css/reasoning.css +343 -0
- package/dist/css/reset.css +117 -0
- package/dist/css/resizable.css +242 -0
- package/dist/css/sankey-chart.css +174 -0
- package/dist/css/scroll-area.css +240 -0
- package/dist/css/scrollbar.css +204 -0
- package/dist/css/select.css +612 -0
- package/dist/css/separator.css +122 -0
- package/dist/css/side-nav.css +476 -0
- package/dist/css/signature-pad.css +179 -0
- package/dist/css/skeleton.css +161 -0
- package/dist/css/slider.css +374 -0
- package/dist/css/sortable.css +228 -0
- package/dist/css/sparkline.css +164 -0
- package/dist/css/spinner.css +236 -0
- package/dist/css/splitter.css +159 -0
- package/dist/css/statistic.css +137 -0
- package/dist/css/steps.css +627 -0
- package/dist/css/switch.css +351 -0
- package/dist/css/table.css +1145 -0
- package/dist/css/tabs.css +944 -0
- package/dist/css/tag-group.css +247 -0
- package/dist/css/tag.css +310 -0
- package/dist/css/tags-input.css +322 -0
- package/dist/css/text-field.css +197 -0
- package/dist/css/time-field.css +277 -0
- package/dist/css/time-picker.css +707 -0
- package/dist/css/time-range-picker.css +746 -0
- package/dist/css/timeline.css +423 -0
- package/dist/css/timer.css +123 -0
- package/dist/css/timestamp.css +34 -0
- package/dist/css/toggle-group.css +424 -0
- package/dist/css/toggle.css +146 -0
- package/dist/css/tone.css +189 -0
- package/dist/css/tool-call.css +429 -0
- package/dist/css/toolbar.css +365 -0
- package/dist/css/tooltip.css +218 -0
- package/dist/css/tour.css +439 -0
- package/dist/css/transfer.css +638 -0
- package/dist/css/tree-select.css +878 -0
- package/dist/css/tree.css +733 -0
- package/dist/css/truncate.css +108 -0
- package/dist/css/typography.css +472 -0
- package/dist/css/undefined.css +58 -0
- package/dist/css/virtualizer.css +166 -0
- package/dist/css/visually-hidden.css +20 -0
- package/dist/css/watermark.css +82 -0
- package/dist/family/action-control.css +487 -0
- package/dist/family/chart.css +480 -0
- package/dist/family/check-mark.css +94 -0
- package/dist/family/choice-card.css +97 -0
- package/dist/family/collection-item.css +764 -0
- package/dist/family/field-chrome.css +287 -0
- package/dist/family/loading-ring.css +95 -0
- package/dist/family/material.css +72 -0
- package/dist/family/menu-choice.css +56 -0
- package/dist/family/motion.css +363 -0
- package/dist/family/swatch.css +59 -0
- package/dist/family/tag-list.css +59 -0
- package/family/action-control.css +3 -12
- package/index.css +6882 -6809
- package/index.unlayered.css +6884 -6811
- package/package.json +165 -164
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* 定义 switch 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
10
|
+
@import '../family/action-control.css';
|
|
11
|
+
@import '../family/loading-ring.css';
|
|
12
|
+
|
|
13
|
+
@layer xihan.components {
|
|
14
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
15
|
+
.xh-scope-switch {
|
|
16
|
+
--xh-switch-skin: 1;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.xh-scope-switch[data-part='root'] {
|
|
20
|
+
/* 尺寸档只换轨道高度这一个私有槽,其余几何都从它算出来:
|
|
21
|
+
滑块边长 = 轨道高 − 两条留白,轨道宽 = 两倍轨道高 − 两条留白,滑块行程因此正好等于自身边长 */
|
|
22
|
+
--xh-_switch-track-h: var(--xh-switch-track-h-md);
|
|
23
|
+
--xh-_switch-pad: var(--xh-space-0_5);
|
|
24
|
+
--xh-_switch-thumb-size: calc(var(--xh-_switch-track-h) - var(--xh-_switch-pad) * 2);
|
|
25
|
+
--xh-_switch-thumb-press-stretch: var(--xh-switch-thumb-press-stretch, var(--xh-motion-distance-sm));
|
|
26
|
+
|
|
27
|
+
/* 选中态轨道色随语气走。没写 data-tone 时 --xh-_tone 没被声明,退回原来的品牌色 */
|
|
28
|
+
--xh-_switch-accent: var(--xh-_tone, var(--xh-bg-brand));
|
|
29
|
+
/* 轨道边界以内描边表达,不吃掉滑块行程;checked / readonly / invalid / disabled 只换这一支色。 */
|
|
30
|
+
--xh-_switch-track-border: var(--xh-switch-border, var(--xh-border-control));
|
|
31
|
+
/* 轨道的面:未选中是 --xh-bg-subtle-active(300)的实体字段控件面;checked / readonly / disabled 换这一支。
|
|
32
|
+
静息已是 300,中性阶梯再无更深一档可换:按下的底缺省仍是轨道静息面(使用者可经 --xh-switch-bg-pressed
|
|
33
|
+
另给),换面的通道由下面滑块的橡皮带拉伸与压平投影承担;选中轨道按下换到语气的 active 档 */
|
|
34
|
+
--xh-_switch-track-bg: var(--xh-switch-bg, var(--xh-bg-subtle-active));
|
|
35
|
+
--xh-_switch-track-bg-pressed: var(--xh-switch-bg-pressed, var(--xh-_switch-track-bg));
|
|
36
|
+
--xh-_switch-fg: var(--xh-switch-fg, var(--xh-fg-default));
|
|
37
|
+
|
|
38
|
+
/* 轨道接 Action Control text 档(定尺轨道):悬停 / 按下 / 禁用面、0.97 缩放与换底、粗指针热区、
|
|
39
|
+
焦点环与过渡由家族配方给,这里只把轨道的私有槽映射到桥接槽。轨道没有实描边(边界以内描边画,不吃行程),
|
|
40
|
+
边位映射 transparent 并把 border 宽度归零;内描边经 shadow 通道各态同一支。悬停不换面(阶梯只给按下) */
|
|
41
|
+
--xh-action-visual-size: var(--xh-_switch-track-h);
|
|
42
|
+
--xh-action-min-inline-size: calc(var(--xh-_switch-track-h) * 2 - var(--xh-_switch-pad) * 2);
|
|
43
|
+
--xh-action-padding-inline: var(--xh-_switch-pad);
|
|
44
|
+
--xh-action-gap: 0;
|
|
45
|
+
--xh-action-radius: var(--xh-switch-radius, var(--xh-shape-pill));
|
|
46
|
+
--xh-action-bg-rest: var(--xh-_switch-track-bg);
|
|
47
|
+
--xh-action-bg-hover: var(--xh-_switch-track-bg);
|
|
48
|
+
--xh-action-bg-pressed: var(--xh-_switch-track-bg-pressed);
|
|
49
|
+
--xh-action-bg-focus-visible: var(--xh-_switch-track-bg);
|
|
50
|
+
--xh-action-bg-disabled: var(--xh-_switch-track-bg);
|
|
51
|
+
--xh-action-border-rest: transparent;
|
|
52
|
+
--xh-action-border-hover: transparent;
|
|
53
|
+
--xh-action-border-pressed: transparent;
|
|
54
|
+
--xh-action-border-focus-visible: transparent;
|
|
55
|
+
--xh-action-border-disabled: transparent;
|
|
56
|
+
--xh-action-fg-rest: var(--xh-_switch-fg);
|
|
57
|
+
--xh-action-fg-hover: var(--xh-_switch-fg);
|
|
58
|
+
--xh-action-fg-pressed: var(--xh-_switch-fg);
|
|
59
|
+
--xh-action-fg-focus-visible: var(--xh-_switch-fg);
|
|
60
|
+
--xh-action-fg-disabled: var(--xh-_switch-fg);
|
|
61
|
+
--xh-action-shadow-rest: inset 0 0 0 var(--xh-stroke-thin) var(--xh-_switch-track-border);
|
|
62
|
+
--xh-action-shadow-hover: inset 0 0 0 var(--xh-stroke-thin) var(--xh-_switch-track-border);
|
|
63
|
+
--xh-action-shadow-pressed: inset 0 0 0 var(--xh-stroke-thin) var(--xh-_switch-track-border);
|
|
64
|
+
--xh-action-shadow-focus-visible: inset 0 0 0 var(--xh-stroke-thin) var(--xh-_switch-track-border);
|
|
65
|
+
--xh-action-shadow-disabled: inset 0 0 0 var(--xh-stroke-thin) var(--xh-_switch-track-border);
|
|
66
|
+
/* 内收环压在实体轨道上,直接取轨道的配对前景:未选中与只读 checked 的中性轨道配 fg-default,
|
|
67
|
+
选中的语气轨道配它的 on 色 */
|
|
68
|
+
--xh-action-ring-color-focus-visible: currentColor;
|
|
69
|
+
|
|
70
|
+
/* 滑块贴 inline-start 起步,checked 才位移到另一端;家族的居中排布在轨道上不成立 */
|
|
71
|
+
justify-content: start;
|
|
72
|
+
inline-size: calc(var(--xh-_switch-track-h) * 2 - var(--xh-_switch-pad) * 2);
|
|
73
|
+
padding: var(--xh-_switch-pad);
|
|
74
|
+
border-width: 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.xh-scope-switch[data-part='root'][data-state='checked'] {
|
|
78
|
+
--xh-_switch-track-border: var(--xh-switch-border-checked, var(--xh-_switch-accent));
|
|
79
|
+
--xh-_switch-track-bg: var(--xh-switch-bg-checked, var(--xh-_switch-accent));
|
|
80
|
+
--xh-_switch-track-bg-pressed: var(--xh-switch-bg-checked-pressed, var(--xh-_tone-active, var(--xh-bg-brand-active)));
|
|
81
|
+
--xh-_switch-fg: var(--xh-switch-fg-checked, var(--xh-_tone-on, var(--xh-fg-on-brand)));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* 只读:值仍要读得清、也仍会随表单提交,所以不压对比度、也不借禁用那档灰。
|
|
85
|
+
变的是"动不动得了":指针不摆手型、按下不缩放不换底(家族的按压块由这里的映射钉回静息面),
|
|
86
|
+
选中档的轨道退回未选中那一档的中性底(交互态的底只从语义面派生),
|
|
87
|
+
滑块收掉那层抬起的投影——投影是"这颗按得动"的信号。与文本框只读那一档同口径(压低底色而非置灰)。
|
|
88
|
+
滑块停在哪一端不受影响,值本身仍由位置这条非颜色通道读出。 */
|
|
89
|
+
.xh-scope-switch[data-part='root'][data-readonly]:not([data-disabled]) {
|
|
90
|
+
--xh-_switch-track-bg-pressed: var(--xh-_switch-track-bg);
|
|
91
|
+
--xh-action-scale-pressed: none;
|
|
92
|
+
--xh-action-cursor-rest: default;
|
|
93
|
+
--xh-action-cursor-hover: default;
|
|
94
|
+
--xh-action-cursor-pressed: default;
|
|
95
|
+
--xh-action-cursor-focus-visible: default;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.xh-scope-switch[data-part='root'][data-readonly][data-state='checked'] {
|
|
99
|
+
--xh-_switch-track-border: var(--xh-switch-border-checked-readonly, var(--xh-border-control));
|
|
100
|
+
--xh-_switch-track-bg: var(--xh-switch-bg-checked-readonly, var(--xh-bg-subtle-active));
|
|
101
|
+
--xh-_switch-fg: var(--xh-switch-fg-checked-readonly, var(--xh-fg-default));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* 高对比轴把中性状态的边界提到 strong;实心语气色 checked 仍由自己的色相边界表达。 */
|
|
105
|
+
:where([data-contrast='more']) .xh-scope-switch[data-part='root'][data-state='unchecked'] {
|
|
106
|
+
--xh-_switch-track-border: var(--xh-switch-border, var(--xh-border-strong));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
:where([data-contrast='more'])
|
|
110
|
+
.xh-scope-switch[data-part='root'][data-readonly][data-state='checked'] {
|
|
111
|
+
--xh-_switch-track-border: var(--xh-switch-border-checked-readonly, var(--xh-border-strong));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* 校验失败排在状态与对比轴之后:只把轨道内描边换成警示色,不改轨道几何。 */
|
|
115
|
+
.xh-scope-switch[data-part='root'][data-invalid] {
|
|
116
|
+
--xh-_switch-track-border: var(--xh-switch-border-invalid, var(--xh-border-invalid));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.xh-scope-switch[data-part='root'][data-readonly] .xh-scope-switch[data-part='thumb'] {
|
|
120
|
+
box-shadow: var(--xh-switch-thumb-shadow-readonly, none);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* 禁用:不靠 opacity——轨道退回 --xh-bg-subtle 底 + --xh-border-default 内描边,滑块前景置灰;
|
|
124
|
+
选中的禁用轨道同样退回中性面,值由滑块位置读出。面与手型由家族的禁用块按映射给 */
|
|
125
|
+
.xh-scope-switch[data-part='root'][data-disabled] {
|
|
126
|
+
--xh-_switch-track-border: var(--xh-switch-border-disabled, var(--xh-border-default));
|
|
127
|
+
--xh-_switch-track-bg: var(--xh-switch-bg-disabled, var(--xh-bg-subtle));
|
|
128
|
+
--xh-_switch-fg: var(--xh-switch-fg-disabled, var(--xh-fg-disabled));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* —— 尺寸 —— */
|
|
132
|
+
/* 缺省档写在上面的基础规则里 */
|
|
133
|
+
.xh-scope-switch[data-part='root'][data-size='sm'] {
|
|
134
|
+
--xh-_switch-track-h: var(--xh-switch-track-h-sm);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.xh-scope-switch[data-part='root'][data-size='lg'] {
|
|
138
|
+
--xh-_switch-track-h: var(--xh-switch-track-h-lg);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* 鼠标落点:轨道只有二十来个像素高,命中区靠一枚绝对定位的伪元素往外扩,
|
|
142
|
+
轨道本身一动不动——把轨道加高会改掉整条开关的比例。常态外扩 4px,最矮的 sm 档由 18px 到 26px。 */
|
|
143
|
+
.xh-scope-switch[data-part='root']::after {
|
|
144
|
+
content: '';
|
|
145
|
+
position: absolute;
|
|
146
|
+
inset: calc(-1 * var(--xh-space-1));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* 粗指针:家族 text 档的 ::after 把块轴补到 44px、铺满轨道宽并以 -50% 平移居中,行内轴(md 40px)
|
|
150
|
+
这里再补到 44px。起点必须交还家族的 50%:上面那条 inset 负值特指度更高,留着的话盒的左上角
|
|
151
|
+
被钉在 -4px、再被家族的平移拉走半个盒,热区的中心落到轨道左上角外面,右半条开关摸不着 */
|
|
152
|
+
@media (pointer: coarse) {
|
|
153
|
+
.xh-scope-switch[data-part='root']::after {
|
|
154
|
+
inset-block: 50% auto;
|
|
155
|
+
inset-inline: 50% auto;
|
|
156
|
+
min-inline-size: 44px;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* 滑块是 raised 抬起面(可拖起部件,逐部件登记):--xh-bg-surface-raised 底 + --xh-border-default 描边 +
|
|
161
|
+
--xh-elevation-raised 影,无顶光;描边必须在,影只是加成 */
|
|
162
|
+
.xh-scope-switch[data-part='thumb'] {
|
|
163
|
+
position: relative;
|
|
164
|
+
display: grid;
|
|
165
|
+
flex: none;
|
|
166
|
+
place-items: center;
|
|
167
|
+
inline-size: var(--xh-_switch-thumb-size);
|
|
168
|
+
block-size: var(--xh-_switch-thumb-size);
|
|
169
|
+
border: var(--xh-stroke-thin) solid var(--xh-switch-thumb-border, var(--xh-border-default));
|
|
170
|
+
border-radius: var(--xh-switch-thumb-radius, var(--xh-shape-circle));
|
|
171
|
+
background: var(--xh-switch-thumb, var(--xh-bg-surface-raised));
|
|
172
|
+
color: var(--xh-switch-thumb-fg, var(--xh-fg-default));
|
|
173
|
+
box-shadow: var(--xh-switch-thumb-shadow, var(--xh-elevation-raised));
|
|
174
|
+
line-height: 0;
|
|
175
|
+
/* 状态切换只动位移与表面,按压拉伸另走 inline-size;不使用 transition-all。 */
|
|
176
|
+
transition:
|
|
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),
|
|
179
|
+
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* flex 的 inline-start 随书写方向翻转,物理 translate 乘方向符号跟着反向,checked 才始终走到 inline-end;
|
|
183
|
+
符号按就近的 dir 继承,rtl 页面里局部写回 ltr 的开关照 ltr 走 */
|
|
184
|
+
.xh-scope-switch[data-part='thumb'][data-state='checked'] {
|
|
185
|
+
translate: calc(var(--xh-direction-sign) * var(--xh-_switch-thumb-size)) 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* 拖动与松手落定期间位移由连接层逐帧写进内联 translate,位移不能再叠一层过渡;按住拉长与投影照常过渡 */
|
|
189
|
+
.xh-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);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* Naive 同类的橡皮带回执:按住时向行进方向拉长并压平投影,已选中端同步回退同一段,外缘不越出轨道。 */
|
|
196
|
+
.xh-scope-switch[data-part='root']:not([data-disabled]):not([data-readonly]):not([data-loading]):is(:active, [data-pressed])
|
|
197
|
+
.xh-scope-switch[data-part='thumb'] {
|
|
198
|
+
inline-size: calc(var(--xh-_switch-thumb-size) + var(--xh-_switch-thumb-press-stretch));
|
|
199
|
+
box-shadow: var(--xh-switch-thumb-shadow-pressed, none);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.xh-scope-switch[data-part='root'][data-state='checked']:not([data-disabled]):not([data-readonly]):not([data-loading]):is(:active, [data-pressed])
|
|
203
|
+
.xh-scope-switch[data-part='thumb'] {
|
|
204
|
+
translate: calc(var(--xh-direction-sign) * (var(--xh-_switch-thumb-size) - var(--xh-_switch-thumb-press-stretch))) 0;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* 禁用滑块收掉抬起影、前景置灰;描边与底保持,滑块仍是一块读得出位置的实体 */
|
|
208
|
+
.xh-scope-switch[data-part='root'][data-disabled] .xh-scope-switch[data-part='thumb'] {
|
|
209
|
+
color: var(--xh-switch-thumb-fg-disabled, var(--xh-fg-disabled));
|
|
210
|
+
box-shadow: var(--xh-switch-thumb-shadow-disabled, none);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/* 提交中:指针摆「在途」、滑块里转圈;不是禁用,焦点与对比度都保持。
|
|
214
|
+
家族按压块已排除 data-loading,这里只换各态手型 */
|
|
215
|
+
.xh-scope-switch[data-part='root'][data-loading]:not([data-disabled]) {
|
|
216
|
+
--xh-action-cursor-rest: progress;
|
|
217
|
+
--xh-action-cursor-hover: progress;
|
|
218
|
+
--xh-action-cursor-pressed: progress;
|
|
219
|
+
--xh-action-cursor-focus-visible: progress;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* 滑块里那枚环由加载环配方画在 ::before 上(连接层投影 data-xh-loading-ring),随 data-loading 淡入淡出、
|
|
223
|
+
转与停;起始边取强调色、转速认使用者槽。环叠在滑块正中那一格,不挤开作者放进滑块的图形 */
|
|
224
|
+
.xh-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
|
+
.xh-scope-switch[data-part='thumb']::before {
|
|
230
|
+
content: '';
|
|
231
|
+
grid-area: 1 / 1;
|
|
232
|
+
inline-size: 60%;
|
|
233
|
+
block-size: 60%;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/* —— 带文字的整行:<label> 包住控件与文字,与 checkbox 的标签、checkbox-group 的条目同一副样子 ——
|
|
237
|
+
文字是控件自己的文字,字号随 size 档取 --xh-control-font-*(控件字号随档);
|
|
238
|
+
行高取正文档,长文字可以自然换行 */
|
|
239
|
+
.xh-scope-switch[data-part='label'] {
|
|
240
|
+
--xh-_switch-label-font-size: var(--xh-control-font-md);
|
|
241
|
+
|
|
242
|
+
display: inline-flex;
|
|
243
|
+
align-items: center;
|
|
244
|
+
gap: var(--xh-switch-label-gap, var(--xh-control-gap-md));
|
|
245
|
+
color: var(--xh-switch-label-fg, var(--xh-fg-default));
|
|
246
|
+
font-size: var(--xh-switch-label-font-size, var(--xh-_switch-label-font-size));
|
|
247
|
+
line-height: var(--xh-switch-label-leading, var(--xh-leading-normal));
|
|
248
|
+
cursor: pointer;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.xh-scope-switch[data-part='label'][data-size='sm'] {
|
|
252
|
+
--xh-_switch-label-font-size: var(--xh-control-font-sm);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.xh-scope-switch[data-part='label'][data-size='lg'] {
|
|
256
|
+
--xh-_switch-label-font-size: var(--xh-control-font-lg);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* 禁用标签色统一 --xh-fg-subtle */
|
|
260
|
+
.xh-scope-switch[data-part='label'][data-disabled] {
|
|
261
|
+
color: var(--xh-switch-label-fg-disabled, var(--xh-fg-subtle));
|
|
262
|
+
cursor: not-allowed;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* label 没有独立的 readonly/loading 状态属性,现读里面真实的轨道状态,不复制一套业务状态。 */
|
|
266
|
+
.xh-scope-switch[data-part='label']:has(
|
|
267
|
+
.xh-scope-switch[data-part='root'][data-readonly]:not([data-disabled])
|
|
268
|
+
) {
|
|
269
|
+
cursor: default;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.xh-scope-switch[data-part='label']:has(
|
|
273
|
+
.xh-scope-switch[data-part='root'][data-loading]:not([data-disabled])
|
|
274
|
+
) {
|
|
275
|
+
cursor: progress;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.xh-scope-switch[data-part='text'] {
|
|
279
|
+
color: inherit;
|
|
280
|
+
user-select: none;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/* 减少动效:圆环停下并整圈换成虚线,静止的形状仍然读得出"还没好"。
|
|
284
|
+
两条规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
|
|
285
|
+
@media (prefers-reduced-motion: reduce) {
|
|
286
|
+
.xh-scope-switch[data-part='root'] {
|
|
287
|
+
--xh-_switch-thumb-press-stretch: var(--xh-motion-distance-sm);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
:where([data-motion='reduce']) .xh-scope-switch[data-part='root'] {
|
|
292
|
+
--xh-_switch-thumb-press-stretch: var(--xh-motion-distance-sm);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
297
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
298
|
+
.xh-scope-switch[data-part='root'][hidden],
|
|
299
|
+
.xh-scope-switch[data-part='thumb'][hidden],
|
|
300
|
+
.xh-scope-switch[data-part='label'][hidden] {
|
|
301
|
+
display: none;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
@media (forced-colors: active) {
|
|
305
|
+
/* 系统会丢弃 box-shadow:轨道改用内收 outline,滑块用真实边框保住两层几何。 */
|
|
306
|
+
.xh-scope-switch[data-part='root'] {
|
|
307
|
+
outline: var(--xh-stroke-thin) solid CanvasText;
|
|
308
|
+
outline-offset: calc(-1 * var(--xh-stroke-thin));
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.xh-scope-switch[data-part='root'][data-disabled] {
|
|
312
|
+
outline-color: GrayText;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/* 按下:家族的 forced-colors 按压块把轨道底换成 Highlight,这里不再另画 */
|
|
316
|
+
.xh-scope-switch[data-part='root'][data-readonly] {
|
|
317
|
+
outline-style: dashed;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.xh-scope-switch[data-part='root'][data-readonly]:focus-visible {
|
|
321
|
+
outline-width: var(--xh-ring-width);
|
|
322
|
+
outline-style: solid;
|
|
323
|
+
outline-color: Highlight;
|
|
324
|
+
outline-offset: var(--xh-ring-offset);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.xh-scope-switch[data-part='thumb'] {
|
|
328
|
+
border-color: CanvasText;
|
|
329
|
+
box-shadow: none;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
@media print {
|
|
334
|
+
/* 打印默认丢底色与投影:轨道与滑块都只有一块底,落到纸上整条开关消失,开与关无从读起。
|
|
335
|
+
轨道补一圈实边把形状画出来,滑块补一圈实边把它停在哪一端画出来——
|
|
336
|
+
开与关本来就由滑块的位置读出,位置这条通道在纸上仍然成立。
|
|
337
|
+
轨道走 outline 而不是 border:这条盒子的内衬与滑块行程都从轨道高算出来,
|
|
338
|
+
加一条实边会把行程改掉。 */
|
|
339
|
+
.xh-scope-switch[data-part='root'] {
|
|
340
|
+
outline: var(--xh-stroke-thin) solid currentColor;
|
|
341
|
+
outline-offset: calc(-1 * var(--xh-stroke-thin));
|
|
342
|
+
box-shadow: none;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.xh-scope-switch[data-part='thumb'] {
|
|
346
|
+
border: var(--xh-stroke-thin) solid currentColor;
|
|
347
|
+
box-shadow: none;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
}
|
|
351
|
+
}
|