@xihan-ui/styles 2.1.0 → 3.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.
Files changed (152) hide show
  1. package/CHANGELOG.md +1261 -0
  2. package/README.md +6 -1
  3. package/component-tokens.d.ts +533 -96
  4. package/components.tokens.json +35461 -26045
  5. package/css/accordion.css +34 -8
  6. package/css/alert.css +59 -1
  7. package/css/anchor.css +46 -8
  8. package/css/approval.css +116 -76
  9. package/css/avatar-group.css +1 -1
  10. package/css/avatar.css +13 -5
  11. package/css/back-top.css +61 -42
  12. package/css/badge.css +62 -12
  13. package/css/bar-code.css +1 -1
  14. package/css/breadcrumb.css +62 -3
  15. package/css/button-group.css +4 -4
  16. package/css/button.css +67 -19
  17. package/css/calendar-picker.css +19 -0
  18. package/css/calendar-range-picker.css +39 -2
  19. package/css/card.css +115 -1
  20. package/css/carousel.css +148 -43
  21. package/css/cartesian-chart.css +830 -0
  22. package/css/cascader.css +181 -65
  23. package/css/checkbox-group.css +59 -89
  24. package/css/checkbox.css +16 -49
  25. package/css/citation.css +470 -0
  26. package/css/clipboard.css +20 -63
  27. package/css/code-view.css +101 -6
  28. package/css/collapsible.css +34 -8
  29. package/css/color-field.css +18 -0
  30. package/css/color-picker.css +128 -50
  31. package/css/color-slider.css +22 -15
  32. package/css/color-swatch-picker.css +3 -1
  33. package/css/combobox.css +80 -33
  34. package/css/command.css +45 -43
  35. package/css/context-menu.css +39 -22
  36. package/css/date-field.css +56 -0
  37. package/css/date-picker.css +132 -26
  38. package/css/date-range-picker.css +337 -14
  39. package/css/description.css +17 -1
  40. package/css/descriptions.css +42 -0
  41. package/css/dialog.css +94 -36
  42. package/css/diff-view.css +97 -12
  43. package/css/download-trigger.css +44 -78
  44. package/css/drawer.css +160 -119
  45. package/css/editable.css +19 -0
  46. package/css/empty-state.css +7 -6
  47. package/css/field-array.css +36 -0
  48. package/css/field.css +20 -18
  49. package/css/file-upload.css +125 -135
  50. package/css/flex.css +324 -8
  51. package/css/float-button.css +263 -38
  52. package/css/floating-panel.css +53 -19
  53. package/css/form.css +31 -17
  54. package/css/funnel-chart.css +106 -0
  55. package/css/graph-chart.css +205 -0
  56. package/css/grid-list.css +235 -0
  57. package/css/grid.css +252 -1
  58. package/css/heatmap.css +119 -36
  59. package/css/hierarchy-chart.css +298 -0
  60. package/css/hover-card.css +31 -14
  61. package/css/icon.css +100 -0
  62. package/css/image-cropper.css +33 -7
  63. package/css/image-viewer.css +167 -22
  64. package/css/image.css +23 -4
  65. package/css/input-group.css +11 -13
  66. package/css/json-viewer.css +50 -2
  67. package/css/layout.css +68 -18
  68. package/css/liquid.css +106 -0
  69. package/css/list.css +1 -1
  70. package/css/listbox.css +46 -6
  71. package/css/loading-bar.css +27 -13
  72. package/css/log.css +129 -33
  73. package/css/markdown-stream.css +1 -1
  74. package/css/marquee.css +163 -7
  75. package/css/matrix-code.css +1 -1
  76. package/css/mention.css +35 -19
  77. package/css/menu.css +35 -21
  78. package/css/menubar.css +36 -20
  79. package/css/message-feed.css +172 -51
  80. package/css/navigation-menu.css +172 -11
  81. package/css/notification.css +435 -108
  82. package/css/number-field.css +22 -0
  83. package/css/page-header.css +3 -1
  84. package/css/pagination.css +126 -24
  85. package/css/password-input.css +40 -8
  86. package/css/pie-chart.css +247 -0
  87. package/css/popconfirm.css +44 -50
  88. package/css/popover.css +50 -14
  89. package/css/progress.css +308 -10
  90. package/css/prompt-input.css +36 -0
  91. package/css/question-flow.css +97 -57
  92. package/css/radar-chart.css +233 -0
  93. package/css/radio-group.css +363 -5
  94. package/css/rating.css +21 -23
  95. package/css/reasoning.css +61 -54
  96. package/css/resizable.css +6 -1
  97. package/css/sankey-chart.css +174 -0
  98. package/css/scroll-area.css +32 -0
  99. package/css/scrollbar.css +1 -1
  100. package/css/select.css +74 -55
  101. package/css/side-nav.css +173 -24
  102. package/css/signature-pad.css +16 -1
  103. package/css/skeleton.css +13 -14
  104. package/css/slider.css +35 -13
  105. package/css/sortable.css +37 -7
  106. package/css/sparkline.css +164 -0
  107. package/css/spinner.css +50 -22
  108. package/css/splitter.css +7 -1
  109. package/css/statistic.css +10 -0
  110. package/css/steps.css +248 -29
  111. package/css/switch.css +23 -48
  112. package/css/table.css +175 -118
  113. package/css/tabs.css +231 -19
  114. package/css/tag-group.css +27 -3
  115. package/css/tag.css +53 -12
  116. package/css/tags-input.css +40 -3
  117. package/css/text-field.css +19 -0
  118. package/css/time-field.css +20 -1
  119. package/css/time-picker.css +103 -17
  120. package/css/time-range-picker.css +45 -16
  121. package/css/timeline.css +1 -1
  122. package/css/toggle-group.css +4 -4
  123. package/css/toggle.css +4 -3
  124. package/css/tool-call.css +59 -51
  125. package/css/toolbar.css +101 -3
  126. package/css/tooltip.css +15 -2
  127. package/css/tour.css +42 -12
  128. package/css/transfer.css +98 -75
  129. package/css/tree-select.css +232 -53
  130. package/css/tree.css +271 -55
  131. package/css/truncate.css +55 -12
  132. package/css/typography.css +93 -0
  133. package/css/virtualizer.css +56 -0
  134. package/css/watermark.css +23 -0
  135. package/family/action-control.css +14 -5
  136. package/family/chart.css +480 -0
  137. package/family/check-mark.css +94 -0
  138. package/family/choice-card.css +97 -0
  139. package/family/collection-item.css +9 -15
  140. package/family/field-chrome.css +1 -12
  141. package/family/loading-ring.css +95 -0
  142. package/family/material.css +72 -0
  143. package/family/menu-choice.css +56 -0
  144. package/family/motion.css +207 -10
  145. package/family/tag-list.css +59 -0
  146. package/index.css +13824 -4030
  147. package/index.unlayered.css +13403 -3605
  148. package/package.json +20 -8
  149. package/css/gradient-text.css +0 -91
  150. package/css/icon-wrapper.css +0 -81
  151. package/css/segmented.css +0 -280
  152. package/css/toast.css +0 -499
@@ -0,0 +1,298 @@
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
+ /* 定义 hierarchy chart 样式。 */
7
+
8
+ /* 标题、图例容器、视口、提示框、空态、焦点环与顺序色阶走 Chart 家族配方;下钻路径的项归 Collection Item 导航当前(nav 语境),
9
+ 面、字色、字重与按压时间线由家族配方给,本皮肤只映射桥接槽。两份都 @import,单独引入仍成立。 */
10
+ @import '../family/motion.css';
11
+ @import '../family/chart.css';
12
+ @import '../family/loading-ring.css';
13
+ @import '../family/collection-item.css';
14
+
15
+ @layer xihan.components {
16
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
17
+ [data-scope='hierarchy-chart'] {
18
+ --xh-hierarchy-chart-skin: 1;
19
+ }
20
+
21
+ /* 几何要用的像素值以这里的私有槽为真源:机器挂载后从计算样式读它们,作者覆盖组件槽即改变几何 */
22
+ [data-scope='hierarchy-chart'][data-part='root'] {
23
+ --xh-_chart-metric-bar-max: var(--xh-chart-bar-max);
24
+ --xh-_chart-metric-gap: var(--xh-hierarchy-chart-node-gap, var(--xh-chart-gap));
25
+ --xh-_chart-metric-line-width: var(--xh-chart-line-width);
26
+ --xh-_chart-metric-point-size: var(--xh-chart-point-size);
27
+ --xh-_chart-metric-hit-min: var(--xh-chart-hit-min);
28
+ --xh-_chart-metric-tick-length: var(--xh-chart-tick-length);
29
+ --xh-_chart-metric-label-gap: var(--xh-chart-label-gap);
30
+ --xh-_chart-metric-radius: var(--xh-hierarchy-chart-node-radius, var(--xh-shape-inset));
31
+ --xh-_chart-metric-font-size: var(--xh-text-caption-size);
32
+ --xh-_chart-metric-leading: var(--xh-leading-tight);
33
+ --xh-_chart-gap: var(--xh-hierarchy-chart-gap, var(--xh-space-3));
34
+ /* 路径上的尖角与作者塞进来的图标跟着路径的字号档走 */
35
+ --xh-icon-size: var(--xh-hierarchy-chart-icon-size, var(--xh-glyph-size-sm));
36
+ }
37
+
38
+ /* —— 家族配方的组件槽:标题、视口、提示框与空态由 family/chart.css 画,本图表的覆盖槽写在
39
+ 对应部件上接进配方的私有槽,作者在部件或它的祖先上覆盖都生效 —— */
40
+ [data-scope='hierarchy-chart'][data-part='viewport'] {
41
+ --xh-_chart-height: var(--xh-hierarchy-chart-height, var(--xh-chart-height));
42
+ }
43
+
44
+ [data-scope='hierarchy-chart'][data-part='legend'] {
45
+ --xh-_chart-legend-gap: var(--xh-hierarchy-chart-legend-gap, var(--xh-space-4));
46
+ }
47
+
48
+ [data-scope='hierarchy-chart'][data-part='tooltip'] {
49
+ --xh-_chart-tooltip-gap: var(--xh-hierarchy-chart-tooltip-gap, var(--xh-space-1));
50
+ --xh-_chart-tooltip-py: var(--xh-hierarchy-chart-tooltip-py, var(--xh-surface-pad-sm));
51
+ --xh-_chart-tooltip-px: var(--xh-hierarchy-chart-tooltip-px, var(--xh-surface-pad-sm));
52
+ --xh-_chart-tooltip-radius: var(--xh-hierarchy-chart-tooltip-radius, var(--xh-shape-overlay));
53
+ --xh-_chart-tooltip-shadow: var(--xh-hierarchy-chart-tooltip-shadow, var(--xh-material-frosted-shadow));
54
+ }
55
+
56
+ [data-scope='hierarchy-chart'][data-part='tooltip-row'] {
57
+ --xh-_chart-tooltip-row-gap: var(--xh-hierarchy-chart-tooltip-row-gap, var(--xh-space-2));
58
+ }
59
+
60
+ [data-scope='hierarchy-chart'][data-part='tooltip-swatch'] {
61
+ --xh-_chart-tooltip-swatch-radius: var(--xh-hierarchy-chart-tooltip-swatch-radius, var(--xh-shape-inset));
62
+ }
63
+
64
+ [data-scope='hierarchy-chart'][data-part='empty'][data-state='loading'] {
65
+ --xh-_chart-empty-gap: var(--xh-hierarchy-chart-empty-gap, var(--xh-space-2));
66
+ }
67
+
68
+ /* —— 下钻路径:一行按钮,项与项之间画一个向前的尖角。尖角画在项的外面、不接指针,按钮的命中区只是自己的名字 —— */
69
+ [data-scope='hierarchy-chart'][data-part='path'] {
70
+ display: flex;
71
+ flex-wrap: wrap;
72
+ align-items: center;
73
+ column-gap: var(--xh-hierarchy-chart-path-column-gap, calc(var(--xh-icon-size, var(--xh-glyph-size-sm)) + var(--xh-space-1) * 2));
74
+ row-gap: var(--xh-hierarchy-chart-path-row-gap, var(--xh-space-1));
75
+ font-size: var(--xh-hierarchy-chart-path-font-size, var(--xh-control-font-sm));
76
+ }
77
+
78
+ [data-scope='hierarchy-chart'][data-part='path'][hidden] {
79
+ display: none;
80
+ }
81
+
82
+ /* 项的几何、字号与面全经家族桥接槽:静息 muted,悬停换面,当前的根由连接层投影 data-xh-collection-terminal,
83
+ 走家族的 terminal 态(不响应悬停与按下)。本条 (0,2,0) 压过家族基础块 (0,1,0),不能再写 color / background */
84
+ [data-scope='hierarchy-chart'][data-part='path-item'] {
85
+ --xh-collection-block-padding: var(--xh-space-0);
86
+ --xh-collection-inline-padding: var(--xh-hierarchy-chart-path-item-px, var(--xh-space-1));
87
+ --xh-collection-radius: var(--xh-hierarchy-chart-path-item-radius, var(--xh-shape-control));
88
+ --xh-collection-font-size: var(--xh-hierarchy-chart-path-font-size, var(--xh-control-font-sm));
89
+ --xh-collection-fg-rest: var(--xh-hierarchy-chart-path-fg, var(--xh-fg-muted));
90
+ --xh-collection-bg-hover: var(--xh-hierarchy-chart-path-item-bg-hover, var(--xh-bg-subtle));
91
+ --xh-collection-fg-hover: var(--xh-hierarchy-chart-path-item-fg-hover, var(--xh-fg-default));
92
+ --xh-collection-bg-pressed: var(--xh-hierarchy-chart-path-item-bg-pressed, var(--xh-bg-subtle-hover));
93
+ --xh-collection-fg-terminal: var(--xh-hierarchy-chart-path-item-fg-current, var(--xh-fg-default));
94
+ --xh-collection-font-weight-terminal: var(--xh-hierarchy-chart-path-item-font-weight-current, var(--xh-font-weight-medium));
95
+
96
+ /* 不裁溢出:尖角画在项的盒子外面。名字长时整条路径折行,不截断 */
97
+ position: relative;
98
+ display: inline-flex;
99
+ align-items: center;
100
+ margin: 0;
101
+ border: none;
102
+ font-family: inherit;
103
+ line-height: var(--xh-leading-tight);
104
+ white-space: nowrap;
105
+ }
106
+
107
+ [data-scope='hierarchy-chart'][data-part='path-item'] + [data-scope='hierarchy-chart'][data-part='path-item']::before {
108
+ content: '';
109
+ position: absolute;
110
+ inset-block: 0;
111
+ inset-inline-end: calc(100% + var(--xh-space-1));
112
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
113
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-sm));
114
+ margin-block: auto;
115
+ background-color: var(--xh-hierarchy-chart-path-separator-fg, var(--xh-fg-subtle));
116
+ -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
117
+ mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
118
+ pointer-events: none;
119
+ }
120
+
121
+ [data-scope='hierarchy-chart'][data-part='path-item'][hidden] {
122
+ display: none;
123
+ }
124
+
125
+ /* 从右往左排版时「向前」在左边 */
126
+ [dir='rtl'] [data-scope='hierarchy-chart'][data-part='path-item']::before {
127
+ rotate: 180deg;
128
+ }
129
+
130
+ /* —— 色槽:第一层分支各取一个分类色,后代继承;作者可以在节点上覆盖 --xh-hierarchy-chart-series-color。
131
+ 节点、名字与提示框的色标都带着色槽,各自从这里取系列色与配对的前景色 —— */
132
+ [data-scope='hierarchy-chart'][data-xh-chart-slot='1'] {
133
+ --xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-1));
134
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-1);
135
+ }
136
+
137
+ [data-scope='hierarchy-chart'][data-xh-chart-slot='2'] {
138
+ --xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-2));
139
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-2);
140
+ }
141
+
142
+ [data-scope='hierarchy-chart'][data-xh-chart-slot='3'] {
143
+ --xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-3));
144
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-3);
145
+ }
146
+
147
+ [data-scope='hierarchy-chart'][data-xh-chart-slot='4'] {
148
+ --xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-4));
149
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-4);
150
+ }
151
+
152
+ [data-scope='hierarchy-chart'][data-xh-chart-slot='5'] {
153
+ --xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-5));
154
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-5);
155
+ }
156
+
157
+ [data-scope='hierarchy-chart'][data-xh-chart-slot='6'] {
158
+ --xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-6));
159
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-6);
160
+ }
161
+
162
+ [data-scope='hierarchy-chart'][data-xh-chart-slot='7'] {
163
+ --xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-7));
164
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-7);
165
+ }
166
+
167
+ [data-scope='hierarchy-chart'][data-xh-chart-slot='8'] {
168
+ --xh-_chart-series: var(--xh-hierarchy-chart-series-color, var(--xh-chart-categorical-8));
169
+ --xh-_chart-on-series: var(--xh-chart-on-categorical-8);
170
+ }
171
+
172
+ /* —— 节点:第一层取满色,往下每层向承载面混色变浅;名字的前景随之换:满色上取配对的前景色,
173
+ 浅色上取正文色。连接层写的层按当前的根数,下钻之后看得见的第一层照样是满色 —— */
174
+ [data-scope='hierarchy-chart'][data-part='node'],
175
+ [data-scope='hierarchy-chart'][data-part='node-label'],
176
+ [data-scope='hierarchy-chart'][data-part='group-header'] {
177
+ --xh-_hierarchy-mix: 100%;
178
+ --xh-_hierarchy-ink: var(--xh-_chart-on-series);
179
+ }
180
+
181
+ [data-scope='hierarchy-chart'][data-level='2'] {
182
+ --xh-_hierarchy-mix: 48%;
183
+ --xh-_hierarchy-ink: var(--xh-fg-default);
184
+ }
185
+
186
+ [data-scope='hierarchy-chart'][data-level='3'] {
187
+ --xh-_hierarchy-mix: 32%;
188
+ --xh-_hierarchy-ink: var(--xh-fg-default);
189
+ }
190
+
191
+ [data-scope='hierarchy-chart'][data-level='4'] {
192
+ --xh-_hierarchy-mix: 22%;
193
+ --xh-_hierarchy-ink: var(--xh-fg-default);
194
+ }
195
+
196
+ /* 相邻节点之间的间隙由几何留出,不画描边;指着一个节点时不在同一条祖孙链上的节点淡出,被指着的不位移 */
197
+ [data-scope='hierarchy-chart'][data-part='node'] {
198
+ --xh-_hierarchy-fill: color-mix(in oklab, var(--xh-_chart-series) var(--xh-_hierarchy-mix), var(--xh-chart-surface));
199
+
200
+ fill: var(--xh-_hierarchy-fill);
201
+ stroke: none;
202
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
203
+ }
204
+
205
+ /* 有子节点的节点点下去是下钻 */
206
+ [data-scope='hierarchy-chart'][data-part='node'][aria-expanded] {
207
+ cursor: pointer;
208
+ }
209
+
210
+ /* 按值着色:颜色由 Chart 家族配方按段号与段内百分比兑好放在私有槽里,不再按层变浅。色阶的起点贴着承载面、
211
+ 终点远离承载面:浅的一段写正文色,深的一段写承载面色,亮暗主题下都读得清 */
212
+ [data-scope='hierarchy-chart'][data-part='node'][data-seg] {
213
+ fill: var(--xh-_chart-seq-fill);
214
+ }
215
+
216
+ [data-scope='hierarchy-chart'][data-seg='low'] {
217
+ --xh-_hierarchy-ink: var(--xh-fg-default);
218
+ }
219
+
220
+ [data-scope='hierarchy-chart'][data-seg='high'] {
221
+ --xh-_hierarchy-ink: var(--xh-chart-surface);
222
+ }
223
+
224
+ [data-scope='hierarchy-chart'][data-part='node'][data-dimmed],
225
+ [data-scope='hierarchy-chart'][data-part='node-label'][data-dimmed],
226
+ [data-scope='hierarchy-chart'][data-part='group-header'][data-dimmed] {
227
+ opacity: var(--xh-chart-dim-alpha);
228
+ }
229
+
230
+ /* 名字与分组标题压在节点的颜色上:前景随层与着色方式取;它们不接指针,命中归节点 */
231
+ [data-scope='hierarchy-chart'][data-part='node-label'],
232
+ [data-scope='hierarchy-chart'][data-part='group-header'] {
233
+ fill: var(--xh-_hierarchy-ink);
234
+ pointer-events: none;
235
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
236
+ }
237
+
238
+ [data-scope='hierarchy-chart'][data-part='group-header'] {
239
+ font-weight: var(--xh-font-weight-medium);
240
+ }
241
+
242
+ /* 色阶图例:每层一条,名字、低端的值、渐变条、高端的值排成一行;值是标注字色、等宽数字 */
243
+ [data-scope='hierarchy-chart'][data-part='legend-scale'] {
244
+ display: inline-flex;
245
+ align-items: center;
246
+ gap: var(--xh-hierarchy-chart-legend-scale-gap, var(--xh-space-2));
247
+ color: var(--xh-fg-muted);
248
+ font-size: var(--xh-text-caption-size);
249
+ font-variant-numeric: tabular-nums;
250
+ }
251
+
252
+ [data-scope='hierarchy-chart'][data-part='legend-scale-name'] {
253
+ color: var(--xh-fg-default);
254
+ font-size: var(--xh-text-body-size);
255
+ }
256
+
257
+ [data-scope='hierarchy-chart'][data-part='legend-scale-bar'] {
258
+ inline-size: var(--xh-hierarchy-chart-legend-scale-width, var(--xh-chart-legend-scale-width));
259
+ block-size: var(--xh-space-2);
260
+ border-radius: var(--xh-hierarchy-chart-legend-scale-bar-radius, var(--xh-shape-inset));
261
+ /* 低端在行首:角度乘方向符号,rtl 下渐变从右往左 */
262
+ background: linear-gradient(calc(90deg * var(--xh-direction-sign)), var(--xh-_hierarchy-scale-from), var(--xh-_chart-seq-mid) 28.6%, var(--xh-_chart-seq-end));
263
+ /* 节点只用色阶上 0.3–1 这一段(最浅的一段压在承载面上看不见):渐变按同一段画,起点即 0.3 处的颜色,
264
+ 中点落在 (0.5 − 0.3) / 0.7 处 */
265
+ --xh-_hierarchy-scale-from: color-mix(in oklch, var(--xh-_chart-seq-mid) 60%, var(--xh-_chart-seq-start));
266
+ }
267
+
268
+ /* 强制色:节点改成系统色的面与描边,名字取正文色;路径的尖角取正文色;色阶只留轮廓;焦点环在配方里 */
269
+ @media (forced-colors: active) {
270
+ [data-scope='hierarchy-chart'][data-part='node'],
271
+ [data-scope='hierarchy-chart'][data-part='node'][data-seg] {
272
+ fill: Canvas;
273
+ stroke: CanvasText;
274
+ stroke-width: var(--xh-stroke-thin);
275
+ }
276
+
277
+ [data-scope='hierarchy-chart'][data-part='node-label'],
278
+ [data-scope='hierarchy-chart'][data-part='group-header'] {
279
+ fill: CanvasText;
280
+ }
281
+
282
+ [data-scope='hierarchy-chart'][data-part='path-item'] + [data-scope='hierarchy-chart'][data-part='path-item']::before {
283
+ forced-color-adjust: none;
284
+ background-color: CanvasText;
285
+ }
286
+
287
+ /* 色阶在系统色下画不出来:只留轮廓,两端的值照常可读 */
288
+ [data-scope='hierarchy-chart'][data-part='legend-scale-bar'] {
289
+ border: var(--xh-stroke-thin) solid CanvasText;
290
+ background: Canvas;
291
+ }
292
+ }
293
+
294
+ /* 色阶声明了 display:作者写 hidden 时照样收起 */
295
+ [data-scope='hierarchy-chart'][data-part='legend-scale'][hidden] {
296
+ display: none;
297
+ }
298
+ }
@@ -7,6 +7,7 @@
7
7
 
8
8
  /* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
9
9
  @import '../family/motion.css';
10
+ @import '../family/material.css';
10
11
 
11
12
  @layer xihan.components {
12
13
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
@@ -92,9 +93,37 @@
92
93
  --xh-_overlay-enter-left: 1;
93
94
  }
94
95
 
96
+ /* 交叉轴原点按对齐取:start / end 对齐时卡片与锚点在那一端齐平,缩放从那一端涨开,贴着短链接的卡片
97
+ 才像是从链接里长出来;居中对齐留在中线。上下两侧的 start / end 是行内轴上的逻辑对齐,RTL 下起始缘在右;
98
+ 左右两侧的 start / end 落在块轴上,不随书写方向翻 */
99
+ /* 起始缘与末尾缘按就近的书写方向取:LTR 起始在左,RTL 起始在右 */
100
+ [data-scope='hover-card'][data-part='positioner']:is([data-placement='top-start'], [data-placement='bottom-start']) {
101
+ --xh-_overlay-origin-x: var(--xh-direction-start);
102
+ }
103
+
104
+ [data-scope='hover-card'][data-part='positioner']:is([data-placement='top-end'], [data-placement='bottom-end']) {
105
+ --xh-_overlay-origin-x: var(--xh-direction-end);
106
+ }
107
+
108
+ [data-scope='hover-card'][data-part='positioner']:is([data-placement='left-start'], [data-placement='right-start']) {
109
+ --xh-_overlay-origin-y: 0;
110
+ }
111
+
112
+ [data-scope='hover-card'][data-part='positioner']:is([data-placement='left-end'], [data-placement='right-end']) {
113
+ --xh-_overlay-origin-y: 100%;
114
+ }
115
+
95
116
  /* 与 tooltip 不同:卡片本体承载交互,必须吃指针——
96
117
  指针停在卡片上就不该收起,里面的链接与按钮也要点得到 */
97
118
  [data-scope='hover-card'][data-part='content'] {
119
+ /* 材质由家族配方画(family/material.css 的 frosted 面:描边、底、1px 顶光、前景、投影与背景滤镜),
120
+ 这里只把使用者槽接进来 */
121
+ --xh-frosted-bg: var(--xh-hover-card-bg, var(--xh-_material-bg));
122
+ --xh-frosted-border: var(--xh-hover-card-border, var(--xh-_material-border));
123
+ --xh-frosted-fg: var(--xh-hover-card-fg, var(--xh-_material-fg));
124
+ --xh-frosted-shadow: var(--xh-hover-card-shadow, var(--xh-_material-shadow));
125
+ --xh-frosted-backdrop: var(--xh-hover-card-backdrop, var(--xh-_material-backdrop));
126
+
98
127
  /* 尺寸档只换这两个私有槽。size 落在 content 上而非 root:root 是可选部件,
99
128
  面板几何也长在 content 上。语气不接:卡片是内容容器,语气该由里面的内容表达 */
100
129
  --xh-_hover-card-pad: var(--xh-surface-pad-md);
@@ -114,20 +143,7 @@
114
143
  overscroll-behavior: contain;
115
144
  padding-block: var(--xh-hover-card-py, var(--xh-_hover-card-pad));
116
145
  padding-inline: var(--xh-hover-card-px, var(--xh-_hover-card-pad));
117
- border: var(--xh-stroke-thin) solid var(--xh-hover-card-border, var(--xh-material-frosted-border));
118
146
  border-radius: var(--xh-hover-card-radius, var(--xh-shape-overlay));
119
- /* 与气泡族共用 M2:顶光只占一像素,正文保持实体,只在内容层采样一次背景。 */
120
- background:
121
- linear-gradient(
122
- to bottom,
123
- var(--xh-material-frosted-highlight) 0 var(--xh-stroke-thin),
124
- transparent var(--xh-stroke-thin)
125
- ),
126
- var(--xh-hover-card-bg, var(--xh-material-frosted-bg));
127
- color: var(--xh-hover-card-fg, var(--xh-material-frosted-fg));
128
- box-shadow: var(--xh-hover-card-shadow, var(--xh-material-frosted-shadow));
129
- -webkit-backdrop-filter: var(--xh-hover-card-backdrop, var(--xh-material-frosted-backdrop));
130
- backdrop-filter: var(--xh-hover-card-backdrop, var(--xh-material-frosted-backdrop));
131
147
  pointer-events: auto;
132
148
  /* 进退场的缩放锚在贴着锚点的那条边上;两个分量由 positioner 按 placement 写进私有槽 */
133
149
  transform-origin: var(--xh-_overlay-origin-x, 50%) var(--xh-_overlay-origin-y, 50%);
@@ -144,7 +160,8 @@
144
160
  outline: none;
145
161
  }
146
162
 
147
- [data-scope='hover-card'][data-part='content'][data-state='open'] {
163
+ /* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
164
+ [data-scope='hover-card'][data-part='content'][data-state='open']:not([data-instant]) {
148
165
  animation: xh-overlay-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
149
166
  }
150
167
 
package/css/icon.css CHANGED
@@ -122,4 +122,104 @@
122
122
  [data-scope='icon'][data-part='root'][data-flip='both'] {
123
123
  scale: -1 -1;
124
124
  }
125
+
126
+ /* —— 底框 —— */
127
+ /*
128
+ * 加了框的图标是一个定直径的圆底座:框画在 <svg> 自己的盒上,图元落在内容盒里居中。
129
+ * sm / md / lg 三档框与头像同档(取同一支控件高度令牌),图元按自己的档位取字形直径,
130
+ * 内衬由两者之差算出,框换档时图元跟着一起换。
131
+ * 框里的图元不读外层统一图元直径的通道 --xh-icon-size:框自己就是一个定尺对象,
132
+ * 落在按钮、提示条这类下发图元直径的容器里也不被改小。
133
+ * 排在档位与语气之后:框接管了盒的尺寸与配色。
134
+ */
135
+ [data-scope='icon'][data-part='root'][data-frame] {
136
+ /* 三档之外的档位经两支 step 槽给出字形直径与框直径,三档本身在下面的档位块里换 */
137
+ --xh-_icon-glyph: var(--xh-icon-frame-glyph-size, var(--xh-_icon-glyph-step, var(--xh-glyph-size-md)));
138
+ --xh-_icon-frame-size: var(--xh-icon-frame-size, var(--xh-_icon-frame-step, var(--xh-control-h-md)));
139
+
140
+ inline-size: var(--xh-_icon-frame-size);
141
+ block-size: var(--xh-_icon-frame-size);
142
+ padding: calc((var(--xh-_icon-frame-size) - var(--xh-_icon-glyph)) / 2 - var(--xh-stroke-thin));
143
+ border: var(--xh-stroke-thin) solid transparent;
144
+ border-radius: var(--xh-icon-frame-radius, var(--xh-shape-circle));
145
+ }
146
+
147
+ [data-scope='icon'][data-part='root'][data-frame][data-size='sm'] {
148
+ --xh-_icon-glyph: var(--xh-icon-frame-glyph-size, var(--xh-glyph-size-sm));
149
+ --xh-_icon-frame-size: var(--xh-icon-frame-size, var(--xh-control-h-sm));
150
+ }
151
+
152
+ [data-scope='icon'][data-part='root'][data-frame][data-size='lg'] {
153
+ --xh-_icon-glyph: var(--xh-icon-frame-glyph-size, var(--xh-glyph-size-lg));
154
+ --xh-_icon-frame-size: var(--xh-icon-frame-size, var(--xh-control-h-lg));
155
+ }
156
+
157
+ /* 头像只有三档;其余档的框沿用 md 档的内衬厚度:框直径 = 本档字形 + md 档框与字形之差 */
158
+ [data-scope='icon'][data-part='root'][data-frame][data-size='text'] {
159
+ --xh-_icon-glyph-step: var(--xh-glyph-size-text);
160
+ --xh-_icon-frame-step: calc(var(--xh-glyph-size-text) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
161
+ }
162
+
163
+ [data-scope='icon'][data-part='root'][data-frame][data-size='xl'] {
164
+ --xh-_icon-glyph-step: var(--xh-glyph-size-xl);
165
+ --xh-_icon-frame-step: calc(var(--xh-glyph-size-xl) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
166
+ }
167
+
168
+ [data-scope='icon'][data-part='root'][data-frame][data-size='2xl'] {
169
+ --xh-_icon-glyph-step: var(--xh-glyph-size-2xl);
170
+ --xh-_icon-frame-step: calc(var(--xh-glyph-size-2xl) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
171
+ }
172
+
173
+ [data-scope='icon'][data-part='root'][data-frame][data-size='3xl'] {
174
+ --xh-_icon-glyph-step: var(--xh-glyph-size-3xl);
175
+ --xh-_icon-frame-step: calc(var(--xh-glyph-size-3xl) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
176
+ }
177
+
178
+ [data-scope='icon'][data-part='root'][data-frame][data-size='4xl'] {
179
+ --xh-_icon-glyph-step: var(--xh-glyph-size-4xl);
180
+ --xh-_icon-frame-step: calc(var(--xh-glyph-size-4xl) + var(--xh-control-h-md) - var(--xh-glyph-size-md));
181
+ }
182
+
183
+ /* 框的四种形态只决定颜色怎么用;用哪族颜色由 data-tone 决定,没写语气取品牌实心 / 中性。
184
+ 语气只认自己身上的 data-tone:语气槽会沿继承流下来,放在语气容器里的框不跟着改色。
185
+ 实心档在顶边画一条极浅的内高光,把这块底座衬出厚度;另外三档面上没有实心底,不画 */
186
+ [data-scope='icon'][data-part='root'][data-frame='solid'] {
187
+ background: var(--xh-icon-frame-bg, var(--xh-bg-brand));
188
+ box-shadow: var(--xh-icon-frame-shadow, var(--xh-_highlight-brand));
189
+ color: var(--xh-icon-fg, var(--xh-fg-on-brand));
190
+ }
191
+
192
+ [data-scope='icon'][data-part='root'][data-frame='solid'][data-tone] {
193
+ background: var(--xh-icon-frame-bg, var(--xh-_tone));
194
+ box-shadow: var(--xh-icon-frame-shadow, var(--xh-_highlight-tone));
195
+ color: var(--xh-icon-fg, var(--xh-_tone-on));
196
+ }
197
+
198
+ [data-scope='icon'][data-part='root'][data-frame='subtle'] {
199
+ background: var(--xh-icon-frame-bg, var(--xh-bg-subtle));
200
+ color: var(--xh-icon-fg, var(--xh-fg-default));
201
+ }
202
+
203
+ [data-scope='icon'][data-part='root'][data-frame='subtle'][data-tone] {
204
+ background: var(--xh-icon-frame-bg, var(--xh-_tone-subtle));
205
+ color: var(--xh-icon-fg, var(--xh-_tone-fg));
206
+ }
207
+
208
+ [data-scope='icon'][data-part='root'][data-frame='outline'] {
209
+ border-color: var(--xh-icon-frame-border, var(--xh-border-default));
210
+ color: var(--xh-icon-fg, var(--xh-fg-default));
211
+ }
212
+
213
+ [data-scope='icon'][data-part='root'][data-frame='outline'][data-tone] {
214
+ border-color: var(--xh-icon-frame-border, var(--xh-_tone-border));
215
+ color: var(--xh-icon-fg, var(--xh-_tone-fg));
216
+ }
217
+
218
+ [data-scope='icon'][data-part='root'][data-frame='ghost'] {
219
+ color: var(--xh-icon-fg, var(--xh-fg-default));
220
+ }
221
+
222
+ [data-scope='icon'][data-part='root'][data-frame='ghost'][data-tone] {
223
+ color: var(--xh-icon-fg, var(--xh-_tone-fg));
224
+ }
125
225
  }
@@ -5,6 +5,8 @@
5
5
 
6
6
  /* 定义 image cropper 样式。 */
7
7
 
8
+ @import '../family/action-control.css';
9
+
8
10
  @layer xihan.components {
9
11
  /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
12
  [data-scope='image-cropper'] {
@@ -90,17 +92,17 @@
90
92
  linear-gradient(
91
93
  to right,
92
94
  transparent 0 33.3333%,
93
- var(--xh-image-cropper-grid-line, var(--xh-border-subtle)) 33.3333% calc(33.3333% + var(--xh-_image-cropper-grid-w)),
95
+ var(--xh-image-cropper-grid-line, var(--xh-bg-subtle-opaque)) 33.3333% calc(33.3333% + var(--xh-_image-cropper-grid-w)),
94
96
  transparent calc(33.3333% + var(--xh-_image-cropper-grid-w)) 66.6667%,
95
- var(--xh-image-cropper-grid-line, var(--xh-border-subtle)) 66.6667% calc(66.6667% + var(--xh-_image-cropper-grid-w)),
97
+ var(--xh-image-cropper-grid-line, var(--xh-bg-subtle-opaque)) 66.6667% calc(66.6667% + var(--xh-_image-cropper-grid-w)),
96
98
  transparent calc(66.6667% + var(--xh-_image-cropper-grid-w)) 100%
97
99
  ),
98
100
  linear-gradient(
99
101
  to bottom,
100
102
  transparent 0 33.3333%,
101
- var(--xh-image-cropper-grid-line, var(--xh-border-subtle)) 33.3333% calc(33.3333% + var(--xh-_image-cropper-grid-w)),
103
+ var(--xh-image-cropper-grid-line, var(--xh-bg-subtle-opaque)) 33.3333% calc(33.3333% + var(--xh-_image-cropper-grid-w)),
102
104
  transparent calc(33.3333% + var(--xh-_image-cropper-grid-w)) 66.6667%,
103
- var(--xh-image-cropper-grid-line, var(--xh-border-subtle)) 66.6667% calc(66.6667% + var(--xh-_image-cropper-grid-w)),
105
+ var(--xh-image-cropper-grid-line, var(--xh-bg-subtle-opaque)) 66.6667% calc(66.6667% + var(--xh-_image-cropper-grid-w)),
104
106
  transparent calc(66.6667% + var(--xh-_image-cropper-grid-w)) 100%
105
107
  );
106
108
  pointer-events: none;
@@ -133,7 +135,7 @@
133
135
  background: var(--xh-_image-cropper-handle-color);
134
136
  pointer-events: none;
135
137
  transition:
136
- background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
138
+ background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
137
139
  border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
138
140
  }
139
141
 
@@ -145,9 +147,10 @@
145
147
  content: '';
146
148
  }
147
149
 
148
- /* 把手静息是白面(bg-surface),悬停从同一语义面派生一档,不切到品牌淡底;拖动中才是品牌实心 */
150
+ /* 把手静息是白面(bg-surface),悬停从同一语义面派生一档,不切到品牌淡底;拖动中才是品牌实心。
151
+ 把手与网格线都压在照片上,取淡底的不透明档,照片深浅不一时才看得见 */
149
152
  [data-scope='image-cropper'][data-part='crop-handle']:hover:not([data-disabled], [data-readonly]) {
150
- --xh-_image-cropper-handle-color: var(--xh-image-cropper-handle-bg-hover, var(--xh-bg-subtle));
153
+ --xh-_image-cropper-handle-color: var(--xh-image-cropper-handle-bg-hover, var(--xh-bg-subtle-opaque));
151
154
  }
152
155
 
153
156
  [data-scope='image-cropper'][data-part='crop-handle'][data-resizing] {
@@ -327,6 +330,29 @@
327
330
  accent-color: var(--xh-image-cropper-slider-accent, var(--xh-bg-brand));
328
331
  }
329
332
 
333
+ /*
334
+ * 翻转按钮是裁切器旁的独立开关钮:盒型、sm 档几何、outline 四态面、0.97 按压与粗指针命中区由家族配方
335
+ * 按连接层投影的 data-xh-action-* 给出。翻着(data-state='on')是无滑块开关的选中面:品牌淡底 12 → 悬停 20
336
+ * → 按压 28,前景 fg-on-brand-subtle;outline 的描边不换,淡底面上没有描边就与悬停面分不开。
337
+ */
338
+ [data-scope='image-cropper'][data-part='flip-trigger'] {
339
+ /* 作者塞进来的图标随档取字形尺(sm = 16px) */
340
+ --xh-icon-size: var(--xh-_action-profile-glyph-size);
341
+ }
342
+
343
+ [data-scope='image-cropper'][data-part='flip-trigger'][data-state='on'] {
344
+ --xh-action-bg-rest: var(--xh-bg-brand-subtle);
345
+ --xh-action-bg-hover: var(--xh-bg-brand-subtle-hover);
346
+ --xh-action-bg-pressed: var(--xh-bg-brand-subtle-active);
347
+ --xh-action-bg-focus-visible: var(--xh-bg-brand-subtle);
348
+ /* 翻着又被禁用:底色掺一半中性面,选中信息不丢。掺的是淡底的不透明档,墨色淡底半透明 */
349
+ --xh-action-bg-disabled: color-mix(in oklab, var(--xh-bg-brand-subtle) 50%, var(--xh-bg-subtle-opaque));
350
+ --xh-action-fg-rest: var(--xh-fg-on-brand-subtle);
351
+ --xh-action-fg-hover: var(--xh-fg-on-brand-subtle);
352
+ --xh-action-fg-pressed: var(--xh-fg-on-brand-subtle);
353
+ --xh-action-fg-focus-visible: var(--xh-fg-on-brand-subtle);
354
+ }
355
+
330
356
  /* 禁用的整体压暗只做一次,落在最外层:视口、裁切框、把手各自再叠一层会越叠越黑。
331
357
  这里只用 opacity、不换前景色:框里是图像,没有文字可换。 */
332
358
  [data-scope='image-cropper'][data-part='root'][data-disabled] {