@xihan-ui/styles 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/CHANGELOG.md +470 -0
  2. package/component-tokens.d.ts +230 -60
  3. package/components.tokens.json +5156 -1557
  4. package/css/accordion.css +47 -20
  5. package/css/alert.css +16 -17
  6. package/css/anchor.css +2 -2
  7. package/css/approval.css +41 -17
  8. package/css/avatar-group.css +9 -12
  9. package/css/avatar.css +20 -18
  10. package/css/back-top.css +21 -7
  11. package/css/badge.css +5 -5
  12. package/css/breadcrumb.css +18 -16
  13. package/css/button-group.css +4 -6
  14. package/css/button.css +13 -12
  15. package/css/calendar-picker.css +178 -95
  16. package/css/calendar-range-picker.css +207 -122
  17. package/css/card.css +34 -6
  18. package/css/carousel.css +94 -46
  19. package/css/cartesian-chart.css +11 -11
  20. package/css/cascader.css +51 -39
  21. package/css/checkbox-group.css +9 -6
  22. package/css/checkbox.css +5 -4
  23. package/css/citation.css +9 -4
  24. package/css/clipboard.css +20 -4
  25. package/css/code-view.css +6 -6
  26. package/css/collapsible.css +29 -14
  27. package/css/color-field.css +4 -4
  28. package/css/color-picker.css +77 -23
  29. package/css/color-slider.css +10 -8
  30. package/css/color-swatch-picker.css +14 -9
  31. package/css/combobox.css +26 -14
  32. package/css/command.css +14 -9
  33. package/css/context-menu.css +10 -5
  34. package/css/date-field.css +12 -6
  35. package/css/date-picker.css +178 -109
  36. package/css/date-range-picker.css +199 -130
  37. package/css/description.css +10 -6
  38. package/css/descriptions.css +47 -19
  39. package/css/dialog.css +50 -35
  40. package/css/diff-view.css +8 -8
  41. package/css/drawer.css +75 -21
  42. package/css/editable.css +15 -41
  43. package/css/empty-state.css +21 -3
  44. package/css/field-array.css +5 -2
  45. package/css/field.css +17 -18
  46. package/css/fieldset.css +33 -13
  47. package/css/file-upload.css +66 -33
  48. package/css/float-button.css +60 -35
  49. package/css/floating-panel.css +1 -1
  50. package/css/form.css +30 -16
  51. package/css/graph-chart.css +2 -2
  52. package/css/grid-list.css +1 -1
  53. package/css/highlight.css +5 -5
  54. package/css/hover-card.css +19 -12
  55. package/css/image-viewer.css +77 -27
  56. package/css/image.css +13 -5
  57. package/css/infinite-scroll.css +8 -4
  58. package/css/input-group.css +74 -26
  59. package/css/kbd.css +1 -1
  60. package/css/label.css +27 -11
  61. package/css/layout.css +17 -10
  62. package/css/list.css +13 -9
  63. package/css/listbox.css +12 -7
  64. package/css/loading-bar.css +3 -0
  65. package/css/mention.css +11 -9
  66. package/css/menu.css +10 -5
  67. package/css/menubar.css +13 -8
  68. package/css/message-feed.css +1 -1
  69. package/css/navigation-menu.css +2 -2
  70. package/css/notification.css +132 -49
  71. package/css/number-animation.css +2 -2
  72. package/css/number-field.css +75 -52
  73. package/css/page-header.css +64 -27
  74. package/css/pagination.css +35 -38
  75. package/css/password-input.css +12 -68
  76. package/css/pin-input.css +18 -26
  77. package/css/popconfirm.css +23 -14
  78. package/css/popover.css +18 -12
  79. package/css/progress.css +14 -13
  80. package/css/prompt-input.css +3 -3
  81. package/css/question-flow.css +41 -15
  82. package/css/radar-chart.css +6 -6
  83. package/css/radio-group.css +120 -55
  84. package/css/rating.css +32 -15
  85. package/css/select.css +16 -12
  86. package/css/separator.css +24 -6
  87. package/css/side-nav.css +29 -24
  88. package/css/signature-pad.css +23 -9
  89. package/css/skeleton.css +12 -12
  90. package/css/slider.css +77 -48
  91. package/css/sortable.css +2 -2
  92. package/css/sparkline.css +8 -2
  93. package/css/spinner.css +40 -20
  94. package/css/statistic.css +14 -14
  95. package/css/steps.css +115 -84
  96. package/css/switch.css +9 -7
  97. package/css/table.css +29 -12
  98. package/css/tabs.css +35 -12
  99. package/css/tag-group.css +17 -6
  100. package/css/tag.css +54 -29
  101. package/css/tags-input.css +39 -20
  102. package/css/text-field.css +5 -5
  103. package/css/time-field.css +4 -4
  104. package/css/time-picker.css +150 -64
  105. package/css/time-range-picker.css +91 -62
  106. package/css/timeline.css +37 -20
  107. package/css/timer.css +3 -3
  108. package/css/toggle-group.css +4 -4
  109. package/css/tool-call.css +13 -11
  110. package/css/toolbar.css +6 -5
  111. package/css/tooltip.css +16 -17
  112. package/css/tour.css +14 -7
  113. package/css/transfer.css +22 -16
  114. package/css/tree-select.css +12 -12
  115. package/css/tree.css +26 -25
  116. package/css/typography.css +28 -25
  117. package/dist/css/accordion.css +296 -0
  118. package/dist/css/affix.css +47 -0
  119. package/dist/css/alert.css +246 -0
  120. package/dist/css/anchor.css +252 -0
  121. package/dist/css/approval.css +525 -0
  122. package/dist/css/avatar-group.css +96 -0
  123. package/dist/css/avatar.css +100 -0
  124. package/dist/css/back-top.css +175 -0
  125. package/dist/css/badge.css +205 -0
  126. package/dist/css/bar-code.css +62 -0
  127. package/dist/css/breadcrumb.css +232 -0
  128. package/dist/css/button-group.css +261 -0
  129. package/dist/css/button.css +216 -0
  130. package/dist/css/calendar-picker.css +550 -0
  131. package/dist/css/calendar-range-picker.css +639 -0
  132. package/dist/css/card.css +249 -0
  133. package/dist/css/carousel.css +726 -0
  134. package/dist/css/cartesian-chart.css +830 -0
  135. package/dist/css/cascader.css +973 -0
  136. package/dist/css/checkbox-group.css +361 -0
  137. package/dist/css/checkbox.css +258 -0
  138. package/dist/css/citation.css +475 -0
  139. package/dist/css/clipboard.css +331 -0
  140. package/dist/css/code-view.css +374 -0
  141. package/dist/css/collapsible.css +200 -0
  142. package/dist/css/color-field.css +176 -0
  143. package/dist/css/color-picker.css +649 -0
  144. package/dist/css/color-slider.css +283 -0
  145. package/dist/css/color-swatch-picker.css +250 -0
  146. package/dist/css/color-swatch.css +35 -0
  147. package/dist/css/combobox.css +578 -0
  148. package/dist/css/command.css +404 -0
  149. package/dist/css/context-menu.css +425 -0
  150. package/dist/css/date-field.css +317 -0
  151. package/dist/css/date-picker.css +931 -0
  152. package/dist/css/date-range-picker.css +949 -0
  153. package/dist/css/description.css +71 -0
  154. package/dist/css/descriptions.css +327 -0
  155. package/dist/css/dialog.css +470 -0
  156. package/dist/css/diff-view.css +513 -0
  157. package/dist/css/download-trigger.css +151 -0
  158. package/dist/css/drawer.css +606 -0
  159. package/dist/css/editable.css +269 -0
  160. package/dist/css/empty-state.css +181 -0
  161. package/dist/css/field-array.css +229 -0
  162. package/dist/css/field.css +165 -0
  163. package/dist/css/fieldset.css +122 -0
  164. package/dist/css/file-upload.css +462 -0
  165. package/dist/css/flex.css +441 -0
  166. package/dist/css/float-button.css +579 -0
  167. package/dist/css/floating-panel.css +429 -0
  168. package/dist/css/focus.css +46 -0
  169. package/dist/css/forced-colors.css +93 -0
  170. package/dist/css/form.css +407 -0
  171. package/dist/css/funnel-chart.css +106 -0
  172. package/dist/css/graph-chart.css +205 -0
  173. package/dist/css/grid-list.css +235 -0
  174. package/dist/css/grid.css +1201 -0
  175. package/dist/css/heatmap.css +552 -0
  176. package/dist/css/hierarchy-chart.css +298 -0
  177. package/dist/css/highlight.css +41 -0
  178. package/dist/css/hover-card.css +233 -0
  179. package/dist/css/icon.css +225 -0
  180. package/dist/css/image-cropper.css +373 -0
  181. package/dist/css/image-viewer.css +588 -0
  182. package/dist/css/image.css +106 -0
  183. package/dist/css/infinite-scroll.css +81 -0
  184. package/dist/css/input-group.css +323 -0
  185. package/dist/css/json-viewer.css +379 -0
  186. package/dist/css/kbd.css +72 -0
  187. package/dist/css/label.css +94 -0
  188. package/dist/css/layers.css +7 -0
  189. package/dist/css/layout.css +379 -0
  190. package/dist/css/liquid.css +106 -0
  191. package/dist/css/list.css +156 -0
  192. package/dist/css/listbox.css +395 -0
  193. package/dist/css/loading-bar.css +144 -0
  194. package/dist/css/log.css +306 -0
  195. package/dist/css/markdown-stream.css +149 -0
  196. package/dist/css/marquee.css +378 -0
  197. package/dist/css/masonry.css +70 -0
  198. package/dist/css/matrix-code.css +67 -0
  199. package/dist/css/mention.css +395 -0
  200. package/dist/css/menu.css +369 -0
  201. package/dist/css/menubar.css +461 -0
  202. package/dist/css/message-feed.css +318 -0
  203. package/dist/css/navigation-menu.css +513 -0
  204. package/dist/css/notification.css +865 -0
  205. package/dist/css/number-animation.css +44 -0
  206. package/dist/css/number-field.css +275 -0
  207. package/dist/css/overlay-arrow.css +56 -0
  208. package/dist/css/page-header.css +221 -0
  209. package/dist/css/pagination.css +447 -0
  210. package/dist/css/password-input.css +335 -0
  211. package/dist/css/pie-chart.css +247 -0
  212. package/dist/css/pin-input.css +191 -0
  213. package/dist/css/pointer.css +36 -0
  214. package/dist/css/popconfirm.css +329 -0
  215. package/dist/css/popover.css +285 -0
  216. package/dist/css/progress.css +502 -0
  217. package/dist/css/prompt-input.css +260 -0
  218. package/dist/css/question-flow.css +579 -0
  219. package/dist/css/radar-chart.css +233 -0
  220. package/dist/css/radio-group.css +663 -0
  221. package/dist/css/rating.css +311 -0
  222. package/dist/css/reasoning.css +343 -0
  223. package/dist/css/reset.css +117 -0
  224. package/dist/css/resizable.css +242 -0
  225. package/dist/css/sankey-chart.css +174 -0
  226. package/dist/css/scroll-area.css +240 -0
  227. package/dist/css/scrollbar.css +204 -0
  228. package/dist/css/select.css +616 -0
  229. package/dist/css/separator.css +140 -0
  230. package/dist/css/side-nav.css +481 -0
  231. package/dist/css/signature-pad.css +193 -0
  232. package/dist/css/skeleton.css +161 -0
  233. package/dist/css/slider.css +403 -0
  234. package/dist/css/sortable.css +228 -0
  235. package/dist/css/sparkline.css +170 -0
  236. package/dist/css/spinner.css +256 -0
  237. package/dist/css/splitter.css +159 -0
  238. package/dist/css/statistic.css +137 -0
  239. package/dist/css/steps.css +658 -0
  240. package/dist/css/switch.css +353 -0
  241. package/dist/css/table.css +1162 -0
  242. package/dist/css/tabs.css +967 -0
  243. package/dist/css/tag-group.css +258 -0
  244. package/dist/css/tag.css +335 -0
  245. package/dist/css/tags-input.css +341 -0
  246. package/dist/css/text-field.css +197 -0
  247. package/dist/css/time-field.css +277 -0
  248. package/dist/css/time-picker.css +793 -0
  249. package/dist/css/time-range-picker.css +775 -0
  250. package/dist/css/timeline.css +440 -0
  251. package/dist/css/timer.css +123 -0
  252. package/dist/css/timestamp.css +34 -0
  253. package/dist/css/toggle-group.css +424 -0
  254. package/dist/css/toggle.css +146 -0
  255. package/dist/css/tone.css +189 -0
  256. package/dist/css/tool-call.css +431 -0
  257. package/dist/css/toolbar.css +366 -0
  258. package/dist/css/tooltip.css +217 -0
  259. package/dist/css/tour.css +446 -0
  260. package/dist/css/transfer.css +644 -0
  261. package/dist/css/tree-select.css +878 -0
  262. package/dist/css/tree.css +734 -0
  263. package/dist/css/truncate.css +108 -0
  264. package/dist/css/typography.css +475 -0
  265. package/dist/css/undefined.css +58 -0
  266. package/dist/css/virtualizer.css +166 -0
  267. package/dist/css/visually-hidden.css +20 -0
  268. package/dist/css/watermark.css +82 -0
  269. package/dist/family/action-control.css +493 -0
  270. package/dist/family/chart.css +537 -0
  271. package/dist/family/check-mark.css +94 -0
  272. package/dist/family/choice-card.css +97 -0
  273. package/dist/family/collection-item.css +768 -0
  274. package/dist/family/field-chrome.css +296 -0
  275. package/dist/family/loading-ring.css +102 -0
  276. package/dist/family/material.css +72 -0
  277. package/dist/family/menu-choice.css +56 -0
  278. package/dist/family/motion.css +363 -0
  279. package/dist/family/swatch.css +59 -0
  280. package/dist/family/tag-list.css +65 -0
  281. package/family/action-control.css +33 -36
  282. package/family/chart.css +57 -0
  283. package/family/collection-item.css +12 -8
  284. package/family/field-chrome.css +28 -19
  285. package/family/loading-ring.css +20 -13
  286. package/family/swatch.css +4 -4
  287. package/family/tag-list.css +6 -0
  288. package/index.css +10349 -8756
  289. package/index.unlayered.css +10350 -8758
  290. package/package.json +165 -164
@@ -0,0 +1,285 @@
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
+ /* 定义 popover 样式。 */
7
+
8
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
9
+ @import '../family/motion.css';
10
+ @import '../family/action-control.css';
11
+ @import '../family/material.css';
12
+
13
+ @layer xihan.components {
14
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
15
+ .xh-scope-popover {
16
+ --xh-popover-skin: 1;
17
+ }
18
+
19
+ /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
20
+ .xh-scope-popover[data-part='positioner'] {
21
+ /* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
22
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时不额外限高 */
23
+ --xh-_popover-available-h: 100vh;
24
+ /* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,行内轴据此夹取;
25
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
26
+ --xh-_popover-available-w: 100vw;
27
+
28
+ /* 面板内容的自绘条浮在内容之上:轨道不上底色,实色轨道会在面板右缘糊一条竖灰带 */
29
+ --xh-scrollbar-track-bg: transparent;
30
+
31
+ position: fixed;
32
+ z-index: var(--xh-popover-layer, var(--xh-_layer, var(--xh-layer-popover)));
33
+ /* 空壳不吃指针,交互只发生在 content 上 */
34
+ pointer-events: none;
35
+ }
36
+
37
+ /* 锚点被滚出可视区:整个浮层随之收起 */
38
+ .xh-scope-popover[data-part='positioner'][data-hidden] {
39
+ visibility: hidden;
40
+ }
41
+
42
+ /* 缩放原点与进场位移按落定的那一侧给:面板从贴着锚点的那条边涨开、沿主轴退让一小段。
43
+ 两个槽由 content 继承。placement 是物理方向(引擎按 top / right / bottom / left 出值),
44
+ origin 与 translate 也是物理量,两边同轴,不随书写方向翻 */
45
+ .xh-scope-popover[data-part='positioner'][data-placement^='top'] {
46
+ --xh-_overlay-origin-y: 100%;
47
+ --xh-_overlay-enter-down: 1;
48
+ }
49
+
50
+ .xh-scope-popover[data-part='positioner'][data-placement^='bottom'] {
51
+ --xh-_overlay-origin-y: 0;
52
+ --xh-_overlay-enter-up: 1;
53
+ }
54
+
55
+ .xh-scope-popover[data-part='positioner'][data-placement^='left'] {
56
+ --xh-_overlay-origin-x: 100%;
57
+ --xh-_overlay-enter-right: 1;
58
+ }
59
+
60
+ .xh-scope-popover[data-part='positioner'][data-placement^='right'] {
61
+ --xh-_overlay-origin-x: 0;
62
+ --xh-_overlay-enter-left: 1;
63
+ }
64
+
65
+ /* 交叉轴原点按对齐取:start / end 对齐时面板与锚点在那一端齐平,缩放从那一端涨开,贴着小触发器的面板
66
+ 才像是从触发器里长出来;居中对齐留在中线。上下两侧的 start / end 是行内轴上的逻辑对齐,RTL 下起始缘在右;
67
+ 左右两侧的 start / end 落在块轴上,不随书写方向翻 */
68
+ /* 起始缘与末尾缘按就近的书写方向取:LTR 起始在左,RTL 起始在右 */
69
+ .xh-scope-popover[data-part='positioner']:is([data-placement='top-start'], [data-placement='bottom-start']) {
70
+ --xh-_overlay-origin-x: var(--xh-direction-start);
71
+ }
72
+
73
+ .xh-scope-popover[data-part='positioner']:is([data-placement='top-end'], [data-placement='bottom-end']) {
74
+ --xh-_overlay-origin-x: var(--xh-direction-end);
75
+ }
76
+
77
+ .xh-scope-popover[data-part='positioner']:is([data-placement='left-start'], [data-placement='right-start']) {
78
+ --xh-_overlay-origin-y: 0;
79
+ }
80
+
81
+ .xh-scope-popover[data-part='positioner']:is([data-placement='left-end'], [data-placement='right-end']) {
82
+ --xh-_overlay-origin-y: 100%;
83
+ }
84
+
85
+ /*
86
+ * 触发器是页面上的独立文字按钮:盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
87
+ * 由家族配方按连接层投影的 data-xh-action-variant / -size 给出。皮肤没有自己的外观规则,
88
+ * 只把作者塞进按钮的图标接到随档字形尺(md = 20px)。
89
+ */
90
+ .xh-scope-popover[data-part='trigger'] {
91
+ --xh-icon-size: var(--xh-popover-icon-size, var(--xh-_action-profile-glyph-size));
92
+ }
93
+
94
+ /* 家族配方给了 display,作者手写 hidden 时得把 UA 的 [hidden]{display:none} 还回去 */
95
+ .xh-scope-popover[data-part='trigger'][hidden] {
96
+ display: none;
97
+ }
98
+
99
+ .xh-scope-popover[data-part='content'] {
100
+ /* 材质由家族配方画(family/material.css 的 frosted 面:描边、底、1px 顶光、前景、投影与背景滤镜),
101
+ 这里只把使用者槽接进来 */
102
+ --xh-frosted-bg: var(--xh-popover-bg, var(--xh-_material-bg));
103
+ --xh-frosted-border: var(--xh-popover-border, var(--xh-_material-border));
104
+ --xh-frosted-fg: var(--xh-popover-fg, var(--xh-_material-fg));
105
+ --xh-frosted-shadow: var(--xh-popover-shadow, var(--xh-_material-shadow));
106
+ --xh-frosted-backdrop: var(--xh-popover-backdrop, var(--xh-_material-backdrop));
107
+
108
+ /* 作者塞进面板里的图标按控件档取;关闭钮另由家族配方按 sm 档下发字形尺 */
109
+ --xh-icon-size: var(--xh-popover-icon-size, var(--xh-glyph-size-md));
110
+
111
+ /* 尺寸档只换这三个私有槽。popover 没有 root 部件,size 落在浮层树最外层的 content 上。
112
+ 横向内衬比纵向高一档(缺省纵 12 横 16)。语气不接:面板是内容容器,语气该由里面的内容表达 */
113
+ --xh-_popover-py: var(--xh-surface-pad-md);
114
+ --xh-_popover-px: var(--xh-surface-pad-lg);
115
+ --xh-_popover-max-w: var(--xh-overlay-max-w);
116
+
117
+ position: relative;
118
+ display: flex;
119
+ flex-direction: column;
120
+ /* 标题与正文贴着排:两行之间只留 4px */
121
+ gap: var(--xh-popover-gap, var(--xh-space-1));
122
+ inline-size: max-content;
123
+ /* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的内容就点不到了 */
124
+ max-inline-size: min(var(--xh-popover-max-w, var(--xh-_popover-max-w)), var(--xh-_popover-available-w));
125
+ /* 内容由作者给,长度不可预知:不限高就整块伸出视口且滚不到 */
126
+ max-block-size: min(var(--xh-popover-max-h, var(--xh-overlay-max-h)), var(--xh-_popover-available-h));
127
+ overflow-y: auto;
128
+ /* 浮在页面之上的 Overlay 滚动面:滚到头不把页面一起带走 */
129
+ overscroll-behavior: contain;
130
+ padding-block: var(--xh-popover-py, var(--xh-_popover-py));
131
+ padding-inline: var(--xh-popover-px, var(--xh-_popover-px));
132
+ border-radius: var(--xh-popover-radius, var(--xh-shape-overlay));
133
+ pointer-events: auto;
134
+ /* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
135
+ transform-origin: var(--xh-_overlay-origin-x, 50%) var(--xh-_overlay-origin-y, 50%);
136
+ }
137
+
138
+ /* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
139
+ 收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
140
+ [hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
141
+ 真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
142
+ 其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
143
+
144
+ .xh-scope-popover[data-part='content']:focus-visible {
145
+ outline: none;
146
+ }
147
+
148
+ /* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
149
+ .xh-scope-popover[data-part='content'][data-state='open']:not([data-instant]) {
150
+ animation: xh-overlay-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
151
+ }
152
+
153
+ /* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
154
+ 免得动画结束到 hidden 落下来之间闪一下原样 */
155
+ .xh-scope-popover[data-part='content'][data-state='closed'] {
156
+ animation: xh-pop-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
157
+ }
158
+
159
+ /* —— 尺寸 —— */
160
+ /* 缺省档写在 content 的基础规则里;内衬三档取 surface-pad 那把尺,横向始终比纵向高一档 */
161
+ .xh-scope-popover[data-part='content'][data-size='sm'] {
162
+ --xh-_popover-py: var(--xh-surface-pad-sm);
163
+ --xh-_popover-px: var(--xh-surface-pad-md);
164
+ --xh-_popover-max-w: var(--xh-overlay-max-w-sm);
165
+ }
166
+
167
+ .xh-scope-popover[data-part='content'][data-size='lg'] {
168
+ --xh-_popover-py: var(--xh-surface-pad-lg);
169
+ --xh-_popover-px: var(--xh-surface-pad-xl);
170
+ --xh-_popover-max-w: var(--xh-overlay-max-w-lg);
171
+ }
172
+
173
+ /* 气泡标题:14px / medium / 正文色 */
174
+ .xh-scope-popover[data-part='title'] {
175
+ margin: 0;
176
+ font-size: var(--xh-popover-title-font-size, var(--xh-text-label-size));
177
+ font-weight: var(--xh-popover-title-font-weight, var(--xh-font-weight-medium));
178
+ color: var(--xh-popover-title-fg, var(--xh-material-frosted-fg));
179
+ }
180
+
181
+ /* 说明就是气泡的正文:14px 正文字号 + fg-muted 次级色 */
182
+ .xh-scope-popover[data-part='description'] {
183
+ margin: 0;
184
+ font-size: var(--xh-popover-description-font-size, var(--xh-text-body-size));
185
+ line-height: var(--xh-leading-normal);
186
+ color: var(--xh-popover-description-fg, var(--xh-fg-muted));
187
+ }
188
+
189
+ /* 关闭按钮是绝对定位的,不占流内宽度:标题得自己让出右上角那块,
190
+ 否则长标题会直接钻到按钮底下。只在真有关闭按钮时让位。 */
191
+ .xh-scope-popover[data-part='content']:has(.xh-scope-popover[data-part='close-trigger'])
192
+ .xh-scope-popover[data-part='title'] {
193
+ padding-inline-end: calc(var(--xh-popover-close-size, var(--xh-control-h-sm)) + var(--xh-space-2));
194
+ }
195
+
196
+ /*
197
+ * 关闭钮是浮层角落的单图标钮:正方盒、sm 档几何、ghost 四态面、0.97 按压并换底与粗指针命中区
198
+ * 由家族配方给出——磨砂白面上走画布承载阶梯悬停 --xh-bg-subtle(100)→ 按下 --xh-bg-subtle-hover(200),
199
+ * 焦点面透明吃库环。这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与摆放,
200
+ * 聚焦档的 -bg-focus / -fg-focus 两槽同样桥到配方的 focus-visible 面,缺省仍是透明底与悬停字色:
201
+ * 贴边比 dialog 一族的面板档(--xh-surface-action-inset)小一档:气泡的面板内衬是 12px,
202
+ * 28px 的钮按 12px 贴边会伸出面板自己的盒子,被 content 的 overflow 裁掉。
203
+ * 静息前景取磨砂面的 muted 字色,悬停 / 按下回到 fg-default。
204
+ */
205
+ .xh-scope-popover[data-part='close-trigger'] {
206
+ --xh-action-visual-size: var(--xh-popover-close-size, var(--xh-_action-profile-visual-size));
207
+ --xh-action-radius: var(--xh-popover-close-radius, var(--xh-shape-control));
208
+ --xh-action-bg-hover: var(--xh-popover-close-bg-hover, var(--xh-_action-variant-bg-hover));
209
+ --xh-action-bg-pressed: var(--xh-popover-close-bg-active, var(--xh-_action-variant-bg-pressed));
210
+ --xh-action-bg-focus-visible: var(--xh-popover-close-bg-focus, var(--xh-_action-variant-bg-focus-visible));
211
+ --xh-action-fg-rest: var(--xh-popover-close-fg, var(--xh-material-frosted-fg-muted));
212
+ --xh-action-fg-hover: var(--xh-popover-close-fg-hover, var(--xh-_action-variant-fg-hover));
213
+ --xh-action-fg-pressed: var(--xh-popover-close-fg-hover, var(--xh-_action-variant-fg-pressed));
214
+ --xh-action-fg-focus-visible: var(--xh-popover-close-fg-focus, var(--xh-popover-close-fg-hover, var(--xh-_action-variant-fg-focus-visible)));
215
+ /* 作者塞进按钮的图标随档取字形尺(sm = 16px),与皮肤画的兜底字形同一把尺 */
216
+ --xh-icon-size: var(--xh-popover-icon-size, var(--xh-_action-profile-glyph-size));
217
+
218
+ position: absolute;
219
+ inset-block-start: var(--xh-space-2);
220
+ inset-inline-end: var(--xh-space-2);
221
+ }
222
+
223
+ .xh-scope-popover[data-part='close-trigger'][hidden] {
224
+ display: none;
225
+ }
226
+
227
+ /* 箭头的底色与描边色,几何在 overlay-arrow.css。
228
+ 交叉轴落点由定位引擎经内联自定义属性写进来,没给时退回居中 */
229
+ .xh-scope-popover[data-part='arrow'] {
230
+ --xh-_popover-arrow-x: 50%;
231
+ --xh-_popover-arrow-y: 50%;
232
+ --xh-_overlay-arrow-size: var(--xh-popover-arrow-size, var(--xh-overlay-arrow-size));
233
+ --xh-_overlay-arrow-x: var(--xh-_popover-arrow-x);
234
+ --xh-_overlay-arrow-y: var(--xh-_popover-arrow-y);
235
+
236
+ background: var(--xh-popover-bg, var(--xh-material-frosted-bg));
237
+ border: var(--xh-stroke-thin) solid var(--xh-popover-border, var(--xh-material-frosted-border));
238
+ }
239
+
240
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
241
+ .xh-scope-popover[data-part='close-trigger']:empty::before {
242
+ content: '';
243
+ display: inline-block;
244
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
245
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
246
+ vertical-align: var(--xh-glyph-baseline-shift);
247
+ background-color: currentColor;
248
+ -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
249
+ mask: var(--xh-glyph-mark-close) center / contain no-repeat;
250
+ }
251
+
252
+ @media (forced-colors: active) {
253
+ /* 系统色接管边界与正文;装饰顶光在这一档没有信息价值,明确撤掉背景图层。 */
254
+ .xh-scope-popover[data-part='content'] {
255
+ background-image: none;
256
+ }
257
+ }
258
+
259
+ @media print {
260
+ /* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
261
+ 收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
262
+ .xh-scope-popover[data-part='positioner'] {
263
+ display: none;
264
+ }
265
+ }
266
+
267
+ @media (forced-colors: active) {
268
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
269
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
270
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
271
+ 禁用取 GrayText */
272
+ .xh-scope-popover[data-part='close-trigger']:empty::before {
273
+ forced-color-adjust: none;
274
+ background-color: ButtonText;
275
+ }
276
+
277
+ .xh-scope-popover[data-part='close-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
278
+ background-color: HighlightText;
279
+ }
280
+
281
+ .xh-scope-popover[data-part='close-trigger'][data-disabled]:empty::before {
282
+ background-color: GrayText;
283
+ }
284
+ }
285
+ }