@xihan-ui/styles 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/CHANGELOG.md +470 -0
  2. package/component-tokens.d.ts +230 -60
  3. package/components.tokens.json +5156 -1557
  4. package/css/accordion.css +47 -20
  5. package/css/alert.css +16 -17
  6. package/css/anchor.css +2 -2
  7. package/css/approval.css +41 -17
  8. package/css/avatar-group.css +9 -12
  9. package/css/avatar.css +20 -18
  10. package/css/back-top.css +21 -7
  11. package/css/badge.css +5 -5
  12. package/css/breadcrumb.css +18 -16
  13. package/css/button-group.css +4 -6
  14. package/css/button.css +13 -12
  15. package/css/calendar-picker.css +178 -95
  16. package/css/calendar-range-picker.css +207 -122
  17. package/css/card.css +34 -6
  18. package/css/carousel.css +94 -46
  19. package/css/cartesian-chart.css +11 -11
  20. package/css/cascader.css +51 -39
  21. package/css/checkbox-group.css +9 -6
  22. package/css/checkbox.css +5 -4
  23. package/css/citation.css +9 -4
  24. package/css/clipboard.css +20 -4
  25. package/css/code-view.css +6 -6
  26. package/css/collapsible.css +29 -14
  27. package/css/color-field.css +4 -4
  28. package/css/color-picker.css +77 -23
  29. package/css/color-slider.css +10 -8
  30. package/css/color-swatch-picker.css +14 -9
  31. package/css/combobox.css +26 -14
  32. package/css/command.css +14 -9
  33. package/css/context-menu.css +10 -5
  34. package/css/date-field.css +12 -6
  35. package/css/date-picker.css +178 -109
  36. package/css/date-range-picker.css +199 -130
  37. package/css/description.css +10 -6
  38. package/css/descriptions.css +47 -19
  39. package/css/dialog.css +50 -35
  40. package/css/diff-view.css +8 -8
  41. package/css/drawer.css +75 -21
  42. package/css/editable.css +15 -41
  43. package/css/empty-state.css +21 -3
  44. package/css/field-array.css +5 -2
  45. package/css/field.css +17 -18
  46. package/css/fieldset.css +33 -13
  47. package/css/file-upload.css +66 -33
  48. package/css/float-button.css +60 -35
  49. package/css/floating-panel.css +1 -1
  50. package/css/form.css +30 -16
  51. package/css/graph-chart.css +2 -2
  52. package/css/grid-list.css +1 -1
  53. package/css/highlight.css +5 -5
  54. package/css/hover-card.css +19 -12
  55. package/css/image-viewer.css +77 -27
  56. package/css/image.css +13 -5
  57. package/css/infinite-scroll.css +8 -4
  58. package/css/input-group.css +74 -26
  59. package/css/kbd.css +1 -1
  60. package/css/label.css +27 -11
  61. package/css/layout.css +17 -10
  62. package/css/list.css +13 -9
  63. package/css/listbox.css +12 -7
  64. package/css/loading-bar.css +3 -0
  65. package/css/mention.css +11 -9
  66. package/css/menu.css +10 -5
  67. package/css/menubar.css +13 -8
  68. package/css/message-feed.css +1 -1
  69. package/css/navigation-menu.css +2 -2
  70. package/css/notification.css +132 -49
  71. package/css/number-animation.css +2 -2
  72. package/css/number-field.css +75 -52
  73. package/css/page-header.css +64 -27
  74. package/css/pagination.css +35 -38
  75. package/css/password-input.css +12 -68
  76. package/css/pin-input.css +18 -26
  77. package/css/popconfirm.css +23 -14
  78. package/css/popover.css +18 -12
  79. package/css/progress.css +14 -13
  80. package/css/prompt-input.css +3 -3
  81. package/css/question-flow.css +41 -15
  82. package/css/radar-chart.css +6 -6
  83. package/css/radio-group.css +120 -55
  84. package/css/rating.css +32 -15
  85. package/css/select.css +16 -12
  86. package/css/separator.css +24 -6
  87. package/css/side-nav.css +29 -24
  88. package/css/signature-pad.css +23 -9
  89. package/css/skeleton.css +12 -12
  90. package/css/slider.css +77 -48
  91. package/css/sortable.css +2 -2
  92. package/css/sparkline.css +8 -2
  93. package/css/spinner.css +40 -20
  94. package/css/statistic.css +14 -14
  95. package/css/steps.css +115 -84
  96. package/css/switch.css +9 -7
  97. package/css/table.css +29 -12
  98. package/css/tabs.css +35 -12
  99. package/css/tag-group.css +17 -6
  100. package/css/tag.css +54 -29
  101. package/css/tags-input.css +39 -20
  102. package/css/text-field.css +5 -5
  103. package/css/time-field.css +4 -4
  104. package/css/time-picker.css +150 -64
  105. package/css/time-range-picker.css +91 -62
  106. package/css/timeline.css +37 -20
  107. package/css/timer.css +3 -3
  108. package/css/toggle-group.css +4 -4
  109. package/css/tool-call.css +13 -11
  110. package/css/toolbar.css +6 -5
  111. package/css/tooltip.css +16 -17
  112. package/css/tour.css +14 -7
  113. package/css/transfer.css +22 -16
  114. package/css/tree-select.css +12 -12
  115. package/css/tree.css +26 -25
  116. package/css/typography.css +28 -25
  117. package/dist/css/accordion.css +296 -0
  118. package/dist/css/affix.css +47 -0
  119. package/dist/css/alert.css +246 -0
  120. package/dist/css/anchor.css +252 -0
  121. package/dist/css/approval.css +525 -0
  122. package/dist/css/avatar-group.css +96 -0
  123. package/dist/css/avatar.css +100 -0
  124. package/dist/css/back-top.css +175 -0
  125. package/dist/css/badge.css +205 -0
  126. package/dist/css/bar-code.css +62 -0
  127. package/dist/css/breadcrumb.css +232 -0
  128. package/dist/css/button-group.css +261 -0
  129. package/dist/css/button.css +216 -0
  130. package/dist/css/calendar-picker.css +550 -0
  131. package/dist/css/calendar-range-picker.css +639 -0
  132. package/dist/css/card.css +249 -0
  133. package/dist/css/carousel.css +726 -0
  134. package/dist/css/cartesian-chart.css +830 -0
  135. package/dist/css/cascader.css +973 -0
  136. package/dist/css/checkbox-group.css +361 -0
  137. package/dist/css/checkbox.css +258 -0
  138. package/dist/css/citation.css +475 -0
  139. package/dist/css/clipboard.css +331 -0
  140. package/dist/css/code-view.css +374 -0
  141. package/dist/css/collapsible.css +200 -0
  142. package/dist/css/color-field.css +176 -0
  143. package/dist/css/color-picker.css +649 -0
  144. package/dist/css/color-slider.css +283 -0
  145. package/dist/css/color-swatch-picker.css +250 -0
  146. package/dist/css/color-swatch.css +35 -0
  147. package/dist/css/combobox.css +578 -0
  148. package/dist/css/command.css +404 -0
  149. package/dist/css/context-menu.css +425 -0
  150. package/dist/css/date-field.css +317 -0
  151. package/dist/css/date-picker.css +931 -0
  152. package/dist/css/date-range-picker.css +949 -0
  153. package/dist/css/description.css +71 -0
  154. package/dist/css/descriptions.css +327 -0
  155. package/dist/css/dialog.css +470 -0
  156. package/dist/css/diff-view.css +513 -0
  157. package/dist/css/download-trigger.css +151 -0
  158. package/dist/css/drawer.css +606 -0
  159. package/dist/css/editable.css +269 -0
  160. package/dist/css/empty-state.css +181 -0
  161. package/dist/css/field-array.css +229 -0
  162. package/dist/css/field.css +165 -0
  163. package/dist/css/fieldset.css +122 -0
  164. package/dist/css/file-upload.css +462 -0
  165. package/dist/css/flex.css +441 -0
  166. package/dist/css/float-button.css +579 -0
  167. package/dist/css/floating-panel.css +429 -0
  168. package/dist/css/focus.css +46 -0
  169. package/dist/css/forced-colors.css +93 -0
  170. package/dist/css/form.css +407 -0
  171. package/dist/css/funnel-chart.css +106 -0
  172. package/dist/css/graph-chart.css +205 -0
  173. package/dist/css/grid-list.css +235 -0
  174. package/dist/css/grid.css +1201 -0
  175. package/dist/css/heatmap.css +552 -0
  176. package/dist/css/hierarchy-chart.css +298 -0
  177. package/dist/css/highlight.css +41 -0
  178. package/dist/css/hover-card.css +233 -0
  179. package/dist/css/icon.css +225 -0
  180. package/dist/css/image-cropper.css +373 -0
  181. package/dist/css/image-viewer.css +588 -0
  182. package/dist/css/image.css +106 -0
  183. package/dist/css/infinite-scroll.css +81 -0
  184. package/dist/css/input-group.css +323 -0
  185. package/dist/css/json-viewer.css +379 -0
  186. package/dist/css/kbd.css +72 -0
  187. package/dist/css/label.css +94 -0
  188. package/dist/css/layers.css +7 -0
  189. package/dist/css/layout.css +379 -0
  190. package/dist/css/liquid.css +106 -0
  191. package/dist/css/list.css +156 -0
  192. package/dist/css/listbox.css +395 -0
  193. package/dist/css/loading-bar.css +144 -0
  194. package/dist/css/log.css +306 -0
  195. package/dist/css/markdown-stream.css +149 -0
  196. package/dist/css/marquee.css +378 -0
  197. package/dist/css/masonry.css +70 -0
  198. package/dist/css/matrix-code.css +67 -0
  199. package/dist/css/mention.css +395 -0
  200. package/dist/css/menu.css +369 -0
  201. package/dist/css/menubar.css +461 -0
  202. package/dist/css/message-feed.css +318 -0
  203. package/dist/css/navigation-menu.css +513 -0
  204. package/dist/css/notification.css +865 -0
  205. package/dist/css/number-animation.css +44 -0
  206. package/dist/css/number-field.css +275 -0
  207. package/dist/css/overlay-arrow.css +56 -0
  208. package/dist/css/page-header.css +221 -0
  209. package/dist/css/pagination.css +447 -0
  210. package/dist/css/password-input.css +335 -0
  211. package/dist/css/pie-chart.css +247 -0
  212. package/dist/css/pin-input.css +191 -0
  213. package/dist/css/pointer.css +36 -0
  214. package/dist/css/popconfirm.css +329 -0
  215. package/dist/css/popover.css +285 -0
  216. package/dist/css/progress.css +502 -0
  217. package/dist/css/prompt-input.css +260 -0
  218. package/dist/css/question-flow.css +579 -0
  219. package/dist/css/radar-chart.css +233 -0
  220. package/dist/css/radio-group.css +663 -0
  221. package/dist/css/rating.css +311 -0
  222. package/dist/css/reasoning.css +343 -0
  223. package/dist/css/reset.css +117 -0
  224. package/dist/css/resizable.css +242 -0
  225. package/dist/css/sankey-chart.css +174 -0
  226. package/dist/css/scroll-area.css +240 -0
  227. package/dist/css/scrollbar.css +204 -0
  228. package/dist/css/select.css +616 -0
  229. package/dist/css/separator.css +140 -0
  230. package/dist/css/side-nav.css +481 -0
  231. package/dist/css/signature-pad.css +193 -0
  232. package/dist/css/skeleton.css +161 -0
  233. package/dist/css/slider.css +403 -0
  234. package/dist/css/sortable.css +228 -0
  235. package/dist/css/sparkline.css +170 -0
  236. package/dist/css/spinner.css +256 -0
  237. package/dist/css/splitter.css +159 -0
  238. package/dist/css/statistic.css +137 -0
  239. package/dist/css/steps.css +658 -0
  240. package/dist/css/switch.css +353 -0
  241. package/dist/css/table.css +1162 -0
  242. package/dist/css/tabs.css +967 -0
  243. package/dist/css/tag-group.css +258 -0
  244. package/dist/css/tag.css +335 -0
  245. package/dist/css/tags-input.css +341 -0
  246. package/dist/css/text-field.css +197 -0
  247. package/dist/css/time-field.css +277 -0
  248. package/dist/css/time-picker.css +793 -0
  249. package/dist/css/time-range-picker.css +775 -0
  250. package/dist/css/timeline.css +440 -0
  251. package/dist/css/timer.css +123 -0
  252. package/dist/css/timestamp.css +34 -0
  253. package/dist/css/toggle-group.css +424 -0
  254. package/dist/css/toggle.css +146 -0
  255. package/dist/css/tone.css +189 -0
  256. package/dist/css/tool-call.css +431 -0
  257. package/dist/css/toolbar.css +366 -0
  258. package/dist/css/tooltip.css +217 -0
  259. package/dist/css/tour.css +446 -0
  260. package/dist/css/transfer.css +644 -0
  261. package/dist/css/tree-select.css +878 -0
  262. package/dist/css/tree.css +734 -0
  263. package/dist/css/truncate.css +108 -0
  264. package/dist/css/typography.css +475 -0
  265. package/dist/css/undefined.css +58 -0
  266. package/dist/css/virtualizer.css +166 -0
  267. package/dist/css/visually-hidden.css +20 -0
  268. package/dist/css/watermark.css +82 -0
  269. package/dist/family/action-control.css +493 -0
  270. package/dist/family/chart.css +537 -0
  271. package/dist/family/check-mark.css +94 -0
  272. package/dist/family/choice-card.css +97 -0
  273. package/dist/family/collection-item.css +768 -0
  274. package/dist/family/field-chrome.css +296 -0
  275. package/dist/family/loading-ring.css +102 -0
  276. package/dist/family/material.css +72 -0
  277. package/dist/family/menu-choice.css +56 -0
  278. package/dist/family/motion.css +363 -0
  279. package/dist/family/swatch.css +59 -0
  280. package/dist/family/tag-list.css +65 -0
  281. package/family/action-control.css +33 -36
  282. package/family/chart.css +57 -0
  283. package/family/collection-item.css +12 -8
  284. package/family/field-chrome.css +28 -19
  285. package/family/loading-ring.css +20 -13
  286. package/family/swatch.css +4 -4
  287. package/family/tag-list.css +6 -0
  288. package/index.css +10349 -8756
  289. package/index.unlayered.css +10350 -8758
  290. package/package.json +165 -164
@@ -27,12 +27,13 @@
27
27
  --xh-_typography-body-size: var(--xh-text-body-size);
28
28
  --xh-_typography-block-gap: var(--xh-space-4);
29
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);
30
+ /* 六级标题沿字号阶梯从 36 逐档降到 16:最小的 h6 仍比正文大一号 */
31
+ --xh-_typography-h1: var(--xh-font-size-5xl);
32
+ --xh-_typography-h2: var(--xh-font-size-4xl);
33
+ --xh-_typography-h3: var(--xh-font-size-3xl);
34
+ --xh-_typography-h4: var(--xh-font-size-2xl);
35
+ --xh-_typography-h5: var(--xh-font-size-xl);
36
+ --xh-_typography-h6: var(--xh-font-size-lg);
36
37
  /* 读行宽度:整块正文不收窄就会拉成一行行难读的长句 */
37
38
  --xh-_typography-measure: 68ch;
38
39
  /* 行内代码跟着所在那行的字号缩:以「随文字走」的字形尺寸为基数按比例收一点,不取固定档位 */
@@ -64,15 +65,15 @@
64
65
  --xh-_typography-body-size: var(--xh-font-size-sm);
65
66
  --xh-_typography-block-gap: var(--xh-space-3);
66
67
  --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);
68
+ --xh-_typography-h1: var(--xh-font-size-4xl);
69
+ --xh-_typography-h2: var(--xh-font-size-3xl);
70
+ --xh-_typography-h3: var(--xh-font-size-2xl);
71
+ --xh-_typography-h4: var(--xh-font-size-xl);
72
+ --xh-_typography-h5: var(--xh-font-size-lg);
73
+ --xh-_typography-h6: var(--xh-font-size-md);
73
74
  }
74
75
 
75
- /* 大档只放大正文与段距:标题档位在 3xl 见顶,六档保持原样 */
76
+ /* 大档只放大正文与段距:标题档位在 5xl 见顶,六档保持原样 */
76
77
  [data-scope='typography'][data-part='root'][data-size='lg'] {
77
78
  --xh-_typography-body-size: var(--xh-font-size-lg);
78
79
  --xh-_typography-block-gap: var(--xh-space-5);
@@ -123,7 +124,7 @@
123
124
  [data-scope='typography'][data-part='heading'] {
124
125
  color: var(--xh-typography-heading-fg, var(--xh-fg-default));
125
126
  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
+ font-weight: var(--xh-typography-heading-font-weight, var(--xh-font-weight-medium));
127
128
  line-height: var(--xh-typography-heading-leading, var(--xh-leading-tight));
128
129
  /* 标题折行时把各行拉得一样长 */
129
130
  text-wrap: balance;
@@ -177,14 +178,15 @@
177
178
  }
178
179
 
179
180
  [data-scope='typography'][data-part='text'][data-variant='strong'] {
180
- font-weight: var(--xh-typography-text-font-weight, var(--xh-font-weight-semibold));
181
+ font-weight: var(--xh-typography-text-font-weight, var(--xh-font-weight-medium));
181
182
  }
182
183
 
183
184
  [data-scope='typography'][data-part='text'][data-variant='code'] {
184
185
  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
+ padding-inline: var(--xh-typography-code-px, var(--xh-space-2));
186
187
  border-radius: var(--xh-typography-code-radius, var(--xh-shape-inset));
187
188
  background: var(--xh-typography-code-bg, var(--xh-bg-subtle));
189
+ color: var(--xh-typography-code-fg, var(--xh-fg-muted));
188
190
  font-family: var(--xh-typography-code-font, var(--xh-font-family-mono));
189
191
  font-size: var(--xh-typography-code-font-size, var(--xh-_typography-code-size));
190
192
  }
@@ -214,8 +216,8 @@
214
216
  [data-scope='typography'][data-part='text'][data-marked] {
215
217
  padding-inline: var(--xh-typography-mark-px, var(--xh-space-0_5));
216
218
  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
+ background: var(--xh-typography-mark-bg, var(--xh-bg-mark));
220
+ color: var(--xh-typography-mark-fg, var(--xh-fg-default));
219
221
  -webkit-box-decoration-break: clone;
220
222
  box-decoration-break: clone;
221
223
  }
@@ -330,7 +332,7 @@
330
332
 
331
333
  [data-scope='typography'][data-part='prose'] :where(h1, h2, h3, h4, h5, h6) {
332
334
  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));
335
+ font-weight: var(--xh-typography-prose-heading-font-weight, var(--xh-font-weight-medium));
334
336
  line-height: var(--xh-leading-tight);
335
337
  text-wrap: balance;
336
338
  }
@@ -362,7 +364,7 @@
362
364
 
363
365
  /* 列表:项目符号要留在容器里面,缩进画在列表自己的起始内衬上 */
364
366
  [data-scope='typography'][data-part='prose'] :where(ul, ol) {
365
- padding-inline-start: var(--xh-typography-prose-list-ps, var(--xh-space-6));
367
+ padding-inline-start: var(--xh-typography-prose-list-ps, var(--xh-space-5));
366
368
  }
367
369
 
368
370
  [data-scope='typography'][data-part='prose'] :where(li + li) {
@@ -386,15 +388,16 @@
386
388
  }
387
389
 
388
390
  [data-scope='typography'][data-part='prose'] :where(strong) {
389
- font-weight: var(--xh-typography-prose-strong-font-weight, var(--xh-font-weight-semibold));
391
+ font-weight: var(--xh-typography-prose-strong-font-weight, var(--xh-font-weight-medium));
390
392
  }
391
393
 
392
394
  /* 行内代码与 text 部件的 code 形态同源,同一块正文里两条路写出来一个样 */
393
395
  [data-scope='typography'][data-part='prose'] :where(code) {
394
396
  padding-block: var(--xh-typography-code-py, var(--xh-space-0_5));
395
- padding-inline: var(--xh-typography-code-px, var(--xh-space-1));
397
+ padding-inline: var(--xh-typography-code-px, var(--xh-space-2));
396
398
  border-radius: var(--xh-typography-code-radius, var(--xh-shape-inset));
397
399
  background: var(--xh-typography-code-bg, var(--xh-bg-subtle));
400
+ color: var(--xh-typography-code-fg, var(--xh-fg-muted));
398
401
  font-family: var(--xh-typography-code-font, var(--xh-font-family-mono));
399
402
  font-size: var(--xh-typography-code-font-size, var(--xh-_typography-code-size));
400
403
  }
@@ -418,10 +421,10 @@
418
421
  }
419
422
 
420
423
  [data-scope='typography'][data-part='prose'] :where(blockquote) {
421
- padding-inline-start: var(--xh-typography-prose-quote-ps, var(--xh-space-4));
424
+ padding-inline-start: var(--xh-typography-prose-quote-ps, var(--xh-space-2));
422
425
  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));
426
+ var(--xh-typography-prose-quote-border, var(--xh-border-strong));
427
+ color: var(--xh-typography-prose-quote-fg, inherit);
425
428
  }
426
429
 
427
430
  [data-scope='typography'][data-part='prose'] :where(hr) {
@@ -0,0 +1,296 @@
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
+ /* 定义 accordion 样式。 */
7
+
8
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立;
9
+ 独立皮肤同时传递引入标题栏的动作控件配方,full bundle 递归去重。 */
10
+ @import '../family/motion.css';
11
+ @import '../family/action-control.css';
12
+
13
+ @layer xihan.components {
14
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
15
+ .xh-scope-accordion {
16
+ --xh-accordion-skin: 1;
17
+ }
18
+
19
+ .xh-scope-accordion[data-part='root'] {
20
+ /* 作者塞进正文里的图标与皮肤画的兜底字形同一把尺:md 档,标题栏上另按家族档取值 */
21
+ --xh-icon-size: var(--xh-accordion-icon-size, var(--xh-glyph-size-md));
22
+
23
+ /* 尺寸档只换这几个私有槽,标题栏与正文从 root 继承它们。
24
+ 标题栏比家族 disclosure-trigger 档收一截:md 上下 10px + 一行正文行高 21px = 41px 高,横向 12px;
25
+ 正文与标题栏同一条起点,上下各留 8px */
26
+ --xh-_accordion-trigger-py: var(--xh-space-2_5);
27
+ --xh-_accordion-trigger-px: var(--xh-space-3);
28
+ --xh-_accordion-content-px: var(--xh-space-3);
29
+ --xh-_accordion-content-pt: var(--xh-space-2);
30
+ --xh-_accordion-content-pb: var(--xh-space-2);
31
+
32
+ /* 语气落在展开着的标题上,指示器写在标题里、跟着继承这个色,不另立规则。
33
+ 没写 data-tone 时 --xh-_tone-fg 没被声明,退回原来的前景色。
34
+ 聚焦环不在其列,它恒是 --xh-ring-focus */
35
+ --xh-_accordion-open-fg: var(--xh-_tone-fg, var(--xh-fg-default));
36
+
37
+ display: flex;
38
+ flex-direction: column;
39
+ inline-size: 100%;
40
+ contain: layout style;
41
+ }
42
+
43
+ .xh-scope-accordion[data-part='root'][data-orientation='horizontal'] {
44
+ flex-direction: row;
45
+ }
46
+
47
+ /* —— 尺寸 —— */
48
+ /* 缺省档写在上面的基础规则里 */
49
+ .xh-scope-accordion[data-part='root'][data-size='sm'] {
50
+ --xh-_accordion-trigger-py: var(--xh-space-1_5);
51
+ --xh-_accordion-trigger-px: var(--xh-space-2_5);
52
+ --xh-_accordion-content-px: var(--xh-space-2_5);
53
+ --xh-_accordion-content-pt: var(--xh-space-1_5);
54
+ --xh-_accordion-content-pb: var(--xh-space-1_5);
55
+ }
56
+
57
+ .xh-scope-accordion[data-part='root'][data-size='lg'] {
58
+ --xh-_accordion-trigger-py: var(--xh-space-3);
59
+ --xh-_accordion-trigger-px: var(--xh-space-4);
60
+ --xh-_accordion-content-px: var(--xh-space-4);
61
+ --xh-_accordion-content-pt: var(--xh-space-3);
62
+ --xh-_accordion-content-pb: var(--xh-space-3);
63
+ }
64
+
65
+ .xh-scope-accordion[data-part='item'] {
66
+ position: relative;
67
+ min-inline-size: 0;
68
+ }
69
+
70
+ /* 分隔线画在后一条的起始边,条与条之间才只有一条,末条也不会留一条悬空线
71
+ (根没有外框接住它)。只认自己的直接子条目:套在条目里的另一份手风琴由它自己的根管。
72
+ 横排时换成行内轴那一侧 */
73
+ .xh-scope-accordion[data-part='root']
74
+ > .xh-scope-accordion[data-part='item']
75
+ + .xh-scope-accordion[data-part='item'] {
76
+ border-block-start: var(--xh-stroke-thin) solid var(--xh-accordion-item-border, var(--xh-border-default));
77
+ }
78
+
79
+ .xh-scope-accordion[data-part='root'][data-orientation='horizontal']
80
+ > .xh-scope-accordion[data-part='item']
81
+ + .xh-scope-accordion[data-part='item'] {
82
+ border-block-start: 0;
83
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-accordion-item-border, var(--xh-border-default));
84
+ }
85
+
86
+ /* 作者显式渲染的分隔线。渲染了它,上面那条 item + item 的相邻规则就不再命中,
87
+ 两条线不会同时出现 */
88
+ .xh-scope-accordion[data-part='item-separator'] {
89
+ flex: none;
90
+ block-size: var(--xh-stroke-thin);
91
+ border: 0;
92
+ margin: 0;
93
+ background: var(--xh-accordion-item-border, var(--xh-border-default));
94
+ }
95
+
96
+ .xh-scope-accordion[data-part='item-separator'][hidden] {
97
+ display: none;
98
+ }
99
+
100
+ .xh-scope-accordion[data-part='root'][data-orientation='horizontal']
101
+ > .xh-scope-accordion[data-part='item-separator'] {
102
+ block-size: auto;
103
+ inline-size: var(--xh-stroke-thin);
104
+ }
105
+
106
+ /* —— 形态 —— */
107
+ /* ghost 档不在这儿:它就是上面那套基础取值,写不写 data-variant 都长一个样 */
108
+ /* 整份有了一块面,条与条之间就不再靠那条相邻边分开 */
109
+ .xh-scope-accordion[data-part='root']:is([data-variant='outline'], [data-variant='subtle'])
110
+ > .xh-scope-accordion[data-part='item']
111
+ + .xh-scope-accordion[data-part='item'] {
112
+ border-block-start: 0;
113
+ border-inline-start: 0;
114
+ }
115
+
116
+ /* outline:一张静态内容面,--xh-border-default 描边 + surface 底 + 无影(边界只由描边承担);
117
+ 根的外边走 --xh-accordion-border,与条与条之间的分隔线槽 --xh-accordion-item-border 各管各的 */
118
+ .xh-scope-accordion[data-part='root'][data-variant='outline'] {
119
+ border: var(--xh-stroke-thin) solid var(--xh-accordion-border, var(--xh-border-default));
120
+ border-radius: var(--xh-accordion-item-radius, var(--xh-shape-surface));
121
+ background: var(--xh-accordion-item-bg, var(--xh-bg-surface));
122
+ box-shadow: var(--xh-accordion-item-shadow, none);
123
+ overflow: clip;
124
+ }
125
+
126
+ /* subtle:同一块连续表面,底换成淡底,描边让位给底色但留住 1px 边位(三档几何一致);
127
+ 淡底承载面向标题栏下发 hover 200 → pressed 300 */
128
+ .xh-scope-accordion[data-part='root'][data-variant='subtle'] {
129
+ --xh-action-host-bg-hover: var(--xh-bg-subtle-hover);
130
+ --xh-action-host-bg-pressed: var(--xh-bg-subtle-active);
131
+
132
+ border: var(--xh-stroke-thin) solid transparent;
133
+ border-radius: var(--xh-accordion-item-radius, var(--xh-shape-surface));
134
+ background: var(--xh-accordion-item-bg, var(--xh-bg-subtle));
135
+ box-shadow: var(--xh-accordion-item-shadow, none);
136
+ overflow: clip;
137
+ }
138
+
139
+ .xh-scope-accordion[data-part='root']:is([data-variant='outline'], [data-variant='subtle'])
140
+ > .xh-scope-accordion[data-part='item']:not(:last-child)::after {
141
+ content: '';
142
+ position: absolute;
143
+ inset-inline: 0;
144
+ inset-block-end: 0;
145
+ block-size: var(--xh-stroke-thin);
146
+ background: var(--xh-accordion-item-border, var(--xh-border-default));
147
+ pointer-events: none;
148
+ }
149
+
150
+ .xh-scope-accordion[data-part='header'] {
151
+ margin: 0;
152
+ font: inherit;
153
+ }
154
+
155
+ /* 标题栏铺满一行,盒型、三档几何、悬停 / 按下 / 禁用面由 Action Control 的 disclosure-trigger 档给
156
+ (ghost 形态:白底承载 hover 100 → pressed 200,淡底容器由根下发 host 槽;按下只换面不缩放);
157
+ 这里只把使用者槽映射到桥接槽:字色三态同值(家族的 hover / pressed 字色规则比皮肤更特定,不映射会被换回
158
+ 缺省字色),字形按标题栏自己的档位取 --xh-_action-profile-glyph-size;边归零贴住条目,几何与迁移前一致 */
159
+ .xh-scope-accordion[data-part='trigger'] {
160
+ --xh-action-gap: var(--xh-accordion-trigger-gap, var(--xh-_action-profile-gap));
161
+ --xh-action-visual-size: var(--xh-accordion-trigger-h, var(--xh-_action-profile-visual-size));
162
+ --xh-action-padding-block: var(--xh-accordion-trigger-py, var(--xh-_accordion-trigger-py));
163
+ --xh-action-padding-inline: var(--xh-accordion-trigger-px, var(--xh-_accordion-trigger-px));
164
+ --xh-action-radius: var(--xh-accordion-trigger-radius, var(--xh-_action-profile-radius));
165
+ --xh-action-bg-rest: var(--xh-accordion-trigger-bg, var(--xh-_action-variant-bg-rest));
166
+ --xh-action-bg-hover: var(--xh-accordion-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
167
+ --xh-action-fg-rest: var(--xh-accordion-trigger-fg, var(--xh-_action-variant-fg-rest));
168
+ --xh-action-fg-hover: var(--xh-accordion-trigger-fg, var(--xh-_action-variant-fg-hover));
169
+ --xh-action-fg-pressed: var(--xh-accordion-trigger-fg, var(--xh-_action-variant-fg-pressed));
170
+ --xh-action-font-size: var(--xh-accordion-trigger-font-size, var(--xh-_action-profile-font-size));
171
+ --xh-icon-size: var(--xh-accordion-icon-size, var(--xh-glyph-size-sm));
172
+
173
+ border-width: 0;
174
+ font-weight: var(--xh-accordion-trigger-font-weight, var(--xh-text-label-weight));
175
+ line-height: var(--xh-leading-normal);
176
+ }
177
+
178
+ /* 展开态自带一个槽:与常态共用一个的话,作者一改常态字色,
179
+ 展开那一档的语气高亮就跟着被抹平,再也分不开。悬停 / 按下的面与收起态同档(open 与家族 hover 同档中性) */
180
+ .xh-scope-accordion[data-part='trigger'][data-state='open'] {
181
+ --xh-action-fg-rest: var(--xh-accordion-trigger-fg-open, var(--xh-_accordion-open-fg));
182
+ --xh-action-fg-hover: var(--xh-accordion-trigger-fg-open, var(--xh-_accordion-open-fg));
183
+ --xh-action-fg-pressed: var(--xh-accordion-trigger-fg-open, var(--xh-_accordion-open-fg));
184
+
185
+ font-weight: var(--xh-accordion-trigger-font-weight-open, var(--xh-font-weight-medium));
186
+ }
187
+
188
+ /* 禁用条目走 aria-disabled,仍留在 Tab 序里,只是不可操作;前景换成禁用色,不靠 opacity 压暗
189
+ (家族按 data-disabled 给禁用面与指针,字色槽在这里保留优先) */
190
+ .xh-scope-accordion[data-part='trigger'][data-disabled] {
191
+ --xh-action-fg-disabled: var(--xh-accordion-trigger-fg-disabled, var(--xh-_action-variant-fg-disabled));
192
+ }
193
+
194
+ .xh-scope-accordion[data-part='indicator'] {
195
+ display: inline-flex;
196
+ align-items: center;
197
+ justify-content: center;
198
+ flex: none;
199
+ color: var(--xh-accordion-indicator-fg, var(--xh-fg-subtle));
200
+ line-height: var(--xh-leading-none);
201
+ }
202
+
203
+ /* 指示器与正文同档转向:收起时取 collapse 档,展开时(下面的打开态)取 expand 档。
204
+ 首帧就在的朝向直接呈现(data-instant),第一次开合起才转 */
205
+ .xh-scope-accordion[data-part='indicator']:not([data-instant]) {
206
+ transition: rotate var(--xh-motion-duration-collapse) var(--xh-motion-ease-enter-strong);
207
+ }
208
+
209
+ /* 没写内容就由皮肤画;作者往部件里塞了自己的图形,这条规则即不命中 */
210
+ .xh-scope-accordion[data-part='indicator']:empty::before {
211
+ content: '';
212
+ display: inline-block;
213
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
214
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
215
+ vertical-align: var(--xh-glyph-baseline-shift);
216
+ background-color: currentColor;
217
+ -webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
218
+ mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
219
+ }
220
+
221
+ .xh-scope-accordion[data-part='indicator'][data-state='open'] {
222
+ rotate: 180deg;
223
+ }
224
+
225
+ .xh-scope-accordion[data-part='indicator'][data-state='open']:not([data-instant]) {
226
+ transition: rotate var(--xh-motion-duration-expand) var(--xh-motion-ease-enter-strong);
227
+ }
228
+
229
+ /* 这里刻意没有 [data-part='content'][hidden] { display: none }:补了动画一帧都播不出来。
230
+ 收起由适配器在退场结束后写内联 display 落成,退场窗口内靠 connect 发的 inert 挡住焦点 */
231
+ .xh-scope-accordion[data-part='content'] {
232
+ /* 行高与内缩同帧动的共享关键帧读这两条槽,两端内缩一起收放 */
233
+ --xh-_disclosure-pt: var(--xh-accordion-content-pt, var(--xh-_accordion-content-pt));
234
+ --xh-_disclosure-pb: var(--xh-accordion-content-pb, var(--xh-_accordion-content-pb));
235
+
236
+ display: grid;
237
+ grid-template-rows: 1fr;
238
+ overflow: clip;
239
+ padding-block-start: var(--xh-accordion-content-pt, var(--xh-_accordion-content-pt));
240
+ padding-block-end: var(--xh-accordion-content-pb, var(--xh-_accordion-content-pb));
241
+ padding-inline: var(--xh-accordion-content-px, var(--xh-_accordion-content-px));
242
+ /* 正文是标题栏下面一块淡底,与白底标题栏分出层次;淡底容器(subtle)本身已是这层底,正文不再叠一层 */
243
+ background: var(--xh-accordion-content-bg, var(--xh-bg-muted));
244
+ color: var(--xh-accordion-content-fg, var(--xh-fg-default));
245
+ font-size: var(--xh-accordion-content-font-size, var(--xh-text-body-size));
246
+ line-height: var(--xh-leading-normal);
247
+ }
248
+
249
+ .xh-scope-accordion[data-part='root'][data-variant='subtle'] .xh-scope-accordion[data-part='content'] {
250
+ background: var(--xh-accordion-content-bg, transparent);
251
+ }
252
+
253
+ /* 展开着的标题栏与正文之间一条分隔线,与条与条之间的线同色 */
254
+ .xh-scope-accordion[data-part='content'][data-state='open'] {
255
+ border-block-start: var(--xh-stroke-thin) solid
256
+ var(--xh-accordion-content-border, var(--xh-accordion-item-border, var(--xh-border-default)));
257
+ }
258
+
259
+ /* 展开与收起只在开合时播:首帧就在的展开 / 收起直接呈现(data-instant) */
260
+ .xh-scope-accordion[data-part='content'][data-state='open']:not([data-instant]) {
261
+ animation: xh-disclosure-expand var(--xh-motion-duration-expand) var(--xh-motion-ease-enter-strong);
262
+ }
263
+
264
+ .xh-scope-accordion[data-part='content'][data-state='closed']:not([data-instant]) {
265
+ animation: xh-disclosure-collapse var(--xh-motion-duration-collapse) var(--xh-motion-ease-exit) forwards;
266
+ }
267
+
268
+ @media (forced-colors: active) {
269
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
270
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
271
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
272
+ 禁用取 GrayText */
273
+ .xh-scope-accordion[data-part='indicator']:empty::before {
274
+ forced-color-adjust: none;
275
+ background-color: ButtonText;
276
+ }
277
+
278
+ .xh-scope-accordion[data-part='trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]) .xh-scope-accordion[data-part='indicator']:empty::before {
279
+ background-color: HighlightText;
280
+ }
281
+
282
+ .xh-scope-accordion[data-part='trigger'][data-disabled] .xh-scope-accordion[data-part='indicator']:empty::before {
283
+ background-color: GrayText;
284
+ }
285
+ }
286
+ }
287
+
288
+ @layer xihan.motion {
289
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
290
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
291
+ .xh-scope-accordion[data-part='root'][hidden],
292
+ .xh-scope-accordion[data-part='trigger'][hidden],
293
+ .xh-scope-accordion[data-part='indicator'][hidden] {
294
+ display: none;
295
+ }
296
+ }
@@ -0,0 +1,47 @@
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
+ /* 定义 affix 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-affix {
11
+ --xh-affix-skin: 1;
12
+ }
13
+
14
+ /* 占位盒就是 content 在常规流里占的那块地方。
15
+ 这里不声明 display,也不写高度:吸住时冻结的高度由连接层量好写进内联样式(它量得到,样式表量不到),
16
+ 没吸住时高度就该跟着内容走。不给 display,UA 的 [hidden]{display:none} 也仍然压得住 */
17
+ .xh-scope-affix[data-part='root'] {
18
+ /* 脱流后 content 不再撑开占位盒,宽度改从父级取 */
19
+ inline-size: 100%;
20
+ }
21
+
22
+ /* 没吸住时是常规流里普通的一块,不做任何定位 */
23
+ .xh-scope-affix[data-part='content'] {
24
+ inline-size: 100%;
25
+ }
26
+
27
+ /*
28
+ * 吸住:脱离常规流钉在视口上。
29
+ * 四个落位数(top / bottom / left / width)由连接层写成内联样式——它们是照占位盒的矩形实测出来的
30
+ * 物理量,换成逻辑属性会在 RTL 下贴反。这里只管「用哪种定位、压在第几层」。
31
+ * 另一件必须提防的事:fixed 认的是视口,祖先上一旦出现
32
+ * transform / filter / backdrop-filter / contain,包含块就被抢走,钉住的内容立刻贴错位置——
33
+ * 所以别往覆盖钩子里加这几个属性。
34
+ */
35
+ .xh-scope-affix[data-part='content'][data-fixed] {
36
+ position: fixed;
37
+ z-index: var(--xh-affix-layer, var(--xh-layer-sticky));
38
+ }
39
+
40
+ @media print {
41
+ /* 打印:钉住的是作者自己的内容,不能收起;但保持 fixed 会让部分打印引擎每页重复一次,
42
+ 所以只把它放回正常流。 */
43
+ .xh-scope-affix[data-part='content'][data-fixed] {
44
+ position: static;
45
+ }
46
+ }
47
+ }