@xihan-ui/styles 1.0.0 → 2.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 (171) hide show
  1. package/CHANGELOG.md +5146 -6
  2. package/README.md +22 -2
  3. package/component-tokens.d.ts +4212 -0
  4. package/component-tokens.js +2 -0
  5. package/components.tokens.json +80116 -0
  6. package/css/accordion.css +131 -75
  7. package/css/affix.css +16 -1
  8. package/css/alert.css +114 -67
  9. package/css/anchor.css +99 -27
  10. package/css/approval.css +461 -0
  11. package/css/avatar-group.css +14 -6
  12. package/css/avatar.css +33 -9
  13. package/css/back-top.css +103 -48
  14. package/css/badge.css +42 -14
  15. package/css/bar-code.css +62 -0
  16. package/css/breadcrumb.css +40 -21
  17. package/css/button-group.css +146 -24
  18. package/css/button.css +116 -99
  19. package/css/calendar-picker.css +448 -0
  20. package/css/calendar-range-picker.css +517 -0
  21. package/css/card.css +54 -77
  22. package/css/carousel.css +412 -68
  23. package/css/cascader.css +429 -246
  24. package/css/checkbox-group.css +225 -77
  25. package/css/checkbox.css +174 -37
  26. package/css/clipboard.css +266 -47
  27. package/css/code-view.css +279 -0
  28. package/css/collapsible.css +108 -63
  29. package/css/color-field.css +158 -0
  30. package/css/color-picker.css +172 -184
  31. package/css/color-slider.css +274 -0
  32. package/css/color-swatch-picker.css +243 -0
  33. package/css/color-swatch.css +35 -0
  34. package/css/combobox.css +267 -273
  35. package/css/command.css +399 -0
  36. package/css/context-menu.css +183 -108
  37. package/css/date-field.css +94 -121
  38. package/css/date-picker.css +486 -249
  39. package/css/date-range-picker.css +559 -0
  40. package/css/description.css +51 -0
  41. package/css/descriptions.css +133 -87
  42. package/css/dialog.css +247 -68
  43. package/css/diff-view.css +428 -0
  44. package/css/download-trigger.css +155 -46
  45. package/css/drawer.css +194 -111
  46. package/css/editable.css +172 -152
  47. package/css/empty-state.css +80 -11
  48. package/css/field-array.css +190 -0
  49. package/css/field.css +84 -31
  50. package/css/fieldset.css +51 -18
  51. package/css/file-upload.css +134 -36
  52. package/css/flex.css +20 -1
  53. package/css/float-button.css +238 -57
  54. package/css/floating-panel.css +173 -92
  55. package/css/focus.css +46 -0
  56. package/css/forced-colors.css +93 -0
  57. package/css/form.css +254 -77
  58. package/css/gradient-text.css +34 -10
  59. package/css/grid.css +516 -5
  60. package/css/heatmap.css +87 -29
  61. package/css/highlight.css +20 -5
  62. package/css/hover-card.css +97 -47
  63. package/css/icon-wrapper.css +15 -3
  64. package/css/icon.css +74 -8
  65. package/css/image-cropper.css +143 -29
  66. package/css/image-viewer.css +150 -89
  67. package/css/image.css +30 -1
  68. package/css/infinite-scroll.css +51 -1
  69. package/css/input-group.css +277 -0
  70. package/css/json-viewer.css +102 -45
  71. package/css/kbd.css +72 -0
  72. package/css/label.css +78 -0
  73. package/css/layers.css +5 -0
  74. package/css/layout.css +175 -31
  75. package/css/list.css +24 -3
  76. package/css/listbox.css +208 -67
  77. package/css/loading-bar.css +52 -3
  78. package/css/log.css +144 -9
  79. package/css/markdown-stream.css +149 -0
  80. package/css/marquee.css +27 -1
  81. package/css/masonry.css +7 -0
  82. package/css/matrix-code.css +67 -0
  83. package/css/mention.css +234 -152
  84. package/css/menu.css +180 -83
  85. package/css/menubar.css +204 -136
  86. package/css/message-feed.css +197 -0
  87. package/css/navigation-menu.css +144 -90
  88. package/css/notification.css +178 -100
  89. package/css/number-animation.css +7 -0
  90. package/css/number-field.css +120 -277
  91. package/css/overlay-arrow.css +12 -7
  92. package/css/page-header.css +99 -14
  93. package/css/pagination.css +175 -135
  94. package/css/password-input.css +222 -219
  95. package/css/pin-input.css +101 -67
  96. package/css/pointer.css +36 -0
  97. package/css/popconfirm.css +185 -94
  98. package/css/popover.css +121 -77
  99. package/css/progress.css +60 -12
  100. package/css/prompt-input.css +224 -0
  101. package/css/question-flow.css +513 -0
  102. package/css/radio-group.css +147 -30
  103. package/css/rating.css +193 -43
  104. package/css/reasoning.css +336 -0
  105. package/css/reset.css +84 -6
  106. package/css/resizable.css +237 -0
  107. package/css/scroll-area.css +68 -7
  108. package/css/scrollbar.css +47 -13
  109. package/css/segmented.css +94 -29
  110. package/css/select.css +288 -274
  111. package/css/separator.css +101 -1
  112. package/css/side-nav.css +133 -75
  113. package/css/signature-pad.css +74 -54
  114. package/css/skeleton.css +84 -11
  115. package/css/slider.css +132 -39
  116. package/css/sortable.css +198 -0
  117. package/css/spinner.css +126 -12
  118. package/css/splitter.css +29 -8
  119. package/css/statistic.css +55 -0
  120. package/css/steps.css +206 -72
  121. package/css/switch.css +268 -36
  122. package/css/table.css +695 -118
  123. package/css/tabs.css +604 -42
  124. package/css/tag-group.css +219 -0
  125. package/css/tag.css +118 -28
  126. package/css/tags-input.css +156 -274
  127. package/css/text-field.css +101 -249
  128. package/css/time-field.css +100 -128
  129. package/css/time-picker.css +323 -252
  130. package/css/time-range-picker.css +719 -0
  131. package/css/timeline.css +202 -68
  132. package/css/timer.css +56 -52
  133. package/css/timestamp.css +34 -0
  134. package/css/toast.css +373 -144
  135. package/css/toggle-group.css +309 -76
  136. package/css/toggle.css +116 -85
  137. package/css/tone.css +47 -0
  138. package/css/tool-call.css +421 -0
  139. package/css/toolbar.css +181 -33
  140. package/css/tooltip.css +107 -36
  141. package/css/tour.css +183 -152
  142. package/css/transfer.css +351 -138
  143. package/css/tree-select.css +323 -216
  144. package/css/tree.css +294 -62
  145. package/css/truncate.css +65 -0
  146. package/css/typography.css +228 -5
  147. package/css/undefined.css +10 -1
  148. package/css/virtualizer.css +9 -10
  149. package/css/visually-hidden.css +7 -0
  150. package/css/watermark.css +7 -0
  151. package/family/action-control.css +487 -0
  152. package/family/collection-item.css +721 -0
  153. package/family/field-chrome.css +298 -0
  154. package/family/motion.css +166 -0
  155. package/family/swatch.css +59 -0
  156. package/index.css +41705 -126
  157. package/index.unlayered.css +33692 -17339
  158. package/package.json +51 -17
  159. package/css/calendar.css +0 -367
  160. package/css/code-block.css +0 -91
  161. package/css/composer.css +0 -134
  162. package/css/countdown.css +0 -26
  163. package/css/dynamic-input.css +0 -220
  164. package/css/ellipsis.css +0 -52
  165. package/css/hotkeys.css +0 -90
  166. package/css/popselect.css +0 -391
  167. package/css/qr-code.css +0 -55
  168. package/css/result.css +0 -119
  169. package/css/space.css +0 -117
  170. package/css/thread.css +0 -120
  171. package/css/time.css +0 -25
package/css/toggle.css CHANGED
@@ -1,114 +1,145 @@
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
+ */
5
+
6
+ /* 定义 toggle 样式。 */
7
+
8
+ @import '../family/action-control.css';
9
+
1
10
  @layer xihan.components {
2
- /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
11
  [data-scope='toggle'] {
4
12
  --xh-toggle-skin: 1;
5
13
  }
6
14
 
15
+ /* 未按下的四档形态由家族形态矩阵按 data-xh-action-variant 给出(缺省 subtle 由连接层显式投影;solid 未按下时
16
+ 投 ghost,只在按下时才是品牌实心);公开槽桥接到矩阵之前:使用者槽 → 形态矩阵 → 家族缺省。
17
+ 按下(on)是 §7.3 无滑块开关的选中面:品牌淡底 12 → 悬停 20 → 按压 28,前景 fg-on-brand-subtle,
18
+ 私有槽在下面的 data-state='on' 块里接到桥接槽上。 */
7
19
  [data-scope='toggle'][data-part='root'] {
8
- /* 私有槽位:组件令牌 语义令牌两级回退,变体只改这几个槽位 */
9
- --xh-_bg: var(--xh-toggle-bg, transparent);
10
- --xh-_bg-hover: var(--xh-toggle-bg-hover, var(--xh-bg-subtle-hover));
11
- --xh-_fg: var(--xh-toggle-fg, var(--xh-fg-default));
12
-
13
- /* 按下态:强调交给底色。前景不用品牌色——subtle-active 这一档底上任何品牌色都过不了
14
- AA(浅色最好的 brand-700 只有 4.37),强调靠底、可读靠前景是更稳的分工 */
15
- --xh-_bg-pressed: var(--xh-toggle-bg-pressed, var(--xh-bg-subtle-active));
16
- --xh-_fg-pressed: var(--xh-toggle-fg-pressed, var(--xh-fg-default));
20
+ --xh-_toggle-bg-on: var(--xh-toggle-bg-on, var(--xh-_tone-subtle, var(--xh-bg-brand-subtle)));
21
+ --xh-_toggle-bg-on-hover: var(
22
+ --xh-toggle-bg-on-hover,
23
+ var(
24
+ --xh-_tone-subtle-hover,
25
+ var(--xh-bg-brand-subtle-hover)
26
+ )
27
+ );
28
+ --xh-_toggle-bg-on-active: var(
29
+ --xh-toggle-bg-on-active,
30
+ var(
31
+ --xh-_tone-subtle-active,
32
+ var(--xh-bg-brand-subtle-active)
33
+ )
34
+ );
35
+ --xh-_toggle-fg-on: var(--xh-toggle-fg-on, var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle)));
36
+ --xh-_toggle-border-on: var(--xh-toggle-border-on, transparent);
37
+ /* 禁用同时降级前景与表面,不靠 opacity;选中且禁用时底色掺一半中性面,选中信息不丢。 */
38
+ --xh-_toggle-bg-on-disabled: var(
39
+ --xh-toggle-bg-on-disabled,
40
+ color-mix(in oklab, var(--xh-_toggle-bg-on) 50%, var(--xh-bg-subtle))
41
+ );
42
+ --xh-_toggle-fg-on-disabled: var(--xh-toggle-fg-on-disabled, var(--xh-_toggle-fg-on));
43
+ --xh-action-bg-rest: var(--xh-toggle-bg, var(--xh-_action-variant-bg-rest));
44
+ --xh-action-bg-hover: var(--xh-toggle-bg-hover, var(--xh-_action-variant-bg-hover));
45
+ --xh-action-bg-pressed: var(--xh-toggle-bg-active, var(--xh-_action-variant-bg-pressed));
46
+ --xh-action-bg-focus-visible: var(--xh-toggle-bg, var(--xh-_action-variant-bg-focus-visible));
47
+ --xh-action-bg-disabled: var(--xh-toggle-bg-disabled, var(--xh-_action-variant-bg-disabled));
48
+ --xh-action-fg-rest: var(--xh-toggle-fg, var(--xh-_action-variant-fg-rest));
49
+ --xh-action-fg-hover: var(--xh-toggle-fg, var(--xh-_action-variant-fg-hover));
50
+ --xh-action-fg-pressed: var(--xh-toggle-fg, var(--xh-_action-variant-fg-pressed));
51
+ --xh-action-fg-focus-visible: var(--xh-toggle-fg, var(--xh-_action-variant-fg-focus-visible));
52
+ --xh-action-fg-disabled: var(--xh-toggle-fg-disabled, var(--xh-_action-variant-fg-disabled));
53
+ --xh-action-border-rest: var(--xh-toggle-border, var(--xh-_action-variant-border-rest));
54
+ --xh-action-border-hover: var(--xh-toggle-border, var(--xh-_action-variant-border-hover));
55
+ --xh-action-border-pressed: var(--xh-toggle-border, var(--xh-_action-variant-border-pressed));
56
+ --xh-action-border-focus-visible: var(--xh-toggle-border, var(--xh-_action-variant-border-focus-visible));
57
+ --xh-action-border-disabled: var(--xh-toggle-border-disabled, var(--xh-_action-variant-border-disabled));
58
+ --xh-action-radius: var(--xh-toggle-radius, var(--xh-shape-control));
59
+ --xh-action-visual-size: var(--xh-toggle-h, var(--xh-_action-profile-visual-size));
60
+ --xh-action-padding-inline: var(--xh-toggle-px, var(--xh-_action-profile-padding-inline));
61
+ --xh-action-gap: var(--xh-toggle-gap, var(--xh-_action-profile-gap));
62
+ --xh-action-font-size: var(--xh-toggle-font-size, var(--xh-_action-profile-font-size));
63
+ --xh-icon-size: var(--xh-toggle-icon-size, var(--xh-_action-profile-glyph-size));
17
64
 
18
- display: inline-flex;
19
- align-items: center;
20
- justify-content: center;
21
- gap: var(--xh-toggle-gap, var(--xh-control-gap-md));
22
- block-size: var(--xh-toggle-h, var(--xh-control-h-md));
23
- padding-inline: var(--xh-toggle-px, var(--xh-control-px-md));
24
- border: var(--xh-stroke-thin) solid transparent;
25
- border-radius: var(--xh-toggle-radius, var(--xh-shape-control));
26
- background: var(--xh-_bg);
27
- color: var(--xh-_fg);
28
- font-size: var(--xh-toggle-font-size, var(--xh-text-label-size));
29
65
  font-weight: var(--xh-toggle-font-weight, var(--xh-text-label-weight));
30
- line-height: var(--xh-leading-none);
31
- white-space: nowrap;
32
- cursor: pointer;
33
- user-select: none;
34
- transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
35
- }
36
-
37
- [data-scope='toggle'][data-part='root']:hover {
38
- background: var(--xh-_bg-hover);
39
- }
40
-
41
- [data-scope='toggle'][data-part='root'][data-disabled] {
42
- cursor: not-allowed;
43
- opacity: var(--xh-state-disabled-opacity);
44
66
  }
45
67
 
46
- [data-scope='toggle'][data-part='root']:focus-visible {
47
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
48
- outline-offset: var(--xh-ring-offset);
49
- }
50
-
51
- /* —— 变体 —— */
52
- /* 形态只决定颜色怎么用;用哪族颜色由 data-tone 决定,没写 tone 就沿用原来的中性配色 */
53
- [data-scope='toggle'][data-part='root'][data-variant='solid'] {
54
- --xh-_bg: transparent;
55
- --xh-_bg-hover: var(--xh-_tone-subtle, var(--xh-bg-subtle-hover));
56
- --xh-_fg: var(--xh-_tone-fg, var(--xh-fg-default));
57
- --xh-_bg-pressed: var(--xh-_tone, var(--xh-bg-brand));
58
- --xh-_fg-pressed: var(--xh-_tone-on, var(--xh-fg-on-brand));
59
- }
60
-
61
- [data-scope='toggle'][data-part='root'][data-variant='subtle'] {
62
- --xh-_bg: var(--xh-_tone-subtle, var(--xh-bg-subtle));
63
- --xh-_bg-hover: var(--xh-_tone-subtle-hover, var(--xh-bg-subtle-hover));
64
- --xh-_fg: var(--xh-_tone-fg, var(--xh-fg-default));
65
- --xh-_bg-pressed: var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active));
66
- --xh-_fg-pressed: var(--xh-_tone-fg, var(--xh-fg-default));
68
+ [data-scope='toggle'] > svg {
69
+ inline-size: var(--xh-toggle-icon-size, var(--xh-_action-profile-glyph-size));
70
+ block-size: var(--xh-toggle-icon-size, var(--xh-_action-profile-glyph-size));
71
+ flex: none;
72
+ pointer-events: none;
67
73
  }
68
74
 
75
+ /* outline 按下后描边仍是可操作区那一档:淡底面上没有描边就与 subtle 的按下态分不开 */
69
76
  [data-scope='toggle'][data-part='root'][data-variant='outline'] {
70
- --xh-_bg: transparent;
71
- --xh-_bg-hover: var(--xh-_tone-subtle, var(--xh-bg-subtle-hover));
72
- --xh-_fg: var(--xh-_tone-fg, var(--xh-fg-default));
73
- --xh-_bg-pressed: var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active));
74
- --xh-_fg-pressed: var(--xh-_tone-fg, var(--xh-fg-default));
75
-
76
- border-color: var(--xh-_tone-border-control, var(--xh-border-control));
77
+ --xh-_toggle-border-on: var(--xh-toggle-border-on, var(--xh-_tone-border-control, var(--xh-border-control)));
77
78
  }
78
79
 
79
- [data-scope='toggle'][data-part='root'][data-variant='ghost'] {
80
- --xh-_bg: transparent;
81
- --xh-_bg-hover: var(--xh-_tone-subtle, var(--xh-bg-subtle-hover));
82
- --xh-_fg: var(--xh-_tone-fg, var(--xh-fg-default));
83
- --xh-_bg-pressed: var(--xh-_tone-subtle-active, var(--xh-bg-subtle-active));
84
- --xh-_fg-pressed: var(--xh-_tone-fg, var(--xh-fg-default));
80
+ /* 按下(on):solid 之外的三档一律品牌淡底;solid 的按下面由矩阵 solid 列给出(连接层此时投影
81
+ data-xh-action-variant='solid'),这里不接管。 */
82
+ [data-scope='toggle'][data-part='root']:not([data-variant='solid'])[data-state='on'] {
83
+ --xh-action-bg-rest: var(--xh-_toggle-bg-on);
84
+ --xh-action-bg-hover: var(--xh-_toggle-bg-on-hover);
85
+ --xh-action-bg-pressed: var(--xh-_toggle-bg-on-active);
86
+ --xh-action-bg-focus-visible: var(--xh-_toggle-bg-on);
87
+ --xh-action-bg-disabled: var(--xh-_toggle-bg-on-disabled);
88
+ --xh-action-fg-rest: var(--xh-_toggle-fg-on);
89
+ --xh-action-fg-hover: var(--xh-_toggle-fg-on);
90
+ --xh-action-fg-pressed: var(--xh-_toggle-fg-on);
91
+ --xh-action-fg-focus-visible: var(--xh-_toggle-fg-on);
92
+ --xh-action-fg-disabled: var(--xh-_toggle-fg-on-disabled);
93
+ --xh-action-border-rest: var(--xh-_toggle-border-on);
94
+ --xh-action-border-hover: var(--xh-_toggle-border-on);
95
+ --xh-action-border-pressed: var(--xh-_toggle-border-on);
96
+ --xh-action-border-focus-visible: var(--xh-_toggle-border-on);
97
+ --xh-action-border-disabled: var(--xh-_toggle-border-on);
85
98
  }
86
99
 
87
- /* 按下态排在变体之后:两者特异度相同,后写的那条赢,
88
- 变体只负责给出按下档的取值,切换由这里一处完成 */
100
+ /* 使用者的 --xh-toggle-shadow 只落在按下面上:矩阵各态无影,淡底与阴影互斥(§5.3) */
89
101
  [data-scope='toggle'][data-part='root'][data-state='on'] {
90
- --xh-_bg: var(--xh-_bg-pressed);
91
- --xh-_bg-hover: var(--xh-_bg-pressed);
102
+ --xh-action-shadow-rest: var(--xh-toggle-shadow, none);
103
+ --xh-action-shadow-hover: var(--xh-toggle-shadow, none);
104
+ --xh-action-shadow-pressed: var(--xh-toggle-shadow, none);
105
+ --xh-action-shadow-focus-visible: var(--xh-toggle-shadow, none);
106
+ --xh-action-shadow-disabled: none;
107
+ }
92
108
 
93
- color: var(--xh-_fg-pressed);
109
+ /* solid 按下后是实心面:顶边内高光与全库实心档共用一条式子。
110
+ 禁用同样掺一半中性面保留选中信息(与上面三档同一条规则):矩阵 solid 列的 disabled 是中性
111
+ bg-subtle + fg-disabled,直接吃它就与未按下的禁用面分不开;底取实心面本身(矩阵在暗色下
112
+ 换过的品牌实心也一并跟着)掺 --xh-bg-subtle,前景留实心面的配对前景。 */
113
+ [data-scope='toggle'][data-part='root'][data-variant='solid'][data-state='on'] {
114
+ --xh-action-bg-disabled: var(
115
+ --xh-toggle-bg-on-disabled,
116
+ color-mix(in oklab, var(--xh-_action-variant-bg-rest) 50%, var(--xh-bg-subtle))
117
+ );
118
+ --xh-action-fg-disabled: var(--xh-toggle-fg-on-disabled, var(--xh-_action-variant-fg-rest));
119
+ --xh-action-highlight-rest: var(--xh-_highlight-tone);
120
+ --xh-action-highlight-hover: var(--xh-_highlight-tone);
121
+ --xh-action-highlight-pressed: var(--xh-_highlight-tone);
122
+ --xh-action-highlight-focus-visible: var(--xh-_highlight-tone);
94
123
  }
95
124
 
96
- /* —— 尺寸 —— */
97
- [data-scope='toggle'][data-part='root'][data-size='sm'] {
98
- block-size: var(--xh-toggle-h, var(--xh-control-h-sm));
99
- padding-inline: var(--xh-toggle-px, var(--xh-control-px-sm));
100
- font-size: var(--xh-toggle-font-size, var(--xh-control-font-sm));
125
+ /* 只有 solid 按下后才是实心面:环色与面同族画在面里看不出来,环改取面自己的前景色;
126
+ 品牌淡底不是实心面,吃库环 */
127
+ [data-scope='toggle'][data-part='root'][data-variant='solid'][data-state='on']:focus-visible {
128
+ --xh-action-ring-color-focus-visible: currentColor;
101
129
  }
102
130
 
103
- [data-scope='toggle'][data-part='root'][data-size='lg'] {
104
- block-size: var(--xh-toggle-h, var(--xh-control-h-lg));
105
- padding-inline: var(--xh-toggle-px, var(--xh-control-px-lg));
106
- font-size: var(--xh-toggle-font-size, var(--xh-control-font-lg));
131
+ [data-scope='toggle'][data-part='root'][data-full-width] {
132
+ inline-size: 100%;
107
133
  }
108
134
 
109
- /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
110
- 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
111
135
  [data-scope='toggle'][data-part='root'][hidden] {
112
136
  display: none;
113
137
  }
138
+
139
+ @media print {
140
+ [data-scope='toggle'][data-part='root'][data-state='on'] {
141
+ border-color: currentColor;
142
+ font-weight: var(--xh-font-weight-semibold);
143
+ }
144
+ }
114
145
  }
package/css/tone.css CHANGED
@@ -1,3 +1,8 @@
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
+ */
5
+
1
6
  /*
2
7
  * 语气层:与组件无关,全库共用一份。
3
8
  *
@@ -14,6 +19,10 @@
14
19
  * 按 WCAG 的权重算出语气色的相对亮度,低于 0.179 配白字、高于配深字,shift 取反面。
15
20
  * 0.179 是白字与黑字对比度相等的那一点,解析解。
16
21
  *
22
+ * --xh-_tone-on 还有第二个消费者:实心面上的聚焦环取的是这块面配对的前景色(见 focus.css),
23
+ * 部件没写 color 的那几档直接把这一支写进环色槽。所以它同时管着字与环两件事。
24
+ * 环本身不接语气:语气只决定面是哪一族色,不决定环是什么色。
25
+ *
17
26
  * 现推是因为语气色可换肤:写死的分派只对本仓这套 600 档成立,使用者换一套调色板
18
27
  * 配对就不再成立,而门禁只验本仓的色,换肤后的失配一路绿灯。
19
28
  *
@@ -139,4 +148,42 @@
139
148
  :is([data-theme='dark'] *, [data-theme='dark'])[data-tone='brand'] {
140
149
  --xh-_tone-shift: var(--xh-color-neutral-0);
141
150
  }
151
+
152
+ /* 语气轴对外的那一族:上面每支私有槽一对一指过来,取值恒等。
153
+ 使用者在自己的节点上写 data-tone,就能在那个节点里取到整族颜色,
154
+ 六族与深浅两态都跟着上面的推导走。
155
+ --xh-_tone-shift 是兑色的方向、不是一档颜色,不出公开令牌。
156
+ 声明在 [data-tone] 上而不是 :root 上:值里带 var(),自定义属性的 var()
157
+ 在「声明它的那个元素」上就替换掉了,落在 :root 上会把语气冻死在根元素。 */
158
+ [data-tone] {
159
+ --xh-tone-solid: var(--xh-_tone);
160
+ --xh-tone-solid-hover: var(--xh-_tone-hover);
161
+ --xh-tone-solid-active: var(--xh-_tone-active);
162
+ --xh-tone-on: var(--xh-_tone-on);
163
+ --xh-tone-subtle: var(--xh-_tone-subtle);
164
+ --xh-tone-subtle-hover: var(--xh-_tone-subtle-hover);
165
+ --xh-tone-subtle-active: var(--xh-_tone-subtle-active);
166
+ --xh-tone-fg: var(--xh-_tone-fg);
167
+ --xh-tone-border: var(--xh-_tone-border);
168
+ --xh-tone-border-control: var(--xh-_tone-border-control);
169
+ --xh-tone-soft: var(--xh-_tone-soft);
170
+ }
171
+
172
+ /* 实心面顶边的内高光:一条极浅的内阴影,把一块实心底衬出厚度。
173
+ 全库十六处实心档共用这两条,别再逐个组件把式子抄一遍。
174
+
175
+ 两条的差别只在取哪个前景色:--xh-_highlight-tone 跟着语气走(实心底上的前景色,
176
+ 没写语气时退回品牌那一档),--xh-_highlight-brand 恒取品牌色——底色本身不跟语气走的
177
+ 那几处(表单提交、引导主按钮、不带语气的实心标签)用它。
178
+
179
+ 声明在 :where([data-scope]) 上而不是 :root 上:它俩的值里带 var(),而自定义属性的
180
+ var() 在「声明它的那个元素」上就替换掉了。落在 :root 上,--xh-_tone-on 与
181
+ --xh-fg-on-brand 就都按根元素解析,语气与嵌套主题一并冻死;逐元素声明才是现取。
182
+ 同理它也不能收成 tokens 那边的一支令牌。 */
183
+ :where([data-scope]) {
184
+ --xh-_highlight-tone: inset 0 var(--xh-stroke-thin) 0 0
185
+ color-mix(in oklab, var(--xh-_tone-on, var(--xh-fg-on-brand)) 14%, transparent);
186
+ --xh-_highlight-brand: inset 0 var(--xh-stroke-thin) 0 0
187
+ color-mix(in oklab, var(--xh-fg-on-brand) 14%, transparent);
188
+ }
142
189
  }