@xihan-ui/styles 3.0.0 → 3.2.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 +63 -0
- package/README.md +1 -1
- package/component-tokens.d.ts +29 -0
- package/components.tokens.json +683 -27
- package/css/alert.css +2 -2
- package/css/approval.css +4 -4
- package/css/button.css +9 -5
- package/css/calendar-picker.css +3 -3
- package/css/calendar-range-picker.css +7 -7
- package/css/carousel.css +45 -13
- package/css/cartesian-chart.css +11 -11
- package/css/cascader.css +10 -10
- package/css/citation.css +2 -2
- package/css/code-view.css +6 -6
- package/css/color-picker.css +81 -0
- package/css/color-swatch-picker.css +9 -4
- package/css/combobox.css +12 -4
- package/css/command.css +1 -1
- package/css/date-field.css +39 -0
- package/css/date-picker.css +86 -9
- package/css/date-range-picker.css +47 -7
- package/css/diff-view.css +8 -8
- package/css/field-array.css +1 -1
- package/css/field.css +4 -0
- package/css/file-upload.css +1 -1
- package/css/float-button.css +140 -27
- package/css/form.css +14 -6
- package/css/graph-chart.css +2 -2
- package/css/highlight.css +1 -1
- package/css/image.css +1 -1
- package/css/mention.css +1 -1
- package/css/message-feed.css +1 -1
- package/css/notification.css +26 -20
- package/css/number-field.css +18 -18
- package/css/page-header.css +2 -2
- package/css/password-input.css +2 -2
- package/css/popconfirm.css +3 -3
- package/css/question-flow.css +8 -8
- package/css/radar-chart.css +6 -6
- package/css/rating.css +1 -1
- package/css/select.css +2 -2
- package/css/separator.css +2 -2
- package/css/side-nav.css +13 -13
- package/css/skeleton.css +5 -5
- package/css/slider.css +6 -6
- package/css/sortable.css +2 -2
- package/css/table.css +19 -2
- package/css/tags-input.css +1 -1
- package/css/time-picker.css +59 -2
- package/css/tool-call.css +7 -7
- package/css/tooltip.css +1 -1
- package/css/tree-select.css +2 -2
- package/css/tree.css +81 -11
- package/dist/css/accordion.css +269 -0
- package/dist/css/affix.css +47 -0
- package/dist/css/alert.css +247 -0
- package/dist/css/anchor.css +252 -0
- package/dist/css/approval.css +501 -0
- package/dist/css/avatar-group.css +99 -0
- package/dist/css/avatar.css +98 -0
- package/dist/css/back-top.css +161 -0
- package/dist/css/badge.css +205 -0
- package/dist/css/bar-code.css +62 -0
- package/dist/css/breadcrumb.css +230 -0
- package/dist/css/button-group.css +263 -0
- package/dist/css/button.css +219 -0
- package/dist/css/calendar-picker.css +467 -0
- package/dist/css/calendar-range-picker.css +554 -0
- package/dist/css/card.css +221 -0
- package/dist/css/carousel.css +710 -0
- package/dist/css/cartesian-chart.css +830 -0
- package/dist/css/cascader.css +961 -0
- package/dist/css/checkbox-group.css +358 -0
- package/dist/css/checkbox.css +257 -0
- package/dist/css/citation.css +470 -0
- package/dist/css/clipboard.css +315 -0
- package/dist/css/code-view.css +374 -0
- package/dist/css/collapsible.css +185 -0
- package/dist/css/color-field.css +176 -0
- package/dist/css/color-picker.css +595 -0
- package/dist/css/color-slider.css +281 -0
- package/dist/css/color-swatch-picker.css +250 -0
- package/dist/css/color-swatch.css +35 -0
- package/dist/css/combobox.css +574 -0
- package/dist/css/command.css +399 -0
- package/dist/css/context-menu.css +420 -0
- package/dist/css/date-field.css +317 -0
- package/dist/css/date-picker.css +868 -0
- package/dist/css/date-range-picker.css +886 -0
- package/dist/css/description.css +67 -0
- package/dist/css/descriptions.css +299 -0
- package/dist/css/dialog.css +455 -0
- package/dist/css/diff-view.css +513 -0
- package/dist/css/download-trigger.css +151 -0
- package/dist/css/drawer.css +552 -0
- package/dist/css/editable.css +295 -0
- package/dist/css/empty-state.css +163 -0
- package/dist/css/field-array.css +226 -0
- package/dist/css/field.css +166 -0
- package/dist/css/fieldset.css +102 -0
- package/dist/css/file-upload.css +429 -0
- package/dist/css/flex.css +441 -0
- package/dist/css/float-button.css +569 -0
- package/dist/css/floating-panel.css +429 -0
- package/dist/css/focus.css +46 -0
- package/dist/css/forced-colors.css +93 -0
- package/dist/css/form.css +393 -0
- package/dist/css/funnel-chart.css +106 -0
- package/dist/css/graph-chart.css +205 -0
- package/dist/css/grid-list.css +235 -0
- package/dist/css/grid.css +1201 -0
- package/dist/css/heatmap.css +552 -0
- package/dist/css/hierarchy-chart.css +298 -0
- package/dist/css/highlight.css +41 -0
- package/dist/css/hover-card.css +226 -0
- package/dist/css/icon.css +225 -0
- package/dist/css/image-cropper.css +373 -0
- package/dist/css/image-viewer.css +538 -0
- package/dist/css/image.css +98 -0
- package/dist/css/infinite-scroll.css +77 -0
- package/dist/css/input-group.css +275 -0
- package/dist/css/json-viewer.css +379 -0
- package/dist/css/kbd.css +72 -0
- package/dist/css/label.css +78 -0
- package/dist/css/layers.css +7 -0
- package/dist/css/layout.css +372 -0
- package/dist/css/liquid.css +106 -0
- package/dist/css/list.css +152 -0
- package/dist/css/listbox.css +390 -0
- package/dist/css/loading-bar.css +141 -0
- package/dist/css/log.css +306 -0
- package/dist/css/markdown-stream.css +149 -0
- package/dist/css/marquee.css +378 -0
- package/dist/css/masonry.css +70 -0
- package/dist/css/matrix-code.css +67 -0
- package/dist/css/mention.css +393 -0
- package/dist/css/menu.css +364 -0
- package/dist/css/menubar.css +456 -0
- package/dist/css/message-feed.css +318 -0
- package/dist/css/navigation-menu.css +513 -0
- package/dist/css/notification.css +782 -0
- package/dist/css/number-animation.css +44 -0
- package/dist/css/number-field.css +252 -0
- package/dist/css/overlay-arrow.css +56 -0
- package/dist/css/page-header.css +184 -0
- package/dist/css/pagination.css +450 -0
- package/dist/css/password-input.css +391 -0
- package/dist/css/pie-chart.css +247 -0
- package/dist/css/pin-input.css +199 -0
- package/dist/css/pointer.css +36 -0
- package/dist/css/popconfirm.css +320 -0
- package/dist/css/popover.css +279 -0
- package/dist/css/progress.css +501 -0
- package/dist/css/prompt-input.css +260 -0
- package/dist/css/question-flow.css +553 -0
- package/dist/css/radar-chart.css +233 -0
- package/dist/css/radio-group.css +598 -0
- package/dist/css/rating.css +294 -0
- package/dist/css/reasoning.css +343 -0
- package/dist/css/reset.css +117 -0
- package/dist/css/resizable.css +242 -0
- package/dist/css/sankey-chart.css +174 -0
- package/dist/css/scroll-area.css +240 -0
- package/dist/css/scrollbar.css +204 -0
- package/dist/css/select.css +612 -0
- package/dist/css/separator.css +122 -0
- package/dist/css/side-nav.css +476 -0
- package/dist/css/signature-pad.css +179 -0
- package/dist/css/skeleton.css +161 -0
- package/dist/css/slider.css +374 -0
- package/dist/css/sortable.css +228 -0
- package/dist/css/sparkline.css +164 -0
- package/dist/css/spinner.css +236 -0
- package/dist/css/splitter.css +159 -0
- package/dist/css/statistic.css +137 -0
- package/dist/css/steps.css +627 -0
- package/dist/css/switch.css +351 -0
- package/dist/css/table.css +1145 -0
- package/dist/css/tabs.css +944 -0
- package/dist/css/tag-group.css +247 -0
- package/dist/css/tag.css +310 -0
- package/dist/css/tags-input.css +322 -0
- package/dist/css/text-field.css +197 -0
- package/dist/css/time-field.css +277 -0
- package/dist/css/time-picker.css +707 -0
- package/dist/css/time-range-picker.css +746 -0
- package/dist/css/timeline.css +423 -0
- package/dist/css/timer.css +123 -0
- package/dist/css/timestamp.css +34 -0
- package/dist/css/toggle-group.css +424 -0
- package/dist/css/toggle.css +146 -0
- package/dist/css/tone.css +189 -0
- package/dist/css/tool-call.css +429 -0
- package/dist/css/toolbar.css +365 -0
- package/dist/css/tooltip.css +218 -0
- package/dist/css/tour.css +439 -0
- package/dist/css/transfer.css +638 -0
- package/dist/css/tree-select.css +878 -0
- package/dist/css/tree.css +733 -0
- package/dist/css/truncate.css +108 -0
- package/dist/css/typography.css +472 -0
- package/dist/css/undefined.css +58 -0
- package/dist/css/virtualizer.css +166 -0
- package/dist/css/visually-hidden.css +20 -0
- package/dist/css/watermark.css +82 -0
- package/dist/family/action-control.css +487 -0
- package/dist/family/chart.css +480 -0
- package/dist/family/check-mark.css +94 -0
- package/dist/family/choice-card.css +97 -0
- package/dist/family/collection-item.css +764 -0
- package/dist/family/field-chrome.css +287 -0
- package/dist/family/loading-ring.css +95 -0
- package/dist/family/material.css +72 -0
- package/dist/family/menu-choice.css +56 -0
- package/dist/family/motion.css +363 -0
- package/dist/family/swatch.css +59 -0
- package/dist/family/tag-list.css +59 -0
- package/family/action-control.css +3 -12
- package/index.css +7307 -6759
- package/index.unlayered.css +7309 -6761
- package/package.json +165 -164
|
@@ -0,0 +1,179 @@
|
|
|
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
|
+
/* 定义 signature pad 样式。 */
|
|
7
|
+
|
|
8
|
+
@import '../family/action-control.css';
|
|
9
|
+
|
|
10
|
+
@layer xihan.components {
|
|
11
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
12
|
+
.xh-scope-signature-pad {
|
|
13
|
+
--xh-signature-pad-skin: 1;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* position 是给表单影子做定位基准的:那份输入被连接层内联写成绝对定位,
|
|
17
|
+
根上不留基准它就会贴到更外层的定位祖先上,原生校验提示跟着飘到页面别处。 */
|
|
18
|
+
.xh-scope-signature-pad[data-part='root'] {
|
|
19
|
+
position: relative;
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
/* 画布到清空按钮与状态句的距离;标签到画布另有一档,见 label */
|
|
23
|
+
gap: var(--xh-signature-pad-gap, var(--xh-space-2));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* 复合单字段的标签:14 / 500 / fg-default,不随档;贴画布 space-1——
|
|
27
|
+
容器的 gap 归画布之后的部件,标签在它之上补一段差值把距离收成目标值 */
|
|
28
|
+
.xh-scope-signature-pad[data-part='label'] {
|
|
29
|
+
margin-block-end: calc(
|
|
30
|
+
var(--xh-signature-pad-label-gap, var(--xh-space-1))
|
|
31
|
+
- var(--xh-signature-pad-gap, var(--xh-space-2))
|
|
32
|
+
);
|
|
33
|
+
color: var(--xh-signature-pad-label-fg, var(--xh-fg-default));
|
|
34
|
+
font-size: var(--xh-signature-pad-label-font-size, var(--xh-text-label-size));
|
|
35
|
+
font-weight: var(--xh-signature-pad-label-font-weight, var(--xh-text-label-weight));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.xh-scope-signature-pad[data-part='label'][data-disabled] {
|
|
39
|
+
color: var(--xh-signature-pad-label-fg-disabled, var(--xh-fg-subtle));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* 画布是块状的写字区:宽度铺满外层,高度由宽高比决定。
|
|
43
|
+
控件行高那把尺量的是一行控件,一块要写字的面积用不上它。
|
|
44
|
+
touch-action 由连接层内联写死,触摸落笔才不会被页面滚动抢走。
|
|
45
|
+
外壳按字段规则自绘(登记的画布型字段例外:字段家族配方钉死控件行高,画布按宽高比撑高吃不下它):
|
|
46
|
+
静息透明底 + border-control 描边 + control 圆角 + 无影 */
|
|
47
|
+
.xh-scope-signature-pad[data-part='control'] {
|
|
48
|
+
display: block;
|
|
49
|
+
inline-size: 100%;
|
|
50
|
+
aspect-ratio: var(--xh-signature-pad-aspect-ratio, 5 / 2);
|
|
51
|
+
border: var(--xh-stroke-thin) solid var(--xh-signature-pad-border, var(--xh-border-control));
|
|
52
|
+
border-radius: var(--xh-signature-pad-radius, var(--xh-shape-control));
|
|
53
|
+
background: var(--xh-signature-pad-bg, transparent);
|
|
54
|
+
cursor: crosshair;
|
|
55
|
+
/* 一划就会把画布连同旁边的文字一起刷成选中态 */
|
|
56
|
+
user-select: none;
|
|
57
|
+
/* 落笔、校验不过与禁用三档各换一次描边或底色,换的过程要看得出来 */
|
|
58
|
+
transition:
|
|
59
|
+
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
60
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.xh-scope-signature-pad[data-part='control'][data-invalid] {
|
|
64
|
+
border-color: var(--xh-signature-pad-control-border-invalid, var(--xh-border-invalid));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* 落笔期间把描边压深一档。border-strong 是装饰梯度里的一档,比 border-control 更淡,
|
|
68
|
+
用在这儿会让描边在落笔时反而变弱 */
|
|
69
|
+
.xh-scope-signature-pad[data-part='control'][data-drawing] {
|
|
70
|
+
border-color: var(--xh-signature-pad-border-drawing, var(--xh-border-control-hover));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* 只读仍看得见签名,只是改不动:收掉手型,别暗示"在这儿能写";
|
|
74
|
+
面按字段只读规则只换到淡底,描边不动 */
|
|
75
|
+
.xh-scope-signature-pad[data-part='control'][data-readonly]:not([data-disabled]) {
|
|
76
|
+
background: var(--xh-signature-pad-bg-readonly, var(--xh-bg-subtle));
|
|
77
|
+
cursor: default;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* 字段禁用面:描边退到 border-default、底换淡底 */
|
|
81
|
+
.xh-scope-signature-pad[data-part='control'][data-disabled] {
|
|
82
|
+
border-color: var(--xh-signature-pad-border-disabled, var(--xh-border-default));
|
|
83
|
+
background: var(--xh-signature-pad-bg-disabled, var(--xh-bg-subtle));
|
|
84
|
+
cursor: not-allowed;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* 基准线:位置由连接层按百分比给出,这里只管它长什么样。
|
|
88
|
+
它是"请在这条线上签"的功能性提示,不是装饰,颜色走控件描边那一档才看得见 */
|
|
89
|
+
.xh-scope-signature-pad[data-part='guide'] {
|
|
90
|
+
stroke: var(--xh-signature-pad-guide-stroke, var(--xh-border-control));
|
|
91
|
+
stroke-width: var(--xh-stroke-thin);
|
|
92
|
+
stroke-dasharray: 6 6;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* 笔迹是一条填充路径(每一笔是它的一条子路径),不是描边:
|
|
96
|
+
粗细要随压感变,而 stroke-width 全线只有一个值 */
|
|
97
|
+
.xh-scope-signature-pad[data-part='path'] {
|
|
98
|
+
fill: var(--xh-signature-pad-ink, var(--xh-fg-default));
|
|
99
|
+
stroke: none;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/*
|
|
103
|
+
* 清空按钮是画布旁的独立文字按钮:盒型、sm 档几何、outline 四态面、0.97 按压与粗指针命中区由家族配方
|
|
104
|
+
* 按连接层投影的 data-xh-action-variant / -size 给出(缺省 outline,白底承载阶梯 100 → 200)。这里只把公开槽
|
|
105
|
+
* 桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射,矩阵各态无影(淡底与阴影互斥)。
|
|
106
|
+
*/
|
|
107
|
+
.xh-scope-signature-pad[data-part='clear-trigger'] {
|
|
108
|
+
--xh-action-bg-rest: var(--xh-signature-pad-clear-bg, var(--xh-_action-variant-bg-rest));
|
|
109
|
+
--xh-action-bg-hover: var(--xh-signature-pad-clear-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
110
|
+
--xh-action-bg-pressed: var(--xh-signature-pad-clear-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
111
|
+
--xh-action-bg-focus-visible: var(--xh-signature-pad-clear-bg, var(--xh-_action-variant-bg-focus-visible));
|
|
112
|
+
--xh-action-bg-disabled: var(--xh-signature-pad-clear-bg-disabled, var(--xh-_action-variant-bg-disabled));
|
|
113
|
+
--xh-action-fg-rest: var(--xh-signature-pad-clear-fg, var(--xh-_action-variant-fg-rest));
|
|
114
|
+
--xh-action-fg-hover: var(--xh-signature-pad-clear-fg, var(--xh-_action-variant-fg-hover));
|
|
115
|
+
--xh-action-fg-pressed: var(--xh-signature-pad-clear-fg, var(--xh-_action-variant-fg-pressed));
|
|
116
|
+
--xh-action-fg-focus-visible: var(--xh-signature-pad-clear-fg, var(--xh-_action-variant-fg-focus-visible));
|
|
117
|
+
--xh-action-border-rest: var(--xh-signature-pad-clear-border, var(--xh-_action-variant-border-rest));
|
|
118
|
+
--xh-action-border-hover: var(--xh-signature-pad-clear-border-hover, var(--xh-_action-variant-border-hover));
|
|
119
|
+
--xh-action-border-pressed: var(--xh-signature-pad-clear-border-hover, var(--xh-_action-variant-border-pressed));
|
|
120
|
+
--xh-action-border-focus-visible: var(--xh-signature-pad-clear-border, var(--xh-_action-variant-border-focus-visible));
|
|
121
|
+
/* 矩阵各态无影:悬停不再抬影(raised 只给 Button),使用者槽仍可自行加 */
|
|
122
|
+
--xh-action-shadow-hover: var(--xh-signature-pad-clear-shadow-hover, none);
|
|
123
|
+
--xh-action-radius: var(--xh-signature-pad-clear-radius, var(--xh-shape-control));
|
|
124
|
+
--xh-action-visual-size: var(--xh-signature-pad-clear-h, var(--xh-_action-profile-visual-size));
|
|
125
|
+
--xh-action-padding-inline: var(--xh-signature-pad-clear-px, var(--xh-_action-profile-padding-inline));
|
|
126
|
+
--xh-action-gap: var(--xh-signature-pad-clear-gap, var(--xh-_action-profile-gap));
|
|
127
|
+
--xh-action-font-size: var(--xh-signature-pad-clear-font-size, var(--xh-_action-profile-font-size));
|
|
128
|
+
/* 作者塞进来的图标随档取字形尺(sm = 16px) */
|
|
129
|
+
--xh-icon-size: var(--xh-signature-pad-clear-icon-size, var(--xh-_action-profile-glyph-size));
|
|
130
|
+
|
|
131
|
+
/* 竖排容器里不铺满一行:按钮只占自己的宽 */
|
|
132
|
+
align-self: flex-start;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* 空画布时按钮照常可按(收起它会让焦点掉回 body),只把静息前景压淡一档;悬停与按下仍回到默认前景 */
|
|
136
|
+
.xh-scope-signature-pad[data-part='clear-trigger'][data-empty] {
|
|
137
|
+
--xh-action-fg-rest: var(--xh-signature-pad-clear-fg-empty, var(--xh-fg-muted));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/*
|
|
141
|
+
* 撤销与重做按钮与清空按钮同一身份:盒型、sm 档几何、outline 四态面、0.97 按压与粗指针命中区全由家族配方给出。
|
|
142
|
+
* 没有可撤销或可重做的一步时连接层投影 data-disabled + aria-disabled,家族给置灰面,焦点仍留在钮上。
|
|
143
|
+
*/
|
|
144
|
+
.xh-scope-signature-pad[data-part='undo-trigger'],
|
|
145
|
+
.xh-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
|
+
|
|
153
|
+
/* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色 */
|
|
154
|
+
.xh-scope-signature-pad[data-part='clear-trigger'][data-xh-action-variant='solid']:focus-visible {
|
|
155
|
+
--xh-action-ring-color-focus-visible: currentColor;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* 签没签的那句话是说明角色:13 / fg-muted / leading-normal。读屏靠它播报,看得见的人也用得上,因此不做视觉隐藏 */
|
|
159
|
+
.xh-scope-signature-pad[data-part='status'] {
|
|
160
|
+
color: var(--xh-signature-pad-status-fg, var(--xh-fg-muted));
|
|
161
|
+
font-size: var(--xh-signature-pad-status-font-size, var(--xh-text-secondary-size));
|
|
162
|
+
line-height: var(--xh-leading-normal);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* 表单影子的视觉隐藏(绝对定位 + 1px + clip-path)连接层内联给全了,这里不重复也不覆盖,
|
|
166
|
+
只掐掉指针命中:那个 1px 的框压在画布上会截走本该落到画布上的落笔。 */
|
|
167
|
+
.xh-scope-signature-pad[data-part='hidden-input'] {
|
|
168
|
+
pointer-events: none;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* display 会盖掉 UA 的 [hidden]{display:none},凡是被赋了 display 的角色节点都要显式让位 */
|
|
172
|
+
.xh-scope-signature-pad[data-part='root'][hidden],
|
|
173
|
+
.xh-scope-signature-pad[data-part='control'][hidden],
|
|
174
|
+
.xh-scope-signature-pad[data-part='undo-trigger'][hidden],
|
|
175
|
+
.xh-scope-signature-pad[data-part='redo-trigger'][hidden],
|
|
176
|
+
.xh-scope-signature-pad[data-part='clear-trigger'][hidden] {
|
|
177
|
+
display: none;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
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
|
+
/* 定义 skeleton 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
10
|
+
|
|
11
|
+
@layer xihan.motion {
|
|
12
|
+
/* 呼吸档:整根条子在原色与禁用档之间来回淡。往返由 alternate 给,帧里只写一端 */
|
|
13
|
+
@keyframes xh-skeleton-pulse {
|
|
14
|
+
to {
|
|
15
|
+
opacity: var(--xh-state-disabled-opacity);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@layer xihan.components {
|
|
21
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
22
|
+
.xh-scope-skeleton {
|
|
23
|
+
--xh-skeleton-skin: 1;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* 骨架容器:竖着码放各根骨架条 */
|
|
27
|
+
.xh-scope-skeleton[data-part='root'] {
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: column;
|
|
30
|
+
gap: var(--xh-skeleton-gap, var(--xh-space-3));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},补这条兜住加载结束后的收起态 */
|
|
34
|
+
.xh-scope-skeleton[data-part='root'][hidden] {
|
|
35
|
+
display: none;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* 刚加载完:机器已把骨架原地抬出文档流、钉住原来的尺寸,真实内容补上它空出来的位置;
|
|
39
|
+
骨架盖在内容之上淡出,播完才收起,不挡内容的指针。挂载时就已加载完的直接收起,不播这一段 */
|
|
40
|
+
.xh-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
|
+
|
|
45
|
+
/*
|
|
46
|
+
* 单根骨架条。底色与微光两层叠在一起:
|
|
47
|
+
* background-color 是静止时看到的那层,background-image 是扫过去的那道光。
|
|
48
|
+
* 微光取比底亮一档的那支面色:浅色下比 bg-subtle 亮、深色下同样比它亮,
|
|
49
|
+
* 两个主题里扫过去的都是一道亮带,而不是浅色下反倒扫出一道暗带。
|
|
50
|
+
*/
|
|
51
|
+
.xh-scope-skeleton[data-part='item'] {
|
|
52
|
+
inline-size: 100%;
|
|
53
|
+
pointer-events: none;
|
|
54
|
+
border-radius: var(--xh-skeleton-radius, var(--xh-shape-control));
|
|
55
|
+
background-color: var(--xh-skeleton-bg, var(--xh-bg-subtle));
|
|
56
|
+
background-image: linear-gradient(
|
|
57
|
+
90deg,
|
|
58
|
+
transparent 20%,
|
|
59
|
+
var(--xh-skeleton-sheen, var(--xh-bg-surface-raised)) 50%,
|
|
60
|
+
transparent 80%
|
|
61
|
+
);
|
|
62
|
+
background-repeat: no-repeat;
|
|
63
|
+
background-size: 200% 100%;
|
|
64
|
+
/* 扫光与思考中文字、工具调用进行中同一段共享关键帧:同屏时亮带扫过的距离与节奏一致 */
|
|
65
|
+
animation: xh-shimmer var(--xh-skeleton-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-loop) infinite;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* 一行文字的高度取正文字号,圆角拉满,看起来就是一行还没排出来的字 */
|
|
69
|
+
.xh-scope-skeleton[data-part='item'][data-shape='text'] {
|
|
70
|
+
block-size: var(--xh-skeleton-text-block-size, var(--xh-text-caption-size));
|
|
71
|
+
border-radius: var(--xh-skeleton-text-radius, var(--xh-shape-pill));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* 头像位:正方形加满圆角。宽度定死不跟着容器拉长,高度也不许被主轴压扁 */
|
|
75
|
+
.xh-scope-skeleton[data-part='item'][data-shape='circle'] {
|
|
76
|
+
flex: none;
|
|
77
|
+
inline-size: var(--xh-skeleton-circle-size, var(--xh-control-h-lg));
|
|
78
|
+
aspect-ratio: 1;
|
|
79
|
+
border-radius: var(--xh-skeleton-circle-radius, var(--xh-shape-circle));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* 图片、卡片这类成块的占位:给个最小高度,撑开由作者决定 */
|
|
83
|
+
.xh-scope-skeleton[data-part='item'][data-shape='rect'] {
|
|
84
|
+
min-block-size: var(--xh-skeleton-rect-block-size, var(--xh-control-h-lg));
|
|
85
|
+
border-radius: var(--xh-skeleton-rect-radius, var(--xh-shape-surface));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/*
|
|
89
|
+
* 呼吸档:撤掉微光那层,整根条子在原色与禁用档之间来回淡。
|
|
90
|
+
* 微光扫的是一道亮带,呼吸改的是整根的浓淡——两者都表达"还在等",
|
|
91
|
+
* 换哪一档由作者定,缺省仍是微光。
|
|
92
|
+
*/
|
|
93
|
+
.xh-scope-skeleton[data-part='root'][data-animation='pulse'] [data-part='item']:where(.xh-scope-skeleton) {
|
|
94
|
+
background-image: none;
|
|
95
|
+
animation: xh-skeleton-pulse var(--xh-skeleton-pulse-duration, var(--xh-motion-loop-shimmer)) var(--xh-motion-ease-sweep) infinite alternate;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* 静止档:底色留着,两层动效都撤掉 */
|
|
99
|
+
.xh-scope-skeleton[data-part='root'][data-animation='none'] [data-part='item']:where(.xh-scope-skeleton) {
|
|
100
|
+
background-image: none;
|
|
101
|
+
animation: none;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* 呼吸档自带一条动画,压不住下面基础降级里的 animation: none,这一档各自再写一份。
|
|
105
|
+
两组规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
|
|
106
|
+
@media (prefers-reduced-motion: reduce) {
|
|
107
|
+
.xh-scope-skeleton[data-part='root'][data-animation='pulse'] [data-part='item']:where(.xh-scope-skeleton) {
|
|
108
|
+
animation: none;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
:where([data-motion='reduce']) .xh-scope-skeleton[data-part='root'][data-animation='pulse'] [data-part='item']:where(.xh-scope-skeleton) {
|
|
113
|
+
animation: none;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
@media print {
|
|
117
|
+
.xh-scope-skeleton[data-part='root'][data-animation='pulse'] [data-part='item']:where(.xh-scope-skeleton) {
|
|
118
|
+
animation: none;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* 减少动效:撤掉微光那层,只留静态底色。
|
|
124
|
+
* 骨架屏是自己冒出来、会一直循环到数据回来为止的动效,正是最容易引发不适的那一类;
|
|
125
|
+
* 这里不能只把时长压到接近零——那样光带会停在某一帧上,留下一道说不清的渐变。
|
|
126
|
+
* 两条规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion。
|
|
127
|
+
*/
|
|
128
|
+
@media (prefers-reduced-motion: reduce) {
|
|
129
|
+
.xh-scope-skeleton[data-part='item'] {
|
|
130
|
+
background-image: none;
|
|
131
|
+
animation: none;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
:where([data-motion='reduce']) .xh-scope-skeleton[data-part='item'] {
|
|
136
|
+
background-image: none;
|
|
137
|
+
animation: none;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@media print {
|
|
141
|
+
/* 打印:动画会被定格在任意一帧——转了一半的圈、扫到一半的微光。这里换成静止的表达,
|
|
142
|
+
取值与减弱动效那一档相同。两档各写一块、不并进一条媒体查询列表:减弱动效另有一份
|
|
143
|
+
:where([data-motion='reduce']) 的钩子版本与它成对,打印没有对应的钩子可配,
|
|
144
|
+
并成一条之后这层配对关系在文本上就断了。 */
|
|
145
|
+
.xh-scope-skeleton[data-part='item'] {
|
|
146
|
+
background-image: none;
|
|
147
|
+
animation: none;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/*
|
|
152
|
+
* 高对比档:骨架条整根靠底色画出来,这一档里底色与微光一起被系统换掉,
|
|
153
|
+
* 一块什么都没有的空白——正在加载这件事没有了任何表达。改成描一圈边把条子勾出来。
|
|
154
|
+
*/
|
|
155
|
+
@media (forced-colors: active) {
|
|
156
|
+
.xh-scope-skeleton[data-part='item'] {
|
|
157
|
+
border: var(--xh-stroke-thin) solid GrayText;
|
|
158
|
+
background-image: none;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|