@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/layout.css CHANGED
@@ -40,9 +40,9 @@
40
40
  display: flex;
41
41
  grid-area: header;
42
42
  align-items: center;
43
- gap: var(--xh-space-3);
43
+ gap: var(--xh-layout-header-gap, var(--xh-space-3));
44
44
  block-size: var(--xh-_layout-header-h);
45
- padding-inline: var(--xh-space-4);
45
+ padding-inline: var(--xh-layout-header-px, var(--xh-space-4));
46
46
  background: var(--xh-layout-header-bg, var(--xh-bg-surface));
47
47
  }
48
48
 
@@ -51,7 +51,7 @@
51
51
  grid-area: sider;
52
52
  inline-size: var(--xh-_layout-sider-w);
53
53
  overflow: hidden;
54
- padding: var(--xh-space-3);
54
+ padding: var(--xh-layout-sider-padding, var(--xh-space-3));
55
55
  background: var(--xh-layout-sider-bg, var(--xh-bg-subtle));
56
56
  transition: inline-size var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
57
57
  }
@@ -66,12 +66,12 @@
66
66
  grid-area: content;
67
67
  /* 内容列已是 minmax(0, 1fr),这里再声明一次,宽表格与长串文本才撑不破列 */
68
68
  min-inline-size: 0;
69
- padding: var(--xh-space-4);
69
+ padding: var(--xh-layout-content-padding, var(--xh-space-4));
70
70
  }
71
71
 
72
72
  [data-scope='layout'][data-part='footer'] {
73
73
  grid-area: footer;
74
- padding: var(--xh-space-3) var(--xh-space-4);
74
+ padding: var(--xh-layout-footer-padding, var(--xh-space-3) var(--xh-space-4));
75
75
  background: var(--xh-layout-footer-bg, var(--xh-bg-surface));
76
76
  color: var(--xh-fg-muted);
77
77
  font-size: var(--xh-text-secondary-size);
@@ -82,9 +82,9 @@
82
82
  display: inline-flex;
83
83
  align-items: center;
84
84
  justify-content: center;
85
- gap: var(--xh-control-gap-sm);
85
+ gap: var(--xh-layout-sider-trigger-gap, var(--xh-control-gap-sm));
86
86
  block-size: var(--xh-control-h-sm);
87
- padding-inline: var(--xh-control-px-sm);
87
+ padding-inline: var(--xh-layout-sider-trigger-px, var(--xh-control-px-sm));
88
88
  border: 0;
89
89
  border-radius: var(--xh-layout-sider-trigger-radius, var(--xh-shape-control));
90
90
  background: var(--xh-layout-sider-trigger-bg, transparent);
@@ -167,4 +167,12 @@
167
167
  max-block-size: calc(var(--xh-layout-scrollport-h, 100dvh) - var(--xh-_layout-sider-offset));
168
168
  overflow-y: auto;
169
169
  }
170
+
171
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
172
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
173
+ [data-scope='layout'][data-part='root'][hidden],
174
+ [data-scope='layout'][data-part='header'][hidden],
175
+ [data-scope='layout'][data-part='sider-trigger'][hidden] {
176
+ display: none;
177
+ }
170
178
  }
package/css/list.css CHANGED
@@ -8,7 +8,7 @@
8
8
  /* 一个尺寸档只换这几个私有槽,条目与两行文字都从根上继承它们,
9
9
  换档不必给每个部件各写一条选择器 */
10
10
  --xh-_list-item-py: var(--xh-list-item-py-md);
11
- --xh-_list-item-px: var(--xh-space-4);
11
+ --xh-_list-item-px: var(--xh-list-item-px-md);
12
12
  --xh-_list-item-gap: var(--xh-space-3);
13
13
  --xh-_list-title-size: var(--xh-control-font-md);
14
14
  --xh-_list-description-size: var(--xh-control-caption-md);
@@ -30,7 +30,7 @@
30
30
  /* —— 尺寸 —— */
31
31
  [data-scope='list'][data-part='root'][data-size='sm'] {
32
32
  --xh-_list-item-py: var(--xh-list-item-py-sm);
33
- --xh-_list-item-px: var(--xh-space-3);
33
+ --xh-_list-item-px: var(--xh-list-item-px-sm);
34
34
  --xh-_list-item-gap: var(--xh-space-2);
35
35
  --xh-_list-title-size: var(--xh-control-font-sm);
36
36
  --xh-_list-description-size: var(--xh-control-caption-sm);
@@ -38,7 +38,7 @@
38
38
 
39
39
  [data-scope='list'][data-part='root'][data-size='lg'] {
40
40
  --xh-_list-item-py: var(--xh-list-item-py-lg);
41
- --xh-_list-item-px: var(--xh-space-5);
41
+ --xh-_list-item-px: var(--xh-list-item-px-lg);
42
42
  --xh-_list-item-gap: var(--xh-space-4);
43
43
  --xh-_list-title-size: var(--xh-control-font-lg);
44
44
  }
@@ -66,11 +66,11 @@
66
66
  [data-scope='list'][data-part='root'][data-split]
67
67
  > [data-scope='list'][data-part='item']
68
68
  + [data-scope='list'][data-part='item'] {
69
- border-block-start: var(--xh-stroke-thin) solid var(--xh-list-border, var(--xh-border-subtle));
69
+ border-block-start: var(--xh-stroke-thin) solid var(--xh-list-divider, var(--xh-border-subtle));
70
70
  }
71
71
 
72
72
  [data-scope='list'][data-part='root'][data-hoverable] > [data-scope='list'][data-part='item'] {
73
- transition: background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
73
+ transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
74
74
  }
75
75
 
76
76
  /* 悬停换底色:只在能用指针的设备上生效,触摸端不留一个按不掉的悬停态 */
@@ -119,4 +119,13 @@
119
119
  gap: var(--xh-list-action-gap, var(--xh-space-2));
120
120
  margin-inline-start: auto;
121
121
  }
122
+
123
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
124
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
125
+ [data-scope='list'][data-part='item'][hidden],
126
+ [data-scope='list'][data-part='item-media'][hidden],
127
+ [data-scope='list'][data-part='item-content'][hidden],
128
+ [data-scope='list'][data-part='item-action'][hidden] {
129
+ display: none;
130
+ }
122
131
  }
package/css/listbox.css CHANGED
@@ -34,6 +34,7 @@
34
34
  [data-scope='listbox'][data-part='content'] {
35
35
  display: flex;
36
36
  flex-direction: column;
37
+ gap: var(--xh-listbox-content-gap, var(--xh-list-option-gap));
37
38
  max-block-size: var(--xh-listbox-content-max-h, var(--xh-viewport-h-md));
38
39
  padding-block: var(--xh-listbox-content-py, var(--xh-space-1));
39
40
  padding-inline: var(--xh-listbox-content-px, var(--xh-space-1));
@@ -66,6 +67,7 @@
66
67
  [data-scope='listbox'][data-part='item-group'] {
67
68
  display: flex;
68
69
  flex-direction: column;
70
+ gap: var(--xh-listbox-item-group-gap, var(--xh-list-option-gap));
69
71
  }
70
72
 
71
73
  [data-scope='listbox'][data-part='item-group'][hidden] {
@@ -74,7 +76,7 @@
74
76
 
75
77
  /* 组间留白只加在后继分组上:首组顶上已经有 content 的内边距,再加一层会显得头重 */
76
78
  [data-scope='listbox'][data-part='item-group'] + [data-scope='listbox'][data-part='item-group'] {
77
- margin-block-start: var(--xh-listbox-group-gap, var(--xh-space-2));
79
+ margin-block-start: var(--xh-listbox-group-gap, var(--xh-space-1_5));
78
80
  }
79
81
 
80
82
  /* 分组标题不是选项、进不了导航,画成小号次要文字,
@@ -168,7 +170,7 @@
168
170
  align-items: center;
169
171
  justify-content: center;
170
172
  inline-size: var(--xh-listbox-item-indicator-size, var(--xh-control-indicator-size));
171
- color: var(--xh-listbox-item-indicator-fg, var(--xh-bg-brand));
173
+ color: var(--xh-listbox-item-indicator-fg, var(--xh-fg-brand));
172
174
  visibility: hidden;
173
175
  }
174
176
 
@@ -31,8 +31,9 @@
31
31
  display: none;
32
32
  }
33
33
 
34
- /* 冲到 100 之后进入淡出:机器会在淡出窗口走完之前一直停在 finishing
35
- 这段过渡才有时间跑完;窗口与时长两处默认值都是 200ms,改一处记得对齐另一处 */
34
+ /* 冲到 100 之后进入淡出:机器会在淡出窗口走完之前一直停在 finishing,这段过渡才有时间跑完。
35
+ 窗口(machine 的 LOADING_BAR_FADE_DURATION,200ms)比过渡本身(motion-duration-exit,120ms)
36
+ 宽出一截是有意的余量;两者不是同一个数,改窗口时只要保证它仍不短于过渡 */
36
37
  [data-scope='loading-bar'][data-part='root'][data-state='finishing'] {
37
38
  opacity: 0;
38
39
  }
@@ -50,8 +51,8 @@
50
51
  * 进度段。宽度那条轴(inline-size)由连接层写进内联样式,这里绝不重复写。
51
52
  * 背景色同理:给了 color 就走内联,盖过下面这条。
52
53
  *
53
- * 语气取柔和档 --xh-_tone-soft(500)而不是 --xh-_tone(600):600 是给实心底与
54
- * 文字用的强调档,压在这么一条细带上偏重。槽位由 root 上的 data-tone 声明,继承下来。
54
+ * 语气取装饰档 --xh-_tone-soft:那一档压在画布上够 3:1,细带才看得出来。
55
+ * 槽位由 root 上的 data-tone 声明,继承下来。
55
56
  * 没写 data-tone 时该槽没被声明,退回原来的品牌色。
56
57
  */
57
58
  [data-scope='loading-bar'][data-part='range'] {
package/css/log.css CHANGED
@@ -28,14 +28,18 @@
28
28
  flex-basis 取 auto,连接层写的按行数高度才算数,同时外层给了高度时还能撑满;
29
29
  min-block-size: 0 让它在弹性父级里能被压缩从而真的溢出;
30
30
  两个轴都 auto:长行不折,横向也要能滚;
31
- overscroll-behavior: contain 阻止滚动量传给页面;
32
- scrollbar-gutter: stable 避免滚动条出现与消失时推动文字。 */
31
+ overscroll-behavior: contain 阻止滚动量传给页面。 */
33
32
  [data-scope='log'][data-part='viewport'] {
34
33
  flex: 1 1 auto;
35
34
  min-block-size: 0;
36
35
  block-size: calc(var(--xh-_log-line-h) * var(--xh-log-rows, 16));
37
36
  overflow: auto;
38
37
  overscroll-behavior: contain;
38
+ }
39
+
40
+ /* 还在用原生滚动条的视口留一条空道,滚动条出现与消失时不推动文字。
41
+ 带 data-xh-scrollbar 的容器已经把原生条藏成零宽,这条空道对它没有布局作用,排除掉 */
42
+ [data-scope='log'][data-part='viewport']:not([data-xh-scrollbar]) {
39
43
  scrollbar-gutter: stable;
40
44
  }
41
45
 
package/css/masonry.css CHANGED
@@ -42,22 +42,22 @@
42
42
  /* —— 间距档位 —— */
43
43
  /* 每一档指向一个间距令牌,列之间与列内项之间吃同一份间距 */
44
44
  [data-scope='masonry'][data-part='root'][data-gap='xs'] {
45
- --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-space-1));
45
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-xs));
46
46
  }
47
47
 
48
48
  [data-scope='masonry'][data-part='root'][data-gap='sm'] {
49
- --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-space-2));
49
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-sm));
50
50
  }
51
51
 
52
52
  [data-scope='masonry'][data-part='root'][data-gap='md'] {
53
- --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-space-3));
53
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-md));
54
54
  }
55
55
 
56
56
  [data-scope='masonry'][data-part='root'][data-gap='lg'] {
57
- --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-space-4));
57
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-lg));
58
58
  }
59
59
 
60
60
  [data-scope='masonry'][data-part='root'][data-gap='xl'] {
61
- --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-space-6));
61
+ --xh-_masonry-gap: var(--xh-masonry-gap, var(--xh-layout-gap-xl));
62
62
  }
63
63
  }
package/css/mention.css CHANGED
@@ -37,6 +37,9 @@
37
37
  引擎没算(尚未落位 / 无引擎)时不额外限高 */
38
38
  --xh-_mention-available-h: 100vh;
39
39
 
40
+ /* 候选列表的自绘条浮在内容之上:轨道不上底色,实色轨道会在列表右缘糊一条竖灰带 */
41
+ --xh-scrollbar-track-bg: transparent;
42
+
40
43
  position: fixed;
41
44
  z-index: var(--xh-mention-layer, var(--xh-layer-popover));
42
45
  /* 空壳不吃指针,交互只发生在 content 上 */
@@ -53,9 +56,11 @@
53
56
  /* 尺寸档只换这五个私有槽,输入框与候选都从这两处继承它们,换档不必给每个部件各写一条选择器 */
54
57
  --xh-_mention-h: var(--xh-control-h-md);
55
58
  --xh-_mention-px: var(--xh-control-px-md);
59
+ --xh-_mention-item-py: var(--xh-list-option-py-md);
60
+ --xh-_mention-item-px: var(--xh-control-px-md);
56
61
  --xh-_mention-py: var(--xh-field-py);
57
62
  --xh-_mention-gap: var(--xh-control-gap-md);
58
- --xh-_mention-font-size: var(--xh-text-body-size);
63
+ --xh-_mention-font-size: var(--xh-control-font-md);
59
64
 
60
65
  /* 形态档只换这三个槽:缺省即 outline(描边 + 画布底) */
61
66
  --xh-_mention-input-bg: var(--xh-bg-canvas);
@@ -80,6 +85,8 @@
80
85
  [data-scope='mention']:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
81
86
  --xh-_mention-h: var(--xh-control-h-sm);
82
87
  --xh-_mention-px: var(--xh-control-px-sm);
88
+ --xh-_mention-item-py: var(--xh-list-option-py-sm);
89
+ --xh-_mention-item-px: var(--xh-control-px-sm);
83
90
  --xh-_mention-py: var(--xh-space-1);
84
91
  --xh-_mention-gap: var(--xh-control-gap-sm);
85
92
  --xh-_mention-font-size: var(--xh-control-font-sm);
@@ -88,6 +95,8 @@
88
95
  [data-scope='mention']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
89
96
  --xh-_mention-h: var(--xh-control-h-lg);
90
97
  --xh-_mention-px: var(--xh-control-px-lg);
98
+ --xh-_mention-item-py: var(--xh-list-option-py-lg);
99
+ --xh-_mention-item-px: var(--xh-control-px-lg);
91
100
  --xh-_mention-py: var(--xh-space-3);
92
101
  --xh-_mention-gap: var(--xh-control-gap-lg);
93
102
  --xh-_mention-font-size: var(--xh-control-font-lg);
@@ -187,6 +196,7 @@
187
196
  [data-scope='mention'][data-part='content'] {
188
197
  display: flex;
189
198
  flex-direction: column;
199
+ gap: var(--xh-mention-content-gap, var(--xh-list-option-gap));
190
200
  min-inline-size: var(--xh-mention-content-min-w, var(--xh-overlay-min-w));
191
201
  max-inline-size: var(--xh-mention-content-max-w, var(--xh-overlay-max-w));
192
202
  max-block-size: min(var(--xh-mention-content-max-h, var(--xh-overlay-max-h)), var(--xh-_mention-available-h));
@@ -233,8 +243,8 @@
233
243
  display: flex;
234
244
  align-items: center;
235
245
  gap: var(--xh-mention-item-gap, var(--xh-_mention-gap));
236
- padding-block: var(--xh-mention-item-py, var(--xh-space-1_5));
237
- padding-inline: var(--xh-mention-item-px, var(--xh-control-px-md));
246
+ padding-block: var(--xh-mention-item-py, var(--xh-_mention-item-py));
247
+ padding-inline: var(--xh-mention-item-px, var(--xh-_mention-item-px));
238
248
  border-radius: var(--xh-mention-item-radius, var(--xh-shape-control));
239
249
  color: var(--xh-mention-item-fg, var(--xh-fg-default));
240
250
  font-size: var(--xh-mention-item-font-size, var(--xh-_mention-font-size));
package/css/menu.css CHANGED
@@ -37,6 +37,9 @@
37
37
  引擎没算(尚未落位 / 无引擎)时不额外限高 */
38
38
  --xh-_menu-available-h: 100vh;
39
39
 
40
+ /* 条目列表的自绘条浮在内容之上:轨道不上底色,实色轨道会在菜单右缘糊一条竖灰带 */
41
+ --xh-scrollbar-track-bg: transparent;
42
+
40
43
  position: fixed;
41
44
  z-index: var(--xh-menu-layer, var(--xh-layer-popover));
42
45
  /* 空壳不吃指针,交互只发生在 content 上 */
@@ -67,10 +70,10 @@
67
70
 
68
71
  /* 尺寸档只换这四个私有槽,条目从 content 继承它们,换档不必给每个部件各写一条选择器。
69
72
  菜单没有 root 部件(浮层树的最外层就是 content),三轴属性都落在这里 */
70
- --xh-_menu-item-py: var(--xh-space-1_5);
73
+ --xh-_menu-item-py: var(--xh-list-option-py-md);
71
74
  --xh-_menu-item-px: var(--xh-control-px-md);
72
75
  --xh-_menu-item-gap: var(--xh-control-gap-md);
73
- --xh-_menu-font-size: var(--xh-text-body-size);
76
+ --xh-_menu-font-size: var(--xh-control-font-md);
74
77
 
75
78
  /* 打开子菜单的触发条目走品牌淡底强档,随语气换色相;没写 data-tone 时退回品牌淡底。
76
79
  悬停与键盘焦点恒中性灰轻档、不接语气槽——两档同色相的话打开路径就认不出来了 */
@@ -78,6 +81,7 @@
78
81
 
79
82
  display: flex;
80
83
  flex-direction: column;
84
+ gap: var(--xh-menu-content-gap, var(--xh-list-option-gap));
81
85
  min-inline-size: var(--xh-menu-min-w, var(--xh-overlay-menu-min-w));
82
86
  max-inline-size: var(--xh-menu-max-w, var(--xh-overlay-max-w));
83
87
  /* 两道上限取更小的那道:自己的高度上限,以及落定那一侧真正剩下的空间。
@@ -120,14 +124,14 @@
120
124
  /* 缺省档写在 content 的基础规则里。条目高度由 padding 撑出来:
121
125
  纵向走 space 档、行内内缩走 control-px 档(随密度轴),换档各挪一级 */
122
126
  [data-scope='menu'][data-part='content'][data-size='sm'] {
123
- --xh-_menu-item-py: var(--xh-space-1);
127
+ --xh-_menu-item-py: var(--xh-list-option-py-sm);
124
128
  --xh-_menu-item-px: var(--xh-control-px-sm);
125
129
  --xh-_menu-item-gap: var(--xh-control-gap-sm);
126
130
  --xh-_menu-font-size: var(--xh-control-font-sm);
127
131
  }
128
132
 
129
133
  [data-scope='menu'][data-part='content'][data-size='lg'] {
130
- --xh-_menu-item-py: var(--xh-space-2);
134
+ --xh-_menu-item-py: var(--xh-list-option-py-lg);
131
135
  --xh-_menu-item-px: var(--xh-control-px-lg);
132
136
  --xh-_menu-item-gap: var(--xh-control-gap-lg);
133
137
  --xh-_menu-font-size: var(--xh-control-font-lg);
@@ -200,6 +204,7 @@
200
204
  [data-scope='menu'][data-part='group'] {
201
205
  display: flex;
202
206
  flex-direction: column;
207
+ gap: var(--xh-menu-group-gap, var(--xh-list-option-gap));
203
208
  }
204
209
 
205
210
  [data-scope='menu'][data-part='group'][hidden] {
@@ -225,7 +230,7 @@
225
230
 
226
231
  [data-scope='menu'][data-part='separator'] {
227
232
  block-size: var(--xh-menu-separator-thickness, var(--xh-stroke-thin));
228
- margin-block: var(--xh-menu-separator-my, var(--xh-space-1));
233
+ margin-block: var(--xh-menu-separator-my, var(--xh-space-0_5));
229
234
  background: var(--xh-menu-separator-color, var(--xh-border-default));
230
235
  }
231
236
 
@@ -241,4 +246,10 @@
241
246
  background: var(--xh-menu-bg, var(--xh-bg-surface));
242
247
  border: var(--xh-stroke-thin) solid var(--xh-menu-border, var(--xh-border-default));
243
248
  }
249
+
250
+ /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
251
+ 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
252
+ [data-scope='menu'][data-part='item'][hidden] {
253
+ display: none;
254
+ }
244
255
  }
package/css/menubar.css CHANGED
@@ -19,6 +19,12 @@
19
19
  color: var(--xh-menubar-root-fg, var(--xh-fg-default));
20
20
  }
21
21
 
22
+ /* 浮层被搬到 portal 落点,继承不到 root 上的槽:这把尺在被搬走的那一侧再声明一次,
23
+ 关闭钮与条目里作者塞的图标才和皮肤画的兜底字形一样大 */
24
+ [data-scope='menubar'][data-part='content'] {
25
+ --xh-icon-size: var(--xh-menubar-icon-size, var(--xh-glyph-size-text));
26
+ }
27
+
22
28
  [data-scope='menubar'][data-part='root'][hidden] {
23
29
  display: none;
24
30
  }
@@ -111,10 +117,10 @@
111
117
  [data-scope='menubar']:is([data-part='root'], [data-part='positioner']) {
112
118
  --xh-_menubar-trigger-py: var(--xh-space-1);
113
119
  --xh-_menubar-trigger-px: var(--xh-control-px-md);
114
- --xh-_menubar-item-py: var(--xh-space-1_5);
120
+ --xh-_menubar-item-py: var(--xh-list-option-py-md);
115
121
  --xh-_menubar-item-px: var(--xh-control-px-md);
116
122
  --xh-_menubar-item-gap: var(--xh-control-gap-md);
117
- --xh-_menubar-font-size: var(--xh-text-body-size);
123
+ --xh-_menubar-font-size: var(--xh-control-font-md);
118
124
 
119
125
  /* 展开着的那张菜单的 trigger 走品牌淡底强档,随语气换色相;没写 data-tone 时退回品牌淡底。
120
126
  悬停与键盘焦点恒中性灰轻档、不接语气槽——两档同色相的话哪张开着就认不出来了。
@@ -128,7 +134,7 @@
128
134
  [data-scope='menubar'][data-size='sm']:is([data-part='root'], [data-part='positioner']) {
129
135
  --xh-_menubar-trigger-py: var(--xh-space-0_5);
130
136
  --xh-_menubar-trigger-px: var(--xh-control-px-sm);
131
- --xh-_menubar-item-py: var(--xh-space-1);
137
+ --xh-_menubar-item-py: var(--xh-list-option-py-sm);
132
138
  --xh-_menubar-item-px: var(--xh-control-px-sm);
133
139
  --xh-_menubar-item-gap: var(--xh-control-gap-sm);
134
140
  --xh-_menubar-font-size: var(--xh-control-font-sm);
@@ -137,7 +143,7 @@
137
143
  [data-scope='menubar'][data-size='lg']:is([data-part='root'], [data-part='positioner']) {
138
144
  --xh-_menubar-trigger-py: var(--xh-space-2);
139
145
  --xh-_menubar-trigger-px: var(--xh-control-px-lg);
140
- --xh-_menubar-item-py: var(--xh-space-2);
146
+ --xh-_menubar-item-py: var(--xh-list-option-py-lg);
141
147
  --xh-_menubar-item-px: var(--xh-control-px-lg);
142
148
  --xh-_menubar-item-gap: var(--xh-control-gap-lg);
143
149
  --xh-_menubar-font-size: var(--xh-control-font-lg);
@@ -146,6 +152,7 @@
146
152
  [data-scope='menubar'][data-part='content'] {
147
153
  display: flex;
148
154
  flex-direction: column;
155
+ gap: var(--xh-menubar-content-gap, var(--xh-list-option-gap));
149
156
  min-inline-size: var(--xh-menubar-min-w, var(--xh-overlay-menu-min-w));
150
157
  max-inline-size: var(--xh-menubar-max-w, var(--xh-overlay-max-w));
151
158
  /* 两道上限取更小的那道:自己的高度上限,以及落定那一侧真正剩下的空间。
@@ -195,6 +202,7 @@
195
202
  [data-scope='menubar'][data-part='group'] {
196
203
  display: flex;
197
204
  flex-direction: column;
205
+ gap: var(--xh-menubar-group-gap, var(--xh-list-option-gap));
198
206
  }
199
207
 
200
208
  [data-scope='menubar'][data-part='group'][hidden] {
@@ -306,7 +314,7 @@
306
314
  align-items: center;
307
315
  justify-content: center;
308
316
  inline-size: var(--xh-menubar-item-indicator-size, var(--xh-control-indicator-size));
309
- color: var(--xh-menubar-item-indicator-fg, var(--xh-fg-brand));
317
+ color: var(--xh-menubar-item-indicator-fg, var(--xh-_tone, var(--xh-fg-brand)));
310
318
  }
311
319
 
312
320
  [data-scope='menubar'][data-part='item-indicator'][hidden] {
@@ -321,7 +329,7 @@
321
329
  不给 display,因此 UA 的 [hidden]{display:none} 自己就压得住 */
322
330
  [data-scope='menubar'][data-part='separator'] {
323
331
  block-size: var(--xh-menubar-separator-thickness, var(--xh-stroke-thin));
324
- margin-block: var(--xh-menubar-separator-my, var(--xh-space-1));
332
+ margin-block: var(--xh-menubar-separator-my, var(--xh-space-0_5));
325
333
  background: var(--xh-menubar-separator-color, var(--xh-border-default));
326
334
  }
327
335
 
@@ -37,13 +37,13 @@
37
37
  /* 尺寸档只换这五个私有槽,trigger 与面板里的链接都从 root 继承它们,
38
38
  换档不必给每个部件各写一条选择器。面板与共享外壳都是 root 的后代,一并继承。
39
39
  trigger 写的是 font: inherit,字号跟着 root 这一档走,不另立槽 */
40
- --xh-_navigation-menu-font-size: var(--xh-text-label-size);
40
+ --xh-_navigation-menu-font-size: var(--xh-control-font-md);
41
41
  --xh-_navigation-menu-trigger-h: var(--xh-control-h-md);
42
42
  --xh-_navigation-menu-trigger-px: var(--xh-control-px-md);
43
43
  --xh-_navigation-menu-trigger-gap: var(--xh-control-gap-md);
44
44
  --xh-_navigation-menu-link-py: var(--xh-space-1_5);
45
45
  --xh-_navigation-menu-link-px: var(--xh-control-px-md);
46
- --xh-_navigation-menu-link-font-size: var(--xh-text-body-size);
46
+ --xh-_navigation-menu-link-font-size: var(--xh-control-font-md);
47
47
 
48
48
  /* 悬停与键盘锚点恒中性灰轻档、不接语气槽——两档同色相的话打开路径就认不出来了 */
49
49
  --xh-_navigation-menu-highlight-bg: var(--xh-bg-subtle);