@xihan-ui/styles 1.1.0 → 2.1.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 +5055 -6
- package/README.md +22 -2
- package/component-tokens.d.ts +4197 -0
- package/component-tokens.js +2 -0
- package/components.tokens.json +79785 -0
- package/css/accordion.css +131 -75
- package/css/affix.css +16 -1
- package/css/alert.css +114 -67
- package/css/anchor.css +99 -27
- package/css/approval.css +461 -0
- package/css/avatar-group.css +14 -6
- package/css/avatar.css +33 -9
- package/css/back-top.css +103 -48
- package/css/badge.css +42 -14
- package/css/bar-code.css +62 -0
- package/css/breadcrumb.css +40 -21
- package/css/button-group.css +146 -24
- package/css/button.css +116 -99
- package/css/calendar-picker.css +448 -0
- package/css/calendar-range-picker.css +517 -0
- package/css/card.css +54 -77
- package/css/carousel.css +412 -68
- package/css/cascader.css +427 -246
- package/css/checkbox-group.css +225 -77
- package/css/checkbox.css +174 -37
- package/css/clipboard.css +266 -47
- package/css/code-view.css +279 -0
- package/css/collapsible.css +108 -63
- package/css/color-field.css +158 -0
- package/css/color-picker.css +170 -184
- package/css/color-slider.css +274 -0
- package/css/color-swatch-picker.css +243 -0
- package/css/color-swatch.css +35 -0
- package/css/combobox.css +265 -273
- package/css/command.css +397 -0
- package/css/context-menu.css +181 -108
- package/css/date-field.css +94 -121
- package/css/date-picker.css +484 -249
- package/css/date-range-picker.css +557 -0
- package/css/description.css +51 -0
- package/css/descriptions.css +133 -87
- package/css/dialog.css +245 -68
- package/css/diff-view.css +428 -0
- package/css/download-trigger.css +155 -46
- package/css/drawer.css +188 -111
- package/css/editable.css +172 -152
- package/css/empty-state.css +80 -11
- package/css/field-array.css +190 -0
- package/css/field.css +84 -31
- package/css/fieldset.css +51 -18
- package/css/file-upload.css +134 -36
- package/css/flex.css +20 -1
- package/css/float-button.css +238 -57
- package/css/floating-panel.css +171 -92
- package/css/focus.css +46 -0
- package/css/forced-colors.css +93 -0
- package/css/form.css +254 -77
- package/css/gradient-text.css +34 -10
- package/css/grid.css +516 -5
- package/css/heatmap.css +87 -29
- package/css/highlight.css +20 -5
- package/css/hover-card.css +95 -47
- package/css/icon-wrapper.css +15 -3
- package/css/icon.css +74 -8
- package/css/image-cropper.css +143 -29
- package/css/image-viewer.css +148 -89
- package/css/image.css +30 -1
- package/css/infinite-scroll.css +51 -1
- package/css/input-group.css +277 -0
- package/css/json-viewer.css +102 -45
- package/css/kbd.css +72 -0
- package/css/label.css +78 -0
- package/css/layers.css +5 -0
- package/css/layout.css +175 -31
- package/css/list.css +24 -3
- package/css/listbox.css +215 -65
- package/css/loading-bar.css +52 -3
- package/css/log.css +144 -9
- package/css/markdown-stream.css +149 -0
- package/css/marquee.css +27 -1
- package/css/masonry.css +7 -0
- package/css/matrix-code.css +67 -0
- package/css/mention.css +232 -152
- package/css/menu.css +178 -83
- package/css/menubar.css +202 -136
- package/css/message-feed.css +197 -0
- package/css/navigation-menu.css +142 -90
- package/css/notification.css +178 -100
- package/css/number-animation.css +7 -0
- package/css/number-field.css +120 -277
- package/css/overlay-arrow.css +12 -7
- package/css/page-header.css +99 -14
- package/css/pagination.css +173 -135
- package/css/password-input.css +222 -219
- package/css/pin-input.css +101 -67
- package/css/pointer.css +36 -0
- package/css/popconfirm.css +182 -93
- package/css/popover.css +119 -77
- package/css/progress.css +60 -12
- package/css/prompt-input.css +224 -0
- package/css/question-flow.css +513 -0
- package/css/radio-group.css +147 -30
- package/css/rating.css +193 -43
- package/css/reasoning.css +336 -0
- package/css/reset.css +84 -6
- package/css/resizable.css +143 -19
- package/css/scroll-area.css +68 -7
- package/css/scrollbar.css +47 -13
- package/css/segmented.css +94 -29
- package/css/select.css +286 -274
- package/css/separator.css +101 -1
- package/css/side-nav.css +131 -75
- package/css/signature-pad.css +74 -54
- package/css/skeleton.css +84 -11
- package/css/slider.css +132 -39
- package/css/sortable.css +123 -28
- package/css/spinner.css +126 -12
- package/css/splitter.css +29 -8
- package/css/statistic.css +55 -0
- package/css/steps.css +206 -72
- package/css/switch.css +268 -36
- package/css/table.css +429 -143
- package/css/tabs.css +475 -52
- package/css/tag-group.css +223 -0
- package/css/tag.css +118 -28
- package/css/tags-input.css +156 -274
- package/css/text-field.css +101 -249
- package/css/time-field.css +100 -128
- package/css/time-picker.css +321 -252
- package/css/time-range-picker.css +717 -0
- package/css/timeline.css +202 -68
- package/css/timer.css +56 -52
- package/css/timestamp.css +34 -0
- package/css/toast.css +373 -144
- package/css/toggle-group.css +309 -76
- package/css/toggle.css +116 -85
- package/css/tone.css +47 -0
- package/css/tool-call.css +421 -0
- package/css/toolbar.css +181 -33
- package/css/tooltip.css +105 -36
- package/css/tour.css +181 -152
- package/css/transfer.css +351 -138
- package/css/tree-select.css +321 -216
- package/css/tree.css +172 -122
- package/css/truncate.css +65 -0
- package/css/typography.css +228 -5
- package/css/undefined.css +10 -1
- package/css/virtualizer.css +9 -10
- package/css/visually-hidden.css +7 -0
- package/css/watermark.css +7 -0
- package/family/action-control.css +487 -0
- package/family/collection-item.css +770 -0
- package/family/field-chrome.css +298 -0
- package/family/motion.css +166 -0
- package/family/swatch.css +59 -0
- package/index.css +41658 -128
- package/index.unlayered.css +33356 -17825
- package/package.json +49 -17
- package/css/calendar.css +0 -367
- package/css/code-block.css +0 -91
- package/css/composer.css +0 -134
- package/css/countdown.css +0 -26
- package/css/dynamic-input.css +0 -220
- package/css/ellipsis.css +0 -52
- package/css/hotkeys.css +0 -90
- package/css/popselect.css +0 -391
- package/css/qr-code.css +0 -55
- package/css/result.css +0 -119
- package/css/space.css +0 -117
- package/css/thread.css +0 -120
- package/css/time.css +0 -25
package/css/color-picker.css
CHANGED
|
@@ -1,27 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
scale: var(--xh-motion-scale-enter);
|
|
6
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2021-Present XiHanFun and contributors.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
|
4
|
+
*/
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
@keyframes xh-pop-out {
|
|
14
|
-
from {
|
|
15
|
-
opacity: 1;
|
|
16
|
-
scale: 1;
|
|
17
|
-
}
|
|
6
|
+
/* 定义 color picker 样式。 */
|
|
7
|
+
|
|
8
|
+
@import '../family/swatch.css';
|
|
9
|
+
@import '../family/motion.css';
|
|
18
10
|
|
|
19
|
-
to {
|
|
20
|
-
opacity: 0;
|
|
21
|
-
scale: var(--xh-motion-scale-enter);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
11
|
|
|
26
12
|
@layer xihan.components {
|
|
27
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -29,10 +15,11 @@
|
|
|
29
15
|
--xh-color-picker-skin: 1;
|
|
30
16
|
}
|
|
31
17
|
|
|
32
|
-
/* 定位分工:取色区拇指的两条轴(inset-inline-start / inset-block-start
|
|
33
|
-
通道拇指的主轴(inset-inline-start)、浮层坐标、取色区底色、透明度轨道的渐变,
|
|
18
|
+
/* 定位分工:取色区拇指的两条轴(inset-inline-start / inset-block-start)、浮层坐标、取色区底色,
|
|
34
19
|
全都由连接层每帧写进内联样式。这份皮肤一个都不碰:内联优先级高于样式表,
|
|
35
|
-
写了不但是死声明,还会跟连接层抢位置。皮肤只管尺寸、颜色、圆角与状态表现。
|
|
20
|
+
写了不但是死声明,还会跟连接层抢位置。皮肤只管尺寸、颜色、圆角与状态表现。
|
|
21
|
+
色相 / 透明度两条滑块与预设色板是内嵌组件,各自的皮归 color-slider.css 与 color-swatch-picker.css;
|
|
22
|
+
这里只画三个挂载点——它们同时充当内嵌组件的根节点,根上那几条规则要在这儿照抄一遍。 */
|
|
36
23
|
|
|
37
24
|
/* 标签一行、盒一行的两行堆叠 */
|
|
38
25
|
[data-scope='color-picker'][data-part='root'] {
|
|
@@ -48,6 +35,12 @@
|
|
|
48
35
|
display: inline-flex;
|
|
49
36
|
flex-direction: column;
|
|
50
37
|
gap: var(--xh-color-picker-gap, var(--xh-space-1));
|
|
38
|
+
|
|
39
|
+
/* 不传尺寸时一律这么宽,宽度不随内容走;父容器给不出这么宽时整件跟着收,地板同步让步,不越出父容器。
|
|
40
|
+
地板不高过缺省宽:使用者把缺省宽钉到底线以下时不必再放开底线 */
|
|
41
|
+
inline-size: var(--xh-color-picker-control-w, var(--xh-control-w));
|
|
42
|
+
min-inline-size: min(var(--xh-color-picker-control-w, var(--xh-control-w)), var(--xh-color-picker-control-min-w, var(--xh-control-min-w)), 100%);
|
|
43
|
+
max-inline-size: 100%;
|
|
51
44
|
}
|
|
52
45
|
|
|
53
46
|
/* —— 尺寸 —— */
|
|
@@ -71,35 +64,37 @@
|
|
|
71
64
|
color: var(--xh-color-picker-label-fg, var(--xh-fg-default));
|
|
72
65
|
font-size: var(--xh-color-picker-label-font-size, var(--xh-_color-picker-label-font-size));
|
|
73
66
|
font-weight: var(--xh-color-picker-label-font-weight, var(--xh-text-label-weight));
|
|
74
|
-
line-height: var(--xh-leading-none);
|
|
75
67
|
}
|
|
76
68
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/* 盒:描边、底色、控件高度与行内内衬都落在这一层 */
|
|
69
|
+
/* 盒:描边、底色、控件高度与行内内衬都落在这一层,
|
|
70
|
+
另加一档静态落影把它从页面里抬起一层 */
|
|
82
71
|
[data-scope='color-picker'][data-part='control'] {
|
|
83
72
|
display: inline-flex;
|
|
84
73
|
align-items: center;
|
|
85
74
|
gap: var(--xh-color-picker-control-gap, var(--xh-_color-picker-gap));
|
|
86
|
-
min-inline-size: var(--xh-color-picker-control-min-w, var(--xh-control-min-w));
|
|
75
|
+
min-inline-size: min(var(--xh-color-picker-control-min-w, var(--xh-control-min-w)), 100%);
|
|
87
76
|
block-size: var(--xh-color-picker-control-h, var(--xh-_color-picker-h));
|
|
88
77
|
padding-inline: var(--xh-color-picker-control-px, var(--xh-_color-picker-px));
|
|
89
78
|
border: var(--xh-stroke-thin) solid var(--xh-color-picker-control-border, var(--xh-border-control));
|
|
90
79
|
border-radius: var(--xh-color-picker-control-radius, var(--xh-shape-control));
|
|
91
|
-
background: var(--xh-color-picker-control-bg,
|
|
80
|
+
background: var(--xh-color-picker-control-bg, transparent);
|
|
81
|
+
box-shadow: var(--xh-color-picker-control-shadow, var(--xh-elevation-raised));
|
|
92
82
|
color: var(--xh-color-picker-control-fg, var(--xh-fg-default));
|
|
93
83
|
cursor: pointer;
|
|
94
|
-
transition:
|
|
84
|
+
transition:
|
|
85
|
+
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
86
|
+
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
95
87
|
}
|
|
96
88
|
|
|
97
89
|
[data-scope='color-picker'][data-part='control'][hidden] {
|
|
98
90
|
display: none;
|
|
99
91
|
}
|
|
100
92
|
|
|
101
|
-
|
|
93
|
+
/* 悬停换描边的同时换填充:这个盒里大半面积是那块色样,只挪一圈 1px 的描边读不出来。
|
|
94
|
+
只读档摘掉:它正拿压低一档的底色说「改不动」,被悬停的填充盖掉那条信息就没了 */
|
|
95
|
+
[data-scope='color-picker'][data-part='control']:hover:not([data-disabled], [data-readonly]) {
|
|
102
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));
|
|
103
98
|
}
|
|
104
99
|
|
|
105
100
|
/* Tab 停靠点是盒里的 trigger,环画在盒上 */
|
|
@@ -112,7 +107,6 @@
|
|
|
112
107
|
[data-scope='color-picker'][data-part='control'][data-disabled] {
|
|
113
108
|
background: var(--xh-color-picker-control-bg-disabled, var(--xh-bg-subtle));
|
|
114
109
|
color: var(--xh-fg-disabled);
|
|
115
|
-
cursor: not-allowed;
|
|
116
110
|
}
|
|
117
111
|
|
|
118
112
|
/* 只读仍可聚焦、浮层照开,只是改不动:不置灰,只把底色压下去 */
|
|
@@ -142,22 +136,17 @@
|
|
|
142
136
|
display: none;
|
|
143
137
|
}
|
|
144
138
|
|
|
145
|
-
/* 单体控件用原生 disabled
|
|
139
|
+
/* 单体控件用原生 disabled */
|
|
146
140
|
[data-scope='color-picker'][data-part='trigger']:disabled {
|
|
147
141
|
color: var(--xh-fg-disabled);
|
|
148
|
-
cursor: not-allowed;
|
|
149
142
|
}
|
|
150
143
|
|
|
151
|
-
/*
|
|
152
|
-
|
|
153
|
-
半透明色因此直接与页面底色混合——小色块上这么显示是准确的。 */
|
|
144
|
+
/* 当前颜色的色块:面、棋盘格、描边与尺寸档全由色块面家族画(带 data-xh-swatch),
|
|
145
|
+
半透明色铺在棋盘格上;组件层只把自己的公开槽映射到家族合同 */
|
|
154
146
|
[data-scope='color-picker'][data-part='swatch'] {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
block-size: var(--xh-color-picker-swatch-size, 18px);
|
|
159
|
-
border: var(--xh-stroke-thin) solid var(--xh-color-picker-swatch-border, var(--xh-border-default));
|
|
160
|
-
border-radius: var(--xh-color-picker-swatch-radius, var(--xh-shape-inset));
|
|
147
|
+
--xh-swatch-size: var(--xh-color-picker-swatch-size, var(--xh-_swatch-size));
|
|
148
|
+
--xh-swatch-radius: var(--xh-color-picker-swatch-radius, var(--xh-shape-inset));
|
|
149
|
+
--xh-swatch-border: var(--xh-color-picker-swatch-border, var(--xh-border-default));
|
|
161
150
|
}
|
|
162
151
|
|
|
163
152
|
/* 值串可能很长,必须能截断;框宽由盒定,这里得允许自己被压缩 */
|
|
@@ -177,32 +166,63 @@
|
|
|
177
166
|
/* 落定那一侧的可用高度,由定位引擎经内联自定义属性写进来,内容层继承它限高;
|
|
178
167
|
引擎没算(尚未落位 / 无引擎 / 贴边归零)时不额外限高 */
|
|
179
168
|
--xh-_color-picker-available-h: 100vh;
|
|
169
|
+
/* 落定那一侧的可用宽度,同样由定位引擎经内联自定义属性写进来,内容层据此夹住行内轴;
|
|
170
|
+
引擎没算(尚未落位 / 无引擎 / 贴边归零)时退到视口宽 */
|
|
171
|
+
--xh-_color-picker-available-w: 100vw;
|
|
172
|
+
/* 每个面板按自身落位方向进入,截断祖先浮层方向的继承。 */
|
|
173
|
+
--xh-_overlay-enter-up: 0;
|
|
174
|
+
--xh-_overlay-enter-down: 0;
|
|
175
|
+
--xh-_overlay-enter-left: 0;
|
|
176
|
+
--xh-_overlay-enter-right: 0;
|
|
180
177
|
|
|
181
178
|
/* 面板的自绘条浮在内容之上:轨道不上底色,实色轨道会在面板右缘糊出一条竖灰带 */
|
|
182
179
|
--xh-scrollbar-track-bg: transparent;
|
|
183
180
|
|
|
184
181
|
position: fixed;
|
|
185
|
-
z-index: var(--xh-color-picker-layer, var(--xh-layer-popover));
|
|
182
|
+
z-index: var(--xh-color-picker-layer, var(--xh-_layer, var(--xh-layer-popover)));
|
|
186
183
|
/* 空壳不吃指针,交互只发生在 content 上 */
|
|
187
184
|
pointer-events: none;
|
|
188
185
|
}
|
|
189
186
|
|
|
187
|
+
[data-scope='color-picker'][data-part='positioner'][data-placement^='top'] {
|
|
188
|
+
--xh-_overlay-enter-down: 1;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
[data-scope='color-picker'][data-part='positioner'][data-placement^='bottom'] {
|
|
192
|
+
--xh-_overlay-enter-up: 1;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
[data-scope='color-picker'][data-part='positioner'][data-placement^='left'] {
|
|
196
|
+
--xh-_overlay-enter-right: 1;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
[data-scope='color-picker'][data-part='positioner'][data-placement^='right'] {
|
|
200
|
+
--xh-_overlay-enter-left: 1;
|
|
201
|
+
}
|
|
202
|
+
|
|
190
203
|
/* 锚点被滚出可视区:整个浮层随之收起 */
|
|
191
204
|
[data-scope='color-picker'][data-part='positioner'][data-hidden] {
|
|
192
205
|
visibility: hidden;
|
|
193
206
|
}
|
|
194
207
|
|
|
195
208
|
[data-scope='color-picker'][data-part='content'] {
|
|
209
|
+
position: relative;
|
|
196
210
|
display: flex;
|
|
197
211
|
flex-direction: column;
|
|
198
212
|
gap: var(--xh-color-picker-content-gap, var(--xh-space-3));
|
|
199
213
|
inline-size: var(--xh-color-picker-content-w, var(--xh-overlay-min-w));
|
|
214
|
+
/* 定宽的面板也要夹一道:窄视口下伸出去,右半边的取色区就点不到了 */
|
|
215
|
+
max-inline-size: var(--xh-_color-picker-available-w);
|
|
200
216
|
padding-block: var(--xh-color-picker-content-py, var(--xh-space-3));
|
|
201
217
|
padding-inline: var(--xh-color-picker-content-px, var(--xh-space-3));
|
|
202
218
|
max-block-size: min(var(--xh-color-picker-max-h, var(--xh-viewport-h-md)), var(--xh-_color-picker-available-h));
|
|
203
219
|
overflow-y: auto;
|
|
220
|
+
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
221
|
+
overscroll-behavior: contain;
|
|
222
|
+
/* 面域 + 滑杆 + 通道输入的表单型多列面板,走 floating 材质——实体底 + --xh-border-default 描边 +
|
|
223
|
+
--xh-elevation-floating 落影,不透景、不画顶部边界光 */
|
|
204
224
|
border: var(--xh-stroke-thin) solid var(--xh-color-picker-content-border, var(--xh-border-default));
|
|
205
|
-
border-radius: var(--xh-color-picker-content-radius, var(--xh-shape-
|
|
225
|
+
border-radius: var(--xh-color-picker-content-radius, var(--xh-shape-overlay));
|
|
206
226
|
background: var(--xh-color-picker-content-bg, var(--xh-bg-surface));
|
|
207
227
|
color: var(--xh-color-picker-content-fg, var(--xh-fg-default));
|
|
208
228
|
box-shadow: var(--xh-color-picker-content-shadow, var(--xh-elevation-floating));
|
|
@@ -210,13 +230,13 @@
|
|
|
210
230
|
}
|
|
211
231
|
|
|
212
232
|
[data-scope='color-picker'][data-part='content'][data-state='open'] {
|
|
213
|
-
animation: xh-
|
|
233
|
+
animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
214
234
|
}
|
|
215
235
|
|
|
216
236
|
/* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
|
|
217
237
|
免得动画结束到真收起之间闪一下原样 */
|
|
218
238
|
[data-scope='color-picker'][data-part='content'][data-state='closed'] {
|
|
219
|
-
animation: xh-
|
|
239
|
+
animation: xh-overlay-slide-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
220
240
|
}
|
|
221
241
|
|
|
222
242
|
/* 浮层本身只是个容器(tabindex=-1 是焦点域的兜底落点),落焦时不画环 */
|
|
@@ -229,16 +249,16 @@
|
|
|
229
249
|
两层都收在一个 ::before 里:它是盒树里的第一个子节点,作者写的拇指排在它后面,
|
|
230
250
|
绘制顺序上就压在渐变之上;拆成 ::before + ::after 的话 ::after 是最后一个子节点,
|
|
231
251
|
会反过来盖住拇指。 */
|
|
232
|
-
[data-scope='color-picker'][data-part='area'] {
|
|
252
|
+
[data-scope='color-picker'][data-part='saturation-area'] {
|
|
233
253
|
position: relative;
|
|
234
254
|
display: block;
|
|
235
|
-
block-size: var(--xh-color-picker-area-h, 9rem);
|
|
236
|
-
border-radius: var(--xh-color-picker-area-radius, var(--xh-shape-control));
|
|
255
|
+
block-size: var(--xh-color-picker-saturation-area-h, 9rem);
|
|
256
|
+
border-radius: var(--xh-color-picker-saturation-area-radius, var(--xh-shape-control));
|
|
237
257
|
cursor: crosshair;
|
|
238
258
|
}
|
|
239
259
|
|
|
240
260
|
/* white / black 是 HSV 色彩空间自带的两个端点,不是主题色,因此不走令牌 */
|
|
241
|
-
[data-scope='color-picker'][data-part='area']::before {
|
|
261
|
+
[data-scope='color-picker'][data-part='saturation-area']::before {
|
|
242
262
|
position: absolute;
|
|
243
263
|
border-radius: inherit;
|
|
244
264
|
background-image:
|
|
@@ -250,39 +270,38 @@
|
|
|
250
270
|
|
|
251
271
|
/* 渐变方向没有逻辑关键字可用,只能靠 :dir() 分流:
|
|
252
272
|
拇指走的是 inset-inline-start,rtl 下自动换向,饱和度那层渐变不跟着换就反了 */
|
|
253
|
-
[data-scope='color-picker'][data-part='area']:dir(rtl)::before {
|
|
273
|
+
[data-scope='color-picker'][data-part='saturation-area']:dir(rtl)::before {
|
|
254
274
|
background-image:
|
|
255
275
|
linear-gradient(to bottom, transparent, black),
|
|
256
276
|
linear-gradient(to left, white, transparent);
|
|
257
277
|
}
|
|
258
278
|
|
|
259
|
-
[data-scope='color-picker'][data-part='area'][data-readonly] {
|
|
279
|
+
[data-scope='color-picker'][data-part='saturation-area'][data-readonly]:not([data-disabled]) {
|
|
260
280
|
cursor: default;
|
|
261
281
|
}
|
|
262
282
|
|
|
263
|
-
[data-scope='color-picker'][data-part='area'][data-disabled] {
|
|
264
|
-
cursor: not-allowed;
|
|
283
|
+
[data-scope='color-picker'][data-part='saturation-area'][data-disabled] {
|
|
265
284
|
opacity: var(--xh-state-disabled-opacity);
|
|
266
285
|
}
|
|
267
286
|
|
|
268
|
-
/*
|
|
287
|
+
/* 取色区的拇指:镂空的小圆环,中心正好落在值所在的比例点上。
|
|
269
288
|
内联样式把 inset-* 定在比例上,那是拇指的起始边不是圆心,用负的逻辑外边距回拉半径。
|
|
270
289
|
刻意不用 translate(-50%):rtl 下 inset-inline-start 映射到 right,
|
|
271
290
|
位移量是物理方向的,会把拇指推向错误的一侧;负的逻辑外边距自己就跟着换向。
|
|
272
|
-
box-sizing 必须显式写:描边要吃进直径里,否则实际盒子比变量宽两条边,回拉就对不上圆心。
|
|
273
|
-
|
|
274
|
-
[data-scope='color-picker'][data-part='
|
|
291
|
+
box-sizing 必须显式写:描边要吃进直径里,否则实际盒子比变量宽两条边,回拉就对不上圆心。
|
|
292
|
+
两条滑块的拇指归 color-slider 那份皮,与这一颗同一副长相。 */
|
|
293
|
+
[data-scope='color-picker'][data-part='area-thumb'] {
|
|
275
294
|
position: absolute;
|
|
276
295
|
box-sizing: border-box;
|
|
277
296
|
inline-size: var(--xh-color-picker-thumb-size, 14px);
|
|
278
297
|
block-size: var(--xh-color-picker-thumb-size, 14px);
|
|
279
298
|
margin-inline-start: calc(var(--xh-color-picker-thumb-size, 14px) / -2);
|
|
280
299
|
border: var(--xh-stroke-thick) solid var(--xh-color-picker-thumb-border, var(--xh-color-neutral-0));
|
|
281
|
-
border-radius: var(--xh-color-picker-thumb-radius, var(--xh-shape-
|
|
300
|
+
border-radius: var(--xh-color-picker-thumb-radius, var(--xh-shape-circle));
|
|
282
301
|
background: transparent;
|
|
283
302
|
box-shadow: var(--xh-color-picker-thumb-shadow, var(--xh-elevation-raised));
|
|
284
303
|
cursor: grab;
|
|
285
|
-
transition: scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
304
|
+
transition: scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter-strong);
|
|
286
305
|
}
|
|
287
306
|
|
|
288
307
|
/* 取色区的纵轴也由连接层给(inset-block-start),回拉同样按 block-start 那侧 */
|
|
@@ -290,101 +309,43 @@
|
|
|
290
309
|
margin-block-start: calc(var(--xh-color-picker-thumb-size, 14px) / -2);
|
|
291
310
|
}
|
|
292
311
|
|
|
293
|
-
/*
|
|
294
|
-
[data-scope='color-picker'][data-part='channel-slider-thumb'] {
|
|
295
|
-
inset-block-start: 50%;
|
|
296
|
-
margin-block-start: calc(var(--xh-color-picker-thumb-size, 14px) / -2);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
[data-scope='color-picker'][data-part='area-thumb']:focus-visible,
|
|
300
|
-
[data-scope='color-picker'][data-part='channel-slider-thumb']:focus-visible {
|
|
301
|
-
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
302
|
-
outline-offset: var(--xh-ring-offset);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/* 只有手真正拖着的那一处带 data-dragging:放大与光标不会三处一起变。
|
|
312
|
+
/* 只有手真正拖着时带 data-dragging:放大与光标不会几处一起变。
|
|
306
313
|
放大用 scale 而不是改尺寸:变换绕自身中心发生,圆心不动,负外边距的算式不用跟着改 */
|
|
307
|
-
[data-scope='color-picker'][data-part='area-thumb'][data-dragging]
|
|
308
|
-
[data-scope='color-picker'][data-part='channel-slider-thumb'][data-dragging] {
|
|
314
|
+
[data-scope='color-picker'][data-part='area-thumb'][data-dragging] {
|
|
309
315
|
scale: var(--xh-color-picker-thumb-scale-dragging, var(--xh-motion-scale-drag));
|
|
310
316
|
cursor: grabbing;
|
|
311
317
|
}
|
|
312
318
|
|
|
313
|
-
[data-scope='color-picker'][data-part='area-thumb'][data-readonly]
|
|
314
|
-
[data-scope='color-picker'][data-part='channel-slider-thumb'][data-readonly] {
|
|
319
|
+
[data-scope='color-picker'][data-part='area-thumb'][data-readonly]:not([data-disabled]) {
|
|
315
320
|
cursor: default;
|
|
316
321
|
}
|
|
317
322
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
323
|
+
/* 两条颜色滑块的挂载点,同时充当各自的根节点:color-slider 那份皮的 root 规则落在
|
|
324
|
+
[data-scope='color-slider'][data-part='root'] 上,而这里没有那个节点,所以根上挂的两个私有槽
|
|
325
|
+
(拇指直径、轨道厚度,control / track / thumb 都读它们)与排布得在这儿照抄一遍;
|
|
326
|
+
滑块内部的皮仍归 color-slider 那一份。尺寸档跟着浮层上的 data-size 走,不必再各写一遍 */
|
|
327
|
+
[data-scope='color-picker'][data-part='hue-slider'],
|
|
328
|
+
[data-scope='color-picker'][data-part='alpha-slider'] {
|
|
329
|
+
--xh-_thumb-size: var(--xh-color-picker-slider-thumb-size, var(--xh-track-thumb-size));
|
|
330
|
+
--xh-_track-thickness: var(--xh-color-picker-slider-track-thickness, var(--xh-space-3));
|
|
322
331
|
|
|
323
|
-
/* 拇指以整条滑杆为定位上下文(拇指浮出轨道,挂在轨道上会被轨道的盒子束住)。
|
|
324
|
-
厚度取拇指直径:轨道只有几个像素,滑杆若按轨道高,浮出来的拇指会顶到上下相邻的元素。 */
|
|
325
|
-
[data-scope='color-picker'][data-part='channel-slider'] {
|
|
326
|
-
position: relative;
|
|
327
332
|
display: flex;
|
|
328
|
-
|
|
329
|
-
block-size: var(--xh-color-picker-thumb-size, 14px);
|
|
330
|
-
border-radius: var(--xh-color-picker-track-radius, var(--xh-shape-pill));
|
|
331
|
-
cursor: pointer;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/* 透明度那条的棋盘格铺在滑杆上、垫在轨道底下:
|
|
335
|
-
轨道自己的渐变从全透明走到实色,透明那半正好把棋盘格露出来。
|
|
336
|
-
铺在轨道上是做不到的——那儿的 background-image 归连接层。 */
|
|
337
|
-
[data-scope='color-picker'][data-part='channel-slider'][data-channel='alpha'] {
|
|
338
|
-
background-image:
|
|
339
|
-
linear-gradient(45deg, var(--xh-color-picker-checker, var(--xh-color-neutral-300)) 25%, transparent 25%),
|
|
340
|
-
linear-gradient(-45deg, var(--xh-color-picker-checker, var(--xh-color-neutral-300)) 25%, transparent 25%),
|
|
341
|
-
linear-gradient(45deg, transparent 75%, var(--xh-color-picker-checker, var(--xh-color-neutral-300)) 75%),
|
|
342
|
-
linear-gradient(-45deg, transparent 75%, var(--xh-color-picker-checker, var(--xh-color-neutral-300)) 75%);
|
|
343
|
-
background-position: 0 0, 0 4px, 4px -4px, -4px 0;
|
|
344
|
-
background-size: 8px 8px;
|
|
333
|
+
flex-direction: column;
|
|
345
334
|
}
|
|
346
335
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
336
|
+
/* 标题与轨道之间的间隙 */
|
|
337
|
+
[data-scope='color-picker'][data-part='hue-slider'] {
|
|
338
|
+
gap: var(--xh-color-picker-hue-slider-gap, var(--xh-stack-gap-md));
|
|
350
339
|
}
|
|
351
340
|
|
|
352
|
-
[data-scope='color-picker'][data-part='
|
|
353
|
-
|
|
341
|
+
[data-scope='color-picker'][data-part='alpha-slider'] {
|
|
342
|
+
gap: var(--xh-color-picker-alpha-slider-gap, var(--xh-stack-gap-md));
|
|
354
343
|
}
|
|
355
344
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/* 色相轨道是一条固定的彩虹:色相的六个锚点,与颜色主题无关,因此不走令牌。
|
|
363
|
-
透明度轨道的渐变归连接层(它要用到当前颜色),这里不碰。 */
|
|
364
|
-
[data-scope='color-picker'][data-part='channel-slider-track'][data-channel='hue'] {
|
|
365
|
-
background-image: linear-gradient(
|
|
366
|
-
to right,
|
|
367
|
-
hsl(0deg 100% 50%),
|
|
368
|
-
hsl(60deg 100% 50%),
|
|
369
|
-
hsl(120deg 100% 50%),
|
|
370
|
-
hsl(180deg 100% 50%),
|
|
371
|
-
hsl(240deg 100% 50%),
|
|
372
|
-
hsl(300deg 100% 50%),
|
|
373
|
-
hsl(360deg 100% 50%)
|
|
374
|
-
);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
[data-scope='color-picker'][data-part='channel-slider-track'][data-channel='hue']:dir(rtl) {
|
|
378
|
-
background-image: linear-gradient(
|
|
379
|
-
to left,
|
|
380
|
-
hsl(0deg 100% 50%),
|
|
381
|
-
hsl(60deg 100% 50%),
|
|
382
|
-
hsl(120deg 100% 50%),
|
|
383
|
-
hsl(180deg 100% 50%),
|
|
384
|
-
hsl(240deg 100% 50%),
|
|
385
|
-
hsl(300deg 100% 50%),
|
|
386
|
-
hsl(360deg 100% 50%)
|
|
387
|
-
);
|
|
345
|
+
/* 禁用的整体压暗只做一次,落在最外层;alpha 关掉时透明度那条整条压暗 */
|
|
346
|
+
[data-scope='color-picker'][data-part='hue-slider'][data-disabled],
|
|
347
|
+
[data-scope='color-picker'][data-part='alpha-slider'][data-disabled] {
|
|
348
|
+
opacity: var(--xh-state-disabled-opacity);
|
|
388
349
|
}
|
|
389
350
|
|
|
390
351
|
[data-scope='color-picker'][data-part='channel-input'] {
|
|
@@ -394,7 +355,7 @@
|
|
|
394
355
|
padding-inline: var(--xh-color-picker-input-px, var(--xh-control-px-sm));
|
|
395
356
|
border: var(--xh-stroke-thin) solid var(--xh-color-picker-input-border, var(--xh-border-control));
|
|
396
357
|
border-radius: var(--xh-color-picker-input-radius, var(--xh-shape-control));
|
|
397
|
-
background: var(--xh-color-picker-input-bg,
|
|
358
|
+
background: var(--xh-color-picker-input-bg, transparent);
|
|
398
359
|
color: inherit;
|
|
399
360
|
/* 表单控件不继承页面字体,只给字号会让输入框用 UA 默认字族,与周围文本对不上 */
|
|
400
361
|
font-family: inherit;
|
|
@@ -405,8 +366,7 @@
|
|
|
405
366
|
[data-scope='color-picker'][data-part='channel-input']:focus-visible {
|
|
406
367
|
border-color: var(--xh-color-picker-input-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
|
|
407
368
|
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
408
|
-
|
|
409
|
-
outline-offset: calc(-1 * var(--xh-stroke-thin));
|
|
369
|
+
outline-offset: var(--xh-ring-offset);
|
|
410
370
|
}
|
|
411
371
|
|
|
412
372
|
/* 打到一半的串:框里留着草稿,但值没动——描边提示"这串还没被收下" */
|
|
@@ -421,7 +381,6 @@
|
|
|
421
381
|
[data-scope='color-picker'][data-part='channel-input']:disabled {
|
|
422
382
|
background: var(--xh-color-picker-input-bg-disabled, var(--xh-bg-subtle));
|
|
423
383
|
color: var(--xh-fg-disabled);
|
|
424
|
-
cursor: not-allowed;
|
|
425
384
|
}
|
|
426
385
|
|
|
427
386
|
[data-scope='color-picker'][data-part='eye-dropper-trigger'] {
|
|
@@ -441,6 +400,10 @@
|
|
|
441
400
|
line-height: var(--xh-leading-none);
|
|
442
401
|
cursor: pointer;
|
|
443
402
|
user-select: none;
|
|
403
|
+
transition:
|
|
404
|
+
background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
405
|
+
border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
406
|
+
scale var(--xh-motion-duration-release) var(--xh-motion-ease-release);
|
|
444
407
|
}
|
|
445
408
|
|
|
446
409
|
[data-scope='color-picker'][data-part='eye-dropper-trigger']:hover:not(:disabled) {
|
|
@@ -448,9 +411,14 @@
|
|
|
448
411
|
color: var(--xh-color-picker-action-fg-hover, var(--xh-fg-default));
|
|
449
412
|
}
|
|
450
413
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
414
|
+
/* 按下去要有回应:换底之外再压一档。取色是一次「点下去就交给系统」的操作,
|
|
415
|
+
松手那一刻浮层多半已经被系统的取色镜头盖住,按下的回执只有这一瞬看得见。
|
|
416
|
+
指针 :active 与 Headless 投影的 data-pressed(Space / Enter 与触屏按住)看见同一副按压面 */
|
|
417
|
+
[data-scope='color-picker'][data-part='eye-dropper-trigger']:not(:disabled):is(:active, [data-pressed]) {
|
|
418
|
+
background: var(--xh-color-picker-action-bg-active, var(--xh-bg-subtle-active));
|
|
419
|
+
scale: var(--xh-motion-scale-press);
|
|
420
|
+
transition-duration: var(--xh-motion-duration-press);
|
|
421
|
+
transition-timing-function: var(--xh-motion-ease-press);
|
|
454
422
|
}
|
|
455
423
|
|
|
456
424
|
/* 取色途中按钮保持按下的样子:屏幕取色期间浮层多半被系统的取色镜头盖着,
|
|
@@ -462,54 +430,41 @@
|
|
|
462
430
|
|
|
463
431
|
[data-scope='color-picker'][data-part='eye-dropper-trigger']:disabled {
|
|
464
432
|
color: var(--xh-fg-disabled);
|
|
465
|
-
cursor: not-allowed;
|
|
466
433
|
}
|
|
467
434
|
|
|
468
|
-
|
|
435
|
+
/* 预设色板的挂载点,同时充当色板的根节点:color-swatch-picker 那份皮的 root 规则落在
|
|
436
|
+
[data-scope='color-swatch-picker'][data-part='root'] 上,而这里没有那个节点,所以根上挂的那几个私有槽
|
|
437
|
+
(格子边长、间距、徽标尺寸、语气色、图标尺)与排布得在这儿照抄一遍;格子的皮仍归色板那一份。
|
|
438
|
+
浮层里的色板走小号格子:与滑块的拇指、数值框一个量级,整块面板才不会被色板撑开 */
|
|
439
|
+
[data-scope='color-picker'][data-part='swatch-picker'] {
|
|
440
|
+
--xh-_color-swatch-picker-cell: var(--xh-color-picker-swatch-cell, var(--xh-control-h-sm));
|
|
441
|
+
--xh-_color-swatch-picker-gap: var(--xh-color-picker-swatch-gap, var(--xh-control-gap-sm));
|
|
442
|
+
--xh-_color-swatch-picker-indicator: var(--xh-control-indicator-sm);
|
|
443
|
+
--xh-_color-swatch-picker-mark: calc(var(--xh-_color-swatch-picker-indicator) - var(--xh-space-1));
|
|
444
|
+
--xh-_color-swatch-picker-accent: var(--xh-_tone, var(--xh-bg-brand));
|
|
445
|
+
--xh-icon-size: var(--xh-color-picker-swatch-icon-size, var(--xh-_color-swatch-picker-mark));
|
|
446
|
+
|
|
469
447
|
display: flex;
|
|
470
448
|
flex-wrap: wrap;
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
/* 每格都是原生按钮、各占一个 Tab 位;背景由连接层内联给 */
|
|
475
|
-
[data-scope='color-picker'][data-part='swatch-item'] {
|
|
476
|
-
inline-size: var(--xh-color-picker-swatch-item-size, 1.25rem);
|
|
477
|
-
block-size: var(--xh-color-picker-swatch-item-size, 1.25rem);
|
|
478
|
-
padding: 0;
|
|
479
|
-
border: var(--xh-stroke-thin) solid var(--xh-color-picker-swatch-border, var(--xh-border-default));
|
|
480
|
-
border-radius: var(--xh-color-picker-swatch-radius, var(--xh-shape-inset));
|
|
481
|
-
cursor: pointer;
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
/* 正被选中的那一格:环画在盒子外面,不挤占色块本身的面积 */
|
|
485
|
-
[data-scope='color-picker'][data-part='swatch-item'][data-state='checked'] {
|
|
486
|
-
outline: var(--xh-ring-width) solid var(--xh-color-picker-swatch-ring, var(--xh-bg-brand));
|
|
487
|
-
outline-offset: var(--xh-ring-offset);
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
[data-scope='color-picker'][data-part='swatch-item']:focus-visible {
|
|
491
|
-
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
492
|
-
outline-offset: var(--xh-ring-offset);
|
|
449
|
+
align-items: center;
|
|
450
|
+
gap: var(--xh-color-picker-swatch-picker-gap, var(--xh-_color-swatch-picker-gap));
|
|
493
451
|
}
|
|
494
452
|
|
|
495
|
-
[data-scope='color-picker'][data-part='swatch-
|
|
453
|
+
[data-scope='color-picker'][data-part='swatch-picker'][data-disabled] {
|
|
496
454
|
cursor: not-allowed;
|
|
497
|
-
opacity: var(--xh-state-disabled-opacity);
|
|
498
455
|
}
|
|
499
456
|
|
|
500
457
|
/* 任何 display 都会盖掉 UA 的 [hidden]{display:none}:
|
|
501
458
|
凡是被赋了 display 的角色节点都要显式让位,漏一处收起态就失效。
|
|
502
|
-
|
|
459
|
+
content 的收起交给 presence:退场结束后由适配器写内联 display:none,避免截断动画。 */
|
|
503
460
|
[data-scope='color-picker'][data-part='root'][hidden],
|
|
504
461
|
[data-scope='color-picker'][data-part='trigger'][hidden],
|
|
505
|
-
[data-scope='color-picker'][data-part='
|
|
506
|
-
[data-scope='color-picker'][data-part='content'][hidden],
|
|
507
|
-
[data-scope='color-picker'][data-part='area'][hidden],
|
|
462
|
+
[data-scope='color-picker'][data-part='saturation-area'][hidden],
|
|
508
463
|
[data-scope='color-picker'][data-part='area-thumb'][hidden],
|
|
509
|
-
[data-scope='color-picker'][data-part='
|
|
510
|
-
[data-scope='color-picker'][data-part='
|
|
464
|
+
[data-scope='color-picker'][data-part='hue-slider'][hidden],
|
|
465
|
+
[data-scope='color-picker'][data-part='alpha-slider'][hidden],
|
|
511
466
|
[data-scope='color-picker'][data-part='eye-dropper-trigger'][hidden],
|
|
512
|
-
[data-scope='color-picker'][data-part='swatch-
|
|
467
|
+
[data-scope='color-picker'][data-part='swatch-picker'][hidden] {
|
|
513
468
|
display: none;
|
|
514
469
|
}
|
|
515
470
|
|
|
@@ -528,4 +483,35 @@
|
|
|
528
483
|
white-space: nowrap;
|
|
529
484
|
pointer-events: none;
|
|
530
485
|
}
|
|
486
|
+
|
|
487
|
+
@media print {
|
|
488
|
+
/* 打印:定位层与遮罩是交互期才存在的东西,落到纸上只会盖住底下的正文。
|
|
489
|
+
收起写在这份皮肤里而不是 reset:reset 层排在组件层之前,组件层里任何一条 display 都压得住它。 */
|
|
490
|
+
[data-scope='color-picker'][data-part='positioner'] {
|
|
491
|
+
display: none;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/*
|
|
496
|
+
* 高对比档:取色面画的就是颜色本身,被系统换掉之后整个组件不再能取色。这一处退出强制着色,
|
|
497
|
+
* 自己保住原色;退出之后它不再跟着系统底色走,补一圈系统描边把它从背景里框出来。
|
|
498
|
+
* 触发钮里的色块归 Swatch 家族、两条滑块的轨道与色板的格子归各自那份皮,都已各自退出强制着色。
|
|
499
|
+
*/
|
|
500
|
+
@media (forced-colors: active) {
|
|
501
|
+
/* 高对比档里底色被系统换掉,取色按钮按下那一档用系统高亮反色画回 */
|
|
502
|
+
[data-scope='color-picker'][data-part='eye-dropper-trigger']:not(:disabled):is(:active, [data-pressed]) {
|
|
503
|
+
background: Highlight;
|
|
504
|
+
color: HighlightText;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
[data-scope='color-picker'][data-part='saturation-area'],
|
|
508
|
+
[data-scope='color-picker'][data-part='saturation-area']::before {
|
|
509
|
+
forced-color-adjust: none;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
[data-scope='color-picker'][data-part='saturation-area'] {
|
|
513
|
+
outline: var(--xh-stroke-thin) solid ButtonBorder;
|
|
514
|
+
outline-offset: calc(-1 * var(--xh-stroke-thin));
|
|
515
|
+
}
|
|
516
|
+
}
|
|
531
517
|
}
|