@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,98 @@
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
+ /* 定义 avatar 样式。 */
7
+
8
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
9
+ @import '../family/motion.css';
10
+
11
+ @layer xihan.components {
12
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
13
+ .xh-scope-avatar {
14
+ --xh-avatar-skin: 1;
15
+ }
16
+
17
+ .xh-scope-avatar[data-part='root'] {
18
+ position: relative;
19
+ display: inline-flex;
20
+ flex: none;
21
+ align-items: center;
22
+ justify-content: center;
23
+ overflow: hidden;
24
+ inline-size: var(--xh-avatar-size, var(--xh-control-h-md));
25
+ block-size: var(--xh-avatar-size, var(--xh-control-h-md));
26
+ border-radius: var(--xh-avatar-radius, var(--xh-shape-circle));
27
+ /* 头像在头像组里层叠:底取淡底的不透明档,半透明会透出压在下面的那一枚 */
28
+ background: var(--xh-avatar-bg, var(--xh-bg-subtle-opaque));
29
+ color: var(--xh-avatar-fg, var(--xh-fg-muted));
30
+ font-size: var(--xh-avatar-font-size, var(--xh-text-secondary-size));
31
+ font-weight: var(--xh-avatar-font-weight, var(--xh-font-weight-medium));
32
+ line-height: var(--xh-leading-none);
33
+ user-select: none;
34
+ }
35
+
36
+ /* 三档尺寸对齐控件档位,缺省档写在上面的基础规则里;
37
+ 字号跟着一起缩放,回退字才在小头像里放得下、在大头像里不显小。
38
+ 每一档都把 --xh-avatar-size / --xh-avatar-font-size 排在自己的档值前面:这两个槽是
39
+ 外层统一整排头像的通道,档值直接写终值的话,写了 data-size 的那一枚就脱离外层控制 */
40
+ .xh-scope-avatar[data-part='root'][data-size='sm'] {
41
+ inline-size: var(--xh-avatar-size, var(--xh-control-h-sm));
42
+ block-size: var(--xh-avatar-size, var(--xh-control-h-sm));
43
+ font-size: var(--xh-avatar-font-size, var(--xh-control-caption-sm));
44
+ }
45
+
46
+ .xh-scope-avatar[data-part='root'][data-size='lg'] {
47
+ inline-size: var(--xh-avatar-size, var(--xh-control-h-lg));
48
+ block-size: var(--xh-avatar-size, var(--xh-control-h-lg));
49
+ font-size: var(--xh-avatar-font-size, var(--xh-control-caption-lg));
50
+ }
51
+
52
+ /* —— 语气 ——
53
+ 头像只有「淡底 + 字/图」一种形态,所以语气只换淡底与字色这一档,不开形态轴。
54
+ 两条声明都把 --xh-avatar-bg / --xh-avatar-fg 排在语气值前面:使用者槽仍是最外那一层,
55
+ 写了 tone 的那一枚照样受外层统一控制。整块带 [data-tone] 限定,没写语气的头像逐值不变 */
56
+ .xh-scope-avatar[data-part='root'][data-tone] {
57
+ background: var(--xh-avatar-bg, var(--xh-_tone-subtle, var(--xh-bg-subtle-opaque)));
58
+ color: var(--xh-avatar-fg, var(--xh-_tone-fg, var(--xh-fg-muted)));
59
+ }
60
+
61
+ /* 不声明 display,加载完成前的 hidden 直接交给浏览器的 [hidden] 规则收起。
62
+ 载完那一刻 hidden 撤掉、这个节点从不显示变为显示,淡入在那一刻起跑;
63
+ 回退内容同一刻开始淡出(见下),两者交叉,中间不露一拍底色 */
64
+ .xh-scope-avatar[data-part='image'] {
65
+ inline-size: 100%;
66
+ block-size: 100%;
67
+ border-radius: inherit;
68
+ object-fit: cover;
69
+ animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
70
+ }
71
+
72
+ .xh-scope-avatar[data-part='fallback'] {
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ inline-size: 100%;
77
+ block-size: 100%;
78
+ text-transform: uppercase;
79
+ }
80
+
81
+ /* 图片载好:回退内容浮到图片之上原地淡出,与图片的淡入交叉;播完连接层才写 hidden */
82
+ .xh-scope-avatar[data-part='fallback'][data-state='loaded'] {
83
+ position: absolute;
84
+ inset: 0;
85
+ animation: xh-fade-out var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) forwards;
86
+ }
87
+
88
+ /* display 会盖掉 hidden 属性的 UA 规则:载入中等过 fallbackDelay 之前、以及淡出播完之后收起 */
89
+ .xh-scope-avatar[data-part='fallback'][hidden] {
90
+ display: none;
91
+ }
92
+
93
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
94
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
95
+ .xh-scope-avatar[data-part='root'][hidden] {
96
+ display: none;
97
+ }
98
+ }
@@ -0,0 +1,161 @@
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
+ /* 定义 back top 样式。 */
7
+
8
+ @import '../family/action-control.css';
9
+ @import '../family/motion.css';
10
+ @import '../family/material.css';
11
+
12
+ @layer xihan.components {
13
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
14
+ .xh-scope-back-top {
15
+ --xh-back-top-skin: 1;
16
+ }
17
+
18
+ /* 定位壳:钉在视口的尾下角,用逻辑属性,RTL 下自动换到另一侧。
19
+ 不声明 display —— 收起态由连接层写 hidden,UA 的 [hidden]{display:none} 得压得住 */
20
+ .xh-scope-back-top[data-part='root'] {
21
+ position: fixed;
22
+ /* 贴边与安全区取大的一头:底部横条与圆角压住的那一段由系统给出,贴边比它窄时钮会被切掉一角。
23
+ 桌面上 env() 恒为 0,取值与贴边槽完全一致。安全区只有物理方向的名字,
24
+ 行内轴上两侧同取较宽的那一段,RTL 下不会翻错边。 */
25
+ inset-block-end: max(var(--xh-back-top-inset-block, var(--xh-space-8)), env(safe-area-inset-bottom));
26
+ inset-inline-end: max(
27
+ var(--xh-back-top-inset-inline, var(--xh-space-8)),
28
+ env(safe-area-inset-left),
29
+ env(safe-area-inset-right)
30
+ );
31
+ z-index: var(--xh-back-top-layer, var(--xh-layer-sticky));
32
+ }
33
+
34
+ /* —— 触发器 ——
35
+ 浮在内容之上的单图标圆钮,接 Action Control floating 档:盒型(md = box-lg 48px,圆形)、
36
+ 四态面、0.97 按压与 44px 命中区由家族配方按 data-xh-action-variant / -size 给出。
37
+ 这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射。
38
+ 整件只有这一颗按钮,槽名与其余一样不带部件段(照 float-button 的 --xh-float-button-size) */
39
+ .xh-scope-back-top[data-part='trigger'] {
40
+ --xh-action-bg-rest: var(--xh-back-top-bg, var(--xh-_action-variant-bg-rest));
41
+ --xh-action-bg-hover: var(--xh-back-top-bg-hover, var(--xh-_action-variant-bg-hover));
42
+ --xh-action-bg-pressed: var(--xh-back-top-bg-active, var(--xh-_action-variant-bg-pressed));
43
+ --xh-action-bg-focus-visible: var(--xh-back-top-bg, var(--xh-_action-variant-bg-focus-visible));
44
+ --xh-action-bg-disabled: var(--xh-back-top-bg, var(--xh-_action-variant-bg-disabled));
45
+ --xh-action-fg-rest: var(--xh-back-top-fg, var(--xh-_action-variant-fg-rest));
46
+ --xh-action-fg-hover: var(--xh-back-top-fg, var(--xh-_action-variant-fg-hover));
47
+ --xh-action-fg-pressed: var(--xh-back-top-fg, var(--xh-_action-variant-fg-pressed));
48
+ --xh-action-fg-focus-visible: var(--xh-back-top-fg, var(--xh-_action-variant-fg-focus-visible));
49
+ --xh-action-border-rest: var(--xh-back-top-border, var(--xh-_action-variant-border-rest));
50
+ --xh-action-border-hover: var(--xh-back-top-border-hover, var(--xh-_action-variant-border-hover));
51
+ --xh-action-border-pressed: var(--xh-back-top-border-hover, var(--xh-_action-variant-border-pressed));
52
+ --xh-action-border-focus-visible: var(--xh-back-top-border, var(--xh-_action-variant-border-focus-visible));
53
+ --xh-action-border-disabled: var(--xh-back-top-border, var(--xh-_action-variant-border-disabled));
54
+ /* 矩阵各态无影(淡底与阴影互斥);outline 那一档的磨砂投影在下面另桥接 */
55
+ --xh-action-shadow-rest: var(--xh-back-top-shadow, none);
56
+ --xh-action-shadow-hover: var(--xh-back-top-shadow, none);
57
+ --xh-action-shadow-pressed: var(--xh-back-top-shadow, none);
58
+ --xh-action-shadow-focus-visible: var(--xh-back-top-shadow, none);
59
+ --xh-action-shadow-disabled: var(--xh-back-top-shadow, none);
60
+ --xh-action-radius: var(--xh-back-top-radius, var(--xh-_action-profile-radius));
61
+ --xh-action-visual-size: var(--xh-back-top-size, var(--xh-_action-profile-visual-size));
62
+ /* 作者塞进来的图标跟着 floating 档走(md 24px),与皮肤画的兜底字形同一把尺 */
63
+ --xh-icon-size: var(--xh-back-top-icon-size, var(--xh-_action-profile-glyph-size));
64
+ }
65
+
66
+ /* 缺省 outline 是 frosted 材质面:连接层只在这一档投影 data-xh-material,面由材质家族配方给——
67
+ 底、描边、投影、1px 顶光与背景滤镜一份取值,高对比、减少透明度、打印和强制色沿同一令牌通道降级。
68
+ 悬停 / 按下换不透明的淡底一档、二档,边缘与投影不动;键盘聚焦时铺实体 focus surface——透明面上的
69
+ 内收环不能依赖页面底色;置灰只换字色,面仍留着 */
70
+ .xh-scope-back-top[data-part='root'][data-variant='outline']
71
+ .xh-scope-back-top[data-part='trigger'] {
72
+ /* 面走材质家族配方(family/material.css):frosted 档的底、交互阶梯、描边、投影、1px 顶光与背景滤镜,
73
+ liquid 档由配方换成液态面;这里把使用者槽接到 Action Control 的桥接槽 */
74
+ --xh-action-bg-rest: var(--xh-back-top-bg, var(--xh-_material-bg));
75
+ --xh-action-bg-hover: var(--xh-back-top-bg-hover, var(--xh-_material-bg-hover));
76
+ --xh-action-bg-pressed: var(--xh-back-top-bg-active, var(--xh-_material-bg-pressed));
77
+ --xh-action-bg-focus-visible: var(--xh-back-top-bg, var(--xh-_material-bg-focus));
78
+ --xh-action-bg-disabled: var(--xh-back-top-bg, var(--xh-_material-bg));
79
+ --xh-action-fg-rest: var(--xh-back-top-fg, var(--xh-_material-fg));
80
+ --xh-action-fg-hover: var(--xh-back-top-fg, var(--xh-_material-fg));
81
+ --xh-action-fg-pressed: var(--xh-back-top-fg, var(--xh-_material-fg));
82
+ --xh-action-fg-focus-visible: var(--xh-back-top-fg, var(--xh-_material-fg));
83
+ --xh-action-border-rest: var(--xh-back-top-border, var(--xh-_material-border));
84
+ --xh-action-border-hover: var(--xh-back-top-border-hover, var(--xh-_material-border));
85
+ --xh-action-border-pressed: var(--xh-back-top-border-hover, var(--xh-_material-border));
86
+ --xh-action-border-focus-visible: var(--xh-back-top-border, var(--xh-_material-border));
87
+ --xh-action-border-disabled: var(--xh-back-top-border, var(--xh-_material-border));
88
+ --xh-action-shadow-rest: var(--xh-back-top-shadow, var(--xh-_material-shadow));
89
+ --xh-action-shadow-hover: var(--xh-back-top-shadow, var(--xh-_material-shadow));
90
+ --xh-action-shadow-pressed: var(--xh-back-top-shadow, var(--xh-_material-shadow));
91
+ --xh-action-shadow-focus-visible: var(--xh-back-top-shadow, var(--xh-_material-shadow));
92
+ --xh-action-shadow-disabled: var(--xh-back-top-shadow, var(--xh-_material-shadow));
93
+ --xh-action-highlight-rest: var(--xh-_material-highlight);
94
+ --xh-action-highlight-hover: var(--xh-_material-highlight);
95
+ --xh-action-highlight-pressed: var(--xh-_material-highlight);
96
+ --xh-action-highlight-focus-visible: var(--xh-_material-highlight);
97
+ --xh-action-highlight-disabled: var(--xh-_material-highlight);
98
+ /* M2 顶光走配方的高光通道:实心、淡色与透空形态各有自身表面,不能把磨砂高光误铺上去 */
99
+ }
100
+
101
+ /* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
102
+ 那一族色本来就要在这块面上把字读清楚,与面的对比是按可读性定的 */
103
+ .xh-scope-back-top[data-part='trigger'][data-xh-action-variant='solid']:focus-visible {
104
+ --xh-action-ring-color-focus-visible: currentColor;
105
+ }
106
+
107
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中。
108
+ 粗指针的 44px 命中区由配方的 ::after 给,字形占的是 ::before */
109
+ .xh-scope-back-top[data-part='trigger']:empty::before {
110
+ content: '';
111
+ display: inline-block;
112
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
113
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
114
+ vertical-align: var(--xh-glyph-baseline-shift);
115
+ background-color: currentColor;
116
+ -webkit-mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
117
+ mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
118
+ }
119
+
120
+ /* 过线露面时弹出;退回线内时先播完退场、连接层才给根写 hidden 收起。退场途中不再接指针 */
121
+ .xh-scope-back-top[data-part='trigger'][data-state='visible'] {
122
+ animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
123
+ }
124
+
125
+ .xh-scope-back-top[data-part='trigger'][data-state='hidden'] {
126
+ pointer-events: none;
127
+ animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
128
+ }
129
+
130
+ /* 配方声明过 display,会盖掉 UA 的 [hidden]{display:none},收起态得自己还回去。
131
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
132
+ .xh-scope-back-top[data-part='trigger'][hidden] {
133
+ display: none;
134
+ }
135
+
136
+ @media print {
137
+ /* 打印:回到顶部这颗钮只有在能滚的地方才成立,落到纸上是一颗按不动的按钮。 */
138
+ .xh-scope-back-top[data-part='root'] {
139
+ display: none;
140
+ }
141
+ }
142
+
143
+ @media (forced-colors: active) {
144
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
145
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
146
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
147
+ 禁用取 GrayText */
148
+ .xh-scope-back-top[data-part='trigger']:empty::before {
149
+ forced-color-adjust: none;
150
+ background-color: ButtonText;
151
+ }
152
+
153
+ .xh-scope-back-top[data-part='trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
154
+ background-color: HighlightText;
155
+ }
156
+
157
+ .xh-scope-back-top[data-part='trigger'][data-disabled]:empty::before {
158
+ background-color: GrayText;
159
+ }
160
+ }
161
+ }
@@ -0,0 +1,205 @@
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
+ /* 定义 badge 样式。 */
7
+
8
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
9
+ @import '../family/motion.css';
10
+
11
+ @layer xihan.components {
12
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
13
+ .xh-scope-badge {
14
+ --xh-badge-skin: 1;
15
+ }
16
+
17
+ /* 锚点:被标记的那个东西(按钮、头像、标签页)放进它里面。
18
+ 角标绝对定位在它的角上,所以这一层必须建定位上下文,且不能自己撑出尺寸 */
19
+ .xh-scope-badge[data-part='root'] {
20
+ position: relative;
21
+ display: inline-flex;
22
+ /* 角标探出宿主边界是常态,不能被裁掉 */
23
+ overflow: visible;
24
+ vertical-align: middle;
25
+ }
26
+
27
+ /* 锚点也可能被作者整块收起 */
28
+ .xh-scope-badge[data-part='root'][hidden] {
29
+ display: none;
30
+ }
31
+
32
+ /* 角标本身。档位换的是圆点直径、两位数时的最小宽度与字号——
33
+ 不是药丸那套内衬与行高:那是 tag 的活 */
34
+ .xh-scope-badge[data-part='indicator'] {
35
+ /* 每一档的盒都要大于字号:两位数在等高的盒里会被撑破。
36
+ 字号刻度最小就是 12px,所以往上抬盒子而不是往下压字。
37
+ 盒只比字高一档:20px 扣掉两道 1px 描边还剩 18px 内高,13px 的两位数与「99+」立得住,
38
+ 角标又不会大过它贴着的宿主文字 */
39
+ --xh-_badge-dot: var(--xh-space-2);
40
+ --xh-_badge-min: var(--xh-space-5);
41
+ --xh-_badge-px: var(--xh-space-1);
42
+ --xh-_badge-font: var(--xh-text-secondary-size);
43
+
44
+ /* 不设 z-index:角标在 DOM 序里排在宿主之后,本来就压在上面 */
45
+ position: absolute;
46
+ display: inline-flex;
47
+ align-items: center;
48
+ justify-content: center;
49
+ box-sizing: border-box;
50
+ min-inline-size: var(--xh-badge-min-size, var(--xh-_badge-min));
51
+ block-size: var(--xh-badge-min-size, var(--xh-_badge-min));
52
+ padding-inline: var(--xh-badge-px, var(--xh-_badge-px));
53
+ border: var(--xh-stroke-thin) solid var(--xh-badge-ring, var(--xh-bg-surface));
54
+ border-radius: var(--xh-badge-radius, var(--xh-shape-pill));
55
+ /* 角标默认就是实心的:贴在别的东西上,淡底与描边都看不清 */
56
+ background: var(--xh-badge-bg, var(--xh-_tone));
57
+ color: var(--xh-badge-fg, var(--xh-_tone-on));
58
+ font-size: var(--xh-badge-font-size, var(--xh-_badge-font));
59
+ font-weight: var(--xh-badge-font-weight, var(--xh-font-weight-medium));
60
+ line-height: var(--xh-leading-none);
61
+ /* 出的是计数,数字必须等宽:不然 9 跳到 10 时角标的宽度会抖一下 */
62
+ font-variant-numeric: tabular-nums;
63
+ white-space: nowrap;
64
+ pointer-events: none;
65
+ }
66
+
67
+ /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
68
+ 计数为 0 且没开 showZero 时连接层会发 hidden */
69
+ .xh-scope-badge[data-part='indicator'][hidden] {
70
+ display: none;
71
+ }
72
+
73
+ /* 圆点形态:只表示「有」,不表示「有几个」——收掉内边距与文字盒。
74
+ 宽高同槽的正方盒按身份取 circle,不沿用计数档的胶囊冒充圆:
75
+ 胶囊那 9999px 在正方盒上虽也画成圆,形状身份却写错了档,作者按圆点覆盖圆角时无处落手。
76
+ 圆点直径只有六到十像素,一像素的内高光会占去顶上一大截、读成缺了一圈的描边,这里收掉 */
77
+ .xh-scope-badge[data-part='indicator'][data-dot] {
78
+ min-inline-size: var(--xh-badge-dot-size, var(--xh-_badge-dot));
79
+ inline-size: var(--xh-badge-dot-size, var(--xh-_badge-dot));
80
+ block-size: var(--xh-badge-dot-size, var(--xh-_badge-dot));
81
+ border-radius: var(--xh-badge-dot-radius, var(--xh-shape-circle));
82
+ padding: 0;
83
+ box-shadow: none;
84
+ font-size: 0;
85
+ }
86
+
87
+ /* 呼吸:圆点表达正在进行、给不出进度的状态(直播、录制、通话中)。
88
+ 明暗与缩放的起伏持续到状态结束;外扩光环画在 ::after 上,同周期播 3 轮后停在不可见。
89
+ 数字角标不呼吸:连接层只在圆点档投影 data-pulse,明暗起伏会压低数字的对比度 */
90
+ .xh-scope-badge[data-part='indicator'][data-pulse] {
91
+ animation: xh-breathe var(--xh-motion-loop-breathe) var(--xh-motion-ease-breathe) infinite;
92
+ }
93
+
94
+ .xh-scope-badge[data-part='indicator'][data-pulse]::after {
95
+ content: '';
96
+ position: absolute;
97
+ inset: 0;
98
+ border-radius: inherit;
99
+ background: inherit;
100
+ opacity: 0;
101
+ pointer-events: none;
102
+ animation: xh-breathe-halo var(--xh-motion-loop-breathe) var(--xh-motion-ease-breathe) 3;
103
+ }
104
+
105
+ /* 减弱动效:两者都停,圆点停在满不透明度,光环不出现;状态仍由圆点本身与宿主的文字表达 */
106
+ @media (prefers-reduced-motion: reduce) {
107
+ .xh-scope-badge[data-part='indicator'][data-pulse],
108
+ .xh-scope-badge[data-part='indicator'][data-pulse]::after {
109
+ animation: none;
110
+ }
111
+ }
112
+
113
+ :where([data-motion='reduce']) .xh-scope-badge[data-part='indicator'][data-pulse],
114
+ :where([data-motion='reduce']) .xh-scope-badge[data-part='indicator'][data-pulse]::after {
115
+ animation: none;
116
+ }
117
+
118
+ /* 出现与消失:计数从无到有时原地弹出;清零时缩小淡出,播完连接层才写 hidden,退场那几帧照清零前的数字写。
119
+ 首帧就在的角标直接呈现(data-instant);呼吸的圆点不叠进场,两段明暗会打架。
120
+ 写在呼吸之后:退场压过呼吸。减弱动效下缩放归一、只剩淡变 */
121
+ .xh-scope-badge[data-part='indicator'][data-state='visible']:not([data-instant], [data-pulse]) {
122
+ animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
123
+ }
124
+
125
+ .xh-scope-badge[data-part='indicator'][data-state='hidden'] {
126
+ animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
127
+ }
128
+
129
+ /* —— 落点 —— */
130
+ /* 用 inset 的逻辑属性写,rtl 下 end 自动落到左边;translate 让角标压住宿主的角。
131
+ 两个偏移槽微调角标离角多远:正值朝行内末端、块末端挪(rtl 下行内末端在左),
132
+ 宿主是圆形头像、角上留白多时往里收一点。四个角各按贴哪条边换正负号,同一个值在哪个角都朝同一个方向挪 */
133
+ .xh-scope-badge[data-part='indicator'][data-placement='top-end'] {
134
+ inset-block-start: var(--xh-badge-offset-block, var(--xh-space-0));
135
+ inset-inline-end: calc(-1 * var(--xh-badge-offset-inline, var(--xh-space-0)));
136
+ translate: 25% -25%;
137
+ }
138
+
139
+ .xh-scope-badge[data-part='indicator'][data-placement='top-start'] {
140
+ inset-block-start: var(--xh-badge-offset-block, var(--xh-space-0));
141
+ inset-inline-start: var(--xh-badge-offset-inline, var(--xh-space-0));
142
+ translate: -25% -25%;
143
+ }
144
+
145
+ .xh-scope-badge[data-part='indicator'][data-placement='bottom-end'] {
146
+ inset-block-end: calc(-1 * var(--xh-badge-offset-block, var(--xh-space-0)));
147
+ inset-inline-end: calc(-1 * var(--xh-badge-offset-inline, var(--xh-space-0)));
148
+ translate: 25% 25%;
149
+ }
150
+
151
+ .xh-scope-badge[data-part='indicator'][data-placement='bottom-start'] {
152
+ inset-block-end: calc(-1 * var(--xh-badge-offset-block, var(--xh-space-0)));
153
+ inset-inline-start: var(--xh-badge-offset-inline, var(--xh-space-0));
154
+ translate: -25% 25%;
155
+ }
156
+
157
+ /* rtl 下 translate 的行内轴要跟着翻,否则角标会往宿主外面跑 */
158
+ [dir='rtl'] .xh-scope-badge[data-part='indicator'][data-placement='top-end'] {
159
+ translate: -25% -25%;
160
+ }
161
+
162
+ [dir='rtl'] .xh-scope-badge[data-part='indicator'][data-placement='top-start'] {
163
+ translate: 25% -25%;
164
+ }
165
+
166
+ [dir='rtl'] .xh-scope-badge[data-part='indicator'][data-placement='bottom-end'] {
167
+ translate: -25% 25%;
168
+ }
169
+
170
+ [dir='rtl'] .xh-scope-badge[data-part='indicator'][data-placement='bottom-start'] {
171
+ translate: 25% 25%;
172
+ }
173
+
174
+ /* —— 尺寸 —— */
175
+ /* 小号是贴在 16px 图标角上的角标:盒取 12 + 2 的半阶补偿 = 14px,字仍是刻度最小的 12px——
176
+ 数字的字面只占字号的六成,扣掉两道 1px 描边后的 12px 内高装得下两位数,再小就得压字 */
177
+ .xh-scope-badge[data-part='indicator'][data-size='sm'] {
178
+ --xh-_badge-dot: var(--xh-space-1_5);
179
+ --xh-_badge-min: calc(var(--xh-space-3) + var(--xh-space-0_5));
180
+ --xh-_badge-px: var(--xh-space-0_5);
181
+ --xh-_badge-font: var(--xh-text-caption-size);
182
+ }
183
+
184
+ /* 大号只往上抬一级:盒 24px、字 14px,仍是角标,不长成与宿主同级的一枚按钮 */
185
+ .xh-scope-badge[data-part='indicator'][data-size='lg'] {
186
+ --xh-_badge-dot: var(--xh-space-2_5);
187
+ --xh-_badge-min: var(--xh-space-6);
188
+ --xh-_badge-px: var(--xh-space-1_5);
189
+ --xh-_badge-font: var(--xh-text-body-size);
190
+ }
191
+
192
+ /*
193
+ * 打印:底色被丢掉。计数档配的是实心底上的前景色,底一没那串数字就印不出来;
194
+ * 圆点档整个由底色画成,底一没连位置都看不见。
195
+ * 两档都改由描边承载:常态那圈边是衬在宿主上的隔离环,取的是面色,纸上同样是白的,
196
+ * 这里换成正文色——计数成了一枚描边药丸,圆点成了一个小圈。
197
+ */
198
+ @media print {
199
+ .xh-scope-badge[data-part='indicator'] {
200
+ border-color: currentColor;
201
+ color: var(--xh-fg-default);
202
+ box-shadow: none;
203
+ }
204
+ }
205
+ }
@@ -0,0 +1,62 @@
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
+ /* 定义 bar code 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-bar-code {
11
+ --xh-bar-code-skin: 1;
12
+ }
13
+
14
+ /*
15
+ * 根 <svg>。深浅两色取固定档而不是语义前景/背景:语义色跟着主题走,深色主题下整张码
16
+ * 会翻成浅底深条的反相图,读码器按"深条浅底"取样,反相码扫不出来。要换配色改下面这两个覆盖槽。
17
+ *
18
+ * 换色只有一条硬约束:条必须比底色深,且两者对比要足。反相与深浅相近都会让读码器扫不出来,
19
+ * 而这件事肉眼看不出来。
20
+ *
21
+ * --xh-bar-code-fg 条色,同时经 currentColor 传给人读文字
22
+ * --xh-bar-code-bg 底色
23
+ */
24
+ .xh-scope-bar-code[data-part='root'] {
25
+ display: block;
26
+ border-radius: var(--xh-bar-code-radius, var(--xh-shape-control));
27
+ background: var(--xh-bar-code-bg, var(--xh-color-neutral-0));
28
+
29
+ /* 条那条 path 不带自己的填充色,从这里继承下去 */
30
+ color: var(--xh-bar-code-fg, var(--xh-color-neutral-950));
31
+ fill: currentColor;
32
+
33
+ /* 占位与码面之间来回时,底色与那圈描边淡变 */
34
+ transition:
35
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
36
+ box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
37
+ }
38
+
39
+ /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
40
+ .xh-scope-bar-code[data-part='root'][hidden] {
41
+ display: none;
42
+ }
43
+
44
+ /*
45
+ * 人读文字:字号由 connect 按 X 尺寸写在节点上(规范里数字高约 8X),这里只定字体。
46
+ * 等宽字体让每位数字一样宽,EAN 逐位居中落格才整齐;规范要的 OCR-B 一般机器上没有,退到系统等宽。
47
+ */
48
+ .xh-scope-bar-code[data-part='root'] > [data-xh-geom='text'] {
49
+ font-family: var(--xh-bar-code-font-family, var(--xh-font-family-mono));
50
+ fill: var(--xh-bar-code-text-fg, currentColor);
51
+ }
52
+
53
+ /*
54
+ * 没有可编码的内容、以及内容不合规则:两种情形都一根条不铺,留一块带描边的占位。
55
+ * 占位用的是语义色——它是界面元素不是码面,跟着主题走才对。
56
+ */
57
+ .xh-scope-bar-code[data-part='root'][data-state='empty'],
58
+ .xh-scope-bar-code[data-part='root'][data-state='error'] {
59
+ background: var(--xh-bar-code-placeholder-bg, var(--xh-bg-subtle));
60
+ box-shadow: inset 0 0 0 var(--xh-stroke-thin) var(--xh-bar-code-placeholder-border, var(--xh-border-default));
61
+ }
62
+ }