@xihan-ui/styles 1.0.0-alpha.1 → 1.0.0-alpha.3

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 (129) hide show
  1. package/CHANGELOG.md +527 -0
  2. package/README.md +1 -1
  3. package/css/accordion.css +61 -5
  4. package/css/affix.css +5 -0
  5. package/css/alert.css +35 -5
  6. package/css/anchor.css +12 -7
  7. package/css/avatar-group.css +8 -3
  8. package/css/avatar.css +8 -3
  9. package/css/back-top.css +21 -1
  10. package/css/badge.css +21 -2
  11. package/css/breadcrumb.css +29 -4
  12. package/css/button-group.css +19 -13
  13. package/css/button.css +57 -11
  14. package/css/calendar.css +124 -2
  15. package/css/card.css +10 -5
  16. package/css/carousel.css +41 -5
  17. package/css/cascader.css +188 -102
  18. package/css/checkbox-group.css +46 -19
  19. package/css/checkbox.css +59 -8
  20. package/css/clipboard.css +7 -1
  21. package/css/code-block.css +17 -7
  22. package/css/collapsible.css +47 -2
  23. package/css/color-picker.css +117 -46
  24. package/css/combobox.css +132 -52
  25. package/css/composer.css +10 -3
  26. package/css/context-menu.css +101 -75
  27. package/css/countdown.css +5 -0
  28. package/css/date-field.css +96 -14
  29. package/css/date-picker.css +281 -65
  30. package/css/descriptions.css +7 -2
  31. package/css/dialog.css +109 -22
  32. package/css/download-trigger.css +76 -0
  33. package/css/drawer.css +75 -23
  34. package/css/dynamic-input.css +73 -17
  35. package/css/editable.css +17 -10
  36. package/css/ellipsis.css +6 -1
  37. package/css/empty-state.css +12 -7
  38. package/css/field.css +14 -6
  39. package/css/fieldset.css +69 -0
  40. package/css/file-upload.css +50 -7
  41. package/css/flex.css +5 -0
  42. package/css/float-button.css +21 -1
  43. package/css/floating-panel.css +310 -0
  44. package/css/form.css +10 -5
  45. package/css/gradient-text.css +5 -0
  46. package/css/grid.css +5 -0
  47. package/css/heatmap.css +410 -0
  48. package/css/highlight.css +6 -1
  49. package/css/hotkeys.css +90 -0
  50. package/css/hover-card.css +58 -50
  51. package/css/icon-wrapper.css +5 -0
  52. package/css/icon.css +5 -0
  53. package/css/image-cropper.css +231 -0
  54. package/css/image-viewer.css +167 -22
  55. package/css/image.css +7 -2
  56. package/css/infinite-scroll.css +6 -1
  57. package/css/json-viewer.css +241 -0
  58. package/css/layout.css +11 -10
  59. package/css/list.css +13 -8
  60. package/css/listbox.css +25 -4
  61. package/css/loading-bar.css +12 -1
  62. package/css/log.css +6 -1
  63. package/css/marquee.css +14 -0
  64. package/css/masonry.css +63 -0
  65. package/css/mention.css +105 -32
  66. package/css/menu.css +131 -46
  67. package/css/menubar.css +150 -66
  68. package/css/navigation-menu.css +59 -29
  69. package/css/number-animation.css +8 -3
  70. package/css/number-field.css +178 -16
  71. package/css/overlay-arrow.css +51 -0
  72. package/css/page-header.css +10 -5
  73. package/css/pagination.css +18 -13
  74. package/css/password-input.css +356 -0
  75. package/css/pin-input.css +18 -10
  76. package/css/popconfirm.css +73 -16
  77. package/css/popover.css +88 -44
  78. package/css/popselect.css +201 -52
  79. package/css/progress.css +52 -7
  80. package/css/qr-code.css +6 -1
  81. package/css/radio-group.css +19 -8
  82. package/css/rating.css +7 -2
  83. package/css/reset.css +17 -0
  84. package/css/result.css +11 -6
  85. package/css/scroll-area.css +65 -94
  86. package/css/scrollbar.css +167 -0
  87. package/css/segmented.css +215 -0
  88. package/css/select.css +292 -124
  89. package/css/separator.css +7 -2
  90. package/css/side-nav.css +116 -19
  91. package/css/signature-pad.css +144 -0
  92. package/css/skeleton.css +12 -1
  93. package/css/slider.css +15 -10
  94. package/css/space.css +117 -0
  95. package/css/spinner.css +31 -11
  96. package/css/splitter.css +5 -0
  97. package/css/statistic.css +14 -9
  98. package/css/steps.css +30 -8
  99. package/css/switch.css +62 -13
  100. package/css/table.css +136 -37
  101. package/css/tabs.css +9 -4
  102. package/css/tag.css +177 -0
  103. package/css/tags-input.css +83 -40
  104. package/css/text-field.css +154 -36
  105. package/css/thread.css +6 -1
  106. package/css/time-field.css +102 -16
  107. package/css/time-picker.css +264 -69
  108. package/css/time.css +5 -0
  109. package/css/timeline.css +15 -10
  110. package/css/timer.css +119 -0
  111. package/css/toast.css +46 -21
  112. package/css/toaster.css +6 -1
  113. package/css/toggle-group.css +5 -0
  114. package/css/toggle.css +11 -6
  115. package/css/tone.css +10 -5
  116. package/css/toolbar.css +6 -1
  117. package/css/tooltip.css +54 -38
  118. package/css/tour.css +128 -63
  119. package/css/transfer.css +73 -17
  120. package/css/tree-select.css +203 -83
  121. package/css/tree.css +90 -1
  122. package/css/typography.css +9 -4
  123. package/css/undefined.css +11 -1
  124. package/css/virtualizer.css +8 -1
  125. package/css/watermark.css +6 -2
  126. package/index.css +17 -1
  127. package/index.unlayered.css +9394 -2883
  128. package/package.json +19 -4
  129. package/css/motion.css +0 -58
package/css/combobox.css CHANGED
@@ -1,13 +1,66 @@
1
+ @layer xihan.motion {
2
+ /* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
3
+ 动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
4
+ @keyframes xh-pop-in {
5
+ from {
6
+ opacity: 0;
7
+ scale: var(--xh-motion-scale-enter);
8
+ }
9
+
10
+ to {
11
+ opacity: 1;
12
+ scale: 1;
13
+ }
14
+ }
15
+ @keyframes xh-pop-out {
16
+ from {
17
+ opacity: 1;
18
+ scale: 1;
19
+ }
20
+
21
+ to {
22
+ opacity: 0;
23
+ scale: var(--xh-motion-scale-enter);
24
+ }
25
+ }
26
+ }
27
+
1
28
  @layer xihan.components {
2
- [data-scope='combobox'][data-part='root'] {
3
- /* 尺寸档只换这五个私有槽,输入行、标题与候选都从 root 继承它们,
4
- 换档不必给每个部件各写一条选择器。浮层在 positioner 里、也是 root 的后代,一并继承 */
29
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
30
+ [data-scope='combobox'] {
31
+ --xh-combobox-skin: 1;
32
+ }
33
+
34
+ /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
35
+ [data-scope='combobox'][data-part='positioner'] {
36
+ /* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
37
+ 引擎没算(尚未落位 / 无引擎)时不额外限高 */
38
+ --xh-_combobox-available-h: 100vh;
39
+
40
+ position: fixed;
41
+ z-index: var(--xh-combobox-layer, var(--xh-layer-popover));
42
+ /* 空壳不吃指针,交互只发生在 content 与 empty 上 */
43
+ pointer-events: none;
44
+ }
45
+
46
+ /* 锚点被滚出可视区:整个浮层随之收起 */
47
+ [data-scope='combobox'][data-part='positioner'][data-hidden] {
48
+ visibility: hidden;
49
+ }
50
+
51
+ /* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
52
+ [data-scope='combobox']:is([data-part='root'], [data-part='positioner']) {
53
+ /* 尺寸档只换这五个私有槽,输入行、标题与候选都从这两处继承它们,
54
+ 换档不必给每个部件各写一条选择器 */
5
55
  --xh-_combobox-h: var(--xh-control-h-md);
6
56
  --xh-_combobox-px: var(--xh-control-px-md);
7
57
  --xh-_combobox-gap: var(--xh-control-gap-md);
8
58
  --xh-_combobox-font-size: var(--xh-text-body-size);
9
59
  --xh-_combobox-label-font-size: var(--xh-text-label-size);
10
60
 
61
+ /* 作者塞进指示符槽的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准 */
62
+ --xh-icon-size: var(--xh-combobox-icon-size, var(--xh-glyph-size-md));
63
+
11
64
  /* 形态档只换这三个槽:缺省即 outline(描边 + 画布底) */
12
65
  --xh-_combobox-control-bg: var(--xh-bg-canvas);
13
66
  --xh-_combobox-control-border: var(--xh-border-control);
@@ -18,10 +71,12 @@
18
71
  --xh-_combobox-ring: var(--xh-ring-focus);
19
72
  --xh-_combobox-accent: var(--xh-_tone, var(--xh-bg-brand));
20
73
  --xh-_combobox-item-selected-fg: var(--xh-_tone-fg, var(--xh-fg-brand-strong));
74
+ }
21
75
 
76
+ [data-scope='combobox'][data-part='root'] {
22
77
  display: inline-flex;
23
78
  flex-direction: column;
24
- gap: var(--xh-combobox-gap, var(--xh-stack-gap-md));
79
+ gap: var(--xh-combobox-gap, var(--xh-space-1));
25
80
  }
26
81
 
27
82
  /* 只要声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
@@ -31,46 +86,51 @@
31
86
 
32
87
  /* —— 尺寸 —— */
33
88
  /* 缺省档写在上面的基础规则里 */
34
- [data-scope='combobox'][data-part='root'][data-size='sm'] {
89
+ [data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
35
90
  --xh-_combobox-h: var(--xh-control-h-sm);
36
91
  --xh-_combobox-px: var(--xh-control-px-sm);
37
92
  --xh-_combobox-gap: var(--xh-control-gap-sm);
38
- --xh-_combobox-font-size: var(--xh-font-size-sm);
39
- --xh-_combobox-label-font-size: var(--xh-font-size-sm);
93
+ --xh-_combobox-font-size: var(--xh-control-font-sm);
94
+ --xh-_combobox-label-font-size: var(--xh-control-font-sm);
95
+
96
+ --xh-icon-size: var(--xh-combobox-icon-size, var(--xh-glyph-size-sm));
40
97
  }
41
98
 
42
- [data-scope='combobox'][data-part='root'][data-size='lg'] {
99
+ [data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
43
100
  --xh-_combobox-h: var(--xh-control-h-lg);
44
101
  --xh-_combobox-px: var(--xh-control-px-lg);
45
102
  --xh-_combobox-gap: var(--xh-control-gap-lg);
46
- --xh-_combobox-font-size: var(--xh-font-size-lg);
47
- --xh-_combobox-label-font-size: var(--xh-font-size-lg);
103
+ --xh-_combobox-font-size: var(--xh-control-font-lg);
104
+ --xh-_combobox-label-font-size: var(--xh-control-font-lg);
105
+
106
+ --xh-icon-size: var(--xh-combobox-icon-size, var(--xh-glyph-size-lg));
48
107
  }
49
108
 
50
109
  /* —— 形态 —— */
51
110
  /* 输入类不做 solid:实心底压着可编辑的文字,读起来像块不可点的色板。
52
111
  形态只决定描边与底色怎么用,用哪族颜色由 data-tone 决定 */
53
- [data-scope='combobox'][data-part='root'][data-variant='outline'] {
112
+ [data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-variant='outline'] {
54
113
  --xh-_combobox-control-bg: var(--xh-bg-canvas);
55
114
  --xh-_combobox-control-border: var(--xh-border-control);
56
115
  --xh-_combobox-control-border-hover: var(--xh-border-control-hover);
57
116
  }
58
117
 
59
118
  /* 填充式:底色顶替描边,悬停时才浮出一道淡边 */
60
- [data-scope='combobox'][data-part='root'][data-variant='subtle'] {
119
+ [data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-variant='subtle'] {
61
120
  --xh-_combobox-control-bg: var(--xh-_tone-subtle, var(--xh-bg-subtle));
62
121
  --xh-_combobox-control-border: transparent;
63
122
  --xh-_combobox-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
64
123
  }
65
124
 
66
- [data-scope='combobox'][data-part='root'][data-variant='ghost'] {
125
+ /* 无框:底与常态描边透明,悬停与聚焦浮出描边 */
126
+ [data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-variant='ghost'] {
67
127
  --xh-_combobox-control-bg: transparent;
68
128
  --xh-_combobox-control-border: transparent;
69
129
  --xh-_combobox-control-border-hover: var(--xh-_tone-border, var(--xh-border-control-hover));
70
130
  }
71
131
 
72
132
  [data-scope='combobox'][data-part='label'] {
73
- color: var(--xh-combobox-label-fg, var(--xh-fg-muted));
133
+ color: var(--xh-combobox-label-fg, var(--xh-fg-default));
74
134
  font-size: var(--xh-combobox-label-font-size, var(--xh-_combobox-label-font-size));
75
135
  font-weight: var(--xh-combobox-label-font-weight, var(--xh-text-label-weight));
76
136
  line-height: var(--xh-leading-none);
@@ -86,7 +146,7 @@
86
146
  display: inline-flex;
87
147
  align-items: center;
88
148
  gap: var(--xh-combobox-control-gap, var(--xh-_combobox-gap));
89
- min-inline-size: var(--xh-combobox-control-min-w, var(--xh-overlay-min-w));
149
+ min-inline-size: var(--xh-combobox-control-min-w, var(--xh-control-min-w));
90
150
  block-size: var(--xh-combobox-control-h, var(--xh-_combobox-h));
91
151
  padding-inline: var(--xh-combobox-control-px, var(--xh-_combobox-px));
92
152
  border: var(--xh-stroke-thin) solid var(--xh-combobox-control-border, var(--xh-_combobox-control-border));
@@ -108,14 +168,17 @@
108
168
  /* 焦点环画在 control 上而不是 input 上:视觉上的「框」是 control,
109
169
  环若长在里面那个透明的 input 身上,就会缩在文字区里、与框错开一圈。
110
170
  input 是这里唯一可聚焦的常规节点,:focus-within 与它的 :focus-visible 等价 */
111
- [data-scope='combobox'][data-part='control']:focus-within {
112
- border-color: var(--xh-combobox-control-border-focus, var(--xh-_combobox-ring));
171
+ [data-scope='combobox'][data-part='control']:focus-within:not([data-disabled]) {
172
+ border-color: var(--xh-combobox-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
113
173
  outline: var(--xh-ring-width) solid var(--xh-_combobox-ring);
114
174
  outline-offset: var(--xh-ring-offset);
115
175
  }
116
176
 
117
177
  [data-scope='combobox'][data-part='control'][data-invalid] {
118
- border-color: var(--xh-combobox-control-border-invalid, var(--xh-color-danger-500));
178
+ border-color: var(--xh-combobox-control-border-invalid, var(--xh-border-invalid));
179
+
180
+ /* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
181
+ --xh-_combobox-ring: var(--xh-ring-invalid);
119
182
  }
120
183
 
121
184
  /* 只读仍可聚焦、可复制,所以不置灰,只把底色压下去表示"改不动" */
@@ -192,13 +255,14 @@
192
255
  background: var(--xh-combobox-action-bg, transparent);
193
256
  color: var(--xh-combobox-action-fg, var(--xh-fg-muted));
194
257
  font-family: inherit;
195
- font-size: var(--xh-combobox-action-font-size, var(--xh-font-size-sm));
258
+ font-size: var(--xh-combobox-action-font-size, var(--xh-text-secondary-size));
196
259
  line-height: var(--xh-leading-none);
197
260
  cursor: pointer;
198
261
  user-select: none;
199
- transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
262
+ transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter), scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
200
263
  }
201
264
 
265
+
202
266
  [data-scope='combobox'][data-part='trigger'][hidden],
203
267
  [data-scope='combobox'][data-part='clear-trigger'][hidden] {
204
268
  display: none;
@@ -213,12 +277,26 @@
213
277
 
214
278
  /* 没写内容就由皮肤画箭头;作者往部件里塞了自己的图形,这条规则即不命中 */
215
279
  [data-scope='combobox'][data-part='trigger']:empty::before {
216
- content: '▾';
280
+ content: '';
281
+ display: inline-block;
282
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
283
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
284
+ vertical-align: var(--xh-glyph-baseline-shift);
285
+ background-color: currentColor;
286
+ -webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
287
+ mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
217
288
  }
218
289
 
219
290
  /* 同上:没写内容就由皮肤画叉 */
220
291
  [data-scope='combobox'][data-part='clear-trigger']:empty::before {
221
- content: '✕';
292
+ content: '';
293
+ display: inline-block;
294
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
295
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
296
+ vertical-align: var(--xh-glyph-baseline-shift);
297
+ background-color: currentColor;
298
+ -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
299
+ mask: var(--xh-glyph-mark-close) center / contain no-repeat;
222
300
  }
223
301
 
224
302
  [data-scope='combobox'][data-part='trigger'][data-state='open']:empty::before,
@@ -235,57 +313,43 @@
235
313
  [data-scope='combobox'][data-part='trigger']:active:not(:disabled),
236
314
  [data-scope='combobox'][data-part='clear-trigger']:active:not(:disabled) {
237
315
  background: var(--xh-combobox-action-bg-active, var(--xh-bg-subtle-active));
316
+ scale: var(--xh-motion-scale-press);
238
317
  }
239
318
 
240
- /* 两个按钮都退出了 Tab 序列(tabindex=-1),正常操作走不到这里;
241
- 留着是给程序化聚焦兜底,落焦时得看得见 */
319
+ /* 两个按钮都在盒里,盒的 :focus-within 已经画了一圈;这里再画一圈就是框里套框 */
242
320
  [data-scope='combobox'][data-part='trigger']:focus-visible,
243
321
  [data-scope='combobox'][data-part='clear-trigger']:focus-visible {
244
- outline: var(--xh-ring-width) solid var(--xh-_combobox-ring);
245
- outline-offset: var(--xh-ring-offset);
322
+ outline: none;
246
323
  }
247
324
 
248
- [data-scope='combobox'][data-part='trigger']:disabled,
249
- [data-scope='combobox'][data-part='clear-trigger']:disabled {
325
+ [data-scope='combobox'][data-part='trigger']:disabled {
250
326
  background: var(--xh-combobox-action-bg, transparent);
251
327
  color: var(--xh-fg-disabled);
252
328
  cursor: not-allowed;
253
329
  }
254
330
 
255
- /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
256
- [data-scope='combobox'][data-part='positioner'] {
257
- position: fixed;
258
- z-index: var(--xh-layer-popover);
259
- /* 空壳不吃指针,交互只发生在 content 与 empty 上 */
260
- pointer-events: none;
261
- }
262
-
263
- /* 锚点被滚出可视区:整个浮层随之收起 */
264
- [data-scope='combobox'][data-part='positioner'][data-hidden] {
265
- visibility: hidden;
266
- }
267
-
268
331
  [data-scope='combobox'][data-part='content'] {
269
332
  display: flex;
270
333
  flex-direction: column;
271
334
  min-inline-size: var(--xh-combobox-content-min-w, var(--xh-overlay-min-w));
272
- max-inline-size: var(--xh-combobox-content-max-w, 24rem);
273
- max-block-size: var(--xh-combobox-content-max-h, var(--xh-overlay-max-h));
335
+ max-inline-size: var(--xh-combobox-content-max-w, var(--xh-overlay-max-w));
336
+ max-block-size: min(var(--xh-combobox-content-max-h, var(--xh-overlay-max-h)), var(--xh-_combobox-available-h));
274
337
  padding-block: var(--xh-combobox-content-py, var(--xh-space-1));
275
338
  padding-inline: var(--xh-combobox-content-px, var(--xh-space-1));
276
339
  border: var(--xh-stroke-thin) solid var(--xh-combobox-content-border, var(--xh-border-default));
277
340
  border-radius: var(--xh-combobox-content-radius, var(--xh-shape-surface));
278
341
  background: var(--xh-combobox-content-bg, var(--xh-bg-surface));
279
342
  color: var(--xh-combobox-content-fg, var(--xh-fg-default));
280
- box-shadow: var(--xh-combobox-content-shadow, var(--xh-elevation-2));
343
+ box-shadow: var(--xh-combobox-content-shadow, var(--xh-elevation-floating));
281
344
  overflow-y: auto;
282
345
  pointer-events: auto;
283
346
  }
284
347
 
285
- /* display 会盖掉 hidden 属性的 UA 规则,收起态显式让位 */
286
- [data-scope='combobox'][data-part='content'][hidden] {
287
- display: none;
288
- }
348
+ /* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
349
+ 收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
350
+ [hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
351
+ 真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
352
+ 其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
289
353
 
290
354
  /* 列表从不承载焦点(焦点恒在输入框,高亮走 aria-activedescendant),
291
355
  可滚动容器在某些浏览器里会被自动塞进 Tab 序列,落焦时不画环 */
@@ -294,7 +358,13 @@
294
358
  }
295
359
 
296
360
  [data-scope='combobox'][data-part='content'][data-state='open'] {
297
- animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
361
+ animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
362
+ }
363
+
364
+ /* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
365
+ 免得动画结束到真收起之间闪一下原样 */
366
+ [data-scope='combobox'][data-part='content'][data-state='closed'] {
367
+ animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
298
368
  }
299
369
 
300
370
  [data-scope='combobox'][data-part='item-group'] {
@@ -317,7 +387,7 @@
317
387
  padding-block: var(--xh-combobox-group-label-py, var(--xh-space-1));
318
388
  padding-inline: var(--xh-combobox-group-label-px, var(--xh-control-px-md));
319
389
  color: var(--xh-combobox-group-label-fg, var(--xh-fg-subtle));
320
- font-size: var(--xh-combobox-group-label-font-size, var(--xh-font-size-xs));
390
+ font-size: var(--xh-combobox-group-label-font-size, var(--xh-text-caption-size));
321
391
  font-weight: var(--xh-combobox-group-label-font-weight, var(--xh-font-weight-medium));
322
392
  line-height: var(--xh-leading-none);
323
393
  user-select: none;
@@ -355,6 +425,9 @@
355
425
  两套底色各画各的会出现"鼠标停在 A 上、回车提交的却是 B" */
356
426
  [data-scope='combobox'][data-part='item'][data-highlighted]:not([data-disabled]) {
357
427
  background: var(--xh-combobox-item-bg-hover, var(--xh-bg-subtle));
428
+ /* 焦点恒在输入框,高亮条目自带内收环;列表是滚动容器,环画在外沿会被裁掉 */
429
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
430
+ outline-offset: calc(-1 * var(--xh-ring-width));
358
431
  }
359
432
 
360
433
  /* 选中只换文字色与字重,配合行尾的 ✓ 标记;底色整条通道留给高亮,
@@ -401,7 +474,14 @@
401
474
 
402
475
  /* 同上:没写内容就由皮肤画勾 */
403
476
  [data-scope='combobox'][data-part='item-indicator']:empty::before {
404
- content: '✓';
477
+ content: '';
478
+ display: inline-block;
479
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
480
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
481
+ vertical-align: var(--xh-glyph-baseline-shift);
482
+ background-color: currentColor;
483
+ -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
484
+ mask: var(--xh-glyph-mark-check) center / contain no-repeat;
405
485
  }
406
486
 
407
487
  [data-scope='combobox'][data-part='item-indicator'][data-state='checked'] {
@@ -424,7 +504,7 @@
424
504
  color: var(--xh-combobox-empty-fg, var(--xh-fg-subtle));
425
505
  font-size: var(--xh-combobox-empty-font-size, var(--xh-_combobox-font-size));
426
506
  line-height: var(--xh-leading-none);
427
- box-shadow: var(--xh-combobox-empty-shadow, var(--xh-elevation-2));
507
+ box-shadow: var(--xh-combobox-empty-shadow, var(--xh-elevation-floating));
428
508
  text-align: center;
429
509
  pointer-events: auto;
430
510
  }
package/css/composer.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='composer'] {
4
+ --xh-composer-skin: 1;
5
+ }
6
+
2
7
  /* 边框画在 root 上,内部 textarea 无边框;align-items: flex-end 让按钮随输入框长高贴着底边 */
3
8
  [data-scope='composer'][data-part='root'] {
4
9
  /* 输入与发送按钮共用的控件高度 */
@@ -7,7 +12,8 @@
7
12
  display: flex;
8
13
  align-items: flex-end;
9
14
  gap: var(--xh-composer-gap, var(--xh-control-gap-md));
10
- padding: var(--xh-composer-p, var(--xh-space-2));
15
+ /* 整框的内衬走控件内边距尺的小档,密度收紧时随之收窄 */
16
+ padding: var(--xh-composer-p, var(--xh-control-px-sm));
11
17
  border: var(--xh-stroke-thin) solid var(--xh-composer-border, var(--xh-border-control));
12
18
  border-radius: var(--xh-composer-radius, var(--xh-shape-surface));
13
19
  background: var(--xh-composer-bg, var(--xh-bg-surface));
@@ -20,14 +26,15 @@
20
26
 
21
27
  /* 焦点环画在整个框上;用 focus-within 使焦点落在发送按钮时同样点亮 */
22
28
  [data-scope='composer'][data-part='root']:focus-within {
29
+ border-color: var(--xh-composer-root-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
23
30
  outline: var(--xh-ring-width) solid var(--xh-ring-focus);
24
31
  outline-offset: var(--xh-ring-offset);
25
32
  }
26
33
 
27
- /* 禁用态罩住整框,内部 textarea 与按钮另有原生 disabled 管交互 */
34
+ /* 禁用态只换光标与底色;文字由 textarea 与按钮各自走 fg-disabled,整框不再压 opacity,两者叠起来会压到读不出 */
28
35
  [data-scope='composer'][data-part='root'][data-disabled] {
29
36
  cursor: not-allowed;
30
- opacity: var(--xh-state-disabled-opacity);
37
+ background: var(--xh-composer-bg-disabled, var(--xh-bg-subtle));
31
38
  }
32
39
 
33
40
  /* 无边框透明底,融进 root 的框里;min-inline-size: 0 防止长内容把弹性子项撑出容器 */