@xihan-ui/styles 3.0.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 +63 -0
- package/README.md +1 -1
- package/component-tokens.d.ts +29 -0
- package/components.tokens.json +683 -27
- 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-picker.css +81 -0
- 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 +39 -0
- package/css/date-picker.css +86 -9
- package/css/date-range-picker.css +47 -7
- package/css/diff-view.css +8 -8
- package/css/field-array.css +1 -1
- package/css/field.css +4 -0
- package/css/file-upload.css +1 -1
- package/css/float-button.css +140 -27
- package/css/form.css +14 -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 +26 -20
- 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 +19 -2
- package/css/tags-input.css +1 -1
- package/css/time-picker.css +59 -2
- package/css/tool-call.css +7 -7
- package/css/tooltip.css +1 -1
- package/css/tree-select.css +2 -2
- package/css/tree.css +81 -11
- 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 +7307 -6759
- package/index.unlayered.css +7309 -6761
- package/package.json +165 -164
|
@@ -0,0 +1,358 @@
|
|
|
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
|
+
/* 定义 checkbox group 样式。 */
|
|
7
|
+
|
|
8
|
+
@import '../family/action-control.css';
|
|
9
|
+
@import '../family/check-mark.css';
|
|
10
|
+
@import '../family/choice-card.css';
|
|
11
|
+
|
|
12
|
+
@layer xihan.components {
|
|
13
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
14
|
+
.xh-scope-checkbox-group {
|
|
15
|
+
--xh-checkbox-group-skin: 1;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* 组容器:label、trigger、条目都是它的直接子节点,排布方式只能读 data-orientation——
|
|
19
|
+
连接层明说了 role=group 不接受 aria-orientation,那个属性它根本没输出 */
|
|
20
|
+
.xh-scope-checkbox-group[data-part='root'] {
|
|
21
|
+
/* 尺寸档只换这四个私有槽,条目、方框与全选格都从 root 继承它们,
|
|
22
|
+
换档不必给每个部件各写一条选择器。方框与字形照 checkbox 的档位走,
|
|
23
|
+
单体与集合里的同一枚方框必须一样大;条目文字是控件文字,随档取 --xh-control-font-* */
|
|
24
|
+
--xh-_checkbox-group-box: var(--xh-control-indicator-md);
|
|
25
|
+
--xh-_checkbox-group-glyph: calc(var(--xh-_checkbox-group-box) * 0.75);
|
|
26
|
+
--xh-_checkbox-group-gap: var(--xh-control-gap-md);
|
|
27
|
+
--xh-_checkbox-group-font-size: var(--xh-control-font-md);
|
|
28
|
+
/* 作者塞进指示符槽的图标和皮肤画的兜底字形共用盒比例(与 checkbox 同一把尺);显式 icon-size 仍可覆盖 */
|
|
29
|
+
--xh-icon-size: var(--xh-checkbox-group-icon-size, var(--xh-_checkbox-group-glyph));
|
|
30
|
+
|
|
31
|
+
/* 勾中的填色随语气走,与独立 Checkbox 同一支:选中态是小面积控件边界,取保证 3:1 的语气 control 色;
|
|
32
|
+
没写 data-tone 时退回品牌色 */
|
|
33
|
+
--xh-_checkbox-group-accent: var(--xh-_tone-border-control, var(--xh-bg-brand));
|
|
34
|
+
--xh-_checkbox-group-on-accent: var(--xh-_tone-on, var(--xh-fg-on-brand));
|
|
35
|
+
/* 方框是字段家族的控制盒(字段静息形态):透明底 + --xh-border-control 描边 + 无影,不消费海拔与顶光 */
|
|
36
|
+
--xh-_checkbox-group-bg: var(--xh-checkbox-group-indicator-bg, transparent);
|
|
37
|
+
/* 条目与全选格是方框的承载面:行自己坐画布走 100 → 200,行面上的方框按淡底容器阶梯再上一档(200 → 300)。
|
|
38
|
+
两支私有槽是这一档的唯一来源——宿主拿它们给 --xh-action-host-bg-* 赋值(桥接槽只写不读),
|
|
39
|
+
方框按下读同一支私有槽,即与宿主的 host 槽同源 */
|
|
40
|
+
--xh-_checkbox-group-host-bg-hover: var(--xh-bg-subtle-hover);
|
|
41
|
+
--xh-_checkbox-group-host-bg-pressed: var(--xh-bg-subtle-active);
|
|
42
|
+
|
|
43
|
+
/* 标题与条目都是根的直接子节点,一支 gap 同时管「标题到集合」与「条目之间」:
|
|
44
|
+
集合标题与集合隔 --xh-space-2,同组条目之间也是同一档紧密关系 */
|
|
45
|
+
display: flex;
|
|
46
|
+
gap: var(--xh-checkbox-group-gap, var(--xh-space-2));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* —— 尺寸 —— */
|
|
50
|
+
/* 缺省档写在上面的基础规则里 */
|
|
51
|
+
.xh-scope-checkbox-group[data-part='root'][data-size='sm'] {
|
|
52
|
+
--xh-_checkbox-group-box: var(--xh-control-indicator-sm);
|
|
53
|
+
--xh-_checkbox-group-gap: var(--xh-control-gap-sm);
|
|
54
|
+
--xh-_checkbox-group-font-size: var(--xh-control-font-sm);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.xh-scope-checkbox-group[data-part='root'][data-size='lg'] {
|
|
58
|
+
--xh-_checkbox-group-box: var(--xh-control-indicator-lg);
|
|
59
|
+
--xh-_checkbox-group-gap: var(--xh-control-gap-lg);
|
|
60
|
+
--xh-_checkbox-group-font-size: var(--xh-control-font-lg);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* 两种取值各写一条:连接层缺省给的是 vertical,但受控写 horizontal 时不能靠默认值兜底 */
|
|
64
|
+
.xh-scope-checkbox-group[data-part='root'][data-orientation='vertical'] {
|
|
65
|
+
flex-direction: column;
|
|
66
|
+
/* 条目按内容收宽。竖排下 flex 子项默认拉伸,点击区会一路延伸到文字右侧的空白处,
|
|
67
|
+
用户点在离文字很远的地方也能翻转选项 */
|
|
68
|
+
align-items: flex-start;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.xh-scope-checkbox-group[data-part='root'][data-orientation='horizontal'] {
|
|
72
|
+
flex-direction: row;
|
|
73
|
+
flex-wrap: wrap;
|
|
74
|
+
align-items: center;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* card 形态:卡片撑满竖排的一列;横排时各卡等分一行、按内容等高,窄到放不下两张就折到下一行 */
|
|
78
|
+
.xh-scope-checkbox-group[data-part='root'][data-variant='card'] {
|
|
79
|
+
align-items: stretch;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.xh-scope-checkbox-group[data-part='root'][data-variant='card'][data-orientation='horizontal']
|
|
83
|
+
> .xh-scope-checkbox-group[data-part='item'] {
|
|
84
|
+
flex: 1 1 0;
|
|
85
|
+
min-inline-size: min(var(--xh-control-min-w), 100%);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* 集合标题:14 / 500 / fg-muted,字号不随 size 档 */
|
|
89
|
+
.xh-scope-checkbox-group[data-part='label'] {
|
|
90
|
+
color: var(--xh-checkbox-group-label-fg, var(--xh-fg-muted));
|
|
91
|
+
font-size: var(--xh-checkbox-group-label-font-size, var(--xh-text-label-size));
|
|
92
|
+
font-weight: var(--xh-checkbox-group-label-font-weight, var(--xh-text-label-weight));
|
|
93
|
+
line-height: var(--xh-leading-none);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* label 自己不带任何状态属性,整组禁用只写在 root 上,只能从 root 往下够 */
|
|
97
|
+
.xh-scope-checkbox-group[data-part='root'][data-disabled]
|
|
98
|
+
.xh-scope-checkbox-group[data-part='label'] {
|
|
99
|
+
color: var(--xh-checkbox-group-label-fg-disabled, var(--xh-fg-subtle));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* 条目是「方框 + 文案」的整行命中区:接 Action Control row 档、ghost 形态,悬停 / 按下 / 禁用面、手型、
|
|
103
|
+
过渡与焦点环由家族给,按下只换面不缩放(row 档专属按压块 scale: none);这里只把使用者槽映射到桥接槽。
|
|
104
|
+
行自己坐画布走 100 → 200(--xh-action-bg-* 钉住自己的面),行面上的方框按淡底容器阶梯再上一档
|
|
105
|
+
(--xh-action-host-bg-* 向内声明自己是方框的承载面,host 槽只对后代生效——自己的面已由 --xh-action-bg-* 钉住;
|
|
106
|
+
也因此 root 带 data-tone 时 --xh-_tone-subtle 不会把整行染色)。
|
|
107
|
+
xs 的 24px 是命中地板,方框 12 / 16 / 20px 居中其间;字号与间距按组档位从 root 的私有槽映射。
|
|
108
|
+
条目禁用一律走 aria-disabled(原生 disabled 会让它从键盘用户眼里消失),家族的禁用块读 data-disabled。
|
|
109
|
+
position 是给条目内那份视觉隐藏的原生输入当定位基准:连接层给它写死了 position:absolute,
|
|
110
|
+
这里不立基准的话,原生校验气泡会飘到页面上离该条目很远的地方 */
|
|
111
|
+
.xh-scope-checkbox-group[data-part='item'] {
|
|
112
|
+
--xh-action-gap: var(--xh-checkbox-group-item-gap, var(--xh-_checkbox-group-gap));
|
|
113
|
+
--xh-action-radius: var(--xh-checkbox-group-item-radius, var(--xh-shape-control));
|
|
114
|
+
--xh-action-font-size: var(--xh-checkbox-group-item-font-size, var(--xh-_checkbox-group-font-size));
|
|
115
|
+
--xh-action-padding-inline: 0;
|
|
116
|
+
--xh-action-padding-block: 0;
|
|
117
|
+
--xh-action-fg-rest: var(--xh-checkbox-group-item-fg, var(--xh-fg-default));
|
|
118
|
+
--xh-action-fg-hover: var(--xh-checkbox-group-item-fg, var(--xh-fg-default));
|
|
119
|
+
--xh-action-fg-pressed: var(--xh-checkbox-group-item-fg, var(--xh-fg-default));
|
|
120
|
+
--xh-action-fg-focus-visible: var(--xh-checkbox-group-item-fg, var(--xh-fg-default));
|
|
121
|
+
--xh-action-fg-disabled: var(--xh-checkbox-group-item-fg-disabled, var(--xh-fg-disabled));
|
|
122
|
+
--xh-action-bg-hover: var(--xh-checkbox-group-item-bg-hover, var(--xh-bg-subtle));
|
|
123
|
+
--xh-action-bg-pressed: var(--xh-checkbox-group-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
124
|
+
--xh-action-host-bg-hover: var(--xh-_checkbox-group-host-bg-hover);
|
|
125
|
+
--xh-action-host-bg-pressed: var(--xh-_checkbox-group-host-bg-pressed);
|
|
126
|
+
|
|
127
|
+
position: relative;
|
|
128
|
+
/* row 档铺满容器(inline-size: 100%)会把竖排的命中区拉到整行空白处、横排 wrap 也塌:
|
|
129
|
+
沿用「条目按内容收宽」的既有决定 */
|
|
130
|
+
inline-size: auto;
|
|
131
|
+
/* ghost 的 1px 透明边位会把方框列相对组标题错开 1px:边归零,几何保持不变 */
|
|
132
|
+
border-width: 0;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* 只读整组都改不动,但不是禁用:颜色照常,把整行的悬停 / 按下面与"可点"这个暗示一起收回来。
|
|
136
|
+
家族的 :hover / 按压块不排 readonly,只能从槽上收回;排掉禁用项是因为这条选择器权重高过家族的禁用块,
|
|
137
|
+
不排就会把 not-allowed 覆盖回 default */
|
|
138
|
+
.xh-scope-checkbox-group[data-part='root'][data-readonly]
|
|
139
|
+
.xh-scope-checkbox-group[data-part='item']:not([data-disabled]):not([data-xh-choice-card]) {
|
|
140
|
+
--xh-action-bg-hover: transparent;
|
|
141
|
+
--xh-action-bg-pressed: transparent;
|
|
142
|
+
--xh-action-cursor-rest: default;
|
|
143
|
+
--xh-action-cursor-hover: default;
|
|
144
|
+
--xh-action-cursor-pressed: default;
|
|
145
|
+
--xh-action-cursor-focus-visible: default;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* 全选格与条目格共用同一套盒子,并成一条规则写:分开写迟早只改到一半,两个方框就此走形。
|
|
149
|
+
尺寸与选中态照 checkbox 的 root 搬,同一份视觉语言在单体与集合里必须一致。
|
|
150
|
+
trigger 那格没有对应的角色节点(anatomy 到 trigger 为止),只能由伪元素补出来 */
|
|
151
|
+
.xh-scope-checkbox-group[data-part='indicator'],
|
|
152
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger']::before {
|
|
153
|
+
display: inline-flex;
|
|
154
|
+
flex: none;
|
|
155
|
+
align-items: center;
|
|
156
|
+
justify-content: center;
|
|
157
|
+
inline-size: var(--xh-checkbox-group-indicator-size, var(--xh-_checkbox-group-box));
|
|
158
|
+
block-size: var(--xh-checkbox-group-indicator-size, var(--xh-_checkbox-group-box));
|
|
159
|
+
border: var(--xh-stroke-thin) solid var(--xh-checkbox-group-indicator-border, var(--xh-border-control));
|
|
160
|
+
border-radius: var(--xh-checkbox-group-indicator-radius, var(--xh-shape-inset));
|
|
161
|
+
background-color: var(--xh-_checkbox-group-bg);
|
|
162
|
+
color: var(--xh-checkbox-group-indicator-fg, var(--xh-_checkbox-group-on-accent));
|
|
163
|
+
box-shadow: var(--xh-checkbox-group-indicator-shadow, none);
|
|
164
|
+
font-size: var(--xh-checkbox-group-indicator-font-size, var(--xh-_checkbox-group-glyph));
|
|
165
|
+
line-height: var(--xh-leading-none);
|
|
166
|
+
/* 方框不缩放(行级只换面),过渡只有底与描边;按下走 press 时间线、释放同走 micro */
|
|
167
|
+
transition:
|
|
168
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
169
|
+
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* content 只能给伪元素,绝不能并进上面那条:content 落在普通元素上会顶掉它的全部子节点,
|
|
173
|
+
indicator 里作者写的图标就此消失 */
|
|
174
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger']::before {
|
|
175
|
+
content: '';
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/* 悬停整行时未勾选的方框描边升一档(字段静息 → hover 的同一条阶梯);
|
|
179
|
+
勾中的方框描边与底同色,悬停不换描边——填色本身已经在表达状态 */
|
|
180
|
+
@media (hover: hover) {
|
|
181
|
+
.xh-scope-checkbox-group[data-part='root']:not([data-disabled]):not([data-readonly]):not([data-invalid])
|
|
182
|
+
.xh-scope-checkbox-group[data-part='item']:not([data-disabled]):hover
|
|
183
|
+
.xh-scope-checkbox-group[data-part='indicator']:not([data-state='checked']),
|
|
184
|
+
.xh-scope-checkbox-group[data-part='root']:not([data-disabled]):not([data-readonly]):not([data-invalid])
|
|
185
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger']:not([data-disabled]):not([data-state='checked']):not([data-state='indeterminate']):hover::before {
|
|
186
|
+
border-color: var(--xh-checkbox-group-indicator-border-hover, var(--xh-border-control-hover));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* 选中即填色:条目是二态,全选格三态里 checked 与 indeterminate 都算"有值",共用同一副填色 */
|
|
191
|
+
.xh-scope-checkbox-group[data-part='indicator'][data-state='checked'],
|
|
192
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger']:is([data-state='checked'], [data-state='indeterminate'])::before {
|
|
193
|
+
--xh-_checkbox-group-bg: var(--xh-checkbox-group-indicator-bg-checked, var(--xh-_checkbox-group-accent));
|
|
194
|
+
|
|
195
|
+
border-color: var(--xh-checkbox-group-indicator-border-checked, var(--xh-_checkbox-group-accent));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* 按下去要有回应。方框不是激活宿主:宿主是投影了 row 档的整行(条目 / 全选格),方框在宿主的
|
|
199
|
+
:hover / :is(:active, [data-pressed]) 下读宿主 host 槽的同一来源换面、不缩放——行按下是 200,
|
|
200
|
+
坐在上面的方框到 300(行以 --xh-action-host-bg-pressed 声明自己是方框的承载面,桥接槽只写不读,
|
|
201
|
+
方框读的是喂给它的那支私有槽),勾中的换到语气的 active 档;
|
|
202
|
+
与家族按压块同一时间线(按下 --xh-motion-duration-press,释放同走 micro) */
|
|
203
|
+
.xh-scope-checkbox-group[data-part='root']:not([data-readonly])
|
|
204
|
+
.xh-scope-checkbox-group[data-part='item']:not([data-disabled]):is(:active, [data-pressed])
|
|
205
|
+
.xh-scope-checkbox-group[data-part='indicator'],
|
|
206
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger']:not([data-disabled]):not([data-readonly]):is(:active, [data-pressed])::before {
|
|
207
|
+
--xh-_checkbox-group-bg: var(--xh-checkbox-group-indicator-bg-pressed, var(--xh-_checkbox-group-host-bg-pressed));
|
|
208
|
+
|
|
209
|
+
transition-duration: var(--xh-motion-duration-press);
|
|
210
|
+
transition-timing-function: var(--xh-motion-ease-press);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.xh-scope-checkbox-group[data-part='root']:not([data-readonly])
|
|
214
|
+
.xh-scope-checkbox-group[data-part='item']:not([data-disabled]):is(:active, [data-pressed])
|
|
215
|
+
.xh-scope-checkbox-group[data-part='indicator'][data-state='checked'],
|
|
216
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger']:not([data-disabled]):not([data-readonly]):is(:active, [data-pressed]):is([data-state='checked'], [data-state='indeterminate'])::before {
|
|
217
|
+
--xh-_checkbox-group-bg: var(--xh-checkbox-group-indicator-bg-checked-pressed, var(--xh-_tone-active, var(--xh-bg-brand-active)));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* 方框里的勾与全选格的三态标记(checked 打勾、indeterminate 打横杠、unchecked 留空)由勾选标记配方画:
|
|
221
|
+
常驻、按状态淡变并轻缩放。条目的方框是真实节点,标记是它的 ::before;全选格的 anatomy 到 trigger
|
|
222
|
+
为止,方框只能是行首那颗 ::before,标记是 ::after、叠在方框正中——两支桥接槽写在 trigger 上 */
|
|
223
|
+
|
|
224
|
+
/* 校验失败标在每个方框上:root 上的 data-invalid 是唯一出处,条目自己不带这个属性 */
|
|
225
|
+
.xh-scope-checkbox-group[data-part='root'][data-invalid]
|
|
226
|
+
.xh-scope-checkbox-group[data-part='indicator'] {
|
|
227
|
+
border-color: var(--xh-checkbox-group-indicator-border-invalid, var(--xh-border-invalid));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* 禁用:--xh-border-default 描边 + --xh-bg-subtle 底 + --xh-fg-disabled 字形,不靠 opacity */
|
|
231
|
+
.xh-scope-checkbox-group[data-part='root'][data-disabled]
|
|
232
|
+
.xh-scope-checkbox-group[data-part='indicator'],
|
|
233
|
+
.xh-scope-checkbox-group[data-part='item'][data-disabled]
|
|
234
|
+
.xh-scope-checkbox-group[data-part='indicator'],
|
|
235
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger'][data-disabled]::before {
|
|
236
|
+
--xh-_checkbox-group-bg: var(--xh-checkbox-group-indicator-bg-disabled, var(--xh-bg-subtle));
|
|
237
|
+
|
|
238
|
+
border-color: var(--xh-checkbox-group-indicator-border-disabled, var(--xh-border-default));
|
|
239
|
+
color: var(--xh-checkbox-group-indicator-fg-disabled, var(--xh-fg-disabled));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* 全选格的标记画在 ::after 上,禁用色经桥接槽给,与条目方框里置灰的勾同色 */
|
|
243
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger'][data-disabled] {
|
|
244
|
+
--xh-check-mark-fg: var(--xh-checkbox-group-indicator-fg-disabled, var(--xh-fg-disabled));
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.xh-scope-checkbox-group[data-part='item-text'] {
|
|
248
|
+
color: inherit;
|
|
249
|
+
user-select: none;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* 卡片的文案是卡的标题:取标签字重,与说明拉开层级 */
|
|
253
|
+
.xh-scope-checkbox-group[data-part='item'][data-xh-choice-card] > .xh-scope-checkbox-group[data-part='item-text'] {
|
|
254
|
+
font-weight: var(--xh-checkbox-group-card-title-font-weight, var(--xh-text-label-weight));
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* 说明是次级文字:13 / fg-muted / 正文行高,不随选中与语气换色;落在文案下方同一列。
|
|
258
|
+
列表形态的条目带了说明时同样排成两行,行首的方框对齐第一行 */
|
|
259
|
+
.xh-scope-checkbox-group[data-part='item-description'] {
|
|
260
|
+
grid-column: 2;
|
|
261
|
+
color: var(--xh-checkbox-group-item-description-fg, var(--xh-fg-muted));
|
|
262
|
+
font-size: var(--xh-checkbox-group-item-description-font-size, var(--xh-text-secondary-size));
|
|
263
|
+
font-weight: var(--xh-font-weight-regular);
|
|
264
|
+
line-height: var(--xh-leading-normal);
|
|
265
|
+
user-select: none;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.xh-scope-checkbox-group[data-part='item']:not([data-xh-choice-card]):has(> .xh-scope-checkbox-group[data-part='item-description']) {
|
|
269
|
+
display: grid;
|
|
270
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
271
|
+
align-items: center;
|
|
272
|
+
row-gap: var(--xh-checkbox-group-item-row-gap, var(--xh-space-1));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.xh-scope-checkbox-group[data-part='item'][data-disabled] > .xh-scope-checkbox-group[data-part='item-description'] {
|
|
276
|
+
color: var(--xh-checkbox-group-item-description-fg-disabled, var(--xh-fg-disabled));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* 全选格与条目同形(接 Action Control row 档 ghost、xs 命中地板、按下只换面不缩放,方框读宿主 host 槽),
|
|
280
|
+
但字重加一档,读起来才不像又一个普通选项。它是普通元素而非原生控件(三态只有非原生控件表达得出),
|
|
281
|
+
家族的禁用块同样只读 data-disabled。position 是给叠在方框上的那颗字形 ::after 当定位基准 */
|
|
282
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger'] {
|
|
283
|
+
--xh-action-gap: var(--xh-checkbox-group-select-all-trigger-gap, var(--xh-_checkbox-group-gap));
|
|
284
|
+
/* 全选格的身份是嵌在 control 内的小方框(select-all 方框取 inset),与条目方框同一档 */
|
|
285
|
+
--xh-action-radius: var(--xh-checkbox-group-select-all-trigger-radius, var(--xh-shape-inset));
|
|
286
|
+
--xh-action-font-size: var(--xh-checkbox-group-select-all-trigger-font-size, var(--xh-_checkbox-group-font-size));
|
|
287
|
+
--xh-action-padding-inline: 0;
|
|
288
|
+
--xh-action-padding-block: 0;
|
|
289
|
+
--xh-action-fg-rest: var(--xh-checkbox-group-select-all-trigger-fg, var(--xh-fg-default));
|
|
290
|
+
--xh-action-fg-hover: var(--xh-checkbox-group-select-all-trigger-fg, var(--xh-fg-default));
|
|
291
|
+
--xh-action-fg-pressed: var(--xh-checkbox-group-select-all-trigger-fg, var(--xh-fg-default));
|
|
292
|
+
--xh-action-fg-focus-visible: var(--xh-checkbox-group-select-all-trigger-fg, var(--xh-fg-default));
|
|
293
|
+
--xh-action-fg-disabled: var(--xh-checkbox-group-select-all-trigger-fg-disabled, var(--xh-fg-disabled));
|
|
294
|
+
--xh-action-bg-hover: var(--xh-checkbox-group-select-all-trigger-bg-hover, var(--xh-bg-subtle));
|
|
295
|
+
--xh-action-bg-pressed: var(--xh-checkbox-group-select-all-trigger-bg-pressed, var(--xh-bg-subtle-hover));
|
|
296
|
+
/* 行自己的面已由上面两支钉住,host 槽只对方框(::before)生效:200 → 300 */
|
|
297
|
+
--xh-action-host-bg-hover: var(--xh-_checkbox-group-host-bg-hover);
|
|
298
|
+
--xh-action-host-bg-pressed: var(--xh-_checkbox-group-host-bg-pressed);
|
|
299
|
+
/* 勾选标记叠在行首方框正中:方框边长与标记色交给配方 */
|
|
300
|
+
--xh-check-mark-box-size: var(--xh-checkbox-group-indicator-size, var(--xh-_checkbox-group-box));
|
|
301
|
+
--xh-check-mark-fg: var(--xh-checkbox-group-indicator-fg, var(--xh-_checkbox-group-on-accent));
|
|
302
|
+
|
|
303
|
+
position: relative;
|
|
304
|
+
inline-size: auto;
|
|
305
|
+
border-width: 0;
|
|
306
|
+
font-weight: var(--xh-checkbox-group-select-all-trigger-font-weight, var(--xh-font-weight-medium));
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/* 只读与禁用会同时出现在 trigger 上(连接层两个属性各写各的):只读收回整行的悬停 / 按下面与手型,
|
|
310
|
+
显式排掉禁用,否则禁用的 not-allowed 被只读的 default 盖掉 */
|
|
311
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger'][data-readonly]:not([data-disabled]) {
|
|
312
|
+
--xh-action-bg-hover: transparent;
|
|
313
|
+
--xh-action-bg-pressed: transparent;
|
|
314
|
+
--xh-action-cursor-rest: default;
|
|
315
|
+
--xh-action-cursor-hover: default;
|
|
316
|
+
--xh-action-cursor-pressed: default;
|
|
317
|
+
--xh-action-cursor-focus-visible: default;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/* 家族 row 档在粗指针下用 ::after 把热区扩到 44px 高:条目按 24px 行 + 8px 间距密排,热区会压进相邻条目 2px、
|
|
321
|
+
指针落错行,A 档 24px 由 xs 地板保住(两者都不在 coarse-target 的 B 档名单);全选格的 ::after 是叠在方框上的
|
|
322
|
+
勾选标记,热区由勾选标记配方逐项钉回 */
|
|
323
|
+
@media (pointer: coarse) {
|
|
324
|
+
.xh-scope-checkbox-group[data-part='item']::after {
|
|
325
|
+
min-block-size: 0;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/* 表单出口:连接层已经把整套视觉隐藏写进内联 style(absolute + 1px + clip-path),
|
|
330
|
+
这里绝不能再补 display:none——那份输入必须留在布局里,原生校验提示要有处可贴。
|
|
331
|
+
只补一条不吃指针,免得它挡住条目的点击 */
|
|
332
|
+
.xh-scope-checkbox-group[data-part='hidden-input'] {
|
|
333
|
+
pointer-events: none;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* 上面凡是给了 display 的角色节点都要补这条:display 声明会盖掉 UA 的 [hidden]{display:none},
|
|
337
|
+
不补的话作者给节点加 hidden 后它照样显示 */
|
|
338
|
+
.xh-scope-checkbox-group[data-part='root'][hidden],
|
|
339
|
+
.xh-scope-checkbox-group[data-part='item'][hidden],
|
|
340
|
+
.xh-scope-checkbox-group[data-part='indicator'][hidden],
|
|
341
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger'][hidden] {
|
|
342
|
+
display: none;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/* 强制色:真实描边保留方框,状态字形的系统前景由勾选标记配方给 */
|
|
346
|
+
|
|
347
|
+
@media print {
|
|
348
|
+
.xh-scope-checkbox-group[data-part='indicator'][data-state='checked'],
|
|
349
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger'][data-state='checked']::before {
|
|
350
|
+
border-width: var(--xh-stroke-thick);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.xh-scope-checkbox-group[data-part='select-all-trigger'][data-state='indeterminate']::before {
|
|
354
|
+
border-width: var(--xh-stroke-thick);
|
|
355
|
+
border-style: dashed;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
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
|
+
/* 定义 checkbox 样式。 */
|
|
7
|
+
|
|
8
|
+
@import '../family/action-control.css';
|
|
9
|
+
@import '../family/check-mark.css';
|
|
10
|
+
|
|
11
|
+
@layer xihan.components {
|
|
12
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
13
|
+
.xh-scope-checkbox {
|
|
14
|
+
--xh-checkbox-skin: 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.xh-scope-checkbox[data-part='root'] {
|
|
18
|
+
/* 尺寸档只换方框边长这一个私有槽,勾的字号按边长的比例跟着走;
|
|
19
|
+
指示器从 root 继承这两个槽,换档不必给每个部件各写一条选择器 */
|
|
20
|
+
--xh-_checkbox-box: var(--xh-control-indicator-md);
|
|
21
|
+
--xh-_checkbox-glyph: calc(var(--xh-_checkbox-box) * 0.75);
|
|
22
|
+
/* 作者塞进指示符槽的图标和兜底字形共用盒比例;显式 icon-size 仍可覆盖。 */
|
|
23
|
+
--xh-icon-size: var(--xh-checkbox-icon-size, var(--xh-_checkbox-glyph));
|
|
24
|
+
|
|
25
|
+
/* 选中态是小面积控件边界,使用保证 3:1 的语气 control 色;没写 tone 时退回品牌底。 */
|
|
26
|
+
--xh-_checkbox-accent: var(--xh-_tone-border-control, var(--xh-bg-brand));
|
|
27
|
+
|
|
28
|
+
/* 实心底上的勾与横杠,同样没写 data-tone 时退回原来的品牌底前景色 */
|
|
29
|
+
--xh-_checkbox-on-accent: var(--xh-_tone-on, var(--xh-fg-on-brand));
|
|
30
|
+
|
|
31
|
+
/* 方框接 Action Control icon 档(定尺方框):盒型、悬停 / 按下 / 禁用面、0.97 缩放与换底、粗指针热区、
|
|
32
|
+
焦点环由家族配方给,这里只把使用者槽映射到桥接槽。面按字段静息形态取值:透明底 +
|
|
33
|
+
--xh-border-control 描边 + 无影,不消费海拔与顶光;悬停只把描边升一档,底不动;按下换到 200 档中性面
|
|
34
|
+
(白底承载);边长随 --xh-control-indicator-* 走,不取家族的 profile 尺寸。
|
|
35
|
+
常态 / 勾中 / 校验失败 / 只读只换下面四支私有槽,桥接槽的映射写一次 */
|
|
36
|
+
--xh-_checkbox-bg: var(--xh-checkbox-bg, transparent);
|
|
37
|
+
--xh-_checkbox-bg-pressed: var(--xh-checkbox-bg-pressed, var(--xh-bg-subtle-hover));
|
|
38
|
+
--xh-_checkbox-border: var(--xh-checkbox-border, var(--xh-border-control));
|
|
39
|
+
--xh-_checkbox-border-hover: var(--xh-checkbox-border-hover, var(--xh-border-control-hover));
|
|
40
|
+
|
|
41
|
+
--xh-action-visual-size: var(--xh-_checkbox-box);
|
|
42
|
+
--xh-action-min-inline-size: var(--xh-_checkbox-box);
|
|
43
|
+
--xh-action-radius: var(--xh-checkbox-radius, var(--xh-shape-inset));
|
|
44
|
+
--xh-action-bg-rest: var(--xh-_checkbox-bg);
|
|
45
|
+
--xh-action-bg-hover: var(--xh-_checkbox-bg);
|
|
46
|
+
--xh-action-bg-pressed: var(--xh-_checkbox-bg-pressed);
|
|
47
|
+
--xh-action-bg-focus-visible: var(--xh-_checkbox-bg);
|
|
48
|
+
--xh-action-bg-disabled: var(--xh-checkbox-bg-disabled, var(--xh-bg-subtle));
|
|
49
|
+
--xh-action-border-rest: var(--xh-_checkbox-border);
|
|
50
|
+
--xh-action-border-hover: var(--xh-_checkbox-border-hover);
|
|
51
|
+
--xh-action-border-pressed: var(--xh-_checkbox-border-hover);
|
|
52
|
+
--xh-action-border-focus-visible: var(--xh-_checkbox-border);
|
|
53
|
+
--xh-action-border-disabled: var(--xh-checkbox-border-disabled, var(--xh-border-default));
|
|
54
|
+
--xh-action-fg-rest: var(--xh-checkbox-fg, var(--xh-_checkbox-on-accent));
|
|
55
|
+
--xh-action-fg-hover: var(--xh-checkbox-fg, var(--xh-_checkbox-on-accent));
|
|
56
|
+
--xh-action-fg-pressed: var(--xh-checkbox-fg, var(--xh-_checkbox-on-accent));
|
|
57
|
+
--xh-action-fg-focus-visible: var(--xh-checkbox-fg, var(--xh-_checkbox-on-accent));
|
|
58
|
+
--xh-action-fg-disabled: var(--xh-checkbox-fg-disabled, var(--xh-fg-disabled));
|
|
59
|
+
--xh-action-shadow-rest: var(--xh-checkbox-shadow, none);
|
|
60
|
+
--xh-action-shadow-hover: var(--xh-checkbox-shadow, none);
|
|
61
|
+
--xh-action-shadow-pressed: var(--xh-checkbox-shadow, none);
|
|
62
|
+
--xh-action-shadow-focus-visible: var(--xh-checkbox-shadow, none);
|
|
63
|
+
--xh-action-shadow-disabled: var(--xh-checkbox-shadow, none);
|
|
64
|
+
|
|
65
|
+
/* 家族的 icon 档不写 padding-block;UA 给 button 的 1px 上下内距会把 16px 盒里的勾挤扁 */
|
|
66
|
+
padding: 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* 半选与全选同样是「有值」,方框都得填上:
|
|
70
|
+
只填全选的话,半选那条横杠是实心底上的前景色,压在同色画布上等于没画。
|
|
71
|
+
面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
|
|
72
|
+
那一族色本来就要在这块面上把字读清楚,与面的对比是按可读性定的。
|
|
73
|
+
勾中的方框描边与底同色,悬停不换描边——填色本身已经在表达状态;按下换到语气的 active 档 */
|
|
74
|
+
.xh-scope-checkbox[data-part='root'][data-state='checked'],
|
|
75
|
+
.xh-scope-checkbox[data-part='root'][data-state='indeterminate'] {
|
|
76
|
+
--xh-_checkbox-bg: var(--xh-checkbox-bg-checked, var(--xh-_checkbox-accent));
|
|
77
|
+
--xh-_checkbox-bg-pressed: var(--xh-checkbox-bg-checked-pressed, var(--xh-_tone-active, var(--xh-bg-brand-active)));
|
|
78
|
+
--xh-_checkbox-border: var(--xh-checkbox-border-checked, var(--xh-_checkbox-accent));
|
|
79
|
+
--xh-_checkbox-border-hover: var(--xh-checkbox-border-checked, var(--xh-_checkbox-accent));
|
|
80
|
+
--xh-action-ring-color-focus-visible: currentColor;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* 高对比轴把未选中边界提到 strong;有值两态仍由实心语气底与配对勾形表达。 */
|
|
84
|
+
:where([data-contrast='more']) .xh-scope-checkbox[data-part='root'][data-state='unchecked'] {
|
|
85
|
+
--xh-_checkbox-border: var(--xh-checkbox-border, var(--xh-border-strong));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* 校验失败:方框描边转警示色,悬停与按下都不换回控件边。未勾时只有描边,勾上后填充仍走语气色,
|
|
89
|
+
两者不打架——描边压在 checked 规则之后,选择器同特指度靠书写顺序取胜 */
|
|
90
|
+
.xh-scope-checkbox[data-part='root'][data-invalid],
|
|
91
|
+
.xh-scope-checkbox[data-part='root'][data-state='checked'][data-invalid],
|
|
92
|
+
.xh-scope-checkbox[data-part='root'][data-state='indeterminate'][data-invalid] {
|
|
93
|
+
--xh-_checkbox-border: var(--xh-checkbox-border-invalid, var(--xh-border-invalid));
|
|
94
|
+
--xh-_checkbox-border-hover: var(--xh-checkbox-border-invalid, var(--xh-border-invalid));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* 文字随方框一起转警示色:给了默认插槽时外层是 <label>,方框自己的描边够不到那段文字 */
|
|
98
|
+
.xh-scope-checkbox[data-part='label'][data-invalid],
|
|
99
|
+
.xh-scope-checkbox[data-part='text'][data-invalid] {
|
|
100
|
+
color: var(--xh-checkbox-fg-invalid, var(--xh-fg-danger));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* 悬停标签文字时也让控制盒回应,整行可点不再只有移到 16px 小盒上才看得出来:
|
|
104
|
+
指针落在方框上时由家族的悬停块换到 --xh-action-border-hover,落在标签文字上时这里补同一档;
|
|
105
|
+
未勾选的方框描边升一档(字段静息 → hover 的同一条阶梯),勾中 / 校验失败的方框由上面的映射钉住不换 */
|
|
106
|
+
@media (hover: hover) {
|
|
107
|
+
.xh-scope-checkbox[data-part='label']:not([data-disabled]):not([data-readonly]):hover
|
|
108
|
+
.xh-scope-checkbox[data-part='root'] {
|
|
109
|
+
border-color: var(--xh-_checkbox-border-hover);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* 只读改不动值,但不是禁用:颜色与不透明度都照常,只把「可点」这个暗示与悬停 / 按下的回应一起收回来。
|
|
114
|
+
方框与整行文字一起收——给了默认插槽时外层是 <label>,只收方框的话文字那半仍摆着手型。
|
|
115
|
+
排掉禁用是因为这条选择器权重高过禁用那条,不排就会把 not-allowed 覆盖回 default */
|
|
116
|
+
.xh-scope-checkbox[data-part='root'][data-readonly]:not([data-disabled]) {
|
|
117
|
+
--xh-_checkbox-bg-pressed: var(--xh-_checkbox-bg);
|
|
118
|
+
--xh-_checkbox-border-hover: var(--xh-_checkbox-border);
|
|
119
|
+
--xh-action-scale-pressed: none;
|
|
120
|
+
--xh-action-cursor-rest: default;
|
|
121
|
+
--xh-action-cursor-hover: default;
|
|
122
|
+
--xh-action-cursor-pressed: default;
|
|
123
|
+
--xh-action-cursor-focus-visible: default;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.xh-scope-checkbox[data-part='label'][data-readonly]:not([data-disabled]) {
|
|
127
|
+
cursor: default;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* —— 尺寸 —— */
|
|
131
|
+
/* 缺省档写在上面的基础规则里 */
|
|
132
|
+
.xh-scope-checkbox[data-part='root'][data-size='sm'] {
|
|
133
|
+
--xh-_checkbox-box: var(--xh-control-indicator-sm);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.xh-scope-checkbox[data-part='root'][data-size='lg'] {
|
|
137
|
+
--xh-_checkbox-box: var(--xh-control-indicator-lg);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* 鼠标落点:方框只有一档指示符那么大,命中区靠一枚绝对定位的伪元素往外扩,
|
|
141
|
+
盒子本身一动不动——放大盒子会把并排的文字挤开。常态外扩 6px,最小的 sm 档由 12px 到 24px;
|
|
142
|
+
粗指针下的 44px 热区由家族 icon 档的 ::after 给,这里只把起点交还 */
|
|
143
|
+
.xh-scope-checkbox[data-part='root']::after {
|
|
144
|
+
content: '';
|
|
145
|
+
position: absolute;
|
|
146
|
+
inset: calc(-1 * var(--xh-space-1_5));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* 粗指针:家族在同一个 ::after 上写 44×44 的盒、50% 起点与 -50% 平移把它钉在方框中心。
|
|
150
|
+
上面那条 inset 负值特指度更高,留着的话起点被钉在 -6px、再被家族的平移拉走半个盒,
|
|
151
|
+
热区的中心落到方框左上角外面,方框右下大半摸不着 */
|
|
152
|
+
@media (pointer: coarse) {
|
|
153
|
+
.xh-scope-checkbox[data-part='root']::after {
|
|
154
|
+
inset-block: 50% auto;
|
|
155
|
+
inset-inline: 50% auto;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* 指示器铺满方框。勾与半选杠由勾选标记配方画在它的 ::before 上(常驻、按状态淡变并轻缩放);
|
|
160
|
+
作者往部件里塞了自己的图形时配方不画 */
|
|
161
|
+
.xh-scope-checkbox[data-part='indicator'] {
|
|
162
|
+
display: inline-flex;
|
|
163
|
+
align-items: center;
|
|
164
|
+
justify-content: center;
|
|
165
|
+
inline-size: 100%;
|
|
166
|
+
block-size: 100%;
|
|
167
|
+
line-height: var(--xh-leading-none);
|
|
168
|
+
font-size: var(--xh-_checkbox-glyph);
|
|
169
|
+
pointer-events: none;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* 半选横杠另有一支前景槽,缺省与勾同色 */
|
|
173
|
+
.xh-scope-checkbox[data-part='indicator'][data-state='indeterminate'] {
|
|
174
|
+
--xh-check-mark-fg: var(--xh-checkbox-indicator-fg, var(--xh-_checkbox-on-accent));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* 禁用时横杠也走置灰色 */
|
|
178
|
+
.xh-scope-checkbox[data-part='root'][data-disabled]
|
|
179
|
+
.xh-scope-checkbox[data-part='indicator'][data-state='indeterminate'] {
|
|
180
|
+
--xh-check-mark-fg: var(--xh-checkbox-fg-disabled, var(--xh-fg-disabled));
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* —— 带文字的整行:<label> 包住控件与文字,与 checkbox-group 的条目、switch 的标签同一副样子 ——
|
|
184
|
+
文字是控件自己的文字,字号随 size 档取 --xh-control-font-*(控件字号随档);
|
|
185
|
+
行高取正文档,长文字可以自然换行 */
|
|
186
|
+
.xh-scope-checkbox[data-part='label'] {
|
|
187
|
+
--xh-_checkbox-label-gap: var(--xh-control-gap-md);
|
|
188
|
+
--xh-_checkbox-label-font-size: var(--xh-control-font-md);
|
|
189
|
+
|
|
190
|
+
display: inline-flex;
|
|
191
|
+
align-items: center;
|
|
192
|
+
gap: var(--xh-checkbox-label-gap, var(--xh-_checkbox-label-gap));
|
|
193
|
+
color: var(--xh-checkbox-label-fg, var(--xh-fg-default));
|
|
194
|
+
font-size: var(--xh-checkbox-label-font-size, var(--xh-_checkbox-label-font-size));
|
|
195
|
+
line-height: var(--xh-checkbox-label-leading, var(--xh-leading-normal));
|
|
196
|
+
cursor: pointer;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.xh-scope-checkbox[data-part='label'][data-size='sm'] {
|
|
200
|
+
--xh-_checkbox-label-gap: var(--xh-control-gap-sm);
|
|
201
|
+
--xh-_checkbox-label-font-size: var(--xh-control-font-sm);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.xh-scope-checkbox[data-part='label'][data-size='lg'] {
|
|
205
|
+
--xh-_checkbox-label-gap: var(--xh-control-gap-lg);
|
|
206
|
+
--xh-_checkbox-label-font-size: var(--xh-control-font-lg);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* 禁用标签色统一 --xh-fg-subtle */
|
|
210
|
+
.xh-scope-checkbox[data-part='label'][data-disabled] {
|
|
211
|
+
color: var(--xh-checkbox-label-fg-disabled, var(--xh-fg-subtle));
|
|
212
|
+
cursor: not-allowed;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.xh-scope-checkbox[data-part='text'] {
|
|
216
|
+
min-inline-size: 0;
|
|
217
|
+
color: inherit;
|
|
218
|
+
user-select: none;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
222
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
223
|
+
.xh-scope-checkbox[data-part='root'][hidden],
|
|
224
|
+
.xh-scope-checkbox[data-part='indicator'][hidden],
|
|
225
|
+
.xh-scope-checkbox[data-part='label'][hidden] {
|
|
226
|
+
display: none;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
@media (forced-colors: active) {
|
|
230
|
+
/* 真实 border 保住盒,勾与半选横杠的系统前景由配方给;禁用写在 root 上,指示器自己不带,这里补置灰。
|
|
231
|
+
盒就是 root 本身:悬停与按下时家族把它涂成 Highlight,勾跟着换 HighlightText */
|
|
232
|
+
.xh-scope-checkbox[data-part='root'][data-disabled]
|
|
233
|
+
.xh-scope-checkbox[data-part='indicator']:empty::before {
|
|
234
|
+
background-color: GrayText;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
.xh-scope-checkbox[data-part='root']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed])
|
|
238
|
+
.xh-scope-checkbox[data-part='indicator']:empty::before {
|
|
239
|
+
background-color: HighlightText;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
@media print {
|
|
244
|
+
/* 打印默认丢底色:勾上与半选两档全靠实心底加底上那枚浅色标记表达,落到纸上与没勾的一模一样
|
|
245
|
+
(标记本身也是一块 background,同样印不出来)。改用描边这条印得出来的通道:
|
|
246
|
+
两档各加粗一级把方框分出来,半选再换成虚线,三档在纸上各不相同。
|
|
247
|
+
描边吃进定尺盒里(reset 层已把 box-sizing 收成 border-box),方框边长不变。 */
|
|
248
|
+
.xh-scope-checkbox[data-part='root'][data-state='checked'] {
|
|
249
|
+
border-width: var(--xh-stroke-thick);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.xh-scope-checkbox[data-part='root'][data-state='indeterminate'] {
|
|
253
|
+
border-width: var(--xh-stroke-thick);
|
|
254
|
+
border-style: dashed;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|