@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/space.css
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
display: flex;
|
|
9
9
|
flex-wrap: nowrap;
|
|
10
10
|
/* 不写档位也按 md 留白,这是与裸弹性容器的分野;使用者槽位排在档位之前,写死一个值即盖过所有档 */
|
|
11
|
-
gap: var(--xh-space-gap, var(--xh-
|
|
11
|
+
gap: var(--xh-space-gap, var(--xh-layout-gap-md));
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
/* 声明了 display 就盖掉了 UA 的 [hidden] 规则,这里还回去 */
|
|
@@ -96,22 +96,22 @@
|
|
|
96
96
|
/* —— 间距档位 —— */
|
|
97
97
|
/* 每一档指向一个间距令牌,折行时行与行之间也吃这份间距 */
|
|
98
98
|
[data-scope='space'][data-part='root'][data-gap='xs'] {
|
|
99
|
-
gap: var(--xh-space-gap, var(--xh-
|
|
99
|
+
gap: var(--xh-space-gap, var(--xh-layout-gap-xs));
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
[data-scope='space'][data-part='root'][data-gap='sm'] {
|
|
103
|
-
gap: var(--xh-space-gap, var(--xh-
|
|
103
|
+
gap: var(--xh-space-gap, var(--xh-layout-gap-sm));
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
[data-scope='space'][data-part='root'][data-gap='md'] {
|
|
107
|
-
gap: var(--xh-space-gap, var(--xh-
|
|
107
|
+
gap: var(--xh-space-gap, var(--xh-layout-gap-md));
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
[data-scope='space'][data-part='root'][data-gap='lg'] {
|
|
111
|
-
gap: var(--xh-space-gap, var(--xh-
|
|
111
|
+
gap: var(--xh-space-gap, var(--xh-layout-gap-lg));
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
[data-scope='space'][data-part='root'][data-gap='xl'] {
|
|
115
|
-
gap: var(--xh-space-gap, var(--xh-
|
|
115
|
+
gap: var(--xh-space-gap, var(--xh-layout-gap-xl));
|
|
116
116
|
}
|
|
117
117
|
}
|
package/css/steps.css
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
/* 尺寸档只换这三个私有槽,序号圆点、标题与说明都从 root 继承它们,
|
|
12
12
|
换档不必给每个部件各写一条选择器 */
|
|
13
|
-
--xh-_steps-indicator-size: var(--xh-
|
|
14
|
-
--xh-_steps-title-font-size: var(--xh-
|
|
13
|
+
--xh-_steps-indicator-size: var(--xh-space-7);
|
|
14
|
+
--xh-_steps-title-font-size: var(--xh-control-font-md);
|
|
15
15
|
--xh-_steps-caption-font-size: var(--xh-text-caption-size);
|
|
16
16
|
|
|
17
17
|
/* 语气落在走过与当前这两步的标记和连接线上:强调色画描边与填充,
|
|
@@ -153,8 +153,8 @@
|
|
|
153
153
|
justify-content: center;
|
|
154
154
|
inline-size: var(--xh-steps-indicator-size, var(--xh-_steps-indicator-size));
|
|
155
155
|
block-size: var(--xh-steps-indicator-size, var(--xh-_steps-indicator-size));
|
|
156
|
-
border: var(--xh-stroke-thin) solid var(--xh-steps-indicator-border, var(--xh-border-
|
|
157
|
-
border-radius: var(--xh-shape-pill);
|
|
156
|
+
border: var(--xh-stroke-thin) solid var(--xh-steps-indicator-border, var(--xh-border-control));
|
|
157
|
+
border-radius: var(--xh-steps-indicator-radius, var(--xh-shape-pill));
|
|
158
158
|
background: var(--xh-steps-indicator-bg, transparent);
|
|
159
159
|
color: var(--xh-steps-indicator-fg, var(--xh-fg-muted));
|
|
160
160
|
font-size: var(--xh-steps-indicator-font-size, var(--xh-_steps-caption-font-size));
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
[data-scope='steps'][data-part='item'][data-disabled] [data-scope='steps'][data-part='indicator'] {
|
|
189
|
-
border-color: var(--xh-steps-indicator-border-disabled, var(--xh-
|
|
189
|
+
border-color: var(--xh-steps-indicator-border-disabled, var(--xh-border-subtle));
|
|
190
190
|
color: var(--xh-steps-indicator-fg-disabled, var(--xh-fg-disabled));
|
|
191
191
|
}
|
|
192
192
|
|
|
@@ -222,7 +222,7 @@
|
|
|
222
222
|
flex: 1;
|
|
223
223
|
min-inline-size: var(--xh-steps-separator-min-length, var(--xh-space-4));
|
|
224
224
|
block-size: var(--xh-steps-separator-thickness, var(--xh-stroke-thick));
|
|
225
|
-
border-radius: var(--xh-shape-pill);
|
|
225
|
+
border-radius: var(--xh-steps-separator-radius, var(--xh-shape-pill));
|
|
226
226
|
background: var(--xh-steps-separator-bg, var(--xh-border-default));
|
|
227
227
|
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
228
228
|
}
|
package/css/switch.css
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
block-size: var(--xh-_switch-track-h);
|
|
31
31
|
padding: var(--xh-_switch-pad);
|
|
32
32
|
border: 0;
|
|
33
|
-
border-radius: var(--xh-shape-pill);
|
|
33
|
+
border-radius: var(--xh-switch-radius, var(--xh-shape-pill));
|
|
34
34
|
background: var(--xh-switch-bg, var(--xh-bg-subtle-active));
|
|
35
35
|
cursor: pointer;
|
|
36
36
|
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
[data-scope='switch'][data-part='thumb'] {
|
|
69
69
|
inline-size: var(--xh-_switch-thumb-size);
|
|
70
70
|
block-size: var(--xh-_switch-thumb-size);
|
|
71
|
-
border-radius: var(--xh-shape-pill);
|
|
71
|
+
border-radius: var(--xh-switch-thumb-radius, var(--xh-shape-pill));
|
|
72
72
|
background: var(--xh-switch-thumb, var(--xh-bg-canvas));
|
|
73
73
|
box-shadow: var(--xh-switch-thumb-shadow, var(--xh-elevation-raised));
|
|
74
74
|
transition: translate var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
@@ -134,4 +134,11 @@
|
|
|
134
134
|
border-color: var(--xh-switch-loading-fg, var(--xh-bg-brand));
|
|
135
135
|
animation: none;
|
|
136
136
|
}
|
|
137
|
+
|
|
138
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
139
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
140
|
+
[data-scope='switch'][data-part='root'][hidden],
|
|
141
|
+
[data-scope='switch'][data-part='label'][hidden] {
|
|
142
|
+
display: none;
|
|
143
|
+
}
|
|
137
144
|
}
|
package/css/table.css
CHANGED
|
@@ -19,13 +19,17 @@
|
|
|
19
19
|
|
|
20
20
|
/* 表格自己滚动:吸顶表头与横向吸附列都要一个确定的滚动容器才钉得住 */
|
|
21
21
|
[data-scope='table'][data-part='root'] {
|
|
22
|
+
/* 组件内那几档层号只在自己人之间排序:建一个层叠上下文把它们关起来,
|
|
23
|
+
既不让页面上的层号插进来,也不让它们漏出去压住别人 */
|
|
24
|
+
isolation: isolate;
|
|
25
|
+
|
|
22
26
|
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
23
27
|
--xh-icon-size: var(--xh-table-icon-size, var(--xh-glyph-size-text));
|
|
24
28
|
|
|
25
29
|
/* 密度档只换这两个私有槽:单元格与列标题从 root 继承前者,字号靠 font-size 本身继承下去,
|
|
26
30
|
换档不必给每个部件各写一条选择器,列宽那套算法也一点不碰 */
|
|
27
31
|
--xh-_table-cell-py: var(--xh-table-cell-py-md);
|
|
28
|
-
--xh-_table-font-size: var(--xh-
|
|
32
|
+
--xh-_table-font-size: var(--xh-control-font-md);
|
|
29
33
|
|
|
30
34
|
display: flex;
|
|
31
35
|
position: relative;
|
|
@@ -284,7 +288,8 @@
|
|
|
284
288
|
color: transparent;
|
|
285
289
|
}
|
|
286
290
|
|
|
287
|
-
/*
|
|
291
|
+
/* 半选换一枚横杠字形盖住勾:aria-checked=mixed 在视觉上也得与"全选"分得开。
|
|
292
|
+
横杠与勾同走字形令牌,作者换掉标记时两态一起换 */
|
|
288
293
|
[data-scope='table'][data-part='select-all-trigger'][data-state='indeterminate'] {
|
|
289
294
|
position: relative;
|
|
290
295
|
color: transparent;
|
|
@@ -292,11 +297,12 @@
|
|
|
292
297
|
|
|
293
298
|
[data-scope='table'][data-part='select-all-trigger'][data-state='indeterminate']::after {
|
|
294
299
|
position: absolute;
|
|
295
|
-
inline-size:
|
|
296
|
-
block-size: var(--xh-
|
|
297
|
-
|
|
298
|
-
background: var(--xh-table-trigger-fg, var(--xh-fg-on-brand));
|
|
300
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
301
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
302
|
+
background-color: var(--xh-table-trigger-fg, var(--xh-fg-on-brand));
|
|
299
303
|
content: '';
|
|
304
|
+
-webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
305
|
+
mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
300
306
|
}
|
|
301
307
|
|
|
302
308
|
[data-scope='table'][data-part='select-all-trigger'][data-disabled],
|
|
@@ -307,10 +313,12 @@
|
|
|
307
313
|
cursor: not-allowed;
|
|
308
314
|
}
|
|
309
315
|
|
|
310
|
-
/* 全选把手是表头里独立的 Tab
|
|
316
|
+
/* 全选把手是表头里独立的 Tab 停靠点,环得画在它自己身上。
|
|
317
|
+
往内收,与行、排序把手同一口径:把手长在列头里,列头与根都收 overflow,
|
|
318
|
+
环画在外沿会被裁掉 */
|
|
311
319
|
[data-scope='table'][data-part='select-all-trigger']:focus-visible {
|
|
312
320
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
313
|
-
outline-offset: var(--xh-ring-
|
|
321
|
+
outline-offset: calc(-1 * var(--xh-ring-width));
|
|
314
322
|
}
|
|
315
323
|
|
|
316
324
|
/* 行选择把手不占 Tab 位(键盘那一路走 Space),只服务指针 */
|
package/css/tabs.css
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
/* 尺寸档只换这三个私有槽,标签从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
9
9
|
--xh-_tabs-trigger-h: var(--xh-control-h-md);
|
|
10
10
|
--xh-_tabs-trigger-px: var(--xh-control-px-md);
|
|
11
|
-
--xh-_tabs-trigger-font-size: var(--xh-
|
|
11
|
+
--xh-_tabs-trigger-font-size: var(--xh-control-font-md);
|
|
12
12
|
|
|
13
13
|
/* 形态档只换这几个私有槽:列表的底、内边距、基线,与标签的描边、选中底、选中态那道指示。
|
|
14
14
|
缺省档(line)是一条基线加一行标签,选中只换文字色——这里的取值即现状 */
|
|
@@ -159,4 +159,12 @@
|
|
|
159
159
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
160
160
|
outline-offset: var(--xh-ring-offset);
|
|
161
161
|
}
|
|
162
|
+
|
|
163
|
+
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
164
|
+
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
165
|
+
[data-scope='tabs'][data-part='root'][hidden],
|
|
166
|
+
[data-scope='tabs'][data-part='list'][hidden],
|
|
167
|
+
[data-scope='tabs'][data-part='trigger'][hidden] {
|
|
168
|
+
display: none;
|
|
169
|
+
}
|
|
162
170
|
}
|
package/css/tag.css
CHANGED
|
@@ -130,8 +130,10 @@
|
|
|
130
130
|
color: var(--xh-tag-fg, var(--xh-fg-default));
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
+
/* 描边档的边就是这枚标签的全部轮廓,走「可操作区边界」那一支:
|
|
134
|
+
兑了底色的 --xh-_tone-border 六族都在 1.44-2.18,当轮廓看不清 */
|
|
133
135
|
[data-scope='tag'][data-part='root'][data-variant='outline'][data-tone] {
|
|
134
|
-
border-color: var(--xh-tag-border, var(--xh-_tone-border, var(--xh-border-default)));
|
|
136
|
+
border-color: var(--xh-tag-border, var(--xh-_tone-border-control, var(--xh-border-default)));
|
|
135
137
|
color: var(--xh-tag-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
|
|
136
138
|
}
|
|
137
139
|
|
package/css/tags-input.css
CHANGED
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
--xh-_tags-input-control-h: var(--xh-control-h-md);
|
|
16
16
|
--xh-_tags-input-control-px: var(--xh-control-px-md);
|
|
17
17
|
--xh-_tags-input-control-gap: var(--xh-control-gap-md);
|
|
18
|
-
--xh-_tags-input-input-font-size: var(--xh-
|
|
19
|
-
--xh-_tags-input-item-font-size: var(--xh-
|
|
20
|
-
--xh-_tags-input-label-font-size: var(--xh-
|
|
18
|
+
--xh-_tags-input-input-font-size: var(--xh-control-font-md);
|
|
19
|
+
--xh-_tags-input-item-font-size: var(--xh-control-caption-md);
|
|
20
|
+
--xh-_tags-input-label-font-size: var(--xh-control-font-md);
|
|
21
21
|
/* 形态档只换这三个私有槽,缺省这一份就是描边式(描边 + 画布底) */
|
|
22
22
|
--xh-_tags-input-control-bg: var(--xh-bg-canvas);
|
|
23
23
|
--xh-_tags-input-control-border: var(--xh-border-control);
|
package/css/text-field.css
CHANGED
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
--xh-_text-field-h: var(--xh-control-h-md);
|
|
17
17
|
--xh-_text-field-px: var(--xh-control-px-md);
|
|
18
18
|
--xh-_text-field-gap: var(--xh-control-gap-md);
|
|
19
|
-
--xh-_text-field-font-size: var(--xh-
|
|
20
|
-
--xh-_text-field-label-font-size: var(--xh-
|
|
21
|
-
--xh-_text-field-action-font-size: var(--xh-
|
|
19
|
+
--xh-_text-field-font-size: var(--xh-control-font-md);
|
|
20
|
+
--xh-_text-field-label-font-size: var(--xh-control-font-md);
|
|
21
|
+
--xh-_text-field-action-font-size: var(--xh-control-caption-md);
|
|
22
22
|
|
|
23
23
|
/* 形态档只换这三个私有槽:底、常态描边、悬停描边 */
|
|
24
24
|
--xh-_text-field-bg: var(--xh-bg-canvas);
|
package/css/thread.css
CHANGED
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
/* 自建定位上下文,作为绝对定位的回到底部按钮的参照系;
|
|
8
8
|
block-size: 100% 让高度由外部决定,使滚动发生在内部。 */
|
|
9
9
|
[data-scope='thread'][data-part='root'] {
|
|
10
|
+
/* 组件内那几档层号只在自己人之间排序:建一个层叠上下文把它们关起来,
|
|
11
|
+
既不让页面上的层号插进来,也不让它们漏出去压住别人 */
|
|
12
|
+
isolation: isolate;
|
|
13
|
+
|
|
10
14
|
position: relative;
|
|
11
15
|
display: flex;
|
|
12
16
|
flex-direction: column;
|
|
@@ -20,14 +24,18 @@
|
|
|
20
24
|
|
|
21
25
|
/* 滚动容器,粘底读的是它的 scrollTop / clientHeight / scrollHeight。
|
|
22
26
|
min-block-size: 0 让弹性子项能被压缩从而触发溢出;
|
|
23
|
-
overscroll-behavior: contain
|
|
24
|
-
scrollbar-gutter: stable 避免滚动条出现与消失时推动文字。 */
|
|
27
|
+
overscroll-behavior: contain 阻止滚动量传给页面。 */
|
|
25
28
|
[data-scope='thread'][data-part='viewport'] {
|
|
26
29
|
flex: 1;
|
|
27
30
|
min-block-size: 0;
|
|
28
31
|
/* 逻辑属性 overflow-block 尚无可用实现,写物理轴 */
|
|
29
32
|
overflow-y: auto;
|
|
30
33
|
overscroll-behavior: contain;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* 还在用原生滚动条的视口留一条空道,滚动条出现与消失时不推动文字。
|
|
37
|
+
带 data-xh-scrollbar 的容器已经把原生条藏成零宽,这条空道对它没有布局作用,排除掉 */
|
|
38
|
+
[data-scope='thread'][data-part='viewport']:not([data-xh-scrollbar]) {
|
|
31
39
|
scrollbar-gutter: stable;
|
|
32
40
|
}
|
|
33
41
|
|
package/css/time-field.css
CHANGED
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
--xh-_time-field-control-h: var(--xh-control-h-md);
|
|
14
14
|
--xh-_time-field-control-px: var(--xh-control-px-md);
|
|
15
15
|
--xh-_time-field-gap: var(--xh-control-gap-md);
|
|
16
|
-
--xh-_time-field-font-size: var(--xh-
|
|
17
|
-
--xh-_time-field-label-font-size: var(--xh-
|
|
16
|
+
--xh-_time-field-font-size: var(--xh-control-font-md);
|
|
17
|
+
--xh-_time-field-label-font-size: var(--xh-control-font-md);
|
|
18
18
|
/* 形态档只换这三个私有槽:底色与两档描边 */
|
|
19
19
|
--xh-_time-field-control-bg: var(--xh-bg-canvas);
|
|
20
20
|
--xh-_time-field-control-border: var(--xh-border-control);
|
package/css/time-picker.css
CHANGED
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
--xh-_time-picker-control-h: var(--xh-control-h-md);
|
|
25
25
|
--xh-_time-picker-control-px: var(--xh-control-px-md);
|
|
26
26
|
--xh-_time-picker-gap: var(--xh-control-gap-md);
|
|
27
|
-
--xh-_time-picker-font-size: var(--xh-
|
|
28
|
-
--xh-_time-picker-label-font-size: var(--xh-
|
|
27
|
+
--xh-_time-picker-font-size: var(--xh-control-font-md);
|
|
28
|
+
--xh-_time-picker-label-font-size: var(--xh-control-font-md);
|
|
29
29
|
--xh-_time-picker-item-px: var(--xh-control-px-md);
|
|
30
30
|
|
|
31
31
|
/* 形态档只换这三个私有槽:底色与两档描边 */
|
|
@@ -342,7 +342,7 @@
|
|
|
342
342
|
display: flex;
|
|
343
343
|
flex: none;
|
|
344
344
|
flex-direction: column;
|
|
345
|
-
gap: var(--xh-time-picker-presets-gap, var(--xh-
|
|
345
|
+
gap: var(--xh-time-picker-presets-gap, var(--xh-list-option-gap));
|
|
346
346
|
max-block-size: var(--xh-time-picker-presets-h, var(--xh-viewport-h-sm));
|
|
347
347
|
padding-inline: var(--xh-time-picker-presets-px, var(--xh-space-1));
|
|
348
348
|
overflow-y: auto;
|
|
@@ -357,7 +357,7 @@
|
|
|
357
357
|
[data-scope='time-picker'][data-part='preset'] {
|
|
358
358
|
padding-block: var(--xh-time-picker-preset-py, var(--xh-space-1));
|
|
359
359
|
padding-inline: var(--xh-time-picker-preset-px, var(--xh-space-3));
|
|
360
|
-
border-radius: var(--xh-shape-control);
|
|
360
|
+
border-radius: var(--xh-time-picker-preset-radius, var(--xh-shape-control));
|
|
361
361
|
font-size: var(--xh-text-secondary-size);
|
|
362
362
|
line-height: var(--xh-leading-normal);
|
|
363
363
|
white-space: nowrap;
|
|
@@ -397,7 +397,7 @@
|
|
|
397
397
|
display: flex;
|
|
398
398
|
flex: none;
|
|
399
399
|
flex-direction: column;
|
|
400
|
-
gap: var(--xh-time-picker-column-gap, var(--xh-
|
|
400
|
+
gap: var(--xh-time-picker-column-gap, var(--xh-list-option-gap));
|
|
401
401
|
min-inline-size: var(--xh-time-picker-column-min-w, 3.5rem);
|
|
402
402
|
/* 几列并排:定高而不是随内容收,否则时列与分列的可选值一多一少就错位 */
|
|
403
403
|
block-size: var(--xh-time-picker-column-h, var(--xh-viewport-h-sm));
|
|
@@ -432,7 +432,7 @@
|
|
|
432
432
|
flex: none;
|
|
433
433
|
align-items: center;
|
|
434
434
|
justify-content: center;
|
|
435
|
-
padding-block: var(--xh-time-picker-item-py, var(--xh-
|
|
435
|
+
padding-block: var(--xh-time-picker-item-py, var(--xh-list-option-py-md));
|
|
436
436
|
padding-inline: var(--xh-time-picker-item-px, var(--xh-_time-picker-item-px));
|
|
437
437
|
border-radius: var(--xh-time-picker-item-radius, var(--xh-shape-control));
|
|
438
438
|
color: var(--xh-time-picker-item-fg, var(--xh-fg-default));
|
package/css/timeline.css
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
--xh-_timeline-dot-size: var(--xh-space-2_5);
|
|
11
11
|
--xh-_timeline-gutter: var(--xh-space-3);
|
|
12
12
|
--xh-_timeline-item-gap: var(--xh-space-5);
|
|
13
|
-
--xh-_timeline-title-font-size: var(--xh-
|
|
13
|
+
--xh-_timeline-title-font-size: var(--xh-control-font-md);
|
|
14
14
|
--xh-_timeline-caption-font-size: var(--xh-text-caption-size);
|
|
15
15
|
/* 标题首行占多高。圆点按它居中下移,圆心才落在标题这一行的中线上 */
|
|
16
16
|
--xh-_timeline-line-h: calc(
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
justify-content: center;
|
|
93
93
|
inline-size: var(--xh-timeline-indicator-size, var(--xh-_timeline-dot-size));
|
|
94
94
|
block-size: var(--xh-timeline-indicator-size, var(--xh-_timeline-dot-size));
|
|
95
|
-
border-radius: var(--xh-shape-pill);
|
|
95
|
+
border-radius: var(--xh-timeline-indicator-radius, var(--xh-shape-pill));
|
|
96
96
|
/* 使用者令牌排在语气之前;两者都没有时退回一个中性的实心点 */
|
|
97
97
|
background: var(--xh-timeline-indicator-bg, var(--xh-_tone-soft, var(--xh-fg-muted)));
|
|
98
98
|
color: var(--xh-timeline-indicator-fg, var(--xh-_tone-on, var(--xh-fg-on-brand)));
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
|
|
121
121
|
/* —— 连线 —— */
|
|
122
122
|
[data-scope='timeline'][data-part='connector'] {
|
|
123
|
-
border-radius: var(--xh-shape-pill);
|
|
123
|
+
border-radius: var(--xh-timeline-connector-radius, var(--xh-shape-pill));
|
|
124
124
|
background: var(--xh-timeline-connector-bg, var(--xh-border-default));
|
|
125
125
|
}
|
|
126
126
|
|
|
@@ -158,7 +158,7 @@
|
|
|
158
158
|
[data-scope='timeline'][data-part='content'] {
|
|
159
159
|
display: flex;
|
|
160
160
|
flex-direction: column;
|
|
161
|
-
gap: var(--xh-space-1);
|
|
161
|
+
gap: var(--xh-timeline-content-gap, var(--xh-space-1));
|
|
162
162
|
min-inline-size: 0;
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
[data-scope='timeline'][data-part='item'][data-orientation='horizontal'] [data-scope='timeline'][data-part='content'] {
|
|
177
177
|
grid-column: 1 / -1;
|
|
178
178
|
grid-row: 2;
|
|
179
|
-
padding-block-start: var(--xh-space-2);
|
|
179
|
+
padding-block-start: var(--xh-timeline-content-pt, var(--xh-space-2));
|
|
180
180
|
padding-inline-end: var(--xh-timeline-item-gap, var(--xh-_timeline-item-gap));
|
|
181
181
|
}
|
|
182
182
|
|
|
@@ -241,7 +241,7 @@
|
|
|
241
241
|
grid-row: 1;
|
|
242
242
|
align-self: end;
|
|
243
243
|
padding-block-start: 0;
|
|
244
|
-
padding-block-end: var(--xh-space-2);
|
|
244
|
+
padding-block-end: var(--xh-timeline-content-pb, var(--xh-space-2));
|
|
245
245
|
}
|
|
246
246
|
|
|
247
247
|
[data-scope='timeline'][data-part='item'][data-orientation='horizontal'][data-placement='alternate'] {
|
|
@@ -262,7 +262,7 @@
|
|
|
262
262
|
grid-row: 1;
|
|
263
263
|
align-self: end;
|
|
264
264
|
padding-block-start: 0;
|
|
265
|
-
padding-block-end: var(--xh-space-2);
|
|
265
|
+
padding-block-end: var(--xh-timeline-content-pb, var(--xh-space-2));
|
|
266
266
|
}
|
|
267
267
|
|
|
268
268
|
/* —— 文字 —— */
|
package/css/toast.css
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
@layer xihan.motion {
|
|
2
2
|
/*
|
|
3
|
-
*
|
|
4
|
-
* data-placement
|
|
5
|
-
*
|
|
3
|
+
* 九个位共用同一条进出场,位移不跟着落位走:要按位置分方向就得从摞的
|
|
4
|
+
* data-placement 反向选到条子上,落位一改名整条动效静默失效。
|
|
5
|
+
* 竖向一小段位移在九个位上都说得通。
|
|
6
6
|
*/
|
|
7
7
|
@keyframes xh-toast-in {
|
|
8
8
|
from {
|
|
@@ -39,45 +39,95 @@
|
|
|
39
39
|
--xh-toast-skin: 1;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
/*
|
|
43
|
+
* 一摞 = 一整面视口大小的定位面:贴边靠 padding,落位靠 justify/align 表达。
|
|
44
|
+
* 不用四角 inset 逐个摆,是因为 column flex 的 align-items 走的是行内轴,
|
|
45
|
+
* RTL 下 start/end 自动跟着翻;写死 inset-inline-start 的话居中那三个位
|
|
46
|
+
* 还得再配一次 translate,方向一变就错。
|
|
47
|
+
* 摞由全局服务渲染,没有对应的容器组件——一次操作的反馈落在哪儿是整个服务的口径。
|
|
48
|
+
*/
|
|
49
|
+
[data-scope='toast'][data-part='group'] {
|
|
50
|
+
position: fixed;
|
|
51
|
+
inset-block: 0;
|
|
52
|
+
inset-inline: 0;
|
|
53
|
+
z-index: var(--xh-toast-layer, var(--xh-layer-toast));
|
|
54
|
+
display: flex;
|
|
55
|
+
flex-direction: column;
|
|
56
|
+
/* 基线按默认落位 top 写,下面只覆盖跟它不同的那几个位 */
|
|
57
|
+
justify-content: flex-start;
|
|
58
|
+
align-items: center;
|
|
59
|
+
padding-block: var(--xh-toast-inset, var(--xh-space-6));
|
|
60
|
+
padding-inline: var(--xh-toast-inset, var(--xh-space-6));
|
|
61
|
+
/* 摞内间距由服务写进内联 style,这里绝不重复写:
|
|
62
|
+
写了也会被内联盖掉,只会让人误以为间距归样式层管 */
|
|
63
|
+
/* 整面铺开就等于罩住了整块视口。面本身不吃指针,只有条子吃(见下),
|
|
64
|
+
否则底下的页面就再也点不动了 */
|
|
65
|
+
pointer-events: none;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
[data-scope='toast'][data-part='group'][hidden] {
|
|
69
|
+
display: none;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* 块轴落位:^= 一次吃掉某一行的三个位(top / top-start / top-end) */
|
|
73
|
+
[data-scope='toast'][data-part='group'][data-placement^='middle'] {
|
|
74
|
+
justify-content: center;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
[data-scope='toast'][data-part='group'][data-placement^='bottom'] {
|
|
78
|
+
justify-content: flex-end;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* 行内轴落位:不带后缀的 top / middle / bottom 用基线的居中 */
|
|
82
|
+
[data-scope='toast'][data-part='group'][data-placement$='-start'] {
|
|
83
|
+
align-items: flex-start;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
[data-scope='toast'][data-part='group'][data-placement$='-end'] {
|
|
87
|
+
align-items: flex-end;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* 一条轻提示是「一句话 + 一枚状态字形」,横排一行、贴着文字收缩。
|
|
92
|
+
* 语气由淡底、描边与字形三者一起承载,正文留中性——正文也跟着兑成语气色的话,
|
|
93
|
+
* 绿字压在绿底上,对比度是整条里最差的那一处。
|
|
94
|
+
*/
|
|
42
95
|
[data-scope='toast'][data-part='root'] {
|
|
43
|
-
/*
|
|
44
|
-
--xh-icon-size: var(--xh-toast-icon-size, var(--xh-
|
|
96
|
+
/* 状态字形按控件指示符那一档走,与 alert 的图标框同一把尺 */
|
|
97
|
+
--xh-icon-size: var(--xh-toast-icon-size, var(--xh-control-indicator-size));
|
|
98
|
+
|
|
99
|
+
/* 底与描边取语气层派生好的槽,不在这儿自己再兑一遍:
|
|
100
|
+
兑法差一档,字形压上去的对比度就跟着差一档(alert 踩过这个坑) */
|
|
101
|
+
--xh-_toast-tint: var(--xh-_tone-subtle);
|
|
102
|
+
--xh-_toast-edge: var(--xh-_tone-border);
|
|
45
103
|
|
|
46
104
|
display: flex;
|
|
47
|
-
|
|
48
|
-
gap: var(--xh-toast-gap, var(--xh-
|
|
49
|
-
|
|
105
|
+
align-items: center;
|
|
106
|
+
gap: var(--xh-toast-gap, var(--xh-control-gap-md));
|
|
107
|
+
/* 收缩包裹:一句「已保存」撑成定宽方块,右边那片空白会让它读起来像一张公告卡 */
|
|
108
|
+
inline-size: var(--xh-toast-w, auto);
|
|
50
109
|
/* 摞是整面视口宽的定位面且带内边距,取 100% 就等于自动让出两侧留白,
|
|
51
|
-
窄屏上不必再算一遍 viewport
|
|
52
|
-
max-inline-size: 100
|
|
53
|
-
|
|
110
|
+
窄屏上不必再算一遍 viewport 减法;再叠一道绝对上限,免得一条长文案铺成横幅 */
|
|
111
|
+
max-inline-size: min(var(--xh-overlay-max-w-xl), 100%);
|
|
112
|
+
/* 纵内衬取控件档而不是面档:面档(12px)叠上 21px 行盒与两道细边就是 47px 高,
|
|
113
|
+
那是卡片的体量;控件档(8px)落在 39px,与短消息该有的高度一致
|
|
114
|
+
(带叉 42px、带操作钮 46px,那两档本就不是默认排版) */
|
|
115
|
+
padding-block: var(--xh-toast-py, var(--xh-field-py));
|
|
54
116
|
padding-inline: var(--xh-toast-px, var(--xh-surface-px-sm));
|
|
55
|
-
border: var(--xh-stroke-thin) solid var(--xh-toast-border, var(--xh-
|
|
56
|
-
/* 语气色条做成起始侧的粗边,而不是伪元素:圆角与阴影都不用再对第二遍。
|
|
57
|
-
两条必须排在 border 简写之后,否则被简写重置回细边与常规描边色。
|
|
58
|
-
颜色由 connect 从 type 派生的 data-tone 经语气层给出,作者写 --xh-toast-accent
|
|
59
|
-
就能把某一条整体改色;两者都没有时退回原来的 info 蓝 */
|
|
60
|
-
border-inline-start-width: var(--xh-toast-accent-width, var(--xh-space-1));
|
|
61
|
-
border-inline-start-color: var(--xh-toast-accent, var(--xh-_tone-soft, var(--xh-color-info-500)));
|
|
117
|
+
border: var(--xh-stroke-thin) solid var(--xh-toast-border, var(--xh-_toast-edge));
|
|
62
118
|
border-radius: var(--xh-toast-radius, var(--xh-shape-surface));
|
|
63
|
-
background: var(--xh-toast-bg, var(--xh-
|
|
119
|
+
background: var(--xh-toast-bg, var(--xh-_toast-tint));
|
|
64
120
|
color: var(--xh-toast-fg, var(--xh-fg-default));
|
|
65
121
|
box-shadow: var(--xh-toast-shadow, var(--xh-elevation-sheet));
|
|
66
|
-
font-size: var(--xh-toast-font-size, var(--xh-text-
|
|
67
|
-
line-height: var(--xh-toast-leading, var(--xh-leading
|
|
68
|
-
/*
|
|
122
|
+
font-size: var(--xh-toast-font-size, var(--xh-text-body-size));
|
|
123
|
+
line-height: var(--xh-toast-leading, var(--xh-text-body-leading));
|
|
124
|
+
/* 摞的定位面整面铺开且不吃指针,条子必须自己吃回来:
|
|
69
125
|
悬停按住计时、按钮可点、焦点进出,全指着这一条 */
|
|
70
126
|
pointer-events: auto;
|
|
71
127
|
}
|
|
72
128
|
|
|
73
|
-
/* loading 说的是「事情还没完」,不是好消息也不是坏消息,走中性灰。
|
|
74
|
-
它不是语气:连接层给它派生的 neutral 档是 500,而这里要的是 fg-muted(600) */
|
|
75
|
-
[data-scope='toast'][data-part='root'][data-type='loading'] {
|
|
76
|
-
border-inline-start-color: var(--xh-toast-accent, var(--xh-fg-muted));
|
|
77
|
-
}
|
|
78
|
-
|
|
79
129
|
/* 退场窗口走完连接层给的是 hidden 属性,而上面声明了 display——
|
|
80
|
-
漏掉这条,已经"卸载"
|
|
130
|
+
漏掉这条,已经"卸载"的提示会一直杵在屏幕上,且再也没人来收 */
|
|
81
131
|
[data-scope='toast'][data-part='root'][hidden] {
|
|
82
132
|
display: none;
|
|
83
133
|
}
|
|
@@ -88,41 +138,39 @@
|
|
|
88
138
|
}
|
|
89
139
|
|
|
90
140
|
/* forwards 不能省:退场窗口(removeDelay 默认 200ms)比退场动画长,
|
|
91
|
-
|
|
141
|
+
不定住末帧的话动画跑完会弹回全不透明,条子在被收起前先闪一下 */
|
|
92
142
|
[data-scope='toast'][data-part='root'][data-state='dismissing'] {
|
|
93
143
|
animation: xh-toast-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
94
144
|
}
|
|
95
145
|
|
|
96
146
|
[data-scope='toast'][data-part='title'] {
|
|
97
|
-
/* 作者可能把它写成 h2/p
|
|
147
|
+
/* 作者可能把它写成 h2/p,外边距得先归零,否则条子内的行距对不上 */
|
|
98
148
|
margin: 0;
|
|
149
|
+
/* 吃掉剩余宽度,把操作钮与叉推到行尾;min-inline-size 让它在撞上宽度上限时能换行,
|
|
150
|
+
flex 项的 min-width 默认是 auto,不归零的话长文案会把条子顶出上限 */
|
|
151
|
+
flex: 1 1 auto;
|
|
152
|
+
min-inline-size: 0;
|
|
99
153
|
color: var(--xh-toast-title-fg, var(--xh-fg-default));
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
[data-scope='toast'][data-part='description'] {
|
|
106
|
-
margin: 0;
|
|
107
|
-
color: var(--xh-toast-description-fg, var(--xh-fg-muted));
|
|
108
|
-
font-size: var(--xh-toast-description-font-size, var(--xh-text-secondary-size));
|
|
154
|
+
/* 与条子同字号同行高、不加粗:加粗是"这是标题、下面还有正文"的信号,
|
|
155
|
+
而轻提示没有正文——那一层是 notification 的 */
|
|
156
|
+
font-size: var(--xh-toast-title-font-size, var(--xh-text-body-size));
|
|
157
|
+
font-weight: var(--xh-toast-title-font-weight, var(--xh-text-body-weight));
|
|
158
|
+
line-height: var(--xh-toast-title-leading, var(--xh-text-body-leading));
|
|
109
159
|
}
|
|
110
160
|
|
|
111
|
-
/*
|
|
112
|
-
但空盒子会照吃一份 gap
|
|
113
|
-
[data-scope='toast'][data-part='title']:empty
|
|
114
|
-
[data-scope='toast'][data-part='description']:empty {
|
|
161
|
+
/* 没给文案时仍然要留在 DOM 里(aria-labelledby 指着它),
|
|
162
|
+
但空盒子会照吃一份 gap,条子看着就多出一截莫名的留白 */
|
|
163
|
+
[data-scope='toast'][data-part='title']:empty {
|
|
115
164
|
display: none;
|
|
116
165
|
}
|
|
117
166
|
|
|
118
|
-
[data-scope='toast'][data-part='title'][hidden]
|
|
119
|
-
[data-scope='toast'][data-part='description'][hidden] {
|
|
167
|
+
[data-scope='toast'][data-part='title'][hidden] {
|
|
120
168
|
display: none;
|
|
121
169
|
}
|
|
122
170
|
|
|
123
171
|
[data-scope='toast'][data-part='action-trigger'] {
|
|
124
|
-
/*
|
|
125
|
-
|
|
172
|
+
/* 条子是单行 flex,按钮不参与伸缩:文案长了该换行的是文字,不是把按钮压扁 */
|
|
173
|
+
flex: none;
|
|
126
174
|
display: inline-flex;
|
|
127
175
|
align-items: center;
|
|
128
176
|
justify-content: center;
|
|
@@ -132,7 +180,7 @@
|
|
|
132
180
|
border-radius: var(--xh-toast-action-radius, var(--xh-shape-control));
|
|
133
181
|
background: var(--xh-toast-action-bg, var(--xh-bg-subtle));
|
|
134
182
|
color: var(--xh-toast-action-fg, var(--xh-fg-default));
|
|
135
|
-
/*
|
|
183
|
+
/* 按钮不继承字族字号,不接回来的话条子里会突然冒出一段系统 UI 字体 */
|
|
136
184
|
font: inherit;
|
|
137
185
|
font-weight: var(--xh-toast-action-font-weight, var(--xh-font-weight-medium));
|
|
138
186
|
line-height: var(--xh-leading-none);
|
|
@@ -157,14 +205,16 @@
|
|
|
157
205
|
}
|
|
158
206
|
|
|
159
207
|
[data-scope='toast'][data-part='close-trigger'] {
|
|
160
|
-
|
|
161
|
-
/*
|
|
208
|
+
flex: none;
|
|
209
|
+
/* 推到行内末侧;和操作按钮同处一行时排在它后面 */
|
|
162
210
|
margin-inline-start: auto;
|
|
163
211
|
display: inline-flex;
|
|
164
212
|
align-items: center;
|
|
165
213
|
justify-content: center;
|
|
166
|
-
|
|
167
|
-
|
|
214
|
+
/* 行级动作钮那一档(24px),不是浮层角落钮的 28px:
|
|
215
|
+
后者比一行正文的行盒还高,单它就把整条顶高一截 */
|
|
216
|
+
block-size: var(--xh-toast-close-size, var(--xh-control-action-size));
|
|
217
|
+
inline-size: var(--xh-toast-close-size, var(--xh-control-action-size));
|
|
168
218
|
border: 0;
|
|
169
219
|
border-radius: var(--xh-toast-close-radius, var(--xh-shape-control));
|
|
170
220
|
background: transparent;
|