@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
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='dynamic-input'] {
4
+ --xh-dynamic-input-skin: 1;
5
+ }
6
+
2
7
  /* 一行一条,纵向堆叠;新增把手跟在最后一行下面 */
3
8
  [data-scope='dynamic-input'][data-part='root'] {
4
9
  display: flex;
package/css/editable.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='editable'] {
4
+ --xh-editable-skin: 1;
5
+ }
6
+
2
7
  /* 就地编辑是"一行文字里的一处可改内容":标题、显示区与按钮天然同行,
3
8
  所以根是一条横向的行,而不是文本框那种"标题一行、控件一行"的竖排。
4
9
  要竖排的作者把 flex-direction 覆盖掉即可,其余尺寸都长在各自的角色节点上 */
package/css/ellipsis.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='ellipsis'] {
4
+ --xh-ellipsis-skin: 1;
5
+ }
6
+
2
7
  /* 单行:一行装不下就收成省略号。
3
8
  行数由连接层写进这个盒子的内联 style,样式表这一行只是它缺席时的落点 */
4
9
  [data-scope='ellipsis'][data-part='root'] {
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='empty-state'] {
4
+ --xh-empty-state-skin: 1;
5
+ }
6
+
2
7
  [data-scope='empty-state'][data-part='root'] {
3
8
  /* 三个尺寸档只换这几个私有槽,图标与标题都从 root 继承它们,
4
9
  换档不必给每个部件各写一条选择器 */
package/css/field.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='field'] {
4
+ --xh-field-skin: 1;
5
+ }
6
+
2
7
  [data-scope='field'][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='file-upload'] {
4
+ --xh-file-upload-skin: 1;
5
+ }
6
+
2
7
  [data-scope='file-upload'][data-part='root'] {
3
8
  display: flex;
4
9
  flex-direction: column;
package/css/flex.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='flex'] {
4
+ --xh-flex-skin: 1;
5
+ }
6
+
2
7
  [data-scope='flex'][data-part='root'] {
3
8
  display: flex;
4
9
  flex-wrap: nowrap;
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='float-button'] {
4
+ --xh-float-button-skin: 1;
5
+ }
6
+
2
7
  /* 定位壳:钉在视口一角。贴边距离由连接层写进这个盒子的内联 style,
3
8
  样式表这一行只是它缺席时的落点;贴的是哪两条边看 data-placement。
4
9
  另一件必须提防的事:fixed 认的是视口,祖先上一旦出现
package/css/form.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='form'] {
4
+ --xh-form-skin: 1;
5
+ }
6
+
2
7
  /* 表单是一列字段:竖排、字段之间留一档间距。root 就是那个原生 <form> */
3
8
  [data-scope='form'][data-part='root'] {
4
9
  display: flex;
@@ -186,7 +191,7 @@
186
191
  @keyframes xh-form-summary-enter {
187
192
  from {
188
193
  opacity: 0;
189
- translate: 0 calc(-1 * var(--xh-space-1));
194
+ translate: 0 calc(-1 * var(--xh-motion-distance-sm));
190
195
  }
191
196
 
192
197
  to {
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='gradient-text'] {
4
+ --xh-gradient-text-skin: 1;
5
+ }
6
+
2
7
  /* 渐变画在背景上,再用 background-clip 把背景裁进字形里;前景必须透明才透得出底下的渐变。
3
8
  两条 background-clip 都写:WebKit 只认带前缀那条。
4
9
  -webkit-text-fill-color 在 WebKit 里决定字形填充色并盖过 color,也要一并透明。 */
package/css/grid.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='grid'] {
4
+ --xh-grid-skin: 1;
5
+ }
6
+
2
7
  [data-scope='grid'][data-part='root'] {
3
8
  display: grid;
4
9
  /* 各列等宽;下限写 0 而不是 auto,一段长文本才不会把自己那列撑宽 */
package/css/highlight.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='highlight'] {
4
+ --xh-highlight-skin: 1;
5
+ }
6
+
2
7
  /* 文本按原样显示:命中位置是按原串逐字符算的,折叠掉连续空格与换行会让看到的
3
8
  与算出来的对不上。pre-wrap 保留空白但仍在容器边界换行 */
4
9
  [data-scope='highlight'][data-part='root'] {
@@ -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='hover-card'] {
18
+ --xh-hover-card-skin: 1;
19
+ }
20
+
2
21
  /* 根节点只把 trigger 与浮层收在一处,不参与定位(坐标系仍由祖先的定位上下文决定) */
3
22
  [data-scope='hover-card'][data-part='root'] {
4
23
  display: inline-block;
@@ -141,10 +160,4 @@
141
160
  border-block-end: 0;
142
161
  border-inline-start: 0;
143
162
  }
144
-
145
- @media (prefers-reduced-motion: reduce) {
146
- [data-scope='hover-card'][data-part='content'] {
147
- animation-duration: 0.01ms !important;
148
- }
149
- }
150
163
  }
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='icon-wrapper'] {
4
+ --xh-icon-wrapper-skin: 1;
5
+ }
6
+
2
7
  /* 定直径的图标底座:图元在正中,底色、描边与形状由三轴决定。
3
8
  直径与图元直径分两个槽位,底座换档时里面的图元跟着一起换 */
4
9
  [data-scope='icon-wrapper'][data-part='root'] {
package/css/icon.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='icon'] {
4
+ --xh-icon-skin: 1;
5
+ }
6
+
2
7
  /*
3
8
  * 根 <svg>。直径、描边粗细、行内位置都由这里给,记录只带几何。
4
9
  * 不写 fill / stroke:记录里那两条呈现属性取 currentColor,改这里会把
@@ -1,4 +1,33 @@
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
+ }
24
+
1
25
  @layer xihan.components {
26
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
27
+ [data-scope='image-viewer'] {
28
+ --xh-image-viewer-skin: 1;
29
+ }
30
+
2
31
  [data-scope='image-viewer'][data-part='backdrop'] {
3
32
  position: fixed;
4
33
  inset: 0;
@@ -12,7 +41,7 @@
12
41
  }
13
42
 
14
43
  [data-scope='image-viewer'][data-part='backdrop'][data-state='closed'] {
15
- animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit);
44
+ animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
16
45
  }
17
46
 
18
47
  [data-scope='image-viewer'][data-part='positioner'] {
@@ -41,11 +70,7 @@
41
70
  }
42
71
 
43
72
  [data-scope='image-viewer'][data-part='content'][data-state='closed'] {
44
- animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit);
45
- }
46
-
47
- [data-scope='image-viewer'][data-part='content'][hidden] {
48
- display: none;
73
+ animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
49
74
  }
50
75
 
51
76
  [data-scope='image-viewer'][data-part='viewport'] {
@@ -164,11 +189,6 @@
164
189
  }
165
190
 
166
191
  @media (prefers-reduced-motion: reduce) {
167
- [data-scope='image-viewer'][data-part='backdrop'],
168
- [data-scope='image-viewer'][data-part='content'] {
169
- animation-duration: 0.01ms;
170
- }
171
-
172
192
  [data-scope='image-viewer'][data-part='image'] {
173
193
  transition: none;
174
194
  }
package/css/image.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='image'] {
4
+ --xh-image-skin: 1;
5
+ }
6
+
2
7
  /* 尺寸交给三个变量而不是写死:这个组件既要能当封面图,也要能当头图与缩略图。
3
8
  给了 --xh-image-ratio 才有确定高度,回退内容与图片在同一个盒子里换人时不会跳。 */
4
9
  [data-scope='image'][data-part='root'] {
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='infinite-scroll'] {
4
+ --xh-infinite-scroll-skin: 1;
5
+ }
6
+
2
7
  /*
3
8
  * 列表外壳这一层刻意不给盒模型:滚的是页面还是作者自己的 overflow 容器、列表长什么样,
4
9
  * 都归作者的布局管,组件只往它身上挂 data-state / data-loading / data-disabled 供作者取用。
package/css/layout.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='layout'] {
4
+ --xh-layout-skin: 1;
5
+ }
6
+
2
7
  /* 页面骨架排成三行两列:头与脚各横贯一整行,侧栏与内容并排占中间那一行。
3
8
  缺哪一段,对应的行/列就没有条目,宽高自动收成 0,不必为"少写一段"另立规则。
4
9
 
package/css/list.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='list'] {
4
+ --xh-list-skin: 1;
5
+ }
6
+
2
7
  [data-scope='list'][data-part='root'] {
3
8
  /* 一个尺寸档只换这几个私有槽,条目与两行文字都从根上继承它们,
4
9
  换档不必给每个部件各写一条选择器 */
package/css/listbox.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='listbox'] {
4
+ --xh-listbox-skin: 1;
5
+ }
6
+
2
7
  [data-scope='listbox'][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='loading-bar'] {
4
+ --xh-loading-bar-skin: 1;
5
+ }
6
+
2
7
  /*
3
8
  * 贴在视口顶边的一条细带。厚度那条轴(block-size)由连接层写进内联样式——
4
9
  * height 这个 prop 的缺省值在 connect 里收口,这里再声明一次只会被内联盖掉,
package/css/log.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='log'] {
4
+ --xh-log-skin: 1;
5
+ }
6
+
2
7
  /* 行高是本组件的定尺基准:视口按行数定高、每行排版,都从这一个槽位来。
3
8
  它的兜底值须与连接层内联高度里用的那份逐字一致,否则 rows 算出来的高度对不上行。 */
4
9
  [data-scope='log'][data-part='root'] {
package/css/marquee.css CHANGED
@@ -25,6 +25,11 @@
25
25
  }
26
26
 
27
27
  @layer xihan.components {
28
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
29
+ [data-scope='marquee'] {
30
+ --xh-marquee-skin: 1;
31
+ }
32
+
28
33
  /*
29
34
  * 窗口:只露出轨道的一段。
30
35
  *
package/css/mention.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='mention'] {
18
+ --xh-mention-skin: 1;
19
+ }
20
+
2
21
  [data-scope='mention'][data-part='root'] {
3
22
  /* 尺寸档只换这四个私有槽,输入框与候选都从 root 继承它们,换档不必给每个部件各写一条选择器。
4
23
  浮层在 positioner 里、也是 root 的后代,一并继承 */
package/css/menu.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='menu'] {
18
+ --xh-menu-skin: 1;
19
+ }
20
+
2
21
  /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
3
22
  [data-scope='menu'][data-part='positioner'] {
4
23
  position: fixed;
package/css/menubar.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='menubar'] {
4
+ --xh-menubar-skin: 1;
5
+ }
6
+
2
7
  /* 一排 trigger。主轴跟着 data-orientation 走:菜单栏本身可以横排也可以竖排 */
3
8
  [data-scope='menubar'][data-part='root'] {
4
9
  /* 尺寸档只换这五个私有槽,trigger 与菜单里的条目都从 root 继承它们,
@@ -155,13 +160,6 @@
155
160
  animation: xh-menubar-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
156
161
  }
157
162
 
158
- /* 关掉动效的用户不该被涨开动画晃一下;这里只管本组件,公共那份不动 */
159
- @media (prefers-reduced-motion: reduce) {
160
- [data-scope='menubar'][data-part='content'][data-state='open'] {
161
- animation-duration: 0.01ms;
162
- }
163
- }
164
-
165
163
  [data-scope='menubar'][data-part='group'] {
166
164
  display: flex;
167
165
  flex-direction: column;
@@ -271,7 +269,7 @@
271
269
  @keyframes xh-menubar-in {
272
270
  from {
273
271
  opacity: 0;
274
- scale: 0.96;
272
+ scale: var(--xh-motion-scale-enter);
275
273
  }
276
274
 
277
275
  to {
@@ -3,7 +3,7 @@
3
3
  @keyframes xh-navigation-menu-in {
4
4
  from {
5
5
  opacity: 0;
6
- translate: 0 -4px;
6
+ translate: 0 calc(-1 * var(--xh-motion-distance-sm));
7
7
  }
8
8
 
9
9
  to {
@@ -14,6 +14,11 @@
14
14
  }
15
15
 
16
16
  @layer xihan.components {
17
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
18
+ [data-scope='navigation-menu'] {
19
+ --xh-navigation-menu-skin: 1;
20
+ }
21
+
17
22
  /* 根节点是 nav 地标,不参与排版;给 relative 是为了让共享外壳(viewport)有个定位参照系。
18
23
  这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
19
24
  [data-scope='navigation-menu'][data-part='root'] {
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='number-animation'] {
4
+ --xh-number-animation-skin: 1;
5
+ }
6
+
2
7
  [data-scope='number-animation'][data-part='root'] {
3
8
  /* 不写尺寸就跟着上下文的字号走:这个数常常摆在别人的标题、卡片标题或统计数值槽里,
4
9
  自带一个字号只会跟摆放它的地方打架。三个档位各自换掉这个私有槽 */
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='number-field'] {
4
+ --xh-number-field-skin: 1;
5
+ }
6
+
2
7
  /* 与文本框同一套堆叠:标签一行、输入行一行。
3
8
  加减钮与输入框中间那层包裹归作者,这里不碰,三者各自把高度对齐即可成一体 */
4
9
  [data-scope='number-field'][data-part='root'] {
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='page-header'] {
4
+ --xh-page-header-skin: 1;
5
+ }
6
+
2
7
  [data-scope='page-header'][data-part='root'] {
3
8
  /* 尺寸档只换这三个私有槽,各段从根上继承它们,换档不必给每个部件各写一条选择器 */
4
9
  --xh-_page-header-py: var(--xh-space-4);
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='pagination'] {
4
+ --xh-pagination-skin: 1;
5
+ }
6
+
2
7
  /* 根节点是 nav 地标,只负责把上一页 / 页码 / 下一页排成一行。
3
8
  页数为 0 时连接层会打 data-empty,这里不拿它做隐藏:作者常把「第 x-y 条」这类
4
9
  区间回显也写在 nav 里,整块藏掉会连那行字一起吞了,是否隐藏交给作者决定 */
package/css/pin-input.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='pin-input'] {
4
+ --xh-pin-input-skin: 1;
5
+ }
6
+
2
7
  /* 与文本框、数字框同一套堆叠:标签一行、格子一行 */
3
8
  [data-scope='pin-input'][data-part='root'] {
4
9
  /* 尺寸档只换这四个私有槽,标题与格子都从 root 继承它们,换档不必给每个部件各写一条选择器 */
@@ -1,4 +1,32 @@
1
+ @layer xihan.motion {
2
+ /* 转圈的关键帧定义在本文件里:引用别处文件的动画名时那份文件不一定在场,动画会静默不跑 */
3
+ @keyframes xh-popconfirm-rotate {
4
+ to {
5
+ transform: rotate(1turn);
6
+ }
7
+ }
8
+ }
9
+
10
+ @layer xihan.motion {
11
+ /* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
12
+ 动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
13
+ @keyframes xh-fade-in {
14
+ from {
15
+ opacity: 0;
16
+ }
17
+
18
+ to {
19
+ opacity: 1;
20
+ }
21
+ }
22
+ }
23
+
1
24
  @layer xihan.components {
25
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
26
+ [data-scope='popconfirm'] {
27
+ --xh-popconfirm-skin: 1;
28
+ }
29
+
2
30
  /* 根只框住触发器:浮层树靠 positioner 的固定定位飞出去,不占根的盒子 */
3
31
  [data-scope='popconfirm'][data-part='root'] {
4
32
  display: inline-block;
@@ -120,13 +148,6 @@
120
148
  color: var(--xh-popconfirm-confirm-fg, var(--xh-_tone-on, var(--xh-fg-on-brand)));
121
149
  }
122
150
 
123
- /* 转圈的关键帧定义在本文件里:引用别处文件的动画名时那份文件不一定在场,动画会静默不跑 */
124
- @keyframes xh-popconfirm-rotate {
125
- to {
126
- transform: rotate(1turn);
127
- }
128
- }
129
-
130
151
  /* 异步确认挂起:按钮转圈、指针挂起;不是禁用,焦点与对比度都保持 */
131
152
  [data-scope='popconfirm'][data-part='confirm-trigger'][data-loading] {
132
153
  cursor: wait;
package/css/popover.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='popover'] {
18
+ --xh-popover-skin: 1;
19
+ }
20
+
2
21
  /* 坐标由定位引擎写进 style(inset-inline-start / inset-block-start),这里只定位模式与层级 */
3
22
  [data-scope='popover'][data-part='positioner'] {
4
23
  position: fixed;
package/css/popselect.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='popselect'] {
18
+ --xh-popselect-skin: 1;
19
+ }
20
+
2
21
  [data-scope='popselect'][data-part='root'] {
3
22
  /* 尺寸档只换这四个私有槽,触发器与条目都从 root 继承它们,换档不必给每个部件各写一条选择器。
4
23
  浮层在 positioner 里、也是 root 的后代,一并继承 */
package/css/progress.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='progress'] {
4
+ --xh-progress-skin: 1;
5
+ }
6
+
2
7
  /* 私有槽位:组件令牌 → 中档字面量两级回退。厚度写在 root 上而不是 track 上,
3
8
  尺寸档才改得动一处就够,track 靠继承拿到值。 */
4
9
  [data-scope='progress'][data-part='root'] {
package/css/qr-code.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='qr-code'] {
4
+ --xh-qr-code-skin: 1;
5
+ }
6
+
2
7
  /*
3
8
  * 根 <svg>。深浅两色取固定档而不是语义前景/背景:语义色跟着主题走,深色主题下整张码
4
9
  * 会翻成浅底深模块的反相图,一部分读码器不认反相码。要换配色改下面这三个覆盖槽。
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='radio-group'] {
4
+ --xh-radio-group-skin: 1;
5
+ }
6
+
2
7
  [data-scope='radio-group'][data-part='root'] {
3
8
  /* 尺寸档只换这两个私有槽,标题与条目都从 root 继承它们,换档不必给每个部件各写一条选择器 */
4
9
  --xh-_radio-group-item-gap: var(--xh-control-gap-md);
package/css/rating.css CHANGED
@@ -1,4 +1,9 @@
1
1
  @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='rating'] {
4
+ --xh-rating-skin: 1;
5
+ }
6
+
2
7
  /* position 是给表单影子做定位基准的:那份输入被连接层内联写成绝对定位,
3
8
  根上不留基准它就会贴到更外层的定位祖先上,原生校验提示跟着飘到页面别处。 */
4
9
  [data-scope='rating'][data-part='root'] {