@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,117 @@
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
+ /*
7
+ * 库自己的基线,只作用于带 data-scope 的库节点,不碰宿主页面的任何元素。
8
+ *
9
+ * 层序上 xihan.reset 在 xihan.components 之前,所以组件皮肤里的任何显式声明都盖得住这里。
10
+ *
11
+ * 本层全部选择器(剥去伪元素)特指度为 (0,0,0):一律以 :where() 包住。无层产物
12
+ * index.unlayered.css 里没有层序可依,只按特指度竞争,而 Family Recipe 的根规则
13
+ * ([data-xh-action-control] 一类,(0,1,0))在产物里排在本文件之前——本层若同为 (0,1,0),
14
+ * 靠源序就把配方的三档字号压掉。压到 (0,0,0) 后,无层产物里任何皮肤与配方规则都压得住它;
15
+ * 代价是无层模式下宿主的元素选择器 (0,0,1) 也压得过,写在文档站「皮肤与样式分层」。
16
+ */
17
+ @layer xihan.reset {
18
+ /* 尺寸一律含边框:皮肤里的宽高都是照可见盒子写的。 */
19
+ :where([data-scope]) {
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ /* 伪元素自身带 (0,0,1),无法再低;:where() 只压掉宿主那一截。 */
24
+ :where([data-scope])::before,
25
+ :where([data-scope])::after {
26
+ box-sizing: border-box;
27
+ }
28
+
29
+ /*
30
+ * UA 样式会把表单控件的字体锁成系统默认,不跟随页面。
31
+ * 这几个元素是 UA 唯一强制字体的地方,标题一类不在其中,故不做全局 font: inherit。
32
+ */
33
+ :where([data-scope]):where(button, input, optgroup, select, textarea) {
34
+ font: inherit;
35
+ letter-spacing: inherit;
36
+ }
37
+
38
+ /*
39
+ * 浮层定位层的生命周期契约:落位才露。
40
+ *
41
+ * 坐标依赖浮层自己的尺寸,尺寸要等元素进 DOM 参与排版才量得到,所以浮层一定先渲染、
42
+ * 再量、再定位——展开的那几帧坐标还是兜底的 0。默认藏着,连接层算出坐标后打
43
+ * data-positioned 才显示,忘了接线的新浮层只会不显示,不会先在视口左上角闪一帧。
44
+ * 用 visibility 而不是 display:display:none 会让浮层退出排版,引擎量不到它的尺寸。
45
+ * 锚点被滚出可视区时引擎置 hidden,各皮肤另有一条 [data-hidden] 压回去。
46
+ */
47
+ :where([data-scope][data-part='positioner']) {
48
+ visibility: hidden;
49
+ }
50
+
51
+ :where([data-scope][data-part='positioner'][data-positioned]) {
52
+ visibility: visible;
53
+ }
54
+
55
+ /*
56
+ * 库内原生滚动面与作者容器共用的细条。
57
+ *
58
+ * 两档滚动面里的「原生细条」档:页内结构容器(Table、Tree、Virtualizer viewport、
59
+ * Dialog / Drawer body、Log 视口一类)不接自绘条,靠这里把原生条统一成 thin + 令牌色阶。
60
+ * 三个入口:库节点([data-scope][data-part])、作者自建滚动容器与文档示例([data-xh-scroll])、
61
+ * Typography prose 里的 <pre>——它是库内唯一不带 data-part 的滚动面,作者只写 <pre> 不写角色。
62
+ * 皮肤不得再手写 scrollbar-width / scrollbar-color(stylelint 判红),要藏条写 none。
63
+ * 这里不写 scrollbar-gutter:auto 是初始值,stable 只给内容高度会变的容器由皮肤显式写。
64
+ * ::-webkit-scrollbar-thumb 的圆角取 pill:原生滑块与自绘 scrollbar:thumb 同为一维对象,
65
+ * 不再按厚度折半凑半圆,三档厚度都是同一身份。
66
+ *
67
+ * 令牌住在 xihan.tokens 层、排在本层之后,但自定义属性的求值不受层序影响:
68
+ * var() 在计算值阶段沿元素树取值,层序只裁决同一属性的两条声明谁赢。
69
+ * [data-xh-scrollbar] 的 scrollbar-width: none 是 (0,1,0),有层与无层两种产物里都压得住本条;
70
+ * ::-webkit-scrollbar 伪元素自带 (0,0,1),ScrollArea 那条 display: none 同样压得住。
71
+ */
72
+ :where([data-scope][data-part], [data-xh-scroll], .xh-scope-typography[data-part='prose'] pre) {
73
+ scrollbar-width: thin;
74
+ scrollbar-color: var(--xh-fg-scrollbar-thumb) var(--xh-bg-scrollbar-track);
75
+ }
76
+
77
+ :where([data-scope][data-part], [data-xh-scroll], .xh-scope-typography[data-part='prose'] pre)::-webkit-scrollbar {
78
+ width: var(--xh-scrollbar-thickness-md);
79
+ height: var(--xh-scrollbar-thickness-md);
80
+ }
81
+
82
+ :where([data-scope][data-part], [data-xh-scroll], .xh-scope-typography[data-part='prose'] pre)::-webkit-scrollbar-track {
83
+ background: var(--xh-bg-scrollbar-track);
84
+ }
85
+
86
+ :where([data-scope][data-part], [data-xh-scroll], .xh-scope-typography[data-part='prose'] pre)::-webkit-scrollbar-thumb {
87
+ border-radius: var(--xh-shape-pill);
88
+ background: var(--xh-fg-scrollbar-thumb);
89
+ }
90
+
91
+ :where([data-scope][data-part], [data-xh-scroll], .xh-scope-typography[data-part='prose'] pre)::-webkit-scrollbar-thumb:hover {
92
+ background: var(--xh-fg-scrollbar-thumb-hover);
93
+ }
94
+
95
+ :where([data-scope][data-part], [data-xh-scroll], .xh-scope-typography[data-part='prose'] pre)::-webkit-scrollbar-thumb:active {
96
+ background: var(--xh-fg-scrollbar-thumb-active);
97
+ }
98
+
99
+ /*
100
+ * 选区高亮的底与字。不写这条时用的是 UA 的系统高亮色(多数是系统蓝底白字):
101
+ * 它不跟主题走,深色档下这块蓝会横在面板上,选中的文字反而比没选中时更难认。
102
+ *
103
+ * 后代那条不是冗余。高亮样式虽然会沿元素树往下继承,但「直接命中该元素的声明」
104
+ * 永远压过继承来的值:宿主页面自己写一条通配的 ::selection,它直接命中我们子树里
105
+ * 的每一个后代元素——只写第一条时,库节点自己的裸文本是我们的色,里面每个 <span>
106
+ * 却回退成宿主的色,一段文字选出两种底。两条一起写,整棵子树才是同一个色。
107
+ * 两条都以 [data-scope] 起手,着色止于库子树,宿主页面自己的选区不受影响。
108
+ *
109
+ * 只写这两个属性:高亮伪元素能吃的属性极窄,box-shadow / border 一类多数引擎
110
+ * 直接丢弃,不报错也不生效,写了只会让人以为已经处理过。
111
+ */
112
+ :where([data-scope])::selection,
113
+ :where([data-scope]) *::selection {
114
+ background: var(--xh-bg-brand-subtle);
115
+ color: var(--xh-fg-default);
116
+ }
117
+ }
@@ -0,0 +1,242 @@
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
+ /* 定义 resizable 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-resizable {
11
+ --xh-resizable-skin: 1;
12
+ }
13
+
14
+ /* 分工:**尺寸与位移**由连接层每帧写进内联样式(inline-size / block-size / left / top)。
15
+ 这份皮肤一条都不碰那四个——内联优先级更高,写了不但是死声明,
16
+ 还会在拖动的每一帧跟连接层抢位置。皮肤只管定位上下文、把手落位与状态表现。 */
17
+
18
+ /* 定位上下文,八向可调靠它才成立:
19
+ 推西边与北边时容器的起点会动,那段位移写成 left / top。relative 的 left / top
20
+ 是视觉位移、元素仍占原位,因此对边钉得住。改成 static 会让这两个方向只变尺寸不移位。 */
21
+ .xh-scope-resizable[data-part='root'] {
22
+ position: relative;
23
+ /* 把层序关在容器里:把手的 1 / 2 只跟彼此比,不跟外面的层号打架 */
24
+ isolation: isolate;
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ /* 调整期间关掉选中:把手一按就会把容器里的文字刷成选中态 */
29
+ .xh-scope-resizable[data-part='root'][data-resizing] {
30
+ user-select: none;
31
+ }
32
+
33
+ /* 这里的 data-disabled 关掉的是「能不能调尺寸」,容器里作者的内容照常可用:
34
+ 光标交回给作者,不摆共享层那个「不可用」的样子 */
35
+ .xh-scope-resizable[data-part='root'][data-disabled] {
36
+ cursor: inherit;
37
+ }
38
+
39
+ .xh-scope-resizable[data-part='root'][hidden] {
40
+ display: none;
41
+ }
42
+
43
+ /* 把手命中区留在容器内部并覆盖对应边;视觉指示条贴住容器边框,由伪元素绘制。 */
44
+ .xh-scope-resizable[data-part='handle'] {
45
+ --xh-_resizable-indicator-color: var(
46
+ --xh-resizable-handle-bg,
47
+ color-mix(in oklab, var(--xh-fg-default) 18%, transparent)
48
+ );
49
+
50
+ position: absolute;
51
+ z-index: 1;
52
+ display: block;
53
+ background: transparent;
54
+ touch-action: none;
55
+ }
56
+
57
+ .xh-scope-resizable[data-part='handle']::after {
58
+ content: '';
59
+ position: absolute;
60
+ border-radius: var(--xh-resizable-handle-radius, var(--xh-shape-pill));
61
+ background: var(--xh-_resizable-indicator-color);
62
+ pointer-events: none;
63
+ transition:
64
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
65
+ border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
66
+ }
67
+
68
+ .xh-scope-resizable[data-part='handle']:hover {
69
+ --xh-_resizable-indicator-color: var(
70
+ --xh-resizable-handle-bg-hover,
71
+ color-mix(in oklab, var(--xh-fg-default) 32%, transparent)
72
+ );
73
+ }
74
+
75
+ .xh-scope-resizable[data-part='handle'][data-resizing] {
76
+ --xh-_resizable-indicator-color: var(--xh-resizable-handle-bg-active, var(--xh-bg-brand));
77
+ }
78
+
79
+ .xh-scope-resizable[data-part='handle']:focus-visible {
80
+ --xh-_resizable-indicator-color: var(--xh-ring-focus);
81
+
82
+ outline: none;
83
+ }
84
+
85
+ .xh-scope-resizable[data-part='handle'][hidden] {
86
+ display: none;
87
+ }
88
+
89
+ /* 四条边:各占一整条,厚度是可抓的余量 */
90
+ .xh-scope-resizable[data-part='handle'][data-edge='n'],
91
+ .xh-scope-resizable[data-part='handle'][data-edge='s'] {
92
+ inset-inline: var(--xh-resizable-grip, var(--xh-space-2));
93
+ block-size: var(--xh-resizable-grip, var(--xh-space-2));
94
+ }
95
+
96
+ .xh-scope-resizable[data-part='handle'][data-edge='e'],
97
+ .xh-scope-resizable[data-part='handle'][data-edge='w'] {
98
+ inset-block: var(--xh-resizable-grip, var(--xh-space-2));
99
+ inline-size: var(--xh-resizable-grip, var(--xh-space-2));
100
+ }
101
+
102
+ /* 落位用逻辑属性:e 说的是行尾侧,从右往左排版时它就该落在屏幕左边——
103
+ 机器那边也是把逻辑边翻成物理边再算几何的,两处同源 */
104
+ .xh-scope-resizable[data-part='handle'][data-edge='n'] {
105
+ inset-block-start: 0;
106
+ }
107
+
108
+ .xh-scope-resizable[data-part='handle'][data-edge='s'] {
109
+ inset-block-end: 0;
110
+ }
111
+
112
+ .xh-scope-resizable[data-part='handle'][data-edge='e'] {
113
+ inset-inline-end: 0;
114
+ }
115
+
116
+ .xh-scope-resizable[data-part='handle'][data-edge='w'] {
117
+ inset-inline-start: 0;
118
+ }
119
+
120
+ .xh-scope-resizable[data-part='handle']:is([data-edge='n'], [data-edge='s'])::after {
121
+ inset-inline-start: 50%;
122
+ inline-size: var(--xh-resizable-indicator-length, var(--xh-space-8));
123
+ block-size: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
124
+ translate: -50% 0;
125
+ }
126
+
127
+ /* 起点是逻辑属性、平移是物理通道:rtl 下行内分量掉头,指示条才落回把手正中 */
128
+ .xh-scope-resizable[data-part='handle']:is([data-edge='n'], [data-edge='s']):dir(rtl)::after {
129
+ translate: 50% 0;
130
+ }
131
+
132
+ .xh-scope-resizable[data-part='handle'][data-edge='n']::after {
133
+ inset-block-start: var(--xh-resizable-indicator-inset, 0);
134
+ }
135
+
136
+ .xh-scope-resizable[data-part='handle'][data-edge='s']::after {
137
+ inset-block-end: var(--xh-resizable-indicator-inset, 0);
138
+ }
139
+
140
+ .xh-scope-resizable[data-part='handle']:is([data-edge='e'], [data-edge='w'])::after {
141
+ inset-block-start: 50%;
142
+ inline-size: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
143
+ block-size: var(--xh-resizable-indicator-length, var(--xh-space-8));
144
+ translate: 0 -50%;
145
+ }
146
+
147
+ .xh-scope-resizable[data-part='handle'][data-edge='e']::after {
148
+ inset-inline-end: var(--xh-resizable-indicator-inset, 0);
149
+ }
150
+
151
+ .xh-scope-resizable[data-part='handle'][data-edge='w']::after {
152
+ inset-inline-start: var(--xh-resizable-indicator-inset, 0);
153
+ }
154
+
155
+ /* 四个角:压在两条边的交点上,盖过相邻两条边(它们同时动两轴) */
156
+ .xh-scope-resizable[data-part='handle'][data-edge='ne'],
157
+ .xh-scope-resizable[data-part='handle'][data-edge='nw'],
158
+ .xh-scope-resizable[data-part='handle'][data-edge='se'],
159
+ .xh-scope-resizable[data-part='handle'][data-edge='sw'] {
160
+ z-index: 2;
161
+ inline-size: var(--xh-resizable-corner, var(--xh-space-4));
162
+ block-size: var(--xh-resizable-corner, var(--xh-space-4));
163
+ }
164
+
165
+ .xh-scope-resizable[data-part='handle'][data-edge='nw'] {
166
+ inset-block-start: 0;
167
+ inset-inline-start: 0;
168
+ border-start-start-radius: inherit;
169
+ }
170
+
171
+ .xh-scope-resizable[data-part='handle'][data-edge='ne'] {
172
+ inset-block-start: 0;
173
+ inset-inline-end: 0;
174
+ border-start-end-radius: inherit;
175
+ }
176
+
177
+ .xh-scope-resizable[data-part='handle'][data-edge='sw'] {
178
+ inset-block-end: 0;
179
+ inset-inline-start: 0;
180
+ border-end-start-radius: inherit;
181
+ }
182
+
183
+ .xh-scope-resizable[data-part='handle'][data-edge='se'] {
184
+ inset-block-end: 0;
185
+ inset-inline-end: 0;
186
+ border-end-end-radius: inherit;
187
+ }
188
+
189
+ .xh-scope-resizable[data-part='handle']:is(
190
+ [data-edge='ne'],
191
+ [data-edge='nw'],
192
+ [data-edge='se'],
193
+ [data-edge='sw']
194
+ )::after {
195
+ inline-size: 50%;
196
+ block-size: 50%;
197
+ border: 0 solid var(--xh-_resizable-indicator-color);
198
+ border-radius: inherit;
199
+ background: transparent;
200
+ }
201
+
202
+ .xh-scope-resizable[data-part='handle'][data-edge='nw']::after {
203
+ inset-block-start: var(--xh-resizable-corner-inset, 0);
204
+ inset-inline-start: var(--xh-resizable-corner-inset, 0);
205
+ border-block-start-width: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
206
+ border-inline-start-width: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
207
+ }
208
+
209
+ .xh-scope-resizable[data-part='handle'][data-edge='ne']::after {
210
+ inset-block-start: var(--xh-resizable-corner-inset, 0);
211
+ inset-inline-end: var(--xh-resizable-corner-inset, 0);
212
+ border-block-start-width: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
213
+ border-inline-end-width: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
214
+ }
215
+
216
+ .xh-scope-resizable[data-part='handle'][data-edge='sw']::after {
217
+ inset-block-end: var(--xh-resizable-corner-inset, 0);
218
+ inset-inline-start: var(--xh-resizable-corner-inset, 0);
219
+ border-block-end-width: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
220
+ border-inline-start-width: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
221
+ }
222
+
223
+ .xh-scope-resizable[data-part='handle'][data-edge='se']::after {
224
+ inset-block-end: var(--xh-resizable-corner-inset, 0);
225
+ inset-inline-end: var(--xh-resizable-corner-inset, 0);
226
+ border-block-end-width: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
227
+ border-inline-end-width: var(--xh-resizable-indicator-thickness, var(--xh-stroke-strong));
228
+ }
229
+
230
+ /* 没开放的边不显示把手:留着一个抓不动的区域只会让人反复去试 */
231
+ .xh-scope-resizable[data-part='handle'][data-disabled] {
232
+ display: none;
233
+ }
234
+
235
+ @media (forced-colors: active) {
236
+ /* 把手那两档全是底色画出来的,这一档里底色被统一换成系统底色,两档与静息塌成一个样子。
237
+ 改由描边把正在拖的那一条画出来 */
238
+ .xh-scope-resizable[data-part='handle'][data-resizing] {
239
+ --xh-_resizable-indicator-color: Highlight;
240
+ }
241
+ }
242
+ }
@@ -0,0 +1,174 @@
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
+ /* 定义 sankey chart 样式。 */
7
+
8
+ /* 标题、视口、图例、提示框、空态与焦点环走 Chart 家族配方。本皮肤 @import 它,单独引入仍成立。 */
9
+ @import '../family/motion.css';
10
+ @import '../family/chart.css';
11
+ @import '../family/loading-ring.css';
12
+
13
+ @layer xihan.components {
14
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
15
+ .xh-scope-sankey-chart {
16
+ --xh-sankey-chart-skin: 1;
17
+ }
18
+
19
+ /* 几何要用的像素值以这里的私有槽为真源:机器挂载后从计算样式读它们,作者覆盖组件槽即改变几何。
20
+ 节点的厚度借柱的最大厚度那一格传进去 */
21
+ .xh-scope-sankey-chart[data-part='root'] {
22
+ --xh-_chart-metric-bar-max: var(--xh-sankey-chart-node-width, var(--xh-space-3));
23
+ --xh-_chart-metric-gap: var(--xh-chart-gap);
24
+ --xh-_chart-metric-line-width: var(--xh-chart-line-width);
25
+ --xh-_chart-metric-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-sankey-chart-node-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-sankey-chart-gap, var(--xh-space-3));
33
+ }
34
+
35
+ /* —— 家族配方的组件槽:标题、视口、图例、提示框与空态由 family/chart.css 画,本图表的覆盖槽写在
36
+ 对应部件上接进配方的私有槽,作者在部件或它的祖先上覆盖都生效 —— */
37
+ .xh-scope-sankey-chart[data-part='viewport'] {
38
+ --xh-_chart-height: var(--xh-sankey-chart-height, var(--xh-chart-height));
39
+ }
40
+
41
+ .xh-scope-sankey-chart[data-part='legend'] {
42
+ --xh-_chart-legend-gap: var(--xh-sankey-chart-legend-gap, var(--xh-space-1));
43
+ }
44
+
45
+ .xh-scope-sankey-chart[data-part='legend-swatch'] {
46
+ --xh-_chart-legend-swatch-radius: var(--xh-sankey-chart-legend-swatch-radius, var(--xh-shape-inset));
47
+ }
48
+
49
+ .xh-scope-sankey-chart[data-part='tooltip'] {
50
+ --xh-_chart-tooltip-gap: var(--xh-sankey-chart-tooltip-gap, var(--xh-space-1));
51
+ --xh-_chart-tooltip-py: var(--xh-sankey-chart-tooltip-py, var(--xh-surface-pad-sm));
52
+ --xh-_chart-tooltip-px: var(--xh-sankey-chart-tooltip-px, var(--xh-surface-pad-sm));
53
+ --xh-_chart-tooltip-radius: var(--xh-sankey-chart-tooltip-radius, var(--xh-shape-overlay));
54
+ --xh-_chart-tooltip-shadow: var(--xh-sankey-chart-tooltip-shadow, var(--xh-material-frosted-shadow));
55
+ }
56
+
57
+ .xh-scope-sankey-chart[data-part='tooltip-row'] {
58
+ --xh-_chart-tooltip-row-gap: var(--xh-sankey-chart-tooltip-row-gap, var(--xh-space-2));
59
+ }
60
+
61
+ .xh-scope-sankey-chart[data-part='tooltip-swatch'] {
62
+ --xh-_chart-tooltip-swatch-radius: var(--xh-sankey-chart-tooltip-swatch-radius, var(--xh-shape-inset));
63
+ }
64
+
65
+ .xh-scope-sankey-chart[data-part='empty'][data-state='loading'] {
66
+ --xh-_chart-empty-gap: var(--xh-sankey-chart-empty-gap, var(--xh-space-2));
67
+ }
68
+
69
+ /* —— 色槽:分组由色槽承担,作者可以在节点上覆盖 --xh-sankey-chart-series-color ——
70
+ 节点、取了颜色的流带、渐变的色标、图例项与提示框的行都带着色槽,各自从这里取系列色 */
71
+ .xh-scope-sankey-chart[data-xh-chart-slot='1'] {
72
+ --xh-_chart-series: var(--xh-sankey-chart-series-color, var(--xh-chart-categorical-1));
73
+ }
74
+
75
+ .xh-scope-sankey-chart[data-xh-chart-slot='2'] {
76
+ --xh-_chart-series: var(--xh-sankey-chart-series-color, var(--xh-chart-categorical-2));
77
+ }
78
+
79
+ .xh-scope-sankey-chart[data-xh-chart-slot='3'] {
80
+ --xh-_chart-series: var(--xh-sankey-chart-series-color, var(--xh-chart-categorical-3));
81
+ }
82
+
83
+ .xh-scope-sankey-chart[data-xh-chart-slot='4'] {
84
+ --xh-_chart-series: var(--xh-sankey-chart-series-color, var(--xh-chart-categorical-4));
85
+ }
86
+
87
+ .xh-scope-sankey-chart[data-xh-chart-slot='5'] {
88
+ --xh-_chart-series: var(--xh-sankey-chart-series-color, var(--xh-chart-categorical-5));
89
+ }
90
+
91
+ .xh-scope-sankey-chart[data-xh-chart-slot='6'] {
92
+ --xh-_chart-series: var(--xh-sankey-chart-series-color, var(--xh-chart-categorical-6));
93
+ }
94
+
95
+ .xh-scope-sankey-chart[data-xh-chart-slot='7'] {
96
+ --xh-_chart-series: var(--xh-sankey-chart-series-color, var(--xh-chart-categorical-7));
97
+ }
98
+
99
+ .xh-scope-sankey-chart[data-xh-chart-slot='8'] {
100
+ --xh-_chart-series: var(--xh-sankey-chart-series-color, var(--xh-chart-categorical-8));
101
+ }
102
+
103
+ /* —— 流带:缺省是半透明的中性色,交叠处叠深、读得出汇合;取了颜色或渐变时换成对应的面。
104
+ 指着一个节点或一条流带时相连的流带换色,其余淡出 —— */
105
+ .xh-scope-sankey-chart[data-part='link'] {
106
+ --xh-_sankey-link: var(--xh-sankey-chart-link-color, var(--xh-chart-categorical-other));
107
+
108
+ fill: var(--xh-_sankey-link);
109
+ fill-opacity: var(--xh-sankey-chart-link-alpha, var(--xh-chart-link-alpha));
110
+ stroke: none;
111
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
112
+ }
113
+
114
+ .xh-scope-sankey-chart[data-part='link'][data-xh-chart-slot] {
115
+ --xh-_sankey-link: var(--xh-_chart-series);
116
+ }
117
+
118
+ .xh-scope-sankey-chart[data-part='link'][data-gradient] {
119
+ --xh-_sankey-link: var(--xh-_sankey-gradient);
120
+ }
121
+
122
+ .xh-scope-sankey-chart[data-part='gradient-stop'] {
123
+ stop-color: var(--xh-_chart-series);
124
+ }
125
+
126
+ /* —— 节点:取分组的系列色,压在流带两端上 —— */
127
+ .xh-scope-sankey-chart[data-part='node'] {
128
+ fill: var(--xh-_chart-series);
129
+ stroke: none;
130
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
131
+ }
132
+
133
+ .xh-scope-sankey-chart[data-part='link'][data-dimmed],
134
+ .xh-scope-sankey-chart[data-part='node'][data-dimmed],
135
+ .xh-scope-sankey-chart[data-part='node-label'][data-dimmed] {
136
+ opacity: var(--xh-chart-dim-alpha);
137
+ }
138
+
139
+ /* 节点名写在列间的空当里,底下可能压着流带:正文色,描一圈承载面色,交叠处也读得清。名字不接指针,命中归节点 */
140
+ .xh-scope-sankey-chart[data-part='node-label'] {
141
+ fill: var(--xh-fg-default);
142
+ stroke: var(--xh-chart-surface);
143
+ stroke-width: var(--xh-stroke-thick);
144
+ stroke-linejoin: round;
145
+ paint-order: stroke;
146
+ pointer-events: none;
147
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
148
+ }
149
+
150
+ /* 强制色:节点改成系统色的面与描边,流带取次级系统色、被指着的取高亮色,名字取正文色;
151
+ 焦点环、图例与色标在配方里 */
152
+ @media (forced-colors: active) {
153
+ .xh-scope-sankey-chart[data-part='node'] {
154
+ fill: Canvas;
155
+ stroke: CanvasText;
156
+ stroke-width: var(--xh-stroke-thin);
157
+ }
158
+
159
+ .xh-scope-sankey-chart[data-part='link'],
160
+ .xh-scope-sankey-chart[data-part='link'][data-xh-chart-slot],
161
+ .xh-scope-sankey-chart[data-part='link'][data-gradient] {
162
+ --xh-_sankey-link: GrayText;
163
+ }
164
+
165
+ .xh-scope-sankey-chart[data-part='link'][data-highlighted] {
166
+ --xh-_sankey-link: Highlight;
167
+ }
168
+
169
+ .xh-scope-sankey-chart[data-part='node-label'] {
170
+ fill: CanvasText;
171
+ stroke: Canvas;
172
+ }
173
+ }
174
+ }