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