@xihan-ui/styles 2.1.0 → 3.1.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 +1261 -0
- package/README.md +6 -1
- package/component-tokens.d.ts +533 -96
- package/components.tokens.json +35461 -26045
- package/css/accordion.css +34 -8
- package/css/alert.css +59 -1
- package/css/anchor.css +46 -8
- package/css/approval.css +116 -76
- package/css/avatar-group.css +1 -1
- package/css/avatar.css +13 -5
- package/css/back-top.css +61 -42
- package/css/badge.css +62 -12
- package/css/bar-code.css +1 -1
- package/css/breadcrumb.css +62 -3
- package/css/button-group.css +4 -4
- package/css/button.css +67 -19
- package/css/calendar-picker.css +19 -0
- package/css/calendar-range-picker.css +39 -2
- package/css/card.css +115 -1
- package/css/carousel.css +148 -43
- package/css/cartesian-chart.css +830 -0
- package/css/cascader.css +181 -65
- package/css/checkbox-group.css +59 -89
- package/css/checkbox.css +16 -49
- package/css/citation.css +470 -0
- package/css/clipboard.css +20 -63
- package/css/code-view.css +101 -6
- package/css/collapsible.css +34 -8
- package/css/color-field.css +18 -0
- package/css/color-picker.css +128 -50
- package/css/color-slider.css +22 -15
- package/css/color-swatch-picker.css +3 -1
- package/css/combobox.css +80 -33
- package/css/command.css +45 -43
- package/css/context-menu.css +39 -22
- package/css/date-field.css +56 -0
- package/css/date-picker.css +132 -26
- package/css/date-range-picker.css +337 -14
- package/css/description.css +17 -1
- package/css/descriptions.css +42 -0
- package/css/dialog.css +94 -36
- package/css/diff-view.css +97 -12
- package/css/download-trigger.css +44 -78
- package/css/drawer.css +160 -119
- package/css/editable.css +19 -0
- package/css/empty-state.css +7 -6
- package/css/field-array.css +36 -0
- package/css/field.css +20 -18
- package/css/file-upload.css +125 -135
- package/css/flex.css +324 -8
- package/css/float-button.css +263 -38
- package/css/floating-panel.css +53 -19
- package/css/form.css +31 -17
- package/css/funnel-chart.css +106 -0
- package/css/graph-chart.css +205 -0
- package/css/grid-list.css +235 -0
- package/css/grid.css +252 -1
- package/css/heatmap.css +119 -36
- package/css/hierarchy-chart.css +298 -0
- package/css/hover-card.css +31 -14
- package/css/icon.css +100 -0
- package/css/image-cropper.css +33 -7
- package/css/image-viewer.css +167 -22
- package/css/image.css +23 -4
- package/css/input-group.css +11 -13
- package/css/json-viewer.css +50 -2
- package/css/layout.css +68 -18
- package/css/liquid.css +106 -0
- package/css/list.css +1 -1
- package/css/listbox.css +46 -6
- package/css/loading-bar.css +27 -13
- package/css/log.css +129 -33
- package/css/markdown-stream.css +1 -1
- package/css/marquee.css +163 -7
- package/css/matrix-code.css +1 -1
- package/css/mention.css +35 -19
- package/css/menu.css +35 -21
- package/css/menubar.css +36 -20
- package/css/message-feed.css +172 -51
- package/css/navigation-menu.css +172 -11
- package/css/notification.css +435 -108
- package/css/number-field.css +22 -0
- package/css/page-header.css +3 -1
- package/css/pagination.css +126 -24
- package/css/password-input.css +40 -8
- package/css/pie-chart.css +247 -0
- package/css/popconfirm.css +44 -50
- package/css/popover.css +50 -14
- package/css/progress.css +308 -10
- package/css/prompt-input.css +36 -0
- package/css/question-flow.css +97 -57
- package/css/radar-chart.css +233 -0
- package/css/radio-group.css +363 -5
- package/css/rating.css +21 -23
- package/css/reasoning.css +61 -54
- package/css/resizable.css +6 -1
- package/css/sankey-chart.css +174 -0
- package/css/scroll-area.css +32 -0
- package/css/scrollbar.css +1 -1
- package/css/select.css +74 -55
- package/css/side-nav.css +173 -24
- package/css/signature-pad.css +16 -1
- package/css/skeleton.css +13 -14
- package/css/slider.css +35 -13
- package/css/sortable.css +37 -7
- package/css/sparkline.css +164 -0
- package/css/spinner.css +50 -22
- package/css/splitter.css +7 -1
- package/css/statistic.css +10 -0
- package/css/steps.css +248 -29
- package/css/switch.css +23 -48
- package/css/table.css +175 -118
- package/css/tabs.css +231 -19
- package/css/tag-group.css +27 -3
- package/css/tag.css +53 -12
- package/css/tags-input.css +40 -3
- package/css/text-field.css +19 -0
- package/css/time-field.css +20 -1
- package/css/time-picker.css +103 -17
- package/css/time-range-picker.css +45 -16
- package/css/timeline.css +1 -1
- package/css/toggle-group.css +4 -4
- package/css/toggle.css +4 -3
- package/css/tool-call.css +59 -51
- package/css/toolbar.css +101 -3
- package/css/tooltip.css +15 -2
- package/css/tour.css +42 -12
- package/css/transfer.css +98 -75
- package/css/tree-select.css +232 -53
- package/css/tree.css +271 -55
- package/css/truncate.css +55 -12
- package/css/typography.css +93 -0
- package/css/virtualizer.css +56 -0
- package/css/watermark.css +23 -0
- package/family/action-control.css +14 -5
- package/family/chart.css +480 -0
- package/family/check-mark.css +94 -0
- package/family/choice-card.css +97 -0
- package/family/collection-item.css +9 -15
- package/family/field-chrome.css +1 -12
- package/family/loading-ring.css +95 -0
- package/family/material.css +72 -0
- package/family/menu-choice.css +56 -0
- package/family/motion.css +207 -10
- package/family/tag-list.css +59 -0
- package/index.css +13824 -4030
- package/index.unlayered.css +13403 -3605
- package/package.json +20 -8
- package/css/gradient-text.css +0 -91
- package/css/icon-wrapper.css +0 -81
- package/css/segmented.css +0 -280
- package/css/toast.css +0 -499
package/css/slider.css
CHANGED
|
@@ -133,6 +133,15 @@
|
|
|
133
133
|
inline-size: 100%;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
/* 两端拇指之间可以整段拖动:区间给出「抓得住」的光标,拖动中换成「抓着」 */
|
|
137
|
+
[data-scope='slider'][data-part='range'][data-draggable] {
|
|
138
|
+
cursor: grab;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
[data-scope='slider'][data-part='range'][data-draggable][data-dragging] {
|
|
142
|
+
cursor: grabbing;
|
|
143
|
+
}
|
|
144
|
+
|
|
136
145
|
[data-scope='slider'][data-part='range'][data-invalid] {
|
|
137
146
|
background: var(--xh-slider-range-bg-invalid, var(--xh-border-invalid));
|
|
138
147
|
}
|
|
@@ -144,13 +153,15 @@
|
|
|
144
153
|
/* 圆点浮在轨道之上:轨道是流内的,拇指是绝对定位的,天然后来居上,不必再堆 z-index。
|
|
145
154
|
box-sizing 必须显式写:描边要吃进直径里,否则实际盒子比 --xh-_thumb-size 宽两条边,
|
|
146
155
|
下面按半个直径回拉的负外边距就对不上圆心。
|
|
147
|
-
拇指是可拖起的 raised
|
|
156
|
+
拇指是可拖起的 raised 面:描边取装饰边(不透明档),raised 影只是加成、不作边界 */
|
|
148
157
|
[data-scope='slider'][data-part='thumb'] {
|
|
149
158
|
position: absolute;
|
|
150
159
|
box-sizing: border-box;
|
|
151
160
|
inline-size: var(--xh-_thumb-size);
|
|
152
161
|
block-size: var(--xh-_thumb-size);
|
|
153
|
-
|
|
162
|
+
/* 描边取装饰边的不透明档:墨色描边半透明,压在圆点自己的底上只会是底色的深一档,框不住圆点,
|
|
163
|
+
拇指就与同色的已选区间糊成一片 */
|
|
164
|
+
border: var(--xh-stroke-thick) solid var(--xh-slider-thumb-border, var(--xh-border-default-opaque));
|
|
154
165
|
border-radius: var(--xh-slider-thumb-radius, var(--xh-shape-circle));
|
|
155
166
|
background: var(--xh-slider-thumb-bg, var(--xh-_tone, var(--xh-bg-brand)));
|
|
156
167
|
/* 圆点上没有字,这一支是给环用的:环灌 currentColor 时取到的是与这块底配对的前景色,
|
|
@@ -159,7 +170,7 @@
|
|
|
159
170
|
box-shadow: var(--xh-slider-thumb-shadow, var(--xh-elevation-raised));
|
|
160
171
|
cursor: grab;
|
|
161
172
|
transition:
|
|
162
|
-
scale var(--xh-motion-duration-
|
|
173
|
+
scale var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong),
|
|
163
174
|
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
164
175
|
}
|
|
165
176
|
|
|
@@ -193,7 +204,10 @@
|
|
|
193
204
|
海拔从静态的 raised 换到 lifted:跟着手走的东西比贴在页面上的抬得高一档,
|
|
194
205
|
又不到锚定浮层那一层——用 floating 会让拇指和下拉面板一样重。 */
|
|
195
206
|
[data-scope='slider'][data-part='thumb'][data-dragging] {
|
|
196
|
-
|
|
207
|
+
/* 放大比例落进私有槽:挂在拇指里的值气泡读同一支反向缩回原尺寸 */
|
|
208
|
+
--xh-_slider-thumb-scale: var(--xh-slider-thumb-scale-dragging, var(--xh-motion-scale-drag));
|
|
209
|
+
|
|
210
|
+
scale: var(--xh-_slider-thumb-scale);
|
|
197
211
|
cursor: grabbing;
|
|
198
212
|
box-shadow: var(--xh-slider-thumb-shadow-dragging, var(--xh-elevation-lifted));
|
|
199
213
|
}
|
|
@@ -215,16 +229,19 @@
|
|
|
215
229
|
}
|
|
216
230
|
|
|
217
231
|
/* 值气泡:挂在拇指里,跟着拇指一起走位。
|
|
218
|
-
|
|
219
|
-
|
|
232
|
+
气泡宽度由文字撑出,只能靠平移回中。不能两侧 inset 都钉在 50% 再靠自动外边距回中:
|
|
233
|
+
那样可用宽度是 0,气泡比它宽,自动外边距按规范取 0,气泡从拇指中线起排、偏出半个自身宽。
|
|
234
|
+
起点是逻辑属性、平移是物理通道:平移乘书写方向的符号,rtl 下行内分量掉头,气泡才落回拇指正上方。
|
|
235
|
+
拖动时拇指放大,气泡按同一比例反向缩回、与拇指同一段过渡:文字不跟着放大,缩放原点在贴着拇指那一边。
|
|
220
236
|
默认只在推动那一刻露面,静止时留在 DOM 里但不占视线 */
|
|
221
237
|
[data-scope='slider'][data-part='value-text'] {
|
|
222
238
|
position: absolute;
|
|
223
239
|
inset-block-end: 100%;
|
|
224
|
-
inset-inline: 50%;
|
|
240
|
+
inset-inline-start: 50%;
|
|
225
241
|
inline-size: max-content;
|
|
226
242
|
margin-block-end: var(--xh-slider-value-text-offset, var(--xh-space-2));
|
|
227
|
-
|
|
243
|
+
translate: calc(-50% * var(--xh-direction-sign)) 0;
|
|
244
|
+
transform-origin: 50% 100%;
|
|
228
245
|
padding-block: var(--xh-slider-value-text-py, var(--xh-space-0_5));
|
|
229
246
|
padding-inline: var(--xh-slider-value-text-px, var(--xh-space-2));
|
|
230
247
|
border-radius: var(--xh-slider-value-text-radius, var(--xh-shape-control));
|
|
@@ -236,7 +253,9 @@
|
|
|
236
253
|
/* 气泡贴在拇指上方,指针要落到拇指上,不能被它挡住 */
|
|
237
254
|
pointer-events: none;
|
|
238
255
|
opacity: 0;
|
|
239
|
-
transition:
|
|
256
|
+
transition:
|
|
257
|
+
opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
258
|
+
scale var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
|
|
240
259
|
}
|
|
241
260
|
|
|
242
261
|
[data-scope='slider'][data-part='value-text'][hidden] {
|
|
@@ -246,15 +265,17 @@
|
|
|
246
265
|
/* 只有手真正推着的那一个拇指带 data-dragging,多拇指时气泡不会全组一起冒出来 */
|
|
247
266
|
[data-scope='slider'][data-part='value-text'][data-dragging] {
|
|
248
267
|
opacity: 1;
|
|
268
|
+
scale: calc(1 / var(--xh-_slider-thumb-scale, 1));
|
|
249
269
|
}
|
|
250
270
|
|
|
251
|
-
/*
|
|
271
|
+
/* 竖排轨道的气泡挪到行侧:压在拇指上方会挡住上一档的值;反向缩放的原点换到贴着拇指的行首那一侧 */
|
|
252
272
|
[data-scope='slider'][data-part='value-text'][data-orientation='vertical'] {
|
|
253
273
|
inset-block: 50%;
|
|
254
274
|
inset-inline: 100% auto;
|
|
255
275
|
block-size: max-content;
|
|
256
276
|
margin-block: auto;
|
|
257
277
|
margin-inline: var(--xh-slider-value-text-offset, var(--xh-space-2)) 0;
|
|
278
|
+
transform-origin: calc(50% - 50% * var(--xh-direction-sign)) 50%;
|
|
258
279
|
}
|
|
259
280
|
|
|
260
281
|
/* —— 尺寸 —— */
|
|
@@ -285,7 +306,8 @@
|
|
|
285
306
|
block-size: var(--xh-slider-tick-size, var(--xh-space-1));
|
|
286
307
|
border-radius: var(--xh-slider-tick-radius, var(--xh-shape-circle));
|
|
287
308
|
background: var(--xh-slider-tick-bg, var(--xh-border-strong));
|
|
288
|
-
|
|
309
|
+
/* 连接层把比例点写在 inset-inline-start 上:平移的行内分量乘书写方向的符号,rtl 下掉头,刻度点才以比例点为中心 */
|
|
310
|
+
translate: calc(-50% * var(--xh-direction-sign)) -50%;
|
|
289
311
|
}
|
|
290
312
|
|
|
291
313
|
/* 落进已选区间的刻度点跟 range 同色 */
|
|
@@ -301,7 +323,7 @@
|
|
|
301
323
|
font-size: var(--xh-slider-tick-label-font-size, var(--xh-text-caption-size));
|
|
302
324
|
line-height: var(--xh-leading-none);
|
|
303
325
|
white-space: nowrap;
|
|
304
|
-
translate: -50% 0;
|
|
326
|
+
translate: calc(-50% * var(--xh-direction-sign)) 0;
|
|
305
327
|
cursor: pointer;
|
|
306
328
|
pointer-events: auto;
|
|
307
329
|
user-select: none;
|
|
@@ -330,7 +352,7 @@
|
|
|
330
352
|
[data-scope='slider'][data-part='root'][data-orientation='vertical'] [data-part='tick'] {
|
|
331
353
|
inset-block-start: auto;
|
|
332
354
|
inset-inline-start: 50%;
|
|
333
|
-
translate: -50% 50%;
|
|
355
|
+
translate: calc(-50% * var(--xh-direction-sign)) 50%;
|
|
334
356
|
}
|
|
335
357
|
|
|
336
358
|
[data-scope='slider'][data-part='root'][data-orientation='vertical'] [data-part='tick-label'] {
|
package/css/sortable.css
CHANGED
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
--xh-sortable-skin: 1;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
/* 分工:**每一项的位移**由连接层每帧写进内联
|
|
18
|
-
这份皮肤一条都不碰
|
|
17
|
+
/* 分工:**每一项的位移**由连接层每帧写进内联 translate(让位与跟手都在那儿算)。
|
|
18
|
+
这份皮肤一条都不碰 translate——内联优先级更高,写了不但是死声明,
|
|
19
19
|
还会在拖动的每一帧跟连接层抢位置。皮肤只管排布方向、间距、光标与状态表现。 */
|
|
20
20
|
|
|
21
21
|
[data-scope='sortable'][data-part='root'] {
|
|
@@ -47,18 +47,40 @@
|
|
|
47
47
|
看起来像是尺寸算错了。皮肤只管拖起来那一项的视觉反馈。 */
|
|
48
48
|
|
|
49
49
|
/* 让位期间关掉过渡,跟手的那一项才不会慢半拍粘在指针后面。
|
|
50
|
-
其余项反过来要过渡:它们是被让开的,瞬移会看不出发生了什么。
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
其余项反过来要过渡:它们是被让开的,瞬移会看不出发生了什么。
|
|
51
|
+
键盘拖动时被拖那一项不跟手、逐格挪,与让位的邻项同一段一起滑;抓起时的抬升照常淡变。
|
|
52
|
+
同组别的列表的一项悬在这里(data-drop='inside')时,插入点及其后的项同样是被让开的 */
|
|
53
|
+
[data-scope='sortable'][data-part='root']:is([data-dragging], [data-drop='inside']) [data-part='item']:not([data-dragging]) {
|
|
54
|
+
transition: translate var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous);
|
|
53
55
|
}
|
|
54
56
|
|
|
55
|
-
/*
|
|
57
|
+
/* 让位把末项挪出了原来的末端:容器末尾垫出落进来那一格的大小(连接层写进 --xh-_sortable-incoming-size),
|
|
58
|
+
容器随之长出一格,末项不会掉出容器的面。垫块是一个 flex 子项,沿主轴取那一格的尺寸、与各项之间同样隔一个 gap;
|
|
59
|
+
列表为空时它是唯一的子项,不带 gap,正好是那一格 */
|
|
60
|
+
[data-scope='sortable'][data-part='root'][data-drop='inside']::after {
|
|
61
|
+
content: '';
|
|
62
|
+
flex: 0 0 var(--xh-_sortable-incoming-size);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
[data-scope='sortable'][data-part='root'][data-drag-mode='keyboard'] [data-part='item'][data-dragging] {
|
|
66
|
+
transition:
|
|
67
|
+
translate var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous),
|
|
68
|
+
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
69
|
+
opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* 抓起与放下时的抬升、压深都淡变。位移不进这条:它由连接层每帧写内联 translate */
|
|
56
73
|
[data-scope='sortable'][data-part='item'] {
|
|
57
74
|
transition:
|
|
58
75
|
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
59
76
|
opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
60
77
|
}
|
|
61
78
|
|
|
79
|
+
/* 放下后那一项由弹簧带着松手速度逐帧收进新位置:只在这一档备好合成层,落定即撤 */
|
|
80
|
+
[data-scope='sortable'][data-part='item'][data-animating] {
|
|
81
|
+
will-change: translate;
|
|
82
|
+
}
|
|
83
|
+
|
|
62
84
|
[data-scope='sortable'][data-part='item'][data-dragging] {
|
|
63
85
|
/* 拖起来的那一项浮在上面。层级由连接层写内联,这里只管观感。
|
|
64
86
|
海拔取 lifted:被指针拎起、正跟着手走的东西比贴在页面上的 raised 高一档,又不到锚定浮层那一层。
|
|
@@ -161,7 +183,7 @@
|
|
|
161
183
|
border-radius: var(--xh-sortable-drop-indicator-radius, var(--xh-shape-pill));
|
|
162
184
|
background: var(--xh-sortable-drop-indicator-bg, var(--xh-bg-brand));
|
|
163
185
|
/* 落点一格一格地跳,线跟着滑过去 */
|
|
164
|
-
transition:
|
|
186
|
+
transition: translate var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous);
|
|
165
187
|
}
|
|
166
188
|
|
|
167
189
|
/* 竖排时是一条横线铺满容器,横排与换行网格时是一条竖线 */
|
|
@@ -176,6 +198,14 @@
|
|
|
176
198
|
block-size: 100%;
|
|
177
199
|
}
|
|
178
200
|
|
|
201
|
+
/* 落点线是一块纯底色,高对比档里底色被统一换成 Canvas,整根消失:换成系统高亮色画回来。
|
|
202
|
+
跨列表时落在哪个列表只靠这条线与让出的那一格表出,这一档里同样要看得见 */
|
|
203
|
+
@media (forced-colors: active) {
|
|
204
|
+
[data-scope='sortable'][data-part='drop-indicator'] {
|
|
205
|
+
background: Highlight;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
179
209
|
/* 活动区域只说给读屏听,不占版面。声明与 shared/visually-hidden.ts 逐条同值。 */
|
|
180
210
|
[data-scope='sortable'][data-part='live-region'] {
|
|
181
211
|
position: absolute;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* 定义 sparkline 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 描线与淡入关键帧由 family/motion.css 提供;本皮肤 @import 它,单独引入仍成立。
|
|
9
|
+
迷你图只消费色槽与线宽,不接 Chart 家族配方的标题、图例与提示框。 */
|
|
10
|
+
@import '../family/motion.css';
|
|
11
|
+
|
|
12
|
+
@layer xihan.components {
|
|
13
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
14
|
+
[data-scope='sparkline'] {
|
|
15
|
+
--xh-sparkline-skin: 1;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* 根就是 <svg>:随文排版,宽度缺省 6rem,高度缺省一行字高,放进表格单元格与指标卡都不撑高一行。
|
|
19
|
+
几何要用的像素值以这里的私有槽为真源:机器挂载后从计算样式读它们,作者覆盖组件槽即改变几何 */
|
|
20
|
+
[data-scope='sparkline'][data-part='root'] {
|
|
21
|
+
--xh-_chart-metric-line-width: var(--xh-sparkline-line-width, var(--xh-chart-line-width));
|
|
22
|
+
--xh-_chart-metric-point-size: var(--xh-sparkline-marker-size, var(--xh-chart-point-size));
|
|
23
|
+
--xh-_chart-metric-gap: var(--xh-chart-gap);
|
|
24
|
+
--xh-_chart-metric-bar-max: var(--xh-sparkline-bar-max, var(--xh-chart-bar-max));
|
|
25
|
+
--xh-_chart-metric-radius: var(--xh-sparkline-bar-radius, var(--xh-shape-inset));
|
|
26
|
+
|
|
27
|
+
/* 缺省中性:线与柱退到弱化色,只让标记点取品牌色相的色槽 1,读者先看到「现在在哪」 */
|
|
28
|
+
--xh-_sparkline-color: var(--xh-sparkline-color, var(--xh-chart-deemphasis));
|
|
29
|
+
--xh-_sparkline-accent: var(--xh-sparkline-accent-color, var(--xh-chart-categorical-1));
|
|
30
|
+
|
|
31
|
+
display: inline-block;
|
|
32
|
+
inline-size: var(--xh-sparkline-width, 6rem);
|
|
33
|
+
/* 级联兜底:先写一行的高度算式(正文字号 × 正文行距),再写 1lh。
|
|
34
|
+
1lh 晚于本库声明的浏览器地板,取不到时旧引擎丢掉后一条、留下前一条。 */
|
|
35
|
+
block-size: var(--xh-sparkline-height, calc(var(--xh-text-body-size) * var(--xh-text-body-leading)));
|
|
36
|
+
block-size: var(--xh-sparkline-height, 1lh);
|
|
37
|
+
/* 高度正好是一个行盒:顶边贴行盒顶边,行高不被撑开;居中对齐会按字的 x 高度再挪半格,行盒就多出一截 */
|
|
38
|
+
vertical-align: top;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* 写了语气就整条取语气色:颜色本身带好坏含义,线、柱与标记点同色 */
|
|
42
|
+
[data-scope='sparkline'][data-part='root'][data-tone]:not([data-tone='neutral']) {
|
|
43
|
+
--xh-_sparkline-color: var(--xh-sparkline-color, var(--xh-_tone));
|
|
44
|
+
--xh-_sparkline-accent: var(--xh-sparkline-accent-color, var(--xh-_tone));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* 参考带是注释:淡底画在数据之下 */
|
|
48
|
+
[data-scope='sparkline'][data-part='band'] {
|
|
49
|
+
fill: var(--xh-sparkline-band-bg, var(--xh-bg-subtle));
|
|
50
|
+
stroke: none;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* 参考线:读数据的尺子,取标注色的细虚线,压在数据底下 */
|
|
54
|
+
[data-scope='sparkline'][data-part='reference-line'] {
|
|
55
|
+
fill: none;
|
|
56
|
+
stroke: var(--xh-sparkline-reference-color, var(--xh-chart-label));
|
|
57
|
+
stroke-width: var(--xh-stroke-thin);
|
|
58
|
+
stroke-dasharray: calc(var(--xh-stroke-thick) * 2) calc(var(--xh-stroke-thick) * 2);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
[data-scope='sparkline'][data-part='line'] {
|
|
62
|
+
fill: none;
|
|
63
|
+
stroke: var(--xh-_sparkline-color);
|
|
64
|
+
stroke-width: var(--xh-_chart-metric-line-width);
|
|
65
|
+
stroke-linejoin: round;
|
|
66
|
+
stroke-linecap: round;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* 面积:线色淡洗,上沿是同一条折线 */
|
|
70
|
+
[data-scope='sparkline'][data-part='area-fill'] {
|
|
71
|
+
fill: var(--xh-_sparkline-color);
|
|
72
|
+
fill-opacity: var(--xh-chart-area-alpha);
|
|
73
|
+
stroke: none;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* 柱:相邻柱之间的间隙由几何留出,不画描边;标出的那几根换成强调色 */
|
|
77
|
+
[data-scope='sparkline'][data-part='bar'] {
|
|
78
|
+
fill: var(--xh-_sparkline-color);
|
|
79
|
+
stroke: none;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
[data-scope='sparkline'][data-part='bar'][data-marker] {
|
|
83
|
+
fill: var(--xh-_sparkline-accent);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* 盈亏:正负各取涨跌色,缺省绿涨红跌,主题覆盖令牌即可对调 */
|
|
87
|
+
[data-scope='sparkline'][data-part='bar'][data-trend='rise'] {
|
|
88
|
+
fill: var(--xh-chart-rise);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
[data-scope='sparkline'][data-part='bar'][data-trend='fall'] {
|
|
92
|
+
fill: var(--xh-chart-fall);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* 标记点带一圈承载面色的描边环,压在线上也分得开 */
|
|
96
|
+
[data-scope='sparkline'][data-part='dot'] {
|
|
97
|
+
fill: var(--xh-_sparkline-accent);
|
|
98
|
+
stroke: var(--xh-chart-surface);
|
|
99
|
+
stroke-width: var(--xh-chart-gap);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* 首次出现:折线从头描到尾,连接层在它入场的这一轮写 data-drawing 与 pathLength="1",过渡结束即撤掉 */
|
|
103
|
+
[data-scope='sparkline'][data-part='line'][data-drawing] {
|
|
104
|
+
stroke-dasharray: 1;
|
|
105
|
+
animation: xh-draw var(--xh-motion-duration-reveal) var(--xh-motion-ease-continuous) both;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* 标记点等描线的笔尖扫到才淡入:连接层写入它占入场时长的比例,乘上入场时长就是延迟 */
|
|
109
|
+
[data-scope='sparkline'][data-part='dot'][data-drawing] {
|
|
110
|
+
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) both;
|
|
111
|
+
animation-delay: calc(var(--xh-motion-duration-reveal) * var(--xh-_chart-reveal-at));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* 减弱动效下折线直接在场,只随过渡淡入。两组规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
|
|
115
|
+
@media (prefers-reduced-motion: reduce) {
|
|
116
|
+
[data-scope='sparkline'][data-part='line'][data-drawing] {
|
|
117
|
+
animation: none;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
:where([data-motion='reduce']) [data-scope='sparkline'][data-part='line'][data-drawing] {
|
|
122
|
+
animation: none;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* 强制色:线与柱取系统文字色,标出的点与柱取强调色;面积不铺,参考带只留轮廓;
|
|
126
|
+
盈亏的正负靠在中线上方还是下方表达,不靠颜色 */
|
|
127
|
+
@media (forced-colors: active) {
|
|
128
|
+
[data-scope='sparkline'][data-part='band'] {
|
|
129
|
+
fill: none;
|
|
130
|
+
stroke: GrayText;
|
|
131
|
+
stroke-width: var(--xh-stroke-thin);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
[data-scope='sparkline'][data-part='reference-line'] {
|
|
135
|
+
stroke: CanvasText;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
[data-scope='sparkline'][data-part='line'] {
|
|
139
|
+
stroke: CanvasText;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
[data-scope='sparkline'][data-part='area-fill'] {
|
|
143
|
+
fill: none;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
[data-scope='sparkline'][data-part='bar'],
|
|
147
|
+
[data-scope='sparkline'][data-part='bar'][data-trend] {
|
|
148
|
+
fill: CanvasText;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
[data-scope='sparkline'][data-part='bar'][data-marker],
|
|
152
|
+
[data-scope='sparkline'][data-part='dot'] {
|
|
153
|
+
fill: Highlight;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
[data-scope='sparkline'][data-part='dot'] {
|
|
157
|
+
stroke: Canvas;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
[data-scope='sparkline'][data-part='root'][hidden] {
|
|
162
|
+
display: none;
|
|
163
|
+
}
|
|
164
|
+
}
|
package/css/spinner.css
CHANGED
|
@@ -5,19 +5,20 @@
|
|
|
5
5
|
|
|
6
6
|
/* 定义 spinner 样式。 */
|
|
7
7
|
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
10
|
+
|
|
8
11
|
@layer xihan.motion {
|
|
9
|
-
/*
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
/* 三点档的波:一条亮带沿行扫过三枚点,点依次亮起再暗回禁用档,不再整组同步明暗 */
|
|
13
|
+
@keyframes xh-spinner-dots {
|
|
14
|
+
from {
|
|
15
|
+
-webkit-mask-position: 100% 0;
|
|
16
|
+
mask-position: 100% 0;
|
|
14
17
|
}
|
|
15
|
-
}
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
opacity: var(--xh-state-disabled-opacity);
|
|
19
|
+
to {
|
|
20
|
+
-webkit-mask-position: 0 0;
|
|
21
|
+
mask-position: 0 0;
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
}
|
|
@@ -39,32 +40,37 @@
|
|
|
39
40
|
vertical-align: middle;
|
|
40
41
|
}
|
|
41
42
|
|
|
43
|
+
/* 露面前的等待:整块藏起、位置照留,露面那一刻布局不跳;visibility 同时把它从读屏里摘掉 */
|
|
44
|
+
[data-scope='spinner'][data-part='root'][data-state='hidden'] {
|
|
45
|
+
visibility: hidden;
|
|
46
|
+
}
|
|
47
|
+
|
|
42
48
|
[data-scope='spinner'][data-part='root']::before {
|
|
43
49
|
content: '';
|
|
44
50
|
|
|
45
51
|
/* 边框算进直径,换厚度不会把圆环撑大 */
|
|
46
52
|
box-sizing: border-box;
|
|
47
53
|
flex: none;
|
|
48
|
-
inline-size: var(--xh-spinner-size, var(--xh-glyph-size-
|
|
49
|
-
block-size: var(--xh-spinner-size, var(--xh-glyph-size-
|
|
54
|
+
inline-size: var(--xh-spinner-size, var(--xh-glyph-size-md));
|
|
55
|
+
block-size: var(--xh-spinner-size, var(--xh-glyph-size-md));
|
|
50
56
|
border: var(--xh-spinner-thickness, var(--xh-stroke-thick)) solid var(--xh-spinner-track, var(--xh-border-default));
|
|
51
57
|
|
|
52
58
|
/* 一整圈是轨道色,只有起始边换成前景色,转起来才看得出方向 */
|
|
53
59
|
border-block-start-color: var(--xh-spinner-fg, currentColor);
|
|
54
60
|
border-radius: var(--xh-spinner-radius, var(--xh-shape-circle));
|
|
55
|
-
animation: xh-
|
|
61
|
+
animation: xh-spin var(--xh-spinner-duration, var(--xh-motion-loop-spin)) var(--xh-motion-ease-loop) infinite;
|
|
56
62
|
}
|
|
57
63
|
|
|
58
|
-
/*
|
|
59
|
-
|
|
64
|
+
/* 三档直径走字形尺寸那把尺,与控件内图标同档(sm 16 / md 20 / lg 24):圆环与同一行文字里的图标同级,
|
|
65
|
+
三档同族才不会在 compact 下错位。缺省档写在上面的基础规则里 */
|
|
60
66
|
[data-scope='spinner'][data-part='root'][data-size='sm']::before {
|
|
61
67
|
inline-size: var(--xh-glyph-size-sm);
|
|
62
68
|
block-size: var(--xh-glyph-size-sm);
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
[data-scope='spinner'][data-part='root'][data-size='lg']::before {
|
|
66
|
-
inline-size: var(--xh-glyph-size-
|
|
67
|
-
block-size: var(--xh-glyph-size-
|
|
72
|
+
inline-size: var(--xh-glyph-size-lg);
|
|
73
|
+
block-size: var(--xh-glyph-size-lg);
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
/* 语气只换起始边那一段,轨道留在中性描边上:轨道与起始边的反差就是转向的读法,
|
|
@@ -77,7 +83,7 @@
|
|
|
77
83
|
|
|
78
84
|
/*
|
|
79
85
|
* 渐隐弧:一整圈的色相由角度扫过来,再用一圈环形遮罩把中心挖空,剩下的就是一段
|
|
80
|
-
* 由浓到无的弧。转的还是同一条 xh-
|
|
86
|
+
* 由浓到无的弧。转的还是同一条 xh-spin——这一档只换画法,不换节拍。
|
|
81
87
|
* 遮罩只吃 alpha,用 currentColor 当不透明的那一端即可。
|
|
82
88
|
*/
|
|
83
89
|
[data-scope='spinner'][data-part='root'][data-variant='arc']::before {
|
|
@@ -100,17 +106,26 @@
|
|
|
100
106
|
}
|
|
101
107
|
|
|
102
108
|
/*
|
|
103
|
-
*
|
|
109
|
+
* 三点:一行三枚圆点,依次亮起成一道波。它不转,因此圆角与描边都撤掉,
|
|
104
110
|
* 图形改由三层径向渐变画;点的颜色走 currentColor,语气档只换这一处。
|
|
111
|
+
* 明暗不靠整组的不透明度(那样三点同步明灭,读起来像整体在闪),而是一层三倍宽的遮罩:
|
|
112
|
+
* 两端压在禁用档的不透明度,正中一道满不透明度的亮带,遮罩位置从行首外扫到行尾外,
|
|
113
|
+
* 亮带依次掠过三枚点。
|
|
105
114
|
*/
|
|
106
115
|
[data-scope='spinner'][data-part='root'][data-variant='dots']::before {
|
|
116
|
+
--xh-_spinner-dot-dim: color-mix(in srgb, currentColor calc(var(--xh-state-disabled-opacity) * 100%), transparent);
|
|
117
|
+
|
|
107
118
|
border: 0;
|
|
108
119
|
border-radius: 0;
|
|
109
120
|
background:
|
|
110
121
|
radial-gradient(circle closest-side, var(--xh-spinner-fg, currentColor) 100%, transparent) 0 50% / 25% 25% no-repeat,
|
|
111
122
|
radial-gradient(circle closest-side, var(--xh-spinner-fg, currentColor) 100%, transparent) 50% 50% / 25% 25% no-repeat,
|
|
112
123
|
radial-gradient(circle closest-side, var(--xh-spinner-fg, currentColor) 100%, transparent) 100% 50% / 25% 25% no-repeat;
|
|
113
|
-
|
|
124
|
+
-webkit-mask: linear-gradient(90deg, var(--xh-_spinner-dot-dim) 40%, currentColor 50%, var(--xh-_spinner-dot-dim) 60%) 100% 0 / 300% 100% no-repeat;
|
|
125
|
+
mask: linear-gradient(90deg, var(--xh-_spinner-dot-dim) 40%, currentColor 50%, var(--xh-_spinner-dot-dim) 60%) 100% 0 / 300% 100% no-repeat;
|
|
126
|
+
animation: xh-spinner-dots var(--xh-spinner-duration, var(--xh-motion-loop-spin)) var(--xh-motion-ease-loop) infinite;
|
|
127
|
+
/* 波跟着书写方向走:三枚点左右对称,按书写方向符号水平翻过来,RTL 下就从右往左依次亮起 */
|
|
128
|
+
scale: var(--xh-direction-sign) 1;
|
|
114
129
|
}
|
|
115
130
|
|
|
116
131
|
[data-scope='spinner'][data-part='root'][data-variant='dots'][data-tone]::before {
|
|
@@ -120,20 +135,26 @@
|
|
|
120
135
|
radial-gradient(circle closest-side, var(--xh-spinner-fg, var(--xh-_tone)) 100%, transparent) 100% 50% / 25% 25% no-repeat;
|
|
121
136
|
}
|
|
122
137
|
|
|
123
|
-
/*
|
|
124
|
-
|
|
138
|
+
/* 三点档的波自带一条动画,压不住上面那两块基础降级里的 animation: none,
|
|
139
|
+
因此这一档各自再写一份;遮罩一并撤掉,三点满不透明度静止。两组规则是同一件事的两个触发条件 */
|
|
125
140
|
@media (prefers-reduced-motion: reduce) {
|
|
126
141
|
[data-scope='spinner'][data-part='root'][data-variant='dots']::before {
|
|
142
|
+
-webkit-mask: none;
|
|
143
|
+
mask: none;
|
|
127
144
|
animation: none;
|
|
128
145
|
}
|
|
129
146
|
}
|
|
130
147
|
|
|
131
148
|
:where([data-motion='reduce']) [data-scope='spinner'][data-part='root'][data-variant='dots']::before {
|
|
149
|
+
-webkit-mask: none;
|
|
150
|
+
mask: none;
|
|
132
151
|
animation: none;
|
|
133
152
|
}
|
|
134
153
|
|
|
135
154
|
@media print {
|
|
136
155
|
[data-scope='spinner'][data-part='root'][data-variant='dots']::before {
|
|
156
|
+
-webkit-mask: none;
|
|
157
|
+
mask: none;
|
|
137
158
|
animation: none;
|
|
138
159
|
}
|
|
139
160
|
}
|
|
@@ -204,5 +225,12 @@
|
|
|
204
225
|
border-radius: var(--xh-spinner-radius, var(--xh-shape-circle));
|
|
205
226
|
background-image: none;
|
|
206
227
|
}
|
|
228
|
+
|
|
229
|
+
/* 三点档退回描边后撤掉扫点的遮罩,改转圆环那一条 */
|
|
230
|
+
[data-scope='spinner'][data-part='root'][data-variant='dots']::before {
|
|
231
|
+
-webkit-mask: none;
|
|
232
|
+
mask: none;
|
|
233
|
+
animation-name: xh-spin;
|
|
234
|
+
}
|
|
207
235
|
}
|
|
208
236
|
}
|
package/css/splitter.css
CHANGED
|
@@ -85,6 +85,12 @@
|
|
|
85
85
|
outline: none;
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
+
/* 折叠 / 展开(Enter、双击、命令式)时面板尺寸走过渡,与 Layout 侧栏折叠同一种节奏;
|
|
89
|
+
拖拽与方向键步进跟手,连接层不投影 data-animating,照旧瞬时。尺寸仍由连接层写内联,这里只挂过渡 */
|
|
90
|
+
[data-scope='splitter'][data-part='root'][data-animating] > [data-scope='splitter'][data-part='panel'] {
|
|
91
|
+
transition: flex-basis var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
92
|
+
}
|
|
93
|
+
|
|
88
94
|
/* 折叠到 0 时连边框都不该露出来:留一条缝比留一块面板更像坏了 */
|
|
89
95
|
[data-scope='splitter'][data-part='panel'][data-collapsed] {
|
|
90
96
|
border: none;
|
|
@@ -98,7 +104,7 @@
|
|
|
98
104
|
align-items: center;
|
|
99
105
|
justify-content: center;
|
|
100
106
|
background: var(--xh-splitter-trigger-bg, var(--xh-border-default));
|
|
101
|
-
transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
107
|
+
transition: background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
102
108
|
}
|
|
103
109
|
|
|
104
110
|
[data-scope='splitter'][data-part='resize-trigger'][data-orientation='horizontal'] {
|
package/css/statistic.css
CHANGED
|
@@ -124,4 +124,14 @@
|
|
|
124
124
|
[data-scope='statistic'][data-part='trend'][hidden] {
|
|
125
125
|
display: none;
|
|
126
126
|
}
|
|
127
|
+
|
|
128
|
+
@media (forced-colors: active) {
|
|
129
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
130
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
131
|
+
落在 Canvas 面上的取 CanvasText */
|
|
132
|
+
[data-scope='statistic'][data-part='trend'][data-direction]::before {
|
|
133
|
+
forced-color-adjust: none;
|
|
134
|
+
background-color: CanvasText;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
127
137
|
}
|