@xihan-ui/styles 2.1.0 → 3.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 (152) hide show
  1. package/CHANGELOG.md +1227 -0
  2. package/README.md +6 -1
  3. package/component-tokens.d.ts +505 -96
  4. package/components.tokens.json +34636 -25846
  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 +55 -58
  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 +23 -0
  37. package/css/date-picker.css +57 -22
  38. package/css/date-range-picker.css +301 -12
  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 +16 -18
  49. package/css/file-upload.css +125 -135
  50. package/css/flex.css +324 -8
  51. package/css/float-button.css +165 -38
  52. package/css/floating-panel.css +53 -19
  53. package/css/form.css +23 -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 +429 -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 +158 -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 +44 -15
  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 +201 -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 +22997 -13678
  147. package/index.unlayered.css +12928 -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
@@ -143,6 +143,10 @@
143
143
  user-select: none;
144
144
  /* 触屏上连点两下不该被当成缩放手势 */
145
145
  touch-action: manipulation;
146
+ /* 反白随当前段换色:状态角色的 micro 淡变,与 TimeField 同一档;焦点环画在 control 上,不进过渡 */
147
+ transition:
148
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
149
+ color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
146
150
  }
147
151
 
148
152
  /* granularity 用不上的段带 hidden 留在文档里(不卸载作者节点)。
@@ -252,4 +256,23 @@
252
256
  white-space: nowrap;
253
257
  pointer-events: none;
254
258
  }
259
+
260
+ @media (forced-colors: active) {
261
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
262
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
263
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
264
+ 禁用取 GrayText */
265
+ [data-scope='date-field'][data-part='clear-trigger']:empty::before {
266
+ forced-color-adjust: none;
267
+ background-color: ButtonText;
268
+ }
269
+
270
+ [data-scope='date-field'][data-part='clear-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
271
+ background-color: HighlightText;
272
+ }
273
+
274
+ [data-scope='date-field'][data-part='clear-trigger'][data-disabled]:empty::before {
275
+ background-color: GrayText;
276
+ }
277
+ }
255
278
  }
@@ -73,6 +73,7 @@
73
73
  --xh-_date-picker-control-px: var(--xh-control-px-md);
74
74
  --xh-_date-picker-gap: var(--xh-control-gap-md);
75
75
  --xh-_date-picker-font-size: var(--xh-control-font-md);
76
+ --xh-_date-picker-item-py: var(--xh-list-option-py-md);
76
77
 
77
78
  /* 选中对号随语气走。没写 data-tone 时这几个 --xh-_tone* 没被声明,退回品牌色 */
78
79
  /* 内嵌日期段沿用日期输入的轻强调焦点:当前段是「当前项」,淡底 + 淡底前景,不另画一套实心选择态。 */
@@ -80,7 +81,8 @@
80
81
  --xh-_date-field-segment-fg: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
81
82
  /* 对号画在普通面上,取语气前景角色,不能拿确认按钮的实心背景色充当前景。 */
82
83
  --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);
84
+ /* 时间列与预设的对号与 Select 等列表的对号同一把尺:指示符档,随密度收放 */
85
+ --xh-_date-picker-time-item-check-size: var(--xh-control-indicator-size);
84
86
  }
85
87
 
86
88
  /* 与文本框、分段日期同一套堆叠:标签一行、输入行一行 */
@@ -107,6 +109,7 @@
107
109
  --xh-_date-picker-control-px: var(--xh-control-px-sm);
108
110
  --xh-_date-picker-gap: var(--xh-control-gap-sm);
109
111
  --xh-_date-picker-font-size: var(--xh-control-font-sm);
112
+ --xh-_date-picker-item-py: var(--xh-list-option-py-sm);
110
113
  }
111
114
 
112
115
  [data-scope='date-picker']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
@@ -115,10 +118,11 @@
115
118
  --xh-_date-picker-control-px: var(--xh-control-px-lg);
116
119
  --xh-_date-picker-gap: var(--xh-control-gap-lg);
117
120
  --xh-_date-picker-font-size: var(--xh-control-font-lg);
121
+ --xh-_date-picker-item-py: var(--xh-list-option-py-lg);
118
122
  }
119
123
 
120
124
  /* 375px 复合面板要同时容下日历与时/分两列;手机档用正式小指示符,平板起恢复16px。 */
121
- @media (width < 768px) {
125
+ @media not all and (min-width: 768px) {
122
126
  [data-scope='date-picker']:is([data-part='root'], [data-part='positioner']) {
123
127
  --xh-_date-picker-time-item-check-size: var(--xh-control-indicator-sm);
124
128
  }
@@ -291,7 +295,8 @@
291
295
  outline: none;
292
296
  }
293
297
 
294
- [data-scope='date-picker'][data-part='content'][data-state='open'] {
298
+ /* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
299
+ [data-scope='date-picker'][data-part='content'][data-state='open']:not([data-instant]) {
295
300
  animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
296
301
  }
297
302
 
@@ -344,7 +349,7 @@
344
349
  手机档两张月历折行堆叠,线画在块起始边 */
345
350
  [data-scope='date-picker'][data-part='calendar'] + [data-scope='date-picker'][data-part='calendar'] {
346
351
  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));
352
+ border-block-start: var(--xh-stroke-thin) solid var(--xh-date-picker-panel-divider, var(--xh-material-solid-separator));
348
353
  }
349
354
 
350
355
  /* 平板起两张月历并排放得下,线改画在行内起始边 */
@@ -353,7 +358,7 @@
353
358
  padding-block-start: 0;
354
359
  padding-inline-start: var(--xh-date-picker-panel-gap, var(--xh-space-3));
355
360
  border-block-start: none;
356
- border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-picker-panel-divider, var(--xh-material-frosted-separator));
361
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-picker-panel-divider, var(--xh-material-solid-separator));
357
362
  }
358
363
  }
359
364
 
@@ -393,7 +398,7 @@
393
398
  inset-block: 0;
394
399
  inset-inline-end: calc(-1 * var(--xh-stroke-thin));
395
400
  inline-size: var(--xh-stroke-thin);
396
- background: var(--xh-date-picker-column-divider, var(--xh-material-frosted-separator));
401
+ background: var(--xh-date-picker-column-divider, var(--xh-material-solid-separator));
397
402
  pointer-events: none;
398
403
  }
399
404
 
@@ -418,7 +423,7 @@
418
423
  overflow-y: hidden;
419
424
  /* 浮层滚动面:滚到头不把页面一起带走 */
420
425
  overscroll-behavior: contain;
421
- border-block-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-frosted-separator));
426
+ border-block-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-solid-separator));
422
427
  }
423
428
 
424
429
  /* 平板起:换成贴在日历行内起始一侧的竖列,滚动轴与分隔线一起转过来 */
@@ -428,7 +433,7 @@
428
433
  flex-direction: column;
429
434
  overflow: auto;
430
435
  border-block-end: none;
431
- border-inline-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-frosted-separator));
436
+ border-inline-end: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-solid-separator));
432
437
  }
433
438
  }
434
439
 
@@ -443,7 +448,7 @@
443
448
  --xh-collection-block-padding: var(--xh-date-picker-preset-py, var(--xh-space-1));
444
449
  --xh-collection-inline-padding: var(--xh-date-picker-preset-px, var(--xh-space-3));
445
450
  --xh-collection-font-size: var(--xh-text-secondary-size);
446
- --xh-collection-radius: var(--xh-date-picker-preset-radius, var(--xh-shape-control));
451
+ --xh-collection-radius: var(--xh-date-picker-preset-radius, var(--xh-shape-inset));
447
452
  /* 面板是实体面(floating),正文取页面前景 */
448
453
  --xh-collection-fg-rest: var(--xh-fg-default);
449
454
  --xh-collection-fg-hover: var(--xh-fg-default);
@@ -470,7 +475,7 @@
470
475
  /* 对号的末端轨始终留着,切换选中时文字与整列宽度都不移动。 */
471
476
  padding-inline-end: calc(
472
477
  var(--xh-date-picker-preset-px, var(--xh-space-3)) +
473
- var(--xh-date-picker-preset-check-size, var(--xh-glyph-size-sm)) +
478
+ var(--xh-date-picker-preset-check-size, var(--xh-control-indicator-size)) +
474
479
  var(--xh-space-1)
475
480
  );
476
481
  white-space: nowrap;
@@ -495,8 +500,8 @@
495
500
  position: absolute;
496
501
  inset-block-start: 50%;
497
502
  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));
503
+ inline-size: var(--xh-date-picker-preset-check-size, var(--xh-control-indicator-size));
504
+ block-size: var(--xh-date-picker-preset-check-size, var(--xh-control-indicator-size));
500
505
  translate: 0 -50%;
501
506
  background-color: var(--xh-date-picker-preset-check-fg, var(--xh-_date-picker-check-fg));
502
507
  opacity: 0;
@@ -523,10 +528,7 @@
523
528
  gap: var(--xh-date-picker-time-column-gap, 0);
524
529
  min-inline-size: var(--xh-date-picker-time-column-min-w, var(--xh-overlay-column-min-w));
525
530
  /* 几列并排:定高而不是随内容收,否则时列与分列的可选值一多一少就错位 */
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
- );
531
+ block-size: var(--xh-date-picker-time-column-h, var(--xh-overlay-calendar-column-h));
530
532
  margin-block-start: var(
531
533
  --xh-date-picker-time-column-offset,
532
534
  calc(var(--xh-control-h-sm) + var(--xh-date-picker-calendar-gap, var(--xh-space-2)))
@@ -537,7 +539,7 @@
537
539
  overflow-y: auto;
538
540
  /* 浮层滚动面:滚到头不把页面一起带走 */
539
541
  overscroll-behavior: contain;
540
- border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-frosted-separator));
542
+ border-inline-start: var(--xh-stroke-thin) solid var(--xh-date-picker-column-divider, var(--xh-material-solid-separator));
541
543
  }
542
544
 
543
545
  [data-scope='date-picker'][data-part='time-column'][hidden] {
@@ -554,10 +556,10 @@
554
556
  var(--xh-date-picker-time-item-px, var(--xh-space-0_5)),
555
557
  calc(var(--xh-date-picker-time-item-check-size, var(--xh-_date-picker-time-item-check-size)) + var(--xh-space-0_5))
556
558
  );
557
- --xh-collection-block-padding: var(--xh-date-picker-time-item-py, 0);
559
+ --xh-collection-block-padding: var(--xh-date-picker-time-item-py, var(--xh-_date-picker-item-py));
558
560
  --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));
561
+ --xh-collection-font-size: var(--xh-date-picker-time-item-font-size, var(--xh-_date-picker-font-size));
562
+ --xh-collection-radius: var(--xh-date-picker-time-item-radius, var(--xh-shape-inset));
561
563
  --xh-collection-fg-rest: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
562
564
  --xh-collection-fg-hover: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
563
565
  --xh-collection-fg-keyboard-highlight: var(--xh-date-picker-time-item-fg, var(--xh-material-frosted-fg));
@@ -584,8 +586,9 @@
584
586
  flex: none;
585
587
  align-items: center;
586
588
  justify-content: center;
587
- block-size: var(--xh-date-picker-time-item-h, calc(var(--xh-control-h-sm) - var(--xh-space-1)));
589
+ block-size: var(--xh-date-picker-time-item-h, auto);
588
590
  font-variant-numeric: tabular-nums;
591
+ line-height: var(--xh-leading-normal);
589
592
  text-align: center;
590
593
  white-space: nowrap;
591
594
  user-select: none;
@@ -628,7 +631,12 @@
628
631
  opacity: 1;
629
632
  }
630
633
 
631
- @media (width < 768px) {
634
+ /* 界外、被判为不可用的格走 aria-disabled,家族按它给禁用面;选中标记跟着降级 */
635
+ [data-scope='date-picker'][data-part='time-item'][data-disabled]::after {
636
+ background-color: var(--xh-fg-disabled);
637
+ }
638
+
639
+ @media not all and (min-width: 768px) {
632
640
  [data-scope='date-picker'][data-part='content'] {
633
641
  padding-inline: var(--xh-date-picker-content-px, var(--xh-space-2));
634
642
  }
@@ -733,16 +741,43 @@
733
741
  background-color: CanvasText;
734
742
  }
735
743
 
744
+ /* 按下与没被高亮时的悬停,家族把条目涂成 Highlight,对号跟着换 HighlightText */
745
+ [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,
746
+ [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 {
747
+ background-color: HighlightText;
748
+ }
749
+
736
750
  [data-scope='date-picker'][data-part='preset'][data-disabled]::after,
751
+ [data-scope='date-picker'][data-part='time-item'][data-disabled]::after,
737
752
  [data-scope='date-picker'][data-part='time-column'][aria-disabled='true'] [data-part='time-item']::after {
738
753
  background-color: GrayText;
739
754
  }
740
755
 
741
756
  [data-scope='date-picker'][data-part='preset'][data-disabled],
757
+ [data-scope='date-picker'][data-part='time-item'][data-disabled],
742
758
  [data-scope='date-picker'][data-part='time-column'][aria-disabled='true'] [data-part='time-item'] {
743
759
  color: GrayText;
744
760
  }
745
761
  }
762
+
763
+ @media (forced-colors: active) {
764
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
765
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
766
+ 按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
767
+ 禁用取 GrayText */
768
+ [data-scope='date-picker']:is([data-part='clear-trigger'], [data-part='trigger']):empty::before {
769
+ forced-color-adjust: none;
770
+ background-color: ButtonText;
771
+ }
772
+
773
+ [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 {
774
+ background-color: HighlightText;
775
+ }
776
+
777
+ [data-scope='date-picker']:is([data-part='clear-trigger'], [data-part='trigger'])[data-disabled]:empty::before {
778
+ background-color: GrayText;
779
+ }
780
+ }
746
781
  }
747
782
 
748
783
  @layer xihan.motion {