@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
@@ -73,6 +73,7 @@
73
73
  --xh-_date-range-picker-control-px: var(--xh-control-px-md);
74
74
  --xh-_date-range-picker-gap: var(--xh-control-gap-md);
75
75
  --xh-_date-range-picker-font-size: var(--xh-control-font-md);
76
+ --xh-_date-range-picker-item-py: var(--xh-list-option-py-md);
76
77
 
77
78
  /* 选中对号随语气走。没写 data-tone 时这几个 --xh-_tone* 没被声明,退回品牌色 */
78
79
  /* 内嵌日期段沿用日期输入的轻强调焦点:当前段是「当前项」,淡底 + 淡底前景,不另画一套实心选择态。 */
@@ -80,6 +81,15 @@
80
81
  --xh-_date-field-segment-fg: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
81
82
  /* 对号画在普通面上,取语气前景角色,不拿实心强调底色充当前景。 */
82
83
  --xh-_date-range-picker-check-fg: var(--xh-_tone, var(--xh-fg-brand));
84
+ /* 时间列与预设的对号与 Select 等列表的对号同一把尺:指示符档,随密度收放 */
85
+ --xh-_date-range-picker-time-item-check-size: var(--xh-control-indicator-size);
86
+ }
87
+
88
+ /* 375px 复合面板要同时容下日历与两组时间列;手机档用正式小指示符,平板起恢复 16px。 */
89
+ @media not all and (min-width: 768px) {
90
+ [data-scope='date-range-picker']:is([data-part='root'], [data-part='positioner']) {
91
+ --xh-_date-range-picker-time-item-check-size: var(--xh-control-indicator-sm);
92
+ }
83
93
  }
84
94
 
85
95
  /* 与文本框、分段日期同一套堆叠:标签一行、输入行一行 */
@@ -108,6 +118,7 @@
108
118
  --xh-_date-range-picker-control-px: var(--xh-control-px-sm);
109
119
  --xh-_date-range-picker-gap: var(--xh-control-gap-sm);
110
120
  --xh-_date-range-picker-font-size: var(--xh-control-font-sm);
121
+ --xh-_date-range-picker-item-py: var(--xh-list-option-py-sm);
111
122
  }
112
123
 
113
124
  [data-scope='date-range-picker']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
@@ -116,6 +127,7 @@
116
127
  --xh-_date-range-picker-control-px: var(--xh-control-px-lg);
117
128
  --xh-_date-range-picker-gap: var(--xh-control-gap-lg);
118
129
  --xh-_date-range-picker-font-size: var(--xh-control-font-lg);
130
+ --xh-_date-range-picker-item-py: var(--xh-list-option-py-lg);
119
131
  }
120
132
 
121
133
  /* 只要声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
@@ -220,6 +232,30 @@
220
232
  color: var(--xh-date-range-picker-literal-fg, var(--xh-fg-subtle));
221
233
  }
222
234
 
235
+ /* 整条占位:一段都没填、焦点也不在段上时,段位与分隔符让位给一句占位文字,焦点一进到段上就换回段位。
236
+ 段位只是淡出(仍可聚焦、仍在读屏树里),文字以生成内容压在同一行上、不吃指针,点下去落到底下的段位 */
237
+ [data-scope='date-range-picker'][data-part='segment-group'][data-placeholder-shown] {
238
+ position: relative;
239
+ color: transparent;
240
+ }
241
+
242
+ [data-scope='date-range-picker'][data-part='segment-group'][data-placeholder-shown] > * {
243
+ opacity: 0;
244
+ }
245
+
246
+ [data-scope='date-range-picker'][data-part='segment-group'][data-placeholder-shown]::before {
247
+ content: attr(data-placeholder-text);
248
+ position: absolute;
249
+ inset-inline: 0;
250
+ inset-block-start: 50%;
251
+ overflow: hidden;
252
+ color: var(--xh-date-range-picker-placeholder-fg, var(--xh-fg-subtle));
253
+ white-space: nowrap;
254
+ text-overflow: ellipsis;
255
+ pointer-events: none;
256
+ translate: 0 -50%;
257
+ }
258
+
223
259
  /* 容器自己不占 Tab 位、也不承载焦点,环由 control 画,这里不再套一圈 */
224
260
  [data-scope='date-range-picker'][data-part='segment-group']:focus-visible {
225
261
  outline: none;
@@ -286,9 +322,10 @@
286
322
  border-radius: var(--xh-date-range-picker-content-radius, var(--xh-shape-overlay));
287
323
  background: var(--xh-date-range-picker-content-bg, var(--xh-bg-surface));
288
324
  color: var(--xh-date-range-picker-content-fg, var(--xh-fg-default));
289
- /* 日历是定高结构:六行日期加表头本来就有固定高度,上限走页内滚动面那一档;
325
+ /* 日历是定高结构:网格、时间列与确认行都按 px 排,天然高度就是它们的和,缺省不另设上限
326
+ (按 rem 的滚动面档会随根字号缩小,根字号低于 16px 时确认行就被挤到滚动里);
290
327
  可用高度是定位引擎算出的视口余量,视口真放不下时再收一截 */
291
- max-block-size: min(var(--xh-date-range-picker-max-h, var(--xh-viewport-h-lg)), var(--xh-_date-range-picker-available-h));
328
+ max-block-size: min(var(--xh-date-range-picker-max-h, var(--xh-_date-range-picker-available-h)), var(--xh-_date-range-picker-available-h));
292
329
  /* 两轴都滚:块轴放不下时面板内自己竖滚,行内轴放不下时面板内自己横滚,
293
330
  日历那几块保持各自的天然宽度,不被压 */
294
331
  overflow: auto;
@@ -312,7 +349,8 @@
312
349
  outline: none;
313
350
  }
314
351
 
315
- [data-scope='date-range-picker'][data-part='content'][data-state='open'] {
352
+ /* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
353
+ [data-scope='date-range-picker'][data-part='content'][data-state='open']:not([data-instant]) {
316
354
  animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
317
355
  }
318
356
 
@@ -350,7 +388,7 @@
350
388
  手机档两张月历折行堆叠,线画在块起始边 */
351
389
  [data-scope='date-range-picker'][data-part='calendar'] + [data-scope='date-range-picker'][data-part='calendar'] {
352
390
  padding-block-start: var(--xh-date-range-picker-panel-gap, var(--xh-space-3));
353
- border-block-start: var(--xh-stroke-thin) solid var(--xh-date-range-picker-panel-divider, var(--xh-material-frosted-separator));
391
+ border-block-start: var(--xh-stroke-thin) solid var(--xh-date-range-picker-panel-divider, var(--xh-material-solid-separator));
354
392
  }
355
393
 
356
394
  /* 平板起两张月历并排放得下,线改画在行内起始边 */
@@ -359,7 +397,7 @@
359
397
  padding-block-start: 0;
360
398
  padding-inline-start: var(--xh-date-range-picker-panel-gap, var(--xh-space-3));
361
399
  border-block-start: none;
362
- border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-range-picker-panel-divider, var(--xh-material-frosted-separator));
400
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-range-picker-panel-divider, var(--xh-material-solid-separator));
363
401
  }
364
402
  }
365
403
 
@@ -410,7 +448,7 @@
410
448
  overflow-y: hidden;
411
449
  /* 浮层滚动面:滚到头不把页面一起带走 */
412
450
  overscroll-behavior: contain;
413
- border-block-end: var(--xh-stroke-thin) solid var(--xh-date-range-picker-column-divider, var(--xh-material-frosted-separator));
451
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-date-range-picker-column-divider, var(--xh-material-solid-separator));
414
452
  }
415
453
 
416
454
  /* 平板起:换成贴在日历行内起始一侧的竖列,滚动轴与分隔线一起转过来 */
@@ -420,7 +458,7 @@
420
458
  flex-direction: column;
421
459
  overflow: auto;
422
460
  border-block-end: none;
423
- border-inline-end: var(--xh-stroke-thin) solid var(--xh-date-range-picker-column-divider, var(--xh-material-frosted-separator));
461
+ border-inline-end: var(--xh-stroke-thin) solid var(--xh-date-range-picker-column-divider, var(--xh-material-solid-separator));
424
462
  }
425
463
  }
426
464
 
@@ -435,7 +473,7 @@
435
473
  --xh-collection-block-padding: var(--xh-date-range-picker-preset-py, var(--xh-space-1));
436
474
  --xh-collection-inline-padding: var(--xh-date-range-picker-preset-px, var(--xh-space-3));
437
475
  --xh-collection-font-size: var(--xh-text-secondary-size);
438
- --xh-collection-radius: var(--xh-date-range-picker-preset-radius, var(--xh-shape-control));
476
+ --xh-collection-radius: var(--xh-date-range-picker-preset-radius, var(--xh-shape-inset));
439
477
  /* 面板是实体面(floating),正文取页面前景 */
440
478
  --xh-collection-fg-rest: var(--xh-fg-default);
441
479
  --xh-collection-fg-hover: var(--xh-fg-default);
@@ -462,7 +500,7 @@
462
500
  /* 对号的末端轨始终留着,切换选中时文字与整列宽度都不移动。 */
463
501
  padding-inline-end: calc(
464
502
  var(--xh-date-range-picker-preset-px, var(--xh-space-3)) +
465
- var(--xh-date-range-picker-preset-check-size, var(--xh-glyph-size-sm)) +
503
+ var(--xh-date-range-picker-preset-check-size, var(--xh-control-indicator-size)) +
466
504
  var(--xh-space-1)
467
505
  );
468
506
  white-space: nowrap;
@@ -487,8 +525,8 @@
487
525
  position: absolute;
488
526
  inset-block-start: 50%;
489
527
  inset-inline-end: var(--xh-date-range-picker-preset-px, var(--xh-space-3));
490
- inline-size: var(--xh-date-range-picker-preset-check-size, var(--xh-glyph-size-sm));
491
- block-size: var(--xh-date-range-picker-preset-check-size, var(--xh-glyph-size-sm));
528
+ inline-size: var(--xh-date-range-picker-preset-check-size, var(--xh-control-indicator-size));
529
+ block-size: var(--xh-date-range-picker-preset-check-size, var(--xh-control-indicator-size));
492
530
  translate: 0 -50%;
493
531
  background-color: var(--xh-date-range-picker-preset-check-fg, var(--xh-_date-range-picker-check-fg));
494
532
  opacity: 0;
@@ -506,6 +544,247 @@
506
544
  background-color: var(--xh-date-range-picker-preset-fg-disabled, var(--xh-fg-disabled));
507
545
  }
508
546
 
547
+ /* —— showTime:起止各一组时间列贴在日历旁边、逐列滚动,确认按钮收口 ——
548
+ 与日历同处一条可折行的行内流:放得下就并排,放不下时两组时间列折到日历下面,组内几列仍横着排 */
549
+ [data-scope='date-range-picker'][data-part='content']:has(> [data-part='column-group']) {
550
+ display: flex;
551
+ flex-wrap: wrap;
552
+ align-items: flex-start;
553
+ }
554
+
555
+ /* 确认按钮沉到所在那一行的底边:它是整块面板的出口,不跟日历顶边对齐 */
556
+ [data-scope='date-range-picker'][data-part='content']:has(> [data-part='column-group']) > [data-part='confirm-trigger'] {
557
+ align-self: flex-end;
558
+ }
559
+
560
+ /* 一端的几列成组并排,小标题落在与日历标题栏等高的顶带里;两组之间多留一档空当,眼睛先分起止、再分时分 */
561
+ [data-scope='date-range-picker'][data-part='column-group'] {
562
+ position: relative;
563
+ display: flex;
564
+ flex: none;
565
+ flex-wrap: nowrap;
566
+ align-items: stretch;
567
+ min-inline-size: 0;
568
+ /* 让出与日历标题栏等高的一带放小标题,列的顶边因此与日历网格对齐 */
569
+ padding-block-start: var(
570
+ --xh-date-range-picker-column-group-offset,
571
+ calc(var(--xh-control-h-sm) + var(--xh-date-range-picker-calendar-gap, var(--xh-space-2)))
572
+ );
573
+ }
574
+
575
+ [data-scope='date-range-picker'][data-part='column-group'][hidden] {
576
+ display: none;
577
+ }
578
+
579
+ [data-scope='date-range-picker'][data-part='column-group'] + [data-scope='date-range-picker'][data-part='column-group'] {
580
+ margin-inline-start: var(--xh-date-range-picker-column-group-gap, var(--xh-space-2));
581
+ }
582
+
583
+ /* 组的小标题:辅助文本档、次要前景;正在编辑的那一端换成正文前景与中等字重,看得出日历下一次点选改哪一端 */
584
+ [data-scope='date-range-picker'][data-part='column-group-label'] {
585
+ position: absolute;
586
+ inset-block-start: 0;
587
+ inset-inline: 0;
588
+ display: flex;
589
+ box-sizing: border-box;
590
+ align-items: center;
591
+ justify-content: center;
592
+ block-size: var(--xh-control-h-sm);
593
+ padding-inline: var(--xh-date-range-picker-column-group-label-px, var(--xh-space-1));
594
+ color: var(--xh-date-range-picker-column-group-label-fg, var(--xh-fg-subtle));
595
+ font-size: var(--xh-text-caption-size);
596
+ line-height: var(--xh-leading-normal);
597
+ text-align: center;
598
+ user-select: none;
599
+ }
600
+
601
+ [data-scope='date-range-picker'][data-part='column-group-label'][data-editing] {
602
+ color: var(--xh-date-range-picker-column-group-label-fg-active, var(--xh-fg-default));
603
+ font-weight: var(--xh-date-range-picker-column-group-label-font-weight-active, var(--xh-font-weight-medium));
604
+ }
605
+
606
+ [data-scope='date-range-picker'][data-part='column-group-label'][hidden] {
607
+ display: none;
608
+ }
609
+
610
+ [data-scope='date-range-picker'][data-part='time-column'] {
611
+ display: flex;
612
+ flex: none;
613
+ flex-direction: column;
614
+ gap: var(--xh-date-range-picker-time-column-gap, 0);
615
+ min-inline-size: var(--xh-date-range-picker-time-column-min-w, var(--xh-overlay-column-min-w));
616
+ /* 几列并排:定高而不是随内容收,否则时列与分列的可选值一多一少就错位 */
617
+ block-size: var(--xh-date-range-picker-time-column-h, var(--xh-overlay-calendar-column-h));
618
+ padding-block: var(--xh-date-range-picker-time-column-padding, var(--xh-space-1));
619
+ padding-inline: var(--xh-date-range-picker-time-column-px, 0);
620
+ overflow-x: hidden;
621
+ overflow-y: auto;
622
+ /* 浮层滚动面:滚到头不把页面一起带走 */
623
+ overscroll-behavior: contain;
624
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-range-picker-column-divider, var(--xh-material-solid-separator));
625
+ }
626
+
627
+ [data-scope='date-range-picker'][data-part='time-column'][hidden] {
628
+ display: none;
629
+ }
630
+
631
+ /* 时间格:悬停 / 高亮 100、按下 200 由 Collection Item 家族按 overlay 语境给,选中只留末端对号——
632
+ 浮层瞬态集合的选中不上品牌淡底、不加粗、不变字色。格里只有数字、没有正文部件,保持自己的
633
+ 居中排版与等宽标记轨,家族只给状态面 */
634
+ [data-scope='date-range-picker'][data-part='time-item'] {
635
+ --xh-_date-range-picker-time-item-rail: max(
636
+ var(--xh-date-range-picker-time-item-px, var(--xh-space-0_5)),
637
+ calc(var(--xh-date-range-picker-time-item-check-size, var(--xh-_date-range-picker-time-item-check-size)) + var(--xh-space-0_5))
638
+ );
639
+ --xh-collection-block-padding: var(--xh-date-range-picker-time-item-py, var(--xh-_date-range-picker-item-py));
640
+ --xh-collection-inline-padding: var(--xh-_date-range-picker-time-item-rail);
641
+ --xh-collection-font-size: var(--xh-date-range-picker-time-item-font-size, var(--xh-_date-range-picker-font-size));
642
+ --xh-collection-radius: var(--xh-date-range-picker-time-item-radius, var(--xh-shape-inset));
643
+ --xh-collection-fg-rest: var(--xh-date-range-picker-time-item-fg, var(--xh-material-frosted-fg));
644
+ --xh-collection-fg-hover: var(--xh-date-range-picker-time-item-fg, var(--xh-material-frosted-fg));
645
+ --xh-collection-fg-keyboard-highlight: var(--xh-date-range-picker-time-item-fg, var(--xh-material-frosted-fg));
646
+ --xh-collection-fg-pressed: var(--xh-date-range-picker-time-item-fg, var(--xh-material-frosted-fg));
647
+ --xh-collection-fg-selected: var(--xh-date-range-picker-time-item-fg-selected, var(--xh-date-range-picker-time-item-fg, var(--xh-material-frosted-fg)));
648
+ --xh-collection-fg-selected-highlight: var(--xh-date-range-picker-time-item-fg-selected, var(--xh-date-range-picker-time-item-fg, var(--xh-material-frosted-fg)));
649
+ --xh-collection-fg-selected-hover: var(--xh-date-range-picker-time-item-fg-selected, var(--xh-date-range-picker-time-item-fg, var(--xh-material-frosted-fg)));
650
+ --xh-collection-fg-selected-pressed: var(--xh-date-range-picker-time-item-fg-selected, var(--xh-date-range-picker-time-item-fg, var(--xh-material-frosted-fg)));
651
+ --xh-collection-font-weight-selected: var(--xh-date-range-picker-time-item-font-weight-selected, var(--xh-font-weight-regular));
652
+ --xh-collection-font-weight-selected-highlight: var(--xh-date-range-picker-time-item-font-weight-selected, var(--xh-font-weight-regular));
653
+ --xh-collection-font-weight-selected-hover: var(--xh-date-range-picker-time-item-font-weight-selected, var(--xh-font-weight-regular));
654
+ --xh-collection-font-weight-selected-pressed: var(--xh-date-range-picker-time-item-font-weight-selected, var(--xh-font-weight-regular));
655
+ --xh-collection-bg-hover: var(--xh-date-range-picker-time-item-bg-hover, var(--xh-bg-subtle));
656
+ --xh-collection-bg-keyboard-highlight: var(--xh-date-range-picker-time-item-bg-hover, var(--xh-bg-subtle));
657
+ --xh-collection-bg-selected-highlight: var(--xh-date-range-picker-time-item-bg-hover, var(--xh-bg-subtle));
658
+ --xh-collection-bg-selected-hover: var(--xh-date-range-picker-time-item-bg-hover, var(--xh-bg-subtle));
659
+ --xh-collection-bg-pressed: var(--xh-date-range-picker-time-item-bg-pressed, var(--xh-bg-subtle-hover));
660
+ --xh-collection-bg-selected-pressed: var(--xh-date-range-picker-time-item-bg-pressed, var(--xh-bg-subtle-hover));
661
+ --xh-collection-outline-keyboard-highlight: transparent;
662
+ --xh-collection-outline-selected-highlight: transparent;
663
+
664
+ position: relative;
665
+ display: flex;
666
+ flex: none;
667
+ align-items: center;
668
+ justify-content: center;
669
+ block-size: var(--xh-date-range-picker-time-item-h, auto);
670
+ font-variant-numeric: tabular-nums;
671
+ line-height: var(--xh-leading-normal);
672
+ text-align: center;
673
+ white-space: nowrap;
674
+ user-select: none;
675
+ }
676
+
677
+ [data-scope='date-range-picker'][data-part='time-item'][hidden] {
678
+ display: none;
679
+ }
680
+
681
+ /* 键盘焦点出现时环才接回并立即到位,不压在背景过渡的中间帧上 */
682
+ [data-scope='date-range-picker'][data-part='time-item']:focus-visible:not(:hover) {
683
+ --xh-collection-outline-keyboard-highlight: var(--xh-ring-focus);
684
+ --xh-collection-outline-selected-highlight: var(--xh-ring-focus);
685
+
686
+ transition: none;
687
+ }
688
+
689
+ [data-scope='date-range-picker'][data-part='time-item']::after {
690
+ content: '';
691
+ position: absolute;
692
+ inset-block-start: 50%;
693
+ /* 标记占轨道末端,内缘与正文之间恒留一档间隙;与 padding 读同一个 rail,避免重叠。 */
694
+ inset-inline-end: calc(
695
+ var(--xh-_date-range-picker-time-item-rail) -
696
+ var(--xh-date-range-picker-time-item-check-size, var(--xh-_date-range-picker-time-item-check-size)) -
697
+ var(--xh-space-1)
698
+ );
699
+ inline-size: var(--xh-date-range-picker-time-item-check-size, var(--xh-_date-range-picker-time-item-check-size));
700
+ block-size: var(--xh-date-range-picker-time-item-check-size, var(--xh-_date-range-picker-time-item-check-size));
701
+ translate: 0 -50%;
702
+ background-color: var(--xh-date-range-picker-time-item-check-fg, var(--xh-_date-range-picker-check-fg));
703
+ opacity: 0;
704
+ pointer-events: none;
705
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
706
+ -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
707
+ mask: var(--xh-glyph-mark-check) center / contain no-repeat;
708
+ }
709
+
710
+ [data-scope='date-range-picker'][data-part='time-item'][data-state='checked']::after {
711
+ opacity: 1;
712
+ }
713
+
714
+ /* 界外、早于同一天的起点与被判为不可用的格走 aria-disabled,家族按它给禁用面;选中标记跟着降级 */
715
+ [data-scope='date-range-picker'][data-part='time-item'][data-disabled]::after {
716
+ background-color: var(--xh-fg-disabled);
717
+ }
718
+
719
+ @media not all and (min-width: 768px) {
720
+ [data-scope='date-range-picker'][data-part='time-column'] {
721
+ min-inline-size: var(--xh-date-range-picker-time-column-min-w-mobile, var(--xh-overlay-column-min-w));
722
+ }
723
+
724
+ [data-scope='date-range-picker'][data-part='time-item'] {
725
+ --xh-_date-range-picker-time-item-rail: var(
726
+ --xh-date-range-picker-time-item-check-size,
727
+ var(--xh-_date-range-picker-time-item-check-size)
728
+ );
729
+ }
730
+
731
+ [data-scope='date-range-picker'][data-part='time-item']::after {
732
+ inset-inline-end: 0;
733
+ }
734
+ }
735
+
736
+ /* 列整体禁用时格没有自己的 aria-disabled,禁用面按列的 aria-disabled 映射到家族槽:
737
+ 字色降级、悬停 / 高亮 / 按下不换面、光标 not-allowed */
738
+ [data-scope='date-range-picker'][data-part='time-column'][aria-disabled='true'] [data-part='time-item'] {
739
+ --xh-collection-fg-rest: var(--xh-fg-disabled);
740
+ --xh-collection-fg-hover: var(--xh-fg-disabled);
741
+ --xh-collection-fg-keyboard-highlight: var(--xh-fg-disabled);
742
+ --xh-collection-fg-pressed: var(--xh-fg-disabled);
743
+ --xh-collection-fg-selected: var(--xh-fg-disabled);
744
+ --xh-collection-bg-hover: transparent;
745
+ --xh-collection-bg-keyboard-highlight: transparent;
746
+ --xh-collection-bg-pressed: transparent;
747
+ --xh-collection-bg-selected-hover: transparent;
748
+ --xh-collection-bg-selected-highlight: transparent;
749
+ --xh-collection-bg-selected-pressed: transparent;
750
+ --xh-collection-cursor-rest: not-allowed;
751
+ --xh-collection-cursor-hover: not-allowed;
752
+ --xh-collection-cursor-keyboard-highlight: not-allowed;
753
+ --xh-collection-cursor-pressed: not-allowed;
754
+ --xh-collection-cursor-selected: not-allowed;
755
+ }
756
+
757
+ [data-scope='date-range-picker'][data-part='time-column'][aria-disabled='true'] [data-part='time-item']::after {
758
+ background-color: var(--xh-fg-disabled);
759
+ }
760
+
761
+ /* 确认钮是面板里唯一的主要动作:品牌实心、悬停 / 按下与 0.97 按压、焦点环全由 Action Control 的
762
+ text solid 档给;槽名统一按部件取 --xh-date-range-picker-confirm-trigger-*,只映射到家族桥接槽 */
763
+ [data-scope='date-range-picker'][data-part='confirm-trigger'] {
764
+ --xh-action-visual-size: var(--xh-date-range-picker-confirm-trigger-h, var(--xh-_action-profile-visual-size));
765
+ --xh-action-padding-inline: var(--xh-date-range-picker-confirm-trigger-px, var(--xh-_action-profile-padding-inline));
766
+ --xh-action-radius: var(--xh-date-range-picker-confirm-trigger-radius, var(--xh-shape-control));
767
+ --xh-action-bg-rest: var(--xh-date-range-picker-confirm-trigger-bg, var(--xh-_action-variant-bg-rest));
768
+ --xh-action-bg-hover: var(--xh-date-range-picker-confirm-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
769
+ --xh-action-bg-pressed: var(--xh-date-range-picker-confirm-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
770
+ --xh-action-fg-rest: var(--xh-date-range-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-rest));
771
+ --xh-action-fg-hover: var(--xh-date-range-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-hover));
772
+ --xh-action-fg-pressed: var(--xh-date-range-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-pressed));
773
+ --xh-action-border-rest: transparent;
774
+ --xh-action-highlight-rest: transparent;
775
+ --xh-action-shadow-rest: var(--xh-date-range-picker-confirm-trigger-shadow, none);
776
+ --xh-action-shadow-hover: var(--xh-date-range-picker-confirm-trigger-shadow, none);
777
+ --xh-action-shadow-pressed: var(--xh-date-range-picker-confirm-trigger-shadow, none);
778
+ --xh-action-font-size: var(--xh-text-secondary-size);
779
+
780
+ border-width: 0;
781
+ }
782
+
783
+ /* 收起时连接层给的是 hidden 属性;家族那条 display 会把 UA 规则盖掉 */
784
+ [data-scope='date-range-picker'][data-part='confirm-trigger'][hidden] {
785
+ display: none;
786
+ }
787
+
509
788
  /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
510
789
  [data-scope='date-range-picker'][data-part='clear-trigger']:empty::before {
511
790
  content: '';
@@ -530,19 +809,63 @@
530
809
  }
531
810
 
532
811
  @media (forced-colors: active) {
812
+ /* 整条占位的文字照系统的弱色画;段位让位时的透明字不被强制换色顶回来 */
813
+ [data-scope='date-range-picker'][data-part='segment-group'][data-placeholder-shown] {
814
+ forced-color-adjust: none;
815
+ }
816
+
817
+ [data-scope='date-range-picker'][data-part='segment-group'][data-placeholder-shown]::before {
818
+ color: GrayText;
819
+ }
820
+
533
821
  /* 系统接管底色后仍保住末端对号;禁用标记改用系统失效色。 */
534
- [data-scope='date-range-picker'][data-part='preset']::after {
822
+ [data-scope='date-range-picker'][data-part='preset']::after,
823
+ [data-scope='date-range-picker'][data-part='time-item']::after {
535
824
  forced-color-adjust: none;
536
825
  background-color: CanvasText;
537
826
  }
538
827
 
539
- [data-scope='date-range-picker'][data-part='preset'][data-disabled]::after {
828
+ /* 按下与没被高亮时的悬停,家族把条目涂成 Highlight,对号跟着换 HighlightText */
829
+ [data-scope='date-range-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,
830
+ [data-scope='date-range-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 {
831
+ background-color: HighlightText;
832
+ }
833
+
834
+ [data-scope='date-range-picker'][data-part='preset'][data-disabled]::after,
835
+ [data-scope='date-range-picker'][data-part='time-item'][data-disabled]::after,
836
+ [data-scope='date-range-picker'][data-part='time-column'][aria-disabled='true'] [data-part='time-item']::after {
540
837
  background-color: GrayText;
541
838
  }
542
839
 
543
- [data-scope='date-range-picker'][data-part='preset'][data-disabled] {
840
+ [data-scope='date-range-picker'][data-part='preset'][data-disabled],
841
+ [data-scope='date-range-picker'][data-part='time-item'][data-disabled],
842
+ [data-scope='date-range-picker'][data-part='time-column'][aria-disabled='true'] [data-part='time-item'] {
544
843
  color: GrayText;
545
844
  }
845
+
846
+ /* 正在编辑的那一端靠字重与系统前景区分,不靠颜色 */
847
+ [data-scope='date-range-picker'][data-part='column-group-label'][data-editing] {
848
+ color: CanvasText;
849
+ }
850
+ }
851
+
852
+ @media (forced-colors: active) {
853
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
854
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
855
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
856
+ 禁用取 GrayText */
857
+ [data-scope='date-range-picker']:is([data-part='clear-trigger'], [data-part='trigger']):empty::before {
858
+ forced-color-adjust: none;
859
+ background-color: ButtonText;
860
+ }
861
+
862
+ [data-scope='date-range-picker']:is([data-part='clear-trigger'], [data-part='trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
863
+ background-color: HighlightText;
864
+ }
865
+
866
+ [data-scope='date-range-picker']:is([data-part='clear-trigger'], [data-part='trigger'])[data-disabled]:empty::before {
867
+ background-color: GrayText;
868
+ }
546
869
  }
547
870
  }
548
871
 
@@ -35,13 +35,29 @@
35
35
  color: var(--xh-fg-muted);
36
36
  }
37
37
 
38
- /* 不 invalid 时节点带 hidden:此处不声明 display,交给浏览器的 [hidden] 规则收起 */
38
+ /* 错误文案出现时淡入。不 invalid 时节点带 hidden,但不交给浏览器的 [hidden] 规则收成 display: none:
39
+ 从不生成盒到生成盒没有过渡的起点,淡入播不出来。收起态改成不占位(绝对定位、零高、裁切)、
40
+ 不可见也不进可及树(visibility: hidden)的盒,露面时回到流里淡入;首帧就在的错误文案没有过渡起点,
41
+ 直接呈现。收起那一下不占位的盒当场让位,不留淡出——同一行随即交还说明或整行收起,淡出只会叠在
42
+ 别的内容上;Field 下方为错误文案预留了一行时,退场在那一行里淡出(见 field.css) */
39
43
  [data-scope='field'][data-part='error-text'],
40
44
  [data-scope='fieldset'][data-part='error-text'] {
41
45
  margin: 0;
42
46
  font-size: var(--xh-text-secondary-size);
43
47
  line-height: var(--xh-leading-normal);
44
48
  color: var(--xh-fg-danger);
49
+ transition: opacity var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
50
+ }
51
+
52
+ [data-scope='field'][data-part='error-text'][hidden],
53
+ [data-scope='fieldset'][data-part='error-text'][hidden] {
54
+ display: block;
55
+ position: absolute;
56
+ block-size: 0;
57
+ overflow: clip;
58
+ visibility: hidden;
59
+ opacity: 0;
60
+ transition: none;
45
61
  }
46
62
 
47
63
  [data-scope='field'][data-part='root'][data-invalid] > [data-scope='field'][data-part='description'],
@@ -78,6 +78,46 @@
78
78
  --xh-_descriptions-font-size: var(--xh-control-font-lg);
79
79
  }
80
80
 
81
+ /* —— 头部 ——
82
+ 列表之前的一行:左标题、右附加内容。它是根的兄弟,继承不到根上的私有槽,尺寸档自己再换一次 */
83
+ [data-scope='descriptions'][data-part='header'] {
84
+ --xh-_descriptions-header-mb: var(--xh-space-3);
85
+
86
+ display: flex;
87
+ flex-wrap: wrap;
88
+ align-items: center;
89
+ gap: var(--xh-descriptions-header-gap, var(--xh-space-3));
90
+ margin-block-end: var(--xh-descriptions-header-mb, var(--xh-_descriptions-header-mb));
91
+ }
92
+
93
+ [data-scope='descriptions'][data-part='header'][data-size='sm'] {
94
+ --xh-_descriptions-header-mb: var(--xh-space-2);
95
+ }
96
+
97
+ [data-scope='descriptions'][data-part='header'][data-size='lg'] {
98
+ --xh-_descriptions-header-mb: var(--xh-space-4);
99
+ }
100
+
101
+ /* 标题是 Surface 内标题:正文字号 + 半粗;作者写成 h2 / h3 时 UA 的外边距与字号在这里清掉 */
102
+ [data-scope='descriptions'][data-part='title'] {
103
+ flex: 1 1 auto;
104
+ min-inline-size: 0;
105
+ margin: 0;
106
+ color: var(--xh-descriptions-title-fg, var(--xh-fg-default));
107
+ font-size: var(--xh-descriptions-title-font-size, var(--xh-text-label-size));
108
+ font-weight: var(--xh-descriptions-title-font-weight, var(--xh-font-weight-semibold));
109
+ line-height: var(--xh-leading-relaxed);
110
+ }
111
+
112
+ /* 附加内容贴在行尾:操作钮或状态标签,一行放不下时整块换到下一行 */
113
+ [data-scope='descriptions'][data-part='extra'] {
114
+ display: flex;
115
+ flex: none;
116
+ align-items: center;
117
+ gap: var(--xh-descriptions-extra-gap, var(--xh-space-2));
118
+ margin-inline-start: auto;
119
+ }
120
+
81
121
  /* —— 每一格 —— */
82
122
  /* 一格自己也是网格:不写 placement 即标签一行、取值一行叠着排。
83
123
  窄档每格横跨根上排定的所有列,一行只摆一组,作者写在格上的 span 这一档不认 */
@@ -251,6 +291,8 @@
251
291
 
252
292
  /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
253
293
  写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
294
+ [data-scope='descriptions'][data-part='header'][hidden],
295
+ [data-scope='descriptions'][data-part='extra'][hidden],
254
296
  [data-scope='descriptions'][data-part='item'][hidden] {
255
297
  display: none;
256
298
  }