@xihan-ui/styles 2.1.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 +1227 -0
- package/README.md +6 -1
- package/component-tokens.d.ts +505 -96
- package/components.tokens.json +34636 -25846
- package/css/accordion.css +34 -8
- package/css/alert.css +59 -1
- package/css/anchor.css +46 -8
- package/css/approval.css +116 -76
- package/css/avatar-group.css +1 -1
- package/css/avatar.css +13 -5
- package/css/back-top.css +61 -42
- package/css/badge.css +62 -12
- package/css/bar-code.css +1 -1
- package/css/breadcrumb.css +62 -3
- package/css/button-group.css +4 -4
- package/css/button.css +67 -19
- package/css/calendar-picker.css +19 -0
- package/css/calendar-range-picker.css +39 -2
- package/css/card.css +115 -1
- package/css/carousel.css +148 -43
- package/css/cartesian-chart.css +830 -0
- package/css/cascader.css +181 -65
- package/css/checkbox-group.css +59 -89
- package/css/checkbox.css +16 -49
- package/css/citation.css +470 -0
- package/css/clipboard.css +20 -63
- package/css/code-view.css +101 -6
- package/css/collapsible.css +34 -8
- package/css/color-field.css +18 -0
- package/css/color-picker.css +55 -58
- package/css/color-slider.css +22 -15
- package/css/color-swatch-picker.css +3 -1
- package/css/combobox.css +80 -33
- package/css/command.css +45 -43
- package/css/context-menu.css +39 -22
- package/css/date-field.css +23 -0
- package/css/date-picker.css +57 -22
- package/css/date-range-picker.css +301 -12
- package/css/description.css +17 -1
- package/css/descriptions.css +42 -0
- package/css/dialog.css +94 -36
- package/css/diff-view.css +97 -12
- package/css/download-trigger.css +44 -78
- package/css/drawer.css +160 -119
- package/css/editable.css +19 -0
- package/css/empty-state.css +7 -6
- package/css/field-array.css +36 -0
- package/css/field.css +16 -18
- package/css/file-upload.css +125 -135
- package/css/flex.css +324 -8
- package/css/float-button.css +165 -38
- package/css/floating-panel.css +53 -19
- package/css/form.css +23 -17
- package/css/funnel-chart.css +106 -0
- package/css/graph-chart.css +205 -0
- package/css/grid-list.css +235 -0
- package/css/grid.css +252 -1
- package/css/heatmap.css +119 -36
- package/css/hierarchy-chart.css +298 -0
- package/css/hover-card.css +31 -14
- package/css/icon.css +100 -0
- package/css/image-cropper.css +33 -7
- package/css/image-viewer.css +167 -22
- package/css/image.css +23 -4
- package/css/input-group.css +11 -13
- package/css/json-viewer.css +50 -2
- package/css/layout.css +68 -18
- package/css/liquid.css +106 -0
- package/css/list.css +1 -1
- package/css/listbox.css +46 -6
- package/css/loading-bar.css +27 -13
- package/css/log.css +129 -33
- package/css/markdown-stream.css +1 -1
- package/css/marquee.css +163 -7
- package/css/matrix-code.css +1 -1
- package/css/mention.css +35 -19
- package/css/menu.css +35 -21
- package/css/menubar.css +36 -20
- package/css/message-feed.css +172 -51
- package/css/navigation-menu.css +172 -11
- package/css/notification.css +429 -108
- package/css/number-field.css +22 -0
- package/css/page-header.css +3 -1
- package/css/pagination.css +126 -24
- package/css/password-input.css +40 -8
- package/css/pie-chart.css +247 -0
- package/css/popconfirm.css +44 -50
- package/css/popover.css +50 -14
- package/css/progress.css +308 -10
- package/css/prompt-input.css +36 -0
- package/css/question-flow.css +97 -57
- package/css/radar-chart.css +233 -0
- package/css/radio-group.css +363 -5
- package/css/rating.css +21 -23
- package/css/reasoning.css +61 -54
- package/css/resizable.css +6 -1
- package/css/sankey-chart.css +174 -0
- package/css/scroll-area.css +32 -0
- package/css/scrollbar.css +1 -1
- package/css/select.css +74 -55
- package/css/side-nav.css +173 -24
- package/css/signature-pad.css +16 -1
- package/css/skeleton.css +13 -14
- package/css/slider.css +35 -13
- package/css/sortable.css +37 -7
- package/css/sparkline.css +164 -0
- package/css/spinner.css +50 -22
- package/css/splitter.css +7 -1
- package/css/statistic.css +10 -0
- package/css/steps.css +248 -29
- package/css/switch.css +23 -48
- package/css/table.css +158 -118
- package/css/tabs.css +231 -19
- package/css/tag-group.css +27 -3
- package/css/tag.css +53 -12
- package/css/tags-input.css +40 -3
- package/css/text-field.css +19 -0
- package/css/time-field.css +20 -1
- package/css/time-picker.css +44 -15
- package/css/time-range-picker.css +45 -16
- package/css/timeline.css +1 -1
- package/css/toggle-group.css +4 -4
- package/css/toggle.css +4 -3
- package/css/tool-call.css +59 -51
- package/css/toolbar.css +101 -3
- package/css/tooltip.css +15 -2
- package/css/tour.css +42 -12
- package/css/transfer.css +98 -75
- package/css/tree-select.css +232 -53
- package/css/tree.css +201 -55
- package/css/truncate.css +55 -12
- package/css/typography.css +93 -0
- package/css/virtualizer.css +56 -0
- package/css/watermark.css +23 -0
- package/family/action-control.css +14 -5
- package/family/chart.css +480 -0
- package/family/check-mark.css +94 -0
- package/family/choice-card.css +97 -0
- package/family/collection-item.css +9 -15
- package/family/field-chrome.css +1 -12
- package/family/loading-ring.css +95 -0
- package/family/material.css +72 -0
- package/family/menu-choice.css +56 -0
- package/family/motion.css +207 -10
- package/family/tag-list.css +59 -0
- package/index.css +22997 -13678
- package/index.unlayered.css +12928 -3605
- package/package.json +20 -8
- package/css/gradient-text.css +0 -91
- package/css/icon-wrapper.css +0 -81
- package/css/segmented.css +0 -280
- package/css/toast.css +0 -499
package/css/heatmap.css
CHANGED
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
|
|
6
6
|
/* 定义 heatmap 样式。 */
|
|
7
7
|
|
|
8
|
+
/* 详情条与对照条走 Chart 家族配方:与其余图表的提示框、图例同一副外观。本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/chart.css';
|
|
10
|
+
|
|
8
11
|
@layer xihan.components {
|
|
9
12
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
10
13
|
[data-scope='heatmap'] {
|
|
@@ -34,8 +37,9 @@
|
|
|
34
37
|
改写这个槽为一个看得见的颜色(`var(--xh-heatmap-label-fg, var(--xh-fg-subtle))`)即七行全画。
|
|
35
38
|
周首日是星期一时留下的是二 / 四 / 六,是星期日时留下的是一 / 三 / 五 */
|
|
36
39
|
--xh-_heatmap-week-day-skip: var(--xh-heatmap-week-day-skip, transparent);
|
|
37
|
-
/* 色阶的两端:0 档的空格底与满档的实心底。没写 data-tone 也没写 data-palette
|
|
38
|
-
|
|
40
|
+
/* 色阶的两端:0 档的空格底与满档的实心底。没写 data-tone 也没写 data-palette 时就是这里的取值。
|
|
41
|
+
空格底取淡底的不透明档:中间各档由两端按比例兑出,一端半透明,整条色阶都会跟着半透明、偏色 */
|
|
42
|
+
--xh-_heatmap-empty: var(--xh-heatmap-empty, var(--xh-bg-subtle-opaque));
|
|
39
43
|
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-bg-brand));
|
|
40
44
|
/* 钉住的行首那一列自带的底色:格子从它下面滚过去时不能透出来。
|
|
41
45
|
整块摆在别的底色上(卡片、分区)时改写 --xh-heatmap-bg,否则那一列会是一块补丁 */
|
|
@@ -68,36 +72,65 @@
|
|
|
68
72
|
}
|
|
69
73
|
|
|
70
74
|
/* —— 色板 —— */
|
|
71
|
-
/*
|
|
72
|
-
|
|
75
|
+
/* 直接按颜色点名,定的是满档那一端的实心底:取基础色板里同名色相的 600 档;0 档的空格底与中间各档的兑法一概不动。
|
|
76
|
+
基础色板同一档跨色相同一明度,十二个色相摊出来的五档深浅一致,换色板不换可读性。
|
|
77
|
+
这几条规则与上面那条语气规则同特指度,排在它之后:两个都写时色板赢——
|
|
73
78
|
色板指名了一个具体颜色,语气只是推得出一个颜色,指名的那个更具体。
|
|
74
79
|
取值一律逐值写死原语、不经 --xh-_tone:那一族槽位是语气层的派生结果,
|
|
75
80
|
色板借道它就会连带把语气的悬停 / 淡底 / 前景一起绑进来,也会被祖先的 data-tone 染色。
|
|
76
|
-
|
|
81
|
+
色板拼错取值时一条都不命中,落回上面两条,与没写一样 */
|
|
82
|
+
[data-scope='heatmap'][data-part='root'][data-palette='red'] {
|
|
83
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-red-600));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
[data-scope='heatmap'][data-part='root'][data-palette='orange'] {
|
|
87
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-orange-600));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
[data-scope='heatmap'][data-part='root'][data-palette='amber'] {
|
|
91
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-amber-600));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
[data-scope='heatmap'][data-part='root'][data-palette='yellow'] {
|
|
95
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-yellow-600));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
[data-scope='heatmap'][data-part='root'][data-palette='lime'] {
|
|
99
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-lime-600));
|
|
100
|
+
}
|
|
101
|
+
|
|
77
102
|
[data-scope='heatmap'][data-part='root'][data-palette='green'] {
|
|
78
|
-
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-
|
|
103
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-green-600));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
[data-scope='heatmap'][data-part='root'][data-palette='teal'] {
|
|
107
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-teal-600));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
[data-scope='heatmap'][data-part='root'][data-palette='cyan'] {
|
|
111
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-cyan-600));
|
|
79
112
|
}
|
|
80
113
|
|
|
81
114
|
[data-scope='heatmap'][data-part='root'][data-palette='blue'] {
|
|
82
|
-
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-
|
|
115
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-blue-600));
|
|
83
116
|
}
|
|
84
117
|
|
|
85
|
-
[data-scope='heatmap'][data-part='root'][data-palette='
|
|
86
|
-
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-
|
|
118
|
+
[data-scope='heatmap'][data-part='root'][data-palette='indigo'] {
|
|
119
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-indigo-600));
|
|
87
120
|
}
|
|
88
121
|
|
|
89
122
|
[data-scope='heatmap'][data-part='root'][data-palette='purple'] {
|
|
90
123
|
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-purple-600));
|
|
91
124
|
}
|
|
92
125
|
|
|
93
|
-
[data-scope='heatmap'][data-part='root'][data-palette='
|
|
94
|
-
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-
|
|
126
|
+
[data-scope='heatmap'][data-part='root'][data-palette='pink'] {
|
|
127
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-pink-600));
|
|
95
128
|
}
|
|
96
129
|
|
|
97
|
-
/*
|
|
130
|
+
/* 灰是唯一按主题换档的一族:十二个色相的 600 档明度都是 0.546,
|
|
98
131
|
深色态的空格底(neutral-800,明度 0.269)离得够远;中性 600 档只有 0.439,
|
|
99
132
|
五档摊下来每档只差 0.0425、相邻两档对比度 1.16–1.20,等于看不出分档。
|
|
100
|
-
深色态改取 neutral-450(明度 0.65),步长回到 0.095、相邻两档 1.42–1.50
|
|
133
|
+
深色态改取 neutral-450(明度 0.65),步长回到 0.095、相邻两档 1.42–1.50,不输彩色族。
|
|
101
134
|
不取更亮的 neutral-400:高对比档的 border-default 正是那一档,满档格子的描边会与底色同色。
|
|
102
135
|
data-theme 写在自己身上还是写在祖先上都算,两种用法都成立 */
|
|
103
136
|
[data-scope='heatmap'][data-part='root'][data-palette='gray'] {
|
|
@@ -108,6 +141,23 @@
|
|
|
108
141
|
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-neutral-450));
|
|
109
142
|
}
|
|
110
143
|
|
|
144
|
+
/* —— 发散色阶 ——
|
|
145
|
+
以中点为界两侧各自加深:中点那一格是数据色的中性中点,低于中点兑向负向色、高于中点兑向正向色。
|
|
146
|
+
三色都取数据色的发散三色,语气与色板在这一档不生效。中点是没有色相的中性色,兑色走 oklab
|
|
147
|
+
(格子的基础规则已是 in oklab),oklch 会绕着色相环走出一段杂色 */
|
|
148
|
+
[data-scope='heatmap'][data-part='root'][data-scale='diverging'] {
|
|
149
|
+
--xh-_heatmap-empty: var(--xh-heatmap-diverging-center, var(--xh-chart-diverging-center));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* 两侧的墨色写在格子上而不是根上:根上的语气与色板规则(含暗色的中性色板)不论权重多高都盖不到这里 */
|
|
153
|
+
[data-scope='heatmap'][data-part='root'][data-scale='diverging'] :is([data-scope='heatmap'][data-part='cell'], [data-scope='heatmap'][data-part='legend-item'])[data-polarity='negative'] {
|
|
154
|
+
--xh-_heatmap-ink: var(--xh-heatmap-diverging-negative, var(--xh-chart-diverging-negative));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
[data-scope='heatmap'][data-part='root'][data-scale='diverging'] :is([data-scope='heatmap'][data-part='cell'], [data-scope='heatmap'][data-part='legend-item'])[data-polarity='positive'] {
|
|
158
|
+
--xh-_heatmap-ink: var(--xh-heatmap-diverging-positive, var(--xh-chart-diverging-positive));
|
|
159
|
+
}
|
|
160
|
+
|
|
111
161
|
/* —— 尺寸 —— */
|
|
112
162
|
/* 缺省的 md 档写在上面的基础规则里 */
|
|
113
163
|
[data-scope='heatmap'][data-part='root'][data-size='sm'] {
|
|
@@ -209,7 +259,28 @@
|
|
|
209
259
|
/* 空格与浅档在浅色底上几乎没有边界,描一圈极淡的线把方格勾出来。
|
|
210
260
|
这一档不能取 border-subtle:它与空格底色 bg-subtle 是同一个原色,描了等于没描 */
|
|
211
261
|
box-shadow: inset 0 0 0 var(--xh-stroke-thin) var(--xh-heatmap-cell-border, var(--xh-border-default));
|
|
212
|
-
transition:
|
|
262
|
+
transition: box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* 详情条正在说的那一格(指针停着或焦点落着)描一圈正文色的粗线:扫过一片格子时看得出条说的是哪一格 */
|
|
266
|
+
[data-scope='heatmap'][data-part='cell'][data-highlighted] {
|
|
267
|
+
box-shadow: inset 0 0 0 var(--xh-stroke-thick) var(--xh-heatmap-cell-border-highlighted, var(--xh-fg-default));
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* 首次出现:有颜色的格子从空格底色填到自己的档位色,按日期(矩阵按列)的先后扫过去。
|
|
271
|
+
连接层写入这一格在扫描里的位置,乘上扫描时长就是它开始填色的延迟;
|
|
272
|
+
减弱动效下扫描时长归零,各格一起淡变填色 */
|
|
273
|
+
[data-scope='heatmap'][data-part='cell'][data-drawing] {
|
|
274
|
+
animation: xh-heatmap-fill var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) both;
|
|
275
|
+
animation-delay: calc(var(--xh-motion-duration-reveal) * var(--xh-_chart-reveal-at));
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/* 数据变化后的换色:各格从旧档的颜色过渡到新档。只在连接层标出的这一段过渡,
|
|
279
|
+
主题与语气的换色照常一步到位,不被数据的时长拖慢 */
|
|
280
|
+
[data-scope='heatmap'][data-part='root'][data-animating] [data-scope='heatmap'][data-part='cell'] {
|
|
281
|
+
transition:
|
|
282
|
+
background-color var(--xh-motion-duration-morph) var(--xh-motion-ease-continuous),
|
|
283
|
+
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
213
284
|
}
|
|
214
285
|
|
|
215
286
|
/* 错列打在本行第一个格子上:打在行上会连行首的星期名一起往后推,
|
|
@@ -320,22 +391,21 @@
|
|
|
320
391
|
/* 至少与格子同宽,一两个字的详情也不会瘦成一条 */
|
|
321
392
|
min-inline-size: var(--xh-_heatmap-tip-w);
|
|
322
393
|
max-inline-size: var(--xh-heatmap-tooltip-max-w, var(--xh-overlay-max-w));
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
394
|
+
/* 配方按物理左缘与平移落位,详情条自己按格子的逻辑缘落位:把配方那两处让开 */
|
|
395
|
+
translate: none;
|
|
396
|
+
/* 材质、圆角、内边距与影走配方:frosted、overlay 圆角、正文排版,不反白 */
|
|
397
|
+
--xh-_chart-tip-x: auto;
|
|
398
|
+
--xh-_chart-tooltip-gap: var(--xh-space-1);
|
|
399
|
+
--xh-_chart-tooltip-py: var(--xh-heatmap-tooltip-py, var(--xh-surface-pad-sm));
|
|
400
|
+
--xh-_chart-tooltip-px: var(--xh-heatmap-tooltip-px, var(--xh-surface-pad-sm));
|
|
401
|
+
--xh-_chart-tooltip-radius: var(--xh-heatmap-tooltip-radius, var(--xh-shape-overlay));
|
|
402
|
+
--xh-_chart-tooltip-shadow: var(--xh-heatmap-tooltip-shadow, var(--xh-material-frosted-shadow));
|
|
403
|
+
/* 作者覆盖的底、字与描边压在配方的材质上:只换颜色那一层,顶部的边界光与模糊照旧 */
|
|
404
|
+
border-color: var(--xh-heatmap-tooltip-border, var(--xh-material-frosted-border));
|
|
405
|
+
background-color: var(--xh-heatmap-tooltip-bg, var(--xh-material-frosted-bg));
|
|
406
|
+
color: var(--xh-heatmap-tooltip-fg, var(--xh-material-frosted-fg));
|
|
407
|
+
font-size: var(--xh-heatmap-tooltip-font-size, var(--xh-text-body-size));
|
|
333
408
|
line-height: var(--xh-leading-normal);
|
|
334
|
-
white-space: nowrap;
|
|
335
|
-
box-shadow: var(--xh-heatmap-tooltip-shadow, var(--xh-material-frosted-compact-shadow));
|
|
336
|
-
/* 详情条不接指针:压在格子上时指针要能穿过去,否则一进条里就算离开了格子,
|
|
337
|
-
详情自己把自己收起来,来回闪 */
|
|
338
|
-
pointer-events: none;
|
|
339
409
|
}
|
|
340
410
|
|
|
341
411
|
/* 从格子的末缘往回长:条比一格宽得多,格子后面的地方比前面少时往后长会伸出滚动容器被裁掉,
|
|
@@ -360,10 +430,13 @@
|
|
|
360
430
|
inset-block-end: calc(100% - var(--xh-_heatmap-tip-y) + var(--xh-_heatmap-gap));
|
|
361
431
|
}
|
|
362
432
|
|
|
433
|
+
/* 对照条的排布走配方,间距由配方的私有槽给出;色阶是一条连续的尺,不折行:
|
|
434
|
+
「少」、一排色块、「多」断开就读不出哪端表示多 */
|
|
363
435
|
[data-scope='heatmap'][data-part='legend'] {
|
|
364
|
-
|
|
436
|
+
--xh-_chart-legend-gap: var(--xh-heatmap-legend-gap, var(--xh-_heatmap-gap));
|
|
437
|
+
|
|
438
|
+
flex-wrap: nowrap;
|
|
365
439
|
align-items: center;
|
|
366
|
-
gap: var(--xh-heatmap-legend-gap, var(--xh-_heatmap-gap));
|
|
367
440
|
color: var(--xh-heatmap-label-fg, var(--xh-fg-subtle));
|
|
368
441
|
}
|
|
369
442
|
|
|
@@ -390,11 +463,6 @@
|
|
|
390
463
|
box-shadow: inset 0 0 0 var(--xh-stroke-thin) var(--xh-heatmap-cell-border, var(--xh-border-default));
|
|
391
464
|
}
|
|
392
465
|
|
|
393
|
-
/* 详情条的收起态:没有哪一格是活的时候整条藏起来 */
|
|
394
|
-
[data-scope='heatmap'][data-part='tooltip'][data-state='hidden'] {
|
|
395
|
-
display: none;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
466
|
/* 给了 display 的角色节点必须补这条:display 声明会盖掉 UA 的 [hidden]{display:none},
|
|
399
467
|
不补的话作者给节点加 hidden 后它照样显示。
|
|
400
468
|
格子没有声明 display,UA 那条兜得住,不必列在这里 */
|
|
@@ -451,6 +519,12 @@
|
|
|
451
519
|
[data-scope='heatmap'][data-part='legend-item'][data-level='3'] {
|
|
452
520
|
--xh-_heatmap-ink-ring: calc(var(--xh-_heatmap-cell-size) * 0.4);
|
|
453
521
|
}
|
|
522
|
+
|
|
523
|
+
/* 发散色阶两侧同档的环一样粗,纸上分不出正负:负向一侧改用点线,点线在任何粗细下都认得出 */
|
|
524
|
+
[data-scope='heatmap'][data-part='cell'][data-polarity='negative'],
|
|
525
|
+
[data-scope='heatmap'][data-part='legend-item'][data-polarity='negative'] {
|
|
526
|
+
border-style: dotted;
|
|
527
|
+
}
|
|
454
528
|
}
|
|
455
529
|
|
|
456
530
|
/*
|
|
@@ -467,3 +541,12 @@
|
|
|
467
541
|
}
|
|
468
542
|
}
|
|
469
543
|
}
|
|
544
|
+
|
|
545
|
+
@layer xihan.motion {
|
|
546
|
+
/* 只写起点:终点是格子自己的档位色,作者改写 --xh-heatmap-cell-bg 时同样成立 */
|
|
547
|
+
@keyframes xh-heatmap-fill {
|
|
548
|
+
from {
|
|
549
|
+
background-color: var(--xh-_heatmap-empty);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
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
|
+
/* 定义 hierarchy chart 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 标题、图例容器、视口、提示框、空态、焦点环与顺序色阶走 Chart 家族配方;下钻路径的项归 Collection Item 导航当前(nav 语境),
|
|
9
|
+
面、字色、字重与按压时间线由家族配方给,本皮肤只映射桥接槽。两份都 @import,单独引入仍成立。 */
|
|
10
|
+
@import '../family/motion.css';
|
|
11
|
+
@import '../family/chart.css';
|
|
12
|
+
@import '../family/loading-ring.css';
|
|
13
|
+
@import '../family/collection-item.css';
|
|
14
|
+
|
|
15
|
+
@layer xihan.components {
|
|
16
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
17
|
+
[data-scope='hierarchy-chart'] {
|
|
18
|
+
--xh-hierarchy-chart-skin: 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* 几何要用的像素值以这里的私有槽为真源:机器挂载后从计算样式读它们,作者覆盖组件槽即改变几何 */
|
|
22
|
+
[data-scope='hierarchy-chart'][data-part='root'] {
|
|
23
|
+
--xh-_chart-metric-bar-max: var(--xh-chart-bar-max);
|
|
24
|
+
--xh-_chart-metric-gap: var(--xh-hierarchy-chart-node-gap, var(--xh-chart-gap));
|
|
25
|
+
--xh-_chart-metric-line-width: var(--xh-chart-line-width);
|
|
26
|
+
--xh-_chart-metric-point-size: var(--xh-chart-point-size);
|
|
27
|
+
--xh-_chart-metric-hit-min: var(--xh-chart-hit-min);
|
|
28
|
+
--xh-_chart-metric-tick-length: var(--xh-chart-tick-length);
|
|
29
|
+
--xh-_chart-metric-label-gap: var(--xh-chart-label-gap);
|
|
30
|
+
--xh-_chart-metric-radius: var(--xh-hierarchy-chart-node-radius, var(--xh-shape-inset));
|
|
31
|
+
--xh-_chart-metric-font-size: var(--xh-text-caption-size);
|
|
32
|
+
--xh-_chart-metric-leading: var(--xh-leading-tight);
|
|
33
|
+
--xh-_chart-gap: var(--xh-hierarchy-chart-gap, var(--xh-space-3));
|
|
34
|
+
/* 路径上的尖角与作者塞进来的图标跟着路径的字号档走 */
|
|
35
|
+
--xh-icon-size: var(--xh-hierarchy-chart-icon-size, var(--xh-glyph-size-sm));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* —— 家族配方的组件槽:标题、视口、提示框与空态由 family/chart.css 画,本图表的覆盖槽写在
|
|
39
|
+
对应部件上接进配方的私有槽,作者在部件或它的祖先上覆盖都生效 —— */
|
|
40
|
+
[data-scope='hierarchy-chart'][data-part='viewport'] {
|
|
41
|
+
--xh-_chart-height: var(--xh-hierarchy-chart-height, var(--xh-chart-height));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
[data-scope='hierarchy-chart'][data-part='legend'] {
|
|
45
|
+
--xh-_chart-legend-gap: var(--xh-hierarchy-chart-legend-gap, var(--xh-space-4));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
[data-scope='hierarchy-chart'][data-part='tooltip'] {
|
|
49
|
+
--xh-_chart-tooltip-gap: var(--xh-hierarchy-chart-tooltip-gap, var(--xh-space-1));
|
|
50
|
+
--xh-_chart-tooltip-py: var(--xh-hierarchy-chart-tooltip-py, var(--xh-surface-pad-sm));
|
|
51
|
+
--xh-_chart-tooltip-px: var(--xh-hierarchy-chart-tooltip-px, var(--xh-surface-pad-sm));
|
|
52
|
+
--xh-_chart-tooltip-radius: var(--xh-hierarchy-chart-tooltip-radius, var(--xh-shape-overlay));
|
|
53
|
+
--xh-_chart-tooltip-shadow: var(--xh-hierarchy-chart-tooltip-shadow, var(--xh-material-frosted-shadow));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
[data-scope='hierarchy-chart'][data-part='tooltip-row'] {
|
|
57
|
+
--xh-_chart-tooltip-row-gap: var(--xh-hierarchy-chart-tooltip-row-gap, var(--xh-space-2));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[data-scope='hierarchy-chart'][data-part='tooltip-swatch'] {
|
|
61
|
+
--xh-_chart-tooltip-swatch-radius: var(--xh-hierarchy-chart-tooltip-swatch-radius, var(--xh-shape-inset));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
[data-scope='hierarchy-chart'][data-part='empty'][data-state='loading'] {
|
|
65
|
+
--xh-_chart-empty-gap: var(--xh-hierarchy-chart-empty-gap, var(--xh-space-2));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* —— 下钻路径:一行按钮,项与项之间画一个向前的尖角。尖角画在项的外面、不接指针,按钮的命中区只是自己的名字 —— */
|
|
69
|
+
[data-scope='hierarchy-chart'][data-part='path'] {
|
|
70
|
+
display: flex;
|
|
71
|
+
flex-wrap: wrap;
|
|
72
|
+
align-items: center;
|
|
73
|
+
column-gap: var(--xh-hierarchy-chart-path-column-gap, calc(var(--xh-icon-size, var(--xh-glyph-size-sm)) + var(--xh-space-1) * 2));
|
|
74
|
+
row-gap: var(--xh-hierarchy-chart-path-row-gap, var(--xh-space-1));
|
|
75
|
+
font-size: var(--xh-hierarchy-chart-path-font-size, var(--xh-control-font-sm));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
[data-scope='hierarchy-chart'][data-part='path'][hidden] {
|
|
79
|
+
display: none;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* 项的几何、字号与面全经家族桥接槽:静息 muted,悬停换面,当前的根由连接层投影 data-xh-collection-terminal,
|
|
83
|
+
走家族的 terminal 态(不响应悬停与按下)。本条 (0,2,0) 压过家族基础块 (0,1,0),不能再写 color / background */
|
|
84
|
+
[data-scope='hierarchy-chart'][data-part='path-item'] {
|
|
85
|
+
--xh-collection-block-padding: var(--xh-space-0);
|
|
86
|
+
--xh-collection-inline-padding: var(--xh-hierarchy-chart-path-item-px, var(--xh-space-1));
|
|
87
|
+
--xh-collection-radius: var(--xh-hierarchy-chart-path-item-radius, var(--xh-shape-control));
|
|
88
|
+
--xh-collection-font-size: var(--xh-hierarchy-chart-path-font-size, var(--xh-control-font-sm));
|
|
89
|
+
--xh-collection-fg-rest: var(--xh-hierarchy-chart-path-fg, var(--xh-fg-muted));
|
|
90
|
+
--xh-collection-bg-hover: var(--xh-hierarchy-chart-path-item-bg-hover, var(--xh-bg-subtle));
|
|
91
|
+
--xh-collection-fg-hover: var(--xh-hierarchy-chart-path-item-fg-hover, var(--xh-fg-default));
|
|
92
|
+
--xh-collection-bg-pressed: var(--xh-hierarchy-chart-path-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
93
|
+
--xh-collection-fg-terminal: var(--xh-hierarchy-chart-path-item-fg-current, var(--xh-fg-default));
|
|
94
|
+
--xh-collection-font-weight-terminal: var(--xh-hierarchy-chart-path-item-font-weight-current, var(--xh-font-weight-medium));
|
|
95
|
+
|
|
96
|
+
/* 不裁溢出:尖角画在项的盒子外面。名字长时整条路径折行,不截断 */
|
|
97
|
+
position: relative;
|
|
98
|
+
display: inline-flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
margin: 0;
|
|
101
|
+
border: none;
|
|
102
|
+
font-family: inherit;
|
|
103
|
+
line-height: var(--xh-leading-tight);
|
|
104
|
+
white-space: nowrap;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
[data-scope='hierarchy-chart'][data-part='path-item'] + [data-scope='hierarchy-chart'][data-part='path-item']::before {
|
|
108
|
+
content: '';
|
|
109
|
+
position: absolute;
|
|
110
|
+
inset-block: 0;
|
|
111
|
+
inset-inline-end: calc(100% + var(--xh-space-1));
|
|
112
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
113
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
114
|
+
margin-block: auto;
|
|
115
|
+
background-color: var(--xh-hierarchy-chart-path-separator-fg, var(--xh-fg-subtle));
|
|
116
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
117
|
+
mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
|
|
118
|
+
pointer-events: none;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
[data-scope='hierarchy-chart'][data-part='path-item'][hidden] {
|
|
122
|
+
display: none;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* 从右往左排版时「向前」在左边 */
|
|
126
|
+
[dir='rtl'] [data-scope='hierarchy-chart'][data-part='path-item']::before {
|
|
127
|
+
rotate: 180deg;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* —— 色槽:第一层分支各取一个分类色,后代继承;作者可以在节点上覆盖 --xh-hierarchy-chart-series-color。
|
|
131
|
+
节点、名字与提示框的色标都带着色槽,各自从这里取系列色与配对的前景色 —— */
|
|
132
|
+
[data-scope='hierarchy-chart'][data-xh-chart-slot='1'] {
|
|
133
|
+
--xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-1));
|
|
134
|
+
--xh-_chart-on-series: var(--xh-chart-on-categorical-1);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
[data-scope='hierarchy-chart'][data-xh-chart-slot='2'] {
|
|
138
|
+
--xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-2));
|
|
139
|
+
--xh-_chart-on-series: var(--xh-chart-on-categorical-2);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
[data-scope='hierarchy-chart'][data-xh-chart-slot='3'] {
|
|
143
|
+
--xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-3));
|
|
144
|
+
--xh-_chart-on-series: var(--xh-chart-on-categorical-3);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
[data-scope='hierarchy-chart'][data-xh-chart-slot='4'] {
|
|
148
|
+
--xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-4));
|
|
149
|
+
--xh-_chart-on-series: var(--xh-chart-on-categorical-4);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
[data-scope='hierarchy-chart'][data-xh-chart-slot='5'] {
|
|
153
|
+
--xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-5));
|
|
154
|
+
--xh-_chart-on-series: var(--xh-chart-on-categorical-5);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
[data-scope='hierarchy-chart'][data-xh-chart-slot='6'] {
|
|
158
|
+
--xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-6));
|
|
159
|
+
--xh-_chart-on-series: var(--xh-chart-on-categorical-6);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
[data-scope='hierarchy-chart'][data-xh-chart-slot='7'] {
|
|
163
|
+
--xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-7));
|
|
164
|
+
--xh-_chart-on-series: var(--xh-chart-on-categorical-7);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
[data-scope='hierarchy-chart'][data-xh-chart-slot='8'] {
|
|
168
|
+
--xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-8));
|
|
169
|
+
--xh-_chart-on-series: var(--xh-chart-on-categorical-8);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* —— 节点:第一层取满色,往下每层向承载面混色变浅;名字的前景随之换:满色上取配对的前景色,
|
|
173
|
+
浅色上取正文色。连接层写的层按当前的根数,下钻之后看得见的第一层照样是满色 —— */
|
|
174
|
+
[data-scope='hierarchy-chart'][data-part='node'],
|
|
175
|
+
[data-scope='hierarchy-chart'][data-part='node-label'],
|
|
176
|
+
[data-scope='hierarchy-chart'][data-part='group-header'] {
|
|
177
|
+
--xh-_hierarchy-mix: 100%;
|
|
178
|
+
--xh-_hierarchy-ink: var(--xh-_chart-on-series);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
[data-scope='hierarchy-chart'][data-level='2'] {
|
|
182
|
+
--xh-_hierarchy-mix: 48%;
|
|
183
|
+
--xh-_hierarchy-ink: var(--xh-fg-default);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
[data-scope='hierarchy-chart'][data-level='3'] {
|
|
187
|
+
--xh-_hierarchy-mix: 32%;
|
|
188
|
+
--xh-_hierarchy-ink: var(--xh-fg-default);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
[data-scope='hierarchy-chart'][data-level='4'] {
|
|
192
|
+
--xh-_hierarchy-mix: 22%;
|
|
193
|
+
--xh-_hierarchy-ink: var(--xh-fg-default);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* 相邻节点之间的间隙由几何留出,不画描边;指着一个节点时不在同一条祖孙链上的节点淡出,被指着的不位移 */
|
|
197
|
+
[data-scope='hierarchy-chart'][data-part='node'] {
|
|
198
|
+
--xh-_hierarchy-fill: color-mix(in oklab, var(--xh-_chart-series) var(--xh-_hierarchy-mix), var(--xh-chart-surface));
|
|
199
|
+
|
|
200
|
+
fill: var(--xh-_hierarchy-fill);
|
|
201
|
+
stroke: none;
|
|
202
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/* 有子节点的节点点下去是下钻 */
|
|
206
|
+
[data-scope='hierarchy-chart'][data-part='node'][aria-expanded] {
|
|
207
|
+
cursor: pointer;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/* 按值着色:颜色由 Chart 家族配方按段号与段内百分比兑好放在私有槽里,不再按层变浅。色阶的起点贴着承载面、
|
|
211
|
+
终点远离承载面:浅的一段写正文色,深的一段写承载面色,亮暗主题下都读得清 */
|
|
212
|
+
[data-scope='hierarchy-chart'][data-part='node'][data-seg] {
|
|
213
|
+
fill: var(--xh-_chart-seq-fill);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
[data-scope='hierarchy-chart'][data-seg='low'] {
|
|
217
|
+
--xh-_hierarchy-ink: var(--xh-fg-default);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
[data-scope='hierarchy-chart'][data-seg='high'] {
|
|
221
|
+
--xh-_hierarchy-ink: var(--xh-chart-surface);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
[data-scope='hierarchy-chart'][data-part='node'][data-dimmed],
|
|
225
|
+
[data-scope='hierarchy-chart'][data-part='node-label'][data-dimmed],
|
|
226
|
+
[data-scope='hierarchy-chart'][data-part='group-header'][data-dimmed] {
|
|
227
|
+
opacity: var(--xh-chart-dim-alpha);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* 名字与分组标题压在节点的颜色上:前景随层与着色方式取;它们不接指针,命中归节点 */
|
|
231
|
+
[data-scope='hierarchy-chart'][data-part='node-label'],
|
|
232
|
+
[data-scope='hierarchy-chart'][data-part='group-header'] {
|
|
233
|
+
fill: var(--xh-_hierarchy-ink);
|
|
234
|
+
pointer-events: none;
|
|
235
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
[data-scope='hierarchy-chart'][data-part='group-header'] {
|
|
239
|
+
font-weight: var(--xh-font-weight-medium);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* 色阶图例:每层一条,名字、低端的值、渐变条、高端的值排成一行;值是标注字色、等宽数字 */
|
|
243
|
+
[data-scope='hierarchy-chart'][data-part='legend-scale'] {
|
|
244
|
+
display: inline-flex;
|
|
245
|
+
align-items: center;
|
|
246
|
+
gap: var(--xh-hierarchy-chart-legend-scale-gap, var(--xh-space-2));
|
|
247
|
+
color: var(--xh-fg-muted);
|
|
248
|
+
font-size: var(--xh-text-caption-size);
|
|
249
|
+
font-variant-numeric: tabular-nums;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
[data-scope='hierarchy-chart'][data-part='legend-scale-name'] {
|
|
253
|
+
color: var(--xh-fg-default);
|
|
254
|
+
font-size: var(--xh-text-body-size);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
[data-scope='hierarchy-chart'][data-part='legend-scale-bar'] {
|
|
258
|
+
inline-size: var(--xh-hierarchy-chart-legend-scale-width, var(--xh-chart-legend-scale-width));
|
|
259
|
+
block-size: var(--xh-space-2);
|
|
260
|
+
border-radius: var(--xh-hierarchy-chart-legend-scale-bar-radius, var(--xh-shape-inset));
|
|
261
|
+
/* 低端在行首:角度乘方向符号,rtl 下渐变从右往左 */
|
|
262
|
+
background: linear-gradient(calc(90deg * var(--xh-direction-sign)), var(--xh-_hierarchy-scale-from), var(--xh-_chart-seq-mid) 28.6%, var(--xh-_chart-seq-end));
|
|
263
|
+
/* 节点只用色阶上 0.3–1 这一段(最浅的一段压在承载面上看不见):渐变按同一段画,起点即 0.3 处的颜色,
|
|
264
|
+
中点落在 (0.5 − 0.3) / 0.7 处 */
|
|
265
|
+
--xh-_hierarchy-scale-from: color-mix(in oklch, var(--xh-_chart-seq-mid) 60%, var(--xh-_chart-seq-start));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/* 强制色:节点改成系统色的面与描边,名字取正文色;路径的尖角取正文色;色阶只留轮廓;焦点环在配方里 */
|
|
269
|
+
@media (forced-colors: active) {
|
|
270
|
+
[data-scope='hierarchy-chart'][data-part='node'],
|
|
271
|
+
[data-scope='hierarchy-chart'][data-part='node'][data-seg] {
|
|
272
|
+
fill: Canvas;
|
|
273
|
+
stroke: CanvasText;
|
|
274
|
+
stroke-width: var(--xh-stroke-thin);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
[data-scope='hierarchy-chart'][data-part='node-label'],
|
|
278
|
+
[data-scope='hierarchy-chart'][data-part='group-header'] {
|
|
279
|
+
fill: CanvasText;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
[data-scope='hierarchy-chart'][data-part='path-item'] + [data-scope='hierarchy-chart'][data-part='path-item']::before {
|
|
283
|
+
forced-color-adjust: none;
|
|
284
|
+
background-color: CanvasText;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* 色阶在系统色下画不出来:只留轮廓,两端的值照常可读 */
|
|
288
|
+
[data-scope='hierarchy-chart'][data-part='legend-scale-bar'] {
|
|
289
|
+
border: var(--xh-stroke-thin) solid CanvasText;
|
|
290
|
+
background: Canvas;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* 色阶声明了 display:作者写 hidden 时照样收起 */
|
|
295
|
+
[data-scope='hierarchy-chart'][data-part='legend-scale'][hidden] {
|
|
296
|
+
display: none;
|
|
297
|
+
}
|
|
298
|
+
}
|
package/css/hover-card.css
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
9
|
@import '../family/motion.css';
|
|
10
|
+
@import '../family/material.css';
|
|
10
11
|
|
|
11
12
|
@layer xihan.components {
|
|
12
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -92,9 +93,37 @@
|
|
|
92
93
|
--xh-_overlay-enter-left: 1;
|
|
93
94
|
}
|
|
94
95
|
|
|
96
|
+
/* 交叉轴原点按对齐取:start / end 对齐时卡片与锚点在那一端齐平,缩放从那一端涨开,贴着短链接的卡片
|
|
97
|
+
才像是从链接里长出来;居中对齐留在中线。上下两侧的 start / end 是行内轴上的逻辑对齐,RTL 下起始缘在右;
|
|
98
|
+
左右两侧的 start / end 落在块轴上,不随书写方向翻 */
|
|
99
|
+
/* 起始缘与末尾缘按就近的书写方向取:LTR 起始在左,RTL 起始在右 */
|
|
100
|
+
[data-scope='hover-card'][data-part='positioner']:is([data-placement='top-start'], [data-placement='bottom-start']) {
|
|
101
|
+
--xh-_overlay-origin-x: var(--xh-direction-start);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
[data-scope='hover-card'][data-part='positioner']:is([data-placement='top-end'], [data-placement='bottom-end']) {
|
|
105
|
+
--xh-_overlay-origin-x: var(--xh-direction-end);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
[data-scope='hover-card'][data-part='positioner']:is([data-placement='left-start'], [data-placement='right-start']) {
|
|
109
|
+
--xh-_overlay-origin-y: 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
[data-scope='hover-card'][data-part='positioner']:is([data-placement='left-end'], [data-placement='right-end']) {
|
|
113
|
+
--xh-_overlay-origin-y: 100%;
|
|
114
|
+
}
|
|
115
|
+
|
|
95
116
|
/* 与 tooltip 不同:卡片本体承载交互,必须吃指针——
|
|
96
117
|
指针停在卡片上就不该收起,里面的链接与按钮也要点得到 */
|
|
97
118
|
[data-scope='hover-card'][data-part='content'] {
|
|
119
|
+
/* 材质由家族配方画(family/material.css 的 frosted 面:描边、底、1px 顶光、前景、投影与背景滤镜),
|
|
120
|
+
这里只把使用者槽接进来 */
|
|
121
|
+
--xh-frosted-bg: var(--xh-hover-card-bg, var(--xh-_material-bg));
|
|
122
|
+
--xh-frosted-border: var(--xh-hover-card-border, var(--xh-_material-border));
|
|
123
|
+
--xh-frosted-fg: var(--xh-hover-card-fg, var(--xh-_material-fg));
|
|
124
|
+
--xh-frosted-shadow: var(--xh-hover-card-shadow, var(--xh-_material-shadow));
|
|
125
|
+
--xh-frosted-backdrop: var(--xh-hover-card-backdrop, var(--xh-_material-backdrop));
|
|
126
|
+
|
|
98
127
|
/* 尺寸档只换这两个私有槽。size 落在 content 上而非 root:root 是可选部件,
|
|
99
128
|
面板几何也长在 content 上。语气不接:卡片是内容容器,语气该由里面的内容表达 */
|
|
100
129
|
--xh-_hover-card-pad: var(--xh-surface-pad-md);
|
|
@@ -114,20 +143,7 @@
|
|
|
114
143
|
overscroll-behavior: contain;
|
|
115
144
|
padding-block: var(--xh-hover-card-py, var(--xh-_hover-card-pad));
|
|
116
145
|
padding-inline: var(--xh-hover-card-px, var(--xh-_hover-card-pad));
|
|
117
|
-
border: var(--xh-stroke-thin) solid var(--xh-hover-card-border, var(--xh-material-frosted-border));
|
|
118
146
|
border-radius: var(--xh-hover-card-radius, var(--xh-shape-overlay));
|
|
119
|
-
/* 与气泡族共用 M2:顶光只占一像素,正文保持实体,只在内容层采样一次背景。 */
|
|
120
|
-
background:
|
|
121
|
-
linear-gradient(
|
|
122
|
-
to bottom,
|
|
123
|
-
var(--xh-material-frosted-highlight) 0 var(--xh-stroke-thin),
|
|
124
|
-
transparent var(--xh-stroke-thin)
|
|
125
|
-
),
|
|
126
|
-
var(--xh-hover-card-bg, var(--xh-material-frosted-bg));
|
|
127
|
-
color: var(--xh-hover-card-fg, var(--xh-material-frosted-fg));
|
|
128
|
-
box-shadow: var(--xh-hover-card-shadow, var(--xh-material-frosted-shadow));
|
|
129
|
-
-webkit-backdrop-filter: var(--xh-hover-card-backdrop, var(--xh-material-frosted-backdrop));
|
|
130
|
-
backdrop-filter: var(--xh-hover-card-backdrop, var(--xh-material-frosted-backdrop));
|
|
131
147
|
pointer-events: auto;
|
|
132
148
|
/* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
|
|
133
149
|
transform-origin: var(--xh-_overlay-origin-x, 50%) var(--xh-_overlay-origin-y, 50%);
|
|
@@ -144,7 +160,8 @@
|
|
|
144
160
|
outline: none;
|
|
145
161
|
}
|
|
146
162
|
|
|
147
|
-
|
|
163
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
164
|
+
[data-scope='hover-card'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
148
165
|
animation: xh-overlay-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
149
166
|
}
|
|
150
167
|
|