@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/dialog.css
CHANGED
|
@@ -9,38 +9,6 @@
|
|
|
9
9
|
@import '../family/motion.css';
|
|
10
10
|
@import '../family/action-control.css';
|
|
11
11
|
|
|
12
|
-
@layer xihan.motion {
|
|
13
|
-
/* 幅度走令牌,减弱动效时由令牌层归零;位移与缩放用独立属性而非 transform 简写,
|
|
14
|
-
两者互不覆盖,手势期间写 translate 也不会把 scale 抹掉 */
|
|
15
|
-
@keyframes xh-dialog-in {
|
|
16
|
-
from {
|
|
17
|
-
opacity: 0;
|
|
18
|
-
translate: 0 var(--xh-motion-distance-md);
|
|
19
|
-
scale: var(--xh-motion-scale-enter);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
to {
|
|
23
|
-
opacity: 1;
|
|
24
|
-
translate: 0 0;
|
|
25
|
-
scale: 1;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@keyframes xh-dialog-out {
|
|
30
|
-
from {
|
|
31
|
-
opacity: 1;
|
|
32
|
-
translate: 0 0;
|
|
33
|
-
scale: 1;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
to {
|
|
37
|
-
opacity: 0;
|
|
38
|
-
translate: 0 var(--xh-motion-distance-md);
|
|
39
|
-
scale: var(--xh-motion-scale-exit);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
12
|
@layer xihan.components {
|
|
45
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
46
14
|
[data-scope='dialog'] {
|
|
@@ -48,7 +16,7 @@
|
|
|
48
16
|
}
|
|
49
17
|
|
|
50
18
|
/*
|
|
51
|
-
*
|
|
19
|
+
* 触发器是页面上的独立文字按钮:盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
|
|
52
20
|
* 由家族配方按连接层投影的 data-xh-action-variant / -size 给出。皮肤没有自己的外观规则,
|
|
53
21
|
* 只把作者塞进按钮的图标接到随档字形尺(md = 20px)。
|
|
54
22
|
*/
|
|
@@ -80,7 +48,7 @@
|
|
|
80
48
|
background: transparent;
|
|
81
49
|
}
|
|
82
50
|
|
|
83
|
-
[data-scope='dialog'][data-part='backdrop'][data-state='open'] {
|
|
51
|
+
[data-scope='dialog'][data-part='backdrop'][data-state='open']:not([data-instant]) {
|
|
84
52
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
85
53
|
}
|
|
86
54
|
|
|
@@ -112,7 +80,7 @@
|
|
|
112
80
|
}
|
|
113
81
|
|
|
114
82
|
[data-scope='dialog'][data-part='content'] {
|
|
115
|
-
/*
|
|
83
|
+
/* 作者塞进面板里的图标按控件档取;语气徽记与关闭钮另有各自的尺 */
|
|
116
84
|
--xh-icon-size: var(--xh-dialog-icon-size, var(--xh-glyph-size-md));
|
|
117
85
|
|
|
118
86
|
/* 尺寸档只换这一个私有槽。它声明在 content 而不是别处:dialog 的解剖里没有 root,
|
|
@@ -178,14 +146,77 @@
|
|
|
178
146
|
outline: none;
|
|
179
147
|
}
|
|
180
148
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
will-change: opacity, scale, translate;
|
|
149
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
150
|
+
[data-scope='dialog'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
151
|
+
animation: xh-sheet-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
185
152
|
}
|
|
186
153
|
|
|
187
154
|
[data-scope='dialog'][data-part='content'][data-state='closed'] {
|
|
188
|
-
animation: xh-
|
|
155
|
+
animation: xh-sheet-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/* —— 拖动 ——
|
|
159
|
+
位移由连接层写进两个私有槽,是屏幕坐标:跟着指针与方向键走,RTL 下不翻。
|
|
160
|
+
进出场关键帧占着 translate 与 scale 两个独立属性,位移只能走 transform:它排在独立属性之后合成,
|
|
161
|
+
与进出场叠在一起。写进 translate 的话,拖过的面板一收起就先被关键帧拽回居中再退场。
|
|
162
|
+
位移跟手,不挂过渡 */
|
|
163
|
+
[data-scope='dialog'][data-part='content'][data-draggable] {
|
|
164
|
+
transform: translate(var(--xh-_dialog-drag-x, 0px), var(--xh-_dialog-drag-y, 0px));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* 跟手期间才备合成层;拖动中不选中文字 */
|
|
168
|
+
[data-scope='dialog'][data-part='content'][data-dragging] {
|
|
169
|
+
will-change: transform;
|
|
170
|
+
user-select: none;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* 标题栏是拖动区(没写 header 时是标题):指针按下即跟手,触屏不让浏览器抢走这段手势 */
|
|
174
|
+
[data-scope='dialog'][data-part='header'][data-draggable],
|
|
175
|
+
[data-scope='dialog'][data-part='title'][data-draggable] {
|
|
176
|
+
cursor: grab;
|
|
177
|
+
touch-action: none;
|
|
178
|
+
user-select: none;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
[data-scope='dialog'][data-part='content'][data-dragging] [data-scope='dialog'][data-part='header'],
|
|
182
|
+
[data-scope='dialog'][data-part='content'][data-dragging] [data-scope='dialog'][data-part='title'] {
|
|
183
|
+
cursor: grabbing;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/* 拖动把手:一块透明的命中区,给键盘一个挪动面板的落脚点。放在标题栏里时铺满标题栏,
|
|
187
|
+
焦点环沿标题栏画;单独摆放时是一条满宽的细条 */
|
|
188
|
+
[data-scope='dialog'][data-part='drag-trigger'] {
|
|
189
|
+
display: block;
|
|
190
|
+
inline-size: 100%;
|
|
191
|
+
min-block-size: var(--xh-dialog-drag-trigger-min-h, var(--xh-space-6));
|
|
192
|
+
border: 0;
|
|
193
|
+
border-radius: var(--xh-dialog-drag-trigger-radius, var(--xh-shape-control));
|
|
194
|
+
padding: 0;
|
|
195
|
+
background: transparent;
|
|
196
|
+
cursor: grab;
|
|
197
|
+
touch-action: none;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
[data-scope='dialog'][data-part='header']:has(> [data-scope='dialog'][data-part='drag-trigger']) {
|
|
201
|
+
position: relative;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
[data-scope='dialog'][data-part='header'] > [data-scope='dialog'][data-part='drag-trigger'] {
|
|
205
|
+
position: absolute;
|
|
206
|
+
inset: 0;
|
|
207
|
+
min-block-size: 0;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
[data-scope='dialog'][data-part='drag-trigger'][data-dragging] {
|
|
211
|
+
cursor: grabbing;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
[data-scope='dialog'][data-part='drag-trigger'][data-disabled] {
|
|
215
|
+
cursor: default;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
[data-scope='dialog'][data-part='drag-trigger'][hidden] {
|
|
219
|
+
display: none;
|
|
189
220
|
}
|
|
190
221
|
|
|
191
222
|
/* —— 面板三段 —— */
|
|
@@ -262,7 +293,7 @@
|
|
|
262
293
|
|
|
263
294
|
/* 正文段:面板里唯一会滚的一段。最小高度归零,
|
|
264
295
|
否则弹性项按内容撑高,容器再矮也不产生溢出,滚动条永远出不来。
|
|
265
|
-
模态 body
|
|
296
|
+
模态 body 是原生细条滚动面:细条由 reset 层统一给,滚到头不把页面一起带走 */
|
|
266
297
|
[data-scope='dialog'][data-part='body'] {
|
|
267
298
|
flex: 1 1 auto;
|
|
268
299
|
min-block-size: 0;
|
|
@@ -305,7 +336,7 @@
|
|
|
305
336
|
color: var(--xh-dialog-title-fg, var(--xh-fg-default));
|
|
306
337
|
}
|
|
307
338
|
|
|
308
|
-
/*
|
|
339
|
+
/* 说明文字走说明档:13px + fg-muted */
|
|
309
340
|
[data-scope='dialog'][data-part='description'] {
|
|
310
341
|
margin: 0;
|
|
311
342
|
font-size: var(--xh-dialog-description-font-size, var(--xh-text-secondary-size));
|
|
@@ -320,7 +351,7 @@
|
|
|
320
351
|
}
|
|
321
352
|
|
|
322
353
|
/*
|
|
323
|
-
*
|
|
354
|
+
* 关闭钮是面板角落的单图标钮:正方盒、sm 档几何、ghost 四态面、0.97 按压并换底与粗指针命中区
|
|
324
355
|
* 由家族配方给出——白面上走画布承载阶梯悬停 --xh-bg-subtle(100)→ 按下 --xh-bg-subtle-hover(200),
|
|
325
356
|
* 焦点面透明吃库环。这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与摆放,
|
|
326
357
|
* 聚焦档的 -bg-focus / -fg-focus 两槽同样桥到配方的 focus-visible 面,缺省仍是透明底与悬停字色;
|
|
@@ -396,4 +427,29 @@
|
|
|
396
427
|
display: none;
|
|
397
428
|
}
|
|
398
429
|
}
|
|
430
|
+
|
|
431
|
+
@media (forced-colors: active) {
|
|
432
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
433
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
434
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
435
|
+
落在 Canvas 面上的取 CanvasText;
|
|
436
|
+
禁用取 GrayText */
|
|
437
|
+
[data-scope='dialog'][data-part='indicator']:empty::before {
|
|
438
|
+
forced-color-adjust: none;
|
|
439
|
+
background-color: CanvasText;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
[data-scope='dialog'][data-part='close-trigger']:empty::before {
|
|
443
|
+
forced-color-adjust: none;
|
|
444
|
+
background-color: ButtonText;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
[data-scope='dialog'][data-part='close-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
448
|
+
background-color: HighlightText;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
[data-scope='dialog'][data-part='close-trigger'][data-disabled]:empty::before {
|
|
452
|
+
background-color: GrayText;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
399
455
|
}
|
package/css/diff-view.css
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
/* 定义 diff view 样式。 */
|
|
7
7
|
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
8
10
|
/* 独立皮肤同时传递引入折叠格按钮的动作控件配方;full bundle 递归去重。 */
|
|
9
11
|
@import '../family/action-control.css';
|
|
10
12
|
|
|
@@ -14,15 +16,15 @@
|
|
|
14
16
|
--xh-diff-view-skin: 1;
|
|
15
17
|
}
|
|
16
18
|
|
|
17
|
-
/* 一张静态内容面:--xh-border-default 描边 + surface 底 +
|
|
19
|
+
/* 一张静态内容面:--xh-border-default 描边 + surface 底 + 无影(边界只由描边承担);
|
|
18
20
|
头部、行号列与并排接缝的内部分隔线走另一支 --xh-diff-view-divider(subtle) */
|
|
19
21
|
[data-scope='diff-view'][data-part='root'] {
|
|
20
|
-
/* 作者塞进部件里的图标与皮肤画的兜底字形同一把尺:md 档,随 data-size
|
|
22
|
+
/* 作者塞进部件里的图标与皮肤画的兜底字形同一把尺:md 档,随 data-size 换档 */
|
|
21
23
|
--xh-icon-size: var(--xh-diff-view-icon-size, var(--xh-glyph-size-md));
|
|
22
24
|
|
|
23
25
|
/* 尺寸缺省档:不写 data-size 时的取值。三档都只写这三个私有槽,
|
|
24
26
|
公开槽留在读处当首选,作者在祖先上设的覆盖才赢得过档位声明 */
|
|
25
|
-
--xh-_diff-view-font-size: var(--xh-control-font-
|
|
27
|
+
--xh-_diff-view-font-size: var(--xh-control-font-md);
|
|
26
28
|
--xh-_diff-view-px: var(--xh-space-3);
|
|
27
29
|
--xh-_diff-view-py: var(--xh-space-2);
|
|
28
30
|
|
|
@@ -126,7 +128,7 @@
|
|
|
126
128
|
|
|
127
129
|
/* 点开折叠格才露出来的那几行播一次入场;收起是硬切,不占一段退场窗口 */
|
|
128
130
|
[data-scope='diff-view'][data-part='row'][data-revealed] {
|
|
129
|
-
animation: xh-
|
|
131
|
+
animation: xh-drop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
130
132
|
}
|
|
131
133
|
|
|
132
134
|
/* 行号是画上去的不是写上去的:复制差异不带它,读屏也不逐行念数字 */
|
|
@@ -258,7 +260,7 @@
|
|
|
258
260
|
color: var(--xh-diff-view-punctuation-fg, var(--xh-fg-subtle));
|
|
259
261
|
}
|
|
260
262
|
|
|
261
|
-
/* 折起来的那一行:整行都是展开按钮。行是淡底承载面,向按钮下发 hover 200 → pressed 300
|
|
263
|
+
/* 折起来的那一行:整行都是展开按钮。行是淡底承载面,向按钮下发 hover 200 → pressed 300 */
|
|
262
264
|
[data-scope='diff-view'][data-part='gap'] {
|
|
263
265
|
--xh-action-host-bg-hover: var(--xh-bg-subtle-hover);
|
|
264
266
|
--xh-action-host-bg-pressed: var(--xh-bg-subtle-active);
|
|
@@ -276,7 +278,7 @@
|
|
|
276
278
|
}
|
|
277
279
|
|
|
278
280
|
/* 展开按钮铺满折叠格,盒型、悬停与按下面由 Action Control 的 disclosure-trigger 档给(ghost 形态,
|
|
279
|
-
|
|
281
|
+
按下只换面不缩放);这里只把使用者槽映射到桥接槽:圆角归零贴住格边、纵向内衬归零、
|
|
280
282
|
高度锚在代码行高上让折叠格与相邻代码行同高,字号跟着正文走 */
|
|
281
283
|
[data-scope='diff-view'][data-part='gap-trigger'] {
|
|
282
284
|
--xh-action-radius: 0;
|
|
@@ -341,6 +343,74 @@
|
|
|
341
343
|
mask: var(--xh-glyph-mark-warning) center / contain no-repeat;
|
|
342
344
|
}
|
|
343
345
|
|
|
346
|
+
/* 行评论:每格正文让出一列(一行高的正方格)给评论钮,没有钮的空侧也让,两侧代码才对得齐 */
|
|
347
|
+
[data-scope='diff-view'][data-part='root'][data-commentable] {
|
|
348
|
+
--xh-_diff-view-comment-col: var(--xh-diff-view-comment-col, var(--xh-diff-view-line-height, var(--xh-text-code-leading)));
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
[data-scope='diff-view'][data-part='root'][data-commentable] [data-part='line-content'] {
|
|
352
|
+
position: relative;
|
|
353
|
+
padding-inline-start: var(--xh-_diff-view-comment-col);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/* 评论钮接 Action Control icon 档、ghost 形态,边长压到一行高 */
|
|
357
|
+
[data-scope='diff-view'][data-part='comment-trigger'] {
|
|
358
|
+
--xh-action-visual-size: var(--xh-_diff-view-comment-col);
|
|
359
|
+
--xh-action-min-inline-size: var(--xh-_diff-view-comment-col);
|
|
360
|
+
--xh-action-radius: var(--xh-diff-view-comment-trigger-radius, var(--xh-shape-control));
|
|
361
|
+
--xh-action-fg-rest: var(--xh-diff-view-comment-trigger-fg, var(--xh-fg-muted));
|
|
362
|
+
--xh-icon-size: var(--xh-diff-view-comment-trigger-icon-size, var(--xh-glyph-size-sm));
|
|
363
|
+
|
|
364
|
+
position: absolute;
|
|
365
|
+
inset-block-start: 0;
|
|
366
|
+
inset-inline-start: 0;
|
|
367
|
+
block-size: var(--xh-_diff-view-comment-col);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
[data-scope='diff-view'][data-part='comment-trigger'][hidden] {
|
|
371
|
+
display: none;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
[data-scope='diff-view'][data-part='comment-trigger']::before {
|
|
375
|
+
content: '';
|
|
376
|
+
display: block;
|
|
377
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
378
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
379
|
+
background-color: currentColor;
|
|
380
|
+
-webkit-mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
|
|
381
|
+
mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/* 指针设备上平时透明(仍可聚焦),悬停到这一行或焦点进了视口才显出来;触屏上常显 */
|
|
385
|
+
@media (hover: hover) and (pointer: fine) {
|
|
386
|
+
[data-scope='diff-view'][data-part='comment-trigger'] {
|
|
387
|
+
--xh-action-opacity-rest: 0;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
[data-scope='diff-view'][data-part='row']:hover [data-part='comment-trigger'],
|
|
391
|
+
[data-scope='diff-view'][data-part='viewport']:focus-within [data-part='comment-trigger'] {
|
|
392
|
+
--xh-action-opacity-rest: 1;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/* 挂在正文格里、代码下方的评论:一张静态内容面,文字按正文排,不随代码的变更色 */
|
|
397
|
+
[data-scope='diff-view'][data-part='comment-thread'] {
|
|
398
|
+
display: block;
|
|
399
|
+
box-sizing: border-box;
|
|
400
|
+
max-inline-size: var(--xh-diff-view-comment-thread-max-w, var(--xh-measure-prose));
|
|
401
|
+
margin-block: var(--xh-diff-view-comment-thread-my, var(--xh-space-2));
|
|
402
|
+
padding: var(--xh-diff-view-comment-thread-p, var(--xh-space-3));
|
|
403
|
+
border: var(--xh-stroke-thin) solid var(--xh-diff-view-comment-thread-border, var(--xh-border-default));
|
|
404
|
+
border-radius: var(--xh-diff-view-comment-thread-radius, var(--xh-shape-surface));
|
|
405
|
+
background: var(--xh-diff-view-comment-thread-bg, var(--xh-bg-surface));
|
|
406
|
+
color: var(--xh-diff-view-comment-thread-fg, var(--xh-fg-default));
|
|
407
|
+
white-space: normal;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
[data-scope='diff-view'][data-part='comment-thread'][hidden] {
|
|
411
|
+
display: none;
|
|
412
|
+
}
|
|
413
|
+
|
|
344
414
|
/* 尺寸档改字号、内衬与图标档 */
|
|
345
415
|
[data-scope='diff-view'][data-part='root'][data-size='sm'] {
|
|
346
416
|
--xh-icon-size: var(--xh-diff-view-icon-size, var(--xh-glyph-size-sm));
|
|
@@ -409,20 +479,35 @@
|
|
|
409
479
|
outline: var(--xh-stroke-thick) dashed currentColor;
|
|
410
480
|
outline-offset: calc(-1 * var(--xh-stroke-thick));
|
|
411
481
|
}
|
|
482
|
+
|
|
483
|
+
/* 纸上按不了评论钮 */
|
|
484
|
+
[data-scope='diff-view'][data-part='comment-trigger'] {
|
|
485
|
+
display: none;
|
|
486
|
+
}
|
|
412
487
|
}
|
|
413
|
-
}
|
|
414
488
|
|
|
415
|
-
@
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
489
|
+
@media (forced-colors: active) {
|
|
490
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
491
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
492
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
493
|
+
落在 Canvas 面上的取 CanvasText;
|
|
494
|
+
禁用取 GrayText */
|
|
495
|
+
[data-scope='diff-view'][data-part='truncation']::before {
|
|
496
|
+
forced-color-adjust: none;
|
|
497
|
+
background-color: CanvasText;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
[data-scope='diff-view'][data-part='comment-trigger']::before {
|
|
501
|
+
forced-color-adjust: none;
|
|
502
|
+
background-color: ButtonText;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
[data-scope='diff-view'][data-part='comment-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed])::before {
|
|
506
|
+
background-color: HighlightText;
|
|
421
507
|
}
|
|
422
508
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
translate: 0 0;
|
|
509
|
+
[data-scope='diff-view'][data-part='comment-trigger'][data-disabled]::before {
|
|
510
|
+
background-color: GrayText;
|
|
426
511
|
}
|
|
427
512
|
}
|
|
428
513
|
}
|
package/css/download-trigger.css
CHANGED
|
@@ -5,28 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
/* 定义 download trigger 样式。 */
|
|
7
7
|
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
8
10
|
@import '../family/action-control.css';
|
|
9
|
-
|
|
10
|
-
@layer xihan.motion {
|
|
11
|
-
/* 转圈的关键帧定义在本文件里:引用别处文件的动画名时那份文件不一定在场,动画会静默不跑 */
|
|
12
|
-
@keyframes xh-download-trigger-rotate {
|
|
13
|
-
to {
|
|
14
|
-
rotate: 360deg;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
@keyframes xh-download-trigger-loading-reveal {
|
|
19
|
-
to {
|
|
20
|
-
opacity: 1;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
@keyframes xh-download-trigger-content-hide {
|
|
25
|
-
to {
|
|
26
|
-
color: transparent;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
11
|
+
@import '../family/loading-ring.css';
|
|
30
12
|
|
|
31
13
|
@layer xihan.components {
|
|
32
14
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -35,7 +17,7 @@
|
|
|
35
17
|
}
|
|
36
18
|
|
|
37
19
|
/*
|
|
38
|
-
*
|
|
20
|
+
* 触发器就是这一个原生按钮,是定尺的独立动作按钮:盒型、三档几何、四态面、0.97 按压与粗指针
|
|
39
21
|
* 命中区由家族配方按 data-xh-action-variant / -size 给出(缺省 subtle 由连接层显式投影,只有 solid 才品牌实心)。
|
|
40
22
|
* 这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射;
|
|
41
23
|
* 要换成品牌样式的作者改 --xh-download-trigger-* 这一族槽位,或直接写自己的类名。
|
|
@@ -57,7 +39,7 @@
|
|
|
57
39
|
--xh-action-border-pressed: var(--xh-download-trigger-border-hover, var(--xh-_action-variant-border-pressed));
|
|
58
40
|
--xh-action-border-focus-visible: var(--xh-download-trigger-border, var(--xh-_action-variant-border-focus-visible));
|
|
59
41
|
--xh-action-border-disabled: var(--xh-download-trigger-border-disabled, var(--xh-_action-variant-border-disabled));
|
|
60
|
-
/*
|
|
42
|
+
/* 矩阵各态无影(淡底与阴影互斥):solid 也不再悬停抬影,使用者槽仍可自行加 */
|
|
61
43
|
--xh-action-shadow-hover: var(--xh-download-trigger-shadow-hover, none);
|
|
62
44
|
--xh-action-radius: var(--xh-download-trigger-radius, var(--xh-shape-control));
|
|
63
45
|
--xh-action-visual-size: var(--xh-download-trigger-h, var(--xh-_action-profile-visual-size));
|
|
@@ -68,6 +50,10 @@
|
|
|
68
50
|
--xh-icon-size: var(--xh-download-trigger-icon-size, var(--xh-_action-profile-glyph-size));
|
|
69
51
|
/* 取数在途那枚圆环的颜色:字被 content-hide 关键帧压成透明,环不能跟着 currentColor 走,取加载态的前景 */
|
|
70
52
|
--xh-_download-trigger-loading-fg: var(--xh-download-trigger-loading-fg, var(--xh-download-trigger-fg, var(--xh-_action-variant-fg-loading)));
|
|
53
|
+
/* 取数在途的环由加载环配方压在钮正中(连接层投影 data-xh-loading-ring="overlay"),直径取钮的图标档;
|
|
54
|
+
起始边取钮在途时的真实前景,转速认使用者槽 */
|
|
55
|
+
--xh-_loading-ring-fg: var(--xh-_download-trigger-loading-fg);
|
|
56
|
+
--xh-_loading-ring-duration: var(--xh-download-trigger-loading-duration, var(--xh-motion-loop-spin));
|
|
71
57
|
|
|
72
58
|
/* safe:文案放不下时居中改成靠行首排,裁掉的是末尾那截,开头仍然读得到 */
|
|
73
59
|
justify-content: safe center;
|
|
@@ -92,9 +78,9 @@
|
|
|
92
78
|
}
|
|
93
79
|
|
|
94
80
|
/* 没写内容就由皮肤画兜底字形;作者往按钮里塞了文字或自己的图形,这几条即不命中。
|
|
95
|
-
字形另起一颗 ::after:::before
|
|
96
|
-
|
|
97
|
-
[data-scope='download-trigger'][data-part='root']:empty
|
|
81
|
+
字形另起一颗 ::after:::before 是加载环,mask 会把描边裁成字形轮廓、环就此消失。
|
|
82
|
+
字形取前景色:取数在途时随前景一起淡到透明,把位置让给环 */
|
|
83
|
+
[data-scope='download-trigger'][data-part='root']:empty::after {
|
|
98
84
|
content: '';
|
|
99
85
|
display: inline-block;
|
|
100
86
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
@@ -105,72 +91,33 @@
|
|
|
105
91
|
mask: var(--xh-glyph-mark-download) center / contain no-repeat;
|
|
106
92
|
}
|
|
107
93
|
|
|
108
|
-
/*
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
var(--xh-motion-duration-micro) forwards;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
[data-scope='download-trigger'][data-part='root'][aria-busy='true']::before {
|
|
116
|
-
content: '';
|
|
117
|
-
position: absolute;
|
|
118
|
-
inset: 0;
|
|
119
|
-
inline-size: 1em;
|
|
120
|
-
block-size: 1em;
|
|
121
|
-
margin: auto;
|
|
122
|
-
border: var(--xh-stroke-thin) solid transparent;
|
|
123
|
-
border-block-start-color: var(--xh-_download-trigger-loading-fg);
|
|
124
|
-
/* 正圆的加载环:正方盒取 circle(§6.3) */
|
|
125
|
-
border-radius: var(--xh-shape-circle);
|
|
126
|
-
opacity: 0;
|
|
127
|
-
animation:
|
|
128
|
-
xh-download-trigger-rotate var(--xh-download-trigger-loading-duration, var(--xh-spin-duration)) var(--xh-motion-ease-loop) infinite,
|
|
129
|
-
xh-download-trigger-loading-reveal var(--xh-motion-duration-micro) var(--xh-motion-ease-enter) var(--xh-motion-duration-micro) forwards;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
@media (prefers-reduced-motion: reduce) {
|
|
133
|
-
[data-scope='download-trigger'][data-part='root'][aria-busy='true'] {
|
|
134
|
-
color: transparent;
|
|
135
|
-
animation: none;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
[data-scope='download-trigger'][data-part='root'][aria-busy='true']::before {
|
|
139
|
-
border-style: dotted;
|
|
140
|
-
border-color: var(--xh-_download-trigger-loading-fg);
|
|
141
|
-
opacity: 1;
|
|
142
|
-
animation: none;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
:where([data-motion='reduce']) [data-scope='download-trigger'][data-part='root'][aria-busy='true'] {
|
|
147
|
-
color: transparent;
|
|
148
|
-
animation: none;
|
|
149
|
-
}
|
|
94
|
+
/* 取数在途:钮里原有的文字与字形随前景淡到透明留位,进入在途等一个 micro 才起淡(快速取数什么都不闪),
|
|
95
|
+
与环同一段等待;退出在途不等,按 micro 淡回。环的前景另由私有槽给,不跟着透明 */
|
|
96
|
+
[data-scope='download-trigger'][data-part='root'][data-loading] {
|
|
97
|
+
--xh-action-fg-loading: transparent;
|
|
150
98
|
|
|
151
|
-
|
|
152
|
-
border-style: dotted;
|
|
153
|
-
border-color: var(--xh-_download-trigger-loading-fg);
|
|
154
|
-
opacity: 1;
|
|
155
|
-
animation: none;
|
|
99
|
+
transition-delay: var(--xh-motion-duration-micro);
|
|
156
100
|
}
|
|
157
101
|
|
|
158
102
|
/* 手指落点:配方 text 档用 ::after 把块轴命中区扩到 44px;没写内容的按钮 ::after 已被兜底字形占着,
|
|
159
|
-
|
|
160
|
-
两颗伪元素轮着用。字形那条只写了尺寸与 mask,配方的定位、44px 下限与 -50% 平移会从同一个
|
|
103
|
+
这一档改用不在途时的 ::before 扩——取数在途时 ::before 是加载环,钮也按不动,不再需要热区。字形那条只写了尺寸与 mask,配方的定位、44px 下限与 -50% 平移会从同一个
|
|
161
104
|
::after 漏进来:字形被拎出行内流、盒撑到 44px 高,按钮随之收窄一格字形——这里逐项钉回 */
|
|
162
105
|
@media (pointer: coarse) {
|
|
163
|
-
[data-scope='download-trigger'][data-part='root']:empty
|
|
106
|
+
[data-scope='download-trigger'][data-part='root']:empty::after {
|
|
164
107
|
position: static;
|
|
165
108
|
min-block-size: 0;
|
|
166
109
|
translate: none;
|
|
167
110
|
}
|
|
168
111
|
|
|
169
|
-
|
|
112
|
+
/* 热区收下加载环的几何:环的描边不画、指针照接;退出在途时环在这一档直接收起,不留一圈放大的环淡出 */
|
|
113
|
+
[data-scope='download-trigger'][data-part='root']:empty:not([data-loading])::before {
|
|
170
114
|
content: '';
|
|
171
115
|
position: absolute;
|
|
172
|
-
|
|
173
|
-
|
|
116
|
+
border-color: transparent;
|
|
117
|
+
margin: 0;
|
|
118
|
+
pointer-events: auto;
|
|
119
|
+
inset-block: 50% auto;
|
|
120
|
+
inset-inline: 50% auto;
|
|
174
121
|
min-block-size: 44px;
|
|
175
122
|
inline-size: 100%;
|
|
176
123
|
block-size: 100%;
|
|
@@ -178,8 +125,27 @@
|
|
|
178
125
|
}
|
|
179
126
|
|
|
180
127
|
/* 与家族同一笔:起点是逻辑属性、平移是物理通道,rtl 下行内分量掉头,热区才落回按钮中心 */
|
|
181
|
-
[data-scope='download-trigger'][data-part='root']:empty:not([
|
|
128
|
+
[data-scope='download-trigger'][data-part='root']:empty:not([data-loading]):dir(rtl)::before {
|
|
182
129
|
translate: 50% -50%;
|
|
183
130
|
}
|
|
184
131
|
}
|
|
132
|
+
|
|
133
|
+
@media (forced-colors: active) {
|
|
134
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
135
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
136
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
137
|
+
禁用取 GrayText */
|
|
138
|
+
[data-scope='download-trigger'][data-part='root']:empty::after {
|
|
139
|
+
forced-color-adjust: none;
|
|
140
|
+
background-color: ButtonText;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
[data-scope='download-trigger'][data-part='root']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::after {
|
|
144
|
+
background-color: HighlightText;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
[data-scope='download-trigger'][data-part='root'][data-disabled]:empty::after {
|
|
148
|
+
background-color: GrayText;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
185
151
|
}
|