@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,230 @@
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
+ /* 定义 breadcrumb 样式。 */
7
+
8
+ /* 链接归 Collection Item 导航当前(nav 语境):面、字色、字重、光标与按压时间线由家族配方按投影的家族角色给,
9
+ 本皮肤只映射桥接槽;当前页由连接层投影 data-xh-collection-terminal,走家族的 terminal 态 */
10
+ @import '../family/collection-item.css';
11
+
12
+ @layer xihan.components {
13
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
14
+ .xh-scope-breadcrumb {
15
+ --xh-breadcrumb-skin: 1;
16
+ }
17
+
18
+ /* 根节点是 nav 地标,不参与排版:整条路径的行为全在 list 上,
19
+ 这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
20
+ .xh-scope-breadcrumb[data-part='root'] {
21
+ /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
22
+ --xh-icon-size: var(--xh-breadcrumb-icon-size, var(--xh-glyph-size-text));
23
+
24
+ /* 尺寸档只换这两个私有槽,列表与链接都从 root 继承它们,换档不必给每个部件各写一条选择器 */
25
+ --xh-_breadcrumb-font-size: var(--xh-control-font-md);
26
+ --xh-_breadcrumb-gap: var(--xh-space-2);
27
+ /* 当前项与链接悬停的强调色随语气走。没写 data-tone 时 --xh-_tone-fg 没被声明,
28
+ 退回原来的前景色。聚焦环不在其列,它恒是 --xh-ring-focus */
29
+ --xh-_breadcrumb-accent-text: var(--xh-_tone-fg, var(--xh-fg-default));
30
+
31
+ color: var(--xh-breadcrumb-fg, var(--xh-fg-muted));
32
+ font-size: var(--xh-breadcrumb-font-size, var(--xh-_breadcrumb-font-size));
33
+ line-height: var(--xh-breadcrumb-leading, var(--xh-leading-tight));
34
+ }
35
+
36
+ /* —— 尺寸 —— */
37
+ /* 缺省档写在上面的基础规则里。间距量的是路径里文字与分隔符之间的距离,
38
+ 不在控件间距那把尺上(那把尺的大档与中档同值),三档一律取空间尺 */
39
+ .xh-scope-breadcrumb[data-part='root'][data-size='sm'] {
40
+ --xh-_breadcrumb-font-size: var(--xh-control-font-sm);
41
+ --xh-_breadcrumb-gap: var(--xh-space-1_5);
42
+ }
43
+
44
+ .xh-scope-breadcrumb[data-part='root'][data-size='lg'] {
45
+ --xh-_breadcrumb-font-size: var(--xh-control-font-lg);
46
+ --xh-_breadcrumb-gap: var(--xh-space-3);
47
+ }
48
+
49
+ /* ol 的项目符号与内外边距是 UA 给的,库里没有全局 preflight,只能在这儿自己抹平 */
50
+ .xh-scope-breadcrumb[data-part='list'] {
51
+ display: flex;
52
+ align-items: center;
53
+ /* 层级多到一行放不下就换行:宁可折行,也不要把路径压扁或撑出横向滚动 */
54
+ flex-wrap: wrap;
55
+ gap: var(--xh-breadcrumb-gap, var(--xh-_breadcrumb-gap));
56
+ margin: 0;
57
+ padding: 0;
58
+ list-style: none;
59
+ }
60
+
61
+ .xh-scope-breadcrumb[data-part='list'][hidden] {
62
+ display: none;
63
+ }
64
+
65
+ .xh-scope-breadcrumb[data-part='item'] {
66
+ display: inline-flex;
67
+ align-items: center;
68
+ /* 库里没有全局 preflight,列表项的外边距在这里自己抹平 */
69
+ margin: 0;
70
+ /* 允许被压缩,链接内部的省略号才有生效的余地 */
71
+ min-inline-size: 0;
72
+ }
73
+
74
+ .xh-scope-breadcrumb[data-part='item'][hidden] {
75
+ display: none;
76
+ }
77
+
78
+ /* 链接的几何、字号与面全经家族桥接槽:静息 muted / regular,悬停走白底承载 hover 100 + 随语气的字色,
79
+ 按下 pressed 200 只换面;当前页那条不再是"可去的地方":连接层投影
80
+ data-xh-collection-terminal,家族给透明面 + 随语气的 fg-default + medium + cursor default,不响应悬停与按下,
81
+ 并压过它同时带的 aria-disabled 禁用面。本条 (0,2,0) 压过家族基础块 (0,1,0),不能再写 color / background */
82
+ .xh-scope-breadcrumb[data-part='link'] {
83
+ --xh-collection-block-padding: var(--xh-space-0);
84
+ --xh-collection-inline-padding: var(--xh-breadcrumb-link-px, var(--xh-space-1));
85
+ --xh-collection-radius: var(--xh-breadcrumb-link-radius, var(--xh-shape-control));
86
+ --xh-collection-font-size: var(--xh-breadcrumb-font-size, var(--xh-_breadcrumb-font-size));
87
+ /* 家族会把 --xh-icon-size 写在条目上;不映射,root 上随文字形档的那支会被家族的 md 档盖掉 */
88
+ --xh-collection-glyph-size: var(--xh-breadcrumb-icon-size, var(--xh-glyph-size-text));
89
+ --xh-collection-fg-rest: var(--xh-breadcrumb-fg, var(--xh-fg-muted));
90
+ --xh-collection-bg-hover: var(--xh-breadcrumb-link-bg-hover, var(--xh-bg-subtle));
91
+ --xh-collection-fg-hover: var(--xh-breadcrumb-link-fg-hover, var(--xh-_breadcrumb-accent-text));
92
+ --xh-collection-bg-pressed: var(--xh-breadcrumb-link-bg-pressed, var(--xh-bg-subtle-hover));
93
+ --xh-collection-fg-terminal: var(--xh-breadcrumb-link-fg-current, var(--xh-_breadcrumb-accent-text));
94
+ --xh-collection-font-weight-terminal: var(--xh-breadcrumb-link-font-weight-current, var(--xh-font-weight-medium));
95
+
96
+ display: inline-flex;
97
+ align-items: center;
98
+ gap: var(--xh-breadcrumb-link-gap, var(--xh-space-1));
99
+ /* 一层的名字可能很长(文档标题、订单号),压不住会把整条路径撑开 */
100
+ max-inline-size: var(--xh-breadcrumb-link-max-w, var(--xh-nav-link-max-w));
101
+ /* 行高随 root 的行距槽:家族基础块给条目写了 leading-normal,这里接回 root 那一支 */
102
+ line-height: var(--xh-breadcrumb-leading, var(--xh-leading-tight));
103
+ text-decoration: none;
104
+ white-space: nowrap;
105
+ overflow: hidden;
106
+ text-overflow: ellipsis;
107
+ }
108
+
109
+ .xh-scope-breadcrumb[data-part='link'][hidden] {
110
+ display: none;
111
+ }
112
+
113
+ /* 图标位跟着字号走,与文字并排;不参与省略,压缩时先压文字 */
114
+ .xh-scope-breadcrumb[data-part='link-icon'] {
115
+ display: inline-flex;
116
+ flex: none;
117
+ align-items: center;
118
+ justify-content: center;
119
+ inline-size: var(--xh-breadcrumb-link-icon-size, var(--xh-glyph-size-text));
120
+ block-size: var(--xh-breadcrumb-link-icon-size, var(--xh-glyph-size-text));
121
+ }
122
+
123
+ .xh-scope-breadcrumb[data-part='link-icon'][hidden] {
124
+ display: none;
125
+ }
126
+
127
+ /* 分隔符是纯视觉占位,读屏那边已被 aria-hidden 摘掉;折叠位是一个列表项,只给里面的触发器排位 */
128
+ .xh-scope-breadcrumb[data-part='separator'],
129
+ .xh-scope-breadcrumb[data-part='ellipsis'] {
130
+ display: inline-flex;
131
+ flex: none;
132
+ /* 两者也是列表项,宿主给 li 的外边距会把它们顶离同一行 */
133
+ margin: 0;
134
+ align-items: center;
135
+ justify-content: center;
136
+ color: var(--xh-breadcrumb-separator-fg, var(--xh-fg-subtle));
137
+ user-select: none;
138
+ }
139
+
140
+ .xh-scope-breadcrumb[data-part='separator'][hidden],
141
+ .xh-scope-breadcrumb[data-part='ellipsis'][hidden] {
142
+ display: none;
143
+ }
144
+
145
+ /* 分隔符常常是个图标:给一个跟着字号走的方框,斜杠与图标混用时基线才不跳 */
146
+ .xh-scope-breadcrumb[data-part='separator'] {
147
+ inline-size: var(--xh-breadcrumb-separator-size, var(--xh-glyph-size-text));
148
+ }
149
+
150
+ .xh-scope-breadcrumb[data-part='ellipsis'] {
151
+ min-inline-size: var(--xh-breadcrumb-ellipsis-size, var(--xh-space-5));
152
+ }
153
+
154
+ /* 被收起的层级与展开后的折叠位都带 hidden:紧跟在它后面的分隔符一并收起,路径里不留两个挨着的分隔符 */
155
+ .xh-scope-breadcrumb[data-part='item'][hidden] + .xh-scope-breadcrumb[data-part='separator'],
156
+ .xh-scope-breadcrumb[data-part='ellipsis'][hidden] + .xh-scope-breadcrumb[data-part='separator'] {
157
+ display: none;
158
+ }
159
+
160
+ /* 折叠位里的触发器与链接同属一行导航条目(nav 语境):面、字色、按压时间线由家族给,几何与链接同一把尺——
161
+ 行内衬一格、control 圆角、字号随档;不写内容时由下面画一枚省略号字形 */
162
+ .xh-scope-breadcrumb[data-part='ellipsis-trigger'] {
163
+ --xh-collection-block-padding: var(--xh-space-0);
164
+ --xh-collection-inline-padding: var(--xh-space-1);
165
+ --xh-collection-radius: var(--xh-shape-control);
166
+ --xh-collection-font-size: var(--xh-breadcrumb-font-size, var(--xh-_breadcrumb-font-size));
167
+ --xh-collection-glyph-size: var(--xh-breadcrumb-icon-size, var(--xh-glyph-size-text));
168
+ --xh-collection-fg-rest: var(--xh-breadcrumb-fg, var(--xh-fg-muted));
169
+ --xh-collection-bg-hover: var(--xh-bg-subtle);
170
+ --xh-collection-fg-hover: var(--xh-_breadcrumb-accent-text);
171
+ --xh-collection-bg-pressed: var(--xh-bg-subtle-hover);
172
+
173
+ display: inline-flex;
174
+ align-items: center;
175
+ line-height: var(--xh-breadcrumb-leading, var(--xh-leading-tight));
176
+ }
177
+
178
+ .xh-scope-breadcrumb[data-part='ellipsis-trigger']:empty::before {
179
+ content: '';
180
+ display: inline-block;
181
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
182
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
183
+ vertical-align: var(--xh-glyph-baseline-shift);
184
+ background-color: currentColor;
185
+ -webkit-mask: var(--xh-glyph-mark-ellipsis) center / contain no-repeat;
186
+ mask: var(--xh-glyph-mark-ellipsis) center / contain no-repeat;
187
+ }
188
+
189
+ .xh-scope-breadcrumb[data-part='ellipsis-trigger'][hidden] {
190
+ display: none;
191
+ }
192
+
193
+ /* 没写内容就由皮肤画兜底字形(向前的尖角);作者写了斜杠或自己的图形,这条即不命中 */
194
+ .xh-scope-breadcrumb[data-part='separator']:empty::before {
195
+ content: '';
196
+ display: inline-block;
197
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
198
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
199
+ vertical-align: var(--xh-glyph-baseline-shift);
200
+ background-color: currentColor;
201
+ -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
202
+ mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
203
+ }
204
+
205
+ /* 从右往左排版时「向前」在左边 */
206
+ [dir='rtl'] .xh-scope-breadcrumb[data-part='separator']:empty::before {
207
+ rotate: 180deg;
208
+ }
209
+
210
+ @media (forced-colors: active) {
211
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
212
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
213
+ 条目面上取 CanvasText;按下与没被高亮时的悬停,家族把条目涂成 Highlight,字形换 HighlightText;
214
+ 落在 Canvas 面上的取 CanvasText;
215
+ 禁用取 GrayText */
216
+ .xh-scope-breadcrumb[data-part='ellipsis-trigger']:empty::before,
217
+ .xh-scope-breadcrumb[data-part='separator']:empty::before {
218
+ forced-color-adjust: none;
219
+ background-color: CanvasText;
220
+ }
221
+
222
+ .xh-scope-breadcrumb[data-part='ellipsis-trigger']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted])):empty::before {
223
+ background-color: HighlightText;
224
+ }
225
+
226
+ .xh-scope-breadcrumb[data-part='ellipsis-trigger']:is([aria-disabled='true'], [data-disabled]):empty::before {
227
+ background-color: GrayText;
228
+ }
229
+ }
230
+ }
@@ -0,0 +1,263 @@
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
+ /* 定义 button group 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-button-group {
11
+ --xh-button-group-skin: 1;
12
+ }
13
+
14
+ /* 一组按钮连成一条:段与段之间不留缝,靠共边接上,所以不设 gap。
15
+ 排布只能读 data-orientation——role=group 不收 aria-orientation,连接层根本不输出它。
16
+ 圆角在容器上先收成 0,组内每段都取得到,两端的圆角再逐段补回来。
17
+
18
+ 排不下时这里不折行、也不自己翻成竖排,两条都是有意的:
19
+ 折行会把两端的圆角切在行末与行首——圆角只补在 :first-child 与 :last-child 上,
20
+ 中间那两个角是直角,一条焊死的按钮条断在半路。
21
+ 皮肤自己翻成竖排则会与 data-orientation 脱钩:合边的负外边距收哪个轴、
22
+ 两端圆角补哪一对角、连接层给分隔线派的朝向,三处全部由 data-orientation 决定,
23
+ 只有排布偷偷换了轴,线会横竖不对、角会补在错的两端。
24
+ 朝向由使用者显式给 orientation="vertical",三处才一起换过去。 */
25
+ .xh-scope-button-group[data-part='root'] {
26
+ /* 组件内那几档层号只在自己人之间排序:建一个层叠上下文把它们关起来,
27
+ 既不让页面上的层号插进来,也不让它们漏出去压住别人 */
28
+ isolation: isolate;
29
+
30
+ /* 与下面几档同理,写私有槽而非 --xh-button-radius:
31
+ 后者是使用者的入口,写死它,进了组的胶囊按钮就再也圆不起来 */
32
+ --xh-_button-group-radius: 0;
33
+
34
+ /* 段与段共边焊成一条,solid 段静息不落贴地软影、悬停那一档不抬:抬起其中一段,投影会压到
35
+ 左右两段的面上。两档都只留实心面顶边那条高光;其余形态的影本来就是 none,这两支只被
36
+ button.css 的 solid 块消费。颜色不在这里灌:段自带 data-xh-action-variant,底 / 前景 / 描边由
37
+ 家族形态矩阵按段自己的形态给出 */
38
+ --xh-_button-group-shadow-rest: var(--xh-_highlight-tone);
39
+ --xh-_button-group-shadow-hover: var(--xh-_highlight-tone);
40
+ --xh-_group-separator-size: calc(var(--xh-_button-group-h, var(--xh-control-h-md)) / 2);
41
+
42
+ display: inline-flex;
43
+ align-items: stretch;
44
+ }
45
+
46
+ .xh-scope-button-group[data-part='root'][data-orientation='horizontal'] {
47
+ flex-direction: row;
48
+ }
49
+
50
+ .xh-scope-button-group[data-part='root'][data-orientation='vertical'] {
51
+ flex-direction: column;
52
+ }
53
+
54
+ /* 撑满行宽:整组占满可用宽度,每段等分剩余空间。inline-flex 改成 flex:行内盒撑不满一行 */
55
+ .xh-scope-button-group[data-part='root'][data-full-width] {
56
+ display: flex;
57
+ inline-size: 100%;
58
+ }
59
+
60
+ /* 分隔线不参与等分:它有自己的厚度,跟着拉伸就成了一条粗带 */
61
+ .xh-scope-button-group[data-part='root'][data-full-width] > *:not([data-xh-button-group-separator]) {
62
+ flex: 1;
63
+ }
64
+
65
+ /* 给了 display 的角色节点必须补这条:display 声明会盖掉 UA 的 [hidden]{display:none},
66
+ 不补的话作者给节点加 hidden 后它照样显示 */
67
+ .xh-scope-button-group[data-part='root'][hidden] {
68
+ display: none;
69
+ }
70
+
71
+ /* —— 段间的线 —— */
72
+ /* 装饰性的一条线,读屏不念。段本来靠共边连成一体,插了它就是把一排按钮分成几组。
73
+ 朝向是这条线自己的(横排里是竖线),与 root 的排布相反 */
74
+ .xh-scope-button-group[data-part='root'] > [data-xh-button-group-separator] {
75
+ flex: none;
76
+ align-self: center;
77
+ z-index: 1;
78
+ border-radius: var(--xh-button-group-separator-radius, var(--xh-shape-pill));
79
+ background: var(--xh-button-group-separator-color, var(--xh-fg-default));
80
+ opacity: var(--xh-button-group-separator-opacity, var(--xh-control-separator-opacity));
81
+ pointer-events: none;
82
+ transition:
83
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
84
+ opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
85
+ }
86
+
87
+ .xh-scope-button-group[data-part='root'] > [data-xh-button-group-separator][data-orientation='vertical'] {
88
+ inline-size: var(--xh-button-group-separator-thickness, var(--xh-stroke-thin));
89
+ block-size: var(
90
+ --xh-button-group-separator-size,
91
+ var(--xh-_group-separator-size)
92
+ );
93
+ margin-inline-start: calc(-1 * var(--xh-button-group-separator-thickness, var(--xh-stroke-thin)));
94
+ }
95
+
96
+ .xh-scope-button-group[data-part='root'] > [data-xh-button-group-separator][data-orientation='horizontal'] {
97
+ block-size: var(--xh-button-group-separator-thickness, var(--xh-stroke-thin));
98
+ inline-size: var(
99
+ --xh-button-group-separator-size,
100
+ var(--xh-_group-separator-size)
101
+ );
102
+ margin-block-start: calc(-1 * var(--xh-button-group-separator-thickness, var(--xh-stroke-thin)));
103
+ }
104
+
105
+ /* 整组禁用:段真正的禁用由适配器落到每一段的原生 disabled 上,
106
+ 置灰的原生按钮不收指针事件,指针形状只能由这一层给 */
107
+ .xh-scope-button-group[data-part='root'][data-disabled] {
108
+ cursor: not-allowed;
109
+ }
110
+
111
+ /* 段都按不动了,段间那条线跟着退到弱边一档;换色按 micro 走一遍,
112
+ 与两侧那几段自己的禁用过渡同拍 */
113
+ .xh-scope-button-group[data-part='root'] > [data-xh-button-group-separator][data-disabled] {
114
+ background: var(--xh-button-group-separator-color-disabled, var(--xh-border-subtle));
115
+ opacity: var(--xh-button-group-separator-opacity-disabled, var(--xh-control-separator-disabled-opacity));
116
+ }
117
+
118
+ @media (forced-colors: active) {
119
+ /* 段间那条线画的是一块纯底色,这一档里底色被统一换成 Canvas,线整条消失,
120
+ 几组按钮就连成了一长串。换成前景色画回来 */
121
+ .xh-scope-button-group[data-part='root'] > [data-xh-button-group-separator] {
122
+ background: CanvasText;
123
+ }
124
+
125
+ .xh-scope-button-group[data-part='root'][data-variant='outline']::after {
126
+ border-color: ButtonText;
127
+ }
128
+ }
129
+
130
+ /* —— 尺寸 —— */
131
+ /* 高度、内边距、间距、字号在容器上写一次,沿继承流给组内每一段。
132
+ 三档都写出来:自定义属性会一路继承,组里再套一组时内层不写就会沿用外层的档。
133
+ 写私有槽而非 --xh-button-*:后者是使用者的入口,组内某一枚自己写了档位时要压得住容器 */
134
+ .xh-scope-button-group[data-part='root'][data-size='sm'] {
135
+ --xh-_button-group-h: var(--xh-control-h-sm);
136
+ --xh-_button-group-px: var(--xh-control-px-sm);
137
+ --xh-_button-group-gap: var(--xh-control-gap-sm);
138
+ --xh-_button-group-font-size: var(--xh-control-font-sm);
139
+ }
140
+
141
+ .xh-scope-button-group[data-part='root'][data-size='md'] {
142
+ --xh-_button-group-h: var(--xh-control-h-md);
143
+ --xh-_button-group-px: var(--xh-control-px-md);
144
+ --xh-_button-group-gap: var(--xh-control-gap-md);
145
+ --xh-_button-group-font-size: var(--xh-control-font-md);
146
+ }
147
+
148
+ .xh-scope-button-group[data-part='root'][data-size='lg'] {
149
+ --xh-_button-group-h: var(--xh-control-h-lg);
150
+ --xh-_button-group-px: var(--xh-control-px-lg);
151
+ --xh-_button-group-gap: var(--xh-control-gap-lg);
152
+ --xh-_button-group-font-size: var(--xh-control-font-lg);
153
+ }
154
+
155
+ /* —— 形态 —— */
156
+ /* 组的形态由适配器下发到每一段(段自己写了的优先),段的颜色由家族形态矩阵给出;
157
+ 这里只定段间那条线在各档面上的颜色与浓淡,用哪族颜色由根上的 data-tone 决定 */
158
+ .xh-scope-button-group[data-part='root'][data-variant='solid'] {
159
+ --xh-button-group-separator-color: var(--xh-_tone-on, var(--xh-fg-on-brand));
160
+ --xh-button-group-separator-opacity: 0.24;
161
+ }
162
+
163
+ .xh-scope-button-group[data-part='root'][data-variant='subtle'] {
164
+ --xh-button-group-separator-color: var(--xh-_tone-fg, var(--xh-fg-default));
165
+ --xh-button-group-separator-opacity: 0.16;
166
+ }
167
+
168
+ .xh-scope-button-group[data-part='root'][data-variant='outline'] {
169
+ --xh-button-group-separator-color: var(--xh-_tone-border-control, var(--xh-border-control));
170
+ --xh-button-group-separator-opacity: 1;
171
+
172
+ position: relative;
173
+ border-radius: var(--xh-button-group-radius, var(--xh-shape-control));
174
+ }
175
+
176
+ .xh-scope-button-group[data-part='root'][data-variant='outline']::after {
177
+ content: '';
178
+ position: absolute;
179
+ z-index: 2;
180
+ inset: 0;
181
+ border: var(--xh-stroke-thin) solid
182
+ var(--xh-button-group-outline-color, var(--xh-_tone-border-control, var(--xh-border-control)));
183
+ border-radius: inherit;
184
+ pointer-events: none;
185
+ }
186
+
187
+ .xh-scope-button-group[data-part='root'][data-variant='ghost'] {
188
+ --xh-button-group-separator-color: var(--xh-_tone-fg, var(--xh-fg-default));
189
+ --xh-button-group-separator-opacity: 0.16;
190
+ }
191
+
192
+ /* outline 的外框由组根统一绘制,组内每一段都不再各画一圈边框(段的形态矩阵描边被这一条压平)。 */
193
+ .xh-scope-button-group[data-part='root'][data-variant='outline']
194
+ > .xh-scope-button[data-part='root'],
195
+ .xh-scope-button-group[data-part='root'][data-variant='outline']
196
+ > * > .xh-scope-button[data-part='root'] {
197
+ border-color: transparent;
198
+ }
199
+
200
+ /* —— 合边 —— */
201
+ /* 相邻两段的边重合在同一像素上,谁的描边浮在上面必须能指定,
202
+ 因此每一段都是定位元素——静态元素的 z-index 不生效 */
203
+ .xh-scope-button-group[data-part='root'] > * {
204
+ position: relative;
205
+ }
206
+
207
+ /* 共边只画一次:后一段不画起始边,由前一段的末端边承担。墨色描边半透明,两条重合会加深。
208
+ 方向跟着 data-orientation 走,横排收 inline 轴、竖排收 block 轴。
209
+ 分隔线两侧不合边:那两段本来就是被这条线分开的 */
210
+ .xh-scope-button-group[data-part='root'][data-orientation='horizontal']
211
+ > *:not([data-xh-button-group-separator]) + *:not([data-xh-button-group-separator]) {
212
+ border-inline-start-width: 0;
213
+ }
214
+
215
+ .xh-scope-button-group[data-part='root'][data-orientation='vertical']
216
+ > *:not([data-xh-button-group-separator]) + *:not([data-xh-button-group-separator]) {
217
+ border-block-start-width: 0;
218
+ }
219
+
220
+ /* 悬停或拿到焦点的那一段抬到最上层:焦点环画在元素外侧,
221
+ 不抬层就会被后一段的底色与描边盖掉一半 */
222
+ .xh-scope-button-group[data-part='root'] > *:hover,
223
+ .xh-scope-button-group[data-part='root'] > *:focus-within {
224
+ z-index: 1;
225
+ }
226
+
227
+ /* 独立 Button 按下时缩一档;组内段却靠共边重叠一像素,单段缩放会同时撕开两侧接缝。
228
+ 组内仍保留 active 换底与撤高光,只把会改变外轮廓几何的 scale 收掉(允许的只换面);
229
+ 键盘与触屏的按压由 Headless 投影 data-pressed,与指针 :active 同一档。 */
230
+ .xh-scope-button-group[data-part='root']
231
+ > .xh-scope-button[data-part='root']:not([data-disabled]):not([data-loading]):is(:active, [data-pressed]),
232
+ .xh-scope-button-group[data-part='root']
233
+ > * > .xh-scope-button[data-part='root']:not([data-disabled]):not([data-loading]):is(:active, [data-pressed]) {
234
+ scale: none;
235
+ }
236
+
237
+ /* —— 两端圆角 —— */
238
+ /* 逻辑角属性写,rtl 与竖排都跟着换边,不必另写一套。
239
+ 只认直接子节点:段之间插了别的节点时宁可退化成直角,也不要圆错位置 */
240
+ .xh-scope-button-group[data-part='root'][data-orientation='horizontal'] > *:first-child,
241
+ .xh-scope-button-group[data-part='root'][data-orientation='horizontal'] > *:first-child .xh-scope-button[data-part='root'] {
242
+ border-start-start-radius: var(--xh-button-group-radius, var(--xh-shape-control));
243
+ border-end-start-radius: var(--xh-button-group-radius, var(--xh-shape-control));
244
+ }
245
+
246
+ .xh-scope-button-group[data-part='root'][data-orientation='horizontal'] > *:last-child,
247
+ .xh-scope-button-group[data-part='root'][data-orientation='horizontal'] > *:last-child .xh-scope-button[data-part='root'] {
248
+ border-start-end-radius: var(--xh-button-group-radius, var(--xh-shape-control));
249
+ border-end-end-radius: var(--xh-button-group-radius, var(--xh-shape-control));
250
+ }
251
+
252
+ .xh-scope-button-group[data-part='root'][data-orientation='vertical'] > *:first-child,
253
+ .xh-scope-button-group[data-part='root'][data-orientation='vertical'] > *:first-child .xh-scope-button[data-part='root'] {
254
+ border-start-start-radius: var(--xh-button-group-radius, var(--xh-shape-control));
255
+ border-start-end-radius: var(--xh-button-group-radius, var(--xh-shape-control));
256
+ }
257
+
258
+ .xh-scope-button-group[data-part='root'][data-orientation='vertical'] > *:last-child,
259
+ .xh-scope-button-group[data-part='root'][data-orientation='vertical'] > *:last-child .xh-scope-button[data-part='root'] {
260
+ border-end-start-radius: var(--xh-button-group-radius, var(--xh-shape-control));
261
+ border-end-end-radius: var(--xh-button-group-radius, var(--xh-shape-control));
262
+ }
263
+ }