@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,378 @@
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
+ /* 定义 marquee 样式。 */
7
+
8
+ /* 暂停开关走动作控件配方;独立皮肤同时传递引入,full bundle 递归去重。 */
9
+ @import '../family/action-control.css';
10
+
11
+ @layer xihan.motion {
12
+ /*
13
+ * 横轴一条、纵轴一条。四个方向乘两种铺法共八组起止点,若不外提就要写八份几乎一样的关键帧。
14
+ * 关键帧里的自定义属性取元素上的计算值,一圈跑下来它不变,所以两条就够。
15
+ */
16
+ @keyframes xh-marquee-x {
17
+ from {
18
+ transform: translateX(var(--xh-_marquee-from));
19
+ }
20
+
21
+ to {
22
+ transform: translateX(var(--xh-_marquee-to));
23
+ }
24
+ }
25
+
26
+ @keyframes xh-marquee-y {
27
+ from {
28
+ transform: translateY(var(--xh-_marquee-from));
29
+ }
30
+
31
+ to {
32
+ transform: translateY(var(--xh-_marquee-to));
33
+ }
34
+ }
35
+ }
36
+
37
+ @layer xihan.components {
38
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
39
+ .xh-scope-marquee {
40
+ --xh-marquee-skin: 1;
41
+ }
42
+
43
+ /*
44
+ * 窗口:只露出轨道的一段。
45
+ *
46
+ * 方向、轴与铺法全部换成根上的私有槽,轨道与每一份内容各自只有一条规则去取值。
47
+ * 这样写不只是为了短:轨道那条选择器因此能写成 [data-scope][data-part] 的复合式,
48
+ * 而不是从根往下够的后代式——marquee 里嵌一个同样有 content 部件的组件时,
49
+ * 后代式会一路匹配到别人家的节点上去。
50
+ *
51
+ * 一圈的时长 = 一份内容的长度 ÷ 每秒像素数。--xh-_marquee-span 是一份内容在滚动轴上的长度,
52
+ * 单位像素、写成纯数字:连接层挂载后实测、写成内联的 --xh-_marquee-measured-span,量到之前
53
+ * (无布局宿主、首帧)退回缺省值。使用者写了 --xh-marquee-span 以它为准。
54
+ */
55
+ .xh-scope-marquee[data-part='root'] {
56
+ /* 暂停开关的边长:开关用它定尺,两端渐隐按它给开关留出位置,两处同源 */
57
+ --xh-_marquee-trigger-size: var(--xh-control-h-md);
58
+ --xh-_marquee-span: var(--xh-marquee-span, var(--xh-_marquee-measured-span, 600));
59
+ --xh-_marquee-speed: var(--xh-marquee-speed, 60);
60
+
61
+ /* 铺一份时一圈走两倍自身长度:从窗口一侧整段进来,再整段出到另一侧 */
62
+ --xh-_marquee-duration: calc(2 * var(--xh-_marquee-span) / var(--xh-_marquee-speed) * 1s);
63
+ --xh-_marquee-play: running;
64
+ --xh-_marquee-flow: row;
65
+ --xh-_marquee-name: xh-marquee-x;
66
+ --xh-_marquee-track-inline: max-content;
67
+ --xh-_marquee-track-block: auto;
68
+
69
+ /* 轨道自身至少铺满窗口,起点那一跳才真的落在窗口外面 */
70
+ --xh-_marquee-fill-inline: 100%;
71
+ --xh-_marquee-fill-block: auto;
72
+ --xh-_marquee-copy-inline: auto;
73
+ --xh-_marquee-copy-block: auto;
74
+ --xh-_marquee-gap-inline: var(--xh-marquee-gap, var(--xh-space-6));
75
+ --xh-_marquee-gap-block: 0;
76
+ --xh-_marquee-from: 100%;
77
+ --xh-_marquee-to: -100%;
78
+
79
+ /* 暂停开关压在窗口一端,定位基准是窗口;isolation 把开关的层号关在本组件内,不参与页面级层序 */
80
+ position: relative;
81
+ isolation: isolate;
82
+ display: flex;
83
+ overflow: hidden;
84
+ max-inline-size: 100%;
85
+ }
86
+
87
+ /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},补这条兜住收起态 */
88
+ .xh-scope-marquee[data-part='root'][hidden] {
89
+ display: none;
90
+ }
91
+
92
+ /* 竖着滚要有一个定高的窗口,否则内容自己把窗口撑到一样高,一格都走不动 */
93
+ .xh-scope-marquee[data-part='root'][data-orientation='vertical'] {
94
+ --xh-_marquee-flow: column;
95
+ --xh-_marquee-name: xh-marquee-y;
96
+ --xh-_marquee-track-inline: auto;
97
+ --xh-_marquee-track-block: max-content;
98
+ --xh-_marquee-fill-inline: auto;
99
+ --xh-_marquee-fill-block: 100%;
100
+ --xh-_marquee-gap-inline: 0;
101
+ --xh-_marquee-gap-block: var(--xh-marquee-gap, var(--xh-space-6));
102
+
103
+ block-size: var(--xh-marquee-block-size, 10rem);
104
+ }
105
+
106
+ /* 往右、往下是同一条轨迹倒过来走 */
107
+ .xh-scope-marquee[data-part='root'][data-direction='right'],
108
+ .xh-scope-marquee[data-part='root'][data-direction='down'] {
109
+ --xh-_marquee-from: -100%;
110
+ --xh-_marquee-to: 100%;
111
+ }
112
+
113
+ /*
114
+ * 铺两份:一圈只走一份的长度,走完那一刻第二份正好压在起点上,看不出接缝。
115
+ * 这条排在竖轴那条之后:两者同权,铺两份时轨道自己不必铺满窗口,改由每一份各自铺满。
116
+ */
117
+ .xh-scope-marquee[data-part='root'][data-auto-fill] {
118
+ --xh-_marquee-duration: calc(var(--xh-_marquee-span) / var(--xh-_marquee-speed) * 1s);
119
+ --xh-_marquee-fill-inline: auto;
120
+ --xh-_marquee-fill-block: auto;
121
+ }
122
+
123
+ /* 内容短于窗口时每份自己先铺满一整窗,两份接起来才不会在接缝处露出空白 */
124
+ .xh-scope-marquee[data-part='root'][data-auto-fill][data-orientation='horizontal'] {
125
+ --xh-_marquee-copy-inline: 100%;
126
+ }
127
+
128
+ .xh-scope-marquee[data-part='root'][data-auto-fill][data-orientation='vertical'] {
129
+ --xh-_marquee-copy-block: 100%;
130
+ }
131
+
132
+ /* 起止点逐档写全:铺法与方向同权,交叉的四种情形各写一条才不看书写顺序 */
133
+ .xh-scope-marquee[data-part='root'][data-auto-fill][data-direction='left'],
134
+ .xh-scope-marquee[data-part='root'][data-auto-fill][data-direction='up'] {
135
+ --xh-_marquee-from: 0%;
136
+ --xh-_marquee-to: -50%;
137
+ }
138
+
139
+ .xh-scope-marquee[data-part='root'][data-auto-fill][data-direction='right'],
140
+ .xh-scope-marquee[data-part='root'][data-auto-fill][data-direction='down'] {
141
+ --xh-_marquee-from: -50%;
142
+ --xh-_marquee-to: 0%;
143
+ }
144
+
145
+ /*
146
+ * 两端渐隐:窗口沿滚动方向两端各留一段遮罩,内容从一端淡入、从另一端淡出。
147
+ * 遮罩只画在窗口上,轨道照常整段移动;遮罩是静态的,不参与动画。
148
+ * 遮罩的几层取值都经私有槽下发,真正写 mask 的只有这一条:减弱动效与打印只需在同一特指度上盖掉它。
149
+ */
150
+ .xh-scope-marquee[data-part='root'][data-fade] {
151
+ --xh-_marquee-fade-size: var(--xh-marquee-fade-size, var(--xh-space-6));
152
+ /* 横排沿行内方向:角度乘方向符号,rtl 下行首在右,两端各自仍是淡入与淡出 */
153
+ --xh-_marquee-fade-dir: calc(90deg * var(--xh-direction-sign));
154
+ /* 行尾那一段收到哪里为止:没有暂停开关时收到窗口尽头 */
155
+ --xh-_marquee-fade-reserve: 0px;
156
+ --xh-_marquee-fade-reserve-size: 0 0;
157
+ --xh-_marquee-fade-reserve-at: var(--xh-direction-end) center;
158
+ /* 两层:沿滚动方向的 alpha 坡道,与给暂停开关留出的实心块;两种写法共用这一份 */
159
+ --xh-_marquee-fade-mask:
160
+ linear-gradient(var(--xh-_marquee-fade-dir), transparent 0, black var(--xh-_marquee-fade-size), black calc(100% - var(--xh-_marquee-fade-reserve) - var(--xh-_marquee-fade-size)), transparent calc(100% - var(--xh-_marquee-fade-reserve))),
161
+ linear-gradient(black, black);
162
+
163
+ -webkit-mask-image: var(--xh-_marquee-fade-mask);
164
+ mask-image: var(--xh-_marquee-fade-mask);
165
+ -webkit-mask-size: 100% 100%, var(--xh-_marquee-fade-reserve-size);
166
+ mask-size: 100% 100%, var(--xh-_marquee-fade-reserve-size);
167
+ -webkit-mask-position: 0 0, var(--xh-_marquee-fade-reserve-at);
168
+ mask-position: 0 0, var(--xh-_marquee-fade-reserve-at);
169
+ -webkit-mask-repeat: no-repeat;
170
+ mask-repeat: no-repeat;
171
+ }
172
+
173
+ .xh-scope-marquee[data-part='root'][data-fade][data-orientation='vertical'] {
174
+ --xh-_marquee-fade-dir: to bottom;
175
+ }
176
+
177
+ /*
178
+ * 暂停开关压在行尾一端:行尾那段渐隐收到开关之前,第二层实心遮罩把开关所在那一块整块露出来,
179
+ * 开关不被淡掉,开关与淡出段之间也不留一条没淡的缝。竖排时开关在块末那一角,露出的是那一角的方块。
180
+ */
181
+ .xh-scope-marquee[data-part='root'][data-fade]:has(> .xh-scope-marquee[data-part='autoplay-trigger']:not([hidden])) {
182
+ --xh-_marquee-fade-reserve: calc(var(--xh-marquee-trigger-inset, var(--xh-space-1)) + var(--xh-_marquee-trigger-size));
183
+ --xh-_marquee-fade-reserve-size: var(--xh-_marquee-fade-reserve) 100%;
184
+ }
185
+
186
+ .xh-scope-marquee[data-part='root'][data-fade][data-orientation='vertical']:has(> .xh-scope-marquee[data-part='autoplay-trigger']:not([hidden])) {
187
+ --xh-_marquee-fade-reserve-size: var(--xh-_marquee-fade-reserve) var(--xh-_marquee-fade-reserve);
188
+ --xh-_marquee-fade-reserve-at: var(--xh-direction-end) bottom;
189
+ }
190
+
191
+ /*
192
+ * 悬停暂停:只在能用指针的设备上生效,触摸端不留一个按不掉的悬停态。
193
+ * 指针停在暂停开关上不算:那里显示的是开关自己的状态,按下「继续」时指针还在开关上,
194
+ * 若照样算悬停,轨道要等指针挪开才动,这一下按了像没按。
195
+ */
196
+ @media (hover: hover) {
197
+ .xh-scope-marquee[data-part='root'][data-pause-on-hover]:hover:not(:has(> .xh-scope-marquee[data-part='autoplay-trigger']:hover)) {
198
+ --xh-_marquee-play: paused;
199
+ }
200
+ }
201
+
202
+ /* 键盘用户没有悬停:焦点落进窗口时同样停住,否则轨道里的链接刚聚焦就被带走了;焦点在暂停开关上同理不算 */
203
+ .xh-scope-marquee[data-part='root'][data-pause-on-hover]:focus-within:not(:has(> .xh-scope-marquee[data-part='autoplay-trigger']:focus)) {
204
+ --xh-_marquee-play: paused;
205
+ }
206
+
207
+ /* 受控暂停:作者说了停就停,排在悬停两条之后,指针离开也不会把它带回去走 */
208
+ .xh-scope-marquee[data-part='root'][data-paused] {
209
+ --xh-_marquee-play: paused;
210
+ }
211
+
212
+ /*
213
+ * 暂停开关:压在窗口行尾一端、上下居中;竖排时落在块末那一角。
214
+ * 窗口是裁切内容的单行,开关放进去会被轨道挤出视野,只能浮在上面。
215
+ * 盒型、描边、字色与 0.97 按压由动作控件配方按 icon 档的描边档给出;描边档静息不填底,
216
+ * 这里把底换成不透明的面,悬停 / 按下走同一承载面的不透明阶梯,后面走过的内容才透不上来。
217
+ */
218
+ .xh-scope-marquee[data-part='autoplay-trigger'] {
219
+ --xh-action-bg-rest: var(--xh-marquee-trigger-bg, var(--xh-bg-surface));
220
+ --xh-action-bg-hover: var(--xh-marquee-trigger-bg-hover, var(--xh-bg-subtle-opaque));
221
+ --xh-action-bg-pressed: var(--xh-marquee-trigger-bg-active, var(--xh-bg-subtle-hover-opaque));
222
+ --xh-action-bg-focus-visible: var(--xh-marquee-trigger-bg, var(--xh-bg-surface));
223
+ /* 作者塞进来的图标跟着 icon 档走,与皮肤画的兜底字形同一把尺 */
224
+ --xh-icon-size: var(--xh-marquee-icon-size, var(--xh-_action-profile-glyph-size));
225
+ /* 边长与两端渐隐给开关留的位置同源,都读根上那一支 */
226
+ --xh-action-visual-size: var(--xh-_marquee-trigger-size);
227
+
228
+ position: absolute;
229
+ z-index: 1;
230
+ inset-block: 0;
231
+ inset-inline-end: var(--xh-marquee-trigger-inset, var(--xh-space-1));
232
+ margin-block: auto;
233
+ }
234
+
235
+ .xh-scope-marquee[data-part='root'][data-orientation='vertical'] > .xh-scope-marquee[data-part='autoplay-trigger'] {
236
+ inset-block-start: auto;
237
+ inset-block-end: var(--xh-marquee-trigger-inset, var(--xh-space-1));
238
+ margin-block: 0;
239
+ }
240
+
241
+ .xh-scope-marquee[data-part='autoplay-trigger'][hidden] {
242
+ display: none;
243
+ }
244
+
245
+ /* 不给内容时画图标:在走画暂停,停住画播放;图标随动作,与可及名同一口径 */
246
+ .xh-scope-marquee[data-part='autoplay-trigger']:empty::before {
247
+ content: '';
248
+ display: inline-block;
249
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
250
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
251
+ vertical-align: var(--xh-glyph-baseline-shift);
252
+ background-color: currentColor;
253
+ -webkit-mask: var(--xh-glyph-mark-pause) center / contain no-repeat;
254
+ mask: var(--xh-glyph-mark-pause) center / contain no-repeat;
255
+ }
256
+
257
+ .xh-scope-marquee[data-part='autoplay-trigger'][data-state='paused']:empty::before {
258
+ -webkit-mask-image: var(--xh-glyph-mark-play);
259
+ mask-image: var(--xh-glyph-mark-play);
260
+ }
261
+
262
+ /* 轨道:走的是这一层,一圈走完立刻回到起点接着走 */
263
+ .xh-scope-marquee[data-part='content'] {
264
+ display: flex;
265
+ flex: none;
266
+ flex-direction: var(--xh-_marquee-flow);
267
+ inline-size: var(--xh-_marquee-track-inline);
268
+ min-inline-size: var(--xh-_marquee-fill-inline);
269
+ block-size: var(--xh-_marquee-track-block);
270
+ min-block-size: var(--xh-_marquee-fill-block);
271
+ animation-name: var(--xh-_marquee-name);
272
+ animation-duration: var(--xh-_marquee-duration);
273
+ animation-timing-function: var(--xh-motion-ease-loop);
274
+ animation-iteration-count: infinite;
275
+ animation-play-state: var(--xh-_marquee-play);
276
+ }
277
+
278
+ /*
279
+ * 一份内容。份与份之间的空白做成每份自己的收尾内边距,而不是轨道上的 gap:
280
+ * gap 只加在中间那一道,两份就不等长了,而接缝对不对得上看的正是"走完的距离等于一份的长度"。
281
+ */
282
+ .xh-scope-marquee[data-part='content'] > [data-xh-copy] {
283
+ display: flex;
284
+ flex: none;
285
+ flex-direction: var(--xh-_marquee-flow);
286
+ align-items: center;
287
+ min-inline-size: var(--xh-_marquee-copy-inline);
288
+ min-block-size: var(--xh-_marquee-copy-block);
289
+ padding-inline-end: var(--xh-_marquee-gap-inline);
290
+ padding-block-end: var(--xh-_marquee-gap-block);
291
+ }
292
+
293
+ /*
294
+ * 减少动效:轨道停在起点不再走。一段自己动起来、不停到底的横移正是最容易引发不适的那一类,
295
+ * 这里不能只把速度压到很慢——慢速横移仍然是横移。
296
+ * 停下后窗口外那段就够不着了,故窗口同时改成可滚,内容仍然读得全。
297
+ * 两组规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion。
298
+ */
299
+ @media (prefers-reduced-motion: reduce) {
300
+ .xh-scope-marquee[data-part='content'] {
301
+ animation: none;
302
+ }
303
+
304
+ .xh-scope-marquee[data-part='root'] {
305
+ overflow: auto;
306
+ }
307
+
308
+ /* 停下后窗口改成可滚:两端再淡就把可滚内容的首尾藏起来了 */
309
+ .xh-scope-marquee[data-part='root'][data-fade] {
310
+ -webkit-mask-image: none;
311
+ mask-image: none;
312
+ }
313
+
314
+ /* 轨道已经停在起点:没有可停的东西,开关只会挡住可滚的内容 */
315
+ .xh-scope-marquee[data-part='autoplay-trigger'] {
316
+ display: none;
317
+ }
318
+ }
319
+
320
+ :where([data-motion='reduce']) .xh-scope-marquee[data-part='content'] {
321
+ animation: none;
322
+ }
323
+
324
+ :where([data-motion='reduce']) .xh-scope-marquee[data-part='root'] {
325
+ overflow: auto;
326
+ }
327
+
328
+ :where([data-motion='reduce']) .xh-scope-marquee[data-part='root'][data-fade] {
329
+ -webkit-mask-image: none;
330
+ mask-image: none;
331
+ }
332
+
333
+ :where([data-motion='reduce']) .xh-scope-marquee[data-part='autoplay-trigger'] {
334
+ display: none;
335
+ }
336
+
337
+ @media print {
338
+ /* 打印:动画会被定格在任意一帧——转了一半的圈、扫到一半的微光。这里换成静止的表达,
339
+ 取值与减弱动效那一档相同。两档各写一块、不并进一条媒体查询列表:减弱动效另有一份
340
+ :where([data-motion='reduce']) 的钩子版本与它成对,打印没有对应的钩子可配,
341
+ 并成一条之后这层配对关系在文本上就断了。 */
342
+ .xh-scope-marquee[data-part='content'] {
343
+ animation: none;
344
+ }
345
+
346
+ .xh-scope-marquee[data-part='root'] {
347
+ overflow: auto;
348
+ }
349
+
350
+ .xh-scope-marquee[data-part='root'][data-fade] {
351
+ -webkit-mask-image: none;
352
+ mask-image: none;
353
+ }
354
+
355
+ .xh-scope-marquee[data-part='autoplay-trigger'] {
356
+ display: none;
357
+ }
358
+ }
359
+
360
+ @media (forced-colors: active) {
361
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
362
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
363
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
364
+ 禁用取 GrayText */
365
+ .xh-scope-marquee[data-part='autoplay-trigger']:empty::before {
366
+ forced-color-adjust: none;
367
+ background-color: ButtonText;
368
+ }
369
+
370
+ .xh-scope-marquee[data-part='autoplay-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
371
+ background-color: HighlightText;
372
+ }
373
+
374
+ .xh-scope-marquee[data-part='autoplay-trigger'][data-disabled]:empty::before {
375
+ background-color: GrayText;
376
+ }
377
+ }
378
+ }
@@ -0,0 +1,70 @@
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
+ /* 定义 masonry 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-masonry {
11
+ --xh-masonry-skin: 1;
12
+ }
13
+
14
+ .xh-scope-masonry[data-part='root'] {
15
+ display: flex;
16
+ /* 各列按自己的内容收高,不被最高的那列拉平——列不等高正是瀑布流的样子 */
17
+ align-items: flex-start;
18
+ gap: var(--xh-_masonry-gap);
19
+
20
+ /* 列间距与列内的项间距共用这一份取值,声明在根上、由列继承下去;
21
+ 不写 gap 档位就不留间距。使用者槽位排在档位之前,写死一个值即盖过所有档 */
22
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-space-0));
23
+ }
24
+
25
+ /* 声明了 display 就盖掉了 UA 的 [hidden] 规则,这里还回去 */
26
+ .xh-scope-masonry[data-part='root'][hidden] {
27
+ display: none;
28
+ }
29
+
30
+ .xh-scope-masonry[data-part='column'] {
31
+ display: flex;
32
+ flex-direction: column;
33
+ /* 各列等宽;下限写 0 而不是 auto,一段长内容才不会把自己那列撑宽 */
34
+ flex: 1 1 0;
35
+ min-inline-size: 0;
36
+ gap: var(--xh-_masonry-gap);
37
+ }
38
+
39
+ /* 当前档位用不上的那几列由适配器收起;这条兜住作者自己写 hidden 的情形 */
40
+ .xh-scope-masonry[data-part='column'][hidden] {
41
+ display: none;
42
+ }
43
+
44
+ /* 项不发话,高度由内容定;只兜住一件事——不被列的弹性压缩,压缩了量到的高度就不是它真实的高度 */
45
+ .xh-scope-masonry[data-part='item'] {
46
+ flex: none;
47
+ }
48
+
49
+ /* —— 间距档位 —— */
50
+ /* 每一档指向一个间距令牌,列之间与列内项之间吃同一份间距 */
51
+ .xh-scope-masonry[data-part='root'][data-gap='xs'] {
52
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-xs));
53
+ }
54
+
55
+ .xh-scope-masonry[data-part='root'][data-gap='sm'] {
56
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-sm));
57
+ }
58
+
59
+ .xh-scope-masonry[data-part='root'][data-gap='md'] {
60
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-md));
61
+ }
62
+
63
+ .xh-scope-masonry[data-part='root'][data-gap='lg'] {
64
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-lg));
65
+ }
66
+
67
+ .xh-scope-masonry[data-part='root'][data-gap='xl'] {
68
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-xl));
69
+ }
70
+ }
@@ -0,0 +1,67 @@
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
+ /* 定义 matrix code 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-matrix-code {
11
+ --xh-matrix-code-skin: 1;
12
+ }
13
+
14
+ /*
15
+ * 根 <svg>。深浅两色取固定档而不是语义前景/背景:语义色跟着主题走,深色主题下整张码
16
+ * 会翻成浅底深模块的反相图,一部分读码器不认反相码。要换配色改下面这三个覆盖槽。
17
+ *
18
+ * 换色只有一条硬约束:码点必须比底色深,且两者对比要足。反相(浅码点深底)与
19
+ * 深浅相近都会让一部分读码器扫不出来,而这件事肉眼看不出来。
20
+ *
21
+ * --xh-matrix-code-fg 码点色,同时经 currentColor 传给码眼
22
+ * --xh-matrix-code-bg 底色,挖空矩形也用它
23
+ * --xh-matrix-code-eye-fg 码眼色,缺省跟随码点色
24
+ */
25
+ .xh-scope-matrix-code[data-part='root'] {
26
+ display: block;
27
+ border-radius: var(--xh-matrix-code-radius, var(--xh-shape-control));
28
+ background: var(--xh-matrix-code-bg, var(--xh-color-neutral-0));
29
+
30
+ /* 模块那条 path 不带自己的填充色,从这里继承下去 */
31
+ color: var(--xh-matrix-code-fg, var(--xh-color-neutral-950));
32
+ fill: currentColor;
33
+
34
+ /* 占位与码面之间来回时,底色与那圈描边淡变 */
35
+ transition:
36
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
37
+ box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
38
+ }
39
+
40
+ /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
41
+ .xh-scope-matrix-code[data-part='root'][hidden] {
42
+ display: none;
43
+ }
44
+
45
+ /* 码眼那条 path 恒在(与形状无关),没单独指定就退回 currentColor,跟码点同色 */
46
+ .xh-scope-matrix-code[data-part='root'] > [data-xh-geom='eyes'] {
47
+ fill: var(--xh-matrix-code-eye-fg, currentColor);
48
+ }
49
+
50
+ /*
51
+ * logo 底下那块挖空:填的必须与根的背景逐字同一个表达式,两处一起改。
52
+ * 差一点就会在 logo 四周露出一圈色差,读码器会把那圈当成模块边界。
53
+ */
54
+ .xh-scope-matrix-code[data-part='root'] > [data-xh-geom='logo-clear'] {
55
+ fill: var(--xh-matrix-code-bg, var(--xh-color-neutral-0));
56
+ }
57
+
58
+ /*
59
+ * 没有可编码的内容、以及内容超出容量:两种情形都一个模块不铺,留一块带描边的占位。
60
+ * 占位用的是语义色——它是界面元素不是码面,跟着主题走才对。
61
+ */
62
+ .xh-scope-matrix-code[data-part='root'][data-state='empty'],
63
+ .xh-scope-matrix-code[data-part='root'][data-state='error'] {
64
+ background: var(--xh-matrix-code-placeholder-bg, var(--xh-bg-subtle));
65
+ box-shadow: inset 0 0 0 var(--xh-stroke-thin) var(--xh-matrix-code-placeholder-border, var(--xh-border-default));
66
+ }
67
+ }