@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.
- package/CHANGELOG.md +2177 -0
- package/README.md +1 -1
- package/css/accordion.css +80 -6
- package/css/alert.css +43 -14
- package/css/anchor.css +8 -8
- package/css/avatar-group.css +7 -3
- package/css/avatar.css +9 -3
- package/css/back-top.css +22 -1
- package/css/badge.css +104 -32
- package/css/breadcrumb.css +25 -5
- package/css/button-group.css +18 -13
- package/css/button.css +48 -11
- package/css/calendar.css +150 -7
- package/css/card.css +20 -11
- package/css/carousel.css +36 -5
- package/css/cascader.css +211 -124
- package/css/checkbox-group.css +72 -22
- package/css/checkbox.css +70 -13
- package/css/clipboard.css +2 -1
- package/css/code-block.css +12 -7
- package/css/collapsible.css +49 -3
- package/css/color-picker.css +132 -46
- package/css/combobox.css +132 -60
- package/css/composer.css +5 -3
- package/css/context-menu.css +113 -74
- package/css/date-field.css +93 -16
- package/css/date-picker.css +293 -72
- package/css/descriptions.css +11 -5
- package/css/dialog.css +47 -14
- package/css/download-trigger.css +76 -0
- package/css/drawer.css +57 -16
- package/css/dynamic-input.css +75 -17
- package/css/editable.css +12 -10
- package/css/ellipsis.css +7 -1
- package/css/empty-state.css +22 -12
- package/css/field.css +16 -6
- package/css/fieldset.css +69 -0
- package/css/file-upload.css +46 -8
- package/css/flex.css +13 -7
- package/css/float-button.css +23 -1
- package/css/floating-panel.css +316 -0
- package/css/form.css +4 -4
- package/css/grid.css +11 -5
- package/css/heatmap.css +411 -0
- package/css/highlight.css +2 -2
- package/css/hotkeys.css +90 -0
- package/css/hover-card.css +43 -45
- package/css/image-cropper.css +233 -0
- package/css/image-viewer.css +155 -17
- package/css/image.css +2 -2
- package/css/infinite-scroll.css +1 -1
- package/css/json-viewer.css +274 -0
- package/css/layout.css +19 -15
- package/css/list.css +22 -13
- package/css/listbox.css +24 -6
- package/css/loading-bar.css +12 -5
- package/css/log.css +7 -3
- package/css/marquee.css +9 -0
- package/css/masonry.css +63 -0
- package/css/mention.css +100 -36
- package/css/menu.css +127 -50
- package/css/menubar.css +155 -61
- package/css/navigation-menu.css +56 -31
- package/css/notification.css +377 -0
- package/css/number-animation.css +3 -3
- package/css/number-field.css +182 -19
- package/css/overlay-arrow.css +51 -0
- package/css/page-header.css +12 -5
- package/css/pagination.css +171 -14
- package/css/password-input.css +356 -0
- package/css/pin-input.css +15 -12
- package/css/popconfirm.css +55 -12
- package/css/popover.css +73 -45
- package/css/popselect.css +207 -57
- package/css/progress.css +54 -8
- package/css/qr-code.css +1 -1
- package/css/radio-group.css +27 -10
- package/css/rating.css +4 -4
- package/css/reset.css +17 -0
- package/css/result.css +21 -11
- package/css/scroll-area.css +61 -89
- package/css/scrollbar.css +170 -0
- package/css/segmented.css +215 -0
- package/css/select.css +298 -131
- package/css/separator.css +2 -2
- package/css/side-nav.css +127 -24
- package/css/signature-pad.css +144 -0
- package/css/skeleton.css +7 -1
- package/css/slider.css +14 -12
- package/css/space.css +117 -0
- package/css/spinner.css +22 -10
- package/css/statistic.css +9 -9
- package/css/steps.css +29 -12
- package/css/switch.css +57 -8
- package/css/table.css +146 -44
- package/css/tabs.css +13 -5
- package/css/tag.css +179 -0
- package/css/tags-input.css +80 -42
- package/css/text-field.css +151 -38
- package/css/thread.css +11 -3
- package/css/time-field.css +99 -18
- package/css/time-picker.css +261 -71
- package/css/timeline.css +15 -15
- package/css/timer.css +119 -0
- package/css/toast.css +129 -55
- package/css/toggle-group.css +30 -4
- package/css/toggle.css +12 -6
- package/css/tone.css +57 -22
- package/css/toolbar.css +1 -1
- package/css/tooltip.css +40 -31
- package/css/tour.css +112 -61
- package/css/transfer.css +98 -21
- package/css/tree-select.css +215 -89
- package/css/tree.css +131 -5
- package/css/typography.css +5 -5
- package/css/undefined.css +12 -1
- package/css/virtualizer.css +3 -1
- package/css/watermark.css +1 -2
- package/index.css +18 -1
- package/index.unlayered.css +10356 -3255
- package/package.json +20 -4
- 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
|
+
}
|
package/css/tags-input.css
CHANGED
|
@@ -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-
|
|
15
|
-
--xh-_tags-input-input-font-size: var(--xh-
|
|
16
|
-
--xh-_tags-input-item-font-size: var(--xh-
|
|
17
|
-
--xh-_tags-input-label-font-size: var(--xh-
|
|
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-
|
|
66
|
-
--xh-_tags-input-
|
|
67
|
-
--xh-_tags-input-
|
|
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-
|
|
75
|
-
--xh-_tags-input-item-font-size: var(--xh-
|
|
76
|
-
--xh-_tags-input-label-font-size: var(--xh-font-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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,
|
|
245
|
-
block-size: var(--xh-tags-input-delete-size,
|
|
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-
|
|
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-
|
|
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:
|
|
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-
|
|
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-
|
|
327
|
-
block-size: var(--xh-tags-input-
|
|
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-
|
|
331
|
-
background: var(--xh-tags-input-
|
|
332
|
-
color: var(--xh-tags-input-
|
|
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-
|
|
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:
|
|
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
|
|
345
|
-
background: var(--xh-tags-input-
|
|
346
|
-
color: var(--xh-tags-input-
|
|
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
|
|
350
|
-
background: var(--xh-tags-input-
|
|
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']:
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
}
|