@xihan-ui/styles 1.0.0 → 2.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 (171) hide show
  1. package/CHANGELOG.md +5146 -6
  2. package/README.md +22 -2
  3. package/component-tokens.d.ts +4212 -0
  4. package/component-tokens.js +2 -0
  5. package/components.tokens.json +80116 -0
  6. package/css/accordion.css +131 -75
  7. package/css/affix.css +16 -1
  8. package/css/alert.css +114 -67
  9. package/css/anchor.css +99 -27
  10. package/css/approval.css +461 -0
  11. package/css/avatar-group.css +14 -6
  12. package/css/avatar.css +33 -9
  13. package/css/back-top.css +103 -48
  14. package/css/badge.css +42 -14
  15. package/css/bar-code.css +62 -0
  16. package/css/breadcrumb.css +40 -21
  17. package/css/button-group.css +146 -24
  18. package/css/button.css +116 -99
  19. package/css/calendar-picker.css +448 -0
  20. package/css/calendar-range-picker.css +517 -0
  21. package/css/card.css +54 -77
  22. package/css/carousel.css +412 -68
  23. package/css/cascader.css +429 -246
  24. package/css/checkbox-group.css +225 -77
  25. package/css/checkbox.css +174 -37
  26. package/css/clipboard.css +266 -47
  27. package/css/code-view.css +279 -0
  28. package/css/collapsible.css +108 -63
  29. package/css/color-field.css +158 -0
  30. package/css/color-picker.css +172 -184
  31. package/css/color-slider.css +274 -0
  32. package/css/color-swatch-picker.css +243 -0
  33. package/css/color-swatch.css +35 -0
  34. package/css/combobox.css +267 -273
  35. package/css/command.css +399 -0
  36. package/css/context-menu.css +183 -108
  37. package/css/date-field.css +94 -121
  38. package/css/date-picker.css +486 -249
  39. package/css/date-range-picker.css +559 -0
  40. package/css/description.css +51 -0
  41. package/css/descriptions.css +133 -87
  42. package/css/dialog.css +247 -68
  43. package/css/diff-view.css +428 -0
  44. package/css/download-trigger.css +155 -46
  45. package/css/drawer.css +194 -111
  46. package/css/editable.css +172 -152
  47. package/css/empty-state.css +80 -11
  48. package/css/field-array.css +190 -0
  49. package/css/field.css +84 -31
  50. package/css/fieldset.css +51 -18
  51. package/css/file-upload.css +134 -36
  52. package/css/flex.css +20 -1
  53. package/css/float-button.css +238 -57
  54. package/css/floating-panel.css +173 -92
  55. package/css/focus.css +46 -0
  56. package/css/forced-colors.css +93 -0
  57. package/css/form.css +254 -77
  58. package/css/gradient-text.css +34 -10
  59. package/css/grid.css +516 -5
  60. package/css/heatmap.css +87 -29
  61. package/css/highlight.css +20 -5
  62. package/css/hover-card.css +97 -47
  63. package/css/icon-wrapper.css +15 -3
  64. package/css/icon.css +74 -8
  65. package/css/image-cropper.css +143 -29
  66. package/css/image-viewer.css +150 -89
  67. package/css/image.css +30 -1
  68. package/css/infinite-scroll.css +51 -1
  69. package/css/input-group.css +277 -0
  70. package/css/json-viewer.css +102 -45
  71. package/css/kbd.css +72 -0
  72. package/css/label.css +78 -0
  73. package/css/layers.css +5 -0
  74. package/css/layout.css +175 -31
  75. package/css/list.css +24 -3
  76. package/css/listbox.css +208 -67
  77. package/css/loading-bar.css +52 -3
  78. package/css/log.css +144 -9
  79. package/css/markdown-stream.css +149 -0
  80. package/css/marquee.css +27 -1
  81. package/css/masonry.css +7 -0
  82. package/css/matrix-code.css +67 -0
  83. package/css/mention.css +234 -152
  84. package/css/menu.css +180 -83
  85. package/css/menubar.css +204 -136
  86. package/css/message-feed.css +197 -0
  87. package/css/navigation-menu.css +144 -90
  88. package/css/notification.css +178 -100
  89. package/css/number-animation.css +7 -0
  90. package/css/number-field.css +120 -277
  91. package/css/overlay-arrow.css +12 -7
  92. package/css/page-header.css +99 -14
  93. package/css/pagination.css +175 -135
  94. package/css/password-input.css +222 -219
  95. package/css/pin-input.css +101 -67
  96. package/css/pointer.css +36 -0
  97. package/css/popconfirm.css +185 -94
  98. package/css/popover.css +121 -77
  99. package/css/progress.css +60 -12
  100. package/css/prompt-input.css +224 -0
  101. package/css/question-flow.css +513 -0
  102. package/css/radio-group.css +147 -30
  103. package/css/rating.css +193 -43
  104. package/css/reasoning.css +336 -0
  105. package/css/reset.css +84 -6
  106. package/css/resizable.css +237 -0
  107. package/css/scroll-area.css +68 -7
  108. package/css/scrollbar.css +47 -13
  109. package/css/segmented.css +94 -29
  110. package/css/select.css +288 -274
  111. package/css/separator.css +101 -1
  112. package/css/side-nav.css +133 -75
  113. package/css/signature-pad.css +74 -54
  114. package/css/skeleton.css +84 -11
  115. package/css/slider.css +132 -39
  116. package/css/sortable.css +198 -0
  117. package/css/spinner.css +126 -12
  118. package/css/splitter.css +29 -8
  119. package/css/statistic.css +55 -0
  120. package/css/steps.css +206 -72
  121. package/css/switch.css +268 -36
  122. package/css/table.css +695 -118
  123. package/css/tabs.css +604 -42
  124. package/css/tag-group.css +219 -0
  125. package/css/tag.css +118 -28
  126. package/css/tags-input.css +156 -274
  127. package/css/text-field.css +101 -249
  128. package/css/time-field.css +100 -128
  129. package/css/time-picker.css +323 -252
  130. package/css/time-range-picker.css +719 -0
  131. package/css/timeline.css +202 -68
  132. package/css/timer.css +56 -52
  133. package/css/timestamp.css +34 -0
  134. package/css/toast.css +373 -144
  135. package/css/toggle-group.css +309 -76
  136. package/css/toggle.css +116 -85
  137. package/css/tone.css +47 -0
  138. package/css/tool-call.css +421 -0
  139. package/css/toolbar.css +181 -33
  140. package/css/tooltip.css +107 -36
  141. package/css/tour.css +183 -152
  142. package/css/transfer.css +351 -138
  143. package/css/tree-select.css +323 -216
  144. package/css/tree.css +294 -62
  145. package/css/truncate.css +65 -0
  146. package/css/typography.css +228 -5
  147. package/css/undefined.css +10 -1
  148. package/css/virtualizer.css +9 -10
  149. package/css/visually-hidden.css +7 -0
  150. package/css/watermark.css +7 -0
  151. package/family/action-control.css +487 -0
  152. package/family/collection-item.css +721 -0
  153. package/family/field-chrome.css +298 -0
  154. package/family/motion.css +166 -0
  155. package/family/swatch.css +59 -0
  156. package/index.css +41705 -126
  157. package/index.unlayered.css +33692 -17339
  158. package/package.json +51 -17
  159. package/css/calendar.css +0 -367
  160. package/css/code-block.css +0 -91
  161. package/css/composer.css +0 -134
  162. package/css/countdown.css +0 -26
  163. package/css/dynamic-input.css +0 -220
  164. package/css/ellipsis.css +0 -52
  165. package/css/hotkeys.css +0 -90
  166. package/css/popselect.css +0 -391
  167. package/css/qr-code.css +0 -55
  168. package/css/result.css +0 -119
  169. package/css/space.css +0 -117
  170. package/css/thread.css +0 -120
  171. package/css/time.css +0 -25
package/css/transfer.css CHANGED
@@ -1,47 +1,109 @@
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
+ /* 定义 transfer 样式。 */
7
+
8
+ @import '../family/action-control.css';
9
+ @import '../family/collection-item.css';
10
+
1
11
  @layer xihan.components {
2
12
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
13
  [data-scope='transfer'] {
4
14
  --xh-transfer-skin: 1;
5
15
  }
6
16
 
7
- /* 三栏栅格:两侧面板各占一栏、跨两行,中间那栏上下各放一个搬运按钮,
8
- 两个按钮在中线处相遇。栅格的列号本身就是随书写方向走的(第 1 栏永远在行首侧),
9
- dir=rtl 时整块自动镜像,不必另写一套。
17
+ /* 三栏栅格:宽档两侧面板各占一栏、跨两行,中间那栏上下各放一个搬运按钮;
18
+ 窄档四个节点改按行叠放,中栏被两个按钮各跨一半、宽度收成零,两钮因此仍在中线相遇。
19
+ 两档共用这一份轨道声明,换档靠四个子节点各自换安放。
20
+ 栅格的列号本身就是随书写方向走的(第 1 栏永远在行首侧),dir=rtl 时整块自动镜像。
10
21
  中间那栏没有对应的角色节点(anatomy 里两个按钮是 root 的直接子节点),
11
- 所以只能按位置显式安放,不能靠自动流——自动流会把"往左搬"甩到右侧面板的位置上 */
22
+ 所以只能按位置显式安放,不能靠自动流——自动流会把"往回搬"甩到目标面板的位置上 */
12
23
  [data-scope='transfer'][data-part='root'] {
13
- /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
14
- --xh-icon-size: var(--xh-transfer-icon-size, var(--xh-glyph-size-text));
24
+ /* 条目外的字形(空态占位里作者塞的图标)按档取尺,缺省 md;条目内的字形由家族随 data-xh-collection-size
25
+ 下发,搬运钮内的按 Action Control icon 档取,勾选格里的勾按边长比例取(§6.5) */
26
+ --xh-icon-size: var(--xh-transfer-icon-size, var(--xh-glyph-size-md));
27
+ /* 两侧定高小列表的自绘条挂在根上(§6.6):根是条子的定位盒(面板不定位),轨道底色关掉才不会在列表边缘糊出一条灰带 */
28
+ --xh-scrollbar-track-bg: transparent;
29
+
30
+ /* 尺寸档只换这五个私有槽,面板头、搜索框、条目与勾选格都从 root 继承它们,
31
+ 换档不必给每个部件各写一条选择器 */
32
+ --xh-_transfer-item-py: var(--xh-list-option-py-md);
33
+ --xh-_transfer-px: var(--xh-control-px-md);
34
+ --xh-_transfer-gap: var(--xh-control-gap-md);
35
+ --xh-_transfer-font-size: var(--xh-control-font-md);
36
+ --xh-_transfer-box: var(--xh-control-indicator-md);
37
+
38
+ /* 勾选格的填色随语气走;没写 data-tone 时退回品牌色 */
39
+ --xh-_transfer-accent: var(--xh-_tone, var(--xh-bg-brand));
40
+ --xh-_transfer-on-accent: var(--xh-_tone-on, var(--xh-fg-on-brand));
15
41
 
42
+ position: relative;
16
43
  display: grid;
17
- grid-template-rows: 1fr 1fr;
44
+ grid-template-rows: auto auto;
18
45
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
19
46
  gap: var(--xh-transfer-gap, var(--xh-space-3));
20
47
  align-items: center;
21
48
  color: var(--xh-transfer-fg, var(--xh-fg-default));
22
49
  }
23
50
 
51
+ /* —— 尺寸 —— */
52
+ /* 缺省档写在上面的基础规则里 */
53
+ [data-scope='transfer'][data-part='root'][data-size='sm'] {
54
+ --xh-icon-size: var(--xh-transfer-icon-size, var(--xh-glyph-size-sm));
55
+ --xh-_transfer-item-py: var(--xh-list-option-py-sm);
56
+ --xh-_transfer-px: var(--xh-control-px-sm);
57
+ --xh-_transfer-gap: var(--xh-control-gap-sm);
58
+ --xh-_transfer-font-size: var(--xh-control-font-sm);
59
+ --xh-_transfer-box: var(--xh-control-indicator-sm);
60
+ }
61
+
62
+ [data-scope='transfer'][data-part='root'][data-size='lg'] {
63
+ --xh-icon-size: var(--xh-transfer-icon-size, var(--xh-glyph-size-lg));
64
+ --xh-_transfer-item-py: var(--xh-list-option-py-lg);
65
+ --xh-_transfer-px: var(--xh-control-px-lg);
66
+ --xh-_transfer-gap: var(--xh-control-gap-lg);
67
+ --xh-_transfer-font-size: var(--xh-control-font-lg);
68
+ --xh-_transfer-box: var(--xh-control-indicator-lg);
69
+ }
70
+
71
+ /* 校验失败:两侧面板换成错误描边,与其余表单控件同一套表达 */
72
+ [data-scope='transfer'][data-part='root'][data-invalid]
73
+ :is([data-scope='transfer'][data-part='source-panel'], [data-scope='transfer'][data-part='target-panel']) {
74
+ border-color: var(--xh-transfer-panel-border-invalid, var(--xh-border-invalid));
75
+ }
76
+
77
+ /* 只读勾不动也搬不动,但不是禁用:颜色照常,只把"可点"这个暗示收回来。
78
+ 排掉禁用项是因为这条选择器权重高过条目那条,不排就会把禁用的手势指示覆盖回 default */
79
+ [data-scope='transfer'][data-part='root'][data-readonly]
80
+ [data-scope='transfer'][data-part='item']:not([data-disabled]) {
81
+ cursor: default;
82
+ }
83
+
84
+ /* 窄档:源面板在上、目标面板在下,各自跨满三栏 */
24
85
  [data-scope='transfer'][data-part='source-panel'] {
25
- grid-row: 1 / 3;
26
- grid-column: 1;
86
+ grid-row: 1;
87
+ grid-column: 1 / 4;
27
88
  }
28
89
 
29
90
  [data-scope='transfer'][data-part='target-panel'] {
30
- grid-row: 1 / 3;
31
- grid-column: 3;
91
+ grid-row: 3;
92
+ grid-column: 1 / 4;
32
93
  }
33
94
 
34
- /* 上格贴底、下格贴顶:两个按钮因此夹着中线成对出现,而不是各自漂在半栏中央 */
95
+ /* 两钮同占中间一行,各跨到中栏为止,一个贴行尾侧、一个贴行首侧,
96
+ 因此夹着中线成对出现,而不是各自漂在半行中央 */
35
97
  [data-scope='transfer'][data-part='to-target-trigger'] {
36
- grid-row: 1;
37
- grid-column: 2;
38
- align-self: end;
98
+ grid-row: 2;
99
+ grid-column: 1 / 3;
100
+ justify-self: end;
39
101
  }
40
102
 
41
103
  [data-scope='transfer'][data-part='to-source-trigger'] {
42
104
  grid-row: 2;
43
- grid-column: 2;
44
- align-self: start;
105
+ grid-column: 2 / 4;
106
+ justify-self: start;
45
107
  }
46
108
 
47
109
  [data-scope='transfer'][data-part='source-panel'],
@@ -62,12 +124,13 @@
62
124
  background: var(--xh-transfer-panel-bg-disabled, var(--xh-bg-muted));
63
125
  }
64
126
 
127
+ /* 面板内三个角色的槽都带 panel- 段,与部件名逐字对上 */
65
128
  [data-scope='transfer'][data-part='panel-header'] {
66
129
  display: flex;
67
- gap: var(--xh-transfer-header-gap, var(--xh-control-gap-md));
130
+ gap: var(--xh-transfer-panel-header-gap, var(--xh-_transfer-gap));
68
131
  align-items: center;
69
- padding-block: var(--xh-transfer-header-py, var(--xh-space-2));
70
- padding-inline: var(--xh-transfer-header-px, var(--xh-control-px-md));
132
+ padding-block: var(--xh-transfer-panel-header-py, var(--xh-space-2));
133
+ padding-inline: var(--xh-transfer-panel-header-px, var(--xh-_transfer-px));
71
134
  border-block-end: var(--xh-stroke-thin) solid var(--xh-transfer-panel-border, var(--xh-border-default));
72
135
  }
73
136
 
@@ -76,9 +139,10 @@
76
139
  flex: 1;
77
140
  min-inline-size: 0;
78
141
  overflow: hidden;
79
- color: var(--xh-transfer-title-fg, var(--xh-fg-default));
80
- font-size: var(--xh-transfer-title-font-size, var(--xh-text-label-size));
81
- font-weight: var(--xh-transfer-title-font-weight, var(--xh-text-label-weight));
142
+ color: var(--xh-transfer-panel-title-fg, var(--xh-fg-default));
143
+ /* 面板标头是 Surface 内的标题:14 / 600(§6.4) */
144
+ font-size: var(--xh-transfer-panel-title-font-size, var(--xh-text-label-size));
145
+ font-weight: var(--xh-transfer-panel-title-font-weight, var(--xh-font-weight-semibold));
82
146
  line-height: var(--xh-leading-none);
83
147
  white-space: nowrap;
84
148
  text-overflow: ellipsis;
@@ -86,8 +150,8 @@
86
150
 
87
151
  [data-scope='transfer'][data-part='panel-count'] {
88
152
  flex: none;
89
- color: var(--xh-transfer-count-fg, var(--xh-fg-subtle));
90
- font-size: var(--xh-transfer-count-font-size, var(--xh-text-caption-size));
153
+ color: var(--xh-transfer-panel-count-fg, var(--xh-fg-subtle));
154
+ font-size: var(--xh-transfer-panel-count-font-size, var(--xh-text-caption-size));
91
155
  line-height: var(--xh-leading-none);
92
156
  font-variant-numeric: tabular-nums;
93
157
  }
@@ -103,24 +167,18 @@
103
167
  display: block;
104
168
  inline-size: 100%;
105
169
  block-size: var(--xh-transfer-search-h, var(--xh-control-h-sm));
106
- padding-inline: var(--xh-transfer-search-px, var(--xh-control-px-md));
170
+ padding-inline: var(--xh-transfer-search-px, var(--xh-_transfer-px));
107
171
  border: 0;
108
172
  border-block-end: var(--xh-stroke-thin) solid var(--xh-transfer-search-border, var(--xh-border-control));
109
173
  background: var(--xh-transfer-search-bg, transparent);
110
174
  color: var(--xh-transfer-search-fg, var(--xh-fg-default));
111
175
  font: inherit;
112
- font-size: var(--xh-transfer-search-font-size, var(--xh-text-body-size));
113
- }
114
-
115
- [data-scope='transfer'][data-part='search']:focus-visible {
116
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
117
- outline-offset: calc(var(--xh-ring-offset) * -1);
176
+ font-size: var(--xh-transfer-search-font-size, var(--xh-_transfer-font-size));
118
177
  }
119
178
 
120
179
  /* 单体控件的禁用是原生 disabled,样式只能写 :disabled;集合条目才读 data-disabled */
121
180
  [data-scope='transfer'][data-part='search']:disabled {
122
181
  color: var(--xh-fg-disabled);
123
- cursor: not-allowed;
124
182
  }
125
183
 
126
184
  /* 两侧列表定高:高度只由这个槽给,与条目数无关。左右两块因此恒等高,
@@ -142,42 +200,136 @@
142
200
  outline: none;
143
201
  }
144
202
 
203
+ /* 空态占位:待在面板里、list 的兄弟(列表框只许拥有 option 与 group)。
204
+ 盒归面板,这里只画一句居中的次要文字 */
205
+ [data-scope='transfer'][data-part='empty'] {
206
+ display: block;
207
+ flex: none;
208
+ padding-block: var(--xh-transfer-empty-py, var(--xh-space-3));
209
+ padding-inline: var(--xh-transfer-empty-px, var(--xh-_transfer-px));
210
+ color: var(--xh-transfer-empty-fg, var(--xh-fg-subtle));
211
+ font-size: var(--xh-transfer-empty-font-size, var(--xh-_transfer-font-size));
212
+ line-height: var(--xh-leading-none);
213
+ text-align: center;
214
+ }
215
+
216
+ /* 上面给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
217
+ [data-scope='transfer'][data-part='empty'][hidden] {
218
+ display: none;
219
+ }
220
+
221
+ [data-scope='transfer'][data-part='empty'][data-disabled] {
222
+ color: var(--xh-fg-disabled);
223
+ }
224
+
225
+ /* 在途占位:与空态占位同一个位置、同一副观感,两者不同屏 */
226
+ [data-scope='transfer'][data-part='loading'] {
227
+ display: block;
228
+ flex: none;
229
+ padding-block: var(--xh-transfer-loading-py, var(--xh-space-3));
230
+ padding-inline: var(--xh-transfer-loading-px, var(--xh-_transfer-px));
231
+ color: var(--xh-transfer-loading-fg, var(--xh-fg-subtle));
232
+ font-size: var(--xh-transfer-loading-font-size, var(--xh-_transfer-font-size));
233
+ line-height: var(--xh-leading-none);
234
+ text-align: center;
235
+ }
236
+
237
+ [data-scope='transfer'][data-part='loading'][hidden] {
238
+ display: none;
239
+ }
240
+
241
+ [data-scope='transfer'][data-part='loading'][data-disabled] {
242
+ color: var(--xh-fg-disabled);
243
+ }
244
+
245
+ [data-scope='transfer'][data-part='group'] {
246
+ display: flex;
247
+ flex: none;
248
+ flex-direction: column;
249
+ gap: var(--xh-transfer-group-gap, var(--xh-list-option-gap));
250
+ }
251
+
252
+ [data-scope='transfer'][data-part='group'][hidden] {
253
+ display: none;
254
+ }
255
+
256
+ /* 组内条目搬到对面、或被搜索筛掉时都只是打 hidden,一条不剩的分组连标题一起撤下,
257
+ 免得列表里留着一排够不着的标题 */
258
+ [data-scope='transfer'][data-part='group']:not(:has([data-part='item']:not([hidden]))) {
259
+ display: none;
260
+ }
261
+
262
+ /* 组间留白只加在后继分组上:首组顶上已经有 list 的内边距,再加一层会显得头重 */
263
+ [data-scope='transfer'][data-part='group'] + [data-scope='transfer'][data-part='group'] {
264
+ margin-block-start: var(--xh-transfer-group-spacing, var(--xh-space-1_5));
265
+ }
266
+
267
+ /* 分组标题不是选项、进不了导航,画成小号次要文字,
268
+ 内缩与条目对齐(同一个 padding-inline),标题与条目文字才在一条竖线上 */
269
+ [data-scope='transfer'][data-part='group-label'] {
270
+ display: block;
271
+ padding-block: var(--xh-transfer-group-label-py, var(--xh-space-1));
272
+ padding-inline: var(--xh-transfer-group-label-px, var(--xh-_transfer-px));
273
+ color: var(--xh-transfer-group-label-fg, var(--xh-fg-subtle));
274
+ font-size: var(--xh-transfer-group-label-font-size, var(--xh-text-caption-size));
275
+ font-weight: var(--xh-transfer-group-label-font-weight, var(--xh-font-weight-medium));
276
+ line-height: var(--xh-leading-none);
277
+ user-select: none;
278
+ }
279
+
280
+ [data-scope='transfer'][data-part='group-label'][hidden] {
281
+ display: none;
282
+ }
283
+
284
+ [data-scope='transfer'][data-part='group-label'][data-disabled] {
285
+ color: var(--xh-fg-disabled);
286
+ }
287
+
288
+ /* 条目走 Collection Item 的 page 语境(页内持久集合,§7.3):悬停 / 高亮 / 按下面(白底承载 hover 100 →
289
+ pressed 200)与勾选行的选中面(品牌淡底 + 淡底前景,selected+hover 20% / +pressed 28%)都由家族按
290
+ aria-selected / aria-disabled 给出,标记由行首的勾选方框承担;禁用面(字色降级、not-allowed、不换面)
291
+ 也归家族。这里只把公开槽映射到桥接槽。
292
+ 布局保持 flex 而不用家族网格:间距统一由行的 gap 给,家族按槽下发的外边距(--xh-collection-gap)归零 */
145
293
  [data-scope='transfer'][data-part='item'] {
294
+ --xh-collection-block-padding: var(--xh-transfer-item-py, var(--xh-_transfer-item-py));
295
+ --xh-collection-inline-padding: var(--xh-transfer-item-px, var(--xh-_transfer-px));
296
+ --xh-collection-gap: 0;
297
+ --xh-collection-font-size: var(--xh-transfer-item-font-size, var(--xh-_transfer-font-size));
298
+ --xh-collection-radius: var(--xh-transfer-item-radius, var(--xh-shape-control));
299
+ /* 作者的图标尺槽经桥接槽下发到条目,家族缺省按 data-xh-collection-size 取档 */
300
+ --xh-collection-glyph-size: var(--xh-transfer-icon-size, var(--xh-_collection-glyph-size));
301
+ --xh-collection-fg-rest: var(--xh-transfer-item-fg, var(--xh-fg-default));
302
+ --xh-collection-fg-hover: var(--xh-transfer-item-fg, var(--xh-fg-default));
303
+ --xh-collection-fg-keyboard-highlight: var(--xh-transfer-item-fg, var(--xh-fg-default));
304
+ --xh-collection-fg-pressed: var(--xh-transfer-item-fg, var(--xh-fg-default));
305
+ --xh-collection-fg-selected: var(--xh-transfer-item-fg-selected, var(--xh-fg-on-brand-subtle));
306
+ --xh-collection-fg-selected-hover: var(--xh-transfer-item-fg-selected, var(--xh-fg-on-brand-subtle));
307
+ --xh-collection-fg-selected-highlight: var(--xh-transfer-item-fg-selected, var(--xh-fg-on-brand-subtle));
308
+ --xh-collection-fg-selected-pressed: var(--xh-transfer-item-fg-selected, var(--xh-fg-on-brand-subtle));
309
+ --xh-collection-bg-hover: var(--xh-transfer-item-bg-hover, var(--xh-bg-subtle));
310
+ --xh-collection-bg-keyboard-highlight: var(--xh-transfer-item-bg-hover, var(--xh-bg-subtle));
311
+ --xh-collection-bg-pressed: var(--xh-transfer-item-bg-pressed, var(--xh-bg-subtle-hover));
312
+ --xh-collection-bg-selected: var(--xh-transfer-item-bg-selected, var(--xh-bg-brand-subtle));
313
+ /* data-highlighted 跟的是连接层记的焦点条目(指针点选也会落焦):只换面,焦点环在 :focus-visible 下再接回 */
314
+ --xh-collection-outline-keyboard-highlight: transparent;
315
+ --xh-collection-outline-selected-highlight: transparent;
316
+
146
317
  display: flex;
147
318
  flex: none;
148
- gap: var(--xh-transfer-item-gap, var(--xh-control-gap-md));
319
+ gap: var(--xh-transfer-item-gap, var(--xh-_transfer-gap));
149
320
  align-items: center;
150
- padding-block: var(--xh-transfer-item-py, var(--xh-space-1_5));
151
- padding-inline: var(--xh-transfer-item-px, var(--xh-control-px-md));
152
- border-radius: var(--xh-transfer-item-radius, var(--xh-shape-control));
153
- color: var(--xh-transfer-item-fg, var(--xh-fg-default));
154
- font-size: var(--xh-transfer-item-font-size, var(--xh-text-body-size));
155
321
  /* 行高留出文字的上下伸展空间,行内那层 overflow:hidden 才不会把字削掉 */
156
322
  line-height: var(--xh-transfer-item-leading, var(--xh-leading-normal));
157
323
  white-space: nowrap;
158
- cursor: pointer;
159
324
  user-select: none;
160
- transition:
161
- background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
162
- color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
163
325
  }
164
326
 
165
- /* 悬停与键盘锚点共用中性灰轻档:条目本身承载焦点,不另画描边。
166
- data-highlighted 跟的是连接层记的焦点条目,与勾选互相独立 */
167
- [data-scope='transfer'][data-part='item']:not([data-disabled]):is(:hover, [data-highlighted]) {
168
- background: var(--xh-transfer-item-bg-hover, var(--xh-bg-subtle));
169
- }
170
-
171
- [data-scope='transfer'][data-part='item']:focus-visible {
172
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
173
- outline-offset: calc(var(--xh-ring-offset) * -1);
174
- }
327
+ /* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
328
+ [data-scope='transfer'][data-part='item']:focus-visible:not(:hover) {
329
+ --xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
330
+ --xh-collection-outline-selected-highlight: var(--xh-ring-focus);
175
331
 
176
- /* 禁用走 aria-disabled 而非原生 disabled:条目仍要可聚焦(它还得当方向键的起点),
177
- 所以样式只能读 data-disabled,写 :disabled 永远不命中 */
178
- [data-scope='transfer'][data-part='item'][data-disabled] {
179
- color: var(--xh-fg-disabled);
180
- cursor: not-allowed;
332
+ transition: none;
181
333
  }
182
334
 
183
335
  [data-scope='transfer'][data-part='item-text'] {
@@ -192,17 +344,20 @@
192
344
  两个方框就此走形。全选格没有对应的角色节点(它自己就是按钮),由伪元素补出来 */
193
345
  [data-scope='transfer'][data-part='item-checkbox'],
194
346
  [data-scope='transfer'][data-part='select-all-trigger']::before {
347
+ /* 方框里的勾按边长的比例取尺(与 Checkbox 同一比例),不吃家族按档下发的行内字形尺 */
348
+ --xh-icon-size: calc(var(--xh-transfer-checkbox-size, var(--xh-_transfer-box)) * 0.75);
349
+
195
350
  display: inline-flex;
196
351
  flex: none;
197
352
  align-items: center;
198
353
  justify-content: center;
199
- inline-size: var(--xh-transfer-checkbox-size, var(--xh-control-indicator-size));
200
- block-size: var(--xh-transfer-checkbox-size, var(--xh-control-indicator-size));
354
+ inline-size: var(--xh-transfer-checkbox-size, var(--xh-_transfer-box));
355
+ block-size: var(--xh-transfer-checkbox-size, var(--xh-_transfer-box));
201
356
  border: var(--xh-stroke-thin) solid var(--xh-transfer-checkbox-border, var(--xh-border-control));
202
357
  border-radius: var(--xh-transfer-checkbox-radius, var(--xh-shape-inset));
203
- background: var(--xh-transfer-checkbox-bg, var(--xh-bg-canvas));
204
- color: var(--xh-transfer-checkbox-fg, var(--xh-fg-on-brand));
205
- font-size: var(--xh-transfer-checkbox-font-size, calc(var(--xh-control-indicator-size) * 0.75));
358
+ background: var(--xh-transfer-checkbox-bg, transparent);
359
+ color: var(--xh-transfer-checkbox-fg, var(--xh-_transfer-on-accent));
360
+ font-size: var(--xh-transfer-checkbox-font-size, calc(var(--xh-_transfer-box) * 0.75));
206
361
  line-height: var(--xh-leading-none);
207
362
  transition:
208
363
  background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
@@ -218,8 +373,14 @@
218
373
  /* 勾中即填色。全选格三态里 all 与 some 都算"有值",与条目共用同一副填色 */
219
374
  [data-scope='transfer'][data-part='item-checkbox'][data-state='checked'],
220
375
  [data-scope='transfer'][data-part='select-all-trigger']:is([data-state='checked'], [data-state='indeterminate'])::before {
221
- border-color: var(--xh-transfer-checkbox-border-checked, var(--xh-bg-brand));
222
- background: var(--xh-transfer-checkbox-bg-checked, var(--xh-bg-brand));
376
+ border-color: var(--xh-transfer-checkbox-border-checked, var(--xh-_transfer-accent));
377
+ background: var(--xh-transfer-checkbox-bg-checked, var(--xh-_transfer-accent));
378
+ }
379
+
380
+ /* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
381
+ 那一族色本来就要在这块面上把字读清楚,与面的对比是按可读性定的 */
382
+ [data-scope='transfer'][data-part='item-checkbox'][data-state='checked']:focus-visible {
383
+ --xh-_ring-color: currentColor;
223
384
  }
224
385
 
225
386
  /* 没写内容就由皮肤画勾;作者往格子里塞了自己的图形,这条规则即不命中。
@@ -252,13 +413,13 @@
252
413
  inset-inline-start: 0;
253
414
  margin-block: auto;
254
415
  margin-inline-start: calc(
255
- (var(--xh-transfer-checkbox-size, var(--xh-control-indicator-size)) - var(--xh-icon-size, var(--xh-glyph-size-text))) /
416
+ (var(--xh-transfer-checkbox-size, var(--xh-_transfer-box)) - var(--xh-icon-size, var(--xh-glyph-size-text))) /
256
417
  2
257
418
  );
258
419
  inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
259
420
  block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
260
- background-color: var(--xh-transfer-checkbox-fg, var(--xh-fg-on-brand));
261
- font-size: var(--xh-transfer-checkbox-font-size, calc(var(--xh-control-indicator-size) * 0.75));
421
+ background-color: var(--xh-transfer-checkbox-fg, var(--xh-_transfer-on-accent));
422
+ font-size: var(--xh-transfer-checkbox-font-size, calc(var(--xh-_transfer-box) * 0.75));
262
423
  -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
263
424
  mask: var(--xh-glyph-mark-check) center / contain no-repeat;
264
425
  }
@@ -270,93 +431,84 @@
270
431
  inset-inline-start: 0;
271
432
  margin-block: auto;
272
433
  margin-inline-start: calc(
273
- (var(--xh-transfer-checkbox-size, var(--xh-control-indicator-size)) - var(--xh-icon-size, var(--xh-glyph-size-text))) /
434
+ (var(--xh-transfer-checkbox-size, var(--xh-_transfer-box)) - var(--xh-icon-size, var(--xh-glyph-size-text))) /
274
435
  2
275
436
  );
276
437
  inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
277
438
  block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
278
- background-color: var(--xh-transfer-checkbox-fg, var(--xh-fg-on-brand));
279
- font-size: var(--xh-transfer-checkbox-font-size, calc(var(--xh-control-indicator-size) * 0.75));
439
+ background-color: var(--xh-transfer-checkbox-fg, var(--xh-_transfer-on-accent));
440
+ font-size: var(--xh-transfer-checkbox-font-size, calc(var(--xh-_transfer-box) * 0.75));
280
441
  -webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
281
442
  mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
282
443
  }
283
444
 
284
445
  [data-scope='transfer'][data-part='item-checkbox'][data-disabled] {
285
- border-color: var(--xh-transfer-checkbox-border-disabled, var(--xh-border-subtle));
446
+ border-color: var(--xh-transfer-checkbox-border-disabled, var(--xh-border-default));
286
447
  background: var(--xh-transfer-checkbox-bg-disabled, var(--xh-bg-muted));
287
448
  }
288
449
 
289
- /* 全选格是原生按钮(三态经 aria-checked 上报,激活由平台负责),
290
- 禁用因此写 :disabled,不写 data-disabled */
291
- /* position 是给叠在方框上的那颗字形 ::after 当定位基准 */
450
+ /* 全选格是原生按钮(三态经 aria-checked 上报,激活由平台负责),禁用同时打原生 disabled 与 data-disabled。
451
+ 它是「方框 + 文案」的整行命中区(§9.2):接 Action Control text 档、ghost 形态,悬停 / 按下 / 禁用面与过渡由家族给
452
+ (白底承载 hover 100 pressed 200),按下只换面不缩放(--xh-action-scale-pressed: none),勾选回执落在方框上;
453
+ 盒随内容收宽、高度取 xs 档的 24px 命中地板(方框 16px 居中其间),text 档的内距与最小宽度归零。
454
+ position 是给叠在方框上的那颗字形 ::after 当定位基准 */
292
455
  [data-scope='transfer'][data-part='select-all-trigger'] {
293
- position: relative;
294
- display: inline-flex;
456
+ /* 叠在方框上的那颗字形 ::after 与方框里的勾同一把尺 */
457
+ --xh-icon-size: calc(var(--xh-transfer-checkbox-size, var(--xh-_transfer-box)) * 0.75);
458
+
459
+ --xh-action-min-inline-size: 0;
460
+ --xh-action-padding-inline: 0;
461
+ --xh-action-gap: var(--xh-transfer-select-all-gap, var(--xh-control-gap-sm));
462
+ /* 全选格是嵌在面板头里的勾选小块:inset 档圆角(身份表登记) */
463
+ --xh-action-radius: var(--xh-transfer-select-all-radius, var(--xh-shape-inset));
464
+ --xh-action-bg-hover: var(--xh-transfer-select-all-bg-hover, var(--xh-_action-variant-bg-hover));
465
+ --xh-action-bg-pressed: var(--xh-transfer-select-all-bg-pressed, var(--xh-_action-variant-bg-pressed));
466
+ --xh-action-fg-rest: var(--xh-transfer-select-all-fg, var(--xh-fg-muted));
467
+ --xh-action-fg-hover: var(--xh-transfer-select-all-fg, var(--xh-fg-muted));
468
+ --xh-action-fg-pressed: var(--xh-transfer-select-all-fg, var(--xh-fg-muted));
469
+ --xh-action-fg-focus-visible: var(--xh-transfer-select-all-fg, var(--xh-fg-muted));
470
+ --xh-action-font-size: var(--xh-transfer-select-all-font-size, var(--xh-text-caption-size));
471
+ --xh-action-scale-pressed: none;
472
+
295
473
  flex: none;
296
- gap: var(--xh-transfer-select-all-gap, var(--xh-control-gap-sm));
297
- align-items: center;
474
+ justify-content: start;
298
475
  padding: 0;
299
- border: 0;
300
- border-radius: var(--xh-transfer-select-all-radius, var(--xh-shape-control));
301
- background: none;
302
- color: var(--xh-transfer-select-all-fg, var(--xh-fg-muted));
303
- font-size: var(--xh-transfer-select-all-font-size, var(--xh-text-caption-size));
304
476
  font-weight: var(--xh-font-weight-medium);
305
- line-height: var(--xh-leading-none);
306
- cursor: pointer;
307
- }
308
-
309
- /* 往内收,与搜索框、条目同一口径:全选格长在面板里,面板收 overflow,
310
- 环画在外沿会被裁掉 */
311
- [data-scope='transfer'][data-part='select-all-trigger']:focus-visible {
312
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
313
- outline-offset: calc(-1 * var(--xh-ring-width));
314
477
  }
315
478
 
316
- [data-scope='transfer'][data-part='select-all-trigger']:disabled {
317
- color: var(--xh-fg-disabled);
318
- cursor: not-allowed;
479
+ /* 家族 text 档在粗指针下用 ::after 扩热区,勾中 / 半选时这里的 ::after 是叠在方框上的字形:钉回原位、下限归零 */
480
+ @media (pointer: coarse) {
481
+ [data-scope='transfer'][data-part='select-all-trigger']:is([data-state='checked'], [data-state='indeterminate'])::after {
482
+ min-block-size: 0;
483
+ translate: none;
484
+ }
319
485
  }
320
486
 
487
+ /* 两颗搬运钮是只有字形的离散动作钮:接 Action Control 的 icon 档、outline 形态(中性描边、透明底,
488
+ 白底承载 hover 100 → pressed 200,按下 0.97 并同时换底),盒、焦点环、粗指针热区与禁用面由家族给;
489
+ 此前的 raised 悬停抬升退役(§8.3 边界只由描边承担)。这里只把使用者槽映射到桥接槽;
490
+ 钮是正方盒,按 sm 档取一个控件高 */
321
491
  [data-scope='transfer'][data-part='to-target-trigger'],
322
492
  [data-scope='transfer'][data-part='to-source-trigger'] {
323
- display: inline-flex;
324
- align-items: center;
325
- justify-content: center;
326
- min-inline-size: var(--xh-transfer-trigger-size, var(--xh-control-h-sm));
327
- block-size: var(--xh-transfer-trigger-size, var(--xh-control-h-sm));
328
- padding-inline: var(--xh-transfer-trigger-px, var(--xh-space-2));
329
- border: var(--xh-stroke-thin) solid var(--xh-transfer-trigger-border, var(--xh-border-default));
330
- border-radius: var(--xh-transfer-trigger-radius, var(--xh-shape-control));
331
- background: var(--xh-transfer-trigger-bg, var(--xh-bg-subtle));
332
- color: var(--xh-transfer-trigger-fg, var(--xh-fg-default));
333
- font-size: var(--xh-transfer-trigger-font-size, var(--xh-text-label-size));
334
- line-height: var(--xh-leading-none);
335
- cursor: pointer;
336
- transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
337
- }
338
-
339
- [data-scope='transfer'][data-part='to-target-trigger']:hover:not(:disabled),
340
- [data-scope='transfer'][data-part='to-source-trigger']:hover:not(:disabled) {
341
- background: var(--xh-transfer-trigger-bg-hover, var(--xh-bg-subtle-hover));
342
- }
343
-
344
- [data-scope='transfer'][data-part='to-target-trigger']:active:not(:disabled),
345
- [data-scope='transfer'][data-part='to-source-trigger']:active:not(:disabled) {
346
- background: var(--xh-transfer-trigger-bg-active, var(--xh-bg-subtle-active));
347
- }
348
-
349
- [data-scope='transfer'][data-part='to-target-trigger']:focus-visible,
350
- [data-scope='transfer'][data-part='to-source-trigger']:focus-visible {
351
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
352
- outline-offset: var(--xh-ring-offset);
353
- }
354
-
355
- /* 搬运按钮是单体控件,禁用走原生 disabled */
356
- [data-scope='transfer'][data-part='to-target-trigger']:disabled,
357
- [data-scope='transfer'][data-part='to-source-trigger']:disabled {
358
- color: var(--xh-fg-disabled);
359
- cursor: not-allowed;
493
+ --xh-action-visual-size: var(--xh-transfer-trigger-size, var(--xh-_action-profile-visual-size));
494
+ --xh-action-min-inline-size: var(--xh-transfer-trigger-size, var(--xh-_action-profile-visual-size));
495
+ --xh-action-padding-inline: var(--xh-transfer-trigger-px, var(--xh-_action-profile-padding-inline));
496
+ --xh-action-radius: var(--xh-transfer-trigger-radius, var(--xh-shape-control));
497
+ --xh-action-border-rest: var(--xh-transfer-trigger-border, var(--xh-_action-variant-border-rest));
498
+ --xh-action-border-hover: var(--xh-transfer-trigger-border, var(--xh-_action-variant-border-hover));
499
+ --xh-action-border-pressed: var(--xh-transfer-trigger-border, var(--xh-_action-variant-border-pressed));
500
+ --xh-action-bg-rest: var(--xh-transfer-trigger-bg, var(--xh-_action-variant-bg-rest));
501
+ --xh-action-bg-hover: var(--xh-transfer-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
502
+ --xh-action-bg-pressed: var(--xh-transfer-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
503
+ --xh-action-fg-rest: var(--xh-transfer-trigger-fg, var(--xh-_action-variant-fg-rest));
504
+ --xh-action-fg-hover: var(--xh-transfer-trigger-fg, var(--xh-_action-variant-fg-hover));
505
+ --xh-action-fg-pressed: var(--xh-transfer-trigger-fg, var(--xh-_action-variant-fg-pressed));
506
+ --xh-action-shadow-hover: var(--xh-transfer-trigger-shadow-hover, none);
507
+ --xh-action-shadow-pressed: var(--xh-transfer-trigger-shadow-active, none);
508
+ --xh-action-font-size: var(--xh-transfer-trigger-font-size, var(--xh-text-label-size));
509
+ /* 作者塞进钮里的图标与皮肤画的兜底箭头同一把尺:按 icon 档取字形尺寸。
510
+ 配方尚未把 profile 字形档灌进 --xh-icon-size,钮内字形先按 icon 档逐钮取值 */
511
+ --xh-icon-size: var(--xh-transfer-icon-size, var(--xh-_action-profile-glyph-size));
360
512
  }
361
513
 
362
514
  /* 上面凡是给了 display 的角色节点都要补这条:display 声明会盖掉 UA 的 [hidden]{display:none},
@@ -377,7 +529,8 @@
377
529
  display: none;
378
530
  }
379
531
 
380
- /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
532
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中。
533
+ 堆叠时目标面板在下方,箭头因此朝下与朝上,指的是条目真正要去的方向 */
381
534
  [data-scope='transfer'][data-part='to-source-trigger']:empty::before {
382
535
  content: '';
383
536
  display: inline-block;
@@ -385,8 +538,8 @@
385
538
  block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
386
539
  vertical-align: var(--xh-glyph-baseline-shift);
387
540
  background-color: currentColor;
388
- -webkit-mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
389
- mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
541
+ -webkit-mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
542
+ mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
390
543
  }
391
544
 
392
545
  [data-scope='transfer'][data-part='to-target-trigger']:empty::before {
@@ -396,7 +549,67 @@
396
549
  block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
397
550
  vertical-align: var(--xh-glyph-baseline-shift);
398
551
  background-color: currentColor;
399
- -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
400
- mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
552
+ -webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
553
+ mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
554
+ }
555
+
556
+ /* 宽档:视口放得下两块面板,回到并排——两侧面板各占一栏、跨两行,
557
+ 中间那栏上下各放一个搬运按钮,上格贴底、下格贴顶,两钮夹着中线相遇 */
558
+ @media (min-width: 640px) {
559
+ [data-scope='transfer'][data-part='source-panel'] {
560
+ grid-row: 1 / 3;
561
+ grid-column: 1;
562
+ }
563
+
564
+ [data-scope='transfer'][data-part='target-panel'] {
565
+ grid-row: 1 / 3;
566
+ grid-column: 3;
567
+ }
568
+
569
+ [data-scope='transfer'][data-part='to-target-trigger'] {
570
+ grid-row: 1;
571
+ grid-column: 2;
572
+ align-self: end;
573
+ justify-self: stretch;
574
+ }
575
+
576
+ [data-scope='transfer'][data-part='to-source-trigger'] {
577
+ grid-row: 2;
578
+ grid-column: 2;
579
+ align-self: start;
580
+ justify-self: stretch;
581
+ }
582
+
583
+ /* 单向组合的唯一动作跨过两行,中心才与两侧面板的中心重合。 */
584
+ [data-scope='transfer'][data-part='root'][data-one-way]
585
+ > [data-scope='transfer'][data-part='to-target-trigger'] {
586
+ grid-row: 1 / 3;
587
+ align-self: center;
588
+ }
589
+
590
+ /* 并排时目标面板在行尾侧,箭头改回朝行尾与朝行首。
591
+ 盒的量法与窄档那两条逐字相同:兜底字形的盒必须按 --xh-icon-size 量,
592
+ 作者换成自己的图标才和皮肤画的一样大 */
593
+ [data-scope='transfer'][data-part='to-source-trigger']:empty::before {
594
+ content: '';
595
+ display: inline-block;
596
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
597
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
598
+ vertical-align: var(--xh-glyph-baseline-shift);
599
+ background-color: currentColor;
600
+ -webkit-mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
601
+ mask: var(--xh-glyph-mark-chevron-left) center / contain no-repeat;
602
+ }
603
+
604
+ [data-scope='transfer'][data-part='to-target-trigger']:empty::before {
605
+ content: '';
606
+ display: inline-block;
607
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
608
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
609
+ vertical-align: var(--xh-glyph-baseline-shift);
610
+ background-color: currentColor;
611
+ -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
612
+ mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
613
+ }
401
614
  }
402
615
  }