@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.
- package/CHANGELOG.md +527 -0
- package/README.md +1 -1
- package/css/accordion.css +61 -5
- package/css/affix.css +5 -0
- package/css/alert.css +35 -5
- package/css/anchor.css +12 -7
- package/css/avatar-group.css +8 -3
- package/css/avatar.css +8 -3
- package/css/back-top.css +21 -1
- package/css/badge.css +21 -2
- package/css/breadcrumb.css +29 -4
- package/css/button-group.css +19 -13
- package/css/button.css +57 -11
- package/css/calendar.css +124 -2
- package/css/card.css +10 -5
- package/css/carousel.css +41 -5
- package/css/cascader.css +188 -102
- package/css/checkbox-group.css +46 -19
- package/css/checkbox.css +59 -8
- package/css/clipboard.css +7 -1
- package/css/code-block.css +17 -7
- package/css/collapsible.css +47 -2
- package/css/color-picker.css +117 -46
- package/css/combobox.css +132 -52
- package/css/composer.css +10 -3
- package/css/context-menu.css +101 -75
- package/css/countdown.css +5 -0
- package/css/date-field.css +96 -14
- package/css/date-picker.css +281 -65
- package/css/descriptions.css +7 -2
- package/css/dialog.css +109 -22
- package/css/download-trigger.css +76 -0
- package/css/drawer.css +75 -23
- package/css/dynamic-input.css +73 -17
- package/css/editable.css +17 -10
- package/css/ellipsis.css +6 -1
- package/css/empty-state.css +12 -7
- package/css/field.css +14 -6
- package/css/fieldset.css +69 -0
- package/css/file-upload.css +50 -7
- package/css/flex.css +5 -0
- package/css/float-button.css +21 -1
- package/css/floating-panel.css +310 -0
- package/css/form.css +10 -5
- package/css/gradient-text.css +5 -0
- package/css/grid.css +5 -0
- package/css/heatmap.css +410 -0
- package/css/highlight.css +6 -1
- package/css/hotkeys.css +90 -0
- package/css/hover-card.css +58 -50
- package/css/icon-wrapper.css +5 -0
- package/css/icon.css +5 -0
- package/css/image-cropper.css +231 -0
- package/css/image-viewer.css +167 -22
- package/css/image.css +7 -2
- package/css/infinite-scroll.css +6 -1
- package/css/json-viewer.css +241 -0
- package/css/layout.css +11 -10
- package/css/list.css +13 -8
- package/css/listbox.css +25 -4
- package/css/loading-bar.css +12 -1
- package/css/log.css +6 -1
- package/css/marquee.css +14 -0
- package/css/masonry.css +63 -0
- package/css/mention.css +105 -32
- package/css/menu.css +131 -46
- package/css/menubar.css +150 -66
- package/css/navigation-menu.css +59 -29
- package/css/number-animation.css +8 -3
- package/css/number-field.css +178 -16
- package/css/overlay-arrow.css +51 -0
- package/css/page-header.css +10 -5
- package/css/pagination.css +18 -13
- package/css/password-input.css +356 -0
- package/css/pin-input.css +18 -10
- package/css/popconfirm.css +73 -16
- package/css/popover.css +88 -44
- package/css/popselect.css +201 -52
- package/css/progress.css +52 -7
- package/css/qr-code.css +6 -1
- package/css/radio-group.css +19 -8
- package/css/rating.css +7 -2
- package/css/reset.css +17 -0
- package/css/result.css +11 -6
- package/css/scroll-area.css +65 -94
- package/css/scrollbar.css +167 -0
- package/css/segmented.css +215 -0
- package/css/select.css +292 -124
- package/css/separator.css +7 -2
- package/css/side-nav.css +116 -19
- package/css/signature-pad.css +144 -0
- package/css/skeleton.css +12 -1
- package/css/slider.css +15 -10
- package/css/space.css +117 -0
- package/css/spinner.css +31 -11
- package/css/splitter.css +5 -0
- package/css/statistic.css +14 -9
- package/css/steps.css +30 -8
- package/css/switch.css +62 -13
- package/css/table.css +136 -37
- package/css/tabs.css +9 -4
- package/css/tag.css +177 -0
- package/css/tags-input.css +83 -40
- package/css/text-field.css +154 -36
- package/css/thread.css +6 -1
- package/css/time-field.css +102 -16
- package/css/time-picker.css +264 -69
- package/css/time.css +5 -0
- package/css/timeline.css +15 -10
- package/css/timer.css +119 -0
- package/css/toast.css +46 -21
- package/css/toaster.css +6 -1
- package/css/toggle-group.css +5 -0
- package/css/toggle.css +11 -6
- package/css/tone.css +10 -5
- package/css/toolbar.css +6 -1
- package/css/tooltip.css +54 -38
- package/css/tour.css +128 -63
- package/css/transfer.css +73 -17
- package/css/tree-select.css +203 -83
- package/css/tree.css +90 -1
- package/css/typography.css +9 -4
- package/css/undefined.css +11 -1
- package/css/virtualizer.css +8 -1
- package/css/watermark.css +6 -2
- package/index.css +17 -1
- package/index.unlayered.css +9394 -2883
- package/package.json +19 -4
- 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
|
+
}
|
package/css/tags-input.css
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
61
|
-
--xh-_tags-input-
|
|
62
|
-
--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);
|
|
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-
|
|
70
|
-
--xh-_tags-input-item-font-size: var(--xh-
|
|
71
|
-
--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);
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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,
|
|
240
|
-
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));
|
|
241
259
|
padding: 0;
|
|
242
260
|
border: 0;
|
|
243
|
-
border-radius: var(--xh-radius-
|
|
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-
|
|
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:
|
|
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-
|
|
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-
|
|
322
|
-
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));
|
|
323
344
|
padding: 0;
|
|
324
345
|
border: 0;
|
|
325
|
-
border-radius: var(--xh-radius-
|
|
326
|
-
background: var(--xh-tags-input-
|
|
327
|
-
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));
|
|
328
349
|
font-family: inherit;
|
|
329
|
-
font-size: var(--xh-tags-input-
|
|
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:
|
|
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
|
|
340
|
-
background: var(--xh-tags-input-
|
|
341
|
-
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));
|
|
342
366
|
}
|
|
343
367
|
|
|
344
|
-
[data-scope='tags-input'][data-part='clear-trigger']:active
|
|
345
|
-
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);
|
|
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']:
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
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
|
}
|