@xihan-ui/styles 1.0.0-alpha.2 → 1.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 (122) hide show
  1. package/CHANGELOG.md +2177 -0
  2. package/README.md +1 -1
  3. package/css/accordion.css +80 -6
  4. package/css/alert.css +43 -14
  5. package/css/anchor.css +8 -8
  6. package/css/avatar-group.css +7 -3
  7. package/css/avatar.css +9 -3
  8. package/css/back-top.css +22 -1
  9. package/css/badge.css +104 -32
  10. package/css/breadcrumb.css +25 -5
  11. package/css/button-group.css +18 -13
  12. package/css/button.css +48 -11
  13. package/css/calendar.css +150 -7
  14. package/css/card.css +20 -11
  15. package/css/carousel.css +36 -5
  16. package/css/cascader.css +211 -124
  17. package/css/checkbox-group.css +72 -22
  18. package/css/checkbox.css +70 -13
  19. package/css/clipboard.css +2 -1
  20. package/css/code-block.css +12 -7
  21. package/css/collapsible.css +49 -3
  22. package/css/color-picker.css +132 -46
  23. package/css/combobox.css +132 -60
  24. package/css/composer.css +5 -3
  25. package/css/context-menu.css +113 -74
  26. package/css/date-field.css +93 -16
  27. package/css/date-picker.css +293 -72
  28. package/css/descriptions.css +11 -5
  29. package/css/dialog.css +47 -14
  30. package/css/download-trigger.css +76 -0
  31. package/css/drawer.css +57 -16
  32. package/css/dynamic-input.css +75 -17
  33. package/css/editable.css +12 -10
  34. package/css/ellipsis.css +7 -1
  35. package/css/empty-state.css +22 -12
  36. package/css/field.css +16 -6
  37. package/css/fieldset.css +69 -0
  38. package/css/file-upload.css +46 -8
  39. package/css/flex.css +13 -7
  40. package/css/float-button.css +23 -1
  41. package/css/floating-panel.css +316 -0
  42. package/css/form.css +4 -4
  43. package/css/grid.css +11 -5
  44. package/css/heatmap.css +411 -0
  45. package/css/highlight.css +2 -2
  46. package/css/hotkeys.css +90 -0
  47. package/css/hover-card.css +43 -45
  48. package/css/image-cropper.css +233 -0
  49. package/css/image-viewer.css +155 -17
  50. package/css/image.css +2 -2
  51. package/css/infinite-scroll.css +1 -1
  52. package/css/json-viewer.css +274 -0
  53. package/css/layout.css +19 -15
  54. package/css/list.css +22 -13
  55. package/css/listbox.css +24 -6
  56. package/css/loading-bar.css +12 -5
  57. package/css/log.css +7 -3
  58. package/css/marquee.css +9 -0
  59. package/css/masonry.css +63 -0
  60. package/css/mention.css +100 -36
  61. package/css/menu.css +127 -50
  62. package/css/menubar.css +155 -61
  63. package/css/navigation-menu.css +56 -31
  64. package/css/notification.css +377 -0
  65. package/css/number-animation.css +3 -3
  66. package/css/number-field.css +182 -19
  67. package/css/overlay-arrow.css +51 -0
  68. package/css/page-header.css +12 -5
  69. package/css/pagination.css +171 -14
  70. package/css/password-input.css +356 -0
  71. package/css/pin-input.css +15 -12
  72. package/css/popconfirm.css +55 -12
  73. package/css/popover.css +73 -45
  74. package/css/popselect.css +207 -57
  75. package/css/progress.css +54 -8
  76. package/css/qr-code.css +1 -1
  77. package/css/radio-group.css +27 -10
  78. package/css/rating.css +4 -4
  79. package/css/reset.css +17 -0
  80. package/css/result.css +21 -11
  81. package/css/scroll-area.css +61 -89
  82. package/css/scrollbar.css +170 -0
  83. package/css/segmented.css +215 -0
  84. package/css/select.css +298 -131
  85. package/css/separator.css +2 -2
  86. package/css/side-nav.css +127 -24
  87. package/css/signature-pad.css +144 -0
  88. package/css/skeleton.css +7 -1
  89. package/css/slider.css +14 -12
  90. package/css/space.css +117 -0
  91. package/css/spinner.css +22 -10
  92. package/css/statistic.css +9 -9
  93. package/css/steps.css +29 -12
  94. package/css/switch.css +57 -8
  95. package/css/table.css +146 -44
  96. package/css/tabs.css +13 -5
  97. package/css/tag.css +179 -0
  98. package/css/tags-input.css +80 -42
  99. package/css/text-field.css +151 -38
  100. package/css/thread.css +11 -3
  101. package/css/time-field.css +99 -18
  102. package/css/time-picker.css +261 -71
  103. package/css/timeline.css +15 -15
  104. package/css/timer.css +119 -0
  105. package/css/toast.css +129 -55
  106. package/css/toggle-group.css +30 -4
  107. package/css/toggle.css +12 -6
  108. package/css/tone.css +57 -22
  109. package/css/toolbar.css +1 -1
  110. package/css/tooltip.css +40 -31
  111. package/css/tour.css +112 -61
  112. package/css/transfer.css +98 -21
  113. package/css/tree-select.css +215 -89
  114. package/css/tree.css +131 -5
  115. package/css/typography.css +5 -5
  116. package/css/undefined.css +12 -1
  117. package/css/virtualizer.css +3 -1
  118. package/css/watermark.css +1 -2
  119. package/index.css +18 -1
  120. package/index.unlayered.css +10356 -3255
  121. package/package.json +20 -4
  122. package/css/toaster.css +0 -74
@@ -8,9 +8,9 @@
8
8
  /* 三个尺寸档只换这几个私有槽,图标与标题都从 root 继承它们,
9
9
  换档不必给每个部件各写一条选择器 */
10
10
  --xh-_empty-state-gap: var(--xh-stack-gap-md);
11
- --xh-_empty-state-py: var(--xh-section-py);
12
- --xh-_empty-state-icon-size: 2.5rem;
13
- --xh-_empty-state-title-size: var(--xh-font-size-lg);
11
+ --xh-_empty-state-py: var(--xh-section-py-md);
12
+ --xh-_empty-state-icon-size: var(--xh-glyph-size-2xl);
13
+ --xh-_empty-state-title-size: var(--xh-control-font-lg);
14
14
  /* 说明的读行宽度:整句话不收窄就会拉成一条难读的长行 */
15
15
  --xh-_empty-state-measure: 32rem;
16
16
 
@@ -31,17 +31,17 @@
31
31
  }
32
32
 
33
33
  [data-scope='empty-state'][data-part='root'][data-size='sm'] {
34
- --xh-_empty-state-gap: var(--xh-space-2);
35
- --xh-_empty-state-py: var(--xh-space-4);
36
- --xh-_empty-state-icon-size: 2rem;
37
- --xh-_empty-state-title-size: var(--xh-font-size-md);
34
+ --xh-_empty-state-gap: var(--xh-stack-gap-sm);
35
+ --xh-_empty-state-py: var(--xh-section-py-sm);
36
+ --xh-_empty-state-icon-size: var(--xh-glyph-size-xl);
37
+ --xh-_empty-state-title-size: var(--xh-control-font-md);
38
38
  }
39
39
 
40
40
  [data-scope='empty-state'][data-part='root'][data-size='lg'] {
41
- --xh-_empty-state-gap: var(--xh-space-6);
42
- --xh-_empty-state-py: var(--xh-space-8);
43
- --xh-_empty-state-icon-size: 3.5rem;
44
- --xh-_empty-state-title-size: var(--xh-font-size-xl);
41
+ --xh-_empty-state-gap: var(--xh-stack-gap-lg);
42
+ --xh-_empty-state-py: var(--xh-section-py-lg);
43
+ --xh-_empty-state-icon-size: var(--xh-glyph-size-3xl);
44
+ --xh-_empty-state-title-size: var(--xh-text-heading-3-size);
45
45
  }
46
46
 
47
47
  [data-scope='empty-state'][data-part='icon'] {
@@ -49,11 +49,14 @@
49
49
  align-items: center;
50
50
  justify-content: center;
51
51
  flex: none;
52
+ /* 作者塞进图标槽的 XhIcon 与皮肤画的字形同一把尺,都按展示档的图标框量 */
53
+ --xh-icon-size: var(--xh-empty-state-icon-size, var(--xh-_empty-state-icon-size));
54
+
52
55
  block-size: var(--xh-empty-state-icon-size, var(--xh-_empty-state-icon-size));
53
56
  inline-size: var(--xh-empty-state-icon-size, var(--xh-_empty-state-icon-size));
54
57
  color: var(--xh-empty-state-icon-fg, var(--xh-fg-subtle));
55
58
  /* 图标常是一个字形,字号跟着图标框走,line-height 不再另占高度 */
56
- font-size: var(--xh-empty-state-icon-font-size, var(--xh-font-size-3xl));
59
+ font-size: var(--xh-empty-state-icon-font-size, var(--xh-_empty-state-icon-size));
57
60
  line-height: var(--xh-leading-none);
58
61
  }
59
62
 
@@ -80,4 +83,11 @@
80
83
  justify-content: center;
81
84
  gap: var(--xh-empty-state-action-gap, var(--xh-space-2));
82
85
  }
86
+
87
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
88
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
89
+ [data-scope='empty-state'][data-part='icon'][hidden],
90
+ [data-scope='empty-state'][data-part='action'][hidden] {
91
+ display: none;
92
+ }
83
93
  }
package/css/field.css CHANGED
@@ -22,8 +22,10 @@
22
22
  [data-scope='form'][data-part='root'][data-layout='horizontal'] [data-scope='field'][data-part='label'] {
23
23
  grid-column: 1;
24
24
  justify-self: end;
25
- /* 与控件的首行文字对齐:按控件高度撑一行再居中 */
26
- line-height: var(--xh-control-h-md);
25
+ /* 与控件的首行文字对齐:行高保持正文行距(标签折行时每行不会撑成一个控件高),
26
+ 上下留白把单行文本盒撑到控件高度;配的是哪一档控件由 --xh-field-control-h 告诉它 */
27
+ line-height: var(--xh-field-label-leading, var(--xh-leading-normal));
28
+ padding-block: calc((var(--xh-field-control-h, var(--xh-control-h-md)) - 1lh) / 2);
27
29
  }
28
30
 
29
31
  [data-scope='form'][data-part='root'][data-layout='horizontal'][data-label-align='start'] [data-scope='field'][data-part='label'] {
@@ -47,7 +49,7 @@
47
49
 
48
50
  /* 必填星号:跟着根上的 data-required 亮,选填不标 */
49
51
  [data-scope='field'][data-part='root'][data-required] [data-part='label']::after {
50
- content: '*';
52
+ content: var(--xh-glyph-mark-required);
51
53
  margin-inline-start: var(--xh-space-1);
52
54
  color: var(--xh-field-label-star, var(--xh-fg-danger));
53
55
  }
@@ -65,12 +67,13 @@
65
67
  }
66
68
 
67
69
  [data-scope='field'][data-part='control']:focus-visible {
70
+ border-color: var(--xh-field-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
68
71
  outline: var(--xh-ring-width) solid var(--xh-ring-focus);
69
72
  outline-offset: var(--xh-ring-offset);
70
73
  }
71
74
 
72
75
  [data-scope='field'][data-part='control'][data-invalid] {
73
- border-color: var(--xh-field-control-border-invalid, var(--xh-color-danger-500));
76
+ border-color: var(--xh-field-control-border-invalid, var(--xh-border-invalid));
74
77
  }
75
78
 
76
79
  /* 禁用由作者在控件上落原生 disabled,样式统一走 data-disabled */
@@ -83,7 +86,7 @@
83
86
  [data-scope='field'][data-part='description'] {
84
87
  margin: 0;
85
88
  color: var(--xh-field-description-fg, var(--xh-fg-muted));
86
- font-size: var(--xh-field-description-font-size, var(--xh-font-size-sm));
89
+ font-size: var(--xh-field-description-font-size, var(--xh-text-secondary-size));
87
90
  line-height: var(--xh-leading-normal);
88
91
  }
89
92
 
@@ -95,7 +98,14 @@
95
98
  [data-scope='field'][data-part='error-text'] {
96
99
  margin: 0;
97
100
  color: var(--xh-field-error-fg, var(--xh-fg-danger));
98
- font-size: var(--xh-field-error-font-size, var(--xh-font-size-sm));
101
+ font-size: var(--xh-field-error-font-size, var(--xh-text-secondary-size));
99
102
  line-height: var(--xh-leading-normal);
100
103
  }
104
+
105
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
106
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
107
+ [data-scope='field'][data-part='root'][hidden],
108
+ [data-scope='form'][data-part='root'][hidden] {
109
+ display: none;
110
+ }
101
111
  }
@@ -0,0 +1,69 @@
1
+ @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='fieldset'] {
4
+ --xh-fieldset-skin: 1;
5
+ }
6
+
7
+ /* 抹掉 UA 给 <fieldset> 的边框、内外边距与 min-content 下限,间距全部改由令牌给。
8
+ display 落在 fieldset 的匿名内容盒上:首个 <legend> 不在这个盒子里,
9
+ 所以 gap 只作用于组内各块,legend 与内容之间的留白由 legend 自己的下外边距给。 */
10
+ [data-scope='fieldset'][data-part='root'] {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: var(--xh-fieldset-gap, var(--xh-space-4));
14
+ margin: 0;
15
+ border: 0;
16
+ padding: 0;
17
+ min-inline-size: 0;
18
+ }
19
+
20
+ [data-scope='fieldset'][data-part='root'][hidden] {
21
+ display: none;
22
+ }
23
+
24
+ [data-scope='fieldset'][data-part='legend'] {
25
+ padding: 0;
26
+ margin-block-end: var(--xh-fieldset-legend-gap, var(--xh-space-2));
27
+ color: var(--xh-fieldset-legend-fg, var(--xh-fg-default));
28
+ font-size: var(--xh-fieldset-legend-font-size, var(--xh-text-label-size));
29
+ font-weight: var(--xh-fieldset-legend-font-weight, var(--xh-text-label-weight));
30
+ line-height: var(--xh-leading-tight);
31
+ }
32
+
33
+ /* 整组无效时组标题转警示色:没渲染错误文案的字段集上,这是屏幕上唯一变化的东西 */
34
+ [data-scope='fieldset'][data-part='root'][data-invalid] > [data-scope='fieldset'][data-part='legend'] {
35
+ color: var(--xh-fieldset-legend-fg-invalid, var(--xh-fg-danger));
36
+ }
37
+
38
+ /* 整组禁用时组标题跟着变淡;组内控件由原生 fieldset[disabled] 各自呈现禁用态。
39
+ 选择器与上一条同权重且排在后面,禁用与无效同时为真时以禁用为准。 */
40
+ [data-scope='fieldset'][data-part='root'] > [data-scope='fieldset'][data-part='legend'][data-disabled] {
41
+ color: var(--xh-fieldset-legend-fg-disabled, var(--xh-fg-subtle));
42
+ }
43
+
44
+ /* 必填星号:跟着根上的 data-required 亮,选填不标 */
45
+ [data-scope='fieldset'][data-part='root'][data-required] > [data-scope='fieldset'][data-part='legend']::after {
46
+ content: var(--xh-glyph-mark-required);
47
+ margin-inline-start: var(--xh-space-1);
48
+ color: var(--xh-fieldset-legend-star, var(--xh-fg-danger));
49
+ }
50
+
51
+ [data-scope='fieldset'][data-part='helper-text'] {
52
+ margin: 0;
53
+ color: var(--xh-fieldset-helper-fg, var(--xh-fg-muted));
54
+ font-size: var(--xh-fieldset-helper-font-size, var(--xh-text-secondary-size));
55
+ line-height: var(--xh-leading-normal);
56
+ }
57
+
58
+ [data-scope='fieldset'][data-part='helper-text'][data-disabled] {
59
+ color: var(--xh-fieldset-helper-fg-disabled, var(--xh-fg-subtle));
60
+ }
61
+
62
+ /* 不 invalid 时节点带 hidden:此处不声明 display,交给浏览器的 [hidden] 规则收起 */
63
+ [data-scope='fieldset'][data-part='error-text'] {
64
+ margin: 0;
65
+ color: var(--xh-fieldset-error-fg, var(--xh-fg-danger));
66
+ font-size: var(--xh-fieldset-error-font-size, var(--xh-text-secondary-size));
67
+ line-height: var(--xh-leading-normal);
68
+ }
69
+ }
@@ -5,6 +5,9 @@
5
5
  }
6
6
 
7
7
  [data-scope='file-upload'][data-part='root'] {
8
+ /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
9
+ --xh-icon-size: var(--xh-file-upload-icon-size, var(--xh-glyph-size-text));
10
+
8
11
  display: flex;
9
12
  flex-direction: column;
10
13
  gap: var(--xh-file-upload-gap, var(--xh-space-3));
@@ -72,7 +75,7 @@
72
75
  }
73
76
 
74
77
  [data-scope='file-upload'][data-part='dropzone'][data-invalid] {
75
- border-color: var(--xh-file-upload-dropzone-border-invalid, var(--xh-color-danger-500));
78
+ border-color: var(--xh-file-upload-dropzone-border-invalid, var(--xh-border-invalid));
76
79
  }
77
80
 
78
81
  /* 投放区是 div,没有原生 disabled 可用,禁用态只能靠 data-disabled 表达,写 :disabled 永远不命中 */
@@ -190,7 +193,7 @@
190
193
  只挑图标色不换底色:底色一换,一列文件里图片那几行会跳出来抢戏。
191
194
  取语义 token 而不是品牌色阶原值,深色主题才跟着走 */
192
195
  [data-scope='file-upload'][data-part='item-preview'][data-file-type^='image/'] {
193
- color: var(--xh-file-upload-preview-fg-image, var(--xh-bg-brand));
196
+ color: var(--xh-file-upload-preview-fg-image, var(--xh-fg-brand));
194
197
  }
195
198
 
196
199
  /* 塞进来的真缩略图撑满这个方框,长宽比不对就裁掉,不许把格子顶变形 */
@@ -215,7 +218,7 @@
215
218
  [data-scope='file-upload'][data-part='item-size-text'] {
216
219
  flex: none;
217
220
  color: var(--xh-file-upload-size-fg, var(--xh-fg-subtle));
218
- font-size: var(--xh-file-upload-size-font-size, var(--xh-font-size-xs));
221
+ font-size: var(--xh-file-upload-size-font-size, var(--xh-text-caption-size));
219
222
  font-variant-numeric: tabular-nums;
220
223
  white-space: nowrap;
221
224
  }
@@ -230,8 +233,8 @@
230
233
  flex: none;
231
234
  align-items: center;
232
235
  justify-content: center;
233
- inline-size: var(--xh-file-upload-delete-size, var(--xh-control-h-sm));
234
- block-size: var(--xh-file-upload-delete-size, var(--xh-control-h-sm));
236
+ inline-size: var(--xh-file-upload-delete-size, var(--xh-control-action-size));
237
+ block-size: var(--xh-file-upload-delete-size, var(--xh-control-action-size));
235
238
  padding: 0;
236
239
  border: 0;
237
240
  border-radius: var(--xh-file-upload-delete-radius, var(--xh-shape-control));
@@ -240,6 +243,9 @@
240
243
  font-family: inherit;
241
244
  line-height: var(--xh-leading-none);
242
245
  cursor: pointer;
246
+ transition:
247
+ background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
248
+ scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
243
249
  }
244
250
 
245
251
  [data-scope='file-upload'][data-part='item-delete-trigger'][hidden] {
@@ -251,6 +257,12 @@
251
257
  color: var(--xh-file-upload-delete-fg-hover, var(--xh-fg-danger-hover));
252
258
  }
253
259
 
260
+ /* 按下:换到按压档底色并轻微下压,松手弹回;禁用钮不压 */
261
+ [data-scope='file-upload'][data-part='item-delete-trigger']:not(:disabled):active {
262
+ background: var(--xh-file-upload-delete-bg-active, var(--xh-bg-subtle-active));
263
+ scale: var(--xh-motion-scale-press);
264
+ }
265
+
254
266
  [data-scope='file-upload'][data-part='item-delete-trigger']:focus-visible {
255
267
  outline: var(--xh-ring-width) solid var(--xh-ring-focus);
256
268
  outline-offset: var(--xh-ring-offset);
@@ -261,8 +273,7 @@
261
273
  cursor: not-allowed;
262
274
  }
263
275
 
264
- /* 清空是收尾动作,画成不带底色的文字按钮:它比"选择文件"次要,
265
- 且列表为空时连接层会给原生 disabled,那时它本就该看着点不动 */
276
+ /* 清空是收尾动作,画成不带底色的文字按钮:它比"选择文件"次要 */
266
277
  [data-scope='file-upload'][data-part='clear-trigger'] {
267
278
  display: inline-flex;
268
279
  flex: none;
@@ -277,9 +288,12 @@
277
288
  background: transparent;
278
289
  color: var(--xh-file-upload-clear-fg, var(--xh-fg-muted));
279
290
  font-family: inherit;
280
- font-size: var(--xh-file-upload-clear-font-size, var(--xh-font-size-xs));
291
+ font-size: var(--xh-file-upload-clear-font-size, var(--xh-text-caption-size));
281
292
  line-height: var(--xh-leading-none);
282
293
  cursor: pointer;
294
+ transition:
295
+ background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
296
+ scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
283
297
  }
284
298
 
285
299
  [data-scope='file-upload'][data-part='clear-trigger'][hidden] {
@@ -291,13 +305,37 @@
291
305
  color: var(--xh-file-upload-clear-fg-hover, var(--xh-fg-default));
292
306
  }
293
307
 
308
+ /* 按下:换到按压档底色并轻微下压,松手弹回;禁用钮不压 */
309
+ [data-scope='file-upload'][data-part='clear-trigger']:not(:disabled):active {
310
+ background: var(--xh-file-upload-clear-bg-active, var(--xh-bg-subtle-active));
311
+ scale: var(--xh-motion-scale-press);
312
+ }
313
+
294
314
  [data-scope='file-upload'][data-part='clear-trigger']:focus-visible {
295
315
  outline: var(--xh-ring-width) solid var(--xh-ring-focus);
296
316
  outline-offset: var(--xh-ring-offset);
297
317
  }
298
318
 
319
+ /* 空列表时按钮照常可按(收起它会让焦点掉回 body),只把前景压淡一档 */
320
+ [data-scope='file-upload'][data-part='clear-trigger'][data-empty] {
321
+ color: var(--xh-fg-subtle);
322
+ }
323
+
299
324
  [data-scope='file-upload'][data-part='clear-trigger']:disabled {
300
325
  color: var(--xh-fg-disabled);
301
326
  cursor: not-allowed;
302
327
  }
328
+
329
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
330
+ [data-scope='file-upload'][data-part='item-delete-trigger']:empty::before,
331
+ [data-scope='file-upload'][data-part='clear-trigger']:empty::before {
332
+ content: '';
333
+ display: inline-block;
334
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
335
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
336
+ vertical-align: var(--xh-glyph-baseline-shift);
337
+ background-color: currentColor;
338
+ -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
339
+ mask: var(--xh-glyph-mark-close) center / contain no-repeat;
340
+ }
303
341
  }
package/css/flex.css CHANGED
@@ -17,11 +17,11 @@
17
17
  }
18
18
 
19
19
  /* —— 方向 —— */
20
- [data-scope='flex'][data-part='root'][data-direction='row'] {
20
+ [data-scope='flex'][data-part='root'][data-orientation='horizontal'] {
21
21
  flex-direction: row;
22
22
  }
23
23
 
24
- [data-scope='flex'][data-part='root'][data-direction='column'] {
24
+ [data-scope='flex'][data-part='root'][data-orientation='vertical'] {
25
25
  flex-direction: column;
26
26
  }
27
27
 
@@ -79,22 +79,28 @@
79
79
  /* —— 间距档位 —— */
80
80
  /* 每一档指向一个间距令牌,折行时行与行之间也吃这份间距 */
81
81
  [data-scope='flex'][data-part='root'][data-gap='xs'] {
82
- gap: var(--xh-flex-gap, var(--xh-space-1));
82
+ gap: var(--xh-flex-gap, var(--xh-layout-gap-xs));
83
83
  }
84
84
 
85
85
  [data-scope='flex'][data-part='root'][data-gap='sm'] {
86
- gap: var(--xh-flex-gap, var(--xh-space-2));
86
+ gap: var(--xh-flex-gap, var(--xh-layout-gap-sm));
87
87
  }
88
88
 
89
89
  [data-scope='flex'][data-part='root'][data-gap='md'] {
90
- gap: var(--xh-flex-gap, var(--xh-space-3));
90
+ gap: var(--xh-flex-gap, var(--xh-layout-gap-md));
91
91
  }
92
92
 
93
93
  [data-scope='flex'][data-part='root'][data-gap='lg'] {
94
- gap: var(--xh-flex-gap, var(--xh-space-4));
94
+ gap: var(--xh-flex-gap, var(--xh-layout-gap-lg));
95
95
  }
96
96
 
97
97
  [data-scope='flex'][data-part='root'][data-gap='xl'] {
98
- gap: var(--xh-flex-gap, var(--xh-space-6));
98
+ gap: var(--xh-flex-gap, var(--xh-layout-gap-xl));
99
+ }
100
+
101
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
102
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
103
+ [data-scope='flex'][data-part='root'][hidden] {
104
+ display: none;
99
105
  }
100
106
  }
@@ -10,6 +10,9 @@
10
10
  transform / filter / backdrop-filter / contain,包含块就被抢走,整组立刻贴错位置——
11
11
  所以别往覆盖钩子里加这几个属性。 */
12
12
  [data-scope='float-button'][data-part='root'] {
13
+ /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
14
+ --xh-icon-size: var(--xh-float-button-icon-size, var(--xh-glyph-size-text));
15
+
13
16
  --xh-_float-button-offset: var(--xh-space-6);
14
17
  /* 触发器与展开的每一条动作共用这两个私有槽,换档只改这里 */
15
18
  --xh-_float-button-size: var(--xh-float-button-size, var(--xh-control-h-lg));
@@ -67,7 +70,7 @@
67
70
  background: var(--xh-float-button-bg, var(--xh-bg-surface-raised));
68
71
  color: var(--xh-float-button-fg, var(--xh-fg-default));
69
72
  /* 浮在内容之上,靠投影与页面拉开层次 */
70
- box-shadow: var(--xh-elevation-3);
73
+ box-shadow: var(--xh-float-button-shadow, var(--xh-elevation-sheet));
71
74
  cursor: pointer;
72
75
  transition:
73
76
  background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
@@ -123,4 +126,23 @@
123
126
  block-size: var(--xh-_float-button-size);
124
127
  border-radius: var(--xh-_float-button-radius);
125
128
  }
129
+
130
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
131
+ [data-scope='float-button'][data-part='trigger']:empty::before {
132
+ content: '';
133
+ display: inline-block;
134
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
135
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
136
+ vertical-align: var(--xh-glyph-baseline-shift);
137
+ background-color: currentColor;
138
+ -webkit-mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
139
+ mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
140
+ }
141
+
142
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
143
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
144
+ [data-scope='float-button'][data-part='root'][hidden],
145
+ [data-scope='float-button'][data-part='trigger'][hidden] {
146
+ display: none;
147
+ }
126
148
  }