@xihan-ui/styles 3.0.0 → 3.2.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 (221) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +1 -1
  3. package/component-tokens.d.ts +29 -0
  4. package/components.tokens.json +683 -27
  5. package/css/alert.css +2 -2
  6. package/css/approval.css +4 -4
  7. package/css/button.css +9 -5
  8. package/css/calendar-picker.css +3 -3
  9. package/css/calendar-range-picker.css +7 -7
  10. package/css/carousel.css +45 -13
  11. package/css/cartesian-chart.css +11 -11
  12. package/css/cascader.css +10 -10
  13. package/css/citation.css +2 -2
  14. package/css/code-view.css +6 -6
  15. package/css/color-picker.css +81 -0
  16. package/css/color-swatch-picker.css +9 -4
  17. package/css/combobox.css +12 -4
  18. package/css/command.css +1 -1
  19. package/css/date-field.css +39 -0
  20. package/css/date-picker.css +86 -9
  21. package/css/date-range-picker.css +47 -7
  22. package/css/diff-view.css +8 -8
  23. package/css/field-array.css +1 -1
  24. package/css/field.css +4 -0
  25. package/css/file-upload.css +1 -1
  26. package/css/float-button.css +140 -27
  27. package/css/form.css +14 -6
  28. package/css/graph-chart.css +2 -2
  29. package/css/highlight.css +1 -1
  30. package/css/image.css +1 -1
  31. package/css/mention.css +1 -1
  32. package/css/message-feed.css +1 -1
  33. package/css/notification.css +26 -20
  34. package/css/number-field.css +18 -18
  35. package/css/page-header.css +2 -2
  36. package/css/password-input.css +2 -2
  37. package/css/popconfirm.css +3 -3
  38. package/css/question-flow.css +8 -8
  39. package/css/radar-chart.css +6 -6
  40. package/css/rating.css +1 -1
  41. package/css/select.css +2 -2
  42. package/css/separator.css +2 -2
  43. package/css/side-nav.css +13 -13
  44. package/css/skeleton.css +5 -5
  45. package/css/slider.css +6 -6
  46. package/css/sortable.css +2 -2
  47. package/css/table.css +19 -2
  48. package/css/tags-input.css +1 -1
  49. package/css/time-picker.css +59 -2
  50. package/css/tool-call.css +7 -7
  51. package/css/tooltip.css +1 -1
  52. package/css/tree-select.css +2 -2
  53. package/css/tree.css +81 -11
  54. package/dist/css/accordion.css +269 -0
  55. package/dist/css/affix.css +47 -0
  56. package/dist/css/alert.css +247 -0
  57. package/dist/css/anchor.css +252 -0
  58. package/dist/css/approval.css +501 -0
  59. package/dist/css/avatar-group.css +99 -0
  60. package/dist/css/avatar.css +98 -0
  61. package/dist/css/back-top.css +161 -0
  62. package/dist/css/badge.css +205 -0
  63. package/dist/css/bar-code.css +62 -0
  64. package/dist/css/breadcrumb.css +230 -0
  65. package/dist/css/button-group.css +263 -0
  66. package/dist/css/button.css +219 -0
  67. package/dist/css/calendar-picker.css +467 -0
  68. package/dist/css/calendar-range-picker.css +554 -0
  69. package/dist/css/card.css +221 -0
  70. package/dist/css/carousel.css +710 -0
  71. package/dist/css/cartesian-chart.css +830 -0
  72. package/dist/css/cascader.css +961 -0
  73. package/dist/css/checkbox-group.css +358 -0
  74. package/dist/css/checkbox.css +257 -0
  75. package/dist/css/citation.css +470 -0
  76. package/dist/css/clipboard.css +315 -0
  77. package/dist/css/code-view.css +374 -0
  78. package/dist/css/collapsible.css +185 -0
  79. package/dist/css/color-field.css +176 -0
  80. package/dist/css/color-picker.css +595 -0
  81. package/dist/css/color-slider.css +281 -0
  82. package/dist/css/color-swatch-picker.css +250 -0
  83. package/dist/css/color-swatch.css +35 -0
  84. package/dist/css/combobox.css +574 -0
  85. package/dist/css/command.css +399 -0
  86. package/dist/css/context-menu.css +420 -0
  87. package/dist/css/date-field.css +317 -0
  88. package/dist/css/date-picker.css +868 -0
  89. package/dist/css/date-range-picker.css +886 -0
  90. package/dist/css/description.css +67 -0
  91. package/dist/css/descriptions.css +299 -0
  92. package/dist/css/dialog.css +455 -0
  93. package/dist/css/diff-view.css +513 -0
  94. package/dist/css/download-trigger.css +151 -0
  95. package/dist/css/drawer.css +552 -0
  96. package/dist/css/editable.css +295 -0
  97. package/dist/css/empty-state.css +163 -0
  98. package/dist/css/field-array.css +226 -0
  99. package/dist/css/field.css +166 -0
  100. package/dist/css/fieldset.css +102 -0
  101. package/dist/css/file-upload.css +429 -0
  102. package/dist/css/flex.css +441 -0
  103. package/dist/css/float-button.css +569 -0
  104. package/dist/css/floating-panel.css +429 -0
  105. package/dist/css/focus.css +46 -0
  106. package/dist/css/forced-colors.css +93 -0
  107. package/dist/css/form.css +393 -0
  108. package/dist/css/funnel-chart.css +106 -0
  109. package/dist/css/graph-chart.css +205 -0
  110. package/dist/css/grid-list.css +235 -0
  111. package/dist/css/grid.css +1201 -0
  112. package/dist/css/heatmap.css +552 -0
  113. package/dist/css/hierarchy-chart.css +298 -0
  114. package/dist/css/highlight.css +41 -0
  115. package/dist/css/hover-card.css +226 -0
  116. package/dist/css/icon.css +225 -0
  117. package/dist/css/image-cropper.css +373 -0
  118. package/dist/css/image-viewer.css +538 -0
  119. package/dist/css/image.css +98 -0
  120. package/dist/css/infinite-scroll.css +77 -0
  121. package/dist/css/input-group.css +275 -0
  122. package/dist/css/json-viewer.css +379 -0
  123. package/dist/css/kbd.css +72 -0
  124. package/dist/css/label.css +78 -0
  125. package/dist/css/layers.css +7 -0
  126. package/dist/css/layout.css +372 -0
  127. package/dist/css/liquid.css +106 -0
  128. package/dist/css/list.css +152 -0
  129. package/dist/css/listbox.css +390 -0
  130. package/dist/css/loading-bar.css +141 -0
  131. package/dist/css/log.css +306 -0
  132. package/dist/css/markdown-stream.css +149 -0
  133. package/dist/css/marquee.css +378 -0
  134. package/dist/css/masonry.css +70 -0
  135. package/dist/css/matrix-code.css +67 -0
  136. package/dist/css/mention.css +393 -0
  137. package/dist/css/menu.css +364 -0
  138. package/dist/css/menubar.css +456 -0
  139. package/dist/css/message-feed.css +318 -0
  140. package/dist/css/navigation-menu.css +513 -0
  141. package/dist/css/notification.css +782 -0
  142. package/dist/css/number-animation.css +44 -0
  143. package/dist/css/number-field.css +252 -0
  144. package/dist/css/overlay-arrow.css +56 -0
  145. package/dist/css/page-header.css +184 -0
  146. package/dist/css/pagination.css +450 -0
  147. package/dist/css/password-input.css +391 -0
  148. package/dist/css/pie-chart.css +247 -0
  149. package/dist/css/pin-input.css +199 -0
  150. package/dist/css/pointer.css +36 -0
  151. package/dist/css/popconfirm.css +320 -0
  152. package/dist/css/popover.css +279 -0
  153. package/dist/css/progress.css +501 -0
  154. package/dist/css/prompt-input.css +260 -0
  155. package/dist/css/question-flow.css +553 -0
  156. package/dist/css/radar-chart.css +233 -0
  157. package/dist/css/radio-group.css +598 -0
  158. package/dist/css/rating.css +294 -0
  159. package/dist/css/reasoning.css +343 -0
  160. package/dist/css/reset.css +117 -0
  161. package/dist/css/resizable.css +242 -0
  162. package/dist/css/sankey-chart.css +174 -0
  163. package/dist/css/scroll-area.css +240 -0
  164. package/dist/css/scrollbar.css +204 -0
  165. package/dist/css/select.css +612 -0
  166. package/dist/css/separator.css +122 -0
  167. package/dist/css/side-nav.css +476 -0
  168. package/dist/css/signature-pad.css +179 -0
  169. package/dist/css/skeleton.css +161 -0
  170. package/dist/css/slider.css +374 -0
  171. package/dist/css/sortable.css +228 -0
  172. package/dist/css/sparkline.css +164 -0
  173. package/dist/css/spinner.css +236 -0
  174. package/dist/css/splitter.css +159 -0
  175. package/dist/css/statistic.css +137 -0
  176. package/dist/css/steps.css +627 -0
  177. package/dist/css/switch.css +351 -0
  178. package/dist/css/table.css +1145 -0
  179. package/dist/css/tabs.css +944 -0
  180. package/dist/css/tag-group.css +247 -0
  181. package/dist/css/tag.css +310 -0
  182. package/dist/css/tags-input.css +322 -0
  183. package/dist/css/text-field.css +197 -0
  184. package/dist/css/time-field.css +277 -0
  185. package/dist/css/time-picker.css +707 -0
  186. package/dist/css/time-range-picker.css +746 -0
  187. package/dist/css/timeline.css +423 -0
  188. package/dist/css/timer.css +123 -0
  189. package/dist/css/timestamp.css +34 -0
  190. package/dist/css/toggle-group.css +424 -0
  191. package/dist/css/toggle.css +146 -0
  192. package/dist/css/tone.css +189 -0
  193. package/dist/css/tool-call.css +429 -0
  194. package/dist/css/toolbar.css +365 -0
  195. package/dist/css/tooltip.css +218 -0
  196. package/dist/css/tour.css +439 -0
  197. package/dist/css/transfer.css +638 -0
  198. package/dist/css/tree-select.css +878 -0
  199. package/dist/css/tree.css +733 -0
  200. package/dist/css/truncate.css +108 -0
  201. package/dist/css/typography.css +472 -0
  202. package/dist/css/undefined.css +58 -0
  203. package/dist/css/virtualizer.css +166 -0
  204. package/dist/css/visually-hidden.css +20 -0
  205. package/dist/css/watermark.css +82 -0
  206. package/dist/family/action-control.css +487 -0
  207. package/dist/family/chart.css +480 -0
  208. package/dist/family/check-mark.css +94 -0
  209. package/dist/family/choice-card.css +97 -0
  210. package/dist/family/collection-item.css +764 -0
  211. package/dist/family/field-chrome.css +287 -0
  212. package/dist/family/loading-ring.css +95 -0
  213. package/dist/family/material.css +72 -0
  214. package/dist/family/menu-choice.css +56 -0
  215. package/dist/family/motion.css +363 -0
  216. package/dist/family/swatch.css +59 -0
  217. package/dist/family/tag-list.css +59 -0
  218. package/family/action-control.css +3 -12
  219. package/index.css +7307 -6759
  220. package/index.unlayered.css +7309 -6761
  221. package/package.json +165 -164
@@ -0,0 +1,379 @@
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
+ /* 定义 json viewer 样式。 */
7
+
8
+ @layer xihan.components {
9
+ /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
10
+ .xh-scope-json-viewer {
11
+ --xh-json-viewer-skin: 1;
12
+ }
13
+
14
+ /* 缺省态(md 档)。等宽字体让层级缩进与值的长度对得齐。
15
+ 逐类型配色走 --xh-syntax-* 语法令牌,与代码块的记号色同源、随主题明暗切换。 */
16
+ .xh-scope-json-viewer[data-part='root'] {
17
+ /* 作者放进空态格里的图标按档取尺,缺省 md,随 data-size 换档。
18
+ 查看器自绘的状态字形(分支行首的展开方向 chevron)不读这支:它是指示符,与所在的把手盒同走
19
+ --xh-control-indicator-* 一族——branch-trigger 在自己身上把 --xh-icon-size 改接到盒的尺 */
20
+ --xh-icon-size: var(--xh-json-viewer-icon-size, var(--xh-glyph-size-md));
21
+
22
+ --xh-_json-viewer-font-size: var(--xh-control-caption-md);
23
+ --xh-_json-viewer-row-py: var(--xh-space-0_5);
24
+ --xh-_json-viewer-indent: var(--xh-space-4);
25
+
26
+ display: block;
27
+ color: var(--xh-json-viewer-fg, var(--xh-fg-default));
28
+ font-family: var(--xh-json-viewer-font, var(--xh-font-family-mono));
29
+ font-size: var(--xh-json-viewer-font-size, var(--xh-_json-viewer-font-size));
30
+ line-height: var(--xh-leading-normal);
31
+ }
32
+
33
+ /* 写了 display 就会盖掉 UA 的 [hidden]{display:none},这里补回 */
34
+ .xh-scope-json-viewer[data-part='root'][hidden] {
35
+ display: none;
36
+ }
37
+
38
+ /* 面画在两档容器与空态格上,root 只是壳。三档按边界三选一:outline 即基础规则
39
+ (--xh-border-default 描边 + surface 底 + 无影);淡底档描边透明、底换 subtle;
40
+ 无框档边框留着但透明——去掉外框不会让行的位置跳一格 */
41
+ .xh-scope-json-viewer[data-part='root'][data-variant='subtle']
42
+ :is(.xh-scope-json-viewer[data-part='tree'], .xh-scope-json-viewer[data-part='text'], .xh-scope-json-viewer[data-part='empty']) {
43
+ border-color: transparent;
44
+ background: var(--xh-json-viewer-bg, var(--xh-bg-subtle));
45
+ }
46
+
47
+ .xh-scope-json-viewer[data-part='root'][data-variant='ghost']
48
+ :is(.xh-scope-json-viewer[data-part='tree'], .xh-scope-json-viewer[data-part='text'], .xh-scope-json-viewer[data-part='empty']) {
49
+ border-color: transparent;
50
+ background: transparent;
51
+ }
52
+
53
+ /* 尺寸轴只换私有槽,部件从 root 继承 */
54
+ .xh-scope-json-viewer[data-part='root'][data-size='sm'] {
55
+ --xh-icon-size: var(--xh-json-viewer-icon-size, var(--xh-glyph-size-sm));
56
+ --xh-_json-viewer-font-size: var(--xh-control-caption-sm);
57
+ --xh-_json-viewer-row-py: var(--xh-space-0);
58
+ --xh-_json-viewer-indent: var(--xh-space-3);
59
+ }
60
+
61
+ .xh-scope-json-viewer[data-part='root'][data-size='lg'] {
62
+ --xh-icon-size: var(--xh-json-viewer-icon-size, var(--xh-glyph-size-lg));
63
+ --xh-_json-viewer-font-size: var(--xh-control-caption-lg);
64
+ --xh-_json-viewer-row-py: var(--xh-space-1);
65
+ --xh-_json-viewer-indent: var(--xh-space-5);
66
+ }
67
+
68
+ /* 常驻容器不是浮层:两轴都可能溢出——深层缩进往行首方向推、长字符串往行尾伸;
69
+ 页内结构容器走 reset 层的原生细条,不写 overscroll */
70
+ .xh-scope-json-viewer[data-part='tree'] {
71
+ display: flex;
72
+ flex-direction: column;
73
+ max-block-size: var(--xh-json-viewer-max-h, var(--xh-viewport-max-h));
74
+ padding-block: var(--xh-json-viewer-py, var(--xh-space-2));
75
+ padding-inline: var(--xh-json-viewer-px, var(--xh-space-2));
76
+ border: var(--xh-stroke-thin) solid var(--xh-json-viewer-border, var(--xh-border-default));
77
+ border-radius: var(--xh-json-viewer-radius, var(--xh-shape-surface));
78
+ background: var(--xh-json-viewer-bg, var(--xh-bg-surface));
79
+ box-shadow: var(--xh-json-viewer-shadow, none);
80
+ overflow: auto;
81
+ }
82
+
83
+ /* 原文档:与树档共用同一套边框、内衬与高度令牌,两档切过去盒子不跳。
84
+ 整块可框选——这一档存在的理由就是把与后端一字不差的那份原文交到手上 */
85
+ .xh-scope-json-viewer[data-part='text'] {
86
+ margin: 0;
87
+ max-block-size: var(--xh-json-viewer-max-h, var(--xh-viewport-max-h));
88
+ padding-block: var(--xh-json-viewer-py, var(--xh-space-2));
89
+ padding-inline: var(--xh-json-viewer-px, var(--xh-space-2));
90
+ border: var(--xh-stroke-thin) solid var(--xh-json-viewer-border, var(--xh-border-default));
91
+ border-radius: var(--xh-json-viewer-radius, var(--xh-shape-surface));
92
+ background: var(--xh-json-viewer-bg, var(--xh-bg-surface));
93
+ box-shadow: var(--xh-json-viewer-shadow, none);
94
+ color: var(--xh-json-viewer-text-fg, var(--xh-fg-default));
95
+ font-family: var(--xh-json-viewer-font, var(--xh-font-family-mono));
96
+ /* 缩进靠空格,行不折:折行会把层级读乱,横向给滚动条 */
97
+ white-space: pre;
98
+ tab-size: 2;
99
+ overflow: auto;
100
+ user-select: text;
101
+ }
102
+
103
+ .xh-scope-json-viewer[data-part='text'][hidden] {
104
+ display: none;
105
+ }
106
+ .xh-scope-json-viewer[data-part='tree'][hidden] {
107
+ display: none;
108
+ }
109
+
110
+ /* 焦点在树外时容器自己进 Tab 序列兜底,落焦不画环:环永远长在行上 */
111
+ .xh-scope-json-viewer[data-part='tree']:focus-visible {
112
+ outline: none;
113
+ }
114
+
115
+ /* 焦点落在 branch 上(它才是 treeitem),但环画在它自己那一行上:
116
+ 整棵子层套一圈描边会把展开的层级全框进去 */
117
+ .xh-scope-json-viewer[data-part='branch']:focus-visible {
118
+ outline: none;
119
+ }
120
+
121
+ .xh-scope-json-viewer[data-part='branch']:focus-visible > .xh-scope-json-viewer[data-part='branch-control'] {
122
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
123
+ outline-offset: var(--xh-ring-offset);
124
+ }
125
+
126
+ /* 行:标量与分支共用同一套盒子,两种行在视觉上必须齐平 */
127
+ .xh-scope-json-viewer[data-part='item'],
128
+ .xh-scope-json-viewer[data-part='branch-control'] {
129
+ display: flex;
130
+ align-items: baseline;
131
+ gap: var(--xh-json-viewer-row-gap, var(--xh-space-1));
132
+ padding-block: var(--xh-json-viewer-row-py, var(--xh-_json-viewer-row-py));
133
+ padding-inline: var(--xh-json-viewer-row-px, var(--xh-space-1));
134
+ border-radius: var(--xh-json-viewer-row-radius, var(--xh-shape-inset));
135
+ white-space: nowrap;
136
+ transition: background-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
137
+ }
138
+
139
+ .xh-scope-json-viewer[data-part='item'][hidden],
140
+ .xh-scope-json-viewer[data-part='branch-control'][hidden] {
141
+ display: none;
142
+ }
143
+
144
+ /* 悬停与键盘锚点共用中性灰轻档:data-highlighted 跟的是连接层记的焦点行,
145
+ 键盘落焦另有聚焦环标记位置 */
146
+ .xh-scope-json-viewer[data-part='item']:is(:hover, [data-highlighted]),
147
+ .xh-scope-json-viewer[data-part='branch-control']:is(:hover, [data-highlighted]) {
148
+ background: var(--xh-json-viewer-row-bg-hover, var(--xh-bg-subtle));
149
+ }
150
+
151
+ /* 分支那一行是唯一的点击目标:点它切换展开态 */
152
+ .xh-scope-json-viewer[data-part='branch-control'] {
153
+ cursor: pointer;
154
+ user-select: none;
155
+ }
156
+
157
+ /* 按下只换面不缩放:白底承载 hover 100 → pressed 200(集合行不允许零反馈);
158
+ 指针按住由 :active 表出,Space / Enter 与触屏按住由 Headless 投影 data-pressed,三种输入同一副面 */
159
+ .xh-scope-json-viewer[data-part='branch-control']:not([data-disabled]):is(:active, [data-pressed]) {
160
+ background: var(--xh-json-viewer-row-bg-active, var(--xh-bg-subtle-hover));
161
+ }
162
+
163
+ /* 键名不参与压缩:它短且必须完整可读,被挤掉的应该是值 */
164
+ .xh-scope-json-viewer[data-part='item-key'],
165
+ .xh-scope-json-viewer[data-part='branch-text'] {
166
+ flex: none;
167
+ color: var(--xh-json-viewer-key-fg, var(--xh-fg-brand-strong));
168
+ font-weight: var(--xh-json-viewer-key-font-weight, var(--xh-font-weight-medium));
169
+ }
170
+
171
+ /* 键名与值之间的冒号由皮肤画:它是排版符号,进不了可及名字反而更清爽 */
172
+ .xh-scope-json-viewer[data-part='item-key']::after,
173
+ .xh-scope-json-viewer[data-part='branch-text']::after {
174
+ content: ':';
175
+ color: var(--xh-json-viewer-punctuation-fg, var(--xh-fg-subtle));
176
+ }
177
+
178
+ /* 弹性子项默认最小尺寸是内容尺寸,不归零则长字符串把行撑破、省略号轮不上 */
179
+ .xh-scope-json-viewer[data-part='item-value'] {
180
+ flex: 1 1 auto;
181
+ min-inline-size: 0;
182
+ overflow: hidden;
183
+ white-space: nowrap;
184
+ text-overflow: ellipsis;
185
+ }
186
+
187
+ .xh-scope-json-viewer[data-part='item-value'][data-value-type='string'] {
188
+ color: var(--xh-json-viewer-string-fg, var(--xh-syntax-string));
189
+ }
190
+
191
+ .xh-scope-json-viewer[data-part='item-value'][data-value-type='number'] {
192
+ color: var(--xh-json-viewer-number-fg, var(--xh-syntax-number));
193
+ }
194
+
195
+ .xh-scope-json-viewer[data-part='item-value'][data-value-type='boolean'] {
196
+ color: var(--xh-json-viewer-boolean-fg, var(--xh-syntax-keyword));
197
+ }
198
+
199
+ .xh-scope-json-viewer[data-part='item-value'][data-value-type='null'] {
200
+ color: var(--xh-json-viewer-null-fg, var(--xh-fg-subtle));
201
+ }
202
+
203
+ /* 空对象与空数组只剩一对括号,跟标点同色 */
204
+ .xh-scope-json-viewer[data-part='item-value'][data-value-type='array'],
205
+ .xh-scope-json-viewer[data-part='item-value'][data-value-type='object'] {
206
+ color: var(--xh-json-viewer-punctuation-fg, var(--xh-fg-subtle));
207
+ }
208
+
209
+ /* 循环引用与截断占位不是真数据,排在语气之外用弱化字重表达 */
210
+ .xh-scope-json-viewer[data-part='item-value'][data-circular],
211
+ .xh-scope-json-viewer[data-part='item-value'][data-truncated] {
212
+ color: var(--xh-fg-muted);
213
+ font-style: italic;
214
+ }
215
+
216
+ /* 展开箭头与勾选标记同宽,两种行的文字起点才对得齐。
217
+ 盒里的 chevron 是指示符:与盒同边长,--xh-icon-size 在自己身上改接到盒的尺——
218
+ root 那支只管作者图标的 --xh-json-viewer-icon-size 不流进来,按图标档取的 20px 会比 16px 的盒还大;
219
+ branch-indicator 由适配器固定渲染在这颗把手里,继承即可 */
220
+ .xh-scope-json-viewer[data-part='branch-trigger'] {
221
+ --xh-icon-size: var(--xh-json-viewer-indicator-size, var(--xh-control-indicator-size));
222
+
223
+ display: inline-flex;
224
+ flex: none;
225
+ align-items: center;
226
+ justify-content: center;
227
+ inline-size: var(--xh-json-viewer-indicator-size, var(--xh-control-indicator-size));
228
+ color: var(--xh-json-viewer-indicator-fg, var(--xh-fg-subtle));
229
+ }
230
+
231
+ .xh-scope-json-viewer[data-part='branch-trigger'][hidden] {
232
+ display: none;
233
+ }
234
+
235
+ .xh-scope-json-viewer[data-part='branch-indicator'] {
236
+ display: inline-block;
237
+ line-height: var(--xh-leading-none);
238
+ transition: rotate var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
239
+ }
240
+
241
+ .xh-scope-json-viewer[data-part='branch-indicator'][hidden] {
242
+ display: none;
243
+ }
244
+
245
+ /* 没写内容就由皮肤画;作者往部件里塞了自己的图形,这条规则即不命中。
246
+ 尺寸读把手改接过的 --xh-icon-size:chevron 与盒同边长(见 branch-trigger 块) */
247
+ .xh-scope-json-viewer[data-part='branch-indicator']:empty::before {
248
+ content: '';
249
+ display: inline-block;
250
+ inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
251
+ block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
252
+ vertical-align: var(--xh-glyph-baseline-shift);
253
+ background-color: currentColor;
254
+ -webkit-mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
255
+ mask: var(--xh-glyph-mark-chevron-right) center / contain no-repeat;
256
+ }
257
+
258
+ /* 收起时朝向行首、展开时转向下方,与逻辑书写方向一致:
259
+ rtl 下 inline-start 在右侧,箭头因此要反着转 */
260
+ .xh-scope-json-viewer[data-part='branch-indicator'][data-state='open'] {
261
+ rotate: 90deg;
262
+ }
263
+
264
+ [dir='rtl'] .xh-scope-json-viewer[data-part='branch-indicator'] {
265
+ rotate: 180deg;
266
+ }
267
+
268
+ [dir='rtl'] .xh-scope-json-viewer[data-part='branch-indicator'][data-state='open'] {
269
+ rotate: 90deg;
270
+ }
271
+
272
+ /* 收起摘要不参与选中:框选整块 JSON 时不该把它一起复制走 */
273
+ .xh-scope-json-viewer[data-part='preview'] {
274
+ flex: none;
275
+ color: var(--xh-json-viewer-preview-fg, var(--xh-fg-muted));
276
+ font-size: var(--xh-json-viewer-preview-font-size, var(--xh-text-caption-size));
277
+ user-select: none;
278
+ }
279
+
280
+ /* 层级缩进靠子层容器自己顶:分支物理嵌套着子层,每深一层就多缩一格,
281
+ 无需把层级号写进内联样式,也就不必在两个适配器里各写一遍 */
282
+ .xh-scope-json-viewer[data-part='branch-content'] {
283
+ display: flex;
284
+ flex-direction: column;
285
+ padding-inline-start: var(--xh-json-viewer-indent, var(--xh-_json-viewer-indent));
286
+ }
287
+
288
+ .xh-scope-json-viewer[data-part='branch-content'][hidden] {
289
+ display: none;
290
+ }
291
+
292
+ /* —— 空态 —— */
293
+ /* 一行也摊不出来时占位的那一格:与两档容器共用同一套边框与高度令牌,空与不空盒子不跳 */
294
+ .xh-scope-json-viewer[data-part='empty'] {
295
+ display: flex;
296
+ flex-direction: column;
297
+ align-items: center;
298
+ justify-content: center;
299
+ gap: var(--xh-json-viewer-empty-gap, var(--xh-space-2));
300
+ padding-block: var(--xh-json-viewer-empty-py, var(--xh-space-6));
301
+ padding-inline: var(--xh-json-viewer-empty-px, var(--xh-space-4));
302
+ border: var(--xh-stroke-thin) solid var(--xh-json-viewer-border, var(--xh-border-default));
303
+ border-radius: var(--xh-json-viewer-radius, var(--xh-shape-surface));
304
+ background: var(--xh-json-viewer-bg, var(--xh-bg-surface));
305
+ box-shadow: var(--xh-json-viewer-shadow, none);
306
+ color: var(--xh-json-viewer-empty-fg, var(--xh-fg-muted));
307
+ text-align: center;
308
+ }
309
+
310
+ .xh-scope-json-viewer[data-part='empty'][hidden] {
311
+ display: none;
312
+ }
313
+
314
+ /*
315
+ * 搜索命中的那一段:与 Highlight 的命中片段同一身份(品牌淡底 + 品牌深字),浏览器给 mark 的固定亮黄不随主题走。
316
+ * 在命中之间逐个走时停住的那一行(data-current),片段换成品牌实心,一眼分得出「现在停在哪」。
317
+ */
318
+ .xh-scope-json-viewer[data-part='mark'] {
319
+ border-radius: var(--xh-json-viewer-mark-radius, var(--xh-shape-inset));
320
+ background: var(--xh-json-viewer-mark-bg, var(--xh-bg-brand-subtle));
321
+ color: var(--xh-json-viewer-mark-fg, var(--xh-fg-brand-strong));
322
+ }
323
+
324
+ .xh-scope-json-viewer[data-part='branch'][data-current] > .xh-scope-json-viewer[data-part='branch-control'] > .xh-scope-json-viewer[data-part='branch-text'] > .xh-scope-json-viewer[data-part='mark'],
325
+ .xh-scope-json-viewer[data-part='item'][data-current] > .xh-scope-json-viewer[data-part='item-key'] > .xh-scope-json-viewer[data-part='mark'],
326
+ .xh-scope-json-viewer[data-part='item'][data-current] > .xh-scope-json-viewer[data-part='item-value'] > .xh-scope-json-viewer[data-part='mark'] {
327
+ background: var(--xh-json-viewer-mark-bg-current, var(--xh-bg-brand));
328
+ color: var(--xh-json-viewer-mark-fg-current, var(--xh-fg-on-brand));
329
+ }
330
+
331
+ /*
332
+ * 高对比档:分支行的按压面常态靠底色深一档表出,这一档里底色被统一换成 Canvas,
333
+ * 按住那一下与静息塌成同一个样子;用系统高亮反色画回来,行里的键名、摘要与箭头跟着换成反色前景
334
+ */
335
+ @media (forced-colors: active) {
336
+ .xh-scope-json-viewer[data-part='branch-control']:not([data-disabled]):is(:active, [data-pressed]) {
337
+ background: Highlight;
338
+ color: HighlightText;
339
+ }
340
+
341
+ /* 系统色下底色统一成 Canvas:命中片段改画一圈正文色的框,停住的那一条换成系统高亮 */
342
+ .xh-scope-json-viewer[data-part='mark'] {
343
+ outline: var(--xh-stroke-thin) solid CanvasText;
344
+ }
345
+
346
+ .xh-scope-json-viewer[data-part='branch'][data-current] > .xh-scope-json-viewer[data-part='branch-control'] > .xh-scope-json-viewer[data-part='branch-text'] > .xh-scope-json-viewer[data-part='mark'],
347
+ .xh-scope-json-viewer[data-part='item'][data-current] > .xh-scope-json-viewer[data-part='item-key'] > .xh-scope-json-viewer[data-part='mark'],
348
+ .xh-scope-json-viewer[data-part='item'][data-current] > .xh-scope-json-viewer[data-part='item-value'] > .xh-scope-json-viewer[data-part='mark'] {
349
+ background: Highlight;
350
+ color: HighlightText;
351
+ }
352
+
353
+ .xh-scope-json-viewer[data-part='branch-control']:not([data-disabled]):is(:active, [data-pressed]) .xh-scope-json-viewer[data-part='branch-text'],
354
+ .xh-scope-json-viewer[data-part='branch-control']:not([data-disabled]):is(:active, [data-pressed]) .xh-scope-json-viewer[data-part='branch-text']::after,
355
+ .xh-scope-json-viewer[data-part='branch-control']:not([data-disabled]):is(:active, [data-pressed]) .xh-scope-json-viewer[data-part='preview'],
356
+ .xh-scope-json-viewer[data-part='branch-control']:not([data-disabled]):is(:active, [data-pressed]) .xh-scope-json-viewer[data-part='branch-indicator'] {
357
+ color: HighlightText;
358
+ }
359
+ }
360
+
361
+ @media (forced-colors: active) {
362
+ /* 兜底字形是 mask 挖出来的一块底色,这一档里底色被系统换成 Canvas,字形跟着消失。
363
+ 字形退出强制换色、直接写系统色(不能取 currentColor:退出强制换色的伪元素读到的是被系统换掉之前的作者色):
364
+ 分支行上取 CanvasText,按下时整行涂成 Highlight、字形换 HighlightText;
365
+ 禁用取 GrayText */
366
+ .xh-scope-json-viewer[data-part='branch-indicator']:empty::before {
367
+ forced-color-adjust: none;
368
+ background-color: CanvasText;
369
+ }
370
+
371
+ .xh-scope-json-viewer[data-part='branch-control']:not([data-disabled]):is(:active, [data-pressed]) .xh-scope-json-viewer[data-part='branch-indicator']:empty::before {
372
+ background-color: HighlightText;
373
+ }
374
+
375
+ .xh-scope-json-viewer[data-part='branch-control'][data-disabled] .xh-scope-json-viewer[data-part='branch-indicator']:empty::before {
376
+ background-color: GrayText;
377
+ }
378
+ }
379
+ }
@@ -0,0 +1,72 @@
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
+ /* 定义 kbd 样式。 */
7
+
8
+ @layer xihan.components {
9
+ .xh-scope-kbd {
10
+ --xh-kbd-skin: 1;
11
+ }
12
+
13
+ /* 单键和组合键共用一个整体表面,不模拟按钮按下状态。 */
14
+ .xh-scope-kbd[data-part='root'] {
15
+ display: inline-flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ gap: var(--xh-kbd-gap, var(--xh-space-1));
19
+ box-sizing: border-box;
20
+ block-size: var(--xh-kbd-h, var(--xh-space-6));
21
+ min-inline-size: var(--xh-kbd-min-w, var(--xh-space-6));
22
+ padding-inline: var(--xh-kbd-px, var(--xh-space-2));
23
+ border: var(--xh-stroke-thin) solid var(--xh-kbd-border, transparent);
24
+ border-radius: var(--xh-kbd-radius, var(--xh-shape-control));
25
+ background: var(--xh-kbd-bg, var(--xh-bg-subtle));
26
+ color: var(--xh-kbd-fg, var(--xh-fg-muted));
27
+ font-family: var(--xh-kbd-font, inherit);
28
+ /* 快捷键是次级标注,字号取 caption 档 */
29
+ font-size: var(--xh-kbd-font-size, var(--xh-text-caption-size));
30
+ font-weight: var(--xh-kbd-font-weight, var(--xh-font-weight-medium));
31
+ line-height: var(--xh-leading-none);
32
+ text-align: center;
33
+ text-decoration: none;
34
+ white-space: nowrap;
35
+ direction: ltr;
36
+ unicode-bidi: isolate;
37
+ }
38
+
39
+ .xh-scope-kbd[data-part='root'][data-variant='light'] {
40
+ background: transparent;
41
+ }
42
+
43
+ .xh-scope-kbd[data-part='key'] {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ min-inline-size: 0;
48
+ padding: 0;
49
+ border: 0;
50
+ background: transparent;
51
+ color: inherit;
52
+ font: inherit;
53
+ line-height: inherit;
54
+ }
55
+
56
+ .xh-scope-kbd[data-part='root'][data-disabled] {
57
+ color: var(--xh-kbd-fg-disabled, var(--xh-fg-disabled));
58
+ }
59
+
60
+ .xh-scope-kbd[data-part='root'][hidden],
61
+ .xh-scope-kbd[data-part='key'][hidden] {
62
+ display: none;
63
+ }
64
+
65
+ @media (forced-colors: active) {
66
+ .xh-scope-kbd[data-part='root']:not([data-variant='light']) {
67
+ border-color: ButtonText;
68
+ background: Canvas;
69
+ color: CanvasText;
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,78 @@
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
+ * 字段族标签的公共层,按 [data-part='label'] 匹配下面逐个列出的 scope。
8
+ *
9
+ * 收在这里的是逐值相同的四条:行距取 --xh-leading-none,禁用档字色取 --xh-fg-subtle,
10
+ * 必填星号取 --xh-glyph-mark-required + --xh-space-1 + --xh-fg-danger,无效档字色取 --xh-fg-danger。
11
+ * 字色、字号、字重三条留在各组件皮肤——它们挂着 --xh-<组件>-label-* 覆盖槽,
12
+ * 槽名里带组件名,写不进一条共享规则。
13
+ *
14
+ * scope 逐个列出,不写成 [data-scope][data-part='label']:label 这个部件名在标签、
15
+ * 统计、进度、推理、说明列表上指的是另一种文字(行内省略的标签正文、环内居中的数字、
16
+ * 描述项的名字),通配规则会把行距按到它们头上。要接进来的组件把 scope 加进列表。
17
+ *
18
+ * 选择器停在两个属性(0,2,0)或三个属性(0,3,0),与组件皮肤同级;引入顺序排在全部组件皮肤之前,
19
+ * 要另写行距的组件照写即可压过。
20
+ */
21
+ @layer xihan.components {
22
+ /* 标签是单行短文,行距不留额外的行间空白,标签与控件之间只剩容器给的那一道间距。 */
23
+ .xh-scope-checkbox[data-part='label'],
24
+ .xh-scope-checkbox-group[data-part='label'],
25
+ .xh-scope-color-picker[data-part='label'],
26
+ .xh-scope-date-field[data-part='label'],
27
+ .xh-scope-editable[data-part='label'],
28
+ .xh-scope-field[data-part='label'],
29
+ .xh-scope-file-upload[data-part='label'],
30
+ .xh-scope-number-field[data-part='label'],
31
+ .xh-scope-password-input[data-part='label'],
32
+ .xh-scope-pin-input[data-part='label'],
33
+ .xh-scope-radio-group[data-part='label'],
34
+ .xh-scope-rating[data-part='label'],
35
+ .xh-scope-signature-pad[data-part='label'],
36
+ .xh-scope-slider[data-part='label'],
37
+ .xh-scope-switch[data-part='label'],
38
+ .xh-scope-tags-input[data-part='label'],
39
+ .xh-scope-text-field[data-part='label'],
40
+ .xh-scope-time-field[data-part='label'] {
41
+ line-height: var(--xh-leading-none);
42
+ }
43
+
44
+ /*
45
+ * 禁用档的字色:公共层默认统一 --xh-fg-subtle。这四家没有 --xh-<组件>-label-fg-disabled 覆盖槽,
46
+ * 取值只有这一处;挂了那个槽的组件在各自皮肤里另写一条,排在本份之后,压过这里。
47
+ */
48
+ .xh-scope-color-picker[data-part='label'][data-disabled],
49
+ .xh-scope-rating[data-part='label'][data-disabled],
50
+ .xh-scope-signature-pad[data-part='label'][data-disabled],
51
+ .xh-scope-slider[data-part='label'][data-disabled] {
52
+ color: var(--xh-fg-subtle);
53
+ }
54
+
55
+ /*
56
+ * 必填星号:跟着标签自己的 data-required 亮,选填不标。字形、间距、颜色是公共层规则,
57
+ * 自带标签的字段不得各画一套。
58
+ *
59
+ * 接入 = connect 在标签部件投影 data-required + 把 scope 加进这张列表;控件本体不画。
60
+ * 有 --xh-<组件>-label-star 覆盖槽的组件在各自皮肤里只另写一条 color 压过这里(field 的
61
+ * --xh-field-label-star、fieldset 的 --xh-fieldset-legend-star),content 与间距不再重写。
62
+ */
63
+ .xh-scope-field[data-part='label'][data-required]::after,
64
+ .xh-scope-fieldset[data-part='legend'][data-required]::after {
65
+ content: var(--xh-glyph-mark-required);
66
+ margin-inline-start: var(--xh-space-1);
67
+ color: var(--xh-fg-danger);
68
+ }
69
+
70
+ /*
71
+ * 无效档的字色:标签跟着自己的 data-invalid 转警示色,没渲染错误文案的字段上这是唯一变化的东西。
72
+ * 有 --xh-<组件>-label-fg-invalid 覆盖槽的组件在各自皮肤里另写一条 color 压过这里。
73
+ */
74
+ .xh-scope-field[data-part='label'][data-invalid],
75
+ .xh-scope-fieldset[data-part='legend'][data-invalid] {
76
+ color: var(--xh-fg-danger);
77
+ }
78
+ }
@@ -0,0 +1,7 @@
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
+ /* 库层序单一真源:级联顺序由首次声明决定,与 @import 顺序解耦。 */
7
+ @layer xihan.reset, xihan.tokens, xihan.motion, xihan.components, xihan.overrides;