@xihan-ui/styles 1.0.0-alpha.2 → 1.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 (122) hide show
  1. package/CHANGELOG.md +2177 -0
  2. package/README.md +1 -1
  3. package/css/accordion.css +80 -6
  4. package/css/alert.css +43 -14
  5. package/css/anchor.css +8 -8
  6. package/css/avatar-group.css +7 -3
  7. package/css/avatar.css +9 -3
  8. package/css/back-top.css +22 -1
  9. package/css/badge.css +104 -32
  10. package/css/breadcrumb.css +25 -5
  11. package/css/button-group.css +18 -13
  12. package/css/button.css +48 -11
  13. package/css/calendar.css +150 -7
  14. package/css/card.css +20 -11
  15. package/css/carousel.css +36 -5
  16. package/css/cascader.css +211 -124
  17. package/css/checkbox-group.css +72 -22
  18. package/css/checkbox.css +70 -13
  19. package/css/clipboard.css +2 -1
  20. package/css/code-block.css +12 -7
  21. package/css/collapsible.css +49 -3
  22. package/css/color-picker.css +132 -46
  23. package/css/combobox.css +132 -60
  24. package/css/composer.css +5 -3
  25. package/css/context-menu.css +113 -74
  26. package/css/date-field.css +93 -16
  27. package/css/date-picker.css +293 -72
  28. package/css/descriptions.css +11 -5
  29. package/css/dialog.css +47 -14
  30. package/css/download-trigger.css +76 -0
  31. package/css/drawer.css +57 -16
  32. package/css/dynamic-input.css +75 -17
  33. package/css/editable.css +12 -10
  34. package/css/ellipsis.css +7 -1
  35. package/css/empty-state.css +22 -12
  36. package/css/field.css +16 -6
  37. package/css/fieldset.css +69 -0
  38. package/css/file-upload.css +46 -8
  39. package/css/flex.css +13 -7
  40. package/css/float-button.css +23 -1
  41. package/css/floating-panel.css +316 -0
  42. package/css/form.css +4 -4
  43. package/css/grid.css +11 -5
  44. package/css/heatmap.css +411 -0
  45. package/css/highlight.css +2 -2
  46. package/css/hotkeys.css +90 -0
  47. package/css/hover-card.css +43 -45
  48. package/css/image-cropper.css +233 -0
  49. package/css/image-viewer.css +155 -17
  50. package/css/image.css +2 -2
  51. package/css/infinite-scroll.css +1 -1
  52. package/css/json-viewer.css +274 -0
  53. package/css/layout.css +19 -15
  54. package/css/list.css +22 -13
  55. package/css/listbox.css +24 -6
  56. package/css/loading-bar.css +12 -5
  57. package/css/log.css +7 -3
  58. package/css/marquee.css +9 -0
  59. package/css/masonry.css +63 -0
  60. package/css/mention.css +100 -36
  61. package/css/menu.css +127 -50
  62. package/css/menubar.css +155 -61
  63. package/css/navigation-menu.css +56 -31
  64. package/css/notification.css +377 -0
  65. package/css/number-animation.css +3 -3
  66. package/css/number-field.css +182 -19
  67. package/css/overlay-arrow.css +51 -0
  68. package/css/page-header.css +12 -5
  69. package/css/pagination.css +171 -14
  70. package/css/password-input.css +356 -0
  71. package/css/pin-input.css +15 -12
  72. package/css/popconfirm.css +55 -12
  73. package/css/popover.css +73 -45
  74. package/css/popselect.css +207 -57
  75. package/css/progress.css +54 -8
  76. package/css/qr-code.css +1 -1
  77. package/css/radio-group.css +27 -10
  78. package/css/rating.css +4 -4
  79. package/css/reset.css +17 -0
  80. package/css/result.css +21 -11
  81. package/css/scroll-area.css +61 -89
  82. package/css/scrollbar.css +170 -0
  83. package/css/segmented.css +215 -0
  84. package/css/select.css +298 -131
  85. package/css/separator.css +2 -2
  86. package/css/side-nav.css +127 -24
  87. package/css/signature-pad.css +144 -0
  88. package/css/skeleton.css +7 -1
  89. package/css/slider.css +14 -12
  90. package/css/space.css +117 -0
  91. package/css/spinner.css +22 -10
  92. package/css/statistic.css +9 -9
  93. package/css/steps.css +29 -12
  94. package/css/switch.css +57 -8
  95. package/css/table.css +146 -44
  96. package/css/tabs.css +13 -5
  97. package/css/tag.css +179 -0
  98. package/css/tags-input.css +80 -42
  99. package/css/text-field.css +151 -38
  100. package/css/thread.css +11 -3
  101. package/css/time-field.css +99 -18
  102. package/css/time-picker.css +261 -71
  103. package/css/timeline.css +15 -15
  104. package/css/timer.css +119 -0
  105. package/css/toast.css +129 -55
  106. package/css/toggle-group.css +30 -4
  107. package/css/toggle.css +12 -6
  108. package/css/tone.css +57 -22
  109. package/css/toolbar.css +1 -1
  110. package/css/tooltip.css +40 -31
  111. package/css/tour.css +112 -61
  112. package/css/transfer.css +98 -21
  113. package/css/tree-select.css +215 -89
  114. package/css/tree.css +131 -5
  115. package/css/typography.css +5 -5
  116. package/css/undefined.css +12 -1
  117. package/css/virtualizer.css +3 -1
  118. package/css/watermark.css +1 -2
  119. package/index.css +18 -1
  120. package/index.unlayered.css +10356 -3255
  121. package/package.json +20 -4
  122. package/css/toaster.css +0 -74
package/css/tag.css ADDED
@@ -0,0 +1,179 @@
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
+ /* 描边档的边就是这枚标签的全部轮廓,走「可操作区边界」那一支:
134
+ 兑了底色的 --xh-_tone-border 六族都在 1.44-2.18,当轮廓看不清 */
135
+ [data-scope='tag'][data-part='root'][data-variant='outline'][data-tone] {
136
+ border-color: var(--xh-tag-border, var(--xh-_tone-border-control, var(--xh-border-default)));
137
+ color: var(--xh-tag-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
138
+ }
139
+
140
+ /* —— 尺寸 —— */
141
+ /* 标签是随文排的标记,不占控件行高,档位走间距与字号而不是 control-h */
142
+ [data-scope='tag'][data-part='root'][data-size='sm'] {
143
+ --xh-_tag-gap: var(--xh-space-0_5);
144
+ --xh-_tag-px: var(--xh-space-1_5);
145
+ --xh-_tag-py: var(--xh-space-0);
146
+ }
147
+
148
+ [data-scope='tag'][data-part='root'][data-size='lg'] {
149
+ --xh-_tag-gap: var(--xh-space-1_5);
150
+ --xh-_tag-px: var(--xh-space-3);
151
+ --xh-_tag-py: var(--xh-space-1);
152
+ --xh-_tag-font-size: var(--xh-text-secondary-size);
153
+ }
154
+
155
+ /* —— 禁用 —— */
156
+ /* 排在形态之后,靠源序压过形态给的配色。第二条选择器专为写了语气的标签而设:
157
+ 语气覆盖那几条比第一条多一个属性,不把 [data-tone] 一起写上,
158
+ 禁用的标签会留着语气实心底、只有文字变灰,底上几乎看不见字。
159
+ 用了 fg-disabled 就不再叠 opacity */
160
+ [data-scope='tag'][data-part='root'][data-disabled],
161
+ [data-scope='tag'][data-part='root'][data-tone][data-disabled] {
162
+ border-color: var(--xh-tag-border-disabled, var(--xh-border-subtle));
163
+ background: var(--xh-tag-bg-disabled, var(--xh-bg-muted));
164
+ color: var(--xh-fg-disabled);
165
+ cursor: not-allowed;
166
+ }
167
+
168
+ /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
169
+ [data-scope='tag'][data-part='close-trigger']:empty::before {
170
+ content: '';
171
+ display: inline-block;
172
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
173
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
174
+ vertical-align: var(--xh-glyph-baseline-shift);
175
+ background-color: currentColor;
176
+ -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
177
+ mask: var(--xh-glyph-mark-close) center / contain no-repeat;
178
+ }
179
+ }
@@ -7,14 +7,17 @@
7
7
  /* root 只负责纵向堆叠:标题一行、控件一行。可见的那个"框"长在 control 上,
8
8
  因为标签、输入框、清空按钮都在它里面,边框必须把三者一起圈住 */
9
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
+
10
13
  /* 尺寸档只换这六个私有槽,标题、框、输入框与标签都从 root 继承它们,
11
14
  换档不必给每个部件各写一条选择器 */
12
15
  --xh-_tags-input-control-h: var(--xh-control-h-md);
13
16
  --xh-_tags-input-control-px: var(--xh-control-px-md);
14
- --xh-_tags-input-control-gap: var(--xh-control-gap-sm);
15
- --xh-_tags-input-input-font-size: var(--xh-text-body-size);
16
- --xh-_tags-input-item-font-size: var(--xh-font-size-sm);
17
- --xh-_tags-input-label-font-size: var(--xh-text-label-size);
17
+ --xh-_tags-input-control-gap: var(--xh-control-gap-md);
18
+ --xh-_tags-input-input-font-size: var(--xh-control-font-md);
19
+ --xh-_tags-input-item-font-size: var(--xh-control-caption-md);
20
+ --xh-_tags-input-label-font-size: var(--xh-control-font-md);
18
21
  /* 形态档只换这三个私有槽,缺省这一份就是描边式(描边 + 画布底) */
19
22
  --xh-_tags-input-control-bg: var(--xh-bg-canvas);
20
23
  --xh-_tags-input-control-border: var(--xh-border-control);
@@ -60,20 +63,23 @@
60
63
 
61
64
  /* —— 尺寸 —— */
62
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));
63
67
  --xh-_tags-input-control-h: var(--xh-control-h-sm);
64
68
  --xh-_tags-input-control-px: var(--xh-control-px-sm);
65
- --xh-_tags-input-input-font-size: var(--xh-font-size-sm);
66
- --xh-_tags-input-item-font-size: var(--xh-font-size-xs);
67
- --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);
68
73
  }
69
74
 
70
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));
71
77
  --xh-_tags-input-control-h: var(--xh-control-h-lg);
72
78
  --xh-_tags-input-control-px: var(--xh-control-px-lg);
73
79
  --xh-_tags-input-control-gap: var(--xh-control-gap-lg);
74
- --xh-_tags-input-input-font-size: var(--xh-font-size-lg);
75
- --xh-_tags-input-item-font-size: var(--xh-font-size-md);
76
- --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);
77
83
  }
78
84
 
79
85
  [data-scope='tags-input'][data-part='label'] {
@@ -94,8 +100,10 @@
94
100
  flex-wrap: wrap;
95
101
  align-items: center;
96
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));
97
104
  min-block-size: var(--xh-tags-input-control-h, var(--xh-_tags-input-control-h));
98
- 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));
99
107
  padding-inline: var(--xh-tags-input-control-px, var(--xh-_tags-input-control-px));
100
108
  border: var(--xh-stroke-thin) solid var(--xh-tags-input-control-border, var(--xh-_tags-input-control-border));
101
109
  border-radius: var(--xh-tags-input-control-radius, var(--xh-shape-control));
@@ -116,7 +124,8 @@
116
124
 
117
125
  /* 焦点环画在这个框上:用户眼里"被聚焦的控件"就是整个框,
118
126
  而真正持有焦点的是里面的 input(它自己那圈环因此让位,见下) */
119
- [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)));
120
129
  outline: var(--xh-ring-width) solid var(--xh-_tags-input-ring);
121
130
  outline-offset: var(--xh-ring-offset);
122
131
  }
@@ -124,11 +133,14 @@
124
133
  /* 顶到上限:再加进不去,边框先给个提示。放在 invalid 之前,
125
134
  两者同时成立时按源序让 invalid 赢——真出错比"装满了"要紧 */
126
135
  [data-scope='tags-input'][data-part='control'][data-at-max] {
127
- 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));
128
137
  }
129
138
 
130
139
  [data-scope='tags-input'][data-part='control'][data-invalid] {
131
- 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);
132
144
  }
133
145
 
134
146
  /* 只读仍可聚焦、可复制,所以不置灰,只把底色压下去表示"改不动" */
@@ -156,7 +168,8 @@
156
168
  /* 表单控件不继承页面字体,只给字号会让输入框用 UA 默认字族,与周围文本对不上 */
157
169
  font-family: inherit;
158
170
  font-size: var(--xh-tags-input-input-font-size, var(--xh-_tags-input-input-font-size));
159
- line-height: var(--xh-leading-normal);
171
+ /* 行盒收到标签那一行的高度以内,输入框不去顶高整个框 */
172
+ line-height: var(--xh-leading-tight);
160
173
  }
161
174
 
162
175
  [data-scope='tags-input'][data-part='input']::placeholder {
@@ -217,7 +230,7 @@
217
230
  align-items: center;
218
231
  gap: var(--xh-tags-input-item-gap, var(--xh-space-1));
219
232
  max-inline-size: 100%;
220
- 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));
221
234
  padding-inline: var(--xh-tags-input-item-px, var(--xh-space-2));
222
235
  user-select: none;
223
236
  }
@@ -235,24 +248,26 @@
235
248
  text-overflow: ellipsis;
236
249
  }
237
250
 
238
- /* 删除按钮画成胶囊里的小圆钮,与文字同一行、不撑高胶囊 */
251
+ /* 删除按钮画成胶囊里的小圆钮,与文字同一行,尺寸取控件指示件档(随密度收) */
239
252
  [data-scope='tags-input'][data-part='item-delete-trigger'] {
240
253
  display: inline-flex;
241
254
  flex: none;
242
255
  align-items: center;
243
256
  justify-content: center;
244
- inline-size: var(--xh-tags-input-delete-size, 1rem);
245
- 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));
246
259
  padding: 0;
247
260
  border: 0;
248
- border-radius: var(--xh-radius-full);
261
+ border-radius: var(--xh-tags-input-delete-radius, var(--xh-shape-inset));
249
262
  background: var(--xh-tags-input-delete-bg, transparent);
250
263
  color: var(--xh-tags-input-delete-fg, var(--xh-fg-muted));
251
264
  font-family: inherit;
252
- 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));
253
266
  line-height: var(--xh-leading-none);
254
267
  cursor: pointer;
255
- 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);
256
271
  }
257
272
 
258
273
  [data-scope='tags-input'][data-part='item-delete-trigger'][hidden] {
@@ -271,6 +286,7 @@
271
286
 
272
287
  [data-scope='tags-input'][data-part='item-delete-trigger']:active:not(:disabled) {
273
288
  background: var(--xh-tags-input-delete-bg-active, var(--xh-bg-subtle-active));
289
+ scale: var(--xh-motion-scale-press);
274
290
  }
275
291
 
276
292
  /* 按钮不占 Tab 位(tabindex=-1),正常操作走不到这里;
@@ -293,7 +309,7 @@
293
309
  自己加一条 display 反而要再补一条 [hidden] 规则去抵消它 */
294
310
  [data-scope='tags-input'][data-part='item-input'] {
295
311
  max-inline-size: 100%;
296
- 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));
297
313
  padding-inline: var(--xh-tags-input-item-px, var(--xh-space-2));
298
314
  border: var(--xh-stroke-thin) solid var(--xh-tags-input-item-input-border, var(--xh-border-control));
299
315
  border-radius: var(--xh-tags-input-item-radius, var(--xh-shape-pill));
@@ -317,49 +333,71 @@
317
333
  cursor: not-allowed;
318
334
  }
319
335
 
320
- /* 清空按钮贴在框的末端,与输入框同一行 */
336
+ /* 清空按钮贴在框的末端,与输入框同一行,尺寸取控件动作钮档(随密度收) */
321
337
  [data-scope='tags-input'][data-part='clear-trigger'] {
322
338
  display: inline-flex;
323
339
  flex: none;
324
340
  align-items: center;
325
341
  justify-content: center;
326
- inline-size: var(--xh-tags-input-clear-size, 1.25rem);
327
- 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));
328
344
  padding: 0;
329
345
  border: 0;
330
- border-radius: var(--xh-radius-full);
331
- background: var(--xh-tags-input-clear-bg, transparent);
332
- 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));
333
349
  font-family: inherit;
334
- 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));
335
351
  line-height: var(--xh-leading-none);
336
352
  cursor: pointer;
337
- 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);
338
356
  }
339
357
 
358
+ /* 没值可清时连接层只打 hidden;上面那条 display 会盖掉 UA 规则,少了这条按钮就一直杵着 */
340
359
  [data-scope='tags-input'][data-part='clear-trigger'][hidden] {
341
360
  display: none;
342
361
  }
343
362
 
344
- [data-scope='tags-input'][data-part='clear-trigger']:hover:not(:disabled) {
345
- background: var(--xh-tags-input-clear-bg-hover, var(--xh-bg-subtle-hover));
346
- 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));
347
366
  }
348
367
 
349
- [data-scope='tags-input'][data-part='clear-trigger']:active:not(:disabled) {
350
- 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);
351
371
  }
352
372
 
373
+ /* 按钮不占 Tab 位(tabindex=-1),正常操作走不到这里;
374
+ 留着焦点环是给程序化聚焦兜底——清完把焦点交回输入框之前,它确实短暂持有过焦点 */
353
375
  [data-scope='tags-input'][data-part='clear-trigger']:focus-visible {
354
376
  outline: var(--xh-ring-width) solid var(--xh-_tags-input-ring);
355
- /* 比默认档窄一道:它长在胶囊里,按默认偏移画会压到相邻胶囊 */
377
+ /* 比默认档窄一道:它长在框的末端,按默认偏移画会压到相邻胶囊 */
356
378
  outline-offset: var(--xh-stroke-thin);
357
379
  }
358
380
 
359
- /* 没东西可清、只读或禁用时按钮转灰但不收起:位置留着,加进第一个标签就亮 */
360
- [data-scope='tags-input'][data-part='clear-trigger']:disabled {
361
- background: transparent;
362
- color: var(--xh-fg-disabled);
363
- 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;
364
402
  }
365
403
  }