@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/accordion.css
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
--xh-_accordion-trigger-h: var(--xh-control-h-md);
|
|
13
13
|
--xh-_accordion-trigger-px: var(--xh-control-px-md);
|
|
14
14
|
--xh-_accordion-trigger-gap: var(--xh-control-gap-md);
|
|
15
|
-
--xh-_accordion-trigger-font-size: var(--xh-
|
|
15
|
+
--xh-_accordion-trigger-font-size: var(--xh-control-font-md);
|
|
16
16
|
|
|
17
17
|
/* 语气落在展开着的标题上,指示器写在标题里、跟着继承这个色,不另立规则。
|
|
18
18
|
没写 data-tone 时 --xh-_tone-fg 没被声明,退回原来的前景色。
|
|
@@ -45,10 +45,25 @@
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
[data-scope='accordion'][data-part='item'] {
|
|
48
|
-
border-block-end: var(--xh-stroke-thin) solid var(--xh-accordion-item-border, var(--xh-border-default));
|
|
49
48
|
min-inline-size: 0;
|
|
50
49
|
}
|
|
51
50
|
|
|
51
|
+
/* 分隔线画在后一条的起始边,条与条之间才只有一条,末条也不会留一条悬空线
|
|
52
|
+
(根没有外框接住它)。只认自己的直接子条目:套在条目里的另一份手风琴由它自己的根管。
|
|
53
|
+
横排时换成行内轴那一侧 */
|
|
54
|
+
[data-scope='accordion'][data-part='root']
|
|
55
|
+
> [data-scope='accordion'][data-part='item']
|
|
56
|
+
+ [data-scope='accordion'][data-part='item'] {
|
|
57
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-accordion-item-border, var(--xh-border-subtle));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[data-scope='accordion'][data-part='root'][data-orientation='horizontal']
|
|
61
|
+
> [data-scope='accordion'][data-part='item']
|
|
62
|
+
+ [data-scope='accordion'][data-part='item'] {
|
|
63
|
+
border-block-start: 0;
|
|
64
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-accordion-item-border, var(--xh-border-subtle));
|
|
65
|
+
}
|
|
66
|
+
|
|
52
67
|
[data-scope='accordion'][data-part='header'] {
|
|
53
68
|
margin: 0;
|
|
54
69
|
font: inherit;
|
|
@@ -161,4 +176,12 @@
|
|
|
161
176
|
padding-block: 0;
|
|
162
177
|
}
|
|
163
178
|
}
|
|
179
|
+
|
|
180
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
181
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
182
|
+
[data-scope='accordion'][data-part='root'][hidden],
|
|
183
|
+
[data-scope='accordion'][data-part='trigger'][hidden],
|
|
184
|
+
[data-scope='accordion'][data-part='indicator'][hidden] {
|
|
185
|
+
display: none;
|
|
186
|
+
}
|
|
164
187
|
}
|
package/css/alert.css
CHANGED
|
@@ -8,13 +8,11 @@
|
|
|
8
8
|
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
9
9
|
--xh-icon-size: var(--xh-alert-icon-size, var(--xh-glyph-size-text));
|
|
10
10
|
|
|
11
|
-
/*
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
--xh-_alert-tint: color-mix(in oklab, var(--xh-_alert-accent) 12%, var(--xh-bg-surface));
|
|
17
|
-
--xh-_alert-edge: color-mix(in oklab, var(--xh-_alert-accent) 32%, var(--xh-bg-surface));
|
|
11
|
+
/* 底色、描边、图标色一律取语气层派生好的槽:连接层给 alert 兜了 tone=info 的缺省,
|
|
12
|
+
data-tone 恒在,语气层的槽也就恒被声明。此前这里自己又兑了一遍(12% / 32%),
|
|
13
|
+
与语气层的公式差一档,图标压上去只有 1.79–2.47 */
|
|
14
|
+
--xh-_alert-tint: var(--xh-_tone-subtle);
|
|
15
|
+
--xh-_alert-edge: var(--xh-_tone-border);
|
|
18
16
|
|
|
19
17
|
display: flex;
|
|
20
18
|
/* 说明用 flex: 1 1 100% 独占一行,容器不换行的话它只会挤在标题旁边 */
|
|
@@ -44,8 +42,8 @@
|
|
|
44
42
|
flex: none;
|
|
45
43
|
/* 与首行文字对齐:图标框高取一行正文的行高 */
|
|
46
44
|
block-size: calc(var(--xh-text-body-size) * var(--xh-leading-normal));
|
|
47
|
-
inline-size: var(--xh-alert-icon-
|
|
48
|
-
color: var(--xh-alert-icon-fg, var(--xh-
|
|
45
|
+
inline-size: var(--xh-alert-icon-box, var(--xh-control-indicator-size));
|
|
46
|
+
color: var(--xh-alert-icon-fg, var(--xh-_tone-fg));
|
|
49
47
|
}
|
|
50
48
|
|
|
51
49
|
/* 标题与说明摞成一列,占满 root 剩下的横向空间,
|
|
@@ -135,4 +133,10 @@
|
|
|
135
133
|
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
136
134
|
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
137
135
|
}
|
|
136
|
+
|
|
137
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
138
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
139
|
+
[data-scope='alert'][data-part='icon'][hidden] {
|
|
140
|
+
display: none;
|
|
141
|
+
}
|
|
138
142
|
}
|
package/css/anchor.css
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
|
|
9
9
|
[data-scope='anchor'][data-part='root'] {
|
|
10
10
|
/* 尺寸档只换这两个私有槽,链接从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
11
|
-
--xh-_anchor-font-size: var(--xh-
|
|
11
|
+
--xh-_anchor-font-size: var(--xh-control-font-md);
|
|
12
12
|
--xh-_anchor-link-px: var(--xh-control-px-md);
|
|
13
13
|
/* 当前那一节的指示条与文字随语气走。没写 data-tone 时这两个槽都没被声明,退回原来的品牌色。
|
|
14
14
|
指示条是装饰性的色条,取柔和档;文字要压在普通背景上读,取语气的文字档。
|
package/css/avatar-group.css
CHANGED
|
@@ -7,9 +7,13 @@
|
|
|
7
7
|
/* 一排叠放的头像:后一枚压在前一枚上。
|
|
8
8
|
组内共用的直径与字号在容器上写一次,沿继承流给每一枚;自己写了档位的那一枚仍按自己的档走 */
|
|
9
9
|
[data-scope='avatar-group'][data-part='root'] {
|
|
10
|
+
/* 组件内那几档层号只在自己人之间排序:建一个层叠上下文把它们关起来,
|
|
11
|
+
既不让页面上的层号插进来,也不让它们漏出去压住别人 */
|
|
12
|
+
isolation: isolate;
|
|
13
|
+
|
|
10
14
|
/* 私有槽位:整组共用的直径、字号与叠放量,换档只改这三个 */
|
|
11
15
|
--xh-_avatar-group-size: var(--xh-avatar-group-size, var(--xh-control-h-md));
|
|
12
|
-
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-
|
|
16
|
+
--xh-_avatar-group-font-size: var(--xh-avatar-group-font-size, var(--xh-control-caption-md));
|
|
13
17
|
--xh-_avatar-group-overlap: var(--xh-avatar-group-overlap, var(--xh-space-2_5));
|
|
14
18
|
|
|
15
19
|
/* 流给组内每一枚 */
|
package/css/avatar.css
CHANGED
|
@@ -57,4 +57,10 @@
|
|
|
57
57
|
[data-scope='avatar'][data-part='fallback'][hidden] {
|
|
58
58
|
display: none;
|
|
59
59
|
}
|
|
60
|
+
|
|
61
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
62
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
63
|
+
[data-scope='avatar'][data-part='root'][hidden] {
|
|
64
|
+
display: none;
|
|
65
|
+
}
|
|
60
66
|
}
|
package/css/back-top.css
CHANGED
|
@@ -78,4 +78,10 @@
|
|
|
78
78
|
-webkit-mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
|
|
79
79
|
mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
|
|
80
80
|
}
|
|
81
|
+
|
|
82
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
83
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
84
|
+
[data-scope='back-top'][data-part='trigger'][hidden] {
|
|
85
|
+
display: none;
|
|
86
|
+
}
|
|
81
87
|
}
|
package/css/badge.css
CHANGED
|
@@ -4,66 +4,124 @@
|
|
|
4
4
|
--xh-badge-skin: 1;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
+
/* 锚点:被标记的那个东西(按钮、头像、标签页)放进它里面。
|
|
8
|
+
角标绝对定位在它的角上,所以这一层必须建定位上下文,且不能自己撑出尺寸 */
|
|
7
9
|
[data-scope='badge'][data-part='root'] {
|
|
10
|
+
position: relative;
|
|
11
|
+
display: inline-flex;
|
|
12
|
+
/* 角标探出宿主边界是常态,不能被裁掉 */
|
|
13
|
+
overflow: visible;
|
|
14
|
+
vertical-align: middle;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* 锚点也可能被作者整块收起 */
|
|
18
|
+
[data-scope='badge'][data-part='root'][hidden] {
|
|
19
|
+
display: none;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* 角标本身。档位换的是圆点直径、两位数时的最小宽度与字号——
|
|
23
|
+
不是药丸那套内衬与行高:那是 tag 的活 */
|
|
24
|
+
[data-scope='badge'][data-part='indicator'] {
|
|
25
|
+
/* 每一档的盒都要大于字号:两位数在等高的盒里会被撑破。
|
|
26
|
+
字号刻度最小就是 12px,所以往上抬盒子而不是往下压字 */
|
|
27
|
+
--xh-_badge-dot: var(--xh-space-2);
|
|
28
|
+
--xh-_badge-min: var(--xh-space-5);
|
|
29
|
+
--xh-_badge-px: var(--xh-space-1);
|
|
30
|
+
--xh-_badge-font: var(--xh-text-secondary-size);
|
|
31
|
+
|
|
32
|
+
/* 不设 z-index:角标在 DOM 序里排在宿主之后,本来就压在上面 */
|
|
33
|
+
position: absolute;
|
|
8
34
|
display: inline-flex;
|
|
9
35
|
align-items: center;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
36
|
+
justify-content: center;
|
|
37
|
+
box-sizing: border-box;
|
|
38
|
+
min-inline-size: var(--xh-badge-min-size, var(--xh-_badge-min));
|
|
39
|
+
block-size: var(--xh-badge-min-size, var(--xh-_badge-min));
|
|
40
|
+
padding-inline: var(--xh-badge-px, var(--xh-_badge-px));
|
|
41
|
+
border: var(--xh-stroke-thin) solid var(--xh-badge-ring, var(--xh-bg-surface));
|
|
42
|
+
border-radius: var(--xh-badge-radius, var(--xh-shape-pill));
|
|
43
|
+
/* 角标默认就是实心的:贴在别的东西上,淡底与描边都看不清 */
|
|
44
|
+
background: var(--xh-badge-bg, var(--xh-_tone, var(--xh-bg-brand)));
|
|
45
|
+
color: var(--xh-badge-fg, var(--xh-_tone-on, var(--xh-fg-on-brand)));
|
|
46
|
+
font-size: var(--xh-badge-font-size, var(--xh-_badge-font));
|
|
18
47
|
font-weight: var(--xh-badge-font-weight, var(--xh-font-weight-medium));
|
|
19
48
|
line-height: var(--xh-leading-none);
|
|
49
|
+
/* 出的是计数,数字必须等宽:不然 9 跳到 10 时角标的宽度会抖一下 */
|
|
50
|
+
font-variant-numeric: tabular-nums;
|
|
20
51
|
white-space: nowrap;
|
|
52
|
+
pointer-events: none;
|
|
21
53
|
}
|
|
22
54
|
|
|
23
55
|
/* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
24
56
|
计数为 0 且没开 showZero 时连接层会发 hidden */
|
|
25
|
-
[data-scope='badge'][data-part='
|
|
57
|
+
[data-scope='badge'][data-part='indicator'][hidden] {
|
|
26
58
|
display: none;
|
|
27
59
|
}
|
|
28
60
|
|
|
29
61
|
/* 圆点形态:只表示「有」,不表示「有几个」——收掉内边距与文字盒 */
|
|
30
|
-
[data-scope='badge'][data-part='
|
|
31
|
-
inline-size: var(--xh-badge-dot-size, var(--xh-
|
|
32
|
-
|
|
62
|
+
[data-scope='badge'][data-part='indicator'][data-dot] {
|
|
63
|
+
min-inline-size: var(--xh-badge-dot-size, var(--xh-_badge-dot));
|
|
64
|
+
inline-size: var(--xh-badge-dot-size, var(--xh-_badge-dot));
|
|
65
|
+
block-size: var(--xh-badge-dot-size, var(--xh-_badge-dot));
|
|
33
66
|
padding: 0;
|
|
34
67
|
font-size: 0;
|
|
35
68
|
}
|
|
36
69
|
|
|
37
|
-
/* ——
|
|
38
|
-
/*
|
|
39
|
-
[data-scope='badge'][data-part='
|
|
40
|
-
|
|
41
|
-
|
|
70
|
+
/* —— 落点 —— */
|
|
71
|
+
/* 用 inset 的逻辑属性写,rtl 下 end 自动落到左边;translate 让角标压住宿主的角 */
|
|
72
|
+
[data-scope='badge'][data-part='indicator'][data-placement='top-end'] {
|
|
73
|
+
inset-block-start: 0;
|
|
74
|
+
inset-inline-end: 0;
|
|
75
|
+
translate: 50% -50%;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
[data-scope='badge'][data-part='indicator'][data-placement='top-start'] {
|
|
79
|
+
inset-block-start: 0;
|
|
80
|
+
inset-inline-start: 0;
|
|
81
|
+
translate: -50% -50%;
|
|
42
82
|
}
|
|
43
83
|
|
|
44
|
-
[data-scope='badge'][data-part='
|
|
45
|
-
|
|
46
|
-
|
|
84
|
+
[data-scope='badge'][data-part='indicator'][data-placement='bottom-end'] {
|
|
85
|
+
inset-block-end: 0;
|
|
86
|
+
inset-inline-end: 0;
|
|
87
|
+
translate: 50% 50%;
|
|
47
88
|
}
|
|
48
89
|
|
|
49
|
-
[data-scope='badge'][data-part='
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
90
|
+
[data-scope='badge'][data-part='indicator'][data-placement='bottom-start'] {
|
|
91
|
+
inset-block-end: 0;
|
|
92
|
+
inset-inline-start: 0;
|
|
93
|
+
translate: -50% 50%;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* rtl 下 translate 的行内轴要跟着翻,否则角标会往宿主外面跑 */
|
|
97
|
+
[dir='rtl'] [data-scope='badge'][data-part='indicator'][data-placement='top-end'] {
|
|
98
|
+
translate: -50% -50%;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
[dir='rtl'] [data-scope='badge'][data-part='indicator'][data-placement='top-start'] {
|
|
102
|
+
translate: 50% -50%;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
[dir='rtl'] [data-scope='badge'][data-part='indicator'][data-placement='bottom-end'] {
|
|
106
|
+
translate: -50% 50%;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
[dir='rtl'] [data-scope='badge'][data-part='indicator'][data-placement='bottom-start'] {
|
|
110
|
+
translate: 50% 50%;
|
|
53
111
|
}
|
|
54
112
|
|
|
55
113
|
/* —— 尺寸 —— */
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
[data-scope='badge'][data-part='
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
font
|
|
114
|
+
[data-scope='badge'][data-part='indicator'][data-size='sm'] {
|
|
115
|
+
--xh-_badge-dot: var(--xh-space-1_5);
|
|
116
|
+
--xh-_badge-min: var(--xh-space-4);
|
|
117
|
+
--xh-_badge-px: var(--xh-space-0_5);
|
|
118
|
+
--xh-_badge-font: var(--xh-text-caption-size);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
[data-scope='badge'][data-part='indicator'][data-size='lg'] {
|
|
122
|
+
--xh-_badge-dot: var(--xh-space-2_5);
|
|
123
|
+
--xh-_badge-min: var(--xh-space-6);
|
|
124
|
+
--xh-_badge-px: var(--xh-space-1_5);
|
|
125
|
+
--xh-_badge-font: var(--xh-text-body-size);
|
|
68
126
|
}
|
|
69
127
|
}
|
package/css/breadcrumb.css
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
--xh-icon-size: var(--xh-breadcrumb-icon-size, var(--xh-glyph-size-text));
|
|
12
12
|
|
|
13
13
|
/* 尺寸档只换这两个私有槽,列表与链接都从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
14
|
-
--xh-_breadcrumb-font-size: var(--xh-
|
|
14
|
+
--xh-_breadcrumb-font-size: var(--xh-control-font-md);
|
|
15
15
|
--xh-_breadcrumb-gap: var(--xh-space-2);
|
|
16
16
|
/* 当前项与链接悬停的强调色随语气走。没写 data-tone 时 --xh-_tone-fg 没被声明,
|
|
17
17
|
退回原来的前景色。聚焦环不在其列,它恒是 --xh-ring-focus */
|
package/css/button-group.css
CHANGED
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
排布只能读 data-orientation——role=group 不收 aria-orientation,连接层根本不输出它。
|
|
9
9
|
圆角槽位在容器上先收成 0,组内每段都取得到,两端的圆角再逐段补回来 */
|
|
10
10
|
[data-scope='button-group'][data-part='root'] {
|
|
11
|
+
/* 组件内那几档层号只在自己人之间排序:建一个层叠上下文把它们关起来,
|
|
12
|
+
既不让页面上的层号插进来,也不让它们漏出去压住别人 */
|
|
13
|
+
isolation: isolate;
|
|
14
|
+
|
|
11
15
|
--xh-button-radius: 0;
|
|
12
16
|
|
|
13
17
|
display: inline-flex;
|
package/css/button.css
CHANGED
|
@@ -141,4 +141,10 @@
|
|
|
141
141
|
:where([data-motion='reduce']) [data-scope='button'][data-part='indicator'] {
|
|
142
142
|
animation: none;
|
|
143
143
|
}
|
|
144
|
+
|
|
145
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
146
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
147
|
+
[data-scope='button'][data-part='root'][hidden] {
|
|
148
|
+
display: none;
|
|
149
|
+
}
|
|
144
150
|
}
|
package/css/calendar.css
CHANGED
|
@@ -98,33 +98,33 @@
|
|
|
98
98
|
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
[data-scope='calendar'][data-part='prev-year-trigger'],
|
|
101
|
+
[data-scope='calendar'][data-part='prev-year-trigger'][hidden],
|
|
102
102
|
[data-scope='calendar'][data-part='prev-trigger'][hidden],
|
|
103
|
-
[data-scope='calendar'][data-part='next-year-trigger'],
|
|
103
|
+
[data-scope='calendar'][data-part='next-year-trigger'][hidden],
|
|
104
104
|
[data-scope='calendar'][data-part='next-trigger'][hidden] {
|
|
105
105
|
display: none;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
[data-scope='calendar'][data-part='prev-year-trigger'],
|
|
108
|
+
[data-scope='calendar'][data-part='prev-year-trigger']:hover:not(:disabled),
|
|
109
109
|
[data-scope='calendar'][data-part='prev-trigger']:hover:not(:disabled),
|
|
110
|
-
[data-scope='calendar'][data-part='next-year-trigger'],
|
|
110
|
+
[data-scope='calendar'][data-part='next-year-trigger']:hover:not(:disabled),
|
|
111
111
|
[data-scope='calendar'][data-part='next-trigger']:hover:not(:disabled) {
|
|
112
112
|
background: var(--xh-calendar-nav-bg-hover, var(--xh-bg-subtle-hover));
|
|
113
113
|
color: var(--xh-fg-default);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
/* 翻月是单体控件,禁用走原生 :disabled(连接层输出的正是原生 disabled) */
|
|
117
|
-
[data-scope='calendar'][data-part='prev-year-trigger'],
|
|
117
|
+
[data-scope='calendar'][data-part='prev-year-trigger']:disabled,
|
|
118
118
|
[data-scope='calendar'][data-part='prev-trigger']:disabled,
|
|
119
|
-
[data-scope='calendar'][data-part='next-year-trigger'],
|
|
119
|
+
[data-scope='calendar'][data-part='next-year-trigger']:disabled,
|
|
120
120
|
[data-scope='calendar'][data-part='next-trigger']:disabled {
|
|
121
121
|
color: var(--xh-fg-disabled);
|
|
122
122
|
cursor: not-allowed;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
[data-scope='calendar'][data-part='prev-year-trigger'],
|
|
125
|
+
[data-scope='calendar'][data-part='prev-year-trigger']:focus-visible,
|
|
126
126
|
[data-scope='calendar'][data-part='prev-trigger']:focus-visible,
|
|
127
|
-
[data-scope='calendar'][data-part='next-year-trigger'],
|
|
127
|
+
[data-scope='calendar'][data-part='next-year-trigger']:focus-visible,
|
|
128
128
|
[data-scope='calendar'][data-part='next-trigger']:focus-visible {
|
|
129
129
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
130
130
|
outline-offset: var(--xh-ring-offset);
|
|
@@ -224,9 +224,10 @@
|
|
|
224
224
|
display: none;
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
-
/*
|
|
227
|
+
/* 格子是区间底色的画布:底色由格子的 ::before 铺出来,圆角的选中片留给 trigger。
|
|
228
228
|
铺在 trigger 上会被格间空隙切断,区间看起来就是一串断开的圆点 */
|
|
229
229
|
[data-scope='calendar'][data-part='cell'] {
|
|
230
|
+
position: relative;
|
|
230
231
|
display: flex;
|
|
231
232
|
align-items: center;
|
|
232
233
|
justify-content: center;
|
|
@@ -237,22 +238,46 @@
|
|
|
237
238
|
display: none;
|
|
238
239
|
}
|
|
239
240
|
|
|
240
|
-
|
|
241
|
+
/* 区间底色:横向铺满格子,相邻两格接成一条;纵向收在格子内衬里,行与行之间留出空当 */
|
|
242
|
+
[data-scope='calendar'][data-part='cell'][data-in-range]::before {
|
|
243
|
+
content: '';
|
|
244
|
+
position: absolute;
|
|
245
|
+
inset-block: var(--xh-calendar-cell-gap, var(--xh-space-0_5));
|
|
246
|
+
inset-inline: 0;
|
|
241
247
|
background: var(--xh-calendar-range-bg, var(--xh-bg-brand-subtle));
|
|
242
248
|
}
|
|
243
249
|
|
|
244
|
-
/*
|
|
245
|
-
|
|
250
|
+
/* 两端那一格只铺半格,另外半格由选中片占满:区间收在圆点上而不是收在格子边上。
|
|
251
|
+
起止落在同一格时两条一起生效,底色宽度归零,只剩那枚圆点 */
|
|
252
|
+
[data-scope='calendar'][data-part='cell'][data-in-range][data-range-start]::before {
|
|
253
|
+
inset-inline-start: 50%;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
[data-scope='calendar'][data-part='cell'][data-in-range][data-range-end]::before {
|
|
257
|
+
inset-inline-end: 50%;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* 行首与行尾收圆:区间跨周时每一行各是一条两头圆的横杠。
|
|
261
|
+
摆了周序号格的行里,行首那一格排在它后面 */
|
|
262
|
+
[data-scope='calendar'][data-part='week-row'] > [data-part='cell'][data-in-range]:first-child::before,
|
|
263
|
+
[data-scope='calendar'][data-part='week-row'] > [data-part='week-number'] + [data-part='cell'][data-in-range]::before {
|
|
246
264
|
border-start-start-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
|
|
247
265
|
border-end-start-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
|
|
248
266
|
}
|
|
249
267
|
|
|
250
|
-
[data-scope='calendar'][data-part='cell'][data-range-
|
|
268
|
+
[data-scope='calendar'][data-part='week-row'] > [data-part='cell'][data-in-range]:last-child::before {
|
|
251
269
|
border-start-end-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
|
|
252
270
|
border-end-end-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
|
|
253
271
|
}
|
|
254
272
|
|
|
273
|
+
/* 粗粒度的格子之间有间隙,底色本就接不成一条,每一格各自收圆 */
|
|
274
|
+
[data-scope='calendar'][data-part='grid']:is([data-view='month'], [data-view='quarter'], [data-view='year']) > [data-part='cell'][data-in-range]::before {
|
|
275
|
+
border-radius: var(--xh-calendar-cell-radius, var(--xh-shape-pill));
|
|
276
|
+
}
|
|
277
|
+
|
|
255
278
|
[data-scope='calendar'][data-part='cell-trigger'] {
|
|
279
|
+
/* 区间底色是格子上绝对定位的伪元素,选中片得定位才排在它之后 */
|
|
280
|
+
position: relative;
|
|
256
281
|
display: flex;
|
|
257
282
|
flex: 1;
|
|
258
283
|
align-items: center;
|
|
@@ -297,6 +322,7 @@
|
|
|
297
322
|
font-weight: var(--xh-font-weight-medium);
|
|
298
323
|
}
|
|
299
324
|
|
|
325
|
+
|
|
300
326
|
/* 不可用走 aria-disabled 而非原生 disabled:格子仍要可聚焦(它还得当方向键的起点),
|
|
301
327
|
所以只能靠 data-disabled 表达,写 :disabled 永远不命中 */
|
|
302
328
|
[data-scope='calendar'][data-part='cell-trigger'][data-disabled] {
|
package/css/card.css
CHANGED
|
@@ -67,10 +67,10 @@
|
|
|
67
67
|
[data-scope='card'][data-part='header'] {
|
|
68
68
|
display: flex;
|
|
69
69
|
flex-direction: column;
|
|
70
|
-
gap: var(--xh-space-1);
|
|
70
|
+
gap: var(--xh-card-header-gap, var(--xh-space-1));
|
|
71
71
|
padding: var(--xh-_card-pad);
|
|
72
72
|
/* 头下面若还有别的段,间距由那一段自己的内边距接上,这里不重复留白 */
|
|
73
|
-
padding-block-end: var(--xh-space-2);
|
|
73
|
+
padding-block-end: var(--xh-card-header-pb, var(--xh-space-2));
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
[data-scope='card'][data-part='title'] {
|
|
@@ -96,26 +96,35 @@
|
|
|
96
96
|
|
|
97
97
|
/* 头与身相邻时,头已经收窄了下边距,身不必再从顶上留一份 */
|
|
98
98
|
[data-scope='card'][data-part='header'] + [data-part='body'] {
|
|
99
|
-
padding-block-start: var(--xh-space-2);
|
|
99
|
+
padding-block-start: var(--xh-card-body-pt, var(--xh-space-2));
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
[data-scope='card'][data-part='footer'] {
|
|
103
103
|
display: flex;
|
|
104
104
|
align-items: center;
|
|
105
|
-
gap: var(--xh-space-2);
|
|
105
|
+
gap: var(--xh-card-footer-gap, var(--xh-space-2));
|
|
106
106
|
padding: var(--xh-_card-pad);
|
|
107
|
-
padding-block-start: var(--xh-space-2);
|
|
107
|
+
padding-block-start: var(--xh-card-footer-pt, var(--xh-space-2));
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
/* —— 分段 —— */
|
|
111
111
|
/* 分隔线画在下一段的上边,段与段之间才只有一条 */
|
|
112
112
|
[data-scope='card'][data-part='root'][data-segmented] [data-part='body'],
|
|
113
113
|
[data-scope='card'][data-part='root'][data-segmented] [data-part='footer'] {
|
|
114
|
-
border-block-start: var(--xh-stroke-thin) solid var(--xh-card-
|
|
114
|
+
border-block-start: var(--xh-stroke-thin) solid var(--xh-card-divider, var(--xh-border-subtle));
|
|
115
115
|
padding-block-start: var(--xh-_card-pad);
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
[data-scope='card'][data-part='root'][data-segmented] [data-part='header'] {
|
|
119
119
|
padding-block-end: var(--xh-_card-pad);
|
|
120
120
|
}
|
|
121
|
+
|
|
122
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
123
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
124
|
+
[data-scope='card'][data-part='root'][hidden],
|
|
125
|
+
[data-scope='card'][data-part='cover'][hidden],
|
|
126
|
+
[data-scope='card'][data-part='header'][hidden],
|
|
127
|
+
[data-scope='card'][data-part='footer'][hidden] {
|
|
128
|
+
display: none;
|
|
129
|
+
}
|
|
121
130
|
}
|
package/css/cascader.css
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
/* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
|
|
8
8
|
[data-scope='cascader'][data-part='positioner'] {
|
|
9
|
+
/* 列区的自绘条浮在内容之上:轨道不上底色,实色轨道会在列区下缘糊出一条灰带 */
|
|
10
|
+
--xh-scrollbar-track-bg: transparent;
|
|
11
|
+
|
|
9
12
|
position: fixed;
|
|
10
13
|
z-index: var(--xh-cascader-layer, var(--xh-layer-popover));
|
|
11
14
|
/* 空壳不吃指针,交互只发生在 content 里 */
|
|
@@ -25,9 +28,11 @@
|
|
|
25
28
|
/* 尺寸档只换这几个私有槽,盒与列里的条目都从这两处继承它们,换档不必给每个部件各写一条选择器 */
|
|
26
29
|
--xh-_cascader-h: var(--xh-control-h-md);
|
|
27
30
|
--xh-_cascader-px: var(--xh-control-px-md);
|
|
31
|
+
--xh-_cascader-row-py: var(--xh-list-option-py-md);
|
|
32
|
+
--xh-_cascader-row-px: var(--xh-control-px-md);
|
|
28
33
|
--xh-_cascader-gap: var(--xh-control-gap-md);
|
|
29
|
-
--xh-_cascader-font-size: var(--xh-
|
|
30
|
-
--xh-_cascader-label-font-size: var(--xh-
|
|
34
|
+
--xh-_cascader-font-size: var(--xh-control-font-md);
|
|
35
|
+
--xh-_cascader-label-font-size: var(--xh-control-font-md);
|
|
31
36
|
|
|
32
37
|
/* 形态档只换触发框的描边与底色这三个槽,浮层与列不跟着变:
|
|
33
38
|
变的是「这是个输入位」的表达方式,不是弹出内容的表达方式 */
|
|
@@ -86,6 +91,8 @@
|
|
|
86
91
|
--xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-sm));
|
|
87
92
|
--xh-_cascader-h: var(--xh-control-h-sm);
|
|
88
93
|
--xh-_cascader-px: var(--xh-control-px-sm);
|
|
94
|
+
--xh-_cascader-row-py: var(--xh-list-option-py-sm);
|
|
95
|
+
--xh-_cascader-row-px: var(--xh-control-px-sm);
|
|
89
96
|
--xh-_cascader-gap: var(--xh-control-gap-sm);
|
|
90
97
|
--xh-_cascader-font-size: var(--xh-control-font-sm);
|
|
91
98
|
--xh-_cascader-label-font-size: var(--xh-control-font-sm);
|
|
@@ -95,6 +102,8 @@
|
|
|
95
102
|
--xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-lg));
|
|
96
103
|
--xh-_cascader-h: var(--xh-control-h-lg);
|
|
97
104
|
--xh-_cascader-px: var(--xh-control-px-lg);
|
|
105
|
+
--xh-_cascader-row-py: var(--xh-list-option-py-lg);
|
|
106
|
+
--xh-_cascader-row-px: var(--xh-control-px-lg);
|
|
98
107
|
--xh-_cascader-gap: var(--xh-control-gap-lg);
|
|
99
108
|
--xh-_cascader-font-size: var(--xh-control-font-lg);
|
|
100
109
|
--xh-_cascader-label-font-size: var(--xh-control-font-lg);
|
|
@@ -334,6 +343,7 @@
|
|
|
334
343
|
display: flex;
|
|
335
344
|
flex: none;
|
|
336
345
|
flex-direction: column;
|
|
346
|
+
gap: var(--xh-cascader-column-gap, var(--xh-list-option-gap));
|
|
337
347
|
min-inline-size: var(--xh-cascader-column-min-w, 7rem);
|
|
338
348
|
block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
|
|
339
349
|
padding-block: var(--xh-cascader-column-py, var(--xh-space-1));
|
|
@@ -369,8 +379,8 @@
|
|
|
369
379
|
align-items: center;
|
|
370
380
|
gap: var(--xh-cascader-row-gap, var(--xh-_cascader-gap));
|
|
371
381
|
max-inline-size: var(--xh-cascader-row-max-w, var(--xh-overlay-max-w));
|
|
372
|
-
padding-block: var(--xh-cascader-row-py, var(--xh-
|
|
373
|
-
padding-inline: var(--xh-cascader-row-px, var(--xh-
|
|
382
|
+
padding-block: var(--xh-cascader-row-py, var(--xh-_cascader-row-py));
|
|
383
|
+
padding-inline: var(--xh-cascader-row-px, var(--xh-_cascader-row-px));
|
|
374
384
|
border-radius: var(--xh-cascader-row-radius, var(--xh-shape-control));
|
|
375
385
|
color: var(--xh-cascader-row-fg, var(--xh-fg-default));
|
|
376
386
|
font-size: var(--xh-cascader-row-font-size, var(--xh-_cascader-font-size));
|
|
@@ -423,22 +433,17 @@
|
|
|
423
433
|
cursor: not-allowed;
|
|
424
434
|
}
|
|
425
435
|
|
|
426
|
-
/*
|
|
427
|
-
|
|
436
|
+
/* 分支条目行尾画右向小箭头:不点开也看得出还有下一级。位置由 item-text 的 flex:1 顶到行尾。
|
|
437
|
+
与菜单族的子菜单箭头同走字形令牌——此前这里是「描全边框再抹掉两条、把剩下的直角旋 45 度」,
|
|
438
|
+
作者换掉标记时换不动它,RTL 还得再翻一次旋转角 */
|
|
428
439
|
[data-scope='cascader'][data-part='item'][data-branch]::after {
|
|
429
440
|
content: '';
|
|
430
441
|
flex: none;
|
|
431
|
-
inline-size: var(--xh-cascader-branch-arrow-size, var(--xh-
|
|
432
|
-
block-size: var(--xh-cascader-branch-arrow-size, var(--xh-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
rotate: 45deg;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
/* rtl 下剩下的是块首与行末(物理左上)两边,反向旋 45 度才指向行进方向 */
|
|
440
|
-
[dir='rtl'] [data-scope='cascader'][data-part='item'][data-branch]::after {
|
|
441
|
-
rotate: -45deg;
|
|
442
|
+
inline-size: var(--xh-cascader-branch-arrow-size, var(--xh-icon-size, var(--xh-glyph-size-text)));
|
|
443
|
+
block-size: var(--xh-cascader-branch-arrow-size, var(--xh-icon-size, var(--xh-glyph-size-text)));
|
|
444
|
+
background-color: var(--xh-cascader-branch-arrow-fg, var(--xh-fg-subtle));
|
|
445
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
446
|
+
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
442
447
|
}
|
|
443
448
|
|
|
444
449
|
[data-scope='cascader'][data-part='item'][data-branch][data-disabled]::after {
|
|
@@ -460,7 +465,7 @@
|
|
|
460
465
|
align-items: center;
|
|
461
466
|
justify-content: center;
|
|
462
467
|
inline-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
|
|
463
|
-
color: var(--xh-cascader-item-indicator-fg, var(--xh-_tone, var(--xh-
|
|
468
|
+
color: var(--xh-cascader-item-indicator-fg, var(--xh-_tone, var(--xh-fg-brand)));
|
|
464
469
|
visibility: hidden;
|
|
465
470
|
}
|
|
466
471
|
|
|
@@ -486,11 +491,11 @@
|
|
|
486
491
|
|
|
487
492
|
/* 级联勾选的半选态只在皮肤自绘(:empty)时露面画横杠:
|
|
488
493
|
作者塞了自己的选中图形时,半选放出来会顶着一个语义相反的勾,表达交还作者 */
|
|
489
|
-
[data-scope='cascader'][data-part='item-indicator'][data-indeterminate]:empty {
|
|
494
|
+
[data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty {
|
|
490
495
|
visibility: visible;
|
|
491
496
|
}
|
|
492
497
|
|
|
493
|
-
[data-scope='cascader'][data-part='item-indicator'][data-
|
|
498
|
+
[data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty::before {
|
|
494
499
|
content: '';
|
|
495
500
|
display: inline-block;
|
|
496
501
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
@@ -517,7 +522,7 @@
|
|
|
517
522
|
padding-block: var(--xh-cascader-input-py, var(--xh-space-2));
|
|
518
523
|
padding-inline: var(--xh-cascader-input-px, var(--xh-control-px-md));
|
|
519
524
|
border: none;
|
|
520
|
-
border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-
|
|
525
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-border-subtle));
|
|
521
526
|
border-start-start-radius: inherit;
|
|
522
527
|
border-start-end-radius: inherit;
|
|
523
528
|
background: none;
|
|
@@ -540,6 +545,7 @@
|
|
|
540
545
|
display: flex;
|
|
541
546
|
flex-basis: 100%;
|
|
542
547
|
flex-direction: column;
|
|
548
|
+
gap: var(--xh-cascader-search-list-gap, var(--xh-list-option-gap));
|
|
543
549
|
block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
|
|
544
550
|
padding: var(--xh-cascader-search-p, var(--xh-space-1));
|
|
545
551
|
overflow-y: auto;
|
|
@@ -561,8 +567,8 @@
|
|
|
561
567
|
|
|
562
568
|
/* 候选与列内条目同一套行度量,虚拟高亮与悬停同用轻档 */
|
|
563
569
|
[data-scope='cascader'][data-part='search-item'] {
|
|
564
|
-
padding-block: var(--xh-cascader-row-py, var(--xh-
|
|
565
|
-
padding-inline: var(--xh-cascader-row-px, var(--xh-
|
|
570
|
+
padding-block: var(--xh-cascader-row-py, var(--xh-_cascader-row-py));
|
|
571
|
+
padding-inline: var(--xh-cascader-row-px, var(--xh-_cascader-row-px));
|
|
566
572
|
overflow: hidden;
|
|
567
573
|
border-radius: var(--xh-cascader-row-radius, var(--xh-shape-control));
|
|
568
574
|
color: var(--xh-cascader-row-fg, var(--xh-fg-default));
|