@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/image-viewer.css
CHANGED
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
position: fixed;
|
|
22
22
|
inset: 0;
|
|
23
23
|
z-index: var(--xh-image-viewer-backdrop-layer, var(--xh-_layer, var(--xh-layer-modal)));
|
|
24
|
-
/*
|
|
25
|
-
background: var(--xh-image-viewer-backdrop-bg,
|
|
24
|
+
/* 与对话框同一层全局遮罩:看片台的深浅由遮罩令牌统一定 */
|
|
25
|
+
background: var(--xh-image-viewer-backdrop-bg, var(--xh-bg-overlay));
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/* 同一层底色之上再糊背后的页面 */
|
|
@@ -45,6 +45,12 @@
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
[data-scope='image-viewer'][data-part='positioner'] {
|
|
48
|
+
/* 工具条是页面主题的实体面,看片层(content)却整层是白墨域:页面主题下的面色、描边与字色
|
|
49
|
+
在域外的这一层取一次,交给工具条 */
|
|
50
|
+
--xh-_image-viewer-page-surface: var(--xh-bg-surface);
|
|
51
|
+
--xh-_image-viewer-page-border: var(--xh-border-default);
|
|
52
|
+
--xh-_image-viewer-page-fg: var(--xh-fg-muted);
|
|
53
|
+
|
|
48
54
|
position: fixed;
|
|
49
55
|
inset: 0;
|
|
50
56
|
z-index: var(--xh-image-viewer-layer, var(--xh-_layer, var(--xh-layer-modal)));
|
|
@@ -60,10 +66,11 @@
|
|
|
60
66
|
|
|
61
67
|
/* 作者塞进浮层的图标:内容层给一档 md 的尺,十颗钮各自再按 Action Control 档位覆盖 */
|
|
62
68
|
--xh-icon-size: var(--xh-image-viewer-icon-size, var(--xh-glyph-size-md));
|
|
63
|
-
/*
|
|
64
|
-
|
|
65
|
-
--xh-_image-viewer-chrome-bg
|
|
66
|
-
--xh-_image-viewer-chrome-bg-
|
|
69
|
+
/* 翻页钮、关闭钮与计数共用的深色 chrome:压在使用者的图片上的半透明深底,取画面控件面那组令牌,
|
|
70
|
+
不取页面语义面。白面压在亮图上分不出来(白 30% 的面压亮图不到 1.4:1),这几件留在深纱上 */
|
|
71
|
+
--xh-_image-viewer-chrome-bg: var(--xh-image-viewer-chrome-bg, var(--xh-bg-media-chrome));
|
|
72
|
+
--xh-_image-viewer-chrome-bg-hover: var(--xh-image-viewer-action-bg-hover, var(--xh-bg-media-chrome-hover));
|
|
73
|
+
--xh-_image-viewer-chrome-bg-active: var(--xh-image-viewer-action-bg-active, var(--xh-bg-media-chrome-active));
|
|
67
74
|
|
|
68
75
|
position: relative;
|
|
69
76
|
inline-size: 100%;
|
|
@@ -73,7 +80,7 @@
|
|
|
73
80
|
justify-content: center;
|
|
74
81
|
outline: none;
|
|
75
82
|
/* 深色底上的工具条与计数固定用浅字,不随主题翻 */
|
|
76
|
-
color: var(--xh-image-viewer-fg, var(--xh-
|
|
83
|
+
color: var(--xh-image-viewer-fg, var(--xh-fg-on-media-chrome));
|
|
77
84
|
}
|
|
78
85
|
|
|
79
86
|
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
@@ -169,7 +176,7 @@
|
|
|
169
176
|
will-change: translate;
|
|
170
177
|
}
|
|
171
178
|
|
|
172
|
-
/* ——
|
|
179
|
+
/* —— 悬浮件 ——
|
|
173
180
|
四件都钉在铺满视口的那一层的边上,贴边一律与安全区取大的一头:刘海、圆角与
|
|
174
181
|
底部横条压住的那一段由系统给出,贴边比它窄时钮会被切掉一角;桌面上 env() 恒为 0。
|
|
175
182
|
安全区只有物理方向的四个名字,行内轴上两侧同取较宽的那一段,RTL 下不会翻错边。
|
|
@@ -179,20 +186,33 @@
|
|
|
179
186
|
[data-scope='image-viewer'][data-part='counter'] {
|
|
180
187
|
position: absolute;
|
|
181
188
|
z-index: 1;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* 计数:一行浅字压在深纱上 */
|
|
192
|
+
[data-scope='image-viewer'][data-part='counter'] {
|
|
182
193
|
background: var(--xh-_image-viewer-chrome-bg);
|
|
183
194
|
color: inherit;
|
|
184
195
|
border: none;
|
|
185
196
|
}
|
|
186
197
|
|
|
198
|
+
/* 工具条:页面主题的实体面(亮色白面、暗色深面)+ 1px 描边。面色在看片层的白墨域之外取
|
|
199
|
+
(定位层捕获的页面取值),连接层在它身上打 data-xh-ink-surface:七颗钮与作者放进来的内容
|
|
200
|
+
按这块底自成墨色域,字色、悬停阶梯与焦点环都随面的深浅走,不再钉在浅字上。
|
|
201
|
+
强制色下面被换成 Canvas、与遮罩同色,边界只剩这圈描边 */
|
|
187
202
|
[data-scope='image-viewer'][data-part='toolbar'] {
|
|
203
|
+
--xh-ink-surface: var(--xh-image-viewer-toolbar-bg, var(--xh-_image-viewer-page-surface));
|
|
204
|
+
|
|
188
205
|
inset-block-end: max(var(--xh-space-6), env(safe-area-inset-bottom));
|
|
189
206
|
inset-inline-start: 50%;
|
|
190
207
|
translate: -50% 0;
|
|
191
208
|
display: flex;
|
|
192
209
|
align-items: center;
|
|
193
210
|
gap: var(--xh-image-viewer-toolbar-gap, var(--xh-space-1));
|
|
194
|
-
padding: var(--xh-image-viewer-toolbar-padding, var(--xh-space-1_5) var(--xh-space-
|
|
211
|
+
padding: var(--xh-image-viewer-toolbar-padding, var(--xh-space-1_5) var(--xh-space-4));
|
|
212
|
+
border: var(--xh-stroke-thin) solid var(--xh-_image-viewer-page-border);
|
|
195
213
|
border-radius: var(--xh-image-viewer-toolbar-radius-outer, var(--xh-image-viewer-overlay-radius, var(--xh-shape-surface)));
|
|
214
|
+
background: var(--xh-image-viewer-toolbar-bg, var(--xh-_image-viewer-page-surface));
|
|
215
|
+
color: var(--xh-_image-viewer-page-fg);
|
|
196
216
|
}
|
|
197
217
|
|
|
198
218
|
/* 起点是逻辑属性、平移是物理通道:rtl 下行内分量掉头,工具条与计数才落回中线 */
|
|
@@ -200,20 +220,23 @@
|
|
|
200
220
|
translate: 50% 0;
|
|
201
221
|
}
|
|
202
222
|
|
|
203
|
-
/* 工具条里的七颗钮:接 Action Control icon 档 xs(
|
|
204
|
-
|
|
223
|
+
/* 工具条里的七颗钮:接 Action Control icon 档 xs(字形 16px),视觉盒放大到 box md(36px),
|
|
224
|
+
底色交给工具条,本体只管命中区与按压。钮是工具条这块面上的墨色域:悬停 / 按下走白底阶梯
|
|
225
|
+
(100 → 200),字取次要字色,都按工具条的底色求值。
|
|
205
226
|
position 交给配方的 relative:粗指针下 44px 命中区 ::after 以钮自身为包含块;
|
|
206
227
|
这里若写 static,七块命中区会一起以工具条为包含块、彼此盖住,触屏上只剩最后一颗可点 */
|
|
207
228
|
[data-scope='image-viewer'][data-part='toolbar'] > [data-part] {
|
|
229
|
+
--xh-action-visual-size: var(--xh-control-box-md);
|
|
230
|
+
--xh-action-min-inline-size: var(--xh-control-box-md);
|
|
208
231
|
--xh-action-bg-rest: transparent;
|
|
209
|
-
--xh-action-bg-hover: var(--xh-
|
|
210
|
-
--xh-action-bg-pressed: var(--xh-
|
|
232
|
+
--xh-action-bg-hover: var(--xh-bg-subtle);
|
|
233
|
+
--xh-action-bg-pressed: var(--xh-bg-subtle-hover);
|
|
211
234
|
--xh-action-bg-focus-visible: transparent;
|
|
212
235
|
--xh-action-bg-disabled: transparent;
|
|
213
|
-
--xh-action-fg-rest:
|
|
214
|
-
--xh-action-fg-hover:
|
|
215
|
-
--xh-action-fg-pressed:
|
|
216
|
-
--xh-action-fg-focus-visible:
|
|
236
|
+
--xh-action-fg-rest: var(--xh-fg-muted);
|
|
237
|
+
--xh-action-fg-hover: var(--xh-fg-muted);
|
|
238
|
+
--xh-action-fg-pressed: var(--xh-fg-muted);
|
|
239
|
+
--xh-action-fg-focus-visible: var(--xh-fg-muted);
|
|
217
240
|
--xh-action-fg-disabled: var(--xh-fg-disabled);
|
|
218
241
|
--xh-action-border-rest: transparent;
|
|
219
242
|
--xh-action-border-hover: transparent;
|
|
@@ -237,7 +260,23 @@
|
|
|
237
260
|
translate: 50% 0;
|
|
238
261
|
}
|
|
239
262
|
|
|
240
|
-
/*
|
|
263
|
+
/* 翻页与关闭钮的尺:看片台上的媒体控制钮与同档控件等高(control-h,md 32px),字形比控件内
|
|
264
|
+
图标低一档(sm / md 16px、lg 20px),不压画面。三颗钮与组件同档 */
|
|
265
|
+
[data-scope='image-viewer']:is([data-part='prev-trigger'], [data-part='next-trigger'], [data-part='close-trigger']) {
|
|
266
|
+
--xh-_image-viewer-nav-size: var(--xh-control-h-md);
|
|
267
|
+
--xh-_image-viewer-nav-glyph: var(--xh-glyph-size-sm);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
[data-scope='image-viewer']:is([data-part='prev-trigger'], [data-part='next-trigger'], [data-part='close-trigger'])[data-xh-action-size='sm'] {
|
|
271
|
+
--xh-_image-viewer-nav-size: var(--xh-control-h-sm);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
[data-scope='image-viewer']:is([data-part='prev-trigger'], [data-part='next-trigger'], [data-part='close-trigger'])[data-xh-action-size='lg'] {
|
|
275
|
+
--xh-_image-viewer-nav-size: var(--xh-control-h-lg);
|
|
276
|
+
--xh-_image-viewer-nav-glyph: var(--xh-glyph-size-md);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/* 两颗翻页钮:浮在图上的单图标圆钮,接 Action Control floating 档(正方盒取 circle),视觉盒改走上面的尺。
|
|
241
280
|
面桥接到自家深色 chrome:跟的是图上那层半透明深底不是页面底色,所以不取 frosted 缺省面,
|
|
242
281
|
也不取语义档的 --xh-bg-subtle-*;到头时是原生 disabled,压不动的东西不给回应 */
|
|
243
282
|
[data-scope='image-viewer'][data-part='prev-trigger'],
|
|
@@ -258,26 +297,28 @@
|
|
|
258
297
|
--xh-action-border-focus-visible: transparent;
|
|
259
298
|
--xh-action-border-disabled: transparent;
|
|
260
299
|
--xh-action-radius: var(--xh-image-viewer-overlay-radius, var(--xh-_action-profile-radius));
|
|
261
|
-
--xh-
|
|
300
|
+
--xh-action-visual-size: var(--xh-image-viewer-nav-size, var(--xh-_image-viewer-nav-size));
|
|
301
|
+
--xh-action-min-inline-size: var(--xh-image-viewer-nav-size, var(--xh-_image-viewer-nav-size));
|
|
302
|
+
--xh-icon-size: var(--xh-image-viewer-icon-size, var(--xh-_image-viewer-nav-glyph));
|
|
262
303
|
|
|
263
304
|
position: absolute;
|
|
264
305
|
z-index: 1;
|
|
265
306
|
}
|
|
266
307
|
|
|
267
308
|
[data-scope='image-viewer'][data-part='prev-trigger'] {
|
|
268
|
-
inset-inline-start: max(var(--xh-space-
|
|
309
|
+
inset-inline-start: max(var(--xh-space-5), env(safe-area-inset-left), env(safe-area-inset-right));
|
|
269
310
|
inset-block-start: 50%;
|
|
270
311
|
translate: 0 -50%;
|
|
271
312
|
}
|
|
272
313
|
|
|
273
314
|
[data-scope='image-viewer'][data-part='next-trigger'] {
|
|
274
|
-
inset-inline-end: max(var(--xh-space-
|
|
315
|
+
inset-inline-end: max(var(--xh-space-5), env(safe-area-inset-left), env(safe-area-inset-right));
|
|
275
316
|
inset-block-start: 50%;
|
|
276
317
|
translate: 0 -50%;
|
|
277
318
|
}
|
|
278
319
|
|
|
279
|
-
/* 右上角的关闭钮:悬浮在媒体上的单图标动作,与翻页钮同走 Action Control floating
|
|
280
|
-
面与翻页钮同一层深色 chrome */
|
|
320
|
+
/* 右上角的关闭钮:悬浮在媒体上的单图标动作,与翻页钮同走 Action Control floating 档、同一把尺(圆形);
|
|
321
|
+
面与翻页钮同一层深色 chrome,离右上角比翻页钮离边远一档,不与画面边角的内容挤在一起 */
|
|
281
322
|
[data-scope='image-viewer'][data-part='close-trigger'] {
|
|
282
323
|
--xh-action-bg-rest: var(--xh-_image-viewer-chrome-bg);
|
|
283
324
|
--xh-action-bg-hover: var(--xh-image-viewer-close-bg-hover, var(--xh-_image-viewer-chrome-bg-hover));
|
|
@@ -296,13 +337,14 @@
|
|
|
296
337
|
--xh-action-border-focus-visible: transparent;
|
|
297
338
|
--xh-action-border-disabled: transparent;
|
|
298
339
|
--xh-action-radius: var(--xh-image-viewer-close-radius, var(--xh-shape-circle));
|
|
299
|
-
--xh-action-visual-size: var(--xh-image-viewer-close-size, var(--xh-
|
|
300
|
-
--xh-
|
|
340
|
+
--xh-action-visual-size: var(--xh-image-viewer-close-size, var(--xh-_image-viewer-nav-size));
|
|
341
|
+
--xh-action-min-inline-size: var(--xh-image-viewer-close-size, var(--xh-_image-viewer-nav-size));
|
|
342
|
+
--xh-icon-size: var(--xh-image-viewer-icon-size, var(--xh-_image-viewer-nav-glyph));
|
|
301
343
|
|
|
302
344
|
position: absolute;
|
|
303
345
|
z-index: 1;
|
|
304
|
-
inset-block-start: max(var(--xh-space-
|
|
305
|
-
inset-inline-end: max(var(--xh-space-
|
|
346
|
+
inset-block-start: max(var(--xh-space-8), env(safe-area-inset-top));
|
|
347
|
+
inset-inline-end: max(var(--xh-space-8), env(safe-area-inset-left), env(safe-area-inset-right));
|
|
306
348
|
}
|
|
307
349
|
|
|
308
350
|
/* liquid 档:data-material="liquid" 下控制层换成液态面,深色纱那一套只属于 standard 档。
|
|
@@ -324,7 +366,11 @@
|
|
|
324
366
|
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
325
367
|
}
|
|
326
368
|
|
|
369
|
+
/* 液态工具条自己就是墨色域(按下层写 data-xh-ink):钮不再按页面面色另取墨色,
|
|
370
|
+
撤掉 ink-surface,钮里的墨色随这块液态面的域走 */
|
|
327
371
|
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='toolbar'][data-xh-liquid] {
|
|
372
|
+
--xh-ink-surface: initial;
|
|
373
|
+
|
|
328
374
|
border-radius: var(--xh-image-viewer-toolbar-radius-outer, var(--xh-image-viewer-overlay-radius, var(--xh-shape-pill)));
|
|
329
375
|
}
|
|
330
376
|
|
|
@@ -336,6 +382,10 @@
|
|
|
336
382
|
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='toolbar'][data-xh-liquid] > [data-part] {
|
|
337
383
|
--xh-action-bg-hover: var(--xh-image-viewer-action-bg-hover, var(--xh-bg-subtle));
|
|
338
384
|
--xh-action-bg-pressed: var(--xh-image-viewer-action-bg-active, var(--xh-bg-subtle-hover));
|
|
385
|
+
--xh-action-fg-rest: currentColor;
|
|
386
|
+
--xh-action-fg-hover: currentColor;
|
|
387
|
+
--xh-action-fg-pressed: currentColor;
|
|
388
|
+
--xh-action-fg-focus-visible: currentColor;
|
|
339
389
|
}
|
|
340
390
|
|
|
341
391
|
:where([data-material='liquid']) [data-scope='image-viewer'][data-part='prev-trigger'][data-xh-liquid],
|
package/css/image.css
CHANGED
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
|
|
45
45
|
/* 占位层还在(正淡出)时图片不再自己淡入:它在占位层底下直接落位,由占位层的淡出揭开,
|
|
46
46
|
模糊小图与图片交叉,不先透出一拍底色 */
|
|
47
|
-
[data-scope='image'][data-part='root']:has(> [data-part='placeholder']:not([hidden])) > [data-part='image'] {
|
|
47
|
+
[data-scope='image'][data-part='root']:has(> [data-part='placeholder']:not([hidden])) > [data-part='image']:where([data-scope='image']) {
|
|
48
48
|
animation: none;
|
|
49
49
|
}
|
|
50
50
|
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
display: flex;
|
|
57
57
|
align-items: center;
|
|
58
58
|
justify-content: center;
|
|
59
|
-
background: var(--xh-image-placeholder-bg, var(--xh-bg-subtle-
|
|
59
|
+
background: var(--xh-image-placeholder-bg, var(--xh-bg-subtle-opaque));
|
|
60
60
|
color: var(--xh-image-placeholder-fg, var(--xh-fg-subtle));
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -70,17 +70,25 @@
|
|
|
70
70
|
display: none;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
+
/* 回退内容:图标在上、说明在下竖排居中。自带不透明淡底,说明字的对比只看这一层,
|
|
74
|
+
不透出页底(次要字色压在半透明淡底上透出页底时到不了 4.5:1) */
|
|
73
75
|
[data-scope='image'][data-part='fallback'] {
|
|
76
|
+
box-sizing: border-box;
|
|
74
77
|
display: flex;
|
|
78
|
+
flex-direction: column;
|
|
75
79
|
align-items: center;
|
|
76
80
|
justify-content: center;
|
|
77
81
|
inline-size: 100%;
|
|
78
82
|
block-size: 100%;
|
|
79
83
|
/* 没给 ratio 时根盒子高度是 auto,回退内容自己撑出一个不塌的高度 */
|
|
80
84
|
min-block-size: var(--xh-image-fallback-min-h, var(--xh-control-h-lg));
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
85
|
+
padding-block: var(--xh-image-fallback-py, var(--xh-space-2));
|
|
86
|
+
padding-inline: var(--xh-image-fallback-px, var(--xh-space-4));
|
|
87
|
+
background: var(--xh-image-fallback-bg, var(--xh-bg-subtle-opaque));
|
|
88
|
+
color: var(--xh-image-fallback-fg, var(--xh-fg-subtle));
|
|
89
|
+
font-size: var(--xh-image-fallback-font-size, var(--xh-text-caption-size));
|
|
90
|
+
line-height: var(--xh-leading-relaxed);
|
|
91
|
+
text-align: center;
|
|
84
92
|
user-select: none;
|
|
85
93
|
}
|
|
86
94
|
|
package/css/infinite-scroll.css
CHANGED
|
@@ -40,8 +40,7 @@
|
|
|
40
40
|
* 取下一页的按钮:与哨兵同一条通路的键盘入口,摆在列表末尾自成一行——铺满一行的独立动作条目,
|
|
41
41
|
* 接 Action Control 的 row 档、outline 形态:宽度由容器给、高度随内容、按下只换面不缩放;
|
|
42
42
|
* 盒几何、中性描边与透明底、悬停 / 按下 / 禁用面、焦点环与粗指针热区全由家族给,
|
|
43
|
-
* 白底承载 hover 100 → pressed 200
|
|
44
|
-
* 它是一行里唯一的东西,靠起始缘会像一条没对齐的列表项。
|
|
43
|
+
* 白底承载 hover 100 → pressed 200。这里只把使用者槽映射到桥接槽,文案居中写在下一条。
|
|
45
44
|
* 行高不吃家族的单行档:row 档允许换行、高度随内容,折行的文案走正文行高
|
|
46
45
|
*/
|
|
47
46
|
[data-scope='infinite-scroll'][data-part='load-more-trigger'] {
|
|
@@ -62,13 +61,18 @@
|
|
|
62
61
|
/* 作者塞进钮里的图标按档取字形尺寸,与文案同一把尺 */
|
|
63
62
|
--xh-icon-size: var(--xh-infinite-scroll-load-more-icon-size, var(--xh-_action-profile-glyph-size));
|
|
64
63
|
|
|
65
|
-
justify-content: center;
|
|
66
|
-
text-align: center;
|
|
67
64
|
line-height: var(--xh-leading-normal);
|
|
68
65
|
/* 到底了连点是常态,触屏上默认会当成双击缩放 */
|
|
69
66
|
touch-action: manipulation;
|
|
70
67
|
}
|
|
71
68
|
|
|
69
|
+
/* 文案居中(单行整段居中,折行逐行居中),盖掉 row 档的靠起始缘排布:它是一行里唯一的东西,
|
|
70
|
+
靠起始缘会像一条没对齐的列表项。选择器点名 row 档,有层与无层两份产物里都压得住它 */
|
|
71
|
+
[data-scope='infinite-scroll'][data-part='load-more-trigger'][data-xh-action-profile='row'] {
|
|
72
|
+
justify-content: center;
|
|
73
|
+
text-align: center;
|
|
74
|
+
}
|
|
75
|
+
|
|
72
76
|
/* 声明过 display 就盖掉了 UA 的 [hidden]{display:none},作者要藏哨兵时得自己补回来 */
|
|
73
77
|
[data-scope='infinite-scroll'][data-part='sentinel'][hidden],
|
|
74
78
|
[data-scope='infinite-scroll'][data-part='load-more-trigger'][hidden] {
|
package/css/input-group.css
CHANGED
|
@@ -21,11 +21,13 @@
|
|
|
21
21
|
--xh-_input-group-h: var(--xh-control-h-md);
|
|
22
22
|
--xh-_input-group-px: var(--xh-control-px-md);
|
|
23
23
|
--xh-_input-group-font-size: var(--xh-control-font-md);
|
|
24
|
-
--xh-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
/* 组壳与字段外壳同形:静息字段淡底 + --xh-border-control;悬停底不变、描边升 --xh-border-strong;
|
|
25
|
+
聚焦换承载面 + --xh-border-control-focus,不画聚焦环(强制色档补一圈 Highlight 环);无影 */
|
|
26
|
+
--xh-_input-group-bg: var(--xh-bg-field);
|
|
27
|
+
--xh-_input-group-bg-hover: var(--xh-bg-field);
|
|
28
|
+
--xh-_input-group-bg-focus: var(--xh-bg-surface);
|
|
27
29
|
--xh-_input-group-border: var(--xh-border-control);
|
|
28
|
-
--xh-_input-group-border-hover: var(--xh-border-
|
|
30
|
+
--xh-_input-group-border-hover: var(--xh-border-strong);
|
|
29
31
|
--xh-_input-group-border-focus: var(--xh-border-control-focus);
|
|
30
32
|
--xh-_input-group-shadow: none;
|
|
31
33
|
|
|
@@ -36,7 +38,10 @@
|
|
|
36
38
|
/* 整组是一个字段:不传尺寸时与单个字段同宽,组里的字段让位占满前后缀之外的那段 */
|
|
37
39
|
inline-size: var(--xh-input-group-w, var(--xh-control-w));
|
|
38
40
|
border-radius: var(--xh-input-group-radius, var(--xh-shape-control));
|
|
39
|
-
|
|
41
|
+
/* 面只在这一处画:各状态只换 --xh-_input-group-face 这一个槽,静息、悬停、失效、只读、禁用与聚焦
|
|
42
|
+
顺着同一条声明换色,过渡也只认这一处 */
|
|
43
|
+
--xh-_input-group-face: var(--xh-input-group-bg, var(--xh-_input-group-bg));
|
|
44
|
+
background: var(--xh-_input-group-face);
|
|
40
45
|
box-shadow: var(--xh-input-group-shadow, var(--xh-_input-group-shadow));
|
|
41
46
|
|
|
42
47
|
/* 父容器给不出这么宽时整组跟着收,不越出父容器 */
|
|
@@ -62,6 +67,7 @@
|
|
|
62
67
|
[data-scope='input-group'][data-part='root'][data-variant='subtle'] {
|
|
63
68
|
--xh-_input-group-bg: var(--xh-bg-subtle);
|
|
64
69
|
--xh-_input-group-bg-hover: var(--xh-bg-subtle-hover);
|
|
70
|
+
--xh-_input-group-bg-focus: var(--xh-bg-subtle);
|
|
65
71
|
--xh-_input-group-border: transparent;
|
|
66
72
|
--xh-_input-group-border-hover: var(--xh-border-control);
|
|
67
73
|
--xh-_input-group-shadow: none;
|
|
@@ -70,34 +76,55 @@
|
|
|
70
76
|
/* ghost:静息不画壳,悬停与聚焦沿用下面的 hover / focus 规则浮出 --xh-border-control 与底 */
|
|
71
77
|
[data-scope='input-group'][data-part='root'][data-variant='ghost'] {
|
|
72
78
|
--xh-_input-group-bg: transparent;
|
|
79
|
+
--xh-_input-group-bg-hover: color-mix(in oklab, var(--xh-bg-subtle) 45%, transparent);
|
|
80
|
+
--xh-_input-group-bg-focus: transparent;
|
|
73
81
|
--xh-_input-group-border: transparent;
|
|
74
82
|
--xh-_input-group-border-hover: var(--xh-border-control);
|
|
75
83
|
--xh-_input-group-shadow: none;
|
|
76
84
|
}
|
|
77
85
|
|
|
78
|
-
|
|
79
|
-
|
|
86
|
+
/* 悬停浮出描边与底:组里的字段只读、禁用或失效时不浮。只读与禁用和下面的禁用面一样只认带字段外壳的那一段,
|
|
87
|
+
组里单独禁用一颗按钮不让整组失去悬停 */
|
|
88
|
+
[data-scope='input-group'][data-part='root']:not(:has([data-xh-field-chrome]:is([data-disabled], [data-readonly]), [data-invalid], [aria-invalid='true'])):not(:focus-within):hover {
|
|
89
|
+
--xh-_input-group-face: var(--xh-input-group-bg-hover, var(--xh-_input-group-bg-hover));
|
|
80
90
|
}
|
|
81
91
|
|
|
82
|
-
[data-scope='input-group'][data-part='root']:not(:has([data-disabled])):hover::before {
|
|
92
|
+
[data-scope='input-group'][data-part='root']:not(:has([data-xh-field-chrome]:is([data-disabled], [data-readonly]), [data-invalid], [aria-invalid='true'])):not(:focus-within):hover::before {
|
|
83
93
|
border-color: var(--xh-input-group-border-hover, var(--xh-_input-group-border-hover));
|
|
84
94
|
}
|
|
85
95
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
[data-scope='input-group'][data-part='root']:focus-within::before {
|
|
92
|
-
border-color: var(--xh-input-group-border-focus, var(--xh-_input-group-border-focus));
|
|
96
|
+
/* 组里的字段校验失败:失效描边 + 4% 失效色淡底,与字段外壳的失效档同一副面 */
|
|
97
|
+
[data-scope='input-group'][data-part='root']:has([data-invalid], [aria-invalid='true']) {
|
|
98
|
+
--xh-_input-group-face: var(--xh-input-group-bg-invalid, var(--xh-bg-field-invalid));
|
|
93
99
|
}
|
|
94
100
|
|
|
95
101
|
[data-scope='input-group'][data-part='root']:has([data-invalid], [aria-invalid='true'])::before {
|
|
96
102
|
border-color: var(--xh-input-group-border-invalid, var(--xh-border-invalid));
|
|
97
103
|
}
|
|
98
104
|
|
|
99
|
-
|
|
100
|
-
|
|
105
|
+
/* 组里的字段只读 / 禁用:组壳换淡底,禁用另把描边退到 --xh-border-default;
|
|
106
|
+
只认带字段外壳的那一段,组里单独禁用一颗按钮不让整组变灰。
|
|
107
|
+
只读用 :where() 压低特指度,拿到焦点时与字段外壳一样让位给聚焦态 */
|
|
108
|
+
[data-scope='input-group'][data-part='root']:has(:where([data-xh-field-chrome][data-readonly])) {
|
|
109
|
+
--xh-_input-group-face: var(--xh-input-group-bg-read-only, var(--xh-bg-subtle));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
[data-scope='input-group'][data-part='root']:has([data-xh-field-chrome][data-disabled]) {
|
|
113
|
+
--xh-_input-group-face: var(--xh-input-group-bg-disabled, var(--xh-bg-subtle));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
[data-scope='input-group'][data-part='root']:has([data-xh-field-chrome][data-disabled])::before {
|
|
117
|
+
border-color: var(--xh-input-group-border-disabled, var(--xh-border-default));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* 聚焦排在失效之后:校验失败的字段拿到焦点时让位给聚焦态。
|
|
121
|
+
焦点由描边换色与承载面的底色差标出,不画聚焦环 */
|
|
122
|
+
[data-scope='input-group'][data-part='root']:focus-within {
|
|
123
|
+
--xh-_input-group-face: var(--xh-input-group-bg-focus, var(--xh-_input-group-bg-focus));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
[data-scope='input-group'][data-part='root']:focus-within::before {
|
|
127
|
+
border-color: var(--xh-input-group-border-focus, var(--xh-_input-group-border-focus));
|
|
101
128
|
}
|
|
102
129
|
|
|
103
130
|
/* 给了 display 的角色节点必须补这条:display 声明会盖掉 UA 的 [hidden]{display:none},
|
|
@@ -162,7 +189,7 @@
|
|
|
162
189
|
transition: none;
|
|
163
190
|
}
|
|
164
191
|
|
|
165
|
-
/*
|
|
192
|
+
/* 聚焦换色由组的外表面承担(强制色档的系统色环也画在组壳上),子输入保留焦点语义但不再自己画一圈。 */
|
|
166
193
|
[data-scope='input-group'][data-part='root'] [data-xh-field-chrome]:focus-within {
|
|
167
194
|
outline: none;
|
|
168
195
|
}
|
|
@@ -222,7 +249,8 @@
|
|
|
222
249
|
}
|
|
223
250
|
|
|
224
251
|
/* —— 前后缀块 —— */
|
|
225
|
-
/*
|
|
252
|
+
/* 前后缀是输入表面里的静态内容:铺一层淡底与可输入的那一段分开、取正文色,两侧内距对称;
|
|
253
|
+
不单独绘制外框或焦点状态,外轮廓与聚焦换色归组壳 */
|
|
226
254
|
[data-scope='input-group'][data-part='item'] {
|
|
227
255
|
display: inline-flex;
|
|
228
256
|
box-sizing: border-box;
|
|
@@ -230,25 +258,32 @@
|
|
|
230
258
|
align-items: center;
|
|
231
259
|
block-size: var(--xh-input-group-item-h, var(--xh-_input-group-h));
|
|
232
260
|
padding-inline: var(--xh-input-group-item-px, var(--xh-_input-group-px));
|
|
233
|
-
color: var(--xh-input-group-item-
|
|
261
|
+
background-color: var(--xh-input-group-item-bg, var(--xh-bg-subtle));
|
|
262
|
+
color: var(--xh-input-group-item-fg, var(--xh-fg-default));
|
|
234
263
|
font-size: var(--xh-input-group-item-font-size, var(--xh-_input-group-font-size));
|
|
235
264
|
line-height: var(--xh-leading-none);
|
|
236
265
|
white-space: nowrap;
|
|
237
266
|
}
|
|
238
267
|
|
|
239
|
-
/*
|
|
240
|
-
|
|
241
|
-
|
|
268
|
+
/* 与相邻段之间一道满高的缺省描边,只画在朝里的那一侧,外侧交给组壳的外轮廓。
|
|
269
|
+
两块前后缀挨着时只由后一块画:半透明描边两道相叠会叠深 */
|
|
270
|
+
[data-scope='input-group'][data-part='root'] > [data-scope='input-group'][data-part='item']:not(:first-child) {
|
|
271
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-input-group-item-divider, var(--xh-border-default));
|
|
242
272
|
}
|
|
243
273
|
|
|
244
|
-
[data-scope='input-group'][data-part='root'] > [data-scope='input-group'][data-part='item']:last-child {
|
|
245
|
-
|
|
274
|
+
[data-scope='input-group'][data-part='root'] > [data-scope='input-group'][data-part='item']:not(:last-child):not(:has(+ [data-scope='input-group'][data-part='item'])) {
|
|
275
|
+
border-inline-end: var(--xh-stroke-thin) solid var(--xh-input-group-item-divider, var(--xh-border-default));
|
|
246
276
|
}
|
|
247
277
|
|
|
248
278
|
[data-scope='input-group'][data-part='item'][hidden] {
|
|
249
279
|
display: none;
|
|
250
280
|
}
|
|
251
281
|
|
|
282
|
+
/* 组里的字段禁用:前后缀块的字随字段禁用面换 --xh-fg-disabled,与组壳的禁用面同一个判据 */
|
|
283
|
+
[data-scope='input-group'][data-part='root']:has([data-xh-field-chrome][data-disabled]) > [data-scope='input-group'][data-part='item'] {
|
|
284
|
+
color: var(--xh-fg-disabled);
|
|
285
|
+
}
|
|
286
|
+
|
|
252
287
|
@media (forced-colors: active) {
|
|
253
288
|
[data-scope='input-group'][data-part='root'] {
|
|
254
289
|
background: Canvas;
|
|
@@ -259,8 +294,10 @@
|
|
|
259
294
|
border-color: ButtonText;
|
|
260
295
|
}
|
|
261
296
|
|
|
297
|
+
/* 常规档不画环、只换描边色;这一档里描边换色未必分得出来,补一圈系统色环 */
|
|
262
298
|
[data-scope='input-group'][data-part='root']:focus-within {
|
|
263
|
-
outline
|
|
299
|
+
outline: var(--xh-ring-width) solid Highlight;
|
|
300
|
+
outline-offset: var(--xh-ring-offset);
|
|
264
301
|
}
|
|
265
302
|
|
|
266
303
|
[data-scope='input-group'][data-part='root']:focus-within::before,
|
|
@@ -268,8 +305,19 @@
|
|
|
268
305
|
border-color: Highlight;
|
|
269
306
|
}
|
|
270
307
|
|
|
308
|
+
[data-scope='input-group'][data-part='root']:has([data-xh-field-chrome][data-disabled])::before {
|
|
309
|
+
border-color: GrayText;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/* 淡底在这一档被抹成 Canvas,前后缀与输入段只剩分隔线分得开:线换系统色 */
|
|
271
313
|
[data-scope='input-group'][data-part='item'] {
|
|
314
|
+
background-color: Canvas;
|
|
272
315
|
color: CanvasText;
|
|
316
|
+
border-color: ButtonText;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
[data-scope='input-group'][data-part='root']:has([data-xh-field-chrome][data-disabled]) > [data-scope='input-group'][data-part='item'] {
|
|
320
|
+
color: GrayText;
|
|
273
321
|
}
|
|
274
322
|
}
|
|
275
323
|
}
|
package/css/kbd.css
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
font-family: var(--xh-kbd-font, inherit);
|
|
28
28
|
/* 快捷键是次级标注,字号取 caption 档 */
|
|
29
29
|
font-size: var(--xh-kbd-font-size, var(--xh-text-caption-size));
|
|
30
|
-
font-weight: var(--xh-kbd-font-weight, var(--xh-font-weight-
|
|
30
|
+
font-weight: var(--xh-kbd-font-weight, var(--xh-font-weight-regular));
|
|
31
31
|
line-height: var(--xh-leading-none);
|
|
32
32
|
text-align: center;
|
|
33
33
|
text-decoration: none;
|
package/css/label.css
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
/*
|
|
7
7
|
* 字段族标签的公共层,按 [data-part='label'] 匹配下面逐个列出的 scope。
|
|
8
8
|
*
|
|
9
|
-
* 收在这里的是逐值相同的四条:行距取 --xh-leading-none
|
|
10
|
-
* 必填星号取 --xh-glyph-mark-required + --xh-space-1 + --xh-fg-danger
|
|
9
|
+
* 收在这里的是逐值相同的四条:行距取 --xh-leading-none,禁用档字色留在 --xh-fg-muted,
|
|
10
|
+
* 必填星号取 --xh-glyph-mark-required + --xh-space-1 + --xh-fg-danger、排在标签文字之前,无效档字色取 --xh-fg-danger。
|
|
11
11
|
* 字色、字号、字重三条留在各组件皮肤——它们挂着 --xh-<组件>-label-* 覆盖槽,
|
|
12
12
|
* 槽名里带组件名,写不进一条共享规则。
|
|
13
13
|
*
|
|
@@ -42,29 +42,45 @@
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
45
|
+
* 禁用档的字色:字段标签禁用不另变色,留在静息的 --xh-fg-muted。再淡一档的 --xh-fg-subtle 与它几乎分不出,
|
|
46
|
+
* --xh-fg-disabled 只有 2.66:1,读屏与无障碍扫描都把关联禁用控件的标签当正文判对比度;禁用由控件自己的
|
|
47
|
+
* 禁用面表出。这四家没有 --xh-<组件>-label-fg-disabled 覆盖槽,取值只有这一处;挂了那个槽的组件在各自皮肤里
|
|
48
|
+
* 另写一条,排在本份之后,压过这里。
|
|
47
49
|
*/
|
|
48
50
|
[data-scope='color-picker'][data-part='label'][data-disabled],
|
|
49
51
|
[data-scope='rating'][data-part='label'][data-disabled],
|
|
50
52
|
[data-scope='signature-pad'][data-part='label'][data-disabled],
|
|
51
53
|
[data-scope='slider'][data-part='label'][data-disabled] {
|
|
52
|
-
color: var(--xh-fg-
|
|
54
|
+
color: var(--xh-fg-muted);
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
/*
|
|
56
|
-
* 必填星号:跟着标签自己的 data-required
|
|
57
|
-
*
|
|
58
|
+
* 必填星号:跟着标签自己的 data-required 亮,选填不标。字形、字号、间距、颜色是公共层规则,
|
|
59
|
+
* 自带标签的字段不得各画一套。星号排在标签文字之前(一列标签的星号在同一条起始线上,扫读时先看到),
|
|
60
|
+
* 取说明字号——它是标记,不与标签文字抢层级。
|
|
58
61
|
*
|
|
59
62
|
* 接入 = connect 在标签部件投影 data-required + 把 scope 加进这张列表;控件本体不画。
|
|
60
63
|
* 有 --xh-<组件>-label-star 覆盖槽的组件在各自皮肤里只另写一条 color 压过这里(field 的
|
|
61
|
-
* --xh-field-label-star、fieldset 的 --xh-fieldset-legend-star),content
|
|
64
|
+
* --xh-field-label-star、fieldset 的 --xh-fieldset-legend-star),content、字号与间距不再重写。
|
|
65
|
+
*
|
|
66
|
+
* 星号排在文字之前,就进了经 aria-labelledby / for 算出的控件名开头,读屏先念一声「星号」。
|
|
67
|
+
* 必填已由控件上的 aria-required 表达,星号只给眼睛看:content 带一段空的替代文本,可及树里不念。
|
|
68
|
+
* 替代文本的写法晚于浏览器地板(Firefox 128 / Safari 17.4 起),而 content 里带 var() 不在解析期校验,
|
|
69
|
+
* 不认的引擎整条落空、星号跟着没了,同块写两条兜不住:块外留旧写法,新写法收进同一特性的 @supports 里
|
|
62
70
|
*/
|
|
63
|
-
[data-scope='field'][data-part='label'][data-required]::
|
|
64
|
-
[data-scope='fieldset'][data-part='legend'][data-required]::
|
|
71
|
+
[data-scope='field'][data-part='label'][data-required]::before,
|
|
72
|
+
[data-scope='fieldset'][data-part='legend'][data-required]::before {
|
|
65
73
|
content: var(--xh-glyph-mark-required);
|
|
66
|
-
margin-inline-
|
|
74
|
+
margin-inline-end: var(--xh-space-1);
|
|
67
75
|
color: var(--xh-fg-danger);
|
|
76
|
+
font-size: var(--xh-text-caption-size);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@supports (content: '' / '') {
|
|
80
|
+
[data-scope='field'][data-part='label'][data-required]::before,
|
|
81
|
+
[data-scope='fieldset'][data-part='legend'][data-required]::before {
|
|
82
|
+
content: var(--xh-glyph-mark-required) / '';
|
|
83
|
+
}
|
|
68
84
|
}
|
|
69
85
|
|
|
70
86
|
/*
|
package/css/layout.css
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
--xh-_layout-sider-expanded-w: var(--xh-layout-sider-w, var(--xh-sider-w));
|
|
34
34
|
--xh-_layout-sider-w: var(--xh-_layout-sider-expanded-w);
|
|
35
35
|
--xh-_layout-sider-collapsed-w: var(--xh-layout-sider-collapsed-w, var(--xh-sider-collapsed-w));
|
|
36
|
-
--xh-_layout-header-h: var(--xh-layout-header-h,
|
|
36
|
+
--xh-_layout-header-h: var(--xh-layout-header-h, var(--xh-app-header-h));
|
|
37
37
|
/* 侧栏吸附时钉在哪条线上:缺省贴滚动容器上沿,头也吸顶时改成让开头的高度 */
|
|
38
38
|
--xh-_layout-sider-offset: 0px;
|
|
39
39
|
}
|
|
@@ -92,11 +92,8 @@
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
/* 宽度过渡在这里声明一次,展开与折叠两档、以及 props 直接写进内联的宽度,走的都是这一条。
|
|
95
|
-
|
|
96
|
-
覆盖档换成 elevated 白底,那一档的规则把阶梯写回 100 → 200 */
|
|
95
|
+
侧栏与头同是白底承载面,坐在灰的页面底上:把手摆进来走白底阶梯 hover 100 → pressed 200 */
|
|
97
96
|
[data-scope='layout'][data-part='sider'] {
|
|
98
|
-
--xh-action-host-bg-hover: var(--xh-bg-subtle-hover);
|
|
99
|
-
--xh-action-host-bg-pressed: var(--xh-bg-subtle-active);
|
|
100
97
|
/* 内衬缺省一档,装了 SideNav 的侧栏在下面归零;覆盖档与安全区取大时读的也是这一支 */
|
|
101
98
|
--xh-_layout-sider-padding: var(--xh-space-3);
|
|
102
99
|
|
|
@@ -104,7 +101,7 @@
|
|
|
104
101
|
inline-size: var(--xh-_layout-sider-w);
|
|
105
102
|
overflow: hidden;
|
|
106
103
|
padding: var(--xh-layout-sider-padding, var(--xh-_layout-sider-padding));
|
|
107
|
-
background: var(--xh-layout-sider-bg, var(--xh-bg-
|
|
104
|
+
background: var(--xh-layout-sider-bg, var(--xh-bg-surface));
|
|
108
105
|
transition: inline-size var(--xh-motion-duration-move) var(--xh-motion-ease-continuous);
|
|
109
106
|
}
|
|
110
107
|
|
|
@@ -160,6 +157,20 @@
|
|
|
160
157
|
}
|
|
161
158
|
|
|
162
159
|
/* —— 分隔线 —— */
|
|
160
|
+
/* 头与侧栏都是白底:头的下沿与侧栏挨着内容的那一边缺省画一条内部分隔,两块白面才分得开;
|
|
161
|
+
作者开了 split 再换成 border-default,并把内容与尾也隔开 */
|
|
162
|
+
[data-scope='layout'][data-part='header'] {
|
|
163
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-subtle));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
[data-scope='layout'][data-part='sider'][data-placement='start'] {
|
|
167
|
+
border-inline-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-subtle));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
[data-scope='layout'][data-part='sider'][data-placement='end'] {
|
|
171
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-subtle));
|
|
172
|
+
}
|
|
173
|
+
|
|
163
174
|
/* 后代选择器带上 data-scope:骨架里装着整页内容,光凭 data-part 会连里面别的组件同名段一起画上线 */
|
|
164
175
|
[data-scope='layout'][data-part='root'][data-split] [data-scope='layout'][data-part='header'] {
|
|
165
176
|
border-block-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-border-default));
|
|
@@ -251,10 +262,6 @@
|
|
|
251
262
|
减弱动效下归零。写成槽位而不是写死物理方向:贴边用的是逻辑 inset,RTL 下行首落在物理右边,
|
|
252
263
|
位移若写死物理方向就会出现「贴在右边、却从左边滑进来」 */
|
|
253
264
|
--xh-_layout-sheet-shift: calc(-1 * var(--xh-motion-travel));
|
|
254
|
-
/* 这一档的底是 elevated 白底:交互阶梯按承载面走,把上面占位档下发的 200 → 300 写回
|
|
255
|
-
白底的 hover 100 → pressed 200 */
|
|
256
|
-
--xh-action-host-bg-hover: var(--xh-bg-subtle);
|
|
257
|
-
--xh-action-host-bg-pressed: var(--xh-bg-subtle-hover);
|
|
258
265
|
|
|
259
266
|
position: fixed;
|
|
260
267
|
z-index: var(--xh-layout-sider-layer, var(--xh-layer-drawer));
|