@xihan-ui/styles 1.0.0 → 2.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 +5146 -6
- package/README.md +22 -2
- package/component-tokens.d.ts +4212 -0
- package/component-tokens.js +2 -0
- package/components.tokens.json +80116 -0
- package/css/accordion.css +131 -75
- package/css/affix.css +16 -1
- package/css/alert.css +114 -67
- package/css/anchor.css +99 -27
- package/css/approval.css +461 -0
- package/css/avatar-group.css +14 -6
- package/css/avatar.css +33 -9
- package/css/back-top.css +103 -48
- package/css/badge.css +42 -14
- package/css/bar-code.css +62 -0
- package/css/breadcrumb.css +40 -21
- package/css/button-group.css +146 -24
- package/css/button.css +116 -99
- package/css/calendar-picker.css +448 -0
- package/css/calendar-range-picker.css +517 -0
- package/css/card.css +54 -77
- package/css/carousel.css +412 -68
- package/css/cascader.css +429 -246
- package/css/checkbox-group.css +225 -77
- package/css/checkbox.css +174 -37
- package/css/clipboard.css +266 -47
- package/css/code-view.css +279 -0
- package/css/collapsible.css +108 -63
- package/css/color-field.css +158 -0
- package/css/color-picker.css +172 -184
- package/css/color-slider.css +274 -0
- package/css/color-swatch-picker.css +243 -0
- package/css/color-swatch.css +35 -0
- package/css/combobox.css +267 -273
- package/css/command.css +399 -0
- package/css/context-menu.css +183 -108
- package/css/date-field.css +94 -121
- package/css/date-picker.css +486 -249
- package/css/date-range-picker.css +559 -0
- package/css/description.css +51 -0
- package/css/descriptions.css +133 -87
- package/css/dialog.css +247 -68
- package/css/diff-view.css +428 -0
- package/css/download-trigger.css +155 -46
- package/css/drawer.css +194 -111
- package/css/editable.css +172 -152
- package/css/empty-state.css +80 -11
- package/css/field-array.css +190 -0
- package/css/field.css +84 -31
- package/css/fieldset.css +51 -18
- package/css/file-upload.css +134 -36
- package/css/flex.css +20 -1
- package/css/float-button.css +238 -57
- package/css/floating-panel.css +173 -92
- package/css/focus.css +46 -0
- package/css/forced-colors.css +93 -0
- package/css/form.css +254 -77
- package/css/gradient-text.css +34 -10
- package/css/grid.css +516 -5
- package/css/heatmap.css +87 -29
- package/css/highlight.css +20 -5
- package/css/hover-card.css +97 -47
- package/css/icon-wrapper.css +15 -3
- package/css/icon.css +74 -8
- package/css/image-cropper.css +143 -29
- package/css/image-viewer.css +150 -89
- package/css/image.css +30 -1
- package/css/infinite-scroll.css +51 -1
- package/css/input-group.css +277 -0
- package/css/json-viewer.css +102 -45
- package/css/kbd.css +72 -0
- package/css/label.css +78 -0
- package/css/layers.css +5 -0
- package/css/layout.css +175 -31
- package/css/list.css +24 -3
- package/css/listbox.css +208 -67
- package/css/loading-bar.css +52 -3
- package/css/log.css +144 -9
- package/css/markdown-stream.css +149 -0
- package/css/marquee.css +27 -1
- package/css/masonry.css +7 -0
- package/css/matrix-code.css +67 -0
- package/css/mention.css +234 -152
- package/css/menu.css +180 -83
- package/css/menubar.css +204 -136
- package/css/message-feed.css +197 -0
- package/css/navigation-menu.css +144 -90
- package/css/notification.css +178 -100
- package/css/number-animation.css +7 -0
- package/css/number-field.css +120 -277
- package/css/overlay-arrow.css +12 -7
- package/css/page-header.css +99 -14
- package/css/pagination.css +175 -135
- package/css/password-input.css +222 -219
- package/css/pin-input.css +101 -67
- package/css/pointer.css +36 -0
- package/css/popconfirm.css +185 -94
- package/css/popover.css +121 -77
- package/css/progress.css +60 -12
- package/css/prompt-input.css +224 -0
- package/css/question-flow.css +513 -0
- package/css/radio-group.css +147 -30
- package/css/rating.css +193 -43
- package/css/reasoning.css +336 -0
- package/css/reset.css +84 -6
- package/css/resizable.css +237 -0
- package/css/scroll-area.css +68 -7
- package/css/scrollbar.css +47 -13
- package/css/segmented.css +94 -29
- package/css/select.css +288 -274
- package/css/separator.css +101 -1
- package/css/side-nav.css +133 -75
- package/css/signature-pad.css +74 -54
- package/css/skeleton.css +84 -11
- package/css/slider.css +132 -39
- package/css/sortable.css +198 -0
- package/css/spinner.css +126 -12
- package/css/splitter.css +29 -8
- package/css/statistic.css +55 -0
- package/css/steps.css +206 -72
- package/css/switch.css +268 -36
- package/css/table.css +695 -118
- package/css/tabs.css +604 -42
- package/css/tag-group.css +219 -0
- package/css/tag.css +118 -28
- package/css/tags-input.css +156 -274
- package/css/text-field.css +101 -249
- package/css/time-field.css +100 -128
- package/css/time-picker.css +323 -252
- package/css/time-range-picker.css +719 -0
- package/css/timeline.css +202 -68
- package/css/timer.css +56 -52
- package/css/timestamp.css +34 -0
- package/css/toast.css +373 -144
- package/css/toggle-group.css +309 -76
- package/css/toggle.css +116 -85
- package/css/tone.css +47 -0
- package/css/tool-call.css +421 -0
- package/css/toolbar.css +181 -33
- package/css/tooltip.css +107 -36
- package/css/tour.css +183 -152
- package/css/transfer.css +351 -138
- package/css/tree-select.css +323 -216
- package/css/tree.css +294 -62
- package/css/truncate.css +65 -0
- package/css/typography.css +228 -5
- package/css/undefined.css +10 -1
- package/css/virtualizer.css +9 -10
- package/css/visually-hidden.css +7 -0
- package/css/watermark.css +7 -0
- package/family/action-control.css +487 -0
- package/family/collection-item.css +721 -0
- package/family/field-chrome.css +298 -0
- package/family/motion.css +166 -0
- package/family/swatch.css +59 -0
- package/index.css +41705 -126
- package/index.unlayered.css +33692 -17339
- package/package.json +51 -17
- package/css/calendar.css +0 -367
- package/css/code-block.css +0 -91
- package/css/composer.css +0 -134
- package/css/countdown.css +0 -26
- package/css/dynamic-input.css +0 -220
- package/css/ellipsis.css +0 -52
- package/css/hotkeys.css +0 -90
- package/css/popselect.css +0 -391
- package/css/qr-code.css +0 -55
- package/css/result.css +0 -119
- package/css/space.css +0 -117
- package/css/thread.css +0 -120
- package/css/time.css +0 -25
package/css/popover.css
CHANGED
|
@@ -1,30 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
from {
|
|
6
|
-
opacity: 0;
|
|
7
|
-
scale: var(--xh-motion-scale-enter);
|
|
8
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
9
5
|
|
|
10
|
-
|
|
11
|
-
opacity: 1;
|
|
12
|
-
scale: 1;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
6
|
+
/* 定义 popover 样式。 */
|
|
15
7
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
scale: 1;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
to {
|
|
23
|
-
opacity: 0;
|
|
24
|
-
scale: var(--xh-motion-scale-enter);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
8
|
+
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
9
|
+
@import '../family/motion.css';
|
|
10
|
+
@import '../family/action-control.css';
|
|
28
11
|
|
|
29
12
|
@layer xihan.components {
|
|
30
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -37,12 +20,15 @@
|
|
|
37
20
|
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
|
|
38
21
|
引擎没算(尚未落位 / 无引擎 / 贴边归零)时不额外限高 */
|
|
39
22
|
--xh-_popover-available-h: 100vh;
|
|
23
|
+
/* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,行内轴据此夹取;
|
|
24
|
+
引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
|
|
25
|
+
--xh-_popover-available-w: 100vw;
|
|
40
26
|
|
|
41
27
|
/* 面板内容的自绘条浮在内容之上:轨道不上底色,实色轨道会在面板右缘糊一条竖灰带 */
|
|
42
28
|
--xh-scrollbar-track-bg: transparent;
|
|
43
29
|
|
|
44
30
|
position: fixed;
|
|
45
|
-
z-index: var(--xh-popover-layer, var(--xh-layer-popover));
|
|
31
|
+
z-index: var(--xh-popover-layer, var(--xh-_layer, var(--xh-layer-popover)));
|
|
46
32
|
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
47
33
|
pointer-events: none;
|
|
48
34
|
}
|
|
@@ -52,14 +38,50 @@
|
|
|
52
38
|
visibility: hidden;
|
|
53
39
|
}
|
|
54
40
|
|
|
41
|
+
/* 缩放原点与进场位移按落定的那一侧给:面板从贴着锚点的那条边涨开、沿主轴退让一小段。
|
|
42
|
+
两个槽由 content 继承。placement 是物理方向(引擎按 top / right / bottom / left 出值),
|
|
43
|
+
origin 与 translate 也是物理量,两边同轴,不随书写方向翻 */
|
|
44
|
+
[data-scope='popover'][data-part='positioner'][data-placement^='top'] {
|
|
45
|
+
--xh-_overlay-origin-y: 100%;
|
|
46
|
+
--xh-_overlay-enter-down: 1;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
[data-scope='popover'][data-part='positioner'][data-placement^='bottom'] {
|
|
50
|
+
--xh-_overlay-origin-y: 0;
|
|
51
|
+
--xh-_overlay-enter-up: 1;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
[data-scope='popover'][data-part='positioner'][data-placement^='left'] {
|
|
55
|
+
--xh-_overlay-origin-x: 100%;
|
|
56
|
+
--xh-_overlay-enter-right: 1;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
[data-scope='popover'][data-part='positioner'][data-placement^='right'] {
|
|
60
|
+
--xh-_overlay-origin-x: 0;
|
|
61
|
+
--xh-_overlay-enter-left: 1;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/*
|
|
65
|
+
* 触发器是页面上的独立文字按钮(§9.1):盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
|
|
66
|
+
* 由家族配方按连接层投影的 data-xh-action-variant / -size 给出。皮肤没有自己的外观规则,
|
|
67
|
+
* 只把作者塞进按钮的图标接到随档字形尺(md = 20px)。
|
|
68
|
+
*/
|
|
69
|
+
[data-scope='popover'][data-part='trigger'] {
|
|
70
|
+
--xh-icon-size: var(--xh-popover-icon-size, var(--xh-_action-profile-glyph-size));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* 家族配方给了 display,作者手写 hidden 时得把 UA 的 [hidden]{display:none} 还回去 */
|
|
74
|
+
[data-scope='popover'][data-part='trigger'][hidden] {
|
|
75
|
+
display: none;
|
|
76
|
+
}
|
|
77
|
+
|
|
55
78
|
[data-scope='popover'][data-part='content'] {
|
|
56
|
-
/*
|
|
57
|
-
--xh-icon-size: var(--xh-popover-icon-size, var(--xh-glyph-size-
|
|
79
|
+
/* 作者塞进面板里的图标按控件档取(§6.5);关闭钮另由家族配方按 sm 档下发字形尺 */
|
|
80
|
+
--xh-icon-size: var(--xh-popover-icon-size, var(--xh-glyph-size-md));
|
|
58
81
|
|
|
59
82
|
/* 尺寸档只换这两个私有槽。popover 没有 root 部件,size 落在浮层树最外层的 content 上。
|
|
60
83
|
语气不接:面板是内容容器,语气该由里面的内容表达 */
|
|
61
|
-
--xh-_popover-
|
|
62
|
-
--xh-_popover-px: var(--xh-control-px-md);
|
|
84
|
+
--xh-_popover-pad: var(--xh-surface-pad-md);
|
|
63
85
|
--xh-_popover-max-w: var(--xh-overlay-max-w);
|
|
64
86
|
|
|
65
87
|
position: relative;
|
|
@@ -67,18 +89,32 @@
|
|
|
67
89
|
flex-direction: column;
|
|
68
90
|
gap: var(--xh-popover-gap, var(--xh-space-2));
|
|
69
91
|
inline-size: max-content;
|
|
70
|
-
|
|
92
|
+
/* 静态档与落位后的可用宽度取小:窄视口下面板伸出去,最右侧的内容就点不到了 */
|
|
93
|
+
max-inline-size: min(var(--xh-popover-max-w, var(--xh-_popover-max-w)), var(--xh-_popover-available-w));
|
|
71
94
|
/* 内容由作者给,长度不可预知:不限高就整块伸出视口且滚不到 */
|
|
72
95
|
max-block-size: min(var(--xh-popover-max-h, var(--xh-overlay-max-h)), var(--xh-_popover-available-h));
|
|
73
96
|
overflow-y: auto;
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
97
|
+
/* 浮在页面之上的 Overlay 滚动面(§6.6):滚到头不把页面一起带走 */
|
|
98
|
+
overscroll-behavior: contain;
|
|
99
|
+
padding-block: var(--xh-popover-py, var(--xh-_popover-pad));
|
|
100
|
+
padding-inline: var(--xh-popover-px, var(--xh-_popover-pad));
|
|
101
|
+
border: var(--xh-stroke-thin) solid var(--xh-popover-border, var(--xh-material-frosted-border));
|
|
102
|
+
border-radius: var(--xh-popover-radius, var(--xh-shape-overlay));
|
|
103
|
+
/* 顶光只占内侧一像素;透明 tint 是底层,正文自己保持不透明。 */
|
|
104
|
+
background:
|
|
105
|
+
linear-gradient(
|
|
106
|
+
to bottom,
|
|
107
|
+
var(--xh-material-frosted-highlight) 0 var(--xh-stroke-thin),
|
|
108
|
+
transparent var(--xh-stroke-thin)
|
|
109
|
+
),
|
|
110
|
+
var(--xh-popover-bg, var(--xh-material-frosted-bg));
|
|
111
|
+
color: var(--xh-popover-fg, var(--xh-material-frosted-fg));
|
|
112
|
+
box-shadow: var(--xh-popover-shadow, var(--xh-material-frosted-shadow));
|
|
113
|
+
-webkit-backdrop-filter: var(--xh-popover-backdrop, var(--xh-material-frosted-backdrop));
|
|
114
|
+
backdrop-filter: var(--xh-popover-backdrop, var(--xh-material-frosted-backdrop));
|
|
81
115
|
pointer-events: auto;
|
|
116
|
+
/* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
|
|
117
|
+
transform-origin: var(--xh-_overlay-origin-x, 50%) var(--xh-_overlay-origin-y, 50%);
|
|
82
118
|
}
|
|
83
119
|
|
|
84
120
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
@@ -92,7 +128,9 @@
|
|
|
92
128
|
}
|
|
93
129
|
|
|
94
130
|
[data-scope='popover'][data-part='content'][data-state='open'] {
|
|
95
|
-
animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
131
|
+
animation: xh-overlay-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
132
|
+
/* 只在开着的这一档挂:合成层随 data-state 一起收走,收起后不再占着 */
|
|
133
|
+
will-change: opacity, scale, translate;
|
|
96
134
|
}
|
|
97
135
|
|
|
98
136
|
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
@@ -102,17 +140,14 @@
|
|
|
102
140
|
}
|
|
103
141
|
|
|
104
142
|
/* —— 尺寸 —— */
|
|
105
|
-
/* 缺省档写在 content
|
|
106
|
-
纵向内缩按 space 档同步 */
|
|
143
|
+
/* 缺省档写在 content 的基础规则里;四边等宽的面板内衬三档取 surface-pad 那把尺 */
|
|
107
144
|
[data-scope='popover'][data-part='content'][data-size='sm'] {
|
|
108
|
-
--xh-_popover-
|
|
109
|
-
--xh-_popover-px: var(--xh-control-px-sm);
|
|
145
|
+
--xh-_popover-pad: var(--xh-surface-pad-sm);
|
|
110
146
|
--xh-_popover-max-w: var(--xh-overlay-max-w-sm);
|
|
111
147
|
}
|
|
112
148
|
|
|
113
149
|
[data-scope='popover'][data-part='content'][data-size='lg'] {
|
|
114
|
-
--xh-_popover-
|
|
115
|
-
--xh-_popover-px: var(--xh-control-px-lg);
|
|
150
|
+
--xh-_popover-pad: var(--xh-surface-pad-lg);
|
|
116
151
|
--xh-_popover-max-w: var(--xh-overlay-max-w-lg);
|
|
117
152
|
}
|
|
118
153
|
|
|
@@ -120,12 +155,13 @@
|
|
|
120
155
|
margin: 0;
|
|
121
156
|
font-size: var(--xh-popover-title-font-size, var(--xh-text-label-size));
|
|
122
157
|
font-weight: var(--xh-popover-title-font-weight, var(--xh-font-weight-semibold));
|
|
123
|
-
color: var(--xh-popover-title-fg, var(--xh-fg
|
|
158
|
+
color: var(--xh-popover-title-fg, var(--xh-material-frosted-fg));
|
|
124
159
|
}
|
|
125
160
|
|
|
161
|
+
/* 说明文字走说明档(§6.4):13px + fg-muted */
|
|
126
162
|
[data-scope='popover'][data-part='description'] {
|
|
127
163
|
margin: 0;
|
|
128
|
-
font-size: var(--xh-text-
|
|
164
|
+
font-size: var(--xh-popover-description-font-size, var(--xh-text-secondary-size));
|
|
129
165
|
color: var(--xh-popover-description-fg, var(--xh-fg-muted));
|
|
130
166
|
}
|
|
131
167
|
|
|
@@ -136,44 +172,37 @@
|
|
|
136
172
|
padding-inline-end: calc(var(--xh-popover-close-size, var(--xh-control-h-sm)) + var(--xh-space-2));
|
|
137
173
|
}
|
|
138
174
|
|
|
175
|
+
/*
|
|
176
|
+
* 关闭钮是浮层角落的单图标钮(§9.1):正方盒、sm 档几何、ghost 四态面、0.97 按压并换底与粗指针命中区
|
|
177
|
+
* 由家族配方给出——磨砂白面上走画布承载阶梯悬停 --xh-bg-subtle(100)→ 按下 --xh-bg-subtle-hover(200),
|
|
178
|
+
* 焦点面透明吃库环。这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与摆放,
|
|
179
|
+
* 聚焦档的 -bg-focus / -fg-focus 两槽同样桥到配方的 focus-visible 面,缺省仍是透明底与悬停字色:
|
|
180
|
+
* 贴边比 dialog 一族的面板档(--xh-surface-action-inset)小一档:气泡的面板内衬是 12px,
|
|
181
|
+
* 28px 的钮按 12px 贴边会伸出面板自己的盒子,被 content 的 overflow 裁掉。
|
|
182
|
+
* 静息前景取磨砂面的 muted 字色,悬停 / 按下回到 fg-default。
|
|
183
|
+
*/
|
|
139
184
|
[data-scope='popover'][data-part='close-trigger'] {
|
|
185
|
+
--xh-action-visual-size: var(--xh-popover-close-size, var(--xh-_action-profile-visual-size));
|
|
186
|
+
--xh-action-radius: var(--xh-popover-close-radius, var(--xh-shape-control));
|
|
187
|
+
--xh-action-bg-hover: var(--xh-popover-close-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
188
|
+
--xh-action-bg-pressed: var(--xh-popover-close-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
189
|
+
--xh-action-bg-focus-visible: var(--xh-popover-close-bg-focus, var(--xh-_action-variant-bg-focus-visible));
|
|
190
|
+
--xh-action-fg-rest: var(--xh-popover-close-fg, var(--xh-material-frosted-fg-muted));
|
|
191
|
+
--xh-action-fg-hover: var(--xh-popover-close-fg-hover, var(--xh-_action-variant-fg-hover));
|
|
192
|
+
--xh-action-fg-pressed: var(--xh-popover-close-fg-hover, var(--xh-_action-variant-fg-pressed));
|
|
193
|
+
--xh-action-fg-focus-visible: var(--xh-popover-close-fg-focus, var(--xh-popover-close-fg-hover, var(--xh-_action-variant-fg-focus-visible)));
|
|
194
|
+
/* 作者塞进按钮的图标随档取字形尺(sm = 16px),与皮肤画的兜底字形同一把尺 */
|
|
195
|
+
--xh-icon-size: var(--xh-popover-icon-size, var(--xh-_action-profile-glyph-size));
|
|
196
|
+
|
|
140
197
|
position: absolute;
|
|
141
198
|
inset-block-start: var(--xh-space-2);
|
|
142
199
|
inset-inline-end: var(--xh-space-2);
|
|
143
|
-
display: inline-flex;
|
|
144
|
-
align-items: center;
|
|
145
|
-
justify-content: center;
|
|
146
|
-
block-size: var(--xh-popover-close-size, var(--xh-control-h-sm));
|
|
147
|
-
inline-size: var(--xh-popover-close-size, var(--xh-control-h-sm));
|
|
148
|
-
border: 0;
|
|
149
|
-
border-radius: var(--xh-popover-close-radius, var(--xh-shape-control));
|
|
150
|
-
background: transparent;
|
|
151
|
-
color: var(--xh-fg-muted);
|
|
152
|
-
cursor: pointer;
|
|
153
|
-
transition:
|
|
154
|
-
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
155
|
-
scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
156
200
|
}
|
|
157
201
|
|
|
158
202
|
[data-scope='popover'][data-part='close-trigger'][hidden] {
|
|
159
203
|
display: none;
|
|
160
204
|
}
|
|
161
205
|
|
|
162
|
-
[data-scope='popover'][data-part='close-trigger']:hover {
|
|
163
|
-
background: var(--xh-popover-close-bg-hover, var(--xh-bg-subtle-hover));
|
|
164
|
-
color: var(--xh-fg-default);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
[data-scope='popover'][data-part='close-trigger']:active {
|
|
168
|
-
background: var(--xh-popover-close-bg-active, var(--xh-bg-subtle-active));
|
|
169
|
-
scale: var(--xh-motion-scale-press);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
[data-scope='popover'][data-part='close-trigger']:focus-visible {
|
|
173
|
-
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
174
|
-
outline-offset: var(--xh-ring-offset);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
206
|
/* 箭头的底色与描边色,几何在 overlay-arrow.css。
|
|
178
207
|
交叉轴落点由定位引擎经内联自定义属性写进来,没给时退回居中 */
|
|
179
208
|
[data-scope='popover'][data-part='arrow'] {
|
|
@@ -183,8 +212,8 @@
|
|
|
183
212
|
--xh-_overlay-arrow-x: var(--xh-_popover-arrow-x);
|
|
184
213
|
--xh-_overlay-arrow-y: var(--xh-_popover-arrow-y);
|
|
185
214
|
|
|
186
|
-
background: var(--xh-popover-bg, var(--xh-bg
|
|
187
|
-
border: var(--xh-stroke-thin) solid var(--xh-popover-border, var(--xh-border
|
|
215
|
+
background: var(--xh-popover-bg, var(--xh-material-frosted-bg));
|
|
216
|
+
border: var(--xh-stroke-thin) solid var(--xh-popover-border, var(--xh-material-frosted-border));
|
|
188
217
|
}
|
|
189
218
|
|
|
190
219
|
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
@@ -198,4 +227,19 @@
|
|
|
198
227
|
-webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
199
228
|
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
200
229
|
}
|
|
230
|
+
|
|
231
|
+
@media (forced-colors: active) {
|
|
232
|
+
/* 系统色接管边界与正文;装饰顶光在这一档没有信息价值,明确撤掉背景图层。 */
|
|
233
|
+
[data-scope='popover'][data-part='content'] {
|
|
234
|
+
background-image: none;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
@media print {
|
|
239
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
240
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
241
|
+
[data-scope='popover'][data-part='positioner'] {
|
|
242
|
+
display: none;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
201
245
|
}
|
package/css/progress.css
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* 定义 progress 样式。 */
|
|
7
|
+
|
|
1
8
|
@layer xihan.motion {
|
|
2
9
|
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
10
|
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
@@ -21,7 +28,7 @@
|
|
|
21
28
|
/* 私有槽位:组件令牌 → 中档字面量两级回退。厚度写在 root 上而不是 track 上,
|
|
22
29
|
尺寸档才改得动一处就够,track 靠继承拿到值。 */
|
|
23
30
|
[data-scope='progress'][data-part='root'] {
|
|
24
|
-
--xh-
|
|
31
|
+
--xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-track-thickness));
|
|
25
32
|
|
|
26
33
|
display: inline-block;
|
|
27
34
|
inline-size: 100%;
|
|
@@ -30,7 +37,7 @@
|
|
|
30
37
|
[data-scope='progress'][data-part='track'] {
|
|
31
38
|
overflow: hidden;
|
|
32
39
|
inline-size: 100%;
|
|
33
|
-
block-size: var(--xh-
|
|
40
|
+
block-size: var(--xh-_progress-thickness);
|
|
34
41
|
border-radius: var(--xh-progress-track-radius, var(--xh-shape-pill));
|
|
35
42
|
background: var(--xh-progress-track, var(--xh-bg-subtle-active));
|
|
36
43
|
}
|
|
@@ -41,17 +48,17 @@
|
|
|
41
48
|
block-size: 100%;
|
|
42
49
|
border-radius: var(--xh-progress-range-radius, var(--xh-shape-pill));
|
|
43
50
|
background: var(--xh-progress-range, var(--xh-_tone, var(--xh-bg-brand)));
|
|
44
|
-
transition: inline-size var(--xh-motion-duration-
|
|
51
|
+
transition: inline-size var(--xh-motion-duration-enter) var(--xh-motion-ease-continuous);
|
|
45
52
|
}
|
|
46
53
|
|
|
47
54
|
/* —— 尺寸 —— */
|
|
48
55
|
/* 线形只有厚度分档;中间档不写规则,缺省即中档 */
|
|
49
56
|
[data-scope='progress'][data-part='root'][data-size='sm'] {
|
|
50
|
-
--xh-
|
|
57
|
+
--xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-1));
|
|
51
58
|
}
|
|
52
59
|
|
|
53
60
|
[data-scope='progress'][data-part='root'][data-size='lg'] {
|
|
54
|
-
--xh-
|
|
61
|
+
--xh-_progress-thickness: var(--xh-progress-thickness, var(--xh-space-2));
|
|
55
62
|
}
|
|
56
63
|
|
|
57
64
|
/* —— 环形 —— */
|
|
@@ -59,22 +66,22 @@
|
|
|
59
66
|
画面与环心文字叠在同一格上,文字因此恒在圆心 */
|
|
60
67
|
[data-scope='progress'][data-part='root'][data-variant='circle'],
|
|
61
68
|
[data-scope='progress'][data-part='root'][data-variant='dashboard'] {
|
|
62
|
-
--xh-
|
|
69
|
+
--xh-_progress-diameter: var(--xh-progress-size, 7.5rem);
|
|
63
70
|
|
|
64
71
|
display: inline-grid;
|
|
65
72
|
place-items: center;
|
|
66
|
-
inline-size: var(--xh-
|
|
67
|
-
block-size: var(--xh-
|
|
73
|
+
inline-size: var(--xh-_progress-diameter);
|
|
74
|
+
block-size: var(--xh-_progress-diameter);
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
[data-scope='progress'][data-part='root'][data-variant='circle'][data-size='sm'],
|
|
71
78
|
[data-scope='progress'][data-part='root'][data-variant='dashboard'][data-size='sm'] {
|
|
72
|
-
--xh-
|
|
79
|
+
--xh-_progress-diameter: var(--xh-progress-size, 5rem);
|
|
73
80
|
}
|
|
74
81
|
|
|
75
82
|
[data-scope='progress'][data-part='root'][data-variant='circle'][data-size='lg'],
|
|
76
83
|
[data-scope='progress'][data-part='root'][data-variant='dashboard'][data-size='lg'] {
|
|
77
|
-
--xh-
|
|
84
|
+
--xh-_progress-diameter: var(--xh-progress-size, 10rem);
|
|
78
85
|
}
|
|
79
86
|
|
|
80
87
|
[data-scope='progress'][data-part='canvas'],
|
|
@@ -106,7 +113,7 @@
|
|
|
106
113
|
[data-scope='progress'][data-part='range'][data-variant='dashboard'] {
|
|
107
114
|
stroke: var(--xh-progress-range, var(--xh-_tone, var(--xh-bg-brand)));
|
|
108
115
|
stroke-linecap: var(--xh-progress-linecap, round);
|
|
109
|
-
transition: stroke-dashoffset var(--xh-motion-duration-
|
|
116
|
+
transition: stroke-dashoffset var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
110
117
|
}
|
|
111
118
|
|
|
112
119
|
/* 进度未知:线形条改为一小段来回扫。宽度交给动画,连接层算出的 inline-size 与
|
|
@@ -120,7 +127,7 @@
|
|
|
120
127
|
position: absolute;
|
|
121
128
|
inline-size: 40%;
|
|
122
129
|
transition: none;
|
|
123
|
-
animation: xh-progress-indeterminate var(--xh-progress-indeterminate-duration,
|
|
130
|
+
animation: xh-progress-indeterminate var(--xh-progress-indeterminate-duration, var(--xh-shimmer-duration)) var(--xh-motion-ease-loop) infinite;
|
|
124
131
|
}
|
|
125
132
|
|
|
126
133
|
/* 减弱动效档:不来回扫,改成一条铺满的静态条——进度仍然未知,只是不再动。
|
|
@@ -152,4 +159,45 @@
|
|
|
152
159
|
[data-scope='progress'][data-part='root'][hidden] {
|
|
153
160
|
display: none;
|
|
154
161
|
}
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
* 高对比档:走完的那段与底槽都是底色画的,这一档里两者被换成同一个系统色,
|
|
165
|
+
* 整根条子成了一色,读不出走到哪儿。走完的那段改取系统高亮色,底槽补一圈环把全长框出来。
|
|
166
|
+
* 环用 outline 不用 border:条子的厚度是写死的,加边会把它顶高一档。
|
|
167
|
+
* 环形档画的是描边,stroke 在这一档里照旧生效,两条各自换成系统色即可。
|
|
168
|
+
*/
|
|
169
|
+
@media (forced-colors: active) {
|
|
170
|
+
[data-scope='progress'][data-part='track'] {
|
|
171
|
+
outline: var(--xh-stroke-thin) solid CanvasText;
|
|
172
|
+
outline-offset: calc(-1 * var(--xh-stroke-thin));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
[data-scope='progress'][data-part='range'] {
|
|
176
|
+
background: Highlight;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
[data-scope='progress'][data-part='track'][data-variant='circle'],
|
|
180
|
+
[data-scope='progress'][data-part='track'][data-variant='dashboard'] {
|
|
181
|
+
outline: none;
|
|
182
|
+
stroke: CanvasText;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
[data-scope='progress'][data-part='range'][data-variant='circle'],
|
|
186
|
+
[data-scope='progress'][data-part='range'][data-variant='dashboard'] {
|
|
187
|
+
stroke: Highlight;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
@media print {
|
|
192
|
+
/* 打印:动画会被定格在任意一帧——转了一半的圈、扫到一半的微光。这里换成静止的表达,
|
|
193
|
+
取值与减弱动效那一档相同。两档各写一块、不并进一条媒体查询列表:减弱动效另有一份
|
|
194
|
+
:where([data-motion='reduce']) 的钩子版本与它成对,打印没有对应的钩子可配,
|
|
195
|
+
并成一条之后这层配对关系在文本上就断了。 */
|
|
196
|
+
[data-scope='progress'][data-part='range'][data-state='indeterminate'] {
|
|
197
|
+
position: static;
|
|
198
|
+
inline-size: 100%;
|
|
199
|
+
opacity: 0.5;
|
|
200
|
+
animation: none;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
155
203
|
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* PromptInput 独立皮肤同时传递引入字段视觉盒与字段内动作;full bundle 递归去重。 */
|
|
7
|
+
@import '../family/field-chrome.css';
|
|
8
|
+
@import '../family/action-control.css';
|
|
9
|
+
|
|
10
|
+
@layer xihan.components {
|
|
11
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
12
|
+
[data-scope='prompt-input'] {
|
|
13
|
+
--xh-prompt-input-skin: 1;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* root 就是视觉盒:描边、底色、圆角、聚焦环、悬停与禁用面由 Field Chrome 家族画在它身上(静息描边式:
|
|
17
|
+
canvas 底 + --xh-border-control 描边 + 无影,不用 soft,§8.3 登记例外只在 8px surface 圆角),内部 textarea
|
|
18
|
+
无边框;align-items: flex-end 让按钮随输入框长高贴着底边。
|
|
19
|
+
三个视觉轴都落在 root 上:形态三档由家族按 data-variant 生成,语气管用哪族颜色,尺寸管高度与字号 */
|
|
20
|
+
[data-scope='prompt-input'][data-part='root'] {
|
|
21
|
+
/* 圆角可由使用者槽切换,家族只过渡底、描边、影与环 */
|
|
22
|
+
transition: border-radius var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
23
|
+
/* 尺寸缺省档:不写 data-size 时按中档走 */
|
|
24
|
+
--xh-_prompt-input-h: var(--xh-control-h-md);
|
|
25
|
+
--xh-_prompt-input-gap: var(--xh-control-gap-md);
|
|
26
|
+
--xh-_prompt-input-px: var(--xh-control-px-sm);
|
|
27
|
+
--xh-_prompt-input-font-size: var(--xh-control-font-md);
|
|
28
|
+
--xh-_prompt-input-submit-px: var(--xh-control-px-md);
|
|
29
|
+
/* 皮肤画的兜底字形与作者塞进来的图标读同一把尺,随尺寸档一起换 */
|
|
30
|
+
--xh-icon-size: var(--xh-prompt-input-icon-size, var(--xh-glyph-size-md));
|
|
31
|
+
|
|
32
|
+
/* 家族桥接槽:既有使用者槽保留为第一参数,缺省落家族按 data-variant 生成的三档 */
|
|
33
|
+
/* 多行随内容长高,盒不定高 */
|
|
34
|
+
--xh-field-control-height: auto;
|
|
35
|
+
/* 家族的行内内衬与下面 padding 简写同值 */
|
|
36
|
+
--xh-field-control-padding-inline: var(--xh-prompt-input-p, var(--xh-_prompt-input-px));
|
|
37
|
+
--xh-field-control-gap: var(--xh-prompt-input-gap, var(--xh-_prompt-input-gap));
|
|
38
|
+
--xh-field-control-radius: var(--xh-prompt-input-radius, var(--xh-shape-surface));
|
|
39
|
+
--xh-field-bg-rest: var(--xh-prompt-input-bg, var(--xh-_field-variant-bg-rest));
|
|
40
|
+
--xh-field-bg-hover: var(--xh-prompt-input-bg-hover, var(--xh-_field-variant-bg-hover));
|
|
41
|
+
--xh-field-bg-disabled: var(--xh-prompt-input-bg-disabled, var(--xh-_field-variant-bg-disabled));
|
|
42
|
+
--xh-field-border-rest: var(--xh-prompt-input-border, var(--xh-_field-variant-border-rest));
|
|
43
|
+
--xh-field-border-hover: var(--xh-prompt-input-border-hover, var(--xh-_field-variant-border-hover));
|
|
44
|
+
--xh-field-border-focus: var(--xh-prompt-input-border-focus, var(--xh-_field-variant-border-focus));
|
|
45
|
+
--xh-field-shadow-rest: var(--xh-prompt-input-shadow, none);
|
|
46
|
+
/* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
|
|
47
|
+
--xh-field-glyph-size: var(--xh-prompt-input-icon-size, var(--xh-_field-size-glyph-size));
|
|
48
|
+
/* 生成中(data-loading)这块框仍可打字:不压前景、不换等待光标,只有按钮换成停止身份 */
|
|
49
|
+
--xh-field-fg-loading: var(--xh-fg-default);
|
|
50
|
+
--xh-field-cursor-loading: text;
|
|
51
|
+
|
|
52
|
+
/* 整框内衬的当前值,随尺寸档与 --xh-prompt-input-p 一起变。
|
|
53
|
+
附件条与动作行由作者写在 root 里、不是本组件的部件,它们靠读这一支对齐同一条内衬线 */
|
|
54
|
+
--xh-prompt-input-computed-px: var(--xh-prompt-input-p, var(--xh-_prompt-input-px));
|
|
55
|
+
|
|
56
|
+
display: flex;
|
|
57
|
+
align-items: flex-end;
|
|
58
|
+
/* 整框的内衬走控件内边距尺的小档,密度收紧时随之收窄 */
|
|
59
|
+
padding: var(--xh-prompt-input-p, var(--xh-_prompt-input-px));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* 上面声明的 display 会盖掉 UA 的 [hidden]{display:none},这里补回 */
|
|
63
|
+
[data-scope='prompt-input'][data-part='root'][hidden] {
|
|
64
|
+
display: none;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* 写了输入行,root 就翻成竖排:输入框与按钮收进那一行,上下两侧腾给附件条与动作行。
|
|
68
|
+
不写就是单行,输入框与按钮并排——两种写法的皮肤是同一份 */
|
|
69
|
+
[data-scope='prompt-input'][data-part='root']:has(> [data-scope='prompt-input'][data-part='control']) {
|
|
70
|
+
flex-direction: column;
|
|
71
|
+
align-items: stretch;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* —— 尺寸 —— */
|
|
75
|
+
[data-scope='prompt-input'][data-part='root'][data-size='sm'] {
|
|
76
|
+
--xh-_prompt-input-h: var(--xh-control-h-sm);
|
|
77
|
+
--xh-_prompt-input-gap: var(--xh-control-gap-sm);
|
|
78
|
+
--xh-_prompt-input-px: var(--xh-control-px-sm);
|
|
79
|
+
--xh-_prompt-input-font-size: var(--xh-control-font-sm);
|
|
80
|
+
--xh-_prompt-input-submit-px: var(--xh-control-px-sm);
|
|
81
|
+
--xh-icon-size: var(--xh-prompt-input-icon-size, var(--xh-glyph-size-sm));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
[data-scope='prompt-input'][data-part='root'][data-size='md'] {
|
|
85
|
+
--xh-_prompt-input-h: var(--xh-control-h-md);
|
|
86
|
+
--xh-_prompt-input-gap: var(--xh-control-gap-md);
|
|
87
|
+
--xh-_prompt-input-px: var(--xh-control-px-md);
|
|
88
|
+
--xh-_prompt-input-font-size: var(--xh-control-font-md);
|
|
89
|
+
--xh-_prompt-input-submit-px: var(--xh-control-px-md);
|
|
90
|
+
--xh-icon-size: var(--xh-prompt-input-icon-size, var(--xh-glyph-size-md));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
[data-scope='prompt-input'][data-part='root'][data-size='lg'] {
|
|
94
|
+
--xh-_prompt-input-h: var(--xh-control-h-lg);
|
|
95
|
+
--xh-_prompt-input-gap: var(--xh-control-gap-lg);
|
|
96
|
+
--xh-_prompt-input-px: var(--xh-control-px-lg);
|
|
97
|
+
--xh-_prompt-input-font-size: var(--xh-control-font-lg);
|
|
98
|
+
--xh-_prompt-input-submit-px: var(--xh-control-px-lg);
|
|
99
|
+
--xh-icon-size: var(--xh-prompt-input-icon-size, var(--xh-glyph-size-lg));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* 输入行承接单行写法下落在 root 上的那份几何:输入框与按钮并排、按钮贴着底边。
|
|
103
|
+
它自己不画底也不画描边,边界仍由 root 表达 */
|
|
104
|
+
[data-scope='prompt-input'][data-part='control'] {
|
|
105
|
+
display: flex;
|
|
106
|
+
align-items: flex-end;
|
|
107
|
+
gap: var(--xh-prompt-input-row-gap, var(--xh-_prompt-input-gap));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
[data-scope='prompt-input'][data-part='control'][hidden] {
|
|
111
|
+
display: none;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* 输入段透明、底由外框承担:重置、字色、占位符与自动填充由 Field Chrome 家族的 [data-xh-field-input] 给,
|
|
115
|
+
组件只映射既有使用者槽。刻意不投影 data-xh-field-layout:家族 textarea 布局的 :has() 变体会压掉
|
|
116
|
+
root 自己的 padding 与 align-items。 */
|
|
117
|
+
[data-scope='prompt-input'][data-part='input'] {
|
|
118
|
+
--xh-field-input-fg: var(--xh-prompt-input-input-fg, var(--xh-fg-default));
|
|
119
|
+
--xh-field-input-font-size: var(--xh-prompt-input-input-font-size, var(--xh-_prompt-input-font-size));
|
|
120
|
+
--xh-field-placeholder-fg: var(--xh-prompt-input-placeholder-fg, var(--xh-fg-subtle));
|
|
121
|
+
/* 框的底画在 root 上,input 本身是透明分段,自动填充铺的是外框缺省那一档的实体底 */
|
|
122
|
+
--xh-field-autofill-bg: var(--xh-prompt-input-input-autofill-bg, var(--xh-bg-canvas));
|
|
123
|
+
--xh-field-autofill-fg: var(--xh-prompt-input-input-autofill-fg, var(--xh-fg-default));
|
|
124
|
+
|
|
125
|
+
/* 多行随内容长高,不撑满外框 */
|
|
126
|
+
block-size: auto;
|
|
127
|
+
/* 上下留白把单行文本盒撑到控件高度,文字中线与按钮中线对齐。
|
|
128
|
+
级联兜底:先写一行的高度算式(输入框字号 × 行距),再写 1lh。
|
|
129
|
+
1lh 晚于本库声明的浏览器地板,取不到时旧引擎丢掉后一条、留下前一条。
|
|
130
|
+
两条取的是同一组槽——字号来自家族映射的 --xh-field-input-font-size、行距来自家族的
|
|
131
|
+
line-height,所以算出来是同一个数。 */
|
|
132
|
+
padding-block: calc((var(--xh-_prompt-input-h) - var(--xh-prompt-input-input-font-size, var(--xh-_prompt-input-font-size)) * var(--xh-leading-normal)) / 2);
|
|
133
|
+
padding-block: calc((var(--xh-_prompt-input-h) - 1lh) / 2);
|
|
134
|
+
border-radius: var(--xh-prompt-input-input-radius, var(--xh-shape-inset));
|
|
135
|
+
/* 高度由 field-sizing 随内容变,不支持的引擎退化为 rows 定下的固定行数;
|
|
136
|
+
配套禁用 resize,避免拖拽写死的高度盖掉它。封顶行数由使用者覆盖槽给。 */
|
|
137
|
+
max-block-size: var(--xh-prompt-input-max-h, calc(var(--xh-leading-normal) * 1em * 8));
|
|
138
|
+
field-sizing: content;
|
|
139
|
+
resize: none;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* textarea 是单体表单控件,禁用走原生 disabled */
|
|
143
|
+
[data-scope='prompt-input'][data-part='input']:disabled {
|
|
144
|
+
color: var(--xh-fg-disabled);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* 发送钮是组件的主要动作,与 Button 缺省同为品牌实心:盒几何、悬停 / 按下与 0.97 按压、焦点环、禁用面
|
|
148
|
+
全由 Action Control 的 text solid 档给(连接层按 loading 切成 subtle 的停止身份),组件只映射既有使用者槽。
|
|
149
|
+
取 text 档而不是 icon 档:icon 档把行内尺寸钉成正方,作者放文案(「发送」)会被挤;发送钮的几何本来就是
|
|
150
|
+
「至少一个控件高的方钮 + 行内内衬」,与 text 档一致 */
|
|
151
|
+
[data-scope='prompt-input'][data-part='submit-trigger'] {
|
|
152
|
+
--xh-action-visual-size: var(--xh-_prompt-input-h);
|
|
153
|
+
--xh-action-min-inline-size: var(--xh-_prompt-input-h);
|
|
154
|
+
--xh-action-padding-inline: var(--xh-prompt-input-submit-px, var(--xh-_prompt-input-submit-px));
|
|
155
|
+
--xh-action-radius: var(--xh-prompt-input-submit-radius, var(--xh-shape-control));
|
|
156
|
+
--xh-action-bg-rest: var(--xh-prompt-input-send-bg, var(--xh-_action-variant-bg-rest));
|
|
157
|
+
--xh-action-bg-hover: var(--xh-prompt-input-send-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
158
|
+
--xh-action-bg-pressed: var(--xh-prompt-input-send-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
159
|
+
--xh-action-fg-rest: var(--xh-prompt-input-send-fg, var(--xh-_action-variant-fg-rest));
|
|
160
|
+
--xh-action-fg-hover: var(--xh-prompt-input-send-fg, var(--xh-_action-variant-fg-hover));
|
|
161
|
+
--xh-action-fg-pressed: var(--xh-prompt-input-send-fg, var(--xh-_action-variant-fg-pressed));
|
|
162
|
+
--xh-action-border-rest: transparent;
|
|
163
|
+
--xh-action-highlight-rest: transparent;
|
|
164
|
+
/* 发送身份是实心底,顶边画一条极浅的内高光把这块面衬出厚度;三态同一支,禁用面由家族收掉 */
|
|
165
|
+
--xh-action-shadow-rest: var(--xh-prompt-input-submit-shadow, var(--xh-_highlight-tone));
|
|
166
|
+
--xh-action-shadow-hover: var(--xh-prompt-input-submit-shadow, var(--xh-_highlight-tone));
|
|
167
|
+
--xh-action-shadow-pressed: var(--xh-prompt-input-submit-shadow, var(--xh-_highlight-tone));
|
|
168
|
+
/* 输入为空时按钮转灰但不收起 */
|
|
169
|
+
--xh-action-bg-disabled: var(--xh-prompt-input-send-bg-off, var(--xh-bg-muted));
|
|
170
|
+
--xh-action-font-size: var(--xh-prompt-input-submit-font-size, var(--xh-text-label-size));
|
|
171
|
+
/* 面是实心的,环色与面同族,画在面里就看不出来;环改取面自己的前景色——
|
|
172
|
+
那一族色本来就要在这块面上把字读清楚,与面的对比是按可读性定的 */
|
|
173
|
+
--xh-action-ring-color-focus-visible: currentColor;
|
|
174
|
+
|
|
175
|
+
/* 按钮不参与弹性伸缩 */
|
|
176
|
+
flex: none;
|
|
177
|
+
border-width: 0;
|
|
178
|
+
font-weight: var(--xh-prompt-input-submit-font-weight, var(--xh-text-label-weight));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/* 家族那条 display 会把 UA 的 [hidden]{display:none} 盖掉 */
|
|
182
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][hidden] {
|
|
183
|
+
display: none;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/* 停止身份只换配色,从主色降到中性淡底(连接层同时把家族档切成 subtle);文案与可访问名由连接层切换。
|
|
187
|
+
淡底面上没有厚度可言,内高光收掉;环色回到公共焦点色 */
|
|
188
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='stop'] {
|
|
189
|
+
--xh-action-bg-rest: var(--xh-prompt-input-stop-bg, var(--xh-_action-variant-bg-rest));
|
|
190
|
+
--xh-action-bg-hover: var(--xh-prompt-input-stop-bg-hover, var(--xh-_action-variant-bg-hover));
|
|
191
|
+
--xh-action-bg-pressed: var(--xh-prompt-input-stop-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
192
|
+
--xh-action-fg-rest: var(--xh-prompt-input-stop-fg, var(--xh-_action-variant-fg-rest));
|
|
193
|
+
--xh-action-fg-hover: var(--xh-prompt-input-stop-fg, var(--xh-_action-variant-fg-hover));
|
|
194
|
+
--xh-action-fg-pressed: var(--xh-prompt-input-stop-fg, var(--xh-_action-variant-fg-pressed));
|
|
195
|
+
--xh-action-shadow-rest: none;
|
|
196
|
+
--xh-action-shadow-hover: none;
|
|
197
|
+
--xh-action-shadow-pressed: none;
|
|
198
|
+
--xh-action-ring-color-focus-visible: var(--xh-ring-focus);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* 按钮没写内容就由皮肤画兜底字形,两种身份各画一枚;
|
|
202
|
+
作者往部件里塞了自己的图形或文案,这两条即不命中 */
|
|
203
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='send']:empty::before {
|
|
204
|
+
content: '';
|
|
205
|
+
display: inline-block;
|
|
206
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
207
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
208
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
209
|
+
background-color: currentColor;
|
|
210
|
+
-webkit-mask: var(--xh-glyph-mark-arrow-up) center / contain no-repeat;
|
|
211
|
+
mask: var(--xh-glyph-mark-arrow-up) center / contain no-repeat;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/* 停止身份画一枚实心圆角方块:它不是「反过来的发送」,用一个不指向任何方向的形状 */
|
|
215
|
+
[data-scope='prompt-input'][data-part='submit-trigger'][data-mode='stop']:empty::before {
|
|
216
|
+
content: '';
|
|
217
|
+
display: inline-block;
|
|
218
|
+
inline-size: var(--xh-prompt-input-stop-mark-size, calc(var(--xh-icon-size, var(--xh-glyph-size-text)) * 0.6));
|
|
219
|
+
block-size: var(--xh-prompt-input-stop-mark-size, calc(var(--xh-icon-size, var(--xh-glyph-size-text)) * 0.6));
|
|
220
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
221
|
+
border-radius: var(--xh-prompt-input-stop-mark-radius, var(--xh-shape-inset));
|
|
222
|
+
background-color: currentColor;
|
|
223
|
+
}
|
|
224
|
+
}
|