@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.
Files changed (156) hide show
  1. package/CHANGELOG.md +1328 -0
  2. package/README.md +6 -1
  3. package/component-tokens.d.ts +505 -111
  4. package/components.tokens.json +34750 -26291
  5. package/css/accordion.css +39 -13
  6. package/css/alert.css +61 -3
  7. package/css/anchor.css +49 -11
  8. package/css/approval.css +124 -84
  9. package/css/avatar-group.css +1 -1
  10. package/css/avatar.css +13 -5
  11. package/css/back-top.css +63 -44
  12. package/css/badge.css +63 -13
  13. package/css/bar-code.css +1 -1
  14. package/css/breadcrumb.css +63 -4
  15. package/css/button-group.css +5 -5
  16. package/css/button.css +69 -21
  17. package/css/calendar-picker.css +27 -8
  18. package/css/calendar-range-picker.css +48 -11
  19. package/css/card.css +116 -2
  20. package/css/carousel.css +153 -48
  21. package/css/cartesian-chart.css +830 -0
  22. package/css/cascader.css +184 -70
  23. package/css/checkbox-group.css +69 -99
  24. package/css/checkbox.css +21 -54
  25. package/css/citation.css +470 -0
  26. package/css/clipboard.css +23 -66
  27. package/css/code-view.css +103 -8
  28. package/css/collapsible.css +37 -11
  29. package/css/color-field.css +18 -0
  30. package/css/color-picker.css +57 -62
  31. package/css/color-slider.css +26 -19
  32. package/css/color-swatch-picker.css +8 -6
  33. package/css/combobox.css +82 -37
  34. package/css/command.css +48 -48
  35. package/css/context-menu.css +43 -28
  36. package/css/date-field.css +23 -0
  37. package/css/date-picker.css +57 -24
  38. package/css/date-range-picker.css +301 -14
  39. package/css/description.css +17 -1
  40. package/css/descriptions.css +43 -1
  41. package/css/dialog.css +99 -43
  42. package/css/diff-view.css +101 -16
  43. package/css/download-trigger.css +46 -80
  44. package/css/drawer.css +168 -133
  45. package/css/editable.css +19 -0
  46. package/css/empty-state.css +8 -7
  47. package/css/field-array.css +36 -0
  48. package/css/field.css +17 -19
  49. package/css/fieldset.css +1 -1
  50. package/css/file-upload.css +126 -136
  51. package/css/flex.css +324 -8
  52. package/css/float-button.css +168 -41
  53. package/css/floating-panel.css +59 -27
  54. package/css/form.css +26 -20
  55. package/css/funnel-chart.css +106 -0
  56. package/css/graph-chart.css +205 -0
  57. package/css/grid-list.css +235 -0
  58. package/css/grid.css +252 -1
  59. package/css/heatmap.css +119 -36
  60. package/css/hierarchy-chart.css +298 -0
  61. package/css/hover-card.css +33 -18
  62. package/css/icon.css +100 -0
  63. package/css/image-cropper.css +34 -8
  64. package/css/image-viewer.css +169 -26
  65. package/css/image.css +23 -4
  66. package/css/infinite-scroll.css +2 -2
  67. package/css/input-group.css +13 -15
  68. package/css/json-viewer.css +55 -7
  69. package/css/kbd.css +1 -1
  70. package/css/layout.css +71 -21
  71. package/css/liquid.css +106 -0
  72. package/css/list.css +2 -2
  73. package/css/listbox.css +72 -23
  74. package/css/loading-bar.css +27 -13
  75. package/css/log.css +131 -35
  76. package/css/markdown-stream.css +1 -1
  77. package/css/marquee.css +163 -7
  78. package/css/matrix-code.css +1 -1
  79. package/css/mention.css +35 -21
  80. package/css/menu.css +40 -28
  81. package/css/menubar.css +42 -28
  82. package/css/message-feed.css +174 -53
  83. package/css/navigation-menu.css +177 -18
  84. package/css/notification.css +431 -110
  85. package/css/number-field.css +22 -0
  86. package/css/page-header.css +4 -2
  87. package/css/pagination.css +129 -29
  88. package/css/password-input.css +40 -8
  89. package/css/pie-chart.css +247 -0
  90. package/css/popconfirm.css +50 -58
  91. package/css/popover.css +55 -21
  92. package/css/progress.css +308 -10
  93. package/css/prompt-input.css +37 -1
  94. package/css/question-flow.css +104 -64
  95. package/css/radar-chart.css +233 -0
  96. package/css/radio-group.css +372 -14
  97. package/css/rating.css +25 -27
  98. package/css/reasoning.css +62 -55
  99. package/css/reset.css +1 -1
  100. package/css/resizable.css +6 -1
  101. package/css/sankey-chart.css +174 -0
  102. package/css/scroll-area.css +32 -0
  103. package/css/scrollbar.css +1 -1
  104. package/css/select.css +76 -59
  105. package/css/side-nav.css +177 -30
  106. package/css/signature-pad.css +23 -8
  107. package/css/skeleton.css +13 -14
  108. package/css/slider.css +39 -17
  109. package/css/sortable.css +38 -8
  110. package/css/sparkline.css +164 -0
  111. package/css/spinner.css +50 -22
  112. package/css/splitter.css +8 -2
  113. package/css/statistic.css +10 -0
  114. package/css/steps.css +257 -38
  115. package/css/switch.css +30 -55
  116. package/css/table.css +168 -128
  117. package/css/tabs.css +243 -31
  118. package/css/tag-group.css +65 -37
  119. package/css/tag.css +55 -14
  120. package/css/tags-input.css +40 -3
  121. package/css/text-field.css +19 -0
  122. package/css/time-field.css +20 -1
  123. package/css/time-picker.css +44 -17
  124. package/css/time-range-picker.css +45 -18
  125. package/css/timeline.css +1 -1
  126. package/css/toggle-group.css +8 -8
  127. package/css/toggle.css +6 -5
  128. package/css/tool-call.css +64 -56
  129. package/css/toolbar.css +105 -7
  130. package/css/tooltip.css +18 -7
  131. package/css/tour.css +49 -21
  132. package/css/transfer.css +104 -81
  133. package/css/tree-select.css +235 -58
  134. package/css/tree.css +240 -147
  135. package/css/truncate.css +55 -12
  136. package/css/typography.css +93 -0
  137. package/css/virtualizer.css +57 -1
  138. package/css/watermark.css +23 -0
  139. package/family/action-control.css +14 -5
  140. package/family/chart.css +480 -0
  141. package/family/check-mark.css +94 -0
  142. package/family/choice-card.css +97 -0
  143. package/family/collection-item.css +70 -27
  144. package/family/field-chrome.css +1 -12
  145. package/family/loading-ring.css +95 -0
  146. package/family/material.css +72 -0
  147. package/family/menu-choice.css +56 -0
  148. package/family/motion.css +208 -11
  149. package/family/tag-list.css +59 -0
  150. package/index.css +23363 -14091
  151. package/index.unlayered.css +23198 -13922
  152. package/package.json +20 -8
  153. package/css/gradient-text.css +0 -91
  154. package/css/icon-wrapper.css +0 -81
  155. package/css/segmented.css +0 -280
  156. 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 底 + 无影(§5.3 边界只由描边承担),
17
+ /* 一张静态内容面:--xh-border-default 描边 + surface 底 + 无影(边界只由描边承担),
18
18
  overflow: hidden 让内部 <pre> 的滚动内容沿圆角收边;不设 display,排布由作者决定。
19
- color 给整段未着色的代码定基线,字号在这里消费一次,缺省即 sm 档。 */
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-sm);
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-brand-subtle));
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-bg-brand));
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-default));
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,按下只换面不缩放,§9.2);这里只把使用者槽映射到
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
  }
@@ -19,7 +19,7 @@
19
19
  /* 根容器自己不排版,这条只声明尺寸档的私有槽:正文与标题行从 root 继承它们,
20
20
  换档不必给部件各写一条选择器;触发器的三档几何由家族 disclosure-trigger 档给 */
21
21
  [data-scope='collapsible'][data-part='root'] {
22
- /* 作者塞进正文里的图标与皮肤画的兜底字形同一把尺:md 档(§6.5),触发器上另按家族档取值 */
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;按下只换面不缩放,§9.2);
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
- 悬停 / 按下的面与收起态同档(§7.3 open 与家族 hover 同档中性) */
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
- /* 指示器与正文同档转向(§9.4):正文 enter 档展开,箭头也用同一段时长翻过去 */
105
- transition: rotate var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
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
- /* 展开那一档才提前备好行高这条通道:属性随 data-state 一起消失,收起后不长期占着 */
142
- [data-scope='collapsible'][data-part='content'][data-state='open'] {
143
- will-change: grid-template-rows;
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-exit) var(--xh-motion-ease-exit) forwards;
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
 
@@ -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
  }
@@ -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
- font-size: var(--xh-color-picker-label-font-size, var(--xh-_color-picker-label-font-size));
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
- display: inline-flex;
73
- align-items: center;
74
- gap: var(--xh-color-picker-control-gap, var(--xh-_color-picker-gap));
75
- min-inline-size: min(var(--xh-color-picker-control-min-w, var(--xh-control-min-w)), 100%);
76
- block-size: var(--xh-color-picker-control-h, var(--xh-_color-picker-h));
77
- padding-inline: var(--xh-color-picker-control-px, var(--xh-_color-picker-px));
78
- border: var(--xh-stroke-thin) solid var(--xh-color-picker-control-border, var(--xh-border-control));
79
- border-radius: var(--xh-color-picker-control-radius, var(--xh-shape-control));
80
- background: var(--xh-color-picker-control-bg, transparent);
81
- box-shadow: var(--xh-color-picker-control-shadow, var(--xh-elevation-raised));
82
- color: var(--xh-color-picker-control-fg, var(--xh-fg-default));
83
- cursor: pointer;
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);
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
- /* 浮层滚动面:滚到头不把页面一起带走(§6.6) */
196
+ /* 浮层滚动面:滚到头不把页面一起带走 */
221
197
  overscroll-behavior: contain;
222
- /* 面域 + 滑杆 + 通道输入的表单型多列面板,走 floating 材质(§8.4)——实体底 + --xh-border-default 描边 +
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
- /* 在场那一档才提前备好合成层:属性随 data-state 一起消失,收起后不长期占着 */
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-micro) var(--xh-motion-ease-enter-strong);
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
- border-color: var(--xh-color-picker-input-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
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
- background: var(--xh-color-picker-action-bg-hover, var(--xh-bg-subtle-hover));
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-active));
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
- [data-scope='color-picker'][data-part='swatch-picker'] {
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
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  display: flex;
25
25
  flex-direction: column;
26
- /* 字段标签贴控件(§6.4 复合单字段) */
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
- /* 禁用不整体压暗(§7.2 第 9 条):标签是文字,换到禁用前景;颜色带与拇指画的是颜色本身,换不得色,
36
+ /* 禁用不整体压暗:标签是文字,换到禁用前景;颜色带与拇指画的是颜色本身,换不得色,
37
37
  压暗只做一次、落在 control 上(track / thumb 各自再叠一层 opacity 会越叠越黑),拇指另收掉抬升 */
38
38
 
39
- /* 字段标签:14 / 500 / fg-default(§6.4),禁用换到 --xh-fg-subtle */
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 面(§8):
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
- border: var(--xh-stroke-thick) solid var(--xh-color-slider-thumb-border, var(--xh-border-default));
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-micro) var(--xh-motion-ease-enter-strong),
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
- scale: var(--xh-color-slider-thumb-scale-dragging, var(--xh-motion-scale-drag));
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
- margin-inline: auto;
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: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
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
  * 轨道与拇指退出强制着色保住原色,各补一圈系统描边把它们从背景里框出来。