@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 探一次,取不到就说明这份皮肤没被引入。 */
@@ -63,6 +64,7 @@
63
64
  --xh-_time-picker-control-px: var(--xh-control-px-md);
64
65
  --xh-_time-picker-gap: var(--xh-control-gap-md);
65
66
  --xh-_time-picker-font-size: var(--xh-control-font-md);
67
+ --xh-_time-picker-item-py: var(--xh-list-option-py-md);
66
68
 
67
69
  /* 段位强调随语气走:当前段是「当前项」,淡底 + 淡底前景;对号使用普通表面上的前景色。
68
70
  没写 data-tone 时这几个 --xh-_tone* 没被声明,退回品牌色 */
@@ -95,6 +97,7 @@
95
97
  --xh-_time-picker-control-px: var(--xh-control-px-sm);
96
98
  --xh-_time-picker-gap: var(--xh-control-gap-sm);
97
99
  --xh-_time-picker-font-size: var(--xh-control-font-sm);
100
+ --xh-_time-picker-item-py: var(--xh-list-option-py-sm);
98
101
  }
99
102
 
100
103
  [data-scope='time-picker']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
@@ -103,6 +106,7 @@
103
106
  --xh-_time-picker-control-px: var(--xh-control-px-lg);
104
107
  --xh-_time-picker-gap: var(--xh-control-gap-lg);
105
108
  --xh-_time-picker-font-size: var(--xh-control-font-lg);
109
+ --xh-_time-picker-item-py: var(--xh-list-option-py-lg);
106
110
  }
107
111
 
108
112
  /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
@@ -173,6 +177,27 @@
173
177
  display: none;
174
178
  }
175
179
 
180
+ /* 多选的标签行:段位让位,选中的时刻在盒里排成标签,超过 maxTagCount 的折进 +N。
181
+ 行里每一枚都是 tag(data-scope="tag"),样子归 tag.css;行怎么排、标签怎么进出归标签行家族配方。
182
+ 基准取 0:只吃两颗钮剩下的宽度、在自己里面折行;按内容宽算基准的话,盒子会先在钮前面折行,把钮挤到最后一行 */
183
+ [data-scope='time-picker'][data-part='tag-list'] {
184
+ --xh-tag-list-gap: var(--xh-time-picker-tag-list-gap, var(--xh-space-1));
185
+
186
+ flex: 1 1 0;
187
+ flex-wrap: wrap;
188
+ }
189
+
190
+ /* 时刻标签是定长文字,截短了就读不出是几点:不收缩,排不下就折到下一行(与标签输入同一种排法),
191
+ 盒随行数长高(字段家族的 multi-tag 布局给),到上限后在盒内滚动 */
192
+ [data-scope='time-picker'][data-part='tag-list'] > [data-scope='tag'][data-part='root'] {
193
+ flex: none;
194
+ }
195
+
196
+ [data-scope='time-picker'][data-part='control'][data-xh-field-layout='multi-tag'] {
197
+ max-block-size: var(--xh-time-picker-control-max-h, var(--xh-viewport-h-sm));
198
+ overflow-y: auto;
199
+ }
200
+
176
201
  [data-scope='time-picker'][data-part='segment-group'] > :not([data-scope]) {
177
202
  color: var(--xh-time-picker-literal-fg, var(--xh-fg-subtle));
178
203
  }
@@ -189,7 +214,7 @@
189
214
  /* 段是 role=spinbutton 的展示节点,双击选中一段文字只会碍事 */
190
215
  user-select: none;
191
216
  transition:
192
- background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
217
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
193
218
  color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
194
219
  }
195
220
 
@@ -278,10 +303,11 @@
278
303
  --xh-action-fg-rest: var(--xh-time-picker-action-fg-hover, var(--xh-fg-default));
279
304
  }
280
305
 
281
- /* 有值时清空钮顶上来,展开钮让位:两颗并排堆着用户分不清点哪个 */
306
+ /* 有值时清空钮顶上来,展开钮让位:两颗并排堆着用户分不清点哪个。
307
+ 多选不让位:段位收起后展开钮是唯一的键盘入口(退格摘标签也在它身上),藏了键盘就进不来 */
282
308
  [data-scope='time-picker'][data-part='control']:has(
283
309
  > [data-scope='time-picker'][data-part='clear-trigger']:not([hidden])
284
- )
310
+ ):not(:has(> [data-scope='time-picker'][data-part='tag-list']:not([hidden])))
285
311
  > [data-scope='time-picker'][data-part='trigger'] {
286
312
  display: none;
287
313
  }
@@ -320,7 +346,8 @@
320
346
  outline: none;
321
347
  }
322
348
 
323
- [data-scope='time-picker'][data-part='content'][data-state='open'] {
349
+ /* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
350
+ [data-scope='time-picker'][data-part='content'][data-state='open']:not([data-instant]) {
324
351
  animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
325
352
  }
326
353
 
@@ -330,6 +357,40 @@
330
357
  animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
331
358
  }
332
359
 
360
+ /* 「添加」沉到各列的右下角:它是多选时整块面板的出口,不跟列顶对齐 */
361
+ [data-scope='time-picker'][data-part='content'] > [data-scope='time-picker'][data-part='confirm-trigger'] {
362
+ flex: none;
363
+ align-self: flex-end;
364
+ margin-inline-start: var(--xh-time-picker-confirm-trigger-gap, var(--xh-space-1));
365
+ }
366
+
367
+ /* 「添加」是面板里唯一的主要动作:品牌实心、悬停 / 按下与 0.97 按压、焦点环全由 Action Control 的
368
+ text solid 档给;槽名统一按部件取 --xh-time-picker-confirm-trigger-*,只映射到家族桥接槽 */
369
+ [data-scope='time-picker'][data-part='confirm-trigger'] {
370
+ --xh-action-visual-size: var(--xh-time-picker-confirm-trigger-h, var(--xh-_action-profile-visual-size));
371
+ --xh-action-padding-inline: var(--xh-time-picker-confirm-trigger-px, var(--xh-_action-profile-padding-inline));
372
+ --xh-action-radius: var(--xh-time-picker-confirm-trigger-radius, var(--xh-shape-control));
373
+ --xh-action-bg-rest: var(--xh-time-picker-confirm-trigger-bg, var(--xh-_action-variant-bg-rest));
374
+ --xh-action-bg-hover: var(--xh-time-picker-confirm-trigger-bg-hover, var(--xh-_action-variant-bg-hover));
375
+ --xh-action-bg-pressed: var(--xh-time-picker-confirm-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
376
+ --xh-action-fg-rest: var(--xh-time-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-rest));
377
+ --xh-action-fg-hover: var(--xh-time-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-hover));
378
+ --xh-action-fg-pressed: var(--xh-time-picker-confirm-trigger-fg, var(--xh-_action-variant-fg-pressed));
379
+ --xh-action-border-rest: transparent;
380
+ --xh-action-highlight-rest: transparent;
381
+ --xh-action-shadow-rest: var(--xh-time-picker-confirm-trigger-shadow, none);
382
+ --xh-action-shadow-hover: var(--xh-time-picker-confirm-trigger-shadow, none);
383
+ --xh-action-shadow-pressed: var(--xh-time-picker-confirm-trigger-shadow, none);
384
+ --xh-action-font-size: var(--xh-text-secondary-size);
385
+
386
+ border-width: 0;
387
+ }
388
+
389
+ /* 单选时连接层给的是 hidden 属性;家族那条 display 会把 UA 规则盖掉 */
390
+ [data-scope='time-picker'][data-part='confirm-trigger'][hidden] {
391
+ display: none;
392
+ }
393
+
333
394
  /* 快捷选项也是一列,与时分秒那几列并排,排在行内起始一侧 */
334
395
  [data-scope='time-picker'][data-part='preset-group'] {
335
396
  display: flex;
@@ -341,7 +402,7 @@
341
402
  overflow-y: auto;
342
403
  /* 浮层滚动面:滚到头不把页面一起带走 */
343
404
  overscroll-behavior: contain;
344
- border-inline-end: var(--xh-stroke-thin) solid var(--xh-time-picker-column-divider, var(--xh-material-frosted-separator));
405
+ border-inline-end: var(--xh-stroke-thin) solid var(--xh-time-picker-column-divider, var(--xh-material-solid-separator));
345
406
  }
346
407
 
347
408
  [data-scope='time-picker'][data-part='preset-group'][hidden] {
@@ -355,7 +416,7 @@
355
416
  --xh-collection-block-padding: var(--xh-time-picker-preset-py, var(--xh-space-1));
356
417
  --xh-collection-inline-padding: var(--xh-time-picker-preset-px, var(--xh-space-3));
357
418
  --xh-collection-font-size: var(--xh-text-secondary-size);
358
- --xh-collection-radius: var(--xh-time-picker-preset-radius, var(--xh-shape-control));
419
+ --xh-collection-radius: var(--xh-time-picker-preset-radius, var(--xh-shape-inset));
359
420
  /* 面板是实体面(floating),正文取页面前景 */
360
421
  --xh-collection-fg-rest: var(--xh-time-picker-preset-fg, var(--xh-fg-default));
361
422
  --xh-collection-fg-hover: var(--xh-time-picker-preset-fg, var(--xh-fg-default));
@@ -381,7 +442,7 @@
381
442
  /* 对号的末端轨始终留着,切换选中时文字与整列宽度都不移动。 */
382
443
  padding-inline-end: calc(
383
444
  var(--xh-time-picker-preset-px, var(--xh-space-3))
384
- + var(--xh-time-picker-preset-check-size, var(--xh-glyph-size-sm))
445
+ + var(--xh-time-picker-preset-check-size, var(--xh-control-indicator-size))
385
446
  + var(--xh-space-1)
386
447
  );
387
448
  white-space: nowrap;
@@ -402,8 +463,8 @@
402
463
  position: absolute;
403
464
  inset-block-start: 50%;
404
465
  inset-inline-end: var(--xh-time-picker-preset-px, var(--xh-space-3));
405
- inline-size: var(--xh-time-picker-preset-check-size, var(--xh-glyph-size-sm));
406
- block-size: var(--xh-time-picker-preset-check-size, var(--xh-glyph-size-sm));
466
+ inline-size: var(--xh-time-picker-preset-check-size, var(--xh-control-indicator-size));
467
+ block-size: var(--xh-time-picker-preset-check-size, var(--xh-control-indicator-size));
407
468
  background-color: var(--xh-time-picker-preset-check-fg, var(--xh-_time-picker-check-fg));
408
469
  opacity: 0;
409
470
  translate: 0 -50%;
@@ -450,7 +511,7 @@
450
511
 
451
512
  /* 每列后面紧跟着它自己的贴层条子节点,相邻选择器接不到下一列,按「前面有过列」取第二列起 */
452
513
  [data-scope='time-picker'][data-part='column'] ~ [data-scope='time-picker'][data-part='column'] {
453
- border-inline-start: var(--xh-stroke-thin) solid var(--xh-time-picker-column-divider, var(--xh-material-frosted-separator));
514
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-time-picker-column-divider, var(--xh-material-solid-separator));
454
515
  }
455
516
 
456
517
  /* 焦点落在列上有两种情形:指针打开、这一段还空着、还没有任何格当锚点,或整列被界裁空。
@@ -472,13 +533,13 @@
472
533
  [data-scope='time-picker'][data-part='item'] {
473
534
  --xh-_time-picker-item-rail: max(
474
535
  var(--xh-time-picker-item-px, var(--xh-space-0_5)),
475
- calc(var(--xh-time-picker-item-check-size, var(--xh-glyph-size-sm)) + var(--xh-space-0_5))
536
+ calc(var(--xh-time-picker-item-check-size, var(--xh-control-indicator-size)) + var(--xh-space-0_5))
476
537
  );
477
- --xh-collection-block-padding: var(--xh-time-picker-item-py, 0);
538
+ --xh-collection-block-padding: var(--xh-time-picker-item-py, var(--xh-_time-picker-item-py));
478
539
  /* 两侧留同宽轨:对号绝对落在末端,数字仍在整格的数学中心。 */
479
540
  --xh-collection-inline-padding: var(--xh-_time-picker-item-rail);
480
541
  --xh-collection-font-size: var(--xh-time-picker-item-font-size, var(--xh-_time-picker-font-size));
481
- --xh-collection-radius: var(--xh-time-picker-item-radius, var(--xh-shape-control));
542
+ --xh-collection-radius: var(--xh-time-picker-item-radius, var(--xh-shape-inset));
482
543
  --xh-collection-fg-rest: var(--xh-time-picker-item-fg, var(--xh-material-frosted-fg));
483
544
  --xh-collection-fg-hover: var(--xh-time-picker-item-fg, var(--xh-material-frosted-fg));
484
545
  --xh-collection-fg-keyboard-highlight: var(--xh-time-picker-item-fg, var(--xh-material-frosted-fg));
@@ -505,9 +566,9 @@
505
566
  flex: none;
506
567
  align-items: center;
507
568
  justify-content: center;
508
- block-size: var(--xh-time-picker-item-h, var(--xh-overlay-column-item-h));
569
+ block-size: var(--xh-time-picker-item-h, auto);
509
570
  /* 居中的单个数字格没有截断层,行高保持紧排,列内多露几格 */
510
- line-height: var(--xh-leading-none);
571
+ line-height: var(--xh-leading-normal);
511
572
  white-space: nowrap;
512
573
  user-select: none;
513
574
  }
@@ -530,8 +591,8 @@
530
591
  position: absolute;
531
592
  inset-block-start: 50%;
532
593
  inset-inline-end: var(--xh-space-0_5);
533
- inline-size: var(--xh-time-picker-item-check-size, var(--xh-glyph-size-sm));
534
- block-size: var(--xh-time-picker-item-check-size, var(--xh-glyph-size-sm));
594
+ inline-size: var(--xh-time-picker-item-check-size, var(--xh-control-indicator-size));
595
+ block-size: var(--xh-time-picker-item-check-size, var(--xh-control-indicator-size));
535
596
  background-color: var(--xh-time-picker-item-check-fg, var(--xh-_time-picker-check-fg));
536
597
  opacity: 0;
537
598
  translate: 0 -50%;
@@ -564,6 +625,12 @@
564
625
  forced-color-adjust: none;
565
626
  }
566
627
 
628
+ /* 按下与没被高亮时的悬停,家族把条目涂成 Highlight,对号跟着换 HighlightText */
629
+ [data-scope='time-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,
630
+ [data-scope='time-picker'][data-part='item']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted]))::after {
631
+ background-color: HighlightText;
632
+ }
633
+
567
634
  [data-scope='time-picker'][data-part='preset'][data-disabled]::after,
568
635
  [data-scope='time-picker'][data-part='item'][data-disabled]::after {
569
636
  background-color: GrayText;
@@ -608,6 +675,25 @@
608
675
  -webkit-mask: var(--xh-glyph-mark-clock) center / contain no-repeat;
609
676
  mask: var(--xh-glyph-mark-clock) center / contain no-repeat;
610
677
  }
678
+
679
+ @media (forced-colors: active) {
680
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
681
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
682
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
683
+ 禁用取 GrayText */
684
+ [data-scope='time-picker']:is([data-part='clear-trigger'], [data-part='trigger']):empty::before {
685
+ forced-color-adjust: none;
686
+ background-color: ButtonText;
687
+ }
688
+
689
+ [data-scope='time-picker']:is([data-part='clear-trigger'], [data-part='trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
690
+ background-color: HighlightText;
691
+ }
692
+
693
+ [data-scope='time-picker']:is([data-part='clear-trigger'], [data-part='trigger'])[data-disabled]:empty::before {
694
+ background-color: GrayText;
695
+ }
696
+ }
611
697
  }
612
698
 
613
699
  @layer xihan.motion {
@@ -70,6 +70,7 @@
70
70
  --xh-_time-range-picker-control-px: var(--xh-control-px-md);
71
71
  --xh-_time-range-picker-gap: var(--xh-control-gap-md);
72
72
  --xh-_time-range-picker-font-size: var(--xh-control-font-md);
73
+ --xh-_time-range-picker-item-py: var(--xh-list-option-py-md);
73
74
 
74
75
  /* 段位强调随语气走:当前段是「当前项」,淡底 + 淡底前景;对号使用普通表面上的前景色。
75
76
  没写 data-tone 时这几个 --xh-_tone* 没被声明,退回品牌色 */
@@ -102,6 +103,7 @@
102
103
  --xh-_time-range-picker-control-px: var(--xh-control-px-sm);
103
104
  --xh-_time-range-picker-gap: var(--xh-control-gap-sm);
104
105
  --xh-_time-range-picker-font-size: var(--xh-control-font-sm);
106
+ --xh-_time-range-picker-item-py: var(--xh-list-option-py-sm);
105
107
  }
106
108
 
107
109
  [data-scope='time-range-picker']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
@@ -110,6 +112,7 @@
110
112
  --xh-_time-range-picker-control-px: var(--xh-control-px-lg);
111
113
  --xh-_time-range-picker-gap: var(--xh-control-gap-lg);
112
114
  --xh-_time-range-picker-font-size: var(--xh-control-font-lg);
115
+ --xh-_time-range-picker-item-py: var(--xh-list-option-py-lg);
113
116
  }
114
117
 
115
118
  /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
@@ -222,7 +225,7 @@
222
225
  /* 段是 role=spinbutton 的展示节点,双击选中一段文字只会碍事 */
223
226
  user-select: none;
224
227
  transition:
225
- background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
228
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
226
229
  color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
227
230
  }
228
231
 
@@ -359,7 +362,8 @@
359
362
  outline: none;
360
363
  }
361
364
 
362
- [data-scope='time-range-picker'][data-part='content'][data-state='open'] {
365
+ /* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
366
+ [data-scope='time-range-picker'][data-part='content'][data-state='open']:not([data-instant]) {
363
367
  animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
364
368
  }
365
369
 
@@ -380,7 +384,7 @@
380
384
  overflow-y: auto;
381
385
  /* 浮层滚动面:滚到头不把页面一起带走 */
382
386
  overscroll-behavior: contain;
383
- border-inline-end: var(--xh-stroke-thin) solid var(--xh-time-range-picker-column-divider, var(--xh-material-frosted-separator));
387
+ border-inline-end: var(--xh-stroke-thin) solid var(--xh-time-range-picker-column-divider, var(--xh-material-solid-separator));
384
388
  }
385
389
 
386
390
  [data-scope='time-range-picker'][data-part='preset-group'][hidden] {
@@ -394,7 +398,7 @@
394
398
  --xh-collection-block-padding: var(--xh-time-range-picker-preset-py, var(--xh-space-1));
395
399
  --xh-collection-inline-padding: var(--xh-time-range-picker-preset-px, var(--xh-space-3));
396
400
  --xh-collection-font-size: var(--xh-text-secondary-size);
397
- --xh-collection-radius: var(--xh-time-range-picker-preset-radius, var(--xh-shape-control));
401
+ --xh-collection-radius: var(--xh-time-range-picker-preset-radius, var(--xh-shape-inset));
398
402
  /* 面板是实体面(floating),正文取页面前景 */
399
403
  --xh-collection-fg-rest: var(--xh-time-range-picker-preset-fg, var(--xh-fg-default));
400
404
  --xh-collection-fg-hover: var(--xh-time-range-picker-preset-fg, var(--xh-fg-default));
@@ -420,7 +424,7 @@
420
424
  /* 对号的末端轨始终留着,切换选中时文字与整列宽度都不移动。 */
421
425
  padding-inline-end: calc(
422
426
  var(--xh-time-range-picker-preset-px, var(--xh-space-3))
423
- + var(--xh-time-range-picker-preset-check-size, var(--xh-glyph-size-sm))
427
+ + var(--xh-time-range-picker-preset-check-size, var(--xh-control-indicator-size))
424
428
  + var(--xh-space-1)
425
429
  );
426
430
  white-space: nowrap;
@@ -441,8 +445,8 @@
441
445
  position: absolute;
442
446
  inset-block-start: 50%;
443
447
  inset-inline-end: var(--xh-time-range-picker-preset-px, var(--xh-space-3));
444
- inline-size: var(--xh-time-range-picker-preset-check-size, var(--xh-glyph-size-sm));
445
- block-size: var(--xh-time-range-picker-preset-check-size, var(--xh-glyph-size-sm));
448
+ inline-size: var(--xh-time-range-picker-preset-check-size, var(--xh-control-indicator-size));
449
+ block-size: var(--xh-time-range-picker-preset-check-size, var(--xh-control-indicator-size));
446
450
  background-color: var(--xh-time-range-picker-preset-check-fg, var(--xh-_time-range-picker-check-fg));
447
451
  opacity: 0;
448
452
  translate: 0 -50%;
@@ -497,7 +501,7 @@
497
501
  [data-scope='time-range-picker'][data-part='column-group'] + [data-scope='time-range-picker'][data-part='column-group'] {
498
502
  margin-inline-start: var(--xh-time-range-picker-column-group-gap, var(--xh-space-2));
499
503
  padding-inline-start: var(--xh-time-range-picker-column-group-gap, var(--xh-space-2));
500
- border-inline-start: var(--xh-stroke-thin) solid var(--xh-time-range-picker-column-group-divider, var(--xh-material-frosted-separator));
504
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-time-range-picker-column-group-divider, var(--xh-material-solid-separator));
501
505
  }
502
506
 
503
507
  /* 组顶上的小标题:独占一行,字号走辅助文本档 */
@@ -546,7 +550,7 @@
546
550
 
547
551
  /* 每列后面紧跟着它自己的贴层条子节点,相邻选择器接不到下一列,按「前面有过列」取第二列起 */
548
552
  [data-scope='time-range-picker'][data-part='column'] ~ [data-scope='time-range-picker'][data-part='column'] {
549
- border-inline-start: var(--xh-stroke-thin) solid var(--xh-time-range-picker-column-divider, var(--xh-material-frosted-separator));
553
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-time-range-picker-column-divider, var(--xh-material-solid-separator));
550
554
  }
551
555
 
552
556
  /* 焦点落在列上有两种情形:指针打开、这一段还空着、还没有任何格当锚点,或整列被界裁空。
@@ -568,13 +572,13 @@
568
572
  [data-scope='time-range-picker'][data-part='item'] {
569
573
  --xh-_time-range-picker-item-rail: max(
570
574
  var(--xh-time-range-picker-item-px, var(--xh-space-0_5)),
571
- calc(var(--xh-time-range-picker-item-check-size, var(--xh-glyph-size-sm)) + var(--xh-space-0_5))
575
+ calc(var(--xh-time-range-picker-item-check-size, var(--xh-control-indicator-size)) + var(--xh-space-0_5))
572
576
  );
573
- --xh-collection-block-padding: var(--xh-time-range-picker-item-py, 0);
577
+ --xh-collection-block-padding: var(--xh-time-range-picker-item-py, var(--xh-_time-range-picker-item-py));
574
578
  /* 两侧留同宽轨:对号绝对落在末端,数字仍在整格的数学中心。 */
575
579
  --xh-collection-inline-padding: var(--xh-_time-range-picker-item-rail);
576
580
  --xh-collection-font-size: var(--xh-time-range-picker-item-font-size, var(--xh-_time-range-picker-font-size));
577
- --xh-collection-radius: var(--xh-time-range-picker-item-radius, var(--xh-shape-control));
581
+ --xh-collection-radius: var(--xh-time-range-picker-item-radius, var(--xh-shape-inset));
578
582
  --xh-collection-fg-rest: var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg));
579
583
  --xh-collection-fg-hover: var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg));
580
584
  --xh-collection-fg-keyboard-highlight: var(--xh-time-range-picker-item-fg, var(--xh-material-frosted-fg));
@@ -601,9 +605,9 @@
601
605
  flex: none;
602
606
  align-items: center;
603
607
  justify-content: center;
604
- block-size: var(--xh-time-range-picker-item-h, var(--xh-overlay-column-item-h));
608
+ block-size: var(--xh-time-range-picker-item-h, auto);
605
609
  /* 居中的单个数字格没有截断层,行高保持紧排,列内多露几格 */
606
- line-height: var(--xh-leading-none);
610
+ line-height: var(--xh-leading-normal);
607
611
  white-space: nowrap;
608
612
  user-select: none;
609
613
  }
@@ -626,8 +630,8 @@
626
630
  position: absolute;
627
631
  inset-block-start: 50%;
628
632
  inset-inline-end: var(--xh-space-0_5);
629
- inline-size: var(--xh-time-range-picker-item-check-size, var(--xh-glyph-size-sm));
630
- block-size: var(--xh-time-range-picker-item-check-size, var(--xh-glyph-size-sm));
633
+ inline-size: var(--xh-time-range-picker-item-check-size, var(--xh-control-indicator-size));
634
+ block-size: var(--xh-time-range-picker-item-check-size, var(--xh-control-indicator-size));
631
635
  background-color: var(--xh-time-range-picker-item-check-fg, var(--xh-_time-range-picker-check-fg));
632
636
  opacity: 0;
633
637
  translate: 0 -50%;
@@ -660,6 +664,12 @@
660
664
  forced-color-adjust: none;
661
665
  }
662
666
 
667
+ /* 按下与没被高亮时的悬停,家族把条目涂成 Highlight,对号跟着换 HighlightText */
668
+ [data-scope='time-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,
669
+ [data-scope='time-range-picker'][data-part='item']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted]))::after {
670
+ background-color: HighlightText;
671
+ }
672
+
663
673
  [data-scope='time-range-picker'][data-part='preset'][data-disabled]::after,
664
674
  [data-scope='time-range-picker'][data-part='item'][data-disabled]::after {
665
675
  background-color: GrayText;
@@ -704,6 +714,25 @@
704
714
  -webkit-mask: var(--xh-glyph-mark-clock) center / contain no-repeat;
705
715
  mask: var(--xh-glyph-mark-clock) center / contain no-repeat;
706
716
  }
717
+
718
+ @media (forced-colors: active) {
719
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
720
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
721
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
722
+ 禁用取 GrayText */
723
+ [data-scope='time-range-picker']:is([data-part='clear-trigger'], [data-part='trigger']):empty::before {
724
+ forced-color-adjust: none;
725
+ background-color: ButtonText;
726
+ }
727
+
728
+ [data-scope='time-range-picker']:is([data-part='clear-trigger'], [data-part='trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
729
+ background-color: HighlightText;
730
+ }
731
+
732
+ [data-scope='time-range-picker']:is([data-part='clear-trigger'], [data-part='trigger'])[data-disabled]:empty::before {
733
+ background-color: GrayText;
734
+ }
735
+ }
707
736
  }
708
737
 
709
738
  @layer xihan.motion {
package/css/timeline.css CHANGED
@@ -107,7 +107,7 @@
107
107
  /* 语气色由每条自己的数据给,同一条的语气改了(事情办成了、出错了)走一遍过渡,
108
108
  整列圆点不在数据回来的那一帧集体跳色 */
109
109
  transition:
110
- background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
110
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
111
111
  color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
112
112
  }
113
113
 
@@ -215,18 +215,18 @@
215
215
  font-weight: var(--xh-toggle-group-item-font-weight, var(--xh-text-label-weight));
216
216
  }
217
217
 
218
- /* 共边:后一段往回挪一个描边宽度,两条相邻的边重合成一条。
218
+ /* 共边只画一次:后一段不画起始边,由前一段的末端边承担。墨色描边半透明,两条重合会加深。
219
219
  方向跟着 data-orientation 走,横排收 inline 轴、竖排收 block 轴 */
220
220
  [data-scope='toggle-group'][data-part='root'][data-orientation='horizontal']
221
221
  > [data-scope='toggle-group'][data-part='item']
222
222
  + [data-scope='toggle-group'][data-part='item'] {
223
- margin-inline-start: calc(-1 * var(--xh-stroke-thin));
223
+ border-inline-start-width: 0;
224
224
  }
225
225
 
226
226
  [data-scope='toggle-group'][data-part='root'][data-orientation='vertical']
227
227
  > [data-scope='toggle-group'][data-part='item']
228
228
  + [data-scope='toggle-group'][data-part='item'] {
229
- margin-block-start: calc(-1 * var(--xh-stroke-thin));
229
+ border-block-start-width: 0;
230
230
  }
231
231
 
232
232
  /* 两端圆角用逻辑角属性写,rtl 与竖排都跟着换边,不必另写一套。
@@ -270,7 +270,7 @@
270
270
  --xh-action-bg-focus-visible: var(--xh-toggle-group-item-bg-on, var(--xh-_toggle-group-item-bg-on));
271
271
  --xh-action-bg-disabled: var(
272
272
  --xh-toggle-group-item-bg-on-disabled,
273
- color-mix(in oklab, var(--xh-_toggle-group-item-bg-on) 50%, var(--xh-bg-muted))
273
+ color-mix(in oklab, var(--xh-_toggle-group-item-bg-on) 50%, var(--xh-bg-muted-opaque))
274
274
  );
275
275
  --xh-action-fg-rest: var(--xh-toggle-group-item-fg-on, var(--xh-_toggle-group-item-fg-on));
276
276
  --xh-action-fg-hover: var(--xh-toggle-group-item-fg-on, var(--xh-_toggle-group-item-fg-on));
package/css/toggle.css CHANGED
@@ -34,10 +34,11 @@
34
34
  );
35
35
  --xh-_toggle-fg-on: var(--xh-toggle-fg-on, var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle)));
36
36
  --xh-_toggle-border-on: var(--xh-toggle-border-on, transparent);
37
- /* 禁用同时降级前景与表面,不靠 opacity;选中且禁用时底色掺一半中性面,选中信息不丢。 */
37
+ /* 禁用同时降级前景与表面,不靠 opacity;选中且禁用时底色掺一半中性面,选中信息不丢。
38
+ 掺的是淡底的不透明档:墨色淡底半透明,掺进去整块面会跟着变半透明 */
38
39
  --xh-_toggle-bg-on-disabled: var(
39
40
  --xh-toggle-bg-on-disabled,
40
- color-mix(in oklab, var(--xh-_toggle-bg-on) 50%, var(--xh-bg-subtle))
41
+ color-mix(in oklab, var(--xh-_toggle-bg-on) 50%, var(--xh-bg-subtle-opaque))
41
42
  );
42
43
  --xh-_toggle-fg-on-disabled: var(--xh-toggle-fg-on-disabled, var(--xh-_toggle-fg-on));
43
44
  --xh-action-bg-rest: var(--xh-toggle-bg, var(--xh-_action-variant-bg-rest));
@@ -113,7 +114,7 @@
113
114
  [data-scope='toggle'][data-part='root'][data-variant='solid'][data-state='on'] {
114
115
  --xh-action-bg-disabled: var(
115
116
  --xh-toggle-bg-on-disabled,
116
- color-mix(in oklab, var(--xh-_action-variant-bg-rest) 50%, var(--xh-bg-subtle))
117
+ color-mix(in oklab, var(--xh-_action-variant-bg-rest) 50%, var(--xh-bg-subtle-opaque))
117
118
  );
118
119
  --xh-action-fg-disabled: var(--xh-toggle-fg-on-disabled, var(--xh-_action-variant-fg-rest));
119
120
  --xh-action-highlight-rest: var(--xh-_highlight-tone);