@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.
Files changed (290) hide show
  1. package/CHANGELOG.md +470 -0
  2. package/component-tokens.d.ts +230 -60
  3. package/components.tokens.json +5156 -1557
  4. package/css/accordion.css +47 -20
  5. package/css/alert.css +16 -17
  6. package/css/anchor.css +2 -2
  7. package/css/approval.css +41 -17
  8. package/css/avatar-group.css +9 -12
  9. package/css/avatar.css +20 -18
  10. package/css/back-top.css +21 -7
  11. package/css/badge.css +5 -5
  12. package/css/breadcrumb.css +18 -16
  13. package/css/button-group.css +4 -6
  14. package/css/button.css +13 -12
  15. package/css/calendar-picker.css +178 -95
  16. package/css/calendar-range-picker.css +207 -122
  17. package/css/card.css +34 -6
  18. package/css/carousel.css +94 -46
  19. package/css/cartesian-chart.css +11 -11
  20. package/css/cascader.css +51 -39
  21. package/css/checkbox-group.css +9 -6
  22. package/css/checkbox.css +5 -4
  23. package/css/citation.css +9 -4
  24. package/css/clipboard.css +20 -4
  25. package/css/code-view.css +6 -6
  26. package/css/collapsible.css +29 -14
  27. package/css/color-field.css +4 -4
  28. package/css/color-picker.css +77 -23
  29. package/css/color-slider.css +10 -8
  30. package/css/color-swatch-picker.css +14 -9
  31. package/css/combobox.css +26 -14
  32. package/css/command.css +14 -9
  33. package/css/context-menu.css +10 -5
  34. package/css/date-field.css +12 -6
  35. package/css/date-picker.css +178 -109
  36. package/css/date-range-picker.css +199 -130
  37. package/css/description.css +10 -6
  38. package/css/descriptions.css +47 -19
  39. package/css/dialog.css +50 -35
  40. package/css/diff-view.css +8 -8
  41. package/css/drawer.css +75 -21
  42. package/css/editable.css +15 -41
  43. package/css/empty-state.css +21 -3
  44. package/css/field-array.css +5 -2
  45. package/css/field.css +17 -18
  46. package/css/fieldset.css +33 -13
  47. package/css/file-upload.css +66 -33
  48. package/css/float-button.css +60 -35
  49. package/css/floating-panel.css +1 -1
  50. package/css/form.css +30 -16
  51. package/css/graph-chart.css +2 -2
  52. package/css/grid-list.css +1 -1
  53. package/css/highlight.css +5 -5
  54. package/css/hover-card.css +19 -12
  55. package/css/image-viewer.css +77 -27
  56. package/css/image.css +13 -5
  57. package/css/infinite-scroll.css +8 -4
  58. package/css/input-group.css +74 -26
  59. package/css/kbd.css +1 -1
  60. package/css/label.css +27 -11
  61. package/css/layout.css +17 -10
  62. package/css/list.css +13 -9
  63. package/css/listbox.css +12 -7
  64. package/css/loading-bar.css +3 -0
  65. package/css/mention.css +11 -9
  66. package/css/menu.css +10 -5
  67. package/css/menubar.css +13 -8
  68. package/css/message-feed.css +1 -1
  69. package/css/navigation-menu.css +2 -2
  70. package/css/notification.css +132 -49
  71. package/css/number-animation.css +2 -2
  72. package/css/number-field.css +75 -52
  73. package/css/page-header.css +64 -27
  74. package/css/pagination.css +35 -38
  75. package/css/password-input.css +12 -68
  76. package/css/pin-input.css +18 -26
  77. package/css/popconfirm.css +23 -14
  78. package/css/popover.css +18 -12
  79. package/css/progress.css +14 -13
  80. package/css/prompt-input.css +3 -3
  81. package/css/question-flow.css +41 -15
  82. package/css/radar-chart.css +6 -6
  83. package/css/radio-group.css +120 -55
  84. package/css/rating.css +32 -15
  85. package/css/select.css +16 -12
  86. package/css/separator.css +24 -6
  87. package/css/side-nav.css +29 -24
  88. package/css/signature-pad.css +23 -9
  89. package/css/skeleton.css +12 -12
  90. package/css/slider.css +77 -48
  91. package/css/sortable.css +2 -2
  92. package/css/sparkline.css +8 -2
  93. package/css/spinner.css +40 -20
  94. package/css/statistic.css +14 -14
  95. package/css/steps.css +115 -84
  96. package/css/switch.css +9 -7
  97. package/css/table.css +29 -12
  98. package/css/tabs.css +35 -12
  99. package/css/tag-group.css +17 -6
  100. package/css/tag.css +54 -29
  101. package/css/tags-input.css +39 -20
  102. package/css/text-field.css +5 -5
  103. package/css/time-field.css +4 -4
  104. package/css/time-picker.css +150 -64
  105. package/css/time-range-picker.css +91 -62
  106. package/css/timeline.css +37 -20
  107. package/css/timer.css +3 -3
  108. package/css/toggle-group.css +4 -4
  109. package/css/tool-call.css +13 -11
  110. package/css/toolbar.css +6 -5
  111. package/css/tooltip.css +16 -17
  112. package/css/tour.css +14 -7
  113. package/css/transfer.css +22 -16
  114. package/css/tree-select.css +12 -12
  115. package/css/tree.css +26 -25
  116. package/css/typography.css +28 -25
  117. package/dist/css/accordion.css +296 -0
  118. package/dist/css/affix.css +47 -0
  119. package/dist/css/alert.css +246 -0
  120. package/dist/css/anchor.css +252 -0
  121. package/dist/css/approval.css +525 -0
  122. package/dist/css/avatar-group.css +96 -0
  123. package/dist/css/avatar.css +100 -0
  124. package/dist/css/back-top.css +175 -0
  125. package/dist/css/badge.css +205 -0
  126. package/dist/css/bar-code.css +62 -0
  127. package/dist/css/breadcrumb.css +232 -0
  128. package/dist/css/button-group.css +261 -0
  129. package/dist/css/button.css +216 -0
  130. package/dist/css/calendar-picker.css +550 -0
  131. package/dist/css/calendar-range-picker.css +639 -0
  132. package/dist/css/card.css +249 -0
  133. package/dist/css/carousel.css +726 -0
  134. package/dist/css/cartesian-chart.css +830 -0
  135. package/dist/css/cascader.css +973 -0
  136. package/dist/css/checkbox-group.css +361 -0
  137. package/dist/css/checkbox.css +258 -0
  138. package/dist/css/citation.css +475 -0
  139. package/dist/css/clipboard.css +331 -0
  140. package/dist/css/code-view.css +374 -0
  141. package/dist/css/collapsible.css +200 -0
  142. package/dist/css/color-field.css +176 -0
  143. package/dist/css/color-picker.css +649 -0
  144. package/dist/css/color-slider.css +283 -0
  145. package/dist/css/color-swatch-picker.css +250 -0
  146. package/dist/css/color-swatch.css +35 -0
  147. package/dist/css/combobox.css +578 -0
  148. package/dist/css/command.css +404 -0
  149. package/dist/css/context-menu.css +425 -0
  150. package/dist/css/date-field.css +317 -0
  151. package/dist/css/date-picker.css +931 -0
  152. package/dist/css/date-range-picker.css +949 -0
  153. package/dist/css/description.css +71 -0
  154. package/dist/css/descriptions.css +327 -0
  155. package/dist/css/dialog.css +470 -0
  156. package/dist/css/diff-view.css +513 -0
  157. package/dist/css/download-trigger.css +151 -0
  158. package/dist/css/drawer.css +606 -0
  159. package/dist/css/editable.css +269 -0
  160. package/dist/css/empty-state.css +181 -0
  161. package/dist/css/field-array.css +229 -0
  162. package/dist/css/field.css +165 -0
  163. package/dist/css/fieldset.css +122 -0
  164. package/dist/css/file-upload.css +462 -0
  165. package/dist/css/flex.css +441 -0
  166. package/dist/css/float-button.css +579 -0
  167. package/dist/css/floating-panel.css +429 -0
  168. package/dist/css/focus.css +46 -0
  169. package/dist/css/forced-colors.css +93 -0
  170. package/dist/css/form.css +407 -0
  171. package/dist/css/funnel-chart.css +106 -0
  172. package/dist/css/graph-chart.css +205 -0
  173. package/dist/css/grid-list.css +235 -0
  174. package/dist/css/grid.css +1201 -0
  175. package/dist/css/heatmap.css +552 -0
  176. package/dist/css/hierarchy-chart.css +298 -0
  177. package/dist/css/highlight.css +41 -0
  178. package/dist/css/hover-card.css +233 -0
  179. package/dist/css/icon.css +225 -0
  180. package/dist/css/image-cropper.css +373 -0
  181. package/dist/css/image-viewer.css +588 -0
  182. package/dist/css/image.css +106 -0
  183. package/dist/css/infinite-scroll.css +81 -0
  184. package/dist/css/input-group.css +323 -0
  185. package/dist/css/json-viewer.css +379 -0
  186. package/dist/css/kbd.css +72 -0
  187. package/dist/css/label.css +94 -0
  188. package/dist/css/layers.css +7 -0
  189. package/dist/css/layout.css +379 -0
  190. package/dist/css/liquid.css +106 -0
  191. package/dist/css/list.css +156 -0
  192. package/dist/css/listbox.css +395 -0
  193. package/dist/css/loading-bar.css +144 -0
  194. package/dist/css/log.css +306 -0
  195. package/dist/css/markdown-stream.css +149 -0
  196. package/dist/css/marquee.css +378 -0
  197. package/dist/css/masonry.css +70 -0
  198. package/dist/css/matrix-code.css +67 -0
  199. package/dist/css/mention.css +395 -0
  200. package/dist/css/menu.css +369 -0
  201. package/dist/css/menubar.css +461 -0
  202. package/dist/css/message-feed.css +318 -0
  203. package/dist/css/navigation-menu.css +513 -0
  204. package/dist/css/notification.css +865 -0
  205. package/dist/css/number-animation.css +44 -0
  206. package/dist/css/number-field.css +275 -0
  207. package/dist/css/overlay-arrow.css +56 -0
  208. package/dist/css/page-header.css +221 -0
  209. package/dist/css/pagination.css +447 -0
  210. package/dist/css/password-input.css +335 -0
  211. package/dist/css/pie-chart.css +247 -0
  212. package/dist/css/pin-input.css +191 -0
  213. package/dist/css/pointer.css +36 -0
  214. package/dist/css/popconfirm.css +329 -0
  215. package/dist/css/popover.css +285 -0
  216. package/dist/css/progress.css +502 -0
  217. package/dist/css/prompt-input.css +260 -0
  218. package/dist/css/question-flow.css +579 -0
  219. package/dist/css/radar-chart.css +233 -0
  220. package/dist/css/radio-group.css +663 -0
  221. package/dist/css/rating.css +311 -0
  222. package/dist/css/reasoning.css +343 -0
  223. package/dist/css/reset.css +117 -0
  224. package/dist/css/resizable.css +242 -0
  225. package/dist/css/sankey-chart.css +174 -0
  226. package/dist/css/scroll-area.css +240 -0
  227. package/dist/css/scrollbar.css +204 -0
  228. package/dist/css/select.css +616 -0
  229. package/dist/css/separator.css +140 -0
  230. package/dist/css/side-nav.css +481 -0
  231. package/dist/css/signature-pad.css +193 -0
  232. package/dist/css/skeleton.css +161 -0
  233. package/dist/css/slider.css +403 -0
  234. package/dist/css/sortable.css +228 -0
  235. package/dist/css/sparkline.css +170 -0
  236. package/dist/css/spinner.css +256 -0
  237. package/dist/css/splitter.css +159 -0
  238. package/dist/css/statistic.css +137 -0
  239. package/dist/css/steps.css +658 -0
  240. package/dist/css/switch.css +353 -0
  241. package/dist/css/table.css +1162 -0
  242. package/dist/css/tabs.css +967 -0
  243. package/dist/css/tag-group.css +258 -0
  244. package/dist/css/tag.css +335 -0
  245. package/dist/css/tags-input.css +341 -0
  246. package/dist/css/text-field.css +197 -0
  247. package/dist/css/time-field.css +277 -0
  248. package/dist/css/time-picker.css +793 -0
  249. package/dist/css/time-range-picker.css +775 -0
  250. package/dist/css/timeline.css +440 -0
  251. package/dist/css/timer.css +123 -0
  252. package/dist/css/timestamp.css +34 -0
  253. package/dist/css/toggle-group.css +424 -0
  254. package/dist/css/toggle.css +146 -0
  255. package/dist/css/tone.css +189 -0
  256. package/dist/css/tool-call.css +431 -0
  257. package/dist/css/toolbar.css +366 -0
  258. package/dist/css/tooltip.css +217 -0
  259. package/dist/css/tour.css +446 -0
  260. package/dist/css/transfer.css +644 -0
  261. package/dist/css/tree-select.css +878 -0
  262. package/dist/css/tree.css +734 -0
  263. package/dist/css/truncate.css +108 -0
  264. package/dist/css/typography.css +475 -0
  265. package/dist/css/undefined.css +58 -0
  266. package/dist/css/virtualizer.css +166 -0
  267. package/dist/css/visually-hidden.css +20 -0
  268. package/dist/css/watermark.css +82 -0
  269. package/dist/family/action-control.css +493 -0
  270. package/dist/family/chart.css +537 -0
  271. package/dist/family/check-mark.css +94 -0
  272. package/dist/family/choice-card.css +97 -0
  273. package/dist/family/collection-item.css +768 -0
  274. package/dist/family/field-chrome.css +296 -0
  275. package/dist/family/loading-ring.css +102 -0
  276. package/dist/family/material.css +72 -0
  277. package/dist/family/menu-choice.css +56 -0
  278. package/dist/family/motion.css +363 -0
  279. package/dist/family/swatch.css +59 -0
  280. package/dist/family/tag-list.css +65 -0
  281. package/family/action-control.css +33 -36
  282. package/family/chart.css +57 -0
  283. package/family/collection-item.css +12 -8
  284. package/family/field-chrome.css +28 -19
  285. package/family/loading-ring.css +20 -13
  286. package/family/swatch.css +4 -4
  287. package/family/tag-list.css +6 -0
  288. package/index.css +10349 -8756
  289. package/index.unlayered.css +10350 -8758
  290. package/package.json +165 -164
@@ -0,0 +1,830 @@
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
+ /* 定义 cartesian chart 样式。 */
7
+
8
+ /* 描线与淡入关键帧由 family/motion.css 提供;标题、视口、图例、提示框、空态、焦点环与引导线走 Chart 家族配方。
9
+ 本皮肤 @import 它们,单独引入仍成立。 */
10
+ @import '../family/motion.css';
11
+ @import '../family/chart.css';
12
+ @import '../family/loading-ring.css';
13
+
14
+ @layer xihan.components {
15
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
16
+ .xh-scope-cartesian-chart {
17
+ --xh-cartesian-chart-skin: 1;
18
+ }
19
+
20
+ /* 几何要用的像素值以这里的私有槽为真源:机器挂载后从计算样式读它们,作者覆盖组件槽即改变几何 */
21
+ .xh-scope-cartesian-chart[data-part='root'] {
22
+ --xh-_chart-metric-bar-max: var(--xh-cartesian-chart-bar-max, var(--xh-chart-bar-max));
23
+ --xh-_chart-metric-gap: var(--xh-chart-gap);
24
+ --xh-_chart-metric-line-width: var(--xh-cartesian-chart-line-width, var(--xh-chart-line-width));
25
+ --xh-_chart-metric-point-size: var(--xh-cartesian-chart-point-size, var(--xh-chart-point-size));
26
+ --xh-_chart-metric-hit-min: var(--xh-chart-hit-min);
27
+ --xh-_chart-metric-tick-length: var(--xh-chart-tick-length);
28
+ --xh-_chart-metric-label-gap: var(--xh-chart-label-gap);
29
+ --xh-_chart-metric-radius: var(--xh-cartesian-chart-bar-radius, var(--xh-shape-inset));
30
+ --xh-_chart-metric-font-size: var(--xh-text-caption-size);
31
+ --xh-_chart-metric-leading: var(--xh-leading-tight);
32
+ --xh-_chart-gap: var(--xh-cartesian-chart-gap, var(--xh-space-3));
33
+ }
34
+
35
+ /* —— 家族配方的组件槽:标题、视口、图例、提示框与空态由 family/chart.css 画,本图表的覆盖槽写在
36
+ 对应部件上接进配方的私有槽,作者在部件或它的祖先上覆盖都生效 —— */
37
+ .xh-scope-cartesian-chart[data-part='viewport'] {
38
+ --xh-_chart-height: var(--xh-cartesian-chart-height, var(--xh-chart-height));
39
+ }
40
+
41
+ .xh-scope-cartesian-chart[data-part='legend'] {
42
+ --xh-_chart-legend-gap: var(--xh-cartesian-chart-legend-gap, var(--xh-space-1));
43
+ }
44
+
45
+ .xh-scope-cartesian-chart[data-part='legend-swatch'] {
46
+ --xh-_chart-legend-swatch-radius: var(--xh-cartesian-chart-legend-swatch-radius, var(--xh-shape-inset));
47
+ }
48
+
49
+ .xh-scope-cartesian-chart[data-part='legend-swatch'][data-mark='line'] {
50
+ --xh-_chart-legend-swatch-line-radius: var(--xh-cartesian-chart-legend-swatch-line-radius, var(--xh-shape-pill));
51
+ }
52
+
53
+ .xh-scope-cartesian-chart[data-part='tooltip'] {
54
+ --xh-_chart-tooltip-gap: var(--xh-cartesian-chart-tooltip-gap, var(--xh-space-1));
55
+ --xh-_chart-tooltip-py: var(--xh-cartesian-chart-tooltip-py, var(--xh-surface-pad-sm));
56
+ --xh-_chart-tooltip-px: var(--xh-cartesian-chart-tooltip-px, var(--xh-surface-pad-sm));
57
+ --xh-_chart-tooltip-radius: var(--xh-cartesian-chart-tooltip-radius, var(--xh-shape-overlay));
58
+ --xh-_chart-tooltip-shadow: var(--xh-cartesian-chart-tooltip-shadow, var(--xh-material-frosted-shadow));
59
+ }
60
+
61
+ .xh-scope-cartesian-chart[data-part='tooltip-row'] {
62
+ --xh-_chart-tooltip-row-gap: var(--xh-cartesian-chart-tooltip-row-gap, var(--xh-space-2));
63
+ }
64
+
65
+ .xh-scope-cartesian-chart[data-part='tooltip-swatch'] {
66
+ --xh-_chart-tooltip-swatch-radius: var(--xh-cartesian-chart-tooltip-swatch-radius, var(--xh-shape-inset));
67
+ }
68
+
69
+ .xh-scope-cartesian-chart[data-part='tooltip-swatch'][data-mark='line'] {
70
+ --xh-_chart-tooltip-swatch-line-radius: var(--xh-cartesian-chart-tooltip-swatch-line-radius, var(--xh-shape-pill));
71
+ }
72
+
73
+ /* 散点的色标画成点的形状:圆取整圆,方块沿用色标的缺省圆角,其余形状按裁切多边形画出 */
74
+ .xh-scope-cartesian-chart[data-part='legend-swatch'][data-symbol='circle'] {
75
+ --xh-_chart-legend-swatch-radius: var(--xh-shape-circle);
76
+ }
77
+
78
+ .xh-scope-cartesian-chart[data-part='tooltip-swatch'][data-symbol='circle'] {
79
+ --xh-_chart-tooltip-swatch-radius: var(--xh-shape-circle);
80
+ }
81
+
82
+ .xh-scope-cartesian-chart[data-symbol='diamond'] {
83
+ --xh-_chart-symbol-clip: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
84
+ }
85
+
86
+ .xh-scope-cartesian-chart[data-symbol='triangle'] {
87
+ --xh-_chart-symbol-clip: polygon(50% 0, 100% 100%, 0 100%);
88
+ }
89
+
90
+ .xh-scope-cartesian-chart[data-symbol='triangleDown'] {
91
+ --xh-_chart-symbol-clip: polygon(0 0, 100% 0, 50% 100%);
92
+ }
93
+
94
+ .xh-scope-cartesian-chart[data-symbol='cross'] {
95
+ --xh-_chart-symbol-clip: polygon(35% 0, 65% 0, 65% 35%, 100% 35%, 100% 65%, 65% 65%, 65% 100%, 35% 100%, 35% 65%, 0 65%, 0 35%, 35% 35%);
96
+ }
97
+
98
+ .xh-scope-cartesian-chart[data-symbol='star'] {
99
+ --xh-_chart-symbol-clip: polygon(50% 0, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
100
+ }
101
+
102
+ .xh-scope-cartesian-chart[data-symbol='wye'] {
103
+ --xh-_chart-symbol-clip: polygon(38% 0, 62% 0, 62% 42%, 98% 70%, 86% 88%, 50% 60%, 14% 88%, 2% 70%, 38% 42%);
104
+ }
105
+
106
+ .xh-scope-cartesian-chart[data-part='legend-swatch'][data-mark='point'],
107
+ .xh-scope-cartesian-chart[data-part='tooltip-swatch'][data-mark='point'] {
108
+ clip-path: var(--xh-_chart-symbol-clip, none);
109
+ }
110
+
111
+ /* 裁切出来的形状画不出空心:隐藏的项改为淡出,名字的删除线与次级字色照常 */
112
+ .xh-scope-cartesian-chart[data-part='legend-item'][aria-pressed='false'] > [data-part='legend-swatch'][data-mark='point']:where(.xh-scope-cartesian-chart):not([data-symbol='circle'], [data-symbol='square']) {
113
+ background: var(--xh-_chart-series);
114
+ opacity: var(--xh-chart-dim-alpha);
115
+ }
116
+
117
+ /* 色阶图例:名字、低端的值、渐变条、高端的值排成一行,跟在图例项后面;值是标注字色、等宽数字 */
118
+ .xh-scope-cartesian-chart[data-part='legend-scale'] {
119
+ display: inline-flex;
120
+ align-items: center;
121
+ gap: var(--xh-cartesian-chart-legend-scale-gap, var(--xh-space-2));
122
+ color: var(--xh-fg-muted);
123
+ font-size: var(--xh-text-caption-size);
124
+ font-variant-numeric: tabular-nums;
125
+ }
126
+
127
+ .xh-scope-cartesian-chart[data-part='legend-scale-name'] {
128
+ color: var(--xh-fg-default);
129
+ font-size: var(--xh-text-body-size);
130
+ }
131
+
132
+ .xh-scope-cartesian-chart[data-part='legend-scale-bar'] {
133
+ inline-size: var(--xh-cartesian-chart-legend-scale-width, var(--xh-chart-legend-scale-width));
134
+ block-size: var(--xh-space-2);
135
+ border-radius: var(--xh-cartesian-chart-legend-scale-bar-radius, var(--xh-shape-inset));
136
+ background: linear-gradient(to right, var(--xh-_chart-scale-from), var(--xh-_chart-seq-mid) 28.6%, var(--xh-_chart-seq-end));
137
+ /* 点只用色阶上 0.3–1 这一段(最浅的一段压在承载面上看不见):渐变按同一段画,起点即 0.3 处的颜色,
138
+ 中点落在 (0.5 − 0.3) / 0.7 处 */
139
+ --xh-_chart-scale-from: color-mix(in oklch, var(--xh-_chart-seq-mid) 60%, var(--xh-_chart-seq-start));
140
+ }
141
+
142
+ /* 图例随文字方向镜像:低端的值在行首,渐变也从行首起 */
143
+ :where([dir='rtl']) .xh-scope-cartesian-chart[data-part='legend-scale-bar'] {
144
+ background: linear-gradient(to left, var(--xh-_chart-scale-from), var(--xh-_chart-seq-mid) 28.6%, var(--xh-_chart-seq-end));
145
+ }
146
+
147
+ /* —— 画布模式:数据层画在画布上,三层叠在视口里——垫层 svg(网格、坐标轴、参考带、准线)在最下,
148
+ 画布在中间,绘图区在最上(系列分组、前景、焦点代理与焦点环,指针与键盘都在它上面)。
149
+ 垫层与绘图区同一套排版:刻度标签的字号与等宽数字一致;两层都不接指针 —— */
150
+ .xh-scope-cartesian-chart[data-part='underlay'] {
151
+ position: absolute;
152
+ inset: 0;
153
+ display: block;
154
+ inline-size: 100%;
155
+ block-size: 100%;
156
+ overflow: visible;
157
+ font-size: var(--xh-_chart-metric-font-size);
158
+ font-variant-numeric: tabular-nums;
159
+ pointer-events: none;
160
+ }
161
+
162
+ /* 画布铺满视口,后备尺寸按 DPR 由机器设;没有可画的数据时淡出,数据到来淡入 */
163
+ .xh-scope-cartesian-chart[data-part='canvas'] {
164
+ position: absolute;
165
+ inset: 0;
166
+ display: block;
167
+ inline-size: 100%;
168
+ block-size: 100%;
169
+ pointer-events: none;
170
+ transition: opacity var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
171
+ }
172
+
173
+ .xh-scope-cartesian-chart[data-part='canvas'][data-empty] {
174
+ opacity: 0;
175
+ transition-duration: var(--xh-motion-duration-exit);
176
+ transition-timing-function: var(--xh-motion-ease-exit);
177
+ }
178
+
179
+ .xh-scope-cartesian-chart[data-part='underlay'][hidden],
180
+ .xh-scope-cartesian-chart[data-part='canvas'][hidden] {
181
+ display: none;
182
+ }
183
+
184
+ /* —— 缩放与刷选:能缩放或刷选的方向上触屏的拖动与捏合归绘图区,另一个方向照常滚动页面;
185
+ 放大后指针是可拖动的手,拖着时是抓住的手;开了刷选时指针是十字,拖动即框选 —— */
186
+ .xh-scope-cartesian-chart[data-part='plot'][data-touch-axis='horizontal'] {
187
+ touch-action: pan-y;
188
+ }
189
+
190
+ .xh-scope-cartesian-chart[data-part='plot'][data-touch-axis='vertical'] {
191
+ touch-action: pan-x;
192
+ }
193
+
194
+ .xh-scope-cartesian-chart[data-part='plot'][data-touch-axis='both'] {
195
+ touch-action: none;
196
+ }
197
+
198
+ .xh-scope-cartesian-chart[data-part='plot'][data-zoomed] {
199
+ cursor: grab;
200
+ }
201
+
202
+ .xh-scope-cartesian-chart[data-part='plot'][data-dragging] {
203
+ cursor: grabbing;
204
+ }
205
+
206
+ .xh-scope-cartesian-chart[data-part='plot'][data-selectable] {
207
+ cursor: crosshair;
208
+ }
209
+
210
+ /* 缩放条:淡底的轨道上,窗口是选中区(品牌淡底),两端的手柄是品牌色的竖条。它对着自变量轴的整条轴;
211
+ 绘图区不随 RTL 镜像,缩放条也不镜像,左右是物理方向 */
212
+ .xh-scope-cartesian-chart[data-part='zoom-slider'] {
213
+ position: relative;
214
+ /* stylelint-disable-next-line property-disallowed-list, declaration-property-value-disallowed-list -- 缩放条不随 RTL 镜像,左右内缩对着绘图区的物理两边 */
215
+ margin-left: var(--xh-_chart-zoom-left, 0);
216
+ /* stylelint-disable-next-line property-disallowed-list, declaration-property-value-disallowed-list -- 同上 */
217
+ margin-right: var(--xh-_chart-zoom-right, 0);
218
+ block-size: var(--xh-cartesian-chart-zoom-h, var(--xh-space-6));
219
+ touch-action: none;
220
+ user-select: none;
221
+ }
222
+
223
+ .xh-scope-cartesian-chart[data-part='zoom-track'] {
224
+ position: absolute;
225
+ inset: 0;
226
+ /* 手柄与缩略线的层号只在轨道里排 */
227
+ isolation: isolate;
228
+ border-radius: var(--xh-cartesian-chart-zoom-track-radius, var(--xh-shape-inset));
229
+ background: var(--xh-cartesian-chart-zoom-track-bg, var(--xh-bg-subtle));
230
+ }
231
+
232
+ .xh-scope-cartesian-chart[data-part='zoom-window'] {
233
+ position: absolute;
234
+ inset-block: 0;
235
+ /* stylelint-disable-next-line property-disallowed-list -- 缩放条不随 RTL 镜像,窗口两端是物理的左右 */
236
+ left: var(--xh-_chart-zoom-start, 0%);
237
+ /* stylelint-disable-next-line property-disallowed-list -- 同上 */
238
+ right: calc(100% - var(--xh-_chart-zoom-end, 100%));
239
+ border-radius: var(--xh-cartesian-chart-zoom-window-radius, var(--xh-shape-inset));
240
+ background: var(--xh-cartesian-chart-zoom-window-bg, var(--xh-bg-brand-subtle));
241
+ cursor: grab;
242
+ }
243
+
244
+ .xh-scope-cartesian-chart[data-part='zoom-slider'][data-dragging] [data-part='zoom-window']:where(.xh-scope-cartesian-chart) {
245
+ cursor: grabbing;
246
+ }
247
+
248
+ /* 缩略线:整条轴上的走势,弱化色的细线铺满轨道,压在窗口的淡底之上、手柄之下;指针穿过它落到轨道与窗口上 */
249
+ .xh-scope-cartesian-chart[data-part='zoom-preview'] {
250
+ position: absolute;
251
+ inset: 0;
252
+ inline-size: 100%;
253
+ block-size: 100%;
254
+ overflow: visible;
255
+ pointer-events: none;
256
+ }
257
+
258
+ .xh-scope-cartesian-chart[data-part='zoom-preview-line'] {
259
+ fill: none;
260
+ stroke: var(--xh-cartesian-chart-zoom-preview-color, var(--xh-chart-deemphasis));
261
+ stroke-width: var(--xh-stroke-thin);
262
+ stroke-linejoin: round;
263
+ }
264
+
265
+ /* 手柄骑在窗口的两端:一半在窗口里、一半在外,拖它改窗口的一端;键盘聚焦时画焦点环 */
266
+ .xh-scope-cartesian-chart[data-part='zoom-handle'] {
267
+ position: absolute;
268
+ inset-block: 0;
269
+ inline-size: var(--xh-cartesian-chart-zoom-handle-w, var(--xh-space-2));
270
+ border-radius: var(--xh-cartesian-chart-zoom-handle-radius, var(--xh-shape-inset));
271
+ background: var(--xh-cartesian-chart-zoom-handle-bg, var(--xh-bg-brand));
272
+ /* 竖条上没有字:补一支与品牌面配对的墨色,聚焦环取它 */
273
+ color: var(--xh-fg-on-brand);
274
+ cursor: ew-resize;
275
+ translate: -50% 0;
276
+ /* 压在缩略线之上 */
277
+ z-index: 1;
278
+ }
279
+
280
+ /* 手柄只有竖条那么宽:命中区向两侧各外扩一截,补到与缩放条一样高的正方 */
281
+ .xh-scope-cartesian-chart[data-part='zoom-handle']::before {
282
+ content: '';
283
+ position: absolute;
284
+ inset-block: 0;
285
+ inset-inline: calc(-1 * var(--xh-space-2));
286
+ }
287
+
288
+ .xh-scope-cartesian-chart[data-part='zoom-handle'][data-placement='start'] {
289
+ /* stylelint-disable-next-line property-disallowed-list -- 缩放条不随 RTL 镜像 */
290
+ left: 0;
291
+ }
292
+
293
+ .xh-scope-cartesian-chart[data-part='zoom-handle'][data-placement='end'] {
294
+ /* stylelint-disable-next-line property-disallowed-list -- 缩放条不随 RTL 镜像 */
295
+ left: 100%;
296
+ }
297
+
298
+ /* 环往内收、压在品牌色的竖条上:换成与面配对的前景色才看得见 */
299
+ .xh-scope-cartesian-chart[data-part='zoom-handle']:focus-visible {
300
+ --xh-_ring-color: currentColor;
301
+ }
302
+
303
+ .xh-scope-cartesian-chart[data-part='empty'][data-state='loading'] {
304
+ --xh-_chart-empty-gap: var(--xh-cartesian-chart-empty-gap, var(--xh-space-2));
305
+ }
306
+
307
+ /* —— 色槽:身份由色槽承担,作者可以在系列上覆盖 --xh-cartesian-chart-series-color ——
308
+ 分组、激活的点、图例项与提示框的行都带着色槽,各自从这里取系列色 */
309
+ .xh-scope-cartesian-chart[data-xh-chart-slot='1'] {
310
+ --xh-_chart-series: var(--xh-cartesian-chart-series-color, var(--xh-chart-categorical-1));
311
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-1);
312
+ }
313
+
314
+ .xh-scope-cartesian-chart[data-xh-chart-slot='2'] {
315
+ --xh-_chart-series: var(--xh-cartesian-chart-series-color, var(--xh-chart-categorical-2));
316
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-2);
317
+ }
318
+
319
+ .xh-scope-cartesian-chart[data-xh-chart-slot='3'] {
320
+ --xh-_chart-series: var(--xh-cartesian-chart-series-color, var(--xh-chart-categorical-3));
321
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-3);
322
+ }
323
+
324
+ .xh-scope-cartesian-chart[data-xh-chart-slot='4'] {
325
+ --xh-_chart-series: var(--xh-cartesian-chart-series-color, var(--xh-chart-categorical-4));
326
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-4);
327
+ }
328
+
329
+ .xh-scope-cartesian-chart[data-xh-chart-slot='5'] {
330
+ --xh-_chart-series: var(--xh-cartesian-chart-series-color, var(--xh-chart-categorical-5));
331
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-5);
332
+ }
333
+
334
+ .xh-scope-cartesian-chart[data-xh-chart-slot='6'] {
335
+ --xh-_chart-series: var(--xh-cartesian-chart-series-color, var(--xh-chart-categorical-6));
336
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-6);
337
+ }
338
+
339
+ .xh-scope-cartesian-chart[data-xh-chart-slot='7'] {
340
+ --xh-_chart-series: var(--xh-cartesian-chart-series-color, var(--xh-chart-categorical-7));
341
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-7);
342
+ }
343
+
344
+ .xh-scope-cartesian-chart[data-xh-chart-slot='8'] {
345
+ --xh-_chart-series: var(--xh-cartesian-chart-series-color, var(--xh-chart-categorical-8));
346
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-8);
347
+ }
348
+
349
+ /* 语义系列取语气的实心色:语气层在 [data-tone] 上给出整族取值 */
350
+ .xh-scope-cartesian-chart[data-tone] {
351
+ --xh-_chart-series: var(--xh-cartesian-chart-series-color, var(--xh-_tone));
352
+ --xh-_chart-on-series: var(--xh-_tone-on);
353
+ }
354
+
355
+ /* 按值着色的系列不取分类色:系列色换成色阶中点,图例与提示框的色标跟着取它,点各自按值取色 */
356
+ .xh-scope-cartesian-chart[data-xh-chart-scale='sequential'] {
357
+ --xh-_chart-series: var(--xh-_chart-seq-mid);
358
+ }
359
+
360
+ /* —— 图表家具:不承载数据的结构线 —— */
361
+ .xh-scope-cartesian-chart[data-part='grid-line'] {
362
+ fill: none;
363
+ stroke: var(--xh-chart-grid);
364
+ stroke-width: var(--xh-stroke-thin);
365
+ }
366
+
367
+ .xh-scope-cartesian-chart[data-part='axis-line'],
368
+ .xh-scope-cartesian-chart[data-part='tick'] {
369
+ fill: none;
370
+ stroke: var(--xh-chart-axis);
371
+ stroke-width: var(--xh-stroke-thin);
372
+ }
373
+
374
+ /* 轴标签是次级标注:文字不用系列色 */
375
+ .xh-scope-cartesian-chart[data-part='tick-label'] {
376
+ fill: var(--xh-chart-label);
377
+ }
378
+
379
+ .xh-scope-cartesian-chart[data-part='axis-title'] {
380
+ fill: var(--xh-chart-label);
381
+ font-weight: var(--xh-font-weight-medium);
382
+ }
383
+
384
+ /* —— 数据标记 —— */
385
+ .xh-scope-cartesian-chart[data-part='series'] {
386
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
387
+ }
388
+
389
+ /* 悬停图例或强调一个系列时,其余系列淡出;被强调的保持原样。刷选时框外的数据标记同样淡出 */
390
+ .xh-scope-cartesian-chart[data-part='series'][data-dimmed],
391
+ .xh-scope-cartesian-chart[data-part='series'] [data-dimmed] {
392
+ opacity: var(--xh-chart-dim-alpha);
393
+ }
394
+
395
+ /* 柱:相邻柱之间的间隙由几何留出,不画描边 */
396
+ .xh-scope-cartesian-chart[data-part='bar'] {
397
+ fill: var(--xh-_chart-series);
398
+ stroke: none;
399
+ }
400
+
401
+ /* 瀑布:一步涨取涨色、跌取跌色,小计保持系列色;纹理模式在后面,颜色不可靠时让给纹理,涨跌仍由柱的走向看出 */
402
+ .xh-scope-cartesian-chart[data-part='bar'][data-trend='rise'] {
403
+ fill: var(--xh-chart-rise);
404
+ }
405
+
406
+ .xh-scope-cartesian-chart[data-part='bar'][data-trend='fall'] {
407
+ fill: var(--xh-chart-fall);
408
+ }
409
+
410
+ /* K 线:涨取涨色、跌取跌色(缺省绿涨红跌,主题可以翻过来);实体是方角,影线与美国线是细线 */
411
+ .xh-scope-cartesian-chart[data-trend='rise'] {
412
+ --xh-_chart-trend: var(--xh-chart-rise);
413
+ }
414
+
415
+ .xh-scope-cartesian-chart[data-trend='fall'] {
416
+ --xh-_chart-trend: var(--xh-chart-fall);
417
+ }
418
+
419
+ .xh-scope-cartesian-chart[data-part='candle'] {
420
+ fill: var(--xh-_chart-trend, var(--xh-_chart-series));
421
+ stroke: none;
422
+ }
423
+
424
+ .xh-scope-cartesian-chart[data-part='candle'][data-style='ohlc'],
425
+ .xh-scope-cartesian-chart[data-part='wick'] {
426
+ fill: none;
427
+ stroke: var(--xh-_chart-trend, var(--xh-_chart-series));
428
+ stroke-width: var(--xh-stroke-thin);
429
+ }
430
+
431
+ .xh-scope-cartesian-chart[data-part='candle'][data-style='ohlc'] {
432
+ stroke-width: var(--xh-_chart-metric-line-width);
433
+ }
434
+
435
+ /* 箱线:箱铺系列色的淡洗、描出轮廓,中位线加粗,须线细线;离群点是空心小圆。小提琴同箱的画法 */
436
+ .xh-scope-cartesian-chart[data-part='box'] {
437
+ fill: var(--xh-_chart-series);
438
+ fill-opacity: var(--xh-chart-area-alpha);
439
+ stroke: var(--xh-_chart-series);
440
+ stroke-width: var(--xh-stroke-thin);
441
+ }
442
+
443
+ .xh-scope-cartesian-chart[data-part='median'] {
444
+ fill: none;
445
+ stroke: var(--xh-_chart-series);
446
+ stroke-width: var(--xh-_chart-metric-line-width);
447
+ }
448
+
449
+ .xh-scope-cartesian-chart[data-part='whisker'] {
450
+ fill: none;
451
+ stroke: var(--xh-_chart-series);
452
+ stroke-width: var(--xh-stroke-thin);
453
+ }
454
+
455
+ .xh-scope-cartesian-chart[data-part='outlier'] {
456
+ fill: var(--xh-chart-surface);
457
+ stroke: var(--xh-_chart-series);
458
+ stroke-width: var(--xh-stroke-thin);
459
+ }
460
+
461
+ /* 棒棒糖的细杆:系列色的线,杆顶的点沿用点的画法(系列色加一圈承载面色的描边环) */
462
+ .xh-scope-cartesian-chart[data-part='stem'] {
463
+ fill: none;
464
+ stroke: var(--xh-_chart-series);
465
+ stroke-width: var(--xh-_chart-metric-line-width);
466
+ }
467
+
468
+ /* 瀑布的连接线:上一步的终点连到下一步的起点,结构色的细线 */
469
+ .xh-scope-cartesian-chart[data-part='connector'] {
470
+ fill: none;
471
+ stroke: var(--xh-chart-axis);
472
+ stroke-width: var(--xh-stroke-thin);
473
+ pointer-events: none;
474
+ }
475
+
476
+ .xh-scope-cartesian-chart[data-part='line'] {
477
+ fill: none;
478
+ stroke: var(--xh-_chart-series);
479
+ stroke-width: var(--xh-_chart-metric-line-width);
480
+ stroke-linejoin: round;
481
+ stroke-linecap: round;
482
+ }
483
+
484
+ /* 新出现的折线从头描到尾:连接层在它入场的这一轮写 data-drawing 与 pathLength="1",
485
+ 过渡结束即撤掉;与柱从基线长出同一档时长 */
486
+ .xh-scope-cartesian-chart[data-part='line'][data-drawing] {
487
+ stroke-dasharray: 1;
488
+ animation: xh-draw var(--xh-motion-duration-reveal) var(--xh-motion-ease-continuous) both;
489
+ }
490
+
491
+ /* 数据点与折线上的标签等描线的笔尖扫到才淡入,柱的标签等柱快长完、合计与线尾标签最后淡入:
492
+ 连接层写入它占入场时长的比例,乘上入场时长就是延迟,作者改时长、系统开减弱动效时跟着缩放 */
493
+ .xh-scope-cartesian-chart[data-part='dot'][data-drawing],
494
+ .xh-scope-cartesian-chart[data-part='data-label'][data-drawing],
495
+ .xh-scope-cartesian-chart[data-part='total-label'][data-drawing],
496
+ .xh-scope-cartesian-chart[data-part='end-label'][data-drawing],
497
+ .xh-scope-cartesian-chart[data-part='annotation'][data-drawing],
498
+ .xh-scope-cartesian-chart[data-part='annotation-label'][data-drawing] {
499
+ animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) both;
500
+ animation-delay: calc(var(--xh-motion-duration-reveal) * var(--xh-_chart-reveal-at));
501
+ }
502
+
503
+ /* 减弱动效下折线直接在场,只随过渡淡入:作者在图上放慢了时长也不描线,与柱的几何直接到位同一条规则。
504
+ 两组规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
505
+ @media (prefers-reduced-motion: reduce) {
506
+ .xh-scope-cartesian-chart[data-part='line'][data-drawing] {
507
+ animation: none;
508
+ }
509
+ }
510
+
511
+ :where([data-motion='reduce']) .xh-scope-cartesian-chart[data-part='line'][data-drawing] {
512
+ animation: none;
513
+ }
514
+
515
+ /* 面积:系列色淡洗,上沿是同一条实色折线 */
516
+ .xh-scope-cartesian-chart[data-part='area-fill'] {
517
+ fill: var(--xh-_chart-series);
518
+ fill-opacity: var(--xh-chart-area-alpha);
519
+ stroke: none;
520
+ }
521
+
522
+ /* 点带一圈承载面色的描边环,压在线上也分得开 */
523
+ .xh-scope-cartesian-chart[data-part='dot'],
524
+ .xh-scope-cartesian-chart[data-part='point'] {
525
+ fill: var(--xh-_chart-series);
526
+ stroke: var(--xh-chart-surface);
527
+ stroke-width: var(--xh-chart-gap);
528
+ }
529
+
530
+ /* 按值着色的点:颜色由 Chart 家族配方按段号与段内百分比兑好,放在私有槽里 */
531
+ .xh-scope-cartesian-chart[data-part='point'][data-seg] {
532
+ fill: var(--xh-_chart-seq-fill);
533
+ }
534
+
535
+ /* 数据标签、堆叠合计与线尾标签是标注:标注字色,不取系列色,不接指针 */
536
+ .xh-scope-cartesian-chart[data-part='data-label'],
537
+ .xh-scope-cartesian-chart[data-part='total-label'],
538
+ .xh-scope-cartesian-chart[data-part='end-label'] {
539
+ fill: var(--xh-chart-label);
540
+ pointer-events: none;
541
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
542
+ }
543
+
544
+ /* 线尾标签被推开时的引导线:画法在配方里,与饼图同一副;它压在标记上,不接指针,随系列淡出时带过渡 */
545
+ .xh-scope-cartesian-chart[data-part='leader-line'] {
546
+ pointer-events: none;
547
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
548
+ }
549
+
550
+ /* —— 注释:帮读者读数的参照,只给眼睛看、不接指针。参考线是结构色的虚线(虚线表达阈值与推算),
551
+ 参考带是整条的淡底;标出的点、平均线与趋势线跟着系列取系列色,随系列淡出 —— */
552
+ .xh-scope-cartesian-chart[data-part='annotation'] {
553
+ fill: none;
554
+ stroke: var(--xh-chart-label);
555
+ stroke-width: var(--xh-stroke-thin);
556
+ stroke-dasharray: calc(var(--xh-_chart-metric-line-width) * 2) calc(var(--xh-_chart-metric-line-width) * 2);
557
+ pointer-events: none;
558
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
559
+ }
560
+
561
+ .xh-scope-cartesian-chart[data-part='annotation'][data-kind='band'] {
562
+ fill: var(--xh-chart-band-highlight);
563
+ stroke: none;
564
+ }
565
+
566
+ .xh-scope-cartesian-chart[data-part='annotation'][data-kind='average'],
567
+ .xh-scope-cartesian-chart[data-part='annotation'][data-kind='trend'] {
568
+ stroke: var(--xh-_chart-series);
569
+ stroke-width: var(--xh-stroke-thick);
570
+ }
571
+
572
+ /* 三种线各有线型:数据是实线,移动平均是圆点线(数据的平滑),最小二乘直线是虚线(推算) */
573
+ .xh-scope-cartesian-chart[data-part='annotation'][data-kind='trend'][data-method='moving-average'] {
574
+ stroke-dasharray: 0 calc(var(--xh-_chart-metric-line-width) * 2);
575
+ stroke-linecap: round;
576
+ }
577
+
578
+ /* 标出的点是一圈实线环:套在数据点外,隔一道表面间隙 */
579
+ .xh-scope-cartesian-chart[data-part='annotation'][data-kind='point'] {
580
+ stroke: var(--xh-_chart-series);
581
+ stroke-width: var(--xh-stroke-thick);
582
+ stroke-dasharray: none;
583
+ }
584
+
585
+ .xh-scope-cartesian-chart[data-part='annotation-label'] {
586
+ fill: var(--xh-chart-label);
587
+ font-weight: var(--xh-font-weight-medium);
588
+ pointer-events: none;
589
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
590
+ }
591
+
592
+ .xh-scope-cartesian-chart[data-part='annotation'][data-dimmed],
593
+ .xh-scope-cartesian-chart[data-part='annotation-label'][data-dimmed] {
594
+ opacity: var(--xh-chart-dim-alpha);
595
+ }
596
+
597
+ /* 压在柱上的标签:取与色槽配对的前景色 */
598
+ .xh-scope-cartesian-chart[data-part='data-label'][data-placement='inside'] {
599
+ fill: var(--xh-_chart-on-series);
600
+ font-weight: var(--xh-font-weight-medium);
601
+ }
602
+
603
+ .xh-scope-cartesian-chart[data-part='total-label'] {
604
+ font-weight: var(--xh-font-weight-medium);
605
+ }
606
+
607
+ /* 所属系列被淡出时,它的标签一起淡出 */
608
+ .xh-scope-cartesian-chart[data-part='data-label'][data-dimmed],
609
+ .xh-scope-cartesian-chart[data-part='end-label'][data-dimmed] {
610
+ opacity: var(--xh-chart-dim-alpha);
611
+ }
612
+
613
+ /* —— 前景:随激活变化,不改几何 —— */
614
+ .xh-scope-cartesian-chart[data-part='crosshair'][data-kind='line'] {
615
+ fill: none;
616
+ stroke: var(--xh-chart-crosshair);
617
+ stroke-width: var(--xh-stroke-thin);
618
+ }
619
+
620
+ /* 柱图的准线是整条类目带的淡底:一条细线落在柱缝里看不出指的是哪一组 */
621
+ .xh-scope-cartesian-chart[data-part='crosshair'][data-kind='band'] {
622
+ fill: var(--xh-chart-band-highlight);
623
+ stroke: none;
624
+ }
625
+
626
+ /* 刷选框:选中语义的淡底垫在数据之下,一圈聚焦色的细边标出范围 */
627
+ .xh-scope-cartesian-chart[data-part='brush'] {
628
+ fill: var(--xh-cartesian-chart-brush-bg, var(--xh-bg-brand-subtle));
629
+ stroke: var(--xh-cartesian-chart-brush-border, var(--xh-border-control-focus));
630
+ stroke-width: var(--xh-stroke-thin);
631
+ pointer-events: none;
632
+ }
633
+
634
+ /* —— 纹理:颜色不可用或不可靠时(强制色、打印、祖先写了 data-xh-chart-patterns),柱与面积改用本系列在
635
+ defs 里的纹理填充、描出轮廓,折线换线型;压在柱上的标签改用标签色、描一圈承载面色。色标的纹理在配方里 —— */
636
+ :where([data-xh-chart-patterns]) .xh-scope-cartesian-chart[data-xh-chart-pattern] > [data-part='bar']:where(.xh-scope-cartesian-chart),
637
+ :where([data-xh-chart-patterns]) .xh-scope-cartesian-chart[data-xh-chart-pattern] > [data-part='area-fill']:where(.xh-scope-cartesian-chart) {
638
+ fill: var(--xh-_chart-pattern);
639
+ fill-opacity: 1;
640
+ stroke: var(--xh-_chart-series);
641
+ stroke-width: var(--xh-stroke-thin);
642
+ }
643
+
644
+ :where([data-xh-chart-patterns]) .xh-scope-cartesian-chart[data-xh-chart-pattern] > [data-part='line']:where(.xh-scope-cartesian-chart):not([data-drawing]) {
645
+ stroke-dasharray: var(--xh-_chart-dash);
646
+ }
647
+
648
+ :where([data-xh-chart-patterns]) .xh-scope-cartesian-chart[data-part='data-label'][data-placement='inside'] {
649
+ fill: var(--xh-chart-label);
650
+ stroke: var(--xh-chart-surface);
651
+ stroke-width: var(--xh-stroke-thick);
652
+ paint-order: stroke;
653
+ }
654
+
655
+ /* 强制色:数据标记改成系统色的描边,网格取灰字色;纹理总是开启;焦点环、引导线与色标在配方里 */
656
+ @media (forced-colors: active) {
657
+ .xh-scope-cartesian-chart[data-part='bar'],
658
+ .xh-scope-cartesian-chart[data-part='bar'][data-trend] {
659
+ fill: Canvas;
660
+ stroke: CanvasText;
661
+ stroke-width: var(--xh-stroke-thin);
662
+ }
663
+
664
+ .xh-scope-cartesian-chart[data-part='connector'],
665
+ .xh-scope-cartesian-chart[data-part='stem'],
666
+ .xh-scope-cartesian-chart[data-part='whisker'],
667
+ .xh-scope-cartesian-chart[data-part='median'],
668
+ .xh-scope-cartesian-chart[data-part='wick'],
669
+ .xh-scope-cartesian-chart[data-part='candle'][data-style='ohlc'] {
670
+ stroke: CanvasText;
671
+ }
672
+
673
+ .xh-scope-cartesian-chart[data-part='box'],
674
+ .xh-scope-cartesian-chart[data-part='outlier'] {
675
+ fill: Canvas;
676
+ stroke: CanvasText;
677
+ }
678
+
679
+ /* 系统色下涨跌分不开:涨空心、跌实心 */
680
+ .xh-scope-cartesian-chart[data-part='candle'][data-trend='rise'] {
681
+ fill: Canvas;
682
+ stroke: CanvasText;
683
+ stroke-width: var(--xh-stroke-thin);
684
+ }
685
+
686
+ .xh-scope-cartesian-chart[data-part='candle'][data-trend='fall'] {
687
+ fill: CanvasText;
688
+ }
689
+
690
+ .xh-scope-cartesian-chart[data-part='line'] {
691
+ stroke: CanvasText;
692
+ }
693
+
694
+ .xh-scope-cartesian-chart[data-part='area-fill'] {
695
+ fill: none;
696
+ }
697
+
698
+ .xh-scope-cartesian-chart[data-part='dot'],
699
+ .xh-scope-cartesian-chart[data-part='point'],
700
+ .xh-scope-cartesian-chart[data-part='point'][data-seg] {
701
+ fill: CanvasText;
702
+ stroke: Canvas;
703
+ }
704
+
705
+ .xh-scope-cartesian-chart[data-part='annotation'],
706
+ .xh-scope-cartesian-chart[data-part='annotation'][data-kind='average'],
707
+ .xh-scope-cartesian-chart[data-part='annotation'][data-kind='trend'],
708
+ .xh-scope-cartesian-chart[data-part='annotation'][data-kind='point'] {
709
+ stroke: CanvasText;
710
+ }
711
+
712
+ .xh-scope-cartesian-chart[data-part='annotation'][data-kind='band'] {
713
+ fill: none;
714
+ stroke: GrayText;
715
+ }
716
+
717
+ .xh-scope-cartesian-chart[data-part='annotation-label'] {
718
+ fill: CanvasText;
719
+ }
720
+
721
+ .xh-scope-cartesian-chart[data-part='zoom-track'] {
722
+ border: var(--xh-stroke-thin) solid CanvasText;
723
+ background: Canvas;
724
+ }
725
+
726
+ .xh-scope-cartesian-chart[data-part='zoom-window'] {
727
+ background: Highlight;
728
+ }
729
+
730
+ .xh-scope-cartesian-chart[data-part='zoom-preview-line'] {
731
+ stroke: GrayText;
732
+ }
733
+
734
+ .xh-scope-cartesian-chart[data-part='zoom-handle'] {
735
+ background: CanvasText;
736
+ }
737
+
738
+ /* 系统色下前景与竖条同是 CanvasText:环改取 Highlight */
739
+ .xh-scope-cartesian-chart[data-part='zoom-handle']:focus-visible {
740
+ --xh-_ring-color: Highlight;
741
+ }
742
+
743
+ /* 色阶在系统色下画不出来:只留轮廓,两端的值照常可读 */
744
+ .xh-scope-cartesian-chart[data-part='legend-scale-bar'] {
745
+ border: var(--xh-stroke-thin) solid CanvasText;
746
+ background: Canvas;
747
+ }
748
+
749
+ .xh-scope-cartesian-chart[data-part='grid-line'] {
750
+ stroke: GrayText;
751
+ }
752
+
753
+ .xh-scope-cartesian-chart[data-part='axis-line'],
754
+ .xh-scope-cartesian-chart[data-part='tick'] {
755
+ stroke: CanvasText;
756
+ }
757
+
758
+ .xh-scope-cartesian-chart[data-part='tick-label'],
759
+ .xh-scope-cartesian-chart[data-part='axis-title'],
760
+ .xh-scope-cartesian-chart[data-part='data-label'],
761
+ .xh-scope-cartesian-chart[data-part='data-label'][data-placement='inside'],
762
+ .xh-scope-cartesian-chart[data-part='total-label'],
763
+ .xh-scope-cartesian-chart[data-part='end-label'] {
764
+ fill: CanvasText;
765
+ }
766
+
767
+ .xh-scope-cartesian-chart[data-part='crosshair'][data-kind='band'] {
768
+ fill: none;
769
+ stroke: Highlight;
770
+ }
771
+
772
+ /* 系统色下淡底画不出来:刷选框只留一圈 Highlight 的边 */
773
+ .xh-scope-cartesian-chart[data-part='brush'] {
774
+ fill: none;
775
+ stroke: Highlight;
776
+ }
777
+
778
+ .xh-scope-cartesian-chart[data-xh-chart-pattern] > [data-part='bar']:where(.xh-scope-cartesian-chart),
779
+ .xh-scope-cartesian-chart[data-xh-chart-pattern] > [data-part='area-fill']:where(.xh-scope-cartesian-chart) {
780
+ forced-color-adjust: none;
781
+ fill: var(--xh-_chart-pattern);
782
+ fill-opacity: 1;
783
+ stroke: CanvasText;
784
+ stroke-width: var(--xh-stroke-thin);
785
+ }
786
+
787
+ .xh-scope-cartesian-chart[data-xh-chart-pattern] > [data-part='line']:where(.xh-scope-cartesian-chart):not([data-drawing]) {
788
+ stroke-dasharray: var(--xh-_chart-dash);
789
+ }
790
+
791
+ .xh-scope-cartesian-chart[data-part='data-label'][data-placement='inside'] {
792
+ fill: CanvasText;
793
+ stroke: Canvas;
794
+ stroke-width: var(--xh-stroke-thick);
795
+ paint-order: stroke;
796
+ }
797
+ }
798
+
799
+ /* 打印:纸上没有指针,准线与缩放条不印;纹理开启;提示框与焦点环在配方里 */
800
+ @media print {
801
+ .xh-scope-cartesian-chart[data-part='crosshair'],
802
+ .xh-scope-cartesian-chart[data-part='zoom-slider'] {
803
+ display: none;
804
+ }
805
+
806
+ .xh-scope-cartesian-chart[data-xh-chart-pattern] > [data-part='bar']:where(.xh-scope-cartesian-chart),
807
+ .xh-scope-cartesian-chart[data-xh-chart-pattern] > [data-part='area-fill']:where(.xh-scope-cartesian-chart) {
808
+ fill: var(--xh-_chart-pattern);
809
+ fill-opacity: 1;
810
+ stroke: var(--xh-_chart-series);
811
+ stroke-width: var(--xh-stroke-thin);
812
+ }
813
+
814
+ .xh-scope-cartesian-chart[data-xh-chart-pattern] > [data-part='line']:where(.xh-scope-cartesian-chart):not([data-drawing]) {
815
+ stroke-dasharray: var(--xh-_chart-dash);
816
+ }
817
+
818
+ .xh-scope-cartesian-chart[data-part='data-label'][data-placement='inside'] {
819
+ fill: var(--xh-chart-label);
820
+ stroke: var(--xh-chart-surface);
821
+ stroke-width: var(--xh-stroke-thick);
822
+ paint-order: stroke;
823
+ }
824
+ }
825
+
826
+ /* 色阶图例随按值着色显隐:声明了 display 的部件在这里让 hidden 生效 */
827
+ .xh-scope-cartesian-chart[data-part='legend-scale'][hidden] {
828
+ display: none;
829
+ }
830
+ }