@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/truncate.css CHANGED
@@ -42,24 +42,67 @@
42
42
  white-space: normal;
43
43
  }
44
44
 
45
- /* 真被裁了才是那颗按钮:装得下的短文本按下去什么都不变,摆出手型等于许一个按不动的按钮。
46
- 铺开态另收一条——那一档量不出"被裁",但收回去的入口必须留着 */
47
- [data-scope='truncate'][data-part='root'][data-expandable][data-overflowing],
48
- [data-scope='truncate'][data-part='root'][data-expandable][data-state='open'] {
49
- cursor: pointer;
50
- transition: color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
45
+ /* —— 中间省略 —— */
46
+ /* 盒子里的原文照旧排着、只是不上色:溢出照它量,读屏照它念,选中与复制拿到的也是整段。
47
+ 看得见的两段由两个伪元素画:前一半从头排、末尾收省略号,后一半从尾排、开头直接截断,
48
+ 两段各占一半宽度,拼起来就是省略号落在中间的那一版 */
49
+ [data-scope='truncate'][data-part='root'][data-middle-text] {
50
+ position: relative;
51
+ text-overflow: clip;
52
+ -webkit-text-fill-color: transparent;
51
53
  }
52
54
 
53
- /* 是按钮的那一档才提亮:指针停在上面时这段文字与正文分开,
54
- 按不动的短文本不给这个反馈 */
55
- [data-scope='truncate'][data-part='root'][data-expandable][data-overflowing]:hover,
56
- [data-scope='truncate'][data-part='root'][data-expandable][data-state='open']:hover {
57
- color: var(--xh-fg-default);
55
+ [data-scope='truncate'][data-part='root'][data-middle-text]::before,
56
+ [data-scope='truncate'][data-part='root'][data-middle-text]::after {
57
+ position: absolute;
58
+ inset-block: 0;
59
+ inline-size: 50%;
60
+ overflow: hidden;
61
+ white-space: nowrap;
62
+ -webkit-text-fill-color: currentColor;
63
+ pointer-events: none;
64
+ }
65
+
66
+ /* 替代文字给空串:这两段只是画出来的样子,读屏念的是盒子里的原文 */
67
+ [data-scope='truncate'][data-part='root'][data-middle-text]::before {
68
+ content: attr(data-middle-text) / '';
69
+ inset-inline-start: 0;
70
+ text-overflow: ellipsis;
71
+ }
72
+
73
+ /* 后一半的盒子贴在末尾侧,文字照正文的方向排:弹性容器按末端对齐,放不下的部分从起始侧溢出,
74
+ 露出来的正是原文的结尾。不翻方向,也就不用分书写方向各写一版 */
75
+ [data-scope='truncate'][data-part='root'][data-middle-text]::after {
76
+ content: attr(data-middle-text) / '';
77
+ inset-inline-end: 0;
78
+ display: flex;
79
+ justify-content: flex-end;
80
+ }
81
+
82
+ /* —— 展开按钮 —— */
83
+ /* 盒型、悬停与按下面由 Action Control 的文字档给(ghost、sm);排在文字盒子之后另起一行,
84
+ 起始端对齐正文,不被外层的弹性布局拉宽 */
85
+ [data-scope='truncate'][data-part='trigger'] {
86
+ flex: none;
87
+ }
88
+
89
+ @media (forced-colors: active) {
90
+ /* 这一档不保证文字填色照写的走:退回末尾省略,原文按系统色直接显示 */
91
+ [data-scope='truncate'][data-part='root'][data-middle-text] {
92
+ text-overflow: ellipsis;
93
+ -webkit-text-fill-color: currentColor;
94
+ }
95
+
96
+ [data-scope='truncate'][data-part='root'][data-middle-text]::before,
97
+ [data-scope='truncate'][data-part='root'][data-middle-text]::after {
98
+ content: none;
99
+ }
58
100
  }
59
101
 
60
102
  /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
61
103
  写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
62
- [data-scope='truncate'][data-part='root'][hidden] {
104
+ [data-scope='truncate'][data-part='root'][hidden],
105
+ [data-scope='truncate'][data-part='trigger'][hidden] {
63
106
  display: none;
64
107
  }
65
108
  }
@@ -6,6 +6,17 @@
6
6
  /* 定义 typography 样式。 */
7
7
 
8
8
  @layer xihan.components {
9
+ /* 渐变字的前景:缺省透明,透出裁进字形的渐变;高对比作用域里换成实色,盖住渐变。
10
+ 轴边界上只路由这一个简单值,渐变本身仍在文字上按本地的两端颜色与走向求值,
11
+ 内层 default / more 能双向重置,也不会把未解析的组件变量冻结在祖先上。 */
12
+ :where(:root, [data-contrast='default']) {
13
+ --xh-_typography-gradient-fg: transparent;
14
+ }
15
+
16
+ :where([data-contrast='more']) {
17
+ --xh-_typography-gradient-fg: var(--xh-fg-default);
18
+ }
19
+
9
20
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
21
  [data-scope='typography'] {
11
22
  --xh-typography-skin: 1;
@@ -183,6 +194,37 @@
183
194
  color: var(--xh-typography-text-fg-tone, var(--xh-_tone-fg));
184
195
  }
185
196
 
197
+ /* 删除线与下划线是同一条装饰线的两个取值,两个开关都开时两条都画 */
198
+ [data-scope='typography'][data-part='text'][data-strikethrough] {
199
+ text-decoration-line: line-through;
200
+ }
201
+
202
+ [data-scope='typography'][data-part='text'][data-underline] {
203
+ text-decoration-line: underline;
204
+ text-underline-offset: var(--xh-typography-text-underline-offset, var(--xh-space-0_5));
205
+ }
206
+
207
+ [data-scope='typography'][data-part='text'][data-underline][data-strikethrough] {
208
+ text-decoration-line: underline line-through;
209
+ }
210
+
211
+ /* 标记:与文本高亮的命中片段同一副淡底、字色与收边,两处被标出的文字看起来是一回事。
212
+ 排在语气之后:同时写语气时底与字色一起换成该族,只写语气不写标记仍只换字色。
213
+ 跨行时两半各自收边,否则圆角与内边距只画在整段的首尾;两条都写:WebKit 只认带前缀那条 */
214
+ [data-scope='typography'][data-part='text'][data-marked] {
215
+ padding-inline: var(--xh-typography-mark-px, var(--xh-space-0_5));
216
+ border-radius: var(--xh-typography-mark-radius, var(--xh-shape-inset));
217
+ background: var(--xh-typography-mark-bg, var(--xh-bg-brand-subtle));
218
+ color: var(--xh-typography-mark-fg, var(--xh-fg-brand-strong));
219
+ -webkit-box-decoration-break: clone;
220
+ box-decoration-break: clone;
221
+ }
222
+
223
+ [data-scope='typography'][data-part='text'][data-marked][data-tone] {
224
+ background: var(--xh-typography-mark-bg, var(--xh-_tone-subtle));
225
+ color: var(--xh-typography-mark-fg, var(--xh-_tone-fg));
226
+ }
227
+
186
228
  /* 字重排在形态之后:与 strong 一起写时,粗到哪一档由字重说了算 */
187
229
  [data-scope='typography'][data-part='text'][data-weight='regular'] {
188
230
  font-weight: var(--xh-font-weight-regular);
@@ -200,6 +242,42 @@
200
242
  font-weight: var(--xh-font-weight-bold);
201
243
  }
202
244
 
245
+ /* —— 渐变字 —— */
246
+ /* 渐变画在背景上,再用 background-clip 把背景裁进字形里;前景必须透明才透得出底下的渐变。
247
+ 两条 background-clip 都写:WebKit 只认带前缀那条。
248
+ -webkit-text-fill-color 在 WebKit 里决定字形填充色并盖过 color,跟着 color 走。
249
+ 排在语气之后:语气写的是前景色,渐变字的前景要留给上面那支透明槽 */
250
+ [data-scope='typography'][data-part='text'][data-variant='gradient'] {
251
+ /* 两端颜色各收一个私有槽:语气档换的是这两支,使用者槽仍排在它们前面 */
252
+ --xh-_typography-gradient-from: var(--xh-gradient-brand-from);
253
+ --xh-_typography-gradient-to: var(--xh-gradient-brand-to);
254
+
255
+ background-image: linear-gradient(
256
+ var(--xh-typography-gradient-direction, to right),
257
+ var(--xh-typography-gradient-from, var(--xh-_typography-gradient-from)),
258
+ var(--xh-typography-gradient-to, var(--xh-_typography-gradient-to))
259
+ );
260
+ -webkit-background-clip: text;
261
+ background-clip: text;
262
+ color: var(--xh-_typography-gradient-fg);
263
+ -webkit-text-fill-color: currentColor;
264
+ }
265
+
266
+ /* 语气换的是两端颜色:取该族主色与它压深一档的取值,深浅两态自动跟随 */
267
+ [data-scope='typography'][data-part='text'][data-variant='gradient'][data-tone] {
268
+ --xh-_typography-gradient-from: var(--xh-_tone);
269
+ --xh-_typography-gradient-to: var(--xh-_tone-active);
270
+ }
271
+
272
+ /* 无 JS 时的系统高对比、强制色与打印统一退回单色;显式局部轴由文件头那支前景槽负责 */
273
+ @media (prefers-contrast: more), (forced-colors: active), print {
274
+ [data-scope='typography'][data-part='text'][data-variant='gradient'] {
275
+ background-image: none;
276
+ color: inherit;
277
+ -webkit-text-fill-color: currentColor;
278
+ }
279
+ }
280
+
203
281
  /* —— 行内链接 —— */
204
282
  [data-scope='typography'][data-part='link'] {
205
283
  border-radius: var(--xh-typography-link-radius, var(--xh-shape-inset));
@@ -376,4 +454,19 @@
376
454
  [data-scope='typography'][data-part='prose'] :where(th) {
377
455
  font-weight: var(--xh-typography-prose-th-font-weight, var(--xh-font-weight-semibold));
378
456
  }
457
+
458
+ @media (forced-colors: active) {
459
+ /* 这一档里自定义底色一律被换成 Canvas,标记会与正文分不开;用系统高亮反色把那一段画回来 */
460
+ [data-scope='typography'][data-part='text'][data-marked] {
461
+ background: Highlight;
462
+ color: HighlightText;
463
+ }
464
+ }
465
+
466
+ @media print {
467
+ /* 打印默认丢底色,标记只剩字色,被标出的那段在纸上就不显眼了 */
468
+ [data-scope='typography'][data-part='text'][data-marked] {
469
+ print-color-adjust: exact;
470
+ }
471
+ }
379
472
  }
@@ -42,7 +42,7 @@
42
42
  overflow-x: auto;
43
43
  overflow-y: auto;
44
44
  /* 页内结构容器,滚到尽头把剩余的滚动交给外层(overscroll-behavior 保持 auto):
45
- contain 只给浮层、模态 body 与粘底视口(§6.6)。滚动条走 reset 层的原生细条 */
45
+ contain 只给浮层、模态 body 与粘底视口。滚动条走 reset 层的原生细条 */
46
46
  }
47
47
 
48
48
  /* 单向列表把另一条轴关掉:那一向既没有内容也没有位移,能滚就成了滚不回来的暗格 */
@@ -54,6 +54,33 @@
54
54
  overflow-y: hidden;
55
55
  }
56
56
 
57
+ /* 随整页滚动:这层不再是滚动容器,高度随内容撑开,两向都不裁 */
58
+ [data-scope='virtualizer'][data-part='viewport'][data-scroll-container='window'] {
59
+ block-size: auto;
60
+ overflow-x: visible;
61
+ overflow-y: visible;
62
+ }
63
+
64
+ /* 贴底:不足一屏时把内容推到尽头那一侧,最新的一条贴着底;超过一屏时自动外距归零,照常滚动 */
65
+ [data-scope='virtualizer'][data-part='viewport'][data-anchor='end'] {
66
+ display: flex;
67
+ flex-direction: column;
68
+ }
69
+
70
+ [data-scope='virtualizer'][data-part='viewport'][data-anchor='end'][data-orientation='horizontal'] {
71
+ flex-direction: row;
72
+ }
73
+
74
+ [data-scope='virtualizer'][data-part='viewport'][data-anchor='end'] > [data-scope='virtualizer'][data-part='content'] {
75
+ flex-shrink: 0;
76
+ margin-block-start: auto;
77
+ }
78
+
79
+ [data-scope='virtualizer'][data-part='viewport'][data-anchor='end'][data-orientation='horizontal'] > [data-scope='virtualizer'][data-part='content'] {
80
+ margin-block-start: 0;
81
+ margin-inline-start: auto;
82
+ }
83
+
57
84
  /* 撑出总长的那层,同时是条目的定位上下文——条目是绝对定位的,
58
85
  没有它就会以最近的定位祖先(多半是页面某处)为参照,整列飘走。 */
59
86
  [data-scope='virtualizer'][data-part='content'] {
@@ -86,6 +113,24 @@
86
113
  block-size: 100%;
87
114
  }
88
115
 
116
+ /* 钉住的分组标题:留在文档流里按 sticky 钉在视口起点(连接层不给它写主轴位移),
117
+ 压在滚过去的条目上面,所以要一块实底 */
118
+ [data-scope='virtualizer'][data-part='item'][data-fixed] {
119
+ position: sticky;
120
+ z-index: var(--xh-virtualizer-sticky-layer, var(--xh-layer-sticky));
121
+ background: var(--xh-virtualizer-sticky-bg, var(--xh-bg-surface));
122
+ }
123
+
124
+ [data-scope='virtualizer'][data-part='item'][data-fixed][data-orientation='vertical'] {
125
+ inset-block-start: 0;
126
+ }
127
+
128
+ /* 横向时留在文档流里的块会铺满整条内容层,收成自身宽度 */
129
+ [data-scope='virtualizer'][data-part='item'][data-fixed][data-orientation='horizontal'] {
130
+ inset-inline-start: 0;
131
+ inline-size: fit-content;
132
+ }
133
+
89
134
  /* 除视口外全是纯容器:既不进 Tab 序列也不承载焦点,作者若给它们加了 tabindex,
90
135
  该显形的也该是视口那圈环,不是这里再多画一圈。
91
136
  条目内部的可聚焦内容(按钮、链接)有它们自己的焦点环,不受这条影响。 */
@@ -99,6 +144,17 @@
99
144
  滚动期间关掉 pointer-events 之类的常见招数会让"滚一下就点"落空,
100
145
  留给作者按自己的取舍去接。 */
101
146
 
147
+ /* 高对比档里实底换成系统底色、与滚过去的条目同色:钉住的标题补一条系统描边,与下面的内容分开 */
148
+ @media (forced-colors: active) {
149
+ [data-scope='virtualizer'][data-part='item'][data-fixed][data-orientation='vertical'] {
150
+ border-block-end: var(--xh-stroke-thin) solid CanvasText;
151
+ }
152
+
153
+ [data-scope='virtualizer'][data-part='item'][data-fixed][data-orientation='horizontal'] {
154
+ border-inline-end: var(--xh-stroke-thin) solid CanvasText;
155
+ }
156
+ }
157
+
102
158
  /* display 会盖掉 UA 的 [hidden]{display:none},凡是被赋了 display 的角色节点都要显式让位。
103
159
  连接层只在条目上写 hidden(不在窗口里的那些),其余三个是防作者自己写 hidden */
104
160
  [data-scope='virtualizer'][data-part='root'][hidden],
package/css/watermark.css CHANGED
@@ -50,6 +50,29 @@
50
50
  mask-size: var(--xh-watermark-tile, auto);
51
51
  }
52
52
 
53
+ /* 全屏档:印子固定铺满整个视口,压在页面一切内容之上(对话框、轻提示、文字提示都在它下面),页面滚动时原地不动。
54
+ 根不再建层叠上下文:隔离了的话,印子的层号只在根里比大小,会被根外那些浮层压住 */
55
+ [data-scope='watermark'][data-part='root'][data-fullscreen] {
56
+ isolation: auto;
57
+ }
58
+
59
+ [data-scope='watermark'][data-part='root'][data-state='ready'][data-fullscreen]::after {
60
+ position: fixed;
61
+ z-index: var(--xh-watermark-layer, var(--xh-layer-tooltip));
62
+ }
63
+
64
+ /*
65
+ * 高对比档:印子的颜色是遮罩底下那块底色,这一档里被系统换成 Canvas,与页面同色,整层印子消失。
66
+ * 印子是防泄露的标记,不能因为读者开了高对比就不印:退出强制换色、取 GrayText——系统给「弱化内容」
67
+ * 留的那个角色,深浅仍由图样自带的透明度压着,不与正文抢对比
68
+ */
69
+ @media (forced-colors: active) {
70
+ [data-scope='watermark'][data-part='root'][data-state='ready']::after {
71
+ forced-color-adjust: none;
72
+ background-color: GrayText;
73
+ }
74
+ }
75
+
53
76
  /* 遮罩不支持时整层不画:只剩底色的话,盖上去的会是一整块实心色 */
54
77
  @supports not ((mask-image: none) or (-webkit-mask-image: none)) {
55
78
  [data-scope='watermark'][data-part='root'][data-state='ready']::after {
@@ -54,6 +54,7 @@
54
54
  transition:
55
55
  background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
56
56
  border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
57
+ color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
57
58
  box-shadow var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
58
59
  opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
59
60
  scale var(--xh-motion-duration-release) var(--xh-motion-ease-release);
@@ -116,7 +117,7 @@
116
117
  --xh-_action-variant-border-focus-visible: var(--xh-_tone-border-control, var(--xh-border-control));
117
118
  --xh-_action-variant-bg-disabled: transparent;
118
119
  --xh-_action-variant-fg-disabled: var(--xh-fg-disabled);
119
- --xh-_action-variant-border-disabled: var(--xh-border-subtle);
120
+ --xh-_action-variant-border-disabled: var(--xh-border-default);
120
121
  --xh-_action-variant-bg-loading: transparent;
121
122
  --xh-_action-variant-fg-loading: var(--xh-_tone-fg, var(--xh-fg-default));
122
123
  --xh-_action-variant-border-loading: var(--xh-_tone-border-control, var(--xh-border-control));
@@ -156,8 +157,16 @@
156
157
  --xh-_action-variant-fg-loading: var(--xh-action-on-brand-solid);
157
158
  }
158
159
 
160
+ [data-xh-action-control][data-xh-ink-surface] {
161
+ --xh-ink-surface: var(--xh-action-bg-rest, var(--xh-_action-variant-bg-rest));
162
+ }
163
+
164
+ [data-xh-action-control][data-xh-ink-surface][data-disabled] {
165
+ --xh-ink-surface: var(--xh-action-bg-disabled, var(--xh-bg-subtle-opaque));
166
+ }
167
+
159
168
  [data-xh-action-control][data-xh-action-size='xs'] {
160
- --xh-_action-profile-visual-size: 24px;
169
+ --xh-_action-profile-visual-size: var(--xh-control-action-size);
161
170
  --xh-_action-profile-padding-inline: var(--xh-space-1);
162
171
  --xh-_action-profile-padding-block: 0;
163
172
  --xh-_action-profile-gap: var(--xh-space-1);
@@ -216,13 +225,13 @@
216
225
  }
217
226
 
218
227
  [data-xh-action-control][data-xh-action-profile='field-inset'][data-xh-action-size='xs'] {
219
- --xh-_action-profile-glyph-size: 12px;
228
+ --xh-_action-profile-glyph-size: var(--xh-control-indicator-sm);
220
229
  --xh-_action-profile-font-size: var(--xh-control-caption-sm);
221
230
  }
222
231
 
223
232
  [data-xh-action-control][data-xh-action-profile='field-inset'][data-xh-action-size='sm'] {
224
- --xh-_action-profile-visual-size: 24px;
225
- --xh-_action-profile-glyph-size: 14px;
233
+ --xh-_action-profile-visual-size: var(--xh-control-action-size);
234
+ --xh-_action-profile-glyph-size: var(--xh-control-indicator-md);
226
235
  --xh-_action-profile-font-size: var(--xh-control-caption-sm);
227
236
  }
228
237