@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/notification.css
CHANGED
|
@@ -12,11 +12,12 @@
|
|
|
12
12
|
@import '../family/loading-ring.css';
|
|
13
13
|
|
|
14
14
|
@layer xihan.motion {
|
|
15
|
-
/*
|
|
15
|
+
/* 叠放的一摞:新卡片从叠放外沿推进来一小段(--xh-motion-distance-lg),同时淡入、落到自己的折叠层级。
|
|
16
|
+
位移不取整卡高:一句话的轻提示整张推进来又快又远,读起来是一下猛冲;减弱动效下位移归零,只剩淡入 */
|
|
16
17
|
@keyframes xh-notification-stack-in {
|
|
17
18
|
from {
|
|
18
19
|
opacity: var(--xh-_enter-from-opacity, 0);
|
|
19
|
-
translate: 0 calc(var(--xh-_notification-stack-dir, 1) * (var(--xh-_notification-offset, 0px) - var(--xh-motion-
|
|
20
|
+
translate: 0 calc(var(--xh-_notification-stack-dir, 1) * (var(--xh-_notification-offset, 0px) - var(--xh-_notification-travel, var(--xh-motion-distance-lg))));
|
|
20
21
|
scale: var(--xh-notification-stack-scale, var(--xh-_notification-stack-scale));
|
|
21
22
|
}
|
|
22
23
|
|
|
@@ -36,7 +37,7 @@
|
|
|
36
37
|
|
|
37
38
|
to {
|
|
38
39
|
opacity: 0;
|
|
39
|
-
translate: 0 calc(var(--xh-_notification-stack-dir, 1) * (var(--xh-_notification-y, 0px) - var(--xh-motion-
|
|
40
|
+
translate: 0 calc(var(--xh-_notification-stack-dir, 1) * (var(--xh-_notification-y, 0px) - var(--xh-_notification-travel, var(--xh-motion-distance-lg))));
|
|
40
41
|
scale: var(--xh-_notification-scale, 1);
|
|
41
42
|
}
|
|
42
43
|
}
|
|
@@ -142,7 +143,7 @@
|
|
|
142
143
|
*/
|
|
143
144
|
[data-scope='notification'][data-part='group'][data-stacked] {
|
|
144
145
|
inset: auto;
|
|
145
|
-
inline-size: min(var(--xh-notification-item-w, var(--xh-overlay-
|
|
146
|
+
inline-size: min(var(--xh-notification-item-w, var(--xh-overlay-notification-w)), calc(100vw - var(--xh-space-8)));
|
|
146
147
|
block-size: 0;
|
|
147
148
|
padding: 0;
|
|
148
149
|
}
|
|
@@ -218,8 +219,9 @@
|
|
|
218
219
|
/*
|
|
219
220
|
* 一张通知:底与描边一律中性,面走 sheet 三件套(--xh-material-elevated-bg / -border / -shadow,
|
|
220
221
|
* 亮暗两档同有 1px 描边)。两种预设共用这张面,排版分开写在下面:
|
|
221
|
-
*
|
|
222
|
-
*
|
|
222
|
+
* 卡片是两列网格,左列一枚 24px 类型字形、右列「标题 + 说明 + 操作」、叉钉在右上角,
|
|
223
|
+
* 缺省宽 300px、四边内衬 20px(--xh-overlay-notification-p,紧凑 16px)、浮层圆角;
|
|
224
|
+
* 轻提示是一行,行首字形、文本列、操作钮与叉依次排开,圆角取 control、内衬纵 10 横 16。
|
|
223
225
|
*
|
|
224
226
|
* 卡片的槽带 item 段(--xh-notification-item-*),与摞的 --xh-notification-inset 分开。
|
|
225
227
|
*/
|
|
@@ -235,12 +237,12 @@
|
|
|
235
237
|
align-items: start;
|
|
236
238
|
column-gap: var(--xh-notification-item-gap, var(--xh-space-3));
|
|
237
239
|
row-gap: var(--xh-notification-item-row-gap, var(--xh-space-2));
|
|
238
|
-
inline-size: var(--xh-notification-item-w, var(--xh-overlay-
|
|
240
|
+
inline-size: var(--xh-notification-item-w, var(--xh-overlay-notification-w));
|
|
239
241
|
/* 摞是整面视口宽的定位面且带内边距,取 100% 就等于自动让出两侧留白,
|
|
240
242
|
窄屏上不必再算一遍 viewport 减法 */
|
|
241
243
|
max-inline-size: 100%;
|
|
242
|
-
padding-block: var(--xh-notification-item-py, var(--xh-
|
|
243
|
-
padding-inline: var(--xh-notification-item-px, var(--xh-
|
|
244
|
+
padding-block: var(--xh-notification-item-py, var(--xh-overlay-notification-p));
|
|
245
|
+
padding-inline: var(--xh-notification-item-px, var(--xh-overlay-notification-p));
|
|
244
246
|
border: var(--xh-stroke-thin) solid var(--xh-notification-item-border, var(--xh-material-elevated-border));
|
|
245
247
|
border-radius: var(--xh-notification-item-radius, var(--xh-shape-overlay));
|
|
246
248
|
background: var(--xh-notification-item-bg, var(--xh-material-elevated-bg));
|
|
@@ -251,8 +253,8 @@
|
|
|
251
253
|
/* 摞的定位面整面铺开且不吃指针,卡片必须自己吃回来:
|
|
252
254
|
悬停按住计时、按钮可点、焦点进出,全指着这一条 */
|
|
253
255
|
pointer-events: auto;
|
|
254
|
-
/*
|
|
255
|
-
|
|
256
|
+
/* 换位(一张卡收起、被挤掉或新卡插进来)由列表动效在 transform 上播一段:时长读 move、曲线读 continuous,
|
|
257
|
+
与进退场关键帧的 translate 叠加,这里不写过渡。叠成一摞时另有自己的过渡清单(见下) */
|
|
256
258
|
}
|
|
257
259
|
|
|
258
260
|
/* 轻提示:一行排开,行首那一格贴着内容盒的起始角,文本列与两颗钮在行里垂直居中。
|
|
@@ -263,8 +265,10 @@
|
|
|
263
265
|
align-items: flex-start;
|
|
264
266
|
column-gap: var(--xh-notification-item-gap, var(--xh-space-2));
|
|
265
267
|
inline-size: var(--xh-notification-item-w, var(--xh-overlay-toast-w));
|
|
266
|
-
padding-block: var(--xh-notification-item-py, var(--xh-space-
|
|
268
|
+
padding-block: var(--xh-notification-item-py, var(--xh-space-2_5));
|
|
267
269
|
padding-inline: var(--xh-notification-item-px, var(--xh-space-4));
|
|
270
|
+
/* 一行短消息不是一块面板,形状取 control */
|
|
271
|
+
border-radius: var(--xh-notification-item-radius, var(--xh-shape-control));
|
|
268
272
|
font-size: var(--xh-notification-item-font-size, var(--xh-text-label-size));
|
|
269
273
|
/* 叠摞几何常驻:单独摆放时是恒等位移与比例,放进叠放的一摞后由那边换成层深,
|
|
270
274
|
两处用同一套画法,卡片进出一摞时栅格不跳 */
|
|
@@ -301,6 +305,53 @@
|
|
|
301
305
|
animation: xh-sheet-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
302
306
|
}
|
|
303
307
|
|
|
308
|
+
/* 还在台上就被移出队列的卡片(超出上限被挤掉、dismiss / dismissAll 直接删)没有自己的退场,
|
|
309
|
+
列表动效在原处放一个替身(data-state="closed"),同一条退场播完即撤 */
|
|
310
|
+
[data-scope='notification'][data-part='item'][data-state='closed'] {
|
|
311
|
+
animation: xh-sheet-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/*
|
|
315
|
+
* 逐条排开的卡片预设:从所贴的那条边整张推进来,边推边淡入——贴行尾的从行尾进、贴行首的从行首进,
|
|
316
|
+
* 居中的三个位从各自贴的那条边(顶 / 底)进,中线那一行只上浮一小段。位移是卡片自身的整宽或整高
|
|
317
|
+
* (--xh-motion-travel),减弱动效下归零,只剩淡入。退场只淡出,不往回推:空位由换位把后面的卡平滑收拢。
|
|
318
|
+
* 方向从所在那一摞的 data-placement 选过来,九个位是固定的枚举
|
|
319
|
+
*/
|
|
320
|
+
[data-scope='notification'][data-part='group']:not([data-stacked]) [data-scope='notification'][data-part='item'][data-preset='card'] {
|
|
321
|
+
--xh-_enter-from-opacity: 0;
|
|
322
|
+
--xh-_slide-from-x: 0;
|
|
323
|
+
--xh-_slide-from-y: var(--xh-motion-distance-lg);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
[data-scope='notification'][data-part='group']:not([data-stacked])[data-placement$='-end'] [data-scope='notification'][data-part='item'][data-preset='card'] {
|
|
327
|
+
--xh-_slide-from-x: calc(var(--xh-motion-travel) * var(--xh-direction-sign));
|
|
328
|
+
--xh-_slide-from-y: 0;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
[data-scope='notification'][data-part='group']:not([data-stacked])[data-placement$='-start'] [data-scope='notification'][data-part='item'][data-preset='card'] {
|
|
332
|
+
--xh-_slide-from-x: calc(var(--xh-motion-travel) * var(--xh-direction-sign) * -1);
|
|
333
|
+
--xh-_slide-from-y: 0;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
[data-scope='notification'][data-part='group']:not([data-stacked])[data-placement='top'] [data-scope='notification'][data-part='item'][data-preset='card'] {
|
|
337
|
+
--xh-_slide-from-y: calc(var(--xh-motion-travel) * -1);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
[data-scope='notification'][data-part='group']:not([data-stacked])[data-placement='bottom'] [data-scope='notification'][data-part='item'][data-preset='card'] {
|
|
341
|
+
--xh-_slide-from-y: var(--xh-motion-travel);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
[data-scope='notification'][data-part='group']:not([data-stacked]) [data-scope='notification'][data-part='item'][data-preset='card'][data-state='visible'] {
|
|
345
|
+
animation:
|
|
346
|
+
xh-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong) backwards,
|
|
347
|
+
xh-slide-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) backwards;
|
|
348
|
+
animation-delay: calc(var(--xh-_stagger-index, 0) * var(--xh-motion-stagger-step));
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
[data-scope='notification'][data-part='group']:not([data-stacked]) [data-scope='notification'][data-part='item'][data-preset='card']:is([data-state='dismissing'], [data-state='closed']) {
|
|
352
|
+
animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
353
|
+
}
|
|
354
|
+
|
|
304
355
|
/*
|
|
305
356
|
* 叠放的一摞:最新一条在最前,后层按层深逐层收拢——层深由叠摞测量写进来,每往后一层乘一次
|
|
306
357
|
* --xh-motion-scale-stack;减弱动效下那支令牌为 1,层与层只靠位移分开。
|
|
@@ -310,6 +361,7 @@
|
|
|
310
361
|
--xh-_notification-stack-scale: max(0, 1 - var(--xh-_notification-depth, 0) * (1 - var(--xh-motion-scale-stack)));
|
|
311
362
|
--xh-_notification-y: var(--xh-_notification-offset, 0px);
|
|
312
363
|
--xh-_notification-scale: var(--xh-notification-stack-scale, var(--xh-_notification-stack-scale));
|
|
364
|
+
--xh-_notification-travel: var(--xh-motion-distance-lg);
|
|
313
365
|
|
|
314
366
|
position: absolute;
|
|
315
367
|
inset-inline: 0;
|
|
@@ -347,6 +399,12 @@
|
|
|
347
399
|
animation: xh-notification-stack-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
348
400
|
}
|
|
349
401
|
|
|
402
|
+
/* 后层的卡片(到时先走的旧条目)与被挤掉的那条的替身原地淡出:它们压在最前那张后面,
|
|
403
|
+
再沿叠放方向退就会从前面那张底下穿过去。叠摞测量在它开始退场时已把它移出排位,其余几条同时补上来 */
|
|
404
|
+
[data-scope='notification'][data-part='group'][data-stacked] [data-scope='notification'][data-part='item']:is([data-state='dismissing']:not([data-frontmost]), [data-state='closed']) {
|
|
405
|
+
animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
406
|
+
}
|
|
407
|
+
|
|
350
408
|
/* 收拢的后层只露出一截边:高度压成最前那一条,内容淡出,免得几层字叠在一起 */
|
|
351
409
|
[data-scope='notification'][data-part='group'][data-stacked] [data-scope='notification'][data-part='item'][data-stack-index]:not([data-frontmost]):not([data-expanded]) {
|
|
352
410
|
block-size: var(--xh-_notification-front-height, auto);
|
|
@@ -394,7 +452,7 @@
|
|
|
394
452
|
[data-scope='notification'][data-part='item'][data-preset='toast']::after {
|
|
395
453
|
content: '';
|
|
396
454
|
position: absolute;
|
|
397
|
-
inset-block-start: var(--xh-notification-item-py, var(--xh-space-
|
|
455
|
+
inset-block-start: var(--xh-notification-item-py, var(--xh-space-2_5));
|
|
398
456
|
inset-inline-start: var(--xh-notification-item-px, var(--xh-space-4));
|
|
399
457
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
400
458
|
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
@@ -431,9 +489,11 @@
|
|
|
431
489
|
}
|
|
432
490
|
|
|
433
491
|
/* 卡片:独占第一列第一行,并与标题首行顶对齐:盒高取一行标题的行高,
|
|
434
|
-
|
|
492
|
+
字形在盒里居中,标题字号改了也不会错位。卡片的类型字形 24px,与 16px 标题的一行(24px)同高 */
|
|
435
493
|
[data-scope='notification'][data-part='item-indicator'] {
|
|
436
|
-
--xh-icon-size: var(--xh-notification-indicator-size, var(--xh-glyph-size-
|
|
494
|
+
--xh-icon-size: var(--xh-notification-indicator-size, var(--xh-glyph-size-lg));
|
|
495
|
+
/* 加载环随语气色(加载环配方缺省取品牌色),与语气字形同一支 */
|
|
496
|
+
--xh-_loading-ring-fg: var(--xh-notification-indicator-fg, var(--xh-_tone-fg));
|
|
437
497
|
|
|
438
498
|
grid-column: 1;
|
|
439
499
|
grid-row: 1;
|
|
@@ -441,13 +501,15 @@
|
|
|
441
501
|
display: inline-flex;
|
|
442
502
|
align-items: center;
|
|
443
503
|
justify-content: center;
|
|
444
|
-
block-size: calc(var(--xh-notification-title-font-size, var(--xh-text-
|
|
445
|
-
inline-size: var(--xh-notification-indicator-size, var(--xh-glyph-size-
|
|
504
|
+
block-size: calc(var(--xh-notification-title-font-size, var(--xh-text-heading-3-size)) * var(--xh-leading-normal));
|
|
505
|
+
inline-size: var(--xh-notification-indicator-size, var(--xh-glyph-size-lg));
|
|
446
506
|
color: var(--xh-notification-indicator-fg, var(--xh-_tone-fg));
|
|
447
507
|
}
|
|
448
508
|
|
|
449
|
-
/*
|
|
450
|
-
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-indicator'] {
|
|
509
|
+
/* 轻提示:字形取 md 档 20px;方盒自带一圈内衬,与间距合起来让出字形到正文的那段距离 */
|
|
510
|
+
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-indicator']:where([data-scope='notification']) {
|
|
511
|
+
--xh-icon-size: var(--xh-notification-indicator-size, var(--xh-glyph-size-md));
|
|
512
|
+
|
|
451
513
|
flex: none;
|
|
452
514
|
box-sizing: content-box;
|
|
453
515
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
@@ -484,17 +546,17 @@
|
|
|
484
546
|
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
485
547
|
}
|
|
486
548
|
|
|
487
|
-
[data-scope='notification'][data-part='item'][data-tone='success'] [data-part='item-indicator']:empty::after {
|
|
549
|
+
[data-scope='notification'][data-part='item'][data-tone='success'] [data-part='item-indicator']:where([data-scope='notification']):empty::after {
|
|
488
550
|
-webkit-mask-image: var(--xh-glyph-mark-check);
|
|
489
551
|
mask-image: var(--xh-glyph-mark-check);
|
|
490
552
|
}
|
|
491
553
|
|
|
492
|
-
[data-scope='notification'][data-part='item'][data-tone='warning'] [data-part='item-indicator']:empty::after {
|
|
554
|
+
[data-scope='notification'][data-part='item'][data-tone='warning'] [data-part='item-indicator']:where([data-scope='notification']):empty::after {
|
|
493
555
|
-webkit-mask-image: var(--xh-glyph-mark-warning);
|
|
494
556
|
mask-image: var(--xh-glyph-mark-warning);
|
|
495
557
|
}
|
|
496
558
|
|
|
497
|
-
[data-scope='notification'][data-part='item'][data-tone='danger'] [data-part='item-indicator']:empty::after {
|
|
559
|
+
[data-scope='notification'][data-part='item'][data-tone='danger'] [data-part='item-indicator']:where([data-scope='notification']):empty::after {
|
|
498
560
|
-webkit-mask-image: var(--xh-glyph-mark-close);
|
|
499
561
|
mask-image: var(--xh-glyph-mark-close);
|
|
500
562
|
}
|
|
@@ -513,7 +575,7 @@
|
|
|
513
575
|
min-inline-size: 0;
|
|
514
576
|
}
|
|
515
577
|
|
|
516
|
-
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-content'] {
|
|
578
|
+
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-content']:where([data-scope='notification']) {
|
|
517
579
|
flex: 1 1 auto;
|
|
518
580
|
align-self: center;
|
|
519
581
|
row-gap: 0;
|
|
@@ -523,24 +585,29 @@
|
|
|
523
585
|
display: none;
|
|
524
586
|
}
|
|
525
587
|
|
|
588
|
+
/* 卡片标题:面板标题档、正文色,一行 24px 与左列字形同高 */
|
|
526
589
|
[data-scope='notification'][data-part='item-title'] {
|
|
527
590
|
/* 作者可能把它写成 h2/p,外边距得先归零,否则卡片内的行距对不上 */
|
|
528
591
|
margin: 0;
|
|
529
592
|
color: var(--xh-notification-title-fg, var(--xh-fg-default));
|
|
530
|
-
font-size: var(--xh-notification-title-font-size, var(--xh-text-
|
|
531
|
-
font-weight: var(--xh-notification-title-font-weight, var(--xh-
|
|
532
|
-
line-height: var(--xh-notification-title-leading, var(--xh-leading-
|
|
593
|
+
font-size: var(--xh-notification-title-font-size, var(--xh-text-heading-3-size));
|
|
594
|
+
font-weight: var(--xh-notification-title-font-weight, var(--xh-text-heading-3-weight));
|
|
595
|
+
line-height: var(--xh-notification-title-leading, var(--xh-leading-normal));
|
|
533
596
|
}
|
|
534
597
|
|
|
535
|
-
/*
|
|
536
|
-
|
|
598
|
+
/* 轻提示的语气落到标题与行首字形:一句话的结果,颜色本身就是信息。
|
|
599
|
+
一行短消息取正文 14px / medium,不用卡片的面板标题档 */
|
|
600
|
+
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-title']:where([data-scope='notification']) {
|
|
537
601
|
min-inline-size: 0;
|
|
538
602
|
color: var(--xh-notification-title-fg, var(--xh-_tone-fg));
|
|
603
|
+
font-size: var(--xh-notification-title-font-size, var(--xh-text-body-size));
|
|
604
|
+
font-weight: var(--xh-notification-title-font-weight, var(--xh-font-weight-medium));
|
|
605
|
+
line-height: var(--xh-notification-title-leading, var(--xh-leading-tight));
|
|
539
606
|
}
|
|
540
607
|
|
|
541
608
|
/* 卡片的叉钉在右上角,标题得给它让位;说明与操作在第二行往下,不受影响。
|
|
542
609
|
让位量与叉的贴边取同一个值,作者改了贴边槽,标题让出的那段跟着走 */
|
|
543
|
-
[data-scope='notification'][data-part='item'][data-preset='card']:has([data-part='item-close-trigger']) [data-part='item-title'] {
|
|
610
|
+
[data-scope='notification'][data-part='item'][data-preset='card']:has([data-part='item-close-trigger']) [data-part='item-title']:where([data-scope='notification']) {
|
|
544
611
|
padding-inline-end: calc(
|
|
545
612
|
var(--xh-notification-close-size, var(--xh-control-h-sm)) +
|
|
546
613
|
var(--xh-notification-close-inset, var(--xh-surface-action-inset))
|
|
@@ -555,13 +622,16 @@
|
|
|
555
622
|
max-block-size: var(--xh-notification-description-max-h, var(--xh-viewport-h-md));
|
|
556
623
|
overflow-y: auto;
|
|
557
624
|
overscroll-behavior: contain;
|
|
558
|
-
|
|
559
|
-
|
|
625
|
+
/* 卡片的说明就是正文:14px 正文色 */
|
|
626
|
+
color: var(--xh-notification-description-fg, var(--xh-fg-default));
|
|
627
|
+
font-size: var(--xh-notification-description-font-size, var(--xh-text-body-size));
|
|
560
628
|
}
|
|
561
629
|
|
|
562
|
-
/*
|
|
563
|
-
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-description'] {
|
|
630
|
+
/* 轻提示的说明只是一行短上下文:说明档 13px 次级色,行高收紧到正文之下 */
|
|
631
|
+
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-description']:where([data-scope='notification']) {
|
|
564
632
|
min-inline-size: 0;
|
|
633
|
+
color: var(--xh-notification-description-fg, var(--xh-fg-muted));
|
|
634
|
+
font-size: var(--xh-notification-description-font-size, var(--xh-text-secondary-size));
|
|
565
635
|
line-height: var(--xh-notification-description-leading, var(--xh-leading-normal));
|
|
566
636
|
}
|
|
567
637
|
|
|
@@ -595,7 +665,7 @@
|
|
|
595
665
|
}
|
|
596
666
|
|
|
597
667
|
/* 卡片:横跨整张卡片的一行,它不是正文的一部分,不跟着第二列走;两端取胶囊 */
|
|
598
|
-
[data-scope='notification'][data-part='item'][data-preset='card'] [data-part='item-progress'] {
|
|
668
|
+
[data-scope='notification'][data-part='item'][data-preset='card'] [data-part='item-progress']:where([data-scope='notification']) {
|
|
599
669
|
--xh-_countdown-radius: var(--xh-notification-progress-radius, var(--xh-shape-pill));
|
|
600
670
|
|
|
601
671
|
grid-column: 1 / -1;
|
|
@@ -603,7 +673,7 @@
|
|
|
603
673
|
}
|
|
604
674
|
|
|
605
675
|
/* 轻提示:贴着卡片底边走 */
|
|
606
|
-
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-progress'] {
|
|
676
|
+
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-progress']:where([data-scope='notification']) {
|
|
607
677
|
position: absolute;
|
|
608
678
|
inset-block-end: 0;
|
|
609
679
|
inset-inline-start: 0;
|
|
@@ -621,7 +691,7 @@
|
|
|
621
691
|
animation-timing-function: steps(var(--xh-_notification-progress-steps, 1), end);
|
|
622
692
|
}
|
|
623
693
|
|
|
624
|
-
[data-scope='notification'][data-part='item'][data-paused] [data-part='item-progress'] {
|
|
694
|
+
[data-scope='notification'][data-part='item'][data-paused] [data-part='item-progress']:where([data-scope='notification']) {
|
|
625
695
|
animation-play-state: paused;
|
|
626
696
|
}
|
|
627
697
|
|
|
@@ -659,7 +729,7 @@
|
|
|
659
729
|
}
|
|
660
730
|
|
|
661
731
|
/* 轻提示是单行 flex,按钮不参与伸缩:文案长了该换行的是文字 */
|
|
662
|
-
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-action-trigger'] {
|
|
732
|
+
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-action-trigger']:where([data-scope='notification']) {
|
|
663
733
|
flex: none;
|
|
664
734
|
align-self: center;
|
|
665
735
|
}
|
|
@@ -669,8 +739,9 @@
|
|
|
669
739
|
display: none;
|
|
670
740
|
}
|
|
671
741
|
|
|
672
|
-
/* 关闭钮是只有字形的离散动作钮:盒几何、悬停 /
|
|
673
|
-
的 icon ghost 档给(卡片投 sm
|
|
742
|
+
/* 关闭钮是只有字形的离散动作钮:盒几何、悬停 / 按下与按压、粗指针热区、焦点环、禁用面全由 Action Control
|
|
743
|
+
的 icon ghost 档给(卡片投 sm;轻提示投 xs,走行级动作钮那一档),组件只映射既有使用者槽。
|
|
744
|
+
叉一律 12px(--xh-glyph-size-xs),比钮的随档字形低一档。
|
|
674
745
|
静息透明,sheet 白面承载 hover 100 → pressed 200,写了语气时悬停底跟着语气走(--xh-_tone-subtle) */
|
|
675
746
|
[data-scope='notification'][data-part='item-close-trigger'] {
|
|
676
747
|
--xh-action-visual-size: var(--xh-notification-close-size, var(--xh-_action-profile-visual-size));
|
|
@@ -687,19 +758,31 @@
|
|
|
687
758
|
--xh-action-shadow-rest: none;
|
|
688
759
|
--xh-action-shadow-hover: none;
|
|
689
760
|
--xh-action-shadow-pressed: none;
|
|
690
|
-
/*
|
|
691
|
-
--xh-icon-size: var(--xh-notification-icon-size, var(--xh-
|
|
761
|
+
/* 叉的字形与行首那枚类型字形分开取尺 */
|
|
762
|
+
--xh-icon-size: var(--xh-notification-icon-size, var(--xh-glyph-size-xs));
|
|
692
763
|
}
|
|
693
764
|
|
|
694
|
-
/*
|
|
695
|
-
|
|
765
|
+
/* 卡片:钉在右上角,不参与网格排布——留在流里它会变成正文下面的第三行。
|
|
766
|
+
距右取面内动作的内缩;竖向与标题首行同一条中线:上内衬加上「标题行高 − 钮边长」的一半
|
|
767
|
+
(舒适档 20 + (24 − 28) / 2 = 18、紧凑档 16 + (24 − 24) / 2 = 16),作者改了贴边槽仍按它两向一起贴 */
|
|
768
|
+
[data-scope='notification'][data-part='item'][data-preset='card'] [data-part='item-close-trigger']:where([data-scope='notification']) {
|
|
696
769
|
position: absolute;
|
|
697
|
-
inset-block-start: var(
|
|
770
|
+
inset-block-start: var(
|
|
771
|
+
--xh-notification-close-inset,
|
|
772
|
+
calc(
|
|
773
|
+
var(--xh-notification-item-py, var(--xh-overlay-notification-p)) +
|
|
774
|
+
(
|
|
775
|
+
var(--xh-notification-title-font-size, var(--xh-text-heading-3-size)) *
|
|
776
|
+
var(--xh-notification-title-leading, var(--xh-leading-normal)) -
|
|
777
|
+
var(--xh-notification-close-size, var(--xh-control-h-sm))
|
|
778
|
+
) / 2
|
|
779
|
+
)
|
|
780
|
+
);
|
|
698
781
|
inset-inline-end: var(--xh-notification-close-inset, var(--xh-surface-action-inset));
|
|
699
782
|
}
|
|
700
783
|
|
|
701
784
|
/* 轻提示:排在一行短消息的行尾,与文本列一起垂直居中 */
|
|
702
|
-
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-close-trigger'] {
|
|
785
|
+
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-close-trigger']:where([data-scope='notification']) {
|
|
703
786
|
flex: none;
|
|
704
787
|
align-self: center;
|
|
705
788
|
}
|
|
@@ -708,13 +791,13 @@
|
|
|
708
791
|
hover-focus 显示策略:那一档用 visibility 收起,这颗叉占 Tab 位,收成 visibility: hidden
|
|
709
792
|
后键盘就够不到它了;这里只压 opacity 与 pointer-events,焦点仍能落进来 */
|
|
710
793
|
@media (hover: hover) {
|
|
711
|
-
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-close-trigger'] {
|
|
794
|
+
[data-scope='notification'][data-part='item'][data-preset='toast'] [data-part='item-close-trigger']:where([data-scope='notification']) {
|
|
712
795
|
opacity: 0;
|
|
713
796
|
pointer-events: none;
|
|
714
797
|
}
|
|
715
798
|
|
|
716
|
-
[data-scope='notification'][data-part='item'][data-preset='toast']:hover [data-part='item-close-trigger'],
|
|
717
|
-
[data-scope='notification'][data-part='item'][data-preset='toast']:focus-within [data-part='item-close-trigger'] {
|
|
799
|
+
[data-scope='notification'][data-part='item'][data-preset='toast']:hover [data-part='item-close-trigger']:where([data-scope='notification']),
|
|
800
|
+
[data-scope='notification'][data-part='item'][data-preset='toast']:focus-within [data-part='item-close-trigger']:where([data-scope='notification']) {
|
|
718
801
|
opacity: 1;
|
|
719
802
|
pointer-events: auto;
|
|
720
803
|
}
|
|
@@ -722,7 +805,7 @@
|
|
|
722
805
|
|
|
723
806
|
/* 收拢的后层只允许最前一条露出关闭入口;触屏没有 hover,必须显式收起后层的叉 */
|
|
724
807
|
[data-scope='notification'][data-part='group'][data-stacked] [data-scope='notification'][data-part='item'][data-stack-index]:not([data-frontmost]):not([data-expanded])
|
|
725
|
-
[data-part='item-close-trigger'] {
|
|
808
|
+
[data-part='item-close-trigger']:where([data-scope='notification']) {
|
|
726
809
|
opacity: 0;
|
|
727
810
|
pointer-events: none;
|
|
728
811
|
}
|
package/css/number-animation.css
CHANGED
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
[data-scope='number-animation'][data-part='root'][data-size='md'] {
|
|
38
|
-
--xh-_number-animation-size: var(--xh-text-heading-
|
|
38
|
+
--xh-_number-animation-size: var(--xh-text-heading-1-size);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
[data-scope='number-animation'][data-part='root'][data-size='lg'] {
|
|
42
|
-
--xh-_number-animation-size: var(--xh-text-
|
|
42
|
+
--xh-_number-animation-size: var(--xh-text-display-size);
|
|
43
43
|
}
|
|
44
44
|
}
|
package/css/number-field.css
CHANGED
|
@@ -28,9 +28,8 @@
|
|
|
28
28
|
--xh-_number-field-gap: 0;
|
|
29
29
|
--xh-_number-field-font-size: var(--xh-control-font-md);
|
|
30
30
|
--xh-_number-field-trigger-font-size: var(--xh-control-font-md);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
--xh-_number-field-divider-h: 50%;
|
|
31
|
+
/* 精细指针下上下叠放的两颗钮离盒边的内收:sm 档盒矮,收半档,两颗钮与 md 档等高 */
|
|
32
|
+
--xh-_number-field-stepper-inset: var(--xh-space-1);
|
|
34
33
|
|
|
35
34
|
display: inline-flex;
|
|
36
35
|
flex-direction: column;
|
|
@@ -56,6 +55,7 @@
|
|
|
56
55
|
--xh-_number-field-px: var(--xh-control-px-sm);
|
|
57
56
|
--xh-_number-field-font-size: var(--xh-control-font-sm);
|
|
58
57
|
--xh-_number-field-trigger-font-size: var(--xh-control-font-sm);
|
|
58
|
+
--xh-_number-field-stepper-inset: var(--xh-space-0_5);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
[data-scope='number-field'][data-part='root'][data-size='lg'] {
|
|
@@ -67,13 +67,15 @@
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
[data-scope='number-field'][data-part='label'] {
|
|
70
|
-
|
|
70
|
+
/* 竖排时标签与控件之间的距离:根的 gap 之上补一段差值,--xh-number-field-label-gap 给多少最终就是多少 */
|
|
71
|
+
margin-block-end: calc(var(--xh-number-field-label-gap, var(--xh-space-2)) - var(--xh-number-field-gap, var(--xh-space-1)));
|
|
72
|
+
color: var(--xh-number-field-label-fg, var(--xh-fg-muted));
|
|
71
73
|
font-size: var(--xh-number-field-label-font-size, var(--xh-text-label-size));
|
|
72
74
|
font-weight: var(--xh-number-field-label-font-weight, var(--xh-text-label-weight));
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
[data-scope='number-field'][data-part='label'][data-disabled] {
|
|
76
|
-
color: var(--xh-number-field-label-fg-disabled, var(--xh-fg-
|
|
78
|
+
color: var(--xh-number-field-label-fg-disabled, var(--xh-fg-muted));
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
/* —— 一体式 control:输入框与加减钮同框 —— */
|
|
@@ -96,8 +98,6 @@
|
|
|
96
98
|
--xh-field-border-hover: var(--xh-number-field-control-border-hover, var(--xh-_field-variant-border-hover));
|
|
97
99
|
--xh-field-border-focus: var(--xh-number-field-control-border-focus, var(--xh-_field-variant-border-focus));
|
|
98
100
|
--xh-field-border-invalid: var(--xh-number-field-control-border-invalid, var(--xh-_field-variant-border-invalid));
|
|
99
|
-
--xh-field-ring-focus: var(--xh-ring-focus);
|
|
100
|
-
--xh-field-ring-invalid: var(--xh-ring-invalid);
|
|
101
101
|
--xh-field-shadow-rest: var(--xh-number-field-control-shadow, none);
|
|
102
102
|
/* 家族 chrome 会重写 --xh-icon-size,使用者图标槽必须经桥接槽下发才能在盒内生效 */
|
|
103
103
|
--xh-field-glyph-size: var(--xh-number-field-icon-size, var(--xh-_field-size-glyph-size));
|
|
@@ -119,9 +119,9 @@
|
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
/* 盒内 input:无边框无底无圆角无落影由家族重置,观感全归 control。
|
|
122
|
-
|
|
122
|
+
数字从起始缘排起,与同一列里别的字段的文字对齐,行内内衬留给它自己(control 不给内衬);
|
|
123
123
|
前后缀图标/文字直接流式排在 input 两侧,不用再绝对定位 */
|
|
124
|
-
[data-scope='number-field'][data-part='control'] [data-part='input'] {
|
|
124
|
+
[data-scope='number-field'][data-part='control'] [data-part='input']:where([data-scope='number-field']) {
|
|
125
125
|
--xh-field-input-fg: var(--xh-number-field-input-fg, var(--xh-fg-default));
|
|
126
126
|
--xh-field-input-font-size: var(--xh-number-field-input-font-size, var(--xh-_number-field-font-size));
|
|
127
127
|
--xh-field-placeholder-fg: var(--xh-number-field-placeholder-fg, var(--xh-fg-subtle));
|
|
@@ -131,20 +131,21 @@
|
|
|
131
131
|
inline-size: var(--xh-number-field-input-w, 5em);
|
|
132
132
|
padding-inline: var(--xh-number-field-input-px, var(--xh-_number-field-px));
|
|
133
133
|
font-variant-numeric: tabular-nums;
|
|
134
|
-
text-align: var(--xh-number-field-input-align,
|
|
134
|
+
text-align: var(--xh-number-field-input-align, start);
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
/* 盒内按钮:正方视觉盒、inset
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
[data-scope='number-field'][data-part='control'] [data-part='
|
|
137
|
+
/* 盒内按钮:正方视觉盒、inset 圆角、按承载面取的悬停 / 按下阶梯、粗指针热区与 :focus-visible 关环
|
|
138
|
+
全由 Action Control 的 field-inset ghost 档给,组件只映射既有覆盖槽。
|
|
139
|
+
常态只剩符号,符号取次要前景(钮是辅助动作,不与数字抢层级),悬停与按下才浮出底色。
|
|
140
|
+
可悬停的精细指针下平时收起、悬停或聚焦字段时显出(家族 hover-focus 档),并改成上下叠放,见下 */
|
|
141
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']),
|
|
142
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']) {
|
|
142
143
|
--xh-action-visual-size: var(--xh-number-field-trigger-size, var(--xh-_action-profile-visual-size));
|
|
143
144
|
--xh-action-min-inline-size: var(--xh-number-field-trigger-size, var(--xh-_action-profile-visual-size));
|
|
144
145
|
--xh-action-radius: var(--xh-number-field-trigger-radius, var(--xh-shape-inset));
|
|
145
146
|
/* 底色阶梯由 ghost 档给(透明 → 100 → 200),使用者槽只作覆盖入口 */
|
|
146
147
|
--xh-action-bg-pressed: var(--xh-number-field-trigger-bg-active, var(--xh-_action-variant-bg-pressed));
|
|
147
|
-
--xh-action-fg-rest: var(--xh-number-field-trigger-fg, var(--xh-fg-
|
|
148
|
+
--xh-action-fg-rest: var(--xh-number-field-trigger-fg, var(--xh-fg-muted));
|
|
148
149
|
--xh-action-fg-hover: var(--xh-number-field-trigger-fg-hover, var(--xh-fg-default));
|
|
149
150
|
--xh-action-border-rest: transparent;
|
|
150
151
|
--xh-action-highlight-rest: transparent;
|
|
@@ -159,40 +160,21 @@
|
|
|
159
160
|
}
|
|
160
161
|
|
|
161
162
|
/* DOM 顺序不承担视觉位置:既有用法即使把减钮写在 input 前面,默认仍统一收进右侧动作组。 */
|
|
162
|
-
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'] {
|
|
163
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']) {
|
|
163
164
|
order: 1;
|
|
164
165
|
}
|
|
165
166
|
|
|
166
|
-
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger'] {
|
|
167
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']) {
|
|
167
168
|
order: 2;
|
|
168
169
|
}
|
|
169
170
|
|
|
170
|
-
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger'][hidden],
|
|
171
|
-
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'][hidden] {
|
|
171
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger'][hidden]:where([data-scope='number-field']),
|
|
172
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'][hidden]:where([data-scope='number-field']) {
|
|
172
173
|
display: none;
|
|
173
174
|
}
|
|
174
175
|
|
|
175
|
-
/* 右侧动作组与输入之间的细线:把「按的」与「填的」分成两块。
|
|
176
|
-
线不画在钮的边框上:边框会跟着钮的圆角与悬停底走,而这道线要独立于钮的各态,长度也短于钮自己。
|
|
177
|
-
::before 已被兜底字形占着,::after 在粗指针下是家族给的 44px 热区,几何只能落在
|
|
178
|
-
background-image 上:一条 1px × 半高的渐变贴在逻辑起始侧,底色换态时它仍叠在上层。
|
|
179
|
-
线只画在动作组第一颗减钮的逻辑起始侧;background-position 是物理轴,RTL 另给一条换边。 */
|
|
180
|
-
[data-scope='number-field'][data-part='control']:has([data-part='input']) [data-part='decrement-trigger'] {
|
|
181
|
-
background-image: linear-gradient(
|
|
182
|
-
var(--xh-number-field-trigger-divider, var(--xh-material-soft-separator)),
|
|
183
|
-
var(--xh-number-field-trigger-divider, var(--xh-material-soft-separator))
|
|
184
|
-
);
|
|
185
|
-
background-repeat: no-repeat;
|
|
186
|
-
background-position: 0 50%;
|
|
187
|
-
background-size: var(--xh-stroke-thin) var(--xh-number-field-trigger-divider-h, var(--xh-_number-field-divider-h));
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
[dir='rtl'] [data-scope='number-field'][data-part='control']:has([data-part='input']) [data-part='decrement-trigger'] {
|
|
191
|
-
background-position: 100% 50%;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
176
|
/* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
|
|
195
|
-
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:empty::before {
|
|
177
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']):empty::before {
|
|
196
178
|
content: '';
|
|
197
179
|
display: inline-block;
|
|
198
180
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
@@ -203,7 +185,7 @@
|
|
|
203
185
|
mask: var(--xh-glyph-mark-plus) center / contain no-repeat;
|
|
204
186
|
}
|
|
205
187
|
|
|
206
|
-
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:empty::before {
|
|
188
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']):empty::before {
|
|
207
189
|
content: '';
|
|
208
190
|
display: inline-block;
|
|
209
191
|
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
@@ -214,11 +196,52 @@
|
|
|
214
196
|
mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
215
197
|
}
|
|
216
198
|
|
|
217
|
-
/*
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
199
|
+
/* 可悬停的精细指针:两颗钮上下叠在盒的逻辑末端,各占盒高一半(四周内收一截),宽取指示符大档;
|
|
200
|
+
显出时铺一层淡底,悬停 / 按下沿淡底阶梯升一档、两档,字形换成上下箭头、取指示符最小档:
|
|
201
|
+
一颗钮只有盒内高的一半减内收(sm / md 11px,紧凑 9px),小档 12px 的字形会比钮高出一截。
|
|
202
|
+
两颗钮共边相接,按下只换面不缩放。钮浮在盒上、不占流:盒的末端让出钮那一截,
|
|
203
|
+
输入与后缀不会排到钮底下,钮收起时也不跳。粗指针与不能悬停的设备仍是两颗正方钮横排在末端、常显,
|
|
204
|
+
那里一颗叠放的钮只有半个控件高,够不着触控目标尺寸 */
|
|
205
|
+
@media (hover: hover) and (pointer: fine) {
|
|
206
|
+
[data-scope='number-field'][data-part='control']:has([data-part='increment-trigger'], [data-part='decrement-trigger']) {
|
|
207
|
+
padding-inline-end: calc(
|
|
208
|
+
var(--xh-number-field-stepper-w, var(--xh-control-indicator-lg))
|
|
209
|
+
+ 2 * var(--xh-number-field-stepper-inset, var(--xh-_number-field-stepper-inset))
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']),
|
|
214
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']) {
|
|
215
|
+
--xh-action-bg-rest: var(--xh-number-field-stepper-bg, var(--xh-bg-subtle));
|
|
216
|
+
--xh-action-bg-hover: var(--xh-number-field-stepper-bg-hover, var(--xh-bg-subtle-hover));
|
|
217
|
+
--xh-action-bg-pressed: var(--xh-number-field-trigger-bg-active, var(--xh-bg-subtle-active));
|
|
218
|
+
--xh-action-bg-disabled: var(--xh-number-field-stepper-bg, var(--xh-bg-subtle));
|
|
219
|
+
--xh-action-scale-pressed: none;
|
|
220
|
+
--xh-icon-size: var(--xh-control-indicator-xs);
|
|
221
|
+
|
|
222
|
+
position: absolute;
|
|
223
|
+
inset-inline-end: var(--xh-number-field-stepper-inset, var(--xh-_number-field-stepper-inset));
|
|
224
|
+
inline-size: var(--xh-number-field-stepper-w, var(--xh-control-indicator-lg));
|
|
225
|
+
min-inline-size: 0;
|
|
226
|
+
block-size: calc(50% - var(--xh-number-field-stepper-inset, var(--xh-_number-field-stepper-inset)));
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']) {
|
|
230
|
+
inset-block-start: var(--xh-number-field-stepper-inset, var(--xh-_number-field-stepper-inset));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']) {
|
|
234
|
+
inset-block-end: var(--xh-number-field-stepper-inset, var(--xh-_number-field-stepper-inset));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']):empty::before {
|
|
238
|
+
-webkit-mask-image: var(--xh-glyph-mark-chevron-up);
|
|
239
|
+
mask-image: var(--xh-glyph-mark-chevron-up);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']):empty::before {
|
|
243
|
+
-webkit-mask-image: var(--xh-glyph-mark-chevron-down);
|
|
244
|
+
mask-image: var(--xh-glyph-mark-chevron-down);
|
|
222
245
|
}
|
|
223
246
|
}
|
|
224
247
|
|
|
@@ -233,19 +256,19 @@
|
|
|
233
256
|
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
234
257
|
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
235
258
|
禁用取 GrayText */
|
|
236
|
-
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:empty::before,
|
|
237
|
-
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:empty::before {
|
|
259
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']):empty::before,
|
|
260
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']):empty::before {
|
|
238
261
|
forced-color-adjust: none;
|
|
239
262
|
background-color: ButtonText;
|
|
240
263
|
}
|
|
241
264
|
|
|
242
|
-
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before,
|
|
243
|
-
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
265
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger']:where([data-scope='number-field']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before,
|
|
266
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger']:where([data-scope='number-field']):not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
244
267
|
background-color: HighlightText;
|
|
245
268
|
}
|
|
246
269
|
|
|
247
|
-
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger'][data-disabled]:empty::before,
|
|
248
|
-
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'][data-disabled]:empty::before {
|
|
270
|
+
[data-scope='number-field'][data-part='control'] [data-part='increment-trigger'][data-disabled]:where([data-scope='number-field']):empty::before,
|
|
271
|
+
[data-scope='number-field'][data-part='control'] [data-part='decrement-trigger'][data-disabled]:where([data-scope='number-field']):empty::before {
|
|
249
272
|
background-color: GrayText;
|
|
250
273
|
}
|
|
251
274
|
}
|