@xihan-ui/styles 1.0.0-alpha.0 → 1.0.0-alpha.2
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 +341 -0
- package/css/accordion.css +5 -0
- package/css/affix.css +5 -0
- package/css/alert.css +5 -0
- package/css/anchor.css +5 -0
- package/css/avatar-group.css +5 -0
- package/css/avatar.css +5 -0
- package/css/back-top.css +7 -2
- package/css/badge.css +5 -0
- package/css/breadcrumb.css +5 -0
- package/css/button-group.css +6 -1
- package/css/button.css +16 -1
- package/css/calendar.css +6 -1
- package/css/card.css +5 -0
- package/css/carousel.css +7 -2
- package/css/cascader.css +204 -24
- package/css/checkbox-group.css +25 -20
- package/css/checkbox.css +6 -1
- package/css/clipboard.css +8 -3
- package/css/code-block.css +5 -0
- package/css/collapsible.css +5 -0
- package/css/color-picker.css +27 -6
- package/css/combobox.css +42 -20
- package/css/composer.css +6 -1
- package/css/context-menu.css +62 -34
- package/css/countdown.css +5 -0
- package/css/date-field.css +10 -5
- package/css/date-picker.css +72 -3
- package/css/descriptions.css +5 -0
- package/css/dialog.css +69 -9
- package/css/drawer.css +33 -12
- package/css/dynamic-input.css +7 -2
- package/css/editable.css +11 -6
- package/css/ellipsis.css +5 -0
- package/css/empty-state.css +5 -0
- package/css/field.css +37 -1
- package/css/file-upload.css +8 -3
- package/css/flex.css +5 -0
- package/css/float-button.css +7 -2
- package/css/form.css +23 -6
- package/css/gradient-text.css +5 -0
- package/css/grid.css +5 -0
- package/css/highlight.css +5 -0
- package/css/hover-card.css +34 -17
- package/css/icon-wrapper.css +5 -0
- package/css/icon.css +5 -0
- package/css/image-viewer.css +196 -0
- package/css/image.css +5 -0
- package/css/infinite-scroll.css +5 -0
- package/css/layout.css +5 -0
- package/css/list.css +5 -0
- package/css/listbox.css +14 -6
- package/css/loading-bar.css +5 -0
- package/css/log.css +5 -0
- package/css/marquee.css +5 -0
- package/css/mention.css +33 -22
- package/css/menu.css +57 -23
- package/css/menubar.css +34 -25
- package/css/navigation-menu.css +6 -1
- package/css/number-animation.css +5 -0
- package/css/number-field.css +21 -16
- package/css/page-header.css +5 -0
- package/css/pagination.css +5 -0
- package/css/pin-input.css +11 -6
- package/css/popconfirm.css +44 -0
- package/css/popover.css +34 -11
- package/css/popselect.css +50 -16
- package/css/progress.css +73 -1
- package/css/qr-code.css +5 -0
- package/css/radio-group.css +6 -1
- package/css/rating.css +5 -0
- package/css/result.css +5 -0
- package/css/scroll-area.css +5 -6
- package/css/select.css +167 -17
- package/css/separator.css +5 -0
- package/css/side-nav.css +168 -0
- package/css/skeleton.css +5 -0
- package/css/slider.css +60 -0
- package/css/spinner.css +9 -1
- package/css/splitter.css +5 -0
- package/css/statistic.css +5 -0
- package/css/steps.css +7 -2
- package/css/switch.css +34 -0
- package/css/table.css +11 -6
- package/css/tabs.css +5 -0
- package/css/tags-input.css +12 -7
- package/css/text-field.css +28 -10
- package/css/thread.css +6 -1
- package/css/time-field.css +10 -5
- package/css/time-picker.css +42 -27
- package/css/time.css +5 -0
- package/css/timeline.css +5 -0
- package/css/toast.css +13 -12
- package/css/toaster.css +5 -0
- package/css/toggle-group.css +6 -1
- package/css/toggle.css +6 -1
- package/css/tone.css +22 -0
- package/css/toolbar.css +5 -0
- package/css/tooltip.css +39 -21
- package/css/tour.css +45 -21
- package/css/transfer.css +16 -9
- package/css/tree-select.css +45 -18
- package/css/tree.css +13 -5
- package/css/typography.css +5 -0
- package/css/virtualizer.css +5 -0
- package/css/watermark.css +5 -0
- package/index.css +6 -3
- package/index.unlayered.css +2325 -588
- package/package.json +4 -3
- package/css/motion.css +0 -58
package/css/drawer.css
CHANGED
|
@@ -1,4 +1,26 @@
|
|
|
1
1
|
@layer xihan.motion {
|
|
2
|
+
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
|
+
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
+
@keyframes xh-fade-in {
|
|
5
|
+
from {
|
|
6
|
+
opacity: 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
to {
|
|
10
|
+
opacity: 1;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@keyframes xh-fade-out {
|
|
15
|
+
from {
|
|
16
|
+
opacity: 1;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
to {
|
|
20
|
+
opacity: 0;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
2
24
|
/* 四条边各一对滑入/滑出。位移量用 translate 的百分比,参照的是面板自己的边框盒,
|
|
3
25
|
所以不管 --xh-drawer-size 被改成多少,"正好推到视口外"这件事都成立。
|
|
4
26
|
|
|
@@ -85,15 +107,14 @@
|
|
|
85
107
|
translate: 0 var(--xh-_drawer-shift-block, 100%);
|
|
86
108
|
}
|
|
87
109
|
}
|
|
88
|
-
|
|
89
|
-
@media (prefers-reduced-motion: reduce) {
|
|
90
|
-
[data-scope='drawer'][data-part] {
|
|
91
|
-
animation-duration: 0.01ms !important;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
110
|
}
|
|
95
111
|
|
|
96
112
|
@layer xihan.components {
|
|
113
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
114
|
+
[data-scope='drawer'] {
|
|
115
|
+
--xh-drawer-skin: 1;
|
|
116
|
+
}
|
|
117
|
+
|
|
97
118
|
/* root 留在页面原地,只是 data-side / data-state 的落点,不该凭空多出一层盒子把
|
|
98
119
|
trigger 从作者的 flex / grid 行里挤出去,故 display: contents。 */
|
|
99
120
|
[data-scope='drawer'][data-part='root'] {
|
|
@@ -112,7 +133,7 @@
|
|
|
112
133
|
gap: var(--xh-drawer-trigger-gap, var(--xh-control-gap-md));
|
|
113
134
|
block-size: var(--xh-drawer-trigger-h, var(--xh-control-h-md));
|
|
114
135
|
padding-inline: var(--xh-drawer-trigger-px, var(--xh-control-px-md));
|
|
115
|
-
border: var(--xh-stroke-thin) solid var(--xh-drawer-trigger-border, var(--xh-border-
|
|
136
|
+
border: var(--xh-stroke-thin) solid var(--xh-drawer-trigger-border, var(--xh-border-control));
|
|
116
137
|
border-radius: var(--xh-drawer-trigger-radius, var(--xh-shape-control));
|
|
117
138
|
background: var(--xh-drawer-trigger-bg, var(--xh-bg-canvas));
|
|
118
139
|
color: var(--xh-drawer-trigger-fg, var(--xh-fg-default));
|
|
@@ -132,14 +153,14 @@
|
|
|
132
153
|
|
|
133
154
|
[data-scope='drawer'][data-part='trigger']:hover:not(:disabled) {
|
|
134
155
|
background: var(--xh-drawer-trigger-bg-hover, var(--xh-bg-subtle-hover));
|
|
135
|
-
border-color: var(--xh-drawer-trigger-border-hover, var(--xh-border-
|
|
156
|
+
border-color: var(--xh-drawer-trigger-border-hover, var(--xh-border-control-hover));
|
|
136
157
|
}
|
|
137
158
|
|
|
138
159
|
/* 抽屉展开期间触发按钮压住不弹起:面板贴在视口边上,它和按钮往往离得很远,
|
|
139
160
|
按钮自己得说明"这一扇是我开的"。 */
|
|
140
161
|
[data-scope='drawer'][data-part='trigger'][data-state='open'] {
|
|
141
162
|
background: var(--xh-drawer-trigger-bg-open, var(--xh-bg-subtle-active));
|
|
142
|
-
border-color: var(--xh-drawer-trigger-border-open, var(--xh-border-
|
|
163
|
+
border-color: var(--xh-drawer-trigger-border-open, var(--xh-border-control-hover));
|
|
143
164
|
}
|
|
144
165
|
|
|
145
166
|
[data-scope='drawer'][data-part='trigger']:focus-visible {
|
|
@@ -218,9 +239,9 @@
|
|
|
218
239
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致。
|
|
219
240
|
收起态连接层会给 content 打 hidden,而上面这条 display: flex 正是要盖掉
|
|
220
241
|
UA 的 [hidden]{display:none}——退场动画得先能播:
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
242
|
+
presence 读的是 content 的 animationName,读到就申领租约、等 animationend 才卸载;
|
|
243
|
+
一旦 display: none,元素不生成盒子、动画根本不启动,退场探测器会直接放弃申领
|
|
244
|
+
(否则就要等一个永不到来的 animationend),面板不播动画就地卸载。
|
|
224
245
|
真正的收起两个适配器各自兜住了:Vue 卸载整棵,WC 写内联 style.display。
|
|
225
246
|
其余声明了 display 的角色节点仍补了 [hidden],那几处没有退场动画,作者手写 hidden 要生效。 */
|
|
226
247
|
|
package/css/dynamic-input.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='dynamic-input'] {
|
|
4
|
+
--xh-dynamic-input-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 一行一条,纵向堆叠;新增把手跟在最后一行下面 */
|
|
3
8
|
[data-scope='dynamic-input'][data-part='root'] {
|
|
4
9
|
display: flex;
|
|
@@ -117,7 +122,7 @@
|
|
|
117
122
|
gap: var(--xh-dynamic-input-action-gap, var(--xh-space-1));
|
|
118
123
|
block-size: var(--xh-dynamic-input-add-height, var(--xh-control-h-md));
|
|
119
124
|
padding-inline: var(--xh-dynamic-input-add-px, var(--xh-control-px-md));
|
|
120
|
-
border: var(--xh-stroke-thin) dashed var(--xh-dynamic-input-add-border, var(--xh-border-
|
|
125
|
+
border: var(--xh-stroke-thin) dashed var(--xh-dynamic-input-add-border, var(--xh-border-control));
|
|
121
126
|
border-radius: var(--xh-dynamic-input-add-radius, var(--xh-shape-control));
|
|
122
127
|
background: var(--xh-dynamic-input-add-bg, transparent);
|
|
123
128
|
color: var(--xh-dynamic-input-add-fg, var(--xh-fg-brand));
|
|
@@ -135,7 +140,7 @@
|
|
|
135
140
|
}
|
|
136
141
|
|
|
137
142
|
[data-scope='dynamic-input'][data-part='add-trigger']:hover:not([aria-disabled='true']) {
|
|
138
|
-
border-color: var(--xh-dynamic-input-add-border-hover, var(--xh-border-
|
|
143
|
+
border-color: var(--xh-dynamic-input-add-border-hover, var(--xh-border-control-hover));
|
|
139
144
|
background: var(--xh-dynamic-input-add-bg-hover, var(--xh-bg-subtle-hover));
|
|
140
145
|
}
|
|
141
146
|
|
package/css/editable.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='editable'] {
|
|
4
|
+
--xh-editable-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 就地编辑是"一行文字里的一处可改内容":标题、显示区与按钮天然同行,
|
|
3
8
|
所以根是一条横向的行,而不是文本框那种"标题一行、控件一行"的竖排。
|
|
4
9
|
要竖排的作者把 flex-direction 覆盖掉即可,其余尺寸都长在各自的角色节点上 */
|
|
@@ -103,7 +108,7 @@
|
|
|
103
108
|
block-size: var(--xh-editable-input-h, var(--xh-control-h-md));
|
|
104
109
|
padding-inline: var(--xh-editable-input-px, var(--xh-control-px-md));
|
|
105
110
|
padding-block: 0;
|
|
106
|
-
border: var(--xh-stroke-thin) solid var(--xh-editable-input-border, var(--xh-border-
|
|
111
|
+
border: var(--xh-stroke-thin) solid var(--xh-editable-input-border, var(--xh-border-control));
|
|
107
112
|
border-radius: var(--xh-editable-input-radius, var(--xh-shape-control));
|
|
108
113
|
background: var(--xh-editable-input-bg, var(--xh-bg-canvas));
|
|
109
114
|
color: var(--xh-editable-input-fg, var(--xh-fg-default));
|
|
@@ -131,7 +136,7 @@
|
|
|
131
136
|
|
|
132
137
|
/* hover 只在中性态换描边:invalid 正拿边框颜色说事,被 hover 盖掉那条信息就没了 */
|
|
133
138
|
[data-scope='editable'][data-part='input']:hover:not(:disabled, [data-invalid]) {
|
|
134
|
-
border-color: var(--xh-editable-input-border-hover, var(--xh-border-
|
|
139
|
+
border-color: var(--xh-editable-input-border-hover, var(--xh-border-control-hover));
|
|
135
140
|
}
|
|
136
141
|
|
|
137
142
|
[data-scope='editable'][data-part='input']:focus-visible {
|
|
@@ -178,7 +183,7 @@
|
|
|
178
183
|
block-size: var(--xh-editable-trigger-h, var(--xh-control-h-sm));
|
|
179
184
|
padding-inline: var(--xh-editable-trigger-px, var(--xh-control-px-sm));
|
|
180
185
|
padding-block: 0;
|
|
181
|
-
border: var(--xh-stroke-thin) solid var(--xh-editable-trigger-border, var(--xh-border-
|
|
186
|
+
border: var(--xh-stroke-thin) solid var(--xh-editable-trigger-border, var(--xh-border-control));
|
|
182
187
|
border-radius: var(--xh-editable-trigger-radius, var(--xh-shape-control));
|
|
183
188
|
background: var(--xh-editable-trigger-bg, var(--xh-bg-subtle));
|
|
184
189
|
color: var(--xh-editable-trigger-fg, var(--xh-fg-default));
|
|
@@ -202,7 +207,7 @@
|
|
|
202
207
|
[data-scope='editable'][data-part='edit-trigger']:hover:not(:disabled),
|
|
203
208
|
[data-scope='editable'][data-part='submit-trigger']:hover:not(:disabled),
|
|
204
209
|
[data-scope='editable'][data-part='cancel-trigger']:hover:not(:disabled) {
|
|
205
|
-
border-color: var(--xh-editable-trigger-border-hover, var(--xh-border-
|
|
210
|
+
border-color: var(--xh-editable-trigger-border-hover, var(--xh-border-control-hover));
|
|
206
211
|
background: var(--xh-editable-trigger-bg-hover, var(--xh-bg-subtle-hover));
|
|
207
212
|
}
|
|
208
213
|
|
|
@@ -238,12 +243,12 @@
|
|
|
238
243
|
}
|
|
239
244
|
|
|
240
245
|
[data-scope='editable'][data-part='submit-trigger']:hover:not(:disabled) {
|
|
241
|
-
border-color: var(--xh-editable-submit-bg-hover, var(--xh-bg-brand-hover));
|
|
246
|
+
border-color: var(--xh-editable-submit-border-hover, var(--xh-editable-submit-bg-hover, var(--xh-bg-brand-hover)));
|
|
242
247
|
background: var(--xh-editable-submit-bg-hover, var(--xh-bg-brand-hover));
|
|
243
248
|
}
|
|
244
249
|
|
|
245
250
|
[data-scope='editable'][data-part='submit-trigger']:active:not(:disabled) {
|
|
246
|
-
border-color: var(--xh-editable-submit-bg-active, var(--xh-bg-brand-active));
|
|
251
|
+
border-color: var(--xh-editable-submit-border-active, var(--xh-editable-submit-bg-active, var(--xh-bg-brand-active)));
|
|
247
252
|
background: var(--xh-editable-submit-bg-active, var(--xh-bg-brand-active));
|
|
248
253
|
}
|
|
249
254
|
}
|
package/css/ellipsis.css
CHANGED
package/css/empty-state.css
CHANGED
package/css/field.css
CHANGED
|
@@ -1,10 +1,39 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='field'] {
|
|
4
|
+
--xh-field-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
[data-scope='field'][data-part='root'] {
|
|
3
8
|
display: flex;
|
|
4
9
|
flex-direction: column;
|
|
5
10
|
gap: var(--xh-field-gap, var(--xh-space-1));
|
|
6
11
|
}
|
|
7
12
|
|
|
13
|
+
/* 表单横排(标签左置):字段转两列网格,标签列宽由表单的 --xh-form-label-w 统一给,
|
|
14
|
+
整表据此对齐;描述与错误文案跟着控件走第二列 */
|
|
15
|
+
[data-scope='form'][data-part='root'][data-layout='horizontal'] [data-scope='field'][data-part='root'] {
|
|
16
|
+
display: grid;
|
|
17
|
+
grid-template-columns: var(--xh-form-label-w) minmax(0, 1fr);
|
|
18
|
+
column-gap: var(--xh-field-label-gap, var(--xh-space-3));
|
|
19
|
+
align-items: start;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
[data-scope='form'][data-part='root'][data-layout='horizontal'] [data-scope='field'][data-part='label'] {
|
|
23
|
+
grid-column: 1;
|
|
24
|
+
justify-self: end;
|
|
25
|
+
/* 与控件的首行文字对齐:按控件高度撑一行再居中 */
|
|
26
|
+
line-height: var(--xh-control-h-md);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
[data-scope='form'][data-part='root'][data-layout='horizontal'][data-label-align='start'] [data-scope='field'][data-part='label'] {
|
|
30
|
+
justify-self: start;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
[data-scope='form'][data-part='root'][data-layout='horizontal'] [data-scope='field'][data-part='root'] > :not([data-part='label']) {
|
|
34
|
+
grid-column: 2;
|
|
35
|
+
}
|
|
36
|
+
|
|
8
37
|
[data-scope='field'][data-part='label'] {
|
|
9
38
|
color: var(--xh-field-label-fg, var(--xh-fg-default));
|
|
10
39
|
font-size: var(--xh-field-label-font-size, var(--xh-text-label-size));
|
|
@@ -16,12 +45,19 @@
|
|
|
16
45
|
color: var(--xh-field-label-fg-disabled, var(--xh-fg-subtle));
|
|
17
46
|
}
|
|
18
47
|
|
|
48
|
+
/* 必填星号:跟着根上的 data-required 亮,选填不标 */
|
|
49
|
+
[data-scope='field'][data-part='root'][data-required] [data-part='label']::after {
|
|
50
|
+
content: '*';
|
|
51
|
+
margin-inline-start: var(--xh-space-1);
|
|
52
|
+
color: var(--xh-field-label-star, var(--xh-fg-danger));
|
|
53
|
+
}
|
|
54
|
+
|
|
19
55
|
/* control 是作者自己的输入控件,这里只给一套可被覆盖的基础皮肤 */
|
|
20
56
|
[data-scope='field'][data-part='control'] {
|
|
21
57
|
inline-size: 100%;
|
|
22
58
|
block-size: var(--xh-field-control-h, var(--xh-control-h-md));
|
|
23
59
|
padding-inline: var(--xh-field-control-px, var(--xh-control-px-md));
|
|
24
|
-
border: var(--xh-stroke-thin) solid var(--xh-field-control-border, var(--xh-border-
|
|
60
|
+
border: var(--xh-stroke-thin) solid var(--xh-field-control-border, var(--xh-border-control));
|
|
25
61
|
border-radius: var(--xh-field-control-radius, var(--xh-shape-control));
|
|
26
62
|
background: var(--xh-field-control-bg, var(--xh-bg-canvas));
|
|
27
63
|
color: var(--xh-field-control-fg, var(--xh-fg-default));
|
package/css/file-upload.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='file-upload'] {
|
|
4
|
+
--xh-file-upload-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
[data-scope='file-upload'][data-part='root'] {
|
|
3
8
|
display: flex;
|
|
4
9
|
flex-direction: column;
|
|
@@ -32,7 +37,7 @@
|
|
|
32
37
|
min-block-size: var(--xh-file-upload-dropzone-min-h, 8rem);
|
|
33
38
|
padding-block: var(--xh-file-upload-dropzone-py, var(--xh-space-5));
|
|
34
39
|
padding-inline: var(--xh-file-upload-dropzone-px, var(--xh-space-4));
|
|
35
|
-
border: var(--xh-stroke-thick) dashed var(--xh-file-upload-dropzone-border, var(--xh-border-
|
|
40
|
+
border: var(--xh-stroke-thick) dashed var(--xh-file-upload-dropzone-border, var(--xh-border-control));
|
|
36
41
|
border-radius: var(--xh-file-upload-dropzone-radius, var(--xh-shape-surface));
|
|
37
42
|
background: var(--xh-file-upload-dropzone-bg, var(--xh-bg-canvas));
|
|
38
43
|
color: var(--xh-file-upload-dropzone-fg, var(--xh-fg-muted));
|
|
@@ -51,7 +56,7 @@
|
|
|
51
56
|
|
|
52
57
|
/* hover 只在中性态换描边:invalid 与 dragging 正拿边框颜色说事,被 hover 盖掉那条信息就没了 */
|
|
53
58
|
[data-scope='file-upload'][data-part='dropzone']:hover:not([data-disabled], [data-invalid], [data-dragging]) {
|
|
54
|
-
border-color: var(--xh-file-upload-dropzone-border-hover, var(--xh-border-
|
|
59
|
+
border-color: var(--xh-file-upload-dropzone-border-hover, var(--xh-border-control-hover));
|
|
55
60
|
}
|
|
56
61
|
|
|
57
62
|
/* 投放区自己承载焦点(它就是那个大按钮),所以画环而不是 outline:none */
|
|
@@ -86,7 +91,7 @@
|
|
|
86
91
|
gap: var(--xh-file-upload-trigger-gap, var(--xh-control-gap-md));
|
|
87
92
|
block-size: var(--xh-file-upload-trigger-h, var(--xh-control-h-md));
|
|
88
93
|
padding-inline: var(--xh-file-upload-trigger-px, var(--xh-control-px-md));
|
|
89
|
-
border: var(--xh-stroke-thin) solid var(--xh-file-upload-trigger-border, var(--xh-border-
|
|
94
|
+
border: var(--xh-stroke-thin) solid var(--xh-file-upload-trigger-border, var(--xh-border-control));
|
|
90
95
|
border-radius: var(--xh-file-upload-trigger-radius, var(--xh-shape-control));
|
|
91
96
|
background: var(--xh-file-upload-trigger-bg, var(--xh-bg-surface));
|
|
92
97
|
color: var(--xh-file-upload-trigger-fg, var(--xh-fg-default));
|
package/css/flex.css
CHANGED
package/css/float-button.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='float-button'] {
|
|
4
|
+
--xh-float-button-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 定位壳:钉在视口一角。贴边距离由连接层写进这个盒子的内联 style,
|
|
3
8
|
样式表这一行只是它缺席时的落点;贴的是哪两条边看 data-placement。
|
|
4
9
|
另一件必须提防的事:fixed 认的是视口,祖先上一旦出现
|
|
@@ -56,7 +61,7 @@
|
|
|
56
61
|
inline-size: var(--xh-_float-button-size);
|
|
57
62
|
block-size: var(--xh-_float-button-size);
|
|
58
63
|
padding: 0;
|
|
59
|
-
border: var(--xh-stroke-thin) solid var(--xh-float-button-border, var(--xh-border-
|
|
64
|
+
border: var(--xh-stroke-thin) solid var(--xh-float-button-border, var(--xh-border-control));
|
|
60
65
|
border-radius: var(--xh-_float-button-radius);
|
|
61
66
|
/* 使用者令牌排在缺省之前:写了覆盖钩子就以它为准,没写才退到中性缺省 */
|
|
62
67
|
background: var(--xh-float-button-bg, var(--xh-bg-surface-raised));
|
|
@@ -72,7 +77,7 @@
|
|
|
72
77
|
/* 悬停只在能用指针的设备上生效,触摸端不留一个按不掉的悬停态 */
|
|
73
78
|
@media (hover: hover) {
|
|
74
79
|
[data-scope='float-button'][data-part='trigger']:not([data-disabled]):hover {
|
|
75
|
-
border-color: var(--xh-float-button-border-hover, var(--xh-border-
|
|
80
|
+
border-color: var(--xh-float-button-border-hover, var(--xh-border-control-hover));
|
|
76
81
|
background: var(--xh-float-button-bg-hover, var(--xh-bg-subtle-hover));
|
|
77
82
|
}
|
|
78
83
|
}
|
package/css/form.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='form'] {
|
|
4
|
+
--xh-form-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 表单是一列字段:竖排、字段之间留一档间距。root 就是那个原生 <form> */
|
|
3
8
|
[data-scope='form'][data-part='root'] {
|
|
4
9
|
display: flex;
|
|
@@ -12,6 +17,18 @@
|
|
|
12
17
|
display: none;
|
|
13
18
|
}
|
|
14
19
|
|
|
20
|
+
/* 标签左置:标签列宽的缺省档在这儿,labelWidth 会以行内样式盖过它 */
|
|
21
|
+
[data-scope='form'][data-part='root'][data-layout='horizontal'] {
|
|
22
|
+
--xh-form-label-w: 30%;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* 横排一行流:字段并肩排,放不下自动折行 */
|
|
26
|
+
[data-scope='form'][data-part='root'][data-layout='inline'] {
|
|
27
|
+
flex-flow: row wrap;
|
|
28
|
+
align-items: start;
|
|
29
|
+
column-gap: var(--xh-form-inline-gap, var(--xh-space-4));
|
|
30
|
+
}
|
|
31
|
+
|
|
15
32
|
/* 字段容器只管排版与状态标记:标题、控件、描述、错误文案都是里面那个 Field 的活儿 */
|
|
16
33
|
[data-scope='form'][data-part='field-group'] {
|
|
17
34
|
display: flex;
|
|
@@ -104,7 +121,7 @@
|
|
|
104
121
|
block-size: var(--xh-form-trigger-h, var(--xh-control-h-md));
|
|
105
122
|
padding-block: 0;
|
|
106
123
|
padding-inline: var(--xh-form-trigger-px, var(--xh-control-px-md));
|
|
107
|
-
border: var(--xh-stroke-thin) solid var(--xh-form-trigger-border, var(--xh-border-
|
|
124
|
+
border: var(--xh-stroke-thin) solid var(--xh-form-trigger-border, var(--xh-border-control));
|
|
108
125
|
border-radius: var(--xh-form-trigger-radius, var(--xh-shape-control));
|
|
109
126
|
background: var(--xh-form-trigger-bg, var(--xh-bg-subtle));
|
|
110
127
|
color: var(--xh-form-trigger-fg, var(--xh-fg-default));
|
|
@@ -125,7 +142,7 @@
|
|
|
125
142
|
|
|
126
143
|
[data-scope='form'][data-part='submit-trigger']:hover:not(:disabled),
|
|
127
144
|
[data-scope='form'][data-part='reset-trigger']:hover:not(:disabled) {
|
|
128
|
-
border-color: var(--xh-form-trigger-border-hover, var(--xh-border-
|
|
145
|
+
border-color: var(--xh-form-trigger-border-hover, var(--xh-border-control-hover));
|
|
129
146
|
background: var(--xh-form-trigger-bg-hover, var(--xh-bg-subtle-hover));
|
|
130
147
|
}
|
|
131
148
|
|
|
@@ -152,18 +169,18 @@
|
|
|
152
169
|
|
|
153
170
|
/* 提交是这一组里的主操作,给它一层实心底色区分开 */
|
|
154
171
|
[data-scope='form'][data-part='submit-trigger']:not(:disabled) {
|
|
155
|
-
border-color: var(--xh-form-submit-bg, var(--xh-bg-brand));
|
|
172
|
+
border-color: var(--xh-form-submit-border, var(--xh-form-submit-bg, var(--xh-bg-brand)));
|
|
156
173
|
background: var(--xh-form-submit-bg, var(--xh-bg-brand));
|
|
157
174
|
color: var(--xh-form-submit-fg, var(--xh-fg-on-brand));
|
|
158
175
|
}
|
|
159
176
|
|
|
160
177
|
[data-scope='form'][data-part='submit-trigger']:hover:not(:disabled) {
|
|
161
|
-
border-color: var(--xh-form-submit-bg-hover, var(--xh-bg-brand-hover));
|
|
178
|
+
border-color: var(--xh-form-submit-border-hover, var(--xh-form-submit-bg-hover, var(--xh-bg-brand-hover)));
|
|
162
179
|
background: var(--xh-form-submit-bg-hover, var(--xh-bg-brand-hover));
|
|
163
180
|
}
|
|
164
181
|
|
|
165
182
|
[data-scope='form'][data-part='submit-trigger']:active:not(:disabled) {
|
|
166
|
-
border-color: var(--xh-form-submit-bg-active, var(--xh-bg-brand-active));
|
|
183
|
+
border-color: var(--xh-form-submit-border-active, var(--xh-form-submit-bg-active, var(--xh-bg-brand-active)));
|
|
167
184
|
background: var(--xh-form-submit-bg-active, var(--xh-bg-brand-active));
|
|
168
185
|
}
|
|
169
186
|
}
|
|
@@ -174,7 +191,7 @@
|
|
|
174
191
|
@keyframes xh-form-summary-enter {
|
|
175
192
|
from {
|
|
176
193
|
opacity: 0;
|
|
177
|
-
translate: 0 calc(-1 * var(--xh-
|
|
194
|
+
translate: 0 calc(-1 * var(--xh-motion-distance-sm));
|
|
178
195
|
}
|
|
179
196
|
|
|
180
197
|
to {
|
package/css/gradient-text.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='gradient-text'] {
|
|
4
|
+
--xh-gradient-text-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 渐变画在背景上,再用 background-clip 把背景裁进字形里;前景必须透明才透得出底下的渐变。
|
|
3
8
|
两条 background-clip 都写:WebKit 只认带前缀那条。
|
|
4
9
|
-webkit-text-fill-color 在 WebKit 里决定字形填充色并盖过 color,也要一并透明。 */
|
package/css/grid.css
CHANGED
package/css/highlight.css
CHANGED
package/css/hover-card.css
CHANGED
|
@@ -1,4 +1,23 @@
|
|
|
1
|
+
@layer xihan.motion {
|
|
2
|
+
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
|
+
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
+
@keyframes xh-fade-in {
|
|
5
|
+
from {
|
|
6
|
+
opacity: 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
to {
|
|
10
|
+
opacity: 1;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
1
15
|
@layer xihan.components {
|
|
16
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
17
|
+
[data-scope='hover-card'] {
|
|
18
|
+
--xh-hover-card-skin: 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
2
21
|
/* 根节点只把 trigger 与浮层收在一处,不参与定位(坐标系仍由祖先的定位上下文决定) */
|
|
3
22
|
[data-scope='hover-card'][data-part='root'] {
|
|
4
23
|
display: inline-block;
|
|
@@ -100,47 +119,45 @@
|
|
|
100
119
|
}
|
|
101
120
|
|
|
102
121
|
/* 箭头是旋转 45° 的方块,只保留朝向锚点那两条边的描边;
|
|
103
|
-
|
|
122
|
+
交叉轴落点由定位引擎经内联自定义属性写进来,没给时退回居中 */
|
|
104
123
|
[data-scope='hover-card'][data-part='arrow'] {
|
|
124
|
+
--xh-_hover-card-arrow-size: var(--xh-hover-card-arrow-size, var(--xh-overlay-arrow-size));
|
|
125
|
+
--xh-_hover-card-arrow-x: 50%;
|
|
126
|
+
--xh-_hover-card-arrow-y: 50%;
|
|
127
|
+
|
|
105
128
|
position: absolute;
|
|
106
|
-
inline-size: var(--xh-
|
|
107
|
-
block-size: var(--xh-
|
|
129
|
+
inline-size: var(--xh-_hover-card-arrow-size);
|
|
130
|
+
block-size: var(--xh-_hover-card-arrow-size);
|
|
108
131
|
border: var(--xh-stroke-thin) solid var(--xh-hover-card-border, var(--xh-border-default));
|
|
109
132
|
background: var(--xh-hover-card-bg, var(--xh-bg-surface));
|
|
110
133
|
rotate: 45deg;
|
|
111
134
|
}
|
|
112
135
|
|
|
113
136
|
[data-scope='hover-card'][data-part='arrow'][data-placement^='bottom'] {
|
|
114
|
-
inset-block-start: calc(var(--xh-
|
|
115
|
-
inset-inline-start: calc(
|
|
137
|
+
inset-block-start: calc(var(--xh-_hover-card-arrow-size) / -2);
|
|
138
|
+
inset-inline-start: calc(var(--xh-_hover-card-arrow-x) - var(--xh-_hover-card-arrow-size) / 2);
|
|
116
139
|
border-block-end: 0;
|
|
117
140
|
border-inline-end: 0;
|
|
118
141
|
}
|
|
119
142
|
|
|
120
143
|
[data-scope='hover-card'][data-part='arrow'][data-placement^='top'] {
|
|
121
|
-
inset-block-end: calc(var(--xh-
|
|
122
|
-
inset-inline-start: calc(
|
|
144
|
+
inset-block-end: calc(var(--xh-_hover-card-arrow-size) / -2);
|
|
145
|
+
inset-inline-start: calc(var(--xh-_hover-card-arrow-x) - var(--xh-_hover-card-arrow-size) / 2);
|
|
123
146
|
border-block-start: 0;
|
|
124
147
|
border-inline-start: 0;
|
|
125
148
|
}
|
|
126
149
|
|
|
127
150
|
[data-scope='hover-card'][data-part='arrow'][data-placement^='right'] {
|
|
128
|
-
inset-inline-start: calc(var(--xh-
|
|
129
|
-
inset-block-start: calc(
|
|
151
|
+
inset-inline-start: calc(var(--xh-_hover-card-arrow-size) / -2);
|
|
152
|
+
inset-block-start: calc(var(--xh-_hover-card-arrow-y) - var(--xh-_hover-card-arrow-size) / 2);
|
|
130
153
|
border-block-start: 0;
|
|
131
154
|
border-inline-end: 0;
|
|
132
155
|
}
|
|
133
156
|
|
|
134
157
|
[data-scope='hover-card'][data-part='arrow'][data-placement^='left'] {
|
|
135
|
-
inset-inline-end: calc(var(--xh-
|
|
136
|
-
inset-block-start: calc(
|
|
158
|
+
inset-inline-end: calc(var(--xh-_hover-card-arrow-size) / -2);
|
|
159
|
+
inset-block-start: calc(var(--xh-_hover-card-arrow-y) - var(--xh-_hover-card-arrow-size) / 2);
|
|
137
160
|
border-block-end: 0;
|
|
138
161
|
border-inline-start: 0;
|
|
139
162
|
}
|
|
140
|
-
|
|
141
|
-
@media (prefers-reduced-motion: reduce) {
|
|
142
|
-
[data-scope='hover-card'][data-part='content'] {
|
|
143
|
-
animation-duration: 0.01ms !important;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
163
|
}
|
package/css/icon-wrapper.css
CHANGED