@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,306 @@
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
+ /* 定义 log 样式。 */
7
+
8
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
9
+ @import '../family/motion.css';
10
+ /* 独立皮肤同时传递引入回底钮的动作控件配方;full bundle 递归去重。 */
11
+ @import '../family/action-control.css';
12
+ @import '../family/material.css';
13
+
14
+ @layer xihan.components {
15
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
16
+ .xh-scope-log {
17
+ --xh-log-skin: 1;
18
+ }
19
+
20
+ /* 行高是本组件的定尺基准:视口按行数定高、每行排版,都从这一个槽位来。
21
+ 它的兜底值须与连接层内联高度里用的那份逐字一致,否则 rows 算出来的高度对不上行。 */
22
+ .xh-scope-log[data-part='root'] {
23
+ --xh-_log-line-h: var(--xh-log-line-height, var(--xh-text-code-leading));
24
+
25
+ /* 尺寸缺省档:不写 data-size 时的取值。三档只改这两个私有槽,
26
+ 公开槽留在读处当首选,作者在祖先上设的覆盖才赢得过档位声明。
27
+ 行高不在档内:视口按 rows 定高读的是同一个基准,三档同值才对得上整数行 */
28
+ --xh-_log-font-size: var(--xh-text-secondary-size);
29
+ --xh-_log-content-px: var(--xh-space-3);
30
+
31
+ /* 一张静态内容面:--xh-border-default 描边 + surface 底 + 无影(描边与淡底互斥),
32
+ 与 code-view / diff-view / json-viewer 同走 solid */
33
+ position: relative;
34
+ display: flex;
35
+ flex-direction: column;
36
+ overflow: hidden;
37
+ border: var(--xh-stroke-thin) solid var(--xh-log-border, var(--xh-border-default));
38
+ border-radius: var(--xh-log-radius, var(--xh-shape-surface));
39
+ background: var(--xh-log-bg, var(--xh-bg-surface));
40
+ box-shadow: var(--xh-log-shadow, none);
41
+ color: var(--xh-log-fg, var(--xh-fg-default));
42
+ }
43
+
44
+ /* 上面声明的 display 会盖掉 UA 的 [hidden]{display:none},这里补回 */
45
+ .xh-scope-log[data-part='root'][hidden] {
46
+ display: none;
47
+ }
48
+
49
+ /* 滚动容器,粘底读的是它的 scrollTop / clientHeight / scrollHeight。
50
+ flex-basis 取 auto,连接层写的按行数高度才算数,同时外层给了高度时还能撑满;
51
+ min-block-size: 0 让它在弹性父级里能被压缩从而真的溢出;
52
+ 两个轴都 auto:长行不折,横向也要能滚;
53
+ overscroll-behavior: contain 阻止滚动量传给页面。 */
54
+ .xh-scope-log[data-part='viewport'] {
55
+ flex: 1 1 auto;
56
+ min-block-size: 0;
57
+ block-size: calc(var(--xh-_log-line-h) * var(--xh-log-rows, 16));
58
+ overflow: auto;
59
+ overscroll-behavior: contain;
60
+ }
61
+
62
+ /* 还在用原生滚动条的视口留一条空道,滚动条出现与消失时不推动文字。
63
+ 带 data-xh-scrollbar 的容器已经把原生条藏成零宽,这条空道对它没有布局作用,排除掉 */
64
+ .xh-scope-log[data-part='viewport']:not([data-xh-scrollbar]) {
65
+ scrollbar-gutter: stable;
66
+ }
67
+
68
+ /* 接了虚拟滚动:视口只定高、不滚动,里面那层 Virtualizer 视口铺满它、由它滚;
69
+ 行放在 Virtualizer 的条目里没有 content 包裹层,等宽排版落在视口上由行继承 */
70
+ .xh-scope-log[data-part='viewport'][data-virtualized] {
71
+ display: grid;
72
+ grid-template-rows: minmax(0, 1fr);
73
+ overflow: hidden;
74
+ /* 不滚动的视口不留滚动条空道:空道由里面那层 Virtualizer 视口自己管 */
75
+ scrollbar-gutter: auto;
76
+ font-family: var(--xh-log-font, var(--xh-font-family-mono));
77
+ font-size: var(--xh-log-font-size, var(--xh-_log-font-size));
78
+ }
79
+
80
+ .xh-scope-log[data-part='viewport'][hidden] {
81
+ display: none;
82
+ }
83
+
84
+ .xh-scope-log[data-part='viewport'][data-virtualized] .xh-scope-log[data-part='line'] {
85
+ padding-inline: var(--xh-log-line-px, var(--xh-log-content-px, var(--xh-_log-content-px)));
86
+ }
87
+
88
+ /* 取行期间指针给出忙的反馈 */
89
+ .xh-scope-log[data-part='root'][data-loading] .xh-scope-log[data-part='viewport'] {
90
+ cursor: progress;
91
+ }
92
+
93
+ /* 等宽排版落在包裹层上,各行继承;行与行之间不留空隙,视口高度才等于整数行 */
94
+ .xh-scope-log[data-part='content'] {
95
+ display: block;
96
+ padding-inline: var(--xh-log-content-px, var(--xh-_log-content-px));
97
+ font-family: var(--xh-log-font, var(--xh-font-family-mono));
98
+ font-size: var(--xh-log-font-size, var(--xh-_log-font-size));
99
+ }
100
+
101
+ .xh-scope-log[data-part='content'][hidden] {
102
+ display: none;
103
+ }
104
+
105
+ /* 一行不折行,超出的部分由视口横向滚动;行高与定高基准同源 */
106
+ .xh-scope-log[data-part='line'] {
107
+ line-height: var(--xh-_log-line-h);
108
+ white-space: pre;
109
+ tab-size: var(--xh-log-tab-size, 4);
110
+ }
111
+
112
+ /* 级别只染行文颜色,不动排版:一行的高度是定高基准,四档必须等高。
113
+ 没写级别的行走内容层的前景色 */
114
+ .xh-scope-log[data-part='line'][data-level='debug'] {
115
+ color: var(--xh-log-level-debug-fg, var(--xh-fg-subtle));
116
+ }
117
+
118
+ .xh-scope-log[data-part='line'][data-level='info'] {
119
+ color: var(--xh-log-level-info-fg, var(--xh-fg-default));
120
+ }
121
+
122
+ .xh-scope-log[data-part='line'][data-level='warn'] {
123
+ color: var(--xh-log-level-warn-fg, var(--xh-fg-warning));
124
+ }
125
+
126
+ .xh-scope-log[data-part='line'][data-level='error'] {
127
+ color: var(--xh-log-level-error-fg, var(--xh-fg-danger));
128
+ }
129
+
130
+ /* ANSI 着色:八种颜色映射到语义令牌(红、绿、黄、蓝落在语气前景,品红、青借代码着色的关键字与字符串色,
131
+ 黑与白落在正文与次要前景),高亮色(90–97)与基础色同一档,只由 data-bright 记下。
132
+ 颜色盖过行的级别色;粗体、斜体、下划线与暗淡各自一个开关 */
133
+ .xh-scope-log[data-part='segment'][data-fg='black'] {
134
+ color: var(--xh-log-ansi-black, var(--xh-fg-default));
135
+ }
136
+
137
+ .xh-scope-log[data-part='segment'][data-fg='red'] {
138
+ color: var(--xh-log-ansi-red, var(--xh-fg-danger));
139
+ }
140
+
141
+ .xh-scope-log[data-part='segment'][data-fg='green'] {
142
+ color: var(--xh-log-ansi-green, var(--xh-fg-success));
143
+ }
144
+
145
+ .xh-scope-log[data-part='segment'][data-fg='yellow'] {
146
+ color: var(--xh-log-ansi-yellow, var(--xh-fg-warning));
147
+ }
148
+
149
+ .xh-scope-log[data-part='segment'][data-fg='blue'] {
150
+ color: var(--xh-log-ansi-blue, var(--xh-fg-info));
151
+ }
152
+
153
+ .xh-scope-log[data-part='segment'][data-fg='magenta'] {
154
+ color: var(--xh-log-ansi-magenta, var(--xh-syntax-keyword));
155
+ }
156
+
157
+ .xh-scope-log[data-part='segment'][data-fg='cyan'] {
158
+ color: var(--xh-log-ansi-cyan, var(--xh-syntax-string));
159
+ }
160
+
161
+ .xh-scope-log[data-part='segment'][data-fg='white'] {
162
+ color: var(--xh-log-ansi-white, var(--xh-fg-muted));
163
+ }
164
+
165
+ .xh-scope-log[data-part='segment'][data-bold] {
166
+ font-weight: var(--xh-log-ansi-bold-weight, var(--xh-font-weight-semibold));
167
+ }
168
+
169
+ /* 暗淡只在没指定颜色时换成次要前景:指定了颜色的那一段保留自己的颜色 */
170
+ .xh-scope-log[data-part='segment'][data-dim]:not([data-fg]) {
171
+ color: var(--xh-log-ansi-dim-fg, var(--xh-fg-subtle));
172
+ }
173
+
174
+ .xh-scope-log[data-part='segment'][data-italic] {
175
+ font-style: italic;
176
+ }
177
+
178
+ .xh-scope-log[data-part='segment'][data-underline] {
179
+ text-decoration: underline;
180
+ }
181
+
182
+ /* 回到底部:浮在视口右下角,收起时不卸载只隐藏。盒型、悬停 / 按下面与缩放由 Action Control 的
183
+ floating 档给(circle 正方盒、ghost 形态:白底承载 hover 100 → pressed 200);材质随角落浮钮族走
184
+ frosted 四件套(底 + 边 + 影 + 磨砂),这里只把使用者槽映射到桥接槽:
185
+ 字形按 xs 档取 --xh-_action-profile-glyph-size(16px),与 back-top 同一把尺 */
186
+ .xh-scope-log[data-part='scroll-to-end-trigger'] {
187
+ /* 面走材质家族配方(family/material.css):frosted 档的底、交互阶梯、描边、投影、1px 顶光与背景滤镜,
188
+ liquid 档由配方换成液态面;这里把使用者槽接到 Action Control 的桥接槽 */
189
+ --xh-action-bg-rest: var(--xh-log-scroll-to-end-trigger-bg, var(--xh-_material-bg));
190
+ --xh-action-bg-hover: var(--xh-log-scroll-to-end-trigger-bg-hover, var(--xh-_material-bg-hover));
191
+ --xh-action-bg-pressed: var(--xh-_material-bg-pressed);
192
+ --xh-action-bg-focus-visible: var(--xh-log-scroll-to-end-trigger-bg, var(--xh-_material-bg-focus));
193
+ --xh-action-bg-disabled: var(--xh-log-scroll-to-end-trigger-bg, var(--xh-_material-bg));
194
+ --xh-action-fg-rest: var(--xh-log-scroll-to-end-trigger-fg, var(--xh-_material-fg));
195
+ --xh-action-fg-hover: var(--xh-log-scroll-to-end-trigger-fg, var(--xh-_material-fg));
196
+ --xh-action-fg-pressed: var(--xh-log-scroll-to-end-trigger-fg, var(--xh-_material-fg));
197
+ --xh-action-fg-focus-visible: var(--xh-log-scroll-to-end-trigger-fg, var(--xh-_material-fg));
198
+ --xh-action-border-rest: var(--xh-log-scroll-to-end-trigger-border, var(--xh-_material-border));
199
+ --xh-action-border-hover: var(--xh-log-scroll-to-end-trigger-border, var(--xh-_material-border));
200
+ --xh-action-border-pressed: var(--xh-log-scroll-to-end-trigger-border, var(--xh-_material-border));
201
+ --xh-action-border-focus-visible: var(--xh-log-scroll-to-end-trigger-border, var(--xh-_material-border));
202
+ --xh-action-border-disabled: var(--xh-log-scroll-to-end-trigger-border, var(--xh-_material-border));
203
+ --xh-action-shadow-rest: var(--xh-log-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
204
+ --xh-action-shadow-hover: var(--xh-log-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
205
+ --xh-action-shadow-pressed: var(--xh-log-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
206
+ --xh-action-shadow-focus-visible: var(--xh-log-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
207
+ --xh-action-shadow-disabled: var(--xh-log-scroll-to-end-trigger-shadow, var(--xh-_material-shadow));
208
+ --xh-action-highlight-rest: var(--xh-_material-highlight);
209
+ --xh-action-highlight-hover: var(--xh-_material-highlight);
210
+ --xh-action-highlight-pressed: var(--xh-_material-highlight);
211
+ --xh-action-highlight-focus-visible: var(--xh-_material-highlight);
212
+ --xh-action-highlight-disabled: var(--xh-_material-highlight);
213
+ --xh-action-visual-size: var(--xh-log-scroll-to-end-trigger-size, var(--xh-_action-profile-visual-size));
214
+ --xh-action-radius: var(--xh-log-scroll-to-end-trigger-radius, var(--xh-shape-circle));
215
+ --xh-icon-size: var(--xh-log-icon-size, var(--xh-_action-profile-glyph-size));
216
+
217
+ position: absolute;
218
+ inset-block-end: var(--xh-log-scroll-to-end-trigger-inset, var(--xh-space-3));
219
+ inset-inline-end: var(--xh-log-scroll-to-end-trigger-inset, var(--xh-space-3));
220
+ }
221
+
222
+ /* 连接层收起按钮时写 hidden 属性,上面的 display 会盖掉 UA 规则,这里补回 */
223
+ .xh-scope-log[data-part='scroll-to-end-trigger'][hidden] {
224
+ display: none;
225
+ }
226
+
227
+ /* 收起不卸载:离底时冒出来播进场,回底时先播完退场、连接层才写 hidden 藏起。
228
+ 不写 display,可见性归上面那条 [hidden] 管;退场途中不再接指针 */
229
+ .xh-scope-log[data-part='scroll-to-end-trigger'][data-state='visible'] {
230
+ animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
231
+ }
232
+
233
+ .xh-scope-log[data-part='scroll-to-end-trigger'][data-state='hidden']:not([hidden]) {
234
+ pointer-events: none;
235
+ animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
236
+ }
237
+
238
+ /* 没写内容就由皮肤画一枚向下的字形;作者往按钮里塞了自己的图形,这条规则即不命中。
239
+ 不画的话这颗按钮就是一枚空盒,看不出它是干什么的——名字只在 aria-label 上 */
240
+ .xh-scope-log[data-part='scroll-to-end-trigger']:empty::before {
241
+ content: '';
242
+ display: inline-block;
243
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
244
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
245
+ vertical-align: var(--xh-glyph-baseline-shift);
246
+ background-color: currentColor;
247
+ -webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
248
+ mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
249
+ }
250
+
251
+ /* 尺寸档只改行文字号与内衬 */
252
+ .xh-scope-log[data-part='root'][data-size='sm'] {
253
+ --xh-_log-font-size: var(--xh-text-caption-size);
254
+ --xh-_log-content-px: var(--xh-space-2);
255
+ }
256
+
257
+ .xh-scope-log[data-part='root'][data-size='md'] {
258
+ --xh-_log-font-size: var(--xh-text-secondary-size);
259
+ --xh-_log-content-px: var(--xh-space-3);
260
+ }
261
+
262
+ .xh-scope-log[data-part='root'][data-size='lg'] {
263
+ --xh-_log-font-size: var(--xh-text-body-size);
264
+ --xh-_log-content-px: var(--xh-space-4);
265
+ }
266
+
267
+ /* 视觉隐藏但仍参与播报:用 clip-path 裁到不可见,不能用 display:none 或 visibility:hidden;
268
+ white-space: nowrap 防止 1px 宽把文本挤成竖排。 */
269
+ .xh-scope-log[data-part='live-region'] {
270
+ position: absolute;
271
+ inline-size: 1px;
272
+ block-size: 1px;
273
+ padding: 0;
274
+ margin: -1px;
275
+ overflow: hidden;
276
+ clip-path: inset(50%);
277
+ white-space: nowrap;
278
+ border: 0;
279
+ }
280
+
281
+ @media print {
282
+ /* 打印:回到底部这颗钮只有在能滚的地方才成立,落到纸上是一颗按不动的按钮。 */
283
+ .xh-scope-log[data-part='scroll-to-end-trigger'] {
284
+ display: none;
285
+ }
286
+ }
287
+
288
+ @media (forced-colors: active) {
289
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
290
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
291
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
292
+ 禁用取 GrayText */
293
+ .xh-scope-log[data-part='scroll-to-end-trigger']:empty::before {
294
+ forced-color-adjust: none;
295
+ background-color: ButtonText;
296
+ }
297
+
298
+ .xh-scope-log[data-part='scroll-to-end-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
299
+ background-color: HighlightText;
300
+ }
301
+
302
+ .xh-scope-log[data-part='scroll-to-end-trigger'][data-disabled]:empty::before {
303
+ background-color: GrayText;
304
+ }
305
+ }
306
+ }
@@ -0,0 +1,149 @@
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
+ /* 定义 markdown stream 样式。 */
7
+
8
+ @layer xihan.motion {
9
+ /* 光标的两段动效都定义在本文件里。皮肤可以按需单独引入,
10
+ 引用别处文件里的动画名时那份文件不一定在场,动画会静默地整个不跑 */
11
+ @keyframes xh-markdown-stream-caret {
12
+ 50% {
13
+ opacity: 0;
14
+ }
15
+ }
16
+
17
+ @keyframes xh-markdown-stream-caret-in {
18
+ from {
19
+ opacity: 0;
20
+ }
21
+ }
22
+ }
23
+
24
+ @layer xihan.components {
25
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
26
+ .xh-scope-markdown-stream {
27
+ --xh-markdown-stream-skin: 1;
28
+ }
29
+
30
+ .xh-scope-markdown-stream[data-part='root'] {
31
+ /* 尺寸缺省档:不写 data-size 时的取值。三档都只写这两个私有槽,
32
+ 公开槽留在读处当首选,作者在祖先上设的覆盖才赢得过档位声明 */
33
+ --xh-_markdown-stream-font-size: var(--xh-text-body-size);
34
+ --xh-_markdown-stream-gap: var(--xh-space-3);
35
+
36
+ color: var(--xh-markdown-stream-fg, var(--xh-fg-default));
37
+ font-size: var(--xh-markdown-stream-font-size, var(--xh-_markdown-stream-font-size));
38
+ line-height: var(--xh-markdown-stream-leading, var(--xh-text-prose-leading));
39
+ }
40
+
41
+ /* 块之间的距离由这一层给,块内部的排版归作者的正文样式 */
42
+ .xh-scope-markdown-stream[data-part='content'] {
43
+ display: flex;
44
+ flex-direction: column;
45
+ gap: var(--xh-markdown-stream-gap, var(--xh-_markdown-stream-gap));
46
+ }
47
+
48
+ .xh-scope-markdown-stream[data-part='content'][hidden] {
49
+ display: none;
50
+ }
51
+
52
+ .xh-scope-markdown-stream[data-part='block'] {
53
+ display: block;
54
+ min-inline-size: 0;
55
+ /* 块里铺的是渲染好的 Markdown,宽表格与不断行的长串由内容自己带;
56
+ 行内一轴可横滚,这类块自己滚,不把整篇正文顶宽 */
57
+ overflow-x: auto;
58
+ }
59
+
60
+ .xh-scope-markdown-stream[data-part='block'][hidden] {
61
+ display: none;
62
+ }
63
+
64
+ /* 代码块与公式块没人接管时铺的是原文,保住换行与缩进 */
65
+ .xh-scope-markdown-stream[data-part='block'][data-kind='code'],
66
+ .xh-scope-markdown-stream[data-part='block'][data-kind='math'] {
67
+ font-family: var(--xh-markdown-stream-mono, var(--xh-font-family-mono));
68
+ white-space: pre-wrap;
69
+ overflow-wrap: anywhere;
70
+ }
71
+
72
+ /* 流式光标落在带 data-caret 的那一格上:正文在长的时候是生长块的末尾,
73
+ 一个字都还没到的时候是外壳,所以「请求已经发出去」这件事第一帧就看得见。
74
+ 它落在块的最后一个顶层元素之后,不是最后一句话的末尾——要贴进段落里就得往已消毒的
75
+ html 注入节点,那会打穿「原生 HTML 一律不透传」这条约束 */
76
+ .xh-scope-markdown-stream[data-part='root'][data-caret]::after,
77
+ .xh-scope-markdown-stream[data-part='block'][data-caret]::after {
78
+ display: inline-block;
79
+ background: var(--xh-markdown-stream-caret-bg, var(--xh-fg-default));
80
+ border-radius: var(--xh-markdown-stream-caret-radius, var(--xh-shape-inset));
81
+ content: '';
82
+ inline-size: var(--xh-markdown-stream-caret-w, var(--xh-stroke-thick));
83
+ block-size: var(--xh-markdown-stream-caret-h, 1.05em);
84
+ margin-inline-start: var(--xh-markdown-stream-caret-gap, 0.1em);
85
+ vertical-align: text-bottom;
86
+ translate: 0 var(--xh-markdown-stream-caret-shift, -0.5px);
87
+ }
88
+
89
+ /* 正文在长的时候光标只淡入一次然后停在实心:旁边的字每帧都在变,再闪一下只是噪声 */
90
+ .xh-scope-markdown-stream[data-part='block'][data-caret]::after {
91
+ animation: xh-markdown-stream-caret-in var(--xh-markdown-stream-caret-enter-duration, var(--xh-motion-duration-enter)) var(--xh-motion-ease-enter-strong) both;
92
+ }
93
+
94
+ /* 还没出字的那一段页面上只有这一竖,让它闪着,等的人才分得清是在等还是卡住了 */
95
+ .xh-scope-markdown-stream[data-part='root'][data-caret]::after {
96
+ animation: xh-markdown-stream-caret var(--xh-markdown-stream-caret-duration, var(--xh-motion-loop-caret)) steps(1, end) infinite;
97
+ }
98
+
99
+ /* 减少动效:等待时的光标停在实心不闪,「还在等」这件事仍然看得出来。
100
+ 两组规则是同一件事的两个触发条件:系统偏好与作者打的 data-motion */
101
+ @media (prefers-reduced-motion: reduce) {
102
+ .xh-scope-markdown-stream[data-part='root'][data-caret]::after {
103
+ animation: none;
104
+ }
105
+ }
106
+
107
+ :where([data-motion='reduce']) .xh-scope-markdown-stream[data-part='root'][data-caret]::after {
108
+ animation: none;
109
+ }
110
+
111
+ /* 尺寸档只改正文字号与块间距 */
112
+ .xh-scope-markdown-stream[data-part='root'][data-size='sm'] {
113
+ --xh-_markdown-stream-font-size: var(--xh-control-font-sm);
114
+ --xh-_markdown-stream-gap: var(--xh-space-2);
115
+ }
116
+
117
+ .xh-scope-markdown-stream[data-part='root'][data-size='md'] {
118
+ --xh-_markdown-stream-font-size: var(--xh-control-font-md);
119
+ --xh-_markdown-stream-gap: var(--xh-space-3);
120
+ }
121
+
122
+ .xh-scope-markdown-stream[data-part='root'][data-size='lg'] {
123
+ --xh-_markdown-stream-font-size: var(--xh-control-font-lg);
124
+ --xh-_markdown-stream-gap: var(--xh-space-4);
125
+ }
126
+
127
+ /* 视觉隐藏的原子播报区:不能 display:none,那样读屏就取不到它了 */
128
+ .xh-scope-markdown-stream[data-part='live-region'] {
129
+ position: absolute;
130
+ inline-size: 1px;
131
+ block-size: 1px;
132
+ padding: 0;
133
+ margin: -1px;
134
+ border: 0;
135
+ overflow: hidden;
136
+ clip-path: inset(50%);
137
+ white-space: nowrap;
138
+ }
139
+
140
+ @media print {
141
+ /* 打印:动画会被定格在任意一帧——转了一半的圈、扫到一半的微光。这里换成静止的表达,
142
+ 取值与减弱动效那一档相同。两档各写一块、不并进一条媒体查询列表:减弱动效另有一份
143
+ :where([data-motion='reduce']) 的钩子版本与它成对,打印没有对应的钩子可配,
144
+ 并成一条之后这层配对关系在文本上就断了。 */
145
+ .xh-scope-markdown-stream[data-part='root'][data-caret]::after {
146
+ animation: none;
147
+ }
148
+ }
149
+ }