@xihan-ui/styles 1.0.0-alpha.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1730 -0
- package/css/accordion.css +25 -2
- package/css/alert.css +13 -9
- package/css/anchor.css +1 -1
- package/css/avatar-group.css +5 -1
- package/css/avatar.css +6 -0
- package/css/back-top.css +6 -0
- package/css/badge.css +94 -36
- package/css/breadcrumb.css +1 -1
- package/css/button-group.css +4 -0
- package/css/button.css +6 -0
- package/css/calendar.css +39 -13
- package/css/card.css +15 -6
- package/css/cascader.css +29 -23
- package/css/checkbox-group.css +38 -10
- package/css/checkbox.css +21 -10
- package/css/collapsible.css +7 -1
- package/css/color-picker.css +22 -2
- package/css/combobox.css +18 -7
- package/css/context-menu.css +17 -6
- package/css/date-field.css +2 -2
- package/css/date-picker.css +27 -17
- package/css/descriptions.css +9 -3
- package/css/dialog.css +7 -1
- package/css/drawer.css +15 -5
- package/css/dynamic-input.css +7 -0
- package/css/ellipsis.css +6 -0
- package/css/empty-state.css +16 -6
- package/css/field.css +7 -0
- package/css/file-upload.css +1 -1
- package/css/flex.css +13 -7
- package/css/float-button.css +7 -0
- package/css/floating-panel.css +6 -0
- package/css/grid.css +11 -5
- package/css/heatmap.css +3 -2
- package/css/highlight.css +1 -1
- package/css/hotkeys.css +1 -1
- package/css/hover-card.css +3 -0
- package/css/image-cropper.css +4 -2
- package/css/image-viewer.css +18 -5
- package/css/json-viewer.css +34 -1
- package/css/layout.css +15 -7
- package/css/list.css +14 -5
- package/css/listbox.css +4 -2
- package/css/loading-bar.css +5 -4
- package/css/log.css +6 -2
- package/css/masonry.css +5 -5
- package/css/mention.css +13 -3
- package/css/menu.css +16 -5
- package/css/menubar.css +14 -6
- package/css/navigation-menu.css +2 -2
- package/css/notification.css +377 -0
- package/css/number-field.css +9 -3
- package/css/page-header.css +7 -0
- package/css/pagination.css +158 -1
- package/css/password-input.css +4 -4
- package/css/pin-input.css +2 -2
- package/css/popconfirm.css +9 -2
- package/css/popover.css +3 -0
- package/css/popselect.css +24 -4
- package/css/progress.css +8 -2
- package/css/radio-group.css +17 -6
- package/css/rating.css +2 -2
- package/css/result.css +15 -5
- package/css/scrollbar.css +3 -0
- package/css/segmented.css +1 -1
- package/css/select.css +25 -7
- package/css/side-nav.css +16 -5
- package/css/slider.css +4 -2
- package/css/space.css +6 -6
- package/css/steps.css +6 -6
- package/css/switch.css +9 -2
- package/css/table.css +16 -8
- package/css/tabs.css +9 -1
- package/css/tag.css +3 -1
- package/css/tags-input.css +3 -3
- package/css/text-field.css +3 -3
- package/css/thread.css +10 -2
- package/css/time-field.css +2 -2
- package/css/time-picker.css +6 -6
- package/css/timeline.css +7 -7
- package/css/toast.css +103 -53
- package/css/toggle-group.css +30 -4
- package/css/toggle.css +6 -0
- package/css/tone.css +47 -17
- package/css/tooltip.css +7 -1
- package/css/tour.css +9 -3
- package/css/transfer.css +38 -12
- package/css/tree-select.css +30 -5
- package/css/tree.css +46 -4
- package/css/typography.css +1 -1
- package/css/undefined.css +1 -0
- package/index.css +1 -1
- package/index.unlayered.css +1746 -505
- package/package.json +3 -3
- package/css/toaster.css +0 -74
package/css/toggle-group.css
CHANGED
|
@@ -7,10 +7,36 @@
|
|
|
7
7
|
/* 分段控件:段与段之间不留缝,靠共边连成一体,所以 root 不设 gap。
|
|
8
8
|
排布只能读 data-orientation——aria-orientation 在多选模式下连接层根本不输出(role=group 不收) */
|
|
9
9
|
[data-scope='toggle-group'][data-part='root'] {
|
|
10
|
+
/* 组件内那几档层号只在自己人之间排序:建一个层叠上下文把它们关起来,
|
|
11
|
+
既不让页面上的层号插进来,也不让它们漏出去压住别人 */
|
|
12
|
+
isolation: isolate;
|
|
13
|
+
|
|
14
|
+
/* 段的度量与字号走私有槽中转,与同族的分段控件一处对一处 */
|
|
15
|
+
--xh-_toggle-group-h: var(--xh-control-h-md);
|
|
16
|
+
--xh-_toggle-group-px: var(--xh-control-px-md);
|
|
17
|
+
--xh-_toggle-group-gap: var(--xh-control-gap-md);
|
|
18
|
+
--xh-_toggle-group-font-size: var(--xh-control-font-md);
|
|
19
|
+
|
|
10
20
|
display: inline-flex;
|
|
11
21
|
align-items: stretch;
|
|
12
22
|
}
|
|
13
23
|
|
|
24
|
+
/* —— 尺寸 —— */
|
|
25
|
+
/* 缺省档写在上面的基础规则里 */
|
|
26
|
+
[data-scope='toggle-group'][data-part='root'][data-size='sm'] {
|
|
27
|
+
--xh-_toggle-group-h: var(--xh-control-h-sm);
|
|
28
|
+
--xh-_toggle-group-px: var(--xh-control-px-sm);
|
|
29
|
+
--xh-_toggle-group-gap: var(--xh-control-gap-sm);
|
|
30
|
+
--xh-_toggle-group-font-size: var(--xh-control-font-sm);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
[data-scope='toggle-group'][data-part='root'][data-size='lg'] {
|
|
34
|
+
--xh-_toggle-group-h: var(--xh-control-h-lg);
|
|
35
|
+
--xh-_toggle-group-px: var(--xh-control-px-lg);
|
|
36
|
+
--xh-_toggle-group-gap: var(--xh-control-gap-lg);
|
|
37
|
+
--xh-_toggle-group-font-size: var(--xh-control-font-lg);
|
|
38
|
+
}
|
|
39
|
+
|
|
14
40
|
[data-scope='toggle-group'][data-part='root'][data-orientation='horizontal'] {
|
|
15
41
|
flex-direction: row;
|
|
16
42
|
}
|
|
@@ -45,15 +71,15 @@
|
|
|
45
71
|
display: inline-flex;
|
|
46
72
|
align-items: center;
|
|
47
73
|
justify-content: center;
|
|
48
|
-
gap: var(--xh-toggle-group-item-gap, var(--xh-
|
|
49
|
-
block-size: var(--xh-toggle-group-item-h, var(--xh-
|
|
50
|
-
padding-inline: var(--xh-toggle-group-item-px, var(--xh-
|
|
74
|
+
gap: var(--xh-toggle-group-item-gap, var(--xh-_toggle-group-gap));
|
|
75
|
+
block-size: var(--xh-toggle-group-item-h, var(--xh-_toggle-group-h));
|
|
76
|
+
padding-inline: var(--xh-toggle-group-item-px, var(--xh-_toggle-group-px));
|
|
51
77
|
border: var(--xh-stroke-thin) solid var(--xh-_border);
|
|
52
78
|
/* 中间段一律直角,圆角只由首末两端补回来 */
|
|
53
79
|
border-radius: 0;
|
|
54
80
|
background: var(--xh-_bg);
|
|
55
81
|
color: var(--xh-_fg);
|
|
56
|
-
font-size: var(--xh-toggle-group-item-font-size, var(--xh-
|
|
82
|
+
font-size: var(--xh-toggle-group-item-font-size, var(--xh-_toggle-group-font-size));
|
|
57
83
|
font-weight: var(--xh-toggle-group-item-font-weight, var(--xh-text-label-weight));
|
|
58
84
|
line-height: var(--xh-leading-none);
|
|
59
85
|
white-space: nowrap;
|
package/css/toggle.css
CHANGED
|
@@ -105,4 +105,10 @@
|
|
|
105
105
|
padding-inline: var(--xh-toggle-px, var(--xh-control-px-lg));
|
|
106
106
|
font-size: var(--xh-toggle-font-size, var(--xh-control-font-lg));
|
|
107
107
|
}
|
|
108
|
+
|
|
109
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
110
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
111
|
+
[data-scope='toggle'][data-part='root'][hidden] {
|
|
112
|
+
display: none;
|
|
113
|
+
}
|
|
108
114
|
}
|
package/css/tone.css
CHANGED
|
@@ -9,19 +9,25 @@
|
|
|
9
9
|
* 这里只声明私有槽,各组件的形态规则去消费。所以加一个语气是改这一处 6 条规则,
|
|
10
10
|
* 而不是逐个组件写 6 遍。
|
|
11
11
|
*
|
|
12
|
-
* --xh-_tone-on
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* --xh-_tone-on 是实心底上的前景色,--xh-_tone-shift 是交互态要往哪个方向挪
|
|
13
|
+
* (永远背离前景色走,悬停与按下才不会反过来压低对比度)。两者都由 --xh-_tone 现推:
|
|
14
|
+
* 按 WCAG 的权重算出语气色的相对亮度,低于 0.179 配白字、高于配深字,shift 取反面。
|
|
15
|
+
* 0.179 是白字与黑字对比度相等的那一点,解析解。
|
|
15
16
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
17
|
+
* 现推是因为语气色可换肤:写死的分派只对本仓这套 600 档成立,使用者换一套调色板
|
|
18
|
+
* 配对就不再成立,而门禁只验本仓的色,换肤后的失配一路绿灯。
|
|
18
19
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
20
|
+
* 够不到相对颜色语法的引擎退回逐族写死的那一份,取值是本仓这套色的实测结果:
|
|
21
|
+
* 600 档上白字对 brand 5.08、neutral 7.80、danger 4.83 达标,而 success 3.04、
|
|
22
|
+
* warning 2.70、info 3.47 都不到 4.5,这三族配深字。兜底那一份用的是固定原语而不是
|
|
23
|
+
* --xh-fg-default:实心底本身是原语色、不随主题翻,配色若跟着主题翻,暗色下就会变成
|
|
24
|
+
* 白字压在浅黄底上(实测对比度 2.70)。
|
|
21
25
|
*
|
|
22
26
|
* brand 是例外:那一族的色相归使用者,所以它的底与前景走 --xh-bg-brand / --xh-fg-on-brand
|
|
23
27
|
* 这两个语义令牌。缺省主题下它们就解析成 brand-600 与 neutral-0,与其余五族同值;
|
|
24
28
|
* 改写过品牌色的使用者只改这两个令牌,实心底与它上面的字就一起跟着走。
|
|
29
|
+
* 底与前景既然随主题翻,brand 的 shift 也必须随主题翻——现推那一档自动跟着底色走,
|
|
30
|
+
* 文件末尾那条深色覆盖是给兜底那一档用的。
|
|
25
31
|
*/
|
|
26
32
|
@layer xihan.components {
|
|
27
33
|
[data-tone] {
|
|
@@ -29,9 +35,6 @@
|
|
|
29
35
|
而不是让 --xh-_tone 悬空——悬空会让下面每条 color-mix 变成计算期无效,
|
|
30
36
|
用它的声明会整条失效,且 var() 兜底也救不回来(槽位是「已声明但无效」)。 */
|
|
31
37
|
--xh-_tone: var(--xh-color-neutral-600);
|
|
32
|
-
/* 装饰性强调(色条、图标这类)用 500 档:600 是给实心底与文字用的强调档,
|
|
33
|
-
压在细长的色条上偏重。alert 与 toast 原本就用 500,接语气层不该改变它们的观感 */
|
|
34
|
-
--xh-_tone-soft: var(--xh-color-neutral-500);
|
|
35
38
|
--xh-_tone-on: var(--xh-color-neutral-0);
|
|
36
39
|
--xh-_tone-shift: var(--xh-color-neutral-950);
|
|
37
40
|
|
|
@@ -45,13 +48,18 @@
|
|
|
45
48
|
/* 控件的可操作区边界要 3:1,兑了底色的 --xh-_tone-border 六族全在 1.44–2.18,够不着。
|
|
46
49
|
这一支直接取主色本体;两族在各自的底上仍不够,在下面按主题单独兜 */
|
|
47
50
|
--xh-_tone-border-control: var(--xh-_tone);
|
|
48
|
-
/*
|
|
49
|
-
|
|
51
|
+
/* 装饰性强调(色条、指示条、锚点高亮这类)是非文字图形,同样要 3:1,
|
|
52
|
+
要求与可操作区边界一模一样,就直接跟着那一支走,连它按主题兜的两族一并继承。
|
|
53
|
+
要读得清的状态文字不在此列,那些走 --xh-_tone-fg */
|
|
54
|
+
--xh-_tone-soft: var(--xh-_tone-border-control);
|
|
55
|
+
/* 在普通背景上表达该语气的文字色:往前景色兑,浅色态变深、深色态变浅。
|
|
56
|
+
兑到 60% 是实测出来的:这一档要同时压得住淡底的静态/悬停/按下三态、面与抬起的面
|
|
57
|
+
共五种底,72% 时六族里有三族够不到 4.5(最低 3.66),60% 全部达标且留有余量 */
|
|
58
|
+
--xh-_tone-fg: color-mix(in oklab, var(--xh-_tone) 60%, var(--xh-fg-default));
|
|
50
59
|
}
|
|
51
60
|
|
|
52
61
|
[data-tone='brand'] {
|
|
53
62
|
--xh-_tone: var(--xh-bg-brand);
|
|
54
|
-
--xh-_tone-soft: var(--xh-color-brand-500);
|
|
55
63
|
--xh-_tone-on: var(--xh-fg-on-brand);
|
|
56
64
|
--xh-_tone-shift: var(--xh-color-neutral-950);
|
|
57
65
|
}
|
|
@@ -64,28 +72,24 @@
|
|
|
64
72
|
|
|
65
73
|
[data-tone='danger'] {
|
|
66
74
|
--xh-_tone: var(--xh-color-danger-600);
|
|
67
|
-
--xh-_tone-soft: var(--xh-color-danger-500);
|
|
68
75
|
--xh-_tone-on: var(--xh-color-neutral-0);
|
|
69
76
|
--xh-_tone-shift: var(--xh-color-neutral-950);
|
|
70
77
|
}
|
|
71
78
|
|
|
72
79
|
[data-tone='success'] {
|
|
73
80
|
--xh-_tone: var(--xh-color-success-600);
|
|
74
|
-
--xh-_tone-soft: var(--xh-color-success-500);
|
|
75
81
|
--xh-_tone-on: var(--xh-color-neutral-950);
|
|
76
82
|
--xh-_tone-shift: var(--xh-color-neutral-0);
|
|
77
83
|
}
|
|
78
84
|
|
|
79
85
|
[data-tone='warning'] {
|
|
80
86
|
--xh-_tone: var(--xh-color-warning-600);
|
|
81
|
-
--xh-_tone-soft: var(--xh-color-warning-500);
|
|
82
87
|
--xh-_tone-on: var(--xh-color-neutral-950);
|
|
83
88
|
--xh-_tone-shift: var(--xh-color-neutral-0);
|
|
84
89
|
}
|
|
85
90
|
|
|
86
91
|
[data-tone='info'] {
|
|
87
92
|
--xh-_tone: var(--xh-color-info-600);
|
|
88
|
-
--xh-_tone-soft: var(--xh-color-info-500);
|
|
89
93
|
--xh-_tone-on: var(--xh-color-neutral-950);
|
|
90
94
|
--xh-_tone-shift: var(--xh-color-neutral-0);
|
|
91
95
|
}
|
|
@@ -109,4 +113,30 @@
|
|
|
109
113
|
:is([data-theme='dark'] *, [data-theme='dark'])[data-tone='neutral'] {
|
|
110
114
|
--xh-_tone-border-control: var(--xh-color-neutral-550);
|
|
111
115
|
}
|
|
116
|
+
|
|
117
|
+
/* 把语气色转成线性 sRGB 分量、按 WCAG 的权重算出相对亮度:低于 0.179 前景取白、
|
|
118
|
+
高于取黑,挪动方向取前景的反面。三个通道写同一个式子,算出来的是纯白或纯黑;
|
|
119
|
+
alpha 显式写 1,不然会连语气色的透明度一起继承过来。
|
|
120
|
+
探针按这里实际用到的整个形态测,只测得起 color(from …) 的引擎不会落进半截支持。
|
|
121
|
+
上面各族写死的那一份是兜底:引擎不认这条语法时整块丢弃,退回那一份 */
|
|
122
|
+
@supports (color: color(from red srgb-linear clamp(0, (0.179 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * infinity, 1) 0 0 / 1)) {
|
|
123
|
+
[data-tone] {
|
|
124
|
+
--xh-_tone-on: color(from var(--xh-_tone) srgb-linear
|
|
125
|
+
clamp(0, (0.179 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * infinity, 1)
|
|
126
|
+
clamp(0, (0.179 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * infinity, 1)
|
|
127
|
+
clamp(0, (0.179 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) * infinity, 1) / 1);
|
|
128
|
+
--xh-_tone-shift: color(from var(--xh-_tone) srgb-linear
|
|
129
|
+
clamp(0, ((0.2126 * r + 0.7152 * g + 0.0722 * b) - 0.179) * infinity, 1)
|
|
130
|
+
clamp(0, ((0.2126 * r + 0.7152 * g + 0.0722 * b) - 0.179) * infinity, 1)
|
|
131
|
+
clamp(0, ((0.2126 * r + 0.7152 * g + 0.0722 * b) - 0.179) * infinity, 1) / 1);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* brand 的底与前景走语义令牌、随主题翻,所以它的 shift 也必须跟着翻,
|
|
136
|
+
否则深色下前景是深字而 shift 仍往深处挪,悬停与按下反而压低对比度
|
|
137
|
+
(实测 5.29 → 4.25 → 3.49,而不写 tone 的品牌链是 5.29 → 7.33 → 10.85)。
|
|
138
|
+
其余五族的底是固定原语、不随主题翻,shift 也就不必翻 */
|
|
139
|
+
:is([data-theme='dark'] *, [data-theme='dark'])[data-tone='brand'] {
|
|
140
|
+
--xh-_tone-shift: var(--xh-color-neutral-0);
|
|
141
|
+
}
|
|
112
142
|
}
|
package/css/tooltip.css
CHANGED
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
箭头是它的后代,语气槽一并继承 */
|
|
70
70
|
--xh-_tooltip-py: var(--xh-space-1);
|
|
71
71
|
--xh-_tooltip-px: var(--xh-space-2);
|
|
72
|
-
--xh-_tooltip-font-size: var(--xh-
|
|
72
|
+
--xh-_tooltip-font-size: var(--xh-control-caption-md);
|
|
73
73
|
|
|
74
74
|
/* 与 positioner 相反:浮层本体要能接指针,指针停在提示上就不该收起
|
|
75
75
|
(长文案需要停留细看)。positioner 仍是 none,空白区域照样点得穿。 */
|
|
@@ -127,4 +127,10 @@
|
|
|
127
127
|
|
|
128
128
|
background: var(--xh-tooltip-bg, var(--xh-_tone, var(--xh-fg-default)));
|
|
129
129
|
}
|
|
130
|
+
|
|
131
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
132
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
133
|
+
[data-scope='tooltip'][data-part='trigger'][hidden] {
|
|
134
|
+
display: none;
|
|
135
|
+
}
|
|
130
136
|
}
|
package/css/tour.css
CHANGED
|
@@ -87,6 +87,12 @@
|
|
|
87
87
|
color: var(--xh-tour-fg, var(--xh-fg-default));
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
/* 浮层被搬到 portal 落点,继承不到 root 上的槽:这把尺在被搬走的那一侧再声明一次,
|
|
91
|
+
关闭钮与条目里作者塞的图标才和皮肤画的兜底字形一样大 */
|
|
92
|
+
[data-scope='tour'][data-part='content'] {
|
|
93
|
+
--xh-icon-size: var(--xh-tour-icon-size, var(--xh-glyph-size-text));
|
|
94
|
+
}
|
|
95
|
+
|
|
90
96
|
/* 遮罩:整页压暗,把注意力逼到高亮框那一块上 */
|
|
91
97
|
[data-scope='tour'][data-part='backdrop'] {
|
|
92
98
|
position: fixed;
|
|
@@ -165,7 +171,7 @@
|
|
|
165
171
|
display: flex;
|
|
166
172
|
align-items: center;
|
|
167
173
|
justify-content: center;
|
|
168
|
-
padding: var(--xh-space-4);
|
|
174
|
+
padding: var(--xh-tour-positioner-padding, var(--xh-space-4));
|
|
169
175
|
}
|
|
170
176
|
|
|
171
177
|
/* 必须排在 data-position='center' 之后:两条选择器的特指度相同(都是三个属性),
|
|
@@ -246,9 +252,9 @@
|
|
|
246
252
|
align-items: center;
|
|
247
253
|
justify-content: center;
|
|
248
254
|
block-size: var(--xh-control-h-sm);
|
|
249
|
-
padding-inline: var(--xh-control-px-md);
|
|
255
|
+
padding-inline: var(--xh-tour-skip-trigger-px, var(--xh-control-px-md));
|
|
250
256
|
border: var(--xh-stroke-thin) solid transparent;
|
|
251
|
-
border-radius: var(--xh-shape-control);
|
|
257
|
+
border-radius: var(--xh-tour-action-radius, var(--xh-shape-control));
|
|
252
258
|
font-size: var(--xh-text-secondary-size);
|
|
253
259
|
cursor: pointer;
|
|
254
260
|
}
|
package/css/transfer.css
CHANGED
|
@@ -130,6 +130,7 @@
|
|
|
130
130
|
display: flex;
|
|
131
131
|
flex: 1 1 auto;
|
|
132
132
|
flex-direction: column;
|
|
133
|
+
gap: var(--xh-transfer-list-gap, var(--xh-list-option-gap));
|
|
133
134
|
block-size: var(--xh-transfer-list-h, var(--xh-viewport-h-md));
|
|
134
135
|
padding-block: var(--xh-transfer-list-py, var(--xh-space-1));
|
|
135
136
|
padding-inline: var(--xh-transfer-list-px, var(--xh-space-1));
|
|
@@ -222,8 +223,7 @@
|
|
|
222
223
|
}
|
|
223
224
|
|
|
224
225
|
/* 没写内容就由皮肤画勾;作者往格子里塞了自己的图形,这条规则即不命中。
|
|
225
|
-
|
|
226
|
-
而触发器里装的是全选那行文字,:empty 恒不命中,加了勾号会整个消失 */
|
|
226
|
+
底下两处(全选格的两态)不带这条守卫:触发器里装的是全选那行文字,:empty 恒不命中 */
|
|
227
227
|
[data-scope='transfer'][data-part='item-checkbox'][data-state='checked']:empty::before {
|
|
228
228
|
content: '';
|
|
229
229
|
display: inline-block;
|
|
@@ -236,25 +236,47 @@
|
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
/* 全选格的三态:all 打勾、some 打横杠、none 留空。
|
|
239
|
-
some 就是读屏听到的 aria-checked=mixed,两者同源,样式只认 data-state
|
|
240
|
-
|
|
239
|
+
some 就是读屏听到的 aria-checked=mixed,两者同源,样式只认 data-state。
|
|
240
|
+
|
|
241
|
+
字形走 ::after 而不是画方框的那颗 ::before:mask 会把所在元素的描边与底色一并裁成
|
|
242
|
+
字形的轮廓,写在 ::before 上就等于把方框本身裁没了,只剩一枚白勾。条目那一侧是
|
|
243
|
+
真实节点当方框、它的 ::before 当字形的两层结构,这里没有第二个节点,只能用
|
|
244
|
+
第二个伪元素补上那一层。
|
|
245
|
+
方框是行首那颗 ::before、宽度即勾选格尺寸,所以字形按「盒与字形的宽度差之半」
|
|
246
|
+
内推即落在圆心;纵向靠 inset-block: 0 + margin-block: auto 居中。
|
|
247
|
+
font-size 与 ::before 同值,--xh-icon-size 的 1em 兜底才和条目那侧量得一样大 */
|
|
248
|
+
[data-scope='transfer'][data-part='select-all-trigger'][data-state='checked']::after {
|
|
241
249
|
content: '';
|
|
242
|
-
|
|
250
|
+
position: absolute;
|
|
251
|
+
inset-block: 0;
|
|
252
|
+
inset-inline-start: 0;
|
|
253
|
+
margin-block: auto;
|
|
254
|
+
margin-inline-start: calc(
|
|
255
|
+
(var(--xh-transfer-checkbox-size, var(--xh-control-indicator-size)) - var(--xh-icon-size, var(--xh-glyph-size-text))) /
|
|
256
|
+
2
|
|
257
|
+
);
|
|
243
258
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
244
259
|
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
245
|
-
|
|
246
|
-
|
|
260
|
+
background-color: var(--xh-transfer-checkbox-fg, var(--xh-fg-on-brand));
|
|
261
|
+
font-size: var(--xh-transfer-checkbox-font-size, calc(var(--xh-control-indicator-size) * 0.75));
|
|
247
262
|
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
248
263
|
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
249
264
|
}
|
|
250
265
|
|
|
251
|
-
[data-scope='transfer'][data-part='select-all-trigger'][data-state='indeterminate']::
|
|
266
|
+
[data-scope='transfer'][data-part='select-all-trigger'][data-state='indeterminate']::after {
|
|
252
267
|
content: '';
|
|
253
|
-
|
|
268
|
+
position: absolute;
|
|
269
|
+
inset-block: 0;
|
|
270
|
+
inset-inline-start: 0;
|
|
271
|
+
margin-block: auto;
|
|
272
|
+
margin-inline-start: calc(
|
|
273
|
+
(var(--xh-transfer-checkbox-size, var(--xh-control-indicator-size)) - var(--xh-icon-size, var(--xh-glyph-size-text))) /
|
|
274
|
+
2
|
|
275
|
+
);
|
|
254
276
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
255
277
|
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
256
|
-
|
|
257
|
-
|
|
278
|
+
background-color: var(--xh-transfer-checkbox-fg, var(--xh-fg-on-brand));
|
|
279
|
+
font-size: var(--xh-transfer-checkbox-font-size, calc(var(--xh-control-indicator-size) * 0.75));
|
|
258
280
|
-webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
259
281
|
mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
260
282
|
}
|
|
@@ -266,7 +288,9 @@
|
|
|
266
288
|
|
|
267
289
|
/* 全选格是原生按钮(三态经 aria-checked 上报,激活由平台负责),
|
|
268
290
|
禁用因此写 :disabled,不写 data-disabled */
|
|
291
|
+
/* position 是给叠在方框上的那颗字形 ::after 当定位基准 */
|
|
269
292
|
[data-scope='transfer'][data-part='select-all-trigger'] {
|
|
293
|
+
position: relative;
|
|
270
294
|
display: inline-flex;
|
|
271
295
|
flex: none;
|
|
272
296
|
gap: var(--xh-transfer-select-all-gap, var(--xh-control-gap-sm));
|
|
@@ -282,9 +306,11 @@
|
|
|
282
306
|
cursor: pointer;
|
|
283
307
|
}
|
|
284
308
|
|
|
309
|
+
/* 往内收,与搜索框、条目同一口径:全选格长在面板里,面板收 overflow,
|
|
310
|
+
环画在外沿会被裁掉 */
|
|
285
311
|
[data-scope='transfer'][data-part='select-all-trigger']:focus-visible {
|
|
286
312
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
287
|
-
outline-offset: var(--xh-ring-
|
|
313
|
+
outline-offset: calc(-1 * var(--xh-ring-width));
|
|
288
314
|
}
|
|
289
315
|
|
|
290
316
|
[data-scope='transfer'][data-part='select-all-trigger']:disabled {
|
package/css/tree-select.css
CHANGED
|
@@ -37,6 +37,9 @@
|
|
|
37
37
|
引擎没算(尚未落位 / 无引擎)时不额外限高 */
|
|
38
38
|
--xh-_tree-select-available-h: 100vh;
|
|
39
39
|
|
|
40
|
+
/* 树的自绘条浮在内容之上:轨道不上底色,实色轨道会沿内容边缘糊出一条灰带 */
|
|
41
|
+
--xh-scrollbar-track-bg: transparent;
|
|
42
|
+
|
|
40
43
|
position: fixed;
|
|
41
44
|
z-index: var(--xh-tree-select-layer, var(--xh-layer-popover));
|
|
42
45
|
/* 空壳不吃指针,交互只发生在 content 里 */
|
|
@@ -56,9 +59,11 @@
|
|
|
56
59
|
/* 尺寸档只换这几个私有槽,盒与树里的行都从这两处继承它们,换档不必给每个部件各写一条选择器 */
|
|
57
60
|
--xh-_tree-select-h: var(--xh-control-h-md);
|
|
58
61
|
--xh-_tree-select-px: var(--xh-control-px-md);
|
|
62
|
+
--xh-_tree-select-row-py: var(--xh-list-option-py-md);
|
|
63
|
+
--xh-_tree-select-row-px: var(--xh-control-px-md);
|
|
59
64
|
--xh-_tree-select-gap: var(--xh-control-gap-md);
|
|
60
|
-
--xh-_tree-select-font-size: var(--xh-
|
|
61
|
-
--xh-_tree-select-label-font-size: var(--xh-
|
|
65
|
+
--xh-_tree-select-font-size: var(--xh-control-font-md);
|
|
66
|
+
--xh-_tree-select-label-font-size: var(--xh-control-font-md);
|
|
62
67
|
|
|
63
68
|
/* 形态档只换触发框的描边与底色这三个槽,浮层与树不跟着变:
|
|
64
69
|
变的是「这是个输入位」的表达方式,不是弹出内容的表达方式 */
|
|
@@ -114,6 +119,8 @@
|
|
|
114
119
|
--xh-icon-size: var(--xh-tree-select-icon-size, var(--xh-glyph-size-sm));
|
|
115
120
|
--xh-_tree-select-h: var(--xh-control-h-sm);
|
|
116
121
|
--xh-_tree-select-px: var(--xh-control-px-sm);
|
|
122
|
+
--xh-_tree-select-row-py: var(--xh-list-option-py-sm);
|
|
123
|
+
--xh-_tree-select-row-px: var(--xh-control-px-sm);
|
|
117
124
|
--xh-_tree-select-gap: var(--xh-control-gap-sm);
|
|
118
125
|
--xh-_tree-select-font-size: var(--xh-control-font-sm);
|
|
119
126
|
--xh-_tree-select-label-font-size: var(--xh-control-font-sm);
|
|
@@ -123,6 +130,8 @@
|
|
|
123
130
|
--xh-icon-size: var(--xh-tree-select-icon-size, var(--xh-glyph-size-lg));
|
|
124
131
|
--xh-_tree-select-h: var(--xh-control-h-lg);
|
|
125
132
|
--xh-_tree-select-px: var(--xh-control-px-lg);
|
|
133
|
+
--xh-_tree-select-row-py: var(--xh-list-option-py-lg);
|
|
134
|
+
--xh-_tree-select-row-px: var(--xh-control-px-lg);
|
|
126
135
|
--xh-_tree-select-gap: var(--xh-control-gap-lg);
|
|
127
136
|
--xh-_tree-select-font-size: var(--xh-control-font-lg);
|
|
128
137
|
--xh-_tree-select-label-font-size: var(--xh-control-font-lg);
|
|
@@ -352,6 +361,7 @@
|
|
|
352
361
|
[data-scope='tree-select'][data-part='tree'] {
|
|
353
362
|
display: flex;
|
|
354
363
|
flex-direction: column;
|
|
364
|
+
gap: var(--xh-tree-select-tree-gap, var(--xh-list-option-gap));
|
|
355
365
|
}
|
|
356
366
|
|
|
357
367
|
[data-scope='tree-select'][data-part='tree'][hidden] {
|
|
@@ -369,6 +379,20 @@
|
|
|
369
379
|
outline: none;
|
|
370
380
|
}
|
|
371
381
|
|
|
382
|
+
/* 分支是"这一行 + 它的子层"的外壳,不自带内边距:真正长成一行的是 branch-control,
|
|
383
|
+
子层缩进归 branch-content。行距由这里出:分支自己那一行与它展开的子层之间,
|
|
384
|
+
同样按条目间距断开 */
|
|
385
|
+
[data-scope='tree-select'][data-part='branch'] {
|
|
386
|
+
display: flex;
|
|
387
|
+
flex-direction: column;
|
|
388
|
+
gap: var(--xh-tree-select-branch-gap, var(--xh-list-option-gap));
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/* display 盖掉了 UA 的 [hidden]{display:none},收起时要显式让位 */
|
|
392
|
+
[data-scope='tree-select'][data-part='branch'][hidden] {
|
|
393
|
+
display: none;
|
|
394
|
+
}
|
|
395
|
+
|
|
372
396
|
/* 焦点落在 branch 上(它才是 treeitem),但环画在它自己那一行上:
|
|
373
397
|
整棵子树套一圈描边会把展开的层级全框进去 */
|
|
374
398
|
[data-scope='tree-select'][data-part='branch']:focus-visible {
|
|
@@ -387,8 +411,8 @@
|
|
|
387
411
|
display: flex;
|
|
388
412
|
align-items: center;
|
|
389
413
|
gap: var(--xh-tree-select-row-gap, var(--xh-_tree-select-gap));
|
|
390
|
-
padding-block: var(--xh-tree-select-row-py, var(--xh-
|
|
391
|
-
padding-inline: var(--xh-tree-select-row-px, var(--xh-
|
|
414
|
+
padding-block: var(--xh-tree-select-row-py, var(--xh-_tree-select-row-py));
|
|
415
|
+
padding-inline: var(--xh-tree-select-row-px, var(--xh-_tree-select-row-px));
|
|
392
416
|
border-radius: var(--xh-tree-select-row-radius, var(--xh-shape-control));
|
|
393
417
|
color: var(--xh-tree-select-row-fg, var(--xh-fg-default));
|
|
394
418
|
font-size: var(--xh-tree-select-row-font-size, var(--xh-_tree-select-font-size));
|
|
@@ -452,7 +476,7 @@
|
|
|
452
476
|
align-items: center;
|
|
453
477
|
justify-content: center;
|
|
454
478
|
inline-size: var(--xh-tree-select-indicator-size, var(--xh-control-indicator-size));
|
|
455
|
-
color: var(--xh-tree-select-item-indicator-fg, var(--xh-_tone, var(--xh-
|
|
479
|
+
color: var(--xh-tree-select-item-indicator-fg, var(--xh-_tone, var(--xh-fg-brand)));
|
|
456
480
|
visibility: hidden;
|
|
457
481
|
}
|
|
458
482
|
|
|
@@ -513,6 +537,7 @@
|
|
|
513
537
|
[data-scope='tree-select'][data-part='branch-content'] {
|
|
514
538
|
display: flex;
|
|
515
539
|
flex-direction: column;
|
|
540
|
+
gap: var(--xh-tree-select-branch-content-gap, var(--xh-list-option-gap));
|
|
516
541
|
padding-inline-start: var(--xh-tree-select-indent, var(--xh-space-4));
|
|
517
542
|
}
|
|
518
543
|
|
package/css/tree.css
CHANGED
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
[data-scope='tree'][data-part='tree'] {
|
|
34
34
|
display: flex;
|
|
35
35
|
flex-direction: column;
|
|
36
|
+
gap: var(--xh-tree-tree-gap, var(--xh-list-option-gap));
|
|
36
37
|
max-block-size: var(--xh-tree-max-h, var(--xh-viewport-h-lg));
|
|
37
38
|
padding-block: var(--xh-tree-py, var(--xh-space-1));
|
|
38
39
|
padding-inline: var(--xh-tree-px, var(--xh-space-1));
|
|
@@ -54,8 +55,15 @@
|
|
|
54
55
|
outline: none;
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
/* 分支只是"这一行 + 它的子层"
|
|
58
|
-
真正长成一行的是 branch-control,子层缩进归 branch-content
|
|
58
|
+
/* 分支只是"这一行 + 它的子层"的外壳,不自带内边距:
|
|
59
|
+
真正长成一行的是 branch-control,子层缩进归 branch-content。
|
|
60
|
+
行距由这里出:分支自己那一行与它展开的子层之间,同样按条目间距断开 */
|
|
61
|
+
[data-scope='tree'][data-part='branch'] {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex-direction: column;
|
|
64
|
+
gap: var(--xh-tree-branch-gap, var(--xh-list-option-gap));
|
|
65
|
+
}
|
|
66
|
+
|
|
59
67
|
[data-scope='tree'][data-part='branch'][hidden] {
|
|
60
68
|
display: none;
|
|
61
69
|
}
|
|
@@ -78,7 +86,7 @@
|
|
|
78
86
|
display: flex;
|
|
79
87
|
align-items: center;
|
|
80
88
|
gap: var(--xh-tree-row-gap, var(--xh-control-gap-md));
|
|
81
|
-
padding-block: var(--xh-tree-row-py, var(--xh-
|
|
89
|
+
padding-block: var(--xh-tree-row-py, var(--xh-list-option-py-md));
|
|
82
90
|
padding-inline: var(--xh-tree-row-px, var(--xh-control-px-md));
|
|
83
91
|
border-radius: var(--xh-tree-row-radius, var(--xh-shape-control));
|
|
84
92
|
color: var(--xh-tree-row-fg, var(--xh-fg-default));
|
|
@@ -93,6 +101,19 @@
|
|
|
93
101
|
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
94
102
|
}
|
|
95
103
|
|
|
104
|
+
/* 分支行的首格是展开箭头,叶子行没有这一格。作者摆了 item-indicator 时由它顶着,
|
|
105
|
+
没摆(如勾选档首位直接是 item-checkbox)就由行盒自己补出来,
|
|
106
|
+
否则叶子会比同级分支往行首缩一格,层级关系读不出来 */
|
|
107
|
+
[data-orientation='vertical'] > [data-scope='tree'][data-part='item']:not(
|
|
108
|
+
:has(> [data-scope='tree'][data-part='item-indicator'])
|
|
109
|
+
) {
|
|
110
|
+
padding-inline-start: calc(
|
|
111
|
+
var(--xh-tree-row-px, var(--xh-control-px-md)) +
|
|
112
|
+
var(--xh-tree-indicator-size, var(--xh-control-indicator-size)) +
|
|
113
|
+
var(--xh-tree-row-gap, var(--xh-control-gap-md))
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
96
117
|
[data-scope='tree'][data-part='item'][hidden],
|
|
97
118
|
[data-scope='tree'][data-part='branch-control'][hidden] {
|
|
98
119
|
display: none;
|
|
@@ -201,7 +222,7 @@
|
|
|
201
222
|
align-items: center;
|
|
202
223
|
justify-content: center;
|
|
203
224
|
inline-size: var(--xh-tree-indicator-size, var(--xh-control-indicator-size));
|
|
204
|
-
color: var(--xh-tree-indicator-fg, var(--xh-
|
|
225
|
+
color: var(--xh-tree-indicator-fg, var(--xh-fg-brand));
|
|
205
226
|
visibility: hidden;
|
|
206
227
|
}
|
|
207
228
|
|
|
@@ -262,9 +283,24 @@
|
|
|
262
283
|
[data-scope='tree'][data-part='branch-content'] {
|
|
263
284
|
display: flex;
|
|
264
285
|
flex-direction: column;
|
|
286
|
+
gap: var(--xh-tree-branch-content-gap, var(--xh-list-option-gap));
|
|
265
287
|
padding-inline-start: var(--xh-tree-indent, var(--xh-space-4));
|
|
266
288
|
}
|
|
267
289
|
|
|
290
|
+
/* 末端那一层横排:子节点并排铺开、必要时折行。缩进照旧由子层容器自己顶——
|
|
291
|
+
那是这一层相对上一层的位置,与层内怎么排无关 */
|
|
292
|
+
[data-scope='tree'][data-part='branch-content'][data-orientation='horizontal'] {
|
|
293
|
+
flex-flow: row wrap;
|
|
294
|
+
align-items: center;
|
|
295
|
+
column-gap: var(--xh-tree-leaf-row-gap, var(--xh-space-3));
|
|
296
|
+
row-gap: var(--xh-tree-branch-content-gap, var(--xh-list-option-gap));
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/* 横排的一层里节点并排,行盒不能再各自吃满一行 */
|
|
300
|
+
[data-orientation='horizontal'] > [data-scope='tree'][data-part='item'] {
|
|
301
|
+
flex: none;
|
|
302
|
+
}
|
|
303
|
+
|
|
268
304
|
/* 收起态的唯一开关:display 会盖掉 hidden 属性的 UA 规则,漏了这条整棵子树就收不起来 */
|
|
269
305
|
[data-scope='tree'][data-part='branch-content'][hidden] {
|
|
270
306
|
display: none;
|
|
@@ -293,4 +329,10 @@
|
|
|
293
329
|
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
294
330
|
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
295
331
|
}
|
|
332
|
+
|
|
333
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
334
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
335
|
+
[data-scope='tree'][data-part='branch-checkbox'][hidden] {
|
|
336
|
+
display: none;
|
|
337
|
+
}
|
|
296
338
|
}
|
package/css/typography.css
CHANGED
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
padding-inline: var(--xh-typography-code-px, var(--xh-space-1));
|
|
126
126
|
border-radius: var(--xh-typography-code-radius, var(--xh-shape-inset));
|
|
127
127
|
background: var(--xh-typography-code-bg, var(--xh-bg-subtle));
|
|
128
|
-
font-family: var(--xh-font-family-mono);
|
|
128
|
+
font-family: var(--xh-typography-code-font, var(--xh-font-family-mono));
|
|
129
129
|
font-size: var(--xh-typography-code-font-size, var(--xh-_typography-code-size));
|
|
130
130
|
}
|
|
131
131
|
|
package/css/undefined.css
CHANGED
package/index.css
CHANGED
|
@@ -94,6 +94,7 @@
|
|
|
94
94
|
@import './css/menu.css';
|
|
95
95
|
@import './css/menubar.css';
|
|
96
96
|
@import './css/navigation-menu.css';
|
|
97
|
+
@import './css/notification.css';
|
|
97
98
|
@import './css/number-field.css';
|
|
98
99
|
@import './css/pagination.css';
|
|
99
100
|
@import './css/pin-input.css';
|
|
@@ -118,7 +119,6 @@
|
|
|
118
119
|
@import './css/time-field.css';
|
|
119
120
|
@import './css/time-picker.css';
|
|
120
121
|
@import './css/toast.css';
|
|
121
|
-
@import './css/toaster.css';
|
|
122
122
|
@import './css/toggle.css';
|
|
123
123
|
@import './css/toggle-group.css';
|
|
124
124
|
@import './css/toolbar.css';
|