@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
@@ -14,14 +14,11 @@
14
14
  --xh-calendar-range-picker-skin: 1;
15
15
  }
16
16
 
17
+ /* 标题栏与网格各自带内衬、彼此不留空当:标题栏下沿那道分隔线就是两块的界 */
17
18
  [data-scope='calendar-range-picker'][data-part='root'] {
18
- /* 翻页钮是 sm 档的图标钮(--xh-control-h-sm 见方),钮里的图标按 sm 档取 --xh-glyph-size-sm;
19
- 作者塞进去的图标与皮肤画的兜底字形同一把尺 */
20
- --xh-icon-size: var(--xh-calendar-range-picker-icon-size, var(--xh-glyph-size-sm));
21
-
22
19
  display: flex;
23
20
  flex-direction: column;
24
- gap: var(--xh-calendar-range-picker-gap, var(--xh-space-2));
21
+ gap: var(--xh-calendar-range-picker-gap, var(--xh-space-0));
25
22
  /* 数字等宽:1 与 7 的字形宽度在比例字体里并不相同,不定住会让整张网格随月份抖动 */
26
23
  font-variant-numeric: tabular-nums;
27
24
  }
@@ -30,12 +27,20 @@
30
27
  display: none;
31
28
  }
32
29
 
30
+ /* 标题栏:上下 8、左右 16 的内衬里放一排 24 高的钮与标题,下沿一道通栏分隔线。
31
+ 翻页钮里的字形取 xs 图标钮的字形档(--xh-glyph-size-sm),作者塞进钮里的图标与皮肤画的兜底字形同一把尺;
32
+ 这一档写在标题栏上而不是日历根上:日期范围选择器里的日历没有根节点,标题栏两边都有 */
33
33
  [data-scope='calendar-range-picker'][data-part='header'] {
34
+ --xh-icon-size: var(--xh-calendar-range-picker-icon-size, var(--xh-glyph-size-sm));
35
+
34
36
  display: flex;
35
37
  align-items: center;
36
38
  justify-content: space-between;
37
- gap: var(--xh-calendar-range-picker-header-gap, var(--xh-space-2));
38
- min-block-size: var(--xh-control-h-sm);
39
+ gap: var(--xh-calendar-range-picker-header-gap, var(--xh-space-1));
40
+ min-block-size: calc(var(--xh-control-action-size) + 2 * var(--xh-calendar-range-picker-header-py, var(--xh-space-2)) + var(--xh-stroke-thin));
41
+ padding-block: var(--xh-calendar-range-picker-header-py, var(--xh-space-2));
42
+ padding-inline: var(--xh-calendar-range-picker-header-px, var(--xh-space-4));
43
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-calendar-range-picker-header-border, var(--xh-material-solid-border));
39
44
  }
40
45
 
41
46
  [data-scope='calendar-range-picker'][data-part='header'][hidden] {
@@ -47,32 +52,30 @@
47
52
  text-align: center;
48
53
  color: var(--xh-calendar-range-picker-heading-fg, var(--xh-fg-default));
49
54
  font-size: var(--xh-calendar-range-picker-heading-font-size, var(--xh-text-label-size));
50
- font-weight: var(--xh-calendar-range-picker-heading-font-weight, var(--xh-font-weight-semibold));
55
+ font-weight: var(--xh-calendar-range-picker-heading-font-weight, var(--xh-font-weight-medium));
51
56
  line-height: var(--xh-leading-none);
52
57
  user-select: none;
53
58
  }
54
59
 
55
60
  /* 标题里的年与月:点它们逐级钻上去(年 → 十年格、月 → 月格)。
56
- 长得像标题而不像按钮——它本来就是标题,只是可点 */
57
- /* 标题里的年与月接 Action Control text 档(日期翻页按钮同族):盒、按下 / 禁用面、0.97 缩放与换底、焦点环与过渡
58
- 由家族配方给,这里只把使用者槽映射到桥接槽。长得像标题而不像按钮——它本来就是标题,只是可点:静息透明(ghost),
59
- 悬停只换字色不换底(标题不是一枚按钮面),按下换到 200 档中性面(白底承载);到顶那一层只作标题显示,
60
- 光标别装成能点,也不再换面 */
61
+ 接 Action Control text 档(日期翻页按钮同族)、xs 档 24 高:盒、悬停 / 按下 / 禁用面、焦点环与过渡由家族配方给,
62
+ 这里只把使用者槽映射到桥接槽。长得像标题而不像按钮——它本来就是标题,只是可点:静息透明(ghost)、
63
+ 字色始终是标题色,悬停 100 → 按下 200 只换底(白底承载);到顶那一层只作标题显示,光标别装成能点 */
61
64
  [data-scope='calendar-range-picker'][data-part='heading-year-trigger']:not([hidden]),
62
65
  [data-scope='calendar-range-picker'][data-part='heading-month-trigger']:not([hidden]) {
63
- --xh-action-padding-inline: var(--xh-calendar-range-picker-heading-trigger-px, var(--xh-space-1));
66
+ --xh-action-padding-inline: var(--xh-calendar-range-picker-heading-trigger-px, var(--xh-space-0_5));
64
67
  --xh-action-radius: var(--xh-calendar-range-picker-heading-trigger-radius, var(--xh-shape-control));
65
- --xh-action-bg-hover: transparent;
68
+ --xh-action-bg-hover: var(--xh-calendar-range-picker-heading-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
66
69
  --xh-action-bg-pressed: var(--xh-calendar-range-picker-heading-trigger-bg-pressed, var(--xh-_action-variant-bg-pressed));
67
70
  --xh-action-fg-rest: var(--xh-calendar-range-picker-heading-fg, var(--xh-fg-default));
68
- --xh-action-fg-hover: var(--xh-calendar-range-picker-heading-trigger-fg-hover, var(--xh-fg-brand));
69
- --xh-action-fg-pressed: var(--xh-calendar-range-picker-heading-trigger-fg-hover, var(--xh-fg-brand));
71
+ --xh-action-fg-hover: var(--xh-calendar-range-picker-heading-fg, var(--xh-fg-default));
72
+ --xh-action-fg-pressed: var(--xh-calendar-range-picker-heading-fg, var(--xh-fg-default));
70
73
  --xh-action-fg-focus-visible: var(--xh-calendar-range-picker-heading-fg, var(--xh-fg-default));
71
74
  --xh-action-fg-disabled: var(--xh-calendar-range-picker-heading-fg, var(--xh-fg-default));
72
75
  --xh-action-font-size: var(--xh-calendar-range-picker-heading-font-size, var(--xh-text-label-size));
73
76
  --xh-action-cursor-disabled: default;
74
77
 
75
- font-weight: var(--xh-calendar-range-picker-heading-font-weight, var(--xh-font-weight-semibold));
78
+ font-weight: var(--xh-calendar-range-picker-heading-font-weight, var(--xh-font-weight-medium));
76
79
  }
77
80
 
78
81
  [data-scope='calendar-range-picker'][data-part='heading-year-trigger'][hidden],
@@ -80,15 +83,15 @@
80
83
  display: none;
81
84
  }
82
85
 
83
- /* 四颗方向钮接 Action Control icon 档(日期翻页按钮)、ghost 形态:正方盒、悬停 / 按下 / 禁用面、0.97 缩放与换底、
84
- 粗指针热区、焦点环与过渡由家族配方给,这里只把使用者槽映射到桥接槽;钮坐在日历的白底上,悬停 100 → 按下 200 */
86
+ /* 四颗方向钮接 Action Control icon 档 xs(24 见方)、ghost 形态:悬停 / 按下 / 禁用面、粗指针热区、焦点环与过渡
87
+ 由家族配方给,这里只把使用者槽映射到桥接槽。钮是正方的单图标动作,取圆;坐在日历的白底上,悬停 100 → 按下 200 */
85
88
  [data-scope='calendar-range-picker'][data-part='prev-year-trigger'],
86
89
  [data-scope='calendar-range-picker'][data-part='prev-trigger'],
87
90
  [data-scope='calendar-range-picker'][data-part='next-year-trigger'],
88
91
  [data-scope='calendar-range-picker'][data-part='next-trigger'] {
89
92
  --xh-action-visual-size: var(--xh-calendar-range-picker-nav-size, var(--xh-_action-profile-visual-size));
90
93
  --xh-action-min-inline-size: var(--xh-calendar-range-picker-nav-size, var(--xh-_action-profile-visual-size));
91
- --xh-action-radius: var(--xh-calendar-range-picker-nav-radius, var(--xh-shape-control));
94
+ --xh-action-radius: var(--xh-calendar-range-picker-nav-radius, var(--xh-shape-circle));
92
95
  --xh-action-bg-rest: var(--xh-calendar-range-picker-nav-bg, var(--xh-_action-variant-bg-rest));
93
96
  --xh-action-bg-hover: var(--xh-calendar-range-picker-nav-bg-hover, var(--xh-_action-variant-bg-hover));
94
97
  --xh-action-bg-pressed: var(--xh-calendar-range-picker-nav-bg-pressed, var(--xh-_action-variant-bg-pressed));
@@ -106,18 +109,25 @@
106
109
  display: none;
107
110
  }
108
111
 
109
-
112
+ /* 网格:上下 12、左右 16 的内衬;星期行与第一行日期之间不留空当 */
110
113
  [data-scope='calendar-range-picker'][data-part='grid'] {
111
114
  display: flex;
112
115
  flex-direction: column;
113
- gap: var(--xh-calendar-range-picker-grid-gap, var(--xh-space-1));
116
+ gap: var(--xh-calendar-range-picker-grid-gap, var(--xh-space-0));
117
+ padding-block: var(--xh-calendar-range-picker-grid-py, var(--xh-space-3));
118
+ padding-inline: var(--xh-calendar-range-picker-grid-px, var(--xh-space-4));
114
119
  }
115
120
 
116
- /* 周期视图:格子直接铺进网格,不再有周行那一层。 */
121
+ /* 周期视图与日视图同宽:钻上一层看月、年时面板不变窄,宽度按七列日期格加两侧内衬算 */
122
+ [data-scope='calendar-range-picker'][data-part='grid']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) {
123
+ min-inline-size: calc(7 * var(--xh-calendar-range-picker-cell-min-w, var(--xh-control-h-md)) + 2 * var(--xh-calendar-range-picker-grid-px, var(--xh-space-4)));
124
+ }
125
+
126
+ /* 周期视图:格子直接铺进网格,不再有周行那一层;格与格之间不留缝,区间的底色在一行里连成一条 */
117
127
  [data-scope='calendar-range-picker'][data-part='grid'][data-view='week'] {
118
128
  display: grid;
119
129
  grid-template-columns: minmax(0, 1fr);
120
- gap: var(--xh-calendar-range-picker-period-gap, var(--xh-space-1));
130
+ gap: var(--xh-calendar-range-picker-period-gap, var(--xh-space-0));
121
131
  }
122
132
 
123
133
  /* 月 3 列 × 4 行、季度 4 列一行、年 3 列。 */
@@ -125,40 +135,23 @@
125
135
  [data-scope='calendar-range-picker'][data-part='grid'][data-view='year'] {
126
136
  display: grid;
127
137
  grid-template-columns: repeat(3, minmax(0, 1fr));
128
- gap: var(--xh-calendar-range-picker-period-gap, var(--xh-space-1));
138
+ gap: var(--xh-calendar-range-picker-period-gap, var(--xh-space-0));
129
139
  }
130
140
 
131
141
  [data-scope='calendar-range-picker'][data-part='grid'][data-view='quarter'] {
132
142
  display: grid;
133
143
  grid-template-columns: repeat(4, minmax(0, 1fr));
134
- gap: var(--xh-calendar-range-picker-period-gap, var(--xh-space-1));
144
+ gap: var(--xh-calendar-range-picker-period-gap, var(--xh-space-0));
135
145
  }
136
146
 
147
+ /* 年网格限高自滚:原生细条落在内衬之外的边缘,内衬两侧仍对称 */
137
148
  [data-scope='calendar-range-picker'][data-part='grid'][data-view='year'] {
138
149
  align-content: start;
139
150
  max-block-size: var(--xh-calendar-range-picker-year-grid-max-h, var(--xh-viewport-h-sm));
140
- padding-inline-end: var(--xh-calendar-range-picker-year-grid-pe, var(--xh-space-1));
141
- /* 页内结构容器走原生细条(reset 层统一给)、滚动链保持 auto;嵌进 date-picker 浮层时由那份皮肤补 contain */
151
+ /* 页内结构容器走原生细条(reset 层统一给)、滚动链保持 auto;嵌进 date-range-picker 浮层时由那份皮肤补 contain */
142
152
  overflow-y: auto;
143
153
  }
144
154
 
145
- /* 周期格沿横轴铺开,但始终保持控制件高度;选中面只换颜色,不改变几何尺寸。 */
146
- [data-scope='calendar-range-picker'][data-part='grid']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) [data-part='cell-trigger'] {
147
- flex: 0 0 auto;
148
- aspect-ratio: auto;
149
- min-inline-size: 0;
150
- inline-size: min(3.5rem, 100%);
151
- padding-block: var(--xh-calendar-range-picker-period-py, var(--xh-space-2));
152
- border-radius: var(--xh-calendar-range-picker-period-radius, var(--xh-shape-control));
153
- }
154
-
155
- [data-scope='calendar-range-picker'][data-part='grid'][data-view='week'] [data-part='cell-trigger'] {
156
- flex: 1 1 auto;
157
- justify-content: flex-start;
158
- inline-size: 100%;
159
- padding-inline: var(--xh-calendar-range-picker-week-cell-px, var(--xh-space-3));
160
- }
161
-
162
155
  [data-scope='calendar-range-picker'][data-part='grid'][hidden] {
163
156
  display: none;
164
157
  }
@@ -185,17 +178,20 @@
185
178
  display: none;
186
179
  }
187
180
 
188
- /* 七等分:表头行与日期行共用同一条轨道定义,列才对得齐 */
181
+ /* 七等分:表头行与日期行共用同一条轨道定义,列才对得齐。每列不窄于中号控件高,
182
+ 浮层里的日历按内容收时由这条下限撑出面板宽(七列加两侧内衬) */
189
183
  [data-scope='calendar-range-picker'][data-part='week-row'] {
190
184
  display: grid;
191
- grid-template-columns: repeat(7, minmax(0, 1fr));
185
+ grid-template-columns: repeat(7, minmax(var(--xh-calendar-range-picker-cell-min-w, var(--xh-control-h-md)), 1fr));
192
186
  }
193
187
 
194
188
  /* 摆了周序号格的行多让出行首一列。写 :not([hidden]) 而不是靠顺序压过下面那条兜底——
195
189
  同特指度的规则谁在后面谁赢,收起态会被这条 display 掀开 */
196
190
  [data-scope='calendar-range-picker'][data-part='week-row']:not([hidden]):has(> [data-part='week-number']) {
197
191
  display: grid;
198
- grid-template-columns: var(--xh-calendar-range-picker-week-number-w, var(--xh-control-h-md)) repeat(7, minmax(0, 1fr));
192
+ grid-template-columns:
193
+ var(--xh-calendar-range-picker-week-number-w, var(--xh-control-h-md))
194
+ repeat(7, minmax(var(--xh-calendar-range-picker-cell-min-w, var(--xh-control-h-md)), 1fr));
199
195
  }
200
196
 
201
197
  /* 周序号只是行的标号:比日子小一号、颜色压下去,不跟着选中态走 */
@@ -215,14 +211,15 @@
215
211
  display: none;
216
212
  }
217
213
 
214
+ /* 星期行:与中号控件同高,正文字号、常规字重,颜色压一档 */
218
215
  [data-scope='calendar-range-picker'][data-part='week-day'] {
219
216
  display: flex;
220
217
  align-items: center;
221
218
  justify-content: center;
222
- block-size: var(--xh-calendar-range-picker-week-day-h, var(--xh-control-h-sm));
219
+ block-size: var(--xh-calendar-range-picker-week-day-h, var(--xh-control-h-md));
223
220
  color: var(--xh-calendar-range-picker-week-day-fg, var(--xh-fg-subtle));
224
- font-size: var(--xh-calendar-range-picker-week-day-font-size, var(--xh-text-caption-size));
225
- font-weight: var(--xh-calendar-range-picker-week-day-font-weight, var(--xh-font-weight-medium));
221
+ font-size: var(--xh-calendar-range-picker-week-day-font-size, var(--xh-text-body-size));
222
+ font-weight: var(--xh-calendar-range-picker-week-day-font-weight, var(--xh-font-weight-regular));
226
223
  line-height: var(--xh-leading-none);
227
224
  user-select: none;
228
225
  }
@@ -231,131 +228,214 @@
231
228
  display: none;
232
229
  }
233
230
 
234
- /* 格子是区间底色的画布:底色由格子的 ::before 铺出来,圆角的选中片留给 trigger。
235
- 铺在 trigger 上会被格间空隙切断,区间看起来就是一串断开的圆点 */
231
+ /* 格子是等分轨道里的一格,也是格内几样东西的定位盒:区间轨道或禁用横条画在 ::before、今天的圆点画在 ::after,
232
+ 日期钮的命中区(钮的 ::after)同样以它为包含块。上下各 6 的内衬把 24 高的钮撑成 36 的行距。
233
+ 格子自成一层:轨道与横条压在钮的下面,不盖住钮(钮不当定位盒) */
236
234
  [data-scope='calendar-range-picker'][data-part='cell'] {
235
+ /* 这副行距的半高:格内横条以格子中线为轴、按它收边,行距被拉高(粗指针)时横条不跟着变粗 */
236
+ --xh-_calendar-range-picker-row-half: calc(
237
+ var(--xh-calendar-range-picker-cell-size, var(--xh-control-action-size)) / 2
238
+ + var(--xh-calendar-range-picker-cell-py, var(--xh-space-1_5))
239
+ );
240
+ /* 区间轨道的半高:行距半高减去轨道上下各收的那截。帽以它为半径 */
241
+ --xh-_calendar-range-picker-range-r: calc(
242
+ var(--xh-_calendar-range-picker-row-half) - var(--xh-calendar-range-picker-range-inset, var(--xh-space-0_5))
243
+ );
244
+
237
245
  position: relative;
238
246
  display: flex;
239
247
  align-items: center;
240
248
  justify-content: center;
241
- padding: var(--xh-calendar-range-picker-cell-gap, var(--xh-space-0_5));
249
+ isolation: isolate;
250
+ padding-block: var(--xh-calendar-range-picker-cell-py, var(--xh-space-1_5));
251
+ padding-inline: var(--xh-calendar-range-picker-cell-px, var(--xh-space-0));
252
+ }
253
+
254
+ /* 周期格左右各留 4:钮在格里缩进一截,相邻两格的钮不贴在一起,区间轨道仍铺满整格 */
255
+ [data-scope='calendar-range-picker'][data-part='cell']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) {
256
+ padding-inline: var(--xh-calendar-range-picker-period-px, var(--xh-space-1));
242
257
  }
243
258
 
244
259
  [data-scope='calendar-range-picker'][data-part='cell'][hidden] {
245
260
  display: none;
246
261
  }
247
262
 
248
- /* 区间底色:横向铺满格子,相邻两格接成一条;纵向收在格子内衬里,行与行之间留出空当。
263
+ /* 不可用的日子:整格一条淡底横条,上下各收 2,相邻几天的横条连成一条带;落在区间里时让位给区间轨道 */
264
+ [data-scope='calendar-range-picker'][data-part='cell'][data-disabled]:not([data-in-range])::before {
265
+ content: '';
266
+ position: absolute;
267
+ z-index: -1;
268
+ inset-block: calc(50% - var(--xh-_calendar-range-picker-row-half) + var(--xh-calendar-range-picker-disabled-inset, var(--xh-space-0_5)));
269
+ inset-inline: 0;
270
+ background-color: var(--xh-calendar-range-picker-cell-bg-disabled, var(--xh-bg-subtle));
271
+ pointer-events: none;
272
+ }
273
+
274
+ /* 区间轨道:横向铺满格子,相邻两格接成一条;纵向以格子中线为轴、比行距上下各收 2(36 的行距里 32 高),行与行之间留出空当。
249
275
  轨道随 data-in-range 生灭,出现与消失都是当场的;过渡只在同一段轨道换底时走——
250
276
  挑到一半的预览落定成区间,中性淡底淡变到品牌淡底 */
251
277
  [data-scope='calendar-range-picker'][data-part='cell'][data-in-range]:not([data-outside-month])::before {
252
278
  content: '';
253
279
  position: absolute;
254
- inset-block: var(--xh-calendar-range-picker-cell-gap, var(--xh-space-0_5));
280
+ z-index: -1;
281
+ inset-block: calc(50% - var(--xh-_calendar-range-picker-range-r));
255
282
  inset-inline: 0;
256
- background: var(--xh-calendar-range-picker-range-bg, var(--xh-bg-brand-subtle));
283
+ background-color: var(--xh-calendar-range-picker-range-bg, var(--xh-bg-brand-subtle));
284
+ pointer-events: none;
257
285
  transition: background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
258
286
  }
259
287
 
260
288
  /* 挑到一半的预览还不是选中:品牌淡底专属选中 / 当前,预览铺中性淡底,与已落定的区间分开 */
261
289
  [data-scope='calendar-range-picker'][data-part='cell'][data-in-range][data-range-preview]:not([data-outside-month])::before {
262
- background: var(--xh-calendar-range-picker-range-preview-bg, var(--xh-bg-subtle));
290
+ background-color: var(--xh-calendar-range-picker-range-preview-bg, var(--xh-bg-subtle));
263
291
  }
264
292
 
265
- /* 行首与行尾收圆:区间跨周时每一行各是一条两头圆的横杠。
266
- 摆了周序号格的行里,行首那一格排在它后面 */
267
- [data-scope='calendar-range-picker'][data-part='week-row'] > [data-part='cell'][data-in-range]:first-child::before,
268
- [data-scope='calendar-range-picker'][data-part='week-row'] > [data-part='week-number'] + [data-part='cell'][data-in-range]::before {
269
- border-start-start-radius: var(--xh-calendar-range-picker-range-row-radius, var(--xh-shape-inset));
270
- border-end-start-radius: var(--xh-calendar-range-picker-range-row-radius, var(--xh-shape-inset));
293
+ /* 轨道两端收成半圆帽:端点那一格的实心圆坐在帽里。跨周折行处不收圆,一行的首尾是直边 */
294
+ [data-scope='calendar-range-picker'][data-part='cell'][data-in-range][data-range-start]::before {
295
+ border-start-start-radius: var(--xh-calendar-range-picker-range-cap-radius, var(--xh-shape-pill));
296
+ border-end-start-radius: var(--xh-calendar-range-picker-range-cap-radius, var(--xh-shape-pill));
271
297
  }
272
298
 
273
- [data-scope='calendar-range-picker'][data-part='week-row'] > [data-part='cell'][data-in-range]:last-child::before {
274
- border-start-end-radius: var(--xh-calendar-range-picker-range-row-radius, var(--xh-shape-inset));
275
- border-end-end-radius: var(--xh-calendar-range-picker-range-row-radius, var(--xh-shape-inset));
299
+ [data-scope='calendar-range-picker'][data-part='cell'][data-in-range][data-range-end]::before {
300
+ border-start-end-radius: var(--xh-calendar-range-picker-range-cap-radius, var(--xh-shape-pill));
301
+ border-end-end-radius: var(--xh-calendar-range-picker-range-cap-radius, var(--xh-shape-pill));
276
302
  }
277
303
 
278
- [data-scope='calendar-range-picker'][data-part='cell'][data-in-range][data-range-start]::before {
279
- border-start-start-radius: var(--xh-calendar-range-picker-range-cap-radius, var(--xh-shape-inset));
280
- border-end-start-radius: var(--xh-calendar-range-picker-range-cap-radius, var(--xh-shape-inset));
304
+ /* 日视图的端点是格子正中的圆:帽从「格中线减半高」起算,圆心落在格子中线上,与端点圆同心。
305
+ 从格边起算只在格宽恰为轨道高时重合,页内日历随容器铺宽、格子变宽后帽会偏到圆的外侧 */
306
+ [data-scope='calendar-range-picker'][data-part='cell'][data-view='day'][data-in-range][data-range-start]::before {
307
+ inset-inline-start: calc(50% - var(--xh-_calendar-range-picker-range-r));
281
308
  }
282
309
 
283
- [data-scope='calendar-range-picker'][data-part='cell'][data-in-range][data-range-end]::before {
284
- border-start-end-radius: var(--xh-calendar-range-picker-range-cap-radius, var(--xh-shape-inset));
285
- border-end-end-radius: var(--xh-calendar-range-picker-range-cap-radius, var(--xh-shape-inset));
310
+ [data-scope='calendar-range-picker'][data-part='cell'][data-view='day'][data-in-range][data-range-end]::before {
311
+ inset-inline-end: calc(50% - var(--xh-_calendar-range-picker-range-r));
312
+ }
313
+
314
+ /* 今天:数字下方一颗 4px 品牌圆点,数字保持正文色(brand-subtle 只留给选中);
315
+ 端点换实心面后圆点仍落在面的外面,落在区间里时压在轨道的下沿 */
316
+ [data-scope='calendar-range-picker'][data-part='cell'][data-today]::after {
317
+ content: '';
318
+ position: absolute;
319
+ inset-block-start: calc(50% + var(--xh-calendar-range-picker-cell-size, var(--xh-control-action-size)) / 2 + var(--xh-space-0_5));
320
+ inset-inline-start: 50%;
321
+ inline-size: var(--xh-calendar-range-picker-today-mark-size, var(--xh-space-1));
322
+ block-size: var(--xh-calendar-range-picker-today-mark-size, var(--xh-space-1));
323
+ border-radius: var(--xh-shape-circle);
324
+ background-color: var(--xh-calendar-range-picker-today-mark-bg, var(--xh-fg-brand));
325
+ translate: -50% 0;
326
+ pointer-events: none;
286
327
  }
287
328
 
288
- /* 粗粒度的格子之间有间隙,底色本就接不成一条,每一格各自收圆 */
289
- [data-scope='calendar-range-picker'][data-part='grid']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) > [data-part='cell'][data-in-range]::before {
290
- border-radius: var(--xh-calendar-range-picker-cell-radius, var(--xh-shape-inset));
329
+ [dir='rtl'] [data-scope='calendar-range-picker'][data-part='cell'][data-today]::after {
330
+ translate: 50% 0;
291
331
  }
292
332
 
293
- /* 日期格接 Action Control text 档(日历格是定尺控件,属格状当前)、ghost 形态:悬停 / 按下 / 禁用面、
294
- 0.97 缩放与换底、焦点环与过渡由家族配方给,这里只把使用者槽映射到桥接槽。几何仍由网格给:宽度由 week-row 的
295
- 等分轨道给、高度按 aspect-ratio 跟着走(block-size 归 auto,不取家族的固定高),日历才不会被长月份拉扁。
296
- 格子坐在日历的白底上:悬停 100 → 按下 200;今天 / 选中 / 邻月 / 不可用只换下面的私有槽 */
333
+ /* 日期格接 Action Control text 档 xs(日历格是定尺控件,属格状当前)、ghost 形态:悬停 / 按下 / 禁用面、
334
+ 焦点环与过渡由家族配方给,这里只把使用者槽映射到桥接槽。日视图是 24 见方的圆(下一条),
335
+ 周期视图是铺满格宽的 24 高钮、控件圆角。钮不当定位盒:命中区挂在格子上。
336
+ 格子坐在日历的白底上:悬停 100 → 按下 200;选中 / 邻月 / 不可用只换下面的私有槽 */
297
337
  [data-scope='calendar-range-picker'][data-part='cell-trigger'] {
298
338
  --xh-_calendar-range-picker-cell-bg: transparent;
299
339
  --xh-_calendar-range-picker-cell-bg-hover: var(--xh-calendar-range-picker-cell-bg-hover, var(--xh-_action-variant-bg-hover));
300
340
  --xh-_calendar-range-picker-cell-bg-pressed: var(--xh-calendar-range-picker-cell-bg-pressed, var(--xh-_action-variant-bg-pressed));
301
- --xh-_calendar-range-picker-cell-border: transparent;
302
341
  --xh-_calendar-range-picker-cell-fg: var(--xh-calendar-range-picker-cell-fg, var(--xh-fg-default));
303
342
 
304
- --xh-action-visual-size: auto;
305
- --xh-action-min-inline-size: var(--xh-calendar-range-picker-cell-size, var(--xh-control-h-sm));
343
+ --xh-action-visual-size: var(--xh-calendar-range-picker-cell-size, var(--xh-_action-profile-visual-size));
344
+ --xh-action-min-inline-size: var(--xh-calendar-range-picker-cell-size, var(--xh-_action-profile-visual-size));
306
345
  --xh-action-padding-inline: 0;
307
- --xh-action-radius: var(--xh-calendar-range-picker-cell-radius, var(--xh-shape-inset));
346
+ --xh-action-radius: var(--xh-calendar-range-picker-period-radius, var(--xh-shape-control));
308
347
  --xh-action-bg-rest: var(--xh-_calendar-range-picker-cell-bg);
309
348
  --xh-action-bg-hover: var(--xh-_calendar-range-picker-cell-bg-hover);
310
349
  --xh-action-bg-pressed: var(--xh-_calendar-range-picker-cell-bg-pressed);
311
350
  --xh-action-bg-focus-visible: var(--xh-_calendar-range-picker-cell-bg);
312
351
  --xh-action-bg-disabled: var(--xh-_calendar-range-picker-cell-bg);
313
- --xh-action-border-rest: var(--xh-_calendar-range-picker-cell-border);
314
- --xh-action-border-hover: var(--xh-_calendar-range-picker-cell-border);
315
- --xh-action-border-pressed: var(--xh-_calendar-range-picker-cell-border);
316
- --xh-action-border-focus-visible: var(--xh-_calendar-range-picker-cell-border);
317
- --xh-action-border-disabled: var(--xh-_calendar-range-picker-cell-border);
352
+ --xh-action-border-rest: transparent;
353
+ --xh-action-border-hover: transparent;
354
+ --xh-action-border-pressed: transparent;
355
+ --xh-action-border-focus-visible: transparent;
356
+ --xh-action-border-disabled: transparent;
318
357
  --xh-action-fg-rest: var(--xh-_calendar-range-picker-cell-fg);
319
358
  --xh-action-fg-hover: var(--xh-_calendar-range-picker-cell-fg);
320
359
  --xh-action-fg-pressed: var(--xh-_calendar-range-picker-cell-fg);
321
360
  --xh-action-fg-focus-visible: var(--xh-_calendar-range-picker-cell-fg);
322
361
  --xh-action-font-size: var(--xh-calendar-range-picker-cell-font-size, var(--xh-text-body-size));
362
+ /* 按下只换面不缩放:缩放会让钮成为包含块,挂在格子上的命中区当场缩回钮里,抬起落空 */
363
+ --xh-action-scale-pressed: none;
323
364
 
324
- display: flex;
325
- flex: 1;
326
- /* 正方格:宽度由 week-row 的等分轨道给,高度跟着走 */
327
- aspect-ratio: 1;
365
+ position: static;
366
+ flex: none;
328
367
  font-weight: var(--xh-calendar-range-picker-cell-font-weight, var(--xh-font-weight-medium));
329
368
  }
330
369
 
331
- /* 家族 text 档在粗指针下用 ::after 扩热区到 44px 高,这里的 ::after 是铺满整格(含四周留白)的命中区:
332
- 钉回 inset 那副几何,不让家族的定位与下限把它挪走或撑高压到相邻的格 */
333
- @media (pointer: coarse) {
334
- [data-scope='calendar-range-picker'][data-part='cell-trigger']::after {
335
- inline-size: auto;
336
- block-size: auto;
337
- min-block-size: 0;
338
- translate: none;
339
- }
370
+ /* 日视图:24 见方的日期钮取圆 */
371
+ [data-scope='calendar-range-picker'][data-part='cell-trigger'][data-view='day'] {
372
+ --xh-action-radius: var(--xh-calendar-range-picker-cell-radius, var(--xh-shape-circle));
373
+ }
374
+
375
+ /* 周期格(周、月、季、年):钮铺满格子的内容宽,仍是 24 高、控件圆角;选中面只换颜色,不改变几何尺寸 */
376
+ [data-scope='calendar-range-picker'][data-part='cell-trigger']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) {
377
+ --xh-action-min-inline-size: 0;
378
+
379
+ inline-size: 100%;
380
+ }
381
+
382
+ /* 一行一个整周:文字从行首排起 */
383
+ [data-scope='calendar-range-picker'][data-part='cell-trigger'][data-view='week'] {
384
+ --xh-action-padding-inline: var(--xh-calendar-range-picker-week-cell-px, var(--xh-space-3));
385
+
386
+ justify-content: flex-start;
340
387
  }
341
388
 
342
389
  [data-scope='calendar-range-picker'][data-part='cell-trigger'][hidden] {
343
390
  display: none;
344
391
  }
345
392
 
346
- /* 命中区铺满整格:格子四周那圈留白也归它,指尖落在两格之间的空隙不会落空 */
393
+ /* 命中区铺满整格:格子上下那截内衬也归它,指尖落在两行之间的空隙不会落空 */
347
394
  [data-scope='calendar-range-picker'][data-part='cell-trigger']::after {
348
395
  content: '';
349
396
  position: absolute;
350
- inset: calc(-1 * var(--xh-calendar-range-picker-cell-gap, var(--xh-space-0_5)));
397
+ inset: 0;
398
+ }
399
+
400
+ /* 粗指针:格子首尾相接,家族 text 档那套 ::after 外扩会压到上下相邻的格。改由格子自己长到 44 见方——
401
+ 行距加到 44、列宽下限抬到 44,铺满整格的命中区随之到 44×44、彼此不重叠;钮仍是 24 的圆,
402
+ 横条与区间轨道仍以格子中线为轴、按细指针那副行距收边,帽仍与端点圆同心。::after 钉回整格那副几何。
403
+ 列宽下限再按视口收(同 calendar-picker):手机窄屏里取扣掉页边与内衬后视口宽的七分之一,不撑出视口 */
404
+ @media (pointer: coarse) {
405
+ [data-scope='calendar-range-picker'][data-part='grid']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) {
406
+ min-inline-size: calc(7 * max(var(--xh-calendar-range-picker-cell-min-w, var(--xh-control-h-md)), min(var(--xh-control-hit-coarse), calc((100vw - 2 * var(--xh-space-4) - 2 * var(--xh-calendar-range-picker-grid-px, var(--xh-space-4))) / 7))) + 2 * var(--xh-calendar-range-picker-grid-px, var(--xh-space-4)));
407
+ }
408
+
409
+ [data-scope='calendar-range-picker'][data-part='week-row'] {
410
+ grid-template-columns: repeat(7, minmax(max(var(--xh-calendar-range-picker-cell-min-w, var(--xh-control-h-md)), min(var(--xh-control-hit-coarse), calc((100vw - 2 * var(--xh-space-4) - 2 * var(--xh-calendar-range-picker-grid-px, var(--xh-space-4))) / 7))), 1fr));
411
+ }
412
+
413
+ [data-scope='calendar-range-picker'][data-part='week-row']:not([hidden]):has(> [data-part='week-number']) {
414
+ grid-template-columns:
415
+ var(--xh-calendar-range-picker-week-number-w, var(--xh-control-h-md))
416
+ repeat(7, minmax(max(var(--xh-calendar-range-picker-cell-min-w, var(--xh-control-h-md)), min(var(--xh-control-hit-coarse), calc((100vw - 2 * var(--xh-space-4) - 2 * var(--xh-calendar-range-picker-grid-px, var(--xh-space-4)) - var(--xh-calendar-range-picker-week-number-w, var(--xh-control-h-md))) / 7))), 1fr));
417
+ }
418
+
419
+ [data-scope='calendar-range-picker'][data-part='cell'] {
420
+ min-block-size: var(--xh-control-hit-coarse);
421
+ }
422
+
423
+ [data-scope='calendar-range-picker'][data-part='cell-trigger']::after {
424
+ inline-size: auto;
425
+ block-size: auto;
426
+ min-block-size: 0;
427
+ translate: none;
428
+ }
351
429
  }
352
430
 
353
- /* 邻月的日子照样可点,只是压暗——它们不是占位符 */
431
+ /* 邻月的日子照样可点,只是压暗、字重回到常规——它们不是占位符 */
354
432
  [data-scope='calendar-range-picker'][data-part='cell-trigger'][data-outside-month] {
355
433
  --xh-_calendar-range-picker-cell-fg: var(--xh-calendar-range-picker-cell-fg-outside, var(--xh-fg-subtle));
434
+
435
+ font-weight: var(--xh-calendar-range-picker-cell-font-weight-outside, var(--xh-font-weight-regular));
356
436
  }
357
437
 
358
- /* 区间中段的格坐在品牌淡底的轨道上(页内选中 12%):悬停 20%、按下 28%,铺在格子自己的选中片上 */
438
+ /* 区间中段的格坐在品牌淡底的轨道上(页内选中 12%):悬停 20%、按下 28%,铺在格子自己的圆上 */
359
439
  [data-scope='calendar-range-picker'][data-part='cell-trigger'][data-in-range]:not([data-outside-month], [data-disabled], [data-range-start], [data-range-end]) {
360
440
  --xh-_calendar-range-picker-cell-bg-hover: var(--xh-calendar-range-picker-range-cell-bg-hover, var(--xh-bg-brand-subtle-hover));
361
441
  --xh-_calendar-range-picker-cell-bg-pressed: var(--xh-calendar-range-picker-range-cell-bg-pressed, var(--xh-bg-brand-subtle-active));
@@ -367,16 +447,8 @@
367
447
  --xh-_calendar-range-picker-cell-bg-pressed: var(--xh-calendar-range-picker-range-preview-cell-bg-pressed, var(--xh-bg-subtle-active));
368
448
  }
369
449
 
370
- /* 今天:1px 品牌环 + 品牌字(brand-subtle 退出 today 语义),底透明、悬停走普通格的阶梯;
371
- 落在区间里时环压在轨道上,选中仍用后面的实心强调面,状态叠加时不会混成同一种反馈 */
372
- [data-scope='calendar-range-picker'][data-part='cell-trigger'][data-today] {
373
- --xh-_calendar-range-picker-cell-bg: var(--xh-calendar-range-picker-today-bg, transparent);
374
- --xh-_calendar-range-picker-cell-border: var(--xh-calendar-range-picker-today-border, var(--xh-fg-brand));
375
- --xh-_calendar-range-picker-cell-fg: var(--xh-calendar-range-picker-today-fg, var(--xh-fg-brand));
376
- }
377
-
378
- /* 实心强调面只给单选 / 多选的选中格与区间的两端(格状当前):悬停不换面,按下压到 active 档(光缩放在深色底上
379
- 看不出回执);区间中段的格子由格子上的轨道铺底,自己不换面——不然一整段都是实心圆,就分不出哪两格是端点。
450
+ /* 实心强调面只给单选 / 多选的选中格与区间的两端(格状当前):悬停不换面,按下压到 active 档;
451
+ 区间中段的格子由格子上的轨道铺底,自己不换面——不然一整段都是实心圆,就分不出哪两格是端点。
380
452
  面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
381
453
  那一族色本来就要在这块面上把字读清楚,与面的对比是按可读性定的 */
382
454
  [data-scope='calendar-range-picker'][data-part='cell-trigger'][data-selected]:not([data-in-range]),
@@ -397,8 +469,10 @@
397
469
  }
398
470
 
399
471
  @media (forced-colors: active) {
400
- [data-scope='calendar-range-picker'][data-part='cell-trigger'][data-today] {
401
- border-color: Highlight;
472
+ /* 今天的圆点是一块底色,这一档会被系统抹掉:退出强制换色,直接取系统前景 */
473
+ [data-scope='calendar-range-picker'][data-part='cell'][data-today]::after {
474
+ forced-color-adjust: none;
475
+ background-color: CanvasText;
402
476
  }
403
477
 
404
478
  /* 强制色下底色被抹平,区间两端只剩描边能说明身份 */
@@ -406,6 +480,11 @@
406
480
  border-color: Highlight;
407
481
  }
408
482
 
483
+ /* 落定的区间中段在这一档没有底色:轨道上下沿画实线 */
484
+ [data-scope='calendar-range-picker'][data-part='cell'][data-in-range]:not([data-range-preview], [data-outside-month])::before {
485
+ border-block: var(--xh-stroke-thin) solid Highlight;
486
+ }
487
+
409
488
  /* 预览与落定的区间在这一档没有底色可分:还没确认的那一段在轨道上下沿画虚线 */
410
489
  [data-scope='calendar-range-picker'][data-part='cell'][data-in-range][data-range-preview]:not([data-outside-month])::before {
411
490
  border-block: var(--xh-stroke-thin) dashed Highlight;
@@ -422,9 +501,10 @@
422
501
  --xh-action-ring-color-focus-visible: var(--xh-ring-focus);
423
502
  }
424
503
 
425
- /* 不可用又选中的格:退到中性淡底 + 置灰字(禁用面),选中身份仍由这块底与未选中的透明格分开 */
504
+ /* 不可用又选中的格:压在淡底横条上,钮退到再深一档的中性面 + 置灰字(禁用面),
505
+ 选中身份仍由这块底与未选中的透明格分开 */
426
506
  [data-scope='calendar-range-picker'][data-part='cell-trigger'][data-disabled][data-selected] {
427
- --xh-action-bg-disabled: var(--xh-calendar-range-picker-cell-bg-selected-disabled, var(--xh-bg-subtle));
507
+ --xh-action-bg-disabled: var(--xh-calendar-range-picker-cell-bg-selected-disabled, var(--xh-bg-subtle-hover));
428
508
  }
429
509
 
430
510
  /* 每张面板只画自己的月份:邻月格仍保留区间语义与可点能力,但不铺轨道或端点面。 */
@@ -441,7 +521,7 @@
441
521
  只收日视图这一档:粗粒度视图(月格、年格)点一格是往下钻一层,只读也照做,
442
522
  那些格子仍是按得动的按钮,手型不能撤 */
443
523
  [data-scope='calendar-range-picker'][data-part='grid'][data-readonly][data-view='day']
444
- [data-part='cell-trigger']:not([data-disabled]) {
524
+ [data-part='cell-trigger']:where([data-scope='calendar-range-picker']):not([data-disabled]) {
445
525
  --xh-action-cursor-rest: default;
446
526
  --xh-action-cursor-hover: default;
447
527
  --xh-action-cursor-pressed: default;
@@ -531,6 +611,11 @@
531
611
  inset-block-start: auto;
532
612
  border-block-end: var(--xh-stroke-thick) solid currentColor;
533
613
  }
614
+
615
+ /* 今天的圆点同样是底色:改由描边把这颗点画满 */
616
+ [data-scope='calendar-range-picker'][data-part='cell'][data-today]::after {
617
+ border: calc(var(--xh-calendar-range-picker-today-mark-size, var(--xh-space-1)) / 2) solid var(--xh-fg-default);
618
+ }
534
619
  }
535
620
 
536
621
  @media (forced-colors: active) {