@xihan-ui/styles 1.0.0-alpha.3 → 1.1.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 (99) hide show
  1. package/CHANGELOG.md +1922 -0
  2. package/README.md +1 -1
  3. package/css/accordion.css +25 -2
  4. package/css/alert.css +13 -9
  5. package/css/anchor.css +1 -1
  6. package/css/avatar-group.css +5 -1
  7. package/css/avatar.css +6 -0
  8. package/css/back-top.css +6 -0
  9. package/css/badge.css +94 -36
  10. package/css/breadcrumb.css +1 -1
  11. package/css/button-group.css +4 -0
  12. package/css/button.css +6 -0
  13. package/css/calendar.css +39 -13
  14. package/css/card.css +15 -6
  15. package/css/cascader.css +29 -23
  16. package/css/checkbox-group.css +38 -10
  17. package/css/checkbox.css +21 -10
  18. package/css/collapsible.css +7 -1
  19. package/css/color-picker.css +22 -2
  20. package/css/combobox.css +18 -7
  21. package/css/context-menu.css +17 -6
  22. package/css/date-field.css +2 -2
  23. package/css/date-picker.css +27 -17
  24. package/css/descriptions.css +9 -3
  25. package/css/dialog.css +7 -1
  26. package/css/drawer.css +15 -5
  27. package/css/dynamic-input.css +7 -0
  28. package/css/ellipsis.css +6 -0
  29. package/css/empty-state.css +16 -6
  30. package/css/field.css +7 -0
  31. package/css/file-upload.css +1 -1
  32. package/css/flex.css +13 -7
  33. package/css/float-button.css +7 -0
  34. package/css/floating-panel.css +6 -0
  35. package/css/grid.css +11 -5
  36. package/css/heatmap.css +3 -2
  37. package/css/highlight.css +1 -1
  38. package/css/hotkeys.css +1 -1
  39. package/css/hover-card.css +3 -0
  40. package/css/image-cropper.css +4 -2
  41. package/css/image-viewer.css +18 -5
  42. package/css/json-viewer.css +34 -1
  43. package/css/layout.css +15 -7
  44. package/css/list.css +14 -5
  45. package/css/listbox.css +4 -2
  46. package/css/loading-bar.css +5 -4
  47. package/css/log.css +6 -2
  48. package/css/masonry.css +5 -5
  49. package/css/mention.css +13 -3
  50. package/css/menu.css +16 -5
  51. package/css/menubar.css +14 -6
  52. package/css/navigation-menu.css +2 -2
  53. package/css/notification.css +377 -0
  54. package/css/number-field.css +9 -3
  55. package/css/page-header.css +7 -0
  56. package/css/pagination.css +158 -1
  57. package/css/password-input.css +4 -4
  58. package/css/pin-input.css +2 -2
  59. package/css/popconfirm.css +9 -2
  60. package/css/popover.css +3 -0
  61. package/css/popselect.css +24 -4
  62. package/css/progress.css +8 -2
  63. package/css/radio-group.css +17 -6
  64. package/css/rating.css +2 -2
  65. package/css/resizable.css +113 -0
  66. package/css/result.css +15 -5
  67. package/css/scrollbar.css +3 -0
  68. package/css/segmented.css +1 -1
  69. package/css/select.css +25 -7
  70. package/css/side-nav.css +16 -5
  71. package/css/slider.css +4 -2
  72. package/css/sortable.css +103 -0
  73. package/css/space.css +6 -6
  74. package/css/steps.css +6 -6
  75. package/css/switch.css +9 -2
  76. package/css/table.css +309 -10
  77. package/css/tabs.css +148 -1
  78. package/css/tag.css +3 -1
  79. package/css/tags-input.css +3 -3
  80. package/css/text-field.css +3 -3
  81. package/css/thread.css +10 -2
  82. package/css/time-field.css +2 -2
  83. package/css/time-picker.css +6 -6
  84. package/css/timeline.css +7 -7
  85. package/css/toast.css +103 -53
  86. package/css/toggle-group.css +30 -4
  87. package/css/toggle.css +6 -0
  88. package/css/tone.css +47 -17
  89. package/css/tooltip.css +7 -1
  90. package/css/tour.css +9 -3
  91. package/css/transfer.css +38 -12
  92. package/css/tree-select.css +30 -5
  93. package/css/tree.css +175 -4
  94. package/css/typography.css +1 -1
  95. package/css/undefined.css +1 -0
  96. package/index.css +3 -1
  97. package/index.unlayered.css +2650 -634
  98. package/package.json +5 -3
  99. package/css/toaster.css +0 -74
package/css/cascader.css CHANGED
@@ -6,6 +6,9 @@
6
6
 
7
7
  /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
8
8
  [data-scope='cascader'][data-part='positioner'] {
9
+ /* 列区的自绘条浮在内容之上:轨道不上底色,实色轨道会在列区下缘糊出一条灰带 */
10
+ --xh-scrollbar-track-bg: transparent;
11
+
9
12
  position: fixed;
10
13
  z-index: var(--xh-cascader-layer, var(--xh-layer-popover));
11
14
  /* 空壳不吃指针,交互只发生在 content 里 */
@@ -25,9 +28,11 @@
25
28
  /* 尺寸档只换这几个私有槽,盒与列里的条目都从这两处继承它们,换档不必给每个部件各写一条选择器 */
26
29
  --xh-_cascader-h: var(--xh-control-h-md);
27
30
  --xh-_cascader-px: var(--xh-control-px-md);
31
+ --xh-_cascader-row-py: var(--xh-list-option-py-md);
32
+ --xh-_cascader-row-px: var(--xh-control-px-md);
28
33
  --xh-_cascader-gap: var(--xh-control-gap-md);
29
- --xh-_cascader-font-size: var(--xh-text-body-size);
30
- --xh-_cascader-label-font-size: var(--xh-text-label-size);
34
+ --xh-_cascader-font-size: var(--xh-control-font-md);
35
+ --xh-_cascader-label-font-size: var(--xh-control-font-md);
31
36
 
32
37
  /* 形态档只换触发框的描边与底色这三个槽,浮层与列不跟着变:
33
38
  变的是「这是个输入位」的表达方式,不是弹出内容的表达方式 */
@@ -86,6 +91,8 @@
86
91
  --xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-sm));
87
92
  --xh-_cascader-h: var(--xh-control-h-sm);
88
93
  --xh-_cascader-px: var(--xh-control-px-sm);
94
+ --xh-_cascader-row-py: var(--xh-list-option-py-sm);
95
+ --xh-_cascader-row-px: var(--xh-control-px-sm);
89
96
  --xh-_cascader-gap: var(--xh-control-gap-sm);
90
97
  --xh-_cascader-font-size: var(--xh-control-font-sm);
91
98
  --xh-_cascader-label-font-size: var(--xh-control-font-sm);
@@ -95,6 +102,8 @@
95
102
  --xh-icon-size: var(--xh-cascader-icon-size, var(--xh-glyph-size-lg));
96
103
  --xh-_cascader-h: var(--xh-control-h-lg);
97
104
  --xh-_cascader-px: var(--xh-control-px-lg);
105
+ --xh-_cascader-row-py: var(--xh-list-option-py-lg);
106
+ --xh-_cascader-row-px: var(--xh-control-px-lg);
98
107
  --xh-_cascader-gap: var(--xh-control-gap-lg);
99
108
  --xh-_cascader-font-size: var(--xh-control-font-lg);
100
109
  --xh-_cascader-label-font-size: var(--xh-control-font-lg);
@@ -334,6 +343,7 @@
334
343
  display: flex;
335
344
  flex: none;
336
345
  flex-direction: column;
346
+ gap: var(--xh-cascader-column-gap, var(--xh-list-option-gap));
337
347
  min-inline-size: var(--xh-cascader-column-min-w, 7rem);
338
348
  block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
339
349
  padding-block: var(--xh-cascader-column-py, var(--xh-space-1));
@@ -369,8 +379,8 @@
369
379
  align-items: center;
370
380
  gap: var(--xh-cascader-row-gap, var(--xh-_cascader-gap));
371
381
  max-inline-size: var(--xh-cascader-row-max-w, var(--xh-overlay-max-w));
372
- padding-block: var(--xh-cascader-row-py, var(--xh-space-1_5));
373
- padding-inline: var(--xh-cascader-row-px, var(--xh-control-px-md));
382
+ padding-block: var(--xh-cascader-row-py, var(--xh-_cascader-row-py));
383
+ padding-inline: var(--xh-cascader-row-px, var(--xh-_cascader-row-px));
374
384
  border-radius: var(--xh-cascader-row-radius, var(--xh-shape-control));
375
385
  color: var(--xh-cascader-row-fg, var(--xh-fg-default));
376
386
  font-size: var(--xh-cascader-row-font-size, var(--xh-_cascader-font-size));
@@ -423,22 +433,17 @@
423
433
  cursor: not-allowed;
424
434
  }
425
435
 
426
- /* 分支条目行尾画右向小箭头:不点开也看得出还有下一级。
427
- 全边框描好后抹掉块末与行首两边,剩下的直角旋成箭头;位置由 item-text 的 flex:1 顶到行尾 */
436
+ /* 分支条目行尾画右向小箭头:不点开也看得出还有下一级。位置由 item-text 的 flex:1 顶到行尾。
437
+ 与菜单族的子菜单箭头同走字形令牌——此前这里是「描全边框再抹掉两条、把剩下的直角旋 45 度」,
438
+ 作者换掉标记时换不动它,RTL 还得再翻一次旋转角 */
428
439
  [data-scope='cascader'][data-part='item'][data-branch]::after {
429
440
  content: '';
430
441
  flex: none;
431
- inline-size: var(--xh-cascader-branch-arrow-size, var(--xh-space-1_5));
432
- block-size: var(--xh-cascader-branch-arrow-size, var(--xh-space-1_5));
433
- border: var(--xh-glyph-stroke-light) solid var(--xh-cascader-branch-arrow-fg, var(--xh-fg-subtle));
434
- border-block-end: 0;
435
- border-inline-start: 0;
436
- rotate: 45deg;
437
- }
438
-
439
- /* rtl 下剩下的是块首与行末(物理左上)两边,反向旋 45 度才指向行进方向 */
440
- [dir='rtl'] [data-scope='cascader'][data-part='item'][data-branch]::after {
441
- rotate: -45deg;
442
+ inline-size: var(--xh-cascader-branch-arrow-size, var(--xh-icon-size, var(--xh-glyph-size-text)));
443
+ block-size: var(--xh-cascader-branch-arrow-size, var(--xh-icon-size, var(--xh-glyph-size-text)));
444
+ background-color: var(--xh-cascader-branch-arrow-fg, var(--xh-fg-subtle));
445
+ -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
446
+ mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
442
447
  }
443
448
 
444
449
  [data-scope='cascader'][data-part='item'][data-branch][data-disabled]::after {
@@ -460,7 +465,7 @@
460
465
  align-items: center;
461
466
  justify-content: center;
462
467
  inline-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
463
- color: var(--xh-cascader-item-indicator-fg, var(--xh-_tone, var(--xh-bg-brand)));
468
+ color: var(--xh-cascader-item-indicator-fg, var(--xh-_tone, var(--xh-fg-brand)));
464
469
  visibility: hidden;
465
470
  }
466
471
 
@@ -486,11 +491,11 @@
486
491
 
487
492
  /* 级联勾选的半选态只在皮肤自绘(:empty)时露面画横杠:
488
493
  作者塞了自己的选中图形时,半选放出来会顶着一个语义相反的勾,表达交还作者 */
489
- [data-scope='cascader'][data-part='item-indicator'][data-indeterminate]:empty {
494
+ [data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty {
490
495
  visibility: visible;
491
496
  }
492
497
 
493
- [data-scope='cascader'][data-part='item-indicator'][data-indeterminate]:not([data-state='checked']):empty::before {
498
+ [data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty::before {
494
499
  content: '';
495
500
  display: inline-block;
496
501
  inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
@@ -517,7 +522,7 @@
517
522
  padding-block: var(--xh-cascader-input-py, var(--xh-space-2));
518
523
  padding-inline: var(--xh-cascader-input-px, var(--xh-control-px-md));
519
524
  border: none;
520
- border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-content-border, var(--xh-border-default));
525
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-border-subtle));
521
526
  border-start-start-radius: inherit;
522
527
  border-start-end-radius: inherit;
523
528
  background: none;
@@ -540,6 +545,7 @@
540
545
  display: flex;
541
546
  flex-basis: 100%;
542
547
  flex-direction: column;
548
+ gap: var(--xh-cascader-search-list-gap, var(--xh-list-option-gap));
543
549
  block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
544
550
  padding: var(--xh-cascader-search-p, var(--xh-space-1));
545
551
  overflow-y: auto;
@@ -561,8 +567,8 @@
561
567
 
562
568
  /* 候选与列内条目同一套行度量,虚拟高亮与悬停同用轻档 */
563
569
  [data-scope='cascader'][data-part='search-item'] {
564
- padding-block: var(--xh-cascader-row-py, var(--xh-space-1_5));
565
- padding-inline: var(--xh-cascader-row-px, var(--xh-control-px-md));
570
+ padding-block: var(--xh-cascader-row-py, var(--xh-_cascader-row-py));
571
+ padding-inline: var(--xh-cascader-row-px, var(--xh-_cascader-row-px));
566
572
  overflow: hidden;
567
573
  border-radius: var(--xh-cascader-row-radius, var(--xh-shape-control));
568
574
  color: var(--xh-cascader-row-fg, var(--xh-fg-default));
@@ -129,25 +129,51 @@
129
129
  }
130
130
 
131
131
  /* 全选格的三态:checked 打勾、indeterminate 打横杠、unchecked 留空。
132
- indeterminate 就是读屏听到的 aria-checked=mixed,两者同源,样式只认 data-state */
133
- [data-scope='checkbox-group'][data-part='trigger'][data-state='checked']::before {
132
+ indeterminate 就是读屏听到的 aria-checked=mixed,两者同源,样式只认 data-state
133
+
134
+ 字形走 ::after 而不是画方框的那颗 ::before:mask 会把所在元素的描边与底色一并裁成
135
+ 字形的轮廓,写在 ::before 上就等于把方框本身裁没了,只剩一枚白勾。条目那一侧是
136
+ 真实节点当方框、它的 ::before 当字形的两层结构,这里 anatomy 到 trigger 为止、
137
+ 没有第二个节点,只能用第二个伪元素补上那一层。
138
+ 方框是行首那颗 ::before、宽度即指示符尺寸,所以字形按「盒与字形的宽度差之半」
139
+ 内推即落在圆心;纵向靠 inset-block: 0 + margin-block: auto 居中。
140
+ font-size 与 ::before 同值,--xh-icon-size 的 1em 兜底才和条目那侧量得一样大 */
141
+ [data-scope='checkbox-group'][data-part='trigger'][data-state='checked']::after {
134
142
  content: '';
135
- display: inline-block;
143
+ position: absolute;
144
+ inset-block: 0;
145
+ inset-inline-start: 0;
146
+ margin-block: auto;
147
+ margin-inline-start: calc(
148
+ (
149
+ var(--xh-checkbox-group-indicator-size, var(--xh-control-indicator-size)) -
150
+ var(--xh-icon-size, var(--xh-glyph-size-text))
151
+ ) / 2
152
+ );
136
153
  inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
137
154
  block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
138
- vertical-align: var(--xh-glyph-baseline-shift);
139
- background-color: currentColor;
155
+ background-color: var(--xh-checkbox-group-indicator-fg, var(--xh-fg-on-brand));
156
+ font-size: var(--xh-checkbox-group-indicator-font-size, calc(var(--xh-control-indicator-size) * 0.75));
140
157
  -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
141
158
  mask: var(--xh-glyph-mark-check) center / contain no-repeat;
142
159
  }
143
160
 
144
- [data-scope='checkbox-group'][data-part='trigger'][data-state='indeterminate']::before {
161
+ [data-scope='checkbox-group'][data-part='trigger'][data-state='indeterminate']::after {
145
162
  content: '';
146
- display: inline-block;
163
+ position: absolute;
164
+ inset-block: 0;
165
+ inset-inline-start: 0;
166
+ margin-block: auto;
167
+ margin-inline-start: calc(
168
+ (
169
+ var(--xh-checkbox-group-indicator-size, var(--xh-control-indicator-size)) -
170
+ var(--xh-icon-size, var(--xh-glyph-size-text))
171
+ ) / 2
172
+ );
147
173
  inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
148
174
  block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
149
- vertical-align: var(--xh-glyph-baseline-shift);
150
- background-color: currentColor;
175
+ background-color: var(--xh-checkbox-group-indicator-fg, var(--xh-fg-on-brand));
176
+ font-size: var(--xh-checkbox-group-indicator-font-size, calc(var(--xh-control-indicator-size) * 0.75));
151
177
  -webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
152
178
  mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
153
179
  }
@@ -164,8 +190,10 @@
164
190
  }
165
191
 
166
192
  /* 全选格与条目同形,但字重加一档,读起来才不像又一个普通选项。
167
- 它是普通元素而非原生控件(三态只有非原生控件表达得出),禁用态同样只能读 data-disabled */
193
+ 它是普通元素而非原生控件(三态只有非原生控件表达得出),禁用态同样只能读 data-disabled
194
+ position 是给叠在方框上的那颗字形 ::after 当定位基准 */
168
195
  [data-scope='checkbox-group'][data-part='trigger'] {
196
+ position: relative;
169
197
  display: inline-flex;
170
198
  align-items: center;
171
199
  gap: var(--xh-checkbox-group-trigger-gap, var(--xh-control-gap-md));
package/css/checkbox.css CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  /* 尺寸档只换方框边长这一个私有槽,勾的字号按边长的比例跟着走;
12
12
  指示器从 root 继承这两个槽,换档不必给每个部件各写一条选择器 */
13
- --xh-_checkbox-box: var(--xh-control-indicator-size);
13
+ --xh-_checkbox-box: var(--xh-control-indicator-md);
14
14
  --xh-_checkbox-glyph: calc(var(--xh-_checkbox-box) * 0.75);
15
15
 
16
16
  /* 选中态的底与描边随语气走。没写 data-tone 时 --xh-_tone 没被声明,退回原来的品牌色 */
@@ -27,7 +27,7 @@
27
27
  block-size: var(--xh-_checkbox-box);
28
28
  padding: 0;
29
29
  border: var(--xh-stroke-thin) solid var(--xh-checkbox-border, var(--xh-border-control));
30
- border-radius: var(--xh-shape-inset);
30
+ border-radius: var(--xh-checkbox-radius, var(--xh-shape-inset));
31
31
  background: var(--xh-checkbox-bg, var(--xh-bg-canvas));
32
32
  color: var(--xh-checkbox-fg, var(--xh-_checkbox-on-accent));
33
33
  cursor: pointer;
@@ -37,7 +37,7 @@
37
37
  }
38
38
 
39
39
  /* 半选与全选同样是「有值」,方框都得填上:
40
- 只填全选的话,半选那条横杠是实心底上的前景色(白),压在白画布上等于没画 */
40
+ 只填全选的话,半选那条横杠是实心底上的前景色,压在同色画布上等于没画 */
41
41
  [data-scope='checkbox'][data-part='root'][data-state='checked'],
42
42
  [data-scope='checkbox'][data-part='root'][data-state='indeterminate'] {
43
43
  border-color: var(--xh-checkbox-border-checked, var(--xh-_checkbox-accent));
@@ -71,11 +71,11 @@
71
71
  /* —— 尺寸 —— */
72
72
  /* 缺省档写在上面的基础规则里 */
73
73
  [data-scope='checkbox'][data-part='root'][data-size='sm'] {
74
- --xh-_checkbox-box: calc(var(--xh-control-indicator-size) - var(--xh-space-1));
74
+ --xh-_checkbox-box: var(--xh-control-indicator-sm);
75
75
  }
76
76
 
77
77
  [data-scope='checkbox'][data-part='root'][data-size='lg'] {
78
- --xh-_checkbox-box: calc(var(--xh-control-indicator-size) + var(--xh-space-1));
78
+ --xh-_checkbox-box: var(--xh-control-indicator-lg);
79
79
  }
80
80
 
81
81
  [data-scope='checkbox'][data-part='indicator'] {
@@ -104,7 +104,9 @@
104
104
  display: none;
105
105
  }
106
106
 
107
- /* 半选画一条横杠盖住勾:aria-checked=mixed 在视觉上也得与「全选」分得开 */
107
+ /* 半选换一枚横杠字形盖住勾:aria-checked=mixed 在视觉上也得与「全选」分得开。
108
+ 横杠与勾同走字形令牌,作者换掉标记时两态一起换;此前这条是手画的几何盒
109
+ (60% × stroke-thick),同一页上会出现两种横杠 */
108
110
  [data-scope='checkbox'][data-part='indicator'][data-state='indeterminate'] {
109
111
  position: relative;
110
112
  color: transparent;
@@ -112,11 +114,12 @@
112
114
 
113
115
  [data-scope='checkbox'][data-part='indicator'][data-state='indeterminate']::after {
114
116
  position: absolute;
115
- inline-size: 60%;
116
- block-size: var(--xh-stroke-thick);
117
- border-radius: var(--xh-shape-pill);
118
- background: var(--xh-checkbox-indicator-fg, var(--xh-_checkbox-on-accent));
117
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
118
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
119
+ background-color: var(--xh-checkbox-indicator-fg, var(--xh-_checkbox-on-accent));
119
120
  content: '';
121
+ -webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
122
+ mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
120
123
  }
121
124
 
122
125
  /* —— 带文字的整行:<label> 包住控件与文字,与 checkbox-group 的条目同一副样子 —— */
@@ -139,4 +142,12 @@
139
142
  color: inherit;
140
143
  user-select: none;
141
144
  }
145
+
146
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
147
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
148
+ [data-scope='checkbox'][data-part='root'][hidden],
149
+ [data-scope='checkbox'][data-part='indicator'][hidden],
150
+ [data-scope='checkbox'][data-part='label'][hidden] {
151
+ display: none;
152
+ }
142
153
  }
@@ -10,7 +10,7 @@
10
10
  --xh-_collapsible-trigger-h: var(--xh-control-h-md);
11
11
  --xh-_collapsible-trigger-px: var(--xh-control-px-md);
12
12
  --xh-_collapsible-trigger-gap: var(--xh-control-gap-md);
13
- --xh-_collapsible-trigger-font-size: var(--xh-text-label-size);
13
+ --xh-_collapsible-trigger-font-size: var(--xh-control-font-md);
14
14
  }
15
15
 
16
16
  /* —— 尺寸 —— */
@@ -105,4 +105,10 @@
105
105
  padding-block: 0;
106
106
  }
107
107
  }
108
+
109
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
110
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
111
+ [data-scope='collapsible'][data-part='trigger'][hidden] {
112
+ display: none;
113
+ }
108
114
  }
@@ -40,7 +40,7 @@
40
40
  --xh-_color-picker-h: var(--xh-control-h-md);
41
41
  --xh-_color-picker-px: var(--xh-control-px-md);
42
42
  --xh-_color-picker-gap: var(--xh-control-gap-md);
43
- --xh-_color-picker-label-font-size: var(--xh-text-label-size);
43
+ --xh-_color-picker-label-font-size: var(--xh-control-font-md);
44
44
 
45
45
  /* 聚焦环恒用固定环色 */
46
46
  --xh-_color-picker-ring: var(--xh-ring-focus);
@@ -50,6 +50,23 @@
50
50
  gap: var(--xh-color-picker-gap, var(--xh-space-1));
51
51
  }
52
52
 
53
+ /* —— 尺寸 —— */
54
+ /* 缺省档写在上面的基础规则里。浮层那一侧也要挂:positioner 被搬到 portal 落点,
55
+ 继承不到根上的私有槽,所以两个部件一起收 */
56
+ [data-scope='color-picker']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
57
+ --xh-_color-picker-h: var(--xh-control-h-sm);
58
+ --xh-_color-picker-px: var(--xh-control-px-sm);
59
+ --xh-_color-picker-gap: var(--xh-control-gap-sm);
60
+ --xh-_color-picker-label-font-size: var(--xh-control-font-sm);
61
+ }
62
+
63
+ [data-scope='color-picker']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
64
+ --xh-_color-picker-h: var(--xh-control-h-lg);
65
+ --xh-_color-picker-px: var(--xh-control-px-lg);
66
+ --xh-_color-picker-gap: var(--xh-control-gap-lg);
67
+ --xh-_color-picker-label-font-size: var(--xh-control-font-lg);
68
+ }
69
+
53
70
  [data-scope='color-picker'][data-part='label'] {
54
71
  color: var(--xh-color-picker-label-fg, var(--xh-fg-default));
55
72
  font-size: var(--xh-color-picker-label-font-size, var(--xh-_color-picker-label-font-size));
@@ -161,6 +178,9 @@
161
178
  引擎没算(尚未落位 / 无引擎 / 贴边归零)时不额外限高 */
162
179
  --xh-_color-picker-available-h: 100vh;
163
180
 
181
+ /* 面板的自绘条浮在内容之上:轨道不上底色,实色轨道会在面板右缘糊出一条竖灰带 */
182
+ --xh-scrollbar-track-bg: transparent;
183
+
164
184
  position: fixed;
165
185
  z-index: var(--xh-color-picker-layer, var(--xh-layer-popover));
166
186
  /* 空壳不吃指针,交互只发生在 content 上 */
@@ -456,7 +476,7 @@
456
476
  inline-size: var(--xh-color-picker-swatch-item-size, 1.25rem);
457
477
  block-size: var(--xh-color-picker-swatch-item-size, 1.25rem);
458
478
  padding: 0;
459
- border: var(--xh-stroke-thin) solid var(--xh-color-picker-swatch-border, var(--xh-border-control));
479
+ border: var(--xh-stroke-thin) solid var(--xh-color-picker-swatch-border, var(--xh-border-default));
460
480
  border-radius: var(--xh-color-picker-swatch-radius, var(--xh-shape-inset));
461
481
  cursor: pointer;
462
482
  }
package/css/combobox.css CHANGED
@@ -37,6 +37,9 @@
37
37
  引擎没算(尚未落位 / 无引擎)时不额外限高 */
38
38
  --xh-_combobox-available-h: 100vh;
39
39
 
40
+ /* 候选列表的自绘条浮在内容之上:轨道不上底色,实色轨道会在列表右缘糊一条竖灰带 */
41
+ --xh-scrollbar-track-bg: transparent;
42
+
40
43
  position: fixed;
41
44
  z-index: var(--xh-combobox-layer, var(--xh-layer-popover));
42
45
  /* 空壳不吃指针,交互只发生在 content 与 empty 上 */
@@ -54,9 +57,11 @@
54
57
  换档不必给每个部件各写一条选择器 */
55
58
  --xh-_combobox-h: var(--xh-control-h-md);
56
59
  --xh-_combobox-px: var(--xh-control-px-md);
60
+ --xh-_combobox-item-py: var(--xh-list-option-py-md);
61
+ --xh-_combobox-item-px: var(--xh-control-px-md);
57
62
  --xh-_combobox-gap: var(--xh-control-gap-md);
58
- --xh-_combobox-font-size: var(--xh-text-body-size);
59
- --xh-_combobox-label-font-size: var(--xh-text-label-size);
63
+ --xh-_combobox-font-size: var(--xh-control-font-md);
64
+ --xh-_combobox-label-font-size: var(--xh-control-font-md);
60
65
 
61
66
  /* 作者塞进指示符槽的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准 */
62
67
  --xh-icon-size: var(--xh-combobox-icon-size, var(--xh-glyph-size-md));
@@ -69,7 +74,7 @@
69
74
  /* 聚焦环恒用固定环色;强调色随语气走,只落在勾选标记与选中文字上,正文文字色不动。
70
75
  没写 data-tone 时 --xh-_tone 没被声明,两处都退回原来的取值 */
71
76
  --xh-_combobox-ring: var(--xh-ring-focus);
72
- --xh-_combobox-accent: var(--xh-_tone, var(--xh-bg-brand));
77
+ --xh-_combobox-accent: var(--xh-_tone, var(--xh-fg-brand));
73
78
  --xh-_combobox-item-selected-fg: var(--xh-_tone-fg, var(--xh-fg-brand-strong));
74
79
  }
75
80
 
@@ -89,6 +94,8 @@
89
94
  [data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
90
95
  --xh-_combobox-h: var(--xh-control-h-sm);
91
96
  --xh-_combobox-px: var(--xh-control-px-sm);
97
+ --xh-_combobox-item-py: var(--xh-list-option-py-sm);
98
+ --xh-_combobox-item-px: var(--xh-control-px-sm);
92
99
  --xh-_combobox-gap: var(--xh-control-gap-sm);
93
100
  --xh-_combobox-font-size: var(--xh-control-font-sm);
94
101
  --xh-_combobox-label-font-size: var(--xh-control-font-sm);
@@ -99,6 +106,8 @@
99
106
  [data-scope='combobox']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
100
107
  --xh-_combobox-h: var(--xh-control-h-lg);
101
108
  --xh-_combobox-px: var(--xh-control-px-lg);
109
+ --xh-_combobox-item-py: var(--xh-list-option-py-lg);
110
+ --xh-_combobox-item-px: var(--xh-control-px-lg);
102
111
  --xh-_combobox-gap: var(--xh-control-gap-lg);
103
112
  --xh-_combobox-font-size: var(--xh-control-font-lg);
104
113
  --xh-_combobox-label-font-size: var(--xh-control-font-lg);
@@ -217,7 +226,7 @@
217
226
  [data-scope='combobox'][data-part='control']:has([data-part='input'][data-multiline]) {
218
227
  align-items: start;
219
228
  block-size: auto;
220
- padding-block: var(--xh-field-py);
229
+ padding-block: var(--xh-combobox-input-py, var(--xh-field-py));
221
230
  }
222
231
 
223
232
  [data-scope='combobox'][data-part='input'][data-multiline] {
@@ -331,6 +340,7 @@
331
340
  [data-scope='combobox'][data-part='content'] {
332
341
  display: flex;
333
342
  flex-direction: column;
343
+ gap: var(--xh-combobox-content-gap, var(--xh-list-option-gap));
334
344
  min-inline-size: var(--xh-combobox-content-min-w, var(--xh-overlay-min-w));
335
345
  max-inline-size: var(--xh-combobox-content-max-w, var(--xh-overlay-max-w));
336
346
  max-block-size: min(var(--xh-combobox-content-max-h, var(--xh-overlay-max-h)), var(--xh-_combobox-available-h));
@@ -370,6 +380,7 @@
370
380
  [data-scope='combobox'][data-part='item-group'] {
371
381
  display: flex;
372
382
  flex-direction: column;
383
+ gap: var(--xh-combobox-item-group-gap, var(--xh-list-option-gap));
373
384
  }
374
385
 
375
386
  [data-scope='combobox'][data-part='item-group'][hidden] {
@@ -378,7 +389,7 @@
378
389
 
379
390
  /* 组间留白只加在后继分组上:首组顶上已经有 content 的内边距,再加一层会显得头重 */
380
391
  [data-scope='combobox'][data-part='item-group'] + [data-scope='combobox'][data-part='item-group'] {
381
- margin-block-start: var(--xh-combobox-group-gap, var(--xh-space-2));
392
+ margin-block-start: var(--xh-combobox-group-gap, var(--xh-space-1_5));
382
393
  }
383
394
 
384
395
  /* 分组标题不是候选、进不了导航,画成小号次要文字,内缩与候选对齐(同一个 padding-inline) */
@@ -401,8 +412,8 @@
401
412
  display: flex;
402
413
  align-items: center;
403
414
  gap: var(--xh-combobox-item-gap, var(--xh-_combobox-gap));
404
- padding-block: var(--xh-combobox-item-py, var(--xh-space-1_5));
405
- padding-inline: var(--xh-combobox-item-px, var(--xh-control-px-md));
415
+ padding-block: var(--xh-combobox-item-py, var(--xh-_combobox-item-py));
416
+ padding-inline: var(--xh-combobox-item-px, var(--xh-_combobox-item-px));
406
417
  border-radius: var(--xh-combobox-item-radius, var(--xh-shape-control));
407
418
  color: var(--xh-combobox-item-fg, var(--xh-fg-default));
408
419
  font-size: var(--xh-combobox-item-font-size, var(--xh-_combobox-font-size));
@@ -10,6 +10,9 @@
10
10
  引擎没算(尚未落位 / 无引擎)时不额外限高 */
11
11
  --xh-_context-menu-available-h: 100vh;
12
12
 
13
+ /* 条目列表的自绘条浮在内容之上:轨道不上底色,实色轨道会在菜单右缘糊一条竖灰带 */
14
+ --xh-scrollbar-track-bg: transparent;
15
+
13
16
  position: fixed;
14
17
  z-index: var(--xh-context-menu-layer, var(--xh-layer-popover));
15
18
  /* 空壳不吃指针,交互只发生在 content 上 */
@@ -25,10 +28,10 @@
25
28
  [data-scope='context-menu']:is([data-part='root'], [data-part='positioner']) {
26
29
  /* 尺寸档只换这四个私有槽,条目与分组标题都从这两处继承它们,
27
30
  换档不必给每个部件各写一条选择器 */
28
- --xh-_context-menu-item-py: var(--xh-space-1_5);
31
+ --xh-_context-menu-item-py: var(--xh-list-option-py-md);
29
32
  --xh-_context-menu-item-px: var(--xh-control-px-md);
30
33
  --xh-_context-menu-item-gap: var(--xh-control-gap-md);
31
- --xh-_context-menu-font-size: var(--xh-text-body-size);
34
+ --xh-_context-menu-font-size: var(--xh-control-font-md);
32
35
 
33
36
  /* 打开子菜单的触发条目走品牌淡底强档,随语气换色相;没写 data-tone 时退回品牌淡底。
34
37
  悬停与键盘焦点恒中性灰轻档、不接语气槽——两档同色相的话打开路径就认不出来了 */
@@ -43,6 +46,12 @@
43
46
  display: contents;
44
47
  }
45
48
 
49
+ /* 浮层被搬到 portal 落点,继承不到 root 上的槽:这把尺在被搬走的那一侧再声明一次,
50
+ 关闭钮与条目里作者塞的图标才和皮肤画的兜底字形一样大 */
51
+ [data-scope='context-menu'][data-part='content'] {
52
+ --xh-icon-size: var(--xh-context-menu-icon-size, var(--xh-glyph-size-text));
53
+ }
54
+
46
55
  [data-scope='context-menu'][data-part='root'][hidden] {
47
56
  display: none;
48
57
  }
@@ -51,14 +60,14 @@
51
60
  /* 缺省档写在上面的基础规则里。条目高度由 padding 撑出来:
52
61
  纵向走 space 档、行内内缩走 control-px 档(随密度轴),换档各挪一级 */
53
62
  [data-scope='context-menu']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
54
- --xh-_context-menu-item-py: var(--xh-space-1);
63
+ --xh-_context-menu-item-py: var(--xh-list-option-py-sm);
55
64
  --xh-_context-menu-item-px: var(--xh-control-px-sm);
56
65
  --xh-_context-menu-item-gap: var(--xh-control-gap-sm);
57
66
  --xh-_context-menu-font-size: var(--xh-control-font-sm);
58
67
  }
59
68
 
60
69
  [data-scope='context-menu']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
61
- --xh-_context-menu-item-py: var(--xh-space-2);
70
+ --xh-_context-menu-item-py: var(--xh-list-option-py-lg);
62
71
  --xh-_context-menu-item-px: var(--xh-control-px-lg);
63
72
  --xh-_context-menu-item-gap: var(--xh-control-gap-lg);
64
73
  --xh-_context-menu-font-size: var(--xh-control-font-lg);
@@ -79,6 +88,7 @@
79
88
  [data-scope='context-menu'][data-part='content'] {
80
89
  display: flex;
81
90
  flex-direction: column;
91
+ gap: var(--xh-context-menu-content-gap, var(--xh-list-option-gap));
82
92
  min-inline-size: var(--xh-context-menu-min-w, var(--xh-overlay-menu-min-w));
83
93
  max-inline-size: var(--xh-context-menu-max-w, var(--xh-overlay-max-w));
84
94
  /* 两道上限取更小的那道:自己的高度上限,以及落定那一侧真正剩下的空间。
@@ -128,6 +138,7 @@
128
138
  [data-scope='context-menu'][data-part='group'] {
129
139
  display: flex;
130
140
  flex-direction: column;
141
+ gap: var(--xh-context-menu-group-gap, var(--xh-list-option-gap));
131
142
  }
132
143
 
133
144
  [data-scope='context-menu'][data-part='group'][hidden] {
@@ -241,7 +252,7 @@
241
252
  align-items: center;
242
253
  justify-content: center;
243
254
  inline-size: var(--xh-context-menu-item-indicator-size, var(--xh-control-indicator-size));
244
- color: var(--xh-context-menu-item-indicator-fg, var(--xh-fg-brand));
255
+ color: var(--xh-context-menu-item-indicator-fg, var(--xh-_tone, var(--xh-fg-brand)));
245
256
  }
246
257
 
247
258
  [data-scope='context-menu'][data-part='item-indicator'][hidden] {
@@ -254,7 +265,7 @@
254
265
 
255
266
  [data-scope='context-menu'][data-part='separator'] {
256
267
  block-size: var(--xh-context-menu-separator-thickness, var(--xh-stroke-thin));
257
- margin-block: var(--xh-context-menu-separator-my, var(--xh-space-1));
268
+ margin-block: var(--xh-context-menu-separator-my, var(--xh-space-0_5));
258
269
  background: var(--xh-context-menu-separator-color, var(--xh-border-default));
259
270
  }
260
271
 
@@ -13,8 +13,8 @@
13
13
  --xh-_date-field-control-h: var(--xh-control-h-md);
14
14
  --xh-_date-field-control-px: var(--xh-control-px-md);
15
15
  --xh-_date-field-gap: var(--xh-control-gap-md);
16
- --xh-_date-field-font-size: var(--xh-text-body-size);
17
- --xh-_date-field-label-font-size: var(--xh-text-label-size);
16
+ --xh-_date-field-font-size: var(--xh-control-font-md);
17
+ --xh-_date-field-label-font-size: var(--xh-control-font-md);
18
18
  /* 形态档只换这三个私有槽:底色与两档描边 */
19
19
  --xh-_date-field-control-bg: var(--xh-bg-canvas);
20
20
  --xh-_date-field-control-border: var(--xh-border-control);