@xihan-ui/styles 2.0.0 → 3.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 +1328 -0
- package/README.md +6 -1
- package/component-tokens.d.ts +505 -111
- package/components.tokens.json +34750 -26291
- package/css/accordion.css +39 -13
- package/css/alert.css +61 -3
- package/css/anchor.css +49 -11
- package/css/approval.css +124 -84
- package/css/avatar-group.css +1 -1
- package/css/avatar.css +13 -5
- package/css/back-top.css +63 -44
- package/css/badge.css +63 -13
- package/css/bar-code.css +1 -1
- package/css/breadcrumb.css +63 -4
- package/css/button-group.css +5 -5
- package/css/button.css +69 -21
- package/css/calendar-picker.css +27 -8
- package/css/calendar-range-picker.css +48 -11
- package/css/card.css +116 -2
- package/css/carousel.css +153 -48
- package/css/cartesian-chart.css +830 -0
- package/css/cascader.css +184 -70
- package/css/checkbox-group.css +69 -99
- package/css/checkbox.css +21 -54
- package/css/citation.css +470 -0
- package/css/clipboard.css +23 -66
- package/css/code-view.css +103 -8
- package/css/collapsible.css +37 -11
- package/css/color-field.css +18 -0
- package/css/color-picker.css +57 -62
- package/css/color-slider.css +26 -19
- package/css/color-swatch-picker.css +8 -6
- package/css/combobox.css +82 -37
- package/css/command.css +48 -48
- package/css/context-menu.css +43 -28
- package/css/date-field.css +23 -0
- package/css/date-picker.css +57 -24
- package/css/date-range-picker.css +301 -14
- package/css/description.css +17 -1
- package/css/descriptions.css +43 -1
- package/css/dialog.css +99 -43
- package/css/diff-view.css +101 -16
- package/css/download-trigger.css +46 -80
- package/css/drawer.css +168 -133
- package/css/editable.css +19 -0
- package/css/empty-state.css +8 -7
- package/css/field-array.css +36 -0
- package/css/field.css +17 -19
- package/css/fieldset.css +1 -1
- package/css/file-upload.css +126 -136
- package/css/flex.css +324 -8
- package/css/float-button.css +168 -41
- package/css/floating-panel.css +59 -27
- package/css/form.css +26 -20
- 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 +33 -18
- package/css/icon.css +100 -0
- package/css/image-cropper.css +34 -8
- package/css/image-viewer.css +169 -26
- package/css/image.css +23 -4
- package/css/infinite-scroll.css +2 -2
- package/css/input-group.css +13 -15
- package/css/json-viewer.css +55 -7
- package/css/kbd.css +1 -1
- package/css/layout.css +71 -21
- package/css/liquid.css +106 -0
- package/css/list.css +2 -2
- package/css/listbox.css +72 -23
- package/css/loading-bar.css +27 -13
- package/css/log.css +131 -35
- 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 -21
- package/css/menu.css +40 -28
- package/css/menubar.css +42 -28
- package/css/message-feed.css +174 -53
- package/css/navigation-menu.css +177 -18
- package/css/notification.css +431 -110
- package/css/number-field.css +22 -0
- package/css/page-header.css +4 -2
- package/css/pagination.css +129 -29
- package/css/password-input.css +40 -8
- package/css/pie-chart.css +247 -0
- package/css/popconfirm.css +50 -58
- package/css/popover.css +55 -21
- package/css/progress.css +308 -10
- package/css/prompt-input.css +37 -1
- package/css/question-flow.css +104 -64
- package/css/radar-chart.css +233 -0
- package/css/radio-group.css +372 -14
- package/css/rating.css +25 -27
- package/css/reasoning.css +62 -55
- package/css/reset.css +1 -1
- 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 +76 -59
- package/css/side-nav.css +177 -30
- package/css/signature-pad.css +23 -8
- package/css/skeleton.css +13 -14
- package/css/slider.css +39 -17
- package/css/sortable.css +38 -8
- package/css/sparkline.css +164 -0
- package/css/spinner.css +50 -22
- package/css/splitter.css +8 -2
- package/css/statistic.css +10 -0
- package/css/steps.css +257 -38
- package/css/switch.css +30 -55
- package/css/table.css +168 -128
- package/css/tabs.css +243 -31
- package/css/tag-group.css +65 -37
- package/css/tag.css +55 -14
- 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 +44 -17
- package/css/time-range-picker.css +45 -18
- package/css/timeline.css +1 -1
- package/css/toggle-group.css +8 -8
- package/css/toggle.css +6 -5
- package/css/tool-call.css +64 -56
- package/css/toolbar.css +105 -7
- package/css/tooltip.css +18 -7
- package/css/tour.css +49 -21
- package/css/transfer.css +104 -81
- package/css/tree-select.css +235 -58
- package/css/tree.css +240 -147
- package/css/truncate.css +55 -12
- package/css/typography.css +93 -0
- package/css/virtualizer.css +57 -1
- 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 +70 -27
- 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 +208 -11
- package/family/tag-list.css +59 -0
- package/index.css +23363 -14091
- package/index.unlayered.css +23198 -13922
- 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/progress.css
CHANGED
|
@@ -8,13 +8,26 @@
|
|
|
8
8
|
@layer xihan.motion {
|
|
9
9
|
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
10
10
|
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
11
|
+
/* 固定宽度的一段从轨道行首外扫到行尾外:只动 translate,不动布局。
|
|
12
|
+
百分比参照这一段自身的宽度(轨道的 40%),RTL 下两端由私有槽换号 */
|
|
11
13
|
@keyframes xh-progress-indeterminate {
|
|
12
14
|
from {
|
|
13
|
-
|
|
15
|
+
translate: var(--xh-_progress-sweep-from, -100%) 0;
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
to {
|
|
17
|
-
|
|
19
|
+
translate: var(--xh-_progress-sweep-to, 250%) 0;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* 条纹沿行向流动:每轮挪过一整格纹理,首尾两帧的图案重合,循环无缝。RTL 下行尾在左,位移随方向符号翻转 */
|
|
24
|
+
@keyframes xh-progress-stripes {
|
|
25
|
+
from {
|
|
26
|
+
background-position: 0 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
to {
|
|
30
|
+
background-position: calc(var(--xh-_progress-stripe-size) * var(--xh-direction-sign)) 0;
|
|
18
31
|
}
|
|
19
32
|
}
|
|
20
33
|
}
|
|
@@ -30,11 +43,17 @@
|
|
|
30
43
|
[data-scope='progress'][data-part='root'] {
|
|
31
44
|
--xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-track-thickness));
|
|
32
45
|
|
|
46
|
+
/* 目标刻度与环形的刻度值按根落位 */
|
|
47
|
+
position: relative;
|
|
33
48
|
display: inline-block;
|
|
34
49
|
inline-size: 100%;
|
|
35
50
|
}
|
|
36
51
|
|
|
52
|
+
/* 线形轨道把填充放在交叉轴正中:子弹图的填充比轨道窄,压在色带正中 */
|
|
37
53
|
[data-scope='progress'][data-part='track'] {
|
|
54
|
+
position: relative;
|
|
55
|
+
display: flex;
|
|
56
|
+
align-items: center;
|
|
38
57
|
overflow: hidden;
|
|
39
58
|
inline-size: 100%;
|
|
40
59
|
block-size: var(--xh-_progress-thickness);
|
|
@@ -45,10 +64,73 @@
|
|
|
45
64
|
/* 语气槽由 root 上的 data-tone 声明、经继承发下来;没写 data-tone 时退回原来的品牌色。
|
|
46
65
|
轨道不跟着换族:只有已完成的那段换色,底槽保持中性才读得出"完成了多少"。 */
|
|
47
66
|
[data-scope='progress'][data-part='range'] {
|
|
48
|
-
|
|
67
|
+
/* 填充铺满轨道,按未完成的比例往行首平移、由轨道裁掉:进度变化只走合成,不重排也不重绘。
|
|
68
|
+
露出来的前端保留自己的圆角,行首那一侧由轨道的圆角裁出 */
|
|
69
|
+
/* 定位后才压得住同在轨道里的色带 */
|
|
70
|
+
position: relative;
|
|
71
|
+
flex: none;
|
|
72
|
+
inline-size: 100%;
|
|
73
|
+
block-size: var(--xh-_progress-range-size, 100%);
|
|
49
74
|
border-radius: var(--xh-progress-range-radius, var(--xh-shape-pill));
|
|
50
75
|
background: var(--xh-progress-range, var(--xh-_tone, var(--xh-bg-brand)));
|
|
51
|
-
|
|
76
|
+
translate: calc((var(--xh-_progress-value, 0) - 1) * 100%) 0;
|
|
77
|
+
transition: translate var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* translate 只认物理方向:RTL 下行首在右边,平移与不定进度的扫向一起翻转 */
|
|
81
|
+
[data-scope='progress'][data-part='range'][data-variant='line']:dir(rtl) {
|
|
82
|
+
--xh-_progress-sweep-from: 100%;
|
|
83
|
+
--xh-_progress-sweep-to: -250%;
|
|
84
|
+
|
|
85
|
+
translate: calc((1 - var(--xh-_progress-value, 0)) * 100%) 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* —— 线形的三样外观:分段、条纹与缓冲 —— */
|
|
89
|
+
/* 分段:遮罩把轨道切成等宽的格,格间留一道间隙,填充、缓冲与色带随轨道一起被切开。
|
|
90
|
+
周期是(全长 + 一道间隙)÷ 格数,最后一格恰好收在行尾,图案左右对称,RTL 下不必翻转 */
|
|
91
|
+
[data-scope='progress'][data-part='track'][data-stepped] {
|
|
92
|
+
--xh-_progress-step-gap: var(--xh-progress-step-gap, var(--xh-space-0_5));
|
|
93
|
+
--xh-_progress-step-period: calc((100% + var(--xh-_progress-step-gap)) / var(--xh-_progress-steps, 1));
|
|
94
|
+
--xh-_progress-step-mask: repeating-linear-gradient(
|
|
95
|
+
to right,
|
|
96
|
+
black 0 calc(var(--xh-_progress-step-period) - var(--xh-_progress-step-gap)),
|
|
97
|
+
transparent 0 var(--xh-_progress-step-period)
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
-webkit-mask-image: var(--xh-_progress-step-mask);
|
|
101
|
+
mask-image: var(--xh-_progress-step-mask);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* 条纹:填充上铺一层 45° 斜纹,颜色取填充同族更深一档。纹理是正方形平铺,45° 才能首尾相接;
|
|
105
|
+
RTL 下斜向随方向符号镜像 */
|
|
106
|
+
[data-scope='progress'][data-part='range'][data-striped] {
|
|
107
|
+
--xh-_progress-stripe: var(--xh-progress-stripe-color, var(--xh-_tone-active, var(--xh-bg-brand-active)));
|
|
108
|
+
--xh-_progress-stripe-size: var(--xh-progress-stripe-size, var(--xh-space-4));
|
|
109
|
+
|
|
110
|
+
background-image: linear-gradient(
|
|
111
|
+
calc(45deg * var(--xh-direction-sign)),
|
|
112
|
+
var(--xh-_progress-stripe) 25%,
|
|
113
|
+
transparent 25% 50%,
|
|
114
|
+
var(--xh-_progress-stripe) 50% 75%,
|
|
115
|
+
transparent 75%
|
|
116
|
+
);
|
|
117
|
+
background-size: var(--xh-_progress-stripe-size) var(--xh-_progress-stripe-size);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* 只在进行中流动:完成了就停下;进度未知时整段已在往复扫,不再叠一层流动 */
|
|
121
|
+
[data-scope='progress'][data-part='range'][data-striped][data-state='loading'] {
|
|
122
|
+
animation: xh-progress-stripes var(--xh-progress-stripe-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-loop) infinite;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* 缓冲段与填充同一种画法:铺满轨道、按缓冲比例往行首平移、由轨道裁掉,只走合成。
|
|
126
|
+
颜色取填充那一族的淡色,排在填充之前、被它压住。物理方向的平移量乘方向符号,RTL 下往右收 */
|
|
127
|
+
[data-scope='progress'][data-part='buffer'] {
|
|
128
|
+
position: absolute;
|
|
129
|
+
inset: 0;
|
|
130
|
+
border-radius: var(--xh-progress-buffer-radius, var(--xh-progress-range-radius, var(--xh-shape-pill)));
|
|
131
|
+
background: var(--xh-progress-buffer, var(--xh-_tone-subtle-active));
|
|
132
|
+
translate: calc((var(--xh-_progress-buffer, 0) - 1) * 100% * var(--xh-direction-sign)) 0;
|
|
133
|
+
transition: translate var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
52
134
|
}
|
|
53
135
|
|
|
54
136
|
/* —— 尺寸 —— */
|
|
@@ -113,11 +195,157 @@
|
|
|
113
195
|
[data-scope='progress'][data-part='range'][data-variant='dashboard'] {
|
|
114
196
|
stroke: var(--xh-progress-range, var(--xh-_tone, var(--xh-bg-brand)));
|
|
115
197
|
stroke-linecap: var(--xh-progress-linecap, round);
|
|
116
|
-
|
|
198
|
+
/* 环形的走完多少由虚线偏移表达,线形那一套按比例的平移在这里归零:SVG 图元的百分比平移按整个 viewBox 算,会把整段弧挪出画面 */
|
|
199
|
+
translate: none;
|
|
200
|
+
transition: stroke-dashoffset var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* —— 量的刻画:分段色带、目标刻度、量程刻度与指针 —— */
|
|
204
|
+
/* 子弹图:有分段时轨道加厚一档,填充收窄成中间一条压在色带上,色带在填充两侧照样读得出。
|
|
205
|
+
三档厚度各比普通线形高一档,阶梯次序不变 */
|
|
206
|
+
[data-scope='progress'][data-part='root'][data-variant='line'][data-banded] {
|
|
207
|
+
--xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-3));
|
|
208
|
+
--xh-_progress-range-size: 50%;
|
|
117
209
|
}
|
|
118
210
|
|
|
119
|
-
|
|
120
|
-
|
|
211
|
+
[data-scope='progress'][data-part='root'][data-variant='line'][data-banded][data-size='sm'] {
|
|
212
|
+
--xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-2));
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
[data-scope='progress'][data-part='root'][data-variant='line'][data-banded][data-size='lg'] {
|
|
216
|
+
--xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-4));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* 色带取本段语气的淡色:同一族颜色里填充是实色、色带浅一档,读得出填充落在哪一段 */
|
|
220
|
+
[data-scope='progress'][data-part='threshold'] {
|
|
221
|
+
--xh-_progress-threshold: var(--xh-progress-threshold-color, var(--xh-_tone-subtle-active));
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
[data-scope='progress'][data-part='threshold'][data-variant='line'] {
|
|
225
|
+
position: absolute;
|
|
226
|
+
inset-block: 0;
|
|
227
|
+
inset-inline-start: calc(var(--xh-_progress-from, 0) * 100%);
|
|
228
|
+
inline-size: calc((var(--xh-_progress-to, 0) - var(--xh-_progress-from, 0)) * 100%);
|
|
229
|
+
background: var(--xh-_progress-threshold);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
[data-scope='progress'][data-part='threshold'][data-variant='circle'],
|
|
233
|
+
[data-scope='progress'][data-part='threshold'][data-variant='dashboard'] {
|
|
234
|
+
stroke: var(--xh-_progress-threshold);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* 目标刻度:一道竖线横穿轨道、上下各探出一点,读者一眼看出离目标还差多少 */
|
|
238
|
+
[data-scope='progress'][data-part='target'] {
|
|
239
|
+
--xh-_progress-target: var(--xh-progress-target-color, var(--xh-fg-default));
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
[data-scope='progress'][data-part='target'][data-variant='line'] {
|
|
243
|
+
position: absolute;
|
|
244
|
+
inset-block-start: calc(-1 * var(--xh-space-1));
|
|
245
|
+
inset-inline-start: calc(var(--xh-_progress-at, 0) * 100%);
|
|
246
|
+
inline-size: var(--xh-stroke-thick);
|
|
247
|
+
block-size: calc(var(--xh-_progress-thickness) + 2 * var(--xh-space-1));
|
|
248
|
+
border-radius: var(--xh-progress-target-radius, var(--xh-shape-pill));
|
|
249
|
+
background: var(--xh-_progress-target);
|
|
250
|
+
translate: -50% 0;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
[data-scope='progress'][data-part='target'][data-variant='line']:dir(rtl) {
|
|
254
|
+
translate: 50% 0;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
[data-scope='progress'][data-part='target'][data-variant='circle'],
|
|
258
|
+
[data-scope='progress'][data-part='target'][data-variant='dashboard'] {
|
|
259
|
+
stroke: var(--xh-_progress-target);
|
|
260
|
+
stroke-width: var(--xh-stroke-thick);
|
|
261
|
+
stroke-linecap: round;
|
|
262
|
+
vector-effect: non-scaling-stroke;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* 量程刻度:图表家具,线与字都取图表的标注色,数字等宽,不随进度的语气换色 */
|
|
266
|
+
[data-scope='progress'][data-part='scale'] {
|
|
267
|
+
color: var(--xh-chart-label);
|
|
268
|
+
font-size: var(--xh-text-caption-size);
|
|
269
|
+
font-variant-numeric: tabular-nums;
|
|
270
|
+
line-height: var(--xh-leading-tight);
|
|
271
|
+
pointer-events: none;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
[data-scope='progress'][data-part='scale'][data-variant='line'] {
|
|
275
|
+
position: relative;
|
|
276
|
+
block-size: calc(var(--xh-chart-tick-length) + var(--xh-chart-label-gap) + var(--xh-text-caption-size) * var(--xh-leading-tight));
|
|
277
|
+
margin-block-start: var(--xh-space-1);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
[data-scope='progress'][data-part='scale-tick'][data-variant='line'] {
|
|
281
|
+
position: absolute;
|
|
282
|
+
inset-block-start: 0;
|
|
283
|
+
inset-inline-start: calc(var(--xh-_progress-at, 0) * 100%);
|
|
284
|
+
inline-size: var(--xh-stroke-thin);
|
|
285
|
+
block-size: var(--xh-chart-tick-length);
|
|
286
|
+
background: var(--xh-chart-axis);
|
|
287
|
+
translate: -50% 0;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
[data-scope='progress'][data-part='scale-tick'][data-variant='line']:dir(rtl) {
|
|
291
|
+
translate: 50% 0;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* 两端的刻度值贴着轨道两端对齐,中间的居中在刻度线上:连接层给出对齐比例 */
|
|
295
|
+
[data-scope='progress'][data-part='scale-label'][data-variant='line'] {
|
|
296
|
+
position: absolute;
|
|
297
|
+
inset-block-start: calc(var(--xh-chart-tick-length) + var(--xh-chart-label-gap));
|
|
298
|
+
inset-inline-start: calc(var(--xh-_progress-at, 0) * 100%);
|
|
299
|
+
white-space: nowrap;
|
|
300
|
+
translate: calc(var(--xh-_progress-label-align) * -100%) 0;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
[data-scope='progress'][data-part='scale-label'][data-variant='line']:dir(rtl) {
|
|
304
|
+
translate: calc(var(--xh-_progress-label-align) * 100%) 0;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
[data-scope='progress'][data-part='scale-tick'][data-variant='circle'],
|
|
308
|
+
[data-scope='progress'][data-part='scale-tick'][data-variant='dashboard'] {
|
|
309
|
+
stroke: var(--xh-chart-axis);
|
|
310
|
+
stroke-width: var(--xh-stroke-thin);
|
|
311
|
+
vector-effect: non-scaling-stroke;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* 环形的刻度值叠在环上:与画面同一格,按连接层给出的百分比坐标落位。环形不随 RTL 镜像 */
|
|
315
|
+
[data-scope='progress'][data-part='scale'][data-variant='circle'],
|
|
316
|
+
[data-scope='progress'][data-part='scale'][data-variant='dashboard'] {
|
|
317
|
+
position: relative;
|
|
318
|
+
grid-area: 1 / 1;
|
|
319
|
+
inline-size: 100%;
|
|
320
|
+
block-size: 100%;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
[data-scope='progress'][data-part='scale-label'][data-variant='circle'],
|
|
324
|
+
[data-scope='progress'][data-part='scale-label'][data-variant='dashboard'] {
|
|
325
|
+
position: absolute;
|
|
326
|
+
inset-block-start: var(--xh-_progress-y, 50%);
|
|
327
|
+
/* stylelint-disable-next-line property-disallowed-list -- 环形不随 RTL 镜像,刻度值横坐标由连接层按物理左缘写入 */
|
|
328
|
+
left: var(--xh-_progress-x, 50%);
|
|
329
|
+
white-space: nowrap;
|
|
330
|
+
translate: -50% -50%;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/* 仪表盘的指针:朝 3 点钟画好,按当前值的角度绕环心转过去。转动是数值变化,不是部件原地形变:
|
|
334
|
+
与圆弧填充同一档时长与曲线,同一次值变化两者一起起步一起落定 */
|
|
335
|
+
[data-scope='progress'][data-part='needle'] {
|
|
336
|
+
fill: var(--xh-progress-needle-color, var(--xh-fg-default));
|
|
337
|
+
transform-box: view-box;
|
|
338
|
+
transform-origin: 50% 50%;
|
|
339
|
+
rotate: var(--xh-_progress-needle-angle, 0deg);
|
|
340
|
+
transition: rotate var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/* 指针从环心伸出:环心内容让到缺口那一侧 */
|
|
344
|
+
[data-scope='progress'][data-part='label'][data-indicator='needle'] {
|
|
345
|
+
align-self: end;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/* 进度未知:线形条改为固定宽度的一小段来回扫,位移交给动画,按比例的平移与它的过渡让开 */
|
|
121
349
|
[data-scope='progress'][data-part='track'][data-state='indeterminate'] {
|
|
122
350
|
position: relative;
|
|
123
351
|
overflow: hidden;
|
|
@@ -125,9 +353,10 @@
|
|
|
125
353
|
|
|
126
354
|
[data-scope='progress'][data-part='range'][data-state='indeterminate'] {
|
|
127
355
|
position: absolute;
|
|
356
|
+
inset-inline-start: 0;
|
|
128
357
|
inline-size: 40%;
|
|
129
358
|
transition: none;
|
|
130
|
-
animation: xh-progress-indeterminate var(--xh-progress-indeterminate-duration, var(--xh-shimmer
|
|
359
|
+
animation: xh-progress-indeterminate var(--xh-progress-indeterminate-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-loop) infinite;
|
|
131
360
|
}
|
|
132
361
|
|
|
133
362
|
/* 减弱动效档:不来回扫,改成一条铺满的静态条——进度仍然未知,只是不再动。
|
|
@@ -137,6 +366,12 @@
|
|
|
137
366
|
position: static;
|
|
138
367
|
inline-size: 100%;
|
|
139
368
|
opacity: 0.5;
|
|
369
|
+
translate: none;
|
|
370
|
+
animation: none;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/* 条纹留着、不再流动:纹理本身是静态的非颜色通道 */
|
|
374
|
+
[data-scope='progress'][data-part='range'][data-striped][data-state='loading'] {
|
|
140
375
|
animation: none;
|
|
141
376
|
}
|
|
142
377
|
}
|
|
@@ -145,10 +380,15 @@
|
|
|
145
380
|
position: static;
|
|
146
381
|
inline-size: 100%;
|
|
147
382
|
opacity: 0.5;
|
|
383
|
+
translate: none;
|
|
148
384
|
animation: none;
|
|
149
385
|
}
|
|
150
386
|
|
|
151
|
-
|
|
387
|
+
:where([data-motion='reduce']) [data-scope='progress'][data-part='range'][data-striped][data-state='loading'] {
|
|
388
|
+
animation: none;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/* 零进度:整段不画,从零起步的那一帧也不留一粒圆点 */
|
|
152
392
|
[data-scope='progress'][data-part='range'][data-empty] {
|
|
153
393
|
visibility: hidden;
|
|
154
394
|
}
|
|
@@ -156,7 +396,20 @@
|
|
|
156
396
|
|
|
157
397
|
/* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
|
|
158
398
|
写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
|
|
159
|
-
[data-scope='progress'][data-part='root'][hidden]
|
|
399
|
+
[data-scope='progress'][data-part='root'][hidden],
|
|
400
|
+
[data-scope='progress'][data-part='track'][hidden] {
|
|
401
|
+
display: none;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/* 指针档由指针指出当前值,弧上的填充收起、只留色带 */
|
|
405
|
+
[data-scope='progress'][data-part='range'][data-indicator='needle'] {
|
|
406
|
+
display: none;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/* SVG 里的部件不吃 UA 的 [hidden] 规则:作者自己写的目标刻度、指针在不适用时得自己收 */
|
|
410
|
+
[data-scope='progress'][data-part='target'][hidden],
|
|
411
|
+
[data-scope='progress'][data-part='scale'][hidden],
|
|
412
|
+
[data-scope='progress'][data-part='needle'][hidden] {
|
|
160
413
|
display: none;
|
|
161
414
|
}
|
|
162
415
|
|
|
@@ -186,6 +439,46 @@
|
|
|
186
439
|
[data-scope='progress'][data-part='range'][data-variant='dashboard'] {
|
|
187
440
|
stroke: Highlight;
|
|
188
441
|
}
|
|
442
|
+
|
|
443
|
+
/* 色带在这一档里只剩分界:线形每段末端画一道灰线,环形的色带退掉,分段名仍由读屏文字给出 */
|
|
444
|
+
[data-scope='progress'][data-part='threshold'][data-variant='line'] {
|
|
445
|
+
forced-color-adjust: none;
|
|
446
|
+
border-inline-end: var(--xh-stroke-thin) solid GrayText;
|
|
447
|
+
background: Canvas;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
[data-scope='progress'][data-part='threshold'][data-variant='circle'],
|
|
451
|
+
[data-scope='progress'][data-part='threshold'][data-variant='dashboard'] {
|
|
452
|
+
stroke: transparent;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
[data-scope='progress'][data-part='target'][data-variant='line'],
|
|
456
|
+
[data-scope='progress'][data-part='scale-tick'][data-variant='line'] {
|
|
457
|
+
forced-color-adjust: none;
|
|
458
|
+
background: CanvasText;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
[data-scope='progress'][data-part='target'][data-variant='circle'],
|
|
462
|
+
[data-scope='progress'][data-part='target'][data-variant='dashboard'],
|
|
463
|
+
[data-scope='progress'][data-part='scale-tick'][data-variant='circle'],
|
|
464
|
+
[data-scope='progress'][data-part='scale-tick'][data-variant='dashboard'] {
|
|
465
|
+
stroke: CanvasText;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
[data-scope='progress'][data-part='needle'] {
|
|
469
|
+
fill: CanvasText;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/* 条纹在这一档里退掉:填充整段取高亮色才读得出走到哪儿,斜纹会把它切碎 */
|
|
473
|
+
[data-scope='progress'][data-part='range'][data-striped] {
|
|
474
|
+
background-image: none;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/* 缓冲段取灰:与底槽的 Canvas、填充的高亮色三者分得开 */
|
|
478
|
+
[data-scope='progress'][data-part='buffer'] {
|
|
479
|
+
forced-color-adjust: none;
|
|
480
|
+
background: GrayText;
|
|
481
|
+
}
|
|
189
482
|
}
|
|
190
483
|
|
|
191
484
|
@media print {
|
|
@@ -197,6 +490,11 @@
|
|
|
197
490
|
position: static;
|
|
198
491
|
inline-size: 100%;
|
|
199
492
|
opacity: 0.5;
|
|
493
|
+
translate: none;
|
|
494
|
+
animation: none;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
[data-scope='progress'][data-part='range'][data-striped][data-state='loading'] {
|
|
200
498
|
animation: none;
|
|
201
499
|
}
|
|
202
500
|
}
|
package/css/prompt-input.css
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
/* PromptInput 独立皮肤同时传递引入字段视觉盒与字段内动作;full bundle 递归去重。 */
|
|
7
7
|
@import '../family/field-chrome.css';
|
|
8
8
|
@import '../family/action-control.css';
|
|
9
|
+
/* 字形换身份时的淡入由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
10
|
+
@import '../family/motion.css';
|
|
9
11
|
|
|
10
12
|
@layer xihan.components {
|
|
11
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -14,7 +16,7 @@
|
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
/* root 就是视觉盒:描边、底色、圆角、聚焦环、悬停与禁用面由 Field Chrome 家族画在它身上(静息描边式:
|
|
17
|
-
canvas 底 + --xh-border-control 描边 + 无影,不用 soft
|
|
19
|
+
canvas 底 + --xh-border-control 描边 + 无影,不用 soft,登记的例外只在 8px surface 圆角),内部 textarea
|
|
18
20
|
无边框;align-items: flex-end 让按钮随输入框长高贴着底边。
|
|
19
21
|
三个视觉轴都落在 root 上:形态三档由家族按 data-variant 生成,语气管用哪族颜色,尺寸管高度与字号 */
|
|
20
22
|
[data-scope='prompt-input'][data-part='root'] {
|
|
@@ -221,4 +223,38 @@
|
|
|
221
223
|
border-radius: var(--xh-prompt-input-stop-mark-radius, var(--xh-shape-inset));
|
|
222
224
|
background-color: currentColor;
|
|
223
225
|
}
|
|
226
|
+
|
|
227
|
+
/* 身份切换时换上来的那一枚字形淡入,与按钮换面同一拍:停止的方块从略小处浮出,发送的箭头只淡入。
|
|
228
|
+
两种身份各取一支关键帧,切换时动画名跟着换才会重播。首帧就在的字形直接呈现(data-instant);
|
|
229
|
+
减弱动效下缩放归一、只剩淡入。粗指针下 ::after 是家族的命中区,字形只有 ::before 这一层,
|
|
230
|
+
旧字形与新字形不在两层上叠着淡 */
|
|
231
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='send']:not([data-instant]):empty::before {
|
|
232
|
+
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='stop']:not([data-instant]):empty::before {
|
|
236
|
+
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
@media (forced-colors: active) {
|
|
240
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
241
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
242
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
243
|
+
禁用取 GrayText */
|
|
244
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='send']:empty::before,
|
|
245
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='stop']:empty::before {
|
|
246
|
+
forced-color-adjust: none;
|
|
247
|
+
background-color: ButtonText;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='send']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before,
|
|
251
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='stop']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
252
|
+
background-color: HighlightText;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='send'][data-disabled]:empty::before,
|
|
256
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='stop'][data-disabled]:empty::before {
|
|
257
|
+
background-color: GrayText;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
224
260
|
}
|