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

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 (129) hide show
  1. package/CHANGELOG.md +527 -0
  2. package/README.md +1 -1
  3. package/css/accordion.css +61 -5
  4. package/css/affix.css +5 -0
  5. package/css/alert.css +35 -5
  6. package/css/anchor.css +12 -7
  7. package/css/avatar-group.css +8 -3
  8. package/css/avatar.css +8 -3
  9. package/css/back-top.css +21 -1
  10. package/css/badge.css +21 -2
  11. package/css/breadcrumb.css +29 -4
  12. package/css/button-group.css +19 -13
  13. package/css/button.css +57 -11
  14. package/css/calendar.css +124 -2
  15. package/css/card.css +10 -5
  16. package/css/carousel.css +41 -5
  17. package/css/cascader.css +188 -102
  18. package/css/checkbox-group.css +46 -19
  19. package/css/checkbox.css +59 -8
  20. package/css/clipboard.css +7 -1
  21. package/css/code-block.css +17 -7
  22. package/css/collapsible.css +47 -2
  23. package/css/color-picker.css +117 -46
  24. package/css/combobox.css +132 -52
  25. package/css/composer.css +10 -3
  26. package/css/context-menu.css +101 -75
  27. package/css/countdown.css +5 -0
  28. package/css/date-field.css +96 -14
  29. package/css/date-picker.css +281 -65
  30. package/css/descriptions.css +7 -2
  31. package/css/dialog.css +109 -22
  32. package/css/download-trigger.css +76 -0
  33. package/css/drawer.css +75 -23
  34. package/css/dynamic-input.css +73 -17
  35. package/css/editable.css +17 -10
  36. package/css/ellipsis.css +6 -1
  37. package/css/empty-state.css +12 -7
  38. package/css/field.css +14 -6
  39. package/css/fieldset.css +69 -0
  40. package/css/file-upload.css +50 -7
  41. package/css/flex.css +5 -0
  42. package/css/float-button.css +21 -1
  43. package/css/floating-panel.css +310 -0
  44. package/css/form.css +10 -5
  45. package/css/gradient-text.css +5 -0
  46. package/css/grid.css +5 -0
  47. package/css/heatmap.css +410 -0
  48. package/css/highlight.css +6 -1
  49. package/css/hotkeys.css +90 -0
  50. package/css/hover-card.css +58 -50
  51. package/css/icon-wrapper.css +5 -0
  52. package/css/icon.css +5 -0
  53. package/css/image-cropper.css +231 -0
  54. package/css/image-viewer.css +167 -22
  55. package/css/image.css +7 -2
  56. package/css/infinite-scroll.css +6 -1
  57. package/css/json-viewer.css +241 -0
  58. package/css/layout.css +11 -10
  59. package/css/list.css +13 -8
  60. package/css/listbox.css +25 -4
  61. package/css/loading-bar.css +12 -1
  62. package/css/log.css +6 -1
  63. package/css/marquee.css +14 -0
  64. package/css/masonry.css +63 -0
  65. package/css/mention.css +105 -32
  66. package/css/menu.css +131 -46
  67. package/css/menubar.css +150 -66
  68. package/css/navigation-menu.css +59 -29
  69. package/css/number-animation.css +8 -3
  70. package/css/number-field.css +178 -16
  71. package/css/overlay-arrow.css +51 -0
  72. package/css/page-header.css +10 -5
  73. package/css/pagination.css +18 -13
  74. package/css/password-input.css +356 -0
  75. package/css/pin-input.css +18 -10
  76. package/css/popconfirm.css +73 -16
  77. package/css/popover.css +88 -44
  78. package/css/popselect.css +201 -52
  79. package/css/progress.css +52 -7
  80. package/css/qr-code.css +6 -1
  81. package/css/radio-group.css +19 -8
  82. package/css/rating.css +7 -2
  83. package/css/reset.css +17 -0
  84. package/css/result.css +11 -6
  85. package/css/scroll-area.css +65 -94
  86. package/css/scrollbar.css +167 -0
  87. package/css/segmented.css +215 -0
  88. package/css/select.css +292 -124
  89. package/css/separator.css +7 -2
  90. package/css/side-nav.css +116 -19
  91. package/css/signature-pad.css +144 -0
  92. package/css/skeleton.css +12 -1
  93. package/css/slider.css +15 -10
  94. package/css/space.css +117 -0
  95. package/css/spinner.css +31 -11
  96. package/css/splitter.css +5 -0
  97. package/css/statistic.css +14 -9
  98. package/css/steps.css +30 -8
  99. package/css/switch.css +62 -13
  100. package/css/table.css +136 -37
  101. package/css/tabs.css +9 -4
  102. package/css/tag.css +177 -0
  103. package/css/tags-input.css +83 -40
  104. package/css/text-field.css +154 -36
  105. package/css/thread.css +6 -1
  106. package/css/time-field.css +102 -16
  107. package/css/time-picker.css +264 -69
  108. package/css/time.css +5 -0
  109. package/css/timeline.css +15 -10
  110. package/css/timer.css +119 -0
  111. package/css/toast.css +46 -21
  112. package/css/toaster.css +6 -1
  113. package/css/toggle-group.css +5 -0
  114. package/css/toggle.css +11 -6
  115. package/css/tone.css +10 -5
  116. package/css/toolbar.css +6 -1
  117. package/css/tooltip.css +54 -38
  118. package/css/tour.css +128 -63
  119. package/css/transfer.css +73 -17
  120. package/css/tree-select.css +203 -83
  121. package/css/tree.css +90 -1
  122. package/css/typography.css +9 -4
  123. package/css/undefined.css +11 -1
  124. package/css/virtualizer.css +8 -1
  125. package/css/watermark.css +6 -2
  126. package/index.css +17 -1
  127. package/index.unlayered.css +9394 -2883
  128. package/package.json +19 -4
  129. package/css/motion.css +0 -58
package/css/tag.css ADDED
@@ -0,0 +1,177 @@
1
+ @layer xihan.components {
2
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
+ [data-scope='tag'] {
4
+ --xh-tag-skin: 1;
5
+ }
6
+
7
+ /* 缺省态:md 档、无语气。三轴规则只在它之上叠加,不改这一条 */
8
+ [data-scope='tag'][data-part='root'] {
9
+ /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
10
+ --xh-icon-size: var(--xh-tag-icon-size, var(--xh-glyph-size-text));
11
+
12
+ /* 尺寸档只换这四个私有槽,下面的声明从它们取值 */
13
+ --xh-_tag-gap: var(--xh-space-1);
14
+ --xh-_tag-px: var(--xh-space-2);
15
+ --xh-_tag-py: var(--xh-space-0_5);
16
+ --xh-_tag-font-size: var(--xh-text-caption-size);
17
+
18
+ display: inline-flex;
19
+ align-items: center;
20
+ /* 一行放不下时标签自己截断,而不是把整行撑破 */
21
+ max-inline-size: 100%;
22
+ gap: var(--xh-tag-gap, var(--xh-_tag-gap));
23
+ padding-inline: var(--xh-tag-px, var(--xh-_tag-px));
24
+ padding-block: var(--xh-tag-py, var(--xh-_tag-py));
25
+ border: var(--xh-stroke-thin) solid transparent;
26
+ border-radius: var(--xh-tag-radius, var(--xh-shape-control));
27
+ background: var(--xh-tag-bg, var(--xh-bg-subtle));
28
+ color: var(--xh-tag-fg, var(--xh-fg-default));
29
+ font-size: var(--xh-tag-font-size, var(--xh-_tag-font-size));
30
+ font-weight: var(--xh-tag-font-weight, var(--xh-font-weight-medium));
31
+ line-height: var(--xh-leading-none);
32
+ /* 随文排时与正文基线对齐 */
33
+ vertical-align: middle;
34
+ }
35
+
36
+ /* 收起态连接层给的是 hidden 属性,而上面声明了 display——
37
+ 漏掉这条,摘掉的标签还会一直摊在页面上 */
38
+ [data-scope='tag'][data-part='root'][hidden] {
39
+ display: none;
40
+ }
41
+
42
+ /* 文字过长时截断,关闭钮才始终留在标签里 */
43
+ [data-scope='tag'][data-part='label'] {
44
+ overflow: hidden;
45
+ min-inline-size: 0;
46
+ text-overflow: ellipsis;
47
+ white-space: nowrap;
48
+ }
49
+
50
+ [data-scope='tag'][data-part='close-trigger'] {
51
+ display: inline-flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ flex: none;
55
+ /* 命中区取标签内移除钮的指示符尺寸,不随标签档位缩小 */
56
+ block-size: var(--xh-tag-close-size, var(--xh-control-indicator-size));
57
+ inline-size: var(--xh-tag-close-size, var(--xh-control-indicator-size));
58
+ /* 命中区比字形大一圈,往内收一格才不会在标签右缘留出一块空白 */
59
+ margin-inline-end: calc(-1 * var(--xh-space-1));
60
+ border: 0;
61
+ border-radius: var(--xh-tag-close-radius, var(--xh-shape-inset));
62
+ background: transparent;
63
+ /* 叉取标签自己的文字色:实心底上是浅字、淡底上是深字,不必逐形态各写一遍 */
64
+ color: var(--xh-tag-close-fg, currentColor);
65
+ /* 按钮不继承字族字号,不接回来的话标签里会突然冒出一段系统 UI 字体 */
66
+ font: inherit;
67
+ line-height: var(--xh-leading-none);
68
+ cursor: pointer;
69
+ transition:
70
+ background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
71
+ scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
72
+ }
73
+
74
+ /* closable=false 时连接层同时给了 hidden 与 disabled,这条是它真正收起的那一半 */
75
+ [data-scope='tag'][data-part='close-trigger'][hidden] {
76
+ display: none;
77
+ }
78
+
79
+ [data-scope='tag'][data-part='close-trigger']:hover:not(:disabled) {
80
+ /* 底色从当前前景色调出来:标签的实心 / 淡底 / 描边各形态下都压得住 */
81
+ background: var(--xh-tag-close-bg-hover, color-mix(in oklab, currentColor 14%, transparent));
82
+ }
83
+
84
+ [data-scope='tag'][data-part='close-trigger']:not(:disabled):active {
85
+ background: var(--xh-tag-close-bg-active, color-mix(in oklab, currentColor 22%, transparent));
86
+ scale: var(--xh-motion-scale-press);
87
+ }
88
+
89
+ [data-scope='tag'][data-part='close-trigger']:disabled {
90
+ color: var(--xh-fg-disabled);
91
+ cursor: not-allowed;
92
+ }
93
+
94
+ [data-scope='tag'][data-part='close-trigger']:focus-visible {
95
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
96
+ /* 环往内收:命中区贴着标签内缘,往外画会被相邻标签压住 */
97
+ outline-offset: calc(-1 * var(--xh-ring-offset));
98
+ }
99
+
100
+ /* —— 形态 —— */
101
+ /* 形态只决定颜色怎么用。每个形态拆成两条:先是没写语气时的基线配色,
102
+ 再是写了语气时的覆盖。语气槽会沿继承流下来,覆盖那条必须带 [data-tone] 限定,
103
+ 否则一枚没写语气的标签只要落在带 data-tone 的容器里(警告提示、吐司、按钮内)
104
+ 就会跟着染色 */
105
+ [data-scope='tag'][data-part='root'][data-variant='solid'] {
106
+ border-color: transparent;
107
+ background: var(--xh-tag-bg, var(--xh-bg-brand));
108
+ color: var(--xh-tag-fg, var(--xh-fg-on-brand));
109
+ }
110
+
111
+ [data-scope='tag'][data-part='root'][data-variant='solid'][data-tone] {
112
+ background: var(--xh-tag-bg, var(--xh-_tone, var(--xh-bg-brand)));
113
+ color: var(--xh-tag-fg, var(--xh-_tone-on, var(--xh-fg-on-brand)));
114
+ }
115
+
116
+ [data-scope='tag'][data-part='root'][data-variant='subtle'] {
117
+ border-color: transparent;
118
+ background: var(--xh-tag-bg, var(--xh-bg-subtle));
119
+ color: var(--xh-tag-fg, var(--xh-fg-default));
120
+ }
121
+
122
+ [data-scope='tag'][data-part='root'][data-variant='subtle'][data-tone] {
123
+ background: var(--xh-tag-bg, var(--xh-_tone-subtle, var(--xh-bg-subtle)));
124
+ color: var(--xh-tag-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
125
+ }
126
+
127
+ [data-scope='tag'][data-part='root'][data-variant='outline'] {
128
+ border-color: var(--xh-tag-border, var(--xh-border-default));
129
+ background: transparent;
130
+ color: var(--xh-tag-fg, var(--xh-fg-default));
131
+ }
132
+
133
+ [data-scope='tag'][data-part='root'][data-variant='outline'][data-tone] {
134
+ border-color: var(--xh-tag-border, var(--xh-_tone-border, var(--xh-border-default)));
135
+ color: var(--xh-tag-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
136
+ }
137
+
138
+ /* —— 尺寸 —— */
139
+ /* 标签是随文排的标记,不占控件行高,档位走间距与字号而不是 control-h */
140
+ [data-scope='tag'][data-part='root'][data-size='sm'] {
141
+ --xh-_tag-gap: var(--xh-space-0_5);
142
+ --xh-_tag-px: var(--xh-space-1_5);
143
+ --xh-_tag-py: var(--xh-space-0);
144
+ }
145
+
146
+ [data-scope='tag'][data-part='root'][data-size='lg'] {
147
+ --xh-_tag-gap: var(--xh-space-1_5);
148
+ --xh-_tag-px: var(--xh-space-3);
149
+ --xh-_tag-py: var(--xh-space-1);
150
+ --xh-_tag-font-size: var(--xh-text-secondary-size);
151
+ }
152
+
153
+ /* —— 禁用 —— */
154
+ /* 排在形态之后,靠源序压过形态给的配色。第二条选择器专为写了语气的标签而设:
155
+ 语气覆盖那几条比第一条多一个属性,不把 [data-tone] 一起写上,
156
+ 禁用的标签会留着语气实心底、只有文字变灰,底上几乎看不见字。
157
+ 用了 fg-disabled 就不再叠 opacity */
158
+ [data-scope='tag'][data-part='root'][data-disabled],
159
+ [data-scope='tag'][data-part='root'][data-tone][data-disabled] {
160
+ border-color: var(--xh-tag-border-disabled, var(--xh-border-subtle));
161
+ background: var(--xh-tag-bg-disabled, var(--xh-bg-muted));
162
+ color: var(--xh-fg-disabled);
163
+ cursor: not-allowed;
164
+ }
165
+
166
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
167
+ [data-scope='tag'][data-part='close-trigger']:empty::before {
168
+ content: '';
169
+ display: inline-block;
170
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
171
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
172
+ vertical-align: var(--xh-glyph-baseline-shift);
173
+ background-color: currentColor;
174
+ -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
175
+ mask: var(--xh-glyph-mark-close) center / contain no-repeat;
176
+ }
177
+ }
@@ -1,14 +1,22 @@
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'] {
10
+ /* 作者塞进来的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准 */
11
+ --xh-icon-size: var(--xh-tags-input-icon-size, var(--xh-glyph-size-md));
12
+
5
13
  /* 尺寸档只换这六个私有槽,标题、框、输入框与标签都从 root 继承它们,
6
14
  换档不必给每个部件各写一条选择器 */
7
15
  --xh-_tags-input-control-h: var(--xh-control-h-md);
8
16
  --xh-_tags-input-control-px: var(--xh-control-px-md);
9
- --xh-_tags-input-control-gap: var(--xh-control-gap-sm);
17
+ --xh-_tags-input-control-gap: var(--xh-control-gap-md);
10
18
  --xh-_tags-input-input-font-size: var(--xh-text-body-size);
11
- --xh-_tags-input-item-font-size: var(--xh-font-size-sm);
19
+ --xh-_tags-input-item-font-size: var(--xh-text-secondary-size);
12
20
  --xh-_tags-input-label-font-size: var(--xh-text-label-size);
13
21
  /* 形态档只换这三个私有槽,缺省这一份就是描边式(描边 + 画布底) */
14
22
  --xh-_tags-input-control-bg: var(--xh-bg-canvas);
@@ -55,20 +63,23 @@
55
63
 
56
64
  /* —— 尺寸 —— */
57
65
  [data-scope='tags-input'][data-part='root'][data-size='sm'] {
66
+ --xh-icon-size: var(--xh-tags-input-icon-size, var(--xh-glyph-size-sm));
58
67
  --xh-_tags-input-control-h: var(--xh-control-h-sm);
59
68
  --xh-_tags-input-control-px: var(--xh-control-px-sm);
60
- --xh-_tags-input-input-font-size: var(--xh-font-size-sm);
61
- --xh-_tags-input-item-font-size: var(--xh-font-size-xs);
62
- --xh-_tags-input-label-font-size: var(--xh-font-size-sm);
69
+ --xh-_tags-input-control-gap: var(--xh-control-gap-sm);
70
+ --xh-_tags-input-input-font-size: var(--xh-control-font-sm);
71
+ --xh-_tags-input-item-font-size: var(--xh-control-caption-sm);
72
+ --xh-_tags-input-label-font-size: var(--xh-control-font-sm);
63
73
  }
64
74
 
65
75
  [data-scope='tags-input'][data-part='root'][data-size='lg'] {
76
+ --xh-icon-size: var(--xh-tags-input-icon-size, var(--xh-glyph-size-lg));
66
77
  --xh-_tags-input-control-h: var(--xh-control-h-lg);
67
78
  --xh-_tags-input-control-px: var(--xh-control-px-lg);
68
79
  --xh-_tags-input-control-gap: var(--xh-control-gap-lg);
69
- --xh-_tags-input-input-font-size: var(--xh-font-size-lg);
70
- --xh-_tags-input-item-font-size: var(--xh-font-size-md);
71
- --xh-_tags-input-label-font-size: var(--xh-font-size-lg);
80
+ --xh-_tags-input-input-font-size: var(--xh-control-font-lg);
81
+ --xh-_tags-input-item-font-size: var(--xh-control-caption-lg);
82
+ --xh-_tags-input-label-font-size: var(--xh-control-font-lg);
72
83
  }
73
84
 
74
85
  [data-scope='tags-input'][data-part='label'] {
@@ -89,8 +100,10 @@
89
100
  flex-wrap: wrap;
90
101
  align-items: center;
91
102
  gap: var(--xh-tags-input-control-gap, var(--xh-_tags-input-control-gap));
103
+ min-inline-size: var(--xh-tags-input-control-min-w, var(--xh-control-min-w));
92
104
  min-block-size: var(--xh-tags-input-control-h, var(--xh-_tags-input-control-h));
93
- padding-block: var(--xh-tags-input-control-py, var(--xh-space-1));
105
+ /* 纵向只留半档:标签行加上下内距要装进控件档的高度里 */
106
+ padding-block: var(--xh-tags-input-control-py, var(--xh-space-0_5));
94
107
  padding-inline: var(--xh-tags-input-control-px, var(--xh-_tags-input-control-px));
95
108
  border: var(--xh-stroke-thin) solid var(--xh-tags-input-control-border, var(--xh-_tags-input-control-border));
96
109
  border-radius: var(--xh-tags-input-control-radius, var(--xh-shape-control));
@@ -111,7 +124,8 @@
111
124
 
112
125
  /* 焦点环画在这个框上:用户眼里"被聚焦的控件"就是整个框,
113
126
  而真正持有焦点的是里面的 input(它自己那圈环因此让位,见下) */
114
- [data-scope='tags-input'][data-part='control']:focus-within {
127
+ [data-scope='tags-input'][data-part='control']:focus-within:not([data-disabled]) {
128
+ border-color: var(--xh-tags-input-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
115
129
  outline: var(--xh-ring-width) solid var(--xh-_tags-input-ring);
116
130
  outline-offset: var(--xh-ring-offset);
117
131
  }
@@ -119,11 +133,14 @@
119
133
  /* 顶到上限:再加进不去,边框先给个提示。放在 invalid 之前,
120
134
  两者同时成立时按源序让 invalid 赢——真出错比"装满了"要紧 */
121
135
  [data-scope='tags-input'][data-part='control'][data-at-max] {
122
- border-color: var(--xh-tags-input-control-border-at-max, var(--xh-color-warning-600));
136
+ border-color: var(--xh-tags-input-control-border-at-max, var(--xh-border-at-limit));
123
137
  }
124
138
 
125
139
  [data-scope='tags-input'][data-part='control'][data-invalid] {
126
- border-color: var(--xh-tags-input-control-border-invalid, var(--xh-color-danger-500));
140
+ border-color: var(--xh-tags-input-control-border-invalid, var(--xh-border-invalid));
141
+
142
+ /* 校验失败时环也跟着变红:两圈等宽相邻却一红一蓝,读的人不知道哪个才是当前状态 */
143
+ --xh-_tags-input-ring: var(--xh-ring-invalid);
127
144
  }
128
145
 
129
146
  /* 只读仍可聚焦、可复制,所以不置灰,只把底色压下去表示"改不动" */
@@ -151,7 +168,8 @@
151
168
  /* 表单控件不继承页面字体,只给字号会让输入框用 UA 默认字族,与周围文本对不上 */
152
169
  font-family: inherit;
153
170
  font-size: var(--xh-tags-input-input-font-size, var(--xh-_tags-input-input-font-size));
154
- line-height: var(--xh-leading-normal);
171
+ /* 行盒收到标签那一行的高度以内,输入框不去顶高整个框 */
172
+ line-height: var(--xh-leading-tight);
155
173
  }
156
174
 
157
175
  [data-scope='tags-input'][data-part='input']::placeholder {
@@ -212,7 +230,7 @@
212
230
  align-items: center;
213
231
  gap: var(--xh-tags-input-item-gap, var(--xh-space-1));
214
232
  max-inline-size: 100%;
215
- padding-block: var(--xh-tags-input-item-py, var(--xh-space-1));
233
+ padding-block: var(--xh-tags-input-item-py, var(--xh-space-0_5));
216
234
  padding-inline: var(--xh-tags-input-item-px, var(--xh-space-2));
217
235
  user-select: none;
218
236
  }
@@ -230,24 +248,26 @@
230
248
  text-overflow: ellipsis;
231
249
  }
232
250
 
233
- /* 删除按钮画成胶囊里的小圆钮,与文字同一行、不撑高胶囊 */
251
+ /* 删除按钮画成胶囊里的小圆钮,与文字同一行,尺寸取控件指示件档(随密度收) */
234
252
  [data-scope='tags-input'][data-part='item-delete-trigger'] {
235
253
  display: inline-flex;
236
254
  flex: none;
237
255
  align-items: center;
238
256
  justify-content: center;
239
- inline-size: var(--xh-tags-input-delete-size, 1rem);
240
- block-size: var(--xh-tags-input-delete-size, 1rem);
257
+ inline-size: var(--xh-tags-input-delete-size, var(--xh-control-indicator-size));
258
+ block-size: var(--xh-tags-input-delete-size, var(--xh-control-indicator-size));
241
259
  padding: 0;
242
260
  border: 0;
243
- border-radius: var(--xh-radius-full);
261
+ border-radius: var(--xh-tags-input-delete-radius, var(--xh-shape-inset));
244
262
  background: var(--xh-tags-input-delete-bg, transparent);
245
263
  color: var(--xh-tags-input-delete-fg, var(--xh-fg-muted));
246
264
  font-family: inherit;
247
- font-size: var(--xh-tags-input-delete-font-size, var(--xh-font-size-xs));
265
+ font-size: var(--xh-tags-input-delete-font-size, var(--xh-text-caption-size));
248
266
  line-height: var(--xh-leading-none);
249
267
  cursor: pointer;
250
- transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
268
+ transition:
269
+ background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
270
+ scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
251
271
  }
252
272
 
253
273
  [data-scope='tags-input'][data-part='item-delete-trigger'][hidden] {
@@ -266,6 +286,7 @@
266
286
 
267
287
  [data-scope='tags-input'][data-part='item-delete-trigger']:active:not(:disabled) {
268
288
  background: var(--xh-tags-input-delete-bg-active, var(--xh-bg-subtle-active));
289
+ scale: var(--xh-motion-scale-press);
269
290
  }
270
291
 
271
292
  /* 按钮不占 Tab 位(tabindex=-1),正常操作走不到这里;
@@ -288,7 +309,7 @@
288
309
  自己加一条 display 反而要再补一条 [hidden] 规则去抵消它 */
289
310
  [data-scope='tags-input'][data-part='item-input'] {
290
311
  max-inline-size: 100%;
291
- padding-block: var(--xh-tags-input-item-py, var(--xh-space-1));
312
+ padding-block: var(--xh-tags-input-item-py, var(--xh-space-0_5));
292
313
  padding-inline: var(--xh-tags-input-item-px, var(--xh-space-2));
293
314
  border: var(--xh-stroke-thin) solid var(--xh-tags-input-item-input-border, var(--xh-border-control));
294
315
  border-radius: var(--xh-tags-input-item-radius, var(--xh-shape-pill));
@@ -312,49 +333,71 @@
312
333
  cursor: not-allowed;
313
334
  }
314
335
 
315
- /* 清空按钮贴在框的末端,与输入框同一行 */
336
+ /* 清空按钮贴在框的末端,与输入框同一行,尺寸取控件动作钮档(随密度收) */
316
337
  [data-scope='tags-input'][data-part='clear-trigger'] {
317
338
  display: inline-flex;
318
339
  flex: none;
319
340
  align-items: center;
320
341
  justify-content: center;
321
- inline-size: var(--xh-tags-input-clear-size, 1.25rem);
322
- block-size: var(--xh-tags-input-clear-size, 1.25rem);
342
+ inline-size: var(--xh-tags-input-action-size, var(--xh-control-action-size));
343
+ block-size: var(--xh-tags-input-action-size, var(--xh-control-action-size));
323
344
  padding: 0;
324
345
  border: 0;
325
- border-radius: var(--xh-radius-full);
326
- background: var(--xh-tags-input-clear-bg, transparent);
327
- color: var(--xh-tags-input-clear-fg, var(--xh-fg-muted));
346
+ border-radius: var(--xh-tags-input-action-radius, var(--xh-shape-control));
347
+ background: var(--xh-tags-input-action-bg, transparent);
348
+ color: var(--xh-tags-input-action-fg, var(--xh-fg-muted));
328
349
  font-family: inherit;
329
- font-size: var(--xh-tags-input-clear-font-size, var(--xh-font-size-sm));
350
+ font-size: var(--xh-tags-input-action-font-size, var(--xh-text-secondary-size));
330
351
  line-height: var(--xh-leading-none);
331
352
  cursor: pointer;
332
- transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
353
+ transition:
354
+ background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
355
+ scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
333
356
  }
334
357
 
358
+ /* 没值可清时连接层只打 hidden;上面那条 display 会盖掉 UA 规则,少了这条按钮就一直杵着 */
335
359
  [data-scope='tags-input'][data-part='clear-trigger'][hidden] {
336
360
  display: none;
337
361
  }
338
362
 
339
- [data-scope='tags-input'][data-part='clear-trigger']:hover:not(:disabled) {
340
- background: var(--xh-tags-input-clear-bg-hover, var(--xh-bg-subtle-hover));
341
- color: var(--xh-tags-input-clear-fg-hover, var(--xh-fg-default));
363
+ [data-scope='tags-input'][data-part='clear-trigger']:hover {
364
+ background: var(--xh-tags-input-action-bg-hover, var(--xh-bg-subtle-hover));
365
+ color: var(--xh-tags-input-action-fg-hover, var(--xh-fg-default));
342
366
  }
343
367
 
344
- [data-scope='tags-input'][data-part='clear-trigger']:active:not(:disabled) {
345
- background: var(--xh-tags-input-clear-bg-active, var(--xh-bg-subtle-active));
368
+ [data-scope='tags-input'][data-part='clear-trigger']:active {
369
+ background: var(--xh-tags-input-action-bg-active, var(--xh-bg-subtle-active));
370
+ scale: var(--xh-motion-scale-press);
346
371
  }
347
372
 
373
+ /* 按钮不占 Tab 位(tabindex=-1),正常操作走不到这里;
374
+ 留着焦点环是给程序化聚焦兜底——清完把焦点交回输入框之前,它确实短暂持有过焦点 */
348
375
  [data-scope='tags-input'][data-part='clear-trigger']:focus-visible {
349
376
  outline: var(--xh-ring-width) solid var(--xh-_tags-input-ring);
350
- /* 比默认档窄一道:它长在胶囊里,按默认偏移画会压到相邻胶囊 */
377
+ /* 比默认档窄一道:它长在框的末端,按默认偏移画会压到相邻胶囊 */
351
378
  outline-offset: var(--xh-stroke-thin);
352
379
  }
353
380
 
354
- /* 没东西可清、只读或禁用时按钮转灰但不收起:位置留着,加进第一个标签就亮 */
355
- [data-scope='tags-input'][data-part='clear-trigger']:disabled {
356
- background: transparent;
357
- color: var(--xh-fg-disabled);
358
- cursor: not-allowed;
381
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
382
+ [data-scope='tags-input'][data-part='clear-trigger']:empty::before {
383
+ content: '';
384
+ display: inline-block;
385
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
386
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
387
+ vertical-align: var(--xh-glyph-baseline-shift);
388
+ background-color: currentColor;
389
+ -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
390
+ mask: var(--xh-glyph-mark-close) center / contain no-repeat;
391
+ }
392
+
393
+ [data-scope='tags-input'][data-part='item-delete-trigger']:empty::before {
394
+ content: '';
395
+ display: inline-block;
396
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
397
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
398
+ vertical-align: var(--xh-glyph-baseline-shift);
399
+ background-color: currentColor;
400
+ -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
401
+ mask: var(--xh-glyph-mark-close) center / contain no-repeat;
359
402
  }
360
403
  }