@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,108 @@
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
+ /* 定义 truncate 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-truncate {
11
+ --xh-truncate-skin: 1;
12
+ }
13
+
14
+ /* 单行:一行装不下就收成省略号。
15
+ 行数由连接层写进这个盒子的内联 style,样式表这一行只是它缺席时的落点 */
16
+ .xh-scope-truncate[data-part='root'] {
17
+ --xh-_truncate-lines: 1;
18
+
19
+ display: block;
20
+ overflow: hidden;
21
+ white-space: nowrap;
22
+ text-overflow: ellipsis;
23
+ }
24
+
25
+ /* 多行:按行数裁,裁掉的那一行末尾收省略号 */
26
+ .xh-scope-truncate[data-part='root'][data-multiline] {
27
+ display: -webkit-box;
28
+ overflow: hidden;
29
+ -webkit-box-orient: vertical;
30
+ /* 使用者槽排在前面:连接层把行数写成根上的内联私有槽,
31
+ 在外层写一句 --xh-truncate-lines 即可整片改档,不必逐处改标记 */
32
+ -webkit-line-clamp: var(--xh-truncate-lines, var(--xh-_truncate-lines));
33
+ white-space: normal;
34
+ /* 一长串没有断点的字符(网址、编号)也得断开,否则它一路撑出去,裁不住 */
35
+ overflow-wrap: break-word;
36
+ }
37
+
38
+ /* 铺开:裁剪整个撤掉。写在两档之后,压得住上面同权重的那两条 */
39
+ .xh-scope-truncate[data-part='root'][data-state='open'] {
40
+ display: block;
41
+ overflow: visible;
42
+ white-space: normal;
43
+ }
44
+
45
+ /* —— 中间省略 —— */
46
+ /* 盒子里的原文照旧排着、只是不上色:溢出照它量,读屏照它念,选中与复制拿到的也是整段。
47
+ 看得见的两段由两个伪元素画:前一半从头排、末尾收省略号,后一半从尾排、开头直接截断,
48
+ 两段各占一半宽度,拼起来就是省略号落在中间的那一版 */
49
+ .xh-scope-truncate[data-part='root'][data-middle-text] {
50
+ position: relative;
51
+ text-overflow: clip;
52
+ -webkit-text-fill-color: transparent;
53
+ }
54
+
55
+ .xh-scope-truncate[data-part='root'][data-middle-text]::before,
56
+ .xh-scope-truncate[data-part='root'][data-middle-text]::after {
57
+ position: absolute;
58
+ inset-block: 0;
59
+ inline-size: 50%;
60
+ overflow: hidden;
61
+ white-space: nowrap;
62
+ -webkit-text-fill-color: currentColor;
63
+ pointer-events: none;
64
+ }
65
+
66
+ /* 替代文字给空串:这两段只是画出来的样子,读屏念的是盒子里的原文 */
67
+ .xh-scope-truncate[data-part='root'][data-middle-text]::before {
68
+ content: attr(data-middle-text) / '';
69
+ inset-inline-start: 0;
70
+ text-overflow: ellipsis;
71
+ }
72
+
73
+ /* 后一半的盒子贴在末尾侧,文字照正文的方向排:弹性容器按末端对齐,放不下的部分从起始侧溢出,
74
+ 露出来的正是原文的结尾。不翻方向,也就不用分书写方向各写一版 */
75
+ .xh-scope-truncate[data-part='root'][data-middle-text]::after {
76
+ content: attr(data-middle-text) / '';
77
+ inset-inline-end: 0;
78
+ display: flex;
79
+ justify-content: flex-end;
80
+ }
81
+
82
+ /* —— 展开按钮 —— */
83
+ /* 盒型、悬停与按下面由 Action Control 的文字档给(ghost、sm);排在文字盒子之后另起一行,
84
+ 起始端对齐正文,不被外层的弹性布局拉宽 */
85
+ .xh-scope-truncate[data-part='trigger'] {
86
+ flex: none;
87
+ }
88
+
89
+ @media (forced-colors: active) {
90
+ /* 这一档不保证文字填色照写的走:退回末尾省略,原文按系统色直接显示 */
91
+ .xh-scope-truncate[data-part='root'][data-middle-text] {
92
+ text-overflow: ellipsis;
93
+ -webkit-text-fill-color: currentColor;
94
+ }
95
+
96
+ .xh-scope-truncate[data-part='root'][data-middle-text]::before,
97
+ .xh-scope-truncate[data-part='root'][data-middle-text]::after {
98
+ content: none;
99
+ }
100
+ }
101
+
102
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
103
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
104
+ .xh-scope-truncate[data-part='root'][hidden],
105
+ .xh-scope-truncate[data-part='trigger'][hidden] {
106
+ display: none;
107
+ }
108
+ }
@@ -0,0 +1,475 @@
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
+ /* 定义 typography 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 渐变字的前景:缺省透明,透出裁进字形的渐变;高对比作用域里换成实色,盖住渐变。
10
+ 轴边界上只路由这一个简单值,渐变本身仍在文字上按本地的两端颜色与走向求值,
11
+ 内层 default / more 能双向重置,也不会把未解析的组件变量冻结在祖先上。 */
12
+ :where(:root, [data-contrast='default']) {
13
+ --xh-_typography-gradient-fg: transparent;
14
+ }
15
+
16
+ :where([data-contrast='more']) {
17
+ --xh-_typography-gradient-fg: var(--xh-fg-default);
18
+ }
19
+
20
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
21
+ .xh-scope-typography {
22
+ --xh-typography-skin: 1;
23
+ }
24
+
25
+ .xh-scope-typography[data-part='root'] {
26
+ /* 尺寸档只换这几个私有槽,各段从根上继承它们,换档不必给每个部件各写一条选择器 */
27
+ --xh-_typography-body-size: var(--xh-text-body-size);
28
+ --xh-_typography-block-gap: var(--xh-space-4);
29
+ --xh-_typography-heading-gap: var(--xh-space-6);
30
+ /* 六级标题沿字号阶梯从 36 逐档降到 16:最小的 h6 仍比正文大一号 */
31
+ --xh-_typography-h1: var(--xh-font-size-5xl);
32
+ --xh-_typography-h2: var(--xh-font-size-4xl);
33
+ --xh-_typography-h3: var(--xh-font-size-3xl);
34
+ --xh-_typography-h4: var(--xh-font-size-2xl);
35
+ --xh-_typography-h5: var(--xh-font-size-xl);
36
+ --xh-_typography-h6: var(--xh-font-size-lg);
37
+ /* 读行宽度:整块正文不收窄就会拉成一行行难读的长句 */
38
+ --xh-_typography-measure: 68ch;
39
+ /* 行内代码跟着所在那行的字号缩:以「随文字走」的字形尺寸为基数按比例收一点,不取固定档位 */
40
+ --xh-_typography-code-size: calc(var(--xh-glyph-size-text) * 0.9);
41
+
42
+ /* 建块级格式化上下文,段落的外边距不越过根往外塌 */
43
+ display: flow-root;
44
+ max-inline-size: var(--xh-typography-measure, var(--xh-_typography-measure));
45
+ color: var(--xh-typography-fg, var(--xh-fg-default));
46
+ font-size: var(--xh-typography-font-size, var(--xh-_typography-body-size));
47
+ font-weight: var(--xh-typography-font-weight, var(--xh-text-body-weight));
48
+ line-height: var(--xh-typography-leading, var(--xh-text-body-leading));
49
+ }
50
+
51
+ /* 上面声明了 display,会盖掉 UA 的 [hidden] 规则,收起态要在这里接回来 */
52
+ .xh-scope-typography[data-part='root'][hidden] {
53
+ display: none;
54
+ }
55
+
56
+ /* 中间没有断点的长串——网址、令牌、无空格的标识——排到行尾就断开,不把整块正文顶宽。
57
+ 属性由后代继承,这里逐个部件写一遍,是为了任一部件单独用时也盖得到 */
58
+ .xh-scope-typography:is([data-part='root'], [data-part='heading'], [data-part='paragraph'], [data-part='prose']) {
59
+ overflow-wrap: break-word;
60
+ }
61
+
62
+ /* —— 尺寸 —— */
63
+ /* 小档整体降一级字号档位 */
64
+ .xh-scope-typography[data-part='root'][data-size='sm'] {
65
+ --xh-_typography-body-size: var(--xh-font-size-sm);
66
+ --xh-_typography-block-gap: var(--xh-space-3);
67
+ --xh-_typography-heading-gap: var(--xh-space-5);
68
+ --xh-_typography-h1: var(--xh-font-size-4xl);
69
+ --xh-_typography-h2: var(--xh-font-size-3xl);
70
+ --xh-_typography-h3: var(--xh-font-size-2xl);
71
+ --xh-_typography-h4: var(--xh-font-size-xl);
72
+ --xh-_typography-h5: var(--xh-font-size-lg);
73
+ --xh-_typography-h6: var(--xh-font-size-md);
74
+ }
75
+
76
+ /* 大档只放大正文与段距:标题档位在 5xl 见顶,六档保持原样 */
77
+ .xh-scope-typography[data-part='root'][data-size='lg'] {
78
+ --xh-_typography-body-size: var(--xh-font-size-lg);
79
+ --xh-_typography-block-gap: var(--xh-space-5);
80
+ --xh-_typography-heading-gap: var(--xh-space-8);
81
+ }
82
+
83
+ /* —— 对齐与字重 —— */
84
+ /* 两轴都画在根上,整块正文一起换;各段沿继承拿到 */
85
+ .xh-scope-typography[data-part='root'][data-align='start'] {
86
+ text-align: start;
87
+ }
88
+
89
+ .xh-scope-typography[data-part='root'][data-align='center'] {
90
+ text-align: center;
91
+ }
92
+
93
+ .xh-scope-typography[data-part='root'][data-align='end'] {
94
+ text-align: end;
95
+ }
96
+
97
+ .xh-scope-typography[data-part='root'][data-align='justify'] {
98
+ text-align: justify;
99
+ }
100
+
101
+ .xh-scope-typography[data-part='root'][data-weight='regular'] {
102
+ font-weight: var(--xh-typography-font-weight, var(--xh-font-weight-regular));
103
+ }
104
+
105
+ .xh-scope-typography[data-part='root'][data-weight='medium'] {
106
+ font-weight: var(--xh-typography-font-weight, var(--xh-font-weight-medium));
107
+ }
108
+
109
+ .xh-scope-typography[data-part='root'][data-weight='semibold'] {
110
+ font-weight: var(--xh-typography-font-weight, var(--xh-font-weight-semibold));
111
+ }
112
+
113
+ .xh-scope-typography[data-part='root'][data-weight='bold'] {
114
+ font-weight: var(--xh-typography-font-weight, var(--xh-font-weight-bold));
115
+ }
116
+
117
+ /* —— 块级段落 —— */
118
+ /* 库里没有全局 preflight,作者写的 hN / p 带着 UA 外边距,在这儿抹平 */
119
+ .xh-scope-typography[data-part='heading'],
120
+ .xh-scope-typography[data-part='paragraph'] {
121
+ margin: 0;
122
+ }
123
+
124
+ .xh-scope-typography[data-part='heading'] {
125
+ color: var(--xh-typography-heading-fg, var(--xh-fg-default));
126
+ font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h3));
127
+ font-weight: var(--xh-typography-heading-font-weight, var(--xh-font-weight-medium));
128
+ line-height: var(--xh-typography-heading-leading, var(--xh-leading-tight));
129
+ /* 标题折行时把各行拉得一样长 */
130
+ text-wrap: balance;
131
+ }
132
+
133
+ /* —— 标题档位 —— */
134
+ /* 使用者槽位排在档位之前:写死一个值即盖过全部六档 */
135
+ .xh-scope-typography[data-part='heading'][data-level='1'] {
136
+ font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h1));
137
+ }
138
+
139
+ .xh-scope-typography[data-part='heading'][data-level='2'] {
140
+ font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h2));
141
+ }
142
+
143
+ .xh-scope-typography[data-part='heading'][data-level='3'] {
144
+ font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h3));
145
+ }
146
+
147
+ .xh-scope-typography[data-part='heading'][data-level='4'] {
148
+ font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h4));
149
+ }
150
+
151
+ .xh-scope-typography[data-part='heading'][data-level='5'] {
152
+ font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h5));
153
+ }
154
+
155
+ .xh-scope-typography[data-part='heading'][data-level='6'] {
156
+ font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h6));
157
+ }
158
+
159
+ /* —— 段间距 —— */
160
+ /* 间距画在后一块的上边,块与块之间只留一份,正文末尾也不多出一截 */
161
+ .xh-scope-typography:is([data-part='heading'], [data-part='paragraph'])
162
+ + .xh-scope-typography:is([data-part='heading'], [data-part='paragraph']) {
163
+ margin-block-start: var(--xh-typography-block-gap, var(--xh-_typography-block-gap));
164
+ }
165
+
166
+ /* 标题上面留得更开,它带起的是下面一整段 */
167
+ .xh-scope-typography:is([data-part='heading'], [data-part='paragraph'])
168
+ + .xh-scope-typography[data-part='heading'] {
169
+ margin-block-start: var(--xh-typography-heading-gap, var(--xh-_typography-heading-gap));
170
+ }
171
+
172
+ /* —— 行内文字 —— */
173
+ /* 不写形态与语气时就是一段普通正文,这里只声明形态各自加的那一层 */
174
+ /* 次要文字与语气文字各有各的槽:两者同特异度、共用一个槽的话,
175
+ 调淡次要文字会把六族语气一并换成同一个灰。 */
176
+ .xh-scope-typography[data-part='text'][data-variant='muted'] {
177
+ color: var(--xh-typography-text-fg-muted, var(--xh-fg-muted));
178
+ }
179
+
180
+ .xh-scope-typography[data-part='text'][data-variant='strong'] {
181
+ font-weight: var(--xh-typography-text-font-weight, var(--xh-font-weight-medium));
182
+ }
183
+
184
+ .xh-scope-typography[data-part='text'][data-variant='code'] {
185
+ padding-block: var(--xh-typography-code-py, var(--xh-space-0_5));
186
+ padding-inline: var(--xh-typography-code-px, var(--xh-space-2));
187
+ border-radius: var(--xh-typography-code-radius, var(--xh-shape-inset));
188
+ background: var(--xh-typography-code-bg, var(--xh-bg-subtle));
189
+ color: var(--xh-typography-code-fg, var(--xh-fg-muted));
190
+ font-family: var(--xh-typography-code-font, var(--xh-font-family-mono));
191
+ font-size: var(--xh-typography-code-font-size, var(--xh-_typography-code-size));
192
+ }
193
+
194
+ /* 语气排在形态之后:两个轴一起写时,用哪族颜色由语气说了算 */
195
+ .xh-scope-typography[data-part='text'][data-tone] {
196
+ color: var(--xh-typography-text-fg-tone, var(--xh-_tone-fg));
197
+ }
198
+
199
+ /* 删除线与下划线是同一条装饰线的两个取值,两个开关都开时两条都画 */
200
+ .xh-scope-typography[data-part='text'][data-strikethrough] {
201
+ text-decoration-line: line-through;
202
+ }
203
+
204
+ .xh-scope-typography[data-part='text'][data-underline] {
205
+ text-decoration-line: underline;
206
+ text-underline-offset: var(--xh-typography-text-underline-offset, var(--xh-space-0_5));
207
+ }
208
+
209
+ .xh-scope-typography[data-part='text'][data-underline][data-strikethrough] {
210
+ text-decoration-line: underline line-through;
211
+ }
212
+
213
+ /* 标记:与文本高亮的命中片段同一副淡底、字色与收边,两处被标出的文字看起来是一回事。
214
+ 排在语气之后:同时写语气时底与字色一起换成该族,只写语气不写标记仍只换字色。
215
+ 跨行时两半各自收边,否则圆角与内边距只画在整段的首尾;两条都写:WebKit 只认带前缀那条 */
216
+ .xh-scope-typography[data-part='text'][data-marked] {
217
+ padding-inline: var(--xh-typography-mark-px, var(--xh-space-0_5));
218
+ border-radius: var(--xh-typography-mark-radius, var(--xh-shape-inset));
219
+ background: var(--xh-typography-mark-bg, var(--xh-bg-mark));
220
+ color: var(--xh-typography-mark-fg, var(--xh-fg-default));
221
+ -webkit-box-decoration-break: clone;
222
+ box-decoration-break: clone;
223
+ }
224
+
225
+ .xh-scope-typography[data-part='text'][data-marked][data-tone] {
226
+ background: var(--xh-typography-mark-bg, var(--xh-_tone-subtle));
227
+ color: var(--xh-typography-mark-fg, var(--xh-_tone-fg));
228
+ }
229
+
230
+ /* 字重排在形态之后:与 strong 一起写时,粗到哪一档由字重说了算 */
231
+ .xh-scope-typography[data-part='text'][data-weight='regular'] {
232
+ font-weight: var(--xh-font-weight-regular);
233
+ }
234
+
235
+ .xh-scope-typography[data-part='text'][data-weight='medium'] {
236
+ font-weight: var(--xh-font-weight-medium);
237
+ }
238
+
239
+ .xh-scope-typography[data-part='text'][data-weight='semibold'] {
240
+ font-weight: var(--xh-font-weight-semibold);
241
+ }
242
+
243
+ .xh-scope-typography[data-part='text'][data-weight='bold'] {
244
+ font-weight: var(--xh-font-weight-bold);
245
+ }
246
+
247
+ /* —— 渐变字 —— */
248
+ /* 渐变画在背景上,再用 background-clip 把背景裁进字形里;前景必须透明才透得出底下的渐变。
249
+ 两条 background-clip 都写:WebKit 只认带前缀那条。
250
+ -webkit-text-fill-color 在 WebKit 里决定字形填充色并盖过 color,跟着 color 走。
251
+ 排在语气之后:语气写的是前景色,渐变字的前景要留给上面那支透明槽 */
252
+ .xh-scope-typography[data-part='text'][data-variant='gradient'] {
253
+ /* 两端颜色各收一个私有槽:语气档换的是这两支,使用者槽仍排在它们前面 */
254
+ --xh-_typography-gradient-from: var(--xh-gradient-brand-from);
255
+ --xh-_typography-gradient-to: var(--xh-gradient-brand-to);
256
+
257
+ background-image: linear-gradient(
258
+ var(--xh-typography-gradient-direction, to right),
259
+ var(--xh-typography-gradient-from, var(--xh-_typography-gradient-from)),
260
+ var(--xh-typography-gradient-to, var(--xh-_typography-gradient-to))
261
+ );
262
+ -webkit-background-clip: text;
263
+ background-clip: text;
264
+ color: var(--xh-_typography-gradient-fg);
265
+ -webkit-text-fill-color: currentColor;
266
+ }
267
+
268
+ /* 语气换的是两端颜色:取该族主色与它压深一档的取值,深浅两态自动跟随 */
269
+ .xh-scope-typography[data-part='text'][data-variant='gradient'][data-tone] {
270
+ --xh-_typography-gradient-from: var(--xh-_tone);
271
+ --xh-_typography-gradient-to: var(--xh-_tone-active);
272
+ }
273
+
274
+ /* 无 JS 时的系统高对比、强制色与打印统一退回单色;显式局部轴由文件头那支前景槽负责 */
275
+ @media (prefers-contrast: more), (forced-colors: active), print {
276
+ .xh-scope-typography[data-part='text'][data-variant='gradient'] {
277
+ background-image: none;
278
+ color: inherit;
279
+ -webkit-text-fill-color: currentColor;
280
+ }
281
+ }
282
+
283
+ /* —— 行内链接 —— */
284
+ .xh-scope-typography[data-part='link'] {
285
+ border-radius: var(--xh-typography-link-radius, var(--xh-shape-inset));
286
+ color: var(--xh-typography-link-fg, var(--xh-fg-brand));
287
+ text-decoration: underline;
288
+ text-underline-offset: var(--xh-typography-link-underline-offset, var(--xh-space-0_5));
289
+ transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
290
+ }
291
+
292
+ /* 悬停只在能用指针的设备上生效,触摸端不留一个按不掉的悬停态 */
293
+ @media (hover: hover) {
294
+ .xh-scope-typography[data-part='link']:hover {
295
+ color: var(--xh-typography-link-fg-hover, var(--xh-fg-brand-strong));
296
+ }
297
+ }
298
+
299
+ /* —— 富文本 —— */
300
+ /*
301
+ * 外来的整段 HTML 铺在这里:Markdown 渲染结果、后端返回的富文本,节点由内容自己带,
302
+ * 作者写不出 data-part,所以样式按标签给。
303
+ *
304
+ * 标签一律包进 :where(),整条规则的特异度只剩 prose 这一层,块里嵌 XiHan 组件时
305
+ * 那份皮肤仍然赢。字号档位与段间距取根上那几支私有槽,跟着 data-size 一起换。
306
+ */
307
+ .xh-scope-typography[data-part='prose'] {
308
+ color: var(--xh-typography-prose-fg, var(--xh-fg-default));
309
+ font-size: var(--xh-typography-prose-font-size, var(--xh-_typography-body-size));
310
+ line-height: var(--xh-typography-prose-leading, var(--xh-text-prose-leading));
311
+ }
312
+
313
+ /* 库里没有全局 preflight,外来节点带着 UA 外边距,先在这儿抹平 */
314
+ .xh-scope-typography[data-part='prose']
315
+ :where(h1, h2, h3, h4, h5, h6, p, ul, ol, pre, blockquote, table, hr) {
316
+ margin: 0;
317
+ }
318
+
319
+ /* 间距画在后一块的上边,块与块之间只留一份,末块也不多出一截 */
320
+ .xh-scope-typography[data-part='prose']
321
+ :where(h1, h2, h3, h4, h5, h6, p, ul, ol, pre, blockquote, table, hr)
322
+ + :where(h1, h2, h3, h4, h5, h6, p, ul, ol, pre, blockquote, table, hr) {
323
+ margin-block-start: var(--xh-typography-prose-block-gap, var(--xh-_typography-block-gap));
324
+ }
325
+
326
+ /* 标题上面留得更开,它带起的是下面一整段 */
327
+ .xh-scope-typography[data-part='prose']
328
+ :where(h1, h2, h3, h4, h5, h6, p, ul, ol, pre, blockquote, table, hr)
329
+ + :where(h1, h2, h3, h4, h5, h6) {
330
+ margin-block-start: var(--xh-typography-prose-heading-gap, var(--xh-_typography-heading-gap));
331
+ }
332
+
333
+ .xh-scope-typography[data-part='prose'] :where(h1, h2, h3, h4, h5, h6) {
334
+ color: var(--xh-typography-prose-heading-fg, var(--xh-fg-default));
335
+ font-weight: var(--xh-typography-prose-heading-font-weight, var(--xh-font-weight-medium));
336
+ line-height: var(--xh-leading-tight);
337
+ text-wrap: balance;
338
+ }
339
+
340
+ /* 六档字号与 heading 部件同源:同一块正文里,作者写的标题与外来的标题一样大 */
341
+ .xh-scope-typography[data-part='prose'] :where(h1) {
342
+ font-size: var(--xh-typography-prose-h1, var(--xh-_typography-h1));
343
+ }
344
+
345
+ .xh-scope-typography[data-part='prose'] :where(h2) {
346
+ font-size: var(--xh-typography-prose-h2, var(--xh-_typography-h2));
347
+ }
348
+
349
+ .xh-scope-typography[data-part='prose'] :where(h3) {
350
+ font-size: var(--xh-typography-prose-h3, var(--xh-_typography-h3));
351
+ }
352
+
353
+ .xh-scope-typography[data-part='prose'] :where(h4) {
354
+ font-size: var(--xh-typography-prose-h4, var(--xh-_typography-h4));
355
+ }
356
+
357
+ .xh-scope-typography[data-part='prose'] :where(h5) {
358
+ font-size: var(--xh-typography-prose-h5, var(--xh-_typography-h5));
359
+ }
360
+
361
+ .xh-scope-typography[data-part='prose'] :where(h6) {
362
+ font-size: var(--xh-typography-prose-h6, var(--xh-_typography-h6));
363
+ }
364
+
365
+ /* 列表:项目符号要留在容器里面,缩进画在列表自己的起始内衬上 */
366
+ .xh-scope-typography[data-part='prose'] :where(ul, ol) {
367
+ padding-inline-start: var(--xh-typography-prose-list-ps, var(--xh-space-5));
368
+ }
369
+
370
+ .xh-scope-typography[data-part='prose'] :where(li + li) {
371
+ margin-block-start: var(--xh-typography-prose-item-gap, var(--xh-space-1));
372
+ }
373
+
374
+ /* 嵌套列表贴着上一项走,不按块与块之间那一档拉开 */
375
+ .xh-scope-typography[data-part='prose'] :where(li) > :where(ul, ol) {
376
+ margin-block-start: var(--xh-typography-prose-item-gap, var(--xh-space-1));
377
+ }
378
+
379
+ /* 富文本里的链接缺省跟着 link 部件走:同一块正文里两处不同源就会有两种链接样式 */
380
+ .xh-scope-typography[data-part='prose'] :where(a) {
381
+ border-radius: var(--xh-typography-prose-link-radius, var(--xh-typography-link-radius, var(--xh-shape-inset)));
382
+ color: var(--xh-typography-prose-link-fg, var(--xh-typography-link-fg, var(--xh-fg-brand)));
383
+ text-decoration: underline;
384
+ text-underline-offset: var(
385
+ --xh-typography-prose-link-underline-offset,
386
+ var(--xh-typography-link-underline-offset, var(--xh-space-0_5))
387
+ );
388
+ }
389
+
390
+ .xh-scope-typography[data-part='prose'] :where(strong) {
391
+ font-weight: var(--xh-typography-prose-strong-font-weight, var(--xh-font-weight-medium));
392
+ }
393
+
394
+ /* 行内代码与 text 部件的 code 形态同源,同一块正文里两条路写出来一个样 */
395
+ .xh-scope-typography[data-part='prose'] :where(code) {
396
+ padding-block: var(--xh-typography-code-py, var(--xh-space-0_5));
397
+ padding-inline: var(--xh-typography-code-px, var(--xh-space-2));
398
+ border-radius: var(--xh-typography-code-radius, var(--xh-shape-inset));
399
+ background: var(--xh-typography-code-bg, var(--xh-bg-subtle));
400
+ color: var(--xh-typography-code-fg, var(--xh-fg-muted));
401
+ font-family: var(--xh-typography-code-font, var(--xh-font-family-mono));
402
+ font-size: var(--xh-typography-code-font-size, var(--xh-_typography-code-size));
403
+ }
404
+
405
+ /* 代码块自己成一片面,长行横向滚动而不是把整块正文撑宽 */
406
+ .xh-scope-typography[data-part='prose'] :where(pre) {
407
+ overflow-x: auto;
408
+ padding: var(--xh-typography-prose-pre-padding, var(--xh-space-4));
409
+ border-radius: var(--xh-typography-prose-pre-radius, var(--xh-shape-surface));
410
+ background: var(--xh-typography-prose-pre-bg, var(--xh-bg-subtle));
411
+ font-family: var(--xh-typography-code-font, var(--xh-font-family-mono));
412
+ font-size: var(--xh-typography-code-font-size, var(--xh-_typography-code-size));
413
+ }
414
+
415
+ /* 代码块里的 code 已经在 pre 那片面里,不再各自套一层内衬与底色 */
416
+ .xh-scope-typography[data-part='prose'] :where(pre) :where(code) {
417
+ padding: 0;
418
+ border-radius: 0;
419
+ background: none;
420
+ font-size: inherit;
421
+ }
422
+
423
+ .xh-scope-typography[data-part='prose'] :where(blockquote) {
424
+ padding-inline-start: var(--xh-typography-prose-quote-ps, var(--xh-space-2));
425
+ border-inline-start: var(--xh-stroke-thick) solid
426
+ var(--xh-typography-prose-quote-border, var(--xh-border-strong));
427
+ color: var(--xh-typography-prose-quote-fg, inherit);
428
+ }
429
+
430
+ .xh-scope-typography[data-part='prose'] :where(hr) {
431
+ border: none;
432
+ border-block-start: var(--xh-stroke-thin) solid
433
+ var(--xh-typography-prose-rule-border, var(--xh-border-subtle));
434
+ }
435
+
436
+ /* 图片不许把整块正文撑宽,高度跟着缩才不变形 */
437
+ .xh-scope-typography[data-part='prose'] :where(img) {
438
+ max-inline-size: 100%;
439
+ block-size: auto;
440
+ }
441
+
442
+ .xh-scope-typography[data-part='prose'] :where(table) {
443
+ inline-size: 100%;
444
+ border-collapse: collapse;
445
+ }
446
+
447
+ .xh-scope-typography[data-part='prose'] :where(th, td) {
448
+ padding-block: var(--xh-typography-prose-cell-py, var(--xh-space-2));
449
+ padding-inline: var(--xh-typography-prose-cell-px, var(--xh-space-3));
450
+ border-block-end: var(--xh-stroke-thin) solid
451
+ var(--xh-typography-prose-cell-border, var(--xh-border-subtle));
452
+ text-align: start;
453
+ /* 表格的宽度由各格的最小宽度撑出来,格里的长串断得开,整张表才收得进正文的宽度 */
454
+ overflow-wrap: anywhere;
455
+ }
456
+
457
+ .xh-scope-typography[data-part='prose'] :where(th) {
458
+ font-weight: var(--xh-typography-prose-th-font-weight, var(--xh-font-weight-semibold));
459
+ }
460
+
461
+ @media (forced-colors: active) {
462
+ /* 这一档里自定义底色一律被换成 Canvas,标记会与正文分不开;用系统高亮反色把那一段画回来 */
463
+ .xh-scope-typography[data-part='text'][data-marked] {
464
+ background: Highlight;
465
+ color: HighlightText;
466
+ }
467
+ }
468
+
469
+ @media print {
470
+ /* 打印默认丢底色,标记只剩字色,被标出的那段在纸上就不显眼了 */
471
+ .xh-scope-typography[data-part='text'][data-marked] {
472
+ print-color-adjust: exact;
473
+ }
474
+ }
475
+ }
@@ -0,0 +1,58 @@
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
+ * 元素升级前的形态。
8
+ *
9
+ * 收起态由元素在 wire() 里用内联 display 做,而 data-scope / data-part 也是那一刻才打上,
10
+ * 所以 JS 到达之前这段子树既没有皮肤也没有收起——内容会以裸文本堆在页面流里,
11
+ * 并被搜索引擎与读屏当作正文。SSR / SSG 直出时这段时间尤其长。
12
+ *
13
+ * 这里按作者写的 data-xh-part 选中,那是升级前唯一存在的标记。
14
+ * 名单与元素的对应由 check-undefined-guard.mjs 双向守着。
15
+ */
16
+ @layer xihan.components {
17
+ :where(
18
+ xh-accordion,
19
+ xh-cascader,
20
+ xh-collapsible,
21
+ xh-color-picker,
22
+ xh-combobox,
23
+ xh-command,
24
+ xh-context-menu,
25
+ xh-date-picker,
26
+ xh-date-range-picker,
27
+ xh-dialog,
28
+ xh-drawer,
29
+ xh-floating-panel,
30
+ xh-hover-card,
31
+ xh-image-viewer,
32
+ xh-mention,
33
+ xh-menu,
34
+ xh-menubar,
35
+ xh-navigation-menu,
36
+ xh-pagination,
37
+ xh-popconfirm,
38
+ xh-popover,
39
+ xh-reasoning,
40
+ xh-select,
41
+ xh-side-nav,
42
+ xh-steps,
43
+ xh-time-picker,
44
+ xh-time-range-picker,
45
+ xh-tool-call,
46
+ xh-tooltip,
47
+ xh-tour,
48
+ xh-tree-select
49
+ ):not(:defined)
50
+ :where(
51
+ [data-xh-part='backdrop'],
52
+ [data-xh-part='content'],
53
+ [data-xh-part='positioner'],
54
+ [data-xh-part='viewport']
55
+ ) {
56
+ display: none;
57
+ }
58
+ }