@xihan-ui/styles 3.1.0 → 4.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 +470 -0
- package/component-tokens.d.ts +230 -60
- package/components.tokens.json +5156 -1557
- package/css/accordion.css +47 -20
- package/css/alert.css +16 -17
- package/css/anchor.css +2 -2
- package/css/approval.css +41 -17
- package/css/avatar-group.css +9 -12
- package/css/avatar.css +20 -18
- package/css/back-top.css +21 -7
- package/css/badge.css +5 -5
- package/css/breadcrumb.css +18 -16
- package/css/button-group.css +4 -6
- package/css/button.css +13 -12
- package/css/calendar-picker.css +178 -95
- package/css/calendar-range-picker.css +207 -122
- package/css/card.css +34 -6
- package/css/carousel.css +94 -46
- package/css/cartesian-chart.css +11 -11
- package/css/cascader.css +51 -39
- package/css/checkbox-group.css +9 -6
- package/css/checkbox.css +5 -4
- package/css/citation.css +9 -4
- package/css/clipboard.css +20 -4
- package/css/code-view.css +6 -6
- package/css/collapsible.css +29 -14
- package/css/color-field.css +4 -4
- package/css/color-picker.css +77 -23
- package/css/color-slider.css +10 -8
- package/css/color-swatch-picker.css +14 -9
- package/css/combobox.css +26 -14
- package/css/command.css +14 -9
- package/css/context-menu.css +10 -5
- package/css/date-field.css +12 -6
- package/css/date-picker.css +178 -109
- package/css/date-range-picker.css +199 -130
- package/css/description.css +10 -6
- package/css/descriptions.css +47 -19
- package/css/dialog.css +50 -35
- package/css/diff-view.css +8 -8
- package/css/drawer.css +75 -21
- package/css/editable.css +15 -41
- package/css/empty-state.css +21 -3
- package/css/field-array.css +5 -2
- package/css/field.css +17 -18
- package/css/fieldset.css +33 -13
- package/css/file-upload.css +66 -33
- package/css/float-button.css +60 -35
- package/css/floating-panel.css +1 -1
- package/css/form.css +30 -16
- package/css/graph-chart.css +2 -2
- package/css/grid-list.css +1 -1
- package/css/highlight.css +5 -5
- package/css/hover-card.css +19 -12
- package/css/image-viewer.css +77 -27
- package/css/image.css +13 -5
- package/css/infinite-scroll.css +8 -4
- package/css/input-group.css +74 -26
- package/css/kbd.css +1 -1
- package/css/label.css +27 -11
- package/css/layout.css +17 -10
- package/css/list.css +13 -9
- package/css/listbox.css +12 -7
- package/css/loading-bar.css +3 -0
- package/css/mention.css +11 -9
- package/css/menu.css +10 -5
- package/css/menubar.css +13 -8
- package/css/message-feed.css +1 -1
- package/css/navigation-menu.css +2 -2
- package/css/notification.css +132 -49
- package/css/number-animation.css +2 -2
- package/css/number-field.css +75 -52
- package/css/page-header.css +64 -27
- package/css/pagination.css +35 -38
- package/css/password-input.css +12 -68
- package/css/pin-input.css +18 -26
- package/css/popconfirm.css +23 -14
- package/css/popover.css +18 -12
- package/css/progress.css +14 -13
- package/css/prompt-input.css +3 -3
- package/css/question-flow.css +41 -15
- package/css/radar-chart.css +6 -6
- package/css/radio-group.css +120 -55
- package/css/rating.css +32 -15
- package/css/select.css +16 -12
- package/css/separator.css +24 -6
- package/css/side-nav.css +29 -24
- package/css/signature-pad.css +23 -9
- package/css/skeleton.css +12 -12
- package/css/slider.css +77 -48
- package/css/sortable.css +2 -2
- package/css/sparkline.css +8 -2
- package/css/spinner.css +40 -20
- package/css/statistic.css +14 -14
- package/css/steps.css +115 -84
- package/css/switch.css +9 -7
- package/css/table.css +29 -12
- package/css/tabs.css +35 -12
- package/css/tag-group.css +17 -6
- package/css/tag.css +54 -29
- package/css/tags-input.css +39 -20
- package/css/text-field.css +5 -5
- package/css/time-field.css +4 -4
- package/css/time-picker.css +150 -64
- package/css/time-range-picker.css +91 -62
- package/css/timeline.css +37 -20
- package/css/timer.css +3 -3
- package/css/toggle-group.css +4 -4
- package/css/tool-call.css +13 -11
- package/css/toolbar.css +6 -5
- package/css/tooltip.css +16 -17
- package/css/tour.css +14 -7
- package/css/transfer.css +22 -16
- package/css/tree-select.css +12 -12
- package/css/tree.css +26 -25
- package/css/typography.css +28 -25
- package/dist/css/accordion.css +296 -0
- package/dist/css/affix.css +47 -0
- package/dist/css/alert.css +246 -0
- package/dist/css/anchor.css +252 -0
- package/dist/css/approval.css +525 -0
- package/dist/css/avatar-group.css +96 -0
- package/dist/css/avatar.css +100 -0
- package/dist/css/back-top.css +175 -0
- package/dist/css/badge.css +205 -0
- package/dist/css/bar-code.css +62 -0
- package/dist/css/breadcrumb.css +232 -0
- package/dist/css/button-group.css +261 -0
- package/dist/css/button.css +216 -0
- package/dist/css/calendar-picker.css +550 -0
- package/dist/css/calendar-range-picker.css +639 -0
- package/dist/css/card.css +249 -0
- package/dist/css/carousel.css +726 -0
- package/dist/css/cartesian-chart.css +830 -0
- package/dist/css/cascader.css +973 -0
- package/dist/css/checkbox-group.css +361 -0
- package/dist/css/checkbox.css +258 -0
- package/dist/css/citation.css +475 -0
- package/dist/css/clipboard.css +331 -0
- package/dist/css/code-view.css +374 -0
- package/dist/css/collapsible.css +200 -0
- package/dist/css/color-field.css +176 -0
- package/dist/css/color-picker.css +649 -0
- package/dist/css/color-slider.css +283 -0
- package/dist/css/color-swatch-picker.css +250 -0
- package/dist/css/color-swatch.css +35 -0
- package/dist/css/combobox.css +578 -0
- package/dist/css/command.css +404 -0
- package/dist/css/context-menu.css +425 -0
- package/dist/css/date-field.css +317 -0
- package/dist/css/date-picker.css +931 -0
- package/dist/css/date-range-picker.css +949 -0
- package/dist/css/description.css +71 -0
- package/dist/css/descriptions.css +327 -0
- package/dist/css/dialog.css +470 -0
- package/dist/css/diff-view.css +513 -0
- package/dist/css/download-trigger.css +151 -0
- package/dist/css/drawer.css +606 -0
- package/dist/css/editable.css +269 -0
- package/dist/css/empty-state.css +181 -0
- package/dist/css/field-array.css +229 -0
- package/dist/css/field.css +165 -0
- package/dist/css/fieldset.css +122 -0
- package/dist/css/file-upload.css +462 -0
- package/dist/css/flex.css +441 -0
- package/dist/css/float-button.css +579 -0
- package/dist/css/floating-panel.css +429 -0
- package/dist/css/focus.css +46 -0
- package/dist/css/forced-colors.css +93 -0
- package/dist/css/form.css +407 -0
- package/dist/css/funnel-chart.css +106 -0
- package/dist/css/graph-chart.css +205 -0
- package/dist/css/grid-list.css +235 -0
- package/dist/css/grid.css +1201 -0
- package/dist/css/heatmap.css +552 -0
- package/dist/css/hierarchy-chart.css +298 -0
- package/dist/css/highlight.css +41 -0
- package/dist/css/hover-card.css +233 -0
- package/dist/css/icon.css +225 -0
- package/dist/css/image-cropper.css +373 -0
- package/dist/css/image-viewer.css +588 -0
- package/dist/css/image.css +106 -0
- package/dist/css/infinite-scroll.css +81 -0
- package/dist/css/input-group.css +323 -0
- package/dist/css/json-viewer.css +379 -0
- package/dist/css/kbd.css +72 -0
- package/dist/css/label.css +94 -0
- package/dist/css/layers.css +7 -0
- package/dist/css/layout.css +379 -0
- package/dist/css/liquid.css +106 -0
- package/dist/css/list.css +156 -0
- package/dist/css/listbox.css +395 -0
- package/dist/css/loading-bar.css +144 -0
- package/dist/css/log.css +306 -0
- package/dist/css/markdown-stream.css +149 -0
- package/dist/css/marquee.css +378 -0
- package/dist/css/masonry.css +70 -0
- package/dist/css/matrix-code.css +67 -0
- package/dist/css/mention.css +395 -0
- package/dist/css/menu.css +369 -0
- package/dist/css/menubar.css +461 -0
- package/dist/css/message-feed.css +318 -0
- package/dist/css/navigation-menu.css +513 -0
- package/dist/css/notification.css +865 -0
- package/dist/css/number-animation.css +44 -0
- package/dist/css/number-field.css +275 -0
- package/dist/css/overlay-arrow.css +56 -0
- package/dist/css/page-header.css +221 -0
- package/dist/css/pagination.css +447 -0
- package/dist/css/password-input.css +335 -0
- package/dist/css/pie-chart.css +247 -0
- package/dist/css/pin-input.css +191 -0
- package/dist/css/pointer.css +36 -0
- package/dist/css/popconfirm.css +329 -0
- package/dist/css/popover.css +285 -0
- package/dist/css/progress.css +502 -0
- package/dist/css/prompt-input.css +260 -0
- package/dist/css/question-flow.css +579 -0
- package/dist/css/radar-chart.css +233 -0
- package/dist/css/radio-group.css +663 -0
- package/dist/css/rating.css +311 -0
- package/dist/css/reasoning.css +343 -0
- package/dist/css/reset.css +117 -0
- package/dist/css/resizable.css +242 -0
- package/dist/css/sankey-chart.css +174 -0
- package/dist/css/scroll-area.css +240 -0
- package/dist/css/scrollbar.css +204 -0
- package/dist/css/select.css +616 -0
- package/dist/css/separator.css +140 -0
- package/dist/css/side-nav.css +481 -0
- package/dist/css/signature-pad.css +193 -0
- package/dist/css/skeleton.css +161 -0
- package/dist/css/slider.css +403 -0
- package/dist/css/sortable.css +228 -0
- package/dist/css/sparkline.css +170 -0
- package/dist/css/spinner.css +256 -0
- package/dist/css/splitter.css +159 -0
- package/dist/css/statistic.css +137 -0
- package/dist/css/steps.css +658 -0
- package/dist/css/switch.css +353 -0
- package/dist/css/table.css +1162 -0
- package/dist/css/tabs.css +967 -0
- package/dist/css/tag-group.css +258 -0
- package/dist/css/tag.css +335 -0
- package/dist/css/tags-input.css +341 -0
- package/dist/css/text-field.css +197 -0
- package/dist/css/time-field.css +277 -0
- package/dist/css/time-picker.css +793 -0
- package/dist/css/time-range-picker.css +775 -0
- package/dist/css/timeline.css +440 -0
- package/dist/css/timer.css +123 -0
- package/dist/css/timestamp.css +34 -0
- package/dist/css/toggle-group.css +424 -0
- package/dist/css/toggle.css +146 -0
- package/dist/css/tone.css +189 -0
- package/dist/css/tool-call.css +431 -0
- package/dist/css/toolbar.css +366 -0
- package/dist/css/tooltip.css +217 -0
- package/dist/css/tour.css +446 -0
- package/dist/css/transfer.css +644 -0
- package/dist/css/tree-select.css +878 -0
- package/dist/css/tree.css +734 -0
- package/dist/css/truncate.css +108 -0
- package/dist/css/typography.css +475 -0
- package/dist/css/undefined.css +58 -0
- package/dist/css/virtualizer.css +166 -0
- package/dist/css/visually-hidden.css +20 -0
- package/dist/css/watermark.css +82 -0
- package/dist/family/action-control.css +493 -0
- package/dist/family/chart.css +537 -0
- package/dist/family/check-mark.css +94 -0
- package/dist/family/choice-card.css +97 -0
- package/dist/family/collection-item.css +768 -0
- package/dist/family/field-chrome.css +296 -0
- package/dist/family/loading-ring.css +102 -0
- package/dist/family/material.css +72 -0
- package/dist/family/menu-choice.css +56 -0
- package/dist/family/motion.css +363 -0
- package/dist/family/swatch.css +59 -0
- package/dist/family/tag-list.css +65 -0
- package/family/action-control.css +33 -36
- package/family/chart.css +57 -0
- package/family/collection-item.css +12 -8
- package/family/field-chrome.css +28 -19
- package/family/loading-ring.css +20 -13
- package/family/swatch.css +4 -4
- package/family/tag-list.css +6 -0
- package/index.css +10349 -8756
- package/index.unlayered.css +10350 -8758
- package/package.json +165 -164
package/css/switch.css
CHANGED
|
@@ -17,17 +17,18 @@
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
[data-scope='switch'][data-part='root'] {
|
|
20
|
-
/*
|
|
21
|
-
滑块边长 = 轨道高 − 两条留白,轨道宽 = 两倍轨道高 −
|
|
20
|
+
/* 尺寸档只换轨道高度与留白两个私有槽,其余几何都从它们算出来:
|
|
21
|
+
滑块边长 = 轨道高 − 两条留白,轨道宽 = 两倍轨道高 − 两条留白,滑块行程因此正好等于自身边长。
|
|
22
|
+
md 留白 4px:24px 轨道配 16px 滑块、40px 宽;sm 留白收到 2px,滑块不至于小到点不准 */
|
|
22
23
|
--xh-_switch-track-h: var(--xh-switch-track-h-md);
|
|
23
|
-
--xh-_switch-pad: var(--xh-space-
|
|
24
|
+
--xh-_switch-pad: var(--xh-space-1);
|
|
24
25
|
--xh-_switch-thumb-size: calc(var(--xh-_switch-track-h) - var(--xh-_switch-pad) * 2);
|
|
25
26
|
--xh-_switch-thumb-press-stretch: var(--xh-switch-thumb-press-stretch, var(--xh-motion-distance-sm));
|
|
26
27
|
|
|
27
28
|
/* 选中态轨道色随语气走。没写 data-tone 时 --xh-_tone 没被声明,退回原来的品牌色 */
|
|
28
29
|
--xh-_switch-accent: var(--xh-_tone, var(--xh-bg-brand));
|
|
29
|
-
/*
|
|
30
|
-
--xh-_switch-track-border: var(--xh-switch-border,
|
|
30
|
+
/* 轨道的面就是边界:静息内描边透明;readonly / invalid 才换成有色的一圈,不吃掉滑块行程 */
|
|
31
|
+
--xh-_switch-track-border: var(--xh-switch-border, transparent);
|
|
31
32
|
/* 轨道的面:未选中是 --xh-bg-subtle-active(300)的实体字段控件面;checked / readonly / disabled 换这一支。
|
|
32
33
|
静息已是 300,中性阶梯再无更深一档可换:按下的底缺省仍是轨道静息面(使用者可经 --xh-switch-bg-pressed
|
|
33
34
|
另给),换面的通道由下面滑块的橡皮带拉伸与压平投影承担;选中轨道按下换到语气的 active 档 */
|
|
@@ -35,7 +36,7 @@
|
|
|
35
36
|
--xh-_switch-track-bg-pressed: var(--xh-switch-bg-pressed, var(--xh-_switch-track-bg));
|
|
36
37
|
--xh-_switch-fg: var(--xh-switch-fg, var(--xh-fg-default));
|
|
37
38
|
|
|
38
|
-
/* 轨道接 Action Control text 档(定尺轨道):悬停 / 按下 /
|
|
39
|
+
/* 轨道接 Action Control text 档(定尺轨道):悬停 / 按下 / 禁用面、按压与换底、粗指针热区、
|
|
39
40
|
焦点环与过渡由家族配方给,这里只把轨道的私有槽映射到桥接槽。轨道没有实描边(边界以内描边画,不吃行程),
|
|
40
41
|
边位映射 transparent 并把 border 宽度归零;内描边经 shadow 通道各态同一支。悬停不换面(阶梯只给按下) */
|
|
41
42
|
--xh-action-visual-size: var(--xh-_switch-track-h);
|
|
@@ -132,6 +133,7 @@
|
|
|
132
133
|
/* 缺省档写在上面的基础规则里 */
|
|
133
134
|
[data-scope='switch'][data-part='root'][data-size='sm'] {
|
|
134
135
|
--xh-_switch-track-h: var(--xh-switch-track-h-sm);
|
|
136
|
+
--xh-_switch-pad: var(--xh-space-0_5);
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
[data-scope='switch'][data-part='root'][data-size='lg'] {
|
|
@@ -158,7 +160,7 @@
|
|
|
158
160
|
}
|
|
159
161
|
|
|
160
162
|
/* 滑块是 raised 抬起面(可拖起部件,逐部件登记):--xh-bg-surface-raised 底 + --xh-border-default 描边 +
|
|
161
|
-
--xh-elevation-raised
|
|
163
|
+
--xh-elevation-raised 影(缺省 none),无顶光;描边必须在,影只是加成 */
|
|
162
164
|
[data-scope='switch'][data-part='thumb'] {
|
|
163
165
|
position: relative;
|
|
164
166
|
display: grid;
|
package/css/table.css
CHANGED
|
@@ -28,6 +28,10 @@
|
|
|
28
28
|
--xh-control-indicator-* 一族——五颗把手在自己身上把 --xh-icon-size 改接到方盒的尺,排序钮那支叫 --xh-table-sort-size */
|
|
29
29
|
--xh-icon-size: var(--xh-table-icon-size, var(--xh-glyph-size-md));
|
|
30
30
|
|
|
31
|
+
/* 表头底比行悬停的淡底浅一档:淡底在表体里是悬停与斑马纹的面,表头再取同一档就压得比数据还重。
|
|
32
|
+
取淡底的 55% 兑进承载面,与字段静息底同一档深浅;两端都是实色,吸顶时滚过去的行不会从它底下透出来 */
|
|
33
|
+
--xh-_table-header-bg: color-mix(in srgb, var(--xh-bg-subtle-opaque) 55%, var(--xh-bg-surface));
|
|
34
|
+
|
|
31
35
|
/* 密度档只换这两个私有槽:单元格与列标题从 root 继承前者,字号靠 font-size 本身继承下去,
|
|
32
36
|
换档不必给每个部件各写一条选择器,列宽那套算法也一点不碰 */
|
|
33
37
|
--xh-_table-cell-py: var(--xh-table-cell-py-md);
|
|
@@ -186,7 +190,7 @@
|
|
|
186
190
|
|
|
187
191
|
/* 表头与表体之间是内部分隔,与行间横线同一支:外边才取 default */
|
|
188
192
|
border-block-end: var(--xh-stroke-thin) solid var(--xh-table-header-border, var(--xh-border-subtle));
|
|
189
|
-
background: var(--xh-table-header-bg, var(--xh-
|
|
193
|
+
background: var(--xh-table-header-bg, var(--xh-_table-header-bg));
|
|
190
194
|
}
|
|
191
195
|
|
|
192
196
|
/* 吸顶:滚动容器是 root,表头钉在它的上沿。背景必须是实色——
|
|
@@ -289,7 +293,7 @@
|
|
|
289
293
|
gap: var(--xh-table-cell-gap, var(--xh-control-gap-md));
|
|
290
294
|
min-inline-size: var(--xh-table-cell-min-w, 3rem);
|
|
291
295
|
padding-block: var(--xh-table-cell-py, var(--xh-_table-cell-py));
|
|
292
|
-
padding-inline: var(--xh-table-cell-px, var(--xh-
|
|
296
|
+
padding-inline: var(--xh-table-cell-px, var(--xh-space-4));
|
|
293
297
|
overflow: hidden;
|
|
294
298
|
text-overflow: ellipsis;
|
|
295
299
|
white-space: nowrap;
|
|
@@ -300,9 +304,15 @@
|
|
|
300
304
|
display: none;
|
|
301
305
|
}
|
|
302
306
|
|
|
307
|
+
/* 格子里放的字段族控件(就地编辑的单元格)铺满这一格,与放进 Field 时一样;并排几个就平分,各自的压缩底线照旧 */
|
|
308
|
+
[data-scope='table'][data-part='cell'] {
|
|
309
|
+
--xh-control-w: 100%;
|
|
310
|
+
}
|
|
311
|
+
|
|
303
312
|
[data-scope='table'][data-part='column-header'] {
|
|
304
|
-
|
|
305
|
-
|
|
313
|
+
/* 列头与正文同色、加一档字重:表头靠淡底与字重和表体分开,不再靠淡字 */
|
|
314
|
+
color: var(--xh-table-column-fg, var(--xh-fg-default));
|
|
315
|
+
font-weight: var(--xh-table-column-font-weight, var(--xh-font-weight-medium));
|
|
306
316
|
text-align: start;
|
|
307
317
|
user-select: none;
|
|
308
318
|
}
|
|
@@ -393,7 +403,7 @@
|
|
|
393
403
|
/* 表头行本身透明(露出表头底),吸附的列头继承到的就是透明——得自己带表头底,
|
|
394
404
|
否则横向滚动时其它列头从它下面穿过去 */
|
|
395
405
|
[data-scope='table'][data-part='column-header'][data-frozen] {
|
|
396
|
-
background: var(--xh-table-header-bg, var(--xh-
|
|
406
|
+
background: var(--xh-table-header-bg, var(--xh-_table-header-bg));
|
|
397
407
|
}
|
|
398
408
|
|
|
399
409
|
/* 冻结列的边界:紧挨滚动区的那一列在朝向滚动区的一侧画一道描边,只在确有内容被压住时出现——
|
|
@@ -419,8 +429,8 @@
|
|
|
419
429
|
}
|
|
420
430
|
|
|
421
431
|
/* root 恒报两端(没有冻结列时两端都算贴着);虚拟滚动的行隔着视口,按后代认 */
|
|
422
|
-
[data-scope='table'][data-part='root']:not([data-at-min-horizontal]) :is([data-part='column-header'], [data-part='cell'])[data-frozen-edge][data-frozen='start']::after,
|
|
423
|
-
[data-scope='table'][data-part='root']:not([data-at-max-horizontal]) :is([data-part='column-header'], [data-part='cell'])[data-frozen-edge][data-frozen='end']::after {
|
|
432
|
+
[data-scope='table'][data-part='root']:not([data-at-min-horizontal]) :is([data-part='column-header'], [data-part='cell']):where([data-scope='table'])[data-frozen-edge][data-frozen='start']::after,
|
|
433
|
+
[data-scope='table'][data-part='root']:not([data-at-max-horizontal]) :is([data-part='column-header'], [data-part='cell']):where([data-scope='table'])[data-frozen-edge][data-frozen='end']::after {
|
|
424
434
|
opacity: 1;
|
|
425
435
|
}
|
|
426
436
|
|
|
@@ -457,9 +467,11 @@
|
|
|
457
467
|
background: var(--xh-table-bg, var(--xh-bg-subtle));
|
|
458
468
|
}
|
|
459
469
|
|
|
460
|
-
/*
|
|
470
|
+
/* 竖分隔线:列与列之间一道细线,末列不画。线占的那一截从末端内衬里让出来,格子里放字的宽度与不开竖线时一样:
|
|
471
|
+
否则 60px 的序号列开了竖线只剩 27.33px,「序号」两个字差不到一个像素就出省略号,关掉竖线又放得下 */
|
|
461
472
|
[data-scope='table'][data-part='root'][data-split] [data-scope='table'][data-part='column-header']:not(:last-child),
|
|
462
473
|
[data-scope='table'][data-part='root'][data-split] [data-scope='table'][data-part='cell']:not(:last-child) {
|
|
474
|
+
padding-inline-end: calc(var(--xh-table-cell-px, var(--xh-space-4)) - var(--xh-stroke-thin));
|
|
463
475
|
border-inline-end: var(--xh-stroke-thin) solid var(--xh-table-row-border, var(--xh-border-subtle));
|
|
464
476
|
}
|
|
465
477
|
|
|
@@ -562,7 +574,7 @@
|
|
|
562
574
|
[data-scope='table'][data-part='row-select-trigger'],
|
|
563
575
|
[data-scope='table'][data-part='column-visibility-trigger'] {
|
|
564
576
|
--xh-_table-trigger-bg: transparent;
|
|
565
|
-
--xh-_table-trigger-border: var(--xh-table-trigger-border, var(--xh-border-
|
|
577
|
+
--xh-_table-trigger-border: var(--xh-table-trigger-border, var(--xh-border-strong));
|
|
566
578
|
--xh-_table-trigger-fg: var(--xh-table-trigger-fg, var(--xh-fg-on-brand));
|
|
567
579
|
--xh-action-fg-rest: var(--xh-_table-trigger-fg);
|
|
568
580
|
--xh-action-fg-hover: var(--xh-_table-trigger-fg);
|
|
@@ -1063,7 +1075,7 @@
|
|
|
1063
1075
|
/* 取下一页的按钮:铺满一行摆在表尾——铺满一行的独立动作条目,接 Action Control 的 row 档、
|
|
1064
1076
|
ghost 形态:宽度由容器给、高度随内容、按下只换面不缩放;盒几何、悬停 / 按下 / 禁用面、
|
|
1065
1077
|
焦点环与粗指针热区全由家族给,白底承载 hover 100 → pressed 200。
|
|
1066
|
-
|
|
1078
|
+
这里只把使用者槽映射到桥接槽,文案居中写在下一条 */
|
|
1067
1079
|
[data-scope='table'][data-part='load-more-trigger'] {
|
|
1068
1080
|
--xh-action-gap: var(--xh-table-load-more-trigger-gap, var(--xh-space-2));
|
|
1069
1081
|
--xh-action-padding-block: var(--xh-table-load-more-trigger-py, var(--xh-space-3));
|
|
@@ -1075,12 +1087,17 @@
|
|
|
1075
1087
|
--xh-action-fg-pressed: var(--xh-table-load-more-trigger-fg, var(--xh-fg-brand-strong));
|
|
1076
1088
|
--xh-action-font-size: var(--xh-table-load-more-trigger-font-size, var(--xh-_table-font-size));
|
|
1077
1089
|
|
|
1078
|
-
justify-content: center;
|
|
1079
|
-
text-align: center;
|
|
1080
1090
|
/* row 档允许换行、高度随内容,折行的文案走正文行高 */
|
|
1081
1091
|
line-height: var(--xh-leading-normal);
|
|
1082
1092
|
}
|
|
1083
1093
|
|
|
1094
|
+
/* 文案居中(单行整段居中,折行逐行居中),盖掉 row 档的靠起始缘排布:它是一行里唯一的东西,
|
|
1095
|
+
靠起始缘会像一条没对齐的行。选择器点名 row 档,有层与无层两份产物里都压得住它 */
|
|
1096
|
+
[data-scope='table'][data-part='load-more-trigger'][data-xh-action-profile='row'] {
|
|
1097
|
+
justify-content: center;
|
|
1098
|
+
text-align: center;
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1084
1101
|
[data-scope='table'][data-part='load-more-trigger'][hidden] {
|
|
1085
1102
|
display: none;
|
|
1086
1103
|
}
|
package/css/tabs.css
CHANGED
|
@@ -17,9 +17,11 @@
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
[data-scope='tabs'][data-part='root'] {
|
|
20
|
-
/* 尺寸档只换这三个私有槽,标签从 root
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
/* 尺寸档只换这三个私有槽,标签从 root 继承它们,换档不必给每个部件各写一条选择器。
|
|
21
|
+
缺省的 line 档是导航:标签带取导航行高(md 40px),标签之间不留缝、横内衬 16px,
|
|
22
|
+
相邻两段文字隔 32px、首个标签的文字离起始边 16px;card / segment 是控件,在各自的形态块里换回控件尺 */
|
|
23
|
+
--xh-_tabs-trigger-h: var(--xh-nav-row-h-md);
|
|
24
|
+
--xh-_tabs-trigger-px: var(--xh-space-4);
|
|
23
25
|
--xh-_tabs-trigger-font-size: var(--xh-control-font-md);
|
|
24
26
|
|
|
25
27
|
/* 缺省是 line 变体:透明标签带,选中项由文字与底部指示条表达。Web Components 升级前还没有
|
|
@@ -32,7 +34,7 @@
|
|
|
32
34
|
--xh-_tabs-list-bg: transparent;
|
|
33
35
|
--xh-_tabs-list-p: var(--xh-space-0);
|
|
34
36
|
--xh-_tabs-list-radius: 0;
|
|
35
|
-
--xh-_tabs-list-border-width:
|
|
37
|
+
--xh-_tabs-list-border-width: var(--xh-stroke-thin);
|
|
36
38
|
--xh-_tabs-trigger-border-width: 0;
|
|
37
39
|
--xh-_tabs-trigger-border: transparent;
|
|
38
40
|
--xh-_tabs-trigger-radius: var(--xh-shape-control);
|
|
@@ -40,7 +42,7 @@
|
|
|
40
42
|
/* 语气落在选中态:指示条与选中标签的文字。
|
|
41
43
|
没写 data-tone 时 --xh-_tone 一族没被声明,两个槽都退回原来的取色 */
|
|
42
44
|
--xh-_tabs-accent: var(--xh-_tone, var(--xh-bg-brand));
|
|
43
|
-
--xh-_tabs-accent-text: var(--xh-_tone-fg, var(--xh-fg-brand
|
|
45
|
+
--xh-_tabs-accent-text: var(--xh-_tone-fg, var(--xh-fg-brand));
|
|
44
46
|
|
|
45
47
|
/* 翻页钮的盖底:标签带放不下时它浮在两端,挪到它底下的那截标签要被盖住。line / card 档的标签带是透明的,
|
|
46
48
|
盖底取 surface;坐在别的面上(画布、淡底面板)时由使用者槽换成所在的面。segment 档取轨道的淡底。
|
|
@@ -65,25 +67,41 @@
|
|
|
65
67
|
/* —— 尺寸 —— */
|
|
66
68
|
/* 缺省档写在上面的基础规则里 */
|
|
67
69
|
[data-scope='tabs'][data-part='root'][data-size='sm'] {
|
|
68
|
-
--xh-_tabs-trigger-h: var(--xh-
|
|
69
|
-
--xh-_tabs-trigger-px: var(--xh-
|
|
70
|
+
--xh-_tabs-trigger-h: var(--xh-nav-row-h-sm);
|
|
71
|
+
--xh-_tabs-trigger-px: var(--xh-space-3);
|
|
70
72
|
--xh-_tabs-trigger-font-size: var(--xh-control-font-sm);
|
|
71
73
|
}
|
|
72
74
|
|
|
73
75
|
[data-scope='tabs'][data-part='root'][data-size='lg'] {
|
|
76
|
+
--xh-_tabs-trigger-h: var(--xh-nav-row-h-lg);
|
|
77
|
+
--xh-_tabs-trigger-px: var(--xh-space-5);
|
|
78
|
+
--xh-_tabs-trigger-font-size: var(--xh-control-font-lg);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* card / segment 的标签是控件:高度与横内衬回到控件尺,三档逐档对齐 */
|
|
82
|
+
[data-scope='tabs'][data-part='root']:is([data-variant='card'], [data-variant='segment']) {
|
|
83
|
+
--xh-_tabs-trigger-h: var(--xh-control-h-md);
|
|
84
|
+
--xh-_tabs-trigger-px: var(--xh-control-px-md);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
[data-scope='tabs'][data-part='root']:is([data-variant='card'], [data-variant='segment'])[data-size='sm'] {
|
|
88
|
+
--xh-_tabs-trigger-h: var(--xh-control-h-sm);
|
|
89
|
+
--xh-_tabs-trigger-px: var(--xh-control-px-sm);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
[data-scope='tabs'][data-part='root']:is([data-variant='card'], [data-variant='segment'])[data-size='lg'] {
|
|
74
93
|
--xh-_tabs-trigger-h: var(--xh-control-h-lg);
|
|
75
94
|
--xh-_tabs-trigger-px: var(--xh-control-px-lg);
|
|
76
|
-
--xh-_tabs-trigger-font-size: var(--xh-control-font-lg);
|
|
77
95
|
}
|
|
78
96
|
|
|
79
97
|
/* —— 变体 —— */
|
|
80
|
-
/*
|
|
98
|
+
/* 主变体的显式写法,与缺省视觉一致:透明标签带与 1px 底部基线,选中项由文字和滑动指示条强调。 */
|
|
81
99
|
[data-scope='tabs'][data-part='root'][data-variant='line'] {
|
|
82
100
|
--xh-_tabs-list-gap: var(--xh-space-0);
|
|
83
101
|
--xh-_tabs-list-bg: transparent;
|
|
84
102
|
--xh-_tabs-list-p: var(--xh-space-0);
|
|
85
103
|
--xh-_tabs-list-radius: 0;
|
|
86
|
-
--xh-_tabs-list-border-width:
|
|
104
|
+
--xh-_tabs-list-border-width: var(--xh-stroke-thin);
|
|
87
105
|
--xh-_tabs-trigger-border-width: 0;
|
|
88
106
|
--xh-_tabs-trigger-border: transparent;
|
|
89
107
|
--xh-_tabs-trigger-radius: var(--xh-shape-control);
|
|
@@ -115,7 +133,8 @@
|
|
|
115
133
|
[data-scope='tabs'][data-part='root'][data-variant='segment'] {
|
|
116
134
|
--xh-_tabs-list-gap: var(--xh-space-0_5);
|
|
117
135
|
--xh-_tabs-list-bg: var(--xh-bg-subtle);
|
|
118
|
-
|
|
136
|
+
/* 轨道内衬 2px:滑块的 control 圆角不得大于轨道 surface 圆角减去内衬 */
|
|
137
|
+
--xh-_tabs-list-p: var(--xh-space-0_5);
|
|
119
138
|
--xh-_tabs-list-radius: var(--xh-shape-surface);
|
|
120
139
|
--xh-_tabs-list-border-width: 0;
|
|
121
140
|
--xh-_tabs-trigger-border-width: var(--xh-stroke-thin);
|
|
@@ -476,7 +495,8 @@
|
|
|
476
495
|
/* 摆在行首,落点交给 transform(只走合成),长度跟着标签宽走。标签带挪动时整条孩子
|
|
477
496
|
共用的 translate 叠在它之上,两者互不覆盖,过渡也只挂在 transform 上 */
|
|
478
497
|
position: absolute;
|
|
479
|
-
|
|
498
|
+
/* line 档标签带底边有一道 1px 基线,指示条压在它上面而不是悬在它上方 */
|
|
499
|
+
inset-block-end: calc(-1 * var(--xh-_tabs-list-border-width));
|
|
480
500
|
inset-inline-start: 0;
|
|
481
501
|
inline-size: var(--xh-_tabs-indicator-w);
|
|
482
502
|
block-size: var(--xh-tabs-indicator-thickness, var(--xh-stroke-thick));
|
|
@@ -736,6 +756,8 @@
|
|
|
736
756
|
grid-column: 2;
|
|
737
757
|
align-self: center;
|
|
738
758
|
margin-inline-start: var(--xh-space-1);
|
|
759
|
+
/* line 档标签带底边多一道基线,这一行比标签高出它的厚度:钮让出同样一截,居中才落在标签的中线上 */
|
|
760
|
+
margin-block-end: var(--xh-_tabs-list-border-width);
|
|
739
761
|
}
|
|
740
762
|
|
|
741
763
|
/* 竖排:标签带与钮上下叠成左侧一列(钮在列尾),面板占右侧那一轨、跨两行 */
|
|
@@ -764,6 +786,7 @@
|
|
|
764
786
|
align-self: auto;
|
|
765
787
|
margin-inline-start: 0;
|
|
766
788
|
margin-block-start: var(--xh-space-1);
|
|
789
|
+
margin-block-end: 0;
|
|
767
790
|
}
|
|
768
791
|
|
|
769
792
|
/* 钮本身:接 Action Control icon 档 ghost 面(连接层投影 profile / variant / size),盒取标签同高的正方形,
|
package/css/tag-group.css
CHANGED
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
display: flex;
|
|
41
41
|
flex-wrap: wrap;
|
|
42
42
|
align-items: center;
|
|
43
|
-
gap: var(--xh-tag-group-list-gap, var(--xh-space-
|
|
43
|
+
gap: var(--xh-tag-group-list-gap, var(--xh-space-2));
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
[data-scope='tag-group'][data-part='list'][hidden] {
|
|
@@ -88,13 +88,13 @@
|
|
|
88
88
|
cursor: pointer;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
/*
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
/* 按下去要有回应:可选的芯片是一颗定尺的离散控件,按下换底并取按压缩放,松手即弹回。
|
|
92
|
+
标签静息就是淡底,按淡底阶梯走 hover 200 → pressed 300;无壳档静息透明,走白底阶梯(见下)。
|
|
93
|
+
置灰的不压;指针 :active 与 Headless 投影的 data-pressed 看见同一副按压面 */
|
|
94
94
|
[data-scope='tag-group'][data-part='list']
|
|
95
95
|
> [data-scope='tag'][data-part='root'][data-selectable]:not([data-disabled]):not([data-variant='solid']):is(:active, [data-pressed]) {
|
|
96
96
|
scale: var(--xh-motion-scale-press);
|
|
97
|
-
background: var(--xh-tag-group-item-bg-pressed, var(--xh-bg-subtle-
|
|
97
|
+
background: var(--xh-tag-group-item-bg-pressed, var(--xh-bg-subtle-active));
|
|
98
98
|
transition-duration: var(--xh-motion-duration-press);
|
|
99
99
|
transition-timing-function: var(--xh-motion-ease-press);
|
|
100
100
|
}
|
|
@@ -122,15 +122,26 @@
|
|
|
122
122
|
background: var(--xh-tag-group-item-bg-pressed-solid, var(--xh-_tone-active, var(--xh-bg-brand-active)));
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
/*
|
|
125
|
+
/* 悬停与键盘锚点共用一档:标签静息淡底,hover 升到 200(与静息同为 100 就看不出悬停)。
|
|
126
126
|
data-highlighted 跟的是连接层记的焦点标签,与选中互相独立。
|
|
127
127
|
实心标签不进这里:它的字是实心底上配对的那支前景色,换成灰底就读不出来了;
|
|
128
128
|
实心档在这两档里面不换,回执落在按压缩放与聚焦环上 */
|
|
129
129
|
[data-scope='tag-group'][data-part='list']
|
|
130
130
|
> [data-scope='tag'][data-part='root']:not([data-disabled]):not([data-variant='solid']):is(:hover, [data-highlighted]) {
|
|
131
|
+
background: var(--xh-tag-group-item-bg-hover, var(--xh-bg-subtle-hover));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* 无壳档静息透明,坐在白底上:hover 100 → pressed 200 */
|
|
135
|
+
[data-scope='tag-group'][data-part='list']
|
|
136
|
+
> [data-scope='tag'][data-part='root'][data-variant='ghost']:not([data-tone]):not([data-disabled]):is(:hover, [data-highlighted]) {
|
|
131
137
|
background: var(--xh-tag-group-item-bg-hover, var(--xh-bg-subtle));
|
|
132
138
|
}
|
|
133
139
|
|
|
140
|
+
[data-scope='tag-group'][data-part='list']
|
|
141
|
+
> [data-scope='tag'][data-part='root'][data-variant='ghost'][data-selectable]:not([data-tone]):not([data-disabled]):is(:active, [data-pressed]) {
|
|
142
|
+
background: var(--xh-tag-group-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
143
|
+
}
|
|
144
|
+
|
|
134
145
|
[data-scope='tag-group'][data-part='list']
|
|
135
146
|
> [data-scope='tag'][data-part='root'][data-tone]:not([data-disabled]):not([data-variant='solid']):is(:hover, [data-highlighted]) {
|
|
136
147
|
background: var(--xh-tag-group-item-bg-hover, var(--xh-_tone-subtle-hover, var(--xh-bg-subtle)));
|
package/css/tag.css
CHANGED
|
@@ -19,11 +19,13 @@
|
|
|
19
19
|
/* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
|
|
20
20
|
--xh-icon-size: var(--xh-tag-icon-size, var(--xh-glyph-size-text));
|
|
21
21
|
|
|
22
|
-
/*
|
|
22
|
+
/* 尺寸档只换这几个私有槽,下面的声明从它们取值。块尺寸按状态 chip 的档取(sm / md / lg = 20 / 24 / 28),
|
|
23
|
+
竖向内衬为 0、字在盒里居中;行框是标签里那一行的高,取指示符档,关闭钮按它对齐 */
|
|
23
24
|
--xh-_tag-gap: var(--xh-space-1);
|
|
24
25
|
--xh-_tag-px: var(--xh-space-2);
|
|
25
|
-
--xh-_tag-py:
|
|
26
|
-
--xh-_tag-
|
|
26
|
+
--xh-_tag-py: 0;
|
|
27
|
+
--xh-_tag-h: var(--xh-chip-h-md);
|
|
28
|
+
--xh-_tag-font-size: var(--xh-text-caption-size);
|
|
27
29
|
--xh-_tag-line-h: var(--xh-control-indicator-md);
|
|
28
30
|
|
|
29
31
|
display: inline-flex;
|
|
@@ -33,12 +35,14 @@
|
|
|
33
35
|
gap: var(--xh-tag-gap, var(--xh-_tag-gap));
|
|
34
36
|
padding-inline: var(--xh-tag-px, var(--xh-_tag-px));
|
|
35
37
|
padding-block: var(--xh-tag-py, var(--xh-_tag-py));
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
min-block-size: var(--xh-tag-h, var(--xh-_tag-h));
|
|
39
|
+
box-sizing: border-box;
|
|
40
|
+
/* 缺省是一块淡底的小方签:无边、无影,圆角与控件同档 */
|
|
41
|
+
border: var(--xh-stroke-thin) solid var(--xh-tag-border, transparent);
|
|
42
|
+
border-radius: var(--xh-tag-radius, var(--xh-shape-control));
|
|
43
|
+
background: var(--xh-tag-bg, var(--xh-bg-subtle));
|
|
44
|
+
box-shadow: var(--xh-tag-shadow, none);
|
|
45
|
+
color: var(--xh-tag-fg, var(--xh-fg-default));
|
|
42
46
|
font-size: var(--xh-tag-font-size, var(--xh-_tag-font-size));
|
|
43
47
|
font-weight: var(--xh-tag-font-weight, var(--xh-font-weight-medium));
|
|
44
48
|
/* 行框不低于关闭钮,有没有关闭钮同档标签一样高;
|
|
@@ -138,15 +142,12 @@
|
|
|
138
142
|
再是写了语气时的覆盖。语气槽会沿继承流下来,覆盖那条必须带 [data-tone] 限定,
|
|
139
143
|
否则一枚没写语气的标签只要落在带 data-tone 的容器里(警告提示、吐司、按钮内)
|
|
140
144
|
就会跟着染色。
|
|
141
|
-
|
|
142
|
-
换语气时高光跟着换 */
|
|
145
|
+
实心档是平的一块底,不画高光与投影 */
|
|
143
146
|
[data-scope='tag'][data-part='root'][data-variant='solid'] {
|
|
144
|
-
--xh-_tag-highlight: var(--xh-_highlight-brand);
|
|
145
|
-
|
|
146
147
|
border-color: transparent;
|
|
147
148
|
background: var(--xh-tag-bg, var(--xh-bg-brand));
|
|
148
149
|
color: var(--xh-tag-fg, var(--xh-fg-on-brand));
|
|
149
|
-
box-shadow: var(--xh-tag-shadow,
|
|
150
|
+
box-shadow: var(--xh-tag-shadow, none);
|
|
150
151
|
}
|
|
151
152
|
|
|
152
153
|
/* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
|
|
@@ -164,41 +165,42 @@
|
|
|
164
165
|
}
|
|
165
166
|
|
|
166
167
|
[data-scope='tag'][data-part='root'][data-variant='solid'][data-tone] {
|
|
167
|
-
--xh-_tag-highlight: var(--xh-_highlight-tone);
|
|
168
|
-
|
|
169
168
|
background: var(--xh-tag-bg, var(--xh-_tone, var(--xh-bg-brand)));
|
|
170
169
|
color: var(--xh-tag-fg, var(--xh-_tone-on, var(--xh-fg-on-brand)));
|
|
171
170
|
}
|
|
172
171
|
|
|
173
172
|
/* 实心档是一块彩色面(连接层打 data-xh-ink-surface):面内的图标与作者内容按这块底取墨色。
|
|
174
|
-
|
|
175
|
-
|
|
173
|
+
底色随语气与禁用换,这里跟着换。连接层只在实心档投影这个标记,选择器与形态写在一起,
|
|
174
|
+
别的形态(淡底、描边)的面不会被当成这块底去选墨 */
|
|
175
|
+
[data-scope='tag'][data-part='root'][data-variant='solid'][data-xh-ink-surface] {
|
|
176
176
|
--xh-ink-surface: var(--xh-tag-bg, var(--xh-bg-brand));
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
-
[data-scope='tag'][data-part='root'][data-xh-ink-surface][data-tone] {
|
|
179
|
+
[data-scope='tag'][data-part='root'][data-variant='solid'][data-xh-ink-surface][data-tone] {
|
|
180
180
|
--xh-ink-surface: var(--xh-tag-bg, var(--xh-_tone, var(--xh-bg-brand)));
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
[data-scope='tag'][data-part='root'][data-xh-ink-surface][data-disabled] {
|
|
183
|
+
[data-scope='tag'][data-part='root'][data-variant='solid'][data-xh-ink-surface][data-disabled] {
|
|
184
184
|
/* 置灰面是墨色淡底:选墨只看分量、不看透明度,取它的不透明档 */
|
|
185
185
|
--xh-ink-surface: var(--xh-tag-bg-disabled, var(--xh-bg-muted-opaque));
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
[data-scope='tag'][data-part='root'][data-variant='subtle'] {
|
|
189
|
-
border-color: var(--xh-tag-border,
|
|
190
|
-
background: var(--xh-tag-bg, var(--xh-
|
|
191
|
-
color: var(--xh-tag-fg, var(--xh-
|
|
189
|
+
border-color: var(--xh-tag-border, transparent);
|
|
190
|
+
background: var(--xh-tag-bg, var(--xh-bg-subtle));
|
|
191
|
+
color: var(--xh-tag-fg, var(--xh-fg-default));
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
|
|
194
|
+
/* 没写形态与 subtle 同一副:写了语气就换语气淡底与语气字 */
|
|
195
|
+
[data-scope='tag'][data-part='root']:is(:not([data-variant]), [data-variant='subtle'])[data-tone] {
|
|
195
196
|
background: var(--xh-tag-bg, var(--xh-_tone-subtle, var(--xh-bg-subtle)));
|
|
196
197
|
color: var(--xh-tag-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
|
|
197
198
|
}
|
|
198
199
|
|
|
200
|
+
/* 描边档在淡底上再加一道边:边是这一档唯一多出来的东西 */
|
|
199
201
|
[data-scope='tag'][data-part='root'][data-variant='outline'] {
|
|
200
202
|
border-color: var(--xh-tag-border, var(--xh-border-default));
|
|
201
|
-
background:
|
|
203
|
+
background: var(--xh-tag-bg, var(--xh-bg-subtle));
|
|
202
204
|
box-shadow: none;
|
|
203
205
|
color: var(--xh-tag-fg, var(--xh-fg-default));
|
|
204
206
|
}
|
|
@@ -207,6 +209,7 @@
|
|
|
207
209
|
兑了底色的 --xh-_tone-border 六族都在 1.44-2.18,当轮廓看不清 */
|
|
208
210
|
[data-scope='tag'][data-part='root'][data-variant='outline'][data-tone] {
|
|
209
211
|
border-color: var(--xh-tag-border, var(--xh-_tone-border-control, var(--xh-border-default)));
|
|
212
|
+
background: var(--xh-tag-bg, var(--xh-_tone-subtle, var(--xh-bg-subtle)));
|
|
210
213
|
color: var(--xh-tag-fg, var(--xh-_tone-fg, var(--xh-fg-default)));
|
|
211
214
|
}
|
|
212
215
|
|
|
@@ -226,18 +229,40 @@
|
|
|
226
229
|
[data-scope='tag'][data-part='root'][data-size='sm'] {
|
|
227
230
|
--xh-_tag-gap: var(--xh-space-0_5);
|
|
228
231
|
--xh-_tag-px: var(--xh-space-1_5);
|
|
229
|
-
--xh-_tag-
|
|
230
|
-
--xh-_tag-font-size: var(--xh-text-caption-size);
|
|
232
|
+
--xh-_tag-h: var(--xh-chip-h-sm);
|
|
231
233
|
}
|
|
232
234
|
|
|
233
|
-
/*
|
|
235
|
+
/* 大档换正文字号、行框上到指示符的大档;关闭钮不换档 */
|
|
234
236
|
[data-scope='tag'][data-part='root'][data-size='lg'] {
|
|
235
237
|
--xh-_tag-gap: var(--xh-space-1_5);
|
|
236
|
-
--xh-_tag-
|
|
238
|
+
--xh-_tag-h: var(--xh-chip-h-lg);
|
|
237
239
|
--xh-_tag-font-size: var(--xh-text-body-size);
|
|
238
240
|
--xh-_tag-line-h: var(--xh-control-indicator-lg);
|
|
239
241
|
}
|
|
240
242
|
|
|
243
|
+
/* —— 字段里的已选标签 —— */
|
|
244
|
+
/* 坐在字段盒里的标签(Select / Combobox / Cascader / TreeSelect / 各类 Picker 的标签行与 TagsInput)是已选值的摘要:
|
|
245
|
+
大档字段里字号也钉在说明档,换成正文字号会与输入的文字抢层级。排在尺寸档之后,同特指度下压得住 */
|
|
246
|
+
:where([data-xh-field-chrome]) [data-scope='tag'][data-part='root'][data-size='lg'] {
|
|
247
|
+
--xh-_tag-font-size: var(--xh-text-caption-size);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/* 盒没聚焦时铺着字段淡底,淡底标签几乎化进底里:换成白底 + 缺省描边一枚枚立出来,叉的悬停 / 按下随之
|
|
251
|
+
走白底阶梯 100 → 200;聚焦后盒换成白色承载面,标签回到自己的淡底。禁用的盒不换(标签照禁用档置灰),
|
|
252
|
+
写了语气的、实心与无壳的标签保留自己的面;--xh-tag-* 覆盖槽照旧优先 */
|
|
253
|
+
:where([data-xh-field-chrome]:not(:focus-within):not([data-disabled])) [data-scope='tag'][data-part='root']:is(:not([data-variant]), [data-variant='subtle'], [data-variant='outline']):not([data-tone], [data-disabled]) {
|
|
254
|
+
border-color: var(--xh-tag-border, var(--xh-border-default));
|
|
255
|
+
background: var(--xh-tag-bg, var(--xh-bg-surface));
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
:where([data-xh-field-chrome]:not(:focus-within):not([data-disabled])) [data-scope='tag'][data-part='root']:is(:not([data-variant]), [data-variant='subtle'], [data-variant='outline']):not([data-tone], [data-disabled]) [data-scope='tag'][data-part='close-trigger']:hover:not(:disabled) {
|
|
259
|
+
background: var(--xh-tag-close-bg-hover, var(--xh-bg-subtle));
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
:where([data-xh-field-chrome]:not(:focus-within):not([data-disabled])) [data-scope='tag'][data-part='root']:is(:not([data-variant]), [data-variant='subtle'], [data-variant='outline']):not([data-tone], [data-disabled]) [data-scope='tag'][data-part='close-trigger']:not(:disabled):is(:active, [data-pressed]) {
|
|
263
|
+
background: var(--xh-tag-close-bg-active, var(--xh-bg-subtle-hover));
|
|
264
|
+
}
|
|
265
|
+
|
|
241
266
|
/* —— 禁用 —— */
|
|
242
267
|
/* 排在形态之后,靠源序压过形态给的配色。第二条选择器专为写了语气的标签而设:
|
|
243
268
|
语气覆盖那几条比第一条多一个属性,不把 [data-tone] 一起写上,
|
package/css/tags-input.css
CHANGED
|
@@ -22,15 +22,17 @@
|
|
|
22
22
|
/* 作者塞进来的图标跟着控件的尺寸档走;它自己写了 size 时仍以作者的为准 */
|
|
23
23
|
--xh-icon-size: var(--xh-tags-input-icon-size, var(--xh-glyph-size-md));
|
|
24
24
|
|
|
25
|
-
/*
|
|
25
|
+
/* 尺寸档只换这几个私有槽,标题、框、输入框与就地编辑框都从 root 继承它们,
|
|
26
26
|
换档不必给每个部件各写一条选择器。标签本身是 tag,档位由 data-size 传下去,不走这些槽;
|
|
27
|
-
|
|
27
|
+
就地编辑框的块尺寸、行框、内衬与字号照 tag 那一档写(块尺寸取状态 chip 档、竖向内衬为 0),
|
|
28
|
+
换进换出时与标签一样高 */
|
|
28
29
|
--xh-_tags-input-control-h: var(--xh-control-h-md);
|
|
29
30
|
--xh-_tags-input-control-px: var(--xh-control-px-md);
|
|
30
|
-
--xh-_tags-input-control-gap: var(--xh-
|
|
31
|
+
--xh-_tags-input-control-gap: var(--xh-space-1);
|
|
31
32
|
--xh-_tags-input-input-font-size: var(--xh-control-font-md);
|
|
32
33
|
--xh-_tags-input-item-font-size: var(--xh-control-caption-md);
|
|
33
|
-
--xh-_tags-input-item-
|
|
34
|
+
--xh-_tags-input-item-h: var(--xh-chip-h-md);
|
|
35
|
+
--xh-_tags-input-item-py: 0;
|
|
34
36
|
--xh-_tags-input-item-px: var(--xh-space-2);
|
|
35
37
|
--xh-_tags-input-item-line-h: var(--xh-control-indicator-md);
|
|
36
38
|
/* 光标走到的那颗标签是「当前项」,不是选中:淡底 + 淡底前景,随语气走。
|
|
@@ -58,10 +60,9 @@
|
|
|
58
60
|
--xh-icon-size: var(--xh-tags-input-icon-size, var(--xh-glyph-size-sm));
|
|
59
61
|
--xh-_tags-input-control-h: var(--xh-control-h-sm);
|
|
60
62
|
--xh-_tags-input-control-px: var(--xh-control-px-sm);
|
|
61
|
-
--xh-_tags-input-control-gap: var(--xh-control-gap-sm);
|
|
62
63
|
--xh-_tags-input-input-font-size: var(--xh-control-font-sm);
|
|
63
64
|
--xh-_tags-input-item-font-size: var(--xh-control-caption-sm);
|
|
64
|
-
--xh-_tags-input-item-
|
|
65
|
+
--xh-_tags-input-item-h: var(--xh-chip-h-sm);
|
|
65
66
|
--xh-_tags-input-item-px: var(--xh-space-1_5);
|
|
66
67
|
}
|
|
67
68
|
|
|
@@ -69,21 +70,23 @@
|
|
|
69
70
|
--xh-icon-size: var(--xh-tags-input-icon-size, var(--xh-glyph-size-lg));
|
|
70
71
|
--xh-_tags-input-control-h: var(--xh-control-h-lg);
|
|
71
72
|
--xh-_tags-input-control-px: var(--xh-control-px-lg);
|
|
72
|
-
--xh-_tags-input-control-gap: var(--xh-control-gap-lg);
|
|
73
73
|
--xh-_tags-input-input-font-size: var(--xh-control-font-lg);
|
|
74
74
|
--xh-_tags-input-item-font-size: var(--xh-control-caption-lg);
|
|
75
|
+
--xh-_tags-input-item-h: var(--xh-chip-h-lg);
|
|
75
76
|
--xh-_tags-input-item-px: var(--xh-space-3);
|
|
76
77
|
--xh-_tags-input-item-line-h: var(--xh-control-indicator-lg);
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
[data-scope='tags-input'][data-part='label'] {
|
|
80
|
-
|
|
81
|
+
/* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-tags-input-label-gap 给多少最终就是多少 */
|
|
82
|
+
margin-block-end: calc(var(--xh-tags-input-label-gap, var(--xh-space-2)) - var(--xh-tags-input-gap, var(--xh-space-1)));
|
|
83
|
+
color: var(--xh-tags-input-label-fg, var(--xh-fg-muted));
|
|
81
84
|
font-size: var(--xh-tags-input-label-font-size, var(--xh-text-label-size));
|
|
82
85
|
font-weight: var(--xh-tags-input-label-font-weight, var(--xh-text-label-weight));
|
|
83
86
|
}
|
|
84
87
|
|
|
85
88
|
[data-scope='tags-input'][data-part='label'][data-disabled] {
|
|
86
|
-
color: var(--xh-tags-input-label-fg-disabled, var(--xh-fg-
|
|
89
|
+
color: var(--xh-tags-input-label-fg-disabled, var(--xh-fg-muted));
|
|
87
90
|
}
|
|
88
91
|
|
|
89
92
|
/* 标签换行排,输入框跟在最后一个标签后面:描边、底色、圆角、聚焦环、五态与悬停由 Field Chrome
|
|
@@ -104,8 +107,6 @@
|
|
|
104
107
|
--xh-field-border-hover: var(--xh-tags-input-control-border-hover, var(--xh-_field-variant-border-hover));
|
|
105
108
|
--xh-field-border-focus: var(--xh-tags-input-control-border-focus, var(--xh-_field-variant-border-focus));
|
|
106
109
|
--xh-field-border-invalid: var(--xh-tags-input-control-border-invalid, var(--xh-_field-variant-border-invalid));
|
|
107
|
-
--xh-field-ring-focus: var(--xh-ring-focus);
|
|
108
|
-
--xh-field-ring-invalid: var(--xh-ring-invalid);
|
|
109
110
|
--xh-field-shadow-rest: var(--xh-tags-input-control-shadow, none);
|
|
110
111
|
--xh-field-cursor-read-only: default;
|
|
111
112
|
/* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
|
|
@@ -123,6 +124,12 @@
|
|
|
123
124
|
display: none;
|
|
124
125
|
}
|
|
125
126
|
|
|
127
|
+
/* 盒里有标签时起始内衬收到 --xh-space-1,标签之间、标签与输入框之间隔 --xh-space-1(盒的 gap 缺省就是它):
|
|
128
|
+
标签自带内距,行首再留一整段控件内衬就显得空。标签自己的面(没聚焦时白底 + 描边)写在 tag.css 的字段宿主档 */
|
|
129
|
+
[data-scope='tags-input'][data-part='control']:has(> [data-scope='tags-input'][data-part='item']) {
|
|
130
|
+
padding-inline-start: var(--xh-tags-input-control-ps, var(--xh-space-1));
|
|
131
|
+
}
|
|
132
|
+
|
|
126
133
|
/* 顶到上限是 TagsInput 独有状态:再加进不去,边框先给个提示;invalid 同时出现时由 Field Chrome 的
|
|
127
134
|
错误态优先——真出错比"装满了"要紧 */
|
|
128
135
|
[data-scope='tags-input'][data-part='control'][data-at-max]:not([data-invalid]) {
|
|
@@ -161,7 +168,7 @@
|
|
|
161
168
|
|
|
162
169
|
/* 新落下的标签原地弹出,同一批按到达顺序错开;首帧就在的直接呈现(自己或 control 带 data-instant)。
|
|
163
170
|
横排胶囊不用竖向上浮:与来源方向不符,还会探出字段外壳的底边 */
|
|
164
|
-
[data-scope='tags-input'][data-part='item']:not([data-instant], [data-instant] >
|
|
171
|
+
[data-scope='tags-input'][data-part='item']:not([data-instant], [data-instant] > :where([data-scope='tags-input'])) {
|
|
165
172
|
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards;
|
|
166
173
|
animation-delay: calc(var(--xh-_stagger-index, 0) * var(--xh-motion-stagger-step));
|
|
167
174
|
}
|
|
@@ -207,11 +214,13 @@
|
|
|
207
214
|
inline-size: auto;
|
|
208
215
|
min-inline-size: 3ch;
|
|
209
216
|
max-inline-size: 100%;
|
|
217
|
+
box-sizing: border-box;
|
|
218
|
+
min-block-size: var(--xh-tags-input-item-h, var(--xh-_tags-input-item-h));
|
|
210
219
|
padding-block: var(--xh-tags-input-item-py, var(--xh-_tags-input-item-py));
|
|
211
220
|
padding-inline: var(--xh-tags-input-item-px, var(--xh-_tags-input-item-px));
|
|
212
221
|
border: var(--xh-stroke-thin) solid var(--xh-tags-input-item-input-border, var(--xh-border-control));
|
|
213
222
|
border-radius: var(--xh-tags-input-item-radius, var(--xh-shape-control));
|
|
214
|
-
background: var(--xh-tags-input-item-input-bg, var(--xh-bg-
|
|
223
|
+
background: var(--xh-tags-input-item-input-bg, var(--xh-bg-field));
|
|
215
224
|
color: var(--xh-tags-input-item-input-fg, var(--xh-fg-default));
|
|
216
225
|
font-family: inherit;
|
|
217
226
|
font-size: var(--xh-tags-input-item-font-size, var(--xh-_tags-input-item-font-size));
|
|
@@ -219,16 +228,20 @@
|
|
|
219
228
|
line-height: max(calc(var(--xh-leading-none) * 1em), var(--xh-_tags-input-item-line-h));
|
|
220
229
|
}
|
|
221
230
|
|
|
222
|
-
/*
|
|
223
|
-
外层 control
|
|
231
|
+
/* 它是真正持有焦点的那个节点,照字段外壳标出焦点:换承载面底 + 品牌描边,不画环;
|
|
232
|
+
外层 control 同时按 :focus-within 换成聚焦面,两层一起说明焦点在框内 */
|
|
233
|
+
[data-scope='tags-input'][data-part='item-input']:focus-within {
|
|
234
|
+
border-color: var(--xh-tags-input-item-input-border-focus, var(--xh-border-control-focus));
|
|
235
|
+
background: var(--xh-tags-input-item-input-bg-focus, var(--xh-bg-surface));
|
|
236
|
+
}
|
|
237
|
+
|
|
224
238
|
[data-scope='tags-input'][data-part='item-input']:focus-visible {
|
|
225
|
-
outline:
|
|
226
|
-
outline-offset: var(--xh-ring-offset);
|
|
239
|
+
outline: none;
|
|
227
240
|
}
|
|
228
241
|
|
|
229
|
-
/*
|
|
230
|
-
[data-scope='tags-input'][data-part='control'][data-invalid] [data-scope='tags-input'][data-part='item-input']
|
|
231
|
-
|
|
242
|
+
/* 校验失败时描边跟着外框换无效色,两层相邻不至于一红一蓝 */
|
|
243
|
+
[data-scope='tags-input'][data-part='control'][data-invalid] [data-scope='tags-input'][data-part='item-input'] {
|
|
244
|
+
border-color: var(--xh-tags-input-item-input-border-invalid, var(--xh-border-invalid));
|
|
232
245
|
}
|
|
233
246
|
|
|
234
247
|
[data-scope='tags-input'][data-part='item-input']:disabled {
|
|
@@ -318,5 +331,11 @@
|
|
|
318
331
|
[data-scope='tags-input'][data-part='clear-trigger'][data-disabled]:empty::before {
|
|
319
332
|
background-color: GrayText;
|
|
320
333
|
}
|
|
334
|
+
|
|
335
|
+
/* 就地编辑框聚焦不画环、描边又被换成系统色,补一圈 Highlight 环 */
|
|
336
|
+
[data-scope='tags-input'][data-part='item-input']:focus {
|
|
337
|
+
outline: var(--xh-ring-width) solid Highlight;
|
|
338
|
+
outline-offset: var(--xh-ring-offset);
|
|
339
|
+
}
|
|
321
340
|
}
|
|
322
341
|
}
|