@xihan-ui/styles 3.0.0 → 3.2.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 (221) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +1 -1
  3. package/component-tokens.d.ts +29 -0
  4. package/components.tokens.json +683 -27
  5. package/css/alert.css +2 -2
  6. package/css/approval.css +4 -4
  7. package/css/button.css +9 -5
  8. package/css/calendar-picker.css +3 -3
  9. package/css/calendar-range-picker.css +7 -7
  10. package/css/carousel.css +45 -13
  11. package/css/cartesian-chart.css +11 -11
  12. package/css/cascader.css +10 -10
  13. package/css/citation.css +2 -2
  14. package/css/code-view.css +6 -6
  15. package/css/color-picker.css +81 -0
  16. package/css/color-swatch-picker.css +9 -4
  17. package/css/combobox.css +12 -4
  18. package/css/command.css +1 -1
  19. package/css/date-field.css +39 -0
  20. package/css/date-picker.css +86 -9
  21. package/css/date-range-picker.css +47 -7
  22. package/css/diff-view.css +8 -8
  23. package/css/field-array.css +1 -1
  24. package/css/field.css +4 -0
  25. package/css/file-upload.css +1 -1
  26. package/css/float-button.css +140 -27
  27. package/css/form.css +14 -6
  28. package/css/graph-chart.css +2 -2
  29. package/css/highlight.css +1 -1
  30. package/css/image.css +1 -1
  31. package/css/mention.css +1 -1
  32. package/css/message-feed.css +1 -1
  33. package/css/notification.css +26 -20
  34. package/css/number-field.css +18 -18
  35. package/css/page-header.css +2 -2
  36. package/css/password-input.css +2 -2
  37. package/css/popconfirm.css +3 -3
  38. package/css/question-flow.css +8 -8
  39. package/css/radar-chart.css +6 -6
  40. package/css/rating.css +1 -1
  41. package/css/select.css +2 -2
  42. package/css/separator.css +2 -2
  43. package/css/side-nav.css +13 -13
  44. package/css/skeleton.css +5 -5
  45. package/css/slider.css +6 -6
  46. package/css/sortable.css +2 -2
  47. package/css/table.css +19 -2
  48. package/css/tags-input.css +1 -1
  49. package/css/time-picker.css +59 -2
  50. package/css/tool-call.css +7 -7
  51. package/css/tooltip.css +1 -1
  52. package/css/tree-select.css +2 -2
  53. package/css/tree.css +81 -11
  54. package/dist/css/accordion.css +269 -0
  55. package/dist/css/affix.css +47 -0
  56. package/dist/css/alert.css +247 -0
  57. package/dist/css/anchor.css +252 -0
  58. package/dist/css/approval.css +501 -0
  59. package/dist/css/avatar-group.css +99 -0
  60. package/dist/css/avatar.css +98 -0
  61. package/dist/css/back-top.css +161 -0
  62. package/dist/css/badge.css +205 -0
  63. package/dist/css/bar-code.css +62 -0
  64. package/dist/css/breadcrumb.css +230 -0
  65. package/dist/css/button-group.css +263 -0
  66. package/dist/css/button.css +219 -0
  67. package/dist/css/calendar-picker.css +467 -0
  68. package/dist/css/calendar-range-picker.css +554 -0
  69. package/dist/css/card.css +221 -0
  70. package/dist/css/carousel.css +710 -0
  71. package/dist/css/cartesian-chart.css +830 -0
  72. package/dist/css/cascader.css +961 -0
  73. package/dist/css/checkbox-group.css +358 -0
  74. package/dist/css/checkbox.css +257 -0
  75. package/dist/css/citation.css +470 -0
  76. package/dist/css/clipboard.css +315 -0
  77. package/dist/css/code-view.css +374 -0
  78. package/dist/css/collapsible.css +185 -0
  79. package/dist/css/color-field.css +176 -0
  80. package/dist/css/color-picker.css +595 -0
  81. package/dist/css/color-slider.css +281 -0
  82. package/dist/css/color-swatch-picker.css +250 -0
  83. package/dist/css/color-swatch.css +35 -0
  84. package/dist/css/combobox.css +574 -0
  85. package/dist/css/command.css +399 -0
  86. package/dist/css/context-menu.css +420 -0
  87. package/dist/css/date-field.css +317 -0
  88. package/dist/css/date-picker.css +868 -0
  89. package/dist/css/date-range-picker.css +886 -0
  90. package/dist/css/description.css +67 -0
  91. package/dist/css/descriptions.css +299 -0
  92. package/dist/css/dialog.css +455 -0
  93. package/dist/css/diff-view.css +513 -0
  94. package/dist/css/download-trigger.css +151 -0
  95. package/dist/css/drawer.css +552 -0
  96. package/dist/css/editable.css +295 -0
  97. package/dist/css/empty-state.css +163 -0
  98. package/dist/css/field-array.css +226 -0
  99. package/dist/css/field.css +166 -0
  100. package/dist/css/fieldset.css +102 -0
  101. package/dist/css/file-upload.css +429 -0
  102. package/dist/css/flex.css +441 -0
  103. package/dist/css/float-button.css +569 -0
  104. package/dist/css/floating-panel.css +429 -0
  105. package/dist/css/focus.css +46 -0
  106. package/dist/css/forced-colors.css +93 -0
  107. package/dist/css/form.css +393 -0
  108. package/dist/css/funnel-chart.css +106 -0
  109. package/dist/css/graph-chart.css +205 -0
  110. package/dist/css/grid-list.css +235 -0
  111. package/dist/css/grid.css +1201 -0
  112. package/dist/css/heatmap.css +552 -0
  113. package/dist/css/hierarchy-chart.css +298 -0
  114. package/dist/css/highlight.css +41 -0
  115. package/dist/css/hover-card.css +226 -0
  116. package/dist/css/icon.css +225 -0
  117. package/dist/css/image-cropper.css +373 -0
  118. package/dist/css/image-viewer.css +538 -0
  119. package/dist/css/image.css +98 -0
  120. package/dist/css/infinite-scroll.css +77 -0
  121. package/dist/css/input-group.css +275 -0
  122. package/dist/css/json-viewer.css +379 -0
  123. package/dist/css/kbd.css +72 -0
  124. package/dist/css/label.css +78 -0
  125. package/dist/css/layers.css +7 -0
  126. package/dist/css/layout.css +372 -0
  127. package/dist/css/liquid.css +106 -0
  128. package/dist/css/list.css +152 -0
  129. package/dist/css/listbox.css +390 -0
  130. package/dist/css/loading-bar.css +141 -0
  131. package/dist/css/log.css +306 -0
  132. package/dist/css/markdown-stream.css +149 -0
  133. package/dist/css/marquee.css +378 -0
  134. package/dist/css/masonry.css +70 -0
  135. package/dist/css/matrix-code.css +67 -0
  136. package/dist/css/mention.css +393 -0
  137. package/dist/css/menu.css +364 -0
  138. package/dist/css/menubar.css +456 -0
  139. package/dist/css/message-feed.css +318 -0
  140. package/dist/css/navigation-menu.css +513 -0
  141. package/dist/css/notification.css +782 -0
  142. package/dist/css/number-animation.css +44 -0
  143. package/dist/css/number-field.css +252 -0
  144. package/dist/css/overlay-arrow.css +56 -0
  145. package/dist/css/page-header.css +184 -0
  146. package/dist/css/pagination.css +450 -0
  147. package/dist/css/password-input.css +391 -0
  148. package/dist/css/pie-chart.css +247 -0
  149. package/dist/css/pin-input.css +199 -0
  150. package/dist/css/pointer.css +36 -0
  151. package/dist/css/popconfirm.css +320 -0
  152. package/dist/css/popover.css +279 -0
  153. package/dist/css/progress.css +501 -0
  154. package/dist/css/prompt-input.css +260 -0
  155. package/dist/css/question-flow.css +553 -0
  156. package/dist/css/radar-chart.css +233 -0
  157. package/dist/css/radio-group.css +598 -0
  158. package/dist/css/rating.css +294 -0
  159. package/dist/css/reasoning.css +343 -0
  160. package/dist/css/reset.css +117 -0
  161. package/dist/css/resizable.css +242 -0
  162. package/dist/css/sankey-chart.css +174 -0
  163. package/dist/css/scroll-area.css +240 -0
  164. package/dist/css/scrollbar.css +204 -0
  165. package/dist/css/select.css +612 -0
  166. package/dist/css/separator.css +122 -0
  167. package/dist/css/side-nav.css +476 -0
  168. package/dist/css/signature-pad.css +179 -0
  169. package/dist/css/skeleton.css +161 -0
  170. package/dist/css/slider.css +374 -0
  171. package/dist/css/sortable.css +228 -0
  172. package/dist/css/sparkline.css +164 -0
  173. package/dist/css/spinner.css +236 -0
  174. package/dist/css/splitter.css +159 -0
  175. package/dist/css/statistic.css +137 -0
  176. package/dist/css/steps.css +627 -0
  177. package/dist/css/switch.css +351 -0
  178. package/dist/css/table.css +1145 -0
  179. package/dist/css/tabs.css +944 -0
  180. package/dist/css/tag-group.css +247 -0
  181. package/dist/css/tag.css +310 -0
  182. package/dist/css/tags-input.css +322 -0
  183. package/dist/css/text-field.css +197 -0
  184. package/dist/css/time-field.css +277 -0
  185. package/dist/css/time-picker.css +707 -0
  186. package/dist/css/time-range-picker.css +746 -0
  187. package/dist/css/timeline.css +423 -0
  188. package/dist/css/timer.css +123 -0
  189. package/dist/css/timestamp.css +34 -0
  190. package/dist/css/toggle-group.css +424 -0
  191. package/dist/css/toggle.css +146 -0
  192. package/dist/css/tone.css +189 -0
  193. package/dist/css/tool-call.css +429 -0
  194. package/dist/css/toolbar.css +365 -0
  195. package/dist/css/tooltip.css +218 -0
  196. package/dist/css/tour.css +439 -0
  197. package/dist/css/transfer.css +638 -0
  198. package/dist/css/tree-select.css +878 -0
  199. package/dist/css/tree.css +733 -0
  200. package/dist/css/truncate.css +108 -0
  201. package/dist/css/typography.css +472 -0
  202. package/dist/css/undefined.css +58 -0
  203. package/dist/css/virtualizer.css +166 -0
  204. package/dist/css/visually-hidden.css +20 -0
  205. package/dist/css/watermark.css +82 -0
  206. package/dist/family/action-control.css +487 -0
  207. package/dist/family/chart.css +480 -0
  208. package/dist/family/check-mark.css +94 -0
  209. package/dist/family/choice-card.css +97 -0
  210. package/dist/family/collection-item.css +764 -0
  211. package/dist/family/field-chrome.css +287 -0
  212. package/dist/family/loading-ring.css +95 -0
  213. package/dist/family/material.css +72 -0
  214. package/dist/family/menu-choice.css +56 -0
  215. package/dist/family/motion.css +363 -0
  216. package/dist/family/swatch.css +59 -0
  217. package/dist/family/tag-list.css +59 -0
  218. package/family/action-control.css +3 -12
  219. package/index.css +7307 -6759
  220. package/index.unlayered.css +7309 -6761
  221. package/package.json +165 -164
@@ -0,0 +1,393 @@
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
+ /* Mention 独立皮肤同时传递引入字段视觉盒与浮层集合行;full bundle 递归去重。 */
7
+ @import '../family/field-chrome.css';
8
+ @import '../family/collection-item.css';
9
+ @import '../family/loading-ring.css';
10
+
11
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
12
+ @import '../family/motion.css';
13
+ @import '../family/material.css';
14
+
15
+ @layer xihan.components {
16
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
17
+ .xh-scope-mention {
18
+ --xh-mention-skin: 1;
19
+ }
20
+
21
+ /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
22
+ .xh-scope-mention[data-part='positioner'] {
23
+ /* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
24
+ 引擎没算(尚未落位 / 无引擎)时不额外限高 */
25
+ --xh-_mention-available-h: 100vh;
26
+ /* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,行内轴据此夹取;
27
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
28
+ --xh-_mention-available-w: 100vw;
29
+ /* 本层先清空祖先方向,再使用实际落位方向。 */
30
+ --xh-_overlay-enter-up: 0;
31
+ --xh-_overlay-enter-down: 0;
32
+ --xh-_overlay-enter-left: 0;
33
+ --xh-_overlay-enter-right: 0;
34
+
35
+ /* 候选列表的自绘条浮在内容之上:轨道不上底色,实色轨道会在列表右缘糊一条竖灰带 */
36
+ --xh-scrollbar-track-bg: transparent;
37
+
38
+ position: fixed;
39
+ /* listbox 与同级状态文字占同一个格;content 始终是唯一拥有材质的表面。 */
40
+ display: grid;
41
+ z-index: var(--xh-mention-layer, var(--xh-_layer, var(--xh-layer-popover)));
42
+ /* 空壳不吃指针,交互只发生在 content 上 */
43
+ pointer-events: none;
44
+ }
45
+
46
+ /* 输入框被滚出可视区:整个浮层随之收起 */
47
+ .xh-scope-mention[data-part='positioner'][data-hidden] {
48
+ visibility: hidden;
49
+ }
50
+
51
+ .xh-scope-mention[data-part='positioner'][hidden] {
52
+ display: none;
53
+ }
54
+
55
+ /* 进退场按实际落位的物理方向移动,不随书写方向翻转。 */
56
+ .xh-scope-mention[data-part='positioner'][data-placement^='top'] {
57
+ --xh-_overlay-enter-down: 1;
58
+ }
59
+
60
+ .xh-scope-mention[data-part='positioner'][data-placement^='bottom'] {
61
+ --xh-_overlay-enter-up: 1;
62
+ }
63
+
64
+ .xh-scope-mention[data-part='positioner'][data-placement^='left'] {
65
+ --xh-_overlay-enter-right: 1;
66
+ }
67
+
68
+ .xh-scope-mention[data-part='positioner'][data-placement^='right'] {
69
+ --xh-_overlay-enter-left: 1;
70
+ }
71
+
72
+ /* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
73
+ .xh-scope-mention:is([data-part='root'], [data-part='positioner']) {
74
+ /* 尺寸档只换这六个私有槽,输入框与候选都从这两处继承它们,换档不必给每个部件各写一条选择器 */
75
+ --xh-_mention-h: var(--xh-control-h-md);
76
+ --xh-_mention-px: var(--xh-control-px-md);
77
+ --xh-_mention-item-py: var(--xh-list-option-py-md);
78
+ --xh-_mention-item-px: var(--xh-control-px-md);
79
+ --xh-_mention-gap: var(--xh-control-gap-md);
80
+ --xh-_mention-font-size: var(--xh-control-font-md);
81
+ }
82
+
83
+ .xh-scope-mention[data-part='root'] {
84
+ display: block;
85
+
86
+ /* 不传尺寸时一律这么宽,宽度不随内容走;父容器给不出这么宽时整件跟着收,地板同步让步,不越出父容器。
87
+ 地板不高过缺省宽:使用者把缺省宽钉到底线以下时不必再放开底线 */
88
+ inline-size: var(--xh-mention-input-w, var(--xh-control-w));
89
+ min-inline-size: min(var(--xh-mention-input-w, var(--xh-control-w)), var(--xh-mention-input-min-w, var(--xh-control-min-w)), 100%);
90
+ max-inline-size: 100%;
91
+ }
92
+
93
+ /* 只要声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
94
+ .xh-scope-mention[data-part='root'][hidden] {
95
+ display: none;
96
+ }
97
+
98
+ /* 标题:与输入框上下排,行距不留额外空白 */
99
+ .xh-scope-mention[data-part='label'] {
100
+ display: block;
101
+ margin-block-end: var(--xh-mention-label-gap, var(--xh-space-1));
102
+ color: var(--xh-mention-label-fg, var(--xh-fg-default));
103
+ font-size: var(--xh-mention-label-font-size, var(--xh-text-label-size));
104
+ font-weight: var(--xh-mention-label-font-weight, var(--xh-text-label-weight));
105
+ line-height: var(--xh-leading-none);
106
+ }
107
+
108
+ .xh-scope-mention[data-part='label'][hidden] {
109
+ display: none;
110
+ }
111
+
112
+ .xh-scope-mention[data-part='label'][data-disabled] {
113
+ color: var(--xh-mention-label-fg-disabled, var(--xh-fg-subtle));
114
+ }
115
+
116
+ /* —— 尺寸 —— */
117
+ /* 缺省档写在上面的基础规则里 */
118
+ .xh-scope-mention:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
119
+ --xh-_mention-h: var(--xh-control-h-sm);
120
+ --xh-_mention-px: var(--xh-control-px-sm);
121
+ --xh-_mention-item-py: var(--xh-list-option-py-sm);
122
+ --xh-_mention-item-px: var(--xh-control-px-sm);
123
+ --xh-_mention-gap: var(--xh-control-gap-sm);
124
+ --xh-_mention-font-size: var(--xh-control-font-sm);
125
+ }
126
+
127
+ .xh-scope-mention:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
128
+ --xh-_mention-h: var(--xh-control-h-lg);
129
+ --xh-_mention-px: var(--xh-control-px-lg);
130
+ --xh-_mention-item-py: var(--xh-list-option-py-lg);
131
+ --xh-_mention-item-px: var(--xh-control-px-lg);
132
+ --xh-_mention-gap: var(--xh-control-gap-lg);
133
+ --xh-_mention-font-size: var(--xh-control-font-lg);
134
+ }
135
+
136
+ /* 框与聚焦环都长在输入框自己身上:这里没有把输入框和别的控件裹成一体的输入行,
137
+ 整个组件在视觉上就是这一个可打字的方框。描边、底色、圆角、聚焦环、五态与悬停由 Field Chrome
138
+ 家族画在它身上(自身聚焦同样命中家族的 :focus-within);组件只映射既有公开槽。
139
+ 家族 chrome 不设字号,输入框的字号仍由本皮肤给;形态三档由家族按 data-variant 生成 */
140
+ .xh-scope-mention[data-part='input'] {
141
+ --xh-field-control-height: var(--xh-mention-input-h, var(--xh-_mention-h));
142
+ --xh-field-control-padding-inline: var(--xh-mention-input-px, var(--xh-_mention-px));
143
+ --xh-field-control-gap: 0;
144
+ --xh-field-control-min-inline-size: var(--xh-mention-input-min-w, var(--xh-control-min-w));
145
+ --xh-field-control-radius: var(--xh-mention-input-radius, var(--xh-shape-control));
146
+ --xh-field-bg-rest: var(--xh-mention-input-bg, var(--xh-_field-variant-bg-rest));
147
+ --xh-field-bg-hover: var(--xh-mention-input-bg-hover, var(--xh-_field-variant-bg-hover));
148
+ --xh-field-bg-read-only: var(--xh-mention-input-bg-readonly, var(--xh-_field-variant-bg-read-only));
149
+ --xh-field-bg-disabled: var(--xh-mention-input-bg-disabled, var(--xh-_field-variant-bg-disabled));
150
+ --xh-field-fg-rest: var(--xh-mention-input-fg, var(--xh-fg-default));
151
+ --xh-field-border-rest: var(--xh-mention-input-border, var(--xh-_field-variant-border-rest));
152
+ --xh-field-border-hover: var(--xh-mention-input-border-hover, var(--xh-_field-variant-border-hover));
153
+ --xh-field-border-focus: var(--xh-mention-input-border-focus, var(--xh-_field-variant-border-focus));
154
+ --xh-field-border-invalid: var(--xh-mention-input-border-invalid, var(--xh-_field-variant-border-invalid));
155
+ --xh-field-ring-focus: var(--xh-ring-focus);
156
+ --xh-field-ring-invalid: var(--xh-ring-invalid);
157
+ --xh-field-shadow-rest: var(--xh-mention-input-shadow, none);
158
+
159
+ inline-size: 100%;
160
+ /* 表单控件不继承页面字体,只给字号会让输入框用 UA 默认字族,与周围文本对不上 */
161
+ font-family: inherit;
162
+ font-size: var(--xh-mention-input-font-size, var(--xh-_mention-font-size));
163
+ line-height: var(--xh-leading-normal);
164
+ }
165
+
166
+ .xh-scope-mention[data-part='input'][hidden] {
167
+ display: none;
168
+ }
169
+
170
+ /* 多行形态:正文可以换行,框随 rows 定起始高度、不钉单行控件高(家族的多行布局给);
171
+ 框自己就是 chrome,家族多行布局把上下内衬归零,这里按文本字段多行档同一支令牌补回,只许纵向拉伸 */
172
+ .xh-scope-mention[data-part='input'][data-xh-field-layout='textarea'] {
173
+ padding-block: var(--xh-mention-textarea-py, var(--xh-space-2));
174
+ resize: vertical;
175
+ }
176
+
177
+ /* 输入框自身即 chrome,家族按 data-xh-field-input 给的占位色命不中它,占位色仍由本皮肤给 */
178
+ .xh-scope-mention[data-part='input']::placeholder {
179
+ color: var(--xh-mention-placeholder-fg, var(--xh-fg-subtle));
180
+ }
181
+
182
+ /* 自动填充:引擎给填过的框强加一套系统色(多数是黄底黑字),盖得过 background 与 color,
183
+ 深色档下就剩一个不跟主题走的黄框。底改用 inset 阴影铺回来,扩散量 100vmax 填满内容盒;
184
+ 字改用 -webkit-text-fill-color 接回来,那是这个态下唯一还听样式表的前景通道。
185
+ 不去拉长 transition 把系统底推迟显现:那只是把它藏起来,减弱动效通道一关过渡就当场露出。
186
+ 两个选择器名分写两条:一条选择器列表里只要有一个名字不被认识,整条规则就被丢弃。
187
+ 家族按 data-xh-field-input 给的两条命不中自身即 chrome 的输入框,这里自写;底取不透明的面令牌,
188
+ ghost 档下透明底铺了等于没铺。描边式静息无影,不再叠落影 */
189
+ .xh-scope-mention[data-part='input']:autofill {
190
+ box-shadow: inset 0 0 0 100vmax var(--xh-mention-input-autofill-bg, var(--xh-bg-canvas));
191
+ -webkit-text-fill-color: var(--xh-mention-input-autofill-fg, var(--xh-fg-default));
192
+ }
193
+
194
+ .xh-scope-mention[data-part='input']:-webkit-autofill {
195
+ box-shadow: inset 0 0 0 100vmax var(--xh-mention-input-autofill-bg, var(--xh-bg-canvas));
196
+ -webkit-text-fill-color: var(--xh-mention-input-autofill-fg, var(--xh-fg-default));
197
+ }
198
+
199
+ .xh-scope-mention[data-part='content'] {
200
+ /* 材质由家族配方画(family/material.css 的 frosted 面:描边、底、1px 顶光、前景、投影与背景滤镜),
201
+ 这里只把使用者槽接进来 */
202
+ --xh-frosted-bg: var(--xh-mention-content-bg, var(--xh-_material-bg));
203
+ --xh-frosted-border: var(--xh-mention-content-border, var(--xh-_material-border));
204
+ --xh-frosted-fg: var(--xh-mention-content-fg, var(--xh-_material-fg));
205
+ --xh-frosted-shadow: var(--xh-mention-content-shadow, var(--xh-_material-shadow));
206
+ --xh-frosted-backdrop: var(--xh-mention-content-backdrop, var(--xh-_material-backdrop));
207
+ --xh-frosted-highlight: var(--xh-mention-content-highlight, var(--xh-_material-highlight));
208
+
209
+ position: relative;
210
+ display: flex;
211
+ flex-direction: column;
212
+ gap: var(--xh-mention-content-gap, var(--xh-list-option-gap));
213
+ grid-area: 1 / 1;
214
+ min-inline-size: min(var(--xh-mention-content-min-w, var(--xh-overlay-min-w)), var(--xh-_mention-available-w));
215
+ /* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的内容就点不到了 */
216
+ max-inline-size: min(var(--xh-mention-content-max-w, var(--xh-overlay-max-w)), var(--xh-_mention-available-w));
217
+ /* 状态文字先隐藏时仍保留完整退场面,不塌回一条空边。 */
218
+ min-block-size: var(--xh-mention-content-min-h, var(--xh-_mention-h));
219
+ max-block-size: min(var(--xh-mention-content-max-h, var(--xh-overlay-max-h)), var(--xh-_mention-available-h));
220
+ padding-block: var(--xh-mention-content-py, var(--xh-space-1));
221
+ padding-inline: var(--xh-mention-content-px, var(--xh-space-1));
222
+ border-radius: var(--xh-mention-content-radius, var(--xh-shape-overlay));
223
+ overflow-y: auto;
224
+ /* 浮层滚动面:滚到头不把页面一起带走 */
225
+ overscroll-behavior: contain;
226
+ pointer-events: auto;
227
+ }
228
+
229
+ /* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
230
+ 收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
231
+ [hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
232
+ 真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
233
+ 其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
234
+
235
+ /* 列表从不承载焦点(焦点恒在输入框,高亮走 aria-activedescendant),
236
+ 可滚动容器在某些浏览器里会被自动塞进 Tab 序列,落焦时不画环 */
237
+ .xh-scope-mention[data-part='content']:focus-visible {
238
+ outline: none;
239
+ }
240
+
241
+ .xh-scope-mention[data-part='content'][data-state='open'] {
242
+ animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
243
+ }
244
+
245
+ /* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
246
+ 免得动画结束到真收起之间闪一下原样 */
247
+ .xh-scope-mention[data-part='content'][data-state='closed'] {
248
+ animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
249
+ }
250
+
251
+ /* 候选行:网格、尺寸档、悬停 / 高亮 100、按下 200 与禁用面由 Collection Item 家族按 overlay 语境给,
252
+ 公开 Mention 槽只映射到家族合同。提及即选即执行,aria-selected 只标当前高亮那一条:
253
+ overlay 语境的选中面透明,高亮与悬停同走 --xh-bg-subtle,正文保持常规字重 */
254
+ .xh-scope-mention[data-part='item'] {
255
+ --xh-collection-block-padding: var(--xh-mention-item-py, var(--xh-_mention-item-py));
256
+ --xh-collection-inline-padding: var(--xh-mention-item-px, var(--xh-_mention-item-px));
257
+ --xh-collection-gap: var(--xh-mention-item-gap, var(--xh-_mention-gap));
258
+ --xh-collection-font-size: var(--xh-mention-item-font-size, var(--xh-_mention-font-size));
259
+ --xh-collection-radius: var(--xh-mention-item-radius, var(--xh-shape-inset));
260
+ --xh-collection-fg-rest: var(--xh-mention-item-fg, var(--xh-material-frosted-fg));
261
+ --xh-collection-fg-hover: var(--xh-mention-item-fg, var(--xh-material-frosted-fg));
262
+ --xh-collection-fg-keyboard-highlight: var(--xh-mention-item-fg, var(--xh-material-frosted-fg));
263
+ --xh-collection-fg-selected: var(--xh-mention-item-fg, var(--xh-material-frosted-fg));
264
+ --xh-collection-fg-selected-highlight: var(--xh-mention-item-fg, var(--xh-material-frosted-fg));
265
+ --xh-collection-fg-selected-hover: var(--xh-mention-item-fg, var(--xh-material-frosted-fg));
266
+ --xh-collection-fg-selected-pressed: var(--xh-mention-item-fg, var(--xh-material-frosted-fg));
267
+ --xh-collection-fg-pressed: var(--xh-mention-item-fg, var(--xh-material-frosted-fg));
268
+ --xh-collection-font-weight-selected: var(--xh-font-weight-regular);
269
+ --xh-collection-font-weight-selected-highlight: var(--xh-font-weight-regular);
270
+ --xh-collection-font-weight-selected-hover: var(--xh-font-weight-regular);
271
+ --xh-collection-font-weight-selected-pressed: var(--xh-font-weight-regular);
272
+ --xh-collection-bg-hover: var(--xh-mention-item-bg-hover, var(--xh-bg-subtle));
273
+ --xh-collection-bg-keyboard-highlight: var(--xh-mention-item-bg-hover, var(--xh-bg-subtle));
274
+ --xh-collection-bg-selected-highlight: var(--xh-mention-item-bg-hover, var(--xh-bg-subtle));
275
+ --xh-collection-bg-selected-hover: var(--xh-mention-item-bg-hover, var(--xh-bg-subtle));
276
+ --xh-collection-bg-pressed: var(--xh-mention-item-bg-pressed, var(--xh-bg-subtle-hover));
277
+ --xh-collection-bg-selected-pressed: var(--xh-mention-item-bg-pressed, var(--xh-bg-subtle-hover));
278
+ /* data-highlighted 同时覆盖指针与键盘路径;焦点恒在输入框,候选不接环 */
279
+ --xh-collection-outline-keyboard-highlight: transparent;
280
+ --xh-collection-outline-selected-highlight: transparent;
281
+
282
+ /* 行高留出文字的上下伸展空间,行内那层 overflow:hidden 才不会把字削掉 */
283
+ line-height: var(--xh-mention-item-leading, var(--xh-leading-normal));
284
+ white-space: nowrap;
285
+ user-select: none;
286
+ }
287
+
288
+ /* 家族给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
289
+ .xh-scope-mention[data-part='item'][hidden] {
290
+ display: none;
291
+ }
292
+
293
+ /* 只读时正文插不进东西,候选也就不该再摆出可点的样子。
294
+ 标记读定位层那一份:候选被搬到 portal 落点,根上的只读标记够不着它们。
295
+ 排掉禁用条目是因为这条选择器权重高过上面那条,不排就会把 not-allowed 覆盖回 default */
296
+ .xh-scope-mention[data-part='positioner'][data-readonly]
297
+ [data-part='item']:where(.xh-scope-mention):not([data-disabled]) {
298
+ cursor: default;
299
+ }
300
+
301
+ /* 正文落在家族网格的 text 列;网格项默认最小尺寸是内容尺寸,不归零则长文本把行撑破、省略号轮不上 */
302
+ .xh-scope-mention[data-part='item-text'] {
303
+ min-inline-size: 0;
304
+ overflow: hidden;
305
+ white-space: nowrap;
306
+ text-overflow: ellipsis;
307
+ }
308
+
309
+ .xh-scope-mention[data-part='item-text'][hidden] {
310
+ display: none;
311
+ }
312
+
313
+
314
+
315
+ /* 空态保持为 listbox 的同级 role=status,只把文字叠到 content 的唯一表面。 */
316
+ .xh-scope-mention[data-part='empty'] {
317
+ /* 同级定位保证状态文字绘制在磨砂 content 上方,不需要额外层号。 */
318
+ position: relative;
319
+ display: flex;
320
+ align-items: center;
321
+ justify-content: center;
322
+ grid-area: 1 / 1;
323
+ padding-block: var(--xh-mention-empty-py, var(--xh-space-3));
324
+ padding-inline: var(--xh-mention-empty-px, var(--xh-_mention-item-px));
325
+ color: var(--xh-mention-empty-fg, var(--xh-material-frosted-fg-muted));
326
+ font-size: var(--xh-mention-empty-font-size, var(--xh-_mention-font-size));
327
+ line-height: var(--xh-leading-none);
328
+ text-align: center;
329
+ }
330
+
331
+ .xh-scope-mention[data-part='empty'][hidden] {
332
+ display: none;
333
+ }
334
+
335
+ /* 在途占位与空态同格、两者不同屏;它同样不重复绘制表面。 */
336
+ .xh-scope-mention[data-part='loading'] {
337
+ position: relative;
338
+ display: flex;
339
+ align-items: center;
340
+ justify-content: center;
341
+ gap: var(--xh-_mention-gap);
342
+ grid-area: 1 / 1;
343
+ padding-block: var(--xh-mention-loading-py, var(--xh-space-3));
344
+ padding-inline: var(--xh-mention-loading-px, var(--xh-_mention-item-px));
345
+ color: var(--xh-mention-loading-fg, var(--xh-material-frosted-fg-muted));
346
+ font-size: var(--xh-mention-loading-font-size, var(--xh-_mention-font-size));
347
+ line-height: var(--xh-leading-none);
348
+ text-align: center;
349
+ }
350
+
351
+ .xh-scope-mention[data-part='loading'][hidden] {
352
+ display: none;
353
+ }
354
+
355
+ /* 首次加载:文案前一枚加载环,由加载环配方画(连接层投影 data-xh-loading-ring 与 data-loading),
356
+ 直径取所在尺寸档的图标档 */
357
+ .xh-scope-mention[data-part='loading']::before {
358
+ content: '';
359
+ flex: none;
360
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
361
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
362
+ }
363
+
364
+ .xh-scope-mention[data-part='empty']:empty,
365
+ .xh-scope-mention[data-part='loading']:empty {
366
+ display: none;
367
+ }
368
+
369
+ /* 刷新:已有候选时后台在取,保留上一帧,候选按 micro 淡下,数据到了再淡回;在途占位此时让位。
370
+ 淡的是候选不是面:content 是整块磨砂面,整块淡下去面就透了 */
371
+ .xh-scope-mention[data-part='content'][aria-busy='true'] .xh-scope-mention[data-part='item'] {
372
+ opacity: var(--xh-state-disabled-opacity);
373
+ }
374
+
375
+ /* 手写结构可以把全部候选留在 DOM 里只加 hidden;没有可见 item 也没有状态文案时,
376
+ 打开的空 listbox 不画无意义框。closed 不命中,content 仍能完成 Presence 退场。 */
377
+ .xh-scope-mention[data-part='positioner']:not(:has(
378
+ > .xh-scope-mention[data-part='empty']:not([hidden]):not(:empty),
379
+ > .xh-scope-mention[data-part='loading']:not([hidden]):not(:empty)
380
+ )) > .xh-scope-mention[data-part='content'][data-state='open']:not(:has(
381
+ > .xh-scope-mention[data-part='item']:not([hidden])
382
+ )) {
383
+ visibility: hidden;
384
+ }
385
+
386
+ @media print {
387
+ /* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
388
+ 收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
389
+ .xh-scope-mention[data-part='positioner'] {
390
+ display: none;
391
+ }
392
+ }
393
+ }