@xihan-ui/styles 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +1 -1
  3. package/component-tokens.d.ts +29 -0
  4. package/components.tokens.json +683 -27
  5. package/css/alert.css +2 -2
  6. package/css/approval.css +4 -4
  7. package/css/button.css +9 -5
  8. package/css/calendar-picker.css +3 -3
  9. package/css/calendar-range-picker.css +7 -7
  10. package/css/carousel.css +45 -13
  11. package/css/cartesian-chart.css +11 -11
  12. package/css/cascader.css +10 -10
  13. package/css/citation.css +2 -2
  14. package/css/code-view.css +6 -6
  15. package/css/color-picker.css +81 -0
  16. package/css/color-swatch-picker.css +9 -4
  17. package/css/combobox.css +12 -4
  18. package/css/command.css +1 -1
  19. package/css/date-field.css +39 -0
  20. package/css/date-picker.css +86 -9
  21. package/css/date-range-picker.css +47 -7
  22. package/css/diff-view.css +8 -8
  23. package/css/field-array.css +1 -1
  24. package/css/field.css +4 -0
  25. package/css/file-upload.css +1 -1
  26. package/css/float-button.css +140 -27
  27. package/css/form.css +14 -6
  28. package/css/graph-chart.css +2 -2
  29. package/css/highlight.css +1 -1
  30. package/css/image.css +1 -1
  31. package/css/mention.css +1 -1
  32. package/css/message-feed.css +1 -1
  33. package/css/notification.css +26 -20
  34. package/css/number-field.css +18 -18
  35. package/css/page-header.css +2 -2
  36. package/css/password-input.css +2 -2
  37. package/css/popconfirm.css +3 -3
  38. package/css/question-flow.css +8 -8
  39. package/css/radar-chart.css +6 -6
  40. package/css/rating.css +1 -1
  41. package/css/select.css +2 -2
  42. package/css/separator.css +2 -2
  43. package/css/side-nav.css +13 -13
  44. package/css/skeleton.css +5 -5
  45. package/css/slider.css +6 -6
  46. package/css/sortable.css +2 -2
  47. package/css/table.css +19 -2
  48. package/css/tags-input.css +1 -1
  49. package/css/time-picker.css +59 -2
  50. package/css/tool-call.css +7 -7
  51. package/css/tooltip.css +1 -1
  52. package/css/tree-select.css +2 -2
  53. package/css/tree.css +81 -11
  54. package/dist/css/accordion.css +269 -0
  55. package/dist/css/affix.css +47 -0
  56. package/dist/css/alert.css +247 -0
  57. package/dist/css/anchor.css +252 -0
  58. package/dist/css/approval.css +501 -0
  59. package/dist/css/avatar-group.css +99 -0
  60. package/dist/css/avatar.css +98 -0
  61. package/dist/css/back-top.css +161 -0
  62. package/dist/css/badge.css +205 -0
  63. package/dist/css/bar-code.css +62 -0
  64. package/dist/css/breadcrumb.css +230 -0
  65. package/dist/css/button-group.css +263 -0
  66. package/dist/css/button.css +219 -0
  67. package/dist/css/calendar-picker.css +467 -0
  68. package/dist/css/calendar-range-picker.css +554 -0
  69. package/dist/css/card.css +221 -0
  70. package/dist/css/carousel.css +710 -0
  71. package/dist/css/cartesian-chart.css +830 -0
  72. package/dist/css/cascader.css +961 -0
  73. package/dist/css/checkbox-group.css +358 -0
  74. package/dist/css/checkbox.css +257 -0
  75. package/dist/css/citation.css +470 -0
  76. package/dist/css/clipboard.css +315 -0
  77. package/dist/css/code-view.css +374 -0
  78. package/dist/css/collapsible.css +185 -0
  79. package/dist/css/color-field.css +176 -0
  80. package/dist/css/color-picker.css +595 -0
  81. package/dist/css/color-slider.css +281 -0
  82. package/dist/css/color-swatch-picker.css +250 -0
  83. package/dist/css/color-swatch.css +35 -0
  84. package/dist/css/combobox.css +574 -0
  85. package/dist/css/command.css +399 -0
  86. package/dist/css/context-menu.css +420 -0
  87. package/dist/css/date-field.css +317 -0
  88. package/dist/css/date-picker.css +868 -0
  89. package/dist/css/date-range-picker.css +886 -0
  90. package/dist/css/description.css +67 -0
  91. package/dist/css/descriptions.css +299 -0
  92. package/dist/css/dialog.css +455 -0
  93. package/dist/css/diff-view.css +513 -0
  94. package/dist/css/download-trigger.css +151 -0
  95. package/dist/css/drawer.css +552 -0
  96. package/dist/css/editable.css +295 -0
  97. package/dist/css/empty-state.css +163 -0
  98. package/dist/css/field-array.css +226 -0
  99. package/dist/css/field.css +166 -0
  100. package/dist/css/fieldset.css +102 -0
  101. package/dist/css/file-upload.css +429 -0
  102. package/dist/css/flex.css +441 -0
  103. package/dist/css/float-button.css +569 -0
  104. package/dist/css/floating-panel.css +429 -0
  105. package/dist/css/focus.css +46 -0
  106. package/dist/css/forced-colors.css +93 -0
  107. package/dist/css/form.css +393 -0
  108. package/dist/css/funnel-chart.css +106 -0
  109. package/dist/css/graph-chart.css +205 -0
  110. package/dist/css/grid-list.css +235 -0
  111. package/dist/css/grid.css +1201 -0
  112. package/dist/css/heatmap.css +552 -0
  113. package/dist/css/hierarchy-chart.css +298 -0
  114. package/dist/css/highlight.css +41 -0
  115. package/dist/css/hover-card.css +226 -0
  116. package/dist/css/icon.css +225 -0
  117. package/dist/css/image-cropper.css +373 -0
  118. package/dist/css/image-viewer.css +538 -0
  119. package/dist/css/image.css +98 -0
  120. package/dist/css/infinite-scroll.css +77 -0
  121. package/dist/css/input-group.css +275 -0
  122. package/dist/css/json-viewer.css +379 -0
  123. package/dist/css/kbd.css +72 -0
  124. package/dist/css/label.css +78 -0
  125. package/dist/css/layers.css +7 -0
  126. package/dist/css/layout.css +372 -0
  127. package/dist/css/liquid.css +106 -0
  128. package/dist/css/list.css +152 -0
  129. package/dist/css/listbox.css +390 -0
  130. package/dist/css/loading-bar.css +141 -0
  131. package/dist/css/log.css +306 -0
  132. package/dist/css/markdown-stream.css +149 -0
  133. package/dist/css/marquee.css +378 -0
  134. package/dist/css/masonry.css +70 -0
  135. package/dist/css/matrix-code.css +67 -0
  136. package/dist/css/mention.css +393 -0
  137. package/dist/css/menu.css +364 -0
  138. package/dist/css/menubar.css +456 -0
  139. package/dist/css/message-feed.css +318 -0
  140. package/dist/css/navigation-menu.css +513 -0
  141. package/dist/css/notification.css +782 -0
  142. package/dist/css/number-animation.css +44 -0
  143. package/dist/css/number-field.css +252 -0
  144. package/dist/css/overlay-arrow.css +56 -0
  145. package/dist/css/page-header.css +184 -0
  146. package/dist/css/pagination.css +450 -0
  147. package/dist/css/password-input.css +391 -0
  148. package/dist/css/pie-chart.css +247 -0
  149. package/dist/css/pin-input.css +199 -0
  150. package/dist/css/pointer.css +36 -0
  151. package/dist/css/popconfirm.css +320 -0
  152. package/dist/css/popover.css +279 -0
  153. package/dist/css/progress.css +501 -0
  154. package/dist/css/prompt-input.css +260 -0
  155. package/dist/css/question-flow.css +553 -0
  156. package/dist/css/radar-chart.css +233 -0
  157. package/dist/css/radio-group.css +598 -0
  158. package/dist/css/rating.css +294 -0
  159. package/dist/css/reasoning.css +343 -0
  160. package/dist/css/reset.css +117 -0
  161. package/dist/css/resizable.css +242 -0
  162. package/dist/css/sankey-chart.css +174 -0
  163. package/dist/css/scroll-area.css +240 -0
  164. package/dist/css/scrollbar.css +204 -0
  165. package/dist/css/select.css +612 -0
  166. package/dist/css/separator.css +122 -0
  167. package/dist/css/side-nav.css +476 -0
  168. package/dist/css/signature-pad.css +179 -0
  169. package/dist/css/skeleton.css +161 -0
  170. package/dist/css/slider.css +374 -0
  171. package/dist/css/sortable.css +228 -0
  172. package/dist/css/sparkline.css +164 -0
  173. package/dist/css/spinner.css +236 -0
  174. package/dist/css/splitter.css +159 -0
  175. package/dist/css/statistic.css +137 -0
  176. package/dist/css/steps.css +627 -0
  177. package/dist/css/switch.css +351 -0
  178. package/dist/css/table.css +1145 -0
  179. package/dist/css/tabs.css +944 -0
  180. package/dist/css/tag-group.css +247 -0
  181. package/dist/css/tag.css +310 -0
  182. package/dist/css/tags-input.css +322 -0
  183. package/dist/css/text-field.css +197 -0
  184. package/dist/css/time-field.css +277 -0
  185. package/dist/css/time-picker.css +707 -0
  186. package/dist/css/time-range-picker.css +746 -0
  187. package/dist/css/timeline.css +423 -0
  188. package/dist/css/timer.css +123 -0
  189. package/dist/css/timestamp.css +34 -0
  190. package/dist/css/toggle-group.css +424 -0
  191. package/dist/css/toggle.css +146 -0
  192. package/dist/css/tone.css +189 -0
  193. package/dist/css/tool-call.css +429 -0
  194. package/dist/css/toolbar.css +365 -0
  195. package/dist/css/tooltip.css +218 -0
  196. package/dist/css/tour.css +439 -0
  197. package/dist/css/transfer.css +638 -0
  198. package/dist/css/tree-select.css +878 -0
  199. package/dist/css/tree.css +733 -0
  200. package/dist/css/truncate.css +108 -0
  201. package/dist/css/typography.css +472 -0
  202. package/dist/css/undefined.css +58 -0
  203. package/dist/css/virtualizer.css +166 -0
  204. package/dist/css/visually-hidden.css +20 -0
  205. package/dist/css/watermark.css +82 -0
  206. package/dist/family/action-control.css +487 -0
  207. package/dist/family/chart.css +480 -0
  208. package/dist/family/check-mark.css +94 -0
  209. package/dist/family/choice-card.css +97 -0
  210. package/dist/family/collection-item.css +764 -0
  211. package/dist/family/field-chrome.css +287 -0
  212. package/dist/family/loading-ring.css +95 -0
  213. package/dist/family/material.css +72 -0
  214. package/dist/family/menu-choice.css +56 -0
  215. package/dist/family/motion.css +363 -0
  216. package/dist/family/swatch.css +59 -0
  217. package/dist/family/tag-list.css +59 -0
  218. package/family/action-control.css +3 -12
  219. package/index.css +7307 -6759
  220. package/index.unlayered.css +7309 -6761
  221. package/package.json +165 -164
@@ -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
+ .xh-scope-hierarchy-chart {
18
+ --xh-hierarchy-chart-skin: 1;
19
+ }
20
+
21
+ /* 几何要用的像素值以这里的私有槽为真源:机器挂载后从计算样式读它们,作者覆盖组件槽即改变几何 */
22
+ .xh-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
+ .xh-scope-hierarchy-chart[data-part='viewport'] {
41
+ --xh-_chart-height: var(--xh-hierarchy-chart-height, var(--xh-chart-height));
42
+ }
43
+
44
+ .xh-scope-hierarchy-chart[data-part='legend'] {
45
+ --xh-_chart-legend-gap: var(--xh-hierarchy-chart-legend-gap, var(--xh-space-4));
46
+ }
47
+
48
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-scope-hierarchy-chart[data-part='path-item'] + .xh-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
+ .xh-scope-hierarchy-chart[data-part='path-item'][hidden] {
122
+ display: none;
123
+ }
124
+
125
+ /* 从右往左排版时「向前」在左边 */
126
+ [dir='rtl'] .xh-scope-hierarchy-chart[data-part='path-item']::before {
127
+ rotate: 180deg;
128
+ }
129
+
130
+ /* —— 色槽:第一层分支各取一个分类色,后代继承;作者可以在节点上覆盖 --xh-hierarchy-chart-series-color。
131
+ 节点、名字与提示框的色标都带着色槽,各自从这里取系列色与配对的前景色 —— */
132
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-scope-hierarchy-chart[data-part='node'],
175
+ .xh-scope-hierarchy-chart[data-part='node-label'],
176
+ .xh-scope-hierarchy-chart[data-part='group-header'] {
177
+ --xh-_hierarchy-mix: 100%;
178
+ --xh-_hierarchy-ink: var(--xh-_chart-on-series);
179
+ }
180
+
181
+ .xh-scope-hierarchy-chart[data-level='2'] {
182
+ --xh-_hierarchy-mix: 48%;
183
+ --xh-_hierarchy-ink: var(--xh-fg-default);
184
+ }
185
+
186
+ .xh-scope-hierarchy-chart[data-level='3'] {
187
+ --xh-_hierarchy-mix: 32%;
188
+ --xh-_hierarchy-ink: var(--xh-fg-default);
189
+ }
190
+
191
+ .xh-scope-hierarchy-chart[data-level='4'] {
192
+ --xh-_hierarchy-mix: 22%;
193
+ --xh-_hierarchy-ink: var(--xh-fg-default);
194
+ }
195
+
196
+ /* 相邻节点之间的间隙由几何留出,不画描边;指着一个节点时不在同一条祖孙链上的节点淡出,被指着的不位移 */
197
+ .xh-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
+ .xh-scope-hierarchy-chart[data-part='node'][aria-expanded] {
207
+ cursor: pointer;
208
+ }
209
+
210
+ /* 按值着色:颜色由 Chart 家族配方按段号与段内百分比兑好放在私有槽里,不再按层变浅。色阶的起点贴着承载面、
211
+ 终点远离承载面:浅的一段写正文色,深的一段写承载面色,亮暗主题下都读得清 */
212
+ .xh-scope-hierarchy-chart[data-part='node'][data-seg] {
213
+ fill: var(--xh-_chart-seq-fill);
214
+ }
215
+
216
+ .xh-scope-hierarchy-chart[data-seg='low'] {
217
+ --xh-_hierarchy-ink: var(--xh-fg-default);
218
+ }
219
+
220
+ .xh-scope-hierarchy-chart[data-seg='high'] {
221
+ --xh-_hierarchy-ink: var(--xh-chart-surface);
222
+ }
223
+
224
+ .xh-scope-hierarchy-chart[data-part='node'][data-dimmed],
225
+ .xh-scope-hierarchy-chart[data-part='node-label'][data-dimmed],
226
+ .xh-scope-hierarchy-chart[data-part='group-header'][data-dimmed] {
227
+ opacity: var(--xh-chart-dim-alpha);
228
+ }
229
+
230
+ /* 名字与分组标题压在节点的颜色上:前景随层与着色方式取;它们不接指针,命中归节点 */
231
+ .xh-scope-hierarchy-chart[data-part='node-label'],
232
+ .xh-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
+ .xh-scope-hierarchy-chart[data-part='group-header'] {
239
+ font-weight: var(--xh-font-weight-medium);
240
+ }
241
+
242
+ /* 色阶图例:每层一条,名字、低端的值、渐变条、高端的值排成一行;值是标注字色、等宽数字 */
243
+ .xh-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
+ .xh-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
+ .xh-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
+ .xh-scope-hierarchy-chart[data-part='node'],
271
+ .xh-scope-hierarchy-chart[data-part='node'][data-seg] {
272
+ fill: Canvas;
273
+ stroke: CanvasText;
274
+ stroke-width: var(--xh-stroke-thin);
275
+ }
276
+
277
+ .xh-scope-hierarchy-chart[data-part='node-label'],
278
+ .xh-scope-hierarchy-chart[data-part='group-header'] {
279
+ fill: CanvasText;
280
+ }
281
+
282
+ .xh-scope-hierarchy-chart[data-part='path-item'] + .xh-scope-hierarchy-chart[data-part='path-item']::before {
283
+ forced-color-adjust: none;
284
+ background-color: CanvasText;
285
+ }
286
+
287
+ /* 色阶在系统色下画不出来:只留轮廓,两端的值照常可读 */
288
+ .xh-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
+ .xh-scope-hierarchy-chart[data-part='legend-scale'][hidden] {
296
+ display: none;
297
+ }
298
+ }
@@ -0,0 +1,41 @@
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
+ /* 定义 highlight 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-highlight {
11
+ --xh-highlight-skin: 1;
12
+ }
13
+
14
+ /* 文本按原样显示:命中位置是按原串逐字符算的,折叠掉连续空格与换行会让看到的
15
+ 与算出来的对不上。pre-wrap 保留空白但仍在容器边界换行 */
16
+ .xh-scope-highlight[data-part='root'] {
17
+ white-space: pre-wrap;
18
+ }
19
+
20
+ /* 浏览器给 mark 的默认底色是一个固定的亮黄,暗色主题下压在深底上刺眼、
21
+ 配的黑字也不随主题走;这里整份换成随主题走的品牌淡底。
22
+ 槽名带 mark 段与部件对上 */
23
+ .xh-scope-highlight[data-part='mark'] {
24
+ padding-inline: var(--xh-highlight-mark-px, var(--xh-space-0_5));
25
+ border-radius: var(--xh-highlight-mark-radius, var(--xh-shape-inset));
26
+ background: var(--xh-highlight-mark-bg, var(--xh-bg-brand-subtle));
27
+ color: var(--xh-highlight-mark-fg, var(--xh-fg-brand-strong));
28
+ font-weight: var(--xh-highlight-mark-font-weight, var(--xh-font-weight-medium));
29
+ /* 命中片段跨行时两半各自收边,否则圆角与内边距只画在整段的首尾。
30
+ 两条都写:WebKit 只认带前缀那条 */
31
+ -webkit-box-decoration-break: clone;
32
+ box-decoration-break: clone;
33
+ }
34
+
35
+ /* 语气落在根上而不是每个 mark 上:命中片段有好几个,用哪族颜色是整段的属性。
36
+ 使用者槽排在语气之前:写死了 mark 的底与字色,六族语气一并让位 */
37
+ .xh-scope-highlight[data-part='root'][data-tone] [data-part='mark']:where(.xh-scope-highlight) {
38
+ background: var(--xh-highlight-mark-bg, var(--xh-_tone-subtle));
39
+ color: var(--xh-highlight-mark-fg, var(--xh-_tone-fg));
40
+ }
41
+ }
@@ -0,0 +1,226 @@
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
+ /* 定义 hover card 样式。 */
7
+
8
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
9
+ @import '../family/motion.css';
10
+ @import '../family/material.css';
11
+
12
+ @layer xihan.components {
13
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
14
+ .xh-scope-hover-card {
15
+ --xh-hover-card-skin: 1;
16
+ }
17
+
18
+ /* 根节点只把 trigger 与浮层收在一处,不参与定位(坐标系仍由祖先的定位上下文决定) */
19
+ .xh-scope-hover-card[data-part='root'] {
20
+ display: inline-block;
21
+ }
22
+
23
+ .xh-scope-hover-card[data-part='root'][hidden] {
24
+ display: none;
25
+ }
26
+
27
+ .xh-scope-hover-card[data-part='trigger'] {
28
+ display: inline-flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ gap: var(--xh-hover-card-trigger-gap, var(--xh-control-gap-sm));
32
+ border: 0;
33
+ background: transparent;
34
+ color: inherit;
35
+ font: inherit;
36
+ cursor: inherit;
37
+ }
38
+
39
+ .xh-scope-hover-card[data-part='trigger'][hidden] {
40
+ display: none;
41
+ }
42
+
43
+ /* 这里的 data-disabled 关掉的是卡片,不是宿主控件:光标仍旧交给宿主 */
44
+ .xh-scope-hover-card[data-part='root'][data-disabled],
45
+ .xh-scope-hover-card[data-part='trigger'][data-disabled] {
46
+ cursor: inherit;
47
+ }
48
+
49
+ /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
50
+ .xh-scope-hover-card[data-part='positioner'] {
51
+ /* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
52
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时不额外限高 */
53
+ --xh-_hover-card-available-h: 100vh;
54
+ /* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,行内轴据此夹取;
55
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
56
+ --xh-_hover-card-available-w: 100vw;
57
+
58
+ /* 卡片内容的自绘条浮在内容之上:轨道不上底色,实色轨道会在卡片右缘糊一条竖灰带 */
59
+ --xh-scrollbar-track-bg: transparent;
60
+
61
+ position: fixed;
62
+ z-index: var(--xh-hover-card-layer, var(--xh-_layer, var(--xh-layer-popover)));
63
+ /* 空壳不吃指针:trigger 与 content 之间那段间隙要能点得穿,
64
+ 指针穿行的判定全靠 content 自己的进出事件 */
65
+ pointer-events: none;
66
+ }
67
+
68
+ /* 锚点被滚出可视区:整个浮层随之收起 */
69
+ .xh-scope-hover-card[data-part='positioner'][data-hidden] {
70
+ visibility: hidden;
71
+ }
72
+
73
+ /* 缩放原点与进场位移按落定的那一侧给:卡片从贴着锚点的那条边涨开、沿主轴退让一小段。
74
+ 两个槽由 content 继承。placement 是物理方向(引擎按 top / right / bottom / left 出值),
75
+ origin 与 translate 也是物理量,两边同轴,不随书写方向翻 */
76
+ .xh-scope-hover-card[data-part='positioner'][data-placement^='top'] {
77
+ --xh-_overlay-origin-y: 100%;
78
+ --xh-_overlay-enter-down: 1;
79
+ }
80
+
81
+ .xh-scope-hover-card[data-part='positioner'][data-placement^='bottom'] {
82
+ --xh-_overlay-origin-y: 0;
83
+ --xh-_overlay-enter-up: 1;
84
+ }
85
+
86
+ .xh-scope-hover-card[data-part='positioner'][data-placement^='left'] {
87
+ --xh-_overlay-origin-x: 100%;
88
+ --xh-_overlay-enter-right: 1;
89
+ }
90
+
91
+ .xh-scope-hover-card[data-part='positioner'][data-placement^='right'] {
92
+ --xh-_overlay-origin-x: 0;
93
+ --xh-_overlay-enter-left: 1;
94
+ }
95
+
96
+ /* 交叉轴原点按对齐取:start / end 对齐时卡片与锚点在那一端齐平,缩放从那一端涨开,贴着短链接的卡片
97
+ 才像是从链接里长出来;居中对齐留在中线。上下两侧的 start / end 是行内轴上的逻辑对齐,RTL 下起始缘在右;
98
+ 左右两侧的 start / end 落在块轴上,不随书写方向翻 */
99
+ /* 起始缘与末尾缘按就近的书写方向取:LTR 起始在左,RTL 起始在右 */
100
+ .xh-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
+ .xh-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
+ .xh-scope-hover-card[data-part='positioner']:is([data-placement='left-start'], [data-placement='right-start']) {
109
+ --xh-_overlay-origin-y: 0;
110
+ }
111
+
112
+ .xh-scope-hover-card[data-part='positioner']:is([data-placement='left-end'], [data-placement='right-end']) {
113
+ --xh-_overlay-origin-y: 100%;
114
+ }
115
+
116
+ /* 与 tooltip 不同:卡片本体承载交互,必须吃指针——
117
+ 指针停在卡片上就不该收起,里面的链接与按钮也要点得到 */
118
+ .xh-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
+
127
+ /* 尺寸档只换这两个私有槽。size 落在 content 上而非 root:root 是可选部件,
128
+ 面板几何也长在 content 上。语气不接:卡片是内容容器,语气该由里面的内容表达 */
129
+ --xh-_hover-card-pad: var(--xh-surface-pad-md);
130
+ --xh-_hover-card-max-w: var(--xh-overlay-max-w);
131
+
132
+ position: relative;
133
+ display: flex;
134
+ flex-direction: column;
135
+ gap: var(--xh-hover-card-gap, var(--xh-space-2));
136
+ inline-size: max-content;
137
+ /* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的内容就点不到了 */
138
+ max-inline-size: min(var(--xh-hover-card-max-w, var(--xh-_hover-card-max-w)), var(--xh-_hover-card-available-w));
139
+ /* 内容由作者给,长度不可预知:不限高就整块伸出视口且滚不到 */
140
+ max-block-size: min(var(--xh-hover-card-max-h, var(--xh-overlay-max-h)), var(--xh-_hover-card-available-h));
141
+ overflow-y: auto;
142
+ /* 浮在页面之上的 Overlay 滚动面:滚到头不把页面一起带走 */
143
+ overscroll-behavior: contain;
144
+ padding-block: var(--xh-hover-card-py, var(--xh-_hover-card-pad));
145
+ padding-inline: var(--xh-hover-card-px, var(--xh-_hover-card-pad));
146
+ border-radius: var(--xh-hover-card-radius, var(--xh-shape-overlay));
147
+ pointer-events: auto;
148
+ /* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
149
+ transform-origin: var(--xh-_overlay-origin-x, 50%) var(--xh-_overlay-origin-y, 50%);
150
+ }
151
+
152
+ /* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
153
+ 收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
154
+ [hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
155
+ 真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
156
+ 其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
157
+
158
+ /* 卡片是可编程聚焦的容器(tabindex=-1),焦点环留给里面真正的可聚焦元素 */
159
+ .xh-scope-hover-card[data-part='content']:focus-visible {
160
+ outline: none;
161
+ }
162
+
163
+ /* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
164
+ .xh-scope-hover-card[data-part='content'][data-state='open']:not([data-instant]) {
165
+ animation: xh-overlay-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
166
+ }
167
+
168
+ /* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
169
+ 免得动画结束到真收起之间闪一下原样 */
170
+ .xh-scope-hover-card[data-part='content'][data-state='closed'] {
171
+ animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
172
+ }
173
+
174
+ /* —— 尺寸 —— */
175
+ /* 缺省档写在 content 的基础规则里;四边等宽的面板内衬三档取 surface-pad 那把尺 */
176
+ .xh-scope-hover-card[data-part='content'][data-size='sm'] {
177
+ --xh-_hover-card-pad: var(--xh-surface-pad-sm);
178
+ --xh-_hover-card-max-w: var(--xh-overlay-max-w-sm);
179
+ }
180
+
181
+ .xh-scope-hover-card[data-part='content'][data-size='lg'] {
182
+ --xh-_hover-card-pad: var(--xh-surface-pad-lg);
183
+ --xh-_hover-card-max-w: var(--xh-overlay-max-w-lg);
184
+ }
185
+
186
+ .xh-scope-hover-card[data-part='title'] {
187
+ margin: 0;
188
+ font-size: var(--xh-hover-card-title-font-size, var(--xh-text-label-size));
189
+ font-weight: var(--xh-hover-card-title-font-weight, var(--xh-font-weight-semibold));
190
+ color: var(--xh-hover-card-title-fg, var(--xh-fg-default));
191
+ }
192
+
193
+ /* 说明文字走说明档:13px + fg-muted */
194
+ .xh-scope-hover-card[data-part='description'] {
195
+ margin: 0;
196
+ font-size: var(--xh-hover-card-description-font-size, var(--xh-text-secondary-size));
197
+ color: var(--xh-hover-card-description-fg, var(--xh-fg-muted));
198
+ }
199
+
200
+ /* 箭头的底色与描边色,几何在 overlay-arrow.css。
201
+ 交叉轴落点由定位引擎经内联自定义属性写进来,没给时退回居中 */
202
+ .xh-scope-hover-card[data-part='arrow'] {
203
+ --xh-_hover-card-arrow-x: 50%;
204
+ --xh-_hover-card-arrow-y: 50%;
205
+ --xh-_overlay-arrow-size: var(--xh-hover-card-arrow-size, var(--xh-overlay-arrow-size));
206
+ --xh-_overlay-arrow-x: var(--xh-_hover-card-arrow-x);
207
+ --xh-_overlay-arrow-y: var(--xh-_hover-card-arrow-y);
208
+
209
+ background: var(--xh-hover-card-bg, var(--xh-material-frosted-bg));
210
+ border: var(--xh-stroke-thin) solid var(--xh-hover-card-border, var(--xh-material-frosted-border));
211
+ }
212
+
213
+ @media (forced-colors: active) {
214
+ .xh-scope-hover-card[data-part='content'] {
215
+ background-image: none;
216
+ }
217
+ }
218
+
219
+ @media print {
220
+ /* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
221
+ 收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
222
+ .xh-scope-hover-card[data-part='positioner'] {
223
+ display: none;
224
+ }
225
+ }
226
+ }