@xihan-ui/styles 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1328 -0
- package/README.md +6 -1
- package/component-tokens.d.ts +505 -111
- package/components.tokens.json +34750 -26291
- package/css/accordion.css +39 -13
- package/css/alert.css +61 -3
- package/css/anchor.css +49 -11
- package/css/approval.css +124 -84
- package/css/avatar-group.css +1 -1
- package/css/avatar.css +13 -5
- package/css/back-top.css +63 -44
- package/css/badge.css +63 -13
- package/css/bar-code.css +1 -1
- package/css/breadcrumb.css +63 -4
- package/css/button-group.css +5 -5
- package/css/button.css +69 -21
- package/css/calendar-picker.css +27 -8
- package/css/calendar-range-picker.css +48 -11
- package/css/card.css +116 -2
- package/css/carousel.css +153 -48
- package/css/cartesian-chart.css +830 -0
- package/css/cascader.css +184 -70
- package/css/checkbox-group.css +69 -99
- package/css/checkbox.css +21 -54
- package/css/citation.css +470 -0
- package/css/clipboard.css +23 -66
- package/css/code-view.css +103 -8
- package/css/collapsible.css +37 -11
- package/css/color-field.css +18 -0
- package/css/color-picker.css +57 -62
- package/css/color-slider.css +26 -19
- package/css/color-swatch-picker.css +8 -6
- package/css/combobox.css +82 -37
- package/css/command.css +48 -48
- package/css/context-menu.css +43 -28
- package/css/date-field.css +23 -0
- package/css/date-picker.css +57 -24
- package/css/date-range-picker.css +301 -14
- package/css/description.css +17 -1
- package/css/descriptions.css +43 -1
- package/css/dialog.css +99 -43
- package/css/diff-view.css +101 -16
- package/css/download-trigger.css +46 -80
- package/css/drawer.css +168 -133
- package/css/editable.css +19 -0
- package/css/empty-state.css +8 -7
- package/css/field-array.css +36 -0
- package/css/field.css +17 -19
- package/css/fieldset.css +1 -1
- package/css/file-upload.css +126 -136
- package/css/flex.css +324 -8
- package/css/float-button.css +168 -41
- package/css/floating-panel.css +59 -27
- package/css/form.css +26 -20
- package/css/funnel-chart.css +106 -0
- package/css/graph-chart.css +205 -0
- package/css/grid-list.css +235 -0
- package/css/grid.css +252 -1
- package/css/heatmap.css +119 -36
- package/css/hierarchy-chart.css +298 -0
- package/css/hover-card.css +33 -18
- package/css/icon.css +100 -0
- package/css/image-cropper.css +34 -8
- package/css/image-viewer.css +169 -26
- package/css/image.css +23 -4
- package/css/infinite-scroll.css +2 -2
- package/css/input-group.css +13 -15
- package/css/json-viewer.css +55 -7
- package/css/kbd.css +1 -1
- package/css/layout.css +71 -21
- package/css/liquid.css +106 -0
- package/css/list.css +2 -2
- package/css/listbox.css +72 -23
- package/css/loading-bar.css +27 -13
- package/css/log.css +131 -35
- package/css/markdown-stream.css +1 -1
- package/css/marquee.css +163 -7
- package/css/matrix-code.css +1 -1
- package/css/mention.css +35 -21
- package/css/menu.css +40 -28
- package/css/menubar.css +42 -28
- package/css/message-feed.css +174 -53
- package/css/navigation-menu.css +177 -18
- package/css/notification.css +431 -110
- package/css/number-field.css +22 -0
- package/css/page-header.css +4 -2
- package/css/pagination.css +129 -29
- package/css/password-input.css +40 -8
- package/css/pie-chart.css +247 -0
- package/css/popconfirm.css +50 -58
- package/css/popover.css +55 -21
- package/css/progress.css +308 -10
- package/css/prompt-input.css +37 -1
- package/css/question-flow.css +104 -64
- package/css/radar-chart.css +233 -0
- package/css/radio-group.css +372 -14
- package/css/rating.css +25 -27
- package/css/reasoning.css +62 -55
- package/css/reset.css +1 -1
- package/css/resizable.css +6 -1
- package/css/sankey-chart.css +174 -0
- package/css/scroll-area.css +32 -0
- package/css/scrollbar.css +1 -1
- package/css/select.css +76 -59
- package/css/side-nav.css +177 -30
- package/css/signature-pad.css +23 -8
- package/css/skeleton.css +13 -14
- package/css/slider.css +39 -17
- package/css/sortable.css +38 -8
- package/css/sparkline.css +164 -0
- package/css/spinner.css +50 -22
- package/css/splitter.css +8 -2
- package/css/statistic.css +10 -0
- package/css/steps.css +257 -38
- package/css/switch.css +30 -55
- package/css/table.css +168 -128
- package/css/tabs.css +243 -31
- package/css/tag-group.css +65 -37
- package/css/tag.css +55 -14
- package/css/tags-input.css +40 -3
- package/css/text-field.css +19 -0
- package/css/time-field.css +20 -1
- package/css/time-picker.css +44 -17
- package/css/time-range-picker.css +45 -18
- package/css/timeline.css +1 -1
- package/css/toggle-group.css +8 -8
- package/css/toggle.css +6 -5
- package/css/tool-call.css +64 -56
- package/css/toolbar.css +105 -7
- package/css/tooltip.css +18 -7
- package/css/tour.css +49 -21
- package/css/transfer.css +104 -81
- package/css/tree-select.css +235 -58
- package/css/tree.css +240 -147
- package/css/truncate.css +55 -12
- package/css/typography.css +93 -0
- package/css/virtualizer.css +57 -1
- package/css/watermark.css +23 -0
- package/family/action-control.css +14 -5
- package/family/chart.css +480 -0
- package/family/check-mark.css +94 -0
- package/family/choice-card.css +97 -0
- package/family/collection-item.css +70 -27
- package/family/field-chrome.css +1 -12
- package/family/loading-ring.css +95 -0
- package/family/material.css +72 -0
- package/family/menu-choice.css +56 -0
- package/family/motion.css +208 -11
- package/family/tag-list.css +59 -0
- package/index.css +23363 -14091
- package/index.unlayered.css +23198 -13922
- package/package.json +20 -8
- package/css/gradient-text.css +0 -91
- package/css/icon-wrapper.css +0 -81
- package/css/segmented.css +0 -280
- package/css/toast.css +0 -499
package/css/code-view.css
CHANGED
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
--xh-code-view-skin: 1;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
/* 一张静态内容面:--xh-border-default 描边 + surface 底 +
|
|
17
|
+
/* 一张静态内容面:--xh-border-default 描边 + surface 底 + 无影(边界只由描边承担),
|
|
18
18
|
overflow: hidden 让内部 <pre> 的滚动内容沿圆角收边;不设 display,排布由作者决定。
|
|
19
|
-
color 给整段未着色的代码定基线,字号在这里消费一次,缺省即
|
|
19
|
+
color 给整段未着色的代码定基线,字号在这里消费一次,缺省即 md 档(与面内按钮同档)。 */
|
|
20
20
|
[data-scope='code-view'][data-part='root'] {
|
|
21
21
|
/* 尺寸缺省档:不写 data-size 时的取值。三档都只写这个私有槽,
|
|
22
22
|
公开槽留在读处当首选,作者在祖先上设的覆盖才赢得过档位声明 */
|
|
23
|
-
--xh-_code-view-font-size: var(--xh-control-font-
|
|
23
|
+
--xh-_code-view-font-size: var(--xh-control-font-md);
|
|
24
24
|
|
|
25
25
|
overflow: hidden;
|
|
26
26
|
border: var(--xh-stroke-thin) solid var(--xh-code-view-border, var(--xh-border-default));
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
padding-inline-end: var(--xh-code-view-px, var(--xh-space-3));
|
|
112
112
|
/* 标出来的那几行换的是底色与那条内阴影色条,两样一起过渡才是同一个动作 */
|
|
113
113
|
transition:
|
|
114
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
114
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
115
115
|
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
116
116
|
}
|
|
117
117
|
|
|
@@ -119,9 +119,10 @@
|
|
|
119
119
|
display: none;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
/* 高亮行是强调不是选中:中性淡底 + 行首强调条,不用品牌淡底(品牌淡底只表达选中 / 当前) */
|
|
122
123
|
[data-scope='code-view'][data-part='line'][data-highlighted] {
|
|
123
|
-
background: var(--xh-code-view-highlight-bg, var(--xh-bg-
|
|
124
|
-
box-shadow: inset var(--xh-code-view-highlight-bar, var(--xh-stroke-thick)) 0 0 0 var(--xh-code-view-highlight-fg, var(--xh-
|
|
124
|
+
background: var(--xh-code-view-highlight-bg, var(--xh-bg-subtle));
|
|
125
|
+
box-shadow: inset var(--xh-code-view-highlight-bar, var(--xh-stroke-thick)) 0 0 0 var(--xh-code-view-highlight-fg, var(--xh-border-strong));
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
/* 行号是画上去的不是写上去的:复制代码不带它,读屏也不逐行念数字。
|
|
@@ -133,7 +134,7 @@
|
|
|
133
134
|
flex: 0 0 auto;
|
|
134
135
|
padding-inline-start: var(--xh-code-view-px, var(--xh-space-3));
|
|
135
136
|
padding-inline-end: var(--xh-code-view-gutter-gap, var(--xh-space-1));
|
|
136
|
-
border-inline-end: var(--xh-stroke-thin) solid var(--xh-code-view-gutter-border, var(--xh-border-
|
|
137
|
+
border-inline-end: var(--xh-stroke-thin) solid var(--xh-code-view-gutter-border, var(--xh-border-subtle));
|
|
137
138
|
color: var(--xh-code-view-number-fg, var(--xh-fg-subtle));
|
|
138
139
|
font-size: var(--xh-code-view-number-font-size, var(--xh-text-caption-size));
|
|
139
140
|
inline-size: var(--xh-_code-view-gutter);
|
|
@@ -202,7 +203,7 @@
|
|
|
202
203
|
}
|
|
203
204
|
|
|
204
205
|
/* 折叠条是铺满一行的 disclosure trigger,盒型、悬停与按下面由 Action Control 的 disclosure-trigger 档给
|
|
205
|
-
(ghost 形态:白底承载 hover 100 → pressed 200
|
|
206
|
+
(ghost 形态:白底承载 hover 100 → pressed 200,按下只换面不缩放);这里只把使用者槽映射到
|
|
206
207
|
桥接槽:圆角归零贴住卡边,内衬沿用代码区的横向内距与折叠条自己的纵向内距,字号与头部条同档。
|
|
207
208
|
顶边是与头部条同一支的内部分隔线:配方按状态写 border-color 简写,四个状态的边色槽都映射到
|
|
208
209
|
这支分隔色,再把四边宽归零、只留顶边一条 */
|
|
@@ -226,6 +227,75 @@
|
|
|
226
227
|
display: none;
|
|
227
228
|
}
|
|
228
229
|
|
|
230
|
+
/* 按块折叠:每行正文都让出一列(一行高的正方格),块头的折叠钮定位在这一列里;
|
|
231
|
+
没有钮的行也让,缩进才对得齐 */
|
|
232
|
+
[data-scope='code-view'][data-part='root'][data-block-folding] {
|
|
233
|
+
--xh-_code-view-fold-col: var(--xh-code-view-fold-col, var(--xh-code-view-line-height, var(--xh-text-code-leading)));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
[data-scope='code-view'][data-part='root'][data-block-folding] [data-part='line-content'] {
|
|
237
|
+
position: relative;
|
|
238
|
+
padding-inline-start: var(--xh-_code-view-fold-col);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
[data-scope='code-view'][data-part='root'][data-block-folding]:not([data-line-numbers]) [data-part='line-content'] {
|
|
242
|
+
padding-inline-start: calc(var(--xh-code-view-px, var(--xh-space-3)) + var(--xh-_code-view-fold-col));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* 行首折叠钮是 disclosure trigger:接 Action Control icon 档、ghost 形态,边长压到一行高,
|
|
246
|
+
按下只换面不缩放;静息取次级字色,不和正文抢 */
|
|
247
|
+
[data-scope='code-view'][data-part='line-fold-trigger'] {
|
|
248
|
+
--xh-action-visual-size: var(--xh-_code-view-fold-col);
|
|
249
|
+
--xh-action-min-inline-size: var(--xh-_code-view-fold-col);
|
|
250
|
+
--xh-action-radius: var(--xh-code-view-line-fold-trigger-radius, var(--xh-shape-control));
|
|
251
|
+
--xh-action-fg-rest: var(--xh-code-view-line-fold-trigger-fg, var(--xh-fg-subtle));
|
|
252
|
+
--xh-action-scale-pressed: none;
|
|
253
|
+
--xh-icon-size: var(--xh-code-view-icon-size, var(--xh-glyph-size-sm));
|
|
254
|
+
|
|
255
|
+
position: absolute;
|
|
256
|
+
inset-block-start: 0;
|
|
257
|
+
inset-inline-start: 0;
|
|
258
|
+
block-size: var(--xh-_code-view-fold-col);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
[data-scope='code-view'][data-part='root'][data-block-folding]:not([data-line-numbers]) [data-part='line-fold-trigger'] {
|
|
262
|
+
inset-inline-start: var(--xh-code-view-px, var(--xh-space-3));
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
[data-scope='code-view'][data-part='line-fold-trigger'][hidden] {
|
|
266
|
+
display: none;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/* 展开时朝下;收起时转向行尾那一侧(RTL 跟着换向) */
|
|
270
|
+
[data-scope='code-view'][data-part='line-fold-trigger']::before {
|
|
271
|
+
content: '';
|
|
272
|
+
display: block;
|
|
273
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
274
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
275
|
+
background-color: currentColor;
|
|
276
|
+
-webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
277
|
+
mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
|
|
278
|
+
transition: rotate var(--xh-motion-duration-expand) var(--xh-motion-ease-enter-strong);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
[data-scope='code-view'][data-part='line-fold-trigger'][data-state='closed']::before {
|
|
282
|
+
rotate: calc(-90deg * var(--xh-direction-sign));
|
|
283
|
+
transition-duration: var(--xh-motion-duration-collapse);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* 折叠着的块头:正文后面一枚省略号,示意下面收起了几行;画上去的,复制不带它 */
|
|
287
|
+
[data-scope='code-view'][data-part='line-content'][data-folded]::after {
|
|
288
|
+
content: '';
|
|
289
|
+
display: inline-block;
|
|
290
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
291
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
|
|
292
|
+
margin-inline-start: var(--xh-code-view-folded-gap, var(--xh-space-1));
|
|
293
|
+
vertical-align: var(--xh-glyph-baseline-shift);
|
|
294
|
+
background-color: var(--xh-code-view-folded-fg, var(--xh-fg-subtle));
|
|
295
|
+
-webkit-mask: var(--xh-glyph-mark-ellipsis) center / contain no-repeat;
|
|
296
|
+
mask: var(--xh-glyph-mark-ellipsis) center / contain no-repeat;
|
|
297
|
+
}
|
|
298
|
+
|
|
229
299
|
/* 尺寸档写私有槽、由 root 基础规则消费一次:缺省与阶梯是同一个口子,
|
|
230
300
|
作者设的 --xh-code-view-font-size 排在读处首选,不会被这三条盖掉。
|
|
231
301
|
行号槽宽以 ch 计,随字号一起走 */
|
|
@@ -276,4 +346,29 @@
|
|
|
276
346
|
outline-offset: calc(-1 * var(--xh-code-view-highlight-bar, var(--xh-stroke-thick)));
|
|
277
347
|
}
|
|
278
348
|
}
|
|
349
|
+
|
|
350
|
+
@media (forced-colors: active) {
|
|
351
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
352
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
353
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
354
|
+
落在 Canvas 面上的取 CanvasText;
|
|
355
|
+
禁用取 GrayText */
|
|
356
|
+
[data-scope='code-view'][data-part='line-fold-trigger']::before {
|
|
357
|
+
forced-color-adjust: none;
|
|
358
|
+
background-color: ButtonText;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
[data-scope='code-view'][data-part='line-content'][data-folded]::after {
|
|
362
|
+
forced-color-adjust: none;
|
|
363
|
+
background-color: CanvasText;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
[data-scope='code-view'][data-part='line-fold-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed])::before {
|
|
367
|
+
background-color: HighlightText;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
[data-scope='code-view'][data-part='line-fold-trigger'][data-disabled]::before {
|
|
371
|
+
background-color: GrayText;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
279
374
|
}
|
package/css/collapsible.css
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
/* 根容器自己不排版,这条只声明尺寸档的私有槽:正文与标题行从 root 继承它们,
|
|
20
20
|
换档不必给部件各写一条选择器;触发器的三档几何由家族 disclosure-trigger 档给 */
|
|
21
21
|
[data-scope='collapsible'][data-part='root'] {
|
|
22
|
-
/* 作者塞进正文里的图标与皮肤画的兜底字形同一把尺:md
|
|
22
|
+
/* 作者塞进正文里的图标与皮肤画的兜底字形同一把尺:md 档,触发器上另按家族档取值 */
|
|
23
23
|
--xh-icon-size: var(--xh-collapsible-icon-size, var(--xh-glyph-size-md));
|
|
24
24
|
|
|
25
25
|
--xh-_collapsible-trigger-gap: var(--xh-control-gap-md);
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/* 触发器铺满一行,盒型、三档几何、悬停 / 按下 / 禁用面由 Action Control 的 disclosure-trigger 档给
|
|
62
|
-
(ghost 形态:根无壳,按画布承载 hover 100 → pressed 200
|
|
62
|
+
(ghost 形态:根无壳,按画布承载 hover 100 → pressed 200;按下只换面不缩放);
|
|
63
63
|
这里只把使用者槽映射到桥接槽:字色三态同值(家族的 hover / pressed 字色规则比皮肤更特定,不映射会被换回
|
|
64
64
|
缺省字色),字形按触发器自己的档位取 --xh-_action-profile-glyph-size;边归零贴住标题行,几何与迁移前一致 */
|
|
65
65
|
[data-scope='collapsible'][data-part='trigger'] {
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
/* 展开着的那一档单开一个槽:与常态共用一个的话,作者一改常态字色就把展开态也改掉了。
|
|
84
|
-
悬停 /
|
|
84
|
+
悬停 / 按下的面与收起态同档(open 与家族 hover 同档中性) */
|
|
85
85
|
[data-scope='collapsible'][data-part='trigger'][data-state='open'] {
|
|
86
86
|
--xh-action-fg-rest: var(--xh-collapsible-trigger-fg-open, var(--xh-_collapsible-open-fg));
|
|
87
87
|
--xh-action-fg-hover: var(--xh-collapsible-trigger-fg-open, var(--xh-_collapsible-open-fg));
|
|
@@ -101,8 +101,12 @@
|
|
|
101
101
|
justify-content: center;
|
|
102
102
|
color: var(--xh-collapsible-indicator-fg, var(--xh-fg-muted));
|
|
103
103
|
line-height: var(--xh-leading-none);
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* 指示器与正文同档转向:收起时取 collapse 档,展开时(下面的打开态)取 expand 档。
|
|
107
|
+
首帧就在的朝向直接呈现(data-instant),第一次开合起才转 */
|
|
108
|
+
[data-scope='collapsible'][data-part='indicator']:not([data-instant]) {
|
|
109
|
+
transition: rotate var(--xh-motion-duration-collapse) var(--xh-motion-ease-enter-strong);
|
|
106
110
|
}
|
|
107
111
|
|
|
108
112
|
/* 没写内容就由皮肤画;作者往部件里塞了自己的图形,这条规则即不命中 */
|
|
@@ -121,6 +125,10 @@
|
|
|
121
125
|
rotate: 180deg;
|
|
122
126
|
}
|
|
123
127
|
|
|
128
|
+
[data-scope='collapsible'][data-part='indicator'][data-state='open']:not([data-instant]) {
|
|
129
|
+
transition: rotate var(--xh-motion-duration-expand) var(--xh-motion-ease-enter-strong);
|
|
130
|
+
}
|
|
131
|
+
|
|
124
132
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none }:补了动画一帧都播不出来。
|
|
125
133
|
收起由适配器在退场结束后写内联 display 落成,退场窗口内靠 connect 发的 inert 挡住焦点 */
|
|
126
134
|
[data-scope='collapsible'][data-part='content'] {
|
|
@@ -138,14 +146,32 @@
|
|
|
138
146
|
line-height: var(--xh-leading-normal);
|
|
139
147
|
}
|
|
140
148
|
|
|
141
|
-
/*
|
|
142
|
-
[data-scope='collapsible'][data-part='content'][data-state='open'] {
|
|
143
|
-
|
|
144
|
-
animation: xh-disclosure-expand var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
149
|
+
/* 展开与收起只在开合时播:首帧就在的展开 / 收起直接呈现(data-instant) */
|
|
150
|
+
[data-scope='collapsible'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
151
|
+
animation: xh-disclosure-expand var(--xh-motion-duration-expand) var(--xh-motion-ease-enter-strong);
|
|
145
152
|
}
|
|
146
153
|
|
|
147
|
-
[data-scope='collapsible'][data-part='content'][data-state='closed'] {
|
|
148
|
-
animation: xh-disclosure-collapse var(--xh-motion-duration-
|
|
154
|
+
[data-scope='collapsible'][data-part='content'][data-state='closed']:not([data-instant]) {
|
|
155
|
+
animation: xh-disclosure-collapse var(--xh-motion-duration-collapse) var(--xh-motion-ease-exit) forwards;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@media (forced-colors: active) {
|
|
159
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
160
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
161
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
162
|
+
禁用取 GrayText */
|
|
163
|
+
[data-scope='collapsible'][data-part='indicator']:empty::before {
|
|
164
|
+
forced-color-adjust: none;
|
|
165
|
+
background-color: ButtonText;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
[data-scope='collapsible'][data-part='trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]) [data-scope='collapsible'][data-part='indicator']:empty::before {
|
|
169
|
+
background-color: HighlightText;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
[data-scope='collapsible'][data-part='trigger'][data-disabled] [data-scope='collapsible'][data-part='indicator']:empty::before {
|
|
173
|
+
background-color: GrayText;
|
|
174
|
+
}
|
|
149
175
|
}
|
|
150
176
|
}
|
|
151
177
|
|
package/css/color-field.css
CHANGED
|
@@ -155,4 +155,22 @@
|
|
|
155
155
|
mask: var(--xh-glyph-mark-close) center / contain no-repeat;
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
+
@media (forced-colors: active) {
|
|
159
|
+
/* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
|
|
160
|
+
字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
|
|
161
|
+
按钮面上取 ButtonText,悬停与按下时家族把按钮涂成 Highlight、字形换 HighlightText;
|
|
162
|
+
禁用取 GrayText */
|
|
163
|
+
[data-scope='color-field'][data-part='clear-trigger']:empty::before {
|
|
164
|
+
forced-color-adjust: none;
|
|
165
|
+
background-color: ButtonText;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
[data-scope='color-field'][data-part='clear-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
169
|
+
background-color: HighlightText;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
[data-scope='color-field'][data-part='clear-trigger'][data-disabled]:empty::before {
|
|
173
|
+
background-color: GrayText;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
158
176
|
}
|
package/css/color-picker.css
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
/* 定义 color picker 样式。 */
|
|
7
7
|
|
|
8
|
+
@import '../family/field-chrome.css';
|
|
8
9
|
@import '../family/swatch.css';
|
|
9
10
|
@import '../family/motion.css';
|
|
10
11
|
|
|
11
|
-
|
|
12
12
|
@layer xihan.components {
|
|
13
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
14
14
|
[data-scope='color-picker'] {
|
|
@@ -23,11 +23,10 @@
|
|
|
23
23
|
|
|
24
24
|
/* 标签一行、盒一行的两行堆叠 */
|
|
25
25
|
[data-scope='color-picker'][data-part='root'] {
|
|
26
|
-
/*
|
|
26
|
+
/* 盒的度量走私有槽中转,与同族的下拉选择一处对一处 */
|
|
27
27
|
--xh-_color-picker-h: var(--xh-control-h-md);
|
|
28
28
|
--xh-_color-picker-px: var(--xh-control-px-md);
|
|
29
29
|
--xh-_color-picker-gap: var(--xh-control-gap-md);
|
|
30
|
-
--xh-_color-picker-label-font-size: var(--xh-control-font-md);
|
|
31
30
|
|
|
32
31
|
/* 聚焦环恒用固定环色 */
|
|
33
32
|
--xh-_color-picker-ring: var(--xh-ring-focus);
|
|
@@ -50,70 +49,47 @@
|
|
|
50
49
|
--xh-_color-picker-h: var(--xh-control-h-sm);
|
|
51
50
|
--xh-_color-picker-px: var(--xh-control-px-sm);
|
|
52
51
|
--xh-_color-picker-gap: var(--xh-control-gap-sm);
|
|
53
|
-
--xh-_color-picker-label-font-size: var(--xh-control-font-sm);
|
|
54
52
|
}
|
|
55
53
|
|
|
56
54
|
[data-scope='color-picker']:is([data-part='root'], [data-part='positioner'])[data-size='lg'] {
|
|
57
55
|
--xh-_color-picker-h: var(--xh-control-h-lg);
|
|
58
56
|
--xh-_color-picker-px: var(--xh-control-px-lg);
|
|
59
57
|
--xh-_color-picker-gap: var(--xh-control-gap-lg);
|
|
60
|
-
--xh-_color-picker-label-font-size: var(--xh-control-font-lg);
|
|
61
58
|
}
|
|
62
59
|
|
|
63
60
|
[data-scope='color-picker'][data-part='label'] {
|
|
64
61
|
color: var(--xh-color-picker-label-fg, var(--xh-fg-default));
|
|
65
|
-
|
|
62
|
+
/* 字段标签不随档:与同族字段同一档标签字号 */
|
|
63
|
+
font-size: var(--xh-color-picker-label-font-size, var(--xh-text-label-size));
|
|
66
64
|
font-weight: var(--xh-color-picker-label-font-weight, var(--xh-text-label-weight));
|
|
67
65
|
}
|
|
68
66
|
|
|
69
|
-
/*
|
|
70
|
-
|
|
67
|
+
/* 盒:接字段外壳家族(data-xh-field-chrome),描边、底色、控件高度、行内内衬、悬停与聚焦面
|
|
68
|
+
都由家族按 data-variant 与状态画,与同族的下拉选择一处对一处;这里只把组件自己的覆盖槽桥接进去。
|
|
69
|
+
静息无影、悬停取家族的 45% 淡底、聚焦边一律 --xh-border-control-focus(不随语气) */
|
|
71
70
|
[data-scope='color-picker'][data-part='control'] {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
gap: var(--xh-color-picker-control-gap, var(--xh-_color-picker-gap));
|
|
75
|
-
min-inline-size:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
71
|
+
--xh-field-control-height: var(--xh-color-picker-control-h, var(--xh-_color-picker-h));
|
|
72
|
+
--xh-field-control-padding-inline: var(--xh-color-picker-control-px, var(--xh-_color-picker-px));
|
|
73
|
+
--xh-field-control-gap: var(--xh-color-picker-control-gap, var(--xh-_color-picker-gap));
|
|
74
|
+
--xh-field-control-min-inline-size: var(--xh-color-picker-control-min-w, var(--xh-control-min-w));
|
|
75
|
+
--xh-field-control-radius: var(--xh-color-picker-control-radius, var(--xh-shape-control));
|
|
76
|
+
--xh-field-bg-rest: var(--xh-color-picker-control-bg, var(--xh-_field-variant-bg-rest));
|
|
77
|
+
--xh-field-bg-hover: var(--xh-color-picker-control-bg-hover, var(--xh-_field-variant-bg-hover));
|
|
78
|
+
--xh-field-bg-read-only: var(--xh-color-picker-control-bg-readonly, var(--xh-_field-variant-bg-read-only));
|
|
79
|
+
--xh-field-bg-disabled: var(--xh-color-picker-control-bg-disabled, var(--xh-_field-variant-bg-disabled));
|
|
80
|
+
--xh-field-fg-rest: var(--xh-color-picker-control-fg, var(--xh-fg-default));
|
|
81
|
+
--xh-field-border-rest: var(--xh-color-picker-control-border, var(--xh-_field-variant-border-rest));
|
|
82
|
+
--xh-field-border-hover: var(--xh-color-picker-control-border-hover, var(--xh-_field-variant-border-hover));
|
|
83
|
+
--xh-field-border-focus: var(--xh-color-picker-control-border-focus, var(--xh-_field-variant-border-focus));
|
|
84
|
+
--xh-field-ring-focus: var(--xh-_color-picker-ring);
|
|
85
|
+
--xh-field-shadow-rest: var(--xh-color-picker-control-shadow, none);
|
|
86
|
+
--xh-field-cursor-rest: pointer;
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
[data-scope='color-picker'][data-part='control'][hidden] {
|
|
90
90
|
display: none;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
/* 悬停换描边的同时换填充:这个盒里大半面积是那块色样,只挪一圈 1px 的描边读不出来。
|
|
94
|
-
只读档摘掉:它正拿压低一档的底色说「改不动」,被悬停的填充盖掉那条信息就没了 */
|
|
95
|
-
[data-scope='color-picker'][data-part='control']:hover:not([data-disabled], [data-readonly]) {
|
|
96
|
-
border-color: var(--xh-color-picker-control-border-hover, var(--xh-border-control-hover));
|
|
97
|
-
background: var(--xh-color-picker-control-bg-hover, var(--xh-bg-subtle));
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/* Tab 停靠点是盒里的 trigger,环画在盒上 */
|
|
101
|
-
[data-scope='color-picker'][data-part='control']:focus-within:not([data-disabled]) {
|
|
102
|
-
border-color: var(--xh-color-picker-control-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
|
|
103
|
-
outline: var(--xh-ring-width) solid var(--xh-_color-picker-ring);
|
|
104
|
-
outline-offset: var(--xh-ring-offset);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
[data-scope='color-picker'][data-part='control'][data-disabled] {
|
|
108
|
-
background: var(--xh-color-picker-control-bg-disabled, var(--xh-bg-subtle));
|
|
109
|
-
color: var(--xh-fg-disabled);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/* 只读仍可聚焦、浮层照开,只是改不动:不置灰,只把底色压下去 */
|
|
113
|
-
[data-scope='color-picker'][data-part='control'][data-readonly] {
|
|
114
|
-
background: var(--xh-color-picker-control-bg-readonly, var(--xh-bg-subtle));
|
|
115
|
-
}
|
|
116
|
-
|
|
117
93
|
/* 盒内那颗可聚焦的按钮:不画描边不铺底也不自带高度,只占满剩余宽度、排布色块与值文本 */
|
|
118
94
|
[data-scope='color-picker'][data-part='trigger'] {
|
|
119
95
|
display: inline-flex;
|
|
@@ -217,9 +193,9 @@
|
|
|
217
193
|
padding-inline: var(--xh-color-picker-content-px, var(--xh-space-3));
|
|
218
194
|
max-block-size: min(var(--xh-color-picker-max-h, var(--xh-viewport-h-md)), var(--xh-_color-picker-available-h));
|
|
219
195
|
overflow-y: auto;
|
|
220
|
-
/*
|
|
196
|
+
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
221
197
|
overscroll-behavior: contain;
|
|
222
|
-
/* 面域 + 滑杆 + 通道输入的表单型多列面板,走 floating
|
|
198
|
+
/* 面域 + 滑杆 + 通道输入的表单型多列面板,走 floating 材质——实体底 + --xh-border-default 描边 +
|
|
223
199
|
--xh-elevation-floating 落影,不透景、不画顶部边界光 */
|
|
224
200
|
border: var(--xh-stroke-thin) solid var(--xh-color-picker-content-border, var(--xh-border-default));
|
|
225
201
|
border-radius: var(--xh-color-picker-content-radius, var(--xh-shape-overlay));
|
|
@@ -229,15 +205,14 @@
|
|
|
229
205
|
pointer-events: auto;
|
|
230
206
|
}
|
|
231
207
|
|
|
232
|
-
/*
|
|
233
|
-
[data-scope='color-picker'][data-part='content'][data-state='open'] {
|
|
234
|
-
will-change: opacity, translate;
|
|
208
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现;常驻形态的取色面一直在,没有进退场 */
|
|
209
|
+
[data-scope='color-picker'][data-part='content'][data-state='open']:not([data-instant], [data-inline]) {
|
|
235
210
|
animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
236
211
|
}
|
|
237
212
|
|
|
238
213
|
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
239
214
|
免得动画结束到真收起之间闪一下原样 */
|
|
240
|
-
[data-scope='color-picker'][data-part='content'][data-state='closed'] {
|
|
215
|
+
[data-scope='color-picker'][data-part='content'][data-state='closed']:not([data-inline]) {
|
|
241
216
|
animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
242
217
|
}
|
|
243
218
|
|
|
@@ -246,6 +221,22 @@
|
|
|
246
221
|
outline: none;
|
|
247
222
|
}
|
|
248
223
|
|
|
224
|
+
/* 常驻形态:根不再取字段缺省宽,跟着取色面走 */
|
|
225
|
+
[data-scope='color-picker'][data-part='root'][data-inline] {
|
|
226
|
+
inline-size: auto;
|
|
227
|
+
min-inline-size: 0;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* 常驻形态的取色面是页面里的静态内容面(solid):surface 圆角、border-default 描边、实体底、不落影。
|
|
231
|
+
没有定位层给出可用宽高,不限高也不自己滚;它一直在,没有进退场 */
|
|
232
|
+
[data-scope='color-picker'][data-part='content'][data-inline] {
|
|
233
|
+
max-inline-size: 100%;
|
|
234
|
+
max-block-size: none;
|
|
235
|
+
overflow-y: visible;
|
|
236
|
+
border-radius: var(--xh-color-picker-content-radius, var(--xh-shape-surface));
|
|
237
|
+
box-shadow: var(--xh-color-picker-content-shadow, none);
|
|
238
|
+
}
|
|
239
|
+
|
|
249
240
|
/* 二维取色区。底色是当前色相(连接层内联给),两层渐变盖在上面:
|
|
250
241
|
横轴由白到透明 = 饱和度,纵轴由透明到黑 = 明度。
|
|
251
242
|
两层都收在一个 ::before 里:它是盒树里的第一个子节点,作者写的拇指排在它后面,
|
|
@@ -303,7 +294,7 @@
|
|
|
303
294
|
background: transparent;
|
|
304
295
|
box-shadow: var(--xh-color-picker-thumb-shadow, var(--xh-elevation-raised));
|
|
305
296
|
cursor: grab;
|
|
306
|
-
transition: scale var(--xh-motion-duration-
|
|
297
|
+
transition: scale var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
|
|
307
298
|
}
|
|
308
299
|
|
|
309
300
|
/* 取色区的纵轴也由连接层给(inset-block-start),回拉同样按 block-start 那侧 */
|
|
@@ -366,7 +357,8 @@
|
|
|
366
357
|
}
|
|
367
358
|
|
|
368
359
|
[data-scope='color-picker'][data-part='channel-input']:focus-visible {
|
|
369
|
-
|
|
360
|
+
/* 焦点边一律 --xh-border-control-focus,不随语气 */
|
|
361
|
+
border-color: var(--xh-color-picker-input-border-focus, var(--xh-border-control-focus));
|
|
370
362
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
371
363
|
outline-offset: var(--xh-ring-offset);
|
|
372
364
|
}
|
|
@@ -403,13 +395,14 @@
|
|
|
403
395
|
cursor: pointer;
|
|
404
396
|
user-select: none;
|
|
405
397
|
transition:
|
|
406
|
-
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
398
|
+
background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
407
399
|
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
408
400
|
scale var(--xh-motion-duration-release) var(--xh-motion-ease-release);
|
|
409
401
|
}
|
|
410
402
|
|
|
411
403
|
[data-scope='color-picker'][data-part='eye-dropper-trigger']:hover:not(:disabled) {
|
|
412
|
-
|
|
404
|
+
/* 坐在浮层白底上:白底承载阶梯 hover 100 → pressed 200 */
|
|
405
|
+
background: var(--xh-color-picker-action-bg-hover, var(--xh-bg-subtle));
|
|
413
406
|
color: var(--xh-color-picker-action-fg-hover, var(--xh-fg-default));
|
|
414
407
|
}
|
|
415
408
|
|
|
@@ -417,7 +410,7 @@
|
|
|
417
410
|
松手那一刻浮层多半已经被系统的取色镜头盖住,按下的回执只有这一瞬看得见。
|
|
418
411
|
指针 :active 与 Headless 投影的 data-pressed(Space / Enter 与触屏按住)看见同一副按压面 */
|
|
419
412
|
[data-scope='color-picker'][data-part='eye-dropper-trigger']:not(:disabled):is(:active, [data-pressed]) {
|
|
420
|
-
background: var(--xh-color-picker-action-bg-active, var(--xh-bg-subtle-
|
|
413
|
+
background: var(--xh-color-picker-action-bg-active, var(--xh-bg-subtle-hover));
|
|
421
414
|
scale: var(--xh-motion-scale-press);
|
|
422
415
|
transition-duration: var(--xh-motion-duration-press);
|
|
423
416
|
transition-timing-function: var(--xh-motion-ease-press);
|
|
@@ -437,8 +430,9 @@
|
|
|
437
430
|
/* 预设色板的挂载点,同时充当色板的根节点:color-swatch-picker 那份皮的 root 规则落在
|
|
438
431
|
[data-scope='color-swatch-picker'][data-part='root'] 上,而这里没有那个节点,所以根上挂的那几个私有槽
|
|
439
432
|
(格子边长、间距、徽标尺寸、语气色、图标尺)与排布得在这儿照抄一遍;格子的皮仍归色板那一份。
|
|
440
|
-
|
|
441
|
-
|
|
433
|
+
浮层里的色板走小号格子:与滑块的拇指、数值框一个量级,整块面板才不会被色板撑开。
|
|
434
|
+
最近使用色是同一台色块选择器,挂载点同一套 */
|
|
435
|
+
[data-scope='color-picker']:is([data-part='swatch-picker'], [data-part='recent-swatch-picker']) {
|
|
442
436
|
--xh-_color-swatch-picker-cell: var(--xh-color-picker-swatch-cell, var(--xh-control-h-sm));
|
|
443
437
|
--xh-_color-swatch-picker-gap: var(--xh-color-picker-swatch-gap, var(--xh-control-gap-sm));
|
|
444
438
|
--xh-_color-swatch-picker-indicator: var(--xh-control-indicator-sm);
|
|
@@ -452,7 +446,7 @@
|
|
|
452
446
|
gap: var(--xh-color-picker-swatch-picker-gap, var(--xh-_color-swatch-picker-gap));
|
|
453
447
|
}
|
|
454
448
|
|
|
455
|
-
[data-scope='color-picker'][data-part='swatch-picker'][data-disabled] {
|
|
449
|
+
[data-scope='color-picker']:is([data-part='swatch-picker'], [data-part='recent-swatch-picker'])[data-disabled] {
|
|
456
450
|
cursor: not-allowed;
|
|
457
451
|
}
|
|
458
452
|
|
|
@@ -466,7 +460,8 @@
|
|
|
466
460
|
[data-scope='color-picker'][data-part='hue-slider'][hidden],
|
|
467
461
|
[data-scope='color-picker'][data-part='alpha-slider'][hidden],
|
|
468
462
|
[data-scope='color-picker'][data-part='eye-dropper-trigger'][hidden],
|
|
469
|
-
[data-scope='color-picker'][data-part='swatch-picker'][hidden]
|
|
463
|
+
[data-scope='color-picker'][data-part='swatch-picker'][hidden],
|
|
464
|
+
[data-scope='color-picker'][data-part='recent-swatch-picker'][hidden] {
|
|
470
465
|
display: none;
|
|
471
466
|
}
|
|
472
467
|
|
package/css/color-slider.css
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
display: flex;
|
|
25
25
|
flex-direction: column;
|
|
26
|
-
/*
|
|
26
|
+
/* 字段标签贴控件(复合单字段) */
|
|
27
27
|
gap: var(--xh-color-slider-gap, var(--xh-space-1));
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
align-items: center;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
/*
|
|
36
|
+
/* 禁用不整体压暗:标签是文字,换到禁用前景;颜色带与拇指画的是颜色本身,换不得色,
|
|
37
37
|
压暗只做一次、落在 control 上(track / thumb 各自再叠一层 opacity 会越叠越黑),拇指另收掉抬升 */
|
|
38
38
|
|
|
39
|
-
/* 字段标签:14 / 500 / fg-default
|
|
39
|
+
/* 字段标签:14 / 500 / fg-default,禁用换到 --xh-fg-subtle */
|
|
40
40
|
[data-scope='color-slider'][data-part='label'] {
|
|
41
41
|
color: var(--xh-color-slider-label-fg, var(--xh-fg-default));
|
|
42
42
|
font-size: var(--xh-color-slider-label-font-size, var(--xh-text-label-size));
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
/* 圆点浮在轨道之上:轨道是流内的,拇指是绝对定位的,天然后来居上。
|
|
125
|
-
拇指填的是当前那一档的颜色(连接层写进私有槽),拇指是可拖起的 raised
|
|
125
|
+
拇指填的是当前那一档的颜色(连接层写进私有槽),拇指是可拖起的 raised 面:
|
|
126
126
|
--xh-border-default 描边把它从任何底色里框出来,raised 影只是加成、不作边界。
|
|
127
127
|
box-sizing 必须显式写:描边要吃进直径里,否则下面按半个直径回拉的负外边距就对不上圆心。 */
|
|
128
128
|
[data-scope='color-slider'][data-part='thumb'] {
|
|
@@ -132,13 +132,14 @@
|
|
|
132
132
|
box-sizing: border-box;
|
|
133
133
|
inline-size: var(--xh-_thumb-size);
|
|
134
134
|
block-size: var(--xh-_thumb-size);
|
|
135
|
-
|
|
135
|
+
/* 描边取装饰边的不透明档:墨色描边半透明,压在当前色上框不住圆点 */
|
|
136
|
+
border: var(--xh-stroke-thick) solid var(--xh-color-slider-thumb-border, var(--xh-border-default-opaque));
|
|
136
137
|
border-radius: var(--xh-color-slider-thumb-radius, var(--xh-shape-circle));
|
|
137
138
|
background: var(--xh-color-slider-thumb-bg, var(--xh-_color-slider-thumb-color));
|
|
138
139
|
box-shadow: var(--xh-color-slider-thumb-shadow, var(--xh-elevation-raised));
|
|
139
140
|
cursor: grab;
|
|
140
141
|
transition:
|
|
141
|
-
scale var(--xh-motion-duration-
|
|
142
|
+
scale var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong),
|
|
142
143
|
box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
143
144
|
}
|
|
144
145
|
|
|
@@ -159,7 +160,10 @@
|
|
|
159
160
|
|
|
160
161
|
/* 放大用 scale 而不是改尺寸:变换绕自身中心发生,圆心不动。海拔从 raised 换到 lifted */
|
|
161
162
|
[data-scope='color-slider'][data-part='thumb'][data-dragging] {
|
|
162
|
-
|
|
163
|
+
/* 放大比例落进私有槽:挂在拇指里的值气泡读同一支反向缩回原尺寸 */
|
|
164
|
+
--xh-_color-slider-thumb-scale: var(--xh-color-slider-thumb-scale-dragging, var(--xh-motion-scale-drag));
|
|
165
|
+
|
|
166
|
+
scale: var(--xh-_color-slider-thumb-scale);
|
|
163
167
|
cursor: grabbing;
|
|
164
168
|
box-shadow: var(--xh-color-slider-thumb-shadow-dragging, var(--xh-elevation-lifted));
|
|
165
169
|
}
|
|
@@ -179,14 +183,19 @@
|
|
|
179
183
|
cursor: not-allowed;
|
|
180
184
|
}
|
|
181
185
|
|
|
182
|
-
/*
|
|
186
|
+
/* 值气泡:挂在拇指里,跟着拇指一起走位。默认只在推动那一刻露面。
|
|
187
|
+
气泡宽度由文字撑出,只能靠平移回中:两侧 inset 都钉在 50% 再靠自动外边距回中时可用宽度是 0,
|
|
188
|
+
气泡比它宽,自动外边距按规范取 0,气泡从拇指中线起排、偏出半个自身宽。平移乘书写方向的符号,
|
|
189
|
+
rtl 下行内分量掉头。拖动时拇指放大,气泡按同一比例反向缩回、与拇指同一段过渡:文字不跟着放大,
|
|
190
|
+
缩放原点在贴着拇指那一边 */
|
|
183
191
|
[data-scope='color-slider'][data-part='value-text'] {
|
|
184
192
|
position: absolute;
|
|
185
193
|
inset-block-end: 100%;
|
|
186
|
-
inset-inline: 50%;
|
|
194
|
+
inset-inline-start: 50%;
|
|
187
195
|
inline-size: max-content;
|
|
188
196
|
margin-block-end: var(--xh-color-slider-value-text-offset, var(--xh-space-2));
|
|
189
|
-
|
|
197
|
+
translate: calc(-50% * var(--xh-direction-sign)) 0;
|
|
198
|
+
transform-origin: 50% 100%;
|
|
190
199
|
padding-block: var(--xh-color-slider-value-text-py, var(--xh-space-0_5));
|
|
191
200
|
padding-inline: var(--xh-color-slider-value-text-px, var(--xh-space-2));
|
|
192
201
|
border-radius: var(--xh-color-slider-value-text-radius, var(--xh-shape-control));
|
|
@@ -199,7 +208,9 @@
|
|
|
199
208
|
/* 气泡贴在拇指上方,指针要落到拇指上,不能被它挡住 */
|
|
200
209
|
pointer-events: none;
|
|
201
210
|
opacity: 0;
|
|
202
|
-
transition:
|
|
211
|
+
transition:
|
|
212
|
+
opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
213
|
+
scale var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
|
|
203
214
|
}
|
|
204
215
|
|
|
205
216
|
[data-scope='color-slider'][data-part='value-text'][hidden] {
|
|
@@ -208,15 +219,18 @@
|
|
|
208
219
|
|
|
209
220
|
[data-scope='color-slider'][data-part='value-text'][data-dragging] {
|
|
210
221
|
opacity: 1;
|
|
222
|
+
scale: calc(1 / var(--xh-_color-slider-thumb-scale, 1));
|
|
211
223
|
}
|
|
212
224
|
|
|
213
|
-
/*
|
|
225
|
+
/* 竖排轨道的气泡挪到行侧:压在拇指上方会挡住上一档的值;反向缩放的原点换到贴着拇指的行首那一侧 */
|
|
214
226
|
[data-scope='color-slider'][data-part='value-text'][data-orientation='vertical'] {
|
|
215
227
|
inset-block: 50%;
|
|
216
228
|
inset-inline: 100% auto;
|
|
217
229
|
block-size: max-content;
|
|
218
230
|
margin-block: auto;
|
|
219
231
|
margin-inline: var(--xh-color-slider-value-text-offset, var(--xh-space-2)) 0;
|
|
232
|
+
translate: none;
|
|
233
|
+
transform-origin: calc(50% - 50% * var(--xh-direction-sign)) 50%;
|
|
220
234
|
}
|
|
221
235
|
|
|
222
236
|
/* —— 尺寸 —— */
|
|
@@ -239,13 +253,6 @@
|
|
|
239
253
|
|
|
240
254
|
/* hidden-input 是 type=hidden 的原生输入,浏览器本就不渲染它,这里一条声明都不给。 */
|
|
241
255
|
|
|
242
|
-
@media (prefers-reduced-motion: reduce) {
|
|
243
|
-
[data-scope='color-slider'][data-part='thumb'],
|
|
244
|
-
[data-scope='color-slider'][data-part='value-text'] {
|
|
245
|
-
transition: none;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
256
|
/*
|
|
250
257
|
* 高对比档:轨道画的就是颜色本身,被系统换掉之后整条滑杆不再能调色。
|
|
251
258
|
* 轨道与拇指退出强制着色保住原色,各补一圈系统描边把它们从背景里框出来。
|