@xihan-ui/styles 1.0.0-alpha.1 → 1.0.0-alpha.2

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 (109) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/css/accordion.css +5 -0
  3. package/css/affix.css +5 -0
  4. package/css/alert.css +5 -0
  5. package/css/anchor.css +5 -0
  6. package/css/avatar-group.css +5 -0
  7. package/css/avatar.css +5 -0
  8. package/css/back-top.css +5 -0
  9. package/css/badge.css +5 -0
  10. package/css/breadcrumb.css +5 -0
  11. package/css/button-group.css +5 -0
  12. package/css/button.css +15 -0
  13. package/css/calendar.css +5 -0
  14. package/css/card.css +5 -0
  15. package/css/carousel.css +5 -0
  16. package/css/cascader.css +8 -3
  17. package/css/checkbox-group.css +5 -0
  18. package/css/checkbox.css +5 -0
  19. package/css/clipboard.css +5 -0
  20. package/css/code-block.css +5 -0
  21. package/css/collapsible.css +5 -0
  22. package/css/color-picker.css +6 -1
  23. package/css/combobox.css +19 -0
  24. package/css/composer.css +5 -0
  25. package/css/context-menu.css +6 -8
  26. package/css/countdown.css +5 -0
  27. package/css/date-field.css +5 -0
  28. package/css/date-picker.css +6 -1
  29. package/css/descriptions.css +5 -0
  30. package/css/dialog.css +69 -9
  31. package/css/drawer.css +30 -9
  32. package/css/dynamic-input.css +5 -0
  33. package/css/editable.css +5 -0
  34. package/css/ellipsis.css +5 -0
  35. package/css/empty-state.css +5 -0
  36. package/css/field.css +5 -0
  37. package/css/file-upload.css +5 -0
  38. package/css/flex.css +5 -0
  39. package/css/float-button.css +5 -0
  40. package/css/form.css +6 -1
  41. package/css/gradient-text.css +5 -0
  42. package/css/grid.css +5 -0
  43. package/css/highlight.css +5 -0
  44. package/css/hover-card.css +19 -6
  45. package/css/icon-wrapper.css +5 -0
  46. package/css/icon.css +5 -0
  47. package/css/image-viewer.css +31 -11
  48. package/css/image.css +5 -0
  49. package/css/infinite-scroll.css +5 -0
  50. package/css/layout.css +5 -0
  51. package/css/list.css +5 -0
  52. package/css/listbox.css +5 -0
  53. package/css/loading-bar.css +5 -0
  54. package/css/log.css +5 -0
  55. package/css/marquee.css +5 -0
  56. package/css/mention.css +19 -0
  57. package/css/menu.css +19 -0
  58. package/css/menubar.css +6 -8
  59. package/css/navigation-menu.css +6 -1
  60. package/css/number-animation.css +5 -0
  61. package/css/number-field.css +5 -0
  62. package/css/page-header.css +5 -0
  63. package/css/pagination.css +5 -0
  64. package/css/pin-input.css +5 -0
  65. package/css/popconfirm.css +28 -7
  66. package/css/popover.css +19 -0
  67. package/css/popselect.css +19 -0
  68. package/css/progress.css +5 -0
  69. package/css/qr-code.css +5 -0
  70. package/css/radio-group.css +5 -0
  71. package/css/rating.css +5 -0
  72. package/css/result.css +5 -0
  73. package/css/scroll-area.css +5 -6
  74. package/css/select.css +19 -0
  75. package/css/separator.css +5 -0
  76. package/css/side-nav.css +5 -0
  77. package/css/skeleton.css +5 -0
  78. package/css/slider.css +5 -0
  79. package/css/spinner.css +9 -1
  80. package/css/splitter.css +5 -0
  81. package/css/statistic.css +5 -0
  82. package/css/steps.css +5 -0
  83. package/css/switch.css +14 -7
  84. package/css/table.css +5 -0
  85. package/css/tabs.css +5 -0
  86. package/css/tags-input.css +5 -0
  87. package/css/text-field.css +5 -0
  88. package/css/thread.css +5 -0
  89. package/css/time-field.css +5 -0
  90. package/css/time-picker.css +6 -1
  91. package/css/time.css +5 -0
  92. package/css/timeline.css +5 -0
  93. package/css/toast.css +13 -12
  94. package/css/toaster.css +5 -0
  95. package/css/toggle-group.css +5 -0
  96. package/css/toggle.css +5 -0
  97. package/css/toolbar.css +5 -0
  98. package/css/tooltip.css +19 -6
  99. package/css/tour.css +29 -9
  100. package/css/transfer.css +5 -0
  101. package/css/tree-select.css +19 -0
  102. package/css/tree.css +5 -0
  103. package/css/typography.css +5 -0
  104. package/css/virtualizer.css +5 -0
  105. package/css/watermark.css +5 -0
  106. package/index.css +0 -1
  107. package/index.unlayered.css +804 -153
  108. package/package.json +2 -3
  109. package/css/motion.css +0 -58
package/css/result.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='result'] {
4
+ --xh-result-skin: 1;
5
+ }
6
+
2
7
  [data-scope='result'][data-part='root'] {
3
8
  /* 三个尺寸档只换这几个私有槽,图标与标题都从 root 继承它们,
4
9
  换档不必给每个部件各写一条选择器 */
@@ -11,15 +11,14 @@
11
11
  opacity: 1;
12
12
  }
13
13
  }
14
-
15
- @media (prefers-reduced-motion: reduce) {
16
- [data-scope='scroll-area'] [data-part] {
17
- animation-duration: 0.01ms !important;
18
- }
19
- }
20
14
  }
21
15
 
22
16
  @layer xihan.components {
17
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
18
+ [data-scope='scroll-area'] {
19
+ --xh-scroll-area-skin: 1;
20
+ }
21
+
23
22
  /* 定位分工:滑块在**主轴**上的起点与长度由连接层每帧写进内联样式——
24
23
  竖向是 inset-block-start / block-size,横向是 inset-inline-start / inline-size。
25
24
  这份皮肤一个都不碰:内联优先级高于样式表,写了不但是死声明,
package/css/select.css CHANGED
@@ -1,4 +1,23 @@
1
+ @layer xihan.motion {
2
+ /* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
3
+ 动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
4
+ @keyframes xh-fade-in {
5
+ from {
6
+ opacity: 0;
7
+ }
8
+
9
+ to {
10
+ opacity: 1;
11
+ }
12
+ }
13
+ }
14
+
1
15
  @layer xihan.components {
16
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
17
+ [data-scope='select'] {
18
+ --xh-select-skin: 1;
19
+ }
20
+
2
21
  [data-scope='select'][data-part='root'] {
3
22
  /* 尺寸档只换这五个私有槽,触发器、标题与条目都从 root 继承它们,
4
23
  换档不必给每个部件各写一条选择器。浮层在 positioner 里、也是 root 的后代,一并继承 */
package/css/separator.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='separator'] {
4
+ --xh-separator-skin: 1;
5
+ }
6
+
2
7
  [data-scope='separator'][data-part='root'] {
3
8
  border: 0;
4
9
  background: var(--xh-separator-color, var(--xh-border-default));
package/css/side-nav.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='side-nav'] {
4
+ --xh-side-nav-skin: 1;
5
+ }
6
+
2
7
  [data-scope='side-nav'][data-part='root'] {
3
8
  inline-size: var(--xh-side-nav-w, 240px);
4
9
  display: flex;
package/css/skeleton.css CHANGED
@@ -13,6 +13,11 @@
13
13
  }
14
14
 
15
15
  @layer xihan.components {
16
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
17
+ [data-scope='skeleton'] {
18
+ --xh-skeleton-skin: 1;
19
+ }
20
+
16
21
  /* 骨架容器:竖着码放各根骨架条 */
17
22
  [data-scope='skeleton'][data-part='root'] {
18
23
  display: flex;
package/css/slider.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='slider'] {
4
+ --xh-slider-skin: 1;
5
+ }
6
+
2
7
  /* 定位分工:已选区间与拇指在**主轴**上的起点与长度,由连接层每帧写进内联样式——
3
8
  水平是 inset-inline-start / inline-size,竖直是 inset-block-end / block-size。
4
9
  这份皮肤一个都不碰:内联优先级高于样式表,写了不但是死声明,
package/css/spinner.css CHANGED
@@ -1,4 +1,4 @@
1
- @layer xihan.components {
1
+ @layer xihan.motion {
2
2
  /* 转圈的关键帧定义在本文件里。皮肤可以按需单独引入,
3
3
  引用别处文件里的动画名时那份文件不一定在场,动画会静默地整个不跑 */
4
4
  @keyframes xh-spinner-rotate {
@@ -6,6 +6,14 @@
6
6
  transform: rotate(1turn);
7
7
  }
8
8
  }
9
+ }
10
+
11
+ @layer xihan.components {
12
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
13
+ [data-scope='spinner'] {
14
+ --xh-spinner-skin: 1;
15
+ }
16
+
9
17
 
10
18
  /* 圆环画在伪元素上,root 自身不转:转的只是图形,同一行里的文案要留在原地读得动 */
11
19
  [data-scope='spinner'][data-part='root'] {
package/css/splitter.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='splitter'] {
4
+ --xh-splitter-skin: 1;
5
+ }
6
+
2
7
  /* 分工:**面板在排布轴上的尺寸**由连接层每帧写进内联样式(flex-basis / flex-grow / flex-shrink)。
3
8
  这份皮肤一条都不碰——内联优先级高于样式表,写了不但是死声明,
4
9
  还会在切换 orientation 的那一帧跟连接层抢位置。皮肤只管排布方向、跨轴尺寸、
package/css/statistic.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='statistic'] {
4
+ --xh-statistic-skin: 1;
5
+ }
6
+
2
7
  /* 三个尺寸档只换这几个私有槽,各段从 root 继承它们,换档不必给每个部件各写一条选择器 */
3
8
  [data-scope='statistic'][data-part='root'] {
4
9
  --xh-_statistic-label-size: var(--xh-font-size-sm);
package/css/steps.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='steps'] {
4
+ --xh-steps-skin: 1;
5
+ }
6
+
2
7
  [data-scope='steps'][data-part='root'] {
3
8
  /* 尺寸档只换这三个私有槽,序号圆点、标题与说明都从 root 继承它们,
4
9
  换档不必给每个部件各写一条选择器 */
package/css/switch.css CHANGED
@@ -1,4 +1,18 @@
1
+ @layer xihan.motion {
2
+ /* 转圈的关键帧定义在本文件里:引用别处文件的动画名时那份文件不一定在场,动画会静默不跑 */
3
+ @keyframes xh-switch-rotate {
4
+ to {
5
+ transform: rotate(1turn);
6
+ }
7
+ }
8
+ }
9
+
1
10
  @layer xihan.components {
11
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
12
+ [data-scope='switch'] {
13
+ --xh-switch-skin: 1;
14
+ }
15
+
2
16
  [data-scope='switch'][data-part='root'] {
3
17
  /* 尺寸档只换轨道高度这一个私有槽,其余几何都从它算出来:
4
18
  滑块边长 = 轨道高 − 两条留白,轨道宽 = 两倍轨道高 − 两条留白,滑块行程因此正好等于自身边长 */
@@ -59,13 +73,6 @@
59
73
  translate: var(--xh-_switch-thumb-size) 0;
60
74
  }
61
75
 
62
- /* 转圈的关键帧定义在本文件里:引用别处文件的动画名时那份文件不一定在场,动画会静默不跑 */
63
- @keyframes xh-switch-rotate {
64
- to {
65
- transform: rotate(1turn);
66
- }
67
- }
68
-
69
76
  /* 提交中:指针挂起、滑块里转圈;不是禁用,焦点与对比度都保持 */
70
77
  [data-scope='switch'][data-part='root'][data-loading] {
71
78
  cursor: wait;
package/css/table.css CHANGED
@@ -18,6 +18,11 @@
18
18
  }
19
19
 
20
20
  @layer xihan.components {
21
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
22
+ [data-scope='table'] {
23
+ --xh-table-skin: 1;
24
+ }
25
+
21
26
  /* 表格自己滚动:吸顶表头与横向吸附列都要一个确定的滚动容器才钉得住 */
22
27
  [data-scope='table'][data-part='root'] {
23
28
  /* 密度档只换这两个私有槽:单元格与列标题从 root 继承前者,字号靠 font-size 本身继承下去,
package/css/tabs.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='tabs'] {
4
+ --xh-tabs-skin: 1;
5
+ }
6
+
2
7
  [data-scope='tabs'][data-part='root'] {
3
8
  /* 尺寸档只换这三个私有槽,标签从 root 继承它们,换档不必给每个部件各写一条选择器 */
4
9
  --xh-_tabs-trigger-h: var(--xh-control-h-md);
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='tags-input'] {
4
+ --xh-tags-input-skin: 1;
5
+ }
6
+
2
7
  /* root 只负责纵向堆叠:标题一行、控件一行。可见的那个"框"长在 control 上,
3
8
  因为标签、输入框、清空按钮都在它里面,边框必须把三者一起圈住 */
4
9
  [data-scope='tags-input'][data-part='root'] {
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='text-field'] {
4
+ --xh-text-field-skin: 1;
5
+ }
6
+
2
7
  /* root 只负责纵向堆叠:标签一行、输入行一行。
3
8
  输入框与清空按钮中间那层包裹是作者自己写的、不在角色表里,
4
9
  所以尺寸与间距一律长在各自的角色节点上,不去假设那层存在 */
package/css/thread.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='thread'] {
4
+ --xh-thread-skin: 1;
5
+ }
6
+
2
7
  /* 自建定位上下文,作为绝对定位的回到底部按钮的参照系;
3
8
  block-size: 100% 让高度由外部决定,使滚动发生在内部。 */
4
9
  [data-scope='thread'][data-part='root'] {
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='time-field'] {
4
+ --xh-time-field-skin: 1;
5
+ }
6
+
2
7
  /* 与文本框、数字框同一套堆叠:标签一行、控件一行 */
3
8
  [data-scope='time-field'][data-part='root'] {
4
9
  /* 尺寸档只换这四个私有槽,标题与控件都从 root 继承它们,换档不必给每个部件各写一条选择器 */
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='time-picker'] {
4
+ --xh-time-picker-skin: 1;
5
+ }
6
+
2
7
  /* 与文本框、时间输入同一套堆叠:标签一行、控件一行 */
3
8
  [data-scope='time-picker'][data-part='root'] {
4
9
  display: inline-flex;
@@ -346,7 +351,7 @@
346
351
  @keyframes xh-time-picker-panel-in {
347
352
  from {
348
353
  opacity: 0;
349
- translate: 0 calc(-1 * var(--xh-space-1));
354
+ translate: 0 calc(-1 * var(--xh-motion-distance-sm));
350
355
  }
351
356
 
352
357
  to {
package/css/time.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='time'] {
4
+ --xh-time-skin: 1;
5
+ }
6
+
2
7
  [data-scope='time'][data-part='root'] {
3
8
  color: var(--xh-time-fg, var(--xh-fg-default));
4
9
  /* 等宽数字:秒数跳动时后面的字符不会左右挪 */
package/css/timeline.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='timeline'] {
4
+ --xh-timeline-skin: 1;
5
+ }
6
+
2
7
  [data-scope='timeline'][data-part='root'] {
3
8
  /* 尺寸档只换这几个私有槽,条目、圆点与文字都从 root 继承它们,
4
9
  换档不必给每个部件各写一条选择器 */
package/css/toast.css CHANGED
@@ -7,37 +7,38 @@
7
7
  @keyframes xh-toast-in {
8
8
  from {
9
9
  opacity: 0;
10
- transform: translateY(8px) scale(0.98);
10
+ translate: 0 var(--xh-motion-distance-md);
11
+ scale: var(--xh-motion-scale-enter);
11
12
  }
12
13
 
13
14
  to {
14
15
  opacity: 1;
15
- transform: none;
16
+ translate: 0 0;
17
+ scale: 1;
16
18
  }
17
19
  }
18
20
 
19
21
  @keyframes xh-toast-out {
20
22
  from {
21
23
  opacity: 1;
22
- transform: none;
24
+ translate: 0 0;
25
+ scale: 1;
23
26
  }
24
27
 
25
28
  to {
26
29
  opacity: 0;
27
- transform: translateY(4px) scale(0.96);
28
- }
29
- }
30
-
31
- /* 通知是自己冒出来的,用户没按任何键:减弱动效的诉求在这里比别处更硬。
32
- !important 在低层里反而更强(重要声明的层序是反的),足以压住组件层的动画。 */
33
- @media (prefers-reduced-motion: reduce) {
34
- [data-scope='toast'][data-part] {
35
- animation-duration: 0.01ms !important;
30
+ translate: 0 var(--xh-motion-distance-sm);
31
+ scale: var(--xh-motion-scale-enter);
36
32
  }
37
33
  }
38
34
  }
39
35
 
40
36
  @layer xihan.components {
37
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
38
+ [data-scope='toast'] {
39
+ --xh-toast-skin: 1;
40
+ }
41
+
41
42
  [data-scope='toast'][data-part='root'] {
42
43
  display: flex;
43
44
  flex-direction: column;
package/css/toaster.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='toaster'] {
4
+ --xh-toaster-skin: 1;
5
+ }
6
+
2
7
  /* 地标容器不占布局:通知落在哪儿由九个 group 各自的 fixed 说了算,
3
8
  root 只是给读屏一个可跳转的落点。它若留下一个块盒,写在页面中段的用法
4
9
  (按钮和队列摆在一起)就会凭空多出一行空白。
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='toggle-group'] {
4
+ --xh-toggle-group-skin: 1;
5
+ }
6
+
2
7
  /* 分段控件:段与段之间不留缝,靠共边连成一体,所以 root 不设 gap。
3
8
  排布只能读 data-orientation——aria-orientation 在多选模式下连接层根本不输出(role=group 不收) */
4
9
  [data-scope='toggle-group'][data-part='root'] {
package/css/toggle.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='toggle'] {
4
+ --xh-toggle-skin: 1;
5
+ }
6
+
2
7
  [data-scope='toggle'][data-part='root'] {
3
8
  /* 私有槽位:组件令牌 → 语义令牌两级回退,变体只改这几个槽位 */
4
9
  --xh-_bg: var(--xh-toggle-bg, transparent);
package/css/toolbar.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='toolbar'] {
4
+ --xh-toolbar-skin: 1;
5
+ }
6
+
2
7
  /* 一条控件带:条目之间留固定间距,分隔线再把它们切成语义上的几段。
3
8
  排布只能读 data-orientation——它与 aria-orientation 同源,但样式不该去读 ARIA */
4
9
  [data-scope='toolbar'][data-part='root'] {
package/css/tooltip.css CHANGED
@@ -1,4 +1,23 @@
1
+ @layer xihan.motion {
2
+ /* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
3
+ 动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
4
+ @keyframes xh-fade-in {
5
+ from {
6
+ opacity: 0;
7
+ }
8
+
9
+ to {
10
+ opacity: 1;
11
+ }
12
+ }
13
+ }
14
+
1
15
  @layer xihan.components {
16
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
17
+ [data-scope='tooltip'] {
18
+ --xh-tooltip-skin: 1;
19
+ }
20
+
2
21
  [data-scope='tooltip'][data-part='trigger'] {
3
22
  display: inline-flex;
4
23
  align-items: center;
@@ -105,10 +124,4 @@
105
124
  inset-block-start: calc(var(--xh-_tooltip-arrow-y) - var(--xh-_tooltip-arrow-size) / 2);
106
125
  inset-inline-start: calc(var(--xh-_tooltip-arrow-size) / -2);
107
126
  }
108
-
109
- @media (prefers-reduced-motion: reduce) {
110
- [data-scope='tooltip'][data-part='content'] {
111
- animation-duration: 0.01ms !important;
112
- }
113
- }
114
127
  }
package/css/tour.css CHANGED
@@ -1,9 +1,31 @@
1
1
  @layer xihan.motion {
2
+ /* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
3
+ 动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
4
+ @keyframes xh-fade-in {
5
+ from {
6
+ opacity: 0;
7
+ }
8
+
9
+ to {
10
+ opacity: 1;
11
+ }
12
+ }
13
+
14
+ @keyframes xh-fade-out {
15
+ from {
16
+ opacity: 1;
17
+ }
18
+
19
+ to {
20
+ opacity: 0;
21
+ }
22
+ }
23
+
2
24
  /* 气泡贴着目标探出来:纯淡入分不清它是从哪个元素长出来的 */
3
25
  @keyframes xh-tour-content-in {
4
26
  from {
5
27
  opacity: 0;
6
- translate: 0 4px;
28
+ translate: 0 var(--xh-motion-distance-sm);
7
29
  }
8
30
 
9
31
  to {
@@ -16,7 +38,7 @@
16
38
  @keyframes xh-tour-spotlight-in {
17
39
  from {
18
40
  opacity: 0;
19
- scale: 1.04;
41
+ scale: calc(2 - var(--xh-motion-scale-enter));
20
42
  }
21
43
 
22
44
  to {
@@ -24,16 +46,14 @@
24
46
  scale: 1;
25
47
  }
26
48
  }
27
-
28
- @media (prefers-reduced-motion: reduce) {
29
- [data-scope='tour'] [data-part] {
30
- animation-duration: 0.01ms !important;
31
- transition-duration: 0.01ms !important;
32
- }
33
- }
34
49
  }
35
50
 
36
51
  @layer xihan.components {
52
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
53
+ [data-scope='tour'] {
54
+ --xh-tour-skin: 1;
55
+ }
56
+
37
57
  /* 根节点只是几个浮层的归属容器,不参与排版。
38
58
  这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
39
59
  [data-scope='tour'][data-part='root'] {
package/css/transfer.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='transfer'] {
4
+ --xh-transfer-skin: 1;
5
+ }
6
+
2
7
  /* 三栏栅格:两侧面板各占一栏、跨两行,中间那栏上下各放一个搬运按钮,
3
8
  两个按钮在中线处相遇。栅格的列号本身就是随书写方向走的(第 1 栏永远在行首侧),
4
9
  dir=rtl 时整块自动镜像,不必另写一套。
@@ -1,4 +1,23 @@
1
+ @layer xihan.motion {
2
+ /* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
3
+ 动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
4
+ @keyframes xh-fade-in {
5
+ from {
6
+ opacity: 0;
7
+ }
8
+
9
+ to {
10
+ opacity: 1;
11
+ }
12
+ }
13
+ }
14
+
1
15
  @layer xihan.components {
16
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
17
+ [data-scope='tree-select'] {
18
+ --xh-tree-select-skin: 1;
19
+ }
20
+
2
21
  /* 解剖里没有把「触发器 + 清空按钮」裹在一起的 control 部件,一行是靠 flex-wrap 分出来的:
3
22
  标签占满整行把后面的挤到下一行,触发器与清空按钮就并排落在同一行上。
4
23
  这样作者少写标签、少写清空按钮,剩下的部件也不会塌 */
package/css/tree.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='tree'] {
4
+ --xh-tree-skin: 1;
5
+ }
6
+
2
7
  [data-scope='tree'][data-part='root'] {
3
8
  display: flex;
4
9
  flex-direction: column;
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='typography'] {
4
+ --xh-typography-skin: 1;
5
+ }
6
+
2
7
  [data-scope='typography'][data-part='root'] {
3
8
  /* 尺寸档只换这几个私有槽,各段从根上继承它们,换档不必给每个部件各写一条选择器 */
4
9
  --xh-_typography-body-size: var(--xh-text-body-size);
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='virtualizer'] {
4
+ --xh-virtualizer-skin: 1;
5
+ }
6
+
2
7
  /* 定位分工:条目在**主轴**上的位移、以及 content 在主轴上的总长,
3
8
  由连接层每帧写进内联样式(竖向是 inset-block-start / block-size,横向是
4
9
  inset-inline-start / inline-size)。这份皮肤一个都不碰:内联优先级高于样式表,
package/css/watermark.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='watermark'] {
4
+ --xh-watermark-skin: 1;
5
+ }
6
+
2
7
  /*
3
8
  * 盖水印的那块地。层叠上下文就地隔离,印子只压在这块地里,不会盖到组件外面去。
4
9
  */
package/index.css CHANGED
@@ -32,7 +32,6 @@
32
32
  @import './css/popselect.css';
33
33
  @import './css/qr-code.css';
34
34
  @import './css/reset.css';
35
- @import './css/motion.css';
36
35
  @import './css/result.css';
37
36
  @import './css/statistic.css';
38
37
  @import './css/time.css';