@xihan-ui/styles 3.1.0 → 4.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 +470 -0
- package/component-tokens.d.ts +230 -60
- package/components.tokens.json +5156 -1557
- package/css/accordion.css +47 -20
- package/css/alert.css +16 -17
- package/css/anchor.css +2 -2
- package/css/approval.css +41 -17
- package/css/avatar-group.css +9 -12
- package/css/avatar.css +20 -18
- package/css/back-top.css +21 -7
- package/css/badge.css +5 -5
- package/css/breadcrumb.css +18 -16
- package/css/button-group.css +4 -6
- package/css/button.css +13 -12
- package/css/calendar-picker.css +178 -95
- package/css/calendar-range-picker.css +207 -122
- package/css/card.css +34 -6
- package/css/carousel.css +94 -46
- package/css/cartesian-chart.css +11 -11
- package/css/cascader.css +51 -39
- package/css/checkbox-group.css +9 -6
- package/css/checkbox.css +5 -4
- package/css/citation.css +9 -4
- package/css/clipboard.css +20 -4
- package/css/code-view.css +6 -6
- package/css/collapsible.css +29 -14
- package/css/color-field.css +4 -4
- package/css/color-picker.css +77 -23
- package/css/color-slider.css +10 -8
- package/css/color-swatch-picker.css +14 -9
- package/css/combobox.css +26 -14
- package/css/command.css +14 -9
- package/css/context-menu.css +10 -5
- package/css/date-field.css +12 -6
- package/css/date-picker.css +178 -109
- package/css/date-range-picker.css +199 -130
- package/css/description.css +10 -6
- package/css/descriptions.css +47 -19
- package/css/dialog.css +50 -35
- package/css/diff-view.css +8 -8
- package/css/drawer.css +75 -21
- package/css/editable.css +15 -41
- package/css/empty-state.css +21 -3
- package/css/field-array.css +5 -2
- package/css/field.css +17 -18
- package/css/fieldset.css +33 -13
- package/css/file-upload.css +66 -33
- package/css/float-button.css +60 -35
- package/css/floating-panel.css +1 -1
- package/css/form.css +30 -16
- package/css/graph-chart.css +2 -2
- package/css/grid-list.css +1 -1
- package/css/highlight.css +5 -5
- package/css/hover-card.css +19 -12
- package/css/image-viewer.css +77 -27
- package/css/image.css +13 -5
- package/css/infinite-scroll.css +8 -4
- package/css/input-group.css +74 -26
- package/css/kbd.css +1 -1
- package/css/label.css +27 -11
- package/css/layout.css +17 -10
- package/css/list.css +13 -9
- package/css/listbox.css +12 -7
- package/css/loading-bar.css +3 -0
- package/css/mention.css +11 -9
- package/css/menu.css +10 -5
- package/css/menubar.css +13 -8
- package/css/message-feed.css +1 -1
- package/css/navigation-menu.css +2 -2
- package/css/notification.css +132 -49
- package/css/number-animation.css +2 -2
- package/css/number-field.css +75 -52
- package/css/page-header.css +64 -27
- package/css/pagination.css +35 -38
- package/css/password-input.css +12 -68
- package/css/pin-input.css +18 -26
- package/css/popconfirm.css +23 -14
- package/css/popover.css +18 -12
- package/css/progress.css +14 -13
- package/css/prompt-input.css +3 -3
- package/css/question-flow.css +41 -15
- package/css/radar-chart.css +6 -6
- package/css/radio-group.css +120 -55
- package/css/rating.css +32 -15
- package/css/select.css +16 -12
- package/css/separator.css +24 -6
- package/css/side-nav.css +29 -24
- package/css/signature-pad.css +23 -9
- package/css/skeleton.css +12 -12
- package/css/slider.css +77 -48
- package/css/sortable.css +2 -2
- package/css/sparkline.css +8 -2
- package/css/spinner.css +40 -20
- package/css/statistic.css +14 -14
- package/css/steps.css +115 -84
- package/css/switch.css +9 -7
- package/css/table.css +29 -12
- package/css/tabs.css +35 -12
- package/css/tag-group.css +17 -6
- package/css/tag.css +54 -29
- package/css/tags-input.css +39 -20
- package/css/text-field.css +5 -5
- package/css/time-field.css +4 -4
- package/css/time-picker.css +150 -64
- package/css/time-range-picker.css +91 -62
- package/css/timeline.css +37 -20
- package/css/timer.css +3 -3
- package/css/toggle-group.css +4 -4
- package/css/tool-call.css +13 -11
- package/css/toolbar.css +6 -5
- package/css/tooltip.css +16 -17
- package/css/tour.css +14 -7
- package/css/transfer.css +22 -16
- package/css/tree-select.css +12 -12
- package/css/tree.css +26 -25
- package/css/typography.css +28 -25
- package/dist/css/accordion.css +296 -0
- package/dist/css/affix.css +47 -0
- package/dist/css/alert.css +246 -0
- package/dist/css/anchor.css +252 -0
- package/dist/css/approval.css +525 -0
- package/dist/css/avatar-group.css +96 -0
- package/dist/css/avatar.css +100 -0
- package/dist/css/back-top.css +175 -0
- package/dist/css/badge.css +205 -0
- package/dist/css/bar-code.css +62 -0
- package/dist/css/breadcrumb.css +232 -0
- package/dist/css/button-group.css +261 -0
- package/dist/css/button.css +216 -0
- package/dist/css/calendar-picker.css +550 -0
- package/dist/css/calendar-range-picker.css +639 -0
- package/dist/css/card.css +249 -0
- package/dist/css/carousel.css +726 -0
- package/dist/css/cartesian-chart.css +830 -0
- package/dist/css/cascader.css +973 -0
- package/dist/css/checkbox-group.css +361 -0
- package/dist/css/checkbox.css +258 -0
- package/dist/css/citation.css +475 -0
- package/dist/css/clipboard.css +331 -0
- package/dist/css/code-view.css +374 -0
- package/dist/css/collapsible.css +200 -0
- package/dist/css/color-field.css +176 -0
- package/dist/css/color-picker.css +649 -0
- package/dist/css/color-slider.css +283 -0
- package/dist/css/color-swatch-picker.css +250 -0
- package/dist/css/color-swatch.css +35 -0
- package/dist/css/combobox.css +578 -0
- package/dist/css/command.css +404 -0
- package/dist/css/context-menu.css +425 -0
- package/dist/css/date-field.css +317 -0
- package/dist/css/date-picker.css +931 -0
- package/dist/css/date-range-picker.css +949 -0
- package/dist/css/description.css +71 -0
- package/dist/css/descriptions.css +327 -0
- package/dist/css/dialog.css +470 -0
- package/dist/css/diff-view.css +513 -0
- package/dist/css/download-trigger.css +151 -0
- package/dist/css/drawer.css +606 -0
- package/dist/css/editable.css +269 -0
- package/dist/css/empty-state.css +181 -0
- package/dist/css/field-array.css +229 -0
- package/dist/css/field.css +165 -0
- package/dist/css/fieldset.css +122 -0
- package/dist/css/file-upload.css +462 -0
- package/dist/css/flex.css +441 -0
- package/dist/css/float-button.css +579 -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 +407 -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 +233 -0
- package/dist/css/icon.css +225 -0
- package/dist/css/image-cropper.css +373 -0
- package/dist/css/image-viewer.css +588 -0
- package/dist/css/image.css +106 -0
- package/dist/css/infinite-scroll.css +81 -0
- package/dist/css/input-group.css +323 -0
- package/dist/css/json-viewer.css +379 -0
- package/dist/css/kbd.css +72 -0
- package/dist/css/label.css +94 -0
- package/dist/css/layers.css +7 -0
- package/dist/css/layout.css +379 -0
- package/dist/css/liquid.css +106 -0
- package/dist/css/list.css +156 -0
- package/dist/css/listbox.css +395 -0
- package/dist/css/loading-bar.css +144 -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 +395 -0
- package/dist/css/menu.css +369 -0
- package/dist/css/menubar.css +461 -0
- package/dist/css/message-feed.css +318 -0
- package/dist/css/navigation-menu.css +513 -0
- package/dist/css/notification.css +865 -0
- package/dist/css/number-animation.css +44 -0
- package/dist/css/number-field.css +275 -0
- package/dist/css/overlay-arrow.css +56 -0
- package/dist/css/page-header.css +221 -0
- package/dist/css/pagination.css +447 -0
- package/dist/css/password-input.css +335 -0
- package/dist/css/pie-chart.css +247 -0
- package/dist/css/pin-input.css +191 -0
- package/dist/css/pointer.css +36 -0
- package/dist/css/popconfirm.css +329 -0
- package/dist/css/popover.css +285 -0
- package/dist/css/progress.css +502 -0
- package/dist/css/prompt-input.css +260 -0
- package/dist/css/question-flow.css +579 -0
- package/dist/css/radar-chart.css +233 -0
- package/dist/css/radio-group.css +663 -0
- package/dist/css/rating.css +311 -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 +616 -0
- package/dist/css/separator.css +140 -0
- package/dist/css/side-nav.css +481 -0
- package/dist/css/signature-pad.css +193 -0
- package/dist/css/skeleton.css +161 -0
- package/dist/css/slider.css +403 -0
- package/dist/css/sortable.css +228 -0
- package/dist/css/sparkline.css +170 -0
- package/dist/css/spinner.css +256 -0
- package/dist/css/splitter.css +159 -0
- package/dist/css/statistic.css +137 -0
- package/dist/css/steps.css +658 -0
- package/dist/css/switch.css +353 -0
- package/dist/css/table.css +1162 -0
- package/dist/css/tabs.css +967 -0
- package/dist/css/tag-group.css +258 -0
- package/dist/css/tag.css +335 -0
- package/dist/css/tags-input.css +341 -0
- package/dist/css/text-field.css +197 -0
- package/dist/css/time-field.css +277 -0
- package/dist/css/time-picker.css +793 -0
- package/dist/css/time-range-picker.css +775 -0
- package/dist/css/timeline.css +440 -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 +431 -0
- package/dist/css/toolbar.css +366 -0
- package/dist/css/tooltip.css +217 -0
- package/dist/css/tour.css +446 -0
- package/dist/css/transfer.css +644 -0
- package/dist/css/tree-select.css +878 -0
- package/dist/css/tree.css +734 -0
- package/dist/css/truncate.css +108 -0
- package/dist/css/typography.css +475 -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 +493 -0
- package/dist/family/chart.css +537 -0
- package/dist/family/check-mark.css +94 -0
- package/dist/family/choice-card.css +97 -0
- package/dist/family/collection-item.css +768 -0
- package/dist/family/field-chrome.css +296 -0
- package/dist/family/loading-ring.css +102 -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 +65 -0
- package/family/action-control.css +33 -36
- package/family/chart.css +57 -0
- package/family/collection-item.css +12 -8
- package/family/field-chrome.css +28 -19
- package/family/loading-ring.css +20 -13
- package/family/swatch.css +4 -4
- package/family/tag-list.css +6 -0
- package/index.css +10349 -8756
- package/index.unlayered.css +10350 -8758
- package/package.json +165 -164
|
@@ -0,0 +1,552 @@
|
|
|
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
|
+
/* 定义 heatmap 样式。 */
|
|
7
|
+
|
|
8
|
+
/* 详情条与对照条走 Chart 家族配方:与其余图表的提示框、图例同一副外观。本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/chart.css';
|
|
10
|
+
|
|
11
|
+
@layer xihan.components {
|
|
12
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
13
|
+
.xh-scope-heatmap {
|
|
14
|
+
--xh-heatmap-skin: 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* 缺省的 calendar 形态:上下两条横排,月份行在网格之外(它只是一条对齐用的坐标轴),
|
|
18
|
+
网格里是七行星期。格子一律是固定尺寸的方块,列与列之间靠尺寸对齐,不必另立网格轨道。
|
|
19
|
+
另外两种形态只在下面的 [data-variant] 段里改摆法,这里的取值一概不动。 */
|
|
20
|
+
.xh-scope-heatmap[data-part='root'] {
|
|
21
|
+
/* 尺寸档只换这里的私有槽,各部件从 root 继承它们,换档不必给每个部件各写一条选择器。
|
|
22
|
+
格宽在这一处就把使用者令牌解析掉:错列与月份名的宽度都按它算,
|
|
23
|
+
各处分头读会让作者改宽格子后错列与月份名对不上 */
|
|
24
|
+
--xh-_heatmap-cell-size: var(--xh-heatmap-cell-size, var(--xh-space-2_5));
|
|
25
|
+
/* 矩阵形态的行高。格宽那把尺是给「一天一个小方块」定的,矩阵一行左边还挂着行名,
|
|
26
|
+
格子照那把尺定高就矮过行名,行高由行名的字定、格子在行里摊成一条。
|
|
27
|
+
这里取格宽尺的两倍:三档一起走,且每一档都高过行名那行字。
|
|
28
|
+
不接控件高度那把尺——它是给可点可输的控件在一行里排齐用的,矩阵格子不可交互,
|
|
29
|
+
接上去密度档一换矩阵就跟着变形 */
|
|
30
|
+
--xh-_heatmap-row-h: var(--xh-heatmap-row-h, var(--xh-space-5));
|
|
31
|
+
/* 格与格之间的空当:格子按天铺满一年,靠这道缝把一格与相邻格分开 */
|
|
32
|
+
--xh-_heatmap-gap: var(--xh-space-1);
|
|
33
|
+
--xh-_heatmap-gutter: var(--xh-heatmap-gutter, var(--xh-space-8));
|
|
34
|
+
--xh-_heatmap-font-size: var(--xh-text-caption-size);
|
|
35
|
+
/* 星期名隔行画:第 0/2/4/6 行那个字的颜色。缺省透明——只是字不上色,
|
|
36
|
+
盒子、底色与命中区都还在,钉住那一列的实色底不缺一块,七行的悬停行为也一致。
|
|
37
|
+
改写这个槽为一个看得见的颜色(`var(--xh-heatmap-label-fg, var(--xh-fg-subtle))`)即七行全画。
|
|
38
|
+
周首日是星期一时留下的是二 / 四 / 六,是星期日时留下的是一 / 三 / 五 */
|
|
39
|
+
--xh-_heatmap-week-day-skip: var(--xh-heatmap-week-day-skip, transparent);
|
|
40
|
+
/* 色阶的两端:0 档的空格底与满档的实心底。没写 data-tone 也没写 data-palette 时就是这里的取值。
|
|
41
|
+
空格底取淡底的不透明档:中间各档由两端按比例兑出,一端半透明,整条色阶都会跟着半透明、偏色 */
|
|
42
|
+
--xh-_heatmap-empty: var(--xh-heatmap-empty, var(--xh-bg-subtle-opaque));
|
|
43
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-bg-brand));
|
|
44
|
+
/* 钉住的行首那一列自带的底色:格子从它下面滚过去时不能透出来。
|
|
45
|
+
整块摆在别的底色上(卡片、分区)时改写 --xh-heatmap-bg,否则那一列会是一块补丁 */
|
|
46
|
+
--xh-_heatmap-surface: var(--xh-heatmap-bg, var(--xh-bg-surface));
|
|
47
|
+
|
|
48
|
+
/* 详情条按内边距盒绝对定位,参照系就是它 */
|
|
49
|
+
position: relative;
|
|
50
|
+
/* 自建层叠上下文:钉住那一列与详情条的层号只跟组件里的兄弟比,
|
|
51
|
+
不写这条它们是拿去跟页面同层的元素比,热力图会压住页面上后来的定位元素 */
|
|
52
|
+
isolation: isolate;
|
|
53
|
+
display: flex;
|
|
54
|
+
flex-direction: column;
|
|
55
|
+
gap: var(--xh-heatmap-gap, var(--xh-space-2));
|
|
56
|
+
/* 一整年五十几列,一屏放不下就自己横着滚。上下各留一道与格间距同宽的空当,
|
|
57
|
+
最上一行与最下一行不贴着滚动容器的边 */
|
|
58
|
+
padding-block: var(--xh-heatmap-py, var(--xh-_heatmap-gap));
|
|
59
|
+
overflow-x: auto;
|
|
60
|
+
/* 键盘走到视口外的格子时 scrollIntoView 会把它滚进来,落点要让开钉住的那一列,
|
|
61
|
+
否则往回走的那一格正好停在行首星期名底下 */
|
|
62
|
+
scroll-padding-inline-start: calc(var(--xh-_heatmap-gutter) + var(--xh-_heatmap-gap));
|
|
63
|
+
color: var(--xh-heatmap-fg, var(--xh-fg-muted));
|
|
64
|
+
font-size: var(--xh-heatmap-font-size, var(--xh-_heatmap-font-size));
|
|
65
|
+
line-height: var(--xh-leading-none);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* —— 语气 —— */
|
|
69
|
+
/* 选择器带 [data-tone] 限定:不限定的话,放在语气容器里的热力图会跟着改色 */
|
|
70
|
+
.xh-scope-heatmap[data-part='root'][data-tone] {
|
|
71
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-_tone, var(--xh-bg-brand)));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* —— 色板 —— */
|
|
75
|
+
/* 直接按颜色点名,定的是满档那一端的实心底:取基础色板里同名色相的 600 档;0 档的空格底与中间各档的兑法一概不动。
|
|
76
|
+
基础色板同一档跨色相同一明度,十二个色相摊出来的五档深浅一致,换色板不换可读性。
|
|
77
|
+
这几条规则与上面那条语气规则同特指度,排在它之后:两个都写时色板赢——
|
|
78
|
+
色板指名了一个具体颜色,语气只是推得出一个颜色,指名的那个更具体。
|
|
79
|
+
取值一律逐值写死原语、不经 --xh-_tone:那一族槽位是语气层的派生结果,
|
|
80
|
+
色板借道它就会连带把语气的悬停 / 淡底 / 前景一起绑进来,也会被祖先的 data-tone 染色。
|
|
81
|
+
色板拼错取值时一条都不命中,落回上面两条,与没写一样 */
|
|
82
|
+
.xh-scope-heatmap[data-part='root'][data-palette='red'] {
|
|
83
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-red-600));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.xh-scope-heatmap[data-part='root'][data-palette='orange'] {
|
|
87
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-orange-600));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.xh-scope-heatmap[data-part='root'][data-palette='amber'] {
|
|
91
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-amber-600));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.xh-scope-heatmap[data-part='root'][data-palette='yellow'] {
|
|
95
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-yellow-600));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.xh-scope-heatmap[data-part='root'][data-palette='lime'] {
|
|
99
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-lime-600));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.xh-scope-heatmap[data-part='root'][data-palette='green'] {
|
|
103
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-green-600));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.xh-scope-heatmap[data-part='root'][data-palette='teal'] {
|
|
107
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-teal-600));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.xh-scope-heatmap[data-part='root'][data-palette='cyan'] {
|
|
111
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-cyan-600));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.xh-scope-heatmap[data-part='root'][data-palette='blue'] {
|
|
115
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-blue-600));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.xh-scope-heatmap[data-part='root'][data-palette='indigo'] {
|
|
119
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-indigo-600));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.xh-scope-heatmap[data-part='root'][data-palette='purple'] {
|
|
123
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-purple-600));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.xh-scope-heatmap[data-part='root'][data-palette='pink'] {
|
|
127
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-pink-600));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* 灰是唯一按主题换档的一族:十二个色相的 600 档明度都是 0.546,
|
|
131
|
+
深色态的空格底(neutral-800,明度 0.269)离得够远;中性 600 档只有 0.439,
|
|
132
|
+
五档摊下来每档只差 0.0425、相邻两档对比度 1.16–1.20,等于看不出分档。
|
|
133
|
+
深色态改取 neutral-450(明度 0.65),步长回到 0.095、相邻两档 1.42–1.50,不输彩色族。
|
|
134
|
+
不取更亮的 neutral-400:高对比档的 border-default 正是那一档,满档格子的描边会与底色同色。
|
|
135
|
+
data-theme 写在自己身上还是写在祖先上都算,两种用法都成立 */
|
|
136
|
+
.xh-scope-heatmap[data-part='root'][data-palette='gray'] {
|
|
137
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-neutral-600));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
:is([data-theme='dark'] *, [data-theme='dark']).xh-scope-heatmap[data-part='root'][data-palette='gray'] {
|
|
141
|
+
--xh-_heatmap-ink: var(--xh-heatmap-ink, var(--xh-color-neutral-450));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* —— 发散色阶 ——
|
|
145
|
+
以中点为界两侧各自加深:中点那一格是数据色的中性中点,低于中点兑向负向色、高于中点兑向正向色。
|
|
146
|
+
三色都取数据色的发散三色,语气与色板在这一档不生效。中点是没有色相的中性色,兑色走 oklab
|
|
147
|
+
(格子的基础规则已是 in oklab),oklch 会绕着色相环走出一段杂色 */
|
|
148
|
+
.xh-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
|
+
.xh-scope-heatmap[data-part='root'][data-scale='diverging'] :is(.xh-scope-heatmap[data-part='cell'], .xh-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
|
+
.xh-scope-heatmap[data-part='root'][data-scale='diverging'] :is(.xh-scope-heatmap[data-part='cell'], .xh-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
|
+
|
|
161
|
+
/* —— 尺寸 —— */
|
|
162
|
+
/* 缺省的 md 档写在上面的基础规则里 */
|
|
163
|
+
.xh-scope-heatmap[data-part='root'][data-size='sm'] {
|
|
164
|
+
--xh-_heatmap-cell-size: var(--xh-heatmap-cell-size, var(--xh-space-2));
|
|
165
|
+
--xh-_heatmap-row-h: var(--xh-heatmap-row-h, var(--xh-space-4));
|
|
166
|
+
--xh-_heatmap-gutter: var(--xh-heatmap-gutter, var(--xh-space-6));
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.xh-scope-heatmap[data-part='root'][data-size='lg'] {
|
|
170
|
+
--xh-_heatmap-cell-size: var(--xh-heatmap-cell-size, var(--xh-space-3));
|
|
171
|
+
--xh-_heatmap-row-h: var(--xh-heatmap-row-h, var(--xh-space-6));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.xh-scope-heatmap[data-part='grid'] {
|
|
175
|
+
display: flex;
|
|
176
|
+
flex-direction: column;
|
|
177
|
+
gap: var(--xh-heatmap-grid-gap, var(--xh-_heatmap-gap));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.xh-scope-heatmap[data-part='row'] {
|
|
181
|
+
/* 行首空出的列数由连接层写进这个槽:日历形态是区间起点不在周首日时的错列,
|
|
182
|
+
月历形态是这一周里 1 号之前的那几个星期几 */
|
|
183
|
+
--xh-_heatmap-row-offset: 0;
|
|
184
|
+
|
|
185
|
+
display: flex;
|
|
186
|
+
/* 行至少要有内容那么宽。行是列方向 flex 的子项,缺省会被拉成容器的宽(一屏那么宽),
|
|
187
|
+
行首钉住的那一列只能在自己这一行的盒子里钉——盒子只有一屏宽,滚过一屏它就跟着走了 */
|
|
188
|
+
min-inline-size: max-content;
|
|
189
|
+
align-items: center;
|
|
190
|
+
gap: var(--xh-heatmap-row-gap, var(--xh-_heatmap-gap));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* 数据行的高度只由格子定。行首那一列星期名的字(12px)比格子(10px)高,让它撑开行
|
|
194
|
+
会在纵向多挤出两像素,同一张图的横向格距与纵向格距就不一样宽。
|
|
195
|
+
钉死成格高之后星期名的字仍照常画,只是溢出到行外——那几行隔行留白,撞不到东西 */
|
|
196
|
+
.xh-scope-heatmap[data-part='row'][data-week-day],
|
|
197
|
+
.xh-scope-heatmap[data-part='row'][data-week] {
|
|
198
|
+
block-size: var(--xh-_heatmap-cell-size);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* 行首的星期名。月份行行首那个占位也是它,宽度一样,月份才对得上列。
|
|
202
|
+
一整年放不下时网格横着滚,这一列钉在滚动容器的起始缘:跟着滚走的话,
|
|
203
|
+
滚过头一屏就再也认不出哪一行是星期几。底色必须实色,格子从它下面滚过去不能透出来 */
|
|
204
|
+
.xh-scope-heatmap[data-part='week-day'] {
|
|
205
|
+
position: sticky;
|
|
206
|
+
/* 层号收在 root 建的层叠上下文里,只跟组件内的兄弟比 */
|
|
207
|
+
z-index: var(--xh-heatmap-sticky-layer, 1);
|
|
208
|
+
inset-inline-start: 0;
|
|
209
|
+
display: block;
|
|
210
|
+
flex: 0 0 auto;
|
|
211
|
+
inline-size: var(--xh-_heatmap-gutter);
|
|
212
|
+
overflow: hidden;
|
|
213
|
+
background: var(--xh-_heatmap-surface);
|
|
214
|
+
color: var(--xh-heatmap-label-fg, var(--xh-fg-subtle));
|
|
215
|
+
white-space: nowrap;
|
|
216
|
+
text-align: end;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* 隔行画:这几行只是字不上色,节点、文字、盒子与底色都还在。
|
|
220
|
+
不能用 visibility 关:那会连盒子一起不画,钉住那一列的实色底跟着缺四行,
|
|
221
|
+
格子从行首透出来,且这四行不再参与命中测试——鼠标划过行首会弹出看不见那一格的详情条。
|
|
222
|
+
一行只有 10px 高,七个 12px 的字挨着写会上下叠在一起;隔一行之后每个留下来的字
|
|
223
|
+
有两行的高度(2 × 格高 + 格距)可用。哪一行是星期几由行自己的可及名字念出来,
|
|
224
|
+
可见文字与可及名字是两件事,读屏这边一行都没少 */
|
|
225
|
+
.xh-scope-heatmap[data-part='week-day'][data-week-day='0'],
|
|
226
|
+
.xh-scope-heatmap[data-part='week-day'][data-week-day='2'],
|
|
227
|
+
.xh-scope-heatmap[data-part='week-day'][data-week-day='4'],
|
|
228
|
+
.xh-scope-heatmap[data-part='week-day'][data-week-day='6'] {
|
|
229
|
+
color: var(--xh-_heatmap-week-day-skip);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/* 月份名横跨这个月占的那几列:列宽加列间距,末尾少算一个间距(它由行的 gap 补上) */
|
|
233
|
+
.xh-scope-heatmap[data-part='month-label'] {
|
|
234
|
+
--xh-_heatmap-month-weeks: 1;
|
|
235
|
+
|
|
236
|
+
display: block;
|
|
237
|
+
flex: 0 0 auto;
|
|
238
|
+
inline-size: calc(
|
|
239
|
+
var(--xh-_heatmap-month-weeks) * (var(--xh-_heatmap-cell-size) + var(--xh-_heatmap-gap))
|
|
240
|
+
- var(--xh-_heatmap-gap)
|
|
241
|
+
);
|
|
242
|
+
overflow: hidden;
|
|
243
|
+
color: var(--xh-heatmap-label-fg, var(--xh-fg-subtle));
|
|
244
|
+
white-space: nowrap;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/* 一天一格。档位是连着的百分比,档数随便改都不必再写一条选择器 */
|
|
248
|
+
.xh-scope-heatmap[data-part='cell'] {
|
|
249
|
+
--xh-_heatmap-level: 0%;
|
|
250
|
+
|
|
251
|
+
flex: 0 0 auto;
|
|
252
|
+
inline-size: var(--xh-_heatmap-cell-size);
|
|
253
|
+
block-size: var(--xh-_heatmap-cell-size);
|
|
254
|
+
border-radius: var(--xh-heatmap-cell-radius, var(--xh-shape-inset));
|
|
255
|
+
background: var(
|
|
256
|
+
--xh-heatmap-cell-bg,
|
|
257
|
+
color-mix(in oklab, var(--xh-_heatmap-ink) var(--xh-_heatmap-level), var(--xh-_heatmap-empty))
|
|
258
|
+
);
|
|
259
|
+
/* 空格与浅档在浅色底上几乎没有边界,描一圈极淡的线把方格勾出来。
|
|
260
|
+
这一档不能取 border-subtle:它与空格底色 bg-subtle 是同一个原色,描了等于没描 */
|
|
261
|
+
box-shadow: inset 0 0 0 var(--xh-stroke-thin) var(--xh-heatmap-cell-border, var(--xh-border-default));
|
|
262
|
+
transition: box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* 详情条正在说的那一格(指针停着或焦点落着)描一圈正文色的粗线:扫过一片格子时看得出条说的是哪一格 */
|
|
266
|
+
.xh-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
|
+
.xh-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
|
+
.xh-scope-heatmap[data-part='root'][data-animating] .xh-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);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* 错列打在本行第一个格子上:打在行上会连行首的星期名一起往后推,
|
|
287
|
+
左侧那一列星期名就变成锯齿。两条选择器合起来正好是「本行第一个格子」,
|
|
288
|
+
行里写不写星期名都成立 */
|
|
289
|
+
.xh-scope-heatmap[data-part='row'] > .xh-scope-heatmap[data-part='cell']:first-child,
|
|
290
|
+
.xh-scope-heatmap[data-part='week-day'] + .xh-scope-heatmap[data-part='cell'] {
|
|
291
|
+
margin-inline-start: calc(
|
|
292
|
+
var(--xh-_heatmap-row-offset) * (var(--xh-_heatmap-cell-size) + var(--xh-_heatmap-gap))
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* —— 月历形态:一个自然月一块,块内一行是一周、一列是一个星期几 —— */
|
|
297
|
+
.xh-scope-heatmap[data-part='root'][data-variant='month'] .xh-scope-heatmap[data-part='grid'] {
|
|
298
|
+
flex-flow: row wrap;
|
|
299
|
+
gap: var(--xh-heatmap-block-gap, var(--xh-_heatmap-gutter));
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.xh-scope-heatmap[data-part='month-block'] {
|
|
303
|
+
display: flex;
|
|
304
|
+
flex-direction: column;
|
|
305
|
+
gap: var(--xh-heatmap-block-inner-gap, var(--xh-_heatmap-gap));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* 月历形态的月块是换行排开的,没有钉住的那一列,滚动落点也不必让开 */
|
|
309
|
+
.xh-scope-heatmap[data-part='root'][data-variant='month'] {
|
|
310
|
+
/* 这里的星期名是一排列头,七个一个都不能少:隔行不上色就有四列认不出是星期几 */
|
|
311
|
+
--xh-_heatmap-week-day-skip: var(--xh-heatmap-label-fg, var(--xh-fg-subtle));
|
|
312
|
+
|
|
313
|
+
/* 月块换行排开,宽度永不超过容器,这一档不当滚动容器:留着 overflow-x: auto 的话,
|
|
314
|
+
下面那排列头(12px 的字装在 10px 的列里)往外溢的那点行盒会算进可滚动宽度,
|
|
315
|
+
2px 的溢出就换来一条常驻的横向滚动条,白吃掉十几像素高。
|
|
316
|
+
clip 只裁不滚,再放出一个格距的余量让列头两端那点溢出照常画出来 */
|
|
317
|
+
overflow-x: clip;
|
|
318
|
+
overflow-clip-margin: var(--xh-_heatmap-gap);
|
|
319
|
+
scroll-padding-inline-start: 0;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/* 块里的星期名是一排列头,宽度改成格宽才对得上下面的格子,也不再钉住。
|
|
323
|
+
字比一格宽,不裁:裁掉就是七个缺角的字,让它往两边的列间距里溢出去,
|
|
324
|
+
相邻两个各溢出一点也还差着一段空白 */
|
|
325
|
+
.xh-scope-heatmap[data-part='root'][data-variant='month'] .xh-scope-heatmap[data-part='week-day'] {
|
|
326
|
+
position: static;
|
|
327
|
+
inline-size: var(--xh-_heatmap-cell-size);
|
|
328
|
+
overflow: visible;
|
|
329
|
+
background: none;
|
|
330
|
+
text-align: center;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/* 块的标题占整块宽,不再横跨若干列 */
|
|
334
|
+
.xh-scope-heatmap[data-part='root'][data-variant='month'] .xh-scope-heatmap[data-part='month-label'] {
|
|
335
|
+
inline-size: auto;
|
|
336
|
+
color: var(--xh-heatmap-title-fg, var(--xh-fg-default));
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/* —— 矩阵形态:行列都由作者给,行名与列名是两条真表头 —— */
|
|
340
|
+
/* 行名与日历的星期名同一个位置、同一件事:列多到放不下时钉在起始缘 */
|
|
341
|
+
.xh-scope-heatmap[data-part='row-label'] {
|
|
342
|
+
position: sticky;
|
|
343
|
+
z-index: var(--xh-heatmap-sticky-layer, 1);
|
|
344
|
+
inset-inline-start: 0;
|
|
345
|
+
display: block;
|
|
346
|
+
flex: 0 0 auto;
|
|
347
|
+
inline-size: var(--xh-_heatmap-gutter);
|
|
348
|
+
overflow: hidden;
|
|
349
|
+
background: var(--xh-_heatmap-surface);
|
|
350
|
+
color: var(--xh-heatmap-label-fg, var(--xh-fg-subtle));
|
|
351
|
+
white-space: nowrap;
|
|
352
|
+
text-align: end;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/* 列名与它下面那一列的格子同宽:标签长就把列宽整体调大,别只调标签。
|
|
356
|
+
两处的兜底都是行高,不写列宽时矩阵格子就是正方块 */
|
|
357
|
+
.xh-scope-heatmap[data-part='column-label'] {
|
|
358
|
+
display: block;
|
|
359
|
+
flex: 0 0 auto;
|
|
360
|
+
inline-size: var(--xh-heatmap-column-w, var(--xh-_heatmap-row-h));
|
|
361
|
+
overflow: hidden;
|
|
362
|
+
color: var(--xh-heatmap-label-fg, var(--xh-fg-subtle));
|
|
363
|
+
white-space: nowrap;
|
|
364
|
+
text-align: center;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/* 矩阵的格子两向都不走日方块那把尺:宽跟列走,高跟行走 */
|
|
368
|
+
.xh-scope-heatmap[data-part='root'][data-variant='matrix'] .xh-scope-heatmap[data-part='cell'] {
|
|
369
|
+
inline-size: var(--xh-heatmap-column-w, var(--xh-_heatmap-row-h));
|
|
370
|
+
block-size: var(--xh-_heatmap-row-h);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/* —— 详情条 —— */
|
|
374
|
+
/* 位置由连接层在事件那一刻量好写成内联样式(它量得到,样式表量不到);
|
|
375
|
+
这四个是还没量到时的落点,量到即被内联样式盖过。四个都带长度单位:
|
|
376
|
+
下面 block-start 那一档要把它们放进 calc(100% - …),无单位的 0 会让整条声明作废。
|
|
377
|
+
不引浮层引擎:它按 root 的内边距盒绝对定位,跟着 root 一起横向滚动,
|
|
378
|
+
摆上边还是摆下边由连接层按行序给出,因此始终压在网格自己身上,不会被 root 的滚动裁掉 */
|
|
379
|
+
.xh-scope-heatmap[data-part='tooltip'] {
|
|
380
|
+
--xh-_heatmap-tip-x: 0px;
|
|
381
|
+
--xh-_heatmap-tip-y: 0px;
|
|
382
|
+
--xh-_heatmap-tip-w: 0px;
|
|
383
|
+
--xh-_heatmap-tip-h: 0px;
|
|
384
|
+
|
|
385
|
+
position: absolute;
|
|
386
|
+
/* 排在钉住的行首那一列之上:条从末缘往回长时会盖到那一列上,它不该把条切掉 */
|
|
387
|
+
z-index: var(--xh-heatmap-tooltip-layer, 2);
|
|
388
|
+
display: block;
|
|
389
|
+
inset-inline-start: var(--xh-_heatmap-tip-x);
|
|
390
|
+
inset-block-start: var(--xh-_heatmap-tip-y);
|
|
391
|
+
/* 至少与格子同宽,一两个字的详情也不会瘦成一条 */
|
|
392
|
+
min-inline-size: var(--xh-_heatmap-tip-w);
|
|
393
|
+
max-inline-size: var(--xh-heatmap-tooltip-max-w, var(--xh-overlay-max-w));
|
|
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));
|
|
408
|
+
line-height: var(--xh-leading-normal);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/* 从格子的末缘往回长:条比一格宽得多,格子后面的地方比前面少时往后长会伸出滚动容器被裁掉,
|
|
412
|
+
还会把横向滚动条撑长。按末缘定位,条自己多宽都贴着格子的末沿。
|
|
413
|
+
百分比是内边距盒的宽,在这条 calc 里前后抵消,横向滚到哪里都成立 */
|
|
414
|
+
.xh-scope-heatmap[data-part='tooltip'][data-inline-anchor='end'] {
|
|
415
|
+
inset-inline-start: auto;
|
|
416
|
+
inset-inline-end: calc(100% - var(--xh-_heatmap-tip-x) - var(--xh-_heatmap-tip-w));
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/* 摆在格子下边:从格子的下沿再让开一个格间距 */
|
|
420
|
+
.xh-scope-heatmap[data-part='tooltip'][data-placement='block-end'] {
|
|
421
|
+
inset-block-start: calc(
|
|
422
|
+
var(--xh-_heatmap-tip-y) + var(--xh-_heatmap-tip-h) + var(--xh-_heatmap-gap)
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/* 摆在格子上边:按末缘定位,条自己多高都贴着格子的上沿。
|
|
427
|
+
两头都写就是过约束,起始缘要先让开 */
|
|
428
|
+
.xh-scope-heatmap[data-part='tooltip'][data-placement='block-start'] {
|
|
429
|
+
inset-block-start: auto;
|
|
430
|
+
inset-block-end: calc(100% - var(--xh-_heatmap-tip-y) + var(--xh-_heatmap-gap));
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/* 对照条的排布走配方,间距由配方的私有槽给出;色阶是一条连续的尺,不折行:
|
|
434
|
+
「少」、一排色块、「多」断开就读不出哪端表示多 */
|
|
435
|
+
.xh-scope-heatmap[data-part='legend'] {
|
|
436
|
+
--xh-_chart-legend-gap: var(--xh-heatmap-legend-gap, var(--xh-_heatmap-gap));
|
|
437
|
+
|
|
438
|
+
flex-wrap: nowrap;
|
|
439
|
+
align-items: center;
|
|
440
|
+
color: var(--xh-heatmap-label-fg, var(--xh-fg-subtle));
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/* 对照条两端的那两个字。与色块同一行、同一档颜色,不换行:
|
|
444
|
+
「少」「多」断成两行就跟色块对不上了 */
|
|
445
|
+
.xh-scope-heatmap[data-part='legend-label'] {
|
|
446
|
+
flex: 0 0 auto;
|
|
447
|
+
white-space: nowrap;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/* 对照条里的一格与网格里同档的格子同色,两处共用同一条色阶 */
|
|
451
|
+
.xh-scope-heatmap[data-part='legend-item'] {
|
|
452
|
+
--xh-_heatmap-level: 0%;
|
|
453
|
+
|
|
454
|
+
display: block;
|
|
455
|
+
flex: 0 0 auto;
|
|
456
|
+
inline-size: var(--xh-_heatmap-cell-size);
|
|
457
|
+
block-size: var(--xh-_heatmap-cell-size);
|
|
458
|
+
border-radius: var(--xh-heatmap-cell-radius, var(--xh-shape-inset));
|
|
459
|
+
background: var(
|
|
460
|
+
--xh-heatmap-cell-bg,
|
|
461
|
+
color-mix(in oklab, var(--xh-_heatmap-ink) var(--xh-_heatmap-level), var(--xh-_heatmap-empty))
|
|
462
|
+
);
|
|
463
|
+
box-shadow: inset 0 0 0 var(--xh-stroke-thin) var(--xh-heatmap-cell-border, var(--xh-border-default));
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/* 给了 display 的角色节点必须补这条:display 声明会盖掉 UA 的 [hidden]{display:none},
|
|
467
|
+
不补的话作者给节点加 hidden 后它照样显示。
|
|
468
|
+
格子没有声明 display,UA 那条兜得住,不必列在这里 */
|
|
469
|
+
.xh-scope-heatmap[data-part='root'][hidden],
|
|
470
|
+
.xh-scope-heatmap[data-part='grid'][hidden],
|
|
471
|
+
.xh-scope-heatmap[data-part='month-block'][hidden],
|
|
472
|
+
.xh-scope-heatmap[data-part='row'][hidden],
|
|
473
|
+
.xh-scope-heatmap[data-part='week-day'][hidden],
|
|
474
|
+
.xh-scope-heatmap[data-part='month-label'][hidden],
|
|
475
|
+
.xh-scope-heatmap[data-part='row-label'][hidden],
|
|
476
|
+
.xh-scope-heatmap[data-part='column-label'][hidden],
|
|
477
|
+
.xh-scope-heatmap[data-part='tooltip'][hidden],
|
|
478
|
+
.xh-scope-heatmap[data-part='legend'][hidden],
|
|
479
|
+
.xh-scope-heatmap[data-part='legend-item'][hidden] {
|
|
480
|
+
display: none;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/*
|
|
484
|
+
* 打印:格子的深浅只写在底色上,纸上多数丢背景,整张图印成一片空白。
|
|
485
|
+
* 这一档把档位改画成边框的粗细——0 档只有一圈发丝线,档位越高边越厚,
|
|
486
|
+
* 顶到一半格宽时整格填满。边算在尺寸里(reset 兜了 border-box),格子大小一点不变。
|
|
487
|
+
*
|
|
488
|
+
* 比例取 0.2 / 0.3 / 0.4 / 0.5:缺省格宽 10px 下正好落在 2 / 3 / 4 / 5 像素,
|
|
489
|
+
* 与 0 档那一像素合成五档整数宽——边宽在屏幕与纸上都取整,分数宽会有两档并到一起。
|
|
490
|
+
*
|
|
491
|
+
* 第一条给的是高档那一身,下面四条按档位逐个改薄:档数由作者定,
|
|
492
|
+
* 超出缺省五档的那些落在第一条上,一律按最高档画。
|
|
493
|
+
* 图例里那几个方块与格子同源,跟着走同一套。
|
|
494
|
+
*/
|
|
495
|
+
@media print {
|
|
496
|
+
.xh-scope-heatmap[data-part='cell'],
|
|
497
|
+
.xh-scope-heatmap[data-part='legend-item'] {
|
|
498
|
+
--xh-_heatmap-ink-ring: calc(var(--xh-_heatmap-cell-size) * 0.5);
|
|
499
|
+
|
|
500
|
+
border: var(--xh-_heatmap-ink-ring) solid currentColor;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
.xh-scope-heatmap[data-part='cell'][data-level='0'],
|
|
504
|
+
.xh-scope-heatmap[data-part='legend-item'][data-level='0'] {
|
|
505
|
+
--xh-_heatmap-ink-ring: var(--xh-stroke-thin);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
.xh-scope-heatmap[data-part='cell'][data-level='1'],
|
|
509
|
+
.xh-scope-heatmap[data-part='legend-item'][data-level='1'] {
|
|
510
|
+
--xh-_heatmap-ink-ring: calc(var(--xh-_heatmap-cell-size) * 0.2);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
.xh-scope-heatmap[data-part='cell'][data-level='2'],
|
|
514
|
+
.xh-scope-heatmap[data-part='legend-item'][data-level='2'] {
|
|
515
|
+
--xh-_heatmap-ink-ring: calc(var(--xh-_heatmap-cell-size) * 0.3);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
.xh-scope-heatmap[data-part='cell'][data-level='3'],
|
|
519
|
+
.xh-scope-heatmap[data-part='legend-item'][data-level='3'] {
|
|
520
|
+
--xh-_heatmap-ink-ring: calc(var(--xh-_heatmap-cell-size) * 0.4);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
/* 发散色阶两侧同档的环一样粗,纸上分不出正负:负向一侧改用点线,点线在任何粗细下都认得出 */
|
|
524
|
+
.xh-scope-heatmap[data-part='cell'][data-polarity='negative'],
|
|
525
|
+
.xh-scope-heatmap[data-part='legend-item'][data-polarity='negative'] {
|
|
526
|
+
border-style: dotted;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/*
|
|
531
|
+
* 高对比档:格子画的就是色阶本身,被系统换成同一个底色之后整张图没有任何深浅。
|
|
532
|
+
* 这几处退出强制着色,自己保住色阶;退出之后不再跟系统底色走,
|
|
533
|
+
* 各补一圈系统描边把方格从背景里框出来(原来那圈发丝线写在 inset 阴影上,这一档里被丢弃)。
|
|
534
|
+
*/
|
|
535
|
+
@media (forced-colors: active) {
|
|
536
|
+
.xh-scope-heatmap[data-part='cell'],
|
|
537
|
+
.xh-scope-heatmap[data-part='legend-item'] {
|
|
538
|
+
forced-color-adjust: none;
|
|
539
|
+
outline: var(--xh-stroke-thin) solid CanvasText;
|
|
540
|
+
outline-offset: calc(-1 * var(--xh-stroke-thin));
|
|
541
|
+
}
|
|
542
|
+
}
|
|
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
|
+
}
|