@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,240 @@
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
+ /* 定义 scroll area 样式。 */
7
+
8
+ /* 边缘渐隐的四条带宽登记成长度:滚到头时带子收起、离开端点时铺开,才能沿过渡淡变。
9
+ 不认 @property 的引擎把它们当普通自定义属性,带子照旧按端点收放,只是没有过渡 */
10
+ @property --xh-_scroll-area-fade-block-start {
11
+ syntax: '<length>';
12
+ inherits: false;
13
+ initial-value: 0px;
14
+ }
15
+
16
+ @property --xh-_scroll-area-fade-block-end {
17
+ syntax: '<length>';
18
+ inherits: false;
19
+ initial-value: 0px;
20
+ }
21
+
22
+ @property --xh-_scroll-area-fade-inline-start {
23
+ syntax: '<length>';
24
+ inherits: false;
25
+ initial-value: 0px;
26
+ }
27
+
28
+ @property --xh-_scroll-area-fade-inline-end {
29
+ syntax: '<length>';
30
+ inherits: false;
31
+ initial-value: 0px;
32
+ }
33
+
34
+ @layer xihan.components {
35
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
36
+ .xh-scope-scroll-area {
37
+ --xh-scroll-area-skin: 1;
38
+ }
39
+
40
+ /* 滚动区是视口加两条 scrollbar 的组装:轨道、滑块与交叉口戴 data-scope="scrollbar",
41
+ 它们的皮归 scrollbar.css;这里只管视口、内容层,以及充当 scrollbar 根节点的那个挂载点。 */
42
+
43
+ /* 滚动条是绝对定位的,以它为参照,因此它必须自己建定位上下文。
44
+ overflow:hidden 管的是溢出边界:作者给 root 定了尺寸后,内容与滚动条都不该漫出这个框。 */
45
+ .xh-scope-scroll-area[data-part='root'] {
46
+ /* 厚度只算一次:尺寸档换的就是它,视口让道、交叉口让位与补丁都按同一个数 */
47
+ --xh-_scrollbar-thickness: var(--xh-scrollbar-thickness-md);
48
+
49
+ position: relative;
50
+ overflow: hidden;
51
+ }
52
+
53
+ .xh-scope-scroll-area[data-part='root'][data-size='sm'] {
54
+ --xh-_scrollbar-thickness: var(--xh-scrollbar-thickness-sm);
55
+ }
56
+
57
+ .xh-scope-scroll-area[data-part='root'][data-size='lg'] {
58
+ --xh-_scrollbar-thickness: var(--xh-scrollbar-thickness-lg);
59
+ }
60
+
61
+ /* 真正滚动的那层。原生滚动条藏起来,滚动能力一点不减——
62
+ 键盘(PageUp/PageDown、方向键、Home/End)与滚轮走的都还是浏览器原生通路。 */
63
+ .xh-scope-scroll-area[data-part='viewport'] {
64
+ inline-size: 100%;
65
+ block-size: 100%;
66
+ /* 逻辑等价物 overflow-inline / overflow-block 至今只有个别引擎实现,
67
+ 这两条是本文件里仅有的物理属性,换成逻辑写法会在多数浏览器上直接失效 */
68
+ overflow-x: auto;
69
+ overflow-y: auto;
70
+ }
71
+
72
+ /* 藏原生滚动条的标准写法;下面那条 ::-webkit-scrollbar 兜住还没实现它的引擎。
73
+ 只藏外观,滚动能力一点不动:这里刻意不写 overscroll-behavior,
74
+ 滚到尽头要不要把滚动传给外层,仍然按浏览器的默认来。
75
+ 触屏上自绘滚动条交给了原生(data-native),原生滚动条就留着 */
76
+ .xh-scope-scroll-area[data-part='viewport']:not([data-native]) {
77
+ scrollbar-width: none;
78
+ }
79
+
80
+ .xh-scope-scroll-area[data-part='viewport']:not([data-native])::-webkit-scrollbar {
81
+ /* 这里不是角色节点而是伪元素,不涉及 [hidden] 那条规矩 */
82
+ display: none;
83
+ }
84
+
85
+ /* orientation 关掉的那条轴不该滚:滚动条已经不显形了,再能滚就成了滚不回来的暗格 */
86
+ .xh-scope-scroll-area[data-part='viewport'][data-orientation='vertical'] {
87
+ overflow-x: hidden;
88
+ }
89
+
90
+ .xh-scope-scroll-area[data-part='viewport'][data-orientation='horizontal'] {
91
+ overflow-y: hidden;
92
+ }
93
+
94
+ /* 有滚动条要占道时,视口在那条轴上收窄一条道的宽度,末端内容不再被压在滚动条底下。
95
+ 缩视口而不是给视口加内边距:滚动容器末端缘的 padding 计不计进 scrollWidth,各引擎不一致。 */
96
+ .xh-scope-scroll-area[data-part='viewport'][data-lane-vertical] {
97
+ inline-size: calc(100% - var(--xh-_scrollbar-thickness));
98
+ }
99
+
100
+ .xh-scope-scroll-area[data-part='viewport'][data-lane-horizontal] {
101
+ block-size: calc(100% - var(--xh-_scrollbar-thickness));
102
+ }
103
+
104
+ /* —— 边缘渐隐 —— */
105
+ /* 两条轴各铺一层遮罩,取交集:还滚得动的那一侧把内容淡出,滚到头即收成 0。
106
+ 渐变没有逻辑方向,只能沿物理方向铺,横轴那一层的两端在 rtl 下对调(见下)。
107
+ 遮罩里的黑白画的是 alpha 的两端,不是设计色。
108
+ -webkit-* 那两条排在前面兜住只认前缀写法的引擎。
109
+ 画在视口上而不是根上:自绘滚动条是视口的兄弟节点,不会跟着一起淡掉 */
110
+ .xh-scope-scroll-area[data-part='viewport'][data-variant='fade'] {
111
+ /* 渐隐带宽跟着尺寸档走,与滚动条厚度同一个 data-size */
112
+ --xh-_scroll-area-fade-size: var(--xh-scroll-area-fade-size, var(--xh-space-6));
113
+ /* 四条边各自的带宽:到头那一侧收成 0,没到头才铺开 */
114
+ --xh-_scroll-area-fade-block-start: 0px;
115
+ --xh-_scroll-area-fade-block-end: 0px;
116
+ --xh-_scroll-area-fade-inline-start: 0px;
117
+ --xh-_scroll-area-fade-inline-end: 0px;
118
+ --xh-_scroll-area-fade-left: var(--xh-_scroll-area-fade-inline-start);
119
+ --xh-_scroll-area-fade-right: var(--xh-_scroll-area-fade-inline-end);
120
+
121
+ -webkit-mask-image:
122
+ linear-gradient(to bottom, transparent 0, black var(--xh-_scroll-area-fade-block-start), black calc(100% - var(--xh-_scroll-area-fade-block-end)), transparent 100%),
123
+ linear-gradient(to right, transparent 0, black var(--xh-_scroll-area-fade-left), black calc(100% - var(--xh-_scroll-area-fade-right)), transparent 100%);
124
+ mask-image:
125
+ linear-gradient(to bottom, transparent 0, black var(--xh-_scroll-area-fade-block-start), black calc(100% - var(--xh-_scroll-area-fade-block-end)), transparent 100%),
126
+ linear-gradient(to right, transparent 0, black var(--xh-_scroll-area-fade-left), black calc(100% - var(--xh-_scroll-area-fade-right)), transparent 100%);
127
+ -webkit-mask-composite: source-in;
128
+ mask-composite: intersect;
129
+ /* 滚到头时那一侧的带子淡去、离开端点时淡回,不在到端那一帧瞬间消失 */
130
+ transition:
131
+ --xh-_scroll-area-fade-block-start var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
132
+ --xh-_scroll-area-fade-block-end var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
133
+ --xh-_scroll-area-fade-inline-start var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
134
+ --xh-_scroll-area-fade-inline-end var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
135
+ }
136
+
137
+ .xh-scope-scroll-area[data-part='viewport'][data-variant='fade'][data-size='sm'] {
138
+ --xh-_scroll-area-fade-size: var(--xh-scroll-area-fade-size, var(--xh-space-4));
139
+ }
140
+
141
+ .xh-scope-scroll-area[data-part='viewport'][data-variant='fade'][data-size='lg'] {
142
+ --xh-_scroll-area-fade-size: var(--xh-scroll-area-fade-size, var(--xh-space-8));
143
+ }
144
+
145
+ /* 还回得去、还去得了的那一侧才铺带:贴着那一端时属性在场,规则不命中 */
146
+ .xh-scope-scroll-area[data-part='viewport'][data-variant='fade']:not([data-at-min-vertical]) {
147
+ --xh-_scroll-area-fade-block-start: var(--xh-_scroll-area-fade-size);
148
+ }
149
+
150
+ .xh-scope-scroll-area[data-part='viewport'][data-variant='fade']:not([data-at-max-vertical]) {
151
+ --xh-_scroll-area-fade-block-end: var(--xh-_scroll-area-fade-size);
152
+ }
153
+
154
+ .xh-scope-scroll-area[data-part='viewport'][data-variant='fade']:not([data-at-min-horizontal]) {
155
+ --xh-_scroll-area-fade-inline-start: var(--xh-_scroll-area-fade-size);
156
+ }
157
+
158
+ .xh-scope-scroll-area[data-part='viewport'][data-variant='fade']:not([data-at-max-horizontal]) {
159
+ --xh-_scroll-area-fade-inline-end: var(--xh-_scroll-area-fade-size);
160
+ }
161
+
162
+ /* 从右往左排版时横轴的起始端在右:两端对调,逻辑那两支槽的取值不动 */
163
+ [dir='rtl'] .xh-scope-scroll-area[data-part='viewport'][data-variant='fade'] {
164
+ --xh-_scroll-area-fade-left: var(--xh-_scroll-area-fade-inline-end);
165
+ --xh-_scroll-area-fade-right: var(--xh-_scroll-area-fade-inline-start);
166
+ }
167
+
168
+ /* 横向溢出全靠它撑:内容若跟着视口一起收成 100% 宽,横轴永远量不出溢出,
169
+ 横向滚动条也就永远不显形。 */
170
+ .xh-scope-scroll-area[data-part='content'] {
171
+ min-inline-size: fit-content;
172
+ }
173
+
174
+ /* 滚动条挂载点同时充当那条 scrollbar 的根节点:scrollbar 那份皮肤的根规则落在
175
+ .xh-scope-scrollbar[data-part='root'] 上,而这里没有那个节点,根该有的排布得在这儿补齐
176
+ (轨道与滑块的皮仍归 scrollbar 那一份)。滑块主轴的起点与长度由连接层写进内联样式,这里不碰。 */
177
+ .xh-scope-scroll-area[data-part='scrollbar'] {
178
+ position: absolute;
179
+ /* 浮层的 positioner 一律 pointer-events: none,条子作为它的子节点会继承到,拖不动也点不着;
180
+ 收起态那条规则优先级更高,仍旧穿透 */
181
+ pointer-events: auto;
182
+ /* touch-action 关掉浏览器自己的手势:不关的话手指一按滑块页面就跟着滚,
183
+ 指针随即被系统收走(pointercancel),拖到一半的滑块停在原地。
184
+ user-select 同理——拖动时选中页面文字会让滑块"粘"住。 */
185
+ touch-action: none;
186
+ user-select: none;
187
+ /* 露出与收起都淡变;收起态连 visibility 一起收,退场播完才真正摸不到 */
188
+ transition:
189
+ opacity var(--xh-motion-duration-enter) var(--xh-motion-ease-enter),
190
+ visibility 0s linear 0s;
191
+ }
192
+
193
+ .xh-scope-scroll-area[data-part='scrollbar'][data-orientation='vertical'] {
194
+ inset-block: 0;
195
+ inset-inline-end: 0;
196
+ inline-size: var(--xh-_scrollbar-thickness);
197
+ }
198
+
199
+ .xh-scope-scroll-area[data-part='scrollbar'][data-orientation='horizontal'] {
200
+ inset-inline: 0;
201
+ inset-block-end: 0;
202
+ block-size: var(--xh-_scrollbar-thickness);
203
+ }
204
+
205
+ /* 两条都在场:各自在末端让出交叉口那一格,交叉口由竖条里的 corner 补 */
206
+ .xh-scope-scroll-area[data-part='scrollbar'][data-orientation='vertical'][data-gutter] {
207
+ inset-block-end: var(--xh-_scrollbar-thickness);
208
+ }
209
+
210
+ .xh-scope-scroll-area[data-part='scrollbar'][data-orientation='horizontal'][data-gutter] {
211
+ inset-inline-end: var(--xh-_scrollbar-thickness);
212
+ }
213
+
214
+ .xh-scope-scroll-area[data-part='scrollbar'][data-state='hidden'] {
215
+ visibility: hidden;
216
+ opacity: 0;
217
+ pointer-events: none;
218
+ transition:
219
+ opacity var(--xh-motion-duration-exit) var(--xh-motion-ease-exit),
220
+ visibility 0s linear var(--xh-motion-duration-exit);
221
+ }
222
+
223
+ /* 触屏上交给原生滚动:整条不占位也不画 */
224
+ .xh-scope-scroll-area[data-part='scrollbar'][data-native] {
225
+ display: none;
226
+ }
227
+
228
+ /* 除视口外全是纯容器:既不进 Tab 序列也不承载焦点,作者若给它们加了 tabindex,
229
+ 该显形的也该是视口那圈环,不是这里再多画一圈 */
230
+ .xh-scope-scroll-area[data-part='root']:focus-visible,
231
+ .xh-scope-scroll-area[data-part='content']:focus-visible,
232
+ .xh-scope-scroll-area[data-part='scrollbar']:focus-visible {
233
+ outline: none;
234
+ }
235
+
236
+ /* display 会盖掉 UA 的 [hidden]{display:none},凡是被赋了 display 的角色节点都要显式让位 */
237
+ .xh-scope-scroll-area[data-part='scrollbar'][hidden] {
238
+ display: none;
239
+ }
240
+ }
@@ -0,0 +1,204 @@
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
+ /* 定义 scrollbar 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-scrollbar {
11
+ --xh-scrollbar-skin: 1;
12
+ }
13
+
14
+ /* 库内原生滚动面的细条规则住在 reset 层(reset.css),本文件只管自绘条本身。
15
+ 挂了自绘滚动条的容器:原生滚动条只藏外观,滚动能力一点不动。
16
+ 标记由机器挂监听时打上,最后一条滚动条拆走才撤。这条是 (0,1,0),压得过 reset 层的 thin;
17
+ 下面那条 ::-webkit-scrollbar 兜住还没实现 scrollbar-width 的引擎 */
18
+ [data-xh-scrollbar] {
19
+ scrollbar-width: none;
20
+ }
21
+
22
+ [data-xh-scrollbar]::-webkit-scrollbar {
23
+ display: none;
24
+ }
25
+
26
+ /* 定位分工:滑块在**主轴**上的起点与长度由连接层每帧写进内联样式——
27
+ 竖向是 inset-block-start / block-size,横向是 inset-inline-start / inline-size。
28
+ 这份皮肤一个都不碰:内联优先级高于样式表,写了不但是死声明,
29
+ 换轴的那一帧还会跟连接层清空另一轴的动作抢位置,把滑块钉在两轴都被约束的地方。
30
+ 皮肤只管另一条轴(交叉轴)的尺寸、颜色、圆角与状态表现。
31
+
32
+ 根用绝对定位、贴容器的对应边:滚动容器归作者,本组件只要求它自己的定位祖先建了上下文。
33
+ 作者要把它放在别处(比如浮在内容之上、或摆到框外),改这一条即可。 */
34
+ .xh-scope-scrollbar[data-part='root'] {
35
+ /* 厚度只算一次:尺寸档换的就是它,交叉口的让位与补丁都按同一个数 */
36
+ --xh-_scrollbar-thickness: var(--xh-scrollbar-thickness-md);
37
+
38
+ position: absolute;
39
+ /* 浮层的 positioner 一律 pointer-events: none,条子作为它的子节点会继承到,拖不动也点不着;
40
+ 收起态那条规则优先级更高,仍旧穿透 */
41
+ pointer-events: auto;
42
+ /* touch-action 关掉浏览器自己的手势:不关的话手指一按滑块页面就跟着滚,
43
+ 指针随即被系统收走(pointercancel),拖到一半的滑块停在原地。
44
+ user-select 同理——拖动时选中页面文字会让滑块"粘"住。 */
45
+ touch-action: none;
46
+ user-select: none;
47
+ /* 露出与收起都淡变;收起态连 visibility 一起收,退场播完才真正摸不到、也进不了 Tab 序 */
48
+ transition:
49
+ opacity var(--xh-motion-duration-enter) var(--xh-motion-ease-enter),
50
+ visibility 0s linear 0s;
51
+ }
52
+
53
+ .xh-scope-scrollbar[data-part='root'][data-size='sm'] {
54
+ --xh-_scrollbar-thickness: var(--xh-scrollbar-thickness-sm);
55
+ }
56
+
57
+ .xh-scope-scrollbar[data-part='root'][data-size='lg'] {
58
+ --xh-_scrollbar-thickness: var(--xh-scrollbar-thickness-lg);
59
+ }
60
+
61
+ .xh-scope-scrollbar[data-part='root'][data-orientation='vertical'] {
62
+ inset-block: 0;
63
+ inset-inline-end: 0;
64
+ inline-size: var(--xh-_scrollbar-thickness);
65
+ }
66
+
67
+ .xh-scope-scrollbar[data-part='root'][data-orientation='horizontal'] {
68
+ inset-inline: 0;
69
+ inset-block-end: 0;
70
+ block-size: var(--xh-_scrollbar-thickness);
71
+ }
72
+
73
+ /* 横竖两条同时摆着:各自在末端让出交叉口那一格,交叉口由 corner 补 */
74
+ .xh-scope-scrollbar[data-part='root'][data-orientation='vertical'][data-gutter] {
75
+ inset-block-end: var(--xh-_scrollbar-thickness);
76
+ }
77
+
78
+ .xh-scope-scrollbar[data-part='root'][data-orientation='horizontal'][data-gutter] {
79
+ inset-inline-end: var(--xh-_scrollbar-thickness);
80
+ }
81
+
82
+ /* 贴在滚动层上的根:位置由连接层按层在壳内的偏移盒写成内联几何(含让位),
83
+ 壳边的 inset 全部放开,交叉轴的厚度仍由上面的方向规则给 */
84
+ .xh-scope-scrollbar[data-part='root'][data-anchor='layer'] {
85
+ inset: auto;
86
+ }
87
+
88
+ .xh-scope-scrollbar[data-part='root'][data-state='hidden'] {
89
+ visibility: hidden;
90
+ opacity: 0;
91
+ pointer-events: none;
92
+ transition:
93
+ opacity var(--xh-motion-duration-exit) var(--xh-motion-ease-exit),
94
+ visibility 0s linear var(--xh-motion-duration-exit);
95
+ }
96
+
97
+ /* 触屏上交给原生滚动:整条不占位也不画 */
98
+ .xh-scope-scrollbar[data-part='root'][data-native] {
99
+ display: none;
100
+ }
101
+
102
+ /* 轨道铺满根,滑块的行程按它量。内边距把滑块从两侧收进来一点,
103
+ 与 scroll-area 那份共用同一个间隙令牌 */
104
+ .xh-scope-scrollbar[data-part='track'] {
105
+ position: relative;
106
+ inline-size: 100%;
107
+ block-size: 100%;
108
+ padding: var(--xh-scrollbar-gutter);
109
+ background: var(--xh-scrollbar-track-bg, var(--xh-bg-scrollbar-track));
110
+ }
111
+
112
+ /* 滑块。主轴(起点 + 长度)来自内联样式,这里只给定位模式、交叉轴与配色。
113
+ 绝不给 inset / size 加过渡:滚动时这两个值每帧都在变,一加过渡滑块就永远追在内容后面。
114
+ 也刻意不写 min-block-size / min-inline-size:滑块的最短长度由几何层折进内联尺寸里,
115
+ 样式表再给一个下限就成了两个事实源,两者一旦不一致,滑块的实际长度与它能走的距离就对不上。 */
116
+ .xh-scope-scrollbar[data-part='thumb'] {
117
+ position: absolute;
118
+ border-radius: var(--xh-scrollbar-thumb-radius, var(--xh-shape-pill));
119
+ background: var(
120
+ --xh-scrollbar-thumb-bg,
121
+ var(--xh-fg-scrollbar-thumb)
122
+ );
123
+ /* 滑块里没有字,这支墨色只给聚焦环用。 */
124
+ color: var(--xh-fg-default);
125
+ cursor: default;
126
+ transition:
127
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
128
+ color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
129
+ }
130
+
131
+ /* 交叉轴在轨道内两侧各收进一个间隙,与轨道那条 padding 共用同一个旋钮。
132
+ 这一侧的 inset 连接层每帧写成空串(即不设),样式表接手才有确定值;
133
+ 不写的话绝对定位会退回"静态位置"。
134
+ 主轴那一侧一律不写:几何层量的轨道是 padding box,滑块长度也解析在同一个盒子上。 */
135
+ .xh-scope-scrollbar[data-part='thumb'][data-orientation='vertical'] {
136
+ inset-inline: var(--xh-scrollbar-gutter);
137
+ }
138
+
139
+ .xh-scope-scrollbar[data-part='thumb'][data-orientation='horizontal'] {
140
+ inset-block: var(--xh-scrollbar-gutter);
141
+ }
142
+
143
+ /* 这两档的面往另一头走(浅色主题更深、深色主题更亮),配对的墨色跟着翻到反色那一支 */
144
+ .xh-scope-scrollbar[data-part='thumb']:hover {
145
+ background: var(
146
+ --xh-scrollbar-thumb-bg-hover,
147
+ var(--xh-fg-scrollbar-thumb-hover)
148
+ );
149
+ }
150
+
151
+ .xh-scope-scrollbar[data-part='thumb'][data-dragging] {
152
+ background: var(
153
+ --xh-scrollbar-thumb-bg-active,
154
+ var(--xh-fg-scrollbar-thumb-active)
155
+ );
156
+ }
157
+
158
+ /* 面是实心的中性色,环色与面同族,画在面里就看不出来;环改取这一档配对的墨色 */
159
+ .xh-scope-scrollbar[data-part='thumb']:not([data-disabled]):focus-visible {
160
+ --xh-_ring-color: currentColor;
161
+ }
162
+
163
+ /* 根与轨道都是纯容器,不承载焦点;作者若给它们加了 tabindex,也不该在这儿多画一圈 */
164
+ .xh-scope-scrollbar[data-part='root']:focus-visible,
165
+ .xh-scope-scrollbar[data-part='track']:focus-visible {
166
+ outline: none;
167
+ }
168
+
169
+ /* 禁用:整条不显形,这里只兜住作者硬把它显出来的那一路 */
170
+ .xh-scope-scrollbar[data-part='thumb'][data-disabled] {
171
+ background: var(--xh-scrollbar-thumb-bg-disabled, var(--xh-border-subtle));
172
+ }
173
+
174
+ /* 交叉口补丁:贴在本条末端之外的那一格,与轨道同色,跟着本条淡入淡出 */
175
+ .xh-scope-scrollbar[data-part='corner'] {
176
+ position: absolute;
177
+ inline-size: var(--xh-_scrollbar-thickness);
178
+ block-size: var(--xh-_scrollbar-thickness);
179
+ background: var(--xh-scrollbar-corner-bg, var(--xh-scrollbar-track-bg, transparent));
180
+ }
181
+
182
+ .xh-scope-scrollbar[data-part='corner'][data-orientation='vertical'] {
183
+ inset-inline-start: 0;
184
+ inset-block-end: calc(-1 * var(--xh-_scrollbar-thickness));
185
+ }
186
+
187
+ .xh-scope-scrollbar[data-part='corner'][data-orientation='horizontal'] {
188
+ inset-block-start: 0;
189
+ inset-inline-end: calc(-1 * var(--xh-_scrollbar-thickness));
190
+ }
191
+
192
+ .xh-scope-scrollbar[data-part='root'][hidden],
193
+ .xh-scope-scrollbar[data-part='corner'][hidden] {
194
+ display: none;
195
+ }
196
+
197
+ @media print {
198
+ /* 打印:滚动条画的是「还能往下看多少」,纸上没有这回事,它只会在版心边上留一条灰带。 */
199
+ .xh-scope-scrollbar[data-part='root'],
200
+ .xh-scope-scrollbar[data-part='corner'] {
201
+ display: none;
202
+ }
203
+ }
204
+ }