@xihan-ui/styles 2.1.0 → 3.1.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 (152) hide show
  1. package/CHANGELOG.md +1261 -0
  2. package/README.md +6 -1
  3. package/component-tokens.d.ts +533 -96
  4. package/components.tokens.json +35461 -26045
  5. package/css/accordion.css +34 -8
  6. package/css/alert.css +59 -1
  7. package/css/anchor.css +46 -8
  8. package/css/approval.css +116 -76
  9. package/css/avatar-group.css +1 -1
  10. package/css/avatar.css +13 -5
  11. package/css/back-top.css +61 -42
  12. package/css/badge.css +62 -12
  13. package/css/bar-code.css +1 -1
  14. package/css/breadcrumb.css +62 -3
  15. package/css/button-group.css +4 -4
  16. package/css/button.css +67 -19
  17. package/css/calendar-picker.css +19 -0
  18. package/css/calendar-range-picker.css +39 -2
  19. package/css/card.css +115 -1
  20. package/css/carousel.css +148 -43
  21. package/css/cartesian-chart.css +830 -0
  22. package/css/cascader.css +181 -65
  23. package/css/checkbox-group.css +59 -89
  24. package/css/checkbox.css +16 -49
  25. package/css/citation.css +470 -0
  26. package/css/clipboard.css +20 -63
  27. package/css/code-view.css +101 -6
  28. package/css/collapsible.css +34 -8
  29. package/css/color-field.css +18 -0
  30. package/css/color-picker.css +128 -50
  31. package/css/color-slider.css +22 -15
  32. package/css/color-swatch-picker.css +3 -1
  33. package/css/combobox.css +80 -33
  34. package/css/command.css +45 -43
  35. package/css/context-menu.css +39 -22
  36. package/css/date-field.css +56 -0
  37. package/css/date-picker.css +132 -26
  38. package/css/date-range-picker.css +337 -14
  39. package/css/description.css +17 -1
  40. package/css/descriptions.css +42 -0
  41. package/css/dialog.css +94 -36
  42. package/css/diff-view.css +97 -12
  43. package/css/download-trigger.css +44 -78
  44. package/css/drawer.css +160 -119
  45. package/css/editable.css +19 -0
  46. package/css/empty-state.css +7 -6
  47. package/css/field-array.css +36 -0
  48. package/css/field.css +20 -18
  49. package/css/file-upload.css +125 -135
  50. package/css/flex.css +324 -8
  51. package/css/float-button.css +263 -38
  52. package/css/floating-panel.css +53 -19
  53. package/css/form.css +31 -17
  54. package/css/funnel-chart.css +106 -0
  55. package/css/graph-chart.css +205 -0
  56. package/css/grid-list.css +235 -0
  57. package/css/grid.css +252 -1
  58. package/css/heatmap.css +119 -36
  59. package/css/hierarchy-chart.css +298 -0
  60. package/css/hover-card.css +31 -14
  61. package/css/icon.css +100 -0
  62. package/css/image-cropper.css +33 -7
  63. package/css/image-viewer.css +167 -22
  64. package/css/image.css +23 -4
  65. package/css/input-group.css +11 -13
  66. package/css/json-viewer.css +50 -2
  67. package/css/layout.css +68 -18
  68. package/css/liquid.css +106 -0
  69. package/css/list.css +1 -1
  70. package/css/listbox.css +46 -6
  71. package/css/loading-bar.css +27 -13
  72. package/css/log.css +129 -33
  73. package/css/markdown-stream.css +1 -1
  74. package/css/marquee.css +163 -7
  75. package/css/matrix-code.css +1 -1
  76. package/css/mention.css +35 -19
  77. package/css/menu.css +35 -21
  78. package/css/menubar.css +36 -20
  79. package/css/message-feed.css +172 -51
  80. package/css/navigation-menu.css +172 -11
  81. package/css/notification.css +435 -108
  82. package/css/number-field.css +22 -0
  83. package/css/page-header.css +3 -1
  84. package/css/pagination.css +126 -24
  85. package/css/password-input.css +40 -8
  86. package/css/pie-chart.css +247 -0
  87. package/css/popconfirm.css +44 -50
  88. package/css/popover.css +50 -14
  89. package/css/progress.css +308 -10
  90. package/css/prompt-input.css +36 -0
  91. package/css/question-flow.css +97 -57
  92. package/css/radar-chart.css +233 -0
  93. package/css/radio-group.css +363 -5
  94. package/css/rating.css +21 -23
  95. package/css/reasoning.css +61 -54
  96. package/css/resizable.css +6 -1
  97. package/css/sankey-chart.css +174 -0
  98. package/css/scroll-area.css +32 -0
  99. package/css/scrollbar.css +1 -1
  100. package/css/select.css +74 -55
  101. package/css/side-nav.css +173 -24
  102. package/css/signature-pad.css +16 -1
  103. package/css/skeleton.css +13 -14
  104. package/css/slider.css +35 -13
  105. package/css/sortable.css +37 -7
  106. package/css/sparkline.css +164 -0
  107. package/css/spinner.css +50 -22
  108. package/css/splitter.css +7 -1
  109. package/css/statistic.css +10 -0
  110. package/css/steps.css +248 -29
  111. package/css/switch.css +23 -48
  112. package/css/table.css +175 -118
  113. package/css/tabs.css +231 -19
  114. package/css/tag-group.css +27 -3
  115. package/css/tag.css +53 -12
  116. package/css/tags-input.css +40 -3
  117. package/css/text-field.css +19 -0
  118. package/css/time-field.css +20 -1
  119. package/css/time-picker.css +103 -17
  120. package/css/time-range-picker.css +45 -16
  121. package/css/timeline.css +1 -1
  122. package/css/toggle-group.css +4 -4
  123. package/css/toggle.css +4 -3
  124. package/css/tool-call.css +59 -51
  125. package/css/toolbar.css +101 -3
  126. package/css/tooltip.css +15 -2
  127. package/css/tour.css +42 -12
  128. package/css/transfer.css +98 -75
  129. package/css/tree-select.css +232 -53
  130. package/css/tree.css +271 -55
  131. package/css/truncate.css +55 -12
  132. package/css/typography.css +93 -0
  133. package/css/virtualizer.css +56 -0
  134. package/css/watermark.css +23 -0
  135. package/family/action-control.css +14 -5
  136. package/family/chart.css +480 -0
  137. package/family/check-mark.css +94 -0
  138. package/family/choice-card.css +97 -0
  139. package/family/collection-item.css +9 -15
  140. package/family/field-chrome.css +1 -12
  141. package/family/loading-ring.css +95 -0
  142. package/family/material.css +72 -0
  143. package/family/menu-choice.css +56 -0
  144. package/family/motion.css +207 -10
  145. package/family/tag-list.css +59 -0
  146. package/index.css +13824 -4030
  147. package/index.unlayered.css +13403 -3605
  148. package/package.json +20 -8
  149. package/css/gradient-text.css +0 -91
  150. package/css/icon-wrapper.css +0 -81
  151. package/css/segmented.css +0 -280
  152. package/css/toast.css +0 -499
@@ -12,6 +12,7 @@
12
12
 
13
13
  /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
14
14
  @import '../family/motion.css';
15
+ @import '../family/tag-list.css';
15
16
 
16
17
  @layer xihan.components {
17
18
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
@@ -73,6 +74,7 @@
73
74
  --xh-_date-picker-control-px: var(--xh-control-px-md);
74
75
  --xh-_date-picker-gap: var(--xh-control-gap-md);
75
76
  --xh-_date-picker-font-size: var(--xh-control-font-md);
77
+ --xh-_date-picker-item-py: var(--xh-list-option-py-md);
76
78
 
77
79
  /* 选中对号随语气走。没写 data-tone 时这几个 --xh-_tone* 没被声明,退回品牌色 */
78
80
  /* 内嵌日期段沿用日期输入的轻强调焦点:当前段是「当前项」,淡底 + 淡底前景,不另画一套实心选择态。 */
@@ -80,7 +82,8 @@
80
82
  --xh-_date-field-segment-fg: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
81
83
  /* 对号画在普通面上,取语气前景角色,不能拿确认按钮的实心背景色充当前景。 */
82
84
  --xh-_date-picker-check-fg: var(--xh-_tone, var(--xh-fg-brand));
83
- --xh-_date-picker-time-item-check-size: var(--xh-glyph-size-sm);
85
+ /* 时间列与预设的对号与 Select 等列表的对号同一把尺:指示符档,随密度收放 */
86
+ --xh-_date-picker-time-item-check-size: var(--xh-control-indicator-size);
84
87
  }
85
88
 
86
89
  /* 与文本框、分段日期同一套堆叠:标签一行、输入行一行 */
@@ -107,6 +110,7 @@
107
110
  --xh-_date-picker-control-px: var(--xh-control-px-sm);
108
111
  --xh-_date-picker-gap: var(--xh-control-gap-sm);
109
112
  --xh-_date-picker-font-size: var(--xh-control-font-sm);
113
+ --xh-_date-picker-item-py: var(--xh-list-option-py-sm);
110
114
  }
111
115
 
112
116
  [data-scope='date-picker']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
@@ -115,10 +119,11 @@
115
119
  --xh-_date-picker-control-px: var(--xh-control-px-lg);
116
120
  --xh-_date-picker-gap: var(--xh-control-gap-lg);
117
121
  --xh-_date-picker-font-size: var(--xh-control-font-lg);
122
+ --xh-_date-picker-item-py: var(--xh-list-option-py-lg);
118
123
  }
119
124
 
120
125
  /* 375px 复合面板要同时容下日历与时/分两列;手机档用正式小指示符,平板起恢复16px。 */
121
- @media (width < 768px) {
126
+ @media not all and (min-width: 768px) {
122
127
  [data-scope='date-picker']:is([data-part='root'], [data-part='positioner']) {
123
128
  --xh-_date-picker-time-item-check-size: var(--xh-control-indicator-sm);
124
129
  }
@@ -199,11 +204,69 @@
199
204
  color: var(--xh-date-picker-literal-fg, var(--xh-fg-subtle));
200
205
  }
201
206
 
207
+ /* 整条占位:一段都没填、焦点也不在段上时,段位与分隔符让位给一句占位文字,焦点一进到段上就换回段位。
208
+ 段位只是淡出(仍可聚焦、仍在读屏树里),文字以生成内容压在同一行上、不吃指针,点下去落到底下的段位 */
209
+ [data-scope='date-picker'][data-part='segment-group'][data-placeholder-shown] {
210
+ position: relative;
211
+ color: transparent;
212
+ }
213
+
214
+ [data-scope='date-picker'][data-part='segment-group'][data-placeholder-shown] > * {
215
+ opacity: 0;
216
+ }
217
+
218
+ [data-scope='date-picker'][data-part='segment-group'][data-placeholder-shown]::before {
219
+ content: attr(data-placeholder-text);
220
+ position: absolute;
221
+ inset-inline: 0;
222
+ inset-block-start: 50%;
223
+ overflow: hidden;
224
+ color: var(--xh-date-picker-placeholder-fg, var(--xh-fg-subtle));
225
+ white-space: nowrap;
226
+ text-overflow: ellipsis;
227
+ pointer-events: none;
228
+ translate: 0 -50%;
229
+ }
230
+
202
231
  /* 容器自己不占 Tab 位、也不承载焦点,环由 control 画,这里不再套一圈 */
203
232
  [data-scope='date-picker'][data-part='segment-group']:focus-visible {
204
233
  outline: none;
205
234
  }
206
235
 
236
+ /* 多选的标签行:段位让位,选中的日期在盒里排成标签,超过 maxTagCount 的折进 +N。
237
+ 行里每一枚都是 tag(data-scope="tag"),样子归 tag.css;行怎么排、标签怎么进出归标签行家族配方,
238
+ 这里只接使用者的间距槽,并让它像段位那样占满输入行剩下的宽度 */
239
+ [data-scope='date-picker'][data-part='tag-list'] {
240
+ --xh-tag-list-gap: var(--xh-date-picker-tag-list-gap, var(--xh-space-1));
241
+
242
+ /* 基准取 0:只吃两颗钮剩下的宽度、在自己里面折行;按内容宽算基准的话,盒子会先在钮前面折行,把钮挤到最后一行 */
243
+ flex: 1 1 0;
244
+ flex-wrap: wrap;
245
+ font-size: var(--xh-date-picker-font-size, var(--xh-_date-picker-font-size));
246
+ }
247
+
248
+ /* 日期标签是定长文字,截短了就读不出是哪天:不收缩,排不下就折到下一行(与标签输入同一种排法),
249
+ 盒随行数长高(字段家族的 multi-tag 布局给),到上限后在盒内滚动 */
250
+ [data-scope='date-picker'][data-part='tag-list'] > [data-scope='tag'][data-part='root'] {
251
+ flex: none;
252
+ }
253
+
254
+ [data-scope='date-picker'][data-part='control'][data-xh-field-layout='multi-tag'] {
255
+ max-block-size: var(--xh-date-picker-control-max-h, var(--xh-viewport-h-sm));
256
+ overflow-y: auto;
257
+ }
258
+
259
+ /* 没有选中时这一行承载整条占位:与单选那条占位同一句文字、同一个颜色槽 */
260
+ [data-scope='date-picker'][data-part='tag-list'][data-placeholder-shown]::before {
261
+ content: attr(data-placeholder-text);
262
+ min-inline-size: 0;
263
+ overflow: hidden;
264
+ color: var(--xh-date-picker-placeholder-fg, var(--xh-fg-subtle));
265
+ white-space: nowrap;
266
+ text-overflow: ellipsis;
267
+ pointer-events: none;
268
+ }
269
+
207
270
  /* 两个按钮同一副长相:贴在框内末端的小方钮,不占宽度也不撑高 control。正方视觉盒、inset 圆角、
208
271
  悬停 100 / 按下 200 与 0.97 按压、粗指针热区、禁用面与 :focus-visible 关环(盒的 :focus-within
209
272
  已画了一圈)全由 Action Control 的 field-inset ghost 档给,组件只映射既有覆盖槽。
@@ -243,10 +306,11 @@
243
306
  --xh-action-fg-rest: var(--xh-date-picker-action-fg-hover, var(--xh-fg-default));
244
307
  }
245
308
 
246
- /* 有值时清空钮顶上来,日历钮让位:两颗并排堆着用户分不清点哪个 */
309
+ /* 有值时清空钮顶上来,日历钮让位:两颗并排堆着用户分不清点哪个。
310
+ 多选不让位:段位收起后日历钮是唯一的键盘入口(退格摘标签也在它身上),藏了键盘就进不来 */
247
311
  [data-scope='date-picker'][data-part='control']:has(
248
312
  > [data-scope='date-picker'][data-part='clear-trigger']:not([hidden])
249
- )
313
+ ):not(:has(> [data-scope='date-picker'][data-part='tag-list']:not([hidden])))
250
314
  > [data-scope='date-picker'][data-part='trigger'] {
251
315
  display: none;
252
316
  }
@@ -265,9 +329,10 @@
265
329
  border-radius: var(--xh-date-picker-content-radius, var(--xh-shape-overlay));
266
330
  background: var(--xh-date-picker-content-bg, var(--xh-bg-surface));
267
331
  color: var(--xh-date-picker-content-fg, var(--xh-fg-default));
268
- /* 日历是定高结构:六行日期加表头本来就有固定高度,上限走页内滚动面那一档;
332
+ /* 日历是定高结构:网格、时间列与确认行都按 px 排,天然高度就是它们的和,缺省不另设上限
333
+ (按 rem 的滚动面档会随根字号缩小,根字号低于 16px 时确认行就被挤到滚动里);
269
334
  可用高度是定位引擎算出的视口余量,视口真放不下时再收一截 */
270
- max-block-size: min(var(--xh-date-picker-max-h, var(--xh-viewport-h-lg)), var(--xh-_date-picker-available-h));
335
+ max-block-size: min(var(--xh-date-picker-max-h, var(--xh-_date-picker-available-h)), var(--xh-_date-picker-available-h));
271
336
  /* 两轴都滚:块轴放不下时面板内自己竖滚,行内轴放不下时面板内自己横滚,
272
337
  日历那几块保持各自的天然宽度,不被压 */
273
338
  overflow: auto;
@@ -291,7 +356,8 @@
291
356
  outline: none;
292
357
  }
293
358
 
294
- [data-scope='date-picker'][data-part='content'][data-state='open'] {
359
+ /* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
360
+ [data-scope='date-picker'][data-part='content'][data-state='open']:not([data-instant]) {
295
361
  animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
296
362
  }
297
363
 
@@ -344,7 +410,7 @@
344
410
  手机档两张月历折行堆叠,线画在块起始边 */
345
411
  [data-scope='date-picker'][data-part='calendar'] + [data-scope='date-picker'][data-part='calendar'] {
346
412
  padding-block-start: var(--xh-date-picker-panel-gap, var(--xh-space-3));
347
- border-block-start: var(--xh-stroke-thin) solid var(--xh-date-picker-panel-divider, var(--xh-material-frosted-separator));
413
+ border-block-start: var(--xh-stroke-thin) solid var(--xh-date-picker-panel-divider, var(--xh-material-solid-separator));
348
414
  }
349
415
 
350
416
  /* 平板起两张月历并排放得下,线改画在行内起始边 */
@@ -353,7 +419,7 @@
353
419
  padding-block-start: 0;
354
420
  padding-inline-start: var(--xh-date-picker-panel-gap, var(--xh-space-3));
355
421
  border-block-start: none;
356
- border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-picker-panel-divider, var(--xh-material-frosted-separator));
422
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-picker-panel-divider, var(--xh-material-solid-separator));
357
423
  }
358
424
  }
359
425
 
@@ -393,7 +459,7 @@
393
459
  inset-block: 0;
394
460
  inset-inline-end: calc(-1 * var(--xh-stroke-thin));
395
461
  inline-size: var(--xh-stroke-thin);
396
- background: var(--xh-date-picker-column-divider, var(--xh-material-frosted-separator));
462
+ background: var(--xh-date-picker-column-divider, var(--xh-material-solid-separator));
397
463
  pointer-events: none;
398
464
  }
399
465
 
@@ -418,7 +484,7 @@
418
484
  overflow-y: hidden;
419
485
  /* 浮层滚动面:滚到头不把页面一起带走 */
420
486
  overscroll-behavior: contain;
421
- border-block-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-frosted-separator));
487
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-solid-separator));
422
488
  }
423
489
 
424
490
  /* 平板起:换成贴在日历行内起始一侧的竖列,滚动轴与分隔线一起转过来 */
@@ -428,7 +494,7 @@
428
494
  flex-direction: column;
429
495
  overflow: auto;
430
496
  border-block-end: none;
431
- border-inline-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-frosted-separator));
497
+ border-inline-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-solid-separator));
432
498
  }
433
499
  }
434
500
 
@@ -443,7 +509,7 @@
443
509
  --xh-collection-block-padding: var(--xh-date-picker-preset-py, var(--xh-space-1));
444
510
  --xh-collection-inline-padding: var(--xh-date-picker-preset-px, var(--xh-space-3));
445
511
  --xh-collection-font-size: var(--xh-text-secondary-size);
446
- --xh-collection-radius: var(--xh-date-picker-preset-radius, var(--xh-shape-control));
512
+ --xh-collection-radius: var(--xh-date-picker-preset-radius, var(--xh-shape-inset));
447
513
  /* 面板是实体面(floating),正文取页面前景 */
448
514
  --xh-collection-fg-rest: var(--xh-fg-default);
449
515
  --xh-collection-fg-hover: var(--xh-fg-default);
@@ -470,7 +536,7 @@
470
536
  /* 对号的末端轨始终留着,切换选中时文字与整列宽度都不移动。 */
471
537
  padding-inline-end: calc(
472
538
  var(--xh-date-picker-preset-px, var(--xh-space-3)) +
473
- var(--xh-date-picker-preset-check-size, var(--xh-glyph-size-sm)) +
539
+ var(--xh-date-picker-preset-check-size, var(--xh-control-indicator-size)) +
474
540
  var(--xh-space-1)
475
541
  );
476
542
  white-space: nowrap;
@@ -495,8 +561,8 @@
495
561
  position: absolute;
496
562
  inset-block-start: 50%;
497
563
  inset-inline-end: var(--xh-date-picker-preset-px, var(--xh-space-3));
498
- inline-size: var(--xh-date-picker-preset-check-size, var(--xh-glyph-size-sm));
499
- block-size: var(--xh-date-picker-preset-check-size, var(--xh-glyph-size-sm));
564
+ inline-size: var(--xh-date-picker-preset-check-size, var(--xh-control-indicator-size));
565
+ block-size: var(--xh-date-picker-preset-check-size, var(--xh-control-indicator-size));
500
566
  translate: 0 -50%;
501
567
  background-color: var(--xh-date-picker-preset-check-fg, var(--xh-_date-picker-check-fg));
502
568
  opacity: 0;
@@ -523,10 +589,7 @@
523
589
  gap: var(--xh-date-picker-time-column-gap, 0);
524
590
  min-inline-size: var(--xh-date-picker-time-column-min-w, var(--xh-overlay-column-min-w));
525
591
  /* 几列并排:定高而不是随内容收,否则时列与分列的可选值一多一少就错位 */
526
- block-size: var(
527
- --xh-date-picker-time-column-h,
528
- min(var(--xh-viewport-h-md), calc(var(--xh-control-h-sm) * 7 + var(--xh-space-7)))
529
- );
592
+ block-size: var(--xh-date-picker-time-column-h, var(--xh-overlay-calendar-column-h));
530
593
  margin-block-start: var(
531
594
  --xh-date-picker-time-column-offset,
532
595
  calc(var(--xh-control-h-sm) + var(--xh-date-picker-calendar-gap, var(--xh-space-2)))
@@ -537,7 +600,7 @@
537
600
  overflow-y: auto;
538
601
  /* 浮层滚动面:滚到头不把页面一起带走 */
539
602
  overscroll-behavior: contain;
540
- border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-frosted-separator));
603
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-solid-separator));
541
604
  }
542
605
 
543
606
  [data-scope='date-picker'][data-part='time-column'][hidden] {
@@ -554,10 +617,10 @@
554
617
  var(--xh-date-picker-time-item-px, var(--xh-space-0_5)),
555
618
  calc(var(--xh-date-picker-time-item-check-size, var(--xh-_date-picker-time-item-check-size)) + var(--xh-space-0_5))
556
619
  );
557
- --xh-collection-block-padding: var(--xh-date-picker-time-item-py, 0);
620
+ --xh-collection-block-padding: var(--xh-date-picker-time-item-py, var(--xh-_date-picker-item-py));
558
621
  --xh-collection-inline-padding: var(--xh-_date-picker-time-item-rail);
559
- --xh-collection-font-size: var(--xh-text-secondary-size);
560
- --xh-collection-radius: var(--xh-date-picker-time-item-radius, var(--xh-shape-control));
622
+ --xh-collection-font-size: var(--xh-date-picker-time-item-font-size, var(--xh-_date-picker-font-size));
623
+ --xh-collection-radius: var(--xh-date-picker-time-item-radius, var(--xh-shape-inset));
561
624
  --xh-collection-fg-rest: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
562
625
  --xh-collection-fg-hover: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
563
626
  --xh-collection-fg-keyboard-highlight: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
@@ -584,8 +647,9 @@
584
647
  flex: none;
585
648
  align-items: center;
586
649
  justify-content: center;
587
- block-size: var(--xh-date-picker-time-item-h, calc(var(--xh-control-h-sm) - var(--xh-space-1)));
650
+ block-size: var(--xh-date-picker-time-item-h, auto);
588
651
  font-variant-numeric: tabular-nums;
652
+ line-height: var(--xh-leading-normal);
589
653
  text-align: center;
590
654
  white-space: nowrap;
591
655
  user-select: none;
@@ -628,7 +692,12 @@
628
692
  opacity: 1;
629
693
  }
630
694
 
631
- @media (width < 768px) {
695
+ /* 界外、被判为不可用的格走 aria-disabled,家族按它给禁用面;选中标记跟着降级 */
696
+ [data-scope='date-picker'][data-part='time-item'][data-disabled]::after {
697
+ background-color: var(--xh-fg-disabled);
698
+ }
699
+
700
+ @media not all and (min-width: 768px) {
632
701
  [data-scope='date-picker'][data-part='content'] {
633
702
  padding-inline: var(--xh-date-picker-content-px, var(--xh-space-2));
634
703
  }
@@ -726,6 +795,16 @@
726
795
  }
727
796
 
728
797
  @media (forced-colors: active) {
798
+ /* 整条占位的文字照系统的弱色画;段位让位时的透明字不被强制换色顶回来 */
799
+ [data-scope='date-picker'][data-part='segment-group'][data-placeholder-shown] {
800
+ forced-color-adjust: none;
801
+ }
802
+
803
+ [data-scope='date-picker'][data-part='segment-group'][data-placeholder-shown]::before,
804
+ [data-scope='date-picker'][data-part='tag-list'][data-placeholder-shown]::before {
805
+ color: GrayText;
806
+ }
807
+
729
808
  /* 系统接管底色后仍保住末端对号;禁用标记改用系统失效色。 */
730
809
  [data-scope='date-picker'][data-part='preset']::after,
731
810
  [data-scope='date-picker'][data-part='time-item']::after {
@@ -733,16 +812,43 @@
733
812
  background-color: CanvasText;
734
813
  }
735
814
 
815
+ /* 按下与没被高亮时的悬停,家族把条目涂成 Highlight,对号跟着换 HighlightText */
816
+ [data-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,
817
+ [data-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 {
818
+ background-color: HighlightText;
819
+ }
820
+
736
821
  [data-scope='date-picker'][data-part='preset'][data-disabled]::after,
822
+ [data-scope='date-picker'][data-part='time-item'][data-disabled]::after,
737
823
  [data-scope='date-picker'][data-part='time-column'][aria-disabled='true'] [data-part='time-item']::after {
738
824
  background-color: GrayText;
739
825
  }
740
826
 
741
827
  [data-scope='date-picker'][data-part='preset'][data-disabled],
828
+ [data-scope='date-picker'][data-part='time-item'][data-disabled],
742
829
  [data-scope='date-picker'][data-part='time-column'][aria-disabled='true'] [data-part='time-item'] {
743
830
  color: GrayText;
744
831
  }
745
832
  }
833
+
834
+ @media (forced-colors: active) {
835
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
836
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
837
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
838
+ 禁用取 GrayText */
839
+ [data-scope='date-picker']:is([data-part='clear-trigger'], [data-part='trigger']):empty::before {
840
+ forced-color-adjust: none;
841
+ background-color: ButtonText;
842
+ }
843
+
844
+ [data-scope='date-picker']:is([data-part='clear-trigger'], [data-part='trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
845
+ background-color: HighlightText;
846
+ }
847
+
848
+ [data-scope='date-picker']:is([data-part='clear-trigger'], [data-part='trigger'])[data-disabled]:empty::before {
849
+ background-color: GrayText;
850
+ }
851
+ }
746
852
  }
747
853
 
748
854
  @layer xihan.motion {