@xihan-ui/styles 3.2.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 (232) hide show
  1. package/CHANGELOG.md +441 -0
  2. package/component-tokens.d.ts +229 -60
  3. package/components.tokens.json +5124 -1555
  4. package/css/accordion.css +47 -20
  5. package/css/alert.css +14 -15
  6. package/css/anchor.css +2 -2
  7. package/css/approval.css +37 -13
  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 +4 -7
  15. package/css/calendar-picker.css +177 -94
  16. package/css/calendar-range-picker.css +206 -121
  17. package/css/card.css +34 -6
  18. package/css/carousel.css +65 -49
  19. package/css/cascader.css +41 -29
  20. package/css/checkbox-group.css +9 -6
  21. package/css/checkbox.css +5 -4
  22. package/css/citation.css +7 -2
  23. package/css/clipboard.css +20 -4
  24. package/css/collapsible.css +29 -14
  25. package/css/color-field.css +4 -4
  26. package/css/color-picker.css +77 -23
  27. package/css/color-slider.css +10 -8
  28. package/css/color-swatch-picker.css +5 -5
  29. package/css/combobox.css +14 -10
  30. package/css/command.css +13 -8
  31. package/css/context-menu.css +10 -5
  32. package/css/date-field.css +4 -4
  33. package/css/date-picker.css +165 -102
  34. package/css/date-range-picker.css +186 -123
  35. package/css/description.css +10 -6
  36. package/css/descriptions.css +47 -19
  37. package/css/dialog.css +50 -35
  38. package/css/drawer.css +75 -21
  39. package/css/editable.css +15 -41
  40. package/css/empty-state.css +21 -3
  41. package/css/field-array.css +4 -1
  42. package/css/field.css +17 -18
  43. package/css/fieldset.css +33 -13
  44. package/css/file-upload.css +65 -32
  45. package/css/float-button.css +25 -15
  46. package/css/floating-panel.css +1 -1
  47. package/css/form.css +24 -10
  48. package/css/grid-list.css +1 -1
  49. package/css/highlight.css +4 -4
  50. package/css/hover-card.css +19 -12
  51. package/css/image-viewer.css +77 -27
  52. package/css/image.css +12 -4
  53. package/css/infinite-scroll.css +8 -4
  54. package/css/input-group.css +74 -26
  55. package/css/kbd.css +1 -1
  56. package/css/label.css +27 -11
  57. package/css/layout.css +17 -10
  58. package/css/list.css +13 -9
  59. package/css/listbox.css +12 -7
  60. package/css/loading-bar.css +3 -0
  61. package/css/mention.css +10 -8
  62. package/css/menu.css +10 -5
  63. package/css/menubar.css +13 -8
  64. package/css/navigation-menu.css +2 -2
  65. package/css/notification.css +114 -31
  66. package/css/number-animation.css +2 -2
  67. package/css/number-field.css +60 -37
  68. package/css/page-header.css +63 -26
  69. package/css/pagination.css +35 -38
  70. package/css/password-input.css +10 -66
  71. package/css/pin-input.css +18 -26
  72. package/css/popconfirm.css +20 -11
  73. package/css/popover.css +18 -12
  74. package/css/progress.css +14 -13
  75. package/css/prompt-input.css +3 -3
  76. package/css/question-flow.css +33 -7
  77. package/css/radio-group.css +120 -55
  78. package/css/rating.css +31 -14
  79. package/css/select.css +14 -10
  80. package/css/separator.css +22 -4
  81. package/css/side-nav.css +16 -11
  82. package/css/signature-pad.css +23 -9
  83. package/css/skeleton.css +7 -7
  84. package/css/slider.css +71 -42
  85. package/css/sparkline.css +8 -2
  86. package/css/spinner.css +40 -20
  87. package/css/statistic.css +14 -14
  88. package/css/steps.css +115 -84
  89. package/css/switch.css +9 -7
  90. package/css/table.css +27 -10
  91. package/css/tabs.css +35 -12
  92. package/css/tag-group.css +17 -6
  93. package/css/tag.css +54 -29
  94. package/css/tags-input.css +38 -19
  95. package/css/text-field.css +5 -5
  96. package/css/time-field.css +4 -4
  97. package/css/time-picker.css +150 -64
  98. package/css/time-range-picker.css +91 -62
  99. package/css/timeline.css +37 -20
  100. package/css/timer.css +3 -3
  101. package/css/toggle-group.css +4 -4
  102. package/css/tool-call.css +6 -4
  103. package/css/toolbar.css +6 -5
  104. package/css/tooltip.css +15 -16
  105. package/css/tour.css +14 -7
  106. package/css/transfer.css +22 -16
  107. package/css/tree-select.css +10 -10
  108. package/css/tree.css +26 -25
  109. package/css/typography.css +28 -25
  110. package/dist/css/accordion.css +47 -20
  111. package/dist/css/alert.css +14 -15
  112. package/dist/css/anchor.css +2 -2
  113. package/dist/css/approval.css +37 -13
  114. package/dist/css/avatar-group.css +9 -12
  115. package/dist/css/avatar.css +20 -18
  116. package/dist/css/back-top.css +21 -7
  117. package/dist/css/badge.css +5 -5
  118. package/dist/css/breadcrumb.css +18 -16
  119. package/dist/css/button-group.css +4 -6
  120. package/dist/css/button.css +4 -7
  121. package/dist/css/calendar-picker.css +177 -94
  122. package/dist/css/calendar-range-picker.css +206 -121
  123. package/dist/css/card.css +34 -6
  124. package/dist/css/carousel.css +65 -49
  125. package/dist/css/cascader.css +41 -29
  126. package/dist/css/checkbox-group.css +9 -6
  127. package/dist/css/checkbox.css +5 -4
  128. package/dist/css/citation.css +7 -2
  129. package/dist/css/clipboard.css +20 -4
  130. package/dist/css/collapsible.css +29 -14
  131. package/dist/css/color-field.css +4 -4
  132. package/dist/css/color-picker.css +77 -23
  133. package/dist/css/color-slider.css +10 -8
  134. package/dist/css/color-swatch-picker.css +5 -5
  135. package/dist/css/combobox.css +14 -10
  136. package/dist/css/command.css +13 -8
  137. package/dist/css/context-menu.css +10 -5
  138. package/dist/css/date-field.css +4 -4
  139. package/dist/css/date-picker.css +165 -102
  140. package/dist/css/date-range-picker.css +186 -123
  141. package/dist/css/description.css +10 -6
  142. package/dist/css/descriptions.css +47 -19
  143. package/dist/css/dialog.css +50 -35
  144. package/dist/css/drawer.css +75 -21
  145. package/dist/css/editable.css +15 -41
  146. package/dist/css/empty-state.css +21 -3
  147. package/dist/css/field-array.css +4 -1
  148. package/dist/css/field.css +17 -18
  149. package/dist/css/fieldset.css +33 -13
  150. package/dist/css/file-upload.css +65 -32
  151. package/dist/css/float-button.css +25 -15
  152. package/dist/css/floating-panel.css +1 -1
  153. package/dist/css/form.css +24 -10
  154. package/dist/css/grid-list.css +1 -1
  155. package/dist/css/highlight.css +4 -4
  156. package/dist/css/hover-card.css +19 -12
  157. package/dist/css/image-viewer.css +77 -27
  158. package/dist/css/image.css +12 -4
  159. package/dist/css/infinite-scroll.css +8 -4
  160. package/dist/css/input-group.css +74 -26
  161. package/dist/css/kbd.css +1 -1
  162. package/dist/css/label.css +27 -11
  163. package/dist/css/layout.css +17 -10
  164. package/dist/css/list.css +13 -9
  165. package/dist/css/listbox.css +12 -7
  166. package/dist/css/loading-bar.css +3 -0
  167. package/dist/css/mention.css +10 -8
  168. package/dist/css/menu.css +10 -5
  169. package/dist/css/menubar.css +13 -8
  170. package/dist/css/navigation-menu.css +2 -2
  171. package/dist/css/notification.css +114 -31
  172. package/dist/css/number-animation.css +2 -2
  173. package/dist/css/number-field.css +60 -37
  174. package/dist/css/page-header.css +63 -26
  175. package/dist/css/pagination.css +35 -38
  176. package/dist/css/password-input.css +10 -66
  177. package/dist/css/pin-input.css +18 -26
  178. package/dist/css/popconfirm.css +20 -11
  179. package/dist/css/popover.css +18 -12
  180. package/dist/css/progress.css +14 -13
  181. package/dist/css/prompt-input.css +3 -3
  182. package/dist/css/question-flow.css +33 -7
  183. package/dist/css/radio-group.css +120 -55
  184. package/dist/css/rating.css +31 -14
  185. package/dist/css/select.css +14 -10
  186. package/dist/css/separator.css +22 -4
  187. package/dist/css/side-nav.css +16 -11
  188. package/dist/css/signature-pad.css +23 -9
  189. package/dist/css/skeleton.css +7 -7
  190. package/dist/css/slider.css +71 -42
  191. package/dist/css/sparkline.css +8 -2
  192. package/dist/css/spinner.css +40 -20
  193. package/dist/css/statistic.css +14 -14
  194. package/dist/css/steps.css +115 -84
  195. package/dist/css/switch.css +9 -7
  196. package/dist/css/table.css +27 -10
  197. package/dist/css/tabs.css +35 -12
  198. package/dist/css/tag-group.css +17 -6
  199. package/dist/css/tag.css +54 -29
  200. package/dist/css/tags-input.css +38 -19
  201. package/dist/css/text-field.css +5 -5
  202. package/dist/css/time-field.css +4 -4
  203. package/dist/css/time-picker.css +150 -64
  204. package/dist/css/time-range-picker.css +91 -62
  205. package/dist/css/timeline.css +37 -20
  206. package/dist/css/timer.css +3 -3
  207. package/dist/css/toggle-group.css +4 -4
  208. package/dist/css/tool-call.css +6 -4
  209. package/dist/css/toolbar.css +6 -5
  210. package/dist/css/tooltip.css +15 -16
  211. package/dist/css/tour.css +14 -7
  212. package/dist/css/transfer.css +22 -16
  213. package/dist/css/tree-select.css +10 -10
  214. package/dist/css/tree.css +26 -25
  215. package/dist/css/typography.css +28 -25
  216. package/dist/family/action-control.css +30 -24
  217. package/dist/family/chart.css +57 -0
  218. package/dist/family/collection-item.css +12 -8
  219. package/dist/family/field-chrome.css +28 -19
  220. package/dist/family/loading-ring.css +20 -13
  221. package/dist/family/swatch.css +4 -4
  222. package/dist/family/tag-list.css +6 -0
  223. package/family/action-control.css +30 -24
  224. package/family/chart.css +57 -0
  225. package/family/collection-item.css +12 -8
  226. package/family/field-chrome.css +28 -19
  227. package/family/loading-ring.css +20 -13
  228. package/family/swatch.css +4 -4
  229. package/family/tag-list.css +6 -0
  230. package/index.css +3580 -2060
  231. package/index.unlayered.css +3579 -2060
  232. package/package.json +2 -2
@@ -23,7 +23,8 @@
23
23
 
24
24
  /* 尺寸档只换这两个私有槽,列表与链接都从 root 继承它们,换档不必给每个部件各写一条选择器 */
25
25
  --xh-_breadcrumb-font-size: var(--xh-control-font-md);
26
- --xh-_breadcrumb-gap: var(--xh-space-2);
26
+ /* 链接自带 4px 横向内衬,列表间距再给 4px:文字到分隔符一共 8px */
27
+ --xh-_breadcrumb-gap: var(--xh-space-1);
27
28
  /* 当前项与链接悬停的强调色随语气走。没写 data-tone 时 --xh-_tone-fg 没被声明,
28
29
  退回原来的前景色。聚焦环不在其列,它恒是 --xh-ring-focus */
29
30
  --xh-_breadcrumb-accent-text: var(--xh-_tone-fg, var(--xh-fg-default));
@@ -38,12 +39,12 @@
38
39
  不在控件间距那把尺上(那把尺的大档与中档同值),三档一律取空间尺 */
39
40
  [data-scope='breadcrumb'][data-part='root'][data-size='sm'] {
40
41
  --xh-_breadcrumb-font-size: var(--xh-control-font-sm);
41
- --xh-_breadcrumb-gap: var(--xh-space-1_5);
42
+ --xh-_breadcrumb-gap: var(--xh-space-0_5);
42
43
  }
43
44
 
44
45
  [data-scope='breadcrumb'][data-part='root'][data-size='lg'] {
45
46
  --xh-_breadcrumb-font-size: var(--xh-control-font-lg);
46
- --xh-_breadcrumb-gap: var(--xh-space-3);
47
+ --xh-_breadcrumb-gap: var(--xh-space-2);
47
48
  }
48
49
 
49
50
  /* ol 的项目符号与内外边距是 UA 给的,库里没有全局 preflight,只能在这儿自己抹平 */
@@ -75,8 +76,9 @@
75
76
  display: none;
76
77
  }
77
78
 
78
- /* 链接的几何、字号与面全经家族桥接槽:静息 muted / regular,悬停走白底承载 hover 100 + 随语气的字色,
79
- 按下 pressed 200 只换面;当前页那条不再是"可去的地方":连接层投影
79
+ /* 链接的几何、字号与面全经家族桥接槽:静息 muted / regular,悬停走白底承载 hover 100 + 品牌字(写了语气随语气),
80
+ 按下 pressed 200 + 深一档品牌字(品牌字压在 200 档上只有 4:1,按下必须取 strong);
81
+ 链接盒最少 24px 高,够得上目标尺寸下限;当前页那条不再是"可去的地方":连接层投影
80
82
  data-xh-collection-terminal,家族给透明面 + 随语气的 fg-default + medium + cursor default,不响应悬停与按下,
81
83
  并压过它同时带的 aria-disabled 禁用面。本条 (0,2,0) 压过家族基础块 (0,1,0),不能再写 color / background */
82
84
  [data-scope='breadcrumb'][data-part='link'] {
@@ -88,14 +90,16 @@
88
90
  --xh-collection-glyph-size: var(--xh-breadcrumb-icon-size, var(--xh-glyph-size-text));
89
91
  --xh-collection-fg-rest: var(--xh-breadcrumb-fg, var(--xh-fg-muted));
90
92
  --xh-collection-bg-hover: var(--xh-breadcrumb-link-bg-hover, var(--xh-bg-subtle));
91
- --xh-collection-fg-hover: var(--xh-breadcrumb-link-fg-hover, var(--xh-_breadcrumb-accent-text));
93
+ --xh-collection-fg-hover: var(--xh-breadcrumb-link-fg-hover, var(--xh-_tone-fg, var(--xh-fg-brand)));
92
94
  --xh-collection-bg-pressed: var(--xh-breadcrumb-link-bg-pressed, var(--xh-bg-subtle-hover));
95
+ --xh-collection-fg-pressed: var(--xh-breadcrumb-link-fg-pressed, var(--xh-_tone-fg, var(--xh-fg-brand-strong)));
93
96
  --xh-collection-fg-terminal: var(--xh-breadcrumb-link-fg-current, var(--xh-_breadcrumb-accent-text));
94
97
  --xh-collection-font-weight-terminal: var(--xh-breadcrumb-link-font-weight-current, var(--xh-font-weight-medium));
95
98
 
96
99
  display: inline-flex;
97
100
  align-items: center;
98
101
  gap: var(--xh-breadcrumb-link-gap, var(--xh-space-1));
102
+ min-block-size: var(--xh-breadcrumb-link-h, var(--xh-control-action-size));
99
103
  /* 一层的名字可能很长(文档标题、订单号),压不住会把整条路径撑开 */
100
104
  max-inline-size: var(--xh-breadcrumb-link-max-w, var(--xh-nav-link-max-w));
101
105
  /* 行高随 root 的行距槽:家族基础块给条目写了 leading-normal,这里接回 root 那一支 */
@@ -133,7 +137,8 @@
133
137
  margin: 0;
134
138
  align-items: center;
135
139
  justify-content: center;
136
- color: var(--xh-breadcrumb-separator-fg, var(--xh-fg-subtle));
140
+ /* 分隔符是 aria-hidden 的纯装饰,取最弱一档前景,不与可点的链接抢层级 */
141
+ color: var(--xh-breadcrumb-separator-fg, var(--xh-fg-disabled));
137
142
  user-select: none;
138
143
  }
139
144
 
@@ -167,11 +172,13 @@
167
172
  --xh-collection-glyph-size: var(--xh-breadcrumb-icon-size, var(--xh-glyph-size-text));
168
173
  --xh-collection-fg-rest: var(--xh-breadcrumb-fg, var(--xh-fg-muted));
169
174
  --xh-collection-bg-hover: var(--xh-bg-subtle);
170
- --xh-collection-fg-hover: var(--xh-_breadcrumb-accent-text);
175
+ --xh-collection-fg-hover: var(--xh-_tone-fg, var(--xh-fg-brand));
171
176
  --xh-collection-bg-pressed: var(--xh-bg-subtle-hover);
177
+ --xh-collection-fg-pressed: var(--xh-_tone-fg, var(--xh-fg-brand-strong));
172
178
 
173
179
  display: inline-flex;
174
180
  align-items: center;
181
+ min-block-size: var(--xh-breadcrumb-ellipsis-trigger-h, var(--xh-breadcrumb-link-h, var(--xh-control-action-size)));
175
182
  line-height: var(--xh-breadcrumb-leading, var(--xh-leading-tight));
176
183
  }
177
184
 
@@ -190,7 +197,7 @@
190
197
  display: none;
191
198
  }
192
199
 
193
- /* 没写内容就由皮肤画兜底字形(向前的尖角);作者写了斜杠或自己的图形,这条即不命中 */
200
+ /* 没写内容就由皮肤画兜底字形(一条斜线);作者写了自己的字符或图形,这条即不命中 */
194
201
  [data-scope='breadcrumb'][data-part='separator']:empty::before {
195
202
  content: '';
196
203
  display: inline-block;
@@ -198,13 +205,8 @@
198
205
  block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
199
206
  vertical-align: var(--xh-glyph-baseline-shift);
200
207
  background-color: currentColor;
201
- -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
202
- mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
203
- }
204
-
205
- /* 从右往左排版时「向前」在左边 */
206
- [dir='rtl'] [data-scope='breadcrumb'][data-part='separator']:empty::before {
207
- rotate: 180deg;
208
+ -webkit-mask: var(--xh-glyph-mark-slash) center / contain no-repeat;
209
+ mask: var(--xh-glyph-mark-slash) center / contain no-repeat;
208
210
  }
209
211
 
210
212
  @media (forced-colors: active) {
@@ -31,12 +31,10 @@
31
31
  后者是使用者的入口,写死它,进了组的胶囊按钮就再也圆不起来 */
32
32
  --xh-_button-group-radius: 0;
33
33
 
34
- /* 段与段共边焊成一条,solid 段静息不落贴地软影、悬停那一档不抬:抬起其中一段,投影会压到
35
- 左右两段的面上。两档都只留实心面顶边那条高光;其余形态的影本来就是 none,这两支只被
36
- button.css 的 solid 块消费。颜色不在这里灌:段自带 data-xh-action-variant,底 / 前景 / 描边由
37
- 家族形态矩阵按段自己的形态给出 */
38
- --xh-_button-group-shadow-rest: var(--xh-_highlight-tone);
39
- --xh-_button-group-shadow-hover: var(--xh-_highlight-tone);
34
+ /* 段与段共边焊成一条,solid 段悬停那一档不抬:抬起其中一段,投影会压到左右两段的面上。
35
+ 其余形态的影本来就是 none,这一支只被 button.css 的 solid 块消费。颜色不在这里灌:段自带
36
+ data-xh-action-variant,底 / 前景 / 描边由家族形态矩阵按段自己的形态给出 */
37
+ --xh-_button-group-shadow-hover: none;
40
38
  --xh-_group-separator-size: calc(var(--xh-_button-group-h, var(--xh-control-h-md)) / 2);
41
39
 
42
40
  display: inline-flex;
package/css/button.css CHANGED
@@ -50,14 +50,11 @@
50
50
  font-weight: var(--xh-button-font-weight, var(--xh-text-label-weight));
51
51
  }
52
52
 
53
- /* Button soft 是登记在册的 raised 消费者:solid 一档静息带顶光与贴地软影,悬停抬到 raised,按下只留顶光。
54
- 成组时段与段共边焊成一条,静息不落软影、悬停不抬起——投影会压到左右两段的面上,
55
- ButtonGroup 用 --xh-_button-group-shadow-rest / -hover 只留顶光 */
53
+ /* Button 是登记在册的 raised 消费者:solid 一档悬停抬到 raised。raised 缺省 none,实心钮是平的——
54
+ 不画顶光、不落软影,层级只靠面色(主题给 raised 一层影,悬停才抬起来)。
55
+ 成组时段与段共边焊成一条,悬停不抬起:投影会压到左右两段的面上,ButtonGroup 用 --xh-_button-group-shadow-hover 关掉 */
56
56
  [data-scope='button'][data-part='root'][data-variant='solid'] {
57
- --xh-action-highlight-pressed: var(--xh-_highlight-tone);
58
- --xh-_button-shadow-rest: var(--xh-_button-group-shadow-rest, var(--xh-_highlight-tone), var(--xh-material-soft-shadow));
59
- --xh-_button-shadow-hover: var(--xh-_button-group-shadow-hover, var(--xh-_highlight-tone), var(--xh-elevation-raised));
60
- --xh-_button-shadow-pressed: var(--xh-_highlight-tone);
57
+ --xh-_button-shadow-hover: var(--xh-_button-group-shadow-hover, var(--xh-elevation-raised));
61
58
  }
62
59
 
63
60
  /* 实心面用对比前景作内环,再加品牌外环;不覆盖表面 box-shadow。 */
@@ -14,14 +14,11 @@
14
14
  --xh-calendar-picker-skin: 1;
15
15
  }
16
16
 
17
+ /* 标题栏与网格各自带内衬、彼此不留空当:标题栏下沿那道分隔线就是两块的界 */
17
18
  [data-scope='calendar-picker'][data-part='root'] {
18
- /* 翻页钮是 sm 档的图标钮(--xh-control-h-sm 见方),钮里的图标按 sm 档取 --xh-glyph-size-sm;
19
- 作者塞进去的图标与皮肤画的兜底字形同一把尺 */
20
- --xh-icon-size: var(--xh-calendar-picker-icon-size, var(--xh-glyph-size-sm));
21
-
22
19
  display: flex;
23
20
  flex-direction: column;
24
- gap: var(--xh-calendar-picker-gap, var(--xh-space-2));
21
+ gap: var(--xh-calendar-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-picker'][data-part='header'] {
34
+ --xh-icon-size: var(--xh-calendar-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-picker-header-gap, var(--xh-space-2));
38
- min-block-size: var(--xh-control-h-sm);
39
+ gap: var(--xh-calendar-picker-header-gap, var(--xh-space-1));
40
+ min-block-size: calc(var(--xh-control-action-size) + 2 * var(--xh-calendar-picker-header-py, var(--xh-space-2)) + var(--xh-stroke-thin));
41
+ padding-block: var(--xh-calendar-picker-header-py, var(--xh-space-2));
42
+ padding-inline: var(--xh-calendar-picker-header-px, var(--xh-space-4));
43
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-calendar-picker-header-border, var(--xh-material-solid-border));
39
44
  }
40
45
 
41
46
  [data-scope='calendar-picker'][data-part='header'][hidden] {
@@ -47,32 +52,30 @@
47
52
  text-align: center;
48
53
  color: var(--xh-calendar-picker-heading-fg, var(--xh-fg-default));
49
54
  font-size: var(--xh-calendar-picker-heading-font-size, var(--xh-text-label-size));
50
- font-weight: var(--xh-calendar-picker-heading-font-weight, var(--xh-font-weight-semibold));
55
+ font-weight: var(--xh-calendar-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-picker'][data-part='heading-year-trigger']:not([hidden]),
62
65
  [data-scope='calendar-picker'][data-part='heading-month-trigger']:not([hidden]) {
63
- --xh-action-padding-inline: var(--xh-calendar-picker-heading-trigger-px, var(--xh-space-1));
66
+ --xh-action-padding-inline: var(--xh-calendar-picker-heading-trigger-px, var(--xh-space-0_5));
64
67
  --xh-action-radius: var(--xh-calendar-picker-heading-trigger-radius, var(--xh-shape-control));
65
- --xh-action-bg-hover: transparent;
68
+ --xh-action-bg-hover: var(--xh-calendar-picker-heading-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
66
69
  --xh-action-bg-pressed: var(--xh-calendar-picker-heading-trigger-bg-pressed, var(--xh-_action-variant-bg-pressed));
67
70
  --xh-action-fg-rest: var(--xh-calendar-picker-heading-fg, var(--xh-fg-default));
68
- --xh-action-fg-hover: var(--xh-calendar-picker-heading-trigger-fg-hover, var(--xh-fg-brand));
69
- --xh-action-fg-pressed: var(--xh-calendar-picker-heading-trigger-fg-hover, var(--xh-fg-brand));
71
+ --xh-action-fg-hover: var(--xh-calendar-picker-heading-fg, var(--xh-fg-default));
72
+ --xh-action-fg-pressed: var(--xh-calendar-picker-heading-fg, var(--xh-fg-default));
70
73
  --xh-action-fg-focus-visible: var(--xh-calendar-picker-heading-fg, var(--xh-fg-default));
71
74
  --xh-action-fg-disabled: var(--xh-calendar-picker-heading-fg, var(--xh-fg-default));
72
75
  --xh-action-font-size: var(--xh-calendar-picker-heading-font-size, var(--xh-text-label-size));
73
76
  --xh-action-cursor-disabled: default;
74
77
 
75
- font-weight: var(--xh-calendar-picker-heading-font-weight, var(--xh-font-weight-semibold));
78
+ font-weight: var(--xh-calendar-picker-heading-font-weight, var(--xh-font-weight-medium));
76
79
  }
77
80
 
78
81
  [data-scope='calendar-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-picker'][data-part='prev-year-trigger'],
86
89
  [data-scope='calendar-picker'][data-part='prev-trigger'],
87
90
  [data-scope='calendar-picker'][data-part='next-year-trigger'],
88
91
  [data-scope='calendar-picker'][data-part='next-trigger'] {
89
92
  --xh-action-visual-size: var(--xh-calendar-picker-nav-size, var(--xh-_action-profile-visual-size));
90
93
  --xh-action-min-inline-size: var(--xh-calendar-picker-nav-size, var(--xh-_action-profile-visual-size));
91
- --xh-action-radius: var(--xh-calendar-picker-nav-radius, var(--xh-shape-control));
94
+ --xh-action-radius: var(--xh-calendar-picker-nav-radius, var(--xh-shape-circle));
92
95
  --xh-action-bg-rest: var(--xh-calendar-picker-nav-bg, var(--xh-_action-variant-bg-rest));
93
96
  --xh-action-bg-hover: var(--xh-calendar-picker-nav-bg-hover, var(--xh-_action-variant-bg-hover));
94
97
  --xh-action-bg-pressed: var(--xh-calendar-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-picker'][data-part='grid'] {
111
114
  display: flex;
112
115
  flex-direction: column;
113
- gap: var(--xh-calendar-picker-grid-gap, var(--xh-space-1));
116
+ gap: var(--xh-calendar-picker-grid-gap, var(--xh-space-0));
117
+ padding-block: var(--xh-calendar-picker-grid-py, var(--xh-space-3));
118
+ padding-inline: var(--xh-calendar-picker-grid-px, var(--xh-space-4));
114
119
  }
115
120
 
116
- /* 周期视图:格子直接铺进网格,不再有周行那一层。 */
121
+ /* 周期视图与日视图同宽:钻上一层看月、年时面板不变窄,宽度按七列日期格加两侧内衬算 */
122
+ [data-scope='calendar-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-picker-cell-min-w, var(--xh-control-h-md)) + 2 * var(--xh-calendar-picker-grid-px, var(--xh-space-4)));
124
+ }
125
+
126
+ /* 周期视图:格子直接铺进网格,不再有周行那一层;格与格之间不留缝,区间的底色在一行里连成一条 */
117
127
  [data-scope='calendar-picker'][data-part='grid'][data-view='week'] {
118
128
  display: grid;
119
129
  grid-template-columns: minmax(0, 1fr);
120
- gap: var(--xh-calendar-picker-period-gap, var(--xh-space-1));
130
+ gap: var(--xh-calendar-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-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-picker-period-gap, var(--xh-space-1));
138
+ gap: var(--xh-calendar-picker-period-gap, var(--xh-space-0));
129
139
  }
130
140
 
131
141
  [data-scope='calendar-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-picker-period-gap, var(--xh-space-1));
144
+ gap: var(--xh-calendar-picker-period-gap, var(--xh-space-0));
135
145
  }
136
146
 
147
+ /* 年网格限高自滚:原生细条落在内衬之外的边缘,内衬两侧仍对称 */
137
148
  [data-scope='calendar-picker'][data-part='grid'][data-view='year'] {
138
149
  align-content: start;
139
150
  max-block-size: var(--xh-calendar-picker-year-grid-max-h, var(--xh-viewport-h-sm));
140
- padding-inline-end: var(--xh-calendar-picker-year-grid-pe, var(--xh-space-1));
141
151
  /* 页内结构容器走原生细条(reset 层统一给)、滚动链保持 auto;嵌进 date-picker 浮层时由那份皮肤补 contain */
142
152
  overflow-y: auto;
143
153
  }
144
154
 
145
- /* 周期格沿横轴铺开,但始终保持控制件高度;选中面只换颜色,不改变几何尺寸。 */
146
- [data-scope='calendar-picker'][data-part='grid']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) [data-part='cell-trigger']:where([data-scope='calendar-picker']) {
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-picker-period-py, var(--xh-space-2));
152
- border-radius: var(--xh-calendar-picker-period-radius, var(--xh-shape-control));
153
- }
154
-
155
- [data-scope='calendar-picker'][data-part='grid'][data-view='week'] [data-part='cell-trigger']:where([data-scope='calendar-picker']) {
156
- flex: 1 1 auto;
157
- justify-content: flex-start;
158
- inline-size: 100%;
159
- padding-inline: var(--xh-calendar-picker-week-cell-px, var(--xh-space-3));
160
- }
161
-
162
155
  [data-scope='calendar-picker'][data-part='grid'][hidden] {
163
156
  display: none;
164
157
  }
@@ -180,17 +173,20 @@
180
173
  display: none;
181
174
  }
182
175
 
183
- /* 七等分:表头行与日期行共用同一条轨道定义,列才对得齐 */
176
+ /* 七等分:表头行与日期行共用同一条轨道定义,列才对得齐。每列不窄于中号控件高,
177
+ 浮层里的日历按内容收时由这条下限撑出面板宽(七列加两侧内衬) */
184
178
  [data-scope='calendar-picker'][data-part='week-row'] {
185
179
  display: grid;
186
- grid-template-columns: repeat(7, minmax(0, 1fr));
180
+ grid-template-columns: repeat(7, minmax(var(--xh-calendar-picker-cell-min-w, var(--xh-control-h-md)), 1fr));
187
181
  }
188
182
 
189
183
  /* 摆了周序号格的行多让出行首一列。写 :not([hidden]) 而不是靠顺序压过下面那条兜底——
190
184
  同特指度的规则谁在后面谁赢,收起态会被这条 display 掀开 */
191
185
  [data-scope='calendar-picker'][data-part='week-row']:not([hidden]):has(> [data-part='week-number']) {
192
186
  display: grid;
193
- grid-template-columns: var(--xh-calendar-picker-week-number-w, var(--xh-control-h-md)) repeat(7, minmax(0, 1fr));
187
+ grid-template-columns:
188
+ var(--xh-calendar-picker-week-number-w, var(--xh-control-h-md))
189
+ repeat(7, minmax(var(--xh-calendar-picker-cell-min-w, var(--xh-control-h-md)), 1fr));
194
190
  }
195
191
 
196
192
  /* 周序号只是行的标号:比日子小一号、颜色压下去,不跟着选中态走 */
@@ -210,14 +206,15 @@
210
206
  display: none;
211
207
  }
212
208
 
209
+ /* 星期行:与中号控件同高,正文字号、常规字重,颜色压一档 */
213
210
  [data-scope='calendar-picker'][data-part='week-day'] {
214
211
  display: flex;
215
212
  align-items: center;
216
213
  justify-content: center;
217
- block-size: var(--xh-calendar-picker-week-day-h, var(--xh-control-h-sm));
214
+ block-size: var(--xh-calendar-picker-week-day-h, var(--xh-control-h-md));
218
215
  color: var(--xh-calendar-picker-week-day-fg, var(--xh-fg-subtle));
219
- font-size: var(--xh-calendar-picker-week-day-font-size, var(--xh-text-caption-size));
220
- font-weight: var(--xh-calendar-picker-week-day-font-weight, var(--xh-font-weight-medium));
216
+ font-size: var(--xh-calendar-picker-week-day-font-size, var(--xh-text-body-size));
217
+ font-weight: var(--xh-calendar-picker-week-day-font-weight, var(--xh-font-weight-regular));
221
218
  line-height: var(--xh-leading-none);
222
219
  user-select: none;
223
220
  }
@@ -226,93 +223,171 @@
226
223
  display: none;
227
224
  }
228
225
 
229
- /* 格子只是等分轨道里的一格,圆角的选中片留给 trigger */
226
+ /* 格子是等分轨道里的一格,也是格内几样东西的定位盒:禁用横条画在 ::before、今天的圆点画在 ::after,
227
+ 日期钮的命中区(钮的 ::after)同样以它为包含块。上下各 6 的内衬把 24 高的钮撑成 36 的行距。
228
+ 格子自成一层:横条压在钮的下面,不盖住钮(钮不当定位盒) */
230
229
  [data-scope='calendar-picker'][data-part='cell'] {
230
+ /* 这副行距的半高:格内横条以格子中线为轴、按它收边,行距被拉高(粗指针)时横条不跟着变粗 */
231
+ --xh-_calendar-picker-row-half: calc(
232
+ var(--xh-calendar-picker-cell-size, var(--xh-control-action-size)) / 2
233
+ + var(--xh-calendar-picker-cell-py, var(--xh-space-1_5))
234
+ );
235
+
231
236
  position: relative;
232
237
  display: flex;
233
238
  align-items: center;
234
239
  justify-content: center;
235
- padding: var(--xh-calendar-picker-cell-gap, var(--xh-space-0_5));
240
+ isolation: isolate;
241
+ padding-block: var(--xh-calendar-picker-cell-py, var(--xh-space-1_5));
242
+ padding-inline: var(--xh-calendar-picker-cell-px, var(--xh-space-0));
243
+ }
244
+
245
+ /* 周期格左右各留 4:钮在格里缩进一截,相邻两格的钮不贴在一起 */
246
+ [data-scope='calendar-picker'][data-part='cell']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) {
247
+ padding-inline: var(--xh-calendar-picker-period-px, var(--xh-space-1));
236
248
  }
237
249
 
238
250
  [data-scope='calendar-picker'][data-part='cell'][hidden] {
239
251
  display: none;
240
252
  }
241
253
 
242
- /* 日期格接 Action Control text 档(日历格是定尺控件,属格状当前)、ghost 形态:悬停 / 按下 / 禁用面、
243
- 0.97 缩放与换底、焦点环与过渡由家族配方给,这里只把使用者槽映射到桥接槽。几何仍由网格给:宽度由 week-row 的
244
- 等分轨道给、高度按 aspect-ratio 跟着走(block-size 归 auto,不取家族的固定高),日历才不会被长月份拉扁。
245
- 格子坐在日历的白底上:悬停 100 → 按下 200;今天 / 选中 / 邻月 / 不可用只换下面的私有槽 */
254
+ /* 不可用的日子:整格一条淡底横条,上下各收 2,相邻几天的横条连成一条带 */
255
+ [data-scope='calendar-picker'][data-part='cell'][data-disabled]::before {
256
+ content: '';
257
+ position: absolute;
258
+ z-index: -1;
259
+ inset-block: calc(50% - var(--xh-_calendar-picker-row-half) + var(--xh-calendar-picker-disabled-inset, var(--xh-space-0_5)));
260
+ inset-inline: 0;
261
+ background-color: var(--xh-calendar-picker-cell-bg-disabled, var(--xh-bg-subtle));
262
+ pointer-events: none;
263
+ }
264
+
265
+ /* 今天:数字下方一颗 4px 品牌圆点,数字保持正文色(brand-subtle 只留给选中);
266
+ 选中格换实心面后圆点仍落在面的外面,两个状态叠加时互不遮挡 */
267
+ [data-scope='calendar-picker'][data-part='cell'][data-today]::after {
268
+ content: '';
269
+ position: absolute;
270
+ inset-block-start: calc(50% + var(--xh-calendar-picker-cell-size, var(--xh-control-action-size)) / 2 + var(--xh-space-0_5));
271
+ inset-inline-start: 50%;
272
+ inline-size: var(--xh-calendar-picker-today-mark-size, var(--xh-space-1));
273
+ block-size: var(--xh-calendar-picker-today-mark-size, var(--xh-space-1));
274
+ border-radius: var(--xh-shape-circle);
275
+ background-color: var(--xh-calendar-picker-today-mark-bg, var(--xh-fg-brand));
276
+ translate: -50% 0;
277
+ pointer-events: none;
278
+ }
279
+
280
+ [dir='rtl'] [data-scope='calendar-picker'][data-part='cell'][data-today]::after {
281
+ translate: 50% 0;
282
+ }
283
+
284
+ /* 日期格接 Action Control text 档 xs(日历格是定尺控件,属格状当前)、ghost 形态:悬停 / 按下 / 禁用面、
285
+ 焦点环与过渡由家族配方给,这里只把使用者槽映射到桥接槽。日视图是 24 见方的圆(下一条),
286
+ 周期视图是铺满格宽的 24 高钮、控件圆角。钮不当定位盒:命中区挂在格子上。
287
+ 格子坐在日历的白底上:悬停 100 → 按下 200;选中 / 邻月 / 不可用只换下面的私有槽 */
246
288
  [data-scope='calendar-picker'][data-part='cell-trigger'] {
247
289
  --xh-_calendar-picker-cell-bg: transparent;
248
290
  --xh-_calendar-picker-cell-bg-hover: var(--xh-calendar-picker-cell-bg-hover, var(--xh-_action-variant-bg-hover));
249
291
  --xh-_calendar-picker-cell-bg-pressed: var(--xh-calendar-picker-cell-bg-pressed, var(--xh-_action-variant-bg-pressed));
250
- --xh-_calendar-picker-cell-border: transparent;
251
292
  --xh-_calendar-picker-cell-fg: var(--xh-calendar-picker-cell-fg, var(--xh-fg-default));
252
293
 
253
- --xh-action-visual-size: auto;
254
- --xh-action-min-inline-size: var(--xh-calendar-picker-cell-size, var(--xh-control-h-sm));
294
+ --xh-action-visual-size: var(--xh-calendar-picker-cell-size, var(--xh-_action-profile-visual-size));
295
+ --xh-action-min-inline-size: var(--xh-calendar-picker-cell-size, var(--xh-_action-profile-visual-size));
255
296
  --xh-action-padding-inline: 0;
256
- --xh-action-radius: var(--xh-calendar-picker-cell-radius, var(--xh-shape-inset));
297
+ --xh-action-radius: var(--xh-calendar-picker-period-radius, var(--xh-shape-control));
257
298
  --xh-action-bg-rest: var(--xh-_calendar-picker-cell-bg);
258
299
  --xh-action-bg-hover: var(--xh-_calendar-picker-cell-bg-hover);
259
300
  --xh-action-bg-pressed: var(--xh-_calendar-picker-cell-bg-pressed);
260
301
  --xh-action-bg-focus-visible: var(--xh-_calendar-picker-cell-bg);
261
302
  --xh-action-bg-disabled: var(--xh-_calendar-picker-cell-bg);
262
- --xh-action-border-rest: var(--xh-_calendar-picker-cell-border);
263
- --xh-action-border-hover: var(--xh-_calendar-picker-cell-border);
264
- --xh-action-border-pressed: var(--xh-_calendar-picker-cell-border);
265
- --xh-action-border-focus-visible: var(--xh-_calendar-picker-cell-border);
266
- --xh-action-border-disabled: var(--xh-_calendar-picker-cell-border);
303
+ --xh-action-border-rest: transparent;
304
+ --xh-action-border-hover: transparent;
305
+ --xh-action-border-pressed: transparent;
306
+ --xh-action-border-focus-visible: transparent;
307
+ --xh-action-border-disabled: transparent;
267
308
  --xh-action-fg-rest: var(--xh-_calendar-picker-cell-fg);
268
309
  --xh-action-fg-hover: var(--xh-_calendar-picker-cell-fg);
269
310
  --xh-action-fg-pressed: var(--xh-_calendar-picker-cell-fg);
270
311
  --xh-action-fg-focus-visible: var(--xh-_calendar-picker-cell-fg);
271
312
  --xh-action-font-size: var(--xh-calendar-picker-cell-font-size, var(--xh-text-body-size));
313
+ /* 按下只换面不缩放:缩放会让钮成为包含块,挂在格子上的命中区当场缩回钮里,抬起落空 */
314
+ --xh-action-scale-pressed: none;
272
315
 
273
- display: flex;
274
- flex: 1;
275
- /* 正方格:宽度由 week-row 的等分轨道给,高度跟着走 */
276
- aspect-ratio: 1;
316
+ position: static;
317
+ flex: none;
277
318
  font-weight: var(--xh-calendar-picker-cell-font-weight, var(--xh-font-weight-medium));
278
319
  }
279
320
 
280
- /* 家族 text 档在粗指针下用 ::after 扩热区到 44px 高,这里的 ::after 是铺满整格(含四周留白)的命中区:
281
- 钉回 inset 那副几何,不让家族的定位与下限把它挪走或撑高压到相邻的格 */
282
- @media (pointer: coarse) {
283
- [data-scope='calendar-picker'][data-part='cell-trigger']::after {
284
- inline-size: auto;
285
- block-size: auto;
286
- min-block-size: 0;
287
- translate: none;
288
- }
321
+ /* 日视图:24 见方的日期钮取圆 */
322
+ [data-scope='calendar-picker'][data-part='cell-trigger'][data-view='day'] {
323
+ --xh-action-radius: var(--xh-calendar-picker-cell-radius, var(--xh-shape-circle));
324
+ }
325
+
326
+ /* 周期格(周、月、季、年):钮铺满格子的内容宽,仍是 24 高、控件圆角;选中面只换颜色,不改变几何尺寸 */
327
+ [data-scope='calendar-picker'][data-part='cell-trigger']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) {
328
+ --xh-action-min-inline-size: 0;
329
+
330
+ inline-size: 100%;
331
+ }
332
+
333
+ /* 一行一个整周:文字从行首排起 */
334
+ [data-scope='calendar-picker'][data-part='cell-trigger'][data-view='week'] {
335
+ --xh-action-padding-inline: var(--xh-calendar-picker-week-cell-px, var(--xh-space-3));
336
+
337
+ justify-content: flex-start;
289
338
  }
290
339
 
291
340
  [data-scope='calendar-picker'][data-part='cell-trigger'][hidden] {
292
341
  display: none;
293
342
  }
294
343
 
295
- /* 命中区铺满整格:格子四周那圈留白也归它,指尖落在两格之间的空隙不会落空 */
344
+ /* 命中区铺满整格:格子上下那截内衬也归它,指尖落在两行之间的空隙不会落空 */
296
345
  [data-scope='calendar-picker'][data-part='cell-trigger']::after {
297
346
  content: '';
298
347
  position: absolute;
299
- inset: calc(-1 * var(--xh-calendar-picker-cell-gap, var(--xh-space-0_5)));
348
+ inset: 0;
349
+ }
350
+
351
+ /* 粗指针:格子首尾相接,家族 text 档那套 ::after 外扩会压到上下相邻的格。改由格子自己长到 44 见方——
352
+ 行距加到 44、列宽下限抬到 44,铺满整格的命中区随之到 44×44、彼此不重叠;钮仍是 24 的圆,
353
+ 横条仍以格子中线为轴、按细指针那副行距收边。::after 钉回整格那副几何。
354
+ 列宽下限再按视口收:七列放不下 44 时(手机窄屏)取「视口宽扣掉两侧页边、网格内衬与周数列」的七分之一,
355
+ 日历不撑出视口;不按容器收——按内容定宽的宿主(行内块、浮层)里百分比会退成 auto,格子塌回钮宽 */
356
+ @media (pointer: coarse) {
357
+ [data-scope='calendar-picker'][data-part='grid']:is([data-view='week'], [data-view='month'], [data-view='quarter'], [data-view='year']) {
358
+ min-inline-size: calc(7 * max(var(--xh-calendar-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-picker-grid-px, var(--xh-space-4))) / 7))) + 2 * var(--xh-calendar-picker-grid-px, var(--xh-space-4)));
359
+ }
360
+
361
+ [data-scope='calendar-picker'][data-part='week-row'] {
362
+ grid-template-columns: repeat(7, minmax(max(var(--xh-calendar-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-picker-grid-px, var(--xh-space-4))) / 7))), 1fr));
363
+ }
364
+
365
+ [data-scope='calendar-picker'][data-part='week-row']:not([hidden]):has(> [data-part='week-number']) {
366
+ grid-template-columns:
367
+ var(--xh-calendar-picker-week-number-w, var(--xh-control-h-md))
368
+ repeat(7, minmax(max(var(--xh-calendar-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-picker-grid-px, var(--xh-space-4)) - var(--xh-calendar-picker-week-number-w, var(--xh-control-h-md))) / 7))), 1fr));
369
+ }
370
+
371
+ [data-scope='calendar-picker'][data-part='cell'] {
372
+ min-block-size: var(--xh-control-hit-coarse);
373
+ }
374
+
375
+ [data-scope='calendar-picker'][data-part='cell-trigger']::after {
376
+ inline-size: auto;
377
+ block-size: auto;
378
+ min-block-size: 0;
379
+ translate: none;
380
+ }
300
381
  }
301
382
 
302
- /* 邻月的日子照样可点,只是压暗——它们不是占位符 */
383
+ /* 邻月的日子照样可点,只是压暗、字重回到常规——它们不是占位符 */
303
384
  [data-scope='calendar-picker'][data-part='cell-trigger'][data-outside-month] {
304
385
  --xh-_calendar-picker-cell-fg: var(--xh-calendar-picker-cell-fg-outside, var(--xh-fg-subtle));
305
- }
306
386
 
307
- /* 今天:1px 品牌环 + 品牌字(brand-subtle 退出 today 语义),底透明、悬停走普通格的阶梯;
308
- 选中仍用后面的实心强调面,两个状态叠加时不会混成同一种反馈 */
309
- [data-scope='calendar-picker'][data-part='cell-trigger'][data-today] {
310
- --xh-_calendar-picker-cell-bg: var(--xh-calendar-picker-today-bg, transparent);
311
- --xh-_calendar-picker-cell-border: var(--xh-calendar-picker-today-border, var(--xh-fg-brand));
312
- --xh-_calendar-picker-cell-fg: var(--xh-calendar-picker-today-fg, var(--xh-fg-brand));
387
+ font-weight: var(--xh-calendar-picker-cell-font-weight-outside, var(--xh-font-weight-regular));
313
388
  }
314
389
 
315
- /* 实心强调面给单选 / 多选的选中格(格状当前):悬停不换面,按下压到 active 档(光缩放在深色底上看不出回执)。
390
+ /* 实心强调面给单选 / 多选的选中格(格状当前):悬停不换面,按下压到 active 档。
316
391
  面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
317
392
  那一族色本来就要在这块面上把字读清楚,与面的对比是按可读性定的 */
318
393
  [data-scope='calendar-picker'][data-part='cell-trigger'][data-selected] {
@@ -332,8 +407,10 @@
332
407
  }
333
408
 
334
409
  @media (forced-colors: active) {
335
- [data-scope='calendar-picker'][data-part='cell-trigger'][data-today] {
336
- border-color: Highlight;
410
+ /* 今天的圆点是一块底色,这一档会被系统抹掉:退出强制换色,直接取系统前景 */
411
+ [data-scope='calendar-picker'][data-part='cell'][data-today]::after {
412
+ forced-color-adjust: none;
413
+ background-color: CanvasText;
337
414
  }
338
415
 
339
416
  /* 强制色下底色被抹平,选中格只剩描边能说明身份 */
@@ -352,9 +429,10 @@
352
429
  --xh-action-ring-color-focus-visible: var(--xh-ring-focus);
353
430
  }
354
431
 
355
- /* 不可用又选中的格:退到中性淡底 + 置灰字(禁用面),选中身份仍由这块底与未选中的透明格分开 */
432
+ /* 不可用又选中的格:压在淡底横条上,钮退到再深一档的中性面 + 置灰字(禁用面),
433
+ 选中身份仍由这块底与未选中的透明格分开 */
356
434
  [data-scope='calendar-picker'][data-part='cell-trigger'][data-disabled][data-selected] {
357
- --xh-action-bg-disabled: var(--xh-calendar-picker-cell-bg-selected-disabled, var(--xh-bg-subtle));
435
+ --xh-action-bg-disabled: var(--xh-calendar-picker-cell-bg-selected-disabled, var(--xh-bg-subtle-hover));
358
436
  }
359
437
 
360
438
  /* 只读:日子改不动,但不是禁用——颜色照常,只把"可点"这个暗示收回来。
@@ -444,6 +522,11 @@
444
522
  color: var(--xh-calendar-picker-cell-fg, var(--xh-fg-default));
445
523
  font-weight: var(--xh-font-weight-bold);
446
524
  }
525
+
526
+ /* 今天的圆点同样是底色:改由描边把这颗点画满 */
527
+ [data-scope='calendar-picker'][data-part='cell'][data-today]::after {
528
+ border: calc(var(--xh-calendar-picker-today-mark-size, var(--xh-space-1)) / 2) solid var(--xh-fg-default);
529
+ }
447
530
  }
448
531
 
449
532
  @media (forced-colors: active) {