@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,480 @@
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
+ /* AUTO-GENERATED by build/chart-recipe.mjs — do not edit. */
7
+
8
+ /* 转圈与淡入关键帧由 motion.css 提供:引入本配方的图表皮肤同时 @import 它;家族文件之间不互相引入,
9
+ 全量入口里每份家族只内联一次。 */
10
+ @layer xihan.components {
11
+ /* 根不画外边、不填底,透出宿主面;需要框时由作者放进 Card。提示框按根的内边距盒绝对定位,参照系就是它;
12
+ 它抬的那一层只在根里排序。图随容器铺满:在 flex / grid 里也不按内容收缩成默认的 300px */
13
+ [data-xh-chart-part='root'] {
14
+ position: relative;
15
+ isolation: isolate;
16
+ display: flex;
17
+ flex-direction: column;
18
+ gap: var(--xh-_chart-gap);
19
+ inline-size: 100%;
20
+ margin: 0;
21
+ min-inline-size: 0;
22
+ color: var(--xh-fg-default);
23
+ font-size: var(--xh-text-body-size);
24
+ --xh-_chart-seq-start: var(--xh-chart-sequential-start);
25
+ --xh-_chart-seq-mid: var(--xh-chart-sequential-mid);
26
+ --xh-_chart-seq-end: var(--xh-chart-sequential-end);
27
+ }
28
+
29
+ /* 顺序色阶的色板:换到基础色板里同名的色相上。起点按承载面、终点按正文色兑出,亮暗主题下都是由浅入深地
30
+ 远离承载面;按值着色的标记与色阶图例都从这三个锚点取色 */
31
+ [data-xh-chart-part='root'][data-palette] {
32
+ --xh-_chart-seq-start: color-mix(in oklab, var(--xh-_chart-palette) 16%, var(--xh-chart-surface));
33
+ --xh-_chart-seq-mid: var(--xh-_chart-palette);
34
+ --xh-_chart-seq-end: color-mix(in oklab, var(--xh-_chart-palette) 55%, var(--xh-fg-default));
35
+ }
36
+
37
+ [data-xh-chart-part='root'][data-palette='red'] {
38
+ --xh-_chart-palette: var(--xh-color-red-500);
39
+ }
40
+
41
+ [data-xh-chart-part='root'][data-palette='orange'] {
42
+ --xh-_chart-palette: var(--xh-color-orange-500);
43
+ }
44
+
45
+ [data-xh-chart-part='root'][data-palette='amber'] {
46
+ --xh-_chart-palette: var(--xh-color-amber-500);
47
+ }
48
+
49
+ [data-xh-chart-part='root'][data-palette='yellow'] {
50
+ --xh-_chart-palette: var(--xh-color-yellow-500);
51
+ }
52
+
53
+ [data-xh-chart-part='root'][data-palette='lime'] {
54
+ --xh-_chart-palette: var(--xh-color-lime-500);
55
+ }
56
+
57
+ [data-xh-chart-part='root'][data-palette='green'] {
58
+ --xh-_chart-palette: var(--xh-color-green-500);
59
+ }
60
+
61
+ [data-xh-chart-part='root'][data-palette='teal'] {
62
+ --xh-_chart-palette: var(--xh-color-teal-500);
63
+ }
64
+
65
+ [data-xh-chart-part='root'][data-palette='cyan'] {
66
+ --xh-_chart-palette: var(--xh-color-cyan-500);
67
+ }
68
+
69
+ [data-xh-chart-part='root'][data-palette='blue'] {
70
+ --xh-_chart-palette: var(--xh-color-blue-500);
71
+ }
72
+
73
+ [data-xh-chart-part='root'][data-palette='indigo'] {
74
+ --xh-_chart-palette: var(--xh-color-indigo-500);
75
+ }
76
+
77
+ [data-xh-chart-part='root'][data-palette='purple'] {
78
+ --xh-_chart-palette: var(--xh-color-purple-500);
79
+ }
80
+
81
+ [data-xh-chart-part='root'][data-palette='pink'] {
82
+ --xh-_chart-palette: var(--xh-color-pink-500);
83
+ }
84
+
85
+ [data-xh-chart-part='root'][data-palette='gray'] {
86
+ --xh-_chart-palette: var(--xh-color-neutral-500);
87
+ }
88
+
89
+ [data-xh-chart-part='caption'] {
90
+ font-size: var(--xh-text-label-size);
91
+ font-weight: var(--xh-text-label-weight);
92
+ color: var(--xh-fg-default);
93
+ }
94
+
95
+ /* 视口的块尺寸含坐标轴与标签带,宽度铺满;卡片里不出现嵌套的纵向滚动。它是尺寸观测的宿主 */
96
+ [data-xh-chart-part='viewport'] {
97
+ position: relative;
98
+ inline-size: 100%;
99
+ block-size: var(--xh-_chart-height);
100
+ min-inline-size: 0;
101
+ }
102
+
103
+ /* 重取数据:保留上一帧,整体淡下去,不闪骨架、不跳布局 */
104
+ [data-xh-chart-part='root'][data-loading] > [data-xh-chart-part='viewport'] {
105
+ opacity: var(--xh-chart-pending-alpha);
106
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
107
+ }
108
+
109
+ /* 绘图区脱离文档流:svg 的 width 属性来自测得的视口宽,留在流里会反过来撑住视口,容器收窄时图不跟着缩。
110
+ 斜排的刻度标签与外侧标签会伸出盒子,不裁;焦点环由 focus-ring 部件画在标记外,不靠 SVG 元素自己的 outline */
111
+ [data-xh-chart-part='plot'] {
112
+ position: absolute;
113
+ inset: 0;
114
+ display: block;
115
+ inline-size: 100%;
116
+ block-size: 100%;
117
+ overflow: visible;
118
+ font-size: var(--xh-_chart-metric-font-size);
119
+ font-variant-numeric: tabular-nums;
120
+ outline: none;
121
+ }
122
+
123
+ [data-xh-chart-part='plot'] [tabindex] {
124
+ outline: none;
125
+ }
126
+
127
+ [data-xh-chart-part='focus-ring'] {
128
+ fill: none;
129
+ stroke: var(--xh-ring-focus);
130
+ stroke-width: var(--xh-ring-width);
131
+ }
132
+
133
+ /* 引导线是标注:结构线色的细线,不取系列色;所属的系列或扇区淡出时一起淡出 */
134
+ [data-xh-chart-part='leader-line'] {
135
+ fill: none;
136
+ stroke: var(--xh-chart-axis);
137
+ stroke-width: var(--xh-stroke-thin);
138
+ }
139
+
140
+ [data-xh-chart-part='leader-line'][data-dimmed] {
141
+ opacity: var(--xh-chart-dim-alpha);
142
+ }
143
+
144
+ /* 首次出现:等描线的笔尖或扫开的边缘到了才淡入。连接层写入它占入场时长的比例,乘上入场时长就是延迟,
145
+ 作者改时长、系统开减弱动效时跟着缩放 */
146
+ [data-xh-chart-part='leader-line'][data-drawing] {
147
+ animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) both;
148
+ animation-delay: calc(var(--xh-motion-duration-reveal) * var(--xh-_chart-reveal-at));
149
+ }
150
+
151
+ /* 图例:工具条,项是 Action Control 的 text 档 */
152
+ [data-xh-chart-part='legend'] {
153
+ display: flex;
154
+ flex-wrap: wrap;
155
+ gap: var(--xh-_chart-legend-gap);
156
+ }
157
+
158
+ [data-xh-chart-part='legend-item'] {
159
+ color: var(--xh-fg-default);
160
+ }
161
+
162
+ /* 色标:面(柱、面积、扇区)是 inset 圆角的方块,折线是一段短线;隐藏时只留描边(空心)。
163
+ 方块边长取 12px:inset 圆角是 4px,再小就成了圆点,与散点的符号分不开 */
164
+ [data-xh-chart-part='legend-swatch'] {
165
+ flex: none;
166
+ inline-size: var(--xh-space-3);
167
+ block-size: var(--xh-space-3);
168
+ border: var(--xh-stroke-thick) solid var(--xh-_chart-series);
169
+ border-radius: var(--xh-_chart-legend-swatch-radius);
170
+ background: var(--xh-_chart-series);
171
+ }
172
+
173
+ [data-xh-chart-part='legend-swatch'][data-mark='line'] {
174
+ inline-size: var(--xh-space-3);
175
+ block-size: 0;
176
+ border-width: var(--xh-stroke-thin);
177
+ border-radius: var(--xh-_chart-legend-swatch-line-radius);
178
+ }
179
+
180
+ /* 显隐标记:开是常态,不用品牌淡底;隐藏的项空心色标、次级字色、删除线 */
181
+ [data-xh-chart-part='legend-item'][aria-pressed='false'] {
182
+ color: var(--xh-fg-subtle);
183
+ text-decoration: line-through;
184
+ }
185
+
186
+ [data-xh-chart-part='legend-item'][aria-pressed='false'] > [data-xh-chart-part='legend-swatch'] {
187
+ background: transparent;
188
+ }
189
+
190
+ /* 按值着色的数据:连接层在标记与色标上写段号与段内百分比,这里用一层 color-mix 在相邻两个锚点之间兑出颜色,
191
+ 放进私有槽;各图表的标记从槽里取色,提示框的色标画成数据自己的颜色 */
192
+ [data-xh-chart-part='root'] [data-seg='low'] {
193
+ --xh-_chart-seq-fill: color-mix(in oklch, var(--xh-_chart-seq-mid) var(--xh-_chart-p), var(--xh-_chart-seq-start));
194
+ }
195
+
196
+ [data-xh-chart-part='root'] [data-seg='high'] {
197
+ --xh-_chart-seq-fill: color-mix(in oklch, var(--xh-_chart-seq-end) var(--xh-_chart-p), var(--xh-_chart-seq-mid));
198
+ }
199
+
200
+ [data-xh-chart-part='tooltip-swatch'][data-seg] {
201
+ background: var(--xh-_chart-seq-fill);
202
+ }
203
+
204
+ /* 提示框:frosted 材质,画在根里;绘图区不随 RTL 镜像,这里的左右也是物理方向。正文排版,与根同一档:
205
+ 不反白、不缩字,色标按承载面校准。提示框不接指针:跟着指针走时压住下面的标记,命中就断了 */
206
+ [data-xh-chart-part='tooltip'] {
207
+ position: absolute;
208
+ inset-block-start: var(--xh-_chart-tip-y, 0);
209
+ /* stylelint-disable-next-line property-disallowed-list -- 绘图区不随 RTL 镜像,锚点横坐标由连接层按物理左缘写入 */
210
+ left: var(--xh-_chart-tip-x, 0);
211
+ z-index: 1;
212
+ display: grid;
213
+ gap: var(--xh-_chart-tooltip-gap);
214
+ min-inline-size: 8rem;
215
+ padding-block: var(--xh-_chart-tooltip-py);
216
+ padding-inline: var(--xh-_chart-tooltip-px);
217
+ border: var(--xh-stroke-thin) solid var(--xh-material-frosted-border);
218
+ border-radius: var(--xh-_chart-tooltip-radius);
219
+ background:
220
+ linear-gradient(
221
+ to bottom,
222
+ var(--xh-material-frosted-highlight) 0 var(--xh-stroke-thin),
223
+ transparent var(--xh-stroke-thin)
224
+ ),
225
+ var(--xh-material-frosted-bg);
226
+ color: var(--xh-material-frosted-fg);
227
+ box-shadow: var(--xh-_chart-tooltip-shadow);
228
+ -webkit-backdrop-filter: var(--xh-material-frosted-backdrop);
229
+ backdrop-filter: var(--xh-material-frosted-backdrop);
230
+ font-size: var(--xh-text-body-size);
231
+ white-space: nowrap;
232
+ pointer-events: none;
233
+ translate: var(--xh-space-3) calc(-100% - var(--xh-space-2));
234
+ }
235
+
236
+ /* 落点:锚点在右半边时长在左侧,在上半边时向下长 */
237
+ [data-xh-chart-part='tooltip'][data-placement='top-left'] {
238
+ translate: calc(-100% - var(--xh-space-3)) calc(-100% - var(--xh-space-2));
239
+ }
240
+
241
+ [data-xh-chart-part='tooltip'][data-placement='bottom-right'] {
242
+ translate: var(--xh-space-3) var(--xh-space-2);
243
+ }
244
+
245
+ [data-xh-chart-part='tooltip'][data-placement='bottom-left'] {
246
+ translate: calc(-100% - var(--xh-space-3)) var(--xh-space-2);
247
+ }
248
+
249
+ /* 露不露是从激活的数据算出来的派生显隐:首次出现淡入,跟着指针移动时不做位置过渡 */
250
+ [data-xh-chart-part='tooltip'][data-state='hidden'] {
251
+ visibility: hidden;
252
+ opacity: 0;
253
+ }
254
+
255
+ [data-xh-chart-part='tooltip'][data-state='visible'] {
256
+ transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
257
+ }
258
+
259
+ [data-xh-chart-part='tooltip-header'] {
260
+ font-weight: var(--xh-font-weight-medium);
261
+ }
262
+
263
+ /* 一行:色标、数值、说明。数值在前并加重,说明在后是次级文字——读者已知系列,要看的是数 */
264
+ [data-xh-chart-part='tooltip-row'] {
265
+ display: flex;
266
+ align-items: center;
267
+ gap: var(--xh-_chart-tooltip-row-gap);
268
+ }
269
+
270
+ [data-xh-chart-part='tooltip-swatch'] {
271
+ flex: none;
272
+ inline-size: var(--xh-space-3);
273
+ block-size: var(--xh-space-3);
274
+ border-radius: var(--xh-_chart-tooltip-swatch-radius);
275
+ background: var(--xh-_chart-series);
276
+ }
277
+
278
+ [data-xh-chart-part='tooltip-swatch'][data-mark='line'] {
279
+ inline-size: var(--xh-space-3);
280
+ block-size: var(--xh-stroke-thick);
281
+ border-radius: var(--xh-_chart-tooltip-swatch-line-radius);
282
+ }
283
+
284
+ [data-xh-chart-part='tooltip-value'] {
285
+ font-weight: var(--xh-font-weight-medium);
286
+ font-variant-numeric: tabular-nums;
287
+ }
288
+
289
+ [data-xh-chart-part='tooltip-name'] {
290
+ color: var(--xh-fg-muted);
291
+ }
292
+
293
+ /* 指针或焦点所在的那个系列:说明升为正文色,一眼找到自己指着的那一行 */
294
+ [data-xh-chart-part='tooltip-row'][data-current] > [data-xh-chart-part='tooltip-name'] {
295
+ color: var(--xh-fg-default);
296
+ }
297
+
298
+ /* 空态叠在视口上,居中 */
299
+ [data-xh-chart-part='empty'] {
300
+ position: absolute;
301
+ inset: 0;
302
+ display: flex;
303
+ align-items: center;
304
+ justify-content: center;
305
+ color: var(--xh-fg-muted);
306
+ font-size: var(--xh-text-secondary-size);
307
+ }
308
+
309
+ /* 取数中、还没有可画的数据:文字前一枚加载环。环由加载环配方画(连接层在空态部件上投影 data-xh-loading-ring 与
310
+ data-loading),与 Spinner 同一副画法,减弱动效与打印停成点线环;这里只给它占的那一格 */
311
+ [data-xh-chart-part='empty'][data-state='loading'] {
312
+ gap: var(--xh-_chart-empty-gap);
313
+ }
314
+
315
+ [data-xh-chart-part='empty'][data-state='loading']::before {
316
+ content: '';
317
+ flex: none;
318
+ inline-size: var(--xh-glyph-size-md);
319
+ block-size: var(--xh-glyph-size-md);
320
+ }
321
+
322
+ /* 声明了 display 的部件:作者写 hidden 时照样收起 */
323
+ [data-xh-chart-part='root'][hidden],
324
+ [data-xh-chart-part='legend'][hidden],
325
+ [data-xh-chart-part='plot'][hidden],
326
+ [data-xh-chart-part='tooltip'][hidden],
327
+ [data-xh-chart-part='tooltip-row'][hidden],
328
+ [data-xh-chart-part='empty'][hidden] {
329
+ display: none;
330
+ }
331
+
332
+ /* 纹理的序号:与 defs 里的纹理一一对应。每个序号给出色标上的纹理(线距按数据点直径换算,与纹理的格子同尺)、
333
+ 折线的线型与色标上的线型(线宽的倍数) */
334
+ [data-xh-chart-pattern='1'] {
335
+ --xh-_chart-hatch: repeating-linear-gradient(135deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 var(--xh-_chart-metric-point-size));
336
+ --xh-_chart-dash: none;
337
+ --xh-_chart-dash-swatch: var(--xh-_chart-series);
338
+ }
339
+
340
+ [data-xh-chart-pattern='2'] {
341
+ --xh-_chart-hatch: repeating-linear-gradient(45deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 var(--xh-_chart-metric-point-size));
342
+ --xh-_chart-dash: calc(var(--xh-_chart-metric-line-width) * 4) calc(var(--xh-_chart-metric-line-width) * 2);
343
+ --xh-_chart-dash-swatch: repeating-linear-gradient(90deg, var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 4), transparent 0 calc(var(--xh-_chart-metric-line-width) * 6));
344
+ }
345
+
346
+ [data-xh-chart-pattern='3'] {
347
+ --xh-_chart-hatch: repeating-linear-gradient(135deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 calc(var(--xh-_chart-metric-point-size) * 0.75));
348
+ --xh-_chart-dash: 0 calc(var(--xh-_chart-metric-line-width) * 2);
349
+ --xh-_chart-dash-swatch: repeating-linear-gradient(90deg, var(--xh-_chart-series) 0 var(--xh-_chart-metric-line-width), transparent 0 calc(var(--xh-_chart-metric-line-width) * 2));
350
+ }
351
+
352
+ [data-xh-chart-pattern='4'] {
353
+ --xh-_chart-hatch: repeating-linear-gradient(45deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 calc(var(--xh-_chart-metric-point-size) * 0.75));
354
+ --xh-_chart-dash: calc(var(--xh-_chart-metric-line-width) * 4) calc(var(--xh-_chart-metric-line-width) * 2) 0 calc(var(--xh-_chart-metric-line-width) * 2);
355
+ --xh-_chart-dash-swatch: repeating-linear-gradient(90deg, var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 4), transparent 0 calc(var(--xh-_chart-metric-line-width) * 6), var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 7), transparent 0 calc(var(--xh-_chart-metric-line-width) * 8));
356
+ }
357
+
358
+ [data-xh-chart-pattern='5'] {
359
+ --xh-_chart-hatch: repeating-linear-gradient(135deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 calc(var(--xh-_chart-metric-point-size) * 0.5));
360
+ --xh-_chart-dash: calc(var(--xh-_chart-metric-line-width) * 2) calc(var(--xh-_chart-metric-line-width) * 2);
361
+ --xh-_chart-dash-swatch: repeating-linear-gradient(90deg, var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 2), transparent 0 calc(var(--xh-_chart-metric-line-width) * 4));
362
+ }
363
+
364
+ [data-xh-chart-pattern='6'] {
365
+ --xh-_chart-hatch: repeating-linear-gradient(45deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 calc(var(--xh-_chart-metric-point-size) * 0.5));
366
+ --xh-_chart-dash: calc(var(--xh-_chart-metric-line-width) * 4) calc(var(--xh-_chart-metric-line-width) * 2) 0 calc(var(--xh-_chart-metric-line-width) * 2) 0 calc(var(--xh-_chart-metric-line-width) * 2);
367
+ --xh-_chart-dash-swatch: repeating-linear-gradient(90deg, var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 4), transparent 0 calc(var(--xh-_chart-metric-line-width) * 6), var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 7), transparent 0 calc(var(--xh-_chart-metric-line-width) * 8), var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 9), transparent 0 calc(var(--xh-_chart-metric-line-width) * 10));
368
+ }
369
+
370
+ [data-xh-chart-pattern='7'] {
371
+ --xh-_chart-hatch: repeating-linear-gradient(135deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 var(--xh-_chart-metric-point-size)), repeating-linear-gradient(45deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 var(--xh-_chart-metric-point-size));
372
+ --xh-_chart-dash: calc(var(--xh-_chart-metric-line-width) * 8) calc(var(--xh-_chart-metric-line-width) * 2);
373
+ --xh-_chart-dash-swatch: repeating-linear-gradient(90deg, var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 8), transparent 0 calc(var(--xh-_chart-metric-line-width) * 10));
374
+ }
375
+
376
+ [data-xh-chart-pattern='8'] {
377
+ --xh-_chart-hatch: repeating-linear-gradient(90deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 var(--xh-_chart-metric-point-size)), repeating-linear-gradient(0deg, var(--xh-_chart-series) 0 var(--xh-stroke-thin), transparent 0 var(--xh-_chart-metric-point-size));
378
+ --xh-_chart-dash: calc(var(--xh-_chart-metric-line-width) * 2) calc(var(--xh-_chart-metric-line-width) * 2) 0 calc(var(--xh-_chart-metric-line-width) * 2);
379
+ --xh-_chart-dash-swatch: repeating-linear-gradient(90deg, var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 2), transparent 0 calc(var(--xh-_chart-metric-line-width) * 4), var(--xh-_chart-series) 0 calc(var(--xh-_chart-metric-line-width) * 5), transparent 0 calc(var(--xh-_chart-metric-line-width) * 6));
380
+ }
381
+
382
+ /* 纹理的线取所属系列色:每个 pattern 带着它的色槽 */
383
+ [data-xh-chart-part='pattern-line'] {
384
+ fill: none;
385
+ stroke: var(--xh-_chart-series);
386
+ stroke-width: var(--xh-stroke-thin);
387
+ }
388
+
389
+ /* 作者在祖先上写 data-xh-chart-patterns 即开启纹理;强制色与打印下总是开启,规则写在下面两个块里 */
390
+ :where([data-xh-chart-patterns]) [data-xh-chart-pattern] > [data-xh-chart-part='legend-swatch'],
391
+ :where([data-xh-chart-patterns]) [data-xh-chart-pattern] > [data-xh-chart-part='tooltip-swatch'] {
392
+ background: var(--xh-_chart-hatch);
393
+ }
394
+
395
+ :where([data-xh-chart-patterns]) [data-xh-chart-pattern] > [data-xh-chart-part='legend-swatch'][data-mark='line'],
396
+ :where([data-xh-chart-patterns]) [data-xh-chart-pattern] > [data-xh-chart-part='tooltip-swatch'][data-mark='line'] {
397
+ inline-size: var(--xh-space-5);
398
+ block-size: var(--xh-_chart-metric-line-width);
399
+ border: none;
400
+ background: var(--xh-_chart-dash-swatch);
401
+ }
402
+
403
+ /* 强制色:焦点环取高亮色,引导线取系统前景色;色标退出强制着色保住形状,填系统前景色;
404
+ 图例隐藏态保留空心与删除线。纹理总是开启,纹理的线与色标上的纹理都取系统前景色 */
405
+ @media (forced-colors: active) {
406
+ [data-xh-chart-part='focus-ring'] {
407
+ stroke: Highlight;
408
+ }
409
+
410
+ [data-xh-chart-part='leader-line'] {
411
+ stroke: CanvasText;
412
+ }
413
+
414
+ [data-xh-chart-part='legend-swatch'],
415
+ [data-xh-chart-part='tooltip-swatch'] {
416
+ forced-color-adjust: none;
417
+ border-color: CanvasText;
418
+ background: CanvasText;
419
+ }
420
+
421
+ [data-xh-chart-part='legend-item'][aria-pressed='false'] > [data-xh-chart-part='legend-swatch'] {
422
+ background: Canvas;
423
+ }
424
+
425
+ [data-xh-chart-part='tooltip'] {
426
+ background-image: none;
427
+ }
428
+
429
+ [data-xh-chart-part='pattern'] {
430
+ forced-color-adjust: none;
431
+ }
432
+
433
+ [data-xh-chart-part='pattern-line'] {
434
+ stroke: CanvasText;
435
+ }
436
+
437
+ [data-xh-chart-part='legend-item'][data-xh-chart-pattern],
438
+ [data-xh-chart-part='tooltip-row'][data-xh-chart-pattern] {
439
+ --xh-_chart-series: CanvasText;
440
+ }
441
+
442
+ [data-xh-chart-pattern] > [data-xh-chart-part='legend-swatch'],
443
+ [data-xh-chart-pattern] > [data-xh-chart-part='tooltip-swatch'] {
444
+ background: var(--xh-_chart-hatch);
445
+ }
446
+
447
+ [data-xh-chart-pattern] > [data-xh-chart-part='legend-swatch'][data-mark='line'],
448
+ [data-xh-chart-pattern] > [data-xh-chart-part='tooltip-swatch'][data-mark='line'] {
449
+ inline-size: var(--xh-space-5);
450
+ block-size: var(--xh-_chart-metric-line-width);
451
+ border: none;
452
+ background: var(--xh-_chart-dash-swatch);
453
+ }
454
+ }
455
+
456
+ /* 打印:纸上没有指针,提示框与焦点环不印;数据色照印,纹理开启 */
457
+ @media print {
458
+ [data-xh-chart-part='root'] {
459
+ print-color-adjust: exact;
460
+ }
461
+
462
+ [data-xh-chart-part='tooltip'],
463
+ [data-xh-chart-part='focus-ring'] {
464
+ display: none;
465
+ }
466
+
467
+ [data-xh-chart-pattern] > [data-xh-chart-part='legend-swatch'],
468
+ [data-xh-chart-pattern] > [data-xh-chart-part='tooltip-swatch'] {
469
+ background: var(--xh-_chart-hatch);
470
+ }
471
+
472
+ [data-xh-chart-pattern] > [data-xh-chart-part='legend-swatch'][data-mark='line'],
473
+ [data-xh-chart-pattern] > [data-xh-chart-part='tooltip-swatch'][data-mark='line'] {
474
+ inline-size: var(--xh-space-5);
475
+ block-size: var(--xh-_chart-metric-line-width);
476
+ border: none;
477
+ background: var(--xh-_chart-dash-swatch);
478
+ }
479
+ }
480
+ }
@@ -0,0 +1,94 @@
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
+ /*
7
+ * 勾选格里的勾与半选杠:Checkbox、CheckboxGroup、Transfer、Table、QuestionFlow 多选共用一份标记语言。
8
+ *
9
+ * 连接层在画标记的节点上投影两位:data-xh-check-mark 是标记的状态(checked / indeterminate / unchecked),
10
+ * data-xh-check-mark-profile 说标记画在哪——
11
+ * box:节点就是方框(或铺满方框的指示器),标记是它的 ::before;作者往节点里放了自己的图形时不画。
12
+ * row:节点是一整行,方框由皮肤画在它的 ::before 上,标记是 ::after,叠在方框正中;
13
+ * 皮肤写两支桥接槽:--xh-check-mark-box-size(方框边长)与 --xh-check-mark-fg(标记色)。
14
+ *
15
+ * 标记常驻,不按状态生成或撤掉:未勾时透明并略缩,勾上时淡入并回到原尺寸——淡变走 micro,
16
+ * 缩放走 nudge,减弱动效下缩放归一、只剩淡变。勾与半选杠叠成两层遮罩,按状态只换两层的尺寸;
17
+ * 离开勾选时尺寸的切换延后一个 micro,淡出途中标记保持原来的形状,半选淡出时不会闪出一枚勾。
18
+ *
19
+ * 尺寸读节点上的 --xh-icon-size(方框边长 × 0.75,由各皮肤按方框的尺改接);
20
+ * 选择器只让 [data-xh-check-mark] 计入特指度,状态与形态包在 :where() 里,皮肤按部件覆盖即可压过。
21
+ */
22
+ @layer xihan.components {
23
+ [data-xh-check-mark]:where([data-xh-check-mark-profile='box']):empty::before,
24
+ [data-xh-check-mark]:where([data-xh-check-mark-profile='row'])::after {
25
+ content: '';
26
+ display: inline-block;
27
+ flex: none;
28
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
29
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
30
+ vertical-align: var(--xh-glyph-baseline-shift);
31
+ background-color: var(--xh-check-mark-fg, currentColor);
32
+ opacity: 0;
33
+ scale: var(--xh-motion-scale-enter);
34
+ pointer-events: none;
35
+ -webkit-mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
36
+ mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
37
+ transition:
38
+ opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
39
+ scale var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong),
40
+ -webkit-mask-size 0s var(--xh-motion-duration-micro),
41
+ mask-size 0s var(--xh-motion-duration-micro);
42
+ }
43
+
44
+ /* 行里的方框是行首那颗 ::before:标记按「方框与标记的边长差之半」内推即落在方框正中,纵向靠
45
+ inset-block: 0 + margin-block: auto 居中。粗指针下 Action Control 在同一个 ::after 上铺的热区
46
+ (起点 50%、44px 下限、-50% 平移)在这里逐项钉回,标记不被拖走、也不被撑大 */
47
+ [data-xh-check-mark]:where([data-xh-check-mark-profile='row'])::after {
48
+ position: absolute;
49
+ inset-block: 0;
50
+ inset-inline-start: 0;
51
+ min-inline-size: 0;
52
+ min-block-size: 0;
53
+ margin-block: auto;
54
+ margin-inline-start: calc(
55
+ (var(--xh-check-mark-box-size, var(--xh-control-indicator-size)) - var(--xh-icon-size, var(--xh-glyph-size-text))) / 2
56
+ );
57
+ translate: none;
58
+ }
59
+
60
+ [data-xh-check-mark]:where([data-xh-check-mark='checked'], [data-xh-check-mark='indeterminate']):where([data-xh-check-mark-profile='box']):empty::before,
61
+ [data-xh-check-mark]:where([data-xh-check-mark='checked'], [data-xh-check-mark='indeterminate']):where([data-xh-check-mark-profile='row'])::after {
62
+ opacity: 1;
63
+ scale: 1;
64
+ transition-delay: 0s;
65
+ }
66
+
67
+ /* 半选:aria-checked=mixed 在视觉上也得与全选分得开,横杠与勾同走字形令牌 */
68
+ [data-xh-check-mark]:where([data-xh-check-mark='indeterminate']):where([data-xh-check-mark-profile='box']):empty::before,
69
+ [data-xh-check-mark]:where([data-xh-check-mark='indeterminate']):where([data-xh-check-mark-profile='row'])::after {
70
+ -webkit-mask-size: 0 0, 100% 100%;
71
+ mask-size: 0 0, 100% 100%;
72
+ }
73
+
74
+ /* 强制色:遮罩保留字形轮廓,标记退出强制换色、直接写系统前景(不能取 currentColor:退出强制换色的伪元素
75
+ 读到的是被系统换掉之前的作者色);禁用取置灰前景。
76
+ 节点自己就是一颗动作控件的方框(Table 的勾选把手):悬停与按下时家族把方框涂成 Highlight,标记跟着换 HighlightText。
77
+ 方框另有实心面的(CheckboxGroup、Transfer 的勾选盒,行档的方框)在这一档里是 Canvas,整行悬停不换面,不在此列 */
78
+ @media (forced-colors: active) {
79
+ [data-xh-check-mark]:where([data-xh-check-mark-profile='box']):empty::before,
80
+ [data-xh-check-mark]:where([data-xh-check-mark-profile='row'])::after {
81
+ forced-color-adjust: none;
82
+ background-color: CanvasText;
83
+ }
84
+
85
+ [data-xh-check-mark][data-xh-action-control]:where([data-xh-check-mark-profile='box']):where(:not([data-disabled]):not([data-loading])):is(:hover, :active, [data-pressed]):empty::before {
86
+ background-color: HighlightText;
87
+ }
88
+
89
+ [data-xh-check-mark]:where([data-disabled]):where([data-xh-check-mark-profile='box']):empty::before,
90
+ [data-xh-check-mark]:where([data-disabled]):where([data-xh-check-mark-profile='row'])::after {
91
+ background-color: GrayText;
92
+ }
93
+ }
94
+ }
@@ -0,0 +1,97 @@
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
+ /*
7
+ * 选择卡片家族配方:RadioGroup 与 CheckboxGroup 的 card 档条目共用一副卡面——一张可点的描边卡,
8
+ * 行首照旧是圆圈 / 方框,文案与说明排在它右侧,整张卡是命中区。
9
+ *
10
+ * 连接层在 card 档条目上投影 data-xh-choice-card,并把 Action Control 的形态换成 outline(row 档照旧:
11
+ * 宽度由容器给、高度随内容、按下只换面不缩放)。配方只管卡面:
12
+ * 形状取 surface(8px),内衬 space-3 / space-4;
13
+ * 未选中是描边卡:透明底 + --xh-border-control,白底承载阶梯 100 → 200,不随语气染色;
14
+ * 选中是「页内持久集合的选中」那一种标记:卡面换品牌淡底 12 → 悬停 20 → 按压 28、前景 fg-on-brand-subtle,
15
+ * 写了 data-tone 时换成语气淡底;描边不换,行首的圆点 / 勾照常表达选中;
16
+ * 只读不给悬停与按下面,选中面照常;禁用走家族禁用面,选中又禁用时底色掺一半中性面,选中信息不丢。
17
+ *
18
+ * 选择器带上 [data-scope][data-part]:皮肤里条目的基础规则写的是 (0,2,0),配方排在皮肤之前,
19
+ * 同权重时皮肤赢;卡面要压过列表档的那几条(边归零、内衬归零、圆角取 control)。
20
+ */
21
+ @layer xihan.components {
22
+ [data-scope][data-part][data-xh-choice-card] {
23
+ --xh-action-radius: var(--xh-shape-surface);
24
+ --xh-action-padding-inline: var(--xh-space-4);
25
+ --xh-action-padding-block: var(--xh-space-3);
26
+ --xh-action-bg-rest: transparent;
27
+ --xh-action-bg-hover: var(--xh-bg-subtle);
28
+ --xh-action-bg-pressed: var(--xh-bg-subtle-hover);
29
+ --xh-action-bg-focus-visible: transparent;
30
+ --xh-action-bg-disabled: var(--xh-bg-subtle);
31
+ --xh-action-border-rest: var(--xh-border-control);
32
+ --xh-action-border-hover: var(--xh-border-control-hover);
33
+ --xh-action-border-pressed: var(--xh-border-control-hover);
34
+ --xh-action-border-focus-visible: var(--xh-border-control);
35
+ --xh-action-border-disabled: var(--xh-border-default);
36
+
37
+ /* 行首标记一列、文案一列;说明落在文案下方同一列(皮肤给说明写 grid-column: 2) */
38
+ display: grid;
39
+ grid-template-columns: auto minmax(0, 1fr);
40
+ align-items: center;
41
+ row-gap: var(--xh-space-1);
42
+ border-width: var(--xh-stroke-thin);
43
+ line-height: var(--xh-leading-normal);
44
+ }
45
+
46
+ [data-scope][data-part][data-xh-choice-card][data-state='checked'] {
47
+ --xh-action-bg-rest: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
48
+ --xh-action-bg-hover: var(--xh-_tone-subtle-hover, var(--xh-bg-brand-subtle-hover));
49
+ --xh-action-bg-pressed: var(--xh-_tone-subtle-active, var(--xh-bg-brand-subtle-active));
50
+ --xh-action-bg-focus-visible: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
51
+ /* 掺的是淡底的不透明档:墨色淡底半透明,掺进去整块面会跟着变半透明 */
52
+ --xh-action-bg-disabled: color-mix(in oklab, var(--xh-_tone-subtle, var(--xh-bg-brand-subtle)) 50%, var(--xh-bg-subtle-opaque));
53
+ --xh-action-fg-rest: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
54
+ --xh-action-fg-hover: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
55
+ --xh-action-fg-pressed: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
56
+ --xh-action-fg-focus-visible: var(--xh-_tone-fg, var(--xh-fg-on-brand-subtle));
57
+ }
58
+
59
+ /* 只读改不动:悬停与按下都停在静息面上(选中卡仍是淡底),收回可点的手型 */
60
+ [data-scope][data-part][data-xh-choice-card][data-readonly]:not([data-disabled]) {
61
+ --xh-action-bg-hover: transparent;
62
+ --xh-action-bg-pressed: transparent;
63
+ --xh-action-border-hover: var(--xh-border-control);
64
+ --xh-action-border-pressed: var(--xh-border-control);
65
+ --xh-action-cursor-rest: default;
66
+ --xh-action-cursor-hover: default;
67
+ --xh-action-cursor-pressed: default;
68
+ --xh-action-cursor-focus-visible: default;
69
+ }
70
+
71
+ [data-scope][data-part][data-xh-choice-card][data-readonly][data-state='checked']:not([data-disabled]) {
72
+ --xh-action-bg-hover: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
73
+ --xh-action-bg-pressed: var(--xh-_tone-subtle, var(--xh-bg-brand-subtle));
74
+ }
75
+
76
+ /* 卡面本身已够大:粗指针下不再把命中区外扩到 44px 高,外扩会压进相邻的卡 */
77
+ @media (pointer: coarse) {
78
+ [data-scope][data-part][data-xh-choice-card]::after {
79
+ min-block-size: 0;
80
+ }
81
+ }
82
+
83
+ /* 强制色:底色一律换成 Canvas,选中卡的淡底看不见了,描边换系统高亮色表出选中 */
84
+ @media (forced-colors: active) {
85
+ [data-scope][data-part][data-xh-choice-card][data-state='checked'] {
86
+ border-color: Highlight;
87
+ }
88
+ }
89
+
90
+ /* 打印丢底色:选中卡的淡底落不到纸上,描边加粗一档表出选中 */
91
+ @media print {
92
+ [data-scope][data-part][data-xh-choice-card][data-state='checked'] {
93
+ border-width: var(--xh-stroke-thick);
94
+ border-color: currentColor;
95
+ }
96
+ }
97
+ }