@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,931 @@
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
+ /* DatePicker 独立皮肤同时传递引入字段视觉盒、字段内动作与浮层集合行;full bundle 递归去重。 */
7
+ @import '../family/field-chrome.css';
8
+ @import '../family/action-control.css';
9
+ @import '../family/collection-item.css';
10
+
11
+ @import './scrollbar.css';
12
+
13
+ /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
14
+ @import '../family/motion.css';
15
+ @import '../family/tag-list.css';
16
+
17
+ @layer xihan.components {
18
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
19
+ .xh-scope-date-picker {
20
+ --xh-date-picker-skin: 1;
21
+ }
22
+
23
+ /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
24
+ .xh-scope-date-picker[data-part='positioner'] {
25
+ /* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
26
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时不额外限高 */
27
+ --xh-_date-picker-available-h: 100vh;
28
+ /* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,内容层据此夹住行内轴;
29
+ 引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
30
+ --xh-_date-picker-available-w: 100vw;
31
+
32
+ /* 每个浮层独立声明方向,避免继承祖先浮层的进场位移。 */
33
+ --xh-_overlay-enter-up: 0;
34
+ --xh-_overlay-enter-down: 0;
35
+ --xh-_overlay-enter-left: 0;
36
+ --xh-_overlay-enter-right: 0;
37
+
38
+ /* 面板的自绘条浮在内容之上:轨道不上底色,实色轨道会在面板右缘糊出一条竖灰带 */
39
+ --xh-scrollbar-track-bg: transparent;
40
+
41
+ position: fixed;
42
+ z-index: var(--xh-date-picker-layer, var(--xh-_layer, var(--xh-layer-popover)));
43
+ /* 空壳不吃指针,交互只发生在 content 里 */
44
+ pointer-events: none;
45
+ }
46
+
47
+ /* 锚点被滚出可视区:整个浮层随之收起 */
48
+ .xh-scope-date-picker[data-part='positioner'][data-hidden] {
49
+ visibility: hidden;
50
+ }
51
+
52
+ /* 短位移按实际落位的物理方向给,不随书写方向翻转。 */
53
+ .xh-scope-date-picker[data-part='positioner'][data-placement^='top'] {
54
+ --xh-_overlay-enter-down: 1;
55
+ }
56
+
57
+ .xh-scope-date-picker[data-part='positioner'][data-placement^='bottom'] {
58
+ --xh-_overlay-enter-up: 1;
59
+ }
60
+
61
+ .xh-scope-date-picker[data-part='positioner'][data-placement^='left'] {
62
+ --xh-_overlay-enter-right: 1;
63
+ }
64
+
65
+ .xh-scope-date-picker[data-part='positioner'][data-placement^='right'] {
66
+ --xh-_overlay-enter-left: 1;
67
+ }
68
+
69
+ /* 私有槽同时声明在根与 positioner 上:浮层被搬到 portal 落点,不是根的后代,继承不过去 */
70
+ .xh-scope-date-picker:is([data-part='root'], [data-part='positioner']) {
71
+ /* 尺寸档只换这几个私有槽,输入行与浮层里的部件都从这两处继承它们,
72
+ 换档不必给每个部件各写一条选择器;形态三档由家族按 control 上的 data-variant 生成,皮肤不再声明 */
73
+ --xh-_date-picker-control-h: var(--xh-control-h-md);
74
+ --xh-_date-picker-control-px: var(--xh-control-px-md);
75
+ --xh-_date-picker-gap: var(--xh-control-gap-md);
76
+ --xh-_date-picker-font-size: var(--xh-control-font-md);
77
+
78
+ /* 选中对号随语气走。没写 data-tone 时这几个 --xh-_tone* 没被声明,退回品牌色 */
79
+ /* 内嵌日期段沿用日期输入的轻强调焦点:当前段是「当前项」,淡底 + 淡底前景,不另画一套实心选择态。 */
80
+ --xh-_date-field-segment-bg: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
81
+ --xh-_date-field-segment-fg: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
82
+ /* 对号画在普通面上,取语气前景角色,不能拿确认按钮的实心背景色充当前景。 */
83
+ --xh-_date-picker-check-fg: var(--xh-_tone, var(--xh-fg-brand));
84
+ /* 时间列与预设的对号与 Select 等列表的对号同一把尺:指示符档,随密度收放 */
85
+ --xh-_date-picker-time-item-check-size: var(--xh-control-indicator-size);
86
+ }
87
+
88
+ /* 与文本框、分段日期同一套堆叠:标签一行、输入行一行 */
89
+ .xh-scope-date-picker[data-part='root'] {
90
+ /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
91
+ --xh-icon-size: var(--xh-date-picker-icon-size, var(--xh-glyph-size-md));
92
+
93
+ display: inline-flex;
94
+ flex-direction: column;
95
+ gap: var(--xh-date-picker-gap, var(--xh-space-1));
96
+
97
+ /* 不传尺寸时一律这么宽,宽度不随内容走;父容器给不出这么宽时整件跟着收,地板同步让步,不越出父容器。
98
+ 地板不高过缺省宽:使用者把缺省宽钉到底线以下时不必再放开底线 */
99
+ inline-size: var(--xh-date-picker-control-w, var(--xh-control-w));
100
+ min-inline-size: min(var(--xh-date-picker-control-w, var(--xh-control-w)), var(--xh-date-picker-control-min-w, var(--xh-control-min-w)), 100%);
101
+ max-inline-size: 100%;
102
+ }
103
+
104
+ /* —— 尺寸 —— */
105
+ /* 缺省档写在上面的基础规则里 */
106
+ .xh-scope-date-picker:is([data-part='root'], [data-part='positioner'])[data-size='sm'] {
107
+ --xh-icon-size: var(--xh-date-picker-icon-size, var(--xh-glyph-size-sm));
108
+ --xh-_date-picker-control-h: var(--xh-control-h-sm);
109
+ --xh-_date-picker-control-px: var(--xh-control-px-sm);
110
+ --xh-_date-picker-gap: var(--xh-control-gap-sm);
111
+ --xh-_date-picker-font-size: var(--xh-control-font-sm);
112
+ }
113
+
114
+ .xh-scope-date-picker:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
115
+ --xh-icon-size: var(--xh-date-picker-icon-size, var(--xh-glyph-size-lg));
116
+ --xh-_date-picker-control-h: var(--xh-control-h-lg);
117
+ --xh-_date-picker-control-px: var(--xh-control-px-lg);
118
+ --xh-_date-picker-gap: var(--xh-control-gap-lg);
119
+ --xh-_date-picker-font-size: var(--xh-control-font-lg);
120
+ }
121
+
122
+ /* 375px 复合面板要同时容下日历与时/分两列;手机档用正式小指示符,平板起恢复16px。 */
123
+ @media not all and (min-width: 768px) {
124
+ .xh-scope-date-picker:is([data-part='root'], [data-part='positioner']) {
125
+ --xh-_date-picker-time-item-check-size: var(--xh-control-indicator-sm);
126
+ }
127
+ }
128
+
129
+ /* 只要声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
130
+ .xh-scope-date-picker[data-part='root'][hidden] {
131
+ display: none;
132
+ }
133
+
134
+ .xh-scope-date-picker[data-part='label'] {
135
+ /* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-date-picker-label-gap 给多少最终就是多少 */
136
+ margin-block-end: calc(var(--xh-date-picker-label-gap, var(--xh-space-2)) - var(--xh-date-picker-gap, var(--xh-space-1)));
137
+ color: var(--xh-date-picker-label-fg, var(--xh-fg-muted));
138
+ font-size: var(--xh-date-picker-label-font-size, var(--xh-text-label-size));
139
+ font-weight: var(--xh-date-picker-label-font-weight, var(--xh-text-label-weight));
140
+ line-height: var(--xh-leading-none);
141
+ }
142
+
143
+ .xh-scope-date-picker[data-part='label'][hidden] {
144
+ display: none;
145
+ }
146
+
147
+ .xh-scope-date-picker[data-part='label'][data-disabled] {
148
+ color: var(--xh-date-picker-label-fg-disabled, var(--xh-fg-muted));
149
+ }
150
+
151
+ /* 画成一个框的是 control 而不是 input:段位、清空按钮、日历按钮三者要看起来是一体的,
152
+ 边框长在里面任何一个身上都会把另外两个割在框外。描边、底色、圆角、聚焦环、五态与悬停由
153
+ Field Chrome 家族画在 control 上(焦点落在段或按钮上,家族 :focus-within 让整框亮起来);
154
+ 组件只映射既有公开槽(shadow 缺省 none:字段静息描边式、无影)。打开中不另画环,由浮层本身承担 */
155
+ .xh-scope-date-picker[data-part='control'] {
156
+ --xh-field-control-height: var(--xh-date-picker-control-h, var(--xh-_date-picker-control-h));
157
+ --xh-field-control-padding-inline: var(--xh-date-picker-control-px, var(--xh-_date-picker-control-px));
158
+ --xh-field-control-gap: var(--xh-date-picker-control-gap, var(--xh-_date-picker-gap));
159
+ --xh-field-control-min-inline-size: var(--xh-date-picker-control-min-w, var(--xh-control-min-w));
160
+ --xh-field-control-radius: var(--xh-date-picker-control-radius, var(--xh-shape-control));
161
+ --xh-field-bg-rest: var(--xh-date-picker-control-bg, var(--xh-_field-variant-bg-rest));
162
+ --xh-field-bg-hover: var(--xh-date-picker-control-bg-hover, var(--xh-_field-variant-bg-hover));
163
+ --xh-field-bg-read-only: var(--xh-date-picker-control-bg-readonly, var(--xh-_field-variant-bg-read-only));
164
+ --xh-field-bg-disabled: var(--xh-date-picker-control-bg-disabled, var(--xh-_field-variant-bg-disabled));
165
+ --xh-field-fg-rest: var(--xh-date-picker-control-fg, var(--xh-fg-default));
166
+ --xh-field-border-rest: var(--xh-date-picker-control-border, var(--xh-_field-variant-border-rest));
167
+ --xh-field-border-hover: var(--xh-date-picker-control-border-hover, var(--xh-_field-variant-border-hover));
168
+ --xh-field-border-focus: var(--xh-date-picker-control-border-focus, var(--xh-_field-variant-border-focus));
169
+ --xh-field-border-invalid: var(--xh-date-picker-control-border-invalid, var(--xh-_field-variant-border-invalid));
170
+ --xh-field-shadow-rest: var(--xh-date-picker-control-shadow, none);
171
+ /* 段位靠键盘编辑,盒上不是文本光标 */
172
+ --xh-field-cursor-rest: default;
173
+ /* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
174
+ --xh-field-glyph-size: var(--xh-date-picker-icon-size, var(--xh-_field-size-glyph-size));
175
+ }
176
+
177
+ .xh-scope-date-picker[data-part='control'][hidden] {
178
+ display: none;
179
+ }
180
+
181
+ /* 段位与作者写在段间的分隔符都在这一层里:段位自己那身皮由 date-field 那份样式负责
182
+ (它们戴的是那一份解剖的标记),这里只管把一排段位横过来、占满输入行剩下的宽度 */
183
+ .xh-scope-date-picker[data-part='segment-group'] {
184
+ display: inline-flex;
185
+ flex: 1 1 auto;
186
+ align-items: center;
187
+ min-inline-size: 0;
188
+ block-size: 100%;
189
+ color: inherit;
190
+ /* 表单控件不继承页面字体,只给字号会让段位用 UA 默认字族,与周围文本对不上 */
191
+ font-family: inherit;
192
+ font-size: var(--xh-date-picker-font-size, var(--xh-_date-picker-font-size));
193
+ line-height: var(--xh-leading-none);
194
+ }
195
+
196
+ .xh-scope-date-picker[data-part='segment-group'][hidden] {
197
+ display: none;
198
+ }
199
+
200
+ .xh-scope-date-picker[data-part='segment-group'] > :not([data-scope]) {
201
+ color: var(--xh-date-picker-literal-fg, var(--xh-fg-subtle));
202
+ }
203
+
204
+ /* 整条占位:一段都没填、焦点也不在段上时,段位与分隔符让位给一句占位文字,焦点一进到段上就换回段位。
205
+ 段位只是淡出(仍可聚焦、仍在读屏树里),文字以生成内容压在同一行上、不吃指针,点下去落到底下的段位 */
206
+ .xh-scope-date-picker[data-part='segment-group'][data-placeholder-shown] {
207
+ position: relative;
208
+ color: transparent;
209
+ }
210
+
211
+ /* 段位与分隔符(后者是不带解剖的文字节点)一起淡出:显隐写在 segment-group 自己的私有槽上,
212
+ 子节点只读槽——主体无特征的规则不挂在 data-placeholder-shown 后面,输入时翻转只让这一组失效 */
213
+ .xh-scope-date-picker[data-part='segment-group'][data-placeholder-shown] {
214
+ --xh-_date-picker-segment-opacity: 0;
215
+ }
216
+
217
+ .xh-scope-date-picker[data-part='segment-group'] > * {
218
+ opacity: var(--xh-_date-picker-segment-opacity, 1);
219
+ }
220
+
221
+ .xh-scope-date-picker[data-part='segment-group'][data-placeholder-shown]::before {
222
+ content: attr(data-placeholder-text);
223
+ position: absolute;
224
+ inset-inline: 0;
225
+ inset-block-start: 50%;
226
+ overflow: hidden;
227
+ color: var(--xh-date-picker-placeholder-fg, var(--xh-fg-subtle));
228
+ white-space: nowrap;
229
+ text-overflow: ellipsis;
230
+ pointer-events: none;
231
+ translate: 0 -50%;
232
+ }
233
+
234
+ /* 容器自己不占 Tab 位、也不承载焦点,环由 control 画,这里不再套一圈 */
235
+ .xh-scope-date-picker[data-part='segment-group']:focus-visible {
236
+ outline: none;
237
+ }
238
+
239
+ /* 多选的标签行:段位让位,选中的日期在盒里排成标签,超过 maxTagCount 的折进 +N。
240
+ 行里每一枚都是 tag(data-scope="tag"),样子归 tag.css;行怎么排、标签怎么进出归标签行家族配方,
241
+ 这里只接使用者的间距槽,并让它像段位那样占满输入行剩下的宽度 */
242
+ .xh-scope-date-picker[data-part='tag-list'] {
243
+ --xh-tag-list-gap: var(--xh-date-picker-tag-list-gap, var(--xh-space-1));
244
+
245
+ /* 基准取 0:只吃两颗钮剩下的宽度、在自己里面折行;按内容宽算基准的话,盒子会先在钮前面折行,把钮挤到最后一行 */
246
+ flex: 1 1 0;
247
+ flex-wrap: wrap;
248
+ font-size: var(--xh-date-picker-font-size, var(--xh-_date-picker-font-size));
249
+ }
250
+
251
+ /* 日期标签是定长文字,截短了就读不出是哪天:不收缩,排不下就折到下一行(与标签输入同一种排法),
252
+ 盒随行数长高(字段家族的 multi-tag 布局给),到上限后在盒内滚动 */
253
+ .xh-scope-date-picker[data-part='tag-list'] > .xh-scope-tag[data-part='root'] {
254
+ flex: none;
255
+ }
256
+
257
+ .xh-scope-date-picker[data-part='control'][data-xh-field-layout='multi-tag'] {
258
+ max-block-size: var(--xh-date-picker-control-max-h, var(--xh-viewport-h-sm));
259
+ overflow-y: auto;
260
+ }
261
+
262
+ /* 没有选中时这一行承载整条占位:与单选那条占位同一句文字、同一个颜色槽 */
263
+ .xh-scope-date-picker[data-part='tag-list'][data-placeholder-shown]::before {
264
+ content: attr(data-placeholder-text);
265
+ min-inline-size: 0;
266
+ overflow: hidden;
267
+ color: var(--xh-date-picker-placeholder-fg, var(--xh-fg-subtle));
268
+ white-space: nowrap;
269
+ text-overflow: ellipsis;
270
+ pointer-events: none;
271
+ }
272
+
273
+ /* 两个按钮同一副长相:贴在框内末端的小方钮,不占宽度也不撑高 control。正方视觉盒、inset 圆角、
274
+ 悬停 100 / 按下 200 与 0.97 按压、粗指针热区、禁用面与 :focus-visible 关环(盒的 :focus-within
275
+ 已画了一圈)全由 Action Control 的 field-inset ghost 档给,组件只映射既有覆盖槽。
276
+ 打开中与悬停同档:日历钮不另上底,方向由浮层本身承担 */
277
+ .xh-scope-date-picker[data-part='trigger'],
278
+ .xh-scope-date-picker[data-part='clear-trigger'] {
279
+ --xh-action-visual-size: var(--xh-date-picker-action-size, var(--xh-_action-profile-visual-size));
280
+ --xh-action-min-inline-size: var(--xh-date-picker-action-size, var(--xh-_action-profile-visual-size));
281
+ --xh-action-radius: var(--xh-date-picker-action-radius, var(--xh-shape-inset));
282
+ /* 底色阶梯由 ghost 档给(透明 → 100 → 200),使用者槽只作覆盖入口 */
283
+ --xh-action-bg-rest: var(--xh-date-picker-action-bg, var(--xh-_action-variant-bg-rest));
284
+ --xh-action-bg-hover: var(--xh-date-picker-action-bg-hover, var(--xh-_action-variant-bg-hover));
285
+ --xh-action-bg-pressed: var(--xh-date-picker-action-bg-active, var(--xh-_action-variant-bg-pressed));
286
+ --xh-action-fg-rest: var(--xh-date-picker-action-fg, var(--xh-fg-muted));
287
+ --xh-action-fg-hover: var(--xh-date-picker-action-fg-hover, var(--xh-fg-default));
288
+ --xh-action-border-rest: transparent;
289
+ --xh-action-highlight-rest: transparent;
290
+ --xh-action-shadow-rest: none;
291
+ --xh-action-shadow-hover: none;
292
+ --xh-action-shadow-pressed: none;
293
+ --xh-action-font-size: var(--xh-date-picker-action-font-size, var(--xh-text-secondary-size));
294
+ /* 配方尚未把 profile 字形档灌进 --xh-icon-size,钮内字形先按 field-inset 档逐钮取值 */
295
+ --xh-icon-size: var(--xh-_action-profile-glyph-size);
296
+
297
+ border-width: 0;
298
+ }
299
+
300
+ /* 没值时连接层给的是 hidden 属性;家族那条 display 会把 UA 规则盖掉 */
301
+ .xh-scope-date-picker[data-part='trigger'][hidden],
302
+ .xh-scope-date-picker[data-part='clear-trigger'][hidden] {
303
+ display: none;
304
+ }
305
+
306
+ /* 打开中与悬停同档:日历钮的静息底换到悬停那一支中性面,不用品牌色、不另画环;方向由浮层本身承担 */
307
+ .xh-scope-date-picker[data-part='trigger'][data-state='open'] {
308
+ --xh-action-bg-rest: var(--xh-date-picker-action-bg-hover, var(--xh-_action-variant-bg-hover));
309
+ --xh-action-fg-rest: var(--xh-date-picker-action-fg-hover, var(--xh-fg-default));
310
+ }
311
+
312
+ /* 有值时清空钮顶上来,日历钮让位:两颗并排堆着用户分不清点哪个。
313
+ 多选不让位:段位收起后日历钮是唯一的键盘入口(退格摘标签也在它身上),藏了键盘就进不来 */
314
+ .xh-scope-date-picker[data-part='control']:has(
315
+ > .xh-scope-date-picker[data-part='clear-trigger']:not([hidden])
316
+ ):not(:has(> .xh-scope-date-picker[data-part='tag-list']:not([hidden])))
317
+ > .xh-scope-date-picker[data-part='trigger'] {
318
+ display: none;
319
+ }
320
+
321
+ /* 浮层:含日历网格与时间列的锚定面板,走 floating 材质——实体底 + --xh-border-default 描边 +
322
+ --xh-elevation-floating 落影,不透景、不画顶光。面板自己不留内衬:标题栏、网格、快捷选项列与时间列各带内衬,
323
+ 分隔线才能从面板一边通到另一边 */
324
+ .xh-scope-date-picker[data-part='content'] {
325
+ position: relative;
326
+ display: block;
327
+ /* 行内轴只有落位后的可用宽度这一个上限:不夹住,浮层就会被定位层的包含块压窄,
328
+ 网格轨道跟着缩到比日期钮还窄,相邻两颗日期钮互相盖住 */
329
+ max-inline-size: var(--xh-_date-picker-available-w);
330
+ padding-block: var(--xh-date-picker-content-py, var(--xh-space-0));
331
+ padding-inline: var(--xh-date-picker-content-px, var(--xh-space-0));
332
+ border: var(--xh-stroke-thin) solid var(--xh-date-picker-content-border, var(--xh-border-default));
333
+ border-radius: var(--xh-date-picker-content-radius, var(--xh-shape-overlay));
334
+ background: var(--xh-date-picker-content-bg, var(--xh-bg-surface));
335
+ color: var(--xh-date-picker-content-fg, var(--xh-fg-default));
336
+ /* 日历是定高结构:网格、时间列与底栏都按 px 排,天然高度就是它们的和,缺省不另设上限
337
+ (按 rem 的滚动面档会随根字号缩小,根字号低于 16px 时底栏就被挤到滚动里);
338
+ 可用高度是定位引擎算出的视口余量,视口真放不下时再收一截 */
339
+ max-block-size: min(var(--xh-date-picker-max-h, var(--xh-_date-picker-available-h)), var(--xh-_date-picker-available-h));
340
+ /* 两轴都滚:块轴放不下时面板内自己竖滚,行内轴放不下时面板内自己横滚,
341
+ 日历那几块保持各自的天然宽度,不被压 */
342
+ overflow: auto;
343
+ /* 浮层滚动面:滚到头不把页面一起带走 */
344
+ overscroll-behavior: contain;
345
+ box-shadow: var(--xh-date-picker-content-shadow, var(--xh-elevation-floating));
346
+ pointer-events: auto;
347
+ /* 快捷选项列与时间列的条子贴在各自的盒子上、挂在这一层里(它已是定位盒):轨道不画底 */
348
+ --xh-scrollbar-track-bg: transparent;
349
+ }
350
+
351
+ /* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
352
+ 收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
353
+ [hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
354
+ 真正的收起由宿主在退场结束后落成内联 display:none(Vue 那边直接不渲染)。
355
+ 其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
356
+
357
+ /* 浮层壳不承载焦点(焦点直接落到聚焦日那一格),但它写着 tabindex=-1,
358
+ 程序化落焦时不该再画一圈环 */
359
+ .xh-scope-date-picker[data-part='content']:focus-visible {
360
+ outline: none;
361
+ }
362
+
363
+ /* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
364
+ .xh-scope-date-picker[data-part='content'][data-state='open']:not([data-instant]) {
365
+ animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
366
+ }
367
+
368
+ /* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
369
+ 免得动画结束到真收起之间闪一下原样 */
370
+ .xh-scope-date-picker[data-part='content'][data-state='closed'] {
371
+ animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
372
+ }
373
+
374
+ /* 内嵌日历的挂载点同时充当日历的根节点:日历那份样式的 root 规则落在
375
+ .xh-scope-calendar-picker[data-part='root'] 上,而这里没有那个节点,
376
+ 所以网格外层该有的排布得在这儿补齐(网格内部的皮仍归 calendar-picker 那一份) */
377
+ /* 真的摆了两张日历才横过来。写成 :has 而不是无条件 flex 行:
378
+ showTime 那套结构里 content 直属子节点是作者自己的包裹块与底栏,
379
+ 无条件横排会把它们并到日历旁边去。
380
+ 不加 :not([hidden]):content 收起态带 hidden 但仍在播退场动画,
381
+ 排除掉会让它在那几帧退回 block、两张日历竖着堆一下。
382
+ 并排放不下就折行,第二张月历落到第一张下面:视口窄与面板被夹窄都命中这一条 */
383
+ .xh-scope-date-picker[data-part='content']:has(> [data-part='calendar'] + [data-part='calendar']) {
384
+ display: flex;
385
+ flex-wrap: wrap;
386
+ align-items: flex-start;
387
+ }
388
+
389
+ /* 快捷选项列摆在日历的行内起始一侧,同样只在它真在场时才横过来。
390
+ 与上一条同理:不加 :not([hidden]),退场那几帧塌回 block 会让两块竖着堆一下。
391
+ 一并折行:选项条在手机档占满一行,日历落到它下面 */
392
+ .xh-scope-date-picker[data-part='content']:has(> [data-part='preset-group']) {
393
+ display: flex;
394
+ flex-wrap: wrap;
395
+ align-items: stretch;
396
+ }
397
+
398
+ /* showTime 的时间列与日历同处一条可折行的行内流:放得下就并排贴在日历旁边,
399
+ 放不下时整组时间列折到日历下面,几列彼此仍横着排。
400
+ 不写这一条时 content 是 block,时列与分列会各占满一行竖着摞成一长条 */
401
+ .xh-scope-date-picker[data-part='content']:has(> [data-part='time-column']) {
402
+ display: flex;
403
+ flex-wrap: wrap;
404
+ align-items: flex-start;
405
+ }
406
+
407
+ /* 确认按钮沉到所在那一行的底边:它是整块面板的出口,不跟日历顶边对齐。面板不留内衬,
408
+ 钮自己与底边、末边各让一档空当 */
409
+ .xh-scope-date-picker[data-part='content']:has(> [data-part='time-column']) > [data-part='confirm-trigger']:where(.xh-scope-date-picker) {
410
+ align-self: flex-end;
411
+ margin: var(--xh-date-picker-confirm-trigger-margin, var(--xh-space-2));
412
+ }
413
+
414
+ /* 两张日历并排时不画竖线、不另留空当:各自左右 16 的内衬合成 32 的空白就是两张网格的界,
415
+ 两条标题栏的下沿分隔线首尾相接连成一条 */
416
+
417
+ .xh-scope-date-picker[data-part='calendar'] {
418
+ display: flex;
419
+ /* 面板被夹窄时不跟着缩:日期钮的宽度是定死的,网格轨道再窄下去就会与右邻的钮叠在一起。
420
+ 撑出去的那截交给面板自己横滚 */
421
+ min-inline-size: max-content;
422
+ flex-direction: column;
423
+ gap: var(--xh-date-picker-calendar-gap, var(--xh-space-0));
424
+ /* 数字等宽:1 与 7 的字形宽度在比例字体里并不相同,不定住会让整张网格随月份抖动 */
425
+ font-variant-numeric: tabular-nums;
426
+ }
427
+
428
+ /* 浮层里的日历标题取常规字重:面板标题栏只是年月的读数,不压过网格 */
429
+ .xh-scope-date-picker[data-part='calendar'] .xh-scope-calendar-picker[data-part='heading'],
430
+ .xh-scope-date-picker[data-part='calendar'] .xh-scope-calendar-picker[data-part='heading-year-trigger'],
431
+ .xh-scope-date-picker[data-part='calendar'] .xh-scope-calendar-picker[data-part='heading-month-trigger'] {
432
+ font-weight: var(--xh-date-picker-heading-font-weight, var(--xh-font-weight-regular));
433
+ }
434
+
435
+ .xh-scope-date-picker[data-part='calendar']:has(+ [data-part='time-column']) {
436
+ position: relative;
437
+ }
438
+
439
+ .xh-scope-date-picker[data-part='calendar']:has(+ [data-part='time-column'])::after {
440
+ content: '';
441
+ position: absolute;
442
+ inset-block: 0;
443
+ inset-inline-end: calc(-1 * var(--xh-stroke-thin));
444
+ inline-size: var(--xh-stroke-thin);
445
+ background: var(--xh-date-picker-column-divider, var(--xh-material-solid-border));
446
+ pointer-events: none;
447
+ }
448
+
449
+ .xh-scope-date-picker[data-part='calendar'][hidden] {
450
+ display: none;
451
+ }
452
+
453
+ /* —— 快捷选项:一条按钮式条目 —— */
454
+ /* 手机档:整条压在面板顶部占满一行,条目横着排,放不下就这一条自己横滚 */
455
+ .xh-scope-date-picker[data-part='preset-group'] {
456
+ display: flex;
457
+ /* 独占面板的一整行,后面的日历折到它下面 */
458
+ flex: 0 0 100%;
459
+ /* 这一条的另一轴由并排的那块给:不写就按内容收,分隔线只画到最后一条选项 */
460
+ align-self: stretch;
461
+ flex-direction: row;
462
+ gap: var(--xh-date-picker-preset-group-gap, var(--xh-space-1));
463
+ /* 选项多起来时这一条自己滚,不把整张面板撑大 */
464
+ max-block-size: var(--xh-date-picker-preset-group-h, var(--xh-viewport-h-lg));
465
+ padding-block: var(--xh-date-picker-preset-group-py, var(--xh-space-2_5));
466
+ padding-inline: var(--xh-date-picker-preset-group-px, var(--xh-space-2));
467
+ overflow-x: auto;
468
+ overflow-y: hidden;
469
+ /* 浮层滚动面:滚到头不把页面一起带走 */
470
+ overscroll-behavior: contain;
471
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-solid-border));
472
+ }
473
+
474
+ /* 平板起:换成贴在日历行内起始一侧的竖列,滚动轴与分隔线一起转过来 */
475
+ @media (min-width: 768px) {
476
+ .xh-scope-date-picker[data-part='preset-group'] {
477
+ flex: none;
478
+ flex-direction: column;
479
+ overflow: auto;
480
+ border-block-end: none;
481
+ border-inline-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-solid-border));
482
+ }
483
+ }
484
+
485
+ .xh-scope-date-picker[data-part='preset-group'][hidden] {
486
+ display: none;
487
+ }
488
+
489
+ /* 快捷选项:每一项是一颗 24 高的淡底小钮——静息 100、悬停 / 高亮 200、按下 300(淡底承载阶梯),
490
+ 字取说明档 12px、次级前景;禁用面由 Collection Item 家族按 overlay 语境给。headless 把它投成 listbox 的
491
+ option、当前值落在哪一项就报 aria-selected,选中仍画行尾对号(面与字不变),对号是这条状态唯一的视觉通道。
492
+ 选项没有正文部件,匿名文本进不了家族网格的 text 列,行保持块级排版,末端为对号预留固定轨 */
493
+ .xh-scope-date-picker[data-part='preset'] {
494
+ --xh-collection-block-padding: 0;
495
+ --xh-collection-inline-padding: var(--xh-date-picker-preset-px, var(--xh-space-2));
496
+ --xh-collection-font-size: var(--xh-date-picker-preset-font-size, var(--xh-text-caption-size));
497
+ --xh-collection-radius: var(--xh-date-picker-preset-radius, var(--xh-shape-control));
498
+ --xh-collection-fg-rest: var(--xh-date-picker-preset-fg, var(--xh-fg-muted));
499
+ --xh-collection-fg-selected: var(--xh-date-picker-preset-fg, var(--xh-fg-muted));
500
+ /* 悬停 / 高亮 / 按下时字换正文色:底升到 200 / 300 之后,次级前景在暗色下不足 4.5:1 */
501
+ --xh-collection-fg-hover: var(--xh-date-picker-preset-fg-hover, var(--xh-fg-default));
502
+ --xh-collection-fg-keyboard-highlight: var(--xh-date-picker-preset-fg-hover, var(--xh-fg-default));
503
+ --xh-collection-fg-pressed: var(--xh-date-picker-preset-fg-hover, var(--xh-fg-default));
504
+ --xh-collection-fg-selected-highlight: var(--xh-date-picker-preset-fg-hover, var(--xh-fg-default));
505
+ --xh-collection-fg-selected-hover: var(--xh-date-picker-preset-fg-hover, var(--xh-fg-default));
506
+ --xh-collection-fg-selected-pressed: var(--xh-date-picker-preset-fg-hover, var(--xh-fg-default));
507
+ --xh-collection-fg-disabled: var(--xh-date-picker-preset-fg-disabled, var(--xh-fg-disabled));
508
+ --xh-collection-font-weight-selected: var(--xh-font-weight-regular);
509
+ --xh-collection-font-weight-selected-highlight: var(--xh-font-weight-regular);
510
+ --xh-collection-font-weight-selected-hover: var(--xh-font-weight-regular);
511
+ --xh-collection-font-weight-selected-pressed: var(--xh-font-weight-regular);
512
+ --xh-collection-bg-rest: var(--xh-date-picker-preset-bg, var(--xh-bg-subtle));
513
+ --xh-collection-bg-selected: var(--xh-date-picker-preset-bg, var(--xh-bg-subtle));
514
+ --xh-collection-bg-hover: var(--xh-date-picker-preset-bg-hover, var(--xh-bg-subtle-hover));
515
+ --xh-collection-bg-keyboard-highlight: var(--xh-date-picker-preset-bg-hover, var(--xh-bg-subtle-hover));
516
+ --xh-collection-bg-selected-highlight: var(--xh-date-picker-preset-bg-hover, var(--xh-bg-subtle-hover));
517
+ --xh-collection-bg-selected-hover: var(--xh-date-picker-preset-bg-hover, var(--xh-bg-subtle-hover));
518
+ --xh-collection-bg-pressed: var(--xh-date-picker-preset-bg-pressed, var(--xh-bg-subtle-active));
519
+ --xh-collection-bg-selected-pressed: var(--xh-date-picker-preset-bg-pressed, var(--xh-bg-subtle-active));
520
+ --xh-collection-outline-keyboard-highlight: transparent;
521
+ --xh-collection-outline-selected-highlight: transparent;
522
+
523
+ /* 横着排那一档不许被压扁:条目文本本来就不折行 */
524
+ position: relative;
525
+ display: block;
526
+ flex: none;
527
+ block-size: var(--xh-date-picker-preset-h, var(--xh-control-action-size));
528
+ /* 对号的末端轨始终留着,切换选中时文字与整列宽度都不移动。 */
529
+ padding-inline-end: calc(
530
+ var(--xh-date-picker-preset-px, var(--xh-space-2)) +
531
+ var(--xh-date-picker-preset-check-size, var(--xh-control-indicator-sm)) +
532
+ var(--xh-space-1)
533
+ );
534
+ /* 一行字在 24 高的钮里垂直居中 */
535
+ line-height: var(--xh-date-picker-preset-h, var(--xh-control-action-size));
536
+ white-space: nowrap;
537
+ user-select: none;
538
+ }
539
+
540
+ /* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
541
+ .xh-scope-date-picker[data-part='preset']:focus-visible:not(:hover) {
542
+ --xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
543
+ --xh-collection-outline-selected-highlight: var(--xh-ring-focus);
544
+
545
+ transition: none;
546
+ }
547
+
548
+ /* 上面给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
549
+ .xh-scope-date-picker[data-part='preset'][hidden] {
550
+ display: none;
551
+ }
552
+
553
+ .xh-scope-date-picker[data-part='preset']::after {
554
+ content: '';
555
+ position: absolute;
556
+ inset-block-start: 50%;
557
+ inset-inline-end: var(--xh-date-picker-preset-px, var(--xh-space-2));
558
+ inline-size: var(--xh-date-picker-preset-check-size, var(--xh-control-indicator-sm));
559
+ block-size: var(--xh-date-picker-preset-check-size, var(--xh-control-indicator-sm));
560
+ translate: 0 -50%;
561
+ background-color: var(--xh-date-picker-preset-check-fg, var(--xh-_date-picker-check-fg));
562
+ opacity: 0;
563
+ pointer-events: none;
564
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
565
+ -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
566
+ mask: var(--xh-glyph-mark-check) center / contain no-repeat;
567
+ }
568
+
569
+ .xh-scope-date-picker[data-part='preset'][data-state='checked']::after {
570
+ opacity: 1;
571
+ }
572
+
573
+ .xh-scope-date-picker[data-part='preset'][data-disabled]::after {
574
+ background-color: var(--xh-date-picker-preset-fg-disabled, var(--xh-fg-disabled));
575
+ }
576
+
577
+ /* —— showTime:时间列贴在日历右侧、逐列滚动,确认按钮收口 ——
578
+ content 是 block,作者把日历与时间列包进一行排布;列自身只管滚与选项画法。
579
+ 列顶让出与日历标题栏等高的一带(不含它下沿那道线;作者改了标题栏的内衬就同步改 --xh-date-picker-time-column-offset),列自己的上沿描边接着标题栏的分隔线画过去,
580
+ 两段连成一条;列与列之间不画线,日历与时间区之间那道竖线由日历的 ::after 画。
581
+ 列高与日历网格同高(再加列顶那道线),列底与网格底边对齐 */
582
+ .xh-scope-date-picker[data-part='time-column'] {
583
+ --xh-_date-picker-time-column-h: var(--xh-date-picker-time-column-h, var(--xh-overlay-calendar-column-h));
584
+ --xh-_date-picker-time-column-py: var(--xh-date-picker-time-column-py, var(--xh-space-1));
585
+
586
+ display: flex;
587
+ flex: none;
588
+ flex-direction: column;
589
+ gap: var(--xh-date-picker-time-column-gap, var(--xh-space-2));
590
+ min-inline-size: var(--xh-date-picker-time-column-min-w, var(--xh-overlay-column-min-w));
591
+ /* 几列并排:定高而不是随内容收,否则时列与分列的可选值一多一少就错位 */
592
+ block-size: calc(var(--xh-_date-picker-time-column-h) + var(--xh-stroke-thin));
593
+ margin-block-start: var(
594
+ --xh-date-picker-time-column-offset,
595
+ calc(var(--xh-control-action-size) + 2 * var(--xh-space-2))
596
+ );
597
+ /* 列底留出一截空白:末尾几格(23 时、55–59 分)也能滚到列顶,各列的选中落在同一行 */
598
+ padding-block: var(--xh-_date-picker-time-column-py)
599
+ calc(var(--xh-_date-picker-time-column-h) - var(--xh-date-picker-time-item-h, var(--xh-control-action-size)) - var(--xh-_date-picker-time-column-py));
600
+ padding-inline: var(--xh-date-picker-time-column-px, 0);
601
+ overflow-x: hidden;
602
+ overflow-y: auto;
603
+ /* 浮层滚动面:滚到头不把页面一起带走 */
604
+ overscroll-behavior: contain;
605
+ border-block-start: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-solid-border));
606
+ }
607
+
608
+ .xh-scope-date-picker[data-part='time-column'][hidden] {
609
+ display: none;
610
+ }
611
+
612
+ /* 粗指针下日历格长到 44 见方(行距从 36 加到 44),网格多出六行的那截;列高跟着加,列底仍与网格底边对齐 */
613
+ @media (pointer: coarse) {
614
+ .xh-scope-date-picker[data-part='time-column'] {
615
+ --xh-_date-picker-time-column-h: var(--xh-date-picker-time-column-h, var(--xh-overlay-calendar-column-h-coarse));
616
+ }
617
+ }
618
+
619
+ /* 时间格:24 高的通栏条,列内间距 8 撑出 32 的行距;悬停 / 高亮 100、按下 200 由 Collection Item 家族按
620
+ overlay 语境给,选中透明底 + 中等字重 + 末端对号(对号集合的选中),不上品牌淡底、不变字色。格里只有数字、没有正文部件,保持自己的
621
+ 居中排版与等宽标记轨,家族只给状态面。行的字色与字重按值选择族的同一套映射写(--xh-date-picker-time-item-fg
622
+ / -fg-selected / -font-weight-selected 使用者槽,缺省落家族配方的行字色 --xh-material-frosted-fg:
623
+ 它在各主题与 forced-colors 下都等于 --xh-fg-default,floating 面板上的面色仍由 content 自己给) */
624
+ .xh-scope-date-picker[data-part='time-item'] {
625
+ --xh-_date-picker-time-item-rail: max(
626
+ var(--xh-date-picker-time-item-px, var(--xh-space-0_5)),
627
+ calc(var(--xh-date-picker-time-item-check-size, var(--xh-_date-picker-time-item-check-size)) + var(--xh-space-0_5))
628
+ );
629
+ --xh-collection-block-padding: 0;
630
+ --xh-collection-inline-padding: var(--xh-_date-picker-time-item-rail);
631
+ --xh-collection-font-size: var(--xh-date-picker-time-item-font-size, var(--xh-_date-picker-font-size));
632
+ /* 浮层里的列表是通栏行:格铺满列宽、不取圆角 */
633
+ --xh-collection-radius: var(--xh-date-picker-time-item-radius, 0);
634
+ --xh-collection-fg-rest: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
635
+ --xh-collection-fg-hover: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
636
+ --xh-collection-fg-keyboard-highlight: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
637
+ --xh-collection-fg-pressed: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
638
+ --xh-collection-fg-selected: var(--xh-date-picker-time-item-fg-selected, var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg)));
639
+ --xh-collection-fg-selected-highlight: var(--xh-date-picker-time-item-fg-selected, var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg)));
640
+ --xh-collection-fg-selected-hover: var(--xh-date-picker-time-item-fg-selected, var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg)));
641
+ --xh-collection-fg-selected-pressed: var(--xh-date-picker-time-item-fg-selected, var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg)));
642
+ --xh-collection-font-weight-selected: var(--xh-date-picker-time-item-font-weight-selected, var(--xh-font-weight-medium));
643
+ --xh-collection-font-weight-selected-highlight: var(--xh-date-picker-time-item-font-weight-selected, var(--xh-font-weight-medium));
644
+ --xh-collection-font-weight-selected-hover: var(--xh-date-picker-time-item-font-weight-selected, var(--xh-font-weight-medium));
645
+ --xh-collection-font-weight-selected-pressed: var(--xh-date-picker-time-item-font-weight-selected, var(--xh-font-weight-medium));
646
+ --xh-collection-bg-hover: var(--xh-date-picker-time-item-bg-hover, var(--xh-bg-subtle));
647
+ --xh-collection-bg-keyboard-highlight: var(--xh-date-picker-time-item-bg-hover, var(--xh-bg-subtle));
648
+ --xh-collection-bg-selected-highlight: var(--xh-date-picker-time-item-bg-hover, var(--xh-bg-subtle));
649
+ --xh-collection-bg-selected-hover: var(--xh-date-picker-time-item-bg-hover, var(--xh-bg-subtle));
650
+ --xh-collection-bg-pressed: var(--xh-date-picker-time-item-bg-pressed, var(--xh-bg-subtle-hover));
651
+ --xh-collection-bg-selected-pressed: var(--xh-date-picker-time-item-bg-pressed, var(--xh-bg-subtle-hover));
652
+ --xh-collection-outline-keyboard-highlight: transparent;
653
+ --xh-collection-outline-selected-highlight: transparent;
654
+
655
+ position: relative;
656
+ display: flex;
657
+ flex: none;
658
+ align-items: center;
659
+ justify-content: center;
660
+ block-size: var(--xh-date-picker-time-item-h, var(--xh-control-action-size));
661
+ font-variant-numeric: tabular-nums;
662
+ line-height: var(--xh-leading-normal);
663
+ text-align: center;
664
+ white-space: nowrap;
665
+ user-select: none;
666
+ }
667
+
668
+ /* 命中区向上下各补半个列内间距:两格之间那 8px 缝归上下两格各一半,指针落在缝里不落空 */
669
+ .xh-scope-date-picker[data-part='time-item']::before {
670
+ content: '';
671
+ position: absolute;
672
+ inset-block: calc(-0.5 * var(--xh-date-picker-time-column-gap, var(--xh-space-2)));
673
+ inset-inline: 0;
674
+ }
675
+
676
+ .xh-scope-date-picker[data-part='time-item'][hidden] {
677
+ display: none;
678
+ }
679
+
680
+ /* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
681
+ .xh-scope-date-picker[data-part='time-item']:focus-visible:not(:hover) {
682
+ --xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
683
+ --xh-collection-outline-selected-highlight: var(--xh-ring-focus);
684
+
685
+ transition: none;
686
+ }
687
+
688
+ .xh-scope-date-picker[data-part='time-item']::after {
689
+ content: '';
690
+ position: absolute;
691
+ inset-block-start: 50%;
692
+ /* 标记占轨道末端,内缘与正文之间恒留一档间隙;与 padding 读同一个 rail,避免重叠。 */
693
+ inset-inline-end: calc(
694
+ var(--xh-_date-picker-time-item-rail) -
695
+ var(--xh-date-picker-time-item-check-size, var(--xh-_date-picker-time-item-check-size)) -
696
+ var(--xh-space-1)
697
+ );
698
+ inline-size: var(--xh-date-picker-time-item-check-size, var(--xh-_date-picker-time-item-check-size));
699
+ block-size: var(--xh-date-picker-time-item-check-size, var(--xh-_date-picker-time-item-check-size));
700
+ translate: 0 -50%;
701
+ background-color: var(--xh-date-picker-time-item-check-fg, var(--xh-_date-picker-check-fg));
702
+ opacity: 0;
703
+ pointer-events: none;
704
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
705
+ -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
706
+ mask: var(--xh-glyph-mark-check) center / contain no-repeat;
707
+ }
708
+
709
+ .xh-scope-date-picker[data-part='time-item'][data-state='checked']::after {
710
+ opacity: 1;
711
+ }
712
+
713
+ /* 界外、被判为不可用的格走 aria-disabled,家族按它给禁用面;选中标记跟着降级 */
714
+ .xh-scope-date-picker[data-part='time-item'][data-disabled]::after {
715
+ background-color: var(--xh-fg-disabled);
716
+ }
717
+
718
+ @media not all and (min-width: 768px) {
719
+ .xh-scope-date-picker[data-part='time-column'] {
720
+ min-inline-size: var(--xh-date-picker-time-column-min-w-mobile, 2.75rem);
721
+ padding-inline: var(--xh-date-picker-time-column-px-mobile, 0);
722
+ }
723
+
724
+ .xh-scope-date-picker[data-part='time-item'] {
725
+ --xh-_date-picker-time-item-rail: var(
726
+ --xh-date-picker-time-item-check-size,
727
+ var(--xh-_date-picker-time-item-check-size)
728
+ );
729
+ }
730
+
731
+ .xh-scope-date-picker[data-part='time-item']::after {
732
+ inset-inline-end: 0;
733
+ }
734
+ }
735
+
736
+ /* 列整体禁用时格没有自己的 aria-disabled,禁用面按列的 aria-disabled 映射到家族槽:
737
+ 字色降级、悬停 / 高亮 / 按下不换面、光标 not-allowed */
738
+ .xh-scope-date-picker[data-part='time-column'][aria-disabled='true'] [data-part='time-item']:where(.xh-scope-date-picker) {
739
+ --xh-collection-fg-rest: var(--xh-fg-disabled);
740
+ --xh-collection-fg-hover: var(--xh-fg-disabled);
741
+ --xh-collection-fg-keyboard-highlight: var(--xh-fg-disabled);
742
+ --xh-collection-fg-pressed: var(--xh-fg-disabled);
743
+ --xh-collection-fg-selected: var(--xh-fg-disabled);
744
+ --xh-collection-bg-hover: transparent;
745
+ --xh-collection-bg-keyboard-highlight: transparent;
746
+ --xh-collection-bg-pressed: transparent;
747
+ --xh-collection-bg-selected-hover: transparent;
748
+ --xh-collection-bg-selected-highlight: transparent;
749
+ --xh-collection-bg-selected-pressed: transparent;
750
+ --xh-collection-cursor-rest: not-allowed;
751
+ --xh-collection-cursor-hover: not-allowed;
752
+ --xh-collection-cursor-keyboard-highlight: not-allowed;
753
+ --xh-collection-cursor-pressed: not-allowed;
754
+ --xh-collection-cursor-selected: not-allowed;
755
+ }
756
+
757
+ .xh-scope-date-picker[data-part='time-column'][aria-disabled='true'] [data-part='time-item']:where(.xh-scope-date-picker)::after {
758
+ background-color: var(--xh-fg-disabled);
759
+ }
760
+
761
+ /* 确认钮是面板里唯一的主要动作:品牌实心、悬停 / 按下换面、焦点环全由 Action Control 的 text solid 档给,
762
+ xs 档 24 高、字取说明档 12px;槽名统一按部件取 --xh-date-picker-confirm-trigger-*,只映射到家族桥接槽 */
763
+ .xh-scope-date-picker[data-part='confirm-trigger'] {
764
+ --xh-action-visual-size: var(--xh-date-picker-confirm-trigger-h, var(--xh-_action-profile-visual-size));
765
+ --xh-action-padding-inline: var(--xh-date-picker-confirm-trigger-px, var(--xh-space-2));
766
+ --xh-action-radius: var(--xh-date-picker-confirm-trigger-radius, var(--xh-shape-control));
767
+ --xh-action-bg-rest: var(--xh-date-picker-confirm-trigger-bg, var(--xh-_action-variant-bg-rest));
768
+ --xh-action-bg-hover: var(--xh-date-picker-confirm-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
769
+ --xh-action-bg-pressed: var(--xh-date-picker-confirm-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
770
+ --xh-action-fg-rest: var(--xh-date-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-rest));
771
+ --xh-action-fg-hover: var(--xh-date-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-hover));
772
+ --xh-action-fg-pressed: var(--xh-date-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-pressed));
773
+ --xh-action-border-rest: transparent;
774
+ --xh-action-highlight-rest: transparent;
775
+ --xh-action-shadow-rest: var(--xh-date-picker-confirm-trigger-shadow, none);
776
+ --xh-action-shadow-hover: var(--xh-date-picker-confirm-trigger-shadow, none);
777
+ --xh-action-shadow-pressed: var(--xh-date-picker-confirm-trigger-shadow, none);
778
+ --xh-action-font-size: var(--xh-date-picker-confirm-trigger-font-size, var(--xh-text-caption-size));
779
+
780
+ border-width: 0;
781
+ }
782
+
783
+ /* 收起时连接层给的是 hidden 属性;家族那条 display 会把 UA 规则盖掉 */
784
+ .xh-scope-date-picker[data-part='confirm-trigger'][hidden] {
785
+ display: none;
786
+ }
787
+
788
+ /* 底栏:面板底部通栏的一条操作区,上沿一道 border-default 线与日历、时间列隔开,四周 8 的内衬;
789
+ 面板换行排布(并排两张日历、快捷选项列、直接排在面板里的时间列)时独占一整行,落在它们下面。
790
+ 首个子节点落在撑满余宽的那条轨道上,其后的各自按内容宽排在行尾:作者另放的文字与链接排在行首,
791
+ 确认钮总落在行尾;只放了确认钮时它独占那条轨道,靠 justify-self 贴到行尾。
792
+ 底栏不参与撑宽:面板换行排布时,Chrome 把每个子项的固有宽相加当作面板的固有宽,
793
+ 底栏的字与钮会把面板多撑出一截、日历与时间列末端空出一块。inline-size 包含让它的内容不计入固有宽,
794
+ 行内内衬也就不能写在它自己身上(内衬照样计入),改由两端各一个定宽占位让出(见下面那条) */
795
+ .xh-scope-date-picker[data-part='footer'] {
796
+ /* 两端占位的宽:占位与相邻项之间本来就隔着一道 gap,占位自己只补到内衬的差额 */
797
+ --xh-_date-picker-footer-inset: max(
798
+ var(--xh-space-0),
799
+ calc(var(--xh-date-picker-footer-px, var(--xh-space-2)) - var(--xh-date-picker-footer-gap, var(--xh-space-2)))
800
+ );
801
+
802
+ display: grid;
803
+ contain: inline-size;
804
+ flex-basis: 100%;
805
+ grid-auto-flow: column;
806
+ grid-template-columns: minmax(0, 1fr);
807
+ align-items: center;
808
+ gap: var(--xh-date-picker-footer-gap, var(--xh-space-2));
809
+ padding-block: var(--xh-date-picker-footer-py, var(--xh-space-2));
810
+ border-block-start: var(--xh-stroke-thin) solid var(--xh-date-picker-footer-border, var(--xh-material-solid-border));
811
+ color: var(--xh-date-picker-footer-fg, var(--xh-fg-muted));
812
+ font-size: var(--xh-date-picker-footer-font-size, var(--xh-text-caption-size));
813
+ }
814
+
815
+ /* 上面给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
816
+ .xh-scope-date-picker[data-part='footer'][hidden] {
817
+ display: none;
818
+ }
819
+
820
+ /* 底栏里只放了确认钮、而确认钮按状态收起(没开 showTime)时,底栏一并让位,不留一条空栏 */
821
+ .xh-scope-date-picker[data-part='footer']:has(> .xh-scope-date-picker[data-part='confirm-trigger'][hidden]:only-child) {
822
+ display: none;
823
+ }
824
+
825
+ .xh-scope-date-picker[data-part='footer'] > .xh-scope-date-picker[data-part='confirm-trigger'] {
826
+ justify-self: end;
827
+ }
828
+
829
+ /* 行首行尾的内衬由两端的定宽占位让出,不挂在首末子节点上:首个子节点可能是裸文本,
830
+ 末一个可能是按状态收起的确认钮,外边距都接不住。占位与其余子项一样在 inline-size 包含之内,不计入面板的固有宽 */
831
+ .xh-scope-date-picker[data-part='footer']::before,
832
+ .xh-scope-date-picker[data-part='footer']::after {
833
+ content: '';
834
+ inline-size: var(--xh-_date-picker-footer-inset);
835
+ }
836
+
837
+ /* 行首占位落在那条撑满余宽的显式轨道之前(在它前面长出一条隐式列),首个子节点仍落在那条轨道上。
838
+ 占位不进显式轨道:尺寸包含照样计入显式轨道与轨道间的 gap,多一条显式列面板就多撑出一道 gap */
839
+ .xh-scope-date-picker[data-part='footer']::before {
840
+ grid-column: span 1 / 1;
841
+ }
842
+
843
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
844
+ .xh-scope-date-picker[data-part='clear-trigger']:empty::before {
845
+ content: '';
846
+ display: inline-block;
847
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
848
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
849
+ vertical-align: var(--xh-glyph-baseline-shift);
850
+ background-color: currentColor;
851
+ -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
852
+ mask: var(--xh-glyph-mark-close) center / contain no-repeat;
853
+ }
854
+
855
+ .xh-scope-date-picker[data-part='trigger']:empty::before {
856
+ content: '';
857
+ display: inline-block;
858
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
859
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
860
+ vertical-align: var(--xh-glyph-baseline-shift);
861
+ background-color: currentColor;
862
+ -webkit-mask: var(--xh-glyph-mark-calendar) center / contain no-repeat;
863
+ mask: var(--xh-glyph-mark-calendar) center / contain no-repeat;
864
+ }
865
+
866
+ @media (forced-colors: active) {
867
+ /* 整条占位的文字照系统的弱色画;段位让位时的透明字不被强制换色顶回来 */
868
+ .xh-scope-date-picker[data-part='segment-group'][data-placeholder-shown] {
869
+ forced-color-adjust: none;
870
+ }
871
+
872
+ .xh-scope-date-picker[data-part='segment-group'][data-placeholder-shown]::before,
873
+ .xh-scope-date-picker[data-part='tag-list'][data-placeholder-shown]::before {
874
+ color: GrayText;
875
+ }
876
+
877
+ /* 系统接管底色后仍保住末端对号;禁用标记改用系统失效色。 */
878
+ .xh-scope-date-picker[data-part='preset']::after,
879
+ .xh-scope-date-picker[data-part='time-item']::after {
880
+ forced-color-adjust: none;
881
+ background-color: CanvasText;
882
+ }
883
+
884
+ /* 按下与没被高亮时的悬停,家族把条目涂成 Highlight,对号跟着换 HighlightText */
885
+ .xh-scope-date-picker[data-part='preset']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted]))::after,
886
+ .xh-scope-date-picker[data-part='time-item']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted]))::after {
887
+ background-color: HighlightText;
888
+ }
889
+
890
+ .xh-scope-date-picker[data-part='preset'][data-disabled]::after,
891
+ .xh-scope-date-picker[data-part='time-item'][data-disabled]::after,
892
+ .xh-scope-date-picker[data-part='time-column'][aria-disabled='true'] [data-part='time-item']:where(.xh-scope-date-picker)::after {
893
+ background-color: GrayText;
894
+ }
895
+
896
+ .xh-scope-date-picker[data-part='preset'][data-disabled],
897
+ .xh-scope-date-picker[data-part='time-item'][data-disabled],
898
+ .xh-scope-date-picker[data-part='time-column'][aria-disabled='true'] [data-part='time-item']:where(.xh-scope-date-picker) {
899
+ color: GrayText;
900
+ }
901
+ }
902
+
903
+ @media (forced-colors: active) {
904
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
905
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
906
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
907
+ 禁用取 GrayText */
908
+ .xh-scope-date-picker:is([data-part='clear-trigger'], [data-part='trigger']):empty::before {
909
+ forced-color-adjust: none;
910
+ background-color: ButtonText;
911
+ }
912
+
913
+ .xh-scope-date-picker:is([data-part='clear-trigger'], [data-part='trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
914
+ background-color: HighlightText;
915
+ }
916
+
917
+ .xh-scope-date-picker:is([data-part='clear-trigger'], [data-part='trigger'])[data-disabled]:empty::before {
918
+ background-color: GrayText;
919
+ }
920
+ }
921
+ }
922
+
923
+ @layer xihan.motion {
924
+ @media print {
925
+ /* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
926
+ 收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
927
+ .xh-scope-date-picker[data-part='positioner'] {
928
+ display: none;
929
+ }
930
+ }
931
+ }