@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/signature-pad.css
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
gap: var(--xh-signature-pad-gap, var(--xh-space-2));
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
/*
|
|
26
|
+
/* 复合单字段的标签:14 / 500 / fg-default,不随档;贴画布 space-1——
|
|
27
27
|
容器的 gap 归画布之后的部件,标签在它之上补一段差值把距离收成目标值 */
|
|
28
28
|
[data-scope='signature-pad'][data-part='label'] {
|
|
29
29
|
margin-block-end: calc(
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
/* 画布是块状的写字区:宽度铺满外层,高度由宽高比决定。
|
|
43
43
|
控件行高那把尺量的是一行控件,一块要写字的面积用不上它。
|
|
44
44
|
touch-action 由连接层内联写死,触摸落笔才不会被页面滚动抢走。
|
|
45
|
-
|
|
45
|
+
外壳按字段规则自绘(登记的画布型字段例外:字段家族配方钉死控件行高,画布按宽高比撑高吃不下它):
|
|
46
46
|
静息透明底 + border-control 描边 + control 圆角 + 无影 */
|
|
47
47
|
[data-scope='signature-pad'][data-part='control'] {
|
|
48
48
|
display: block;
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
/* 落笔、校验不过与禁用三档各换一次描边或底色,换的过程要看得出来 */
|
|
58
58
|
transition:
|
|
59
59
|
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
60
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
60
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
[data-scope='signature-pad'][data-part='control'][data-invalid] {
|
|
@@ -71,13 +71,13 @@
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
/* 只读仍看得见签名,只是改不动:收掉手型,别暗示"在这儿能写";
|
|
74
|
-
|
|
74
|
+
面按字段只读规则只换到淡底,描边不动 */
|
|
75
75
|
[data-scope='signature-pad'][data-part='control'][data-readonly]:not([data-disabled]) {
|
|
76
76
|
background: var(--xh-signature-pad-bg-readonly, var(--xh-bg-subtle));
|
|
77
77
|
cursor: default;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
/*
|
|
80
|
+
/* 字段禁用面:描边退到 border-default、底换淡底 */
|
|
81
81
|
[data-scope='signature-pad'][data-part='control'][data-disabled] {
|
|
82
82
|
border-color: var(--xh-signature-pad-border-disabled, var(--xh-border-default));
|
|
83
83
|
background: var(--xh-signature-pad-bg-disabled, var(--xh-bg-subtle));
|
|
@@ -100,9 +100,9 @@
|
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
/*
|
|
103
|
-
*
|
|
103
|
+
* 清空按钮是画布旁的独立文字按钮:盒型、sm 档几何、outline 四态面、0.97 按压与粗指针命中区由家族配方
|
|
104
104
|
* 按连接层投影的 data-xh-action-variant / -size 给出(缺省 outline,白底承载阶梯 100 → 200)。这里只把公开槽
|
|
105
|
-
* 桥接到矩阵之前(使用者槽 → 形态矩阵 →
|
|
105
|
+
* 桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射,矩阵各态无影(淡底与阴影互斥)。
|
|
106
106
|
*/
|
|
107
107
|
[data-scope='signature-pad'][data-part='clear-trigger'] {
|
|
108
108
|
--xh-action-bg-rest: var(--xh-signature-pad-clear-bg, var(--xh-_action-variant-bg-rest));
|
|
@@ -137,12 +137,25 @@
|
|
|
137
137
|
--xh-action-fg-rest: var(--xh-signature-pad-clear-fg-empty, var(--xh-fg-muted));
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
+
/*
|
|
141
|
+
* 撤销与重做按钮与清空按钮同一身份:盒型、sm 档几何、outline 四态面、0.97 按压与粗指针命中区全由家族配方给出。
|
|
142
|
+
* 没有可撤销或可重做的一步时连接层投影 data-disabled + aria-disabled,家族给置灰面,焦点仍留在钮上。
|
|
143
|
+
*/
|
|
144
|
+
[data-scope='signature-pad'][data-part='undo-trigger'],
|
|
145
|
+
[data-scope='signature-pad'][data-part='redo-trigger'] {
|
|
146
|
+
/* 作者塞进来的图标随档取字形尺(sm = 16px) */
|
|
147
|
+
--xh-icon-size: var(--xh-_action-profile-glyph-size);
|
|
148
|
+
|
|
149
|
+
/* 竖排容器里不铺满一行:按钮只占自己的宽 */
|
|
150
|
+
align-self: flex-start;
|
|
151
|
+
}
|
|
152
|
+
|
|
140
153
|
/* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色 */
|
|
141
154
|
[data-scope='signature-pad'][data-part='clear-trigger'][data-xh-action-variant='solid']:focus-visible {
|
|
142
155
|
--xh-action-ring-color-focus-visible: currentColor;
|
|
143
156
|
}
|
|
144
157
|
|
|
145
|
-
/*
|
|
158
|
+
/* 签没签的那句话是说明角色:13 / fg-muted / leading-normal。读屏靠它播报,看得见的人也用得上,因此不做视觉隐藏 */
|
|
146
159
|
[data-scope='signature-pad'][data-part='status'] {
|
|
147
160
|
color: var(--xh-signature-pad-status-fg, var(--xh-fg-muted));
|
|
148
161
|
font-size: var(--xh-signature-pad-status-font-size, var(--xh-text-secondary-size));
|
|
@@ -158,6 +171,8 @@
|
|
|
158
171
|
/* display 会盖掉 UA 的 [hidden]{display:none},凡是被赋了 display 的角色节点都要显式让位 */
|
|
159
172
|
[data-scope='signature-pad'][data-part='root'][hidden],
|
|
160
173
|
[data-scope='signature-pad'][data-part='control'][hidden],
|
|
174
|
+
[data-scope='signature-pad'][data-part='undo-trigger'][hidden],
|
|
175
|
+
[data-scope='signature-pad'][data-part='redo-trigger'][hidden],
|
|
161
176
|
[data-scope='signature-pad'][data-part='clear-trigger'][hidden] {
|
|
162
177
|
display: none;
|
|
163
178
|
}
|
package/css/skeleton.css
CHANGED
|
@@ -5,19 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
/* 定义 skeleton 样式。 */
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
不动 transform 也不动布局,整段动画只在合成层上跑 */
|
|
11
|
-
@keyframes xh-skeleton-shimmer {
|
|
12
|
-
from {
|
|
13
|
-
background-position: 200% 0;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
to {
|
|
17
|
-
background-position: -200% 0;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
20
10
|
|
|
11
|
+
@layer xihan.motion {
|
|
21
12
|
/* 呼吸档:整根条子在原色与禁用档之间来回淡。往返由 alternate 给,帧里只写一端 */
|
|
22
13
|
@keyframes xh-skeleton-pulse {
|
|
23
14
|
to {
|
|
@@ -44,6 +35,13 @@
|
|
|
44
35
|
display: none;
|
|
45
36
|
}
|
|
46
37
|
|
|
38
|
+
/* 刚加载完:机器已把骨架原地抬出文档流、钉住原来的尺寸,真实内容补上它空出来的位置;
|
|
39
|
+
骨架盖在内容之上淡出,播完才收起,不挡内容的指针。挂载时就已加载完的直接收起,不播这一段 */
|
|
40
|
+
[data-scope='skeleton'][data-part='root'][data-state='loaded']:not([hidden]) {
|
|
41
|
+
pointer-events: none;
|
|
42
|
+
animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
43
|
+
}
|
|
44
|
+
|
|
47
45
|
/*
|
|
48
46
|
* 单根骨架条。底色与微光两层叠在一起:
|
|
49
47
|
* background-color 是静止时看到的那层,background-image 是扫过去的那道光。
|
|
@@ -63,7 +61,8 @@
|
|
|
63
61
|
);
|
|
64
62
|
background-repeat: no-repeat;
|
|
65
63
|
background-size: 200% 100%;
|
|
66
|
-
|
|
64
|
+
/* 扫光与思考中文字、工具调用进行中同一段共享关键帧:同屏时亮带扫过的距离与节奏一致 */
|
|
65
|
+
animation: xh-shimmer var(--xh-skeleton-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-loop) infinite;
|
|
67
66
|
}
|
|
68
67
|
|
|
69
68
|
/* 一行文字的高度取正文字号,圆角拉满,看起来就是一行还没排出来的字 */
|
|
@@ -93,7 +92,7 @@
|
|
|
93
92
|
*/
|
|
94
93
|
[data-scope='skeleton'][data-part='root'][data-animation='pulse'] [data-part='item'] {
|
|
95
94
|
background-image: none;
|
|
96
|
-
animation: xh-skeleton-pulse var(--xh-skeleton-pulse-duration, var(--xh-shimmer
|
|
95
|
+
animation: xh-skeleton-pulse var(--xh-skeleton-pulse-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-sweep) infinite alternate;
|
|
97
96
|
}
|
|
98
97
|
|
|
99
98
|
/* 静止档:底色留着,两层动效都撤掉 */
|
package/css/slider.css
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
display: flex;
|
|
27
27
|
flex-direction: column;
|
|
28
|
-
/*
|
|
28
|
+
/* 字段标签贴控件(复合单字段) */
|
|
29
29
|
gap: var(--xh-slider-gap, var(--xh-space-1));
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
align-items: center;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
/*
|
|
38
|
+
/* 禁用不整体压暗:前景与表面各自降级——连接层把 data-disabled 发到每个角色节点上,
|
|
39
39
|
轨道、区间、拇指、刻度与标签就近消费,写在各自的规则里 */
|
|
40
40
|
|
|
41
|
-
/* 字段标签:14 / 500 / fg-default
|
|
41
|
+
/* 字段标签:14 / 500 / fg-default,禁用换到 --xh-fg-subtle */
|
|
42
42
|
[data-scope='slider'][data-part='label'] {
|
|
43
43
|
color: var(--xh-slider-label-fg, var(--xh-fg-default));
|
|
44
44
|
font-size: var(--xh-slider-label-font-size, var(--xh-text-label-size));
|
|
@@ -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
|
/* —— 尺寸 —— */
|
|
@@ -277,7 +298,7 @@
|
|
|
277
298
|
pointer-events: none;
|
|
278
299
|
}
|
|
279
300
|
|
|
280
|
-
/* 刻度点是正方盒,取 circle
|
|
301
|
+
/* 刻度点是正方盒,取 circle(正方盒不得用 pill 冒充圆) */
|
|
281
302
|
[data-scope='slider'][data-part='tick'] {
|
|
282
303
|
position: absolute;
|
|
283
304
|
inset-block-start: 50%;
|
|
@@ -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 高一档,又不到锚定浮层那一层。
|
|
@@ -67,7 +89,7 @@
|
|
|
67
89
|
opacity: var(--xh-sortable-item-opacity-dragging, 0.9);
|
|
68
90
|
}
|
|
69
91
|
|
|
70
|
-
/*
|
|
92
|
+
/* 把手是只有字形的离散动作钮(定尺把手):盒几何、悬停 / 按下与 0.97 按压、粗指针热区、焦点环、
|
|
71
93
|
禁用面全由 Action Control 的 icon ghost 档给(连接层投 xs:24px 正方盒,与此前 --xh-control-action-size
|
|
72
94
|
同尺寸),组件只映射既有使用者槽。静息透明,白底承载 hover 100 → pressed 200(此前悬停落 200 是错档)。
|
|
73
95
|
手型不是 pointer:抓起来拖的东西给 grab,按住拖动中给 grabbing;家族的手型槽逐态映射 */
|
|
@@ -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
|
+
}
|