@xihan-ui/styles 2.0.0 → 3.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 +1328 -0
- package/README.md +6 -1
- package/component-tokens.d.ts +505 -111
- package/components.tokens.json +34750 -26291
- package/css/accordion.css +39 -13
- package/css/alert.css +61 -3
- package/css/anchor.css +49 -11
- package/css/approval.css +124 -84
- package/css/avatar-group.css +1 -1
- package/css/avatar.css +13 -5
- package/css/back-top.css +63 -44
- package/css/badge.css +63 -13
- package/css/bar-code.css +1 -1
- package/css/breadcrumb.css +63 -4
- package/css/button-group.css +5 -5
- package/css/button.css +69 -21
- package/css/calendar-picker.css +27 -8
- package/css/calendar-range-picker.css +48 -11
- package/css/card.css +116 -2
- package/css/carousel.css +153 -48
- package/css/cartesian-chart.css +830 -0
- package/css/cascader.css +184 -70
- package/css/checkbox-group.css +69 -99
- package/css/checkbox.css +21 -54
- package/css/citation.css +470 -0
- package/css/clipboard.css +23 -66
- package/css/code-view.css +103 -8
- package/css/collapsible.css +37 -11
- package/css/color-field.css +18 -0
- package/css/color-picker.css +57 -62
- package/css/color-slider.css +26 -19
- package/css/color-swatch-picker.css +8 -6
- package/css/combobox.css +82 -37
- package/css/command.css +48 -48
- package/css/context-menu.css +43 -28
- package/css/date-field.css +23 -0
- package/css/date-picker.css +57 -24
- package/css/date-range-picker.css +301 -14
- package/css/description.css +17 -1
- package/css/descriptions.css +43 -1
- package/css/dialog.css +99 -43
- package/css/diff-view.css +101 -16
- package/css/download-trigger.css +46 -80
- package/css/drawer.css +168 -133
- package/css/editable.css +19 -0
- package/css/empty-state.css +8 -7
- package/css/field-array.css +36 -0
- package/css/field.css +17 -19
- package/css/fieldset.css +1 -1
- package/css/file-upload.css +126 -136
- package/css/flex.css +324 -8
- package/css/float-button.css +168 -41
- package/css/floating-panel.css +59 -27
- package/css/form.css +26 -20
- package/css/funnel-chart.css +106 -0
- package/css/graph-chart.css +205 -0
- package/css/grid-list.css +235 -0
- package/css/grid.css +252 -1
- package/css/heatmap.css +119 -36
- package/css/hierarchy-chart.css +298 -0
- package/css/hover-card.css +33 -18
- package/css/icon.css +100 -0
- package/css/image-cropper.css +34 -8
- package/css/image-viewer.css +169 -26
- package/css/image.css +23 -4
- package/css/infinite-scroll.css +2 -2
- package/css/input-group.css +13 -15
- package/css/json-viewer.css +55 -7
- package/css/kbd.css +1 -1
- package/css/layout.css +71 -21
- package/css/liquid.css +106 -0
- package/css/list.css +2 -2
- package/css/listbox.css +72 -23
- package/css/loading-bar.css +27 -13
- package/css/log.css +131 -35
- package/css/markdown-stream.css +1 -1
- package/css/marquee.css +163 -7
- package/css/matrix-code.css +1 -1
- package/css/mention.css +35 -21
- package/css/menu.css +40 -28
- package/css/menubar.css +42 -28
- package/css/message-feed.css +174 -53
- package/css/navigation-menu.css +177 -18
- package/css/notification.css +431 -110
- package/css/number-field.css +22 -0
- package/css/page-header.css +4 -2
- package/css/pagination.css +129 -29
- package/css/password-input.css +40 -8
- package/css/pie-chart.css +247 -0
- package/css/popconfirm.css +50 -58
- package/css/popover.css +55 -21
- package/css/progress.css +308 -10
- package/css/prompt-input.css +37 -1
- package/css/question-flow.css +104 -64
- package/css/radar-chart.css +233 -0
- package/css/radio-group.css +372 -14
- package/css/rating.css +25 -27
- package/css/reasoning.css +62 -55
- package/css/reset.css +1 -1
- package/css/resizable.css +6 -1
- package/css/sankey-chart.css +174 -0
- package/css/scroll-area.css +32 -0
- package/css/scrollbar.css +1 -1
- package/css/select.css +76 -59
- package/css/side-nav.css +177 -30
- package/css/signature-pad.css +23 -8
- package/css/skeleton.css +13 -14
- package/css/slider.css +39 -17
- package/css/sortable.css +38 -8
- package/css/sparkline.css +164 -0
- package/css/spinner.css +50 -22
- package/css/splitter.css +8 -2
- package/css/statistic.css +10 -0
- package/css/steps.css +257 -38
- package/css/switch.css +30 -55
- package/css/table.css +168 -128
- package/css/tabs.css +243 -31
- package/css/tag-group.css +65 -37
- package/css/tag.css +55 -14
- package/css/tags-input.css +40 -3
- package/css/text-field.css +19 -0
- package/css/time-field.css +20 -1
- package/css/time-picker.css +44 -17
- package/css/time-range-picker.css +45 -18
- package/css/timeline.css +1 -1
- package/css/toggle-group.css +8 -8
- package/css/toggle.css +6 -5
- package/css/tool-call.css +64 -56
- package/css/toolbar.css +105 -7
- package/css/tooltip.css +18 -7
- package/css/tour.css +49 -21
- package/css/transfer.css +104 -81
- package/css/tree-select.css +235 -58
- package/css/tree.css +240 -147
- package/css/truncate.css +55 -12
- package/css/typography.css +93 -0
- package/css/virtualizer.css +57 -1
- package/css/watermark.css +23 -0
- package/family/action-control.css +14 -5
- package/family/chart.css +480 -0
- package/family/check-mark.css +94 -0
- package/family/choice-card.css +97 -0
- package/family/collection-item.css +70 -27
- package/family/field-chrome.css +1 -12
- package/family/loading-ring.css +95 -0
- package/family/material.css +72 -0
- package/family/menu-choice.css +56 -0
- package/family/motion.css +208 -11
- package/family/tag-list.css +59 -0
- package/index.css +23363 -14091
- package/index.unlayered.css +23198 -13922
- package/package.json +20 -8
- package/css/gradient-text.css +0 -91
- package/css/icon-wrapper.css +0 -81
- package/css/segmented.css +0 -280
- package/css/toast.css +0 -499
package/css/icon.css
CHANGED
|
@@ -122,4 +122,104 @@
|
|
|
122
122
|
[data-scope='icon'][data-part='root'][data-flip='both'] {
|
|
123
123
|
scale: -1 -1;
|
|
124
124
|
}
|
|
125
|
+
|
|
126
|
+
/* —— 底框 —— */
|
|
127
|
+
/*
|
|
128
|
+
* 加了框的图标是一个定直径的圆底座:框画在 <svg> 自己的盒上,图元落在内容盒里居中。
|
|
129
|
+
* sm / md / lg 三档框与头像同档(取同一支控件高度令牌),图元按自己的档位取字形直径,
|
|
130
|
+
* 内衬由两者之差算出,框换档时图元跟着一起换。
|
|
131
|
+
* 框里的图元不读外层统一图元直径的通道 --xh-icon-size:框自己就是一个定尺对象,
|
|
132
|
+
* 落在按钮、提示条这类下发图元直径的容器里也不被改小。
|
|
133
|
+
* 排在档位与语气之后:框接管了盒的尺寸与配色。
|
|
134
|
+
*/
|
|
135
|
+
[data-scope='icon'][data-part='root'][data-frame] {
|
|
136
|
+
/* 三档之外的档位经两支 step 槽给出字形直径与框直径,三档本身在下面的档位块里换 */
|
|
137
|
+
--xh-_icon-glyph: var(--xh-icon-frame-glyph-size, var(--xh-_icon-glyph-step, var(--xh-glyph-size-md)));
|
|
138
|
+
--xh-_icon-frame-size: var(--xh-icon-frame-size, var(--xh-_icon-frame-step, var(--xh-control-h-md)));
|
|
139
|
+
|
|
140
|
+
inline-size: var(--xh-_icon-frame-size);
|
|
141
|
+
block-size: var(--xh-_icon-frame-size);
|
|
142
|
+
padding: calc((var(--xh-_icon-frame-size) - var(--xh-_icon-glyph)) / 2 - var(--xh-stroke-thin));
|
|
143
|
+
border: var(--xh-stroke-thin) solid transparent;
|
|
144
|
+
border-radius: var(--xh-icon-frame-radius, var(--xh-shape-circle));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
[data-scope='icon'][data-part='root'][data-frame][data-size='sm'] {
|
|
148
|
+
--xh-_icon-glyph: var(--xh-icon-frame-glyph-size, var(--xh-glyph-size-sm));
|
|
149
|
+
--xh-_icon-frame-size: var(--xh-icon-frame-size, var(--xh-control-h-sm));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
[data-scope='icon'][data-part='root'][data-frame][data-size='lg'] {
|
|
153
|
+
--xh-_icon-glyph: var(--xh-icon-frame-glyph-size, var(--xh-glyph-size-lg));
|
|
154
|
+
--xh-_icon-frame-size: var(--xh-icon-frame-size, var(--xh-control-h-lg));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* 头像只有三档;其余档的框沿用 md 档的内衬厚度:框直径 = 本档字形 + md 档框与字形之差 */
|
|
158
|
+
[data-scope='icon'][data-part='root'][data-frame][data-size='text'] {
|
|
159
|
+
--xh-_icon-glyph-step: var(--xh-glyph-size-text);
|
|
160
|
+
--xh-_icon-frame-step: calc(var(--xh-glyph-size-text) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
[data-scope='icon'][data-part='root'][data-frame][data-size='xl'] {
|
|
164
|
+
--xh-_icon-glyph-step: var(--xh-glyph-size-xl);
|
|
165
|
+
--xh-_icon-frame-step: calc(var(--xh-glyph-size-xl) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
[data-scope='icon'][data-part='root'][data-frame][data-size='2xl'] {
|
|
169
|
+
--xh-_icon-glyph-step: var(--xh-glyph-size-2xl);
|
|
170
|
+
--xh-_icon-frame-step: calc(var(--xh-glyph-size-2xl) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
[data-scope='icon'][data-part='root'][data-frame][data-size='3xl'] {
|
|
174
|
+
--xh-_icon-glyph-step: var(--xh-glyph-size-3xl);
|
|
175
|
+
--xh-_icon-frame-step: calc(var(--xh-glyph-size-3xl) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
[data-scope='icon'][data-part='root'][data-frame][data-size='4xl'] {
|
|
179
|
+
--xh-_icon-glyph-step: var(--xh-glyph-size-4xl);
|
|
180
|
+
--xh-_icon-frame-step: calc(var(--xh-glyph-size-4xl) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/* 框的四种形态只决定颜色怎么用;用哪族颜色由 data-tone 决定,没写语气取品牌实心 / 中性。
|
|
184
|
+
语气只认自己身上的 data-tone:语气槽会沿继承流下来,放在语气容器里的框不跟着改色。
|
|
185
|
+
实心档在顶边画一条极浅的内高光,把这块底座衬出厚度;另外三档面上没有实心底,不画 */
|
|
186
|
+
[data-scope='icon'][data-part='root'][data-frame='solid'] {
|
|
187
|
+
background: var(--xh-icon-frame-bg, var(--xh-bg-brand));
|
|
188
|
+
box-shadow: var(--xh-icon-frame-shadow, var(--xh-_highlight-brand));
|
|
189
|
+
color: var(--xh-icon-fg, var(--xh-fg-on-brand));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
[data-scope='icon'][data-part='root'][data-frame='solid'][data-tone] {
|
|
193
|
+
background: var(--xh-icon-frame-bg, var(--xh-_tone));
|
|
194
|
+
box-shadow: var(--xh-icon-frame-shadow, var(--xh-_highlight-tone));
|
|
195
|
+
color: var(--xh-icon-fg, var(--xh-_tone-on));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
[data-scope='icon'][data-part='root'][data-frame='subtle'] {
|
|
199
|
+
background: var(--xh-icon-frame-bg, var(--xh-bg-subtle));
|
|
200
|
+
color: var(--xh-icon-fg, var(--xh-fg-default));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
[data-scope='icon'][data-part='root'][data-frame='subtle'][data-tone] {
|
|
204
|
+
background: var(--xh-icon-frame-bg, var(--xh-_tone-subtle));
|
|
205
|
+
color: var(--xh-icon-fg, var(--xh-_tone-fg));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
[data-scope='icon'][data-part='root'][data-frame='outline'] {
|
|
209
|
+
border-color: var(--xh-icon-frame-border, var(--xh-border-default));
|
|
210
|
+
color: var(--xh-icon-fg, var(--xh-fg-default));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
[data-scope='icon'][data-part='root'][data-frame='outline'][data-tone] {
|
|
214
|
+
border-color: var(--xh-icon-frame-border, var(--xh-_tone-border));
|
|
215
|
+
color: var(--xh-icon-fg, var(--xh-_tone-fg));
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
[data-scope='icon'][data-part='root'][data-frame='ghost'] {
|
|
219
|
+
color: var(--xh-icon-fg, var(--xh-fg-default));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
[data-scope='icon'][data-part='root'][data-frame='ghost'][data-tone] {
|
|
223
|
+
color: var(--xh-icon-fg, var(--xh-_tone-fg));
|
|
224
|
+
}
|
|
125
225
|
}
|
package/css/image-cropper.css
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
/* 定义 image cropper 样式。 */
|
|
7
7
|
|
|
8
|
+
@import '../family/action-control.css';
|
|
9
|
+
|
|
8
10
|
@layer xihan.components {
|
|
9
11
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
10
12
|
[data-scope='image-cropper'] {
|
|
@@ -61,7 +63,7 @@
|
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
/* 圆形裁切取 circle 档(50%):shape 的固定长度档画出来是胶囊不是椭圆,
|
|
64
|
-
|
|
66
|
+
裁切框的宽高由数据决定、两边通常不等长,只有百分比才随框变成椭圆;圆角只能来自语义形状令牌 */
|
|
65
67
|
[data-scope='image-cropper'][data-part='crop-area'][data-shape='round'] {
|
|
66
68
|
--xh-_image-cropper-corner-radius: var(--xh-shape-circle);
|
|
67
69
|
|
|
@@ -90,17 +92,17 @@
|
|
|
90
92
|
linear-gradient(
|
|
91
93
|
to right,
|
|
92
94
|
transparent 0 33.3333%,
|
|
93
|
-
var(--xh-image-cropper-grid-line, var(--xh-
|
|
95
|
+
var(--xh-image-cropper-grid-line, var(--xh-bg-subtle-opaque)) 33.3333% calc(33.3333% + var(--xh-_image-cropper-grid-w)),
|
|
94
96
|
transparent calc(33.3333% + var(--xh-_image-cropper-grid-w)) 66.6667%,
|
|
95
|
-
var(--xh-image-cropper-grid-line, var(--xh-
|
|
97
|
+
var(--xh-image-cropper-grid-line, var(--xh-bg-subtle-opaque)) 66.6667% calc(66.6667% + var(--xh-_image-cropper-grid-w)),
|
|
96
98
|
transparent calc(66.6667% + var(--xh-_image-cropper-grid-w)) 100%
|
|
97
99
|
),
|
|
98
100
|
linear-gradient(
|
|
99
101
|
to bottom,
|
|
100
102
|
transparent 0 33.3333%,
|
|
101
|
-
var(--xh-image-cropper-grid-line, var(--xh-
|
|
103
|
+
var(--xh-image-cropper-grid-line, var(--xh-bg-subtle-opaque)) 33.3333% calc(33.3333% + var(--xh-_image-cropper-grid-w)),
|
|
102
104
|
transparent calc(33.3333% + var(--xh-_image-cropper-grid-w)) 66.6667%,
|
|
103
|
-
var(--xh-image-cropper-grid-line, var(--xh-
|
|
105
|
+
var(--xh-image-cropper-grid-line, var(--xh-bg-subtle-opaque)) 66.6667% calc(66.6667% + var(--xh-_image-cropper-grid-w)),
|
|
104
106
|
transparent calc(66.6667% + var(--xh-_image-cropper-grid-w)) 100%
|
|
105
107
|
);
|
|
106
108
|
pointer-events: none;
|
|
@@ -133,7 +135,7 @@
|
|
|
133
135
|
background: var(--xh-_image-cropper-handle-color);
|
|
134
136
|
pointer-events: none;
|
|
135
137
|
transition:
|
|
136
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
138
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
137
139
|
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
138
140
|
}
|
|
139
141
|
|
|
@@ -145,9 +147,10 @@
|
|
|
145
147
|
content: '';
|
|
146
148
|
}
|
|
147
149
|
|
|
148
|
-
/* 把手静息是白面(bg-surface
|
|
150
|
+
/* 把手静息是白面(bg-surface),悬停从同一语义面派生一档,不切到品牌淡底;拖动中才是品牌实心。
|
|
151
|
+
把手与网格线都压在照片上,取淡底的不透明档,照片深浅不一时才看得见 */
|
|
149
152
|
[data-scope='image-cropper'][data-part='crop-handle']:hover:not([data-disabled], [data-readonly]) {
|
|
150
|
-
--xh-_image-cropper-handle-color: var(--xh-image-cropper-handle-bg-hover, var(--xh-bg-subtle));
|
|
153
|
+
--xh-_image-cropper-handle-color: var(--xh-image-cropper-handle-bg-hover, var(--xh-bg-subtle-opaque));
|
|
151
154
|
}
|
|
152
155
|
|
|
153
156
|
[data-scope='image-cropper'][data-part='crop-handle'][data-resizing] {
|
|
@@ -327,6 +330,29 @@
|
|
|
327
330
|
accent-color: var(--xh-image-cropper-slider-accent, var(--xh-bg-brand));
|
|
328
331
|
}
|
|
329
332
|
|
|
333
|
+
/*
|
|
334
|
+
* 翻转按钮是裁切器旁的独立开关钮:盒型、sm 档几何、outline 四态面、0.97 按压与粗指针命中区由家族配方
|
|
335
|
+
* 按连接层投影的 data-xh-action-* 给出。翻着(data-state='on')是无滑块开关的选中面:品牌淡底 12 → 悬停 20
|
|
336
|
+
* → 按压 28,前景 fg-on-brand-subtle;outline 的描边不换,淡底面上没有描边就与悬停面分不开。
|
|
337
|
+
*/
|
|
338
|
+
[data-scope='image-cropper'][data-part='flip-trigger'] {
|
|
339
|
+
/* 作者塞进来的图标随档取字形尺(sm = 16px) */
|
|
340
|
+
--xh-icon-size: var(--xh-_action-profile-glyph-size);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
[data-scope='image-cropper'][data-part='flip-trigger'][data-state='on'] {
|
|
344
|
+
--xh-action-bg-rest: var(--xh-bg-brand-subtle);
|
|
345
|
+
--xh-action-bg-hover: var(--xh-bg-brand-subtle-hover);
|
|
346
|
+
--xh-action-bg-pressed: var(--xh-bg-brand-subtle-active);
|
|
347
|
+
--xh-action-bg-focus-visible: var(--xh-bg-brand-subtle);
|
|
348
|
+
/* 翻着又被禁用:底色掺一半中性面,选中信息不丢。掺的是淡底的不透明档,墨色淡底半透明 */
|
|
349
|
+
--xh-action-bg-disabled: color-mix(in oklab, var(--xh-bg-brand-subtle) 50%, var(--xh-bg-subtle-opaque));
|
|
350
|
+
--xh-action-fg-rest: var(--xh-fg-on-brand-subtle);
|
|
351
|
+
--xh-action-fg-hover: var(--xh-fg-on-brand-subtle);
|
|
352
|
+
--xh-action-fg-pressed: var(--xh-fg-on-brand-subtle);
|
|
353
|
+
--xh-action-fg-focus-visible: var(--xh-fg-on-brand-subtle);
|
|
354
|
+
}
|
|
355
|
+
|
|
330
356
|
/* 禁用的整体压暗只做一次,落在最外层:视口、裁切框、把手各自再叠一层会越叠越黑。
|
|
331
357
|
这里只用 opacity、不换前景色:框里是图像,没有文字可换。 */
|
|
332
358
|
[data-scope='image-cropper'][data-part='root'][data-disabled] {
|
package/css/image-viewer.css
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
/* 定义 image viewer 样式。 */
|
|
7
7
|
|
|
8
8
|
@import '../family/action-control.css';
|
|
9
|
+
@import '../family/loading-ring.css';
|
|
9
10
|
|
|
10
11
|
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
11
12
|
@import '../family/motion.css';
|
|
@@ -35,7 +36,7 @@
|
|
|
35
36
|
background: transparent;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
[data-scope='image-viewer'][data-part='backdrop'][data-state='open'] {
|
|
39
|
+
[data-scope='image-viewer'][data-part='backdrop'][data-state='open']:not([data-instant]) {
|
|
39
40
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
40
41
|
}
|
|
41
42
|
|
|
@@ -75,9 +76,8 @@
|
|
|
75
76
|
color: var(--xh-image-viewer-fg, var(--xh-color-neutral-0));
|
|
76
77
|
}
|
|
77
78
|
|
|
78
|
-
/*
|
|
79
|
-
[data-scope='image-viewer'][data-part='content'][data-state='open'] {
|
|
80
|
-
will-change: opacity;
|
|
79
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
80
|
+
[data-scope='image-viewer'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
81
81
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
82
82
|
}
|
|
83
83
|
|
|
@@ -106,36 +106,74 @@
|
|
|
106
106
|
cursor: progress;
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
/*
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
/* 取图期间画面正中一枚加载环:不给的话打开一张几 MB 的原图,台前是一整块什么都没有的暗底,
|
|
110
|
+
用户分不清是在加载还是这张图坏了。环由加载环配方画(连接层投影 data-xh-loading-ring),
|
|
111
|
+
随 data-loading 淡入淡出;前景随看片层的白墨域 */
|
|
112
|
+
[data-scope='image-viewer'][data-part='viewport'] {
|
|
113
|
+
/* 画面正中那两枚状态图形(加载环与警示字形)的尺:看片台是整幅画面,取控件图标档的最大一档 */
|
|
114
|
+
--xh-icon-size: var(--xh-image-viewer-status-size, var(--xh-glyph-size-lg));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
[data-scope='image-viewer'][data-part='viewport']::before {
|
|
118
|
+
content: '';
|
|
119
|
+
position: absolute;
|
|
120
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
121
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* 取图失败:画面正中一枚警示字形(取危险色,非颜色通道),替掉浏览器画的破图与替代文字 */
|
|
125
|
+
[data-scope='image-viewer'][data-part='viewport'][data-error]::after {
|
|
112
126
|
content: '';
|
|
113
127
|
position: absolute;
|
|
114
|
-
inline-size: var(--xh-
|
|
115
|
-
block-size: var(--xh-
|
|
116
|
-
|
|
117
|
-
|
|
128
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
129
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
130
|
+
background-color: var(--xh-image-viewer-error-fg, var(--xh-fg-danger));
|
|
131
|
+
-webkit-mask: var(--xh-glyph-mark-warning) center / contain no-repeat;
|
|
132
|
+
mask: var(--xh-glyph-mark-warning) center / contain no-repeat;
|
|
118
133
|
}
|
|
119
134
|
|
|
120
135
|
[data-scope='image-viewer'][data-part='image'] {
|
|
121
136
|
max-inline-size: 90%;
|
|
122
137
|
max-block-size: 85%;
|
|
123
138
|
user-select: none;
|
|
124
|
-
/*
|
|
125
|
-
|
|
139
|
+
/* 位移、旋转与缩放都是内联 style 写的,只给按钮带来的缩放旋转一点缓动;拖拽平移要跟手,不缓。
|
|
140
|
+
新图取到之后淡入 */
|
|
141
|
+
transition:
|
|
142
|
+
translate var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous),
|
|
143
|
+
rotate var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous),
|
|
144
|
+
scale var(--xh-motion-duration-nudge) var(--xh-motion-ease-continuous),
|
|
145
|
+
opacity var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* 取图期间(打开与换下标):换图那一刻变换直接归位、不补间——转过、放大过的旧图不当着用户转回、缩回;
|
|
149
|
+
旧图随即让位,视口垫着的占位面顶上,不露底色闪一拍。取到之后撤掉这一档,按上面的进场档淡入 */
|
|
150
|
+
[data-scope='image-viewer'][data-part='image'][data-loading] {
|
|
151
|
+
opacity: 0;
|
|
152
|
+
transition: none;
|
|
126
153
|
}
|
|
127
154
|
|
|
128
|
-
/*
|
|
155
|
+
/* 载不出来的图不露浏览器的破图:整张让位给视口正中的警示字形,替代文字仍在可及树里 */
|
|
156
|
+
[data-scope='image-viewer'][data-part='image'][data-error] {
|
|
157
|
+
visibility: hidden;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* 拖拽期间平移每帧都在改:只在这一档备好合成层,松手后随 data-dragging 一起撤掉 */
|
|
129
161
|
[data-scope='image-viewer'][data-part='image'][data-dragging] {
|
|
130
162
|
transition: none;
|
|
131
|
-
will-change:
|
|
163
|
+
will-change: translate;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* 松手后弹簧带着平移惯性滑行、越出范围时回弹,同样逐帧写变换,不能再叠一层过渡;落定即撤 */
|
|
167
|
+
[data-scope='image-viewer'][data-part='image'][data-animating] {
|
|
168
|
+
transition: none;
|
|
169
|
+
will-change: translate;
|
|
132
170
|
}
|
|
133
171
|
|
|
134
172
|
/* —— 悬浮件共用:半透明深底加浅字 ——
|
|
135
173
|
四件都钉在铺满视口的那一层的边上,贴边一律与安全区取大的一头:刘海、圆角与
|
|
136
174
|
底部横条压住的那一段由系统给出,贴边比它窄时钮会被切掉一角;桌面上 env() 恒为 0。
|
|
137
175
|
安全区只有物理方向的四个名字,行内轴上两侧同取较宽的那一段,RTL 下不会翻错边。
|
|
138
|
-
工具条是容器、计数是一行字的气泡,各按身份取圆角(surface / control
|
|
176
|
+
工具条是容器、计数是一行字的气泡,各按身份取圆角(surface / control),
|
|
139
177
|
--xh-image-viewer-overlay-radius 仍是两者共用的使用者入口;翻页钮的面走下面的桥接槽 */
|
|
140
178
|
[data-scope='image-viewer'][data-part='toolbar'],
|
|
141
179
|
[data-scope='image-viewer'][data-part='counter'] {
|
|
@@ -157,6 +195,11 @@
|
|
|
157
195
|
border-radius: var(--xh-image-viewer-toolbar-radius-outer, var(--xh-image-viewer-overlay-radius, var(--xh-shape-surface)));
|
|
158
196
|
}
|
|
159
197
|
|
|
198
|
+
/* 起点是逻辑属性、平移是物理通道:rtl 下行内分量掉头,工具条与计数才落回中线 */
|
|
199
|
+
[data-scope='image-viewer'][data-part='toolbar']:dir(rtl) {
|
|
200
|
+
translate: 50% 0;
|
|
201
|
+
}
|
|
202
|
+
|
|
160
203
|
/* 工具条里的七颗钮:接 Action Control icon 档 xs(24px 视觉盒),底色交给工具条,本体只管命中区与按压。
|
|
161
204
|
悬停 / 按下的底从 chrome 那层深底派生,不取页面的 --xh-bg-subtle-* 阶梯。
|
|
162
205
|
position 交给配方的 relative:粗指针下 44px 命中区 ::after 以钮自身为包含块;
|
|
@@ -171,7 +214,7 @@
|
|
|
171
214
|
--xh-action-fg-hover: currentColor;
|
|
172
215
|
--xh-action-fg-pressed: currentColor;
|
|
173
216
|
--xh-action-fg-focus-visible: currentColor;
|
|
174
|
-
--xh-action-fg-disabled:
|
|
217
|
+
--xh-action-fg-disabled: var(--xh-fg-disabled);
|
|
175
218
|
--xh-action-border-rest: transparent;
|
|
176
219
|
--xh-action-border-hover: transparent;
|
|
177
220
|
--xh-action-border-pressed: transparent;
|
|
@@ -190,7 +233,11 @@
|
|
|
190
233
|
font-size: var(--xh-text-secondary-size);
|
|
191
234
|
}
|
|
192
235
|
|
|
193
|
-
|
|
236
|
+
[data-scope='image-viewer'][data-part='counter']:dir(rtl) {
|
|
237
|
+
translate: 50% 0;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* 两颗翻页钮:浮在图上的单图标圆钮,接 Action Control floating 档 md(48px,正方盒取 circle)。
|
|
194
241
|
面桥接到自家深色 chrome:跟的是图上那层半透明深底不是页面底色,所以不取 frosted 缺省面,
|
|
195
242
|
也不取语义档的 --xh-bg-subtle-*;到头时是原生 disabled,压不动的东西不给回应 */
|
|
196
243
|
[data-scope='image-viewer'][data-part='prev-trigger'],
|
|
@@ -204,7 +251,7 @@
|
|
|
204
251
|
--xh-action-fg-hover: currentColor;
|
|
205
252
|
--xh-action-fg-pressed: currentColor;
|
|
206
253
|
--xh-action-fg-focus-visible: currentColor;
|
|
207
|
-
--xh-action-fg-disabled:
|
|
254
|
+
--xh-action-fg-disabled: var(--xh-fg-disabled);
|
|
208
255
|
--xh-action-border-rest: transparent;
|
|
209
256
|
--xh-action-border-hover: transparent;
|
|
210
257
|
--xh-action-border-pressed: transparent;
|
|
@@ -229,7 +276,8 @@
|
|
|
229
276
|
translate: 0 -50%;
|
|
230
277
|
}
|
|
231
278
|
|
|
232
|
-
/*
|
|
279
|
+
/* 右上角的关闭钮:悬浮在媒体上的单图标动作,与翻页钮同走 Action Control floating 档(sm = 40px、圆形);
|
|
280
|
+
面与翻页钮同一层深色 chrome */
|
|
233
281
|
[data-scope='image-viewer'][data-part='close-trigger'] {
|
|
234
282
|
--xh-action-bg-rest: var(--xh-_image-viewer-chrome-bg);
|
|
235
283
|
--xh-action-bg-hover: var(--xh-image-viewer-close-bg-hover, var(--xh-_image-viewer-chrome-bg-hover));
|
|
@@ -241,13 +289,13 @@
|
|
|
241
289
|
--xh-action-fg-hover: var(--xh-image-viewer-close-fg, currentColor);
|
|
242
290
|
--xh-action-fg-pressed: var(--xh-image-viewer-close-fg, currentColor);
|
|
243
291
|
--xh-action-fg-focus-visible: var(--xh-image-viewer-close-fg, currentColor);
|
|
244
|
-
--xh-action-fg-disabled: var(--xh-
|
|
292
|
+
--xh-action-fg-disabled: var(--xh-fg-disabled);
|
|
245
293
|
--xh-action-border-rest: transparent;
|
|
246
294
|
--xh-action-border-hover: transparent;
|
|
247
295
|
--xh-action-border-pressed: transparent;
|
|
248
296
|
--xh-action-border-focus-visible: transparent;
|
|
249
297
|
--xh-action-border-disabled: transparent;
|
|
250
|
-
--xh-action-radius: var(--xh-image-viewer-close-radius, var(--xh-shape-
|
|
298
|
+
--xh-action-radius: var(--xh-image-viewer-close-radius, var(--xh-shape-circle));
|
|
251
299
|
--xh-action-visual-size: var(--xh-image-viewer-close-size, var(--xh-_action-profile-visual-size));
|
|
252
300
|
--xh-icon-size: var(--xh-image-viewer-icon-size, var(--xh-_action-profile-glyph-size));
|
|
253
301
|
|
|
@@ -257,6 +305,80 @@
|
|
|
257
305
|
inset-inline-end: max(var(--xh-space-6), env(safe-area-inset-left), env(safe-area-inset-right));
|
|
258
306
|
}
|
|
259
307
|
|
|
308
|
+
/* liquid 档:data-material="liquid" 下控制层换成液态面,深色纱那一套只属于 standard 档。
|
|
309
|
+
液态面按下层(使用者的图片、遮罩)写墨色域,前景跟着墨色走,不再钉在浅字上。
|
|
310
|
+
工具条是不贴边的一维栏、计数是一行字的 chip,取 pill;翻页与关闭是媒体控制钮,取 circle */
|
|
311
|
+
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='toolbar'][data-xh-liquid],
|
|
312
|
+
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='counter'][data-xh-liquid] {
|
|
313
|
+
border: var(--xh-stroke-thin) solid var(--xh-material-liquid-border);
|
|
314
|
+
background: var(--xh-image-viewer-chrome-bg, var(--xh-_liquid-bg));
|
|
315
|
+
color: var(--xh-material-liquid-fg);
|
|
316
|
+
box-shadow: var(--xh-_liquid-shadow);
|
|
317
|
+
-webkit-backdrop-filter: var(--xh-material-liquid-backdrop);
|
|
318
|
+
backdrop-filter: var(--xh-material-liquid-backdrop);
|
|
319
|
+
/* 换到深浅不同的图上时色调翻转:底色、字色、细线与投影一起淡变 */
|
|
320
|
+
transition:
|
|
321
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
322
|
+
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
323
|
+
color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
324
|
+
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='toolbar'][data-xh-liquid] {
|
|
328
|
+
border-radius: var(--xh-image-viewer-toolbar-radius-outer, var(--xh-image-viewer-overlay-radius, var(--xh-shape-pill)));
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='counter'][data-xh-liquid] {
|
|
332
|
+
border-radius: var(--xh-image-viewer-counter-radius, var(--xh-image-viewer-overlay-radius, var(--xh-shape-pill)));
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/* 工具条里的钮:悬停 / 按下取墨色淡底阶梯,工具条这块液态面就是它们的墨色域 */
|
|
336
|
+
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='toolbar'][data-xh-liquid] > [data-part] {
|
|
337
|
+
--xh-action-bg-hover: var(--xh-image-viewer-action-bg-hover, var(--xh-bg-subtle));
|
|
338
|
+
--xh-action-bg-pressed: var(--xh-image-viewer-action-bg-active, var(--xh-bg-subtle-hover));
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='prev-trigger'][data-xh-liquid],
|
|
342
|
+
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='next-trigger'][data-xh-liquid],
|
|
343
|
+
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='close-trigger'][data-xh-liquid] {
|
|
344
|
+
--xh-action-bg-rest: var(--xh-image-viewer-chrome-bg, var(--xh-_liquid-bg));
|
|
345
|
+
--xh-action-bg-hover: var(--xh-image-viewer-action-bg-hover, var(--xh-_liquid-bg-hover));
|
|
346
|
+
--xh-action-bg-pressed: var(--xh-image-viewer-action-bg-active, var(--xh-_liquid-bg-pressed));
|
|
347
|
+
--xh-action-bg-focus-visible: var(--xh-image-viewer-chrome-bg, var(--xh-material-liquid-focus-surface));
|
|
348
|
+
--xh-action-bg-disabled: var(--xh-image-viewer-chrome-bg, var(--xh-_liquid-bg));
|
|
349
|
+
--xh-action-fg-rest: var(--xh-material-liquid-fg);
|
|
350
|
+
--xh-action-fg-hover: var(--xh-material-liquid-fg);
|
|
351
|
+
--xh-action-fg-pressed: var(--xh-material-liquid-fg);
|
|
352
|
+
--xh-action-fg-focus-visible: var(--xh-material-liquid-fg);
|
|
353
|
+
--xh-action-border-rest: var(--xh-material-liquid-border);
|
|
354
|
+
--xh-action-border-hover: var(--xh-material-liquid-border);
|
|
355
|
+
--xh-action-border-pressed: var(--xh-material-liquid-border);
|
|
356
|
+
--xh-action-border-focus-visible: var(--xh-material-liquid-border);
|
|
357
|
+
--xh-action-border-disabled: var(--xh-material-liquid-border);
|
|
358
|
+
--xh-action-fg-disabled: var(--xh-fg-disabled);
|
|
359
|
+
--xh-action-shadow-rest: var(--xh-_liquid-shadow);
|
|
360
|
+
--xh-action-shadow-hover: var(--xh-_liquid-shadow);
|
|
361
|
+
--xh-action-shadow-pressed: var(--xh-_liquid-shadow);
|
|
362
|
+
--xh-action-shadow-focus-visible: var(--xh-_liquid-shadow);
|
|
363
|
+
--xh-action-shadow-disabled: var(--xh-_liquid-shadow);
|
|
364
|
+
|
|
365
|
+
color: var(--xh-material-liquid-fg);
|
|
366
|
+
-webkit-backdrop-filter: var(--xh-material-liquid-backdrop);
|
|
367
|
+
backdrop-filter: var(--xh-material-liquid-backdrop);
|
|
368
|
+
transform: var(--xh-_liquid-deform);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/* 叉的前景仍认使用者的那支槽;圆钮取 circle */
|
|
372
|
+
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='close-trigger'][data-xh-liquid] {
|
|
373
|
+
--xh-action-fg-rest: var(--xh-image-viewer-close-fg, var(--xh-material-liquid-fg));
|
|
374
|
+
--xh-action-fg-hover: var(--xh-image-viewer-close-fg, var(--xh-material-liquid-fg));
|
|
375
|
+
--xh-action-fg-pressed: var(--xh-image-viewer-close-fg, var(--xh-material-liquid-fg));
|
|
376
|
+
--xh-action-fg-focus-visible: var(--xh-image-viewer-close-fg, var(--xh-material-liquid-fg));
|
|
377
|
+
--xh-action-bg-hover: var(--xh-image-viewer-close-bg-hover, var(--xh-_liquid-bg-hover));
|
|
378
|
+
--xh-action-bg-pressed: var(--xh-image-viewer-close-bg-active, var(--xh-_liquid-bg-pressed));
|
|
379
|
+
--xh-action-radius: var(--xh-image-viewer-close-radius, var(--xh-shape-circle));
|
|
380
|
+
}
|
|
381
|
+
|
|
260
382
|
/* 三颗钮的面是一层深色纱,纱底下是使用者的图片,环色算不出稳定的取值。
|
|
261
383
|
content 把前景钉死在浅字上、三颗钮的前景随它继承,环取 currentColor 即是那支浅字,
|
|
262
384
|
不随图片内容也不随主题翻 */
|
|
@@ -270,10 +392,6 @@
|
|
|
270
392
|
display: none;
|
|
271
393
|
}
|
|
272
394
|
|
|
273
|
-
[data-scope='image-viewer'] button[data-part]:disabled {
|
|
274
|
-
opacity: var(--xh-state-disabled-opacity);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
395
|
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
278
396
|
[data-scope='image-viewer'][data-part='zoom-in-trigger']:empty::before {
|
|
279
397
|
content: '';
|
|
@@ -392,4 +510,29 @@
|
|
|
392
510
|
display: none;
|
|
393
511
|
}
|
|
394
512
|
}
|
|
513
|
+
|
|
514
|
+
@media (forced-colors: active) {
|
|
515
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
516
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
517
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
518
|
+
落在 Canvas 面上的取 CanvasText;
|
|
519
|
+
禁用取 GrayText */
|
|
520
|
+
[data-scope='image-viewer'][data-part='viewport'][data-error]::after {
|
|
521
|
+
forced-color-adjust: none;
|
|
522
|
+
background-color: CanvasText;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
[data-scope='image-viewer']:is([data-part='zoom-in-trigger'], [data-part='zoom-out-trigger'], [data-part='rotate-left-trigger'], [data-part='rotate-right-trigger'], [data-part='flip-horizontal-trigger'], [data-part='flip-vertical-trigger'], [data-part='prev-trigger'], [data-part='next-trigger'], [data-part='close-trigger']):empty::before {
|
|
526
|
+
forced-color-adjust: none;
|
|
527
|
+
background-color: ButtonText;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
[data-scope='image-viewer']:is([data-part='zoom-in-trigger'], [data-part='zoom-out-trigger'], [data-part='rotate-left-trigger'], [data-part='rotate-right-trigger'], [data-part='flip-horizontal-trigger'], [data-part='flip-vertical-trigger'], [data-part='prev-trigger'], [data-part='next-trigger'], [data-part='close-trigger']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
531
|
+
background-color: HighlightText;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
[data-scope='image-viewer']:is([data-part='zoom-in-trigger'], [data-part='zoom-out-trigger'], [data-part='rotate-left-trigger'], [data-part='rotate-right-trigger'], [data-part='flip-horizontal-trigger'], [data-part='flip-vertical-trigger'], [data-part='prev-trigger'], [data-part='next-trigger'], [data-part='close-trigger'])[data-disabled]:empty::before {
|
|
535
|
+
background-color: GrayText;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
395
538
|
}
|
package/css/image.css
CHANGED
|
@@ -42,18 +42,30 @@
|
|
|
42
42
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
/*
|
|
45
|
+
/* 占位层还在(正淡出)时图片不再自己淡入:它在占位层底下直接落位,由占位层的淡出揭开,
|
|
46
|
+
模糊小图与图片交叉,不先透出一拍底色 */
|
|
47
|
+
[data-scope='image'][data-part='root']:has(> [data-part='placeholder']:not([hidden])) > [data-part='image'] {
|
|
48
|
+
animation: none;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* 铺满图位的占位层:加载期间占住画面,作者往里放骨架屏或模糊小图。它叠在图位自己的淡底上,
|
|
52
|
+
取不透明档,不与底下那层叠深 */
|
|
46
53
|
[data-scope='image'][data-part='placeholder'] {
|
|
47
54
|
position: absolute;
|
|
48
55
|
inset: 0;
|
|
49
56
|
display: flex;
|
|
50
57
|
align-items: center;
|
|
51
58
|
justify-content: center;
|
|
52
|
-
background: var(--xh-image-placeholder-bg, var(--xh-bg-subtle-hover));
|
|
59
|
+
background: var(--xh-image-placeholder-bg, var(--xh-bg-subtle-hover-opaque));
|
|
53
60
|
color: var(--xh-image-placeholder-fg, var(--xh-fg-subtle));
|
|
54
61
|
}
|
|
55
62
|
|
|
56
|
-
/*
|
|
63
|
+
/* 图片落位或失败:占位层原地淡出(它盖在图位之上),播完连接层才写 hidden */
|
|
64
|
+
[data-scope='image'][data-part='placeholder']:is([data-state='loaded'], [data-state='error']) {
|
|
65
|
+
animation: xh-fade-out var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) forwards;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* display 会盖掉 hidden 属性的 UA 规则:淡出播完之后靠这条收起 */
|
|
57
69
|
[data-scope='image'][data-part='placeholder'][hidden] {
|
|
58
70
|
display: none;
|
|
59
71
|
}
|
|
@@ -72,7 +84,14 @@
|
|
|
72
84
|
user-select: none;
|
|
73
85
|
}
|
|
74
86
|
|
|
75
|
-
/*
|
|
87
|
+
/* 图片载好:回退内容浮到图片之上原地淡出,与图片的淡入交叉;播完连接层才写 hidden */
|
|
88
|
+
[data-scope='image'][data-part='fallback'][data-state='loaded'] {
|
|
89
|
+
position: absolute;
|
|
90
|
+
inset: 0;
|
|
91
|
+
animation: xh-fade-out var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) forwards;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* display 会盖掉 hidden 属性的 UA 规则:延迟窗口内与淡出播完之后靠这条收起 */
|
|
76
95
|
[data-scope='image'][data-part='fallback'][hidden] {
|
|
77
96
|
display: none;
|
|
78
97
|
}
|
package/css/infinite-scroll.css
CHANGED
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
|
|
39
39
|
/*
|
|
40
40
|
* 取下一页的按钮:与哨兵同一条通路的键盘入口,摆在列表末尾自成一行——铺满一行的独立动作条目,
|
|
41
|
-
* 接 Action Control 的 row 档、outline
|
|
41
|
+
* 接 Action Control 的 row 档、outline 形态:宽度由容器给、高度随内容、按下只换面不缩放;
|
|
42
42
|
* 盒几何、中性描边与透明底、悬停 / 按下 / 禁用面、焦点环与粗指针热区全由家族给,
|
|
43
43
|
* 白底承载 hover 100 → pressed 200。这里只把使用者槽映射到桥接槽,并把文案居中:
|
|
44
44
|
* 它是一行里唯一的东西,靠起始缘会像一条没对齐的列表项。
|
|
45
|
-
* 行高不吃家族的单行档:row
|
|
45
|
+
* 行高不吃家族的单行档:row 档允许换行、高度随内容,折行的文案走正文行高
|
|
46
46
|
*/
|
|
47
47
|
[data-scope='infinite-scroll'][data-part='load-more-trigger'] {
|
|
48
48
|
--xh-action-gap: var(--xh-infinite-scroll-load-more-gap, var(--xh-_action-profile-gap));
|
package/css/input-group.css
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
--xh-_input-group-font-size: var(--xh-control-font-md);
|
|
24
24
|
--xh-_input-group-bg: transparent;
|
|
25
25
|
--xh-_input-group-bg-hover: color-mix(in oklab, var(--xh-bg-subtle) 45%, transparent);
|
|
26
|
-
/* 组壳按字段外壳画 outline
|
|
26
|
+
/* 组壳按字段外壳画 outline 描边:静息 --xh-border-control、悬停升 -hover、聚焦换 -focus,无影 */
|
|
27
27
|
--xh-_input-group-border: var(--xh-border-control);
|
|
28
28
|
--xh-_input-group-border-hover: var(--xh-border-control-hover);
|
|
29
29
|
--xh-_input-group-border-focus: var(--xh-border-control-focus);
|
|
@@ -33,6 +33,8 @@
|
|
|
33
33
|
display: inline-flex;
|
|
34
34
|
box-sizing: border-box;
|
|
35
35
|
align-items: stretch;
|
|
36
|
+
/* 整组是一个字段:不传尺寸时与单个字段同宽,组里的字段让位占满前后缀之外的那段 */
|
|
37
|
+
inline-size: var(--xh-input-group-w, var(--xh-control-w));
|
|
36
38
|
border-radius: var(--xh-input-group-radius, var(--xh-shape-control));
|
|
37
39
|
background: var(--xh-input-group-bg, var(--xh-_input-group-bg));
|
|
38
40
|
box-shadow: var(--xh-input-group-shadow, var(--xh-_input-group-shadow));
|
|
@@ -40,7 +42,7 @@
|
|
|
40
42
|
/* 父容器给不出这么宽时整组跟着收,不越出父容器 */
|
|
41
43
|
max-inline-size: 100%;
|
|
42
44
|
transition:
|
|
43
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
45
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
44
46
|
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
45
47
|
}
|
|
46
48
|
|
|
@@ -56,7 +58,7 @@
|
|
|
56
58
|
transition: border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
57
59
|
}
|
|
58
60
|
|
|
59
|
-
/* subtle:淡底顶替描边表达边界,描边只退成透明而不去掉;悬停浮出 --xh-border-control
|
|
61
|
+
/* subtle:淡底顶替描边表达边界,描边只退成透明而不去掉;悬停浮出 --xh-border-control */
|
|
60
62
|
[data-scope='input-group'][data-part='root'][data-variant='subtle'] {
|
|
61
63
|
--xh-_input-group-bg: var(--xh-bg-subtle);
|
|
62
64
|
--xh-_input-group-bg-hover: var(--xh-bg-subtle-hover);
|
|
@@ -175,6 +177,14 @@
|
|
|
175
177
|
box-shadow: none;
|
|
176
178
|
}
|
|
177
179
|
|
|
180
|
+
/* 组里的字段(带字段外壳的控件)占满前后缀与动作之外的剩余宽度,自己的缺省宽让位;
|
|
181
|
+
前后缀、按钮这些段按内容宽,不跟着撑开 */
|
|
182
|
+
[data-scope='input-group'][data-part='root'] > :is([data-xh-field-chrome], :has([data-xh-field-chrome])) {
|
|
183
|
+
flex: 1 1 0%;
|
|
184
|
+
min-inline-size: 0;
|
|
185
|
+
inline-size: auto;
|
|
186
|
+
}
|
|
187
|
+
|
|
178
188
|
/* 每一段都是定位元素,动作控件的悬停面可以浮到外轮廓之上。 */
|
|
179
189
|
[data-scope='input-group'][data-part='root'] > * {
|
|
180
190
|
position: relative;
|
|
@@ -239,18 +249,6 @@
|
|
|
239
249
|
display: none;
|
|
240
250
|
}
|
|
241
251
|
|
|
242
|
-
@media (prefers-reduced-motion: reduce) {
|
|
243
|
-
[data-scope='input-group'][data-part='root'],
|
|
244
|
-
[data-scope='input-group'][data-part='root']::before {
|
|
245
|
-
transition: none;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
:where([data-motion='reduce']) [data-scope='input-group'][data-part='root'],
|
|
250
|
-
:where([data-motion='reduce']) [data-scope='input-group'][data-part='root']::before {
|
|
251
|
-
transition: none;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
252
|
@media (forced-colors: active) {
|
|
255
253
|
[data-scope='input-group'][data-part='root'] {
|
|
256
254
|
background: Canvas;
|